diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index c27d4cc4d..000000000 --- a/.cirrus.yml +++ /dev/null @@ -1,14 +0,0 @@ -freebsd_instance: - image_family: freebsd-13-2 - -env: - CCACHE_DIR: /tmp/ccache - CIRRUS_CLONE_SUBMODULES: true - -task: - install_script: pkg install -y alsa-lib ccache cmake evdev-proto git libao libevdev libudev-devd libzip mesa-libs miniupnpc ninja pkgconf pulseaudio sdl2 - ccache_cache: - folder: /tmp/ccache - script: - - cmake -B build -DCMAKE_BUILD_TYPE=Release -G Ninja - - cmake --build build --config Release diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index dc16c8846..cf46e3376 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ +buy_me_a_coffee: hhwtpernwq custom: ['https://www.paypal.com/paypalme/FlycastEmu'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 52a1d067c..31ce5857a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,7 +12,7 @@ assignees: '' Platform / OS / Hardware: -Github hash: +Flycast version: Hardware: diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 56a260f8a..e10f9cb92 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -4,6 +4,7 @@ on: [push, pull_request] jobs: build: + name: Android runs-on: ubuntu-latest steps: @@ -12,30 +13,41 @@ jobs: sudo apt-get update sudo apt-get -y install ccache libcurl4-openssl-dev ninja-build - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - submodules: true - - - uses: actions/setup-java@v3 + submodules: recursive + + - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' cache: 'gradle' - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ~/.ccache key: android-ccache-${{ github.sha }} restore-keys: android-ccache- + + - name: Disable release signing + run: sed -i 's/signingConfig signingConfigs.release/signingConfig signingConfigs.debug/g' shell/android-studio/flycast/build.gradle + if: github.repository != 'flyinghead/flycast' || github.event_name != 'push' + + - name: Bump version code + uses: chkfung/android-version-actions@v1.2.2 + with: + gradlePath: shell/android-studio/flycast/build.gradle + versionCode: ${{ github.run_number }} - name: Gradle working-directory: shell/android-studio - run: ./gradlew assembleRelease --parallel + run: ./gradlew assembleRelease bundleRelease --parallel env: SENTRY_UPLOAD_URL: ${{ secrets.SENTRY_UPLOAD_URL }} + ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: flycast-release.apk path: shell/android-studio/flycast/build/outputs/apk/release/flycast-release.apk @@ -50,7 +62,7 @@ jobs: - name: Extract symbols run: | DUMP_SYMS=./core/deps/breakpad/bin/dump_syms - SO_DIR=shell/android-studio/flycast/build/intermediates/merged_native_libs/release/out/lib + SO_DIR=shell/android-studio/flycast/build/intermediates/merged_native_libs/release/mergeReleaseNativeLibs/out/lib for arch in arm64-v8a armeabi-v7a x86 x86_64 ; do $DUMP_SYMS $SO_DIR/$arch/libflycast.so > libflycast.so.sym BUILD_ID=`head -1 libflycast.so.sym | awk '{ print $4 }'` @@ -60,7 +72,7 @@ jobs: - name: Configure AWS Credentials id: aws-credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: AKIAJOZQS4H2PHQWYFCA aws-secret-access-key: ${{ secrets.S3_SECRET_KEY }} @@ -68,11 +80,13 @@ jobs: if: github.repository == 'flyinghead/flycast' && github.event_name == 'push' - name: Upload to S3 - run: aws s3 sync shell/android-studio/flycast/build/outputs/apk/release s3://flycast-builds/android/${GITHUB_REF#refs/}-$GITHUB_SHA --acl public-read --exclude='*.json' --follow-symlinks + run: | + cp shell/android-studio/flycast/build/outputs/bundle/release/*.aab shell/android-studio/flycast/build/outputs/apk/release/ + aws s3 sync shell/android-studio/flycast/build/outputs/apk/release s3://flycast-builds/android/${GITHUB_REF#refs/}-$GITHUB_SHA --acl public-read --exclude='*.json' --follow-symlinks if: ${{ steps.aws-credentials.outputs.aws-account-id != '' }} - name: Setup Sentry CLI - uses: mathieu-bour/setup-sentry-cli@v1 + uses: mathieu-bour/setup-sentry-cli@v2 env: SENTRY_TOKEN: ${{ secrets.SENTRY_TOKEN }} with: @@ -80,6 +94,7 @@ jobs: token: ${{ env.SENTRY_TOKEN }} organization: flycast project: minidump + version: 2.21.2 if: ${{ env.SENTRY_TOKEN != '' }} - name: Upload symbols to Sentry @@ -87,7 +102,7 @@ jobs: VERSION=$(git describe --tags --always) sentry-cli releases new "$VERSION" sentry-cli releases set-commits "$VERSION" --auto - sentry-cli upload-dif symbols + sentry-cli debug-files upload symbols shell: bash env: SENTRY_TOKEN: ${{ secrets.SENTRY_TOKEN }} diff --git a/.github/workflows/bsd.yml b/.github/workflows/bsd.yml new file mode 100644 index 000000000..7beecc583 --- /dev/null +++ b/.github/workflows/bsd.yml @@ -0,0 +1,48 @@ +name: BSD CI + +on: [push, pull_request] + +jobs: + build: + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + runs-on: ubuntu-latest + strategy: + matrix: + operating_system: [ freebsd, netbsd, openbsd ] + architecture: [ arm64, x86-64 ] + include: + - operating_system: freebsd + version: '14.2' + pkginstall: sudo pkg install -y alsa-lib ccache cmake evdev-proto git libao libevdev libudev-devd libzip lua54 miniupnpc ninja pkgconf pulseaudio sdl2 libcdio + - operating_system: netbsd + version: '10.0' + pkginstall: sudo pkgin update && sudo pkgin -y install alsa-lib ccache cmake gcc12 git libao libzip lua54 miniupnpc ninja-build pkgconf pulseaudio SDL2 libcdio && export PATH=/usr/pkg/gcc12/bin:$PATH + - operating_system: openbsd + version: '7.6' + pkginstall: sudo pkg_add ccache cmake git libao libzip miniupnpc ninja pkgconf pulseaudio sdl2 libcdio + exclude: + - architecture: arm64 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: true + + - uses: actions/cache@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ccache-${{ matrix.operating_system }}-${{ matrix.architecture }}-${{ github.sha }} + restore-keys: ccache-${{ matrix.operating_system }}-${{ matrix.architecture }}- + + - uses: cross-platform-actions/action@v0.26.0 + with: + operating_system: ${{ matrix.operating_system }} + architecture: ${{ matrix.architecture }} + version: ${{ matrix.version }} + environment_variables: CCACHE_DIR + run: | + ${{ matrix.pkginstall }} + cmake -B build -DUSE_LIBCDIO=ON -DCMAKE_BUILD_TYPE=Release -G Ninja + cmake --build build --config Release diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index e769d4b03..841689118 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,27 +15,27 @@ jobs: CCACHE_DIR: ${{ github.workspace }}/.ccache strategy: - fail-fast: false matrix: config: - {name: i686-pc-windows-msvc, os: windows-latest, shell: cmd, arch: x86, cmakeArgs: -G Ninja, buildType: Release} - - {name: apple-darwin, os: macos-latest, shell: sh, cmakeArgs: -G Xcode -DAPPLE_BREAKPAD=ON, destDir: osx, buildType: RelWithDebInfo} + - {name: apple-darwin, os: macos-latest, shell: sh, cmakeArgs: -G Xcode -DUSE_DISCORD=ON, destDir: osx, buildType: RelWithDebInfo} - {name: apple-ios, os: macos-latest, shell: sh, cmakeArgs: -DCMAKE_SYSTEM_NAME=iOS -G Xcode, destDir: ios, buildType: Release} - - {name: x86_64-pc-linux-gnu, os: ubuntu-20.04, shell: sh, cmakeArgs: -G Ninja, destDir: linux, buildType: RelWithDebInfo} - - {name: x86_64-pc-windows-msvc, os: windows-latest, shell: cmd, arch: x64, cmakeArgs: -G Ninja, buildType: Release} - - {name: x86_64-w64-mingw32, os: windows-latest, shell: 'msys2 {0}', cmakeArgs: -G Ninja, destDir: win, buildType: RelWithDebInfo} - - {name: libretro-x86_64-pc-linux-gnu, os: ubuntu-latest, shell: sh, cmakeArgs: -DLIBRETRO=ON -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -G Ninja, buildType: Release} - - {name: libretro-x86_64-w64-mingw32, os: windows-latest, shell: 'msys2 {0}', cmakeArgs: -DLIBRETRO=ON -G Ninja, buildType: Release} + - {name: x86_64-pc-linux-gnu, os: ubuntu-20.04, shell: sh, cmakeArgs: -G Ninja -DUSE_DISCORD=ON -DUSE_LIBCDIO=ON, destDir: linux, buildType: RelWithDebInfo} + - {name: x86_64-pc-windows-msvc, os: windows-latest, shell: cmd, arch: x64, cmakeArgs: -G Ninja -DUSE_DISCORD=ON, buildType: Release} + - {name: x86_64-w64-mingw32, os: windows-latest, shell: 'msys2 {0}', cmakeArgs: -G Ninja -DUSE_DISCORD=ON -DUSE_LIBCDIO=ON, destDir: win, buildType: RelWithDebInfo} + - {name: libretro-x86_64-pc-linux-gnu, os: ubuntu-22.04, shell: sh, cmakeArgs: -DLIBRETRO=ON -DUSE_LIBCDIO=ON -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -G Ninja, buildType: Release} + - {name: libretro-x86_64-w64-mingw32, os: windows-latest, shell: 'msys2 {0}', cmakeArgs: -DLIBRETRO=ON -DUSE_LIBCDIO=ON -G Ninja, buildType: Release} steps: - name: Set up build environment (macOS) run: | # Unlink and re-link to prevent errors when github mac runner images install python outside of brew. See https://github.com/actions/setup-python/issues/577 brew list -1 | grep python | while read formula; do brew unlink $formula; brew link --overwrite $formula; done - brew update + brew update || : brew install libao ldid ninja pulseaudio - VULKAN_VER=1.3.250.1 && aria2c https://sdk.lunarg.com/sdk/download/$VULKAN_VER/mac/vulkansdk-macos-$VULKAN_VER.dmg - hdiutil attach ./vulkansdk-macos-*.dmg + brew uninstall --ignore-dependencies zstd + VULKAN_VER=1.3.261.1 && aria2c https://sdk.lunarg.com/sdk/download/$VULKAN_VER/mac/vulkansdk-macos-$VULKAN_VER.dmg + hdiutil attach ./vulkansdk-macos-*.dmg -mountpoint /Volumes/VulkanSDK sudo /Volumes/VulkanSDK/InstallVulkan.app/Contents/MacOS/InstallVulkan --root $HOME/VulkanSDK --accept-licenses --default-answer --confirm-command install hdiutil detach /Volumes/VulkanSDK echo "VULKAN_SDK=$HOME/VulkanSDK/macOS" >> $GITHUB_ENV @@ -45,7 +45,7 @@ jobs: run: | sudo add-apt-repository ppa:christianrauch/libdecoration sudo apt-get update - sudo apt-get -y install ccache libao-dev libasound2-dev libevdev-dev libgl1-mesa-dev liblua5.3-dev libminiupnpc-dev libpulse-dev libsdl2-dev libudev-dev libzip-dev ninja-build libcurl4-openssl-dev + sudo apt-get -y install ccache libao-dev libasound2-dev libevdev-dev libgl1-mesa-dev liblua5.3-dev libminiupnpc-dev libpulse-dev libsdl2-dev libudev-dev libzip-dev ninja-build libcurl4-openssl-dev libcdio-dev sudo apt-get -y install libwayland-dev libdecor-0-dev libaudio-dev libjack-dev libsndio-dev libsamplerate0-dev libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxfixes-dev libxi-dev libxss-dev libxkbcommon-dev libdrm-dev libgbm-dev libgles2-mesa-dev libegl1-mesa-dev libdbus-1-dev libibus-1.0-dev libudev-dev fcitx-libs-dev if: runner.os == 'Linux' @@ -53,7 +53,7 @@ jobs: uses: msys2/setup-msys2@v2 with: msystem: MINGW64 - install: git make mingw-w64-x86_64-ccache mingw-w64-x86_64-cmake mingw-w64-x86_64-lua mingw-w64-x86_64-ninja mingw-w64-x86_64-SDL2 mingw-w64-x86_64-toolchain + install: git make mingw-w64-x86_64-ccache mingw-w64-x86_64-cmake mingw-w64-x86_64-lua mingw-w64-x86_64-ninja mingw-w64-x86_64-SDL2 mingw-w64-x86_64-toolchain mingw-w64-x86_64-libcdio if: matrix.config.shell == 'msys2 {0}' - name: Set up build environment (Windows, Visual Studio) @@ -67,10 +67,10 @@ jobs: arch: ${{ matrix.config.arch }} if: matrix.config.shell == 'cmd' - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - submodules: true + submodules: recursive - name: Compile a universal OpenMP (macOS) run: HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew reinstall --build-from-source --formula ./shell/apple/libomp.rb @@ -80,7 +80,7 @@ jobs: run: ./shell/apple/emulator-ios/OpenMP/build_ios_openmp.sh --disableSimulator if: matrix.config.name == 'apple-ios' - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ env.CCACHE_DIR }} key: ccache-${{ matrix.config.name }}-${{ github.sha }} @@ -126,7 +126,7 @@ jobs: rm artifact/bin/flycast if: matrix.config.name == 'x86_64-pc-linux-gnu' - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: flycast-${{ matrix.config.name }} path: artifact/bin @@ -145,7 +145,7 @@ jobs: - name: Configure AWS Credentials id: aws-credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: AKIAJOZQS4H2PHQWYFCA aws-secret-access-key: ${{ secrets.S3_SECRET_KEY }} @@ -158,7 +158,7 @@ jobs: if: ${{ steps.aws-credentials.outputs.aws-account-id != '' }} - name: Setup Sentry CLI - uses: mathieu-bour/setup-sentry-cli@v1 + uses: mathieu-bour/setup-sentry-cli@v2 env: SENTRY_TOKEN: ${{ secrets.SENTRY_TOKEN }} with: @@ -166,6 +166,7 @@ jobs: token: ${{ env.SENTRY_TOKEN }} organization: flycast project: minidump + version: 2.21.2 if: ${{ env.SENTRY_TOKEN != '' }} - name: Upload symbols to Sentry (Windows, macOS, Linux) @@ -173,7 +174,7 @@ jobs: VERSION=$(git describe --tags --always) sentry-cli releases new "$VERSION" sentry-cli releases set-commits "$VERSION" --auto - sentry-cli upload-dif symbols + sentry-cli debug-files upload symbols shell: bash env: SENTRY_TOKEN: ${{ secrets.SENTRY_TOKEN }} diff --git a/.github/workflows/crowdin_prep.yml b/.github/workflows/crowdin_prep.yml index b3dff6f53..e8f9fc295 100644 --- a/.github/workflows/crowdin_prep.yml +++ b/.github/workflows/crowdin_prep.yml @@ -15,18 +15,18 @@ 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 - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Upload Source shell: bash diff --git a/.github/workflows/crowdin_translate.yml b/.github/workflows/crowdin_translate.yml index a67a719ba..b18f2e1d6 100644 --- a/.github/workflows/crowdin_translate.yml +++ b/.github/workflows/crowdin_translate.yml @@ -12,18 +12,18 @@ 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 - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal access token. fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. @@ -43,7 +43,7 @@ jobs: git commit -m "Fetch translations & Recreate libretro_core_options_intl.h" - name: GitHub Push - uses: ad-m/github-push-action@v0.6.0 + uses: ad-m/github-push-action@v0.8.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: ${{ github.ref }} diff --git a/.github/workflows/switch.yml b/.github/workflows/switch.yml index 7d27e21b2..07f873a57 100644 --- a/.github/workflows/switch.yml +++ b/.github/workflows/switch.yml @@ -4,9 +4,9 @@ on: [push, pull_request] jobs: build: - name: ${{ matrix.config.name }} + name: Switch ${{ matrix.config.name }} runs-on: ubuntu-latest - container: devkitpro/devkita64:20220128 + container: devkitpro/devkita64:latest strategy: matrix: @@ -18,14 +18,17 @@ jobs: - name: Set up build environment run: | sudo apt-get update - sudo apt-get -y install awscli ccache ninja-build + sudo apt-get -y install awscli ccache - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: true - - uses: actions/cache@v3 + - name: Mark git repository as safe + run: git config --global --add safe.directory $PWD + + - uses: actions/cache@v4 with: path: ~/.ccache key: ccache-switch-${{ matrix.config.name }}-${{ github.sha }} @@ -36,7 +39,7 @@ jobs: $DEVKITPRO/portlibs/switch/bin/aarch64-none-elf-cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=artifact -G Ninja ${{ matrix.config.cmakeArgs }} cmake --build build --config Release --target install - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: flycast-switch-${{ matrix.config.name }} path: artifact/bin @@ -47,7 +50,7 @@ jobs: - name: Configure AWS Credentials id: aws-credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: AKIAJOZQS4H2PHQWYFCA aws-secret-access-key: ${{ secrets.S3_SECRET_KEY }} diff --git a/.github/workflows/uwp.yml b/.github/workflows/uwp.yml index 50ded653b..485827325 100644 --- a/.github/workflows/uwp.yml +++ b/.github/workflows/uwp.yml @@ -4,33 +4,19 @@ on: [push, pull_request] jobs: build: + name: UWP runs-on: windows-latest - env: - VCPKG_ROOT: ${{ github.workspace }}/vcpkg - VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}/vcpkg/bincache - steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 submodules: true - - name: bootstrap vcpkg - run: | - git clone https://github.com/microsoft/vcpkg - mkdir vcpkg\bincache - vcpkg\bootstrap-vcpkg.bat - - - uses: actions/cache@v3 - with: - path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }} - key: vcpkg-${{ hashFiles( 'vcpkg.json' ) }} - - name: CMake run: | - cmake -B build -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 17 2022" -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.22000.0 -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake - cmake --build build --config Release --parallel 2 + cmake -B build -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 17 2022" -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0.22000.0 + cmake --build build --config Release -- /m shell: cmd - uses: ilammy/msvc-dev-cmd@v1 @@ -49,14 +35,14 @@ jobs: run: signtool sign /f shell\uwp\sign_cert.pfx /p '${{ secrets.SIGN_CERT_PWD }}' /v /fd SHA256 build\artifact\flycast.appx if: github.repository == 'flyinghead/flycast' && github.event_name == 'push' - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: flycast-uwp path: build/artifact - name: Configure AWS Credentials id: aws-credentials - uses: aws-actions/configure-aws-credentials@v2 + uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: AKIAJOZQS4H2PHQWYFCA aws-secret-access-key: ${{ secrets.S3_SECRET_KEY }} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d2f50b97e..b3cc580a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,12 +9,12 @@ variables: GIT_SUBMODULE_STRATEGY: recursive CORENAME: flycast - CORE_ARGS: -DLIBRETRO=ON -DCMAKE_BUILD_TYPE=Release + CORE_ARGS: -DLIBRETRO=ON -DUSE_LIBCDIO=ON -DCMAKE_BUILD_TYPE=Release .core-defs-linux: extends: .core-defs variables: - CORE_ARGS: -DLIBRETRO=ON -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DCMAKE_BUILD_TYPE=Release + CORE_ARGS: -DLIBRETRO=ON -DUSE_LIBCDIO=ON -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DCMAKE_BUILD_TYPE=Release .core-defs-osx-x64: extends: .core-defs @@ -36,7 +36,7 @@ .core-defs-android: extends: .core-defs script: - - cmake $CORE_ARGS -DANDROID_PLATFORM=android-$API_LEVEL -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_static -DANDROID_ABI=$ANDROID_ABI -DANDROID_ARM_MODE=arm "$CMAKE_SOURCE_ROOT" -B$BUILD_DIR + - cmake -DLIBRETRO=ON -DCMAKE_BUILD_TYPE=Release -DANDROID_PLATFORM=android-$API_LEVEL -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_STL=c++_static -DANDROID_ABI=$ANDROID_ABI -DANDROID_ARM_MODE=arm "$CMAKE_SOURCE_ROOT" -B$BUILD_DIR - cmake --build $BUILD_DIR --target ${CORENAME}_libretro --config Release -- -j $NUMPROC - mv $BUILD_DIR/${CORENAME}_libretro.so $LIBNAME - if [ $STRIP_CORE_LIB -eq 1 ]; then $NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip $LIBNAME; fi diff --git a/.gitmodules b/.gitmodules index 899318949..fbec754c6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,7 +3,8 @@ url = https://github.com/libsdl-org/SDL.git [submodule "core/deps/libchdr"] path = core/deps/libchdr - url = https://github.com/flyinghead/libchdr.git + url = https://github.com/rtissera/libchdr.git + ignore = dirty [submodule "core/deps/luabridge"] path = core/deps/luabridge url = https://github.com/vinniefalco/LuaBridge.git @@ -22,3 +23,24 @@ [submodule "core/deps/oboe"] path = core/deps/oboe url = https://github.com/google/oboe.git +[submodule "core/deps/Syphon"] + path = core/deps/Syphon + url = https://github.com/vkedwardli/Syphon-Framework.git +[submodule "core/deps/Spout"] + path = core/deps/Spout + url = https://github.com/vkedwardli/Spout2.git +[submodule "core/deps/discord-rpc"] + path = core/deps/discord-rpc + url = https://github.com/harmonytf/discord-rpc +[submodule "core/deps/libadrenotools"] + path = core/deps/libadrenotools + url = https://github.com/bylaws/libadrenotools +[submodule "core/deps/rcheevos"] + path = core/deps/rcheevos + url = https://github.com/RetroAchievements/rcheevos.git +[submodule "core/deps/googletest"] + path = core/deps/googletest + url = https://github.com/google/googletest.git +[submodule "core/deps/asio"] + path = core/deps/asio + url = https://github.com/chriskohlhoff/asio.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 56dd2f07f..c07d1047c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,9 +18,10 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum tvOS deployment version") set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "") else() - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum macOS deployment version") + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "Minimum macOS deployment version") set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "") endif() + set(ZLIB_LIBRARY "-lz" CACHE STRING "Use generic linker flag for Xcode to support multiple SDKs") endif() if(LIBRETRO) @@ -31,7 +32,11 @@ endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) +if(NINTENDO_SWITCH) + set(CMAKE_CXX_EXTENSIONS ON) +else() + set(CMAKE_CXX_EXTENSIONS OFF) +endif() include(DetectArchitecture) if(NOT DEFINED ARCHITECTURE) @@ -51,8 +56,10 @@ option(ENABLE_LOG "Enable full logging" OFF) option(ASAN "Enable address sanitizer" OFF) option(USE_GLES "Use GLES[3] API" OFF) option(USE_GLES2 "Use GLES2 API" OFF) +option(USE_HOST_GLSLANG "Use host glslang" OFF) option(USE_HOST_LIBZIP "Use host libzip" ON) option(USE_HOST_SDL "Use host SDL library" ${USE_HOST_SDL_DEFAULT}) +option(USE_HOST_LIBCHDR "Use host libchdr" OFF) option(USE_OPENMP "Use OpenMP if available" ON) option(USE_VULKAN "Build with Vulkan support" ON) option(USE_DX9 "Build with Direct3D 9 support" ON) @@ -60,10 +67,17 @@ option(USE_DX11 "Build with Direct3D 11 support" ON) option(LIBRETRO "Build libretro core" OFF) option(USE_OPENGL "Use OpenGL API" ON) option(USE_VIDEOCORE "RPI: use the legacy Broadcom GLES libraries" OFF) -option(APPLE_BREAKPAD "macOS: Build breakpad client and dump symbols" OFF) +option(USE_ALSA "Build with ALSA support" ON) +option(USE_LIBAO "Build with AO support" ON) +option(USE_OSS "Build with OSS support" OFF) +option(USE_PULSEAUDIO "Build with PulseAudio support" ON) +option(USE_BREAKPAD "Build and link with breakpad library" ON) +option(USE_LUA "Build with Lua support" ON) option(ENABLE_GDB_SERVER "Build with GDB debugging support" OFF) option(ENABLE_DC_PROFILER "Build with support for target machine (SH4) profiler" OFF) option(ENABLE_FC_PROFILER "Build with support for host app (Flycast) profiler" OFF) +option(USE_DISCORD "Use Discord Presence API" OFF) +option(USE_LIBCDIO "Use libcdio for CDROM access" OFF) if(IOS AND NOT LIBRETRO) set(USE_VULKAN OFF CACHE BOOL "Force vulkan off" FORCE) @@ -95,16 +109,21 @@ if(GIT_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) - if(WINDOWS_STORE) - string(REGEX REPLACE "[Vv]" "" MS_VERSION ${GIT_VERSION}) - string(REPLACE "-" "." MS_VERSION ${MS_VERSION}) - string(REGEX REPLACE "\.g[0-9a-f]+" "" MS_VERSION ${MS_VERSION}) - string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" VERSION_3PARTS ${MS_VERSION}) - if(VERSION_3PARTS STREQUAL "") - string(APPEND MS_VERSION ".0.0") - else() - string(APPEND MS_VERSION ".0") - endif() +else() + set(GIT_VERSION "v0.0.0-0-g000000000") + set(GIT_HASH "000000000") +endif() + +if(WINDOWS_STORE) + string(REGEX REPLACE "[Vv]" "" MS_VERSION ${GIT_VERSION}) + string(REPLACE "-" "." MS_VERSION ${MS_VERSION}) + string(REGEX REPLACE "\.g[0-9a-f]+" "" MS_VERSION ${MS_VERSION}) + string(REGEX MATCHALL "[0-9]+" VERSION_PARTS ${MS_VERSION}) + list(LENGTH VERSION_PARTS VERSION_PARTS_LENGTH) + if(VERSION_PARTS_LENGTH EQUAL 2) + string(APPEND MS_VERSION ".0.0") + elseif(VERSION_PARTS_LENGTH EQUAL 3) + string(APPEND MS_VERSION ".0") endif() endif() @@ -118,11 +137,12 @@ if(NINTENDO_SWITCH) if(LIBRETRO) add_library(${PROJECT_NAME} STATIC core/emulator.cpp) target_compile_definitions(${PROJECT_NAME} PRIVATE LIBRETRO HAVE_LIBNX HAVE_OPENGL HAVE_OIT) + find_path(GLEXT_H_INCLUDE_DIR NAMES GL/glext.h REQUIRED) + target_include_directories(${PROJECT_NAME} PRIVATE ${GLEXT_H_INCLUDE_DIR}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "flycast_libretro_libnx") set(CMAKE_STATIC_LIBRARY_PREFIX "") else() add_executable(${PROJECT_NAME} core/emulator.cpp) - target_compile_definitions(${PROJECT_NAME} PRIVATE EGL_NO_PLATFORM_SPECIFIC_TYPES) endif() if(USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES) @@ -151,8 +171,6 @@ elseif(LIBRETRO) endif() if(ANDROID OR USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3 HAVE_OPENGLES HAVE_OPENGLES3) - find_library(GLES3_LIBRARIES NAMES GLESv3 GLESv2 NO_CACHE REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE ${GLES3_LIBRARIES}) elseif(IOS) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3 HAVE_OPENGLES HAVE_OPENGLES3) find_library(OPENGLES OpenGLES) @@ -174,9 +192,6 @@ elseif(LIBRETRO) else() target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_OIT) endif() - if(WIN32) - target_link_libraries(${PROJECT_NAME} PRIVATE "-lopengl32") - endif() endif() elseif(ANDROID) add_library(${PROJECT_NAME} SHARED core/emulator.cpp) @@ -185,9 +200,19 @@ elseif(ANDROID) target_compile_options(${PROJECT_NAME} PRIVATE -fno-stack-protector) set(CMAKE_ANDROID_STL_TYPE "c++_static") elseif(WIN32) - add_executable(${PROJECT_NAME} WIN32 core/emulator.cpp) - if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + if(BUILD_TESTING) + add_executable(${PROJECT_NAME} core/emulator.cpp) + else() + add_executable(${PROJECT_NAME} WIN32 core/emulator.cpp) + endif() + if(CMAKE_GENERATOR MATCHES "Visual Studio") + if(NOT CMAKE_VS_GLOBALS MATCHES "(^|;)UseMultiToolTask=") + list(APPEND CMAKE_VS_GLOBALS UseMultiToolTask=true) + endif() + if(NOT CMAKE_VS_GLOBALS MATCHES "(^|;)EnforceProcessCountAcrossBuilds=") + list(APPEND CMAKE_VS_GLOBALS EnforceProcessCountAcrossBuilds=true) + endif() + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) endif() elseif(APPLE) add_executable(${PROJECT_NAME} MACOSX_BUNDLE core/emulator.cpp) @@ -200,9 +225,7 @@ if(WINDOWS_STORE) set(USE_VULKAN OFF) endif() -set_target_properties(${PROJECT_NAME} PROPERTIES - CXX_EXTENSIONS OFF - LINK_FLAGS_RELEASE -s) +set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE -s) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /GR /GS-) if(WINDOWS_STORE) @@ -214,10 +237,15 @@ else() $<$:-Wall>) endif() +if(${CMAKE_OSX_SYSROOT} MATCHES "\/MacOSX.platform\/Developer\/SDKs") + set(TARGET_MAC ON) +endif() + target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:GL_SILENCE_DEPRECATION> $<$:DEBUGFAST> $<$:TARGET_IPHONE> + $<$:TARGET_MAC> $<$:GLES> $<$:GLES3> $<$:GLES_SILENCE_DEPRECATION> @@ -225,31 +253,37 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:_CRT_SECURE_NO_WARNINGS> $<$:_WINSOCK_DEPRECATED_NO_WARNING> $<$:NOMINMAX> - $<$:_DEFAULT_SOURCE> $<$:TEST_AUTOMATION> + $<$:NOCRYPT> $<$,$>:_USE_MATH_DEFINES>) +if(UNIX AND NOT ANDROID AND NOT APPLE) + execute_process(COMMAND getconf PAGESIZE OUTPUT_VARIABLE PAGE_SIZE OUTPUT_STRIP_TRAILING_WHITESPACE) + target_compile_definitions(${PROJECT_NAME} PRIVATE PAGE_SIZE=${PAGE_SIZE}) +endif() + if(NOT "${SENTRY_UPLOAD_URL}" STREQUAL "") target_compile_definitions(${PROJECT_NAME} PRIVATE SENTRY_UPLOAD="${SENTRY_UPLOAD_URL}") endif() -target_include_directories(${PROJECT_NAME} PRIVATE core core/deps core/deps/stb core/deps/khronos core/deps/json) +target_include_directories(${PROJECT_NAME} PRIVATE core core/deps core/deps/stb core/deps/json core/deps/asio/asio/include) if(LIBRETRO) target_include_directories(${PROJECT_NAME} PRIVATE shell/libretro) endif() if(NINTENDO_SWITCH) - target_include_directories(${PROJECT_NAME} PRIVATE shell/switch "${DEVKITPRO}/portlibs/switch/include") + target_include_directories(${PROJECT_NAME} PRIVATE shell/switch) endif() -if(NOT LIBRETRO) - if((WIN32 AND NOT MSVC) OR (UNIX AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|OpenBSD|NetBSD)")) +if(USE_BREAKPAD AND NOT LIBRETRO) + find_program(SH_EXECUTABLE sh) + if((ANDROID AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") OR (MINGW AND SH_EXECUTABLE) OR (CMAKE_SYSTEM_NAME STREQUAL "Linux")) add_subdirectory(core/deps/breakpad) if(WIN32) target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--build-id") endif() target_link_libraries(${PROJECT_NAME} PUBLIC breakpad_client) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BREAKPAD) - elseif(APPLE AND NOT IOS AND APPLE_BREAKPAD) + elseif(APPLE AND NOT IOS) target_sources(${PROJECT_NAME} PRIVATE core/deps/breakpad/src/client/minidump_file_writer-inl.h core/deps/breakpad/src/client/minidump_file_writer.cc @@ -301,26 +335,26 @@ if(NOT LIBRETRO) COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a x86_64 -g ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app.dSYM - ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app/Contents/MacOS/Flycast > ../symbols/Flycast-x64.sym + $ > ../symbols/Flycast-x64.sym COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a arm64 -g ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app.dSYM - ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app/Contents/MacOS/Flycast > ../symbols/Flycast-arm64.sym + $ > ../symbols/Flycast-arm64.sym ) else() add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND sleep 20 COMMAND mkdir -p ../symbols - COMMAND dsymutil ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app/Contents/MacOS/Flycast + COMMAND dsymutil $ -o ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a x86_64 -g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM - ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app/Contents/MacOS/Flycast > ../symbols/Flycast-x64.sym + $ > ../symbols/Flycast-x64.sym COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build/breakpad/dump_syms -a arm64 -g ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app.dSYM - ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app/Contents/MacOS/Flycast > ../symbols/Flycast-arm64.sym + $ > ../symbols/Flycast-arm64.sym ) endif() endif() @@ -350,7 +384,7 @@ if(USE_OPENMP) message("-- Found OpenMP.xcframework: ${OPENMP_FRAMEWORK} (Linking static library before CMake support linking xcframework)") target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENMP_FRAMEWORK}) target_include_directories(${PROJECT_NAME} PRIVATE ${OPENMP_XCFRAMEWORK}/ios-arm64_arm64e/OpenMP.framework/Versions/A/Headers) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xclang -fopenmp") + target_compile_options(${PROJECT_NAME} PRIVATE $<$:-Xclang -fopenmp>) endif() else() message("-- Could NOT find OpenMP.xcframework, compile it using shell/apple/emulator-ios/OpenMP/build_ios_openmp.sh") @@ -368,22 +402,34 @@ add_subdirectory(core/deps/glm) target_link_libraries(${PROJECT_NAME} PRIVATE glm::glm) if(USE_VULKAN) - option(BUILD_EXTERNAL "Build external dependencies in /External" OFF) - option(SKIP_GLSLANG_INSTALL "Skip installation" ON) - option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" OFF) - option(ENABLE_GLSLANG_BINARIES "Builds glslangValidator and spirv-remap" OFF) - option(ENABLE_HLSL "Enables HLSL input support" OFF) - option(ENABLE_PCH "Enables Precompiled header" OFF) - add_subdirectory(core/deps/glslang EXCLUDE_FROM_ALL) - target_link_libraries(${PROJECT_NAME} PRIVATE glslang-default-resource-limits SPIRV) + if(USE_HOST_GLSLANG) + find_package(glslang REQUIRED) + else() + option(BUILD_EXTERNAL "Build external dependencies in /External" OFF) + option(SKIP_GLSLANG_INSTALL "Skip installation" ON) + option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" OFF) + option(ENABLE_GLSLANG_BINARIES "Builds glslang and spirv-remap" OFF) + option(ENABLE_HLSL "Enables HLSL input support" OFF) + option(ENABLE_PCH "Enables Precompiled header" OFF) + add_subdirectory(core/deps/glslang EXCLUDE_FROM_ALL) + add_library(glslang::glslang-default-resource-limits ALIAS glslang-default-resource-limits) + add_library(glslang::SPIRV ALIAS SPIRV) + endif() + target_link_libraries(${PROJECT_NAME} PRIVATE glslang::glslang-default-resource-limits glslang::SPIRV) endif() if(NOT LIBRETRO) - find_package(ALSA) - if(ALSA_FOUND AND NOT ANDROID) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_ALSA) - target_include_directories(${PROJECT_NAME} PRIVATE ${ALSA_INCLUDE_DIRS}) - target_link_libraries(${PROJECT_NAME} PRIVATE ${ALSA_LIBRARIES}) + if(USE_OSS) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_OSS) + endif() + + if(USE_ALSA) + find_package(ALSA) + if(ALSA_FOUND AND NOT ANDROID) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_ALSA) + target_include_directories(${PROJECT_NAME} PRIVATE ${ALSA_INCLUDE_DIRS}) + target_link_libraries(${PROJECT_NAME} PRIVATE ${ALSA_LIBRARIES}) + endif() endif() if(MINGW) @@ -392,15 +438,16 @@ if(NOT LIBRETRO) if(NOT ANDROID AND NOT IOS) if(USE_HOST_SDL) - find_package(SDL2) + find_package(SDL2 2.0.9) endif() if(NOT SDL2_FOUND) + set(SDL_TEST_ENABLED_BY_DEFAULT OFF) add_subdirectory(core/deps/SDL EXCLUDE_FROM_ALL) set(SDL2_FOUND 1) endif() # SDL2::SDL2main may or may not be available. It is e.g. required by Windows GUI applications - if(TARGET SDL2::SDL2main) + if(TARGET SDL2::SDL2main AND NOT BUILD_TESTING) # It has an implicit dependency on SDL2 functions, so it MUST be added before SDL2::SDL2 (or SDL2::SDL2-static) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2main) endif() @@ -415,7 +462,14 @@ if(NOT LIBRETRO) endif() target_compile_definitions(${PROJECT_NAME} PRIVATE USE_SDL USE_SDL_AUDIO) - target_sources(${PROJECT_NAME} PRIVATE core/sdl/sdl.cpp core/sdl/sdl.h core/sdl/sdl_gamepad.h core/sdl/sdl_keyboard.h) + target_sources(${PROJECT_NAME} PRIVATE + core/sdl/sdl.cpp + core/sdl/sdl.h + core/sdl/sdl_gamepad.h + core/sdl/sdl_keyboard.h + core/sdl/sdl_keyboard_mac.h + core/sdl/dreamconn.cpp + core/sdl/dreamconn.h) if((UNIX AND NOT APPLE) OR NINTENDO_SWITCH) find_package(CURL REQUIRED) @@ -429,35 +483,46 @@ if(NOT LIBRETRO) target_link_libraries(${PROJECT_NAME} PRIVATE ZLIB::ZLIB) endif() - find_package(Lua) - if(NOT APPLE AND LUA_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LUA) - target_include_directories(${PROJECT_NAME} PRIVATE ${LUA_INCLUDE_DIR} core/deps/luabridge/Source) - list(TRANSFORM LUA_LIBRARIES REPLACE "\.dll" "") - target_link_libraries(${PROJECT_NAME} PRIVATE ${LUA_LIBRARIES}) + if(USE_LUA) + find_package(Lua 5.2) + if(NOT APPLE AND LUA_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LUA) + target_include_directories(${PROJECT_NAME} PRIVATE ${LUA_INCLUDE_DIR} core/deps/luabridge/Source) + list(TRANSFORM LUA_LIBRARIES REPLACE "\.dll" "") + target_link_libraries(${PROJECT_NAME} PRIVATE ${LUA_LIBRARIES}) + endif() endif() endif() -add_subdirectory(core/deps/libchdr EXCLUDE_FROM_ALL) -target_link_libraries(${PROJECT_NAME} PRIVATE chdr-static) -target_include_directories(${PROJECT_NAME} PRIVATE core/deps/libchdr/include) +find_package(PkgConfig) +if(PKG_CONFIG_FOUND AND USE_HOST_LIBCHDR) + pkg_check_modules(LIBCHDR IMPORTED_TARGET libchdr) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBCHDR) +else() + add_subdirectory(core/deps/libchdr EXCLUDE_FROM_ALL) + target_link_libraries(${PROJECT_NAME} PRIVATE chdr-static) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/libchdr/include) +endif() if(NOT WITH_SYSTEM_ZLIB) - target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/core/deps/libchdr/deps/zlib-1.2.11") - target_link_libraries(${PROJECT_NAME} PRIVATE zlib) + set(ZLIB_RELATIVE_PATH "core/deps/libchdr/deps/zlib-1.3.1") + target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/${ZLIB_RELATIVE_PATH}" "${CMAKE_CURRENT_BINARY_DIR}/${ZLIB_RELATIVE_PATH}") # help libzip find the package set(ZLIB_FOUND TRUE) - set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/core/deps/libchdr/deps/zlib-1.2.11") + set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${ZLIB_RELATIVE_PATH}" "${CMAKE_CURRENT_BINARY_DIR}/${ZLIB_RELATIVE_PATH}") + cmake_policy(SET CMP0026 OLD) - get_target_property(ZLIB_LIBRARY zlib LOCATION) + get_target_property(ZLIB_LIBRARY_RELEASE zlibstatic LOCATION) + get_target_property(ZLIB_LIBRARY_DEBUG zlibstatic LOCATION_Debug) endif() -find_package(PkgConfig) if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE AND NOT LIBRETRO) - pkg_check_modules(AO IMPORTED_TARGET ao) - if(AO_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBAO) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::AO) + if(USE_LIBAO) + pkg_check_modules(AO IMPORTED_TARGET ao) + if(AO_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBAO) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::AO) + endif() endif() if(NOT SDL2_FOUND) @@ -474,10 +539,12 @@ if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE AND NOT LIBRETRO) endif() endif() - pkg_check_modules(LIBPULSE IMPORTED_TARGET libpulse) - if(LIBPULSE_FOUND) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_PULSEAUDIO) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBPULSE) + if(USE_PULSEAUDIO) + pkg_check_modules(LIBPULSE IMPORTED_TARGET libpulse) + if(LIBPULSE_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_PULSEAUDIO) + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBPULSE) + endif() endif() if(USE_HOST_LIBZIP) @@ -499,11 +566,6 @@ if(PKG_CONFIG_FOUND AND NOT ANDROID AND NOT APPLE AND NOT LIBRETRO) endif() endif() -if(NINTENDO_SWITCH AND USE_GLES) - pkg_check_modules(GLESV2 IMPORTED_TARGET glesv2) - target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::GLESV2) -endif() - if(UNIX AND NOT APPLE AND NOT ANDROID) add_definitions( -DFLYCAST_DATADIR="${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/" @@ -513,22 +575,12 @@ if(UNIX AND NOT APPLE AND NOT ANDROID) if(USE_GLES2) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES2) if(USE_VIDEOCORE) + target_compile_definitions(${PROJECT_NAME} PRIVATE TARGET_VIDEOCORE USE_OMX) target_link_libraries(${PROJECT_NAME} PRIVATE "-lbrcmGLESv2") target_link_directories(${PROJECT_NAME} PRIVATE "/opt/vc/lib") - else() - target_link_libraries(${PROJECT_NAME} PRIVATE GLESv2) endif() elseif(USE_GLES) target_compile_definitions(${PROJECT_NAME} PRIVATE GLES GLES3) - if(NOT SDL2_FOUND) - target_link_libraries(${PROJECT_NAME} PRIVATE EGL) - endif() - find_library(GLES3_LIBRARIES NAMES GLESv3 GLESv2 NO_CACHE REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE ${GLES3_LIBRARIES}) - elseif(USE_OPENGL) - set(OpenGL_GL_PREFERENCE LEGACY) - find_package(OpenGL REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL) endif() find_package(Threads REQUIRED) @@ -547,8 +599,6 @@ if(UNIX AND NOT APPLE AND NOT ANDROID) target_include_directories(${PROJECT_NAME} PRIVATE ${X11_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE ${X11_LIBRARIES}) endif() - else() - target_compile_definitions(${PROJECT_NAME} PRIVATE EGL_NO_X11) endif() find_library(LIBRT rt) @@ -587,8 +637,7 @@ target_sources(${PROJECT_NAME} PRIVATE core/deps/chdpsr/cdipsr.cpp core/deps/chdpsr/cdipsr.h) -add_subdirectory(core/deps/nowide) -target_compile_definitions(nowide PRIVATE $<$:_DEFAULT_SOURCE>) +add_subdirectory(core/deps/nowide EXCLUDE_FROM_ALL) target_link_libraries(${PROJECT_NAME} PRIVATE nowide::nowide) if(NOT MINIUPNP_FOUND) @@ -610,6 +659,10 @@ if(NOT MINIUPNP_FOUND) endif() if(NOT LIBZIP_FOUND OR NINTENDO_SWITCH) + cmake_policy(SET CMP0026 OLD) + set(zstd_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/core/deps/libchdr/deps/zstd-1.5.6/lib") + get_target_property(zstd_STATIC_LIBRARY libzstd_static LOCATION) + option(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" OFF) option(ENABLE_GNUTLS "Enable use of GnuTLS" OFF) option(ENABLE_MBEDTLS "Enable use of mbed TLS" OFF) @@ -617,16 +670,37 @@ if(NOT LIBZIP_FOUND OR NINTENDO_SWITCH) option(ENABLE_WINDOWS_CRYPTO "Enable use of Windows cryptography libraries" OFF) option(ENABLE_BZIP2 "Enable use of BZip2" OFF) option(ENABLE_LZMA "Enable use of LZMA" OFF) - option(ENABLE_ZSTD "Enable use of Zstandard" OFF) + option(ENABLE_ZSTD "Enable use of Zstandard" ON) option(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" OFF) option(BUILD_REGRESS "Build regression tests" OFF) option(BUILD_EXAMPLES "Build examples" OFF) option(BUILD_DOC "Build documentation" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(LIBZIP_DO_INSTALL "Install libzip and the related files" OFF) - add_subdirectory(core/deps/libzip) - target_include_directories(${PROJECT_NAME} PRIVATE core/deps/libzip/lib) - target_link_libraries(${PROJECT_NAME} PRIVATE zip) + add_subdirectory(core/deps/libzip EXCLUDE_FROM_ALL) + target_link_libraries(${PROJECT_NAME} PRIVATE libzip::zip) +endif() + +if(USE_LIBCDIO) + if(PKG_CONFIG_FOUND) + pkg_check_modules(CDIO IMPORTED_TARGET libcdio) + if(CDIO_FOUND) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBCDIO) + if(MINGW) + # Force static link + target_link_libraries(${PROJECT_NAME} PRIVATE "-l:libcdio.a -l:libiconv.a -lwinmm") + else() + target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::CDIO) + endif() + endif() + endif() + if(NOT CDIO_FOUND) + find_package(libcdio) + if(TARGET libcdio::libcdio) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBCDIO) + target_link_libraries(${PROJECT_NAME} PRIVATE libcdio::libcdio) + endif() + endif() endif() if(WIN32) @@ -698,15 +772,18 @@ target_sources(${PROJECT_NAME} PRIVATE core/deps/lzma/7zArcIn.c core/deps/lzma/7 add_subdirectory(core/deps/libelf) target_link_libraries(${PROJECT_NAME} PRIVATE elf) if(NOT LIBRETRO) - target_compile_definitions(${PROJECT_NAME} PRIVATE IMGUI_DISABLE_DEMO_WINDOWS) + target_compile_definitions(${PROJECT_NAME} PRIVATE IMGUI_DISABLE_DEMO_WINDOWS IMGUI_DEFINE_MATH_OPERATORS) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/imgui core/deps/imgui/backends) target_sources(${PROJECT_NAME} PRIVATE core/deps/imgui/imgui.cpp core/deps/imgui/imgui_demo.cpp core/deps/imgui/imgui_draw.cpp + core/deps/imgui/imgui_stdlib.cpp core/deps/imgui/imgui_tables.cpp core/deps/imgui/imgui_widgets.cpp) if(ENABLE_FC_PROFILER) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/implot) target_sources(${PROJECT_NAME} PRIVATE core/deps/implot/implot.h core/deps/implot/implot.cpp @@ -717,6 +794,15 @@ endif() target_sources(${PROJECT_NAME} PRIVATE core/deps/xbrz/xbrz.cpp) target_sources(${PROJECT_NAME} PRIVATE core/deps/md5/md5.cpp) +if(USE_DISCORD AND NOT LIBRETRO) + option(BUILD_EXAMPLES "Build example apps" OFF) + add_subdirectory(core/deps/discord-rpc EXCLUDE_FROM_ALL) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/discord-rpc/include) + target_link_libraries(${PROJECT_NAME} PRIVATE discord-rpc) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_DISCORD) + target_sources(${PROJECT_NAME} PRIVATE core/ui/discord.cpp) +endif() + cmrc_add_resource_library(flycast-resources ALIAS flycast::res NAMESPACE flycast) target_link_libraries(${PROJECT_NAME} PRIVATE flycast::res) @@ -813,10 +899,14 @@ target_sources(${PROJECT_NAME} PRIVATE core/hw/bba/bba.cpp core/hw/bba/rtl8139c.h core/hw/bba/rtl8139c.cpp + core/hw/flashrom/at93cxx.cpp + core/hw/flashrom/at93cxx.h core/hw/flashrom/flashrom.cpp core/hw/flashrom/flashrom.h core/hw/flashrom/nvmem.cpp core/hw/flashrom/nvmem.h + core/hw/flashrom/x76f100.cpp + core/hw/flashrom/x76f100.h core/hw/gdrom/gdrom_if.h core/hw/gdrom/gdrom_response.cpp core/hw/gdrom/gdromv3.cpp @@ -876,6 +966,10 @@ target_sources(${PROJECT_NAME} PRIVATE core/hw/naomi/touchscreen.cpp core/hw/naomi/printer.h core/hw/naomi/printer.cpp + core/hw/naomi/systemsp.h + core/hw/naomi/systemsp.cpp + core/hw/naomi/hopper.h + core/hw/naomi/hopper.cpp core/hw/pvr/elan.cpp core/hw/pvr/elan.h core/hw/pvr/elan_struct.h @@ -964,29 +1058,48 @@ cmrc_add_resources(flycast-resources resources/flash/wldkicksj.nvmem.zip # free play resources/flash/wldkicksu.nvmem.zip # free play resources/flash/f355.nvmem.zip # printer on - resources/flash/f355twin.nvmem.zip - resources/flash/f355twn2.nvmem.zip + resources/flash/f355twin.nvmem.zip # printer on + resources/flash/f355twn2.nvmem.zip # printer on resources/flash/dirtypig.nvmem.zip # 4 players resources/flash/dirtypig.nvmem2.zip resources/flash/vf4.nvmem.zip # card all day, stage select resources/flash/vf4evob.nvmem.zip # card all day, stage select - resources/flash/vf4tuned.nvmem.zip) # card all day, stage select, 45 sec time limit, 3 match + resources/flash/vf4tuned.nvmem.zip # card all day, stage select, 45 sec time limit, 3 match + resources/flash/magicpop.nvmem.zip # debug: comm and all errors disabled + resources/flash/ochaken.nvmem.zip # debug: comm and all errors disabled + resources/flash/puyomedal.nvmem.zip # debug: comm and all errors disabled + resources/flash/unomedal.nvmem.zip # debug: comm and all errors disabled + resources/flash/westdrmg.nvmem.zip # debug: comm and all errors disabled + resources/picture/f355_print_template.png) cmrc_add_resources(flycast-resources - fonts/printer_ascii8x16.bin - fonts/printer_ascii12x24.bin - fonts/printer_kanji16x16.bin - fonts/printer_kanji24x24.bin) + fonts/printer_ascii8x16.bin.zip + fonts/printer_ascii12x24.bin.zip + fonts/printer_kanji16x16.bin.zip + fonts/printer_kanji24x24.bin.zip) + +if(NOT LIBRETRO) + cmrc_add_resources(flycast-resources + fonts/Roboto-Medium.ttf.zip + fonts/Roboto-Regular.ttf.zip + fonts/fa-solid-900.ttf.zip) + if(ANDROID OR IOS) + cmrc_add_resources(flycast-resources + WHENCE resources + resources/picture/buttons.png + resources/picture/buttons-arcade.png) + endif() +endif() target_sources(${PROJECT_NAME} PRIVATE core/imgread/cdi.cpp + core/imgread/cdio.cpp core/imgread/chd.cpp core/imgread/common.cpp core/imgread/common.h core/imgread/cue.cpp core/imgread/gdi.cpp core/imgread/ImgReader.cpp - core/imgread/ioctl.cpp core/imgread/iso9660.h core/imgread/isofs.cpp core/imgread/isofs.h) @@ -1017,16 +1130,18 @@ else() core/linux/unwind_info.cpp) if(NINTENDO_SWITCH) target_sources(${PROJECT_NAME} PRIVATE - core/linux/libnx_vmem.cpp + shell/switch/libnx_vmem.cpp shell/switch/stubs.c - shell/switch/context_switch.S) + shell/switch/context_switch.S + shell/switch/nswitch.h + shell/switch/switch_gamepad.h + shell/switch/switch_main.cpp + shell/switch/ucontext.h) endif() endif() if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE - core/linux-dist/dispmanx.cpp - core/linux-dist/dispmanx.h core/linux-dist/evdev.cpp core/linux-dist/evdev.h core/linux-dist/icon.h @@ -1074,27 +1189,32 @@ endif() if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE - core/oslib/audiobackend_alsa.cpp - core/oslib/audiobackend_coreaudio.cpp - core/oslib/audiobackend_directsound.cpp - core/oslib/audiobackend_libao.cpp - core/oslib/audiobackend_null.cpp - core/oslib/audiobackend_oboe.cpp - core/oslib/audiobackend_omx.cpp - core/oslib/audiobackend_oss.cpp - core/oslib/audiobackend_pulseaudio.cpp - core/oslib/audiobackend_sdl2.cpp - core/oslib/audiostream.cpp + core/audio/audiobackend_alsa.cpp + core/audio/audiobackend_coreaudio.cpp + core/audio/audiobackend_directsound.cpp + core/audio/audiobackend_libao.cpp + core/audio/audiobackend_null.cpp + core/audio/audiobackend_oboe.cpp + core/audio/audiobackend_omx.cpp + core/audio/audiobackend_oss.cpp + core/audio/audiobackend_pulseaudio.cpp + core/audio/audiobackend_sdl2.cpp + core/audio/audiostream.cpp + core/oslib/http_client.cpp + core/oslib/http_client.h core/oslib/oslib.cpp) endif() target_sources(${PROJECT_NAME} PRIVATE - core/oslib/audiostream.h + core/audio/audiostream.h core/oslib/directory.h core/oslib/host_context.h core/oslib/oslib.h + core/oslib/resources.cpp + core/oslib/resources.h core/oslib/storage.cpp core/oslib/storage.h + core/oslib/unwind_info.h core/oslib/virtmem.h core/lua/lua.cpp core/lua/lua.h) @@ -1124,7 +1244,45 @@ target_sources(${PROJECT_NAME} PRIVATE core/reios/reios.h core/reios/reios_elf.cpp core/reios/reios_elf.h) -cmrc_add_resources(flycast-resources fonts/biosfont.bin) +cmrc_add_resources(flycast-resources fonts/biosfont.bin.zip) + +target_sources(${PROJECT_NAME} PRIVATE + core/achievements/achievements.cpp + core/achievements/achievements.h) +if(NOT LIBRETRO) + target_sources(${PROJECT_NAME} PRIVATE + core/deps/rcheevos/src/rc_client_raintegration.c + core/deps/rcheevos/src/rc_client.c + core/deps/rcheevos/src/rc_compat.c + core/deps/rcheevos/src/rc_util.c + core/deps/rcheevos/src/rc_version.c + core/deps/rcheevos/src/rapi/rc_api_common.c + core/deps/rcheevos/src/rapi/rc_api_editor.c + core/deps/rcheevos/src/rapi/rc_api_info.c + core/deps/rcheevos/src/rapi/rc_api_runtime.c + core/deps/rcheevos/src/rapi/rc_api_user.c + core/deps/rcheevos/src/rcheevos/alloc.c + core/deps/rcheevos/src/rcheevos/condition.c + core/deps/rcheevos/src/rcheevos/condset.c + core/deps/rcheevos/src/rcheevos/consoleinfo.c + core/deps/rcheevos/src/rcheevos/format.c + core/deps/rcheevos/src/rcheevos/lboard.c + core/deps/rcheevos/src/rcheevos/memref.c + core/deps/rcheevos/src/rcheevos/operand.c + core/deps/rcheevos/src/rcheevos/rc_validate.c + core/deps/rcheevos/src/rcheevos/richpresence.c + core/deps/rcheevos/src/rcheevos/runtime_progress.c + core/deps/rcheevos/src/rcheevos/runtime.c + core/deps/rcheevos/src/rcheevos/trigger.c + core/deps/rcheevos/src/rcheevos/value.c + core/deps/rcheevos/src/rhash/aes.c + core/deps/rcheevos/src/rhash/cdreader.c + core/deps/rcheevos/src/rhash/hash.c + core/deps/rcheevos/src/rhash/md5.c + core/deps/rcheevos/src/rurl/url.c) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/rcheevos/include) + target_compile_definitions(${PROJECT_NAME} PRIVATE USE_RACHIEVEMENTS RC_DISABLE_LUA) +endif() target_sources(${PROJECT_NAME} PRIVATE core/wsi/context.h @@ -1142,20 +1300,7 @@ if(USE_OPENGL) core/wsi/osx.cpp core/wsi/osx.h core/wsi/sdl.cpp - core/wsi/sdl.h - core/wsi/wgl.cpp - core/wsi/wgl.h - core/wsi/xgl.cpp - core/wsi/xgl.h) - - if(NOT APPLE AND NOT LIBRETRO) - target_sources(${PROJECT_NAME} PRIVATE - core/wsi/gl32funcs.c - core/wsi/gl32funcs.h) - endif() - if(NOT (NINTENDO_SWITCH AND LIBRETRO)) - target_sources(${PROJECT_NAME} PRIVATE core/wsi/gl4funcs.cpp) - endif() + core/wsi/sdl.h) target_sources(${PROJECT_NAME} PRIVATE core/rend/gles/glcache.h @@ -1211,33 +1356,35 @@ target_sources(${PROJECT_NAME} PRIVATE core/rend/tileclip.h core/rend/TexCache.cpp core/rend/TexCache.h + core/rend/texconv.cpp + core/rend/texconv.h core/rend/norend/norend.cpp) if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE - core/rend/game_scanner.h - core/rend/imgui_driver.h - core/rend/gui.cpp - core/rend/gui.h - core/rend/gui_android.cpp - core/rend/gui_android.h - core/rend/gui_chat.h - core/rend/gui_cheats.cpp - core/rend/gui_util.cpp - core/rend/gui_util.h - core/rend/mainui.cpp - core/rend/mainui.h - core/rend/boxart/boxart.cpp - core/rend/boxart/boxart.h - core/rend/boxart/gamesdb.cpp - core/rend/boxart/gamesdb.h - core/rend/boxart/http_client.cpp - core/rend/boxart/http_client.h - core/rend/boxart/scraper.cpp - core/rend/boxart/scraper.h) + core/ui/game_scanner.cpp + core/ui/game_scanner.h + core/ui/imgui_driver.h + core/ui/gui.cpp + core/ui/gui.h + core/ui/gui_achievements.cpp + core/ui/vgamepad.cpp + core/ui/vgamepad.h + core/ui/gui_chat.h + core/ui/gui_cheats.cpp + core/ui/gui_util.cpp + core/ui/gui_util.h + core/ui/mainui.cpp + core/ui/mainui.h + core/ui/boxart/boxart.cpp + core/ui/boxart/boxart.h + core/ui/boxart/gamesdb.cpp + core/ui/boxart/gamesdb.h + core/ui/boxart/scraper.cpp + core/ui/boxart/scraper.h) endif() if(USE_VULKAN) - target_compile_definitions(${PROJECT_NAME} PUBLIC VK_NO_PROTOTYPES) + target_compile_definitions(${PROJECT_NAME} PUBLIC VK_ENABLE_BETA_EXTENSIONS VK_NO_PROTOTYPES) if(ANDROID) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_ANDROID_KHR) elseif(X11_FOUND) @@ -1245,21 +1392,20 @@ if(USE_VULKAN) elseif(WIN32) target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_WIN32_KHR) elseif(APPLE) - target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_MACOS_MVK) + target_compile_definitions(${PROJECT_NAME} PUBLIC VK_USE_PLATFORM_METAL_EXT) endif() add_subdirectory(core/deps/Vulkan-Headers) target_link_libraries(${PROJECT_NAME} PRIVATE Vulkan::Headers) - if (APPLE) - # Only available on macOS 10.12+ - target_compile_definitions(${PROJECT_NAME} PRIVATE VMA_USE_STL_SHARED_MUTEX=0) - endif() - - add_library(VulkanMemoryAllocator INTERFACE) + add_subdirectory(core/deps/VulkanMemoryAllocator) target_compile_options(VulkanMemoryAllocator INTERFACE $<$,$>:-Wno-nullability-completeness>) - target_include_directories(VulkanMemoryAllocator INTERFACE core/deps/VulkanMemoryAllocator/include) - target_link_libraries(${PROJECT_NAME} PRIVATE VulkanMemoryAllocator) + target_link_libraries(${PROJECT_NAME} PRIVATE GPUOpen::VulkanMemoryAllocator) + + if(ANDROID AND NOT LIBRETRO AND "arm64" IN_LIST ARCHITECTURE) + add_subdirectory(core/deps/libadrenotools) + target_link_libraries(${PROJECT_NAME} PRIVATE adrenotools) + endif() target_compile_definitions(${PROJECT_NAME} PRIVATE USE_VULKAN HAVE_VULKAN) target_sources(${PROJECT_NAME} PRIVATE @@ -1273,6 +1419,7 @@ if(USE_VULKAN) core/rend/vulkan/oit/oit_renderpass.h core/rend/vulkan/oit/oit_shaders.cpp core/rend/vulkan/oit/oit_shaders.h + core/rend/vulkan/adreno.cpp core/rend/vulkan/buffer.cpp core/rend/vulkan/buffer.h core/rend/vulkan/commandpool.cpp @@ -1333,15 +1480,8 @@ if(WIN32 AND USE_DX9 AND NOT LIBRETRO AND NOT WINDOWS_STORE AND ("x86" IN_LIST A if(NOT MINGW) set_source_files_properties(${REND_DX9_FILES} PROPERTIES INCLUDE_DIRECTORIES "$ENV{DXSDK_DIR}/Include") - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - target_link_directories(${PROJECT_NAME} PUBLIC "$ENV{DXSDK_DIR}/Lib/x64") - else() - target_link_directories(${PROJECT_NAME} PUBLIC "$ENV{DXSDK_DIR}/Lib/x86") - endif() endif() - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_DX9) - target_link_libraries(${PROJECT_NAME} PUBLIC d3d9 d3dx9) endif() if(WIN32 AND USE_DX11) @@ -1387,6 +1527,9 @@ if(ENABLE_GDB_SERVER) endif() if("arm" IN_LIST ARCHITECTURE AND NOT APPLE) + if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE "/Zc:__cplusplus") + endif() target_include_directories(${PROJECT_NAME} PRIVATE core/deps/vixl) target_sources(${PROJECT_NAME} PRIVATE core/rec-ARM/rec_arm.cpp @@ -1402,8 +1545,6 @@ if("arm" IN_LIST ARCHITECTURE AND NOT APPLE) core/deps/vixl/aarch32/macro-assembler-aarch32.h core/deps/vixl/aarch32/operands-aarch32.cc core/deps/vixl/aarch32/operands-aarch32.h - core/deps/vixl/aarch32/disasm-aarch32.cc - core/deps/vixl/aarch32/disasm-aarch32.h core/deps/vixl/assembler-base-vixl.h core/deps/vixl/code-buffer-vixl.cc core/deps/vixl/code-buffer-vixl.h @@ -1422,32 +1563,26 @@ if("arm" IN_LIST ARCHITECTURE AND NOT APPLE) core/deps/vixl/utils-vixl.h) endif() if("arm64" IN_LIST ARCHITECTURE) + if(MSVC) + target_compile_options(${PROJECT_NAME} PRIVATE "/Zc:__cplusplus") + endif() target_include_directories(${PROJECT_NAME} PRIVATE core/deps/vixl) target_sources(${PROJECT_NAME} PRIVATE core/deps/vixl/aarch64/abi-aarch64.h core/deps/vixl/aarch64/assembler-aarch64.cc core/deps/vixl/aarch64/assembler-aarch64.h + core/deps/vixl/aarch64/assembler-sve-aarch64.cc core/deps/vixl/aarch64/constants-aarch64.h - core/deps/vixl/aarch64/cpu-aarch64.cc - core/deps/vixl/aarch64/cpu-aarch64.h - core/deps/vixl/aarch64/cpu-features-auditor-aarch64.cc - core/deps/vixl/aarch64/cpu-features-auditor-aarch64.h - core/deps/vixl/aarch64/decoder-aarch64.cc - core/deps/vixl/aarch64/decoder-aarch64.h - core/deps/vixl/aarch64/disasm-aarch64.cc - core/deps/vixl/aarch64/disasm-aarch64.h core/deps/vixl/aarch64/instructions-aarch64.cc core/deps/vixl/aarch64/instructions-aarch64.h - core/deps/vixl/aarch64/instrument-aarch64.cc - core/deps/vixl/aarch64/instrument-aarch64.h - core/deps/vixl/aarch64/logic-aarch64.cc core/deps/vixl/aarch64/macro-assembler-aarch64.cc core/deps/vixl/aarch64/macro-assembler-aarch64.h + core/deps/vixl/aarch64/macro-assembler-sve-aarch64.cc core/deps/vixl/aarch64/operands-aarch64.cc core/deps/vixl/aarch64/operands-aarch64.h + core/deps/vixl/aarch64/registers-aarch64.cc + core/deps/vixl/aarch64/registers-aarch64.h core/deps/vixl/aarch64/pointer-auth-aarch64.cc - core/deps/vixl/aarch64/simulator-aarch64.cc - core/deps/vixl/aarch64/simulator-aarch64.h core/deps/vixl/aarch64/simulator-constants-aarch64.h core/deps/vixl/assembler-base-vixl.h core/deps/vixl/code-buffer-vixl.cc @@ -1485,6 +1620,16 @@ if("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE) endif() endif() +if((USE_OPENGL OR USE_GLES2 OR USE_GLES) AND NOT LIBRETRO) + add_library(glad STATIC core/deps/glad/src/gl.c) + if(NOT APPLE AND NOT WIN32 AND NOT SDL2_FOUND) + # When SDL2 is not found, we can use EGL with ANativeWindow (Android) or X11 + target_sources(glad PRIVATE core/deps/glad/src/egl.c) + endif() + target_include_directories(glad PUBLIC core/deps/glad/include) + target_link_libraries(${PROJECT_NAME} PRIVATE glad) +endif() + if(NOT LIBRETRO) target_include_directories(${PROJECT_NAME} PRIVATE core/deps/ggpo/include core/deps/ggpo/lib/ggpo) target_sources(${PROJECT_NAME} PRIVATE @@ -1529,9 +1674,13 @@ if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE shell/android-studio/flycast/src/main/jni/src/Android.cpp shell/android-studio/flycast/src/main/jni/src/android_gamepad.h + shell/android-studio/flycast/src/main/jni/src/android_storage.h + shell/android-studio/flycast/src/main/jni/src/http_client.h + shell/android-studio/flycast/src/main/jni/src/jni_util.h + shell/android-studio/flycast/src/main/jni/src/android_input.cpp shell/android-studio/flycast/src/main/jni/src/android_keyboard.h) - target_link_libraries(${PROJECT_NAME} PRIVATE android EGL GLESv2 log) + target_link_libraries(${PROJECT_NAME} PRIVATE android log) elseif(APPLE) string(TIMESTAMP YEAR "%Y") string(REGEX MATCH "^[^-]+" TAG_VERSION ${GIT_VERSION}) @@ -1542,6 +1691,7 @@ if(NOT LIBRETRO) target_sources(${PROJECT_NAME} PRIVATE shell/apple/common/http_client.mm + shell/apple/common/util.mm shell/apple/emulator-ios/emulator/AppDelegate.h shell/apple/emulator-ios/emulator/AppDelegate.mm shell/apple/emulator-ios/emulator/ios_main.mm @@ -1552,13 +1702,15 @@ if(NOT LIBRETRO) shell/apple/emulator-ios/emulator/FlycastViewController.mm shell/apple/emulator-ios/emulator/PadViewController.h shell/apple/emulator-ios/emulator/PadViewController.mm + shell/apple/emulator-ios/emulator/EditPadViewController.h + shell/apple/emulator-ios/emulator/EditPadViewController.mm shell/apple/emulator-ios/emulator/EmulatorView.h shell/apple/emulator-ios/emulator/EmulatorView.mm shell/apple/emulator-ios/emulator/main.m shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.h shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.m shell/apple/emulator-ios/emulator/iCade-iOS/iCadeState.h) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc -fmodules") + target_compile_options(${PROJECT_NAME} PRIVATE $<$:-fobjc-arc -fmodules>) set_source_files_properties(shell/apple/emulator-ios/emulator/FlycastViewController.mm PROPERTIES COMPILE_OPTIONS -fcxx-modules) set_source_files_properties(shell/apple/emulator-ios/emulator/iCade-iOS/iCadeReaderView.m PROPERTIES COMPILE_OPTIONS -fno-objc-arc) @@ -1566,7 +1718,8 @@ if(NOT LIBRETRO) shell/apple/emulator-ios/emulator/Images.xcassets shell/apple/emulator-ios/emulator/FlycastStoryboard.storyboard shell/apple/emulator-ios/emulator/LaunchScreen.storyboard - shell/apple/emulator-ios/emulator/PadViewController.xib) + shell/apple/emulator-ios/emulator/PadViewController.xib + shell/apple/emulator-ios/emulator/EditPadViewController.xib) target_sources(${PROJECT_NAME} PRIVATE ${IOS_RESOURCES}) source_group("Resources" FILES ${IOS_RESOURCES}) set_source_files_properties(${IOS_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") @@ -1597,7 +1750,6 @@ if(NOT LIBRETRO) find_library(UIKIT UIKit) find_library(FOUNDATION Foundation) - find_library(OPENGLES OpenGLES) find_library(GLKIT GLKit) find_library(GAMECONTROLLER GameController) find_library(AUDIOTOOLBOX AudioToolbox) @@ -1605,7 +1757,6 @@ if(NOT LIBRETRO) target_link_libraries(${PROJECT_NAME} PRIVATE ${UIKIT} ${FOUNDATION} - ${OPENGLES} ${GLKIT} ${GAMECONTROLLER} ${AUDIOTOOLBOX} @@ -1623,10 +1774,19 @@ if(NOT LIBRETRO) COMMAND ldid -S${CMAKE_CURRENT_SOURCE_DIR}/shell/apple/emulator-ios/emulator/flycast.entitlements ${CMAKE_CURRENT_BINARY_DIR}/Payload/Flycast.app/Flycast COMMAND ${CMAKE_COMMAND} -E tar "cfv" "${CMAKE_CURRENT_BINARY_DIR}/$-${CMAKE_OSX_SYSROOT}/Flycast.ipa" --format=zip ${CMAKE_CURRENT_BINARY_DIR}/Payload) else() + + add_subdirectory(core/deps/Syphon) + target_link_libraries(${PROJECT_NAME} PRIVATE Syphon) + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${SYPHON_METALLIB} + $/../Resources/) + target_compile_definitions(${PROJECT_NAME} PRIVATE VIDEO_ROUTING) + target_sources(${PROJECT_NAME} PRIVATE shell/apple/common/http_client.mm - shell/apple/emulator-osx/emulator-osx/SDLMain.h - shell/apple/emulator-osx/emulator-osx/SDLMain.mm + shell/apple/common/util.mm + shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.h + shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.mm shell/apple/emulator-osx/emulator-osx/osx-main.mm) set(ASSETS shell/apple/emulator-osx/emulator-osx/Images.xcassets) target_sources(${PROJECT_NAME} PRIVATE ${ASSETS}) @@ -1658,7 +1818,7 @@ if(NOT LIBRETRO) find_library(AUDIO_UNIT_LIBRARY AudioUnit) find_library(FOUNDATION_LIBRARY Foundation) find_library(AUDIO_TOOLBOX_LIBRARY AudioToolbox) - find_library(OPENGL_LIBRARY OpenGL) + find_library(METAL_LIBRARY Metal) find_library(IOSURFACE_LIBRARY IOSurface) find_library(MULTITOUCH_SUPPORT_LIBRARY MultitouchSupport /System/Library/PrivateFrameworks) @@ -1666,33 +1826,26 @@ if(NOT LIBRETRO) ${AUDIO_UNIT_LIBRARY} ${FOUNDATION_LIBRARY} ${AUDIO_TOOLBOX_LIBRARY} - ${OPENGL_LIBRARY} + ${METAL_LIBRARY} ${IOSURFACE_LIBRARY} ${MULTITOUCH_SUPPORT_LIBRARY}) - if(${CMAKE_GENERATOR} MATCHES "^Xcode.*") - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "$ENV{VULKAN_SDK}/lib/libMoltenVK.dylib" - ${CMAKE_CURRENT_BINARY_DIR}/$/Flycast.app/Contents/Frameworks/libvulkan.dylib) - else() - add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "$ENV{VULKAN_SDK}/lib/libMoltenVK.dylib" - ${CMAKE_CURRENT_BINARY_DIR}/Flycast.app/Contents/Frameworks/libvulkan.dylib) - endif() + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "$ENV{VULKAN_SDK}/lib/libMoltenVK.dylib" + $/../Frameworks/libvulkan.dylib) endif() - elseif(UNIX OR NINTENDO_SWITCH) + elseif(UNIX) if(NOT BUILD_TESTING) target_sources(${PROJECT_NAME} PRIVATE core/linux-dist/main.cpp) endif() elseif(WIN32) + target_sources(${PROJECT_NAME} PRIVATE + core/windows/clock.c + core/windows/rawinput.cpp + core/windows/rawinput.h) if(NOT BUILD_TESTING) - target_sources(${PROJECT_NAME} PRIVATE - core/windows/rawinput.cpp - core/windows/rawinput.h - core/windows/win_keyboard.h - core/windows/winmain.cpp - core/windows/xinput_gamepad.h) + target_sources(${PROJECT_NAME} PRIVATE core/windows/winmain.cpp) endif() if(WINDOWS_STORE) file(READ shell/uwp/Package.appxmanifest MANIFEST) @@ -1709,20 +1862,38 @@ if(NOT LIBRETRO) core/deps/SDL/src/main/winrt/SDL2-WinRTResources.rc) target_sources(${PROJECT_NAME} PRIVATE ${ResourceFiles} - core/deps/SDL/src/main/winrt/SDL_winrt_main_NonXAML.cpp shell/uwp/http_client.cpp) + if(NOT BUILD_TESTING) + target_sources(${PROJECT_NAME} PRIVATE core/deps/SDL/src/main/winrt/SDL_winrt_main_NonXAML.cpp) + endif() set_target_properties(${PROJECT_NAME} PROPERTIES RESOURCE "${ResourceFiles}") else() + if(NOT BUILD_TESTING AND ("x86" IN_LIST ARCHITECTURE OR "x86_64" IN_LIST ARCHITECTURE)) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/Spout/SPOUTSDK/SpoutGL) + target_include_directories(${PROJECT_NAME} PRIVATE core/deps/Spout/SPOUTSDK/SpoutDirectX/SpoutDX) + SET(SPOUT_BUILD_CMT OFF CACHE BOOL "For Visual Studio - build /MT to link runtime libraries" FORCE) + SET(SPOUT_BUILD_SPOUTDX ON CACHE BOOL "Build SpoutDX DirectX11 support library" FORCE) + SET(SPOUT_BUILD_LIBRARY OFF CACHE BOOL "Build C-compatible cross compiler library" FORCE) + SET(SKIP_INSTALL_ALL ON CACHE BOOL "Install headers and libraries" FORCE) + add_subdirectory(core/deps/Spout) + target_link_libraries(${PROJECT_NAME} PRIVATE Spout_static SpoutDX_static) + target_compile_definitions(${PROJECT_NAME} PRIVATE VIDEO_ROUTING) + endif() + target_sources(${PROJECT_NAME} PRIVATE shell/windows/flycast.rc) - target_link_libraries(${PROJECT_NAME} PRIVATE dsound opengl32 winmm ws2_32 wsock32 xinput9_1_0 cfgmgr32 wininet) + target_link_libraries(${PROJECT_NAME} PRIVATE dsound winmm ws2_32 wsock32 xinput9_1_0 cfgmgr32 wininet) endif() endif() endif() if(BUILD_TESTING) - target_sources(${PROJECT_NAME} PRIVATE - core/deps/gtest/src/gtest-all.cc - core/deps/gtest/src/gtest_main.cc) + option(BUILD_GMOCK "Builds the googlemock subproject" OFF) + option(INSTALL_GTEST "Enable installation of googletest. (Projects embedding googletest may want to turn this OFF.)" OFF) + if(WIN32) + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + endif() + add_subdirectory(core/deps/googletest EXCLUDE_FROM_ALL) + target_link_libraries(${PROJECT_NAME} PRIVATE GTest::gtest_main) target_sources(${PROJECT_NAME} PRIVATE tests/src/CheatManagerTest.cpp @@ -1743,8 +1914,8 @@ if(NINTENDO_SWITCH) COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ COMMAND ${CMAKE_AR} -x $ - COMMAND ${CMAKE_AR} -rs flycast_libretro_libnx.a *.obj - COMMAND rm *.obj + COMMAND ${CMAKE_AR} -rs flycast_libretro_libnx.a *.o + COMMAND rm *.o WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} DEPENDS xxHash::xxhash chdr-static zip ${PROJECT_NAME}) else() @@ -1784,5 +1955,7 @@ if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT LIBRETRO) endforeach() endif() -file(GLOB_RECURSE SRC_FILES *.h *.cpp *.c *.cc *.mm) -source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES}) +if(${CMAKE_GENERATOR} MATCHES "^Xcode.*|^Visual Studio.*") + file(GLOB_RECURSE SRC_FILES *.h *.cpp *.c *.cc *.mm) + source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SRC_FILES}) +endif() diff --git a/README.md b/README.md index 9d2e75ce0..9c976ae9e 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![C/C++ CI](https://github.com/flyinghead/flycast/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/flyinghead/flycast/actions/workflows/c-cpp.yml) [![Nintendo Switch CI](https://github.com/flyinghead/flycast/actions/workflows/switch.yml/badge.svg)](https://github.com/flyinghead/flycast/actions/workflows/switch.yml) [![Windows UWP CI](https://github.com/flyinghead/flycast/actions/workflows/uwp.yml/badge.svg)](https://github.com/flyinghead/flycast/actions/workflows/uwp.yml) +[![BSD CI](https://github.com/flyinghead/flycast/actions/workflows/bsd.yml/badge.svg)](https://github.com/flyinghead/flycast/actions/workflows/bsd.yml) ![flycast logo](https://github.com/flyinghead/flycast/raw/master/shell/linux/flycast.png) @@ -15,6 +16,8 @@ Join us on our [**Discord server**](https://discord.gg/X8YWP8w) for a chat. ## Install +### Android ![android](https://flyinghead.github.io/flycast-builds/android.jpg) +Install Flycast from [**Google Play**](https://play.google.com/store/apps/details?id=com.flycast.emulator). ### Flatpak (Linux ![ubuntu logo](https://flyinghead.github.io/flycast-builds/ubuntu.png)) 1. [Set up Flatpak](https://www.flatpak.org/setup/). @@ -46,14 +49,10 @@ Get fresh builds for your system [**on the builds page**](https://flyinghead.git **New:** Now automated test results are available as well. ### Build instructions: -`git clone https://github.com/flyinghead/flycast.git` - -`cd flycast` - -`git submodule update --init --recursive` - -`mkdir build && cd build` - -`cmake ..` - -`make` +``` +$ git clone --recursive https://github.com/flyinghead/flycast.git +$ cd flycast +$ mkdir build && cd build +$ cmake .. +$ make +``` diff --git a/core/achievements/achievements.cpp b/core/achievements/achievements.cpp new file mode 100644 index 000000000..b2ff0ed63 --- /dev/null +++ b/core/achievements/achievements.cpp @@ -0,0 +1,1124 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +// Derived from duckstation: https://github.com/stenzek/duckstation/blob/master/src/core/achievements.cpp +// SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin +// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) +#include "achievements.h" +#include "serialize.h" +#ifdef USE_RACHIEVEMENTS +#include "oslib/directory.h" +#include "oslib/http_client.h" +#include "hw/sh4/sh4_mem.h" +#include "ui/gui_achievements.h" +#include "imgread/common.h" +#include "cfg/option.h" +#include "oslib/oslib.h" +#include "emulator.h" +#include "stdclass.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace achievements +{ + +class Achievements +{ +public: + Achievements(); + ~Achievements(); + bool init(); + void term(); + std::future login(const char *username, const char *password); + void logout(); + bool isLoggedOn() const { return loggedOn; } + bool isActive() const { return active; } + Game getCurrentGame(); + std::vector getAchievementList(); + bool canPause(); + void serialize(Serializer& ser); + void deserialize(Deserializer& deser); + + static Achievements& Instance(); + +private: + bool createClient(); + std::string getGameHash(); + void loadGame(); + void gameLoaded(int result, const char *errorMessage); + void unloadGame(); + void pauseGame(); + void resumeGame(); + void loadCache(); + std::string getOrDownloadImage(const char *url); + std::pair getCachedImage(const char *url); + void diskChange(); + void asyncTask(std::function f); + void startThread(); + void stopThread(); + void backgroundThread(); + + static void clientLoginWithTokenCallback(int result, const char *error_message, rc_client_t *client, void *userdata); + static void clientLoginWithPasswordCallback(int result, const char *error_message, rc_client_t *client, void *userdata); + void authenticationSuccess(const rc_client_user_t *user); + static void clientMessageCallback(const char *message, const rc_client_t *client); + static u32 clientReadMemory(u32 address, u8 *buffer, u32 num_bytes, rc_client_t *client); + static void clientServerCall(const rc_api_request_t *request, rc_client_server_callback_t callback, + void *callback_data, rc_client_t *client); + static void clientEventHandler(const rc_client_event_t *event, rc_client_t *client); + void handleResetEvent(const rc_client_event_t *event); + void handleUnlockEvent(const rc_client_event_t *event); + void handleAchievementChallengeIndicatorShowEvent(const rc_client_event_t *event); + void handleAchievementChallengeIndicatorHideEvent(const rc_client_event_t *event); + void handleGameCompleted(const rc_client_event_t *event); + void handleShowAchievementProgress(const rc_client_event_t *event); + void handleHideAchievementProgress(const rc_client_event_t *event); + void handleUpdateAchievementProgress(const rc_client_event_t *event); + void handleLeaderboardStarted(const rc_client_event_t *event); + void handleLeaderboardFailed(const rc_client_event_t *event); + void handleLeaderboardSubmitted(const rc_client_event_t *event); + void handleShowLeaderboardTracker(const rc_client_event_t *event); + void handleHideLeaderboardTracker(const rc_client_event_t *event); + void handleUpdateLeaderboardTracker(const rc_client_event_t *event); + static void emuEventCallback(Event event, void *arg); + + rc_client_t *rc_client = nullptr; + bool loggedOn = false; + std::atomic_bool loadingGame {}; + bool active = false; + bool paused = false; + std::string lastError; + std::string cachePath; + std::unordered_map cacheMap; + std::mutex cacheMutex; + std::vector> tasks; + std::mutex taskMutex; + std::thread taskThread; + cResetEvent resetEvent; + bool threadRunning = false; +}; + +bool init() { + return Achievements::Instance().init(); +} + +void term() { + Achievements::Instance().term(); +} + +std::future login(const char *username, const char *password) { + return Achievements::Instance().login(username, password); +} + +void logout() { + Achievements::Instance().logout(); +} + +bool isLoggedOn() { + return Achievements::Instance().isLoggedOn(); +} + +bool isActive() { + return Achievements::Instance().isActive(); +} + +Game getCurrentGame() { + return Achievements::Instance().getCurrentGame(); +} + +std::vector getAchievementList() { + return Achievements::Instance().getAchievementList(); +} + +bool canPause() { + return Achievements::Instance().canPause(); +} + +void serialize(Serializer& ser) { + Achievements::Instance().serialize(ser); +} +void deserialize(Deserializer& deser) { + Achievements::Instance().deserialize(deser); +} + +Achievements& Achievements::Instance() { + static Achievements instance; + return instance; +} +// create the instance at start up +OnLoad _([]() { Achievements::Instance(); }); + +Achievements::Achievements() +{ + EventManager::listen(Event::Start, emuEventCallback, this); + EventManager::listen(Event::Terminate, emuEventCallback, this); + EventManager::listen(Event::Pause, emuEventCallback, this); + EventManager::listen(Event::Resume, emuEventCallback, this); + EventManager::listen(Event::DiskChange, emuEventCallback, this); +} + +Achievements::~Achievements() +{ + EventManager::unlisten(Event::Start, emuEventCallback, this); + EventManager::unlisten(Event::Terminate, emuEventCallback, this); + EventManager::unlisten(Event::Pause, emuEventCallback, this); + EventManager::unlisten(Event::Resume, emuEventCallback, this); + EventManager::unlisten(Event::DiskChange, emuEventCallback, this); + term(); +} + +void Achievements::asyncTask(std::function f) +{ + { + std::lock_guard _(taskMutex); + tasks.emplace_back(f); + } + resetEvent.Set(); +} + +void Achievements::startThread() +{ + threadRunning = true; + taskThread = std::thread(&Achievements::backgroundThread, this); +} + +void Achievements::stopThread() +{ + threadRunning = false; + resetEvent.Set(); + if (taskThread.joinable()) + taskThread.join(); +} + +void Achievements::backgroundThread() +{ + ThreadName _("RA-background"); + while (threadRunning) + { + if (!resetEvent.Wait(1000) && active && paused) + rc_client_idle(rc_client); + std::vector> localTasks; + { + std::lock_guard _(taskMutex); + std::swap(tasks, localTasks); + } + for (auto& f : localTasks) + f(); + } +} + +bool Achievements::init() +{ + if (rc_client != nullptr) + return true; + + if (!createClient()) + return false; + + rc_client_set_event_handler(rc_client, clientEventHandler); + rc_client_set_hardcore_enabled(rc_client, 0); + // TODO Expose these settings? + //rc_client_set_encore_mode_enabled(rc_client, 0); + //rc_client_set_unofficial_enabled(rc_client, 0); + //rc_client_set_spectator_mode_enabled(rc_client, 0); + loadCache(); + startThread(); + + if (!config::AchievementsUserName.get().empty() && !config::AchievementsToken.get().empty()) + { + INFO_LOG(COMMON, "RA: Attempting login with user '%s'...", config::AchievementsUserName.get().c_str()); + rc_client_begin_login_with_token(rc_client, config::AchievementsUserName.get().c_str(), + config::AchievementsToken.get().c_str(), clientLoginWithTokenCallback, nullptr); + } + + return true; +} + +bool Achievements::createClient() +{ + http::init(); + rc_client = rc_client_create(clientReadMemory, clientServerCall); + if (rc_client == nullptr) + { + WARN_LOG(COMMON, "Can't create RetroAchievements client"); + return false; + } + +#if !defined(NDEBUG) || defined(DEBUGFAST) + rc_client_enable_logging(rc_client, RC_CLIENT_LOG_LEVEL_VERBOSE, clientMessageCallback); +#else + rc_client_enable_logging(rc_client, RC_CLIENT_LOG_LEVEL_WARN, clientMessageCallback); +#endif + + rc_client_set_userdata(rc_client, this); + + return true; +} + +void Achievements::loadCache() +{ + cachePath = get_writable_data_path("achievements/"); + flycast::mkdir(cachePath.c_str(), 0755); + DIR *dir = flycast::opendir(cachePath.c_str()); + if (dir != nullptr) + { + while (true) + { + dirent *direntry = flycast::readdir(dir); + if (direntry == nullptr) + break; + std::string name = direntry->d_name; + if (name == "." || name == "..") + continue; + std::string s = get_file_basename(name); + u64 v = strtoull(s.c_str(), nullptr, 16); + std::lock_guard _(cacheMutex); + cacheMap[v] = name; + } + flycast::closedir(dir); + } +} + +static u64 hashUrl(const char *url) { + return XXH64(url, strlen(url), 13); +} + +std::pair Achievements::getCachedImage(const char *url) +{ + u64 hash = hashUrl(url); + std::lock_guard _(cacheMutex); + auto it = cacheMap.find(hash); + if (it != cacheMap.end()) { + return std::make_pair(cachePath + it->second, true); + } + else + { + std::stringstream stream; + stream << std::hex << hash << ".png"; + return std::make_pair(cachePath + stream.str(), false); + } +} + +std::string Achievements::getOrDownloadImage(const char *url) +{ + u64 hash = hashUrl(url); + { + std::lock_guard _(cacheMutex); + auto it = cacheMap.find(hash); + if (it != cacheMap.end()) + return cachePath + it->second; + } + std::vector content; + std::string content_type; + int rc = http::get(url, content, content_type); + if (!http::success(rc)) + return {}; + std::stringstream stream; + stream << std::hex << hash << ".png"; + std::string localPath = cachePath + stream.str(); + FILE *f = nowide::fopen(localPath.c_str(), "wb"); + if (f == nullptr) { + WARN_LOG(COMMON, "Can't save image to %s", localPath.c_str()); + return {}; + } + fwrite(content.data(), 1, content.size(), f); + fclose(f); + { + std::lock_guard _(cacheMutex); + cacheMap[hash] = stream.str(); + } + DEBUG_LOG(COMMON, "RA: downloaded %s to %s", url, localPath.c_str()); + return localPath; +} + +void Achievements::term() +{ + if (rc_client == nullptr) + return; + unloadGame(); + stopThread(); + rc_client_destroy(rc_client); + rc_client = nullptr; +} + +void Achievements::authenticationSuccess(const rc_client_user_t *user) +{ + NOTICE_LOG(COMMON, "RA Login successful"); + std::string url(512, '\0'); + int rc = rc_client_user_get_image_url(user, url.data(), url.size()); + if (rc == RC_OK) + { + asyncTask([this, url]() { + std::string image = getOrDownloadImage(url.c_str()); + std::string text = "User " + config::AchievementsUserName.get() + " authenticated"; + notifier.notify(Notification::Login, image, text); + }); + } + loggedOn = true; + if (!settings.content.fileName.empty()) // TODO better test? + loadGame(); +} + +void Achievements::clientLoginWithTokenCallback(int result, const char *error_message, rc_client_t *client, + void *userdata) +{ + Achievements *achievements = (Achievements *)rc_client_get_userdata(client); + if (result != RC_OK) + { + WARN_LOG(COMMON, "RA Login failed: %s", error_message); + notifier.notify(Notification::Login, "", "RetroAchievements authentication failed", error_message); + return; + } + achievements->authenticationSuccess(rc_client_get_user_info(client)); +} + +std::future Achievements::login(const char* username, const char* password) +{ + init(); + std::promise *promise = new std::promise(); + auto future = promise->get_future(); + rc_client_begin_login_with_password(rc_client, username, password, clientLoginWithPasswordCallback, promise); + return future; +} + +void Achievements::clientLoginWithPasswordCallback(int result, const char *error_message, rc_client_t *client, + void *userdata) +{ + Achievements *achievements = (Achievements *)rc_client_get_userdata(client); + std::promise *promise = (std::promise *)userdata; + if (result != RC_OK) + { + std::string errorMsg = rc_error_str(result); + if (error_message != nullptr) + errorMsg += ": " + std::string(error_message); + promise->set_exception(std::make_exception_ptr(FlycastException(errorMsg))); + delete promise; + WARN_LOG(COMMON, "RA Login failed: %s", errorMsg.c_str()); + return; + } + + const rc_client_user_t* user = rc_client_get_user_info(client); + if (!user || !user->token) + { + WARN_LOG(COMMON, "RA: rc_client_get_user_info() returned NULL"); + promise->set_exception(std::make_exception_ptr(FlycastException("No user token returned"))); + delete promise; + return; + } + + // Store token in config + config::AchievementsToken = user->token; + SaveSettings(); + achievements->authenticationSuccess(user); + promise->set_value(); + delete promise; +} + +void Achievements::logout() +{ + unloadGame(); + rc_client_logout(rc_client); + // Reset token in config + config::AchievementsToken = ""; + SaveSettings(); + loggedOn = false; +} + +void Achievements::clientMessageCallback(const char* message, const rc_client_t* client) +{ +#if !defined(NDEBUG) || defined(DEBUGFAST) + DEBUG_LOG(COMMON, "RA: %s", message); +#else + WARN_LOG(COMMON, "RA error: %s", message); +#endif +} + +u32 Achievements::clientReadMemory(u32 address, u8* buffer, u32 num_bytes, rc_client_t* client) +{ + if (address + num_bytes > RAM_SIZE) + return 0; + address += 0x0C000000; + switch (num_bytes) + { + case 1: + *buffer = ReadMem8_nommu(address); + break; + case 2: + *(u16 *)buffer = ReadMem16_nommu(address); + break; + case 4: + *(u32 *)buffer = ReadMem32_nommu(address); + break; + default: + return 0; + } + return num_bytes; +} + +void Achievements::clientServerCall(const rc_api_request_t *request, rc_client_server_callback_t callback, + void *callback_data, rc_client_t *client) +{ + Achievements *achievements = (Achievements *)rc_client_get_userdata(client); + std::string url {request->url}; + std::string payload; + if (request->post_data != nullptr) + payload = request->post_data; + std::string contentType; + if (request->content_type != nullptr) + contentType = request->content_type; + achievements->asyncTask([url, contentType, payload, callback, callback_data]() { + int rc; + std::vector reply; + if (!payload.empty()) + rc = http::post(url, payload.c_str(), contentType.empty() ? nullptr : contentType.c_str(), reply); + else + rc = http::get(url, reply); + rc_api_server_response_t rr; + rr.http_status_code = rc; // TODO RC_API_SERVER_RESPONSE_RETRYABLE_CLIENT_ERROR if connection fails? + rr.body_length = reply.size(); + rr.body = (const char *)reply.data(); + callback(&rr, callback_data); + }); +} + +static void handleServerError(const rc_client_server_error_t* error) +{ + WARN_LOG(COMMON, "RA server error: %s - %s", error->api, error->error_message); + notifier.notify(Notification::Error, "", error->api, error->error_message); +} + +static void notifyError(const std::string& msg) +{ + WARN_LOG(COMMON, "RA error: %s", msg.c_str()); + notifier.notify(Notification::Error, "", msg); +} + +void Achievements::clientEventHandler(const rc_client_event_t* event, rc_client_t* client) +{ + Achievements *achievements = (Achievements *)rc_client_get_userdata(client); + switch (event->type) + { + case RC_CLIENT_EVENT_RESET: + achievements->handleResetEvent(event); + break; + + case RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED: + achievements->handleUnlockEvent(event); + break; + + case RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_SHOW: + achievements->handleAchievementChallengeIndicatorShowEvent(event); + break; + + case RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_HIDE: + achievements->handleAchievementChallengeIndicatorHideEvent(event); + break; + + case RC_CLIENT_EVENT_GAME_COMPLETED: + achievements->handleGameCompleted(event); + break; + + case RC_CLIENT_EVENT_SERVER_ERROR: + handleServerError(event->server_error); + break; + + case RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_SHOW: + achievements->handleShowAchievementProgress(event); + break; + case RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE: + achievements->handleHideAchievementProgress(event); + break; + case RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_UPDATE: + achievements->handleUpdateAchievementProgress(event); + break; + + case RC_CLIENT_EVENT_LEADERBOARD_STARTED: + achievements->handleLeaderboardStarted(event); + break; + case RC_CLIENT_EVENT_LEADERBOARD_FAILED: + achievements->handleLeaderboardFailed(event); + break; + case RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED: + achievements->handleLeaderboardSubmitted(event); + break; + case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW: + achievements->handleShowLeaderboardTracker(event); + break; + case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE: + achievements->handleHideLeaderboardTracker(event); + break; + case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE: + achievements->handleUpdateLeaderboardTracker(event); + break; +// TODO case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD: + + case RC_CLIENT_EVENT_DISCONNECTED: + notifyError("RetroAchievements disconnected"); + break; + + case RC_CLIENT_EVENT_RECONNECTED: + notifyError("RetroAchievements reconnected"); + break; + + default: + WARN_LOG(COMMON, "RA: Unhandled event: %u", event->type); + break; + } +} + +void Achievements::handleResetEvent(const rc_client_event_t *event) +{ + // This never seems to be called, probably because hardcore mode is enabled before starting the game. + INFO_LOG(COMMON, "RA: Resetting runtime due to reset event"); + rc_client_reset(rc_client); +} + +void Achievements::handleUnlockEvent(const rc_client_event_t *event) +{ + const rc_client_achievement_t* cheevo = event->achievement; + assert(cheevo != nullptr); + + INFO_LOG(COMMON, "RA: Achievement %s (%u) for game %s unlocked", cheevo->title, cheevo->id, settings.content.title.c_str()); + std::string title(cheevo->title); + std::string description(cheevo->description); + std::string url(512, '\0'); + int rc = rc_client_achievement_get_image_url(cheevo, cheevo->state, url.data(), url.size()); + if (rc == RC_OK) + { + asyncTask([this, url, title, description]() { + std::string image = getOrDownloadImage(url.c_str()); + std::string text = "Achievement " + title + " unlocked!"; + notifier.notify(Notification::Login, image, text, description); + }); + } +} + +void Achievements::handleAchievementChallengeIndicatorShowEvent(const rc_client_event_t *event) +{ + const rc_client_achievement_t* cheevo = event->achievement; + INFO_LOG(COMMON, "RA: Challenge: %s", cheevo->title); + std::string url(512, '\0'); + int rc = rc_client_achievement_get_image_url(cheevo, RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED, url.data(), url.size()); + if (rc == RC_OK) + { + asyncTask([this, url]() { + std::string image = getOrDownloadImage(url.c_str()); + notifier.showChallenge(image); + }); + } +} + +void Achievements::handleAchievementChallengeIndicatorHideEvent(const rc_client_event_t *event) +{ + const rc_client_achievement_t* cheevo = event->achievement; + INFO_LOG(COMMON, "RA: Challenge hidden: %s", cheevo->title); + std::string url(512, '\0'); + int rc = rc_client_achievement_get_image_url(cheevo, RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED, url.data(), url.size()); + if (rc == RC_OK) + { + asyncTask([this, url]() { + std::string image = getOrDownloadImage(url.c_str()); + notifier.hideChallenge(image); + }); + } +} + +void Achievements::handleLeaderboardStarted(const rc_client_event_t *event) +{ + const rc_client_leaderboard_t *leaderboard = event->leaderboard; + INFO_LOG(COMMON, "RA: Leaderboard started: %s", leaderboard->title); + std::string text = "Leaderboard " + std::string(leaderboard->title) + " started"; + notifier.notify(Notification::Unlocked, "", text, leaderboard->description); +} +void Achievements::handleLeaderboardFailed(const rc_client_event_t *event) +{ + const rc_client_leaderboard_t *leaderboard = event->leaderboard; + INFO_LOG(COMMON, "RA: Leaderboard failed: %s", leaderboard->title); + std::string text = "Leaderboard " + std::string(leaderboard->title) + " failed"; + notifier.notify(Notification::Unlocked, "", text, leaderboard->description); +} +void Achievements::handleLeaderboardSubmitted(const rc_client_event_t *event) +{ + const rc_client_leaderboard_t *leaderboard = event->leaderboard; + INFO_LOG(COMMON, "RA: Leaderboard submitted: %s", leaderboard->title); + std::string text = "Leaderboard " + std::string(leaderboard->title) + " submitted"; + notifier.notify(Notification::Unlocked, "", text, leaderboard->description); +} +void Achievements::handleShowLeaderboardTracker(const rc_client_event_t *event) +{ + const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker; + DEBUG_LOG(COMMON, "RA: Show leaderboard[%d]: %s", leaderboard->id, leaderboard->display); + notifier.showLeaderboard(leaderboard->id, leaderboard->display); +} +void Achievements::handleHideLeaderboardTracker(const rc_client_event_t *event) +{ + const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker; + DEBUG_LOG(COMMON, "RA: Hide leaderboard[%d]: %s", leaderboard->id, leaderboard->display); + notifier.hideLeaderboard(leaderboard->id); +} +void Achievements::handleUpdateLeaderboardTracker(const rc_client_event_t *event) +{ + const rc_client_leaderboard_tracker_t *leaderboard = event->leaderboard_tracker; + DEBUG_LOG(COMMON, "RA: Update leaderboard[%d]: %s", leaderboard->id, leaderboard->display); + notifier.showLeaderboard(leaderboard->id, leaderboard->display); +} + +void Achievements::handleGameCompleted(const rc_client_event_t *event) +{ + const rc_client_game_t* game = rc_client_get_game_info(rc_client); + std::string text1 = (rc_client_get_hardcore_enabled(rc_client) ? "Mastered " : "Completed ") + std::string(game->title); + rc_client_user_game_summary_t summary; + rc_client_get_user_game_summary(rc_client, &summary); + std::stringstream ss; + ss << summary.num_unlocked_achievements << " achievements, " << summary.points_unlocked << " points"; + std::string text2(ss.str()); + std::string text3 = rc_client_get_user_info(rc_client)->display_name; + std::string url(512, '\0'); + if (rc_client_game_get_image_url(game, url.data(), url.size()) != RC_OK) + url.clear(); + asyncTask([this, url, text1, text2, text3]() { + std::string image; + if (!url.empty()) + image = getOrDownloadImage(url.c_str()); + notifier.notify(Notification::Mastery, image, text1, text2, text3); + }); +} + +void Achievements::handleShowAchievementProgress(const rc_client_event_t *event) +{ + handleUpdateAchievementProgress(event); +} +void Achievements::handleHideAchievementProgress(const rc_client_event_t *event) +{ + notifier.notify(Notification::Progress, "", ""); +} +void Achievements::handleUpdateAchievementProgress(const rc_client_event_t *event) +{ + const rc_client_achievement_t* cheevo = event->achievement; + std::string url(512, '\0'); + if (rc_client_achievement_get_image_url(cheevo, RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE, url.data(), url.size()) != RC_OK) + url.clear(); + std::string progress(cheevo->measured_progress); + asyncTask([this, url, progress]() { + std::string image; + if (!url.empty()) + image = getOrDownloadImage(url.c_str()); + notifier.notify(Notification::Progress, image, progress); + }); +} + +static Disc *hashDisk; +static bool add150; + +static void *cdreader_open_track(const char* path, u32 track) +{ + DEBUG_LOG(COMMON, "RA: cdreader_open_track %s track %d", path, track); + if (track == RC_HASH_CDTRACK_FIRST_DATA) + { + for (const Track& track : hashDisk->tracks) + if (track.isDataTrack()) + return const_cast(&track); + return nullptr; + } + if (track <= hashDisk->tracks.size()) + return const_cast(&hashDisk->tracks[track - 1]); + else + return nullptr; +} + +static size_t cdreader_read_sector(void* track_handle, u32 sector, void* buffer, size_t requested_bytes) +{ + if (requested_bytes == 2048) + // add 150 sectors to FAD corresponding to files + // FIXME get rid of this + add150 = true; + //DEBUG_LOG(COMMON, "RA: cdreader_read_sector track %p sec %d+%d num %zd", track_handle, sector, add150 ? 150 : 0, requested_bytes); + if (add150) + sector += 150; + u8 locbuf[2048]; + hashDisk->ReadSectors(sector, 1, locbuf, 2048); + requested_bytes = std::min(requested_bytes, 2048); + memcpy(buffer, locbuf, requested_bytes); + + return requested_bytes; +} + +static void cdreader_close_track(void* track_handle) +{ +} + +static u32 cdreader_first_track_sector(void* track_handle) +{ + Track& track = *static_cast(track_handle); + DEBUG_LOG(COMMON, "RA: cdreader_first_track_sector track %p -> %d", track_handle, track.StartFAD); + return track.StartFAD; +} + +std::string Achievements::getGameHash() +{ + if (settings.platform.isConsole()) + { + if (!gdr::isLoaded()) + return {}; + // Reopen the disk locally to avoid threading issues (CHD) + try { + hashDisk = OpenDisc(settings.content.path); + } catch (const FlycastException& e) { + return {}; + } + add150 = false; + rc_hash_cdreader hooks = { + cdreader_open_track, + cdreader_read_sector, + cdreader_close_track, + cdreader_first_track_sector + }; + rc_hash_init_custom_cdreader(&hooks); + rc_hash_init_error_message_callback([](const char *msg) { + WARN_LOG(COMMON, "cdreader: %s", msg); + }); +#if !defined(NDEBUG) || defined(DEBUGFAST) + rc_hash_init_verbose_message_callback([](const char *msg) { + DEBUG_LOG(COMMON, "cdreader: %s", msg); + }); +#endif + } + char hash[33] {}; + rc_hash_generate_from_file(hash, settings.platform.isConsole() ? RC_CONSOLE_DREAMCAST : RC_CONSOLE_ARCADE, + settings.content.fileName.c_str()); // fileName is only used for arcade + delete hashDisk; + hashDisk = nullptr; + + return hash; +} + +void Achievements::pauseGame() { + paused = true; +} + +void Achievements::resumeGame() +{ + paused = false; + if (config::EnableAchievements && !settings.naomi.slave) + { + loadGame(); + if (settings.raHardcoreMode && !config::AchievementsHardcoreMode) + { + settings.raHardcoreMode = false; + rc_client_set_hardcore_enabled(rc_client, 0); + } + } + else + term(); +} + +void Achievements::emuEventCallback(Event event, void *arg) +{ + Achievements *instance = ((Achievements *)arg); + switch (event) + { + case Event::Start: + case Event::Resume: + instance->resumeGame(); + break; + case Event::Terminate: + instance->unloadGame(); + break; + case Event::VBlank: + rc_client_do_frame(instance->rc_client); + break; + case Event::Pause: + instance->pauseGame(); + break; + case Event::DiskChange: + instance->diskChange(); + break; + default: + break; + } +} + +void Achievements::loadGame() +{ + if (loadingGame.exchange(true)) + // already loading + return; + if (active) + { + // already loaded + loadingGame = false; + return; + } + if (!init() || !isLoggedOn()) { + if (!isLoggedOn()) + INFO_LOG(COMMON, "Not logged on. Not loading game yet"); + loadingGame = false; + return; + } + std::string gameHash = getGameHash(); + if (!gameHash.empty()) + { + // settings.raHardcoreMode is set before enabling cheats and loading the initial savestate + rc_client_set_hardcore_enabled(rc_client, settings.raHardcoreMode); + rc_client_begin_load_game(rc_client, gameHash.c_str(), [](int result, const char *error_message, rc_client_t *client, void *userdata) { + ((Achievements *)userdata)->gameLoaded(result, error_message); + }, this); + } + else { + INFO_LOG(COMMON, "RA: empty hash. Aborting load"); + loadingGame = false; + settings.raHardcoreMode = false; + } +} + +void Achievements::gameLoaded(int result, const char *errorMessage) +{ + if (result != RC_OK) + { + if (result == RC_NO_GAME_LOADED) + // Unknown game. + INFO_LOG(COMMON, "RA: Unknown game, disabling achievements."); + else if (result == RC_LOGIN_REQUIRED) { + // We would've asked to re-authenticate, so leave HC on for now. + // Once we've done so, we'll reload the game. + } + else + WARN_LOG(COMMON, "RA Loading game failed: %s", errorMessage); + settings.raHardcoreMode = false; + loadingGame = false; + return; + } + const rc_client_game_t* info = rc_client_get_game_info(rc_client); + if (info == nullptr) + { + WARN_LOG(COMMON, "RA: rc_client_get_game_info() returned NULL"); + settings.raHardcoreMode = false; + loadingGame = false; + return; + } + active = true; + loadingGame = false; + EventManager::listen(Event::VBlank, emuEventCallback, this); + NOTICE_LOG(COMMON, "RA: game %d loaded: %s, achievements %d leaderboards %d rich presence %d", info->id, info->title, + rc_client_has_achievements(rc_client), rc_client_has_leaderboards(rc_client), rc_client_has_rich_presence(rc_client)); + if (!rc_client_is_processing_required(rc_client)) + settings.raHardcoreMode = false; + else + settings.raHardcoreMode = (bool)rc_client_get_hardcore_enabled(rc_client); + std::string url(512, '\0'); + if (rc_client_game_get_image_url(info, url.data(), url.size()) != RC_OK) + url.clear(); + std::string text1(info->title); + rc_client_user_game_summary_t summary; + rc_client_get_user_game_summary(rc_client, &summary); + std::string text2; + if (summary.num_core_achievements > 0) + text2 = "You have " + std::to_string(summary.num_unlocked_achievements) + + " of " + std::to_string(summary.num_core_achievements) + " achievements unlocked."; + else + text2 = "This game has no achievements."; + asyncTask([this, url, text1, text2]() { + std::string image; + if (!url.empty()) + image = getOrDownloadImage(url.c_str()); + std::string text3 = settings.raHardcoreMode ? "Hardcore Mode" : ""; + notifier.notify(Notification::Login, image, text1, text2, text3); + }); +} + +void Achievements::unloadGame() +{ + if (!active) + return; + active = false; + paused = false; + EventManager::unlisten(Event::VBlank, emuEventCallback, this); + // wait for all async tasks before unloading the game + stopThread(); + startThread(); + rc_client_unload_game(rc_client); + settings.raHardcoreMode = false; +} + +void Achievements::diskChange() +{ + if (!active || settings.content.path.empty()) + // Don't unload the game when the lid is open while swapping disks + return; + std::string hash = getGameHash(); + if (hash == "") { + unloadGame(); + return; + } + rc_client_begin_change_media_from_hash(rc_client, hash.c_str(), [](int result, const char *errorMessage, rc_client_t *client, void *userdata) { + if (result == RC_HARDCORE_DISABLED) { + settings.raHardcoreMode = false; + notifier.notify(Notification::Login, "", "Hardcore mode disabled", "Unrecognized media inserted"); + } + else if (result != RC_OK) + { + settings.raHardcoreMode = false; + if (errorMessage == nullptr) + errorMessage = rc_error_str(result); + notifier.notify(Notification::Login, "", "Media change failed", errorMessage); + } + }, this); +} + +Game Achievements::getCurrentGame() +{ + if (!active) + return Game{}; + const rc_client_game_t *info = rc_client_get_game_info(rc_client); + if (info == nullptr) + return Game{}; + char url[128]; + std::string image; + if (rc_client_game_get_image_url(info, url, sizeof(url)) == RC_OK) + { + bool cached; + std::tie(image, cached) = getCachedImage(url); + if (!cached) { + std::string surl = url; + asyncTask([this, surl]() { getOrDownloadImage(surl.c_str()); }); + } + } + rc_client_user_game_summary_t summary; + rc_client_get_user_game_summary(rc_client, &summary); + + return Game{ image, info->title, summary.num_unlocked_achievements, summary.num_core_achievements, summary.points_unlocked, summary.points_core }; +} + +std::vector Achievements::getAchievementList() +{ + std::vector achievements; + rc_client_achievement_list_t *list = rc_client_create_achievement_list(rc_client, + RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL, + RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS); + std::vector uncachedImages; + for (u32 i = 0; i < list->num_buckets; i++) + { + const char *label = list->buckets[i].label; + for (u32 j = 0; j < list->buckets[i].num_achievements; j++) + { + const rc_client_achievement_t *achievement = list->buckets[i].achievements[j]; + char url[128]; + std::string image; + if (rc_client_achievement_get_image_url(achievement, achievement->state, url, sizeof(url)) == RC_OK) + { + bool cached; + std::tie(image, cached) = getCachedImage(url); + if (!cached) + uncachedImages.push_back(url); + } + std::string status; + if (achievement->measured_percent) + status = achievement->measured_progress; + achievements.emplace_back(image, achievement->title, achievement->description, label, status); + } + } + rc_client_destroy_achievement_list(list); + if (!uncachedImages.empty()) + asyncTask([this, uncachedImages]() { + for (const std::string& url : uncachedImages) + getOrDownloadImage(url.c_str()); + }); + + return achievements; +} + +bool Achievements::canPause() +{ + if (!active) + return true; + u32 frames; + int rc = rc_client_can_pause(rc_client, &frames); + if (rc == 0) + DEBUG_LOG(COMMON, "Pause allowed in %d frames", frames); + return (bool)rc; +} + +void Achievements::serialize(Serializer& ser) +{ + u32 size = (u32)rc_client_progress_size(rc_client); + if (size > 0) + { + u8 *buffer = new u8[size]; + if (rc_client_serialize_progress(rc_client, buffer) != RC_OK) + size = 0; + ser << size; + ser.serialize(buffer, size); + delete[] buffer; + } + else { + ser << size; + } +} +void Achievements::deserialize(Deserializer& deser) +{ + if (deser.version() < Deserializer::V50) { + rc_client_deserialize_progress(rc_client, nullptr); + } + else { + u32 size; + deser >> size; + if (size > 0) + { + u8 *buffer = new u8[size]; + deser.deserialize(buffer, size); + rc_client_deserialize_progress(rc_client, buffer); + delete[] buffer; + } + else { + rc_client_deserialize_progress(rc_client, nullptr); + } + } +} + +} // namespace achievements + +#else // !USE_RACHIEVEMENTS + +namespace achievements +{ + +// Maintain savestate compatiblity with RA-enabled builds +void serialize(Serializer& ser) +{ + u32 size = 0; + ser << size; +} + +void deserialize(Deserializer& deser) +{ + if (deser.version() >= Deserializer::V50) + { + u32 size; + deser >> size; + deser.skip(size); + } +} + +} +#endif diff --git a/core/achievements/achievements.h b/core/achievements/achievements.h new file mode 100644 index 000000000..00b720f43 --- /dev/null +++ b/core/achievements/achievements.h @@ -0,0 +1,72 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#include "types.h" +#include +#include + +namespace achievements +{ +#ifdef USE_RACHIEVEMENTS + +struct Game +{ + std::string image; + std::string title; + u32 unlockedAchievements; + u32 totalAchievements; + u32 points; + u32 totalPoints; +}; + +struct Achievement +{ + Achievement() = default; + Achievement(const std::string& image, const std::string& title, const std::string& description, const std::string& category, const std::string& status) + : image(image), title(title), description(description), category(category), status(status) {} + std::string image; + std::string title; + std::string description; + std::string category; + std::string status; +}; + +bool init(); +void term(); +std::future login(const char *username, const char *password); +void logout(); +bool isLoggedOn(); +bool isActive(); +Game getCurrentGame(); +std::vector getAchievementList(); +bool canPause(); + +#else + +static inline bool isActive() { + return false; +} +static inline bool canPause() { + return true; +} + +#endif + +void serialize(Serializer& ser); +void deserialize(Deserializer& deser); + +} diff --git a/core/archive/7zArchive.h b/core/archive/7zArchive.h index d15f459d3..cade6de3b 100644 --- a/core/archive/7zArchive.h +++ b/core/archive/7zArchive.h @@ -55,16 +55,21 @@ class SzArchive : public Archive class SzArchiveFile : public ArchiveFile { public: - SzArchiveFile(u8 *data, u32 offset, u32 length) : data(data), offset(offset), length(length) {} + SzArchiveFile(u8 *data, u32 offset, u32 length) + : data(data), offset(offset), _length(length) {} u32 Read(void *buffer, u32 length) override { - length = std::min(length, this->length); + length = std::min(length, this->_length); memcpy(buffer, data + offset, length); return length; } + size_t length() override { + return _length; + } + private: u8 *data; u32 offset; - u32 length; + u32 _length; }; diff --git a/core/archive/ZipArchive.cpp b/core/archive/ZipArchive.cpp index fe24b3420..ef10710f2 100644 --- a/core/archive/ZipArchive.cpp +++ b/core/archive/ZipArchive.cpp @@ -34,7 +34,7 @@ bool ZipArchive::Open(FILE *file) std::fclose(file); return false; } - zip = zip_open_from_source(source, 0, NULL); + zip = zip_open_from_source(source, 0, nullptr); if (zip == nullptr) zip_source_free(source); return zip != nullptr; @@ -42,43 +42,42 @@ bool ZipArchive::Open(FILE *file) ArchiveFile* ZipArchive::OpenFile(const char* name) { - zip_file *zip_file = zip_fopen(zip, name, 0); - if (zip_file == NULL) - return NULL; - - return new ZipArchiveFile(zip_file); + zip_file_t *zip_file = zip_fopen(zip, name, 0); + if (zip_file == nullptr) + return nullptr; + zip_stat_t stat; + zip_stat(zip, name, 0, &stat); + return new ZipArchiveFile(zip_file, stat.size, stat.name); } -struct zip_file *zip_fopen_by_crc(struct zip *za, u32 crc, int flags) +static zip_file *zip_fopen_by_crc(zip_t *za, u32 crc, int flags, zip_uint64_t& index) { - int i, n; - struct zip_stat stat; - - if (crc == 0) { - return NULL; - } - - n = zip_get_num_files(za); - for (i = 0; i < n; i++) { - if (zip_stat_index(za, i, flags, &stat) < -1) { - return NULL; - } + if (crc == 0) + return nullptr; - if (stat.crc == crc) { - return zip_fopen_index(za, i, flags); - } - } + zip_int64_t n = zip_get_num_entries(za, 0); + for (index = 0; index < (zip_uint64_t)n; index++) + { + zip_stat_t stat; + if (zip_stat_index(za, index, flags, &stat) < -1) + return nullptr; + if (stat.crc == crc) + return zip_fopen_index(za, index, flags); + } - return NULL; + return nullptr; } ArchiveFile* ZipArchive::OpenFileByCrc(u32 crc) { - zip_file *zip_file = zip_fopen_by_crc(zip, crc, 0); - if (zip_file == NULL) - return NULL; + zip_uint64_t index; + zip_file_t *zip_file = zip_fopen_by_crc(zip, crc, 0, index); + if (zip_file == nullptr) + return nullptr; + zip_stat_t stat; + zip_stat_index(zip, index, 0, &stat); - return new ZipArchiveFile(zip_file); + return new ZipArchiveFile(zip_file, stat.size, stat.name); } u32 ZipArchiveFile::Read(void* buffer, u32 length) @@ -92,7 +91,7 @@ bool ZipArchive::Open(const void *data, size_t size) zip_source_t *source = zip_source_buffer_create(data, size, 0, &error); if (source == nullptr) return false; - zip = zip_open_from_source(source, 0, NULL); + zip = zip_open_from_source(source, 0, nullptr); if (zip == nullptr) zip_source_free(source); return zip != nullptr; @@ -100,8 +99,20 @@ bool ZipArchive::Open(const void *data, size_t size) ArchiveFile *ZipArchive::OpenFirstFile() { - zip_file *zipFile = zip_fopen_index(zip, 0, 0); + zip_file_t *zipFile = zip_fopen_index(zip, 0, 0); + if (zipFile == nullptr) + return nullptr; + zip_stat_t stat; + zip_stat_index(zip, 0, 0, &stat); + return new ZipArchiveFile(zipFile, stat.size, stat.name); +} + +ArchiveFile *ZipArchive::OpenFileByIndex(size_t index) +{ + zip_file_t *zipFile = zip_fopen_index(zip, index, 0); if (zipFile == nullptr) return nullptr; - return new ZipArchiveFile(zipFile); + zip_stat_t stat; + zip_stat_index(zip, index, 0, &stat); + return new ZipArchiveFile(zipFile, stat.size, stat.name); } diff --git a/core/archive/ZipArchive.h b/core/archive/ZipArchive.h index efa177e00..8b475ab78 100644 --- a/core/archive/ZipArchive.h +++ b/core/archive/ZipArchive.h @@ -26,29 +26,39 @@ class ZipArchive : public Archive { public: - ZipArchive() : zip(NULL) {} ~ZipArchive() override; ArchiveFile* OpenFile(const char* name) override; ArchiveFile* OpenFileByCrc(u32 crc) override; + bool Open(FILE *file) override; bool Open(const void *data, size_t size); - ArchiveFile *OpenFirstFile(); -protected: - bool Open(FILE *file) override; + ArchiveFile *OpenFirstFile(); + ArchiveFile *OpenFileByIndex(size_t index); private: - struct zip *zip; + zip_t *zip = nullptr; }; class ZipArchiveFile : public ArchiveFile { public: - ZipArchiveFile(struct zip_file *zip_file) : zip_file(zip_file) {} - ~ZipArchiveFile() override { zip_fclose(zip_file); } + ZipArchiveFile(zip_file_t *zip_file, size_t length, const char *name) + : zip_file(zip_file), _length(length), name(name) {} + ~ZipArchiveFile() override { + zip_fclose(zip_file); + } u32 Read(void* buffer, u32 length) override; + size_t length() override { + return _length; + } + const char *getName() override { + return name; + } private: - struct zip_file *zip_file; + zip_file_t *zip_file; + size_t _length; + const char *name; }; diff --git a/core/archive/archive.cpp b/core/archive/archive.cpp index 69f255ae1..53db47fa3 100644 --- a/core/archive/archive.cpp +++ b/core/archive/archive.cpp @@ -26,7 +26,14 @@ Archive *OpenArchive(const std::string& path) { - FILE *file = hostfs::storage().openFile(path, "rb"); + FILE *file = nullptr; + hostfs::FileInfo fileInfo; + try { + fileInfo = hostfs::storage().getFileInfo(path); + if (!fileInfo.isDirectory) + file = hostfs::storage().openFile(path, "rb"); + } catch (const hostfs::StorageException& e) { + } if (file == nullptr) { file = hostfs::storage().openFile(path + ".7z", "rb"); @@ -39,8 +46,14 @@ Archive *OpenArchive(const std::string& path) if (sz_archive->Open(file)) return sz_archive; delete sz_archive; + file = nullptr; + } + // Retry as a zip file + try { + if (!fileInfo.isDirectory) + file = hostfs::storage().openFile(path, "rb"); + } catch (const hostfs::StorageException& e) { } - file = hostfs::storage().openFile(path, "rb"); if (file == nullptr) { file = hostfs::storage().openFile(path + ".zip", "rb"); diff --git a/core/archive/archive.h b/core/archive/archive.h index 462b16c11..49e925e0c 100644 --- a/core/archive/archive.h +++ b/core/archive/archive.h @@ -27,6 +27,8 @@ class ArchiveFile public: virtual ~ArchiveFile() = default; virtual u32 Read(void *buffer, u32 length) = 0; + virtual size_t length() = 0; + virtual const char *getName() { return nullptr; } }; class Archive diff --git a/core/archive/rzip.cpp b/core/archive/rzip.cpp index 92d1d0f91..9a965e8f5 100644 --- a/core/archive/rzip.cpp +++ b/core/archive/rzip.cpp @@ -23,14 +23,11 @@ const u8 RZipHeader[8] = { '#', 'R', 'Z', 'I', 'P', 'v', 1, '#' }; -bool RZipFile::Open(const std::string& path, bool write) +bool RZipFile::Open(FILE *file, bool write) { - verify(file == nullptr); - this->write = write; - - file = nowide::fopen(path.c_str(), write ? "wb" : "rb"); - if (file == nullptr) - return false; + verify(this->file == nullptr); + verify(file != nullptr); + startOffset = std::ftell(file); if (!write) { u8 header[sizeof(RZipHeader)]; @@ -39,7 +36,7 @@ bool RZipFile::Open(const std::string& path, bool write) || std::fread(&maxChunkSize, sizeof(maxChunkSize), 1, file) != 1 || std::fread(&size, sizeof(size), 1, file) != 1) { - Close(); + std::fseek(file, startOffset, SEEK_SET); return false; } // savestates created on 32-bit platforms used to have a 32-bit size @@ -54,16 +51,29 @@ bool RZipFile::Open(const std::string& path, bool write) } else { - maxChunkSize = 1024 * 1024; + maxChunkSize = 1_MB; if (std::fwrite(RZipHeader, sizeof(RZipHeader), 1, file) != 1 || std::fwrite(&maxChunkSize, sizeof(maxChunkSize), 1, file) != 1 || std::fwrite(&size, sizeof(size), 1, file) != 1) { - Close(); + std::fseek(file, startOffset, SEEK_SET); return false; } } + this->write = write; + this->file = file; + return true; +} +bool RZipFile::Open(const std::string& path, bool write) +{ + FILE *f = nowide::fopen(path.c_str(), write ? "wb" : "rb"); + if (f == nullptr) + return false; + if (!Open(f, write)) { + Close(); + return false; + } return true; } @@ -73,7 +83,7 @@ void RZipFile::Close() { if (write) { - std::fseek(file, sizeof(RZipHeader) + sizeof(maxChunkSize), SEEK_SET); + std::fseek(file, startOffset + sizeof(RZipHeader) + sizeof(maxChunkSize), SEEK_SET); std::fwrite(&size, sizeof(size), 1, file); } std::fclose(file); diff --git a/core/archive/rzip.h b/core/archive/rzip.h index 6d2dc287f..0d0edf9a4 100644 --- a/core/archive/rzip.h +++ b/core/archive/rzip.h @@ -28,6 +28,7 @@ class RZipFile ~RZipFile() { Close(); } bool Open(const std::string& path, bool write); + bool Open(FILE *file, bool write); void Close(); size_t Size() const { return size; } size_t Read(void *data, size_t length); @@ -42,4 +43,5 @@ class RZipFile u32 chunkSize = 0; u32 chunkIndex = 0; bool write = false; + long startOffset = 0; }; diff --git a/core/oslib/audiobackend_alsa.cpp b/core/audio/audiobackend_alsa.cpp similarity index 100% rename from core/oslib/audiobackend_alsa.cpp rename to core/audio/audiobackend_alsa.cpp diff --git a/core/oslib/audiobackend_coreaudio.cpp b/core/audio/audiobackend_coreaudio.cpp similarity index 100% rename from core/oslib/audiobackend_coreaudio.cpp rename to core/audio/audiobackend_coreaudio.cpp diff --git a/core/oslib/audiobackend_directsound.cpp b/core/audio/audiobackend_directsound.cpp similarity index 99% rename from core/oslib/audiobackend_directsound.cpp rename to core/audio/audiobackend_directsound.cpp index ae81884b7..726f785e0 100644 --- a/core/oslib/audiobackend_directsound.cpp +++ b/core/audio/audiobackend_directsound.cpp @@ -9,6 +9,7 @@ #include #include "stdclass.h" #include "windows/comptr.h" +#include "oslib/oslib.h" HWND getNativeHwnd(); #define verifyc(x) verify(!FAILED(x)) @@ -46,6 +47,7 @@ class DirectSoundBackend : public AudioBackend void audioThreadMain() { + ThreadName _("FlyDirectSound"); audioThreadRunning = true; while (true) { diff --git a/core/oslib/audiobackend_libao.cpp b/core/audio/audiobackend_libao.cpp similarity index 100% rename from core/oslib/audiobackend_libao.cpp rename to core/audio/audiobackend_libao.cpp diff --git a/core/oslib/audiobackend_null.cpp b/core/audio/audiobackend_null.cpp similarity index 64% rename from core/oslib/audiobackend_null.cpp rename to core/audio/audiobackend_null.cpp index 67c935a7b..95a6b5647 100644 --- a/core/oslib/audiobackend_null.cpp +++ b/core/audio/audiobackend_null.cpp @@ -19,17 +19,20 @@ class NullAudioBackend : public AudioBackend u32 push(const void* frame, u32 samples, bool wait) override { - if (wait) + if (wait && last_time.time_since_epoch() != the_clock::duration::zero()) { - if (last_time.time_since_epoch() != the_clock::duration::zero()) - { - auto fduration = std::chrono::nanoseconds(1000000000L * samples / 44100); - auto duration = fduration - (the_clock::now() - last_time); + auto fduration = std::chrono::nanoseconds(1'000'000'000LL * samples / 44100); + auto duration = fduration - (the_clock::now() - last_time); + if (duration > std::chrono::nanoseconds::zero()) std::this_thread::sleep_for(duration); - last_time += fduration; - } - else + if (duration < -std::chrono::milliseconds(67)) + // if ~4 frames ahead, reset time (fast forward detection) last_time = the_clock::now(); + else + last_time += fduration; + } + else { + last_time = the_clock::now(); } return 1; } diff --git a/core/oslib/audiobackend_oboe.cpp b/core/audio/audiobackend_oboe.cpp similarity index 97% rename from core/oslib/audiobackend_oboe.cpp rename to core/audio/audiobackend_oboe.cpp index 08bc6e2d6..9bf7609c5 100644 --- a/core/oslib/audiobackend_oboe.cpp +++ b/core/audio/audiobackend_oboe.cpp @@ -91,6 +91,7 @@ class OboeBackend : AudioBackend ->setFormat(oboe::AudioFormat::I16) ->setChannelCount(oboe::ChannelCount::Stereo) ->setSampleRate(44100) + ->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::High) ->setFramesPerCallback(SAMPLE_COUNT) ->setDataCallback(&audioCallback) ->setErrorCallback(&errorCallback) @@ -175,7 +176,7 @@ class OboeBackend : AudioBackend } recordStream->requestStart(); NOTICE_LOG(AUDIO, "Oboe recorder started. stream capacity: %d frames", - stream->getBufferCapacityInFrames()); + recordStream->getBufferCapacityInFrames()); return true; } diff --git a/core/oslib/audiobackend_omx.cpp b/core/audio/audiobackend_omx.cpp similarity index 100% rename from core/oslib/audiobackend_omx.cpp rename to core/audio/audiobackend_omx.cpp diff --git a/core/audio/audiobackend_oss.cpp b/core/audio/audiobackend_oss.cpp new file mode 100644 index 000000000..f724dcea8 --- /dev/null +++ b/core/audio/audiobackend_oss.cpp @@ -0,0 +1,151 @@ +#ifdef USE_OSS +#include "audiostream.h" +#include +#include +#include +#include + +class OSSAudioBackend : public AudioBackend +{ + int audioFD = -1; + int recordFD = -1; + + static int openDevice(int flags) + { + const char* path = "/dev/dsp"; + int fd = open(path, flags); + + if (fd < 0) + ERROR_LOG(AUDIO, "OSS: open(%s) failed: %s", path, strerror(errno)); + + return fd; + } + + static bool setRate(int fd, int rate) + { + int tmp = rate; + + if (ioctl(fd, SNDCTL_DSP_SPEED, &tmp) < 0) + { + ERROR_LOG(AUDIO, "OSS: ioctl(SNDCTL_DSP_SPEED) failed: %s", strerror(errno)); + return false; + } + + if (tmp != rate) + { + ERROR_LOG(AUDIO, "OSS: sample rate unsupported: %d => %d", rate, tmp); + return false; + } + + return true; + } + + static bool setChannels(int fd, int channels) + { + int tmp = channels; + + if (ioctl(fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) + { + ERROR_LOG(AUDIO, "OSS: ioctl(SNDCTL_DSP_CHANNELS) failed: %s", strerror(errno)); + return false; + } + + if (tmp != channels) + { + ERROR_LOG(AUDIO, "OSS: channels unsupported: %d => %d", channels, tmp); + return false; + } + + return true; + } + + static bool setFormat(int fd, int format) + { + int tmp = format; + + if (ioctl(fd, SNDCTL_DSP_SETFMT, &tmp) < 0) + { + ERROR_LOG(AUDIO, "OSS: ioctl(SNDCTL_DSP_SETFMT) failed: %s", strerror(errno)); + return false; + } + + if (tmp != format) + { + ERROR_LOG(AUDIO, "OSS: sample format unsupported: %#.8x => %#.8x", format, tmp); + return false; + } + + return true; + } + +public: + OSSAudioBackend() + : AudioBackend("oss", "Open Sound System") {} + + bool init() override + { + audioFD = openDevice(O_WRONLY); + + if (audioFD < 0 || !setRate(audioFD, 44100) || !setChannels(audioFD, 2) || !setFormat(audioFD, AFMT_S16_LE)) + { + term(); + return false; + } + + return true; + } + + u32 push(const void* frame, u32 samples, bool wait) override + { + write(audioFD, frame, samples * 4); + return 1; + } + + void term() override + { + if (audioFD >= 0) + close(audioFD); + audioFD = -1; + } + + // recording untested + + bool initRecord(u32 sampling_freq) override + { + recordFD = openDevice(O_RDONLY); + + if (recordFD < 0 || !setRate(recordFD, sampling_freq) || !setChannels(recordFD, 1) || !setFormat(recordFD, AFMT_S16_NE /* Native 16 bits */ )) + { + termRecord(); + return false; + } + + return true; + } + + void termRecord() override + { + if (recordFD >= 0) + close(recordFD); + recordFD = -1; + } + + u32 record(void *buffer, u32 samples) override + { + samples *= 2; + int l = read(recordFD, buffer, samples); + if (l < (int)samples) + { + if (l < 0) + { + INFO_LOG(AUDIO, "OSS: Recording error"); + l = 0; + } + memset((u8 *)buffer + l, 0, samples - l); + } + return l / 2; + } +}; +static OSSAudioBackend ossAudioBackend; + +#endif diff --git a/core/oslib/audiobackend_pulseaudio.cpp b/core/audio/audiobackend_pulseaudio.cpp similarity index 100% rename from core/oslib/audiobackend_pulseaudio.cpp rename to core/audio/audiobackend_pulseaudio.cpp diff --git a/core/oslib/audiobackend_sdl2.cpp b/core/audio/audiobackend_sdl2.cpp similarity index 100% rename from core/oslib/audiobackend_sdl2.cpp rename to core/audio/audiobackend_sdl2.cpp diff --git a/core/oslib/audiostream.cpp b/core/audio/audiostream.cpp similarity index 89% rename from core/oslib/audiostream.cpp rename to core/audio/audiostream.cpp index 4a6694edf..15f9a3965 100644 --- a/core/oslib/audiostream.cpp +++ b/core/audio/audiostream.cpp @@ -1,5 +1,8 @@ #include "audiostream.h" #include "cfg/option.h" +#include "emulator.h" + +static void registerForEvents(); struct SoundFrame { s16 l; s16 r; }; @@ -60,6 +63,7 @@ void WriteSample(s16 r, s16 l) void InitAudio() { + registerForEvents(); TermAudio(); std::string slug = config::AudioBackend; @@ -138,3 +142,19 @@ void StopAudioRecording() currentBackend->termRecord(); audio_recording_started = false; } + +static void registerForEvents() +{ + static bool done; + if (done) + return; + done = true; + // Empty the audio buffer when loading a state or terminating the game + const auto& callback = [](Event, void *) { + writePtr = 0; + }; + EventManager::listen(Event::Terminate, callback); + EventManager::listen(Event::LoadState, callback); +} + + diff --git a/core/oslib/audiostream.h b/core/audio/audiostream.h similarity index 100% rename from core/oslib/audiostream.h rename to core/audio/audiostream.h diff --git a/core/build.h b/core/build.h index 88fd6830f..45e067472 100755 --- a/core/build.h +++ b/core/build.h @@ -10,16 +10,13 @@ #define DC_PLATFORM_NAOMI 2 #define DC_PLATFORM_NAOMI2 3 #define DC_PLATFORM_ATOMISWAVE 4 +#define DC_PLATFORM_SYSTEMSP 5 //HOST_CPU #define CPU_X86 0x20000001 #define CPU_ARM 0x20000002 -#define CPU_MIPS 0x20000003 +#define CPU_ARM64 0x20000003 #define CPU_X64 0x20000004 -#define CPU_GENERIC 0x20000005 //used for pnacl, emscripten, etc -#define CPU_PPC 0x20000006 -#define CPU_PPC64 0x20000007 -#define CPU_ARM64 0x20000008 //FEAT_SHREC, FEAT_AREC, FEAT_DSPREC #define DYNAREC_NONE 0x40000001 @@ -35,10 +32,19 @@ #define HOST_CPU CPU_ARM #elif defined(__aarch64__) || defined(_M_ARM64) #define HOST_CPU CPU_ARM64 -#elif defined(__mips__) - #define HOST_CPU CPU_MIPS #else - #define HOST_CPU CPU_GENERIC + #error Unsupported architecture +#endif + +#if defined(__APPLE__) +#include "TargetConditionals.h" +#if TARGET_OS_SIMULATOR +// iOS simulator +#define TARGET_NO_REC +#endif +#if defined(TARGET_MAC) && HOST_CPU == CPU_ARM64 +#define TARGET_ARM_MAC +#endif #endif #if defined(TARGET_NO_REC) @@ -99,7 +105,7 @@ #endif #endif -#if !defined(LIBRETRO) && !defined(TARGET_NO_EXCEPTIONS) +#if !defined(LIBRETRO) #define USE_GGPO #endif @@ -109,11 +115,6 @@ #endif // TARGET PLATFORM - -#define RAM_SIZE_MAX (32*1024*1024) -#define VRAM_SIZE_MAX (16*1024*1024) -#define ARAM_SIZE_MAX (8*1024*1024) - #define GD_CLOCK 33868800 //GDROM XTAL -- 768fs #define AICA_CORE_CLOCK (GD_CLOCK * 4 / 3) //[45158400] GD->PLL 3:4 -> AICA CORE -- 1024fs #define AICA_ARM_CLOCK (AICA_CORE_CLOCK / 2) //[22579200] AICA CORE -> PLL 2:1 -> ARM diff --git a/core/cfg/cfg.cpp b/core/cfg/cfg.cpp index 4a464b845..021a51418 100644 --- a/core/cfg/cfg.cpp +++ b/core/cfg/cfg.cpp @@ -130,3 +130,12 @@ void cfgSetAutoSave(bool autoSave) if (autoSave) saveConfigFile(); } + +void cfgSaveFloat(const std::string& section, const std::string& key, float value) +{ + cfgdb.set_float(section, key, value); +} +float cfgLoadFloat(const std::string& section, const std::string& key, float def) +{ + return cfgdb.get_float(section, key, def); +} diff --git a/core/cfg/cfg.h b/core/cfg/cfg.h index f13279e54..d90a307f7 100644 --- a/core/cfg/cfg.h +++ b/core/cfg/cfg.h @@ -11,6 +11,8 @@ std::string cfgLoadStr(const std::string& section, const std::string& key, const void cfgSaveStr(const std::string& section, const std::string& key, const std::string& value); void cfgSaveBool(const std::string& section, const std::string& key, bool value); bool cfgLoadBool(const std::string& section, const std::string& key, bool def); +void cfgSaveFloat(const std::string& section, const std::string& key, float value); +float cfgLoadFloat(const std::string& section, const std::string& key, float def); void cfgSetVirtual(const std::string& section, const std::string& key, const std::string& value); bool cfgIsVirtual(const std::string& section, const std::string& key); diff --git a/core/cfg/ini.cpp b/core/cfg/ini.cpp index c5879572c..a5ea7aad0 100644 --- a/core/cfg/ini.cpp +++ b/core/cfg/ini.cpp @@ -47,6 +47,11 @@ bool ConfigEntry::get_bool() } } +float ConfigEntry::get_float() +{ + return atof(this->value.c_str()); +} + /* ConfigSection */ bool ConfigSection::has_entry(const std::string& name) @@ -192,6 +197,15 @@ bool ConfigFile::get_bool(const std::string& section_name, const std::string& en } } +float ConfigFile::get_float(const std::string& section_name, const std::string& entry_name, float default_value) +{ + ConfigEntry* entry = get_entry(section_name, entry_name); + if (entry == nullptr) + return default_value; + else + return entry->get_float(); +} + void ConfigFile::set(const std::string& section_name, const std::string& entry_name, const std::string& value, bool is_virtual) { ConfigSection* section = this->get_section(section_name, is_virtual); @@ -222,6 +236,13 @@ void ConfigFile::set_bool(const std::string& section_name, const std::string& en this->set(section_name, entry_name, str_value, is_virtual); } +void ConfigFile::set_float(const std::string& section_name, const std::string& entry_name, float value, bool is_virtual) +{ + std::stringstream str_value; + str_value << value; + this->set(section_name, entry_name, str_value.str(), is_virtual); +} + void ConfigFile::parse(FILE* file) { if (file == nullptr) diff --git a/core/cfg/ini.h b/core/cfg/ini.h index ab3edd3f8..e4bd8a532 100644 --- a/core/cfg/ini.h +++ b/core/cfg/ini.h @@ -13,6 +13,7 @@ struct ConfigEntry { int get_int(); bool get_bool(); int64_t get_int64(); + float get_float(); }; struct ConfigSection { @@ -45,11 +46,13 @@ struct ConfigFile { int get_int(const std::string& section_name, const std::string& entry_name, int default_value = 0); int64_t get_int64(const std::string& section_name, const std::string& entry_name, int64_t default_value = 0); bool get_bool(const std::string& section_name, const std::string& entry_name, bool default_value = false); + float get_float(const std::string& section_name, const std::string& entry_name, float default_value = 0.f); /* setting values */ void set(const std::string& section_name, const std::string& entry_name, const std::string& value, bool is_virtual = false); void set_int(const std::string& section_name, const std::string& entry_name, int value, bool is_virtual = false); void set_int64(const std::string& section_name, const std::string& entry_name, int64_t value, bool is_virtual = false); void set_bool(const std::string& section_name, const std::string& entry_name, bool value, bool is_virtual = false); + void set_float(const std::string& section_name, const std::string& entry_name, float value, bool is_virtual = false); void delete_section(const std::string& section_name); void delete_entry(const std::string& section_name, const std::string& entry_name); diff --git a/core/cfg/option.cpp b/core/cfg/option.cpp index b09660195..eb06c2509 100644 --- a/core/cfg/option.cpp +++ b/core/cfg/option.cpp @@ -33,13 +33,13 @@ Option Cable("Dreamcast.Cable", 3); // TV Composite Option Region("Dreamcast.Region", 1); // USA Option Broadcast("Dreamcast.Broadcast", 0); // NTSC Option Language("Dreamcast.Language", 1); // English -Option ForceWindowsCE("Dreamcast.ForceWindowsCE"); Option AutoLoadState("Dreamcast.AutoLoadState"); Option AutoSaveState("Dreamcast.AutoSaveState"); Option SavestateSlot("Dreamcast.SavestateSlot"); Option ForceFreePlay("ForceFreePlay", true); Option FetchBoxart("FetchBoxart", true); Option BoxartDisplayMode("BoxartDisplayMode", true); +Option UIScaling("UIScaling", 100); // Sound @@ -93,12 +93,13 @@ std::array, 4> CrosshairColor { Option("rend.CrossHairColor3"), Option("rend.CrossHairColor4"), }; +Option CrosshairSize("rend.CrosshairSize", 40); Option SkipFrame("ta.skip"); Option MaxThreads("pvr.MaxThreads", 3); Option AutoSkipFrame("pvr.AutoSkipFrame", 0); Option RenderResolution("rend.Resolution", 480); Option VSync("rend.vsync", true); -Option PixelBufferSize("rend.PixelBufferSize", 512 * 1024 * 1024); +Option PixelBufferSize("rend.PixelBufferSize", 512_MB); Option AnisotropicFiltering("rend.AnisotropicFiltering", 1); Option TextureFiltering("rend.TextureFiltering", 0); // Default Option ThreadedRendering("rend.ThreadedRendering", true); @@ -106,6 +107,13 @@ Option DupeFrames("rend.DupeFrames", false); Option PerPixelLayers("rend.PerPixelLayers", 32); Option NativeDepthInterpolation("rend.NativeDepthInterpolation", false); Option EmulateFramebuffer("rend.EmulateFramebuffer", false); +Option FixUpscaleBleedingEdge("rend.FixUpscaleBleedingEdge", true); +Option CustomGpuDriver("rend.CustomGpuDriver", false); +#ifdef VIDEO_ROUTING +Option VideoRouting("rend.VideoRouting", false); +Option VideoRoutingScale("rend.VideoRoutingScale", false); +Option VideoRoutingVRes("rend.VideoRoutingVRes", 720); +#endif // Misc @@ -116,12 +124,17 @@ Option GDBPort("Debug.GDBPort", debugger::DEFAULT_PORT); Option GDBWaitForConnection("Debug.GDBWaitForConnection"); Option UseReios("UseReios"); Option FastGDRomLoad("FastGDRomLoad", false); +Option RamMod32MB("Dreamcast.RamMod32MB", false); Option OpenGlChecks("OpenGlChecks", false, "validate"); Option, false> ContentPath("Dreamcast.ContentPath"); Option HideLegacyNaomiRoms("Dreamcast.HideLegacyNaomiRoms", true); Option UploadCrashLogs("UploadCrashLogs", true); +Option DiscordPresence("DiscordPresence", true); +#if defined(__ANDROID__) && !defined(LIBRETRO) +Option UseSafFilePicker("UseSafFilePicker", true); +#endif // Profiler Option ProfilerEnabled("Profiler.Enabled"); @@ -133,7 +146,7 @@ Option ProfilerFrameWarningTime("Profiler.FrameWarningTime", 1.0f / 55.0f Option NetworkEnable("Enable", false, "network"); Option ActAsServer("ActAsServer", false, "network"); -OptionString DNS("DNS", "46.101.91.123", "network"); +OptionString DNS("DNS", "dns.flyca.st", "network"); OptionString NetworkServer("server", "", "network"); Option LocalPort("LocalPort", NaomiNetwork::SERVER_PORT, "network"); Option EmulateBBA("EmulateBBA", false, "network"); @@ -147,10 +160,7 @@ Option GGPOChatTimeoutToggle("GGPOChatTimeoutToggle", true, "network"); Option GGPOChatTimeout("GGPOChatTimeout", 10, "network"); Option NetworkOutput("NetworkOutput", false, "network"); Option MultiboardSlaves("MultiboardSlaves", 1, "network"); - -#ifdef SUPPORT_DISPMANX -Option DispmanxMaintainAspect("maintain_aspect", true, "dispmanx"); -#endif +Option BattleCableEnable("BattleCable", false, "network"); #ifdef USE_OMX Option OmxAudioLatency("audio_latency", 100, "omx"); @@ -161,6 +171,7 @@ Option OmxAudioHdmi("audio_hdmi", true, "omx"); Option MouseSensitivity("MouseSensitivity", 100, "input"); Option VirtualGamepadVibration("VirtualGamepadVibration", 20, "input"); +Option VirtualGamepadTransparency("VirtualGamepadTransparency", 37, "input"); std::array, 4> MapleMainDevices { Option("device1", MDT_SegaController, "input"), @@ -190,4 +201,11 @@ Option UseRawInput("RawInput", false, "input"); Option LuaFileName("LuaFileName", "flycast.lua"); #endif +// RetroAchievements + +Option EnableAchievements("Enabled", false, "achievements"); +Option AchievementsHardcoreMode("HardcoreMode", false, "achievements"); +OptionString AchievementsUserName("UserName", "", "achievements"); +OptionString AchievementsToken("Token", "", "achievements"); + } // namespace config diff --git a/core/cfg/option.h b/core/cfg/option.h index aa1777a04..c3ba52786 100644 --- a/core/cfg/option.h +++ b/core/cfg/option.h @@ -202,11 +202,7 @@ class Option : public BaseOption { std::enable_if_t, T> doLoad(const std::string& section, const std::string& name) const { - std::string strValue = cfgLoadStr(section, name, ""); - if (strValue.empty()) - return value; - else - return (float)atof(strValue.c_str()); + return cfgLoadFloat(section, name, value); } template @@ -301,9 +297,7 @@ class Option : public BaseOption { std::enable_if_t> doSave(const std::string& section, const std::string& name) const { - char buf[64]; - snprintf(buf, sizeof(buf), "%f", value); - cfgSaveStr(section, name, buf); + cfgSaveFloat(section, name, value); } template @@ -366,13 +360,13 @@ extern Option Cable; // 0 -> VGA, 1 -> VGA, 2 -> RGB, 3 -> TV Composite extern Option Region; // 0 -> JP, 1 -> USA, 2 -> EU, 3 -> default extern Option Broadcast; // 0 -> NTSC, 1 -> PAL, 2 -> PAL/M, 3 -> PAL/N, 4 -> default extern Option Language; // 0 -> JP, 1 -> EN, 2 -> DE, 3 -> FR, 4 -> SP, 5 -> IT, 6 -> default -extern Option ForceWindowsCE; extern Option AutoLoadState; extern Option AutoSaveState; extern Option SavestateSlot; extern Option ForceFreePlay; extern Option FetchBoxart; extern Option BoxartDisplayMode; +extern Option UIScaling; // Sound @@ -412,14 +406,21 @@ extern Option VmuSound; class RendererOption : public Option { public: - RendererOption() +#ifdef LIBRETRO + RendererOption() : Option("", +#else + RendererOption() : Option("pvr.rend", +#endif #if defined(USE_DX11) - : Option("pvr.rend", RenderType::DirectX11) {} + RenderType::DirectX11 #elif defined(USE_DX9) - : Option("pvr.rend", RenderType::DirectX9) {} + RenderType::DirectX9 +#elif !defined(USE_OPENGL) + RenderType::Vulkan #else - : Option("pvr.rend", RenderType::OpenGL) {} + RenderType::OpenGL #endif + ) {} RenderType& operator=(const RenderType& v) { set(v); return value; } @@ -453,6 +454,7 @@ extern Option PerStripSorting; extern Option DelayFrameSwapping; // Delay swapping frame until FB_R_SOF matches FB_W_SOF extern Option WidescreenGameHacks; extern std::array, 4> CrosshairColor; +extern Option CrosshairSize; extern Option SkipFrame; extern Option MaxThreads; extern Option AutoSkipFrame; // 0: none, 1: some, 2: more @@ -465,6 +467,13 @@ extern Option ThreadedRendering; extern Option DupeFrames; extern Option NativeDepthInterpolation; extern Option EmulateFramebuffer; +extern Option FixUpscaleBleedingEdge; +extern Option CustomGpuDriver; +#ifdef VIDEO_ROUTING +extern Option VideoRouting; +extern Option VideoRoutingScale; +extern Option VideoRoutingVRes; +#endif // Misc @@ -475,12 +484,17 @@ extern Option GDBPort; extern Option GDBWaitForConnection; extern Option UseReios; extern Option FastGDRomLoad; +extern Option RamMod32MB; extern Option OpenGlChecks; extern Option, false> ContentPath; extern Option HideLegacyNaomiRoms; extern Option UploadCrashLogs; +extern Option DiscordPresence; +#if defined(__ANDROID__) && !defined(LIBRETRO) +extern Option UseSafFilePicker; +#endif // Profiling extern Option ProfilerEnabled; @@ -506,10 +520,7 @@ extern Option GGPOChatTimeoutToggle; extern Option GGPOChatTimeout; extern Option NetworkOutput; extern Option MultiboardSlaves; - -#ifdef SUPPORT_DISPMANX -extern Option DispmanxMaintainAspect; -#endif +extern Option BattleCableEnable; #ifdef USE_OMX extern Option OmxAudioLatency; @@ -520,6 +531,7 @@ extern Option OmxAudioHdmi; extern Option MouseSensitivity; extern Option VirtualGamepadVibration; +extern Option VirtualGamepadTransparency; extern std::array, 4> MapleMainDevices; extern std::array, 2>, 4> MapleExpansionDevices; extern Option PerGameVmu; @@ -533,4 +545,11 @@ constexpr bool UseRawInput = false; extern Option LuaFileName; #endif +// RetroAchievements + +extern Option EnableAchievements; +extern Option AchievementsHardcoreMode; +extern OptionString AchievementsUserName; +extern OptionString AchievementsToken; + } // namespace config diff --git a/core/cheats.cpp b/core/cheats.cpp index 77a20a9e6..999be2002 100644 --- a/core/cheats.cpp +++ b/core/cheats.cpp @@ -52,6 +52,7 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = { "T6801M", nullptr, { 0x042F3C }, { 0x4384BC09 } }, // Buggy Heat (JP) { "T46601D 05", nullptr, { 0xBB3D14 }, { 0x440A7C9A } }, // Cannon Spike (PAL) { "T1215N", nullptr, { 0xBB3C74 }, { 0x440A7C9A } }, // Cannon Spike (USA) + { "HDR-0115", nullptr, { 0x10ACFC }, { 0x3F400000 } }, // Cardcaptor Sakura: Tomoyo no Video Daisakusen (JPN) { "T44901D 50", nullptr, { 0xB0109C, 0xB010CC }, { 0x43F00000, 0x3F400000 } }, // Carrier (PAL) { "T5701N", nullptr, { 0xAFD93C, 0xAFD96C }, { 0x43F00000, 0x3F400000 } }, // Carrier (USA) // Capcom vs. SNK Pro (JP) @@ -110,7 +111,7 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = { "MK-5115450", nullptr, { 0x3D3B10 }, { 0x43700000 } }, // Fighting Vipers 2 (PAL) { "HDR-0133", nullptr, { 0x3D3AF0 }, { 0x43700000 } }, // Fighting Vipers 2 (JP) { "T18805M", nullptr, { 0x1A39C0 }, { 0x3F400000 } }, // Fire Pro Wrestling D (JP) - { "MK-51114", nullptr, { 0x132DD8, 0xA26CA8, 0xA26738, 0xA275B8, 0xA26AD8, 0xA26908 }, + { "MK-51114", " E ", { 0x132DD8, 0xA26CA8, 0xA26738, 0xA275B8, 0xA26AD8, 0xA26908 }, { 0x3F400000, 0x3F400000, 0x3F400000, 0x3F400000, 0x3F400000, 0x3F400000 } }, // Floigan Bros. Ep. 1 (PAL) { "T34201M", nullptr, { 0x586290, 0x586260 }, { 0x3F400000, 0x43F00000 } }, // Frame Gride (JP) { "T-8113D-50", nullptr, { 0x55A354 }, { 0x3FAAAAAB } }, // Fur Fighters (PAL) @@ -164,8 +165,8 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = { 0x43F00000, 0x3F400000, 0x3F800000 } }, // Napple Tale: Arsia in Daydream (JP) //crash { "MK-51178", nullptr, { 0x23AF00, 0x23B160, 0x144D40, 0x2105B4, 0x705B40 }, // { 0xBFAAAAAB, 0xBFAAAAAB, 0xBFAAAAAB, 0xBFAAAAAB, 0x44558000 } }, // NBA 2K2 - { "T9504M", nullptr, { 0xCDE848, 0xCDE844 }, { 0x3F400000, 0x3FA00000 } }, // Nightmare Creatures II (USA) - { "T-9502D-50", nullptr, { 0xBDE9B0, 0xBDE9C4 }, { 0x3F400000, 0x3FA00000 } }, // Nightmare Creatures II (PAL) +// { "T9504M", nullptr, { 0xCDE848, 0xCDE844 }, { 0x3F400000, 0x3FA00000 } }, // Nightmare Creatures II (USA) +// { "T-9502D-50", nullptr, { 0xBDE9B0, 0xBDE9C4 }, { 0x3F400000, 0x3FA00000 } }, // Nightmare Creatures II (PAL) { "MK-5110250", nullptr, { 0x87B5A4 }, { 0x43700000 } }, // Outtrigger (PAL) { "HDR-0118", nullptr, { 0x83E284 }, { 0x43700000 } }, // Outtrigger (JP) { "T15103D 50", nullptr, { 0x1EEE78 }, { 0x3F400000 } }, // PenPen (PAL) @@ -224,6 +225,7 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = { "T8104D 58", nullptr, { 0x2C03F8 }, { 0x44558000 } }, // Shadow Man (PAL) { "T-8106N", nullptr, { 0x2C03F4 }, { 0x3F400000 } }, // Shadow Man (USA) { "MK-51048", nullptr, { 0x4AA4DC, 0x2B4E30 }, { 0x3F400000, 0x3F400000 } }, // Seaman (USA) + { "MK-51053", nullptr, { 0x5630CC }, { 0x3F400000 } }, // Sega GT (USA) { "MK-5105350", nullptr, { 0x5D613C }, { 0x3F400000 } }, // Sega GT (PAL) { "MK-51096", nullptr, { 0x495050 }, { 0x43700000 } }, // Sega Marine Fishing (USA) // { "MK-51019", nullptr, { 0xB83A48 }, { 0x3F400000 } }, // Sega Rally 2 (USA) not working? @@ -264,20 +266,23 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = { "T40206N", nullptr, { 0x43296C }, { 0x3F400000 } }, // Super Magnetic Neo (US) { "T40206D 50", nullptr, { 0x43E34C }, { 0x3F400000 } }, // Super Magnetic Neo (EU) // { "T7014D 50", nullptr, { 0xE2B234 }, { 0x3F800000 } }, // Super Runabout (PAL) doesn't work? + { "T40216N", nullptr, { 0x45CE54 }, { 0x3F400000 } }, // Surf Rocket Racers (US) { "T17721D 50", nullptr, { 0x45CED4 }, { 0x3F400000 } }, // Surf Rocket Racers (PAL) alt: 021EBF40 3F400000 { "T17703D 50", nullptr, { 0xCD8950 }, { 0x3F111111 } }, // Suzuki Alstare Extreme Racing { "T36807D 05", nullptr, { 0x140F74, 0x140FA4 }, { 0x43FA0000, 0x3F400000 } }, // Sword of Bersek (PAL) { "T-36805N", nullptr, { 0x13F1C4, 0x13F194 }, { 0x3F400000, 0x43F00000 } }, // Sword of Bersek (USA) { "MK-51186", nullptr, { 0x4A19B0 }, { 0x43700000 } }, // Tennis 2K2 (USA) - { "T15123N", nullptr, { 0x29B7BC }, { 0x3F400000 } }, // Test Drive Le Mans (USA) doesn't work? + { "T15123N", nullptr, { 0x29B7BC }, { 0x3F400000 } }, // Test Drive Le Mans (USA) { "T20801M", nullptr, { 0x1AAC80, 0x1AACB0 }, { 0x43F00000, 0x3F400000 } }, // Tetris 4D (JP) { "MK-5101153", nullptr, { 0x14EFA8, 0x14EFD8 }, { 0x43F00000, 0x3F400000 } }, // Timestalkers (PAL) { "T7009D50", nullptr, { 0x39173C }, { 0x3F400000 } }, // Tech Romancer (PAL) { "T35402M", nullptr, { 0x315370, 0x3153A0 }, { 0x43F00000, 0x3F400000 } }, // Tokyo Bus Guide (JP) doesn't work? { "T40201D 50", nullptr, { 0x1D9F10 }, { 0x3F400000 } }, // Tokyo Highway Challenge (PAL) { "T40210D 50", nullptr, { 0x21E4F8 }, { 0x43700000 } }, // Tokyo Highway Challenge 2 (PAL) - { "xxxxxxxxxx", nullptr, { 0x21DEF8 }, { 0x3F400000 } }, // Tokyo Street Racer 2 (USA) + { "T40202N", nullptr, { 0x1D9EB0 }, { 0x3F400000 } }, // Tokyo Xtreme Racer (USA) + { "T40211N", nullptr, { 0x21DEF8 }, { 0x43700000 } }, // Tokyo Xtreme Racer 2 (USA) // { "T36804D05", nullptr, { 0xB75E28 }, { 0x3EC00000 } }, // Tomb Raider: The Last Revelation (UK) (PAL) clipping, use hex patch instead +// { "T40205N", nullptr, { 0x160D80, 0x160D7C }, { 0xA, 0xA } }, // Tony Hawk's Pro Skater (USA) -> missing character on selection screen { "T13008D 05", nullptr, { 0x1D7C20 }, { 0x3FA66666 } }, // Tony Hawk's Pro Skater 2 (PAL) { "T13006N", nullptr, { 0x1D77A0 }, { 0x3FA66666 } }, // Tony Hawk's Pro Skater 2 (USA) { "MK-5102050", nullptr, { 0x0D592C }, { 0x3FD00000 } }, // Toy Commander (PAL) @@ -297,7 +302,7 @@ const WidescreenCheat CheatManager::widescreen_cheats[] = // { "T0000", nullptr, { 0x3A514C, 0x3A6170 }, { 0x3F400000, 0x00000356 } }, // Volgarr the Viking. Not working { "xxxxxxxxxx", nullptr, { 0x20BB68, 0x1ACBD0, 0x1B9ADC }, // Code 1 reduces clipping. Code 2 fixes the clock. { 0x43700000, 0x7C1ACC60, 0x3F400000 } }, // What's Shenmue (JP) - { "T40504D 50", nullptr, { 0x75281C }, { 0x3F400000 } }, // Wetrix+ (PAL) not working? + { "T40504D 50", nullptr, { 0x75281C }, { 0x3F400000 } }, // Wetrix+ (PAL) { "MK-51152", nullptr, { 0x014E90 }, { 0x43700000 } }, // World Series Baseball 2K2 (USA) { "T20401M", nullptr, { 0x323CB0, 0x1ACBD0, 0x1B9ADC }, // Code 1 reduces clipping. Code 2 fixes the HUD. { 0x43700000, 0x1ACC60, 0x3F400000 } }, // Zero Gunner 2 (JP) @@ -313,6 +318,7 @@ const WidescreenCheat CheatManager::naomi_widescreen_cheats[] = { "KNIGHTS OF VALOUR THE 7 SPIRITS", nullptr, { 0x475B70, 0x475B40 }, { 0x3F400000, 0x43F00000 } }, { "Dolphin Blue", nullptr, { 0x3F2E2C, 0x3F2190, 0x3F2E6C, 0x3F215C }, { 0x43B90000, 0x3FAA9FBE, 0x43B90000, 0x43F00000 } }, + { "FASTER THAN SPEED", nullptr, { 0x3488E0 }, { 0x3F400000 } }, // ftspeed { "METAL SLUG 6", nullptr, { 0xE93478, 0xE9347C }, { 0x3F400000, 0x3F8872B0 } }, { "TOY FIGHTER", nullptr, { 0x133E58 }, { 0x43700000 } }, { "LUPIN THE THIRD -THE SHOOTING-", nullptr, { 0x045490 }, { 0x3F400000 } }, @@ -347,6 +353,8 @@ const WidescreenCheat CheatManager::naomi_widescreen_cheats[] = { "GUN SPIKE", nullptr, { 0xBACD7C }, { 0x440A7C9A } }, { " JAMBO SAFARI ------------", nullptr, { 0x2B1DE0 }, { 0x3FE38E39 } }, { "SOUL SURFER IN JAPAN", nullptr, { 0x8962C8 }, { 0x3FE38E39 } }, + { "LOVE AND BERRY 3 EXP VER1.002", nullptr, { 0x3C16E4 }, { 0x3F400000 } }, // loveber3 + { "LOVE AND BERRY USA VER2.000", nullptr, { 0x4E92D0 }, { 0x3F400000 } }, // lovebery { nullptr }, }; @@ -369,6 +377,17 @@ void CheatManager::setActive(bool active) void CheatManager::loadCheatFile(const std::string& filename) { #ifndef LIBRETRO + try { + hostfs::FileInfo fileInfo = hostfs::storage().getFileInfo(filename); + if (fileInfo.size >= 1_MB) { + WARN_LOG(COMMON, "Cheat file '%s' is too big", filename.c_str()); + return; + } + } catch (const hostfs::StorageException& e) { + WARN_LOG(COMMON, "Cannot find cheat file '%s': %s", filename.c_str(), e.what()); + return; + } + FILE* cheatfile = hostfs::storage().openFile(filename, "r"); if (cheatfile == nullptr) { @@ -413,7 +432,8 @@ void CheatManager::loadCheatFile(const std::string& filename) } setActive(!cheats.empty()); INFO_LOG(COMMON, "%d cheats loaded", (int)cheats.size()); - cfgSaveStr("cheats", gameId, filename); + if (!cheats.empty()) + cfgSaveStr("cheats", gameId, filename); #endif } @@ -426,63 +446,54 @@ void CheatManager::reset(const std::string& gameId) setActive(false); this->gameId = gameId; #ifndef LIBRETRO - std::string cheatFile = cfgLoadStr("cheats", gameId, ""); - if (!cheatFile.empty()) - loadCheatFile(cheatFile); + if (!settings.raHardcoreMode) + { + std::string cheatFile = cfgLoadStr("cheats", gameId, ""); + if (!cheatFile.empty()) + loadCheatFile(cheatFile); + } #endif + size_t cheatCount = cheats.size(); if (gameId == "Fixed BOOT strapper") // Extreme Hunting 2 { - setActive(true); - cheats.emplace_back(Cheat::Type::runNextIfEq, "skip netbd check ifeq", true, 32, 0x00067b04, 0); - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "skip netbd check", true, 32, 0x00067b04, 1); // 1 skips initNetwork() - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "skip netbd check 2", true, 16, 0x0009acc8, 0x0009); // not acceptable by main board - cheats.back().builtIn = true; + cheats.emplace_back(Cheat::Type::runNextIfEq, "skip netbd check ifeq", true, 32, 0x00067b04, 0, true); + cheats.emplace_back(Cheat::Type::setValue, "skip netbd check", true, 32, 0x00067b04, 1, true); // 1 skips initNetwork() + cheats.emplace_back(Cheat::Type::setValue, "skip netbd check 2", true, 16, 0x0009acc8, 0x0009, true); // not acceptable by main board // ac010000 should be d202 9302, but is changed to 78c0 8c93 - cheats.emplace_back(Cheat::Type::runNextIfEq, "fix boot ifeq", true, 32, 0x00010000, 0x8c9378c0); - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "fix boot", true, 32, 0x00010000, 0x9302d202); - cheats.back().builtIn = true; + cheats.emplace_back(Cheat::Type::runNextIfEq, "fix boot ifeq", true, 32, 0x00010000, 0x8c9378c0, true); + cheats.emplace_back(Cheat::Type::setValue, "fix boot", true, 32, 0x00010000, 0x9302d202, true); } - else if (gameId == "THE KING OF ROUTE66") - { - setActive(true); - cheats.emplace_back(Cheat::Type::setValue, "ignore drive error", true, 32, 0x00023ee0, 0x0009000B); // rts, nop - cheats.back().builtIn = true; + else if (gameId == "THE KING OF ROUTE66") { + cheats.emplace_back(Cheat::Type::setValue, "ignore drive error", true, 32, 0x00023ee0, 0x0009000B, true); // rts, nop } - else if (gameId.substr(0, 8) == "MKG TKOB") - { - const auto& setMushikingCheats = [this](u32 addr) { - setActive(true); - cheats.emplace_back(Cheat::Type::setValue, "ignore rfid1 error", true, 32, addr, 0); // rfid[0].error = 0 - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "ignore rfid2 error", true, 32, addr + 0x48, 0); // rfid[1].error = 0 - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "ignore rfid1 status", true, 32, addr + 8, 0); // rfid[0].data18 = 0 - cheats.back().builtIn = true; - cheats.emplace_back(Cheat::Type::setValue, "ignore rfid2 status", true, 32, addr + 0x50, 0); // rfid[1].data18 = 0 - cheats.back().builtIn = true; - }; - if (gameId == "MKG TKOB 2 EXP VER1.001-") // mushi2eo - setMushikingCheats(0x6fe1bc); - else if (gameId == "MKG TKOB 2 JPN VER2.001-") // mushik2e - setMushikingCheats(0x6ffe54); - else if (gameId == "MKG TKOB 2K3 2ND VER1.003-")// mushike - setMushikingCheats(0x4ad7ec); - else if (gameId == "MKG TKOB 4 JPN VER2.000-") // mushik4e - setMushikingCheats(0xb0e538); - else if (gameId == "MKG TKOB 2K3 2ND VER1.002-")// mushikeo - setMushikingCheats(0x4ad56c); - else if (gameId == "MKG TKOB 2K3 2ND KOR VER1.000-") // mushikk - setMushikingCheats(0x4ac9b8); - else if (gameId == "MKG TKOB 2K3 2ND CHN VER1.000-") // mushikc - setMushikingCheats(0x4aa9b8); - else if (gameId == "MKG TKOB 2 KOR VER1.000-") // mushik2k - setMushikingCheats(0x706084); + else if (gameId == "T-8120N") { // Dave Mirra BMX (US) + cheats.emplace_back(Cheat::Type::setValue, "fix main loop time", true, 32, 0x0030b8cc, 0x42040000, true); // 33.0 ms + } + else if (gameId == "T8120D 50") { // Dave Mirra BMX (EU) + cheats.emplace_back(Cheat::Type::setValue, "fix main loop time", true, 32, 0x003011cc, 0x42200000, true); // 40.0 ms + } + else if (gameId == "MK-0100") { // F355 US + cheats.emplace_back(Cheat::Type::setValue, "increase datapump timeout", true, 16, 0x00131668, 1000, true); + } + else if (gameId == "T8118D 50") { // F355 EU + cheats.emplace_back(Cheat::Type::setValue, "increase datapump timeout", true, 16, 0x00135588, 1000, true); + } + else if (gameId == "SAMURAI SPIRITS 6" || gameId == "T0002M") { + cheats.emplace_back(Cheat::Type::setValue, "fix depth", true, 16, 0x0003e602, 0x0009, true); // nop (shift by 8 bits instead of 10) } + else if (gameId == "T-8107N") { // Fur Fighters (US) + // force logging on to use more cycles + cheats.emplace_back(Cheat::Type::setValue, "enable logging", true, 32, 0x00314248, 1, true); + } + else if (gameId == "T-8113D-50") { // Fur Fighters (EU) + // force logging on to use more cycles + cheats.emplace_back(Cheat::Type::setValue, "enable logging", true, 32, 0x00314228, 1, true); + } + + if (cheats.size() > cheatCount) + setActive(true); } - if (config::WidescreenGameHacks) + if (config::WidescreenGameHacks && !settings.raHardcoreMode) { if (settings.platform.isConsole()) { @@ -566,11 +577,13 @@ void CheatManager::apply() writeRam(address, widescreen_cheat->values[i], 32); } } - if (active && !settings.network.online) + if (active) { bool skipCheat = false; for (const Cheat& cheat : cheats) { + if (!cheat.builtIn && settings.network.online) + continue; if (skipCheat) { skipCheat = false; continue; @@ -651,7 +664,7 @@ static std::vector parseCodes(const std::string& s) curCode += c; if (curCode.length() == 8) { - codes.push_back(strtol(curCode.c_str(), nullptr, 16)); + codes.push_back(strtoul(curCode.c_str(), nullptr, 16)); curCode.clear(); } } @@ -662,7 +675,7 @@ static std::vector parseCodes(const std::string& s) { if (curCode.length() != 8) throw FlycastException("Invalid cheat code"); - codes.push_back(strtol(curCode.c_str(), nullptr, 16)); + codes.push_back(strtoul(curCode.c_str(), nullptr, 16)); } return codes; diff --git a/core/cheats.h b/core/cheats.h index cd68b8d41..709939d76 100644 --- a/core/cheats.h +++ b/core/cheats.h @@ -51,19 +51,17 @@ struct Cheat u32 size; u32 address; u32 value; - u8 valueMask; - u32 repeatCount; - u32 repeatValueIncrement; - u32 repeatAddressIncrement; - u32 destAddress; + u8 valueMask = 0; + u32 repeatCount = 1; + u32 repeatValueIncrement = 0; + u32 repeatAddressIncrement = 0; + u32 destAddress = 0; bool builtIn; - Cheat(Type type = Type::disabled, const std::string& description = "", bool enabled = false, u32 size = 0, u32 address = 0, - u32 value = 0, u8 valueMask = 0, u32 repeatCount = 1, u32 repeatValueIncrement = 0, - u32 repeatAddressIncrement = 0, u32 destAddress = 0, bool builtIn = false) - : type(type), description(description), enabled(enabled), size(size), address(address), value(value), valueMask(valueMask), - repeatCount(repeatCount), repeatValueIncrement(repeatValueIncrement), repeatAddressIncrement(repeatAddressIncrement), - destAddress(destAddress), builtIn(builtIn) + Cheat(Type type = Type::disabled, const std::string& description = "", bool enabled = false, + u32 size = 0, u32 address = 0, u32 value = 0, bool builtIn = false) + : type(type), description(description), enabled(enabled), + size(size), address(address), value(value), builtIn(builtIn) { } }; diff --git a/core/debug/debug_agent.h b/core/debug/debug_agent.h index 35ebd0e45..d2e03310c 100644 --- a/core/debug/debug_agent.h +++ b/core/debug/debug_agent.h @@ -21,7 +21,7 @@ #include "emulator.h" #include "hw/sh4/sh4_if.h" #include "hw/sh4/sh4_mem.h" -#include "hw/sh4/sh4_interpreter.h" +#include "hw/sh4/dyna/shil.h" #include "cfg/option.h" #include #include @@ -34,9 +34,6 @@ #define SIGBUS 7 #endif -#define SWAP_32(a) ((((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff)) -#define SWAP_16(a) ((((a) & 0x00ff) << 8) | (((a) & 0xff00) >> 8)) - const std::array Sh4RegList { reg_r0, reg_r1, @@ -125,9 +122,9 @@ class DebugAgent for (u32 i = 0; i < Sh4RegList.size(); i++) { if (Sh4RegList[i] == reg_sr_status) - allregs[i] = SWAP_32(sh4_sr_GetFull()); + allregs[i] = Sh4cntx.sr.getFull(); else if (Sh4RegList[i] != NoReg) - allregs[i] = SWAP_32(*GetRegPtr(Sh4RegList[i])); + allregs[i] = *GetRegPtr(Sh4cntx, Sh4RegList[i]); } *regs = &allregs[0]; return allregs.size(); @@ -137,7 +134,7 @@ class DebugAgent { for (u32 i = 0; i < Sh4RegList.size(); i++) if (Sh4RegList[i] != NoReg) - *GetRegPtr(Sh4RegList[i]) = SWAP_32(regs[i]); + *GetRegPtr(Sh4cntx, Sh4RegList[i]) = regs[i]; } u32 readReg(u32 regNum) @@ -146,9 +143,9 @@ class DebugAgent return 0; Sh4RegType reg = Sh4RegList[regNum]; if (reg == reg_sr_status) - return SWAP_32(sh4_sr_GetFull()); + return Sh4cntx.sr.getFull(); if (reg != NoReg) - return SWAP_32(*GetRegPtr(reg)); + return *GetRegPtr(Sh4cntx, reg); return 0; } void writeReg(u32 regNum, u32 value) @@ -157,9 +154,9 @@ class DebugAgent return; Sh4RegType reg = Sh4RegList[regNum]; if (reg == reg_sr_status) - sh4_sr_SetFull(SWAP_32(value)); + Sh4cntx.sr.setFull(value); else if (reg != NoReg) - *GetRegPtr(reg) = SWAP_32(value); + *GetRegPtr(Sh4cntx, reg) = value; } const u8 *readMem(u32 addr, u32 len) @@ -171,14 +168,14 @@ class DebugAgent { if (len >= 4 && (addr & 3) == 0) { - *(u32 *)p = SWAP_32(ReadMem32_nommu(addr)); + *(u32 *)p = ReadMem32_nommu(addr); addr += 4; len -= 4; p += 4; } else if (len >= 2 && (addr & 1) == 0) { - *(u16 *)p = SWAP_16(ReadMem16_nommu(addr)); + *(u16 *)p = ReadMem16_nommu(addr); addr += 2; len -= 2; p += 2; @@ -200,14 +197,14 @@ class DebugAgent { if (len >= 4 && (addr & 3) == 0) { - WriteMem32_nommu(addr, SWAP_32(*(u32 *)p)); + WriteMem32_nommu(addr, *(u32 *)p); addr += 4; len -= 4; p += 4; } else if (len >= 2 && (addr & 3) == 0) { - WriteMem16_nommu(addr, SWAP_16(*(u16 *)p)); + WriteMem16_nommu(addr, *(u16 *)p); addr += 2; len -= 2; p += 2; diff --git a/core/debug/gdb_server.cpp b/core/debug/gdb_server.cpp index eb8cb2f7c..35bd947b0 100644 --- a/core/debug/gdb_server.cpp +++ b/core/debug/gdb_server.cpp @@ -21,84 +21,168 @@ #ifdef GDB_SERVER #include "gdb_server.h" #include "debug_agent.h" -#include "network/net_platform.h" #include "cfg/option.h" +#include "oslib/oslib.h" +#include "util/shared_this.h" +#include #include #include #include -#include #include - -#define MAX_PACKET_LEN 4096 +#include namespace debugger { -static void emuEventCallback(Event event, void *); +constexpr u32 MAX_PACKET_LEN = 4096; -class GdbServer +static u8 unpack(char c) +{ + c = std::tolower(c); + if (c <= '9') + return c - '0'; + else + return c - 'a' + 10; +} + +u32 unpack(const char *s, int l) +{ + u32 r = 0; + for (int i = 0; i < l && *s != '\0'; i += 2, s += 2) { + r |= (unpack(s[0]) << 4 | unpack(s[1])) << (i * 4); + } + return r; +} + +class GdbServer; + +class Connection : public SharedThis { public: - struct Error : public std::runtime_error { - Error(const char *reason) : std::runtime_error(reason) {} - }; + asio::ip::tcp::socket& getSocket() { + return socket; + } - void init(int port) + void start() { + asio::async_read_until(socket, asio::dynamic_string_buffer(message, MAX_PACKET_LEN), packetMatcher, + std::bind(&Connection::handlePacket, shared_from_this(), + asio::placeholders::error, + asio::placeholders::bytes_transferred)); + } + +private: + Connection(GdbServer& server, asio::io_context& io_context) + : server(server), io_context(io_context), socket(io_context) { + } + + using iterator = asio::buffers_iterator; + + std::pair + static packetMatcher(iterator begin, iterator end) { - if (VALID(serverSocket)) - return; + if (begin == end) + return std::make_pair(begin, false); + iterator i = begin; + if (*i == '\03') + // break + return std::make_pair(i + 1, true); + if (*i != '$') { + // unexpected, or ack/nack ('+', '-') + return std::make_pair(i + 1, true); + } + ++i; + while (i != end && *i != '#') + ++i; + if (i + 3 <= end) + // 2 chars for CRC + return std::make_pair(i + 3, true); - serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (!VALID(serverSocket)) - throw Error("gdb: Cannot create server socket"); + return std::make_pair(begin, false); + } - int option = 1; - setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&option, sizeof(option)); + void handlePacket(const std::error_code& ec, size_t len); - struct sockaddr_in serveraddr; - memset(&serveraddr, 0, sizeof(serveraddr)); - serveraddr.sin_family = AF_INET; - serveraddr.sin_port = htons(port); + void send(const std::string& msg) + { + if (msg.empty()) + start(); + else + asio::async_write(socket, asio::buffer(msg), + std::bind(&Connection::writeDone, shared_from_this(), + asio::placeholders::error, + asio::placeholders::bytes_transferred)); - if (::bind(serverSocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) - { - closesocket(serverSocket); - throw Error("gdb: bind() failed"); - } - if (::listen(serverSocket, 5) < 0) - { - closesocket(serverSocket); - throw Error("gdb: listen() failed"); - } - EventManager::listen(Event::Resume, emuEventCallback); - EventManager::listen(Event::Terminate, emuEventCallback); + } + + void writeDone(const std::error_code& ec, size_t len) + { + if (ec) + WARN_LOG(COMMON, "Write error: %s", ec.message().c_str()); + else + start(); + } + + GdbServer& server; + asio::io_context& io_context; + asio::ip::tcp::socket socket; + std::string message; + friend super; +}; + +class TcpAcceptor +{ +public: + TcpAcceptor(GdbServer& server, asio::io_context& io_context, u16 port) + : server(server), io_context(io_context), + acceptor(asio::ip::tcp::acceptor(io_context, + asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port))) + { + asio::socket_base::reuse_address option(true); + acceptor.set_option(option); + start(); + } + +private: + void start() + { + Connection::Ptr newConnection = Connection::create(server, io_context); - initialised = true; + acceptor.async_accept(newConnection->getSocket(), + std::bind(&TcpAcceptor::handleAccept, this, newConnection, asio::placeholders::error)); + } + void handleAccept(Connection::Ptr newConnection, const std::error_code& error); + + GdbServer& server; + asio::io_context& io_context; + asio::ip::tcp::acceptor acceptor; +}; + +class GdbServer +{ +public: + struct Error : public std::runtime_error { + Error(const char *reason) : std::runtime_error(reason) {} + }; + + void init(int port) + { + this->port = port; + EventManager::listen(Event::Resume, emuEventCallback, this); + EventManager::listen(Event::Terminate, emuEventCallback, this); } void term() { - if (!initialised) - return; - EventManager::unlisten(Event::Resume, emuEventCallback); - EventManager::unlisten(Event::Terminate, emuEventCallback); + EventManager::unlisten(Event::Resume, emuEventCallback, this); + EventManager::unlisten(Event::Terminate, emuEventCallback, this); stop(); - if (VALID(clientSocket)) - { - closesocket(clientSocket); - clientSocket = INVALID_SOCKET; - } - if (VALID(serverSocket)) - { - closesocket(serverSocket); - serverSocket = INVALID_SOCKET; - } } void run() { - if (!initialised || thread.joinable()) + if (thread.joinable()) return; DEBUG_LOG(COMMON, "GdbServer starting"); + io_context = std::make_unique(); thread = std::thread(&GdbServer::serverThread, this); if (config::GDBWaitForConnection) { @@ -109,19 +193,18 @@ class GdbServer void stop() { - if (!initialised) - return; if (thread.joinable()) { DEBUG_LOG(COMMON, "GdbServer stopping"); agent.resetAgent(); - stopRequested = true; + io_context->stop(); thread.join(); + io_context.reset(); } } bool isRunning() const { - return initialised && thread.joinable(); + return thread.joinable(); } // called on the emu thread @@ -140,69 +223,20 @@ class GdbServer void serverThread() { - while (!stopRequested) + ThreadName _("GdbServer"); + try { - fd_set fds; - FD_ZERO(&fds); - sock_t max_fd = serverSocket; - FD_SET(serverSocket, &fds); - if (VALID(clientSocket)) - { - max_fd = std::max(max_fd, clientSocket); - FD_SET(clientSocket, &fds); - } - timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 100 * 1000; - if (::select(max_fd + 1, &fds, nullptr, nullptr, &tv) > 0) - { - if (FD_ISSET(serverSocket, &fds)) - { - try { - acceptClientConnection(); - } catch (const Error& e) { - ERROR_LOG(COMMON, "%s", e.what()); - closesocket(serverSocket); - serverSocket = INVALID_SOCKET; - break; - } - } - else if (FD_ISSET(clientSocket, &fds)) - { - readCommand(); - } - } + TcpAcceptor server(*this, *io_context, port); + io_context->run(); } - if (VALID(clientSocket)) + catch (const std::exception& e) { - closesocket(clientSocket); - clientSocket = INVALID_SOCKET; + ERROR_LOG(COMMON, "Gdb server exception: %s", e.what()); } attached = false; - stopRequested = false; - } - - void acceptClientConnection() - { - if (VALID(clientSocket)) - closesocket(clientSocket); - sockaddr_in src_addr{}; - socklen_t addr_len = sizeof(src_addr); - clientSocket = ::accept(serverSocket, (sockaddr *)&src_addr, &addr_len); - if (!VALID(clientSocket)) - { - if (get_last_error() != L_EAGAIN && get_last_error() != L_EWOULDBLOCK) - throw Error("accept failed"); - } - else - { - NOTICE_LOG(NETWORK, "gdb: client connection"); - attached = true; - agentInterrupt(); - } } - void readCommand() + std::string handleCommand(const std::string& packet) { try { if (postDebugTrapNeeded) @@ -214,21 +248,21 @@ class GdbServer throw Error(e.what()); } } - std::string packet = recvPacket(); if (packet.empty()) - return; + return ""; DEBUG_LOG(NETWORK, "gdb: recv %s", packet.c_str()); + std::vector replies; switch (packet[0]) { case '!': // Enable extended mode - sendPacket("OK"); + replies.push_back("OK"); break; case '?': // Sent when connection is first established to query the reason the target halted - reportException(); + replies.push_back(reportException()); break; case 'A': // Initialized argv[] array passed into program. not supported - sendPacket("E01"); + replies.push_back("E01"); break;; case 'b': // Change the serial line speed to baud. deprecated break; @@ -236,53 +270,59 @@ class GdbServer break; case 'c': // Continue at addr, which is the address to resume. // If addr is omitted, resume at current address - sendContinue(packet); + doContinue(packet); break; case 'C': // Continue with signal sig - sendContinue(packet); + doContinue(packet); break; case 'd': // Toggle debug flag. deprecated break; case 'D': // Detach GDB from the remote system - sendPacket("OK"); + replies.push_back("OK"); agent.detach(); break; case 'F': // File-I/O protocol extension not currently supported break;; case 'g': // Read general registers - readAllRegs(); + replies.push_back(readAllRegs()); break; case 'G': // Write general registers - writeAllRegs(packet); + replies.push_back(writeAllRegs(packet)); break; case 'H': // Set thread for subsequent operations - sendPacket("OK"); + replies.push_back("OK"); break; case 'i': // Step the remote target by a single clock cycle case 'I': // Signal, then cycle step // not supported - sendPacket(""); + replies.push_back(""); break; case 'k': // Kill request. Stop process/system agent.kill(); break; case 'm': // Read length addressable memory units - readMem(packet); + replies.push_back(readMem(packet)); break; case 'M': // Write length addressable memory units - writeMem(packet); + replies.push_back(writeMem(packet)); break; case 'p': // Read the value of register - readReg(packet); + replies.push_back(readReg(packet)); break; case 'P': // Write register - writeReg(packet); + replies.push_back(writeReg(packet)); break; case 'q': // General query packets - query(packet); + { + auto v = query(packet); + replies.insert(replies.end(), v.begin(), v.end()); + } break; case 'Q': // General set packets - set(packet); + { + auto v = set(packet); + replies.insert(replies.end(), v.begin(), v.end()); + } break; case 'r': // Reset the entire system. Deprecated (use 'R' instead) break; @@ -290,52 +330,78 @@ class GdbServer restart(); break; case 's': // Single step - step(EXCEPT_NONE); + replies.push_back(step(EXCEPT_NONE)); break; case 'S': // Step with signal - step(); + replies.push_back(step()); break; case 't': // Search backwards. unsupported break; case 'T': // Find out if the thread is alive - sendPacket("OK"); + replies.push_back("OK"); break; case 'v': // 'v' packets to control execution - vpacket(packet); + { + auto v = vpacket(packet); + replies.insert(replies.end(), v.begin(), v.end()); + } break; case 'X': // Write binary data to memory - writeMemBin(packet); + replies.push_back(writeMemBin(packet)); break; case 'z': // Remove a breakpoint/watchpoint. - removeMatchpoint(packet); + replies.push_back(removeMatchpoint(packet)); break; case 'Z': // Insert a breakpoint/watchpoint. - insertMatchpoint(packet); + replies.push_back(insertMatchpoint(packet)); break; case 3: - interrupt(); + replies.push_back(interrupt()); break; default: // Unknown commands are ignored WARN_LOG(COMMON, "Unknown gdb command: %s", packet.c_str()); break;; } + std::string data; + for (const std::string& pkt : replies) + { + data.push_back('$'); + u8 checksum = 0; + for (char c : pkt) + { + if (c == '$' || c == '#' || c == '*' || c == '}') + { + c ^= 0x20; + checksum += (u8)'}'; + data.push_back('}'); + } + checksum += (u8)c; + data.push_back(c); + } + data.push_back('#'); + char s[9]; + sprintf(s, "%02x", checksum); + data += s; + } + DEBUG_LOG(NETWORK, "gdb: sent %s", data.c_str()); + + return data; } catch (const Error& e) { ERROR_LOG(COMMON, "%s", e.what()); - closesocket(clientSocket); - clientSocket = INVALID_SOCKET; attached = false; + throw e; } } - void reportException() + std::string reportException() { char s[4]; sprintf(s, "S%02X", agent.currentException()); - sendPacket(s); + return s; } - void sendContinue(const std::string& pkt) + void doContinue(const std::string& pkt) { if (pkt[0] != 'c') { WARN_LOG(COMMON, "Continue with signal not supported"); @@ -357,35 +423,34 @@ class GdbServer } } - void readAllRegs() + std::string readAllRegs() { u32 *regs; int c = agent.readAllRegs(®s); std::string outpkt; for (int i = 0; i < c; i++) outpkt += pack(regs[i]); - sendPacket(outpkt); + return outpkt; } - void writeAllRegs(const std::string& pkt) + std::string writeAllRegs(const std::string& pkt) { std::vector regs; for (auto it = pkt.begin() + 1; it <= pkt.end() - 8; it += 8) regs.push_back(unpack(&*it, 8)); agent.writeAllRegs(regs); - sendPacket("OK"); + return "OK"; } - void readMem(const std::string& pkt) + std::string readMem(const std::string& pkt) { u32 addr; u32 len; if (sscanf(pkt.c_str(), "m%x,%x:", &addr, &len) != 2) { WARN_LOG(COMMON, "readMem: invalid packet %s", pkt.c_str()); - sendPacket("E01"); - return; + return "E01"; } const u8 *mem = agent.readMem(addr, len); std::string outpkt; @@ -395,18 +460,17 @@ class GdbServer sprintf(s,"%02x", mem[i]); outpkt += s; } - sendPacket(outpkt); + return outpkt; } - void writeMem(const std::string& pkt) + std::string writeMem(const std::string& pkt) { u32 addr; u32 len; if (sscanf(pkt.c_str(), "M%x,%x:", &addr, &len) != 2) { WARN_LOG(COMMON, "writeMem: invalid packet %s", pkt.c_str()); - sendPacket("E01"); - return; + return "E01"; } std::vector data(len); const char *p = &pkt[pkt.find(':')] + 1; @@ -417,18 +481,17 @@ class GdbServer data[i] = (u8)b; } agent.writeMem(addr, data); - sendPacket("OK"); + return "OK"; } - void writeMemBin(const std::string& pkt) + std::string writeMemBin(const std::string& pkt) { u32 addr; u32 len; if (sscanf(pkt.c_str(), "X%x,%x:", &addr, &len) != 2) { WARN_LOG(COMMON, "writeMemBin invalid command: %s", pkt.c_str()); - sendPacket("E01"); - return; + return "E01"; } const char *p = &pkt[pkt.find(':')] + 1; std::vector data; @@ -443,64 +506,62 @@ class GdbServer data.push_back(b); } agent.writeMem(addr, data); - sendPacket("OK"); + return "OK"; } - void readReg(const std::string& pkt) + std::string readReg(const std::string& pkt) { u32 regNum; if (sscanf(pkt.c_str(), "p%x", ®Num) != 1) { WARN_LOG(COMMON, "readReg: invalid packet %s", pkt.c_str()); - sendPacket("E01"); - return; + return "E01"; } u32 v = agent.readReg(regNum); - sendPacket(pack(v)); + return pack(v); } - void writeReg(const std::string& pkt) + std::string writeReg(const std::string& pkt) { u32 regNum; char vstr[9]; if (sscanf(pkt.c_str(), "P%x=%8s", ®Num, vstr) != 2) { WARN_LOG(COMMON, "writeReg: invalid packet %s", pkt.c_str()); - sendPacket("E01"); - return; + return "E01"; } agent.writeReg(regNum, unpack(vstr, 8)); - sendPacket("OK"); + return "OK"; } - void query(const std::string& pkt) + std::vector query(const std::string& pkt) { if (pkt == "qC") // Return the current thread ID. 0 is "any thread" - sendPacket("QC0.01"); + return { "QC0.01" }; else if (pkt.rfind("qCRC", 0) == 0) { WARN_LOG(COMMON, "CRC compute not supported %s", pkt.c_str()); - sendPacket("E01"); + return { "E01" }; } else if (pkt == "qfThreadInfo") // Obtain a list of all active thread IDs (first call) - sendPacket("m0"); + return { "m0" }; else if (pkt == "qsThreadInfo") // Obtain a list of all active thread IDs (subsequent calls -> 'l' == end of list) - sendPacket("l"); + return { "l" }; else if (pkt.rfind("qGetTLSAddr:", 0) == 0) // Fetch the address associated with thread local storage - sendPacket(""); + return { "" }; else if (pkt.rfind("qL", 0) == 0) // Obtain thread information. deprecated - sendPacket("qM001"); + return { "qM001" }; else if (pkt == "qOffsets") // Get section offsets. Not supported - sendPacket(""); + return { "" }; else if (pkt.rfind("qP", 0) == 0) // Returns information on thread. deprecated - sendPacket(""); + return { "" }; else if (pkt.rfind("qRcmd,", 0) == 0) { std::string customCmd; @@ -533,10 +594,10 @@ class GdbServer } } *r = 0; - sendPacket(reply); + return { reply }; } else - sendPacket(""); + return { "" }; } else if (pkt.rfind("qSupported", 0) == 0) { @@ -544,43 +605,43 @@ class GdbServer // and query the stub for features it supports char qsupported[128]; snprintf(qsupported, 128, "PacketSize=%i;vContSupported+", MAX_PACKET_LEN); - sendPacket(qsupported); + return { qsupported }; } else if (pkt.rfind("qSymbol:", 0) == 0) // Notify the target that GDB is prepared to serve symbol lookup requests - sendPacket("OK"); + return { "OK" }; else if (pkt.rfind("qThreadExtraInfo,", 0) == 0) { // Obtain from the target OS a printable string description of thread attributes char s[19]; sprintf(s, "%02x%02x%02x%02x%02x%02x%02x%02x%02x", 'R', 'u', 'n', 'n', 'a', 'b', 'l', 'e', 0); - sendPacket(std::string(s, 18)); + return { std::string(s, 18) }; } else if (pkt.rfind("qXfer:", 0) == 0) // Read uninterpreted bytes from the target’s special data area identified by the keyword object - sendPacket(""); + return { "" }; else if (pkt.rfind("qAttached", 0) == 0) // Return an indication of whether the remote server attached to an existing process // or created a new process - sendPacket("1"); // existing process + return { "1" }; // existing process else if (pkt.rfind("qTfV", 0) == 0) // request data about trace state variables - sendPacket(""); + return { "" }; else if (pkt.rfind("qTfP", 0) == 0) // request data about tracepoints - sendPacket(""); + return { "" }; else if (pkt.rfind("qTStatus", 0) == 0) // Ask the stub if there is a trace experiment running right now - sendPacket(""); - else - WARN_LOG(COMMON, "query not supported %s", pkt.c_str()); + return { "" }; + WARN_LOG(COMMON, "query not supported %s", pkt.c_str()); + return {}; } - void set(const std::string& pkt) + std::vector set(const std::string& pkt) { if (pkt.rfind("QPassSignals:", 0) == 0) // Passing signals not supported - sendPacket(""); + return { "" }; else if (pkt.rfind("QTDP", 0) == 0 || pkt.rfind("QFrame", 0) == 0 || pkt.rfind("QTStart", 0) == 0 @@ -588,210 +649,184 @@ class GdbServer || pkt.rfind("QTinit", 0) == 0 || pkt.rfind("QTro", 0) == 0) // No tracepoint feature supported - sendPacket(""); - else - WARN_LOG(COMMON, "set not supported %s", pkt.c_str()); + return { "" }; + WARN_LOG(COMMON, "set not supported %s", pkt.c_str()); + return {}; } - void vpacket(const std::string& pkt) + std::vector vpacket(const std::string& pkt) { if (pkt.rfind("vAttach;", 0) == 0) - sendPacket("S05"); + return { "S05" }; else if (pkt.rfind("vCont?", 0) == 0) // supported vCont actions - (c)ontinue, (C)ontinue with signal, (s)tep, (S)tep with signal, (r)ange-step - sendPacket("vCont;c;C;s;S;t;r"); + return { "vCont;c;C;s;S;t;r" }; else if (pkt.rfind("vCont", 0) == 0) { std::string vContCmd = pkt.substr(strlen("vCont;")); + std::vector replies; switch (vContCmd[0]) { case 'c': case 'C': - sendContinue(vContCmd); - break; + doContinue(vContCmd); + return {}; case 's': - step(EXCEPT_NONE); - break; + return { step(EXCEPT_NONE) }; case 'S': - step(); + replies.push_back(step()); + [[fallthrough]]; case 'r': { u32 from, to; if (sscanf(vContCmd.c_str(), "r%x,%x", &from, &to) == 2) { - stepRange(from, to); + auto v = stepRange(from, to); + replies.insert(replies.end(), v.begin(), v.end()); } else { WARN_LOG(COMMON, "Unsupported vCont:r format %s", pkt.c_str()); - sendContinue("c"); + doContinue("c"); } - - break; + return replies; } default: WARN_LOG(COMMON, "vCont action not supported %s", pkt.c_str()); + return {}; } } else if (pkt.rfind("vFile:", 0) == 0) // not supported - sendPacket(""); + return { "" }; else if (pkt.rfind("vFlashErase:", 0) == 0) // not supported - sendPacket("E01"); + return { "E01" }; else if (pkt.rfind("vFlashWrite:", 0) == 0) // not supported - sendPacket("E01"); + return { "E01" }; else if (pkt.rfind("vFlashDone:", 0) == 0) // not supported - sendPacket("E01"); + return { "E01" }; else if (pkt.rfind("vRun;", 0) == 0) { if (pkt != "vRun;") WARN_LOG(COMMON, "unexpected vRun args ignored: %s", pkt.c_str()); agent.restart(); - sendPacket("S05"); + return { "S05" }; } else if (pkt.rfind("vKill", 0) == 0) { - sendPacket("OK"); agent.kill(); + return { "OK" }; } else { WARN_LOG(COMMON, "unknown v packet: %s", pkt.c_str()); - sendPacket(""); + return { "" }; } } - void restart() - { + void restart() { agent.restart(); } - void step(u32 what = 0) + std::string step(u32 what = 0) { try { agent.step(); - sendPacket("S05"); + return "S05"; } catch (const FlycastException& e) { throw Error(e.what()); } } - void stepRange(u32 from, u32 to) + std::vector stepRange(u32 from, u32 to) { try { - sendPacket("OK"); agent.stepRange(from, to); - sendPacket("S05"); + return { "OK", "S05" }; } catch (const FlycastException& e) { throw Error(e.what()); } } - void insertMatchpoint(const std::string& pkt) + std::string insertMatchpoint(const std::string& pkt) { u32 type; u32 addr; u32 len; if (sscanf(pkt.c_str(), "Z%1d,%x,%1d", &type, &addr, &len) != 3) { WARN_LOG(COMMON, "insertMatchpoint: unknown packet: %s", pkt.c_str()); - sendPacket("E01"); + return "E01"; } switch (type) { case DebugAgent::Breakpoint::BP_TYPE_SOFTWARE_BREAK: // soft bp if (agent.insertMatchpoint(DebugAgent::Breakpoint::BP_TYPE_SOFTWARE_BREAK, addr, len)) - sendPacket("OK"); + return "OK"; else - sendPacket("E01"); + return "E01"; break; case DebugAgent::Breakpoint::BP_TYPE_HARDWARE_BREAK: // hardware bp - sendPacket(""); + return ""; break; case DebugAgent::Breakpoint::BP_TYPE_WRITE_WATCHPOINT: // write watchpoint - sendPacket(""); + return ""; break; case DebugAgent::Breakpoint::BP_TYPE_READ_WATCHPOINT: // read watchpoint - sendPacket(""); + return ""; break; case DebugAgent::Breakpoint::BP_TYPE_ACCESS_WATCHPOINT: // access watchpoint - sendPacket(""); + return ""; break; default: - sendPacket(""); + return ""; break; } } - void removeMatchpoint(const std::string& pkt) + std::string removeMatchpoint(const std::string& pkt) { u32 type; u32 addr; u32 len; if (sscanf(pkt.c_str(), "z%1d,%x,%1d", &type, &addr, &len) != 3) { WARN_LOG(COMMON, "removeMatchpoint: unknown packet: %s", pkt.c_str()); - sendPacket("E01"); + return "E01"; } switch (type) { case 0: // soft bp if (agent.removeMatchpoint(DebugAgent::Breakpoint::BP_TYPE_SOFTWARE_BREAK, addr, len)) - sendPacket("OK"); + return "OK"; else - sendPacket("E01"); + return "E01"; break; case 1: // hardware bp - sendPacket(""); + return ""; break; case 2: // write watchpoint - sendPacket(""); + return ""; break; case 3: // read watchpoint - sendPacket(""); + return ""; break; case 4: // access watchpoint - sendPacket(""); + return ""; break; default: - sendPacket(""); + return ""; break; } } - void interrupt() + std::string interrupt() { u32 signal = agentInterrupt(); char s[10]; sprintf(s, "S%02x", signal); - sendPacket(s); - } - - char recvChar() - { - char c; - int rc = ::recv(clientSocket, &c, 1, 0); - if (rc <= 0) - throw Error("gdb: I/O error"); - return c; - } - - void sendChar(char c) - { - std::unique_lock lock(outMutex); - int rc = ::send(clientSocket, &c, 1, 0); - if (rc <= 0) - throw Error("gdb: I/O error"); - } - - u8 unpack(char c) - { - c = std::tolower(c); - if (c <= '9') - return c - '0'; - else - return c - 'a' + 10; + return s; } char packnb(u8 b) @@ -809,122 +844,109 @@ class GdbServer return s; } - std::string pack(u32 v) - { + std::string pack(u32 v) { return packb(v & 0xff) + packb((v >> 8) & 0xff) + packb((v >> 16) & 0xff) + packb((v >> 24) & 0xff); } - u32 unpack(const char *s, int l) + u32 agentInterrupt() { - u32 r = 0; - for (int i = 0; i < l && *s != '\0'; i += 2, s += 2) - { - r |= (unpack(s[0]) << 4 | unpack(s[1])) << (i * 4); + try { + return agent.interrupt(); + } catch (const FlycastException& e) { + throw Error(e.what()); } - return r; } - std::string recvPacket() - { - std::string pkt; - // look for start character ('$') or BREAK - char c = recvChar(); - if (c == 3) - return std::string("\03"); - if (c != '$') - return pkt; - - // read until '#' - u8 checksum = 0; - while (!stopRequested) - { - c = recvChar(); - if (c == '$') - { - checksum = 0; - pkt.clear(); - - continue; - } - - if (c == '#') - break; - - checksum += (u8)c; - pkt.push_back(c); - } - if (stopRequested) - { - pkt.clear(); - return pkt; - } - u8 recvchk = unpack(recvChar()) << 4; - recvchk |= unpack(recvChar()); - - // If the checksums don't match print a warning, and put the - // negative ack back to the client. Otherwise put a positive ack. - if (checksum != recvchk) - { - sendChar('-'); // Failed checksum - return ""; - } - else - { - sendChar('+'); // Successful transfer - return pkt; - } + void clientConnected() { + attached = true; + agentInterrupt(); } - void sendPacket(const std::string& pkt) - { DEBUG_LOG(NETWORK, "gdb: sending pkt"); - std::unique_lock lock(outMutex); - std::string data{'$'}; - u8 checksum = 0; - for (char c : pkt) + static void emuEventCallback(Event event, void *arg) + { + GdbServer *gdbServer = static_cast(arg); + switch (event) { - if (c == '$' || c == '#' || c == '*' || c == '}') - { - c ^= 0x20; - checksum += (u8)'}'; - data.push_back('}'); + case Event::Resume: + try { + if (!gdbServer->isRunning()) + gdbServer->run(); + } catch (const GdbServer::Error& e) { + ERROR_LOG(COMMON, "%s", e.what()); } - checksum += (u8)c; - data.push_back(c); + break; + case Event::Terminate: + gdbServer->stop(); + break; + default: + break; } - data.push_back('#'); - char s[9]; - sprintf(s, "%02x", checksum); - data += s; - DEBUG_LOG(NETWORK, "gdb: sent %s", data.c_str()); - int ret = ::send(clientSocket, data.c_str(), data.length(), 0); - if (ret < (int)data.length()) - throw Error("I/O error"); } - u32 agentInterrupt() - { - try { - return agent.interrupt(); - } catch (const FlycastException& e) { - throw Error(e.what()); - } - } - - bool initialised = false; - bool stopRequested = false; bool attached = false; bool postDebugTrapNeeded = false; - sock_t serverSocket = INVALID_SOCKET; - sock_t clientSocket = INVALID_SOCKET; std::thread thread; - std::mutex outMutex; + std::unique_ptr io_context; + int port = DEFAULT_PORT; + friend class TcpAcceptor; + friend class Connection; + public: DebugAgent agent; }; static GdbServer gdbServer; +void TcpAcceptor::handleAccept(Connection::Ptr newConnection, const std::error_code& error) +{ + if (!error) { + server.clientConnected(); + newConnection->start(); + } + start(); +} + +void Connection::handlePacket(const std::error_code& ec, size_t len) +{ + std::string msg = message.substr(0, len); + message = message.substr(len); + if (ec || len == 0) + { + // terminate the connection + if (ec != asio::error::eof && ec != asio::error::operation_aborted) + WARN_LOG(NETWORK, "Read error %s", ec.message().c_str()); + return; + } + try { + if (msg[0] == '\03') { // break + send(server.handleCommand(msg)); + return; + } + if (msg[0] != '$') { + // Ignore unexpected chars + send(""); + return; + } + u8 cksum = 0; + for (unsigned i = 1; i < len - 3; i++) + cksum += (u8)msg[i]; + if (cksum != (unpack(msg[len - 2]) << 4 | unpack(msg[len - 1]))) { + // Invalid checksum + WARN_LOG(COMMON, "Connection::handlePacket: invalid checksum: [%s]", msg.c_str()); + send("-"); + } + else { + // Positive ack + std::string reply = "+"; + reply += server.handleCommand(msg.substr(1, msg.length() - 4)); + send(reply); + } + } catch (...) { + // terminate the connection + } +} + void init(int port) { gdbServer.init(port); @@ -950,25 +972,5 @@ void subroutineReturn() gdbServer.agent.subroutineReturn(); } -static void emuEventCallback(Event event, void *) -{ - switch (event) - { - case Event::Resume: - try { - if (!gdbServer.isRunning()) - gdbServer.run(); - } catch (const GdbServer::Error& e) { - ERROR_LOG(COMMON, "%s", e.what()); - } - break; - case Event::Terminate: - gdbServer.stop(); - break; - default: - break; - } -} - } #endif diff --git a/core/deps/SDL b/core/deps/SDL index ac13ca9ab..9c821dc21 160000 --- a/core/deps/SDL +++ b/core/deps/SDL @@ -1 +1 @@ -Subproject commit ac13ca9ab691e13e8eebe9684740ddcb0d716203 +Subproject commit 9c821dc21ccbd69b2bda421fdb35cb4ae2da8f5e diff --git a/core/deps/Spout b/core/deps/Spout new file mode 160000 index 000000000..2110a918e --- /dev/null +++ b/core/deps/Spout @@ -0,0 +1 @@ +Subproject commit 2110a918e720688f3cb2118302fd153db8745ace diff --git a/core/deps/Syphon b/core/deps/Syphon new file mode 160000 index 000000000..486dd8e4e --- /dev/null +++ b/core/deps/Syphon @@ -0,0 +1 @@ +Subproject commit 486dd8e4ef3bead482ea26de99770f4389e24e37 diff --git a/core/deps/Vulkan-Headers b/core/deps/Vulkan-Headers index 9e61870ec..85c2334e9 160000 --- a/core/deps/Vulkan-Headers +++ b/core/deps/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 9e61870ecbd32514113b467e0a0c46f60ed222c7 +Subproject commit 85c2334e92e215cce34e8e0ed8b2dce4700f4a50 diff --git a/core/deps/VulkanMemoryAllocator b/core/deps/VulkanMemoryAllocator index 0e89587db..6eb62e151 160000 --- a/core/deps/VulkanMemoryAllocator +++ b/core/deps/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit 0e89587db3ebee4d463f191bd296374c5fafc8ea +Subproject commit 6eb62e1515072827db992c2befd80b71b2d04329 diff --git a/core/deps/asio b/core/deps/asio new file mode 160000 index 000000000..03ae834ed --- /dev/null +++ b/core/deps/asio @@ -0,0 +1 @@ +Subproject commit 03ae834edbace31a96157b89bf50e5ee464e5ef9 diff --git a/core/deps/chdpsr/cdipsr.cpp b/core/deps/chdpsr/cdipsr.cpp index 751570eb6..c62481a67 100644 --- a/core/deps/chdpsr/cdipsr.cpp +++ b/core/deps/chdpsr/cdipsr.cpp @@ -38,7 +38,7 @@ unsigned long track_mode; ///////////////////////////////////////////////////////////////////////////// -void CDI_read_track (FILE *fsource, image_s *image, track_s *track) +bool CDI_read_track (FILE *fsource, image_s *image, track_s *track) { unsigned char TRACK_START_MARK[10] = { 0, 0, 0x01, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF }; @@ -49,10 +49,16 @@ void CDI_read_track (FILE *fsource, image_s *image, track_s *track) fseek(fsource, 8, SEEK_CUR); // extra data (DJ 3.00.780 and up) fread(¤t_start_mark, 10, 1, fsource); - if (memcmp(TRACK_START_MARK, current_start_mark, 10)) printf( "Unsupported format: Could not find the track start mark"); + if (memcmp(TRACK_START_MARK, current_start_mark, 10)) { + printf("CDI_read_track: Unsupported format: Could not find the track start mark\n"); + return false; + } fread(¤t_start_mark, 10, 1, fsource); - if (memcmp(TRACK_START_MARK, current_start_mark, 10)) printf( "Unsupported format: Could not find the track start mark"); + if (memcmp(TRACK_START_MARK, current_start_mark, 10)) { + printf("CDI_read_track: Unsupported format: Could not find the track start mark\n"); + return false; + } fseek(fsource, 4, SEEK_CUR); fread(&track->filename_length, 1, 1, fsource); @@ -80,20 +86,25 @@ void CDI_read_track (FILE *fsource, image_s *image, track_s *track) case 1 : track->sector_size = 2336; break; case 2 : track->sector_size = 2352; break; case 4 : track->sector_size = 2448; break; - default: printf("Unsupported sector size. value %ld\n", track->sector_size_value); - break; + default: + printf("CDI_read_track: Unsupported sector size. value %ld\n", track->sector_size_value); + return false; } - if (track->mode > 2) printf( "Unsupported format: Track mode not supported"); + if (track->mode > 2) { + printf("CDI_read_track: Unsupported format: Track mode not supported\n"); + return false; + } fseek(fsource, 29, SEEK_CUR); if (image->version != CDI_V2) - { + { fseek(fsource, 5, SEEK_CUR); fread(&temp_value, 4, 1, fsource); if (temp_value == 0xffffffff) fseek(fsource, 78, SEEK_CUR); // extra data (DJ 3.00.780 and up) - } + } + return true; } @@ -104,9 +115,9 @@ void CDI_skip_next_session (FILE *fsource, image_s *image) if (image->version != CDI_V2) fseek(fsource, 1, SEEK_CUR); } -void CDI_get_tracks (FILE *fsource, image_s *image) +bool CDI_get_tracks (FILE *fsource, image_s *image) { - fread(&image->tracks, 2, 1, fsource); + return fread(&image->tracks, 2, 1, fsource) == 1; } bool CDI_init (FILE *fsource, image_s *image, const char *fsourcename) @@ -121,8 +132,9 @@ bool CDI_init (FILE *fsource, image_s *image, const char *fsourcename) } fseek(fsource, image->length-8, SEEK_SET); - fread(&image->version, 4, 1, fsource); - fread(&image->header_offset, 4, 1, fsource); + if (fread(&image->version, 4, 1, fsource) != 1 + || fread(&image->header_offset, 4, 1, fsource) != 1) + return false; if ((image->version != CDI_V2 && image->version != CDI_V3 && image->version != CDI_V35) || image->header_offset == 0) @@ -133,7 +145,7 @@ bool CDI_init (FILE *fsource, image_s *image, const char *fsourcename) return true; } -void CDI_get_sessions (FILE *fsource, image_s *image) +bool CDI_get_sessions (FILE *fsource, image_s *image) { #ifndef DEBUG_CDI if (image->version == CDI_V35) @@ -144,6 +156,6 @@ void CDI_get_sessions (FILE *fsource, image_s *image) #else fseek(fsource, 0L, SEEK_SET); #endif - fread(&image->sessions, 2, 1, fsource); + return fread(&image->sessions, 2, 1, fsource) == 1; } diff --git a/core/deps/chdpsr/cdipsr.h b/core/deps/chdpsr/cdipsr.h index fe8395d93..b485cb4ab 100644 --- a/core/deps/chdpsr/cdipsr.h +++ b/core/deps/chdpsr/cdipsr.h @@ -38,9 +38,9 @@ typedef struct track_s unsigned long ask_type(FILE *fsource, long header_position); bool CDI_init(FILE *fsource, image_s *image, const char *fsourcename); -void CDI_get_sessions(FILE *fsource, image_s *image); -void CDI_get_tracks(FILE *fsource, image_s *image); -void CDI_read_track(FILE *fsource, image_s *image, track_s *track); +bool CDI_get_sessions(FILE *fsource, image_s *image); +bool CDI_get_tracks(FILE *fsource, image_s *image); +bool CDI_read_track(FILE *fsource, image_s *image, track_s *track); void CDI_skip_next_session(FILE *fsource, image_s *image); #endif diff --git a/core/deps/discord-rpc b/core/deps/discord-rpc new file mode 160000 index 000000000..c62c34d37 --- /dev/null +++ b/core/deps/discord-rpc @@ -0,0 +1 @@ +Subproject commit c62c34d37cd90b75187a1212e13ce4145bafbdd7 diff --git a/core/deps/khronos/EGL/eglplatform.h b/core/deps/glad/include/EGL/eglplatform.h similarity index 94% rename from core/deps/khronos/EGL/eglplatform.h rename to core/deps/glad/include/EGL/eglplatform.h index 1edbafa5c..6786afd90 100644 --- a/core/deps/khronos/EGL/eglplatform.h +++ b/core/deps/glad/include/EGL/eglplatform.h @@ -64,6 +64,12 @@ typedef HDC EGLNativeDisplayType; typedef HBITMAP EGLNativePixmapType; typedef HWND EGLNativeWindowType; +#elif defined(__QNX__) + +typedef khronos_uintptr_t EGLNativeDisplayType; +typedef struct _screen_pixmap* EGLNativePixmapType; /* screen_pixmap_t */ +typedef struct _screen_window* EGLNativeWindowType; /* screen_window_t */ + #elif defined(__EMSCRIPTEN__) typedef int EGLNativeDisplayType; @@ -103,13 +109,7 @@ typedef intptr_t EGLNativeDisplayType; typedef intptr_t EGLNativePixmapType; typedef intptr_t EGLNativeWindowType; -#elif defined(__unix__) && defined(EGL_NO_X11) - -typedef void *EGLNativeDisplayType; -typedef khronos_uintptr_t EGLNativePixmapType; -typedef khronos_uintptr_t EGLNativeWindowType; - -#elif defined(__unix__) || defined(USE_X11) +#elif defined(USE_X11) /* X11 (tentative) */ #include @@ -119,6 +119,12 @@ typedef Display *EGLNativeDisplayType; typedef Pixmap EGLNativePixmapType; typedef Window EGLNativeWindowType; +#elif defined(__unix__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + #elif defined(__APPLE__) typedef int EGLNativeDisplayType; diff --git a/core/deps/khronos/KHR/khrplatform.h b/core/deps/glad/include/KHR/khrplatform.h similarity index 89% rename from core/deps/khronos/KHR/khrplatform.h rename to core/deps/glad/include/KHR/khrplatform.h index 975bbffed..01646449c 100644 --- a/core/deps/khronos/KHR/khrplatform.h +++ b/core/deps/glad/include/KHR/khrplatform.h @@ -90,12 +90,20 @@ * int arg2) KHRONOS_APIATTRIBUTES; */ +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + /*------------------------------------------------------------------------- * Definition of KHRONOS_APICALL *------------------------------------------------------------------------- * This precedes the return type of the function in the function prototype. */ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) # define KHRONOS_APICALL __declspec(dllimport) #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C @@ -145,6 +153,20 @@ typedef int64_t khronos_int64_t; typedef uint64_t khronos_uint64_t; #define KHRONOS_SUPPORT_INT64 1 #define KHRONOS_SUPPORT_FLOAT 1 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif #elif defined(__VMS ) || defined(__sgi) @@ -227,14 +249,21 @@ typedef unsigned short int khronos_uint16_t; * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears * to be the only LLP64 architecture in current use. */ -#ifdef _WIN64 +#ifdef KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) typedef signed long long int khronos_intptr_t; typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; #else typedef signed long int khronos_intptr_t; typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else typedef signed long int khronos_ssize_t; typedef unsigned long int khronos_usize_t; #endif diff --git a/core/deps/glad/include/glad/egl.h b/core/deps/glad/include/glad/egl.h new file mode 100644 index 000000000..0f12f3859 --- /dev/null +++ b/core/deps/glad/include/glad/egl.h @@ -0,0 +1,550 @@ +/** + * Loader generated by glad 2.0.4 on Sat Jan 20 11:00:00 2024 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: egl + * Extensions: 0 + * + * APIs: + * - egl=1.5 + * + * Options: + * - ALIAS = False + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = True + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='egl=1.5' --extensions='' c --loader + * + * Online: + * http://glad.sh/#api=egl%3D1.5&extensions=&generator=c&options=LOADER + * + */ + +#ifndef GLAD_EGL_H_ +#define GLAD_EGL_H_ + + +#define GLAD_EGL +#define GLAD_OPTION_EGL_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.4" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CLIENT_APIS 0x308D +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_CONTEXT_LOST 0x300E +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_NO_TEXTURE 0x305C +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SIGNALED 0x30F2 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_UNSIGNALED 0x30F3 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 + + +#include +#include + + + + + + + + + + + +struct AHardwareBuffer; +struct wl_buffer; +struct wl_display; +struct wl_resource; + +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef intptr_t EGLAttribKHR; +typedef intptr_t EGLAttrib; +typedef void *EGLClientBuffer; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDeviceEXT; +typedef void *EGLDisplay; +typedef void *EGLImage; +typedef void *EGLImageKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLStreamKHR; +typedef void *EGLSurface; +typedef void *EGLSync; +typedef void *EGLSyncKHR; +typedef void *EGLSyncNV; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; +typedef khronos_uint64_t EGLuint64KHR; +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +typedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC + + +#define EGL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_0; +#define EGL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_1; +#define EGL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_2; +#define EGL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_3; +#define EGL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_4; +#define EGL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_5; + + +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum api); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); +typedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); +typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void); +typedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id); +typedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform, void * native_display, const EGLAttrib * attrib_list); +typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay dpy); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint engine); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags); + +GLAD_API_CALL PFNEGLBINDAPIPROC glad_eglBindAPI; +#define eglBindAPI glad_eglBindAPI +GLAD_API_CALL PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage; +#define eglBindTexImage glad_eglBindTexImage +GLAD_API_CALL PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig; +#define eglChooseConfig glad_eglChooseConfig +GLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync; +#define eglClientWaitSync glad_eglClientWaitSync +GLAD_API_CALL PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers; +#define eglCopyBuffers glad_eglCopyBuffers +GLAD_API_CALL PFNEGLCREATECONTEXTPROC glad_eglCreateContext; +#define eglCreateContext glad_eglCreateContext +GLAD_API_CALL PFNEGLCREATEIMAGEPROC glad_eglCreateImage; +#define eglCreateImage glad_eglCreateImage +GLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer; +#define eglCreatePbufferFromClientBuffer glad_eglCreatePbufferFromClientBuffer +GLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface; +#define eglCreatePbufferSurface glad_eglCreatePbufferSurface +GLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface; +#define eglCreatePixmapSurface glad_eglCreatePixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface; +#define eglCreatePlatformPixmapSurface glad_eglCreatePlatformPixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface; +#define eglCreatePlatformWindowSurface glad_eglCreatePlatformWindowSurface +GLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync; +#define eglCreateSync glad_eglCreateSync +GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; +#define eglCreateWindowSurface glad_eglCreateWindowSurface +GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; +#define eglDestroyContext glad_eglDestroyContext +GLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; +#define eglDestroyImage glad_eglDestroyImage +GLAD_API_CALL PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface; +#define eglDestroySurface glad_eglDestroySurface +GLAD_API_CALL PFNEGLDESTROYSYNCPROC glad_eglDestroySync; +#define eglDestroySync glad_eglDestroySync +GLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib; +#define eglGetConfigAttrib glad_eglGetConfigAttrib +GLAD_API_CALL PFNEGLGETCONFIGSPROC glad_eglGetConfigs; +#define eglGetConfigs glad_eglGetConfigs +GLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext; +#define eglGetCurrentContext glad_eglGetCurrentContext +GLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay; +#define eglGetCurrentDisplay glad_eglGetCurrentDisplay +GLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface; +#define eglGetCurrentSurface glad_eglGetCurrentSurface +GLAD_API_CALL PFNEGLGETDISPLAYPROC glad_eglGetDisplay; +#define eglGetDisplay glad_eglGetDisplay +GLAD_API_CALL PFNEGLGETERRORPROC glad_eglGetError; +#define eglGetError glad_eglGetError +GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay; +#define eglGetPlatformDisplay glad_eglGetPlatformDisplay +GLAD_API_CALL PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress; +#define eglGetProcAddress glad_eglGetProcAddress +GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; +#define eglGetSyncAttrib glad_eglGetSyncAttrib +GLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize; +#define eglInitialize glad_eglInitialize +GLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; +#define eglMakeCurrent glad_eglMakeCurrent +GLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI; +#define eglQueryAPI glad_eglQueryAPI +GLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; +#define eglQueryContext glad_eglQueryContext +GLAD_API_CALL PFNEGLQUERYSTRINGPROC glad_eglQueryString; +#define eglQueryString glad_eglQueryString +GLAD_API_CALL PFNEGLQUERYSURFACEPROC glad_eglQuerySurface; +#define eglQuerySurface glad_eglQuerySurface +GLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage; +#define eglReleaseTexImage glad_eglReleaseTexImage +GLAD_API_CALL PFNEGLRELEASETHREADPROC glad_eglReleaseThread; +#define eglReleaseThread glad_eglReleaseThread +GLAD_API_CALL PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib; +#define eglSurfaceAttrib glad_eglSurfaceAttrib +GLAD_API_CALL PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers; +#define eglSwapBuffers glad_eglSwapBuffers +GLAD_API_CALL PFNEGLSWAPINTERVALPROC glad_eglSwapInterval; +#define eglSwapInterval glad_eglSwapInterval +GLAD_API_CALL PFNEGLTERMINATEPROC glad_eglTerminate; +#define eglTerminate glad_eglTerminate +GLAD_API_CALL PFNEGLWAITCLIENTPROC glad_eglWaitClient; +#define eglWaitClient glad_eglWaitClient +GLAD_API_CALL PFNEGLWAITGLPROC glad_eglWaitGL; +#define eglWaitGL glad_eglWaitGL +GLAD_API_CALL PFNEGLWAITNATIVEPROC glad_eglWaitNative; +#define eglWaitNative glad_eglWaitNative +GLAD_API_CALL PFNEGLWAITSYNCPROC glad_eglWaitSync; +#define eglWaitSync glad_eglWaitSync + + + + + +GLAD_API_CALL int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadEGL(EGLDisplay display, GLADloadfunc load); + +#ifdef GLAD_EGL + +GLAD_API_CALL int gladLoaderLoadEGL(EGLDisplay display); + +GLAD_API_CALL void gladLoaderUnloadEGL(void); + +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/deps/glad/include/glad/gl.h b/core/deps/glad/include/glad/gl.h new file mode 100644 index 000000000..101f63fa6 --- /dev/null +++ b/core/deps/glad/include/glad/gl.h @@ -0,0 +1,17419 @@ +/** + * Loader generated by glad 2.0.4 on Sat Jan 20 11:00:00 2024 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 835 + * + * APIs: + * - gl:compatibility=4.6 + * - gles2=3.2 + * + * Options: + * - ALIAS = False + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = False + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --merge --api='gl:compatibility=4.6,gles2=3.2' --extensions='GL_3DFX_multisample,GL_3DFX_tbuffer,GL_3DFX_texture_compression_FXT1,GL_AMD_blend_minmax_factor,GL_AMD_conservative_depth,GL_AMD_debug_output,GL_AMD_depth_clamp_separate,GL_AMD_draw_buffers_blend,GL_AMD_framebuffer_multisample_advanced,GL_AMD_framebuffer_sample_positions,GL_AMD_gcn_shader,GL_AMD_gpu_shader_half_float,GL_AMD_gpu_shader_int16,GL_AMD_gpu_shader_int64,GL_AMD_interleaved_elements,GL_AMD_multi_draw_indirect,GL_AMD_name_gen_delete,GL_AMD_occlusion_query_event,GL_AMD_performance_monitor,GL_AMD_pinned_memory,GL_AMD_query_buffer_object,GL_AMD_sample_positions,GL_AMD_seamless_cubemap_per_texture,GL_AMD_shader_atomic_counter_ops,GL_AMD_shader_ballot,GL_AMD_shader_explicit_vertex_parameter,GL_AMD_shader_gpu_shader_half_float_fetch,GL_AMD_shader_image_load_store_lod,GL_AMD_shader_stencil_export,GL_AMD_shader_trinary_minmax,GL_AMD_sparse_texture,GL_AMD_stencil_operation_extended,GL_AMD_texture_gather_bias_lod,GL_AMD_texture_texture4,GL_AMD_transform_feedback3_lines_triangles,GL_AMD_transform_feedback4,GL_AMD_vertex_shader_layer,GL_AMD_vertex_shader_tessellator,GL_AMD_vertex_shader_viewport_index,GL_APPLE_aux_depth_stencil,GL_APPLE_client_storage,GL_APPLE_element_array,GL_APPLE_fence,GL_APPLE_float_pixels,GL_APPLE_flush_buffer_range,GL_APPLE_object_purgeable,GL_APPLE_rgb_422,GL_APPLE_row_bytes,GL_APPLE_specular_vector,GL_APPLE_texture_range,GL_APPLE_transform_hint,GL_APPLE_vertex_array_object,GL_APPLE_vertex_array_range,GL_APPLE_vertex_program_evaluators,GL_APPLE_ycbcr_422,GL_ARB_ES2_compatibility,GL_ARB_ES3_1_compatibility,GL_ARB_ES3_2_compatibility,GL_ARB_ES3_compatibility,GL_ARB_arrays_of_arrays,GL_ARB_base_instance,GL_ARB_bindless_texture,GL_ARB_blend_func_extended,GL_ARB_buffer_storage,GL_ARB_cl_event,GL_ARB_clear_buffer_object,GL_ARB_clear_texture,GL_ARB_clip_control,GL_ARB_color_buffer_float,GL_ARB_compatibility,GL_ARB_compressed_texture_pixel_storage,GL_ARB_compute_shader,GL_ARB_compute_variable_group_size,GL_ARB_conditional_render_inverted,GL_ARB_conservative_depth,GL_ARB_copy_buffer,GL_ARB_copy_image,GL_ARB_cull_distance,GL_ARB_debug_output,GL_ARB_depth_buffer_float,GL_ARB_depth_clamp,GL_ARB_depth_texture,GL_ARB_derivative_control,GL_ARB_direct_state_access,GL_ARB_draw_buffers,GL_ARB_draw_buffers_blend,GL_ARB_draw_elements_base_vertex,GL_ARB_draw_indirect,GL_ARB_draw_instanced,GL_ARB_enhanced_layouts,GL_ARB_explicit_attrib_location,GL_ARB_explicit_uniform_location,GL_ARB_fragment_coord_conventions,GL_ARB_fragment_layer_viewport,GL_ARB_fragment_program,GL_ARB_fragment_program_shadow,GL_ARB_fragment_shader,GL_ARB_fragment_shader_interlock,GL_ARB_framebuffer_no_attachments,GL_ARB_framebuffer_object,GL_ARB_framebuffer_sRGB,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_get_texture_sub_image,GL_ARB_gl_spirv,GL_ARB_gpu_shader5,GL_ARB_gpu_shader_fp64,GL_ARB_gpu_shader_int64,GL_ARB_half_float_pixel,GL_ARB_half_float_vertex,GL_ARB_imaging,GL_ARB_indirect_parameters,GL_ARB_instanced_arrays,GL_ARB_internalformat_query,GL_ARB_internalformat_query2,GL_ARB_invalidate_subdata,GL_ARB_map_buffer_alignment,GL_ARB_map_buffer_range,GL_ARB_matrix_palette,GL_ARB_multi_bind,GL_ARB_multi_draw_indirect,GL_ARB_multisample,GL_ARB_multitexture,GL_ARB_occlusion_query,GL_ARB_occlusion_query2,GL_ARB_parallel_shader_compile,GL_ARB_pipeline_statistics_query,GL_ARB_pixel_buffer_object,GL_ARB_point_parameters,GL_ARB_point_sprite,GL_ARB_polygon_offset_clamp,GL_ARB_post_depth_coverage,GL_ARB_program_interface_query,GL_ARB_provoking_vertex,GL_ARB_query_buffer_object,GL_ARB_robust_buffer_access_behavior,GL_ARB_robustness,GL_ARB_robustness_isolation,GL_ARB_sample_locations,GL_ARB_sample_shading,GL_ARB_sampler_objects,GL_ARB_seamless_cube_map,GL_ARB_seamless_cubemap_per_texture,GL_ARB_separate_shader_objects,GL_ARB_shader_atomic_counter_ops,GL_ARB_shader_atomic_counters,GL_ARB_shader_ballot,GL_ARB_shader_bit_encoding,GL_ARB_shader_clock,GL_ARB_shader_draw_parameters,GL_ARB_shader_group_vote,GL_ARB_shader_image_load_store,GL_ARB_shader_image_size,GL_ARB_shader_objects,GL_ARB_shader_precision,GL_ARB_shader_stencil_export,GL_ARB_shader_storage_buffer_object,GL_ARB_shader_subroutine,GL_ARB_shader_texture_image_samples,GL_ARB_shader_texture_lod,GL_ARB_shader_viewport_layer_array,GL_ARB_shading_language_100,GL_ARB_shading_language_420pack,GL_ARB_shading_language_include,GL_ARB_shading_language_packing,GL_ARB_shadow,GL_ARB_shadow_ambient,GL_ARB_sparse_buffer,GL_ARB_sparse_texture,GL_ARB_sparse_texture2,GL_ARB_sparse_texture_clamp,GL_ARB_spirv_extensions,GL_ARB_stencil_texturing,GL_ARB_sync,GL_ARB_tessellation_shader,GL_ARB_texture_barrier,GL_ARB_texture_border_clamp,GL_ARB_texture_buffer_object,GL_ARB_texture_buffer_object_rgb32,GL_ARB_texture_buffer_range,GL_ARB_texture_compression,GL_ARB_texture_compression_bptc,GL_ARB_texture_compression_rgtc,GL_ARB_texture_cube_map,GL_ARB_texture_cube_map_array,GL_ARB_texture_env_add,GL_ARB_texture_env_combine,GL_ARB_texture_env_crossbar,GL_ARB_texture_env_dot3,GL_ARB_texture_filter_anisotropic,GL_ARB_texture_filter_minmax,GL_ARB_texture_float,GL_ARB_texture_gather,GL_ARB_texture_mirror_clamp_to_edge,GL_ARB_texture_mirrored_repeat,GL_ARB_texture_multisample,GL_ARB_texture_non_power_of_two,GL_ARB_texture_query_levels,GL_ARB_texture_query_lod,GL_ARB_texture_rectangle,GL_ARB_texture_rg,GL_ARB_texture_rgb10_a2ui,GL_ARB_texture_stencil8,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_ARB_texture_swizzle,GL_ARB_texture_view,GL_ARB_timer_query,GL_ARB_transform_feedback2,GL_ARB_transform_feedback3,GL_ARB_transform_feedback_instanced,GL_ARB_transform_feedback_overflow_query,GL_ARB_transpose_matrix,GL_ARB_uniform_buffer_object,GL_ARB_vertex_array_bgra,GL_ARB_vertex_array_object,GL_ARB_vertex_attrib_64bit,GL_ARB_vertex_attrib_binding,GL_ARB_vertex_blend,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_ARB_vertex_type_10f_11f_11f_rev,GL_ARB_vertex_type_2_10_10_10_rev,GL_ARB_viewport_array,GL_ARB_window_pos,GL_ATI_draw_buffers,GL_ATI_element_array,GL_ATI_envmap_bumpmap,GL_ATI_fragment_shader,GL_ATI_map_object_buffer,GL_ATI_meminfo,GL_ATI_pixel_format_float,GL_ATI_pn_triangles,GL_ATI_separate_stencil,GL_ATI_text_fragment_shader,GL_ATI_texture_env_combine3,GL_ATI_texture_float,GL_ATI_texture_mirror_once,GL_ATI_vertex_array_object,GL_ATI_vertex_attrib_array_object,GL_ATI_vertex_streams,GL_EXT_422_pixels,GL_EXT_EGL_image_storage,GL_EXT_EGL_sync,GL_EXT_abgr,GL_EXT_bgra,GL_EXT_bindable_uniform,GL_EXT_blend_color,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_logic_op,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_clip_volume_hint,GL_EXT_cmyka,GL_EXT_color_subtable,GL_EXT_compiled_vertex_array,GL_EXT_convolution,GL_EXT_coordinate_frame,GL_EXT_copy_texture,GL_EXT_cull_vertex,GL_EXT_debug_label,GL_EXT_debug_marker,GL_EXT_depth_bounds_test,GL_EXT_direct_state_access,GL_EXT_draw_buffers2,GL_EXT_draw_instanced,GL_EXT_draw_range_elements,GL_EXT_external_buffer,GL_EXT_fog_coord,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_blit_layers,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_multisample_blit_scaled,GL_EXT_framebuffer_object,GL_EXT_framebuffer_sRGB,GL_EXT_geometry_shader4,GL_EXT_gpu_program_parameters,GL_EXT_gpu_shader4,GL_EXT_histogram,GL_EXT_index_array_formats,GL_EXT_index_func,GL_EXT_index_material,GL_EXT_index_texture,GL_EXT_light_texture,GL_EXT_memory_object,GL_EXT_memory_object_fd,GL_EXT_memory_object_win32,GL_EXT_misc_attribute,GL_EXT_multi_draw_arrays,GL_EXT_multisample,GL_EXT_multiview_tessellation_geometry_shader,GL_EXT_multiview_texture_multisample,GL_EXT_multiview_timer_query,GL_EXT_packed_depth_stencil,GL_EXT_packed_float,GL_EXT_packed_pixels,GL_EXT_paletted_texture,GL_EXT_pixel_buffer_object,GL_EXT_pixel_transform,GL_EXT_pixel_transform_color_table,GL_EXT_point_parameters,GL_EXT_polygon_offset,GL_EXT_polygon_offset_clamp,GL_EXT_post_depth_coverage,GL_EXT_provoking_vertex,GL_EXT_raster_multisample,GL_EXT_rescale_normal,GL_EXT_secondary_color,GL_EXT_semaphore,GL_EXT_semaphore_fd,GL_EXT_semaphore_win32,GL_EXT_separate_shader_objects,GL_EXT_separate_specular_color,GL_EXT_shader_framebuffer_fetch,GL_EXT_shader_framebuffer_fetch_non_coherent,GL_EXT_shader_image_load_formatted,GL_EXT_shader_image_load_store,GL_EXT_shader_integer_mix,GL_EXT_shader_samples_identical,GL_EXT_shadow_funcs,GL_EXT_shared_texture_palette,GL_EXT_sparse_texture2,GL_EXT_stencil_clear_tag,GL_EXT_stencil_two_side,GL_EXT_stencil_wrap,GL_EXT_subtexture,GL_EXT_texture,GL_EXT_texture3D,GL_EXT_texture_array,GL_EXT_texture_buffer_object,GL_EXT_texture_compression_latc,GL_EXT_texture_compression_rgtc,GL_EXT_texture_compression_s3tc,GL_EXT_texture_cube_map,GL_EXT_texture_env_add,GL_EXT_texture_env_combine,GL_EXT_texture_env_dot3,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_filter_minmax,GL_EXT_texture_integer,GL_EXT_texture_lod_bias,GL_EXT_texture_mirror_clamp,GL_EXT_texture_object,GL_EXT_texture_perturb_normal,GL_EXT_texture_sRGB,GL_EXT_texture_sRGB_R8,GL_EXT_texture_sRGB_RG8,GL_EXT_texture_sRGB_decode,GL_EXT_texture_shadow_lod,GL_EXT_texture_shared_exponent,GL_EXT_texture_snorm,GL_EXT_texture_storage,GL_EXT_texture_swizzle,GL_EXT_timer_query,GL_EXT_transform_feedback,GL_EXT_vertex_array,GL_EXT_vertex_array_bgra,GL_EXT_vertex_attrib_64bit,GL_EXT_vertex_shader,GL_EXT_vertex_weighting,GL_EXT_win32_keyed_mutex,GL_EXT_window_rectangles,GL_EXT_x11_sync_object,GL_GREMEDY_frame_terminator,GL_GREMEDY_string_marker,GL_HP_convolution_border_modes,GL_HP_image_transform,GL_HP_occlusion_test,GL_HP_texture_lighting,GL_IBM_cull_vertex,GL_IBM_multimode_draw_arrays,GL_IBM_rasterpos_clip,GL_IBM_static_data,GL_IBM_texture_mirrored_repeat,GL_IBM_vertex_array_lists,GL_INGR_blend_func_separate,GL_INGR_color_clamp,GL_INGR_interlace_read,GL_INTEL_blackhole_render,GL_INTEL_conservative_rasterization,GL_INTEL_fragment_shader_ordering,GL_INTEL_framebuffer_CMAA,GL_INTEL_map_texture,GL_INTEL_parallel_arrays,GL_INTEL_performance_query,GL_KHR_blend_equation_advanced,GL_KHR_blend_equation_advanced_coherent,GL_KHR_context_flush_control,GL_KHR_debug,GL_KHR_no_error,GL_KHR_parallel_shader_compile,GL_KHR_robust_buffer_access_behavior,GL_KHR_robustness,GL_KHR_shader_subgroup,GL_KHR_texture_compression_astc_hdr,GL_KHR_texture_compression_astc_ldr,GL_KHR_texture_compression_astc_sliced_3d,GL_MESAX_texture_stack,GL_MESA_framebuffer_flip_x,GL_MESA_framebuffer_flip_y,GL_MESA_framebuffer_swap_xy,GL_MESA_pack_invert,GL_MESA_program_binary_formats,GL_MESA_resize_buffers,GL_MESA_shader_integer_functions,GL_MESA_tile_raster_order,GL_MESA_window_pos,GL_MESA_ycbcr_texture,GL_NVX_blend_equation_advanced_multi_draw_buffers,GL_NVX_conditional_render,GL_NVX_gpu_memory_info,GL_NVX_gpu_multicast2,GL_NVX_linked_gpu_multicast,GL_NVX_progress_fence,GL_NV_alpha_to_coverage_dither_control,GL_NV_bindless_multi_draw_indirect,GL_NV_bindless_multi_draw_indirect_count,GL_NV_bindless_texture,GL_NV_blend_equation_advanced,GL_NV_blend_equation_advanced_coherent,GL_NV_blend_minmax_factor,GL_NV_blend_square,GL_NV_clip_space_w_scaling,GL_NV_command_list,GL_NV_compute_program5,GL_NV_compute_shader_derivatives,GL_NV_conditional_render,GL_NV_conservative_raster,GL_NV_conservative_raster_dilate,GL_NV_conservative_raster_pre_snap,GL_NV_conservative_raster_pre_snap_triangles,GL_NV_conservative_raster_underestimation,GL_NV_copy_depth_to_color,GL_NV_copy_image,GL_NV_deep_texture3D,GL_NV_depth_buffer_float,GL_NV_depth_clamp,GL_NV_draw_texture,GL_NV_draw_vulkan_image,GL_NV_evaluators,GL_NV_explicit_multisample,GL_NV_fence,GL_NV_fill_rectangle,GL_NV_float_buffer,GL_NV_fog_distance,GL_NV_fragment_coverage_to_color,GL_NV_fragment_program,GL_NV_fragment_program2,GL_NV_fragment_program4,GL_NV_fragment_program_option,GL_NV_fragment_shader_barycentric,GL_NV_fragment_shader_interlock,GL_NV_framebuffer_mixed_samples,GL_NV_framebuffer_multisample_coverage,GL_NV_geometry_program4,GL_NV_geometry_shader4,GL_NV_geometry_shader_passthrough,GL_NV_gpu_multicast,GL_NV_gpu_program4,GL_NV_gpu_program5,GL_NV_gpu_program5_mem_extended,GL_NV_gpu_shader5,GL_NV_half_float,GL_NV_internalformat_sample_query,GL_NV_light_max_exponent,GL_NV_memory_attachment,GL_NV_memory_object_sparse,GL_NV_mesh_shader,GL_NV_multisample_coverage,GL_NV_multisample_filter_hint,GL_NV_occlusion_query,GL_NV_packed_depth_stencil,GL_NV_parameter_buffer_object,GL_NV_parameter_buffer_object2,GL_NV_path_rendering,GL_NV_path_rendering_shared_edge,GL_NV_pixel_data_range,GL_NV_point_sprite,GL_NV_present_video,GL_NV_primitive_restart,GL_NV_primitive_shading_rate,GL_NV_query_resource,GL_NV_query_resource_tag,GL_NV_register_combiners,GL_NV_register_combiners2,GL_NV_representative_fragment_test,GL_NV_robustness_video_memory_purge,GL_NV_sample_locations,GL_NV_sample_mask_override_coverage,GL_NV_scissor_exclusive,GL_NV_shader_atomic_counters,GL_NV_shader_atomic_float,GL_NV_shader_atomic_float64,GL_NV_shader_atomic_fp16_vector,GL_NV_shader_atomic_int64,GL_NV_shader_buffer_load,GL_NV_shader_buffer_store,GL_NV_shader_storage_buffer_object,GL_NV_shader_subgroup_partitioned,GL_NV_shader_texture_footprint,GL_NV_shader_thread_group,GL_NV_shader_thread_shuffle,GL_NV_shading_rate_image,GL_NV_stereo_view_rendering,GL_NV_tessellation_program5,GL_NV_texgen_emboss,GL_NV_texgen_reflection,GL_NV_texture_barrier,GL_NV_texture_compression_vtc,GL_NV_texture_env_combine4,GL_NV_texture_expand_normal,GL_NV_texture_multisample,GL_NV_texture_rectangle,GL_NV_texture_rectangle_compressed,GL_NV_texture_shader,GL_NV_texture_shader2,GL_NV_texture_shader3,GL_NV_timeline_semaphore,GL_NV_transform_feedback,GL_NV_transform_feedback2,GL_NV_uniform_buffer_std430_layout,GL_NV_uniform_buffer_unified_memory,GL_NV_vdpau_interop,GL_NV_vdpau_interop2,GL_NV_vertex_array_range,GL_NV_vertex_array_range2,GL_NV_vertex_attrib_integer_64bit,GL_NV_vertex_buffer_unified_memory,GL_NV_vertex_program,GL_NV_vertex_program1_1,GL_NV_vertex_program2,GL_NV_vertex_program2_option,GL_NV_vertex_program3,GL_NV_vertex_program4,GL_NV_video_capture,GL_NV_viewport_array2,GL_NV_viewport_swizzle,GL_OES_byte_coordinates,GL_OES_compressed_paletted_texture,GL_OES_fixed_point,GL_OES_query_matrix,GL_OES_read_format,GL_OES_single_precision,GL_OML_interlace,GL_OML_resample,GL_OML_subsample,GL_OVR_multiview,GL_OVR_multiview2,GL_PGI_misc_hints,GL_PGI_vertex_hints,GL_REND_screen_coordinates,GL_S3_s3tc,GL_SGIS_detail_texture,GL_SGIS_fog_function,GL_SGIS_generate_mipmap,GL_SGIS_multisample,GL_SGIS_pixel_texture,GL_SGIS_point_line_texgen,GL_SGIS_point_parameters,GL_SGIS_sharpen_texture,GL_SGIS_texture4D,GL_SGIS_texture_border_clamp,GL_SGIS_texture_color_mask,GL_SGIS_texture_edge_clamp,GL_SGIS_texture_filter4,GL_SGIS_texture_lod,GL_SGIS_texture_select,GL_SGIX_async,GL_SGIX_async_histogram,GL_SGIX_async_pixel,GL_SGIX_blend_alpha_minmax,GL_SGIX_calligraphic_fragment,GL_SGIX_clipmap,GL_SGIX_convolution_accuracy,GL_SGIX_depth_pass_instrument,GL_SGIX_depth_texture,GL_SGIX_flush_raster,GL_SGIX_fog_offset,GL_SGIX_fragment_lighting,GL_SGIX_framezoom,GL_SGIX_igloo_interface,GL_SGIX_instruments,GL_SGIX_interlace,GL_SGIX_ir_instrument1,GL_SGIX_list_priority,GL_SGIX_pixel_texture,GL_SGIX_pixel_tiles,GL_SGIX_polynomial_ffd,GL_SGIX_reference_plane,GL_SGIX_resample,GL_SGIX_scalebias_hint,GL_SGIX_shadow,GL_SGIX_shadow_ambient,GL_SGIX_sprite,GL_SGIX_subsample,GL_SGIX_tag_sample_buffer,GL_SGIX_texture_add_env,GL_SGIX_texture_coordinate_clamp,GL_SGIX_texture_lod_bias,GL_SGIX_texture_multi_buffer,GL_SGIX_texture_scale_bias,GL_SGIX_vertex_preclip,GL_SGIX_ycrcb,GL_SGIX_ycrcb_subsample,GL_SGIX_ycrcba,GL_SGI_color_matrix,GL_SGI_color_table,GL_SGI_texture_color_table,GL_SUNX_constant_data,GL_SUN_convolution_border_modes,GL_SUN_global_alpha,GL_SUN_mesh_array,GL_SUN_slice_accum,GL_SUN_triangle_list,GL_SUN_vertex,GL_WIN_phong_shading,GL_WIN_specular_fog,GL_AMD_compressed_3DC_texture,GL_AMD_compressed_ATC_texture,GL_AMD_program_binary_Z400,GL_ANDROID_extension_pack_es31a,GL_ANGLE_depth_texture,GL_ANGLE_framebuffer_blit,GL_ANGLE_framebuffer_multisample,GL_ANGLE_instanced_arrays,GL_ANGLE_pack_reverse_row_order,GL_ANGLE_program_binary,GL_ANGLE_texture_compression_dxt3,GL_ANGLE_texture_compression_dxt5,GL_ANGLE_texture_usage,GL_ANGLE_translated_shader_source,GL_APPLE_clip_distance,GL_APPLE_color_buffer_packed_float,GL_APPLE_copy_texture_levels,GL_APPLE_framebuffer_multisample,GL_APPLE_sync,GL_APPLE_texture_format_BGRA8888,GL_APPLE_texture_max_level,GL_APPLE_texture_packed_float,GL_ARM_mali_program_binary,GL_ARM_mali_shader_binary,GL_ARM_rgba8,GL_ARM_shader_core_properties,GL_ARM_shader_framebuffer_fetch,GL_ARM_shader_framebuffer_fetch_depth_stencil,GL_ARM_texture_unnormalized_coordinates,GL_DMP_program_binary,GL_DMP_shader_binary,GL_EXT_EGL_image_array,GL_EXT_EGL_image_storage_compression,GL_EXT_YUV_target,GL_EXT_base_instance,GL_EXT_blend_func_extended,GL_EXT_buffer_storage,GL_EXT_clear_texture,GL_EXT_clip_control,GL_EXT_clip_cull_distance,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_conservative_depth,GL_EXT_copy_image,GL_EXT_depth_clamp,GL_EXT_discard_framebuffer,GL_EXT_disjoint_timer_query,GL_EXT_draw_buffers,GL_EXT_draw_buffers_indexed,GL_EXT_draw_elements_base_vertex,GL_EXT_draw_transform_feedback,GL_EXT_float_blend,GL_EXT_fragment_shading_rate,GL_EXT_geometry_point_size,GL_EXT_geometry_shader,GL_EXT_gpu_shader5,GL_EXT_instanced_arrays,GL_EXT_map_buffer_range,GL_EXT_multi_draw_indirect,GL_EXT_multisampled_compatibility,GL_EXT_multisampled_render_to_texture,GL_EXT_multisampled_render_to_texture2,GL_EXT_multiview_draw_buffers,GL_EXT_occlusion_query_boolean,GL_EXT_primitive_bounding_box,GL_EXT_protected_textures,GL_EXT_pvrtc_sRGB,GL_EXT_read_format_bgra,GL_EXT_render_snorm,GL_EXT_robustness,GL_EXT_sRGB,GL_EXT_sRGB_write_control,GL_EXT_separate_depth_stencil,GL_EXT_shader_group_vote,GL_EXT_shader_implicit_conversions,GL_EXT_shader_io_blocks,GL_EXT_shader_non_constant_global_initializers,GL_EXT_shader_pixel_local_storage,GL_EXT_shader_pixel_local_storage2,GL_EXT_shader_texture_lod,GL_EXT_shadow_samplers,GL_EXT_sparse_texture,GL_EXT_tessellation_point_size,GL_EXT_tessellation_shader,GL_EXT_texture_border_clamp,GL_EXT_texture_buffer,GL_EXT_texture_compression_astc_decode_mode,GL_EXT_texture_compression_bptc,GL_EXT_texture_compression_dxt1,GL_EXT_texture_compression_s3tc_srgb,GL_EXT_texture_cube_map_array,GL_EXT_texture_format_BGRA8888,GL_EXT_texture_format_sRGB_override,GL_EXT_texture_mirror_clamp_to_edge,GL_EXT_texture_norm16,GL_EXT_texture_query_lod,GL_EXT_texture_rg,GL_EXT_texture_storage_compression,GL_EXT_texture_type_2_10_10_10_REV,GL_EXT_texture_view,GL_EXT_unpack_subimage,GL_FJ_shader_binary_GCCSO,GL_IMG_bindless_texture,GL_IMG_framebuffer_downsample,GL_IMG_multisampled_render_to_texture,GL_IMG_program_binary,GL_IMG_read_format,GL_IMG_shader_binary,GL_IMG_texture_compression_pvrtc,GL_IMG_texture_compression_pvrtc2,GL_IMG_texture_filter_cubic,GL_MESA_bgra,GL_MESA_sampler_objects,GL_NV_copy_buffer,GL_NV_coverage_sample,GL_NV_depth_nonlinear,GL_NV_draw_buffers,GL_NV_draw_instanced,GL_NV_explicit_attrib_location,GL_NV_fbo_color_attachments,GL_NV_framebuffer_blit,GL_NV_framebuffer_multisample,GL_NV_generate_mipmap_sRGB,GL_NV_image_formats,GL_NV_instanced_arrays,GL_NV_non_square_matrices,GL_NV_pack_subimage,GL_NV_pixel_buffer_object,GL_NV_polygon_mode,GL_NV_read_buffer,GL_NV_read_buffer_front,GL_NV_read_depth,GL_NV_read_depth_stencil,GL_NV_read_stencil,GL_NV_sRGB_formats,GL_NV_shader_noperspective_interpolation,GL_NV_shadow_samplers_array,GL_NV_shadow_samplers_cube,GL_NV_texture_border_clamp,GL_NV_texture_compression_s3tc_update,GL_NV_texture_npot_2D_mipmap,GL_NV_viewport_array,GL_OES_EGL_image,GL_OES_EGL_image_external,GL_OES_EGL_image_external_essl3,GL_OES_compressed_ETC1_RGB8_sub_texture,GL_OES_compressed_ETC1_RGB8_texture,GL_OES_copy_image,GL_OES_depth24,GL_OES_depth32,GL_OES_depth_texture,GL_OES_draw_buffers_indexed,GL_OES_draw_elements_base_vertex,GL_OES_element_index_uint,GL_OES_fbo_render_mipmap,GL_OES_fragment_precision_high,GL_OES_geometry_point_size,GL_OES_geometry_shader,GL_OES_get_program_binary,GL_OES_gpu_shader5,GL_OES_mapbuffer,GL_OES_packed_depth_stencil,GL_OES_primitive_bounding_box,GL_OES_required_internalformat,GL_OES_rgb8_rgba8,GL_OES_sample_shading,GL_OES_sample_variables,GL_OES_shader_image_atomic,GL_OES_shader_io_blocks,GL_OES_shader_multisample_interpolation,GL_OES_standard_derivatives,GL_OES_stencil1,GL_OES_stencil4,GL_OES_surfaceless_context,GL_OES_tessellation_point_size,GL_OES_tessellation_shader,GL_OES_texture_3D,GL_OES_texture_border_clamp,GL_OES_texture_buffer,GL_OES_texture_compression_astc,GL_OES_texture_cube_map_array,GL_OES_texture_float,GL_OES_texture_float_linear,GL_OES_texture_half_float,GL_OES_texture_half_float_linear,GL_OES_texture_npot,GL_OES_texture_stencil8,GL_OES_texture_storage_multisample_2d_array,GL_OES_texture_view,GL_OES_vertex_array_object,GL_OES_vertex_half_float,GL_OES_vertex_type_10_10_10_2,GL_OES_viewport_array,GL_OVR_multiview_multisampled_render_to_texture,GL_QCOM_YUV_texture_gather,GL_QCOM_alpha_test,GL_QCOM_binning_control,GL_QCOM_driver_control,GL_QCOM_extended_get,GL_QCOM_extended_get2,GL_QCOM_frame_extrapolation,GL_QCOM_framebuffer_foveated,GL_QCOM_motion_estimation,GL_QCOM_perfmon_global_mode,GL_QCOM_render_sRGB_R8_RG8,GL_QCOM_render_shared_exponent,GL_QCOM_shader_framebuffer_fetch_noncoherent,GL_QCOM_shader_framebuffer_fetch_rate,GL_QCOM_shading_rate,GL_QCOM_texture_foveated,GL_QCOM_texture_foveated2,GL_QCOM_texture_foveated_subsampled_layout,GL_QCOM_texture_lod_bias,GL_QCOM_tiled_rendering,GL_QCOM_writeonly_rendering,GL_VIV_shader_binary' c + * + * Online: + * http://glad.sh/#api=gl%3Acompatibility%3D4.6%2Cgles2%3D3.2&generator=c&options=MERGE + * + */ + +#ifndef GLAD_GL_H_ +#define GLAD_GL_H_ + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif +#ifdef __gl_h_ + #error OpenGL (gl.h) header already included (API: gl), remove previous include! +#endif +#define __gl_h_ 1 +#ifdef __gl3_h_ + #error OpenGL (gl3.h) header already included (API: gl), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __glext_h_ + #error OpenGL (glext.h) header already included (API: gl), remove previous include! +#endif +#define __glext_h_ 1 +#ifdef __gl3ext_h_ + #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! +#endif +#define __gl3ext_h_ 1 +#ifdef __gl2_h_ + #error OpenGL ES 2 header already included (API: gles2), remove previous include! +#endif +#define __gl2_h_ 1 +#ifdef __gles2_gl2_h_ + #error OpenGL ES 2 header already included (API: gles2), remove previous include! +#endif +#define __gles2_gl2_h_ 1 +#ifdef __gles2_gl3_h_ + #error OpenGL ES 3 header already included (API: gles2), remove previous include! +#endif +#define __gles2_gl3_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#define GLAD_GL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.4" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GL_1PASS_EXT 0x80A1 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2D 0x0600 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_2_BYTES 0x1407 +#define GL_2_BYTES_NV 0x1407 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_3_BYTES 0x1408 +#define GL_3_BYTES_NV 0x1408 +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_EXT 0x80CC +#define GL_422_REV_AVERAGE_EXT 0x80CF +#define GL_422_REV_EXT 0x80CD +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_4_BYTES 0x1409 +#define GL_4_BYTES_NV 0x1409 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_ABGR_EXT 0x8000 +#define GL_ACCUM 0x0100 +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_ADD 0x0104 +#define GL_ADD_ATI 0x8963 +#define GL_ADD_SIGNED 0x8574 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_ALPHA 0x1906 +#define GL_ALPHA12 0x803D +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16 0x803E +#define GL_ALPHA16F_ARB 0x881C +#define GL_ALPHA16F_EXT 0x881C +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_ALPHA16_EXT 0x803E +#define GL_ALPHA16_SNORM 0x9018 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_ALPHA4 0x803B +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA8_SNORM 0x9014 +#define GL_ALPHA_BIAS 0x0D1D +#define GL_ALPHA_BITS 0x0D55 +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#define GL_ALPHA_MAX_SGIX 0x8321 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_REF_COMMAND_NV 0x000F +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_SNORM 0x9010 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +#define GL_ALREADY_SIGNALED 0x911A +#define GL_ALWAYS 0x0207 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_AMBIENT 0x1200 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_AND 0x1501 +#define GL_AND_INVERTED 0x1504 +#define GL_AND_REVERSE 0x1502 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_ARC_TO_NV 0xFE +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +#define GL_ARRAY_SIZE 0x92FB +#define GL_ARRAY_STRIDE 0x92FE +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_ASYNC_MARKER_SGIX 0x8329 +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ATTENUATION_EXT 0x834D +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_AUX_BUFFERS 0x0C00 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#define GL_AVERAGE_EXT 0x8335 +#define GL_AVERAGE_HP 0x8160 +#define GL_BACK 0x0405 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_RIGHT 0x0403 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_BEVEL_NV 0x90A6 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_BGRA8_EXT 0x93A1 +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA_INTEGER 0x8D9B +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_BGR_EXT 0x80E0 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BITMAP 0x1A00 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#define GL_BLEND 0x0BE2 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_COLOR_COMMAND_NV 0x000B +#define GL_BLEND_COLOR_EXT 0x8005 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#define GL_BLEND_EQUATION_EXT 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLOCK_INDEX 0x92FD +#define GL_BLUE 0x1905 +#define GL_BLUE_BIAS 0x0D1B +#define GL_BLUE_BITS 0x0D54 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_BLUE_NV 0x1905 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BOLD_BIT_NV 0x01 +#define GL_BOOL 0x8B56 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_BUFFER 0x82E0 +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_BUFFER_USAGE 0x8765 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_TARGET_ATI 0x877C +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_BYTE 0x1400 +#define GL_C3F_V3F 0x2A24 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_CCW 0x0901 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_CLAMP 0x2900 +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLEAR 0x1500 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_CMYKA_EXT 0x800D +#define GL_CMYK_EXT 0x800C +#define GL_CND0_ATI 0x896B +#define GL_CND_ATI 0x896A +#define GL_COEFF 0x0A00 +#define GL_COLOR 0x1800 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_COLORBURN_KHR 0x929A +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_COLOR_ARRAY 0x8076 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_COLOR_ENCODING 0x8296 +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#define GL_COLOR_INDEX 0x1900 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEXES 0x1603 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_COLOR_SUM 0x8458 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_COLOR_TABLE 0x80D0 +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMBINE 0x8570 +#define GL_COMBINE4_NV 0x8503 +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_COMBINE_ALPHA 0x8572 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPLETION_STATUS_ARB 0x91B1 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_CONDITION_SATISFIED 0x911C +#define GL_CONFORMANT_NV 0x9374 +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_CONJOINT_NV 0x9284 +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_CONSTANT 0x8576 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_CONSTANT_ARB 0x8576 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_CONSTANT_EXT 0x8576 +#define GL_CONSTANT_NV 0x8576 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_CONTEXT_LOST 0x0507 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#define GL_CONTINUOUS_AMD 0x9007 +#define GL_CONTRAST_NV 0x92A1 +#define GL_CONVEX_HULL_NV 0x908B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_2_ATI 0x8943 +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_COORD_REPLACE 0x8862 +#define GL_COORD_REPLACE_ARB 0x8862 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_CUBIC_EXT 0x8334 +#define GL_CUBIC_HP 0x815F +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_CULL_MODES_NV 0x86E0 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_IBM 103050 +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_CURRENT_BIT 0x00000001 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_QUERY 0x8865 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_CW 0x0900 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +#define GL_DARKEN_KHR 0x9297 +#define GL_DARKEN_NV 0x9297 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DECAL 0x2101 +#define GL_DECODE_EXT 0x8A49 +#define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DECR_WRAP_EXT 0x8508 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_DELETE_STATUS 0x8B80 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DEPTH 0x1801 +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_DEPTH_BIAS 0x0D1F +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +#define GL_DEPTH_CLAMP 0x864F +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_NV 0x864F +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DIFFERENCE_KHR 0x929E +#define GL_DIFFERENCE_NV 0x929E +#define GL_DIFFUSE 0x1201 +#define GL_DISCARD_ATI 0x8763 +#define GL_DISCARD_NV 0x8530 +#define GL_DISCRETE_AMD 0x9006 +#define GL_DISJOINT_NV 0x9283 +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_DISPLAY_LIST 0x82E7 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#define GL_DITHER 0x0BD0 +#define GL_DOMAIN 0x0A02 +#define GL_DONT_CARE 0x1100 +#define GL_DOT2_ADD_ATI 0x896C +#define GL_DOT3_ATI 0x8966 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_DOT3_RGBA_ARB 0x86AF +#define GL_DOT3_RGBA_EXT 0x8741 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT4_ATI 0x8967 +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_DOUBLE 0x140A +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_DSDT_NV 0x86F5 +#define GL_DST_ALPHA 0x0304 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_COLOR 0x0306 +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_BIAS_NV 0x8717 +#define GL_DT_SCALE_NV 0x8711 +#define GL_DU8DV8_ATI 0x877A +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_DUDV_ATI 0x8779 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_DYNAMIC_COPY_ARB 0x88EA +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_EDGE_FLAG 0x0B43 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_MAP_NV 0x855F +#define GL_EMISSION 0x1600 +#define GL_ENABLE_BIT 0x00002000 +#define GL_EQUAL 0x0202 +#define GL_EQUIV 0x1509 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_BIT 0x00010000 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXTENSIONS 0x1F03 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_EYE_PLANE 0x2502 +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_EYE_RADIAL_NV 0x855B +#define GL_E_TIMES_F_NV 0x8531 +#define GL_FACTOR_MAX_AMD 0x901D +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FAILURE_NV 0x9030 +#define GL_FALSE 0 +#define GL_FASTEST 0x1101 +#define GL_FEEDBACK 0x1C01 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_FENCE_APPLE 0x8A0B +#define GL_FENCE_CONDITION_NV 0x84F4 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FIELDS_NV 0x8E27 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FILE_NAME_NV 0x9074 +#define GL_FILL 0x1B02 +#define GL_FILL_RECTANGLE_NV 0x933C +#define GL_FILTER 0x829A +#define GL_FILTER4_SGIS 0x8146 +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_FIXED 0x140C +#define GL_FIXED_OES 0x140C +#define GL_FIXED_ONLY 0x891D +#define GL_FIXED_ONLY_ARB 0x891D +#define GL_FLAT 0x1D00 +#define GL_FLOAT 0x1406 +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4 0x8B5C +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_FOG 0x0B60 +#define GL_FOG_BIT 0x00000080 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_COORD 0x8451 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_FOG_END 0x0B64 +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_HINT 0x0C54 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#define GL_FOG_START 0x0B63 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_FRAGMENT_INPUT_NV 0x936D +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAME_NV 0x8E26 +#define GL_FRONT 0x0404 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_FRONT_FACE 0x0B46 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEQUAL 0x0206 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GREATER 0x0204 +#define GL_GREEN 0x1904 +#define GL_GREEN_BIAS 0x0D19 +#define GL_GREEN_BITS 0x0D53 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_GREEN_NV 0x1904 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_HALF_APPLE 0x140B +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_HALF_FLOAT 0x140B +#define GL_HALF_FLOAT_ARB 0x140B +#define GL_HALF_FLOAT_NV 0x140B +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_HARDLIGHT_KHR 0x929B +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_HIGH_INT 0x8DF5 +#define GL_HILO16_NV 0x86F8 +#define GL_HILO8_NV 0x885E +#define GL_HILO_NV 0x86F4 +#define GL_HINT_BIT 0x00008000 +#define GL_HISTOGRAM 0x8024 +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_SINK 0x802D +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HI_BIAS_NV 0x8714 +#define GL_HI_SCALE_NV 0x870E +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_IDENTITY_NV 0x862A +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_INDEX 0x8222 +#define GL_INDEX_ARRAY 0x8077 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_BITS 0x0D51 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +#define GL_INT 0x1404 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_ARB 0x140E +#define GL_INT64_NV 0x140E +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16 0x804D +#define GL_INTENSITY16F_ARB 0x881D +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_INTENSITY16_EXT 0x804D +#define GL_INTENSITY16_SNORM 0x901B +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_INGR 0x8568 +#define GL_INTERLACE_READ_OML 0x8981 +#define GL_INTERLACE_SGIX 0x8094 +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERPOLATE 0x8575 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_INVALID_OPERATION 0x0502 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_INVARIANT_EXT 0x87C2 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVERSE_NV 0x862B +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_INVERT 0x150A +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#define GL_ISOLINES 0x8E7A +#define GL_IS_PER_PATCH 0x92E7 +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_KEEP 0x1E00 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_LAYER_NV 0x8DAA +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LEFT 0x0406 +#define GL_LEQUAL 0x0203 +#define GL_LERP_ATI 0x8969 +#define GL_LESS 0x0201 +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LINE 0x1B01 +#define GL_LINEAR 0x2601 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_LINES 0x0001 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_BIT 0x00000004 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_TO_NV 0x04 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_COMMAND_NV 0x000D +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINK_STATUS 0x8B82 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_BIT 0x00020000 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 +#define GL_LIST_PRIORITY_SGIX 0x8182 +#define GL_LOAD 0x0101 +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_EXT 0x87C4 +#define GL_LOCATION 0x930E +#define GL_LOCATION_COMPONENT 0x934A +#define GL_LOCATION_INDEX 0x930F +#define GL_LOGIC_OP 0x0BF1 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_LOW_INT 0x8DF3 +#define GL_LO_BIAS_NV 0x8715 +#define GL_LO_SCALE_NV 0x870F +#define GL_LUID_SIZE_EXT 8 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_MAD_ATI 0x8968 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_MAJOR_VERSION 0x821B +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP2_BINORMAL_EXT 0x8447 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_STENCIL 0x0D11 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX7_NV 0x8637 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX_EXT 0x87C0 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MATRIX_STRIDE 0x92FF +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_MAX 0x8008 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_EXT 0x8008 +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#define GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV 0x95B6 +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VIEWPORTS 0x825B +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_MIN 0x8007 +#define GL_MINMAX 0x802E +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_MINOR_VERSION 0x821C +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MIN_EXT 0x8007 +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIPMAP 0x8293 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_MODELVIEW 0x1700 +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW1_EXT 0x850A +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_MODULATE 0x2100 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_MOVE_TO_NV 0x02 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOV_ATI 0x8961 +#define GL_MULT 0x0103 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_MULTIPLY_NV 0x9294 +#define GL_MULTISAMPLE 0x809D +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_MUL_ATI 0x8964 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_N3F_V3F 0x2A25 +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +#define GL_NAME_LENGTH 0x92F9 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_NAND 0x150E +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NEAREST 0x2600 +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEVER 0x0200 +#define GL_NEXT_BUFFER_NV -2 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_NICEST 0x1102 +#define GL_NONE 0 +#define GL_NOOP 0x1505 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_NOR 0x1508 +#define GL_NORMALIZE 0x0BA1 +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_NOTEQUAL 0x0205 +#define GL_NO_ERROR 0 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_PLANE 0x2501 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_OBJECT_TYPE 0x9112 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#define GL_OFFSET 0x92FC +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_ONE 1 +#define GL_ONE_EXT 0x87DE +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_OPERAND2_ALPHA_EXT 0x859A +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND3_ALPHA_NV 0x859B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_MOV_EXT 0x8799 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_SUB_EXT 0x8796 +#define GL_OR 0x1507 +#define GL_ORDER 0x0A01 +#define GL_OR_INVERTED 0x150D +#define GL_OR_REVERSE 0x150B +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_OVERLAY_KHR 0x9296 +#define GL_OVERLAY_NV 0x9296 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_PACK_INVERT_MESA 0x8758 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_PATCHES 0x000E +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_PERTURB_EXT 0x85AE +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#define GL_PHONG_HINT_WIN 0x80EB +#define GL_PHONG_WIN 0x80EA +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_POINT 0x1B00 +#define GL_POINTS 0x0000 +#define GL_POINT_BIT 0x00000002 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_POINT_SPRITE 0x8861 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#define GL_POINT_TOKEN 0x0701 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_POSITION 0x1203 +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_PRESENT_DURATION_NV 0x8E2B +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESERVE_ATI 0x8762 +#define GL_PREVIOUS 0x8578 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PROGRAM 0x82E2 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROJECTION 0x1701 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_PURGEABLE_APPLE 0x8A1D +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB +#define GL_Q 0x2003 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_QUADS 0x0007 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_QUAD_STRIP 0x0008 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_QUERY 0x82E3 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_QUERY_RESOURCE_BUFFEROBJECT_NV 0x9547 +#define GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV 0x9542 +#define GL_QUERY_RESOURCE_RENDERBUFFER_NV 0x9546 +#define GL_QUERY_RESOURCE_SYS_RESERVED_NV 0x9544 +#define GL_QUERY_RESOURCE_TEXTURE_NV 0x9545 +#define GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV 0x9540 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_TARGET 0x82EA +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_R 0x2002 +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_R16 0x822A +#define GL_R16F 0x822D +#define GL_R16F_EXT 0x822D +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R16_SNORM 0x8F98 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R32F 0x822E +#define GL_R32F_EXT 0x822E +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_R3_G3_B2 0x2A10 +#define GL_R8 0x8229 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R8_EXT 0x8229 +#define GL_R8_SNORM 0x8F94 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_READ_BUFFER 0x0C02 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_READ_ONLY 0x88B8 +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +#define GL_READ_WRITE 0x88BA +#define GL_READ_WRITE_ARB 0x88BA +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_RECT_NV 0xF6 +#define GL_RED 0x1903 +#define GL_REDUCE 0x8016 +#define GL_REDUCE_EXT 0x8016 +#define GL_RED_BIAS 0x0D15 +#define GL_RED_BITS 0x0D52 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_RED_INTEGER 0x8D94 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_RED_NV 0x1903 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_SNORM 0x8F90 +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFLECTION_MAP 0x8512 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_REFLECTION_MAP_NV 0x8512 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_2_ATI 0x8923 +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_RENDER 0x1C00 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERER 0x1F01 +#define GL_RENDER_GPU_MASK_NV 0x9558 +#define GL_RENDER_MODE 0x0C40 +#define GL_REPEAT 0x2901 +#define GL_REPLACE 0x1E01 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACE_EXT 0x8062 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_REPLICATE_BORDER 0x8153 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 +#define GL_RESCALE_NORMAL 0x803A +#define GL_RESCALE_NORMAL_EXT 0x803A +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_RESTART_SUN 0x0001 +#define GL_RETAINED_APPLE 0x8A1B +#define GL_RETURN 0x0102 +#define GL_RG 0x8227 +#define GL_RG16 0x822C +#define GL_RG16F 0x822F +#define GL_RG16F_EXT 0x822F +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG16_SNORM 0x8F99 +#define GL_RG32F 0x8230 +#define GL_RG32F_EXT 0x8230 +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_RG8 0x822B +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG8_EXT 0x822B +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB 0x1907 +#define GL_RGB10 0x8052 +#define GL_RGB10_A2 0x8059 +#define GL_RGB10_A2UI 0x906F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGB16F 0x881B +#define GL_RGB16F_ARB 0x881B +#define GL_RGB16F_EXT 0x881B +#define GL_RGB16I 0x8D89 +#define GL_RGB16I_EXT 0x8D89 +#define GL_RGB16UI 0x8D77 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_RGB16_EXT 0x8054 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGB2_EXT 0x804E +#define GL_RGB32F 0x8815 +#define GL_RGB32F_ARB 0x8815 +#define GL_RGB32F_EXT 0x8815 +#define GL_RGB32I 0x8D83 +#define GL_RGB32I_EXT 0x8D83 +#define GL_RGB32UI 0x8D71 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_RGB4 0x804F +#define GL_RGB4_EXT 0x804F +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGB5 0x8050 +#define GL_RGB565 0x8D62 +#define GL_RGB5_A1 0x8057 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB8I 0x8D8F +#define GL_RGB8I_EXT 0x8D8F +#define GL_RGB8UI 0x8D7D +#define GL_RGB8UI_EXT 0x8D7D +#define GL_RGB8_EXT 0x8051 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGB9_E5 0x8C3D +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_RGBA 0x1908 +#define GL_RGBA12 0x805A +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16 0x805B +#define GL_RGBA16F 0x881A +#define GL_RGBA16F_ARB 0x881A +#define GL_RGBA16F_EXT 0x881A +#define GL_RGBA16I 0x8D88 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGBA16UI 0x8D76 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGBA16_EXT 0x805B +#define GL_RGBA16_SNORM 0x8F9B +#define GL_RGBA2 0x8055 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA32F 0x8814 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGBA32I 0x8D82 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGBA32UI 0x8D70 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGBA4 0x8056 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA8 0x8058 +#define GL_RGBA8I 0x8D8E +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGBA8UI 0x8D7C +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGBA8_EXT 0x8058 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +#define GL_RGBA_MODE 0x0C31 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#define GL_RGBA_SNORM 0x8F93 +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGB_RAW_422_APPLE 0x8A51 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB_SCALE 0x8573 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_RGB_SNORM 0x8F92 +#define GL_RG_INTEGER 0x8228 +#define GL_RG_SNORM 0x8F91 +#define GL_RIGHT 0x0407 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_ROUND_NV 0x90A4 +#define GL_S 0x2000 +#define GL_SAMPLER 0x82E6 +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_SCALAR_EXT 0x87BE +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCISSOR_BIT 0x00080000 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_SCREEN_KHR 0x9295 +#define GL_SCREEN_NV 0x9295 +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_SELECT 0x1C02 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_SEMAPHORE_TYPE_BINARY_NV 0x95B4 +#define GL_SEMAPHORE_TYPE_NV 0x95B3 +#define GL_SEMAPHORE_TYPE_TIMELINE_NV 0x95B5 +#define GL_SEPARABLE_2D 0x8012 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#define GL_SET 0x150F +#define GL_SET_AMD 0x874A +#define GL_SHADER 0x82E1 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_TYPE 0x8B4F +#define GL_SHADE_MODEL 0x0B54 +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2 +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1 +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_SHARED_EDGE_NV 0xC0 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +#define GL_SHININESS 0x1601 +#define GL_SHORT 0x1402 +#define GL_SIGNALED 0x9119 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SKIP_COMPONENTS1_NV -6 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_DECODE_EXT 0x8A4A +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_SLICE_ACCUM_SUN 0x85CC +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_SMOOTH 0x1D01 +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_SM_COUNT_NV 0x933B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SPARE0_NV 0x852E +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_SPARE1_NV 0x852F +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_SPECULAR 0x1202 +#define GL_SPHERE_MAP 0x2402 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_BINARY_ARB 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SQUARE_NV 0x90A3 +#define GL_SR8_EXT 0x8FBD +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC1_COLOR 0x88F9 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_ALPHA 0x858A +#define GL_SRC2_RGB 0x8582 +#define GL_SRC_ALPHA 0x0302 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_COLOR 0x0300 +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_SRG8_EXT 0x8FBE +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_STATIC_ATI 0x8760 +#define GL_STATIC_COPY 0x88E6 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_REF_COMMAND_NV 0x000C +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STEREO 0x0C33 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_SHARED_APPLE 0x85BF +#define GL_STREAM_COPY 0x88E2 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_SUBTRACT 0x84E7 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_SUB_ATI 0x8965 +#define GL_SUCCESS_NV 0x902F +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_T 0x2001 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_T4F_V4F 0x2A28 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_TASK_SHADER_NV 0x955A +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_TEXTURE31_ARB 0x84DF +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#define GL_TEXTURE_NORMAL_EXT 0x85AF +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_TARGET 0x1006 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#define GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8 +#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9 +#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_TIMELINE_SEMAPHORE_VALUE_NV 0x9595 +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP 0x8E28 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_NV 0x862C +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_FAN 0x0006 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_TRIANGLE_MESH_SUN 0x8615 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_TRUE 1 +#define GL_TYPE 0x92FA +#define GL_UNCORRELATED_NV 0x9282 +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNSIGNALED 0x9118 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_UNSIGNED_INT64_ARB 0x140F +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_UPLOAD_GPU_MASK_NVX 0x954A +#define GL_UPPER_LEFT 0x8CA2 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_UTF16_NV 0x909B +#define GL_UTF8_NV 0x909A +#define GL_UUID_SIZE_EXT 16 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_EXT 0x87C1 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_VECTOR_EXT 0x87BF +#define GL_VENDOR 0x1F00 +#define GL_VERSION 0x1F02 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SOURCE_ATI 0x8774 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_VERTEX_TEXTURE 0x829B +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIEWPORT 0x0BA2 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 +#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 +#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 +#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 +#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 +#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 +#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 +#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 +#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A +#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B +#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C +#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D +#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E +#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_EAC_R11 0x9383 +#define GL_VIEW_CLASS_EAC_RG11 0x9384 +#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 +#define GL_VIEW_CLASS_ETC2_RGB 0x9385 +#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_WAIT_FAILED 0x911D +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_WRAP_BORDER_SUN 0x81D4 +#define GL_WRITE_DISCARD_NV 0x88BE +#define GL_WRITE_ONLY 0x88B9 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_W_EXT 0x87D8 +#define GL_XOR 0x1506 +#define GL_XOR_NV 0x1506 +#define GL_X_EXT 0x87D5 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_YCBCR_MESA 0x8757 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCRCBA_SGIX 0x8319 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#define GL_YCRCB_SGIX 0x8318 +#define GL_Y_EXT 0x87D6 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_ZERO 0 +#define GL_ZERO_EXT 0x87DD +#define GL_ZERO_TO_ONE 0x935F +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_Z_EXT 0x87D7 +#define GL_3DC_XY_AMD 0x87FA +#define GL_3DC_X_AMD 0x87F9 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_ALPHA8_OES 0x803C +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_BGRA_IMG 0x80E1 +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F +#define GL_BUFFER_KHR 0x82E0 +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 +#define GL_CLAMP_TO_BORDER_EXT 0x812D +#define GL_CLAMP_TO_BORDER_NV 0x812D +#define GL_CLAMP_TO_BORDER_OES 0x812D +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 +#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 +#define GL_CLIP_DEPTH_MODE_EXT 0x935D +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#define GL_CLIP_ORIGIN_EXT 0x935C +#define GL_COLORBURN 0x929A +#define GL_COLORDODGE 0x9299 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_COLOR_EXT 0x1800 +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_COMPRESSED_RGBA_ASTC_10x10 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_10x5 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_12x10 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12 0x93BD +#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 +#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 +#define GL_COMPRESSED_RGBA_ASTC_4x4 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 +#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 +#define GL_COMPRESSED_RGBA_ASTC_5x4 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 +#define GL_COMPRESSED_RGBA_ASTC_5x5 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 +#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 +#define GL_COMPRESSED_RGBA_ASTC_6x5 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 +#define GL_COMPRESSED_RGBA_ASTC_6x6 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 +#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 +#define GL_COMPRESSED_RGBA_ASTC_8x5 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8 0x93B7 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 0x93D7 +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT 0x00000010 +#define GL_CONTEXT_LOST_KHR 0x0507 +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_CUBIC_IMG 0x9139 +#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B +#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_DARKEN 0x9297 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_DEPTH_CLAMP_EXT 0x864F +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#define GL_DEPTH_EXT 0x1801 +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_DIFFERENCE 0x929E +#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 +#define GL_DOWNSAMPLE_SCALES_IMG 0x913E +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 +#define GL_ETC1_RGB8_OES 0x8D64 +#define GL_ETC1_SRGB8_NV 0x88EE +#define GL_EXCLUSION 0x92A0 +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FILL_NV 0x1B02 +#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x00000001 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x00000002 +#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x00000004 +#define GL_FRACTIONAL_EVEN_EXT 0x8E7C +#define GL_FRACTIONAL_EVEN_OES 0x8E7C +#define GL_FRACTIONAL_ODD_EXT 0x8E7B +#define GL_FRACTIONAL_ODD_OES 0x8E7B +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 +#define GL_FRAGMENT_SHADING_RATE_ATTACHMENT_WITH_DEFAULT_FRAMEBUFFER_SUPPORTED_EXT 0x96DF +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT 0x96D2 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_EXT 0x96D5 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_EXT 0x96D4 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_EXT 0x96D6 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_EXT 0x96D3 +#define GL_FRAGMENT_SHADING_RATE_NON_TRIVIAL_COMBINERS_SUPPORTED_EXT 0x8F6F +#define GL_FRAGMENT_SHADING_RATE_WITH_SAMPLE_MASK_SUPPORTED_EXT 0x96DE +#define GL_FRAGMENT_SHADING_RATE_WITH_SHADER_DEPTH_STENCIL_WRITES_SUPPORTED_EXT 0x96DD +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG 0x913F +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG 0x913C +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 +#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F +#define GL_GEOMETRY_SHADER_OES 0x8DD9 +#define GL_GPU_DISJOINT_EXT 0x8FBB +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_HALF_FLOAT_OES 0x8D61 +#define GL_HARDLIGHT 0x929B +#define GL_HSL_COLOR 0x92AF +#define GL_HSL_HUE 0x92AD +#define GL_HSL_LUMINOSITY 0x92B0 +#define GL_HSL_SATURATION 0x92AE +#define GL_IMAGE_BUFFER_OES 0x9051 +#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#define GL_INT_IMAGE_BUFFER_OES 0x905C +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E +#define GL_ISOLINES_EXT 0x8E7A +#define GL_ISOLINES_OES 0x8E7A +#define GL_IS_PER_PATCH_EXT 0x92E7 +#define GL_IS_PER_PATCH_OES 0x92E7 +#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E +#define GL_LIGHTEN 0x9298 +#define GL_LINES_ADJACENCY_OES 0x000A +#define GL_LINE_NV 0x1B01 +#define GL_LINE_STRIP_ADJACENCY_OES 0x000B +#define GL_LOCATION_INDEX_EXT 0x930F +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_LOWER_LEFT_EXT 0x8CA1 +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 +#define GL_MAP_COHERENT_BIT_EXT 0x0080 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_LAYERS_EXT 0x96DC +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_ASPECT_RATIO_EXT 0x96DB +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96DA +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D8 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 +#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D +#define GL_MAX_PATCH_VERTICES_OES 0x8E7D +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_MAX_SAMPLES_NV 0x8D57 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 +#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A +#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 +#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E +#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E +#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 +#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 +#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_MAX_VIEWPORTS_OES 0x825B +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96D9 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D7 +#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_X_QCOM 0x8C90 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_Y_QCOM 0x8C91 +#define GL_MULTIPLY 0x9294 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY 0x9382 +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE 0x9381 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_NUM_DOWNSAMPLE_SCALES_IMG 0x913D +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA +#define GL_NUM_SURFACE_COMPRESSION_FIXED_RATES_EXT 0x8F6E +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_OVERLAY 0x9296 +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 +#define GL_PACK_ROW_LENGTH_NV 0x0D02 +#define GL_PACK_SKIP_PIXELS_NV 0x0D04 +#define GL_PACK_SKIP_ROWS_NV 0x0D03 +#define GL_PATCHES_EXT 0x000E +#define GL_PATCHES_OES 0x000E +#define GL_PATCH_VERTICES_EXT 0x8E72 +#define GL_PATCH_VERTICES_OES 0x8E72 +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_POINT_NV 0x1B00 +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_PRIMITIVES_GENERATED_OES 0x8C87 +#define GL_PRIMITIVE_BOUNDING_BOX 0x92BE +#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_QUADS_EXT 0x0007 +#define GL_QUADS_OES 0x0007 +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_QUERY_KHR 0x82E3 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_R16_EXT 0x822A +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_READ_BUFFER_NV 0x0C02 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_RED_EXT 0x1903 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_RG16_EXT 0x822C +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGB16_SNORM_EXT 0x8F9A +#define GL_RGB565_OES 0x8D62 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB8_OES 0x8051 +#define GL_RGB9_E5_APPLE 0x8C3D +#define GL_RGBA16_SNORM_EXT 0x8F9B +#define GL_RGBA4_OES 0x8056 +#define GL_RGBA8_OES 0x8058 +#define GL_RG_EXT 0x8227 +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_SAMPLER_BUFFER_OES 0x8DC2 +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_SAMPLE_SHADING_OES 0x8C36 +#define GL_SCREEN 0x9295 +#define GL_SGX_BINARY_IMG 0x8C0A +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#define GL_SHADER_BINARY_DMP 0x9250 +#define GL_SHADER_BINARY_VIV 0x8FC4 +#define GL_SHADER_CORE_ACTIVE_COUNT_ARM 0x96F1 +#define GL_SHADER_CORE_COUNT_ARM 0x96F0 +#define GL_SHADER_CORE_FMA_RATE_ARM 0x96F6 +#define GL_SHADER_CORE_MAX_WARP_COUNT_ARM 0x96F3 +#define GL_SHADER_CORE_PIXEL_RATE_ARM 0x96F4 +#define GL_SHADER_CORE_PRESENT_MASK_ARM 0x96F2 +#define GL_SHADER_CORE_TEXEL_RATE_ARM 0x96F5 +#define GL_SHADER_KHR 0x82E1 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#define GL_SHADING_RATE_1X1_PIXELS_EXT 0x96A6 +#define GL_SHADING_RATE_1X1_PIXELS_QCOM 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_EXT 0x96A7 +#define GL_SHADING_RATE_1X2_PIXELS_QCOM 0x96A7 +#define GL_SHADING_RATE_1X4_PIXELS_EXT 0x96AA +#define GL_SHADING_RATE_1X4_PIXELS_QCOM 0x96AA +#define GL_SHADING_RATE_2X1_PIXELS_EXT 0x96A8 +#define GL_SHADING_RATE_2X1_PIXELS_QCOM 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_EXT 0x96A9 +#define GL_SHADING_RATE_2X2_PIXELS_QCOM 0x96A9 +#define GL_SHADING_RATE_2X4_PIXELS_EXT 0x96AD +#define GL_SHADING_RATE_2X4_PIXELS_QCOM 0x96AD +#define GL_SHADING_RATE_4X1_PIXELS_EXT 0x96AB +#define GL_SHADING_RATE_4X1_PIXELS_QCOM 0x96AB +#define GL_SHADING_RATE_4X2_PIXELS_EXT 0x96AC +#define GL_SHADING_RATE_4X2_PIXELS_QCOM 0x96AC +#define GL_SHADING_RATE_4X4_PIXELS_EXT 0x96AE +#define GL_SHADING_RATE_4X4_PIXELS_QCOM 0x96AE +#define GL_SHADING_RATE_ATTACHMENT_EXT 0x96D1 +#define GL_SHADING_RATE_EXT 0x96D0 +#define GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM 0x96A5 +#define GL_SHADING_RATE_QCOM 0x96A4 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 +#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 +#define GL_SOFTLIGHT 0x929C +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_SRGB8_NV 0x8C41 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 +#define GL_STATE_RESTORE 0x8BDC +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_STENCIL_EXT 0x1802 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#define GL_STENCIL_INDEX8_OES 0x8D48 +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_SURFACE_COMPRESSION_EXT 0x96C0 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x96CD +#define GL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x96CE +#define GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x96CF +#define GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x96C4 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x96C5 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x96C6 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x96C7 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x96C8 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x96C9 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x96CA +#define GL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x96CB +#define GL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x96CC +#define GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x96C2 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x96C1 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 +#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 +#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 +#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 +#define GL_TESS_CONTROL_SHADER_OES 0x8E88 +#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 +#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 +#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 +#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 +#define GL_TESS_GEN_MODE_EXT 0x8E76 +#define GL_TESS_GEN_MODE_OES 0x8E76 +#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 +#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 +#define GL_TESS_GEN_SPACING_EXT 0x8E77 +#define GL_TESS_GEN_SPACING_OES 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 +#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 +#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D +#define GL_TEXTURE_BUFFER_OES 0x8C2A +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F +#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D +#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D +#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E +#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF +#define GL_TEXTURE_FOVEATED_CUTOFF_DENSITY_QCOM 0x96A0 +#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB +#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD +#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC +#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_LOD_BIAS_QCOM 0x8C96 +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_TEXTURE_PROTECTED_EXT 0x8BFA +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +#define GL_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_UNNORMALIZED_COORDINATES_ARM 0x8F6A +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +#define GL_TRIANGLES_ADJACENCY_OES 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_UNDEFINED_VERTEX_OES 0x8260 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E +#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#define GL_UPPER_LEFT_EXT 0x8CA2 +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_BOUNDS_RANGE_OES 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES 0x825F +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_SUBPIXEL_BITS_OES 0x825C +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_Z400_BINARY_AMD 0x8740 +#define GL_ZERO_TO_ONE_EXT 0x935F + + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptr; +#else +typedef khronos_intptr_t GLintptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptrARB; +#else +typedef khronos_intptr_t GLintptrARB; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptr; +#else +typedef khronos_ssize_t GLsizeiptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptrARB; +#else +typedef khronos_ssize_t GLsizeiptrARB; +#endif +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + + +#define GL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_0; +#define GL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_1; +#define GL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_2; +#define GL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_3; +#define GL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_4; +#define GL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_5; +#define GL_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_0; +#define GL_VERSION_2_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_1; +#define GL_VERSION_3_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_0; +#define GL_VERSION_3_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_1; +#define GL_VERSION_3_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_2; +#define GL_VERSION_3_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_3; +#define GL_VERSION_4_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_0; +#define GL_VERSION_4_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_1; +#define GL_VERSION_4_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_2; +#define GL_VERSION_4_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_3; +#define GL_VERSION_4_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_4; +#define GL_VERSION_4_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_5; +#define GL_VERSION_4_6 1 +GLAD_API_CALL int GLAD_GL_VERSION_4_6; +#define GL_ES_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_ES_VERSION_2_0; +#define GL_ES_VERSION_3_0 1 +GLAD_API_CALL int GLAD_GL_ES_VERSION_3_0; +#define GL_ES_VERSION_3_1 1 +GLAD_API_CALL int GLAD_GL_ES_VERSION_3_1; +#define GL_ES_VERSION_3_2 1 +GLAD_API_CALL int GLAD_GL_ES_VERSION_3_2; +#define GL_3DFX_multisample 1 +GLAD_API_CALL int GLAD_GL_3DFX_multisample; +#define GL_3DFX_tbuffer 1 +GLAD_API_CALL int GLAD_GL_3DFX_tbuffer; +#define GL_3DFX_texture_compression_FXT1 1 +GLAD_API_CALL int GLAD_GL_3DFX_texture_compression_FXT1; +#define GL_AMD_blend_minmax_factor 1 +GLAD_API_CALL int GLAD_GL_AMD_blend_minmax_factor; +#define GL_AMD_conservative_depth 1 +GLAD_API_CALL int GLAD_GL_AMD_conservative_depth; +#define GL_AMD_debug_output 1 +GLAD_API_CALL int GLAD_GL_AMD_debug_output; +#define GL_AMD_depth_clamp_separate 1 +GLAD_API_CALL int GLAD_GL_AMD_depth_clamp_separate; +#define GL_AMD_draw_buffers_blend 1 +GLAD_API_CALL int GLAD_GL_AMD_draw_buffers_blend; +#define GL_AMD_framebuffer_multisample_advanced 1 +GLAD_API_CALL int GLAD_GL_AMD_framebuffer_multisample_advanced; +#define GL_AMD_framebuffer_sample_positions 1 +GLAD_API_CALL int GLAD_GL_AMD_framebuffer_sample_positions; +#define GL_AMD_gcn_shader 1 +GLAD_API_CALL int GLAD_GL_AMD_gcn_shader; +#define GL_AMD_gpu_shader_half_float 1 +GLAD_API_CALL int GLAD_GL_AMD_gpu_shader_half_float; +#define GL_AMD_gpu_shader_int16 1 +GLAD_API_CALL int GLAD_GL_AMD_gpu_shader_int16; +#define GL_AMD_gpu_shader_int64 1 +GLAD_API_CALL int GLAD_GL_AMD_gpu_shader_int64; +#define GL_AMD_interleaved_elements 1 +GLAD_API_CALL int GLAD_GL_AMD_interleaved_elements; +#define GL_AMD_multi_draw_indirect 1 +GLAD_API_CALL int GLAD_GL_AMD_multi_draw_indirect; +#define GL_AMD_name_gen_delete 1 +GLAD_API_CALL int GLAD_GL_AMD_name_gen_delete; +#define GL_AMD_occlusion_query_event 1 +GLAD_API_CALL int GLAD_GL_AMD_occlusion_query_event; +#define GL_AMD_performance_monitor 1 +GLAD_API_CALL int GLAD_GL_AMD_performance_monitor; +#define GL_AMD_pinned_memory 1 +GLAD_API_CALL int GLAD_GL_AMD_pinned_memory; +#define GL_AMD_query_buffer_object 1 +GLAD_API_CALL int GLAD_GL_AMD_query_buffer_object; +#define GL_AMD_sample_positions 1 +GLAD_API_CALL int GLAD_GL_AMD_sample_positions; +#define GL_AMD_seamless_cubemap_per_texture 1 +GLAD_API_CALL int GLAD_GL_AMD_seamless_cubemap_per_texture; +#define GL_AMD_shader_atomic_counter_ops 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_atomic_counter_ops; +#define GL_AMD_shader_ballot 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_ballot; +#define GL_AMD_shader_explicit_vertex_parameter 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_explicit_vertex_parameter; +#define GL_AMD_shader_gpu_shader_half_float_fetch 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_gpu_shader_half_float_fetch; +#define GL_AMD_shader_image_load_store_lod 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_image_load_store_lod; +#define GL_AMD_shader_stencil_export 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_stencil_export; +#define GL_AMD_shader_trinary_minmax 1 +GLAD_API_CALL int GLAD_GL_AMD_shader_trinary_minmax; +#define GL_AMD_sparse_texture 1 +GLAD_API_CALL int GLAD_GL_AMD_sparse_texture; +#define GL_AMD_stencil_operation_extended 1 +GLAD_API_CALL int GLAD_GL_AMD_stencil_operation_extended; +#define GL_AMD_texture_gather_bias_lod 1 +GLAD_API_CALL int GLAD_GL_AMD_texture_gather_bias_lod; +#define GL_AMD_texture_texture4 1 +GLAD_API_CALL int GLAD_GL_AMD_texture_texture4; +#define GL_AMD_transform_feedback3_lines_triangles 1 +GLAD_API_CALL int GLAD_GL_AMD_transform_feedback3_lines_triangles; +#define GL_AMD_transform_feedback4 1 +GLAD_API_CALL int GLAD_GL_AMD_transform_feedback4; +#define GL_AMD_vertex_shader_layer 1 +GLAD_API_CALL int GLAD_GL_AMD_vertex_shader_layer; +#define GL_AMD_vertex_shader_tessellator 1 +GLAD_API_CALL int GLAD_GL_AMD_vertex_shader_tessellator; +#define GL_AMD_vertex_shader_viewport_index 1 +GLAD_API_CALL int GLAD_GL_AMD_vertex_shader_viewport_index; +#define GL_APPLE_aux_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_APPLE_aux_depth_stencil; +#define GL_APPLE_client_storage 1 +GLAD_API_CALL int GLAD_GL_APPLE_client_storage; +#define GL_APPLE_element_array 1 +GLAD_API_CALL int GLAD_GL_APPLE_element_array; +#define GL_APPLE_fence 1 +GLAD_API_CALL int GLAD_GL_APPLE_fence; +#define GL_APPLE_float_pixels 1 +GLAD_API_CALL int GLAD_GL_APPLE_float_pixels; +#define GL_APPLE_flush_buffer_range 1 +GLAD_API_CALL int GLAD_GL_APPLE_flush_buffer_range; +#define GL_APPLE_object_purgeable 1 +GLAD_API_CALL int GLAD_GL_APPLE_object_purgeable; +#define GL_APPLE_rgb_422 1 +GLAD_API_CALL int GLAD_GL_APPLE_rgb_422; +#define GL_APPLE_row_bytes 1 +GLAD_API_CALL int GLAD_GL_APPLE_row_bytes; +#define GL_APPLE_specular_vector 1 +GLAD_API_CALL int GLAD_GL_APPLE_specular_vector; +#define GL_APPLE_texture_range 1 +GLAD_API_CALL int GLAD_GL_APPLE_texture_range; +#define GL_APPLE_transform_hint 1 +GLAD_API_CALL int GLAD_GL_APPLE_transform_hint; +#define GL_APPLE_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_APPLE_vertex_array_object; +#define GL_APPLE_vertex_array_range 1 +GLAD_API_CALL int GLAD_GL_APPLE_vertex_array_range; +#define GL_APPLE_vertex_program_evaluators 1 +GLAD_API_CALL int GLAD_GL_APPLE_vertex_program_evaluators; +#define GL_APPLE_ycbcr_422 1 +GLAD_API_CALL int GLAD_GL_APPLE_ycbcr_422; +#define GL_ARB_ES2_compatibility 1 +GLAD_API_CALL int GLAD_GL_ARB_ES2_compatibility; +#define GL_ARB_ES3_1_compatibility 1 +GLAD_API_CALL int GLAD_GL_ARB_ES3_1_compatibility; +#define GL_ARB_ES3_2_compatibility 1 +GLAD_API_CALL int GLAD_GL_ARB_ES3_2_compatibility; +#define GL_ARB_ES3_compatibility 1 +GLAD_API_CALL int GLAD_GL_ARB_ES3_compatibility; +#define GL_ARB_arrays_of_arrays 1 +GLAD_API_CALL int GLAD_GL_ARB_arrays_of_arrays; +#define GL_ARB_base_instance 1 +GLAD_API_CALL int GLAD_GL_ARB_base_instance; +#define GL_ARB_bindless_texture 1 +GLAD_API_CALL int GLAD_GL_ARB_bindless_texture; +#define GL_ARB_blend_func_extended 1 +GLAD_API_CALL int GLAD_GL_ARB_blend_func_extended; +#define GL_ARB_buffer_storage 1 +GLAD_API_CALL int GLAD_GL_ARB_buffer_storage; +#define GL_ARB_cl_event 1 +GLAD_API_CALL int GLAD_GL_ARB_cl_event; +#define GL_ARB_clear_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_clear_buffer_object; +#define GL_ARB_clear_texture 1 +GLAD_API_CALL int GLAD_GL_ARB_clear_texture; +#define GL_ARB_clip_control 1 +GLAD_API_CALL int GLAD_GL_ARB_clip_control; +#define GL_ARB_color_buffer_float 1 +GLAD_API_CALL int GLAD_GL_ARB_color_buffer_float; +#define GL_ARB_compatibility 1 +GLAD_API_CALL int GLAD_GL_ARB_compatibility; +#define GL_ARB_compressed_texture_pixel_storage 1 +GLAD_API_CALL int GLAD_GL_ARB_compressed_texture_pixel_storage; +#define GL_ARB_compute_shader 1 +GLAD_API_CALL int GLAD_GL_ARB_compute_shader; +#define GL_ARB_compute_variable_group_size 1 +GLAD_API_CALL int GLAD_GL_ARB_compute_variable_group_size; +#define GL_ARB_conditional_render_inverted 1 +GLAD_API_CALL int GLAD_GL_ARB_conditional_render_inverted; +#define GL_ARB_conservative_depth 1 +GLAD_API_CALL int GLAD_GL_ARB_conservative_depth; +#define GL_ARB_copy_buffer 1 +GLAD_API_CALL int GLAD_GL_ARB_copy_buffer; +#define GL_ARB_copy_image 1 +GLAD_API_CALL int GLAD_GL_ARB_copy_image; +#define GL_ARB_cull_distance 1 +GLAD_API_CALL int GLAD_GL_ARB_cull_distance; +#define GL_ARB_debug_output 1 +GLAD_API_CALL int GLAD_GL_ARB_debug_output; +#define GL_ARB_depth_buffer_float 1 +GLAD_API_CALL int GLAD_GL_ARB_depth_buffer_float; +#define GL_ARB_depth_clamp 1 +GLAD_API_CALL int GLAD_GL_ARB_depth_clamp; +#define GL_ARB_depth_texture 1 +GLAD_API_CALL int GLAD_GL_ARB_depth_texture; +#define GL_ARB_derivative_control 1 +GLAD_API_CALL int GLAD_GL_ARB_derivative_control; +#define GL_ARB_direct_state_access 1 +GLAD_API_CALL int GLAD_GL_ARB_direct_state_access; +#define GL_ARB_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_buffers; +#define GL_ARB_draw_buffers_blend 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_buffers_blend; +#define GL_ARB_draw_elements_base_vertex 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_elements_base_vertex; +#define GL_ARB_draw_indirect 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_indirect; +#define GL_ARB_draw_instanced 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_instanced; +#define GL_ARB_enhanced_layouts 1 +GLAD_API_CALL int GLAD_GL_ARB_enhanced_layouts; +#define GL_ARB_explicit_attrib_location 1 +GLAD_API_CALL int GLAD_GL_ARB_explicit_attrib_location; +#define GL_ARB_explicit_uniform_location 1 +GLAD_API_CALL int GLAD_GL_ARB_explicit_uniform_location; +#define GL_ARB_fragment_coord_conventions 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_coord_conventions; +#define GL_ARB_fragment_layer_viewport 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_layer_viewport; +#define GL_ARB_fragment_program 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_program; +#define GL_ARB_fragment_program_shadow 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_program_shadow; +#define GL_ARB_fragment_shader 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_shader; +#define GL_ARB_fragment_shader_interlock 1 +GLAD_API_CALL int GLAD_GL_ARB_fragment_shader_interlock; +#define GL_ARB_framebuffer_no_attachments 1 +GLAD_API_CALL int GLAD_GL_ARB_framebuffer_no_attachments; +#define GL_ARB_framebuffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object; +#define GL_ARB_framebuffer_sRGB 1 +GLAD_API_CALL int GLAD_GL_ARB_framebuffer_sRGB; +#define GL_ARB_geometry_shader4 1 +GLAD_API_CALL int GLAD_GL_ARB_geometry_shader4; +#define GL_ARB_get_program_binary 1 +GLAD_API_CALL int GLAD_GL_ARB_get_program_binary; +#define GL_ARB_get_texture_sub_image 1 +GLAD_API_CALL int GLAD_GL_ARB_get_texture_sub_image; +#define GL_ARB_gl_spirv 1 +GLAD_API_CALL int GLAD_GL_ARB_gl_spirv; +#define GL_ARB_gpu_shader5 1 +GLAD_API_CALL int GLAD_GL_ARB_gpu_shader5; +#define GL_ARB_gpu_shader_fp64 1 +GLAD_API_CALL int GLAD_GL_ARB_gpu_shader_fp64; +#define GL_ARB_gpu_shader_int64 1 +GLAD_API_CALL int GLAD_GL_ARB_gpu_shader_int64; +#define GL_ARB_half_float_pixel 1 +GLAD_API_CALL int GLAD_GL_ARB_half_float_pixel; +#define GL_ARB_half_float_vertex 1 +GLAD_API_CALL int GLAD_GL_ARB_half_float_vertex; +#define GL_ARB_imaging 1 +GLAD_API_CALL int GLAD_GL_ARB_imaging; +#define GL_ARB_indirect_parameters 1 +GLAD_API_CALL int GLAD_GL_ARB_indirect_parameters; +#define GL_ARB_instanced_arrays 1 +GLAD_API_CALL int GLAD_GL_ARB_instanced_arrays; +#define GL_ARB_internalformat_query 1 +GLAD_API_CALL int GLAD_GL_ARB_internalformat_query; +#define GL_ARB_internalformat_query2 1 +GLAD_API_CALL int GLAD_GL_ARB_internalformat_query2; +#define GL_ARB_invalidate_subdata 1 +GLAD_API_CALL int GLAD_GL_ARB_invalidate_subdata; +#define GL_ARB_map_buffer_alignment 1 +GLAD_API_CALL int GLAD_GL_ARB_map_buffer_alignment; +#define GL_ARB_map_buffer_range 1 +GLAD_API_CALL int GLAD_GL_ARB_map_buffer_range; +#define GL_ARB_matrix_palette 1 +GLAD_API_CALL int GLAD_GL_ARB_matrix_palette; +#define GL_ARB_multi_bind 1 +GLAD_API_CALL int GLAD_GL_ARB_multi_bind; +#define GL_ARB_multi_draw_indirect 1 +GLAD_API_CALL int GLAD_GL_ARB_multi_draw_indirect; +#define GL_ARB_multisample 1 +GLAD_API_CALL int GLAD_GL_ARB_multisample; +#define GL_ARB_multitexture 1 +GLAD_API_CALL int GLAD_GL_ARB_multitexture; +#define GL_ARB_occlusion_query 1 +GLAD_API_CALL int GLAD_GL_ARB_occlusion_query; +#define GL_ARB_occlusion_query2 1 +GLAD_API_CALL int GLAD_GL_ARB_occlusion_query2; +#define GL_ARB_parallel_shader_compile 1 +GLAD_API_CALL int GLAD_GL_ARB_parallel_shader_compile; +#define GL_ARB_pipeline_statistics_query 1 +GLAD_API_CALL int GLAD_GL_ARB_pipeline_statistics_query; +#define GL_ARB_pixel_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_pixel_buffer_object; +#define GL_ARB_point_parameters 1 +GLAD_API_CALL int GLAD_GL_ARB_point_parameters; +#define GL_ARB_point_sprite 1 +GLAD_API_CALL int GLAD_GL_ARB_point_sprite; +#define GL_ARB_polygon_offset_clamp 1 +GLAD_API_CALL int GLAD_GL_ARB_polygon_offset_clamp; +#define GL_ARB_post_depth_coverage 1 +GLAD_API_CALL int GLAD_GL_ARB_post_depth_coverage; +#define GL_ARB_program_interface_query 1 +GLAD_API_CALL int GLAD_GL_ARB_program_interface_query; +#define GL_ARB_provoking_vertex 1 +GLAD_API_CALL int GLAD_GL_ARB_provoking_vertex; +#define GL_ARB_query_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_query_buffer_object; +#define GL_ARB_robust_buffer_access_behavior 1 +GLAD_API_CALL int GLAD_GL_ARB_robust_buffer_access_behavior; +#define GL_ARB_robustness 1 +GLAD_API_CALL int GLAD_GL_ARB_robustness; +#define GL_ARB_robustness_isolation 1 +GLAD_API_CALL int GLAD_GL_ARB_robustness_isolation; +#define GL_ARB_sample_locations 1 +GLAD_API_CALL int GLAD_GL_ARB_sample_locations; +#define GL_ARB_sample_shading 1 +GLAD_API_CALL int GLAD_GL_ARB_sample_shading; +#define GL_ARB_sampler_objects 1 +GLAD_API_CALL int GLAD_GL_ARB_sampler_objects; +#define GL_ARB_seamless_cube_map 1 +GLAD_API_CALL int GLAD_GL_ARB_seamless_cube_map; +#define GL_ARB_seamless_cubemap_per_texture 1 +GLAD_API_CALL int GLAD_GL_ARB_seamless_cubemap_per_texture; +#define GL_ARB_separate_shader_objects 1 +GLAD_API_CALL int GLAD_GL_ARB_separate_shader_objects; +#define GL_ARB_shader_atomic_counter_ops 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_atomic_counter_ops; +#define GL_ARB_shader_atomic_counters 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_atomic_counters; +#define GL_ARB_shader_ballot 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_ballot; +#define GL_ARB_shader_bit_encoding 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_bit_encoding; +#define GL_ARB_shader_clock 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_clock; +#define GL_ARB_shader_draw_parameters 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_draw_parameters; +#define GL_ARB_shader_group_vote 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_group_vote; +#define GL_ARB_shader_image_load_store 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_image_load_store; +#define GL_ARB_shader_image_size 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_image_size; +#define GL_ARB_shader_objects 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_objects; +#define GL_ARB_shader_precision 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_precision; +#define GL_ARB_shader_stencil_export 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_stencil_export; +#define GL_ARB_shader_storage_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_storage_buffer_object; +#define GL_ARB_shader_subroutine 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_subroutine; +#define GL_ARB_shader_texture_image_samples 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_texture_image_samples; +#define GL_ARB_shader_texture_lod 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_texture_lod; +#define GL_ARB_shader_viewport_layer_array 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_viewport_layer_array; +#define GL_ARB_shading_language_100 1 +GLAD_API_CALL int GLAD_GL_ARB_shading_language_100; +#define GL_ARB_shading_language_420pack 1 +GLAD_API_CALL int GLAD_GL_ARB_shading_language_420pack; +#define GL_ARB_shading_language_include 1 +GLAD_API_CALL int GLAD_GL_ARB_shading_language_include; +#define GL_ARB_shading_language_packing 1 +GLAD_API_CALL int GLAD_GL_ARB_shading_language_packing; +#define GL_ARB_shadow 1 +GLAD_API_CALL int GLAD_GL_ARB_shadow; +#define GL_ARB_shadow_ambient 1 +GLAD_API_CALL int GLAD_GL_ARB_shadow_ambient; +#define GL_ARB_sparse_buffer 1 +GLAD_API_CALL int GLAD_GL_ARB_sparse_buffer; +#define GL_ARB_sparse_texture 1 +GLAD_API_CALL int GLAD_GL_ARB_sparse_texture; +#define GL_ARB_sparse_texture2 1 +GLAD_API_CALL int GLAD_GL_ARB_sparse_texture2; +#define GL_ARB_sparse_texture_clamp 1 +GLAD_API_CALL int GLAD_GL_ARB_sparse_texture_clamp; +#define GL_ARB_spirv_extensions 1 +GLAD_API_CALL int GLAD_GL_ARB_spirv_extensions; +#define GL_ARB_stencil_texturing 1 +GLAD_API_CALL int GLAD_GL_ARB_stencil_texturing; +#define GL_ARB_sync 1 +GLAD_API_CALL int GLAD_GL_ARB_sync; +#define GL_ARB_tessellation_shader 1 +GLAD_API_CALL int GLAD_GL_ARB_tessellation_shader; +#define GL_ARB_texture_barrier 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_barrier; +#define GL_ARB_texture_border_clamp 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_border_clamp; +#define GL_ARB_texture_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_buffer_object; +#define GL_ARB_texture_buffer_object_rgb32 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_buffer_object_rgb32; +#define GL_ARB_texture_buffer_range 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_buffer_range; +#define GL_ARB_texture_compression 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_compression; +#define GL_ARB_texture_compression_bptc 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_compression_bptc; +#define GL_ARB_texture_compression_rgtc 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_compression_rgtc; +#define GL_ARB_texture_cube_map 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_cube_map; +#define GL_ARB_texture_cube_map_array 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_cube_map_array; +#define GL_ARB_texture_env_add 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_env_add; +#define GL_ARB_texture_env_combine 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_env_combine; +#define GL_ARB_texture_env_crossbar 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_env_crossbar; +#define GL_ARB_texture_env_dot3 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_env_dot3; +#define GL_ARB_texture_filter_anisotropic 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_filter_anisotropic; +#define GL_ARB_texture_filter_minmax 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_filter_minmax; +#define GL_ARB_texture_float 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_float; +#define GL_ARB_texture_gather 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_gather; +#define GL_ARB_texture_mirror_clamp_to_edge 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_mirror_clamp_to_edge; +#define GL_ARB_texture_mirrored_repeat 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_mirrored_repeat; +#define GL_ARB_texture_multisample 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_multisample; +#define GL_ARB_texture_non_power_of_two 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_non_power_of_two; +#define GL_ARB_texture_query_levels 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_query_levels; +#define GL_ARB_texture_query_lod 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_query_lod; +#define GL_ARB_texture_rectangle 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_rectangle; +#define GL_ARB_texture_rg 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_rg; +#define GL_ARB_texture_rgb10_a2ui 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_rgb10_a2ui; +#define GL_ARB_texture_stencil8 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_stencil8; +#define GL_ARB_texture_storage 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_storage; +#define GL_ARB_texture_storage_multisample 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_storage_multisample; +#define GL_ARB_texture_swizzle 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_swizzle; +#define GL_ARB_texture_view 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_view; +#define GL_ARB_timer_query 1 +GLAD_API_CALL int GLAD_GL_ARB_timer_query; +#define GL_ARB_transform_feedback2 1 +GLAD_API_CALL int GLAD_GL_ARB_transform_feedback2; +#define GL_ARB_transform_feedback3 1 +GLAD_API_CALL int GLAD_GL_ARB_transform_feedback3; +#define GL_ARB_transform_feedback_instanced 1 +GLAD_API_CALL int GLAD_GL_ARB_transform_feedback_instanced; +#define GL_ARB_transform_feedback_overflow_query 1 +GLAD_API_CALL int GLAD_GL_ARB_transform_feedback_overflow_query; +#define GL_ARB_transpose_matrix 1 +GLAD_API_CALL int GLAD_GL_ARB_transpose_matrix; +#define GL_ARB_uniform_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_uniform_buffer_object; +#define GL_ARB_vertex_array_bgra 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_array_bgra; +#define GL_ARB_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_array_object; +#define GL_ARB_vertex_attrib_64bit 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_attrib_64bit; +#define GL_ARB_vertex_attrib_binding 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_attrib_binding; +#define GL_ARB_vertex_blend 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_blend; +#define GL_ARB_vertex_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_buffer_object; +#define GL_ARB_vertex_program 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_program; +#define GL_ARB_vertex_shader 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_shader; +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_type_10f_11f_11f_rev; +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_type_2_10_10_10_rev; +#define GL_ARB_viewport_array 1 +GLAD_API_CALL int GLAD_GL_ARB_viewport_array; +#define GL_ARB_window_pos 1 +GLAD_API_CALL int GLAD_GL_ARB_window_pos; +#define GL_ATI_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_ATI_draw_buffers; +#define GL_ATI_element_array 1 +GLAD_API_CALL int GLAD_GL_ATI_element_array; +#define GL_ATI_envmap_bumpmap 1 +GLAD_API_CALL int GLAD_GL_ATI_envmap_bumpmap; +#define GL_ATI_fragment_shader 1 +GLAD_API_CALL int GLAD_GL_ATI_fragment_shader; +#define GL_ATI_map_object_buffer 1 +GLAD_API_CALL int GLAD_GL_ATI_map_object_buffer; +#define GL_ATI_meminfo 1 +GLAD_API_CALL int GLAD_GL_ATI_meminfo; +#define GL_ATI_pixel_format_float 1 +GLAD_API_CALL int GLAD_GL_ATI_pixel_format_float; +#define GL_ATI_pn_triangles 1 +GLAD_API_CALL int GLAD_GL_ATI_pn_triangles; +#define GL_ATI_separate_stencil 1 +GLAD_API_CALL int GLAD_GL_ATI_separate_stencil; +#define GL_ATI_text_fragment_shader 1 +GLAD_API_CALL int GLAD_GL_ATI_text_fragment_shader; +#define GL_ATI_texture_env_combine3 1 +GLAD_API_CALL int GLAD_GL_ATI_texture_env_combine3; +#define GL_ATI_texture_float 1 +GLAD_API_CALL int GLAD_GL_ATI_texture_float; +#define GL_ATI_texture_mirror_once 1 +GLAD_API_CALL int GLAD_GL_ATI_texture_mirror_once; +#define GL_ATI_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_ATI_vertex_array_object; +#define GL_ATI_vertex_attrib_array_object 1 +GLAD_API_CALL int GLAD_GL_ATI_vertex_attrib_array_object; +#define GL_ATI_vertex_streams 1 +GLAD_API_CALL int GLAD_GL_ATI_vertex_streams; +#define GL_EXT_422_pixels 1 +GLAD_API_CALL int GLAD_GL_EXT_422_pixels; +#define GL_EXT_EGL_image_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_EGL_image_storage; +#define GL_EXT_EGL_sync 1 +GLAD_API_CALL int GLAD_GL_EXT_EGL_sync; +#define GL_EXT_abgr 1 +GLAD_API_CALL int GLAD_GL_EXT_abgr; +#define GL_EXT_bgra 1 +GLAD_API_CALL int GLAD_GL_EXT_bgra; +#define GL_EXT_bindable_uniform 1 +GLAD_API_CALL int GLAD_GL_EXT_bindable_uniform; +#define GL_EXT_blend_color 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_color; +#define GL_EXT_blend_equation_separate 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_equation_separate; +#define GL_EXT_blend_func_separate 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_func_separate; +#define GL_EXT_blend_logic_op 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_logic_op; +#define GL_EXT_blend_minmax 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_minmax; +#define GL_EXT_blend_subtract 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_subtract; +#define GL_EXT_clip_volume_hint 1 +GLAD_API_CALL int GLAD_GL_EXT_clip_volume_hint; +#define GL_EXT_cmyka 1 +GLAD_API_CALL int GLAD_GL_EXT_cmyka; +#define GL_EXT_color_subtable 1 +GLAD_API_CALL int GLAD_GL_EXT_color_subtable; +#define GL_EXT_compiled_vertex_array 1 +GLAD_API_CALL int GLAD_GL_EXT_compiled_vertex_array; +#define GL_EXT_convolution 1 +GLAD_API_CALL int GLAD_GL_EXT_convolution; +#define GL_EXT_coordinate_frame 1 +GLAD_API_CALL int GLAD_GL_EXT_coordinate_frame; +#define GL_EXT_copy_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_copy_texture; +#define GL_EXT_cull_vertex 1 +GLAD_API_CALL int GLAD_GL_EXT_cull_vertex; +#define GL_EXT_debug_label 1 +GLAD_API_CALL int GLAD_GL_EXT_debug_label; +#define GL_EXT_debug_marker 1 +GLAD_API_CALL int GLAD_GL_EXT_debug_marker; +#define GL_EXT_depth_bounds_test 1 +GLAD_API_CALL int GLAD_GL_EXT_depth_bounds_test; +#define GL_EXT_direct_state_access 1 +GLAD_API_CALL int GLAD_GL_EXT_direct_state_access; +#define GL_EXT_draw_buffers2 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_buffers2; +#define GL_EXT_draw_instanced 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_instanced; +#define GL_EXT_draw_range_elements 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_range_elements; +#define GL_EXT_external_buffer 1 +GLAD_API_CALL int GLAD_GL_EXT_external_buffer; +#define GL_EXT_fog_coord 1 +GLAD_API_CALL int GLAD_GL_EXT_fog_coord; +#define GL_EXT_framebuffer_blit 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit; +#define GL_EXT_framebuffer_blit_layers 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit_layers; +#define GL_EXT_framebuffer_multisample 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample; +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample_blit_scaled; +#define GL_EXT_framebuffer_object 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object; +#define GL_EXT_framebuffer_sRGB 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_sRGB; +#define GL_EXT_geometry_shader4 1 +GLAD_API_CALL int GLAD_GL_EXT_geometry_shader4; +#define GL_EXT_gpu_program_parameters 1 +GLAD_API_CALL int GLAD_GL_EXT_gpu_program_parameters; +#define GL_EXT_gpu_shader4 1 +GLAD_API_CALL int GLAD_GL_EXT_gpu_shader4; +#define GL_EXT_histogram 1 +GLAD_API_CALL int GLAD_GL_EXT_histogram; +#define GL_EXT_index_array_formats 1 +GLAD_API_CALL int GLAD_GL_EXT_index_array_formats; +#define GL_EXT_index_func 1 +GLAD_API_CALL int GLAD_GL_EXT_index_func; +#define GL_EXT_index_material 1 +GLAD_API_CALL int GLAD_GL_EXT_index_material; +#define GL_EXT_index_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_index_texture; +#define GL_EXT_light_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_light_texture; +#define GL_EXT_memory_object 1 +GLAD_API_CALL int GLAD_GL_EXT_memory_object; +#define GL_EXT_memory_object_fd 1 +GLAD_API_CALL int GLAD_GL_EXT_memory_object_fd; +#define GL_EXT_memory_object_win32 1 +GLAD_API_CALL int GLAD_GL_EXT_memory_object_win32; +#define GL_EXT_misc_attribute 1 +GLAD_API_CALL int GLAD_GL_EXT_misc_attribute; +#define GL_EXT_multi_draw_arrays 1 +GLAD_API_CALL int GLAD_GL_EXT_multi_draw_arrays; +#define GL_EXT_multisample 1 +GLAD_API_CALL int GLAD_GL_EXT_multisample; +#define GL_EXT_multiview_tessellation_geometry_shader 1 +GLAD_API_CALL int GLAD_GL_EXT_multiview_tessellation_geometry_shader; +#define GL_EXT_multiview_texture_multisample 1 +GLAD_API_CALL int GLAD_GL_EXT_multiview_texture_multisample; +#define GL_EXT_multiview_timer_query 1 +GLAD_API_CALL int GLAD_GL_EXT_multiview_timer_query; +#define GL_EXT_packed_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_EXT_packed_depth_stencil; +#define GL_EXT_packed_float 1 +GLAD_API_CALL int GLAD_GL_EXT_packed_float; +#define GL_EXT_packed_pixels 1 +GLAD_API_CALL int GLAD_GL_EXT_packed_pixels; +#define GL_EXT_paletted_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_paletted_texture; +#define GL_EXT_pixel_buffer_object 1 +GLAD_API_CALL int GLAD_GL_EXT_pixel_buffer_object; +#define GL_EXT_pixel_transform 1 +GLAD_API_CALL int GLAD_GL_EXT_pixel_transform; +#define GL_EXT_pixel_transform_color_table 1 +GLAD_API_CALL int GLAD_GL_EXT_pixel_transform_color_table; +#define GL_EXT_point_parameters 1 +GLAD_API_CALL int GLAD_GL_EXT_point_parameters; +#define GL_EXT_polygon_offset 1 +GLAD_API_CALL int GLAD_GL_EXT_polygon_offset; +#define GL_EXT_polygon_offset_clamp 1 +GLAD_API_CALL int GLAD_GL_EXT_polygon_offset_clamp; +#define GL_EXT_post_depth_coverage 1 +GLAD_API_CALL int GLAD_GL_EXT_post_depth_coverage; +#define GL_EXT_provoking_vertex 1 +GLAD_API_CALL int GLAD_GL_EXT_provoking_vertex; +#define GL_EXT_raster_multisample 1 +GLAD_API_CALL int GLAD_GL_EXT_raster_multisample; +#define GL_EXT_rescale_normal 1 +GLAD_API_CALL int GLAD_GL_EXT_rescale_normal; +#define GL_EXT_secondary_color 1 +GLAD_API_CALL int GLAD_GL_EXT_secondary_color; +#define GL_EXT_semaphore 1 +GLAD_API_CALL int GLAD_GL_EXT_semaphore; +#define GL_EXT_semaphore_fd 1 +GLAD_API_CALL int GLAD_GL_EXT_semaphore_fd; +#define GL_EXT_semaphore_win32 1 +GLAD_API_CALL int GLAD_GL_EXT_semaphore_win32; +#define GL_EXT_separate_shader_objects 1 +GLAD_API_CALL int GLAD_GL_EXT_separate_shader_objects; +#define GL_EXT_separate_specular_color 1 +GLAD_API_CALL int GLAD_GL_EXT_separate_specular_color; +#define GL_EXT_shader_framebuffer_fetch 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_framebuffer_fetch; +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_framebuffer_fetch_non_coherent; +#define GL_EXT_shader_image_load_formatted 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_image_load_formatted; +#define GL_EXT_shader_image_load_store 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_image_load_store; +#define GL_EXT_shader_integer_mix 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_integer_mix; +#define GL_EXT_shader_samples_identical 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_samples_identical; +#define GL_EXT_shadow_funcs 1 +GLAD_API_CALL int GLAD_GL_EXT_shadow_funcs; +#define GL_EXT_shared_texture_palette 1 +GLAD_API_CALL int GLAD_GL_EXT_shared_texture_palette; +#define GL_EXT_sparse_texture2 1 +GLAD_API_CALL int GLAD_GL_EXT_sparse_texture2; +#define GL_EXT_stencil_clear_tag 1 +GLAD_API_CALL int GLAD_GL_EXT_stencil_clear_tag; +#define GL_EXT_stencil_two_side 1 +GLAD_API_CALL int GLAD_GL_EXT_stencil_two_side; +#define GL_EXT_stencil_wrap 1 +GLAD_API_CALL int GLAD_GL_EXT_stencil_wrap; +#define GL_EXT_subtexture 1 +GLAD_API_CALL int GLAD_GL_EXT_subtexture; +#define GL_EXT_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_texture; +#define GL_EXT_texture3D 1 +GLAD_API_CALL int GLAD_GL_EXT_texture3D; +#define GL_EXT_texture_array 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_array; +#define GL_EXT_texture_buffer_object 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_buffer_object; +#define GL_EXT_texture_compression_latc 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_latc; +#define GL_EXT_texture_compression_rgtc 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_rgtc; +#define GL_EXT_texture_compression_s3tc 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_s3tc; +#define GL_EXT_texture_cube_map 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_cube_map; +#define GL_EXT_texture_env_add 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_env_add; +#define GL_EXT_texture_env_combine 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_env_combine; +#define GL_EXT_texture_env_dot3 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_env_dot3; +#define GL_EXT_texture_filter_anisotropic 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_filter_anisotropic; +#define GL_EXT_texture_filter_minmax 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_filter_minmax; +#define GL_EXT_texture_integer 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_integer; +#define GL_EXT_texture_lod_bias 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_lod_bias; +#define GL_EXT_texture_mirror_clamp 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_mirror_clamp; +#define GL_EXT_texture_object 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_object; +#define GL_EXT_texture_perturb_normal 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_perturb_normal; +#define GL_EXT_texture_sRGB 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB; +#define GL_EXT_texture_sRGB_R8 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB_R8; +#define GL_EXT_texture_sRGB_RG8 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB_RG8; +#define GL_EXT_texture_sRGB_decode 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_sRGB_decode; +#define GL_EXT_texture_shadow_lod 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_shadow_lod; +#define GL_EXT_texture_shared_exponent 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_shared_exponent; +#define GL_EXT_texture_snorm 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_snorm; +#define GL_EXT_texture_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_storage; +#define GL_EXT_texture_swizzle 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_swizzle; +#define GL_EXT_timer_query 1 +GLAD_API_CALL int GLAD_GL_EXT_timer_query; +#define GL_EXT_transform_feedback 1 +GLAD_API_CALL int GLAD_GL_EXT_transform_feedback; +#define GL_EXT_vertex_array 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_array; +#define GL_EXT_vertex_array_bgra 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_array_bgra; +#define GL_EXT_vertex_attrib_64bit 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_attrib_64bit; +#define GL_EXT_vertex_shader 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_shader; +#define GL_EXT_vertex_weighting 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_weighting; +#define GL_EXT_win32_keyed_mutex 1 +GLAD_API_CALL int GLAD_GL_EXT_win32_keyed_mutex; +#define GL_EXT_window_rectangles 1 +GLAD_API_CALL int GLAD_GL_EXT_window_rectangles; +#define GL_EXT_x11_sync_object 1 +GLAD_API_CALL int GLAD_GL_EXT_x11_sync_object; +#define GL_GREMEDY_frame_terminator 1 +GLAD_API_CALL int GLAD_GL_GREMEDY_frame_terminator; +#define GL_GREMEDY_string_marker 1 +GLAD_API_CALL int GLAD_GL_GREMEDY_string_marker; +#define GL_HP_convolution_border_modes 1 +GLAD_API_CALL int GLAD_GL_HP_convolution_border_modes; +#define GL_HP_image_transform 1 +GLAD_API_CALL int GLAD_GL_HP_image_transform; +#define GL_HP_occlusion_test 1 +GLAD_API_CALL int GLAD_GL_HP_occlusion_test; +#define GL_HP_texture_lighting 1 +GLAD_API_CALL int GLAD_GL_HP_texture_lighting; +#define GL_IBM_cull_vertex 1 +GLAD_API_CALL int GLAD_GL_IBM_cull_vertex; +#define GL_IBM_multimode_draw_arrays 1 +GLAD_API_CALL int GLAD_GL_IBM_multimode_draw_arrays; +#define GL_IBM_rasterpos_clip 1 +GLAD_API_CALL int GLAD_GL_IBM_rasterpos_clip; +#define GL_IBM_static_data 1 +GLAD_API_CALL int GLAD_GL_IBM_static_data; +#define GL_IBM_texture_mirrored_repeat 1 +GLAD_API_CALL int GLAD_GL_IBM_texture_mirrored_repeat; +#define GL_IBM_vertex_array_lists 1 +GLAD_API_CALL int GLAD_GL_IBM_vertex_array_lists; +#define GL_INGR_blend_func_separate 1 +GLAD_API_CALL int GLAD_GL_INGR_blend_func_separate; +#define GL_INGR_color_clamp 1 +GLAD_API_CALL int GLAD_GL_INGR_color_clamp; +#define GL_INGR_interlace_read 1 +GLAD_API_CALL int GLAD_GL_INGR_interlace_read; +#define GL_INTEL_blackhole_render 1 +GLAD_API_CALL int GLAD_GL_INTEL_blackhole_render; +#define GL_INTEL_conservative_rasterization 1 +GLAD_API_CALL int GLAD_GL_INTEL_conservative_rasterization; +#define GL_INTEL_fragment_shader_ordering 1 +GLAD_API_CALL int GLAD_GL_INTEL_fragment_shader_ordering; +#define GL_INTEL_framebuffer_CMAA 1 +GLAD_API_CALL int GLAD_GL_INTEL_framebuffer_CMAA; +#define GL_INTEL_map_texture 1 +GLAD_API_CALL int GLAD_GL_INTEL_map_texture; +#define GL_INTEL_parallel_arrays 1 +GLAD_API_CALL int GLAD_GL_INTEL_parallel_arrays; +#define GL_INTEL_performance_query 1 +GLAD_API_CALL int GLAD_GL_INTEL_performance_query; +#define GL_KHR_blend_equation_advanced 1 +GLAD_API_CALL int GLAD_GL_KHR_blend_equation_advanced; +#define GL_KHR_blend_equation_advanced_coherent 1 +GLAD_API_CALL int GLAD_GL_KHR_blend_equation_advanced_coherent; +#define GL_KHR_context_flush_control 1 +GLAD_API_CALL int GLAD_GL_KHR_context_flush_control; +#define GL_KHR_debug 1 +GLAD_API_CALL int GLAD_GL_KHR_debug; +#define GL_KHR_no_error 1 +GLAD_API_CALL int GLAD_GL_KHR_no_error; +#define GL_KHR_parallel_shader_compile 1 +GLAD_API_CALL int GLAD_GL_KHR_parallel_shader_compile; +#define GL_KHR_robust_buffer_access_behavior 1 +GLAD_API_CALL int GLAD_GL_KHR_robust_buffer_access_behavior; +#define GL_KHR_robustness 1 +GLAD_API_CALL int GLAD_GL_KHR_robustness; +#define GL_KHR_shader_subgroup 1 +GLAD_API_CALL int GLAD_GL_KHR_shader_subgroup; +#define GL_KHR_texture_compression_astc_hdr 1 +GLAD_API_CALL int GLAD_GL_KHR_texture_compression_astc_hdr; +#define GL_KHR_texture_compression_astc_ldr 1 +GLAD_API_CALL int GLAD_GL_KHR_texture_compression_astc_ldr; +#define GL_KHR_texture_compression_astc_sliced_3d 1 +GLAD_API_CALL int GLAD_GL_KHR_texture_compression_astc_sliced_3d; +#define GL_MESAX_texture_stack 1 +GLAD_API_CALL int GLAD_GL_MESAX_texture_stack; +#define GL_MESA_framebuffer_flip_x 1 +GLAD_API_CALL int GLAD_GL_MESA_framebuffer_flip_x; +#define GL_MESA_framebuffer_flip_y 1 +GLAD_API_CALL int GLAD_GL_MESA_framebuffer_flip_y; +#define GL_MESA_framebuffer_swap_xy 1 +GLAD_API_CALL int GLAD_GL_MESA_framebuffer_swap_xy; +#define GL_MESA_pack_invert 1 +GLAD_API_CALL int GLAD_GL_MESA_pack_invert; +#define GL_MESA_program_binary_formats 1 +GLAD_API_CALL int GLAD_GL_MESA_program_binary_formats; +#define GL_MESA_resize_buffers 1 +GLAD_API_CALL int GLAD_GL_MESA_resize_buffers; +#define GL_MESA_shader_integer_functions 1 +GLAD_API_CALL int GLAD_GL_MESA_shader_integer_functions; +#define GL_MESA_tile_raster_order 1 +GLAD_API_CALL int GLAD_GL_MESA_tile_raster_order; +#define GL_MESA_window_pos 1 +GLAD_API_CALL int GLAD_GL_MESA_window_pos; +#define GL_MESA_ycbcr_texture 1 +GLAD_API_CALL int GLAD_GL_MESA_ycbcr_texture; +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_NVX_blend_equation_advanced_multi_draw_buffers; +#define GL_NVX_conditional_render 1 +GLAD_API_CALL int GLAD_GL_NVX_conditional_render; +#define GL_NVX_gpu_memory_info 1 +GLAD_API_CALL int GLAD_GL_NVX_gpu_memory_info; +#define GL_NVX_gpu_multicast2 1 +GLAD_API_CALL int GLAD_GL_NVX_gpu_multicast2; +#define GL_NVX_linked_gpu_multicast 1 +GLAD_API_CALL int GLAD_GL_NVX_linked_gpu_multicast; +#define GL_NVX_progress_fence 1 +GLAD_API_CALL int GLAD_GL_NVX_progress_fence; +#define GL_NV_alpha_to_coverage_dither_control 1 +GLAD_API_CALL int GLAD_GL_NV_alpha_to_coverage_dither_control; +#define GL_NV_bindless_multi_draw_indirect 1 +GLAD_API_CALL int GLAD_GL_NV_bindless_multi_draw_indirect; +#define GL_NV_bindless_multi_draw_indirect_count 1 +GLAD_API_CALL int GLAD_GL_NV_bindless_multi_draw_indirect_count; +#define GL_NV_bindless_texture 1 +GLAD_API_CALL int GLAD_GL_NV_bindless_texture; +#define GL_NV_blend_equation_advanced 1 +GLAD_API_CALL int GLAD_GL_NV_blend_equation_advanced; +#define GL_NV_blend_equation_advanced_coherent 1 +GLAD_API_CALL int GLAD_GL_NV_blend_equation_advanced_coherent; +#define GL_NV_blend_minmax_factor 1 +GLAD_API_CALL int GLAD_GL_NV_blend_minmax_factor; +#define GL_NV_blend_square 1 +GLAD_API_CALL int GLAD_GL_NV_blend_square; +#define GL_NV_clip_space_w_scaling 1 +GLAD_API_CALL int GLAD_GL_NV_clip_space_w_scaling; +#define GL_NV_command_list 1 +GLAD_API_CALL int GLAD_GL_NV_command_list; +#define GL_NV_compute_program5 1 +GLAD_API_CALL int GLAD_GL_NV_compute_program5; +#define GL_NV_compute_shader_derivatives 1 +GLAD_API_CALL int GLAD_GL_NV_compute_shader_derivatives; +#define GL_NV_conditional_render 1 +GLAD_API_CALL int GLAD_GL_NV_conditional_render; +#define GL_NV_conservative_raster 1 +GLAD_API_CALL int GLAD_GL_NV_conservative_raster; +#define GL_NV_conservative_raster_dilate 1 +GLAD_API_CALL int GLAD_GL_NV_conservative_raster_dilate; +#define GL_NV_conservative_raster_pre_snap 1 +GLAD_API_CALL int GLAD_GL_NV_conservative_raster_pre_snap; +#define GL_NV_conservative_raster_pre_snap_triangles 1 +GLAD_API_CALL int GLAD_GL_NV_conservative_raster_pre_snap_triangles; +#define GL_NV_conservative_raster_underestimation 1 +GLAD_API_CALL int GLAD_GL_NV_conservative_raster_underestimation; +#define GL_NV_copy_depth_to_color 1 +GLAD_API_CALL int GLAD_GL_NV_copy_depth_to_color; +#define GL_NV_copy_image 1 +GLAD_API_CALL int GLAD_GL_NV_copy_image; +#define GL_NV_deep_texture3D 1 +GLAD_API_CALL int GLAD_GL_NV_deep_texture3D; +#define GL_NV_depth_buffer_float 1 +GLAD_API_CALL int GLAD_GL_NV_depth_buffer_float; +#define GL_NV_depth_clamp 1 +GLAD_API_CALL int GLAD_GL_NV_depth_clamp; +#define GL_NV_draw_texture 1 +GLAD_API_CALL int GLAD_GL_NV_draw_texture; +#define GL_NV_draw_vulkan_image 1 +GLAD_API_CALL int GLAD_GL_NV_draw_vulkan_image; +#define GL_NV_evaluators 1 +GLAD_API_CALL int GLAD_GL_NV_evaluators; +#define GL_NV_explicit_multisample 1 +GLAD_API_CALL int GLAD_GL_NV_explicit_multisample; +#define GL_NV_fence 1 +GLAD_API_CALL int GLAD_GL_NV_fence; +#define GL_NV_fill_rectangle 1 +GLAD_API_CALL int GLAD_GL_NV_fill_rectangle; +#define GL_NV_float_buffer 1 +GLAD_API_CALL int GLAD_GL_NV_float_buffer; +#define GL_NV_fog_distance 1 +GLAD_API_CALL int GLAD_GL_NV_fog_distance; +#define GL_NV_fragment_coverage_to_color 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_coverage_to_color; +#define GL_NV_fragment_program 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_program; +#define GL_NV_fragment_program2 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_program2; +#define GL_NV_fragment_program4 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_program4; +#define GL_NV_fragment_program_option 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_program_option; +#define GL_NV_fragment_shader_barycentric 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_shader_barycentric; +#define GL_NV_fragment_shader_interlock 1 +GLAD_API_CALL int GLAD_GL_NV_fragment_shader_interlock; +#define GL_NV_framebuffer_mixed_samples 1 +GLAD_API_CALL int GLAD_GL_NV_framebuffer_mixed_samples; +#define GL_NV_framebuffer_multisample_coverage 1 +GLAD_API_CALL int GLAD_GL_NV_framebuffer_multisample_coverage; +#define GL_NV_geometry_program4 1 +GLAD_API_CALL int GLAD_GL_NV_geometry_program4; +#define GL_NV_geometry_shader4 1 +GLAD_API_CALL int GLAD_GL_NV_geometry_shader4; +#define GL_NV_geometry_shader_passthrough 1 +GLAD_API_CALL int GLAD_GL_NV_geometry_shader_passthrough; +#define GL_NV_gpu_multicast 1 +GLAD_API_CALL int GLAD_GL_NV_gpu_multicast; +#define GL_NV_gpu_program4 1 +GLAD_API_CALL int GLAD_GL_NV_gpu_program4; +#define GL_NV_gpu_program5 1 +GLAD_API_CALL int GLAD_GL_NV_gpu_program5; +#define GL_NV_gpu_program5_mem_extended 1 +GLAD_API_CALL int GLAD_GL_NV_gpu_program5_mem_extended; +#define GL_NV_gpu_shader5 1 +GLAD_API_CALL int GLAD_GL_NV_gpu_shader5; +#define GL_NV_half_float 1 +GLAD_API_CALL int GLAD_GL_NV_half_float; +#define GL_NV_internalformat_sample_query 1 +GLAD_API_CALL int GLAD_GL_NV_internalformat_sample_query; +#define GL_NV_light_max_exponent 1 +GLAD_API_CALL int GLAD_GL_NV_light_max_exponent; +#define GL_NV_memory_attachment 1 +GLAD_API_CALL int GLAD_GL_NV_memory_attachment; +#define GL_NV_memory_object_sparse 1 +GLAD_API_CALL int GLAD_GL_NV_memory_object_sparse; +#define GL_NV_mesh_shader 1 +GLAD_API_CALL int GLAD_GL_NV_mesh_shader; +#define GL_NV_multisample_coverage 1 +GLAD_API_CALL int GLAD_GL_NV_multisample_coverage; +#define GL_NV_multisample_filter_hint 1 +GLAD_API_CALL int GLAD_GL_NV_multisample_filter_hint; +#define GL_NV_occlusion_query 1 +GLAD_API_CALL int GLAD_GL_NV_occlusion_query; +#define GL_NV_packed_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_NV_packed_depth_stencil; +#define GL_NV_parameter_buffer_object 1 +GLAD_API_CALL int GLAD_GL_NV_parameter_buffer_object; +#define GL_NV_parameter_buffer_object2 1 +GLAD_API_CALL int GLAD_GL_NV_parameter_buffer_object2; +#define GL_NV_path_rendering 1 +GLAD_API_CALL int GLAD_GL_NV_path_rendering; +#define GL_NV_path_rendering_shared_edge 1 +GLAD_API_CALL int GLAD_GL_NV_path_rendering_shared_edge; +#define GL_NV_pixel_data_range 1 +GLAD_API_CALL int GLAD_GL_NV_pixel_data_range; +#define GL_NV_point_sprite 1 +GLAD_API_CALL int GLAD_GL_NV_point_sprite; +#define GL_NV_present_video 1 +GLAD_API_CALL int GLAD_GL_NV_present_video; +#define GL_NV_primitive_restart 1 +GLAD_API_CALL int GLAD_GL_NV_primitive_restart; +#define GL_NV_primitive_shading_rate 1 +GLAD_API_CALL int GLAD_GL_NV_primitive_shading_rate; +#define GL_NV_query_resource 1 +GLAD_API_CALL int GLAD_GL_NV_query_resource; +#define GL_NV_query_resource_tag 1 +GLAD_API_CALL int GLAD_GL_NV_query_resource_tag; +#define GL_NV_register_combiners 1 +GLAD_API_CALL int GLAD_GL_NV_register_combiners; +#define GL_NV_register_combiners2 1 +GLAD_API_CALL int GLAD_GL_NV_register_combiners2; +#define GL_NV_representative_fragment_test 1 +GLAD_API_CALL int GLAD_GL_NV_representative_fragment_test; +#define GL_NV_robustness_video_memory_purge 1 +GLAD_API_CALL int GLAD_GL_NV_robustness_video_memory_purge; +#define GL_NV_sample_locations 1 +GLAD_API_CALL int GLAD_GL_NV_sample_locations; +#define GL_NV_sample_mask_override_coverage 1 +GLAD_API_CALL int GLAD_GL_NV_sample_mask_override_coverage; +#define GL_NV_scissor_exclusive 1 +GLAD_API_CALL int GLAD_GL_NV_scissor_exclusive; +#define GL_NV_shader_atomic_counters 1 +GLAD_API_CALL int GLAD_GL_NV_shader_atomic_counters; +#define GL_NV_shader_atomic_float 1 +GLAD_API_CALL int GLAD_GL_NV_shader_atomic_float; +#define GL_NV_shader_atomic_float64 1 +GLAD_API_CALL int GLAD_GL_NV_shader_atomic_float64; +#define GL_NV_shader_atomic_fp16_vector 1 +GLAD_API_CALL int GLAD_GL_NV_shader_atomic_fp16_vector; +#define GL_NV_shader_atomic_int64 1 +GLAD_API_CALL int GLAD_GL_NV_shader_atomic_int64; +#define GL_NV_shader_buffer_load 1 +GLAD_API_CALL int GLAD_GL_NV_shader_buffer_load; +#define GL_NV_shader_buffer_store 1 +GLAD_API_CALL int GLAD_GL_NV_shader_buffer_store; +#define GL_NV_shader_storage_buffer_object 1 +GLAD_API_CALL int GLAD_GL_NV_shader_storage_buffer_object; +#define GL_NV_shader_subgroup_partitioned 1 +GLAD_API_CALL int GLAD_GL_NV_shader_subgroup_partitioned; +#define GL_NV_shader_texture_footprint 1 +GLAD_API_CALL int GLAD_GL_NV_shader_texture_footprint; +#define GL_NV_shader_thread_group 1 +GLAD_API_CALL int GLAD_GL_NV_shader_thread_group; +#define GL_NV_shader_thread_shuffle 1 +GLAD_API_CALL int GLAD_GL_NV_shader_thread_shuffle; +#define GL_NV_shading_rate_image 1 +GLAD_API_CALL int GLAD_GL_NV_shading_rate_image; +#define GL_NV_stereo_view_rendering 1 +GLAD_API_CALL int GLAD_GL_NV_stereo_view_rendering; +#define GL_NV_tessellation_program5 1 +GLAD_API_CALL int GLAD_GL_NV_tessellation_program5; +#define GL_NV_texgen_emboss 1 +GLAD_API_CALL int GLAD_GL_NV_texgen_emboss; +#define GL_NV_texgen_reflection 1 +GLAD_API_CALL int GLAD_GL_NV_texgen_reflection; +#define GL_NV_texture_barrier 1 +GLAD_API_CALL int GLAD_GL_NV_texture_barrier; +#define GL_NV_texture_compression_vtc 1 +GLAD_API_CALL int GLAD_GL_NV_texture_compression_vtc; +#define GL_NV_texture_env_combine4 1 +GLAD_API_CALL int GLAD_GL_NV_texture_env_combine4; +#define GL_NV_texture_expand_normal 1 +GLAD_API_CALL int GLAD_GL_NV_texture_expand_normal; +#define GL_NV_texture_multisample 1 +GLAD_API_CALL int GLAD_GL_NV_texture_multisample; +#define GL_NV_texture_rectangle 1 +GLAD_API_CALL int GLAD_GL_NV_texture_rectangle; +#define GL_NV_texture_rectangle_compressed 1 +GLAD_API_CALL int GLAD_GL_NV_texture_rectangle_compressed; +#define GL_NV_texture_shader 1 +GLAD_API_CALL int GLAD_GL_NV_texture_shader; +#define GL_NV_texture_shader2 1 +GLAD_API_CALL int GLAD_GL_NV_texture_shader2; +#define GL_NV_texture_shader3 1 +GLAD_API_CALL int GLAD_GL_NV_texture_shader3; +#define GL_NV_timeline_semaphore 1 +GLAD_API_CALL int GLAD_GL_NV_timeline_semaphore; +#define GL_NV_transform_feedback 1 +GLAD_API_CALL int GLAD_GL_NV_transform_feedback; +#define GL_NV_transform_feedback2 1 +GLAD_API_CALL int GLAD_GL_NV_transform_feedback2; +#define GL_NV_uniform_buffer_std430_layout 1 +GLAD_API_CALL int GLAD_GL_NV_uniform_buffer_std430_layout; +#define GL_NV_uniform_buffer_unified_memory 1 +GLAD_API_CALL int GLAD_GL_NV_uniform_buffer_unified_memory; +#define GL_NV_vdpau_interop 1 +GLAD_API_CALL int GLAD_GL_NV_vdpau_interop; +#define GL_NV_vdpau_interop2 1 +GLAD_API_CALL int GLAD_GL_NV_vdpau_interop2; +#define GL_NV_vertex_array_range 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_array_range; +#define GL_NV_vertex_array_range2 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_array_range2; +#define GL_NV_vertex_attrib_integer_64bit 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_attrib_integer_64bit; +#define GL_NV_vertex_buffer_unified_memory 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_buffer_unified_memory; +#define GL_NV_vertex_program 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program; +#define GL_NV_vertex_program1_1 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program1_1; +#define GL_NV_vertex_program2 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program2; +#define GL_NV_vertex_program2_option 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program2_option; +#define GL_NV_vertex_program3 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program3; +#define GL_NV_vertex_program4 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program4; +#define GL_NV_video_capture 1 +GLAD_API_CALL int GLAD_GL_NV_video_capture; +#define GL_NV_viewport_array2 1 +GLAD_API_CALL int GLAD_GL_NV_viewport_array2; +#define GL_NV_viewport_swizzle 1 +GLAD_API_CALL int GLAD_GL_NV_viewport_swizzle; +#define GL_OES_byte_coordinates 1 +GLAD_API_CALL int GLAD_GL_OES_byte_coordinates; +#define GL_OES_compressed_paletted_texture 1 +GLAD_API_CALL int GLAD_GL_OES_compressed_paletted_texture; +#define GL_OES_fixed_point 1 +GLAD_API_CALL int GLAD_GL_OES_fixed_point; +#define GL_OES_query_matrix 1 +GLAD_API_CALL int GLAD_GL_OES_query_matrix; +#define GL_OES_read_format 1 +GLAD_API_CALL int GLAD_GL_OES_read_format; +#define GL_OES_single_precision 1 +GLAD_API_CALL int GLAD_GL_OES_single_precision; +#define GL_OML_interlace 1 +GLAD_API_CALL int GLAD_GL_OML_interlace; +#define GL_OML_resample 1 +GLAD_API_CALL int GLAD_GL_OML_resample; +#define GL_OML_subsample 1 +GLAD_API_CALL int GLAD_GL_OML_subsample; +#define GL_OVR_multiview 1 +GLAD_API_CALL int GLAD_GL_OVR_multiview; +#define GL_OVR_multiview2 1 +GLAD_API_CALL int GLAD_GL_OVR_multiview2; +#define GL_PGI_misc_hints 1 +GLAD_API_CALL int GLAD_GL_PGI_misc_hints; +#define GL_PGI_vertex_hints 1 +GLAD_API_CALL int GLAD_GL_PGI_vertex_hints; +#define GL_REND_screen_coordinates 1 +GLAD_API_CALL int GLAD_GL_REND_screen_coordinates; +#define GL_S3_s3tc 1 +GLAD_API_CALL int GLAD_GL_S3_s3tc; +#define GL_SGIS_detail_texture 1 +GLAD_API_CALL int GLAD_GL_SGIS_detail_texture; +#define GL_SGIS_fog_function 1 +GLAD_API_CALL int GLAD_GL_SGIS_fog_function; +#define GL_SGIS_generate_mipmap 1 +GLAD_API_CALL int GLAD_GL_SGIS_generate_mipmap; +#define GL_SGIS_multisample 1 +GLAD_API_CALL int GLAD_GL_SGIS_multisample; +#define GL_SGIS_pixel_texture 1 +GLAD_API_CALL int GLAD_GL_SGIS_pixel_texture; +#define GL_SGIS_point_line_texgen 1 +GLAD_API_CALL int GLAD_GL_SGIS_point_line_texgen; +#define GL_SGIS_point_parameters 1 +GLAD_API_CALL int GLAD_GL_SGIS_point_parameters; +#define GL_SGIS_sharpen_texture 1 +GLAD_API_CALL int GLAD_GL_SGIS_sharpen_texture; +#define GL_SGIS_texture4D 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture4D; +#define GL_SGIS_texture_border_clamp 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_border_clamp; +#define GL_SGIS_texture_color_mask 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_color_mask; +#define GL_SGIS_texture_edge_clamp 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_edge_clamp; +#define GL_SGIS_texture_filter4 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_filter4; +#define GL_SGIS_texture_lod 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_lod; +#define GL_SGIS_texture_select 1 +GLAD_API_CALL int GLAD_GL_SGIS_texture_select; +#define GL_SGIX_async 1 +GLAD_API_CALL int GLAD_GL_SGIX_async; +#define GL_SGIX_async_histogram 1 +GLAD_API_CALL int GLAD_GL_SGIX_async_histogram; +#define GL_SGIX_async_pixel 1 +GLAD_API_CALL int GLAD_GL_SGIX_async_pixel; +#define GL_SGIX_blend_alpha_minmax 1 +GLAD_API_CALL int GLAD_GL_SGIX_blend_alpha_minmax; +#define GL_SGIX_calligraphic_fragment 1 +GLAD_API_CALL int GLAD_GL_SGIX_calligraphic_fragment; +#define GL_SGIX_clipmap 1 +GLAD_API_CALL int GLAD_GL_SGIX_clipmap; +#define GL_SGIX_convolution_accuracy 1 +GLAD_API_CALL int GLAD_GL_SGIX_convolution_accuracy; +#define GL_SGIX_depth_pass_instrument 1 +GLAD_API_CALL int GLAD_GL_SGIX_depth_pass_instrument; +#define GL_SGIX_depth_texture 1 +GLAD_API_CALL int GLAD_GL_SGIX_depth_texture; +#define GL_SGIX_flush_raster 1 +GLAD_API_CALL int GLAD_GL_SGIX_flush_raster; +#define GL_SGIX_fog_offset 1 +GLAD_API_CALL int GLAD_GL_SGIX_fog_offset; +#define GL_SGIX_fragment_lighting 1 +GLAD_API_CALL int GLAD_GL_SGIX_fragment_lighting; +#define GL_SGIX_framezoom 1 +GLAD_API_CALL int GLAD_GL_SGIX_framezoom; +#define GL_SGIX_igloo_interface 1 +GLAD_API_CALL int GLAD_GL_SGIX_igloo_interface; +#define GL_SGIX_instruments 1 +GLAD_API_CALL int GLAD_GL_SGIX_instruments; +#define GL_SGIX_interlace 1 +GLAD_API_CALL int GLAD_GL_SGIX_interlace; +#define GL_SGIX_ir_instrument1 1 +GLAD_API_CALL int GLAD_GL_SGIX_ir_instrument1; +#define GL_SGIX_list_priority 1 +GLAD_API_CALL int GLAD_GL_SGIX_list_priority; +#define GL_SGIX_pixel_texture 1 +GLAD_API_CALL int GLAD_GL_SGIX_pixel_texture; +#define GL_SGIX_pixel_tiles 1 +GLAD_API_CALL int GLAD_GL_SGIX_pixel_tiles; +#define GL_SGIX_polynomial_ffd 1 +GLAD_API_CALL int GLAD_GL_SGIX_polynomial_ffd; +#define GL_SGIX_reference_plane 1 +GLAD_API_CALL int GLAD_GL_SGIX_reference_plane; +#define GL_SGIX_resample 1 +GLAD_API_CALL int GLAD_GL_SGIX_resample; +#define GL_SGIX_scalebias_hint 1 +GLAD_API_CALL int GLAD_GL_SGIX_scalebias_hint; +#define GL_SGIX_shadow 1 +GLAD_API_CALL int GLAD_GL_SGIX_shadow; +#define GL_SGIX_shadow_ambient 1 +GLAD_API_CALL int GLAD_GL_SGIX_shadow_ambient; +#define GL_SGIX_sprite 1 +GLAD_API_CALL int GLAD_GL_SGIX_sprite; +#define GL_SGIX_subsample 1 +GLAD_API_CALL int GLAD_GL_SGIX_subsample; +#define GL_SGIX_tag_sample_buffer 1 +GLAD_API_CALL int GLAD_GL_SGIX_tag_sample_buffer; +#define GL_SGIX_texture_add_env 1 +GLAD_API_CALL int GLAD_GL_SGIX_texture_add_env; +#define GL_SGIX_texture_coordinate_clamp 1 +GLAD_API_CALL int GLAD_GL_SGIX_texture_coordinate_clamp; +#define GL_SGIX_texture_lod_bias 1 +GLAD_API_CALL int GLAD_GL_SGIX_texture_lod_bias; +#define GL_SGIX_texture_multi_buffer 1 +GLAD_API_CALL int GLAD_GL_SGIX_texture_multi_buffer; +#define GL_SGIX_texture_scale_bias 1 +GLAD_API_CALL int GLAD_GL_SGIX_texture_scale_bias; +#define GL_SGIX_vertex_preclip 1 +GLAD_API_CALL int GLAD_GL_SGIX_vertex_preclip; +#define GL_SGIX_ycrcb 1 +GLAD_API_CALL int GLAD_GL_SGIX_ycrcb; +#define GL_SGIX_ycrcb_subsample 1 +GLAD_API_CALL int GLAD_GL_SGIX_ycrcb_subsample; +#define GL_SGIX_ycrcba 1 +GLAD_API_CALL int GLAD_GL_SGIX_ycrcba; +#define GL_SGI_color_matrix 1 +GLAD_API_CALL int GLAD_GL_SGI_color_matrix; +#define GL_SGI_color_table 1 +GLAD_API_CALL int GLAD_GL_SGI_color_table; +#define GL_SGI_texture_color_table 1 +GLAD_API_CALL int GLAD_GL_SGI_texture_color_table; +#define GL_SUNX_constant_data 1 +GLAD_API_CALL int GLAD_GL_SUNX_constant_data; +#define GL_SUN_convolution_border_modes 1 +GLAD_API_CALL int GLAD_GL_SUN_convolution_border_modes; +#define GL_SUN_global_alpha 1 +GLAD_API_CALL int GLAD_GL_SUN_global_alpha; +#define GL_SUN_mesh_array 1 +GLAD_API_CALL int GLAD_GL_SUN_mesh_array; +#define GL_SUN_slice_accum 1 +GLAD_API_CALL int GLAD_GL_SUN_slice_accum; +#define GL_SUN_triangle_list 1 +GLAD_API_CALL int GLAD_GL_SUN_triangle_list; +#define GL_SUN_vertex 1 +GLAD_API_CALL int GLAD_GL_SUN_vertex; +#define GL_WIN_phong_shading 1 +GLAD_API_CALL int GLAD_GL_WIN_phong_shading; +#define GL_WIN_specular_fog 1 +GLAD_API_CALL int GLAD_GL_WIN_specular_fog; +#define GL_AMD_compressed_3DC_texture 1 +GLAD_API_CALL int GLAD_GL_AMD_compressed_3DC_texture; +#define GL_AMD_compressed_ATC_texture 1 +GLAD_API_CALL int GLAD_GL_AMD_compressed_ATC_texture; +#define GL_AMD_program_binary_Z400 1 +GLAD_API_CALL int GLAD_GL_AMD_program_binary_Z400; +#define GL_ANDROID_extension_pack_es31a 1 +GLAD_API_CALL int GLAD_GL_ANDROID_extension_pack_es31a; +#define GL_ANGLE_depth_texture 1 +GLAD_API_CALL int GLAD_GL_ANGLE_depth_texture; +#define GL_ANGLE_framebuffer_blit 1 +GLAD_API_CALL int GLAD_GL_ANGLE_framebuffer_blit; +#define GL_ANGLE_framebuffer_multisample 1 +GLAD_API_CALL int GLAD_GL_ANGLE_framebuffer_multisample; +#define GL_ANGLE_instanced_arrays 1 +GLAD_API_CALL int GLAD_GL_ANGLE_instanced_arrays; +#define GL_ANGLE_pack_reverse_row_order 1 +GLAD_API_CALL int GLAD_GL_ANGLE_pack_reverse_row_order; +#define GL_ANGLE_program_binary 1 +GLAD_API_CALL int GLAD_GL_ANGLE_program_binary; +#define GL_ANGLE_texture_compression_dxt3 1 +GLAD_API_CALL int GLAD_GL_ANGLE_texture_compression_dxt3; +#define GL_ANGLE_texture_compression_dxt5 1 +GLAD_API_CALL int GLAD_GL_ANGLE_texture_compression_dxt5; +#define GL_ANGLE_texture_usage 1 +GLAD_API_CALL int GLAD_GL_ANGLE_texture_usage; +#define GL_ANGLE_translated_shader_source 1 +GLAD_API_CALL int GLAD_GL_ANGLE_translated_shader_source; +#define GL_APPLE_clip_distance 1 +GLAD_API_CALL int GLAD_GL_APPLE_clip_distance; +#define GL_APPLE_color_buffer_packed_float 1 +GLAD_API_CALL int GLAD_GL_APPLE_color_buffer_packed_float; +#define GL_APPLE_copy_texture_levels 1 +GLAD_API_CALL int GLAD_GL_APPLE_copy_texture_levels; +#define GL_APPLE_framebuffer_multisample 1 +GLAD_API_CALL int GLAD_GL_APPLE_framebuffer_multisample; +#define GL_APPLE_sync 1 +GLAD_API_CALL int GLAD_GL_APPLE_sync; +#define GL_APPLE_texture_format_BGRA8888 1 +GLAD_API_CALL int GLAD_GL_APPLE_texture_format_BGRA8888; +#define GL_APPLE_texture_max_level 1 +GLAD_API_CALL int GLAD_GL_APPLE_texture_max_level; +#define GL_APPLE_texture_packed_float 1 +GLAD_API_CALL int GLAD_GL_APPLE_texture_packed_float; +#define GL_ARM_mali_program_binary 1 +GLAD_API_CALL int GLAD_GL_ARM_mali_program_binary; +#define GL_ARM_mali_shader_binary 1 +GLAD_API_CALL int GLAD_GL_ARM_mali_shader_binary; +#define GL_ARM_rgba8 1 +GLAD_API_CALL int GLAD_GL_ARM_rgba8; +#define GL_ARM_shader_core_properties 1 +GLAD_API_CALL int GLAD_GL_ARM_shader_core_properties; +#define GL_ARM_shader_framebuffer_fetch 1 +GLAD_API_CALL int GLAD_GL_ARM_shader_framebuffer_fetch; +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_ARM_shader_framebuffer_fetch_depth_stencil; +#define GL_ARM_texture_unnormalized_coordinates 1 +GLAD_API_CALL int GLAD_GL_ARM_texture_unnormalized_coordinates; +#define GL_DMP_program_binary 1 +GLAD_API_CALL int GLAD_GL_DMP_program_binary; +#define GL_DMP_shader_binary 1 +GLAD_API_CALL int GLAD_GL_DMP_shader_binary; +#define GL_EXT_EGL_image_array 1 +GLAD_API_CALL int GLAD_GL_EXT_EGL_image_array; +#define GL_EXT_EGL_image_storage_compression 1 +GLAD_API_CALL int GLAD_GL_EXT_EGL_image_storage_compression; +#define GL_EXT_YUV_target 1 +GLAD_API_CALL int GLAD_GL_EXT_YUV_target; +#define GL_EXT_base_instance 1 +GLAD_API_CALL int GLAD_GL_EXT_base_instance; +#define GL_EXT_blend_func_extended 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_func_extended; +#define GL_EXT_buffer_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_buffer_storage; +#define GL_EXT_clear_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_clear_texture; +#define GL_EXT_clip_control 1 +GLAD_API_CALL int GLAD_GL_EXT_clip_control; +#define GL_EXT_clip_cull_distance 1 +GLAD_API_CALL int GLAD_GL_EXT_clip_cull_distance; +#define GL_EXT_color_buffer_float 1 +GLAD_API_CALL int GLAD_GL_EXT_color_buffer_float; +#define GL_EXT_color_buffer_half_float 1 +GLAD_API_CALL int GLAD_GL_EXT_color_buffer_half_float; +#define GL_EXT_conservative_depth 1 +GLAD_API_CALL int GLAD_GL_EXT_conservative_depth; +#define GL_EXT_copy_image 1 +GLAD_API_CALL int GLAD_GL_EXT_copy_image; +#define GL_EXT_depth_clamp 1 +GLAD_API_CALL int GLAD_GL_EXT_depth_clamp; +#define GL_EXT_discard_framebuffer 1 +GLAD_API_CALL int GLAD_GL_EXT_discard_framebuffer; +#define GL_EXT_disjoint_timer_query 1 +GLAD_API_CALL int GLAD_GL_EXT_disjoint_timer_query; +#define GL_EXT_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_buffers; +#define GL_EXT_draw_buffers_indexed 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_buffers_indexed; +#define GL_EXT_draw_elements_base_vertex 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_elements_base_vertex; +#define GL_EXT_draw_transform_feedback 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_transform_feedback; +#define GL_EXT_float_blend 1 +GLAD_API_CALL int GLAD_GL_EXT_float_blend; +#define GL_EXT_fragment_shading_rate 1 +GLAD_API_CALL int GLAD_GL_EXT_fragment_shading_rate; +#define GL_EXT_geometry_point_size 1 +GLAD_API_CALL int GLAD_GL_EXT_geometry_point_size; +#define GL_EXT_geometry_shader 1 +GLAD_API_CALL int GLAD_GL_EXT_geometry_shader; +#define GL_EXT_gpu_shader5 1 +GLAD_API_CALL int GLAD_GL_EXT_gpu_shader5; +#define GL_EXT_instanced_arrays 1 +GLAD_API_CALL int GLAD_GL_EXT_instanced_arrays; +#define GL_EXT_map_buffer_range 1 +GLAD_API_CALL int GLAD_GL_EXT_map_buffer_range; +#define GL_EXT_multi_draw_indirect 1 +GLAD_API_CALL int GLAD_GL_EXT_multi_draw_indirect; +#define GL_EXT_multisampled_compatibility 1 +GLAD_API_CALL int GLAD_GL_EXT_multisampled_compatibility; +#define GL_EXT_multisampled_render_to_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_multisampled_render_to_texture; +#define GL_EXT_multisampled_render_to_texture2 1 +GLAD_API_CALL int GLAD_GL_EXT_multisampled_render_to_texture2; +#define GL_EXT_multiview_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_EXT_multiview_draw_buffers; +#define GL_EXT_occlusion_query_boolean 1 +GLAD_API_CALL int GLAD_GL_EXT_occlusion_query_boolean; +#define GL_EXT_primitive_bounding_box 1 +GLAD_API_CALL int GLAD_GL_EXT_primitive_bounding_box; +#define GL_EXT_protected_textures 1 +GLAD_API_CALL int GLAD_GL_EXT_protected_textures; +#define GL_EXT_pvrtc_sRGB 1 +GLAD_API_CALL int GLAD_GL_EXT_pvrtc_sRGB; +#define GL_EXT_read_format_bgra 1 +GLAD_API_CALL int GLAD_GL_EXT_read_format_bgra; +#define GL_EXT_render_snorm 1 +GLAD_API_CALL int GLAD_GL_EXT_render_snorm; +#define GL_EXT_robustness 1 +GLAD_API_CALL int GLAD_GL_EXT_robustness; +#define GL_EXT_sRGB 1 +GLAD_API_CALL int GLAD_GL_EXT_sRGB; +#define GL_EXT_sRGB_write_control 1 +GLAD_API_CALL int GLAD_GL_EXT_sRGB_write_control; +#define GL_EXT_separate_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_EXT_separate_depth_stencil; +#define GL_EXT_shader_group_vote 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_group_vote; +#define GL_EXT_shader_implicit_conversions 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_implicit_conversions; +#define GL_EXT_shader_io_blocks 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_io_blocks; +#define GL_EXT_shader_non_constant_global_initializers 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_non_constant_global_initializers; +#define GL_EXT_shader_pixel_local_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_pixel_local_storage; +#define GL_EXT_shader_pixel_local_storage2 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_pixel_local_storage2; +#define GL_EXT_shader_texture_lod 1 +GLAD_API_CALL int GLAD_GL_EXT_shader_texture_lod; +#define GL_EXT_shadow_samplers 1 +GLAD_API_CALL int GLAD_GL_EXT_shadow_samplers; +#define GL_EXT_sparse_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_sparse_texture; +#define GL_EXT_tessellation_point_size 1 +GLAD_API_CALL int GLAD_GL_EXT_tessellation_point_size; +#define GL_EXT_tessellation_shader 1 +GLAD_API_CALL int GLAD_GL_EXT_tessellation_shader; +#define GL_EXT_texture_border_clamp 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_border_clamp; +#define GL_EXT_texture_buffer 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_buffer; +#define GL_EXT_texture_compression_astc_decode_mode 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_astc_decode_mode; +#define GL_EXT_texture_compression_bptc 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_bptc; +#define GL_EXT_texture_compression_dxt1 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_dxt1; +#define GL_EXT_texture_compression_s3tc_srgb 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_compression_s3tc_srgb; +#define GL_EXT_texture_cube_map_array 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_cube_map_array; +#define GL_EXT_texture_format_BGRA8888 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_format_BGRA8888; +#define GL_EXT_texture_format_sRGB_override 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_format_sRGB_override; +#define GL_EXT_texture_mirror_clamp_to_edge 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_mirror_clamp_to_edge; +#define GL_EXT_texture_norm16 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_norm16; +#define GL_EXT_texture_query_lod 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_query_lod; +#define GL_EXT_texture_rg 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_rg; +#define GL_EXT_texture_storage_compression 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_storage_compression; +#define GL_EXT_texture_type_2_10_10_10_REV 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_type_2_10_10_10_REV; +#define GL_EXT_texture_view 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_view; +#define GL_EXT_unpack_subimage 1 +GLAD_API_CALL int GLAD_GL_EXT_unpack_subimage; +#define GL_FJ_shader_binary_GCCSO 1 +GLAD_API_CALL int GLAD_GL_FJ_shader_binary_GCCSO; +#define GL_IMG_bindless_texture 1 +GLAD_API_CALL int GLAD_GL_IMG_bindless_texture; +#define GL_IMG_framebuffer_downsample 1 +GLAD_API_CALL int GLAD_GL_IMG_framebuffer_downsample; +#define GL_IMG_multisampled_render_to_texture 1 +GLAD_API_CALL int GLAD_GL_IMG_multisampled_render_to_texture; +#define GL_IMG_program_binary 1 +GLAD_API_CALL int GLAD_GL_IMG_program_binary; +#define GL_IMG_read_format 1 +GLAD_API_CALL int GLAD_GL_IMG_read_format; +#define GL_IMG_shader_binary 1 +GLAD_API_CALL int GLAD_GL_IMG_shader_binary; +#define GL_IMG_texture_compression_pvrtc 1 +GLAD_API_CALL int GLAD_GL_IMG_texture_compression_pvrtc; +#define GL_IMG_texture_compression_pvrtc2 1 +GLAD_API_CALL int GLAD_GL_IMG_texture_compression_pvrtc2; +#define GL_IMG_texture_filter_cubic 1 +GLAD_API_CALL int GLAD_GL_IMG_texture_filter_cubic; +#define GL_MESA_bgra 1 +GLAD_API_CALL int GLAD_GL_MESA_bgra; +#define GL_MESA_sampler_objects 1 +GLAD_API_CALL int GLAD_GL_MESA_sampler_objects; +#define GL_NV_copy_buffer 1 +GLAD_API_CALL int GLAD_GL_NV_copy_buffer; +#define GL_NV_coverage_sample 1 +GLAD_API_CALL int GLAD_GL_NV_coverage_sample; +#define GL_NV_depth_nonlinear 1 +GLAD_API_CALL int GLAD_GL_NV_depth_nonlinear; +#define GL_NV_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_NV_draw_buffers; +#define GL_NV_draw_instanced 1 +GLAD_API_CALL int GLAD_GL_NV_draw_instanced; +#define GL_NV_explicit_attrib_location 1 +GLAD_API_CALL int GLAD_GL_NV_explicit_attrib_location; +#define GL_NV_fbo_color_attachments 1 +GLAD_API_CALL int GLAD_GL_NV_fbo_color_attachments; +#define GL_NV_framebuffer_blit 1 +GLAD_API_CALL int GLAD_GL_NV_framebuffer_blit; +#define GL_NV_framebuffer_multisample 1 +GLAD_API_CALL int GLAD_GL_NV_framebuffer_multisample; +#define GL_NV_generate_mipmap_sRGB 1 +GLAD_API_CALL int GLAD_GL_NV_generate_mipmap_sRGB; +#define GL_NV_image_formats 1 +GLAD_API_CALL int GLAD_GL_NV_image_formats; +#define GL_NV_instanced_arrays 1 +GLAD_API_CALL int GLAD_GL_NV_instanced_arrays; +#define GL_NV_non_square_matrices 1 +GLAD_API_CALL int GLAD_GL_NV_non_square_matrices; +#define GL_NV_pack_subimage 1 +GLAD_API_CALL int GLAD_GL_NV_pack_subimage; +#define GL_NV_pixel_buffer_object 1 +GLAD_API_CALL int GLAD_GL_NV_pixel_buffer_object; +#define GL_NV_polygon_mode 1 +GLAD_API_CALL int GLAD_GL_NV_polygon_mode; +#define GL_NV_read_buffer 1 +GLAD_API_CALL int GLAD_GL_NV_read_buffer; +#define GL_NV_read_buffer_front 1 +GLAD_API_CALL int GLAD_GL_NV_read_buffer_front; +#define GL_NV_read_depth 1 +GLAD_API_CALL int GLAD_GL_NV_read_depth; +#define GL_NV_read_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_NV_read_depth_stencil; +#define GL_NV_read_stencil 1 +GLAD_API_CALL int GLAD_GL_NV_read_stencil; +#define GL_NV_sRGB_formats 1 +GLAD_API_CALL int GLAD_GL_NV_sRGB_formats; +#define GL_NV_shader_noperspective_interpolation 1 +GLAD_API_CALL int GLAD_GL_NV_shader_noperspective_interpolation; +#define GL_NV_shadow_samplers_array 1 +GLAD_API_CALL int GLAD_GL_NV_shadow_samplers_array; +#define GL_NV_shadow_samplers_cube 1 +GLAD_API_CALL int GLAD_GL_NV_shadow_samplers_cube; +#define GL_NV_texture_border_clamp 1 +GLAD_API_CALL int GLAD_GL_NV_texture_border_clamp; +#define GL_NV_texture_compression_s3tc_update 1 +GLAD_API_CALL int GLAD_GL_NV_texture_compression_s3tc_update; +#define GL_NV_texture_npot_2D_mipmap 1 +GLAD_API_CALL int GLAD_GL_NV_texture_npot_2D_mipmap; +#define GL_NV_viewport_array 1 +GLAD_API_CALL int GLAD_GL_NV_viewport_array; +#define GL_OES_EGL_image 1 +GLAD_API_CALL int GLAD_GL_OES_EGL_image; +#define GL_OES_EGL_image_external 1 +GLAD_API_CALL int GLAD_GL_OES_EGL_image_external; +#define GL_OES_EGL_image_external_essl3 1 +GLAD_API_CALL int GLAD_GL_OES_EGL_image_external_essl3; +#define GL_OES_compressed_ETC1_RGB8_sub_texture 1 +GLAD_API_CALL int GLAD_GL_OES_compressed_ETC1_RGB8_sub_texture; +#define GL_OES_compressed_ETC1_RGB8_texture 1 +GLAD_API_CALL int GLAD_GL_OES_compressed_ETC1_RGB8_texture; +#define GL_OES_copy_image 1 +GLAD_API_CALL int GLAD_GL_OES_copy_image; +#define GL_OES_depth24 1 +GLAD_API_CALL int GLAD_GL_OES_depth24; +#define GL_OES_depth32 1 +GLAD_API_CALL int GLAD_GL_OES_depth32; +#define GL_OES_depth_texture 1 +GLAD_API_CALL int GLAD_GL_OES_depth_texture; +#define GL_OES_draw_buffers_indexed 1 +GLAD_API_CALL int GLAD_GL_OES_draw_buffers_indexed; +#define GL_OES_draw_elements_base_vertex 1 +GLAD_API_CALL int GLAD_GL_OES_draw_elements_base_vertex; +#define GL_OES_element_index_uint 1 +GLAD_API_CALL int GLAD_GL_OES_element_index_uint; +#define GL_OES_fbo_render_mipmap 1 +GLAD_API_CALL int GLAD_GL_OES_fbo_render_mipmap; +#define GL_OES_fragment_precision_high 1 +GLAD_API_CALL int GLAD_GL_OES_fragment_precision_high; +#define GL_OES_geometry_point_size 1 +GLAD_API_CALL int GLAD_GL_OES_geometry_point_size; +#define GL_OES_geometry_shader 1 +GLAD_API_CALL int GLAD_GL_OES_geometry_shader; +#define GL_OES_get_program_binary 1 +GLAD_API_CALL int GLAD_GL_OES_get_program_binary; +#define GL_OES_gpu_shader5 1 +GLAD_API_CALL int GLAD_GL_OES_gpu_shader5; +#define GL_OES_mapbuffer 1 +GLAD_API_CALL int GLAD_GL_OES_mapbuffer; +#define GL_OES_packed_depth_stencil 1 +GLAD_API_CALL int GLAD_GL_OES_packed_depth_stencil; +#define GL_OES_primitive_bounding_box 1 +GLAD_API_CALL int GLAD_GL_OES_primitive_bounding_box; +#define GL_OES_required_internalformat 1 +GLAD_API_CALL int GLAD_GL_OES_required_internalformat; +#define GL_OES_rgb8_rgba8 1 +GLAD_API_CALL int GLAD_GL_OES_rgb8_rgba8; +#define GL_OES_sample_shading 1 +GLAD_API_CALL int GLAD_GL_OES_sample_shading; +#define GL_OES_sample_variables 1 +GLAD_API_CALL int GLAD_GL_OES_sample_variables; +#define GL_OES_shader_image_atomic 1 +GLAD_API_CALL int GLAD_GL_OES_shader_image_atomic; +#define GL_OES_shader_io_blocks 1 +GLAD_API_CALL int GLAD_GL_OES_shader_io_blocks; +#define GL_OES_shader_multisample_interpolation 1 +GLAD_API_CALL int GLAD_GL_OES_shader_multisample_interpolation; +#define GL_OES_standard_derivatives 1 +GLAD_API_CALL int GLAD_GL_OES_standard_derivatives; +#define GL_OES_stencil1 1 +GLAD_API_CALL int GLAD_GL_OES_stencil1; +#define GL_OES_stencil4 1 +GLAD_API_CALL int GLAD_GL_OES_stencil4; +#define GL_OES_surfaceless_context 1 +GLAD_API_CALL int GLAD_GL_OES_surfaceless_context; +#define GL_OES_tessellation_point_size 1 +GLAD_API_CALL int GLAD_GL_OES_tessellation_point_size; +#define GL_OES_tessellation_shader 1 +GLAD_API_CALL int GLAD_GL_OES_tessellation_shader; +#define GL_OES_texture_3D 1 +GLAD_API_CALL int GLAD_GL_OES_texture_3D; +#define GL_OES_texture_border_clamp 1 +GLAD_API_CALL int GLAD_GL_OES_texture_border_clamp; +#define GL_OES_texture_buffer 1 +GLAD_API_CALL int GLAD_GL_OES_texture_buffer; +#define GL_OES_texture_compression_astc 1 +GLAD_API_CALL int GLAD_GL_OES_texture_compression_astc; +#define GL_OES_texture_cube_map_array 1 +GLAD_API_CALL int GLAD_GL_OES_texture_cube_map_array; +#define GL_OES_texture_float 1 +GLAD_API_CALL int GLAD_GL_OES_texture_float; +#define GL_OES_texture_float_linear 1 +GLAD_API_CALL int GLAD_GL_OES_texture_float_linear; +#define GL_OES_texture_half_float 1 +GLAD_API_CALL int GLAD_GL_OES_texture_half_float; +#define GL_OES_texture_half_float_linear 1 +GLAD_API_CALL int GLAD_GL_OES_texture_half_float_linear; +#define GL_OES_texture_npot 1 +GLAD_API_CALL int GLAD_GL_OES_texture_npot; +#define GL_OES_texture_stencil8 1 +GLAD_API_CALL int GLAD_GL_OES_texture_stencil8; +#define GL_OES_texture_storage_multisample_2d_array 1 +GLAD_API_CALL int GLAD_GL_OES_texture_storage_multisample_2d_array; +#define GL_OES_texture_view 1 +GLAD_API_CALL int GLAD_GL_OES_texture_view; +#define GL_OES_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_OES_vertex_array_object; +#define GL_OES_vertex_half_float 1 +GLAD_API_CALL int GLAD_GL_OES_vertex_half_float; +#define GL_OES_vertex_type_10_10_10_2 1 +GLAD_API_CALL int GLAD_GL_OES_vertex_type_10_10_10_2; +#define GL_OES_viewport_array 1 +GLAD_API_CALL int GLAD_GL_OES_viewport_array; +#define GL_OVR_multiview_multisampled_render_to_texture 1 +GLAD_API_CALL int GLAD_GL_OVR_multiview_multisampled_render_to_texture; +#define GL_QCOM_YUV_texture_gather 1 +GLAD_API_CALL int GLAD_GL_QCOM_YUV_texture_gather; +#define GL_QCOM_alpha_test 1 +GLAD_API_CALL int GLAD_GL_QCOM_alpha_test; +#define GL_QCOM_binning_control 1 +GLAD_API_CALL int GLAD_GL_QCOM_binning_control; +#define GL_QCOM_driver_control 1 +GLAD_API_CALL int GLAD_GL_QCOM_driver_control; +#define GL_QCOM_extended_get 1 +GLAD_API_CALL int GLAD_GL_QCOM_extended_get; +#define GL_QCOM_extended_get2 1 +GLAD_API_CALL int GLAD_GL_QCOM_extended_get2; +#define GL_QCOM_frame_extrapolation 1 +GLAD_API_CALL int GLAD_GL_QCOM_frame_extrapolation; +#define GL_QCOM_framebuffer_foveated 1 +GLAD_API_CALL int GLAD_GL_QCOM_framebuffer_foveated; +#define GL_QCOM_motion_estimation 1 +GLAD_API_CALL int GLAD_GL_QCOM_motion_estimation; +#define GL_QCOM_perfmon_global_mode 1 +GLAD_API_CALL int GLAD_GL_QCOM_perfmon_global_mode; +#define GL_QCOM_render_sRGB_R8_RG8 1 +GLAD_API_CALL int GLAD_GL_QCOM_render_sRGB_R8_RG8; +#define GL_QCOM_render_shared_exponent 1 +GLAD_API_CALL int GLAD_GL_QCOM_render_shared_exponent; +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 +GLAD_API_CALL int GLAD_GL_QCOM_shader_framebuffer_fetch_noncoherent; +#define GL_QCOM_shader_framebuffer_fetch_rate 1 +GLAD_API_CALL int GLAD_GL_QCOM_shader_framebuffer_fetch_rate; +#define GL_QCOM_shading_rate 1 +GLAD_API_CALL int GLAD_GL_QCOM_shading_rate; +#define GL_QCOM_texture_foveated 1 +GLAD_API_CALL int GLAD_GL_QCOM_texture_foveated; +#define GL_QCOM_texture_foveated2 1 +GLAD_API_CALL int GLAD_GL_QCOM_texture_foveated2; +#define GL_QCOM_texture_foveated_subsampled_layout 1 +GLAD_API_CALL int GLAD_GL_QCOM_texture_foveated_subsampled_layout; +#define GL_QCOM_texture_lod_bias 1 +GLAD_API_CALL int GLAD_GL_QCOM_texture_lod_bias; +#define GL_QCOM_tiled_rendering 1 +GLAD_API_CALL int GLAD_GL_QCOM_tiled_rendering; +#define GL_QCOM_writeonly_rendering 1 +GLAD_API_CALL int GLAD_GL_QCOM_writeonly_rendering; +#define GL_VIV_shader_binary 1 +GLAD_API_CALL int GLAD_GL_VIV_shader_binary; + + +typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value); +typedef void (GLAD_API_PTR *PFNGLACCUMXOESPROC)(GLenum op, GLfixed value); +typedef GLboolean (GLAD_API_PTR *PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC)(GLuint memory, GLuint64 key, GLuint timeout); +typedef void (GLAD_API_PTR *PFNGLACTIVEPROGRAMEXTPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); +typedef void (GLAD_API_PTR *PFNGLACTIVESTENCILFACEEXTPROC)(GLenum face); +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLACTIVEVARYINGNVPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLALPHAFRAGMENTOP1ATIPROC)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAD_API_PTR *PFNGLALPHAFRAGMENTOP2ATIPROC)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAD_API_PTR *PFNGLALPHAFRAGMENTOP3ATIPROC)(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref); +typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXOESPROC)(GLenum func, GLfixed ref); +typedef void (GLAD_API_PTR *PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC)(void); +typedef void (GLAD_API_PTR *PFNGLAPPLYTEXTUREEXTPROC)(GLenum mode); +typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences); +typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences); +typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences); +typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLARRAYOBJECTATIPROC)(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef GLuint (GLAD_API_PTR *PFNGLASYNCCOPYBUFFERSUBDATANVXPROC)(GLsizei waitSemaphoreCount, const GLuint * waitSemaphoreArray, const GLuint64 * fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint * signalSemaphoreArray, const GLuint64 * signalValueArray); +typedef GLuint (GLAD_API_PTR *PFNGLASYNCCOPYIMAGESUBDATANVXPROC)(GLsizei waitSemaphoreCount, const GLuint * waitSemaphoreArray, const GLuint64 * waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint * signalSemaphoreArray, const GLuint64 * signalValueArray); +typedef void (GLAD_API_PTR *PFNGLASYNCMARKERSGIXPROC)(GLuint marker); +typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERNVPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERNVXPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINFRAGMENTSHADERATIPROC)(void); +typedef void (GLAD_API_PTR *PFNGLBEGINOCCLUSIONQUERYNVPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINPERFMONITORAMDPROC)(GLuint monitor); +typedef void (GLAD_API_PTR *PFNGLBEGINPERFQUERYINTELPROC)(GLuint queryHandle); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYARBPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKNVPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBEGINVERTEXSHADEREXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLBEGINVIDEOCAPTURENVPROC)(GLuint video_capture_slot); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEEXTPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASENVPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFEROFFSETEXTPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFEROFFSETNVPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEEXTPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGENVPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGMENTSHADERATIPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREEXTPROC)(GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); +typedef GLuint (GLAD_API_PTR *PFNGLBINDLIGHTPARAMETEREXTPROC)(GLenum light, GLenum value); +typedef GLuint (GLAD_API_PTR *PFNGLBINDMATERIALPARAMETEREXTPROC)(GLenum face, GLenum value); +typedef void (GLAD_API_PTR *PFNGLBINDMULTITEXTUREEXTPROC)(GLenum texunit, GLenum target, GLuint texture); +typedef GLuint (GLAD_API_PTR *PFNGLBINDPARAMETEREXTPROC)(GLenum value); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLBINDSHADINGRATEIMAGENVPROC)(GLuint texture); +typedef GLuint (GLAD_API_PTR *PFNGLBINDTEXGENPARAMETEREXTPROC)(GLenum unit, GLenum coord, GLenum value); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture); +typedef GLuint (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)(GLenum unit, GLenum value); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKNVPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYAPPLEPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXSHADEREXTPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (GLAD_API_PTR *PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3BEXTPROC)(GLbyte bx, GLbyte by, GLbyte bz); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3BVEXTPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3DEXTPROC)(GLdouble bx, GLdouble by, GLdouble bz); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3DVEXTPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3FEXTPROC)(GLfloat bx, GLfloat by, GLfloat bz); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3FVEXTPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3IEXTPROC)(GLint bx, GLint by, GLint bz); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3IVEXTPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3SEXTPROC)(GLshort bx, GLshort by, GLshort bz); +typedef void (GLAD_API_PTR *PFNGLBINORMAL3SVEXTPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLBINORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); +typedef void (GLAD_API_PTR *PFNGLBITMAPXOESPROC)(GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte * bitmap); +typedef void (GLAD_API_PTR *PFNGLBLENDBARRIERKHRPROC)(void); +typedef void (GLAD_API_PTR *PFNGLBLENDBARRIERNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLOREXTPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORXOESPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONINDEXEDAMDPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIARBPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIARBPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCINDEXEDAMDPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIARBPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIARBPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLENDPARAMETERINVPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERLAYEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint srcLayer, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLint dstLayer, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERLAYERSEXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBUFFERADDRESSRANGENVPROC)(GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLBUFFERATTACHMEMORYNVPROC)(GLenum target, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERPAGECOMMITMENTARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLBUFFERPAGECOMMITMENTMEMNVPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLBUFFERPARAMETERIAPPLEPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEEXTERNALEXTPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEMEMEXTPROC)(GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data); +typedef void (GLAD_API_PTR *PFNGLCALLCOMMANDLISTNVPROC)(GLuint list); +typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list); +typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)(GLuint framebuffer, GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORARBPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARACCUMXOESPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORIIEXTPROC)(GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORIUIEXTPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXOESPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHDNVPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXOESPROC)(GLfixed depth); +typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)(GLenum stream); +typedef void (GLAD_API_PTR *PFNGLCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC)(GLsizei fenceObjectCount, const GLuint * semaphoreArray, const GLuint64 * fenceValueArray); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth); +typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation); +typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXOESPROC)(GLenum plane, const GLfixed * equation); +typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FVERTEX3FSUNPROC)(GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FVERTEX3FVSUNPROC)(const GLfloat * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3XOESPROC)(GLfixed red, GLfixed green, GLfixed blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3XVOESPROC)(const GLfixed * components); +typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)(GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)(const GLfloat * c, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVERTEX2FSUNPROC)(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVERTEX2FVSUNPROC)(const GLubyte * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVERTEX3FSUNPROC)(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVERTEX3FVSUNPROC)(const GLubyte * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4XOESPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4XVOESPROC)(const GLfixed * components); +typedef void (GLAD_API_PTR *PFNGLCOLORFORMATNVPROC)(GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLCOLORFRAGMENTOP1ATIPROC)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAD_API_PTR *PFNGLCOLORFRAGMENTOP2ATIPROC)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAD_API_PTR *PFNGLCOLORFRAGMENTOP3ATIPROC)(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKINDEXEDEXTPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERLISTIBMPROC)(GLint size, GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERVINTELPROC)(GLint size, GLenum type, const void ** pointer); +typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEEXTPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEEXTPROC)(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void * table); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVSGIPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVSGIPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLESGIPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table); +typedef void (GLAD_API_PTR *PFNGLCOMBINERINPUTNVPROC)(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAD_API_PTR *PFNGLCOMBINEROUTPUTNVPROC)(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAD_API_PTR *PFNGLCOMBINERPARAMETERFNVPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLCOMBINERPARAMETERFVNVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCOMBINERPARAMETERINVPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLCOMBINERPARAMETERIVNVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCOMMANDLISTSEGMENTSNVPROC)(GLuint list, GLuint segments); +typedef void (GLAD_API_PTR *PFNGLCOMPILECOMMANDLISTNVPROC)(GLuint list); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERINCLUDEARBPROC)(GLuint shader, GLsizei count, const GLchar *const* path, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)(GLenum pname, GLfloat value); +typedef void (GLAD_API_PTR *PFNGLCONSERVATIVERASTERPARAMETERINVPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFEXTPROC)(GLenum target, GLenum pname, GLfloat params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVEXTPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIEXTPROC)(GLenum target, GLenum pname, GLint params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVEXTPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERXOESPROC)(GLenum target, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERXVOESPROC)(GLenum target, GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEEXTPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLESGIPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATANVPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYPATHNVPROC)(GLuint resultPath, GLuint srcPath); +typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOVERFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLCOVERFILLPATHNVPROC)(GLuint path, GLenum coverMode); +typedef void (GLAD_API_PTR *PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLCOVERSTROKEPATHNVPROC)(GLuint path, GLenum coverMode); +typedef void (GLAD_API_PTR *PFNGLCOVERAGEMODULATIONNVPROC)(GLenum components); +typedef void (GLAD_API_PTR *PFNGLCOVERAGEMODULATIONTABLENVPROC)(GLsizei n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLCREATECOMMANDLISTSNVPROC)(GLsizei n, GLuint * lists); +typedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLCREATEMEMORYOBJECTSEXTPROC)(GLsizei n, GLuint * memoryObjects); +typedef void (GLAD_API_PTR *PFNGLCREATEPERFQUERYINTELPROC)(GLuint queryId, GLuint * queryHandle); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); +typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRESSFENCENVXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLCREATESEMAPHORESNVPROC)(GLsizei n, GLuint * semaphores); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMEXTPROC)(GLenum type, const GLchar * string); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings); +typedef void (GLAD_API_PTR *PFNGLCREATESTATESNVPROC)(GLsizei n, GLuint * states); +typedef GLsync (GLAD_API_PTR *PFNGLCREATESYNCFROMCLEVENTARBPROC)(struct _cl_context * context, struct _cl_event * event, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLCULLPARAMETERDVEXTPROC)(GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLCULLPARAMETERFVEXTPROC)(GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCURRENTPALETTEMATRIXARBPROC)(GLint index); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKAMDPROC)(GLDEBUGPROCAMD callback, void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKARBPROC)(GLDEBUGPROCARB callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLARBPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEENABLEAMDPROC)(GLenum category, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTAMDPROC)(GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTARBPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDEFORMSGIXPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLDEFORMATIONMAP3DSGIXPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLDEFORMATIONMAP3FSGIXPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLDELETEASYNCMARKERSSGIXPROC)(GLuint marker, GLsizei range); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETECOMMANDLISTSNVPROC)(GLsizei n, const GLuint * lists); +typedef void (GLAD_API_PTR *PFNGLDELETEFENCESAPPLEPROC)(GLsizei n, const GLuint * fences); +typedef void (GLAD_API_PTR *PFNGLDELETEFENCESNVPROC)(GLsizei n, const GLuint * fences); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAGMENTSHADERATIPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range); +typedef void (GLAD_API_PTR *PFNGLDELETEMEMORYOBJECTSEXTPROC)(GLsizei n, const GLuint * memoryObjects); +typedef void (GLAD_API_PTR *PFNGLDELETENAMEDSTRINGARBPROC)(GLint namelen, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLDELETENAMESAMDPROC)(GLenum identifier, GLuint num, const GLuint * names); +typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj); +typedef void (GLAD_API_PTR *PFNGLDELETEOCCLUSIONQUERIESNVPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEPATHSNVPROC)(GLuint path, GLsizei range); +typedef void (GLAD_API_PTR *PFNGLDELETEPERFMONITORSAMDPROC)(GLsizei n, GLuint * monitors); +typedef void (GLAD_API_PTR *PFNGLDELETEPERFQUERYINTELPROC)(GLuint queryHandle); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESARBPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERYRESOURCETAGNVPROC)(GLsizei n, const GLint * tagIds); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLDELETESEMAPHORESEXTPROC)(GLsizei n, const GLuint * semaphores); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETESTATESNVPROC)(GLsizei n, const GLuint * states); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSNVPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSAPPLEPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXSHADEREXTPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLDEPTHBOUNDSEXTPROC)(GLclampd zmin, GLclampd zmax); +typedef void (GLAD_API_PTR *PFNGLDEPTHBOUNDSDNVPROC)(GLdouble zmin, GLdouble zmax); +typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYDVNVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDDNVPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEDNVPROC)(GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXOESPROC)(GLfixed n, GLfixed f); +typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDETAILTEXFUNCSGISPROC)(GLenum target, GLsizei n, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBAPPLEPROC)(GLuint index, GLenum pname); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDARBPROC)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDEXTPROC)(GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSARBPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSATIPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWCOMMANDSADDRESSNVPROC)(GLenum primitiveMode, const GLuint64 * indirects, const GLsizei * sizes, GLuint count); +typedef void (GLAD_API_PTR *PFNGLDRAWCOMMANDSNVPROC)(GLenum primitiveMode, GLuint buffer, const GLintptr * indirects, const GLsizei * sizes, GLuint count); +typedef void (GLAD_API_PTR *PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC)(const GLuint64 * indirects, const GLsizei * sizes, const GLuint * states, const GLuint * fbos, GLuint count); +typedef void (GLAD_API_PTR *PFNGLDRAWCOMMANDSSTATESNVPROC)(GLuint buffer, const GLintptr * indirects, const GLsizei * sizes, const GLuint * states, const GLuint * fbos, GLuint count); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTARRAYAPPLEPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTARRAYATIPROC)(GLenum mode, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDARBPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWMESHARRAYSSUNPROC)(GLenum mode, GLint first, GLsizei count, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLDRAWMESHTASKSINDIRECTNVPROC)(GLintptr indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWMESHTASKSNVPROC)(GLuint first, GLuint count); +typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTARRAYATIPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSEXTPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWTEXTURENVPROC)(GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKNVPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWVKIMAGENVPROC)(GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef void (GLAD_API_PTR *PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC)(GLenum target, GLeglImageOES image, const GLint * attrib_list); +typedef void (GLAD_API_PTR *PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC)(GLuint texture, GLeglImageOES image, const GLint * attrib_list); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGFORMATNVPROC)(GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERLISTIBMPROC)(GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag); +typedef void (GLAD_API_PTR *PFNGLELEMENTPOINTERAPPLEPROC)(GLenum type, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLELEMENTPOINTERATIPROC)(GLenum type, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBAPPLEPROC)(GLuint index, GLenum pname); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERNVXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDFRAGMENTSHADERATIPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDOCCLUSIONQUERYNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDPERFMONITORAMDPROC)(GLuint monitor); +typedef void (GLAD_API_PTR *PFNGLENDPERFQUERYINTELPROC)(GLuint queryHandle); +typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYARBPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKEXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDVERTEXSHADEREXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDVIDEOCAPTURENVPROC)(GLuint video_capture_slot); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1XOESPROC)(GLfixed u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2XOESPROC)(GLfixed u, GLfixed v); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLEVALMAPSNVPROC)(GLenum target, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2); +typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j); +typedef void (GLAD_API_PTR *PFNGLEVALUATEDEPTHVALUESARBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLEXTRACTCOMPONENTEXTPROC)(GLuint res, GLuint src, GLuint num); +typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer); +typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERXOESPROC)(GLsizei n, GLenum type, const GLfixed * buffer); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLFINALCOMBINERINPUTNVPROC)(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); +typedef GLint (GLAD_API_PTR *PFNGLFINISHASYNCSGIXPROC)(GLuint * markerp); +typedef void (GLAD_API_PTR *PFNGLFINISHFENCEAPPLEPROC)(GLuint fence); +typedef void (GLAD_API_PTR *PFNGLFINISHFENCENVPROC)(GLuint fence); +typedef void (GLAD_API_PTR *PFNGLFINISHOBJECTAPPLEPROC)(GLenum object, GLint name); +typedef void (GLAD_API_PTR *PFNGLFINISHTEXTURESUNXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)(GLenum target, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHPIXELDATARANGENVPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLFLUSHRASTERSGIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHSTATICDATAIBMPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)(GLsizei length, void * pointer); +typedef void (GLAD_API_PTR *PFNGLFLUSHVERTEXARRAYRANGENVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFORMATNVPROC)(GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERLISTIBMPROC)(GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDEXTPROC)(GLdouble coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const GLdouble * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVEXTPROC)(const GLdouble * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFEXTPROC)(GLfloat coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const GLfloat * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVEXTPROC)(const GLfloat * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDHNVPROC)(GLhalfNV fog); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDHVNVPROC)(const GLhalfNV * fog); +typedef void (GLAD_API_PTR *PFNGLFOGFUNCSGISPROC)(GLsizei n, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFOGXOESPROC)(GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLFOGXVOESPROC)(GLenum pname, const GLfixed * param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTCOLORMATERIALSGIXPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTCOVERAGECOLORNVPROC)(GLuint color); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTMODELFSGIXPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTMODELISGIXPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTFSGIXPROC)(GLenum light, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTFVSGIXPROC)(GLenum light, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTISGIXPROC)(GLenum light, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTLIGHTIVSGIXPROC)(GLenum light, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTMATERIALFSGIXPROC)(GLenum face, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTMATERIALFVSGIXPROC)(GLenum face, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTMATERIALISGIXPROC)(GLenum face, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAGMENTMATERIALIVSGIXPROC)(GLenum face, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFRAMETERMINATORGREMEDYPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFRAMEZOOMSGIXPROC)(GLint factor); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)(GLuint framebuffer, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIMESAPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERREADBUFFEREXTPROC)(GLuint framebuffer, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)(GLenum target, GLuint start, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)(GLenum target, GLuint start, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)(GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +typedef void (GLAD_API_PTR *PFNGLFREEOBJECTBUFFERATIPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLFRUSTUMXOESPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef GLuint (GLAD_API_PTR *PFNGLGENASYNCMARKERSSGIXPROC)(GLsizei range); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENFENCESAPPLEPROC)(GLsizei n, GLuint * fences); +typedef void (GLAD_API_PTR *PFNGLGENFENCESNVPROC)(GLsizei n, GLuint * fences); +typedef GLuint (GLAD_API_PTR *PFNGLGENFRAGMENTSHADERSATIPROC)(GLuint range); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers); +typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range); +typedef void (GLAD_API_PTR *PFNGLGENNAMESAMDPROC)(GLenum identifier, GLuint num, GLuint * names); +typedef void (GLAD_API_PTR *PFNGLGENOCCLUSIONQUERIESNVPROC)(GLsizei n, GLuint * ids); +typedef GLuint (GLAD_API_PTR *PFNGLGENPATHSNVPROC)(GLsizei range); +typedef void (GLAD_API_PTR *PFNGLGENPERFMONITORSAMDPROC)(GLsizei n, GLuint * monitors); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESARBPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENQUERYRESOURCETAGNVPROC)(GLsizei n, GLint * tagIds); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLGENSEMAPHORESEXTPROC)(GLsizei n, GLuint * semaphores); +typedef GLuint (GLAD_API_PTR *PFNGLGENSYMBOLSEXTPROC)(GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSNVPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSAPPLEPROC)(GLsizei n, GLuint * arrays); +typedef GLuint (GLAD_API_PTR *PFNGLGENVERTEXSHADERSEXTPROC)(GLuint range); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATEMULTITEXMIPMAPEXTPROC)(GLenum texunit, GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture); +typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPEXTPROC)(GLuint texture, GLenum target); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEVARYINGNVPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETARRAYOBJECTFVATIPROC)(GLenum array, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETARRAYOBJECTIVATIPROC)(GLenum array, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANINDEXEDVEXTPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERUI64VNVPROC)(GLenum target, GLenum pname, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation); +typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXOESPROC)(GLenum plane, GLfixed * equation); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEEXTPROC)(GLenum target, GLenum format, GLenum type, void * data); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLESGIPROC)(GLenum target, GLenum format, GLenum type, void * table); +typedef void (GLAD_API_PTR *PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, GLfloat * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETCOMMANDHEADERNVPROC)(GLenum tokenID, GLuint size); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint lod, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint lod, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTEREXTPROC)(GLenum target, GLenum format, GLenum type, void * image); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERXVOESPROC)(GLenum target, GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETCOVERAGEMODULATIONTABLENVPROC)(GLsizei bufSize, GLfloat * v); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGAMDPROC)(GLuint count, GLsizei bufSize, GLenum * categories, GLenum * severities, GLuint * ids, GLsizei * lengths, GLchar * message); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGARBPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDETAILTEXFUNCSGISPROC)(GLenum target, GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEINDEXEDVEXTPROC)(GLenum target, GLuint index, GLdouble * data); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VEXTPROC)(GLenum pname, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); +typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFENCEIVNVPROC)(GLuint fence, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)(GLenum variable, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)(GLenum variable, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFIRSTPERFQUERYIDINTELPROC)(GLuint * queryId); +typedef void (GLAD_API_PTR *PFNGLGETFIXEDVOESPROC)(GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETFLOATINDEXEDVEXTPROC)(GLenum target, GLuint index, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VEXTPROC)(GLenum pname, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFOGFUNCSGISPROC)(GLfloat * points); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETFRAGMENTLIGHTFVSGIXPROC)(GLenum light, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAGMENTLIGHTIVSGIXPROC)(GLenum light, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAGMENTMATERIALFVSGIXPROC)(GLenum face, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAGMENTMATERIALIVSGIXPROC)(GLenum face, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC)(GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC)(GLenum target, GLenum pname, GLint * params); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSARBPROC)(void); +typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMEXTPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERXVOESPROC)(GLenum target, GLenum pname, GLfixed * params); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETIMAGEHANDLEARBPROC)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETIMAGEHANDLENVPROC)(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (GLAD_API_PTR *PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); +typedef GLint (GLAD_API_PTR *PFNGLGETINSTRUMENTSSGIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERINDEXEDVEXTPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERUI64I_VNVPROC)(GLenum value, GLuint index, GLuint64EXT * result); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERUI64VNVPROC)(GLenum value, GLuint64EXT * result); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)(GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINVARIANTBOOLEANVEXTPROC)(GLuint id, GLenum value, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETINVARIANTFLOATVEXTPROC)(GLuint id, GLenum value, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETINVARIANTINTEGERVEXTPROC)(GLuint id, GLenum value, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETLIGHTXOESPROC)(GLenum light, GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETLISTPARAMETERFVSGIXPROC)(GLuint list, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETLISTPARAMETERIVSGIXPROC)(GLuint list, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)(GLuint id, GLenum value, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETLOCALCONSTANTFLOATVEXTPROC)(GLuint id, GLenum value, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)(GLuint id, GLenum value, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETMAPATTRIBPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMAPATTRIBPARAMETERIVNVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMAPCONTROLPOINTSNVPROC)(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void * points); +typedef void (GLAD_API_PTR *PFNGLGETMAPPARAMETERFVNVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMAPPARAMETERIVNVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v); +typedef void (GLAD_API_PTR *PFNGLGETMAPXVOESPROC)(GLenum target, GLenum query, GLfixed * v); +typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMATERIALXOESPROC)(GLenum face, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC)(GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC)(GLuint memoryObject, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXEXTPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVEXTPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVNVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)(GLuint buffer, GLenum pname, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)(GLuint buffer, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC)(GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum pname, void * string); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMIVEXTPROC)(GLuint program, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)(GLuint renderbuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDSTRINGARBPROC)(GLint namelen, const GLchar * name, GLsizei bufSize, GLint * stringlen, GLchar * string); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDSTRINGIVARBPROC)(GLint namelen, const GLchar * name, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNEXTPERFQUERYIDINTELPROC)(GLuint queryId, GLuint * nextQueryId); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTBUFFERFVATIPROC)(GLuint buffer, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTBUFFERIVATIPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELEXTPROC)(GLenum type, GLuint object, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVAPPLEPROC)(GLenum objectType, GLuint name, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOCCLUSIONQUERYIVNVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOCCLUSIONQUERYUIVNVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETPATHCOLORGENFVNVPROC)(GLenum color, GLenum pname, GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLGETPATHCOLORGENIVNVPROC)(GLenum color, GLenum pname, GLint * value); +typedef void (GLAD_API_PTR *PFNGLGETPATHCOMMANDSNVPROC)(GLuint path, GLubyte * commands); +typedef void (GLAD_API_PTR *PFNGLGETPATHCOORDSNVPROC)(GLuint path, GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLGETPATHDASHARRAYNVPROC)(GLuint path, GLfloat * dashArray); +typedef GLfloat (GLAD_API_PTR *PFNGLGETPATHLENGTHNVPROC)(GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef void (GLAD_API_PTR *PFNGLGETPATHMETRICRANGENVPROC)(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat * metrics); +typedef void (GLAD_API_PTR *PFNGLGETPATHMETRICSNVPROC)(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLsizei stride, GLfloat * metrics); +typedef void (GLAD_API_PTR *PFNGLGETPATHPARAMETERFVNVPROC)(GLuint path, GLenum pname, GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLGETPATHPARAMETERIVNVPROC)(GLuint path, GLenum pname, GLint * value); +typedef void (GLAD_API_PTR *PFNGLGETPATHSPACINGNVPROC)(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat * returnedSpacing); +typedef void (GLAD_API_PTR *PFNGLGETPATHTEXGENFVNVPROC)(GLenum texCoordSet, GLenum pname, GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLGETPATHTEXGENIVNVPROC)(GLenum texCoordSet, GLenum pname, GLint * value); +typedef void (GLAD_API_PTR *PFNGLGETPERFCOUNTERINFOINTELPROC)(GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar * counterName, GLuint counterDescLength, GLchar * counterDesc, GLuint * counterOffset, GLuint * counterDataSize, GLuint * counterTypeEnum, GLuint * counterDataTypeEnum, GLuint64 * rawCounterMaxValue); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint * data, GLint * bytesWritten); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)(GLuint group, GLuint counter, GLenum pname, void * data); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)(GLuint group, GLuint counter, GLsizei bufSize, GLsizei * length, GLchar * counterString); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORCOUNTERSAMDPROC)(GLuint group, GLint * numCounters, GLint * maxActiveCounters, GLsizei counterSize, GLuint * counters); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)(GLuint group, GLsizei bufSize, GLsizei * length, GLchar * groupString); +typedef void (GLAD_API_PTR *PFNGLGETPERFMONITORGROUPSAMDPROC)(GLint * numGroups, GLsizei groupsSize, GLuint * groups); +typedef void (GLAD_API_PTR *PFNGLGETPERFQUERYDATAINTELPROC)(GLuint queryHandle, GLuint flags, GLsizei dataSize, void * data, GLuint * bytesWritten); +typedef void (GLAD_API_PTR *PFNGLGETPERFQUERYIDBYNAMEINTELPROC)(GLchar * queryName, GLuint * queryId); +typedef void (GLAD_API_PTR *PFNGLGETPERFQUERYINFOINTELPROC)(GLuint queryId, GLuint queryNameLength, GLchar * queryName, GLuint * dataSize, GLuint * noCounters, GLuint * noInstances, GLuint * capsMask); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPXVPROC)(GLenum map, GLint size, GLfixed * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC)(GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC)(GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERINDEXEDVEXTPROC)(GLenum target, GLuint index, void ** data); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERI_VEXTPROC)(GLenum pname, GLuint index, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERIIVNVPROC)(GLenum target, GLuint index, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC)(GLenum target, GLuint index, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC)(GLenum target, GLuint index, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC)(GLenum target, GLuint index, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEFVNVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC)(GLenum target, GLuint index, GLuint * param); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VEXTPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVARBPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VEXTPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVARBPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSEMAPHOREPARAMETERIVNVPROC)(GLuint semaphore, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC)(GLuint semaphore, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTEREXTPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSHADINGRATEIMAGEPALETTENVPROC)(GLuint viewport, GLuint entry, GLenum * rate); +typedef void (GLAD_API_PTR *PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC)(GLenum rate, GLuint samples, GLuint index, GLint * location); +typedef void (GLAD_API_PTR *PFNGLGETSHARPENTEXFUNCSGISPROC)(GLenum target, GLfloat * points); +typedef GLushort (GLAD_API_PTR *PFNGLGETSTAGEINDEXNVPROC)(GLenum shadertype); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETTEXBUMPPARAMETERFVATIPROC)(GLenum pname, GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLGETTEXBUMPPARAMETERIVATIPROC)(GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXENVXVOESPROC)(GLenum target, GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXFILTERFUNCSGISPROC)(GLenum target, GLenum filter, GLfloat * weights); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENXVOESPROC)(GLenum coord, GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERXVOESPROC)(GLenum target, GLint level, GLenum pname, GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVEXTPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERXVOESPROC)(GLenum target, GLenum pname, GLfixed * params); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTUREHANDLEARBPROC)(GLuint texture); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTUREHANDLENVPROC)(GLuint texture); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTURESAMPLERHANDLEARBPROC)(GLuint texture, GLuint sampler); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTURESAMPLERHANDLENVPROC)(GLuint texture, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)(GLuint program, GLuint index, GLint * location); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint * param); +typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMBUFFERSIZEEXTPROC)(GLuint program, GLint location); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef GLintptr (GLAD_API_PTR *PFNGLGETUNIFORMOFFSETEXTPROC)(GLuint program, GLint location); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMI64VARBPROC)(GLuint program, GLint location, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMI64VNVPROC)(GLuint program, GLint location, GLint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUI64VARBPROC)(GLuint program, GLint location, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUI64VNVPROC)(GLuint program, GLint location, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNSIGNEDBYTEI_VEXTPROC)(GLenum target, GLuint index, GLubyte * data); +typedef void (GLAD_API_PTR *PFNGLGETUNSIGNEDBYTEVEXTPROC)(GLenum pname, GLubyte * data); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTARRAYOBJECTFVATIPROC)(GLuint id, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTARRAYOBJECTIVATIPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTBOOLEANVEXTPROC)(GLuint id, GLenum value, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTFLOATVEXTPROC)(GLuint id, GLenum value, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTINTEGERVEXTPROC)(GLuint id, GLenum value, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETVARIANTPOINTERVEXTPROC)(GLuint id, GLenum value, void ** data); +typedef GLint (GLAD_API_PTR *PFNGLGETVARYINGLOCATIONNVPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINTEGERVEXTPROC)(GLuint vaobj, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, void ** param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYPOINTERVEXTPROC)(GLuint vaobj, GLenum pname, void ** param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVEXTPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLI64VNVPROC)(GLuint index, GLenum pname, GLint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLUI64VARBPROC)(GLuint index, GLenum pname, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLUI64VNVPROC)(GLuint index, GLenum pname, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOCAPTUREIVNVPROC)(GLuint video_capture_slot, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOI64VNVPROC)(GLuint video_slot, GLenum pname, GLint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOIVNVPROC)(GLuint video_slot, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOUI64VNVPROC)(GLuint video_slot, GLenum pname, GLuint64EXT * params); +typedef void (GLAD_API_PTR *PFNGLGETVIDEOUIVNVPROC)(GLuint video_slot, GLenum pname, GLuint * params); +typedef GLVULKANPROCNV (GLAD_API_PTR *PFNGLGETVKPROCADDRNVPROC)(const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * table); +typedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * table); +typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)(GLenum target, GLint lod, GLsizei bufSize, void * img); +typedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * image); +typedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * image); +typedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMARBPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNMAPDVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPDVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPFVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPFVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPIVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPIVARBPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint * v); +typedef void (GLAD_API_PTR *PFNGLGETNMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNMINMAXARBPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVPROC)(GLenum map, GLsizei bufSize, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVARBPROC)(GLenum map, GLsizei bufSize, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVPROC)(GLenum map, GLsizei bufSize, GLuint * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVARBPROC)(GLenum map, GLsizei bufSize, GLuint * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVPROC)(GLenum map, GLsizei bufSize, GLushort * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVARBPROC)(GLenum map, GLsizei bufSize, GLushort * values); +typedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEPROC)(GLsizei bufSize, GLubyte * pattern); +typedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEARBPROC)(GLsizei bufSize, GLubyte * pattern); +typedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void * row, GLsizei columnBufSize, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERARBPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void * row, GLsizei columnBufSize, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEARBPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * img); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMI64VARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUI64VARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVARBPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORBSUNPROC)(GLbyte factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORDSUNPROC)(GLdouble factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORFSUNPROC)(GLfloat factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORISUNPROC)(GLint factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORSSUNPROC)(GLshort factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORUBSUNPROC)(GLubyte factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORUISUNPROC)(GLuint factor); +typedef void (GLAD_API_PTR *PFNGLGLOBALALPHAFACTORUSSUNPROC)(GLushort factor); +typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLHINTPGIPROC)(GLenum target, GLint mode); +typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLHISTOGRAMEXTPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLIGLOOINTERFACESGIXPROC)(GLenum pname, const void * params); +typedef void (GLAD_API_PTR *PFNGLIMAGETRANSFORMPARAMETERFHPPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLIMAGETRANSFORMPARAMETERIHPPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLIMPORTMEMORYFDEXTPROC)(GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +typedef void (GLAD_API_PTR *PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC)(GLuint memory, GLuint64 size, GLenum handleType, void * handle); +typedef void (GLAD_API_PTR *PFNGLIMPORTMEMORYWIN32NAMEEXTPROC)(GLuint memory, GLuint64 size, GLenum handleType, const void * name); +typedef void (GLAD_API_PTR *PFNGLIMPORTSEMAPHOREFDEXTPROC)(GLuint semaphore, GLenum handleType, GLint fd); +typedef void (GLAD_API_PTR *PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC)(GLuint semaphore, GLenum handleType, void * handle); +typedef void (GLAD_API_PTR *PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC)(GLuint semaphore, GLenum handleType, const void * name); +typedef GLsync (GLAD_API_PTR *PFNGLIMPORTSYNCEXTPROC)(GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLINDEXFORMATNVPROC)(GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLINDEXFUNCEXTPROC)(GLenum func, GLclampf ref); +typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLINDEXMATERIALEXTPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERLISTIBMPROC)(GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c); +typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c); +typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c); +typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c); +typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c); +typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c); +typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c); +typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c); +typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c); +typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c); +typedef void (GLAD_API_PTR *PFNGLINDEXXOESPROC)(GLfixed component); +typedef void (GLAD_API_PTR *PFNGLINDEXXVOESPROC)(const GLfixed * component); +typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void); +typedef void (GLAD_API_PTR *PFNGLINSERTCOMPONENTEXTPROC)(GLuint res, GLuint src, GLuint num); +typedef void (GLAD_API_PTR *PFNGLINSERTEVENTMARKEREXTPROC)(GLsizei length, const GLchar * marker); +typedef void (GLAD_API_PTR *PFNGLINSTRUMENTSBUFFERSGIXPROC)(GLsizei size, GLint * buffer); +typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINTERPOLATEPATHSNVPROC)(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef GLboolean (GLAD_API_PTR *PFNGLISASYNCMARKERSGIXPROC)(GLuint marker); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERRESIDENTNVPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLISCOMMANDLISTNVPROC)(GLuint list); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISFENCEAPPLEPROC)(GLuint fence); +typedef GLboolean (GLAD_API_PTR *PFNGLISFENCENVPROC)(GLuint fence); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISIMAGEHANDLERESIDENTARBPROC)(GLuint64 handle); +typedef GLboolean (GLAD_API_PTR *PFNGLISIMAGEHANDLERESIDENTNVPROC)(GLuint64 handle); +typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list); +typedef GLboolean (GLAD_API_PTR *PFNGLISMEMORYOBJECTEXTPROC)(GLuint memoryObject); +typedef GLboolean (GLAD_API_PTR *PFNGLISNAMEAMDPROC)(GLenum identifier, GLuint name); +typedef GLboolean (GLAD_API_PTR *PFNGLISNAMEDBUFFERRESIDENTNVPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISNAMEDSTRINGARBPROC)(GLint namelen, const GLchar * name); +typedef GLboolean (GLAD_API_PTR *PFNGLISOBJECTBUFFERATIPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISOCCLUSIONQUERYNVPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISPATHNVPROC)(GLuint path); +typedef GLboolean (GLAD_API_PTR *PFNGLISPOINTINFILLPATHNVPROC)(GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GLAD_API_PTR *PFNGLISPOINTINSTROKEPATHNVPROC)(GLuint path, GLfloat x, GLfloat y); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYARBPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); +typedef GLboolean (GLAD_API_PTR *PFNGLISSEMAPHOREEXTPROC)(GLuint semaphore); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISSTATENVPROC)(GLuint state); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREHANDLERESIDENTARBPROC)(GLuint64 handle); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREHANDLERESIDENTNVPROC)(GLuint64 handle); +typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKNVPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISVARIANTENABLEDEXTPROC)(GLuint id, GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYAPPLEPROC)(GLuint array); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)(GLuint index, GLenum pname); +typedef void (GLAD_API_PTR *PFNGLLGPUCOPYIMAGESUBDATANVXPROC)(GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLLGPUINTERLOCKNVXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC)(GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLLABELOBJECTEXTPROC)(GLenum type, GLuint object, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLLIGHTENVISGIXPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXOESPROC)(GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELXVOESPROC)(GLenum pname, const GLfixed * param); +typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTXOESPROC)(GLenum light, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLLIGHTXVOESPROC)(GLenum light, GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHXOESPROC)(GLfixed width); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base); +typedef void (GLAD_API_PTR *PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC)(GLuint list, GLuint segment, const void ** indirects, const GLsizei * sizes, const GLuint * states, const GLuint * fbos, GLuint count); +typedef void (GLAD_API_PTR *PFNGLLISTPARAMETERFSGIXPROC)(GLuint list, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLLISTPARAMETERFVSGIXPROC)(GLuint list, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLLISTPARAMETERISGIXPROC)(GLuint list, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLISTPARAMETERIVSGIXPROC)(GLuint list, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void); +typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOADMATRIXXOESPROC)(const GLfixed * m); +typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name); +typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDARBPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFARBPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXXOESPROC)(const GLfixed * m); +typedef void (GLAD_API_PTR *PFNGLLOCKARRAYSEXTPROC)(GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); +typedef void (GLAD_API_PTR *PFNGLMAKEBUFFERNONRESIDENTNVPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLMAKEBUFFERRESIDENTNVPROC)(GLenum target, GLenum access); +typedef void (GLAD_API_PTR *PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)(GLuint64 handle, GLenum access); +typedef void (GLAD_API_PTR *PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)(GLuint64 handle, GLenum access); +typedef void (GLAD_API_PTR *PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)(GLuint buffer, GLenum access); +typedef void (GLAD_API_PTR *PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)(GLuint64 handle); +typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLMAP1XOESPROC)(GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLMAP2XOESPROC)(GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMAPCONTROLPOINTSNVPROC)(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void * points); +typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID1XOESPROC)(GLint n, GLfixed u1, GLfixed u2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID2XOESPROC)(GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFEREXTPROC)(GLuint buffer, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void * (GLAD_API_PTR *PFNGLMAPOBJECTBUFFERATIPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLMAPPARAMETERFVNVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMAPPARAMETERIVNVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void * (GLAD_API_PTR *PFNGLMAPTEXTURE2DINTELPROC)(GLuint texture, GLint level, GLbitfield access, GLint * stride, GLenum * layout); +typedef void (GLAD_API_PTR *PFNGLMAPVERTEXATTRIB1DAPPLEPROC)(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAPVERTEXATTRIB1FAPPLEPROC)(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLMAPVERTEXATTRIB2DAPPLEPROC)(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAPVERTEXATTRIB2FAPPLEPROC)(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMATERIALXOESPROC)(GLenum face, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLMATERIALXVOESPROC)(GLenum face, GLenum pname, const GLfixed * param); +typedef void (GLAD_API_PTR *PFNGLMATRIXFRUSTUMEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLMATRIXINDEXPOINTERARBPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLMATRIXINDEXUBVARBPROC)(GLint size, const GLubyte * indices); +typedef void (GLAD_API_PTR *PFNGLMATRIXINDEXUIVARBPROC)(GLint size, const GLuint * indices); +typedef void (GLAD_API_PTR *PFNGLMATRIXINDEXUSVARBPROC)(GLint size, const GLushort * indices); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOAD3X2FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOAD3X3FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADIDENTITYEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULT3X2FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULT3X3FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)(GLenum matrixMode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXORTHOEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLMATRIXPOPEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXPUSHEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXROTATEDEXTPROC)(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXROTATEFEXTPROC)(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMATRIXSCALEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXSCALEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMATRIXTRANSLATEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXTRANSLATEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMAXSHADERCOMPILERTHREADSARBPROC)(GLuint count); +typedef void (GLAD_API_PTR *PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)(GLuint count); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIEREXTPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMEMORYOBJECTPARAMETERIVEXTPROC)(GLuint memoryObject, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGARBPROC)(GLfloat value); +typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLMINMAXEXTPROC)(GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXOESPROC)(const GLfixed * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDARBPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFARBPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXXOESPROC)(const GLfixed * m); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSEXTPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)(GLenum mode, const void * indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)(GLenum mode, const void * indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)(GLenum mode, const void * indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSEXTPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC)(GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC)(GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)(GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTIMODEDRAWARRAYSIBMPROC)(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride); +typedef void (GLAD_API_PTR *PFNGLMULTIMODEDRAWELEMENTSIBMPROC)(const GLenum * mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei primcount, GLint modestride); +typedef void (GLAD_API_PTR *PFNGLMULTITEXBUFFEREXTPROC)(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1BOESPROC)(GLenum texture, GLbyte s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1BVOESPROC)(GLenum texture, const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1HNVPROC)(GLenum target, GLhalfNV s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1HVNVPROC)(GLenum target, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1XOESPROC)(GLenum texture, GLfixed s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1XVOESPROC)(GLenum texture, const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2BOESPROC)(GLenum texture, GLbyte s, GLbyte t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2BVOESPROC)(GLenum texture, const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2HVNVPROC)(GLenum target, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2XOESPROC)(GLenum texture, GLfixed s, GLfixed t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2XVOESPROC)(GLenum texture, const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3BOESPROC)(GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3BVOESPROC)(GLenum texture, const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3HVNVPROC)(GLenum target, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3XOESPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3XVOESPROC)(GLenum texture, const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4BOESPROC)(GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4BVOESPROC)(GLenum texture, const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4HVNVPROC)(GLenum target, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XOESPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XVOESPROC)(GLenum texture, const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDPOINTEREXTPROC)(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENDEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENFEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENIEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXRENDERBUFFEREXTPROC)(GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTICASTBARRIERNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLMULTICASTBLITFRAMEBUFFERNVPROC)(GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLMULTICASTBUFFERSUBDATANVPROC)(GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC)(GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLMULTICASTCOPYIMAGESUBDATANVPROC)(GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)(GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC)(GLuint gpu, GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLMULTICASTGETQUERYOBJECTIVNVPROC)(GLuint gpu, GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC)(GLuint gpu, GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC)(GLuint gpu, GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLMULTICASTSCISSORARRAYVNVXPROC)(GLuint gpu, GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTICASTVIEWPORTARRAYVNVXPROC)(GLuint gpu, GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC)(GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); +typedef void (GLAD_API_PTR *PFNGLMULTICASTWAITSYNCNVPROC)(GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERATTACHMEMORYNVPROC)(GLuint buffer, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEEXTPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC)(GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)(GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC)(GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum format, GLsizei len, const void * string); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)(GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDSTRINGARBPROC)(GLenum type, GLint namelen, const GLchar * name, GLint stringlen, const GLchar * string); +typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode); +typedef GLuint (GLAD_API_PTR *PFNGLNEWOBJECTBUFFERATIPROC)(GLsizei size, const void * pointer, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FVERTEX3FSUNPROC)(GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FVERTEX3FVSUNPROC)(const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3HNVPROC)(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3XOESPROC)(GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALFORMATNVPROC)(GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERLISTIBMPROC)(GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERVINTELPROC)(GLenum type, const void ** pointer); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3BATIPROC)(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3BVATIPROC)(GLenum stream, const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3DATIPROC)(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3DVATIPROC)(GLenum stream, const GLdouble * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3FATIPROC)(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3FVATIPROC)(GLenum stream, const GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3IATIPROC)(GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3IVATIPROC)(GLenum stream, const GLint * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3SATIPROC)(GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (GLAD_API_PTR *PFNGLNORMALSTREAM3SVATIPROC)(GLenum stream, const GLshort * coords); +typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); +typedef GLenum (GLAD_API_PTR *PFNGLOBJECTPURGEABLEAPPLEPROC)(GLenum objectType, GLuint name, GLenum option); +typedef GLenum (GLAD_API_PTR *PFNGLOBJECTUNPURGEABLEAPPLEPROC)(GLenum objectType, GLuint name, GLenum option); +typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLORTHOXOESPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (GLAD_API_PTR *PFNGLPNTRIANGLESFATIPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPNTRIANGLESIATIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPASSTEXCOORDATIPROC)(GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token); +typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHXOESPROC)(GLfixed token); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPATHCOLORGENNVPROC)(GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat * coeffs); +typedef void (GLAD_API_PTR *PFNGLPATHCOMMANDSNVPROC)(GLuint path, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void * coords); +typedef void (GLAD_API_PTR *PFNGLPATHCOORDSNVPROC)(GLuint path, GLsizei numCoords, GLenum coordType, const void * coords); +typedef void (GLAD_API_PTR *PFNGLPATHCOVERDEPTHFUNCNVPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLPATHDASHARRAYNVPROC)(GLuint path, GLsizei dashCount, const GLfloat * dashArray); +typedef void (GLAD_API_PTR *PFNGLPATHFOGGENNVPROC)(GLenum genMode); +typedef GLenum (GLAD_API_PTR *PFNGLPATHGLYPHINDEXARRAYNVPROC)(GLuint firstPathName, GLenum fontTarget, const void * fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAD_API_PTR *PFNGLPATHGLYPHINDEXRANGENVPROC)(GLenum fontTarget, const void * fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint * baseAndCount); +typedef void (GLAD_API_PTR *PFNGLPATHGLYPHRANGENVPROC)(GLuint firstPathName, GLenum fontTarget, const void * fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAD_API_PTR *PFNGLPATHGLYPHSNVPROC)(GLuint firstPathName, GLenum fontTarget, const void * fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void * charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAD_API_PTR *PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)(GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void * fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAD_API_PTR *PFNGLPATHPARAMETERFNVPROC)(GLuint path, GLenum pname, GLfloat value); +typedef void (GLAD_API_PTR *PFNGLPATHPARAMETERFVNVPROC)(GLuint path, GLenum pname, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPATHPARAMETERINVPROC)(GLuint path, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPATHPARAMETERIVNVPROC)(GLuint path, GLenum pname, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPATHSTENCILDEPTHOFFSETNVPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPATHSTENCILFUNCNVPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLPATHSTRINGNVPROC)(GLuint path, GLenum format, GLsizei length, const void * pathString); +typedef void (GLAD_API_PTR *PFNGLPATHSUBCOMMANDSNVPROC)(GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte * commands, GLsizei numCoords, GLenum coordType, const void * coords); +typedef void (GLAD_API_PTR *PFNGLPATHSUBCOORDSNVPROC)(GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void * coords); +typedef void (GLAD_API_PTR *PFNGLPATHTEXGENNVPROC)(GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat * coeffs); +typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPIXELDATARANGENVPROC)(GLenum target, GLsizei length, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPXPROC)(GLenum map, GLint size, const GLfixed * values); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREXPROC)(GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLPIXELTEXGENPARAMETERFSGISPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELTEXGENPARAMETERFVSGISPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPIXELTEXGENPARAMETERISGISPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELTEXGENPARAMETERIVSGISPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPIXELTEXGENSGIXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERXOESPROC)(GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor); +typedef void (GLAD_API_PTR *PFNGLPIXELZOOMXOESPROC)(GLfixed xfactor, GLfixed yfactor); +typedef GLboolean (GLAD_API_PTR *PFNGLPOINTALONGPATHNVPROC)(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat * x, GLfloat * y, GLfloat * tangentX, GLfloat * tangentY); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFSGISPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVSGISPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERINVPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVNVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVOESPROC)(GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); +typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXOESPROC)(GLfixed size); +typedef GLint (GLAD_API_PTR *PFNGLPOLLASYNCSGIXPROC)(GLuint * markerp); +typedef GLint (GLAD_API_PTR *PFNGLPOLLINSTRUMENTSSGIXPROC)(GLint * marker_p); +typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPEXTPROC)(GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETEXTPROC)(GLfloat factor, GLfloat bias); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXOESPROC)(GLfixed factor, GLfixed units); +typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask); +typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPGROUPMARKEREXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRESENTFRAMEDUALFILLNVPROC)(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (GLAD_API_PTR *PFNGLPRESENTFRAMEKEYEDNVPROC)(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVEBOUNDINGBOXARBPROC)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXNVPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities); +typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities); +typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESXOESPROC)(GLsizei n, const GLuint * textures, const GLfixed * priorities); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERI4INVPROC)(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERI4IVNVPROC)(GLenum target, GLuint index, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERI4UINVPROC)(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)(GLenum target, GLuint index, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERI4INVPROC)(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)(GLenum target, GLuint index, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)(GLenum target, GLuint index, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIEXTPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)(GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat * coeffs); +typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string); +typedef void (GLAD_API_PTR *PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC)(GLenum target, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DEXTPROC)(GLuint program, GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FEXTPROC)(GLuint program, GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1I64ARBPROC)(GLuint program, GLint location, GLint64 x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1I64NVPROC)(GLuint program, GLint location, GLint64EXT x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IEXTPROC)(GLuint program, GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UI64ARBPROC)(GLuint program, GLint location, GLuint64 x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIEXTPROC)(GLuint program, GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4I64ARBPROC)(GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4I64NVPROC)(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4I64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4I64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UI64ARBPROC)(GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UI64NVPROC)(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)(GLuint program, GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)(GLuint program, GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * values); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * values); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMUI64NVPROC)(GLuint program, GLint location, GLuint64EXT value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMUI64VNVPROC)(GLuint program, GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef void (GLAD_API_PTR *PFNGLPUSHGROUPMARKEREXTPROC)(GLsizei length, const GLchar * marker); +typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +typedef GLbitfield (GLAD_API_PTR *PFNGLQUERYMATRIXXOESPROC)(GLfixed * mantissa, GLint * exponent); +typedef void (GLAD_API_PTR *PFNGLQUERYOBJECTPARAMETERUIAMDPROC)(GLenum target, GLuint id, GLenum pname, GLuint param); +typedef GLint (GLAD_API_PTR *PFNGLQUERYRESOURCENVPROC)(GLenum queryType, GLint tagId, GLuint count, GLint * buffer); +typedef void (GLAD_API_PTR *PFNGLQUERYRESOURCETAGNVPROC)(GLint tagId, const GLchar * tagString); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2XOESPROC)(GLfixed x, GLfixed y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3XOESPROC)(GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4XOESPROC)(GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLRASTERSAMPLESEXTPROC)(GLuint samples, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); +typedef void (GLAD_API_PTR *PFNGLREADINSTRUMENTSSGIXPROC)(GLint marker); +typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSARBPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); +typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2); +typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2); +typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2); +typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2); +typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); +typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2); +typedef void (GLAD_API_PTR *PFNGLRECTXOESPROC)(GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (GLAD_API_PTR *PFNGLRECTXVOESPROC)(const GLfixed * v1, const GLfixed * v2); +typedef void (GLAD_API_PTR *PFNGLREFERENCEPLANESGIXPROC)(const GLdouble * equation); +typedef GLboolean (GLAD_API_PTR *PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC)(GLuint memory, GLuint64 key); +typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRENDERGPUMASKNVPROC)(GLbitfield mask); +typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC)(GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEPOINTERSUNPROC)(GLenum type, GLsizei stride, const void ** pointer); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUBSUNPROC)(GLubyte code); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUBVSUNPROC)(const GLubyte * code); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)(GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)(const GLuint * rc, const GLubyte * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)(GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUISUNPROC)(GLuint code); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)(GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)(GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)(GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * tc, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)(GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)(const GLuint * rc, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUIVSUNPROC)(const GLuint * code); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUSSUNPROC)(GLushort code); +typedef void (GLAD_API_PTR *PFNGLREPLACEMENTCODEUSVSUNPROC)(const GLushort * code); +typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESETMEMORYOBJECTPARAMETERNVPROC)(GLuint memory, GLenum pname); +typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESETMINMAXEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESIZEBUFFERSMESAPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRESOLVEDEPTHVALUESNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLROTATEXOESPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEARBPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMAPATIPROC)(GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKEXTPROC)(GLclampf value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKINDEXEDNVPROC)(GLuint index, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKSGISPROC)(GLclampf value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLEPATTERNEXTPROC)(GLenum pattern); +typedef void (GLAD_API_PTR *PFNGLSAMPLEPATTERNSGISPROC)(GLenum pattern); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLSCALEXOESPROC)(GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSOREXCLUSIVEARRAYVNVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSOREXCLUSIVENVPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BEXTPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVEXTPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DEXTPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVEXTPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IEXTPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVEXTPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SEXTPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVEXTPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIEXTPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVEXTPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USEXTPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVEXTPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORFORMATNVPROC)(GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)(GLint size, GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer); +typedef void (GLAD_API_PTR *PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint * counterList); +typedef void (GLAD_API_PTR *PFNGLSEMAPHOREPARAMETERIVNVPROC)(GLuint semaphore, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLSEMAPHOREPARAMETERUI64VEXTPROC)(GLuint semaphore, GLenum pname, const GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column); +typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column); +typedef void (GLAD_API_PTR *PFNGLSETFENCEAPPLEPROC)(GLuint fence); +typedef void (GLAD_API_PTR *PFNGLSETFENCENVPROC)(GLuint fence, GLenum condition); +typedef void (GLAD_API_PTR *PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)(GLuint dst, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLSETINVARIANTEXTPROC)(GLuint id, GLenum type, const void * addr); +typedef void (GLAD_API_PTR *PFNGLSETLOCALCONSTANTEXTPROC)(GLuint id, GLenum type, const void * addr); +typedef void (GLAD_API_PTR *PFNGLSETMULTISAMPLEFVAMDPROC)(GLenum pname, GLuint index, const GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLSHADEROP1EXTPROC)(GLenum op, GLuint res, GLuint arg1); +typedef void (GLAD_API_PTR *PFNGLSHADEROP2EXTPROC)(GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAD_API_PTR *PFNGLSHADEROP3EXTPROC)(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATEIMAGEBARRIERNVPROC)(GLboolean synchronize); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATEIMAGEPALETTENVPROC)(GLuint viewport, GLuint first, GLsizei count, const GLenum * rates); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC)(GLenum rate, GLuint samples, const GLint * locations); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATESAMPLEORDERNVPROC)(GLenum order); +typedef void (GLAD_API_PTR *PFNGLSHARPENTEXFUNCSGISPROC)(GLenum target, GLsizei n, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLSIGNALSEMAPHOREEXTPROC)(GLuint semaphore, GLuint numBufferBarriers, const GLuint * buffers, GLuint numTextureBarriers, const GLuint * textures, const GLenum * dstLayouts); +typedef void (GLAD_API_PTR *PFNGLSIGNALSEMAPHOREUI64NVXPROC)(GLuint signalGpu, GLsizei fenceObjectCount, const GLuint * semaphoreArray, const GLuint64 * fenceValueArray); +typedef void (GLAD_API_PTR *PFNGLSIGNALVKFENCENVPROC)(GLuint64 vkFence); +typedef void (GLAD_API_PTR *PFNGLSIGNALVKSEMAPHORENVPROC)(GLuint64 vkSemaphore); +typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue); +typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERARBPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue); +typedef void (GLAD_API_PTR *PFNGLSPRITEPARAMETERFSGIXPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSPRITEPARAMETERFVSGIXPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLSPRITEPARAMETERISGIXPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSPRITEPARAMETERIVSGIXPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLSTARTINSTRUMENTSSGIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLSTATECAPTURENVPROC)(GLuint state, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLSTENCILCLEARTAGEXTPROC)(GLsizei stencilTagBits, GLuint stencilClearTag); +typedef void (GLAD_API_PTR *PFNGLSTENCILFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLSTENCILFILLPATHNVPROC)(GLuint path, GLenum fillMode, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEATIPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEATIPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPVALUEAMDPROC)(GLenum face, GLuint value); +typedef void (GLAD_API_PTR *PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLSTENCILSTROKEPATHNVPROC)(GLuint path, GLint reference, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLSTENCILTHENCOVERFILLPATHNVPROC)(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GLAD_API_PTR *PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)(GLsizei numPaths, GLenum pathNameType, const void * paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)(GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GLAD_API_PTR *PFNGLSTOPINSTRUMENTSSGIXPROC)(GLint marker); +typedef void (GLAD_API_PTR *PFNGLSTRINGMARKERGREMEDYPROC)(GLsizei len, const void * string); +typedef void (GLAD_API_PTR *PFNGLSUBPIXELPRECISIONBIASNVPROC)(GLuint xbits, GLuint ybits); +typedef void (GLAD_API_PTR *PFNGLSWIZZLEEXTPROC)(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAD_API_PTR *PFNGLSYNCTEXTUREINTELPROC)(GLuint texture); +typedef void (GLAD_API_PTR *PFNGLTAGSAMPLEBUFFERSGIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLTANGENT3BEXTPROC)(GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (GLAD_API_PTR *PFNGLTANGENT3BVEXTPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLTANGENT3DEXTPROC)(GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (GLAD_API_PTR *PFNGLTANGENT3DVEXTPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTANGENT3FEXTPROC)(GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (GLAD_API_PTR *PFNGLTANGENT3FVEXTPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTANGENT3IEXTPROC)(GLint tx, GLint ty, GLint tz); +typedef void (GLAD_API_PTR *PFNGLTANGENT3IVEXTPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTANGENT3SEXTPROC)(GLshort tx, GLshort ty, GLshort tz); +typedef void (GLAD_API_PTR *PFNGLTANGENT3SVEXTPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTANGENTPOINTEREXTPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTBUFFERMASK3DFXPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLTESSELLATIONFACTORAMDPROC)(GLfloat factor); +typedef void (GLAD_API_PTR *PFNGLTESSELLATIONMODEAMDPROC)(GLenum mode); +typedef GLboolean (GLAD_API_PTR *PFNGLTESTFENCEAPPLEPROC)(GLuint fence); +typedef GLboolean (GLAD_API_PTR *PFNGLTESTFENCENVPROC)(GLuint fence); +typedef GLboolean (GLAD_API_PTR *PFNGLTESTOBJECTAPPLEPROC)(GLenum object, GLuint name); +typedef void (GLAD_API_PTR *PFNGLTEXATTACHMEMORYNVPROC)(GLenum target, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERARBPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFEREXTPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXBUMPPARAMETERFVATIPROC)(GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLTEXBUMPPARAMETERIVATIPROC)(GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1BOESPROC)(GLbyte s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1HNVPROC)(GLhalfNV s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1XOESPROC)(GLfixed s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2BOESPROC)(GLbyte s, GLbyte t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)(const GLfloat * tc, const GLfloat * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)(GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)(const GLfloat * tc, const GLubyte * c, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)(GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)(const GLfloat * tc, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVERTEX3FSUNPROC)(GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVERTEX3FVSUNPROC)(const GLfloat * tc, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2HNVPROC)(GLhalfNV s, GLhalfNV t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2XOESPROC)(GLfixed s, GLfixed t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3BOESPROC)(GLbyte s, GLbyte t, GLbyte r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3XOESPROC)(GLfixed s, GLfixed t, GLfixed r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4BOESPROC)(GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVERTEX4FSUNPROC)(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVERTEX4FVSUNPROC)(const GLfloat * tc, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4XOESPROC)(GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDFORMATNVPROC)(GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERLISTIBMPROC)(GLint size, GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERVINTELPROC)(GLint size, GLenum type, const void ** pointer); +typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXENVXOESPROC)(GLenum target, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLTEXENVXVOESPROC)(GLenum target, GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLTEXFILTERFUNCSGISPROC)(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights); +typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENXOESPROC)(GLenum coord, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLTEXGENXVOESPROC)(GLenum coord, GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE4DSGISPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXPAGECOMMITMENTARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXPAGECOMMITMENTMEMNVPROC)(GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVEXTPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVEXTPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXOESPROC)(GLenum target, GLenum pname, GLfixed param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERXVOESPROC)(GLenum target, GLenum pname, const GLfixed * params); +typedef void (GLAD_API_PTR *PFNGLTEXRENDERBUFFERNVPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEMEM1DEXTPROC)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEMEM2DEXTPROC)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEMEM3DEXTPROC)(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGESPARSEAMDPROC)(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE4DSGISPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREATTACHMEMORYNVPROC)(GLuint texture, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFEREXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEEXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXTURECOLORMASKSGISPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURELIGHTEXTPROC)(GLenum pname); +typedef void (GLAD_API_PTR *PFNGLTEXTUREMATERIALEXTPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLTEXTURENORMALEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPAGECOMMITMENTEXTPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC)(GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTURERANGEAPPLEPROC)(GLenum target, GLsizei length, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTEXTURERENDERBUFFEREXTPROC)(GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGEMEM1DEXTPROC)(GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGEMEM2DEXTPROC)(GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC)(GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGEMEM3DEXTPROC)(GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC)(GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGESPARSEAMDPROC)(GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)(GLsizei count, const GLint * attribs, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC)(GLsizei count, const GLint * attribs, GLsizei nbuffers, const GLint * bufstreams, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMPATHNVPROC)(GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat * transformValues); +typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLTRANSLATEXOESPROC)(GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1I64ARBPROC)(GLint location, GLint64 x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1I64NVPROC)(GLint location, GLint64EXT x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1I64VARBPROC)(GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UI64ARBPROC)(GLint location, GLuint64 x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UI64NVPROC)(GLint location, GLuint64EXT x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UI64VARBPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIEXTPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2I64ARBPROC)(GLint location, GLint64 x, GLint64 y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2I64VARBPROC)(GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UI64VARBPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3I64ARBPROC)(GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3I64VARBPROC)(GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UI64VARBPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4I64ARBPROC)(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4I64NVPROC)(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4I64VARBPROC)(GLint location, GLsizei count, const GLint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4I64VNVPROC)(GLint location, GLsizei count, const GLint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UI64ARBPROC)(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UI64NVPROC)(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UI64VARBPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBUFFEREXTPROC)(GLuint program, GLint location, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64ARBPROC)(GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64NVPROC)(GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64VARBPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64VNVPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices); +typedef void (GLAD_API_PTR *PFNGLUNIFORMUI64NVPROC)(GLint location, GLuint64EXT value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMUI64VNVPROC)(GLint location, GLsizei count, const GLuint64EXT * value); +typedef void (GLAD_API_PTR *PFNGLUNLOCKARRAYSEXTPROC)(void); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFEREXTPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLUNMAPOBJECTBUFFERATIPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLUNMAPTEXTURE2DINTELPROC)(GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLUPDATEOBJECTBUFFERATIPROC)(GLuint buffer, GLuint offset, GLsizei size, const void * pointer, GLenum preserve); +typedef void (GLAD_API_PTR *PFNGLUPLOADGPUMASKNVXPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAD_API_PTR *PFNGLUSESHADERPROGRAMEXTPROC)(GLenum type, GLuint program); +typedef void (GLAD_API_PTR *PFNGLVDPAUFININVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLVDPAUGETSURFACEIVNVPROC)(GLvdpauSurfaceNV surface, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLVDPAUINITNVPROC)(const void * vdpDevice, const void * getProcAddress); +typedef GLboolean (GLAD_API_PTR *PFNGLVDPAUISSURFACENVPROC)(GLvdpauSurfaceNV surface); +typedef void (GLAD_API_PTR *PFNGLVDPAUMAPSURFACESNVPROC)(GLsizei numSurfaces, const GLvdpauSurfaceNV * surfaces); +typedef GLvdpauSurfaceNV (GLAD_API_PTR *PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)(const void * vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint * textureNames); +typedef GLvdpauSurfaceNV (GLAD_API_PTR *PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)(const void * vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint * textureNames); +typedef GLvdpauSurfaceNV (GLAD_API_PTR *PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC)(const void * vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint * textureNames, GLboolean isFrameStructure); +typedef void (GLAD_API_PTR *PFNGLVDPAUSURFACEACCESSNVPROC)(GLvdpauSurfaceNV surface, GLenum access); +typedef void (GLAD_API_PTR *PFNGLVDPAUUNMAPSURFACESNVPROC)(GLsizei numSurface, const GLvdpauSurfaceNV * surfaces); +typedef void (GLAD_API_PTR *PFNGLVDPAUUNREGISTERSURFACENVPROC)(GLvdpauSurfaceNV surface); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLVARIANTARRAYOBJECTATIPROC)(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAD_API_PTR *PFNGLVARIANTPOINTEREXTPROC)(GLuint id, GLenum type, GLuint stride, const void * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTBVEXTPROC)(GLuint id, const GLbyte * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTDVEXTPROC)(GLuint id, const GLdouble * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTFVEXTPROC)(GLuint id, const GLfloat * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTIVEXTPROC)(GLuint id, const GLint * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTSVEXTPROC)(GLuint id, const GLshort * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTUBVEXTPROC)(GLuint id, const GLubyte * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTUIVEXTPROC)(GLuint id, const GLuint * addr); +typedef void (GLAD_API_PTR *PFNGLVARIANTUSVEXTPROC)(GLuint id, const GLushort * addr); +typedef void (GLAD_API_PTR *PFNGLVERTEX2BOESPROC)(GLbyte x, GLbyte y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2HNVPROC)(GLhalfNV x, GLhalfNV y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2XOESPROC)(GLfixed x); +typedef void (GLAD_API_PTR *PFNGLVERTEX2XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEX3BOESPROC)(GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3XOESPROC)(GLfixed x, GLfixed y); +typedef void (GLAD_API_PTR *PFNGLVERTEX3XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEX4BOESPROC)(GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4BVOESPROC)(const GLbyte * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4HVNVPROC)(const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4XOESPROC)(GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAD_API_PTR *PFNGLVERTEX4XVOESPROC)(const GLfixed * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYRANGEAPPLEPROC)(GLsizei length, void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYRANGENVPROC)(GLsizei length, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)(GLuint vaobj, GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1HNVPROC)(GLuint index, GLhalfNV x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1HVNVPROC)(GLuint index, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2HVNVPROC)(GLuint index, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3HVNVPROC)(GLuint index, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4HVNVPROC)(GLuint index, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORARBPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DEXTPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVEXTPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1I64NVPROC)(GLuint index, GLint64EXT x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1I64VNVPROC)(GLuint index, const GLint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1UI64ARBPROC)(GLuint index, GLuint64EXT x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1UI64NVPROC)(GLuint index, GLuint64EXT x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1UI64VARBPROC)(GLuint index, const GLuint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1UI64VNVPROC)(GLuint index, const GLuint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DEXTPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVEXTPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2I64VNVPROC)(GLuint index, const GLint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2UI64VNVPROC)(GLuint index, const GLuint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DEXTPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVEXTPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3I64VNVPROC)(GLuint index, const GLint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3UI64VNVPROC)(GLuint index, const GLuint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DEXTPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVEXTPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4I64NVPROC)(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4I64VNVPROC)(GLuint index, const GLint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4UI64NVPROC)(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4UI64VNVPROC)(GLuint index, const GLuint64EXT * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATNVPROC)(GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTEREXTPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPARAMETERIAMDPROC)(GLuint index, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXBLENDARBPROC)(GLint count); +typedef void (GLAD_API_PTR *PFNGLVERTEXBLENDENVFATIPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLVERTEXBLENDENVIATIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLVERTEXFORMATNVPROC)(GLint size, GLenum type, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERLISTIBMPROC)(GLint size, GLenum type, GLint stride, const void ** pointer, GLint ptrstride); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERVINTELPROC)(GLint size, GLenum type, const void ** pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1DATIPROC)(GLenum stream, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1DVATIPROC)(GLenum stream, const GLdouble * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1FATIPROC)(GLenum stream, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1FVATIPROC)(GLenum stream, const GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1IATIPROC)(GLenum stream, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1IVATIPROC)(GLenum stream, const GLint * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1SATIPROC)(GLenum stream, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM1SVATIPROC)(GLenum stream, const GLshort * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2DATIPROC)(GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2DVATIPROC)(GLenum stream, const GLdouble * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2FATIPROC)(GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2FVATIPROC)(GLenum stream, const GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2IATIPROC)(GLenum stream, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2IVATIPROC)(GLenum stream, const GLint * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2SATIPROC)(GLenum stream, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM2SVATIPROC)(GLenum stream, const GLshort * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3DATIPROC)(GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3DVATIPROC)(GLenum stream, const GLdouble * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3FATIPROC)(GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3FVATIPROC)(GLenum stream, const GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3IATIPROC)(GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3IVATIPROC)(GLenum stream, const GLint * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3SATIPROC)(GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM3SVATIPROC)(GLenum stream, const GLshort * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4DATIPROC)(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4DVATIPROC)(GLenum stream, const GLdouble * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4FATIPROC)(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4FVATIPROC)(GLenum stream, const GLfloat * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4IATIPROC)(GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4IVATIPROC)(GLenum stream, const GLint * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4SATIPROC)(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXSTREAM4SVATIPROC)(GLenum stream, const GLshort * coords); +typedef void (GLAD_API_PTR *PFNGLVERTEXWEIGHTPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXWEIGHTFEXTPROC)(GLfloat weight); +typedef void (GLAD_API_PTR *PFNGLVERTEXWEIGHTFVEXTPROC)(const GLfloat * weight); +typedef void (GLAD_API_PTR *PFNGLVERTEXWEIGHTHNVPROC)(GLhalfNV weight); +typedef void (GLAD_API_PTR *PFNGLVERTEXWEIGHTHVNVPROC)(const GLhalfNV * weight); +typedef GLenum (GLAD_API_PTR *PFNGLVIDEOCAPTURENVPROC)(GLuint video_capture_slot, GLuint * sequence_num, GLuint64EXT * capture_time); +typedef void (GLAD_API_PTR *PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPOSITIONWSCALENVPROC)(GLuint index, GLfloat xcoeff, GLfloat ycoeff); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTSWIZZLENVPROC)(GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +typedef void (GLAD_API_PTR *PFNGLWAITSEMAPHOREEXTPROC)(GLuint semaphore, GLuint numBufferBarriers, const GLuint * buffers, GLuint numTextureBarriers, const GLuint * textures, const GLenum * srcLayouts); +typedef void (GLAD_API_PTR *PFNGLWAITSEMAPHOREUI64NVXPROC)(GLuint waitGpu, GLsizei fenceObjectCount, const GLuint * semaphoreArray, const GLuint64 * fenceValueArray); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLWAITVKSEMAPHORENVPROC)(GLuint64 vkSemaphore); +typedef void (GLAD_API_PTR *PFNGLWEIGHTPATHSNVPROC)(GLuint resultPath, GLsizei numPaths, const GLuint * paths, const GLfloat * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTPOINTERARBPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLWEIGHTBVARBPROC)(GLint size, const GLbyte * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTDVARBPROC)(GLint size, const GLdouble * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTFVARBPROC)(GLint size, const GLfloat * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTIVARBPROC)(GLint size, const GLint * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTSVARBPROC)(GLint size, const GLshort * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTUBVARBPROC)(GLint size, const GLubyte * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTUIVARBPROC)(GLint size, const GLuint * weights); +typedef void (GLAD_API_PTR *PFNGLWEIGHTUSVARBPROC)(GLint size, const GLushort * weights); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DARBPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DMESAPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVARBPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FARBPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FMESAPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVARBPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IARBPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IMESAPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVARBPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SARBPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SMESAPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVARBPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVMESAPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DARBPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DMESAPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVARBPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FARBPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FMESAPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVARBPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IARBPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IMESAPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVARBPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SARBPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SMESAPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVARBPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVMESAPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4DMESAPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4FMESAPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4IMESAPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4SMESAPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4SVMESAPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWRECTANGLESEXTPROC)(GLenum mode, GLsizei count, const GLint * box); +typedef void (GLAD_API_PTR *PFNGLWRITEMASKEXTPROC)(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMEXTPROC)(GLuint pipeline, GLuint program); +typedef void (GLAD_API_PTR *PFNGLALPHAFUNCQCOMPROC)(GLenum func, GLclampf ref); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYEXTPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEEXTPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYOESPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBLENDBARRIERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIEXTPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIOESPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIEXTPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIOESPROC)(GLuint buf, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIEXTPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIOESPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIEXTPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIOESPROC)(GLuint buf, GLenum src, GLenum dst); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERANGLEPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERNVPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEEXTPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC)(GLsizei offset, GLsizei n, const GLuint * values); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEEXTPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEEXTPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCAPPLEPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLEXTPROC)(GLenum origin, GLenum depth); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIEXTPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIOESPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DOESPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATANVPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAEXTPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAOESPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DOESPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURELEVELSAPPLEPROC)(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +typedef void (GLAD_API_PTR *PFNGLCOVERAGEMASKNVPROC)(GLboolean mask); +typedef void (GLAD_API_PTR *PFNGLCOVERAGEOPERATIONNVPROC)(GLenum operation); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVEXTPROC)(GLenum type, GLsizei count, const GLchar *const* strings); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKKHRPROC)(GLDEBUGPROCKHR callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLKHRPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTKHRPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESEXTPROC)(GLsizei n, const GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESEXTPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCAPPLEPROC)(GLsync sync); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSOESPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYFVNVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYFVOESPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDFNVPROC)(GLuint index, GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDFOESPROC)(GLuint index, GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDISABLEDRIVERCONTROLQCOMPROC)(GLuint driverControl); +typedef void (GLAD_API_PTR *PFNGLDISABLEIEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEINVPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIOESPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISCARDFRAMEBUFFEREXTPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDANGLEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDNVPROC)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSEXTPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSINDEXEDEXTPROC)(GLint n, const GLenum * location, const GLint * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSNVPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXOESPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDNVPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKEXTPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC)(GLenum mode, GLuint id, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLeglImageOES image); +typedef void (GLAD_API_PTR *PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)(GLenum target, GLeglImageOES image); +typedef void (GLAD_API_PTR *PFNGLENABLEDRIVERCONTROLQCOMPROC)(GLuint driverControl); +typedef void (GLAD_API_PTR *PFNGLENABLEIEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEINVPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIOESPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDQUERYEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDTILINGQCOMPROC)(GLbitfield preserveMask); +typedef void (GLAD_API_PTR *PFNGLEXTGETBUFFERPOINTERVQCOMPROC)(GLenum target, void ** params); +typedef void (GLAD_API_PTR *PFNGLEXTGETBUFFERSQCOMPROC)(GLuint * buffers, GLint maxBuffers, GLint * numBuffers); +typedef void (GLAD_API_PTR *PFNGLEXTGETFRAMEBUFFERSQCOMPROC)(GLuint * framebuffers, GLint maxFramebuffers, GLint * numFramebuffers); +typedef void (GLAD_API_PTR *PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC)(GLuint program, GLenum shadertype, GLchar * source, GLint * length); +typedef void (GLAD_API_PTR *PFNGLEXTGETPROGRAMSQCOMPROC)(GLuint * programs, GLint maxPrograms, GLint * numPrograms); +typedef void (GLAD_API_PTR *PFNGLEXTGETRENDERBUFFERSQCOMPROC)(GLuint * renderbuffers, GLint maxRenderbuffers, GLint * numRenderbuffers); +typedef void (GLAD_API_PTR *PFNGLEXTGETSHADERSQCOMPROC)(GLuint * shaders, GLint maxShaders, GLint * numShaders); +typedef void (GLAD_API_PTR *PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC)(GLuint texture, GLenum face, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLEXTGETTEXSUBIMAGEQCOMPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void * texels); +typedef void (GLAD_API_PTR *PFNGLEXTGETTEXTURESQCOMPROC)(GLuint * textures, GLint maxTextures, GLint * numTextures); +typedef GLboolean (GLAD_API_PTR *PFNGLEXTISPROGRAMBINARYQCOMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLEXTRAPOLATETEX2DQCOMPROC)(GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCAPPLEPROC)(GLenum condition, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC)(GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint * providedFeatures); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC)(GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)(GLuint target, GLsizei size); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERSHADINGRATEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREOESPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESEXTPROC)(GLsizei n, GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESEXTPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSOESPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVOESPROC)(GLenum target, GLenum pname, void ** params); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGKHRPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDRIVERCONTROLSTRINGQCOMPROC)(GLuint driverControl, GLsizei bufSize, GLsizei * length, GLchar * driverControlString); +typedef void (GLAD_API_PTR *PFNGLGETDRIVERCONTROLSQCOMPROC)(GLint * num, GLsizei size, GLuint * driverControls); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VNVPROC)(GLenum target, GLuint index, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VOESPROC)(GLenum target, GLuint index, GLfloat * data); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXEXTPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETFRAGMENTSHADINGRATESEXTPROC)(GLsizei samples, GLsizei maxCount, GLsizei * count, GLenum * shadingRates); +typedef GLsizei (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC)(GLuint target); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSEXTPROC)(void); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSKHRPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VAPPLEPROC)(GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VEXTPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VEXTPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELKHRPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVKHRPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYOESPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVEXTPROC)(GLuint pipeline, GLenum pname, GLint * params); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVEXTPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVEXTPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVEXTPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVOESPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVEXTPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVOESPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVAPPLEPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVOESPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVOESPROC)(GLenum target, GLenum pname, GLuint * params); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTUREHANDLEIMGPROC)(GLuint texture); +typedef GLuint64 (GLAD_API_PTR *PFNGLGETTEXTURESAMPLERHANDLEIMGPROC)(GLuint texture, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVEXTPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVKHRPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVEXTPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVKHRPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVKHRPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIEXTPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDINVPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIOESPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEEXTPROC)(GLuint pipeline); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYEXTPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCAPPLEPROC)(GLsync sync); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYOESPROC)(GLuint array); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFEROESPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEEXTPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMAXACTIVESHADERCORESARMPROC)(GLuint count); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGOESPROC)(GLfloat value); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLOBJECTLABELKHRPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELKHRPROC)(const void * ptr, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIEXTPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIOESPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPOLYGONMODENVPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPKHRPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVEBOUNDINGBOXPROC)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVEBOUNDINGBOXEXTPROC)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVEBOUNDINGBOXOESPROC)(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYOESPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLint length); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC)(GLuint program, GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC)(GLuint program, GLint location, GLsizei count, const GLuint64 * values); +typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPKHRPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTEREXTPROC)(GLuint id, GLenum target); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERINDEXEDEXTPROC)(GLenum src, GLint index); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERNVPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSEXTPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSKHRPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC)(void); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVEXTPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVOESPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVEXTPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVOESPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVNVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVOESPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDNVPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDOESPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVNVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVOESPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATECOMBINEROPSEXTPROC)(GLenum combinerOp0, GLenum combinerOp1); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATEEXTPROC)(GLenum rate); +typedef void (GLAD_API_PTR *PFNGLSHADINGRATEQCOMPROC)(GLenum rate); +typedef void (GLAD_API_PTR *PFNGLSTARTTILINGQCOMPROC)(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFEROESPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEEXTPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEOESPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXESTIMATEMOTIONQCOMPROC)(GLuint ref, GLuint target, GLuint output); +typedef void (GLAD_API_PTR *PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC)(GLuint ref, GLuint target, GLuint output, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DOESPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXPAGECOMMITMENTEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVOESPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVOESPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEATTRIBS2DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, const GLint * attrib_list); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGEATTRIBS3DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const GLint * attrib_list); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DOESPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC)(GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWEXTPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWOESPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64IMGPROC)(GLint location, GLuint64 value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMHANDLEUI64VIMGPROC)(GLint location, GLsizei count, const GLuint64 * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVNVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFEROESPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESEXTPROC)(GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEEXTPROC)(GLuint pipeline); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORANGLEPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISOREXTPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORNVPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVNVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVOESPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFOESPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVOESPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCAPPLEPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); + +GLAD_API_CALL PFNGLACCUMPROC glad_glAccum; +#define glAccum glad_glAccum +GLAD_API_CALL PFNGLACCUMXOESPROC glad_glAccumxOES; +#define glAccumxOES glad_glAccumxOES +GLAD_API_CALL PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC glad_glAcquireKeyedMutexWin32EXT; +#define glAcquireKeyedMutexWin32EXT glad_glAcquireKeyedMutexWin32EXT +GLAD_API_CALL PFNGLACTIVEPROGRAMEXTPROC glad_glActiveProgramEXT; +#define glActiveProgramEXT glad_glActiveProgramEXT +GLAD_API_CALL PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; +#define glActiveShaderProgram glad_glActiveShaderProgram +GLAD_API_CALL PFNGLACTIVESTENCILFACEEXTPROC glad_glActiveStencilFaceEXT; +#define glActiveStencilFaceEXT glad_glActiveStencilFaceEXT +GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB; +#define glActiveTextureARB glad_glActiveTextureARB +GLAD_API_CALL PFNGLACTIVEVARYINGNVPROC glad_glActiveVaryingNV; +#define glActiveVaryingNV glad_glActiveVaryingNV +GLAD_API_CALL PFNGLALPHAFRAGMENTOP1ATIPROC glad_glAlphaFragmentOp1ATI; +#define glAlphaFragmentOp1ATI glad_glAlphaFragmentOp1ATI +GLAD_API_CALL PFNGLALPHAFRAGMENTOP2ATIPROC glad_glAlphaFragmentOp2ATI; +#define glAlphaFragmentOp2ATI glad_glAlphaFragmentOp2ATI +GLAD_API_CALL PFNGLALPHAFRAGMENTOP3ATIPROC glad_glAlphaFragmentOp3ATI; +#define glAlphaFragmentOp3ATI glad_glAlphaFragmentOp3ATI +GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc; +#define glAlphaFunc glad_glAlphaFunc +GLAD_API_CALL PFNGLALPHAFUNCXOESPROC glad_glAlphaFuncxOES; +#define glAlphaFuncxOES glad_glAlphaFuncxOES +GLAD_API_CALL PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC glad_glAlphaToCoverageDitherControlNV; +#define glAlphaToCoverageDitherControlNV glad_glAlphaToCoverageDitherControlNV +GLAD_API_CALL PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC glad_glApplyFramebufferAttachmentCMAAINTEL; +#define glApplyFramebufferAttachmentCMAAINTEL glad_glApplyFramebufferAttachmentCMAAINTEL +GLAD_API_CALL PFNGLAPPLYTEXTUREEXTPROC glad_glApplyTextureEXT; +#define glApplyTextureEXT glad_glApplyTextureEXT +GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV; +#define glAreProgramsResidentNV glad_glAreProgramsResidentNV +GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident; +#define glAreTexturesResident glad_glAreTexturesResident +GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT; +#define glAreTexturesResidentEXT glad_glAreTexturesResidentEXT +GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement; +#define glArrayElement glad_glArrayElement +GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT; +#define glArrayElementEXT glad_glArrayElementEXT +GLAD_API_CALL PFNGLARRAYOBJECTATIPROC glad_glArrayObjectATI; +#define glArrayObjectATI glad_glArrayObjectATI +GLAD_API_CALL PFNGLASYNCCOPYBUFFERSUBDATANVXPROC glad_glAsyncCopyBufferSubDataNVX; +#define glAsyncCopyBufferSubDataNVX glad_glAsyncCopyBufferSubDataNVX +GLAD_API_CALL PFNGLASYNCCOPYIMAGESUBDATANVXPROC glad_glAsyncCopyImageSubDataNVX; +#define glAsyncCopyImageSubDataNVX glad_glAsyncCopyImageSubDataNVX +GLAD_API_CALL PFNGLASYNCMARKERSGIXPROC glad_glAsyncMarkerSGIX; +#define glAsyncMarkerSGIX glad_glAsyncMarkerSGIX +GLAD_API_CALL PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB; +#define glAttachObjectARB glad_glAttachObjectARB +GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +GLAD_API_CALL PFNGLBEGINPROC glad_glBegin; +#define glBegin glad_glBegin +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERNVPROC glad_glBeginConditionalRenderNV; +#define glBeginConditionalRenderNV glad_glBeginConditionalRenderNV +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERNVXPROC glad_glBeginConditionalRenderNVX; +#define glBeginConditionalRenderNVX glad_glBeginConditionalRenderNVX +GLAD_API_CALL PFNGLBEGINFRAGMENTSHADERATIPROC glad_glBeginFragmentShaderATI; +#define glBeginFragmentShaderATI glad_glBeginFragmentShaderATI +GLAD_API_CALL PFNGLBEGINOCCLUSIONQUERYNVPROC glad_glBeginOcclusionQueryNV; +#define glBeginOcclusionQueryNV glad_glBeginOcclusionQueryNV +GLAD_API_CALL PFNGLBEGINPERFMONITORAMDPROC glad_glBeginPerfMonitorAMD; +#define glBeginPerfMonitorAMD glad_glBeginPerfMonitorAMD +GLAD_API_CALL PFNGLBEGINPERFQUERYINTELPROC glad_glBeginPerfQueryINTEL; +#define glBeginPerfQueryINTEL glad_glBeginPerfQueryINTEL +GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +GLAD_API_CALL PFNGLBEGINQUERYARBPROC glad_glBeginQueryARB; +#define glBeginQueryARB glad_glBeginQueryARB +GLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed; +#define glBeginQueryIndexed glad_glBeginQueryIndexed +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKEXTPROC glad_glBeginTransformFeedbackEXT; +#define glBeginTransformFeedbackEXT glad_glBeginTransformFeedbackEXT +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKNVPROC glad_glBeginTransformFeedbackNV; +#define glBeginTransformFeedbackNV glad_glBeginTransformFeedbackNV +GLAD_API_CALL PFNGLBEGINVERTEXSHADEREXTPROC glad_glBeginVertexShaderEXT; +#define glBeginVertexShaderEXT glad_glBeginVertexShaderEXT +GLAD_API_CALL PFNGLBEGINVIDEOCAPTURENVPROC glad_glBeginVideoCaptureNV; +#define glBeginVideoCaptureNV glad_glBeginVideoCaptureNV +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB; +#define glBindAttribLocationARB glad_glBindAttribLocationARB +GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +GLAD_API_CALL PFNGLBINDBUFFERARBPROC glad_glBindBufferARB; +#define glBindBufferARB glad_glBindBufferARB +GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +GLAD_API_CALL PFNGLBINDBUFFERBASEEXTPROC glad_glBindBufferBaseEXT; +#define glBindBufferBaseEXT glad_glBindBufferBaseEXT +GLAD_API_CALL PFNGLBINDBUFFERBASENVPROC glad_glBindBufferBaseNV; +#define glBindBufferBaseNV glad_glBindBufferBaseNV +GLAD_API_CALL PFNGLBINDBUFFEROFFSETEXTPROC glad_glBindBufferOffsetEXT; +#define glBindBufferOffsetEXT glad_glBindBufferOffsetEXT +GLAD_API_CALL PFNGLBINDBUFFEROFFSETNVPROC glad_glBindBufferOffsetNV; +#define glBindBufferOffsetNV glad_glBindBufferOffsetNV +GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +GLAD_API_CALL PFNGLBINDBUFFERRANGEEXTPROC glad_glBindBufferRangeEXT; +#define glBindBufferRangeEXT glad_glBindBufferRangeEXT +GLAD_API_CALL PFNGLBINDBUFFERRANGENVPROC glad_glBindBufferRangeNV; +#define glBindBufferRangeNV glad_glBindBufferRangeNV +GLAD_API_CALL PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase; +#define glBindBuffersBase glad_glBindBuffersBase +GLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange; +#define glBindBuffersRange glad_glBindBuffersRange +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONEXTPROC glad_glBindFragDataLocationEXT; +#define glBindFragDataLocationEXT glad_glBindFragDataLocationEXT +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +GLAD_API_CALL PFNGLBINDFRAGMENTSHADERATIPROC glad_glBindFragmentShaderATI; +#define glBindFragmentShaderATI glad_glBindFragmentShaderATI +GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT; +#define glBindFramebufferEXT glad_glBindFramebufferEXT +GLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; +#define glBindImageTexture glad_glBindImageTexture +GLAD_API_CALL PFNGLBINDIMAGETEXTUREEXTPROC glad_glBindImageTextureEXT; +#define glBindImageTextureEXT glad_glBindImageTextureEXT +GLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures; +#define glBindImageTextures glad_glBindImageTextures +GLAD_API_CALL PFNGLBINDLIGHTPARAMETEREXTPROC glad_glBindLightParameterEXT; +#define glBindLightParameterEXT glad_glBindLightParameterEXT +GLAD_API_CALL PFNGLBINDMATERIALPARAMETEREXTPROC glad_glBindMaterialParameterEXT; +#define glBindMaterialParameterEXT glad_glBindMaterialParameterEXT +GLAD_API_CALL PFNGLBINDMULTITEXTUREEXTPROC glad_glBindMultiTextureEXT; +#define glBindMultiTextureEXT glad_glBindMultiTextureEXT +GLAD_API_CALL PFNGLBINDPARAMETEREXTPROC glad_glBindParameterEXT; +#define glBindParameterEXT glad_glBindParameterEXT +GLAD_API_CALL PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB; +#define glBindProgramARB glad_glBindProgramARB +GLAD_API_CALL PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV; +#define glBindProgramNV glad_glBindProgramNV +GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; +#define glBindProgramPipeline glad_glBindProgramPipeline +GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT; +#define glBindRenderbufferEXT glad_glBindRenderbufferEXT +GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +GLAD_API_CALL PFNGLBINDSAMPLERSPROC glad_glBindSamplers; +#define glBindSamplers glad_glBindSamplers +GLAD_API_CALL PFNGLBINDSHADINGRATEIMAGENVPROC glad_glBindShadingRateImageNV; +#define glBindShadingRateImageNV glad_glBindShadingRateImageNV +GLAD_API_CALL PFNGLBINDTEXGENPARAMETEREXTPROC glad_glBindTexGenParameterEXT; +#define glBindTexGenParameterEXT glad_glBindTexGenParameterEXT +GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT; +#define glBindTextureEXT glad_glBindTextureEXT +GLAD_API_CALL PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit; +#define glBindTextureUnit glad_glBindTextureUnit +GLAD_API_CALL PFNGLBINDTEXTUREUNITPARAMETEREXTPROC glad_glBindTextureUnitParameterEXT; +#define glBindTextureUnitParameterEXT glad_glBindTextureUnitParameterEXT +GLAD_API_CALL PFNGLBINDTEXTURESPROC glad_glBindTextures; +#define glBindTextures glad_glBindTextures +GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; +#define glBindTransformFeedback glad_glBindTransformFeedback +GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKNVPROC glad_glBindTransformFeedbackNV; +#define glBindTransformFeedbackNV glad_glBindTransformFeedbackNV +GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +GLAD_API_CALL PFNGLBINDVERTEXARRAYAPPLEPROC glad_glBindVertexArrayAPPLE; +#define glBindVertexArrayAPPLE glad_glBindVertexArrayAPPLE +GLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; +#define glBindVertexBuffer glad_glBindVertexBuffer +GLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers; +#define glBindVertexBuffers glad_glBindVertexBuffers +GLAD_API_CALL PFNGLBINDVERTEXSHADEREXTPROC glad_glBindVertexShaderEXT; +#define glBindVertexShaderEXT glad_glBindVertexShaderEXT +GLAD_API_CALL PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC glad_glBindVideoCaptureStreamBufferNV; +#define glBindVideoCaptureStreamBufferNV glad_glBindVideoCaptureStreamBufferNV +GLAD_API_CALL PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC glad_glBindVideoCaptureStreamTextureNV; +#define glBindVideoCaptureStreamTextureNV glad_glBindVideoCaptureStreamTextureNV +GLAD_API_CALL PFNGLBINORMAL3BEXTPROC glad_glBinormal3bEXT; +#define glBinormal3bEXT glad_glBinormal3bEXT +GLAD_API_CALL PFNGLBINORMAL3BVEXTPROC glad_glBinormal3bvEXT; +#define glBinormal3bvEXT glad_glBinormal3bvEXT +GLAD_API_CALL PFNGLBINORMAL3DEXTPROC glad_glBinormal3dEXT; +#define glBinormal3dEXT glad_glBinormal3dEXT +GLAD_API_CALL PFNGLBINORMAL3DVEXTPROC glad_glBinormal3dvEXT; +#define glBinormal3dvEXT glad_glBinormal3dvEXT +GLAD_API_CALL PFNGLBINORMAL3FEXTPROC glad_glBinormal3fEXT; +#define glBinormal3fEXT glad_glBinormal3fEXT +GLAD_API_CALL PFNGLBINORMAL3FVEXTPROC glad_glBinormal3fvEXT; +#define glBinormal3fvEXT glad_glBinormal3fvEXT +GLAD_API_CALL PFNGLBINORMAL3IEXTPROC glad_glBinormal3iEXT; +#define glBinormal3iEXT glad_glBinormal3iEXT +GLAD_API_CALL PFNGLBINORMAL3IVEXTPROC glad_glBinormal3ivEXT; +#define glBinormal3ivEXT glad_glBinormal3ivEXT +GLAD_API_CALL PFNGLBINORMAL3SEXTPROC glad_glBinormal3sEXT; +#define glBinormal3sEXT glad_glBinormal3sEXT +GLAD_API_CALL PFNGLBINORMAL3SVEXTPROC glad_glBinormal3svEXT; +#define glBinormal3svEXT glad_glBinormal3svEXT +GLAD_API_CALL PFNGLBINORMALPOINTEREXTPROC glad_glBinormalPointerEXT; +#define glBinormalPointerEXT glad_glBinormalPointerEXT +GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap; +#define glBitmap glad_glBitmap +GLAD_API_CALL PFNGLBITMAPXOESPROC glad_glBitmapxOES; +#define glBitmapxOES glad_glBitmapxOES +GLAD_API_CALL PFNGLBLENDBARRIERKHRPROC glad_glBlendBarrierKHR; +#define glBlendBarrierKHR glad_glBlendBarrierKHR +GLAD_API_CALL PFNGLBLENDBARRIERNVPROC glad_glBlendBarrierNV; +#define glBlendBarrierNV glad_glBlendBarrierNV +GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +GLAD_API_CALL PFNGLBLENDCOLOREXTPROC glad_glBlendColorEXT; +#define glBlendColorEXT glad_glBlendColorEXT +GLAD_API_CALL PFNGLBLENDCOLORXOESPROC glad_glBlendColorxOES; +#define glBlendColorxOES glad_glBlendColorxOES +GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT; +#define glBlendEquationEXT glad_glBlendEquationEXT +GLAD_API_CALL PFNGLBLENDEQUATIONINDEXEDAMDPROC glad_glBlendEquationIndexedAMD; +#define glBlendEquationIndexedAMD glad_glBlendEquationIndexedAMD +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT; +#define glBlendEquationSeparateEXT glad_glBlendEquationSeparateEXT +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC glad_glBlendEquationSeparateIndexedAMD; +#define glBlendEquationSeparateIndexedAMD glad_glBlendEquationSeparateIndexedAMD +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei; +#define glBlendEquationSeparatei glad_glBlendEquationSeparatei +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIARBPROC glad_glBlendEquationSeparateiARB; +#define glBlendEquationSeparateiARB glad_glBlendEquationSeparateiARB +GLAD_API_CALL PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi; +#define glBlendEquationi glad_glBlendEquationi +GLAD_API_CALL PFNGLBLENDEQUATIONIARBPROC glad_glBlendEquationiARB; +#define glBlendEquationiARB glad_glBlendEquationiARB +GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +GLAD_API_CALL PFNGLBLENDFUNCINDEXEDAMDPROC glad_glBlendFuncIndexedAMD; +#define glBlendFuncIndexedAMD glad_glBlendFuncIndexedAMD +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT; +#define glBlendFuncSeparateEXT glad_glBlendFuncSeparateEXT +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR; +#define glBlendFuncSeparateINGR glad_glBlendFuncSeparateINGR +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC glad_glBlendFuncSeparateIndexedAMD; +#define glBlendFuncSeparateIndexedAMD glad_glBlendFuncSeparateIndexedAMD +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei; +#define glBlendFuncSeparatei glad_glBlendFuncSeparatei +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIARBPROC glad_glBlendFuncSeparateiARB; +#define glBlendFuncSeparateiARB glad_glBlendFuncSeparateiARB +GLAD_API_CALL PFNGLBLENDFUNCIPROC glad_glBlendFunci; +#define glBlendFunci glad_glBlendFunci +GLAD_API_CALL PFNGLBLENDFUNCIARBPROC glad_glBlendFunciARB; +#define glBlendFunciARB glad_glBlendFunciARB +GLAD_API_CALL PFNGLBLENDPARAMETERINVPROC glad_glBlendParameteriNV; +#define glBlendParameteriNV glad_glBlendParameteriNV +GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT; +#define glBlitFramebufferEXT glad_glBlitFramebufferEXT +GLAD_API_CALL PFNGLBLITFRAMEBUFFERLAYEREXTPROC glad_glBlitFramebufferLayerEXT; +#define glBlitFramebufferLayerEXT glad_glBlitFramebufferLayerEXT +GLAD_API_CALL PFNGLBLITFRAMEBUFFERLAYERSEXTPROC glad_glBlitFramebufferLayersEXT; +#define glBlitFramebufferLayersEXT glad_glBlitFramebufferLayersEXT +GLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer; +#define glBlitNamedFramebuffer glad_glBlitNamedFramebuffer +GLAD_API_CALL PFNGLBUFFERADDRESSRANGENVPROC glad_glBufferAddressRangeNV; +#define glBufferAddressRangeNV glad_glBufferAddressRangeNV +GLAD_API_CALL PFNGLBUFFERATTACHMEMORYNVPROC glad_glBufferAttachMemoryNV; +#define glBufferAttachMemoryNV glad_glBufferAttachMemoryNV +GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +GLAD_API_CALL PFNGLBUFFERDATAARBPROC glad_glBufferDataARB; +#define glBufferDataARB glad_glBufferDataARB +GLAD_API_CALL PFNGLBUFFERPAGECOMMITMENTARBPROC glad_glBufferPageCommitmentARB; +#define glBufferPageCommitmentARB glad_glBufferPageCommitmentARB +GLAD_API_CALL PFNGLBUFFERPAGECOMMITMENTMEMNVPROC glad_glBufferPageCommitmentMemNV; +#define glBufferPageCommitmentMemNV glad_glBufferPageCommitmentMemNV +GLAD_API_CALL PFNGLBUFFERPARAMETERIAPPLEPROC glad_glBufferParameteriAPPLE; +#define glBufferParameteriAPPLE glad_glBufferParameteriAPPLE +GLAD_API_CALL PFNGLBUFFERSTORAGEPROC glad_glBufferStorage; +#define glBufferStorage glad_glBufferStorage +GLAD_API_CALL PFNGLBUFFERSTORAGEEXTERNALEXTPROC glad_glBufferStorageExternalEXT; +#define glBufferStorageExternalEXT glad_glBufferStorageExternalEXT +GLAD_API_CALL PFNGLBUFFERSTORAGEMEMEXTPROC glad_glBufferStorageMemEXT; +#define glBufferStorageMemEXT glad_glBufferStorageMemEXT +GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB; +#define glBufferSubDataARB glad_glBufferSubDataARB +GLAD_API_CALL PFNGLCALLCOMMANDLISTNVPROC glad_glCallCommandListNV; +#define glCallCommandListNV glad_glCallCommandListNV +GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList; +#define glCallList glad_glCallList +GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists; +#define glCallLists glad_glCallLists +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT; +#define glCheckFramebufferStatusEXT glad_glCheckFramebufferStatusEXT +GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus; +#define glCheckNamedFramebufferStatus glad_glCheckNamedFramebufferStatus +GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC glad_glCheckNamedFramebufferStatusEXT; +#define glCheckNamedFramebufferStatusEXT glad_glCheckNamedFramebufferStatusEXT +GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +GLAD_API_CALL PFNGLCLAMPCOLORARBPROC glad_glClampColorARB; +#define glClampColorARB glad_glClampColorARB +GLAD_API_CALL PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum; +#define glClearAccum glad_glClearAccum +GLAD_API_CALL PFNGLCLEARACCUMXOESPROC glad_glClearAccumxOES; +#define glClearAccumxOES glad_glClearAccumxOES +GLAD_API_CALL PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData; +#define glClearBufferData glad_glClearBufferData +GLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData; +#define glClearBufferSubData glad_glClearBufferSubData +GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +GLAD_API_CALL PFNGLCLEARCOLORIIEXTPROC glad_glClearColorIiEXT; +#define glClearColorIiEXT glad_glClearColorIiEXT +GLAD_API_CALL PFNGLCLEARCOLORIUIEXTPROC glad_glClearColorIuiEXT; +#define glClearColorIuiEXT glad_glClearColorIuiEXT +GLAD_API_CALL PFNGLCLEARCOLORXOESPROC glad_glClearColorxOES; +#define glClearColorxOES glad_glClearColorxOES +GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +GLAD_API_CALL PFNGLCLEARDEPTHDNVPROC glad_glClearDepthdNV; +#define glClearDepthdNV glad_glClearDepthdNV +GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf; +#define glClearDepthf glad_glClearDepthf +GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES; +#define glClearDepthfOES glad_glClearDepthfOES +GLAD_API_CALL PFNGLCLEARDEPTHXOESPROC glad_glClearDepthxOES; +#define glClearDepthxOES glad_glClearDepthxOES +GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex; +#define glClearIndex glad_glClearIndex +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData; +#define glClearNamedBufferData glad_glClearNamedBufferData +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAEXTPROC glad_glClearNamedBufferDataEXT; +#define glClearNamedBufferDataEXT glad_glClearNamedBufferDataEXT +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData; +#define glClearNamedBufferSubData glad_glClearNamedBufferSubData +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glad_glClearNamedBufferSubDataEXT; +#define glClearNamedBufferSubDataEXT glad_glClearNamedBufferSubDataEXT +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi; +#define glClearNamedFramebufferfi glad_glClearNamedFramebufferfi +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv; +#define glClearNamedFramebufferfv glad_glClearNamedFramebufferfv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv; +#define glClearNamedFramebufferiv glad_glClearNamedFramebufferiv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv; +#define glClearNamedFramebufferuiv glad_glClearNamedFramebufferuiv +GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +GLAD_API_CALL PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage; +#define glClearTexImage glad_glClearTexImage +GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage; +#define glClearTexSubImage glad_glClearTexSubImage +GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture; +#define glClientActiveTexture glad_glClientActiveTexture +GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB; +#define glClientActiveTextureARB glad_glClientActiveTextureARB +GLAD_API_CALL PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC glad_glClientActiveVertexStreamATI; +#define glClientActiveVertexStreamATI glad_glClientActiveVertexStreamATI +GLAD_API_CALL PFNGLCLIENTATTRIBDEFAULTEXTPROC glad_glClientAttribDefaultEXT; +#define glClientAttribDefaultEXT glad_glClientAttribDefaultEXT +GLAD_API_CALL PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC glad_glClientWaitSemaphoreui64NVX; +#define glClientWaitSemaphoreui64NVX glad_glClientWaitSemaphoreui64NVX +GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +GLAD_API_CALL PFNGLCLIPCONTROLPROC glad_glClipControl; +#define glClipControl glad_glClipControl +GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane; +#define glClipPlane glad_glClipPlane +GLAD_API_CALL PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES; +#define glClipPlanefOES glad_glClipPlanefOES +GLAD_API_CALL PFNGLCLIPPLANEXOESPROC glad_glClipPlanexOES; +#define glClipPlanexOES glad_glClipPlanexOES +GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b; +#define glColor3b glad_glColor3b +GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv; +#define glColor3bv glad_glColor3bv +GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d; +#define glColor3d glad_glColor3d +GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv; +#define glColor3dv glad_glColor3dv +GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f; +#define glColor3f glad_glColor3f +GLAD_API_CALL PFNGLCOLOR3FVERTEX3FSUNPROC glad_glColor3fVertex3fSUN; +#define glColor3fVertex3fSUN glad_glColor3fVertex3fSUN +GLAD_API_CALL PFNGLCOLOR3FVERTEX3FVSUNPROC glad_glColor3fVertex3fvSUN; +#define glColor3fVertex3fvSUN glad_glColor3fVertex3fvSUN +GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv; +#define glColor3fv glad_glColor3fv +GLAD_API_CALL PFNGLCOLOR3HNVPROC glad_glColor3hNV; +#define glColor3hNV glad_glColor3hNV +GLAD_API_CALL PFNGLCOLOR3HVNVPROC glad_glColor3hvNV; +#define glColor3hvNV glad_glColor3hvNV +GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i; +#define glColor3i glad_glColor3i +GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv; +#define glColor3iv glad_glColor3iv +GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s; +#define glColor3s glad_glColor3s +GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv; +#define glColor3sv glad_glColor3sv +GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub; +#define glColor3ub glad_glColor3ub +GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv; +#define glColor3ubv glad_glColor3ubv +GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui; +#define glColor3ui glad_glColor3ui +GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv; +#define glColor3uiv glad_glColor3uiv +GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us; +#define glColor3us glad_glColor3us +GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv; +#define glColor3usv glad_glColor3usv +GLAD_API_CALL PFNGLCOLOR3XOESPROC glad_glColor3xOES; +#define glColor3xOES glad_glColor3xOES +GLAD_API_CALL PFNGLCOLOR3XVOESPROC glad_glColor3xvOES; +#define glColor3xvOES glad_glColor3xvOES +GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b; +#define glColor4b glad_glColor4b +GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv; +#define glColor4bv glad_glColor4bv +GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d; +#define glColor4d glad_glColor4d +GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv; +#define glColor4dv glad_glColor4dv +GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f; +#define glColor4f glad_glColor4f +GLAD_API_CALL PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glColor4fNormal3fVertex3fSUN; +#define glColor4fNormal3fVertex3fSUN glad_glColor4fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glColor4fNormal3fVertex3fvSUN; +#define glColor4fNormal3fVertex3fvSUN glad_glColor4fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv; +#define glColor4fv glad_glColor4fv +GLAD_API_CALL PFNGLCOLOR4HNVPROC glad_glColor4hNV; +#define glColor4hNV glad_glColor4hNV +GLAD_API_CALL PFNGLCOLOR4HVNVPROC glad_glColor4hvNV; +#define glColor4hvNV glad_glColor4hvNV +GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i; +#define glColor4i glad_glColor4i +GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv; +#define glColor4iv glad_glColor4iv +GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s; +#define glColor4s glad_glColor4s +GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv; +#define glColor4sv glad_glColor4sv +GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub; +#define glColor4ub glad_glColor4ub +GLAD_API_CALL PFNGLCOLOR4UBVERTEX2FSUNPROC glad_glColor4ubVertex2fSUN; +#define glColor4ubVertex2fSUN glad_glColor4ubVertex2fSUN +GLAD_API_CALL PFNGLCOLOR4UBVERTEX2FVSUNPROC glad_glColor4ubVertex2fvSUN; +#define glColor4ubVertex2fvSUN glad_glColor4ubVertex2fvSUN +GLAD_API_CALL PFNGLCOLOR4UBVERTEX3FSUNPROC glad_glColor4ubVertex3fSUN; +#define glColor4ubVertex3fSUN glad_glColor4ubVertex3fSUN +GLAD_API_CALL PFNGLCOLOR4UBVERTEX3FVSUNPROC glad_glColor4ubVertex3fvSUN; +#define glColor4ubVertex3fvSUN glad_glColor4ubVertex3fvSUN +GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv; +#define glColor4ubv glad_glColor4ubv +GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui; +#define glColor4ui glad_glColor4ui +GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv; +#define glColor4uiv glad_glColor4uiv +GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us; +#define glColor4us glad_glColor4us +GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv; +#define glColor4usv glad_glColor4usv +GLAD_API_CALL PFNGLCOLOR4XOESPROC glad_glColor4xOES; +#define glColor4xOES glad_glColor4xOES +GLAD_API_CALL PFNGLCOLOR4XVOESPROC glad_glColor4xvOES; +#define glColor4xvOES glad_glColor4xvOES +GLAD_API_CALL PFNGLCOLORFORMATNVPROC glad_glColorFormatNV; +#define glColorFormatNV glad_glColorFormatNV +GLAD_API_CALL PFNGLCOLORFRAGMENTOP1ATIPROC glad_glColorFragmentOp1ATI; +#define glColorFragmentOp1ATI glad_glColorFragmentOp1ATI +GLAD_API_CALL PFNGLCOLORFRAGMENTOP2ATIPROC glad_glColorFragmentOp2ATI; +#define glColorFragmentOp2ATI glad_glColorFragmentOp2ATI +GLAD_API_CALL PFNGLCOLORFRAGMENTOP3ATIPROC glad_glColorFragmentOp3ATI; +#define glColorFragmentOp3ATI glad_glColorFragmentOp3ATI +GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +GLAD_API_CALL PFNGLCOLORMASKINDEXEDEXTPROC glad_glColorMaskIndexedEXT; +#define glColorMaskIndexedEXT glad_glColorMaskIndexedEXT +GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial; +#define glColorMaterial glad_glColorMaterial +GLAD_API_CALL PFNGLCOLORP3UIPROC glad_glColorP3ui; +#define glColorP3ui glad_glColorP3ui +GLAD_API_CALL PFNGLCOLORP3UIVPROC glad_glColorP3uiv; +#define glColorP3uiv glad_glColorP3uiv +GLAD_API_CALL PFNGLCOLORP4UIPROC glad_glColorP4ui; +#define glColorP4ui glad_glColorP4ui +GLAD_API_CALL PFNGLCOLORP4UIVPROC glad_glColorP4uiv; +#define glColorP4uiv glad_glColorP4uiv +GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer; +#define glColorPointer glad_glColorPointer +GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT; +#define glColorPointerEXT glad_glColorPointerEXT +GLAD_API_CALL PFNGLCOLORPOINTERLISTIBMPROC glad_glColorPointerListIBM; +#define glColorPointerListIBM glad_glColorPointerListIBM +GLAD_API_CALL PFNGLCOLORPOINTERVINTELPROC glad_glColorPointervINTEL; +#define glColorPointervINTEL glad_glColorPointervINTEL +GLAD_API_CALL PFNGLCOLORSUBTABLEPROC glad_glColorSubTable; +#define glColorSubTable glad_glColorSubTable +GLAD_API_CALL PFNGLCOLORSUBTABLEEXTPROC glad_glColorSubTableEXT; +#define glColorSubTableEXT glad_glColorSubTableEXT +GLAD_API_CALL PFNGLCOLORTABLEPROC glad_glColorTable; +#define glColorTable glad_glColorTable +GLAD_API_CALL PFNGLCOLORTABLEEXTPROC glad_glColorTableEXT; +#define glColorTableEXT glad_glColorTableEXT +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv; +#define glColorTableParameterfv glad_glColorTableParameterfv +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVSGIPROC glad_glColorTableParameterfvSGI; +#define glColorTableParameterfvSGI glad_glColorTableParameterfvSGI +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv; +#define glColorTableParameteriv glad_glColorTableParameteriv +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVSGIPROC glad_glColorTableParameterivSGI; +#define glColorTableParameterivSGI glad_glColorTableParameterivSGI +GLAD_API_CALL PFNGLCOLORTABLESGIPROC glad_glColorTableSGI; +#define glColorTableSGI glad_glColorTableSGI +GLAD_API_CALL PFNGLCOMBINERINPUTNVPROC glad_glCombinerInputNV; +#define glCombinerInputNV glad_glCombinerInputNV +GLAD_API_CALL PFNGLCOMBINEROUTPUTNVPROC glad_glCombinerOutputNV; +#define glCombinerOutputNV glad_glCombinerOutputNV +GLAD_API_CALL PFNGLCOMBINERPARAMETERFNVPROC glad_glCombinerParameterfNV; +#define glCombinerParameterfNV glad_glCombinerParameterfNV +GLAD_API_CALL PFNGLCOMBINERPARAMETERFVNVPROC glad_glCombinerParameterfvNV; +#define glCombinerParameterfvNV glad_glCombinerParameterfvNV +GLAD_API_CALL PFNGLCOMBINERPARAMETERINVPROC glad_glCombinerParameteriNV; +#define glCombinerParameteriNV glad_glCombinerParameteriNV +GLAD_API_CALL PFNGLCOMBINERPARAMETERIVNVPROC glad_glCombinerParameterivNV; +#define glCombinerParameterivNV glad_glCombinerParameterivNV +GLAD_API_CALL PFNGLCOMBINERSTAGEPARAMETERFVNVPROC glad_glCombinerStageParameterfvNV; +#define glCombinerStageParameterfvNV glad_glCombinerStageParameterfvNV +GLAD_API_CALL PFNGLCOMMANDLISTSEGMENTSNVPROC glad_glCommandListSegmentsNV; +#define glCommandListSegmentsNV glad_glCommandListSegmentsNV +GLAD_API_CALL PFNGLCOMPILECOMMANDLISTNVPROC glad_glCompileCommandListNV; +#define glCompileCommandListNV glad_glCompileCommandListNV +GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +GLAD_API_CALL PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB; +#define glCompileShaderARB glad_glCompileShaderARB +GLAD_API_CALL PFNGLCOMPILESHADERINCLUDEARBPROC glad_glCompileShaderIncludeARB; +#define glCompileShaderIncludeARB glad_glCompileShaderIncludeARB +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC glad_glCompressedMultiTexImage1DEXT; +#define glCompressedMultiTexImage1DEXT glad_glCompressedMultiTexImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC glad_glCompressedMultiTexImage2DEXT; +#define glCompressedMultiTexImage2DEXT glad_glCompressedMultiTexImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC glad_glCompressedMultiTexImage3DEXT; +#define glCompressedMultiTexImage3DEXT glad_glCompressedMultiTexImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC glad_glCompressedMultiTexSubImage1DEXT; +#define glCompressedMultiTexSubImage1DEXT glad_glCompressedMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC glad_glCompressedMultiTexSubImage2DEXT; +#define glCompressedMultiTexSubImage2DEXT glad_glCompressedMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC glad_glCompressedMultiTexSubImage3DEXT; +#define glCompressedMultiTexSubImage3DEXT glad_glCompressedMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glad_glCompressedTexImage1DARB; +#define glCompressedTexImage1DARB glad_glCompressedTexImage1DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glad_glCompressedTexImage2DARB; +#define glCompressedTexImage2DARB glad_glCompressedTexImage2DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DARBPROC glad_glCompressedTexImage3DARB; +#define glCompressedTexImage3DARB glad_glCompressedTexImage3DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC glad_glCompressedTexSubImage1DARB; +#define glCompressedTexSubImage1DARB glad_glCompressedTexSubImage1DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC glad_glCompressedTexSubImage2DARB; +#define glCompressedTexSubImage2DARB glad_glCompressedTexSubImage2DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC glad_glCompressedTexSubImage3DARB; +#define glCompressedTexSubImage3DARB glad_glCompressedTexSubImage3DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC glad_glCompressedTextureImage1DEXT; +#define glCompressedTextureImage1DEXT glad_glCompressedTextureImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC glad_glCompressedTextureImage2DEXT; +#define glCompressedTextureImage2DEXT glad_glCompressedTextureImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC glad_glCompressedTextureImage3DEXT; +#define glCompressedTextureImage3DEXT glad_glCompressedTextureImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D; +#define glCompressedTextureSubImage1D glad_glCompressedTextureSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC glad_glCompressedTextureSubImage1DEXT; +#define glCompressedTextureSubImage1DEXT glad_glCompressedTextureSubImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D; +#define glCompressedTextureSubImage2D glad_glCompressedTextureSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC glad_glCompressedTextureSubImage2DEXT; +#define glCompressedTextureSubImage2DEXT glad_glCompressedTextureSubImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D; +#define glCompressedTextureSubImage3D glad_glCompressedTextureSubImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC glad_glCompressedTextureSubImage3DEXT; +#define glCompressedTextureSubImage3DEXT glad_glCompressedTextureSubImage3DEXT +GLAD_API_CALL PFNGLCONSERVATIVERASTERPARAMETERFNVPROC glad_glConservativeRasterParameterfNV; +#define glConservativeRasterParameterfNV glad_glConservativeRasterParameterfNV +GLAD_API_CALL PFNGLCONSERVATIVERASTERPARAMETERINVPROC glad_glConservativeRasterParameteriNV; +#define glConservativeRasterParameteriNV glad_glConservativeRasterParameteriNV +GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D; +#define glConvolutionFilter1D glad_glConvolutionFilter1D +GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DEXTPROC glad_glConvolutionFilter1DEXT; +#define glConvolutionFilter1DEXT glad_glConvolutionFilter1DEXT +GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D; +#define glConvolutionFilter2D glad_glConvolutionFilter2D +GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DEXTPROC glad_glConvolutionFilter2DEXT; +#define glConvolutionFilter2DEXT glad_glConvolutionFilter2DEXT +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf; +#define glConvolutionParameterf glad_glConvolutionParameterf +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFEXTPROC glad_glConvolutionParameterfEXT; +#define glConvolutionParameterfEXT glad_glConvolutionParameterfEXT +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv; +#define glConvolutionParameterfv glad_glConvolutionParameterfv +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVEXTPROC glad_glConvolutionParameterfvEXT; +#define glConvolutionParameterfvEXT glad_glConvolutionParameterfvEXT +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri; +#define glConvolutionParameteri glad_glConvolutionParameteri +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIEXTPROC glad_glConvolutionParameteriEXT; +#define glConvolutionParameteriEXT glad_glConvolutionParameteriEXT +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv; +#define glConvolutionParameteriv glad_glConvolutionParameteriv +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVEXTPROC glad_glConvolutionParameterivEXT; +#define glConvolutionParameterivEXT glad_glConvolutionParameterivEXT +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERXOESPROC glad_glConvolutionParameterxOES; +#define glConvolutionParameterxOES glad_glConvolutionParameterxOES +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERXVOESPROC glad_glConvolutionParameterxvOES; +#define glConvolutionParameterxvOES glad_glConvolutionParameterxvOES +GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable; +#define glCopyColorSubTable glad_glCopyColorSubTable +GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEEXTPROC glad_glCopyColorSubTableEXT; +#define glCopyColorSubTableEXT glad_glCopyColorSubTableEXT +GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable; +#define glCopyColorTable glad_glCopyColorTable +GLAD_API_CALL PFNGLCOPYCOLORTABLESGIPROC glad_glCopyColorTableSGI; +#define glCopyColorTableSGI glad_glCopyColorTableSGI +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D; +#define glCopyConvolutionFilter1D glad_glCopyConvolutionFilter1D +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC glad_glCopyConvolutionFilter1DEXT; +#define glCopyConvolutionFilter1DEXT glad_glCopyConvolutionFilter1DEXT +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D; +#define glCopyConvolutionFilter2D glad_glCopyConvolutionFilter2D +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC glad_glCopyConvolutionFilter2DEXT; +#define glCopyConvolutionFilter2DEXT glad_glCopyConvolutionFilter2DEXT +GLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData; +#define glCopyImageSubData glad_glCopyImageSubData +GLAD_API_CALL PFNGLCOPYIMAGESUBDATANVPROC glad_glCopyImageSubDataNV; +#define glCopyImageSubDataNV glad_glCopyImageSubDataNV +GLAD_API_CALL PFNGLCOPYMULTITEXIMAGE1DEXTPROC glad_glCopyMultiTexImage1DEXT; +#define glCopyMultiTexImage1DEXT glad_glCopyMultiTexImage1DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXIMAGE2DEXTPROC glad_glCopyMultiTexImage2DEXT; +#define glCopyMultiTexImage2DEXT glad_glCopyMultiTexImage2DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC glad_glCopyMultiTexSubImage1DEXT; +#define glCopyMultiTexSubImage1DEXT glad_glCopyMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC glad_glCopyMultiTexSubImage2DEXT; +#define glCopyMultiTexSubImage2DEXT glad_glCopyMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC glad_glCopyMultiTexSubImage3DEXT; +#define glCopyMultiTexSubImage3DEXT glad_glCopyMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData; +#define glCopyNamedBufferSubData glad_glCopyNamedBufferSubData +GLAD_API_CALL PFNGLCOPYPATHNVPROC glad_glCopyPathNV; +#define glCopyPathNV glad_glCopyPathNV +GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels; +#define glCopyPixels glad_glCopyPixels +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT; +#define glCopyTexImage1DEXT glad_glCopyTexImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT; +#define glCopyTexImage2DEXT glad_glCopyTexImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT; +#define glCopyTexSubImage1DEXT glad_glCopyTexSubImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT; +#define glCopyTexSubImage2DEXT glad_glCopyTexSubImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT; +#define glCopyTexSubImage3DEXT glad_glCopyTexSubImage3DEXT +GLAD_API_CALL PFNGLCOPYTEXTUREIMAGE1DEXTPROC glad_glCopyTextureImage1DEXT; +#define glCopyTextureImage1DEXT glad_glCopyTextureImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXTUREIMAGE2DEXTPROC glad_glCopyTextureImage2DEXT; +#define glCopyTextureImage2DEXT glad_glCopyTextureImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D; +#define glCopyTextureSubImage1D glad_glCopyTextureSubImage1D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC glad_glCopyTextureSubImage1DEXT; +#define glCopyTextureSubImage1DEXT glad_glCopyTextureSubImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D; +#define glCopyTextureSubImage2D glad_glCopyTextureSubImage2D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC glad_glCopyTextureSubImage2DEXT; +#define glCopyTextureSubImage2DEXT glad_glCopyTextureSubImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D; +#define glCopyTextureSubImage3D glad_glCopyTextureSubImage3D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC glad_glCopyTextureSubImage3DEXT; +#define glCopyTextureSubImage3DEXT glad_glCopyTextureSubImage3DEXT +GLAD_API_CALL PFNGLCOVERFILLPATHINSTANCEDNVPROC glad_glCoverFillPathInstancedNV; +#define glCoverFillPathInstancedNV glad_glCoverFillPathInstancedNV +GLAD_API_CALL PFNGLCOVERFILLPATHNVPROC glad_glCoverFillPathNV; +#define glCoverFillPathNV glad_glCoverFillPathNV +GLAD_API_CALL PFNGLCOVERSTROKEPATHINSTANCEDNVPROC glad_glCoverStrokePathInstancedNV; +#define glCoverStrokePathInstancedNV glad_glCoverStrokePathInstancedNV +GLAD_API_CALL PFNGLCOVERSTROKEPATHNVPROC glad_glCoverStrokePathNV; +#define glCoverStrokePathNV glad_glCoverStrokePathNV +GLAD_API_CALL PFNGLCOVERAGEMODULATIONNVPROC glad_glCoverageModulationNV; +#define glCoverageModulationNV glad_glCoverageModulationNV +GLAD_API_CALL PFNGLCOVERAGEMODULATIONTABLENVPROC glad_glCoverageModulationTableNV; +#define glCoverageModulationTableNV glad_glCoverageModulationTableNV +GLAD_API_CALL PFNGLCREATEBUFFERSPROC glad_glCreateBuffers; +#define glCreateBuffers glad_glCreateBuffers +GLAD_API_CALL PFNGLCREATECOMMANDLISTSNVPROC glad_glCreateCommandListsNV; +#define glCreateCommandListsNV glad_glCreateCommandListsNV +GLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers; +#define glCreateFramebuffers glad_glCreateFramebuffers +GLAD_API_CALL PFNGLCREATEMEMORYOBJECTSEXTPROC glad_glCreateMemoryObjectsEXT; +#define glCreateMemoryObjectsEXT glad_glCreateMemoryObjectsEXT +GLAD_API_CALL PFNGLCREATEPERFQUERYINTELPROC glad_glCreatePerfQueryINTEL; +#define glCreatePerfQueryINTEL glad_glCreatePerfQueryINTEL +GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB; +#define glCreateProgramObjectARB glad_glCreateProgramObjectARB +GLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines; +#define glCreateProgramPipelines glad_glCreateProgramPipelines +GLAD_API_CALL PFNGLCREATEPROGRESSFENCENVXPROC glad_glCreateProgressFenceNVX; +#define glCreateProgressFenceNVX glad_glCreateProgressFenceNVX +GLAD_API_CALL PFNGLCREATEQUERIESPROC glad_glCreateQueries; +#define glCreateQueries glad_glCreateQueries +GLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers; +#define glCreateRenderbuffers glad_glCreateRenderbuffers +GLAD_API_CALL PFNGLCREATESAMPLERSPROC glad_glCreateSamplers; +#define glCreateSamplers glad_glCreateSamplers +GLAD_API_CALL PFNGLCREATESEMAPHORESNVPROC glad_glCreateSemaphoresNV; +#define glCreateSemaphoresNV glad_glCreateSemaphoresNV +GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB; +#define glCreateShaderObjectARB glad_glCreateShaderObjectARB +GLAD_API_CALL PFNGLCREATESHADERPROGRAMEXTPROC glad_glCreateShaderProgramEXT; +#define glCreateShaderProgramEXT glad_glCreateShaderProgramEXT +GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; +#define glCreateShaderProgramv glad_glCreateShaderProgramv +GLAD_API_CALL PFNGLCREATESTATESNVPROC glad_glCreateStatesNV; +#define glCreateStatesNV glad_glCreateStatesNV +GLAD_API_CALL PFNGLCREATESYNCFROMCLEVENTARBPROC glad_glCreateSyncFromCLeventARB; +#define glCreateSyncFromCLeventARB glad_glCreateSyncFromCLeventARB +GLAD_API_CALL PFNGLCREATETEXTURESPROC glad_glCreateTextures; +#define glCreateTextures glad_glCreateTextures +GLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks; +#define glCreateTransformFeedbacks glad_glCreateTransformFeedbacks +GLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays; +#define glCreateVertexArrays glad_glCreateVertexArrays +GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +GLAD_API_CALL PFNGLCULLPARAMETERDVEXTPROC glad_glCullParameterdvEXT; +#define glCullParameterdvEXT glad_glCullParameterdvEXT +GLAD_API_CALL PFNGLCULLPARAMETERFVEXTPROC glad_glCullParameterfvEXT; +#define glCullParameterfvEXT glad_glCullParameterfvEXT +GLAD_API_CALL PFNGLCURRENTPALETTEMATRIXARBPROC glad_glCurrentPaletteMatrixARB; +#define glCurrentPaletteMatrixARB glad_glCurrentPaletteMatrixARB +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; +#define glDebugMessageCallback glad_glDebugMessageCallback +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKAMDPROC glad_glDebugMessageCallbackAMD; +#define glDebugMessageCallbackAMD glad_glDebugMessageCallbackAMD +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKARBPROC glad_glDebugMessageCallbackARB; +#define glDebugMessageCallbackARB glad_glDebugMessageCallbackARB +GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; +#define glDebugMessageControl glad_glDebugMessageControl +GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLARBPROC glad_glDebugMessageControlARB; +#define glDebugMessageControlARB glad_glDebugMessageControlARB +GLAD_API_CALL PFNGLDEBUGMESSAGEENABLEAMDPROC glad_glDebugMessageEnableAMD; +#define glDebugMessageEnableAMD glad_glDebugMessageEnableAMD +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; +#define glDebugMessageInsert glad_glDebugMessageInsert +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTAMDPROC glad_glDebugMessageInsertAMD; +#define glDebugMessageInsertAMD glad_glDebugMessageInsertAMD +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTARBPROC glad_glDebugMessageInsertARB; +#define glDebugMessageInsertARB glad_glDebugMessageInsertARB +GLAD_API_CALL PFNGLDEFORMSGIXPROC glad_glDeformSGIX; +#define glDeformSGIX glad_glDeformSGIX +GLAD_API_CALL PFNGLDEFORMATIONMAP3DSGIXPROC glad_glDeformationMap3dSGIX; +#define glDeformationMap3dSGIX glad_glDeformationMap3dSGIX +GLAD_API_CALL PFNGLDEFORMATIONMAP3FSGIXPROC glad_glDeformationMap3fSGIX; +#define glDeformationMap3fSGIX glad_glDeformationMap3fSGIX +GLAD_API_CALL PFNGLDELETEASYNCMARKERSSGIXPROC glad_glDeleteAsyncMarkersSGIX; +#define glDeleteAsyncMarkersSGIX glad_glDeleteAsyncMarkersSGIX +GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB; +#define glDeleteBuffersARB glad_glDeleteBuffersARB +GLAD_API_CALL PFNGLDELETECOMMANDLISTSNVPROC glad_glDeleteCommandListsNV; +#define glDeleteCommandListsNV glad_glDeleteCommandListsNV +GLAD_API_CALL PFNGLDELETEFENCESAPPLEPROC glad_glDeleteFencesAPPLE; +#define glDeleteFencesAPPLE glad_glDeleteFencesAPPLE +GLAD_API_CALL PFNGLDELETEFENCESNVPROC glad_glDeleteFencesNV; +#define glDeleteFencesNV glad_glDeleteFencesNV +GLAD_API_CALL PFNGLDELETEFRAGMENTSHADERATIPROC glad_glDeleteFragmentShaderATI; +#define glDeleteFragmentShaderATI glad_glDeleteFragmentShaderATI +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT; +#define glDeleteFramebuffersEXT glad_glDeleteFramebuffersEXT +GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists; +#define glDeleteLists glad_glDeleteLists +GLAD_API_CALL PFNGLDELETEMEMORYOBJECTSEXTPROC glad_glDeleteMemoryObjectsEXT; +#define glDeleteMemoryObjectsEXT glad_glDeleteMemoryObjectsEXT +GLAD_API_CALL PFNGLDELETENAMEDSTRINGARBPROC glad_glDeleteNamedStringARB; +#define glDeleteNamedStringARB glad_glDeleteNamedStringARB +GLAD_API_CALL PFNGLDELETENAMESAMDPROC glad_glDeleteNamesAMD; +#define glDeleteNamesAMD glad_glDeleteNamesAMD +GLAD_API_CALL PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB; +#define glDeleteObjectARB glad_glDeleteObjectARB +GLAD_API_CALL PFNGLDELETEOCCLUSIONQUERIESNVPROC glad_glDeleteOcclusionQueriesNV; +#define glDeleteOcclusionQueriesNV glad_glDeleteOcclusionQueriesNV +GLAD_API_CALL PFNGLDELETEPATHSNVPROC glad_glDeletePathsNV; +#define glDeletePathsNV glad_glDeletePathsNV +GLAD_API_CALL PFNGLDELETEPERFMONITORSAMDPROC glad_glDeletePerfMonitorsAMD; +#define glDeletePerfMonitorsAMD glad_glDeletePerfMonitorsAMD +GLAD_API_CALL PFNGLDELETEPERFQUERYINTELPROC glad_glDeletePerfQueryINTEL; +#define glDeletePerfQueryINTEL glad_glDeletePerfQueryINTEL +GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; +#define glDeleteProgramPipelines glad_glDeleteProgramPipelines +GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB; +#define glDeleteProgramsARB glad_glDeleteProgramsARB +GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV; +#define glDeleteProgramsNV glad_glDeleteProgramsNV +GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +GLAD_API_CALL PFNGLDELETEQUERIESARBPROC glad_glDeleteQueriesARB; +#define glDeleteQueriesARB glad_glDeleteQueriesARB +GLAD_API_CALL PFNGLDELETEQUERYRESOURCETAGNVPROC glad_glDeleteQueryResourceTagNV; +#define glDeleteQueryResourceTagNV glad_glDeleteQueryResourceTagNV +GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT; +#define glDeleteRenderbuffersEXT glad_glDeleteRenderbuffersEXT +GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +GLAD_API_CALL PFNGLDELETESEMAPHORESEXTPROC glad_glDeleteSemaphoresEXT; +#define glDeleteSemaphoresEXT glad_glDeleteSemaphoresEXT +GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +GLAD_API_CALL PFNGLDELETESTATESNVPROC glad_glDeleteStatesNV; +#define glDeleteStatesNV glad_glDeleteStatesNV +GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT; +#define glDeleteTexturesEXT glad_glDeleteTexturesEXT +GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; +#define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks +GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSNVPROC glad_glDeleteTransformFeedbacksNV; +#define glDeleteTransformFeedbacksNV glad_glDeleteTransformFeedbacksNV +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSAPPLEPROC glad_glDeleteVertexArraysAPPLE; +#define glDeleteVertexArraysAPPLE glad_glDeleteVertexArraysAPPLE +GLAD_API_CALL PFNGLDELETEVERTEXSHADEREXTPROC glad_glDeleteVertexShaderEXT; +#define glDeleteVertexShaderEXT glad_glDeleteVertexShaderEXT +GLAD_API_CALL PFNGLDEPTHBOUNDSEXTPROC glad_glDepthBoundsEXT; +#define glDepthBoundsEXT glad_glDepthBoundsEXT +GLAD_API_CALL PFNGLDEPTHBOUNDSDNVPROC glad_glDepthBoundsdNV; +#define glDepthBoundsdNV glad_glDepthBoundsdNV +GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +GLAD_API_CALL PFNGLDEPTHRANGEARRAYDVNVPROC glad_glDepthRangeArraydvNV; +#define glDepthRangeArraydvNV glad_glDepthRangeArraydvNV +GLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv; +#define glDepthRangeArrayv glad_glDepthRangeArrayv +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed; +#define glDepthRangeIndexed glad_glDepthRangeIndexed +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDDNVPROC glad_glDepthRangeIndexeddNV; +#define glDepthRangeIndexeddNV glad_glDepthRangeIndexeddNV +GLAD_API_CALL PFNGLDEPTHRANGEDNVPROC glad_glDepthRangedNV; +#define glDepthRangedNV glad_glDepthRangedNV +GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef; +#define glDepthRangef glad_glDepthRangef +GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES; +#define glDepthRangefOES glad_glDepthRangefOES +GLAD_API_CALL PFNGLDEPTHRANGEXOESPROC glad_glDepthRangexOES; +#define glDepthRangexOES glad_glDepthRangexOES +GLAD_API_CALL PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB; +#define glDetachObjectARB glad_glDetachObjectARB +GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +GLAD_API_CALL PFNGLDETAILTEXFUNCSGISPROC glad_glDetailTexFuncSGIS; +#define glDetailTexFuncSGIS glad_glDetailTexFuncSGIS +GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState; +#define glDisableClientState glad_glDisableClientState +GLAD_API_CALL PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC glad_glDisableClientStateIndexedEXT; +#define glDisableClientStateIndexedEXT glad_glDisableClientStateIndexedEXT +GLAD_API_CALL PFNGLDISABLECLIENTSTATEIEXTPROC glad_glDisableClientStateiEXT; +#define glDisableClientStateiEXT glad_glDisableClientStateiEXT +GLAD_API_CALL PFNGLDISABLEINDEXEDEXTPROC glad_glDisableIndexedEXT; +#define glDisableIndexedEXT glad_glDisableIndexedEXT +GLAD_API_CALL PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC glad_glDisableVariantClientStateEXT; +#define glDisableVariantClientStateEXT glad_glDisableVariantClientStateEXT +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib; +#define glDisableVertexArrayAttrib glad_glDisableVertexArrayAttrib +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glad_glDisableVertexArrayAttribEXT; +#define glDisableVertexArrayAttribEXT glad_glDisableVertexArrayAttribEXT +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYEXTPROC glad_glDisableVertexArrayEXT; +#define glDisableVertexArrayEXT glad_glDisableVertexArrayEXT +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBAPPLEPROC glad_glDisableVertexAttribAPPLE; +#define glDisableVertexAttribAPPLE glad_glDisableVertexAttribAPPLE +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB; +#define glDisableVertexAttribArrayARB glad_glDisableVertexAttribArrayARB +GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +GLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; +#define glDispatchCompute glad_glDispatchCompute +GLAD_API_CALL PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC glad_glDispatchComputeGroupSizeARB; +#define glDispatchComputeGroupSizeARB glad_glDispatchComputeGroupSizeARB +GLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; +#define glDispatchComputeIndirect glad_glDispatchComputeIndirect +GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT; +#define glDrawArraysEXT glad_glDrawArraysEXT +GLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; +#define glDrawArraysIndirect glad_glDrawArraysIndirect +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDARBPROC glad_glDrawArraysInstancedARB; +#define glDrawArraysInstancedARB glad_glDrawArraysInstancedARB +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance; +#define glDrawArraysInstancedBaseInstance glad_glDrawArraysInstancedBaseInstance +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDEXTPROC glad_glDrawArraysInstancedEXT; +#define glDrawArraysInstancedEXT glad_glDrawArraysInstancedEXT +GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +GLAD_API_CALL PFNGLDRAWBUFFERSARBPROC glad_glDrawBuffersARB; +#define glDrawBuffersARB glad_glDrawBuffersARB +GLAD_API_CALL PFNGLDRAWBUFFERSATIPROC glad_glDrawBuffersATI; +#define glDrawBuffersATI glad_glDrawBuffersATI +GLAD_API_CALL PFNGLDRAWCOMMANDSADDRESSNVPROC glad_glDrawCommandsAddressNV; +#define glDrawCommandsAddressNV glad_glDrawCommandsAddressNV +GLAD_API_CALL PFNGLDRAWCOMMANDSNVPROC glad_glDrawCommandsNV; +#define glDrawCommandsNV glad_glDrawCommandsNV +GLAD_API_CALL PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC glad_glDrawCommandsStatesAddressNV; +#define glDrawCommandsStatesAddressNV glad_glDrawCommandsStatesAddressNV +GLAD_API_CALL PFNGLDRAWCOMMANDSSTATESNVPROC glad_glDrawCommandsStatesNV; +#define glDrawCommandsStatesNV glad_glDrawCommandsStatesNV +GLAD_API_CALL PFNGLDRAWELEMENTARRAYAPPLEPROC glad_glDrawElementArrayAPPLE; +#define glDrawElementArrayAPPLE glad_glDrawElementArrayAPPLE +GLAD_API_CALL PFNGLDRAWELEMENTARRAYATIPROC glad_glDrawElementArrayATI; +#define glDrawElementArrayATI glad_glDrawElementArrayATI +GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; +#define glDrawElementsIndirect glad_glDrawElementsIndirect +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDARBPROC glad_glDrawElementsInstancedARB; +#define glDrawElementsInstancedARB glad_glDrawElementsInstancedARB +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance; +#define glDrawElementsInstancedBaseInstance glad_glDrawElementsInstancedBaseInstance +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance; +#define glDrawElementsInstancedBaseVertexBaseInstance glad_glDrawElementsInstancedBaseVertexBaseInstance +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDEXTPROC glad_glDrawElementsInstancedEXT; +#define glDrawElementsInstancedEXT glad_glDrawElementsInstancedEXT +GLAD_API_CALL PFNGLDRAWMESHARRAYSSUNPROC glad_glDrawMeshArraysSUN; +#define glDrawMeshArraysSUN glad_glDrawMeshArraysSUN +GLAD_API_CALL PFNGLDRAWMESHTASKSINDIRECTNVPROC glad_glDrawMeshTasksIndirectNV; +#define glDrawMeshTasksIndirectNV glad_glDrawMeshTasksIndirectNV +GLAD_API_CALL PFNGLDRAWMESHTASKSNVPROC glad_glDrawMeshTasksNV; +#define glDrawMeshTasksNV glad_glDrawMeshTasksNV +GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels; +#define glDrawPixels glad_glDrawPixels +GLAD_API_CALL PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC glad_glDrawRangeElementArrayAPPLE; +#define glDrawRangeElementArrayAPPLE glad_glDrawRangeElementArrayAPPLE +GLAD_API_CALL PFNGLDRAWRANGEELEMENTARRAYATIPROC glad_glDrawRangeElementArrayATI; +#define glDrawRangeElementArrayATI glad_glDrawRangeElementArrayATI +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSEXTPROC glad_glDrawRangeElementsEXT; +#define glDrawRangeElementsEXT glad_glDrawRangeElementsEXT +GLAD_API_CALL PFNGLDRAWTEXTURENVPROC glad_glDrawTextureNV; +#define glDrawTextureNV glad_glDrawTextureNV +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback; +#define glDrawTransformFeedback glad_glDrawTransformFeedback +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced; +#define glDrawTransformFeedbackInstanced glad_glDrawTransformFeedbackInstanced +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKNVPROC glad_glDrawTransformFeedbackNV; +#define glDrawTransformFeedbackNV glad_glDrawTransformFeedbackNV +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream; +#define glDrawTransformFeedbackStream glad_glDrawTransformFeedbackStream +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced; +#define glDrawTransformFeedbackStreamInstanced glad_glDrawTransformFeedbackStreamInstanced +GLAD_API_CALL PFNGLDRAWVKIMAGENVPROC glad_glDrawVkImageNV; +#define glDrawVkImageNV glad_glDrawVkImageNV +GLAD_API_CALL PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC glad_glEGLImageTargetTexStorageEXT; +#define glEGLImageTargetTexStorageEXT glad_glEGLImageTargetTexStorageEXT +GLAD_API_CALL PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC glad_glEGLImageTargetTextureStorageEXT; +#define glEGLImageTargetTextureStorageEXT glad_glEGLImageTargetTextureStorageEXT +GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag; +#define glEdgeFlag glad_glEdgeFlag +GLAD_API_CALL PFNGLEDGEFLAGFORMATNVPROC glad_glEdgeFlagFormatNV; +#define glEdgeFlagFormatNV glad_glEdgeFlagFormatNV +GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer; +#define glEdgeFlagPointer glad_glEdgeFlagPointer +GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT; +#define glEdgeFlagPointerEXT glad_glEdgeFlagPointerEXT +GLAD_API_CALL PFNGLEDGEFLAGPOINTERLISTIBMPROC glad_glEdgeFlagPointerListIBM; +#define glEdgeFlagPointerListIBM glad_glEdgeFlagPointerListIBM +GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; +#define glEdgeFlagv glad_glEdgeFlagv +GLAD_API_CALL PFNGLELEMENTPOINTERAPPLEPROC glad_glElementPointerAPPLE; +#define glElementPointerAPPLE glad_glElementPointerAPPLE +GLAD_API_CALL PFNGLELEMENTPOINTERATIPROC glad_glElementPointerATI; +#define glElementPointerATI glad_glElementPointerATI +GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState; +#define glEnableClientState glad_glEnableClientState +GLAD_API_CALL PFNGLENABLECLIENTSTATEINDEXEDEXTPROC glad_glEnableClientStateIndexedEXT; +#define glEnableClientStateIndexedEXT glad_glEnableClientStateIndexedEXT +GLAD_API_CALL PFNGLENABLECLIENTSTATEIEXTPROC glad_glEnableClientStateiEXT; +#define glEnableClientStateiEXT glad_glEnableClientStateiEXT +GLAD_API_CALL PFNGLENABLEINDEXEDEXTPROC glad_glEnableIndexedEXT; +#define glEnableIndexedEXT glad_glEnableIndexedEXT +GLAD_API_CALL PFNGLENABLEVARIANTCLIENTSTATEEXTPROC glad_glEnableVariantClientStateEXT; +#define glEnableVariantClientStateEXT glad_glEnableVariantClientStateEXT +GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib; +#define glEnableVertexArrayAttrib glad_glEnableVertexArrayAttrib +GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glad_glEnableVertexArrayAttribEXT; +#define glEnableVertexArrayAttribEXT glad_glEnableVertexArrayAttribEXT +GLAD_API_CALL PFNGLENABLEVERTEXARRAYEXTPROC glad_glEnableVertexArrayEXT; +#define glEnableVertexArrayEXT glad_glEnableVertexArrayEXT +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBAPPLEPROC glad_glEnableVertexAttribAPPLE; +#define glEnableVertexAttribAPPLE glad_glEnableVertexAttribAPPLE +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB; +#define glEnableVertexAttribArrayARB glad_glEnableVertexAttribArrayARB +GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +GLAD_API_CALL PFNGLENDPROC glad_glEnd; +#define glEnd glad_glEnd +GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +GLAD_API_CALL PFNGLENDCONDITIONALRENDERNVPROC glad_glEndConditionalRenderNV; +#define glEndConditionalRenderNV glad_glEndConditionalRenderNV +GLAD_API_CALL PFNGLENDCONDITIONALRENDERNVXPROC glad_glEndConditionalRenderNVX; +#define glEndConditionalRenderNVX glad_glEndConditionalRenderNVX +GLAD_API_CALL PFNGLENDFRAGMENTSHADERATIPROC glad_glEndFragmentShaderATI; +#define glEndFragmentShaderATI glad_glEndFragmentShaderATI +GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList; +#define glEndList glad_glEndList +GLAD_API_CALL PFNGLENDOCCLUSIONQUERYNVPROC glad_glEndOcclusionQueryNV; +#define glEndOcclusionQueryNV glad_glEndOcclusionQueryNV +GLAD_API_CALL PFNGLENDPERFMONITORAMDPROC glad_glEndPerfMonitorAMD; +#define glEndPerfMonitorAMD glad_glEndPerfMonitorAMD +GLAD_API_CALL PFNGLENDPERFQUERYINTELPROC glad_glEndPerfQueryINTEL; +#define glEndPerfQueryINTEL glad_glEndPerfQueryINTEL +GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +GLAD_API_CALL PFNGLENDQUERYARBPROC glad_glEndQueryARB; +#define glEndQueryARB glad_glEndQueryARB +GLAD_API_CALL PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed; +#define glEndQueryIndexed glad_glEndQueryIndexed +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKEXTPROC glad_glEndTransformFeedbackEXT; +#define glEndTransformFeedbackEXT glad_glEndTransformFeedbackEXT +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKNVPROC glad_glEndTransformFeedbackNV; +#define glEndTransformFeedbackNV glad_glEndTransformFeedbackNV +GLAD_API_CALL PFNGLENDVERTEXSHADEREXTPROC glad_glEndVertexShaderEXT; +#define glEndVertexShaderEXT glad_glEndVertexShaderEXT +GLAD_API_CALL PFNGLENDVIDEOCAPTURENVPROC glad_glEndVideoCaptureNV; +#define glEndVideoCaptureNV glad_glEndVideoCaptureNV +GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d; +#define glEvalCoord1d glad_glEvalCoord1d +GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv; +#define glEvalCoord1dv glad_glEvalCoord1dv +GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f; +#define glEvalCoord1f glad_glEvalCoord1f +GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv; +#define glEvalCoord1fv glad_glEvalCoord1fv +GLAD_API_CALL PFNGLEVALCOORD1XOESPROC glad_glEvalCoord1xOES; +#define glEvalCoord1xOES glad_glEvalCoord1xOES +GLAD_API_CALL PFNGLEVALCOORD1XVOESPROC glad_glEvalCoord1xvOES; +#define glEvalCoord1xvOES glad_glEvalCoord1xvOES +GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d; +#define glEvalCoord2d glad_glEvalCoord2d +GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv; +#define glEvalCoord2dv glad_glEvalCoord2dv +GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f; +#define glEvalCoord2f glad_glEvalCoord2f +GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv; +#define glEvalCoord2fv glad_glEvalCoord2fv +GLAD_API_CALL PFNGLEVALCOORD2XOESPROC glad_glEvalCoord2xOES; +#define glEvalCoord2xOES glad_glEvalCoord2xOES +GLAD_API_CALL PFNGLEVALCOORD2XVOESPROC glad_glEvalCoord2xvOES; +#define glEvalCoord2xvOES glad_glEvalCoord2xvOES +GLAD_API_CALL PFNGLEVALMAPSNVPROC glad_glEvalMapsNV; +#define glEvalMapsNV glad_glEvalMapsNV +GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1; +#define glEvalMesh1 glad_glEvalMesh1 +GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2; +#define glEvalMesh2 glad_glEvalMesh2 +GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1; +#define glEvalPoint1 glad_glEvalPoint1 +GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2; +#define glEvalPoint2 glad_glEvalPoint2 +GLAD_API_CALL PFNGLEVALUATEDEPTHVALUESARBPROC glad_glEvaluateDepthValuesARB; +#define glEvaluateDepthValuesARB glad_glEvaluateDepthValuesARB +GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV; +#define glExecuteProgramNV glad_glExecuteProgramNV +GLAD_API_CALL PFNGLEXTRACTCOMPONENTEXTPROC glad_glExtractComponentEXT; +#define glExtractComponentEXT glad_glExtractComponentEXT +GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer; +#define glFeedbackBuffer glad_glFeedbackBuffer +GLAD_API_CALL PFNGLFEEDBACKBUFFERXOESPROC glad_glFeedbackBufferxOES; +#define glFeedbackBufferxOES glad_glFeedbackBufferxOES +GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +GLAD_API_CALL PFNGLFINALCOMBINERINPUTNVPROC glad_glFinalCombinerInputNV; +#define glFinalCombinerInputNV glad_glFinalCombinerInputNV +GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +GLAD_API_CALL PFNGLFINISHASYNCSGIXPROC glad_glFinishAsyncSGIX; +#define glFinishAsyncSGIX glad_glFinishAsyncSGIX +GLAD_API_CALL PFNGLFINISHFENCEAPPLEPROC glad_glFinishFenceAPPLE; +#define glFinishFenceAPPLE glad_glFinishFenceAPPLE +GLAD_API_CALL PFNGLFINISHFENCENVPROC glad_glFinishFenceNV; +#define glFinishFenceNV glad_glFinishFenceNV +GLAD_API_CALL PFNGLFINISHOBJECTAPPLEPROC glad_glFinishObjectAPPLE; +#define glFinishObjectAPPLE glad_glFinishObjectAPPLE +GLAD_API_CALL PFNGLFINISHTEXTURESUNXPROC glad_glFinishTextureSUNX; +#define glFinishTextureSUNX glad_glFinishTextureSUNX +GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glad_glFlushMappedBufferRangeAPPLE; +#define glFlushMappedBufferRangeAPPLE glad_glFlushMappedBufferRangeAPPLE +GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange; +#define glFlushMappedNamedBufferRange glad_glFlushMappedNamedBufferRange +GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC glad_glFlushMappedNamedBufferRangeEXT; +#define glFlushMappedNamedBufferRangeEXT glad_glFlushMappedNamedBufferRangeEXT +GLAD_API_CALL PFNGLFLUSHPIXELDATARANGENVPROC glad_glFlushPixelDataRangeNV; +#define glFlushPixelDataRangeNV glad_glFlushPixelDataRangeNV +GLAD_API_CALL PFNGLFLUSHRASTERSGIXPROC glad_glFlushRasterSGIX; +#define glFlushRasterSGIX glad_glFlushRasterSGIX +GLAD_API_CALL PFNGLFLUSHSTATICDATAIBMPROC glad_glFlushStaticDataIBM; +#define glFlushStaticDataIBM glad_glFlushStaticDataIBM +GLAD_API_CALL PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC glad_glFlushVertexArrayRangeAPPLE; +#define glFlushVertexArrayRangeAPPLE glad_glFlushVertexArrayRangeAPPLE +GLAD_API_CALL PFNGLFLUSHVERTEXARRAYRANGENVPROC glad_glFlushVertexArrayRangeNV; +#define glFlushVertexArrayRangeNV glad_glFlushVertexArrayRangeNV +GLAD_API_CALL PFNGLFOGCOORDFORMATNVPROC glad_glFogCoordFormatNV; +#define glFogCoordFormatNV glad_glFogCoordFormatNV +GLAD_API_CALL PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer; +#define glFogCoordPointer glad_glFogCoordPointer +GLAD_API_CALL PFNGLFOGCOORDPOINTEREXTPROC glad_glFogCoordPointerEXT; +#define glFogCoordPointerEXT glad_glFogCoordPointerEXT +GLAD_API_CALL PFNGLFOGCOORDPOINTERLISTIBMPROC glad_glFogCoordPointerListIBM; +#define glFogCoordPointerListIBM glad_glFogCoordPointerListIBM +GLAD_API_CALL PFNGLFOGCOORDDPROC glad_glFogCoordd; +#define glFogCoordd glad_glFogCoordd +GLAD_API_CALL PFNGLFOGCOORDDEXTPROC glad_glFogCoorddEXT; +#define glFogCoorddEXT glad_glFogCoorddEXT +GLAD_API_CALL PFNGLFOGCOORDDVPROC glad_glFogCoorddv; +#define glFogCoorddv glad_glFogCoorddv +GLAD_API_CALL PFNGLFOGCOORDDVEXTPROC glad_glFogCoorddvEXT; +#define glFogCoorddvEXT glad_glFogCoorddvEXT +GLAD_API_CALL PFNGLFOGCOORDFPROC glad_glFogCoordf; +#define glFogCoordf glad_glFogCoordf +GLAD_API_CALL PFNGLFOGCOORDFEXTPROC glad_glFogCoordfEXT; +#define glFogCoordfEXT glad_glFogCoordfEXT +GLAD_API_CALL PFNGLFOGCOORDFVPROC glad_glFogCoordfv; +#define glFogCoordfv glad_glFogCoordfv +GLAD_API_CALL PFNGLFOGCOORDFVEXTPROC glad_glFogCoordfvEXT; +#define glFogCoordfvEXT glad_glFogCoordfvEXT +GLAD_API_CALL PFNGLFOGCOORDHNVPROC glad_glFogCoordhNV; +#define glFogCoordhNV glad_glFogCoordhNV +GLAD_API_CALL PFNGLFOGCOORDHVNVPROC glad_glFogCoordhvNV; +#define glFogCoordhvNV glad_glFogCoordhvNV +GLAD_API_CALL PFNGLFOGFUNCSGISPROC glad_glFogFuncSGIS; +#define glFogFuncSGIS glad_glFogFuncSGIS +GLAD_API_CALL PFNGLFOGFPROC glad_glFogf; +#define glFogf glad_glFogf +GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv; +#define glFogfv glad_glFogfv +GLAD_API_CALL PFNGLFOGIPROC glad_glFogi; +#define glFogi glad_glFogi +GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv; +#define glFogiv glad_glFogiv +GLAD_API_CALL PFNGLFOGXOESPROC glad_glFogxOES; +#define glFogxOES glad_glFogxOES +GLAD_API_CALL PFNGLFOGXVOESPROC glad_glFogxvOES; +#define glFogxvOES glad_glFogxvOES +GLAD_API_CALL PFNGLFRAGMENTCOLORMATERIALSGIXPROC glad_glFragmentColorMaterialSGIX; +#define glFragmentColorMaterialSGIX glad_glFragmentColorMaterialSGIX +GLAD_API_CALL PFNGLFRAGMENTCOVERAGECOLORNVPROC glad_glFragmentCoverageColorNV; +#define glFragmentCoverageColorNV glad_glFragmentCoverageColorNV +GLAD_API_CALL PFNGLFRAGMENTLIGHTMODELFSGIXPROC glad_glFragmentLightModelfSGIX; +#define glFragmentLightModelfSGIX glad_glFragmentLightModelfSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTMODELFVSGIXPROC glad_glFragmentLightModelfvSGIX; +#define glFragmentLightModelfvSGIX glad_glFragmentLightModelfvSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTMODELISGIXPROC glad_glFragmentLightModeliSGIX; +#define glFragmentLightModeliSGIX glad_glFragmentLightModeliSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTMODELIVSGIXPROC glad_glFragmentLightModelivSGIX; +#define glFragmentLightModelivSGIX glad_glFragmentLightModelivSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTFSGIXPROC glad_glFragmentLightfSGIX; +#define glFragmentLightfSGIX glad_glFragmentLightfSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTFVSGIXPROC glad_glFragmentLightfvSGIX; +#define glFragmentLightfvSGIX glad_glFragmentLightfvSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTISGIXPROC glad_glFragmentLightiSGIX; +#define glFragmentLightiSGIX glad_glFragmentLightiSGIX +GLAD_API_CALL PFNGLFRAGMENTLIGHTIVSGIXPROC glad_glFragmentLightivSGIX; +#define glFragmentLightivSGIX glad_glFragmentLightivSGIX +GLAD_API_CALL PFNGLFRAGMENTMATERIALFSGIXPROC glad_glFragmentMaterialfSGIX; +#define glFragmentMaterialfSGIX glad_glFragmentMaterialfSGIX +GLAD_API_CALL PFNGLFRAGMENTMATERIALFVSGIXPROC glad_glFragmentMaterialfvSGIX; +#define glFragmentMaterialfvSGIX glad_glFragmentMaterialfvSGIX +GLAD_API_CALL PFNGLFRAGMENTMATERIALISGIXPROC glad_glFragmentMaterialiSGIX; +#define glFragmentMaterialiSGIX glad_glFragmentMaterialiSGIX +GLAD_API_CALL PFNGLFRAGMENTMATERIALIVSGIXPROC glad_glFragmentMaterialivSGIX; +#define glFragmentMaterialivSGIX glad_glFragmentMaterialivSGIX +GLAD_API_CALL PFNGLFRAMETERMINATORGREMEDYPROC glad_glFrameTerminatorGREMEDY; +#define glFrameTerminatorGREMEDY glad_glFrameTerminatorGREMEDY +GLAD_API_CALL PFNGLFRAMEZOOMSGIXPROC glad_glFrameZoomSGIX; +#define glFrameZoomSGIX glad_glFrameZoomSGIX +GLAD_API_CALL PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glad_glFramebufferDrawBufferEXT; +#define glFramebufferDrawBufferEXT glad_glFramebufferDrawBufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glad_glFramebufferDrawBuffersEXT; +#define glFramebufferDrawBuffersEXT glad_glFramebufferDrawBuffersEXT +GLAD_API_CALL PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC glad_glFramebufferFetchBarrierEXT; +#define glFramebufferFetchBarrierEXT glad_glFramebufferFetchBarrierEXT +GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; +#define glFramebufferParameteri glad_glFramebufferParameteri +GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIMESAPROC glad_glFramebufferParameteriMESA; +#define glFramebufferParameteriMESA glad_glFramebufferParameteriMESA +GLAD_API_CALL PFNGLFRAMEBUFFERREADBUFFEREXTPROC glad_glFramebufferReadBufferEXT; +#define glFramebufferReadBufferEXT glad_glFramebufferReadBufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT; +#define glFramebufferRenderbufferEXT glad_glFramebufferRenderbufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC glad_glFramebufferSampleLocationsfvARB; +#define glFramebufferSampleLocationsfvARB glad_glFramebufferSampleLocationsfvARB +GLAD_API_CALL PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glFramebufferSampleLocationsfvNV; +#define glFramebufferSampleLocationsfvNV glad_glFramebufferSampleLocationsfvNV +GLAD_API_CALL PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC glad_glFramebufferSamplePositionsfvAMD; +#define glFramebufferSamplePositionsfvAMD glad_glFramebufferSamplePositionsfvAMD +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT; +#define glFramebufferTexture1DEXT glad_glFramebufferTexture1DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT; +#define glFramebufferTexture2DEXT glad_glFramebufferTexture2DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT; +#define glFramebufferTexture3DEXT glad_glFramebufferTexture3DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB; +#define glFramebufferTextureARB glad_glFramebufferTextureARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT; +#define glFramebufferTextureEXT glad_glFramebufferTextureEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB; +#define glFramebufferTextureFaceARB glad_glFramebufferTextureFaceARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT; +#define glFramebufferTextureFaceEXT glad_glFramebufferTextureFaceEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB; +#define glFramebufferTextureLayerARB glad_glFramebufferTextureLayerARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT; +#define glFramebufferTextureLayerEXT glad_glFramebufferTextureLayerEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glad_glFramebufferTextureMultiviewOVR; +#define glFramebufferTextureMultiviewOVR glad_glFramebufferTextureMultiviewOVR +GLAD_API_CALL PFNGLFREEOBJECTBUFFERATIPROC glad_glFreeObjectBufferATI; +#define glFreeObjectBufferATI glad_glFreeObjectBufferATI +GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum; +#define glFrustum glad_glFrustum +GLAD_API_CALL PFNGLFRUSTUMFOESPROC glad_glFrustumfOES; +#define glFrustumfOES glad_glFrustumfOES +GLAD_API_CALL PFNGLFRUSTUMXOESPROC glad_glFrustumxOES; +#define glFrustumxOES glad_glFrustumxOES +GLAD_API_CALL PFNGLGENASYNCMARKERSSGIXPROC glad_glGenAsyncMarkersSGIX; +#define glGenAsyncMarkersSGIX glad_glGenAsyncMarkersSGIX +GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +GLAD_API_CALL PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB; +#define glGenBuffersARB glad_glGenBuffersARB +GLAD_API_CALL PFNGLGENFENCESAPPLEPROC glad_glGenFencesAPPLE; +#define glGenFencesAPPLE glad_glGenFencesAPPLE +GLAD_API_CALL PFNGLGENFENCESNVPROC glad_glGenFencesNV; +#define glGenFencesNV glad_glGenFencesNV +GLAD_API_CALL PFNGLGENFRAGMENTSHADERSATIPROC glad_glGenFragmentShadersATI; +#define glGenFragmentShadersATI glad_glGenFragmentShadersATI +GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT; +#define glGenFramebuffersEXT glad_glGenFramebuffersEXT +GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists; +#define glGenLists glad_glGenLists +GLAD_API_CALL PFNGLGENNAMESAMDPROC glad_glGenNamesAMD; +#define glGenNamesAMD glad_glGenNamesAMD +GLAD_API_CALL PFNGLGENOCCLUSIONQUERIESNVPROC glad_glGenOcclusionQueriesNV; +#define glGenOcclusionQueriesNV glad_glGenOcclusionQueriesNV +GLAD_API_CALL PFNGLGENPATHSNVPROC glad_glGenPathsNV; +#define glGenPathsNV glad_glGenPathsNV +GLAD_API_CALL PFNGLGENPERFMONITORSAMDPROC glad_glGenPerfMonitorsAMD; +#define glGenPerfMonitorsAMD glad_glGenPerfMonitorsAMD +GLAD_API_CALL PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; +#define glGenProgramPipelines glad_glGenProgramPipelines +GLAD_API_CALL PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB; +#define glGenProgramsARB glad_glGenProgramsARB +GLAD_API_CALL PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV; +#define glGenProgramsNV glad_glGenProgramsNV +GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +GLAD_API_CALL PFNGLGENQUERIESARBPROC glad_glGenQueriesARB; +#define glGenQueriesARB glad_glGenQueriesARB +GLAD_API_CALL PFNGLGENQUERYRESOURCETAGNVPROC glad_glGenQueryResourceTagNV; +#define glGenQueryResourceTagNV glad_glGenQueryResourceTagNV +GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT; +#define glGenRenderbuffersEXT glad_glGenRenderbuffersEXT +GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +GLAD_API_CALL PFNGLGENSEMAPHORESEXTPROC glad_glGenSemaphoresEXT; +#define glGenSemaphoresEXT glad_glGenSemaphoresEXT +GLAD_API_CALL PFNGLGENSYMBOLSEXTPROC glad_glGenSymbolsEXT; +#define glGenSymbolsEXT glad_glGenSymbolsEXT +GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +GLAD_API_CALL PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT; +#define glGenTexturesEXT glad_glGenTexturesEXT +GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; +#define glGenTransformFeedbacks glad_glGenTransformFeedbacks +GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSNVPROC glad_glGenTransformFeedbacksNV; +#define glGenTransformFeedbacksNV glad_glGenTransformFeedbacksNV +GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +GLAD_API_CALL PFNGLGENVERTEXARRAYSAPPLEPROC glad_glGenVertexArraysAPPLE; +#define glGenVertexArraysAPPLE glad_glGenVertexArraysAPPLE +GLAD_API_CALL PFNGLGENVERTEXSHADERSEXTPROC glad_glGenVertexShadersEXT; +#define glGenVertexShadersEXT glad_glGenVertexShadersEXT +GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT; +#define glGenerateMipmapEXT glad_glGenerateMipmapEXT +GLAD_API_CALL PFNGLGENERATEMULTITEXMIPMAPEXTPROC glad_glGenerateMultiTexMipmapEXT; +#define glGenerateMultiTexMipmapEXT glad_glGenerateMultiTexMipmapEXT +GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap; +#define glGenerateTextureMipmap glad_glGenerateTextureMipmap +GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPEXTPROC glad_glGenerateTextureMipmapEXT; +#define glGenerateTextureMipmapEXT glad_glGenerateTextureMipmapEXT +GLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv; +#define glGetActiveAtomicCounterBufferiv glad_glGetActiveAtomicCounterBufferiv +GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB; +#define glGetActiveAttribARB glad_glGetActiveAttribARB +GLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName; +#define glGetActiveSubroutineName glad_glGetActiveSubroutineName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName; +#define glGetActiveSubroutineUniformName glad_glGetActiveSubroutineUniformName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv; +#define glGetActiveSubroutineUniformiv glad_glGetActiveSubroutineUniformiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB; +#define glGetActiveUniformARB glad_glGetActiveUniformARB +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +GLAD_API_CALL PFNGLGETACTIVEVARYINGNVPROC glad_glGetActiveVaryingNV; +#define glGetActiveVaryingNV glad_glGetActiveVaryingNV +GLAD_API_CALL PFNGLGETARRAYOBJECTFVATIPROC glad_glGetArrayObjectfvATI; +#define glGetArrayObjectfvATI glad_glGetArrayObjectfvATI +GLAD_API_CALL PFNGLGETARRAYOBJECTIVATIPROC glad_glGetArrayObjectivATI; +#define glGetArrayObjectivATI glad_glGetArrayObjectivATI +GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB; +#define glGetAttachedObjectsARB glad_glGetAttachedObjectsARB +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB; +#define glGetAttribLocationARB glad_glGetAttribLocationARB +GLAD_API_CALL PFNGLGETBOOLEANINDEXEDVEXTPROC glad_glGetBooleanIndexedvEXT; +#define glGetBooleanIndexedvEXT glad_glGetBooleanIndexedvEXT +GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB; +#define glGetBufferParameterivARB glad_glGetBufferParameterivARB +GLAD_API_CALL PFNGLGETBUFFERPARAMETERUI64VNVPROC glad_glGetBufferParameterui64vNV; +#define glGetBufferParameterui64vNV glad_glGetBufferParameterui64vNV +GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB; +#define glGetBufferPointervARB glad_glGetBufferPointervARB +GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB; +#define glGetBufferSubDataARB glad_glGetBufferSubDataARB +GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane; +#define glGetClipPlane glad_glGetClipPlane +GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES; +#define glGetClipPlanefOES glad_glGetClipPlanefOES +GLAD_API_CALL PFNGLGETCLIPPLANEXOESPROC glad_glGetClipPlanexOES; +#define glGetClipPlanexOES glad_glGetClipPlanexOES +GLAD_API_CALL PFNGLGETCOLORTABLEPROC glad_glGetColorTable; +#define glGetColorTable glad_glGetColorTable +GLAD_API_CALL PFNGLGETCOLORTABLEEXTPROC glad_glGetColorTableEXT; +#define glGetColorTableEXT glad_glGetColorTableEXT +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv; +#define glGetColorTableParameterfv glad_glGetColorTableParameterfv +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVEXTPROC glad_glGetColorTableParameterfvEXT; +#define glGetColorTableParameterfvEXT glad_glGetColorTableParameterfvEXT +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVSGIPROC glad_glGetColorTableParameterfvSGI; +#define glGetColorTableParameterfvSGI glad_glGetColorTableParameterfvSGI +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv; +#define glGetColorTableParameteriv glad_glGetColorTableParameteriv +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVEXTPROC glad_glGetColorTableParameterivEXT; +#define glGetColorTableParameterivEXT glad_glGetColorTableParameterivEXT +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVSGIPROC glad_glGetColorTableParameterivSGI; +#define glGetColorTableParameterivSGI glad_glGetColorTableParameterivSGI +GLAD_API_CALL PFNGLGETCOLORTABLESGIPROC glad_glGetColorTableSGI; +#define glGetColorTableSGI glad_glGetColorTableSGI +GLAD_API_CALL PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC glad_glGetCombinerInputParameterfvNV; +#define glGetCombinerInputParameterfvNV glad_glGetCombinerInputParameterfvNV +GLAD_API_CALL PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC glad_glGetCombinerInputParameterivNV; +#define glGetCombinerInputParameterivNV glad_glGetCombinerInputParameterivNV +GLAD_API_CALL PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC glad_glGetCombinerOutputParameterfvNV; +#define glGetCombinerOutputParameterfvNV glad_glGetCombinerOutputParameterfvNV +GLAD_API_CALL PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC glad_glGetCombinerOutputParameterivNV; +#define glGetCombinerOutputParameterivNV glad_glGetCombinerOutputParameterivNV +GLAD_API_CALL PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC glad_glGetCombinerStageParameterfvNV; +#define glGetCombinerStageParameterfvNV glad_glGetCombinerStageParameterfvNV +GLAD_API_CALL PFNGLGETCOMMANDHEADERNVPROC glad_glGetCommandHeaderNV; +#define glGetCommandHeaderNV glad_glGetCommandHeaderNV +GLAD_API_CALL PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glad_glGetCompressedMultiTexImageEXT; +#define glGetCompressedMultiTexImageEXT glad_glGetCompressedMultiTexImageEXT +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glad_glGetCompressedTexImageARB; +#define glGetCompressedTexImageARB glad_glGetCompressedTexImageARB +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage; +#define glGetCompressedTextureImage glad_glGetCompressedTextureImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC glad_glGetCompressedTextureImageEXT; +#define glGetCompressedTextureImageEXT glad_glGetCompressedTextureImageEXT +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage; +#define glGetCompressedTextureSubImage glad_glGetCompressedTextureSubImage +GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter; +#define glGetConvolutionFilter glad_glGetConvolutionFilter +GLAD_API_CALL PFNGLGETCONVOLUTIONFILTEREXTPROC glad_glGetConvolutionFilterEXT; +#define glGetConvolutionFilterEXT glad_glGetConvolutionFilterEXT +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv; +#define glGetConvolutionParameterfv glad_glGetConvolutionParameterfv +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC glad_glGetConvolutionParameterfvEXT; +#define glGetConvolutionParameterfvEXT glad_glGetConvolutionParameterfvEXT +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv; +#define glGetConvolutionParameteriv glad_glGetConvolutionParameteriv +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC glad_glGetConvolutionParameterivEXT; +#define glGetConvolutionParameterivEXT glad_glGetConvolutionParameterivEXT +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERXVOESPROC glad_glGetConvolutionParameterxvOES; +#define glGetConvolutionParameterxvOES glad_glGetConvolutionParameterxvOES +GLAD_API_CALL PFNGLGETCOVERAGEMODULATIONTABLENVPROC glad_glGetCoverageModulationTableNV; +#define glGetCoverageModulationTableNV glad_glGetCoverageModulationTableNV +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; +#define glGetDebugMessageLog glad_glGetDebugMessageLog +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGAMDPROC glad_glGetDebugMessageLogAMD; +#define glGetDebugMessageLogAMD glad_glGetDebugMessageLogAMD +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGARBPROC glad_glGetDebugMessageLogARB; +#define glGetDebugMessageLogARB glad_glGetDebugMessageLogARB +GLAD_API_CALL PFNGLGETDETAILTEXFUNCSGISPROC glad_glGetDetailTexFuncSGIS; +#define glGetDetailTexFuncSGIS glad_glGetDetailTexFuncSGIS +GLAD_API_CALL PFNGLGETDOUBLEINDEXEDVEXTPROC glad_glGetDoubleIndexedvEXT; +#define glGetDoubleIndexedvEXT glad_glGetDoubleIndexedvEXT +GLAD_API_CALL PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v; +#define glGetDoublei_v glad_glGetDoublei_v +GLAD_API_CALL PFNGLGETDOUBLEI_VEXTPROC glad_glGetDoublei_vEXT; +#define glGetDoublei_vEXT glad_glGetDoublei_vEXT +GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +GLAD_API_CALL PFNGLGETFENCEIVNVPROC glad_glGetFenceivNV; +#define glGetFenceivNV glad_glGetFenceivNV +GLAD_API_CALL PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC glad_glGetFinalCombinerInputParameterfvNV; +#define glGetFinalCombinerInputParameterfvNV glad_glGetFinalCombinerInputParameterfvNV +GLAD_API_CALL PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC glad_glGetFinalCombinerInputParameterivNV; +#define glGetFinalCombinerInputParameterivNV glad_glGetFinalCombinerInputParameterivNV +GLAD_API_CALL PFNGLGETFIRSTPERFQUERYIDINTELPROC glad_glGetFirstPerfQueryIdINTEL; +#define glGetFirstPerfQueryIdINTEL glad_glGetFirstPerfQueryIdINTEL +GLAD_API_CALL PFNGLGETFIXEDVOESPROC glad_glGetFixedvOES; +#define glGetFixedvOES glad_glGetFixedvOES +GLAD_API_CALL PFNGLGETFLOATINDEXEDVEXTPROC glad_glGetFloatIndexedvEXT; +#define glGetFloatIndexedvEXT glad_glGetFloatIndexedvEXT +GLAD_API_CALL PFNGLGETFLOATI_VPROC glad_glGetFloati_v; +#define glGetFloati_v glad_glGetFloati_v +GLAD_API_CALL PFNGLGETFLOATI_VEXTPROC glad_glGetFloati_vEXT; +#define glGetFloati_vEXT glad_glGetFloati_vEXT +GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +GLAD_API_CALL PFNGLGETFOGFUNCSGISPROC glad_glGetFogFuncSGIS; +#define glGetFogFuncSGIS glad_glGetFogFuncSGIS +GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONEXTPROC glad_glGetFragDataLocationEXT; +#define glGetFragDataLocationEXT glad_glGetFragDataLocationEXT +GLAD_API_CALL PFNGLGETFRAGMENTLIGHTFVSGIXPROC glad_glGetFragmentLightfvSGIX; +#define glGetFragmentLightfvSGIX glad_glGetFragmentLightfvSGIX +GLAD_API_CALL PFNGLGETFRAGMENTLIGHTIVSGIXPROC glad_glGetFragmentLightivSGIX; +#define glGetFragmentLightivSGIX glad_glGetFragmentLightivSGIX +GLAD_API_CALL PFNGLGETFRAGMENTMATERIALFVSGIXPROC glad_glGetFragmentMaterialfvSGIX; +#define glGetFragmentMaterialfvSGIX glad_glGetFragmentMaterialfvSGIX +GLAD_API_CALL PFNGLGETFRAGMENTMATERIALIVSGIXPROC glad_glGetFragmentMaterialivSGIX; +#define glGetFragmentMaterialivSGIX glad_glGetFragmentMaterialivSGIX +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT; +#define glGetFramebufferAttachmentParameterivEXT glad_glGetFramebufferAttachmentParameterivEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC glad_glGetFramebufferParameterfvAMD; +#define glGetFramebufferParameterfvAMD glad_glGetFramebufferParameterfvAMD +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; +#define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetFramebufferParameterivEXT; +#define glGetFramebufferParameterivEXT glad_glGetFramebufferParameterivEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC glad_glGetFramebufferParameterivMESA; +#define glGetFramebufferParameterivMESA glad_glGetFramebufferParameterivMESA +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus; +#define glGetGraphicsResetStatus glad_glGetGraphicsResetStatus +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSARBPROC glad_glGetGraphicsResetStatusARB; +#define glGetGraphicsResetStatusARB glad_glGetGraphicsResetStatusARB +GLAD_API_CALL PFNGLGETHANDLEARBPROC glad_glGetHandleARB; +#define glGetHandleARB glad_glGetHandleARB +GLAD_API_CALL PFNGLGETHISTOGRAMPROC glad_glGetHistogram; +#define glGetHistogram glad_glGetHistogram +GLAD_API_CALL PFNGLGETHISTOGRAMEXTPROC glad_glGetHistogramEXT; +#define glGetHistogramEXT glad_glGetHistogramEXT +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv; +#define glGetHistogramParameterfv glad_glGetHistogramParameterfv +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVEXTPROC glad_glGetHistogramParameterfvEXT; +#define glGetHistogramParameterfvEXT glad_glGetHistogramParameterfvEXT +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv; +#define glGetHistogramParameteriv glad_glGetHistogramParameteriv +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVEXTPROC glad_glGetHistogramParameterivEXT; +#define glGetHistogramParameterivEXT glad_glGetHistogramParameterivEXT +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERXVOESPROC glad_glGetHistogramParameterxvOES; +#define glGetHistogramParameterxvOES glad_glGetHistogramParameterxvOES +GLAD_API_CALL PFNGLGETIMAGEHANDLEARBPROC glad_glGetImageHandleARB; +#define glGetImageHandleARB glad_glGetImageHandleARB +GLAD_API_CALL PFNGLGETIMAGEHANDLENVPROC glad_glGetImageHandleNV; +#define glGetImageHandleNV glad_glGetImageHandleNV +GLAD_API_CALL PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC glad_glGetImageTransformParameterfvHP; +#define glGetImageTransformParameterfvHP glad_glGetImageTransformParameterfvHP +GLAD_API_CALL PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC glad_glGetImageTransformParameterivHP; +#define glGetImageTransformParameterivHP glad_glGetImageTransformParameterivHP +GLAD_API_CALL PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB; +#define glGetInfoLogARB glad_glGetInfoLogARB +GLAD_API_CALL PFNGLGETINSTRUMENTSSGIXPROC glad_glGetInstrumentsSGIX; +#define glGetInstrumentsSGIX glad_glGetInstrumentsSGIX +GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +GLAD_API_CALL PFNGLGETINTEGERINDEXEDVEXTPROC glad_glGetIntegerIndexedvEXT; +#define glGetIntegerIndexedvEXT glad_glGetIntegerIndexedvEXT +GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +GLAD_API_CALL PFNGLGETINTEGERUI64I_VNVPROC glad_glGetIntegerui64i_vNV; +#define glGetIntegerui64i_vNV glad_glGetIntegerui64i_vNV +GLAD_API_CALL PFNGLGETINTEGERUI64VNVPROC glad_glGetIntegerui64vNV; +#define glGetIntegerui64vNV glad_glGetIntegerui64vNV +GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +GLAD_API_CALL PFNGLGETINTERNALFORMATSAMPLEIVNVPROC glad_glGetInternalformatSampleivNV; +#define glGetInternalformatSampleivNV glad_glGetInternalformatSampleivNV +GLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v; +#define glGetInternalformati64v glad_glGetInternalformati64v +GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; +#define glGetInternalformativ glad_glGetInternalformativ +GLAD_API_CALL PFNGLGETINVARIANTBOOLEANVEXTPROC glad_glGetInvariantBooleanvEXT; +#define glGetInvariantBooleanvEXT glad_glGetInvariantBooleanvEXT +GLAD_API_CALL PFNGLGETINVARIANTFLOATVEXTPROC glad_glGetInvariantFloatvEXT; +#define glGetInvariantFloatvEXT glad_glGetInvariantFloatvEXT +GLAD_API_CALL PFNGLGETINVARIANTINTEGERVEXTPROC glad_glGetInvariantIntegervEXT; +#define glGetInvariantIntegervEXT glad_glGetInvariantIntegervEXT +GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv; +#define glGetLightfv glad_glGetLightfv +GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv; +#define glGetLightiv glad_glGetLightiv +GLAD_API_CALL PFNGLGETLIGHTXOESPROC glad_glGetLightxOES; +#define glGetLightxOES glad_glGetLightxOES +GLAD_API_CALL PFNGLGETLISTPARAMETERFVSGIXPROC glad_glGetListParameterfvSGIX; +#define glGetListParameterfvSGIX glad_glGetListParameterfvSGIX +GLAD_API_CALL PFNGLGETLISTPARAMETERIVSGIXPROC glad_glGetListParameterivSGIX; +#define glGetListParameterivSGIX glad_glGetListParameterivSGIX +GLAD_API_CALL PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC glad_glGetLocalConstantBooleanvEXT; +#define glGetLocalConstantBooleanvEXT glad_glGetLocalConstantBooleanvEXT +GLAD_API_CALL PFNGLGETLOCALCONSTANTFLOATVEXTPROC glad_glGetLocalConstantFloatvEXT; +#define glGetLocalConstantFloatvEXT glad_glGetLocalConstantFloatvEXT +GLAD_API_CALL PFNGLGETLOCALCONSTANTINTEGERVEXTPROC glad_glGetLocalConstantIntegervEXT; +#define glGetLocalConstantIntegervEXT glad_glGetLocalConstantIntegervEXT +GLAD_API_CALL PFNGLGETMAPATTRIBPARAMETERFVNVPROC glad_glGetMapAttribParameterfvNV; +#define glGetMapAttribParameterfvNV glad_glGetMapAttribParameterfvNV +GLAD_API_CALL PFNGLGETMAPATTRIBPARAMETERIVNVPROC glad_glGetMapAttribParameterivNV; +#define glGetMapAttribParameterivNV glad_glGetMapAttribParameterivNV +GLAD_API_CALL PFNGLGETMAPCONTROLPOINTSNVPROC glad_glGetMapControlPointsNV; +#define glGetMapControlPointsNV glad_glGetMapControlPointsNV +GLAD_API_CALL PFNGLGETMAPPARAMETERFVNVPROC glad_glGetMapParameterfvNV; +#define glGetMapParameterfvNV glad_glGetMapParameterfvNV +GLAD_API_CALL PFNGLGETMAPPARAMETERIVNVPROC glad_glGetMapParameterivNV; +#define glGetMapParameterivNV glad_glGetMapParameterivNV +GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv; +#define glGetMapdv glad_glGetMapdv +GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv; +#define glGetMapfv glad_glGetMapfv +GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv; +#define glGetMapiv glad_glGetMapiv +GLAD_API_CALL PFNGLGETMAPXVOESPROC glad_glGetMapxvOES; +#define glGetMapxvOES glad_glGetMapxvOES +GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv; +#define glGetMaterialfv glad_glGetMaterialfv +GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv; +#define glGetMaterialiv glad_glGetMaterialiv +GLAD_API_CALL PFNGLGETMATERIALXOESPROC glad_glGetMaterialxOES; +#define glGetMaterialxOES glad_glGetMaterialxOES +GLAD_API_CALL PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC glad_glGetMemoryObjectDetachedResourcesuivNV; +#define glGetMemoryObjectDetachedResourcesuivNV glad_glGetMemoryObjectDetachedResourcesuivNV +GLAD_API_CALL PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC glad_glGetMemoryObjectParameterivEXT; +#define glGetMemoryObjectParameterivEXT glad_glGetMemoryObjectParameterivEXT +GLAD_API_CALL PFNGLGETMINMAXPROC glad_glGetMinmax; +#define glGetMinmax glad_glGetMinmax +GLAD_API_CALL PFNGLGETMINMAXEXTPROC glad_glGetMinmaxEXT; +#define glGetMinmaxEXT glad_glGetMinmaxEXT +GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv; +#define glGetMinmaxParameterfv glad_glGetMinmaxParameterfv +GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVEXTPROC glad_glGetMinmaxParameterfvEXT; +#define glGetMinmaxParameterfvEXT glad_glGetMinmaxParameterfvEXT +GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv; +#define glGetMinmaxParameteriv glad_glGetMinmaxParameteriv +GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVEXTPROC glad_glGetMinmaxParameterivEXT; +#define glGetMinmaxParameterivEXT glad_glGetMinmaxParameterivEXT +GLAD_API_CALL PFNGLGETMULTITEXENVFVEXTPROC glad_glGetMultiTexEnvfvEXT; +#define glGetMultiTexEnvfvEXT glad_glGetMultiTexEnvfvEXT +GLAD_API_CALL PFNGLGETMULTITEXENVIVEXTPROC glad_glGetMultiTexEnvivEXT; +#define glGetMultiTexEnvivEXT glad_glGetMultiTexEnvivEXT +GLAD_API_CALL PFNGLGETMULTITEXGENDVEXTPROC glad_glGetMultiTexGendvEXT; +#define glGetMultiTexGendvEXT glad_glGetMultiTexGendvEXT +GLAD_API_CALL PFNGLGETMULTITEXGENFVEXTPROC glad_glGetMultiTexGenfvEXT; +#define glGetMultiTexGenfvEXT glad_glGetMultiTexGenfvEXT +GLAD_API_CALL PFNGLGETMULTITEXGENIVEXTPROC glad_glGetMultiTexGenivEXT; +#define glGetMultiTexGenivEXT glad_glGetMultiTexGenivEXT +GLAD_API_CALL PFNGLGETMULTITEXIMAGEEXTPROC glad_glGetMultiTexImageEXT; +#define glGetMultiTexImageEXT glad_glGetMultiTexImageEXT +GLAD_API_CALL PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glad_glGetMultiTexLevelParameterfvEXT; +#define glGetMultiTexLevelParameterfvEXT glad_glGetMultiTexLevelParameterfvEXT +GLAD_API_CALL PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glad_glGetMultiTexLevelParameterivEXT; +#define glGetMultiTexLevelParameterivEXT glad_glGetMultiTexLevelParameterivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIIVEXTPROC glad_glGetMultiTexParameterIivEXT; +#define glGetMultiTexParameterIivEXT glad_glGetMultiTexParameterIivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIUIVEXTPROC glad_glGetMultiTexParameterIuivEXT; +#define glGetMultiTexParameterIuivEXT glad_glGetMultiTexParameterIuivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERFVEXTPROC glad_glGetMultiTexParameterfvEXT; +#define glGetMultiTexParameterfvEXT glad_glGetMultiTexParameterfvEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIVEXTPROC glad_glGetMultiTexParameterivEXT; +#define glGetMultiTexParameterivEXT glad_glGetMultiTexParameterivEXT +GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +GLAD_API_CALL PFNGLGETMULTISAMPLEFVNVPROC glad_glGetMultisamplefvNV; +#define glGetMultisamplefvNV glad_glGetMultisamplefvNV +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v; +#define glGetNamedBufferParameteri64v glad_glGetNamedBufferParameteri64v +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv; +#define glGetNamedBufferParameteriv glad_glGetNamedBufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glad_glGetNamedBufferParameterivEXT; +#define glGetNamedBufferParameterivEXT glad_glGetNamedBufferParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC glad_glGetNamedBufferParameterui64vNV; +#define glGetNamedBufferParameterui64vNV glad_glGetNamedBufferParameterui64vNV +GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv; +#define glGetNamedBufferPointerv glad_glGetNamedBufferPointerv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glad_glGetNamedBufferPointervEXT; +#define glGetNamedBufferPointervEXT glad_glGetNamedBufferPointervEXT +GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData; +#define glGetNamedBufferSubData glad_glGetNamedBufferSubData +GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glad_glGetNamedBufferSubDataEXT; +#define glGetNamedBufferSubDataEXT glad_glGetNamedBufferSubDataEXT +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv; +#define glGetNamedFramebufferAttachmentParameteriv glad_glGetNamedFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetNamedFramebufferAttachmentParameterivEXT; +#define glGetNamedFramebufferAttachmentParameterivEXT glad_glGetNamedFramebufferAttachmentParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC glad_glGetNamedFramebufferParameterfvAMD; +#define glGetNamedFramebufferParameterfvAMD glad_glGetNamedFramebufferParameterfvAMD +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv; +#define glGetNamedFramebufferParameteriv glad_glGetNamedFramebufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetNamedFramebufferParameterivEXT; +#define glGetNamedFramebufferParameterivEXT glad_glGetNamedFramebufferParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC glad_glGetNamedProgramLocalParameterIivEXT; +#define glGetNamedProgramLocalParameterIivEXT glad_glGetNamedProgramLocalParameterIivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC glad_glGetNamedProgramLocalParameterIuivEXT; +#define glGetNamedProgramLocalParameterIuivEXT glad_glGetNamedProgramLocalParameterIuivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC glad_glGetNamedProgramLocalParameterdvEXT; +#define glGetNamedProgramLocalParameterdvEXT glad_glGetNamedProgramLocalParameterdvEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC glad_glGetNamedProgramLocalParameterfvEXT; +#define glGetNamedProgramLocalParameterfvEXT glad_glGetNamedProgramLocalParameterfvEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMSTRINGEXTPROC glad_glGetNamedProgramStringEXT; +#define glGetNamedProgramStringEXT glad_glGetNamedProgramStringEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMIVEXTPROC glad_glGetNamedProgramivEXT; +#define glGetNamedProgramivEXT glad_glGetNamedProgramivEXT +GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv; +#define glGetNamedRenderbufferParameteriv glad_glGetNamedRenderbufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glad_glGetNamedRenderbufferParameterivEXT; +#define glGetNamedRenderbufferParameterivEXT glad_glGetNamedRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDSTRINGARBPROC glad_glGetNamedStringARB; +#define glGetNamedStringARB glad_glGetNamedStringARB +GLAD_API_CALL PFNGLGETNAMEDSTRINGIVARBPROC glad_glGetNamedStringivARB; +#define glGetNamedStringivARB glad_glGetNamedStringivARB +GLAD_API_CALL PFNGLGETNEXTPERFQUERYIDINTELPROC glad_glGetNextPerfQueryIdINTEL; +#define glGetNextPerfQueryIdINTEL glad_glGetNextPerfQueryIdINTEL +GLAD_API_CALL PFNGLGETOBJECTBUFFERFVATIPROC glad_glGetObjectBufferfvATI; +#define glGetObjectBufferfvATI glad_glGetObjectBufferfvATI +GLAD_API_CALL PFNGLGETOBJECTBUFFERIVATIPROC glad_glGetObjectBufferivATI; +#define glGetObjectBufferivATI glad_glGetObjectBufferivATI +GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; +#define glGetObjectLabel glad_glGetObjectLabel +GLAD_API_CALL PFNGLGETOBJECTLABELEXTPROC glad_glGetObjectLabelEXT; +#define glGetObjectLabelEXT glad_glGetObjectLabelEXT +GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB; +#define glGetObjectParameterfvARB glad_glGetObjectParameterfvARB +GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVAPPLEPROC glad_glGetObjectParameterivAPPLE; +#define glGetObjectParameterivAPPLE glad_glGetObjectParameterivAPPLE +GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB; +#define glGetObjectParameterivARB glad_glGetObjectParameterivARB +GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; +#define glGetObjectPtrLabel glad_glGetObjectPtrLabel +GLAD_API_CALL PFNGLGETOCCLUSIONQUERYIVNVPROC glad_glGetOcclusionQueryivNV; +#define glGetOcclusionQueryivNV glad_glGetOcclusionQueryivNV +GLAD_API_CALL PFNGLGETOCCLUSIONQUERYUIVNVPROC glad_glGetOcclusionQueryuivNV; +#define glGetOcclusionQueryuivNV glad_glGetOcclusionQueryuivNV +GLAD_API_CALL PFNGLGETPATHCOLORGENFVNVPROC glad_glGetPathColorGenfvNV; +#define glGetPathColorGenfvNV glad_glGetPathColorGenfvNV +GLAD_API_CALL PFNGLGETPATHCOLORGENIVNVPROC glad_glGetPathColorGenivNV; +#define glGetPathColorGenivNV glad_glGetPathColorGenivNV +GLAD_API_CALL PFNGLGETPATHCOMMANDSNVPROC glad_glGetPathCommandsNV; +#define glGetPathCommandsNV glad_glGetPathCommandsNV +GLAD_API_CALL PFNGLGETPATHCOORDSNVPROC glad_glGetPathCoordsNV; +#define glGetPathCoordsNV glad_glGetPathCoordsNV +GLAD_API_CALL PFNGLGETPATHDASHARRAYNVPROC glad_glGetPathDashArrayNV; +#define glGetPathDashArrayNV glad_glGetPathDashArrayNV +GLAD_API_CALL PFNGLGETPATHLENGTHNVPROC glad_glGetPathLengthNV; +#define glGetPathLengthNV glad_glGetPathLengthNV +GLAD_API_CALL PFNGLGETPATHMETRICRANGENVPROC glad_glGetPathMetricRangeNV; +#define glGetPathMetricRangeNV glad_glGetPathMetricRangeNV +GLAD_API_CALL PFNGLGETPATHMETRICSNVPROC glad_glGetPathMetricsNV; +#define glGetPathMetricsNV glad_glGetPathMetricsNV +GLAD_API_CALL PFNGLGETPATHPARAMETERFVNVPROC glad_glGetPathParameterfvNV; +#define glGetPathParameterfvNV glad_glGetPathParameterfvNV +GLAD_API_CALL PFNGLGETPATHPARAMETERIVNVPROC glad_glGetPathParameterivNV; +#define glGetPathParameterivNV glad_glGetPathParameterivNV +GLAD_API_CALL PFNGLGETPATHSPACINGNVPROC glad_glGetPathSpacingNV; +#define glGetPathSpacingNV glad_glGetPathSpacingNV +GLAD_API_CALL PFNGLGETPATHTEXGENFVNVPROC glad_glGetPathTexGenfvNV; +#define glGetPathTexGenfvNV glad_glGetPathTexGenfvNV +GLAD_API_CALL PFNGLGETPATHTEXGENIVNVPROC glad_glGetPathTexGenivNV; +#define glGetPathTexGenivNV glad_glGetPathTexGenivNV +GLAD_API_CALL PFNGLGETPERFCOUNTERINFOINTELPROC glad_glGetPerfCounterInfoINTEL; +#define glGetPerfCounterInfoINTEL glad_glGetPerfCounterInfoINTEL +GLAD_API_CALL PFNGLGETPERFMONITORCOUNTERDATAAMDPROC glad_glGetPerfMonitorCounterDataAMD; +#define glGetPerfMonitorCounterDataAMD glad_glGetPerfMonitorCounterDataAMD +GLAD_API_CALL PFNGLGETPERFMONITORCOUNTERINFOAMDPROC glad_glGetPerfMonitorCounterInfoAMD; +#define glGetPerfMonitorCounterInfoAMD glad_glGetPerfMonitorCounterInfoAMD +GLAD_API_CALL PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC glad_glGetPerfMonitorCounterStringAMD; +#define glGetPerfMonitorCounterStringAMD glad_glGetPerfMonitorCounterStringAMD +GLAD_API_CALL PFNGLGETPERFMONITORCOUNTERSAMDPROC glad_glGetPerfMonitorCountersAMD; +#define glGetPerfMonitorCountersAMD glad_glGetPerfMonitorCountersAMD +GLAD_API_CALL PFNGLGETPERFMONITORGROUPSTRINGAMDPROC glad_glGetPerfMonitorGroupStringAMD; +#define glGetPerfMonitorGroupStringAMD glad_glGetPerfMonitorGroupStringAMD +GLAD_API_CALL PFNGLGETPERFMONITORGROUPSAMDPROC glad_glGetPerfMonitorGroupsAMD; +#define glGetPerfMonitorGroupsAMD glad_glGetPerfMonitorGroupsAMD +GLAD_API_CALL PFNGLGETPERFQUERYDATAINTELPROC glad_glGetPerfQueryDataINTEL; +#define glGetPerfQueryDataINTEL glad_glGetPerfQueryDataINTEL +GLAD_API_CALL PFNGLGETPERFQUERYIDBYNAMEINTELPROC glad_glGetPerfQueryIdByNameINTEL; +#define glGetPerfQueryIdByNameINTEL glad_glGetPerfQueryIdByNameINTEL +GLAD_API_CALL PFNGLGETPERFQUERYINFOINTELPROC glad_glGetPerfQueryInfoINTEL; +#define glGetPerfQueryInfoINTEL glad_glGetPerfQueryInfoINTEL +GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv; +#define glGetPixelMapfv glad_glGetPixelMapfv +GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv; +#define glGetPixelMapuiv glad_glGetPixelMapuiv +GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv; +#define glGetPixelMapusv glad_glGetPixelMapusv +GLAD_API_CALL PFNGLGETPIXELMAPXVPROC glad_glGetPixelMapxv; +#define glGetPixelMapxv glad_glGetPixelMapxv +GLAD_API_CALL PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC glad_glGetPixelTexGenParameterfvSGIS; +#define glGetPixelTexGenParameterfvSGIS glad_glGetPixelTexGenParameterfvSGIS +GLAD_API_CALL PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC glad_glGetPixelTexGenParameterivSGIS; +#define glGetPixelTexGenParameterivSGIS glad_glGetPixelTexGenParameterivSGIS +GLAD_API_CALL PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC glad_glGetPixelTransformParameterfvEXT; +#define glGetPixelTransformParameterfvEXT glad_glGetPixelTransformParameterfvEXT +GLAD_API_CALL PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC glad_glGetPixelTransformParameterivEXT; +#define glGetPixelTransformParameterivEXT glad_glGetPixelTransformParameterivEXT +GLAD_API_CALL PFNGLGETPOINTERINDEXEDVEXTPROC glad_glGetPointerIndexedvEXT; +#define glGetPointerIndexedvEXT glad_glGetPointerIndexedvEXT +GLAD_API_CALL PFNGLGETPOINTERI_VEXTPROC glad_glGetPointeri_vEXT; +#define glGetPointeri_vEXT glad_glGetPointeri_vEXT +GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv; +#define glGetPointerv glad_glGetPointerv +GLAD_API_CALL PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT; +#define glGetPointervEXT glad_glGetPointervEXT +GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple; +#define glGetPolygonStipple glad_glGetPolygonStipple +GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; +#define glGetProgramBinary glad_glGetProgramBinary +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERIIVNVPROC glad_glGetProgramEnvParameterIivNV; +#define glGetProgramEnvParameterIivNV glad_glGetProgramEnvParameterIivNV +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC glad_glGetProgramEnvParameterIuivNV; +#define glGetProgramEnvParameterIuivNV glad_glGetProgramEnvParameterIuivNV +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB; +#define glGetProgramEnvParameterdvARB glad_glGetProgramEnvParameterdvARB +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB; +#define glGetProgramEnvParameterfvARB glad_glGetProgramEnvParameterfvARB +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; +#define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC glad_glGetProgramLocalParameterIivNV; +#define glGetProgramLocalParameterIivNV glad_glGetProgramLocalParameterIivNV +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC glad_glGetProgramLocalParameterIuivNV; +#define glGetProgramLocalParameterIuivNV glad_glGetProgramLocalParameterIuivNV +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB; +#define glGetProgramLocalParameterdvARB glad_glGetProgramLocalParameterdvARB +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB; +#define glGetProgramLocalParameterfvARB glad_glGetProgramLocalParameterfvARB +GLAD_API_CALL PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC glad_glGetProgramNamedParameterdvNV; +#define glGetProgramNamedParameterdvNV glad_glGetProgramNamedParameterdvNV +GLAD_API_CALL PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC glad_glGetProgramNamedParameterfvNV; +#define glGetProgramNamedParameterfvNV glad_glGetProgramNamedParameterfvNV +GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV; +#define glGetProgramParameterdvNV glad_glGetProgramParameterdvNV +GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV; +#define glGetProgramParameterfvNV glad_glGetProgramParameterfvNV +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; +#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; +#define glGetProgramPipelineiv glad_glGetProgramPipelineiv +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; +#define glGetProgramResourceIndex glad_glGetProgramResourceIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; +#define glGetProgramResourceLocation glad_glGetProgramResourceLocation +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex; +#define glGetProgramResourceLocationIndex glad_glGetProgramResourceLocationIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; +#define glGetProgramResourceName glad_glGetProgramResourceName +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEFVNVPROC glad_glGetProgramResourcefvNV; +#define glGetProgramResourcefvNV glad_glGetProgramResourcefvNV +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; +#define glGetProgramResourceiv glad_glGetProgramResourceiv +GLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv; +#define glGetProgramStageiv glad_glGetProgramStageiv +GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB; +#define glGetProgramStringARB glad_glGetProgramStringARB +GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV; +#define glGetProgramStringNV glad_glGetProgramStringNV +GLAD_API_CALL PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC glad_glGetProgramSubroutineParameteruivNV; +#define glGetProgramSubroutineParameteruivNV glad_glGetProgramSubroutineParameteruivNV +GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB; +#define glGetProgramivARB glad_glGetProgramivARB +GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV; +#define glGetProgramivNV glad_glGetProgramivNV +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v; +#define glGetQueryBufferObjecti64v glad_glGetQueryBufferObjecti64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv; +#define glGetQueryBufferObjectiv glad_glGetQueryBufferObjectiv +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v; +#define glGetQueryBufferObjectui64v glad_glGetQueryBufferObjectui64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv; +#define glGetQueryBufferObjectuiv glad_glGetQueryBufferObjectuiv +GLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv; +#define glGetQueryIndexediv glad_glGetQueryIndexediv +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VEXTPROC glad_glGetQueryObjecti64vEXT; +#define glGetQueryObjecti64vEXT glad_glGetQueryObjecti64vEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +GLAD_API_CALL PFNGLGETQUERYOBJECTIVARBPROC glad_glGetQueryObjectivARB; +#define glGetQueryObjectivARB glad_glGetQueryObjectivARB +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VEXTPROC glad_glGetQueryObjectui64vEXT; +#define glGetQueryObjectui64vEXT glad_glGetQueryObjectui64vEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVARBPROC glad_glGetQueryObjectuivARB; +#define glGetQueryObjectuivARB glad_glGetQueryObjectuivARB +GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +GLAD_API_CALL PFNGLGETQUERYIVARBPROC glad_glGetQueryivARB; +#define glGetQueryivARB glad_glGetQueryivARB +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT; +#define glGetRenderbufferParameterivEXT glad_glGetRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +GLAD_API_CALL PFNGLGETSEMAPHOREPARAMETERIVNVPROC glad_glGetSemaphoreParameterivNV; +#define glGetSemaphoreParameterivNV glad_glGetSemaphoreParameterivNV +GLAD_API_CALL PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC glad_glGetSemaphoreParameterui64vEXT; +#define glGetSemaphoreParameterui64vEXT glad_glGetSemaphoreParameterui64vEXT +GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter; +#define glGetSeparableFilter glad_glGetSeparableFilter +GLAD_API_CALL PFNGLGETSEPARABLEFILTEREXTPROC glad_glGetSeparableFilterEXT; +#define glGetSeparableFilterEXT glad_glGetSeparableFilterEXT +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; +#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat +GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB; +#define glGetShaderSourceARB glad_glGetShaderSourceARB +GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +GLAD_API_CALL PFNGLGETSHADINGRATEIMAGEPALETTENVPROC glad_glGetShadingRateImagePaletteNV; +#define glGetShadingRateImagePaletteNV glad_glGetShadingRateImagePaletteNV +GLAD_API_CALL PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC glad_glGetShadingRateSampleLocationivNV; +#define glGetShadingRateSampleLocationivNV glad_glGetShadingRateSampleLocationivNV +GLAD_API_CALL PFNGLGETSHARPENTEXFUNCSGISPROC glad_glGetSharpenTexFuncSGIS; +#define glGetSharpenTexFuncSGIS glad_glGetSharpenTexFuncSGIS +GLAD_API_CALL PFNGLGETSTAGEINDEXNVPROC glad_glGetStageIndexNV; +#define glGetStageIndexNV glad_glGetStageIndexNV +GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +GLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex; +#define glGetSubroutineIndex glad_glGetSubroutineIndex +GLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation; +#define glGetSubroutineUniformLocation glad_glGetSubroutineUniformLocation +GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +GLAD_API_CALL PFNGLGETTEXBUMPPARAMETERFVATIPROC glad_glGetTexBumpParameterfvATI; +#define glGetTexBumpParameterfvATI glad_glGetTexBumpParameterfvATI +GLAD_API_CALL PFNGLGETTEXBUMPPARAMETERIVATIPROC glad_glGetTexBumpParameterivATI; +#define glGetTexBumpParameterivATI glad_glGetTexBumpParameterivATI +GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv; +#define glGetTexEnvfv glad_glGetTexEnvfv +GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv; +#define glGetTexEnviv glad_glGetTexEnviv +GLAD_API_CALL PFNGLGETTEXENVXVOESPROC glad_glGetTexEnvxvOES; +#define glGetTexEnvxvOES glad_glGetTexEnvxvOES +GLAD_API_CALL PFNGLGETTEXFILTERFUNCSGISPROC glad_glGetTexFilterFuncSGIS; +#define glGetTexFilterFuncSGIS glad_glGetTexFilterFuncSGIS +GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv; +#define glGetTexGendv glad_glGetTexGendv +GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv; +#define glGetTexGenfv glad_glGetTexGenfv +GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv; +#define glGetTexGeniv glad_glGetTexGeniv +GLAD_API_CALL PFNGLGETTEXGENXVOESPROC glad_glGetTexGenxvOES; +#define glGetTexGenxvOES glad_glGetTexGenxvOES +GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERXVOESPROC glad_glGetTexLevelParameterxvOES; +#define glGetTexLevelParameterxvOES glad_glGetTexLevelParameterxvOES +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVEXTPROC glad_glGetTexParameterIivEXT; +#define glGetTexParameterIivEXT glad_glGetTexParameterIivEXT +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVEXTPROC glad_glGetTexParameterIuivEXT; +#define glGetTexParameterIuivEXT glad_glGetTexParameterIuivEXT +GLAD_API_CALL PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC glad_glGetTexParameterPointervAPPLE; +#define glGetTexParameterPointervAPPLE glad_glGetTexParameterPointervAPPLE +GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTEXPARAMETERXVOESPROC glad_glGetTexParameterxvOES; +#define glGetTexParameterxvOES glad_glGetTexParameterxvOES +GLAD_API_CALL PFNGLGETTEXTUREHANDLEARBPROC glad_glGetTextureHandleARB; +#define glGetTextureHandleARB glad_glGetTextureHandleARB +GLAD_API_CALL PFNGLGETTEXTUREHANDLENVPROC glad_glGetTextureHandleNV; +#define glGetTextureHandleNV glad_glGetTextureHandleNV +GLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage; +#define glGetTextureImage glad_glGetTextureImage +GLAD_API_CALL PFNGLGETTEXTUREIMAGEEXTPROC glad_glGetTextureImageEXT; +#define glGetTextureImageEXT glad_glGetTextureImageEXT +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv; +#define glGetTextureLevelParameterfv glad_glGetTextureLevelParameterfv +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC glad_glGetTextureLevelParameterfvEXT; +#define glGetTextureLevelParameterfvEXT glad_glGetTextureLevelParameterfvEXT +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv; +#define glGetTextureLevelParameteriv glad_glGetTextureLevelParameteriv +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC glad_glGetTextureLevelParameterivEXT; +#define glGetTextureLevelParameterivEXT glad_glGetTextureLevelParameterivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv; +#define glGetTextureParameterIiv glad_glGetTextureParameterIiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVEXTPROC glad_glGetTextureParameterIivEXT; +#define glGetTextureParameterIivEXT glad_glGetTextureParameterIivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv; +#define glGetTextureParameterIuiv glad_glGetTextureParameterIuiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVEXTPROC glad_glGetTextureParameterIuivEXT; +#define glGetTextureParameterIuivEXT glad_glGetTextureParameterIuivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv; +#define glGetTextureParameterfv glad_glGetTextureParameterfv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVEXTPROC glad_glGetTextureParameterfvEXT; +#define glGetTextureParameterfvEXT glad_glGetTextureParameterfvEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv; +#define glGetTextureParameteriv glad_glGetTextureParameteriv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVEXTPROC glad_glGetTextureParameterivEXT; +#define glGetTextureParameterivEXT glad_glGetTextureParameterivEXT +GLAD_API_CALL PFNGLGETTEXTURESAMPLERHANDLEARBPROC glad_glGetTextureSamplerHandleARB; +#define glGetTextureSamplerHandleARB glad_glGetTextureSamplerHandleARB +GLAD_API_CALL PFNGLGETTEXTURESAMPLERHANDLENVPROC glad_glGetTextureSamplerHandleNV; +#define glGetTextureSamplerHandleNV glad_glGetTextureSamplerHandleNV +GLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage; +#define glGetTextureSubImage glad_glGetTextureSubImage +GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV; +#define glGetTrackMatrixivNV glad_glGetTrackMatrixivNV +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC glad_glGetTransformFeedbackVaryingEXT; +#define glGetTransformFeedbackVaryingEXT glad_glGetTransformFeedbackVaryingEXT +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC glad_glGetTransformFeedbackVaryingNV; +#define glGetTransformFeedbackVaryingNV glad_glGetTransformFeedbackVaryingNV +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v; +#define glGetTransformFeedbacki64_v glad_glGetTransformFeedbacki64_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v; +#define glGetTransformFeedbacki_v glad_glGetTransformFeedbacki_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv; +#define glGetTransformFeedbackiv glad_glGetTransformFeedbackiv +GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +GLAD_API_CALL PFNGLGETUNIFORMBUFFERSIZEEXTPROC glad_glGetUniformBufferSizeEXT; +#define glGetUniformBufferSizeEXT glad_glGetUniformBufferSizeEXT +GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB; +#define glGetUniformLocationARB glad_glGetUniformLocationARB +GLAD_API_CALL PFNGLGETUNIFORMOFFSETEXTPROC glad_glGetUniformOffsetEXT; +#define glGetUniformOffsetEXT glad_glGetUniformOffsetEXT +GLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv; +#define glGetUniformSubroutineuiv glad_glGetUniformSubroutineuiv +GLAD_API_CALL PFNGLGETUNIFORMDVPROC glad_glGetUniformdv; +#define glGetUniformdv glad_glGetUniformdv +GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB; +#define glGetUniformfvARB glad_glGetUniformfvARB +GLAD_API_CALL PFNGLGETUNIFORMI64VARBPROC glad_glGetUniformi64vARB; +#define glGetUniformi64vARB glad_glGetUniformi64vARB +GLAD_API_CALL PFNGLGETUNIFORMI64VNVPROC glad_glGetUniformi64vNV; +#define glGetUniformi64vNV glad_glGetUniformi64vNV +GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB; +#define glGetUniformivARB glad_glGetUniformivARB +GLAD_API_CALL PFNGLGETUNIFORMUI64VARBPROC glad_glGetUniformui64vARB; +#define glGetUniformui64vARB glad_glGetUniformui64vARB +GLAD_API_CALL PFNGLGETUNIFORMUI64VNVPROC glad_glGetUniformui64vNV; +#define glGetUniformui64vNV glad_glGetUniformui64vNV +GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +GLAD_API_CALL PFNGLGETUNIFORMUIVEXTPROC glad_glGetUniformuivEXT; +#define glGetUniformuivEXT glad_glGetUniformuivEXT +GLAD_API_CALL PFNGLGETUNSIGNEDBYTEI_VEXTPROC glad_glGetUnsignedBytei_vEXT; +#define glGetUnsignedBytei_vEXT glad_glGetUnsignedBytei_vEXT +GLAD_API_CALL PFNGLGETUNSIGNEDBYTEVEXTPROC glad_glGetUnsignedBytevEXT; +#define glGetUnsignedBytevEXT glad_glGetUnsignedBytevEXT +GLAD_API_CALL PFNGLGETVARIANTARRAYOBJECTFVATIPROC glad_glGetVariantArrayObjectfvATI; +#define glGetVariantArrayObjectfvATI glad_glGetVariantArrayObjectfvATI +GLAD_API_CALL PFNGLGETVARIANTARRAYOBJECTIVATIPROC glad_glGetVariantArrayObjectivATI; +#define glGetVariantArrayObjectivATI glad_glGetVariantArrayObjectivATI +GLAD_API_CALL PFNGLGETVARIANTBOOLEANVEXTPROC glad_glGetVariantBooleanvEXT; +#define glGetVariantBooleanvEXT glad_glGetVariantBooleanvEXT +GLAD_API_CALL PFNGLGETVARIANTFLOATVEXTPROC glad_glGetVariantFloatvEXT; +#define glGetVariantFloatvEXT glad_glGetVariantFloatvEXT +GLAD_API_CALL PFNGLGETVARIANTINTEGERVEXTPROC glad_glGetVariantIntegervEXT; +#define glGetVariantIntegervEXT glad_glGetVariantIntegervEXT +GLAD_API_CALL PFNGLGETVARIANTPOINTERVEXTPROC glad_glGetVariantPointervEXT; +#define glGetVariantPointervEXT glad_glGetVariantPointervEXT +GLAD_API_CALL PFNGLGETVARYINGLOCATIONNVPROC glad_glGetVaryingLocationNV; +#define glGetVaryingLocationNV glad_glGetVaryingLocationNV +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv; +#define glGetVertexArrayIndexed64iv glad_glGetVertexArrayIndexed64iv +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv; +#define glGetVertexArrayIndexediv glad_glGetVertexArrayIndexediv +GLAD_API_CALL PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glad_glGetVertexArrayIntegeri_vEXT; +#define glGetVertexArrayIntegeri_vEXT glad_glGetVertexArrayIntegeri_vEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYINTEGERVEXTPROC glad_glGetVertexArrayIntegervEXT; +#define glGetVertexArrayIntegervEXT glad_glGetVertexArrayIntegervEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC glad_glGetVertexArrayPointeri_vEXT; +#define glGetVertexArrayPointeri_vEXT glad_glGetVertexArrayPointeri_vEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYPOINTERVEXTPROC glad_glGetVertexArrayPointervEXT; +#define glGetVertexArrayPointervEXT glad_glGetVertexArrayPointervEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv; +#define glGetVertexArrayiv glad_glGetVertexArrayiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC glad_glGetVertexAttribArrayObjectfvATI; +#define glGetVertexAttribArrayObjectfvATI glad_glGetVertexAttribArrayObjectfvATI +GLAD_API_CALL PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC glad_glGetVertexAttribArrayObjectivATI; +#define glGetVertexAttribArrayObjectivATI glad_glGetVertexAttribArrayObjectivATI +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVEXTPROC glad_glGetVertexAttribIivEXT; +#define glGetVertexAttribIivEXT glad_glGetVertexAttribIivEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVEXTPROC glad_glGetVertexAttribIuivEXT; +#define glGetVertexAttribIuivEXT glad_glGetVertexAttribIuivEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv; +#define glGetVertexAttribLdv glad_glGetVertexAttribLdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVEXTPROC glad_glGetVertexAttribLdvEXT; +#define glGetVertexAttribLdvEXT glad_glGetVertexAttribLdvEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBLI64VNVPROC glad_glGetVertexAttribLi64vNV; +#define glGetVertexAttribLi64vNV glad_glGetVertexAttribLi64vNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBLUI64VARBPROC glad_glGetVertexAttribLui64vARB; +#define glGetVertexAttribLui64vARB glad_glGetVertexAttribLui64vARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBLUI64VNVPROC glad_glGetVertexAttribLui64vNV; +#define glGetVertexAttribLui64vNV glad_glGetVertexAttribLui64vNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB; +#define glGetVertexAttribPointervARB glad_glGetVertexAttribPointervARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV; +#define glGetVertexAttribPointervNV glad_glGetVertexAttribPointervNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB; +#define glGetVertexAttribdvARB glad_glGetVertexAttribdvARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV; +#define glGetVertexAttribdvNV glad_glGetVertexAttribdvNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB; +#define glGetVertexAttribfvARB glad_glGetVertexAttribfvARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV; +#define glGetVertexAttribfvNV glad_glGetVertexAttribfvNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB; +#define glGetVertexAttribivARB glad_glGetVertexAttribivARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV; +#define glGetVertexAttribivNV glad_glGetVertexAttribivNV +GLAD_API_CALL PFNGLGETVIDEOCAPTURESTREAMDVNVPROC glad_glGetVideoCaptureStreamdvNV; +#define glGetVideoCaptureStreamdvNV glad_glGetVideoCaptureStreamdvNV +GLAD_API_CALL PFNGLGETVIDEOCAPTURESTREAMFVNVPROC glad_glGetVideoCaptureStreamfvNV; +#define glGetVideoCaptureStreamfvNV glad_glGetVideoCaptureStreamfvNV +GLAD_API_CALL PFNGLGETVIDEOCAPTURESTREAMIVNVPROC glad_glGetVideoCaptureStreamivNV; +#define glGetVideoCaptureStreamivNV glad_glGetVideoCaptureStreamivNV +GLAD_API_CALL PFNGLGETVIDEOCAPTUREIVNVPROC glad_glGetVideoCaptureivNV; +#define glGetVideoCaptureivNV glad_glGetVideoCaptureivNV +GLAD_API_CALL PFNGLGETVIDEOI64VNVPROC glad_glGetVideoi64vNV; +#define glGetVideoi64vNV glad_glGetVideoi64vNV +GLAD_API_CALL PFNGLGETVIDEOIVNVPROC glad_glGetVideoivNV; +#define glGetVideoivNV glad_glGetVideoivNV +GLAD_API_CALL PFNGLGETVIDEOUI64VNVPROC glad_glGetVideoui64vNV; +#define glGetVideoui64vNV glad_glGetVideoui64vNV +GLAD_API_CALL PFNGLGETVIDEOUIVNVPROC glad_glGetVideouivNV; +#define glGetVideouivNV glad_glGetVideouivNV +GLAD_API_CALL PFNGLGETVKPROCADDRNVPROC glad_glGetVkProcAddrNV; +#define glGetVkProcAddrNV glad_glGetVkProcAddrNV +GLAD_API_CALL PFNGLGETNCOLORTABLEPROC glad_glGetnColorTable; +#define glGetnColorTable glad_glGetnColorTable +GLAD_API_CALL PFNGLGETNCOLORTABLEARBPROC glad_glGetnColorTableARB; +#define glGetnColorTableARB glad_glGetnColorTableARB +GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage; +#define glGetnCompressedTexImage glad_glGetnCompressedTexImage +GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC glad_glGetnCompressedTexImageARB; +#define glGetnCompressedTexImageARB glad_glGetnCompressedTexImageARB +GLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter; +#define glGetnConvolutionFilter glad_glGetnConvolutionFilter +GLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERARBPROC glad_glGetnConvolutionFilterARB; +#define glGetnConvolutionFilterARB glad_glGetnConvolutionFilterARB +GLAD_API_CALL PFNGLGETNHISTOGRAMPROC glad_glGetnHistogram; +#define glGetnHistogram glad_glGetnHistogram +GLAD_API_CALL PFNGLGETNHISTOGRAMARBPROC glad_glGetnHistogramARB; +#define glGetnHistogramARB glad_glGetnHistogramARB +GLAD_API_CALL PFNGLGETNMAPDVPROC glad_glGetnMapdv; +#define glGetnMapdv glad_glGetnMapdv +GLAD_API_CALL PFNGLGETNMAPDVARBPROC glad_glGetnMapdvARB; +#define glGetnMapdvARB glad_glGetnMapdvARB +GLAD_API_CALL PFNGLGETNMAPFVPROC glad_glGetnMapfv; +#define glGetnMapfv glad_glGetnMapfv +GLAD_API_CALL PFNGLGETNMAPFVARBPROC glad_glGetnMapfvARB; +#define glGetnMapfvARB glad_glGetnMapfvARB +GLAD_API_CALL PFNGLGETNMAPIVPROC glad_glGetnMapiv; +#define glGetnMapiv glad_glGetnMapiv +GLAD_API_CALL PFNGLGETNMAPIVARBPROC glad_glGetnMapivARB; +#define glGetnMapivARB glad_glGetnMapivARB +GLAD_API_CALL PFNGLGETNMINMAXPROC glad_glGetnMinmax; +#define glGetnMinmax glad_glGetnMinmax +GLAD_API_CALL PFNGLGETNMINMAXARBPROC glad_glGetnMinmaxARB; +#define glGetnMinmaxARB glad_glGetnMinmaxARB +GLAD_API_CALL PFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv; +#define glGetnPixelMapfv glad_glGetnPixelMapfv +GLAD_API_CALL PFNGLGETNPIXELMAPFVARBPROC glad_glGetnPixelMapfvARB; +#define glGetnPixelMapfvARB glad_glGetnPixelMapfvARB +GLAD_API_CALL PFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv; +#define glGetnPixelMapuiv glad_glGetnPixelMapuiv +GLAD_API_CALL PFNGLGETNPIXELMAPUIVARBPROC glad_glGetnPixelMapuivARB; +#define glGetnPixelMapuivARB glad_glGetnPixelMapuivARB +GLAD_API_CALL PFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv; +#define glGetnPixelMapusv glad_glGetnPixelMapusv +GLAD_API_CALL PFNGLGETNPIXELMAPUSVARBPROC glad_glGetnPixelMapusvARB; +#define glGetnPixelMapusvARB glad_glGetnPixelMapusvARB +GLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple; +#define glGetnPolygonStipple glad_glGetnPolygonStipple +GLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEARBPROC glad_glGetnPolygonStippleARB; +#define glGetnPolygonStippleARB glad_glGetnPolygonStippleARB +GLAD_API_CALL PFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter; +#define glGetnSeparableFilter glad_glGetnSeparableFilter +GLAD_API_CALL PFNGLGETNSEPARABLEFILTERARBPROC glad_glGetnSeparableFilterARB; +#define glGetnSeparableFilterARB glad_glGetnSeparableFilterARB +GLAD_API_CALL PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage; +#define glGetnTexImage glad_glGetnTexImage +GLAD_API_CALL PFNGLGETNTEXIMAGEARBPROC glad_glGetnTexImageARB; +#define glGetnTexImageARB glad_glGetnTexImageARB +GLAD_API_CALL PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv; +#define glGetnUniformdv glad_glGetnUniformdv +GLAD_API_CALL PFNGLGETNUNIFORMDVARBPROC glad_glGetnUniformdvARB; +#define glGetnUniformdvARB glad_glGetnUniformdvARB +GLAD_API_CALL PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv; +#define glGetnUniformfv glad_glGetnUniformfv +GLAD_API_CALL PFNGLGETNUNIFORMFVARBPROC glad_glGetnUniformfvARB; +#define glGetnUniformfvARB glad_glGetnUniformfvARB +GLAD_API_CALL PFNGLGETNUNIFORMI64VARBPROC glad_glGetnUniformi64vARB; +#define glGetnUniformi64vARB glad_glGetnUniformi64vARB +GLAD_API_CALL PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv; +#define glGetnUniformiv glad_glGetnUniformiv +GLAD_API_CALL PFNGLGETNUNIFORMIVARBPROC glad_glGetnUniformivARB; +#define glGetnUniformivARB glad_glGetnUniformivARB +GLAD_API_CALL PFNGLGETNUNIFORMUI64VARBPROC glad_glGetnUniformui64vARB; +#define glGetnUniformui64vARB glad_glGetnUniformui64vARB +GLAD_API_CALL PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv; +#define glGetnUniformuiv glad_glGetnUniformuiv +GLAD_API_CALL PFNGLGETNUNIFORMUIVARBPROC glad_glGetnUniformuivARB; +#define glGetnUniformuivARB glad_glGetnUniformuivARB +GLAD_API_CALL PFNGLGLOBALALPHAFACTORBSUNPROC glad_glGlobalAlphaFactorbSUN; +#define glGlobalAlphaFactorbSUN glad_glGlobalAlphaFactorbSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORDSUNPROC glad_glGlobalAlphaFactordSUN; +#define glGlobalAlphaFactordSUN glad_glGlobalAlphaFactordSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORFSUNPROC glad_glGlobalAlphaFactorfSUN; +#define glGlobalAlphaFactorfSUN glad_glGlobalAlphaFactorfSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORISUNPROC glad_glGlobalAlphaFactoriSUN; +#define glGlobalAlphaFactoriSUN glad_glGlobalAlphaFactoriSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORSSUNPROC glad_glGlobalAlphaFactorsSUN; +#define glGlobalAlphaFactorsSUN glad_glGlobalAlphaFactorsSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORUBSUNPROC glad_glGlobalAlphaFactorubSUN; +#define glGlobalAlphaFactorubSUN glad_glGlobalAlphaFactorubSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORUISUNPROC glad_glGlobalAlphaFactoruiSUN; +#define glGlobalAlphaFactoruiSUN glad_glGlobalAlphaFactoruiSUN +GLAD_API_CALL PFNGLGLOBALALPHAFACTORUSSUNPROC glad_glGlobalAlphaFactorusSUN; +#define glGlobalAlphaFactorusSUN glad_glGlobalAlphaFactorusSUN +GLAD_API_CALL PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +GLAD_API_CALL PFNGLHINTPGIPROC glad_glHintPGI; +#define glHintPGI glad_glHintPGI +GLAD_API_CALL PFNGLHISTOGRAMPROC glad_glHistogram; +#define glHistogram glad_glHistogram +GLAD_API_CALL PFNGLHISTOGRAMEXTPROC glad_glHistogramEXT; +#define glHistogramEXT glad_glHistogramEXT +GLAD_API_CALL PFNGLIGLOOINTERFACESGIXPROC glad_glIglooInterfaceSGIX; +#define glIglooInterfaceSGIX glad_glIglooInterfaceSGIX +GLAD_API_CALL PFNGLIMAGETRANSFORMPARAMETERFHPPROC glad_glImageTransformParameterfHP; +#define glImageTransformParameterfHP glad_glImageTransformParameterfHP +GLAD_API_CALL PFNGLIMAGETRANSFORMPARAMETERFVHPPROC glad_glImageTransformParameterfvHP; +#define glImageTransformParameterfvHP glad_glImageTransformParameterfvHP +GLAD_API_CALL PFNGLIMAGETRANSFORMPARAMETERIHPPROC glad_glImageTransformParameteriHP; +#define glImageTransformParameteriHP glad_glImageTransformParameteriHP +GLAD_API_CALL PFNGLIMAGETRANSFORMPARAMETERIVHPPROC glad_glImageTransformParameterivHP; +#define glImageTransformParameterivHP glad_glImageTransformParameterivHP +GLAD_API_CALL PFNGLIMPORTMEMORYFDEXTPROC glad_glImportMemoryFdEXT; +#define glImportMemoryFdEXT glad_glImportMemoryFdEXT +GLAD_API_CALL PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC glad_glImportMemoryWin32HandleEXT; +#define glImportMemoryWin32HandleEXT glad_glImportMemoryWin32HandleEXT +GLAD_API_CALL PFNGLIMPORTMEMORYWIN32NAMEEXTPROC glad_glImportMemoryWin32NameEXT; +#define glImportMemoryWin32NameEXT glad_glImportMemoryWin32NameEXT +GLAD_API_CALL PFNGLIMPORTSEMAPHOREFDEXTPROC glad_glImportSemaphoreFdEXT; +#define glImportSemaphoreFdEXT glad_glImportSemaphoreFdEXT +GLAD_API_CALL PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC glad_glImportSemaphoreWin32HandleEXT; +#define glImportSemaphoreWin32HandleEXT glad_glImportSemaphoreWin32HandleEXT +GLAD_API_CALL PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC glad_glImportSemaphoreWin32NameEXT; +#define glImportSemaphoreWin32NameEXT glad_glImportSemaphoreWin32NameEXT +GLAD_API_CALL PFNGLIMPORTSYNCEXTPROC glad_glImportSyncEXT; +#define glImportSyncEXT glad_glImportSyncEXT +GLAD_API_CALL PFNGLINDEXFORMATNVPROC glad_glIndexFormatNV; +#define glIndexFormatNV glad_glIndexFormatNV +GLAD_API_CALL PFNGLINDEXFUNCEXTPROC glad_glIndexFuncEXT; +#define glIndexFuncEXT glad_glIndexFuncEXT +GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask; +#define glIndexMask glad_glIndexMask +GLAD_API_CALL PFNGLINDEXMATERIALEXTPROC glad_glIndexMaterialEXT; +#define glIndexMaterialEXT glad_glIndexMaterialEXT +GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer; +#define glIndexPointer glad_glIndexPointer +GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT; +#define glIndexPointerEXT glad_glIndexPointerEXT +GLAD_API_CALL PFNGLINDEXPOINTERLISTIBMPROC glad_glIndexPointerListIBM; +#define glIndexPointerListIBM glad_glIndexPointerListIBM +GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd; +#define glIndexd glad_glIndexd +GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv; +#define glIndexdv glad_glIndexdv +GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf; +#define glIndexf glad_glIndexf +GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv; +#define glIndexfv glad_glIndexfv +GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi; +#define glIndexi glad_glIndexi +GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv; +#define glIndexiv glad_glIndexiv +GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs; +#define glIndexs glad_glIndexs +GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv; +#define glIndexsv glad_glIndexsv +GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub; +#define glIndexub glad_glIndexub +GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv; +#define glIndexubv glad_glIndexubv +GLAD_API_CALL PFNGLINDEXXOESPROC glad_glIndexxOES; +#define glIndexxOES glad_glIndexxOES +GLAD_API_CALL PFNGLINDEXXVOESPROC glad_glIndexxvOES; +#define glIndexxvOES glad_glIndexxvOES +GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames; +#define glInitNames glad_glInitNames +GLAD_API_CALL PFNGLINSERTCOMPONENTEXTPROC glad_glInsertComponentEXT; +#define glInsertComponentEXT glad_glInsertComponentEXT +GLAD_API_CALL PFNGLINSERTEVENTMARKEREXTPROC glad_glInsertEventMarkerEXT; +#define glInsertEventMarkerEXT glad_glInsertEventMarkerEXT +GLAD_API_CALL PFNGLINSTRUMENTSBUFFERSGIXPROC glad_glInstrumentsBufferSGIX; +#define glInstrumentsBufferSGIX glad_glInstrumentsBufferSGIX +GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays; +#define glInterleavedArrays glad_glInterleavedArrays +GLAD_API_CALL PFNGLINTERPOLATEPATHSNVPROC glad_glInterpolatePathsNV; +#define glInterpolatePathsNV glad_glInterpolatePathsNV +GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData; +#define glInvalidateBufferData glad_glInvalidateBufferData +GLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData; +#define glInvalidateBufferSubData glad_glInvalidateBufferSubData +GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; +#define glInvalidateFramebuffer glad_glInvalidateFramebuffer +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData; +#define glInvalidateNamedFramebufferData glad_glInvalidateNamedFramebufferData +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData; +#define glInvalidateNamedFramebufferSubData glad_glInvalidateNamedFramebufferSubData +GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; +#define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer +GLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage; +#define glInvalidateTexImage glad_glInvalidateTexImage +GLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage; +#define glInvalidateTexSubImage glad_glInvalidateTexSubImage +GLAD_API_CALL PFNGLISASYNCMARKERSGIXPROC glad_glIsAsyncMarkerSGIX; +#define glIsAsyncMarkerSGIX glad_glIsAsyncMarkerSGIX +GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +GLAD_API_CALL PFNGLISBUFFERARBPROC glad_glIsBufferARB; +#define glIsBufferARB glad_glIsBufferARB +GLAD_API_CALL PFNGLISBUFFERRESIDENTNVPROC glad_glIsBufferResidentNV; +#define glIsBufferResidentNV glad_glIsBufferResidentNV +GLAD_API_CALL PFNGLISCOMMANDLISTNVPROC glad_glIsCommandListNV; +#define glIsCommandListNV glad_glIsCommandListNV +GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +GLAD_API_CALL PFNGLISENABLEDINDEXEDEXTPROC glad_glIsEnabledIndexedEXT; +#define glIsEnabledIndexedEXT glad_glIsEnabledIndexedEXT +GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +GLAD_API_CALL PFNGLISFENCEAPPLEPROC glad_glIsFenceAPPLE; +#define glIsFenceAPPLE glad_glIsFenceAPPLE +GLAD_API_CALL PFNGLISFENCENVPROC glad_glIsFenceNV; +#define glIsFenceNV glad_glIsFenceNV +GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT; +#define glIsFramebufferEXT glad_glIsFramebufferEXT +GLAD_API_CALL PFNGLISIMAGEHANDLERESIDENTARBPROC glad_glIsImageHandleResidentARB; +#define glIsImageHandleResidentARB glad_glIsImageHandleResidentARB +GLAD_API_CALL PFNGLISIMAGEHANDLERESIDENTNVPROC glad_glIsImageHandleResidentNV; +#define glIsImageHandleResidentNV glad_glIsImageHandleResidentNV +GLAD_API_CALL PFNGLISLISTPROC glad_glIsList; +#define glIsList glad_glIsList +GLAD_API_CALL PFNGLISMEMORYOBJECTEXTPROC glad_glIsMemoryObjectEXT; +#define glIsMemoryObjectEXT glad_glIsMemoryObjectEXT +GLAD_API_CALL PFNGLISNAMEAMDPROC glad_glIsNameAMD; +#define glIsNameAMD glad_glIsNameAMD +GLAD_API_CALL PFNGLISNAMEDBUFFERRESIDENTNVPROC glad_glIsNamedBufferResidentNV; +#define glIsNamedBufferResidentNV glad_glIsNamedBufferResidentNV +GLAD_API_CALL PFNGLISNAMEDSTRINGARBPROC glad_glIsNamedStringARB; +#define glIsNamedStringARB glad_glIsNamedStringARB +GLAD_API_CALL PFNGLISOBJECTBUFFERATIPROC glad_glIsObjectBufferATI; +#define glIsObjectBufferATI glad_glIsObjectBufferATI +GLAD_API_CALL PFNGLISOCCLUSIONQUERYNVPROC glad_glIsOcclusionQueryNV; +#define glIsOcclusionQueryNV glad_glIsOcclusionQueryNV +GLAD_API_CALL PFNGLISPATHNVPROC glad_glIsPathNV; +#define glIsPathNV glad_glIsPathNV +GLAD_API_CALL PFNGLISPOINTINFILLPATHNVPROC glad_glIsPointInFillPathNV; +#define glIsPointInFillPathNV glad_glIsPointInFillPathNV +GLAD_API_CALL PFNGLISPOINTINSTROKEPATHNVPROC glad_glIsPointInStrokePathNV; +#define glIsPointInStrokePathNV glad_glIsPointInStrokePathNV +GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +GLAD_API_CALL PFNGLISPROGRAMARBPROC glad_glIsProgramARB; +#define glIsProgramARB glad_glIsProgramARB +GLAD_API_CALL PFNGLISPROGRAMNVPROC glad_glIsProgramNV; +#define glIsProgramNV glad_glIsProgramNV +GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; +#define glIsProgramPipeline glad_glIsProgramPipeline +GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +GLAD_API_CALL PFNGLISQUERYARBPROC glad_glIsQueryARB; +#define glIsQueryARB glad_glIsQueryARB +GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT; +#define glIsRenderbufferEXT glad_glIsRenderbufferEXT +GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +GLAD_API_CALL PFNGLISSEMAPHOREEXTPROC glad_glIsSemaphoreEXT; +#define glIsSemaphoreEXT glad_glIsSemaphoreEXT +GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +GLAD_API_CALL PFNGLISSTATENVPROC glad_glIsStateNV; +#define glIsStateNV glad_glIsStateNV +GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +GLAD_API_CALL PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT; +#define glIsTextureEXT glad_glIsTextureEXT +GLAD_API_CALL PFNGLISTEXTUREHANDLERESIDENTARBPROC glad_glIsTextureHandleResidentARB; +#define glIsTextureHandleResidentARB glad_glIsTextureHandleResidentARB +GLAD_API_CALL PFNGLISTEXTUREHANDLERESIDENTNVPROC glad_glIsTextureHandleResidentNV; +#define glIsTextureHandleResidentNV glad_glIsTextureHandleResidentNV +GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; +#define glIsTransformFeedback glad_glIsTransformFeedback +GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKNVPROC glad_glIsTransformFeedbackNV; +#define glIsTransformFeedbackNV glad_glIsTransformFeedbackNV +GLAD_API_CALL PFNGLISVARIANTENABLEDEXTPROC glad_glIsVariantEnabledEXT; +#define glIsVariantEnabledEXT glad_glIsVariantEnabledEXT +GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +GLAD_API_CALL PFNGLISVERTEXARRAYAPPLEPROC glad_glIsVertexArrayAPPLE; +#define glIsVertexArrayAPPLE glad_glIsVertexArrayAPPLE +GLAD_API_CALL PFNGLISVERTEXATTRIBENABLEDAPPLEPROC glad_glIsVertexAttribEnabledAPPLE; +#define glIsVertexAttribEnabledAPPLE glad_glIsVertexAttribEnabledAPPLE +GLAD_API_CALL PFNGLLGPUCOPYIMAGESUBDATANVXPROC glad_glLGPUCopyImageSubDataNVX; +#define glLGPUCopyImageSubDataNVX glad_glLGPUCopyImageSubDataNVX +GLAD_API_CALL PFNGLLGPUINTERLOCKNVXPROC glad_glLGPUInterlockNVX; +#define glLGPUInterlockNVX glad_glLGPUInterlockNVX +GLAD_API_CALL PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC glad_glLGPUNamedBufferSubDataNVX; +#define glLGPUNamedBufferSubDataNVX glad_glLGPUNamedBufferSubDataNVX +GLAD_API_CALL PFNGLLABELOBJECTEXTPROC glad_glLabelObjectEXT; +#define glLabelObjectEXT glad_glLabelObjectEXT +GLAD_API_CALL PFNGLLIGHTENVISGIXPROC glad_glLightEnviSGIX; +#define glLightEnviSGIX glad_glLightEnviSGIX +GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf; +#define glLightModelf glad_glLightModelf +GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv; +#define glLightModelfv glad_glLightModelfv +GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli; +#define glLightModeli glad_glLightModeli +GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv; +#define glLightModeliv glad_glLightModeliv +GLAD_API_CALL PFNGLLIGHTMODELXOESPROC glad_glLightModelxOES; +#define glLightModelxOES glad_glLightModelxOES +GLAD_API_CALL PFNGLLIGHTMODELXVOESPROC glad_glLightModelxvOES; +#define glLightModelxvOES glad_glLightModelxvOES +GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf; +#define glLightf glad_glLightf +GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv; +#define glLightfv glad_glLightfv +GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti; +#define glLighti glad_glLighti +GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv; +#define glLightiv glad_glLightiv +GLAD_API_CALL PFNGLLIGHTXOESPROC glad_glLightxOES; +#define glLightxOES glad_glLightxOES +GLAD_API_CALL PFNGLLIGHTXVOESPROC glad_glLightxvOES; +#define glLightxvOES glad_glLightxvOES +GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple; +#define glLineStipple glad_glLineStipple +GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +GLAD_API_CALL PFNGLLINEWIDTHXOESPROC glad_glLineWidthxOES; +#define glLineWidthxOES glad_glLineWidthxOES +GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +GLAD_API_CALL PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB; +#define glLinkProgramARB glad_glLinkProgramARB +GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase; +#define glListBase glad_glListBase +GLAD_API_CALL PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC glad_glListDrawCommandsStatesClientNV; +#define glListDrawCommandsStatesClientNV glad_glListDrawCommandsStatesClientNV +GLAD_API_CALL PFNGLLISTPARAMETERFSGIXPROC glad_glListParameterfSGIX; +#define glListParameterfSGIX glad_glListParameterfSGIX +GLAD_API_CALL PFNGLLISTPARAMETERFVSGIXPROC glad_glListParameterfvSGIX; +#define glListParameterfvSGIX glad_glListParameterfvSGIX +GLAD_API_CALL PFNGLLISTPARAMETERISGIXPROC glad_glListParameteriSGIX; +#define glListParameteriSGIX glad_glListParameteriSGIX +GLAD_API_CALL PFNGLLISTPARAMETERIVSGIXPROC glad_glListParameterivSGIX; +#define glListParameterivSGIX glad_glListParameterivSGIX +GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity; +#define glLoadIdentity glad_glLoadIdentity +GLAD_API_CALL PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC glad_glLoadIdentityDeformationMapSGIX; +#define glLoadIdentityDeformationMapSGIX glad_glLoadIdentityDeformationMapSGIX +GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd; +#define glLoadMatrixd glad_glLoadMatrixd +GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf; +#define glLoadMatrixf glad_glLoadMatrixf +GLAD_API_CALL PFNGLLOADMATRIXXOESPROC glad_glLoadMatrixxOES; +#define glLoadMatrixxOES glad_glLoadMatrixxOES +GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName; +#define glLoadName glad_glLoadName +GLAD_API_CALL PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV; +#define glLoadProgramNV glad_glLoadProgramNV +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd; +#define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDARBPROC glad_glLoadTransposeMatrixdARB; +#define glLoadTransposeMatrixdARB glad_glLoadTransposeMatrixdARB +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf; +#define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFARBPROC glad_glLoadTransposeMatrixfARB; +#define glLoadTransposeMatrixfARB glad_glLoadTransposeMatrixfARB +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXXOESPROC glad_glLoadTransposeMatrixxOES; +#define glLoadTransposeMatrixxOES glad_glLoadTransposeMatrixxOES +GLAD_API_CALL PFNGLLOCKARRAYSEXTPROC glad_glLockArraysEXT; +#define glLockArraysEXT glad_glLockArraysEXT +GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +GLAD_API_CALL PFNGLMAKEBUFFERNONRESIDENTNVPROC glad_glMakeBufferNonResidentNV; +#define glMakeBufferNonResidentNV glad_glMakeBufferNonResidentNV +GLAD_API_CALL PFNGLMAKEBUFFERRESIDENTNVPROC glad_glMakeBufferResidentNV; +#define glMakeBufferResidentNV glad_glMakeBufferResidentNV +GLAD_API_CALL PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC glad_glMakeImageHandleNonResidentARB; +#define glMakeImageHandleNonResidentARB glad_glMakeImageHandleNonResidentARB +GLAD_API_CALL PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC glad_glMakeImageHandleNonResidentNV; +#define glMakeImageHandleNonResidentNV glad_glMakeImageHandleNonResidentNV +GLAD_API_CALL PFNGLMAKEIMAGEHANDLERESIDENTARBPROC glad_glMakeImageHandleResidentARB; +#define glMakeImageHandleResidentARB glad_glMakeImageHandleResidentARB +GLAD_API_CALL PFNGLMAKEIMAGEHANDLERESIDENTNVPROC glad_glMakeImageHandleResidentNV; +#define glMakeImageHandleResidentNV glad_glMakeImageHandleResidentNV +GLAD_API_CALL PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC glad_glMakeNamedBufferNonResidentNV; +#define glMakeNamedBufferNonResidentNV glad_glMakeNamedBufferNonResidentNV +GLAD_API_CALL PFNGLMAKENAMEDBUFFERRESIDENTNVPROC glad_glMakeNamedBufferResidentNV; +#define glMakeNamedBufferResidentNV glad_glMakeNamedBufferResidentNV +GLAD_API_CALL PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC glad_glMakeTextureHandleNonResidentARB; +#define glMakeTextureHandleNonResidentARB glad_glMakeTextureHandleNonResidentARB +GLAD_API_CALL PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC glad_glMakeTextureHandleNonResidentNV; +#define glMakeTextureHandleNonResidentNV glad_glMakeTextureHandleNonResidentNV +GLAD_API_CALL PFNGLMAKETEXTUREHANDLERESIDENTARBPROC glad_glMakeTextureHandleResidentARB; +#define glMakeTextureHandleResidentARB glad_glMakeTextureHandleResidentARB +GLAD_API_CALL PFNGLMAKETEXTUREHANDLERESIDENTNVPROC glad_glMakeTextureHandleResidentNV; +#define glMakeTextureHandleResidentNV glad_glMakeTextureHandleResidentNV +GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d; +#define glMap1d glad_glMap1d +GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f; +#define glMap1f glad_glMap1f +GLAD_API_CALL PFNGLMAP1XOESPROC glad_glMap1xOES; +#define glMap1xOES glad_glMap1xOES +GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d; +#define glMap2d glad_glMap2d +GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f; +#define glMap2f glad_glMap2f +GLAD_API_CALL PFNGLMAP2XOESPROC glad_glMap2xOES; +#define glMap2xOES glad_glMap2xOES +GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +GLAD_API_CALL PFNGLMAPBUFFERARBPROC glad_glMapBufferARB; +#define glMapBufferARB glad_glMapBufferARB +GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +GLAD_API_CALL PFNGLMAPCONTROLPOINTSNVPROC glad_glMapControlPointsNV; +#define glMapControlPointsNV glad_glMapControlPointsNV +GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d; +#define glMapGrid1d glad_glMapGrid1d +GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f; +#define glMapGrid1f glad_glMapGrid1f +GLAD_API_CALL PFNGLMAPGRID1XOESPROC glad_glMapGrid1xOES; +#define glMapGrid1xOES glad_glMapGrid1xOES +GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d; +#define glMapGrid2d glad_glMapGrid2d +GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f; +#define glMapGrid2f glad_glMapGrid2f +GLAD_API_CALL PFNGLMAPGRID2XOESPROC glad_glMapGrid2xOES; +#define glMapGrid2xOES glad_glMapGrid2xOES +GLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer; +#define glMapNamedBuffer glad_glMapNamedBuffer +GLAD_API_CALL PFNGLMAPNAMEDBUFFEREXTPROC glad_glMapNamedBufferEXT; +#define glMapNamedBufferEXT glad_glMapNamedBufferEXT +GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange; +#define glMapNamedBufferRange glad_glMapNamedBufferRange +GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEEXTPROC glad_glMapNamedBufferRangeEXT; +#define glMapNamedBufferRangeEXT glad_glMapNamedBufferRangeEXT +GLAD_API_CALL PFNGLMAPOBJECTBUFFERATIPROC glad_glMapObjectBufferATI; +#define glMapObjectBufferATI glad_glMapObjectBufferATI +GLAD_API_CALL PFNGLMAPPARAMETERFVNVPROC glad_glMapParameterfvNV; +#define glMapParameterfvNV glad_glMapParameterfvNV +GLAD_API_CALL PFNGLMAPPARAMETERIVNVPROC glad_glMapParameterivNV; +#define glMapParameterivNV glad_glMapParameterivNV +GLAD_API_CALL PFNGLMAPTEXTURE2DINTELPROC glad_glMapTexture2DINTEL; +#define glMapTexture2DINTEL glad_glMapTexture2DINTEL +GLAD_API_CALL PFNGLMAPVERTEXATTRIB1DAPPLEPROC glad_glMapVertexAttrib1dAPPLE; +#define glMapVertexAttrib1dAPPLE glad_glMapVertexAttrib1dAPPLE +GLAD_API_CALL PFNGLMAPVERTEXATTRIB1FAPPLEPROC glad_glMapVertexAttrib1fAPPLE; +#define glMapVertexAttrib1fAPPLE glad_glMapVertexAttrib1fAPPLE +GLAD_API_CALL PFNGLMAPVERTEXATTRIB2DAPPLEPROC glad_glMapVertexAttrib2dAPPLE; +#define glMapVertexAttrib2dAPPLE glad_glMapVertexAttrib2dAPPLE +GLAD_API_CALL PFNGLMAPVERTEXATTRIB2FAPPLEPROC glad_glMapVertexAttrib2fAPPLE; +#define glMapVertexAttrib2fAPPLE glad_glMapVertexAttrib2fAPPLE +GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf; +#define glMaterialf glad_glMaterialf +GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv; +#define glMaterialfv glad_glMaterialfv +GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali; +#define glMateriali glad_glMateriali +GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv; +#define glMaterialiv glad_glMaterialiv +GLAD_API_CALL PFNGLMATERIALXOESPROC glad_glMaterialxOES; +#define glMaterialxOES glad_glMaterialxOES +GLAD_API_CALL PFNGLMATERIALXVOESPROC glad_glMaterialxvOES; +#define glMaterialxvOES glad_glMaterialxvOES +GLAD_API_CALL PFNGLMATRIXFRUSTUMEXTPROC glad_glMatrixFrustumEXT; +#define glMatrixFrustumEXT glad_glMatrixFrustumEXT +GLAD_API_CALL PFNGLMATRIXINDEXPOINTERARBPROC glad_glMatrixIndexPointerARB; +#define glMatrixIndexPointerARB glad_glMatrixIndexPointerARB +GLAD_API_CALL PFNGLMATRIXINDEXUBVARBPROC glad_glMatrixIndexubvARB; +#define glMatrixIndexubvARB glad_glMatrixIndexubvARB +GLAD_API_CALL PFNGLMATRIXINDEXUIVARBPROC glad_glMatrixIndexuivARB; +#define glMatrixIndexuivARB glad_glMatrixIndexuivARB +GLAD_API_CALL PFNGLMATRIXINDEXUSVARBPROC glad_glMatrixIndexusvARB; +#define glMatrixIndexusvARB glad_glMatrixIndexusvARB +GLAD_API_CALL PFNGLMATRIXLOAD3X2FNVPROC glad_glMatrixLoad3x2fNV; +#define glMatrixLoad3x2fNV glad_glMatrixLoad3x2fNV +GLAD_API_CALL PFNGLMATRIXLOAD3X3FNVPROC glad_glMatrixLoad3x3fNV; +#define glMatrixLoad3x3fNV glad_glMatrixLoad3x3fNV +GLAD_API_CALL PFNGLMATRIXLOADIDENTITYEXTPROC glad_glMatrixLoadIdentityEXT; +#define glMatrixLoadIdentityEXT glad_glMatrixLoadIdentityEXT +GLAD_API_CALL PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC glad_glMatrixLoadTranspose3x3fNV; +#define glMatrixLoadTranspose3x3fNV glad_glMatrixLoadTranspose3x3fNV +GLAD_API_CALL PFNGLMATRIXLOADTRANSPOSEDEXTPROC glad_glMatrixLoadTransposedEXT; +#define glMatrixLoadTransposedEXT glad_glMatrixLoadTransposedEXT +GLAD_API_CALL PFNGLMATRIXLOADTRANSPOSEFEXTPROC glad_glMatrixLoadTransposefEXT; +#define glMatrixLoadTransposefEXT glad_glMatrixLoadTransposefEXT +GLAD_API_CALL PFNGLMATRIXLOADDEXTPROC glad_glMatrixLoaddEXT; +#define glMatrixLoaddEXT glad_glMatrixLoaddEXT +GLAD_API_CALL PFNGLMATRIXLOADFEXTPROC glad_glMatrixLoadfEXT; +#define glMatrixLoadfEXT glad_glMatrixLoadfEXT +GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode; +#define glMatrixMode glad_glMatrixMode +GLAD_API_CALL PFNGLMATRIXMULT3X2FNVPROC glad_glMatrixMult3x2fNV; +#define glMatrixMult3x2fNV glad_glMatrixMult3x2fNV +GLAD_API_CALL PFNGLMATRIXMULT3X3FNVPROC glad_glMatrixMult3x3fNV; +#define glMatrixMult3x3fNV glad_glMatrixMult3x3fNV +GLAD_API_CALL PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC glad_glMatrixMultTranspose3x3fNV; +#define glMatrixMultTranspose3x3fNV glad_glMatrixMultTranspose3x3fNV +GLAD_API_CALL PFNGLMATRIXMULTTRANSPOSEDEXTPROC glad_glMatrixMultTransposedEXT; +#define glMatrixMultTransposedEXT glad_glMatrixMultTransposedEXT +GLAD_API_CALL PFNGLMATRIXMULTTRANSPOSEFEXTPROC glad_glMatrixMultTransposefEXT; +#define glMatrixMultTransposefEXT glad_glMatrixMultTransposefEXT +GLAD_API_CALL PFNGLMATRIXMULTDEXTPROC glad_glMatrixMultdEXT; +#define glMatrixMultdEXT glad_glMatrixMultdEXT +GLAD_API_CALL PFNGLMATRIXMULTFEXTPROC glad_glMatrixMultfEXT; +#define glMatrixMultfEXT glad_glMatrixMultfEXT +GLAD_API_CALL PFNGLMATRIXORTHOEXTPROC glad_glMatrixOrthoEXT; +#define glMatrixOrthoEXT glad_glMatrixOrthoEXT +GLAD_API_CALL PFNGLMATRIXPOPEXTPROC glad_glMatrixPopEXT; +#define glMatrixPopEXT glad_glMatrixPopEXT +GLAD_API_CALL PFNGLMATRIXPUSHEXTPROC glad_glMatrixPushEXT; +#define glMatrixPushEXT glad_glMatrixPushEXT +GLAD_API_CALL PFNGLMATRIXROTATEDEXTPROC glad_glMatrixRotatedEXT; +#define glMatrixRotatedEXT glad_glMatrixRotatedEXT +GLAD_API_CALL PFNGLMATRIXROTATEFEXTPROC glad_glMatrixRotatefEXT; +#define glMatrixRotatefEXT glad_glMatrixRotatefEXT +GLAD_API_CALL PFNGLMATRIXSCALEDEXTPROC glad_glMatrixScaledEXT; +#define glMatrixScaledEXT glad_glMatrixScaledEXT +GLAD_API_CALL PFNGLMATRIXSCALEFEXTPROC glad_glMatrixScalefEXT; +#define glMatrixScalefEXT glad_glMatrixScalefEXT +GLAD_API_CALL PFNGLMATRIXTRANSLATEDEXTPROC glad_glMatrixTranslatedEXT; +#define glMatrixTranslatedEXT glad_glMatrixTranslatedEXT +GLAD_API_CALL PFNGLMATRIXTRANSLATEFEXTPROC glad_glMatrixTranslatefEXT; +#define glMatrixTranslatefEXT glad_glMatrixTranslatefEXT +GLAD_API_CALL PFNGLMAXSHADERCOMPILERTHREADSARBPROC glad_glMaxShaderCompilerThreadsARB; +#define glMaxShaderCompilerThreadsARB glad_glMaxShaderCompilerThreadsARB +GLAD_API_CALL PFNGLMAXSHADERCOMPILERTHREADSKHRPROC glad_glMaxShaderCompilerThreadsKHR; +#define glMaxShaderCompilerThreadsKHR glad_glMaxShaderCompilerThreadsKHR +GLAD_API_CALL PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; +#define glMemoryBarrier glad_glMemoryBarrier +GLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion; +#define glMemoryBarrierByRegion glad_glMemoryBarrierByRegion +GLAD_API_CALL PFNGLMEMORYBARRIEREXTPROC glad_glMemoryBarrierEXT; +#define glMemoryBarrierEXT glad_glMemoryBarrierEXT +GLAD_API_CALL PFNGLMEMORYOBJECTPARAMETERIVEXTPROC glad_glMemoryObjectParameterivEXT; +#define glMemoryObjectParameterivEXT glad_glMemoryObjectParameterivEXT +GLAD_API_CALL PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading; +#define glMinSampleShading glad_glMinSampleShading +GLAD_API_CALL PFNGLMINSAMPLESHADINGARBPROC glad_glMinSampleShadingARB; +#define glMinSampleShadingARB glad_glMinSampleShadingARB +GLAD_API_CALL PFNGLMINMAXPROC glad_glMinmax; +#define glMinmax glad_glMinmax +GLAD_API_CALL PFNGLMINMAXEXTPROC glad_glMinmaxEXT; +#define glMinmaxEXT glad_glMinmaxEXT +GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd; +#define glMultMatrixd glad_glMultMatrixd +GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf; +#define glMultMatrixf glad_glMultMatrixf +GLAD_API_CALL PFNGLMULTMATRIXXOESPROC glad_glMultMatrixxOES; +#define glMultMatrixxOES glad_glMultMatrixxOES +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd; +#define glMultTransposeMatrixd glad_glMultTransposeMatrixd +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDARBPROC glad_glMultTransposeMatrixdARB; +#define glMultTransposeMatrixdARB glad_glMultTransposeMatrixdARB +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf; +#define glMultTransposeMatrixf glad_glMultTransposeMatrixf +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFARBPROC glad_glMultTransposeMatrixfARB; +#define glMultTransposeMatrixfARB glad_glMultTransposeMatrixfARB +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXXOESPROC glad_glMultTransposeMatrixxOES; +#define glMultTransposeMatrixxOES glad_glMultTransposeMatrixxOES +GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +GLAD_API_CALL PFNGLMULTIDRAWARRAYSEXTPROC glad_glMultiDrawArraysEXT; +#define glMultiDrawArraysEXT glad_glMultiDrawArraysEXT +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect; +#define glMultiDrawArraysIndirect glad_glMultiDrawArraysIndirect +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC glad_glMultiDrawArraysIndirectAMD; +#define glMultiDrawArraysIndirectAMD glad_glMultiDrawArraysIndirectAMD +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC glad_glMultiDrawArraysIndirectBindlessCountNV; +#define glMultiDrawArraysIndirectBindlessCountNV glad_glMultiDrawArraysIndirectBindlessCountNV +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC glad_glMultiDrawArraysIndirectBindlessNV; +#define glMultiDrawArraysIndirectBindlessNV glad_glMultiDrawArraysIndirectBindlessNV +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount; +#define glMultiDrawArraysIndirectCount glad_glMultiDrawArraysIndirectCount +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC glad_glMultiDrawArraysIndirectCountARB; +#define glMultiDrawArraysIndirectCountARB glad_glMultiDrawArraysIndirectCountARB +GLAD_API_CALL PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC glad_glMultiDrawElementArrayAPPLE; +#define glMultiDrawElementArrayAPPLE glad_glMultiDrawElementArrayAPPLE +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSEXTPROC glad_glMultiDrawElementsEXT; +#define glMultiDrawElementsEXT glad_glMultiDrawElementsEXT +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect; +#define glMultiDrawElementsIndirect glad_glMultiDrawElementsIndirect +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC glad_glMultiDrawElementsIndirectAMD; +#define glMultiDrawElementsIndirectAMD glad_glMultiDrawElementsIndirectAMD +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC glad_glMultiDrawElementsIndirectBindlessCountNV; +#define glMultiDrawElementsIndirectBindlessCountNV glad_glMultiDrawElementsIndirectBindlessCountNV +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC glad_glMultiDrawElementsIndirectBindlessNV; +#define glMultiDrawElementsIndirectBindlessNV glad_glMultiDrawElementsIndirectBindlessNV +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount; +#define glMultiDrawElementsIndirectCount glad_glMultiDrawElementsIndirectCount +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC glad_glMultiDrawElementsIndirectCountARB; +#define glMultiDrawElementsIndirectCountARB glad_glMultiDrawElementsIndirectCountARB +GLAD_API_CALL PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC glad_glMultiDrawMeshTasksIndirectCountNV; +#define glMultiDrawMeshTasksIndirectCountNV glad_glMultiDrawMeshTasksIndirectCountNV +GLAD_API_CALL PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC glad_glMultiDrawMeshTasksIndirectNV; +#define glMultiDrawMeshTasksIndirectNV glad_glMultiDrawMeshTasksIndirectNV +GLAD_API_CALL PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC glad_glMultiDrawRangeElementArrayAPPLE; +#define glMultiDrawRangeElementArrayAPPLE glad_glMultiDrawRangeElementArrayAPPLE +GLAD_API_CALL PFNGLMULTIMODEDRAWARRAYSIBMPROC glad_glMultiModeDrawArraysIBM; +#define glMultiModeDrawArraysIBM glad_glMultiModeDrawArraysIBM +GLAD_API_CALL PFNGLMULTIMODEDRAWELEMENTSIBMPROC glad_glMultiModeDrawElementsIBM; +#define glMultiModeDrawElementsIBM glad_glMultiModeDrawElementsIBM +GLAD_API_CALL PFNGLMULTITEXBUFFEREXTPROC glad_glMultiTexBufferEXT; +#define glMultiTexBufferEXT glad_glMultiTexBufferEXT +GLAD_API_CALL PFNGLMULTITEXCOORD1BOESPROC glad_glMultiTexCoord1bOES; +#define glMultiTexCoord1bOES glad_glMultiTexCoord1bOES +GLAD_API_CALL PFNGLMULTITEXCOORD1BVOESPROC glad_glMultiTexCoord1bvOES; +#define glMultiTexCoord1bvOES glad_glMultiTexCoord1bvOES +GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d; +#define glMultiTexCoord1d glad_glMultiTexCoord1d +GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB; +#define glMultiTexCoord1dARB glad_glMultiTexCoord1dARB +GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv; +#define glMultiTexCoord1dv glad_glMultiTexCoord1dv +GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB; +#define glMultiTexCoord1dvARB glad_glMultiTexCoord1dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f; +#define glMultiTexCoord1f glad_glMultiTexCoord1f +GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB; +#define glMultiTexCoord1fARB glad_glMultiTexCoord1fARB +GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv; +#define glMultiTexCoord1fv glad_glMultiTexCoord1fv +GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB; +#define glMultiTexCoord1fvARB glad_glMultiTexCoord1fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD1HNVPROC glad_glMultiTexCoord1hNV; +#define glMultiTexCoord1hNV glad_glMultiTexCoord1hNV +GLAD_API_CALL PFNGLMULTITEXCOORD1HVNVPROC glad_glMultiTexCoord1hvNV; +#define glMultiTexCoord1hvNV glad_glMultiTexCoord1hvNV +GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i; +#define glMultiTexCoord1i glad_glMultiTexCoord1i +GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB; +#define glMultiTexCoord1iARB glad_glMultiTexCoord1iARB +GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv; +#define glMultiTexCoord1iv glad_glMultiTexCoord1iv +GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB; +#define glMultiTexCoord1ivARB glad_glMultiTexCoord1ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s; +#define glMultiTexCoord1s glad_glMultiTexCoord1s +GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB; +#define glMultiTexCoord1sARB glad_glMultiTexCoord1sARB +GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv; +#define glMultiTexCoord1sv glad_glMultiTexCoord1sv +GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB; +#define glMultiTexCoord1svARB glad_glMultiTexCoord1svARB +GLAD_API_CALL PFNGLMULTITEXCOORD1XOESPROC glad_glMultiTexCoord1xOES; +#define glMultiTexCoord1xOES glad_glMultiTexCoord1xOES +GLAD_API_CALL PFNGLMULTITEXCOORD1XVOESPROC glad_glMultiTexCoord1xvOES; +#define glMultiTexCoord1xvOES glad_glMultiTexCoord1xvOES +GLAD_API_CALL PFNGLMULTITEXCOORD2BOESPROC glad_glMultiTexCoord2bOES; +#define glMultiTexCoord2bOES glad_glMultiTexCoord2bOES +GLAD_API_CALL PFNGLMULTITEXCOORD2BVOESPROC glad_glMultiTexCoord2bvOES; +#define glMultiTexCoord2bvOES glad_glMultiTexCoord2bvOES +GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d; +#define glMultiTexCoord2d glad_glMultiTexCoord2d +GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB; +#define glMultiTexCoord2dARB glad_glMultiTexCoord2dARB +GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv; +#define glMultiTexCoord2dv glad_glMultiTexCoord2dv +GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB; +#define glMultiTexCoord2dvARB glad_glMultiTexCoord2dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f; +#define glMultiTexCoord2f glad_glMultiTexCoord2f +GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB; +#define glMultiTexCoord2fARB glad_glMultiTexCoord2fARB +GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv; +#define glMultiTexCoord2fv glad_glMultiTexCoord2fv +GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB; +#define glMultiTexCoord2fvARB glad_glMultiTexCoord2fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD2HNVPROC glad_glMultiTexCoord2hNV; +#define glMultiTexCoord2hNV glad_glMultiTexCoord2hNV +GLAD_API_CALL PFNGLMULTITEXCOORD2HVNVPROC glad_glMultiTexCoord2hvNV; +#define glMultiTexCoord2hvNV glad_glMultiTexCoord2hvNV +GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i; +#define glMultiTexCoord2i glad_glMultiTexCoord2i +GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB; +#define glMultiTexCoord2iARB glad_glMultiTexCoord2iARB +GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv; +#define glMultiTexCoord2iv glad_glMultiTexCoord2iv +GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB; +#define glMultiTexCoord2ivARB glad_glMultiTexCoord2ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s; +#define glMultiTexCoord2s glad_glMultiTexCoord2s +GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB; +#define glMultiTexCoord2sARB glad_glMultiTexCoord2sARB +GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv; +#define glMultiTexCoord2sv glad_glMultiTexCoord2sv +GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB; +#define glMultiTexCoord2svARB glad_glMultiTexCoord2svARB +GLAD_API_CALL PFNGLMULTITEXCOORD2XOESPROC glad_glMultiTexCoord2xOES; +#define glMultiTexCoord2xOES glad_glMultiTexCoord2xOES +GLAD_API_CALL PFNGLMULTITEXCOORD2XVOESPROC glad_glMultiTexCoord2xvOES; +#define glMultiTexCoord2xvOES glad_glMultiTexCoord2xvOES +GLAD_API_CALL PFNGLMULTITEXCOORD3BOESPROC glad_glMultiTexCoord3bOES; +#define glMultiTexCoord3bOES glad_glMultiTexCoord3bOES +GLAD_API_CALL PFNGLMULTITEXCOORD3BVOESPROC glad_glMultiTexCoord3bvOES; +#define glMultiTexCoord3bvOES glad_glMultiTexCoord3bvOES +GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d; +#define glMultiTexCoord3d glad_glMultiTexCoord3d +GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB; +#define glMultiTexCoord3dARB glad_glMultiTexCoord3dARB +GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv; +#define glMultiTexCoord3dv glad_glMultiTexCoord3dv +GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB; +#define glMultiTexCoord3dvARB glad_glMultiTexCoord3dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f; +#define glMultiTexCoord3f glad_glMultiTexCoord3f +GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB; +#define glMultiTexCoord3fARB glad_glMultiTexCoord3fARB +GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv; +#define glMultiTexCoord3fv glad_glMultiTexCoord3fv +GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB; +#define glMultiTexCoord3fvARB glad_glMultiTexCoord3fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD3HNVPROC glad_glMultiTexCoord3hNV; +#define glMultiTexCoord3hNV glad_glMultiTexCoord3hNV +GLAD_API_CALL PFNGLMULTITEXCOORD3HVNVPROC glad_glMultiTexCoord3hvNV; +#define glMultiTexCoord3hvNV glad_glMultiTexCoord3hvNV +GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i; +#define glMultiTexCoord3i glad_glMultiTexCoord3i +GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB; +#define glMultiTexCoord3iARB glad_glMultiTexCoord3iARB +GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv; +#define glMultiTexCoord3iv glad_glMultiTexCoord3iv +GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB; +#define glMultiTexCoord3ivARB glad_glMultiTexCoord3ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s; +#define glMultiTexCoord3s glad_glMultiTexCoord3s +GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB; +#define glMultiTexCoord3sARB glad_glMultiTexCoord3sARB +GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv; +#define glMultiTexCoord3sv glad_glMultiTexCoord3sv +GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB; +#define glMultiTexCoord3svARB glad_glMultiTexCoord3svARB +GLAD_API_CALL PFNGLMULTITEXCOORD3XOESPROC glad_glMultiTexCoord3xOES; +#define glMultiTexCoord3xOES glad_glMultiTexCoord3xOES +GLAD_API_CALL PFNGLMULTITEXCOORD3XVOESPROC glad_glMultiTexCoord3xvOES; +#define glMultiTexCoord3xvOES glad_glMultiTexCoord3xvOES +GLAD_API_CALL PFNGLMULTITEXCOORD4BOESPROC glad_glMultiTexCoord4bOES; +#define glMultiTexCoord4bOES glad_glMultiTexCoord4bOES +GLAD_API_CALL PFNGLMULTITEXCOORD4BVOESPROC glad_glMultiTexCoord4bvOES; +#define glMultiTexCoord4bvOES glad_glMultiTexCoord4bvOES +GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d; +#define glMultiTexCoord4d glad_glMultiTexCoord4d +GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB; +#define glMultiTexCoord4dARB glad_glMultiTexCoord4dARB +GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv; +#define glMultiTexCoord4dv glad_glMultiTexCoord4dv +GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB; +#define glMultiTexCoord4dvARB glad_glMultiTexCoord4dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f; +#define glMultiTexCoord4f glad_glMultiTexCoord4f +GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB; +#define glMultiTexCoord4fARB glad_glMultiTexCoord4fARB +GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv; +#define glMultiTexCoord4fv glad_glMultiTexCoord4fv +GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB; +#define glMultiTexCoord4fvARB glad_glMultiTexCoord4fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD4HNVPROC glad_glMultiTexCoord4hNV; +#define glMultiTexCoord4hNV glad_glMultiTexCoord4hNV +GLAD_API_CALL PFNGLMULTITEXCOORD4HVNVPROC glad_glMultiTexCoord4hvNV; +#define glMultiTexCoord4hvNV glad_glMultiTexCoord4hvNV +GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i; +#define glMultiTexCoord4i glad_glMultiTexCoord4i +GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB; +#define glMultiTexCoord4iARB glad_glMultiTexCoord4iARB +GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv; +#define glMultiTexCoord4iv glad_glMultiTexCoord4iv +GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB; +#define glMultiTexCoord4ivARB glad_glMultiTexCoord4ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s; +#define glMultiTexCoord4s glad_glMultiTexCoord4s +GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB; +#define glMultiTexCoord4sARB glad_glMultiTexCoord4sARB +GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv; +#define glMultiTexCoord4sv glad_glMultiTexCoord4sv +GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB; +#define glMultiTexCoord4svARB glad_glMultiTexCoord4svARB +GLAD_API_CALL PFNGLMULTITEXCOORD4XOESPROC glad_glMultiTexCoord4xOES; +#define glMultiTexCoord4xOES glad_glMultiTexCoord4xOES +GLAD_API_CALL PFNGLMULTITEXCOORD4XVOESPROC glad_glMultiTexCoord4xvOES; +#define glMultiTexCoord4xvOES glad_glMultiTexCoord4xvOES +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; +#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; +#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; +#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; +#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; +#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; +#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; +#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; +#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv +GLAD_API_CALL PFNGLMULTITEXCOORDPOINTEREXTPROC glad_glMultiTexCoordPointerEXT; +#define glMultiTexCoordPointerEXT glad_glMultiTexCoordPointerEXT +GLAD_API_CALL PFNGLMULTITEXENVFEXTPROC glad_glMultiTexEnvfEXT; +#define glMultiTexEnvfEXT glad_glMultiTexEnvfEXT +GLAD_API_CALL PFNGLMULTITEXENVFVEXTPROC glad_glMultiTexEnvfvEXT; +#define glMultiTexEnvfvEXT glad_glMultiTexEnvfvEXT +GLAD_API_CALL PFNGLMULTITEXENVIEXTPROC glad_glMultiTexEnviEXT; +#define glMultiTexEnviEXT glad_glMultiTexEnviEXT +GLAD_API_CALL PFNGLMULTITEXENVIVEXTPROC glad_glMultiTexEnvivEXT; +#define glMultiTexEnvivEXT glad_glMultiTexEnvivEXT +GLAD_API_CALL PFNGLMULTITEXGENDEXTPROC glad_glMultiTexGendEXT; +#define glMultiTexGendEXT glad_glMultiTexGendEXT +GLAD_API_CALL PFNGLMULTITEXGENDVEXTPROC glad_glMultiTexGendvEXT; +#define glMultiTexGendvEXT glad_glMultiTexGendvEXT +GLAD_API_CALL PFNGLMULTITEXGENFEXTPROC glad_glMultiTexGenfEXT; +#define glMultiTexGenfEXT glad_glMultiTexGenfEXT +GLAD_API_CALL PFNGLMULTITEXGENFVEXTPROC glad_glMultiTexGenfvEXT; +#define glMultiTexGenfvEXT glad_glMultiTexGenfvEXT +GLAD_API_CALL PFNGLMULTITEXGENIEXTPROC glad_glMultiTexGeniEXT; +#define glMultiTexGeniEXT glad_glMultiTexGeniEXT +GLAD_API_CALL PFNGLMULTITEXGENIVEXTPROC glad_glMultiTexGenivEXT; +#define glMultiTexGenivEXT glad_glMultiTexGenivEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE1DEXTPROC glad_glMultiTexImage1DEXT; +#define glMultiTexImage1DEXT glad_glMultiTexImage1DEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE2DEXTPROC glad_glMultiTexImage2DEXT; +#define glMultiTexImage2DEXT glad_glMultiTexImage2DEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE3DEXTPROC glad_glMultiTexImage3DEXT; +#define glMultiTexImage3DEXT glad_glMultiTexImage3DEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIIVEXTPROC glad_glMultiTexParameterIivEXT; +#define glMultiTexParameterIivEXT glad_glMultiTexParameterIivEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIUIVEXTPROC glad_glMultiTexParameterIuivEXT; +#define glMultiTexParameterIuivEXT glad_glMultiTexParameterIuivEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERFEXTPROC glad_glMultiTexParameterfEXT; +#define glMultiTexParameterfEXT glad_glMultiTexParameterfEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERFVEXTPROC glad_glMultiTexParameterfvEXT; +#define glMultiTexParameterfvEXT glad_glMultiTexParameterfvEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIEXTPROC glad_glMultiTexParameteriEXT; +#define glMultiTexParameteriEXT glad_glMultiTexParameteriEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIVEXTPROC glad_glMultiTexParameterivEXT; +#define glMultiTexParameterivEXT glad_glMultiTexParameterivEXT +GLAD_API_CALL PFNGLMULTITEXRENDERBUFFEREXTPROC glad_glMultiTexRenderbufferEXT; +#define glMultiTexRenderbufferEXT glad_glMultiTexRenderbufferEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE1DEXTPROC glad_glMultiTexSubImage1DEXT; +#define glMultiTexSubImage1DEXT glad_glMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE2DEXTPROC glad_glMultiTexSubImage2DEXT; +#define glMultiTexSubImage2DEXT glad_glMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE3DEXTPROC glad_glMultiTexSubImage3DEXT; +#define glMultiTexSubImage3DEXT glad_glMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLMULTICASTBARRIERNVPROC glad_glMulticastBarrierNV; +#define glMulticastBarrierNV glad_glMulticastBarrierNV +GLAD_API_CALL PFNGLMULTICASTBLITFRAMEBUFFERNVPROC glad_glMulticastBlitFramebufferNV; +#define glMulticastBlitFramebufferNV glad_glMulticastBlitFramebufferNV +GLAD_API_CALL PFNGLMULTICASTBUFFERSUBDATANVPROC glad_glMulticastBufferSubDataNV; +#define glMulticastBufferSubDataNV glad_glMulticastBufferSubDataNV +GLAD_API_CALL PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC glad_glMulticastCopyBufferSubDataNV; +#define glMulticastCopyBufferSubDataNV glad_glMulticastCopyBufferSubDataNV +GLAD_API_CALL PFNGLMULTICASTCOPYIMAGESUBDATANVPROC glad_glMulticastCopyImageSubDataNV; +#define glMulticastCopyImageSubDataNV glad_glMulticastCopyImageSubDataNV +GLAD_API_CALL PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glMulticastFramebufferSampleLocationsfvNV; +#define glMulticastFramebufferSampleLocationsfvNV glad_glMulticastFramebufferSampleLocationsfvNV +GLAD_API_CALL PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC glad_glMulticastGetQueryObjecti64vNV; +#define glMulticastGetQueryObjecti64vNV glad_glMulticastGetQueryObjecti64vNV +GLAD_API_CALL PFNGLMULTICASTGETQUERYOBJECTIVNVPROC glad_glMulticastGetQueryObjectivNV; +#define glMulticastGetQueryObjectivNV glad_glMulticastGetQueryObjectivNV +GLAD_API_CALL PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC glad_glMulticastGetQueryObjectui64vNV; +#define glMulticastGetQueryObjectui64vNV glad_glMulticastGetQueryObjectui64vNV +GLAD_API_CALL PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC glad_glMulticastGetQueryObjectuivNV; +#define glMulticastGetQueryObjectuivNV glad_glMulticastGetQueryObjectuivNV +GLAD_API_CALL PFNGLMULTICASTSCISSORARRAYVNVXPROC glad_glMulticastScissorArrayvNVX; +#define glMulticastScissorArrayvNVX glad_glMulticastScissorArrayvNVX +GLAD_API_CALL PFNGLMULTICASTVIEWPORTARRAYVNVXPROC glad_glMulticastViewportArrayvNVX; +#define glMulticastViewportArrayvNVX glad_glMulticastViewportArrayvNVX +GLAD_API_CALL PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC glad_glMulticastViewportPositionWScaleNVX; +#define glMulticastViewportPositionWScaleNVX glad_glMulticastViewportPositionWScaleNVX +GLAD_API_CALL PFNGLMULTICASTWAITSYNCNVPROC glad_glMulticastWaitSyncNV; +#define glMulticastWaitSyncNV glad_glMulticastWaitSyncNV +GLAD_API_CALL PFNGLNAMEDBUFFERATTACHMEMORYNVPROC glad_glNamedBufferAttachMemoryNV; +#define glNamedBufferAttachMemoryNV glad_glNamedBufferAttachMemoryNV +GLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData; +#define glNamedBufferData glad_glNamedBufferData +GLAD_API_CALL PFNGLNAMEDBUFFERDATAEXTPROC glad_glNamedBufferDataEXT; +#define glNamedBufferDataEXT glad_glNamedBufferDataEXT +GLAD_API_CALL PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC glad_glNamedBufferPageCommitmentARB; +#define glNamedBufferPageCommitmentARB glad_glNamedBufferPageCommitmentARB +GLAD_API_CALL PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC glad_glNamedBufferPageCommitmentEXT; +#define glNamedBufferPageCommitmentEXT glad_glNamedBufferPageCommitmentEXT +GLAD_API_CALL PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC glad_glNamedBufferPageCommitmentMemNV; +#define glNamedBufferPageCommitmentMemNV glad_glNamedBufferPageCommitmentMemNV +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage; +#define glNamedBufferStorage glad_glNamedBufferStorage +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEEXTPROC glad_glNamedBufferStorageEXT; +#define glNamedBufferStorageEXT glad_glNamedBufferStorageEXT +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC glad_glNamedBufferStorageExternalEXT; +#define glNamedBufferStorageExternalEXT glad_glNamedBufferStorageExternalEXT +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC glad_glNamedBufferStorageMemEXT; +#define glNamedBufferStorageMemEXT glad_glNamedBufferStorageMemEXT +GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData; +#define glNamedBufferSubData glad_glNamedBufferSubData +GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAEXTPROC glad_glNamedBufferSubDataEXT; +#define glNamedBufferSubDataEXT glad_glNamedBufferSubDataEXT +GLAD_API_CALL PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glad_glNamedCopyBufferSubDataEXT; +#define glNamedCopyBufferSubDataEXT glad_glNamedCopyBufferSubDataEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer; +#define glNamedFramebufferDrawBuffer glad_glNamedFramebufferDrawBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers; +#define glNamedFramebufferDrawBuffers glad_glNamedFramebufferDrawBuffers +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri; +#define glNamedFramebufferParameteri glad_glNamedFramebufferParameteri +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glad_glNamedFramebufferParameteriEXT; +#define glNamedFramebufferParameteriEXT glad_glNamedFramebufferParameteriEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer; +#define glNamedFramebufferReadBuffer glad_glNamedFramebufferReadBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer; +#define glNamedFramebufferRenderbuffer glad_glNamedFramebufferRenderbuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glad_glNamedFramebufferRenderbufferEXT; +#define glNamedFramebufferRenderbufferEXT glad_glNamedFramebufferRenderbufferEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC glad_glNamedFramebufferSampleLocationsfvARB; +#define glNamedFramebufferSampleLocationsfvARB glad_glNamedFramebufferSampleLocationsfvARB +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glNamedFramebufferSampleLocationsfvNV; +#define glNamedFramebufferSampleLocationsfvNV glad_glNamedFramebufferSampleLocationsfvNV +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC glad_glNamedFramebufferSamplePositionsfvAMD; +#define glNamedFramebufferSamplePositionsfvAMD glad_glNamedFramebufferSamplePositionsfvAMD +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture; +#define glNamedFramebufferTexture glad_glNamedFramebufferTexture +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glad_glNamedFramebufferTexture1DEXT; +#define glNamedFramebufferTexture1DEXT glad_glNamedFramebufferTexture1DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glad_glNamedFramebufferTexture2DEXT; +#define glNamedFramebufferTexture2DEXT glad_glNamedFramebufferTexture2DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glad_glNamedFramebufferTexture3DEXT; +#define glNamedFramebufferTexture3DEXT glad_glNamedFramebufferTexture3DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glad_glNamedFramebufferTextureEXT; +#define glNamedFramebufferTextureEXT glad_glNamedFramebufferTextureEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC glad_glNamedFramebufferTextureFaceEXT; +#define glNamedFramebufferTextureFaceEXT glad_glNamedFramebufferTextureFaceEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer; +#define glNamedFramebufferTextureLayer glad_glNamedFramebufferTextureLayer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glad_glNamedFramebufferTextureLayerEXT; +#define glNamedFramebufferTextureLayerEXT glad_glNamedFramebufferTextureLayerEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC glad_glNamedProgramLocalParameter4dEXT; +#define glNamedProgramLocalParameter4dEXT glad_glNamedProgramLocalParameter4dEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC glad_glNamedProgramLocalParameter4dvEXT; +#define glNamedProgramLocalParameter4dvEXT glad_glNamedProgramLocalParameter4dvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC glad_glNamedProgramLocalParameter4fEXT; +#define glNamedProgramLocalParameter4fEXT glad_glNamedProgramLocalParameter4fEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC glad_glNamedProgramLocalParameter4fvEXT; +#define glNamedProgramLocalParameter4fvEXT glad_glNamedProgramLocalParameter4fvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC glad_glNamedProgramLocalParameterI4iEXT; +#define glNamedProgramLocalParameterI4iEXT glad_glNamedProgramLocalParameterI4iEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC glad_glNamedProgramLocalParameterI4ivEXT; +#define glNamedProgramLocalParameterI4ivEXT glad_glNamedProgramLocalParameterI4ivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC glad_glNamedProgramLocalParameterI4uiEXT; +#define glNamedProgramLocalParameterI4uiEXT glad_glNamedProgramLocalParameterI4uiEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC glad_glNamedProgramLocalParameterI4uivEXT; +#define glNamedProgramLocalParameterI4uivEXT glad_glNamedProgramLocalParameterI4uivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glNamedProgramLocalParameters4fvEXT; +#define glNamedProgramLocalParameters4fvEXT glad_glNamedProgramLocalParameters4fvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC glad_glNamedProgramLocalParametersI4ivEXT; +#define glNamedProgramLocalParametersI4ivEXT glad_glNamedProgramLocalParametersI4ivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC glad_glNamedProgramLocalParametersI4uivEXT; +#define glNamedProgramLocalParametersI4uivEXT glad_glNamedProgramLocalParametersI4uivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMSTRINGEXTPROC glad_glNamedProgramStringEXT; +#define glNamedProgramStringEXT glad_glNamedProgramStringEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage; +#define glNamedRenderbufferStorage glad_glNamedRenderbufferStorage +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glad_glNamedRenderbufferStorageEXT; +#define glNamedRenderbufferStorageEXT glad_glNamedRenderbufferStorageEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample; +#define glNamedRenderbufferStorageMultisample glad_glNamedRenderbufferStorageMultisample +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC glad_glNamedRenderbufferStorageMultisampleAdvancedAMD; +#define glNamedRenderbufferStorageMultisampleAdvancedAMD glad_glNamedRenderbufferStorageMultisampleAdvancedAMD +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC glad_glNamedRenderbufferStorageMultisampleCoverageEXT; +#define glNamedRenderbufferStorageMultisampleCoverageEXT glad_glNamedRenderbufferStorageMultisampleCoverageEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glNamedRenderbufferStorageMultisampleEXT; +#define glNamedRenderbufferStorageMultisampleEXT glad_glNamedRenderbufferStorageMultisampleEXT +GLAD_API_CALL PFNGLNAMEDSTRINGARBPROC glad_glNamedStringARB; +#define glNamedStringARB glad_glNamedStringARB +GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList; +#define glNewList glad_glNewList +GLAD_API_CALL PFNGLNEWOBJECTBUFFERATIPROC glad_glNewObjectBufferATI; +#define glNewObjectBufferATI glad_glNewObjectBufferATI +GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b; +#define glNormal3b glad_glNormal3b +GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv; +#define glNormal3bv glad_glNormal3bv +GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d; +#define glNormal3d glad_glNormal3d +GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv; +#define glNormal3dv glad_glNormal3dv +GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f; +#define glNormal3f glad_glNormal3f +GLAD_API_CALL PFNGLNORMAL3FVERTEX3FSUNPROC glad_glNormal3fVertex3fSUN; +#define glNormal3fVertex3fSUN glad_glNormal3fVertex3fSUN +GLAD_API_CALL PFNGLNORMAL3FVERTEX3FVSUNPROC glad_glNormal3fVertex3fvSUN; +#define glNormal3fVertex3fvSUN glad_glNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv; +#define glNormal3fv glad_glNormal3fv +GLAD_API_CALL PFNGLNORMAL3HNVPROC glad_glNormal3hNV; +#define glNormal3hNV glad_glNormal3hNV +GLAD_API_CALL PFNGLNORMAL3HVNVPROC glad_glNormal3hvNV; +#define glNormal3hvNV glad_glNormal3hvNV +GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i; +#define glNormal3i glad_glNormal3i +GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv; +#define glNormal3iv glad_glNormal3iv +GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s; +#define glNormal3s glad_glNormal3s +GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv; +#define glNormal3sv glad_glNormal3sv +GLAD_API_CALL PFNGLNORMAL3XOESPROC glad_glNormal3xOES; +#define glNormal3xOES glad_glNormal3xOES +GLAD_API_CALL PFNGLNORMAL3XVOESPROC glad_glNormal3xvOES; +#define glNormal3xvOES glad_glNormal3xvOES +GLAD_API_CALL PFNGLNORMALFORMATNVPROC glad_glNormalFormatNV; +#define glNormalFormatNV glad_glNormalFormatNV +GLAD_API_CALL PFNGLNORMALP3UIPROC glad_glNormalP3ui; +#define glNormalP3ui glad_glNormalP3ui +GLAD_API_CALL PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; +#define glNormalP3uiv glad_glNormalP3uiv +GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer; +#define glNormalPointer glad_glNormalPointer +GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT; +#define glNormalPointerEXT glad_glNormalPointerEXT +GLAD_API_CALL PFNGLNORMALPOINTERLISTIBMPROC glad_glNormalPointerListIBM; +#define glNormalPointerListIBM glad_glNormalPointerListIBM +GLAD_API_CALL PFNGLNORMALPOINTERVINTELPROC glad_glNormalPointervINTEL; +#define glNormalPointervINTEL glad_glNormalPointervINTEL +GLAD_API_CALL PFNGLNORMALSTREAM3BATIPROC glad_glNormalStream3bATI; +#define glNormalStream3bATI glad_glNormalStream3bATI +GLAD_API_CALL PFNGLNORMALSTREAM3BVATIPROC glad_glNormalStream3bvATI; +#define glNormalStream3bvATI glad_glNormalStream3bvATI +GLAD_API_CALL PFNGLNORMALSTREAM3DATIPROC glad_glNormalStream3dATI; +#define glNormalStream3dATI glad_glNormalStream3dATI +GLAD_API_CALL PFNGLNORMALSTREAM3DVATIPROC glad_glNormalStream3dvATI; +#define glNormalStream3dvATI glad_glNormalStream3dvATI +GLAD_API_CALL PFNGLNORMALSTREAM3FATIPROC glad_glNormalStream3fATI; +#define glNormalStream3fATI glad_glNormalStream3fATI +GLAD_API_CALL PFNGLNORMALSTREAM3FVATIPROC glad_glNormalStream3fvATI; +#define glNormalStream3fvATI glad_glNormalStream3fvATI +GLAD_API_CALL PFNGLNORMALSTREAM3IATIPROC glad_glNormalStream3iATI; +#define glNormalStream3iATI glad_glNormalStream3iATI +GLAD_API_CALL PFNGLNORMALSTREAM3IVATIPROC glad_glNormalStream3ivATI; +#define glNormalStream3ivATI glad_glNormalStream3ivATI +GLAD_API_CALL PFNGLNORMALSTREAM3SATIPROC glad_glNormalStream3sATI; +#define glNormalStream3sATI glad_glNormalStream3sATI +GLAD_API_CALL PFNGLNORMALSTREAM3SVATIPROC glad_glNormalStream3svATI; +#define glNormalStream3svATI glad_glNormalStream3svATI +GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel; +#define glObjectLabel glad_glObjectLabel +GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; +#define glObjectPtrLabel glad_glObjectPtrLabel +GLAD_API_CALL PFNGLOBJECTPURGEABLEAPPLEPROC glad_glObjectPurgeableAPPLE; +#define glObjectPurgeableAPPLE glad_glObjectPurgeableAPPLE +GLAD_API_CALL PFNGLOBJECTUNPURGEABLEAPPLEPROC glad_glObjectUnpurgeableAPPLE; +#define glObjectUnpurgeableAPPLE glad_glObjectUnpurgeableAPPLE +GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho; +#define glOrtho glad_glOrtho +GLAD_API_CALL PFNGLORTHOFOESPROC glad_glOrthofOES; +#define glOrthofOES glad_glOrthofOES +GLAD_API_CALL PFNGLORTHOXOESPROC glad_glOrthoxOES; +#define glOrthoxOES glad_glOrthoxOES +GLAD_API_CALL PFNGLPNTRIANGLESFATIPROC glad_glPNTrianglesfATI; +#define glPNTrianglesfATI glad_glPNTrianglesfATI +GLAD_API_CALL PFNGLPNTRIANGLESIATIPROC glad_glPNTrianglesiATI; +#define glPNTrianglesiATI glad_glPNTrianglesiATI +GLAD_API_CALL PFNGLPASSTEXCOORDATIPROC glad_glPassTexCoordATI; +#define glPassTexCoordATI glad_glPassTexCoordATI +GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough; +#define glPassThrough glad_glPassThrough +GLAD_API_CALL PFNGLPASSTHROUGHXOESPROC glad_glPassThroughxOES; +#define glPassThroughxOES glad_glPassThroughxOES +GLAD_API_CALL PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv; +#define glPatchParameterfv glad_glPatchParameterfv +GLAD_API_CALL PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri; +#define glPatchParameteri glad_glPatchParameteri +GLAD_API_CALL PFNGLPATHCOLORGENNVPROC glad_glPathColorGenNV; +#define glPathColorGenNV glad_glPathColorGenNV +GLAD_API_CALL PFNGLPATHCOMMANDSNVPROC glad_glPathCommandsNV; +#define glPathCommandsNV glad_glPathCommandsNV +GLAD_API_CALL PFNGLPATHCOORDSNVPROC glad_glPathCoordsNV; +#define glPathCoordsNV glad_glPathCoordsNV +GLAD_API_CALL PFNGLPATHCOVERDEPTHFUNCNVPROC glad_glPathCoverDepthFuncNV; +#define glPathCoverDepthFuncNV glad_glPathCoverDepthFuncNV +GLAD_API_CALL PFNGLPATHDASHARRAYNVPROC glad_glPathDashArrayNV; +#define glPathDashArrayNV glad_glPathDashArrayNV +GLAD_API_CALL PFNGLPATHFOGGENNVPROC glad_glPathFogGenNV; +#define glPathFogGenNV glad_glPathFogGenNV +GLAD_API_CALL PFNGLPATHGLYPHINDEXARRAYNVPROC glad_glPathGlyphIndexArrayNV; +#define glPathGlyphIndexArrayNV glad_glPathGlyphIndexArrayNV +GLAD_API_CALL PFNGLPATHGLYPHINDEXRANGENVPROC glad_glPathGlyphIndexRangeNV; +#define glPathGlyphIndexRangeNV glad_glPathGlyphIndexRangeNV +GLAD_API_CALL PFNGLPATHGLYPHRANGENVPROC glad_glPathGlyphRangeNV; +#define glPathGlyphRangeNV glad_glPathGlyphRangeNV +GLAD_API_CALL PFNGLPATHGLYPHSNVPROC glad_glPathGlyphsNV; +#define glPathGlyphsNV glad_glPathGlyphsNV +GLAD_API_CALL PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC glad_glPathMemoryGlyphIndexArrayNV; +#define glPathMemoryGlyphIndexArrayNV glad_glPathMemoryGlyphIndexArrayNV +GLAD_API_CALL PFNGLPATHPARAMETERFNVPROC glad_glPathParameterfNV; +#define glPathParameterfNV glad_glPathParameterfNV +GLAD_API_CALL PFNGLPATHPARAMETERFVNVPROC glad_glPathParameterfvNV; +#define glPathParameterfvNV glad_glPathParameterfvNV +GLAD_API_CALL PFNGLPATHPARAMETERINVPROC glad_glPathParameteriNV; +#define glPathParameteriNV glad_glPathParameteriNV +GLAD_API_CALL PFNGLPATHPARAMETERIVNVPROC glad_glPathParameterivNV; +#define glPathParameterivNV glad_glPathParameterivNV +GLAD_API_CALL PFNGLPATHSTENCILDEPTHOFFSETNVPROC glad_glPathStencilDepthOffsetNV; +#define glPathStencilDepthOffsetNV glad_glPathStencilDepthOffsetNV +GLAD_API_CALL PFNGLPATHSTENCILFUNCNVPROC glad_glPathStencilFuncNV; +#define glPathStencilFuncNV glad_glPathStencilFuncNV +GLAD_API_CALL PFNGLPATHSTRINGNVPROC glad_glPathStringNV; +#define glPathStringNV glad_glPathStringNV +GLAD_API_CALL PFNGLPATHSUBCOMMANDSNVPROC glad_glPathSubCommandsNV; +#define glPathSubCommandsNV glad_glPathSubCommandsNV +GLAD_API_CALL PFNGLPATHSUBCOORDSNVPROC glad_glPathSubCoordsNV; +#define glPathSubCoordsNV glad_glPathSubCoordsNV +GLAD_API_CALL PFNGLPATHTEXGENNVPROC glad_glPathTexGenNV; +#define glPathTexGenNV glad_glPathTexGenNV +GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; +#define glPauseTransformFeedback glad_glPauseTransformFeedback +GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKNVPROC glad_glPauseTransformFeedbackNV; +#define glPauseTransformFeedbackNV glad_glPauseTransformFeedbackNV +GLAD_API_CALL PFNGLPIXELDATARANGENVPROC glad_glPixelDataRangeNV; +#define glPixelDataRangeNV glad_glPixelDataRangeNV +GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv; +#define glPixelMapfv glad_glPixelMapfv +GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv; +#define glPixelMapuiv glad_glPixelMapuiv +GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv; +#define glPixelMapusv glad_glPixelMapusv +GLAD_API_CALL PFNGLPIXELMAPXPROC glad_glPixelMapx; +#define glPixelMapx glad_glPixelMapx +GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +GLAD_API_CALL PFNGLPIXELSTOREXPROC glad_glPixelStorex; +#define glPixelStorex glad_glPixelStorex +GLAD_API_CALL PFNGLPIXELTEXGENPARAMETERFSGISPROC glad_glPixelTexGenParameterfSGIS; +#define glPixelTexGenParameterfSGIS glad_glPixelTexGenParameterfSGIS +GLAD_API_CALL PFNGLPIXELTEXGENPARAMETERFVSGISPROC glad_glPixelTexGenParameterfvSGIS; +#define glPixelTexGenParameterfvSGIS glad_glPixelTexGenParameterfvSGIS +GLAD_API_CALL PFNGLPIXELTEXGENPARAMETERISGISPROC glad_glPixelTexGenParameteriSGIS; +#define glPixelTexGenParameteriSGIS glad_glPixelTexGenParameteriSGIS +GLAD_API_CALL PFNGLPIXELTEXGENPARAMETERIVSGISPROC glad_glPixelTexGenParameterivSGIS; +#define glPixelTexGenParameterivSGIS glad_glPixelTexGenParameterivSGIS +GLAD_API_CALL PFNGLPIXELTEXGENSGIXPROC glad_glPixelTexGenSGIX; +#define glPixelTexGenSGIX glad_glPixelTexGenSGIX +GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf; +#define glPixelTransferf glad_glPixelTransferf +GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi; +#define glPixelTransferi glad_glPixelTransferi +GLAD_API_CALL PFNGLPIXELTRANSFERXOESPROC glad_glPixelTransferxOES; +#define glPixelTransferxOES glad_glPixelTransferxOES +GLAD_API_CALL PFNGLPIXELTRANSFORMPARAMETERFEXTPROC glad_glPixelTransformParameterfEXT; +#define glPixelTransformParameterfEXT glad_glPixelTransformParameterfEXT +GLAD_API_CALL PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC glad_glPixelTransformParameterfvEXT; +#define glPixelTransformParameterfvEXT glad_glPixelTransformParameterfvEXT +GLAD_API_CALL PFNGLPIXELTRANSFORMPARAMETERIEXTPROC glad_glPixelTransformParameteriEXT; +#define glPixelTransformParameteriEXT glad_glPixelTransformParameteriEXT +GLAD_API_CALL PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC glad_glPixelTransformParameterivEXT; +#define glPixelTransformParameterivEXT glad_glPixelTransformParameterivEXT +GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom; +#define glPixelZoom glad_glPixelZoom +GLAD_API_CALL PFNGLPIXELZOOMXOESPROC glad_glPixelZoomxOES; +#define glPixelZoomxOES glad_glPixelZoomxOES +GLAD_API_CALL PFNGLPOINTALONGPATHNVPROC glad_glPointAlongPathNV; +#define glPointAlongPathNV glad_glPointAlongPathNV +GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +GLAD_API_CALL PFNGLPOINTPARAMETERFARBPROC glad_glPointParameterfARB; +#define glPointParameterfARB glad_glPointParameterfARB +GLAD_API_CALL PFNGLPOINTPARAMETERFEXTPROC glad_glPointParameterfEXT; +#define glPointParameterfEXT glad_glPointParameterfEXT +GLAD_API_CALL PFNGLPOINTPARAMETERFSGISPROC glad_glPointParameterfSGIS; +#define glPointParameterfSGIS glad_glPointParameterfSGIS +GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +GLAD_API_CALL PFNGLPOINTPARAMETERFVARBPROC glad_glPointParameterfvARB; +#define glPointParameterfvARB glad_glPointParameterfvARB +GLAD_API_CALL PFNGLPOINTPARAMETERFVEXTPROC glad_glPointParameterfvEXT; +#define glPointParameterfvEXT glad_glPointParameterfvEXT +GLAD_API_CALL PFNGLPOINTPARAMETERFVSGISPROC glad_glPointParameterfvSGIS; +#define glPointParameterfvSGIS glad_glPointParameterfvSGIS +GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +GLAD_API_CALL PFNGLPOINTPARAMETERINVPROC glad_glPointParameteriNV; +#define glPointParameteriNV glad_glPointParameteriNV +GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +GLAD_API_CALL PFNGLPOINTPARAMETERIVNVPROC glad_glPointParameterivNV; +#define glPointParameterivNV glad_glPointParameterivNV +GLAD_API_CALL PFNGLPOINTPARAMETERXVOESPROC glad_glPointParameterxvOES; +#define glPointParameterxvOES glad_glPointParameterxvOES +GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +GLAD_API_CALL PFNGLPOINTSIZEXOESPROC glad_glPointSizexOES; +#define glPointSizexOES glad_glPointSizexOES +GLAD_API_CALL PFNGLPOLLASYNCSGIXPROC glad_glPollAsyncSGIX; +#define glPollAsyncSGIX glad_glPollAsyncSGIX +GLAD_API_CALL PFNGLPOLLINSTRUMENTSSGIXPROC glad_glPollInstrumentsSGIX; +#define glPollInstrumentsSGIX glad_glPollInstrumentsSGIX +GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; +#define glPolygonOffsetClamp glad_glPolygonOffsetClamp +GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPEXTPROC glad_glPolygonOffsetClampEXT; +#define glPolygonOffsetClampEXT glad_glPolygonOffsetClampEXT +GLAD_API_CALL PFNGLPOLYGONOFFSETEXTPROC glad_glPolygonOffsetEXT; +#define glPolygonOffsetEXT glad_glPolygonOffsetEXT +GLAD_API_CALL PFNGLPOLYGONOFFSETXOESPROC glad_glPolygonOffsetxOES; +#define glPolygonOffsetxOES glad_glPolygonOffsetxOES +GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple; +#define glPolygonStipple glad_glPolygonStipple +GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib; +#define glPopAttrib glad_glPopAttrib +GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; +#define glPopClientAttrib glad_glPopClientAttrib +GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; +#define glPopDebugGroup glad_glPopDebugGroup +GLAD_API_CALL PFNGLPOPGROUPMARKEREXTPROC glad_glPopGroupMarkerEXT; +#define glPopGroupMarkerEXT glad_glPopGroupMarkerEXT +GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix; +#define glPopMatrix glad_glPopMatrix +GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName; +#define glPopName glad_glPopName +GLAD_API_CALL PFNGLPRESENTFRAMEDUALFILLNVPROC glad_glPresentFrameDualFillNV; +#define glPresentFrameDualFillNV glad_glPresentFrameDualFillNV +GLAD_API_CALL PFNGLPRESENTFRAMEKEYEDNVPROC glad_glPresentFrameKeyedNV; +#define glPresentFrameKeyedNV glad_glPresentFrameKeyedNV +GLAD_API_CALL PFNGLPRIMITIVEBOUNDINGBOXARBPROC glad_glPrimitiveBoundingBoxARB; +#define glPrimitiveBoundingBoxARB glad_glPrimitiveBoundingBoxARB +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXNVPROC glad_glPrimitiveRestartIndexNV; +#define glPrimitiveRestartIndexNV glad_glPrimitiveRestartIndexNV +GLAD_API_CALL PFNGLPRIMITIVERESTARTNVPROC glad_glPrimitiveRestartNV; +#define glPrimitiveRestartNV glad_glPrimitiveRestartNV +GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures; +#define glPrioritizeTextures glad_glPrioritizeTextures +GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT; +#define glPrioritizeTexturesEXT glad_glPrioritizeTexturesEXT +GLAD_API_CALL PFNGLPRIORITIZETEXTURESXOESPROC glad_glPrioritizeTexturesxOES; +#define glPrioritizeTexturesxOES glad_glPrioritizeTexturesxOES +GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary; +#define glProgramBinary glad_glProgramBinary +GLAD_API_CALL PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC glad_glProgramBufferParametersIivNV; +#define glProgramBufferParametersIivNV glad_glProgramBufferParametersIivNV +GLAD_API_CALL PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC glad_glProgramBufferParametersIuivNV; +#define glProgramBufferParametersIuivNV glad_glProgramBufferParametersIuivNV +GLAD_API_CALL PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC glad_glProgramBufferParametersfvNV; +#define glProgramBufferParametersfvNV glad_glProgramBufferParametersfvNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB; +#define glProgramEnvParameter4dARB glad_glProgramEnvParameter4dARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB; +#define glProgramEnvParameter4dvARB glad_glProgramEnvParameter4dvARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB; +#define glProgramEnvParameter4fARB glad_glProgramEnvParameter4fARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB; +#define glProgramEnvParameter4fvARB glad_glProgramEnvParameter4fvARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERI4INVPROC glad_glProgramEnvParameterI4iNV; +#define glProgramEnvParameterI4iNV glad_glProgramEnvParameterI4iNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERI4IVNVPROC glad_glProgramEnvParameterI4ivNV; +#define glProgramEnvParameterI4ivNV glad_glProgramEnvParameterI4ivNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERI4UINVPROC glad_glProgramEnvParameterI4uiNV; +#define glProgramEnvParameterI4uiNV glad_glProgramEnvParameterI4uiNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERI4UIVNVPROC glad_glProgramEnvParameterI4uivNV; +#define glProgramEnvParameterI4uivNV glad_glProgramEnvParameterI4uivNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERS4FVEXTPROC glad_glProgramEnvParameters4fvEXT; +#define glProgramEnvParameters4fvEXT glad_glProgramEnvParameters4fvEXT +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERSI4IVNVPROC glad_glProgramEnvParametersI4ivNV; +#define glProgramEnvParametersI4ivNV glad_glProgramEnvParametersI4ivNV +GLAD_API_CALL PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC glad_glProgramEnvParametersI4uivNV; +#define glProgramEnvParametersI4uivNV glad_glProgramEnvParametersI4uivNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB; +#define glProgramLocalParameter4dARB glad_glProgramLocalParameter4dARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB; +#define glProgramLocalParameter4dvARB glad_glProgramLocalParameter4dvARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB; +#define glProgramLocalParameter4fARB glad_glProgramLocalParameter4fARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB; +#define glProgramLocalParameter4fvARB glad_glProgramLocalParameter4fvARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERI4INVPROC glad_glProgramLocalParameterI4iNV; +#define glProgramLocalParameterI4iNV glad_glProgramLocalParameterI4iNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC glad_glProgramLocalParameterI4ivNV; +#define glProgramLocalParameterI4ivNV glad_glProgramLocalParameterI4ivNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERI4UINVPROC glad_glProgramLocalParameterI4uiNV; +#define glProgramLocalParameterI4uiNV glad_glProgramLocalParameterI4uiNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC glad_glProgramLocalParameterI4uivNV; +#define glProgramLocalParameterI4uivNV glad_glProgramLocalParameterI4uivNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glProgramLocalParameters4fvEXT; +#define glProgramLocalParameters4fvEXT glad_glProgramLocalParameters4fvEXT +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC glad_glProgramLocalParametersI4ivNV; +#define glProgramLocalParametersI4ivNV glad_glProgramLocalParametersI4ivNV +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC glad_glProgramLocalParametersI4uivNV; +#define glProgramLocalParametersI4uivNV glad_glProgramLocalParametersI4uivNV +GLAD_API_CALL PFNGLPROGRAMNAMEDPARAMETER4DNVPROC glad_glProgramNamedParameter4dNV; +#define glProgramNamedParameter4dNV glad_glProgramNamedParameter4dNV +GLAD_API_CALL PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC glad_glProgramNamedParameter4dvNV; +#define glProgramNamedParameter4dvNV glad_glProgramNamedParameter4dvNV +GLAD_API_CALL PFNGLPROGRAMNAMEDPARAMETER4FNVPROC glad_glProgramNamedParameter4fNV; +#define glProgramNamedParameter4fNV glad_glProgramNamedParameter4fNV +GLAD_API_CALL PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC glad_glProgramNamedParameter4fvNV; +#define glProgramNamedParameter4fvNV glad_glProgramNamedParameter4fvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV; +#define glProgramParameter4dNV glad_glProgramParameter4dNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV; +#define glProgramParameter4dvNV glad_glProgramParameter4dvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV; +#define glProgramParameter4fNV glad_glProgramParameter4fNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV; +#define glProgramParameter4fvNV glad_glProgramParameter4fvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; +#define glProgramParameteri glad_glProgramParameteri +GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB; +#define glProgramParameteriARB glad_glProgramParameteriARB +GLAD_API_CALL PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT; +#define glProgramParameteriEXT glad_glProgramParameteriEXT +GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV; +#define glProgramParameters4dvNV glad_glProgramParameters4dvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV; +#define glProgramParameters4fvNV glad_glProgramParameters4fvNV +GLAD_API_CALL PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC glad_glProgramPathFragmentInputGenNV; +#define glProgramPathFragmentInputGenNV glad_glProgramPathFragmentInputGenNV +GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB; +#define glProgramStringARB glad_glProgramStringARB +GLAD_API_CALL PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC glad_glProgramSubroutineParametersuivNV; +#define glProgramSubroutineParametersuivNV glad_glProgramSubroutineParametersuivNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d; +#define glProgramUniform1d glad_glProgramUniform1d +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DEXTPROC glad_glProgramUniform1dEXT; +#define glProgramUniform1dEXT glad_glProgramUniform1dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv; +#define glProgramUniform1dv glad_glProgramUniform1dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVEXTPROC glad_glProgramUniform1dvEXT; +#define glProgramUniform1dvEXT glad_glProgramUniform1dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; +#define glProgramUniform1f glad_glProgramUniform1f +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FEXTPROC glad_glProgramUniform1fEXT; +#define glProgramUniform1fEXT glad_glProgramUniform1fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; +#define glProgramUniform1fv glad_glProgramUniform1fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVEXTPROC glad_glProgramUniform1fvEXT; +#define glProgramUniform1fvEXT glad_glProgramUniform1fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; +#define glProgramUniform1i glad_glProgramUniform1i +GLAD_API_CALL PFNGLPROGRAMUNIFORM1I64ARBPROC glad_glProgramUniform1i64ARB; +#define glProgramUniform1i64ARB glad_glProgramUniform1i64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM1I64NVPROC glad_glProgramUniform1i64NV; +#define glProgramUniform1i64NV glad_glProgramUniform1i64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM1I64VARBPROC glad_glProgramUniform1i64vARB; +#define glProgramUniform1i64vARB glad_glProgramUniform1i64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM1I64VNVPROC glad_glProgramUniform1i64vNV; +#define glProgramUniform1i64vNV glad_glProgramUniform1i64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IEXTPROC glad_glProgramUniform1iEXT; +#define glProgramUniform1iEXT glad_glProgramUniform1iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; +#define glProgramUniform1iv glad_glProgramUniform1iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVEXTPROC glad_glProgramUniform1ivEXT; +#define glProgramUniform1ivEXT glad_glProgramUniform1ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; +#define glProgramUniform1ui glad_glProgramUniform1ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UI64ARBPROC glad_glProgramUniform1ui64ARB; +#define glProgramUniform1ui64ARB glad_glProgramUniform1ui64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UI64NVPROC glad_glProgramUniform1ui64NV; +#define glProgramUniform1ui64NV glad_glProgramUniform1ui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UI64VARBPROC glad_glProgramUniform1ui64vARB; +#define glProgramUniform1ui64vARB glad_glProgramUniform1ui64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UI64VNVPROC glad_glProgramUniform1ui64vNV; +#define glProgramUniform1ui64vNV glad_glProgramUniform1ui64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIEXTPROC glad_glProgramUniform1uiEXT; +#define glProgramUniform1uiEXT glad_glProgramUniform1uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; +#define glProgramUniform1uiv glad_glProgramUniform1uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVEXTPROC glad_glProgramUniform1uivEXT; +#define glProgramUniform1uivEXT glad_glProgramUniform1uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d; +#define glProgramUniform2d glad_glProgramUniform2d +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DEXTPROC glad_glProgramUniform2dEXT; +#define glProgramUniform2dEXT glad_glProgramUniform2dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv; +#define glProgramUniform2dv glad_glProgramUniform2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVEXTPROC glad_glProgramUniform2dvEXT; +#define glProgramUniform2dvEXT glad_glProgramUniform2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; +#define glProgramUniform2f glad_glProgramUniform2f +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FEXTPROC glad_glProgramUniform2fEXT; +#define glProgramUniform2fEXT glad_glProgramUniform2fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; +#define glProgramUniform2fv glad_glProgramUniform2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVEXTPROC glad_glProgramUniform2fvEXT; +#define glProgramUniform2fvEXT glad_glProgramUniform2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; +#define glProgramUniform2i glad_glProgramUniform2i +GLAD_API_CALL PFNGLPROGRAMUNIFORM2I64ARBPROC glad_glProgramUniform2i64ARB; +#define glProgramUniform2i64ARB glad_glProgramUniform2i64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM2I64NVPROC glad_glProgramUniform2i64NV; +#define glProgramUniform2i64NV glad_glProgramUniform2i64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM2I64VARBPROC glad_glProgramUniform2i64vARB; +#define glProgramUniform2i64vARB glad_glProgramUniform2i64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM2I64VNVPROC glad_glProgramUniform2i64vNV; +#define glProgramUniform2i64vNV glad_glProgramUniform2i64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IEXTPROC glad_glProgramUniform2iEXT; +#define glProgramUniform2iEXT glad_glProgramUniform2iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; +#define glProgramUniform2iv glad_glProgramUniform2iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVEXTPROC glad_glProgramUniform2ivEXT; +#define glProgramUniform2ivEXT glad_glProgramUniform2ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; +#define glProgramUniform2ui glad_glProgramUniform2ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UI64ARBPROC glad_glProgramUniform2ui64ARB; +#define glProgramUniform2ui64ARB glad_glProgramUniform2ui64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UI64NVPROC glad_glProgramUniform2ui64NV; +#define glProgramUniform2ui64NV glad_glProgramUniform2ui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UI64VARBPROC glad_glProgramUniform2ui64vARB; +#define glProgramUniform2ui64vARB glad_glProgramUniform2ui64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UI64VNVPROC glad_glProgramUniform2ui64vNV; +#define glProgramUniform2ui64vNV glad_glProgramUniform2ui64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIEXTPROC glad_glProgramUniform2uiEXT; +#define glProgramUniform2uiEXT glad_glProgramUniform2uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; +#define glProgramUniform2uiv glad_glProgramUniform2uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVEXTPROC glad_glProgramUniform2uivEXT; +#define glProgramUniform2uivEXT glad_glProgramUniform2uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d; +#define glProgramUniform3d glad_glProgramUniform3d +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DEXTPROC glad_glProgramUniform3dEXT; +#define glProgramUniform3dEXT glad_glProgramUniform3dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv; +#define glProgramUniform3dv glad_glProgramUniform3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVEXTPROC glad_glProgramUniform3dvEXT; +#define glProgramUniform3dvEXT glad_glProgramUniform3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; +#define glProgramUniform3f glad_glProgramUniform3f +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FEXTPROC glad_glProgramUniform3fEXT; +#define glProgramUniform3fEXT glad_glProgramUniform3fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; +#define glProgramUniform3fv glad_glProgramUniform3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVEXTPROC glad_glProgramUniform3fvEXT; +#define glProgramUniform3fvEXT glad_glProgramUniform3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; +#define glProgramUniform3i glad_glProgramUniform3i +GLAD_API_CALL PFNGLPROGRAMUNIFORM3I64ARBPROC glad_glProgramUniform3i64ARB; +#define glProgramUniform3i64ARB glad_glProgramUniform3i64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM3I64NVPROC glad_glProgramUniform3i64NV; +#define glProgramUniform3i64NV glad_glProgramUniform3i64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM3I64VARBPROC glad_glProgramUniform3i64vARB; +#define glProgramUniform3i64vARB glad_glProgramUniform3i64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM3I64VNVPROC glad_glProgramUniform3i64vNV; +#define glProgramUniform3i64vNV glad_glProgramUniform3i64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IEXTPROC glad_glProgramUniform3iEXT; +#define glProgramUniform3iEXT glad_glProgramUniform3iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; +#define glProgramUniform3iv glad_glProgramUniform3iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVEXTPROC glad_glProgramUniform3ivEXT; +#define glProgramUniform3ivEXT glad_glProgramUniform3ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; +#define glProgramUniform3ui glad_glProgramUniform3ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UI64ARBPROC glad_glProgramUniform3ui64ARB; +#define glProgramUniform3ui64ARB glad_glProgramUniform3ui64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UI64NVPROC glad_glProgramUniform3ui64NV; +#define glProgramUniform3ui64NV glad_glProgramUniform3ui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UI64VARBPROC glad_glProgramUniform3ui64vARB; +#define glProgramUniform3ui64vARB glad_glProgramUniform3ui64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UI64VNVPROC glad_glProgramUniform3ui64vNV; +#define glProgramUniform3ui64vNV glad_glProgramUniform3ui64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIEXTPROC glad_glProgramUniform3uiEXT; +#define glProgramUniform3uiEXT glad_glProgramUniform3uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; +#define glProgramUniform3uiv glad_glProgramUniform3uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVEXTPROC glad_glProgramUniform3uivEXT; +#define glProgramUniform3uivEXT glad_glProgramUniform3uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d; +#define glProgramUniform4d glad_glProgramUniform4d +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DEXTPROC glad_glProgramUniform4dEXT; +#define glProgramUniform4dEXT glad_glProgramUniform4dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv; +#define glProgramUniform4dv glad_glProgramUniform4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVEXTPROC glad_glProgramUniform4dvEXT; +#define glProgramUniform4dvEXT glad_glProgramUniform4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; +#define glProgramUniform4f glad_glProgramUniform4f +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FEXTPROC glad_glProgramUniform4fEXT; +#define glProgramUniform4fEXT glad_glProgramUniform4fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; +#define glProgramUniform4fv glad_glProgramUniform4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVEXTPROC glad_glProgramUniform4fvEXT; +#define glProgramUniform4fvEXT glad_glProgramUniform4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; +#define glProgramUniform4i glad_glProgramUniform4i +GLAD_API_CALL PFNGLPROGRAMUNIFORM4I64ARBPROC glad_glProgramUniform4i64ARB; +#define glProgramUniform4i64ARB glad_glProgramUniform4i64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM4I64NVPROC glad_glProgramUniform4i64NV; +#define glProgramUniform4i64NV glad_glProgramUniform4i64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM4I64VARBPROC glad_glProgramUniform4i64vARB; +#define glProgramUniform4i64vARB glad_glProgramUniform4i64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM4I64VNVPROC glad_glProgramUniform4i64vNV; +#define glProgramUniform4i64vNV glad_glProgramUniform4i64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IEXTPROC glad_glProgramUniform4iEXT; +#define glProgramUniform4iEXT glad_glProgramUniform4iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; +#define glProgramUniform4iv glad_glProgramUniform4iv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVEXTPROC glad_glProgramUniform4ivEXT; +#define glProgramUniform4ivEXT glad_glProgramUniform4ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; +#define glProgramUniform4ui glad_glProgramUniform4ui +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UI64ARBPROC glad_glProgramUniform4ui64ARB; +#define glProgramUniform4ui64ARB glad_glProgramUniform4ui64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UI64NVPROC glad_glProgramUniform4ui64NV; +#define glProgramUniform4ui64NV glad_glProgramUniform4ui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UI64VARBPROC glad_glProgramUniform4ui64vARB; +#define glProgramUniform4ui64vARB glad_glProgramUniform4ui64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UI64VNVPROC glad_glProgramUniform4ui64vNV; +#define glProgramUniform4ui64vNV glad_glProgramUniform4ui64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIEXTPROC glad_glProgramUniform4uiEXT; +#define glProgramUniform4uiEXT glad_glProgramUniform4uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; +#define glProgramUniform4uiv glad_glProgramUniform4uiv +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVEXTPROC glad_glProgramUniform4uivEXT; +#define glProgramUniform4uivEXT glad_glProgramUniform4uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC glad_glProgramUniformHandleui64ARB; +#define glProgramUniformHandleui64ARB glad_glProgramUniformHandleui64ARB +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC glad_glProgramUniformHandleui64NV; +#define glProgramUniformHandleui64NV glad_glProgramUniformHandleui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC glad_glProgramUniformHandleui64vARB; +#define glProgramUniformHandleui64vARB glad_glProgramUniformHandleui64vARB +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC glad_glProgramUniformHandleui64vNV; +#define glProgramUniformHandleui64vNV glad_glProgramUniformHandleui64vNV +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv; +#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC glad_glProgramUniformMatrix2dvEXT; +#define glProgramUniformMatrix2dvEXT glad_glProgramUniformMatrix2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; +#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC glad_glProgramUniformMatrix2fvEXT; +#define glProgramUniformMatrix2fvEXT glad_glProgramUniformMatrix2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv; +#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC glad_glProgramUniformMatrix2x3dvEXT; +#define glProgramUniformMatrix2x3dvEXT glad_glProgramUniformMatrix2x3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; +#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC glad_glProgramUniformMatrix2x3fvEXT; +#define glProgramUniformMatrix2x3fvEXT glad_glProgramUniformMatrix2x3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv; +#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC glad_glProgramUniformMatrix2x4dvEXT; +#define glProgramUniformMatrix2x4dvEXT glad_glProgramUniformMatrix2x4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; +#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC glad_glProgramUniformMatrix2x4fvEXT; +#define glProgramUniformMatrix2x4fvEXT glad_glProgramUniformMatrix2x4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv; +#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC glad_glProgramUniformMatrix3dvEXT; +#define glProgramUniformMatrix3dvEXT glad_glProgramUniformMatrix3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; +#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC glad_glProgramUniformMatrix3fvEXT; +#define glProgramUniformMatrix3fvEXT glad_glProgramUniformMatrix3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv; +#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC glad_glProgramUniformMatrix3x2dvEXT; +#define glProgramUniformMatrix3x2dvEXT glad_glProgramUniformMatrix3x2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; +#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC glad_glProgramUniformMatrix3x2fvEXT; +#define glProgramUniformMatrix3x2fvEXT glad_glProgramUniformMatrix3x2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv; +#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC glad_glProgramUniformMatrix3x4dvEXT; +#define glProgramUniformMatrix3x4dvEXT glad_glProgramUniformMatrix3x4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; +#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC glad_glProgramUniformMatrix3x4fvEXT; +#define glProgramUniformMatrix3x4fvEXT glad_glProgramUniformMatrix3x4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv; +#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC glad_glProgramUniformMatrix4dvEXT; +#define glProgramUniformMatrix4dvEXT glad_glProgramUniformMatrix4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; +#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC glad_glProgramUniformMatrix4fvEXT; +#define glProgramUniformMatrix4fvEXT glad_glProgramUniformMatrix4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv; +#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC glad_glProgramUniformMatrix4x2dvEXT; +#define glProgramUniformMatrix4x2dvEXT glad_glProgramUniformMatrix4x2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; +#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC glad_glProgramUniformMatrix4x2fvEXT; +#define glProgramUniformMatrix4x2fvEXT glad_glProgramUniformMatrix4x2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv; +#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC glad_glProgramUniformMatrix4x3dvEXT; +#define glProgramUniformMatrix4x3dvEXT glad_glProgramUniformMatrix4x3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; +#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC glad_glProgramUniformMatrix4x3fvEXT; +#define glProgramUniformMatrix4x3fvEXT glad_glProgramUniformMatrix4x3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMUI64NVPROC glad_glProgramUniformui64NV; +#define glProgramUniformui64NV glad_glProgramUniformui64NV +GLAD_API_CALL PFNGLPROGRAMUNIFORMUI64VNVPROC glad_glProgramUniformui64vNV; +#define glProgramUniformui64vNV glad_glProgramUniformui64vNV +GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV; +#define glProgramVertexLimitNV glad_glProgramVertexLimitNV +GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +GLAD_API_CALL PFNGLPROVOKINGVERTEXEXTPROC glad_glProvokingVertexEXT; +#define glProvokingVertexEXT glad_glProvokingVertexEXT +GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib; +#define glPushAttrib glad_glPushAttrib +GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib; +#define glPushClientAttrib glad_glPushClientAttrib +GLAD_API_CALL PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC glad_glPushClientAttribDefaultEXT; +#define glPushClientAttribDefaultEXT glad_glPushClientAttribDefaultEXT +GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; +#define glPushDebugGroup glad_glPushDebugGroup +GLAD_API_CALL PFNGLPUSHGROUPMARKEREXTPROC glad_glPushGroupMarkerEXT; +#define glPushGroupMarkerEXT glad_glPushGroupMarkerEXT +GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix; +#define glPushMatrix glad_glPushMatrix +GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName; +#define glPushName glad_glPushName +GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +GLAD_API_CALL PFNGLQUERYMATRIXXOESPROC glad_glQueryMatrixxOES; +#define glQueryMatrixxOES glad_glQueryMatrixxOES +GLAD_API_CALL PFNGLQUERYOBJECTPARAMETERUIAMDPROC glad_glQueryObjectParameteruiAMD; +#define glQueryObjectParameteruiAMD glad_glQueryObjectParameteruiAMD +GLAD_API_CALL PFNGLQUERYRESOURCENVPROC glad_glQueryResourceNV; +#define glQueryResourceNV glad_glQueryResourceNV +GLAD_API_CALL PFNGLQUERYRESOURCETAGNVPROC glad_glQueryResourceTagNV; +#define glQueryResourceTagNV glad_glQueryResourceTagNV +GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d; +#define glRasterPos2d glad_glRasterPos2d +GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv; +#define glRasterPos2dv glad_glRasterPos2dv +GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f; +#define glRasterPos2f glad_glRasterPos2f +GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv; +#define glRasterPos2fv glad_glRasterPos2fv +GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i; +#define glRasterPos2i glad_glRasterPos2i +GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv; +#define glRasterPos2iv glad_glRasterPos2iv +GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s; +#define glRasterPos2s glad_glRasterPos2s +GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv; +#define glRasterPos2sv glad_glRasterPos2sv +GLAD_API_CALL PFNGLRASTERPOS2XOESPROC glad_glRasterPos2xOES; +#define glRasterPos2xOES glad_glRasterPos2xOES +GLAD_API_CALL PFNGLRASTERPOS2XVOESPROC glad_glRasterPos2xvOES; +#define glRasterPos2xvOES glad_glRasterPos2xvOES +GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d; +#define glRasterPos3d glad_glRasterPos3d +GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv; +#define glRasterPos3dv glad_glRasterPos3dv +GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f; +#define glRasterPos3f glad_glRasterPos3f +GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv; +#define glRasterPos3fv glad_glRasterPos3fv +GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i; +#define glRasterPos3i glad_glRasterPos3i +GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv; +#define glRasterPos3iv glad_glRasterPos3iv +GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s; +#define glRasterPos3s glad_glRasterPos3s +GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv; +#define glRasterPos3sv glad_glRasterPos3sv +GLAD_API_CALL PFNGLRASTERPOS3XOESPROC glad_glRasterPos3xOES; +#define glRasterPos3xOES glad_glRasterPos3xOES +GLAD_API_CALL PFNGLRASTERPOS3XVOESPROC glad_glRasterPos3xvOES; +#define glRasterPos3xvOES glad_glRasterPos3xvOES +GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d; +#define glRasterPos4d glad_glRasterPos4d +GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv; +#define glRasterPos4dv glad_glRasterPos4dv +GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f; +#define glRasterPos4f glad_glRasterPos4f +GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv; +#define glRasterPos4fv glad_glRasterPos4fv +GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i; +#define glRasterPos4i glad_glRasterPos4i +GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv; +#define glRasterPos4iv glad_glRasterPos4iv +GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s; +#define glRasterPos4s glad_glRasterPos4s +GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv; +#define glRasterPos4sv glad_glRasterPos4sv +GLAD_API_CALL PFNGLRASTERPOS4XOESPROC glad_glRasterPos4xOES; +#define glRasterPos4xOES glad_glRasterPos4xOES +GLAD_API_CALL PFNGLRASTERPOS4XVOESPROC glad_glRasterPos4xvOES; +#define glRasterPos4xvOES glad_glRasterPos4xvOES +GLAD_API_CALL PFNGLRASTERSAMPLESEXTPROC glad_glRasterSamplesEXT; +#define glRasterSamplesEXT glad_glRasterSamplesEXT +GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +GLAD_API_CALL PFNGLREADINSTRUMENTSSGIXPROC glad_glReadInstrumentsSGIX; +#define glReadInstrumentsSGIX glad_glReadInstrumentsSGIX +GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +GLAD_API_CALL PFNGLREADNPIXELSPROC glad_glReadnPixels; +#define glReadnPixels glad_glReadnPixels +GLAD_API_CALL PFNGLREADNPIXELSARBPROC glad_glReadnPixelsARB; +#define glReadnPixelsARB glad_glReadnPixelsARB +GLAD_API_CALL PFNGLRECTDPROC glad_glRectd; +#define glRectd glad_glRectd +GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv; +#define glRectdv glad_glRectdv +GLAD_API_CALL PFNGLRECTFPROC glad_glRectf; +#define glRectf glad_glRectf +GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv; +#define glRectfv glad_glRectfv +GLAD_API_CALL PFNGLRECTIPROC glad_glRecti; +#define glRecti glad_glRecti +GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv; +#define glRectiv glad_glRectiv +GLAD_API_CALL PFNGLRECTSPROC glad_glRects; +#define glRects glad_glRects +GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv; +#define glRectsv glad_glRectsv +GLAD_API_CALL PFNGLRECTXOESPROC glad_glRectxOES; +#define glRectxOES glad_glRectxOES +GLAD_API_CALL PFNGLRECTXVOESPROC glad_glRectxvOES; +#define glRectxvOES glad_glRectxvOES +GLAD_API_CALL PFNGLREFERENCEPLANESGIXPROC glad_glReferencePlaneSGIX; +#define glReferencePlaneSGIX glad_glReferencePlaneSGIX +GLAD_API_CALL PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC glad_glReleaseKeyedMutexWin32EXT; +#define glReleaseKeyedMutexWin32EXT glad_glReleaseKeyedMutexWin32EXT +GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; +#define glReleaseShaderCompiler glad_glReleaseShaderCompiler +GLAD_API_CALL PFNGLRENDERGPUMASKNVPROC glad_glRenderGpuMaskNV; +#define glRenderGpuMaskNV glad_glRenderGpuMaskNV +GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode; +#define glRenderMode glad_glRenderMode +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT; +#define glRenderbufferStorageEXT glad_glRenderbufferStorageEXT +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC glad_glRenderbufferStorageMultisampleAdvancedAMD; +#define glRenderbufferStorageMultisampleAdvancedAMD glad_glRenderbufferStorageMultisampleAdvancedAMD +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC glad_glRenderbufferStorageMultisampleCoverageNV; +#define glRenderbufferStorageMultisampleCoverageNV glad_glRenderbufferStorageMultisampleCoverageNV +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT; +#define glRenderbufferStorageMultisampleEXT glad_glRenderbufferStorageMultisampleEXT +GLAD_API_CALL PFNGLREPLACEMENTCODEPOINTERSUNPROC glad_glReplacementCodePointerSUN; +#define glReplacementCodePointerSUN glad_glReplacementCodePointerSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUBSUNPROC glad_glReplacementCodeubSUN; +#define glReplacementCodeubSUN glad_glReplacementCodeubSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUBVSUNPROC glad_glReplacementCodeubvSUN; +#define glReplacementCodeubvSUN glad_glReplacementCodeubvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC glad_glReplacementCodeuiColor3fVertex3fSUN; +#define glReplacementCodeuiColor3fVertex3fSUN glad_glReplacementCodeuiColor3fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC glad_glReplacementCodeuiColor3fVertex3fvSUN; +#define glReplacementCodeuiColor3fVertex3fvSUN glad_glReplacementCodeuiColor3fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiColor4fNormal3fVertex3fSUN; +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN glad_glReplacementCodeuiColor4fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN glad_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC glad_glReplacementCodeuiColor4ubVertex3fSUN; +#define glReplacementCodeuiColor4ubVertex3fSUN glad_glReplacementCodeuiColor4ubVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC glad_glReplacementCodeuiColor4ubVertex3fvSUN; +#define glReplacementCodeuiColor4ubVertex3fvSUN glad_glReplacementCodeuiColor4ubVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiNormal3fVertex3fSUN; +#define glReplacementCodeuiNormal3fVertex3fSUN glad_glReplacementCodeuiNormal3fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiNormal3fVertex3fvSUN; +#define glReplacementCodeuiNormal3fVertex3fvSUN glad_glReplacementCodeuiNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUISUNPROC glad_glReplacementCodeuiSUN; +#define glReplacementCodeuiSUN glad_glReplacementCodeuiSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fVertex3fSUN; +#define glReplacementCodeuiTexCoord2fVertex3fSUN glad_glReplacementCodeuiTexCoord2fVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fVertex3fvSUN; +#define glReplacementCodeuiTexCoord2fVertex3fvSUN glad_glReplacementCodeuiTexCoord2fVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC glad_glReplacementCodeuiVertex3fSUN; +#define glReplacementCodeuiVertex3fSUN glad_glReplacementCodeuiVertex3fSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC glad_glReplacementCodeuiVertex3fvSUN; +#define glReplacementCodeuiVertex3fvSUN glad_glReplacementCodeuiVertex3fvSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUIVSUNPROC glad_glReplacementCodeuivSUN; +#define glReplacementCodeuivSUN glad_glReplacementCodeuivSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUSSUNPROC glad_glReplacementCodeusSUN; +#define glReplacementCodeusSUN glad_glReplacementCodeusSUN +GLAD_API_CALL PFNGLREPLACEMENTCODEUSVSUNPROC glad_glReplacementCodeusvSUN; +#define glReplacementCodeusvSUN glad_glReplacementCodeusvSUN +GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV; +#define glRequestResidentProgramsNV glad_glRequestResidentProgramsNV +GLAD_API_CALL PFNGLRESETHISTOGRAMPROC glad_glResetHistogram; +#define glResetHistogram glad_glResetHistogram +GLAD_API_CALL PFNGLRESETHISTOGRAMEXTPROC glad_glResetHistogramEXT; +#define glResetHistogramEXT glad_glResetHistogramEXT +GLAD_API_CALL PFNGLRESETMEMORYOBJECTPARAMETERNVPROC glad_glResetMemoryObjectParameterNV; +#define glResetMemoryObjectParameterNV glad_glResetMemoryObjectParameterNV +GLAD_API_CALL PFNGLRESETMINMAXPROC glad_glResetMinmax; +#define glResetMinmax glad_glResetMinmax +GLAD_API_CALL PFNGLRESETMINMAXEXTPROC glad_glResetMinmaxEXT; +#define glResetMinmaxEXT glad_glResetMinmaxEXT +GLAD_API_CALL PFNGLRESIZEBUFFERSMESAPROC glad_glResizeBuffersMESA; +#define glResizeBuffersMESA glad_glResizeBuffersMESA +GLAD_API_CALL PFNGLRESOLVEDEPTHVALUESNVPROC glad_glResolveDepthValuesNV; +#define glResolveDepthValuesNV glad_glResolveDepthValuesNV +GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; +#define glResumeTransformFeedback glad_glResumeTransformFeedback +GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKNVPROC glad_glResumeTransformFeedbackNV; +#define glResumeTransformFeedbackNV glad_glResumeTransformFeedbackNV +GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated; +#define glRotated glad_glRotated +GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef; +#define glRotatef glad_glRotatef +GLAD_API_CALL PFNGLROTATEXOESPROC glad_glRotatexOES; +#define glRotatexOES glad_glRotatexOES +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +GLAD_API_CALL PFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB; +#define glSampleCoverageARB glad_glSampleCoverageARB +GLAD_API_CALL PFNGLSAMPLEMAPATIPROC glad_glSampleMapATI; +#define glSampleMapATI glad_glSampleMapATI +GLAD_API_CALL PFNGLSAMPLEMASKEXTPROC glad_glSampleMaskEXT; +#define glSampleMaskEXT glad_glSampleMaskEXT +GLAD_API_CALL PFNGLSAMPLEMASKINDEXEDNVPROC glad_glSampleMaskIndexedNV; +#define glSampleMaskIndexedNV glad_glSampleMaskIndexedNV +GLAD_API_CALL PFNGLSAMPLEMASKSGISPROC glad_glSampleMaskSGIS; +#define glSampleMaskSGIS glad_glSampleMaskSGIS +GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +GLAD_API_CALL PFNGLSAMPLEPATTERNEXTPROC glad_glSamplePatternEXT; +#define glSamplePatternEXT glad_glSamplePatternEXT +GLAD_API_CALL PFNGLSAMPLEPATTERNSGISPROC glad_glSamplePatternSGIS; +#define glSamplePatternSGIS glad_glSamplePatternSGIS +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled; +#define glScaled glad_glScaled +GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef; +#define glScalef glad_glScalef +GLAD_API_CALL PFNGLSCALEXOESPROC glad_glScalexOES; +#define glScalexOES glad_glScalexOES +GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +GLAD_API_CALL PFNGLSCISSORARRAYVPROC glad_glScissorArrayv; +#define glScissorArrayv glad_glScissorArrayv +GLAD_API_CALL PFNGLSCISSOREXCLUSIVEARRAYVNVPROC glad_glScissorExclusiveArrayvNV; +#define glScissorExclusiveArrayvNV glad_glScissorExclusiveArrayvNV +GLAD_API_CALL PFNGLSCISSOREXCLUSIVENVPROC glad_glScissorExclusiveNV; +#define glScissorExclusiveNV glad_glScissorExclusiveNV +GLAD_API_CALL PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed; +#define glScissorIndexed glad_glScissorIndexed +GLAD_API_CALL PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv; +#define glScissorIndexedv glad_glScissorIndexedv +GLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b; +#define glSecondaryColor3b glad_glSecondaryColor3b +GLAD_API_CALL PFNGLSECONDARYCOLOR3BEXTPROC glad_glSecondaryColor3bEXT; +#define glSecondaryColor3bEXT glad_glSecondaryColor3bEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv; +#define glSecondaryColor3bv glad_glSecondaryColor3bv +GLAD_API_CALL PFNGLSECONDARYCOLOR3BVEXTPROC glad_glSecondaryColor3bvEXT; +#define glSecondaryColor3bvEXT glad_glSecondaryColor3bvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d; +#define glSecondaryColor3d glad_glSecondaryColor3d +GLAD_API_CALL PFNGLSECONDARYCOLOR3DEXTPROC glad_glSecondaryColor3dEXT; +#define glSecondaryColor3dEXT glad_glSecondaryColor3dEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv; +#define glSecondaryColor3dv glad_glSecondaryColor3dv +GLAD_API_CALL PFNGLSECONDARYCOLOR3DVEXTPROC glad_glSecondaryColor3dvEXT; +#define glSecondaryColor3dvEXT glad_glSecondaryColor3dvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f; +#define glSecondaryColor3f glad_glSecondaryColor3f +GLAD_API_CALL PFNGLSECONDARYCOLOR3FEXTPROC glad_glSecondaryColor3fEXT; +#define glSecondaryColor3fEXT glad_glSecondaryColor3fEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv; +#define glSecondaryColor3fv glad_glSecondaryColor3fv +GLAD_API_CALL PFNGLSECONDARYCOLOR3FVEXTPROC glad_glSecondaryColor3fvEXT; +#define glSecondaryColor3fvEXT glad_glSecondaryColor3fvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3HNVPROC glad_glSecondaryColor3hNV; +#define glSecondaryColor3hNV glad_glSecondaryColor3hNV +GLAD_API_CALL PFNGLSECONDARYCOLOR3HVNVPROC glad_glSecondaryColor3hvNV; +#define glSecondaryColor3hvNV glad_glSecondaryColor3hvNV +GLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i; +#define glSecondaryColor3i glad_glSecondaryColor3i +GLAD_API_CALL PFNGLSECONDARYCOLOR3IEXTPROC glad_glSecondaryColor3iEXT; +#define glSecondaryColor3iEXT glad_glSecondaryColor3iEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv; +#define glSecondaryColor3iv glad_glSecondaryColor3iv +GLAD_API_CALL PFNGLSECONDARYCOLOR3IVEXTPROC glad_glSecondaryColor3ivEXT; +#define glSecondaryColor3ivEXT glad_glSecondaryColor3ivEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s; +#define glSecondaryColor3s glad_glSecondaryColor3s +GLAD_API_CALL PFNGLSECONDARYCOLOR3SEXTPROC glad_glSecondaryColor3sEXT; +#define glSecondaryColor3sEXT glad_glSecondaryColor3sEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv; +#define glSecondaryColor3sv glad_glSecondaryColor3sv +GLAD_API_CALL PFNGLSECONDARYCOLOR3SVEXTPROC glad_glSecondaryColor3svEXT; +#define glSecondaryColor3svEXT glad_glSecondaryColor3svEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub; +#define glSecondaryColor3ub glad_glSecondaryColor3ub +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBEXTPROC glad_glSecondaryColor3ubEXT; +#define glSecondaryColor3ubEXT glad_glSecondaryColor3ubEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv; +#define glSecondaryColor3ubv glad_glSecondaryColor3ubv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVEXTPROC glad_glSecondaryColor3ubvEXT; +#define glSecondaryColor3ubvEXT glad_glSecondaryColor3ubvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui; +#define glSecondaryColor3ui glad_glSecondaryColor3ui +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIEXTPROC glad_glSecondaryColor3uiEXT; +#define glSecondaryColor3uiEXT glad_glSecondaryColor3uiEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv; +#define glSecondaryColor3uiv glad_glSecondaryColor3uiv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVEXTPROC glad_glSecondaryColor3uivEXT; +#define glSecondaryColor3uivEXT glad_glSecondaryColor3uivEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us; +#define glSecondaryColor3us glad_glSecondaryColor3us +GLAD_API_CALL PFNGLSECONDARYCOLOR3USEXTPROC glad_glSecondaryColor3usEXT; +#define glSecondaryColor3usEXT glad_glSecondaryColor3usEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv; +#define glSecondaryColor3usv glad_glSecondaryColor3usv +GLAD_API_CALL PFNGLSECONDARYCOLOR3USVEXTPROC glad_glSecondaryColor3usvEXT; +#define glSecondaryColor3usvEXT glad_glSecondaryColor3usvEXT +GLAD_API_CALL PFNGLSECONDARYCOLORFORMATNVPROC glad_glSecondaryColorFormatNV; +#define glSecondaryColorFormatNV glad_glSecondaryColorFormatNV +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; +#define glSecondaryColorP3ui glad_glSecondaryColorP3ui +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; +#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer; +#define glSecondaryColorPointer glad_glSecondaryColorPointer +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTEREXTPROC glad_glSecondaryColorPointerEXT; +#define glSecondaryColorPointerEXT glad_glSecondaryColorPointerEXT +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERLISTIBMPROC glad_glSecondaryColorPointerListIBM; +#define glSecondaryColorPointerListIBM glad_glSecondaryColorPointerListIBM +GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer; +#define glSelectBuffer glad_glSelectBuffer +GLAD_API_CALL PFNGLSELECTPERFMONITORCOUNTERSAMDPROC glad_glSelectPerfMonitorCountersAMD; +#define glSelectPerfMonitorCountersAMD glad_glSelectPerfMonitorCountersAMD +GLAD_API_CALL PFNGLSEMAPHOREPARAMETERIVNVPROC glad_glSemaphoreParameterivNV; +#define glSemaphoreParameterivNV glad_glSemaphoreParameterivNV +GLAD_API_CALL PFNGLSEMAPHOREPARAMETERUI64VEXTPROC glad_glSemaphoreParameterui64vEXT; +#define glSemaphoreParameterui64vEXT glad_glSemaphoreParameterui64vEXT +GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D; +#define glSeparableFilter2D glad_glSeparableFilter2D +GLAD_API_CALL PFNGLSEPARABLEFILTER2DEXTPROC glad_glSeparableFilter2DEXT; +#define glSeparableFilter2DEXT glad_glSeparableFilter2DEXT +GLAD_API_CALL PFNGLSETFENCEAPPLEPROC glad_glSetFenceAPPLE; +#define glSetFenceAPPLE glad_glSetFenceAPPLE +GLAD_API_CALL PFNGLSETFENCENVPROC glad_glSetFenceNV; +#define glSetFenceNV glad_glSetFenceNV +GLAD_API_CALL PFNGLSETFRAGMENTSHADERCONSTANTATIPROC glad_glSetFragmentShaderConstantATI; +#define glSetFragmentShaderConstantATI glad_glSetFragmentShaderConstantATI +GLAD_API_CALL PFNGLSETINVARIANTEXTPROC glad_glSetInvariantEXT; +#define glSetInvariantEXT glad_glSetInvariantEXT +GLAD_API_CALL PFNGLSETLOCALCONSTANTEXTPROC glad_glSetLocalConstantEXT; +#define glSetLocalConstantEXT glad_glSetLocalConstantEXT +GLAD_API_CALL PFNGLSETMULTISAMPLEFVAMDPROC glad_glSetMultisamplefvAMD; +#define glSetMultisamplefvAMD glad_glSetMultisamplefvAMD +GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel; +#define glShadeModel glad_glShadeModel +GLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary; +#define glShaderBinary glad_glShaderBinary +GLAD_API_CALL PFNGLSHADEROP1EXTPROC glad_glShaderOp1EXT; +#define glShaderOp1EXT glad_glShaderOp1EXT +GLAD_API_CALL PFNGLSHADEROP2EXTPROC glad_glShaderOp2EXT; +#define glShaderOp2EXT glad_glShaderOp2EXT +GLAD_API_CALL PFNGLSHADEROP3EXTPROC glad_glShaderOp3EXT; +#define glShaderOp3EXT glad_glShaderOp3EXT +GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +GLAD_API_CALL PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB; +#define glShaderSourceARB glad_glShaderSourceARB +GLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding; +#define glShaderStorageBlockBinding glad_glShaderStorageBlockBinding +GLAD_API_CALL PFNGLSHADINGRATEIMAGEBARRIERNVPROC glad_glShadingRateImageBarrierNV; +#define glShadingRateImageBarrierNV glad_glShadingRateImageBarrierNV +GLAD_API_CALL PFNGLSHADINGRATEIMAGEPALETTENVPROC glad_glShadingRateImagePaletteNV; +#define glShadingRateImagePaletteNV glad_glShadingRateImagePaletteNV +GLAD_API_CALL PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC glad_glShadingRateSampleOrderCustomNV; +#define glShadingRateSampleOrderCustomNV glad_glShadingRateSampleOrderCustomNV +GLAD_API_CALL PFNGLSHADINGRATESAMPLEORDERNVPROC glad_glShadingRateSampleOrderNV; +#define glShadingRateSampleOrderNV glad_glShadingRateSampleOrderNV +GLAD_API_CALL PFNGLSHARPENTEXFUNCSGISPROC glad_glSharpenTexFuncSGIS; +#define glSharpenTexFuncSGIS glad_glSharpenTexFuncSGIS +GLAD_API_CALL PFNGLSIGNALSEMAPHOREEXTPROC glad_glSignalSemaphoreEXT; +#define glSignalSemaphoreEXT glad_glSignalSemaphoreEXT +GLAD_API_CALL PFNGLSIGNALSEMAPHOREUI64NVXPROC glad_glSignalSemaphoreui64NVX; +#define glSignalSemaphoreui64NVX glad_glSignalSemaphoreui64NVX +GLAD_API_CALL PFNGLSIGNALVKFENCENVPROC glad_glSignalVkFenceNV; +#define glSignalVkFenceNV glad_glSignalVkFenceNV +GLAD_API_CALL PFNGLSIGNALVKSEMAPHORENVPROC glad_glSignalVkSemaphoreNV; +#define glSignalVkSemaphoreNV glad_glSignalVkSemaphoreNV +GLAD_API_CALL PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader; +#define glSpecializeShader glad_glSpecializeShader +GLAD_API_CALL PFNGLSPECIALIZESHADERARBPROC glad_glSpecializeShaderARB; +#define glSpecializeShaderARB glad_glSpecializeShaderARB +GLAD_API_CALL PFNGLSPRITEPARAMETERFSGIXPROC glad_glSpriteParameterfSGIX; +#define glSpriteParameterfSGIX glad_glSpriteParameterfSGIX +GLAD_API_CALL PFNGLSPRITEPARAMETERFVSGIXPROC glad_glSpriteParameterfvSGIX; +#define glSpriteParameterfvSGIX glad_glSpriteParameterfvSGIX +GLAD_API_CALL PFNGLSPRITEPARAMETERISGIXPROC glad_glSpriteParameteriSGIX; +#define glSpriteParameteriSGIX glad_glSpriteParameteriSGIX +GLAD_API_CALL PFNGLSPRITEPARAMETERIVSGIXPROC glad_glSpriteParameterivSGIX; +#define glSpriteParameterivSGIX glad_glSpriteParameterivSGIX +GLAD_API_CALL PFNGLSTARTINSTRUMENTSSGIXPROC glad_glStartInstrumentsSGIX; +#define glStartInstrumentsSGIX glad_glStartInstrumentsSGIX +GLAD_API_CALL PFNGLSTATECAPTURENVPROC glad_glStateCaptureNV; +#define glStateCaptureNV glad_glStateCaptureNV +GLAD_API_CALL PFNGLSTENCILCLEARTAGEXTPROC glad_glStencilClearTagEXT; +#define glStencilClearTagEXT glad_glStencilClearTagEXT +GLAD_API_CALL PFNGLSTENCILFILLPATHINSTANCEDNVPROC glad_glStencilFillPathInstancedNV; +#define glStencilFillPathInstancedNV glad_glStencilFillPathInstancedNV +GLAD_API_CALL PFNGLSTENCILFILLPATHNVPROC glad_glStencilFillPathNV; +#define glStencilFillPathNV glad_glStencilFillPathNV +GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEATIPROC glad_glStencilFuncSeparateATI; +#define glStencilFuncSeparateATI glad_glStencilFuncSeparateATI +GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +GLAD_API_CALL PFNGLSTENCILOPSEPARATEATIPROC glad_glStencilOpSeparateATI; +#define glStencilOpSeparateATI glad_glStencilOpSeparateATI +GLAD_API_CALL PFNGLSTENCILOPVALUEAMDPROC glad_glStencilOpValueAMD; +#define glStencilOpValueAMD glad_glStencilOpValueAMD +GLAD_API_CALL PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC glad_glStencilStrokePathInstancedNV; +#define glStencilStrokePathInstancedNV glad_glStencilStrokePathInstancedNV +GLAD_API_CALL PFNGLSTENCILSTROKEPATHNVPROC glad_glStencilStrokePathNV; +#define glStencilStrokePathNV glad_glStencilStrokePathNV +GLAD_API_CALL PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC glad_glStencilThenCoverFillPathInstancedNV; +#define glStencilThenCoverFillPathInstancedNV glad_glStencilThenCoverFillPathInstancedNV +GLAD_API_CALL PFNGLSTENCILTHENCOVERFILLPATHNVPROC glad_glStencilThenCoverFillPathNV; +#define glStencilThenCoverFillPathNV glad_glStencilThenCoverFillPathNV +GLAD_API_CALL PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC glad_glStencilThenCoverStrokePathInstancedNV; +#define glStencilThenCoverStrokePathInstancedNV glad_glStencilThenCoverStrokePathInstancedNV +GLAD_API_CALL PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC glad_glStencilThenCoverStrokePathNV; +#define glStencilThenCoverStrokePathNV glad_glStencilThenCoverStrokePathNV +GLAD_API_CALL PFNGLSTOPINSTRUMENTSSGIXPROC glad_glStopInstrumentsSGIX; +#define glStopInstrumentsSGIX glad_glStopInstrumentsSGIX +GLAD_API_CALL PFNGLSTRINGMARKERGREMEDYPROC glad_glStringMarkerGREMEDY; +#define glStringMarkerGREMEDY glad_glStringMarkerGREMEDY +GLAD_API_CALL PFNGLSUBPIXELPRECISIONBIASNVPROC glad_glSubpixelPrecisionBiasNV; +#define glSubpixelPrecisionBiasNV glad_glSubpixelPrecisionBiasNV +GLAD_API_CALL PFNGLSWIZZLEEXTPROC glad_glSwizzleEXT; +#define glSwizzleEXT glad_glSwizzleEXT +GLAD_API_CALL PFNGLSYNCTEXTUREINTELPROC glad_glSyncTextureINTEL; +#define glSyncTextureINTEL glad_glSyncTextureINTEL +GLAD_API_CALL PFNGLTAGSAMPLEBUFFERSGIXPROC glad_glTagSampleBufferSGIX; +#define glTagSampleBufferSGIX glad_glTagSampleBufferSGIX +GLAD_API_CALL PFNGLTANGENT3BEXTPROC glad_glTangent3bEXT; +#define glTangent3bEXT glad_glTangent3bEXT +GLAD_API_CALL PFNGLTANGENT3BVEXTPROC glad_glTangent3bvEXT; +#define glTangent3bvEXT glad_glTangent3bvEXT +GLAD_API_CALL PFNGLTANGENT3DEXTPROC glad_glTangent3dEXT; +#define glTangent3dEXT glad_glTangent3dEXT +GLAD_API_CALL PFNGLTANGENT3DVEXTPROC glad_glTangent3dvEXT; +#define glTangent3dvEXT glad_glTangent3dvEXT +GLAD_API_CALL PFNGLTANGENT3FEXTPROC glad_glTangent3fEXT; +#define glTangent3fEXT glad_glTangent3fEXT +GLAD_API_CALL PFNGLTANGENT3FVEXTPROC glad_glTangent3fvEXT; +#define glTangent3fvEXT glad_glTangent3fvEXT +GLAD_API_CALL PFNGLTANGENT3IEXTPROC glad_glTangent3iEXT; +#define glTangent3iEXT glad_glTangent3iEXT +GLAD_API_CALL PFNGLTANGENT3IVEXTPROC glad_glTangent3ivEXT; +#define glTangent3ivEXT glad_glTangent3ivEXT +GLAD_API_CALL PFNGLTANGENT3SEXTPROC glad_glTangent3sEXT; +#define glTangent3sEXT glad_glTangent3sEXT +GLAD_API_CALL PFNGLTANGENT3SVEXTPROC glad_glTangent3svEXT; +#define glTangent3svEXT glad_glTangent3svEXT +GLAD_API_CALL PFNGLTANGENTPOINTEREXTPROC glad_glTangentPointerEXT; +#define glTangentPointerEXT glad_glTangentPointerEXT +GLAD_API_CALL PFNGLTBUFFERMASK3DFXPROC glad_glTbufferMask3DFX; +#define glTbufferMask3DFX glad_glTbufferMask3DFX +GLAD_API_CALL PFNGLTESSELLATIONFACTORAMDPROC glad_glTessellationFactorAMD; +#define glTessellationFactorAMD glad_glTessellationFactorAMD +GLAD_API_CALL PFNGLTESSELLATIONMODEAMDPROC glad_glTessellationModeAMD; +#define glTessellationModeAMD glad_glTessellationModeAMD +GLAD_API_CALL PFNGLTESTFENCEAPPLEPROC glad_glTestFenceAPPLE; +#define glTestFenceAPPLE glad_glTestFenceAPPLE +GLAD_API_CALL PFNGLTESTFENCENVPROC glad_glTestFenceNV; +#define glTestFenceNV glad_glTestFenceNV +GLAD_API_CALL PFNGLTESTOBJECTAPPLEPROC glad_glTestObjectAPPLE; +#define glTestObjectAPPLE glad_glTestObjectAPPLE +GLAD_API_CALL PFNGLTEXATTACHMEMORYNVPROC glad_glTexAttachMemoryNV; +#define glTexAttachMemoryNV glad_glTexAttachMemoryNV +GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +GLAD_API_CALL PFNGLTEXBUFFERARBPROC glad_glTexBufferARB; +#define glTexBufferARB glad_glTexBufferARB +GLAD_API_CALL PFNGLTEXBUFFEREXTPROC glad_glTexBufferEXT; +#define glTexBufferEXT glad_glTexBufferEXT +GLAD_API_CALL PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange; +#define glTexBufferRange glad_glTexBufferRange +GLAD_API_CALL PFNGLTEXBUMPPARAMETERFVATIPROC glad_glTexBumpParameterfvATI; +#define glTexBumpParameterfvATI glad_glTexBumpParameterfvATI +GLAD_API_CALL PFNGLTEXBUMPPARAMETERIVATIPROC glad_glTexBumpParameterivATI; +#define glTexBumpParameterivATI glad_glTexBumpParameterivATI +GLAD_API_CALL PFNGLTEXCOORD1BOESPROC glad_glTexCoord1bOES; +#define glTexCoord1bOES glad_glTexCoord1bOES +GLAD_API_CALL PFNGLTEXCOORD1BVOESPROC glad_glTexCoord1bvOES; +#define glTexCoord1bvOES glad_glTexCoord1bvOES +GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d; +#define glTexCoord1d glad_glTexCoord1d +GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv; +#define glTexCoord1dv glad_glTexCoord1dv +GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f; +#define glTexCoord1f glad_glTexCoord1f +GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv; +#define glTexCoord1fv glad_glTexCoord1fv +GLAD_API_CALL PFNGLTEXCOORD1HNVPROC glad_glTexCoord1hNV; +#define glTexCoord1hNV glad_glTexCoord1hNV +GLAD_API_CALL PFNGLTEXCOORD1HVNVPROC glad_glTexCoord1hvNV; +#define glTexCoord1hvNV glad_glTexCoord1hvNV +GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i; +#define glTexCoord1i glad_glTexCoord1i +GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv; +#define glTexCoord1iv glad_glTexCoord1iv +GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s; +#define glTexCoord1s glad_glTexCoord1s +GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv; +#define glTexCoord1sv glad_glTexCoord1sv +GLAD_API_CALL PFNGLTEXCOORD1XOESPROC glad_glTexCoord1xOES; +#define glTexCoord1xOES glad_glTexCoord1xOES +GLAD_API_CALL PFNGLTEXCOORD1XVOESPROC glad_glTexCoord1xvOES; +#define glTexCoord1xvOES glad_glTexCoord1xvOES +GLAD_API_CALL PFNGLTEXCOORD2BOESPROC glad_glTexCoord2bOES; +#define glTexCoord2bOES glad_glTexCoord2bOES +GLAD_API_CALL PFNGLTEXCOORD2BVOESPROC glad_glTexCoord2bvOES; +#define glTexCoord2bvOES glad_glTexCoord2bvOES +GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d; +#define glTexCoord2d glad_glTexCoord2d +GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv; +#define glTexCoord2dv glad_glTexCoord2dv +GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f; +#define glTexCoord2f glad_glTexCoord2f +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC glad_glTexCoord2fColor3fVertex3fSUN; +#define glTexCoord2fColor3fVertex3fSUN glad_glTexCoord2fColor3fVertex3fSUN +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC glad_glTexCoord2fColor3fVertex3fvSUN; +#define glTexCoord2fColor3fVertex3fvSUN glad_glTexCoord2fColor3fVertex3fvSUN +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glTexCoord2fColor4fNormal3fVertex3fSUN; +#define glTexCoord2fColor4fNormal3fVertex3fSUN glad_glTexCoord2fColor4fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glTexCoord2fColor4fNormal3fVertex3fvSUN; +#define glTexCoord2fColor4fNormal3fVertex3fvSUN glad_glTexCoord2fColor4fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC glad_glTexCoord2fColor4ubVertex3fSUN; +#define glTexCoord2fColor4ubVertex3fSUN glad_glTexCoord2fColor4ubVertex3fSUN +GLAD_API_CALL PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC glad_glTexCoord2fColor4ubVertex3fvSUN; +#define glTexCoord2fColor4ubVertex3fvSUN glad_glTexCoord2fColor4ubVertex3fvSUN +GLAD_API_CALL PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC glad_glTexCoord2fNormal3fVertex3fSUN; +#define glTexCoord2fNormal3fVertex3fSUN glad_glTexCoord2fNormal3fVertex3fSUN +GLAD_API_CALL PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC glad_glTexCoord2fNormal3fVertex3fvSUN; +#define glTexCoord2fNormal3fVertex3fvSUN glad_glTexCoord2fNormal3fVertex3fvSUN +GLAD_API_CALL PFNGLTEXCOORD2FVERTEX3FSUNPROC glad_glTexCoord2fVertex3fSUN; +#define glTexCoord2fVertex3fSUN glad_glTexCoord2fVertex3fSUN +GLAD_API_CALL PFNGLTEXCOORD2FVERTEX3FVSUNPROC glad_glTexCoord2fVertex3fvSUN; +#define glTexCoord2fVertex3fvSUN glad_glTexCoord2fVertex3fvSUN +GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv; +#define glTexCoord2fv glad_glTexCoord2fv +GLAD_API_CALL PFNGLTEXCOORD2HNVPROC glad_glTexCoord2hNV; +#define glTexCoord2hNV glad_glTexCoord2hNV +GLAD_API_CALL PFNGLTEXCOORD2HVNVPROC glad_glTexCoord2hvNV; +#define glTexCoord2hvNV glad_glTexCoord2hvNV +GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i; +#define glTexCoord2i glad_glTexCoord2i +GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv; +#define glTexCoord2iv glad_glTexCoord2iv +GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s; +#define glTexCoord2s glad_glTexCoord2s +GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv; +#define glTexCoord2sv glad_glTexCoord2sv +GLAD_API_CALL PFNGLTEXCOORD2XOESPROC glad_glTexCoord2xOES; +#define glTexCoord2xOES glad_glTexCoord2xOES +GLAD_API_CALL PFNGLTEXCOORD2XVOESPROC glad_glTexCoord2xvOES; +#define glTexCoord2xvOES glad_glTexCoord2xvOES +GLAD_API_CALL PFNGLTEXCOORD3BOESPROC glad_glTexCoord3bOES; +#define glTexCoord3bOES glad_glTexCoord3bOES +GLAD_API_CALL PFNGLTEXCOORD3BVOESPROC glad_glTexCoord3bvOES; +#define glTexCoord3bvOES glad_glTexCoord3bvOES +GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d; +#define glTexCoord3d glad_glTexCoord3d +GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv; +#define glTexCoord3dv glad_glTexCoord3dv +GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f; +#define glTexCoord3f glad_glTexCoord3f +GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv; +#define glTexCoord3fv glad_glTexCoord3fv +GLAD_API_CALL PFNGLTEXCOORD3HNVPROC glad_glTexCoord3hNV; +#define glTexCoord3hNV glad_glTexCoord3hNV +GLAD_API_CALL PFNGLTEXCOORD3HVNVPROC glad_glTexCoord3hvNV; +#define glTexCoord3hvNV glad_glTexCoord3hvNV +GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i; +#define glTexCoord3i glad_glTexCoord3i +GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv; +#define glTexCoord3iv glad_glTexCoord3iv +GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s; +#define glTexCoord3s glad_glTexCoord3s +GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv; +#define glTexCoord3sv glad_glTexCoord3sv +GLAD_API_CALL PFNGLTEXCOORD3XOESPROC glad_glTexCoord3xOES; +#define glTexCoord3xOES glad_glTexCoord3xOES +GLAD_API_CALL PFNGLTEXCOORD3XVOESPROC glad_glTexCoord3xvOES; +#define glTexCoord3xvOES glad_glTexCoord3xvOES +GLAD_API_CALL PFNGLTEXCOORD4BOESPROC glad_glTexCoord4bOES; +#define glTexCoord4bOES glad_glTexCoord4bOES +GLAD_API_CALL PFNGLTEXCOORD4BVOESPROC glad_glTexCoord4bvOES; +#define glTexCoord4bvOES glad_glTexCoord4bvOES +GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d; +#define glTexCoord4d glad_glTexCoord4d +GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv; +#define glTexCoord4dv glad_glTexCoord4dv +GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f; +#define glTexCoord4f glad_glTexCoord4f +GLAD_API_CALL PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC glad_glTexCoord4fColor4fNormal3fVertex4fSUN; +#define glTexCoord4fColor4fNormal3fVertex4fSUN glad_glTexCoord4fColor4fNormal3fVertex4fSUN +GLAD_API_CALL PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC glad_glTexCoord4fColor4fNormal3fVertex4fvSUN; +#define glTexCoord4fColor4fNormal3fVertex4fvSUN glad_glTexCoord4fColor4fNormal3fVertex4fvSUN +GLAD_API_CALL PFNGLTEXCOORD4FVERTEX4FSUNPROC glad_glTexCoord4fVertex4fSUN; +#define glTexCoord4fVertex4fSUN glad_glTexCoord4fVertex4fSUN +GLAD_API_CALL PFNGLTEXCOORD4FVERTEX4FVSUNPROC glad_glTexCoord4fVertex4fvSUN; +#define glTexCoord4fVertex4fvSUN glad_glTexCoord4fVertex4fvSUN +GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv; +#define glTexCoord4fv glad_glTexCoord4fv +GLAD_API_CALL PFNGLTEXCOORD4HNVPROC glad_glTexCoord4hNV; +#define glTexCoord4hNV glad_glTexCoord4hNV +GLAD_API_CALL PFNGLTEXCOORD4HVNVPROC glad_glTexCoord4hvNV; +#define glTexCoord4hvNV glad_glTexCoord4hvNV +GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i; +#define glTexCoord4i glad_glTexCoord4i +GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv; +#define glTexCoord4iv glad_glTexCoord4iv +GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s; +#define glTexCoord4s glad_glTexCoord4s +GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv; +#define glTexCoord4sv glad_glTexCoord4sv +GLAD_API_CALL PFNGLTEXCOORD4XOESPROC glad_glTexCoord4xOES; +#define glTexCoord4xOES glad_glTexCoord4xOES +GLAD_API_CALL PFNGLTEXCOORD4XVOESPROC glad_glTexCoord4xvOES; +#define glTexCoord4xvOES glad_glTexCoord4xvOES +GLAD_API_CALL PFNGLTEXCOORDFORMATNVPROC glad_glTexCoordFormatNV; +#define glTexCoordFormatNV glad_glTexCoordFormatNV +GLAD_API_CALL PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; +#define glTexCoordP1ui glad_glTexCoordP1ui +GLAD_API_CALL PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; +#define glTexCoordP1uiv glad_glTexCoordP1uiv +GLAD_API_CALL PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; +#define glTexCoordP2ui glad_glTexCoordP2ui +GLAD_API_CALL PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; +#define glTexCoordP2uiv glad_glTexCoordP2uiv +GLAD_API_CALL PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; +#define glTexCoordP3ui glad_glTexCoordP3ui +GLAD_API_CALL PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; +#define glTexCoordP3uiv glad_glTexCoordP3uiv +GLAD_API_CALL PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; +#define glTexCoordP4ui glad_glTexCoordP4ui +GLAD_API_CALL PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; +#define glTexCoordP4uiv glad_glTexCoordP4uiv +GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer; +#define glTexCoordPointer glad_glTexCoordPointer +GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT; +#define glTexCoordPointerEXT glad_glTexCoordPointerEXT +GLAD_API_CALL PFNGLTEXCOORDPOINTERLISTIBMPROC glad_glTexCoordPointerListIBM; +#define glTexCoordPointerListIBM glad_glTexCoordPointerListIBM +GLAD_API_CALL PFNGLTEXCOORDPOINTERVINTELPROC glad_glTexCoordPointervINTEL; +#define glTexCoordPointervINTEL glad_glTexCoordPointervINTEL +GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf; +#define glTexEnvf glad_glTexEnvf +GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv; +#define glTexEnvfv glad_glTexEnvfv +GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi; +#define glTexEnvi glad_glTexEnvi +GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv; +#define glTexEnviv glad_glTexEnviv +GLAD_API_CALL PFNGLTEXENVXOESPROC glad_glTexEnvxOES; +#define glTexEnvxOES glad_glTexEnvxOES +GLAD_API_CALL PFNGLTEXENVXVOESPROC glad_glTexEnvxvOES; +#define glTexEnvxvOES glad_glTexEnvxvOES +GLAD_API_CALL PFNGLTEXFILTERFUNCSGISPROC glad_glTexFilterFuncSGIS; +#define glTexFilterFuncSGIS glad_glTexFilterFuncSGIS +GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend; +#define glTexGend glad_glTexGend +GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv; +#define glTexGendv glad_glTexGendv +GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf; +#define glTexGenf glad_glTexGenf +GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv; +#define glTexGenfv glad_glTexGenfv +GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni; +#define glTexGeni glad_glTexGeni +GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv; +#define glTexGeniv glad_glTexGeniv +GLAD_API_CALL PFNGLTEXGENXOESPROC glad_glTexGenxOES; +#define glTexGenxOES glad_glTexGenxOES +GLAD_API_CALL PFNGLTEXGENXVOESPROC glad_glTexGenxvOES; +#define glTexGenxvOES glad_glTexGenxvOES +GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC glad_glTexImage2DMultisampleCoverageNV; +#define glTexImage2DMultisampleCoverageNV glad_glTexImage2DMultisampleCoverageNV +GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +GLAD_API_CALL PFNGLTEXIMAGE3DEXTPROC glad_glTexImage3DEXT; +#define glTexImage3DEXT glad_glTexImage3DEXT +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC glad_glTexImage3DMultisampleCoverageNV; +#define glTexImage3DMultisampleCoverageNV glad_glTexImage3DMultisampleCoverageNV +GLAD_API_CALL PFNGLTEXIMAGE4DSGISPROC glad_glTexImage4DSGIS; +#define glTexImage4DSGIS glad_glTexImage4DSGIS +GLAD_API_CALL PFNGLTEXPAGECOMMITMENTARBPROC glad_glTexPageCommitmentARB; +#define glTexPageCommitmentARB glad_glTexPageCommitmentARB +GLAD_API_CALL PFNGLTEXPAGECOMMITMENTMEMNVPROC glad_glTexPageCommitmentMemNV; +#define glTexPageCommitmentMemNV glad_glTexPageCommitmentMemNV +GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +GLAD_API_CALL PFNGLTEXPARAMETERIIVEXTPROC glad_glTexParameterIivEXT; +#define glTexParameterIivEXT glad_glTexParameterIivEXT +GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +GLAD_API_CALL PFNGLTEXPARAMETERIUIVEXTPROC glad_glTexParameterIuivEXT; +#define glTexParameterIuivEXT glad_glTexParameterIuivEXT +GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXPARAMETERXOESPROC glad_glTexParameterxOES; +#define glTexParameterxOES glad_glTexParameterxOES +GLAD_API_CALL PFNGLTEXPARAMETERXVOESPROC glad_glTexParameterxvOES; +#define glTexParameterxvOES glad_glTexParameterxvOES +GLAD_API_CALL PFNGLTEXRENDERBUFFERNVPROC glad_glTexRenderbufferNV; +#define glTexRenderbufferNV glad_glTexRenderbufferNV +GLAD_API_CALL PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D; +#define glTexStorage1D glad_glTexStorage1D +GLAD_API_CALL PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT; +#define glTexStorage1DEXT glad_glTexStorage1DEXT +GLAD_API_CALL PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; +#define glTexStorage2D glad_glTexStorage2D +GLAD_API_CALL PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT; +#define glTexStorage2DEXT glad_glTexStorage2DEXT +GLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; +#define glTexStorage2DMultisample glad_glTexStorage2DMultisample +GLAD_API_CALL PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; +#define glTexStorage3D glad_glTexStorage3D +GLAD_API_CALL PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT; +#define glTexStorage3DEXT glad_glTexStorage3DEXT +GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample; +#define glTexStorage3DMultisample glad_glTexStorage3DMultisample +GLAD_API_CALL PFNGLTEXSTORAGEMEM1DEXTPROC glad_glTexStorageMem1DEXT; +#define glTexStorageMem1DEXT glad_glTexStorageMem1DEXT +GLAD_API_CALL PFNGLTEXSTORAGEMEM2DEXTPROC glad_glTexStorageMem2DEXT; +#define glTexStorageMem2DEXT glad_glTexStorageMem2DEXT +GLAD_API_CALL PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC glad_glTexStorageMem2DMultisampleEXT; +#define glTexStorageMem2DMultisampleEXT glad_glTexStorageMem2DMultisampleEXT +GLAD_API_CALL PFNGLTEXSTORAGEMEM3DEXTPROC glad_glTexStorageMem3DEXT; +#define glTexStorageMem3DEXT glad_glTexStorageMem3DEXT +GLAD_API_CALL PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC glad_glTexStorageMem3DMultisampleEXT; +#define glTexStorageMem3DMultisampleEXT glad_glTexStorageMem3DMultisampleEXT +GLAD_API_CALL PFNGLTEXSTORAGESPARSEAMDPROC glad_glTexStorageSparseAMD; +#define glTexStorageSparseAMD glad_glTexStorageSparseAMD +GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT; +#define glTexSubImage1DEXT glad_glTexSubImage1DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT; +#define glTexSubImage2DEXT glad_glTexSubImage2DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +GLAD_API_CALL PFNGLTEXSUBIMAGE3DEXTPROC glad_glTexSubImage3DEXT; +#define glTexSubImage3DEXT glad_glTexSubImage3DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE4DSGISPROC glad_glTexSubImage4DSGIS; +#define glTexSubImage4DSGIS glad_glTexSubImage4DSGIS +GLAD_API_CALL PFNGLTEXTUREATTACHMEMORYNVPROC glad_glTextureAttachMemoryNV; +#define glTextureAttachMemoryNV glad_glTextureAttachMemoryNV +GLAD_API_CALL PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier; +#define glTextureBarrier glad_glTextureBarrier +GLAD_API_CALL PFNGLTEXTUREBARRIERNVPROC glad_glTextureBarrierNV; +#define glTextureBarrierNV glad_glTextureBarrierNV +GLAD_API_CALL PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer; +#define glTextureBuffer glad_glTextureBuffer +GLAD_API_CALL PFNGLTEXTUREBUFFEREXTPROC glad_glTextureBufferEXT; +#define glTextureBufferEXT glad_glTextureBufferEXT +GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange; +#define glTextureBufferRange glad_glTextureBufferRange +GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEEXTPROC glad_glTextureBufferRangeEXT; +#define glTextureBufferRangeEXT glad_glTextureBufferRangeEXT +GLAD_API_CALL PFNGLTEXTURECOLORMASKSGISPROC glad_glTextureColorMaskSGIS; +#define glTextureColorMaskSGIS glad_glTextureColorMaskSGIS +GLAD_API_CALL PFNGLTEXTUREIMAGE1DEXTPROC glad_glTextureImage1DEXT; +#define glTextureImage1DEXT glad_glTextureImage1DEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE2DEXTPROC glad_glTextureImage2DEXT; +#define glTextureImage2DEXT glad_glTextureImage2DEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC glad_glTextureImage2DMultisampleCoverageNV; +#define glTextureImage2DMultisampleCoverageNV glad_glTextureImage2DMultisampleCoverageNV +GLAD_API_CALL PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC glad_glTextureImage2DMultisampleNV; +#define glTextureImage2DMultisampleNV glad_glTextureImage2DMultisampleNV +GLAD_API_CALL PFNGLTEXTUREIMAGE3DEXTPROC glad_glTextureImage3DEXT; +#define glTextureImage3DEXT glad_glTextureImage3DEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC glad_glTextureImage3DMultisampleCoverageNV; +#define glTextureImage3DMultisampleCoverageNV glad_glTextureImage3DMultisampleCoverageNV +GLAD_API_CALL PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC glad_glTextureImage3DMultisampleNV; +#define glTextureImage3DMultisampleNV glad_glTextureImage3DMultisampleNV +GLAD_API_CALL PFNGLTEXTURELIGHTEXTPROC glad_glTextureLightEXT; +#define glTextureLightEXT glad_glTextureLightEXT +GLAD_API_CALL PFNGLTEXTUREMATERIALEXTPROC glad_glTextureMaterialEXT; +#define glTextureMaterialEXT glad_glTextureMaterialEXT +GLAD_API_CALL PFNGLTEXTURENORMALEXTPROC glad_glTextureNormalEXT; +#define glTextureNormalEXT glad_glTextureNormalEXT +GLAD_API_CALL PFNGLTEXTUREPAGECOMMITMENTEXTPROC glad_glTexturePageCommitmentEXT; +#define glTexturePageCommitmentEXT glad_glTexturePageCommitmentEXT +GLAD_API_CALL PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC glad_glTexturePageCommitmentMemNV; +#define glTexturePageCommitmentMemNV glad_glTexturePageCommitmentMemNV +GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv; +#define glTextureParameterIiv glad_glTextureParameterIiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVEXTPROC glad_glTextureParameterIivEXT; +#define glTextureParameterIivEXT glad_glTextureParameterIivEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv; +#define glTextureParameterIuiv glad_glTextureParameterIuiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVEXTPROC glad_glTextureParameterIuivEXT; +#define glTextureParameterIuivEXT glad_glTextureParameterIuivEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf; +#define glTextureParameterf glad_glTextureParameterf +GLAD_API_CALL PFNGLTEXTUREPARAMETERFEXTPROC glad_glTextureParameterfEXT; +#define glTextureParameterfEXT glad_glTextureParameterfEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv; +#define glTextureParameterfv glad_glTextureParameterfv +GLAD_API_CALL PFNGLTEXTUREPARAMETERFVEXTPROC glad_glTextureParameterfvEXT; +#define glTextureParameterfvEXT glad_glTextureParameterfvEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri; +#define glTextureParameteri glad_glTextureParameteri +GLAD_API_CALL PFNGLTEXTUREPARAMETERIEXTPROC glad_glTextureParameteriEXT; +#define glTextureParameteriEXT glad_glTextureParameteriEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv; +#define glTextureParameteriv glad_glTextureParameteriv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIVEXTPROC glad_glTextureParameterivEXT; +#define glTextureParameterivEXT glad_glTextureParameterivEXT +GLAD_API_CALL PFNGLTEXTURERANGEAPPLEPROC glad_glTextureRangeAPPLE; +#define glTextureRangeAPPLE glad_glTextureRangeAPPLE +GLAD_API_CALL PFNGLTEXTURERENDERBUFFEREXTPROC glad_glTextureRenderbufferEXT; +#define glTextureRenderbufferEXT glad_glTextureRenderbufferEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D; +#define glTextureStorage1D glad_glTextureStorage1D +GLAD_API_CALL PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT; +#define glTextureStorage1DEXT glad_glTextureStorage1DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D; +#define glTextureStorage2D glad_glTextureStorage2D +GLAD_API_CALL PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT; +#define glTextureStorage2DEXT glad_glTextureStorage2DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample; +#define glTextureStorage2DMultisample glad_glTextureStorage2DMultisample +GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glad_glTextureStorage2DMultisampleEXT; +#define glTextureStorage2DMultisampleEXT glad_glTextureStorage2DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D; +#define glTextureStorage3D glad_glTextureStorage3D +GLAD_API_CALL PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT; +#define glTextureStorage3DEXT glad_glTextureStorage3DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample; +#define glTextureStorage3DMultisample glad_glTextureStorage3DMultisample +GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glad_glTextureStorage3DMultisampleEXT; +#define glTextureStorage3DMultisampleEXT glad_glTextureStorage3DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESTORAGEMEM1DEXTPROC glad_glTextureStorageMem1DEXT; +#define glTextureStorageMem1DEXT glad_glTextureStorageMem1DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGEMEM2DEXTPROC glad_glTextureStorageMem2DEXT; +#define glTextureStorageMem2DEXT glad_glTextureStorageMem2DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC glad_glTextureStorageMem2DMultisampleEXT; +#define glTextureStorageMem2DMultisampleEXT glad_glTextureStorageMem2DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESTORAGEMEM3DEXTPROC glad_glTextureStorageMem3DEXT; +#define glTextureStorageMem3DEXT glad_glTextureStorageMem3DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC glad_glTextureStorageMem3DMultisampleEXT; +#define glTextureStorageMem3DMultisampleEXT glad_glTextureStorageMem3DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESTORAGESPARSEAMDPROC glad_glTextureStorageSparseAMD; +#define glTextureStorageSparseAMD glad_glTextureStorageSparseAMD +GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D; +#define glTextureSubImage1D glad_glTextureSubImage1D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DEXTPROC glad_glTextureSubImage1DEXT; +#define glTextureSubImage1DEXT glad_glTextureSubImage1DEXT +GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D; +#define glTextureSubImage2D glad_glTextureSubImage2D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DEXTPROC glad_glTextureSubImage2DEXT; +#define glTextureSubImage2DEXT glad_glTextureSubImage2DEXT +GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D; +#define glTextureSubImage3D glad_glTextureSubImage3D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DEXTPROC glad_glTextureSubImage3DEXT; +#define glTextureSubImage3DEXT glad_glTextureSubImage3DEXT +GLAD_API_CALL PFNGLTEXTUREVIEWPROC glad_glTextureView; +#define glTextureView glad_glTextureView +GLAD_API_CALL PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV; +#define glTrackMatrixNV glad_glTrackMatrixNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC glad_glTransformFeedbackAttribsNV; +#define glTransformFeedbackAttribsNV glad_glTransformFeedbackAttribsNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase; +#define glTransformFeedbackBufferBase glad_glTransformFeedbackBufferBase +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange; +#define glTransformFeedbackBufferRange glad_glTransformFeedbackBufferRange +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC glad_glTransformFeedbackStreamAttribsNV; +#define glTransformFeedbackStreamAttribsNV glad_glTransformFeedbackStreamAttribsNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC glad_glTransformFeedbackVaryingsEXT; +#define glTransformFeedbackVaryingsEXT glad_glTransformFeedbackVaryingsEXT +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC glad_glTransformFeedbackVaryingsNV; +#define glTransformFeedbackVaryingsNV glad_glTransformFeedbackVaryingsNV +GLAD_API_CALL PFNGLTRANSFORMPATHNVPROC glad_glTransformPathNV; +#define glTransformPathNV glad_glTransformPathNV +GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated; +#define glTranslated glad_glTranslated +GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef; +#define glTranslatef glad_glTranslatef +GLAD_API_CALL PFNGLTRANSLATEXOESPROC glad_glTranslatexOES; +#define glTranslatexOES glad_glTranslatexOES +GLAD_API_CALL PFNGLUNIFORM1DPROC glad_glUniform1d; +#define glUniform1d glad_glUniform1d +GLAD_API_CALL PFNGLUNIFORM1DVPROC glad_glUniform1dv; +#define glUniform1dv glad_glUniform1dv +GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +GLAD_API_CALL PFNGLUNIFORM1FARBPROC glad_glUniform1fARB; +#define glUniform1fARB glad_glUniform1fARB +GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +GLAD_API_CALL PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB; +#define glUniform1fvARB glad_glUniform1fvARB +GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +GLAD_API_CALL PFNGLUNIFORM1I64ARBPROC glad_glUniform1i64ARB; +#define glUniform1i64ARB glad_glUniform1i64ARB +GLAD_API_CALL PFNGLUNIFORM1I64NVPROC glad_glUniform1i64NV; +#define glUniform1i64NV glad_glUniform1i64NV +GLAD_API_CALL PFNGLUNIFORM1I64VARBPROC glad_glUniform1i64vARB; +#define glUniform1i64vARB glad_glUniform1i64vARB +GLAD_API_CALL PFNGLUNIFORM1I64VNVPROC glad_glUniform1i64vNV; +#define glUniform1i64vNV glad_glUniform1i64vNV +GLAD_API_CALL PFNGLUNIFORM1IARBPROC glad_glUniform1iARB; +#define glUniform1iARB glad_glUniform1iARB +GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +GLAD_API_CALL PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB; +#define glUniform1ivARB glad_glUniform1ivARB +GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +GLAD_API_CALL PFNGLUNIFORM1UI64ARBPROC glad_glUniform1ui64ARB; +#define glUniform1ui64ARB glad_glUniform1ui64ARB +GLAD_API_CALL PFNGLUNIFORM1UI64NVPROC glad_glUniform1ui64NV; +#define glUniform1ui64NV glad_glUniform1ui64NV +GLAD_API_CALL PFNGLUNIFORM1UI64VARBPROC glad_glUniform1ui64vARB; +#define glUniform1ui64vARB glad_glUniform1ui64vARB +GLAD_API_CALL PFNGLUNIFORM1UI64VNVPROC glad_glUniform1ui64vNV; +#define glUniform1ui64vNV glad_glUniform1ui64vNV +GLAD_API_CALL PFNGLUNIFORM1UIEXTPROC glad_glUniform1uiEXT; +#define glUniform1uiEXT glad_glUniform1uiEXT +GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +GLAD_API_CALL PFNGLUNIFORM1UIVEXTPROC glad_glUniform1uivEXT; +#define glUniform1uivEXT glad_glUniform1uivEXT +GLAD_API_CALL PFNGLUNIFORM2DPROC glad_glUniform2d; +#define glUniform2d glad_glUniform2d +GLAD_API_CALL PFNGLUNIFORM2DVPROC glad_glUniform2dv; +#define glUniform2dv glad_glUniform2dv +GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +GLAD_API_CALL PFNGLUNIFORM2FARBPROC glad_glUniform2fARB; +#define glUniform2fARB glad_glUniform2fARB +GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +GLAD_API_CALL PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB; +#define glUniform2fvARB glad_glUniform2fvARB +GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +GLAD_API_CALL PFNGLUNIFORM2I64ARBPROC glad_glUniform2i64ARB; +#define glUniform2i64ARB glad_glUniform2i64ARB +GLAD_API_CALL PFNGLUNIFORM2I64NVPROC glad_glUniform2i64NV; +#define glUniform2i64NV glad_glUniform2i64NV +GLAD_API_CALL PFNGLUNIFORM2I64VARBPROC glad_glUniform2i64vARB; +#define glUniform2i64vARB glad_glUniform2i64vARB +GLAD_API_CALL PFNGLUNIFORM2I64VNVPROC glad_glUniform2i64vNV; +#define glUniform2i64vNV glad_glUniform2i64vNV +GLAD_API_CALL PFNGLUNIFORM2IARBPROC glad_glUniform2iARB; +#define glUniform2iARB glad_glUniform2iARB +GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +GLAD_API_CALL PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB; +#define glUniform2ivARB glad_glUniform2ivARB +GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +GLAD_API_CALL PFNGLUNIFORM2UI64ARBPROC glad_glUniform2ui64ARB; +#define glUniform2ui64ARB glad_glUniform2ui64ARB +GLAD_API_CALL PFNGLUNIFORM2UI64NVPROC glad_glUniform2ui64NV; +#define glUniform2ui64NV glad_glUniform2ui64NV +GLAD_API_CALL PFNGLUNIFORM2UI64VARBPROC glad_glUniform2ui64vARB; +#define glUniform2ui64vARB glad_glUniform2ui64vARB +GLAD_API_CALL PFNGLUNIFORM2UI64VNVPROC glad_glUniform2ui64vNV; +#define glUniform2ui64vNV glad_glUniform2ui64vNV +GLAD_API_CALL PFNGLUNIFORM2UIEXTPROC glad_glUniform2uiEXT; +#define glUniform2uiEXT glad_glUniform2uiEXT +GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +GLAD_API_CALL PFNGLUNIFORM2UIVEXTPROC glad_glUniform2uivEXT; +#define glUniform2uivEXT glad_glUniform2uivEXT +GLAD_API_CALL PFNGLUNIFORM3DPROC glad_glUniform3d; +#define glUniform3d glad_glUniform3d +GLAD_API_CALL PFNGLUNIFORM3DVPROC glad_glUniform3dv; +#define glUniform3dv glad_glUniform3dv +GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +GLAD_API_CALL PFNGLUNIFORM3FARBPROC glad_glUniform3fARB; +#define glUniform3fARB glad_glUniform3fARB +GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +GLAD_API_CALL PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB; +#define glUniform3fvARB glad_glUniform3fvARB +GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +GLAD_API_CALL PFNGLUNIFORM3I64ARBPROC glad_glUniform3i64ARB; +#define glUniform3i64ARB glad_glUniform3i64ARB +GLAD_API_CALL PFNGLUNIFORM3I64NVPROC glad_glUniform3i64NV; +#define glUniform3i64NV glad_glUniform3i64NV +GLAD_API_CALL PFNGLUNIFORM3I64VARBPROC glad_glUniform3i64vARB; +#define glUniform3i64vARB glad_glUniform3i64vARB +GLAD_API_CALL PFNGLUNIFORM3I64VNVPROC glad_glUniform3i64vNV; +#define glUniform3i64vNV glad_glUniform3i64vNV +GLAD_API_CALL PFNGLUNIFORM3IARBPROC glad_glUniform3iARB; +#define glUniform3iARB glad_glUniform3iARB +GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +GLAD_API_CALL PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB; +#define glUniform3ivARB glad_glUniform3ivARB +GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +GLAD_API_CALL PFNGLUNIFORM3UI64ARBPROC glad_glUniform3ui64ARB; +#define glUniform3ui64ARB glad_glUniform3ui64ARB +GLAD_API_CALL PFNGLUNIFORM3UI64NVPROC glad_glUniform3ui64NV; +#define glUniform3ui64NV glad_glUniform3ui64NV +GLAD_API_CALL PFNGLUNIFORM3UI64VARBPROC glad_glUniform3ui64vARB; +#define glUniform3ui64vARB glad_glUniform3ui64vARB +GLAD_API_CALL PFNGLUNIFORM3UI64VNVPROC glad_glUniform3ui64vNV; +#define glUniform3ui64vNV glad_glUniform3ui64vNV +GLAD_API_CALL PFNGLUNIFORM3UIEXTPROC glad_glUniform3uiEXT; +#define glUniform3uiEXT glad_glUniform3uiEXT +GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +GLAD_API_CALL PFNGLUNIFORM3UIVEXTPROC glad_glUniform3uivEXT; +#define glUniform3uivEXT glad_glUniform3uivEXT +GLAD_API_CALL PFNGLUNIFORM4DPROC glad_glUniform4d; +#define glUniform4d glad_glUniform4d +GLAD_API_CALL PFNGLUNIFORM4DVPROC glad_glUniform4dv; +#define glUniform4dv glad_glUniform4dv +GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +GLAD_API_CALL PFNGLUNIFORM4FARBPROC glad_glUniform4fARB; +#define glUniform4fARB glad_glUniform4fARB +GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +GLAD_API_CALL PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB; +#define glUniform4fvARB glad_glUniform4fvARB +GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +GLAD_API_CALL PFNGLUNIFORM4I64ARBPROC glad_glUniform4i64ARB; +#define glUniform4i64ARB glad_glUniform4i64ARB +GLAD_API_CALL PFNGLUNIFORM4I64NVPROC glad_glUniform4i64NV; +#define glUniform4i64NV glad_glUniform4i64NV +GLAD_API_CALL PFNGLUNIFORM4I64VARBPROC glad_glUniform4i64vARB; +#define glUniform4i64vARB glad_glUniform4i64vARB +GLAD_API_CALL PFNGLUNIFORM4I64VNVPROC glad_glUniform4i64vNV; +#define glUniform4i64vNV glad_glUniform4i64vNV +GLAD_API_CALL PFNGLUNIFORM4IARBPROC glad_glUniform4iARB; +#define glUniform4iARB glad_glUniform4iARB +GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +GLAD_API_CALL PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB; +#define glUniform4ivARB glad_glUniform4ivARB +GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +GLAD_API_CALL PFNGLUNIFORM4UI64ARBPROC glad_glUniform4ui64ARB; +#define glUniform4ui64ARB glad_glUniform4ui64ARB +GLAD_API_CALL PFNGLUNIFORM4UI64NVPROC glad_glUniform4ui64NV; +#define glUniform4ui64NV glad_glUniform4ui64NV +GLAD_API_CALL PFNGLUNIFORM4UI64VARBPROC glad_glUniform4ui64vARB; +#define glUniform4ui64vARB glad_glUniform4ui64vARB +GLAD_API_CALL PFNGLUNIFORM4UI64VNVPROC glad_glUniform4ui64vNV; +#define glUniform4ui64vNV glad_glUniform4ui64vNV +GLAD_API_CALL PFNGLUNIFORM4UIEXTPROC glad_glUniform4uiEXT; +#define glUniform4uiEXT glad_glUniform4uiEXT +GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +GLAD_API_CALL PFNGLUNIFORM4UIVEXTPROC glad_glUniform4uivEXT; +#define glUniform4uivEXT glad_glUniform4uivEXT +GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +GLAD_API_CALL PFNGLUNIFORMBUFFEREXTPROC glad_glUniformBufferEXT; +#define glUniformBufferEXT glad_glUniformBufferEXT +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64ARBPROC glad_glUniformHandleui64ARB; +#define glUniformHandleui64ARB glad_glUniformHandleui64ARB +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64NVPROC glad_glUniformHandleui64NV; +#define glUniformHandleui64NV glad_glUniformHandleui64NV +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64VARBPROC glad_glUniformHandleui64vARB; +#define glUniformHandleui64vARB glad_glUniformHandleui64vARB +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64VNVPROC glad_glUniformHandleui64vNV; +#define glUniformHandleui64vNV glad_glUniformHandleui64vNV +GLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv; +#define glUniformMatrix2dv glad_glUniformMatrix2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB; +#define glUniformMatrix2fvARB glad_glUniformMatrix2fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv; +#define glUniformMatrix2x3dv glad_glUniformMatrix2x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv; +#define glUniformMatrix2x4dv glad_glUniformMatrix2x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv; +#define glUniformMatrix3dv glad_glUniformMatrix3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB; +#define glUniformMatrix3fvARB glad_glUniformMatrix3fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv; +#define glUniformMatrix3x2dv glad_glUniformMatrix3x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv; +#define glUniformMatrix3x4dv glad_glUniformMatrix3x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv; +#define glUniformMatrix4dv glad_glUniformMatrix4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB; +#define glUniformMatrix4fvARB glad_glUniformMatrix4fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv; +#define glUniformMatrix4x2dv glad_glUniformMatrix4x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv; +#define glUniformMatrix4x3dv glad_glUniformMatrix4x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +GLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv; +#define glUniformSubroutinesuiv glad_glUniformSubroutinesuiv +GLAD_API_CALL PFNGLUNIFORMUI64NVPROC glad_glUniformui64NV; +#define glUniformui64NV glad_glUniformui64NV +GLAD_API_CALL PFNGLUNIFORMUI64VNVPROC glad_glUniformui64vNV; +#define glUniformui64vNV glad_glUniformui64vNV +GLAD_API_CALL PFNGLUNLOCKARRAYSEXTPROC glad_glUnlockArraysEXT; +#define glUnlockArraysEXT glad_glUnlockArraysEXT +GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB; +#define glUnmapBufferARB glad_glUnmapBufferARB +GLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer; +#define glUnmapNamedBuffer glad_glUnmapNamedBuffer +GLAD_API_CALL PFNGLUNMAPNAMEDBUFFEREXTPROC glad_glUnmapNamedBufferEXT; +#define glUnmapNamedBufferEXT glad_glUnmapNamedBufferEXT +GLAD_API_CALL PFNGLUNMAPOBJECTBUFFERATIPROC glad_glUnmapObjectBufferATI; +#define glUnmapObjectBufferATI glad_glUnmapObjectBufferATI +GLAD_API_CALL PFNGLUNMAPTEXTURE2DINTELPROC glad_glUnmapTexture2DINTEL; +#define glUnmapTexture2DINTEL glad_glUnmapTexture2DINTEL +GLAD_API_CALL PFNGLUPDATEOBJECTBUFFERATIPROC glad_glUpdateObjectBufferATI; +#define glUpdateObjectBufferATI glad_glUpdateObjectBufferATI +GLAD_API_CALL PFNGLUPLOADGPUMASKNVXPROC glad_glUploadGpuMaskNVX; +#define glUploadGpuMaskNVX glad_glUploadGpuMaskNVX +GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB; +#define glUseProgramObjectARB glad_glUseProgramObjectARB +GLAD_API_CALL PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; +#define glUseProgramStages glad_glUseProgramStages +GLAD_API_CALL PFNGLUSESHADERPROGRAMEXTPROC glad_glUseShaderProgramEXT; +#define glUseShaderProgramEXT glad_glUseShaderProgramEXT +GLAD_API_CALL PFNGLVDPAUFININVPROC glad_glVDPAUFiniNV; +#define glVDPAUFiniNV glad_glVDPAUFiniNV +GLAD_API_CALL PFNGLVDPAUGETSURFACEIVNVPROC glad_glVDPAUGetSurfaceivNV; +#define glVDPAUGetSurfaceivNV glad_glVDPAUGetSurfaceivNV +GLAD_API_CALL PFNGLVDPAUINITNVPROC glad_glVDPAUInitNV; +#define glVDPAUInitNV glad_glVDPAUInitNV +GLAD_API_CALL PFNGLVDPAUISSURFACENVPROC glad_glVDPAUIsSurfaceNV; +#define glVDPAUIsSurfaceNV glad_glVDPAUIsSurfaceNV +GLAD_API_CALL PFNGLVDPAUMAPSURFACESNVPROC glad_glVDPAUMapSurfacesNV; +#define glVDPAUMapSurfacesNV glad_glVDPAUMapSurfacesNV +GLAD_API_CALL PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC glad_glVDPAURegisterOutputSurfaceNV; +#define glVDPAURegisterOutputSurfaceNV glad_glVDPAURegisterOutputSurfaceNV +GLAD_API_CALL PFNGLVDPAUREGISTERVIDEOSURFACENVPROC glad_glVDPAURegisterVideoSurfaceNV; +#define glVDPAURegisterVideoSurfaceNV glad_glVDPAURegisterVideoSurfaceNV +GLAD_API_CALL PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC glad_glVDPAURegisterVideoSurfaceWithPictureStructureNV; +#define glVDPAURegisterVideoSurfaceWithPictureStructureNV glad_glVDPAURegisterVideoSurfaceWithPictureStructureNV +GLAD_API_CALL PFNGLVDPAUSURFACEACCESSNVPROC glad_glVDPAUSurfaceAccessNV; +#define glVDPAUSurfaceAccessNV glad_glVDPAUSurfaceAccessNV +GLAD_API_CALL PFNGLVDPAUUNMAPSURFACESNVPROC glad_glVDPAUUnmapSurfacesNV; +#define glVDPAUUnmapSurfacesNV glad_glVDPAUUnmapSurfacesNV +GLAD_API_CALL PFNGLVDPAUUNREGISTERSURFACENVPROC glad_glVDPAUUnregisterSurfaceNV; +#define glVDPAUUnregisterSurfaceNV glad_glVDPAUUnregisterSurfaceNV +GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB; +#define glValidateProgramARB glad_glValidateProgramARB +GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; +#define glValidateProgramPipeline glad_glValidateProgramPipeline +GLAD_API_CALL PFNGLVARIANTARRAYOBJECTATIPROC glad_glVariantArrayObjectATI; +#define glVariantArrayObjectATI glad_glVariantArrayObjectATI +GLAD_API_CALL PFNGLVARIANTPOINTEREXTPROC glad_glVariantPointerEXT; +#define glVariantPointerEXT glad_glVariantPointerEXT +GLAD_API_CALL PFNGLVARIANTBVEXTPROC glad_glVariantbvEXT; +#define glVariantbvEXT glad_glVariantbvEXT +GLAD_API_CALL PFNGLVARIANTDVEXTPROC glad_glVariantdvEXT; +#define glVariantdvEXT glad_glVariantdvEXT +GLAD_API_CALL PFNGLVARIANTFVEXTPROC glad_glVariantfvEXT; +#define glVariantfvEXT glad_glVariantfvEXT +GLAD_API_CALL PFNGLVARIANTIVEXTPROC glad_glVariantivEXT; +#define glVariantivEXT glad_glVariantivEXT +GLAD_API_CALL PFNGLVARIANTSVEXTPROC glad_glVariantsvEXT; +#define glVariantsvEXT glad_glVariantsvEXT +GLAD_API_CALL PFNGLVARIANTUBVEXTPROC glad_glVariantubvEXT; +#define glVariantubvEXT glad_glVariantubvEXT +GLAD_API_CALL PFNGLVARIANTUIVEXTPROC glad_glVariantuivEXT; +#define glVariantuivEXT glad_glVariantuivEXT +GLAD_API_CALL PFNGLVARIANTUSVEXTPROC glad_glVariantusvEXT; +#define glVariantusvEXT glad_glVariantusvEXT +GLAD_API_CALL PFNGLVERTEX2BOESPROC glad_glVertex2bOES; +#define glVertex2bOES glad_glVertex2bOES +GLAD_API_CALL PFNGLVERTEX2BVOESPROC glad_glVertex2bvOES; +#define glVertex2bvOES glad_glVertex2bvOES +GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d; +#define glVertex2d glad_glVertex2d +GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv; +#define glVertex2dv glad_glVertex2dv +GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f; +#define glVertex2f glad_glVertex2f +GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv; +#define glVertex2fv glad_glVertex2fv +GLAD_API_CALL PFNGLVERTEX2HNVPROC glad_glVertex2hNV; +#define glVertex2hNV glad_glVertex2hNV +GLAD_API_CALL PFNGLVERTEX2HVNVPROC glad_glVertex2hvNV; +#define glVertex2hvNV glad_glVertex2hvNV +GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i; +#define glVertex2i glad_glVertex2i +GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv; +#define glVertex2iv glad_glVertex2iv +GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s; +#define glVertex2s glad_glVertex2s +GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv; +#define glVertex2sv glad_glVertex2sv +GLAD_API_CALL PFNGLVERTEX2XOESPROC glad_glVertex2xOES; +#define glVertex2xOES glad_glVertex2xOES +GLAD_API_CALL PFNGLVERTEX2XVOESPROC glad_glVertex2xvOES; +#define glVertex2xvOES glad_glVertex2xvOES +GLAD_API_CALL PFNGLVERTEX3BOESPROC glad_glVertex3bOES; +#define glVertex3bOES glad_glVertex3bOES +GLAD_API_CALL PFNGLVERTEX3BVOESPROC glad_glVertex3bvOES; +#define glVertex3bvOES glad_glVertex3bvOES +GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d; +#define glVertex3d glad_glVertex3d +GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv; +#define glVertex3dv glad_glVertex3dv +GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f; +#define glVertex3f glad_glVertex3f +GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv; +#define glVertex3fv glad_glVertex3fv +GLAD_API_CALL PFNGLVERTEX3HNVPROC glad_glVertex3hNV; +#define glVertex3hNV glad_glVertex3hNV +GLAD_API_CALL PFNGLVERTEX3HVNVPROC glad_glVertex3hvNV; +#define glVertex3hvNV glad_glVertex3hvNV +GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i; +#define glVertex3i glad_glVertex3i +GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv; +#define glVertex3iv glad_glVertex3iv +GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s; +#define glVertex3s glad_glVertex3s +GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv; +#define glVertex3sv glad_glVertex3sv +GLAD_API_CALL PFNGLVERTEX3XOESPROC glad_glVertex3xOES; +#define glVertex3xOES glad_glVertex3xOES +GLAD_API_CALL PFNGLVERTEX3XVOESPROC glad_glVertex3xvOES; +#define glVertex3xvOES glad_glVertex3xvOES +GLAD_API_CALL PFNGLVERTEX4BOESPROC glad_glVertex4bOES; +#define glVertex4bOES glad_glVertex4bOES +GLAD_API_CALL PFNGLVERTEX4BVOESPROC glad_glVertex4bvOES; +#define glVertex4bvOES glad_glVertex4bvOES +GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d; +#define glVertex4d glad_glVertex4d +GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv; +#define glVertex4dv glad_glVertex4dv +GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f; +#define glVertex4f glad_glVertex4f +GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv; +#define glVertex4fv glad_glVertex4fv +GLAD_API_CALL PFNGLVERTEX4HNVPROC glad_glVertex4hNV; +#define glVertex4hNV glad_glVertex4hNV +GLAD_API_CALL PFNGLVERTEX4HVNVPROC glad_glVertex4hvNV; +#define glVertex4hvNV glad_glVertex4hvNV +GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i; +#define glVertex4i glad_glVertex4i +GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv; +#define glVertex4iv glad_glVertex4iv +GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s; +#define glVertex4s glad_glVertex4s +GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv; +#define glVertex4sv glad_glVertex4sv +GLAD_API_CALL PFNGLVERTEX4XOESPROC glad_glVertex4xOES; +#define glVertex4xOES glad_glVertex4xOES +GLAD_API_CALL PFNGLVERTEX4XVOESPROC glad_glVertex4xvOES; +#define glVertex4xvOES glad_glVertex4xvOES +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding; +#define glVertexArrayAttribBinding glad_glVertexArrayAttribBinding +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat; +#define glVertexArrayAttribFormat glad_glVertexArrayAttribFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat; +#define glVertexArrayAttribIFormat glad_glVertexArrayAttribIFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat; +#define glVertexArrayAttribLFormat glad_glVertexArrayAttribLFormat +GLAD_API_CALL PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glad_glVertexArrayBindVertexBufferEXT; +#define glVertexArrayBindVertexBufferEXT glad_glVertexArrayBindVertexBufferEXT +GLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor; +#define glVertexArrayBindingDivisor glad_glVertexArrayBindingDivisor +GLAD_API_CALL PFNGLVERTEXARRAYCOLOROFFSETEXTPROC glad_glVertexArrayColorOffsetEXT; +#define glVertexArrayColorOffsetEXT glad_glVertexArrayColorOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC glad_glVertexArrayEdgeFlagOffsetEXT; +#define glVertexArrayEdgeFlagOffsetEXT glad_glVertexArrayEdgeFlagOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer; +#define glVertexArrayElementBuffer glad_glVertexArrayElementBuffer +GLAD_API_CALL PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC glad_glVertexArrayFogCoordOffsetEXT; +#define glVertexArrayFogCoordOffsetEXT glad_glVertexArrayFogCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYINDEXOFFSETEXTPROC glad_glVertexArrayIndexOffsetEXT; +#define glVertexArrayIndexOffsetEXT glad_glVertexArrayIndexOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC glad_glVertexArrayMultiTexCoordOffsetEXT; +#define glVertexArrayMultiTexCoordOffsetEXT glad_glVertexArrayMultiTexCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYNORMALOFFSETEXTPROC glad_glVertexArrayNormalOffsetEXT; +#define glVertexArrayNormalOffsetEXT glad_glVertexArrayNormalOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYPARAMETERIAPPLEPROC glad_glVertexArrayParameteriAPPLE; +#define glVertexArrayParameteriAPPLE glad_glVertexArrayParameteriAPPLE +GLAD_API_CALL PFNGLVERTEXARRAYRANGEAPPLEPROC glad_glVertexArrayRangeAPPLE; +#define glVertexArrayRangeAPPLE glad_glVertexArrayRangeAPPLE +GLAD_API_CALL PFNGLVERTEXARRAYRANGENVPROC glad_glVertexArrayRangeNV; +#define glVertexArrayRangeNV glad_glVertexArrayRangeNV +GLAD_API_CALL PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC glad_glVertexArraySecondaryColorOffsetEXT; +#define glVertexArraySecondaryColorOffsetEXT glad_glVertexArraySecondaryColorOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC glad_glVertexArrayTexCoordOffsetEXT; +#define glVertexArrayTexCoordOffsetEXT glad_glVertexArrayTexCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glad_glVertexArrayVertexAttribBindingEXT; +#define glVertexArrayVertexAttribBindingEXT glad_glVertexArrayVertexAttribBindingEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glad_glVertexArrayVertexAttribDivisorEXT; +#define glVertexArrayVertexAttribDivisorEXT glad_glVertexArrayVertexAttribDivisorEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glad_glVertexArrayVertexAttribFormatEXT; +#define glVertexArrayVertexAttribFormatEXT glad_glVertexArrayVertexAttribFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glad_glVertexArrayVertexAttribIFormatEXT; +#define glVertexArrayVertexAttribIFormatEXT glad_glVertexArrayVertexAttribIFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glad_glVertexArrayVertexAttribIOffsetEXT; +#define glVertexArrayVertexAttribIOffsetEXT glad_glVertexArrayVertexAttribIOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glad_glVertexArrayVertexAttribLFormatEXT; +#define glVertexArrayVertexAttribLFormatEXT glad_glVertexArrayVertexAttribLFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glad_glVertexArrayVertexAttribLOffsetEXT; +#define glVertexArrayVertexAttribLOffsetEXT glad_glVertexArrayVertexAttribLOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glad_glVertexArrayVertexAttribOffsetEXT; +#define glVertexArrayVertexAttribOffsetEXT glad_glVertexArrayVertexAttribOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glad_glVertexArrayVertexBindingDivisorEXT; +#define glVertexArrayVertexBindingDivisorEXT glad_glVertexArrayVertexBindingDivisorEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer; +#define glVertexArrayVertexBuffer glad_glVertexArrayVertexBuffer +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers; +#define glVertexArrayVertexBuffers glad_glVertexArrayVertexBuffers +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glad_glVertexArrayVertexOffsetEXT; +#define glVertexArrayVertexOffsetEXT glad_glVertexArrayVertexOffsetEXT +GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB; +#define glVertexAttrib1dARB glad_glVertexAttrib1dARB +GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV; +#define glVertexAttrib1dNV glad_glVertexAttrib1dNV +GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB; +#define glVertexAttrib1dvARB glad_glVertexAttrib1dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV; +#define glVertexAttrib1dvNV glad_glVertexAttrib1dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB; +#define glVertexAttrib1fARB glad_glVertexAttrib1fARB +GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV; +#define glVertexAttrib1fNV glad_glVertexAttrib1fNV +GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB; +#define glVertexAttrib1fvARB glad_glVertexAttrib1fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV; +#define glVertexAttrib1fvNV glad_glVertexAttrib1fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB1HNVPROC glad_glVertexAttrib1hNV; +#define glVertexAttrib1hNV glad_glVertexAttrib1hNV +GLAD_API_CALL PFNGLVERTEXATTRIB1HVNVPROC glad_glVertexAttrib1hvNV; +#define glVertexAttrib1hvNV glad_glVertexAttrib1hvNV +GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB; +#define glVertexAttrib1sARB glad_glVertexAttrib1sARB +GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV; +#define glVertexAttrib1sNV glad_glVertexAttrib1sNV +GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB; +#define glVertexAttrib1svARB glad_glVertexAttrib1svARB +GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV; +#define glVertexAttrib1svNV glad_glVertexAttrib1svNV +GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB; +#define glVertexAttrib2dARB glad_glVertexAttrib2dARB +GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV; +#define glVertexAttrib2dNV glad_glVertexAttrib2dNV +GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB; +#define glVertexAttrib2dvARB glad_glVertexAttrib2dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV; +#define glVertexAttrib2dvNV glad_glVertexAttrib2dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB; +#define glVertexAttrib2fARB glad_glVertexAttrib2fARB +GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV; +#define glVertexAttrib2fNV glad_glVertexAttrib2fNV +GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB; +#define glVertexAttrib2fvARB glad_glVertexAttrib2fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV; +#define glVertexAttrib2fvNV glad_glVertexAttrib2fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB2HNVPROC glad_glVertexAttrib2hNV; +#define glVertexAttrib2hNV glad_glVertexAttrib2hNV +GLAD_API_CALL PFNGLVERTEXATTRIB2HVNVPROC glad_glVertexAttrib2hvNV; +#define glVertexAttrib2hvNV glad_glVertexAttrib2hvNV +GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB; +#define glVertexAttrib2sARB glad_glVertexAttrib2sARB +GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV; +#define glVertexAttrib2sNV glad_glVertexAttrib2sNV +GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB; +#define glVertexAttrib2svARB glad_glVertexAttrib2svARB +GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV; +#define glVertexAttrib2svNV glad_glVertexAttrib2svNV +GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB; +#define glVertexAttrib3dARB glad_glVertexAttrib3dARB +GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV; +#define glVertexAttrib3dNV glad_glVertexAttrib3dNV +GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB; +#define glVertexAttrib3dvARB glad_glVertexAttrib3dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV; +#define glVertexAttrib3dvNV glad_glVertexAttrib3dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB; +#define glVertexAttrib3fARB glad_glVertexAttrib3fARB +GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV; +#define glVertexAttrib3fNV glad_glVertexAttrib3fNV +GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB; +#define glVertexAttrib3fvARB glad_glVertexAttrib3fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV; +#define glVertexAttrib3fvNV glad_glVertexAttrib3fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB3HNVPROC glad_glVertexAttrib3hNV; +#define glVertexAttrib3hNV glad_glVertexAttrib3hNV +GLAD_API_CALL PFNGLVERTEXATTRIB3HVNVPROC glad_glVertexAttrib3hvNV; +#define glVertexAttrib3hvNV glad_glVertexAttrib3hvNV +GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB; +#define glVertexAttrib3sARB glad_glVertexAttrib3sARB +GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV; +#define glVertexAttrib3sNV glad_glVertexAttrib3sNV +GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB; +#define glVertexAttrib3svARB glad_glVertexAttrib3svARB +GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV; +#define glVertexAttrib3svNV glad_glVertexAttrib3svNV +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB; +#define glVertexAttrib4NbvARB glad_glVertexAttrib4NbvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB; +#define glVertexAttrib4NivARB glad_glVertexAttrib4NivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB; +#define glVertexAttrib4NsvARB glad_glVertexAttrib4NsvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB; +#define glVertexAttrib4NubARB glad_glVertexAttrib4NubARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB; +#define glVertexAttrib4NubvARB glad_glVertexAttrib4NubvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB; +#define glVertexAttrib4NuivARB glad_glVertexAttrib4NuivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB; +#define glVertexAttrib4NusvARB glad_glVertexAttrib4NusvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB; +#define glVertexAttrib4bvARB glad_glVertexAttrib4bvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB; +#define glVertexAttrib4dARB glad_glVertexAttrib4dARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV; +#define glVertexAttrib4dNV glad_glVertexAttrib4dNV +GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB; +#define glVertexAttrib4dvARB glad_glVertexAttrib4dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV; +#define glVertexAttrib4dvNV glad_glVertexAttrib4dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB; +#define glVertexAttrib4fARB glad_glVertexAttrib4fARB +GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV; +#define glVertexAttrib4fNV glad_glVertexAttrib4fNV +GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB; +#define glVertexAttrib4fvARB glad_glVertexAttrib4fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV; +#define glVertexAttrib4fvNV glad_glVertexAttrib4fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4HNVPROC glad_glVertexAttrib4hNV; +#define glVertexAttrib4hNV glad_glVertexAttrib4hNV +GLAD_API_CALL PFNGLVERTEXATTRIB4HVNVPROC glad_glVertexAttrib4hvNV; +#define glVertexAttrib4hvNV glad_glVertexAttrib4hvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB; +#define glVertexAttrib4ivARB glad_glVertexAttrib4ivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB; +#define glVertexAttrib4sARB glad_glVertexAttrib4sARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV; +#define glVertexAttrib4sNV glad_glVertexAttrib4sNV +GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB; +#define glVertexAttrib4svARB glad_glVertexAttrib4svARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV; +#define glVertexAttrib4svNV glad_glVertexAttrib4svNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV; +#define glVertexAttrib4ubNV glad_glVertexAttrib4ubNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB; +#define glVertexAttrib4ubvARB glad_glVertexAttrib4ubvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV; +#define glVertexAttrib4ubvNV glad_glVertexAttrib4ubvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB; +#define glVertexAttrib4uivARB glad_glVertexAttrib4uivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB; +#define glVertexAttrib4usvARB glad_glVertexAttrib4usvARB +GLAD_API_CALL PFNGLVERTEXATTRIBARRAYOBJECTATIPROC glad_glVertexAttribArrayObjectATI; +#define glVertexAttribArrayObjectATI glad_glVertexAttribArrayObjectATI +GLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; +#define glVertexAttribBinding glad_glVertexAttribBinding +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORARBPROC glad_glVertexAttribDivisorARB; +#define glVertexAttribDivisorARB glad_glVertexAttribDivisorARB +GLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; +#define glVertexAttribFormat glad_glVertexAttribFormat +GLAD_API_CALL PFNGLVERTEXATTRIBFORMATNVPROC glad_glVertexAttribFormatNV; +#define glVertexAttribFormatNV glad_glVertexAttribFormatNV +GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +GLAD_API_CALL PFNGLVERTEXATTRIBI1IEXTPROC glad_glVertexAttribI1iEXT; +#define glVertexAttribI1iEXT glad_glVertexAttribI1iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVEXTPROC glad_glVertexAttribI1ivEXT; +#define glVertexAttribI1ivEXT glad_glVertexAttribI1ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIEXTPROC glad_glVertexAttribI1uiEXT; +#define glVertexAttribI1uiEXT glad_glVertexAttribI1uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVEXTPROC glad_glVertexAttribI1uivEXT; +#define glVertexAttribI1uivEXT glad_glVertexAttribI1uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +GLAD_API_CALL PFNGLVERTEXATTRIBI2IEXTPROC glad_glVertexAttribI2iEXT; +#define glVertexAttribI2iEXT glad_glVertexAttribI2iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVEXTPROC glad_glVertexAttribI2ivEXT; +#define glVertexAttribI2ivEXT glad_glVertexAttribI2ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIEXTPROC glad_glVertexAttribI2uiEXT; +#define glVertexAttribI2uiEXT glad_glVertexAttribI2uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVEXTPROC glad_glVertexAttribI2uivEXT; +#define glVertexAttribI2uivEXT glad_glVertexAttribI2uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +GLAD_API_CALL PFNGLVERTEXATTRIBI3IEXTPROC glad_glVertexAttribI3iEXT; +#define glVertexAttribI3iEXT glad_glVertexAttribI3iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVEXTPROC glad_glVertexAttribI3ivEXT; +#define glVertexAttribI3ivEXT glad_glVertexAttribI3ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIEXTPROC glad_glVertexAttribI3uiEXT; +#define glVertexAttribI3uiEXT glad_glVertexAttribI3uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVEXTPROC glad_glVertexAttribI3uivEXT; +#define glVertexAttribI3uivEXT glad_glVertexAttribI3uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVEXTPROC glad_glVertexAttribI4bvEXT; +#define glVertexAttribI4bvEXT glad_glVertexAttribI4bvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +GLAD_API_CALL PFNGLVERTEXATTRIBI4IEXTPROC glad_glVertexAttribI4iEXT; +#define glVertexAttribI4iEXT glad_glVertexAttribI4iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVEXTPROC glad_glVertexAttribI4ivEXT; +#define glVertexAttribI4ivEXT glad_glVertexAttribI4ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVEXTPROC glad_glVertexAttribI4svEXT; +#define glVertexAttribI4svEXT glad_glVertexAttribI4svEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVEXTPROC glad_glVertexAttribI4ubvEXT; +#define glVertexAttribI4ubvEXT glad_glVertexAttribI4ubvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIEXTPROC glad_glVertexAttribI4uiEXT; +#define glVertexAttribI4uiEXT glad_glVertexAttribI4uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVEXTPROC glad_glVertexAttribI4uivEXT; +#define glVertexAttribI4uivEXT glad_glVertexAttribI4uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVEXTPROC glad_glVertexAttribI4usvEXT; +#define glVertexAttribI4usvEXT glad_glVertexAttribI4usvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; +#define glVertexAttribIFormat glad_glVertexAttribIFormat +GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATNVPROC glad_glVertexAttribIFormatNV; +#define glVertexAttribIFormatNV glad_glVertexAttribIFormatNV +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTEREXTPROC glad_glVertexAttribIPointerEXT; +#define glVertexAttribIPointerEXT glad_glVertexAttribIPointerEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d; +#define glVertexAttribL1d glad_glVertexAttribL1d +GLAD_API_CALL PFNGLVERTEXATTRIBL1DEXTPROC glad_glVertexAttribL1dEXT; +#define glVertexAttribL1dEXT glad_glVertexAttribL1dEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv; +#define glVertexAttribL1dv glad_glVertexAttribL1dv +GLAD_API_CALL PFNGLVERTEXATTRIBL1DVEXTPROC glad_glVertexAttribL1dvEXT; +#define glVertexAttribL1dvEXT glad_glVertexAttribL1dvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL1I64NVPROC glad_glVertexAttribL1i64NV; +#define glVertexAttribL1i64NV glad_glVertexAttribL1i64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL1I64VNVPROC glad_glVertexAttribL1i64vNV; +#define glVertexAttribL1i64vNV glad_glVertexAttribL1i64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL1UI64ARBPROC glad_glVertexAttribL1ui64ARB; +#define glVertexAttribL1ui64ARB glad_glVertexAttribL1ui64ARB +GLAD_API_CALL PFNGLVERTEXATTRIBL1UI64NVPROC glad_glVertexAttribL1ui64NV; +#define glVertexAttribL1ui64NV glad_glVertexAttribL1ui64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL1UI64VARBPROC glad_glVertexAttribL1ui64vARB; +#define glVertexAttribL1ui64vARB glad_glVertexAttribL1ui64vARB +GLAD_API_CALL PFNGLVERTEXATTRIBL1UI64VNVPROC glad_glVertexAttribL1ui64vNV; +#define glVertexAttribL1ui64vNV glad_glVertexAttribL1ui64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d; +#define glVertexAttribL2d glad_glVertexAttribL2d +GLAD_API_CALL PFNGLVERTEXATTRIBL2DEXTPROC glad_glVertexAttribL2dEXT; +#define glVertexAttribL2dEXT glad_glVertexAttribL2dEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv; +#define glVertexAttribL2dv glad_glVertexAttribL2dv +GLAD_API_CALL PFNGLVERTEXATTRIBL2DVEXTPROC glad_glVertexAttribL2dvEXT; +#define glVertexAttribL2dvEXT glad_glVertexAttribL2dvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL2I64NVPROC glad_glVertexAttribL2i64NV; +#define glVertexAttribL2i64NV glad_glVertexAttribL2i64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL2I64VNVPROC glad_glVertexAttribL2i64vNV; +#define glVertexAttribL2i64vNV glad_glVertexAttribL2i64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL2UI64NVPROC glad_glVertexAttribL2ui64NV; +#define glVertexAttribL2ui64NV glad_glVertexAttribL2ui64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL2UI64VNVPROC glad_glVertexAttribL2ui64vNV; +#define glVertexAttribL2ui64vNV glad_glVertexAttribL2ui64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d; +#define glVertexAttribL3d glad_glVertexAttribL3d +GLAD_API_CALL PFNGLVERTEXATTRIBL3DEXTPROC glad_glVertexAttribL3dEXT; +#define glVertexAttribL3dEXT glad_glVertexAttribL3dEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv; +#define glVertexAttribL3dv glad_glVertexAttribL3dv +GLAD_API_CALL PFNGLVERTEXATTRIBL3DVEXTPROC glad_glVertexAttribL3dvEXT; +#define glVertexAttribL3dvEXT glad_glVertexAttribL3dvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL3I64NVPROC glad_glVertexAttribL3i64NV; +#define glVertexAttribL3i64NV glad_glVertexAttribL3i64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL3I64VNVPROC glad_glVertexAttribL3i64vNV; +#define glVertexAttribL3i64vNV glad_glVertexAttribL3i64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL3UI64NVPROC glad_glVertexAttribL3ui64NV; +#define glVertexAttribL3ui64NV glad_glVertexAttribL3ui64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL3UI64VNVPROC glad_glVertexAttribL3ui64vNV; +#define glVertexAttribL3ui64vNV glad_glVertexAttribL3ui64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d; +#define glVertexAttribL4d glad_glVertexAttribL4d +GLAD_API_CALL PFNGLVERTEXATTRIBL4DEXTPROC glad_glVertexAttribL4dEXT; +#define glVertexAttribL4dEXT glad_glVertexAttribL4dEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv; +#define glVertexAttribL4dv glad_glVertexAttribL4dv +GLAD_API_CALL PFNGLVERTEXATTRIBL4DVEXTPROC glad_glVertexAttribL4dvEXT; +#define glVertexAttribL4dvEXT glad_glVertexAttribL4dvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBL4I64NVPROC glad_glVertexAttribL4i64NV; +#define glVertexAttribL4i64NV glad_glVertexAttribL4i64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL4I64VNVPROC glad_glVertexAttribL4i64vNV; +#define glVertexAttribL4i64vNV glad_glVertexAttribL4i64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBL4UI64NVPROC glad_glVertexAttribL4ui64NV; +#define glVertexAttribL4ui64NV glad_glVertexAttribL4ui64NV +GLAD_API_CALL PFNGLVERTEXATTRIBL4UI64VNVPROC glad_glVertexAttribL4ui64vNV; +#define glVertexAttribL4ui64vNV glad_glVertexAttribL4ui64vNV +GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat; +#define glVertexAttribLFormat glad_glVertexAttribLFormat +GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATNVPROC glad_glVertexAttribLFormatNV; +#define glVertexAttribLFormatNV glad_glVertexAttribLFormatNV +GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer; +#define glVertexAttribLPointer glad_glVertexAttribLPointer +GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTEREXTPROC glad_glVertexAttribLPointerEXT; +#define glVertexAttribLPointerEXT glad_glVertexAttribLPointerEXT +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBPARAMETERIAMDPROC glad_glVertexAttribParameteriAMD; +#define glVertexAttribParameteriAMD glad_glVertexAttribParameteriAMD +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB; +#define glVertexAttribPointerARB glad_glVertexAttribPointerARB +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV; +#define glVertexAttribPointerNV glad_glVertexAttribPointerNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV; +#define glVertexAttribs1dvNV glad_glVertexAttribs1dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV; +#define glVertexAttribs1fvNV glad_glVertexAttribs1fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1HVNVPROC glad_glVertexAttribs1hvNV; +#define glVertexAttribs1hvNV glad_glVertexAttribs1hvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV; +#define glVertexAttribs1svNV glad_glVertexAttribs1svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV; +#define glVertexAttribs2dvNV glad_glVertexAttribs2dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV; +#define glVertexAttribs2fvNV glad_glVertexAttribs2fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2HVNVPROC glad_glVertexAttribs2hvNV; +#define glVertexAttribs2hvNV glad_glVertexAttribs2hvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV; +#define glVertexAttribs2svNV glad_glVertexAttribs2svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV; +#define glVertexAttribs3dvNV glad_glVertexAttribs3dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV; +#define glVertexAttribs3fvNV glad_glVertexAttribs3fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3HVNVPROC glad_glVertexAttribs3hvNV; +#define glVertexAttribs3hvNV glad_glVertexAttribs3hvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV; +#define glVertexAttribs3svNV glad_glVertexAttribs3svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV; +#define glVertexAttribs4dvNV glad_glVertexAttribs4dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV; +#define glVertexAttribs4fvNV glad_glVertexAttribs4fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4HVNVPROC glad_glVertexAttribs4hvNV; +#define glVertexAttribs4hvNV glad_glVertexAttribs4hvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV; +#define glVertexAttribs4svNV glad_glVertexAttribs4svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV; +#define glVertexAttribs4ubvNV glad_glVertexAttribs4ubvNV +GLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; +#define glVertexBindingDivisor glad_glVertexBindingDivisor +GLAD_API_CALL PFNGLVERTEXBLENDARBPROC glad_glVertexBlendARB; +#define glVertexBlendARB glad_glVertexBlendARB +GLAD_API_CALL PFNGLVERTEXBLENDENVFATIPROC glad_glVertexBlendEnvfATI; +#define glVertexBlendEnvfATI glad_glVertexBlendEnvfATI +GLAD_API_CALL PFNGLVERTEXBLENDENVIATIPROC glad_glVertexBlendEnviATI; +#define glVertexBlendEnviATI glad_glVertexBlendEnviATI +GLAD_API_CALL PFNGLVERTEXFORMATNVPROC glad_glVertexFormatNV; +#define glVertexFormatNV glad_glVertexFormatNV +GLAD_API_CALL PFNGLVERTEXP2UIPROC glad_glVertexP2ui; +#define glVertexP2ui glad_glVertexP2ui +GLAD_API_CALL PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; +#define glVertexP2uiv glad_glVertexP2uiv +GLAD_API_CALL PFNGLVERTEXP3UIPROC glad_glVertexP3ui; +#define glVertexP3ui glad_glVertexP3ui +GLAD_API_CALL PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; +#define glVertexP3uiv glad_glVertexP3uiv +GLAD_API_CALL PFNGLVERTEXP4UIPROC glad_glVertexP4ui; +#define glVertexP4ui glad_glVertexP4ui +GLAD_API_CALL PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; +#define glVertexP4uiv glad_glVertexP4uiv +GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer; +#define glVertexPointer glad_glVertexPointer +GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT; +#define glVertexPointerEXT glad_glVertexPointerEXT +GLAD_API_CALL PFNGLVERTEXPOINTERLISTIBMPROC glad_glVertexPointerListIBM; +#define glVertexPointerListIBM glad_glVertexPointerListIBM +GLAD_API_CALL PFNGLVERTEXPOINTERVINTELPROC glad_glVertexPointervINTEL; +#define glVertexPointervINTEL glad_glVertexPointervINTEL +GLAD_API_CALL PFNGLVERTEXSTREAM1DATIPROC glad_glVertexStream1dATI; +#define glVertexStream1dATI glad_glVertexStream1dATI +GLAD_API_CALL PFNGLVERTEXSTREAM1DVATIPROC glad_glVertexStream1dvATI; +#define glVertexStream1dvATI glad_glVertexStream1dvATI +GLAD_API_CALL PFNGLVERTEXSTREAM1FATIPROC glad_glVertexStream1fATI; +#define glVertexStream1fATI glad_glVertexStream1fATI +GLAD_API_CALL PFNGLVERTEXSTREAM1FVATIPROC glad_glVertexStream1fvATI; +#define glVertexStream1fvATI glad_glVertexStream1fvATI +GLAD_API_CALL PFNGLVERTEXSTREAM1IATIPROC glad_glVertexStream1iATI; +#define glVertexStream1iATI glad_glVertexStream1iATI +GLAD_API_CALL PFNGLVERTEXSTREAM1IVATIPROC glad_glVertexStream1ivATI; +#define glVertexStream1ivATI glad_glVertexStream1ivATI +GLAD_API_CALL PFNGLVERTEXSTREAM1SATIPROC glad_glVertexStream1sATI; +#define glVertexStream1sATI glad_glVertexStream1sATI +GLAD_API_CALL PFNGLVERTEXSTREAM1SVATIPROC glad_glVertexStream1svATI; +#define glVertexStream1svATI glad_glVertexStream1svATI +GLAD_API_CALL PFNGLVERTEXSTREAM2DATIPROC glad_glVertexStream2dATI; +#define glVertexStream2dATI glad_glVertexStream2dATI +GLAD_API_CALL PFNGLVERTEXSTREAM2DVATIPROC glad_glVertexStream2dvATI; +#define glVertexStream2dvATI glad_glVertexStream2dvATI +GLAD_API_CALL PFNGLVERTEXSTREAM2FATIPROC glad_glVertexStream2fATI; +#define glVertexStream2fATI glad_glVertexStream2fATI +GLAD_API_CALL PFNGLVERTEXSTREAM2FVATIPROC glad_glVertexStream2fvATI; +#define glVertexStream2fvATI glad_glVertexStream2fvATI +GLAD_API_CALL PFNGLVERTEXSTREAM2IATIPROC glad_glVertexStream2iATI; +#define glVertexStream2iATI glad_glVertexStream2iATI +GLAD_API_CALL PFNGLVERTEXSTREAM2IVATIPROC glad_glVertexStream2ivATI; +#define glVertexStream2ivATI glad_glVertexStream2ivATI +GLAD_API_CALL PFNGLVERTEXSTREAM2SATIPROC glad_glVertexStream2sATI; +#define glVertexStream2sATI glad_glVertexStream2sATI +GLAD_API_CALL PFNGLVERTEXSTREAM2SVATIPROC glad_glVertexStream2svATI; +#define glVertexStream2svATI glad_glVertexStream2svATI +GLAD_API_CALL PFNGLVERTEXSTREAM3DATIPROC glad_glVertexStream3dATI; +#define glVertexStream3dATI glad_glVertexStream3dATI +GLAD_API_CALL PFNGLVERTEXSTREAM3DVATIPROC glad_glVertexStream3dvATI; +#define glVertexStream3dvATI glad_glVertexStream3dvATI +GLAD_API_CALL PFNGLVERTEXSTREAM3FATIPROC glad_glVertexStream3fATI; +#define glVertexStream3fATI glad_glVertexStream3fATI +GLAD_API_CALL PFNGLVERTEXSTREAM3FVATIPROC glad_glVertexStream3fvATI; +#define glVertexStream3fvATI glad_glVertexStream3fvATI +GLAD_API_CALL PFNGLVERTEXSTREAM3IATIPROC glad_glVertexStream3iATI; +#define glVertexStream3iATI glad_glVertexStream3iATI +GLAD_API_CALL PFNGLVERTEXSTREAM3IVATIPROC glad_glVertexStream3ivATI; +#define glVertexStream3ivATI glad_glVertexStream3ivATI +GLAD_API_CALL PFNGLVERTEXSTREAM3SATIPROC glad_glVertexStream3sATI; +#define glVertexStream3sATI glad_glVertexStream3sATI +GLAD_API_CALL PFNGLVERTEXSTREAM3SVATIPROC glad_glVertexStream3svATI; +#define glVertexStream3svATI glad_glVertexStream3svATI +GLAD_API_CALL PFNGLVERTEXSTREAM4DATIPROC glad_glVertexStream4dATI; +#define glVertexStream4dATI glad_glVertexStream4dATI +GLAD_API_CALL PFNGLVERTEXSTREAM4DVATIPROC glad_glVertexStream4dvATI; +#define glVertexStream4dvATI glad_glVertexStream4dvATI +GLAD_API_CALL PFNGLVERTEXSTREAM4FATIPROC glad_glVertexStream4fATI; +#define glVertexStream4fATI glad_glVertexStream4fATI +GLAD_API_CALL PFNGLVERTEXSTREAM4FVATIPROC glad_glVertexStream4fvATI; +#define glVertexStream4fvATI glad_glVertexStream4fvATI +GLAD_API_CALL PFNGLVERTEXSTREAM4IATIPROC glad_glVertexStream4iATI; +#define glVertexStream4iATI glad_glVertexStream4iATI +GLAD_API_CALL PFNGLVERTEXSTREAM4IVATIPROC glad_glVertexStream4ivATI; +#define glVertexStream4ivATI glad_glVertexStream4ivATI +GLAD_API_CALL PFNGLVERTEXSTREAM4SATIPROC glad_glVertexStream4sATI; +#define glVertexStream4sATI glad_glVertexStream4sATI +GLAD_API_CALL PFNGLVERTEXSTREAM4SVATIPROC glad_glVertexStream4svATI; +#define glVertexStream4svATI glad_glVertexStream4svATI +GLAD_API_CALL PFNGLVERTEXWEIGHTPOINTEREXTPROC glad_glVertexWeightPointerEXT; +#define glVertexWeightPointerEXT glad_glVertexWeightPointerEXT +GLAD_API_CALL PFNGLVERTEXWEIGHTFEXTPROC glad_glVertexWeightfEXT; +#define glVertexWeightfEXT glad_glVertexWeightfEXT +GLAD_API_CALL PFNGLVERTEXWEIGHTFVEXTPROC glad_glVertexWeightfvEXT; +#define glVertexWeightfvEXT glad_glVertexWeightfvEXT +GLAD_API_CALL PFNGLVERTEXWEIGHTHNVPROC glad_glVertexWeighthNV; +#define glVertexWeighthNV glad_glVertexWeighthNV +GLAD_API_CALL PFNGLVERTEXWEIGHTHVNVPROC glad_glVertexWeighthvNV; +#define glVertexWeighthvNV glad_glVertexWeighthvNV +GLAD_API_CALL PFNGLVIDEOCAPTURENVPROC glad_glVideoCaptureNV; +#define glVideoCaptureNV glad_glVideoCaptureNV +GLAD_API_CALL PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC glad_glVideoCaptureStreamParameterdvNV; +#define glVideoCaptureStreamParameterdvNV glad_glVideoCaptureStreamParameterdvNV +GLAD_API_CALL PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC glad_glVideoCaptureStreamParameterfvNV; +#define glVideoCaptureStreamParameterfvNV glad_glVideoCaptureStreamParameterfvNV +GLAD_API_CALL PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC glad_glVideoCaptureStreamParameterivNV; +#define glVideoCaptureStreamParameterivNV glad_glVideoCaptureStreamParameterivNV +GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +GLAD_API_CALL PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv; +#define glViewportArrayv glad_glViewportArrayv +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf; +#define glViewportIndexedf glad_glViewportIndexedf +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv; +#define glViewportIndexedfv glad_glViewportIndexedfv +GLAD_API_CALL PFNGLVIEWPORTPOSITIONWSCALENVPROC glad_glViewportPositionWScaleNV; +#define glViewportPositionWScaleNV glad_glViewportPositionWScaleNV +GLAD_API_CALL PFNGLVIEWPORTSWIZZLENVPROC glad_glViewportSwizzleNV; +#define glViewportSwizzleNV glad_glViewportSwizzleNV +GLAD_API_CALL PFNGLWAITSEMAPHOREEXTPROC glad_glWaitSemaphoreEXT; +#define glWaitSemaphoreEXT glad_glWaitSemaphoreEXT +GLAD_API_CALL PFNGLWAITSEMAPHOREUI64NVXPROC glad_glWaitSemaphoreui64NVX; +#define glWaitSemaphoreui64NVX glad_glWaitSemaphoreui64NVX +GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync +GLAD_API_CALL PFNGLWAITVKSEMAPHORENVPROC glad_glWaitVkSemaphoreNV; +#define glWaitVkSemaphoreNV glad_glWaitVkSemaphoreNV +GLAD_API_CALL PFNGLWEIGHTPATHSNVPROC glad_glWeightPathsNV; +#define glWeightPathsNV glad_glWeightPathsNV +GLAD_API_CALL PFNGLWEIGHTPOINTERARBPROC glad_glWeightPointerARB; +#define glWeightPointerARB glad_glWeightPointerARB +GLAD_API_CALL PFNGLWEIGHTBVARBPROC glad_glWeightbvARB; +#define glWeightbvARB glad_glWeightbvARB +GLAD_API_CALL PFNGLWEIGHTDVARBPROC glad_glWeightdvARB; +#define glWeightdvARB glad_glWeightdvARB +GLAD_API_CALL PFNGLWEIGHTFVARBPROC glad_glWeightfvARB; +#define glWeightfvARB glad_glWeightfvARB +GLAD_API_CALL PFNGLWEIGHTIVARBPROC glad_glWeightivARB; +#define glWeightivARB glad_glWeightivARB +GLAD_API_CALL PFNGLWEIGHTSVARBPROC glad_glWeightsvARB; +#define glWeightsvARB glad_glWeightsvARB +GLAD_API_CALL PFNGLWEIGHTUBVARBPROC glad_glWeightubvARB; +#define glWeightubvARB glad_glWeightubvARB +GLAD_API_CALL PFNGLWEIGHTUIVARBPROC glad_glWeightuivARB; +#define glWeightuivARB glad_glWeightuivARB +GLAD_API_CALL PFNGLWEIGHTUSVARBPROC glad_glWeightusvARB; +#define glWeightusvARB glad_glWeightusvARB +GLAD_API_CALL PFNGLWINDOWPOS2DPROC glad_glWindowPos2d; +#define glWindowPos2d glad_glWindowPos2d +GLAD_API_CALL PFNGLWINDOWPOS2DARBPROC glad_glWindowPos2dARB; +#define glWindowPos2dARB glad_glWindowPos2dARB +GLAD_API_CALL PFNGLWINDOWPOS2DMESAPROC glad_glWindowPos2dMESA; +#define glWindowPos2dMESA glad_glWindowPos2dMESA +GLAD_API_CALL PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv; +#define glWindowPos2dv glad_glWindowPos2dv +GLAD_API_CALL PFNGLWINDOWPOS2DVARBPROC glad_glWindowPos2dvARB; +#define glWindowPos2dvARB glad_glWindowPos2dvARB +GLAD_API_CALL PFNGLWINDOWPOS2DVMESAPROC glad_glWindowPos2dvMESA; +#define glWindowPos2dvMESA glad_glWindowPos2dvMESA +GLAD_API_CALL PFNGLWINDOWPOS2FPROC glad_glWindowPos2f; +#define glWindowPos2f glad_glWindowPos2f +GLAD_API_CALL PFNGLWINDOWPOS2FARBPROC glad_glWindowPos2fARB; +#define glWindowPos2fARB glad_glWindowPos2fARB +GLAD_API_CALL PFNGLWINDOWPOS2FMESAPROC glad_glWindowPos2fMESA; +#define glWindowPos2fMESA glad_glWindowPos2fMESA +GLAD_API_CALL PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv; +#define glWindowPos2fv glad_glWindowPos2fv +GLAD_API_CALL PFNGLWINDOWPOS2FVARBPROC glad_glWindowPos2fvARB; +#define glWindowPos2fvARB glad_glWindowPos2fvARB +GLAD_API_CALL PFNGLWINDOWPOS2FVMESAPROC glad_glWindowPos2fvMESA; +#define glWindowPos2fvMESA glad_glWindowPos2fvMESA +GLAD_API_CALL PFNGLWINDOWPOS2IPROC glad_glWindowPos2i; +#define glWindowPos2i glad_glWindowPos2i +GLAD_API_CALL PFNGLWINDOWPOS2IARBPROC glad_glWindowPos2iARB; +#define glWindowPos2iARB glad_glWindowPos2iARB +GLAD_API_CALL PFNGLWINDOWPOS2IMESAPROC glad_glWindowPos2iMESA; +#define glWindowPos2iMESA glad_glWindowPos2iMESA +GLAD_API_CALL PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv; +#define glWindowPos2iv glad_glWindowPos2iv +GLAD_API_CALL PFNGLWINDOWPOS2IVARBPROC glad_glWindowPos2ivARB; +#define glWindowPos2ivARB glad_glWindowPos2ivARB +GLAD_API_CALL PFNGLWINDOWPOS2IVMESAPROC glad_glWindowPos2ivMESA; +#define glWindowPos2ivMESA glad_glWindowPos2ivMESA +GLAD_API_CALL PFNGLWINDOWPOS2SPROC glad_glWindowPos2s; +#define glWindowPos2s glad_glWindowPos2s +GLAD_API_CALL PFNGLWINDOWPOS2SARBPROC glad_glWindowPos2sARB; +#define glWindowPos2sARB glad_glWindowPos2sARB +GLAD_API_CALL PFNGLWINDOWPOS2SMESAPROC glad_glWindowPos2sMESA; +#define glWindowPos2sMESA glad_glWindowPos2sMESA +GLAD_API_CALL PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv; +#define glWindowPos2sv glad_glWindowPos2sv +GLAD_API_CALL PFNGLWINDOWPOS2SVARBPROC glad_glWindowPos2svARB; +#define glWindowPos2svARB glad_glWindowPos2svARB +GLAD_API_CALL PFNGLWINDOWPOS2SVMESAPROC glad_glWindowPos2svMESA; +#define glWindowPos2svMESA glad_glWindowPos2svMESA +GLAD_API_CALL PFNGLWINDOWPOS3DPROC glad_glWindowPos3d; +#define glWindowPos3d glad_glWindowPos3d +GLAD_API_CALL PFNGLWINDOWPOS3DARBPROC glad_glWindowPos3dARB; +#define glWindowPos3dARB glad_glWindowPos3dARB +GLAD_API_CALL PFNGLWINDOWPOS3DMESAPROC glad_glWindowPos3dMESA; +#define glWindowPos3dMESA glad_glWindowPos3dMESA +GLAD_API_CALL PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv; +#define glWindowPos3dv glad_glWindowPos3dv +GLAD_API_CALL PFNGLWINDOWPOS3DVARBPROC glad_glWindowPos3dvARB; +#define glWindowPos3dvARB glad_glWindowPos3dvARB +GLAD_API_CALL PFNGLWINDOWPOS3DVMESAPROC glad_glWindowPos3dvMESA; +#define glWindowPos3dvMESA glad_glWindowPos3dvMESA +GLAD_API_CALL PFNGLWINDOWPOS3FPROC glad_glWindowPos3f; +#define glWindowPos3f glad_glWindowPos3f +GLAD_API_CALL PFNGLWINDOWPOS3FARBPROC glad_glWindowPos3fARB; +#define glWindowPos3fARB glad_glWindowPos3fARB +GLAD_API_CALL PFNGLWINDOWPOS3FMESAPROC glad_glWindowPos3fMESA; +#define glWindowPos3fMESA glad_glWindowPos3fMESA +GLAD_API_CALL PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv; +#define glWindowPos3fv glad_glWindowPos3fv +GLAD_API_CALL PFNGLWINDOWPOS3FVARBPROC glad_glWindowPos3fvARB; +#define glWindowPos3fvARB glad_glWindowPos3fvARB +GLAD_API_CALL PFNGLWINDOWPOS3FVMESAPROC glad_glWindowPos3fvMESA; +#define glWindowPos3fvMESA glad_glWindowPos3fvMESA +GLAD_API_CALL PFNGLWINDOWPOS3IPROC glad_glWindowPos3i; +#define glWindowPos3i glad_glWindowPos3i +GLAD_API_CALL PFNGLWINDOWPOS3IARBPROC glad_glWindowPos3iARB; +#define glWindowPos3iARB glad_glWindowPos3iARB +GLAD_API_CALL PFNGLWINDOWPOS3IMESAPROC glad_glWindowPos3iMESA; +#define glWindowPos3iMESA glad_glWindowPos3iMESA +GLAD_API_CALL PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv; +#define glWindowPos3iv glad_glWindowPos3iv +GLAD_API_CALL PFNGLWINDOWPOS3IVARBPROC glad_glWindowPos3ivARB; +#define glWindowPos3ivARB glad_glWindowPos3ivARB +GLAD_API_CALL PFNGLWINDOWPOS3IVMESAPROC glad_glWindowPos3ivMESA; +#define glWindowPos3ivMESA glad_glWindowPos3ivMESA +GLAD_API_CALL PFNGLWINDOWPOS3SPROC glad_glWindowPos3s; +#define glWindowPos3s glad_glWindowPos3s +GLAD_API_CALL PFNGLWINDOWPOS3SARBPROC glad_glWindowPos3sARB; +#define glWindowPos3sARB glad_glWindowPos3sARB +GLAD_API_CALL PFNGLWINDOWPOS3SMESAPROC glad_glWindowPos3sMESA; +#define glWindowPos3sMESA glad_glWindowPos3sMESA +GLAD_API_CALL PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv; +#define glWindowPos3sv glad_glWindowPos3sv +GLAD_API_CALL PFNGLWINDOWPOS3SVARBPROC glad_glWindowPos3svARB; +#define glWindowPos3svARB glad_glWindowPos3svARB +GLAD_API_CALL PFNGLWINDOWPOS3SVMESAPROC glad_glWindowPos3svMESA; +#define glWindowPos3svMESA glad_glWindowPos3svMESA +GLAD_API_CALL PFNGLWINDOWPOS4DMESAPROC glad_glWindowPos4dMESA; +#define glWindowPos4dMESA glad_glWindowPos4dMESA +GLAD_API_CALL PFNGLWINDOWPOS4DVMESAPROC glad_glWindowPos4dvMESA; +#define glWindowPos4dvMESA glad_glWindowPos4dvMESA +GLAD_API_CALL PFNGLWINDOWPOS4FMESAPROC glad_glWindowPos4fMESA; +#define glWindowPos4fMESA glad_glWindowPos4fMESA +GLAD_API_CALL PFNGLWINDOWPOS4FVMESAPROC glad_glWindowPos4fvMESA; +#define glWindowPos4fvMESA glad_glWindowPos4fvMESA +GLAD_API_CALL PFNGLWINDOWPOS4IMESAPROC glad_glWindowPos4iMESA; +#define glWindowPos4iMESA glad_glWindowPos4iMESA +GLAD_API_CALL PFNGLWINDOWPOS4IVMESAPROC glad_glWindowPos4ivMESA; +#define glWindowPos4ivMESA glad_glWindowPos4ivMESA +GLAD_API_CALL PFNGLWINDOWPOS4SMESAPROC glad_glWindowPos4sMESA; +#define glWindowPos4sMESA glad_glWindowPos4sMESA +GLAD_API_CALL PFNGLWINDOWPOS4SVMESAPROC glad_glWindowPos4svMESA; +#define glWindowPos4svMESA glad_glWindowPos4svMESA +GLAD_API_CALL PFNGLWINDOWRECTANGLESEXTPROC glad_glWindowRectanglesEXT; +#define glWindowRectanglesEXT glad_glWindowRectanglesEXT +GLAD_API_CALL PFNGLWRITEMASKEXTPROC glad_glWriteMaskEXT; +#define glWriteMaskEXT glad_glWriteMaskEXT +GLAD_API_CALL PFNGLACTIVESHADERPROGRAMEXTPROC glad_glActiveShaderProgramEXT; +#define glActiveShaderProgramEXT glad_glActiveShaderProgramEXT +GLAD_API_CALL PFNGLALPHAFUNCQCOMPROC glad_glAlphaFuncQCOM; +#define glAlphaFuncQCOM glad_glAlphaFuncQCOM +GLAD_API_CALL PFNGLBEGINQUERYEXTPROC glad_glBeginQueryEXT; +#define glBeginQueryEXT glad_glBeginQueryEXT +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC glad_glBindFragDataLocationIndexedEXT; +#define glBindFragDataLocationIndexedEXT glad_glBindFragDataLocationIndexedEXT +GLAD_API_CALL PFNGLBINDPROGRAMPIPELINEEXTPROC glad_glBindProgramPipelineEXT; +#define glBindProgramPipelineEXT glad_glBindProgramPipelineEXT +GLAD_API_CALL PFNGLBINDVERTEXARRAYOESPROC glad_glBindVertexArrayOES; +#define glBindVertexArrayOES glad_glBindVertexArrayOES +GLAD_API_CALL PFNGLBLENDBARRIERPROC glad_glBlendBarrier; +#define glBlendBarrier glad_glBlendBarrier +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIEXTPROC glad_glBlendEquationSeparateiEXT; +#define glBlendEquationSeparateiEXT glad_glBlendEquationSeparateiEXT +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIOESPROC glad_glBlendEquationSeparateiOES; +#define glBlendEquationSeparateiOES glad_glBlendEquationSeparateiOES +GLAD_API_CALL PFNGLBLENDEQUATIONIEXTPROC glad_glBlendEquationiEXT; +#define glBlendEquationiEXT glad_glBlendEquationiEXT +GLAD_API_CALL PFNGLBLENDEQUATIONIOESPROC glad_glBlendEquationiOES; +#define glBlendEquationiOES glad_glBlendEquationiOES +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIEXTPROC glad_glBlendFuncSeparateiEXT; +#define glBlendFuncSeparateiEXT glad_glBlendFuncSeparateiEXT +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIOESPROC glad_glBlendFuncSeparateiOES; +#define glBlendFuncSeparateiOES glad_glBlendFuncSeparateiOES +GLAD_API_CALL PFNGLBLENDFUNCIEXTPROC glad_glBlendFunciEXT; +#define glBlendFunciEXT glad_glBlendFunciEXT +GLAD_API_CALL PFNGLBLENDFUNCIOESPROC glad_glBlendFunciOES; +#define glBlendFunciOES glad_glBlendFunciOES +GLAD_API_CALL PFNGLBLITFRAMEBUFFERANGLEPROC glad_glBlitFramebufferANGLE; +#define glBlitFramebufferANGLE glad_glBlitFramebufferANGLE +GLAD_API_CALL PFNGLBLITFRAMEBUFFERNVPROC glad_glBlitFramebufferNV; +#define glBlitFramebufferNV glad_glBlitFramebufferNV +GLAD_API_CALL PFNGLBUFFERSTORAGEEXTPROC glad_glBufferStorageEXT; +#define glBufferStorageEXT glad_glBufferStorageEXT +GLAD_API_CALL PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC glad_glClearPixelLocalStorageuiEXT; +#define glClearPixelLocalStorageuiEXT glad_glClearPixelLocalStorageuiEXT +GLAD_API_CALL PFNGLCLEARTEXIMAGEEXTPROC glad_glClearTexImageEXT; +#define glClearTexImageEXT glad_glClearTexImageEXT +GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEEXTPROC glad_glClearTexSubImageEXT; +#define glClearTexSubImageEXT glad_glClearTexSubImageEXT +GLAD_API_CALL PFNGLCLIENTWAITSYNCAPPLEPROC glad_glClientWaitSyncAPPLE; +#define glClientWaitSyncAPPLE glad_glClientWaitSyncAPPLE +GLAD_API_CALL PFNGLCLIPCONTROLEXTPROC glad_glClipControlEXT; +#define glClipControlEXT glad_glClipControlEXT +GLAD_API_CALL PFNGLCOLORMASKIEXTPROC glad_glColorMaskiEXT; +#define glColorMaskiEXT glad_glColorMaskiEXT +GLAD_API_CALL PFNGLCOLORMASKIOESPROC glad_glColorMaskiOES; +#define glColorMaskiOES glad_glColorMaskiOES +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DOESPROC glad_glCompressedTexImage3DOES; +#define glCompressedTexImage3DOES glad_glCompressedTexImage3DOES +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC glad_glCompressedTexSubImage3DOES; +#define glCompressedTexSubImage3DOES glad_glCompressedTexSubImage3DOES +GLAD_API_CALL PFNGLCOPYBUFFERSUBDATANVPROC glad_glCopyBufferSubDataNV; +#define glCopyBufferSubDataNV glad_glCopyBufferSubDataNV +GLAD_API_CALL PFNGLCOPYIMAGESUBDATAEXTPROC glad_glCopyImageSubDataEXT; +#define glCopyImageSubDataEXT glad_glCopyImageSubDataEXT +GLAD_API_CALL PFNGLCOPYIMAGESUBDATAOESPROC glad_glCopyImageSubDataOES; +#define glCopyImageSubDataOES glad_glCopyImageSubDataOES +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DOESPROC glad_glCopyTexSubImage3DOES; +#define glCopyTexSubImage3DOES glad_glCopyTexSubImage3DOES +GLAD_API_CALL PFNGLCOPYTEXTURELEVELSAPPLEPROC glad_glCopyTextureLevelsAPPLE; +#define glCopyTextureLevelsAPPLE glad_glCopyTextureLevelsAPPLE +GLAD_API_CALL PFNGLCOVERAGEMASKNVPROC glad_glCoverageMaskNV; +#define glCoverageMaskNV glad_glCoverageMaskNV +GLAD_API_CALL PFNGLCOVERAGEOPERATIONNVPROC glad_glCoverageOperationNV; +#define glCoverageOperationNV glad_glCoverageOperationNV +GLAD_API_CALL PFNGLCREATESHADERPROGRAMVEXTPROC glad_glCreateShaderProgramvEXT; +#define glCreateShaderProgramvEXT glad_glCreateShaderProgramvEXT +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR; +#define glDebugMessageCallbackKHR glad_glDebugMessageCallbackKHR +GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR; +#define glDebugMessageControlKHR glad_glDebugMessageControlKHR +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR; +#define glDebugMessageInsertKHR glad_glDebugMessageInsertKHR +GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESEXTPROC glad_glDeleteProgramPipelinesEXT; +#define glDeleteProgramPipelinesEXT glad_glDeleteProgramPipelinesEXT +GLAD_API_CALL PFNGLDELETEQUERIESEXTPROC glad_glDeleteQueriesEXT; +#define glDeleteQueriesEXT glad_glDeleteQueriesEXT +GLAD_API_CALL PFNGLDELETESYNCAPPLEPROC glad_glDeleteSyncAPPLE; +#define glDeleteSyncAPPLE glad_glDeleteSyncAPPLE +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSOESPROC glad_glDeleteVertexArraysOES; +#define glDeleteVertexArraysOES glad_glDeleteVertexArraysOES +GLAD_API_CALL PFNGLDEPTHRANGEARRAYFVNVPROC glad_glDepthRangeArrayfvNV; +#define glDepthRangeArrayfvNV glad_glDepthRangeArrayfvNV +GLAD_API_CALL PFNGLDEPTHRANGEARRAYFVOESPROC glad_glDepthRangeArrayfvOES; +#define glDepthRangeArrayfvOES glad_glDepthRangeArrayfvOES +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDFNVPROC glad_glDepthRangeIndexedfNV; +#define glDepthRangeIndexedfNV glad_glDepthRangeIndexedfNV +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDFOESPROC glad_glDepthRangeIndexedfOES; +#define glDepthRangeIndexedfOES glad_glDepthRangeIndexedfOES +GLAD_API_CALL PFNGLDISABLEDRIVERCONTROLQCOMPROC glad_glDisableDriverControlQCOM; +#define glDisableDriverControlQCOM glad_glDisableDriverControlQCOM +GLAD_API_CALL PFNGLDISABLEIEXTPROC glad_glDisableiEXT; +#define glDisableiEXT glad_glDisableiEXT +GLAD_API_CALL PFNGLDISABLEINVPROC glad_glDisableiNV; +#define glDisableiNV glad_glDisableiNV +GLAD_API_CALL PFNGLDISABLEIOESPROC glad_glDisableiOES; +#define glDisableiOES glad_glDisableiOES +GLAD_API_CALL PFNGLDISCARDFRAMEBUFFEREXTPROC glad_glDiscardFramebufferEXT; +#define glDiscardFramebufferEXT glad_glDiscardFramebufferEXT +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDANGLEPROC glad_glDrawArraysInstancedANGLE; +#define glDrawArraysInstancedANGLE glad_glDrawArraysInstancedANGLE +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC glad_glDrawArraysInstancedBaseInstanceEXT; +#define glDrawArraysInstancedBaseInstanceEXT glad_glDrawArraysInstancedBaseInstanceEXT +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDNVPROC glad_glDrawArraysInstancedNV; +#define glDrawArraysInstancedNV glad_glDrawArraysInstancedNV +GLAD_API_CALL PFNGLDRAWBUFFERSEXTPROC glad_glDrawBuffersEXT; +#define glDrawBuffersEXT glad_glDrawBuffersEXT +GLAD_API_CALL PFNGLDRAWBUFFERSINDEXEDEXTPROC glad_glDrawBuffersIndexedEXT; +#define glDrawBuffersIndexedEXT glad_glDrawBuffersIndexedEXT +GLAD_API_CALL PFNGLDRAWBUFFERSNVPROC glad_glDrawBuffersNV; +#define glDrawBuffersNV glad_glDrawBuffersNV +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXEXTPROC glad_glDrawElementsBaseVertexEXT; +#define glDrawElementsBaseVertexEXT glad_glDrawElementsBaseVertexEXT +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXOESPROC glad_glDrawElementsBaseVertexOES; +#define glDrawElementsBaseVertexOES glad_glDrawElementsBaseVertexOES +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDANGLEPROC glad_glDrawElementsInstancedANGLE; +#define glDrawElementsInstancedANGLE glad_glDrawElementsInstancedANGLE +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC glad_glDrawElementsInstancedBaseInstanceEXT; +#define glDrawElementsInstancedBaseInstanceEXT glad_glDrawElementsInstancedBaseInstanceEXT +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC glad_glDrawElementsInstancedBaseVertexBaseInstanceEXT; +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT glad_glDrawElementsInstancedBaseVertexBaseInstanceEXT +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC glad_glDrawElementsInstancedBaseVertexEXT; +#define glDrawElementsInstancedBaseVertexEXT glad_glDrawElementsInstancedBaseVertexEXT +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC glad_glDrawElementsInstancedBaseVertexOES; +#define glDrawElementsInstancedBaseVertexOES glad_glDrawElementsInstancedBaseVertexOES +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDNVPROC glad_glDrawElementsInstancedNV; +#define glDrawElementsInstancedNV glad_glDrawElementsInstancedNV +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC glad_glDrawRangeElementsBaseVertexEXT; +#define glDrawRangeElementsBaseVertexEXT glad_glDrawRangeElementsBaseVertexEXT +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC glad_glDrawRangeElementsBaseVertexOES; +#define glDrawRangeElementsBaseVertexOES glad_glDrawRangeElementsBaseVertexOES +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKEXTPROC glad_glDrawTransformFeedbackEXT; +#define glDrawTransformFeedbackEXT glad_glDrawTransformFeedbackEXT +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC glad_glDrawTransformFeedbackInstancedEXT; +#define glDrawTransformFeedbackInstancedEXT glad_glDrawTransformFeedbackInstancedEXT +GLAD_API_CALL PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glad_glEGLImageTargetRenderbufferStorageOES; +#define glEGLImageTargetRenderbufferStorageOES glad_glEGLImageTargetRenderbufferStorageOES +GLAD_API_CALL PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glad_glEGLImageTargetTexture2DOES; +#define glEGLImageTargetTexture2DOES glad_glEGLImageTargetTexture2DOES +GLAD_API_CALL PFNGLENABLEDRIVERCONTROLQCOMPROC glad_glEnableDriverControlQCOM; +#define glEnableDriverControlQCOM glad_glEnableDriverControlQCOM +GLAD_API_CALL PFNGLENABLEIEXTPROC glad_glEnableiEXT; +#define glEnableiEXT glad_glEnableiEXT +GLAD_API_CALL PFNGLENABLEINVPROC glad_glEnableiNV; +#define glEnableiNV glad_glEnableiNV +GLAD_API_CALL PFNGLENABLEIOESPROC glad_glEnableiOES; +#define glEnableiOES glad_glEnableiOES +GLAD_API_CALL PFNGLENDQUERYEXTPROC glad_glEndQueryEXT; +#define glEndQueryEXT glad_glEndQueryEXT +GLAD_API_CALL PFNGLENDTILINGQCOMPROC glad_glEndTilingQCOM; +#define glEndTilingQCOM glad_glEndTilingQCOM +GLAD_API_CALL PFNGLEXTGETBUFFERPOINTERVQCOMPROC glad_glExtGetBufferPointervQCOM; +#define glExtGetBufferPointervQCOM glad_glExtGetBufferPointervQCOM +GLAD_API_CALL PFNGLEXTGETBUFFERSQCOMPROC glad_glExtGetBuffersQCOM; +#define glExtGetBuffersQCOM glad_glExtGetBuffersQCOM +GLAD_API_CALL PFNGLEXTGETFRAMEBUFFERSQCOMPROC glad_glExtGetFramebuffersQCOM; +#define glExtGetFramebuffersQCOM glad_glExtGetFramebuffersQCOM +GLAD_API_CALL PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC glad_glExtGetProgramBinarySourceQCOM; +#define glExtGetProgramBinarySourceQCOM glad_glExtGetProgramBinarySourceQCOM +GLAD_API_CALL PFNGLEXTGETPROGRAMSQCOMPROC glad_glExtGetProgramsQCOM; +#define glExtGetProgramsQCOM glad_glExtGetProgramsQCOM +GLAD_API_CALL PFNGLEXTGETRENDERBUFFERSQCOMPROC glad_glExtGetRenderbuffersQCOM; +#define glExtGetRenderbuffersQCOM glad_glExtGetRenderbuffersQCOM +GLAD_API_CALL PFNGLEXTGETSHADERSQCOMPROC glad_glExtGetShadersQCOM; +#define glExtGetShadersQCOM glad_glExtGetShadersQCOM +GLAD_API_CALL PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC glad_glExtGetTexLevelParameterivQCOM; +#define glExtGetTexLevelParameterivQCOM glad_glExtGetTexLevelParameterivQCOM +GLAD_API_CALL PFNGLEXTGETTEXSUBIMAGEQCOMPROC glad_glExtGetTexSubImageQCOM; +#define glExtGetTexSubImageQCOM glad_glExtGetTexSubImageQCOM +GLAD_API_CALL PFNGLEXTGETTEXTURESQCOMPROC glad_glExtGetTexturesQCOM; +#define glExtGetTexturesQCOM glad_glExtGetTexturesQCOM +GLAD_API_CALL PFNGLEXTISPROGRAMBINARYQCOMPROC glad_glExtIsProgramBinaryQCOM; +#define glExtIsProgramBinaryQCOM glad_glExtIsProgramBinaryQCOM +GLAD_API_CALL PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC glad_glExtTexObjectStateOverrideiQCOM; +#define glExtTexObjectStateOverrideiQCOM glad_glExtTexObjectStateOverrideiQCOM +GLAD_API_CALL PFNGLEXTRAPOLATETEX2DQCOMPROC glad_glExtrapolateTex2DQCOM; +#define glExtrapolateTex2DQCOM glad_glExtrapolateTex2DQCOM +GLAD_API_CALL PFNGLFENCESYNCAPPLEPROC glad_glFenceSyncAPPLE; +#define glFenceSyncAPPLE glad_glFenceSyncAPPLE +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC glad_glFlushMappedBufferRangeEXT; +#define glFlushMappedBufferRangeEXT glad_glFlushMappedBufferRangeEXT +GLAD_API_CALL PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC glad_glFramebufferFetchBarrierQCOM; +#define glFramebufferFetchBarrierQCOM glad_glFramebufferFetchBarrierQCOM +GLAD_API_CALL PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC glad_glFramebufferFoveationConfigQCOM; +#define glFramebufferFoveationConfigQCOM glad_glFramebufferFoveationConfigQCOM +GLAD_API_CALL PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC glad_glFramebufferFoveationParametersQCOM; +#define glFramebufferFoveationParametersQCOM glad_glFramebufferFoveationParametersQCOM +GLAD_API_CALL PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC glad_glFramebufferPixelLocalStorageSizeEXT; +#define glFramebufferPixelLocalStorageSizeEXT glad_glFramebufferPixelLocalStorageSizeEXT +GLAD_API_CALL PFNGLFRAMEBUFFERSHADINGRATEEXTPROC glad_glFramebufferShadingRateEXT; +#define glFramebufferShadingRateEXT glad_glFramebufferShadingRateEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC glad_glFramebufferTexture2DDownsampleIMG; +#define glFramebufferTexture2DDownsampleIMG glad_glFramebufferTexture2DDownsampleIMG +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glad_glFramebufferTexture2DMultisampleEXT; +#define glFramebufferTexture2DMultisampleEXT glad_glFramebufferTexture2DMultisampleEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC glad_glFramebufferTexture2DMultisampleIMG; +#define glFramebufferTexture2DMultisampleIMG glad_glFramebufferTexture2DMultisampleIMG +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DOESPROC glad_glFramebufferTexture3DOES; +#define glFramebufferTexture3DOES glad_glFramebufferTexture3DOES +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC glad_glFramebufferTextureLayerDownsampleIMG; +#define glFramebufferTextureLayerDownsampleIMG glad_glFramebufferTextureLayerDownsampleIMG +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glad_glFramebufferTextureMultisampleMultiviewOVR; +#define glFramebufferTextureMultisampleMultiviewOVR glad_glFramebufferTextureMultisampleMultiviewOVR +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREOESPROC glad_glFramebufferTextureOES; +#define glFramebufferTextureOES glad_glFramebufferTextureOES +GLAD_API_CALL PFNGLGENPROGRAMPIPELINESEXTPROC glad_glGenProgramPipelinesEXT; +#define glGenProgramPipelinesEXT glad_glGenProgramPipelinesEXT +GLAD_API_CALL PFNGLGENQUERIESEXTPROC glad_glGenQueriesEXT; +#define glGenQueriesEXT glad_glGenQueriesEXT +GLAD_API_CALL PFNGLGENVERTEXARRAYSOESPROC glad_glGenVertexArraysOES; +#define glGenVertexArraysOES glad_glGenVertexArraysOES +GLAD_API_CALL PFNGLGETBUFFERPOINTERVOESPROC glad_glGetBufferPointervOES; +#define glGetBufferPointervOES glad_glGetBufferPointervOES +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR; +#define glGetDebugMessageLogKHR glad_glGetDebugMessageLogKHR +GLAD_API_CALL PFNGLGETDRIVERCONTROLSTRINGQCOMPROC glad_glGetDriverControlStringQCOM; +#define glGetDriverControlStringQCOM glad_glGetDriverControlStringQCOM +GLAD_API_CALL PFNGLGETDRIVERCONTROLSQCOMPROC glad_glGetDriverControlsQCOM; +#define glGetDriverControlsQCOM glad_glGetDriverControlsQCOM +GLAD_API_CALL PFNGLGETFLOATI_VNVPROC glad_glGetFloati_vNV; +#define glGetFloati_vNV glad_glGetFloati_vNV +GLAD_API_CALL PFNGLGETFLOATI_VOESPROC glad_glGetFloati_vOES; +#define glGetFloati_vOES glad_glGetFloati_vOES +GLAD_API_CALL PFNGLGETFRAGDATAINDEXEXTPROC glad_glGetFragDataIndexEXT; +#define glGetFragDataIndexEXT glad_glGetFragDataIndexEXT +GLAD_API_CALL PFNGLGETFRAGMENTSHADINGRATESEXTPROC glad_glGetFragmentShadingRatesEXT; +#define glGetFragmentShadingRatesEXT glad_glGetFragmentShadingRatesEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC glad_glGetFramebufferPixelLocalStorageSizeEXT; +#define glGetFramebufferPixelLocalStorageSizeEXT glad_glGetFramebufferPixelLocalStorageSizeEXT +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSEXTPROC glad_glGetGraphicsResetStatusEXT; +#define glGetGraphicsResetStatusEXT glad_glGetGraphicsResetStatusEXT +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSKHRPROC glad_glGetGraphicsResetStatusKHR; +#define glGetGraphicsResetStatusKHR glad_glGetGraphicsResetStatusKHR +GLAD_API_CALL PFNGLGETINTEGER64VAPPLEPROC glad_glGetInteger64vAPPLE; +#define glGetInteger64vAPPLE glad_glGetInteger64vAPPLE +GLAD_API_CALL PFNGLGETINTEGER64VEXTPROC glad_glGetInteger64vEXT; +#define glGetInteger64vEXT glad_glGetInteger64vEXT +GLAD_API_CALL PFNGLGETINTEGERI_VEXTPROC glad_glGetIntegeri_vEXT; +#define glGetIntegeri_vEXT glad_glGetIntegeri_vEXT +GLAD_API_CALL PFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR; +#define glGetObjectLabelKHR glad_glGetObjectLabelKHR +GLAD_API_CALL PFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR; +#define glGetObjectPtrLabelKHR glad_glGetObjectPtrLabelKHR +GLAD_API_CALL PFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR; +#define glGetPointervKHR glad_glGetPointervKHR +GLAD_API_CALL PFNGLGETPROGRAMBINARYOESPROC glad_glGetProgramBinaryOES; +#define glGetProgramBinaryOES glad_glGetProgramBinaryOES +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC glad_glGetProgramPipelineInfoLogEXT; +#define glGetProgramPipelineInfoLogEXT glad_glGetProgramPipelineInfoLogEXT +GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVEXTPROC glad_glGetProgramPipelineivEXT; +#define glGetProgramPipelineivEXT glad_glGetProgramPipelineivEXT +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC glad_glGetProgramResourceLocationIndexEXT; +#define glGetProgramResourceLocationIndexEXT glad_glGetProgramResourceLocationIndexEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTIVEXTPROC glad_glGetQueryObjectivEXT; +#define glGetQueryObjectivEXT glad_glGetQueryObjectivEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVEXTPROC glad_glGetQueryObjectuivEXT; +#define glGetQueryObjectuivEXT glad_glGetQueryObjectuivEXT +GLAD_API_CALL PFNGLGETQUERYIVEXTPROC glad_glGetQueryivEXT; +#define glGetQueryivEXT glad_glGetQueryivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVEXTPROC glad_glGetSamplerParameterIivEXT; +#define glGetSamplerParameterIivEXT glad_glGetSamplerParameterIivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVOESPROC glad_glGetSamplerParameterIivOES; +#define glGetSamplerParameterIivOES glad_glGetSamplerParameterIivOES +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVEXTPROC glad_glGetSamplerParameterIuivEXT; +#define glGetSamplerParameterIuivEXT glad_glGetSamplerParameterIuivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVOESPROC glad_glGetSamplerParameterIuivOES; +#define glGetSamplerParameterIuivOES glad_glGetSamplerParameterIuivOES +GLAD_API_CALL PFNGLGETSYNCIVAPPLEPROC glad_glGetSyncivAPPLE; +#define glGetSyncivAPPLE glad_glGetSyncivAPPLE +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVOESPROC glad_glGetTexParameterIivOES; +#define glGetTexParameterIivOES glad_glGetTexParameterIivOES +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVOESPROC glad_glGetTexParameterIuivOES; +#define glGetTexParameterIuivOES glad_glGetTexParameterIuivOES +GLAD_API_CALL PFNGLGETTEXTUREHANDLEIMGPROC glad_glGetTextureHandleIMG; +#define glGetTextureHandleIMG glad_glGetTextureHandleIMG +GLAD_API_CALL PFNGLGETTEXTURESAMPLERHANDLEIMGPROC glad_glGetTextureSamplerHandleIMG; +#define glGetTextureSamplerHandleIMG glad_glGetTextureSamplerHandleIMG +GLAD_API_CALL PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC glad_glGetTranslatedShaderSourceANGLE; +#define glGetTranslatedShaderSourceANGLE glad_glGetTranslatedShaderSourceANGLE +GLAD_API_CALL PFNGLGETNUNIFORMFVEXTPROC glad_glGetnUniformfvEXT; +#define glGetnUniformfvEXT glad_glGetnUniformfvEXT +GLAD_API_CALL PFNGLGETNUNIFORMFVKHRPROC glad_glGetnUniformfvKHR; +#define glGetnUniformfvKHR glad_glGetnUniformfvKHR +GLAD_API_CALL PFNGLGETNUNIFORMIVEXTPROC glad_glGetnUniformivEXT; +#define glGetnUniformivEXT glad_glGetnUniformivEXT +GLAD_API_CALL PFNGLGETNUNIFORMIVKHRPROC glad_glGetnUniformivKHR; +#define glGetnUniformivKHR glad_glGetnUniformivKHR +GLAD_API_CALL PFNGLGETNUNIFORMUIVKHRPROC glad_glGetnUniformuivKHR; +#define glGetnUniformuivKHR glad_glGetnUniformuivKHR +GLAD_API_CALL PFNGLISENABLEDIEXTPROC glad_glIsEnablediEXT; +#define glIsEnablediEXT glad_glIsEnablediEXT +GLAD_API_CALL PFNGLISENABLEDINVPROC glad_glIsEnablediNV; +#define glIsEnablediNV glad_glIsEnablediNV +GLAD_API_CALL PFNGLISENABLEDIOESPROC glad_glIsEnablediOES; +#define glIsEnablediOES glad_glIsEnablediOES +GLAD_API_CALL PFNGLISPROGRAMPIPELINEEXTPROC glad_glIsProgramPipelineEXT; +#define glIsProgramPipelineEXT glad_glIsProgramPipelineEXT +GLAD_API_CALL PFNGLISQUERYEXTPROC glad_glIsQueryEXT; +#define glIsQueryEXT glad_glIsQueryEXT +GLAD_API_CALL PFNGLISSYNCAPPLEPROC glad_glIsSyncAPPLE; +#define glIsSyncAPPLE glad_glIsSyncAPPLE +GLAD_API_CALL PFNGLISVERTEXARRAYOESPROC glad_glIsVertexArrayOES; +#define glIsVertexArrayOES glad_glIsVertexArrayOES +GLAD_API_CALL PFNGLMAPBUFFEROESPROC glad_glMapBufferOES; +#define glMapBufferOES glad_glMapBufferOES +GLAD_API_CALL PFNGLMAPBUFFERRANGEEXTPROC glad_glMapBufferRangeEXT; +#define glMapBufferRangeEXT glad_glMapBufferRangeEXT +GLAD_API_CALL PFNGLMAXACTIVESHADERCORESARMPROC glad_glMaxActiveShaderCoresARM; +#define glMaxActiveShaderCoresARM glad_glMaxActiveShaderCoresARM +GLAD_API_CALL PFNGLMINSAMPLESHADINGOESPROC glad_glMinSampleShadingOES; +#define glMinSampleShadingOES glad_glMinSampleShadingOES +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC glad_glMultiDrawArraysIndirectEXT; +#define glMultiDrawArraysIndirectEXT glad_glMultiDrawArraysIndirectEXT +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC glad_glMultiDrawElementsBaseVertexEXT; +#define glMultiDrawElementsBaseVertexEXT glad_glMultiDrawElementsBaseVertexEXT +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC glad_glMultiDrawElementsIndirectEXT; +#define glMultiDrawElementsIndirectEXT glad_glMultiDrawElementsIndirectEXT +GLAD_API_CALL PFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR; +#define glObjectLabelKHR glad_glObjectLabelKHR +GLAD_API_CALL PFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR; +#define glObjectPtrLabelKHR glad_glObjectPtrLabelKHR +GLAD_API_CALL PFNGLPATCHPARAMETERIEXTPROC glad_glPatchParameteriEXT; +#define glPatchParameteriEXT glad_glPatchParameteriEXT +GLAD_API_CALL PFNGLPATCHPARAMETERIOESPROC glad_glPatchParameteriOES; +#define glPatchParameteriOES glad_glPatchParameteriOES +GLAD_API_CALL PFNGLPOLYGONMODENVPROC glad_glPolygonModeNV; +#define glPolygonModeNV glad_glPolygonModeNV +GLAD_API_CALL PFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR; +#define glPopDebugGroupKHR glad_glPopDebugGroupKHR +GLAD_API_CALL PFNGLPRIMITIVEBOUNDINGBOXPROC glad_glPrimitiveBoundingBox; +#define glPrimitiveBoundingBox glad_glPrimitiveBoundingBox +GLAD_API_CALL PFNGLPRIMITIVEBOUNDINGBOXEXTPROC glad_glPrimitiveBoundingBoxEXT; +#define glPrimitiveBoundingBoxEXT glad_glPrimitiveBoundingBoxEXT +GLAD_API_CALL PFNGLPRIMITIVEBOUNDINGBOXOESPROC glad_glPrimitiveBoundingBoxOES; +#define glPrimitiveBoundingBoxOES glad_glPrimitiveBoundingBoxOES +GLAD_API_CALL PFNGLPROGRAMBINARYOESPROC glad_glProgramBinaryOES; +#define glProgramBinaryOES glad_glProgramBinaryOES +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC glad_glProgramUniformHandleui64IMG; +#define glProgramUniformHandleui64IMG glad_glProgramUniformHandleui64IMG +GLAD_API_CALL PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC glad_glProgramUniformHandleui64vIMG; +#define glProgramUniformHandleui64vIMG glad_glProgramUniformHandleui64vIMG +GLAD_API_CALL PFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR; +#define glPushDebugGroupKHR glad_glPushDebugGroupKHR +GLAD_API_CALL PFNGLQUERYCOUNTEREXTPROC glad_glQueryCounterEXT; +#define glQueryCounterEXT glad_glQueryCounterEXT +GLAD_API_CALL PFNGLREADBUFFERINDEXEDEXTPROC glad_glReadBufferIndexedEXT; +#define glReadBufferIndexedEXT glad_glReadBufferIndexedEXT +GLAD_API_CALL PFNGLREADBUFFERNVPROC glad_glReadBufferNV; +#define glReadBufferNV glad_glReadBufferNV +GLAD_API_CALL PFNGLREADNPIXELSEXTPROC glad_glReadnPixelsEXT; +#define glReadnPixelsEXT glad_glReadnPixelsEXT +GLAD_API_CALL PFNGLREADNPIXELSKHRPROC glad_glReadnPixelsKHR; +#define glReadnPixelsKHR glad_glReadnPixelsKHR +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC glad_glRenderbufferStorageMultisampleANGLE; +#define glRenderbufferStorageMultisampleANGLE glad_glRenderbufferStorageMultisampleANGLE +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC glad_glRenderbufferStorageMultisampleAPPLE; +#define glRenderbufferStorageMultisampleAPPLE glad_glRenderbufferStorageMultisampleAPPLE +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC glad_glRenderbufferStorageMultisampleIMG; +#define glRenderbufferStorageMultisampleIMG glad_glRenderbufferStorageMultisampleIMG +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC glad_glRenderbufferStorageMultisampleNV; +#define glRenderbufferStorageMultisampleNV glad_glRenderbufferStorageMultisampleNV +GLAD_API_CALL PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC glad_glResolveMultisampleFramebufferAPPLE; +#define glResolveMultisampleFramebufferAPPLE glad_glResolveMultisampleFramebufferAPPLE +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVEXTPROC glad_glSamplerParameterIivEXT; +#define glSamplerParameterIivEXT glad_glSamplerParameterIivEXT +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVOESPROC glad_glSamplerParameterIivOES; +#define glSamplerParameterIivOES glad_glSamplerParameterIivOES +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVEXTPROC glad_glSamplerParameterIuivEXT; +#define glSamplerParameterIuivEXT glad_glSamplerParameterIuivEXT +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVOESPROC glad_glSamplerParameterIuivOES; +#define glSamplerParameterIuivOES glad_glSamplerParameterIuivOES +GLAD_API_CALL PFNGLSCISSORARRAYVNVPROC glad_glScissorArrayvNV; +#define glScissorArrayvNV glad_glScissorArrayvNV +GLAD_API_CALL PFNGLSCISSORARRAYVOESPROC glad_glScissorArrayvOES; +#define glScissorArrayvOES glad_glScissorArrayvOES +GLAD_API_CALL PFNGLSCISSORINDEXEDNVPROC glad_glScissorIndexedNV; +#define glScissorIndexedNV glad_glScissorIndexedNV +GLAD_API_CALL PFNGLSCISSORINDEXEDOESPROC glad_glScissorIndexedOES; +#define glScissorIndexedOES glad_glScissorIndexedOES +GLAD_API_CALL PFNGLSCISSORINDEXEDVNVPROC glad_glScissorIndexedvNV; +#define glScissorIndexedvNV glad_glScissorIndexedvNV +GLAD_API_CALL PFNGLSCISSORINDEXEDVOESPROC glad_glScissorIndexedvOES; +#define glScissorIndexedvOES glad_glScissorIndexedvOES +GLAD_API_CALL PFNGLSHADINGRATECOMBINEROPSEXTPROC glad_glShadingRateCombinerOpsEXT; +#define glShadingRateCombinerOpsEXT glad_glShadingRateCombinerOpsEXT +GLAD_API_CALL PFNGLSHADINGRATEEXTPROC glad_glShadingRateEXT; +#define glShadingRateEXT glad_glShadingRateEXT +GLAD_API_CALL PFNGLSHADINGRATEQCOMPROC glad_glShadingRateQCOM; +#define glShadingRateQCOM glad_glShadingRateQCOM +GLAD_API_CALL PFNGLSTARTTILINGQCOMPROC glad_glStartTilingQCOM; +#define glStartTilingQCOM glad_glStartTilingQCOM +GLAD_API_CALL PFNGLTEXBUFFEROESPROC glad_glTexBufferOES; +#define glTexBufferOES glad_glTexBufferOES +GLAD_API_CALL PFNGLTEXBUFFERRANGEEXTPROC glad_glTexBufferRangeEXT; +#define glTexBufferRangeEXT glad_glTexBufferRangeEXT +GLAD_API_CALL PFNGLTEXBUFFERRANGEOESPROC glad_glTexBufferRangeOES; +#define glTexBufferRangeOES glad_glTexBufferRangeOES +GLAD_API_CALL PFNGLTEXESTIMATEMOTIONQCOMPROC glad_glTexEstimateMotionQCOM; +#define glTexEstimateMotionQCOM glad_glTexEstimateMotionQCOM +GLAD_API_CALL PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC glad_glTexEstimateMotionRegionsQCOM; +#define glTexEstimateMotionRegionsQCOM glad_glTexEstimateMotionRegionsQCOM +GLAD_API_CALL PFNGLTEXIMAGE3DOESPROC glad_glTexImage3DOES; +#define glTexImage3DOES glad_glTexImage3DOES +GLAD_API_CALL PFNGLTEXPAGECOMMITMENTEXTPROC glad_glTexPageCommitmentEXT; +#define glTexPageCommitmentEXT glad_glTexPageCommitmentEXT +GLAD_API_CALL PFNGLTEXPARAMETERIIVOESPROC glad_glTexParameterIivOES; +#define glTexParameterIivOES glad_glTexParameterIivOES +GLAD_API_CALL PFNGLTEXPARAMETERIUIVOESPROC glad_glTexParameterIuivOES; +#define glTexParameterIuivOES glad_glTexParameterIuivOES +GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC glad_glTexStorage3DMultisampleOES; +#define glTexStorage3DMultisampleOES glad_glTexStorage3DMultisampleOES +GLAD_API_CALL PFNGLTEXSTORAGEATTRIBS2DEXTPROC glad_glTexStorageAttribs2DEXT; +#define glTexStorageAttribs2DEXT glad_glTexStorageAttribs2DEXT +GLAD_API_CALL PFNGLTEXSTORAGEATTRIBS3DEXTPROC glad_glTexStorageAttribs3DEXT; +#define glTexStorageAttribs3DEXT glad_glTexStorageAttribs3DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE3DOESPROC glad_glTexSubImage3DOES; +#define glTexSubImage3DOES glad_glTexSubImage3DOES +GLAD_API_CALL PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC glad_glTextureFoveationParametersQCOM; +#define glTextureFoveationParametersQCOM glad_glTextureFoveationParametersQCOM +GLAD_API_CALL PFNGLTEXTUREVIEWEXTPROC glad_glTextureViewEXT; +#define glTextureViewEXT glad_glTextureViewEXT +GLAD_API_CALL PFNGLTEXTUREVIEWOESPROC glad_glTextureViewOES; +#define glTextureViewOES glad_glTextureViewOES +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64IMGPROC glad_glUniformHandleui64IMG; +#define glUniformHandleui64IMG glad_glUniformHandleui64IMG +GLAD_API_CALL PFNGLUNIFORMHANDLEUI64VIMGPROC glad_glUniformHandleui64vIMG; +#define glUniformHandleui64vIMG glad_glUniformHandleui64vIMG +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVNVPROC glad_glUniformMatrix2x3fvNV; +#define glUniformMatrix2x3fvNV glad_glUniformMatrix2x3fvNV +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVNVPROC glad_glUniformMatrix2x4fvNV; +#define glUniformMatrix2x4fvNV glad_glUniformMatrix2x4fvNV +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVNVPROC glad_glUniformMatrix3x2fvNV; +#define glUniformMatrix3x2fvNV glad_glUniformMatrix3x2fvNV +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVNVPROC glad_glUniformMatrix3x4fvNV; +#define glUniformMatrix3x4fvNV glad_glUniformMatrix3x4fvNV +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVNVPROC glad_glUniformMatrix4x2fvNV; +#define glUniformMatrix4x2fvNV glad_glUniformMatrix4x2fvNV +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVNVPROC glad_glUniformMatrix4x3fvNV; +#define glUniformMatrix4x3fvNV glad_glUniformMatrix4x3fvNV +GLAD_API_CALL PFNGLUNMAPBUFFEROESPROC glad_glUnmapBufferOES; +#define glUnmapBufferOES glad_glUnmapBufferOES +GLAD_API_CALL PFNGLUSEPROGRAMSTAGESEXTPROC glad_glUseProgramStagesEXT; +#define glUseProgramStagesEXT glad_glUseProgramStagesEXT +GLAD_API_CALL PFNGLVALIDATEPROGRAMPIPELINEEXTPROC glad_glValidateProgramPipelineEXT; +#define glValidateProgramPipelineEXT glad_glValidateProgramPipelineEXT +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORANGLEPROC glad_glVertexAttribDivisorANGLE; +#define glVertexAttribDivisorANGLE glad_glVertexAttribDivisorANGLE +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISOREXTPROC glad_glVertexAttribDivisorEXT; +#define glVertexAttribDivisorEXT glad_glVertexAttribDivisorEXT +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORNVPROC glad_glVertexAttribDivisorNV; +#define glVertexAttribDivisorNV glad_glVertexAttribDivisorNV +GLAD_API_CALL PFNGLVIEWPORTARRAYVNVPROC glad_glViewportArrayvNV; +#define glViewportArrayvNV glad_glViewportArrayvNV +GLAD_API_CALL PFNGLVIEWPORTARRAYVOESPROC glad_glViewportArrayvOES; +#define glViewportArrayvOES glad_glViewportArrayvOES +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFNVPROC glad_glViewportIndexedfNV; +#define glViewportIndexedfNV glad_glViewportIndexedfNV +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFOESPROC glad_glViewportIndexedfOES; +#define glViewportIndexedfOES glad_glViewportIndexedfOES +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVNVPROC glad_glViewportIndexedfvNV; +#define glViewportIndexedfvNV glad_glViewportIndexedfvNV +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVOESPROC glad_glViewportIndexedfvOES; +#define glViewportIndexedfvOES glad_glViewportIndexedfvOES +GLAD_API_CALL PFNGLWAITSYNCAPPLEPROC glad_glWaitSyncAPPLE; +#define glWaitSyncAPPLE glad_glWaitSyncAPPLE + + + + + +GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGL( GLADloadfunc load); + +GLAD_API_CALL int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGLES2( GLADloadfunc load); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/deps/glad/src/egl.c b/core/deps/glad/src/egl.c new file mode 100644 index 000000000..3565a0d2f --- /dev/null +++ b/core/deps/glad/src/egl.c @@ -0,0 +1,397 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ +#include +#include +#include +#include + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_EGL_VERSION_1_0 = 0; +int GLAD_EGL_VERSION_1_1 = 0; +int GLAD_EGL_VERSION_1_2 = 0; +int GLAD_EGL_VERSION_1_3 = 0; +int GLAD_EGL_VERSION_1_4 = 0; +int GLAD_EGL_VERSION_1_5 = 0; + + + +PFNEGLBINDAPIPROC glad_eglBindAPI = NULL; +PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage = NULL; +PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig = NULL; +PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync = NULL; +PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers = NULL; +PFNEGLCREATECONTEXTPROC glad_eglCreateContext = NULL; +PFNEGLCREATEIMAGEPROC glad_eglCreateImage = NULL; +PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer = NULL; +PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface = NULL; +PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface = NULL; +PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface = NULL; +PFNEGLCREATESYNCPROC glad_eglCreateSync = NULL; +PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface = NULL; +PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext = NULL; +PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage = NULL; +PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface = NULL; +PFNEGLDESTROYSYNCPROC glad_eglDestroySync = NULL; +PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib = NULL; +PFNEGLGETCONFIGSPROC glad_eglGetConfigs = NULL; +PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext = NULL; +PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay = NULL; +PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface = NULL; +PFNEGLGETDISPLAYPROC glad_eglGetDisplay = NULL; +PFNEGLGETERRORPROC glad_eglGetError = NULL; +PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay = NULL; +PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress = NULL; +PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib = NULL; +PFNEGLINITIALIZEPROC glad_eglInitialize = NULL; +PFNEGLMAKECURRENTPROC glad_eglMakeCurrent = NULL; +PFNEGLQUERYAPIPROC glad_eglQueryAPI = NULL; +PFNEGLQUERYCONTEXTPROC glad_eglQueryContext = NULL; +PFNEGLQUERYSTRINGPROC glad_eglQueryString = NULL; +PFNEGLQUERYSURFACEPROC glad_eglQuerySurface = NULL; +PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage = NULL; +PFNEGLRELEASETHREADPROC glad_eglReleaseThread = NULL; +PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib = NULL; +PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers = NULL; +PFNEGLSWAPINTERVALPROC glad_eglSwapInterval = NULL; +PFNEGLTERMINATEPROC glad_eglTerminate = NULL; +PFNEGLWAITCLIENTPROC glad_eglWaitClient = NULL; +PFNEGLWAITGLPROC glad_eglWaitGL = NULL; +PFNEGLWAITNATIVEPROC glad_eglWaitNative = NULL; +PFNEGLWAITSYNCPROC glad_eglWaitSync = NULL; + + +static void glad_egl_load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_0) return; + glad_eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load(userptr, "eglChooseConfig"); + glad_eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load(userptr, "eglCopyBuffers"); + glad_eglCreateContext = (PFNEGLCREATECONTEXTPROC) load(userptr, "eglCreateContext"); + glad_eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load(userptr, "eglCreatePbufferSurface"); + glad_eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load(userptr, "eglCreatePixmapSurface"); + glad_eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load(userptr, "eglCreateWindowSurface"); + glad_eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load(userptr, "eglDestroyContext"); + glad_eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load(userptr, "eglDestroySurface"); + glad_eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load(userptr, "eglGetConfigAttrib"); + glad_eglGetConfigs = (PFNEGLGETCONFIGSPROC) load(userptr, "eglGetConfigs"); + glad_eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + glad_eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load(userptr, "eglGetCurrentSurface"); + glad_eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + glad_eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + glad_eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load(userptr, "eglGetProcAddress"); + glad_eglInitialize = (PFNEGLINITIALIZEPROC) load(userptr, "eglInitialize"); + glad_eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load(userptr, "eglMakeCurrent"); + glad_eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load(userptr, "eglQueryContext"); + glad_eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + glad_eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load(userptr, "eglQuerySurface"); + glad_eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load(userptr, "eglSwapBuffers"); + glad_eglTerminate = (PFNEGLTERMINATEPROC) load(userptr, "eglTerminate"); + glad_eglWaitGL = (PFNEGLWAITGLPROC) load(userptr, "eglWaitGL"); + glad_eglWaitNative = (PFNEGLWAITNATIVEPROC) load(userptr, "eglWaitNative"); +} +static void glad_egl_load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_1) return; + glad_eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load(userptr, "eglBindTexImage"); + glad_eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load(userptr, "eglReleaseTexImage"); + glad_eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load(userptr, "eglSurfaceAttrib"); + glad_eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load(userptr, "eglSwapInterval"); +} +static void glad_egl_load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_2) return; + glad_eglBindAPI = (PFNEGLBINDAPIPROC) load(userptr, "eglBindAPI"); + glad_eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load(userptr, "eglCreatePbufferFromClientBuffer"); + glad_eglQueryAPI = (PFNEGLQUERYAPIPROC) load(userptr, "eglQueryAPI"); + glad_eglReleaseThread = (PFNEGLRELEASETHREADPROC) load(userptr, "eglReleaseThread"); + glad_eglWaitClient = (PFNEGLWAITCLIENTPROC) load(userptr, "eglWaitClient"); +} +static void glad_egl_load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_4) return; + glad_eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load(userptr, "eglGetCurrentContext"); +} +static void glad_egl_load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_5) return; + glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync"); + glad_eglCreateImage = (PFNEGLCREATEIMAGEPROC) load(userptr, "eglCreateImage"); + glad_eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load(userptr, "eglCreatePlatformPixmapSurface"); + glad_eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load(userptr, "eglCreatePlatformWindowSurface"); + glad_eglCreateSync = (PFNEGLCREATESYNCPROC) load(userptr, "eglCreateSync"); + glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage"); + glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync"); + glad_eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load(userptr, "eglGetPlatformDisplay"); + glad_eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load(userptr, "eglGetSyncAttrib"); + glad_eglWaitSync = (PFNEGLWAITSYNCPROC) load(userptr, "eglWaitSync"); +} + + + +static int glad_egl_get_extensions(EGLDisplay display, const char **extensions) { + *extensions = eglQueryString(display, EGL_EXTENSIONS); + + return extensions != NULL; +} + +static int glad_egl_has_extension(const char *extensions, const char *ext) { + const char *loc; + const char *terminator; + if(extensions == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } +} + +static GLADapiproc glad_egl_get_proc_from_userptr(void *userptr, const char *name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_egl_find_extensions_egl(EGLDisplay display) { + const char *extensions; + if (!glad_egl_get_extensions(display, &extensions)) return 0; + + GLAD_UNUSED(glad_egl_has_extension); + + return 1; +} + +static int glad_egl_find_core_egl(EGLDisplay display) { + int major, minor; + const char *version; + + if (display == NULL) { + display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */ + } + if (display == EGL_NO_DISPLAY) { + display = eglGetCurrentDisplay(); + } +#ifdef EGL_VERSION_1_4 + if (display == EGL_NO_DISPLAY) { + display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + } +#endif +#ifndef EGL_VERSION_1_5 + if (display == EGL_NO_DISPLAY) { + return 0; + } +#endif + + version = eglQueryString(display, EGL_VERSION); + (void) eglGetError(); + + if (version == NULL) { + major = 1; + minor = 0; + } else { + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + } + + GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) { + int version; + eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0; + + version = glad_egl_find_core_egl(display); + if (!version) return 0; + glad_egl_load_EGL_VERSION_1_0(load, userptr); + glad_egl_load_EGL_VERSION_1_1(load, userptr); + glad_egl_load_EGL_VERSION_1_2(load, userptr); + glad_egl_load_EGL_VERSION_1_4(load, userptr); + glad_egl_load_EGL_VERSION_1_5(load, userptr); + + if (!glad_egl_find_extensions_egl(display)) return 0; + + + return version; +} + +int gladLoadEGL(EGLDisplay display, GLADloadfunc load) { + return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + +#ifdef GLAD_EGL + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include +#include + +#if GLAD_PLATFORM_WIN32 +#include +#else +#include +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { + void *handle = NULL; + int i; + + for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 + #if GLAD_PLATFORM_UWP + size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); + LPWSTR buffer = (LPWSTR) malloc(buffer_size); + if (buffer != NULL) { + int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); + if (ret != 0) { + handle = (void*) LoadPackagedLibrary(buffer, 0); + } + free((void*) buffer); + } + #else + handle = (void*) LoadLibraryA(lib_names[i]); + #endif +#else + handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif + if (handle != NULL) { + return handle; + } + } + + return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { + if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 + FreeLibrary((HMODULE) handle); +#else + dlclose(handle); +#endif + } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { + if (handle == NULL) { + return NULL; + } + +#if GLAD_PLATFORM_WIN32 + return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else + return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + +struct _glad_egl_userptr { + void *handle; + PFNEGLGETPROCADDRESSPROC get_proc_address_ptr; +}; + +static GLADapiproc glad_egl_get_proc(void *vuserptr, const char* name) { + struct _glad_egl_userptr userptr = *(struct _glad_egl_userptr*) vuserptr; + GLADapiproc result = NULL; + + result = glad_dlsym_handle(userptr.handle, name); + if (result == NULL) { + result = GLAD_GNUC_EXTENSION (GLADapiproc) userptr.get_proc_address_ptr(name); + } + + return result; +} + +static void* _egl_handle = NULL; + +static void* glad_egl_dlopen_handle(void) { +#if GLAD_PLATFORM_APPLE + static const char *NAMES[] = {"libEGL.dylib"}; +#elif GLAD_PLATFORM_WIN32 + static const char *NAMES[] = {"libEGL.dll", "EGL.dll"}; +#else + static const char *NAMES[] = {"libEGL.so.1", "libEGL.so"}; +#endif + + if (_egl_handle == NULL) { + _egl_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); + } + + return _egl_handle; +} + +static struct _glad_egl_userptr glad_egl_build_userptr(void *handle) { + struct _glad_egl_userptr userptr; + userptr.handle = handle; + userptr.get_proc_address_ptr = (PFNEGLGETPROCADDRESSPROC) glad_dlsym_handle(handle, "eglGetProcAddress"); + return userptr; +} + +int gladLoaderLoadEGL(EGLDisplay display) { + int version = 0; + void *handle = NULL; + int did_load = 0; + struct _glad_egl_userptr userptr; + + did_load = _egl_handle == NULL; + handle = glad_egl_dlopen_handle(); + if (handle != NULL) { + userptr = glad_egl_build_userptr(handle); + + if (userptr.get_proc_address_ptr != NULL) { + version = gladLoadEGLUserPtr(display, glad_egl_get_proc, &userptr); + } + + if (!version && did_load) { + gladLoaderUnloadEGL(); + } + } + + return version; +} + + +void gladLoaderUnloadEGL() { + if (_egl_handle != NULL) { + glad_close_dlopen_handle(_egl_handle); + _egl_handle = NULL; + } +} + +#endif /* GLAD_EGL */ + +#ifdef __cplusplus +} +#endif diff --git a/core/deps/glad/src/gl.c b/core/deps/glad/src/gl.c new file mode 100644 index 000000000..57f5eff87 --- /dev/null +++ b/core/deps/glad/src/gl.c @@ -0,0 +1,11173 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ +#include +#include +#include +#include + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_GL_VERSION_1_0 = 0; +int GLAD_GL_VERSION_1_1 = 0; +int GLAD_GL_VERSION_1_2 = 0; +int GLAD_GL_VERSION_1_3 = 0; +int GLAD_GL_VERSION_1_4 = 0; +int GLAD_GL_VERSION_1_5 = 0; +int GLAD_GL_VERSION_2_0 = 0; +int GLAD_GL_VERSION_2_1 = 0; +int GLAD_GL_VERSION_3_0 = 0; +int GLAD_GL_VERSION_3_1 = 0; +int GLAD_GL_VERSION_3_2 = 0; +int GLAD_GL_VERSION_3_3 = 0; +int GLAD_GL_VERSION_4_0 = 0; +int GLAD_GL_VERSION_4_1 = 0; +int GLAD_GL_VERSION_4_2 = 0; +int GLAD_GL_VERSION_4_3 = 0; +int GLAD_GL_VERSION_4_4 = 0; +int GLAD_GL_VERSION_4_5 = 0; +int GLAD_GL_VERSION_4_6 = 0; +int GLAD_GL_ES_VERSION_2_0 = 0; +int GLAD_GL_ES_VERSION_3_0 = 0; +int GLAD_GL_ES_VERSION_3_1 = 0; +int GLAD_GL_ES_VERSION_3_2 = 0; +int GLAD_GL_3DFX_multisample = 0; +int GLAD_GL_3DFX_tbuffer = 0; +int GLAD_GL_3DFX_texture_compression_FXT1 = 0; +int GLAD_GL_AMD_blend_minmax_factor = 0; +int GLAD_GL_AMD_conservative_depth = 0; +int GLAD_GL_AMD_debug_output = 0; +int GLAD_GL_AMD_depth_clamp_separate = 0; +int GLAD_GL_AMD_draw_buffers_blend = 0; +int GLAD_GL_AMD_framebuffer_multisample_advanced = 0; +int GLAD_GL_AMD_framebuffer_sample_positions = 0; +int GLAD_GL_AMD_gcn_shader = 0; +int GLAD_GL_AMD_gpu_shader_half_float = 0; +int GLAD_GL_AMD_gpu_shader_int16 = 0; +int GLAD_GL_AMD_gpu_shader_int64 = 0; +int GLAD_GL_AMD_interleaved_elements = 0; +int GLAD_GL_AMD_multi_draw_indirect = 0; +int GLAD_GL_AMD_name_gen_delete = 0; +int GLAD_GL_AMD_occlusion_query_event = 0; +int GLAD_GL_AMD_performance_monitor = 0; +int GLAD_GL_AMD_pinned_memory = 0; +int GLAD_GL_AMD_query_buffer_object = 0; +int GLAD_GL_AMD_sample_positions = 0; +int GLAD_GL_AMD_seamless_cubemap_per_texture = 0; +int GLAD_GL_AMD_shader_atomic_counter_ops = 0; +int GLAD_GL_AMD_shader_ballot = 0; +int GLAD_GL_AMD_shader_explicit_vertex_parameter = 0; +int GLAD_GL_AMD_shader_gpu_shader_half_float_fetch = 0; +int GLAD_GL_AMD_shader_image_load_store_lod = 0; +int GLAD_GL_AMD_shader_stencil_export = 0; +int GLAD_GL_AMD_shader_trinary_minmax = 0; +int GLAD_GL_AMD_sparse_texture = 0; +int GLAD_GL_AMD_stencil_operation_extended = 0; +int GLAD_GL_AMD_texture_gather_bias_lod = 0; +int GLAD_GL_AMD_texture_texture4 = 0; +int GLAD_GL_AMD_transform_feedback3_lines_triangles = 0; +int GLAD_GL_AMD_transform_feedback4 = 0; +int GLAD_GL_AMD_vertex_shader_layer = 0; +int GLAD_GL_AMD_vertex_shader_tessellator = 0; +int GLAD_GL_AMD_vertex_shader_viewport_index = 0; +int GLAD_GL_APPLE_aux_depth_stencil = 0; +int GLAD_GL_APPLE_client_storage = 0; +int GLAD_GL_APPLE_element_array = 0; +int GLAD_GL_APPLE_fence = 0; +int GLAD_GL_APPLE_float_pixels = 0; +int GLAD_GL_APPLE_flush_buffer_range = 0; +int GLAD_GL_APPLE_object_purgeable = 0; +int GLAD_GL_APPLE_rgb_422 = 0; +int GLAD_GL_APPLE_row_bytes = 0; +int GLAD_GL_APPLE_specular_vector = 0; +int GLAD_GL_APPLE_texture_range = 0; +int GLAD_GL_APPLE_transform_hint = 0; +int GLAD_GL_APPLE_vertex_array_object = 0; +int GLAD_GL_APPLE_vertex_array_range = 0; +int GLAD_GL_APPLE_vertex_program_evaluators = 0; +int GLAD_GL_APPLE_ycbcr_422 = 0; +int GLAD_GL_ARB_ES2_compatibility = 0; +int GLAD_GL_ARB_ES3_1_compatibility = 0; +int GLAD_GL_ARB_ES3_2_compatibility = 0; +int GLAD_GL_ARB_ES3_compatibility = 0; +int GLAD_GL_ARB_arrays_of_arrays = 0; +int GLAD_GL_ARB_base_instance = 0; +int GLAD_GL_ARB_bindless_texture = 0; +int GLAD_GL_ARB_blend_func_extended = 0; +int GLAD_GL_ARB_buffer_storage = 0; +int GLAD_GL_ARB_cl_event = 0; +int GLAD_GL_ARB_clear_buffer_object = 0; +int GLAD_GL_ARB_clear_texture = 0; +int GLAD_GL_ARB_clip_control = 0; +int GLAD_GL_ARB_color_buffer_float = 0; +int GLAD_GL_ARB_compatibility = 0; +int GLAD_GL_ARB_compressed_texture_pixel_storage = 0; +int GLAD_GL_ARB_compute_shader = 0; +int GLAD_GL_ARB_compute_variable_group_size = 0; +int GLAD_GL_ARB_conditional_render_inverted = 0; +int GLAD_GL_ARB_conservative_depth = 0; +int GLAD_GL_ARB_copy_buffer = 0; +int GLAD_GL_ARB_copy_image = 0; +int GLAD_GL_ARB_cull_distance = 0; +int GLAD_GL_ARB_debug_output = 0; +int GLAD_GL_ARB_depth_buffer_float = 0; +int GLAD_GL_ARB_depth_clamp = 0; +int GLAD_GL_ARB_depth_texture = 0; +int GLAD_GL_ARB_derivative_control = 0; +int GLAD_GL_ARB_direct_state_access = 0; +int GLAD_GL_ARB_draw_buffers = 0; +int GLAD_GL_ARB_draw_buffers_blend = 0; +int GLAD_GL_ARB_draw_elements_base_vertex = 0; +int GLAD_GL_ARB_draw_indirect = 0; +int GLAD_GL_ARB_draw_instanced = 0; +int GLAD_GL_ARB_enhanced_layouts = 0; +int GLAD_GL_ARB_explicit_attrib_location = 0; +int GLAD_GL_ARB_explicit_uniform_location = 0; +int GLAD_GL_ARB_fragment_coord_conventions = 0; +int GLAD_GL_ARB_fragment_layer_viewport = 0; +int GLAD_GL_ARB_fragment_program = 0; +int GLAD_GL_ARB_fragment_program_shadow = 0; +int GLAD_GL_ARB_fragment_shader = 0; +int GLAD_GL_ARB_fragment_shader_interlock = 0; +int GLAD_GL_ARB_framebuffer_no_attachments = 0; +int GLAD_GL_ARB_framebuffer_object = 0; +int GLAD_GL_ARB_framebuffer_sRGB = 0; +int GLAD_GL_ARB_geometry_shader4 = 0; +int GLAD_GL_ARB_get_program_binary = 0; +int GLAD_GL_ARB_get_texture_sub_image = 0; +int GLAD_GL_ARB_gl_spirv = 0; +int GLAD_GL_ARB_gpu_shader5 = 0; +int GLAD_GL_ARB_gpu_shader_fp64 = 0; +int GLAD_GL_ARB_gpu_shader_int64 = 0; +int GLAD_GL_ARB_half_float_pixel = 0; +int GLAD_GL_ARB_half_float_vertex = 0; +int GLAD_GL_ARB_imaging = 0; +int GLAD_GL_ARB_indirect_parameters = 0; +int GLAD_GL_ARB_instanced_arrays = 0; +int GLAD_GL_ARB_internalformat_query = 0; +int GLAD_GL_ARB_internalformat_query2 = 0; +int GLAD_GL_ARB_invalidate_subdata = 0; +int GLAD_GL_ARB_map_buffer_alignment = 0; +int GLAD_GL_ARB_map_buffer_range = 0; +int GLAD_GL_ARB_matrix_palette = 0; +int GLAD_GL_ARB_multi_bind = 0; +int GLAD_GL_ARB_multi_draw_indirect = 0; +int GLAD_GL_ARB_multisample = 0; +int GLAD_GL_ARB_multitexture = 0; +int GLAD_GL_ARB_occlusion_query = 0; +int GLAD_GL_ARB_occlusion_query2 = 0; +int GLAD_GL_ARB_parallel_shader_compile = 0; +int GLAD_GL_ARB_pipeline_statistics_query = 0; +int GLAD_GL_ARB_pixel_buffer_object = 0; +int GLAD_GL_ARB_point_parameters = 0; +int GLAD_GL_ARB_point_sprite = 0; +int GLAD_GL_ARB_polygon_offset_clamp = 0; +int GLAD_GL_ARB_post_depth_coverage = 0; +int GLAD_GL_ARB_program_interface_query = 0; +int GLAD_GL_ARB_provoking_vertex = 0; +int GLAD_GL_ARB_query_buffer_object = 0; +int GLAD_GL_ARB_robust_buffer_access_behavior = 0; +int GLAD_GL_ARB_robustness = 0; +int GLAD_GL_ARB_robustness_isolation = 0; +int GLAD_GL_ARB_sample_locations = 0; +int GLAD_GL_ARB_sample_shading = 0; +int GLAD_GL_ARB_sampler_objects = 0; +int GLAD_GL_ARB_seamless_cube_map = 0; +int GLAD_GL_ARB_seamless_cubemap_per_texture = 0; +int GLAD_GL_ARB_separate_shader_objects = 0; +int GLAD_GL_ARB_shader_atomic_counter_ops = 0; +int GLAD_GL_ARB_shader_atomic_counters = 0; +int GLAD_GL_ARB_shader_ballot = 0; +int GLAD_GL_ARB_shader_bit_encoding = 0; +int GLAD_GL_ARB_shader_clock = 0; +int GLAD_GL_ARB_shader_draw_parameters = 0; +int GLAD_GL_ARB_shader_group_vote = 0; +int GLAD_GL_ARB_shader_image_load_store = 0; +int GLAD_GL_ARB_shader_image_size = 0; +int GLAD_GL_ARB_shader_objects = 0; +int GLAD_GL_ARB_shader_precision = 0; +int GLAD_GL_ARB_shader_stencil_export = 0; +int GLAD_GL_ARB_shader_storage_buffer_object = 0; +int GLAD_GL_ARB_shader_subroutine = 0; +int GLAD_GL_ARB_shader_texture_image_samples = 0; +int GLAD_GL_ARB_shader_texture_lod = 0; +int GLAD_GL_ARB_shader_viewport_layer_array = 0; +int GLAD_GL_ARB_shading_language_100 = 0; +int GLAD_GL_ARB_shading_language_420pack = 0; +int GLAD_GL_ARB_shading_language_include = 0; +int GLAD_GL_ARB_shading_language_packing = 0; +int GLAD_GL_ARB_shadow = 0; +int GLAD_GL_ARB_shadow_ambient = 0; +int GLAD_GL_ARB_sparse_buffer = 0; +int GLAD_GL_ARB_sparse_texture = 0; +int GLAD_GL_ARB_sparse_texture2 = 0; +int GLAD_GL_ARB_sparse_texture_clamp = 0; +int GLAD_GL_ARB_spirv_extensions = 0; +int GLAD_GL_ARB_stencil_texturing = 0; +int GLAD_GL_ARB_sync = 0; +int GLAD_GL_ARB_tessellation_shader = 0; +int GLAD_GL_ARB_texture_barrier = 0; +int GLAD_GL_ARB_texture_border_clamp = 0; +int GLAD_GL_ARB_texture_buffer_object = 0; +int GLAD_GL_ARB_texture_buffer_object_rgb32 = 0; +int GLAD_GL_ARB_texture_buffer_range = 0; +int GLAD_GL_ARB_texture_compression = 0; +int GLAD_GL_ARB_texture_compression_bptc = 0; +int GLAD_GL_ARB_texture_compression_rgtc = 0; +int GLAD_GL_ARB_texture_cube_map = 0; +int GLAD_GL_ARB_texture_cube_map_array = 0; +int GLAD_GL_ARB_texture_env_add = 0; +int GLAD_GL_ARB_texture_env_combine = 0; +int GLAD_GL_ARB_texture_env_crossbar = 0; +int GLAD_GL_ARB_texture_env_dot3 = 0; +int GLAD_GL_ARB_texture_filter_anisotropic = 0; +int GLAD_GL_ARB_texture_filter_minmax = 0; +int GLAD_GL_ARB_texture_float = 0; +int GLAD_GL_ARB_texture_gather = 0; +int GLAD_GL_ARB_texture_mirror_clamp_to_edge = 0; +int GLAD_GL_ARB_texture_mirrored_repeat = 0; +int GLAD_GL_ARB_texture_multisample = 0; +int GLAD_GL_ARB_texture_non_power_of_two = 0; +int GLAD_GL_ARB_texture_query_levels = 0; +int GLAD_GL_ARB_texture_query_lod = 0; +int GLAD_GL_ARB_texture_rectangle = 0; +int GLAD_GL_ARB_texture_rg = 0; +int GLAD_GL_ARB_texture_rgb10_a2ui = 0; +int GLAD_GL_ARB_texture_stencil8 = 0; +int GLAD_GL_ARB_texture_storage = 0; +int GLAD_GL_ARB_texture_storage_multisample = 0; +int GLAD_GL_ARB_texture_swizzle = 0; +int GLAD_GL_ARB_texture_view = 0; +int GLAD_GL_ARB_timer_query = 0; +int GLAD_GL_ARB_transform_feedback2 = 0; +int GLAD_GL_ARB_transform_feedback3 = 0; +int GLAD_GL_ARB_transform_feedback_instanced = 0; +int GLAD_GL_ARB_transform_feedback_overflow_query = 0; +int GLAD_GL_ARB_transpose_matrix = 0; +int GLAD_GL_ARB_uniform_buffer_object = 0; +int GLAD_GL_ARB_vertex_array_bgra = 0; +int GLAD_GL_ARB_vertex_array_object = 0; +int GLAD_GL_ARB_vertex_attrib_64bit = 0; +int GLAD_GL_ARB_vertex_attrib_binding = 0; +int GLAD_GL_ARB_vertex_blend = 0; +int GLAD_GL_ARB_vertex_buffer_object = 0; +int GLAD_GL_ARB_vertex_program = 0; +int GLAD_GL_ARB_vertex_shader = 0; +int GLAD_GL_ARB_vertex_type_10f_11f_11f_rev = 0; +int GLAD_GL_ARB_vertex_type_2_10_10_10_rev = 0; +int GLAD_GL_ARB_viewport_array = 0; +int GLAD_GL_ARB_window_pos = 0; +int GLAD_GL_ATI_draw_buffers = 0; +int GLAD_GL_ATI_element_array = 0; +int GLAD_GL_ATI_envmap_bumpmap = 0; +int GLAD_GL_ATI_fragment_shader = 0; +int GLAD_GL_ATI_map_object_buffer = 0; +int GLAD_GL_ATI_meminfo = 0; +int GLAD_GL_ATI_pixel_format_float = 0; +int GLAD_GL_ATI_pn_triangles = 0; +int GLAD_GL_ATI_separate_stencil = 0; +int GLAD_GL_ATI_text_fragment_shader = 0; +int GLAD_GL_ATI_texture_env_combine3 = 0; +int GLAD_GL_ATI_texture_float = 0; +int GLAD_GL_ATI_texture_mirror_once = 0; +int GLAD_GL_ATI_vertex_array_object = 0; +int GLAD_GL_ATI_vertex_attrib_array_object = 0; +int GLAD_GL_ATI_vertex_streams = 0; +int GLAD_GL_EXT_422_pixels = 0; +int GLAD_GL_EXT_EGL_image_storage = 0; +int GLAD_GL_EXT_EGL_sync = 0; +int GLAD_GL_EXT_abgr = 0; +int GLAD_GL_EXT_bgra = 0; +int GLAD_GL_EXT_bindable_uniform = 0; +int GLAD_GL_EXT_blend_color = 0; +int GLAD_GL_EXT_blend_equation_separate = 0; +int GLAD_GL_EXT_blend_func_separate = 0; +int GLAD_GL_EXT_blend_logic_op = 0; +int GLAD_GL_EXT_blend_minmax = 0; +int GLAD_GL_EXT_blend_subtract = 0; +int GLAD_GL_EXT_clip_volume_hint = 0; +int GLAD_GL_EXT_cmyka = 0; +int GLAD_GL_EXT_color_subtable = 0; +int GLAD_GL_EXT_compiled_vertex_array = 0; +int GLAD_GL_EXT_convolution = 0; +int GLAD_GL_EXT_coordinate_frame = 0; +int GLAD_GL_EXT_copy_texture = 0; +int GLAD_GL_EXT_cull_vertex = 0; +int GLAD_GL_EXT_debug_label = 0; +int GLAD_GL_EXT_debug_marker = 0; +int GLAD_GL_EXT_depth_bounds_test = 0; +int GLAD_GL_EXT_direct_state_access = 0; +int GLAD_GL_EXT_draw_buffers2 = 0; +int GLAD_GL_EXT_draw_instanced = 0; +int GLAD_GL_EXT_draw_range_elements = 0; +int GLAD_GL_EXT_external_buffer = 0; +int GLAD_GL_EXT_fog_coord = 0; +int GLAD_GL_EXT_framebuffer_blit = 0; +int GLAD_GL_EXT_framebuffer_blit_layers = 0; +int GLAD_GL_EXT_framebuffer_multisample = 0; +int GLAD_GL_EXT_framebuffer_multisample_blit_scaled = 0; +int GLAD_GL_EXT_framebuffer_object = 0; +int GLAD_GL_EXT_framebuffer_sRGB = 0; +int GLAD_GL_EXT_geometry_shader4 = 0; +int GLAD_GL_EXT_gpu_program_parameters = 0; +int GLAD_GL_EXT_gpu_shader4 = 0; +int GLAD_GL_EXT_histogram = 0; +int GLAD_GL_EXT_index_array_formats = 0; +int GLAD_GL_EXT_index_func = 0; +int GLAD_GL_EXT_index_material = 0; +int GLAD_GL_EXT_index_texture = 0; +int GLAD_GL_EXT_light_texture = 0; +int GLAD_GL_EXT_memory_object = 0; +int GLAD_GL_EXT_memory_object_fd = 0; +int GLAD_GL_EXT_memory_object_win32 = 0; +int GLAD_GL_EXT_misc_attribute = 0; +int GLAD_GL_EXT_multi_draw_arrays = 0; +int GLAD_GL_EXT_multisample = 0; +int GLAD_GL_EXT_multiview_tessellation_geometry_shader = 0; +int GLAD_GL_EXT_multiview_texture_multisample = 0; +int GLAD_GL_EXT_multiview_timer_query = 0; +int GLAD_GL_EXT_packed_depth_stencil = 0; +int GLAD_GL_EXT_packed_float = 0; +int GLAD_GL_EXT_packed_pixels = 0; +int GLAD_GL_EXT_paletted_texture = 0; +int GLAD_GL_EXT_pixel_buffer_object = 0; +int GLAD_GL_EXT_pixel_transform = 0; +int GLAD_GL_EXT_pixel_transform_color_table = 0; +int GLAD_GL_EXT_point_parameters = 0; +int GLAD_GL_EXT_polygon_offset = 0; +int GLAD_GL_EXT_polygon_offset_clamp = 0; +int GLAD_GL_EXT_post_depth_coverage = 0; +int GLAD_GL_EXT_provoking_vertex = 0; +int GLAD_GL_EXT_raster_multisample = 0; +int GLAD_GL_EXT_rescale_normal = 0; +int GLAD_GL_EXT_secondary_color = 0; +int GLAD_GL_EXT_semaphore = 0; +int GLAD_GL_EXT_semaphore_fd = 0; +int GLAD_GL_EXT_semaphore_win32 = 0; +int GLAD_GL_EXT_separate_shader_objects = 0; +int GLAD_GL_EXT_separate_specular_color = 0; +int GLAD_GL_EXT_shader_framebuffer_fetch = 0; +int GLAD_GL_EXT_shader_framebuffer_fetch_non_coherent = 0; +int GLAD_GL_EXT_shader_image_load_formatted = 0; +int GLAD_GL_EXT_shader_image_load_store = 0; +int GLAD_GL_EXT_shader_integer_mix = 0; +int GLAD_GL_EXT_shader_samples_identical = 0; +int GLAD_GL_EXT_shadow_funcs = 0; +int GLAD_GL_EXT_shared_texture_palette = 0; +int GLAD_GL_EXT_sparse_texture2 = 0; +int GLAD_GL_EXT_stencil_clear_tag = 0; +int GLAD_GL_EXT_stencil_two_side = 0; +int GLAD_GL_EXT_stencil_wrap = 0; +int GLAD_GL_EXT_subtexture = 0; +int GLAD_GL_EXT_texture = 0; +int GLAD_GL_EXT_texture3D = 0; +int GLAD_GL_EXT_texture_array = 0; +int GLAD_GL_EXT_texture_buffer_object = 0; +int GLAD_GL_EXT_texture_compression_latc = 0; +int GLAD_GL_EXT_texture_compression_rgtc = 0; +int GLAD_GL_EXT_texture_compression_s3tc = 0; +int GLAD_GL_EXT_texture_cube_map = 0; +int GLAD_GL_EXT_texture_env_add = 0; +int GLAD_GL_EXT_texture_env_combine = 0; +int GLAD_GL_EXT_texture_env_dot3 = 0; +int GLAD_GL_EXT_texture_filter_anisotropic = 0; +int GLAD_GL_EXT_texture_filter_minmax = 0; +int GLAD_GL_EXT_texture_integer = 0; +int GLAD_GL_EXT_texture_lod_bias = 0; +int GLAD_GL_EXT_texture_mirror_clamp = 0; +int GLAD_GL_EXT_texture_object = 0; +int GLAD_GL_EXT_texture_perturb_normal = 0; +int GLAD_GL_EXT_texture_sRGB = 0; +int GLAD_GL_EXT_texture_sRGB_R8 = 0; +int GLAD_GL_EXT_texture_sRGB_RG8 = 0; +int GLAD_GL_EXT_texture_sRGB_decode = 0; +int GLAD_GL_EXT_texture_shadow_lod = 0; +int GLAD_GL_EXT_texture_shared_exponent = 0; +int GLAD_GL_EXT_texture_snorm = 0; +int GLAD_GL_EXT_texture_storage = 0; +int GLAD_GL_EXT_texture_swizzle = 0; +int GLAD_GL_EXT_timer_query = 0; +int GLAD_GL_EXT_transform_feedback = 0; +int GLAD_GL_EXT_vertex_array = 0; +int GLAD_GL_EXT_vertex_array_bgra = 0; +int GLAD_GL_EXT_vertex_attrib_64bit = 0; +int GLAD_GL_EXT_vertex_shader = 0; +int GLAD_GL_EXT_vertex_weighting = 0; +int GLAD_GL_EXT_win32_keyed_mutex = 0; +int GLAD_GL_EXT_window_rectangles = 0; +int GLAD_GL_EXT_x11_sync_object = 0; +int GLAD_GL_GREMEDY_frame_terminator = 0; +int GLAD_GL_GREMEDY_string_marker = 0; +int GLAD_GL_HP_convolution_border_modes = 0; +int GLAD_GL_HP_image_transform = 0; +int GLAD_GL_HP_occlusion_test = 0; +int GLAD_GL_HP_texture_lighting = 0; +int GLAD_GL_IBM_cull_vertex = 0; +int GLAD_GL_IBM_multimode_draw_arrays = 0; +int GLAD_GL_IBM_rasterpos_clip = 0; +int GLAD_GL_IBM_static_data = 0; +int GLAD_GL_IBM_texture_mirrored_repeat = 0; +int GLAD_GL_IBM_vertex_array_lists = 0; +int GLAD_GL_INGR_blend_func_separate = 0; +int GLAD_GL_INGR_color_clamp = 0; +int GLAD_GL_INGR_interlace_read = 0; +int GLAD_GL_INTEL_blackhole_render = 0; +int GLAD_GL_INTEL_conservative_rasterization = 0; +int GLAD_GL_INTEL_fragment_shader_ordering = 0; +int GLAD_GL_INTEL_framebuffer_CMAA = 0; +int GLAD_GL_INTEL_map_texture = 0; +int GLAD_GL_INTEL_parallel_arrays = 0; +int GLAD_GL_INTEL_performance_query = 0; +int GLAD_GL_KHR_blend_equation_advanced = 0; +int GLAD_GL_KHR_blend_equation_advanced_coherent = 0; +int GLAD_GL_KHR_context_flush_control = 0; +int GLAD_GL_KHR_debug = 0; +int GLAD_GL_KHR_no_error = 0; +int GLAD_GL_KHR_parallel_shader_compile = 0; +int GLAD_GL_KHR_robust_buffer_access_behavior = 0; +int GLAD_GL_KHR_robustness = 0; +int GLAD_GL_KHR_shader_subgroup = 0; +int GLAD_GL_KHR_texture_compression_astc_hdr = 0; +int GLAD_GL_KHR_texture_compression_astc_ldr = 0; +int GLAD_GL_KHR_texture_compression_astc_sliced_3d = 0; +int GLAD_GL_MESAX_texture_stack = 0; +int GLAD_GL_MESA_framebuffer_flip_x = 0; +int GLAD_GL_MESA_framebuffer_flip_y = 0; +int GLAD_GL_MESA_framebuffer_swap_xy = 0; +int GLAD_GL_MESA_pack_invert = 0; +int GLAD_GL_MESA_program_binary_formats = 0; +int GLAD_GL_MESA_resize_buffers = 0; +int GLAD_GL_MESA_shader_integer_functions = 0; +int GLAD_GL_MESA_tile_raster_order = 0; +int GLAD_GL_MESA_window_pos = 0; +int GLAD_GL_MESA_ycbcr_texture = 0; +int GLAD_GL_NVX_blend_equation_advanced_multi_draw_buffers = 0; +int GLAD_GL_NVX_conditional_render = 0; +int GLAD_GL_NVX_gpu_memory_info = 0; +int GLAD_GL_NVX_gpu_multicast2 = 0; +int GLAD_GL_NVX_linked_gpu_multicast = 0; +int GLAD_GL_NVX_progress_fence = 0; +int GLAD_GL_NV_alpha_to_coverage_dither_control = 0; +int GLAD_GL_NV_bindless_multi_draw_indirect = 0; +int GLAD_GL_NV_bindless_multi_draw_indirect_count = 0; +int GLAD_GL_NV_bindless_texture = 0; +int GLAD_GL_NV_blend_equation_advanced = 0; +int GLAD_GL_NV_blend_equation_advanced_coherent = 0; +int GLAD_GL_NV_blend_minmax_factor = 0; +int GLAD_GL_NV_blend_square = 0; +int GLAD_GL_NV_clip_space_w_scaling = 0; +int GLAD_GL_NV_command_list = 0; +int GLAD_GL_NV_compute_program5 = 0; +int GLAD_GL_NV_compute_shader_derivatives = 0; +int GLAD_GL_NV_conditional_render = 0; +int GLAD_GL_NV_conservative_raster = 0; +int GLAD_GL_NV_conservative_raster_dilate = 0; +int GLAD_GL_NV_conservative_raster_pre_snap = 0; +int GLAD_GL_NV_conservative_raster_pre_snap_triangles = 0; +int GLAD_GL_NV_conservative_raster_underestimation = 0; +int GLAD_GL_NV_copy_depth_to_color = 0; +int GLAD_GL_NV_copy_image = 0; +int GLAD_GL_NV_deep_texture3D = 0; +int GLAD_GL_NV_depth_buffer_float = 0; +int GLAD_GL_NV_depth_clamp = 0; +int GLAD_GL_NV_draw_texture = 0; +int GLAD_GL_NV_draw_vulkan_image = 0; +int GLAD_GL_NV_evaluators = 0; +int GLAD_GL_NV_explicit_multisample = 0; +int GLAD_GL_NV_fence = 0; +int GLAD_GL_NV_fill_rectangle = 0; +int GLAD_GL_NV_float_buffer = 0; +int GLAD_GL_NV_fog_distance = 0; +int GLAD_GL_NV_fragment_coverage_to_color = 0; +int GLAD_GL_NV_fragment_program = 0; +int GLAD_GL_NV_fragment_program2 = 0; +int GLAD_GL_NV_fragment_program4 = 0; +int GLAD_GL_NV_fragment_program_option = 0; +int GLAD_GL_NV_fragment_shader_barycentric = 0; +int GLAD_GL_NV_fragment_shader_interlock = 0; +int GLAD_GL_NV_framebuffer_mixed_samples = 0; +int GLAD_GL_NV_framebuffer_multisample_coverage = 0; +int GLAD_GL_NV_geometry_program4 = 0; +int GLAD_GL_NV_geometry_shader4 = 0; +int GLAD_GL_NV_geometry_shader_passthrough = 0; +int GLAD_GL_NV_gpu_multicast = 0; +int GLAD_GL_NV_gpu_program4 = 0; +int GLAD_GL_NV_gpu_program5 = 0; +int GLAD_GL_NV_gpu_program5_mem_extended = 0; +int GLAD_GL_NV_gpu_shader5 = 0; +int GLAD_GL_NV_half_float = 0; +int GLAD_GL_NV_internalformat_sample_query = 0; +int GLAD_GL_NV_light_max_exponent = 0; +int GLAD_GL_NV_memory_attachment = 0; +int GLAD_GL_NV_memory_object_sparse = 0; +int GLAD_GL_NV_mesh_shader = 0; +int GLAD_GL_NV_multisample_coverage = 0; +int GLAD_GL_NV_multisample_filter_hint = 0; +int GLAD_GL_NV_occlusion_query = 0; +int GLAD_GL_NV_packed_depth_stencil = 0; +int GLAD_GL_NV_parameter_buffer_object = 0; +int GLAD_GL_NV_parameter_buffer_object2 = 0; +int GLAD_GL_NV_path_rendering = 0; +int GLAD_GL_NV_path_rendering_shared_edge = 0; +int GLAD_GL_NV_pixel_data_range = 0; +int GLAD_GL_NV_point_sprite = 0; +int GLAD_GL_NV_present_video = 0; +int GLAD_GL_NV_primitive_restart = 0; +int GLAD_GL_NV_primitive_shading_rate = 0; +int GLAD_GL_NV_query_resource = 0; +int GLAD_GL_NV_query_resource_tag = 0; +int GLAD_GL_NV_register_combiners = 0; +int GLAD_GL_NV_register_combiners2 = 0; +int GLAD_GL_NV_representative_fragment_test = 0; +int GLAD_GL_NV_robustness_video_memory_purge = 0; +int GLAD_GL_NV_sample_locations = 0; +int GLAD_GL_NV_sample_mask_override_coverage = 0; +int GLAD_GL_NV_scissor_exclusive = 0; +int GLAD_GL_NV_shader_atomic_counters = 0; +int GLAD_GL_NV_shader_atomic_float = 0; +int GLAD_GL_NV_shader_atomic_float64 = 0; +int GLAD_GL_NV_shader_atomic_fp16_vector = 0; +int GLAD_GL_NV_shader_atomic_int64 = 0; +int GLAD_GL_NV_shader_buffer_load = 0; +int GLAD_GL_NV_shader_buffer_store = 0; +int GLAD_GL_NV_shader_storage_buffer_object = 0; +int GLAD_GL_NV_shader_subgroup_partitioned = 0; +int GLAD_GL_NV_shader_texture_footprint = 0; +int GLAD_GL_NV_shader_thread_group = 0; +int GLAD_GL_NV_shader_thread_shuffle = 0; +int GLAD_GL_NV_shading_rate_image = 0; +int GLAD_GL_NV_stereo_view_rendering = 0; +int GLAD_GL_NV_tessellation_program5 = 0; +int GLAD_GL_NV_texgen_emboss = 0; +int GLAD_GL_NV_texgen_reflection = 0; +int GLAD_GL_NV_texture_barrier = 0; +int GLAD_GL_NV_texture_compression_vtc = 0; +int GLAD_GL_NV_texture_env_combine4 = 0; +int GLAD_GL_NV_texture_expand_normal = 0; +int GLAD_GL_NV_texture_multisample = 0; +int GLAD_GL_NV_texture_rectangle = 0; +int GLAD_GL_NV_texture_rectangle_compressed = 0; +int GLAD_GL_NV_texture_shader = 0; +int GLAD_GL_NV_texture_shader2 = 0; +int GLAD_GL_NV_texture_shader3 = 0; +int GLAD_GL_NV_timeline_semaphore = 0; +int GLAD_GL_NV_transform_feedback = 0; +int GLAD_GL_NV_transform_feedback2 = 0; +int GLAD_GL_NV_uniform_buffer_std430_layout = 0; +int GLAD_GL_NV_uniform_buffer_unified_memory = 0; +int GLAD_GL_NV_vdpau_interop = 0; +int GLAD_GL_NV_vdpau_interop2 = 0; +int GLAD_GL_NV_vertex_array_range = 0; +int GLAD_GL_NV_vertex_array_range2 = 0; +int GLAD_GL_NV_vertex_attrib_integer_64bit = 0; +int GLAD_GL_NV_vertex_buffer_unified_memory = 0; +int GLAD_GL_NV_vertex_program = 0; +int GLAD_GL_NV_vertex_program1_1 = 0; +int GLAD_GL_NV_vertex_program2 = 0; +int GLAD_GL_NV_vertex_program2_option = 0; +int GLAD_GL_NV_vertex_program3 = 0; +int GLAD_GL_NV_vertex_program4 = 0; +int GLAD_GL_NV_video_capture = 0; +int GLAD_GL_NV_viewport_array2 = 0; +int GLAD_GL_NV_viewport_swizzle = 0; +int GLAD_GL_OES_byte_coordinates = 0; +int GLAD_GL_OES_compressed_paletted_texture = 0; +int GLAD_GL_OES_fixed_point = 0; +int GLAD_GL_OES_query_matrix = 0; +int GLAD_GL_OES_read_format = 0; +int GLAD_GL_OES_single_precision = 0; +int GLAD_GL_OML_interlace = 0; +int GLAD_GL_OML_resample = 0; +int GLAD_GL_OML_subsample = 0; +int GLAD_GL_OVR_multiview = 0; +int GLAD_GL_OVR_multiview2 = 0; +int GLAD_GL_PGI_misc_hints = 0; +int GLAD_GL_PGI_vertex_hints = 0; +int GLAD_GL_REND_screen_coordinates = 0; +int GLAD_GL_S3_s3tc = 0; +int GLAD_GL_SGIS_detail_texture = 0; +int GLAD_GL_SGIS_fog_function = 0; +int GLAD_GL_SGIS_generate_mipmap = 0; +int GLAD_GL_SGIS_multisample = 0; +int GLAD_GL_SGIS_pixel_texture = 0; +int GLAD_GL_SGIS_point_line_texgen = 0; +int GLAD_GL_SGIS_point_parameters = 0; +int GLAD_GL_SGIS_sharpen_texture = 0; +int GLAD_GL_SGIS_texture4D = 0; +int GLAD_GL_SGIS_texture_border_clamp = 0; +int GLAD_GL_SGIS_texture_color_mask = 0; +int GLAD_GL_SGIS_texture_edge_clamp = 0; +int GLAD_GL_SGIS_texture_filter4 = 0; +int GLAD_GL_SGIS_texture_lod = 0; +int GLAD_GL_SGIS_texture_select = 0; +int GLAD_GL_SGIX_async = 0; +int GLAD_GL_SGIX_async_histogram = 0; +int GLAD_GL_SGIX_async_pixel = 0; +int GLAD_GL_SGIX_blend_alpha_minmax = 0; +int GLAD_GL_SGIX_calligraphic_fragment = 0; +int GLAD_GL_SGIX_clipmap = 0; +int GLAD_GL_SGIX_convolution_accuracy = 0; +int GLAD_GL_SGIX_depth_pass_instrument = 0; +int GLAD_GL_SGIX_depth_texture = 0; +int GLAD_GL_SGIX_flush_raster = 0; +int GLAD_GL_SGIX_fog_offset = 0; +int GLAD_GL_SGIX_fragment_lighting = 0; +int GLAD_GL_SGIX_framezoom = 0; +int GLAD_GL_SGIX_igloo_interface = 0; +int GLAD_GL_SGIX_instruments = 0; +int GLAD_GL_SGIX_interlace = 0; +int GLAD_GL_SGIX_ir_instrument1 = 0; +int GLAD_GL_SGIX_list_priority = 0; +int GLAD_GL_SGIX_pixel_texture = 0; +int GLAD_GL_SGIX_pixel_tiles = 0; +int GLAD_GL_SGIX_polynomial_ffd = 0; +int GLAD_GL_SGIX_reference_plane = 0; +int GLAD_GL_SGIX_resample = 0; +int GLAD_GL_SGIX_scalebias_hint = 0; +int GLAD_GL_SGIX_shadow = 0; +int GLAD_GL_SGIX_shadow_ambient = 0; +int GLAD_GL_SGIX_sprite = 0; +int GLAD_GL_SGIX_subsample = 0; +int GLAD_GL_SGIX_tag_sample_buffer = 0; +int GLAD_GL_SGIX_texture_add_env = 0; +int GLAD_GL_SGIX_texture_coordinate_clamp = 0; +int GLAD_GL_SGIX_texture_lod_bias = 0; +int GLAD_GL_SGIX_texture_multi_buffer = 0; +int GLAD_GL_SGIX_texture_scale_bias = 0; +int GLAD_GL_SGIX_vertex_preclip = 0; +int GLAD_GL_SGIX_ycrcb = 0; +int GLAD_GL_SGIX_ycrcb_subsample = 0; +int GLAD_GL_SGIX_ycrcba = 0; +int GLAD_GL_SGI_color_matrix = 0; +int GLAD_GL_SGI_color_table = 0; +int GLAD_GL_SGI_texture_color_table = 0; +int GLAD_GL_SUNX_constant_data = 0; +int GLAD_GL_SUN_convolution_border_modes = 0; +int GLAD_GL_SUN_global_alpha = 0; +int GLAD_GL_SUN_mesh_array = 0; +int GLAD_GL_SUN_slice_accum = 0; +int GLAD_GL_SUN_triangle_list = 0; +int GLAD_GL_SUN_vertex = 0; +int GLAD_GL_WIN_phong_shading = 0; +int GLAD_GL_WIN_specular_fog = 0; +int GLAD_GL_AMD_compressed_3DC_texture = 0; +int GLAD_GL_AMD_compressed_ATC_texture = 0; +int GLAD_GL_AMD_program_binary_Z400 = 0; +int GLAD_GL_ANDROID_extension_pack_es31a = 0; +int GLAD_GL_ANGLE_depth_texture = 0; +int GLAD_GL_ANGLE_framebuffer_blit = 0; +int GLAD_GL_ANGLE_framebuffer_multisample = 0; +int GLAD_GL_ANGLE_instanced_arrays = 0; +int GLAD_GL_ANGLE_pack_reverse_row_order = 0; +int GLAD_GL_ANGLE_program_binary = 0; +int GLAD_GL_ANGLE_texture_compression_dxt3 = 0; +int GLAD_GL_ANGLE_texture_compression_dxt5 = 0; +int GLAD_GL_ANGLE_texture_usage = 0; +int GLAD_GL_ANGLE_translated_shader_source = 0; +int GLAD_GL_APPLE_clip_distance = 0; +int GLAD_GL_APPLE_color_buffer_packed_float = 0; +int GLAD_GL_APPLE_copy_texture_levels = 0; +int GLAD_GL_APPLE_framebuffer_multisample = 0; +int GLAD_GL_APPLE_sync = 0; +int GLAD_GL_APPLE_texture_format_BGRA8888 = 0; +int GLAD_GL_APPLE_texture_max_level = 0; +int GLAD_GL_APPLE_texture_packed_float = 0; +int GLAD_GL_ARM_mali_program_binary = 0; +int GLAD_GL_ARM_mali_shader_binary = 0; +int GLAD_GL_ARM_rgba8 = 0; +int GLAD_GL_ARM_shader_core_properties = 0; +int GLAD_GL_ARM_shader_framebuffer_fetch = 0; +int GLAD_GL_ARM_shader_framebuffer_fetch_depth_stencil = 0; +int GLAD_GL_ARM_texture_unnormalized_coordinates = 0; +int GLAD_GL_DMP_program_binary = 0; +int GLAD_GL_DMP_shader_binary = 0; +int GLAD_GL_EXT_EGL_image_array = 0; +int GLAD_GL_EXT_EGL_image_storage_compression = 0; +int GLAD_GL_EXT_YUV_target = 0; +int GLAD_GL_EXT_base_instance = 0; +int GLAD_GL_EXT_blend_func_extended = 0; +int GLAD_GL_EXT_buffer_storage = 0; +int GLAD_GL_EXT_clear_texture = 0; +int GLAD_GL_EXT_clip_control = 0; +int GLAD_GL_EXT_clip_cull_distance = 0; +int GLAD_GL_EXT_color_buffer_float = 0; +int GLAD_GL_EXT_color_buffer_half_float = 0; +int GLAD_GL_EXT_conservative_depth = 0; +int GLAD_GL_EXT_copy_image = 0; +int GLAD_GL_EXT_depth_clamp = 0; +int GLAD_GL_EXT_discard_framebuffer = 0; +int GLAD_GL_EXT_disjoint_timer_query = 0; +int GLAD_GL_EXT_draw_buffers = 0; +int GLAD_GL_EXT_draw_buffers_indexed = 0; +int GLAD_GL_EXT_draw_elements_base_vertex = 0; +int GLAD_GL_EXT_draw_transform_feedback = 0; +int GLAD_GL_EXT_float_blend = 0; +int GLAD_GL_EXT_fragment_shading_rate = 0; +int GLAD_GL_EXT_geometry_point_size = 0; +int GLAD_GL_EXT_geometry_shader = 0; +int GLAD_GL_EXT_gpu_shader5 = 0; +int GLAD_GL_EXT_instanced_arrays = 0; +int GLAD_GL_EXT_map_buffer_range = 0; +int GLAD_GL_EXT_multi_draw_indirect = 0; +int GLAD_GL_EXT_multisampled_compatibility = 0; +int GLAD_GL_EXT_multisampled_render_to_texture = 0; +int GLAD_GL_EXT_multisampled_render_to_texture2 = 0; +int GLAD_GL_EXT_multiview_draw_buffers = 0; +int GLAD_GL_EXT_occlusion_query_boolean = 0; +int GLAD_GL_EXT_primitive_bounding_box = 0; +int GLAD_GL_EXT_protected_textures = 0; +int GLAD_GL_EXT_pvrtc_sRGB = 0; +int GLAD_GL_EXT_read_format_bgra = 0; +int GLAD_GL_EXT_render_snorm = 0; +int GLAD_GL_EXT_robustness = 0; +int GLAD_GL_EXT_sRGB = 0; +int GLAD_GL_EXT_sRGB_write_control = 0; +int GLAD_GL_EXT_separate_depth_stencil = 0; +int GLAD_GL_EXT_shader_group_vote = 0; +int GLAD_GL_EXT_shader_implicit_conversions = 0; +int GLAD_GL_EXT_shader_io_blocks = 0; +int GLAD_GL_EXT_shader_non_constant_global_initializers = 0; +int GLAD_GL_EXT_shader_pixel_local_storage = 0; +int GLAD_GL_EXT_shader_pixel_local_storage2 = 0; +int GLAD_GL_EXT_shader_texture_lod = 0; +int GLAD_GL_EXT_shadow_samplers = 0; +int GLAD_GL_EXT_sparse_texture = 0; +int GLAD_GL_EXT_tessellation_point_size = 0; +int GLAD_GL_EXT_tessellation_shader = 0; +int GLAD_GL_EXT_texture_border_clamp = 0; +int GLAD_GL_EXT_texture_buffer = 0; +int GLAD_GL_EXT_texture_compression_astc_decode_mode = 0; +int GLAD_GL_EXT_texture_compression_bptc = 0; +int GLAD_GL_EXT_texture_compression_dxt1 = 0; +int GLAD_GL_EXT_texture_compression_s3tc_srgb = 0; +int GLAD_GL_EXT_texture_cube_map_array = 0; +int GLAD_GL_EXT_texture_format_BGRA8888 = 0; +int GLAD_GL_EXT_texture_format_sRGB_override = 0; +int GLAD_GL_EXT_texture_mirror_clamp_to_edge = 0; +int GLAD_GL_EXT_texture_norm16 = 0; +int GLAD_GL_EXT_texture_query_lod = 0; +int GLAD_GL_EXT_texture_rg = 0; +int GLAD_GL_EXT_texture_storage_compression = 0; +int GLAD_GL_EXT_texture_type_2_10_10_10_REV = 0; +int GLAD_GL_EXT_texture_view = 0; +int GLAD_GL_EXT_unpack_subimage = 0; +int GLAD_GL_FJ_shader_binary_GCCSO = 0; +int GLAD_GL_IMG_bindless_texture = 0; +int GLAD_GL_IMG_framebuffer_downsample = 0; +int GLAD_GL_IMG_multisampled_render_to_texture = 0; +int GLAD_GL_IMG_program_binary = 0; +int GLAD_GL_IMG_read_format = 0; +int GLAD_GL_IMG_shader_binary = 0; +int GLAD_GL_IMG_texture_compression_pvrtc = 0; +int GLAD_GL_IMG_texture_compression_pvrtc2 = 0; +int GLAD_GL_IMG_texture_filter_cubic = 0; +int GLAD_GL_MESA_bgra = 0; +int GLAD_GL_MESA_sampler_objects = 0; +int GLAD_GL_NV_copy_buffer = 0; +int GLAD_GL_NV_coverage_sample = 0; +int GLAD_GL_NV_depth_nonlinear = 0; +int GLAD_GL_NV_draw_buffers = 0; +int GLAD_GL_NV_draw_instanced = 0; +int GLAD_GL_NV_explicit_attrib_location = 0; +int GLAD_GL_NV_fbo_color_attachments = 0; +int GLAD_GL_NV_framebuffer_blit = 0; +int GLAD_GL_NV_framebuffer_multisample = 0; +int GLAD_GL_NV_generate_mipmap_sRGB = 0; +int GLAD_GL_NV_image_formats = 0; +int GLAD_GL_NV_instanced_arrays = 0; +int GLAD_GL_NV_non_square_matrices = 0; +int GLAD_GL_NV_pack_subimage = 0; +int GLAD_GL_NV_pixel_buffer_object = 0; +int GLAD_GL_NV_polygon_mode = 0; +int GLAD_GL_NV_read_buffer = 0; +int GLAD_GL_NV_read_buffer_front = 0; +int GLAD_GL_NV_read_depth = 0; +int GLAD_GL_NV_read_depth_stencil = 0; +int GLAD_GL_NV_read_stencil = 0; +int GLAD_GL_NV_sRGB_formats = 0; +int GLAD_GL_NV_shader_noperspective_interpolation = 0; +int GLAD_GL_NV_shadow_samplers_array = 0; +int GLAD_GL_NV_shadow_samplers_cube = 0; +int GLAD_GL_NV_texture_border_clamp = 0; +int GLAD_GL_NV_texture_compression_s3tc_update = 0; +int GLAD_GL_NV_texture_npot_2D_mipmap = 0; +int GLAD_GL_NV_viewport_array = 0; +int GLAD_GL_OES_EGL_image = 0; +int GLAD_GL_OES_EGL_image_external = 0; +int GLAD_GL_OES_EGL_image_external_essl3 = 0; +int GLAD_GL_OES_compressed_ETC1_RGB8_sub_texture = 0; +int GLAD_GL_OES_compressed_ETC1_RGB8_texture = 0; +int GLAD_GL_OES_copy_image = 0; +int GLAD_GL_OES_depth24 = 0; +int GLAD_GL_OES_depth32 = 0; +int GLAD_GL_OES_depth_texture = 0; +int GLAD_GL_OES_draw_buffers_indexed = 0; +int GLAD_GL_OES_draw_elements_base_vertex = 0; +int GLAD_GL_OES_element_index_uint = 0; +int GLAD_GL_OES_fbo_render_mipmap = 0; +int GLAD_GL_OES_fragment_precision_high = 0; +int GLAD_GL_OES_geometry_point_size = 0; +int GLAD_GL_OES_geometry_shader = 0; +int GLAD_GL_OES_get_program_binary = 0; +int GLAD_GL_OES_gpu_shader5 = 0; +int GLAD_GL_OES_mapbuffer = 0; +int GLAD_GL_OES_packed_depth_stencil = 0; +int GLAD_GL_OES_primitive_bounding_box = 0; +int GLAD_GL_OES_required_internalformat = 0; +int GLAD_GL_OES_rgb8_rgba8 = 0; +int GLAD_GL_OES_sample_shading = 0; +int GLAD_GL_OES_sample_variables = 0; +int GLAD_GL_OES_shader_image_atomic = 0; +int GLAD_GL_OES_shader_io_blocks = 0; +int GLAD_GL_OES_shader_multisample_interpolation = 0; +int GLAD_GL_OES_standard_derivatives = 0; +int GLAD_GL_OES_stencil1 = 0; +int GLAD_GL_OES_stencil4 = 0; +int GLAD_GL_OES_surfaceless_context = 0; +int GLAD_GL_OES_tessellation_point_size = 0; +int GLAD_GL_OES_tessellation_shader = 0; +int GLAD_GL_OES_texture_3D = 0; +int GLAD_GL_OES_texture_border_clamp = 0; +int GLAD_GL_OES_texture_buffer = 0; +int GLAD_GL_OES_texture_compression_astc = 0; +int GLAD_GL_OES_texture_cube_map_array = 0; +int GLAD_GL_OES_texture_float = 0; +int GLAD_GL_OES_texture_float_linear = 0; +int GLAD_GL_OES_texture_half_float = 0; +int GLAD_GL_OES_texture_half_float_linear = 0; +int GLAD_GL_OES_texture_npot = 0; +int GLAD_GL_OES_texture_stencil8 = 0; +int GLAD_GL_OES_texture_storage_multisample_2d_array = 0; +int GLAD_GL_OES_texture_view = 0; +int GLAD_GL_OES_vertex_array_object = 0; +int GLAD_GL_OES_vertex_half_float = 0; +int GLAD_GL_OES_vertex_type_10_10_10_2 = 0; +int GLAD_GL_OES_viewport_array = 0; +int GLAD_GL_OVR_multiview_multisampled_render_to_texture = 0; +int GLAD_GL_QCOM_YUV_texture_gather = 0; +int GLAD_GL_QCOM_alpha_test = 0; +int GLAD_GL_QCOM_binning_control = 0; +int GLAD_GL_QCOM_driver_control = 0; +int GLAD_GL_QCOM_extended_get = 0; +int GLAD_GL_QCOM_extended_get2 = 0; +int GLAD_GL_QCOM_frame_extrapolation = 0; +int GLAD_GL_QCOM_framebuffer_foveated = 0; +int GLAD_GL_QCOM_motion_estimation = 0; +int GLAD_GL_QCOM_perfmon_global_mode = 0; +int GLAD_GL_QCOM_render_sRGB_R8_RG8 = 0; +int GLAD_GL_QCOM_render_shared_exponent = 0; +int GLAD_GL_QCOM_shader_framebuffer_fetch_noncoherent = 0; +int GLAD_GL_QCOM_shader_framebuffer_fetch_rate = 0; +int GLAD_GL_QCOM_shading_rate = 0; +int GLAD_GL_QCOM_texture_foveated = 0; +int GLAD_GL_QCOM_texture_foveated2 = 0; +int GLAD_GL_QCOM_texture_foveated_subsampled_layout = 0; +int GLAD_GL_QCOM_texture_lod_bias = 0; +int GLAD_GL_QCOM_tiled_rendering = 0; +int GLAD_GL_QCOM_writeonly_rendering = 0; +int GLAD_GL_VIV_shader_binary = 0; + + + +PFNGLACCUMPROC glad_glAccum = NULL; +PFNGLACCUMXOESPROC glad_glAccumxOES = NULL; +PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC glad_glAcquireKeyedMutexWin32EXT = NULL; +PFNGLACTIVEPROGRAMEXTPROC glad_glActiveProgramEXT = NULL; +PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL; +PFNGLACTIVESTENCILFACEEXTPROC glad_glActiveStencilFaceEXT = NULL; +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB = NULL; +PFNGLACTIVEVARYINGNVPROC glad_glActiveVaryingNV = NULL; +PFNGLALPHAFRAGMENTOP1ATIPROC glad_glAlphaFragmentOp1ATI = NULL; +PFNGLALPHAFRAGMENTOP2ATIPROC glad_glAlphaFragmentOp2ATI = NULL; +PFNGLALPHAFRAGMENTOP3ATIPROC glad_glAlphaFragmentOp3ATI = NULL; +PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL; +PFNGLALPHAFUNCXOESPROC glad_glAlphaFuncxOES = NULL; +PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC glad_glAlphaToCoverageDitherControlNV = NULL; +PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC glad_glApplyFramebufferAttachmentCMAAINTEL = NULL; +PFNGLAPPLYTEXTUREEXTPROC glad_glApplyTextureEXT = NULL; +PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV = NULL; +PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL; +PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT = NULL; +PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL; +PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT = NULL; +PFNGLARRAYOBJECTATIPROC glad_glArrayObjectATI = NULL; +PFNGLASYNCCOPYBUFFERSUBDATANVXPROC glad_glAsyncCopyBufferSubDataNVX = NULL; +PFNGLASYNCCOPYIMAGESUBDATANVXPROC glad_glAsyncCopyImageSubDataNVX = NULL; +PFNGLASYNCMARKERSGIXPROC glad_glAsyncMarkerSGIX = NULL; +PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBEGINPROC glad_glBegin = NULL; +PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; +PFNGLBEGINCONDITIONALRENDERNVPROC glad_glBeginConditionalRenderNV = NULL; +PFNGLBEGINCONDITIONALRENDERNVXPROC glad_glBeginConditionalRenderNVX = NULL; +PFNGLBEGINFRAGMENTSHADERATIPROC glad_glBeginFragmentShaderATI = NULL; +PFNGLBEGINOCCLUSIONQUERYNVPROC glad_glBeginOcclusionQueryNV = NULL; +PFNGLBEGINPERFMONITORAMDPROC glad_glBeginPerfMonitorAMD = NULL; +PFNGLBEGINPERFQUERYINTELPROC glad_glBeginPerfQueryINTEL = NULL; +PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINQUERYARBPROC glad_glBeginQueryARB = NULL; +PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; +PFNGLBEGINTRANSFORMFEEDBACKEXTPROC glad_glBeginTransformFeedbackEXT = NULL; +PFNGLBEGINTRANSFORMFEEDBACKNVPROC glad_glBeginTransformFeedbackNV = NULL; +PFNGLBEGINVERTEXSHADEREXTPROC glad_glBeginVertexShaderEXT = NULL; +PFNGLBEGINVIDEOCAPTURENVPROC glad_glBeginVideoCaptureNV = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDBUFFERARBPROC glad_glBindBufferARB = NULL; +PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERBASEEXTPROC glad_glBindBufferBaseEXT = NULL; +PFNGLBINDBUFFERBASENVPROC glad_glBindBufferBaseNV = NULL; +PFNGLBINDBUFFEROFFSETEXTPROC glad_glBindBufferOffsetEXT = NULL; +PFNGLBINDBUFFEROFFSETNVPROC glad_glBindBufferOffsetNV = NULL; +PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; +PFNGLBINDBUFFERRANGEEXTPROC glad_glBindBufferRangeEXT = NULL; +PFNGLBINDBUFFERRANGENVPROC glad_glBindBufferRangeNV = NULL; +PFNGLBINDBUFFERSBASEPROC glad_glBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC glad_glBindBuffersRange = NULL; +PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONEXTPROC glad_glBindFragDataLocationEXT = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; +PFNGLBINDFRAGMENTSHADERATIPROC glad_glBindFragmentShaderATI = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL; +PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture = NULL; +PFNGLBINDIMAGETEXTUREEXTPROC glad_glBindImageTextureEXT = NULL; +PFNGLBINDIMAGETEXTURESPROC glad_glBindImageTextures = NULL; +PFNGLBINDLIGHTPARAMETEREXTPROC glad_glBindLightParameterEXT = NULL; +PFNGLBINDMATERIALPARAMETEREXTPROC glad_glBindMaterialParameterEXT = NULL; +PFNGLBINDMULTITEXTUREEXTPROC glad_glBindMultiTextureEXT = NULL; +PFNGLBINDPARAMETEREXTPROC glad_glBindParameterEXT = NULL; +PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB = NULL; +PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV = NULL; +PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL; +PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; +PFNGLBINDSAMPLERSPROC glad_glBindSamplers = NULL; +PFNGLBINDSHADINGRATEIMAGENVPROC glad_glBindShadingRateImageNV = NULL; +PFNGLBINDTEXGENPARAMETEREXTPROC glad_glBindTexGenParameterEXT = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT = NULL; +PFNGLBINDTEXTUREUNITPROC glad_glBindTextureUnit = NULL; +PFNGLBINDTEXTUREUNITPARAMETEREXTPROC glad_glBindTextureUnitParameterEXT = NULL; +PFNGLBINDTEXTURESPROC glad_glBindTextures = NULL; +PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL; +PFNGLBINDTRANSFORMFEEDBACKNVPROC glad_glBindTransformFeedbackNV = NULL; +PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBINDVERTEXARRAYAPPLEPROC glad_glBindVertexArrayAPPLE = NULL; +PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer = NULL; +PFNGLBINDVERTEXBUFFERSPROC glad_glBindVertexBuffers = NULL; +PFNGLBINDVERTEXSHADEREXTPROC glad_glBindVertexShaderEXT = NULL; +PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC glad_glBindVideoCaptureStreamBufferNV = NULL; +PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC glad_glBindVideoCaptureStreamTextureNV = NULL; +PFNGLBINORMAL3BEXTPROC glad_glBinormal3bEXT = NULL; +PFNGLBINORMAL3BVEXTPROC glad_glBinormal3bvEXT = NULL; +PFNGLBINORMAL3DEXTPROC glad_glBinormal3dEXT = NULL; +PFNGLBINORMAL3DVEXTPROC glad_glBinormal3dvEXT = NULL; +PFNGLBINORMAL3FEXTPROC glad_glBinormal3fEXT = NULL; +PFNGLBINORMAL3FVEXTPROC glad_glBinormal3fvEXT = NULL; +PFNGLBINORMAL3IEXTPROC glad_glBinormal3iEXT = NULL; +PFNGLBINORMAL3IVEXTPROC glad_glBinormal3ivEXT = NULL; +PFNGLBINORMAL3SEXTPROC glad_glBinormal3sEXT = NULL; +PFNGLBINORMAL3SVEXTPROC glad_glBinormal3svEXT = NULL; +PFNGLBINORMALPOINTEREXTPROC glad_glBinormalPointerEXT = NULL; +PFNGLBITMAPPROC glad_glBitmap = NULL; +PFNGLBITMAPXOESPROC glad_glBitmapxOES = NULL; +PFNGLBLENDBARRIERKHRPROC glad_glBlendBarrierKHR = NULL; +PFNGLBLENDBARRIERNVPROC glad_glBlendBarrierNV = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDCOLOREXTPROC glad_glBlendColorEXT = NULL; +PFNGLBLENDCOLORXOESPROC glad_glBlendColorxOES = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT = NULL; +PFNGLBLENDEQUATIONINDEXEDAMDPROC glad_glBlendEquationIndexedAMD = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT = NULL; +PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC glad_glBlendEquationSeparateIndexedAMD = NULL; +PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONSEPARATEIARBPROC glad_glBlendEquationSeparateiARB = NULL; +PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi = NULL; +PFNGLBLENDEQUATIONIARBPROC glad_glBlendEquationiARB = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCINDEXEDAMDPROC glad_glBlendFuncIndexedAMD = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT = NULL; +PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR = NULL; +PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC glad_glBlendFuncSeparateIndexedAMD = NULL; +PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCSEPARATEIARBPROC glad_glBlendFuncSeparateiARB = NULL; +PFNGLBLENDFUNCIPROC glad_glBlendFunci = NULL; +PFNGLBLENDFUNCIARBPROC glad_glBlendFunciARB = NULL; +PFNGLBLENDPARAMETERINVPROC glad_glBlendParameteriNV = NULL; +PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; +PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT = NULL; +PFNGLBLITFRAMEBUFFERLAYEREXTPROC glad_glBlitFramebufferLayerEXT = NULL; +PFNGLBLITFRAMEBUFFERLAYERSEXTPROC glad_glBlitFramebufferLayersEXT = NULL; +PFNGLBLITNAMEDFRAMEBUFFERPROC glad_glBlitNamedFramebuffer = NULL; +PFNGLBUFFERADDRESSRANGENVPROC glad_glBufferAddressRangeNV = NULL; +PFNGLBUFFERATTACHMEMORYNVPROC glad_glBufferAttachMemoryNV = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERDATAARBPROC glad_glBufferDataARB = NULL; +PFNGLBUFFERPAGECOMMITMENTARBPROC glad_glBufferPageCommitmentARB = NULL; +PFNGLBUFFERPAGECOMMITMENTMEMNVPROC glad_glBufferPageCommitmentMemNV = NULL; +PFNGLBUFFERPARAMETERIAPPLEPROC glad_glBufferParameteriAPPLE = NULL; +PFNGLBUFFERSTORAGEPROC glad_glBufferStorage = NULL; +PFNGLBUFFERSTORAGEEXTERNALEXTPROC glad_glBufferStorageExternalEXT = NULL; +PFNGLBUFFERSTORAGEMEMEXTPROC glad_glBufferStorageMemEXT = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB = NULL; +PFNGLCALLCOMMANDLISTNVPROC glad_glCallCommandListNV = NULL; +PFNGLCALLLISTPROC glad_glCallList = NULL; +PFNGLCALLLISTSPROC glad_glCallLists = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glad_glCheckNamedFramebufferStatus = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC glad_glCheckNamedFramebufferStatusEXT = NULL; +PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; +PFNGLCLAMPCOLORARBPROC glad_glClampColorARB = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARACCUMPROC glad_glClearAccum = NULL; +PFNGLCLEARACCUMXOESPROC glad_glClearAccumxOES = NULL; +PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData = NULL; +PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARCOLORIIEXTPROC glad_glClearColorIiEXT = NULL; +PFNGLCLEARCOLORIUIEXTPROC glad_glClearColorIuiEXT = NULL; +PFNGLCLEARCOLORXOESPROC glad_glClearColorxOES = NULL; +PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARDEPTHDNVPROC glad_glClearDepthdNV = NULL; +PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; +PFNGLCLEARDEPTHFOESPROC glad_glClearDepthfOES = NULL; +PFNGLCLEARDEPTHXOESPROC glad_glClearDepthxOES = NULL; +PFNGLCLEARINDEXPROC glad_glClearIndex = NULL; +PFNGLCLEARNAMEDBUFFERDATAPROC glad_glClearNamedBufferData = NULL; +PFNGLCLEARNAMEDBUFFERDATAEXTPROC glad_glClearNamedBufferDataEXT = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAPROC glad_glClearNamedBufferSubData = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glad_glClearNamedBufferSubDataEXT = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glad_glClearNamedFramebufferfi = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glad_glClearNamedFramebufferfv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glad_glClearNamedFramebufferiv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glad_glClearNamedFramebufferuiv = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCLEARTEXIMAGEPROC glad_glClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC glad_glClearTexSubImage = NULL; +PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB = NULL; +PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC glad_glClientActiveVertexStreamATI = NULL; +PFNGLCLIENTATTRIBDEFAULTEXTPROC glad_glClientAttribDefaultEXT = NULL; +PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC glad_glClientWaitSemaphoreui64NVX = NULL; +PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; +PFNGLCLIPCONTROLPROC glad_glClipControl = NULL; +PFNGLCLIPPLANEPROC glad_glClipPlane = NULL; +PFNGLCLIPPLANEFOESPROC glad_glClipPlanefOES = NULL; +PFNGLCLIPPLANEXOESPROC glad_glClipPlanexOES = NULL; +PFNGLCOLOR3BPROC glad_glColor3b = NULL; +PFNGLCOLOR3BVPROC glad_glColor3bv = NULL; +PFNGLCOLOR3DPROC glad_glColor3d = NULL; +PFNGLCOLOR3DVPROC glad_glColor3dv = NULL; +PFNGLCOLOR3FPROC glad_glColor3f = NULL; +PFNGLCOLOR3FVERTEX3FSUNPROC glad_glColor3fVertex3fSUN = NULL; +PFNGLCOLOR3FVERTEX3FVSUNPROC glad_glColor3fVertex3fvSUN = NULL; +PFNGLCOLOR3FVPROC glad_glColor3fv = NULL; +PFNGLCOLOR3HNVPROC glad_glColor3hNV = NULL; +PFNGLCOLOR3HVNVPROC glad_glColor3hvNV = NULL; +PFNGLCOLOR3IPROC glad_glColor3i = NULL; +PFNGLCOLOR3IVPROC glad_glColor3iv = NULL; +PFNGLCOLOR3SPROC glad_glColor3s = NULL; +PFNGLCOLOR3SVPROC glad_glColor3sv = NULL; +PFNGLCOLOR3UBPROC glad_glColor3ub = NULL; +PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL; +PFNGLCOLOR3UIPROC glad_glColor3ui = NULL; +PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL; +PFNGLCOLOR3USPROC glad_glColor3us = NULL; +PFNGLCOLOR3USVPROC glad_glColor3usv = NULL; +PFNGLCOLOR3XOESPROC glad_glColor3xOES = NULL; +PFNGLCOLOR3XVOESPROC glad_glColor3xvOES = NULL; +PFNGLCOLOR4BPROC glad_glColor4b = NULL; +PFNGLCOLOR4BVPROC glad_glColor4bv = NULL; +PFNGLCOLOR4DPROC glad_glColor4d = NULL; +PFNGLCOLOR4DVPROC glad_glColor4dv = NULL; +PFNGLCOLOR4FPROC glad_glColor4f = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glColor4fNormal3fVertex3fSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glColor4fNormal3fVertex3fvSUN = NULL; +PFNGLCOLOR4FVPROC glad_glColor4fv = NULL; +PFNGLCOLOR4HNVPROC glad_glColor4hNV = NULL; +PFNGLCOLOR4HVNVPROC glad_glColor4hvNV = NULL; +PFNGLCOLOR4IPROC glad_glColor4i = NULL; +PFNGLCOLOR4IVPROC glad_glColor4iv = NULL; +PFNGLCOLOR4SPROC glad_glColor4s = NULL; +PFNGLCOLOR4SVPROC glad_glColor4sv = NULL; +PFNGLCOLOR4UBPROC glad_glColor4ub = NULL; +PFNGLCOLOR4UBVERTEX2FSUNPROC glad_glColor4ubVertex2fSUN = NULL; +PFNGLCOLOR4UBVERTEX2FVSUNPROC glad_glColor4ubVertex2fvSUN = NULL; +PFNGLCOLOR4UBVERTEX3FSUNPROC glad_glColor4ubVertex3fSUN = NULL; +PFNGLCOLOR4UBVERTEX3FVSUNPROC glad_glColor4ubVertex3fvSUN = NULL; +PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL; +PFNGLCOLOR4UIPROC glad_glColor4ui = NULL; +PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL; +PFNGLCOLOR4USPROC glad_glColor4us = NULL; +PFNGLCOLOR4USVPROC glad_glColor4usv = NULL; +PFNGLCOLOR4XOESPROC glad_glColor4xOES = NULL; +PFNGLCOLOR4XVOESPROC glad_glColor4xvOES = NULL; +PFNGLCOLORFORMATNVPROC glad_glColorFormatNV = NULL; +PFNGLCOLORFRAGMENTOP1ATIPROC glad_glColorFragmentOp1ATI = NULL; +PFNGLCOLORFRAGMENTOP2ATIPROC glad_glColorFragmentOp2ATI = NULL; +PFNGLCOLORFRAGMENTOP3ATIPROC glad_glColorFragmentOp3ATI = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOLORMASKINDEXEDEXTPROC glad_glColorMaskIndexedEXT = NULL; +PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; +PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL; +PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL; +PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL; +PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL; +PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL; +PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL; +PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT = NULL; +PFNGLCOLORPOINTERLISTIBMPROC glad_glColorPointerListIBM = NULL; +PFNGLCOLORPOINTERVINTELPROC glad_glColorPointervINTEL = NULL; +PFNGLCOLORSUBTABLEPROC glad_glColorSubTable = NULL; +PFNGLCOLORSUBTABLEEXTPROC glad_glColorSubTableEXT = NULL; +PFNGLCOLORTABLEPROC glad_glColorTable = NULL; +PFNGLCOLORTABLEEXTPROC glad_glColorTableEXT = NULL; +PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv = NULL; +PFNGLCOLORTABLEPARAMETERFVSGIPROC glad_glColorTableParameterfvSGI = NULL; +PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv = NULL; +PFNGLCOLORTABLEPARAMETERIVSGIPROC glad_glColorTableParameterivSGI = NULL; +PFNGLCOLORTABLESGIPROC glad_glColorTableSGI = NULL; +PFNGLCOMBINERINPUTNVPROC glad_glCombinerInputNV = NULL; +PFNGLCOMBINEROUTPUTNVPROC glad_glCombinerOutputNV = NULL; +PFNGLCOMBINERPARAMETERFNVPROC glad_glCombinerParameterfNV = NULL; +PFNGLCOMBINERPARAMETERFVNVPROC glad_glCombinerParameterfvNV = NULL; +PFNGLCOMBINERPARAMETERINVPROC glad_glCombinerParameteriNV = NULL; +PFNGLCOMBINERPARAMETERIVNVPROC glad_glCombinerParameterivNV = NULL; +PFNGLCOMBINERSTAGEPARAMETERFVNVPROC glad_glCombinerStageParameterfvNV = NULL; +PFNGLCOMMANDLISTSEGMENTSNVPROC glad_glCommandListSegmentsNV = NULL; +PFNGLCOMPILECOMMANDLISTNVPROC glad_glCompileCommandListNV = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB = NULL; +PFNGLCOMPILESHADERINCLUDEARBPROC glad_glCompileShaderIncludeARB = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC glad_glCompressedMultiTexImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC glad_glCompressedMultiTexImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC glad_glCompressedMultiTexImage3DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC glad_glCompressedMultiTexSubImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC glad_glCompressedMultiTexSubImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC glad_glCompressedMultiTexSubImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glad_glCompressedTexImage1DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glad_glCompressedTexImage2DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DARBPROC glad_glCompressedTexImage3DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC glad_glCompressedTexSubImage1DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC glad_glCompressedTexSubImage2DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC glad_glCompressedTexSubImage3DARB = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC glad_glCompressedTextureImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC glad_glCompressedTextureImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC glad_glCompressedTextureImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glad_glCompressedTextureSubImage1D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC glad_glCompressedTextureSubImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glad_glCompressedTextureSubImage2D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC glad_glCompressedTextureSubImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glad_glCompressedTextureSubImage3D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC glad_glCompressedTextureSubImage3DEXT = NULL; +PFNGLCONSERVATIVERASTERPARAMETERFNVPROC glad_glConservativeRasterParameterfNV = NULL; +PFNGLCONSERVATIVERASTERPARAMETERINVPROC glad_glConservativeRasterParameteriNV = NULL; +PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D = NULL; +PFNGLCONVOLUTIONFILTER1DEXTPROC glad_glConvolutionFilter1DEXT = NULL; +PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D = NULL; +PFNGLCONVOLUTIONFILTER2DEXTPROC glad_glConvolutionFilter2DEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf = NULL; +PFNGLCONVOLUTIONPARAMETERFEXTPROC glad_glConvolutionParameterfEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv = NULL; +PFNGLCONVOLUTIONPARAMETERFVEXTPROC glad_glConvolutionParameterfvEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri = NULL; +PFNGLCONVOLUTIONPARAMETERIEXTPROC glad_glConvolutionParameteriEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv = NULL; +PFNGLCONVOLUTIONPARAMETERIVEXTPROC glad_glConvolutionParameterivEXT = NULL; +PFNGLCONVOLUTIONPARAMETERXOESPROC glad_glConvolutionParameterxOES = NULL; +PFNGLCONVOLUTIONPARAMETERXVOESPROC glad_glConvolutionParameterxvOES = NULL; +PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable = NULL; +PFNGLCOPYCOLORSUBTABLEEXTPROC glad_glCopyColorSubTableEXT = NULL; +PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable = NULL; +PFNGLCOPYCOLORTABLESGIPROC glad_glCopyColorTableSGI = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC glad_glCopyConvolutionFilter1DEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC glad_glCopyConvolutionFilter2DEXT = NULL; +PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData = NULL; +PFNGLCOPYIMAGESUBDATANVPROC glad_glCopyImageSubDataNV = NULL; +PFNGLCOPYMULTITEXIMAGE1DEXTPROC glad_glCopyMultiTexImage1DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE2DEXTPROC glad_glCopyMultiTexImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC glad_glCopyMultiTexSubImage1DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC glad_glCopyMultiTexSubImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC glad_glCopyMultiTexSubImage3DEXT = NULL; +PFNGLCOPYNAMEDBUFFERSUBDATAPROC glad_glCopyNamedBufferSubData = NULL; +PFNGLCOPYPATHNVPROC glad_glCopyPathNV = NULL; +PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL; +PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; +PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE1DEXTPROC glad_glCopyTextureImage1DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE2DEXTPROC glad_glCopyTextureImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DPROC glad_glCopyTextureSubImage1D = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC glad_glCopyTextureSubImage1DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DPROC glad_glCopyTextureSubImage2D = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC glad_glCopyTextureSubImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DPROC glad_glCopyTextureSubImage3D = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC glad_glCopyTextureSubImage3DEXT = NULL; +PFNGLCOVERFILLPATHINSTANCEDNVPROC glad_glCoverFillPathInstancedNV = NULL; +PFNGLCOVERFILLPATHNVPROC glad_glCoverFillPathNV = NULL; +PFNGLCOVERSTROKEPATHINSTANCEDNVPROC glad_glCoverStrokePathInstancedNV = NULL; +PFNGLCOVERSTROKEPATHNVPROC glad_glCoverStrokePathNV = NULL; +PFNGLCOVERAGEMODULATIONNVPROC glad_glCoverageModulationNV = NULL; +PFNGLCOVERAGEMODULATIONTABLENVPROC glad_glCoverageModulationTableNV = NULL; +PFNGLCREATEBUFFERSPROC glad_glCreateBuffers = NULL; +PFNGLCREATECOMMANDLISTSNVPROC glad_glCreateCommandListsNV = NULL; +PFNGLCREATEFRAMEBUFFERSPROC glad_glCreateFramebuffers = NULL; +PFNGLCREATEMEMORYOBJECTSEXTPROC glad_glCreateMemoryObjectsEXT = NULL; +PFNGLCREATEPERFQUERYINTELPROC glad_glCreatePerfQueryINTEL = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB = NULL; +PFNGLCREATEPROGRAMPIPELINESPROC glad_glCreateProgramPipelines = NULL; +PFNGLCREATEPROGRESSFENCENVXPROC glad_glCreateProgressFenceNVX = NULL; +PFNGLCREATEQUERIESPROC glad_glCreateQueries = NULL; +PFNGLCREATERENDERBUFFERSPROC glad_glCreateRenderbuffers = NULL; +PFNGLCREATESAMPLERSPROC glad_glCreateSamplers = NULL; +PFNGLCREATESEMAPHORESNVPROC glad_glCreateSemaphoresNV = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB = NULL; +PFNGLCREATESHADERPROGRAMEXTPROC glad_glCreateShaderProgramEXT = NULL; +PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL; +PFNGLCREATESTATESNVPROC glad_glCreateStatesNV = NULL; +PFNGLCREATESYNCFROMCLEVENTARBPROC glad_glCreateSyncFromCLeventARB = NULL; +PFNGLCREATETEXTURESPROC glad_glCreateTextures = NULL; +PFNGLCREATETRANSFORMFEEDBACKSPROC glad_glCreateTransformFeedbacks = NULL; +PFNGLCREATEVERTEXARRAYSPROC glad_glCreateVertexArrays = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLCULLPARAMETERDVEXTPROC glad_glCullParameterdvEXT = NULL; +PFNGLCULLPARAMETERFVEXTPROC glad_glCullParameterfvEXT = NULL; +PFNGLCURRENTPALETTEMATRIXARBPROC glad_glCurrentPaletteMatrixARB = NULL; +PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECALLBACKAMDPROC glad_glDebugMessageCallbackAMD = NULL; +PFNGLDEBUGMESSAGECALLBACKARBPROC glad_glDebugMessageCallbackARB = NULL; +PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL; +PFNGLDEBUGMESSAGECONTROLARBPROC glad_glDebugMessageControlARB = NULL; +PFNGLDEBUGMESSAGEENABLEAMDPROC glad_glDebugMessageEnableAMD = NULL; +PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL; +PFNGLDEBUGMESSAGEINSERTAMDPROC glad_glDebugMessageInsertAMD = NULL; +PFNGLDEBUGMESSAGEINSERTARBPROC glad_glDebugMessageInsertARB = NULL; +PFNGLDEFORMSGIXPROC glad_glDeformSGIX = NULL; +PFNGLDEFORMATIONMAP3DSGIXPROC glad_glDeformationMap3dSGIX = NULL; +PFNGLDEFORMATIONMAP3FSGIXPROC glad_glDeformationMap3fSGIX = NULL; +PFNGLDELETEASYNCMARKERSSGIXPROC glad_glDeleteAsyncMarkersSGIX = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB = NULL; +PFNGLDELETECOMMANDLISTSNVPROC glad_glDeleteCommandListsNV = NULL; +PFNGLDELETEFENCESAPPLEPROC glad_glDeleteFencesAPPLE = NULL; +PFNGLDELETEFENCESNVPROC glad_glDeleteFencesNV = NULL; +PFNGLDELETEFRAGMENTSHADERATIPROC glad_glDeleteFragmentShaderATI = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL; +PFNGLDELETELISTSPROC glad_glDeleteLists = NULL; +PFNGLDELETEMEMORYOBJECTSEXTPROC glad_glDeleteMemoryObjectsEXT = NULL; +PFNGLDELETENAMEDSTRINGARBPROC glad_glDeleteNamedStringARB = NULL; +PFNGLDELETENAMESAMDPROC glad_glDeleteNamesAMD = NULL; +PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB = NULL; +PFNGLDELETEOCCLUSIONQUERIESNVPROC glad_glDeleteOcclusionQueriesNV = NULL; +PFNGLDELETEPATHSNVPROC glad_glDeletePathsNV = NULL; +PFNGLDELETEPERFMONITORSAMDPROC glad_glDeletePerfMonitorsAMD = NULL; +PFNGLDELETEPERFQUERYINTELPROC glad_glDeletePerfQueryINTEL = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL; +PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB = NULL; +PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV = NULL; +PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; +PFNGLDELETEQUERIESARBPROC glad_glDeleteQueriesARB = NULL; +PFNGLDELETEQUERYRESOURCETAGNVPROC glad_glDeleteQueryResourceTagNV = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL; +PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; +PFNGLDELETESEMAPHORESEXTPROC glad_glDeleteSemaphoresEXT = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETESTATESNVPROC glad_glDeleteStatesNV = NULL; +PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL; +PFNGLDELETETRANSFORMFEEDBACKSNVPROC glad_glDeleteTransformFeedbacksNV = NULL; +PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; +PFNGLDELETEVERTEXARRAYSAPPLEPROC glad_glDeleteVertexArraysAPPLE = NULL; +PFNGLDELETEVERTEXSHADEREXTPROC glad_glDeleteVertexShaderEXT = NULL; +PFNGLDEPTHBOUNDSEXTPROC glad_glDepthBoundsEXT = NULL; +PFNGLDEPTHBOUNDSDNVPROC glad_glDepthBoundsdNV = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDEPTHRANGEARRAYDVNVPROC glad_glDepthRangeArraydvNV = NULL; +PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed = NULL; +PFNGLDEPTHRANGEINDEXEDDNVPROC glad_glDepthRangeIndexeddNV = NULL; +PFNGLDEPTHRANGEDNVPROC glad_glDepthRangedNV = NULL; +PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; +PFNGLDEPTHRANGEFOESPROC glad_glDepthRangefOES = NULL; +PFNGLDEPTHRANGEXOESPROC glad_glDepthRangexOES = NULL; +PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDETAILTEXFUNCSGISPROC glad_glDetailTexFuncSGIS = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL; +PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC glad_glDisableClientStateIndexedEXT = NULL; +PFNGLDISABLECLIENTSTATEIEXTPROC glad_glDisableClientStateiEXT = NULL; +PFNGLDISABLEINDEXEDEXTPROC glad_glDisableIndexedEXT = NULL; +PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC glad_glDisableVariantClientStateEXT = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBPROC glad_glDisableVertexArrayAttrib = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glad_glDisableVertexArrayAttribEXT = NULL; +PFNGLDISABLEVERTEXARRAYEXTPROC glad_glDisableVertexArrayEXT = NULL; +PFNGLDISABLEVERTEXATTRIBAPPLEPROC glad_glDisableVertexAttribAPPLE = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB = NULL; +PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC glad_glDispatchComputeGroupSizeARB = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT = NULL; +PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWARRAYSINSTANCEDARBPROC glad_glDrawArraysInstancedARB = NULL; +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance = NULL; +PFNGLDRAWARRAYSINSTANCEDEXTPROC glad_glDrawArraysInstancedEXT = NULL; +PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; +PFNGLDRAWBUFFERSARBPROC glad_glDrawBuffersARB = NULL; +PFNGLDRAWBUFFERSATIPROC glad_glDrawBuffersATI = NULL; +PFNGLDRAWCOMMANDSADDRESSNVPROC glad_glDrawCommandsAddressNV = NULL; +PFNGLDRAWCOMMANDSNVPROC glad_glDrawCommandsNV = NULL; +PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC glad_glDrawCommandsStatesAddressNV = NULL; +PFNGLDRAWCOMMANDSSTATESNVPROC glad_glDrawCommandsStatesNV = NULL; +PFNGLDRAWELEMENTARRAYAPPLEPROC glad_glDrawElementArrayAPPLE = NULL; +PFNGLDRAWELEMENTARRAYATIPROC glad_glDrawElementArrayATI = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDARBPROC glad_glDrawElementsInstancedARB = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDEXTPROC glad_glDrawElementsInstancedEXT = NULL; +PFNGLDRAWMESHARRAYSSUNPROC glad_glDrawMeshArraysSUN = NULL; +PFNGLDRAWMESHTASKSINDIRECTNVPROC glad_glDrawMeshTasksIndirectNV = NULL; +PFNGLDRAWMESHTASKSNVPROC glad_glDrawMeshTasksNV = NULL; +PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL; +PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC glad_glDrawRangeElementArrayAPPLE = NULL; +PFNGLDRAWRANGEELEMENTARRAYATIPROC glad_glDrawRangeElementArrayATI = NULL; +PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSEXTPROC glad_glDrawRangeElementsEXT = NULL; +PFNGLDRAWTEXTURENVPROC glad_glDrawTextureNV = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback = NULL; +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKNVPROC glad_glDrawTransformFeedbackNV = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced = NULL; +PFNGLDRAWVKIMAGENVPROC glad_glDrawVkImageNV = NULL; +PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC glad_glEGLImageTargetTexStorageEXT = NULL; +PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC glad_glEGLImageTargetTextureStorageEXT = NULL; +PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL; +PFNGLEDGEFLAGFORMATNVPROC glad_glEdgeFlagFormatNV = NULL; +PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL; +PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT = NULL; +PFNGLEDGEFLAGPOINTERLISTIBMPROC glad_glEdgeFlagPointerListIBM = NULL; +PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL; +PFNGLELEMENTPOINTERAPPLEPROC glad_glElementPointerAPPLE = NULL; +PFNGLELEMENTPOINTERATIPROC glad_glElementPointerATI = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL; +PFNGLENABLECLIENTSTATEINDEXEDEXTPROC glad_glEnableClientStateIndexedEXT = NULL; +PFNGLENABLECLIENTSTATEIEXTPROC glad_glEnableClientStateiEXT = NULL; +PFNGLENABLEINDEXEDEXTPROC glad_glEnableIndexedEXT = NULL; +PFNGLENABLEVARIANTCLIENTSTATEEXTPROC glad_glEnableVariantClientStateEXT = NULL; +PFNGLENABLEVERTEXARRAYATTRIBPROC glad_glEnableVertexArrayAttrib = NULL; +PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glad_glEnableVertexArrayAttribEXT = NULL; +PFNGLENABLEVERTEXARRAYEXTPROC glad_glEnableVertexArrayEXT = NULL; +PFNGLENABLEVERTEXATTRIBAPPLEPROC glad_glEnableVertexAttribAPPLE = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB = NULL; +PFNGLENABLEIPROC glad_glEnablei = NULL; +PFNGLENDPROC glad_glEnd = NULL; +PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; +PFNGLENDCONDITIONALRENDERNVPROC glad_glEndConditionalRenderNV = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC glad_glEndConditionalRenderNVX = NULL; +PFNGLENDFRAGMENTSHADERATIPROC glad_glEndFragmentShaderATI = NULL; +PFNGLENDLISTPROC glad_glEndList = NULL; +PFNGLENDOCCLUSIONQUERYNVPROC glad_glEndOcclusionQueryNV = NULL; +PFNGLENDPERFMONITORAMDPROC glad_glEndPerfMonitorAMD = NULL; +PFNGLENDPERFQUERYINTELPROC glad_glEndPerfQueryINTEL = NULL; +PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDQUERYARBPROC glad_glEndQueryARB = NULL; +PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; +PFNGLENDTRANSFORMFEEDBACKEXTPROC glad_glEndTransformFeedbackEXT = NULL; +PFNGLENDTRANSFORMFEEDBACKNVPROC glad_glEndTransformFeedbackNV = NULL; +PFNGLENDVERTEXSHADEREXTPROC glad_glEndVertexShaderEXT = NULL; +PFNGLENDVIDEOCAPTURENVPROC glad_glEndVideoCaptureNV = NULL; +PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL; +PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL; +PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL; +PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL; +PFNGLEVALCOORD1XOESPROC glad_glEvalCoord1xOES = NULL; +PFNGLEVALCOORD1XVOESPROC glad_glEvalCoord1xvOES = NULL; +PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL; +PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL; +PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL; +PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL; +PFNGLEVALCOORD2XOESPROC glad_glEvalCoord2xOES = NULL; +PFNGLEVALCOORD2XVOESPROC glad_glEvalCoord2xvOES = NULL; +PFNGLEVALMAPSNVPROC glad_glEvalMapsNV = NULL; +PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL; +PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL; +PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL; +PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL; +PFNGLEVALUATEDEPTHVALUESARBPROC glad_glEvaluateDepthValuesARB = NULL; +PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV = NULL; +PFNGLEXTRACTCOMPONENTEXTPROC glad_glExtractComponentEXT = NULL; +PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL; +PFNGLFEEDBACKBUFFERXOESPROC glad_glFeedbackBufferxOES = NULL; +PFNGLFENCESYNCPROC glad_glFenceSync = NULL; +PFNGLFINALCOMBINERINPUTNVPROC glad_glFinalCombinerInputNV = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFINISHASYNCSGIXPROC glad_glFinishAsyncSGIX = NULL; +PFNGLFINISHFENCEAPPLEPROC glad_glFinishFenceAPPLE = NULL; +PFNGLFINISHFENCENVPROC glad_glFinishFenceNV = NULL; +PFNGLFINISHOBJECTAPPLEPROC glad_glFinishObjectAPPLE = NULL; +PFNGLFINISHTEXTURESUNXPROC glad_glFinishTextureSUNX = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glad_glFlushMappedBufferRangeAPPLE = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glad_glFlushMappedNamedBufferRange = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC glad_glFlushMappedNamedBufferRangeEXT = NULL; +PFNGLFLUSHPIXELDATARANGENVPROC glad_glFlushPixelDataRangeNV = NULL; +PFNGLFLUSHRASTERSGIXPROC glad_glFlushRasterSGIX = NULL; +PFNGLFLUSHSTATICDATAIBMPROC glad_glFlushStaticDataIBM = NULL; +PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC glad_glFlushVertexArrayRangeAPPLE = NULL; +PFNGLFLUSHVERTEXARRAYRANGENVPROC glad_glFlushVertexArrayRangeNV = NULL; +PFNGLFOGCOORDFORMATNVPROC glad_glFogCoordFormatNV = NULL; +PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer = NULL; +PFNGLFOGCOORDPOINTEREXTPROC glad_glFogCoordPointerEXT = NULL; +PFNGLFOGCOORDPOINTERLISTIBMPROC glad_glFogCoordPointerListIBM = NULL; +PFNGLFOGCOORDDPROC glad_glFogCoordd = NULL; +PFNGLFOGCOORDDEXTPROC glad_glFogCoorddEXT = NULL; +PFNGLFOGCOORDDVPROC glad_glFogCoorddv = NULL; +PFNGLFOGCOORDDVEXTPROC glad_glFogCoorddvEXT = NULL; +PFNGLFOGCOORDFPROC glad_glFogCoordf = NULL; +PFNGLFOGCOORDFEXTPROC glad_glFogCoordfEXT = NULL; +PFNGLFOGCOORDFVPROC glad_glFogCoordfv = NULL; +PFNGLFOGCOORDFVEXTPROC glad_glFogCoordfvEXT = NULL; +PFNGLFOGCOORDHNVPROC glad_glFogCoordhNV = NULL; +PFNGLFOGCOORDHVNVPROC glad_glFogCoordhvNV = NULL; +PFNGLFOGFUNCSGISPROC glad_glFogFuncSGIS = NULL; +PFNGLFOGFPROC glad_glFogf = NULL; +PFNGLFOGFVPROC glad_glFogfv = NULL; +PFNGLFOGIPROC glad_glFogi = NULL; +PFNGLFOGIVPROC glad_glFogiv = NULL; +PFNGLFOGXOESPROC glad_glFogxOES = NULL; +PFNGLFOGXVOESPROC glad_glFogxvOES = NULL; +PFNGLFRAGMENTCOLORMATERIALSGIXPROC glad_glFragmentColorMaterialSGIX = NULL; +PFNGLFRAGMENTCOVERAGECOLORNVPROC glad_glFragmentCoverageColorNV = NULL; +PFNGLFRAGMENTLIGHTMODELFSGIXPROC glad_glFragmentLightModelfSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFVSGIXPROC glad_glFragmentLightModelfvSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELISGIXPROC glad_glFragmentLightModeliSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELIVSGIXPROC glad_glFragmentLightModelivSGIX = NULL; +PFNGLFRAGMENTLIGHTFSGIXPROC glad_glFragmentLightfSGIX = NULL; +PFNGLFRAGMENTLIGHTFVSGIXPROC glad_glFragmentLightfvSGIX = NULL; +PFNGLFRAGMENTLIGHTISGIXPROC glad_glFragmentLightiSGIX = NULL; +PFNGLFRAGMENTLIGHTIVSGIXPROC glad_glFragmentLightivSGIX = NULL; +PFNGLFRAGMENTMATERIALFSGIXPROC glad_glFragmentMaterialfSGIX = NULL; +PFNGLFRAGMENTMATERIALFVSGIXPROC glad_glFragmentMaterialfvSGIX = NULL; +PFNGLFRAGMENTMATERIALISGIXPROC glad_glFragmentMaterialiSGIX = NULL; +PFNGLFRAGMENTMATERIALIVSGIXPROC glad_glFragmentMaterialivSGIX = NULL; +PFNGLFRAMETERMINATORGREMEDYPROC glad_glFrameTerminatorGREMEDY = NULL; +PFNGLFRAMEZOOMSGIXPROC glad_glFrameZoomSGIX = NULL; +PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glad_glFramebufferDrawBufferEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glad_glFramebufferDrawBuffersEXT = NULL; +PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC glad_glFramebufferFetchBarrierEXT = NULL; +PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri = NULL; +PFNGLFRAMEBUFFERPARAMETERIMESAPROC glad_glFramebufferParameteriMESA = NULL; +PFNGLFRAMEBUFFERREADBUFFEREXTPROC glad_glFramebufferReadBufferEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL; +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC glad_glFramebufferSampleLocationsfvARB = NULL; +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glFramebufferSampleLocationsfvNV = NULL; +PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC glad_glFramebufferSamplePositionsfvAMD = NULL; +PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB = NULL; +PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB = NULL; +PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glad_glFramebufferTextureMultiviewOVR = NULL; +PFNGLFREEOBJECTBUFFERATIPROC glad_glFreeObjectBufferATI = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLFRUSTUMPROC glad_glFrustum = NULL; +PFNGLFRUSTUMFOESPROC glad_glFrustumfOES = NULL; +PFNGLFRUSTUMXOESPROC glad_glFrustumxOES = NULL; +PFNGLGENASYNCMARKERSSGIXPROC glad_glGenAsyncMarkersSGIX = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB = NULL; +PFNGLGENFENCESAPPLEPROC glad_glGenFencesAPPLE = NULL; +PFNGLGENFENCESNVPROC glad_glGenFencesNV = NULL; +PFNGLGENFRAGMENTSHADERSATIPROC glad_glGenFragmentShadersATI = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL; +PFNGLGENLISTSPROC glad_glGenLists = NULL; +PFNGLGENNAMESAMDPROC glad_glGenNamesAMD = NULL; +PFNGLGENOCCLUSIONQUERIESNVPROC glad_glGenOcclusionQueriesNV = NULL; +PFNGLGENPATHSNVPROC glad_glGenPathsNV = NULL; +PFNGLGENPERFMONITORSAMDPROC glad_glGenPerfMonitorsAMD = NULL; +PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL; +PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB = NULL; +PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV = NULL; +PFNGLGENQUERIESPROC glad_glGenQueries = NULL; +PFNGLGENQUERIESARBPROC glad_glGenQueriesARB = NULL; +PFNGLGENQUERYRESOURCETAGNVPROC glad_glGenQueryResourceTagNV = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL; +PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; +PFNGLGENSEMAPHORESEXTPROC glad_glGenSemaphoresEXT = NULL; +PFNGLGENSYMBOLSEXTPROC glad_glGenSymbolsEXT = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL; +PFNGLGENTRANSFORMFEEDBACKSNVPROC glad_glGenTransformFeedbacksNV = NULL; +PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; +PFNGLGENVERTEXARRAYSAPPLEPROC glad_glGenVertexArraysAPPLE = NULL; +PFNGLGENVERTEXSHADERSEXTPROC glad_glGenVertexShadersEXT = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL; +PFNGLGENERATEMULTITEXMIPMAPEXTPROC glad_glGenerateMultiTexMipmapEXT = NULL; +PFNGLGENERATETEXTUREMIPMAPPROC glad_glGenerateTextureMipmap = NULL; +PFNGLGENERATETEXTUREMIPMAPEXTPROC glad_glGenerateTextureMipmapEXT = NULL; +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB = NULL; +PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; +PFNGLGETACTIVEVARYINGNVPROC glad_glGetActiveVaryingNV = NULL; +PFNGLGETARRAYOBJECTFVATIPROC glad_glGetArrayObjectfvATI = NULL; +PFNGLGETARRAYOBJECTIVATIPROC glad_glGetArrayObjectivATI = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB = NULL; +PFNGLGETBOOLEANINDEXEDVEXTPROC glad_glGetBooleanIndexedvEXT = NULL; +PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB = NULL; +PFNGLGETBUFFERPARAMETERUI64VNVPROC glad_glGetBufferParameterui64vNV = NULL; +PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; +PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB = NULL; +PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; +PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB = NULL; +PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL; +PFNGLGETCLIPPLANEFOESPROC glad_glGetClipPlanefOES = NULL; +PFNGLGETCLIPPLANEXOESPROC glad_glGetClipPlanexOES = NULL; +PFNGLGETCOLORTABLEPROC glad_glGetColorTable = NULL; +PFNGLGETCOLORTABLEEXTPROC glad_glGetColorTableEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERFVEXTPROC glad_glGetColorTableParameterfvEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERFVSGIPROC glad_glGetColorTableParameterfvSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVEXTPROC glad_glGetColorTableParameterivEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERIVSGIPROC glad_glGetColorTableParameterivSGI = NULL; +PFNGLGETCOLORTABLESGIPROC glad_glGetColorTableSGI = NULL; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC glad_glGetCombinerInputParameterfvNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC glad_glGetCombinerInputParameterivNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC glad_glGetCombinerOutputParameterfvNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC glad_glGetCombinerOutputParameterivNV = NULL; +PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC glad_glGetCombinerStageParameterfvNV = NULL; +PFNGLGETCOMMANDHEADERNVPROC glad_glGetCommandHeaderNV = NULL; +PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glad_glGetCompressedMultiTexImageEXT = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glad_glGetCompressedTexImageARB = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glad_glGetCompressedTextureImage = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC glad_glGetCompressedTextureImageEXT = NULL; +PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glad_glGetCompressedTextureSubImage = NULL; +PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONFILTEREXTPROC glad_glGetConvolutionFilterEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC glad_glGetConvolutionParameterfvEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC glad_glGetConvolutionParameterivEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERXVOESPROC glad_glGetConvolutionParameterxvOES = NULL; +PFNGLGETCOVERAGEMODULATIONTABLENVPROC glad_glGetCoverageModulationTableNV = NULL; +PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL; +PFNGLGETDEBUGMESSAGELOGAMDPROC glad_glGetDebugMessageLogAMD = NULL; +PFNGLGETDEBUGMESSAGELOGARBPROC glad_glGetDebugMessageLogARB = NULL; +PFNGLGETDETAILTEXFUNCSGISPROC glad_glGetDetailTexFuncSGIS = NULL; +PFNGLGETDOUBLEINDEXEDVEXTPROC glad_glGetDoubleIndexedvEXT = NULL; +PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v = NULL; +PFNGLGETDOUBLEI_VEXTPROC glad_glGetDoublei_vEXT = NULL; +PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFENCEIVNVPROC glad_glGetFenceivNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC glad_glGetFinalCombinerInputParameterfvNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC glad_glGetFinalCombinerInputParameterivNV = NULL; +PFNGLGETFIRSTPERFQUERYIDINTELPROC glad_glGetFirstPerfQueryIdINTEL = NULL; +PFNGLGETFIXEDVOESPROC glad_glGetFixedvOES = NULL; +PFNGLGETFLOATINDEXEDVEXTPROC glad_glGetFloatIndexedvEXT = NULL; +PFNGLGETFLOATI_VPROC glad_glGetFloati_v = NULL; +PFNGLGETFLOATI_VEXTPROC glad_glGetFloati_vEXT = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFOGFUNCSGISPROC glad_glGetFogFuncSGIS = NULL; +PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; +PFNGLGETFRAGDATALOCATIONEXTPROC glad_glGetFragDataLocationEXT = NULL; +PFNGLGETFRAGMENTLIGHTFVSGIXPROC glad_glGetFragmentLightfvSGIX = NULL; +PFNGLGETFRAGMENTLIGHTIVSGIXPROC glad_glGetFragmentLightivSGIX = NULL; +PFNGLGETFRAGMENTMATERIALFVSGIXPROC glad_glGetFragmentMaterialfvSGIX = NULL; +PFNGLGETFRAGMENTMATERIALIVSGIXPROC glad_glGetFragmentMaterialivSGIX = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC glad_glGetFramebufferParameterfvAMD = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetFramebufferParameterivEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC glad_glGetFramebufferParameterivMESA = NULL; +PFNGLGETGRAPHICSRESETSTATUSPROC glad_glGetGraphicsResetStatus = NULL; +PFNGLGETGRAPHICSRESETSTATUSARBPROC glad_glGetGraphicsResetStatusARB = NULL; +PFNGLGETHANDLEARBPROC glad_glGetHandleARB = NULL; +PFNGLGETHISTOGRAMPROC glad_glGetHistogram = NULL; +PFNGLGETHISTOGRAMEXTPROC glad_glGetHistogramEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv = NULL; +PFNGLGETHISTOGRAMPARAMETERFVEXTPROC glad_glGetHistogramParameterfvEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv = NULL; +PFNGLGETHISTOGRAMPARAMETERIVEXTPROC glad_glGetHistogramParameterivEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERXVOESPROC glad_glGetHistogramParameterxvOES = NULL; +PFNGLGETIMAGEHANDLEARBPROC glad_glGetImageHandleARB = NULL; +PFNGLGETIMAGEHANDLENVPROC glad_glGetImageHandleNV = NULL; +PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC glad_glGetImageTransformParameterfvHP = NULL; +PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC glad_glGetImageTransformParameterivHP = NULL; +PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB = NULL; +PFNGLGETINSTRUMENTSSGIXPROC glad_glGetInstrumentsSGIX = NULL; +PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; +PFNGLGETINTEGERINDEXEDVEXTPROC glad_glGetIntegerIndexedvEXT = NULL; +PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; +PFNGLGETINTEGERUI64I_VNVPROC glad_glGetIntegerui64i_vNV = NULL; +PFNGLGETINTEGERUI64VNVPROC glad_glGetIntegerui64vNV = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETINTERNALFORMATSAMPLEIVNVPROC glad_glGetInternalformatSampleivNV = NULL; +PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v = NULL; +PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL; +PFNGLGETINVARIANTBOOLEANVEXTPROC glad_glGetInvariantBooleanvEXT = NULL; +PFNGLGETINVARIANTFLOATVEXTPROC glad_glGetInvariantFloatvEXT = NULL; +PFNGLGETINVARIANTINTEGERVEXTPROC glad_glGetInvariantIntegervEXT = NULL; +PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL; +PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL; +PFNGLGETLIGHTXOESPROC glad_glGetLightxOES = NULL; +PFNGLGETLISTPARAMETERFVSGIXPROC glad_glGetListParameterfvSGIX = NULL; +PFNGLGETLISTPARAMETERIVSGIXPROC glad_glGetListParameterivSGIX = NULL; +PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC glad_glGetLocalConstantBooleanvEXT = NULL; +PFNGLGETLOCALCONSTANTFLOATVEXTPROC glad_glGetLocalConstantFloatvEXT = NULL; +PFNGLGETLOCALCONSTANTINTEGERVEXTPROC glad_glGetLocalConstantIntegervEXT = NULL; +PFNGLGETMAPATTRIBPARAMETERFVNVPROC glad_glGetMapAttribParameterfvNV = NULL; +PFNGLGETMAPATTRIBPARAMETERIVNVPROC glad_glGetMapAttribParameterivNV = NULL; +PFNGLGETMAPCONTROLPOINTSNVPROC glad_glGetMapControlPointsNV = NULL; +PFNGLGETMAPPARAMETERFVNVPROC glad_glGetMapParameterfvNV = NULL; +PFNGLGETMAPPARAMETERIVNVPROC glad_glGetMapParameterivNV = NULL; +PFNGLGETMAPDVPROC glad_glGetMapdv = NULL; +PFNGLGETMAPFVPROC glad_glGetMapfv = NULL; +PFNGLGETMAPIVPROC glad_glGetMapiv = NULL; +PFNGLGETMAPXVOESPROC glad_glGetMapxvOES = NULL; +PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL; +PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL; +PFNGLGETMATERIALXOESPROC glad_glGetMaterialxOES = NULL; +PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC glad_glGetMemoryObjectDetachedResourcesuivNV = NULL; +PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC glad_glGetMemoryObjectParameterivEXT = NULL; +PFNGLGETMINMAXPROC glad_glGetMinmax = NULL; +PFNGLGETMINMAXEXTPROC glad_glGetMinmaxEXT = NULL; +PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv = NULL; +PFNGLGETMINMAXPARAMETERFVEXTPROC glad_glGetMinmaxParameterfvEXT = NULL; +PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv = NULL; +PFNGLGETMINMAXPARAMETERIVEXTPROC glad_glGetMinmaxParameterivEXT = NULL; +PFNGLGETMULTITEXENVFVEXTPROC glad_glGetMultiTexEnvfvEXT = NULL; +PFNGLGETMULTITEXENVIVEXTPROC glad_glGetMultiTexEnvivEXT = NULL; +PFNGLGETMULTITEXGENDVEXTPROC glad_glGetMultiTexGendvEXT = NULL; +PFNGLGETMULTITEXGENFVEXTPROC glad_glGetMultiTexGenfvEXT = NULL; +PFNGLGETMULTITEXGENIVEXTPROC glad_glGetMultiTexGenivEXT = NULL; +PFNGLGETMULTITEXIMAGEEXTPROC glad_glGetMultiTexImageEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glad_glGetMultiTexLevelParameterfvEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glad_glGetMultiTexLevelParameterivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIIVEXTPROC glad_glGetMultiTexParameterIivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIUIVEXTPROC glad_glGetMultiTexParameterIuivEXT = NULL; +PFNGLGETMULTITEXPARAMETERFVEXTPROC glad_glGetMultiTexParameterfvEXT = NULL; +PFNGLGETMULTITEXPARAMETERIVEXTPROC glad_glGetMultiTexParameterivEXT = NULL; +PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETMULTISAMPLEFVNVPROC glad_glGetMultisamplefvNV = NULL; +PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glad_glGetNamedBufferParameteri64v = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC glad_glGetNamedBufferParameteriv = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glad_glGetNamedBufferParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC glad_glGetNamedBufferParameterui64vNV = NULL; +PFNGLGETNAMEDBUFFERPOINTERVPROC glad_glGetNamedBufferPointerv = NULL; +PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glad_glGetNamedBufferPointervEXT = NULL; +PFNGLGETNAMEDBUFFERSUBDATAPROC glad_glGetNamedBufferSubData = NULL; +PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glad_glGetNamedBufferSubDataEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetNamedFramebufferAttachmentParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetNamedFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC glad_glGetNamedFramebufferParameterfvAMD = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glad_glGetNamedFramebufferParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetNamedFramebufferParameterivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC glad_glGetNamedProgramLocalParameterIivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC glad_glGetNamedProgramLocalParameterIuivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC glad_glGetNamedProgramLocalParameterdvEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC glad_glGetNamedProgramLocalParameterfvEXT = NULL; +PFNGLGETNAMEDPROGRAMSTRINGEXTPROC glad_glGetNamedProgramStringEXT = NULL; +PFNGLGETNAMEDPROGRAMIVEXTPROC glad_glGetNamedProgramivEXT = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glad_glGetNamedRenderbufferParameteriv = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glad_glGetNamedRenderbufferParameterivEXT = NULL; +PFNGLGETNAMEDSTRINGARBPROC glad_glGetNamedStringARB = NULL; +PFNGLGETNAMEDSTRINGIVARBPROC glad_glGetNamedStringivARB = NULL; +PFNGLGETNEXTPERFQUERYIDINTELPROC glad_glGetNextPerfQueryIdINTEL = NULL; +PFNGLGETOBJECTBUFFERFVATIPROC glad_glGetObjectBufferfvATI = NULL; +PFNGLGETOBJECTBUFFERIVATIPROC glad_glGetObjectBufferivATI = NULL; +PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL; +PFNGLGETOBJECTLABELEXTPROC glad_glGetObjectLabelEXT = NULL; +PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB = NULL; +PFNGLGETOBJECTPARAMETERIVAPPLEPROC glad_glGetObjectParameterivAPPLE = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB = NULL; +PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL; +PFNGLGETOCCLUSIONQUERYIVNVPROC glad_glGetOcclusionQueryivNV = NULL; +PFNGLGETOCCLUSIONQUERYUIVNVPROC glad_glGetOcclusionQueryuivNV = NULL; +PFNGLGETPATHCOLORGENFVNVPROC glad_glGetPathColorGenfvNV = NULL; +PFNGLGETPATHCOLORGENIVNVPROC glad_glGetPathColorGenivNV = NULL; +PFNGLGETPATHCOMMANDSNVPROC glad_glGetPathCommandsNV = NULL; +PFNGLGETPATHCOORDSNVPROC glad_glGetPathCoordsNV = NULL; +PFNGLGETPATHDASHARRAYNVPROC glad_glGetPathDashArrayNV = NULL; +PFNGLGETPATHLENGTHNVPROC glad_glGetPathLengthNV = NULL; +PFNGLGETPATHMETRICRANGENVPROC glad_glGetPathMetricRangeNV = NULL; +PFNGLGETPATHMETRICSNVPROC glad_glGetPathMetricsNV = NULL; +PFNGLGETPATHPARAMETERFVNVPROC glad_glGetPathParameterfvNV = NULL; +PFNGLGETPATHPARAMETERIVNVPROC glad_glGetPathParameterivNV = NULL; +PFNGLGETPATHSPACINGNVPROC glad_glGetPathSpacingNV = NULL; +PFNGLGETPATHTEXGENFVNVPROC glad_glGetPathTexGenfvNV = NULL; +PFNGLGETPATHTEXGENIVNVPROC glad_glGetPathTexGenivNV = NULL; +PFNGLGETPERFCOUNTERINFOINTELPROC glad_glGetPerfCounterInfoINTEL = NULL; +PFNGLGETPERFMONITORCOUNTERDATAAMDPROC glad_glGetPerfMonitorCounterDataAMD = NULL; +PFNGLGETPERFMONITORCOUNTERINFOAMDPROC glad_glGetPerfMonitorCounterInfoAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC glad_glGetPerfMonitorCounterStringAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSAMDPROC glad_glGetPerfMonitorCountersAMD = NULL; +PFNGLGETPERFMONITORGROUPSTRINGAMDPROC glad_glGetPerfMonitorGroupStringAMD = NULL; +PFNGLGETPERFMONITORGROUPSAMDPROC glad_glGetPerfMonitorGroupsAMD = NULL; +PFNGLGETPERFQUERYDATAINTELPROC glad_glGetPerfQueryDataINTEL = NULL; +PFNGLGETPERFQUERYIDBYNAMEINTELPROC glad_glGetPerfQueryIdByNameINTEL = NULL; +PFNGLGETPERFQUERYINFOINTELPROC glad_glGetPerfQueryInfoINTEL = NULL; +PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL; +PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL; +PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL; +PFNGLGETPIXELMAPXVPROC glad_glGetPixelMapxv = NULL; +PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC glad_glGetPixelTexGenParameterfvSGIS = NULL; +PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC glad_glGetPixelTexGenParameterivSGIS = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC glad_glGetPixelTransformParameterfvEXT = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC glad_glGetPixelTransformParameterivEXT = NULL; +PFNGLGETPOINTERINDEXEDVEXTPROC glad_glGetPointerIndexedvEXT = NULL; +PFNGLGETPOINTERI_VEXTPROC glad_glGetPointeri_vEXT = NULL; +PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL; +PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT = NULL; +PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL; +PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL; +PFNGLGETPROGRAMENVPARAMETERIIVNVPROC glad_glGetProgramEnvParameterIivNV = NULL; +PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC glad_glGetProgramEnvParameterIuivNV = NULL; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB = NULL; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv = NULL; +PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC glad_glGetProgramLocalParameterIivNV = NULL; +PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC glad_glGetProgramLocalParameterIuivNV = NULL; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB = NULL; +PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC glad_glGetProgramNamedParameterdvNV = NULL; +PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC glad_glGetProgramNamedParameterfvNV = NULL; +PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV = NULL; +PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL; +PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEFVNVPROC glad_glGetProgramResourcefvNV = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv = NULL; +PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB = NULL; +PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV = NULL; +PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC glad_glGetProgramSubroutineParameteruivNV = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB = NULL; +PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV = NULL; +PFNGLGETQUERYBUFFEROBJECTI64VPROC glad_glGetQueryBufferObjecti64v = NULL; +PFNGLGETQUERYBUFFEROBJECTIVPROC glad_glGetQueryBufferObjectiv = NULL; +PFNGLGETQUERYBUFFEROBJECTUI64VPROC glad_glGetQueryBufferObjectui64v = NULL; +PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv = NULL; +PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv = NULL; +PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTI64VEXTPROC glad_glGetQueryObjecti64vEXT = NULL; +PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTIVARBPROC glad_glGetQueryObjectivARB = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUI64VEXTPROC glad_glGetQueryObjectui64vEXT = NULL; +PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYOBJECTUIVARBPROC glad_glGetQueryObjectuivARB = NULL; +PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; +PFNGLGETQUERYIVARBPROC glad_glGetQueryivARB = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; +PFNGLGETSEMAPHOREPARAMETERIVNVPROC glad_glGetSemaphoreParameterivNV = NULL; +PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC glad_glGetSemaphoreParameterui64vEXT = NULL; +PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter = NULL; +PFNGLGETSEPARABLEFILTEREXTPROC glad_glGetSeparableFilterEXT = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSHADINGRATEIMAGEPALETTENVPROC glad_glGetShadingRateImagePaletteNV = NULL; +PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC glad_glGetShadingRateSampleLocationivNV = NULL; +PFNGLGETSHARPENTEXFUNCSGISPROC glad_glGetSharpenTexFuncSGIS = NULL; +PFNGLGETSTAGEINDEXNVPROC glad_glGetStageIndexNV = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation = NULL; +PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; +PFNGLGETTEXBUMPPARAMETERFVATIPROC glad_glGetTexBumpParameterfvATI = NULL; +PFNGLGETTEXBUMPPARAMETERIVATIPROC glad_glGetTexBumpParameterivATI = NULL; +PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL; +PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL; +PFNGLGETTEXENVXVOESPROC glad_glGetTexEnvxvOES = NULL; +PFNGLGETTEXFILTERFUNCSGISPROC glad_glGetTexFilterFuncSGIS = NULL; +PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL; +PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL; +PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL; +PFNGLGETTEXGENXVOESPROC glad_glGetTexGenxvOES = NULL; +PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXLEVELPARAMETERXVOESPROC glad_glGetTexLevelParameterxvOES = NULL; +PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIIVEXTPROC glad_glGetTexParameterIivEXT = NULL; +PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; +PFNGLGETTEXPARAMETERIUIVEXTPROC glad_glGetTexParameterIuivEXT = NULL; +PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC glad_glGetTexParameterPointervAPPLE = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETTEXPARAMETERXVOESPROC glad_glGetTexParameterxvOES = NULL; +PFNGLGETTEXTUREHANDLEARBPROC glad_glGetTextureHandleARB = NULL; +PFNGLGETTEXTUREHANDLENVPROC glad_glGetTextureHandleNV = NULL; +PFNGLGETTEXTUREIMAGEPROC glad_glGetTextureImage = NULL; +PFNGLGETTEXTUREIMAGEEXTPROC glad_glGetTextureImageEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVPROC glad_glGetTextureLevelParameterfv = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC glad_glGetTextureLevelParameterfvEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVPROC glad_glGetTextureLevelParameteriv = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC glad_glGetTextureLevelParameterivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIIVPROC glad_glGetTextureParameterIiv = NULL; +PFNGLGETTEXTUREPARAMETERIIVEXTPROC glad_glGetTextureParameterIivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIUIVPROC glad_glGetTextureParameterIuiv = NULL; +PFNGLGETTEXTUREPARAMETERIUIVEXTPROC glad_glGetTextureParameterIuivEXT = NULL; +PFNGLGETTEXTUREPARAMETERFVPROC glad_glGetTextureParameterfv = NULL; +PFNGLGETTEXTUREPARAMETERFVEXTPROC glad_glGetTextureParameterfvEXT = NULL; +PFNGLGETTEXTUREPARAMETERIVPROC glad_glGetTextureParameteriv = NULL; +PFNGLGETTEXTUREPARAMETERIVEXTPROC glad_glGetTextureParameterivEXT = NULL; +PFNGLGETTEXTURESAMPLERHANDLEARBPROC glad_glGetTextureSamplerHandleARB = NULL; +PFNGLGETTEXTURESAMPLERHANDLENVPROC glad_glGetTextureSamplerHandleNV = NULL; +PFNGLGETTEXTURESUBIMAGEPROC glad_glGetTextureSubImage = NULL; +PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC glad_glGetTransformFeedbackVaryingEXT = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC glad_glGetTransformFeedbackVaryingNV = NULL; +PFNGLGETTRANSFORMFEEDBACKI64_VPROC glad_glGetTransformFeedbacki64_v = NULL; +PFNGLGETTRANSFORMFEEDBACKI_VPROC glad_glGetTransformFeedbacki_v = NULL; +PFNGLGETTRANSFORMFEEDBACKIVPROC glad_glGetTransformFeedbackiv = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMBUFFERSIZEEXTPROC glad_glGetUniformBufferSizeEXT = NULL; +PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB = NULL; +PFNGLGETUNIFORMOFFSETEXTPROC glad_glGetUniformOffsetEXT = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv = NULL; +PFNGLGETUNIFORMDVPROC glad_glGetUniformdv = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB = NULL; +PFNGLGETUNIFORMI64VARBPROC glad_glGetUniformi64vARB = NULL; +PFNGLGETUNIFORMI64VNVPROC glad_glGetUniformi64vNV = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB = NULL; +PFNGLGETUNIFORMUI64VARBPROC glad_glGetUniformui64vARB = NULL; +PFNGLGETUNIFORMUI64VNVPROC glad_glGetUniformui64vNV = NULL; +PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; +PFNGLGETUNIFORMUIVEXTPROC glad_glGetUniformuivEXT = NULL; +PFNGLGETUNSIGNEDBYTEI_VEXTPROC glad_glGetUnsignedBytei_vEXT = NULL; +PFNGLGETUNSIGNEDBYTEVEXTPROC glad_glGetUnsignedBytevEXT = NULL; +PFNGLGETVARIANTARRAYOBJECTFVATIPROC glad_glGetVariantArrayObjectfvATI = NULL; +PFNGLGETVARIANTARRAYOBJECTIVATIPROC glad_glGetVariantArrayObjectivATI = NULL; +PFNGLGETVARIANTBOOLEANVEXTPROC glad_glGetVariantBooleanvEXT = NULL; +PFNGLGETVARIANTFLOATVEXTPROC glad_glGetVariantFloatvEXT = NULL; +PFNGLGETVARIANTINTEGERVEXTPROC glad_glGetVariantIntegervEXT = NULL; +PFNGLGETVARIANTPOINTERVEXTPROC glad_glGetVariantPointervEXT = NULL; +PFNGLGETVARYINGLOCATIONNVPROC glad_glGetVaryingLocationNV = NULL; +PFNGLGETVERTEXARRAYINDEXED64IVPROC glad_glGetVertexArrayIndexed64iv = NULL; +PFNGLGETVERTEXARRAYINDEXEDIVPROC glad_glGetVertexArrayIndexediv = NULL; +PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glad_glGetVertexArrayIntegeri_vEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERVEXTPROC glad_glGetVertexArrayIntegervEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC glad_glGetVertexArrayPointeri_vEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERVEXTPROC glad_glGetVertexArrayPointervEXT = NULL; +PFNGLGETVERTEXARRAYIVPROC glad_glGetVertexArrayiv = NULL; +PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC glad_glGetVertexAttribArrayObjectfvATI = NULL; +PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC glad_glGetVertexAttribArrayObjectivATI = NULL; +PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIIVEXTPROC glad_glGetVertexAttribIivEXT = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBIUIVEXTPROC glad_glGetVertexAttribIuivEXT = NULL; +PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv = NULL; +PFNGLGETVERTEXATTRIBLDVEXTPROC glad_glGetVertexAttribLdvEXT = NULL; +PFNGLGETVERTEXATTRIBLI64VNVPROC glad_glGetVertexAttribLi64vNV = NULL; +PFNGLGETVERTEXATTRIBLUI64VARBPROC glad_glGetVertexAttribLui64vARB = NULL; +PFNGLGETVERTEXATTRIBLUI64VNVPROC glad_glGetVertexAttribLui64vNV = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB = NULL; +PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV = NULL; +PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB = NULL; +PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB = NULL; +PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB = NULL; +PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMDVNVPROC glad_glGetVideoCaptureStreamdvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMFVNVPROC glad_glGetVideoCaptureStreamfvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMIVNVPROC glad_glGetVideoCaptureStreamivNV = NULL; +PFNGLGETVIDEOCAPTUREIVNVPROC glad_glGetVideoCaptureivNV = NULL; +PFNGLGETVIDEOI64VNVPROC glad_glGetVideoi64vNV = NULL; +PFNGLGETVIDEOIVNVPROC glad_glGetVideoivNV = NULL; +PFNGLGETVIDEOUI64VNVPROC glad_glGetVideoui64vNV = NULL; +PFNGLGETVIDEOUIVNVPROC glad_glGetVideouivNV = NULL; +PFNGLGETVKPROCADDRNVPROC glad_glGetVkProcAddrNV = NULL; +PFNGLGETNCOLORTABLEPROC glad_glGetnColorTable = NULL; +PFNGLGETNCOLORTABLEARBPROC glad_glGetnColorTableARB = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEPROC glad_glGetnCompressedTexImage = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC glad_glGetnCompressedTexImageARB = NULL; +PFNGLGETNCONVOLUTIONFILTERPROC glad_glGetnConvolutionFilter = NULL; +PFNGLGETNCONVOLUTIONFILTERARBPROC glad_glGetnConvolutionFilterARB = NULL; +PFNGLGETNHISTOGRAMPROC glad_glGetnHistogram = NULL; +PFNGLGETNHISTOGRAMARBPROC glad_glGetnHistogramARB = NULL; +PFNGLGETNMAPDVPROC glad_glGetnMapdv = NULL; +PFNGLGETNMAPDVARBPROC glad_glGetnMapdvARB = NULL; +PFNGLGETNMAPFVPROC glad_glGetnMapfv = NULL; +PFNGLGETNMAPFVARBPROC glad_glGetnMapfvARB = NULL; +PFNGLGETNMAPIVPROC glad_glGetnMapiv = NULL; +PFNGLGETNMAPIVARBPROC glad_glGetnMapivARB = NULL; +PFNGLGETNMINMAXPROC glad_glGetnMinmax = NULL; +PFNGLGETNMINMAXARBPROC glad_glGetnMinmaxARB = NULL; +PFNGLGETNPIXELMAPFVPROC glad_glGetnPixelMapfv = NULL; +PFNGLGETNPIXELMAPFVARBPROC glad_glGetnPixelMapfvARB = NULL; +PFNGLGETNPIXELMAPUIVPROC glad_glGetnPixelMapuiv = NULL; +PFNGLGETNPIXELMAPUIVARBPROC glad_glGetnPixelMapuivARB = NULL; +PFNGLGETNPIXELMAPUSVPROC glad_glGetnPixelMapusv = NULL; +PFNGLGETNPIXELMAPUSVARBPROC glad_glGetnPixelMapusvARB = NULL; +PFNGLGETNPOLYGONSTIPPLEPROC glad_glGetnPolygonStipple = NULL; +PFNGLGETNPOLYGONSTIPPLEARBPROC glad_glGetnPolygonStippleARB = NULL; +PFNGLGETNSEPARABLEFILTERPROC glad_glGetnSeparableFilter = NULL; +PFNGLGETNSEPARABLEFILTERARBPROC glad_glGetnSeparableFilterARB = NULL; +PFNGLGETNTEXIMAGEPROC glad_glGetnTexImage = NULL; +PFNGLGETNTEXIMAGEARBPROC glad_glGetnTexImageARB = NULL; +PFNGLGETNUNIFORMDVPROC glad_glGetnUniformdv = NULL; +PFNGLGETNUNIFORMDVARBPROC glad_glGetnUniformdvARB = NULL; +PFNGLGETNUNIFORMFVPROC glad_glGetnUniformfv = NULL; +PFNGLGETNUNIFORMFVARBPROC glad_glGetnUniformfvARB = NULL; +PFNGLGETNUNIFORMI64VARBPROC glad_glGetnUniformi64vARB = NULL; +PFNGLGETNUNIFORMIVPROC glad_glGetnUniformiv = NULL; +PFNGLGETNUNIFORMIVARBPROC glad_glGetnUniformivARB = NULL; +PFNGLGETNUNIFORMUI64VARBPROC glad_glGetnUniformui64vARB = NULL; +PFNGLGETNUNIFORMUIVPROC glad_glGetnUniformuiv = NULL; +PFNGLGETNUNIFORMUIVARBPROC glad_glGetnUniformuivARB = NULL; +PFNGLGLOBALALPHAFACTORBSUNPROC glad_glGlobalAlphaFactorbSUN = NULL; +PFNGLGLOBALALPHAFACTORDSUNPROC glad_glGlobalAlphaFactordSUN = NULL; +PFNGLGLOBALALPHAFACTORFSUNPROC glad_glGlobalAlphaFactorfSUN = NULL; +PFNGLGLOBALALPHAFACTORISUNPROC glad_glGlobalAlphaFactoriSUN = NULL; +PFNGLGLOBALALPHAFACTORSSUNPROC glad_glGlobalAlphaFactorsSUN = NULL; +PFNGLGLOBALALPHAFACTORUBSUNPROC glad_glGlobalAlphaFactorubSUN = NULL; +PFNGLGLOBALALPHAFACTORUISUNPROC glad_glGlobalAlphaFactoruiSUN = NULL; +PFNGLGLOBALALPHAFACTORUSSUNPROC glad_glGlobalAlphaFactorusSUN = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLHINTPGIPROC glad_glHintPGI = NULL; +PFNGLHISTOGRAMPROC glad_glHistogram = NULL; +PFNGLHISTOGRAMEXTPROC glad_glHistogramEXT = NULL; +PFNGLIGLOOINTERFACESGIXPROC glad_glIglooInterfaceSGIX = NULL; +PFNGLIMAGETRANSFORMPARAMETERFHPPROC glad_glImageTransformParameterfHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFVHPPROC glad_glImageTransformParameterfvHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIHPPROC glad_glImageTransformParameteriHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIVHPPROC glad_glImageTransformParameterivHP = NULL; +PFNGLIMPORTMEMORYFDEXTPROC glad_glImportMemoryFdEXT = NULL; +PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC glad_glImportMemoryWin32HandleEXT = NULL; +PFNGLIMPORTMEMORYWIN32NAMEEXTPROC glad_glImportMemoryWin32NameEXT = NULL; +PFNGLIMPORTSEMAPHOREFDEXTPROC glad_glImportSemaphoreFdEXT = NULL; +PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC glad_glImportSemaphoreWin32HandleEXT = NULL; +PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC glad_glImportSemaphoreWin32NameEXT = NULL; +PFNGLIMPORTSYNCEXTPROC glad_glImportSyncEXT = NULL; +PFNGLINDEXFORMATNVPROC glad_glIndexFormatNV = NULL; +PFNGLINDEXFUNCEXTPROC glad_glIndexFuncEXT = NULL; +PFNGLINDEXMASKPROC glad_glIndexMask = NULL; +PFNGLINDEXMATERIALEXTPROC glad_glIndexMaterialEXT = NULL; +PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL; +PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT = NULL; +PFNGLINDEXPOINTERLISTIBMPROC glad_glIndexPointerListIBM = NULL; +PFNGLINDEXDPROC glad_glIndexd = NULL; +PFNGLINDEXDVPROC glad_glIndexdv = NULL; +PFNGLINDEXFPROC glad_glIndexf = NULL; +PFNGLINDEXFVPROC glad_glIndexfv = NULL; +PFNGLINDEXIPROC glad_glIndexi = NULL; +PFNGLINDEXIVPROC glad_glIndexiv = NULL; +PFNGLINDEXSPROC glad_glIndexs = NULL; +PFNGLINDEXSVPROC glad_glIndexsv = NULL; +PFNGLINDEXUBPROC glad_glIndexub = NULL; +PFNGLINDEXUBVPROC glad_glIndexubv = NULL; +PFNGLINDEXXOESPROC glad_glIndexxOES = NULL; +PFNGLINDEXXVOESPROC glad_glIndexxvOES = NULL; +PFNGLINITNAMESPROC glad_glInitNames = NULL; +PFNGLINSERTCOMPONENTEXTPROC glad_glInsertComponentEXT = NULL; +PFNGLINSERTEVENTMARKEREXTPROC glad_glInsertEventMarkerEXT = NULL; +PFNGLINSTRUMENTSBUFFERSGIXPROC glad_glInstrumentsBufferSGIX = NULL; +PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL; +PFNGLINTERPOLATEPATHSNVPROC glad_glInterpolatePathsNV = NULL; +PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glad_glInvalidateNamedFramebufferData = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glad_glInvalidateNamedFramebufferSubData = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage = NULL; +PFNGLISASYNCMARKERSGIXPROC glad_glIsAsyncMarkerSGIX = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISBUFFERARBPROC glad_glIsBufferARB = NULL; +PFNGLISBUFFERRESIDENTNVPROC glad_glIsBufferResidentNV = NULL; +PFNGLISCOMMANDLISTNVPROC glad_glIsCommandListNV = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISENABLEDINDEXEDEXTPROC glad_glIsEnabledIndexedEXT = NULL; +PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; +PFNGLISFENCEAPPLEPROC glad_glIsFenceAPPLE = NULL; +PFNGLISFENCENVPROC glad_glIsFenceNV = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL; +PFNGLISIMAGEHANDLERESIDENTARBPROC glad_glIsImageHandleResidentARB = NULL; +PFNGLISIMAGEHANDLERESIDENTNVPROC glad_glIsImageHandleResidentNV = NULL; +PFNGLISLISTPROC glad_glIsList = NULL; +PFNGLISMEMORYOBJECTEXTPROC glad_glIsMemoryObjectEXT = NULL; +PFNGLISNAMEAMDPROC glad_glIsNameAMD = NULL; +PFNGLISNAMEDBUFFERRESIDENTNVPROC glad_glIsNamedBufferResidentNV = NULL; +PFNGLISNAMEDSTRINGARBPROC glad_glIsNamedStringARB = NULL; +PFNGLISOBJECTBUFFERATIPROC glad_glIsObjectBufferATI = NULL; +PFNGLISOCCLUSIONQUERYNVPROC glad_glIsOcclusionQueryNV = NULL; +PFNGLISPATHNVPROC glad_glIsPathNV = NULL; +PFNGLISPOINTINFILLPATHNVPROC glad_glIsPointInFillPathNV = NULL; +PFNGLISPOINTINSTROKEPATHNVPROC glad_glIsPointInStrokePathNV = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISPROGRAMARBPROC glad_glIsProgramARB = NULL; +PFNGLISPROGRAMNVPROC glad_glIsProgramNV = NULL; +PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL; +PFNGLISQUERYPROC glad_glIsQuery = NULL; +PFNGLISQUERYARBPROC glad_glIsQueryARB = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL; +PFNGLISSAMPLERPROC glad_glIsSampler = NULL; +PFNGLISSEMAPHOREEXTPROC glad_glIsSemaphoreEXT = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISSTATENVPROC glad_glIsStateNV = NULL; +PFNGLISSYNCPROC glad_glIsSync = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT = NULL; +PFNGLISTEXTUREHANDLERESIDENTARBPROC glad_glIsTextureHandleResidentARB = NULL; +PFNGLISTEXTUREHANDLERESIDENTNVPROC glad_glIsTextureHandleResidentNV = NULL; +PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL; +PFNGLISTRANSFORMFEEDBACKNVPROC glad_glIsTransformFeedbackNV = NULL; +PFNGLISVARIANTENABLEDEXTPROC glad_glIsVariantEnabledEXT = NULL; +PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; +PFNGLISVERTEXARRAYAPPLEPROC glad_glIsVertexArrayAPPLE = NULL; +PFNGLISVERTEXATTRIBENABLEDAPPLEPROC glad_glIsVertexAttribEnabledAPPLE = NULL; +PFNGLLGPUCOPYIMAGESUBDATANVXPROC glad_glLGPUCopyImageSubDataNVX = NULL; +PFNGLLGPUINTERLOCKNVXPROC glad_glLGPUInterlockNVX = NULL; +PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC glad_glLGPUNamedBufferSubDataNVX = NULL; +PFNGLLABELOBJECTEXTPROC glad_glLabelObjectEXT = NULL; +PFNGLLIGHTENVISGIXPROC glad_glLightEnviSGIX = NULL; +PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL; +PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL; +PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL; +PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL; +PFNGLLIGHTMODELXOESPROC glad_glLightModelxOES = NULL; +PFNGLLIGHTMODELXVOESPROC glad_glLightModelxvOES = NULL; +PFNGLLIGHTFPROC glad_glLightf = NULL; +PFNGLLIGHTFVPROC glad_glLightfv = NULL; +PFNGLLIGHTIPROC glad_glLighti = NULL; +PFNGLLIGHTIVPROC glad_glLightiv = NULL; +PFNGLLIGHTXOESPROC glad_glLightxOES = NULL; +PFNGLLIGHTXVOESPROC glad_glLightxvOES = NULL; +PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINEWIDTHXOESPROC glad_glLineWidthxOES = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB = NULL; +PFNGLLISTBASEPROC glad_glListBase = NULL; +PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC glad_glListDrawCommandsStatesClientNV = NULL; +PFNGLLISTPARAMETERFSGIXPROC glad_glListParameterfSGIX = NULL; +PFNGLLISTPARAMETERFVSGIXPROC glad_glListParameterfvSGIX = NULL; +PFNGLLISTPARAMETERISGIXPROC glad_glListParameteriSGIX = NULL; +PFNGLLISTPARAMETERIVSGIXPROC glad_glListParameterivSGIX = NULL; +PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL; +PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC glad_glLoadIdentityDeformationMapSGIX = NULL; +PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL; +PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL; +PFNGLLOADMATRIXXOESPROC glad_glLoadMatrixxOES = NULL; +PFNGLLOADNAMEPROC glad_glLoadName = NULL; +PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXDARBPROC glad_glLoadTransposeMatrixdARB = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf = NULL; +PFNGLLOADTRANSPOSEMATRIXFARBPROC glad_glLoadTransposeMatrixfARB = NULL; +PFNGLLOADTRANSPOSEMATRIXXOESPROC glad_glLoadTransposeMatrixxOES = NULL; +PFNGLLOCKARRAYSEXTPROC glad_glLockArraysEXT = NULL; +PFNGLLOGICOPPROC glad_glLogicOp = NULL; +PFNGLMAKEBUFFERNONRESIDENTNVPROC glad_glMakeBufferNonResidentNV = NULL; +PFNGLMAKEBUFFERRESIDENTNVPROC glad_glMakeBufferResidentNV = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC glad_glMakeImageHandleNonResidentARB = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC glad_glMakeImageHandleNonResidentNV = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTARBPROC glad_glMakeImageHandleResidentARB = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTNVPROC glad_glMakeImageHandleResidentNV = NULL; +PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC glad_glMakeNamedBufferNonResidentNV = NULL; +PFNGLMAKENAMEDBUFFERRESIDENTNVPROC glad_glMakeNamedBufferResidentNV = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC glad_glMakeTextureHandleNonResidentARB = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC glad_glMakeTextureHandleNonResidentNV = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTARBPROC glad_glMakeTextureHandleResidentARB = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTNVPROC glad_glMakeTextureHandleResidentNV = NULL; +PFNGLMAP1DPROC glad_glMap1d = NULL; +PFNGLMAP1FPROC glad_glMap1f = NULL; +PFNGLMAP1XOESPROC glad_glMap1xOES = NULL; +PFNGLMAP2DPROC glad_glMap2d = NULL; +PFNGLMAP2FPROC glad_glMap2f = NULL; +PFNGLMAP2XOESPROC glad_glMap2xOES = NULL; +PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; +PFNGLMAPBUFFERARBPROC glad_glMapBufferARB = NULL; +PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMAPCONTROLPOINTSNVPROC glad_glMapControlPointsNV = NULL; +PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL; +PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL; +PFNGLMAPGRID1XOESPROC glad_glMapGrid1xOES = NULL; +PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL; +PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL; +PFNGLMAPGRID2XOESPROC glad_glMapGrid2xOES = NULL; +PFNGLMAPNAMEDBUFFERPROC glad_glMapNamedBuffer = NULL; +PFNGLMAPNAMEDBUFFEREXTPROC glad_glMapNamedBufferEXT = NULL; +PFNGLMAPNAMEDBUFFERRANGEPROC glad_glMapNamedBufferRange = NULL; +PFNGLMAPNAMEDBUFFERRANGEEXTPROC glad_glMapNamedBufferRangeEXT = NULL; +PFNGLMAPOBJECTBUFFERATIPROC glad_glMapObjectBufferATI = NULL; +PFNGLMAPPARAMETERFVNVPROC glad_glMapParameterfvNV = NULL; +PFNGLMAPPARAMETERIVNVPROC glad_glMapParameterivNV = NULL; +PFNGLMAPTEXTURE2DINTELPROC glad_glMapTexture2DINTEL = NULL; +PFNGLMAPVERTEXATTRIB1DAPPLEPROC glad_glMapVertexAttrib1dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB1FAPPLEPROC glad_glMapVertexAttrib1fAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2DAPPLEPROC glad_glMapVertexAttrib2dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2FAPPLEPROC glad_glMapVertexAttrib2fAPPLE = NULL; +PFNGLMATERIALFPROC glad_glMaterialf = NULL; +PFNGLMATERIALFVPROC glad_glMaterialfv = NULL; +PFNGLMATERIALIPROC glad_glMateriali = NULL; +PFNGLMATERIALIVPROC glad_glMaterialiv = NULL; +PFNGLMATERIALXOESPROC glad_glMaterialxOES = NULL; +PFNGLMATERIALXVOESPROC glad_glMaterialxvOES = NULL; +PFNGLMATRIXFRUSTUMEXTPROC glad_glMatrixFrustumEXT = NULL; +PFNGLMATRIXINDEXPOINTERARBPROC glad_glMatrixIndexPointerARB = NULL; +PFNGLMATRIXINDEXUBVARBPROC glad_glMatrixIndexubvARB = NULL; +PFNGLMATRIXINDEXUIVARBPROC glad_glMatrixIndexuivARB = NULL; +PFNGLMATRIXINDEXUSVARBPROC glad_glMatrixIndexusvARB = NULL; +PFNGLMATRIXLOAD3X2FNVPROC glad_glMatrixLoad3x2fNV = NULL; +PFNGLMATRIXLOAD3X3FNVPROC glad_glMatrixLoad3x3fNV = NULL; +PFNGLMATRIXLOADIDENTITYEXTPROC glad_glMatrixLoadIdentityEXT = NULL; +PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC glad_glMatrixLoadTranspose3x3fNV = NULL; +PFNGLMATRIXLOADTRANSPOSEDEXTPROC glad_glMatrixLoadTransposedEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEFEXTPROC glad_glMatrixLoadTransposefEXT = NULL; +PFNGLMATRIXLOADDEXTPROC glad_glMatrixLoaddEXT = NULL; +PFNGLMATRIXLOADFEXTPROC glad_glMatrixLoadfEXT = NULL; +PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL; +PFNGLMATRIXMULT3X2FNVPROC glad_glMatrixMult3x2fNV = NULL; +PFNGLMATRIXMULT3X3FNVPROC glad_glMatrixMult3x3fNV = NULL; +PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC glad_glMatrixMultTranspose3x3fNV = NULL; +PFNGLMATRIXMULTTRANSPOSEDEXTPROC glad_glMatrixMultTransposedEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEFEXTPROC glad_glMatrixMultTransposefEXT = NULL; +PFNGLMATRIXMULTDEXTPROC glad_glMatrixMultdEXT = NULL; +PFNGLMATRIXMULTFEXTPROC glad_glMatrixMultfEXT = NULL; +PFNGLMATRIXORTHOEXTPROC glad_glMatrixOrthoEXT = NULL; +PFNGLMATRIXPOPEXTPROC glad_glMatrixPopEXT = NULL; +PFNGLMATRIXPUSHEXTPROC glad_glMatrixPushEXT = NULL; +PFNGLMATRIXROTATEDEXTPROC glad_glMatrixRotatedEXT = NULL; +PFNGLMATRIXROTATEFEXTPROC glad_glMatrixRotatefEXT = NULL; +PFNGLMATRIXSCALEDEXTPROC glad_glMatrixScaledEXT = NULL; +PFNGLMATRIXSCALEFEXTPROC glad_glMatrixScalefEXT = NULL; +PFNGLMATRIXTRANSLATEDEXTPROC glad_glMatrixTranslatedEXT = NULL; +PFNGLMATRIXTRANSLATEFEXTPROC glad_glMatrixTranslatefEXT = NULL; +PFNGLMAXSHADERCOMPILERTHREADSARBPROC glad_glMaxShaderCompilerThreadsARB = NULL; +PFNGLMAXSHADERCOMPILERTHREADSKHRPROC glad_glMaxShaderCompilerThreadsKHR = NULL; +PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier = NULL; +PFNGLMEMORYBARRIERBYREGIONPROC glad_glMemoryBarrierByRegion = NULL; +PFNGLMEMORYBARRIEREXTPROC glad_glMemoryBarrierEXT = NULL; +PFNGLMEMORYOBJECTPARAMETERIVEXTPROC glad_glMemoryObjectParameterivEXT = NULL; +PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading = NULL; +PFNGLMINSAMPLESHADINGARBPROC glad_glMinSampleShadingARB = NULL; +PFNGLMINMAXPROC glad_glMinmax = NULL; +PFNGLMINMAXEXTPROC glad_glMinmaxEXT = NULL; +PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL; +PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL; +PFNGLMULTMATRIXXOESPROC glad_glMultMatrixxOES = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXDARBPROC glad_glMultTransposeMatrixdARB = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXFARBPROC glad_glMultTransposeMatrixfARB = NULL; +PFNGLMULTTRANSPOSEMATRIXXOESPROC glad_glMultTransposeMatrixxOES = NULL; +PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWARRAYSEXTPROC glad_glMultiDrawArraysEXT = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC glad_glMultiDrawArraysIndirectAMD = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC glad_glMultiDrawArraysIndirectBindlessCountNV = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC glad_glMultiDrawArraysIndirectBindlessNV = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glad_glMultiDrawArraysIndirectCount = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC glad_glMultiDrawArraysIndirectCountARB = NULL; +PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC glad_glMultiDrawElementArrayAPPLE = NULL; +PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSEXTPROC glad_glMultiDrawElementsEXT = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC glad_glMultiDrawElementsIndirectAMD = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC glad_glMultiDrawElementsIndirectBindlessCountNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC glad_glMultiDrawElementsIndirectBindlessNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glad_glMultiDrawElementsIndirectCount = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC glad_glMultiDrawElementsIndirectCountARB = NULL; +PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC glad_glMultiDrawMeshTasksIndirectCountNV = NULL; +PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC glad_glMultiDrawMeshTasksIndirectNV = NULL; +PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC glad_glMultiDrawRangeElementArrayAPPLE = NULL; +PFNGLMULTIMODEDRAWARRAYSIBMPROC glad_glMultiModeDrawArraysIBM = NULL; +PFNGLMULTIMODEDRAWELEMENTSIBMPROC glad_glMultiModeDrawElementsIBM = NULL; +PFNGLMULTITEXBUFFEREXTPROC glad_glMultiTexBufferEXT = NULL; +PFNGLMULTITEXCOORD1BOESPROC glad_glMultiTexCoord1bOES = NULL; +PFNGLMULTITEXCOORD1BVOESPROC glad_glMultiTexCoord1bvOES = NULL; +PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL; +PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB = NULL; +PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL; +PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB = NULL; +PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL; +PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB = NULL; +PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL; +PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB = NULL; +PFNGLMULTITEXCOORD1HNVPROC glad_glMultiTexCoord1hNV = NULL; +PFNGLMULTITEXCOORD1HVNVPROC glad_glMultiTexCoord1hvNV = NULL; +PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL; +PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB = NULL; +PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL; +PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB = NULL; +PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL; +PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB = NULL; +PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL; +PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB = NULL; +PFNGLMULTITEXCOORD1XOESPROC glad_glMultiTexCoord1xOES = NULL; +PFNGLMULTITEXCOORD1XVOESPROC glad_glMultiTexCoord1xvOES = NULL; +PFNGLMULTITEXCOORD2BOESPROC glad_glMultiTexCoord2bOES = NULL; +PFNGLMULTITEXCOORD2BVOESPROC glad_glMultiTexCoord2bvOES = NULL; +PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL; +PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB = NULL; +PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL; +PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB = NULL; +PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL; +PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB = NULL; +PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL; +PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB = NULL; +PFNGLMULTITEXCOORD2HNVPROC glad_glMultiTexCoord2hNV = NULL; +PFNGLMULTITEXCOORD2HVNVPROC glad_glMultiTexCoord2hvNV = NULL; +PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL; +PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB = NULL; +PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL; +PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB = NULL; +PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL; +PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB = NULL; +PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL; +PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB = NULL; +PFNGLMULTITEXCOORD2XOESPROC glad_glMultiTexCoord2xOES = NULL; +PFNGLMULTITEXCOORD2XVOESPROC glad_glMultiTexCoord2xvOES = NULL; +PFNGLMULTITEXCOORD3BOESPROC glad_glMultiTexCoord3bOES = NULL; +PFNGLMULTITEXCOORD3BVOESPROC glad_glMultiTexCoord3bvOES = NULL; +PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL; +PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB = NULL; +PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL; +PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB = NULL; +PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL; +PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB = NULL; +PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL; +PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB = NULL; +PFNGLMULTITEXCOORD3HNVPROC glad_glMultiTexCoord3hNV = NULL; +PFNGLMULTITEXCOORD3HVNVPROC glad_glMultiTexCoord3hvNV = NULL; +PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL; +PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB = NULL; +PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL; +PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB = NULL; +PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL; +PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB = NULL; +PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL; +PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB = NULL; +PFNGLMULTITEXCOORD3XOESPROC glad_glMultiTexCoord3xOES = NULL; +PFNGLMULTITEXCOORD3XVOESPROC glad_glMultiTexCoord3xvOES = NULL; +PFNGLMULTITEXCOORD4BOESPROC glad_glMultiTexCoord4bOES = NULL; +PFNGLMULTITEXCOORD4BVOESPROC glad_glMultiTexCoord4bvOES = NULL; +PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL; +PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB = NULL; +PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL; +PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB = NULL; +PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL; +PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB = NULL; +PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL; +PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB = NULL; +PFNGLMULTITEXCOORD4HNVPROC glad_glMultiTexCoord4hNV = NULL; +PFNGLMULTITEXCOORD4HVNVPROC glad_glMultiTexCoord4hvNV = NULL; +PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL; +PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB = NULL; +PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL; +PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB = NULL; +PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL; +PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB = NULL; +PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL; +PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB = NULL; +PFNGLMULTITEXCOORD4XOESPROC glad_glMultiTexCoord4xOES = NULL; +PFNGLMULTITEXCOORD4XVOESPROC glad_glMultiTexCoord4xvOES = NULL; +PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; +PFNGLMULTITEXCOORDPOINTEREXTPROC glad_glMultiTexCoordPointerEXT = NULL; +PFNGLMULTITEXENVFEXTPROC glad_glMultiTexEnvfEXT = NULL; +PFNGLMULTITEXENVFVEXTPROC glad_glMultiTexEnvfvEXT = NULL; +PFNGLMULTITEXENVIEXTPROC glad_glMultiTexEnviEXT = NULL; +PFNGLMULTITEXENVIVEXTPROC glad_glMultiTexEnvivEXT = NULL; +PFNGLMULTITEXGENDEXTPROC glad_glMultiTexGendEXT = NULL; +PFNGLMULTITEXGENDVEXTPROC glad_glMultiTexGendvEXT = NULL; +PFNGLMULTITEXGENFEXTPROC glad_glMultiTexGenfEXT = NULL; +PFNGLMULTITEXGENFVEXTPROC glad_glMultiTexGenfvEXT = NULL; +PFNGLMULTITEXGENIEXTPROC glad_glMultiTexGeniEXT = NULL; +PFNGLMULTITEXGENIVEXTPROC glad_glMultiTexGenivEXT = NULL; +PFNGLMULTITEXIMAGE1DEXTPROC glad_glMultiTexImage1DEXT = NULL; +PFNGLMULTITEXIMAGE2DEXTPROC glad_glMultiTexImage2DEXT = NULL; +PFNGLMULTITEXIMAGE3DEXTPROC glad_glMultiTexImage3DEXT = NULL; +PFNGLMULTITEXPARAMETERIIVEXTPROC glad_glMultiTexParameterIivEXT = NULL; +PFNGLMULTITEXPARAMETERIUIVEXTPROC glad_glMultiTexParameterIuivEXT = NULL; +PFNGLMULTITEXPARAMETERFEXTPROC glad_glMultiTexParameterfEXT = NULL; +PFNGLMULTITEXPARAMETERFVEXTPROC glad_glMultiTexParameterfvEXT = NULL; +PFNGLMULTITEXPARAMETERIEXTPROC glad_glMultiTexParameteriEXT = NULL; +PFNGLMULTITEXPARAMETERIVEXTPROC glad_glMultiTexParameterivEXT = NULL; +PFNGLMULTITEXRENDERBUFFEREXTPROC glad_glMultiTexRenderbufferEXT = NULL; +PFNGLMULTITEXSUBIMAGE1DEXTPROC glad_glMultiTexSubImage1DEXT = NULL; +PFNGLMULTITEXSUBIMAGE2DEXTPROC glad_glMultiTexSubImage2DEXT = NULL; +PFNGLMULTITEXSUBIMAGE3DEXTPROC glad_glMultiTexSubImage3DEXT = NULL; +PFNGLMULTICASTBARRIERNVPROC glad_glMulticastBarrierNV = NULL; +PFNGLMULTICASTBLITFRAMEBUFFERNVPROC glad_glMulticastBlitFramebufferNV = NULL; +PFNGLMULTICASTBUFFERSUBDATANVPROC glad_glMulticastBufferSubDataNV = NULL; +PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC glad_glMulticastCopyBufferSubDataNV = NULL; +PFNGLMULTICASTCOPYIMAGESUBDATANVPROC glad_glMulticastCopyImageSubDataNV = NULL; +PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glMulticastFramebufferSampleLocationsfvNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC glad_glMulticastGetQueryObjecti64vNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTIVNVPROC glad_glMulticastGetQueryObjectivNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC glad_glMulticastGetQueryObjectui64vNV = NULL; +PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC glad_glMulticastGetQueryObjectuivNV = NULL; +PFNGLMULTICASTSCISSORARRAYVNVXPROC glad_glMulticastScissorArrayvNVX = NULL; +PFNGLMULTICASTVIEWPORTARRAYVNVXPROC glad_glMulticastViewportArrayvNVX = NULL; +PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC glad_glMulticastViewportPositionWScaleNVX = NULL; +PFNGLMULTICASTWAITSYNCNVPROC glad_glMulticastWaitSyncNV = NULL; +PFNGLNAMEDBUFFERATTACHMEMORYNVPROC glad_glNamedBufferAttachMemoryNV = NULL; +PFNGLNAMEDBUFFERDATAPROC glad_glNamedBufferData = NULL; +PFNGLNAMEDBUFFERDATAEXTPROC glad_glNamedBufferDataEXT = NULL; +PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC glad_glNamedBufferPageCommitmentARB = NULL; +PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC glad_glNamedBufferPageCommitmentEXT = NULL; +PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC glad_glNamedBufferPageCommitmentMemNV = NULL; +PFNGLNAMEDBUFFERSTORAGEPROC glad_glNamedBufferStorage = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC glad_glNamedBufferStorageEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC glad_glNamedBufferStorageExternalEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC glad_glNamedBufferStorageMemEXT = NULL; +PFNGLNAMEDBUFFERSUBDATAPROC glad_glNamedBufferSubData = NULL; +PFNGLNAMEDBUFFERSUBDATAEXTPROC glad_glNamedBufferSubDataEXT = NULL; +PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glad_glNamedCopyBufferSubDataEXT = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glad_glNamedFramebufferDrawBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glad_glNamedFramebufferDrawBuffers = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glad_glNamedFramebufferParameteri = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glad_glNamedFramebufferParameteriEXT = NULL; +PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glad_glNamedFramebufferReadBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glad_glNamedFramebufferRenderbuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glad_glNamedFramebufferRenderbufferEXT = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC glad_glNamedFramebufferSampleLocationsfvARB = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC glad_glNamedFramebufferSampleLocationsfvNV = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC glad_glNamedFramebufferSamplePositionsfvAMD = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glad_glNamedFramebufferTexture = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glad_glNamedFramebufferTexture1DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glad_glNamedFramebufferTexture2DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glad_glNamedFramebufferTexture3DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glad_glNamedFramebufferTextureEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC glad_glNamedFramebufferTextureFaceEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glad_glNamedFramebufferTextureLayer = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glad_glNamedFramebufferTextureLayerEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC glad_glNamedProgramLocalParameter4dEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC glad_glNamedProgramLocalParameter4dvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC glad_glNamedProgramLocalParameter4fEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC glad_glNamedProgramLocalParameter4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC glad_glNamedProgramLocalParameterI4iEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC glad_glNamedProgramLocalParameterI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC glad_glNamedProgramLocalParameterI4uiEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC glad_glNamedProgramLocalParameterI4uivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glNamedProgramLocalParameters4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC glad_glNamedProgramLocalParametersI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC glad_glNamedProgramLocalParametersI4uivEXT = NULL; +PFNGLNAMEDPROGRAMSTRINGEXTPROC glad_glNamedProgramStringEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEPROC glad_glNamedRenderbufferStorage = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glad_glNamedRenderbufferStorageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glNamedRenderbufferStorageMultisample = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC glad_glNamedRenderbufferStorageMultisampleAdvancedAMD = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC glad_glNamedRenderbufferStorageMultisampleCoverageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glNamedRenderbufferStorageMultisampleEXT = NULL; +PFNGLNAMEDSTRINGARBPROC glad_glNamedStringARB = NULL; +PFNGLNEWLISTPROC glad_glNewList = NULL; +PFNGLNEWOBJECTBUFFERATIPROC glad_glNewObjectBufferATI = NULL; +PFNGLNORMAL3BPROC glad_glNormal3b = NULL; +PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL; +PFNGLNORMAL3DPROC glad_glNormal3d = NULL; +PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL; +PFNGLNORMAL3FPROC glad_glNormal3f = NULL; +PFNGLNORMAL3FVERTEX3FSUNPROC glad_glNormal3fVertex3fSUN = NULL; +PFNGLNORMAL3FVERTEX3FVSUNPROC glad_glNormal3fVertex3fvSUN = NULL; +PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL; +PFNGLNORMAL3HNVPROC glad_glNormal3hNV = NULL; +PFNGLNORMAL3HVNVPROC glad_glNormal3hvNV = NULL; +PFNGLNORMAL3IPROC glad_glNormal3i = NULL; +PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL; +PFNGLNORMAL3SPROC glad_glNormal3s = NULL; +PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL; +PFNGLNORMAL3XOESPROC glad_glNormal3xOES = NULL; +PFNGLNORMAL3XVOESPROC glad_glNormal3xvOES = NULL; +PFNGLNORMALFORMATNVPROC glad_glNormalFormatNV = NULL; +PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; +PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL; +PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT = NULL; +PFNGLNORMALPOINTERLISTIBMPROC glad_glNormalPointerListIBM = NULL; +PFNGLNORMALPOINTERVINTELPROC glad_glNormalPointervINTEL = NULL; +PFNGLNORMALSTREAM3BATIPROC glad_glNormalStream3bATI = NULL; +PFNGLNORMALSTREAM3BVATIPROC glad_glNormalStream3bvATI = NULL; +PFNGLNORMALSTREAM3DATIPROC glad_glNormalStream3dATI = NULL; +PFNGLNORMALSTREAM3DVATIPROC glad_glNormalStream3dvATI = NULL; +PFNGLNORMALSTREAM3FATIPROC glad_glNormalStream3fATI = NULL; +PFNGLNORMALSTREAM3FVATIPROC glad_glNormalStream3fvATI = NULL; +PFNGLNORMALSTREAM3IATIPROC glad_glNormalStream3iATI = NULL; +PFNGLNORMALSTREAM3IVATIPROC glad_glNormalStream3ivATI = NULL; +PFNGLNORMALSTREAM3SATIPROC glad_glNormalStream3sATI = NULL; +PFNGLNORMALSTREAM3SVATIPROC glad_glNormalStream3svATI = NULL; +PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL; +PFNGLOBJECTPURGEABLEAPPLEPROC glad_glObjectPurgeableAPPLE = NULL; +PFNGLOBJECTUNPURGEABLEAPPLEPROC glad_glObjectUnpurgeableAPPLE = NULL; +PFNGLORTHOPROC glad_glOrtho = NULL; +PFNGLORTHOFOESPROC glad_glOrthofOES = NULL; +PFNGLORTHOXOESPROC glad_glOrthoxOES = NULL; +PFNGLPNTRIANGLESFATIPROC glad_glPNTrianglesfATI = NULL; +PFNGLPNTRIANGLESIATIPROC glad_glPNTrianglesiATI = NULL; +PFNGLPASSTEXCOORDATIPROC glad_glPassTexCoordATI = NULL; +PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL; +PFNGLPASSTHROUGHXOESPROC glad_glPassThroughxOES = NULL; +PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri = NULL; +PFNGLPATHCOLORGENNVPROC glad_glPathColorGenNV = NULL; +PFNGLPATHCOMMANDSNVPROC glad_glPathCommandsNV = NULL; +PFNGLPATHCOORDSNVPROC glad_glPathCoordsNV = NULL; +PFNGLPATHCOVERDEPTHFUNCNVPROC glad_glPathCoverDepthFuncNV = NULL; +PFNGLPATHDASHARRAYNVPROC glad_glPathDashArrayNV = NULL; +PFNGLPATHFOGGENNVPROC glad_glPathFogGenNV = NULL; +PFNGLPATHGLYPHINDEXARRAYNVPROC glad_glPathGlyphIndexArrayNV = NULL; +PFNGLPATHGLYPHINDEXRANGENVPROC glad_glPathGlyphIndexRangeNV = NULL; +PFNGLPATHGLYPHRANGENVPROC glad_glPathGlyphRangeNV = NULL; +PFNGLPATHGLYPHSNVPROC glad_glPathGlyphsNV = NULL; +PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC glad_glPathMemoryGlyphIndexArrayNV = NULL; +PFNGLPATHPARAMETERFNVPROC glad_glPathParameterfNV = NULL; +PFNGLPATHPARAMETERFVNVPROC glad_glPathParameterfvNV = NULL; +PFNGLPATHPARAMETERINVPROC glad_glPathParameteriNV = NULL; +PFNGLPATHPARAMETERIVNVPROC glad_glPathParameterivNV = NULL; +PFNGLPATHSTENCILDEPTHOFFSETNVPROC glad_glPathStencilDepthOffsetNV = NULL; +PFNGLPATHSTENCILFUNCNVPROC glad_glPathStencilFuncNV = NULL; +PFNGLPATHSTRINGNVPROC glad_glPathStringNV = NULL; +PFNGLPATHSUBCOMMANDSNVPROC glad_glPathSubCommandsNV = NULL; +PFNGLPATHSUBCOORDSNVPROC glad_glPathSubCoordsNV = NULL; +PFNGLPATHTEXGENNVPROC glad_glPathTexGenNV = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL; +PFNGLPAUSETRANSFORMFEEDBACKNVPROC glad_glPauseTransformFeedbackNV = NULL; +PFNGLPIXELDATARANGENVPROC glad_glPixelDataRangeNV = NULL; +PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL; +PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL; +PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL; +PFNGLPIXELMAPXPROC glad_glPixelMapx = NULL; +PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPIXELSTOREXPROC glad_glPixelStorex = NULL; +PFNGLPIXELTEXGENPARAMETERFSGISPROC glad_glPixelTexGenParameterfSGIS = NULL; +PFNGLPIXELTEXGENPARAMETERFVSGISPROC glad_glPixelTexGenParameterfvSGIS = NULL; +PFNGLPIXELTEXGENPARAMETERISGISPROC glad_glPixelTexGenParameteriSGIS = NULL; +PFNGLPIXELTEXGENPARAMETERIVSGISPROC glad_glPixelTexGenParameterivSGIS = NULL; +PFNGLPIXELTEXGENSGIXPROC glad_glPixelTexGenSGIX = NULL; +PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL; +PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL; +PFNGLPIXELTRANSFERXOESPROC glad_glPixelTransferxOES = NULL; +PFNGLPIXELTRANSFORMPARAMETERFEXTPROC glad_glPixelTransformParameterfEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC glad_glPixelTransformParameterfvEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIEXTPROC glad_glPixelTransformParameteriEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC glad_glPixelTransformParameterivEXT = NULL; +PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL; +PFNGLPIXELZOOMXOESPROC glad_glPixelZoomxOES = NULL; +PFNGLPOINTALONGPATHNVPROC glad_glPointAlongPathNV = NULL; +PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFARBPROC glad_glPointParameterfARB = NULL; +PFNGLPOINTPARAMETERFEXTPROC glad_glPointParameterfEXT = NULL; +PFNGLPOINTPARAMETERFSGISPROC glad_glPointParameterfSGIS = NULL; +PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERFVARBPROC glad_glPointParameterfvARB = NULL; +PFNGLPOINTPARAMETERFVEXTPROC glad_glPointParameterfvEXT = NULL; +PFNGLPOINTPARAMETERFVSGISPROC glad_glPointParameterfvSGIS = NULL; +PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERINVPROC glad_glPointParameteriNV = NULL; +PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; +PFNGLPOINTPARAMETERIVNVPROC glad_glPointParameterivNV = NULL; +PFNGLPOINTPARAMETERXVOESPROC glad_glPointParameterxvOES = NULL; +PFNGLPOINTSIZEPROC glad_glPointSize = NULL; +PFNGLPOINTSIZEXOESPROC glad_glPointSizexOES = NULL; +PFNGLPOLLASYNCSGIXPROC glad_glPollAsyncSGIX = NULL; +PFNGLPOLLINSTRUMENTSSGIXPROC glad_glPollInstrumentsSGIX = NULL; +PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp = NULL; +PFNGLPOLYGONOFFSETCLAMPEXTPROC glad_glPolygonOffsetClampEXT = NULL; +PFNGLPOLYGONOFFSETEXTPROC glad_glPolygonOffsetEXT = NULL; +PFNGLPOLYGONOFFSETXOESPROC glad_glPolygonOffsetxOES = NULL; +PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL; +PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL; +PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL; +PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL; +PFNGLPOPGROUPMARKEREXTPROC glad_glPopGroupMarkerEXT = NULL; +PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL; +PFNGLPOPNAMEPROC glad_glPopName = NULL; +PFNGLPRESENTFRAMEDUALFILLNVPROC glad_glPresentFrameDualFillNV = NULL; +PFNGLPRESENTFRAMEKEYEDNVPROC glad_glPresentFrameKeyedNV = NULL; +PFNGLPRIMITIVEBOUNDINGBOXARBPROC glad_glPrimitiveBoundingBoxARB = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPRIMITIVERESTARTINDEXNVPROC glad_glPrimitiveRestartIndexNV = NULL; +PFNGLPRIMITIVERESTARTNVPROC glad_glPrimitiveRestartNV = NULL; +PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL; +PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT = NULL; +PFNGLPRIORITIZETEXTURESXOESPROC glad_glPrioritizeTexturesxOES = NULL; +PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL; +PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC glad_glProgramBufferParametersIivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC glad_glProgramBufferParametersIuivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC glad_glProgramBufferParametersfvNV = NULL; +PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB = NULL; +PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB = NULL; +PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB = NULL; +PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB = NULL; +PFNGLPROGRAMENVPARAMETERI4INVPROC glad_glProgramEnvParameterI4iNV = NULL; +PFNGLPROGRAMENVPARAMETERI4IVNVPROC glad_glProgramEnvParameterI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UINVPROC glad_glProgramEnvParameterI4uiNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UIVNVPROC glad_glProgramEnvParameterI4uivNV = NULL; +PFNGLPROGRAMENVPARAMETERS4FVEXTPROC glad_glProgramEnvParameters4fvEXT = NULL; +PFNGLPROGRAMENVPARAMETERSI4IVNVPROC glad_glProgramEnvParametersI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC glad_glProgramEnvParametersI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB = NULL; +PFNGLPROGRAMLOCALPARAMETERI4INVPROC glad_glProgramLocalParameterI4iNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC glad_glProgramLocalParameterI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UINVPROC glad_glProgramLocalParameterI4uiNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC glad_glProgramLocalParameterI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glProgramLocalParameters4fvEXT = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC glad_glProgramLocalParametersI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC glad_glProgramLocalParametersI4uivNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DNVPROC glad_glProgramNamedParameter4dNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC glad_glProgramNamedParameter4dvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FNVPROC glad_glProgramNamedParameter4fNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC glad_glProgramNamedParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV = NULL; +PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV = NULL; +PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV = NULL; +PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL; +PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB = NULL; +PFNGLPROGRAMPARAMETERIEXTPROC glad_glProgramParameteriEXT = NULL; +PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV = NULL; +PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV = NULL; +PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC glad_glProgramPathFragmentInputGenNV = NULL; +PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB = NULL; +PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC glad_glProgramSubroutineParametersuivNV = NULL; +PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL; +PFNGLPROGRAMUNIFORM1DEXTPROC glad_glProgramUniform1dEXT = NULL; +PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL; +PFNGLPROGRAMUNIFORM1DVEXTPROC glad_glProgramUniform1dvEXT = NULL; +PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL; +PFNGLPROGRAMUNIFORM1FEXTPROC glad_glProgramUniform1fEXT = NULL; +PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL; +PFNGLPROGRAMUNIFORM1FVEXTPROC glad_glProgramUniform1fvEXT = NULL; +PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL; +PFNGLPROGRAMUNIFORM1I64ARBPROC glad_glProgramUniform1i64ARB = NULL; +PFNGLPROGRAMUNIFORM1I64NVPROC glad_glProgramUniform1i64NV = NULL; +PFNGLPROGRAMUNIFORM1I64VARBPROC glad_glProgramUniform1i64vARB = NULL; +PFNGLPROGRAMUNIFORM1I64VNVPROC glad_glProgramUniform1i64vNV = NULL; +PFNGLPROGRAMUNIFORM1IEXTPROC glad_glProgramUniform1iEXT = NULL; +PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL; +PFNGLPROGRAMUNIFORM1IVEXTPROC glad_glProgramUniform1ivEXT = NULL; +PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL; +PFNGLPROGRAMUNIFORM1UI64ARBPROC glad_glProgramUniform1ui64ARB = NULL; +PFNGLPROGRAMUNIFORM1UI64NVPROC glad_glProgramUniform1ui64NV = NULL; +PFNGLPROGRAMUNIFORM1UI64VARBPROC glad_glProgramUniform1ui64vARB = NULL; +PFNGLPROGRAMUNIFORM1UI64VNVPROC glad_glProgramUniform1ui64vNV = NULL; +PFNGLPROGRAMUNIFORM1UIEXTPROC glad_glProgramUniform1uiEXT = NULL; +PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL; +PFNGLPROGRAMUNIFORM1UIVEXTPROC glad_glProgramUniform1uivEXT = NULL; +PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL; +PFNGLPROGRAMUNIFORM2DEXTPROC glad_glProgramUniform2dEXT = NULL; +PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL; +PFNGLPROGRAMUNIFORM2DVEXTPROC glad_glProgramUniform2dvEXT = NULL; +PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL; +PFNGLPROGRAMUNIFORM2FEXTPROC glad_glProgramUniform2fEXT = NULL; +PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL; +PFNGLPROGRAMUNIFORM2FVEXTPROC glad_glProgramUniform2fvEXT = NULL; +PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL; +PFNGLPROGRAMUNIFORM2I64ARBPROC glad_glProgramUniform2i64ARB = NULL; +PFNGLPROGRAMUNIFORM2I64NVPROC glad_glProgramUniform2i64NV = NULL; +PFNGLPROGRAMUNIFORM2I64VARBPROC glad_glProgramUniform2i64vARB = NULL; +PFNGLPROGRAMUNIFORM2I64VNVPROC glad_glProgramUniform2i64vNV = NULL; +PFNGLPROGRAMUNIFORM2IEXTPROC glad_glProgramUniform2iEXT = NULL; +PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL; +PFNGLPROGRAMUNIFORM2IVEXTPROC glad_glProgramUniform2ivEXT = NULL; +PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL; +PFNGLPROGRAMUNIFORM2UI64ARBPROC glad_glProgramUniform2ui64ARB = NULL; +PFNGLPROGRAMUNIFORM2UI64NVPROC glad_glProgramUniform2ui64NV = NULL; +PFNGLPROGRAMUNIFORM2UI64VARBPROC glad_glProgramUniform2ui64vARB = NULL; +PFNGLPROGRAMUNIFORM2UI64VNVPROC glad_glProgramUniform2ui64vNV = NULL; +PFNGLPROGRAMUNIFORM2UIEXTPROC glad_glProgramUniform2uiEXT = NULL; +PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL; +PFNGLPROGRAMUNIFORM2UIVEXTPROC glad_glProgramUniform2uivEXT = NULL; +PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL; +PFNGLPROGRAMUNIFORM3DEXTPROC glad_glProgramUniform3dEXT = NULL; +PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL; +PFNGLPROGRAMUNIFORM3DVEXTPROC glad_glProgramUniform3dvEXT = NULL; +PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL; +PFNGLPROGRAMUNIFORM3FEXTPROC glad_glProgramUniform3fEXT = NULL; +PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL; +PFNGLPROGRAMUNIFORM3FVEXTPROC glad_glProgramUniform3fvEXT = NULL; +PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL; +PFNGLPROGRAMUNIFORM3I64ARBPROC glad_glProgramUniform3i64ARB = NULL; +PFNGLPROGRAMUNIFORM3I64NVPROC glad_glProgramUniform3i64NV = NULL; +PFNGLPROGRAMUNIFORM3I64VARBPROC glad_glProgramUniform3i64vARB = NULL; +PFNGLPROGRAMUNIFORM3I64VNVPROC glad_glProgramUniform3i64vNV = NULL; +PFNGLPROGRAMUNIFORM3IEXTPROC glad_glProgramUniform3iEXT = NULL; +PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL; +PFNGLPROGRAMUNIFORM3IVEXTPROC glad_glProgramUniform3ivEXT = NULL; +PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL; +PFNGLPROGRAMUNIFORM3UI64ARBPROC glad_glProgramUniform3ui64ARB = NULL; +PFNGLPROGRAMUNIFORM3UI64NVPROC glad_glProgramUniform3ui64NV = NULL; +PFNGLPROGRAMUNIFORM3UI64VARBPROC glad_glProgramUniform3ui64vARB = NULL; +PFNGLPROGRAMUNIFORM3UI64VNVPROC glad_glProgramUniform3ui64vNV = NULL; +PFNGLPROGRAMUNIFORM3UIEXTPROC glad_glProgramUniform3uiEXT = NULL; +PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL; +PFNGLPROGRAMUNIFORM3UIVEXTPROC glad_glProgramUniform3uivEXT = NULL; +PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL; +PFNGLPROGRAMUNIFORM4DEXTPROC glad_glProgramUniform4dEXT = NULL; +PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL; +PFNGLPROGRAMUNIFORM4DVEXTPROC glad_glProgramUniform4dvEXT = NULL; +PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL; +PFNGLPROGRAMUNIFORM4FEXTPROC glad_glProgramUniform4fEXT = NULL; +PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL; +PFNGLPROGRAMUNIFORM4FVEXTPROC glad_glProgramUniform4fvEXT = NULL; +PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL; +PFNGLPROGRAMUNIFORM4I64ARBPROC glad_glProgramUniform4i64ARB = NULL; +PFNGLPROGRAMUNIFORM4I64NVPROC glad_glProgramUniform4i64NV = NULL; +PFNGLPROGRAMUNIFORM4I64VARBPROC glad_glProgramUniform4i64vARB = NULL; +PFNGLPROGRAMUNIFORM4I64VNVPROC glad_glProgramUniform4i64vNV = NULL; +PFNGLPROGRAMUNIFORM4IEXTPROC glad_glProgramUniform4iEXT = NULL; +PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL; +PFNGLPROGRAMUNIFORM4IVEXTPROC glad_glProgramUniform4ivEXT = NULL; +PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL; +PFNGLPROGRAMUNIFORM4UI64ARBPROC glad_glProgramUniform4ui64ARB = NULL; +PFNGLPROGRAMUNIFORM4UI64NVPROC glad_glProgramUniform4ui64NV = NULL; +PFNGLPROGRAMUNIFORM4UI64VARBPROC glad_glProgramUniform4ui64vARB = NULL; +PFNGLPROGRAMUNIFORM4UI64VNVPROC glad_glProgramUniform4ui64vNV = NULL; +PFNGLPROGRAMUNIFORM4UIEXTPROC glad_glProgramUniform4uiEXT = NULL; +PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL; +PFNGLPROGRAMUNIFORM4UIVEXTPROC glad_glProgramUniform4uivEXT = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC glad_glProgramUniformHandleui64ARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC glad_glProgramUniformHandleui64NV = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC glad_glProgramUniformHandleui64vARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC glad_glProgramUniformHandleui64vNV = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC glad_glProgramUniformMatrix2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC glad_glProgramUniformMatrix2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC glad_glProgramUniformMatrix2x3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC glad_glProgramUniformMatrix2x3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC glad_glProgramUniformMatrix2x4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC glad_glProgramUniformMatrix2x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC glad_glProgramUniformMatrix3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC glad_glProgramUniformMatrix3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC glad_glProgramUniformMatrix3x2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC glad_glProgramUniformMatrix3x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC glad_glProgramUniformMatrix3x4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC glad_glProgramUniformMatrix3x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC glad_glProgramUniformMatrix4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC glad_glProgramUniformMatrix4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC glad_glProgramUniformMatrix4x2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC glad_glProgramUniformMatrix4x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC glad_glProgramUniformMatrix4x3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC glad_glProgramUniformMatrix4x3fvEXT = NULL; +PFNGLPROGRAMUNIFORMUI64NVPROC glad_glProgramUniformui64NV = NULL; +PFNGLPROGRAMUNIFORMUI64VNVPROC glad_glProgramUniformui64vNV = NULL; +PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV = NULL; +PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLPROVOKINGVERTEXEXTPROC glad_glProvokingVertexEXT = NULL; +PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL; +PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL; +PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC glad_glPushClientAttribDefaultEXT = NULL; +PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL; +PFNGLPUSHGROUPMARKEREXTPROC glad_glPushGroupMarkerEXT = NULL; +PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL; +PFNGLPUSHNAMEPROC glad_glPushName = NULL; +PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; +PFNGLQUERYMATRIXXOESPROC glad_glQueryMatrixxOES = NULL; +PFNGLQUERYOBJECTPARAMETERUIAMDPROC glad_glQueryObjectParameteruiAMD = NULL; +PFNGLQUERYRESOURCENVPROC glad_glQueryResourceNV = NULL; +PFNGLQUERYRESOURCETAGNVPROC glad_glQueryResourceTagNV = NULL; +PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL; +PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL; +PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL; +PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL; +PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL; +PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL; +PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL; +PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL; +PFNGLRASTERPOS2XOESPROC glad_glRasterPos2xOES = NULL; +PFNGLRASTERPOS2XVOESPROC glad_glRasterPos2xvOES = NULL; +PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL; +PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL; +PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL; +PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL; +PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL; +PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL; +PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL; +PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL; +PFNGLRASTERPOS3XOESPROC glad_glRasterPos3xOES = NULL; +PFNGLRASTERPOS3XVOESPROC glad_glRasterPos3xvOES = NULL; +PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL; +PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL; +PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL; +PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL; +PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL; +PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL; +PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL; +PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL; +PFNGLRASTERPOS4XOESPROC glad_glRasterPos4xOES = NULL; +PFNGLRASTERPOS4XVOESPROC glad_glRasterPos4xvOES = NULL; +PFNGLRASTERSAMPLESEXTPROC glad_glRasterSamplesEXT = NULL; +PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; +PFNGLREADINSTRUMENTSSGIXPROC glad_glReadInstrumentsSGIX = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLREADNPIXELSPROC glad_glReadnPixels = NULL; +PFNGLREADNPIXELSARBPROC glad_glReadnPixelsARB = NULL; +PFNGLRECTDPROC glad_glRectd = NULL; +PFNGLRECTDVPROC glad_glRectdv = NULL; +PFNGLRECTFPROC glad_glRectf = NULL; +PFNGLRECTFVPROC glad_glRectfv = NULL; +PFNGLRECTIPROC glad_glRecti = NULL; +PFNGLRECTIVPROC glad_glRectiv = NULL; +PFNGLRECTSPROC glad_glRects = NULL; +PFNGLRECTSVPROC glad_glRectsv = NULL; +PFNGLRECTXOESPROC glad_glRectxOES = NULL; +PFNGLRECTXVOESPROC glad_glRectxvOES = NULL; +PFNGLREFERENCEPLANESGIXPROC glad_glReferencePlaneSGIX = NULL; +PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC glad_glReleaseKeyedMutexWin32EXT = NULL; +PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; +PFNGLRENDERGPUMASKNVPROC glad_glRenderGpuMaskNV = NULL; +PFNGLRENDERMODEPROC glad_glRenderMode = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC glad_glRenderbufferStorageMultisampleAdvancedAMD = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC glad_glRenderbufferStorageMultisampleCoverageNV = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT = NULL; +PFNGLREPLACEMENTCODEPOINTERSUNPROC glad_glReplacementCodePointerSUN = NULL; +PFNGLREPLACEMENTCODEUBSUNPROC glad_glReplacementCodeubSUN = NULL; +PFNGLREPLACEMENTCODEUBVSUNPROC glad_glReplacementCodeubvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC glad_glReplacementCodeuiColor3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC glad_glReplacementCodeuiColor3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC glad_glReplacementCodeuiColor4ubVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC glad_glReplacementCodeuiColor4ubVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUISUNPROC glad_glReplacementCodeuiSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC glad_glReplacementCodeuiTexCoord2fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC glad_glReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC glad_glReplacementCodeuiVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC glad_glReplacementCodeuiVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUIVSUNPROC glad_glReplacementCodeuivSUN = NULL; +PFNGLREPLACEMENTCODEUSSUNPROC glad_glReplacementCodeusSUN = NULL; +PFNGLREPLACEMENTCODEUSVSUNPROC glad_glReplacementCodeusvSUN = NULL; +PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV = NULL; +PFNGLRESETHISTOGRAMPROC glad_glResetHistogram = NULL; +PFNGLRESETHISTOGRAMEXTPROC glad_glResetHistogramEXT = NULL; +PFNGLRESETMEMORYOBJECTPARAMETERNVPROC glad_glResetMemoryObjectParameterNV = NULL; +PFNGLRESETMINMAXPROC glad_glResetMinmax = NULL; +PFNGLRESETMINMAXEXTPROC glad_glResetMinmaxEXT = NULL; +PFNGLRESIZEBUFFERSMESAPROC glad_glResizeBuffersMESA = NULL; +PFNGLRESOLVEDEPTHVALUESNVPROC glad_glResolveDepthValuesNV = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL; +PFNGLRESUMETRANSFORMFEEDBACKNVPROC glad_glResumeTransformFeedbackNV = NULL; +PFNGLROTATEDPROC glad_glRotated = NULL; +PFNGLROTATEFPROC glad_glRotatef = NULL; +PFNGLROTATEXOESPROC glad_glRotatexOES = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB = NULL; +PFNGLSAMPLEMAPATIPROC glad_glSampleMapATI = NULL; +PFNGLSAMPLEMASKEXTPROC glad_glSampleMaskEXT = NULL; +PFNGLSAMPLEMASKINDEXEDNVPROC glad_glSampleMaskIndexedNV = NULL; +PFNGLSAMPLEMASKSGISPROC glad_glSampleMaskSGIS = NULL; +PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; +PFNGLSAMPLEPATTERNEXTPROC glad_glSamplePatternEXT = NULL; +PFNGLSAMPLEPATTERNSGISPROC glad_glSamplePatternSGIS = NULL; +PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; +PFNGLSCALEDPROC glad_glScaled = NULL; +PFNGLSCALEFPROC glad_glScalef = NULL; +PFNGLSCALEXOESPROC glad_glScalexOES = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSCISSORARRAYVPROC glad_glScissorArrayv = NULL; +PFNGLSCISSOREXCLUSIVEARRAYVNVPROC glad_glScissorExclusiveArrayvNV = NULL; +PFNGLSCISSOREXCLUSIVENVPROC glad_glScissorExclusiveNV = NULL; +PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv = NULL; +PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BEXTPROC glad_glSecondaryColor3bEXT = NULL; +PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3BVEXTPROC glad_glSecondaryColor3bvEXT = NULL; +PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DEXTPROC glad_glSecondaryColor3dEXT = NULL; +PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3DVEXTPROC glad_glSecondaryColor3dvEXT = NULL; +PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FEXTPROC glad_glSecondaryColor3fEXT = NULL; +PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3FVEXTPROC glad_glSecondaryColor3fvEXT = NULL; +PFNGLSECONDARYCOLOR3HNVPROC glad_glSecondaryColor3hNV = NULL; +PFNGLSECONDARYCOLOR3HVNVPROC glad_glSecondaryColor3hvNV = NULL; +PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IEXTPROC glad_glSecondaryColor3iEXT = NULL; +PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3IVEXTPROC glad_glSecondaryColor3ivEXT = NULL; +PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SEXTPROC glad_glSecondaryColor3sEXT = NULL; +PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3SVEXTPROC glad_glSecondaryColor3svEXT = NULL; +PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBEXTPROC glad_glSecondaryColor3ubEXT = NULL; +PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UBVEXTPROC glad_glSecondaryColor3ubvEXT = NULL; +PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIEXTPROC glad_glSecondaryColor3uiEXT = NULL; +PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3UIVEXTPROC glad_glSecondaryColor3uivEXT = NULL; +PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USEXTPROC glad_glSecondaryColor3usEXT = NULL; +PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLOR3USVEXTPROC glad_glSecondaryColor3usvEXT = NULL; +PFNGLSECONDARYCOLORFORMATNVPROC glad_glSecondaryColorFormatNV = NULL; +PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer = NULL; +PFNGLSECONDARYCOLORPOINTEREXTPROC glad_glSecondaryColorPointerEXT = NULL; +PFNGLSECONDARYCOLORPOINTERLISTIBMPROC glad_glSecondaryColorPointerListIBM = NULL; +PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL; +PFNGLSELECTPERFMONITORCOUNTERSAMDPROC glad_glSelectPerfMonitorCountersAMD = NULL; +PFNGLSEMAPHOREPARAMETERIVNVPROC glad_glSemaphoreParameterivNV = NULL; +PFNGLSEMAPHOREPARAMETERUI64VEXTPROC glad_glSemaphoreParameterui64vEXT = NULL; +PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D = NULL; +PFNGLSEPARABLEFILTER2DEXTPROC glad_glSeparableFilter2DEXT = NULL; +PFNGLSETFENCEAPPLEPROC glad_glSetFenceAPPLE = NULL; +PFNGLSETFENCENVPROC glad_glSetFenceNV = NULL; +PFNGLSETFRAGMENTSHADERCONSTANTATIPROC glad_glSetFragmentShaderConstantATI = NULL; +PFNGLSETINVARIANTEXTPROC glad_glSetInvariantEXT = NULL; +PFNGLSETLOCALCONSTANTEXTPROC glad_glSetLocalConstantEXT = NULL; +PFNGLSETMULTISAMPLEFVAMDPROC glad_glSetMultisamplefvAMD = NULL; +PFNGLSHADEMODELPROC glad_glShadeModel = NULL; +PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; +PFNGLSHADEROP1EXTPROC glad_glShaderOp1EXT = NULL; +PFNGLSHADEROP2EXTPROC glad_glShaderOp2EXT = NULL; +PFNGLSHADEROP3EXTPROC glad_glShaderOp3EXT = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB = NULL; +PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding = NULL; +PFNGLSHADINGRATEIMAGEBARRIERNVPROC glad_glShadingRateImageBarrierNV = NULL; +PFNGLSHADINGRATEIMAGEPALETTENVPROC glad_glShadingRateImagePaletteNV = NULL; +PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC glad_glShadingRateSampleOrderCustomNV = NULL; +PFNGLSHADINGRATESAMPLEORDERNVPROC glad_glShadingRateSampleOrderNV = NULL; +PFNGLSHARPENTEXFUNCSGISPROC glad_glSharpenTexFuncSGIS = NULL; +PFNGLSIGNALSEMAPHOREEXTPROC glad_glSignalSemaphoreEXT = NULL; +PFNGLSIGNALSEMAPHOREUI64NVXPROC glad_glSignalSemaphoreui64NVX = NULL; +PFNGLSIGNALVKFENCENVPROC glad_glSignalVkFenceNV = NULL; +PFNGLSIGNALVKSEMAPHORENVPROC glad_glSignalVkSemaphoreNV = NULL; +PFNGLSPECIALIZESHADERPROC glad_glSpecializeShader = NULL; +PFNGLSPECIALIZESHADERARBPROC glad_glSpecializeShaderARB = NULL; +PFNGLSPRITEPARAMETERFSGIXPROC glad_glSpriteParameterfSGIX = NULL; +PFNGLSPRITEPARAMETERFVSGIXPROC glad_glSpriteParameterfvSGIX = NULL; +PFNGLSPRITEPARAMETERISGIXPROC glad_glSpriteParameteriSGIX = NULL; +PFNGLSPRITEPARAMETERIVSGIXPROC glad_glSpriteParameterivSGIX = NULL; +PFNGLSTARTINSTRUMENTSSGIXPROC glad_glStartInstrumentsSGIX = NULL; +PFNGLSTATECAPTURENVPROC glad_glStateCaptureNV = NULL; +PFNGLSTENCILCLEARTAGEXTPROC glad_glStencilClearTagEXT = NULL; +PFNGLSTENCILFILLPATHINSTANCEDNVPROC glad_glStencilFillPathInstancedNV = NULL; +PFNGLSTENCILFILLPATHNVPROC glad_glStencilFillPathNV = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILFUNCSEPARATEATIPROC glad_glStencilFuncSeparateATI = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLSTENCILOPSEPARATEATIPROC glad_glStencilOpSeparateATI = NULL; +PFNGLSTENCILOPVALUEAMDPROC glad_glStencilOpValueAMD = NULL; +PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC glad_glStencilStrokePathInstancedNV = NULL; +PFNGLSTENCILSTROKEPATHNVPROC glad_glStencilStrokePathNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC glad_glStencilThenCoverFillPathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHNVPROC glad_glStencilThenCoverFillPathNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC glad_glStencilThenCoverStrokePathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC glad_glStencilThenCoverStrokePathNV = NULL; +PFNGLSTOPINSTRUMENTSSGIXPROC glad_glStopInstrumentsSGIX = NULL; +PFNGLSTRINGMARKERGREMEDYPROC glad_glStringMarkerGREMEDY = NULL; +PFNGLSUBPIXELPRECISIONBIASNVPROC glad_glSubpixelPrecisionBiasNV = NULL; +PFNGLSWIZZLEEXTPROC glad_glSwizzleEXT = NULL; +PFNGLSYNCTEXTUREINTELPROC glad_glSyncTextureINTEL = NULL; +PFNGLTAGSAMPLEBUFFERSGIXPROC glad_glTagSampleBufferSGIX = NULL; +PFNGLTANGENT3BEXTPROC glad_glTangent3bEXT = NULL; +PFNGLTANGENT3BVEXTPROC glad_glTangent3bvEXT = NULL; +PFNGLTANGENT3DEXTPROC glad_glTangent3dEXT = NULL; +PFNGLTANGENT3DVEXTPROC glad_glTangent3dvEXT = NULL; +PFNGLTANGENT3FEXTPROC glad_glTangent3fEXT = NULL; +PFNGLTANGENT3FVEXTPROC glad_glTangent3fvEXT = NULL; +PFNGLTANGENT3IEXTPROC glad_glTangent3iEXT = NULL; +PFNGLTANGENT3IVEXTPROC glad_glTangent3ivEXT = NULL; +PFNGLTANGENT3SEXTPROC glad_glTangent3sEXT = NULL; +PFNGLTANGENT3SVEXTPROC glad_glTangent3svEXT = NULL; +PFNGLTANGENTPOINTEREXTPROC glad_glTangentPointerEXT = NULL; +PFNGLTBUFFERMASK3DFXPROC glad_glTbufferMask3DFX = NULL; +PFNGLTESSELLATIONFACTORAMDPROC glad_glTessellationFactorAMD = NULL; +PFNGLTESSELLATIONMODEAMDPROC glad_glTessellationModeAMD = NULL; +PFNGLTESTFENCEAPPLEPROC glad_glTestFenceAPPLE = NULL; +PFNGLTESTFENCENVPROC glad_glTestFenceNV = NULL; +PFNGLTESTOBJECTAPPLEPROC glad_glTestObjectAPPLE = NULL; +PFNGLTEXATTACHMEMORYNVPROC glad_glTexAttachMemoryNV = NULL; +PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXBUFFERARBPROC glad_glTexBufferARB = NULL; +PFNGLTEXBUFFEREXTPROC glad_glTexBufferEXT = NULL; +PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange = NULL; +PFNGLTEXBUMPPARAMETERFVATIPROC glad_glTexBumpParameterfvATI = NULL; +PFNGLTEXBUMPPARAMETERIVATIPROC glad_glTexBumpParameterivATI = NULL; +PFNGLTEXCOORD1BOESPROC glad_glTexCoord1bOES = NULL; +PFNGLTEXCOORD1BVOESPROC glad_glTexCoord1bvOES = NULL; +PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL; +PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL; +PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL; +PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL; +PFNGLTEXCOORD1HNVPROC glad_glTexCoord1hNV = NULL; +PFNGLTEXCOORD1HVNVPROC glad_glTexCoord1hvNV = NULL; +PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL; +PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL; +PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL; +PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL; +PFNGLTEXCOORD1XOESPROC glad_glTexCoord1xOES = NULL; +PFNGLTEXCOORD1XVOESPROC glad_glTexCoord1xvOES = NULL; +PFNGLTEXCOORD2BOESPROC glad_glTexCoord2bOES = NULL; +PFNGLTEXCOORD2BVOESPROC glad_glTexCoord2bvOES = NULL; +PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL; +PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL; +PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC glad_glTexCoord2fColor3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC glad_glTexCoord2fColor3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC glad_glTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC glad_glTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC glad_glTexCoord2fColor4ubVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC glad_glTexCoord2fColor4ubVertex3fvSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC glad_glTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC glad_glTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FSUNPROC glad_glTexCoord2fVertex3fSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FVSUNPROC glad_glTexCoord2fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL; +PFNGLTEXCOORD2HNVPROC glad_glTexCoord2hNV = NULL; +PFNGLTEXCOORD2HVNVPROC glad_glTexCoord2hvNV = NULL; +PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL; +PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL; +PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL; +PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL; +PFNGLTEXCOORD2XOESPROC glad_glTexCoord2xOES = NULL; +PFNGLTEXCOORD2XVOESPROC glad_glTexCoord2xvOES = NULL; +PFNGLTEXCOORD3BOESPROC glad_glTexCoord3bOES = NULL; +PFNGLTEXCOORD3BVOESPROC glad_glTexCoord3bvOES = NULL; +PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL; +PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL; +PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL; +PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL; +PFNGLTEXCOORD3HNVPROC glad_glTexCoord3hNV = NULL; +PFNGLTEXCOORD3HVNVPROC glad_glTexCoord3hvNV = NULL; +PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL; +PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL; +PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL; +PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL; +PFNGLTEXCOORD3XOESPROC glad_glTexCoord3xOES = NULL; +PFNGLTEXCOORD3XVOESPROC glad_glTexCoord3xvOES = NULL; +PFNGLTEXCOORD4BOESPROC glad_glTexCoord4bOES = NULL; +PFNGLTEXCOORD4BVOESPROC glad_glTexCoord4bvOES = NULL; +PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL; +PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL; +PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC glad_glTexCoord4fColor4fNormal3fVertex4fSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC glad_glTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FSUNPROC glad_glTexCoord4fVertex4fSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FVSUNPROC glad_glTexCoord4fVertex4fvSUN = NULL; +PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL; +PFNGLTEXCOORD4HNVPROC glad_glTexCoord4hNV = NULL; +PFNGLTEXCOORD4HVNVPROC glad_glTexCoord4hvNV = NULL; +PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL; +PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL; +PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL; +PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL; +PFNGLTEXCOORD4XOESPROC glad_glTexCoord4xOES = NULL; +PFNGLTEXCOORD4XVOESPROC glad_glTexCoord4xvOES = NULL; +PFNGLTEXCOORDFORMATNVPROC glad_glTexCoordFormatNV = NULL; +PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL; +PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL; +PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT = NULL; +PFNGLTEXCOORDPOINTERLISTIBMPROC glad_glTexCoordPointerListIBM = NULL; +PFNGLTEXCOORDPOINTERVINTELPROC glad_glTexCoordPointervINTEL = NULL; +PFNGLTEXENVFPROC glad_glTexEnvf = NULL; +PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL; +PFNGLTEXENVIPROC glad_glTexEnvi = NULL; +PFNGLTEXENVIVPROC glad_glTexEnviv = NULL; +PFNGLTEXENVXOESPROC glad_glTexEnvxOES = NULL; +PFNGLTEXENVXVOESPROC glad_glTexEnvxvOES = NULL; +PFNGLTEXFILTERFUNCSGISPROC glad_glTexFilterFuncSGIS = NULL; +PFNGLTEXGENDPROC glad_glTexGend = NULL; +PFNGLTEXGENDVPROC glad_glTexGendv = NULL; +PFNGLTEXGENFPROC glad_glTexGenf = NULL; +PFNGLTEXGENFVPROC glad_glTexGenfv = NULL; +PFNGLTEXGENIPROC glad_glTexGeni = NULL; +PFNGLTEXGENIVPROC glad_glTexGeniv = NULL; +PFNGLTEXGENXOESPROC glad_glTexGenxOES = NULL; +PFNGLTEXGENXVOESPROC glad_glTexGenxvOES = NULL; +PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC glad_glTexImage2DMultisampleCoverageNV = NULL; +PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DEXTPROC glad_glTexImage3DEXT = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; +PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC glad_glTexImage3DMultisampleCoverageNV = NULL; +PFNGLTEXIMAGE4DSGISPROC glad_glTexImage4DSGIS = NULL; +PFNGLTEXPAGECOMMITMENTARBPROC glad_glTexPageCommitmentARB = NULL; +PFNGLTEXPAGECOMMITMENTMEMNVPROC glad_glTexPageCommitmentMemNV = NULL; +PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIIVEXTPROC glad_glTexParameterIivEXT = NULL; +PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; +PFNGLTEXPARAMETERIUIVEXTPROC glad_glTexParameterIuivEXT = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXPARAMETERXOESPROC glad_glTexParameterxOES = NULL; +PFNGLTEXPARAMETERXVOESPROC glad_glTexParameterxvOES = NULL; +PFNGLTEXRENDERBUFFERNVPROC glad_glTexRenderbufferNV = NULL; +PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D = NULL; +PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT = NULL; +PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL; +PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT = NULL; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL; +PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample = NULL; +PFNGLTEXSTORAGEMEM1DEXTPROC glad_glTexStorageMem1DEXT = NULL; +PFNGLTEXSTORAGEMEM2DEXTPROC glad_glTexStorageMem2DEXT = NULL; +PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC glad_glTexStorageMem2DMultisampleEXT = NULL; +PFNGLTEXSTORAGEMEM3DEXTPROC glad_glTexStorageMem3DEXT = NULL; +PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC glad_glTexStorageMem3DMultisampleEXT = NULL; +PFNGLTEXSTORAGESPARSEAMDPROC glad_glTexStorageSparseAMD = NULL; +PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTEXSUBIMAGE3DEXTPROC glad_glTexSubImage3DEXT = NULL; +PFNGLTEXSUBIMAGE4DSGISPROC glad_glTexSubImage4DSGIS = NULL; +PFNGLTEXTUREATTACHMEMORYNVPROC glad_glTextureAttachMemoryNV = NULL; +PFNGLTEXTUREBARRIERPROC glad_glTextureBarrier = NULL; +PFNGLTEXTUREBARRIERNVPROC glad_glTextureBarrierNV = NULL; +PFNGLTEXTUREBUFFERPROC glad_glTextureBuffer = NULL; +PFNGLTEXTUREBUFFEREXTPROC glad_glTextureBufferEXT = NULL; +PFNGLTEXTUREBUFFERRANGEPROC glad_glTextureBufferRange = NULL; +PFNGLTEXTUREBUFFERRANGEEXTPROC glad_glTextureBufferRangeEXT = NULL; +PFNGLTEXTURECOLORMASKSGISPROC glad_glTextureColorMaskSGIS = NULL; +PFNGLTEXTUREIMAGE1DEXTPROC glad_glTextureImage1DEXT = NULL; +PFNGLTEXTUREIMAGE2DEXTPROC glad_glTextureImage2DEXT = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC glad_glTextureImage2DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC glad_glTextureImage2DMultisampleNV = NULL; +PFNGLTEXTUREIMAGE3DEXTPROC glad_glTextureImage3DEXT = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC glad_glTextureImage3DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC glad_glTextureImage3DMultisampleNV = NULL; +PFNGLTEXTURELIGHTEXTPROC glad_glTextureLightEXT = NULL; +PFNGLTEXTUREMATERIALEXTPROC glad_glTextureMaterialEXT = NULL; +PFNGLTEXTURENORMALEXTPROC glad_glTextureNormalEXT = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC glad_glTexturePageCommitmentEXT = NULL; +PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC glad_glTexturePageCommitmentMemNV = NULL; +PFNGLTEXTUREPARAMETERIIVPROC glad_glTextureParameterIiv = NULL; +PFNGLTEXTUREPARAMETERIIVEXTPROC glad_glTextureParameterIivEXT = NULL; +PFNGLTEXTUREPARAMETERIUIVPROC glad_glTextureParameterIuiv = NULL; +PFNGLTEXTUREPARAMETERIUIVEXTPROC glad_glTextureParameterIuivEXT = NULL; +PFNGLTEXTUREPARAMETERFPROC glad_glTextureParameterf = NULL; +PFNGLTEXTUREPARAMETERFEXTPROC glad_glTextureParameterfEXT = NULL; +PFNGLTEXTUREPARAMETERFVPROC glad_glTextureParameterfv = NULL; +PFNGLTEXTUREPARAMETERFVEXTPROC glad_glTextureParameterfvEXT = NULL; +PFNGLTEXTUREPARAMETERIPROC glad_glTextureParameteri = NULL; +PFNGLTEXTUREPARAMETERIEXTPROC glad_glTextureParameteriEXT = NULL; +PFNGLTEXTUREPARAMETERIVPROC glad_glTextureParameteriv = NULL; +PFNGLTEXTUREPARAMETERIVEXTPROC glad_glTextureParameterivEXT = NULL; +PFNGLTEXTURERANGEAPPLEPROC glad_glTextureRangeAPPLE = NULL; +PFNGLTEXTURERENDERBUFFEREXTPROC glad_glTextureRenderbufferEXT = NULL; +PFNGLTEXTURESTORAGE1DPROC glad_glTextureStorage1D = NULL; +PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT = NULL; +PFNGLTEXTURESTORAGE2DPROC glad_glTextureStorage2D = NULL; +PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glad_glTextureStorage2DMultisample = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glad_glTextureStorage2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGE3DPROC glad_glTextureStorage3D = NULL; +PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glad_glTextureStorage3DMultisample = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glad_glTextureStorage3DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGEMEM1DEXTPROC glad_glTextureStorageMem1DEXT = NULL; +PFNGLTEXTURESTORAGEMEM2DEXTPROC glad_glTextureStorageMem2DEXT = NULL; +PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC glad_glTextureStorageMem2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGEMEM3DEXTPROC glad_glTextureStorageMem3DEXT = NULL; +PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC glad_glTextureStorageMem3DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGESPARSEAMDPROC glad_glTextureStorageSparseAMD = NULL; +PFNGLTEXTURESUBIMAGE1DPROC glad_glTextureSubImage1D = NULL; +PFNGLTEXTURESUBIMAGE1DEXTPROC glad_glTextureSubImage1DEXT = NULL; +PFNGLTEXTURESUBIMAGE2DPROC glad_glTextureSubImage2D = NULL; +PFNGLTEXTURESUBIMAGE2DEXTPROC glad_glTextureSubImage2DEXT = NULL; +PFNGLTEXTURESUBIMAGE3DPROC glad_glTextureSubImage3D = NULL; +PFNGLTEXTURESUBIMAGE3DEXTPROC glad_glTextureSubImage3DEXT = NULL; +PFNGLTEXTUREVIEWPROC glad_glTextureView = NULL; +PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV = NULL; +PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC glad_glTransformFeedbackAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glad_glTransformFeedbackBufferBase = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glad_glTransformFeedbackBufferRange = NULL; +PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC glad_glTransformFeedbackStreamAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC glad_glTransformFeedbackVaryingsEXT = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC glad_glTransformFeedbackVaryingsNV = NULL; +PFNGLTRANSFORMPATHNVPROC glad_glTransformPathNV = NULL; +PFNGLTRANSLATEDPROC glad_glTranslated = NULL; +PFNGLTRANSLATEFPROC glad_glTranslatef = NULL; +PFNGLTRANSLATEXOESPROC glad_glTranslatexOES = NULL; +PFNGLUNIFORM1DPROC glad_glUniform1d = NULL; +PFNGLUNIFORM1DVPROC glad_glUniform1dv = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FARBPROC glad_glUniform1fARB = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1I64ARBPROC glad_glUniform1i64ARB = NULL; +PFNGLUNIFORM1I64NVPROC glad_glUniform1i64NV = NULL; +PFNGLUNIFORM1I64VARBPROC glad_glUniform1i64vARB = NULL; +PFNGLUNIFORM1I64VNVPROC glad_glUniform1i64vNV = NULL; +PFNGLUNIFORM1IARBPROC glad_glUniform1iARB = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB = NULL; +PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; +PFNGLUNIFORM1UI64ARBPROC glad_glUniform1ui64ARB = NULL; +PFNGLUNIFORM1UI64NVPROC glad_glUniform1ui64NV = NULL; +PFNGLUNIFORM1UI64VARBPROC glad_glUniform1ui64vARB = NULL; +PFNGLUNIFORM1UI64VNVPROC glad_glUniform1ui64vNV = NULL; +PFNGLUNIFORM1UIEXTPROC glad_glUniform1uiEXT = NULL; +PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM1UIVEXTPROC glad_glUniform1uivEXT = NULL; +PFNGLUNIFORM2DPROC glad_glUniform2d = NULL; +PFNGLUNIFORM2DVPROC glad_glUniform2dv = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FARBPROC glad_glUniform2fARB = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2I64ARBPROC glad_glUniform2i64ARB = NULL; +PFNGLUNIFORM2I64NVPROC glad_glUniform2i64NV = NULL; +PFNGLUNIFORM2I64VARBPROC glad_glUniform2i64vARB = NULL; +PFNGLUNIFORM2I64VNVPROC glad_glUniform2i64vNV = NULL; +PFNGLUNIFORM2IARBPROC glad_glUniform2iARB = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB = NULL; +PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; +PFNGLUNIFORM2UI64ARBPROC glad_glUniform2ui64ARB = NULL; +PFNGLUNIFORM2UI64NVPROC glad_glUniform2ui64NV = NULL; +PFNGLUNIFORM2UI64VARBPROC glad_glUniform2ui64vARB = NULL; +PFNGLUNIFORM2UI64VNVPROC glad_glUniform2ui64vNV = NULL; +PFNGLUNIFORM2UIEXTPROC glad_glUniform2uiEXT = NULL; +PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM2UIVEXTPROC glad_glUniform2uivEXT = NULL; +PFNGLUNIFORM3DPROC glad_glUniform3d = NULL; +PFNGLUNIFORM3DVPROC glad_glUniform3dv = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FARBPROC glad_glUniform3fARB = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3I64ARBPROC glad_glUniform3i64ARB = NULL; +PFNGLUNIFORM3I64NVPROC glad_glUniform3i64NV = NULL; +PFNGLUNIFORM3I64VARBPROC glad_glUniform3i64vARB = NULL; +PFNGLUNIFORM3I64VNVPROC glad_glUniform3i64vNV = NULL; +PFNGLUNIFORM3IARBPROC glad_glUniform3iARB = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB = NULL; +PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; +PFNGLUNIFORM3UI64ARBPROC glad_glUniform3ui64ARB = NULL; +PFNGLUNIFORM3UI64NVPROC glad_glUniform3ui64NV = NULL; +PFNGLUNIFORM3UI64VARBPROC glad_glUniform3ui64vARB = NULL; +PFNGLUNIFORM3UI64VNVPROC glad_glUniform3ui64vNV = NULL; +PFNGLUNIFORM3UIEXTPROC glad_glUniform3uiEXT = NULL; +PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM3UIVEXTPROC glad_glUniform3uivEXT = NULL; +PFNGLUNIFORM4DPROC glad_glUniform4d = NULL; +PFNGLUNIFORM4DVPROC glad_glUniform4dv = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FARBPROC glad_glUniform4fARB = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4I64ARBPROC glad_glUniform4i64ARB = NULL; +PFNGLUNIFORM4I64NVPROC glad_glUniform4i64NV = NULL; +PFNGLUNIFORM4I64VARBPROC glad_glUniform4i64vARB = NULL; +PFNGLUNIFORM4I64VNVPROC glad_glUniform4i64vNV = NULL; +PFNGLUNIFORM4IARBPROC glad_glUniform4iARB = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB = NULL; +PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; +PFNGLUNIFORM4UI64ARBPROC glad_glUniform4ui64ARB = NULL; +PFNGLUNIFORM4UI64NVPROC glad_glUniform4ui64NV = NULL; +PFNGLUNIFORM4UI64VARBPROC glad_glUniform4ui64vARB = NULL; +PFNGLUNIFORM4UI64VNVPROC glad_glUniform4ui64vNV = NULL; +PFNGLUNIFORM4UIEXTPROC glad_glUniform4uiEXT = NULL; +PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; +PFNGLUNIFORM4UIVEXTPROC glad_glUniform4uivEXT = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMBUFFEREXTPROC glad_glUniformBufferEXT = NULL; +PFNGLUNIFORMHANDLEUI64ARBPROC glad_glUniformHandleui64ARB = NULL; +PFNGLUNIFORMHANDLEUI64NVPROC glad_glUniformHandleui64NV = NULL; +PFNGLUNIFORMHANDLEUI64VARBPROC glad_glUniformHandleui64vARB = NULL; +PFNGLUNIFORMHANDLEUI64VNVPROC glad_glUniformHandleui64vNV = NULL; +PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv = NULL; +PFNGLUNIFORMUI64NVPROC glad_glUniformui64NV = NULL; +PFNGLUNIFORMUI64VNVPROC glad_glUniformui64vNV = NULL; +PFNGLUNLOCKARRAYSEXTPROC glad_glUnlockArraysEXT = NULL; +PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; +PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB = NULL; +PFNGLUNMAPNAMEDBUFFERPROC glad_glUnmapNamedBuffer = NULL; +PFNGLUNMAPNAMEDBUFFEREXTPROC glad_glUnmapNamedBufferEXT = NULL; +PFNGLUNMAPOBJECTBUFFERATIPROC glad_glUnmapObjectBufferATI = NULL; +PFNGLUNMAPTEXTURE2DINTELPROC glad_glUnmapTexture2DINTEL = NULL; +PFNGLUPDATEOBJECTBUFFERATIPROC glad_glUpdateObjectBufferATI = NULL; +PFNGLUPLOADGPUMASKNVXPROC glad_glUploadGpuMaskNVX = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB = NULL; +PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL; +PFNGLUSESHADERPROGRAMEXTPROC glad_glUseShaderProgramEXT = NULL; +PFNGLVDPAUFININVPROC glad_glVDPAUFiniNV = NULL; +PFNGLVDPAUGETSURFACEIVNVPROC glad_glVDPAUGetSurfaceivNV = NULL; +PFNGLVDPAUINITNVPROC glad_glVDPAUInitNV = NULL; +PFNGLVDPAUISSURFACENVPROC glad_glVDPAUIsSurfaceNV = NULL; +PFNGLVDPAUMAPSURFACESNVPROC glad_glVDPAUMapSurfacesNV = NULL; +PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC glad_glVDPAURegisterOutputSurfaceNV = NULL; +PFNGLVDPAUREGISTERVIDEOSURFACENVPROC glad_glVDPAURegisterVideoSurfaceNV = NULL; +PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC glad_glVDPAURegisterVideoSurfaceWithPictureStructureNV = NULL; +PFNGLVDPAUSURFACEACCESSNVPROC glad_glVDPAUSurfaceAccessNV = NULL; +PFNGLVDPAUUNMAPSURFACESNVPROC glad_glVDPAUUnmapSurfacesNV = NULL; +PFNGLVDPAUUNREGISTERSURFACENVPROC glad_glVDPAUUnregisterSurfaceNV = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB = NULL; +PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL; +PFNGLVARIANTARRAYOBJECTATIPROC glad_glVariantArrayObjectATI = NULL; +PFNGLVARIANTPOINTEREXTPROC glad_glVariantPointerEXT = NULL; +PFNGLVARIANTBVEXTPROC glad_glVariantbvEXT = NULL; +PFNGLVARIANTDVEXTPROC glad_glVariantdvEXT = NULL; +PFNGLVARIANTFVEXTPROC glad_glVariantfvEXT = NULL; +PFNGLVARIANTIVEXTPROC glad_glVariantivEXT = NULL; +PFNGLVARIANTSVEXTPROC glad_glVariantsvEXT = NULL; +PFNGLVARIANTUBVEXTPROC glad_glVariantubvEXT = NULL; +PFNGLVARIANTUIVEXTPROC glad_glVariantuivEXT = NULL; +PFNGLVARIANTUSVEXTPROC glad_glVariantusvEXT = NULL; +PFNGLVERTEX2BOESPROC glad_glVertex2bOES = NULL; +PFNGLVERTEX2BVOESPROC glad_glVertex2bvOES = NULL; +PFNGLVERTEX2DPROC glad_glVertex2d = NULL; +PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL; +PFNGLVERTEX2FPROC glad_glVertex2f = NULL; +PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL; +PFNGLVERTEX2HNVPROC glad_glVertex2hNV = NULL; +PFNGLVERTEX2HVNVPROC glad_glVertex2hvNV = NULL; +PFNGLVERTEX2IPROC glad_glVertex2i = NULL; +PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL; +PFNGLVERTEX2SPROC glad_glVertex2s = NULL; +PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL; +PFNGLVERTEX2XOESPROC glad_glVertex2xOES = NULL; +PFNGLVERTEX2XVOESPROC glad_glVertex2xvOES = NULL; +PFNGLVERTEX3BOESPROC glad_glVertex3bOES = NULL; +PFNGLVERTEX3BVOESPROC glad_glVertex3bvOES = NULL; +PFNGLVERTEX3DPROC glad_glVertex3d = NULL; +PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL; +PFNGLVERTEX3FPROC glad_glVertex3f = NULL; +PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL; +PFNGLVERTEX3HNVPROC glad_glVertex3hNV = NULL; +PFNGLVERTEX3HVNVPROC glad_glVertex3hvNV = NULL; +PFNGLVERTEX3IPROC glad_glVertex3i = NULL; +PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL; +PFNGLVERTEX3SPROC glad_glVertex3s = NULL; +PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL; +PFNGLVERTEX3XOESPROC glad_glVertex3xOES = NULL; +PFNGLVERTEX3XVOESPROC glad_glVertex3xvOES = NULL; +PFNGLVERTEX4BOESPROC glad_glVertex4bOES = NULL; +PFNGLVERTEX4BVOESPROC glad_glVertex4bvOES = NULL; +PFNGLVERTEX4DPROC glad_glVertex4d = NULL; +PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL; +PFNGLVERTEX4FPROC glad_glVertex4f = NULL; +PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL; +PFNGLVERTEX4HNVPROC glad_glVertex4hNV = NULL; +PFNGLVERTEX4HVNVPROC glad_glVertex4hvNV = NULL; +PFNGLVERTEX4IPROC glad_glVertex4i = NULL; +PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL; +PFNGLVERTEX4SPROC glad_glVertex4s = NULL; +PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL; +PFNGLVERTEX4XOESPROC glad_glVertex4xOES = NULL; +PFNGLVERTEX4XVOESPROC glad_glVertex4xvOES = NULL; +PFNGLVERTEXARRAYATTRIBBINDINGPROC glad_glVertexArrayAttribBinding = NULL; +PFNGLVERTEXARRAYATTRIBFORMATPROC glad_glVertexArrayAttribFormat = NULL; +PFNGLVERTEXARRAYATTRIBIFORMATPROC glad_glVertexArrayAttribIFormat = NULL; +PFNGLVERTEXARRAYATTRIBLFORMATPROC glad_glVertexArrayAttribLFormat = NULL; +PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glad_glVertexArrayBindVertexBufferEXT = NULL; +PFNGLVERTEXARRAYBINDINGDIVISORPROC glad_glVertexArrayBindingDivisor = NULL; +PFNGLVERTEXARRAYCOLOROFFSETEXTPROC glad_glVertexArrayColorOffsetEXT = NULL; +PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC glad_glVertexArrayEdgeFlagOffsetEXT = NULL; +PFNGLVERTEXARRAYELEMENTBUFFERPROC glad_glVertexArrayElementBuffer = NULL; +PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC glad_glVertexArrayFogCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYINDEXOFFSETEXTPROC glad_glVertexArrayIndexOffsetEXT = NULL; +PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC glad_glVertexArrayMultiTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYNORMALOFFSETEXTPROC glad_glVertexArrayNormalOffsetEXT = NULL; +PFNGLVERTEXARRAYPARAMETERIAPPLEPROC glad_glVertexArrayParameteriAPPLE = NULL; +PFNGLVERTEXARRAYRANGEAPPLEPROC glad_glVertexArrayRangeAPPLE = NULL; +PFNGLVERTEXARRAYRANGENVPROC glad_glVertexArrayRangeNV = NULL; +PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC glad_glVertexArraySecondaryColorOffsetEXT = NULL; +PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC glad_glVertexArrayTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glad_glVertexArrayVertexAttribBindingEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glad_glVertexArrayVertexAttribDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glad_glVertexArrayVertexAttribFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glad_glVertexArrayVertexAttribIFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glad_glVertexArrayVertexAttribIOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glad_glVertexArrayVertexAttribLFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glad_glVertexArrayVertexAttribLOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glad_glVertexArrayVertexAttribOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glad_glVertexArrayVertexBindingDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERPROC glad_glVertexArrayVertexBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERSPROC glad_glVertexArrayVertexBuffers = NULL; +PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glad_glVertexArrayVertexOffsetEXT = NULL; +PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB = NULL; +PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV = NULL; +PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB = NULL; +PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB = NULL; +PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB = NULL; +PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV = NULL; +PFNGLVERTEXATTRIB1HNVPROC glad_glVertexAttrib1hNV = NULL; +PFNGLVERTEXATTRIB1HVNVPROC glad_glVertexAttrib1hvNV = NULL; +PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB = NULL; +PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV = NULL; +PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB = NULL; +PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV = NULL; +PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB = NULL; +PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV = NULL; +PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB = NULL; +PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB = NULL; +PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB = NULL; +PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV = NULL; +PFNGLVERTEXATTRIB2HNVPROC glad_glVertexAttrib2hNV = NULL; +PFNGLVERTEXATTRIB2HVNVPROC glad_glVertexAttrib2hvNV = NULL; +PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB = NULL; +PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV = NULL; +PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB = NULL; +PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV = NULL; +PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB = NULL; +PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV = NULL; +PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB = NULL; +PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB = NULL; +PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB = NULL; +PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV = NULL; +PFNGLVERTEXATTRIB3HNVPROC glad_glVertexAttrib3hNV = NULL; +PFNGLVERTEXATTRIB3HVNVPROC glad_glVertexAttrib3hvNV = NULL; +PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB = NULL; +PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV = NULL; +PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB = NULL; +PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV = NULL; +PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB = NULL; +PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB = NULL; +PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB = NULL; +PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB = NULL; +PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB = NULL; +PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB = NULL; +PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB = NULL; +PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB = NULL; +PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB = NULL; +PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV = NULL; +PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB = NULL; +PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB = NULL; +PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB = NULL; +PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV = NULL; +PFNGLVERTEXATTRIB4HNVPROC glad_glVertexAttrib4hNV = NULL; +PFNGLVERTEXATTRIB4HVNVPROC glad_glVertexAttrib4hvNV = NULL; +PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB = NULL; +PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB = NULL; +PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV = NULL; +PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB = NULL; +PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV = NULL; +PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV = NULL; +PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB = NULL; +PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV = NULL; +PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB = NULL; +PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBARRAYOBJECTATIPROC glad_glVertexAttribArrayObjectATI = NULL; +PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding = NULL; +PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBDIVISORARBPROC glad_glVertexAttribDivisorARB = NULL; +PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat = NULL; +PFNGLVERTEXATTRIBFORMATNVPROC glad_glVertexAttribFormatNV = NULL; +PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IEXTPROC glad_glVertexAttribI1iEXT = NULL; +PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1IVEXTPROC glad_glVertexAttribI1ivEXT = NULL; +PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIEXTPROC glad_glVertexAttribI1uiEXT = NULL; +PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI1UIVEXTPROC glad_glVertexAttribI1uivEXT = NULL; +PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IEXTPROC glad_glVertexAttribI2iEXT = NULL; +PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2IVEXTPROC glad_glVertexAttribI2ivEXT = NULL; +PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIEXTPROC glad_glVertexAttribI2uiEXT = NULL; +PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI2UIVEXTPROC glad_glVertexAttribI2uivEXT = NULL; +PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IEXTPROC glad_glVertexAttribI3iEXT = NULL; +PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3IVEXTPROC glad_glVertexAttribI3ivEXT = NULL; +PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIEXTPROC glad_glVertexAttribI3uiEXT = NULL; +PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI3UIVEXTPROC glad_glVertexAttribI3uivEXT = NULL; +PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4BVEXTPROC glad_glVertexAttribI4bvEXT = NULL; +PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IEXTPROC glad_glVertexAttribI4iEXT = NULL; +PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4IVEXTPROC glad_glVertexAttribI4ivEXT = NULL; +PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4SVEXTPROC glad_glVertexAttribI4svEXT = NULL; +PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UBVEXTPROC glad_glVertexAttribI4ubvEXT = NULL; +PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIEXTPROC glad_glVertexAttribI4uiEXT = NULL; +PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4UIVEXTPROC glad_glVertexAttribI4uivEXT = NULL; +PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBI4USVEXTPROC glad_glVertexAttribI4usvEXT = NULL; +PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat = NULL; +PFNGLVERTEXATTRIBIFORMATNVPROC glad_glVertexAttribIFormatNV = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBIPOINTEREXTPROC glad_glVertexAttribIPointerEXT = NULL; +PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DEXTPROC glad_glVertexAttribL1dEXT = NULL; +PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL1DVEXTPROC glad_glVertexAttribL1dvEXT = NULL; +PFNGLVERTEXATTRIBL1I64NVPROC glad_glVertexAttribL1i64NV = NULL; +PFNGLVERTEXATTRIBL1I64VNVPROC glad_glVertexAttribL1i64vNV = NULL; +PFNGLVERTEXATTRIBL1UI64ARBPROC glad_glVertexAttribL1ui64ARB = NULL; +PFNGLVERTEXATTRIBL1UI64NVPROC glad_glVertexAttribL1ui64NV = NULL; +PFNGLVERTEXATTRIBL1UI64VARBPROC glad_glVertexAttribL1ui64vARB = NULL; +PFNGLVERTEXATTRIBL1UI64VNVPROC glad_glVertexAttribL1ui64vNV = NULL; +PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DEXTPROC glad_glVertexAttribL2dEXT = NULL; +PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL2DVEXTPROC glad_glVertexAttribL2dvEXT = NULL; +PFNGLVERTEXATTRIBL2I64NVPROC glad_glVertexAttribL2i64NV = NULL; +PFNGLVERTEXATTRIBL2I64VNVPROC glad_glVertexAttribL2i64vNV = NULL; +PFNGLVERTEXATTRIBL2UI64NVPROC glad_glVertexAttribL2ui64NV = NULL; +PFNGLVERTEXATTRIBL2UI64VNVPROC glad_glVertexAttribL2ui64vNV = NULL; +PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DEXTPROC glad_glVertexAttribL3dEXT = NULL; +PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL3DVEXTPROC glad_glVertexAttribL3dvEXT = NULL; +PFNGLVERTEXATTRIBL3I64NVPROC glad_glVertexAttribL3i64NV = NULL; +PFNGLVERTEXATTRIBL3I64VNVPROC glad_glVertexAttribL3i64vNV = NULL; +PFNGLVERTEXATTRIBL3UI64NVPROC glad_glVertexAttribL3ui64NV = NULL; +PFNGLVERTEXATTRIBL3UI64VNVPROC glad_glVertexAttribL3ui64vNV = NULL; +PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DEXTPROC glad_glVertexAttribL4dEXT = NULL; +PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBL4DVEXTPROC glad_glVertexAttribL4dvEXT = NULL; +PFNGLVERTEXATTRIBL4I64NVPROC glad_glVertexAttribL4i64NV = NULL; +PFNGLVERTEXATTRIBL4I64VNVPROC glad_glVertexAttribL4i64vNV = NULL; +PFNGLVERTEXATTRIBL4UI64NVPROC glad_glVertexAttribL4ui64NV = NULL; +PFNGLVERTEXATTRIBL4UI64VNVPROC glad_glVertexAttribL4ui64vNV = NULL; +PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat = NULL; +PFNGLVERTEXATTRIBLFORMATNVPROC glad_glVertexAttribLFormatNV = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer = NULL; +PFNGLVERTEXATTRIBLPOINTEREXTPROC glad_glVertexAttribLPointerEXT = NULL; +PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; +PFNGLVERTEXATTRIBPARAMETERIAMDPROC glad_glVertexAttribParameteriAMD = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB = NULL; +PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV = NULL; +PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV = NULL; +PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV = NULL; +PFNGLVERTEXATTRIBS1HVNVPROC glad_glVertexAttribs1hvNV = NULL; +PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV = NULL; +PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV = NULL; +PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV = NULL; +PFNGLVERTEXATTRIBS2HVNVPROC glad_glVertexAttribs2hvNV = NULL; +PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV = NULL; +PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV = NULL; +PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV = NULL; +PFNGLVERTEXATTRIBS3HVNVPROC glad_glVertexAttribs3hvNV = NULL; +PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV = NULL; +PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV = NULL; +PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV = NULL; +PFNGLVERTEXATTRIBS4HVNVPROC glad_glVertexAttribs4hvNV = NULL; +PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV = NULL; +PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV = NULL; +PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor = NULL; +PFNGLVERTEXBLENDARBPROC glad_glVertexBlendARB = NULL; +PFNGLVERTEXBLENDENVFATIPROC glad_glVertexBlendEnvfATI = NULL; +PFNGLVERTEXBLENDENVIATIPROC glad_glVertexBlendEnviATI = NULL; +PFNGLVERTEXFORMATNVPROC glad_glVertexFormatNV = NULL; +PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; +PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL; +PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT = NULL; +PFNGLVERTEXPOINTERLISTIBMPROC glad_glVertexPointerListIBM = NULL; +PFNGLVERTEXPOINTERVINTELPROC glad_glVertexPointervINTEL = NULL; +PFNGLVERTEXSTREAM1DATIPROC glad_glVertexStream1dATI = NULL; +PFNGLVERTEXSTREAM1DVATIPROC glad_glVertexStream1dvATI = NULL; +PFNGLVERTEXSTREAM1FATIPROC glad_glVertexStream1fATI = NULL; +PFNGLVERTEXSTREAM1FVATIPROC glad_glVertexStream1fvATI = NULL; +PFNGLVERTEXSTREAM1IATIPROC glad_glVertexStream1iATI = NULL; +PFNGLVERTEXSTREAM1IVATIPROC glad_glVertexStream1ivATI = NULL; +PFNGLVERTEXSTREAM1SATIPROC glad_glVertexStream1sATI = NULL; +PFNGLVERTEXSTREAM1SVATIPROC glad_glVertexStream1svATI = NULL; +PFNGLVERTEXSTREAM2DATIPROC glad_glVertexStream2dATI = NULL; +PFNGLVERTEXSTREAM2DVATIPROC glad_glVertexStream2dvATI = NULL; +PFNGLVERTEXSTREAM2FATIPROC glad_glVertexStream2fATI = NULL; +PFNGLVERTEXSTREAM2FVATIPROC glad_glVertexStream2fvATI = NULL; +PFNGLVERTEXSTREAM2IATIPROC glad_glVertexStream2iATI = NULL; +PFNGLVERTEXSTREAM2IVATIPROC glad_glVertexStream2ivATI = NULL; +PFNGLVERTEXSTREAM2SATIPROC glad_glVertexStream2sATI = NULL; +PFNGLVERTEXSTREAM2SVATIPROC glad_glVertexStream2svATI = NULL; +PFNGLVERTEXSTREAM3DATIPROC glad_glVertexStream3dATI = NULL; +PFNGLVERTEXSTREAM3DVATIPROC glad_glVertexStream3dvATI = NULL; +PFNGLVERTEXSTREAM3FATIPROC glad_glVertexStream3fATI = NULL; +PFNGLVERTEXSTREAM3FVATIPROC glad_glVertexStream3fvATI = NULL; +PFNGLVERTEXSTREAM3IATIPROC glad_glVertexStream3iATI = NULL; +PFNGLVERTEXSTREAM3IVATIPROC glad_glVertexStream3ivATI = NULL; +PFNGLVERTEXSTREAM3SATIPROC glad_glVertexStream3sATI = NULL; +PFNGLVERTEXSTREAM3SVATIPROC glad_glVertexStream3svATI = NULL; +PFNGLVERTEXSTREAM4DATIPROC glad_glVertexStream4dATI = NULL; +PFNGLVERTEXSTREAM4DVATIPROC glad_glVertexStream4dvATI = NULL; +PFNGLVERTEXSTREAM4FATIPROC glad_glVertexStream4fATI = NULL; +PFNGLVERTEXSTREAM4FVATIPROC glad_glVertexStream4fvATI = NULL; +PFNGLVERTEXSTREAM4IATIPROC glad_glVertexStream4iATI = NULL; +PFNGLVERTEXSTREAM4IVATIPROC glad_glVertexStream4ivATI = NULL; +PFNGLVERTEXSTREAM4SATIPROC glad_glVertexStream4sATI = NULL; +PFNGLVERTEXSTREAM4SVATIPROC glad_glVertexStream4svATI = NULL; +PFNGLVERTEXWEIGHTPOINTEREXTPROC glad_glVertexWeightPointerEXT = NULL; +PFNGLVERTEXWEIGHTFEXTPROC glad_glVertexWeightfEXT = NULL; +PFNGLVERTEXWEIGHTFVEXTPROC glad_glVertexWeightfvEXT = NULL; +PFNGLVERTEXWEIGHTHNVPROC glad_glVertexWeighthNV = NULL; +PFNGLVERTEXWEIGHTHVNVPROC glad_glVertexWeighthvNV = NULL; +PFNGLVIDEOCAPTURENVPROC glad_glVideoCaptureNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC glad_glVideoCaptureStreamParameterdvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC glad_glVideoCaptureStreamParameterfvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC glad_glVideoCaptureStreamParameterivNV = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv = NULL; +PFNGLVIEWPORTPOSITIONWSCALENVPROC glad_glViewportPositionWScaleNV = NULL; +PFNGLVIEWPORTSWIZZLENVPROC glad_glViewportSwizzleNV = NULL; +PFNGLWAITSEMAPHOREEXTPROC glad_glWaitSemaphoreEXT = NULL; +PFNGLWAITSEMAPHOREUI64NVXPROC glad_glWaitSemaphoreui64NVX = NULL; +PFNGLWAITSYNCPROC glad_glWaitSync = NULL; +PFNGLWAITVKSEMAPHORENVPROC glad_glWaitVkSemaphoreNV = NULL; +PFNGLWEIGHTPATHSNVPROC glad_glWeightPathsNV = NULL; +PFNGLWEIGHTPOINTERARBPROC glad_glWeightPointerARB = NULL; +PFNGLWEIGHTBVARBPROC glad_glWeightbvARB = NULL; +PFNGLWEIGHTDVARBPROC glad_glWeightdvARB = NULL; +PFNGLWEIGHTFVARBPROC glad_glWeightfvARB = NULL; +PFNGLWEIGHTIVARBPROC glad_glWeightivARB = NULL; +PFNGLWEIGHTSVARBPROC glad_glWeightsvARB = NULL; +PFNGLWEIGHTUBVARBPROC glad_glWeightubvARB = NULL; +PFNGLWEIGHTUIVARBPROC glad_glWeightuivARB = NULL; +PFNGLWEIGHTUSVARBPROC glad_glWeightusvARB = NULL; +PFNGLWINDOWPOS2DPROC glad_glWindowPos2d = NULL; +PFNGLWINDOWPOS2DARBPROC glad_glWindowPos2dARB = NULL; +PFNGLWINDOWPOS2DMESAPROC glad_glWindowPos2dMESA = NULL; +PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv = NULL; +PFNGLWINDOWPOS2DVARBPROC glad_glWindowPos2dvARB = NULL; +PFNGLWINDOWPOS2DVMESAPROC glad_glWindowPos2dvMESA = NULL; +PFNGLWINDOWPOS2FPROC glad_glWindowPos2f = NULL; +PFNGLWINDOWPOS2FARBPROC glad_glWindowPos2fARB = NULL; +PFNGLWINDOWPOS2FMESAPROC glad_glWindowPos2fMESA = NULL; +PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv = NULL; +PFNGLWINDOWPOS2FVARBPROC glad_glWindowPos2fvARB = NULL; +PFNGLWINDOWPOS2FVMESAPROC glad_glWindowPos2fvMESA = NULL; +PFNGLWINDOWPOS2IPROC glad_glWindowPos2i = NULL; +PFNGLWINDOWPOS2IARBPROC glad_glWindowPos2iARB = NULL; +PFNGLWINDOWPOS2IMESAPROC glad_glWindowPos2iMESA = NULL; +PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv = NULL; +PFNGLWINDOWPOS2IVARBPROC glad_glWindowPos2ivARB = NULL; +PFNGLWINDOWPOS2IVMESAPROC glad_glWindowPos2ivMESA = NULL; +PFNGLWINDOWPOS2SPROC glad_glWindowPos2s = NULL; +PFNGLWINDOWPOS2SARBPROC glad_glWindowPos2sARB = NULL; +PFNGLWINDOWPOS2SMESAPROC glad_glWindowPos2sMESA = NULL; +PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv = NULL; +PFNGLWINDOWPOS2SVARBPROC glad_glWindowPos2svARB = NULL; +PFNGLWINDOWPOS2SVMESAPROC glad_glWindowPos2svMESA = NULL; +PFNGLWINDOWPOS3DPROC glad_glWindowPos3d = NULL; +PFNGLWINDOWPOS3DARBPROC glad_glWindowPos3dARB = NULL; +PFNGLWINDOWPOS3DMESAPROC glad_glWindowPos3dMESA = NULL; +PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv = NULL; +PFNGLWINDOWPOS3DVARBPROC glad_glWindowPos3dvARB = NULL; +PFNGLWINDOWPOS3DVMESAPROC glad_glWindowPos3dvMESA = NULL; +PFNGLWINDOWPOS3FPROC glad_glWindowPos3f = NULL; +PFNGLWINDOWPOS3FARBPROC glad_glWindowPos3fARB = NULL; +PFNGLWINDOWPOS3FMESAPROC glad_glWindowPos3fMESA = NULL; +PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv = NULL; +PFNGLWINDOWPOS3FVARBPROC glad_glWindowPos3fvARB = NULL; +PFNGLWINDOWPOS3FVMESAPROC glad_glWindowPos3fvMESA = NULL; +PFNGLWINDOWPOS3IPROC glad_glWindowPos3i = NULL; +PFNGLWINDOWPOS3IARBPROC glad_glWindowPos3iARB = NULL; +PFNGLWINDOWPOS3IMESAPROC glad_glWindowPos3iMESA = NULL; +PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv = NULL; +PFNGLWINDOWPOS3IVARBPROC glad_glWindowPos3ivARB = NULL; +PFNGLWINDOWPOS3IVMESAPROC glad_glWindowPos3ivMESA = NULL; +PFNGLWINDOWPOS3SPROC glad_glWindowPos3s = NULL; +PFNGLWINDOWPOS3SARBPROC glad_glWindowPos3sARB = NULL; +PFNGLWINDOWPOS3SMESAPROC glad_glWindowPos3sMESA = NULL; +PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv = NULL; +PFNGLWINDOWPOS3SVARBPROC glad_glWindowPos3svARB = NULL; +PFNGLWINDOWPOS3SVMESAPROC glad_glWindowPos3svMESA = NULL; +PFNGLWINDOWPOS4DMESAPROC glad_glWindowPos4dMESA = NULL; +PFNGLWINDOWPOS4DVMESAPROC glad_glWindowPos4dvMESA = NULL; +PFNGLWINDOWPOS4FMESAPROC glad_glWindowPos4fMESA = NULL; +PFNGLWINDOWPOS4FVMESAPROC glad_glWindowPos4fvMESA = NULL; +PFNGLWINDOWPOS4IMESAPROC glad_glWindowPos4iMESA = NULL; +PFNGLWINDOWPOS4IVMESAPROC glad_glWindowPos4ivMESA = NULL; +PFNGLWINDOWPOS4SMESAPROC glad_glWindowPos4sMESA = NULL; +PFNGLWINDOWPOS4SVMESAPROC glad_glWindowPos4svMESA = NULL; +PFNGLWINDOWRECTANGLESEXTPROC glad_glWindowRectanglesEXT = NULL; +PFNGLWRITEMASKEXTPROC glad_glWriteMaskEXT = NULL; +PFNGLACTIVESHADERPROGRAMEXTPROC glad_glActiveShaderProgramEXT = NULL; +PFNGLALPHAFUNCQCOMPROC glad_glAlphaFuncQCOM = NULL; +PFNGLBEGINQUERYEXTPROC glad_glBeginQueryEXT = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC glad_glBindFragDataLocationIndexedEXT = NULL; +PFNGLBINDPROGRAMPIPELINEEXTPROC glad_glBindProgramPipelineEXT = NULL; +PFNGLBINDVERTEXARRAYOESPROC glad_glBindVertexArrayOES = NULL; +PFNGLBLENDBARRIERPROC glad_glBlendBarrier = NULL; +PFNGLBLENDEQUATIONSEPARATEIEXTPROC glad_glBlendEquationSeparateiEXT = NULL; +PFNGLBLENDEQUATIONSEPARATEIOESPROC glad_glBlendEquationSeparateiOES = NULL; +PFNGLBLENDEQUATIONIEXTPROC glad_glBlendEquationiEXT = NULL; +PFNGLBLENDEQUATIONIOESPROC glad_glBlendEquationiOES = NULL; +PFNGLBLENDFUNCSEPARATEIEXTPROC glad_glBlendFuncSeparateiEXT = NULL; +PFNGLBLENDFUNCSEPARATEIOESPROC glad_glBlendFuncSeparateiOES = NULL; +PFNGLBLENDFUNCIEXTPROC glad_glBlendFunciEXT = NULL; +PFNGLBLENDFUNCIOESPROC glad_glBlendFunciOES = NULL; +PFNGLBLITFRAMEBUFFERANGLEPROC glad_glBlitFramebufferANGLE = NULL; +PFNGLBLITFRAMEBUFFERNVPROC glad_glBlitFramebufferNV = NULL; +PFNGLBUFFERSTORAGEEXTPROC glad_glBufferStorageEXT = NULL; +PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC glad_glClearPixelLocalStorageuiEXT = NULL; +PFNGLCLEARTEXIMAGEEXTPROC glad_glClearTexImageEXT = NULL; +PFNGLCLEARTEXSUBIMAGEEXTPROC glad_glClearTexSubImageEXT = NULL; +PFNGLCLIENTWAITSYNCAPPLEPROC glad_glClientWaitSyncAPPLE = NULL; +PFNGLCLIPCONTROLEXTPROC glad_glClipControlEXT = NULL; +PFNGLCOLORMASKIEXTPROC glad_glColorMaskiEXT = NULL; +PFNGLCOLORMASKIOESPROC glad_glColorMaskiOES = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DOESPROC glad_glCompressedTexImage3DOES = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC glad_glCompressedTexSubImage3DOES = NULL; +PFNGLCOPYBUFFERSUBDATANVPROC glad_glCopyBufferSubDataNV = NULL; +PFNGLCOPYIMAGESUBDATAEXTPROC glad_glCopyImageSubDataEXT = NULL; +PFNGLCOPYIMAGESUBDATAOESPROC glad_glCopyImageSubDataOES = NULL; +PFNGLCOPYTEXSUBIMAGE3DOESPROC glad_glCopyTexSubImage3DOES = NULL; +PFNGLCOPYTEXTURELEVELSAPPLEPROC glad_glCopyTextureLevelsAPPLE = NULL; +PFNGLCOVERAGEMASKNVPROC glad_glCoverageMaskNV = NULL; +PFNGLCOVERAGEOPERATIONNVPROC glad_glCoverageOperationNV = NULL; +PFNGLCREATESHADERPROGRAMVEXTPROC glad_glCreateShaderProgramvEXT = NULL; +PFNGLDEBUGMESSAGECALLBACKKHRPROC glad_glDebugMessageCallbackKHR = NULL; +PFNGLDEBUGMESSAGECONTROLKHRPROC glad_glDebugMessageControlKHR = NULL; +PFNGLDEBUGMESSAGEINSERTKHRPROC glad_glDebugMessageInsertKHR = NULL; +PFNGLDELETEPROGRAMPIPELINESEXTPROC glad_glDeleteProgramPipelinesEXT = NULL; +PFNGLDELETEQUERIESEXTPROC glad_glDeleteQueriesEXT = NULL; +PFNGLDELETESYNCAPPLEPROC glad_glDeleteSyncAPPLE = NULL; +PFNGLDELETEVERTEXARRAYSOESPROC glad_glDeleteVertexArraysOES = NULL; +PFNGLDEPTHRANGEARRAYFVNVPROC glad_glDepthRangeArrayfvNV = NULL; +PFNGLDEPTHRANGEARRAYFVOESPROC glad_glDepthRangeArrayfvOES = NULL; +PFNGLDEPTHRANGEINDEXEDFNVPROC glad_glDepthRangeIndexedfNV = NULL; +PFNGLDEPTHRANGEINDEXEDFOESPROC glad_glDepthRangeIndexedfOES = NULL; +PFNGLDISABLEDRIVERCONTROLQCOMPROC glad_glDisableDriverControlQCOM = NULL; +PFNGLDISABLEIEXTPROC glad_glDisableiEXT = NULL; +PFNGLDISABLEINVPROC glad_glDisableiNV = NULL; +PFNGLDISABLEIOESPROC glad_glDisableiOES = NULL; +PFNGLDISCARDFRAMEBUFFEREXTPROC glad_glDiscardFramebufferEXT = NULL; +PFNGLDRAWARRAYSINSTANCEDANGLEPROC glad_glDrawArraysInstancedANGLE = NULL; +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC glad_glDrawArraysInstancedBaseInstanceEXT = NULL; +PFNGLDRAWARRAYSINSTANCEDNVPROC glad_glDrawArraysInstancedNV = NULL; +PFNGLDRAWBUFFERSEXTPROC glad_glDrawBuffersEXT = NULL; +PFNGLDRAWBUFFERSINDEXEDEXTPROC glad_glDrawBuffersIndexedEXT = NULL; +PFNGLDRAWBUFFERSNVPROC glad_glDrawBuffersNV = NULL; +PFNGLDRAWELEMENTSBASEVERTEXEXTPROC glad_glDrawElementsBaseVertexEXT = NULL; +PFNGLDRAWELEMENTSBASEVERTEXOESPROC glad_glDrawElementsBaseVertexOES = NULL; +PFNGLDRAWELEMENTSINSTANCEDANGLEPROC glad_glDrawElementsInstancedANGLE = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC glad_glDrawElementsInstancedBaseInstanceEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC glad_glDrawElementsInstancedBaseVertexBaseInstanceEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC glad_glDrawElementsInstancedBaseVertexEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC glad_glDrawElementsInstancedBaseVertexOES = NULL; +PFNGLDRAWELEMENTSINSTANCEDNVPROC glad_glDrawElementsInstancedNV = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC glad_glDrawRangeElementsBaseVertexEXT = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC glad_glDrawRangeElementsBaseVertexOES = NULL; +PFNGLDRAWTRANSFORMFEEDBACKEXTPROC glad_glDrawTransformFeedbackEXT = NULL; +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC glad_glDrawTransformFeedbackInstancedEXT = NULL; +PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glad_glEGLImageTargetRenderbufferStorageOES = NULL; +PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glad_glEGLImageTargetTexture2DOES = NULL; +PFNGLENABLEDRIVERCONTROLQCOMPROC glad_glEnableDriverControlQCOM = NULL; +PFNGLENABLEIEXTPROC glad_glEnableiEXT = NULL; +PFNGLENABLEINVPROC glad_glEnableiNV = NULL; +PFNGLENABLEIOESPROC glad_glEnableiOES = NULL; +PFNGLENDQUERYEXTPROC glad_glEndQueryEXT = NULL; +PFNGLENDTILINGQCOMPROC glad_glEndTilingQCOM = NULL; +PFNGLEXTGETBUFFERPOINTERVQCOMPROC glad_glExtGetBufferPointervQCOM = NULL; +PFNGLEXTGETBUFFERSQCOMPROC glad_glExtGetBuffersQCOM = NULL; +PFNGLEXTGETFRAMEBUFFERSQCOMPROC glad_glExtGetFramebuffersQCOM = NULL; +PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC glad_glExtGetProgramBinarySourceQCOM = NULL; +PFNGLEXTGETPROGRAMSQCOMPROC glad_glExtGetProgramsQCOM = NULL; +PFNGLEXTGETRENDERBUFFERSQCOMPROC glad_glExtGetRenderbuffersQCOM = NULL; +PFNGLEXTGETSHADERSQCOMPROC glad_glExtGetShadersQCOM = NULL; +PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC glad_glExtGetTexLevelParameterivQCOM = NULL; +PFNGLEXTGETTEXSUBIMAGEQCOMPROC glad_glExtGetTexSubImageQCOM = NULL; +PFNGLEXTGETTEXTURESQCOMPROC glad_glExtGetTexturesQCOM = NULL; +PFNGLEXTISPROGRAMBINARYQCOMPROC glad_glExtIsProgramBinaryQCOM = NULL; +PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC glad_glExtTexObjectStateOverrideiQCOM = NULL; +PFNGLEXTRAPOLATETEX2DQCOMPROC glad_glExtrapolateTex2DQCOM = NULL; +PFNGLFENCESYNCAPPLEPROC glad_glFenceSyncAPPLE = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC glad_glFlushMappedBufferRangeEXT = NULL; +PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC glad_glFramebufferFetchBarrierQCOM = NULL; +PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC glad_glFramebufferFoveationConfigQCOM = NULL; +PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC glad_glFramebufferFoveationParametersQCOM = NULL; +PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC glad_glFramebufferPixelLocalStorageSizeEXT = NULL; +PFNGLFRAMEBUFFERSHADINGRATEEXTPROC glad_glFramebufferShadingRateEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC glad_glFramebufferTexture2DDownsampleIMG = NULL; +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glad_glFramebufferTexture2DMultisampleEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC glad_glFramebufferTexture2DMultisampleIMG = NULL; +PFNGLFRAMEBUFFERTEXTURE3DOESPROC glad_glFramebufferTexture3DOES = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC glad_glFramebufferTextureLayerDownsampleIMG = NULL; +PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glad_glFramebufferTextureMultisampleMultiviewOVR = NULL; +PFNGLFRAMEBUFFERTEXTUREOESPROC glad_glFramebufferTextureOES = NULL; +PFNGLGENPROGRAMPIPELINESEXTPROC glad_glGenProgramPipelinesEXT = NULL; +PFNGLGENQUERIESEXTPROC glad_glGenQueriesEXT = NULL; +PFNGLGENVERTEXARRAYSOESPROC glad_glGenVertexArraysOES = NULL; +PFNGLGETBUFFERPOINTERVOESPROC glad_glGetBufferPointervOES = NULL; +PFNGLGETDEBUGMESSAGELOGKHRPROC glad_glGetDebugMessageLogKHR = NULL; +PFNGLGETDRIVERCONTROLSTRINGQCOMPROC glad_glGetDriverControlStringQCOM = NULL; +PFNGLGETDRIVERCONTROLSQCOMPROC glad_glGetDriverControlsQCOM = NULL; +PFNGLGETFLOATI_VNVPROC glad_glGetFloati_vNV = NULL; +PFNGLGETFLOATI_VOESPROC glad_glGetFloati_vOES = NULL; +PFNGLGETFRAGDATAINDEXEXTPROC glad_glGetFragDataIndexEXT = NULL; +PFNGLGETFRAGMENTSHADINGRATESEXTPROC glad_glGetFragmentShadingRatesEXT = NULL; +PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC glad_glGetFramebufferPixelLocalStorageSizeEXT = NULL; +PFNGLGETGRAPHICSRESETSTATUSEXTPROC glad_glGetGraphicsResetStatusEXT = NULL; +PFNGLGETGRAPHICSRESETSTATUSKHRPROC glad_glGetGraphicsResetStatusKHR = NULL; +PFNGLGETINTEGER64VAPPLEPROC glad_glGetInteger64vAPPLE = NULL; +PFNGLGETINTEGER64VEXTPROC glad_glGetInteger64vEXT = NULL; +PFNGLGETINTEGERI_VEXTPROC glad_glGetIntegeri_vEXT = NULL; +PFNGLGETOBJECTLABELKHRPROC glad_glGetObjectLabelKHR = NULL; +PFNGLGETOBJECTPTRLABELKHRPROC glad_glGetObjectPtrLabelKHR = NULL; +PFNGLGETPOINTERVKHRPROC glad_glGetPointervKHR = NULL; +PFNGLGETPROGRAMBINARYOESPROC glad_glGetProgramBinaryOES = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC glad_glGetProgramPipelineInfoLogEXT = NULL; +PFNGLGETPROGRAMPIPELINEIVEXTPROC glad_glGetProgramPipelineivEXT = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC glad_glGetProgramResourceLocationIndexEXT = NULL; +PFNGLGETQUERYOBJECTIVEXTPROC glad_glGetQueryObjectivEXT = NULL; +PFNGLGETQUERYOBJECTUIVEXTPROC glad_glGetQueryObjectuivEXT = NULL; +PFNGLGETQUERYIVEXTPROC glad_glGetQueryivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIIVEXTPROC glad_glGetSamplerParameterIivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIIVOESPROC glad_glGetSamplerParameterIivOES = NULL; +PFNGLGETSAMPLERPARAMETERIUIVEXTPROC glad_glGetSamplerParameterIuivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIUIVOESPROC glad_glGetSamplerParameterIuivOES = NULL; +PFNGLGETSYNCIVAPPLEPROC glad_glGetSyncivAPPLE = NULL; +PFNGLGETTEXPARAMETERIIVOESPROC glad_glGetTexParameterIivOES = NULL; +PFNGLGETTEXPARAMETERIUIVOESPROC glad_glGetTexParameterIuivOES = NULL; +PFNGLGETTEXTUREHANDLEIMGPROC glad_glGetTextureHandleIMG = NULL; +PFNGLGETTEXTURESAMPLERHANDLEIMGPROC glad_glGetTextureSamplerHandleIMG = NULL; +PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC glad_glGetTranslatedShaderSourceANGLE = NULL; +PFNGLGETNUNIFORMFVEXTPROC glad_glGetnUniformfvEXT = NULL; +PFNGLGETNUNIFORMFVKHRPROC glad_glGetnUniformfvKHR = NULL; +PFNGLGETNUNIFORMIVEXTPROC glad_glGetnUniformivEXT = NULL; +PFNGLGETNUNIFORMIVKHRPROC glad_glGetnUniformivKHR = NULL; +PFNGLGETNUNIFORMUIVKHRPROC glad_glGetnUniformuivKHR = NULL; +PFNGLISENABLEDIEXTPROC glad_glIsEnablediEXT = NULL; +PFNGLISENABLEDINVPROC glad_glIsEnablediNV = NULL; +PFNGLISENABLEDIOESPROC glad_glIsEnablediOES = NULL; +PFNGLISPROGRAMPIPELINEEXTPROC glad_glIsProgramPipelineEXT = NULL; +PFNGLISQUERYEXTPROC glad_glIsQueryEXT = NULL; +PFNGLISSYNCAPPLEPROC glad_glIsSyncAPPLE = NULL; +PFNGLISVERTEXARRAYOESPROC glad_glIsVertexArrayOES = NULL; +PFNGLMAPBUFFEROESPROC glad_glMapBufferOES = NULL; +PFNGLMAPBUFFERRANGEEXTPROC glad_glMapBufferRangeEXT = NULL; +PFNGLMAXACTIVESHADERCORESARMPROC glad_glMaxActiveShaderCoresARM = NULL; +PFNGLMINSAMPLESHADINGOESPROC glad_glMinSampleShadingOES = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC glad_glMultiDrawArraysIndirectEXT = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC glad_glMultiDrawElementsBaseVertexEXT = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC glad_glMultiDrawElementsIndirectEXT = NULL; +PFNGLOBJECTLABELKHRPROC glad_glObjectLabelKHR = NULL; +PFNGLOBJECTPTRLABELKHRPROC glad_glObjectPtrLabelKHR = NULL; +PFNGLPATCHPARAMETERIEXTPROC glad_glPatchParameteriEXT = NULL; +PFNGLPATCHPARAMETERIOESPROC glad_glPatchParameteriOES = NULL; +PFNGLPOLYGONMODENVPROC glad_glPolygonModeNV = NULL; +PFNGLPOPDEBUGGROUPKHRPROC glad_glPopDebugGroupKHR = NULL; +PFNGLPRIMITIVEBOUNDINGBOXPROC glad_glPrimitiveBoundingBox = NULL; +PFNGLPRIMITIVEBOUNDINGBOXEXTPROC glad_glPrimitiveBoundingBoxEXT = NULL; +PFNGLPRIMITIVEBOUNDINGBOXOESPROC glad_glPrimitiveBoundingBoxOES = NULL; +PFNGLPROGRAMBINARYOESPROC glad_glProgramBinaryOES = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC glad_glProgramUniformHandleui64IMG = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC glad_glProgramUniformHandleui64vIMG = NULL; +PFNGLPUSHDEBUGGROUPKHRPROC glad_glPushDebugGroupKHR = NULL; +PFNGLQUERYCOUNTEREXTPROC glad_glQueryCounterEXT = NULL; +PFNGLREADBUFFERINDEXEDEXTPROC glad_glReadBufferIndexedEXT = NULL; +PFNGLREADBUFFERNVPROC glad_glReadBufferNV = NULL; +PFNGLREADNPIXELSEXTPROC glad_glReadnPixelsEXT = NULL; +PFNGLREADNPIXELSKHRPROC glad_glReadnPixelsKHR = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC glad_glRenderbufferStorageMultisampleANGLE = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC glad_glRenderbufferStorageMultisampleAPPLE = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC glad_glRenderbufferStorageMultisampleIMG = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC glad_glRenderbufferStorageMultisampleNV = NULL; +PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC glad_glResolveMultisampleFramebufferAPPLE = NULL; +PFNGLSAMPLERPARAMETERIIVEXTPROC glad_glSamplerParameterIivEXT = NULL; +PFNGLSAMPLERPARAMETERIIVOESPROC glad_glSamplerParameterIivOES = NULL; +PFNGLSAMPLERPARAMETERIUIVEXTPROC glad_glSamplerParameterIuivEXT = NULL; +PFNGLSAMPLERPARAMETERIUIVOESPROC glad_glSamplerParameterIuivOES = NULL; +PFNGLSCISSORARRAYVNVPROC glad_glScissorArrayvNV = NULL; +PFNGLSCISSORARRAYVOESPROC glad_glScissorArrayvOES = NULL; +PFNGLSCISSORINDEXEDNVPROC glad_glScissorIndexedNV = NULL; +PFNGLSCISSORINDEXEDOESPROC glad_glScissorIndexedOES = NULL; +PFNGLSCISSORINDEXEDVNVPROC glad_glScissorIndexedvNV = NULL; +PFNGLSCISSORINDEXEDVOESPROC glad_glScissorIndexedvOES = NULL; +PFNGLSHADINGRATECOMBINEROPSEXTPROC glad_glShadingRateCombinerOpsEXT = NULL; +PFNGLSHADINGRATEEXTPROC glad_glShadingRateEXT = NULL; +PFNGLSHADINGRATEQCOMPROC glad_glShadingRateQCOM = NULL; +PFNGLSTARTTILINGQCOMPROC glad_glStartTilingQCOM = NULL; +PFNGLTEXBUFFEROESPROC glad_glTexBufferOES = NULL; +PFNGLTEXBUFFERRANGEEXTPROC glad_glTexBufferRangeEXT = NULL; +PFNGLTEXBUFFERRANGEOESPROC glad_glTexBufferRangeOES = NULL; +PFNGLTEXESTIMATEMOTIONQCOMPROC glad_glTexEstimateMotionQCOM = NULL; +PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC glad_glTexEstimateMotionRegionsQCOM = NULL; +PFNGLTEXIMAGE3DOESPROC glad_glTexImage3DOES = NULL; +PFNGLTEXPAGECOMMITMENTEXTPROC glad_glTexPageCommitmentEXT = NULL; +PFNGLTEXPARAMETERIIVOESPROC glad_glTexParameterIivOES = NULL; +PFNGLTEXPARAMETERIUIVOESPROC glad_glTexParameterIuivOES = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC glad_glTexStorage3DMultisampleOES = NULL; +PFNGLTEXSTORAGEATTRIBS2DEXTPROC glad_glTexStorageAttribs2DEXT = NULL; +PFNGLTEXSTORAGEATTRIBS3DEXTPROC glad_glTexStorageAttribs3DEXT = NULL; +PFNGLTEXSUBIMAGE3DOESPROC glad_glTexSubImage3DOES = NULL; +PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC glad_glTextureFoveationParametersQCOM = NULL; +PFNGLTEXTUREVIEWEXTPROC glad_glTextureViewEXT = NULL; +PFNGLTEXTUREVIEWOESPROC glad_glTextureViewOES = NULL; +PFNGLUNIFORMHANDLEUI64IMGPROC glad_glUniformHandleui64IMG = NULL; +PFNGLUNIFORMHANDLEUI64VIMGPROC glad_glUniformHandleui64vIMG = NULL; +PFNGLUNIFORMMATRIX2X3FVNVPROC glad_glUniformMatrix2x3fvNV = NULL; +PFNGLUNIFORMMATRIX2X4FVNVPROC glad_glUniformMatrix2x4fvNV = NULL; +PFNGLUNIFORMMATRIX3X2FVNVPROC glad_glUniformMatrix3x2fvNV = NULL; +PFNGLUNIFORMMATRIX3X4FVNVPROC glad_glUniformMatrix3x4fvNV = NULL; +PFNGLUNIFORMMATRIX4X2FVNVPROC glad_glUniformMatrix4x2fvNV = NULL; +PFNGLUNIFORMMATRIX4X3FVNVPROC glad_glUniformMatrix4x3fvNV = NULL; +PFNGLUNMAPBUFFEROESPROC glad_glUnmapBufferOES = NULL; +PFNGLUSEPROGRAMSTAGESEXTPROC glad_glUseProgramStagesEXT = NULL; +PFNGLVALIDATEPROGRAMPIPELINEEXTPROC glad_glValidateProgramPipelineEXT = NULL; +PFNGLVERTEXATTRIBDIVISORANGLEPROC glad_glVertexAttribDivisorANGLE = NULL; +PFNGLVERTEXATTRIBDIVISOREXTPROC glad_glVertexAttribDivisorEXT = NULL; +PFNGLVERTEXATTRIBDIVISORNVPROC glad_glVertexAttribDivisorNV = NULL; +PFNGLVIEWPORTARRAYVNVPROC glad_glViewportArrayvNV = NULL; +PFNGLVIEWPORTARRAYVOESPROC glad_glViewportArrayvOES = NULL; +PFNGLVIEWPORTINDEXEDFNVPROC glad_glViewportIndexedfNV = NULL; +PFNGLVIEWPORTINDEXEDFOESPROC glad_glViewportIndexedfOES = NULL; +PFNGLVIEWPORTINDEXEDFVNVPROC glad_glViewportIndexedfvNV = NULL; +PFNGLVIEWPORTINDEXEDFVOESPROC glad_glViewportIndexedfvOES = NULL; +PFNGLWAITSYNCAPPLEPROC glad_glWaitSyncAPPLE = NULL; + + +static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_0) return; + glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum"); + glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc"); + glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin"); + glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap"); + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList"); + glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth"); + glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane"); + glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b"); + glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv"); + glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d"); + glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv"); + glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f"); + glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv"); + glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i"); + glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv"); + glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s"); + glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv"); + glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub"); + glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv"); + glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui"); + glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv"); + glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us"); + glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv"); + glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b"); + glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv"); + glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d"); + glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv"); + glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f"); + glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv"); + glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i"); + glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv"); + glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s"); + glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv"); + glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub"); + glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv"); + glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui"); + glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv"); + glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us"); + glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial"); + glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer"); + glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels"); + glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag"); + glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd"); + glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList"); + glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d"); + glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv"); + glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f"); + glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv"); + glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d"); + glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv"); + glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f"); + glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv"); + glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1"); + glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2"); + glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1"); + glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2"); + glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf"); + glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv"); + glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi"); + glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum"); + glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane"); + glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv"); + glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv"); + glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv"); + glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv"); + glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv"); + glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv"); + glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv"); + glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv"); + glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv"); + glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv"); + glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv"); + glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv"); + glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv"); + glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv"); + glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv"); + glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask"); + glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd"); + glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv"); + glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf"); + glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv"); + glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi"); + glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv"); + glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs"); + glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv"); + glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList"); + glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf"); + glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv"); + glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli"); + glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv"); + glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf"); + glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv"); + glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti"); + glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv"); + glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase"); + glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity"); + glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd"); + glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf"); + glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName"); + glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); + glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d"); + glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f"); + glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d"); + glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f"); + glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d"); + glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f"); + glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d"); + glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f"); + glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf"); + glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv"); + glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali"); + glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv"); + glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode"); + glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd"); + glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf"); + glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList"); + glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b"); + glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv"); + glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d"); + glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv"); + glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f"); + glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv"); + glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i"); + glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv"); + glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s"); + glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv"); + glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho"); + glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough"); + glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv"); + glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv"); + glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv"); + glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf"); + glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi"); + glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom"); + glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize"); + glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode"); + glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple"); + glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib"); + glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix"); + glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName"); + glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib"); + glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix"); + glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName"); + glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d"); + glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv"); + glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f"); + glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv"); + glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i"); + glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv"); + glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s"); + glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv"); + glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d"); + glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv"); + glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f"); + glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv"); + glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i"); + glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv"); + glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s"); + glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv"); + glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d"); + glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv"); + glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f"); + glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv"); + glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i"); + glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv"); + glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s"); + glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd"); + glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv"); + glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf"); + glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv"); + glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti"); + glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv"); + glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects"); + glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv"); + glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode"); + glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated"); + glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef"); + glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled"); + glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer"); + glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d"); + glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv"); + glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f"); + glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv"); + glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i"); + glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv"); + glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s"); + glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv"); + glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d"); + glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv"); + glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f"); + glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv"); + glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i"); + glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv"); + glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s"); + glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv"); + glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d"); + glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv"); + glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f"); + glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv"); + glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i"); + glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv"); + glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s"); + glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv"); + glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d"); + glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv"); + glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f"); + glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv"); + glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i"); + glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv"); + glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s"); + glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv"); + glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf"); + glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv"); + glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi"); + glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv"); + glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend"); + glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv"); + glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf"); + glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv"); + glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni"); + glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv"); + glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated"); + glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef"); + glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d"); + glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv"); + glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f"); + glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv"); + glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i"); + glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv"); + glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s"); + glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv"); + glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d"); + glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv"); + glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f"); + glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv"); + glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i"); + glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv"); + glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s"); + glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv"); + glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d"); + glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv"); + glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f"); + glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv"); + glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i"); + glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv"); + glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s"); + glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_1) return; + glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident"); + glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement"); + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer"); + glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer"); + glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer"); + glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub"); + glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv"); + glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib"); + glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures"); + glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib"); + glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer"); + glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); + glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer"); +} +static void glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_2) return; + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); +} +static void glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_3) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); + glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); + glad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load(userptr, "glLoadTransposeMatrixd"); + glad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load(userptr, "glLoadTransposeMatrixf"); + glad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load(userptr, "glMultTransposeMatrixd"); + glad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load(userptr, "glMultTransposeMatrixf"); + glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d"); + glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv"); + glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f"); + glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv"); + glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i"); + glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv"); + glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s"); + glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv"); + glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d"); + glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv"); + glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f"); + glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv"); + glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i"); + glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv"); + glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s"); + glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv"); + glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d"); + glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv"); + glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f"); + glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv"); + glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i"); + glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv"); + glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s"); + glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv"); + glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d"); + glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv"); + glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); + glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv"); + glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i"); + glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv"); + glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s"); + glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); +} +static void glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_4) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load(userptr, "glFogCoordPointer"); + glad_glFogCoordd = (PFNGLFOGCOORDDPROC) load(userptr, "glFogCoordd"); + glad_glFogCoorddv = (PFNGLFOGCOORDDVPROC) load(userptr, "glFogCoorddv"); + glad_glFogCoordf = (PFNGLFOGCOORDFPROC) load(userptr, "glFogCoordf"); + glad_glFogCoordfv = (PFNGLFOGCOORDFVPROC) load(userptr, "glFogCoordfv"); + glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); + glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); + glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); + glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); + glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); + glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); + glad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load(userptr, "glSecondaryColor3b"); + glad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load(userptr, "glSecondaryColor3bv"); + glad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load(userptr, "glSecondaryColor3d"); + glad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load(userptr, "glSecondaryColor3dv"); + glad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load(userptr, "glSecondaryColor3f"); + glad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load(userptr, "glSecondaryColor3fv"); + glad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load(userptr, "glSecondaryColor3i"); + glad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load(userptr, "glSecondaryColor3iv"); + glad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load(userptr, "glSecondaryColor3s"); + glad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load(userptr, "glSecondaryColor3sv"); + glad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load(userptr, "glSecondaryColor3ub"); + glad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load(userptr, "glSecondaryColor3ubv"); + glad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load(userptr, "glSecondaryColor3ui"); + glad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load(userptr, "glSecondaryColor3uiv"); + glad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load(userptr, "glSecondaryColor3us"); + glad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load(userptr, "glSecondaryColor3usv"); + glad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load(userptr, "glSecondaryColorPointer"); + glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load(userptr, "glWindowPos2d"); + glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load(userptr, "glWindowPos2dv"); + glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load(userptr, "glWindowPos2f"); + glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load(userptr, "glWindowPos2fv"); + glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load(userptr, "glWindowPos2i"); + glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load(userptr, "glWindowPos2iv"); + glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load(userptr, "glWindowPos2s"); + glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load(userptr, "glWindowPos2sv"); + glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load(userptr, "glWindowPos3d"); + glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load(userptr, "glWindowPos3dv"); + glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load(userptr, "glWindowPos3f"); + glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load(userptr, "glWindowPos3fv"); + glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load(userptr, "glWindowPos3i"); + glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load(userptr, "glWindowPos3iv"); + glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load(userptr, "glWindowPos3s"); + glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load(userptr, "glWindowPos3sv"); +} +static void glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_5) return; + glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); +} +static void glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_0) return; + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); +} +static void glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_1) return; + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); +} +static void glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_0) return; + glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); + glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); + glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); + glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); + glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); + glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); + glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); + glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); + glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); + glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); + glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); + glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); + glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); + glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); +} +static void glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_1) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_2) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_3) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void glad_gl_load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_0) return; + glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei"); + glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi"); + glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei"); + glad_glBlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci"); + glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); + glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); + glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading"); + glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); + glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); + glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); + glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void glad_gl_load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_1) return; + glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d"); + glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv"); + glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d"); + glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv"); + glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d"); + glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv"); + glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d"); + glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv"); + glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv"); + glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv"); + glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv"); + glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv"); + glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv"); + glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv"); + glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv"); + glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv"); + glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv"); + glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); + glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); + glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} +static void glad_gl_load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_2) return; + glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); + glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); + glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); + glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); + glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); + glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void glad_gl_load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_3) return; + glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); + glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); + glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); + glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); + glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); + glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); + glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); + glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); + glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); + glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} +static void glad_gl_load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_4) return; + glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase"); + glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange"); + glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures"); + glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers"); + glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures"); + glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers"); + glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage"); + glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage"); + glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage"); +} +static void glad_gl_load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_5) return; + glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit"); + glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer"); + glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus"); + glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData"); + glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData"); + glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi"); + glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv"); + glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv"); + glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv"); + glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl"); + glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D"); + glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D"); + glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D"); + glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData"); + glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D"); + glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D"); + glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D"); + glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers"); + glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers"); + glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines"); + glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries"); + glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers"); + glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers"); + glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures"); + glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks"); + glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays"); + glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib"); + glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib"); + glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange"); + glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap"); + glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage"); + glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage"); + glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v"); + glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv"); + glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv"); + glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData"); + glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv"); + glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv"); + glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv"); + glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v"); + glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv"); + glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v"); + glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv"); + glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage"); + glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv"); + glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv"); + glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv"); + glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv"); + glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv"); + glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv"); + glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage"); + glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v"); + glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v"); + glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv"); + glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv"); + glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv"); + glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv"); + glad_glGetnColorTable = (PFNGLGETNCOLORTABLEPROC) load(userptr, "glGetnColorTable"); + glad_glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetnCompressedTexImage"); + glad_glGetnConvolutionFilter = (PFNGLGETNCONVOLUTIONFILTERPROC) load(userptr, "glGetnConvolutionFilter"); + glad_glGetnHistogram = (PFNGLGETNHISTOGRAMPROC) load(userptr, "glGetnHistogram"); + glad_glGetnMapdv = (PFNGLGETNMAPDVPROC) load(userptr, "glGetnMapdv"); + glad_glGetnMapfv = (PFNGLGETNMAPFVPROC) load(userptr, "glGetnMapfv"); + glad_glGetnMapiv = (PFNGLGETNMAPIVPROC) load(userptr, "glGetnMapiv"); + glad_glGetnMinmax = (PFNGLGETNMINMAXPROC) load(userptr, "glGetnMinmax"); + glad_glGetnPixelMapfv = (PFNGLGETNPIXELMAPFVPROC) load(userptr, "glGetnPixelMapfv"); + glad_glGetnPixelMapuiv = (PFNGLGETNPIXELMAPUIVPROC) load(userptr, "glGetnPixelMapuiv"); + glad_glGetnPixelMapusv = (PFNGLGETNPIXELMAPUSVPROC) load(userptr, "glGetnPixelMapusv"); + glad_glGetnPolygonStipple = (PFNGLGETNPOLYGONSTIPPLEPROC) load(userptr, "glGetnPolygonStipple"); + glad_glGetnSeparableFilter = (PFNGLGETNSEPARABLEFILTERPROC) load(userptr, "glGetnSeparableFilter"); + glad_glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load(userptr, "glGetnTexImage"); + glad_glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load(userptr, "glGetnUniformdv"); + glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData"); + glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData"); + glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer"); + glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange"); + glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); + glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData"); + glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage"); + glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData"); + glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer"); + glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers"); + glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri"); + glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer"); + glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer"); + glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture"); + glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer"); + glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage"); + glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample"); + glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); + glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier"); + glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer"); + glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange"); + glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv"); + glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv"); + glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf"); + glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv"); + glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri"); + glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv"); + glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D"); + glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D"); + glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample"); + glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D"); + glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample"); + glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D"); + glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D"); + glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D"); + glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase"); + glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange"); + glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer"); + glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding"); + glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat"); + glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat"); + glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat"); + glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor"); + glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer"); + glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer"); + glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers"); +} +static void glad_gl_load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_4_6) return; + glad_glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawArraysIndirectCount"); + glad_glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawElementsIndirectCount"); + glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp"); + glad_glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load(userptr, "glSpecializeShader"); +} +static void glad_gl_load_GL_ES_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ES_VERSION_2_0) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_ES_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ES_VERSION_3_0) return; + glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); + glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_ES_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ES_VERSION_3_1) return; + glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); + glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); + glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); + glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); + glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); + glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); + glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} +static void glad_gl_load_GL_ES_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ES_VERSION_3_2) return; + glad_glBlendBarrier = (PFNGLBLENDBARRIERPROC) load(userptr, "glBlendBarrier"); + glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei"); + glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi"); + glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei"); + glad_glBlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci"); + glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPrimitiveBoundingBox = (PFNGLPRIMITIVEBOUNDINGBOXPROC) load(userptr, "glPrimitiveBoundingBox"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); +} +static void glad_gl_load_GL_3DFX_tbuffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_3DFX_tbuffer) return; + glad_glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC) load(userptr, "glTbufferMask3DFX"); +} +static void glad_gl_load_GL_AMD_debug_output( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_debug_output) return; + glad_glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC) load(userptr, "glDebugMessageCallbackAMD"); + glad_glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC) load(userptr, "glDebugMessageEnableAMD"); + glad_glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC) load(userptr, "glDebugMessageInsertAMD"); + glad_glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC) load(userptr, "glGetDebugMessageLogAMD"); +} +static void glad_gl_load_GL_AMD_draw_buffers_blend( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_draw_buffers_blend) return; + glad_glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC) load(userptr, "glBlendEquationIndexedAMD"); + glad_glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) load(userptr, "glBlendEquationSeparateIndexedAMD"); + glad_glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC) load(userptr, "glBlendFuncIndexedAMD"); + glad_glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) load(userptr, "glBlendFuncSeparateIndexedAMD"); +} +static void glad_gl_load_GL_AMD_framebuffer_multisample_advanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_framebuffer_multisample_advanced) return; + glad_glNamedRenderbufferStorageMultisampleAdvancedAMD = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) load(userptr, "glNamedRenderbufferStorageMultisampleAdvancedAMD"); + glad_glRenderbufferStorageMultisampleAdvancedAMD = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) load(userptr, "glRenderbufferStorageMultisampleAdvancedAMD"); +} +static void glad_gl_load_GL_AMD_framebuffer_sample_positions( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_framebuffer_sample_positions) return; + glad_glFramebufferSamplePositionsfvAMD = (PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) load(userptr, "glFramebufferSamplePositionsfvAMD"); + glad_glGetFramebufferParameterfvAMD = (PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) load(userptr, "glGetFramebufferParameterfvAMD"); + glad_glGetNamedFramebufferParameterfvAMD = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) load(userptr, "glGetNamedFramebufferParameterfvAMD"); + glad_glNamedFramebufferSamplePositionsfvAMD = (PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) load(userptr, "glNamedFramebufferSamplePositionsfvAMD"); +} +static void glad_gl_load_GL_AMD_gpu_shader_int64( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_gpu_shader_int64) return; + glad_glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC) load(userptr, "glGetUniformi64vNV"); + glad_glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC) load(userptr, "glGetUniformui64vNV"); + glad_glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC) load(userptr, "glProgramUniform1i64NV"); + glad_glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC) load(userptr, "glProgramUniform1i64vNV"); + glad_glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC) load(userptr, "glProgramUniform1ui64NV"); + glad_glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC) load(userptr, "glProgramUniform1ui64vNV"); + glad_glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC) load(userptr, "glProgramUniform2i64NV"); + glad_glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC) load(userptr, "glProgramUniform2i64vNV"); + glad_glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC) load(userptr, "glProgramUniform2ui64NV"); + glad_glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC) load(userptr, "glProgramUniform2ui64vNV"); + glad_glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC) load(userptr, "glProgramUniform3i64NV"); + glad_glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC) load(userptr, "glProgramUniform3i64vNV"); + glad_glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC) load(userptr, "glProgramUniform3ui64NV"); + glad_glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC) load(userptr, "glProgramUniform3ui64vNV"); + glad_glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC) load(userptr, "glProgramUniform4i64NV"); + glad_glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC) load(userptr, "glProgramUniform4i64vNV"); + glad_glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC) load(userptr, "glProgramUniform4ui64NV"); + glad_glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC) load(userptr, "glProgramUniform4ui64vNV"); + glad_glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC) load(userptr, "glUniform1i64NV"); + glad_glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC) load(userptr, "glUniform1i64vNV"); + glad_glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC) load(userptr, "glUniform1ui64NV"); + glad_glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC) load(userptr, "glUniform1ui64vNV"); + glad_glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC) load(userptr, "glUniform2i64NV"); + glad_glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC) load(userptr, "glUniform2i64vNV"); + glad_glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC) load(userptr, "glUniform2ui64NV"); + glad_glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC) load(userptr, "glUniform2ui64vNV"); + glad_glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC) load(userptr, "glUniform3i64NV"); + glad_glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC) load(userptr, "glUniform3i64vNV"); + glad_glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC) load(userptr, "glUniform3ui64NV"); + glad_glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC) load(userptr, "glUniform3ui64vNV"); + glad_glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC) load(userptr, "glUniform4i64NV"); + glad_glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC) load(userptr, "glUniform4i64vNV"); + glad_glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC) load(userptr, "glUniform4ui64NV"); + glad_glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC) load(userptr, "glUniform4ui64vNV"); +} +static void glad_gl_load_GL_AMD_interleaved_elements( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_interleaved_elements) return; + glad_glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC) load(userptr, "glVertexAttribParameteriAMD"); +} +static void glad_gl_load_GL_AMD_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_multi_draw_indirect) return; + glad_glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) load(userptr, "glMultiDrawArraysIndirectAMD"); + glad_glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) load(userptr, "glMultiDrawElementsIndirectAMD"); +} +static void glad_gl_load_GL_AMD_name_gen_delete( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_name_gen_delete) return; + glad_glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC) load(userptr, "glDeleteNamesAMD"); + glad_glGenNamesAMD = (PFNGLGENNAMESAMDPROC) load(userptr, "glGenNamesAMD"); + glad_glIsNameAMD = (PFNGLISNAMEAMDPROC) load(userptr, "glIsNameAMD"); +} +static void glad_gl_load_GL_AMD_occlusion_query_event( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_occlusion_query_event) return; + glad_glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC) load(userptr, "glQueryObjectParameteruiAMD"); +} +static void glad_gl_load_GL_AMD_performance_monitor( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_performance_monitor) return; + glad_glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC) load(userptr, "glBeginPerfMonitorAMD"); + glad_glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC) load(userptr, "glDeletePerfMonitorsAMD"); + glad_glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC) load(userptr, "glEndPerfMonitorAMD"); + glad_glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC) load(userptr, "glGenPerfMonitorsAMD"); + glad_glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) load(userptr, "glGetPerfMonitorCounterDataAMD"); + glad_glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) load(userptr, "glGetPerfMonitorCounterInfoAMD"); + glad_glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) load(userptr, "glGetPerfMonitorCounterStringAMD"); + glad_glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC) load(userptr, "glGetPerfMonitorCountersAMD"); + glad_glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) load(userptr, "glGetPerfMonitorGroupStringAMD"); + glad_glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC) load(userptr, "glGetPerfMonitorGroupsAMD"); + glad_glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) load(userptr, "glSelectPerfMonitorCountersAMD"); +} +static void glad_gl_load_GL_AMD_sample_positions( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_sample_positions) return; + glad_glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC) load(userptr, "glSetMultisamplefvAMD"); +} +static void glad_gl_load_GL_AMD_sparse_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_sparse_texture) return; + glad_glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC) load(userptr, "glTexStorageSparseAMD"); + glad_glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC) load(userptr, "glTextureStorageSparseAMD"); +} +static void glad_gl_load_GL_AMD_stencil_operation_extended( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_stencil_operation_extended) return; + glad_glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC) load(userptr, "glStencilOpValueAMD"); +} +static void glad_gl_load_GL_AMD_vertex_shader_tessellator( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_AMD_vertex_shader_tessellator) return; + glad_glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC) load(userptr, "glTessellationFactorAMD"); + glad_glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC) load(userptr, "glTessellationModeAMD"); +} +static void glad_gl_load_GL_APPLE_element_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_element_array) return; + glad_glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC) load(userptr, "glDrawElementArrayAPPLE"); + glad_glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) load(userptr, "glDrawRangeElementArrayAPPLE"); + glad_glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC) load(userptr, "glElementPointerAPPLE"); + glad_glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) load(userptr, "glMultiDrawElementArrayAPPLE"); + glad_glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) load(userptr, "glMultiDrawRangeElementArrayAPPLE"); +} +static void glad_gl_load_GL_APPLE_fence( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_fence) return; + glad_glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC) load(userptr, "glDeleteFencesAPPLE"); + glad_glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC) load(userptr, "glFinishFenceAPPLE"); + glad_glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC) load(userptr, "glFinishObjectAPPLE"); + glad_glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC) load(userptr, "glGenFencesAPPLE"); + glad_glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC) load(userptr, "glIsFenceAPPLE"); + glad_glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC) load(userptr, "glSetFenceAPPLE"); + glad_glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC) load(userptr, "glTestFenceAPPLE"); + glad_glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC) load(userptr, "glTestObjectAPPLE"); +} +static void glad_gl_load_GL_APPLE_flush_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_flush_buffer_range) return; + glad_glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC) load(userptr, "glBufferParameteriAPPLE"); + glad_glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) load(userptr, "glFlushMappedBufferRangeAPPLE"); +} +static void glad_gl_load_GL_APPLE_object_purgeable( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_object_purgeable) return; + glad_glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC) load(userptr, "glGetObjectParameterivAPPLE"); + glad_glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC) load(userptr, "glObjectPurgeableAPPLE"); + glad_glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC) load(userptr, "glObjectUnpurgeableAPPLE"); +} +static void glad_gl_load_GL_APPLE_texture_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_texture_range) return; + glad_glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) load(userptr, "glGetTexParameterPointervAPPLE"); + glad_glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC) load(userptr, "glTextureRangeAPPLE"); +} +static void glad_gl_load_GL_APPLE_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_vertex_array_object) return; + glad_glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC) load(userptr, "glBindVertexArrayAPPLE"); + glad_glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC) load(userptr, "glDeleteVertexArraysAPPLE"); + glad_glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC) load(userptr, "glGenVertexArraysAPPLE"); + glad_glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC) load(userptr, "glIsVertexArrayAPPLE"); +} +static void glad_gl_load_GL_APPLE_vertex_array_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_vertex_array_range) return; + glad_glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) load(userptr, "glFlushVertexArrayRangeAPPLE"); + glad_glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) load(userptr, "glVertexArrayParameteriAPPLE"); + glad_glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC) load(userptr, "glVertexArrayRangeAPPLE"); +} +static void glad_gl_load_GL_APPLE_vertex_program_evaluators( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_vertex_program_evaluators) return; + glad_glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC) load(userptr, "glDisableVertexAttribAPPLE"); + glad_glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC) load(userptr, "glEnableVertexAttribAPPLE"); + glad_glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) load(userptr, "glIsVertexAttribEnabledAPPLE"); + glad_glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC) load(userptr, "glMapVertexAttrib1dAPPLE"); + glad_glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC) load(userptr, "glMapVertexAttrib1fAPPLE"); + glad_glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC) load(userptr, "glMapVertexAttrib2dAPPLE"); + glad_glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC) load(userptr, "glMapVertexAttrib2fAPPLE"); +} +static void glad_gl_load_GL_ARB_ES2_compatibility( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_ES2_compatibility) return; + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); +} +static void glad_gl_load_GL_ARB_ES3_1_compatibility( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_ES3_1_compatibility) return; + glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); +} +static void glad_gl_load_GL_ARB_ES3_2_compatibility( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_ES3_2_compatibility) return; + glad_glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC) load(userptr, "glPrimitiveBoundingBoxARB"); +} +static void glad_gl_load_GL_ARB_base_instance( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_base_instance) return; + glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); +} +static void glad_gl_load_GL_ARB_bindless_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_bindless_texture) return; + glad_glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC) load(userptr, "glGetImageHandleARB"); + glad_glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC) load(userptr, "glGetTextureHandleARB"); + glad_glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC) load(userptr, "glGetTextureSamplerHandleARB"); + glad_glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC) load(userptr, "glGetVertexAttribLui64vARB"); + glad_glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC) load(userptr, "glIsImageHandleResidentARB"); + glad_glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC) load(userptr, "glIsTextureHandleResidentARB"); + glad_glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) load(userptr, "glMakeImageHandleNonResidentARB"); + glad_glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) load(userptr, "glMakeImageHandleResidentARB"); + glad_glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) load(userptr, "glMakeTextureHandleNonResidentARB"); + glad_glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) load(userptr, "glMakeTextureHandleResidentARB"); + glad_glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) load(userptr, "glProgramUniformHandleui64ARB"); + glad_glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) load(userptr, "glProgramUniformHandleui64vARB"); + glad_glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC) load(userptr, "glUniformHandleui64ARB"); + glad_glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC) load(userptr, "glUniformHandleui64vARB"); + glad_glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC) load(userptr, "glVertexAttribL1ui64ARB"); + glad_glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC) load(userptr, "glVertexAttribL1ui64vARB"); +} +static void glad_gl_load_GL_ARB_blend_func_extended( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_blend_func_extended) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); +} +static void glad_gl_load_GL_ARB_buffer_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_buffer_storage) return; + glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage"); +} +static void glad_gl_load_GL_ARB_cl_event( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_cl_event) return; + glad_glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC) load(userptr, "glCreateSyncFromCLeventARB"); +} +static void glad_gl_load_GL_ARB_clear_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_clear_buffer_object) return; + glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); +} +static void glad_gl_load_GL_ARB_clear_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_clear_texture) return; + glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage"); + glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage"); +} +static void glad_gl_load_GL_ARB_clip_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_clip_control) return; + glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl"); +} +static void glad_gl_load_GL_ARB_color_buffer_float( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_color_buffer_float) return; + glad_glClampColorARB = (PFNGLCLAMPCOLORARBPROC) load(userptr, "glClampColorARB"); +} +static void glad_gl_load_GL_ARB_compute_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_compute_shader) return; + glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); +} +static void glad_gl_load_GL_ARB_compute_variable_group_size( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_compute_variable_group_size) return; + glad_glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) load(userptr, "glDispatchComputeGroupSizeARB"); +} +static void glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_copy_buffer) return; + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); +} +static void glad_gl_load_GL_ARB_copy_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_copy_image) return; + glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); +} +static void glad_gl_load_GL_ARB_debug_output( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_debug_output) return; + glad_glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC) load(userptr, "glDebugMessageCallbackARB"); + glad_glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) load(userptr, "glDebugMessageControlARB"); + glad_glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC) load(userptr, "glDebugMessageInsertARB"); + glad_glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC) load(userptr, "glGetDebugMessageLogARB"); +} +static void glad_gl_load_GL_ARB_direct_state_access( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_direct_state_access) return; + glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit"); + glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer"); + glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus"); + glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData"); + glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData"); + glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi"); + glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv"); + glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv"); + glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv"); + glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D"); + glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D"); + glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D"); + glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData"); + glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D"); + glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D"); + glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D"); + glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers"); + glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers"); + glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines"); + glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries"); + glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers"); + glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers"); + glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures"); + glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks"); + glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays"); + glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib"); + glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib"); + glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange"); + glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap"); + glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage"); + glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v"); + glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv"); + glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv"); + glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData"); + glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv"); + glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv"); + glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv"); + glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v"); + glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv"); + glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v"); + glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv"); + glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage"); + glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv"); + glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv"); + glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv"); + glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv"); + glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv"); + glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv"); + glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v"); + glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v"); + glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv"); + glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv"); + glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv"); + glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv"); + glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData"); + glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData"); + glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer"); + glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange"); + glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData"); + glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage"); + glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData"); + glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer"); + glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers"); + glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri"); + glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer"); + glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer"); + glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture"); + glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer"); + glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage"); + glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample"); + glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer"); + glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange"); + glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv"); + glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv"); + glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf"); + glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv"); + glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri"); + glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv"); + glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D"); + glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D"); + glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample"); + glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D"); + glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample"); + glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D"); + glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D"); + glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D"); + glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase"); + glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange"); + glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer"); + glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding"); + glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat"); + glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat"); + glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat"); + glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor"); + glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer"); + glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer"); + glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers"); +} +static void glad_gl_load_GL_ARB_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_buffers) return; + glad_glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC) load(userptr, "glDrawBuffersARB"); +} +static void glad_gl_load_GL_ARB_draw_buffers_blend( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_buffers_blend) return; + glad_glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC) load(userptr, "glBlendEquationSeparateiARB"); + glad_glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC) load(userptr, "glBlendEquationiARB"); + glad_glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC) load(userptr, "glBlendFuncSeparateiARB"); + glad_glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC) load(userptr, "glBlendFunciARB"); +} +static void glad_gl_load_GL_ARB_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_elements_base_vertex) return; + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); +} +static void glad_gl_load_GL_ARB_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_indirect) return; + glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); +} +static void glad_gl_load_GL_ARB_draw_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_instanced) return; + glad_glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC) load(userptr, "glDrawArraysInstancedARB"); + glad_glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC) load(userptr, "glDrawElementsInstancedARB"); +} +static void glad_gl_load_GL_ARB_fragment_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_fragment_program) return; + glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); + glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); + glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); + glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB"); + glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB"); + glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB"); + glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB"); + glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB"); + glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB"); + glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); + glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB"); + glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB"); + glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB"); + glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB"); + glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB"); + glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB"); + glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB"); + glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB"); + glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB"); +} +static void glad_gl_load_GL_ARB_framebuffer_no_attachments( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_framebuffer_no_attachments) return; + glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); +} +static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_framebuffer_object) return; + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); +} +static void glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_geometry_shader4) return; + glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB"); + glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); + glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB"); + glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB"); +} +static void glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_get_program_binary) return; + glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); +} +static void glad_gl_load_GL_ARB_get_texture_sub_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_get_texture_sub_image) return; + glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage"); + glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage"); +} +static void glad_gl_load_GL_ARB_gl_spirv( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_gl_spirv) return; + glad_glSpecializeShaderARB = (PFNGLSPECIALIZESHADERARBPROC) load(userptr, "glSpecializeShaderARB"); +} +static void glad_gl_load_GL_ARB_gpu_shader_fp64( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_gpu_shader_fp64) return; + glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); +} +static void glad_gl_load_GL_ARB_gpu_shader_int64( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_gpu_shader_int64) return; + glad_glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC) load(userptr, "glGetUniformi64vARB"); + glad_glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC) load(userptr, "glGetUniformui64vARB"); + glad_glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC) load(userptr, "glGetnUniformi64vARB"); + glad_glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC) load(userptr, "glGetnUniformui64vARB"); + glad_glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC) load(userptr, "glProgramUniform1i64ARB"); + glad_glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC) load(userptr, "glProgramUniform1i64vARB"); + glad_glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC) load(userptr, "glProgramUniform1ui64ARB"); + glad_glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC) load(userptr, "glProgramUniform1ui64vARB"); + glad_glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC) load(userptr, "glProgramUniform2i64ARB"); + glad_glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC) load(userptr, "glProgramUniform2i64vARB"); + glad_glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC) load(userptr, "glProgramUniform2ui64ARB"); + glad_glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC) load(userptr, "glProgramUniform2ui64vARB"); + glad_glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC) load(userptr, "glProgramUniform3i64ARB"); + glad_glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC) load(userptr, "glProgramUniform3i64vARB"); + glad_glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC) load(userptr, "glProgramUniform3ui64ARB"); + glad_glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC) load(userptr, "glProgramUniform3ui64vARB"); + glad_glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC) load(userptr, "glProgramUniform4i64ARB"); + glad_glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC) load(userptr, "glProgramUniform4i64vARB"); + glad_glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC) load(userptr, "glProgramUniform4ui64ARB"); + glad_glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC) load(userptr, "glProgramUniform4ui64vARB"); + glad_glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC) load(userptr, "glUniform1i64ARB"); + glad_glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC) load(userptr, "glUniform1i64vARB"); + glad_glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC) load(userptr, "glUniform1ui64ARB"); + glad_glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC) load(userptr, "glUniform1ui64vARB"); + glad_glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC) load(userptr, "glUniform2i64ARB"); + glad_glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC) load(userptr, "glUniform2i64vARB"); + glad_glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC) load(userptr, "glUniform2ui64ARB"); + glad_glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC) load(userptr, "glUniform2ui64vARB"); + glad_glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC) load(userptr, "glUniform3i64ARB"); + glad_glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC) load(userptr, "glUniform3i64vARB"); + glad_glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC) load(userptr, "glUniform3ui64ARB"); + glad_glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC) load(userptr, "glUniform3ui64vARB"); + glad_glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC) load(userptr, "glUniform4i64ARB"); + glad_glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC) load(userptr, "glUniform4i64vARB"); + glad_glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC) load(userptr, "glUniform4ui64ARB"); + glad_glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC) load(userptr, "glUniform4ui64vARB"); +} +static void glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_imaging) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable"); + glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable"); + glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv"); + glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv"); + glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D"); + glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D"); + glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf"); + glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv"); + glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri"); + glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv"); + glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable"); + glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable"); + glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D"); + glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D"); + glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable"); + glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv"); + glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv"); + glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter"); + glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv"); + glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv"); + glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram"); + glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv"); + glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv"); + glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax"); + glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv"); + glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv"); + glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter"); + glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram"); + glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax"); + glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram"); + glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax"); + glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D"); +} +static void glad_gl_load_GL_ARB_indirect_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_indirect_parameters) return; + glad_glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) load(userptr, "glMultiDrawArraysIndirectCountARB"); + glad_glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) load(userptr, "glMultiDrawElementsIndirectCountARB"); +} +static void glad_gl_load_GL_ARB_instanced_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_instanced_arrays) return; + glad_glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC) load(userptr, "glVertexAttribDivisorARB"); +} +static void glad_gl_load_GL_ARB_internalformat_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_internalformat_query) return; + glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); +} +static void glad_gl_load_GL_ARB_internalformat_query2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_internalformat_query2) return; + glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); +} +static void glad_gl_load_GL_ARB_invalidate_subdata( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_invalidate_subdata) return; + glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); +} +static void glad_gl_load_GL_ARB_map_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_map_buffer_range) return; + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); +} +static void glad_gl_load_GL_ARB_matrix_palette( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_matrix_palette) return; + glad_glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC) load(userptr, "glCurrentPaletteMatrixARB"); + glad_glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC) load(userptr, "glMatrixIndexPointerARB"); + glad_glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC) load(userptr, "glMatrixIndexubvARB"); + glad_glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC) load(userptr, "glMatrixIndexuivARB"); + glad_glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC) load(userptr, "glMatrixIndexusvARB"); +} +static void glad_gl_load_GL_ARB_multi_bind( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multi_bind) return; + glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase"); + glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange"); + glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures"); + glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers"); + glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures"); + glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers"); +} +static void glad_gl_load_GL_ARB_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multi_draw_indirect) return; + glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); +} +static void glad_gl_load_GL_ARB_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multisample) return; + glad_glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC) load(userptr, "glSampleCoverageARB"); +} +static void glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multitexture) return; + glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB"); + glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB"); + glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB"); + glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB"); + glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB"); + glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB"); + glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB"); + glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB"); + glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB"); + glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB"); + glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB"); + glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB"); + glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB"); + glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB"); + glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB"); + glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB"); + glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB"); + glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB"); + glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB"); + glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB"); + glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB"); + glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB"); + glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB"); + glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB"); + glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB"); + glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB"); + glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB"); + glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB"); + glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB"); + glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB"); + glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB"); + glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB"); + glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB"); + glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB"); +} +static void glad_gl_load_GL_ARB_occlusion_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_occlusion_query) return; + glad_glBeginQueryARB = (PFNGLBEGINQUERYARBPROC) load(userptr, "glBeginQueryARB"); + glad_glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) load(userptr, "glDeleteQueriesARB"); + glad_glEndQueryARB = (PFNGLENDQUERYARBPROC) load(userptr, "glEndQueryARB"); + glad_glGenQueriesARB = (PFNGLGENQUERIESARBPROC) load(userptr, "glGenQueriesARB"); + glad_glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) load(userptr, "glGetQueryObjectivARB"); + glad_glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) load(userptr, "glGetQueryObjectuivARB"); + glad_glGetQueryivARB = (PFNGLGETQUERYIVARBPROC) load(userptr, "glGetQueryivARB"); + glad_glIsQueryARB = (PFNGLISQUERYARBPROC) load(userptr, "glIsQueryARB"); +} +static void glad_gl_load_GL_ARB_parallel_shader_compile( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_parallel_shader_compile) return; + glad_glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC) load(userptr, "glMaxShaderCompilerThreadsARB"); +} +static void glad_gl_load_GL_ARB_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_point_parameters) return; + glad_glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC) load(userptr, "glPointParameterfARB"); + glad_glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) load(userptr, "glPointParameterfvARB"); +} +static void glad_gl_load_GL_ARB_polygon_offset_clamp( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_polygon_offset_clamp) return; + glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp"); +} +static void glad_gl_load_GL_ARB_program_interface_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_program_interface_query) return; + glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); +} +static void glad_gl_load_GL_ARB_provoking_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_provoking_vertex) return; + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); +} +static void glad_gl_load_GL_ARB_robustness( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_robustness) return; + glad_glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC) load(userptr, "glGetGraphicsResetStatusARB"); + glad_glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC) load(userptr, "glGetnColorTableARB"); + glad_glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) load(userptr, "glGetnCompressedTexImageARB"); + glad_glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC) load(userptr, "glGetnConvolutionFilterARB"); + glad_glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC) load(userptr, "glGetnHistogramARB"); + glad_glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC) load(userptr, "glGetnMapdvARB"); + glad_glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC) load(userptr, "glGetnMapfvARB"); + glad_glGetnMapivARB = (PFNGLGETNMAPIVARBPROC) load(userptr, "glGetnMapivARB"); + glad_glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC) load(userptr, "glGetnMinmaxARB"); + glad_glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC) load(userptr, "glGetnPixelMapfvARB"); + glad_glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC) load(userptr, "glGetnPixelMapuivARB"); + glad_glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC) load(userptr, "glGetnPixelMapusvARB"); + glad_glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC) load(userptr, "glGetnPolygonStippleARB"); + glad_glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC) load(userptr, "glGetnSeparableFilterARB"); + glad_glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC) load(userptr, "glGetnTexImageARB"); + glad_glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC) load(userptr, "glGetnUniformdvARB"); + glad_glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC) load(userptr, "glGetnUniformfvARB"); + glad_glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC) load(userptr, "glGetnUniformivARB"); + glad_glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC) load(userptr, "glGetnUniformuivARB"); + glad_glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC) load(userptr, "glReadnPixelsARB"); +} +static void glad_gl_load_GL_ARB_sample_locations( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sample_locations) return; + glad_glEvaluateDepthValuesARB = (PFNGLEVALUATEDEPTHVALUESARBPROC) load(userptr, "glEvaluateDepthValuesARB"); + glad_glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) load(userptr, "glFramebufferSampleLocationsfvARB"); + glad_glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) load(userptr, "glNamedFramebufferSampleLocationsfvARB"); +} +static void glad_gl_load_GL_ARB_sample_shading( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sample_shading) return; + glad_glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC) load(userptr, "glMinSampleShadingARB"); +} +static void glad_gl_load_GL_ARB_sampler_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sampler_objects) return; + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); +} +static void glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_separate_shader_objects) return; + glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d"); + glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv"); + glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d"); + glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv"); + glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d"); + glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv"); + glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d"); + glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv"); + glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv"); + glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv"); + glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv"); + glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv"); + glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv"); + glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv"); + glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv"); + glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv"); + glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv"); + glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); +} +static void glad_gl_load_GL_ARB_shader_atomic_counters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_atomic_counters) return; + glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); +} +static void glad_gl_load_GL_ARB_shader_image_load_store( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_image_load_store) return; + glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); +} +static void glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_objects) return; + glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB"); + glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB"); + glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB"); + glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB"); + glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB"); + glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB"); + glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB"); + glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB"); + glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB"); + glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB"); + glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB"); + glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB"); + glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB"); + glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB"); + glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB"); + glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB"); + glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB"); + glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB"); + glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB"); + glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB"); + glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB"); + glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB"); + glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB"); + glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB"); + glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB"); + glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB"); + glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB"); + glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB"); + glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB"); + glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB"); + glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB"); + glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB"); + glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB"); + glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB"); + glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB"); + glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB"); + glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB"); + glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB"); + glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB"); +} +static void glad_gl_load_GL_ARB_shader_storage_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_storage_buffer_object) return; + glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); +} +static void glad_gl_load_GL_ARB_shader_subroutine( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_subroutine) return; + glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void glad_gl_load_GL_ARB_shading_language_include( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shading_language_include) return; + glad_glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC) load(userptr, "glCompileShaderIncludeARB"); + glad_glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC) load(userptr, "glDeleteNamedStringARB"); + glad_glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC) load(userptr, "glGetNamedStringARB"); + glad_glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC) load(userptr, "glGetNamedStringivARB"); + glad_glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC) load(userptr, "glIsNamedStringARB"); + glad_glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC) load(userptr, "glNamedStringARB"); +} +static void glad_gl_load_GL_ARB_sparse_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sparse_buffer) return; + glad_glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC) load(userptr, "glBufferPageCommitmentARB"); + glad_glNamedBufferPageCommitmentARB = (PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) load(userptr, "glNamedBufferPageCommitmentARB"); + glad_glNamedBufferPageCommitmentEXT = (PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) load(userptr, "glNamedBufferPageCommitmentEXT"); +} +static void glad_gl_load_GL_ARB_sparse_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sparse_texture) return; + glad_glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC) load(userptr, "glTexPageCommitmentARB"); +} +static void glad_gl_load_GL_ARB_sync( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sync) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_ARB_tessellation_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_tessellation_shader) return; + glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); +} +static void glad_gl_load_GL_ARB_texture_barrier( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_barrier) return; + glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier"); +} +static void glad_gl_load_GL_ARB_texture_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_buffer_object) return; + glad_glTexBufferARB = (PFNGLTEXBUFFERARBPROC) load(userptr, "glTexBufferARB"); +} +static void glad_gl_load_GL_ARB_texture_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_buffer_range) return; + glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); +} +static void glad_gl_load_GL_ARB_texture_compression( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_compression) return; + glad_glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) load(userptr, "glCompressedTexImage1DARB"); + glad_glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) load(userptr, "glCompressedTexImage2DARB"); + glad_glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) load(userptr, "glCompressedTexImage3DARB"); + glad_glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) load(userptr, "glCompressedTexSubImage1DARB"); + glad_glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) load(userptr, "glCompressedTexSubImage2DARB"); + glad_glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) load(userptr, "glCompressedTexSubImage3DARB"); + glad_glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) load(userptr, "glGetCompressedTexImageARB"); +} +static void glad_gl_load_GL_ARB_texture_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_multisample) return; + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); +} +static void glad_gl_load_GL_ARB_texture_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_storage) return; + glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void glad_gl_load_GL_ARB_texture_storage_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_storage_multisample) return; + glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); +} +static void glad_gl_load_GL_ARB_texture_view( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_view) return; + glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); +} +static void glad_gl_load_GL_ARB_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_timer_query) return; + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); +} +static void glad_gl_load_GL_ARB_transform_feedback2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_transform_feedback2) return; + glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); +} +static void glad_gl_load_GL_ARB_transform_feedback3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_transform_feedback3) return; + glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); +} +static void glad_gl_load_GL_ARB_transform_feedback_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_transform_feedback_instanced) return; + glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); +} +static void glad_gl_load_GL_ARB_transpose_matrix( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_transpose_matrix) return; + glad_glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC) load(userptr, "glLoadTransposeMatrixdARB"); + glad_glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC) load(userptr, "glLoadTransposeMatrixfARB"); + glad_glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC) load(userptr, "glMultTransposeMatrixdARB"); + glad_glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC) load(userptr, "glMultTransposeMatrixfARB"); +} +static void glad_gl_load_GL_ARB_uniform_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_uniform_buffer_object) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_ARB_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_array_object) return; + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); +} +static void glad_gl_load_GL_ARB_vertex_attrib_64bit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_attrib_64bit) return; + glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); +} +static void glad_gl_load_GL_ARB_vertex_attrib_binding( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_attrib_binding) return; + glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} +static void glad_gl_load_GL_ARB_vertex_blend( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_blend) return; + glad_glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC) load(userptr, "glVertexBlendARB"); + glad_glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC) load(userptr, "glWeightPointerARB"); + glad_glWeightbvARB = (PFNGLWEIGHTBVARBPROC) load(userptr, "glWeightbvARB"); + glad_glWeightdvARB = (PFNGLWEIGHTDVARBPROC) load(userptr, "glWeightdvARB"); + glad_glWeightfvARB = (PFNGLWEIGHTFVARBPROC) load(userptr, "glWeightfvARB"); + glad_glWeightivARB = (PFNGLWEIGHTIVARBPROC) load(userptr, "glWeightivARB"); + glad_glWeightsvARB = (PFNGLWEIGHTSVARBPROC) load(userptr, "glWeightsvARB"); + glad_glWeightubvARB = (PFNGLWEIGHTUBVARBPROC) load(userptr, "glWeightubvARB"); + glad_glWeightuivARB = (PFNGLWEIGHTUIVARBPROC) load(userptr, "glWeightuivARB"); + glad_glWeightusvARB = (PFNGLWEIGHTUSVARBPROC) load(userptr, "glWeightusvARB"); +} +static void glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_buffer_object) return; + glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB"); + glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB"); + glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB"); + glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB"); + glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB"); + glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB"); + glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB"); + glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB"); + glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB"); + glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB"); + glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB"); +} +static void glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_program) return; + glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); + glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); + glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); + glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); + glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB"); + glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB"); + glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB"); + glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB"); + glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB"); + glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB"); + glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); + glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); + glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB"); + glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB"); + glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB"); + glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB"); + glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB"); + glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB"); + glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB"); + glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB"); + glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB"); + glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); +} +static void glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_shader) return; + glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB"); + glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); + glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB"); + glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB"); + glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); + glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); +} +static void glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_type_2_10_10_10_rev) return; + glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void glad_gl_load_GL_ARB_viewport_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_viewport_array) return; + glad_glDepthRangeArraydvNV = (PFNGLDEPTHRANGEARRAYDVNVPROC) load(userptr, "glDepthRangeArraydvNV"); + glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + glad_glDepthRangeIndexeddNV = (PFNGLDEPTHRANGEINDEXEDDNVPROC) load(userptr, "glDepthRangeIndexeddNV"); + glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} +static void glad_gl_load_GL_ARB_window_pos( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_window_pos) return; + glad_glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC) load(userptr, "glWindowPos2dARB"); + glad_glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC) load(userptr, "glWindowPos2dvARB"); + glad_glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC) load(userptr, "glWindowPos2fARB"); + glad_glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC) load(userptr, "glWindowPos2fvARB"); + glad_glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC) load(userptr, "glWindowPos2iARB"); + glad_glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC) load(userptr, "glWindowPos2ivARB"); + glad_glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC) load(userptr, "glWindowPos2sARB"); + glad_glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC) load(userptr, "glWindowPos2svARB"); + glad_glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC) load(userptr, "glWindowPos3dARB"); + glad_glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC) load(userptr, "glWindowPos3dvARB"); + glad_glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC) load(userptr, "glWindowPos3fARB"); + glad_glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC) load(userptr, "glWindowPos3fvARB"); + glad_glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC) load(userptr, "glWindowPos3iARB"); + glad_glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC) load(userptr, "glWindowPos3ivARB"); + glad_glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC) load(userptr, "glWindowPos3sARB"); + glad_glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC) load(userptr, "glWindowPos3svARB"); +} +static void glad_gl_load_GL_ATI_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_draw_buffers) return; + glad_glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC) load(userptr, "glDrawBuffersATI"); +} +static void glad_gl_load_GL_ATI_element_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_element_array) return; + glad_glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC) load(userptr, "glDrawElementArrayATI"); + glad_glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC) load(userptr, "glDrawRangeElementArrayATI"); + glad_glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC) load(userptr, "glElementPointerATI"); +} +static void glad_gl_load_GL_ATI_envmap_bumpmap( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_envmap_bumpmap) return; + glad_glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC) load(userptr, "glGetTexBumpParameterfvATI"); + glad_glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC) load(userptr, "glGetTexBumpParameterivATI"); + glad_glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC) load(userptr, "glTexBumpParameterfvATI"); + glad_glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC) load(userptr, "glTexBumpParameterivATI"); +} +static void glad_gl_load_GL_ATI_fragment_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_fragment_shader) return; + glad_glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC) load(userptr, "glAlphaFragmentOp1ATI"); + glad_glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC) load(userptr, "glAlphaFragmentOp2ATI"); + glad_glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC) load(userptr, "glAlphaFragmentOp3ATI"); + glad_glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC) load(userptr, "glBeginFragmentShaderATI"); + glad_glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC) load(userptr, "glBindFragmentShaderATI"); + glad_glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC) load(userptr, "glColorFragmentOp1ATI"); + glad_glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC) load(userptr, "glColorFragmentOp2ATI"); + glad_glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC) load(userptr, "glColorFragmentOp3ATI"); + glad_glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC) load(userptr, "glDeleteFragmentShaderATI"); + glad_glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC) load(userptr, "glEndFragmentShaderATI"); + glad_glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC) load(userptr, "glGenFragmentShadersATI"); + glad_glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC) load(userptr, "glPassTexCoordATI"); + glad_glSampleMapATI = (PFNGLSAMPLEMAPATIPROC) load(userptr, "glSampleMapATI"); + glad_glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) load(userptr, "glSetFragmentShaderConstantATI"); +} +static void glad_gl_load_GL_ATI_map_object_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_map_object_buffer) return; + glad_glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC) load(userptr, "glMapObjectBufferATI"); + glad_glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC) load(userptr, "glUnmapObjectBufferATI"); +} +static void glad_gl_load_GL_ATI_pn_triangles( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_pn_triangles) return; + glad_glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC) load(userptr, "glPNTrianglesfATI"); + glad_glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC) load(userptr, "glPNTrianglesiATI"); +} +static void glad_gl_load_GL_ATI_separate_stencil( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_separate_stencil) return; + glad_glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC) load(userptr, "glStencilFuncSeparateATI"); + glad_glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC) load(userptr, "glStencilOpSeparateATI"); +} +static void glad_gl_load_GL_ATI_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_vertex_array_object) return; + glad_glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC) load(userptr, "glArrayObjectATI"); + glad_glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC) load(userptr, "glFreeObjectBufferATI"); + glad_glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC) load(userptr, "glGetArrayObjectfvATI"); + glad_glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC) load(userptr, "glGetArrayObjectivATI"); + glad_glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC) load(userptr, "glGetObjectBufferfvATI"); + glad_glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC) load(userptr, "glGetObjectBufferivATI"); + glad_glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC) load(userptr, "glGetVariantArrayObjectfvATI"); + glad_glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC) load(userptr, "glGetVariantArrayObjectivATI"); + glad_glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC) load(userptr, "glIsObjectBufferATI"); + glad_glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC) load(userptr, "glNewObjectBufferATI"); + glad_glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC) load(userptr, "glUpdateObjectBufferATI"); + glad_glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC) load(userptr, "glVariantArrayObjectATI"); +} +static void glad_gl_load_GL_ATI_vertex_attrib_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_vertex_attrib_array_object) return; + glad_glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) load(userptr, "glGetVertexAttribArrayObjectfvATI"); + glad_glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) load(userptr, "glGetVertexAttribArrayObjectivATI"); + glad_glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) load(userptr, "glVertexAttribArrayObjectATI"); +} +static void glad_gl_load_GL_ATI_vertex_streams( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_vertex_streams) return; + glad_glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) load(userptr, "glClientActiveVertexStreamATI"); + glad_glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC) load(userptr, "glNormalStream3bATI"); + glad_glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC) load(userptr, "glNormalStream3bvATI"); + glad_glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC) load(userptr, "glNormalStream3dATI"); + glad_glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC) load(userptr, "glNormalStream3dvATI"); + glad_glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC) load(userptr, "glNormalStream3fATI"); + glad_glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC) load(userptr, "glNormalStream3fvATI"); + glad_glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC) load(userptr, "glNormalStream3iATI"); + glad_glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC) load(userptr, "glNormalStream3ivATI"); + glad_glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC) load(userptr, "glNormalStream3sATI"); + glad_glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC) load(userptr, "glNormalStream3svATI"); + glad_glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC) load(userptr, "glVertexBlendEnvfATI"); + glad_glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC) load(userptr, "glVertexBlendEnviATI"); + glad_glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC) load(userptr, "glVertexStream1dATI"); + glad_glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC) load(userptr, "glVertexStream1dvATI"); + glad_glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC) load(userptr, "glVertexStream1fATI"); + glad_glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC) load(userptr, "glVertexStream1fvATI"); + glad_glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC) load(userptr, "glVertexStream1iATI"); + glad_glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC) load(userptr, "glVertexStream1ivATI"); + glad_glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC) load(userptr, "glVertexStream1sATI"); + glad_glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC) load(userptr, "glVertexStream1svATI"); + glad_glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC) load(userptr, "glVertexStream2dATI"); + glad_glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC) load(userptr, "glVertexStream2dvATI"); + glad_glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC) load(userptr, "glVertexStream2fATI"); + glad_glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC) load(userptr, "glVertexStream2fvATI"); + glad_glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC) load(userptr, "glVertexStream2iATI"); + glad_glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC) load(userptr, "glVertexStream2ivATI"); + glad_glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC) load(userptr, "glVertexStream2sATI"); + glad_glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC) load(userptr, "glVertexStream2svATI"); + glad_glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC) load(userptr, "glVertexStream3dATI"); + glad_glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC) load(userptr, "glVertexStream3dvATI"); + glad_glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC) load(userptr, "glVertexStream3fATI"); + glad_glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC) load(userptr, "glVertexStream3fvATI"); + glad_glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC) load(userptr, "glVertexStream3iATI"); + glad_glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC) load(userptr, "glVertexStream3ivATI"); + glad_glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC) load(userptr, "glVertexStream3sATI"); + glad_glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC) load(userptr, "glVertexStream3svATI"); + glad_glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC) load(userptr, "glVertexStream4dATI"); + glad_glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC) load(userptr, "glVertexStream4dvATI"); + glad_glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC) load(userptr, "glVertexStream4fATI"); + glad_glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC) load(userptr, "glVertexStream4fvATI"); + glad_glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC) load(userptr, "glVertexStream4iATI"); + glad_glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC) load(userptr, "glVertexStream4ivATI"); + glad_glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC) load(userptr, "glVertexStream4sATI"); + glad_glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC) load(userptr, "glVertexStream4svATI"); +} +static void glad_gl_load_GL_EXT_EGL_image_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_EGL_image_storage) return; + glad_glEGLImageTargetTexStorageEXT = (PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) load(userptr, "glEGLImageTargetTexStorageEXT"); + glad_glEGLImageTargetTextureStorageEXT = (PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) load(userptr, "glEGLImageTargetTextureStorageEXT"); +} +static void glad_gl_load_GL_EXT_bindable_uniform( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_bindable_uniform) return; + glad_glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC) load(userptr, "glGetUniformBufferSizeEXT"); + glad_glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC) load(userptr, "glGetUniformOffsetEXT"); + glad_glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC) load(userptr, "glUniformBufferEXT"); +} +static void glad_gl_load_GL_EXT_blend_color( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_color) return; + glad_glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC) load(userptr, "glBlendColorEXT"); +} +static void glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_equation_separate) return; + glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT"); +} +static void glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_func_separate) return; + glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT"); +} +static void glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_minmax) return; + glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT"); +} +static void glad_gl_load_GL_EXT_color_subtable( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_color_subtable) return; + glad_glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC) load(userptr, "glColorSubTableEXT"); + glad_glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC) load(userptr, "glCopyColorSubTableEXT"); +} +static void glad_gl_load_GL_EXT_compiled_vertex_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_compiled_vertex_array) return; + glad_glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC) load(userptr, "glLockArraysEXT"); + glad_glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC) load(userptr, "glUnlockArraysEXT"); +} +static void glad_gl_load_GL_EXT_convolution( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_convolution) return; + glad_glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC) load(userptr, "glConvolutionFilter1DEXT"); + glad_glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC) load(userptr, "glConvolutionFilter2DEXT"); + glad_glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC) load(userptr, "glConvolutionParameterfEXT"); + glad_glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC) load(userptr, "glConvolutionParameterfvEXT"); + glad_glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC) load(userptr, "glConvolutionParameteriEXT"); + glad_glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC) load(userptr, "glConvolutionParameterivEXT"); + glad_glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) load(userptr, "glCopyConvolutionFilter1DEXT"); + glad_glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) load(userptr, "glCopyConvolutionFilter2DEXT"); + glad_glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC) load(userptr, "glGetConvolutionFilterEXT"); + glad_glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) load(userptr, "glGetConvolutionParameterfvEXT"); + glad_glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) load(userptr, "glGetConvolutionParameterivEXT"); + glad_glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC) load(userptr, "glGetSeparableFilterEXT"); + glad_glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC) load(userptr, "glSeparableFilter2DEXT"); +} +static void glad_gl_load_GL_EXT_coordinate_frame( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_coordinate_frame) return; + glad_glBinormal3bEXT = (PFNGLBINORMAL3BEXTPROC) load(userptr, "glBinormal3bEXT"); + glad_glBinormal3bvEXT = (PFNGLBINORMAL3BVEXTPROC) load(userptr, "glBinormal3bvEXT"); + glad_glBinormal3dEXT = (PFNGLBINORMAL3DEXTPROC) load(userptr, "glBinormal3dEXT"); + glad_glBinormal3dvEXT = (PFNGLBINORMAL3DVEXTPROC) load(userptr, "glBinormal3dvEXT"); + glad_glBinormal3fEXT = (PFNGLBINORMAL3FEXTPROC) load(userptr, "glBinormal3fEXT"); + glad_glBinormal3fvEXT = (PFNGLBINORMAL3FVEXTPROC) load(userptr, "glBinormal3fvEXT"); + glad_glBinormal3iEXT = (PFNGLBINORMAL3IEXTPROC) load(userptr, "glBinormal3iEXT"); + glad_glBinormal3ivEXT = (PFNGLBINORMAL3IVEXTPROC) load(userptr, "glBinormal3ivEXT"); + glad_glBinormal3sEXT = (PFNGLBINORMAL3SEXTPROC) load(userptr, "glBinormal3sEXT"); + glad_glBinormal3svEXT = (PFNGLBINORMAL3SVEXTPROC) load(userptr, "glBinormal3svEXT"); + glad_glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC) load(userptr, "glBinormalPointerEXT"); + glad_glTangent3bEXT = (PFNGLTANGENT3BEXTPROC) load(userptr, "glTangent3bEXT"); + glad_glTangent3bvEXT = (PFNGLTANGENT3BVEXTPROC) load(userptr, "glTangent3bvEXT"); + glad_glTangent3dEXT = (PFNGLTANGENT3DEXTPROC) load(userptr, "glTangent3dEXT"); + glad_glTangent3dvEXT = (PFNGLTANGENT3DVEXTPROC) load(userptr, "glTangent3dvEXT"); + glad_glTangent3fEXT = (PFNGLTANGENT3FEXTPROC) load(userptr, "glTangent3fEXT"); + glad_glTangent3fvEXT = (PFNGLTANGENT3FVEXTPROC) load(userptr, "glTangent3fvEXT"); + glad_glTangent3iEXT = (PFNGLTANGENT3IEXTPROC) load(userptr, "glTangent3iEXT"); + glad_glTangent3ivEXT = (PFNGLTANGENT3IVEXTPROC) load(userptr, "glTangent3ivEXT"); + glad_glTangent3sEXT = (PFNGLTANGENT3SEXTPROC) load(userptr, "glTangent3sEXT"); + glad_glTangent3svEXT = (PFNGLTANGENT3SVEXTPROC) load(userptr, "glTangent3svEXT"); + glad_glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC) load(userptr, "glTangentPointerEXT"); +} +static void glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_copy_texture) return; + glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT"); + glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT"); + glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT"); + glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT"); + glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT"); +} +static void glad_gl_load_GL_EXT_cull_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_cull_vertex) return; + glad_glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC) load(userptr, "glCullParameterdvEXT"); + glad_glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC) load(userptr, "glCullParameterfvEXT"); +} +static void glad_gl_load_GL_EXT_debug_label( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_debug_label) return; + glad_glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC) load(userptr, "glGetObjectLabelEXT"); + glad_glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC) load(userptr, "glLabelObjectEXT"); +} +static void glad_gl_load_GL_EXT_debug_marker( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_debug_marker) return; + glad_glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC) load(userptr, "glInsertEventMarkerEXT"); + glad_glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC) load(userptr, "glPopGroupMarkerEXT"); + glad_glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC) load(userptr, "glPushGroupMarkerEXT"); +} +static void glad_gl_load_GL_EXT_depth_bounds_test( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_depth_bounds_test) return; + glad_glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC) load(userptr, "glDepthBoundsEXT"); +} +static void glad_gl_load_GL_EXT_direct_state_access( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_direct_state_access) return; + glad_glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC) load(userptr, "glBindMultiTextureEXT"); + glad_glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckNamedFramebufferStatusEXT"); + glad_glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC) load(userptr, "glClearNamedBufferDataEXT"); + glad_glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glClearNamedBufferSubDataEXT"); + glad_glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC) load(userptr, "glClientAttribDefaultEXT"); + glad_glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) load(userptr, "glCompressedMultiTexImage1DEXT"); + glad_glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) load(userptr, "glCompressedMultiTexImage2DEXT"); + glad_glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) load(userptr, "glCompressedMultiTexImage3DEXT"); + glad_glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glCompressedMultiTexSubImage1DEXT"); + glad_glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glCompressedMultiTexSubImage2DEXT"); + glad_glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glCompressedMultiTexSubImage3DEXT"); + glad_glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) load(userptr, "glCompressedTextureImage1DEXT"); + glad_glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) load(userptr, "glCompressedTextureImage2DEXT"); + glad_glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) load(userptr, "glCompressedTextureImage3DEXT"); + glad_glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glCompressedTextureSubImage1DEXT"); + glad_glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glCompressedTextureSubImage2DEXT"); + glad_glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glCompressedTextureSubImage3DEXT"); + glad_glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC) load(userptr, "glCopyMultiTexImage1DEXT"); + glad_glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC) load(userptr, "glCopyMultiTexImage2DEXT"); + glad_glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyMultiTexSubImage1DEXT"); + glad_glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyMultiTexSubImage2DEXT"); + glad_glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyMultiTexSubImage3DEXT"); + glad_glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC) load(userptr, "glCopyTextureImage1DEXT"); + glad_glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC) load(userptr, "glCopyTextureImage2DEXT"); + glad_glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glCopyTextureSubImage1DEXT"); + glad_glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glCopyTextureSubImage2DEXT"); + glad_glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glCopyTextureSubImage3DEXT"); + glad_glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) load(userptr, "glDisableClientStateIndexedEXT"); + glad_glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC) load(userptr, "glDisableClientStateiEXT"); + glad_glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC) load(userptr, "glDisableIndexedEXT"); + glad_glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) load(userptr, "glDisableVertexArrayAttribEXT"); + glad_glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC) load(userptr, "glDisableVertexArrayEXT"); + glad_glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) load(userptr, "glEnableClientStateIndexedEXT"); + glad_glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC) load(userptr, "glEnableClientStateiEXT"); + glad_glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC) load(userptr, "glEnableIndexedEXT"); + glad_glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) load(userptr, "glEnableVertexArrayAttribEXT"); + glad_glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC) load(userptr, "glEnableVertexArrayEXT"); + glad_glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) load(userptr, "glFlushMappedNamedBufferRangeEXT"); + glad_glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) load(userptr, "glFramebufferDrawBufferEXT"); + glad_glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) load(userptr, "glFramebufferDrawBuffersEXT"); + glad_glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC) load(userptr, "glFramebufferReadBufferEXT"); + glad_glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC) load(userptr, "glGenerateMultiTexMipmapEXT"); + glad_glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC) load(userptr, "glGenerateTextureMipmapEXT"); + glad_glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC) load(userptr, "glGetBooleanIndexedvEXT"); + glad_glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) load(userptr, "glGetCompressedMultiTexImageEXT"); + glad_glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) load(userptr, "glGetCompressedTextureImageEXT"); + glad_glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC) load(userptr, "glGetDoubleIndexedvEXT"); + glad_glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC) load(userptr, "glGetDoublei_vEXT"); + glad_glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC) load(userptr, "glGetFloatIndexedvEXT"); + glad_glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC) load(userptr, "glGetFloati_vEXT"); + glad_glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferParameterivEXT"); + glad_glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC) load(userptr, "glGetIntegerIndexedvEXT"); + glad_glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC) load(userptr, "glGetMultiTexEnvfvEXT"); + glad_glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC) load(userptr, "glGetMultiTexEnvivEXT"); + glad_glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC) load(userptr, "glGetMultiTexGendvEXT"); + glad_glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC) load(userptr, "glGetMultiTexGenfvEXT"); + glad_glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC) load(userptr, "glGetMultiTexGenivEXT"); + glad_glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC) load(userptr, "glGetMultiTexImageEXT"); + glad_glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) load(userptr, "glGetMultiTexLevelParameterfvEXT"); + glad_glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) load(userptr, "glGetMultiTexLevelParameterivEXT"); + glad_glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC) load(userptr, "glGetMultiTexParameterIivEXT"); + glad_glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) load(userptr, "glGetMultiTexParameterIuivEXT"); + glad_glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC) load(userptr, "glGetMultiTexParameterfvEXT"); + glad_glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC) load(userptr, "glGetMultiTexParameterivEXT"); + glad_glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedBufferParameterivEXT"); + glad_glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) load(userptr, "glGetNamedBufferPointervEXT"); + glad_glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glGetNamedBufferSubDataEXT"); + glad_glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetNamedFramebufferAttachmentParameterivEXT"); + glad_glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedFramebufferParameterivEXT"); + glad_glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterIivEXT"); + glad_glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterIuivEXT"); + glad_glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterdvEXT"); + glad_glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterfvEXT"); + glad_glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) load(userptr, "glGetNamedProgramStringEXT"); + glad_glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC) load(userptr, "glGetNamedProgramivEXT"); + glad_glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedRenderbufferParameterivEXT"); + glad_glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC) load(userptr, "glGetPointerIndexedvEXT"); + glad_glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC) load(userptr, "glGetPointeri_vEXT"); + glad_glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC) load(userptr, "glGetTextureImageEXT"); + glad_glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) load(userptr, "glGetTextureLevelParameterfvEXT"); + glad_glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) load(userptr, "glGetTextureLevelParameterivEXT"); + glad_glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC) load(userptr, "glGetTextureParameterIivEXT"); + glad_glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) load(userptr, "glGetTextureParameterIuivEXT"); + glad_glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC) load(userptr, "glGetTextureParameterfvEXT"); + glad_glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC) load(userptr, "glGetTextureParameterivEXT"); + glad_glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) load(userptr, "glGetVertexArrayIntegeri_vEXT"); + glad_glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC) load(userptr, "glGetVertexArrayIntegervEXT"); + glad_glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) load(userptr, "glGetVertexArrayPointeri_vEXT"); + glad_glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC) load(userptr, "glGetVertexArrayPointervEXT"); + glad_glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC) load(userptr, "glIsEnabledIndexedEXT"); + glad_glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC) load(userptr, "glMapNamedBufferEXT"); + glad_glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC) load(userptr, "glMapNamedBufferRangeEXT"); + glad_glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC) load(userptr, "glMatrixFrustumEXT"); + glad_glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC) load(userptr, "glMatrixLoadIdentityEXT"); + glad_glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC) load(userptr, "glMatrixLoadTransposedEXT"); + glad_glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC) load(userptr, "glMatrixLoadTransposefEXT"); + glad_glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC) load(userptr, "glMatrixLoaddEXT"); + glad_glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC) load(userptr, "glMatrixLoadfEXT"); + glad_glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC) load(userptr, "glMatrixMultTransposedEXT"); + glad_glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC) load(userptr, "glMatrixMultTransposefEXT"); + glad_glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC) load(userptr, "glMatrixMultdEXT"); + glad_glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC) load(userptr, "glMatrixMultfEXT"); + glad_glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC) load(userptr, "glMatrixOrthoEXT"); + glad_glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC) load(userptr, "glMatrixPopEXT"); + glad_glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC) load(userptr, "glMatrixPushEXT"); + glad_glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC) load(userptr, "glMatrixRotatedEXT"); + glad_glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC) load(userptr, "glMatrixRotatefEXT"); + glad_glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC) load(userptr, "glMatrixScaledEXT"); + glad_glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC) load(userptr, "glMatrixScalefEXT"); + glad_glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC) load(userptr, "glMatrixTranslatedEXT"); + glad_glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC) load(userptr, "glMatrixTranslatefEXT"); + glad_glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC) load(userptr, "glMultiTexBufferEXT"); + glad_glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC) load(userptr, "glMultiTexCoordPointerEXT"); + glad_glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC) load(userptr, "glMultiTexEnvfEXT"); + glad_glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC) load(userptr, "glMultiTexEnvfvEXT"); + glad_glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC) load(userptr, "glMultiTexEnviEXT"); + glad_glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC) load(userptr, "glMultiTexEnvivEXT"); + glad_glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC) load(userptr, "glMultiTexGendEXT"); + glad_glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC) load(userptr, "glMultiTexGendvEXT"); + glad_glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC) load(userptr, "glMultiTexGenfEXT"); + glad_glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC) load(userptr, "glMultiTexGenfvEXT"); + glad_glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC) load(userptr, "glMultiTexGeniEXT"); + glad_glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC) load(userptr, "glMultiTexGenivEXT"); + glad_glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC) load(userptr, "glMultiTexImage1DEXT"); + glad_glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC) load(userptr, "glMultiTexImage2DEXT"); + glad_glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC) load(userptr, "glMultiTexImage3DEXT"); + glad_glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC) load(userptr, "glMultiTexParameterIivEXT"); + glad_glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC) load(userptr, "glMultiTexParameterIuivEXT"); + glad_glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC) load(userptr, "glMultiTexParameterfEXT"); + glad_glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC) load(userptr, "glMultiTexParameterfvEXT"); + glad_glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC) load(userptr, "glMultiTexParameteriEXT"); + glad_glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC) load(userptr, "glMultiTexParameterivEXT"); + glad_glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC) load(userptr, "glMultiTexRenderbufferEXT"); + glad_glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glMultiTexSubImage1DEXT"); + glad_glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glMultiTexSubImage2DEXT"); + glad_glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glMultiTexSubImage3DEXT"); + glad_glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC) load(userptr, "glNamedBufferDataEXT"); + glad_glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC) load(userptr, "glNamedBufferStorageEXT"); + glad_glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glNamedBufferSubDataEXT"); + glad_glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) load(userptr, "glNamedCopyBufferSubDataEXT"); + glad_glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) load(userptr, "glNamedFramebufferParameteriEXT"); + glad_glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glNamedFramebufferRenderbufferEXT"); + glad_glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glNamedFramebufferTexture1DEXT"); + glad_glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glNamedFramebufferTexture2DEXT"); + glad_glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glNamedFramebufferTexture3DEXT"); + glad_glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glNamedFramebufferTextureEXT"); + glad_glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glNamedFramebufferTextureFaceEXT"); + glad_glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glNamedFramebufferTextureLayerEXT"); + glad_glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) load(userptr, "glNamedProgramLocalParameter4dEXT"); + glad_glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) load(userptr, "glNamedProgramLocalParameter4dvEXT"); + glad_glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) load(userptr, "glNamedProgramLocalParameter4fEXT"); + glad_glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) load(userptr, "glNamedProgramLocalParameter4fvEXT"); + glad_glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) load(userptr, "glNamedProgramLocalParameterI4iEXT"); + glad_glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) load(userptr, "glNamedProgramLocalParameterI4ivEXT"); + glad_glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) load(userptr, "glNamedProgramLocalParameterI4uiEXT"); + glad_glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) load(userptr, "glNamedProgramLocalParameterI4uivEXT"); + glad_glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) load(userptr, "glNamedProgramLocalParameters4fvEXT"); + glad_glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) load(userptr, "glNamedProgramLocalParametersI4ivEXT"); + glad_glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) load(userptr, "glNamedProgramLocalParametersI4uivEXT"); + glad_glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC) load(userptr, "glNamedProgramStringEXT"); + glad_glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glNamedRenderbufferStorageEXT"); + glad_glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) load(userptr, "glNamedRenderbufferStorageMultisampleCoverageEXT"); + glad_glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glNamedRenderbufferStorageMultisampleEXT"); + glad_glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC) load(userptr, "glProgramUniform1dEXT"); + glad_glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC) load(userptr, "glProgramUniform1dvEXT"); + glad_glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC) load(userptr, "glProgramUniform1fEXT"); + glad_glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC) load(userptr, "glProgramUniform1fvEXT"); + glad_glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC) load(userptr, "glProgramUniform1iEXT"); + glad_glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC) load(userptr, "glProgramUniform1ivEXT"); + glad_glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC) load(userptr, "glProgramUniform1uiEXT"); + glad_glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC) load(userptr, "glProgramUniform1uivEXT"); + glad_glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC) load(userptr, "glProgramUniform2dEXT"); + glad_glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC) load(userptr, "glProgramUniform2dvEXT"); + glad_glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC) load(userptr, "glProgramUniform2fEXT"); + glad_glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC) load(userptr, "glProgramUniform2fvEXT"); + glad_glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC) load(userptr, "glProgramUniform2iEXT"); + glad_glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC) load(userptr, "glProgramUniform2ivEXT"); + glad_glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC) load(userptr, "glProgramUniform2uiEXT"); + glad_glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC) load(userptr, "glProgramUniform2uivEXT"); + glad_glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC) load(userptr, "glProgramUniform3dEXT"); + glad_glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC) load(userptr, "glProgramUniform3dvEXT"); + glad_glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC) load(userptr, "glProgramUniform3fEXT"); + glad_glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC) load(userptr, "glProgramUniform3fvEXT"); + glad_glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC) load(userptr, "glProgramUniform3iEXT"); + glad_glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC) load(userptr, "glProgramUniform3ivEXT"); + glad_glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC) load(userptr, "glProgramUniform3uiEXT"); + glad_glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC) load(userptr, "glProgramUniform3uivEXT"); + glad_glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC) load(userptr, "glProgramUniform4dEXT"); + glad_glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC) load(userptr, "glProgramUniform4dvEXT"); + glad_glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC) load(userptr, "glProgramUniform4fEXT"); + glad_glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC) load(userptr, "glProgramUniform4fvEXT"); + glad_glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC) load(userptr, "glProgramUniform4iEXT"); + glad_glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC) load(userptr, "glProgramUniform4ivEXT"); + glad_glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC) load(userptr, "glProgramUniform4uiEXT"); + glad_glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC) load(userptr, "glProgramUniform4uivEXT"); + glad_glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) load(userptr, "glProgramUniformMatrix2dvEXT"); + glad_glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) load(userptr, "glProgramUniformMatrix2fvEXT"); + glad_glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) load(userptr, "glProgramUniformMatrix2x3dvEXT"); + glad_glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) load(userptr, "glProgramUniformMatrix2x3fvEXT"); + glad_glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) load(userptr, "glProgramUniformMatrix2x4dvEXT"); + glad_glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) load(userptr, "glProgramUniformMatrix2x4fvEXT"); + glad_glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) load(userptr, "glProgramUniformMatrix3dvEXT"); + glad_glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) load(userptr, "glProgramUniformMatrix3fvEXT"); + glad_glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) load(userptr, "glProgramUniformMatrix3x2dvEXT"); + glad_glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) load(userptr, "glProgramUniformMatrix3x2fvEXT"); + glad_glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) load(userptr, "glProgramUniformMatrix3x4dvEXT"); + glad_glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) load(userptr, "glProgramUniformMatrix3x4fvEXT"); + glad_glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) load(userptr, "glProgramUniformMatrix4dvEXT"); + glad_glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) load(userptr, "glProgramUniformMatrix4fvEXT"); + glad_glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) load(userptr, "glProgramUniformMatrix4x2dvEXT"); + glad_glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) load(userptr, "glProgramUniformMatrix4x2fvEXT"); + glad_glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) load(userptr, "glProgramUniformMatrix4x3dvEXT"); + glad_glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) load(userptr, "glProgramUniformMatrix4x3fvEXT"); + glad_glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) load(userptr, "glPushClientAttribDefaultEXT"); + glad_glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC) load(userptr, "glTextureBufferEXT"); + glad_glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC) load(userptr, "glTextureBufferRangeEXT"); + glad_glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC) load(userptr, "glTextureImage1DEXT"); + glad_glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC) load(userptr, "glTextureImage2DEXT"); + glad_glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC) load(userptr, "glTextureImage3DEXT"); + glad_glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC) load(userptr, "glTexturePageCommitmentEXT"); + glad_glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC) load(userptr, "glTextureParameterIivEXT"); + glad_glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC) load(userptr, "glTextureParameterIuivEXT"); + glad_glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC) load(userptr, "glTextureParameterfEXT"); + glad_glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC) load(userptr, "glTextureParameterfvEXT"); + glad_glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC) load(userptr, "glTextureParameteriEXT"); + glad_glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC) load(userptr, "glTextureParameterivEXT"); + glad_glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC) load(userptr, "glTextureRenderbufferEXT"); + glad_glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) load(userptr, "glTextureStorage1DEXT"); + glad_glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) load(userptr, "glTextureStorage2DEXT"); + glad_glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorage2DMultisampleEXT"); + glad_glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) load(userptr, "glTextureStorage3DEXT"); + glad_glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorage3DMultisampleEXT"); + glad_glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glTextureSubImage1DEXT"); + glad_glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glTextureSubImage2DEXT"); + glad_glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glTextureSubImage3DEXT"); + glad_glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC) load(userptr, "glUnmapNamedBufferEXT"); + glad_glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) load(userptr, "glVertexArrayBindVertexBufferEXT"); + glad_glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) load(userptr, "glVertexArrayColorOffsetEXT"); + glad_glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) load(userptr, "glVertexArrayEdgeFlagOffsetEXT"); + glad_glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayFogCoordOffsetEXT"); + glad_glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) load(userptr, "glVertexArrayIndexOffsetEXT"); + glad_glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayMultiTexCoordOffsetEXT"); + glad_glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) load(userptr, "glVertexArrayNormalOffsetEXT"); + glad_glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) load(userptr, "glVertexArraySecondaryColorOffsetEXT"); + glad_glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayTexCoordOffsetEXT"); + glad_glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) load(userptr, "glVertexArrayVertexAttribBindingEXT"); + glad_glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) load(userptr, "glVertexArrayVertexAttribDivisorEXT"); + glad_glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribFormatEXT"); + glad_glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribIFormatEXT"); + glad_glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribIOffsetEXT"); + glad_glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribLFormatEXT"); + glad_glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribLOffsetEXT"); + glad_glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribOffsetEXT"); + glad_glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) load(userptr, "glVertexArrayVertexBindingDivisorEXT"); + glad_glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) load(userptr, "glVertexArrayVertexOffsetEXT"); +} +static void glad_gl_load_GL_EXT_draw_buffers2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_buffers2) return; + glad_glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC) load(userptr, "glColorMaskIndexedEXT"); + glad_glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC) load(userptr, "glDisableIndexedEXT"); + glad_glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC) load(userptr, "glEnableIndexedEXT"); + glad_glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC) load(userptr, "glGetBooleanIndexedvEXT"); + glad_glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC) load(userptr, "glGetIntegerIndexedvEXT"); + glad_glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC) load(userptr, "glIsEnabledIndexedEXT"); +} +static void glad_gl_load_GL_EXT_draw_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_instanced) return; + glad_glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC) load(userptr, "glDrawArraysInstancedEXT"); + glad_glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC) load(userptr, "glDrawElementsInstancedEXT"); +} +static void glad_gl_load_GL_EXT_draw_range_elements( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_range_elements) return; + glad_glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC) load(userptr, "glDrawRangeElementsEXT"); +} +static void glad_gl_load_GL_EXT_external_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_external_buffer) return; + glad_glBufferStorageExternalEXT = (PFNGLBUFFERSTORAGEEXTERNALEXTPROC) load(userptr, "glBufferStorageExternalEXT"); + glad_glNamedBufferStorageExternalEXT = (PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) load(userptr, "glNamedBufferStorageExternalEXT"); +} +static void glad_gl_load_GL_EXT_fog_coord( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_fog_coord) return; + glad_glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC) load(userptr, "glFogCoordPointerEXT"); + glad_glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC) load(userptr, "glFogCoorddEXT"); + glad_glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC) load(userptr, "glFogCoorddvEXT"); + glad_glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) load(userptr, "glFogCoordfEXT"); + glad_glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC) load(userptr, "glFogCoordfvEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_blit) return; + glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_blit_layers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_blit_layers) return; + glad_glBlitFramebufferLayerEXT = (PFNGLBLITFRAMEBUFFERLAYEREXTPROC) load(userptr, "glBlitFramebufferLayerEXT"); + glad_glBlitFramebufferLayersEXT = (PFNGLBLITFRAMEBUFFERLAYERSEXTPROC) load(userptr, "glBlitFramebufferLayersEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_multisample) return; + glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_object) return; + glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT"); + glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT"); + glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT"); + glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT"); + glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT"); + glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT"); + glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT"); + glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT"); + glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT"); + glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT"); + glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT"); + glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT"); + glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT"); + glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT"); + glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT"); + glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT"); + glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT"); +} +static void glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_geometry_shader4) return; + glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT"); +} +static void glad_gl_load_GL_EXT_gpu_program_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_gpu_program_parameters) return; + glad_glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) load(userptr, "glProgramEnvParameters4fvEXT"); + glad_glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) load(userptr, "glProgramLocalParameters4fvEXT"); +} +static void glad_gl_load_GL_EXT_gpu_shader4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_gpu_shader4) return; + glad_glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC) load(userptr, "glBindFragDataLocationEXT"); + glad_glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC) load(userptr, "glGetFragDataLocationEXT"); + glad_glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC) load(userptr, "glGetUniformuivEXT"); + glad_glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC) load(userptr, "glGetVertexAttribIivEXT"); + glad_glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC) load(userptr, "glGetVertexAttribIuivEXT"); + glad_glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC) load(userptr, "glUniform1uiEXT"); + glad_glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC) load(userptr, "glUniform1uivEXT"); + glad_glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC) load(userptr, "glUniform2uiEXT"); + glad_glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC) load(userptr, "glUniform2uivEXT"); + glad_glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC) load(userptr, "glUniform3uiEXT"); + glad_glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC) load(userptr, "glUniform3uivEXT"); + glad_glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC) load(userptr, "glUniform4uiEXT"); + glad_glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC) load(userptr, "glUniform4uivEXT"); + glad_glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC) load(userptr, "glVertexAttribI1iEXT"); + glad_glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC) load(userptr, "glVertexAttribI1ivEXT"); + glad_glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC) load(userptr, "glVertexAttribI1uiEXT"); + glad_glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC) load(userptr, "glVertexAttribI1uivEXT"); + glad_glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC) load(userptr, "glVertexAttribI2iEXT"); + glad_glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC) load(userptr, "glVertexAttribI2ivEXT"); + glad_glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC) load(userptr, "glVertexAttribI2uiEXT"); + glad_glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC) load(userptr, "glVertexAttribI2uivEXT"); + glad_glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC) load(userptr, "glVertexAttribI3iEXT"); + glad_glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC) load(userptr, "glVertexAttribI3ivEXT"); + glad_glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC) load(userptr, "glVertexAttribI3uiEXT"); + glad_glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC) load(userptr, "glVertexAttribI3uivEXT"); + glad_glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC) load(userptr, "glVertexAttribI4bvEXT"); + glad_glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC) load(userptr, "glVertexAttribI4iEXT"); + glad_glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC) load(userptr, "glVertexAttribI4ivEXT"); + glad_glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC) load(userptr, "glVertexAttribI4svEXT"); + glad_glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC) load(userptr, "glVertexAttribI4ubvEXT"); + glad_glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC) load(userptr, "glVertexAttribI4uiEXT"); + glad_glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC) load(userptr, "glVertexAttribI4uivEXT"); + glad_glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC) load(userptr, "glVertexAttribI4usvEXT"); + glad_glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC) load(userptr, "glVertexAttribIPointerEXT"); +} +static void glad_gl_load_GL_EXT_histogram( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_histogram) return; + glad_glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC) load(userptr, "glGetHistogramEXT"); + glad_glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) load(userptr, "glGetHistogramParameterfvEXT"); + glad_glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) load(userptr, "glGetHistogramParameterivEXT"); + glad_glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC) load(userptr, "glGetMinmaxEXT"); + glad_glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC) load(userptr, "glGetMinmaxParameterfvEXT"); + glad_glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC) load(userptr, "glGetMinmaxParameterivEXT"); + glad_glHistogramEXT = (PFNGLHISTOGRAMEXTPROC) load(userptr, "glHistogramEXT"); + glad_glMinmaxEXT = (PFNGLMINMAXEXTPROC) load(userptr, "glMinmaxEXT"); + glad_glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC) load(userptr, "glResetHistogramEXT"); + glad_glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC) load(userptr, "glResetMinmaxEXT"); +} +static void glad_gl_load_GL_EXT_index_func( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_index_func) return; + glad_glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC) load(userptr, "glIndexFuncEXT"); +} +static void glad_gl_load_GL_EXT_index_material( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_index_material) return; + glad_glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC) load(userptr, "glIndexMaterialEXT"); +} +static void glad_gl_load_GL_EXT_light_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_light_texture) return; + glad_glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC) load(userptr, "glApplyTextureEXT"); + glad_glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC) load(userptr, "glTextureLightEXT"); + glad_glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC) load(userptr, "glTextureMaterialEXT"); +} +static void glad_gl_load_GL_EXT_memory_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_memory_object) return; + glad_glBufferStorageMemEXT = (PFNGLBUFFERSTORAGEMEMEXTPROC) load(userptr, "glBufferStorageMemEXT"); + glad_glCreateMemoryObjectsEXT = (PFNGLCREATEMEMORYOBJECTSEXTPROC) load(userptr, "glCreateMemoryObjectsEXT"); + glad_glDeleteMemoryObjectsEXT = (PFNGLDELETEMEMORYOBJECTSEXTPROC) load(userptr, "glDeleteMemoryObjectsEXT"); + glad_glGetMemoryObjectParameterivEXT = (PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) load(userptr, "glGetMemoryObjectParameterivEXT"); + glad_glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC) load(userptr, "glGetUnsignedBytei_vEXT"); + glad_glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC) load(userptr, "glGetUnsignedBytevEXT"); + glad_glIsMemoryObjectEXT = (PFNGLISMEMORYOBJECTEXTPROC) load(userptr, "glIsMemoryObjectEXT"); + glad_glMemoryObjectParameterivEXT = (PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) load(userptr, "glMemoryObjectParameterivEXT"); + glad_glNamedBufferStorageMemEXT = (PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) load(userptr, "glNamedBufferStorageMemEXT"); + glad_glTexStorageMem1DEXT = (PFNGLTEXSTORAGEMEM1DEXTPROC) load(userptr, "glTexStorageMem1DEXT"); + glad_glTexStorageMem2DEXT = (PFNGLTEXSTORAGEMEM2DEXTPROC) load(userptr, "glTexStorageMem2DEXT"); + glad_glTexStorageMem2DMultisampleEXT = (PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) load(userptr, "glTexStorageMem2DMultisampleEXT"); + glad_glTexStorageMem3DEXT = (PFNGLTEXSTORAGEMEM3DEXTPROC) load(userptr, "glTexStorageMem3DEXT"); + glad_glTexStorageMem3DMultisampleEXT = (PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) load(userptr, "glTexStorageMem3DMultisampleEXT"); + glad_glTextureStorageMem1DEXT = (PFNGLTEXTURESTORAGEMEM1DEXTPROC) load(userptr, "glTextureStorageMem1DEXT"); + glad_glTextureStorageMem2DEXT = (PFNGLTEXTURESTORAGEMEM2DEXTPROC) load(userptr, "glTextureStorageMem2DEXT"); + glad_glTextureStorageMem2DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorageMem2DMultisampleEXT"); + glad_glTextureStorageMem3DEXT = (PFNGLTEXTURESTORAGEMEM3DEXTPROC) load(userptr, "glTextureStorageMem3DEXT"); + glad_glTextureStorageMem3DMultisampleEXT = (PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorageMem3DMultisampleEXT"); +} +static void glad_gl_load_GL_EXT_memory_object_fd( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_memory_object_fd) return; + glad_glImportMemoryFdEXT = (PFNGLIMPORTMEMORYFDEXTPROC) load(userptr, "glImportMemoryFdEXT"); +} +static void glad_gl_load_GL_EXT_memory_object_win32( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_memory_object_win32) return; + glad_glImportMemoryWin32HandleEXT = (PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) load(userptr, "glImportMemoryWin32HandleEXT"); + glad_glImportMemoryWin32NameEXT = (PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) load(userptr, "glImportMemoryWin32NameEXT"); +} +static void glad_gl_load_GL_EXT_multi_draw_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multi_draw_arrays) return; + glad_glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC) load(userptr, "glMultiDrawArraysEXT"); + glad_glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC) load(userptr, "glMultiDrawElementsEXT"); +} +static void glad_gl_load_GL_EXT_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multisample) return; + glad_glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC) load(userptr, "glSampleMaskEXT"); + glad_glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC) load(userptr, "glSamplePatternEXT"); +} +static void glad_gl_load_GL_EXT_paletted_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_paletted_texture) return; + glad_glColorTableEXT = (PFNGLCOLORTABLEEXTPROC) load(userptr, "glColorTableEXT"); + glad_glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC) load(userptr, "glGetColorTableEXT"); + glad_glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) load(userptr, "glGetColorTableParameterfvEXT"); + glad_glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) load(userptr, "glGetColorTableParameterivEXT"); +} +static void glad_gl_load_GL_EXT_pixel_transform( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_pixel_transform) return; + glad_glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) load(userptr, "glGetPixelTransformParameterfvEXT"); + glad_glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) load(userptr, "glGetPixelTransformParameterivEXT"); + glad_glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) load(userptr, "glPixelTransformParameterfEXT"); + glad_glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) load(userptr, "glPixelTransformParameterfvEXT"); + glad_glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) load(userptr, "glPixelTransformParameteriEXT"); + glad_glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) load(userptr, "glPixelTransformParameterivEXT"); +} +static void glad_gl_load_GL_EXT_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_point_parameters) return; + glad_glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC) load(userptr, "glPointParameterfEXT"); + glad_glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC) load(userptr, "glPointParameterfvEXT"); +} +static void glad_gl_load_GL_EXT_polygon_offset( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_polygon_offset) return; + glad_glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC) load(userptr, "glPolygonOffsetEXT"); +} +static void glad_gl_load_GL_EXT_polygon_offset_clamp( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_polygon_offset_clamp) return; + glad_glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC) load(userptr, "glPolygonOffsetClampEXT"); +} +static void glad_gl_load_GL_EXT_provoking_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_provoking_vertex) return; + glad_glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC) load(userptr, "glProvokingVertexEXT"); +} +static void glad_gl_load_GL_EXT_raster_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_raster_multisample) return; + glad_glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC) load(userptr, "glRasterSamplesEXT"); +} +static void glad_gl_load_GL_EXT_secondary_color( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_secondary_color) return; + glad_glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC) load(userptr, "glSecondaryColor3bEXT"); + glad_glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC) load(userptr, "glSecondaryColor3bvEXT"); + glad_glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC) load(userptr, "glSecondaryColor3dEXT"); + glad_glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC) load(userptr, "glSecondaryColor3dvEXT"); + glad_glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC) load(userptr, "glSecondaryColor3fEXT"); + glad_glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC) load(userptr, "glSecondaryColor3fvEXT"); + glad_glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC) load(userptr, "glSecondaryColor3iEXT"); + glad_glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC) load(userptr, "glSecondaryColor3ivEXT"); + glad_glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC) load(userptr, "glSecondaryColor3sEXT"); + glad_glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC) load(userptr, "glSecondaryColor3svEXT"); + glad_glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC) load(userptr, "glSecondaryColor3ubEXT"); + glad_glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC) load(userptr, "glSecondaryColor3ubvEXT"); + glad_glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC) load(userptr, "glSecondaryColor3uiEXT"); + glad_glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC) load(userptr, "glSecondaryColor3uivEXT"); + glad_glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC) load(userptr, "glSecondaryColor3usEXT"); + glad_glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC) load(userptr, "glSecondaryColor3usvEXT"); + glad_glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC) load(userptr, "glSecondaryColorPointerEXT"); +} +static void glad_gl_load_GL_EXT_semaphore( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_semaphore) return; + glad_glDeleteSemaphoresEXT = (PFNGLDELETESEMAPHORESEXTPROC) load(userptr, "glDeleteSemaphoresEXT"); + glad_glGenSemaphoresEXT = (PFNGLGENSEMAPHORESEXTPROC) load(userptr, "glGenSemaphoresEXT"); + glad_glGetSemaphoreParameterui64vEXT = (PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) load(userptr, "glGetSemaphoreParameterui64vEXT"); + glad_glGetUnsignedBytei_vEXT = (PFNGLGETUNSIGNEDBYTEI_VEXTPROC) load(userptr, "glGetUnsignedBytei_vEXT"); + glad_glGetUnsignedBytevEXT = (PFNGLGETUNSIGNEDBYTEVEXTPROC) load(userptr, "glGetUnsignedBytevEXT"); + glad_glIsSemaphoreEXT = (PFNGLISSEMAPHOREEXTPROC) load(userptr, "glIsSemaphoreEXT"); + glad_glSemaphoreParameterui64vEXT = (PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) load(userptr, "glSemaphoreParameterui64vEXT"); + glad_glSignalSemaphoreEXT = (PFNGLSIGNALSEMAPHOREEXTPROC) load(userptr, "glSignalSemaphoreEXT"); + glad_glWaitSemaphoreEXT = (PFNGLWAITSEMAPHOREEXTPROC) load(userptr, "glWaitSemaphoreEXT"); +} +static void glad_gl_load_GL_EXT_semaphore_fd( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_semaphore_fd) return; + glad_glImportSemaphoreFdEXT = (PFNGLIMPORTSEMAPHOREFDEXTPROC) load(userptr, "glImportSemaphoreFdEXT"); +} +static void glad_gl_load_GL_EXT_semaphore_win32( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_semaphore_win32) return; + glad_glImportSemaphoreWin32HandleEXT = (PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) load(userptr, "glImportSemaphoreWin32HandleEXT"); + glad_glImportSemaphoreWin32NameEXT = (PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) load(userptr, "glImportSemaphoreWin32NameEXT"); +} +static void glad_gl_load_GL_EXT_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_separate_shader_objects) return; + glad_glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC) load(userptr, "glActiveProgramEXT"); + glad_glActiveShaderProgramEXT = (PFNGLACTIVESHADERPROGRAMEXTPROC) load(userptr, "glActiveShaderProgramEXT"); + glad_glBindProgramPipelineEXT = (PFNGLBINDPROGRAMPIPELINEEXTPROC) load(userptr, "glBindProgramPipelineEXT"); + glad_glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC) load(userptr, "glCreateShaderProgramEXT"); + glad_glCreateShaderProgramvEXT = (PFNGLCREATESHADERPROGRAMVEXTPROC) load(userptr, "glCreateShaderProgramvEXT"); + glad_glDeleteProgramPipelinesEXT = (PFNGLDELETEPROGRAMPIPELINESEXTPROC) load(userptr, "glDeleteProgramPipelinesEXT"); + glad_glGenProgramPipelinesEXT = (PFNGLGENPROGRAMPIPELINESEXTPROC) load(userptr, "glGenProgramPipelinesEXT"); + glad_glGetProgramPipelineInfoLogEXT = (PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) load(userptr, "glGetProgramPipelineInfoLogEXT"); + glad_glGetProgramPipelineivEXT = (PFNGLGETPROGRAMPIPELINEIVEXTPROC) load(userptr, "glGetProgramPipelineivEXT"); + glad_glIsProgramPipelineEXT = (PFNGLISPROGRAMPIPELINEEXTPROC) load(userptr, "glIsProgramPipelineEXT"); + glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT"); + glad_glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC) load(userptr, "glProgramUniform1fEXT"); + glad_glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC) load(userptr, "glProgramUniform1fvEXT"); + glad_glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC) load(userptr, "glProgramUniform1iEXT"); + glad_glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC) load(userptr, "glProgramUniform1ivEXT"); + glad_glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC) load(userptr, "glProgramUniform1uiEXT"); + glad_glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC) load(userptr, "glProgramUniform1uivEXT"); + glad_glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC) load(userptr, "glProgramUniform2fEXT"); + glad_glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC) load(userptr, "glProgramUniform2fvEXT"); + glad_glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC) load(userptr, "glProgramUniform2iEXT"); + glad_glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC) load(userptr, "glProgramUniform2ivEXT"); + glad_glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC) load(userptr, "glProgramUniform2uiEXT"); + glad_glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC) load(userptr, "glProgramUniform2uivEXT"); + glad_glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC) load(userptr, "glProgramUniform3fEXT"); + glad_glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC) load(userptr, "glProgramUniform3fvEXT"); + glad_glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC) load(userptr, "glProgramUniform3iEXT"); + glad_glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC) load(userptr, "glProgramUniform3ivEXT"); + glad_glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC) load(userptr, "glProgramUniform3uiEXT"); + glad_glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC) load(userptr, "glProgramUniform3uivEXT"); + glad_glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC) load(userptr, "glProgramUniform4fEXT"); + glad_glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC) load(userptr, "glProgramUniform4fvEXT"); + glad_glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC) load(userptr, "glProgramUniform4iEXT"); + glad_glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC) load(userptr, "glProgramUniform4ivEXT"); + glad_glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC) load(userptr, "glProgramUniform4uiEXT"); + glad_glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC) load(userptr, "glProgramUniform4uivEXT"); + glad_glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) load(userptr, "glProgramUniformMatrix2fvEXT"); + glad_glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) load(userptr, "glProgramUniformMatrix2x3fvEXT"); + glad_glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) load(userptr, "glProgramUniformMatrix2x4fvEXT"); + glad_glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) load(userptr, "glProgramUniformMatrix3fvEXT"); + glad_glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) load(userptr, "glProgramUniformMatrix3x2fvEXT"); + glad_glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) load(userptr, "glProgramUniformMatrix3x4fvEXT"); + glad_glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) load(userptr, "glProgramUniformMatrix4fvEXT"); + glad_glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) load(userptr, "glProgramUniformMatrix4x2fvEXT"); + glad_glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) load(userptr, "glProgramUniformMatrix4x3fvEXT"); + glad_glUseProgramStagesEXT = (PFNGLUSEPROGRAMSTAGESEXTPROC) load(userptr, "glUseProgramStagesEXT"); + glad_glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC) load(userptr, "glUseShaderProgramEXT"); + glad_glValidateProgramPipelineEXT = (PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) load(userptr, "glValidateProgramPipelineEXT"); +} +static void glad_gl_load_GL_EXT_shader_framebuffer_fetch_non_coherent( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_shader_framebuffer_fetch_non_coherent) return; + glad_glFramebufferFetchBarrierEXT = (PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) load(userptr, "glFramebufferFetchBarrierEXT"); +} +static void glad_gl_load_GL_EXT_shader_image_load_store( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_shader_image_load_store) return; + glad_glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC) load(userptr, "glBindImageTextureEXT"); + glad_glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC) load(userptr, "glMemoryBarrierEXT"); +} +static void glad_gl_load_GL_EXT_stencil_clear_tag( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_stencil_clear_tag) return; + glad_glStencilClearTagEXT = (PFNGLSTENCILCLEARTAGEXTPROC) load(userptr, "glStencilClearTagEXT"); +} +static void glad_gl_load_GL_EXT_stencil_two_side( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_stencil_two_side) return; + glad_glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC) load(userptr, "glActiveStencilFaceEXT"); +} +static void glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_subtexture) return; + glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT"); + glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT"); +} +static void glad_gl_load_GL_EXT_texture3D( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture3D) return; + glad_glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC) load(userptr, "glTexImage3DEXT"); + glad_glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC) load(userptr, "glTexSubImage3DEXT"); +} +static void glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_array) return; + glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); +} +static void glad_gl_load_GL_EXT_texture_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_buffer_object) return; + glad_glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC) load(userptr, "glTexBufferEXT"); +} +static void glad_gl_load_GL_EXT_texture_integer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_integer) return; + glad_glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC) load(userptr, "glClearColorIiEXT"); + glad_glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC) load(userptr, "glClearColorIuiEXT"); + glad_glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC) load(userptr, "glGetTexParameterIivEXT"); + glad_glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC) load(userptr, "glGetTexParameterIuivEXT"); + glad_glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC) load(userptr, "glTexParameterIivEXT"); + glad_glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC) load(userptr, "glTexParameterIuivEXT"); +} +static void glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_object) return; + glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT"); + glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT"); + glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT"); + glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT"); + glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT"); + glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT"); +} +static void glad_gl_load_GL_EXT_texture_perturb_normal( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_perturb_normal) return; + glad_glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC) load(userptr, "glTextureNormalEXT"); +} +static void glad_gl_load_GL_EXT_texture_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_storage) return; + glad_glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC) load(userptr, "glTexStorage1DEXT"); + glad_glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC) load(userptr, "glTexStorage2DEXT"); + glad_glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC) load(userptr, "glTexStorage3DEXT"); + glad_glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) load(userptr, "glTextureStorage1DEXT"); + glad_glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) load(userptr, "glTextureStorage2DEXT"); + glad_glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) load(userptr, "glTextureStorage3DEXT"); +} +static void glad_gl_load_GL_EXT_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_timer_query) return; + glad_glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC) load(userptr, "glGetQueryObjecti64vEXT"); + glad_glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC) load(userptr, "glGetQueryObjectui64vEXT"); +} +static void glad_gl_load_GL_EXT_transform_feedback( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_transform_feedback) return; + glad_glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) load(userptr, "glBeginTransformFeedbackEXT"); + glad_glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC) load(userptr, "glBindBufferBaseEXT"); + glad_glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC) load(userptr, "glBindBufferOffsetEXT"); + glad_glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC) load(userptr, "glBindBufferRangeEXT"); + glad_glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC) load(userptr, "glEndTransformFeedbackEXT"); + glad_glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) load(userptr, "glGetTransformFeedbackVaryingEXT"); + glad_glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) load(userptr, "glTransformFeedbackVaryingsEXT"); +} +static void glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_vertex_array) return; + glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT"); + glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT"); + glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT"); + glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT"); + glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT"); + glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT"); + glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT"); + glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT"); + glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT"); +} +static void glad_gl_load_GL_EXT_vertex_attrib_64bit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_vertex_attrib_64bit) return; + glad_glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC) load(userptr, "glGetVertexAttribLdvEXT"); + glad_glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC) load(userptr, "glVertexAttribL1dEXT"); + glad_glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC) load(userptr, "glVertexAttribL1dvEXT"); + glad_glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC) load(userptr, "glVertexAttribL2dEXT"); + glad_glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC) load(userptr, "glVertexAttribL2dvEXT"); + glad_glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC) load(userptr, "glVertexAttribL3dEXT"); + glad_glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC) load(userptr, "glVertexAttribL3dvEXT"); + glad_glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC) load(userptr, "glVertexAttribL4dEXT"); + glad_glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC) load(userptr, "glVertexAttribL4dvEXT"); + glad_glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC) load(userptr, "glVertexAttribLPointerEXT"); +} +static void glad_gl_load_GL_EXT_vertex_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_vertex_shader) return; + glad_glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC) load(userptr, "glBeginVertexShaderEXT"); + glad_glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC) load(userptr, "glBindLightParameterEXT"); + glad_glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC) load(userptr, "glBindMaterialParameterEXT"); + glad_glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC) load(userptr, "glBindParameterEXT"); + glad_glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC) load(userptr, "glBindTexGenParameterEXT"); + glad_glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) load(userptr, "glBindTextureUnitParameterEXT"); + glad_glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC) load(userptr, "glBindVertexShaderEXT"); + glad_glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC) load(userptr, "glDeleteVertexShaderEXT"); + glad_glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) load(userptr, "glDisableVariantClientStateEXT"); + glad_glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) load(userptr, "glEnableVariantClientStateEXT"); + glad_glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC) load(userptr, "glEndVertexShaderEXT"); + glad_glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC) load(userptr, "glExtractComponentEXT"); + glad_glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC) load(userptr, "glGenSymbolsEXT"); + glad_glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC) load(userptr, "glGenVertexShadersEXT"); + glad_glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC) load(userptr, "glGetInvariantBooleanvEXT"); + glad_glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC) load(userptr, "glGetInvariantFloatvEXT"); + glad_glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC) load(userptr, "glGetInvariantIntegervEXT"); + glad_glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) load(userptr, "glGetLocalConstantBooleanvEXT"); + glad_glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC) load(userptr, "glGetLocalConstantFloatvEXT"); + glad_glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) load(userptr, "glGetLocalConstantIntegervEXT"); + glad_glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC) load(userptr, "glGetVariantBooleanvEXT"); + glad_glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC) load(userptr, "glGetVariantFloatvEXT"); + glad_glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC) load(userptr, "glGetVariantIntegervEXT"); + glad_glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC) load(userptr, "glGetVariantPointervEXT"); + glad_glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC) load(userptr, "glInsertComponentEXT"); + glad_glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC) load(userptr, "glIsVariantEnabledEXT"); + glad_glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC) load(userptr, "glSetInvariantEXT"); + glad_glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC) load(userptr, "glSetLocalConstantEXT"); + glad_glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC) load(userptr, "glShaderOp1EXT"); + glad_glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC) load(userptr, "glShaderOp2EXT"); + glad_glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC) load(userptr, "glShaderOp3EXT"); + glad_glSwizzleEXT = (PFNGLSWIZZLEEXTPROC) load(userptr, "glSwizzleEXT"); + glad_glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC) load(userptr, "glVariantPointerEXT"); + glad_glVariantbvEXT = (PFNGLVARIANTBVEXTPROC) load(userptr, "glVariantbvEXT"); + glad_glVariantdvEXT = (PFNGLVARIANTDVEXTPROC) load(userptr, "glVariantdvEXT"); + glad_glVariantfvEXT = (PFNGLVARIANTFVEXTPROC) load(userptr, "glVariantfvEXT"); + glad_glVariantivEXT = (PFNGLVARIANTIVEXTPROC) load(userptr, "glVariantivEXT"); + glad_glVariantsvEXT = (PFNGLVARIANTSVEXTPROC) load(userptr, "glVariantsvEXT"); + glad_glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC) load(userptr, "glVariantubvEXT"); + glad_glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC) load(userptr, "glVariantuivEXT"); + glad_glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC) load(userptr, "glVariantusvEXT"); + glad_glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC) load(userptr, "glWriteMaskEXT"); +} +static void glad_gl_load_GL_EXT_vertex_weighting( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_vertex_weighting) return; + glad_glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC) load(userptr, "glVertexWeightPointerEXT"); + glad_glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC) load(userptr, "glVertexWeightfEXT"); + glad_glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC) load(userptr, "glVertexWeightfvEXT"); +} +static void glad_gl_load_GL_EXT_win32_keyed_mutex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_win32_keyed_mutex) return; + glad_glAcquireKeyedMutexWin32EXT = (PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) load(userptr, "glAcquireKeyedMutexWin32EXT"); + glad_glReleaseKeyedMutexWin32EXT = (PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) load(userptr, "glReleaseKeyedMutexWin32EXT"); +} +static void glad_gl_load_GL_EXT_window_rectangles( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_window_rectangles) return; + glad_glWindowRectanglesEXT = (PFNGLWINDOWRECTANGLESEXTPROC) load(userptr, "glWindowRectanglesEXT"); +} +static void glad_gl_load_GL_EXT_x11_sync_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_x11_sync_object) return; + glad_glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC) load(userptr, "glImportSyncEXT"); +} +static void glad_gl_load_GL_GREMEDY_frame_terminator( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_GREMEDY_frame_terminator) return; + glad_glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC) load(userptr, "glFrameTerminatorGREMEDY"); +} +static void glad_gl_load_GL_GREMEDY_string_marker( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_GREMEDY_string_marker) return; + glad_glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC) load(userptr, "glStringMarkerGREMEDY"); +} +static void glad_gl_load_GL_HP_image_transform( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_HP_image_transform) return; + glad_glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) load(userptr, "glGetImageTransformParameterfvHP"); + glad_glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) load(userptr, "glGetImageTransformParameterivHP"); + glad_glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC) load(userptr, "glImageTransformParameterfHP"); + glad_glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) load(userptr, "glImageTransformParameterfvHP"); + glad_glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC) load(userptr, "glImageTransformParameteriHP"); + glad_glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) load(userptr, "glImageTransformParameterivHP"); +} +static void glad_gl_load_GL_IBM_multimode_draw_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IBM_multimode_draw_arrays) return; + glad_glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC) load(userptr, "glMultiModeDrawArraysIBM"); + glad_glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC) load(userptr, "glMultiModeDrawElementsIBM"); +} +static void glad_gl_load_GL_IBM_static_data( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IBM_static_data) return; + glad_glFlushStaticDataIBM = (PFNGLFLUSHSTATICDATAIBMPROC) load(userptr, "glFlushStaticDataIBM"); +} +static void glad_gl_load_GL_IBM_vertex_array_lists( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IBM_vertex_array_lists) return; + glad_glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC) load(userptr, "glColorPointerListIBM"); + glad_glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC) load(userptr, "glEdgeFlagPointerListIBM"); + glad_glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC) load(userptr, "glFogCoordPointerListIBM"); + glad_glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC) load(userptr, "glIndexPointerListIBM"); + glad_glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC) load(userptr, "glNormalPointerListIBM"); + glad_glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) load(userptr, "glSecondaryColorPointerListIBM"); + glad_glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC) load(userptr, "glTexCoordPointerListIBM"); + glad_glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC) load(userptr, "glVertexPointerListIBM"); +} +static void glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INGR_blend_func_separate) return; + glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR"); +} +static void glad_gl_load_GL_INTEL_framebuffer_CMAA( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INTEL_framebuffer_CMAA) return; + glad_glApplyFramebufferAttachmentCMAAINTEL = (PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) load(userptr, "glApplyFramebufferAttachmentCMAAINTEL"); +} +static void glad_gl_load_GL_INTEL_map_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INTEL_map_texture) return; + glad_glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC) load(userptr, "glMapTexture2DINTEL"); + glad_glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC) load(userptr, "glSyncTextureINTEL"); + glad_glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC) load(userptr, "glUnmapTexture2DINTEL"); +} +static void glad_gl_load_GL_INTEL_parallel_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INTEL_parallel_arrays) return; + glad_glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC) load(userptr, "glColorPointervINTEL"); + glad_glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC) load(userptr, "glNormalPointervINTEL"); + glad_glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC) load(userptr, "glTexCoordPointervINTEL"); + glad_glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC) load(userptr, "glVertexPointervINTEL"); +} +static void glad_gl_load_GL_INTEL_performance_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INTEL_performance_query) return; + glad_glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC) load(userptr, "glBeginPerfQueryINTEL"); + glad_glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC) load(userptr, "glCreatePerfQueryINTEL"); + glad_glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC) load(userptr, "glDeletePerfQueryINTEL"); + glad_glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC) load(userptr, "glEndPerfQueryINTEL"); + glad_glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC) load(userptr, "glGetFirstPerfQueryIdINTEL"); + glad_glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC) load(userptr, "glGetNextPerfQueryIdINTEL"); + glad_glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC) load(userptr, "glGetPerfCounterInfoINTEL"); + glad_glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC) load(userptr, "glGetPerfQueryDataINTEL"); + glad_glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC) load(userptr, "glGetPerfQueryIdByNameINTEL"); + glad_glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC) load(userptr, "glGetPerfQueryInfoINTEL"); +} +static void glad_gl_load_GL_KHR_blend_equation_advanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_blend_equation_advanced) return; + glad_glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC) load(userptr, "glBlendBarrierKHR"); +} +static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_debug) return; + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageCallbackKHR = (PFNGLDEBUGMESSAGECALLBACKKHRPROC) load(userptr, "glDebugMessageCallbackKHR"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageControlKHR = (PFNGLDEBUGMESSAGECONTROLKHRPROC) load(userptr, "glDebugMessageControlKHR"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glDebugMessageInsertKHR = (PFNGLDEBUGMESSAGEINSERTKHRPROC) load(userptr, "glDebugMessageInsertKHR"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetDebugMessageLogKHR = (PFNGLGETDEBUGMESSAGELOGKHRPROC) load(userptr, "glGetDebugMessageLogKHR"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectLabelKHR = (PFNGLGETOBJECTLABELKHRPROC) load(userptr, "glGetObjectLabelKHR"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetObjectPtrLabelKHR = (PFNGLGETOBJECTPTRLABELKHRPROC) load(userptr, "glGetObjectPtrLabelKHR"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glGetPointervKHR = (PFNGLGETPOINTERVKHRPROC) load(userptr, "glGetPointervKHR"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectLabelKHR = (PFNGLOBJECTLABELKHRPROC) load(userptr, "glObjectLabelKHR"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glObjectPtrLabelKHR = (PFNGLOBJECTPTRLABELKHRPROC) load(userptr, "glObjectPtrLabelKHR"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPopDebugGroupKHR = (PFNGLPOPDEBUGGROUPKHRPROC) load(userptr, "glPopDebugGroupKHR"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + glad_glPushDebugGroupKHR = (PFNGLPUSHDEBUGGROUPKHRPROC) load(userptr, "glPushDebugGroupKHR"); +} +static void glad_gl_load_GL_KHR_parallel_shader_compile( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_parallel_shader_compile) return; + glad_glMaxShaderCompilerThreadsKHR = (PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) load(userptr, "glMaxShaderCompilerThreadsKHR"); +} +static void glad_gl_load_GL_KHR_robustness( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_robustness) return; + glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + glad_glGetGraphicsResetStatusKHR = (PFNGLGETGRAPHICSRESETSTATUSKHRPROC) load(userptr, "glGetGraphicsResetStatusKHR"); + glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + glad_glGetnUniformfvKHR = (PFNGLGETNUNIFORMFVKHRPROC) load(userptr, "glGetnUniformfvKHR"); + glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + glad_glGetnUniformivKHR = (PFNGLGETNUNIFORMIVKHRPROC) load(userptr, "glGetnUniformivKHR"); + glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + glad_glGetnUniformuivKHR = (PFNGLGETNUNIFORMUIVKHRPROC) load(userptr, "glGetnUniformuivKHR"); + glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); + glad_glReadnPixelsKHR = (PFNGLREADNPIXELSKHRPROC) load(userptr, "glReadnPixelsKHR"); +} +static void glad_gl_load_GL_MESA_framebuffer_flip_y( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_MESA_framebuffer_flip_y) return; + glad_glFramebufferParameteriMESA = (PFNGLFRAMEBUFFERPARAMETERIMESAPROC) load(userptr, "glFramebufferParameteriMESA"); + glad_glGetFramebufferParameterivMESA = (PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) load(userptr, "glGetFramebufferParameterivMESA"); +} +static void glad_gl_load_GL_MESA_resize_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_MESA_resize_buffers) return; + glad_glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC) load(userptr, "glResizeBuffersMESA"); +} +static void glad_gl_load_GL_MESA_window_pos( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_MESA_window_pos) return; + glad_glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC) load(userptr, "glWindowPos2dMESA"); + glad_glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC) load(userptr, "glWindowPos2dvMESA"); + glad_glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC) load(userptr, "glWindowPos2fMESA"); + glad_glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC) load(userptr, "glWindowPos2fvMESA"); + glad_glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC) load(userptr, "glWindowPos2iMESA"); + glad_glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC) load(userptr, "glWindowPos2ivMESA"); + glad_glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC) load(userptr, "glWindowPos2sMESA"); + glad_glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC) load(userptr, "glWindowPos2svMESA"); + glad_glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC) load(userptr, "glWindowPos3dMESA"); + glad_glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC) load(userptr, "glWindowPos3dvMESA"); + glad_glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC) load(userptr, "glWindowPos3fMESA"); + glad_glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC) load(userptr, "glWindowPos3fvMESA"); + glad_glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC) load(userptr, "glWindowPos3iMESA"); + glad_glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC) load(userptr, "glWindowPos3ivMESA"); + glad_glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC) load(userptr, "glWindowPos3sMESA"); + glad_glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC) load(userptr, "glWindowPos3svMESA"); + glad_glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC) load(userptr, "glWindowPos4dMESA"); + glad_glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC) load(userptr, "glWindowPos4dvMESA"); + glad_glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC) load(userptr, "glWindowPos4fMESA"); + glad_glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC) load(userptr, "glWindowPos4fvMESA"); + glad_glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC) load(userptr, "glWindowPos4iMESA"); + glad_glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC) load(userptr, "glWindowPos4ivMESA"); + glad_glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC) load(userptr, "glWindowPos4sMESA"); + glad_glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC) load(userptr, "glWindowPos4svMESA"); +} +static void glad_gl_load_GL_NVX_conditional_render( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NVX_conditional_render) return; + glad_glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC) load(userptr, "glBeginConditionalRenderNVX"); + glad_glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC) load(userptr, "glEndConditionalRenderNVX"); +} +static void glad_gl_load_GL_NVX_gpu_multicast2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NVX_gpu_multicast2) return; + glad_glAsyncCopyBufferSubDataNVX = (PFNGLASYNCCOPYBUFFERSUBDATANVXPROC) load(userptr, "glAsyncCopyBufferSubDataNVX"); + glad_glAsyncCopyImageSubDataNVX = (PFNGLASYNCCOPYIMAGESUBDATANVXPROC) load(userptr, "glAsyncCopyImageSubDataNVX"); + glad_glMulticastScissorArrayvNVX = (PFNGLMULTICASTSCISSORARRAYVNVXPROC) load(userptr, "glMulticastScissorArrayvNVX"); + glad_glMulticastViewportArrayvNVX = (PFNGLMULTICASTVIEWPORTARRAYVNVXPROC) load(userptr, "glMulticastViewportArrayvNVX"); + glad_glMulticastViewportPositionWScaleNVX = (PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC) load(userptr, "glMulticastViewportPositionWScaleNVX"); + glad_glUploadGpuMaskNVX = (PFNGLUPLOADGPUMASKNVXPROC) load(userptr, "glUploadGpuMaskNVX"); +} +static void glad_gl_load_GL_NVX_linked_gpu_multicast( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NVX_linked_gpu_multicast) return; + glad_glLGPUCopyImageSubDataNVX = (PFNGLLGPUCOPYIMAGESUBDATANVXPROC) load(userptr, "glLGPUCopyImageSubDataNVX"); + glad_glLGPUInterlockNVX = (PFNGLLGPUINTERLOCKNVXPROC) load(userptr, "glLGPUInterlockNVX"); + glad_glLGPUNamedBufferSubDataNVX = (PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) load(userptr, "glLGPUNamedBufferSubDataNVX"); +} +static void glad_gl_load_GL_NVX_progress_fence( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NVX_progress_fence) return; + glad_glClientWaitSemaphoreui64NVX = (PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC) load(userptr, "glClientWaitSemaphoreui64NVX"); + glad_glCreateProgressFenceNVX = (PFNGLCREATEPROGRESSFENCENVXPROC) load(userptr, "glCreateProgressFenceNVX"); + glad_glSignalSemaphoreui64NVX = (PFNGLSIGNALSEMAPHOREUI64NVXPROC) load(userptr, "glSignalSemaphoreui64NVX"); + glad_glWaitSemaphoreui64NVX = (PFNGLWAITSEMAPHOREUI64NVXPROC) load(userptr, "glWaitSemaphoreui64NVX"); +} +static void glad_gl_load_GL_NV_alpha_to_coverage_dither_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_alpha_to_coverage_dither_control) return; + glad_glAlphaToCoverageDitherControlNV = (PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC) load(userptr, "glAlphaToCoverageDitherControlNV"); +} +static void glad_gl_load_GL_NV_bindless_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_bindless_multi_draw_indirect) return; + glad_glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) load(userptr, "glMultiDrawArraysIndirectBindlessNV"); + glad_glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) load(userptr, "glMultiDrawElementsIndirectBindlessNV"); +} +static void glad_gl_load_GL_NV_bindless_multi_draw_indirect_count( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_bindless_multi_draw_indirect_count) return; + glad_glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) load(userptr, "glMultiDrawArraysIndirectBindlessCountNV"); + glad_glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) load(userptr, "glMultiDrawElementsIndirectBindlessCountNV"); +} +static void glad_gl_load_GL_NV_bindless_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_bindless_texture) return; + glad_glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC) load(userptr, "glGetImageHandleNV"); + glad_glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC) load(userptr, "glGetTextureHandleNV"); + glad_glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC) load(userptr, "glGetTextureSamplerHandleNV"); + glad_glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC) load(userptr, "glIsImageHandleResidentNV"); + glad_glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC) load(userptr, "glIsTextureHandleResidentNV"); + glad_glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) load(userptr, "glMakeImageHandleNonResidentNV"); + glad_glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) load(userptr, "glMakeImageHandleResidentNV"); + glad_glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) load(userptr, "glMakeTextureHandleNonResidentNV"); + glad_glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) load(userptr, "glMakeTextureHandleResidentNV"); + glad_glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) load(userptr, "glProgramUniformHandleui64NV"); + glad_glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) load(userptr, "glProgramUniformHandleui64vNV"); + glad_glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC) load(userptr, "glUniformHandleui64NV"); + glad_glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC) load(userptr, "glUniformHandleui64vNV"); +} +static void glad_gl_load_GL_NV_blend_equation_advanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_blend_equation_advanced) return; + glad_glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC) load(userptr, "glBlendBarrierNV"); + glad_glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC) load(userptr, "glBlendParameteriNV"); +} +static void glad_gl_load_GL_NV_clip_space_w_scaling( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_clip_space_w_scaling) return; + glad_glViewportPositionWScaleNV = (PFNGLVIEWPORTPOSITIONWSCALENVPROC) load(userptr, "glViewportPositionWScaleNV"); +} +static void glad_gl_load_GL_NV_command_list( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_command_list) return; + glad_glCallCommandListNV = (PFNGLCALLCOMMANDLISTNVPROC) load(userptr, "glCallCommandListNV"); + glad_glCommandListSegmentsNV = (PFNGLCOMMANDLISTSEGMENTSNVPROC) load(userptr, "glCommandListSegmentsNV"); + glad_glCompileCommandListNV = (PFNGLCOMPILECOMMANDLISTNVPROC) load(userptr, "glCompileCommandListNV"); + glad_glCreateCommandListsNV = (PFNGLCREATECOMMANDLISTSNVPROC) load(userptr, "glCreateCommandListsNV"); + glad_glCreateStatesNV = (PFNGLCREATESTATESNVPROC) load(userptr, "glCreateStatesNV"); + glad_glDeleteCommandListsNV = (PFNGLDELETECOMMANDLISTSNVPROC) load(userptr, "glDeleteCommandListsNV"); + glad_glDeleteStatesNV = (PFNGLDELETESTATESNVPROC) load(userptr, "glDeleteStatesNV"); + glad_glDrawCommandsAddressNV = (PFNGLDRAWCOMMANDSADDRESSNVPROC) load(userptr, "glDrawCommandsAddressNV"); + glad_glDrawCommandsNV = (PFNGLDRAWCOMMANDSNVPROC) load(userptr, "glDrawCommandsNV"); + glad_glDrawCommandsStatesAddressNV = (PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) load(userptr, "glDrawCommandsStatesAddressNV"); + glad_glDrawCommandsStatesNV = (PFNGLDRAWCOMMANDSSTATESNVPROC) load(userptr, "glDrawCommandsStatesNV"); + glad_glGetCommandHeaderNV = (PFNGLGETCOMMANDHEADERNVPROC) load(userptr, "glGetCommandHeaderNV"); + glad_glGetStageIndexNV = (PFNGLGETSTAGEINDEXNVPROC) load(userptr, "glGetStageIndexNV"); + glad_glIsCommandListNV = (PFNGLISCOMMANDLISTNVPROC) load(userptr, "glIsCommandListNV"); + glad_glIsStateNV = (PFNGLISSTATENVPROC) load(userptr, "glIsStateNV"); + glad_glListDrawCommandsStatesClientNV = (PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) load(userptr, "glListDrawCommandsStatesClientNV"); + glad_glStateCaptureNV = (PFNGLSTATECAPTURENVPROC) load(userptr, "glStateCaptureNV"); +} +static void glad_gl_load_GL_NV_conditional_render( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_conditional_render) return; + glad_glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC) load(userptr, "glBeginConditionalRenderNV"); + glad_glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC) load(userptr, "glEndConditionalRenderNV"); +} +static void glad_gl_load_GL_NV_conservative_raster( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_conservative_raster) return; + glad_glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC) load(userptr, "glSubpixelPrecisionBiasNV"); +} +static void glad_gl_load_GL_NV_conservative_raster_dilate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_conservative_raster_dilate) return; + glad_glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) load(userptr, "glConservativeRasterParameterfNV"); +} +static void glad_gl_load_GL_NV_conservative_raster_pre_snap_triangles( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_conservative_raster_pre_snap_triangles) return; + glad_glConservativeRasterParameteriNV = (PFNGLCONSERVATIVERASTERPARAMETERINVPROC) load(userptr, "glConservativeRasterParameteriNV"); +} +static void glad_gl_load_GL_NV_copy_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_copy_image) return; + glad_glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC) load(userptr, "glCopyImageSubDataNV"); +} +static void glad_gl_load_GL_NV_depth_buffer_float( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_depth_buffer_float) return; + glad_glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC) load(userptr, "glClearDepthdNV"); + glad_glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC) load(userptr, "glDepthBoundsdNV"); + glad_glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC) load(userptr, "glDepthRangedNV"); +} +static void glad_gl_load_GL_NV_draw_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_draw_texture) return; + glad_glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC) load(userptr, "glDrawTextureNV"); +} +static void glad_gl_load_GL_NV_draw_vulkan_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_draw_vulkan_image) return; + glad_glDrawVkImageNV = (PFNGLDRAWVKIMAGENVPROC) load(userptr, "glDrawVkImageNV"); + glad_glGetVkProcAddrNV = (PFNGLGETVKPROCADDRNVPROC) load(userptr, "glGetVkProcAddrNV"); + glad_glSignalVkFenceNV = (PFNGLSIGNALVKFENCENVPROC) load(userptr, "glSignalVkFenceNV"); + glad_glSignalVkSemaphoreNV = (PFNGLSIGNALVKSEMAPHORENVPROC) load(userptr, "glSignalVkSemaphoreNV"); + glad_glWaitVkSemaphoreNV = (PFNGLWAITVKSEMAPHORENVPROC) load(userptr, "glWaitVkSemaphoreNV"); +} +static void glad_gl_load_GL_NV_evaluators( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_evaluators) return; + glad_glEvalMapsNV = (PFNGLEVALMAPSNVPROC) load(userptr, "glEvalMapsNV"); + glad_glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC) load(userptr, "glGetMapAttribParameterfvNV"); + glad_glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC) load(userptr, "glGetMapAttribParameterivNV"); + glad_glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC) load(userptr, "glGetMapControlPointsNV"); + glad_glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC) load(userptr, "glGetMapParameterfvNV"); + glad_glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC) load(userptr, "glGetMapParameterivNV"); + glad_glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC) load(userptr, "glMapControlPointsNV"); + glad_glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC) load(userptr, "glMapParameterfvNV"); + glad_glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC) load(userptr, "glMapParameterivNV"); +} +static void glad_gl_load_GL_NV_explicit_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_explicit_multisample) return; + glad_glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC) load(userptr, "glGetMultisamplefvNV"); + glad_glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC) load(userptr, "glSampleMaskIndexedNV"); + glad_glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC) load(userptr, "glTexRenderbufferNV"); +} +static void glad_gl_load_GL_NV_fence( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_fence) return; + glad_glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC) load(userptr, "glDeleteFencesNV"); + glad_glFinishFenceNV = (PFNGLFINISHFENCENVPROC) load(userptr, "glFinishFenceNV"); + glad_glGenFencesNV = (PFNGLGENFENCESNVPROC) load(userptr, "glGenFencesNV"); + glad_glGetFenceivNV = (PFNGLGETFENCEIVNVPROC) load(userptr, "glGetFenceivNV"); + glad_glIsFenceNV = (PFNGLISFENCENVPROC) load(userptr, "glIsFenceNV"); + glad_glSetFenceNV = (PFNGLSETFENCENVPROC) load(userptr, "glSetFenceNV"); + glad_glTestFenceNV = (PFNGLTESTFENCENVPROC) load(userptr, "glTestFenceNV"); +} +static void glad_gl_load_GL_NV_fragment_coverage_to_color( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_fragment_coverage_to_color) return; + glad_glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC) load(userptr, "glFragmentCoverageColorNV"); +} +static void glad_gl_load_GL_NV_fragment_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_fragment_program) return; + glad_glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) load(userptr, "glGetProgramNamedParameterdvNV"); + glad_glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) load(userptr, "glGetProgramNamedParameterfvNV"); + glad_glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) load(userptr, "glProgramNamedParameter4dNV"); + glad_glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) load(userptr, "glProgramNamedParameter4dvNV"); + glad_glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) load(userptr, "glProgramNamedParameter4fNV"); + glad_glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) load(userptr, "glProgramNamedParameter4fvNV"); +} +static void glad_gl_load_GL_NV_framebuffer_mixed_samples( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_framebuffer_mixed_samples) return; + glad_glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC) load(userptr, "glCoverageModulationNV"); + glad_glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC) load(userptr, "glCoverageModulationTableNV"); + glad_glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC) load(userptr, "glGetCoverageModulationTableNV"); + glad_glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC) load(userptr, "glRasterSamplesEXT"); +} +static void glad_gl_load_GL_NV_framebuffer_multisample_coverage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_framebuffer_multisample_coverage) return; + glad_glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) load(userptr, "glRenderbufferStorageMultisampleCoverageNV"); +} +static void glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_geometry_program4) return; + glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT"); + glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT"); + glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); + glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV"); +} +static void glad_gl_load_GL_NV_gpu_multicast( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_gpu_multicast) return; + glad_glMulticastBarrierNV = (PFNGLMULTICASTBARRIERNVPROC) load(userptr, "glMulticastBarrierNV"); + glad_glMulticastBlitFramebufferNV = (PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) load(userptr, "glMulticastBlitFramebufferNV"); + glad_glMulticastBufferSubDataNV = (PFNGLMULTICASTBUFFERSUBDATANVPROC) load(userptr, "glMulticastBufferSubDataNV"); + glad_glMulticastCopyBufferSubDataNV = (PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) load(userptr, "glMulticastCopyBufferSubDataNV"); + glad_glMulticastCopyImageSubDataNV = (PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) load(userptr, "glMulticastCopyImageSubDataNV"); + glad_glMulticastFramebufferSampleLocationsfvNV = (PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) load(userptr, "glMulticastFramebufferSampleLocationsfvNV"); + glad_glMulticastGetQueryObjecti64vNV = (PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) load(userptr, "glMulticastGetQueryObjecti64vNV"); + glad_glMulticastGetQueryObjectivNV = (PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) load(userptr, "glMulticastGetQueryObjectivNV"); + glad_glMulticastGetQueryObjectui64vNV = (PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) load(userptr, "glMulticastGetQueryObjectui64vNV"); + glad_glMulticastGetQueryObjectuivNV = (PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) load(userptr, "glMulticastGetQueryObjectuivNV"); + glad_glMulticastWaitSyncNV = (PFNGLMULTICASTWAITSYNCNVPROC) load(userptr, "glMulticastWaitSyncNV"); + glad_glRenderGpuMaskNV = (PFNGLRENDERGPUMASKNVPROC) load(userptr, "glRenderGpuMaskNV"); +} +static void glad_gl_load_GL_NV_gpu_program4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_gpu_program4) return; + glad_glGetProgramEnvParameterIivNV = (PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) load(userptr, "glGetProgramEnvParameterIivNV"); + glad_glGetProgramEnvParameterIuivNV = (PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) load(userptr, "glGetProgramEnvParameterIuivNV"); + glad_glGetProgramLocalParameterIivNV = (PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) load(userptr, "glGetProgramLocalParameterIivNV"); + glad_glGetProgramLocalParameterIuivNV = (PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) load(userptr, "glGetProgramLocalParameterIuivNV"); + glad_glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC) load(userptr, "glProgramEnvParameterI4iNV"); + glad_glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC) load(userptr, "glProgramEnvParameterI4ivNV"); + glad_glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC) load(userptr, "glProgramEnvParameterI4uiNV"); + glad_glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) load(userptr, "glProgramEnvParameterI4uivNV"); + glad_glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) load(userptr, "glProgramEnvParametersI4ivNV"); + glad_glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) load(userptr, "glProgramEnvParametersI4uivNV"); + glad_glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC) load(userptr, "glProgramLocalParameterI4iNV"); + glad_glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) load(userptr, "glProgramLocalParameterI4ivNV"); + glad_glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) load(userptr, "glProgramLocalParameterI4uiNV"); + glad_glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) load(userptr, "glProgramLocalParameterI4uivNV"); + glad_glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) load(userptr, "glProgramLocalParametersI4ivNV"); + glad_glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) load(userptr, "glProgramLocalParametersI4uivNV"); +} +static void glad_gl_load_GL_NV_gpu_program5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_gpu_program5) return; + glad_glGetProgramSubroutineParameteruivNV = (PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) load(userptr, "glGetProgramSubroutineParameteruivNV"); + glad_glProgramSubroutineParametersuivNV = (PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) load(userptr, "glProgramSubroutineParametersuivNV"); +} +static void glad_gl_load_GL_NV_gpu_shader5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_gpu_shader5) return; + glad_glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC) load(userptr, "glGetUniformi64vNV"); + glad_glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC) load(userptr, "glProgramUniform1i64NV"); + glad_glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC) load(userptr, "glProgramUniform1i64vNV"); + glad_glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC) load(userptr, "glProgramUniform1ui64NV"); + glad_glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC) load(userptr, "glProgramUniform1ui64vNV"); + glad_glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC) load(userptr, "glProgramUniform2i64NV"); + glad_glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC) load(userptr, "glProgramUniform2i64vNV"); + glad_glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC) load(userptr, "glProgramUniform2ui64NV"); + glad_glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC) load(userptr, "glProgramUniform2ui64vNV"); + glad_glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC) load(userptr, "glProgramUniform3i64NV"); + glad_glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC) load(userptr, "glProgramUniform3i64vNV"); + glad_glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC) load(userptr, "glProgramUniform3ui64NV"); + glad_glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC) load(userptr, "glProgramUniform3ui64vNV"); + glad_glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC) load(userptr, "glProgramUniform4i64NV"); + glad_glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC) load(userptr, "glProgramUniform4i64vNV"); + glad_glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC) load(userptr, "glProgramUniform4ui64NV"); + glad_glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC) load(userptr, "glProgramUniform4ui64vNV"); + glad_glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC) load(userptr, "glUniform1i64NV"); + glad_glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC) load(userptr, "glUniform1i64vNV"); + glad_glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC) load(userptr, "glUniform1ui64NV"); + glad_glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC) load(userptr, "glUniform1ui64vNV"); + glad_glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC) load(userptr, "glUniform2i64NV"); + glad_glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC) load(userptr, "glUniform2i64vNV"); + glad_glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC) load(userptr, "glUniform2ui64NV"); + glad_glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC) load(userptr, "glUniform2ui64vNV"); + glad_glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC) load(userptr, "glUniform3i64NV"); + glad_glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC) load(userptr, "glUniform3i64vNV"); + glad_glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC) load(userptr, "glUniform3ui64NV"); + glad_glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC) load(userptr, "glUniform3ui64vNV"); + glad_glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC) load(userptr, "glUniform4i64NV"); + glad_glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC) load(userptr, "glUniform4i64vNV"); + glad_glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC) load(userptr, "glUniform4ui64NV"); + glad_glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC) load(userptr, "glUniform4ui64vNV"); +} +static void glad_gl_load_GL_NV_half_float( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_half_float) return; + glad_glColor3hNV = (PFNGLCOLOR3HNVPROC) load(userptr, "glColor3hNV"); + glad_glColor3hvNV = (PFNGLCOLOR3HVNVPROC) load(userptr, "glColor3hvNV"); + glad_glColor4hNV = (PFNGLCOLOR4HNVPROC) load(userptr, "glColor4hNV"); + glad_glColor4hvNV = (PFNGLCOLOR4HVNVPROC) load(userptr, "glColor4hvNV"); + glad_glFogCoordhNV = (PFNGLFOGCOORDHNVPROC) load(userptr, "glFogCoordhNV"); + glad_glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC) load(userptr, "glFogCoordhvNV"); + glad_glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC) load(userptr, "glMultiTexCoord1hNV"); + glad_glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC) load(userptr, "glMultiTexCoord1hvNV"); + glad_glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC) load(userptr, "glMultiTexCoord2hNV"); + glad_glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC) load(userptr, "glMultiTexCoord2hvNV"); + glad_glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC) load(userptr, "glMultiTexCoord3hNV"); + glad_glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC) load(userptr, "glMultiTexCoord3hvNV"); + glad_glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC) load(userptr, "glMultiTexCoord4hNV"); + glad_glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC) load(userptr, "glMultiTexCoord4hvNV"); + glad_glNormal3hNV = (PFNGLNORMAL3HNVPROC) load(userptr, "glNormal3hNV"); + glad_glNormal3hvNV = (PFNGLNORMAL3HVNVPROC) load(userptr, "glNormal3hvNV"); + glad_glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC) load(userptr, "glSecondaryColor3hNV"); + glad_glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC) load(userptr, "glSecondaryColor3hvNV"); + glad_glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC) load(userptr, "glTexCoord1hNV"); + glad_glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC) load(userptr, "glTexCoord1hvNV"); + glad_glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC) load(userptr, "glTexCoord2hNV"); + glad_glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC) load(userptr, "glTexCoord2hvNV"); + glad_glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC) load(userptr, "glTexCoord3hNV"); + glad_glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC) load(userptr, "glTexCoord3hvNV"); + glad_glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC) load(userptr, "glTexCoord4hNV"); + glad_glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC) load(userptr, "glTexCoord4hvNV"); + glad_glVertex2hNV = (PFNGLVERTEX2HNVPROC) load(userptr, "glVertex2hNV"); + glad_glVertex2hvNV = (PFNGLVERTEX2HVNVPROC) load(userptr, "glVertex2hvNV"); + glad_glVertex3hNV = (PFNGLVERTEX3HNVPROC) load(userptr, "glVertex3hNV"); + glad_glVertex3hvNV = (PFNGLVERTEX3HVNVPROC) load(userptr, "glVertex3hvNV"); + glad_glVertex4hNV = (PFNGLVERTEX4HNVPROC) load(userptr, "glVertex4hNV"); + glad_glVertex4hvNV = (PFNGLVERTEX4HVNVPROC) load(userptr, "glVertex4hvNV"); + glad_glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC) load(userptr, "glVertexAttrib1hNV"); + glad_glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC) load(userptr, "glVertexAttrib1hvNV"); + glad_glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC) load(userptr, "glVertexAttrib2hNV"); + glad_glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC) load(userptr, "glVertexAttrib2hvNV"); + glad_glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC) load(userptr, "glVertexAttrib3hNV"); + glad_glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC) load(userptr, "glVertexAttrib3hvNV"); + glad_glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC) load(userptr, "glVertexAttrib4hNV"); + glad_glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC) load(userptr, "glVertexAttrib4hvNV"); + glad_glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC) load(userptr, "glVertexAttribs1hvNV"); + glad_glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC) load(userptr, "glVertexAttribs2hvNV"); + glad_glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC) load(userptr, "glVertexAttribs3hvNV"); + glad_glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC) load(userptr, "glVertexAttribs4hvNV"); + glad_glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC) load(userptr, "glVertexWeighthNV"); + glad_glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC) load(userptr, "glVertexWeighthvNV"); +} +static void glad_gl_load_GL_NV_internalformat_sample_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_internalformat_sample_query) return; + glad_glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) load(userptr, "glGetInternalformatSampleivNV"); +} +static void glad_gl_load_GL_NV_memory_attachment( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_memory_attachment) return; + glad_glBufferAttachMemoryNV = (PFNGLBUFFERATTACHMEMORYNVPROC) load(userptr, "glBufferAttachMemoryNV"); + glad_glGetMemoryObjectDetachedResourcesuivNV = (PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) load(userptr, "glGetMemoryObjectDetachedResourcesuivNV"); + glad_glNamedBufferAttachMemoryNV = (PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) load(userptr, "glNamedBufferAttachMemoryNV"); + glad_glResetMemoryObjectParameterNV = (PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) load(userptr, "glResetMemoryObjectParameterNV"); + glad_glTexAttachMemoryNV = (PFNGLTEXATTACHMEMORYNVPROC) load(userptr, "glTexAttachMemoryNV"); + glad_glTextureAttachMemoryNV = (PFNGLTEXTUREATTACHMEMORYNVPROC) load(userptr, "glTextureAttachMemoryNV"); +} +static void glad_gl_load_GL_NV_memory_object_sparse( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_memory_object_sparse) return; + glad_glBufferPageCommitmentMemNV = (PFNGLBUFFERPAGECOMMITMENTMEMNVPROC) load(userptr, "glBufferPageCommitmentMemNV"); + glad_glNamedBufferPageCommitmentMemNV = (PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC) load(userptr, "glNamedBufferPageCommitmentMemNV"); + glad_glTexPageCommitmentMemNV = (PFNGLTEXPAGECOMMITMENTMEMNVPROC) load(userptr, "glTexPageCommitmentMemNV"); + glad_glTexturePageCommitmentMemNV = (PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC) load(userptr, "glTexturePageCommitmentMemNV"); +} +static void glad_gl_load_GL_NV_mesh_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_mesh_shader) return; + glad_glDrawMeshTasksIndirectNV = (PFNGLDRAWMESHTASKSINDIRECTNVPROC) load(userptr, "glDrawMeshTasksIndirectNV"); + glad_glDrawMeshTasksNV = (PFNGLDRAWMESHTASKSNVPROC) load(userptr, "glDrawMeshTasksNV"); + glad_glMultiDrawMeshTasksIndirectCountNV = (PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) load(userptr, "glMultiDrawMeshTasksIndirectCountNV"); + glad_glMultiDrawMeshTasksIndirectNV = (PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) load(userptr, "glMultiDrawMeshTasksIndirectNV"); +} +static void glad_gl_load_GL_NV_occlusion_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_occlusion_query) return; + glad_glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC) load(userptr, "glBeginOcclusionQueryNV"); + glad_glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC) load(userptr, "glDeleteOcclusionQueriesNV"); + glad_glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC) load(userptr, "glEndOcclusionQueryNV"); + glad_glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC) load(userptr, "glGenOcclusionQueriesNV"); + glad_glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC) load(userptr, "glGetOcclusionQueryivNV"); + glad_glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC) load(userptr, "glGetOcclusionQueryuivNV"); + glad_glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC) load(userptr, "glIsOcclusionQueryNV"); +} +static void glad_gl_load_GL_NV_parameter_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_parameter_buffer_object) return; + glad_glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) load(userptr, "glProgramBufferParametersIivNV"); + glad_glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) load(userptr, "glProgramBufferParametersIuivNV"); + glad_glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) load(userptr, "glProgramBufferParametersfvNV"); +} +static void glad_gl_load_GL_NV_path_rendering( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_path_rendering) return; + glad_glCopyPathNV = (PFNGLCOPYPATHNVPROC) load(userptr, "glCopyPathNV"); + glad_glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC) load(userptr, "glCoverFillPathInstancedNV"); + glad_glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC) load(userptr, "glCoverFillPathNV"); + glad_glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) load(userptr, "glCoverStrokePathInstancedNV"); + glad_glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC) load(userptr, "glCoverStrokePathNV"); + glad_glDeletePathsNV = (PFNGLDELETEPATHSNVPROC) load(userptr, "glDeletePathsNV"); + glad_glGenPathsNV = (PFNGLGENPATHSNVPROC) load(userptr, "glGenPathsNV"); + glad_glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC) load(userptr, "glGetPathColorGenfvNV"); + glad_glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC) load(userptr, "glGetPathColorGenivNV"); + glad_glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC) load(userptr, "glGetPathCommandsNV"); + glad_glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC) load(userptr, "glGetPathCoordsNV"); + glad_glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC) load(userptr, "glGetPathDashArrayNV"); + glad_glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC) load(userptr, "glGetPathLengthNV"); + glad_glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC) load(userptr, "glGetPathMetricRangeNV"); + glad_glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC) load(userptr, "glGetPathMetricsNV"); + glad_glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC) load(userptr, "glGetPathParameterfvNV"); + glad_glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC) load(userptr, "glGetPathParameterivNV"); + glad_glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC) load(userptr, "glGetPathSpacingNV"); + glad_glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC) load(userptr, "glGetPathTexGenfvNV"); + glad_glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC) load(userptr, "glGetPathTexGenivNV"); + glad_glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC) load(userptr, "glGetProgramResourcefvNV"); + glad_glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC) load(userptr, "glInterpolatePathsNV"); + glad_glIsPathNV = (PFNGLISPATHNVPROC) load(userptr, "glIsPathNV"); + glad_glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC) load(userptr, "glIsPointInFillPathNV"); + glad_glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC) load(userptr, "glIsPointInStrokePathNV"); + glad_glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC) load(userptr, "glMatrixFrustumEXT"); + glad_glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC) load(userptr, "glMatrixLoad3x2fNV"); + glad_glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC) load(userptr, "glMatrixLoad3x3fNV"); + glad_glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC) load(userptr, "glMatrixLoadIdentityEXT"); + glad_glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) load(userptr, "glMatrixLoadTranspose3x3fNV"); + glad_glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC) load(userptr, "glMatrixLoadTransposedEXT"); + glad_glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC) load(userptr, "glMatrixLoadTransposefEXT"); + glad_glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC) load(userptr, "glMatrixLoaddEXT"); + glad_glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC) load(userptr, "glMatrixLoadfEXT"); + glad_glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC) load(userptr, "glMatrixMult3x2fNV"); + glad_glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC) load(userptr, "glMatrixMult3x3fNV"); + glad_glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) load(userptr, "glMatrixMultTranspose3x3fNV"); + glad_glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC) load(userptr, "glMatrixMultTransposedEXT"); + glad_glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC) load(userptr, "glMatrixMultTransposefEXT"); + glad_glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC) load(userptr, "glMatrixMultdEXT"); + glad_glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC) load(userptr, "glMatrixMultfEXT"); + glad_glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC) load(userptr, "glMatrixOrthoEXT"); + glad_glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC) load(userptr, "glMatrixPopEXT"); + glad_glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC) load(userptr, "glMatrixPushEXT"); + glad_glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC) load(userptr, "glMatrixRotatedEXT"); + glad_glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC) load(userptr, "glMatrixRotatefEXT"); + glad_glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC) load(userptr, "glMatrixScaledEXT"); + glad_glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC) load(userptr, "glMatrixScalefEXT"); + glad_glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC) load(userptr, "glMatrixTranslatedEXT"); + glad_glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC) load(userptr, "glMatrixTranslatefEXT"); + glad_glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC) load(userptr, "glPathColorGenNV"); + glad_glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC) load(userptr, "glPathCommandsNV"); + glad_glPathCoordsNV = (PFNGLPATHCOORDSNVPROC) load(userptr, "glPathCoordsNV"); + glad_glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC) load(userptr, "glPathCoverDepthFuncNV"); + glad_glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC) load(userptr, "glPathDashArrayNV"); + glad_glPathFogGenNV = (PFNGLPATHFOGGENNVPROC) load(userptr, "glPathFogGenNV"); + glad_glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC) load(userptr, "glPathGlyphIndexArrayNV"); + glad_glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC) load(userptr, "glPathGlyphIndexRangeNV"); + glad_glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC) load(userptr, "glPathGlyphRangeNV"); + glad_glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC) load(userptr, "glPathGlyphsNV"); + glad_glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) load(userptr, "glPathMemoryGlyphIndexArrayNV"); + glad_glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC) load(userptr, "glPathParameterfNV"); + glad_glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC) load(userptr, "glPathParameterfvNV"); + glad_glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC) load(userptr, "glPathParameteriNV"); + glad_glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC) load(userptr, "glPathParameterivNV"); + glad_glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC) load(userptr, "glPathStencilDepthOffsetNV"); + glad_glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC) load(userptr, "glPathStencilFuncNV"); + glad_glPathStringNV = (PFNGLPATHSTRINGNVPROC) load(userptr, "glPathStringNV"); + glad_glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC) load(userptr, "glPathSubCommandsNV"); + glad_glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC) load(userptr, "glPathSubCoordsNV"); + glad_glPathTexGenNV = (PFNGLPATHTEXGENNVPROC) load(userptr, "glPathTexGenNV"); + glad_glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC) load(userptr, "glPointAlongPathNV"); + glad_glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) load(userptr, "glProgramPathFragmentInputGenNV"); + glad_glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC) load(userptr, "glStencilFillPathInstancedNV"); + glad_glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC) load(userptr, "glStencilFillPathNV"); + glad_glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) load(userptr, "glStencilStrokePathInstancedNV"); + glad_glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC) load(userptr, "glStencilStrokePathNV"); + glad_glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) load(userptr, "glStencilThenCoverFillPathInstancedNV"); + glad_glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC) load(userptr, "glStencilThenCoverFillPathNV"); + glad_glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) load(userptr, "glStencilThenCoverStrokePathInstancedNV"); + glad_glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) load(userptr, "glStencilThenCoverStrokePathNV"); + glad_glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC) load(userptr, "glTransformPathNV"); + glad_glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC) load(userptr, "glWeightPathsNV"); +} +static void glad_gl_load_GL_NV_pixel_data_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_pixel_data_range) return; + glad_glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC) load(userptr, "glFlushPixelDataRangeNV"); + glad_glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC) load(userptr, "glPixelDataRangeNV"); +} +static void glad_gl_load_GL_NV_point_sprite( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_point_sprite) return; + glad_glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC) load(userptr, "glPointParameteriNV"); + glad_glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC) load(userptr, "glPointParameterivNV"); +} +static void glad_gl_load_GL_NV_present_video( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_present_video) return; + glad_glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC) load(userptr, "glGetVideoi64vNV"); + glad_glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC) load(userptr, "glGetVideoivNV"); + glad_glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC) load(userptr, "glGetVideoui64vNV"); + glad_glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC) load(userptr, "glGetVideouivNV"); + glad_glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC) load(userptr, "glPresentFrameDualFillNV"); + glad_glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC) load(userptr, "glPresentFrameKeyedNV"); +} +static void glad_gl_load_GL_NV_primitive_restart( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_primitive_restart) return; + glad_glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC) load(userptr, "glPrimitiveRestartIndexNV"); + glad_glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC) load(userptr, "glPrimitiveRestartNV"); +} +static void glad_gl_load_GL_NV_query_resource( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_query_resource) return; + glad_glQueryResourceNV = (PFNGLQUERYRESOURCENVPROC) load(userptr, "glQueryResourceNV"); +} +static void glad_gl_load_GL_NV_query_resource_tag( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_query_resource_tag) return; + glad_glDeleteQueryResourceTagNV = (PFNGLDELETEQUERYRESOURCETAGNVPROC) load(userptr, "glDeleteQueryResourceTagNV"); + glad_glGenQueryResourceTagNV = (PFNGLGENQUERYRESOURCETAGNVPROC) load(userptr, "glGenQueryResourceTagNV"); + glad_glQueryResourceTagNV = (PFNGLQUERYRESOURCETAGNVPROC) load(userptr, "glQueryResourceTagNV"); +} +static void glad_gl_load_GL_NV_register_combiners( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_register_combiners) return; + glad_glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC) load(userptr, "glCombinerInputNV"); + glad_glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC) load(userptr, "glCombinerOutputNV"); + glad_glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC) load(userptr, "glCombinerParameterfNV"); + glad_glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC) load(userptr, "glCombinerParameterfvNV"); + glad_glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC) load(userptr, "glCombinerParameteriNV"); + glad_glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC) load(userptr, "glCombinerParameterivNV"); + glad_glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC) load(userptr, "glFinalCombinerInputNV"); + glad_glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) load(userptr, "glGetCombinerInputParameterfvNV"); + glad_glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) load(userptr, "glGetCombinerInputParameterivNV"); + glad_glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) load(userptr, "glGetCombinerOutputParameterfvNV"); + glad_glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) load(userptr, "glGetCombinerOutputParameterivNV"); + glad_glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) load(userptr, "glGetFinalCombinerInputParameterfvNV"); + glad_glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) load(userptr, "glGetFinalCombinerInputParameterivNV"); +} +static void glad_gl_load_GL_NV_register_combiners2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_register_combiners2) return; + glad_glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) load(userptr, "glCombinerStageParameterfvNV"); + glad_glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) load(userptr, "glGetCombinerStageParameterfvNV"); +} +static void glad_gl_load_GL_NV_sample_locations( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_sample_locations) return; + glad_glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) load(userptr, "glFramebufferSampleLocationsfvNV"); + glad_glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) load(userptr, "glNamedFramebufferSampleLocationsfvNV"); + glad_glResolveDepthValuesNV = (PFNGLRESOLVEDEPTHVALUESNVPROC) load(userptr, "glResolveDepthValuesNV"); +} +static void glad_gl_load_GL_NV_scissor_exclusive( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_scissor_exclusive) return; + glad_glScissorExclusiveArrayvNV = (PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) load(userptr, "glScissorExclusiveArrayvNV"); + glad_glScissorExclusiveNV = (PFNGLSCISSOREXCLUSIVENVPROC) load(userptr, "glScissorExclusiveNV"); +} +static void glad_gl_load_GL_NV_shader_buffer_load( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_shader_buffer_load) return; + glad_glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC) load(userptr, "glGetBufferParameterui64vNV"); + glad_glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC) load(userptr, "glGetIntegerui64vNV"); + glad_glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) load(userptr, "glGetNamedBufferParameterui64vNV"); + glad_glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC) load(userptr, "glGetUniformui64vNV"); + glad_glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC) load(userptr, "glIsBufferResidentNV"); + glad_glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC) load(userptr, "glIsNamedBufferResidentNV"); + glad_glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC) load(userptr, "glMakeBufferNonResidentNV"); + glad_glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC) load(userptr, "glMakeBufferResidentNV"); + glad_glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) load(userptr, "glMakeNamedBufferNonResidentNV"); + glad_glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) load(userptr, "glMakeNamedBufferResidentNV"); + glad_glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC) load(userptr, "glProgramUniformui64NV"); + glad_glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC) load(userptr, "glProgramUniformui64vNV"); + glad_glUniformui64NV = (PFNGLUNIFORMUI64NVPROC) load(userptr, "glUniformui64NV"); + glad_glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC) load(userptr, "glUniformui64vNV"); +} +static void glad_gl_load_GL_NV_shading_rate_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_shading_rate_image) return; + glad_glBindShadingRateImageNV = (PFNGLBINDSHADINGRATEIMAGENVPROC) load(userptr, "glBindShadingRateImageNV"); + glad_glGetShadingRateImagePaletteNV = (PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) load(userptr, "glGetShadingRateImagePaletteNV"); + glad_glGetShadingRateSampleLocationivNV = (PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) load(userptr, "glGetShadingRateSampleLocationivNV"); + glad_glShadingRateImageBarrierNV = (PFNGLSHADINGRATEIMAGEBARRIERNVPROC) load(userptr, "glShadingRateImageBarrierNV"); + glad_glShadingRateImagePaletteNV = (PFNGLSHADINGRATEIMAGEPALETTENVPROC) load(userptr, "glShadingRateImagePaletteNV"); + glad_glShadingRateSampleOrderCustomNV = (PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) load(userptr, "glShadingRateSampleOrderCustomNV"); + glad_glShadingRateSampleOrderNV = (PFNGLSHADINGRATESAMPLEORDERNVPROC) load(userptr, "glShadingRateSampleOrderNV"); +} +static void glad_gl_load_GL_NV_texture_barrier( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_texture_barrier) return; + glad_glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC) load(userptr, "glTextureBarrierNV"); +} +static void glad_gl_load_GL_NV_texture_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_texture_multisample) return; + glad_glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) load(userptr, "glTexImage2DMultisampleCoverageNV"); + glad_glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) load(userptr, "glTexImage3DMultisampleCoverageNV"); + glad_glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) load(userptr, "glTextureImage2DMultisampleCoverageNV"); + glad_glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) load(userptr, "glTextureImage2DMultisampleNV"); + glad_glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) load(userptr, "glTextureImage3DMultisampleCoverageNV"); + glad_glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) load(userptr, "glTextureImage3DMultisampleNV"); +} +static void glad_gl_load_GL_NV_timeline_semaphore( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_timeline_semaphore) return; + glad_glCreateSemaphoresNV = (PFNGLCREATESEMAPHORESNVPROC) load(userptr, "glCreateSemaphoresNV"); + glad_glGetSemaphoreParameterivNV = (PFNGLGETSEMAPHOREPARAMETERIVNVPROC) load(userptr, "glGetSemaphoreParameterivNV"); + glad_glSemaphoreParameterivNV = (PFNGLSEMAPHOREPARAMETERIVNVPROC) load(userptr, "glSemaphoreParameterivNV"); +} +static void glad_gl_load_GL_NV_transform_feedback( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_transform_feedback) return; + glad_glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC) load(userptr, "glActiveVaryingNV"); + glad_glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC) load(userptr, "glBeginTransformFeedbackNV"); + glad_glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC) load(userptr, "glBindBufferBaseNV"); + glad_glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC) load(userptr, "glBindBufferOffsetNV"); + glad_glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC) load(userptr, "glBindBufferRangeNV"); + glad_glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC) load(userptr, "glEndTransformFeedbackNV"); + glad_glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC) load(userptr, "glGetActiveVaryingNV"); + glad_glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) load(userptr, "glGetTransformFeedbackVaryingNV"); + glad_glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC) load(userptr, "glGetVaryingLocationNV"); + glad_glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) load(userptr, "glTransformFeedbackAttribsNV"); + glad_glTransformFeedbackStreamAttribsNV = (PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) load(userptr, "glTransformFeedbackStreamAttribsNV"); + glad_glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) load(userptr, "glTransformFeedbackVaryingsNV"); +} +static void glad_gl_load_GL_NV_transform_feedback2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_transform_feedback2) return; + glad_glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC) load(userptr, "glBindTransformFeedbackNV"); + glad_glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC) load(userptr, "glDeleteTransformFeedbacksNV"); + glad_glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC) load(userptr, "glDrawTransformFeedbackNV"); + glad_glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC) load(userptr, "glGenTransformFeedbacksNV"); + glad_glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC) load(userptr, "glIsTransformFeedbackNV"); + glad_glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC) load(userptr, "glPauseTransformFeedbackNV"); + glad_glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC) load(userptr, "glResumeTransformFeedbackNV"); +} +static void glad_gl_load_GL_NV_vdpau_interop( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vdpau_interop) return; + glad_glVDPAUFiniNV = (PFNGLVDPAUFININVPROC) load(userptr, "glVDPAUFiniNV"); + glad_glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC) load(userptr, "glVDPAUGetSurfaceivNV"); + glad_glVDPAUInitNV = (PFNGLVDPAUINITNVPROC) load(userptr, "glVDPAUInitNV"); + glad_glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC) load(userptr, "glVDPAUIsSurfaceNV"); + glad_glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC) load(userptr, "glVDPAUMapSurfacesNV"); + glad_glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) load(userptr, "glVDPAURegisterOutputSurfaceNV"); + glad_glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) load(userptr, "glVDPAURegisterVideoSurfaceNV"); + glad_glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC) load(userptr, "glVDPAUSurfaceAccessNV"); + glad_glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC) load(userptr, "glVDPAUUnmapSurfacesNV"); + glad_glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC) load(userptr, "glVDPAUUnregisterSurfaceNV"); +} +static void glad_gl_load_GL_NV_vdpau_interop2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vdpau_interop2) return; + glad_glVDPAURegisterVideoSurfaceWithPictureStructureNV = (PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC) load(userptr, "glVDPAURegisterVideoSurfaceWithPictureStructureNV"); +} +static void glad_gl_load_GL_NV_vertex_array_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_array_range) return; + glad_glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC) load(userptr, "glFlushVertexArrayRangeNV"); + glad_glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC) load(userptr, "glVertexArrayRangeNV"); +} +static void glad_gl_load_GL_NV_vertex_attrib_integer_64bit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_attrib_integer_64bit) return; + glad_glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC) load(userptr, "glGetVertexAttribLi64vNV"); + glad_glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC) load(userptr, "glGetVertexAttribLui64vNV"); + glad_glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC) load(userptr, "glVertexAttribL1i64NV"); + glad_glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC) load(userptr, "glVertexAttribL1i64vNV"); + glad_glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC) load(userptr, "glVertexAttribL1ui64NV"); + glad_glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC) load(userptr, "glVertexAttribL1ui64vNV"); + glad_glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC) load(userptr, "glVertexAttribL2i64NV"); + glad_glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC) load(userptr, "glVertexAttribL2i64vNV"); + glad_glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC) load(userptr, "glVertexAttribL2ui64NV"); + glad_glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC) load(userptr, "glVertexAttribL2ui64vNV"); + glad_glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC) load(userptr, "glVertexAttribL3i64NV"); + glad_glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC) load(userptr, "glVertexAttribL3i64vNV"); + glad_glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC) load(userptr, "glVertexAttribL3ui64NV"); + glad_glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC) load(userptr, "glVertexAttribL3ui64vNV"); + glad_glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC) load(userptr, "glVertexAttribL4i64NV"); + glad_glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC) load(userptr, "glVertexAttribL4i64vNV"); + glad_glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC) load(userptr, "glVertexAttribL4ui64NV"); + glad_glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC) load(userptr, "glVertexAttribL4ui64vNV"); + glad_glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC) load(userptr, "glVertexAttribLFormatNV"); +} +static void glad_gl_load_GL_NV_vertex_buffer_unified_memory( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_buffer_unified_memory) return; + glad_glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC) load(userptr, "glBufferAddressRangeNV"); + glad_glColorFormatNV = (PFNGLCOLORFORMATNVPROC) load(userptr, "glColorFormatNV"); + glad_glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC) load(userptr, "glEdgeFlagFormatNV"); + glad_glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC) load(userptr, "glFogCoordFormatNV"); + glad_glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC) load(userptr, "glGetIntegerui64i_vNV"); + glad_glIndexFormatNV = (PFNGLINDEXFORMATNVPROC) load(userptr, "glIndexFormatNV"); + glad_glNormalFormatNV = (PFNGLNORMALFORMATNVPROC) load(userptr, "glNormalFormatNV"); + glad_glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC) load(userptr, "glSecondaryColorFormatNV"); + glad_glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC) load(userptr, "glTexCoordFormatNV"); + glad_glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC) load(userptr, "glVertexAttribFormatNV"); + glad_glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC) load(userptr, "glVertexAttribIFormatNV"); + glad_glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC) load(userptr, "glVertexFormatNV"); +} +static void glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_program) return; + glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV"); + glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV"); + glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV"); + glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV"); + glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV"); + glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV"); + glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV"); + glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV"); + glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV"); + glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV"); + glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV"); + glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV"); + glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV"); + glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV"); + glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV"); + glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV"); + glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV"); + glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV"); + glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV"); + glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV"); + glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV"); + glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV"); + glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV"); + glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV"); + glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV"); + glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV"); + glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV"); + glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV"); + glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV"); + glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV"); + glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV"); + glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV"); + glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV"); + glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV"); + glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV"); + glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV"); + glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV"); + glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV"); + glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV"); + glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV"); + glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV"); + glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV"); + glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV"); + glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV"); + glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV"); + glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV"); + glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV"); + glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV"); + glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV"); + glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV"); + glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV"); + glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV"); + glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV"); + glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV"); + glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV"); + glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV"); + glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV"); + glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV"); + glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV"); + glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV"); + glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV"); + glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV"); + glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV"); + glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV"); +} +static void glad_gl_load_GL_NV_vertex_program4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_program4) return; + glad_glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC) load(userptr, "glGetVertexAttribIivEXT"); + glad_glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC) load(userptr, "glGetVertexAttribIuivEXT"); + glad_glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC) load(userptr, "glVertexAttribI1iEXT"); + glad_glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC) load(userptr, "glVertexAttribI1ivEXT"); + glad_glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC) load(userptr, "glVertexAttribI1uiEXT"); + glad_glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC) load(userptr, "glVertexAttribI1uivEXT"); + glad_glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC) load(userptr, "glVertexAttribI2iEXT"); + glad_glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC) load(userptr, "glVertexAttribI2ivEXT"); + glad_glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC) load(userptr, "glVertexAttribI2uiEXT"); + glad_glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC) load(userptr, "glVertexAttribI2uivEXT"); + glad_glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC) load(userptr, "glVertexAttribI3iEXT"); + glad_glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC) load(userptr, "glVertexAttribI3ivEXT"); + glad_glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC) load(userptr, "glVertexAttribI3uiEXT"); + glad_glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC) load(userptr, "glVertexAttribI3uivEXT"); + glad_glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC) load(userptr, "glVertexAttribI4bvEXT"); + glad_glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC) load(userptr, "glVertexAttribI4iEXT"); + glad_glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC) load(userptr, "glVertexAttribI4ivEXT"); + glad_glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC) load(userptr, "glVertexAttribI4svEXT"); + glad_glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC) load(userptr, "glVertexAttribI4ubvEXT"); + glad_glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC) load(userptr, "glVertexAttribI4uiEXT"); + glad_glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC) load(userptr, "glVertexAttribI4uivEXT"); + glad_glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC) load(userptr, "glVertexAttribI4usvEXT"); + glad_glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC) load(userptr, "glVertexAttribIPointerEXT"); +} +static void glad_gl_load_GL_NV_video_capture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_video_capture) return; + glad_glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC) load(userptr, "glBeginVideoCaptureNV"); + glad_glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) load(userptr, "glBindVideoCaptureStreamBufferNV"); + glad_glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) load(userptr, "glBindVideoCaptureStreamTextureNV"); + glad_glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC) load(userptr, "glEndVideoCaptureNV"); + glad_glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) load(userptr, "glGetVideoCaptureStreamdvNV"); + glad_glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) load(userptr, "glGetVideoCaptureStreamfvNV"); + glad_glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) load(userptr, "glGetVideoCaptureStreamivNV"); + glad_glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC) load(userptr, "glGetVideoCaptureivNV"); + glad_glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC) load(userptr, "glVideoCaptureNV"); + glad_glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) load(userptr, "glVideoCaptureStreamParameterdvNV"); + glad_glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) load(userptr, "glVideoCaptureStreamParameterfvNV"); + glad_glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) load(userptr, "glVideoCaptureStreamParameterivNV"); +} +static void glad_gl_load_GL_NV_viewport_swizzle( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_viewport_swizzle) return; + glad_glViewportSwizzleNV = (PFNGLVIEWPORTSWIZZLENVPROC) load(userptr, "glViewportSwizzleNV"); +} +static void glad_gl_load_GL_OES_byte_coordinates( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_byte_coordinates) return; + glad_glMultiTexCoord1bOES = (PFNGLMULTITEXCOORD1BOESPROC) load(userptr, "glMultiTexCoord1bOES"); + glad_glMultiTexCoord1bvOES = (PFNGLMULTITEXCOORD1BVOESPROC) load(userptr, "glMultiTexCoord1bvOES"); + glad_glMultiTexCoord2bOES = (PFNGLMULTITEXCOORD2BOESPROC) load(userptr, "glMultiTexCoord2bOES"); + glad_glMultiTexCoord2bvOES = (PFNGLMULTITEXCOORD2BVOESPROC) load(userptr, "glMultiTexCoord2bvOES"); + glad_glMultiTexCoord3bOES = (PFNGLMULTITEXCOORD3BOESPROC) load(userptr, "glMultiTexCoord3bOES"); + glad_glMultiTexCoord3bvOES = (PFNGLMULTITEXCOORD3BVOESPROC) load(userptr, "glMultiTexCoord3bvOES"); + glad_glMultiTexCoord4bOES = (PFNGLMULTITEXCOORD4BOESPROC) load(userptr, "glMultiTexCoord4bOES"); + glad_glMultiTexCoord4bvOES = (PFNGLMULTITEXCOORD4BVOESPROC) load(userptr, "glMultiTexCoord4bvOES"); + glad_glTexCoord1bOES = (PFNGLTEXCOORD1BOESPROC) load(userptr, "glTexCoord1bOES"); + glad_glTexCoord1bvOES = (PFNGLTEXCOORD1BVOESPROC) load(userptr, "glTexCoord1bvOES"); + glad_glTexCoord2bOES = (PFNGLTEXCOORD2BOESPROC) load(userptr, "glTexCoord2bOES"); + glad_glTexCoord2bvOES = (PFNGLTEXCOORD2BVOESPROC) load(userptr, "glTexCoord2bvOES"); + glad_glTexCoord3bOES = (PFNGLTEXCOORD3BOESPROC) load(userptr, "glTexCoord3bOES"); + glad_glTexCoord3bvOES = (PFNGLTEXCOORD3BVOESPROC) load(userptr, "glTexCoord3bvOES"); + glad_glTexCoord4bOES = (PFNGLTEXCOORD4BOESPROC) load(userptr, "glTexCoord4bOES"); + glad_glTexCoord4bvOES = (PFNGLTEXCOORD4BVOESPROC) load(userptr, "glTexCoord4bvOES"); + glad_glVertex2bOES = (PFNGLVERTEX2BOESPROC) load(userptr, "glVertex2bOES"); + glad_glVertex2bvOES = (PFNGLVERTEX2BVOESPROC) load(userptr, "glVertex2bvOES"); + glad_glVertex3bOES = (PFNGLVERTEX3BOESPROC) load(userptr, "glVertex3bOES"); + glad_glVertex3bvOES = (PFNGLVERTEX3BVOESPROC) load(userptr, "glVertex3bvOES"); + glad_glVertex4bOES = (PFNGLVERTEX4BOESPROC) load(userptr, "glVertex4bOES"); + glad_glVertex4bvOES = (PFNGLVERTEX4BVOESPROC) load(userptr, "glVertex4bvOES"); +} +static void glad_gl_load_GL_OES_fixed_point( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_fixed_point) return; + glad_glAccumxOES = (PFNGLACCUMXOESPROC) load(userptr, "glAccumxOES"); + glad_glAlphaFuncxOES = (PFNGLALPHAFUNCXOESPROC) load(userptr, "glAlphaFuncxOES"); + glad_glBitmapxOES = (PFNGLBITMAPXOESPROC) load(userptr, "glBitmapxOES"); + glad_glBlendColorxOES = (PFNGLBLENDCOLORXOESPROC) load(userptr, "glBlendColorxOES"); + glad_glClearAccumxOES = (PFNGLCLEARACCUMXOESPROC) load(userptr, "glClearAccumxOES"); + glad_glClearColorxOES = (PFNGLCLEARCOLORXOESPROC) load(userptr, "glClearColorxOES"); + glad_glClearDepthxOES = (PFNGLCLEARDEPTHXOESPROC) load(userptr, "glClearDepthxOES"); + glad_glClipPlanexOES = (PFNGLCLIPPLANEXOESPROC) load(userptr, "glClipPlanexOES"); + glad_glColor3xOES = (PFNGLCOLOR3XOESPROC) load(userptr, "glColor3xOES"); + glad_glColor3xvOES = (PFNGLCOLOR3XVOESPROC) load(userptr, "glColor3xvOES"); + glad_glColor4xOES = (PFNGLCOLOR4XOESPROC) load(userptr, "glColor4xOES"); + glad_glColor4xvOES = (PFNGLCOLOR4XVOESPROC) load(userptr, "glColor4xvOES"); + glad_glConvolutionParameterxOES = (PFNGLCONVOLUTIONPARAMETERXOESPROC) load(userptr, "glConvolutionParameterxOES"); + glad_glConvolutionParameterxvOES = (PFNGLCONVOLUTIONPARAMETERXVOESPROC) load(userptr, "glConvolutionParameterxvOES"); + glad_glDepthRangexOES = (PFNGLDEPTHRANGEXOESPROC) load(userptr, "glDepthRangexOES"); + glad_glEvalCoord1xOES = (PFNGLEVALCOORD1XOESPROC) load(userptr, "glEvalCoord1xOES"); + glad_glEvalCoord1xvOES = (PFNGLEVALCOORD1XVOESPROC) load(userptr, "glEvalCoord1xvOES"); + glad_glEvalCoord2xOES = (PFNGLEVALCOORD2XOESPROC) load(userptr, "glEvalCoord2xOES"); + glad_glEvalCoord2xvOES = (PFNGLEVALCOORD2XVOESPROC) load(userptr, "glEvalCoord2xvOES"); + glad_glFeedbackBufferxOES = (PFNGLFEEDBACKBUFFERXOESPROC) load(userptr, "glFeedbackBufferxOES"); + glad_glFogxOES = (PFNGLFOGXOESPROC) load(userptr, "glFogxOES"); + glad_glFogxvOES = (PFNGLFOGXVOESPROC) load(userptr, "glFogxvOES"); + glad_glFrustumxOES = (PFNGLFRUSTUMXOESPROC) load(userptr, "glFrustumxOES"); + glad_glGetClipPlanexOES = (PFNGLGETCLIPPLANEXOESPROC) load(userptr, "glGetClipPlanexOES"); + glad_glGetConvolutionParameterxvOES = (PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) load(userptr, "glGetConvolutionParameterxvOES"); + glad_glGetFixedvOES = (PFNGLGETFIXEDVOESPROC) load(userptr, "glGetFixedvOES"); + glad_glGetHistogramParameterxvOES = (PFNGLGETHISTOGRAMPARAMETERXVOESPROC) load(userptr, "glGetHistogramParameterxvOES"); + glad_glGetLightxOES = (PFNGLGETLIGHTXOESPROC) load(userptr, "glGetLightxOES"); + glad_glGetMapxvOES = (PFNGLGETMAPXVOESPROC) load(userptr, "glGetMapxvOES"); + glad_glGetMaterialxOES = (PFNGLGETMATERIALXOESPROC) load(userptr, "glGetMaterialxOES"); + glad_glGetPixelMapxv = (PFNGLGETPIXELMAPXVPROC) load(userptr, "glGetPixelMapxv"); + glad_glGetTexEnvxvOES = (PFNGLGETTEXENVXVOESPROC) load(userptr, "glGetTexEnvxvOES"); + glad_glGetTexGenxvOES = (PFNGLGETTEXGENXVOESPROC) load(userptr, "glGetTexGenxvOES"); + glad_glGetTexLevelParameterxvOES = (PFNGLGETTEXLEVELPARAMETERXVOESPROC) load(userptr, "glGetTexLevelParameterxvOES"); + glad_glGetTexParameterxvOES = (PFNGLGETTEXPARAMETERXVOESPROC) load(userptr, "glGetTexParameterxvOES"); + glad_glIndexxOES = (PFNGLINDEXXOESPROC) load(userptr, "glIndexxOES"); + glad_glIndexxvOES = (PFNGLINDEXXVOESPROC) load(userptr, "glIndexxvOES"); + glad_glLightModelxOES = (PFNGLLIGHTMODELXOESPROC) load(userptr, "glLightModelxOES"); + glad_glLightModelxvOES = (PFNGLLIGHTMODELXVOESPROC) load(userptr, "glLightModelxvOES"); + glad_glLightxOES = (PFNGLLIGHTXOESPROC) load(userptr, "glLightxOES"); + glad_glLightxvOES = (PFNGLLIGHTXVOESPROC) load(userptr, "glLightxvOES"); + glad_glLineWidthxOES = (PFNGLLINEWIDTHXOESPROC) load(userptr, "glLineWidthxOES"); + glad_glLoadMatrixxOES = (PFNGLLOADMATRIXXOESPROC) load(userptr, "glLoadMatrixxOES"); + glad_glLoadTransposeMatrixxOES = (PFNGLLOADTRANSPOSEMATRIXXOESPROC) load(userptr, "glLoadTransposeMatrixxOES"); + glad_glMap1xOES = (PFNGLMAP1XOESPROC) load(userptr, "glMap1xOES"); + glad_glMap2xOES = (PFNGLMAP2XOESPROC) load(userptr, "glMap2xOES"); + glad_glMapGrid1xOES = (PFNGLMAPGRID1XOESPROC) load(userptr, "glMapGrid1xOES"); + glad_glMapGrid2xOES = (PFNGLMAPGRID2XOESPROC) load(userptr, "glMapGrid2xOES"); + glad_glMaterialxOES = (PFNGLMATERIALXOESPROC) load(userptr, "glMaterialxOES"); + glad_glMaterialxvOES = (PFNGLMATERIALXVOESPROC) load(userptr, "glMaterialxvOES"); + glad_glMultMatrixxOES = (PFNGLMULTMATRIXXOESPROC) load(userptr, "glMultMatrixxOES"); + glad_glMultTransposeMatrixxOES = (PFNGLMULTTRANSPOSEMATRIXXOESPROC) load(userptr, "glMultTransposeMatrixxOES"); + glad_glMultiTexCoord1xOES = (PFNGLMULTITEXCOORD1XOESPROC) load(userptr, "glMultiTexCoord1xOES"); + glad_glMultiTexCoord1xvOES = (PFNGLMULTITEXCOORD1XVOESPROC) load(userptr, "glMultiTexCoord1xvOES"); + glad_glMultiTexCoord2xOES = (PFNGLMULTITEXCOORD2XOESPROC) load(userptr, "glMultiTexCoord2xOES"); + glad_glMultiTexCoord2xvOES = (PFNGLMULTITEXCOORD2XVOESPROC) load(userptr, "glMultiTexCoord2xvOES"); + glad_glMultiTexCoord3xOES = (PFNGLMULTITEXCOORD3XOESPROC) load(userptr, "glMultiTexCoord3xOES"); + glad_glMultiTexCoord3xvOES = (PFNGLMULTITEXCOORD3XVOESPROC) load(userptr, "glMultiTexCoord3xvOES"); + glad_glMultiTexCoord4xOES = (PFNGLMULTITEXCOORD4XOESPROC) load(userptr, "glMultiTexCoord4xOES"); + glad_glMultiTexCoord4xvOES = (PFNGLMULTITEXCOORD4XVOESPROC) load(userptr, "glMultiTexCoord4xvOES"); + glad_glNormal3xOES = (PFNGLNORMAL3XOESPROC) load(userptr, "glNormal3xOES"); + glad_glNormal3xvOES = (PFNGLNORMAL3XVOESPROC) load(userptr, "glNormal3xvOES"); + glad_glOrthoxOES = (PFNGLORTHOXOESPROC) load(userptr, "glOrthoxOES"); + glad_glPassThroughxOES = (PFNGLPASSTHROUGHXOESPROC) load(userptr, "glPassThroughxOES"); + glad_glPixelMapx = (PFNGLPIXELMAPXPROC) load(userptr, "glPixelMapx"); + glad_glPixelStorex = (PFNGLPIXELSTOREXPROC) load(userptr, "glPixelStorex"); + glad_glPixelTransferxOES = (PFNGLPIXELTRANSFERXOESPROC) load(userptr, "glPixelTransferxOES"); + glad_glPixelZoomxOES = (PFNGLPIXELZOOMXOESPROC) load(userptr, "glPixelZoomxOES"); + glad_glPointParameterxvOES = (PFNGLPOINTPARAMETERXVOESPROC) load(userptr, "glPointParameterxvOES"); + glad_glPointSizexOES = (PFNGLPOINTSIZEXOESPROC) load(userptr, "glPointSizexOES"); + glad_glPolygonOffsetxOES = (PFNGLPOLYGONOFFSETXOESPROC) load(userptr, "glPolygonOffsetxOES"); + glad_glPrioritizeTexturesxOES = (PFNGLPRIORITIZETEXTURESXOESPROC) load(userptr, "glPrioritizeTexturesxOES"); + glad_glRasterPos2xOES = (PFNGLRASTERPOS2XOESPROC) load(userptr, "glRasterPos2xOES"); + glad_glRasterPos2xvOES = (PFNGLRASTERPOS2XVOESPROC) load(userptr, "glRasterPos2xvOES"); + glad_glRasterPos3xOES = (PFNGLRASTERPOS3XOESPROC) load(userptr, "glRasterPos3xOES"); + glad_glRasterPos3xvOES = (PFNGLRASTERPOS3XVOESPROC) load(userptr, "glRasterPos3xvOES"); + glad_glRasterPos4xOES = (PFNGLRASTERPOS4XOESPROC) load(userptr, "glRasterPos4xOES"); + glad_glRasterPos4xvOES = (PFNGLRASTERPOS4XVOESPROC) load(userptr, "glRasterPos4xvOES"); + glad_glRectxOES = (PFNGLRECTXOESPROC) load(userptr, "glRectxOES"); + glad_glRectxvOES = (PFNGLRECTXVOESPROC) load(userptr, "glRectxvOES"); + glad_glRotatexOES = (PFNGLROTATEXOESPROC) load(userptr, "glRotatexOES"); + glad_glScalexOES = (PFNGLSCALEXOESPROC) load(userptr, "glScalexOES"); + glad_glTexCoord1xOES = (PFNGLTEXCOORD1XOESPROC) load(userptr, "glTexCoord1xOES"); + glad_glTexCoord1xvOES = (PFNGLTEXCOORD1XVOESPROC) load(userptr, "glTexCoord1xvOES"); + glad_glTexCoord2xOES = (PFNGLTEXCOORD2XOESPROC) load(userptr, "glTexCoord2xOES"); + glad_glTexCoord2xvOES = (PFNGLTEXCOORD2XVOESPROC) load(userptr, "glTexCoord2xvOES"); + glad_glTexCoord3xOES = (PFNGLTEXCOORD3XOESPROC) load(userptr, "glTexCoord3xOES"); + glad_glTexCoord3xvOES = (PFNGLTEXCOORD3XVOESPROC) load(userptr, "glTexCoord3xvOES"); + glad_glTexCoord4xOES = (PFNGLTEXCOORD4XOESPROC) load(userptr, "glTexCoord4xOES"); + glad_glTexCoord4xvOES = (PFNGLTEXCOORD4XVOESPROC) load(userptr, "glTexCoord4xvOES"); + glad_glTexEnvxOES = (PFNGLTEXENVXOESPROC) load(userptr, "glTexEnvxOES"); + glad_glTexEnvxvOES = (PFNGLTEXENVXVOESPROC) load(userptr, "glTexEnvxvOES"); + glad_glTexGenxOES = (PFNGLTEXGENXOESPROC) load(userptr, "glTexGenxOES"); + glad_glTexGenxvOES = (PFNGLTEXGENXVOESPROC) load(userptr, "glTexGenxvOES"); + glad_glTexParameterxOES = (PFNGLTEXPARAMETERXOESPROC) load(userptr, "glTexParameterxOES"); + glad_glTexParameterxvOES = (PFNGLTEXPARAMETERXVOESPROC) load(userptr, "glTexParameterxvOES"); + glad_glTranslatexOES = (PFNGLTRANSLATEXOESPROC) load(userptr, "glTranslatexOES"); + glad_glVertex2xOES = (PFNGLVERTEX2XOESPROC) load(userptr, "glVertex2xOES"); + glad_glVertex2xvOES = (PFNGLVERTEX2XVOESPROC) load(userptr, "glVertex2xvOES"); + glad_glVertex3xOES = (PFNGLVERTEX3XOESPROC) load(userptr, "glVertex3xOES"); + glad_glVertex3xvOES = (PFNGLVERTEX3XVOESPROC) load(userptr, "glVertex3xvOES"); + glad_glVertex4xOES = (PFNGLVERTEX4XOESPROC) load(userptr, "glVertex4xOES"); + glad_glVertex4xvOES = (PFNGLVERTEX4XVOESPROC) load(userptr, "glVertex4xvOES"); +} +static void glad_gl_load_GL_OES_query_matrix( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_query_matrix) return; + glad_glQueryMatrixxOES = (PFNGLQUERYMATRIXXOESPROC) load(userptr, "glQueryMatrixxOES"); +} +static void glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_single_precision) return; + glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES"); + glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES"); + glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES"); + glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES"); + glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES"); + glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES"); +} +static void glad_gl_load_GL_OVR_multiview( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OVR_multiview) return; + glad_glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) load(userptr, "glFramebufferTextureMultiviewOVR"); +} +static void glad_gl_load_GL_PGI_misc_hints( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_PGI_misc_hints) return; + glad_glHintPGI = (PFNGLHINTPGIPROC) load(userptr, "glHintPGI"); +} +static void glad_gl_load_GL_SGIS_detail_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_detail_texture) return; + glad_glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC) load(userptr, "glDetailTexFuncSGIS"); + glad_glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC) load(userptr, "glGetDetailTexFuncSGIS"); +} +static void glad_gl_load_GL_SGIS_fog_function( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_fog_function) return; + glad_glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC) load(userptr, "glFogFuncSGIS"); + glad_glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC) load(userptr, "glGetFogFuncSGIS"); +} +static void glad_gl_load_GL_SGIS_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_multisample) return; + glad_glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC) load(userptr, "glSampleMaskSGIS"); + glad_glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC) load(userptr, "glSamplePatternSGIS"); +} +static void glad_gl_load_GL_SGIS_pixel_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_pixel_texture) return; + glad_glGetPixelTexGenParameterfvSGIS = (PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) load(userptr, "glGetPixelTexGenParameterfvSGIS"); + glad_glGetPixelTexGenParameterivSGIS = (PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) load(userptr, "glGetPixelTexGenParameterivSGIS"); + glad_glPixelTexGenParameterfSGIS = (PFNGLPIXELTEXGENPARAMETERFSGISPROC) load(userptr, "glPixelTexGenParameterfSGIS"); + glad_glPixelTexGenParameterfvSGIS = (PFNGLPIXELTEXGENPARAMETERFVSGISPROC) load(userptr, "glPixelTexGenParameterfvSGIS"); + glad_glPixelTexGenParameteriSGIS = (PFNGLPIXELTEXGENPARAMETERISGISPROC) load(userptr, "glPixelTexGenParameteriSGIS"); + glad_glPixelTexGenParameterivSGIS = (PFNGLPIXELTEXGENPARAMETERIVSGISPROC) load(userptr, "glPixelTexGenParameterivSGIS"); +} +static void glad_gl_load_GL_SGIS_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_point_parameters) return; + glad_glPointParameterfSGIS = (PFNGLPOINTPARAMETERFSGISPROC) load(userptr, "glPointParameterfSGIS"); + glad_glPointParameterfvSGIS = (PFNGLPOINTPARAMETERFVSGISPROC) load(userptr, "glPointParameterfvSGIS"); +} +static void glad_gl_load_GL_SGIS_sharpen_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_sharpen_texture) return; + glad_glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC) load(userptr, "glGetSharpenTexFuncSGIS"); + glad_glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC) load(userptr, "glSharpenTexFuncSGIS"); +} +static void glad_gl_load_GL_SGIS_texture4D( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_texture4D) return; + glad_glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC) load(userptr, "glTexImage4DSGIS"); + glad_glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC) load(userptr, "glTexSubImage4DSGIS"); +} +static void glad_gl_load_GL_SGIS_texture_color_mask( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_texture_color_mask) return; + glad_glTextureColorMaskSGIS = (PFNGLTEXTURECOLORMASKSGISPROC) load(userptr, "glTextureColorMaskSGIS"); +} +static void glad_gl_load_GL_SGIS_texture_filter4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_texture_filter4) return; + glad_glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC) load(userptr, "glGetTexFilterFuncSGIS"); + glad_glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC) load(userptr, "glTexFilterFuncSGIS"); +} +static void glad_gl_load_GL_SGIX_async( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_async) return; + glad_glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC) load(userptr, "glAsyncMarkerSGIX"); + glad_glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC) load(userptr, "glDeleteAsyncMarkersSGIX"); + glad_glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC) load(userptr, "glFinishAsyncSGIX"); + glad_glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC) load(userptr, "glGenAsyncMarkersSGIX"); + glad_glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC) load(userptr, "glIsAsyncMarkerSGIX"); + glad_glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC) load(userptr, "glPollAsyncSGIX"); +} +static void glad_gl_load_GL_SGIX_flush_raster( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_flush_raster) return; + glad_glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC) load(userptr, "glFlushRasterSGIX"); +} +static void glad_gl_load_GL_SGIX_fragment_lighting( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_fragment_lighting) return; + glad_glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC) load(userptr, "glFragmentColorMaterialSGIX"); + glad_glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC) load(userptr, "glFragmentLightModelfSGIX"); + glad_glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) load(userptr, "glFragmentLightModelfvSGIX"); + glad_glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC) load(userptr, "glFragmentLightModeliSGIX"); + glad_glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) load(userptr, "glFragmentLightModelivSGIX"); + glad_glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC) load(userptr, "glFragmentLightfSGIX"); + glad_glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC) load(userptr, "glFragmentLightfvSGIX"); + glad_glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC) load(userptr, "glFragmentLightiSGIX"); + glad_glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC) load(userptr, "glFragmentLightivSGIX"); + glad_glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC) load(userptr, "glFragmentMaterialfSGIX"); + glad_glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC) load(userptr, "glFragmentMaterialfvSGIX"); + glad_glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC) load(userptr, "glFragmentMaterialiSGIX"); + glad_glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC) load(userptr, "glFragmentMaterialivSGIX"); + glad_glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC) load(userptr, "glGetFragmentLightfvSGIX"); + glad_glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC) load(userptr, "glGetFragmentLightivSGIX"); + glad_glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC) load(userptr, "glGetFragmentMaterialfvSGIX"); + glad_glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC) load(userptr, "glGetFragmentMaterialivSGIX"); + glad_glLightEnviSGIX = (PFNGLLIGHTENVISGIXPROC) load(userptr, "glLightEnviSGIX"); +} +static void glad_gl_load_GL_SGIX_framezoom( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_framezoom) return; + glad_glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC) load(userptr, "glFrameZoomSGIX"); +} +static void glad_gl_load_GL_SGIX_igloo_interface( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_igloo_interface) return; + glad_glIglooInterfaceSGIX = (PFNGLIGLOOINTERFACESGIXPROC) load(userptr, "glIglooInterfaceSGIX"); +} +static void glad_gl_load_GL_SGIX_instruments( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_instruments) return; + glad_glGetInstrumentsSGIX = (PFNGLGETINSTRUMENTSSGIXPROC) load(userptr, "glGetInstrumentsSGIX"); + glad_glInstrumentsBufferSGIX = (PFNGLINSTRUMENTSBUFFERSGIXPROC) load(userptr, "glInstrumentsBufferSGIX"); + glad_glPollInstrumentsSGIX = (PFNGLPOLLINSTRUMENTSSGIXPROC) load(userptr, "glPollInstrumentsSGIX"); + glad_glReadInstrumentsSGIX = (PFNGLREADINSTRUMENTSSGIXPROC) load(userptr, "glReadInstrumentsSGIX"); + glad_glStartInstrumentsSGIX = (PFNGLSTARTINSTRUMENTSSGIXPROC) load(userptr, "glStartInstrumentsSGIX"); + glad_glStopInstrumentsSGIX = (PFNGLSTOPINSTRUMENTSSGIXPROC) load(userptr, "glStopInstrumentsSGIX"); +} +static void glad_gl_load_GL_SGIX_list_priority( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_list_priority) return; + glad_glGetListParameterfvSGIX = (PFNGLGETLISTPARAMETERFVSGIXPROC) load(userptr, "glGetListParameterfvSGIX"); + glad_glGetListParameterivSGIX = (PFNGLGETLISTPARAMETERIVSGIXPROC) load(userptr, "glGetListParameterivSGIX"); + glad_glListParameterfSGIX = (PFNGLLISTPARAMETERFSGIXPROC) load(userptr, "glListParameterfSGIX"); + glad_glListParameterfvSGIX = (PFNGLLISTPARAMETERFVSGIXPROC) load(userptr, "glListParameterfvSGIX"); + glad_glListParameteriSGIX = (PFNGLLISTPARAMETERISGIXPROC) load(userptr, "glListParameteriSGIX"); + glad_glListParameterivSGIX = (PFNGLLISTPARAMETERIVSGIXPROC) load(userptr, "glListParameterivSGIX"); +} +static void glad_gl_load_GL_SGIX_pixel_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_pixel_texture) return; + glad_glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC) load(userptr, "glPixelTexGenSGIX"); +} +static void glad_gl_load_GL_SGIX_polynomial_ffd( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_polynomial_ffd) return; + glad_glDeformSGIX = (PFNGLDEFORMSGIXPROC) load(userptr, "glDeformSGIX"); + glad_glDeformationMap3dSGIX = (PFNGLDEFORMATIONMAP3DSGIXPROC) load(userptr, "glDeformationMap3dSGIX"); + glad_glDeformationMap3fSGIX = (PFNGLDEFORMATIONMAP3FSGIXPROC) load(userptr, "glDeformationMap3fSGIX"); + glad_glLoadIdentityDeformationMapSGIX = (PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) load(userptr, "glLoadIdentityDeformationMapSGIX"); +} +static void glad_gl_load_GL_SGIX_reference_plane( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_reference_plane) return; + glad_glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC) load(userptr, "glReferencePlaneSGIX"); +} +static void glad_gl_load_GL_SGIX_sprite( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_sprite) return; + glad_glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC) load(userptr, "glSpriteParameterfSGIX"); + glad_glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC) load(userptr, "glSpriteParameterfvSGIX"); + glad_glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC) load(userptr, "glSpriteParameteriSGIX"); + glad_glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC) load(userptr, "glSpriteParameterivSGIX"); +} +static void glad_gl_load_GL_SGIX_tag_sample_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIX_tag_sample_buffer) return; + glad_glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC) load(userptr, "glTagSampleBufferSGIX"); +} +static void glad_gl_load_GL_SGI_color_table( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGI_color_table) return; + glad_glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC) load(userptr, "glColorTableParameterfvSGI"); + glad_glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC) load(userptr, "glColorTableParameterivSGI"); + glad_glColorTableSGI = (PFNGLCOLORTABLESGIPROC) load(userptr, "glColorTableSGI"); + glad_glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC) load(userptr, "glCopyColorTableSGI"); + glad_glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) load(userptr, "glGetColorTableParameterfvSGI"); + glad_glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) load(userptr, "glGetColorTableParameterivSGI"); + glad_glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC) load(userptr, "glGetColorTableSGI"); +} +static void glad_gl_load_GL_SUNX_constant_data( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SUNX_constant_data) return; + glad_glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC) load(userptr, "glFinishTextureSUNX"); +} +static void glad_gl_load_GL_SUN_global_alpha( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SUN_global_alpha) return; + glad_glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC) load(userptr, "glGlobalAlphaFactorbSUN"); + glad_glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC) load(userptr, "glGlobalAlphaFactordSUN"); + glad_glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC) load(userptr, "glGlobalAlphaFactorfSUN"); + glad_glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC) load(userptr, "glGlobalAlphaFactoriSUN"); + glad_glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC) load(userptr, "glGlobalAlphaFactorsSUN"); + glad_glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC) load(userptr, "glGlobalAlphaFactorubSUN"); + glad_glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC) load(userptr, "glGlobalAlphaFactoruiSUN"); + glad_glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC) load(userptr, "glGlobalAlphaFactorusSUN"); +} +static void glad_gl_load_GL_SUN_mesh_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SUN_mesh_array) return; + glad_glDrawMeshArraysSUN = (PFNGLDRAWMESHARRAYSSUNPROC) load(userptr, "glDrawMeshArraysSUN"); +} +static void glad_gl_load_GL_SUN_triangle_list( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SUN_triangle_list) return; + glad_glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC) load(userptr, "glReplacementCodePointerSUN"); + glad_glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC) load(userptr, "glReplacementCodeubSUN"); + glad_glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC) load(userptr, "glReplacementCodeubvSUN"); + glad_glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC) load(userptr, "glReplacementCodeuiSUN"); + glad_glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC) load(userptr, "glReplacementCodeuivSUN"); + glad_glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC) load(userptr, "glReplacementCodeusSUN"); + glad_glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC) load(userptr, "glReplacementCodeusvSUN"); +} +static void glad_gl_load_GL_SUN_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SUN_vertex) return; + glad_glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC) load(userptr, "glColor3fVertex3fSUN"); + glad_glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC) load(userptr, "glColor3fVertex3fvSUN"); + glad_glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glColor4fNormal3fVertex3fSUN"); + glad_glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glColor4fNormal3fVertex3fvSUN"); + glad_glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC) load(userptr, "glColor4ubVertex2fSUN"); + glad_glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC) load(userptr, "glColor4ubVertex2fvSUN"); + glad_glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC) load(userptr, "glColor4ubVertex3fSUN"); + glad_glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC) load(userptr, "glColor4ubVertex3fvSUN"); + glad_glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC) load(userptr, "glNormal3fVertex3fSUN"); + glad_glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glNormal3fVertex3fvSUN"); + glad_glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiColor3fVertex3fSUN"); + glad_glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiColor3fVertex3fvSUN"); + glad_glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiColor4fNormal3fVertex3fSUN"); + glad_glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiColor4fNormal3fVertex3fvSUN"); + glad_glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiColor4ubVertex3fSUN"); + glad_glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiColor4ubVertex3fvSUN"); + glad_glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiNormal3fVertex3fSUN"); + glad_glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiNormal3fVertex3fvSUN"); + glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"); + glad_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"); + glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"); + glad_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"); + glad_glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fVertex3fSUN"); + glad_glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiTexCoord2fVertex3fvSUN"); + glad_glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) load(userptr, "glReplacementCodeuiVertex3fSUN"); + glad_glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) load(userptr, "glReplacementCodeuiVertex3fvSUN"); + glad_glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) load(userptr, "glTexCoord2fColor3fVertex3fSUN"); + glad_glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) load(userptr, "glTexCoord2fColor3fVertex3fvSUN"); + glad_glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glTexCoord2fColor4fNormal3fVertex3fSUN"); + glad_glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glTexCoord2fColor4fNormal3fVertex3fvSUN"); + glad_glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) load(userptr, "glTexCoord2fColor4ubVertex3fSUN"); + glad_glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) load(userptr, "glTexCoord2fColor4ubVertex3fvSUN"); + glad_glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) load(userptr, "glTexCoord2fNormal3fVertex3fSUN"); + glad_glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) load(userptr, "glTexCoord2fNormal3fVertex3fvSUN"); + glad_glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC) load(userptr, "glTexCoord2fVertex3fSUN"); + glad_glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC) load(userptr, "glTexCoord2fVertex3fvSUN"); + glad_glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) load(userptr, "glTexCoord4fColor4fNormal3fVertex4fSUN"); + glad_glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) load(userptr, "glTexCoord4fColor4fNormal3fVertex4fvSUN"); + glad_glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC) load(userptr, "glTexCoord4fVertex4fSUN"); + glad_glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC) load(userptr, "glTexCoord4fVertex4fvSUN"); +} +static void glad_gl_load_GL_ANGLE_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ANGLE_framebuffer_blit) return; + glad_glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC) load(userptr, "glBlitFramebufferANGLE"); +} +static void glad_gl_load_GL_ANGLE_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ANGLE_framebuffer_multisample) return; + glad_glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) load(userptr, "glRenderbufferStorageMultisampleANGLE"); +} +static void glad_gl_load_GL_ANGLE_instanced_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ANGLE_instanced_arrays) return; + glad_glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC) load(userptr, "glDrawArraysInstancedANGLE"); + glad_glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) load(userptr, "glDrawElementsInstancedANGLE"); + glad_glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC) load(userptr, "glVertexAttribDivisorANGLE"); +} +static void glad_gl_load_GL_ANGLE_translated_shader_source( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ANGLE_translated_shader_source) return; + glad_glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) load(userptr, "glGetTranslatedShaderSourceANGLE"); +} +static void glad_gl_load_GL_APPLE_copy_texture_levels( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_copy_texture_levels) return; + glad_glCopyTextureLevelsAPPLE = (PFNGLCOPYTEXTURELEVELSAPPLEPROC) load(userptr, "glCopyTextureLevelsAPPLE"); +} +static void glad_gl_load_GL_APPLE_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_framebuffer_multisample) return; + glad_glRenderbufferStorageMultisampleAPPLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) load(userptr, "glRenderbufferStorageMultisampleAPPLE"); + glad_glResolveMultisampleFramebufferAPPLE = (PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) load(userptr, "glResolveMultisampleFramebufferAPPLE"); +} +static void glad_gl_load_GL_APPLE_sync( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_sync) return; + glad_glClientWaitSyncAPPLE = (PFNGLCLIENTWAITSYNCAPPLEPROC) load(userptr, "glClientWaitSyncAPPLE"); + glad_glDeleteSyncAPPLE = (PFNGLDELETESYNCAPPLEPROC) load(userptr, "glDeleteSyncAPPLE"); + glad_glFenceSyncAPPLE = (PFNGLFENCESYNCAPPLEPROC) load(userptr, "glFenceSyncAPPLE"); + glad_glGetInteger64vAPPLE = (PFNGLGETINTEGER64VAPPLEPROC) load(userptr, "glGetInteger64vAPPLE"); + glad_glGetSyncivAPPLE = (PFNGLGETSYNCIVAPPLEPROC) load(userptr, "glGetSyncivAPPLE"); + glad_glIsSyncAPPLE = (PFNGLISSYNCAPPLEPROC) load(userptr, "glIsSyncAPPLE"); + glad_glWaitSyncAPPLE = (PFNGLWAITSYNCAPPLEPROC) load(userptr, "glWaitSyncAPPLE"); +} +static void glad_gl_load_GL_ARM_shader_core_properties( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARM_shader_core_properties) return; + glad_glMaxActiveShaderCoresARM = (PFNGLMAXACTIVESHADERCORESARMPROC) load(userptr, "glMaxActiveShaderCoresARM"); +} +static void glad_gl_load_GL_EXT_base_instance( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_base_instance) return; + glad_glDrawArraysInstancedBaseInstanceEXT = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) load(userptr, "glDrawArraysInstancedBaseInstanceEXT"); + glad_glDrawElementsInstancedBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) load(userptr, "glDrawElementsInstancedBaseInstanceEXT"); + glad_glDrawElementsInstancedBaseVertexBaseInstanceEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstanceEXT"); +} +static void glad_gl_load_GL_EXT_blend_func_extended( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_func_extended) return; + glad_glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC) load(userptr, "glBindFragDataLocationEXT"); + glad_glBindFragDataLocationIndexedEXT = (PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) load(userptr, "glBindFragDataLocationIndexedEXT"); + glad_glGetFragDataIndexEXT = (PFNGLGETFRAGDATAINDEXEXTPROC) load(userptr, "glGetFragDataIndexEXT"); + glad_glGetProgramResourceLocationIndexEXT = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) load(userptr, "glGetProgramResourceLocationIndexEXT"); +} +static void glad_gl_load_GL_EXT_buffer_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_buffer_storage) return; + glad_glBufferStorageEXT = (PFNGLBUFFERSTORAGEEXTPROC) load(userptr, "glBufferStorageEXT"); +} +static void glad_gl_load_GL_EXT_clear_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_clear_texture) return; + glad_glClearTexImageEXT = (PFNGLCLEARTEXIMAGEEXTPROC) load(userptr, "glClearTexImageEXT"); + glad_glClearTexSubImageEXT = (PFNGLCLEARTEXSUBIMAGEEXTPROC) load(userptr, "glClearTexSubImageEXT"); +} +static void glad_gl_load_GL_EXT_clip_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_clip_control) return; + glad_glClipControlEXT = (PFNGLCLIPCONTROLEXTPROC) load(userptr, "glClipControlEXT"); +} +static void glad_gl_load_GL_EXT_copy_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_copy_image) return; + glad_glCopyImageSubDataEXT = (PFNGLCOPYIMAGESUBDATAEXTPROC) load(userptr, "glCopyImageSubDataEXT"); +} +static void glad_gl_load_GL_EXT_discard_framebuffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_discard_framebuffer) return; + glad_glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXTPROC) load(userptr, "glDiscardFramebufferEXT"); +} +static void glad_gl_load_GL_EXT_disjoint_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_disjoint_timer_query) return; + glad_glBeginQueryEXT = (PFNGLBEGINQUERYEXTPROC) load(userptr, "glBeginQueryEXT"); + glad_glDeleteQueriesEXT = (PFNGLDELETEQUERIESEXTPROC) load(userptr, "glDeleteQueriesEXT"); + glad_glEndQueryEXT = (PFNGLENDQUERYEXTPROC) load(userptr, "glEndQueryEXT"); + glad_glGenQueriesEXT = (PFNGLGENQUERIESEXTPROC) load(userptr, "glGenQueriesEXT"); + glad_glGetInteger64vEXT = (PFNGLGETINTEGER64VEXTPROC) load(userptr, "glGetInteger64vEXT"); + glad_glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC) load(userptr, "glGetQueryObjecti64vEXT"); + glad_glGetQueryObjectivEXT = (PFNGLGETQUERYOBJECTIVEXTPROC) load(userptr, "glGetQueryObjectivEXT"); + glad_glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC) load(userptr, "glGetQueryObjectui64vEXT"); + glad_glGetQueryObjectuivEXT = (PFNGLGETQUERYOBJECTUIVEXTPROC) load(userptr, "glGetQueryObjectuivEXT"); + glad_glGetQueryivEXT = (PFNGLGETQUERYIVEXTPROC) load(userptr, "glGetQueryivEXT"); + glad_glIsQueryEXT = (PFNGLISQUERYEXTPROC) load(userptr, "glIsQueryEXT"); + glad_glQueryCounterEXT = (PFNGLQUERYCOUNTEREXTPROC) load(userptr, "glQueryCounterEXT"); +} +static void glad_gl_load_GL_EXT_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_buffers) return; + glad_glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXTPROC) load(userptr, "glDrawBuffersEXT"); +} +static void glad_gl_load_GL_EXT_draw_buffers_indexed( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_buffers_indexed) return; + glad_glBlendEquationSeparateiEXT = (PFNGLBLENDEQUATIONSEPARATEIEXTPROC) load(userptr, "glBlendEquationSeparateiEXT"); + glad_glBlendEquationiEXT = (PFNGLBLENDEQUATIONIEXTPROC) load(userptr, "glBlendEquationiEXT"); + glad_glBlendFuncSeparateiEXT = (PFNGLBLENDFUNCSEPARATEIEXTPROC) load(userptr, "glBlendFuncSeparateiEXT"); + glad_glBlendFunciEXT = (PFNGLBLENDFUNCIEXTPROC) load(userptr, "glBlendFunciEXT"); + glad_glColorMaskiEXT = (PFNGLCOLORMASKIEXTPROC) load(userptr, "glColorMaskiEXT"); + glad_glDisableiEXT = (PFNGLDISABLEIEXTPROC) load(userptr, "glDisableiEXT"); + glad_glEnableiEXT = (PFNGLENABLEIEXTPROC) load(userptr, "glEnableiEXT"); + glad_glIsEnablediEXT = (PFNGLISENABLEDIEXTPROC) load(userptr, "glIsEnablediEXT"); +} +static void glad_gl_load_GL_EXT_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_elements_base_vertex) return; + glad_glDrawElementsBaseVertexEXT = (PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) load(userptr, "glDrawElementsBaseVertexEXT"); + glad_glDrawElementsInstancedBaseVertexEXT = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) load(userptr, "glDrawElementsInstancedBaseVertexEXT"); + glad_glDrawRangeElementsBaseVertexEXT = (PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) load(userptr, "glDrawRangeElementsBaseVertexEXT"); + glad_glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) load(userptr, "glMultiDrawElementsBaseVertexEXT"); +} +static void glad_gl_load_GL_EXT_draw_transform_feedback( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_transform_feedback) return; + glad_glDrawTransformFeedbackEXT = (PFNGLDRAWTRANSFORMFEEDBACKEXTPROC) load(userptr, "glDrawTransformFeedbackEXT"); + glad_glDrawTransformFeedbackInstancedEXT = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC) load(userptr, "glDrawTransformFeedbackInstancedEXT"); +} +static void glad_gl_load_GL_EXT_fragment_shading_rate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_fragment_shading_rate) return; + glad_glFramebufferShadingRateEXT = (PFNGLFRAMEBUFFERSHADINGRATEEXTPROC) load(userptr, "glFramebufferShadingRateEXT"); + glad_glGetFragmentShadingRatesEXT = (PFNGLGETFRAGMENTSHADINGRATESEXTPROC) load(userptr, "glGetFragmentShadingRatesEXT"); + glad_glShadingRateCombinerOpsEXT = (PFNGLSHADINGRATECOMBINEROPSEXTPROC) load(userptr, "glShadingRateCombinerOpsEXT"); + glad_glShadingRateEXT = (PFNGLSHADINGRATEEXTPROC) load(userptr, "glShadingRateEXT"); +} +static void glad_gl_load_GL_EXT_geometry_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_geometry_shader) return; + glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT"); +} +static void glad_gl_load_GL_EXT_instanced_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_instanced_arrays) return; + glad_glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC) load(userptr, "glDrawArraysInstancedEXT"); + glad_glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC) load(userptr, "glDrawElementsInstancedEXT"); + glad_glVertexAttribDivisorEXT = (PFNGLVERTEXATTRIBDIVISOREXTPROC) load(userptr, "glVertexAttribDivisorEXT"); +} +static void glad_gl_load_GL_EXT_map_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_map_buffer_range) return; + glad_glFlushMappedBufferRangeEXT = (PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) load(userptr, "glFlushMappedBufferRangeEXT"); + glad_glMapBufferRangeEXT = (PFNGLMAPBUFFERRANGEEXTPROC) load(userptr, "glMapBufferRangeEXT"); +} +static void glad_gl_load_GL_EXT_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multi_draw_indirect) return; + glad_glMultiDrawArraysIndirectEXT = (PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) load(userptr, "glMultiDrawArraysIndirectEXT"); + glad_glMultiDrawElementsIndirectEXT = (PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) load(userptr, "glMultiDrawElementsIndirectEXT"); +} +static void glad_gl_load_GL_EXT_multisampled_render_to_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multisampled_render_to_texture) return; + glad_glFramebufferTexture2DMultisampleEXT = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) load(userptr, "glFramebufferTexture2DMultisampleEXT"); + glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT"); +} +static void glad_gl_load_GL_EXT_multiview_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multiview_draw_buffers) return; + glad_glDrawBuffersIndexedEXT = (PFNGLDRAWBUFFERSINDEXEDEXTPROC) load(userptr, "glDrawBuffersIndexedEXT"); + glad_glGetIntegeri_vEXT = (PFNGLGETINTEGERI_VEXTPROC) load(userptr, "glGetIntegeri_vEXT"); + glad_glReadBufferIndexedEXT = (PFNGLREADBUFFERINDEXEDEXTPROC) load(userptr, "glReadBufferIndexedEXT"); +} +static void glad_gl_load_GL_EXT_occlusion_query_boolean( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_occlusion_query_boolean) return; + glad_glBeginQueryEXT = (PFNGLBEGINQUERYEXTPROC) load(userptr, "glBeginQueryEXT"); + glad_glDeleteQueriesEXT = (PFNGLDELETEQUERIESEXTPROC) load(userptr, "glDeleteQueriesEXT"); + glad_glEndQueryEXT = (PFNGLENDQUERYEXTPROC) load(userptr, "glEndQueryEXT"); + glad_glGenQueriesEXT = (PFNGLGENQUERIESEXTPROC) load(userptr, "glGenQueriesEXT"); + glad_glGetQueryObjectuivEXT = (PFNGLGETQUERYOBJECTUIVEXTPROC) load(userptr, "glGetQueryObjectuivEXT"); + glad_glGetQueryivEXT = (PFNGLGETQUERYIVEXTPROC) load(userptr, "glGetQueryivEXT"); + glad_glIsQueryEXT = (PFNGLISQUERYEXTPROC) load(userptr, "glIsQueryEXT"); +} +static void glad_gl_load_GL_EXT_primitive_bounding_box( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_primitive_bounding_box) return; + glad_glPrimitiveBoundingBoxEXT = (PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) load(userptr, "glPrimitiveBoundingBoxEXT"); +} +static void glad_gl_load_GL_EXT_robustness( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_robustness) return; + glad_glGetGraphicsResetStatusEXT = (PFNGLGETGRAPHICSRESETSTATUSEXTPROC) load(userptr, "glGetGraphicsResetStatusEXT"); + glad_glGetnUniformfvEXT = (PFNGLGETNUNIFORMFVEXTPROC) load(userptr, "glGetnUniformfvEXT"); + glad_glGetnUniformivEXT = (PFNGLGETNUNIFORMIVEXTPROC) load(userptr, "glGetnUniformivEXT"); + glad_glReadnPixelsEXT = (PFNGLREADNPIXELSEXTPROC) load(userptr, "glReadnPixelsEXT"); +} +static void glad_gl_load_GL_EXT_shader_pixel_local_storage2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_shader_pixel_local_storage2) return; + glad_glClearPixelLocalStorageuiEXT = (PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) load(userptr, "glClearPixelLocalStorageuiEXT"); + glad_glFramebufferPixelLocalStorageSizeEXT = (PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) load(userptr, "glFramebufferPixelLocalStorageSizeEXT"); + glad_glGetFramebufferPixelLocalStorageSizeEXT = (PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) load(userptr, "glGetFramebufferPixelLocalStorageSizeEXT"); +} +static void glad_gl_load_GL_EXT_sparse_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_sparse_texture) return; + glad_glTexPageCommitmentEXT = (PFNGLTEXPAGECOMMITMENTEXTPROC) load(userptr, "glTexPageCommitmentEXT"); +} +static void glad_gl_load_GL_EXT_tessellation_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_tessellation_shader) return; + glad_glPatchParameteriEXT = (PFNGLPATCHPARAMETERIEXTPROC) load(userptr, "glPatchParameteriEXT"); +} +static void glad_gl_load_GL_EXT_texture_border_clamp( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_border_clamp) return; + glad_glGetSamplerParameterIivEXT = (PFNGLGETSAMPLERPARAMETERIIVEXTPROC) load(userptr, "glGetSamplerParameterIivEXT"); + glad_glGetSamplerParameterIuivEXT = (PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) load(userptr, "glGetSamplerParameterIuivEXT"); + glad_glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC) load(userptr, "glGetTexParameterIivEXT"); + glad_glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC) load(userptr, "glGetTexParameterIuivEXT"); + glad_glSamplerParameterIivEXT = (PFNGLSAMPLERPARAMETERIIVEXTPROC) load(userptr, "glSamplerParameterIivEXT"); + glad_glSamplerParameterIuivEXT = (PFNGLSAMPLERPARAMETERIUIVEXTPROC) load(userptr, "glSamplerParameterIuivEXT"); + glad_glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC) load(userptr, "glTexParameterIivEXT"); + glad_glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC) load(userptr, "glTexParameterIuivEXT"); +} +static void glad_gl_load_GL_EXT_texture_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_buffer) return; + glad_glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC) load(userptr, "glTexBufferEXT"); + glad_glTexBufferRangeEXT = (PFNGLTEXBUFFERRANGEEXTPROC) load(userptr, "glTexBufferRangeEXT"); +} +static void glad_gl_load_GL_EXT_texture_storage_compression( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_storage_compression) return; + glad_glTexStorageAttribs2DEXT = (PFNGLTEXSTORAGEATTRIBS2DEXTPROC) load(userptr, "glTexStorageAttribs2DEXT"); + glad_glTexStorageAttribs3DEXT = (PFNGLTEXSTORAGEATTRIBS3DEXTPROC) load(userptr, "glTexStorageAttribs3DEXT"); +} +static void glad_gl_load_GL_EXT_texture_view( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_view) return; + glad_glTextureViewEXT = (PFNGLTEXTUREVIEWEXTPROC) load(userptr, "glTextureViewEXT"); +} +static void glad_gl_load_GL_IMG_bindless_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IMG_bindless_texture) return; + glad_glGetTextureHandleIMG = (PFNGLGETTEXTUREHANDLEIMGPROC) load(userptr, "glGetTextureHandleIMG"); + glad_glGetTextureSamplerHandleIMG = (PFNGLGETTEXTURESAMPLERHANDLEIMGPROC) load(userptr, "glGetTextureSamplerHandleIMG"); + glad_glProgramUniformHandleui64IMG = (PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC) load(userptr, "glProgramUniformHandleui64IMG"); + glad_glProgramUniformHandleui64vIMG = (PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC) load(userptr, "glProgramUniformHandleui64vIMG"); + glad_glUniformHandleui64IMG = (PFNGLUNIFORMHANDLEUI64IMGPROC) load(userptr, "glUniformHandleui64IMG"); + glad_glUniformHandleui64vIMG = (PFNGLUNIFORMHANDLEUI64VIMGPROC) load(userptr, "glUniformHandleui64vIMG"); +} +static void glad_gl_load_GL_IMG_framebuffer_downsample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IMG_framebuffer_downsample) return; + glad_glFramebufferTexture2DDownsampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC) load(userptr, "glFramebufferTexture2DDownsampleIMG"); + glad_glFramebufferTextureLayerDownsampleIMG = (PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC) load(userptr, "glFramebufferTextureLayerDownsampleIMG"); +} +static void glad_gl_load_GL_IMG_multisampled_render_to_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_IMG_multisampled_render_to_texture) return; + glad_glFramebufferTexture2DMultisampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) load(userptr, "glFramebufferTexture2DMultisampleIMG"); + glad_glRenderbufferStorageMultisampleIMG = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) load(userptr, "glRenderbufferStorageMultisampleIMG"); +} +static void glad_gl_load_GL_MESA_sampler_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_MESA_sampler_objects) return; + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); +} +static void glad_gl_load_GL_NV_copy_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_copy_buffer) return; + glad_glCopyBufferSubDataNV = (PFNGLCOPYBUFFERSUBDATANVPROC) load(userptr, "glCopyBufferSubDataNV"); +} +static void glad_gl_load_GL_NV_coverage_sample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_coverage_sample) return; + glad_glCoverageMaskNV = (PFNGLCOVERAGEMASKNVPROC) load(userptr, "glCoverageMaskNV"); + glad_glCoverageOperationNV = (PFNGLCOVERAGEOPERATIONNVPROC) load(userptr, "glCoverageOperationNV"); +} +static void glad_gl_load_GL_NV_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_draw_buffers) return; + glad_glDrawBuffersNV = (PFNGLDRAWBUFFERSNVPROC) load(userptr, "glDrawBuffersNV"); +} +static void glad_gl_load_GL_NV_draw_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_draw_instanced) return; + glad_glDrawArraysInstancedNV = (PFNGLDRAWARRAYSINSTANCEDNVPROC) load(userptr, "glDrawArraysInstancedNV"); + glad_glDrawElementsInstancedNV = (PFNGLDRAWELEMENTSINSTANCEDNVPROC) load(userptr, "glDrawElementsInstancedNV"); +} +static void glad_gl_load_GL_NV_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_framebuffer_blit) return; + glad_glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC) load(userptr, "glBlitFramebufferNV"); +} +static void glad_gl_load_GL_NV_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_framebuffer_multisample) return; + glad_glRenderbufferStorageMultisampleNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) load(userptr, "glRenderbufferStorageMultisampleNV"); +} +static void glad_gl_load_GL_NV_instanced_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_instanced_arrays) return; + glad_glVertexAttribDivisorNV = (PFNGLVERTEXATTRIBDIVISORNVPROC) load(userptr, "glVertexAttribDivisorNV"); +} +static void glad_gl_load_GL_NV_non_square_matrices( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_non_square_matrices) return; + glad_glUniformMatrix2x3fvNV = (PFNGLUNIFORMMATRIX2X3FVNVPROC) load(userptr, "glUniformMatrix2x3fvNV"); + glad_glUniformMatrix2x4fvNV = (PFNGLUNIFORMMATRIX2X4FVNVPROC) load(userptr, "glUniformMatrix2x4fvNV"); + glad_glUniformMatrix3x2fvNV = (PFNGLUNIFORMMATRIX3X2FVNVPROC) load(userptr, "glUniformMatrix3x2fvNV"); + glad_glUniformMatrix3x4fvNV = (PFNGLUNIFORMMATRIX3X4FVNVPROC) load(userptr, "glUniformMatrix3x4fvNV"); + glad_glUniformMatrix4x2fvNV = (PFNGLUNIFORMMATRIX4X2FVNVPROC) load(userptr, "glUniformMatrix4x2fvNV"); + glad_glUniformMatrix4x3fvNV = (PFNGLUNIFORMMATRIX4X3FVNVPROC) load(userptr, "glUniformMatrix4x3fvNV"); +} +static void glad_gl_load_GL_NV_polygon_mode( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_polygon_mode) return; + glad_glPolygonModeNV = (PFNGLPOLYGONMODENVPROC) load(userptr, "glPolygonModeNV"); +} +static void glad_gl_load_GL_NV_read_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_read_buffer) return; + glad_glReadBufferNV = (PFNGLREADBUFFERNVPROC) load(userptr, "glReadBufferNV"); +} +static void glad_gl_load_GL_NV_viewport_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_viewport_array) return; + glad_glDepthRangeArrayfvNV = (PFNGLDEPTHRANGEARRAYFVNVPROC) load(userptr, "glDepthRangeArrayfvNV"); + glad_glDepthRangeIndexedfNV = (PFNGLDEPTHRANGEINDEXEDFNVPROC) load(userptr, "glDepthRangeIndexedfNV"); + glad_glDisableiNV = (PFNGLDISABLEINVPROC) load(userptr, "glDisableiNV"); + glad_glEnableiNV = (PFNGLENABLEINVPROC) load(userptr, "glEnableiNV"); + glad_glGetFloati_vNV = (PFNGLGETFLOATI_VNVPROC) load(userptr, "glGetFloati_vNV"); + glad_glIsEnablediNV = (PFNGLISENABLEDINVPROC) load(userptr, "glIsEnablediNV"); + glad_glScissorArrayvNV = (PFNGLSCISSORARRAYVNVPROC) load(userptr, "glScissorArrayvNV"); + glad_glScissorIndexedNV = (PFNGLSCISSORINDEXEDNVPROC) load(userptr, "glScissorIndexedNV"); + glad_glScissorIndexedvNV = (PFNGLSCISSORINDEXEDVNVPROC) load(userptr, "glScissorIndexedvNV"); + glad_glViewportArrayvNV = (PFNGLVIEWPORTARRAYVNVPROC) load(userptr, "glViewportArrayvNV"); + glad_glViewportIndexedfNV = (PFNGLVIEWPORTINDEXEDFNVPROC) load(userptr, "glViewportIndexedfNV"); + glad_glViewportIndexedfvNV = (PFNGLVIEWPORTINDEXEDFVNVPROC) load(userptr, "glViewportIndexedfvNV"); +} +static void glad_gl_load_GL_OES_EGL_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_EGL_image) return; + glad_glEGLImageTargetRenderbufferStorageOES = (PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) load(userptr, "glEGLImageTargetRenderbufferStorageOES"); + glad_glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) load(userptr, "glEGLImageTargetTexture2DOES"); +} +static void glad_gl_load_GL_OES_copy_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_copy_image) return; + glad_glCopyImageSubDataOES = (PFNGLCOPYIMAGESUBDATAOESPROC) load(userptr, "glCopyImageSubDataOES"); +} +static void glad_gl_load_GL_OES_draw_buffers_indexed( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_draw_buffers_indexed) return; + glad_glBlendEquationSeparateiOES = (PFNGLBLENDEQUATIONSEPARATEIOESPROC) load(userptr, "glBlendEquationSeparateiOES"); + glad_glBlendEquationiOES = (PFNGLBLENDEQUATIONIOESPROC) load(userptr, "glBlendEquationiOES"); + glad_glBlendFuncSeparateiOES = (PFNGLBLENDFUNCSEPARATEIOESPROC) load(userptr, "glBlendFuncSeparateiOES"); + glad_glBlendFunciOES = (PFNGLBLENDFUNCIOESPROC) load(userptr, "glBlendFunciOES"); + glad_glColorMaskiOES = (PFNGLCOLORMASKIOESPROC) load(userptr, "glColorMaskiOES"); + glad_glDisableiOES = (PFNGLDISABLEIOESPROC) load(userptr, "glDisableiOES"); + glad_glEnableiOES = (PFNGLENABLEIOESPROC) load(userptr, "glEnableiOES"); + glad_glIsEnablediOES = (PFNGLISENABLEDIOESPROC) load(userptr, "glIsEnablediOES"); +} +static void glad_gl_load_GL_OES_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_draw_elements_base_vertex) return; + glad_glDrawElementsBaseVertexOES = (PFNGLDRAWELEMENTSBASEVERTEXOESPROC) load(userptr, "glDrawElementsBaseVertexOES"); + glad_glDrawElementsInstancedBaseVertexOES = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) load(userptr, "glDrawElementsInstancedBaseVertexOES"); + glad_glDrawRangeElementsBaseVertexOES = (PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) load(userptr, "glDrawRangeElementsBaseVertexOES"); + glad_glMultiDrawElementsBaseVertexEXT = (PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) load(userptr, "glMultiDrawElementsBaseVertexEXT"); +} +static void glad_gl_load_GL_OES_geometry_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_geometry_shader) return; + glad_glFramebufferTextureOES = (PFNGLFRAMEBUFFERTEXTUREOESPROC) load(userptr, "glFramebufferTextureOES"); +} +static void glad_gl_load_GL_OES_get_program_binary( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_get_program_binary) return; + glad_glGetProgramBinaryOES = (PFNGLGETPROGRAMBINARYOESPROC) load(userptr, "glGetProgramBinaryOES"); + glad_glProgramBinaryOES = (PFNGLPROGRAMBINARYOESPROC) load(userptr, "glProgramBinaryOES"); +} +static void glad_gl_load_GL_OES_mapbuffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_mapbuffer) return; + glad_glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOESPROC) load(userptr, "glGetBufferPointervOES"); + glad_glMapBufferOES = (PFNGLMAPBUFFEROESPROC) load(userptr, "glMapBufferOES"); + glad_glUnmapBufferOES = (PFNGLUNMAPBUFFEROESPROC) load(userptr, "glUnmapBufferOES"); +} +static void glad_gl_load_GL_OES_primitive_bounding_box( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_primitive_bounding_box) return; + glad_glPrimitiveBoundingBoxOES = (PFNGLPRIMITIVEBOUNDINGBOXOESPROC) load(userptr, "glPrimitiveBoundingBoxOES"); +} +static void glad_gl_load_GL_OES_sample_shading( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_sample_shading) return; + glad_glMinSampleShadingOES = (PFNGLMINSAMPLESHADINGOESPROC) load(userptr, "glMinSampleShadingOES"); +} +static void glad_gl_load_GL_OES_tessellation_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_tessellation_shader) return; + glad_glPatchParameteriOES = (PFNGLPATCHPARAMETERIOESPROC) load(userptr, "glPatchParameteriOES"); +} +static void glad_gl_load_GL_OES_texture_3D( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_3D) return; + glad_glCompressedTexImage3DOES = (PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) load(userptr, "glCompressedTexImage3DOES"); + glad_glCompressedTexSubImage3DOES = (PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) load(userptr, "glCompressedTexSubImage3DOES"); + glad_glCopyTexSubImage3DOES = (PFNGLCOPYTEXSUBIMAGE3DOESPROC) load(userptr, "glCopyTexSubImage3DOES"); + glad_glFramebufferTexture3DOES = (PFNGLFRAMEBUFFERTEXTURE3DOESPROC) load(userptr, "glFramebufferTexture3DOES"); + glad_glTexImage3DOES = (PFNGLTEXIMAGE3DOESPROC) load(userptr, "glTexImage3DOES"); + glad_glTexSubImage3DOES = (PFNGLTEXSUBIMAGE3DOESPROC) load(userptr, "glTexSubImage3DOES"); +} +static void glad_gl_load_GL_OES_texture_border_clamp( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_border_clamp) return; + glad_glGetSamplerParameterIivOES = (PFNGLGETSAMPLERPARAMETERIIVOESPROC) load(userptr, "glGetSamplerParameterIivOES"); + glad_glGetSamplerParameterIuivOES = (PFNGLGETSAMPLERPARAMETERIUIVOESPROC) load(userptr, "glGetSamplerParameterIuivOES"); + glad_glGetTexParameterIivOES = (PFNGLGETTEXPARAMETERIIVOESPROC) load(userptr, "glGetTexParameterIivOES"); + glad_glGetTexParameterIuivOES = (PFNGLGETTEXPARAMETERIUIVOESPROC) load(userptr, "glGetTexParameterIuivOES"); + glad_glSamplerParameterIivOES = (PFNGLSAMPLERPARAMETERIIVOESPROC) load(userptr, "glSamplerParameterIivOES"); + glad_glSamplerParameterIuivOES = (PFNGLSAMPLERPARAMETERIUIVOESPROC) load(userptr, "glSamplerParameterIuivOES"); + glad_glTexParameterIivOES = (PFNGLTEXPARAMETERIIVOESPROC) load(userptr, "glTexParameterIivOES"); + glad_glTexParameterIuivOES = (PFNGLTEXPARAMETERIUIVOESPROC) load(userptr, "glTexParameterIuivOES"); +} +static void glad_gl_load_GL_OES_texture_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_buffer) return; + glad_glTexBufferOES = (PFNGLTEXBUFFEROESPROC) load(userptr, "glTexBufferOES"); + glad_glTexBufferRangeOES = (PFNGLTEXBUFFERRANGEOESPROC) load(userptr, "glTexBufferRangeOES"); +} +static void glad_gl_load_GL_OES_texture_storage_multisample_2d_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_storage_multisample_2d_array) return; + glad_glTexStorage3DMultisampleOES = (PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) load(userptr, "glTexStorage3DMultisampleOES"); +} +static void glad_gl_load_GL_OES_texture_view( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_view) return; + glad_glTextureViewOES = (PFNGLTEXTUREVIEWOESPROC) load(userptr, "glTextureViewOES"); +} +static void glad_gl_load_GL_OES_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_vertex_array_object) return; + glad_glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC) load(userptr, "glBindVertexArrayOES"); + glad_glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC) load(userptr, "glDeleteVertexArraysOES"); + glad_glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC) load(userptr, "glGenVertexArraysOES"); + glad_glIsVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC) load(userptr, "glIsVertexArrayOES"); +} +static void glad_gl_load_GL_OES_viewport_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_viewport_array) return; + glad_glDepthRangeArrayfvOES = (PFNGLDEPTHRANGEARRAYFVOESPROC) load(userptr, "glDepthRangeArrayfvOES"); + glad_glDepthRangeIndexedfOES = (PFNGLDEPTHRANGEINDEXEDFOESPROC) load(userptr, "glDepthRangeIndexedfOES"); + glad_glDisableiOES = (PFNGLDISABLEIOESPROC) load(userptr, "glDisableiOES"); + glad_glEnableiOES = (PFNGLENABLEIOESPROC) load(userptr, "glEnableiOES"); + glad_glGetFloati_vOES = (PFNGLGETFLOATI_VOESPROC) load(userptr, "glGetFloati_vOES"); + glad_glIsEnablediOES = (PFNGLISENABLEDIOESPROC) load(userptr, "glIsEnablediOES"); + glad_glScissorArrayvOES = (PFNGLSCISSORARRAYVOESPROC) load(userptr, "glScissorArrayvOES"); + glad_glScissorIndexedOES = (PFNGLSCISSORINDEXEDOESPROC) load(userptr, "glScissorIndexedOES"); + glad_glScissorIndexedvOES = (PFNGLSCISSORINDEXEDVOESPROC) load(userptr, "glScissorIndexedvOES"); + glad_glViewportArrayvOES = (PFNGLVIEWPORTARRAYVOESPROC) load(userptr, "glViewportArrayvOES"); + glad_glViewportIndexedfOES = (PFNGLVIEWPORTINDEXEDFOESPROC) load(userptr, "glViewportIndexedfOES"); + glad_glViewportIndexedfvOES = (PFNGLVIEWPORTINDEXEDFVOESPROC) load(userptr, "glViewportIndexedfvOES"); +} +static void glad_gl_load_GL_OVR_multiview_multisampled_render_to_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OVR_multiview_multisampled_render_to_texture) return; + glad_glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) load(userptr, "glFramebufferTextureMultisampleMultiviewOVR"); +} +static void glad_gl_load_GL_QCOM_alpha_test( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_alpha_test) return; + glad_glAlphaFuncQCOM = (PFNGLALPHAFUNCQCOMPROC) load(userptr, "glAlphaFuncQCOM"); +} +static void glad_gl_load_GL_QCOM_driver_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_driver_control) return; + glad_glDisableDriverControlQCOM = (PFNGLDISABLEDRIVERCONTROLQCOMPROC) load(userptr, "glDisableDriverControlQCOM"); + glad_glEnableDriverControlQCOM = (PFNGLENABLEDRIVERCONTROLQCOMPROC) load(userptr, "glEnableDriverControlQCOM"); + glad_glGetDriverControlStringQCOM = (PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) load(userptr, "glGetDriverControlStringQCOM"); + glad_glGetDriverControlsQCOM = (PFNGLGETDRIVERCONTROLSQCOMPROC) load(userptr, "glGetDriverControlsQCOM"); +} +static void glad_gl_load_GL_QCOM_extended_get( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_extended_get) return; + glad_glExtGetBufferPointervQCOM = (PFNGLEXTGETBUFFERPOINTERVQCOMPROC) load(userptr, "glExtGetBufferPointervQCOM"); + glad_glExtGetBuffersQCOM = (PFNGLEXTGETBUFFERSQCOMPROC) load(userptr, "glExtGetBuffersQCOM"); + glad_glExtGetFramebuffersQCOM = (PFNGLEXTGETFRAMEBUFFERSQCOMPROC) load(userptr, "glExtGetFramebuffersQCOM"); + glad_glExtGetRenderbuffersQCOM = (PFNGLEXTGETRENDERBUFFERSQCOMPROC) load(userptr, "glExtGetRenderbuffersQCOM"); + glad_glExtGetTexLevelParameterivQCOM = (PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) load(userptr, "glExtGetTexLevelParameterivQCOM"); + glad_glExtGetTexSubImageQCOM = (PFNGLEXTGETTEXSUBIMAGEQCOMPROC) load(userptr, "glExtGetTexSubImageQCOM"); + glad_glExtGetTexturesQCOM = (PFNGLEXTGETTEXTURESQCOMPROC) load(userptr, "glExtGetTexturesQCOM"); + glad_glExtTexObjectStateOverrideiQCOM = (PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) load(userptr, "glExtTexObjectStateOverrideiQCOM"); +} +static void glad_gl_load_GL_QCOM_extended_get2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_extended_get2) return; + glad_glExtGetProgramBinarySourceQCOM = (PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) load(userptr, "glExtGetProgramBinarySourceQCOM"); + glad_glExtGetProgramsQCOM = (PFNGLEXTGETPROGRAMSQCOMPROC) load(userptr, "glExtGetProgramsQCOM"); + glad_glExtGetShadersQCOM = (PFNGLEXTGETSHADERSQCOMPROC) load(userptr, "glExtGetShadersQCOM"); + glad_glExtIsProgramBinaryQCOM = (PFNGLEXTISPROGRAMBINARYQCOMPROC) load(userptr, "glExtIsProgramBinaryQCOM"); +} +static void glad_gl_load_GL_QCOM_frame_extrapolation( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_frame_extrapolation) return; + glad_glExtrapolateTex2DQCOM = (PFNGLEXTRAPOLATETEX2DQCOMPROC) load(userptr, "glExtrapolateTex2DQCOM"); +} +static void glad_gl_load_GL_QCOM_framebuffer_foveated( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_framebuffer_foveated) return; + glad_glFramebufferFoveationConfigQCOM = (PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) load(userptr, "glFramebufferFoveationConfigQCOM"); + glad_glFramebufferFoveationParametersQCOM = (PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) load(userptr, "glFramebufferFoveationParametersQCOM"); +} +static void glad_gl_load_GL_QCOM_motion_estimation( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_motion_estimation) return; + glad_glTexEstimateMotionQCOM = (PFNGLTEXESTIMATEMOTIONQCOMPROC) load(userptr, "glTexEstimateMotionQCOM"); + glad_glTexEstimateMotionRegionsQCOM = (PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC) load(userptr, "glTexEstimateMotionRegionsQCOM"); +} +static void glad_gl_load_GL_QCOM_shader_framebuffer_fetch_noncoherent( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_shader_framebuffer_fetch_noncoherent) return; + glad_glFramebufferFetchBarrierQCOM = (PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) load(userptr, "glFramebufferFetchBarrierQCOM"); +} +static void glad_gl_load_GL_QCOM_shading_rate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_shading_rate) return; + glad_glShadingRateQCOM = (PFNGLSHADINGRATEQCOMPROC) load(userptr, "glShadingRateQCOM"); +} +static void glad_gl_load_GL_QCOM_texture_foveated( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_texture_foveated) return; + glad_glTextureFoveationParametersQCOM = (PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) load(userptr, "glTextureFoveationParametersQCOM"); +} +static void glad_gl_load_GL_QCOM_tiled_rendering( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_QCOM_tiled_rendering) return; + glad_glEndTilingQCOM = (PFNGLENDTILINGQCOMPROC) load(userptr, "glEndTilingQCOM"); + glad_glStartTilingQCOM = (PFNGLSTARTTILINGQCOMPROC) load(userptr, "glStartTilingQCOM"); +} + + + +static void glad_gl_free_extensions(char **exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + free((void *) (exts_i[index])); + } + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_get_extensions( const char **out_exts, char ***out_exts_i) { +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) + if (glad_glGetStringi != NULL && glad_glGetIntegerv != NULL) { + unsigned int index = 0; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); + exts_i = (char **) malloc((num_exts_i + 1) * (sizeof *exts_i)); + if (exts_i == NULL) { + return 0; + } + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp) + 1; + + char *local_str = (char*) malloc(len * sizeof(char)); + if(local_str == NULL) { + exts_i[index] = NULL; + glad_gl_free_extensions(exts_i); + return 0; + } + + memcpy(local_str, gl_str_tmp, len * sizeof(char)); + exts_i[index] = local_str; + } + exts_i[index] = NULL; + + *out_exts_i = exts_i; + + return 1; + } +#else + GLAD_UNUSED(out_exts_i); +#endif + if (glad_glGetString == NULL) { + return 0; + } + *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); + return 1; +} +static int glad_gl_has_extension(const char *exts, char **exts_i, const char *ext) { + if(exts_i) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } + } + } else { + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } + } + return 0; +} + +static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_gl_find_extensions_gl(void) { + const char *exts = NULL; + char **exts_i = NULL; + if (!glad_gl_get_extensions(&exts, &exts_i)) return 0; + + GLAD_GL_3DFX_multisample = glad_gl_has_extension(exts, exts_i, "GL_3DFX_multisample"); + GLAD_GL_3DFX_tbuffer = glad_gl_has_extension(exts, exts_i, "GL_3DFX_tbuffer"); + GLAD_GL_3DFX_texture_compression_FXT1 = glad_gl_has_extension(exts, exts_i, "GL_3DFX_texture_compression_FXT1"); + GLAD_GL_AMD_blend_minmax_factor = glad_gl_has_extension(exts, exts_i, "GL_AMD_blend_minmax_factor"); + GLAD_GL_AMD_conservative_depth = glad_gl_has_extension(exts, exts_i, "GL_AMD_conservative_depth"); + GLAD_GL_AMD_debug_output = glad_gl_has_extension(exts, exts_i, "GL_AMD_debug_output"); + GLAD_GL_AMD_depth_clamp_separate = glad_gl_has_extension(exts, exts_i, "GL_AMD_depth_clamp_separate"); + GLAD_GL_AMD_draw_buffers_blend = glad_gl_has_extension(exts, exts_i, "GL_AMD_draw_buffers_blend"); + GLAD_GL_AMD_framebuffer_multisample_advanced = glad_gl_has_extension(exts, exts_i, "GL_AMD_framebuffer_multisample_advanced"); + GLAD_GL_AMD_framebuffer_sample_positions = glad_gl_has_extension(exts, exts_i, "GL_AMD_framebuffer_sample_positions"); + GLAD_GL_AMD_gcn_shader = glad_gl_has_extension(exts, exts_i, "GL_AMD_gcn_shader"); + GLAD_GL_AMD_gpu_shader_half_float = glad_gl_has_extension(exts, exts_i, "GL_AMD_gpu_shader_half_float"); + GLAD_GL_AMD_gpu_shader_int16 = glad_gl_has_extension(exts, exts_i, "GL_AMD_gpu_shader_int16"); + GLAD_GL_AMD_gpu_shader_int64 = glad_gl_has_extension(exts, exts_i, "GL_AMD_gpu_shader_int64"); + GLAD_GL_AMD_interleaved_elements = glad_gl_has_extension(exts, exts_i, "GL_AMD_interleaved_elements"); + GLAD_GL_AMD_multi_draw_indirect = glad_gl_has_extension(exts, exts_i, "GL_AMD_multi_draw_indirect"); + GLAD_GL_AMD_name_gen_delete = glad_gl_has_extension(exts, exts_i, "GL_AMD_name_gen_delete"); + GLAD_GL_AMD_occlusion_query_event = glad_gl_has_extension(exts, exts_i, "GL_AMD_occlusion_query_event"); + GLAD_GL_AMD_performance_monitor = glad_gl_has_extension(exts, exts_i, "GL_AMD_performance_monitor"); + GLAD_GL_AMD_pinned_memory = glad_gl_has_extension(exts, exts_i, "GL_AMD_pinned_memory"); + GLAD_GL_AMD_query_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_AMD_query_buffer_object"); + GLAD_GL_AMD_sample_positions = glad_gl_has_extension(exts, exts_i, "GL_AMD_sample_positions"); + GLAD_GL_AMD_seamless_cubemap_per_texture = glad_gl_has_extension(exts, exts_i, "GL_AMD_seamless_cubemap_per_texture"); + GLAD_GL_AMD_shader_atomic_counter_ops = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_atomic_counter_ops"); + GLAD_GL_AMD_shader_ballot = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_ballot"); + GLAD_GL_AMD_shader_explicit_vertex_parameter = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_explicit_vertex_parameter"); + GLAD_GL_AMD_shader_gpu_shader_half_float_fetch = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_gpu_shader_half_float_fetch"); + GLAD_GL_AMD_shader_image_load_store_lod = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_image_load_store_lod"); + GLAD_GL_AMD_shader_stencil_export = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_stencil_export"); + GLAD_GL_AMD_shader_trinary_minmax = glad_gl_has_extension(exts, exts_i, "GL_AMD_shader_trinary_minmax"); + GLAD_GL_AMD_sparse_texture = glad_gl_has_extension(exts, exts_i, "GL_AMD_sparse_texture"); + GLAD_GL_AMD_stencil_operation_extended = glad_gl_has_extension(exts, exts_i, "GL_AMD_stencil_operation_extended"); + GLAD_GL_AMD_texture_gather_bias_lod = glad_gl_has_extension(exts, exts_i, "GL_AMD_texture_gather_bias_lod"); + GLAD_GL_AMD_texture_texture4 = glad_gl_has_extension(exts, exts_i, "GL_AMD_texture_texture4"); + GLAD_GL_AMD_transform_feedback3_lines_triangles = glad_gl_has_extension(exts, exts_i, "GL_AMD_transform_feedback3_lines_triangles"); + GLAD_GL_AMD_transform_feedback4 = glad_gl_has_extension(exts, exts_i, "GL_AMD_transform_feedback4"); + GLAD_GL_AMD_vertex_shader_layer = glad_gl_has_extension(exts, exts_i, "GL_AMD_vertex_shader_layer"); + GLAD_GL_AMD_vertex_shader_tessellator = glad_gl_has_extension(exts, exts_i, "GL_AMD_vertex_shader_tessellator"); + GLAD_GL_AMD_vertex_shader_viewport_index = glad_gl_has_extension(exts, exts_i, "GL_AMD_vertex_shader_viewport_index"); + GLAD_GL_APPLE_aux_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_APPLE_aux_depth_stencil"); + GLAD_GL_APPLE_client_storage = glad_gl_has_extension(exts, exts_i, "GL_APPLE_client_storage"); + GLAD_GL_APPLE_element_array = glad_gl_has_extension(exts, exts_i, "GL_APPLE_element_array"); + GLAD_GL_APPLE_fence = glad_gl_has_extension(exts, exts_i, "GL_APPLE_fence"); + GLAD_GL_APPLE_float_pixels = glad_gl_has_extension(exts, exts_i, "GL_APPLE_float_pixels"); + GLAD_GL_APPLE_flush_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_APPLE_flush_buffer_range"); + GLAD_GL_APPLE_object_purgeable = glad_gl_has_extension(exts, exts_i, "GL_APPLE_object_purgeable"); + GLAD_GL_APPLE_rgb_422 = glad_gl_has_extension(exts, exts_i, "GL_APPLE_rgb_422"); + GLAD_GL_APPLE_row_bytes = glad_gl_has_extension(exts, exts_i, "GL_APPLE_row_bytes"); + GLAD_GL_APPLE_specular_vector = glad_gl_has_extension(exts, exts_i, "GL_APPLE_specular_vector"); + GLAD_GL_APPLE_texture_range = glad_gl_has_extension(exts, exts_i, "GL_APPLE_texture_range"); + GLAD_GL_APPLE_transform_hint = glad_gl_has_extension(exts, exts_i, "GL_APPLE_transform_hint"); + GLAD_GL_APPLE_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_APPLE_vertex_array_object"); + GLAD_GL_APPLE_vertex_array_range = glad_gl_has_extension(exts, exts_i, "GL_APPLE_vertex_array_range"); + GLAD_GL_APPLE_vertex_program_evaluators = glad_gl_has_extension(exts, exts_i, "GL_APPLE_vertex_program_evaluators"); + GLAD_GL_APPLE_ycbcr_422 = glad_gl_has_extension(exts, exts_i, "GL_APPLE_ycbcr_422"); + GLAD_GL_ARB_ES2_compatibility = glad_gl_has_extension(exts, exts_i, "GL_ARB_ES2_compatibility"); + GLAD_GL_ARB_ES3_1_compatibility = glad_gl_has_extension(exts, exts_i, "GL_ARB_ES3_1_compatibility"); + GLAD_GL_ARB_ES3_2_compatibility = glad_gl_has_extension(exts, exts_i, "GL_ARB_ES3_2_compatibility"); + GLAD_GL_ARB_ES3_compatibility = glad_gl_has_extension(exts, exts_i, "GL_ARB_ES3_compatibility"); + GLAD_GL_ARB_arrays_of_arrays = glad_gl_has_extension(exts, exts_i, "GL_ARB_arrays_of_arrays"); + GLAD_GL_ARB_base_instance = glad_gl_has_extension(exts, exts_i, "GL_ARB_base_instance"); + GLAD_GL_ARB_bindless_texture = glad_gl_has_extension(exts, exts_i, "GL_ARB_bindless_texture"); + GLAD_GL_ARB_blend_func_extended = glad_gl_has_extension(exts, exts_i, "GL_ARB_blend_func_extended"); + GLAD_GL_ARB_buffer_storage = glad_gl_has_extension(exts, exts_i, "GL_ARB_buffer_storage"); + GLAD_GL_ARB_cl_event = glad_gl_has_extension(exts, exts_i, "GL_ARB_cl_event"); + GLAD_GL_ARB_clear_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_clear_buffer_object"); + GLAD_GL_ARB_clear_texture = glad_gl_has_extension(exts, exts_i, "GL_ARB_clear_texture"); + GLAD_GL_ARB_clip_control = glad_gl_has_extension(exts, exts_i, "GL_ARB_clip_control"); + GLAD_GL_ARB_color_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_ARB_color_buffer_float"); + GLAD_GL_ARB_compatibility = glad_gl_has_extension(exts, exts_i, "GL_ARB_compatibility"); + GLAD_GL_ARB_compressed_texture_pixel_storage = glad_gl_has_extension(exts, exts_i, "GL_ARB_compressed_texture_pixel_storage"); + GLAD_GL_ARB_compute_shader = glad_gl_has_extension(exts, exts_i, "GL_ARB_compute_shader"); + GLAD_GL_ARB_compute_variable_group_size = glad_gl_has_extension(exts, exts_i, "GL_ARB_compute_variable_group_size"); + GLAD_GL_ARB_conditional_render_inverted = glad_gl_has_extension(exts, exts_i, "GL_ARB_conditional_render_inverted"); + GLAD_GL_ARB_conservative_depth = glad_gl_has_extension(exts, exts_i, "GL_ARB_conservative_depth"); + GLAD_GL_ARB_copy_buffer = glad_gl_has_extension(exts, exts_i, "GL_ARB_copy_buffer"); + GLAD_GL_ARB_copy_image = glad_gl_has_extension(exts, exts_i, "GL_ARB_copy_image"); + GLAD_GL_ARB_cull_distance = glad_gl_has_extension(exts, exts_i, "GL_ARB_cull_distance"); + GLAD_GL_ARB_debug_output = glad_gl_has_extension(exts, exts_i, "GL_ARB_debug_output"); + GLAD_GL_ARB_depth_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_ARB_depth_buffer_float"); + GLAD_GL_ARB_depth_clamp = glad_gl_has_extension(exts, exts_i, "GL_ARB_depth_clamp"); + GLAD_GL_ARB_depth_texture = glad_gl_has_extension(exts, exts_i, "GL_ARB_depth_texture"); + GLAD_GL_ARB_derivative_control = glad_gl_has_extension(exts, exts_i, "GL_ARB_derivative_control"); + GLAD_GL_ARB_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_ARB_direct_state_access"); + GLAD_GL_ARB_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_buffers"); + GLAD_GL_ARB_draw_buffers_blend = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_buffers_blend"); + GLAD_GL_ARB_draw_elements_base_vertex = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_elements_base_vertex"); + GLAD_GL_ARB_draw_indirect = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_indirect"); + GLAD_GL_ARB_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_instanced"); + GLAD_GL_ARB_enhanced_layouts = glad_gl_has_extension(exts, exts_i, "GL_ARB_enhanced_layouts"); + GLAD_GL_ARB_explicit_attrib_location = glad_gl_has_extension(exts, exts_i, "GL_ARB_explicit_attrib_location"); + GLAD_GL_ARB_explicit_uniform_location = glad_gl_has_extension(exts, exts_i, "GL_ARB_explicit_uniform_location"); + GLAD_GL_ARB_fragment_coord_conventions = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_coord_conventions"); + GLAD_GL_ARB_fragment_layer_viewport = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_layer_viewport"); + GLAD_GL_ARB_fragment_program = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_program"); + GLAD_GL_ARB_fragment_program_shadow = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_program_shadow"); + GLAD_GL_ARB_fragment_shader = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_shader"); + GLAD_GL_ARB_fragment_shader_interlock = glad_gl_has_extension(exts, exts_i, "GL_ARB_fragment_shader_interlock"); + GLAD_GL_ARB_framebuffer_no_attachments = glad_gl_has_extension(exts, exts_i, "GL_ARB_framebuffer_no_attachments"); + GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_framebuffer_object"); + GLAD_GL_ARB_framebuffer_sRGB = glad_gl_has_extension(exts, exts_i, "GL_ARB_framebuffer_sRGB"); + GLAD_GL_ARB_geometry_shader4 = glad_gl_has_extension(exts, exts_i, "GL_ARB_geometry_shader4"); + GLAD_GL_ARB_get_program_binary = glad_gl_has_extension(exts, exts_i, "GL_ARB_get_program_binary"); + GLAD_GL_ARB_get_texture_sub_image = glad_gl_has_extension(exts, exts_i, "GL_ARB_get_texture_sub_image"); + GLAD_GL_ARB_gl_spirv = glad_gl_has_extension(exts, exts_i, "GL_ARB_gl_spirv"); + GLAD_GL_ARB_gpu_shader5 = glad_gl_has_extension(exts, exts_i, "GL_ARB_gpu_shader5"); + GLAD_GL_ARB_gpu_shader_fp64 = glad_gl_has_extension(exts, exts_i, "GL_ARB_gpu_shader_fp64"); + GLAD_GL_ARB_gpu_shader_int64 = glad_gl_has_extension(exts, exts_i, "GL_ARB_gpu_shader_int64"); + GLAD_GL_ARB_half_float_pixel = glad_gl_has_extension(exts, exts_i, "GL_ARB_half_float_pixel"); + GLAD_GL_ARB_half_float_vertex = glad_gl_has_extension(exts, exts_i, "GL_ARB_half_float_vertex"); + GLAD_GL_ARB_imaging = glad_gl_has_extension(exts, exts_i, "GL_ARB_imaging"); + GLAD_GL_ARB_indirect_parameters = glad_gl_has_extension(exts, exts_i, "GL_ARB_indirect_parameters"); + GLAD_GL_ARB_instanced_arrays = glad_gl_has_extension(exts, exts_i, "GL_ARB_instanced_arrays"); + GLAD_GL_ARB_internalformat_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_internalformat_query"); + GLAD_GL_ARB_internalformat_query2 = glad_gl_has_extension(exts, exts_i, "GL_ARB_internalformat_query2"); + GLAD_GL_ARB_invalidate_subdata = glad_gl_has_extension(exts, exts_i, "GL_ARB_invalidate_subdata"); + GLAD_GL_ARB_map_buffer_alignment = glad_gl_has_extension(exts, exts_i, "GL_ARB_map_buffer_alignment"); + GLAD_GL_ARB_map_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_ARB_map_buffer_range"); + GLAD_GL_ARB_matrix_palette = glad_gl_has_extension(exts, exts_i, "GL_ARB_matrix_palette"); + GLAD_GL_ARB_multi_bind = glad_gl_has_extension(exts, exts_i, "GL_ARB_multi_bind"); + GLAD_GL_ARB_multi_draw_indirect = glad_gl_has_extension(exts, exts_i, "GL_ARB_multi_draw_indirect"); + GLAD_GL_ARB_multisample = glad_gl_has_extension(exts, exts_i, "GL_ARB_multisample"); + GLAD_GL_ARB_multitexture = glad_gl_has_extension(exts, exts_i, "GL_ARB_multitexture"); + GLAD_GL_ARB_occlusion_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_occlusion_query"); + GLAD_GL_ARB_occlusion_query2 = glad_gl_has_extension(exts, exts_i, "GL_ARB_occlusion_query2"); + GLAD_GL_ARB_parallel_shader_compile = glad_gl_has_extension(exts, exts_i, "GL_ARB_parallel_shader_compile"); + GLAD_GL_ARB_pipeline_statistics_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_pipeline_statistics_query"); + GLAD_GL_ARB_pixel_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_pixel_buffer_object"); + GLAD_GL_ARB_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_ARB_point_parameters"); + GLAD_GL_ARB_point_sprite = glad_gl_has_extension(exts, exts_i, "GL_ARB_point_sprite"); + GLAD_GL_ARB_polygon_offset_clamp = glad_gl_has_extension(exts, exts_i, "GL_ARB_polygon_offset_clamp"); + GLAD_GL_ARB_post_depth_coverage = glad_gl_has_extension(exts, exts_i, "GL_ARB_post_depth_coverage"); + GLAD_GL_ARB_program_interface_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_program_interface_query"); + GLAD_GL_ARB_provoking_vertex = glad_gl_has_extension(exts, exts_i, "GL_ARB_provoking_vertex"); + GLAD_GL_ARB_query_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_query_buffer_object"); + GLAD_GL_ARB_robust_buffer_access_behavior = glad_gl_has_extension(exts, exts_i, "GL_ARB_robust_buffer_access_behavior"); + GLAD_GL_ARB_robustness = glad_gl_has_extension(exts, exts_i, "GL_ARB_robustness"); + GLAD_GL_ARB_robustness_isolation = glad_gl_has_extension(exts, exts_i, "GL_ARB_robustness_isolation"); + GLAD_GL_ARB_sample_locations = glad_gl_has_extension(exts, exts_i, "GL_ARB_sample_locations"); + GLAD_GL_ARB_sample_shading = glad_gl_has_extension(exts, exts_i, "GL_ARB_sample_shading"); + GLAD_GL_ARB_sampler_objects = glad_gl_has_extension(exts, exts_i, "GL_ARB_sampler_objects"); + GLAD_GL_ARB_seamless_cube_map = glad_gl_has_extension(exts, exts_i, "GL_ARB_seamless_cube_map"); + GLAD_GL_ARB_seamless_cubemap_per_texture = glad_gl_has_extension(exts, exts_i, "GL_ARB_seamless_cubemap_per_texture"); + GLAD_GL_ARB_separate_shader_objects = glad_gl_has_extension(exts, exts_i, "GL_ARB_separate_shader_objects"); + GLAD_GL_ARB_shader_atomic_counter_ops = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_atomic_counter_ops"); + GLAD_GL_ARB_shader_atomic_counters = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_atomic_counters"); + GLAD_GL_ARB_shader_ballot = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_ballot"); + GLAD_GL_ARB_shader_bit_encoding = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_bit_encoding"); + GLAD_GL_ARB_shader_clock = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_clock"); + GLAD_GL_ARB_shader_draw_parameters = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_draw_parameters"); + GLAD_GL_ARB_shader_group_vote = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_group_vote"); + GLAD_GL_ARB_shader_image_load_store = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_image_load_store"); + GLAD_GL_ARB_shader_image_size = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_image_size"); + GLAD_GL_ARB_shader_objects = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_objects"); + GLAD_GL_ARB_shader_precision = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_precision"); + GLAD_GL_ARB_shader_stencil_export = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_stencil_export"); + GLAD_GL_ARB_shader_storage_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_storage_buffer_object"); + GLAD_GL_ARB_shader_subroutine = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_subroutine"); + GLAD_GL_ARB_shader_texture_image_samples = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_texture_image_samples"); + GLAD_GL_ARB_shader_texture_lod = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_texture_lod"); + GLAD_GL_ARB_shader_viewport_layer_array = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_viewport_layer_array"); + GLAD_GL_ARB_shading_language_100 = glad_gl_has_extension(exts, exts_i, "GL_ARB_shading_language_100"); + GLAD_GL_ARB_shading_language_420pack = glad_gl_has_extension(exts, exts_i, "GL_ARB_shading_language_420pack"); + GLAD_GL_ARB_shading_language_include = glad_gl_has_extension(exts, exts_i, "GL_ARB_shading_language_include"); + GLAD_GL_ARB_shading_language_packing = glad_gl_has_extension(exts, exts_i, "GL_ARB_shading_language_packing"); + GLAD_GL_ARB_shadow = glad_gl_has_extension(exts, exts_i, "GL_ARB_shadow"); + GLAD_GL_ARB_shadow_ambient = glad_gl_has_extension(exts, exts_i, "GL_ARB_shadow_ambient"); + GLAD_GL_ARB_sparse_buffer = glad_gl_has_extension(exts, exts_i, "GL_ARB_sparse_buffer"); + GLAD_GL_ARB_sparse_texture = glad_gl_has_extension(exts, exts_i, "GL_ARB_sparse_texture"); + GLAD_GL_ARB_sparse_texture2 = glad_gl_has_extension(exts, exts_i, "GL_ARB_sparse_texture2"); + GLAD_GL_ARB_sparse_texture_clamp = glad_gl_has_extension(exts, exts_i, "GL_ARB_sparse_texture_clamp"); + GLAD_GL_ARB_spirv_extensions = glad_gl_has_extension(exts, exts_i, "GL_ARB_spirv_extensions"); + GLAD_GL_ARB_stencil_texturing = glad_gl_has_extension(exts, exts_i, "GL_ARB_stencil_texturing"); + GLAD_GL_ARB_sync = glad_gl_has_extension(exts, exts_i, "GL_ARB_sync"); + GLAD_GL_ARB_tessellation_shader = glad_gl_has_extension(exts, exts_i, "GL_ARB_tessellation_shader"); + GLAD_GL_ARB_texture_barrier = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_barrier"); + GLAD_GL_ARB_texture_border_clamp = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_border_clamp"); + GLAD_GL_ARB_texture_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_buffer_object"); + GLAD_GL_ARB_texture_buffer_object_rgb32 = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_buffer_object_rgb32"); + GLAD_GL_ARB_texture_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_buffer_range"); + GLAD_GL_ARB_texture_compression = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_compression"); + GLAD_GL_ARB_texture_compression_bptc = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_compression_bptc"); + GLAD_GL_ARB_texture_compression_rgtc = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_compression_rgtc"); + GLAD_GL_ARB_texture_cube_map = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_cube_map"); + GLAD_GL_ARB_texture_cube_map_array = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_cube_map_array"); + GLAD_GL_ARB_texture_env_add = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_env_add"); + GLAD_GL_ARB_texture_env_combine = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_env_combine"); + GLAD_GL_ARB_texture_env_crossbar = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_env_crossbar"); + GLAD_GL_ARB_texture_env_dot3 = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_env_dot3"); + GLAD_GL_ARB_texture_filter_anisotropic = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_filter_anisotropic"); + GLAD_GL_ARB_texture_filter_minmax = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_filter_minmax"); + GLAD_GL_ARB_texture_float = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_float"); + GLAD_GL_ARB_texture_gather = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_gather"); + GLAD_GL_ARB_texture_mirror_clamp_to_edge = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_mirror_clamp_to_edge"); + GLAD_GL_ARB_texture_mirrored_repeat = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_mirrored_repeat"); + GLAD_GL_ARB_texture_multisample = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_multisample"); + GLAD_GL_ARB_texture_non_power_of_two = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_non_power_of_two"); + GLAD_GL_ARB_texture_query_levels = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_query_levels"); + GLAD_GL_ARB_texture_query_lod = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_query_lod"); + GLAD_GL_ARB_texture_rectangle = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_rectangle"); + GLAD_GL_ARB_texture_rg = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_rg"); + GLAD_GL_ARB_texture_rgb10_a2ui = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_rgb10_a2ui"); + GLAD_GL_ARB_texture_stencil8 = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_stencil8"); + GLAD_GL_ARB_texture_storage = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_storage"); + GLAD_GL_ARB_texture_storage_multisample = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_storage_multisample"); + GLAD_GL_ARB_texture_swizzle = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_swizzle"); + GLAD_GL_ARB_texture_view = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_view"); + GLAD_GL_ARB_timer_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_timer_query"); + GLAD_GL_ARB_transform_feedback2 = glad_gl_has_extension(exts, exts_i, "GL_ARB_transform_feedback2"); + GLAD_GL_ARB_transform_feedback3 = glad_gl_has_extension(exts, exts_i, "GL_ARB_transform_feedback3"); + GLAD_GL_ARB_transform_feedback_instanced = glad_gl_has_extension(exts, exts_i, "GL_ARB_transform_feedback_instanced"); + GLAD_GL_ARB_transform_feedback_overflow_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_transform_feedback_overflow_query"); + GLAD_GL_ARB_transpose_matrix = glad_gl_has_extension(exts, exts_i, "GL_ARB_transpose_matrix"); + GLAD_GL_ARB_uniform_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_uniform_buffer_object"); + GLAD_GL_ARB_vertex_array_bgra = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_array_bgra"); + GLAD_GL_ARB_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_array_object"); + GLAD_GL_ARB_vertex_attrib_64bit = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_attrib_64bit"); + GLAD_GL_ARB_vertex_attrib_binding = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_attrib_binding"); + GLAD_GL_ARB_vertex_blend = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_blend"); + GLAD_GL_ARB_vertex_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_buffer_object"); + GLAD_GL_ARB_vertex_program = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_program"); + GLAD_GL_ARB_vertex_shader = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_shader"); + GLAD_GL_ARB_vertex_type_10f_11f_11f_rev = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_type_10f_11f_11f_rev"); + GLAD_GL_ARB_vertex_type_2_10_10_10_rev = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_type_2_10_10_10_rev"); + GLAD_GL_ARB_viewport_array = glad_gl_has_extension(exts, exts_i, "GL_ARB_viewport_array"); + GLAD_GL_ARB_window_pos = glad_gl_has_extension(exts, exts_i, "GL_ARB_window_pos"); + GLAD_GL_ATI_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_ATI_draw_buffers"); + GLAD_GL_ATI_element_array = glad_gl_has_extension(exts, exts_i, "GL_ATI_element_array"); + GLAD_GL_ATI_envmap_bumpmap = glad_gl_has_extension(exts, exts_i, "GL_ATI_envmap_bumpmap"); + GLAD_GL_ATI_fragment_shader = glad_gl_has_extension(exts, exts_i, "GL_ATI_fragment_shader"); + GLAD_GL_ATI_map_object_buffer = glad_gl_has_extension(exts, exts_i, "GL_ATI_map_object_buffer"); + GLAD_GL_ATI_meminfo = glad_gl_has_extension(exts, exts_i, "GL_ATI_meminfo"); + GLAD_GL_ATI_pixel_format_float = glad_gl_has_extension(exts, exts_i, "GL_ATI_pixel_format_float"); + GLAD_GL_ATI_pn_triangles = glad_gl_has_extension(exts, exts_i, "GL_ATI_pn_triangles"); + GLAD_GL_ATI_separate_stencil = glad_gl_has_extension(exts, exts_i, "GL_ATI_separate_stencil"); + GLAD_GL_ATI_text_fragment_shader = glad_gl_has_extension(exts, exts_i, "GL_ATI_text_fragment_shader"); + GLAD_GL_ATI_texture_env_combine3 = glad_gl_has_extension(exts, exts_i, "GL_ATI_texture_env_combine3"); + GLAD_GL_ATI_texture_float = glad_gl_has_extension(exts, exts_i, "GL_ATI_texture_float"); + GLAD_GL_ATI_texture_mirror_once = glad_gl_has_extension(exts, exts_i, "GL_ATI_texture_mirror_once"); + GLAD_GL_ATI_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_ATI_vertex_array_object"); + GLAD_GL_ATI_vertex_attrib_array_object = glad_gl_has_extension(exts, exts_i, "GL_ATI_vertex_attrib_array_object"); + GLAD_GL_ATI_vertex_streams = glad_gl_has_extension(exts, exts_i, "GL_ATI_vertex_streams"); + GLAD_GL_EXT_422_pixels = glad_gl_has_extension(exts, exts_i, "GL_EXT_422_pixels"); + GLAD_GL_EXT_EGL_image_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_storage"); + GLAD_GL_EXT_EGL_sync = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_sync"); + GLAD_GL_EXT_abgr = glad_gl_has_extension(exts, exts_i, "GL_EXT_abgr"); + GLAD_GL_EXT_bgra = glad_gl_has_extension(exts, exts_i, "GL_EXT_bgra"); + GLAD_GL_EXT_bindable_uniform = glad_gl_has_extension(exts, exts_i, "GL_EXT_bindable_uniform"); + GLAD_GL_EXT_blend_color = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_color"); + GLAD_GL_EXT_blend_equation_separate = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_equation_separate"); + GLAD_GL_EXT_blend_func_separate = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_func_separate"); + GLAD_GL_EXT_blend_logic_op = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_logic_op"); + GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_minmax"); + GLAD_GL_EXT_blend_subtract = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_subtract"); + GLAD_GL_EXT_clip_volume_hint = glad_gl_has_extension(exts, exts_i, "GL_EXT_clip_volume_hint"); + GLAD_GL_EXT_cmyka = glad_gl_has_extension(exts, exts_i, "GL_EXT_cmyka"); + GLAD_GL_EXT_color_subtable = glad_gl_has_extension(exts, exts_i, "GL_EXT_color_subtable"); + GLAD_GL_EXT_compiled_vertex_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_compiled_vertex_array"); + GLAD_GL_EXT_convolution = glad_gl_has_extension(exts, exts_i, "GL_EXT_convolution"); + GLAD_GL_EXT_coordinate_frame = glad_gl_has_extension(exts, exts_i, "GL_EXT_coordinate_frame"); + GLAD_GL_EXT_copy_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_copy_texture"); + GLAD_GL_EXT_cull_vertex = glad_gl_has_extension(exts, exts_i, "GL_EXT_cull_vertex"); + GLAD_GL_EXT_debug_label = glad_gl_has_extension(exts, exts_i, "GL_EXT_debug_label"); + GLAD_GL_EXT_debug_marker = glad_gl_has_extension(exts, exts_i, "GL_EXT_debug_marker"); + GLAD_GL_EXT_depth_bounds_test = glad_gl_has_extension(exts, exts_i, "GL_EXT_depth_bounds_test"); + GLAD_GL_EXT_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_EXT_direct_state_access"); + GLAD_GL_EXT_draw_buffers2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_buffers2"); + GLAD_GL_EXT_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_instanced"); + GLAD_GL_EXT_draw_range_elements = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_range_elements"); + GLAD_GL_EXT_external_buffer = glad_gl_has_extension(exts, exts_i, "GL_EXT_external_buffer"); + GLAD_GL_EXT_fog_coord = glad_gl_has_extension(exts, exts_i, "GL_EXT_fog_coord"); + GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_blit"); + GLAD_GL_EXT_framebuffer_blit_layers = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_blit_layers"); + GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_multisample"); + GLAD_GL_EXT_framebuffer_multisample_blit_scaled = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_multisample_blit_scaled"); + GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_object"); + GLAD_GL_EXT_framebuffer_sRGB = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_sRGB"); + GLAD_GL_EXT_geometry_shader4 = glad_gl_has_extension(exts, exts_i, "GL_EXT_geometry_shader4"); + GLAD_GL_EXT_gpu_program_parameters = glad_gl_has_extension(exts, exts_i, "GL_EXT_gpu_program_parameters"); + GLAD_GL_EXT_gpu_shader4 = glad_gl_has_extension(exts, exts_i, "GL_EXT_gpu_shader4"); + GLAD_GL_EXT_histogram = glad_gl_has_extension(exts, exts_i, "GL_EXT_histogram"); + GLAD_GL_EXT_index_array_formats = glad_gl_has_extension(exts, exts_i, "GL_EXT_index_array_formats"); + GLAD_GL_EXT_index_func = glad_gl_has_extension(exts, exts_i, "GL_EXT_index_func"); + GLAD_GL_EXT_index_material = glad_gl_has_extension(exts, exts_i, "GL_EXT_index_material"); + GLAD_GL_EXT_index_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_index_texture"); + GLAD_GL_EXT_light_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_light_texture"); + GLAD_GL_EXT_memory_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object"); + GLAD_GL_EXT_memory_object_fd = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object_fd"); + GLAD_GL_EXT_memory_object_win32 = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object_win32"); + GLAD_GL_EXT_misc_attribute = glad_gl_has_extension(exts, exts_i, "GL_EXT_misc_attribute"); + GLAD_GL_EXT_multi_draw_arrays = glad_gl_has_extension(exts, exts_i, "GL_EXT_multi_draw_arrays"); + GLAD_GL_EXT_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_multisample"); + GLAD_GL_EXT_multiview_tessellation_geometry_shader = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_tessellation_geometry_shader"); + GLAD_GL_EXT_multiview_texture_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_texture_multisample"); + GLAD_GL_EXT_multiview_timer_query = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_timer_query"); + GLAD_GL_EXT_packed_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_EXT_packed_depth_stencil"); + GLAD_GL_EXT_packed_float = glad_gl_has_extension(exts, exts_i, "GL_EXT_packed_float"); + GLAD_GL_EXT_packed_pixels = glad_gl_has_extension(exts, exts_i, "GL_EXT_packed_pixels"); + GLAD_GL_EXT_paletted_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_paletted_texture"); + GLAD_GL_EXT_pixel_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_pixel_buffer_object"); + GLAD_GL_EXT_pixel_transform = glad_gl_has_extension(exts, exts_i, "GL_EXT_pixel_transform"); + GLAD_GL_EXT_pixel_transform_color_table = glad_gl_has_extension(exts, exts_i, "GL_EXT_pixel_transform_color_table"); + GLAD_GL_EXT_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_EXT_point_parameters"); + GLAD_GL_EXT_polygon_offset = glad_gl_has_extension(exts, exts_i, "GL_EXT_polygon_offset"); + GLAD_GL_EXT_polygon_offset_clamp = glad_gl_has_extension(exts, exts_i, "GL_EXT_polygon_offset_clamp"); + GLAD_GL_EXT_post_depth_coverage = glad_gl_has_extension(exts, exts_i, "GL_EXT_post_depth_coverage"); + GLAD_GL_EXT_provoking_vertex = glad_gl_has_extension(exts, exts_i, "GL_EXT_provoking_vertex"); + GLAD_GL_EXT_raster_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_raster_multisample"); + GLAD_GL_EXT_rescale_normal = glad_gl_has_extension(exts, exts_i, "GL_EXT_rescale_normal"); + GLAD_GL_EXT_secondary_color = glad_gl_has_extension(exts, exts_i, "GL_EXT_secondary_color"); + GLAD_GL_EXT_semaphore = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore"); + GLAD_GL_EXT_semaphore_fd = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore_fd"); + GLAD_GL_EXT_semaphore_win32 = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore_win32"); + GLAD_GL_EXT_separate_shader_objects = glad_gl_has_extension(exts, exts_i, "GL_EXT_separate_shader_objects"); + GLAD_GL_EXT_separate_specular_color = glad_gl_has_extension(exts, exts_i, "GL_EXT_separate_specular_color"); + GLAD_GL_EXT_shader_framebuffer_fetch = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_framebuffer_fetch"); + GLAD_GL_EXT_shader_framebuffer_fetch_non_coherent = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_framebuffer_fetch_non_coherent"); + GLAD_GL_EXT_shader_image_load_formatted = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_image_load_formatted"); + GLAD_GL_EXT_shader_image_load_store = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_image_load_store"); + GLAD_GL_EXT_shader_integer_mix = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_integer_mix"); + GLAD_GL_EXT_shader_samples_identical = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_samples_identical"); + GLAD_GL_EXT_shadow_funcs = glad_gl_has_extension(exts, exts_i, "GL_EXT_shadow_funcs"); + GLAD_GL_EXT_shared_texture_palette = glad_gl_has_extension(exts, exts_i, "GL_EXT_shared_texture_palette"); + GLAD_GL_EXT_sparse_texture2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_sparse_texture2"); + GLAD_GL_EXT_stencil_clear_tag = glad_gl_has_extension(exts, exts_i, "GL_EXT_stencil_clear_tag"); + GLAD_GL_EXT_stencil_two_side = glad_gl_has_extension(exts, exts_i, "GL_EXT_stencil_two_side"); + GLAD_GL_EXT_stencil_wrap = glad_gl_has_extension(exts, exts_i, "GL_EXT_stencil_wrap"); + GLAD_GL_EXT_subtexture = glad_gl_has_extension(exts, exts_i, "GL_EXT_subtexture"); + GLAD_GL_EXT_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture"); + GLAD_GL_EXT_texture3D = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture3D"); + GLAD_GL_EXT_texture_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_array"); + GLAD_GL_EXT_texture_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_buffer_object"); + GLAD_GL_EXT_texture_compression_latc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_latc"); + GLAD_GL_EXT_texture_compression_rgtc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_rgtc"); + GLAD_GL_EXT_texture_compression_s3tc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_s3tc"); + GLAD_GL_EXT_texture_cube_map = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_cube_map"); + GLAD_GL_EXT_texture_env_add = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_env_add"); + GLAD_GL_EXT_texture_env_combine = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_env_combine"); + GLAD_GL_EXT_texture_env_dot3 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_env_dot3"); + GLAD_GL_EXT_texture_filter_anisotropic = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_filter_anisotropic"); + GLAD_GL_EXT_texture_filter_minmax = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_filter_minmax"); + GLAD_GL_EXT_texture_integer = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_integer"); + GLAD_GL_EXT_texture_lod_bias = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_lod_bias"); + GLAD_GL_EXT_texture_mirror_clamp = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_mirror_clamp"); + GLAD_GL_EXT_texture_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_object"); + GLAD_GL_EXT_texture_perturb_normal = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_perturb_normal"); + GLAD_GL_EXT_texture_sRGB = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB"); + GLAD_GL_EXT_texture_sRGB_R8 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_R8"); + GLAD_GL_EXT_texture_sRGB_RG8 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_RG8"); + GLAD_GL_EXT_texture_sRGB_decode = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_decode"); + GLAD_GL_EXT_texture_shadow_lod = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_shadow_lod"); + GLAD_GL_EXT_texture_shared_exponent = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_shared_exponent"); + GLAD_GL_EXT_texture_snorm = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_snorm"); + GLAD_GL_EXT_texture_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_storage"); + GLAD_GL_EXT_texture_swizzle = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_swizzle"); + GLAD_GL_EXT_timer_query = glad_gl_has_extension(exts, exts_i, "GL_EXT_timer_query"); + GLAD_GL_EXT_transform_feedback = glad_gl_has_extension(exts, exts_i, "GL_EXT_transform_feedback"); + GLAD_GL_EXT_vertex_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_array"); + GLAD_GL_EXT_vertex_array_bgra = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_array_bgra"); + GLAD_GL_EXT_vertex_attrib_64bit = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_attrib_64bit"); + GLAD_GL_EXT_vertex_shader = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_shader"); + GLAD_GL_EXT_vertex_weighting = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_weighting"); + GLAD_GL_EXT_win32_keyed_mutex = glad_gl_has_extension(exts, exts_i, "GL_EXT_win32_keyed_mutex"); + GLAD_GL_EXT_window_rectangles = glad_gl_has_extension(exts, exts_i, "GL_EXT_window_rectangles"); + GLAD_GL_EXT_x11_sync_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_x11_sync_object"); + GLAD_GL_GREMEDY_frame_terminator = glad_gl_has_extension(exts, exts_i, "GL_GREMEDY_frame_terminator"); + GLAD_GL_GREMEDY_string_marker = glad_gl_has_extension(exts, exts_i, "GL_GREMEDY_string_marker"); + GLAD_GL_HP_convolution_border_modes = glad_gl_has_extension(exts, exts_i, "GL_HP_convolution_border_modes"); + GLAD_GL_HP_image_transform = glad_gl_has_extension(exts, exts_i, "GL_HP_image_transform"); + GLAD_GL_HP_occlusion_test = glad_gl_has_extension(exts, exts_i, "GL_HP_occlusion_test"); + GLAD_GL_HP_texture_lighting = glad_gl_has_extension(exts, exts_i, "GL_HP_texture_lighting"); + GLAD_GL_IBM_cull_vertex = glad_gl_has_extension(exts, exts_i, "GL_IBM_cull_vertex"); + GLAD_GL_IBM_multimode_draw_arrays = glad_gl_has_extension(exts, exts_i, "GL_IBM_multimode_draw_arrays"); + GLAD_GL_IBM_rasterpos_clip = glad_gl_has_extension(exts, exts_i, "GL_IBM_rasterpos_clip"); + GLAD_GL_IBM_static_data = glad_gl_has_extension(exts, exts_i, "GL_IBM_static_data"); + GLAD_GL_IBM_texture_mirrored_repeat = glad_gl_has_extension(exts, exts_i, "GL_IBM_texture_mirrored_repeat"); + GLAD_GL_IBM_vertex_array_lists = glad_gl_has_extension(exts, exts_i, "GL_IBM_vertex_array_lists"); + GLAD_GL_INGR_blend_func_separate = glad_gl_has_extension(exts, exts_i, "GL_INGR_blend_func_separate"); + GLAD_GL_INGR_color_clamp = glad_gl_has_extension(exts, exts_i, "GL_INGR_color_clamp"); + GLAD_GL_INGR_interlace_read = glad_gl_has_extension(exts, exts_i, "GL_INGR_interlace_read"); + GLAD_GL_INTEL_blackhole_render = glad_gl_has_extension(exts, exts_i, "GL_INTEL_blackhole_render"); + GLAD_GL_INTEL_conservative_rasterization = glad_gl_has_extension(exts, exts_i, "GL_INTEL_conservative_rasterization"); + GLAD_GL_INTEL_fragment_shader_ordering = glad_gl_has_extension(exts, exts_i, "GL_INTEL_fragment_shader_ordering"); + GLAD_GL_INTEL_framebuffer_CMAA = glad_gl_has_extension(exts, exts_i, "GL_INTEL_framebuffer_CMAA"); + GLAD_GL_INTEL_map_texture = glad_gl_has_extension(exts, exts_i, "GL_INTEL_map_texture"); + GLAD_GL_INTEL_parallel_arrays = glad_gl_has_extension(exts, exts_i, "GL_INTEL_parallel_arrays"); + GLAD_GL_INTEL_performance_query = glad_gl_has_extension(exts, exts_i, "GL_INTEL_performance_query"); + GLAD_GL_KHR_blend_equation_advanced = glad_gl_has_extension(exts, exts_i, "GL_KHR_blend_equation_advanced"); + GLAD_GL_KHR_blend_equation_advanced_coherent = glad_gl_has_extension(exts, exts_i, "GL_KHR_blend_equation_advanced_coherent"); + GLAD_GL_KHR_context_flush_control = glad_gl_has_extension(exts, exts_i, "GL_KHR_context_flush_control"); + GLAD_GL_KHR_debug = glad_gl_has_extension(exts, exts_i, "GL_KHR_debug"); + GLAD_GL_KHR_no_error = glad_gl_has_extension(exts, exts_i, "GL_KHR_no_error"); + GLAD_GL_KHR_parallel_shader_compile = glad_gl_has_extension(exts, exts_i, "GL_KHR_parallel_shader_compile"); + GLAD_GL_KHR_robust_buffer_access_behavior = glad_gl_has_extension(exts, exts_i, "GL_KHR_robust_buffer_access_behavior"); + GLAD_GL_KHR_robustness = glad_gl_has_extension(exts, exts_i, "GL_KHR_robustness"); + GLAD_GL_KHR_shader_subgroup = glad_gl_has_extension(exts, exts_i, "GL_KHR_shader_subgroup"); + GLAD_GL_KHR_texture_compression_astc_hdr = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_hdr"); + GLAD_GL_KHR_texture_compression_astc_ldr = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_ldr"); + GLAD_GL_KHR_texture_compression_astc_sliced_3d = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_sliced_3d"); + GLAD_GL_MESAX_texture_stack = glad_gl_has_extension(exts, exts_i, "GL_MESAX_texture_stack"); + GLAD_GL_MESA_framebuffer_flip_x = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_flip_x"); + GLAD_GL_MESA_framebuffer_flip_y = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_flip_y"); + GLAD_GL_MESA_framebuffer_swap_xy = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_swap_xy"); + GLAD_GL_MESA_pack_invert = glad_gl_has_extension(exts, exts_i, "GL_MESA_pack_invert"); + GLAD_GL_MESA_program_binary_formats = glad_gl_has_extension(exts, exts_i, "GL_MESA_program_binary_formats"); + GLAD_GL_MESA_resize_buffers = glad_gl_has_extension(exts, exts_i, "GL_MESA_resize_buffers"); + GLAD_GL_MESA_shader_integer_functions = glad_gl_has_extension(exts, exts_i, "GL_MESA_shader_integer_functions"); + GLAD_GL_MESA_tile_raster_order = glad_gl_has_extension(exts, exts_i, "GL_MESA_tile_raster_order"); + GLAD_GL_MESA_window_pos = glad_gl_has_extension(exts, exts_i, "GL_MESA_window_pos"); + GLAD_GL_MESA_ycbcr_texture = glad_gl_has_extension(exts, exts_i, "GL_MESA_ycbcr_texture"); + GLAD_GL_NVX_blend_equation_advanced_multi_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_NVX_blend_equation_advanced_multi_draw_buffers"); + GLAD_GL_NVX_conditional_render = glad_gl_has_extension(exts, exts_i, "GL_NVX_conditional_render"); + GLAD_GL_NVX_gpu_memory_info = glad_gl_has_extension(exts, exts_i, "GL_NVX_gpu_memory_info"); + GLAD_GL_NVX_gpu_multicast2 = glad_gl_has_extension(exts, exts_i, "GL_NVX_gpu_multicast2"); + GLAD_GL_NVX_linked_gpu_multicast = glad_gl_has_extension(exts, exts_i, "GL_NVX_linked_gpu_multicast"); + GLAD_GL_NVX_progress_fence = glad_gl_has_extension(exts, exts_i, "GL_NVX_progress_fence"); + GLAD_GL_NV_alpha_to_coverage_dither_control = glad_gl_has_extension(exts, exts_i, "GL_NV_alpha_to_coverage_dither_control"); + GLAD_GL_NV_bindless_multi_draw_indirect = glad_gl_has_extension(exts, exts_i, "GL_NV_bindless_multi_draw_indirect"); + GLAD_GL_NV_bindless_multi_draw_indirect_count = glad_gl_has_extension(exts, exts_i, "GL_NV_bindless_multi_draw_indirect_count"); + GLAD_GL_NV_bindless_texture = glad_gl_has_extension(exts, exts_i, "GL_NV_bindless_texture"); + GLAD_GL_NV_blend_equation_advanced = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_equation_advanced"); + GLAD_GL_NV_blend_equation_advanced_coherent = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_equation_advanced_coherent"); + GLAD_GL_NV_blend_minmax_factor = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_minmax_factor"); + GLAD_GL_NV_blend_square = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_square"); + GLAD_GL_NV_clip_space_w_scaling = glad_gl_has_extension(exts, exts_i, "GL_NV_clip_space_w_scaling"); + GLAD_GL_NV_command_list = glad_gl_has_extension(exts, exts_i, "GL_NV_command_list"); + GLAD_GL_NV_compute_program5 = glad_gl_has_extension(exts, exts_i, "GL_NV_compute_program5"); + GLAD_GL_NV_compute_shader_derivatives = glad_gl_has_extension(exts, exts_i, "GL_NV_compute_shader_derivatives"); + GLAD_GL_NV_conditional_render = glad_gl_has_extension(exts, exts_i, "GL_NV_conditional_render"); + GLAD_GL_NV_conservative_raster = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster"); + GLAD_GL_NV_conservative_raster_dilate = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_dilate"); + GLAD_GL_NV_conservative_raster_pre_snap = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_pre_snap"); + GLAD_GL_NV_conservative_raster_pre_snap_triangles = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_pre_snap_triangles"); + GLAD_GL_NV_conservative_raster_underestimation = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_underestimation"); + GLAD_GL_NV_copy_depth_to_color = glad_gl_has_extension(exts, exts_i, "GL_NV_copy_depth_to_color"); + GLAD_GL_NV_copy_image = glad_gl_has_extension(exts, exts_i, "GL_NV_copy_image"); + GLAD_GL_NV_deep_texture3D = glad_gl_has_extension(exts, exts_i, "GL_NV_deep_texture3D"); + GLAD_GL_NV_depth_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_NV_depth_buffer_float"); + GLAD_GL_NV_depth_clamp = glad_gl_has_extension(exts, exts_i, "GL_NV_depth_clamp"); + GLAD_GL_NV_draw_texture = glad_gl_has_extension(exts, exts_i, "GL_NV_draw_texture"); + GLAD_GL_NV_draw_vulkan_image = glad_gl_has_extension(exts, exts_i, "GL_NV_draw_vulkan_image"); + GLAD_GL_NV_evaluators = glad_gl_has_extension(exts, exts_i, "GL_NV_evaluators"); + GLAD_GL_NV_explicit_multisample = glad_gl_has_extension(exts, exts_i, "GL_NV_explicit_multisample"); + GLAD_GL_NV_fence = glad_gl_has_extension(exts, exts_i, "GL_NV_fence"); + GLAD_GL_NV_fill_rectangle = glad_gl_has_extension(exts, exts_i, "GL_NV_fill_rectangle"); + GLAD_GL_NV_float_buffer = glad_gl_has_extension(exts, exts_i, "GL_NV_float_buffer"); + GLAD_GL_NV_fog_distance = glad_gl_has_extension(exts, exts_i, "GL_NV_fog_distance"); + GLAD_GL_NV_fragment_coverage_to_color = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_coverage_to_color"); + GLAD_GL_NV_fragment_program = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_program"); + GLAD_GL_NV_fragment_program2 = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_program2"); + GLAD_GL_NV_fragment_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_program4"); + GLAD_GL_NV_fragment_program_option = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_program_option"); + GLAD_GL_NV_fragment_shader_barycentric = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_shader_barycentric"); + GLAD_GL_NV_fragment_shader_interlock = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_shader_interlock"); + GLAD_GL_NV_framebuffer_mixed_samples = glad_gl_has_extension(exts, exts_i, "GL_NV_framebuffer_mixed_samples"); + GLAD_GL_NV_framebuffer_multisample_coverage = glad_gl_has_extension(exts, exts_i, "GL_NV_framebuffer_multisample_coverage"); + GLAD_GL_NV_geometry_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_geometry_program4"); + GLAD_GL_NV_geometry_shader4 = glad_gl_has_extension(exts, exts_i, "GL_NV_geometry_shader4"); + GLAD_GL_NV_geometry_shader_passthrough = glad_gl_has_extension(exts, exts_i, "GL_NV_geometry_shader_passthrough"); + GLAD_GL_NV_gpu_multicast = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_multicast"); + GLAD_GL_NV_gpu_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_program4"); + GLAD_GL_NV_gpu_program5 = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_program5"); + GLAD_GL_NV_gpu_program5_mem_extended = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_program5_mem_extended"); + GLAD_GL_NV_gpu_shader5 = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_shader5"); + GLAD_GL_NV_half_float = glad_gl_has_extension(exts, exts_i, "GL_NV_half_float"); + GLAD_GL_NV_internalformat_sample_query = glad_gl_has_extension(exts, exts_i, "GL_NV_internalformat_sample_query"); + GLAD_GL_NV_light_max_exponent = glad_gl_has_extension(exts, exts_i, "GL_NV_light_max_exponent"); + GLAD_GL_NV_memory_attachment = glad_gl_has_extension(exts, exts_i, "GL_NV_memory_attachment"); + GLAD_GL_NV_memory_object_sparse = glad_gl_has_extension(exts, exts_i, "GL_NV_memory_object_sparse"); + GLAD_GL_NV_mesh_shader = glad_gl_has_extension(exts, exts_i, "GL_NV_mesh_shader"); + GLAD_GL_NV_multisample_coverage = glad_gl_has_extension(exts, exts_i, "GL_NV_multisample_coverage"); + GLAD_GL_NV_multisample_filter_hint = glad_gl_has_extension(exts, exts_i, "GL_NV_multisample_filter_hint"); + GLAD_GL_NV_occlusion_query = glad_gl_has_extension(exts, exts_i, "GL_NV_occlusion_query"); + GLAD_GL_NV_packed_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_NV_packed_depth_stencil"); + GLAD_GL_NV_parameter_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_NV_parameter_buffer_object"); + GLAD_GL_NV_parameter_buffer_object2 = glad_gl_has_extension(exts, exts_i, "GL_NV_parameter_buffer_object2"); + GLAD_GL_NV_path_rendering = glad_gl_has_extension(exts, exts_i, "GL_NV_path_rendering"); + GLAD_GL_NV_path_rendering_shared_edge = glad_gl_has_extension(exts, exts_i, "GL_NV_path_rendering_shared_edge"); + GLAD_GL_NV_pixel_data_range = glad_gl_has_extension(exts, exts_i, "GL_NV_pixel_data_range"); + GLAD_GL_NV_point_sprite = glad_gl_has_extension(exts, exts_i, "GL_NV_point_sprite"); + GLAD_GL_NV_present_video = glad_gl_has_extension(exts, exts_i, "GL_NV_present_video"); + GLAD_GL_NV_primitive_restart = glad_gl_has_extension(exts, exts_i, "GL_NV_primitive_restart"); + GLAD_GL_NV_primitive_shading_rate = glad_gl_has_extension(exts, exts_i, "GL_NV_primitive_shading_rate"); + GLAD_GL_NV_query_resource = glad_gl_has_extension(exts, exts_i, "GL_NV_query_resource"); + GLAD_GL_NV_query_resource_tag = glad_gl_has_extension(exts, exts_i, "GL_NV_query_resource_tag"); + GLAD_GL_NV_register_combiners = glad_gl_has_extension(exts, exts_i, "GL_NV_register_combiners"); + GLAD_GL_NV_register_combiners2 = glad_gl_has_extension(exts, exts_i, "GL_NV_register_combiners2"); + GLAD_GL_NV_representative_fragment_test = glad_gl_has_extension(exts, exts_i, "GL_NV_representative_fragment_test"); + GLAD_GL_NV_robustness_video_memory_purge = glad_gl_has_extension(exts, exts_i, "GL_NV_robustness_video_memory_purge"); + GLAD_GL_NV_sample_locations = glad_gl_has_extension(exts, exts_i, "GL_NV_sample_locations"); + GLAD_GL_NV_sample_mask_override_coverage = glad_gl_has_extension(exts, exts_i, "GL_NV_sample_mask_override_coverage"); + GLAD_GL_NV_scissor_exclusive = glad_gl_has_extension(exts, exts_i, "GL_NV_scissor_exclusive"); + GLAD_GL_NV_shader_atomic_counters = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_counters"); + GLAD_GL_NV_shader_atomic_float = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_float"); + GLAD_GL_NV_shader_atomic_float64 = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_float64"); + GLAD_GL_NV_shader_atomic_fp16_vector = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_fp16_vector"); + GLAD_GL_NV_shader_atomic_int64 = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_int64"); + GLAD_GL_NV_shader_buffer_load = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_buffer_load"); + GLAD_GL_NV_shader_buffer_store = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_buffer_store"); + GLAD_GL_NV_shader_storage_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_storage_buffer_object"); + GLAD_GL_NV_shader_subgroup_partitioned = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_subgroup_partitioned"); + GLAD_GL_NV_shader_texture_footprint = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_texture_footprint"); + GLAD_GL_NV_shader_thread_group = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_thread_group"); + GLAD_GL_NV_shader_thread_shuffle = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_thread_shuffle"); + GLAD_GL_NV_shading_rate_image = glad_gl_has_extension(exts, exts_i, "GL_NV_shading_rate_image"); + GLAD_GL_NV_stereo_view_rendering = glad_gl_has_extension(exts, exts_i, "GL_NV_stereo_view_rendering"); + GLAD_GL_NV_tessellation_program5 = glad_gl_has_extension(exts, exts_i, "GL_NV_tessellation_program5"); + GLAD_GL_NV_texgen_emboss = glad_gl_has_extension(exts, exts_i, "GL_NV_texgen_emboss"); + GLAD_GL_NV_texgen_reflection = glad_gl_has_extension(exts, exts_i, "GL_NV_texgen_reflection"); + GLAD_GL_NV_texture_barrier = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_barrier"); + GLAD_GL_NV_texture_compression_vtc = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_compression_vtc"); + GLAD_GL_NV_texture_env_combine4 = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_env_combine4"); + GLAD_GL_NV_texture_expand_normal = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_expand_normal"); + GLAD_GL_NV_texture_multisample = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_multisample"); + GLAD_GL_NV_texture_rectangle = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_rectangle"); + GLAD_GL_NV_texture_rectangle_compressed = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_rectangle_compressed"); + GLAD_GL_NV_texture_shader = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_shader"); + GLAD_GL_NV_texture_shader2 = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_shader2"); + GLAD_GL_NV_texture_shader3 = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_shader3"); + GLAD_GL_NV_timeline_semaphore = glad_gl_has_extension(exts, exts_i, "GL_NV_timeline_semaphore"); + GLAD_GL_NV_transform_feedback = glad_gl_has_extension(exts, exts_i, "GL_NV_transform_feedback"); + GLAD_GL_NV_transform_feedback2 = glad_gl_has_extension(exts, exts_i, "GL_NV_transform_feedback2"); + GLAD_GL_NV_uniform_buffer_std430_layout = glad_gl_has_extension(exts, exts_i, "GL_NV_uniform_buffer_std430_layout"); + GLAD_GL_NV_uniform_buffer_unified_memory = glad_gl_has_extension(exts, exts_i, "GL_NV_uniform_buffer_unified_memory"); + GLAD_GL_NV_vdpau_interop = glad_gl_has_extension(exts, exts_i, "GL_NV_vdpau_interop"); + GLAD_GL_NV_vdpau_interop2 = glad_gl_has_extension(exts, exts_i, "GL_NV_vdpau_interop2"); + GLAD_GL_NV_vertex_array_range = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_array_range"); + GLAD_GL_NV_vertex_array_range2 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_array_range2"); + GLAD_GL_NV_vertex_attrib_integer_64bit = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_attrib_integer_64bit"); + GLAD_GL_NV_vertex_buffer_unified_memory = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_buffer_unified_memory"); + GLAD_GL_NV_vertex_program = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program"); + GLAD_GL_NV_vertex_program1_1 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program1_1"); + GLAD_GL_NV_vertex_program2 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program2"); + GLAD_GL_NV_vertex_program2_option = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program2_option"); + GLAD_GL_NV_vertex_program3 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program3"); + GLAD_GL_NV_vertex_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program4"); + GLAD_GL_NV_video_capture = glad_gl_has_extension(exts, exts_i, "GL_NV_video_capture"); + GLAD_GL_NV_viewport_array2 = glad_gl_has_extension(exts, exts_i, "GL_NV_viewport_array2"); + GLAD_GL_NV_viewport_swizzle = glad_gl_has_extension(exts, exts_i, "GL_NV_viewport_swizzle"); + GLAD_GL_OES_byte_coordinates = glad_gl_has_extension(exts, exts_i, "GL_OES_byte_coordinates"); + GLAD_GL_OES_compressed_paletted_texture = glad_gl_has_extension(exts, exts_i, "GL_OES_compressed_paletted_texture"); + GLAD_GL_OES_fixed_point = glad_gl_has_extension(exts, exts_i, "GL_OES_fixed_point"); + GLAD_GL_OES_query_matrix = glad_gl_has_extension(exts, exts_i, "GL_OES_query_matrix"); + GLAD_GL_OES_read_format = glad_gl_has_extension(exts, exts_i, "GL_OES_read_format"); + GLAD_GL_OES_single_precision = glad_gl_has_extension(exts, exts_i, "GL_OES_single_precision"); + GLAD_GL_OML_interlace = glad_gl_has_extension(exts, exts_i, "GL_OML_interlace"); + GLAD_GL_OML_resample = glad_gl_has_extension(exts, exts_i, "GL_OML_resample"); + GLAD_GL_OML_subsample = glad_gl_has_extension(exts, exts_i, "GL_OML_subsample"); + GLAD_GL_OVR_multiview = glad_gl_has_extension(exts, exts_i, "GL_OVR_multiview"); + GLAD_GL_OVR_multiview2 = glad_gl_has_extension(exts, exts_i, "GL_OVR_multiview2"); + GLAD_GL_PGI_misc_hints = glad_gl_has_extension(exts, exts_i, "GL_PGI_misc_hints"); + GLAD_GL_PGI_vertex_hints = glad_gl_has_extension(exts, exts_i, "GL_PGI_vertex_hints"); + GLAD_GL_REND_screen_coordinates = glad_gl_has_extension(exts, exts_i, "GL_REND_screen_coordinates"); + GLAD_GL_S3_s3tc = glad_gl_has_extension(exts, exts_i, "GL_S3_s3tc"); + GLAD_GL_SGIS_detail_texture = glad_gl_has_extension(exts, exts_i, "GL_SGIS_detail_texture"); + GLAD_GL_SGIS_fog_function = glad_gl_has_extension(exts, exts_i, "GL_SGIS_fog_function"); + GLAD_GL_SGIS_generate_mipmap = glad_gl_has_extension(exts, exts_i, "GL_SGIS_generate_mipmap"); + GLAD_GL_SGIS_multisample = glad_gl_has_extension(exts, exts_i, "GL_SGIS_multisample"); + GLAD_GL_SGIS_pixel_texture = glad_gl_has_extension(exts, exts_i, "GL_SGIS_pixel_texture"); + GLAD_GL_SGIS_point_line_texgen = glad_gl_has_extension(exts, exts_i, "GL_SGIS_point_line_texgen"); + GLAD_GL_SGIS_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_SGIS_point_parameters"); + GLAD_GL_SGIS_sharpen_texture = glad_gl_has_extension(exts, exts_i, "GL_SGIS_sharpen_texture"); + GLAD_GL_SGIS_texture4D = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture4D"); + GLAD_GL_SGIS_texture_border_clamp = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_border_clamp"); + GLAD_GL_SGIS_texture_color_mask = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_color_mask"); + GLAD_GL_SGIS_texture_edge_clamp = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_edge_clamp"); + GLAD_GL_SGIS_texture_filter4 = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_filter4"); + GLAD_GL_SGIS_texture_lod = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_lod"); + GLAD_GL_SGIS_texture_select = glad_gl_has_extension(exts, exts_i, "GL_SGIS_texture_select"); + GLAD_GL_SGIX_async = glad_gl_has_extension(exts, exts_i, "GL_SGIX_async"); + GLAD_GL_SGIX_async_histogram = glad_gl_has_extension(exts, exts_i, "GL_SGIX_async_histogram"); + GLAD_GL_SGIX_async_pixel = glad_gl_has_extension(exts, exts_i, "GL_SGIX_async_pixel"); + GLAD_GL_SGIX_blend_alpha_minmax = glad_gl_has_extension(exts, exts_i, "GL_SGIX_blend_alpha_minmax"); + GLAD_GL_SGIX_calligraphic_fragment = glad_gl_has_extension(exts, exts_i, "GL_SGIX_calligraphic_fragment"); + GLAD_GL_SGIX_clipmap = glad_gl_has_extension(exts, exts_i, "GL_SGIX_clipmap"); + GLAD_GL_SGIX_convolution_accuracy = glad_gl_has_extension(exts, exts_i, "GL_SGIX_convolution_accuracy"); + GLAD_GL_SGIX_depth_pass_instrument = glad_gl_has_extension(exts, exts_i, "GL_SGIX_depth_pass_instrument"); + GLAD_GL_SGIX_depth_texture = glad_gl_has_extension(exts, exts_i, "GL_SGIX_depth_texture"); + GLAD_GL_SGIX_flush_raster = glad_gl_has_extension(exts, exts_i, "GL_SGIX_flush_raster"); + GLAD_GL_SGIX_fog_offset = glad_gl_has_extension(exts, exts_i, "GL_SGIX_fog_offset"); + GLAD_GL_SGIX_fragment_lighting = glad_gl_has_extension(exts, exts_i, "GL_SGIX_fragment_lighting"); + GLAD_GL_SGIX_framezoom = glad_gl_has_extension(exts, exts_i, "GL_SGIX_framezoom"); + GLAD_GL_SGIX_igloo_interface = glad_gl_has_extension(exts, exts_i, "GL_SGIX_igloo_interface"); + GLAD_GL_SGIX_instruments = glad_gl_has_extension(exts, exts_i, "GL_SGIX_instruments"); + GLAD_GL_SGIX_interlace = glad_gl_has_extension(exts, exts_i, "GL_SGIX_interlace"); + GLAD_GL_SGIX_ir_instrument1 = glad_gl_has_extension(exts, exts_i, "GL_SGIX_ir_instrument1"); + GLAD_GL_SGIX_list_priority = glad_gl_has_extension(exts, exts_i, "GL_SGIX_list_priority"); + GLAD_GL_SGIX_pixel_texture = glad_gl_has_extension(exts, exts_i, "GL_SGIX_pixel_texture"); + GLAD_GL_SGIX_pixel_tiles = glad_gl_has_extension(exts, exts_i, "GL_SGIX_pixel_tiles"); + GLAD_GL_SGIX_polynomial_ffd = glad_gl_has_extension(exts, exts_i, "GL_SGIX_polynomial_ffd"); + GLAD_GL_SGIX_reference_plane = glad_gl_has_extension(exts, exts_i, "GL_SGIX_reference_plane"); + GLAD_GL_SGIX_resample = glad_gl_has_extension(exts, exts_i, "GL_SGIX_resample"); + GLAD_GL_SGIX_scalebias_hint = glad_gl_has_extension(exts, exts_i, "GL_SGIX_scalebias_hint"); + GLAD_GL_SGIX_shadow = glad_gl_has_extension(exts, exts_i, "GL_SGIX_shadow"); + GLAD_GL_SGIX_shadow_ambient = glad_gl_has_extension(exts, exts_i, "GL_SGIX_shadow_ambient"); + GLAD_GL_SGIX_sprite = glad_gl_has_extension(exts, exts_i, "GL_SGIX_sprite"); + GLAD_GL_SGIX_subsample = glad_gl_has_extension(exts, exts_i, "GL_SGIX_subsample"); + GLAD_GL_SGIX_tag_sample_buffer = glad_gl_has_extension(exts, exts_i, "GL_SGIX_tag_sample_buffer"); + GLAD_GL_SGIX_texture_add_env = glad_gl_has_extension(exts, exts_i, "GL_SGIX_texture_add_env"); + GLAD_GL_SGIX_texture_coordinate_clamp = glad_gl_has_extension(exts, exts_i, "GL_SGIX_texture_coordinate_clamp"); + GLAD_GL_SGIX_texture_lod_bias = glad_gl_has_extension(exts, exts_i, "GL_SGIX_texture_lod_bias"); + GLAD_GL_SGIX_texture_multi_buffer = glad_gl_has_extension(exts, exts_i, "GL_SGIX_texture_multi_buffer"); + GLAD_GL_SGIX_texture_scale_bias = glad_gl_has_extension(exts, exts_i, "GL_SGIX_texture_scale_bias"); + GLAD_GL_SGIX_vertex_preclip = glad_gl_has_extension(exts, exts_i, "GL_SGIX_vertex_preclip"); + GLAD_GL_SGIX_ycrcb = glad_gl_has_extension(exts, exts_i, "GL_SGIX_ycrcb"); + GLAD_GL_SGIX_ycrcb_subsample = glad_gl_has_extension(exts, exts_i, "GL_SGIX_ycrcb_subsample"); + GLAD_GL_SGIX_ycrcba = glad_gl_has_extension(exts, exts_i, "GL_SGIX_ycrcba"); + GLAD_GL_SGI_color_matrix = glad_gl_has_extension(exts, exts_i, "GL_SGI_color_matrix"); + GLAD_GL_SGI_color_table = glad_gl_has_extension(exts, exts_i, "GL_SGI_color_table"); + GLAD_GL_SGI_texture_color_table = glad_gl_has_extension(exts, exts_i, "GL_SGI_texture_color_table"); + GLAD_GL_SUNX_constant_data = glad_gl_has_extension(exts, exts_i, "GL_SUNX_constant_data"); + GLAD_GL_SUN_convolution_border_modes = glad_gl_has_extension(exts, exts_i, "GL_SUN_convolution_border_modes"); + GLAD_GL_SUN_global_alpha = glad_gl_has_extension(exts, exts_i, "GL_SUN_global_alpha"); + GLAD_GL_SUN_mesh_array = glad_gl_has_extension(exts, exts_i, "GL_SUN_mesh_array"); + GLAD_GL_SUN_slice_accum = glad_gl_has_extension(exts, exts_i, "GL_SUN_slice_accum"); + GLAD_GL_SUN_triangle_list = glad_gl_has_extension(exts, exts_i, "GL_SUN_triangle_list"); + GLAD_GL_SUN_vertex = glad_gl_has_extension(exts, exts_i, "GL_SUN_vertex"); + GLAD_GL_WIN_phong_shading = glad_gl_has_extension(exts, exts_i, "GL_WIN_phong_shading"); + GLAD_GL_WIN_specular_fog = glad_gl_has_extension(exts, exts_i, "GL_WIN_specular_fog"); + + glad_gl_free_extensions(exts_i); + + return 1; +} + +static int glad_gl_find_core_gl(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; + GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; + GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; + GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; + GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4; + GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4; + GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + version = glad_gl_find_core_gl(); + + glad_gl_load_GL_VERSION_1_0(load, userptr); + glad_gl_load_GL_VERSION_1_1(load, userptr); + glad_gl_load_GL_VERSION_1_2(load, userptr); + glad_gl_load_GL_VERSION_1_3(load, userptr); + glad_gl_load_GL_VERSION_1_4(load, userptr); + glad_gl_load_GL_VERSION_1_5(load, userptr); + glad_gl_load_GL_VERSION_2_0(load, userptr); + glad_gl_load_GL_VERSION_2_1(load, userptr); + glad_gl_load_GL_VERSION_3_0(load, userptr); + glad_gl_load_GL_VERSION_3_1(load, userptr); + glad_gl_load_GL_VERSION_3_2(load, userptr); + glad_gl_load_GL_VERSION_3_3(load, userptr); + glad_gl_load_GL_VERSION_4_0(load, userptr); + glad_gl_load_GL_VERSION_4_1(load, userptr); + glad_gl_load_GL_VERSION_4_2(load, userptr); + glad_gl_load_GL_VERSION_4_3(load, userptr); + glad_gl_load_GL_VERSION_4_4(load, userptr); + glad_gl_load_GL_VERSION_4_5(load, userptr); + glad_gl_load_GL_VERSION_4_6(load, userptr); + + if (!glad_gl_find_extensions_gl()) return 0; + glad_gl_load_GL_3DFX_tbuffer(load, userptr); + glad_gl_load_GL_AMD_debug_output(load, userptr); + glad_gl_load_GL_AMD_draw_buffers_blend(load, userptr); + glad_gl_load_GL_AMD_framebuffer_multisample_advanced(load, userptr); + glad_gl_load_GL_AMD_framebuffer_sample_positions(load, userptr); + glad_gl_load_GL_AMD_gpu_shader_int64(load, userptr); + glad_gl_load_GL_AMD_interleaved_elements(load, userptr); + glad_gl_load_GL_AMD_multi_draw_indirect(load, userptr); + glad_gl_load_GL_AMD_name_gen_delete(load, userptr); + glad_gl_load_GL_AMD_occlusion_query_event(load, userptr); + glad_gl_load_GL_AMD_performance_monitor(load, userptr); + glad_gl_load_GL_AMD_sample_positions(load, userptr); + glad_gl_load_GL_AMD_sparse_texture(load, userptr); + glad_gl_load_GL_AMD_stencil_operation_extended(load, userptr); + glad_gl_load_GL_AMD_vertex_shader_tessellator(load, userptr); + glad_gl_load_GL_APPLE_element_array(load, userptr); + glad_gl_load_GL_APPLE_fence(load, userptr); + glad_gl_load_GL_APPLE_flush_buffer_range(load, userptr); + glad_gl_load_GL_APPLE_object_purgeable(load, userptr); + glad_gl_load_GL_APPLE_texture_range(load, userptr); + glad_gl_load_GL_APPLE_vertex_array_object(load, userptr); + glad_gl_load_GL_APPLE_vertex_array_range(load, userptr); + glad_gl_load_GL_APPLE_vertex_program_evaluators(load, userptr); + glad_gl_load_GL_ARB_ES2_compatibility(load, userptr); + glad_gl_load_GL_ARB_ES3_1_compatibility(load, userptr); + glad_gl_load_GL_ARB_ES3_2_compatibility(load, userptr); + glad_gl_load_GL_ARB_base_instance(load, userptr); + glad_gl_load_GL_ARB_bindless_texture(load, userptr); + glad_gl_load_GL_ARB_blend_func_extended(load, userptr); + glad_gl_load_GL_ARB_buffer_storage(load, userptr); + glad_gl_load_GL_ARB_cl_event(load, userptr); + glad_gl_load_GL_ARB_clear_buffer_object(load, userptr); + glad_gl_load_GL_ARB_clear_texture(load, userptr); + glad_gl_load_GL_ARB_clip_control(load, userptr); + glad_gl_load_GL_ARB_color_buffer_float(load, userptr); + glad_gl_load_GL_ARB_compute_shader(load, userptr); + glad_gl_load_GL_ARB_compute_variable_group_size(load, userptr); + glad_gl_load_GL_ARB_copy_buffer(load, userptr); + glad_gl_load_GL_ARB_copy_image(load, userptr); + glad_gl_load_GL_ARB_debug_output(load, userptr); + glad_gl_load_GL_ARB_direct_state_access(load, userptr); + glad_gl_load_GL_ARB_draw_buffers(load, userptr); + glad_gl_load_GL_ARB_draw_buffers_blend(load, userptr); + glad_gl_load_GL_ARB_draw_elements_base_vertex(load, userptr); + glad_gl_load_GL_ARB_draw_indirect(load, userptr); + glad_gl_load_GL_ARB_draw_instanced(load, userptr); + glad_gl_load_GL_ARB_fragment_program(load, userptr); + glad_gl_load_GL_ARB_framebuffer_no_attachments(load, userptr); + glad_gl_load_GL_ARB_framebuffer_object(load, userptr); + glad_gl_load_GL_ARB_geometry_shader4(load, userptr); + glad_gl_load_GL_ARB_get_program_binary(load, userptr); + glad_gl_load_GL_ARB_get_texture_sub_image(load, userptr); + glad_gl_load_GL_ARB_gl_spirv(load, userptr); + glad_gl_load_GL_ARB_gpu_shader_fp64(load, userptr); + glad_gl_load_GL_ARB_gpu_shader_int64(load, userptr); + glad_gl_load_GL_ARB_imaging(load, userptr); + glad_gl_load_GL_ARB_indirect_parameters(load, userptr); + glad_gl_load_GL_ARB_instanced_arrays(load, userptr); + glad_gl_load_GL_ARB_internalformat_query(load, userptr); + glad_gl_load_GL_ARB_internalformat_query2(load, userptr); + glad_gl_load_GL_ARB_invalidate_subdata(load, userptr); + glad_gl_load_GL_ARB_map_buffer_range(load, userptr); + glad_gl_load_GL_ARB_matrix_palette(load, userptr); + glad_gl_load_GL_ARB_multi_bind(load, userptr); + glad_gl_load_GL_ARB_multi_draw_indirect(load, userptr); + glad_gl_load_GL_ARB_multisample(load, userptr); + glad_gl_load_GL_ARB_multitexture(load, userptr); + glad_gl_load_GL_ARB_occlusion_query(load, userptr); + glad_gl_load_GL_ARB_parallel_shader_compile(load, userptr); + glad_gl_load_GL_ARB_point_parameters(load, userptr); + glad_gl_load_GL_ARB_polygon_offset_clamp(load, userptr); + glad_gl_load_GL_ARB_program_interface_query(load, userptr); + glad_gl_load_GL_ARB_provoking_vertex(load, userptr); + glad_gl_load_GL_ARB_robustness(load, userptr); + glad_gl_load_GL_ARB_sample_locations(load, userptr); + glad_gl_load_GL_ARB_sample_shading(load, userptr); + glad_gl_load_GL_ARB_sampler_objects(load, userptr); + glad_gl_load_GL_ARB_separate_shader_objects(load, userptr); + glad_gl_load_GL_ARB_shader_atomic_counters(load, userptr); + glad_gl_load_GL_ARB_shader_image_load_store(load, userptr); + glad_gl_load_GL_ARB_shader_objects(load, userptr); + glad_gl_load_GL_ARB_shader_storage_buffer_object(load, userptr); + glad_gl_load_GL_ARB_shader_subroutine(load, userptr); + glad_gl_load_GL_ARB_shading_language_include(load, userptr); + glad_gl_load_GL_ARB_sparse_buffer(load, userptr); + glad_gl_load_GL_ARB_sparse_texture(load, userptr); + glad_gl_load_GL_ARB_sync(load, userptr); + glad_gl_load_GL_ARB_tessellation_shader(load, userptr); + glad_gl_load_GL_ARB_texture_barrier(load, userptr); + glad_gl_load_GL_ARB_texture_buffer_object(load, userptr); + glad_gl_load_GL_ARB_texture_buffer_range(load, userptr); + glad_gl_load_GL_ARB_texture_compression(load, userptr); + glad_gl_load_GL_ARB_texture_multisample(load, userptr); + glad_gl_load_GL_ARB_texture_storage(load, userptr); + glad_gl_load_GL_ARB_texture_storage_multisample(load, userptr); + glad_gl_load_GL_ARB_texture_view(load, userptr); + glad_gl_load_GL_ARB_timer_query(load, userptr); + glad_gl_load_GL_ARB_transform_feedback2(load, userptr); + glad_gl_load_GL_ARB_transform_feedback3(load, userptr); + glad_gl_load_GL_ARB_transform_feedback_instanced(load, userptr); + glad_gl_load_GL_ARB_transpose_matrix(load, userptr); + glad_gl_load_GL_ARB_uniform_buffer_object(load, userptr); + glad_gl_load_GL_ARB_vertex_array_object(load, userptr); + glad_gl_load_GL_ARB_vertex_attrib_64bit(load, userptr); + glad_gl_load_GL_ARB_vertex_attrib_binding(load, userptr); + glad_gl_load_GL_ARB_vertex_blend(load, userptr); + glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr); + glad_gl_load_GL_ARB_vertex_program(load, userptr); + glad_gl_load_GL_ARB_vertex_shader(load, userptr); + glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev(load, userptr); + glad_gl_load_GL_ARB_viewport_array(load, userptr); + glad_gl_load_GL_ARB_window_pos(load, userptr); + glad_gl_load_GL_ATI_draw_buffers(load, userptr); + glad_gl_load_GL_ATI_element_array(load, userptr); + glad_gl_load_GL_ATI_envmap_bumpmap(load, userptr); + glad_gl_load_GL_ATI_fragment_shader(load, userptr); + glad_gl_load_GL_ATI_map_object_buffer(load, userptr); + glad_gl_load_GL_ATI_pn_triangles(load, userptr); + glad_gl_load_GL_ATI_separate_stencil(load, userptr); + glad_gl_load_GL_ATI_vertex_array_object(load, userptr); + glad_gl_load_GL_ATI_vertex_attrib_array_object(load, userptr); + glad_gl_load_GL_ATI_vertex_streams(load, userptr); + glad_gl_load_GL_EXT_EGL_image_storage(load, userptr); + glad_gl_load_GL_EXT_bindable_uniform(load, userptr); + glad_gl_load_GL_EXT_blend_color(load, userptr); + glad_gl_load_GL_EXT_blend_equation_separate(load, userptr); + glad_gl_load_GL_EXT_blend_func_separate(load, userptr); + glad_gl_load_GL_EXT_blend_minmax(load, userptr); + glad_gl_load_GL_EXT_color_subtable(load, userptr); + glad_gl_load_GL_EXT_compiled_vertex_array(load, userptr); + glad_gl_load_GL_EXT_convolution(load, userptr); + glad_gl_load_GL_EXT_coordinate_frame(load, userptr); + glad_gl_load_GL_EXT_copy_texture(load, userptr); + glad_gl_load_GL_EXT_cull_vertex(load, userptr); + glad_gl_load_GL_EXT_debug_label(load, userptr); + glad_gl_load_GL_EXT_debug_marker(load, userptr); + glad_gl_load_GL_EXT_depth_bounds_test(load, userptr); + glad_gl_load_GL_EXT_direct_state_access(load, userptr); + glad_gl_load_GL_EXT_draw_buffers2(load, userptr); + glad_gl_load_GL_EXT_draw_instanced(load, userptr); + glad_gl_load_GL_EXT_draw_range_elements(load, userptr); + glad_gl_load_GL_EXT_external_buffer(load, userptr); + glad_gl_load_GL_EXT_fog_coord(load, userptr); + glad_gl_load_GL_EXT_framebuffer_blit(load, userptr); + glad_gl_load_GL_EXT_framebuffer_blit_layers(load, userptr); + glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr); + glad_gl_load_GL_EXT_framebuffer_object(load, userptr); + glad_gl_load_GL_EXT_geometry_shader4(load, userptr); + glad_gl_load_GL_EXT_gpu_program_parameters(load, userptr); + glad_gl_load_GL_EXT_gpu_shader4(load, userptr); + glad_gl_load_GL_EXT_histogram(load, userptr); + glad_gl_load_GL_EXT_index_func(load, userptr); + glad_gl_load_GL_EXT_index_material(load, userptr); + glad_gl_load_GL_EXT_light_texture(load, userptr); + glad_gl_load_GL_EXT_memory_object(load, userptr); + glad_gl_load_GL_EXT_memory_object_fd(load, userptr); + glad_gl_load_GL_EXT_memory_object_win32(load, userptr); + glad_gl_load_GL_EXT_multi_draw_arrays(load, userptr); + glad_gl_load_GL_EXT_multisample(load, userptr); + glad_gl_load_GL_EXT_paletted_texture(load, userptr); + glad_gl_load_GL_EXT_pixel_transform(load, userptr); + glad_gl_load_GL_EXT_point_parameters(load, userptr); + glad_gl_load_GL_EXT_polygon_offset(load, userptr); + glad_gl_load_GL_EXT_polygon_offset_clamp(load, userptr); + glad_gl_load_GL_EXT_provoking_vertex(load, userptr); + glad_gl_load_GL_EXT_raster_multisample(load, userptr); + glad_gl_load_GL_EXT_secondary_color(load, userptr); + glad_gl_load_GL_EXT_semaphore(load, userptr); + glad_gl_load_GL_EXT_semaphore_fd(load, userptr); + glad_gl_load_GL_EXT_semaphore_win32(load, userptr); + glad_gl_load_GL_EXT_separate_shader_objects(load, userptr); + glad_gl_load_GL_EXT_shader_framebuffer_fetch_non_coherent(load, userptr); + glad_gl_load_GL_EXT_shader_image_load_store(load, userptr); + glad_gl_load_GL_EXT_stencil_clear_tag(load, userptr); + glad_gl_load_GL_EXT_stencil_two_side(load, userptr); + glad_gl_load_GL_EXT_subtexture(load, userptr); + glad_gl_load_GL_EXT_texture3D(load, userptr); + glad_gl_load_GL_EXT_texture_array(load, userptr); + glad_gl_load_GL_EXT_texture_buffer_object(load, userptr); + glad_gl_load_GL_EXT_texture_integer(load, userptr); + glad_gl_load_GL_EXT_texture_object(load, userptr); + glad_gl_load_GL_EXT_texture_perturb_normal(load, userptr); + glad_gl_load_GL_EXT_texture_storage(load, userptr); + glad_gl_load_GL_EXT_timer_query(load, userptr); + glad_gl_load_GL_EXT_transform_feedback(load, userptr); + glad_gl_load_GL_EXT_vertex_array(load, userptr); + glad_gl_load_GL_EXT_vertex_attrib_64bit(load, userptr); + glad_gl_load_GL_EXT_vertex_shader(load, userptr); + glad_gl_load_GL_EXT_vertex_weighting(load, userptr); + glad_gl_load_GL_EXT_win32_keyed_mutex(load, userptr); + glad_gl_load_GL_EXT_window_rectangles(load, userptr); + glad_gl_load_GL_EXT_x11_sync_object(load, userptr); + glad_gl_load_GL_GREMEDY_frame_terminator(load, userptr); + glad_gl_load_GL_GREMEDY_string_marker(load, userptr); + glad_gl_load_GL_HP_image_transform(load, userptr); + glad_gl_load_GL_IBM_multimode_draw_arrays(load, userptr); + glad_gl_load_GL_IBM_static_data(load, userptr); + glad_gl_load_GL_IBM_vertex_array_lists(load, userptr); + glad_gl_load_GL_INGR_blend_func_separate(load, userptr); + glad_gl_load_GL_INTEL_framebuffer_CMAA(load, userptr); + glad_gl_load_GL_INTEL_map_texture(load, userptr); + glad_gl_load_GL_INTEL_parallel_arrays(load, userptr); + glad_gl_load_GL_INTEL_performance_query(load, userptr); + glad_gl_load_GL_KHR_blend_equation_advanced(load, userptr); + glad_gl_load_GL_KHR_debug(load, userptr); + glad_gl_load_GL_KHR_parallel_shader_compile(load, userptr); + glad_gl_load_GL_KHR_robustness(load, userptr); + glad_gl_load_GL_MESA_framebuffer_flip_y(load, userptr); + glad_gl_load_GL_MESA_resize_buffers(load, userptr); + glad_gl_load_GL_MESA_window_pos(load, userptr); + glad_gl_load_GL_NVX_conditional_render(load, userptr); + glad_gl_load_GL_NVX_gpu_multicast2(load, userptr); + glad_gl_load_GL_NVX_linked_gpu_multicast(load, userptr); + glad_gl_load_GL_NVX_progress_fence(load, userptr); + glad_gl_load_GL_NV_alpha_to_coverage_dither_control(load, userptr); + glad_gl_load_GL_NV_bindless_multi_draw_indirect(load, userptr); + glad_gl_load_GL_NV_bindless_multi_draw_indirect_count(load, userptr); + glad_gl_load_GL_NV_bindless_texture(load, userptr); + glad_gl_load_GL_NV_blend_equation_advanced(load, userptr); + glad_gl_load_GL_NV_clip_space_w_scaling(load, userptr); + glad_gl_load_GL_NV_command_list(load, userptr); + glad_gl_load_GL_NV_conditional_render(load, userptr); + glad_gl_load_GL_NV_conservative_raster(load, userptr); + glad_gl_load_GL_NV_conservative_raster_dilate(load, userptr); + glad_gl_load_GL_NV_conservative_raster_pre_snap_triangles(load, userptr); + glad_gl_load_GL_NV_copy_image(load, userptr); + glad_gl_load_GL_NV_depth_buffer_float(load, userptr); + glad_gl_load_GL_NV_draw_texture(load, userptr); + glad_gl_load_GL_NV_draw_vulkan_image(load, userptr); + glad_gl_load_GL_NV_evaluators(load, userptr); + glad_gl_load_GL_NV_explicit_multisample(load, userptr); + glad_gl_load_GL_NV_fence(load, userptr); + glad_gl_load_GL_NV_fragment_coverage_to_color(load, userptr); + glad_gl_load_GL_NV_fragment_program(load, userptr); + glad_gl_load_GL_NV_framebuffer_mixed_samples(load, userptr); + glad_gl_load_GL_NV_framebuffer_multisample_coverage(load, userptr); + glad_gl_load_GL_NV_geometry_program4(load, userptr); + glad_gl_load_GL_NV_gpu_multicast(load, userptr); + glad_gl_load_GL_NV_gpu_program4(load, userptr); + glad_gl_load_GL_NV_gpu_program5(load, userptr); + glad_gl_load_GL_NV_gpu_shader5(load, userptr); + glad_gl_load_GL_NV_half_float(load, userptr); + glad_gl_load_GL_NV_internalformat_sample_query(load, userptr); + glad_gl_load_GL_NV_memory_attachment(load, userptr); + glad_gl_load_GL_NV_memory_object_sparse(load, userptr); + glad_gl_load_GL_NV_mesh_shader(load, userptr); + glad_gl_load_GL_NV_occlusion_query(load, userptr); + glad_gl_load_GL_NV_parameter_buffer_object(load, userptr); + glad_gl_load_GL_NV_path_rendering(load, userptr); + glad_gl_load_GL_NV_pixel_data_range(load, userptr); + glad_gl_load_GL_NV_point_sprite(load, userptr); + glad_gl_load_GL_NV_present_video(load, userptr); + glad_gl_load_GL_NV_primitive_restart(load, userptr); + glad_gl_load_GL_NV_query_resource(load, userptr); + glad_gl_load_GL_NV_query_resource_tag(load, userptr); + glad_gl_load_GL_NV_register_combiners(load, userptr); + glad_gl_load_GL_NV_register_combiners2(load, userptr); + glad_gl_load_GL_NV_sample_locations(load, userptr); + glad_gl_load_GL_NV_scissor_exclusive(load, userptr); + glad_gl_load_GL_NV_shader_buffer_load(load, userptr); + glad_gl_load_GL_NV_shading_rate_image(load, userptr); + glad_gl_load_GL_NV_texture_barrier(load, userptr); + glad_gl_load_GL_NV_texture_multisample(load, userptr); + glad_gl_load_GL_NV_timeline_semaphore(load, userptr); + glad_gl_load_GL_NV_transform_feedback(load, userptr); + glad_gl_load_GL_NV_transform_feedback2(load, userptr); + glad_gl_load_GL_NV_vdpau_interop(load, userptr); + glad_gl_load_GL_NV_vdpau_interop2(load, userptr); + glad_gl_load_GL_NV_vertex_array_range(load, userptr); + glad_gl_load_GL_NV_vertex_attrib_integer_64bit(load, userptr); + glad_gl_load_GL_NV_vertex_buffer_unified_memory(load, userptr); + glad_gl_load_GL_NV_vertex_program(load, userptr); + glad_gl_load_GL_NV_vertex_program4(load, userptr); + glad_gl_load_GL_NV_video_capture(load, userptr); + glad_gl_load_GL_NV_viewport_swizzle(load, userptr); + glad_gl_load_GL_OES_byte_coordinates(load, userptr); + glad_gl_load_GL_OES_fixed_point(load, userptr); + glad_gl_load_GL_OES_query_matrix(load, userptr); + glad_gl_load_GL_OES_single_precision(load, userptr); + glad_gl_load_GL_OVR_multiview(load, userptr); + glad_gl_load_GL_PGI_misc_hints(load, userptr); + glad_gl_load_GL_SGIS_detail_texture(load, userptr); + glad_gl_load_GL_SGIS_fog_function(load, userptr); + glad_gl_load_GL_SGIS_multisample(load, userptr); + glad_gl_load_GL_SGIS_pixel_texture(load, userptr); + glad_gl_load_GL_SGIS_point_parameters(load, userptr); + glad_gl_load_GL_SGIS_sharpen_texture(load, userptr); + glad_gl_load_GL_SGIS_texture4D(load, userptr); + glad_gl_load_GL_SGIS_texture_color_mask(load, userptr); + glad_gl_load_GL_SGIS_texture_filter4(load, userptr); + glad_gl_load_GL_SGIX_async(load, userptr); + glad_gl_load_GL_SGIX_flush_raster(load, userptr); + glad_gl_load_GL_SGIX_fragment_lighting(load, userptr); + glad_gl_load_GL_SGIX_framezoom(load, userptr); + glad_gl_load_GL_SGIX_igloo_interface(load, userptr); + glad_gl_load_GL_SGIX_instruments(load, userptr); + glad_gl_load_GL_SGIX_list_priority(load, userptr); + glad_gl_load_GL_SGIX_pixel_texture(load, userptr); + glad_gl_load_GL_SGIX_polynomial_ffd(load, userptr); + glad_gl_load_GL_SGIX_reference_plane(load, userptr); + glad_gl_load_GL_SGIX_sprite(load, userptr); + glad_gl_load_GL_SGIX_tag_sample_buffer(load, userptr); + glad_gl_load_GL_SGI_color_table(load, userptr); + glad_gl_load_GL_SUNX_constant_data(load, userptr); + glad_gl_load_GL_SUN_global_alpha(load, userptr); + glad_gl_load_GL_SUN_mesh_array(load, userptr); + glad_gl_load_GL_SUN_triangle_list(load, userptr); + glad_gl_load_GL_SUN_vertex(load, userptr); + + + + return version; +} + + +int gladLoadGL( GLADloadfunc load) { + return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + +static int glad_gl_find_extensions_gles2(void) { + const char *exts = NULL; + char **exts_i = NULL; + if (!glad_gl_get_extensions(&exts, &exts_i)) return 0; + + GLAD_GL_AMD_framebuffer_multisample_advanced = glad_gl_has_extension(exts, exts_i, "GL_AMD_framebuffer_multisample_advanced"); + GLAD_GL_AMD_performance_monitor = glad_gl_has_extension(exts, exts_i, "GL_AMD_performance_monitor"); + GLAD_GL_APPLE_rgb_422 = glad_gl_has_extension(exts, exts_i, "GL_APPLE_rgb_422"); + GLAD_GL_EXT_EGL_image_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_storage"); + GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_minmax"); + GLAD_GL_EXT_debug_label = glad_gl_has_extension(exts, exts_i, "GL_EXT_debug_label"); + GLAD_GL_EXT_debug_marker = glad_gl_has_extension(exts, exts_i, "GL_EXT_debug_marker"); + GLAD_GL_EXT_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_instanced"); + GLAD_GL_EXT_external_buffer = glad_gl_has_extension(exts, exts_i, "GL_EXT_external_buffer"); + GLAD_GL_EXT_framebuffer_blit_layers = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_blit_layers"); + GLAD_GL_EXT_memory_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object"); + GLAD_GL_EXT_memory_object_fd = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object_fd"); + GLAD_GL_EXT_memory_object_win32 = glad_gl_has_extension(exts, exts_i, "GL_EXT_memory_object_win32"); + GLAD_GL_EXT_multi_draw_arrays = glad_gl_has_extension(exts, exts_i, "GL_EXT_multi_draw_arrays"); + GLAD_GL_EXT_multiview_tessellation_geometry_shader = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_tessellation_geometry_shader"); + GLAD_GL_EXT_multiview_texture_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_texture_multisample"); + GLAD_GL_EXT_multiview_timer_query = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_timer_query"); + GLAD_GL_EXT_polygon_offset_clamp = glad_gl_has_extension(exts, exts_i, "GL_EXT_polygon_offset_clamp"); + GLAD_GL_EXT_post_depth_coverage = glad_gl_has_extension(exts, exts_i, "GL_EXT_post_depth_coverage"); + GLAD_GL_EXT_raster_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_raster_multisample"); + GLAD_GL_EXT_semaphore = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore"); + GLAD_GL_EXT_semaphore_fd = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore_fd"); + GLAD_GL_EXT_semaphore_win32 = glad_gl_has_extension(exts, exts_i, "GL_EXT_semaphore_win32"); + GLAD_GL_EXT_separate_shader_objects = glad_gl_has_extension(exts, exts_i, "GL_EXT_separate_shader_objects"); + GLAD_GL_EXT_shader_framebuffer_fetch = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_framebuffer_fetch"); + GLAD_GL_EXT_shader_framebuffer_fetch_non_coherent = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_framebuffer_fetch_non_coherent"); + GLAD_GL_EXT_shader_integer_mix = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_integer_mix"); + GLAD_GL_EXT_shader_samples_identical = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_samples_identical"); + GLAD_GL_EXT_sparse_texture2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_sparse_texture2"); + GLAD_GL_EXT_texture_compression_rgtc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_rgtc"); + GLAD_GL_EXT_texture_compression_s3tc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_s3tc"); + GLAD_GL_EXT_texture_filter_anisotropic = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_filter_anisotropic"); + GLAD_GL_EXT_texture_filter_minmax = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_filter_minmax"); + GLAD_GL_EXT_texture_sRGB_R8 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_R8"); + GLAD_GL_EXT_texture_sRGB_RG8 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_RG8"); + GLAD_GL_EXT_texture_sRGB_decode = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_sRGB_decode"); + GLAD_GL_EXT_texture_shadow_lod = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_shadow_lod"); + GLAD_GL_EXT_texture_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_storage"); + GLAD_GL_EXT_win32_keyed_mutex = glad_gl_has_extension(exts, exts_i, "GL_EXT_win32_keyed_mutex"); + GLAD_GL_EXT_window_rectangles = glad_gl_has_extension(exts, exts_i, "GL_EXT_window_rectangles"); + GLAD_GL_INTEL_blackhole_render = glad_gl_has_extension(exts, exts_i, "GL_INTEL_blackhole_render"); + GLAD_GL_INTEL_conservative_rasterization = glad_gl_has_extension(exts, exts_i, "GL_INTEL_conservative_rasterization"); + GLAD_GL_INTEL_framebuffer_CMAA = glad_gl_has_extension(exts, exts_i, "GL_INTEL_framebuffer_CMAA"); + GLAD_GL_INTEL_performance_query = glad_gl_has_extension(exts, exts_i, "GL_INTEL_performance_query"); + GLAD_GL_KHR_blend_equation_advanced = glad_gl_has_extension(exts, exts_i, "GL_KHR_blend_equation_advanced"); + GLAD_GL_KHR_blend_equation_advanced_coherent = glad_gl_has_extension(exts, exts_i, "GL_KHR_blend_equation_advanced_coherent"); + GLAD_GL_KHR_context_flush_control = glad_gl_has_extension(exts, exts_i, "GL_KHR_context_flush_control"); + GLAD_GL_KHR_debug = glad_gl_has_extension(exts, exts_i, "GL_KHR_debug"); + GLAD_GL_KHR_no_error = glad_gl_has_extension(exts, exts_i, "GL_KHR_no_error"); + GLAD_GL_KHR_parallel_shader_compile = glad_gl_has_extension(exts, exts_i, "GL_KHR_parallel_shader_compile"); + GLAD_GL_KHR_robust_buffer_access_behavior = glad_gl_has_extension(exts, exts_i, "GL_KHR_robust_buffer_access_behavior"); + GLAD_GL_KHR_robustness = glad_gl_has_extension(exts, exts_i, "GL_KHR_robustness"); + GLAD_GL_KHR_shader_subgroup = glad_gl_has_extension(exts, exts_i, "GL_KHR_shader_subgroup"); + GLAD_GL_KHR_texture_compression_astc_hdr = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_hdr"); + GLAD_GL_KHR_texture_compression_astc_ldr = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_ldr"); + GLAD_GL_KHR_texture_compression_astc_sliced_3d = glad_gl_has_extension(exts, exts_i, "GL_KHR_texture_compression_astc_sliced_3d"); + GLAD_GL_MESA_framebuffer_flip_x = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_flip_x"); + GLAD_GL_MESA_framebuffer_flip_y = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_flip_y"); + GLAD_GL_MESA_framebuffer_swap_xy = glad_gl_has_extension(exts, exts_i, "GL_MESA_framebuffer_swap_xy"); + GLAD_GL_MESA_program_binary_formats = glad_gl_has_extension(exts, exts_i, "GL_MESA_program_binary_formats"); + GLAD_GL_MESA_shader_integer_functions = glad_gl_has_extension(exts, exts_i, "GL_MESA_shader_integer_functions"); + GLAD_GL_NVX_blend_equation_advanced_multi_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_NVX_blend_equation_advanced_multi_draw_buffers"); + GLAD_GL_NV_bindless_texture = glad_gl_has_extension(exts, exts_i, "GL_NV_bindless_texture"); + GLAD_GL_NV_blend_equation_advanced = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_equation_advanced"); + GLAD_GL_NV_blend_equation_advanced_coherent = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_equation_advanced_coherent"); + GLAD_GL_NV_blend_minmax_factor = glad_gl_has_extension(exts, exts_i, "GL_NV_blend_minmax_factor"); + GLAD_GL_NV_clip_space_w_scaling = glad_gl_has_extension(exts, exts_i, "GL_NV_clip_space_w_scaling"); + GLAD_GL_NV_compute_shader_derivatives = glad_gl_has_extension(exts, exts_i, "GL_NV_compute_shader_derivatives"); + GLAD_GL_NV_conditional_render = glad_gl_has_extension(exts, exts_i, "GL_NV_conditional_render"); + GLAD_GL_NV_conservative_raster = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster"); + GLAD_GL_NV_conservative_raster_pre_snap = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_pre_snap"); + GLAD_GL_NV_conservative_raster_pre_snap_triangles = glad_gl_has_extension(exts, exts_i, "GL_NV_conservative_raster_pre_snap_triangles"); + GLAD_GL_NV_draw_vulkan_image = glad_gl_has_extension(exts, exts_i, "GL_NV_draw_vulkan_image"); + GLAD_GL_NV_fence = glad_gl_has_extension(exts, exts_i, "GL_NV_fence"); + GLAD_GL_NV_fill_rectangle = glad_gl_has_extension(exts, exts_i, "GL_NV_fill_rectangle"); + GLAD_GL_NV_fragment_coverage_to_color = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_coverage_to_color"); + GLAD_GL_NV_fragment_shader_barycentric = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_shader_barycentric"); + GLAD_GL_NV_fragment_shader_interlock = glad_gl_has_extension(exts, exts_i, "GL_NV_fragment_shader_interlock"); + GLAD_GL_NV_framebuffer_mixed_samples = glad_gl_has_extension(exts, exts_i, "GL_NV_framebuffer_mixed_samples"); + GLAD_GL_NV_geometry_shader_passthrough = glad_gl_has_extension(exts, exts_i, "GL_NV_geometry_shader_passthrough"); + GLAD_GL_NV_gpu_shader5 = glad_gl_has_extension(exts, exts_i, "GL_NV_gpu_shader5"); + GLAD_GL_NV_internalformat_sample_query = glad_gl_has_extension(exts, exts_i, "GL_NV_internalformat_sample_query"); + GLAD_GL_NV_memory_attachment = glad_gl_has_extension(exts, exts_i, "GL_NV_memory_attachment"); + GLAD_GL_NV_memory_object_sparse = glad_gl_has_extension(exts, exts_i, "GL_NV_memory_object_sparse"); + GLAD_GL_NV_mesh_shader = glad_gl_has_extension(exts, exts_i, "GL_NV_mesh_shader"); + GLAD_GL_NV_path_rendering = glad_gl_has_extension(exts, exts_i, "GL_NV_path_rendering"); + GLAD_GL_NV_path_rendering_shared_edge = glad_gl_has_extension(exts, exts_i, "GL_NV_path_rendering_shared_edge"); + GLAD_GL_NV_primitive_shading_rate = glad_gl_has_extension(exts, exts_i, "GL_NV_primitive_shading_rate"); + GLAD_GL_NV_representative_fragment_test = glad_gl_has_extension(exts, exts_i, "GL_NV_representative_fragment_test"); + GLAD_GL_NV_sample_locations = glad_gl_has_extension(exts, exts_i, "GL_NV_sample_locations"); + GLAD_GL_NV_sample_mask_override_coverage = glad_gl_has_extension(exts, exts_i, "GL_NV_sample_mask_override_coverage"); + GLAD_GL_NV_scissor_exclusive = glad_gl_has_extension(exts, exts_i, "GL_NV_scissor_exclusive"); + GLAD_GL_NV_shader_atomic_fp16_vector = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_atomic_fp16_vector"); + GLAD_GL_NV_shader_subgroup_partitioned = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_subgroup_partitioned"); + GLAD_GL_NV_shader_texture_footprint = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_texture_footprint"); + GLAD_GL_NV_shading_rate_image = glad_gl_has_extension(exts, exts_i, "GL_NV_shading_rate_image"); + GLAD_GL_NV_stereo_view_rendering = glad_gl_has_extension(exts, exts_i, "GL_NV_stereo_view_rendering"); + GLAD_GL_NV_timeline_semaphore = glad_gl_has_extension(exts, exts_i, "GL_NV_timeline_semaphore"); + GLAD_GL_NV_viewport_array2 = glad_gl_has_extension(exts, exts_i, "GL_NV_viewport_array2"); + GLAD_GL_NV_viewport_swizzle = glad_gl_has_extension(exts, exts_i, "GL_NV_viewport_swizzle"); + GLAD_GL_OES_compressed_paletted_texture = glad_gl_has_extension(exts, exts_i, "GL_OES_compressed_paletted_texture"); + GLAD_GL_OVR_multiview = glad_gl_has_extension(exts, exts_i, "GL_OVR_multiview"); + GLAD_GL_OVR_multiview2 = glad_gl_has_extension(exts, exts_i, "GL_OVR_multiview2"); + GLAD_GL_AMD_compressed_3DC_texture = glad_gl_has_extension(exts, exts_i, "GL_AMD_compressed_3DC_texture"); + GLAD_GL_AMD_compressed_ATC_texture = glad_gl_has_extension(exts, exts_i, "GL_AMD_compressed_ATC_texture"); + GLAD_GL_AMD_program_binary_Z400 = glad_gl_has_extension(exts, exts_i, "GL_AMD_program_binary_Z400"); + GLAD_GL_ANDROID_extension_pack_es31a = glad_gl_has_extension(exts, exts_i, "GL_ANDROID_extension_pack_es31a"); + GLAD_GL_ANGLE_depth_texture = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_depth_texture"); + GLAD_GL_ANGLE_framebuffer_blit = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_framebuffer_blit"); + GLAD_GL_ANGLE_framebuffer_multisample = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_framebuffer_multisample"); + GLAD_GL_ANGLE_instanced_arrays = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_instanced_arrays"); + GLAD_GL_ANGLE_pack_reverse_row_order = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_pack_reverse_row_order"); + GLAD_GL_ANGLE_program_binary = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_program_binary"); + GLAD_GL_ANGLE_texture_compression_dxt3 = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_texture_compression_dxt3"); + GLAD_GL_ANGLE_texture_compression_dxt5 = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_texture_compression_dxt5"); + GLAD_GL_ANGLE_texture_usage = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_texture_usage"); + GLAD_GL_ANGLE_translated_shader_source = glad_gl_has_extension(exts, exts_i, "GL_ANGLE_translated_shader_source"); + GLAD_GL_APPLE_clip_distance = glad_gl_has_extension(exts, exts_i, "GL_APPLE_clip_distance"); + GLAD_GL_APPLE_color_buffer_packed_float = glad_gl_has_extension(exts, exts_i, "GL_APPLE_color_buffer_packed_float"); + GLAD_GL_APPLE_copy_texture_levels = glad_gl_has_extension(exts, exts_i, "GL_APPLE_copy_texture_levels"); + GLAD_GL_APPLE_framebuffer_multisample = glad_gl_has_extension(exts, exts_i, "GL_APPLE_framebuffer_multisample"); + GLAD_GL_APPLE_sync = glad_gl_has_extension(exts, exts_i, "GL_APPLE_sync"); + GLAD_GL_APPLE_texture_format_BGRA8888 = glad_gl_has_extension(exts, exts_i, "GL_APPLE_texture_format_BGRA8888"); + GLAD_GL_APPLE_texture_max_level = glad_gl_has_extension(exts, exts_i, "GL_APPLE_texture_max_level"); + GLAD_GL_APPLE_texture_packed_float = glad_gl_has_extension(exts, exts_i, "GL_APPLE_texture_packed_float"); + GLAD_GL_ARM_mali_program_binary = glad_gl_has_extension(exts, exts_i, "GL_ARM_mali_program_binary"); + GLAD_GL_ARM_mali_shader_binary = glad_gl_has_extension(exts, exts_i, "GL_ARM_mali_shader_binary"); + GLAD_GL_ARM_rgba8 = glad_gl_has_extension(exts, exts_i, "GL_ARM_rgba8"); + GLAD_GL_ARM_shader_core_properties = glad_gl_has_extension(exts, exts_i, "GL_ARM_shader_core_properties"); + GLAD_GL_ARM_shader_framebuffer_fetch = glad_gl_has_extension(exts, exts_i, "GL_ARM_shader_framebuffer_fetch"); + GLAD_GL_ARM_shader_framebuffer_fetch_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_ARM_shader_framebuffer_fetch_depth_stencil"); + GLAD_GL_ARM_texture_unnormalized_coordinates = glad_gl_has_extension(exts, exts_i, "GL_ARM_texture_unnormalized_coordinates"); + GLAD_GL_DMP_program_binary = glad_gl_has_extension(exts, exts_i, "GL_DMP_program_binary"); + GLAD_GL_DMP_shader_binary = glad_gl_has_extension(exts, exts_i, "GL_DMP_shader_binary"); + GLAD_GL_EXT_EGL_image_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_array"); + GLAD_GL_EXT_EGL_image_storage_compression = glad_gl_has_extension(exts, exts_i, "GL_EXT_EGL_image_storage_compression"); + GLAD_GL_EXT_YUV_target = glad_gl_has_extension(exts, exts_i, "GL_EXT_YUV_target"); + GLAD_GL_EXT_base_instance = glad_gl_has_extension(exts, exts_i, "GL_EXT_base_instance"); + GLAD_GL_EXT_blend_func_extended = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_func_extended"); + GLAD_GL_EXT_buffer_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_buffer_storage"); + GLAD_GL_EXT_clear_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_clear_texture"); + GLAD_GL_EXT_clip_control = glad_gl_has_extension(exts, exts_i, "GL_EXT_clip_control"); + GLAD_GL_EXT_clip_cull_distance = glad_gl_has_extension(exts, exts_i, "GL_EXT_clip_cull_distance"); + GLAD_GL_EXT_color_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_EXT_color_buffer_float"); + GLAD_GL_EXT_color_buffer_half_float = glad_gl_has_extension(exts, exts_i, "GL_EXT_color_buffer_half_float"); + GLAD_GL_EXT_conservative_depth = glad_gl_has_extension(exts, exts_i, "GL_EXT_conservative_depth"); + GLAD_GL_EXT_copy_image = glad_gl_has_extension(exts, exts_i, "GL_EXT_copy_image"); + GLAD_GL_EXT_depth_clamp = glad_gl_has_extension(exts, exts_i, "GL_EXT_depth_clamp"); + GLAD_GL_EXT_discard_framebuffer = glad_gl_has_extension(exts, exts_i, "GL_EXT_discard_framebuffer"); + GLAD_GL_EXT_disjoint_timer_query = glad_gl_has_extension(exts, exts_i, "GL_EXT_disjoint_timer_query"); + GLAD_GL_EXT_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_buffers"); + GLAD_GL_EXT_draw_buffers_indexed = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_buffers_indexed"); + GLAD_GL_EXT_draw_elements_base_vertex = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_elements_base_vertex"); + GLAD_GL_EXT_draw_transform_feedback = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_transform_feedback"); + GLAD_GL_EXT_float_blend = glad_gl_has_extension(exts, exts_i, "GL_EXT_float_blend"); + GLAD_GL_EXT_fragment_shading_rate = glad_gl_has_extension(exts, exts_i, "GL_EXT_fragment_shading_rate"); + GLAD_GL_EXT_geometry_point_size = glad_gl_has_extension(exts, exts_i, "GL_EXT_geometry_point_size"); + GLAD_GL_EXT_geometry_shader = glad_gl_has_extension(exts, exts_i, "GL_EXT_geometry_shader"); + GLAD_GL_EXT_gpu_shader5 = glad_gl_has_extension(exts, exts_i, "GL_EXT_gpu_shader5"); + GLAD_GL_EXT_instanced_arrays = glad_gl_has_extension(exts, exts_i, "GL_EXT_instanced_arrays"); + GLAD_GL_EXT_map_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_EXT_map_buffer_range"); + GLAD_GL_EXT_multi_draw_indirect = glad_gl_has_extension(exts, exts_i, "GL_EXT_multi_draw_indirect"); + GLAD_GL_EXT_multisampled_compatibility = glad_gl_has_extension(exts, exts_i, "GL_EXT_multisampled_compatibility"); + GLAD_GL_EXT_multisampled_render_to_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_multisampled_render_to_texture"); + GLAD_GL_EXT_multisampled_render_to_texture2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_multisampled_render_to_texture2"); + GLAD_GL_EXT_multiview_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_EXT_multiview_draw_buffers"); + GLAD_GL_EXT_occlusion_query_boolean = glad_gl_has_extension(exts, exts_i, "GL_EXT_occlusion_query_boolean"); + GLAD_GL_EXT_primitive_bounding_box = glad_gl_has_extension(exts, exts_i, "GL_EXT_primitive_bounding_box"); + GLAD_GL_EXT_protected_textures = glad_gl_has_extension(exts, exts_i, "GL_EXT_protected_textures"); + GLAD_GL_EXT_pvrtc_sRGB = glad_gl_has_extension(exts, exts_i, "GL_EXT_pvrtc_sRGB"); + GLAD_GL_EXT_read_format_bgra = glad_gl_has_extension(exts, exts_i, "GL_EXT_read_format_bgra"); + GLAD_GL_EXT_render_snorm = glad_gl_has_extension(exts, exts_i, "GL_EXT_render_snorm"); + GLAD_GL_EXT_robustness = glad_gl_has_extension(exts, exts_i, "GL_EXT_robustness"); + GLAD_GL_EXT_sRGB = glad_gl_has_extension(exts, exts_i, "GL_EXT_sRGB"); + GLAD_GL_EXT_sRGB_write_control = glad_gl_has_extension(exts, exts_i, "GL_EXT_sRGB_write_control"); + GLAD_GL_EXT_separate_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_EXT_separate_depth_stencil"); + GLAD_GL_EXT_shader_group_vote = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_group_vote"); + GLAD_GL_EXT_shader_implicit_conversions = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_implicit_conversions"); + GLAD_GL_EXT_shader_io_blocks = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_io_blocks"); + GLAD_GL_EXT_shader_non_constant_global_initializers = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_non_constant_global_initializers"); + GLAD_GL_EXT_shader_pixel_local_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_pixel_local_storage"); + GLAD_GL_EXT_shader_pixel_local_storage2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_pixel_local_storage2"); + GLAD_GL_EXT_shader_texture_lod = glad_gl_has_extension(exts, exts_i, "GL_EXT_shader_texture_lod"); + GLAD_GL_EXT_shadow_samplers = glad_gl_has_extension(exts, exts_i, "GL_EXT_shadow_samplers"); + GLAD_GL_EXT_sparse_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_sparse_texture"); + GLAD_GL_EXT_tessellation_point_size = glad_gl_has_extension(exts, exts_i, "GL_EXT_tessellation_point_size"); + GLAD_GL_EXT_tessellation_shader = glad_gl_has_extension(exts, exts_i, "GL_EXT_tessellation_shader"); + GLAD_GL_EXT_texture_border_clamp = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_border_clamp"); + GLAD_GL_EXT_texture_buffer = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_buffer"); + GLAD_GL_EXT_texture_compression_astc_decode_mode = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_astc_decode_mode"); + GLAD_GL_EXT_texture_compression_bptc = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_bptc"); + GLAD_GL_EXT_texture_compression_dxt1 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_dxt1"); + GLAD_GL_EXT_texture_compression_s3tc_srgb = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_compression_s3tc_srgb"); + GLAD_GL_EXT_texture_cube_map_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_cube_map_array"); + GLAD_GL_EXT_texture_format_BGRA8888 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_format_BGRA8888"); + GLAD_GL_EXT_texture_format_sRGB_override = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_format_sRGB_override"); + GLAD_GL_EXT_texture_mirror_clamp_to_edge = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_mirror_clamp_to_edge"); + GLAD_GL_EXT_texture_norm16 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_norm16"); + GLAD_GL_EXT_texture_query_lod = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_query_lod"); + GLAD_GL_EXT_texture_rg = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_rg"); + GLAD_GL_EXT_texture_storage_compression = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_storage_compression"); + GLAD_GL_EXT_texture_type_2_10_10_10_REV = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_type_2_10_10_10_REV"); + GLAD_GL_EXT_texture_view = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_view"); + GLAD_GL_EXT_unpack_subimage = glad_gl_has_extension(exts, exts_i, "GL_EXT_unpack_subimage"); + GLAD_GL_FJ_shader_binary_GCCSO = glad_gl_has_extension(exts, exts_i, "GL_FJ_shader_binary_GCCSO"); + GLAD_GL_IMG_bindless_texture = glad_gl_has_extension(exts, exts_i, "GL_IMG_bindless_texture"); + GLAD_GL_IMG_framebuffer_downsample = glad_gl_has_extension(exts, exts_i, "GL_IMG_framebuffer_downsample"); + GLAD_GL_IMG_multisampled_render_to_texture = glad_gl_has_extension(exts, exts_i, "GL_IMG_multisampled_render_to_texture"); + GLAD_GL_IMG_program_binary = glad_gl_has_extension(exts, exts_i, "GL_IMG_program_binary"); + GLAD_GL_IMG_read_format = glad_gl_has_extension(exts, exts_i, "GL_IMG_read_format"); + GLAD_GL_IMG_shader_binary = glad_gl_has_extension(exts, exts_i, "GL_IMG_shader_binary"); + GLAD_GL_IMG_texture_compression_pvrtc = glad_gl_has_extension(exts, exts_i, "GL_IMG_texture_compression_pvrtc"); + GLAD_GL_IMG_texture_compression_pvrtc2 = glad_gl_has_extension(exts, exts_i, "GL_IMG_texture_compression_pvrtc2"); + GLAD_GL_IMG_texture_filter_cubic = glad_gl_has_extension(exts, exts_i, "GL_IMG_texture_filter_cubic"); + GLAD_GL_MESA_bgra = glad_gl_has_extension(exts, exts_i, "GL_MESA_bgra"); + GLAD_GL_MESA_sampler_objects = glad_gl_has_extension(exts, exts_i, "GL_MESA_sampler_objects"); + GLAD_GL_NV_copy_buffer = glad_gl_has_extension(exts, exts_i, "GL_NV_copy_buffer"); + GLAD_GL_NV_coverage_sample = glad_gl_has_extension(exts, exts_i, "GL_NV_coverage_sample"); + GLAD_GL_NV_depth_nonlinear = glad_gl_has_extension(exts, exts_i, "GL_NV_depth_nonlinear"); + GLAD_GL_NV_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_NV_draw_buffers"); + GLAD_GL_NV_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_NV_draw_instanced"); + GLAD_GL_NV_explicit_attrib_location = glad_gl_has_extension(exts, exts_i, "GL_NV_explicit_attrib_location"); + GLAD_GL_NV_fbo_color_attachments = glad_gl_has_extension(exts, exts_i, "GL_NV_fbo_color_attachments"); + GLAD_GL_NV_framebuffer_blit = glad_gl_has_extension(exts, exts_i, "GL_NV_framebuffer_blit"); + GLAD_GL_NV_framebuffer_multisample = glad_gl_has_extension(exts, exts_i, "GL_NV_framebuffer_multisample"); + GLAD_GL_NV_generate_mipmap_sRGB = glad_gl_has_extension(exts, exts_i, "GL_NV_generate_mipmap_sRGB"); + GLAD_GL_NV_image_formats = glad_gl_has_extension(exts, exts_i, "GL_NV_image_formats"); + GLAD_GL_NV_instanced_arrays = glad_gl_has_extension(exts, exts_i, "GL_NV_instanced_arrays"); + GLAD_GL_NV_non_square_matrices = glad_gl_has_extension(exts, exts_i, "GL_NV_non_square_matrices"); + GLAD_GL_NV_pack_subimage = glad_gl_has_extension(exts, exts_i, "GL_NV_pack_subimage"); + GLAD_GL_NV_pixel_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_NV_pixel_buffer_object"); + GLAD_GL_NV_polygon_mode = glad_gl_has_extension(exts, exts_i, "GL_NV_polygon_mode"); + GLAD_GL_NV_read_buffer = glad_gl_has_extension(exts, exts_i, "GL_NV_read_buffer"); + GLAD_GL_NV_read_buffer_front = glad_gl_has_extension(exts, exts_i, "GL_NV_read_buffer_front"); + GLAD_GL_NV_read_depth = glad_gl_has_extension(exts, exts_i, "GL_NV_read_depth"); + GLAD_GL_NV_read_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_NV_read_depth_stencil"); + GLAD_GL_NV_read_stencil = glad_gl_has_extension(exts, exts_i, "GL_NV_read_stencil"); + GLAD_GL_NV_sRGB_formats = glad_gl_has_extension(exts, exts_i, "GL_NV_sRGB_formats"); + GLAD_GL_NV_shader_noperspective_interpolation = glad_gl_has_extension(exts, exts_i, "GL_NV_shader_noperspective_interpolation"); + GLAD_GL_NV_shadow_samplers_array = glad_gl_has_extension(exts, exts_i, "GL_NV_shadow_samplers_array"); + GLAD_GL_NV_shadow_samplers_cube = glad_gl_has_extension(exts, exts_i, "GL_NV_shadow_samplers_cube"); + GLAD_GL_NV_texture_border_clamp = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_border_clamp"); + GLAD_GL_NV_texture_compression_s3tc_update = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_compression_s3tc_update"); + GLAD_GL_NV_texture_npot_2D_mipmap = glad_gl_has_extension(exts, exts_i, "GL_NV_texture_npot_2D_mipmap"); + GLAD_GL_NV_viewport_array = glad_gl_has_extension(exts, exts_i, "GL_NV_viewport_array"); + GLAD_GL_OES_EGL_image = glad_gl_has_extension(exts, exts_i, "GL_OES_EGL_image"); + GLAD_GL_OES_EGL_image_external = glad_gl_has_extension(exts, exts_i, "GL_OES_EGL_image_external"); + GLAD_GL_OES_EGL_image_external_essl3 = glad_gl_has_extension(exts, exts_i, "GL_OES_EGL_image_external_essl3"); + GLAD_GL_OES_compressed_ETC1_RGB8_sub_texture = glad_gl_has_extension(exts, exts_i, "GL_OES_compressed_ETC1_RGB8_sub_texture"); + GLAD_GL_OES_compressed_ETC1_RGB8_texture = glad_gl_has_extension(exts, exts_i, "GL_OES_compressed_ETC1_RGB8_texture"); + GLAD_GL_OES_copy_image = glad_gl_has_extension(exts, exts_i, "GL_OES_copy_image"); + GLAD_GL_OES_depth24 = glad_gl_has_extension(exts, exts_i, "GL_OES_depth24"); + GLAD_GL_OES_depth32 = glad_gl_has_extension(exts, exts_i, "GL_OES_depth32"); + GLAD_GL_OES_depth_texture = glad_gl_has_extension(exts, exts_i, "GL_OES_depth_texture"); + GLAD_GL_OES_draw_buffers_indexed = glad_gl_has_extension(exts, exts_i, "GL_OES_draw_buffers_indexed"); + GLAD_GL_OES_draw_elements_base_vertex = glad_gl_has_extension(exts, exts_i, "GL_OES_draw_elements_base_vertex"); + GLAD_GL_OES_element_index_uint = glad_gl_has_extension(exts, exts_i, "GL_OES_element_index_uint"); + GLAD_GL_OES_fbo_render_mipmap = glad_gl_has_extension(exts, exts_i, "GL_OES_fbo_render_mipmap"); + GLAD_GL_OES_fragment_precision_high = glad_gl_has_extension(exts, exts_i, "GL_OES_fragment_precision_high"); + GLAD_GL_OES_geometry_point_size = glad_gl_has_extension(exts, exts_i, "GL_OES_geometry_point_size"); + GLAD_GL_OES_geometry_shader = glad_gl_has_extension(exts, exts_i, "GL_OES_geometry_shader"); + GLAD_GL_OES_get_program_binary = glad_gl_has_extension(exts, exts_i, "GL_OES_get_program_binary"); + GLAD_GL_OES_gpu_shader5 = glad_gl_has_extension(exts, exts_i, "GL_OES_gpu_shader5"); + GLAD_GL_OES_mapbuffer = glad_gl_has_extension(exts, exts_i, "GL_OES_mapbuffer"); + GLAD_GL_OES_packed_depth_stencil = glad_gl_has_extension(exts, exts_i, "GL_OES_packed_depth_stencil"); + GLAD_GL_OES_primitive_bounding_box = glad_gl_has_extension(exts, exts_i, "GL_OES_primitive_bounding_box"); + GLAD_GL_OES_required_internalformat = glad_gl_has_extension(exts, exts_i, "GL_OES_required_internalformat"); + GLAD_GL_OES_rgb8_rgba8 = glad_gl_has_extension(exts, exts_i, "GL_OES_rgb8_rgba8"); + GLAD_GL_OES_sample_shading = glad_gl_has_extension(exts, exts_i, "GL_OES_sample_shading"); + GLAD_GL_OES_sample_variables = glad_gl_has_extension(exts, exts_i, "GL_OES_sample_variables"); + GLAD_GL_OES_shader_image_atomic = glad_gl_has_extension(exts, exts_i, "GL_OES_shader_image_atomic"); + GLAD_GL_OES_shader_io_blocks = glad_gl_has_extension(exts, exts_i, "GL_OES_shader_io_blocks"); + GLAD_GL_OES_shader_multisample_interpolation = glad_gl_has_extension(exts, exts_i, "GL_OES_shader_multisample_interpolation"); + GLAD_GL_OES_standard_derivatives = glad_gl_has_extension(exts, exts_i, "GL_OES_standard_derivatives"); + GLAD_GL_OES_stencil1 = glad_gl_has_extension(exts, exts_i, "GL_OES_stencil1"); + GLAD_GL_OES_stencil4 = glad_gl_has_extension(exts, exts_i, "GL_OES_stencil4"); + GLAD_GL_OES_surfaceless_context = glad_gl_has_extension(exts, exts_i, "GL_OES_surfaceless_context"); + GLAD_GL_OES_tessellation_point_size = glad_gl_has_extension(exts, exts_i, "GL_OES_tessellation_point_size"); + GLAD_GL_OES_tessellation_shader = glad_gl_has_extension(exts, exts_i, "GL_OES_tessellation_shader"); + GLAD_GL_OES_texture_3D = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_3D"); + GLAD_GL_OES_texture_border_clamp = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_border_clamp"); + GLAD_GL_OES_texture_buffer = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_buffer"); + GLAD_GL_OES_texture_compression_astc = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_compression_astc"); + GLAD_GL_OES_texture_cube_map_array = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_cube_map_array"); + GLAD_GL_OES_texture_float = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_float"); + GLAD_GL_OES_texture_float_linear = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_float_linear"); + GLAD_GL_OES_texture_half_float = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_half_float"); + GLAD_GL_OES_texture_half_float_linear = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_half_float_linear"); + GLAD_GL_OES_texture_npot = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_npot"); + GLAD_GL_OES_texture_stencil8 = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_stencil8"); + GLAD_GL_OES_texture_storage_multisample_2d_array = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_storage_multisample_2d_array"); + GLAD_GL_OES_texture_view = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_view"); + GLAD_GL_OES_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_OES_vertex_array_object"); + GLAD_GL_OES_vertex_half_float = glad_gl_has_extension(exts, exts_i, "GL_OES_vertex_half_float"); + GLAD_GL_OES_vertex_type_10_10_10_2 = glad_gl_has_extension(exts, exts_i, "GL_OES_vertex_type_10_10_10_2"); + GLAD_GL_OES_viewport_array = glad_gl_has_extension(exts, exts_i, "GL_OES_viewport_array"); + GLAD_GL_OVR_multiview_multisampled_render_to_texture = glad_gl_has_extension(exts, exts_i, "GL_OVR_multiview_multisampled_render_to_texture"); + GLAD_GL_QCOM_YUV_texture_gather = glad_gl_has_extension(exts, exts_i, "GL_QCOM_YUV_texture_gather"); + GLAD_GL_QCOM_alpha_test = glad_gl_has_extension(exts, exts_i, "GL_QCOM_alpha_test"); + GLAD_GL_QCOM_binning_control = glad_gl_has_extension(exts, exts_i, "GL_QCOM_binning_control"); + GLAD_GL_QCOM_driver_control = glad_gl_has_extension(exts, exts_i, "GL_QCOM_driver_control"); + GLAD_GL_QCOM_extended_get = glad_gl_has_extension(exts, exts_i, "GL_QCOM_extended_get"); + GLAD_GL_QCOM_extended_get2 = glad_gl_has_extension(exts, exts_i, "GL_QCOM_extended_get2"); + GLAD_GL_QCOM_frame_extrapolation = glad_gl_has_extension(exts, exts_i, "GL_QCOM_frame_extrapolation"); + GLAD_GL_QCOM_framebuffer_foveated = glad_gl_has_extension(exts, exts_i, "GL_QCOM_framebuffer_foveated"); + GLAD_GL_QCOM_motion_estimation = glad_gl_has_extension(exts, exts_i, "GL_QCOM_motion_estimation"); + GLAD_GL_QCOM_perfmon_global_mode = glad_gl_has_extension(exts, exts_i, "GL_QCOM_perfmon_global_mode"); + GLAD_GL_QCOM_render_sRGB_R8_RG8 = glad_gl_has_extension(exts, exts_i, "GL_QCOM_render_sRGB_R8_RG8"); + GLAD_GL_QCOM_render_shared_exponent = glad_gl_has_extension(exts, exts_i, "GL_QCOM_render_shared_exponent"); + GLAD_GL_QCOM_shader_framebuffer_fetch_noncoherent = glad_gl_has_extension(exts, exts_i, "GL_QCOM_shader_framebuffer_fetch_noncoherent"); + GLAD_GL_QCOM_shader_framebuffer_fetch_rate = glad_gl_has_extension(exts, exts_i, "GL_QCOM_shader_framebuffer_fetch_rate"); + GLAD_GL_QCOM_shading_rate = glad_gl_has_extension(exts, exts_i, "GL_QCOM_shading_rate"); + GLAD_GL_QCOM_texture_foveated = glad_gl_has_extension(exts, exts_i, "GL_QCOM_texture_foveated"); + GLAD_GL_QCOM_texture_foveated2 = glad_gl_has_extension(exts, exts_i, "GL_QCOM_texture_foveated2"); + GLAD_GL_QCOM_texture_foveated_subsampled_layout = glad_gl_has_extension(exts, exts_i, "GL_QCOM_texture_foveated_subsampled_layout"); + GLAD_GL_QCOM_texture_lod_bias = glad_gl_has_extension(exts, exts_i, "GL_QCOM_texture_lod_bias"); + GLAD_GL_QCOM_tiled_rendering = glad_gl_has_extension(exts, exts_i, "GL_QCOM_tiled_rendering"); + GLAD_GL_QCOM_writeonly_rendering = glad_gl_has_extension(exts, exts_i, "GL_QCOM_writeonly_rendering"); + GLAD_GL_VIV_shader_binary = glad_gl_has_extension(exts, exts_i, "GL_VIV_shader_binary"); + + glad_gl_free_extensions(exts_i); + + return 1; +} + +static int glad_gl_find_core_gles2(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_ES_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_ES_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_ES_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_ES_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + version = glad_gl_find_core_gles2(); + + glad_gl_load_GL_ES_VERSION_2_0(load, userptr); + glad_gl_load_GL_ES_VERSION_3_0(load, userptr); + glad_gl_load_GL_ES_VERSION_3_1(load, userptr); + glad_gl_load_GL_ES_VERSION_3_2(load, userptr); + + if (!glad_gl_find_extensions_gles2()) return 0; + glad_gl_load_GL_AMD_framebuffer_multisample_advanced(load, userptr); + glad_gl_load_GL_AMD_performance_monitor(load, userptr); + glad_gl_load_GL_EXT_EGL_image_storage(load, userptr); + glad_gl_load_GL_EXT_blend_minmax(load, userptr); + glad_gl_load_GL_EXT_debug_label(load, userptr); + glad_gl_load_GL_EXT_debug_marker(load, userptr); + glad_gl_load_GL_EXT_draw_instanced(load, userptr); + glad_gl_load_GL_EXT_external_buffer(load, userptr); + glad_gl_load_GL_EXT_framebuffer_blit_layers(load, userptr); + glad_gl_load_GL_EXT_memory_object(load, userptr); + glad_gl_load_GL_EXT_memory_object_fd(load, userptr); + glad_gl_load_GL_EXT_memory_object_win32(load, userptr); + glad_gl_load_GL_EXT_multi_draw_arrays(load, userptr); + glad_gl_load_GL_EXT_polygon_offset_clamp(load, userptr); + glad_gl_load_GL_EXT_raster_multisample(load, userptr); + glad_gl_load_GL_EXT_semaphore(load, userptr); + glad_gl_load_GL_EXT_semaphore_fd(load, userptr); + glad_gl_load_GL_EXT_semaphore_win32(load, userptr); + glad_gl_load_GL_EXT_separate_shader_objects(load, userptr); + glad_gl_load_GL_EXT_shader_framebuffer_fetch_non_coherent(load, userptr); + glad_gl_load_GL_EXT_texture_storage(load, userptr); + glad_gl_load_GL_EXT_win32_keyed_mutex(load, userptr); + glad_gl_load_GL_EXT_window_rectangles(load, userptr); + glad_gl_load_GL_INTEL_framebuffer_CMAA(load, userptr); + glad_gl_load_GL_INTEL_performance_query(load, userptr); + glad_gl_load_GL_KHR_blend_equation_advanced(load, userptr); + glad_gl_load_GL_KHR_debug(load, userptr); + glad_gl_load_GL_KHR_parallel_shader_compile(load, userptr); + glad_gl_load_GL_KHR_robustness(load, userptr); + glad_gl_load_GL_MESA_framebuffer_flip_y(load, userptr); + glad_gl_load_GL_NV_bindless_texture(load, userptr); + glad_gl_load_GL_NV_blend_equation_advanced(load, userptr); + glad_gl_load_GL_NV_clip_space_w_scaling(load, userptr); + glad_gl_load_GL_NV_conditional_render(load, userptr); + glad_gl_load_GL_NV_conservative_raster(load, userptr); + glad_gl_load_GL_NV_conservative_raster_pre_snap_triangles(load, userptr); + glad_gl_load_GL_NV_draw_vulkan_image(load, userptr); + glad_gl_load_GL_NV_fence(load, userptr); + glad_gl_load_GL_NV_fragment_coverage_to_color(load, userptr); + glad_gl_load_GL_NV_framebuffer_mixed_samples(load, userptr); + glad_gl_load_GL_NV_gpu_shader5(load, userptr); + glad_gl_load_GL_NV_internalformat_sample_query(load, userptr); + glad_gl_load_GL_NV_memory_attachment(load, userptr); + glad_gl_load_GL_NV_memory_object_sparse(load, userptr); + glad_gl_load_GL_NV_mesh_shader(load, userptr); + glad_gl_load_GL_NV_path_rendering(load, userptr); + glad_gl_load_GL_NV_sample_locations(load, userptr); + glad_gl_load_GL_NV_scissor_exclusive(load, userptr); + glad_gl_load_GL_NV_shading_rate_image(load, userptr); + glad_gl_load_GL_NV_timeline_semaphore(load, userptr); + glad_gl_load_GL_NV_viewport_swizzle(load, userptr); + glad_gl_load_GL_OVR_multiview(load, userptr); + glad_gl_load_GL_ANGLE_framebuffer_blit(load, userptr); + glad_gl_load_GL_ANGLE_framebuffer_multisample(load, userptr); + glad_gl_load_GL_ANGLE_instanced_arrays(load, userptr); + glad_gl_load_GL_ANGLE_translated_shader_source(load, userptr); + glad_gl_load_GL_APPLE_copy_texture_levels(load, userptr); + glad_gl_load_GL_APPLE_framebuffer_multisample(load, userptr); + glad_gl_load_GL_APPLE_sync(load, userptr); + glad_gl_load_GL_ARM_shader_core_properties(load, userptr); + glad_gl_load_GL_EXT_base_instance(load, userptr); + glad_gl_load_GL_EXT_blend_func_extended(load, userptr); + glad_gl_load_GL_EXT_buffer_storage(load, userptr); + glad_gl_load_GL_EXT_clear_texture(load, userptr); + glad_gl_load_GL_EXT_clip_control(load, userptr); + glad_gl_load_GL_EXT_copy_image(load, userptr); + glad_gl_load_GL_EXT_discard_framebuffer(load, userptr); + glad_gl_load_GL_EXT_disjoint_timer_query(load, userptr); + glad_gl_load_GL_EXT_draw_buffers(load, userptr); + glad_gl_load_GL_EXT_draw_buffers_indexed(load, userptr); + glad_gl_load_GL_EXT_draw_elements_base_vertex(load, userptr); + glad_gl_load_GL_EXT_draw_transform_feedback(load, userptr); + glad_gl_load_GL_EXT_fragment_shading_rate(load, userptr); + glad_gl_load_GL_EXT_geometry_shader(load, userptr); + glad_gl_load_GL_EXT_instanced_arrays(load, userptr); + glad_gl_load_GL_EXT_map_buffer_range(load, userptr); + glad_gl_load_GL_EXT_multi_draw_indirect(load, userptr); + glad_gl_load_GL_EXT_multisampled_render_to_texture(load, userptr); + glad_gl_load_GL_EXT_multiview_draw_buffers(load, userptr); + glad_gl_load_GL_EXT_occlusion_query_boolean(load, userptr); + glad_gl_load_GL_EXT_primitive_bounding_box(load, userptr); + glad_gl_load_GL_EXT_robustness(load, userptr); + glad_gl_load_GL_EXT_shader_pixel_local_storage2(load, userptr); + glad_gl_load_GL_EXT_sparse_texture(load, userptr); + glad_gl_load_GL_EXT_tessellation_shader(load, userptr); + glad_gl_load_GL_EXT_texture_border_clamp(load, userptr); + glad_gl_load_GL_EXT_texture_buffer(load, userptr); + glad_gl_load_GL_EXT_texture_storage_compression(load, userptr); + glad_gl_load_GL_EXT_texture_view(load, userptr); + glad_gl_load_GL_IMG_bindless_texture(load, userptr); + glad_gl_load_GL_IMG_framebuffer_downsample(load, userptr); + glad_gl_load_GL_IMG_multisampled_render_to_texture(load, userptr); + glad_gl_load_GL_MESA_sampler_objects(load, userptr); + glad_gl_load_GL_NV_copy_buffer(load, userptr); + glad_gl_load_GL_NV_coverage_sample(load, userptr); + glad_gl_load_GL_NV_draw_buffers(load, userptr); + glad_gl_load_GL_NV_draw_instanced(load, userptr); + glad_gl_load_GL_NV_framebuffer_blit(load, userptr); + glad_gl_load_GL_NV_framebuffer_multisample(load, userptr); + glad_gl_load_GL_NV_instanced_arrays(load, userptr); + glad_gl_load_GL_NV_non_square_matrices(load, userptr); + glad_gl_load_GL_NV_polygon_mode(load, userptr); + glad_gl_load_GL_NV_read_buffer(load, userptr); + glad_gl_load_GL_NV_viewport_array(load, userptr); + glad_gl_load_GL_OES_EGL_image(load, userptr); + glad_gl_load_GL_OES_copy_image(load, userptr); + glad_gl_load_GL_OES_draw_buffers_indexed(load, userptr); + glad_gl_load_GL_OES_draw_elements_base_vertex(load, userptr); + glad_gl_load_GL_OES_geometry_shader(load, userptr); + glad_gl_load_GL_OES_get_program_binary(load, userptr); + glad_gl_load_GL_OES_mapbuffer(load, userptr); + glad_gl_load_GL_OES_primitive_bounding_box(load, userptr); + glad_gl_load_GL_OES_sample_shading(load, userptr); + glad_gl_load_GL_OES_tessellation_shader(load, userptr); + glad_gl_load_GL_OES_texture_3D(load, userptr); + glad_gl_load_GL_OES_texture_border_clamp(load, userptr); + glad_gl_load_GL_OES_texture_buffer(load, userptr); + glad_gl_load_GL_OES_texture_storage_multisample_2d_array(load, userptr); + glad_gl_load_GL_OES_texture_view(load, userptr); + glad_gl_load_GL_OES_vertex_array_object(load, userptr); + glad_gl_load_GL_OES_viewport_array(load, userptr); + glad_gl_load_GL_OVR_multiview_multisampled_render_to_texture(load, userptr); + glad_gl_load_GL_QCOM_alpha_test(load, userptr); + glad_gl_load_GL_QCOM_driver_control(load, userptr); + glad_gl_load_GL_QCOM_extended_get(load, userptr); + glad_gl_load_GL_QCOM_extended_get2(load, userptr); + glad_gl_load_GL_QCOM_frame_extrapolation(load, userptr); + glad_gl_load_GL_QCOM_framebuffer_foveated(load, userptr); + glad_gl_load_GL_QCOM_motion_estimation(load, userptr); + glad_gl_load_GL_QCOM_shader_framebuffer_fetch_noncoherent(load, userptr); + glad_gl_load_GL_QCOM_shading_rate(load, userptr); + glad_gl_load_GL_QCOM_texture_foveated(load, userptr); + glad_gl_load_GL_QCOM_tiled_rendering(load, userptr); + + + + return version; +} + + +int gladLoadGLES2( GLADloadfunc load) { + return gladLoadGLES2UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + + + +#ifdef __cplusplus +} +#endif diff --git a/core/deps/glslang b/core/deps/glslang index d1517d64c..76b52ebf7 160000 --- a/core/deps/glslang +++ b/core/deps/glslang @@ -1 +1 @@ -Subproject commit d1517d64cfca91f573af1bf7341dc3a5113349c0 +Subproject commit 76b52ebf77833908dc4c0dd6c70a9c357ac720bd diff --git a/core/deps/googletest b/core/deps/googletest new file mode 160000 index 000000000..e39786088 --- /dev/null +++ b/core/deps/googletest @@ -0,0 +1 @@ +Subproject commit e39786088138f2749d64e9e90e0f9902daa77c40 diff --git a/core/deps/gtest/gtest-death-test.h b/core/deps/gtest/gtest-death-test.h deleted file mode 100644 index 72e491d86..000000000 --- a/core/deps/gtest/gtest-death-test.h +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file defines the public API for death tests. It is -// #included by gtest.h so a user doesn't need to include this -// directly. -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ - -#include "internal/gtest-death-test-internal.h" - -namespace testing { - -// This flag controls the style of death tests. Valid values are "threadsafe", -// meaning that the death test child process will re-execute the test binary -// from the start, running only a single death test, or "fast", -// meaning that the child process will execute the test logic immediately -// after forking. -GTEST_DECLARE_string_(death_test_style); - -#if GTEST_HAS_DEATH_TEST - -namespace internal { - -// Returns a Boolean value indicating whether the caller is currently -// executing in the context of the death test child process. Tools such as -// Valgrind heap checkers may need this to modify their behavior in death -// tests. IMPORTANT: This is an internal utility. Using it may break the -// implementation of death tests. User code MUST NOT use it. -GTEST_API_ bool InDeathTestChild(); - -} // namespace internal - -// The following macros are useful for writing death tests. - -// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is -// executed: -// -// 1. It generates a warning if there is more than one active -// thread. This is because it's safe to fork() or clone() only -// when there is a single thread. -// -// 2. The parent process clone()s a sub-process and runs the death -// test in it; the sub-process exits with code 0 at the end of the -// death test, if it hasn't exited already. -// -// 3. The parent process waits for the sub-process to terminate. -// -// 4. The parent process checks the exit code and error message of -// the sub-process. -// -// Examples: -// -// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); -// for (int i = 0; i < 5; i++) { -// EXPECT_DEATH(server.ProcessRequest(i), -// "Invalid request .* in ProcessRequest()") -// << "Failed to die on request " << i; -// } -// -// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); -// -// bool KilledBySIGHUP(int exit_code) { -// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; -// } -// -// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); -// -// On the regular expressions used in death tests: -// -// GOOGLETEST_CM0005 DO NOT DELETE -// On POSIX-compliant systems (*nix), we use the library, -// which uses the POSIX extended regex syntax. -// -// On other platforms (e.g. Windows or Mac), we only support a simple regex -// syntax implemented as part of Google Test. This limited -// implementation should be enough most of the time when writing -// death tests; though it lacks many features you can find in PCRE -// or POSIX extended regex syntax. For example, we don't support -// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and -// repetition count ("x{5,7}"), among others. -// -// Below is the syntax that we do support. We chose it to be a -// subset of both PCRE and POSIX extended regex, so it's easy to -// learn wherever you come from. In the following: 'A' denotes a -// literal character, period (.), or a single \\ escape sequence; -// 'x' and 'y' denote regular expressions; 'm' and 'n' are for -// natural numbers. -// -// c matches any literal character c -// \\d matches any decimal digit -// \\D matches any character that's not a decimal digit -// \\f matches \f -// \\n matches \n -// \\r matches \r -// \\s matches any ASCII whitespace, including \n -// \\S matches any character that's not a whitespace -// \\t matches \t -// \\v matches \v -// \\w matches any letter, _, or decimal digit -// \\W matches any character that \\w doesn't match -// \\c matches any literal character c, which must be a punctuation -// . matches any single character except \n -// A? matches 0 or 1 occurrences of A -// A* matches 0 or many occurrences of A -// A+ matches 1 or many occurrences of A -// ^ matches the beginning of a string (not that of each line) -// $ matches the end of a string (not that of each line) -// xy matches x followed by y -// -// If you accidentally use PCRE or POSIX extended regex features -// not implemented by us, you will get a run-time failure. In that -// case, please try to rewrite your regular expression within the -// above syntax. -// -// This implementation is *not* meant to be as highly tuned or robust -// as a compiled regex library, but should perform well enough for a -// death test, which already incurs significant overhead by launching -// a child process. -// -// Known caveats: -// -// A "threadsafe" style death test obtains the path to the test -// program from argv[0] and re-executes it in the sub-process. For -// simplicity, the current implementation doesn't search the PATH -// when launching the sub-process. This means that the user must -// invoke the test program via a path that contains at least one -// path separator (e.g. path/to/foo_test and -// /absolute/path/to/bar_test are fine, but foo_test is not). This -// is rarely a problem as people usually don't put the test binary -// directory in PATH. -// - -// Asserts that a given statement causes the program to exit, with an -// integer exit status that satisfies predicate, and emitting error output -// that matches regex. -# define ASSERT_EXIT(statement, predicate, regex) \ - GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) - -// Like ASSERT_EXIT, but continues on to successive tests in the -// test suite, if any: -# define EXPECT_EXIT(statement, predicate, regex) \ - GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) - -// Asserts that a given statement causes the program to exit, either by -// explicitly exiting with a nonzero exit code or being killed by a -// signal, and emitting error output that matches regex. -# define ASSERT_DEATH(statement, regex) \ - ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) - -// Like ASSERT_DEATH, but continues on to successive tests in the -// test suite, if any: -# define EXPECT_DEATH(statement, regex) \ - EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) - -// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: - -// Tests that an exit code describes a normal exit with a given exit code. -class GTEST_API_ ExitedWithCode { - public: - explicit ExitedWithCode(int exit_code); - bool operator()(int exit_status) const; - private: - // No implementation - assignment is unsupported. - void operator=(const ExitedWithCode& other); - - const int exit_code_; -}; - -# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA -// Tests that an exit code describes an exit due to termination by a -// given signal. -// GOOGLETEST_CM0006 DO NOT DELETE -class GTEST_API_ KilledBySignal { - public: - explicit KilledBySignal(int signum); - bool operator()(int exit_status) const; - private: - const int signum_; -}; -# endif // !GTEST_OS_WINDOWS - -// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. -// The death testing framework causes this to have interesting semantics, -// since the sideeffects of the call are only visible in opt mode, and not -// in debug mode. -// -// In practice, this can be used to test functions that utilize the -// LOG(DFATAL) macro using the following style: -// -// int DieInDebugOr12(int* sideeffect) { -// if (sideeffect) { -// *sideeffect = 12; -// } -// LOG(DFATAL) << "death"; -// return 12; -// } -// -// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) { -// int sideeffect = 0; -// // Only asserts in dbg. -// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); -// -// #ifdef NDEBUG -// // opt-mode has sideeffect visible. -// EXPECT_EQ(12, sideeffect); -// #else -// // dbg-mode no visible sideeffect. -// EXPECT_EQ(0, sideeffect); -// #endif -// } -// -// This will assert that DieInDebugReturn12InOpt() crashes in debug -// mode, usually due to a DCHECK or LOG(DFATAL), but returns the -// appropriate fallback value (12 in this case) in opt mode. If you -// need to test that a function has appropriate side-effects in opt -// mode, include assertions against the side-effects. A general -// pattern for this is: -// -// EXPECT_DEBUG_DEATH({ -// // Side-effects here will have an effect after this statement in -// // opt mode, but none in debug mode. -// EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); -// }, "death"); -// -# ifdef NDEBUG - -# define EXPECT_DEBUG_DEATH(statement, regex) \ - GTEST_EXECUTE_STATEMENT_(statement, regex) - -# define ASSERT_DEBUG_DEATH(statement, regex) \ - GTEST_EXECUTE_STATEMENT_(statement, regex) - -# else - -# define EXPECT_DEBUG_DEATH(statement, regex) \ - EXPECT_DEATH(statement, regex) - -# define ASSERT_DEBUG_DEATH(statement, regex) \ - ASSERT_DEATH(statement, regex) - -# endif // NDEBUG for EXPECT_DEBUG_DEATH -#endif // GTEST_HAS_DEATH_TEST - -// This macro is used for implementing macros such as -// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where -// death tests are not supported. Those macros must compile on such systems -// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters -// on systems that support death tests. This allows one to write such a macro on -// a system that does not support death tests and be sure that it will compile -// on a death-test supporting system. It is exposed publicly so that systems -// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST -// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and -// ASSERT_DEATH_IF_SUPPORTED. -// -// Parameters: -// statement - A statement that a macro such as EXPECT_DEATH would test -// for program termination. This macro has to make sure this -// statement is compiled but not executed, to ensure that -// EXPECT_DEATH_IF_SUPPORTED compiles with a certain -// parameter if and only if EXPECT_DEATH compiles with it. -// regex - A regex that a macro such as EXPECT_DEATH would use to test -// the output of statement. This parameter has to be -// compiled but not evaluated by this macro, to ensure that -// this macro only accepts expressions that a macro such as -// EXPECT_DEATH would accept. -// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED -// and a return statement for ASSERT_DEATH_IF_SUPPORTED. -// This ensures that ASSERT_DEATH_IF_SUPPORTED will not -// compile inside functions where ASSERT_DEATH doesn't -// compile. -// -// The branch that has an always false condition is used to ensure that -// statement and regex are compiled (and thus syntactically correct) but -// never executed. The unreachable code macro protects the terminator -// statement from generating an 'unreachable code' warning in case -// statement unconditionally returns or throws. The Message constructor at -// the end allows the syntax of streaming additional messages into the -// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. -# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - GTEST_LOG_(WARNING) \ - << "Death tests are not supported on this platform.\n" \ - << "Statement '" #statement "' cannot be verified."; \ - } else if (::testing::internal::AlwaysFalse()) { \ - ::testing::internal::RE::PartialMatch(".*", (regex)); \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - terminator; \ - } else \ - ::testing::Message() - -// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and -// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if -// death tests are supported; otherwise they just issue a warning. This is -// useful when you are combining death test assertions with normal test -// assertions in one test. -#if GTEST_HAS_DEATH_TEST -# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ - EXPECT_DEATH(statement, regex) -# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ - ASSERT_DEATH(statement, regex) -#else -# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ - GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) -# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ - GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) -#endif - -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ diff --git a/core/deps/gtest/gtest-matchers.h b/core/deps/gtest/gtest-matchers.h deleted file mode 100644 index 8eabd18a2..000000000 --- a/core/deps/gtest/gtest-matchers.h +++ /dev/null @@ -1,750 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This file implements just enough of the matcher interface to allow -// EXPECT_DEATH and friends to accept a matcher argument. - -// IWYU pragma: private, include "testing/base/public/gunit.h" -// IWYU pragma: friend third_party/googletest/googlemock/.* -// IWYU pragma: friend third_party/googletest/googletest/.* - -#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ -#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ - -#include -#include -#include -#include - -#include "gtest-printers.h" -#include "internal/gtest-internal.h" -#include "internal/gtest-port.h" - -// MSVC warning C5046 is new as of VS2017 version 15.8. -#if defined(_MSC_VER) && _MSC_VER >= 1915 -#define GTEST_MAYBE_5046_ 5046 -#else -#define GTEST_MAYBE_5046_ -#endif - -GTEST_DISABLE_MSC_WARNINGS_PUSH_( - 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by - clients of class B */ - /* Symbol involving type with internal linkage not defined */) - -namespace testing { - -// To implement a matcher Foo for type T, define: -// 1. a class FooMatcherImpl that implements the -// MatcherInterface interface, and -// 2. a factory function that creates a Matcher object from a -// FooMatcherImpl*. -// -// The two-level delegation design makes it possible to allow a user -// to write "v" instead of "Eq(v)" where a Matcher is expected, which -// is impossible if we pass matchers by pointers. It also eases -// ownership management as Matcher objects can now be copied like -// plain values. - -// MatchResultListener is an abstract class. Its << operator can be -// used by a matcher to explain why a value matches or doesn't match. -// -class MatchResultListener { - public: - // Creates a listener object with the given underlying ostream. The - // listener does not own the ostream, and does not dereference it - // in the constructor or destructor. - explicit MatchResultListener(::std::ostream* os) : stream_(os) {} - virtual ~MatchResultListener() = 0; // Makes this class abstract. - - // Streams x to the underlying ostream; does nothing if the ostream - // is NULL. - template - MatchResultListener& operator<<(const T& x) { - if (stream_ != nullptr) *stream_ << x; - return *this; - } - - // Returns the underlying ostream. - ::std::ostream* stream() { return stream_; } - - // Returns true if and only if the listener is interested in an explanation - // of the match result. A matcher's MatchAndExplain() method can use - // this information to avoid generating the explanation when no one - // intends to hear it. - bool IsInterested() const { return stream_ != nullptr; } - - private: - ::std::ostream* const stream_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); -}; - -inline MatchResultListener::~MatchResultListener() { -} - -// An instance of a subclass of this knows how to describe itself as a -// matcher. -class MatcherDescriberInterface { - public: - virtual ~MatcherDescriberInterface() {} - - // Describes this matcher to an ostream. The function should print - // a verb phrase that describes the property a value matching this - // matcher should have. The subject of the verb phrase is the value - // being matched. For example, the DescribeTo() method of the Gt(7) - // matcher prints "is greater than 7". - virtual void DescribeTo(::std::ostream* os) const = 0; - - // Describes the negation of this matcher to an ostream. For - // example, if the description of this matcher is "is greater than - // 7", the negated description could be "is not greater than 7". - // You are not required to override this when implementing - // MatcherInterface, but it is highly advised so that your matcher - // can produce good error messages. - virtual void DescribeNegationTo(::std::ostream* os) const { - *os << "not ("; - DescribeTo(os); - *os << ")"; - } -}; - -// The implementation of a matcher. -template -class MatcherInterface : public MatcherDescriberInterface { - public: - // Returns true if and only if the matcher matches x; also explains the - // match result to 'listener' if necessary (see the next paragraph), in - // the form of a non-restrictive relative clause ("which ...", - // "whose ...", etc) that describes x. For example, the - // MatchAndExplain() method of the Pointee(...) matcher should - // generate an explanation like "which points to ...". - // - // Implementations of MatchAndExplain() should add an explanation of - // the match result *if and only if* they can provide additional - // information that's not already present (or not obvious) in the - // print-out of x and the matcher's description. Whether the match - // succeeds is not a factor in deciding whether an explanation is - // needed, as sometimes the caller needs to print a failure message - // when the match succeeds (e.g. when the matcher is used inside - // Not()). - // - // For example, a "has at least 10 elements" matcher should explain - // what the actual element count is, regardless of the match result, - // as it is useful information to the reader; on the other hand, an - // "is empty" matcher probably only needs to explain what the actual - // size is when the match fails, as it's redundant to say that the - // size is 0 when the value is already known to be empty. - // - // You should override this method when defining a new matcher. - // - // It's the responsibility of the caller (Google Test) to guarantee - // that 'listener' is not NULL. This helps to simplify a matcher's - // implementation when it doesn't care about the performance, as it - // can talk to 'listener' without checking its validity first. - // However, in order to implement dummy listeners efficiently, - // listener->stream() may be NULL. - virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; - - // Inherits these methods from MatcherDescriberInterface: - // virtual void DescribeTo(::std::ostream* os) const = 0; - // virtual void DescribeNegationTo(::std::ostream* os) const; -}; - -namespace internal { - -// Converts a MatcherInterface to a MatcherInterface. -template -class MatcherInterfaceAdapter : public MatcherInterface { - public: - explicit MatcherInterfaceAdapter(const MatcherInterface* impl) - : impl_(impl) {} - ~MatcherInterfaceAdapter() override { delete impl_; } - - void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); } - - void DescribeNegationTo(::std::ostream* os) const override { - impl_->DescribeNegationTo(os); - } - - bool MatchAndExplain(const T& x, - MatchResultListener* listener) const override { - return impl_->MatchAndExplain(x, listener); - } - - private: - const MatcherInterface* const impl_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); -}; - -struct AnyEq { - template - bool operator()(const A& a, const B& b) const { return a == b; } -}; -struct AnyNe { - template - bool operator()(const A& a, const B& b) const { return a != b; } -}; -struct AnyLt { - template - bool operator()(const A& a, const B& b) const { return a < b; } -}; -struct AnyGt { - template - bool operator()(const A& a, const B& b) const { return a > b; } -}; -struct AnyLe { - template - bool operator()(const A& a, const B& b) const { return a <= b; } -}; -struct AnyGe { - template - bool operator()(const A& a, const B& b) const { return a >= b; } -}; - -// A match result listener that ignores the explanation. -class DummyMatchResultListener : public MatchResultListener { - public: - DummyMatchResultListener() : MatchResultListener(nullptr) {} - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); -}; - -// A match result listener that forwards the explanation to a given -// ostream. The difference between this and MatchResultListener is -// that the former is concrete. -class StreamMatchResultListener : public MatchResultListener { - public: - explicit StreamMatchResultListener(::std::ostream* os) - : MatchResultListener(os) {} - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); -}; - -// An internal class for implementing Matcher, which will derive -// from it. We put functionalities common to all Matcher -// specializations here to avoid code duplication. -template -class MatcherBase { - public: - // Returns true if and only if the matcher matches x; also explains the - // match result to 'listener'. - bool MatchAndExplain(const T& x, MatchResultListener* listener) const { - return impl_->MatchAndExplain(x, listener); - } - - // Returns true if and only if this matcher matches x. - bool Matches(const T& x) const { - DummyMatchResultListener dummy; - return MatchAndExplain(x, &dummy); - } - - // Describes this matcher to an ostream. - void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } - - // Describes the negation of this matcher to an ostream. - void DescribeNegationTo(::std::ostream* os) const { - impl_->DescribeNegationTo(os); - } - - // Explains why x matches, or doesn't match, the matcher. - void ExplainMatchResultTo(const T& x, ::std::ostream* os) const { - StreamMatchResultListener listener(os); - MatchAndExplain(x, &listener); - } - - // Returns the describer for this matcher object; retains ownership - // of the describer, which is only guaranteed to be alive when - // this matcher object is alive. - const MatcherDescriberInterface* GetDescriber() const { - return impl_.get(); - } - - protected: - MatcherBase() {} - - // Constructs a matcher from its implementation. - explicit MatcherBase(const MatcherInterface* impl) : impl_(impl) {} - - template - explicit MatcherBase( - const MatcherInterface* impl, - typename std::enable_if::value>::type* = - nullptr) - : impl_(new internal::MatcherInterfaceAdapter(impl)) {} - - MatcherBase(const MatcherBase&) = default; - MatcherBase& operator=(const MatcherBase&) = default; - MatcherBase(MatcherBase&&) = default; - MatcherBase& operator=(MatcherBase&&) = default; - - virtual ~MatcherBase() {} - - private: - std::shared_ptr> impl_; -}; - -} // namespace internal - -// A Matcher is a copyable and IMMUTABLE (except by assignment) -// object that can check whether a value of type T matches. The -// implementation of Matcher is just a std::shared_ptr to const -// MatcherInterface. Don't inherit from Matcher! -template -class Matcher : public internal::MatcherBase { - public: - // Constructs a null matcher. Needed for storing Matcher objects in STL - // containers. A default-constructed matcher is not yet initialized. You - // cannot use it until a valid value has been assigned to it. - explicit Matcher() {} // NOLINT - - // Constructs a matcher from its implementation. - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - - template - explicit Matcher( - const MatcherInterface* impl, - typename std::enable_if::value>::type* = - nullptr) - : internal::MatcherBase(impl) {} - - // Implicit constructor here allows people to write - // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes - Matcher(T value); // NOLINT -}; - -// The following two specializations allow the user to write str -// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string -// matcher is expected. -template <> -class GTEST_API_ Matcher - : public internal::MatcherBase { - public: - Matcher() {} - - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - - // Allows the user to write str instead of Eq(str) sometimes, where - // str is a std::string object. - Matcher(const std::string& s); // NOLINT - - // Allows the user to write "foo" instead of Eq("foo") sometimes. - Matcher(const char* s); // NOLINT -}; - -template <> -class GTEST_API_ Matcher - : public internal::MatcherBase { - public: - Matcher() {} - - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - - // Allows the user to write str instead of Eq(str) sometimes, where - // str is a string object. - Matcher(const std::string& s); // NOLINT - - // Allows the user to write "foo" instead of Eq("foo") sometimes. - Matcher(const char* s); // NOLINT -}; - -#if GTEST_HAS_ABSL -// The following two specializations allow the user to write str -// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view -// matcher is expected. -template <> -class GTEST_API_ Matcher - : public internal::MatcherBase { - public: - Matcher() {} - - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - - // Allows the user to write str instead of Eq(str) sometimes, where - // str is a std::string object. - Matcher(const std::string& s); // NOLINT - - // Allows the user to write "foo" instead of Eq("foo") sometimes. - Matcher(const char* s); // NOLINT - - // Allows the user to pass absl::string_views directly. - Matcher(absl::string_view s); // NOLINT -}; - -template <> -class GTEST_API_ Matcher - : public internal::MatcherBase { - public: - Matcher() {} - - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - explicit Matcher(const MatcherInterface* impl) - : internal::MatcherBase(impl) {} - - // Allows the user to write str instead of Eq(str) sometimes, where - // str is a std::string object. - Matcher(const std::string& s); // NOLINT - - // Allows the user to write "foo" instead of Eq("foo") sometimes. - Matcher(const char* s); // NOLINT - - // Allows the user to pass absl::string_views directly. - Matcher(absl::string_view s); // NOLINT -}; -#endif // GTEST_HAS_ABSL - -// Prints a matcher in a human-readable format. -template -std::ostream& operator<<(std::ostream& os, const Matcher& matcher) { - matcher.DescribeTo(&os); - return os; -} - -// The PolymorphicMatcher class template makes it easy to implement a -// polymorphic matcher (i.e. a matcher that can match values of more -// than one type, e.g. Eq(n) and NotNull()). -// -// To define a polymorphic matcher, a user should provide an Impl -// class that has a DescribeTo() method and a DescribeNegationTo() -// method, and define a member function (or member function template) -// -// bool MatchAndExplain(const Value& value, -// MatchResultListener* listener) const; -// -// See the definition of NotNull() for a complete example. -template -class PolymorphicMatcher { - public: - explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} - - // Returns a mutable reference to the underlying matcher - // implementation object. - Impl& mutable_impl() { return impl_; } - - // Returns an immutable reference to the underlying matcher - // implementation object. - const Impl& impl() const { return impl_; } - - template - operator Matcher() const { - return Matcher(new MonomorphicImpl(impl_)); - } - - private: - template - class MonomorphicImpl : public MatcherInterface { - public: - explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} - - void DescribeTo(::std::ostream* os) const override { impl_.DescribeTo(os); } - - void DescribeNegationTo(::std::ostream* os) const override { - impl_.DescribeNegationTo(os); - } - - bool MatchAndExplain(T x, MatchResultListener* listener) const override { - return impl_.MatchAndExplain(x, listener); - } - - private: - const Impl impl_; - }; - - Impl impl_; -}; - -// Creates a matcher from its implementation. -// DEPRECATED: Especially in the generic code, prefer: -// Matcher(new MyMatcherImpl(...)); -// -// MakeMatcher may create a Matcher that accepts its argument by value, which -// leads to unnecessary copies & lack of support for non-copyable types. -template -inline Matcher MakeMatcher(const MatcherInterface* impl) { - return Matcher(impl); -} - -// Creates a polymorphic matcher from its implementation. This is -// easier to use than the PolymorphicMatcher constructor as it -// doesn't require you to explicitly write the template argument, e.g. -// -// MakePolymorphicMatcher(foo); -// vs -// PolymorphicMatcher(foo); -template -inline PolymorphicMatcher MakePolymorphicMatcher(const Impl& impl) { - return PolymorphicMatcher(impl); -} - -namespace internal { -// Implements a matcher that compares a given value with a -// pre-supplied value using one of the ==, <=, <, etc, operators. The -// two values being compared don't have to have the same type. -// -// The matcher defined here is polymorphic (for example, Eq(5) can be -// used to match an int, a short, a double, etc). Therefore we use -// a template type conversion operator in the implementation. -// -// The following template definition assumes that the Rhs parameter is -// a "bare" type (i.e. neither 'const T' nor 'T&'). -template -class ComparisonBase { - public: - explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} - template - operator Matcher() const { - return Matcher(new Impl(rhs_)); - } - - private: - template - static const T& Unwrap(const T& v) { return v; } - template - static const T& Unwrap(std::reference_wrapper v) { return v; } - - template - class Impl : public MatcherInterface { - public: - explicit Impl(const Rhs& rhs) : rhs_(rhs) {} - bool MatchAndExplain(Lhs lhs, - MatchResultListener* /* listener */) const override { - return Op()(lhs, Unwrap(rhs_)); - } - void DescribeTo(::std::ostream* os) const override { - *os << D::Desc() << " "; - UniversalPrint(Unwrap(rhs_), os); - } - void DescribeNegationTo(::std::ostream* os) const override { - *os << D::NegatedDesc() << " "; - UniversalPrint(Unwrap(rhs_), os); - } - - private: - Rhs rhs_; - }; - Rhs rhs_; -}; - -template -class EqMatcher : public ComparisonBase, Rhs, AnyEq> { - public: - explicit EqMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyEq>(rhs) { } - static const char* Desc() { return "is equal to"; } - static const char* NegatedDesc() { return "isn't equal to"; } -}; -template -class NeMatcher : public ComparisonBase, Rhs, AnyNe> { - public: - explicit NeMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyNe>(rhs) { } - static const char* Desc() { return "isn't equal to"; } - static const char* NegatedDesc() { return "is equal to"; } -}; -template -class LtMatcher : public ComparisonBase, Rhs, AnyLt> { - public: - explicit LtMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyLt>(rhs) { } - static const char* Desc() { return "is <"; } - static const char* NegatedDesc() { return "isn't <"; } -}; -template -class GtMatcher : public ComparisonBase, Rhs, AnyGt> { - public: - explicit GtMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyGt>(rhs) { } - static const char* Desc() { return "is >"; } - static const char* NegatedDesc() { return "isn't >"; } -}; -template -class LeMatcher : public ComparisonBase, Rhs, AnyLe> { - public: - explicit LeMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyLe>(rhs) { } - static const char* Desc() { return "is <="; } - static const char* NegatedDesc() { return "isn't <="; } -}; -template -class GeMatcher : public ComparisonBase, Rhs, AnyGe> { - public: - explicit GeMatcher(const Rhs& rhs) - : ComparisonBase, Rhs, AnyGe>(rhs) { } - static const char* Desc() { return "is >="; } - static const char* NegatedDesc() { return "isn't >="; } -}; - -// Implements polymorphic matchers MatchesRegex(regex) and -// ContainsRegex(regex), which can be used as a Matcher as long as -// T can be converted to a string. -class MatchesRegexMatcher { - public: - MatchesRegexMatcher(const RE* regex, bool full_match) - : regex_(regex), full_match_(full_match) {} - -#if GTEST_HAS_ABSL - bool MatchAndExplain(const absl::string_view& s, - MatchResultListener* listener) const { - return MatchAndExplain(std::string(s), listener); - } -#endif // GTEST_HAS_ABSL - - // Accepts pointer types, particularly: - // const char* - // char* - // const wchar_t* - // wchar_t* - template - bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { - return s != nullptr && MatchAndExplain(std::string(s), listener); - } - - // Matches anything that can convert to std::string. - // - // This is a template, not just a plain function with const std::string&, - // because absl::string_view has some interfering non-explicit constructors. - template - bool MatchAndExplain(const MatcheeStringType& s, - MatchResultListener* /* listener */) const { - const std::string& s2(s); - return full_match_ ? RE::FullMatch(s2, *regex_) - : RE::PartialMatch(s2, *regex_); - } - - void DescribeTo(::std::ostream* os) const { - *os << (full_match_ ? "matches" : "contains") << " regular expression "; - UniversalPrinter::Print(regex_->pattern(), os); - } - - void DescribeNegationTo(::std::ostream* os) const { - *os << "doesn't " << (full_match_ ? "match" : "contain") - << " regular expression "; - UniversalPrinter::Print(regex_->pattern(), os); - } - - private: - const std::shared_ptr regex_; - const bool full_match_; -}; -} // namespace internal - -// Matches a string that fully matches regular expression 'regex'. -// The matcher takes ownership of 'regex'. -inline PolymorphicMatcher MatchesRegex( - const internal::RE* regex) { - return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); -} -inline PolymorphicMatcher MatchesRegex( - const std::string& regex) { - return MatchesRegex(new internal::RE(regex)); -} - -// Matches a string that contains regular expression 'regex'. -// The matcher takes ownership of 'regex'. -inline PolymorphicMatcher ContainsRegex( - const internal::RE* regex) { - return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); -} -inline PolymorphicMatcher ContainsRegex( - const std::string& regex) { - return ContainsRegex(new internal::RE(regex)); -} - -// Creates a polymorphic matcher that matches anything equal to x. -// Note: if the parameter of Eq() were declared as const T&, Eq("foo") -// wouldn't compile. -template -inline internal::EqMatcher Eq(T x) { return internal::EqMatcher(x); } - -// Constructs a Matcher from a 'value' of type T. The constructed -// matcher matches any value that's equal to 'value'. -template -Matcher::Matcher(T value) { *this = Eq(value); } - -// Creates a monomorphic matcher that matches anything with type Lhs -// and equal to rhs. A user may need to use this instead of Eq(...) -// in order to resolve an overloading ambiguity. -// -// TypedEq(x) is just a convenient short-hand for Matcher(Eq(x)) -// or Matcher(x), but more readable than the latter. -// -// We could define similar monomorphic matchers for other comparison -// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do -// it yet as those are used much less than Eq() in practice. A user -// can always write Matcher(Lt(5)) to be explicit about the type, -// for example. -template -inline Matcher TypedEq(const Rhs& rhs) { return Eq(rhs); } - -// Creates a polymorphic matcher that matches anything >= x. -template -inline internal::GeMatcher Ge(Rhs x) { - return internal::GeMatcher(x); -} - -// Creates a polymorphic matcher that matches anything > x. -template -inline internal::GtMatcher Gt(Rhs x) { - return internal::GtMatcher(x); -} - -// Creates a polymorphic matcher that matches anything <= x. -template -inline internal::LeMatcher Le(Rhs x) { - return internal::LeMatcher(x); -} - -// Creates a polymorphic matcher that matches anything < x. -template -inline internal::LtMatcher Lt(Rhs x) { - return internal::LtMatcher(x); -} - -// Creates a polymorphic matcher that matches anything != x. -template -inline internal::NeMatcher Ne(Rhs x) { - return internal::NeMatcher(x); -} -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046 - -#endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ diff --git a/core/deps/gtest/gtest-message.h b/core/deps/gtest/gtest-message.h deleted file mode 100644 index c52c997f3..000000000 --- a/core/deps/gtest/gtest-message.h +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file defines the Message class. -// -// IMPORTANT NOTE: Due to limitation of the C++ language, we have to -// leave some internal implementation details in this header file. -// They are clearly marked by comments like this: -// -// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -// -// Such code is NOT meant to be used by a user directly, and is subject -// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user -// program! - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ -#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ - -#include -#include -#include - -#include "internal/gtest-port.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -// Ensures that there is at least one operator<< in the global namespace. -// See Message& operator<<(...) below for why. -void operator<<(const testing::internal::Secret&, int); - -namespace testing { - -// The Message class works like an ostream repeater. -// -// Typical usage: -// -// 1. You stream a bunch of values to a Message object. -// It will remember the text in a stringstream. -// 2. Then you stream the Message object to an ostream. -// This causes the text in the Message to be streamed -// to the ostream. -// -// For example; -// -// testing::Message foo; -// foo << 1 << " != " << 2; -// std::cout << foo; -// -// will print "1 != 2". -// -// Message is not intended to be inherited from. In particular, its -// destructor is not virtual. -// -// Note that stringstream behaves differently in gcc and in MSVC. You -// can stream a NULL char pointer to it in the former, but not in the -// latter (it causes an access violation if you do). The Message -// class hides this difference by treating a NULL char pointer as -// "(null)". -class GTEST_API_ Message { - private: - // The type of basic IO manipulators (endl, ends, and flush) for - // narrow streams. - typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); - - public: - // Constructs an empty Message. - Message(); - - // Copy constructor. - Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT - *ss_ << msg.GetString(); - } - - // Constructs a Message from a C-string. - explicit Message(const char* str) : ss_(new ::std::stringstream) { - *ss_ << str; - } - - // Streams a non-pointer value to this object. - template - inline Message& operator <<(const T& val) { - // Some libraries overload << for STL containers. These - // overloads are defined in the global namespace instead of ::std. - // - // C++'s symbol lookup rule (i.e. Koenig lookup) says that these - // overloads are visible in either the std namespace or the global - // namespace, but not other namespaces, including the testing - // namespace which Google Test's Message class is in. - // - // To allow STL containers (and other types that has a << operator - // defined in the global namespace) to be used in Google Test - // assertions, testing::Message must access the custom << operator - // from the global namespace. With this using declaration, - // overloads of << defined in the global namespace and those - // visible via Koenig lookup are both exposed in this function. - using ::operator <<; - *ss_ << val; - return *this; - } - - // Streams a pointer value to this object. - // - // This function is an overload of the previous one. When you - // stream a pointer to a Message, this definition will be used as it - // is more specialized. (The C++ Standard, section - // [temp.func.order].) If you stream a non-pointer, then the - // previous definition will be used. - // - // The reason for this overload is that streaming a NULL pointer to - // ostream is undefined behavior. Depending on the compiler, you - // may get "0", "(nil)", "(null)", or an access violation. To - // ensure consistent result across compilers, we always treat NULL - // as "(null)". - template - inline Message& operator <<(T* const& pointer) { // NOLINT - if (pointer == nullptr) { - *ss_ << "(null)"; - } else { - *ss_ << pointer; - } - return *this; - } - - // Since the basic IO manipulators are overloaded for both narrow - // and wide streams, we have to provide this specialized definition - // of operator <<, even though its body is the same as the - // templatized version above. Without this definition, streaming - // endl or other basic IO manipulators to Message will confuse the - // compiler. - Message& operator <<(BasicNarrowIoManip val) { - *ss_ << val; - return *this; - } - - // Instead of 1/0, we want to see true/false for bool values. - Message& operator <<(bool b) { - return *this << (b ? "true" : "false"); - } - - // These two overloads allow streaming a wide C string to a Message - // using the UTF-8 encoding. - Message& operator <<(const wchar_t* wide_c_str); - Message& operator <<(wchar_t* wide_c_str); - -#if GTEST_HAS_STD_WSTRING - // Converts the given wide string to a narrow string using the UTF-8 - // encoding, and streams the result to this Message object. - Message& operator <<(const ::std::wstring& wstr); -#endif // GTEST_HAS_STD_WSTRING - - // Gets the text streamed to this object so far as an std::string. - // Each '\0' character in the buffer is replaced with "\\0". - // - // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - std::string GetString() const; - - private: - // We'll hold the text streamed to this object here. - const std::unique_ptr< ::std::stringstream> ss_; - - // We declare (but don't implement) this to prevent the compiler - // from implementing the assignment operator. - void operator=(const Message&); -}; - -// Streams a Message to an ostream. -inline std::ostream& operator <<(std::ostream& os, const Message& sb) { - return os << sb.GetString(); -} - -namespace internal { - -// Converts a streamable value to an std::string. A NULL pointer is -// converted to "(null)". When the input value is a ::string, -// ::std::string, ::wstring, or ::std::wstring object, each NUL -// character in it is replaced with "\\0". -template -std::string StreamableToString(const T& streamable) { - return (Message() << streamable).GetString(); -} - -} // namespace internal -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ diff --git a/core/deps/gtest/gtest-param-test.h b/core/deps/gtest/gtest-param-test.h deleted file mode 100644 index 2eb8a1852..000000000 --- a/core/deps/gtest/gtest-param-test.h +++ /dev/null @@ -1,514 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Macros and functions for implementing parameterized tests -// in Google C++ Testing and Mocking Framework (Google Test) -// -// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! -// -// GOOGLETEST_CM0001 DO NOT DELETE -#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ - - -// Value-parameterized tests allow you to test your code with different -// parameters without writing multiple copies of the same test. -// -// Here is how you use value-parameterized tests: - -#if 0 - -// To write value-parameterized tests, first you should define a fixture -// class. It is usually derived from testing::TestWithParam (see below for -// another inheritance scheme that's sometimes useful in more complicated -// class hierarchies), where the type of your parameter values. -// TestWithParam is itself derived from testing::Test. T can be any -// copyable type. If it's a raw pointer, you are responsible for managing the -// lifespan of the pointed values. - -class FooTest : public ::testing::TestWithParam { - // You can implement all the usual class fixture members here. -}; - -// Then, use the TEST_P macro to define as many parameterized tests -// for this fixture as you want. The _P suffix is for "parameterized" -// or "pattern", whichever you prefer to think. The arguments to the -// TEST_P macro are the test_suite_name and test_case (both which must be -// non-empty) that will form the test name. - -TEST_P(FooTest, DoesBlah) { - // Inside a test, access the test parameter with the GetParam() method - // of the TestWithParam class: - EXPECT_TRUE(foo.Blah(GetParam())); - ... -} - -TEST_P(FooTest, HasBlahBlah) { - ... -} - -// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test -// case with any set of parameters you want. Google Test defines a number -// of functions for generating test parameters. They return what we call -// (surprise!) parameter generators. Here is a summary of them, which -// are all in the testing namespace: -// -// -// Range(begin, end [, step]) - Yields values {begin, begin+step, -// begin+step+step, ...}. The values do not -// include end. step defaults to 1. -// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. -// ValuesIn(container) - Yields values from a C-style array, an STL -// ValuesIn(begin,end) container, or an iterator range [begin, end). -// Bool() - Yields sequence {false, true}. -// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product -// for the math savvy) of the values generated -// by the N generators. -// -// For more details, see comments at the definitions of these functions below -// in this file. -// -// The following statement will instantiate tests from the FooTest test suite -// each with parameter values "meeny", "miny", and "moe". - -INSTANTIATE_TEST_SUITE_P(InstantiationName, - FooTest, - Values("meeny", "miny", "moe")); - -// To distinguish different instances of the pattern, (yes, you -// can instantiate it more than once) the first argument to the -// INSTANTIATE_TEST_SUITE_P macro is a prefix (which must be non-empty) that -// will be added to the actual test suite name. Remember to pick unique prefixes -// for different instantiations. The tests from the instantiation above will -// have these names: -// -// * InstantiationName/FooTest.DoesBlah/0 for "meeny" -// * InstantiationName/FooTest.DoesBlah/1 for "miny" -// * InstantiationName/FooTest.DoesBlah/2 for "moe" -// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" -// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" -// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" -// -// You can use these names in --gtest_filter. -// -// This statement will instantiate all tests from FooTest again, each -// with parameter values "cat" and "dog": - -const char* pets[] = {"cat", "dog"}; -INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); - -// The tests from the instantiation above will have these names: -// -// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" -// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" -// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" -// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" -// -// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests -// in the given test suite, whether their definitions come before or -// AFTER the INSTANTIATE_TEST_SUITE_P statement. -// -// Please also note that generator expressions (including parameters to the -// generators) are evaluated in InitGoogleTest(), after main() has started. -// This allows the user on one hand, to adjust generator parameters in order -// to dynamically determine a set of tests to run and on the other hand, -// give the user a chance to inspect the generated tests with Google Test -// reflection API before RUN_ALL_TESTS() is executed. -// -// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc -// for more examples. -// -// In the future, we plan to publish the API for defining new parameter -// generators. But for now this interface remains part of the internal -// implementation and is subject to change. -// -// -// A parameterized test fixture must be derived from testing::Test and from -// testing::WithParamInterface, where T is the type of the parameter -// values. Inheriting from TestWithParam satisfies that requirement because -// TestWithParam inherits from both Test and WithParamInterface. In more -// complicated hierarchies, however, it is occasionally useful to inherit -// separately from Test and WithParamInterface. For example: - -class BaseTest : public ::testing::Test { - // You can inherit all the usual members for a non-parameterized test - // fixture here. -}; - -class DerivedTest : public BaseTest, public ::testing::WithParamInterface { - // The usual test fixture members go here too. -}; - -TEST_F(BaseTest, HasFoo) { - // This is an ordinary non-parameterized test. -} - -TEST_P(DerivedTest, DoesBlah) { - // GetParam works just the same here as if you inherit from TestWithParam. - EXPECT_TRUE(foo.Blah(GetParam())); -} - -#endif // 0 - -#include -#include - -#include "internal/gtest-internal.h" -#include "internal/gtest-param-util.h" -#include "internal/gtest-port.h" - -namespace testing { - -// Functions producing parameter generators. -// -// Google Test uses these generators to produce parameters for value- -// parameterized tests. When a parameterized test suite is instantiated -// with a particular generator, Google Test creates and runs tests -// for each element in the sequence produced by the generator. -// -// In the following sample, tests from test suite FooTest are instantiated -// each three times with parameter values 3, 5, and 8: -// -// class FooTest : public TestWithParam { ... }; -// -// TEST_P(FooTest, TestThis) { -// } -// TEST_P(FooTest, TestThat) { -// } -// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8)); -// - -// Range() returns generators providing sequences of values in a range. -// -// Synopsis: -// Range(start, end) -// - returns a generator producing a sequence of values {start, start+1, -// start+2, ..., }. -// Range(start, end, step) -// - returns a generator producing a sequence of values {start, start+step, -// start+step+step, ..., }. -// Notes: -// * The generated sequences never include end. For example, Range(1, 5) -// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) -// returns a generator producing {1, 3, 5, 7}. -// * start and end must have the same type. That type may be any integral or -// floating-point type or a user defined type satisfying these conditions: -// * It must be assignable (have operator=() defined). -// * It must have operator+() (operator+(int-compatible type) for -// two-operand version). -// * It must have operator<() defined. -// Elements in the resulting sequences will also have that type. -// * Condition start < end must be satisfied in order for resulting sequences -// to contain any elements. -// -template -internal::ParamGenerator Range(T start, T end, IncrementT step) { - return internal::ParamGenerator( - new internal::RangeGenerator(start, end, step)); -} - -template -internal::ParamGenerator Range(T start, T end) { - return Range(start, end, 1); -} - -// ValuesIn() function allows generation of tests with parameters coming from -// a container. -// -// Synopsis: -// ValuesIn(const T (&array)[N]) -// - returns a generator producing sequences with elements from -// a C-style array. -// ValuesIn(const Container& container) -// - returns a generator producing sequences with elements from -// an STL-style container. -// ValuesIn(Iterator begin, Iterator end) -// - returns a generator producing sequences with elements from -// a range [begin, end) defined by a pair of STL-style iterators. These -// iterators can also be plain C pointers. -// -// Please note that ValuesIn copies the values from the containers -// passed in and keeps them to generate tests in RUN_ALL_TESTS(). -// -// Examples: -// -// This instantiates tests from test suite StringTest -// each with C-string values of "foo", "bar", and "baz": -// -// const char* strings[] = {"foo", "bar", "baz"}; -// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings)); -// -// This instantiates tests from test suite StlStringTest -// each with STL strings with values "a" and "b": -// -// ::std::vector< ::std::string> GetParameterStrings() { -// ::std::vector< ::std::string> v; -// v.push_back("a"); -// v.push_back("b"); -// return v; -// } -// -// INSTANTIATE_TEST_SUITE_P(CharSequence, -// StlStringTest, -// ValuesIn(GetParameterStrings())); -// -// -// This will also instantiate tests from CharTest -// each with parameter values 'a' and 'b': -// -// ::std::list GetParameterChars() { -// ::std::list list; -// list.push_back('a'); -// list.push_back('b'); -// return list; -// } -// ::std::list l = GetParameterChars(); -// INSTANTIATE_TEST_SUITE_P(CharSequence2, -// CharTest, -// ValuesIn(l.begin(), l.end())); -// -template -internal::ParamGenerator< - typename std::iterator_traits::value_type> -ValuesIn(ForwardIterator begin, ForwardIterator end) { - typedef typename std::iterator_traits::value_type ParamType; - return internal::ParamGenerator( - new internal::ValuesInIteratorRangeGenerator(begin, end)); -} - -template -internal::ParamGenerator ValuesIn(const T (&array)[N]) { - return ValuesIn(array, array + N); -} - -template -internal::ParamGenerator ValuesIn( - const Container& container) { - return ValuesIn(container.begin(), container.end()); -} - -// Values() allows generating tests from explicitly specified list of -// parameters. -// -// Synopsis: -// Values(T v1, T v2, ..., T vN) -// - returns a generator producing sequences with elements v1, v2, ..., vN. -// -// For example, this instantiates tests from test suite BarTest each -// with values "one", "two", and "three": -// -// INSTANTIATE_TEST_SUITE_P(NumSequence, -// BarTest, -// Values("one", "two", "three")); -// -// This instantiates tests from test suite BazTest each with values 1, 2, 3.5. -// The exact type of values will depend on the type of parameter in BazTest. -// -// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); -// -// -template -internal::ValueArray Values(T... v) { - return internal::ValueArray(std::move(v)...); -} - -// Bool() allows generating tests with parameters in a set of (false, true). -// -// Synopsis: -// Bool() -// - returns a generator producing sequences with elements {false, true}. -// -// It is useful when testing code that depends on Boolean flags. Combinations -// of multiple flags can be tested when several Bool()'s are combined using -// Combine() function. -// -// In the following example all tests in the test suite FlagDependentTest -// will be instantiated twice with parameters false and true. -// -// class FlagDependentTest : public testing::TestWithParam { -// virtual void SetUp() { -// external_flag = GetParam(); -// } -// } -// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool()); -// -inline internal::ParamGenerator Bool() { - return Values(false, true); -} - -// Combine() allows the user to combine two or more sequences to produce -// values of a Cartesian product of those sequences' elements. -// -// Synopsis: -// Combine(gen1, gen2, ..., genN) -// - returns a generator producing sequences with elements coming from -// the Cartesian product of elements from the sequences generated by -// gen1, gen2, ..., genN. The sequence elements will have a type of -// std::tuple where T1, T2, ..., TN are the types -// of elements from sequences produces by gen1, gen2, ..., genN. -// -// Combine can have up to 10 arguments. -// -// Example: -// -// This will instantiate tests in test suite AnimalTest each one with -// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), -// tuple("dog", BLACK), and tuple("dog", WHITE): -// -// enum Color { BLACK, GRAY, WHITE }; -// class AnimalTest -// : public testing::TestWithParam > {...}; -// -// TEST_P(AnimalTest, AnimalLooksNice) {...} -// -// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest, -// Combine(Values("cat", "dog"), -// Values(BLACK, WHITE))); -// -// This will instantiate tests in FlagDependentTest with all variations of two -// Boolean flags: -// -// class FlagDependentTest -// : public testing::TestWithParam > { -// virtual void SetUp() { -// // Assigns external_flag_1 and external_flag_2 values from the tuple. -// std::tie(external_flag_1, external_flag_2) = GetParam(); -// } -// }; -// -// TEST_P(FlagDependentTest, TestFeature1) { -// // Test your code using external_flag_1 and external_flag_2 here. -// } -// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest, -// Combine(Bool(), Bool())); -// -template -internal::CartesianProductHolder Combine(const Generator&... g) { - return internal::CartesianProductHolder(g...); -} - -#define TEST_P(test_suite_name, test_name) \ - static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ - "test_suite_name must not be empty"); \ - static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \ - "test_name must not be empty"); \ - class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ - : public test_suite_name { \ - public: \ - GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ - void TestBody() override; \ - \ - private: \ - static int AddToRegistry() { \ - ::testing::UnitTest::GetInstance() \ - ->parameterized_test_registry() \ - .GetTestSuitePatternHolder( \ - GTEST_STRINGIFY_(test_suite_name), \ - ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ - ->AddTestPattern( \ - GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \ - new ::testing::internal::TestMetaFactory()); \ - return 0; \ - } \ - static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ - test_name)); \ - }; \ - int GTEST_TEST_CLASS_NAME_(test_suite_name, \ - test_name)::gtest_registering_dummy_ = \ - GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ - void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() - -// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify -// generator and an optional function or functor that generates custom test name -// suffixes based on the test parameters. Such a function or functor should -// accept one argument of type testing::TestParamInfo, and -// return std::string. -// -// testing::PrintToStringParamName is a builtin test suffix generator that -// returns the value of testing::PrintToString(GetParam()). -// -// Note: test names must be non-empty, unique, and may only contain ASCII -// alphanumeric characters or underscore. Because PrintToString adds quotes -// to std::string and C strings, it won't work for these types. - -#define GTEST_EXPAND_(arg) arg -#define GTEST_GET_FIRST_(first, ...) first -#define GTEST_GET_SECOND_(first, second, ...) second - -#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ - static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ - "test_suite_name must not be empty"); \ - static_assert(sizeof(GTEST_STRINGIFY_(prefix)) > 1, \ - "prefix must not be empty"); \ - static ::testing::internal::ParamGenerator \ - gtest_##prefix##test_suite_name##_EvalGenerator_() { \ - return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ - } \ - static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ - const ::testing::TestParamInfo& info) { \ - if (::testing::internal::AlwaysFalse()) { \ - ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ - __VA_ARGS__, \ - ::testing::internal::DefaultParamName, \ - DUMMY_PARAM_))); \ - auto t = std::make_tuple(__VA_ARGS__); \ - static_assert(std::tuple_size::value <= 2, \ - "Too Many Args!"); \ - } \ - return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ - __VA_ARGS__, \ - ::testing::internal::DefaultParamName, \ - DUMMY_PARAM_))))(info); \ - } \ - static int gtest_##prefix##test_suite_name##_dummy_ \ - GTEST_ATTRIBUTE_UNUSED_ = \ - ::testing::UnitTest::GetInstance() \ - ->parameterized_test_registry() \ - .GetTestSuitePatternHolder( \ - GTEST_STRINGIFY_(test_suite_name), \ - ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ - ->AddTestSuiteInstantiation( \ - GTEST_STRINGIFY_(prefix), \ - >est_##prefix##test_suite_name##_EvalGenerator_, \ - >est_##prefix##test_suite_name##_EvalGenerateName_, \ - __FILE__, __LINE__) - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define INSTANTIATE_TEST_CASE_P \ - static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \ - ""); \ - INSTANTIATE_TEST_SUITE_P -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ diff --git a/core/deps/gtest/gtest-printers.h b/core/deps/gtest/gtest-printers.h deleted file mode 100644 index 72bbb2a1a..000000000 --- a/core/deps/gtest/gtest-printers.h +++ /dev/null @@ -1,928 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Test - The Google C++ Testing and Mocking Framework -// -// This file implements a universal value printer that can print a -// value of any type T: -// -// void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); -// -// A user can teach this function how to print a class type T by -// defining either operator<<() or PrintTo() in the namespace that -// defines T. More specifically, the FIRST defined function in the -// following list will be used (assuming T is defined in namespace -// foo): -// -// 1. foo::PrintTo(const T&, ostream*) -// 2. operator<<(ostream&, const T&) defined in either foo or the -// global namespace. -// -// However if T is an STL-style container then it is printed element-wise -// unless foo::PrintTo(const T&, ostream*) is defined. Note that -// operator<<() is ignored for container types. -// -// If none of the above is defined, it will print the debug string of -// the value if it is a protocol buffer, or print the raw bytes in the -// value otherwise. -// -// To aid debugging: when T is a reference type, the address of the -// value is also printed; when T is a (const) char pointer, both the -// pointer value and the NUL-terminated string it points to are -// printed. -// -// We also provide some convenient wrappers: -// -// // Prints a value to a string. For a (const or not) char -// // pointer, the NUL-terminated string (but not the pointer) is -// // printed. -// std::string ::testing::PrintToString(const T& value); -// -// // Prints a value tersely: for a reference type, the referenced -// // value (but not the address) is printed; for a (const or not) char -// // pointer, the NUL-terminated string (but not the pointer) is -// // printed. -// void ::testing::internal::UniversalTersePrint(const T& value, ostream*); -// -// // Prints value using the type inferred by the compiler. The difference -// // from UniversalTersePrint() is that this function prints both the -// // pointer and the NUL-terminated string for a (const or not) char pointer. -// void ::testing::internal::UniversalPrint(const T& value, ostream*); -// -// // Prints the fields of a tuple tersely to a string vector, one -// // element for each field. Tuple support must be enabled in -// // gtest-port.h. -// std::vector UniversalTersePrintTupleFieldsToStrings( -// const Tuple& value); -// -// Known limitation: -// -// The print primitives print the elements of an STL-style container -// using the compiler-inferred type of *iter where iter is a -// const_iterator of the container. When const_iterator is an input -// iterator but not a forward iterator, this inferred type may not -// match value_type, and the print output may be incorrect. In -// practice, this is rarely a problem as for most containers -// const_iterator is a forward iterator. We'll fix this if there's an -// actual need for it. Note that this fix cannot rely on value_type -// being defined as many user-defined container types don't have -// value_type. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ - -#include -#include // NOLINT -#include -#include -#include -#include -#include -#include - -#include "internal/gtest-internal.h" -#include "internal/gtest-port.h" - -#if GTEST_HAS_ABSL -#include "absl/strings/string_view.h" -#include "absl/types/optional.h" -#include "absl/types/variant.h" -#endif // GTEST_HAS_ABSL - -namespace testing { - -// Definitions in the 'internal' and 'internal2' name spaces are -// subject to change without notice. DO NOT USE THEM IN USER CODE! -namespace internal2 { - -// Prints the given number of bytes in the given object to the given -// ostream. -GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, - size_t count, - ::std::ostream* os); - -// For selecting which printer to use when a given type has neither << -// nor PrintTo(). -enum TypeKind { - kProtobuf, // a protobuf type - kConvertibleToInteger, // a type implicitly convertible to std::intmax_t - // (e.g. a named or unnamed enum type) -#if GTEST_HAS_ABSL - kConvertibleToStringView, // a type implicitly convertible to - // absl::string_view -#endif - kOtherType // anything else -}; - -// TypeWithoutFormatter::PrintValue(value, os) is called -// by the universal printer to print a value of type T when neither -// operator<< nor PrintTo() is defined for T, where kTypeKind is the -// "kind" of T as defined by enum TypeKind. -template -class TypeWithoutFormatter { - public: - // This default version is called when kTypeKind is kOtherType. - static void PrintValue(const T& value, ::std::ostream* os) { - PrintBytesInObjectTo( - static_cast( - reinterpret_cast(std::addressof(value))), - sizeof(value), os); - } -}; - -// We print a protobuf using its ShortDebugString() when the string -// doesn't exceed this many characters; otherwise we print it using -// DebugString() for better readability. -const size_t kProtobufOneLinerMaxLength = 50; - -template -class TypeWithoutFormatter { - public: - static void PrintValue(const T& value, ::std::ostream* os) { - std::string pretty_str = value.ShortDebugString(); - if (pretty_str.length() > kProtobufOneLinerMaxLength) { - pretty_str = "\n" + value.DebugString(); - } - *os << ("<" + pretty_str + ">"); - } -}; - -template -class TypeWithoutFormatter { - public: - // Since T has no << operator or PrintTo() but can be implicitly - // converted to the maximum width integer, we print it as a std::intmax_t. - // - // Most likely T is an enum type (either named or unnamed), in which - // case printing it as an integer is the desired behavior. In case - // T is not an enum, printing it as an integer is the best we can do - // given that it has no user-defined printer. - static void PrintValue(const T& value, ::std::ostream* os) { - const std::intmax_t kBigInt = value; - *os << kBigInt; - } -}; - -#if GTEST_HAS_ABSL -template -class TypeWithoutFormatter { - public: - // Since T has neither operator<< nor PrintTo() but can be implicitly - // converted to absl::string_view, we print it as a absl::string_view. - // - // Note: the implementation is further below, as it depends on - // internal::PrintTo symbol which is defined later in the file. - static void PrintValue(const T& value, ::std::ostream* os); -}; -#endif - -// Prints the given value to the given ostream. If the value is a -// protocol message, its debug string is printed; if it's an enum or -// of a type implicitly convertible to std::intmax_t, it's printed as an -// integer; otherwise the bytes in the value are printed. This is -// what UniversalPrinter::Print() does when it knows nothing about -// type T and T has neither << operator nor PrintTo(). -// -// A user can override this behavior for a class type Foo by defining -// a << operator in the namespace where Foo is defined. -// -// We put this operator in namespace 'internal2' instead of 'internal' -// to simplify the implementation, as much code in 'internal' needs to -// use << in STL, which would conflict with our own << were it defined -// in 'internal'. -// -// Note that this operator<< takes a generic std::basic_ostream type instead of the more restricted std::ostream. If -// we define it to take an std::ostream instead, we'll get an -// "ambiguous overloads" compiler error when trying to print a type -// Foo that supports streaming to std::basic_ostream, as the compiler cannot tell whether -// operator<<(std::ostream&, const T&) or -// operator<<(std::basic_stream, const Foo&) is more -// specific. -template -::std::basic_ostream& operator<<( - ::std::basic_ostream& os, const T& x) { - TypeWithoutFormatter< - T, (internal::IsAProtocolMessage::value - ? kProtobuf - : std::is_convertible::value - ? kConvertibleToInteger - : -#if GTEST_HAS_ABSL - std::is_convertible::value - ? kConvertibleToStringView - : -#endif - kOtherType)>::PrintValue(x, &os); - return os; -} - -} // namespace internal2 -} // namespace testing - -// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up -// magic needed for implementing UniversalPrinter won't work. -namespace testing_internal { - -// Used to print a value that is not an STL-style container when the -// user doesn't define PrintTo() for it. -template -void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { - // With the following statement, during unqualified name lookup, - // testing::internal2::operator<< appears as if it was declared in - // the nearest enclosing namespace that contains both - // ::testing_internal and ::testing::internal2, i.e. the global - // namespace. For more details, refer to the C++ Standard section - // 7.3.4-1 [namespace.udir]. This allows us to fall back onto - // testing::internal2::operator<< in case T doesn't come with a << - // operator. - // - // We cannot write 'using ::testing::internal2::operator<<;', which - // gcc 3.3 fails to compile due to a compiler bug. - using namespace ::testing::internal2; // NOLINT - - // Assuming T is defined in namespace foo, in the next statement, - // the compiler will consider all of: - // - // 1. foo::operator<< (thanks to Koenig look-up), - // 2. ::operator<< (as the current namespace is enclosed in ::), - // 3. testing::internal2::operator<< (thanks to the using statement above). - // - // The operator<< whose type matches T best will be picked. - // - // We deliberately allow #2 to be a candidate, as sometimes it's - // impossible to define #1 (e.g. when foo is ::std, defining - // anything in it is undefined behavior unless you are a compiler - // vendor.). - *os << value; -} - -} // namespace testing_internal - -namespace testing { -namespace internal { - -// FormatForComparison::Format(value) formats a -// value of type ToPrint that is an operand of a comparison assertion -// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in -// the comparison, and is used to help determine the best way to -// format the value. In particular, when the value is a C string -// (char pointer) and the other operand is an STL string object, we -// want to format the C string as a string, since we know it is -// compared by value with the string object. If the value is a char -// pointer but the other operand is not an STL string object, we don't -// know whether the pointer is supposed to point to a NUL-terminated -// string, and thus want to print it as a pointer to be safe. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - -// The default case. -template -class FormatForComparison { - public: - static ::std::string Format(const ToPrint& value) { - return ::testing::PrintToString(value); - } -}; - -// Array. -template -class FormatForComparison { - public: - static ::std::string Format(const ToPrint* value) { - return FormatForComparison::Format(value); - } -}; - -// By default, print C string as pointers to be safe, as we don't know -// whether they actually point to a NUL-terminated string. - -#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ - template \ - class FormatForComparison { \ - public: \ - static ::std::string Format(CharType* value) { \ - return ::testing::PrintToString(static_cast(value)); \ - } \ - } - -GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); -GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); -GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); -GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); - -#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ - -// If a C string is compared with an STL string object, we know it's meant -// to point to a NUL-terminated string, and thus can print it as a string. - -#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ - template <> \ - class FormatForComparison { \ - public: \ - static ::std::string Format(CharType* value) { \ - return ::testing::PrintToString(value); \ - } \ - } - -GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); -GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); - -#if GTEST_HAS_STD_WSTRING -GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); -GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring); -#endif - -#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ - -// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) -// operand to be used in a failure message. The type (but not value) -// of the other operand may affect the format. This allows us to -// print a char* as a raw pointer when it is compared against another -// char* or void*, and print it as a C string when it is compared -// against an std::string object, for example. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -template -std::string FormatForComparisonFailureMessage( - const T1& value, const T2& /* other_operand */) { - return FormatForComparison::Format(value); -} - -// UniversalPrinter::Print(value, ostream_ptr) prints the given -// value to the given ostream. The caller must ensure that -// 'ostream_ptr' is not NULL, or the behavior is undefined. -// -// We define UniversalPrinter as a class template (as opposed to a -// function template), as we need to partially specialize it for -// reference types, which cannot be done with function templates. -template -class UniversalPrinter; - -template -void UniversalPrint(const T& value, ::std::ostream* os); - -enum DefaultPrinterType { - kPrintContainer, - kPrintPointer, - kPrintFunctionPointer, - kPrintOther, -}; -template struct WrapPrinterType {}; - -// Used to print an STL-style container when the user doesn't define -// a PrintTo() for it. -template -void DefaultPrintTo(WrapPrinterType /* dummy */, - const C& container, ::std::ostream* os) { - const size_t kMaxCount = 32; // The maximum number of elements to print. - *os << '{'; - size_t count = 0; - for (typename C::const_iterator it = container.begin(); - it != container.end(); ++it, ++count) { - if (count > 0) { - *os << ','; - if (count == kMaxCount) { // Enough has been printed. - *os << " ..."; - break; - } - } - *os << ' '; - // We cannot call PrintTo(*it, os) here as PrintTo() doesn't - // handle *it being a native array. - internal::UniversalPrint(*it, os); - } - - if (count > 0) { - *os << ' '; - } - *os << '}'; -} - -// Used to print a pointer that is neither a char pointer nor a member -// pointer, when the user doesn't define PrintTo() for it. (A member -// variable pointer or member function pointer doesn't really point to -// a location in the address space. Their representation is -// implementation-defined. Therefore they will be printed as raw -// bytes.) -template -void DefaultPrintTo(WrapPrinterType /* dummy */, - T* p, ::std::ostream* os) { - if (p == nullptr) { - *os << "NULL"; - } else { - // T is not a function type. We just call << to print p, - // relying on ADL to pick up user-defined << for their pointer - // types, if any. - *os << p; - } -} -template -void DefaultPrintTo(WrapPrinterType /* dummy */, - T* p, ::std::ostream* os) { - if (p == nullptr) { - *os << "NULL"; - } else { - // T is a function type, so '*os << p' doesn't do what we want - // (it just prints p as bool). We want to print p as a const - // void*. - *os << reinterpret_cast(p); - } -} - -// Used to print a non-container, non-pointer value when the user -// doesn't define PrintTo() for it. -template -void DefaultPrintTo(WrapPrinterType /* dummy */, - const T& value, ::std::ostream* os) { - ::testing_internal::DefaultPrintNonContainerTo(value, os); -} - -// Prints the given value using the << operator if it has one; -// otherwise prints the bytes in it. This is what -// UniversalPrinter::Print() does when PrintTo() is not specialized -// or overloaded for type T. -// -// A user can override this behavior for a class type Foo by defining -// an overload of PrintTo() in the namespace where Foo is defined. We -// give the user this option as sometimes defining a << operator for -// Foo is not desirable (e.g. the coding style may prevent doing it, -// or there is already a << operator but it doesn't do what the user -// wants). -template -void PrintTo(const T& value, ::std::ostream* os) { - // DefaultPrintTo() is overloaded. The type of its first argument - // determines which version will be picked. - // - // Note that we check for container types here, prior to we check - // for protocol message types in our operator<<. The rationale is: - // - // For protocol messages, we want to give people a chance to - // override Google Mock's format by defining a PrintTo() or - // operator<<. For STL containers, other formats can be - // incompatible with Google Mock's format for the container - // elements; therefore we check for container types here to ensure - // that our format is used. - // - // Note that MSVC and clang-cl do allow an implicit conversion from - // pointer-to-function to pointer-to-object, but clang-cl warns on it. - // So don't use ImplicitlyConvertible if it can be helped since it will - // cause this warning, and use a separate overload of DefaultPrintTo for - // function pointers so that the `*os << p` in the object pointer overload - // doesn't cause that warning either. - DefaultPrintTo( - WrapPrinterType < - (sizeof(IsContainerTest(0)) == sizeof(IsContainer)) && - !IsRecursiveContainer::value - ? kPrintContainer - : !std::is_pointer::value - ? kPrintOther - : std::is_function::type>::value - ? kPrintFunctionPointer - : kPrintPointer > (), - value, os); -} - -// The following list of PrintTo() overloads tells -// UniversalPrinter::Print() how to print standard types (built-in -// types, strings, plain arrays, and pointers). - -// Overloads for various char types. -GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); -GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); -inline void PrintTo(char c, ::std::ostream* os) { - // When printing a plain char, we always treat it as unsigned. This - // way, the output won't be affected by whether the compiler thinks - // char is signed or not. - PrintTo(static_cast(c), os); -} - -// Overloads for other simple built-in types. -inline void PrintTo(bool x, ::std::ostream* os) { - *os << (x ? "true" : "false"); -} - -// Overload for wchar_t type. -// Prints a wchar_t as a symbol if it is printable or as its internal -// code otherwise and also as its decimal code (except for L'\0'). -// The L'\0' char is printed as "L'\\0'". The decimal code is printed -// as signed integer when wchar_t is implemented by the compiler -// as a signed type and is printed as an unsigned integer when wchar_t -// is implemented as an unsigned type. -GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); - -// Overloads for C strings. -GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); -inline void PrintTo(char* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} - -// signed/unsigned char is often used for representing binary data, so -// we print pointers to it as void* to be safe. -inline void PrintTo(const signed char* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} -inline void PrintTo(signed char* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} -inline void PrintTo(const unsigned char* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} -inline void PrintTo(unsigned char* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} - -// MSVC can be configured to define wchar_t as a typedef of unsigned -// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native -// type. When wchar_t is a typedef, defining an overload for const -// wchar_t* would cause unsigned short* be printed as a wide string, -// possibly causing invalid memory accesses. -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) -// Overloads for wide C strings -GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); -inline void PrintTo(wchar_t* s, ::std::ostream* os) { - PrintTo(ImplicitCast_(s), os); -} -#endif - -// Overload for C arrays. Multi-dimensional arrays are printed -// properly. - -// Prints the given number of elements in an array, without printing -// the curly braces. -template -void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { - UniversalPrint(a[0], os); - for (size_t i = 1; i != count; i++) { - *os << ", "; - UniversalPrint(a[i], os); - } -} - -// Overloads for ::std::string. -GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); -inline void PrintTo(const ::std::string& s, ::std::ostream* os) { - PrintStringTo(s, os); -} - -// Overloads for ::std::wstring. -#if GTEST_HAS_STD_WSTRING -GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); -inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { - PrintWideStringTo(s, os); -} -#endif // GTEST_HAS_STD_WSTRING - -#if GTEST_HAS_ABSL -// Overload for absl::string_view. -inline void PrintTo(absl::string_view sp, ::std::ostream* os) { - PrintTo(::std::string(sp), os); -} -#endif // GTEST_HAS_ABSL - -inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; } - -template -void PrintTo(std::reference_wrapper ref, ::std::ostream* os) { - UniversalPrinter::Print(ref.get(), os); -} - -// Helper function for printing a tuple. T must be instantiated with -// a tuple type. -template -void PrintTupleTo(const T&, std::integral_constant, - ::std::ostream*) {} - -template -void PrintTupleTo(const T& t, std::integral_constant, - ::std::ostream* os) { - PrintTupleTo(t, std::integral_constant(), os); - GTEST_INTENTIONAL_CONST_COND_PUSH_() - if (I > 1) { - GTEST_INTENTIONAL_CONST_COND_POP_() - *os << ", "; - } - UniversalPrinter::type>::Print( - std::get(t), os); -} - -template -void PrintTo(const ::std::tuple& t, ::std::ostream* os) { - *os << "("; - PrintTupleTo(t, std::integral_constant(), os); - *os << ")"; -} - -// Overload for std::pair. -template -void PrintTo(const ::std::pair& value, ::std::ostream* os) { - *os << '('; - // We cannot use UniversalPrint(value.first, os) here, as T1 may be - // a reference type. The same for printing value.second. - UniversalPrinter::Print(value.first, os); - *os << ", "; - UniversalPrinter::Print(value.second, os); - *os << ')'; -} - -// Implements printing a non-reference type T by letting the compiler -// pick the right overload of PrintTo() for T. -template -class UniversalPrinter { - public: - // MSVC warns about adding const to a function type, so we want to - // disable the warning. - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) - - // Note: we deliberately don't call this PrintTo(), as that name - // conflicts with ::testing::internal::PrintTo in the body of the - // function. - static void Print(const T& value, ::std::ostream* os) { - // By default, ::testing::internal::PrintTo() is used for printing - // the value. - // - // Thanks to Koenig look-up, if T is a class and has its own - // PrintTo() function defined in its namespace, that function will - // be visible here. Since it is more specific than the generic ones - // in ::testing::internal, it will be picked by the compiler in the - // following statement - exactly what we want. - PrintTo(value, os); - } - - GTEST_DISABLE_MSC_WARNINGS_POP_() -}; - -#if GTEST_HAS_ABSL - -// Printer for absl::optional - -template -class UniversalPrinter<::absl::optional> { - public: - static void Print(const ::absl::optional& value, ::std::ostream* os) { - *os << '('; - if (!value) { - *os << "nullopt"; - } else { - UniversalPrint(*value, os); - } - *os << ')'; - } -}; - -// Printer for absl::variant - -template -class UniversalPrinter<::absl::variant> { - public: - static void Print(const ::absl::variant& value, ::std::ostream* os) { - *os << '('; - absl::visit(Visitor{os}, value); - *os << ')'; - } - - private: - struct Visitor { - template - void operator()(const U& u) const { - *os << "'" << GetTypeName() << "' with value "; - UniversalPrint(u, os); - } - ::std::ostream* os; - }; -}; - -#endif // GTEST_HAS_ABSL - -// UniversalPrintArray(begin, len, os) prints an array of 'len' -// elements, starting at address 'begin'. -template -void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { - if (len == 0) { - *os << "{}"; - } else { - *os << "{ "; - const size_t kThreshold = 18; - const size_t kChunkSize = 8; - // If the array has more than kThreshold elements, we'll have to - // omit some details by printing only the first and the last - // kChunkSize elements. - if (len <= kThreshold) { - PrintRawArrayTo(begin, len, os); - } else { - PrintRawArrayTo(begin, kChunkSize, os); - *os << ", ..., "; - PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); - } - *os << " }"; - } -} -// This overload prints a (const) char array compactly. -GTEST_API_ void UniversalPrintArray( - const char* begin, size_t len, ::std::ostream* os); - -// This overload prints a (const) wchar_t array compactly. -GTEST_API_ void UniversalPrintArray( - const wchar_t* begin, size_t len, ::std::ostream* os); - -// Implements printing an array type T[N]. -template -class UniversalPrinter { - public: - // Prints the given array, omitting some elements when there are too - // many. - static void Print(const T (&a)[N], ::std::ostream* os) { - UniversalPrintArray(a, N, os); - } -}; - -// Implements printing a reference type T&. -template -class UniversalPrinter { - public: - // MSVC warns about adding const to a function type, so we want to - // disable the warning. - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) - - static void Print(const T& value, ::std::ostream* os) { - // Prints the address of the value. We use reinterpret_cast here - // as static_cast doesn't compile when T is a function type. - *os << "@" << reinterpret_cast(&value) << " "; - - // Then prints the value itself. - UniversalPrint(value, os); - } - - GTEST_DISABLE_MSC_WARNINGS_POP_() -}; - -// Prints a value tersely: for a reference type, the referenced value -// (but not the address) is printed; for a (const) char pointer, the -// NUL-terminated string (but not the pointer) is printed. - -template -class UniversalTersePrinter { - public: - static void Print(const T& value, ::std::ostream* os) { - UniversalPrint(value, os); - } -}; -template -class UniversalTersePrinter { - public: - static void Print(const T& value, ::std::ostream* os) { - UniversalPrint(value, os); - } -}; -template -class UniversalTersePrinter { - public: - static void Print(const T (&value)[N], ::std::ostream* os) { - UniversalPrinter::Print(value, os); - } -}; -template <> -class UniversalTersePrinter { - public: - static void Print(const char* str, ::std::ostream* os) { - if (str == nullptr) { - *os << "NULL"; - } else { - UniversalPrint(std::string(str), os); - } - } -}; -template <> -class UniversalTersePrinter { - public: - static void Print(char* str, ::std::ostream* os) { - UniversalTersePrinter::Print(str, os); - } -}; - -#if GTEST_HAS_STD_WSTRING -template <> -class UniversalTersePrinter { - public: - static void Print(const wchar_t* str, ::std::ostream* os) { - if (str == nullptr) { - *os << "NULL"; - } else { - UniversalPrint(::std::wstring(str), os); - } - } -}; -#endif - -template <> -class UniversalTersePrinter { - public: - static void Print(wchar_t* str, ::std::ostream* os) { - UniversalTersePrinter::Print(str, os); - } -}; - -template -void UniversalTersePrint(const T& value, ::std::ostream* os) { - UniversalTersePrinter::Print(value, os); -} - -// Prints a value using the type inferred by the compiler. The -// difference between this and UniversalTersePrint() is that for a -// (const) char pointer, this prints both the pointer and the -// NUL-terminated string. -template -void UniversalPrint(const T& value, ::std::ostream* os) { - // A workarond for the bug in VC++ 7.1 that prevents us from instantiating - // UniversalPrinter with T directly. - typedef T T1; - UniversalPrinter::Print(value, os); -} - -typedef ::std::vector< ::std::string> Strings; - - // Tersely prints the first N fields of a tuple to a string vector, - // one element for each field. -template -void TersePrintPrefixToStrings(const Tuple&, std::integral_constant, - Strings*) {} -template -void TersePrintPrefixToStrings(const Tuple& t, - std::integral_constant, - Strings* strings) { - TersePrintPrefixToStrings(t, std::integral_constant(), - strings); - ::std::stringstream ss; - UniversalTersePrint(std::get(t), &ss); - strings->push_back(ss.str()); -} - -// Prints the fields of a tuple tersely to a string vector, one -// element for each field. See the comment before -// UniversalTersePrint() for how we define "tersely". -template -Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { - Strings result; - TersePrintPrefixToStrings( - value, std::integral_constant::value>(), - &result); - return result; -} - -} // namespace internal - -#if GTEST_HAS_ABSL -namespace internal2 { -template -void TypeWithoutFormatter::PrintValue( - const T& value, ::std::ostream* os) { - internal::PrintTo(absl::string_view(value), os); -} -} // namespace internal2 -#endif - -template -::std::string PrintToString(const T& value) { - ::std::stringstream ss; - internal::UniversalTersePrinter::Print(value, &ss); - return ss.str(); -} - -} // namespace testing - -// Include any custom printer added by the local installation. -// We must include this header at the end to make sure it can use the -// declarations from this file. -#include "internal/custom/gtest-printers.h" - -#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ diff --git a/core/deps/gtest/gtest-spi.h b/core/deps/gtest/gtest-spi.h deleted file mode 100644 index 6272e40a5..000000000 --- a/core/deps/gtest/gtest-spi.h +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// Utilities for testing Google Test itself and code that uses Google Test -// (e.g. frameworks built on top of Google Test). - -// GOOGLETEST_CM0004 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ -#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ - -#include "gtest.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// This helper class can be used to mock out Google Test failure reporting -// so that we can test Google Test or code that builds on Google Test. -// -// An object of this class appends a TestPartResult object to the -// TestPartResultArray object given in the constructor whenever a Google Test -// failure is reported. It can either intercept only failures that are -// generated in the same thread that created this object or it can intercept -// all generated failures. The scope of this mock object can be controlled with -// the second argument to the two arguments constructor. -class GTEST_API_ ScopedFakeTestPartResultReporter - : public TestPartResultReporterInterface { - public: - // The two possible mocking modes of this object. - enum InterceptMode { - INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. - INTERCEPT_ALL_THREADS // Intercepts all failures. - }; - - // The c'tor sets this object as the test part result reporter used - // by Google Test. The 'result' parameter specifies where to report the - // results. This reporter will only catch failures generated in the current - // thread. DEPRECATED - explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); - - // Same as above, but you can choose the interception scope of this object. - ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, - TestPartResultArray* result); - - // The d'tor restores the previous test part result reporter. - ~ScopedFakeTestPartResultReporter() override; - - // Appends the TestPartResult object to the TestPartResultArray - // received in the constructor. - // - // This method is from the TestPartResultReporterInterface - // interface. - void ReportTestPartResult(const TestPartResult& result) override; - - private: - void Init(); - - const InterceptMode intercept_mode_; - TestPartResultReporterInterface* old_reporter_; - TestPartResultArray* const result_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); -}; - -namespace internal { - -// A helper class for implementing EXPECT_FATAL_FAILURE() and -// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given -// TestPartResultArray contains exactly one failure that has the given -// type and contains the given substring. If that's not the case, a -// non-fatal failure will be generated. -class GTEST_API_ SingleFailureChecker { - public: - // The constructor remembers the arguments. - SingleFailureChecker(const TestPartResultArray* results, - TestPartResult::Type type, const std::string& substr); - ~SingleFailureChecker(); - private: - const TestPartResultArray* const results_; - const TestPartResult::Type type_; - const std::string substr_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); -}; - -} // namespace internal - -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -// A set of macros for testing Google Test assertions or code that's expected -// to generate Google Test fatal failures. It verifies that the given -// statement will cause exactly one fatal Google Test failure with 'substr' -// being part of the failure message. -// -// There are two different versions of this macro. EXPECT_FATAL_FAILURE only -// affects and considers failures generated in the current thread and -// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. -// -// The verification of the assertion is done correctly even when the statement -// throws an exception or aborts the current function. -// -// Known restrictions: -// - 'statement' cannot reference local non-static variables or -// non-static members of the current object. -// - 'statement' cannot return a value. -// - You cannot stream a failure message to this macro. -// -// Note that even though the implementations of the following two -// macros are much alike, we cannot refactor them to use a common -// helper macro, due to some peculiarity in how the preprocessor -// works. The AcceptsMacroThatExpandsToUnprotectedComma test in -// gtest_unittest.cc will fail to compile if we do that. -#define EXPECT_FATAL_FAILURE(statement, substr) \ - do { \ - class GTestExpectFatalFailureHelper {\ - public:\ - static void Execute() { statement; }\ - };\ - ::testing::TestPartResultArray gtest_failures;\ - ::testing::internal::SingleFailureChecker gtest_checker(\ - >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ - {\ - ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ - ::testing::ScopedFakeTestPartResultReporter:: \ - INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ - GTestExpectFatalFailureHelper::Execute();\ - }\ - } while (::testing::internal::AlwaysFalse()) - -#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ - do { \ - class GTestExpectFatalFailureHelper {\ - public:\ - static void Execute() { statement; }\ - };\ - ::testing::TestPartResultArray gtest_failures;\ - ::testing::internal::SingleFailureChecker gtest_checker(\ - >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ - {\ - ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ - ::testing::ScopedFakeTestPartResultReporter:: \ - INTERCEPT_ALL_THREADS, >est_failures);\ - GTestExpectFatalFailureHelper::Execute();\ - }\ - } while (::testing::internal::AlwaysFalse()) - -// A macro for testing Google Test assertions or code that's expected to -// generate Google Test non-fatal failures. It asserts that the given -// statement will cause exactly one non-fatal Google Test failure with 'substr' -// being part of the failure message. -// -// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only -// affects and considers failures generated in the current thread and -// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. -// -// 'statement' is allowed to reference local variables and members of -// the current object. -// -// The verification of the assertion is done correctly even when the statement -// throws an exception or aborts the current function. -// -// Known restrictions: -// - You cannot stream a failure message to this macro. -// -// Note that even though the implementations of the following two -// macros are much alike, we cannot refactor them to use a common -// helper macro, due to some peculiarity in how the preprocessor -// works. If we do that, the code won't compile when the user gives -// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that -// expands to code containing an unprotected comma. The -// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc -// catches that. -// -// For the same reason, we have to write -// if (::testing::internal::AlwaysTrue()) { statement; } -// instead of -// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) -// to avoid an MSVC warning on unreachable code. -#define EXPECT_NONFATAL_FAILURE(statement, substr) \ - do {\ - ::testing::TestPartResultArray gtest_failures;\ - ::testing::internal::SingleFailureChecker gtest_checker(\ - >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ - (substr));\ - {\ - ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ - ::testing::ScopedFakeTestPartResultReporter:: \ - INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ - if (::testing::internal::AlwaysTrue()) { statement; }\ - }\ - } while (::testing::internal::AlwaysFalse()) - -#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ - do {\ - ::testing::TestPartResultArray gtest_failures;\ - ::testing::internal::SingleFailureChecker gtest_checker(\ - >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ - (substr));\ - {\ - ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ - ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ - >est_failures);\ - if (::testing::internal::AlwaysTrue()) { statement; }\ - }\ - } while (::testing::internal::AlwaysFalse()) - -#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ diff --git a/core/deps/gtest/gtest-test-part.h b/core/deps/gtest/gtest-test-part.h deleted file mode 100644 index 80c6f515e..000000000 --- a/core/deps/gtest/gtest-test-part.h +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ -#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ - -#include -#include - -#include "internal/gtest-internal.h" -#include "internal/gtest-string.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// A copyable object representing the result of a test part (i.e. an -// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). -// -// Don't inherit from TestPartResult as its destructor is not virtual. -class GTEST_API_ TestPartResult { - public: - // The possible outcomes of a test part (i.e. an assertion or an - // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). - enum Type { - kSuccess, // Succeeded. - kNonFatalFailure, // Failed but the test can continue. - kFatalFailure, // Failed and the test should be terminated. - kSkip // Skipped. - }; - - // C'tor. TestPartResult does NOT have a default constructor. - // Always use this constructor (with parameters) to create a - // TestPartResult object. - TestPartResult(Type a_type, const char* a_file_name, int a_line_number, - const char* a_message) - : type_(a_type), - file_name_(a_file_name == nullptr ? "" : a_file_name), - line_number_(a_line_number), - summary_(ExtractSummary(a_message)), - message_(a_message) {} - - // Gets the outcome of the test part. - Type type() const { return type_; } - - // Gets the name of the source file where the test part took place, or - // NULL if it's unknown. - const char* file_name() const { - return file_name_.empty() ? nullptr : file_name_.c_str(); - } - - // Gets the line in the source file where the test part took place, - // or -1 if it's unknown. - int line_number() const { return line_number_; } - - // Gets the summary of the failure message. - const char* summary() const { return summary_.c_str(); } - - // Gets the message associated with the test part. - const char* message() const { return message_.c_str(); } - - // Returns true if and only if the test part was skipped. - bool skipped() const { return type_ == kSkip; } - - // Returns true if and only if the test part passed. - bool passed() const { return type_ == kSuccess; } - - // Returns true if and only if the test part non-fatally failed. - bool nonfatally_failed() const { return type_ == kNonFatalFailure; } - - // Returns true if and only if the test part fatally failed. - bool fatally_failed() const { return type_ == kFatalFailure; } - - // Returns true if and only if the test part failed. - bool failed() const { return fatally_failed() || nonfatally_failed(); } - - private: - Type type_; - - // Gets the summary of the failure message by omitting the stack - // trace in it. - static std::string ExtractSummary(const char* message); - - // The name of the source file where the test part took place, or - // "" if the source file is unknown. - std::string file_name_; - // The line in the source file where the test part took place, or -1 - // if the line number is unknown. - int line_number_; - std::string summary_; // The test failure summary. - std::string message_; // The test failure message. -}; - -// Prints a TestPartResult object. -std::ostream& operator<<(std::ostream& os, const TestPartResult& result); - -// An array of TestPartResult objects. -// -// Don't inherit from TestPartResultArray as its destructor is not -// virtual. -class GTEST_API_ TestPartResultArray { - public: - TestPartResultArray() {} - - // Appends the given TestPartResult to the array. - void Append(const TestPartResult& result); - - // Returns the TestPartResult at the given index (0-based). - const TestPartResult& GetTestPartResult(int index) const; - - // Returns the number of TestPartResult objects in the array. - int size() const; - - private: - std::vector array_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); -}; - -// This interface knows how to report a test part result. -class GTEST_API_ TestPartResultReporterInterface { - public: - virtual ~TestPartResultReporterInterface() {} - - virtual void ReportTestPartResult(const TestPartResult& result) = 0; -}; - -namespace internal { - -// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a -// statement generates new fatal failures. To do so it registers itself as the -// current test part result reporter. Besides checking if fatal failures were -// reported, it only delegates the reporting to the former result reporter. -// The original result reporter is restored in the destructor. -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -class GTEST_API_ HasNewFatalFailureHelper - : public TestPartResultReporterInterface { - public: - HasNewFatalFailureHelper(); - ~HasNewFatalFailureHelper() override; - void ReportTestPartResult(const TestPartResult& result) override; - bool has_new_fatal_failure() const { return has_new_fatal_failure_; } - private: - bool has_new_fatal_failure_; - TestPartResultReporterInterface* original_reporter_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); -}; - -} // namespace internal - -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ diff --git a/core/deps/gtest/gtest-typed-test.h b/core/deps/gtest/gtest-typed-test.h deleted file mode 100644 index db52629e2..000000000 --- a/core/deps/gtest/gtest-typed-test.h +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2008 Google Inc. -// All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ - -// This header implements typed tests and type-parameterized tests. - -// Typed (aka type-driven) tests repeat the same test for types in a -// list. You must know which types you want to test with when writing -// typed tests. Here's how you do it: - -#if 0 - -// First, define a fixture class template. It should be parameterized -// by a type. Remember to derive it from testing::Test. -template -class FooTest : public testing::Test { - public: - ... - typedef std::list List; - static T shared_; - T value_; -}; - -// Next, associate a list of types with the test suite, which will be -// repeated for each type in the list. The typedef is necessary for -// the macro to parse correctly. -typedef testing::Types MyTypes; -TYPED_TEST_SUITE(FooTest, MyTypes); - -// If the type list contains only one type, you can write that type -// directly without Types<...>: -// TYPED_TEST_SUITE(FooTest, int); - -// Then, use TYPED_TEST() instead of TEST_F() to define as many typed -// tests for this test suite as you want. -TYPED_TEST(FooTest, DoesBlah) { - // Inside a test, refer to the special name TypeParam to get the type - // parameter. Since we are inside a derived class template, C++ requires - // us to visit the members of FooTest via 'this'. - TypeParam n = this->value_; - - // To visit static members of the fixture, add the TestFixture:: - // prefix. - n += TestFixture::shared_; - - // To refer to typedefs in the fixture, add the "typename - // TestFixture::" prefix. - typename TestFixture::List values; - values.push_back(n); - ... -} - -TYPED_TEST(FooTest, HasPropertyA) { ... } - -// TYPED_TEST_SUITE takes an optional third argument which allows to specify a -// class that generates custom test name suffixes based on the type. This should -// be a class which has a static template function GetName(int index) returning -// a string for each type. The provided integer index equals the index of the -// type in the provided type list. In many cases the index can be ignored. -// -// For example: -// class MyTypeNames { -// public: -// template -// static std::string GetName(int) { -// if (std::is_same()) return "char"; -// if (std::is_same()) return "int"; -// if (std::is_same()) return "unsignedInt"; -// } -// }; -// TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames); - -#endif // 0 - -// Type-parameterized tests are abstract test patterns parameterized -// by a type. Compared with typed tests, type-parameterized tests -// allow you to define the test pattern without knowing what the type -// parameters are. The defined pattern can be instantiated with -// different types any number of times, in any number of translation -// units. -// -// If you are designing an interface or concept, you can define a -// suite of type-parameterized tests to verify properties that any -// valid implementation of the interface/concept should have. Then, -// each implementation can easily instantiate the test suite to verify -// that it conforms to the requirements, without having to write -// similar tests repeatedly. Here's an example: - -#if 0 - -// First, define a fixture class template. It should be parameterized -// by a type. Remember to derive it from testing::Test. -template -class FooTest : public testing::Test { - ... -}; - -// Next, declare that you will define a type-parameterized test suite -// (the _P suffix is for "parameterized" or "pattern", whichever you -// prefer): -TYPED_TEST_SUITE_P(FooTest); - -// Then, use TYPED_TEST_P() to define as many type-parameterized tests -// for this type-parameterized test suite as you want. -TYPED_TEST_P(FooTest, DoesBlah) { - // Inside a test, refer to TypeParam to get the type parameter. - TypeParam n = 0; - ... -} - -TYPED_TEST_P(FooTest, HasPropertyA) { ... } - -// Now the tricky part: you need to register all test patterns before -// you can instantiate them. The first argument of the macro is the -// test suite name; the rest are the names of the tests in this test -// case. -REGISTER_TYPED_TEST_SUITE_P(FooTest, - DoesBlah, HasPropertyA); - -// Finally, you are free to instantiate the pattern with the types you -// want. If you put the above code in a header file, you can #include -// it in multiple C++ source files and instantiate it multiple times. -// -// To distinguish different instances of the pattern, the first -// argument to the INSTANTIATE_* macro is a prefix that will be added -// to the actual test suite name. Remember to pick unique prefixes for -// different instances. -typedef testing::Types MyTypes; -INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); - -// If the type list contains only one type, you can write that type -// directly without Types<...>: -// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int); -// -// Similar to the optional argument of TYPED_TEST_SUITE above, -// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to -// generate custom names. -// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames); - -#endif // 0 - -#include "internal/gtest-port.h" -#include "internal/gtest-type-util.h" - -// Implements typed tests. - -#if GTEST_HAS_TYPED_TEST - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Expands to the name of the typedef for the type parameters of the -// given test suite. -#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_ - -// Expands to the name of the typedef for the NameGenerator, responsible for -// creating the suffixes of the name. -#define GTEST_NAME_GENERATOR_(TestSuiteName) \ - gtest_type_params_##TestSuiteName##_NameGenerator - -#define TYPED_TEST_SUITE(CaseName, Types, ...) \ - typedef ::testing::internal::GenerateTypeList::type \ - GTEST_TYPE_PARAMS_(CaseName); \ - typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ - GTEST_NAME_GENERATOR_(CaseName) - -#define TYPED_TEST(CaseName, TestName) \ - template \ - class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ - : public CaseName { \ - private: \ - typedef CaseName TestFixture; \ - typedef gtest_TypeParam_ TypeParam; \ - void TestBody() override; \ - }; \ - static bool gtest_##CaseName##_##TestName##_registered_ \ - GTEST_ATTRIBUTE_UNUSED_ = ::testing::internal::TypeParameterizedTest< \ - CaseName, \ - ::testing::internal::TemplateSel, \ - GTEST_TYPE_PARAMS_( \ - CaseName)>::Register("", \ - ::testing::internal::CodeLocation( \ - __FILE__, __LINE__), \ - #CaseName, #TestName, 0, \ - ::testing::internal::GenerateNames< \ - GTEST_NAME_GENERATOR_(CaseName), \ - GTEST_TYPE_PARAMS_(CaseName)>()); \ - template \ - void GTEST_TEST_CLASS_NAME_(CaseName, \ - TestName)::TestBody() - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define TYPED_TEST_CASE \ - static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \ - TYPED_TEST_SUITE -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -#endif // GTEST_HAS_TYPED_TEST - -// Implements type-parameterized tests. - -#if GTEST_HAS_TYPED_TEST_P - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Expands to the namespace name that the type-parameterized tests for -// the given type-parameterized test suite are defined in. The exact -// name of the namespace is subject to change without notice. -#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_ - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Expands to the name of the variable used to remember the names of -// the defined tests in the given test suite. -#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \ - gtest_typed_test_suite_p_state_##TestSuiteName##_ - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. -// -// Expands to the name of the variable used to remember the names of -// the registered tests in the given test suite. -#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \ - gtest_registered_test_names_##TestSuiteName##_ - -// The variables defined in the type-parameterized test macros are -// static as typically these macros are used in a .h file that can be -// #included in multiple translation units linked together. -#define TYPED_TEST_SUITE_P(SuiteName) \ - static ::testing::internal::TypedTestSuitePState \ - GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName) - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define TYPED_TEST_CASE_P \ - static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \ - TYPED_TEST_SUITE_P -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -#define TYPED_TEST_P(SuiteName, TestName) \ - namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ - template \ - class TestName : public SuiteName { \ - private: \ - typedef SuiteName TestFixture; \ - typedef gtest_TypeParam_ TypeParam; \ - void TestBody() override; \ - }; \ - static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ - GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ - __FILE__, __LINE__, #SuiteName, #TestName); \ - } \ - template \ - void GTEST_SUITE_NAMESPACE_( \ - SuiteName)::TestName::TestBody() - -#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ - namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ - typedef ::testing::internal::Templates<__VA_ARGS__> gtest_AllTests_; \ - } \ - static const char* const GTEST_REGISTERED_TEST_NAMES_( \ - SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ - GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ - __FILE__, __LINE__, #__VA_ARGS__) - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define REGISTER_TYPED_TEST_CASE_P \ - static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \ - ""); \ - REGISTER_TYPED_TEST_SUITE_P -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ - static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ - ::testing::internal::TypeParameterizedTestSuite< \ - SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ - ::testing::internal::GenerateTypeList::type>:: \ - Register(#Prefix, \ - ::testing::internal::CodeLocation(__FILE__, __LINE__), \ - >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \ - GTEST_REGISTERED_TEST_NAMES_(SuiteName), \ - ::testing::internal::GenerateNames< \ - ::testing::internal::NameGeneratorSelector< \ - __VA_ARGS__>::type, \ - ::testing::internal::GenerateTypeList::type>()) - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -#define INSTANTIATE_TYPED_TEST_CASE_P \ - static_assert( \ - ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \ - INSTANTIATE_TYPED_TEST_SUITE_P -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -#endif // GTEST_HAS_TYPED_TEST_P - -#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ diff --git a/core/deps/gtest/gtest.h b/core/deps/gtest/gtest.h deleted file mode 100644 index 06a330536..000000000 --- a/core/deps/gtest/gtest.h +++ /dev/null @@ -1,2473 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file defines the public API for Google Test. It should be -// included by any test program that uses Google Test. -// -// IMPORTANT NOTE: Due to limitation of the C++ language, we have to -// leave some internal implementation details in this header file. -// They are clearly marked by comments like this: -// -// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -// -// Such code is NOT meant to be used by a user directly, and is subject -// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user -// program! -// -// Acknowledgment: Google Test borrowed the idea of automatic test -// registration from Barthelemy Dagenais' (barthelemy@prologique.com) -// easyUnit framework. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ -#define GTEST_INCLUDE_GTEST_GTEST_H_ - -#include -#include -#include -#include -#include -#include - -#include "gtest_prod.h" -#include "gtest-death-test.h" -#include "gtest-matchers.h" -#include "gtest-message.h" -#include "gtest-param-test.h" -#include "gtest-printers.h" -#include "gtest-test-part.h" -#include "gtest-typed-test.h" -#include "internal/gtest-internal.h" -#include "internal/gtest-string.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// Silence C4100 (unreferenced formal parameter) and 4805 -// unsafe mix of type 'const int' and type 'const bool' -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable:4805) -# pragma warning(disable:4100) -#endif - - -// Declares the flags. - -// This flag temporary enables the disabled tests. -GTEST_DECLARE_bool_(also_run_disabled_tests); - -// This flag brings the debugger on an assertion failure. -GTEST_DECLARE_bool_(break_on_failure); - -// This flag controls whether Google Test catches all test-thrown exceptions -// and logs them as failures. -GTEST_DECLARE_bool_(catch_exceptions); - -// This flag enables using colors in terminal output. Available values are -// "yes" to enable colors, "no" (disable colors), or "auto" (the default) -// to let Google Test decide. -GTEST_DECLARE_string_(color); - -// This flag sets up the filter to select by name using a glob pattern -// the tests to run. If the filter is not given all tests are executed. -GTEST_DECLARE_string_(filter); - -// This flag controls whether Google Test installs a signal handler that dumps -// debugging information when fatal signals are raised. -GTEST_DECLARE_bool_(install_failure_signal_handler); - -// This flag causes the Google Test to list tests. None of the tests listed -// are actually run if the flag is provided. -GTEST_DECLARE_bool_(list_tests); - -// This flag controls whether Google Test emits a detailed XML report to a file -// in addition to its normal textual output. -GTEST_DECLARE_string_(output); - -// This flags control whether Google Test prints the elapsed time for each -// test. -GTEST_DECLARE_bool_(print_time); - -// This flags control whether Google Test prints UTF8 characters as text. -GTEST_DECLARE_bool_(print_utf8); - -// This flag specifies the random number seed. -GTEST_DECLARE_int32_(random_seed); - -// This flag sets how many times the tests are repeated. The default value -// is 1. If the value is -1 the tests are repeating forever. -GTEST_DECLARE_int32_(repeat); - -// This flag controls whether Google Test includes Google Test internal -// stack frames in failure stack traces. -GTEST_DECLARE_bool_(show_internal_stack_frames); - -// When this flag is specified, tests' order is randomized on every iteration. -GTEST_DECLARE_bool_(shuffle); - -// This flag specifies the maximum number of stack frames to be -// printed in a failure message. -GTEST_DECLARE_int32_(stack_trace_depth); - -// When this flag is specified, a failed assertion will throw an -// exception if exceptions are enabled, or exit the program with a -// non-zero code otherwise. For use with an external test framework. -GTEST_DECLARE_bool_(throw_on_failure); - -// When this flag is set with a "host:port" string, on supported -// platforms test results are streamed to the specified port on -// the specified host machine. -GTEST_DECLARE_string_(stream_result_to); - -#if GTEST_USE_OWN_FLAGFILE_FLAG_ -GTEST_DECLARE_string_(flagfile); -#endif // GTEST_USE_OWN_FLAGFILE_FLAG_ - -// The upper limit for valid stack trace depths. -const int kMaxStackTraceDepth = 100; - -namespace internal { - -class AssertHelper; -class DefaultGlobalTestPartResultReporter; -class ExecDeathTest; -class NoExecDeathTest; -class FinalSuccessChecker; -class GTestFlagSaver; -class StreamingListenerTest; -class TestResultAccessor; -class TestEventListenersAccessor; -class TestEventRepeater; -class UnitTestRecordPropertyTestHelper; -class WindowsDeathTest; -class FuchsiaDeathTest; -class UnitTestImpl* GetUnitTestImpl(); -void ReportFailureInUnknownLocation(TestPartResult::Type result_type, - const std::string& message); - -} // namespace internal - -// The friend relationship of some of these classes is cyclic. -// If we don't forward declare them the compiler might confuse the classes -// in friendship clauses with same named classes on the scope. -class Test; -class TestSuite; - -// Old API is still available but deprecated -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -using TestCase = TestSuite; -#endif -class TestInfo; -class UnitTest; - -// A class for indicating whether an assertion was successful. When -// the assertion wasn't successful, the AssertionResult object -// remembers a non-empty message that describes how it failed. -// -// To create an instance of this class, use one of the factory functions -// (AssertionSuccess() and AssertionFailure()). -// -// This class is useful for two purposes: -// 1. Defining predicate functions to be used with Boolean test assertions -// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts -// 2. Defining predicate-format functions to be -// used with predicate assertions (ASSERT_PRED_FORMAT*, etc). -// -// For example, if you define IsEven predicate: -// -// testing::AssertionResult IsEven(int n) { -// if ((n % 2) == 0) -// return testing::AssertionSuccess(); -// else -// return testing::AssertionFailure() << n << " is odd"; -// } -// -// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) -// will print the message -// -// Value of: IsEven(Fib(5)) -// Actual: false (5 is odd) -// Expected: true -// -// instead of a more opaque -// -// Value of: IsEven(Fib(5)) -// Actual: false -// Expected: true -// -// in case IsEven is a simple Boolean predicate. -// -// If you expect your predicate to be reused and want to support informative -// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up -// about half as often as positive ones in our tests), supply messages for -// both success and failure cases: -// -// testing::AssertionResult IsEven(int n) { -// if ((n % 2) == 0) -// return testing::AssertionSuccess() << n << " is even"; -// else -// return testing::AssertionFailure() << n << " is odd"; -// } -// -// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print -// -// Value of: IsEven(Fib(6)) -// Actual: true (8 is even) -// Expected: false -// -// NB: Predicates that support negative Boolean assertions have reduced -// performance in positive ones so be careful not to use them in tests -// that have lots (tens of thousands) of positive Boolean assertions. -// -// To use this class with EXPECT_PRED_FORMAT assertions such as: -// -// // Verifies that Foo() returns an even number. -// EXPECT_PRED_FORMAT1(IsEven, Foo()); -// -// you need to define: -// -// testing::AssertionResult IsEven(const char* expr, int n) { -// if ((n % 2) == 0) -// return testing::AssertionSuccess(); -// else -// return testing::AssertionFailure() -// << "Expected: " << expr << " is even\n Actual: it's " << n; -// } -// -// If Foo() returns 5, you will see the following message: -// -// Expected: Foo() is even -// Actual: it's 5 -// -class GTEST_API_ AssertionResult { - public: - // Copy constructor. - // Used in EXPECT_TRUE/FALSE(assertion_result). - AssertionResult(const AssertionResult& other); - -#if defined(_MSC_VER) && _MSC_VER < 1910 - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */) -#endif - - // Used in the EXPECT_TRUE/FALSE(bool_expression). - // - // T must be contextually convertible to bool. - // - // The second parameter prevents this overload from being considered if - // the argument is implicitly convertible to AssertionResult. In that case - // we want AssertionResult's copy constructor to be used. - template - explicit AssertionResult( - const T& success, - typename std::enable_if< - !std::is_convertible::value>::type* - /*enabler*/ - = nullptr) - : success_(success) {} - -#if defined(_MSC_VER) && _MSC_VER < 1910 - GTEST_DISABLE_MSC_WARNINGS_POP_() -#endif - - // Assignment operator. - AssertionResult& operator=(AssertionResult other) { - swap(other); - return *this; - } - - // Returns true if and only if the assertion succeeded. - operator bool() const { return success_; } // NOLINT - - // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. - AssertionResult operator!() const; - - // Returns the text streamed into this AssertionResult. Test assertions - // use it when they fail (i.e., the predicate's outcome doesn't match the - // assertion's expectation). When nothing has been streamed into the - // object, returns an empty string. - const char* message() const { - return message_.get() != nullptr ? message_->c_str() : ""; - } - // Deprecated; please use message() instead. - const char* failure_message() const { return message(); } - - // Streams a custom failure message into this object. - template AssertionResult& operator<<(const T& value) { - AppendMessage(Message() << value); - return *this; - } - - // Allows streaming basic output manipulators such as endl or flush into - // this object. - AssertionResult& operator<<( - ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) { - AppendMessage(Message() << basic_manipulator); - return *this; - } - - private: - // Appends the contents of message to message_. - void AppendMessage(const Message& a_message) { - if (message_.get() == nullptr) message_.reset(new ::std::string); - message_->append(a_message.GetString().c_str()); - } - - // Swap the contents of this AssertionResult with other. - void swap(AssertionResult& other); - - // Stores result of the assertion predicate. - bool success_; - // Stores the message describing the condition in case the expectation - // construct is not satisfied with the predicate's outcome. - // Referenced via a pointer to avoid taking too much stack frame space - // with test assertions. - std::unique_ptr< ::std::string> message_; -}; - -// Makes a successful assertion result. -GTEST_API_ AssertionResult AssertionSuccess(); - -// Makes a failed assertion result. -GTEST_API_ AssertionResult AssertionFailure(); - -// Makes a failed assertion result with the given failure message. -// Deprecated; use AssertionFailure() << msg. -GTEST_API_ AssertionResult AssertionFailure(const Message& msg); - -} // namespace testing - -// Includes the auto-generated header that implements a family of generic -// predicate assertion macros. This include comes late because it relies on -// APIs declared above. -#include "gtest_pred_impl.h" - -namespace testing { - -// The abstract class that all tests inherit from. -// -// In Google Test, a unit test program contains one or many TestSuites, and -// each TestSuite contains one or many Tests. -// -// When you define a test using the TEST macro, you don't need to -// explicitly derive from Test - the TEST macro automatically does -// this for you. -// -// The only time you derive from Test is when defining a test fixture -// to be used in a TEST_F. For example: -// -// class FooTest : public testing::Test { -// protected: -// void SetUp() override { ... } -// void TearDown() override { ... } -// ... -// }; -// -// TEST_F(FooTest, Bar) { ... } -// TEST_F(FooTest, Baz) { ... } -// -// Test is not copyable. -class GTEST_API_ Test { - public: - friend class TestInfo; - - // The d'tor is virtual as we intend to inherit from Test. - virtual ~Test(); - - // Sets up the stuff shared by all tests in this test case. - // - // Google Test will call Foo::SetUpTestSuite() before running the first - // test in test case Foo. Hence a sub-class can define its own - // SetUpTestSuite() method to shadow the one defined in the super - // class. - // Failures that happen during SetUpTestSuite are logged but otherwise - // ignored. - static void SetUpTestSuite() {} - - // Tears down the stuff shared by all tests in this test suite. - // - // Google Test will call Foo::TearDownTestSuite() after running the last - // test in test case Foo. Hence a sub-class can define its own - // TearDownTestSuite() method to shadow the one defined in the super - // class. - // Failures that happen during TearDownTestSuite are logged but otherwise - // ignored. - static void TearDownTestSuite() {} - - // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - static void TearDownTestCase() {} - static void SetUpTestCase() {} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Returns true if and only if the current test has a fatal failure. - static bool HasFatalFailure(); - - // Returns true if and only if the current test has a non-fatal failure. - static bool HasNonfatalFailure(); - - // Returns true if and only if the current test was skipped. - static bool IsSkipped(); - - // Returns true if and only if the current test has a (either fatal or - // non-fatal) failure. - static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } - - // Logs a property for the current test, test suite, or for the entire - // invocation of the test program when used outside of the context of a - // test suite. Only the last value for a given key is remembered. These - // are public static so they can be called from utility functions that are - // not members of the test fixture. Calls to RecordProperty made during - // lifespan of the test (from the moment its constructor starts to the - // moment its destructor finishes) will be output in XML as attributes of - // the element. Properties recorded from fixture's - // SetUpTestSuite or TearDownTestSuite are logged as attributes of the - // corresponding element. Calls to RecordProperty made in the - // global context (before or after invocation of RUN_ALL_TESTS and from - // SetUp/TearDown method of Environment objects registered with Google - // Test) will be output as attributes of the element. - static void RecordProperty(const std::string& key, const std::string& value); - static void RecordProperty(const std::string& key, int value); - - protected: - // Creates a Test object. - Test(); - - // Sets up the test fixture. - virtual void SetUp(); - - // Tears down the test fixture. - virtual void TearDown(); - - private: - // Returns true if and only if the current test has the same fixture class - // as the first test in the current test suite. - static bool HasSameFixtureClass(); - - // Runs the test after the test fixture has been set up. - // - // A sub-class must implement this to define the test logic. - // - // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. - // Instead, use the TEST or TEST_F macro. - virtual void TestBody() = 0; - - // Sets up, executes, and tears down the test. - void Run(); - - // Deletes self. We deliberately pick an unusual name for this - // internal method to avoid clashing with names used in user TESTs. - void DeleteSelf_() { delete this; } - - const std::unique_ptr gtest_flag_saver_; - - // Often a user misspells SetUp() as Setup() and spends a long time - // wondering why it is never called by Google Test. The declaration of - // the following method is solely for catching such an error at - // compile time: - // - // - The return type is deliberately chosen to be not void, so it - // will be a conflict if void Setup() is declared in the user's - // test fixture. - // - // - This method is private, so it will be another compiler error - // if the method is called from the user's test fixture. - // - // DO NOT OVERRIDE THIS FUNCTION. - // - // If you see an error about overriding the following function or - // about it being private, you have mis-spelled SetUp() as Setup(). - struct Setup_should_be_spelled_SetUp {}; - virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } - - // We disallow copying Tests. - GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); -}; - -typedef internal::TimeInMillis TimeInMillis; - -// A copyable object representing a user specified test property which can be -// output as a key/value string pair. -// -// Don't inherit from TestProperty as its destructor is not virtual. -class TestProperty { - public: - // C'tor. TestProperty does NOT have a default constructor. - // Always use this constructor (with parameters) to create a - // TestProperty object. - TestProperty(const std::string& a_key, const std::string& a_value) : - key_(a_key), value_(a_value) { - } - - // Gets the user supplied key. - const char* key() const { - return key_.c_str(); - } - - // Gets the user supplied value. - const char* value() const { - return value_.c_str(); - } - - // Sets a new value, overriding the one supplied in the constructor. - void SetValue(const std::string& new_value) { - value_ = new_value; - } - - private: - // The key supplied by the user. - std::string key_; - // The value supplied by the user. - std::string value_; -}; - -// The result of a single Test. This includes a list of -// TestPartResults, a list of TestProperties, a count of how many -// death tests there are in the Test, and how much time it took to run -// the Test. -// -// TestResult is not copyable. -class GTEST_API_ TestResult { - public: - // Creates an empty TestResult. - TestResult(); - - // D'tor. Do not inherit from TestResult. - ~TestResult(); - - // Gets the number of all test parts. This is the sum of the number - // of successful test parts and the number of failed test parts. - int total_part_count() const; - - // Returns the number of the test properties. - int test_property_count() const; - - // Returns true if and only if the test passed (i.e. no test part failed). - bool Passed() const { return !Skipped() && !Failed(); } - - // Returns true if and only if the test was skipped. - bool Skipped() const; - - // Returns true if and only if the test failed. - bool Failed() const; - - // Returns true if and only if the test fatally failed. - bool HasFatalFailure() const; - - // Returns true if and only if the test has a non-fatal failure. - bool HasNonfatalFailure() const; - - // Returns the elapsed time, in milliseconds. - TimeInMillis elapsed_time() const { return elapsed_time_; } - - // Gets the time of the test case start, in ms from the start of the - // UNIX epoch. - TimeInMillis start_timestamp() const { return start_timestamp_; } - - // Returns the i-th test part result among all the results. i can range from 0 - // to total_part_count() - 1. If i is not in that range, aborts the program. - const TestPartResult& GetTestPartResult(int i) const; - - // Returns the i-th test property. i can range from 0 to - // test_property_count() - 1. If i is not in that range, aborts the - // program. - const TestProperty& GetTestProperty(int i) const; - - private: - friend class TestInfo; - friend class TestSuite; - friend class UnitTest; - friend class internal::DefaultGlobalTestPartResultReporter; - friend class internal::ExecDeathTest; - friend class internal::TestResultAccessor; - friend class internal::UnitTestImpl; - friend class internal::WindowsDeathTest; - friend class internal::FuchsiaDeathTest; - - // Gets the vector of TestPartResults. - const std::vector& test_part_results() const { - return test_part_results_; - } - - // Gets the vector of TestProperties. - const std::vector& test_properties() const { - return test_properties_; - } - - // Sets the start time. - void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; } - - // Sets the elapsed time. - void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } - - // Adds a test property to the list. The property is validated and may add - // a non-fatal failure if invalid (e.g., if it conflicts with reserved - // key names). If a property is already recorded for the same key, the - // value will be updated, rather than storing multiple values for the same - // key. xml_element specifies the element for which the property is being - // recorded and is used for validation. - void RecordProperty(const std::string& xml_element, - const TestProperty& test_property); - - // Adds a failure if the key is a reserved attribute of Google Test - // testsuite tags. Returns true if the property is valid. - // FIXME: Validate attribute names are legal and human readable. - static bool ValidateTestProperty(const std::string& xml_element, - const TestProperty& test_property); - - // Adds a test part result to the list. - void AddTestPartResult(const TestPartResult& test_part_result); - - // Returns the death test count. - int death_test_count() const { return death_test_count_; } - - // Increments the death test count, returning the new count. - int increment_death_test_count() { return ++death_test_count_; } - - // Clears the test part results. - void ClearTestPartResults(); - - // Clears the object. - void Clear(); - - // Protects mutable state of the property vector and of owned - // properties, whose values may be updated. - internal::Mutex test_properites_mutex_; - - // The vector of TestPartResults - std::vector test_part_results_; - // The vector of TestProperties - std::vector test_properties_; - // Running count of death tests. - int death_test_count_; - // The start time, in milliseconds since UNIX Epoch. - TimeInMillis start_timestamp_; - // The elapsed time, in milliseconds. - TimeInMillis elapsed_time_; - - // We disallow copying TestResult. - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); -}; // class TestResult - -// A TestInfo object stores the following information about a test: -// -// Test suite name -// Test name -// Whether the test should be run -// A function pointer that creates the test object when invoked -// Test result -// -// The constructor of TestInfo registers itself with the UnitTest -// singleton such that the RUN_ALL_TESTS() macro knows which tests to -// run. -class GTEST_API_ TestInfo { - public: - // Destructs a TestInfo object. This function is not virtual, so - // don't inherit from TestInfo. - ~TestInfo(); - - // Returns the test suite name. - const char* test_suite_name() const { return test_suite_name_.c_str(); } - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - const char* test_case_name() const { return test_suite_name(); } -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Returns the test name. - const char* name() const { return name_.c_str(); } - - // Returns the name of the parameter type, or NULL if this is not a typed - // or a type-parameterized test. - const char* type_param() const { - if (type_param_.get() != nullptr) return type_param_->c_str(); - return nullptr; - } - - // Returns the text representation of the value parameter, or NULL if this - // is not a value-parameterized test. - const char* value_param() const { - if (value_param_.get() != nullptr) return value_param_->c_str(); - return nullptr; - } - - // Returns the file name where this test is defined. - const char* file() const { return location_.file.c_str(); } - - // Returns the line where this test is defined. - int line() const { return location_.line; } - - // Return true if this test should not be run because it's in another shard. - bool is_in_another_shard() const { return is_in_another_shard_; } - - // Returns true if this test should run, that is if the test is not - // disabled (or it is disabled but the also_run_disabled_tests flag has - // been specified) and its full name matches the user-specified filter. - // - // Google Test allows the user to filter the tests by their full names. - // The full name of a test Bar in test suite Foo is defined as - // "Foo.Bar". Only the tests that match the filter will run. - // - // A filter is a colon-separated list of glob (not regex) patterns, - // optionally followed by a '-' and a colon-separated list of - // negative patterns (tests to exclude). A test is run if it - // matches one of the positive patterns and does not match any of - // the negative patterns. - // - // For example, *A*:Foo.* is a filter that matches any string that - // contains the character 'A' or starts with "Foo.". - bool should_run() const { return should_run_; } - - // Returns true if and only if this test will appear in the XML report. - bool is_reportable() const { - // The XML report includes tests matching the filter, excluding those - // run in other shards. - return matches_filter_ && !is_in_another_shard_; - } - - // Returns the result of the test. - const TestResult* result() const { return &result_; } - - private: -#if GTEST_HAS_DEATH_TEST - friend class internal::DefaultDeathTestFactory; -#endif // GTEST_HAS_DEATH_TEST - friend class Test; - friend class TestSuite; - friend class internal::UnitTestImpl; - friend class internal::StreamingListenerTest; - friend TestInfo* internal::MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, - const char* value_param, internal::CodeLocation code_location, - internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc, - internal::TestFactoryBase* factory); - - // Constructs a TestInfo object. The newly constructed instance assumes - // ownership of the factory object. - TestInfo(const std::string& test_suite_name, const std::string& name, - const char* a_type_param, // NULL if not a type-parameterized test - const char* a_value_param, // NULL if not a value-parameterized test - internal::CodeLocation a_code_location, - internal::TypeId fixture_class_id, - internal::TestFactoryBase* factory); - - // Increments the number of death tests encountered in this test so - // far. - int increment_death_test_count() { - return result_.increment_death_test_count(); - } - - // Creates the test object, runs it, records its result, and then - // deletes it. - void Run(); - - static void ClearTestResult(TestInfo* test_info) { - test_info->result_.Clear(); - } - - // These fields are immutable properties of the test. - const std::string test_suite_name_; // test suite name - const std::string name_; // Test name - // Name of the parameter type, or NULL if this is not a typed or a - // type-parameterized test. - const std::unique_ptr type_param_; - // Text representation of the value parameter, or NULL if this is not a - // value-parameterized test. - const std::unique_ptr value_param_; - internal::CodeLocation location_; - const internal::TypeId fixture_class_id_; // ID of the test fixture class - bool should_run_; // True if and only if this test should run - bool is_disabled_; // True if and only if this test is disabled - bool matches_filter_; // True if this test matches the - // user-specified filter. - bool is_in_another_shard_; // Will be run in another shard. - internal::TestFactoryBase* const factory_; // The factory that creates - // the test object - - // This field is mutable and needs to be reset before running the - // test for the second time. - TestResult result_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); -}; - -// A test suite, which consists of a vector of TestInfos. -// -// TestSuite is not copyable. -class GTEST_API_ TestSuite { - public: - // Creates a TestSuite with the given name. - // - // TestSuite does NOT have a default constructor. Always use this - // constructor to create a TestSuite object. - // - // Arguments: - // - // name: name of the test suite - // a_type_param: the name of the test's type parameter, or NULL if - // this is not a type-parameterized test. - // set_up_tc: pointer to the function that sets up the test suite - // tear_down_tc: pointer to the function that tears down the test suite - TestSuite(const char* name, const char* a_type_param, - internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc); - - // Destructor of TestSuite. - virtual ~TestSuite(); - - // Gets the name of the TestSuite. - const char* name() const { return name_.c_str(); } - - // Returns the name of the parameter type, or NULL if this is not a - // type-parameterized test suite. - const char* type_param() const { - if (type_param_.get() != nullptr) return type_param_->c_str(); - return nullptr; - } - - // Returns true if any test in this test suite should run. - bool should_run() const { return should_run_; } - - // Gets the number of successful tests in this test suite. - int successful_test_count() const; - - // Gets the number of skipped tests in this test suite. - int skipped_test_count() const; - - // Gets the number of failed tests in this test suite. - int failed_test_count() const; - - // Gets the number of disabled tests that will be reported in the XML report. - int reportable_disabled_test_count() const; - - // Gets the number of disabled tests in this test suite. - int disabled_test_count() const; - - // Gets the number of tests to be printed in the XML report. - int reportable_test_count() const; - - // Get the number of tests in this test suite that should run. - int test_to_run_count() const; - - // Gets the number of all tests in this test suite. - int total_test_count() const; - - // Returns true if and only if the test suite passed. - bool Passed() const { return !Failed(); } - - // Returns true if and only if the test suite failed. - bool Failed() const { return failed_test_count() > 0; } - - // Returns the elapsed time, in milliseconds. - TimeInMillis elapsed_time() const { return elapsed_time_; } - - // Gets the time of the test suite start, in ms from the start of the - // UNIX epoch. - TimeInMillis start_timestamp() const { return start_timestamp_; } - - // Returns the i-th test among all the tests. i can range from 0 to - // total_test_count() - 1. If i is not in that range, returns NULL. - const TestInfo* GetTestInfo(int i) const; - - // Returns the TestResult that holds test properties recorded during - // execution of SetUpTestSuite and TearDownTestSuite. - const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; } - - private: - friend class Test; - friend class internal::UnitTestImpl; - - // Gets the (mutable) vector of TestInfos in this TestSuite. - std::vector& test_info_list() { return test_info_list_; } - - // Gets the (immutable) vector of TestInfos in this TestSuite. - const std::vector& test_info_list() const { - return test_info_list_; - } - - // Returns the i-th test among all the tests. i can range from 0 to - // total_test_count() - 1. If i is not in that range, returns NULL. - TestInfo* GetMutableTestInfo(int i); - - // Sets the should_run member. - void set_should_run(bool should) { should_run_ = should; } - - // Adds a TestInfo to this test suite. Will delete the TestInfo upon - // destruction of the TestSuite object. - void AddTestInfo(TestInfo * test_info); - - // Clears the results of all tests in this test suite. - void ClearResult(); - - // Clears the results of all tests in the given test suite. - static void ClearTestSuiteResult(TestSuite* test_suite) { - test_suite->ClearResult(); - } - - // Runs every test in this TestSuite. - void Run(); - - // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed - // for catching exceptions thrown from SetUpTestSuite(). - void RunSetUpTestSuite() { - if (set_up_tc_ != nullptr) { - (*set_up_tc_)(); - } - } - - // Runs TearDownTestSuite() for this TestSuite. This wrapper is - // needed for catching exceptions thrown from TearDownTestSuite(). - void RunTearDownTestSuite() { - if (tear_down_tc_ != nullptr) { - (*tear_down_tc_)(); - } - } - - // Returns true if and only if test passed. - static bool TestPassed(const TestInfo* test_info) { - return test_info->should_run() && test_info->result()->Passed(); - } - - // Returns true if and only if test skipped. - static bool TestSkipped(const TestInfo* test_info) { - return test_info->should_run() && test_info->result()->Skipped(); - } - - // Returns true if and only if test failed. - static bool TestFailed(const TestInfo* test_info) { - return test_info->should_run() && test_info->result()->Failed(); - } - - // Returns true if and only if the test is disabled and will be reported in - // the XML report. - static bool TestReportableDisabled(const TestInfo* test_info) { - return test_info->is_reportable() && test_info->is_disabled_; - } - - // Returns true if and only if test is disabled. - static bool TestDisabled(const TestInfo* test_info) { - return test_info->is_disabled_; - } - - // Returns true if and only if this test will appear in the XML report. - static bool TestReportable(const TestInfo* test_info) { - return test_info->is_reportable(); - } - - // Returns true if the given test should run. - static bool ShouldRunTest(const TestInfo* test_info) { - return test_info->should_run(); - } - - // Shuffles the tests in this test suite. - void ShuffleTests(internal::Random* random); - - // Restores the test order to before the first shuffle. - void UnshuffleTests(); - - // Name of the test suite. - std::string name_; - // Name of the parameter type, or NULL if this is not a typed or a - // type-parameterized test. - const std::unique_ptr type_param_; - // The vector of TestInfos in their original order. It owns the - // elements in the vector. - std::vector test_info_list_; - // Provides a level of indirection for the test list to allow easy - // shuffling and restoring the test order. The i-th element in this - // vector is the index of the i-th test in the shuffled test list. - std::vector test_indices_; - // Pointer to the function that sets up the test suite. - internal::SetUpTestSuiteFunc set_up_tc_; - // Pointer to the function that tears down the test suite. - internal::TearDownTestSuiteFunc tear_down_tc_; - // True if and only if any test in this test suite should run. - bool should_run_; - // The start time, in milliseconds since UNIX Epoch. - TimeInMillis start_timestamp_; - // Elapsed time, in milliseconds. - TimeInMillis elapsed_time_; - // Holds test properties recorded during execution of SetUpTestSuite and - // TearDownTestSuite. - TestResult ad_hoc_test_result_; - - // We disallow copying TestSuites. - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite); -}; - -// An Environment object is capable of setting up and tearing down an -// environment. You should subclass this to define your own -// environment(s). -// -// An Environment object does the set-up and tear-down in virtual -// methods SetUp() and TearDown() instead of the constructor and the -// destructor, as: -// -// 1. You cannot safely throw from a destructor. This is a problem -// as in some cases Google Test is used where exceptions are enabled, and -// we may want to implement ASSERT_* using exceptions where they are -// available. -// 2. You cannot use ASSERT_* directly in a constructor or -// destructor. -class Environment { - public: - // The d'tor is virtual as we need to subclass Environment. - virtual ~Environment() {} - - // Override this to define how to set up the environment. - virtual void SetUp() {} - - // Override this to define how to tear down the environment. - virtual void TearDown() {} - private: - // If you see an error about overriding the following function or - // about it being private, you have mis-spelled SetUp() as Setup(). - struct Setup_should_be_spelled_SetUp {}; - virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } -}; - -#if GTEST_HAS_EXCEPTIONS - -// Exception which can be thrown from TestEventListener::OnTestPartResult. -class GTEST_API_ AssertionException - : public internal::GoogleTestFailureException { - public: - explicit AssertionException(const TestPartResult& result) - : GoogleTestFailureException(result) {} -}; - -#endif // GTEST_HAS_EXCEPTIONS - -// The interface for tracing execution of tests. The methods are organized in -// the order the corresponding events are fired. -class TestEventListener { - public: - virtual ~TestEventListener() {} - - // Fired before any test activity starts. - virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; - - // Fired before each iteration of tests starts. There may be more than - // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration - // index, starting from 0. - virtual void OnTestIterationStart(const UnitTest& unit_test, - int iteration) = 0; - - // Fired before environment set-up for each iteration of tests starts. - virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; - - // Fired after environment set-up for each iteration of tests ends. - virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; - - // Fired before the test suite starts. - virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {} - - // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Fired before the test starts. - virtual void OnTestStart(const TestInfo& test_info) = 0; - - // Fired after a failed assertion or a SUCCEED() invocation. - // If you want to throw an exception from this function to skip to the next - // TEST, it must be AssertionException defined above, or inherited from it. - virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; - - // Fired after the test ends. - virtual void OnTestEnd(const TestInfo& test_info) = 0; - - // Fired after the test suite ends. - virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {} - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Fired before environment tear-down for each iteration of tests starts. - virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; - - // Fired after environment tear-down for each iteration of tests ends. - virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; - - // Fired after each iteration of tests finishes. - virtual void OnTestIterationEnd(const UnitTest& unit_test, - int iteration) = 0; - - // Fired after all test activities have ended. - virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; -}; - -// The convenience class for users who need to override just one or two -// methods and are not concerned that a possible change to a signature of -// the methods they override will not be caught during the build. For -// comments about each method please see the definition of TestEventListener -// above. -class EmptyTestEventListener : public TestEventListener { - public: - void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} - void OnTestIterationStart(const UnitTest& /*unit_test*/, - int /*iteration*/) override {} - void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {} - void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} - void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {} -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseStart(const TestCase& /*test_case*/) override {} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - void OnTestStart(const TestInfo& /*test_info*/) override {} - void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {} - void OnTestEnd(const TestInfo& /*test_info*/) override {} - void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {} -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseEnd(const TestCase& /*test_case*/) override {} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {} - void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} - void OnTestIterationEnd(const UnitTest& /*unit_test*/, - int /*iteration*/) override {} - void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} -}; - -// TestEventListeners lets users add listeners to track events in Google Test. -class GTEST_API_ TestEventListeners { - public: - TestEventListeners(); - ~TestEventListeners(); - - // Appends an event listener to the end of the list. Google Test assumes - // the ownership of the listener (i.e. it will delete the listener when - // the test program finishes). - void Append(TestEventListener* listener); - - // Removes the given event listener from the list and returns it. It then - // becomes the caller's responsibility to delete the listener. Returns - // NULL if the listener is not found in the list. - TestEventListener* Release(TestEventListener* listener); - - // Returns the standard listener responsible for the default console - // output. Can be removed from the listeners list to shut down default - // console output. Note that removing this object from the listener list - // with Release transfers its ownership to the caller and makes this - // function return NULL the next time. - TestEventListener* default_result_printer() const { - return default_result_printer_; - } - - // Returns the standard listener responsible for the default XML output - // controlled by the --gtest_output=xml flag. Can be removed from the - // listeners list by users who want to shut down the default XML output - // controlled by this flag and substitute it with custom one. Note that - // removing this object from the listener list with Release transfers its - // ownership to the caller and makes this function return NULL the next - // time. - TestEventListener* default_xml_generator() const { - return default_xml_generator_; - } - - private: - friend class TestSuite; - friend class TestInfo; - friend class internal::DefaultGlobalTestPartResultReporter; - friend class internal::NoExecDeathTest; - friend class internal::TestEventListenersAccessor; - friend class internal::UnitTestImpl; - - // Returns repeater that broadcasts the TestEventListener events to all - // subscribers. - TestEventListener* repeater(); - - // Sets the default_result_printer attribute to the provided listener. - // The listener is also added to the listener list and previous - // default_result_printer is removed from it and deleted. The listener can - // also be NULL in which case it will not be added to the list. Does - // nothing if the previous and the current listener objects are the same. - void SetDefaultResultPrinter(TestEventListener* listener); - - // Sets the default_xml_generator attribute to the provided listener. The - // listener is also added to the listener list and previous - // default_xml_generator is removed from it and deleted. The listener can - // also be NULL in which case it will not be added to the list. Does - // nothing if the previous and the current listener objects are the same. - void SetDefaultXmlGenerator(TestEventListener* listener); - - // Controls whether events will be forwarded by the repeater to the - // listeners in the list. - bool EventForwardingEnabled() const; - void SuppressEventForwarding(); - - // The actual list of listeners. - internal::TestEventRepeater* repeater_; - // Listener responsible for the standard result output. - TestEventListener* default_result_printer_; - // Listener responsible for the creation of the XML output file. - TestEventListener* default_xml_generator_; - - // We disallow copying TestEventListeners. - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); -}; - -// A UnitTest consists of a vector of TestSuites. -// -// This is a singleton class. The only instance of UnitTest is -// created when UnitTest::GetInstance() is first called. This -// instance is never deleted. -// -// UnitTest is not copyable. -// -// This class is thread-safe as long as the methods are called -// according to their specification. -class GTEST_API_ UnitTest { - public: - // Gets the singleton UnitTest object. The first time this method - // is called, a UnitTest object is constructed and returned. - // Consecutive calls will return the same object. - static UnitTest* GetInstance(); - - // Runs all tests in this UnitTest object and prints the result. - // Returns 0 if successful, or 1 otherwise. - // - // This method can only be called from the main thread. - // - // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - int Run() GTEST_MUST_USE_RESULT_; - - // Returns the working directory when the first TEST() or TEST_F() - // was executed. The UnitTest object owns the string. - const char* original_working_dir() const; - - // Returns the TestSuite object for the test that's currently running, - // or NULL if no test is running. - const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_); - -// Legacy API is still available but deprecated -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_); -#endif - - // Returns the TestInfo object for the test that's currently running, - // or NULL if no test is running. - const TestInfo* current_test_info() const - GTEST_LOCK_EXCLUDED_(mutex_); - - // Returns the random seed used at the start of the current test run. - int random_seed() const; - - // Returns the ParameterizedTestSuiteRegistry object used to keep track of - // value-parameterized tests and instantiate and register them. - // - // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() - GTEST_LOCK_EXCLUDED_(mutex_); - - // Gets the number of successful test suites. - int successful_test_suite_count() const; - - // Gets the number of failed test suites. - int failed_test_suite_count() const; - - // Gets the number of all test suites. - int total_test_suite_count() const; - - // Gets the number of all test suites that contain at least one test - // that should run. - int test_suite_to_run_count() const; - - // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - int successful_test_case_count() const; - int failed_test_case_count() const; - int total_test_case_count() const; - int test_case_to_run_count() const; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Gets the number of successful tests. - int successful_test_count() const; - - // Gets the number of skipped tests. - int skipped_test_count() const; - - // Gets the number of failed tests. - int failed_test_count() const; - - // Gets the number of disabled tests that will be reported in the XML report. - int reportable_disabled_test_count() const; - - // Gets the number of disabled tests. - int disabled_test_count() const; - - // Gets the number of tests to be printed in the XML report. - int reportable_test_count() const; - - // Gets the number of all tests. - int total_test_count() const; - - // Gets the number of tests that should run. - int test_to_run_count() const; - - // Gets the time of the test program start, in ms from the start of the - // UNIX epoch. - TimeInMillis start_timestamp() const; - - // Gets the elapsed time, in milliseconds. - TimeInMillis elapsed_time() const; - - // Returns true if and only if the unit test passed (i.e. all test suites - // passed). - bool Passed() const; - - // Returns true if and only if the unit test failed (i.e. some test suite - // failed or something outside of all tests failed). - bool Failed() const; - - // Gets the i-th test suite among all the test suites. i can range from 0 to - // total_test_suite_count() - 1. If i is not in that range, returns NULL. - const TestSuite* GetTestSuite(int i) const; - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - const TestCase* GetTestCase(int i) const; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Returns the TestResult containing information on test failures and - // properties logged outside of individual test suites. - const TestResult& ad_hoc_test_result() const; - - // Returns the list of event listeners that can be used to track events - // inside Google Test. - TestEventListeners& listeners(); - - private: - // Registers and returns a global test environment. When a test - // program is run, all global test environments will be set-up in - // the order they were registered. After all tests in the program - // have finished, all global test environments will be torn-down in - // the *reverse* order they were registered. - // - // The UnitTest object takes ownership of the given environment. - // - // This method can only be called from the main thread. - Environment* AddEnvironment(Environment* env); - - // Adds a TestPartResult to the current TestResult object. All - // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) - // eventually call this to report their results. The user code - // should use the assertion macros instead of calling this directly. - void AddTestPartResult(TestPartResult::Type result_type, - const char* file_name, - int line_number, - const std::string& message, - const std::string& os_stack_trace) - GTEST_LOCK_EXCLUDED_(mutex_); - - // Adds a TestProperty to the current TestResult object when invoked from - // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked - // from SetUpTestSuite or TearDownTestSuite, or to the global property set - // when invoked elsewhere. If the result already contains a property with - // the same key, the value will be updated. - void RecordProperty(const std::string& key, const std::string& value); - - // Gets the i-th test suite among all the test suites. i can range from 0 to - // total_test_suite_count() - 1. If i is not in that range, returns NULL. - TestSuite* GetMutableTestSuite(int i); - - // Accessors for the implementation object. - internal::UnitTestImpl* impl() { return impl_; } - const internal::UnitTestImpl* impl() const { return impl_; } - - // These classes and functions are friends as they need to access private - // members of UnitTest. - friend class ScopedTrace; - friend class Test; - friend class internal::AssertHelper; - friend class internal::StreamingListenerTest; - friend class internal::UnitTestRecordPropertyTestHelper; - friend Environment* AddGlobalTestEnvironment(Environment* env); - friend internal::UnitTestImpl* internal::GetUnitTestImpl(); - friend void internal::ReportFailureInUnknownLocation( - TestPartResult::Type result_type, - const std::string& message); - - // Creates an empty UnitTest. - UnitTest(); - - // D'tor - virtual ~UnitTest(); - - // Pushes a trace defined by SCOPED_TRACE() on to the per-thread - // Google Test trace stack. - void PushGTestTrace(const internal::TraceInfo& trace) - GTEST_LOCK_EXCLUDED_(mutex_); - - // Pops a trace from the per-thread Google Test trace stack. - void PopGTestTrace() - GTEST_LOCK_EXCLUDED_(mutex_); - - // Protects mutable state in *impl_. This is mutable as some const - // methods need to lock it too. - mutable internal::Mutex mutex_; - - // Opaque implementation object. This field is never changed once - // the object is constructed. We don't mark it as const here, as - // doing so will cause a warning in the constructor of UnitTest. - // Mutable state in *impl_ is protected by mutex_. - internal::UnitTestImpl* impl_; - - // We disallow copying UnitTest. - GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); -}; - -// A convenient wrapper for adding an environment for the test -// program. -// -// You should call this before RUN_ALL_TESTS() is called, probably in -// main(). If you use gtest_main, you need to call this before main() -// starts for it to take effect. For example, you can define a global -// variable like this: -// -// testing::Environment* const foo_env = -// testing::AddGlobalTestEnvironment(new FooEnvironment); -// -// However, we strongly recommend you to write your own main() and -// call AddGlobalTestEnvironment() there, as relying on initialization -// of global variables makes the code harder to read and may cause -// problems when you register multiple environments from different -// translation units and the environments have dependencies among them -// (remember that the compiler doesn't guarantee the order in which -// global variables from different translation units are initialized). -inline Environment* AddGlobalTestEnvironment(Environment* env) { - return UnitTest::GetInstance()->AddEnvironment(env); -} - -// Initializes Google Test. This must be called before calling -// RUN_ALL_TESTS(). In particular, it parses a command line for the -// flags that Google Test recognizes. Whenever a Google Test flag is -// seen, it is removed from argv, and *argc is decremented. -// -// No value is returned. Instead, the Google Test flag variables are -// updated. -// -// Calling the function for the second time has no user-visible effect. -GTEST_API_ void InitGoogleTest(int* argc, char** argv); - -// This overloaded version can be used in Windows programs compiled in -// UNICODE mode. -GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); - -// This overloaded version can be used on Arduino/embedded platforms where -// there is no argc/argv. -GTEST_API_ void InitGoogleTest(); - -namespace internal { - -// Separate the error generating code from the code path to reduce the stack -// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers -// when calling EXPECT_* in a tight loop. -template -AssertionResult CmpHelperEQFailure(const char* lhs_expression, - const char* rhs_expression, - const T1& lhs, const T2& rhs) { - return EqFailure(lhs_expression, - rhs_expression, - FormatForComparisonFailureMessage(lhs, rhs), - FormatForComparisonFailureMessage(rhs, lhs), - false); -} - -// This block of code defines operator==/!= -// to block lexical scope lookup. -// It prevents using invalid operator==/!= defined at namespace scope. -struct faketype {}; -inline bool operator==(faketype, faketype) { return true; } -inline bool operator!=(faketype, faketype) { return false; } - -// The helper function for {ASSERT|EXPECT}_EQ. -template -AssertionResult CmpHelperEQ(const char* lhs_expression, - const char* rhs_expression, - const T1& lhs, - const T2& rhs) { - if (lhs == rhs) { - return AssertionSuccess(); - } - - return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs); -} - -// With this overloaded version, we allow anonymous enums to be used in -// {ASSERT|EXPECT}_EQ as anonymous enums can be implicitly cast to integers. -GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression, - const char* rhs_expression, - std::intmax_t lhs, std::intmax_t rhs); - -class EqHelper { - public: - // This templatized version is for the general case. - template < - typename T1, typename T2, - // Disable this overload for cases where one argument is a pointer - // and the other is the null pointer constant. - typename std::enable_if::value || - !std::is_pointer::value>::type* = nullptr> - static AssertionResult Compare(const char* lhs_expression, - const char* rhs_expression, const T1& lhs, - const T2& rhs) { - return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); - } - - // With this overloaded version, we allow anonymous enums to be used in - // {ASSERT|EXPECT}_EQ as anonymous enums can be implicitly cast to integers. - // - // Even though its body looks the same as the above version, we - // cannot merge the two, as it will make anonymous enums unhappy. - static AssertionResult Compare(const char* lhs_expression, - const char* rhs_expression, std::intmax_t lhs, - std::intmax_t rhs) { - return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); - } - - template - static AssertionResult Compare( - const char* lhs_expression, const char* rhs_expression, - // Handle cases where '0' is used as a null pointer literal. - std::nullptr_t /* lhs */, T* rhs) { - // We already know that 'lhs' is a null pointer. - return CmpHelperEQ(lhs_expression, rhs_expression, static_cast(nullptr), - rhs); - } -}; - -// Separate the error generating code from the code path to reduce the stack -// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers -// when calling EXPECT_OP in a tight loop. -template -AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2, - const T1& val1, const T2& val2, - const char* op) { - return AssertionFailure() - << "Expected: (" << expr1 << ") " << op << " (" << expr2 - << "), actual: " << FormatForComparisonFailureMessage(val1, val2) - << " vs " << FormatForComparisonFailureMessage(val2, val1); -} - -// A macro for implementing the helper functions needed to implement -// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste -// of similar code. -// -// For each templatized helper function, we also define an overloaded -// version for std::intmax_t in order to reduce code bloat and allow -// anonymous enums to be used with {ASSERT|EXPECT}_??. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - -#define GTEST_IMPL_CMP_HELPER_(op_name, op) \ - template \ - AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ - const T1& val1, const T2& val2) { \ - if (val1 op val2) { \ - return AssertionSuccess(); \ - } else { \ - return CmpHelperOpFailure(expr1, expr2, val1, val2, #op); \ - } \ - } \ - GTEST_API_ AssertionResult CmpHelper##op_name( \ - const char* expr1, const char* expr2, std::intmax_t val1, \ - std::intmax_t val2) - -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. - -// Implements the helper function for {ASSERT|EXPECT}_NE -GTEST_IMPL_CMP_HELPER_(NE, !=); -// Implements the helper function for {ASSERT|EXPECT}_LE -GTEST_IMPL_CMP_HELPER_(LE, <=); -// Implements the helper function for {ASSERT|EXPECT}_LT -GTEST_IMPL_CMP_HELPER_(LT, <); -// Implements the helper function for {ASSERT|EXPECT}_GE -GTEST_IMPL_CMP_HELPER_(GE, >=); -// Implements the helper function for {ASSERT|EXPECT}_GT -GTEST_IMPL_CMP_HELPER_(GT, >); - -#undef GTEST_IMPL_CMP_HELPER_ - -// The helper function for {ASSERT|EXPECT}_STREQ. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2); - -// The helper function for {ASSERT|EXPECT}_STRCASEEQ. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2); - -// The helper function for {ASSERT|EXPECT}_STRNE. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2); - -// The helper function for {ASSERT|EXPECT}_STRCASENE. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2); - - -// Helper function for *_STREQ on wide strings. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, - const char* s2_expression, - const wchar_t* s1, - const wchar_t* s2); - -// Helper function for *_STRNE on wide strings. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, - const char* s2_expression, - const wchar_t* s1, - const wchar_t* s2); - -} // namespace internal - -// IsSubstring() and IsNotSubstring() are intended to be used as the -// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by -// themselves. They check whether needle is a substring of haystack -// (NULL is considered a substring of itself only), and return an -// appropriate error message when they fail. -// -// The {needle,haystack}_expr arguments are the stringified -// expressions that generated the two real arguments. -GTEST_API_ AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const char* needle, const char* haystack); -GTEST_API_ AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const wchar_t* needle, const wchar_t* haystack); -GTEST_API_ AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const char* needle, const char* haystack); -GTEST_API_ AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const wchar_t* needle, const wchar_t* haystack); -GTEST_API_ AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::string& needle, const ::std::string& haystack); -GTEST_API_ AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::string& needle, const ::std::string& haystack); - -#if GTEST_HAS_STD_WSTRING -GTEST_API_ AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::wstring& needle, const ::std::wstring& haystack); -GTEST_API_ AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::wstring& needle, const ::std::wstring& haystack); -#endif // GTEST_HAS_STD_WSTRING - -namespace internal { - -// Helper template function for comparing floating-points. -// -// Template parameter: -// -// RawType: the raw floating-point type (either float or double) -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -template -AssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression, - const char* rhs_expression, - RawType lhs_value, - RawType rhs_value) { - const FloatingPoint lhs(lhs_value), rhs(rhs_value); - - if (lhs.AlmostEquals(rhs)) { - return AssertionSuccess(); - } - - ::std::stringstream lhs_ss; - lhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) - << lhs_value; - - ::std::stringstream rhs_ss; - rhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) - << rhs_value; - - return EqFailure(lhs_expression, - rhs_expression, - StringStreamToString(&lhs_ss), - StringStreamToString(&rhs_ss), - false); -} - -// Helper function for implementing ASSERT_NEAR. -// -// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. -GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, - const char* expr2, - const char* abs_error_expr, - double val1, - double val2, - double abs_error); - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// A class that enables one to stream messages to assertion macros -class GTEST_API_ AssertHelper { - public: - // Constructor. - AssertHelper(TestPartResult::Type type, - const char* file, - int line, - const char* message); - ~AssertHelper(); - - // Message assignment is a semantic trick to enable assertion - // streaming; see the GTEST_MESSAGE_ macro below. - void operator=(const Message& message) const; - - private: - // We put our data in a struct so that the size of the AssertHelper class can - // be as small as possible. This is important because gcc is incapable of - // re-using stack space even for temporary variables, so every EXPECT_EQ - // reserves stack space for another AssertHelper. - struct AssertHelperData { - AssertHelperData(TestPartResult::Type t, - const char* srcfile, - int line_num, - const char* msg) - : type(t), file(srcfile), line(line_num), message(msg) { } - - TestPartResult::Type const type; - const char* const file; - int const line; - std::string const message; - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); - }; - - AssertHelperData* const data_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); -}; - -enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; - -GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color, - const char* fmt, - ...); - -} // namespace internal - -// The pure interface class that all value-parameterized tests inherit from. -// A value-parameterized class must inherit from both ::testing::Test and -// ::testing::WithParamInterface. In most cases that just means inheriting -// from ::testing::TestWithParam, but more complicated test hierarchies -// may need to inherit from Test and WithParamInterface at different levels. -// -// This interface has support for accessing the test parameter value via -// the GetParam() method. -// -// Use it with one of the parameter generator defining functions, like Range(), -// Values(), ValuesIn(), Bool(), and Combine(). -// -// class FooTest : public ::testing::TestWithParam { -// protected: -// FooTest() { -// // Can use GetParam() here. -// } -// ~FooTest() override { -// // Can use GetParam() here. -// } -// void SetUp() override { -// // Can use GetParam() here. -// } -// void TearDown override { -// // Can use GetParam() here. -// } -// }; -// TEST_P(FooTest, DoesBar) { -// // Can use GetParam() method here. -// Foo foo; -// ASSERT_TRUE(foo.DoesBar(GetParam())); -// } -// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); - -template -class WithParamInterface { - public: - typedef T ParamType; - virtual ~WithParamInterface() {} - - // The current parameter value. Is also available in the test fixture's - // constructor. - static const ParamType& GetParam() { - GTEST_CHECK_(parameter_ != nullptr) - << "GetParam() can only be called inside a value-parameterized test " - << "-- did you intend to write TEST_P instead of TEST_F?"; - return *parameter_; - } - - private: - // Sets parameter value. The caller is responsible for making sure the value - // remains alive and unchanged throughout the current test. - static void SetParam(const ParamType* parameter) { - parameter_ = parameter; - } - - // Static value used for accessing parameter during a test lifetime. - static const ParamType* parameter_; - - // TestClass must be a subclass of WithParamInterface and Test. - template friend class internal::ParameterizedTestFactory; -}; - -template -const T* WithParamInterface::parameter_ = nullptr; - -// Most value-parameterized classes can ignore the existence of -// WithParamInterface, and can just inherit from ::testing::TestWithParam. - -template -class TestWithParam : public Test, public WithParamInterface { -}; - -// Macros for indicating success/failure in test code. - -// Skips test in runtime. -// Skipping test aborts current function. -// Skipped tests are neither successful nor failed. -#define GTEST_SKIP() GTEST_SKIP_("") - -// ADD_FAILURE unconditionally adds a failure to the current test. -// SUCCEED generates a success - it doesn't automatically make the -// current test successful, as a test is only successful when it has -// no failure. -// -// EXPECT_* verifies that a certain condition is satisfied. If not, -// it behaves like ADD_FAILURE. In particular: -// -// EXPECT_TRUE verifies that a Boolean condition is true. -// EXPECT_FALSE verifies that a Boolean condition is false. -// -// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except -// that they will also abort the current function on failure. People -// usually want the fail-fast behavior of FAIL and ASSERT_*, but those -// writing data-driven tests often find themselves using ADD_FAILURE -// and EXPECT_* more. - -// Generates a nonfatal failure with a generic message. -#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") - -// Generates a nonfatal failure at the given source file location with -// a generic message. -#define ADD_FAILURE_AT(file, line) \ - GTEST_MESSAGE_AT_(file, line, "Failed", \ - ::testing::TestPartResult::kNonFatalFailure) - -// Generates a fatal failure with a generic message. -#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") - -// Like GTEST_FAIL(), but at the given source file location. -#define GTEST_FAIL_AT(file, line) \ - GTEST_MESSAGE_AT_(file, line, "Failed", \ - ::testing::TestPartResult::kFatalFailure) - -// Define this macro to 1 to omit the definition of FAIL(), which is a -// generic name and clashes with some other libraries. -#if !GTEST_DONT_DEFINE_FAIL -# define FAIL() GTEST_FAIL() -#endif - -// Generates a success with a generic message. -#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") - -// Define this macro to 1 to omit the definition of SUCCEED(), which -// is a generic name and clashes with some other libraries. -#if !GTEST_DONT_DEFINE_SUCCEED -# define SUCCEED() GTEST_SUCCEED() -#endif - -// Macros for testing exceptions. -// -// * {ASSERT|EXPECT}_THROW(statement, expected_exception): -// Tests that the statement throws the expected exception. -// * {ASSERT|EXPECT}_NO_THROW(statement): -// Tests that the statement doesn't throw any exception. -// * {ASSERT|EXPECT}_ANY_THROW(statement): -// Tests that the statement throws an exception. - -#define EXPECT_THROW(statement, expected_exception) \ - GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) -#define EXPECT_NO_THROW(statement) \ - GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) -#define EXPECT_ANY_THROW(statement) \ - GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) -#define ASSERT_THROW(statement, expected_exception) \ - GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) -#define ASSERT_NO_THROW(statement) \ - GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) -#define ASSERT_ANY_THROW(statement) \ - GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) - -// Boolean assertions. Condition can be either a Boolean expression or an -// AssertionResult. For more information on how to use AssertionResult with -// these macros see comments on that class. -#define EXPECT_TRUE(condition) \ - GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ - GTEST_NONFATAL_FAILURE_) -#define EXPECT_FALSE(condition) \ - GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ - GTEST_NONFATAL_FAILURE_) -#define ASSERT_TRUE(condition) \ - GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ - GTEST_FATAL_FAILURE_) -#define ASSERT_FALSE(condition) \ - GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ - GTEST_FATAL_FAILURE_) - -// Macros for testing equalities and inequalities. -// -// * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2 -// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 -// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 -// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 -// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 -// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 -// -// When they are not, Google Test prints both the tested expressions and -// their actual values. The values must be compatible built-in types, -// or you will get a compiler error. By "compatible" we mean that the -// values can be compared by the respective operator. -// -// Note: -// -// 1. It is possible to make a user-defined type work with -// {ASSERT|EXPECT}_??(), but that requires overloading the -// comparison operators and is thus discouraged by the Google C++ -// Usage Guide. Therefore, you are advised to use the -// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are -// equal. -// -// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on -// pointers (in particular, C strings). Therefore, if you use it -// with two C strings, you are testing how their locations in memory -// are related, not how their content is related. To compare two C -// strings by content, use {ASSERT|EXPECT}_STR*(). -// -// 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to -// {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you -// what the actual value is when it fails, and similarly for the -// other comparisons. -// -// 4. Do not depend on the order in which {ASSERT|EXPECT}_??() -// evaluate their arguments, which is undefined. -// -// 5. These macros evaluate their arguments exactly once. -// -// Examples: -// -// EXPECT_NE(Foo(), 5); -// EXPECT_EQ(a_pointer, NULL); -// ASSERT_LT(i, array_size); -// ASSERT_GT(records.size(), 0) << "There is no record left."; - -#define EXPECT_EQ(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) -#define EXPECT_NE(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) -#define EXPECT_LE(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) -#define EXPECT_LT(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) -#define EXPECT_GE(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) -#define EXPECT_GT(val1, val2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) - -#define GTEST_ASSERT_EQ(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) -#define GTEST_ASSERT_NE(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) -#define GTEST_ASSERT_LE(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) -#define GTEST_ASSERT_LT(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) -#define GTEST_ASSERT_GE(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) -#define GTEST_ASSERT_GT(val1, val2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) - -// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of -// ASSERT_XY(), which clashes with some users' own code. - -#if !GTEST_DONT_DEFINE_ASSERT_EQ -# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) -#endif - -#if !GTEST_DONT_DEFINE_ASSERT_NE -# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) -#endif - -#if !GTEST_DONT_DEFINE_ASSERT_LE -# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) -#endif - -#if !GTEST_DONT_DEFINE_ASSERT_LT -# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) -#endif - -#if !GTEST_DONT_DEFINE_ASSERT_GE -# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) -#endif - -#if !GTEST_DONT_DEFINE_ASSERT_GT -# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) -#endif - -// C-string Comparisons. All tests treat NULL and any non-NULL string -// as different. Two NULLs are equal. -// -// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 -// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 -// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case -// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case -// -// For wide or narrow string objects, you can use the -// {ASSERT|EXPECT}_??() macros. -// -// Don't depend on the order in which the arguments are evaluated, -// which is undefined. -// -// These macros evaluate their arguments exactly once. - -#define EXPECT_STREQ(s1, s2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) -#define EXPECT_STRNE(s1, s2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) -#define EXPECT_STRCASEEQ(s1, s2) \ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) -#define EXPECT_STRCASENE(s1, s2)\ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) - -#define ASSERT_STREQ(s1, s2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) -#define ASSERT_STRNE(s1, s2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) -#define ASSERT_STRCASEEQ(s1, s2) \ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) -#define ASSERT_STRCASENE(s1, s2)\ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) - -// Macros for comparing floating-point numbers. -// -// * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2): -// Tests that two float values are almost equal. -// * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2): -// Tests that two double values are almost equal. -// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): -// Tests that v1 and v2 are within the given distance to each other. -// -// Google Test uses ULP-based comparison to automatically pick a default -// error bound that is appropriate for the operands. See the -// FloatingPoint template class in gtest-internal.h if you are -// interested in the implementation details. - -#define EXPECT_FLOAT_EQ(val1, val2)\ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ - val1, val2) - -#define EXPECT_DOUBLE_EQ(val1, val2)\ - EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ - val1, val2) - -#define ASSERT_FLOAT_EQ(val1, val2)\ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ - val1, val2) - -#define ASSERT_DOUBLE_EQ(val1, val2)\ - ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ - val1, val2) - -#define EXPECT_NEAR(val1, val2, abs_error)\ - EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ - val1, val2, abs_error) - -#define ASSERT_NEAR(val1, val2, abs_error)\ - ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ - val1, val2, abs_error) - -// These predicate format functions work on floating-point values, and -// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. -// -// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); - -// Asserts that val1 is less than, or almost equal to, val2. Fails -// otherwise. In particular, it fails if either val1 or val2 is NaN. -GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, - float val1, float val2); -GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, - double val1, double val2); - - -#if GTEST_OS_WINDOWS - -// Macros that test for HRESULT failure and success, these are only useful -// on Windows, and rely on Windows SDK macros and APIs to compile. -// -// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) -// -// When expr unexpectedly fails or succeeds, Google Test prints the -// expected result and the actual result with both a human-readable -// string representation of the error, if available, as well as the -// hex result code. -# define EXPECT_HRESULT_SUCCEEDED(expr) \ - EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) - -# define ASSERT_HRESULT_SUCCEEDED(expr) \ - ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) - -# define EXPECT_HRESULT_FAILED(expr) \ - EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) - -# define ASSERT_HRESULT_FAILED(expr) \ - ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) - -#endif // GTEST_OS_WINDOWS - -// Macros that execute statement and check that it doesn't generate new fatal -// failures in the current thread. -// -// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); -// -// Examples: -// -// EXPECT_NO_FATAL_FAILURE(Process()); -// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; -// -#define ASSERT_NO_FATAL_FAILURE(statement) \ - GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) -#define EXPECT_NO_FATAL_FAILURE(statement) \ - GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) - -// Causes a trace (including the given source file path and line number, -// and the given message) to be included in every test failure message generated -// by code in the scope of the lifetime of an instance of this class. The effect -// is undone with the destruction of the instance. -// -// The message argument can be anything streamable to std::ostream. -// -// Example: -// testing::ScopedTrace trace("file.cc", 123, "message"); -// -class GTEST_API_ ScopedTrace { - public: - // The c'tor pushes the given source file location and message onto - // a trace stack maintained by Google Test. - - // Template version. Uses Message() to convert the values into strings. - // Slow, but flexible. - template - ScopedTrace(const char* file, int line, const T& message) { - PushTrace(file, line, (Message() << message).GetString()); - } - - // Optimize for some known types. - ScopedTrace(const char* file, int line, const char* message) { - PushTrace(file, line, message ? message : "(null)"); - } - - ScopedTrace(const char* file, int line, const std::string& message) { - PushTrace(file, line, message); - } - - // The d'tor pops the info pushed by the c'tor. - // - // Note that the d'tor is not virtual in order to be efficient. - // Don't inherit from ScopedTrace! - ~ScopedTrace(); - - private: - void PushTrace(const char* file, int line, std::string message); - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); -} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its - // c'tor and d'tor. Therefore it doesn't - // need to be used otherwise. - -// Causes a trace (including the source file path, the current line -// number, and the given message) to be included in every test failure -// message generated by code in the current scope. The effect is -// undone when the control leaves the current scope. -// -// The message argument can be anything streamable to std::ostream. -// -// In the implementation, we include the current line number as part -// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s -// to appear in the same block - as long as they are on different -// lines. -// -// Assuming that each thread maintains its own stack of traces. -// Therefore, a SCOPED_TRACE() would (correctly) only affect the -// assertions in its own thread. -#define SCOPED_TRACE(message) \ - ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ - __FILE__, __LINE__, (message)) - -// Compile-time assertion for type equality. -// StaticAssertTypeEq() compiles if and only if type1 and type2 -// are the same type. The value it returns is not interesting. -// -// Instead of making StaticAssertTypeEq a class template, we make it a -// function template that invokes a helper class template. This -// prevents a user from misusing StaticAssertTypeEq by -// defining objects of that type. -// -// CAVEAT: -// -// When used inside a method of a class template, -// StaticAssertTypeEq() is effective ONLY IF the method is -// instantiated. For example, given: -// -// template class Foo { -// public: -// void Bar() { testing::StaticAssertTypeEq(); } -// }; -// -// the code: -// -// void Test1() { Foo foo; } -// -// will NOT generate a compiler error, as Foo::Bar() is never -// actually instantiated. Instead, you need: -// -// void Test2() { Foo foo; foo.Bar(); } -// -// to cause a compiler error. -template -constexpr bool StaticAssertTypeEq() noexcept { - static_assert(std::is_same::value, "T1 and T2 are not the same type"); - return true; -} - -// Defines a test. -// -// The first parameter is the name of the test suite, and the second -// parameter is the name of the test within the test suite. -// -// The convention is to end the test suite name with "Test". For -// example, a test suite for the Foo class can be named FooTest. -// -// Test code should appear between braces after an invocation of -// this macro. Example: -// -// TEST(FooTest, InitializesCorrectly) { -// Foo foo; -// EXPECT_TRUE(foo.StatusIsOK()); -// } - -// Note that we call GetTestTypeId() instead of GetTypeId< -// ::testing::Test>() here to get the type ID of testing::Test. This -// is to work around a suspected linker bug when using Google Test as -// a framework on Mac OS X. The bug causes GetTypeId< -// ::testing::Test>() to return different values depending on whether -// the call is from the Google Test framework itself or from user test -// code. GetTestTypeId() is guaranteed to always return the same -// value, as it always calls GetTypeId<>() from the Google Test -// framework. -#define GTEST_TEST(test_suite_name, test_name) \ - GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \ - ::testing::internal::GetTestTypeId()) - -// Define this macro to 1 to omit the definition of TEST(), which -// is a generic name and clashes with some other libraries. -#if !GTEST_DONT_DEFINE_TEST -#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name) -#endif - -// Defines a test that uses a test fixture. -// -// The first parameter is the name of the test fixture class, which -// also doubles as the test suite name. The second parameter is the -// name of the test within the test suite. -// -// A test fixture class must be declared earlier. The user should put -// the test code between braces after using this macro. Example: -// -// class FooTest : public testing::Test { -// protected: -// void SetUp() override { b_.AddElement(3); } -// -// Foo a_; -// Foo b_; -// }; -// -// TEST_F(FooTest, InitializesCorrectly) { -// EXPECT_TRUE(a_.StatusIsOK()); -// } -// -// TEST_F(FooTest, ReturnsElementCountCorrectly) { -// EXPECT_EQ(a_.size(), 0); -// EXPECT_EQ(b_.size(), 1); -// } -// -// GOOGLETEST_CM0011 DO NOT DELETE -#define TEST_F(test_fixture, test_name)\ - GTEST_TEST_(test_fixture, test_name, test_fixture, \ - ::testing::internal::GetTypeId()) - -// Returns a path to temporary directory. -// Tries to determine an appropriate directory for the platform. -GTEST_API_ std::string TempDir(); - -#ifdef _MSC_VER -# pragma warning(pop) -#endif - -// Dynamically registers a test with the framework. -// -// This is an advanced API only to be used when the `TEST` macros are -// insufficient. The macros should be preferred when possible, as they avoid -// most of the complexity of calling this function. -// -// The `factory` argument is a factory callable (move-constructible) object or -// function pointer that creates a new instance of the Test object. It -// handles ownership to the caller. The signature of the callable is -// `Fixture*()`, where `Fixture` is the test fixture class for the test. All -// tests registered with the same `test_suite_name` must return the same -// fixture type. This is checked at runtime. -// -// The framework will infer the fixture class from the factory and will call -// the `SetUpTestSuite` and `TearDownTestSuite` for it. -// -// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is -// undefined. -// -// Use case example: -// -// class MyFixture : public ::testing::Test { -// public: -// // All of these optional, just like in regular macro usage. -// static void SetUpTestSuite() { ... } -// static void TearDownTestSuite() { ... } -// void SetUp() override { ... } -// void TearDown() override { ... } -// }; -// -// class MyTest : public MyFixture { -// public: -// explicit MyTest(int data) : data_(data) {} -// void TestBody() override { ... } -// -// private: -// int data_; -// }; -// -// void RegisterMyTests(const std::vector& values) { -// for (int v : values) { -// ::testing::RegisterTest( -// "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, -// std::to_string(v).c_str(), -// __FILE__, __LINE__, -// // Important to use the fixture type as the return type here. -// [=]() -> MyFixture* { return new MyTest(v); }); -// } -// } -// ... -// int main(int argc, char** argv) { -// std::vector values_to_test = LoadValuesFromConfig(); -// RegisterMyTests(values_to_test); -// ... -// return RUN_ALL_TESTS(); -// } -// -template -TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, - const char* type_param, const char* value_param, - const char* file, int line, Factory factory) { - using TestT = typename std::remove_pointer::type; - - class FactoryImpl : public internal::TestFactoryBase { - public: - explicit FactoryImpl(Factory f) : factory_(std::move(f)) {} - Test* CreateTest() override { return factory_(); } - - private: - Factory factory_; - }; - - return internal::MakeAndRegisterTestInfo( - test_suite_name, test_name, type_param, value_param, - internal::CodeLocation(file, line), internal::GetTypeId(), - internal::SuiteApiResolver::GetSetUpCaseOrSuite(file, line), - internal::SuiteApiResolver::GetTearDownCaseOrSuite(file, line), - new FactoryImpl{std::move(factory)}); -} - -} // namespace testing - -// Use this function in main() to run all tests. It returns 0 if all -// tests are successful, or 1 otherwise. -// -// RUN_ALL_TESTS() should be invoked after the command line has been -// parsed by InitGoogleTest(). -// -// This function was formerly a macro; thus, it is in the global -// namespace and has an all-caps name. -int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_; - -inline int RUN_ALL_TESTS() { - return ::testing::UnitTest::GetInstance()->Run(); -} - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GTEST_INCLUDE_GTEST_GTEST_H_ diff --git a/core/deps/gtest/gtest_pred_impl.h b/core/deps/gtest/gtest_pred_impl.h deleted file mode 100644 index 558753e6e..000000000 --- a/core/deps/gtest/gtest_pred_impl.h +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command -// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! -// -// Implements a family of generic predicate assertion macros. -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ - -#include "gtest.h" - -namespace testing { - -// This header implements a family of generic predicate assertion -// macros: -// -// ASSERT_PRED_FORMAT1(pred_format, v1) -// ASSERT_PRED_FORMAT2(pred_format, v1, v2) -// ... -// -// where pred_format is a function or functor that takes n (in the -// case of ASSERT_PRED_FORMATn) values and their source expression -// text, and returns a testing::AssertionResult. See the definition -// of ASSERT_EQ in gtest.h for an example. -// -// If you don't care about formatting, you can use the more -// restrictive version: -// -// ASSERT_PRED1(pred, v1) -// ASSERT_PRED2(pred, v1, v2) -// ... -// -// where pred is an n-ary function or functor that returns bool, -// and the values v1, v2, ..., must support the << operator for -// streaming to std::ostream. -// -// We also define the EXPECT_* variations. -// -// For now we only support predicates whose arity is at most 5. -// Please email googletestframework@googlegroups.com if you need -// support for higher arities. - -// GTEST_ASSERT_ is the basic statement to which all of the assertions -// in this file reduce. Don't use this in your code. - -#define GTEST_ASSERT_(expression, on_failure) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (const ::testing::AssertionResult gtest_ar = (expression)) \ - ; \ - else \ - on_failure(gtest_ar.failure_message()) - - -// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use -// this in your code. -template -AssertionResult AssertPred1Helper(const char* pred_text, - const char* e1, - Pred pred, - const T1& v1) { - if (pred(v1)) return AssertionSuccess(); - - return AssertionFailure() - << pred_text << "(" << e1 << ") evaluates to false, where" - << "\n" - << e1 << " evaluates to " << ::testing::PrintToString(v1); -} - -// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. -// Don't use this in your code. -#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ - GTEST_ASSERT_(pred_format(#v1, v1), \ - on_failure) - -// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use -// this in your code. -#define GTEST_PRED1_(pred, v1, on_failure)\ - GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ - #v1, \ - pred, \ - v1), on_failure) - -// Unary predicate assertion macros. -#define EXPECT_PRED_FORMAT1(pred_format, v1) \ - GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) -#define EXPECT_PRED1(pred, v1) \ - GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) -#define ASSERT_PRED_FORMAT1(pred_format, v1) \ - GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) -#define ASSERT_PRED1(pred, v1) \ - GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) - - - -// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use -// this in your code. -template -AssertionResult AssertPred2Helper(const char* pred_text, - const char* e1, - const char* e2, - Pred pred, - const T1& v1, - const T2& v2) { - if (pred(v1, v2)) return AssertionSuccess(); - - return AssertionFailure() - << pred_text << "(" << e1 << ", " << e2 - << ") evaluates to false, where" - << "\n" - << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" - << e2 << " evaluates to " << ::testing::PrintToString(v2); -} - -// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. -// Don't use this in your code. -#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ - GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ - on_failure) - -// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use -// this in your code. -#define GTEST_PRED2_(pred, v1, v2, on_failure)\ - GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ - #v1, \ - #v2, \ - pred, \ - v1, \ - v2), on_failure) - -// Binary predicate assertion macros. -#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ - GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) -#define EXPECT_PRED2(pred, v1, v2) \ - GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) -#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ - GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) -#define ASSERT_PRED2(pred, v1, v2) \ - GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) - - - -// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use -// this in your code. -template -AssertionResult AssertPred3Helper(const char* pred_text, - const char* e1, - const char* e2, - const char* e3, - Pred pred, - const T1& v1, - const T2& v2, - const T3& v3) { - if (pred(v1, v2, v3)) return AssertionSuccess(); - - return AssertionFailure() - << pred_text << "(" << e1 << ", " << e2 << ", " << e3 - << ") evaluates to false, where" - << "\n" - << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" - << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" - << e3 << " evaluates to " << ::testing::PrintToString(v3); -} - -// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. -// Don't use this in your code. -#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ - GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ - on_failure) - -// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use -// this in your code. -#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ - GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ - #v1, \ - #v2, \ - #v3, \ - pred, \ - v1, \ - v2, \ - v3), on_failure) - -// Ternary predicate assertion macros. -#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ - GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) -#define EXPECT_PRED3(pred, v1, v2, v3) \ - GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) -#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ - GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) -#define ASSERT_PRED3(pred, v1, v2, v3) \ - GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) - - - -// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use -// this in your code. -template -AssertionResult AssertPred4Helper(const char* pred_text, - const char* e1, - const char* e2, - const char* e3, - const char* e4, - Pred pred, - const T1& v1, - const T2& v2, - const T3& v3, - const T4& v4) { - if (pred(v1, v2, v3, v4)) return AssertionSuccess(); - - return AssertionFailure() - << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 - << ") evaluates to false, where" - << "\n" - << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" - << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" - << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" - << e4 << " evaluates to " << ::testing::PrintToString(v4); -} - -// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. -// Don't use this in your code. -#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ - GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ - on_failure) - -// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use -// this in your code. -#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ - GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ - #v1, \ - #v2, \ - #v3, \ - #v4, \ - pred, \ - v1, \ - v2, \ - v3, \ - v4), on_failure) - -// 4-ary predicate assertion macros. -#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ - GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) -#define EXPECT_PRED4(pred, v1, v2, v3, v4) \ - GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) -#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ - GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) -#define ASSERT_PRED4(pred, v1, v2, v3, v4) \ - GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) - - - -// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use -// this in your code. -template -AssertionResult AssertPred5Helper(const char* pred_text, - const char* e1, - const char* e2, - const char* e3, - const char* e4, - const char* e5, - Pred pred, - const T1& v1, - const T2& v2, - const T3& v3, - const T4& v4, - const T5& v5) { - if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); - - return AssertionFailure() - << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 - << ", " << e5 << ") evaluates to false, where" - << "\n" - << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" - << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" - << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" - << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n" - << e5 << " evaluates to " << ::testing::PrintToString(v5); -} - -// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. -// Don't use this in your code. -#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ - GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ - on_failure) - -// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use -// this in your code. -#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ - GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ - #v1, \ - #v2, \ - #v3, \ - #v4, \ - #v5, \ - pred, \ - v1, \ - v2, \ - v3, \ - v4, \ - v5), on_failure) - -// 5-ary predicate assertion macros. -#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ - GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) -#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ - GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) -#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ - GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) -#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ - GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) - - - -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ diff --git a/core/deps/gtest/gtest_prod.h b/core/deps/gtest/gtest_prod.h deleted file mode 100644 index e651671eb..000000000 --- a/core/deps/gtest/gtest_prod.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// Google C++ Testing and Mocking Framework definitions useful in production code. -// GOOGLETEST_CM0003 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ -#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ - -// When you need to test the private or protected members of a class, -// use the FRIEND_TEST macro to declare your tests as friends of the -// class. For example: -// -// class MyClass { -// private: -// void PrivateMethod(); -// FRIEND_TEST(MyClassTest, PrivateMethodWorks); -// }; -// -// class MyClassTest : public testing::Test { -// // ... -// }; -// -// TEST_F(MyClassTest, PrivateMethodWorks) { -// // Can call MyClass::PrivateMethod() here. -// } -// -// Note: The test class must be in the same namespace as the class being tested. -// For example, putting MyClassTest in an anonymous namespace will not work. - -#define FRIEND_TEST(test_case_name, test_name)\ -friend class test_case_name##_##test_name##_Test - -#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ diff --git a/core/deps/gtest/internal/custom/README.md b/core/deps/gtest/internal/custom/README.md deleted file mode 100644 index ff391fb4e..000000000 --- a/core/deps/gtest/internal/custom/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Customization Points - -The custom directory is an injection point for custom user configurations. - -## Header `gtest.h` - -### The following macros can be defined: - -* `GTEST_OS_STACK_TRACE_GETTER_` - The name of an implementation of - `OsStackTraceGetterInterface`. -* `GTEST_CUSTOM_TEMPDIR_FUNCTION_` - An override for `testing::TempDir()`. See - `testing::TempDir` for semantics and signature. - -## Header `gtest-port.h` - -The following macros can be defined: - -### Flag related macros: - -* `GTEST_FLAG(flag_name)` -* `GTEST_USE_OWN_FLAGFILE_FLAG_` - Define to 0 when the system provides its - own flagfile flag parsing. -* `GTEST_DECLARE_bool_(name)` -* `GTEST_DECLARE_int32_(name)` -* `GTEST_DECLARE_string_(name)` -* `GTEST_DEFINE_bool_(name, default_val, doc)` -* `GTEST_DEFINE_int32_(name, default_val, doc)` -* `GTEST_DEFINE_string_(name, default_val, doc)` - -### Logging: - -* `GTEST_LOG_(severity)` -* `GTEST_CHECK_(condition)` -* Functions `LogToStderr()` and `FlushInfoLog()` have to be provided too. - -### Threading: - -* `GTEST_HAS_NOTIFICATION_` - Enabled if Notification is already provided. -* `GTEST_HAS_MUTEX_AND_THREAD_LOCAL_` - Enabled if `Mutex` and `ThreadLocal` - are already provided. Must also provide `GTEST_DECLARE_STATIC_MUTEX_(mutex)` - and `GTEST_DEFINE_STATIC_MUTEX_(mutex)` -* `GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)` -* `GTEST_LOCK_EXCLUDED_(locks)` - -### Underlying library support features - -* `GTEST_HAS_CXXABI_H_` - -### Exporting API symbols: - -* `GTEST_API_` - Specifier for exported symbols. - -## Header `gtest-printers.h` - -* See documentation at `gtest/gtest-printers.h` for details on how to define a - custom printer. diff --git a/core/deps/gtest/internal/custom/gtest-port.h b/core/deps/gtest/internal/custom/gtest-port.h deleted file mode 100644 index cd85d956d..000000000 --- a/core/deps/gtest/internal/custom/gtest-port.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Injection point for custom user configurations. See README for details -// -// ** Custom implementation starts here ** - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ diff --git a/core/deps/gtest/internal/custom/gtest-printers.h b/core/deps/gtest/internal/custom/gtest-printers.h deleted file mode 100644 index eb4467abc..000000000 --- a/core/deps/gtest/internal/custom/gtest-printers.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// This file provides an injection point for custom printers in a local -// installation of gTest. -// It will be included from gtest-printers.h and the overrides in this file -// will be visible to everyone. -// -// Injection point for custom user configurations. See README for details -// -// ** Custom implementation starts here ** - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ diff --git a/core/deps/gtest/internal/custom/gtest.h b/core/deps/gtest/internal/custom/gtest.h deleted file mode 100644 index 4c8e07be2..000000000 --- a/core/deps/gtest/internal/custom/gtest.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Injection point for custom user configurations. See README for details -// -// ** Custom implementation starts here ** - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ diff --git a/core/deps/gtest/internal/gtest-death-test-internal.h b/core/deps/gtest/internal/gtest-death-test-internal.h deleted file mode 100644 index a3f4b8777..000000000 --- a/core/deps/gtest/internal/gtest-death-test-internal.h +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file defines internal utilities needed for implementing -// death tests. They are subject to change without notice. -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ - -#include -#include -#include "../gtest-matchers.h" -#include "gtest-internal.h" - -namespace testing { -namespace internal { - -GTEST_DECLARE_string_(internal_run_death_test); - -// Names of the flags (needed for parsing Google Test flags). -const char kDeathTestStyleFlag[] = "death_test_style"; -const char kDeathTestUseFork[] = "death_test_use_fork"; -const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; - -#if GTEST_HAS_DEATH_TEST - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -// DeathTest is a class that hides much of the complexity of the -// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method -// returns a concrete class that depends on the prevailing death test -// style, as defined by the --gtest_death_test_style and/or -// --gtest_internal_run_death_test flags. - -// In describing the results of death tests, these terms are used with -// the corresponding definitions: -// -// exit status: The integer exit information in the format specified -// by wait(2) -// exit code: The integer code passed to exit(3), _exit(2), or -// returned from main() -class GTEST_API_ DeathTest { - public: - // Create returns false if there was an error determining the - // appropriate action to take for the current death test; for example, - // if the gtest_death_test_style flag is set to an invalid value. - // The LastMessage method will return a more detailed message in that - // case. Otherwise, the DeathTest pointer pointed to by the "test" - // argument is set. If the death test should be skipped, the pointer - // is set to NULL; otherwise, it is set to the address of a new concrete - // DeathTest object that controls the execution of the current test. - static bool Create(const char* statement, Matcher matcher, - const char* file, int line, DeathTest** test); - DeathTest(); - virtual ~DeathTest() { } - - // A helper class that aborts a death test when it's deleted. - class ReturnSentinel { - public: - explicit ReturnSentinel(DeathTest* test) : test_(test) { } - ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } - private: - DeathTest* const test_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); - } GTEST_ATTRIBUTE_UNUSED_; - - // An enumeration of possible roles that may be taken when a death - // test is encountered. EXECUTE means that the death test logic should - // be executed immediately. OVERSEE means that the program should prepare - // the appropriate environment for a child process to execute the death - // test, then wait for it to complete. - enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; - - // An enumeration of the three reasons that a test might be aborted. - enum AbortReason { - TEST_ENCOUNTERED_RETURN_STATEMENT, - TEST_THREW_EXCEPTION, - TEST_DID_NOT_DIE - }; - - // Assumes one of the above roles. - virtual TestRole AssumeRole() = 0; - - // Waits for the death test to finish and returns its status. - virtual int Wait() = 0; - - // Returns true if the death test passed; that is, the test process - // exited during the test, its exit status matches a user-supplied - // predicate, and its stderr output matches a user-supplied regular - // expression. - // The user-supplied predicate may be a macro expression rather - // than a function pointer or functor, or else Wait and Passed could - // be combined. - virtual bool Passed(bool exit_status_ok) = 0; - - // Signals that the death test did not die as expected. - virtual void Abort(AbortReason reason) = 0; - - // Returns a human-readable outcome message regarding the outcome of - // the last death test. - static const char* LastMessage(); - - static void set_last_death_test_message(const std::string& message); - - private: - // A string containing a description of the outcome of the last death test. - static std::string last_death_test_message_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); -}; - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -// Factory interface for death tests. May be mocked out for testing. -class DeathTestFactory { - public: - virtual ~DeathTestFactory() { } - virtual bool Create(const char* statement, - Matcher matcher, const char* file, - int line, DeathTest** test) = 0; -}; - -// A concrete DeathTestFactory implementation for normal use. -class DefaultDeathTestFactory : public DeathTestFactory { - public: - bool Create(const char* statement, Matcher matcher, - const char* file, int line, DeathTest** test) override; -}; - -// Returns true if exit_status describes a process that was terminated -// by a signal, or exited normally with a nonzero exit code. -GTEST_API_ bool ExitedUnsuccessfully(int exit_status); - -// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads -// and interpreted as a regex (rather than an Eq matcher) for legacy -// compatibility. -inline Matcher MakeDeathTestMatcher( - ::testing::internal::RE regex) { - return ContainsRegex(regex.pattern()); -} -inline Matcher MakeDeathTestMatcher(const char* regex) { - return ContainsRegex(regex); -} -inline Matcher MakeDeathTestMatcher( - const ::std::string& regex) { - return ContainsRegex(regex); -} - -// If a Matcher is passed to EXPECT_DEATH (etc.), it's -// used directly. -inline Matcher MakeDeathTestMatcher( - Matcher matcher) { - return matcher; -} - -// Traps C++ exceptions escaping statement and reports them as test -// failures. Note that trapping SEH exceptions is not implemented here. -# if GTEST_HAS_EXCEPTIONS -# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } catch (const ::std::exception& gtest_exception) { \ - fprintf(\ - stderr, \ - "\n%s: Caught std::exception-derived exception escaping the " \ - "death test statement. Exception message: %s\n", \ - ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ - gtest_exception.what()); \ - fflush(stderr); \ - death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ - } catch (...) { \ - death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ - } - -# else -# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) - -# endif - -// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, -// ASSERT_EXIT*, and EXPECT_EXIT*. -#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - ::testing::internal::DeathTest* gtest_dt; \ - if (!::testing::internal::DeathTest::Create( \ - #statement, \ - ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \ - __FILE__, __LINE__, >est_dt)) { \ - goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ - } \ - if (gtest_dt != nullptr) { \ - std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \ - switch (gtest_dt->AssumeRole()) { \ - case ::testing::internal::DeathTest::OVERSEE_TEST: \ - if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ - goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ - } \ - break; \ - case ::testing::internal::DeathTest::EXECUTE_TEST: { \ - ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \ - gtest_dt); \ - GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ - gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ - break; \ - } \ - default: \ - break; \ - } \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \ - : fail(::testing::internal::DeathTest::LastMessage()) -// The symbol "fail" here expands to something into which a message -// can be streamed. - -// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in -// NDEBUG mode. In this case we need the statements to be executed and the macro -// must accept a streamed message even though the message is never printed. -// The regex object is not evaluated, but it is used to prevent "unused" -// warnings and to avoid an expression that doesn't compile in debug mode. -#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } else if (!::testing::internal::AlwaysTrue()) { \ - ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ - } else \ - ::testing::Message() - -// A class representing the parsed contents of the -// --gtest_internal_run_death_test flag, as it existed when -// RUN_ALL_TESTS was called. -class InternalRunDeathTestFlag { - public: - InternalRunDeathTestFlag(const std::string& a_file, - int a_line, - int an_index, - int a_write_fd) - : file_(a_file), line_(a_line), index_(an_index), - write_fd_(a_write_fd) {} - - ~InternalRunDeathTestFlag() { - if (write_fd_ >= 0) - posix::Close(write_fd_); - } - - const std::string& file() const { return file_; } - int line() const { return line_; } - int index() const { return index_; } - int write_fd() const { return write_fd_; } - - private: - std::string file_; - int line_; - int index_; - int write_fd_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); -}; - -// Returns a newly created InternalRunDeathTestFlag object with fields -// initialized from the GTEST_FLAG(internal_run_death_test) flag if -// the flag is specified; otherwise returns NULL. -InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); - -#endif // GTEST_HAS_DEATH_TEST - -} // namespace internal -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ diff --git a/core/deps/gtest/internal/gtest-filepath.h b/core/deps/gtest/internal/gtest-filepath.h deleted file mode 100644 index 3019dad33..000000000 --- a/core/deps/gtest/internal/gtest-filepath.h +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Google Test filepath utilities -// -// This header file declares classes and functions used internally by -// Google Test. They are subject to change without notice. -// -// This file is #included in gtest/internal/gtest-internal.h. -// Do not include this header file separately! - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ - -#include "gtest-string.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { -namespace internal { - -// FilePath - a class for file and directory pathname manipulation which -// handles platform-specific conventions (like the pathname separator). -// Used for helper functions for naming files in a directory for xml output. -// Except for Set methods, all methods are const or static, which provides an -// "immutable value object" -- useful for peace of mind. -// A FilePath with a value ending in a path separator ("like/this/") represents -// a directory, otherwise it is assumed to represent a file. In either case, -// it may or may not represent an actual file or directory in the file system. -// Names are NOT checked for syntax correctness -- no checking for illegal -// characters, malformed paths, etc. - -class GTEST_API_ FilePath { - public: - FilePath() : pathname_("") { } - FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } - - explicit FilePath(const std::string& pathname) : pathname_(pathname) { - Normalize(); - } - - FilePath& operator=(const FilePath& rhs) { - Set(rhs); - return *this; - } - - void Set(const FilePath& rhs) { - pathname_ = rhs.pathname_; - } - - const std::string& string() const { return pathname_; } - const char* c_str() const { return pathname_.c_str(); } - - // Returns the current working directory, or "" if unsuccessful. - static FilePath GetCurrentDir(); - - // Given directory = "dir", base_name = "test", number = 0, - // extension = "xml", returns "dir/test.xml". If number is greater - // than zero (e.g., 12), returns "dir/test_12.xml". - // On Windows platform, uses \ as the separator rather than /. - static FilePath MakeFileName(const FilePath& directory, - const FilePath& base_name, - int number, - const char* extension); - - // Given directory = "dir", relative_path = "test.xml", - // returns "dir/test.xml". - // On Windows, uses \ as the separator rather than /. - static FilePath ConcatPaths(const FilePath& directory, - const FilePath& relative_path); - - // Returns a pathname for a file that does not currently exist. The pathname - // will be directory/base_name.extension or - // directory/base_name_.extension if directory/base_name.extension - // already exists. The number will be incremented until a pathname is found - // that does not already exist. - // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. - // There could be a race condition if two or more processes are calling this - // function at the same time -- they could both pick the same filename. - static FilePath GenerateUniqueFileName(const FilePath& directory, - const FilePath& base_name, - const char* extension); - - // Returns true if and only if the path is "". - bool IsEmpty() const { return pathname_.empty(); } - - // If input name has a trailing separator character, removes it and returns - // the name, otherwise return the name string unmodified. - // On Windows platform, uses \ as the separator, other platforms use /. - FilePath RemoveTrailingPathSeparator() const; - - // Returns a copy of the FilePath with the directory part removed. - // Example: FilePath("path/to/file").RemoveDirectoryName() returns - // FilePath("file"). If there is no directory part ("just_a_file"), it returns - // the FilePath unmodified. If there is no file part ("just_a_dir/") it - // returns an empty FilePath (""). - // On Windows platform, '\' is the path separator, otherwise it is '/'. - FilePath RemoveDirectoryName() const; - - // RemoveFileName returns the directory path with the filename removed. - // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". - // If the FilePath is "a_file" or "/a_file", RemoveFileName returns - // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does - // not have a file, like "just/a/dir/", it returns the FilePath unmodified. - // On Windows platform, '\' is the path separator, otherwise it is '/'. - FilePath RemoveFileName() const; - - // Returns a copy of the FilePath with the case-insensitive extension removed. - // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns - // FilePath("dir/file"). If a case-insensitive extension is not - // found, returns a copy of the original FilePath. - FilePath RemoveExtension(const char* extension) const; - - // Creates directories so that path exists. Returns true if successful or if - // the directories already exist; returns false if unable to create - // directories for any reason. Will also return false if the FilePath does - // not represent a directory (that is, it doesn't end with a path separator). - bool CreateDirectoriesRecursively() const; - - // Create the directory so that path exists. Returns true if successful or - // if the directory already exists; returns false if unable to create the - // directory for any reason, including if the parent directory does not - // exist. Not named "CreateDirectory" because that's a macro on Windows. - bool CreateFolder() const; - - // Returns true if FilePath describes something in the file-system, - // either a file, directory, or whatever, and that something exists. - bool FileOrDirectoryExists() const; - - // Returns true if pathname describes a directory in the file-system - // that exists. - bool DirectoryExists() const; - - // Returns true if FilePath ends with a path separator, which indicates that - // it is intended to represent a directory. Returns false otherwise. - // This does NOT check that a directory (or file) actually exists. - bool IsDirectory() const; - - // Returns true if pathname describes a root directory. (Windows has one - // root directory per disk drive.) - bool IsRootDirectory() const; - - // Returns true if pathname describes an absolute path. - bool IsAbsolutePath() const; - - private: - // Replaces multiple consecutive separators with a single separator. - // For example, "bar///foo" becomes "bar/foo". Does not eliminate other - // redundancies that might be in a pathname involving "." or "..". - // - // A pathname with multiple consecutive separators may occur either through - // user error or as a result of some scripts or APIs that generate a pathname - // with a trailing separator. On other platforms the same API or script - // may NOT generate a pathname with a trailing "/". Then elsewhere that - // pathname may have another "/" and pathname components added to it, - // without checking for the separator already being there. - // The script language and operating system may allow paths like "foo//bar" - // but some of the functions in FilePath will not handle that correctly. In - // particular, RemoveTrailingPathSeparator() only removes one separator, and - // it is called in CreateDirectoriesRecursively() assuming that it will change - // a pathname from directory syntax (trailing separator) to filename syntax. - // - // On Windows this method also replaces the alternate path separator '/' with - // the primary path separator '\\', so that for example "bar\\/\\foo" becomes - // "bar\\foo". - - void Normalize(); - - // Returns a pointer to the last occurence of a valid path separator in - // the FilePath. On Windows, for example, both '/' and '\' are valid path - // separators. Returns NULL if no path separator was found. - const char* FindLastPathSeparator() const; - - std::string pathname_; -}; // class FilePath - -} // namespace internal -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ diff --git a/core/deps/gtest/internal/gtest-internal.h b/core/deps/gtest/internal/gtest-internal.h deleted file mode 100644 index 76f7bacab..000000000 --- a/core/deps/gtest/internal/gtest-internal.h +++ /dev/null @@ -1,1381 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file declares functions and macros used internally by -// Google Test. They are subject to change without notice. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ - -#include "gtest-port.h" - -#if GTEST_OS_LINUX -# include -# include -# include -# include -#endif // GTEST_OS_LINUX - -#if GTEST_HAS_EXCEPTIONS -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../gtest-message.h" -#include "gtest-filepath.h" -#include "gtest-string.h" -#include "gtest-type-util.h" - -// Due to C++ preprocessor weirdness, we need double indirection to -// concatenate two tokens when one of them is __LINE__. Writing -// -// foo ## __LINE__ -// -// will result in the token foo__LINE__, instead of foo followed by -// the current line number. For more details, see -// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 -#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) -#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar - -// Stringifies its argument. -#define GTEST_STRINGIFY_(name) #name - -namespace proto2 { class Message; } - -namespace testing { - -// Forward declarations. - -class AssertionResult; // Result of an assertion. -class Message; // Represents a failure message. -class Test; // Represents a test. -class TestInfo; // Information about a test. -class TestPartResult; // Result of a test part. -class UnitTest; // A collection of test suites. - -template -::std::string PrintToString(const T& value); - -namespace internal { - -struct TraceInfo; // Information about a trace point. -class TestInfoImpl; // Opaque implementation of TestInfo -class UnitTestImpl; // Opaque implementation of UnitTest - -// The text used in failure messages to indicate the start of the -// stack trace. -GTEST_API_ extern const char kStackTraceMarker[]; - -// An IgnoredValue object can be implicitly constructed from ANY value. -class IgnoredValue { - struct Sink {}; - public: - // This constructor template allows any value to be implicitly - // converted to IgnoredValue. The object has no data member and - // doesn't try to remember anything about the argument. We - // deliberately omit the 'explicit' keyword in order to allow the - // conversion to be implicit. - // Disable the conversion if T already has a magical conversion operator. - // Otherwise we get ambiguity. - template ::value, - int>::type = 0> - IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit) -}; - -// Appends the user-supplied message to the Google-Test-generated message. -GTEST_API_ std::string AppendUserMessage( - const std::string& gtest_msg, const Message& user_msg); - -#if GTEST_HAS_EXCEPTIONS - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \ -/* an exported class was derived from a class that was not exported */) - -// This exception is thrown by (and only by) a failed Google Test -// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions -// are enabled). We derive it from std::runtime_error, which is for -// errors presumably detectable only at run time. Since -// std::runtime_error inherits from std::exception, many testing -// frameworks know how to extract and print the message inside it. -class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { - public: - explicit GoogleTestFailureException(const TestPartResult& failure); -}; - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4275 - -#endif // GTEST_HAS_EXCEPTIONS - -namespace edit_distance { -// Returns the optimal edits to go from 'left' to 'right'. -// All edits cost the same, with replace having lower priority than -// add/remove. -// Simple implementation of the Wagner-Fischer algorithm. -// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm -enum EditType { kMatch, kAdd, kRemove, kReplace }; -GTEST_API_ std::vector CalculateOptimalEdits( - const std::vector& left, const std::vector& right); - -// Same as above, but the input is represented as strings. -GTEST_API_ std::vector CalculateOptimalEdits( - const std::vector& left, - const std::vector& right); - -// Create a diff of the input strings in Unified diff format. -GTEST_API_ std::string CreateUnifiedDiff(const std::vector& left, - const std::vector& right, - size_t context = 2); - -} // namespace edit_distance - -// Calculate the diff between 'left' and 'right' and return it in unified diff -// format. -// If not null, stores in 'total_line_count' the total number of lines found -// in left + right. -GTEST_API_ std::string DiffStrings(const std::string& left, - const std::string& right, - size_t* total_line_count); - -// Constructs and returns the message for an equality assertion -// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. -// -// The first four parameters are the expressions used in the assertion -// and their values, as strings. For example, for ASSERT_EQ(foo, bar) -// where foo is 5 and bar is 6, we have: -// -// expected_expression: "foo" -// actual_expression: "bar" -// expected_value: "5" -// actual_value: "6" -// -// The ignoring_case parameter is true if and only if the assertion is a -// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will -// be inserted into the message. -GTEST_API_ AssertionResult EqFailure(const char* expected_expression, - const char* actual_expression, - const std::string& expected_value, - const std::string& actual_value, - bool ignoring_case); - -// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. -GTEST_API_ std::string GetBoolAssertionFailureMessage( - const AssertionResult& assertion_result, - const char* expression_text, - const char* actual_predicate_value, - const char* expected_predicate_value); - -// This template class represents an IEEE floating-point number -// (either single-precision or double-precision, depending on the -// template parameters). -// -// The purpose of this class is to do more sophisticated number -// comparison. (Due to round-off error, etc, it's very unlikely that -// two floating-points will be equal exactly. Hence a naive -// comparison by the == operation often doesn't work.) -// -// Format of IEEE floating-point: -// -// The most-significant bit being the leftmost, an IEEE -// floating-point looks like -// -// sign_bit exponent_bits fraction_bits -// -// Here, sign_bit is a single bit that designates the sign of the -// number. -// -// For float, there are 8 exponent bits and 23 fraction bits. -// -// For double, there are 11 exponent bits and 52 fraction bits. -// -// More details can be found at -// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. -// -// Template parameter: -// -// RawType: the raw floating-point type (either float or double) -template -class FloatingPoint { - public: - // Defines the unsigned integer type that has the same size as the - // floating point number. - typedef typename TypeWithSize::UInt Bits; - - // Constants. - - // # of bits in a number. - static const size_t kBitCount = 8*sizeof(RawType); - - // # of fraction bits in a number. - static const size_t kFractionBitCount = - std::numeric_limits::digits - 1; - - // # of exponent bits in a number. - static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; - - // The mask for the sign bit. - static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); - - // The mask for the fraction bits. - static const Bits kFractionBitMask = - ~static_cast(0) >> (kExponentBitCount + 1); - - // The mask for the exponent bits. - static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); - - // How many ULP's (Units in the Last Place) we want to tolerate when - // comparing two numbers. The larger the value, the more error we - // allow. A 0 value means that two numbers must be exactly the same - // to be considered equal. - // - // The maximum error of a single floating-point operation is 0.5 - // units in the last place. On Intel CPU's, all floating-point - // calculations are done with 80-bit precision, while double has 64 - // bits. Therefore, 4 should be enough for ordinary use. - // - // See the following article for more details on ULP: - // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ - static const size_t kMaxUlps = 4; - - // Constructs a FloatingPoint from a raw floating-point number. - // - // On an Intel CPU, passing a non-normalized NAN (Not a Number) - // around may change its bits, although the new value is guaranteed - // to be also a NAN. Therefore, don't expect this constructor to - // preserve the bits in x when x is a NAN. - explicit FloatingPoint(const RawType& x) { u_.value_ = x; } - - // Static methods - - // Reinterprets a bit pattern as a floating-point number. - // - // This function is needed to test the AlmostEquals() method. - static RawType ReinterpretBits(const Bits bits) { - FloatingPoint fp(0); - fp.u_.bits_ = bits; - return fp.u_.value_; - } - - // Returns the floating-point number that represent positive infinity. - static RawType Infinity() { - return ReinterpretBits(kExponentBitMask); - } - - // Returns the maximum representable finite floating-point number. - static RawType Max(); - - // Non-static methods - - // Returns the bits that represents this number. - const Bits &bits() const { return u_.bits_; } - - // Returns the exponent bits of this number. - Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } - - // Returns the fraction bits of this number. - Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } - - // Returns the sign bit of this number. - Bits sign_bit() const { return kSignBitMask & u_.bits_; } - - // Returns true if and only if this is NAN (not a number). - bool is_nan() const { - // It's a NAN if the exponent bits are all ones and the fraction - // bits are not entirely zeros. - return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); - } - - // Returns true if and only if this number is at most kMaxUlps ULP's away - // from rhs. In particular, this function: - // - // - returns false if either number is (or both are) NAN. - // - treats really large numbers as almost equal to infinity. - // - thinks +0.0 and -0.0 are 0 DLP's apart. - bool AlmostEquals(const FloatingPoint& rhs) const { - // The IEEE standard says that any comparison operation involving - // a NAN must return false. - if (is_nan() || rhs.is_nan()) return false; - - return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) - <= kMaxUlps; - } - - private: - // The data type used to store the actual floating-point number. - union FloatingPointUnion { - RawType value_; // The raw floating-point number. - Bits bits_; // The bits that represent the number. - }; - - // Converts an integer from the sign-and-magnitude representation to - // the biased representation. More precisely, let N be 2 to the - // power of (kBitCount - 1), an integer x is represented by the - // unsigned number x + N. - // - // For instance, - // - // -N + 1 (the most negative number representable using - // sign-and-magnitude) is represented by 1; - // 0 is represented by N; and - // N - 1 (the biggest number representable using - // sign-and-magnitude) is represented by 2N - 1. - // - // Read http://en.wikipedia.org/wiki/Signed_number_representations - // for more details on signed number representations. - static Bits SignAndMagnitudeToBiased(const Bits &sam) { - if (kSignBitMask & sam) { - // sam represents a negative number. - return ~sam + 1; - } else { - // sam represents a positive number. - return kSignBitMask | sam; - } - } - - // Given two numbers in the sign-and-magnitude representation, - // returns the distance between them as an unsigned number. - static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, - const Bits &sam2) { - const Bits biased1 = SignAndMagnitudeToBiased(sam1); - const Bits biased2 = SignAndMagnitudeToBiased(sam2); - return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); - } - - FloatingPointUnion u_; -}; - -// We cannot use std::numeric_limits::max() as it clashes with the max() -// macro defined by . -template <> -inline float FloatingPoint::Max() { return FLT_MAX; } -template <> -inline double FloatingPoint::Max() { return DBL_MAX; } - -// Typedefs the instances of the FloatingPoint template class that we -// care to use. -typedef FloatingPoint Float; -typedef FloatingPoint Double; - -// In order to catch the mistake of putting tests that use different -// test fixture classes in the same test suite, we need to assign -// unique IDs to fixture classes and compare them. The TypeId type is -// used to hold such IDs. The user should treat TypeId as an opaque -// type: the only operation allowed on TypeId values is to compare -// them for equality using the == operator. -typedef const void* TypeId; - -template -class TypeIdHelper { - public: - // dummy_ must not have a const type. Otherwise an overly eager - // compiler (e.g. MSVC 7.1 & 8.0) may try to merge - // TypeIdHelper::dummy_ for different Ts as an "optimization". - static bool dummy_; -}; - -template -bool TypeIdHelper::dummy_ = false; - -// GetTypeId() returns the ID of type T. Different values will be -// returned for different types. Calling the function twice with the -// same type argument is guaranteed to return the same ID. -template -TypeId GetTypeId() { - // The compiler is required to allocate a different - // TypeIdHelper::dummy_ variable for each T used to instantiate - // the template. Therefore, the address of dummy_ is guaranteed to - // be unique. - return &(TypeIdHelper::dummy_); -} - -// Returns the type ID of ::testing::Test. Always call this instead -// of GetTypeId< ::testing::Test>() to get the type ID of -// ::testing::Test, as the latter may give the wrong result due to a -// suspected linker bug when compiling Google Test as a Mac OS X -// framework. -GTEST_API_ TypeId GetTestTypeId(); - -// Defines the abstract factory interface that creates instances -// of a Test object. -class TestFactoryBase { - public: - virtual ~TestFactoryBase() {} - - // Creates a test instance to run. The instance is both created and destroyed - // within TestInfoImpl::Run() - virtual Test* CreateTest() = 0; - - protected: - TestFactoryBase() {} - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); -}; - -// This class provides implementation of TeastFactoryBase interface. -// It is used in TEST and TEST_F macros. -template -class TestFactoryImpl : public TestFactoryBase { - public: - Test* CreateTest() override { return new TestClass; } -}; - -#if GTEST_OS_WINDOWS - -// Predicate-formatters for implementing the HRESULT checking macros -// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} -// We pass a long instead of HRESULT to avoid causing an -// include dependency for the HRESULT type. -GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, - long hr); // NOLINT -GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, - long hr); // NOLINT - -#endif // GTEST_OS_WINDOWS - -// Types of SetUpTestSuite() and TearDownTestSuite() functions. -using SetUpTestSuiteFunc = void (*)(); -using TearDownTestSuiteFunc = void (*)(); - -struct CodeLocation { - CodeLocation(const std::string& a_file, int a_line) - : file(a_file), line(a_line) {} - - std::string file; - int line; -}; - -// Helper to identify which setup function for TestCase / TestSuite to call. -// Only one function is allowed, either TestCase or TestSute but not both. - -// Utility functions to help SuiteApiResolver -using SetUpTearDownSuiteFuncType = void (*)(); - -inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull( - SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) { - return a == def ? nullptr : a; -} - -template -// Note that SuiteApiResolver inherits from T because -// SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way -// SuiteApiResolver can access them. -struct SuiteApiResolver : T { - // testing::Test is only forward declared at this point. So we make it a - // dependend class for the compiler to be OK with it. - using Test = - typename std::conditional::type; - - static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename, - int line_num) { - SetUpTearDownSuiteFuncType test_case_fp = - GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase); - SetUpTearDownSuiteFuncType test_suite_fp = - GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite); - - GTEST_CHECK_(!test_case_fp || !test_suite_fp) - << "Test can not provide both SetUpTestSuite and SetUpTestCase, please " - "make sure there is only one present at " - << filename << ":" << line_num; - - return test_case_fp != nullptr ? test_case_fp : test_suite_fp; - } - - static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename, - int line_num) { - SetUpTearDownSuiteFuncType test_case_fp = - GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase); - SetUpTearDownSuiteFuncType test_suite_fp = - GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite); - - GTEST_CHECK_(!test_case_fp || !test_suite_fp) - << "Test can not provide both TearDownTestSuite and TearDownTestCase," - " please make sure there is only one present at" - << filename << ":" << line_num; - - return test_case_fp != nullptr ? test_case_fp : test_suite_fp; - } -}; - -// Creates a new TestInfo object and registers it with Google Test; -// returns the created object. -// -// Arguments: -// -// test_suite_name: name of the test suite -// name: name of the test -// type_param the name of the test's type parameter, or NULL if -// this is not a typed or a type-parameterized test. -// value_param text representation of the test's value parameter, -// or NULL if this is not a type-parameterized test. -// code_location: code location where the test is defined -// fixture_class_id: ID of the test fixture class -// set_up_tc: pointer to the function that sets up the test suite -// tear_down_tc: pointer to the function that tears down the test suite -// factory: pointer to the factory that creates a test object. -// The newly created TestInfo instance will assume -// ownership of the factory object. -GTEST_API_ TestInfo* MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, - const char* value_param, CodeLocation code_location, - TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, - TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory); - -// If *pstr starts with the given prefix, modifies *pstr to be right -// past the prefix and returns true; otherwise leaves *pstr unchanged -// and returns false. None of pstr, *pstr, and prefix can be NULL. -GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); - -#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -// State of the definition of a type-parameterized test suite. -class GTEST_API_ TypedTestSuitePState { - public: - TypedTestSuitePState() : registered_(false) {} - - // Adds the given test name to defined_test_names_ and return true - // if the test suite hasn't been registered; otherwise aborts the - // program. - bool AddTestName(const char* file, int line, const char* case_name, - const char* test_name) { - if (registered_) { - fprintf(stderr, - "%s Test %s must be defined before " - "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n", - FormatFileLocation(file, line).c_str(), test_name, case_name); - fflush(stderr); - posix::Abort(); - } - registered_tests_.insert( - ::std::make_pair(test_name, CodeLocation(file, line))); - return true; - } - - bool TestExists(const std::string& test_name) const { - return registered_tests_.count(test_name) > 0; - } - - const CodeLocation& GetCodeLocation(const std::string& test_name) const { - RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name); - GTEST_CHECK_(it != registered_tests_.end()); - return it->second; - } - - // Verifies that registered_tests match the test names in - // defined_test_names_; returns registered_tests if successful, or - // aborts the program otherwise. - const char* VerifyRegisteredTestNames( - const char* file, int line, const char* registered_tests); - - private: - typedef ::std::map RegisteredTestsMap; - - bool registered_; - RegisteredTestsMap registered_tests_; -}; - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -using TypedTestCasePState = TypedTestSuitePState; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -// Skips to the first non-space char after the first comma in 'str'; -// returns NULL if no comma is found in 'str'. -inline const char* SkipComma(const char* str) { - const char* comma = strchr(str, ','); - if (comma == nullptr) { - return nullptr; - } - while (IsSpace(*(++comma))) {} - return comma; -} - -// Returns the prefix of 'str' before the first comma in it; returns -// the entire string if it contains no comma. -inline std::string GetPrefixUntilComma(const char* str) { - const char* comma = strchr(str, ','); - return comma == nullptr ? str : std::string(str, comma); -} - -// Splits a given string on a given delimiter, populating a given -// vector with the fields. -void SplitString(const ::std::string& str, char delimiter, - ::std::vector< ::std::string>* dest); - -// The default argument to the template below for the case when the user does -// not provide a name generator. -struct DefaultNameGenerator { - template - static std::string GetName(int i) { - return StreamableToString(i); - } -}; - -template -struct NameGeneratorSelector { - typedef Provided type; -}; - -template -void GenerateNamesRecursively(internal::None, std::vector*, int) {} - -template -void GenerateNamesRecursively(Types, std::vector* result, int i) { - result->push_back(NameGenerator::template GetName(i)); - GenerateNamesRecursively(typename Types::Tail(), result, - i + 1); -} - -template -std::vector GenerateNames() { - std::vector result; - GenerateNamesRecursively(Types(), &result, 0); - return result; -} - -// TypeParameterizedTest::Register() -// registers a list of type-parameterized tests with Google Test. The -// return value is insignificant - we just need to return something -// such that we can call this function in a namespace scope. -// -// Implementation note: The GTEST_TEMPLATE_ macro declares a template -// template parameter. It's defined in gtest-type-util.h. -template -class TypeParameterizedTest { - public: - // 'index' is the index of the test in the type list 'Types' - // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite, - // Types). Valid values for 'index' are [0, N - 1] where N is the - // length of Types. - static bool Register(const char* prefix, const CodeLocation& code_location, - const char* case_name, const char* test_names, int index, - const std::vector& type_names = - GenerateNames()) { - typedef typename Types::Head Type; - typedef Fixture FixtureClass; - typedef typename GTEST_BIND_(TestSel, Type) TestClass; - - // First, registers the first type-parameterized test in the type - // list. - MakeAndRegisterTestInfo( - (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + - "/" + type_names[static_cast(index)]) - .c_str(), - StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), - GetTypeName().c_str(), - nullptr, // No value parameter. - code_location, GetTypeId(), - SuiteApiResolver::GetSetUpCaseOrSuite( - code_location.file.c_str(), code_location.line), - SuiteApiResolver::GetTearDownCaseOrSuite( - code_location.file.c_str(), code_location.line), - new TestFactoryImpl); - - // Next, recurses (at compile time) with the tail of the type list. - return TypeParameterizedTest::Register(prefix, - code_location, - case_name, - test_names, - index + 1, - type_names); - } -}; - -// The base case for the compile time recursion. -template -class TypeParameterizedTest { - public: - static bool Register(const char* /*prefix*/, const CodeLocation&, - const char* /*case_name*/, const char* /*test_names*/, - int /*index*/, - const std::vector& = - std::vector() /*type_names*/) { - return true; - } -}; - -// TypeParameterizedTestSuite::Register() -// registers *all combinations* of 'Tests' and 'Types' with Google -// Test. The return value is insignificant - we just need to return -// something such that we can call this function in a namespace scope. -template -class TypeParameterizedTestSuite { - public: - static bool Register(const char* prefix, CodeLocation code_location, - const TypedTestSuitePState* state, const char* case_name, - const char* test_names, - const std::vector& type_names = - GenerateNames()) { - std::string test_name = StripTrailingSpaces( - GetPrefixUntilComma(test_names)); - if (!state->TestExists(test_name)) { - fprintf(stderr, "Failed to get code location for test %s.%s at %s.", - case_name, test_name.c_str(), - FormatFileLocation(code_location.file.c_str(), - code_location.line).c_str()); - fflush(stderr); - posix::Abort(); - } - const CodeLocation& test_location = state->GetCodeLocation(test_name); - - typedef typename Tests::Head Head; - - // First, register the first test in 'Test' for each type in 'Types'. - TypeParameterizedTest::Register( - prefix, test_location, case_name, test_names, 0, type_names); - - // Next, recurses (at compile time) with the tail of the test list. - return TypeParameterizedTestSuite::Register(prefix, code_location, - state, case_name, - SkipComma(test_names), - type_names); - } -}; - -// The base case for the compile time recursion. -template -class TypeParameterizedTestSuite { - public: - static bool Register(const char* /*prefix*/, const CodeLocation&, - const TypedTestSuitePState* /*state*/, - const char* /*case_name*/, const char* /*test_names*/, - const std::vector& = - std::vector() /*type_names*/) { - return true; - } -}; - -#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - -// Returns the current OS stack trace as an std::string. -// -// The maximum number of stack frames to be included is specified by -// the gtest_stack_trace_depth flag. The skip_count parameter -// specifies the number of top frames to be skipped, which doesn't -// count against the number of frames to be included. -// -// For example, if Foo() calls Bar(), which in turn calls -// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in -// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. -GTEST_API_ std::string GetCurrentOsStackTraceExceptTop( - UnitTest* unit_test, int skip_count); - -// Helpers for suppressing warnings on unreachable code or constant -// condition. - -// Always returns true. -GTEST_API_ bool AlwaysTrue(); - -// Always returns false. -inline bool AlwaysFalse() { return !AlwaysTrue(); } - -// Helper for suppressing false warning from Clang on a const char* -// variable declared in a conditional expression always being NULL in -// the else branch. -struct GTEST_API_ ConstCharPtr { - ConstCharPtr(const char* str) : value(str) {} - operator bool() const { return true; } - const char* value; -}; - -// A simple Linear Congruential Generator for generating random -// numbers with a uniform distribution. Unlike rand() and srand(), it -// doesn't use global state (and therefore can't interfere with user -// code). Unlike rand_r(), it's portable. An LCG isn't very random, -// but it's good enough for our purposes. -class GTEST_API_ Random { - public: - static const UInt32 kMaxRange = 1u << 31; - - explicit Random(UInt32 seed) : state_(seed) {} - - void Reseed(UInt32 seed) { state_ = seed; } - - // Generates a random number from [0, range). Crashes if 'range' is - // 0 or greater than kMaxRange. - UInt32 Generate(UInt32 range); - - private: - UInt32 state_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); -}; - -// Turns const U&, U&, const U, and U all into U. -#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ - typename std::remove_const::type>::type - -// IsAProtocolMessage::value is a compile-time bool constant that's -// true if and only if T is type proto2::Message or a subclass of it. -template -struct IsAProtocolMessage - : public std::is_convertible {}; - -// When the compiler sees expression IsContainerTest(0), if C is an -// STL-style container class, the first overload of IsContainerTest -// will be viable (since both C::iterator* and C::const_iterator* are -// valid types and NULL can be implicitly converted to them). It will -// be picked over the second overload as 'int' is a perfect match for -// the type of argument 0. If C::iterator or C::const_iterator is not -// a valid type, the first overload is not viable, and the second -// overload will be picked. Therefore, we can determine whether C is -// a container class by checking the type of IsContainerTest(0). -// The value of the expression is insignificant. -// -// In C++11 mode we check the existence of a const_iterator and that an -// iterator is properly implemented for the container. -// -// For pre-C++11 that we look for both C::iterator and C::const_iterator. -// The reason is that C++ injects the name of a class as a member of the -// class itself (e.g. you can refer to class iterator as either -// 'iterator' or 'iterator::iterator'). If we look for C::iterator -// only, for example, we would mistakenly think that a class named -// iterator is an STL container. -// -// Also note that the simpler approach of overloading -// IsContainerTest(typename C::const_iterator*) and -// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. -typedef int IsContainer; -template ().begin()), - class = decltype(::std::declval().end()), - class = decltype(++::std::declval()), - class = decltype(*::std::declval()), - class = typename C::const_iterator> -IsContainer IsContainerTest(int /* dummy */) { - return 0; -} - -typedef char IsNotContainer; -template -IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } - -// Trait to detect whether a type T is a hash table. -// The heuristic used is that the type contains an inner type `hasher` and does -// not contain an inner type `reverse_iterator`. -// If the container is iterable in reverse, then order might actually matter. -template -struct IsHashTable { - private: - template - static char test(typename U::hasher*, typename U::reverse_iterator*); - template - static int test(typename U::hasher*, ...); - template - static char test(...); - - public: - static const bool value = sizeof(test(nullptr, nullptr)) == sizeof(int); -}; - -template -const bool IsHashTable::value; - -template (0)) == sizeof(IsContainer)> -struct IsRecursiveContainerImpl; - -template -struct IsRecursiveContainerImpl : public std::false_type {}; - -// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to -// obey the same inconsistencies as the IsContainerTest, namely check if -// something is a container is relying on only const_iterator in C++11 and -// is relying on both const_iterator and iterator otherwise -template -struct IsRecursiveContainerImpl { - using value_type = decltype(*std::declval()); - using type = - std::is_same::type>::type, - C>; -}; - -// IsRecursiveContainer is a unary compile-time predicate that -// evaluates whether C is a recursive container type. A recursive container -// type is a container type whose value_type is equal to the container type -// itself. An example for a recursive container type is -// boost::filesystem::path, whose iterator has a value_type that is equal to -// boost::filesystem::path. -template -struct IsRecursiveContainer : public IsRecursiveContainerImpl::type {}; - -// Utilities for native arrays. - -// ArrayEq() compares two k-dimensional native arrays using the -// elements' operator==, where k can be any integer >= 0. When k is -// 0, ArrayEq() degenerates into comparing a single pair of values. - -template -bool ArrayEq(const T* lhs, size_t size, const U* rhs); - -// This generic version is used when k is 0. -template -inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } - -// This overload is used when k >= 1. -template -inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { - return internal::ArrayEq(lhs, N, rhs); -} - -// This helper reduces code bloat. If we instead put its logic inside -// the previous ArrayEq() function, arrays with different sizes would -// lead to different copies of the template code. -template -bool ArrayEq(const T* lhs, size_t size, const U* rhs) { - for (size_t i = 0; i != size; i++) { - if (!internal::ArrayEq(lhs[i], rhs[i])) - return false; - } - return true; -} - -// Finds the first element in the iterator range [begin, end) that -// equals elem. Element may be a native array type itself. -template -Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { - for (Iter it = begin; it != end; ++it) { - if (internal::ArrayEq(*it, elem)) - return it; - } - return end; -} - -// CopyArray() copies a k-dimensional native array using the elements' -// operator=, where k can be any integer >= 0. When k is 0, -// CopyArray() degenerates into copying a single value. - -template -void CopyArray(const T* from, size_t size, U* to); - -// This generic version is used when k is 0. -template -inline void CopyArray(const T& from, U* to) { *to = from; } - -// This overload is used when k >= 1. -template -inline void CopyArray(const T(&from)[N], U(*to)[N]) { - internal::CopyArray(from, N, *to); -} - -// This helper reduces code bloat. If we instead put its logic inside -// the previous CopyArray() function, arrays with different sizes -// would lead to different copies of the template code. -template -void CopyArray(const T* from, size_t size, U* to) { - for (size_t i = 0; i != size; i++) { - internal::CopyArray(from[i], to + i); - } -} - -// The relation between an NativeArray object (see below) and the -// native array it represents. -// We use 2 different structs to allow non-copyable types to be used, as long -// as RelationToSourceReference() is passed. -struct RelationToSourceReference {}; -struct RelationToSourceCopy {}; - -// Adapts a native array to a read-only STL-style container. Instead -// of the complete STL container concept, this adaptor only implements -// members useful for Google Mock's container matchers. New members -// should be added as needed. To simplify the implementation, we only -// support Element being a raw type (i.e. having no top-level const or -// reference modifier). It's the client's responsibility to satisfy -// this requirement. Element can be an array type itself (hence -// multi-dimensional arrays are supported). -template -class NativeArray { - public: - // STL-style container typedefs. - typedef Element value_type; - typedef Element* iterator; - typedef const Element* const_iterator; - - // Constructs from a native array. References the source. - NativeArray(const Element* array, size_t count, RelationToSourceReference) { - InitRef(array, count); - } - - // Constructs from a native array. Copies the source. - NativeArray(const Element* array, size_t count, RelationToSourceCopy) { - InitCopy(array, count); - } - - // Copy constructor. - NativeArray(const NativeArray& rhs) { - (this->*rhs.clone_)(rhs.array_, rhs.size_); - } - - ~NativeArray() { - if (clone_ != &NativeArray::InitRef) - delete[] array_; - } - - // STL-style container methods. - size_t size() const { return size_; } - const_iterator begin() const { return array_; } - const_iterator end() const { return array_ + size_; } - bool operator==(const NativeArray& rhs) const { - return size() == rhs.size() && - ArrayEq(begin(), size(), rhs.begin()); - } - - private: - static_assert(!std::is_const::value, "Type must not be const"); - static_assert(!std::is_reference::value, - "Type must not be a reference"); - - // Initializes this object with a copy of the input. - void InitCopy(const Element* array, size_t a_size) { - Element* const copy = new Element[a_size]; - CopyArray(array, a_size, copy); - array_ = copy; - size_ = a_size; - clone_ = &NativeArray::InitCopy; - } - - // Initializes this object with a reference of the input. - void InitRef(const Element* array, size_t a_size) { - array_ = array; - size_ = a_size; - clone_ = &NativeArray::InitRef; - } - - const Element* array_; - size_t size_; - void (NativeArray::*clone_)(const Element*, size_t); - - GTEST_DISALLOW_ASSIGN_(NativeArray); -}; - -// Backport of std::index_sequence. -template -struct IndexSequence { - using type = IndexSequence; -}; - -// Double the IndexSequence, and one if plus_one is true. -template -struct DoubleSequence; -template -struct DoubleSequence, sizeofT> { - using type = IndexSequence; -}; -template -struct DoubleSequence, sizeofT> { - using type = IndexSequence; -}; - -// Backport of std::make_index_sequence. -// It uses O(ln(N)) instantiation depth. -template -struct MakeIndexSequence - : DoubleSequence::type, - N / 2>::type {}; - -template <> -struct MakeIndexSequence<0> : IndexSequence<> {}; - -template -struct Ignore { - Ignore(...); // NOLINT -}; - -template -struct ElemFromListImpl; -template -struct ElemFromListImpl> { - // We make Ignore a template to solve a problem with MSVC. - // A non-template Ignore would work fine with `decltype(Ignore(I))...`, but - // MSVC doesn't understand how to deal with that pack expansion. - // Use `0 * I` to have a single instantiation of Ignore. - template - static R Apply(Ignore<0 * I>..., R (*)(), ...); -}; - -template -struct ElemFromList { - using type = - decltype(ElemFromListImpl::type>::Apply( - static_cast(nullptr)...)); -}; - -template -class FlatTuple; - -template -struct FlatTupleElemBase; - -template -struct FlatTupleElemBase, I> { - using value_type = typename ElemFromList::type; - FlatTupleElemBase() = default; - explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} - value_type value; -}; - -template -struct FlatTupleBase; - -template -struct FlatTupleBase, IndexSequence> - : FlatTupleElemBase, Idx>... { - using Indices = IndexSequence; - FlatTupleBase() = default; - explicit FlatTupleBase(T... t) - : FlatTupleElemBase, Idx>(std::move(t))... {} -}; - -// Analog to std::tuple but with different tradeoffs. -// This class minimizes the template instantiation depth, thus allowing more -// elements that std::tuple would. std::tuple has been seen to require an -// instantiation depth of more than 10x the number of elements in some -// implementations. -// FlatTuple and ElemFromList are not recursive and have a fixed depth -// regardless of T... -// MakeIndexSequence, on the other hand, it is recursive but with an -// instantiation depth of O(ln(N)). -template -class FlatTuple - : private FlatTupleBase, - typename MakeIndexSequence::type> { - using Indices = typename FlatTuple::FlatTupleBase::Indices; - - public: - FlatTuple() = default; - explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} - - template - const typename ElemFromList::type& Get() const { - return static_cast*>(this)->value; - } - - template - typename ElemFromList::type& Get() { - return static_cast*>(this)->value; - } -}; - -// Utility functions to be called with static_assert to induce deprecation -// warnings. -GTEST_INTERNAL_DEPRECATED( - "INSTANTIATE_TEST_CASE_P is deprecated, please use " - "INSTANTIATE_TEST_SUITE_P") -constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; } - -GTEST_INTERNAL_DEPRECATED( - "TYPED_TEST_CASE_P is deprecated, please use " - "TYPED_TEST_SUITE_P") -constexpr bool TypedTestCase_P_IsDeprecated() { return true; } - -GTEST_INTERNAL_DEPRECATED( - "TYPED_TEST_CASE is deprecated, please use " - "TYPED_TEST_SUITE") -constexpr bool TypedTestCaseIsDeprecated() { return true; } - -GTEST_INTERNAL_DEPRECATED( - "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " - "REGISTER_TYPED_TEST_SUITE_P") -constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; } - -GTEST_INTERNAL_DEPRECATED( - "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " - "INSTANTIATE_TYPED_TEST_SUITE_P") -constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } - -} // namespace internal -} // namespace testing - -#define GTEST_MESSAGE_AT_(file, line, message, result_type) \ - ::testing::internal::AssertHelper(result_type, file, line, message) \ - = ::testing::Message() - -#define GTEST_MESSAGE_(message, result_type) \ - GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) - -#define GTEST_FATAL_FAILURE_(message) \ - return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) - -#define GTEST_NONFATAL_FAILURE_(message) \ - GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) - -#define GTEST_SUCCESS_(message) \ - GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) - -#define GTEST_SKIP_(message) \ - return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) - -// Suppress MSVC warning 4072 (unreachable code) for the code following -// statement if it returns or throws (or doesn't return or throw in some -// situations). -#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ - if (::testing::internal::AlwaysTrue()) { statement; } - -#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::ConstCharPtr gtest_msg = "") { \ - bool gtest_caught_expected = false; \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } \ - catch (expected_exception const&) { \ - gtest_caught_expected = true; \ - } \ - catch (...) { \ - gtest_msg.value = \ - "Expected: " #statement " throws an exception of type " \ - #expected_exception ".\n Actual: it throws a different type."; \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ - } \ - if (!gtest_caught_expected) { \ - gtest_msg.value = \ - "Expected: " #statement " throws an exception of type " \ - #expected_exception ".\n Actual: it throws nothing."; \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ - fail(gtest_msg.value) - -#define GTEST_TEST_NO_THROW_(statement, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } \ - catch (...) { \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ - fail("Expected: " #statement " doesn't throw an exception.\n" \ - " Actual: it throws.") - -#define GTEST_TEST_ANY_THROW_(statement, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - bool gtest_caught_any = false; \ - try { \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - } \ - catch (...) { \ - gtest_caught_any = true; \ - } \ - if (!gtest_caught_any) { \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ - fail("Expected: " #statement " throws an exception.\n" \ - " Actual: it doesn't.") - - -// Implements Boolean test assertions such as EXPECT_TRUE. expression can be -// either a boolean expression or an AssertionResult. text is a textual -// represenation of expression as it was passed into the EXPECT_TRUE. -#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (const ::testing::AssertionResult gtest_ar_ = \ - ::testing::AssertionResult(expression)) \ - ; \ - else \ - fail(::testing::internal::GetBoolAssertionFailureMessage(\ - gtest_ar_, text, #actual, #expected).c_str()) - -#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::AlwaysTrue()) { \ - ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ - GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ - if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ - goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ - } \ - } else \ - GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ - fail("Expected: " #statement " doesn't generate new fatal " \ - "failures in the current thread.\n" \ - " Actual: it does.") - -// Expands to the name of the class that implements the given test. -#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ - test_suite_name##_##test_name##_Test - -// Helper macro for defining tests. -#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \ - static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ - "test_suite_name must not be empty"); \ - static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \ - "test_name must not be empty"); \ - class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ - : public parent_class { \ - public: \ - GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ - \ - private: \ - void TestBody() override; \ - static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ - test_name)); \ - }; \ - \ - ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ - test_name)::test_info_ = \ - ::testing::internal::MakeAndRegisterTestInfo( \ - #test_suite_name, #test_name, nullptr, nullptr, \ - ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \ - ::testing::internal::SuiteApiResolver< \ - parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \ - ::testing::internal::SuiteApiResolver< \ - parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \ - new ::testing::internal::TestFactoryImpl); \ - void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ diff --git a/core/deps/gtest/internal/gtest-param-util.h b/core/deps/gtest/internal/gtest-param-util.h deleted file mode 100644 index 40f3f4573..000000000 --- a/core/deps/gtest/internal/gtest-param-util.h +++ /dev/null @@ -1,880 +0,0 @@ -// Copyright 2008 Google Inc. -// All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Type and function utilities for implementing parameterized tests. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../gtest-printers.h" -#include "gtest-internal.h" -#include "gtest-port.h" - -namespace testing { -// Input to a parameterized test name generator, describing a test parameter. -// Consists of the parameter value and the integer parameter index. -template -struct TestParamInfo { - TestParamInfo(const ParamType& a_param, size_t an_index) : - param(a_param), - index(an_index) {} - ParamType param; - size_t index; -}; - -// A builtin parameterized test name generator which returns the result of -// testing::PrintToString. -struct PrintToStringParamName { - template - std::string operator()(const TestParamInfo& info) const { - return PrintToString(info.param); - } -}; - -namespace internal { - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// Utility Functions - -// Outputs a message explaining invalid registration of different -// fixture class for the same test suite. This may happen when -// TEST_P macro is used to define two tests with the same name -// but in different namespaces. -GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name, - CodeLocation code_location); - -template class ParamGeneratorInterface; -template class ParamGenerator; - -// Interface for iterating over elements provided by an implementation -// of ParamGeneratorInterface. -template -class ParamIteratorInterface { - public: - virtual ~ParamIteratorInterface() {} - // A pointer to the base generator instance. - // Used only for the purposes of iterator comparison - // to make sure that two iterators belong to the same generator. - virtual const ParamGeneratorInterface* BaseGenerator() const = 0; - // Advances iterator to point to the next element - // provided by the generator. The caller is responsible - // for not calling Advance() on an iterator equal to - // BaseGenerator()->End(). - virtual void Advance() = 0; - // Clones the iterator object. Used for implementing copy semantics - // of ParamIterator. - virtual ParamIteratorInterface* Clone() const = 0; - // Dereferences the current iterator and provides (read-only) access - // to the pointed value. It is the caller's responsibility not to call - // Current() on an iterator equal to BaseGenerator()->End(). - // Used for implementing ParamGenerator::operator*(). - virtual const T* Current() const = 0; - // Determines whether the given iterator and other point to the same - // element in the sequence generated by the generator. - // Used for implementing ParamGenerator::operator==(). - virtual bool Equals(const ParamIteratorInterface& other) const = 0; -}; - -// Class iterating over elements provided by an implementation of -// ParamGeneratorInterface. It wraps ParamIteratorInterface -// and implements the const forward iterator concept. -template -class ParamIterator { - public: - typedef T value_type; - typedef const T& reference; - typedef ptrdiff_t difference_type; - - // ParamIterator assumes ownership of the impl_ pointer. - ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} - ParamIterator& operator=(const ParamIterator& other) { - if (this != &other) - impl_.reset(other.impl_->Clone()); - return *this; - } - - const T& operator*() const { return *impl_->Current(); } - const T* operator->() const { return impl_->Current(); } - // Prefix version of operator++. - ParamIterator& operator++() { - impl_->Advance(); - return *this; - } - // Postfix version of operator++. - ParamIterator operator++(int /*unused*/) { - ParamIteratorInterface* clone = impl_->Clone(); - impl_->Advance(); - return ParamIterator(clone); - } - bool operator==(const ParamIterator& other) const { - return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); - } - bool operator!=(const ParamIterator& other) const { - return !(*this == other); - } - - private: - friend class ParamGenerator; - explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} - std::unique_ptr > impl_; -}; - -// ParamGeneratorInterface is the binary interface to access generators -// defined in other translation units. -template -class ParamGeneratorInterface { - public: - typedef T ParamType; - - virtual ~ParamGeneratorInterface() {} - - // Generator interface definition - virtual ParamIteratorInterface* Begin() const = 0; - virtual ParamIteratorInterface* End() const = 0; -}; - -// Wraps ParamGeneratorInterface and provides general generator syntax -// compatible with the STL Container concept. -// This class implements copy initialization semantics and the contained -// ParamGeneratorInterface instance is shared among all copies -// of the original object. This is possible because that instance is immutable. -template -class ParamGenerator { - public: - typedef ParamIterator iterator; - - explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} - ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} - - ParamGenerator& operator=(const ParamGenerator& other) { - impl_ = other.impl_; - return *this; - } - - iterator begin() const { return iterator(impl_->Begin()); } - iterator end() const { return iterator(impl_->End()); } - - private: - std::shared_ptr > impl_; -}; - -// Generates values from a range of two comparable values. Can be used to -// generate sequences of user-defined types that implement operator+() and -// operator<(). -// This class is used in the Range() function. -template -class RangeGenerator : public ParamGeneratorInterface { - public: - RangeGenerator(T begin, T end, IncrementT step) - : begin_(begin), end_(end), - step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} - ~RangeGenerator() override {} - - ParamIteratorInterface* Begin() const override { - return new Iterator(this, begin_, 0, step_); - } - ParamIteratorInterface* End() const override { - return new Iterator(this, end_, end_index_, step_); - } - - private: - class Iterator : public ParamIteratorInterface { - public: - Iterator(const ParamGeneratorInterface* base, T value, int index, - IncrementT step) - : base_(base), value_(value), index_(index), step_(step) {} - ~Iterator() override {} - - const ParamGeneratorInterface* BaseGenerator() const override { - return base_; - } - void Advance() override { - value_ = static_cast(value_ + step_); - index_++; - } - ParamIteratorInterface* Clone() const override { - return new Iterator(*this); - } - const T* Current() const override { return &value_; } - bool Equals(const ParamIteratorInterface& other) const override { - // Having the same base generator guarantees that the other - // iterator is of the same type and we can downcast. - GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) - << "The program attempted to compare iterators " - << "from different generators." << std::endl; - const int other_index = - CheckedDowncastToActualType(&other)->index_; - return index_ == other_index; - } - - private: - Iterator(const Iterator& other) - : ParamIteratorInterface(), - base_(other.base_), value_(other.value_), index_(other.index_), - step_(other.step_) {} - - // No implementation - assignment is unsupported. - void operator=(const Iterator& other); - - const ParamGeneratorInterface* const base_; - T value_; - int index_; - const IncrementT step_; - }; // class RangeGenerator::Iterator - - static int CalculateEndIndex(const T& begin, - const T& end, - const IncrementT& step) { - int end_index = 0; - for (T i = begin; i < end; i = static_cast(i + step)) - end_index++; - return end_index; - } - - // No implementation - assignment is unsupported. - void operator=(const RangeGenerator& other); - - const T begin_; - const T end_; - const IncrementT step_; - // The index for the end() iterator. All the elements in the generated - // sequence are indexed (0-based) to aid iterator comparison. - const int end_index_; -}; // class RangeGenerator - - -// Generates values from a pair of STL-style iterators. Used in the -// ValuesIn() function. The elements are copied from the source range -// since the source can be located on the stack, and the generator -// is likely to persist beyond that stack frame. -template -class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { - public: - template - ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) - : container_(begin, end) {} - ~ValuesInIteratorRangeGenerator() override {} - - ParamIteratorInterface* Begin() const override { - return new Iterator(this, container_.begin()); - } - ParamIteratorInterface* End() const override { - return new Iterator(this, container_.end()); - } - - private: - typedef typename ::std::vector ContainerType; - - class Iterator : public ParamIteratorInterface { - public: - Iterator(const ParamGeneratorInterface* base, - typename ContainerType::const_iterator iterator) - : base_(base), iterator_(iterator) {} - ~Iterator() override {} - - const ParamGeneratorInterface* BaseGenerator() const override { - return base_; - } - void Advance() override { - ++iterator_; - value_.reset(); - } - ParamIteratorInterface* Clone() const override { - return new Iterator(*this); - } - // We need to use cached value referenced by iterator_ because *iterator_ - // can return a temporary object (and of type other then T), so just - // having "return &*iterator_;" doesn't work. - // value_ is updated here and not in Advance() because Advance() - // can advance iterator_ beyond the end of the range, and we cannot - // detect that fact. The client code, on the other hand, is - // responsible for not calling Current() on an out-of-range iterator. - const T* Current() const override { - if (value_.get() == nullptr) value_.reset(new T(*iterator_)); - return value_.get(); - } - bool Equals(const ParamIteratorInterface& other) const override { - // Having the same base generator guarantees that the other - // iterator is of the same type and we can downcast. - GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) - << "The program attempted to compare iterators " - << "from different generators." << std::endl; - return iterator_ == - CheckedDowncastToActualType(&other)->iterator_; - } - - private: - Iterator(const Iterator& other) - // The explicit constructor call suppresses a false warning - // emitted by gcc when supplied with the -Wextra option. - : ParamIteratorInterface(), - base_(other.base_), - iterator_(other.iterator_) {} - - const ParamGeneratorInterface* const base_; - typename ContainerType::const_iterator iterator_; - // A cached value of *iterator_. We keep it here to allow access by - // pointer in the wrapping iterator's operator->(). - // value_ needs to be mutable to be accessed in Current(). - // Use of std::unique_ptr helps manage cached value's lifetime, - // which is bound by the lifespan of the iterator itself. - mutable std::unique_ptr value_; - }; // class ValuesInIteratorRangeGenerator::Iterator - - // No implementation - assignment is unsupported. - void operator=(const ValuesInIteratorRangeGenerator& other); - - const ContainerType container_; -}; // class ValuesInIteratorRangeGenerator - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Default parameterized test name generator, returns a string containing the -// integer test parameter index. -template -std::string DefaultParamName(const TestParamInfo& info) { - Message name_stream; - name_stream << info.index; - return name_stream.GetString(); -} - -template -void TestNotEmpty() { - static_assert(sizeof(T) == 0, "Empty arguments are not allowed."); -} -template -void TestNotEmpty(const T&) {} - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Stores a parameter value and later creates tests parameterized with that -// value. -template -class ParameterizedTestFactory : public TestFactoryBase { - public: - typedef typename TestClass::ParamType ParamType; - explicit ParameterizedTestFactory(ParamType parameter) : - parameter_(parameter) {} - Test* CreateTest() override { - TestClass::SetParam(¶meter_); - return new TestClass(); - } - - private: - const ParamType parameter_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); -}; - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// TestMetaFactoryBase is a base class for meta-factories that create -// test factories for passing into MakeAndRegisterTestInfo function. -template -class TestMetaFactoryBase { - public: - virtual ~TestMetaFactoryBase() {} - - virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; -}; - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// TestMetaFactory creates test factories for passing into -// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives -// ownership of test factory pointer, same factory object cannot be passed -// into that method twice. But ParameterizedTestSuiteInfo is going to call -// it for each Test/Parameter value combination. Thus it needs meta factory -// creator class. -template -class TestMetaFactory - : public TestMetaFactoryBase { - public: - using ParamType = typename TestSuite::ParamType; - - TestMetaFactory() {} - - TestFactoryBase* CreateTestFactory(ParamType parameter) override { - return new ParameterizedTestFactory(parameter); - } - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); -}; - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// ParameterizedTestSuiteInfoBase is a generic interface -// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase -// accumulates test information provided by TEST_P macro invocations -// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations -// and uses that information to register all resulting test instances -// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds -// a collection of pointers to the ParameterizedTestSuiteInfo objects -// and calls RegisterTests() on each of them when asked. -class ParameterizedTestSuiteInfoBase { - public: - virtual ~ParameterizedTestSuiteInfoBase() {} - - // Base part of test suite name for display purposes. - virtual const std::string& GetTestSuiteName() const = 0; - // Test case id to verify identity. - virtual TypeId GetTestSuiteTypeId() const = 0; - // UnitTest class invokes this method to register tests in this - // test suite right before running them in RUN_ALL_TESTS macro. - // This method should not be called more than once on any single - // instance of a ParameterizedTestSuiteInfoBase derived class. - virtual void RegisterTests() = 0; - - protected: - ParameterizedTestSuiteInfoBase() {} - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase); -}; - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P -// macro invocations for a particular test suite and generators -// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that -// test suite. It registers tests with all values generated by all -// generators when asked. -template -class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { - public: - // ParamType and GeneratorCreationFunc are private types but are required - // for declarations of public methods AddTestPattern() and - // AddTestSuiteInstantiation(). - using ParamType = typename TestSuite::ParamType; - // A function that returns an instance of appropriate generator type. - typedef ParamGenerator(GeneratorCreationFunc)(); - using ParamNameGeneratorFunc = std::string(const TestParamInfo&); - - explicit ParameterizedTestSuiteInfo(const char* name, - CodeLocation code_location) - : test_suite_name_(name), code_location_(code_location) {} - - // Test case base name for display purposes. - const std::string& GetTestSuiteName() const override { - return test_suite_name_; - } - // Test case id to verify identity. - TypeId GetTestSuiteTypeId() const override { return GetTypeId(); } - // TEST_P macro uses AddTestPattern() to record information - // about a single test in a LocalTestInfo structure. - // test_suite_name is the base name of the test suite (without invocation - // prefix). test_base_name is the name of an individual test without - // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is - // test suite base name and DoBar is test base name. - void AddTestPattern(const char* test_suite_name, const char* test_base_name, - TestMetaFactoryBase* meta_factory) { - tests_.push_back(std::shared_ptr( - new TestInfo(test_suite_name, test_base_name, meta_factory))); - } - // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information - // about a generator. - int AddTestSuiteInstantiation(const std::string& instantiation_name, - GeneratorCreationFunc* func, - ParamNameGeneratorFunc* name_func, - const char* file, int line) { - instantiations_.push_back( - InstantiationInfo(instantiation_name, func, name_func, file, line)); - return 0; // Return value used only to run this method in namespace scope. - } - // UnitTest class invokes this method to register tests in this test suite - // test suites right before running tests in RUN_ALL_TESTS macro. - // This method should not be called more than once on any single - // instance of a ParameterizedTestSuiteInfoBase derived class. - // UnitTest has a guard to prevent from calling this method more than once. - void RegisterTests() override { - for (typename TestInfoContainer::iterator test_it = tests_.begin(); - test_it != tests_.end(); ++test_it) { - std::shared_ptr test_info = *test_it; - for (typename InstantiationContainer::iterator gen_it = - instantiations_.begin(); gen_it != instantiations_.end(); - ++gen_it) { - const std::string& instantiation_name = gen_it->name; - ParamGenerator generator((*gen_it->generator)()); - ParamNameGeneratorFunc* name_func = gen_it->name_func; - const char* file = gen_it->file; - int line = gen_it->line; - - std::string test_suite_name; - if ( !instantiation_name.empty() ) - test_suite_name = instantiation_name + "/"; - test_suite_name += test_info->test_suite_base_name; - - size_t i = 0; - std::set test_param_names; - for (typename ParamGenerator::iterator param_it = - generator.begin(); - param_it != generator.end(); ++param_it, ++i) { - Message test_name_stream; - - std::string param_name = name_func( - TestParamInfo(*param_it, i)); - - GTEST_CHECK_(IsValidParamName(param_name)) - << "Parameterized test name '" << param_name - << "' is invalid, in " << file - << " line " << line << std::endl; - - GTEST_CHECK_(test_param_names.count(param_name) == 0) - << "Duplicate parameterized test name '" << param_name - << "', in " << file << " line " << line << std::endl; - - test_param_names.insert(param_name); - - test_name_stream << test_info->test_base_name << "/" << param_name; - MakeAndRegisterTestInfo( - test_suite_name.c_str(), test_name_stream.GetString().c_str(), - nullptr, // No type parameter. - PrintToString(*param_it).c_str(), code_location_, - GetTestSuiteTypeId(), - SuiteApiResolver::GetSetUpCaseOrSuite(file, line), - SuiteApiResolver::GetTearDownCaseOrSuite(file, line), - test_info->test_meta_factory->CreateTestFactory(*param_it)); - } // for param_it - } // for gen_it - } // for test_it - } // RegisterTests - - private: - // LocalTestInfo structure keeps information about a single test registered - // with TEST_P macro. - struct TestInfo { - TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name, - TestMetaFactoryBase* a_test_meta_factory) - : test_suite_base_name(a_test_suite_base_name), - test_base_name(a_test_base_name), - test_meta_factory(a_test_meta_factory) {} - - const std::string test_suite_base_name; - const std::string test_base_name; - const std::unique_ptr > test_meta_factory; - }; - using TestInfoContainer = ::std::vector >; - // Records data received from INSTANTIATE_TEST_SUITE_P macros: - // - struct InstantiationInfo { - InstantiationInfo(const std::string &name_in, - GeneratorCreationFunc* generator_in, - ParamNameGeneratorFunc* name_func_in, - const char* file_in, - int line_in) - : name(name_in), - generator(generator_in), - name_func(name_func_in), - file(file_in), - line(line_in) {} - - std::string name; - GeneratorCreationFunc* generator; - ParamNameGeneratorFunc* name_func; - const char* file; - int line; - }; - typedef ::std::vector InstantiationContainer; - - static bool IsValidParamName(const std::string& name) { - // Check for empty string - if (name.empty()) - return false; - - // Check for invalid characters - for (std::string::size_type index = 0; index < name.size(); ++index) { - if (!isalnum(name[index]) && name[index] != '_') - return false; - } - - return true; - } - - const std::string test_suite_name_; - CodeLocation code_location_; - TestInfoContainer tests_; - InstantiationContainer instantiations_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo); -}; // class ParameterizedTestSuiteInfo - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -template -using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// ParameterizedTestSuiteRegistry contains a map of -// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P -// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding -// ParameterizedTestSuiteInfo descriptors. -class ParameterizedTestSuiteRegistry { - public: - ParameterizedTestSuiteRegistry() {} - ~ParameterizedTestSuiteRegistry() { - for (auto& test_suite_info : test_suite_infos_) { - delete test_suite_info; - } - } - - // Looks up or creates and returns a structure containing information about - // tests and instantiations of a particular test suite. - template - ParameterizedTestSuiteInfo* GetTestSuitePatternHolder( - const char* test_suite_name, CodeLocation code_location) { - ParameterizedTestSuiteInfo* typed_test_info = nullptr; - for (auto& test_suite_info : test_suite_infos_) { - if (test_suite_info->GetTestSuiteName() == test_suite_name) { - if (test_suite_info->GetTestSuiteTypeId() != GetTypeId()) { - // Complain about incorrect usage of Google Test facilities - // and terminate the program since we cannot guaranty correct - // test suite setup and tear-down in this case. - ReportInvalidTestSuiteType(test_suite_name, code_location); - posix::Abort(); - } else { - // At this point we are sure that the object we found is of the same - // type we are looking for, so we downcast it to that type - // without further checks. - typed_test_info = CheckedDowncastToActualType< - ParameterizedTestSuiteInfo >(test_suite_info); - } - break; - } - } - if (typed_test_info == nullptr) { - typed_test_info = new ParameterizedTestSuiteInfo( - test_suite_name, code_location); - test_suite_infos_.push_back(typed_test_info); - } - return typed_test_info; - } - void RegisterTests() { - for (auto& test_suite_info : test_suite_infos_) { - test_suite_info->RegisterTests(); - } - } -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - template - ParameterizedTestCaseInfo* GetTestCasePatternHolder( - const char* test_case_name, CodeLocation code_location) { - return GetTestSuitePatternHolder(test_case_name, code_location); - } - -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - private: - using TestSuiteInfoContainer = ::std::vector; - - TestSuiteInfoContainer test_suite_infos_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry); -}; - -} // namespace internal - -// Forward declarations of ValuesIn(), which is implemented in -// include/gtest/gtest-param-test.h. -template -internal::ParamGenerator ValuesIn( - const Container& container); - -namespace internal { -// Used in the Values() function to provide polymorphic capabilities. - -template -class ValueArray { - public: - ValueArray(Ts... v) : v_{std::move(v)...} {} - - template - operator ParamGenerator() const { // NOLINT - return ValuesIn(MakeVector(MakeIndexSequence())); - } - - private: - template - std::vector MakeVector(IndexSequence) const { - return std::vector{static_cast(v_.template Get())...}; - } - - FlatTuple v_; -}; - -template -class CartesianProductGenerator - : public ParamGeneratorInterface<::std::tuple> { - public: - typedef ::std::tuple ParamType; - - CartesianProductGenerator(const std::tuple...>& g) - : generators_(g) {} - ~CartesianProductGenerator() override {} - - ParamIteratorInterface* Begin() const override { - return new Iterator(this, generators_, false); - } - ParamIteratorInterface* End() const override { - return new Iterator(this, generators_, true); - } - - private: - template - class IteratorImpl; - template - class IteratorImpl> - : public ParamIteratorInterface { - public: - IteratorImpl(const ParamGeneratorInterface* base, - const std::tuple...>& generators, bool is_end) - : base_(base), - begin_(std::get(generators).begin()...), - end_(std::get(generators).end()...), - current_(is_end ? end_ : begin_) { - ComputeCurrentValue(); - } - ~IteratorImpl() override {} - - const ParamGeneratorInterface* BaseGenerator() const override { - return base_; - } - // Advance should not be called on beyond-of-range iterators - // so no component iterators must be beyond end of range, either. - void Advance() override { - assert(!AtEnd()); - // Advance the last iterator. - ++std::get(current_); - // if that reaches end, propagate that up. - AdvanceIfEnd(); - ComputeCurrentValue(); - } - ParamIteratorInterface* Clone() const override { - return new IteratorImpl(*this); - } - - const ParamType* Current() const override { return current_value_.get(); } - - bool Equals(const ParamIteratorInterface& other) const override { - // Having the same base generator guarantees that the other - // iterator is of the same type and we can downcast. - GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) - << "The program attempted to compare iterators " - << "from different generators." << std::endl; - const IteratorImpl* typed_other = - CheckedDowncastToActualType(&other); - - // We must report iterators equal if they both point beyond their - // respective ranges. That can happen in a variety of fashions, - // so we have to consult AtEnd(). - if (AtEnd() && typed_other->AtEnd()) return true; - - bool same = true; - bool dummy[] = { - (same = same && std::get(current_) == - std::get(typed_other->current_))...}; - (void)dummy; - return same; - } - - private: - template - void AdvanceIfEnd() { - if (std::get(current_) != std::get(end_)) return; - - bool last = ThisI == 0; - if (last) { - // We are done. Nothing else to propagate. - return; - } - - constexpr size_t NextI = ThisI - (ThisI != 0); - std::get(current_) = std::get(begin_); - ++std::get(current_); - AdvanceIfEnd(); - } - - void ComputeCurrentValue() { - if (!AtEnd()) - current_value_ = std::make_shared(*std::get(current_)...); - } - bool AtEnd() const { - bool at_end = false; - bool dummy[] = { - (at_end = at_end || std::get(current_) == std::get(end_))...}; - (void)dummy; - return at_end; - } - - const ParamGeneratorInterface* const base_; - std::tuple::iterator...> begin_; - std::tuple::iterator...> end_; - std::tuple::iterator...> current_; - std::shared_ptr current_value_; - }; - - using Iterator = IteratorImpl::type>; - - std::tuple...> generators_; -}; - -template -class CartesianProductHolder { - public: - CartesianProductHolder(const Gen&... g) : generators_(g...) {} - template - operator ParamGenerator<::std::tuple>() const { - return ParamGenerator<::std::tuple>( - new CartesianProductGenerator(generators_)); - } - - private: - std::tuple generators_; -}; - -} // namespace internal -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ diff --git a/core/deps/gtest/internal/gtest-port-arch.h b/core/deps/gtest/internal/gtest-port-arch.h deleted file mode 100644 index d3239b25b..000000000 --- a/core/deps/gtest/internal/gtest-port-arch.h +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2015, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file defines the GTEST_OS_* macro. -// It is separate from gtest-port.h so that custom/gtest-port.h can include it. - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ - -// Determines the platform on which Google Test is compiled. -#ifdef __CYGWIN__ -# define GTEST_OS_CYGWIN 1 -# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__) -# define GTEST_OS_WINDOWS_MINGW 1 -# define GTEST_OS_WINDOWS 1 -#elif defined _WIN32 -# define GTEST_OS_WINDOWS 1 -# ifdef _WIN32_WCE -# define GTEST_OS_WINDOWS_MOBILE 1 -# elif defined(WINAPI_FAMILY) -# include -# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# define GTEST_OS_WINDOWS_DESKTOP 1 -# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) -# define GTEST_OS_WINDOWS_PHONE 1 -# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) -# define GTEST_OS_WINDOWS_RT 1 -# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) -# define GTEST_OS_WINDOWS_PHONE 1 -# define GTEST_OS_WINDOWS_TV_TITLE 1 -# else - // WINAPI_FAMILY defined but no known partition matched. - // Default to desktop. -# define GTEST_OS_WINDOWS_DESKTOP 1 -# endif -# else -# define GTEST_OS_WINDOWS_DESKTOP 1 -# endif // _WIN32_WCE -#elif defined __OS2__ -# define GTEST_OS_OS2 1 -#elif defined __APPLE__ -# define GTEST_OS_MAC 1 -# if TARGET_OS_IPHONE -# define GTEST_OS_IOS 1 -# endif -#elif defined __DragonFly__ -# define GTEST_OS_DRAGONFLY 1 -#elif defined __FreeBSD__ -# define GTEST_OS_FREEBSD 1 -#elif defined __Fuchsia__ -# define GTEST_OS_FUCHSIA 1 -#elif defined(__GLIBC__) && defined(__FreeBSD_kernel__) -# define GTEST_OS_GNU_KFREEBSD 1 -#elif defined __linux__ -# define GTEST_OS_LINUX 1 -# if defined __ANDROID__ -# define GTEST_OS_LINUX_ANDROID 1 -# endif -#elif defined __MVS__ -# define GTEST_OS_ZOS 1 -#elif defined(__sun) && defined(__SVR4) -# define GTEST_OS_SOLARIS 1 -#elif defined(_AIX) -# define GTEST_OS_AIX 1 -#elif defined(__hpux) -# define GTEST_OS_HPUX 1 -#elif defined __native_client__ -# define GTEST_OS_NACL 1 -#elif defined __NetBSD__ -# define GTEST_OS_NETBSD 1 -#elif defined __OpenBSD__ -# define GTEST_OS_OPENBSD 1 -#elif defined __QNX__ -# define GTEST_OS_QNX 1 -#elif defined(__HAIKU__) -#define GTEST_OS_HAIKU 1 -#elif defined ESP8266 -#define GTEST_OS_ESP8266 1 -#elif defined ESP32 -#define GTEST_OS_ESP32 1 -#endif // __CYGWIN__ - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ diff --git a/core/deps/gtest/internal/gtest-port.h b/core/deps/gtest/internal/gtest-port.h deleted file mode 100644 index baaf2d604..000000000 --- a/core/deps/gtest/internal/gtest-port.h +++ /dev/null @@ -1,2213 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Low-level types and utilities for porting Google Test to various -// platforms. All macros ending with _ and symbols defined in an -// internal namespace are subject to change without notice. Code -// outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't -// end with _ are part of Google Test's public API and can be used by -// code outside Google Test. -// -// This file is fundamental to Google Test. All other Google Test source -// files are expected to #include this. Therefore, it cannot #include -// any other Google Test header. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ - -// Environment-describing macros -// ----------------------------- -// -// Google Test can be used in many different environments. Macros in -// this section tell Google Test what kind of environment it is being -// used in, such that Google Test can provide environment-specific -// features and implementations. -// -// Google Test tries to automatically detect the properties of its -// environment, so users usually don't need to worry about these -// macros. However, the automatic detection is not perfect. -// Sometimes it's necessary for a user to define some of the following -// macros in the build script to override Google Test's decisions. -// -// If the user doesn't define a macro in the list, Google Test will -// provide a default definition. After this header is #included, all -// macros in this list will be defined to either 1 or 0. -// -// Notes to maintainers: -// - Each macro here is a user-tweakable knob; do not grow the list -// lightly. -// - Use #if to key off these macros. Don't use #ifdef or "#if -// defined(...)", which will not work as these macros are ALWAYS -// defined. -// -// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) -// is/isn't available. -// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions -// are enabled. -// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular -// expressions are/aren't available. -// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that -// is/isn't available. -// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't -// enabled. -// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that -// std::wstring does/doesn't work (Google Test can -// be used where std::wstring is unavailable). -// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the -// compiler supports Microsoft's "Structured -// Exception Handling". -// GTEST_HAS_STREAM_REDIRECTION -// - Define it to 1/0 to indicate whether the -// platform supports I/O stream redirection using -// dup() and dup2(). -// GTEST_LINKED_AS_SHARED_LIBRARY -// - Define to 1 when compiling tests that use -// Google Test as a shared library (known as -// DLL on Windows). -// GTEST_CREATE_SHARED_LIBRARY -// - Define to 1 when compiling Google Test itself -// as a shared library. -// GTEST_DEFAULT_DEATH_TEST_STYLE -// - The default value of --gtest_death_test_style. -// The legacy default has been "fast" in the open -// source version since 2008. The recommended value -// is "threadsafe", and can be set in -// custom/gtest-port.h. - -// Platform-indicating macros -// -------------------------- -// -// Macros indicating the platform on which Google Test is being used -// (a macro is defined to 1 if compiled on the given platform; -// otherwise UNDEFINED -- it's never defined to 0.). Google Test -// defines these macros automatically. Code outside Google Test MUST -// NOT define them. -// -// GTEST_OS_AIX - IBM AIX -// GTEST_OS_CYGWIN - Cygwin -// GTEST_OS_DRAGONFLY - DragonFlyBSD -// GTEST_OS_FREEBSD - FreeBSD -// GTEST_OS_FUCHSIA - Fuchsia -// GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD -// GTEST_OS_HAIKU - Haiku -// GTEST_OS_HPUX - HP-UX -// GTEST_OS_LINUX - Linux -// GTEST_OS_LINUX_ANDROID - Google Android -// GTEST_OS_MAC - Mac OS X -// GTEST_OS_IOS - iOS -// GTEST_OS_NACL - Google Native Client (NaCl) -// GTEST_OS_NETBSD - NetBSD -// GTEST_OS_OPENBSD - OpenBSD -// GTEST_OS_OS2 - OS/2 -// GTEST_OS_QNX - QNX -// GTEST_OS_SOLARIS - Sun Solaris -// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) -// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop -// GTEST_OS_WINDOWS_MINGW - MinGW -// GTEST_OS_WINDOWS_MOBILE - Windows Mobile -// GTEST_OS_WINDOWS_PHONE - Windows Phone -// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT -// GTEST_OS_ZOS - z/OS -// -// Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the -// most stable support. Since core members of the Google Test project -// don't have access to other platforms, support for them may be less -// stable. If you notice any problems on your platform, please notify -// googletestframework@googlegroups.com (patches for fixing them are -// even more welcome!). -// -// It is possible that none of the GTEST_OS_* macros are defined. - -// Feature-indicating macros -// ------------------------- -// -// Macros indicating which Google Test features are available (a macro -// is defined to 1 if the corresponding feature is supported; -// otherwise UNDEFINED -- it's never defined to 0.). Google Test -// defines these macros automatically. Code outside Google Test MUST -// NOT define them. -// -// These macros are public so that portable tests can be written. -// Such tests typically surround code using a feature with an #if -// which controls that code. For example: -// -// #if GTEST_HAS_DEATH_TEST -// EXPECT_DEATH(DoSomethingDeadly()); -// #endif -// -// GTEST_HAS_DEATH_TEST - death tests -// GTEST_HAS_TYPED_TEST - typed tests -// GTEST_HAS_TYPED_TEST_P - type-parameterized tests -// GTEST_IS_THREADSAFE - Google Test is thread-safe. -// GOOGLETEST_CM0007 DO NOT DELETE -// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with -// GTEST_HAS_POSIX_RE (see above) which users can -// define themselves. -// GTEST_USES_SIMPLE_RE - our own simple regex is used; -// the above RE\b(s) are mutually exclusive. - -// Misc public macros -// ------------------ -// -// GTEST_FLAG(flag_name) - references the variable corresponding to -// the given Google Test flag. - -// Internal utilities -// ------------------ -// -// The following macros and utilities are for Google Test's INTERNAL -// use only. Code outside Google Test MUST NOT USE THEM DIRECTLY. -// -// Macros for basic C++ coding: -// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. -// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a -// variable don't have to be used. -// GTEST_DISALLOW_ASSIGN_ - disables operator=. -// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. -// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. -// GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is -// suppressed (constant conditional). -// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127 -// is suppressed. -// -// Synchronization: -// Mutex, MutexLock, ThreadLocal, GetThreadCount() -// - synchronization primitives. -// -// Regular expressions: -// RE - a simple regular expression class using the POSIX -// Extended Regular Expression syntax on UNIX-like platforms -// GOOGLETEST_CM0008 DO NOT DELETE -// or a reduced regular exception syntax on other -// platforms, including Windows. -// Logging: -// GTEST_LOG_() - logs messages at the specified severity level. -// LogToStderr() - directs all log messages to stderr. -// FlushInfoLog() - flushes informational log messages. -// -// Stdout and stderr capturing: -// CaptureStdout() - starts capturing stdout. -// GetCapturedStdout() - stops capturing stdout and returns the captured -// string. -// CaptureStderr() - starts capturing stderr. -// GetCapturedStderr() - stops capturing stderr and returns the captured -// string. -// -// Integer types: -// TypeWithSize - maps an integer to a int type. -// Int32, UInt32, Int64, UInt64, TimeInMillis -// - integers of known sizes. -// -// Command-line utilities: -// GTEST_DECLARE_*() - declares a flag. -// GTEST_DEFINE_*() - defines a flag. -// GetInjectableArgvs() - returns the command line as a vector of strings. -// -// Environment variable utilities: -// GetEnv() - gets the value of an environment variable. -// BoolFromGTestEnv() - parses a bool environment variable. -// Int32FromGTestEnv() - parses an Int32 environment variable. -// StringFromGTestEnv() - parses a string environment variable. -// -// Deprecation warnings: -// GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as -// deprecated; calling a marked function -// should generate a compiler warning - -#include // for isspace, etc -#include // for ptrdiff_t -#include -#include -#include -#include - -#ifndef _WIN32_WCE -# include -# include -#endif // !_WIN32_WCE - -#if defined __APPLE__ -# include -# include -#endif - -#include // NOLINT -#include -#include // NOLINT -#include -#include // NOLINT - -#include "custom/gtest-port.h" -#include "gtest-port-arch.h" - -#if !defined(GTEST_DEV_EMAIL_) -# define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" -# define GTEST_FLAG_PREFIX_ "gtest_" -# define GTEST_FLAG_PREFIX_DASH_ "gtest-" -# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" -# define GTEST_NAME_ "Google Test" -# define GTEST_PROJECT_URL_ "https://github.com/google/googletest/" -#endif // !defined(GTEST_DEV_EMAIL_) - -#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_) -# define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest" -#endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_) - -// Determines the version of gcc that is used to compile this. -#ifdef __GNUC__ -// 40302 means version 4.3.2. -# define GTEST_GCC_VER_ \ - (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) -#endif // __GNUC__ - -// Macros for disabling Microsoft Visual C++ warnings. -// -// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385) -// /* code that triggers warnings C4800 and C4385 */ -// GTEST_DISABLE_MSC_WARNINGS_POP_() -#if defined(_MSC_VER) -# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ - __pragma(warning(push)) \ - __pragma(warning(disable: warnings)) -# define GTEST_DISABLE_MSC_WARNINGS_POP_() \ - __pragma(warning(pop)) -#else -// Not all compilers are MSVC -# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) -# define GTEST_DISABLE_MSC_WARNINGS_POP_() -#endif - -// Clang on Windows does not understand MSVC's pragma warning. -// We need clang-specific way to disable function deprecation warning. -#ifdef __clang__ -# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ - _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") -#define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ - _Pragma("clang diagnostic pop") -#else -# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) -# define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ - GTEST_DISABLE_MSC_WARNINGS_POP_() -#endif - -// Brings in definitions for functions used in the testing::internal::posix -// namespace (read, write, close, chdir, isatty, stat). We do not currently -// use them on Windows Mobile. -#if GTEST_OS_WINDOWS -# if !GTEST_OS_WINDOWS_MOBILE -# include -# include -# endif -// In order to avoid having to include , use forward declaration -#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR) -// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two -// separate (equivalent) structs, instead of using typedef -typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION; -#else -// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION. -// This assumption is verified by -// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION. -typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; -#endif -#else -// This assumes that non-Windows OSes provide unistd.h. For OSes where this -// is not the case, we need to include headers that provide the functions -// mentioned above. -# include -# include -#endif // GTEST_OS_WINDOWS - -#if GTEST_OS_LINUX_ANDROID -// Used to define __ANDROID_API__ matching the target NDK API level. -# include // NOLINT -#endif - -// Defines this to true if and only if Google Test can use POSIX regular -// expressions. -#ifndef GTEST_HAS_POSIX_RE -# if GTEST_OS_LINUX_ANDROID -// On Android, is only available starting with Gingerbread. -# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) -# else -# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) -# endif -#endif - -#if GTEST_USES_PCRE -// The appropriate headers have already been included. - -#elif GTEST_HAS_POSIX_RE - -// On some platforms, needs someone to define size_t, and -// won't compile otherwise. We can #include it here as we already -// included , which is guaranteed to define size_t through -// . -# include // NOLINT - -# define GTEST_USES_POSIX_RE 1 - -#elif GTEST_OS_WINDOWS - -// is not available on Windows. Use our own simple regex -// implementation instead. -# define GTEST_USES_SIMPLE_RE 1 - -#else - -// may not be available on this platform. Use our own -// simple regex implementation instead. -# define GTEST_USES_SIMPLE_RE 1 - -#endif // GTEST_USES_PCRE - -#ifndef GTEST_HAS_EXCEPTIONS -// The user didn't tell us whether exceptions are enabled, so we need -// to figure it out. -# if defined(_MSC_VER) && defined(_CPPUNWIND) -// MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled. -# define GTEST_HAS_EXCEPTIONS 1 -# elif defined(__BORLANDC__) -// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS -// macro to enable exceptions, so we'll do the same. -// Assumes that exceptions are enabled by default. -# ifndef _HAS_EXCEPTIONS -# define _HAS_EXCEPTIONS 1 -# endif // _HAS_EXCEPTIONS -# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS -# elif defined(__clang__) -// clang defines __EXCEPTIONS if and only if exceptions are enabled before clang -// 220714, but if and only if cleanups are enabled after that. In Obj-C++ files, -// there can be cleanups for ObjC exceptions which also need cleanups, even if -// C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which -// checks for C++ exceptions starting at clang r206352, but which checked for -// cleanups prior to that. To reliably check for C++ exception availability with -// clang, check for -// __EXCEPTIONS && __has_feature(cxx_exceptions). -# define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) -# elif defined(__GNUC__) && __EXCEPTIONS -// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled. -# define GTEST_HAS_EXCEPTIONS 1 -# elif defined(__SUNPRO_CC) -// Sun Pro CC supports exceptions. However, there is no compile-time way of -// detecting whether they are enabled or not. Therefore, we assume that -// they are enabled unless the user tells us otherwise. -# define GTEST_HAS_EXCEPTIONS 1 -# elif defined(__IBMCPP__) && __EXCEPTIONS -// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled. -# define GTEST_HAS_EXCEPTIONS 1 -# elif defined(__HP_aCC) -// Exception handling is in effect by default in HP aCC compiler. It has to -// be turned of by +noeh compiler option if desired. -# define GTEST_HAS_EXCEPTIONS 1 -# else -// For other compilers, we assume exceptions are disabled to be -// conservative. -# define GTEST_HAS_EXCEPTIONS 0 -# endif // defined(_MSC_VER) || defined(__BORLANDC__) -#endif // GTEST_HAS_EXCEPTIONS - -#ifndef GTEST_HAS_STD_WSTRING -// The user didn't tell us whether ::std::wstring is available, so we need -// to figure it out. -// Cygwin 1.7 and below doesn't support ::std::wstring. -// Solaris' libc++ doesn't support it either. Android has -// no support for it at least as recent as Froyo (2.2). -#define GTEST_HAS_STD_WSTRING \ - (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ - GTEST_OS_HAIKU || GTEST_OS_ESP32 || GTEST_OS_ESP8266)) - -#endif // GTEST_HAS_STD_WSTRING - -// Determines whether RTTI is available. -#ifndef GTEST_HAS_RTTI -// The user didn't tell us whether RTTI is enabled, so we need to -// figure it out. - -# ifdef _MSC_VER - -#ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled. -# define GTEST_HAS_RTTI 1 -# else -# define GTEST_HAS_RTTI 0 -# endif - -// Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is -// enabled. -# elif defined(__GNUC__) - -# ifdef __GXX_RTTI -// When building against STLport with the Android NDK and with -// -frtti -fno-exceptions, the build fails at link time with undefined -// references to __cxa_bad_typeid. Note sure if STL or toolchain bug, -// so disable RTTI when detected. -# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ - !defined(__EXCEPTIONS) -# define GTEST_HAS_RTTI 0 -# else -# define GTEST_HAS_RTTI 1 -# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS -# else -# define GTEST_HAS_RTTI 0 -# endif // __GXX_RTTI - -// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends -// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the -// first version with C++ support. -# elif defined(__clang__) - -# define GTEST_HAS_RTTI __has_feature(cxx_rtti) - -// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if -// both the typeid and dynamic_cast features are present. -# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) - -# ifdef __RTTI_ALL__ -# define GTEST_HAS_RTTI 1 -# else -# define GTEST_HAS_RTTI 0 -# endif - -# else - -// For all other compilers, we assume RTTI is enabled. -# define GTEST_HAS_RTTI 1 - -# endif // _MSC_VER - -#endif // GTEST_HAS_RTTI - -// It's this header's responsibility to #include when RTTI -// is enabled. -#if GTEST_HAS_RTTI -# include -#endif - -// Determines whether Google Test can use the pthreads library. -#ifndef GTEST_HAS_PTHREAD -// The user didn't tell us explicitly, so we make reasonable assumptions about -// which platforms have pthreads support. -// -// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 -// to your compiler flags. -#define GTEST_HAS_PTHREAD \ - (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \ - GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ - GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \ - GTEST_OS_HAIKU) -#endif // GTEST_HAS_PTHREAD - -#if GTEST_HAS_PTHREAD -// gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is -// true. -# include // NOLINT - -// For timespec and nanosleep, used below. -# include // NOLINT -#endif - -// Determines whether clone(2) is supported. -// Usually it will only be available on Linux, excluding -// Linux on the Itanium architecture. -// Also see http://linux.die.net/man/2/clone. -#ifndef GTEST_HAS_CLONE -// The user didn't tell us, so we need to figure it out. - -# if GTEST_OS_LINUX && !defined(__ia64__) -# if GTEST_OS_LINUX_ANDROID -// On Android, clone() became available at different API levels for each 32-bit -// architecture. -# if defined(__LP64__) || \ - (defined(__arm__) && __ANDROID_API__ >= 9) || \ - (defined(__mips__) && __ANDROID_API__ >= 12) || \ - (defined(__i386__) && __ANDROID_API__ >= 17) -# define GTEST_HAS_CLONE 1 -# else -# define GTEST_HAS_CLONE 0 -# endif -# else -# define GTEST_HAS_CLONE 1 -# endif -# else -# define GTEST_HAS_CLONE 0 -# endif // GTEST_OS_LINUX && !defined(__ia64__) - -#endif // GTEST_HAS_CLONE - -// Determines whether to support stream redirection. This is used to test -// output correctness and to implement death tests. -#ifndef GTEST_HAS_STREAM_REDIRECTION -// By default, we assume that stream redirection is supported on all -// platforms except known mobile ones. -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ - GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 -# define GTEST_HAS_STREAM_REDIRECTION 0 -# else -# define GTEST_HAS_STREAM_REDIRECTION 1 -# endif // !GTEST_OS_WINDOWS_MOBILE -#endif // GTEST_HAS_STREAM_REDIRECTION - -// Determines whether to support death tests. -// pops up a dialog window that cannot be suppressed programmatically. -#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ - (GTEST_OS_MAC && !GTEST_OS_IOS) || \ - (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \ - GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \ - GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ - GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU) -# define GTEST_HAS_DEATH_TEST 1 -#endif - -// Determines whether to support type-driven tests. - -// Typed tests need and variadic macros, which GCC, VC++ 8.0, -// Sun Pro CC, IBM Visual Age, and HP aCC support. -#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \ - defined(__IBMCPP__) || defined(__HP_aCC) -# define GTEST_HAS_TYPED_TEST 1 -# define GTEST_HAS_TYPED_TEST_P 1 -#endif - -// Determines whether the system compiler uses UTF-16 for encoding wide strings. -#define GTEST_WIDE_STRING_USES_UTF16_ \ - (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2) - -// Determines whether test results can be streamed to a socket. -#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \ - GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD -# define GTEST_CAN_STREAM_RESULTS_ 1 -#endif - -// Defines some utility macros. - -// The GNU compiler emits a warning if nested "if" statements are followed by -// an "else" statement and braces are not used to explicitly disambiguate the -// "else" binding. This leads to problems with code like: -// -// if (gate) -// ASSERT_*(condition) << "Some message"; -// -// The "switch (0) case 0:" idiom is used to suppress this. -#ifdef __INTEL_COMPILER -# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ -#else -# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT -#endif - -// Use this annotation at the end of a struct/class definition to -// prevent the compiler from optimizing away instances that are never -// used. This is useful when all interesting logic happens inside the -// c'tor and / or d'tor. Example: -// -// struct Foo { -// Foo() { ... } -// } GTEST_ATTRIBUTE_UNUSED_; -// -// Also use it after a variable or parameter declaration to tell the -// compiler the variable/parameter does not have to be used. -#if defined(__GNUC__) && !defined(COMPILER_ICC) -# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) -#elif defined(__clang__) -# if __has_attribute(unused) -# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) -# endif -#endif -#ifndef GTEST_ATTRIBUTE_UNUSED_ -# define GTEST_ATTRIBUTE_UNUSED_ -#endif - -// Use this annotation before a function that takes a printf format string. -#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC) -# if defined(__MINGW_PRINTF_FORMAT) -// MinGW has two different printf implementations. Ensure the format macro -// matches the selected implementation. See -// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/. -# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ - __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \ - first_to_check))) -# else -# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ - __attribute__((__format__(__printf__, string_index, first_to_check))) -# endif -#else -# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) -#endif - - -// A macro to disallow operator= -// This should be used in the private: declarations for a class. -#define GTEST_DISALLOW_ASSIGN_(type) \ - void operator=(type const &) = delete - -// A macro to disallow copy constructor and operator= -// This should be used in the private: declarations for a class. -#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ - type(type const &) = delete; \ - GTEST_DISALLOW_ASSIGN_(type) - -// Tell the compiler to warn about unused return values for functions declared -// with this macro. The macro should be used on function declarations -// following the argument list: -// -// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; -#if defined(__GNUC__) && !defined(COMPILER_ICC) -# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) -#else -# define GTEST_MUST_USE_RESULT_ -#endif // __GNUC__ && !COMPILER_ICC - -// MS C++ compiler emits warning when a conditional expression is compile time -// constant. In some contexts this warning is false positive and needs to be -// suppressed. Use the following two macros in such cases: -// -// GTEST_INTENTIONAL_CONST_COND_PUSH_() -// while (true) { -// GTEST_INTENTIONAL_CONST_COND_POP_() -// } -# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) -# define GTEST_INTENTIONAL_CONST_COND_POP_() \ - GTEST_DISABLE_MSC_WARNINGS_POP_() - -// Determine whether the compiler supports Microsoft's Structured Exception -// Handling. This is supported by several Windows compilers but generally -// does not exist on any other system. -#ifndef GTEST_HAS_SEH -// The user didn't tell us, so we need to figure it out. - -# if defined(_MSC_VER) || defined(__BORLANDC__) -// These two compilers are known to support SEH. -# define GTEST_HAS_SEH 1 -# else -// Assume no SEH. -# define GTEST_HAS_SEH 0 -# endif - -#endif // GTEST_HAS_SEH - -#ifndef GTEST_IS_THREADSAFE - -#define GTEST_IS_THREADSAFE \ - (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \ - (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \ - GTEST_HAS_PTHREAD) - -#endif // GTEST_IS_THREADSAFE - -// GTEST_API_ qualifies all symbols that must be exported. The definitions below -// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in -// gtest/internal/custom/gtest-port.h -#ifndef GTEST_API_ - -#ifdef _MSC_VER -# if GTEST_LINKED_AS_SHARED_LIBRARY -# define GTEST_API_ __declspec(dllimport) -# elif GTEST_CREATE_SHARED_LIBRARY -# define GTEST_API_ __declspec(dllexport) -# endif -#elif __GNUC__ >= 4 || defined(__clang__) -# define GTEST_API_ __attribute__((visibility ("default"))) -#endif // _MSC_VER - -#endif // GTEST_API_ - -#ifndef GTEST_API_ -# define GTEST_API_ -#endif // GTEST_API_ - -#ifndef GTEST_DEFAULT_DEATH_TEST_STYLE -# define GTEST_DEFAULT_DEATH_TEST_STYLE "fast" -#endif // GTEST_DEFAULT_DEATH_TEST_STYLE - -#ifdef __GNUC__ -// Ask the compiler to never inline a given function. -# define GTEST_NO_INLINE_ __attribute__((noinline)) -#else -# define GTEST_NO_INLINE_ -#endif - -// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project. -#if !defined(GTEST_HAS_CXXABI_H_) -# if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) -# define GTEST_HAS_CXXABI_H_ 1 -# else -# define GTEST_HAS_CXXABI_H_ 0 -# endif -#endif - -// A function level attribute to disable checking for use of uninitialized -// memory when built with MemorySanitizer. -#if defined(__clang__) -# if __has_feature(memory_sanitizer) -# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ - __attribute__((no_sanitize_memory)) -# else -# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -# endif // __has_feature(memory_sanitizer) -#else -# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -#endif // __clang__ - -// A function level attribute to disable AddressSanitizer instrumentation. -#if defined(__clang__) -# if __has_feature(address_sanitizer) -# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ - __attribute__((no_sanitize_address)) -# else -# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -# endif // __has_feature(address_sanitizer) -#else -# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -#endif // __clang__ - -// A function level attribute to disable HWAddressSanitizer instrumentation. -#if defined(__clang__) -# if __has_feature(hwaddress_sanitizer) -# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \ - __attribute__((no_sanitize("hwaddress"))) -# else -# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -# endif // __has_feature(hwaddress_sanitizer) -#else -# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -#endif // __clang__ - -// A function level attribute to disable ThreadSanitizer instrumentation. -#if defined(__clang__) -# if __has_feature(thread_sanitizer) -# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ - __attribute__((no_sanitize_thread)) -# else -# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ -# endif // __has_feature(thread_sanitizer) -#else -# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ -#endif // __clang__ - -namespace testing { - -class Message; - -// Legacy imports for backwards compatibility. -// New code should use std:: names directly. -using std::get; -using std::make_tuple; -using std::tuple; -using std::tuple_element; -using std::tuple_size; - -namespace internal { - -// A secret type that Google Test users don't know about. It has no -// definition on purpose. Therefore it's impossible to create a -// Secret object, which is what we want. -class Secret; - -// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile -// time expression is true (in new code, use static_assert instead). For -// example, you could use it to verify the size of a static array: -// -// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES, -// names_incorrect_size); -// -// The second argument to the macro must be a valid C++ identifier. If the -// expression is false, compiler will issue an error containing this identifier. -#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) - -// A helper for suppressing warnings on constant condition. It just -// returns 'condition'. -GTEST_API_ bool IsTrue(bool condition); - -// Defines RE. - -#if GTEST_USES_PCRE -// if used, PCRE is injected by custom/gtest-port.h -#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE - -// A simple C++ wrapper for . It uses the POSIX Extended -// Regular Expression syntax. -class GTEST_API_ RE { - public: - // A copy constructor is required by the Standard to initialize object - // references from r-values. - RE(const RE& other) { Init(other.pattern()); } - - // Constructs an RE from a string. - RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT - - RE(const char* regex) { Init(regex); } // NOLINT - ~RE(); - - // Returns the string representation of the regex. - const char* pattern() const { return pattern_; } - - // FullMatch(str, re) returns true if and only if regular expression re - // matches the entire str. - // PartialMatch(str, re) returns true if and only if regular expression re - // matches a substring of str (including str itself). - static bool FullMatch(const ::std::string& str, const RE& re) { - return FullMatch(str.c_str(), re); - } - static bool PartialMatch(const ::std::string& str, const RE& re) { - return PartialMatch(str.c_str(), re); - } - - static bool FullMatch(const char* str, const RE& re); - static bool PartialMatch(const char* str, const RE& re); - - private: - void Init(const char* regex); - const char* pattern_; - bool is_valid_; - -# if GTEST_USES_POSIX_RE - - regex_t full_regex_; // For FullMatch(). - regex_t partial_regex_; // For PartialMatch(). - -# else // GTEST_USES_SIMPLE_RE - - const char* full_pattern_; // For FullMatch(); - -# endif - - GTEST_DISALLOW_ASSIGN_(RE); -}; - -#endif // GTEST_USES_PCRE - -// Formats a source file path and a line number as they would appear -// in an error message from the compiler used to compile this code. -GTEST_API_ ::std::string FormatFileLocation(const char* file, int line); - -// Formats a file location for compiler-independent XML output. -// Although this function is not platform dependent, we put it next to -// FormatFileLocation in order to contrast the two functions. -GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, - int line); - -// Defines logging utilities: -// GTEST_LOG_(severity) - logs messages at the specified severity level. The -// message itself is streamed into the macro. -// LogToStderr() - directs all log messages to stderr. -// FlushInfoLog() - flushes informational log messages. - -enum GTestLogSeverity { - GTEST_INFO, - GTEST_WARNING, - GTEST_ERROR, - GTEST_FATAL -}; - -// Formats log entry severity, provides a stream object for streaming the -// log message, and terminates the message with a newline when going out of -// scope. -class GTEST_API_ GTestLog { - public: - GTestLog(GTestLogSeverity severity, const char* file, int line); - - // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. - ~GTestLog(); - - ::std::ostream& GetStream() { return ::std::cerr; } - - private: - const GTestLogSeverity severity_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); -}; - -#if !defined(GTEST_LOG_) - -# define GTEST_LOG_(severity) \ - ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ - __FILE__, __LINE__).GetStream() - -inline void LogToStderr() {} -inline void FlushInfoLog() { fflush(nullptr); } - -#endif // !defined(GTEST_LOG_) - -#if !defined(GTEST_CHECK_) -// INTERNAL IMPLEMENTATION - DO NOT USE. -// -// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition -// is not satisfied. -// Synopsys: -// GTEST_CHECK_(boolean_condition); -// or -// GTEST_CHECK_(boolean_condition) << "Additional message"; -// -// This checks the condition and if the condition is not satisfied -// it prints message about the condition violation, including the -// condition itself, plus additional message streamed into it, if any, -// and then it aborts the program. It aborts the program irrespective of -// whether it is built in the debug mode or not. -# define GTEST_CHECK_(condition) \ - GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (::testing::internal::IsTrue(condition)) \ - ; \ - else \ - GTEST_LOG_(FATAL) << "Condition " #condition " failed. " -#endif // !defined(GTEST_CHECK_) - -// An all-mode assert to verify that the given POSIX-style function -// call returns 0 (indicating success). Known limitation: this -// doesn't expand to a balanced 'if' statement, so enclose the macro -// in {} if you need to use it as the only statement in an 'if' -// branch. -#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ - if (const int gtest_error = (posix_call)) \ - GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ - << gtest_error - -// Transforms "T" into "const T&" according to standard reference collapsing -// rules (this is only needed as a backport for C++98 compilers that do not -// support reference collapsing). Specifically, it transforms: -// -// char ==> const char& -// const char ==> const char& -// char& ==> char& -// const char& ==> const char& -// -// Note that the non-const reference will not have "const" added. This is -// standard, and necessary so that "T" can always bind to "const T&". -template -struct ConstRef { typedef const T& type; }; -template -struct ConstRef { typedef T& type; }; - -// The argument T must depend on some template parameters. -#define GTEST_REFERENCE_TO_CONST_(T) \ - typename ::testing::internal::ConstRef::type - -// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. -// -// Use ImplicitCast_ as a safe version of static_cast for upcasting in -// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a -// const Foo*). When you use ImplicitCast_, the compiler checks that -// the cast is safe. Such explicit ImplicitCast_s are necessary in -// surprisingly many situations where C++ demands an exact type match -// instead of an argument type convertable to a target type. -// -// The syntax for using ImplicitCast_ is the same as for static_cast: -// -// ImplicitCast_(expr) -// -// ImplicitCast_ would have been part of the C++ standard library, -// but the proposal was submitted too late. It will probably make -// its way into the language in the future. -// -// This relatively ugly name is intentional. It prevents clashes with -// similar functions users may have (e.g., implicit_cast). The internal -// namespace alone is not enough because the function can be found by ADL. -template -inline To ImplicitCast_(To x) { return x; } - -// When you upcast (that is, cast a pointer from type Foo to type -// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts -// always succeed. When you downcast (that is, cast a pointer from -// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because -// how do you know the pointer is really of type SubclassOfFoo? It -// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, -// when you downcast, you should use this macro. In debug mode, we -// use dynamic_cast<> to double-check the downcast is legal (we die -// if it's not). In normal mode, we do the efficient static_cast<> -// instead. Thus, it's important to test in debug mode to make sure -// the cast is legal! -// This is the only place in the code we should use dynamic_cast<>. -// In particular, you SHOULDN'T be using dynamic_cast<> in order to -// do RTTI (eg code like this: -// if (dynamic_cast(foo)) HandleASubclass1Object(foo); -// if (dynamic_cast(foo)) HandleASubclass2Object(foo); -// You should design the code some other way not to need this. -// -// This relatively ugly name is intentional. It prevents clashes with -// similar functions users may have (e.g., down_cast). The internal -// namespace alone is not enough because the function can be found by ADL. -template // use like this: DownCast_(foo); -inline To DownCast_(From* f) { // so we only accept pointers - // Ensures that To is a sub-type of From *. This test is here only - // for compile-time type checking, and has no overhead in an - // optimized build at run-time, as it will be optimized away - // completely. - GTEST_INTENTIONAL_CONST_COND_PUSH_() - if (false) { - GTEST_INTENTIONAL_CONST_COND_POP_() - const To to = nullptr; - ::testing::internal::ImplicitCast_(to); - } - -#if GTEST_HAS_RTTI - // RTTI: debug mode only! - GTEST_CHECK_(f == nullptr || dynamic_cast(f) != nullptr); -#endif - return static_cast(f); -} - -// Downcasts the pointer of type Base to Derived. -// Derived must be a subclass of Base. The parameter MUST -// point to a class of type Derived, not any subclass of it. -// When RTTI is available, the function performs a runtime -// check to enforce this. -template -Derived* CheckedDowncastToActualType(Base* base) { -#if GTEST_HAS_RTTI - GTEST_CHECK_(typeid(*base) == typeid(Derived)); -#endif - -#if GTEST_HAS_DOWNCAST_ - return ::down_cast(base); -#elif GTEST_HAS_RTTI - return dynamic_cast(base); // NOLINT -#else - return static_cast(base); // Poor man's downcast. -#endif -} - -#if GTEST_HAS_STREAM_REDIRECTION - -// Defines the stderr capturer: -// CaptureStdout - starts capturing stdout. -// GetCapturedStdout - stops capturing stdout and returns the captured string. -// CaptureStderr - starts capturing stderr. -// GetCapturedStderr - stops capturing stderr and returns the captured string. -// -GTEST_API_ void CaptureStdout(); -GTEST_API_ std::string GetCapturedStdout(); -GTEST_API_ void CaptureStderr(); -GTEST_API_ std::string GetCapturedStderr(); - -#endif // GTEST_HAS_STREAM_REDIRECTION -// Returns the size (in bytes) of a file. -GTEST_API_ size_t GetFileSize(FILE* file); - -// Reads the entire content of a file as a string. -GTEST_API_ std::string ReadEntireFile(FILE* file); - -// All command line arguments. -GTEST_API_ std::vector GetArgvs(); - -#if GTEST_HAS_DEATH_TEST - -std::vector GetInjectableArgvs(); -// Deprecated: pass the args vector by value instead. -void SetInjectableArgvs(const std::vector* new_argvs); -void SetInjectableArgvs(const std::vector& new_argvs); -void ClearInjectableArgvs(); - -#endif // GTEST_HAS_DEATH_TEST - -// Defines synchronization primitives. -#if GTEST_IS_THREADSAFE -# if GTEST_HAS_PTHREAD -// Sleeps for (roughly) n milliseconds. This function is only for testing -// Google Test's own constructs. Don't use it in user tests, either -// directly or indirectly. -inline void SleepMilliseconds(int n) { - const timespec time = { - 0, // 0 seconds. - n * 1000L * 1000L, // And n ms. - }; - nanosleep(&time, nullptr); -} -# endif // GTEST_HAS_PTHREAD - -# if GTEST_HAS_NOTIFICATION_ -// Notification has already been imported into the namespace. -// Nothing to do here. - -# elif GTEST_HAS_PTHREAD -// Allows a controller thread to pause execution of newly created -// threads until notified. Instances of this class must be created -// and destroyed in the controller thread. -// -// This class is only for testing Google Test's own constructs. Do not -// use it in user tests, either directly or indirectly. -class Notification { - public: - Notification() : notified_(false) { - GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); - } - ~Notification() { - pthread_mutex_destroy(&mutex_); - } - - // Notifies all threads created with this notification to start. Must - // be called from the controller thread. - void Notify() { - pthread_mutex_lock(&mutex_); - notified_ = true; - pthread_mutex_unlock(&mutex_); - } - - // Blocks until the controller thread notifies. Must be called from a test - // thread. - void WaitForNotification() { - for (;;) { - pthread_mutex_lock(&mutex_); - const bool notified = notified_; - pthread_mutex_unlock(&mutex_); - if (notified) - break; - SleepMilliseconds(10); - } - } - - private: - pthread_mutex_t mutex_; - bool notified_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); -}; - -# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT - -GTEST_API_ void SleepMilliseconds(int n); - -// Provides leak-safe Windows kernel handle ownership. -// Used in death tests and in threading support. -class GTEST_API_ AutoHandle { - public: - // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to - // avoid including in this header file. Including is - // undesirable because it defines a lot of symbols and macros that tend to - // conflict with client code. This assumption is verified by - // WindowsTypesTest.HANDLEIsVoidStar. - typedef void* Handle; - AutoHandle(); - explicit AutoHandle(Handle handle); - - ~AutoHandle(); - - Handle Get() const; - void Reset(); - void Reset(Handle handle); - - private: - // Returns true if and only if the handle is a valid handle object that can be - // closed. - bool IsCloseable() const; - - Handle handle_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); -}; - -// Allows a controller thread to pause execution of newly created -// threads until notified. Instances of this class must be created -// and destroyed in the controller thread. -// -// This class is only for testing Google Test's own constructs. Do not -// use it in user tests, either directly or indirectly. -class GTEST_API_ Notification { - public: - Notification(); - void Notify(); - void WaitForNotification(); - - private: - AutoHandle event_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); -}; -# endif // GTEST_HAS_NOTIFICATION_ - -// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD -// defined, but we don't want to use MinGW's pthreads implementation, which -// has conformance problems with some versions of the POSIX standard. -# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW - -// As a C-function, ThreadFuncWithCLinkage cannot be templated itself. -// Consequently, it cannot select a correct instantiation of ThreadWithParam -// in order to call its Run(). Introducing ThreadWithParamBase as a -// non-templated base class for ThreadWithParam allows us to bypass this -// problem. -class ThreadWithParamBase { - public: - virtual ~ThreadWithParamBase() {} - virtual void Run() = 0; -}; - -// pthread_create() accepts a pointer to a function type with the C linkage. -// According to the Standard (7.5/1), function types with different linkages -// are different even if they are otherwise identical. Some compilers (for -// example, SunStudio) treat them as different types. Since class methods -// cannot be defined with C-linkage we need to define a free C-function to -// pass into pthread_create(). -extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { - static_cast(thread)->Run(); - return nullptr; -} - -// Helper class for testing Google Test's multi-threading constructs. -// To use it, write: -// -// void ThreadFunc(int param) { /* Do things with param */ } -// Notification thread_can_start; -// ... -// // The thread_can_start parameter is optional; you can supply NULL. -// ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); -// thread_can_start.Notify(); -// -// These classes are only for testing Google Test's own constructs. Do -// not use them in user tests, either directly or indirectly. -template -class ThreadWithParam : public ThreadWithParamBase { - public: - typedef void UserThreadFunc(T); - - ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) - : func_(func), - param_(param), - thread_can_start_(thread_can_start), - finished_(false) { - ThreadWithParamBase* const base = this; - // The thread can be created only after all fields except thread_ - // have been initialized. - GTEST_CHECK_POSIX_SUCCESS_( - pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base)); - } - ~ThreadWithParam() override { Join(); } - - void Join() { - if (!finished_) { - GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr)); - finished_ = true; - } - } - - void Run() override { - if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification(); - func_(param_); - } - - private: - UserThreadFunc* const func_; // User-supplied thread function. - const T param_; // User-supplied parameter to the thread function. - // When non-NULL, used to block execution until the controller thread - // notifies. - Notification* const thread_can_start_; - bool finished_; // true if and only if we know that the thread function has - // finished. - pthread_t thread_; // The native thread object. - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); -}; -# endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD || - // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - -# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ -// Mutex and ThreadLocal have already been imported into the namespace. -// Nothing to do here. - -# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT - -// Mutex implements mutex on Windows platforms. It is used in conjunction -// with class MutexLock: -// -// Mutex mutex; -// ... -// MutexLock lock(&mutex); // Acquires the mutex and releases it at the -// // end of the current scope. -// -// A static Mutex *must* be defined or declared using one of the following -// macros: -// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); -// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); -// -// (A non-static Mutex is defined/declared in the usual way). -class GTEST_API_ Mutex { - public: - enum MutexType { kStatic = 0, kDynamic = 1 }; - // We rely on kStaticMutex being 0 as it is to what the linker initializes - // type_ in static mutexes. critical_section_ will be initialized lazily - // in ThreadSafeLazyInit(). - enum StaticConstructorSelector { kStaticMutex = 0 }; - - // This constructor intentionally does nothing. It relies on type_ being - // statically initialized to 0 (effectively setting it to kStatic) and on - // ThreadSafeLazyInit() to lazily initialize the rest of the members. - explicit Mutex(StaticConstructorSelector /*dummy*/) {} - - Mutex(); - ~Mutex(); - - void Lock(); - - void Unlock(); - - // Does nothing if the current thread holds the mutex. Otherwise, crashes - // with high probability. - void AssertHeld(); - - private: - // Initializes owner_thread_id_ and critical_section_ in static mutexes. - void ThreadSafeLazyInit(); - - // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503, - // we assume that 0 is an invalid value for thread IDs. - unsigned int owner_thread_id_; - - // For static mutexes, we rely on these members being initialized to zeros - // by the linker. - MutexType type_; - long critical_section_init_phase_; // NOLINT - GTEST_CRITICAL_SECTION* critical_section_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); -}; - -# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ - extern ::testing::internal::Mutex mutex - -# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ - ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) - -// We cannot name this class MutexLock because the ctor declaration would -// conflict with a macro named MutexLock, which is defined on some -// platforms. That macro is used as a defensive measure to prevent against -// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than -// "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { - public: - explicit GTestMutexLock(Mutex* mutex) - : mutex_(mutex) { mutex_->Lock(); } - - ~GTestMutexLock() { mutex_->Unlock(); } - - private: - Mutex* const mutex_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); -}; - -typedef GTestMutexLock MutexLock; - -// Base class for ValueHolder. Allows a caller to hold and delete a value -// without knowing its type. -class ThreadLocalValueHolderBase { - public: - virtual ~ThreadLocalValueHolderBase() {} -}; - -// Provides a way for a thread to send notifications to a ThreadLocal -// regardless of its parameter type. -class ThreadLocalBase { - public: - // Creates a new ValueHolder object holding a default value passed to - // this ThreadLocal's constructor and returns it. It is the caller's - // responsibility not to call this when the ThreadLocal instance already - // has a value on the current thread. - virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0; - - protected: - ThreadLocalBase() {} - virtual ~ThreadLocalBase() {} - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase); -}; - -// Maps a thread to a set of ThreadLocals that have values instantiated on that -// thread and notifies them when the thread exits. A ThreadLocal instance is -// expected to persist until all threads it has values on have terminated. -class GTEST_API_ ThreadLocalRegistry { - public: - // Registers thread_local_instance as having value on the current thread. - // Returns a value that can be used to identify the thread from other threads. - static ThreadLocalValueHolderBase* GetValueOnCurrentThread( - const ThreadLocalBase* thread_local_instance); - - // Invoked when a ThreadLocal instance is destroyed. - static void OnThreadLocalDestroyed( - const ThreadLocalBase* thread_local_instance); -}; - -class GTEST_API_ ThreadWithParamBase { - public: - void Join(); - - protected: - class Runnable { - public: - virtual ~Runnable() {} - virtual void Run() = 0; - }; - - ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start); - virtual ~ThreadWithParamBase(); - - private: - AutoHandle thread_; -}; - -// Helper class for testing Google Test's multi-threading constructs. -template -class ThreadWithParam : public ThreadWithParamBase { - public: - typedef void UserThreadFunc(T); - - ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) - : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) { - } - virtual ~ThreadWithParam() {} - - private: - class RunnableImpl : public Runnable { - public: - RunnableImpl(UserThreadFunc* func, T param) - : func_(func), - param_(param) { - } - virtual ~RunnableImpl() {} - virtual void Run() { - func_(param_); - } - - private: - UserThreadFunc* const func_; - const T param_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl); - }; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); -}; - -// Implements thread-local storage on Windows systems. -// -// // Thread 1 -// ThreadLocal tl(100); // 100 is the default value for each thread. -// -// // Thread 2 -// tl.set(150); // Changes the value for thread 2 only. -// EXPECT_EQ(150, tl.get()); -// -// // Thread 1 -// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. -// tl.set(200); -// EXPECT_EQ(200, tl.get()); -// -// The template type argument T must have a public copy constructor. -// In addition, the default ThreadLocal constructor requires T to have -// a public default constructor. -// -// The users of a TheadLocal instance have to make sure that all but one -// threads (including the main one) using that instance have exited before -// destroying it. Otherwise, the per-thread objects managed for them by the -// ThreadLocal instance are not guaranteed to be destroyed on all platforms. -// -// Google Test only uses global ThreadLocal objects. That means they -// will die after main() has returned. Therefore, no per-thread -// object managed by Google Test will be leaked as long as all threads -// using Google Test have exited when main() returns. -template -class ThreadLocal : public ThreadLocalBase { - public: - ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {} - explicit ThreadLocal(const T& value) - : default_factory_(new InstanceValueHolderFactory(value)) {} - - ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); } - - T* pointer() { return GetOrCreateValue(); } - const T* pointer() const { return GetOrCreateValue(); } - const T& get() const { return *pointer(); } - void set(const T& value) { *pointer() = value; } - - private: - // Holds a value of T. Can be deleted via its base class without the caller - // knowing the type of T. - class ValueHolder : public ThreadLocalValueHolderBase { - public: - ValueHolder() : value_() {} - explicit ValueHolder(const T& value) : value_(value) {} - - T* pointer() { return &value_; } - - private: - T value_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); - }; - - - T* GetOrCreateValue() const { - return static_cast( - ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer(); - } - - virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const { - return default_factory_->MakeNewHolder(); - } - - class ValueHolderFactory { - public: - ValueHolderFactory() {} - virtual ~ValueHolderFactory() {} - virtual ValueHolder* MakeNewHolder() const = 0; - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); - }; - - class DefaultValueHolderFactory : public ValueHolderFactory { - public: - DefaultValueHolderFactory() {} - ValueHolder* MakeNewHolder() const override { return new ValueHolder(); } - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); - }; - - class InstanceValueHolderFactory : public ValueHolderFactory { - public: - explicit InstanceValueHolderFactory(const T& value) : value_(value) {} - ValueHolder* MakeNewHolder() const override { - return new ValueHolder(value_); - } - - private: - const T value_; // The value for each thread. - - GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); - }; - - std::unique_ptr default_factory_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); -}; - -# elif GTEST_HAS_PTHREAD - -// MutexBase and Mutex implement mutex on pthreads-based platforms. -class MutexBase { - public: - // Acquires this mutex. - void Lock() { - GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); - owner_ = pthread_self(); - has_owner_ = true; - } - - // Releases this mutex. - void Unlock() { - // Since the lock is being released the owner_ field should no longer be - // considered valid. We don't protect writing to has_owner_ here, as it's - // the caller's responsibility to ensure that the current thread holds the - // mutex when this is called. - has_owner_ = false; - GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); - } - - // Does nothing if the current thread holds the mutex. Otherwise, crashes - // with high probability. - void AssertHeld() const { - GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self())) - << "The current thread is not holding the mutex @" << this; - } - - // A static mutex may be used before main() is entered. It may even - // be used before the dynamic initialization stage. Therefore we - // must be able to initialize a static mutex object at link time. - // This means MutexBase has to be a POD and its member variables - // have to be public. - public: - pthread_mutex_t mutex_; // The underlying pthread mutex. - // has_owner_ indicates whether the owner_ field below contains a valid thread - // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All - // accesses to the owner_ field should be protected by a check of this field. - // An alternative might be to memset() owner_ to all zeros, but there's no - // guarantee that a zero'd pthread_t is necessarily invalid or even different - // from pthread_self(). - bool has_owner_; - pthread_t owner_; // The thread holding the mutex. -}; - -// Forward-declares a static mutex. -# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ - extern ::testing::internal::MutexBase mutex - -// Defines and statically (i.e. at link time) initializes a static mutex. -// The initialization list here does not explicitly initialize each field, -// instead relying on default initialization for the unspecified fields. In -// particular, the owner_ field (a pthread_t) is not explicitly initialized. -// This allows initialization to work whether pthread_t is a scalar or struct. -// The flag -Wmissing-field-initializers must not be specified for this to work. -#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ - ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0} - -// The Mutex class can only be used for mutexes created at runtime. It -// shares its API with MutexBase otherwise. -class Mutex : public MutexBase { - public: - Mutex() { - GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); - has_owner_ = false; - } - ~Mutex() { - GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); - } - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); -}; - -// We cannot name this class MutexLock because the ctor declaration would -// conflict with a macro named MutexLock, which is defined on some -// platforms. That macro is used as a defensive measure to prevent against -// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than -// "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { - public: - explicit GTestMutexLock(MutexBase* mutex) - : mutex_(mutex) { mutex_->Lock(); } - - ~GTestMutexLock() { mutex_->Unlock(); } - - private: - MutexBase* const mutex_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); -}; - -typedef GTestMutexLock MutexLock; - -// Helpers for ThreadLocal. - -// pthread_key_create() requires DeleteThreadLocalValue() to have -// C-linkage. Therefore it cannot be templatized to access -// ThreadLocal. Hence the need for class -// ThreadLocalValueHolderBase. -class ThreadLocalValueHolderBase { - public: - virtual ~ThreadLocalValueHolderBase() {} -}; - -// Called by pthread to delete thread-local data stored by -// pthread_setspecific(). -extern "C" inline void DeleteThreadLocalValue(void* value_holder) { - delete static_cast(value_holder); -} - -// Implements thread-local storage on pthreads-based systems. -template -class GTEST_API_ ThreadLocal { - public: - ThreadLocal() - : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {} - explicit ThreadLocal(const T& value) - : key_(CreateKey()), - default_factory_(new InstanceValueHolderFactory(value)) {} - - ~ThreadLocal() { - // Destroys the managed object for the current thread, if any. - DeleteThreadLocalValue(pthread_getspecific(key_)); - - // Releases resources associated with the key. This will *not* - // delete managed objects for other threads. - GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); - } - - T* pointer() { return GetOrCreateValue(); } - const T* pointer() const { return GetOrCreateValue(); } - const T& get() const { return *pointer(); } - void set(const T& value) { *pointer() = value; } - - private: - // Holds a value of type T. - class ValueHolder : public ThreadLocalValueHolderBase { - public: - ValueHolder() : value_() {} - explicit ValueHolder(const T& value) : value_(value) {} - - T* pointer() { return &value_; } - - private: - T value_; - GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); - }; - - static pthread_key_t CreateKey() { - pthread_key_t key; - // When a thread exits, DeleteThreadLocalValue() will be called on - // the object managed for that thread. - GTEST_CHECK_POSIX_SUCCESS_( - pthread_key_create(&key, &DeleteThreadLocalValue)); - return key; - } - - T* GetOrCreateValue() const { - ThreadLocalValueHolderBase* const holder = - static_cast(pthread_getspecific(key_)); - if (holder != nullptr) { - return CheckedDowncastToActualType(holder)->pointer(); - } - - ValueHolder* const new_holder = default_factory_->MakeNewHolder(); - ThreadLocalValueHolderBase* const holder_base = new_holder; - GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); - return new_holder->pointer(); - } - - class ValueHolderFactory { - public: - ValueHolderFactory() {} - virtual ~ValueHolderFactory() {} - virtual ValueHolder* MakeNewHolder() const = 0; - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); - }; - - class DefaultValueHolderFactory : public ValueHolderFactory { - public: - DefaultValueHolderFactory() {} - ValueHolder* MakeNewHolder() const override { return new ValueHolder(); } - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); - }; - - class InstanceValueHolderFactory : public ValueHolderFactory { - public: - explicit InstanceValueHolderFactory(const T& value) : value_(value) {} - ValueHolder* MakeNewHolder() const override { - return new ValueHolder(value_); - } - - private: - const T value_; // The value for each thread. - - GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); - }; - - // A key pthreads uses for looking up per-thread values. - const pthread_key_t key_; - std::unique_ptr default_factory_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); -}; - -# endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ - -#else // GTEST_IS_THREADSAFE - -// A dummy implementation of synchronization primitives (mutex, lock, -// and thread-local variable). Necessary for compiling Google Test where -// mutex is not supported - using Google Test in multiple threads is not -// supported on such platforms. - -class Mutex { - public: - Mutex() {} - void Lock() {} - void Unlock() {} - void AssertHeld() const {} -}; - -# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ - extern ::testing::internal::Mutex mutex - -# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex - -// We cannot name this class MutexLock because the ctor declaration would -// conflict with a macro named MutexLock, which is defined on some -// platforms. That macro is used as a defensive measure to prevent against -// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than -// "MutexLock l(&mu)". Hence the typedef trick below. -class GTestMutexLock { - public: - explicit GTestMutexLock(Mutex*) {} // NOLINT -}; - -typedef GTestMutexLock MutexLock; - -template -class GTEST_API_ ThreadLocal { - public: - ThreadLocal() : value_() {} - explicit ThreadLocal(const T& value) : value_(value) {} - T* pointer() { return &value_; } - const T* pointer() const { return &value_; } - const T& get() const { return value_; } - void set(const T& value) { value_ = value; } - private: - T value_; -}; - -#endif // GTEST_IS_THREADSAFE - -// Returns the number of threads running in the process, or 0 to indicate that -// we cannot detect it. -GTEST_API_ size_t GetThreadCount(); - -#if GTEST_OS_WINDOWS -# define GTEST_PATH_SEP_ "\\" -# define GTEST_HAS_ALT_PATH_SEP_ 1 -#else -# define GTEST_PATH_SEP_ "/" -# define GTEST_HAS_ALT_PATH_SEP_ 0 -#endif // GTEST_OS_WINDOWS - -// Utilities for char. - -// isspace(int ch) and friends accept an unsigned char or EOF. char -// may be signed, depending on the compiler (or compiler flags). -// Therefore we need to cast a char to unsigned char before calling -// isspace(), etc. - -inline bool IsAlpha(char ch) { - return isalpha(static_cast(ch)) != 0; -} -inline bool IsAlNum(char ch) { - return isalnum(static_cast(ch)) != 0; -} -inline bool IsDigit(char ch) { - return isdigit(static_cast(ch)) != 0; -} -inline bool IsLower(char ch) { - return islower(static_cast(ch)) != 0; -} -inline bool IsSpace(char ch) { - return isspace(static_cast(ch)) != 0; -} -inline bool IsUpper(char ch) { - return isupper(static_cast(ch)) != 0; -} -inline bool IsXDigit(char ch) { - return isxdigit(static_cast(ch)) != 0; -} -inline bool IsXDigit(wchar_t ch) { - const unsigned char low_byte = static_cast(ch); - return ch == low_byte && isxdigit(low_byte) != 0; -} - -inline char ToLower(char ch) { - return static_cast(tolower(static_cast(ch))); -} -inline char ToUpper(char ch) { - return static_cast(toupper(static_cast(ch))); -} - -inline std::string StripTrailingSpaces(std::string str) { - std::string::iterator it = str.end(); - while (it != str.begin() && IsSpace(*--it)) - it = str.erase(it); - return str; -} - -// The testing::internal::posix namespace holds wrappers for common -// POSIX functions. These wrappers hide the differences between -// Windows/MSVC and POSIX systems. Since some compilers define these -// standard functions as macros, the wrapper cannot have the same name -// as the wrapped function. - -namespace posix { - -// Functions with a different name on Windows. - -#if GTEST_OS_WINDOWS - -typedef struct _stat StatStruct; - -# ifdef __BORLANDC__ -inline int IsATTY(int fd) { return isatty(fd); } -inline int StrCaseCmp(const char* s1, const char* s2) { - return stricmp(s1, s2); -} -inline char* StrDup(const char* src) { return strdup(src); } -# else // !__BORLANDC__ -# if GTEST_OS_WINDOWS_MOBILE -inline int IsATTY(int /* fd */) { return 0; } -# else -inline int IsATTY(int fd) { return _isatty(fd); } -# endif // GTEST_OS_WINDOWS_MOBILE -inline int StrCaseCmp(const char* s1, const char* s2) { - return _stricmp(s1, s2); -} -inline char* StrDup(const char* src) { return _strdup(src); } -# endif // __BORLANDC__ - -# if GTEST_OS_WINDOWS_MOBILE -inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } -// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this -// time and thus not defined there. -# else -inline int FileNo(FILE* file) { return _fileno(file); } -inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } -inline int RmDir(const char* dir) { return _rmdir(dir); } -inline bool IsDir(const StatStruct& st) { - return (_S_IFDIR & st.st_mode) != 0; -} -# endif // GTEST_OS_WINDOWS_MOBILE - -#elif GTEST_OS_ESP8266 -typedef struct stat StatStruct; - -inline int FileNo(FILE* file) { return fileno(file); } -inline int IsATTY(int fd) { return isatty(fd); } -inline int Stat(const char* path, StatStruct* buf) { - // stat function not implemented on ESP8266 - return 0; -} -inline int StrCaseCmp(const char* s1, const char* s2) { - return strcasecmp(s1, s2); -} -inline char* StrDup(const char* src) { return strdup(src); } -inline int RmDir(const char* dir) { return rmdir(dir); } -inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } - -#else - -typedef struct stat StatStruct; - -inline int FileNo(FILE* file) { return fileno(file); } -inline int IsATTY(int fd) { return isatty(fd); } -inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } -inline int StrCaseCmp(const char* s1, const char* s2) { - return strcasecmp(s1, s2); -} -inline char* StrDup(const char* src) { return strdup(src); } -inline int RmDir(const char* dir) { return rmdir(dir); } -inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } - -#endif // GTEST_OS_WINDOWS - -// Functions deprecated by MSVC 8.0. - -GTEST_DISABLE_MSC_DEPRECATED_PUSH_() - -// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and -// StrError() aren't needed on Windows CE at this time and thus not -// defined there. - -#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT -inline int ChDir(const char* dir) { return chdir(dir); } -#endif -inline FILE* FOpen(const char* path, const char* mode) { - return fopen(path, mode); -} -#if !GTEST_OS_WINDOWS_MOBILE -inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { - return freopen(path, mode, stream); -} -inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } -#endif -inline int FClose(FILE* fp) { return fclose(fp); } -#if !GTEST_OS_WINDOWS_MOBILE -inline int Read(int fd, void* buf, unsigned int count) { - return static_cast(read(fd, buf, count)); -} -inline int Write(int fd, const void* buf, unsigned int count) { - return static_cast(write(fd, buf, count)); -} -inline int Close(int fd) { return close(fd); } -inline const char* StrError(int errnum) { return strerror(errnum); } -#endif -inline const char* GetEnv(const char* name) { -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ - GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 - // We are on an embedded platform, which has no environment variables. - static_cast(name); // To prevent 'unused argument' warning. - return nullptr; -#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) - // Environment variables which we programmatically clear will be set to the - // empty string rather than unset (NULL). Handle that case. - const char* const env = getenv(name); - return (env != nullptr && env[0] != '\0') ? env : nullptr; -#else - return getenv(name); -#endif -} - -GTEST_DISABLE_MSC_DEPRECATED_POP_() - -#if GTEST_OS_WINDOWS_MOBILE -// Windows CE has no C library. The abort() function is used in -// several places in Google Test. This implementation provides a reasonable -// imitation of standard behaviour. -[[noreturn]] void Abort(); -#else -[[noreturn]] inline void Abort() { abort(); } -#endif // GTEST_OS_WINDOWS_MOBILE - -} // namespace posix - -// MSVC "deprecates" snprintf and issues warnings wherever it is used. In -// order to avoid these warnings, we need to use _snprintf or _snprintf_s on -// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate -// function in order to achieve that. We use macro definition here because -// snprintf is a variadic function. -#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE -// MSVC 2005 and above support variadic macros. -# define GTEST_SNPRINTF_(buffer, size, format, ...) \ - _snprintf_s(buffer, size, size, format, __VA_ARGS__) -#elif defined(_MSC_VER) -// Windows CE does not define _snprintf_s -# define GTEST_SNPRINTF_ _snprintf -#else -# define GTEST_SNPRINTF_ snprintf -#endif - -// This template class serves as a compile-time function from size to -// type. It maps a size in bytes to a primitive type with that -// size. e.g. -// -// TypeWithSize<4>::UInt -// -// is typedef-ed to be unsigned int (unsigned integer made up of 4 -// bytes). -// -// Such functionality should belong to STL, but I cannot find it -// there. -// -// Google Test uses this class in the implementation of floating-point -// comparison. -// -// For now it only handles UInt (unsigned int) as that's all Google Test -// needs. Other types can be easily added in the future if need -// arises. -template -class TypeWithSize { - public: - // This prevents the user from using TypeWithSize with incorrect - // values of N. - typedef void UInt; -}; - -// The specialization for size 4. -template <> -class TypeWithSize<4> { - public: - // unsigned int has size 4 in both gcc and MSVC. - // - // As base/basictypes.h doesn't compile on Windows, we cannot use - // uint32, uint64, and etc here. - typedef int Int; - typedef unsigned int UInt; -}; - -// The specialization for size 8. -template <> -class TypeWithSize<8> { - public: -#if GTEST_OS_WINDOWS - typedef __int64 Int; - typedef unsigned __int64 UInt; -#else - typedef long long Int; // NOLINT - typedef unsigned long long UInt; // NOLINT -#endif // GTEST_OS_WINDOWS -}; - -// Integer types of known sizes. -typedef TypeWithSize<4>::Int Int32; -typedef TypeWithSize<4>::UInt UInt32; -typedef TypeWithSize<8>::Int Int64; -typedef TypeWithSize<8>::UInt UInt64; -typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. - -// Utilities for command line flags and environment variables. - -// Macro for referencing flags. -#if !defined(GTEST_FLAG) -# define GTEST_FLAG(name) FLAGS_gtest_##name -#endif // !defined(GTEST_FLAG) - -#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) -# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1 -#endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) - -#if !defined(GTEST_DECLARE_bool_) -# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver - -// Macros for declaring flags. -# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) -# define GTEST_DECLARE_int32_(name) \ - GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) -# define GTEST_DECLARE_string_(name) \ - GTEST_API_ extern ::std::string GTEST_FLAG(name) - -// Macros for defining flags. -# define GTEST_DEFINE_bool_(name, default_val, doc) \ - GTEST_API_ bool GTEST_FLAG(name) = (default_val) -# define GTEST_DEFINE_int32_(name, default_val, doc) \ - GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) -# define GTEST_DEFINE_string_(name, default_val, doc) \ - GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) - -#endif // !defined(GTEST_DECLARE_bool_) - -// Thread annotations -#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) -# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) -# define GTEST_LOCK_EXCLUDED_(locks) -#endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) - -// Parses 'str' for a 32-bit signed integer. If successful, writes the result -// to *value and returns true; otherwise leaves *value unchanged and returns -// false. -bool ParseInt32(const Message& src_text, const char* str, Int32* value); - -// Parses a bool/Int32/string from the environment variable -// corresponding to the given Google Test flag. -bool BoolFromGTestEnv(const char* flag, bool default_val); -GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); -std::string OutputFlagAlsoCheckEnvVar(); -const char* StringFromGTestEnv(const char* flag, const char* default_val); - -} // namespace internal -} // namespace testing - -#if !defined(GTEST_INTERNAL_DEPRECATED) - -// Internal Macro to mark an API deprecated, for googletest usage only -// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or -// GTEST_INTERNAL_DEPRECATED(message) myFunction(); Every usage of -// a deprecated entity will trigger a warning when compiled with -// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler). -// For msvc /W3 option will need to be used -// Note that for 'other' compilers this macro evaluates to nothing to prevent -// compilations errors. -#if defined(_MSC_VER) -#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) -#elif defined(__GNUC__) -#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) -#else -#define GTEST_INTERNAL_DEPRECATED(message) -#endif - -#endif // !defined(GTEST_INTERNAL_DEPRECATED) - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/core/deps/gtest/internal/gtest-string.h b/core/deps/gtest/internal/gtest-string.h deleted file mode 100644 index 6350c9af5..000000000 --- a/core/deps/gtest/internal/gtest-string.h +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This header file declares the String class and functions used internally by -// Google Test. They are subject to change without notice. They should not used -// by code external to Google Test. -// -// This header file is #included by gtest-internal.h. -// It should not be #included by other files. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ - -#ifdef __BORLANDC__ -// string.h is not guaranteed to provide strcpy on C++ Builder. -# include -#endif - -#include -#include - -#include "gtest-port.h" - -namespace testing { -namespace internal { - -// String - an abstract class holding static string utilities. -class GTEST_API_ String { - public: - // Static utility methods - - // Clones a 0-terminated C string, allocating memory using new. The - // caller is responsible for deleting the return value using - // delete[]. Returns the cloned string, or NULL if the input is - // NULL. - // - // This is different from strdup() in string.h, which allocates - // memory using malloc(). - static const char* CloneCString(const char* c_str); - -#if GTEST_OS_WINDOWS_MOBILE - // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be - // able to pass strings to Win32 APIs on CE we need to convert them - // to 'Unicode', UTF-16. - - // Creates a UTF-16 wide string from the given ANSI string, allocating - // memory using new. The caller is responsible for deleting the return - // value using delete[]. Returns the wide string, or NULL if the - // input is NULL. - // - // The wide string is created using the ANSI codepage (CP_ACP) to - // match the behaviour of the ANSI versions of Win32 calls and the - // C runtime. - static LPCWSTR AnsiToUtf16(const char* c_str); - - // Creates an ANSI string from the given wide string, allocating - // memory using new. The caller is responsible for deleting the return - // value using delete[]. Returns the ANSI string, or NULL if the - // input is NULL. - // - // The returned string is created using the ANSI codepage (CP_ACP) to - // match the behaviour of the ANSI versions of Win32 calls and the - // C runtime. - static const char* Utf16ToAnsi(LPCWSTR utf16_str); -#endif - - // Compares two C strings. Returns true if and only if they have the same - // content. - // - // Unlike strcmp(), this function can handle NULL argument(s). A - // NULL C string is considered different to any non-NULL C string, - // including the empty string. - static bool CStringEquals(const char* lhs, const char* rhs); - - // Converts a wide C string to a String using the UTF-8 encoding. - // NULL will be converted to "(null)". If an error occurred during - // the conversion, "(failed to convert from wide string)" is - // returned. - static std::string ShowWideCString(const wchar_t* wide_c_str); - - // Compares two wide C strings. Returns true if and only if they have the - // same content. - // - // Unlike wcscmp(), this function can handle NULL argument(s). A - // NULL C string is considered different to any non-NULL C string, - // including the empty string. - static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); - - // Compares two C strings, ignoring case. Returns true if and only if - // they have the same content. - // - // Unlike strcasecmp(), this function can handle NULL argument(s). - // A NULL C string is considered different to any non-NULL C string, - // including the empty string. - static bool CaseInsensitiveCStringEquals(const char* lhs, - const char* rhs); - - // Compares two wide C strings, ignoring case. Returns true if and only if - // they have the same content. - // - // Unlike wcscasecmp(), this function can handle NULL argument(s). - // A NULL C string is considered different to any non-NULL wide C string, - // including the empty string. - // NB: The implementations on different platforms slightly differ. - // On windows, this method uses _wcsicmp which compares according to LC_CTYPE - // environment variable. On GNU platform this method uses wcscasecmp - // which compares according to LC_CTYPE category of the current locale. - // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the - // current locale. - static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, - const wchar_t* rhs); - - // Returns true if and only if the given string ends with the given suffix, - // ignoring case. Any string is considered to end with an empty suffix. - static bool EndsWithCaseInsensitive( - const std::string& str, const std::string& suffix); - - // Formats an int value as "%02d". - static std::string FormatIntWidth2(int value); // "%02d" for width == 2 - - // Formats an int value as "%X". - static std::string FormatHexInt(int value); - - // Formats an int value as "%X". - static std::string FormatHexUInt32(UInt32 value); - - // Formats a byte as "%02X". - static std::string FormatByte(unsigned char value); - - private: - String(); // Not meant to be instantiated. -}; // class String - -// Gets the content of the stringstream's buffer as an std::string. Each '\0' -// character in the buffer is replaced with "\\0". -GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); - -} // namespace internal -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ diff --git a/core/deps/gtest/internal/gtest-type-util.h b/core/deps/gtest/internal/gtest-type-util.h deleted file mode 100644 index 537f26799..000000000 --- a/core/deps/gtest/internal/gtest-type-util.h +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2008 Google Inc. -// All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Type utilities needed for implementing typed and type-parameterized -// tests. - -// GOOGLETEST_CM0001 DO NOT DELETE - -#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ -#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ - -#include "gtest-port.h" - -// #ifdef __GNUC__ is too general here. It is possible to use gcc without using -// libstdc++ (which is where cxxabi.h comes from). -# if GTEST_HAS_CXXABI_H_ -# include -# elif defined(__HP_aCC) -# include -# endif // GTEST_HASH_CXXABI_H_ - -namespace testing { -namespace internal { - -// Canonicalizes a given name with respect to the Standard C++ Library. -// This handles removing the inline namespace within `std` that is -// used by various standard libraries (e.g., `std::__1`). Names outside -// of namespace std are returned unmodified. -inline std::string CanonicalizeForStdLibVersioning(std::string s) { - static const char prefix[] = "std::__"; - if (s.compare(0, strlen(prefix), prefix) == 0) { - std::string::size_type end = s.find("::", strlen(prefix)); - if (end != s.npos) { - // Erase everything between the initial `std` and the second `::`. - s.erase(strlen("std"), end - strlen("std")); - } - } - return s; -} - -// GetTypeName() returns a human-readable name of type T. -// NB: This function is also used in Google Mock, so don't move it inside of -// the typed-test-only section below. -template -std::string GetTypeName() { -# if GTEST_HAS_RTTI - - const char* const name = typeid(T).name(); -# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) - int status = 0; - // gcc's implementation of typeid(T).name() mangles the type name, - // so we have to demangle it. -# if GTEST_HAS_CXXABI_H_ - using abi::__cxa_demangle; -# endif // GTEST_HAS_CXXABI_H_ - char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status); - const std::string name_str(status == 0 ? readable_name : name); - free(readable_name); - return CanonicalizeForStdLibVersioning(name_str); -# else - return name; -# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC - -# else - - return ""; - -# endif // GTEST_HAS_RTTI -} - -#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - -// A unique type indicating an empty node -struct None {}; - -# define GTEST_TEMPLATE_ template class - -// The template "selector" struct TemplateSel is used to -// represent Tmpl, which must be a class template with one type -// parameter, as a type. TemplateSel::Bind::type is defined -// as the type Tmpl. This allows us to actually instantiate the -// template "selected" by TemplateSel. -// -// This trick is necessary for simulating typedef for class templates, -// which C++ doesn't support directly. -template -struct TemplateSel { - template - struct Bind { - typedef Tmpl type; - }; -}; - -# define GTEST_BIND_(TmplSel, T) \ - TmplSel::template Bind::type - -template -struct Templates { - using Head = TemplateSel; - using Tail = Templates; -}; - -template -struct Templates { - using Head = TemplateSel; - using Tail = None; -}; - -// Tuple-like type lists -template -struct Types { - using Head = Head_; - using Tail = Types; -}; - -template -struct Types { - using Head = Head_; - using Tail = None; -}; - -// Helper metafunctions to tell apart a single type from types -// generated by ::testing::Types -template -struct ProxyTypeList { - using type = Types; -}; - -template -struct is_proxy_type_list : std::false_type {}; - -template -struct is_proxy_type_list> : std::true_type {}; - -// Generator which conditionally creates type lists. -// It recognizes if a requested type list should be created -// and prevents creating a new type list nested within another one. -template -struct GenerateTypeList { - private: - using proxy = typename std::conditional::value, T, - ProxyTypeList>::type; - - public: - using type = typename proxy::type; -}; - -#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P - -} // namespace internal - -template -using Types = internal::ProxyTypeList; - -} // namespace testing - -#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/core/deps/gtest/src/gtest-all.cc b/core/deps/gtest/src/gtest-all.cc deleted file mode 100644 index 087124e50..000000000 --- a/core/deps/gtest/src/gtest-all.cc +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// Google C++ Testing and Mocking Framework (Google Test) -// -// Sometimes it's desirable to build Google Test by compiling a single file. -// This file serves this purpose. - -// This line ensures that gtest.h can be compiled on its own, even -// when it's fused. -#include "gtest/gtest.h" -#include "gtest.cc" -#include "gtest-death-test.cc" -#include "gtest-filepath.cc" -#include "gtest-matchers.cc" -#include "gtest-port.cc" -#include "gtest-printers.cc" -#include "gtest-test-part.cc" -#include "gtest-typed-test.cc" diff --git a/core/deps/gtest/src/gtest-death-test.cc b/core/deps/gtest/src/gtest-death-test.cc deleted file mode 100644 index 1b5634578..000000000 --- a/core/deps/gtest/src/gtest-death-test.cc +++ /dev/null @@ -1,1653 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// This file implements death tests. - -#include "gtest/gtest-death-test.h" - -#include - -#include "gtest/internal/custom/gtest.h" -#include "gtest/internal/gtest-port.h" - -#if GTEST_HAS_DEATH_TEST - -# if GTEST_OS_MAC -# include -# endif // GTEST_OS_MAC - -# include -# include -# include - -# if GTEST_OS_LINUX -# include -# endif // GTEST_OS_LINUX - -# include - -# if GTEST_OS_WINDOWS -# include -# else -# include -# include -# endif // GTEST_OS_WINDOWS - -# if GTEST_OS_QNX -# include -# endif // GTEST_OS_QNX - -# if GTEST_OS_FUCHSIA -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# endif // GTEST_OS_FUCHSIA - -#endif // GTEST_HAS_DEATH_TEST - -#include "gtest/gtest-message.h" -#include "gtest/internal/gtest-string.h" -#include "gtest-internal-inl.h" - -namespace testing { - -// Constants. - -// The default death test style. -// -// This is defined in internal/gtest-port.h as "fast", but can be overridden by -// a definition in internal/custom/gtest-port.h. The recommended value, which is -// used internally at Google, is "threadsafe". -static const char kDefaultDeathTestStyle[] = GTEST_DEFAULT_DEATH_TEST_STYLE; - -GTEST_DEFINE_string_( - death_test_style, - internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), - "Indicates how to run a death test in a forked child process: " - "\"threadsafe\" (child process re-executes the test binary " - "from the beginning, running only the specific death test) or " - "\"fast\" (child process runs the death test immediately " - "after forking)."); - -GTEST_DEFINE_bool_( - death_test_use_fork, - internal::BoolFromGTestEnv("death_test_use_fork", false), - "Instructs to use fork()/_exit() instead of clone() in death tests. " - "Ignored and always uses fork() on POSIX systems where clone() is not " - "implemented. Useful when running under valgrind or similar tools if " - "those do not support clone(). Valgrind 3.3.1 will just fail if " - "it sees an unsupported combination of clone() flags. " - "It is not recommended to use this flag w/o valgrind though it will " - "work in 99% of the cases. Once valgrind is fixed, this flag will " - "most likely be removed."); - -namespace internal { -GTEST_DEFINE_string_( - internal_run_death_test, "", - "Indicates the file, line number, temporal index of " - "the single death test to run, and a file descriptor to " - "which a success code may be sent, all separated by " - "the '|' characters. This flag is specified if and only if the " - "current process is a sub-process launched for running a thread-safe " - "death test. FOR INTERNAL USE ONLY."); -} // namespace internal - -#if GTEST_HAS_DEATH_TEST - -namespace internal { - -// Valid only for fast death tests. Indicates the code is running in the -// child process of a fast style death test. -# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA -static bool g_in_fast_death_test_child = false; -# endif - -// Returns a Boolean value indicating whether the caller is currently -// executing in the context of the death test child process. Tools such as -// Valgrind heap checkers may need this to modify their behavior in death -// tests. IMPORTANT: This is an internal utility. Using it may break the -// implementation of death tests. User code MUST NOT use it. -bool InDeathTestChild() { -# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA - - // On Windows and Fuchsia, death tests are thread-safe regardless of the value - // of the death_test_style flag. - return !GTEST_FLAG(internal_run_death_test).empty(); - -# else - - if (GTEST_FLAG(death_test_style) == "threadsafe") - return !GTEST_FLAG(internal_run_death_test).empty(); - else - return g_in_fast_death_test_child; -#endif -} - -} // namespace internal - -// ExitedWithCode constructor. -ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { -} - -// ExitedWithCode function-call operator. -bool ExitedWithCode::operator()(int exit_status) const { -# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA - - return exit_status == exit_code_; - -# else - - return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; - -# endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA -} - -# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA -// KilledBySignal constructor. -KilledBySignal::KilledBySignal(int signum) : signum_(signum) { -} - -// KilledBySignal function-call operator. -bool KilledBySignal::operator()(int exit_status) const { -# if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_) - { - bool result; - if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) { - return result; - } - } -# endif // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_) - return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; -} -# endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA - -namespace internal { - -// Utilities needed for death tests. - -// Generates a textual description of a given exit code, in the format -// specified by wait(2). -static std::string ExitSummary(int exit_code) { - Message m; - -# if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA - - m << "Exited with exit status " << exit_code; - -# else - - if (WIFEXITED(exit_code)) { - m << "Exited with exit status " << WEXITSTATUS(exit_code); - } else if (WIFSIGNALED(exit_code)) { - m << "Terminated by signal " << WTERMSIG(exit_code); - } -# ifdef WCOREDUMP - if (WCOREDUMP(exit_code)) { - m << " (core dumped)"; - } -# endif -# endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA - - return m.GetString(); -} - -// Returns true if exit_status describes a process that was terminated -// by a signal, or exited normally with a nonzero exit code. -bool ExitedUnsuccessfully(int exit_status) { - return !ExitedWithCode(0)(exit_status); -} - -# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA -// Generates a textual failure message when a death test finds more than -// one thread running, or cannot determine the number of threads, prior -// to executing the given statement. It is the responsibility of the -// caller not to pass a thread_count of 1. -static std::string DeathTestThreadWarning(size_t thread_count) { - Message msg; - msg << "Death tests use fork(), which is unsafe particularly" - << " in a threaded context. For this test, " << GTEST_NAME_ << " "; - if (thread_count == 0) { - msg << "couldn't detect the number of threads."; - } else { - msg << "detected " << thread_count << " threads."; - } - msg << " See " - "https://github.com/google/googletest/blob/master/googletest/docs/" - "advanced.md#death-tests-and-threads" - << " for more explanation and suggested solutions, especially if" - << " this is the last message you see before your test times out."; - return msg.GetString(); -} -# endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA - -// Flag characters for reporting a death test that did not die. -static const char kDeathTestLived = 'L'; -static const char kDeathTestReturned = 'R'; -static const char kDeathTestThrew = 'T'; -static const char kDeathTestInternalError = 'I'; - -#if GTEST_OS_FUCHSIA - -// File descriptor used for the pipe in the child process. -static const int kFuchsiaReadPipeFd = 3; - -#endif - -// An enumeration describing all of the possible ways that a death test can -// conclude. DIED means that the process died while executing the test -// code; LIVED means that process lived beyond the end of the test code; -// RETURNED means that the test statement attempted to execute a return -// statement, which is not allowed; THREW means that the test statement -// returned control by throwing an exception. IN_PROGRESS means the test -// has not yet concluded. -enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; - -// Routine for aborting the program which is safe to call from an -// exec-style death test child process, in which case the error -// message is propagated back to the parent process. Otherwise, the -// message is simply printed to stderr. In either case, the program -// then exits with status 1. -static void DeathTestAbort(const std::string& message) { - // On a POSIX system, this function may be called from a threadsafe-style - // death test child process, which operates on a very small stack. Use - // the heap for any additional non-minuscule memory requirements. - const InternalRunDeathTestFlag* const flag = - GetUnitTestImpl()->internal_run_death_test_flag(); - if (flag != nullptr) { - FILE* parent = posix::FDOpen(flag->write_fd(), "w"); - fputc(kDeathTestInternalError, parent); - fprintf(parent, "%s", message.c_str()); - fflush(parent); - _exit(1); - } else { - fprintf(stderr, "%s", message.c_str()); - fflush(stderr); - posix::Abort(); - } -} - -// A replacement for CHECK that calls DeathTestAbort if the assertion -// fails. -# define GTEST_DEATH_TEST_CHECK_(expression) \ - do { \ - if (!::testing::internal::IsTrue(expression)) { \ - DeathTestAbort( \ - ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ - + ::testing::internal::StreamableToString(__LINE__) + ": " \ - + #expression); \ - } \ - } while (::testing::internal::AlwaysFalse()) - -// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for -// evaluating any system call that fulfills two conditions: it must return -// -1 on failure, and set errno to EINTR when it is interrupted and -// should be tried again. The macro expands to a loop that repeatedly -// evaluates the expression as long as it evaluates to -1 and sets -// errno to EINTR. If the expression evaluates to -1 but errno is -// something other than EINTR, DeathTestAbort is called. -# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ - do { \ - int gtest_retval; \ - do { \ - gtest_retval = (expression); \ - } while (gtest_retval == -1 && errno == EINTR); \ - if (gtest_retval == -1) { \ - DeathTestAbort( \ - ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ - + ::testing::internal::StreamableToString(__LINE__) + ": " \ - + #expression + " != -1"); \ - } \ - } while (::testing::internal::AlwaysFalse()) - -// Returns the message describing the last system error in errno. -std::string GetLastErrnoDescription() { - return errno == 0 ? "" : posix::StrError(errno); -} - -// This is called from a death test parent process to read a failure -// message from the death test child process and log it with the FATAL -// severity. On Windows, the message is read from a pipe handle. On other -// platforms, it is read from a file descriptor. -static void FailFromInternalError(int fd) { - Message error; - char buffer[256]; - int num_read; - - do { - while ((num_read = posix::Read(fd, buffer, 255)) > 0) { - buffer[num_read] = '\0'; - error << buffer; - } - } while (num_read == -1 && errno == EINTR); - - if (num_read == 0) { - GTEST_LOG_(FATAL) << error.GetString(); - } else { - const int last_error = errno; - GTEST_LOG_(FATAL) << "Error while reading death test internal: " - << GetLastErrnoDescription() << " [" << last_error << "]"; - } -} - -// Death test constructor. Increments the running death test count -// for the current test. -DeathTest::DeathTest() { - TestInfo* const info = GetUnitTestImpl()->current_test_info(); - if (info == nullptr) { - DeathTestAbort("Cannot run a death test outside of a TEST or " - "TEST_F construct"); - } -} - -// Creates and returns a death test by dispatching to the current -// death test factory. -bool DeathTest::Create(const char* statement, - Matcher matcher, const char* file, - int line, DeathTest** test) { - return GetUnitTestImpl()->death_test_factory()->Create( - statement, std::move(matcher), file, line, test); -} - -const char* DeathTest::LastMessage() { - return last_death_test_message_.c_str(); -} - -void DeathTest::set_last_death_test_message(const std::string& message) { - last_death_test_message_ = message; -} - -std::string DeathTest::last_death_test_message_; - -// Provides cross platform implementation for some death functionality. -class DeathTestImpl : public DeathTest { - protected: - DeathTestImpl(const char* a_statement, Matcher matcher) - : statement_(a_statement), - matcher_(std::move(matcher)), - spawned_(false), - status_(-1), - outcome_(IN_PROGRESS), - read_fd_(-1), - write_fd_(-1) {} - - // read_fd_ is expected to be closed and cleared by a derived class. - ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } - - void Abort(AbortReason reason) override; - bool Passed(bool status_ok) override; - - const char* statement() const { return statement_; } - bool spawned() const { return spawned_; } - void set_spawned(bool is_spawned) { spawned_ = is_spawned; } - int status() const { return status_; } - void set_status(int a_status) { status_ = a_status; } - DeathTestOutcome outcome() const { return outcome_; } - void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } - int read_fd() const { return read_fd_; } - void set_read_fd(int fd) { read_fd_ = fd; } - int write_fd() const { return write_fd_; } - void set_write_fd(int fd) { write_fd_ = fd; } - - // Called in the parent process only. Reads the result code of the death - // test child process via a pipe, interprets it to set the outcome_ - // member, and closes read_fd_. Outputs diagnostics and terminates in - // case of unexpected codes. - void ReadAndInterpretStatusByte(); - - // Returns stderr output from the child process. - virtual std::string GetErrorLogs(); - - private: - // The textual content of the code this object is testing. This class - // doesn't own this string and should not attempt to delete it. - const char* const statement_; - // A matcher that's expected to match the stderr output by the child process. - Matcher matcher_; - // True if the death test child process has been successfully spawned. - bool spawned_; - // The exit status of the child process. - int status_; - // How the death test concluded. - DeathTestOutcome outcome_; - // Descriptor to the read end of the pipe to the child process. It is - // always -1 in the child process. The child keeps its write end of the - // pipe in write_fd_. - int read_fd_; - // Descriptor to the child's write end of the pipe to the parent process. - // It is always -1 in the parent process. The parent keeps its end of the - // pipe in read_fd_. - int write_fd_; -}; - -// Called in the parent process only. Reads the result code of the death -// test child process via a pipe, interprets it to set the outcome_ -// member, and closes read_fd_. Outputs diagnostics and terminates in -// case of unexpected codes. -void DeathTestImpl::ReadAndInterpretStatusByte() { - char flag; - int bytes_read; - - // The read() here blocks until data is available (signifying the - // failure of the death test) or until the pipe is closed (signifying - // its success), so it's okay to call this in the parent before - // the child process has exited. - do { - bytes_read = posix::Read(read_fd(), &flag, 1); - } while (bytes_read == -1 && errno == EINTR); - - if (bytes_read == 0) { - set_outcome(DIED); - } else if (bytes_read == 1) { - switch (flag) { - case kDeathTestReturned: - set_outcome(RETURNED); - break; - case kDeathTestThrew: - set_outcome(THREW); - break; - case kDeathTestLived: - set_outcome(LIVED); - break; - case kDeathTestInternalError: - FailFromInternalError(read_fd()); // Does not return. - break; - default: - GTEST_LOG_(FATAL) << "Death test child process reported " - << "unexpected status byte (" - << static_cast(flag) << ")"; - } - } else { - GTEST_LOG_(FATAL) << "Read from death test child process failed: " - << GetLastErrnoDescription(); - } - GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); - set_read_fd(-1); -} - -std::string DeathTestImpl::GetErrorLogs() { - return GetCapturedStderr(); -} - -// Signals that the death test code which should have exited, didn't. -// Should be called only in a death test child process. -// Writes a status byte to the child's status file descriptor, then -// calls _exit(1). -void DeathTestImpl::Abort(AbortReason reason) { - // The parent process considers the death test to be a failure if - // it finds any data in our pipe. So, here we write a single flag byte - // to the pipe, then exit. - const char status_ch = - reason == TEST_DID_NOT_DIE ? kDeathTestLived : - reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned; - - GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); - // We are leaking the descriptor here because on some platforms (i.e., - // when built as Windows DLL), destructors of global objects will still - // run after calling _exit(). On such systems, write_fd_ will be - // indirectly closed from the destructor of UnitTestImpl, causing double - // close if it is also closed here. On debug configurations, double close - // may assert. As there are no in-process buffers to flush here, we are - // relying on the OS to close the descriptor after the process terminates - // when the destructors are not run. - _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) -} - -// Returns an indented copy of stderr output for a death test. -// This makes distinguishing death test output lines from regular log lines -// much easier. -static ::std::string FormatDeathTestOutput(const ::std::string& output) { - ::std::string ret; - for (size_t at = 0; ; ) { - const size_t line_end = output.find('\n', at); - ret += "[ DEATH ] "; - if (line_end == ::std::string::npos) { - ret += output.substr(at); - break; - } - ret += output.substr(at, line_end + 1 - at); - at = line_end + 1; - } - return ret; -} - -// Assesses the success or failure of a death test, using both private -// members which have previously been set, and one argument: -// -// Private data members: -// outcome: An enumeration describing how the death test -// concluded: DIED, LIVED, THREW, or RETURNED. The death test -// fails in the latter three cases. -// status: The exit status of the child process. On *nix, it is in the -// in the format specified by wait(2). On Windows, this is the -// value supplied to the ExitProcess() API or a numeric code -// of the exception that terminated the program. -// matcher_: A matcher that's expected to match the stderr output by the child -// process. -// -// Argument: -// status_ok: true if exit_status is acceptable in the context of -// this particular death test, which fails if it is false -// -// Returns true if and only if all of the above conditions are met. Otherwise, -// the first failing condition, in the order given above, is the one that is -// reported. Also sets the last death test message string. -bool DeathTestImpl::Passed(bool status_ok) { - if (!spawned()) - return false; - - const std::string error_message = GetErrorLogs(); - - bool success = false; - Message buffer; - - buffer << "Death test: " << statement() << "\n"; - switch (outcome()) { - case LIVED: - buffer << " Result: failed to die.\n" - << " Error msg:\n" << FormatDeathTestOutput(error_message); - break; - case THREW: - buffer << " Result: threw an exception.\n" - << " Error msg:\n" << FormatDeathTestOutput(error_message); - break; - case RETURNED: - buffer << " Result: illegal return in test statement.\n" - << " Error msg:\n" << FormatDeathTestOutput(error_message); - break; - case DIED: - if (status_ok) { - if (matcher_.Matches(error_message)) { - success = true; - } else { - std::ostringstream stream; - matcher_.DescribeTo(&stream); - buffer << " Result: died but not with expected error.\n" - << " Expected: " << stream.str() << "\n" - << "Actual msg:\n" - << FormatDeathTestOutput(error_message); - } - } else { - buffer << " Result: died but not with expected exit code:\n" - << " " << ExitSummary(status()) << "\n" - << "Actual msg:\n" << FormatDeathTestOutput(error_message); - } - break; - case IN_PROGRESS: - default: - GTEST_LOG_(FATAL) - << "DeathTest::Passed somehow called before conclusion of test"; - } - - DeathTest::set_last_death_test_message(buffer.GetString()); - return success; -} - -# if GTEST_OS_WINDOWS -// WindowsDeathTest implements death tests on Windows. Due to the -// specifics of starting new processes on Windows, death tests there are -// always threadsafe, and Google Test considers the -// --gtest_death_test_style=fast setting to be equivalent to -// --gtest_death_test_style=threadsafe there. -// -// A few implementation notes: Like the Linux version, the Windows -// implementation uses pipes for child-to-parent communication. But due to -// the specifics of pipes on Windows, some extra steps are required: -// -// 1. The parent creates a communication pipe and stores handles to both -// ends of it. -// 2. The parent starts the child and provides it with the information -// necessary to acquire the handle to the write end of the pipe. -// 3. The child acquires the write end of the pipe and signals the parent -// using a Windows event. -// 4. Now the parent can release the write end of the pipe on its side. If -// this is done before step 3, the object's reference count goes down to -// 0 and it is destroyed, preventing the child from acquiring it. The -// parent now has to release it, or read operations on the read end of -// the pipe will not return when the child terminates. -// 5. The parent reads child's output through the pipe (outcome code and -// any possible error messages) from the pipe, and its stderr and then -// determines whether to fail the test. -// -// Note: to distinguish Win32 API calls from the local method and function -// calls, the former are explicitly resolved in the global namespace. -// -class WindowsDeathTest : public DeathTestImpl { - public: - WindowsDeathTest(const char* a_statement, Matcher matcher, - const char* file, int line) - : DeathTestImpl(a_statement, std::move(matcher)), - file_(file), - line_(line) {} - - // All of these virtual functions are inherited from DeathTest. - virtual int Wait(); - virtual TestRole AssumeRole(); - - private: - // The name of the file in which the death test is located. - const char* const file_; - // The line number on which the death test is located. - const int line_; - // Handle to the write end of the pipe to the child process. - AutoHandle write_handle_; - // Child process handle. - AutoHandle child_handle_; - // Event the child process uses to signal the parent that it has - // acquired the handle to the write end of the pipe. After seeing this - // event the parent can release its own handles to make sure its - // ReadFile() calls return when the child terminates. - AutoHandle event_handle_; -}; - -// Waits for the child in a death test to exit, returning its exit -// status, or 0 if no child process exists. As a side effect, sets the -// outcome data member. -int WindowsDeathTest::Wait() { - if (!spawned()) - return 0; - - // Wait until the child either signals that it has acquired the write end - // of the pipe or it dies. - const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; - switch (::WaitForMultipleObjects(2, - wait_handles, - FALSE, // Waits for any of the handles. - INFINITE)) { - case WAIT_OBJECT_0: - case WAIT_OBJECT_0 + 1: - break; - default: - GTEST_DEATH_TEST_CHECK_(false); // Should not get here. - } - - // The child has acquired the write end of the pipe or exited. - // We release the handle on our side and continue. - write_handle_.Reset(); - event_handle_.Reset(); - - ReadAndInterpretStatusByte(); - - // Waits for the child process to exit if it haven't already. This - // returns immediately if the child has already exited, regardless of - // whether previous calls to WaitForMultipleObjects synchronized on this - // handle or not. - GTEST_DEATH_TEST_CHECK_( - WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), - INFINITE)); - DWORD status_code; - GTEST_DEATH_TEST_CHECK_( - ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE); - child_handle_.Reset(); - set_status(static_cast(status_code)); - return status(); -} - -// The AssumeRole process for a Windows death test. It creates a child -// process with the same executable as the current process to run the -// death test. The child process is given the --gtest_filter and -// --gtest_internal_run_death_test flags such that it knows to run the -// current death test only. -DeathTest::TestRole WindowsDeathTest::AssumeRole() { - const UnitTestImpl* const impl = GetUnitTestImpl(); - const InternalRunDeathTestFlag* const flag = - impl->internal_run_death_test_flag(); - const TestInfo* const info = impl->current_test_info(); - const int death_test_index = info->result()->death_test_count(); - - if (flag != nullptr) { - // ParseInternalRunDeathTestFlag() has performed all the necessary - // processing. - set_write_fd(flag->write_fd()); - return EXECUTE_TEST; - } - - // WindowsDeathTest uses an anonymous pipe to communicate results of - // a death test. - SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES), - nullptr, TRUE}; - HANDLE read_handle, write_handle; - GTEST_DEATH_TEST_CHECK_( - ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, - 0) // Default buffer size. - != FALSE); - set_read_fd(::_open_osfhandle(reinterpret_cast(read_handle), - O_RDONLY)); - write_handle_.Reset(write_handle); - event_handle_.Reset(::CreateEvent( - &handles_are_inheritable, - TRUE, // The event will automatically reset to non-signaled state. - FALSE, // The initial state is non-signalled. - nullptr)); // The even is unnamed. - GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr); - const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + - kFilterFlag + "=" + info->test_suite_name() + - "." + info->name(); - const std::string internal_flag = - std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + - "=" + file_ + "|" + StreamableToString(line_) + "|" + - StreamableToString(death_test_index) + "|" + - StreamableToString(static_cast(::GetCurrentProcessId())) + - // size_t has the same width as pointers on both 32-bit and 64-bit - // Windows platforms. - // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. - "|" + StreamableToString(reinterpret_cast(write_handle)) + - "|" + StreamableToString(reinterpret_cast(event_handle_.Get())); - - char executable_path[_MAX_PATH + 1]; // NOLINT - GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr, - executable_path, - _MAX_PATH)); - - std::string command_line = - std::string(::GetCommandLineA()) + " " + filter_flag + " \"" + - internal_flag + "\""; - - DeathTest::set_last_death_test_message(""); - - CaptureStderr(); - // Flush the log buffers since the log streams are shared with the child. - FlushInfoLog(); - - // The child process will share the standard handles with the parent. - STARTUPINFOA startup_info; - memset(&startup_info, 0, sizeof(STARTUPINFO)); - startup_info.dwFlags = STARTF_USESTDHANDLES; - startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); - startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); - startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); - - PROCESS_INFORMATION process_info; - GTEST_DEATH_TEST_CHECK_( - ::CreateProcessA( - executable_path, const_cast(command_line.c_str()), - nullptr, // Retuned process handle is not inheritable. - nullptr, // Retuned thread handle is not inheritable. - TRUE, // Child inherits all inheritable handles (for write_handle_). - 0x0, // Default creation flags. - nullptr, // Inherit the parent's environment. - UnitTest::GetInstance()->original_working_dir(), &startup_info, - &process_info) != FALSE); - child_handle_.Reset(process_info.hProcess); - ::CloseHandle(process_info.hThread); - set_spawned(true); - return OVERSEE_TEST; -} - -# elif GTEST_OS_FUCHSIA - -class FuchsiaDeathTest : public DeathTestImpl { - public: - FuchsiaDeathTest(const char* a_statement, Matcher matcher, - const char* file, int line) - : DeathTestImpl(a_statement, std::move(matcher)), - file_(file), - line_(line) {} - - // All of these virtual functions are inherited from DeathTest. - int Wait() override; - TestRole AssumeRole() override; - std::string GetErrorLogs() override; - - private: - // The name of the file in which the death test is located. - const char* const file_; - // The line number on which the death test is located. - const int line_; - // The stderr data captured by the child process. - std::string captured_stderr_; - - zx::process child_process_; - zx::channel exception_channel_; - zx::socket stderr_socket_; -}; - -// Utility class for accumulating command-line arguments. -class Arguments { - public: - Arguments() { args_.push_back(nullptr); } - - ~Arguments() { - for (std::vector::iterator i = args_.begin(); i != args_.end(); - ++i) { - free(*i); - } - } - void AddArgument(const char* argument) { - args_.insert(args_.end() - 1, posix::StrDup(argument)); - } - - template - void AddArguments(const ::std::vector& arguments) { - for (typename ::std::vector::const_iterator i = arguments.begin(); - i != arguments.end(); - ++i) { - args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); - } - } - char* const* Argv() { - return &args_[0]; - } - - int size() { - return args_.size() - 1; - } - - private: - std::vector args_; -}; - -// Waits for the child in a death test to exit, returning its exit -// status, or 0 if no child process exists. As a side effect, sets the -// outcome data member. -int FuchsiaDeathTest::Wait() { - const int kProcessKey = 0; - const int kSocketKey = 1; - const int kExceptionKey = 2; - - if (!spawned()) - return 0; - - // Create a port to wait for socket/task/exception events. - zx_status_t status_zx; - zx::port port; - status_zx = zx::port::create(0, &port); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - // Register to wait for the child process to terminate. - status_zx = child_process_.wait_async( - port, kProcessKey, ZX_PROCESS_TERMINATED, ZX_WAIT_ASYNC_ONCE); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - // Register to wait for the socket to be readable or closed. - status_zx = stderr_socket_.wait_async( - port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, - ZX_WAIT_ASYNC_ONCE); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - // Register to wait for an exception. - status_zx = exception_channel_.wait_async( - port, kExceptionKey, ZX_CHANNEL_READABLE, ZX_WAIT_ASYNC_ONCE); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - bool process_terminated = false; - bool socket_closed = false; - do { - zx_port_packet_t packet = {}; - status_zx = port.wait(zx::time::infinite(), &packet); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - if (packet.key == kExceptionKey) { - // Process encountered an exception. Kill it directly rather than - // letting other handlers process the event. We will get a kProcessKey - // event when the process actually terminates. - status_zx = child_process_.kill(); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - } else if (packet.key == kProcessKey) { - // Process terminated. - GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type)); - GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED); - process_terminated = true; - } else if (packet.key == kSocketKey) { - GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type)); - if (packet.signal.observed & ZX_SOCKET_READABLE) { - // Read data from the socket. - constexpr size_t kBufferSize = 1024; - do { - size_t old_length = captured_stderr_.length(); - size_t bytes_read = 0; - captured_stderr_.resize(old_length + kBufferSize); - status_zx = stderr_socket_.read( - 0, &captured_stderr_.front() + old_length, kBufferSize, - &bytes_read); - captured_stderr_.resize(old_length + bytes_read); - } while (status_zx == ZX_OK); - if (status_zx == ZX_ERR_PEER_CLOSED) { - socket_closed = true; - } else { - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT); - status_zx = stderr_socket_.wait_async( - port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, - ZX_WAIT_ASYNC_ONCE); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - } - } else { - GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED); - socket_closed = true; - } - } - } while (!process_terminated && !socket_closed); - - ReadAndInterpretStatusByte(); - - zx_info_process_t buffer; - status_zx = child_process_.get_info( - ZX_INFO_PROCESS, &buffer, sizeof(buffer), nullptr, nullptr); - GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); - - GTEST_DEATH_TEST_CHECK_(buffer.exited); - set_status(buffer.return_code); - return status(); -} - -// The AssumeRole process for a Fuchsia death test. It creates a child -// process with the same executable as the current process to run the -// death test. The child process is given the --gtest_filter and -// --gtest_internal_run_death_test flags such that it knows to run the -// current death test only. -DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { - const UnitTestImpl* const impl = GetUnitTestImpl(); - const InternalRunDeathTestFlag* const flag = - impl->internal_run_death_test_flag(); - const TestInfo* const info = impl->current_test_info(); - const int death_test_index = info->result()->death_test_count(); - - if (flag != nullptr) { - // ParseInternalRunDeathTestFlag() has performed all the necessary - // processing. - set_write_fd(kFuchsiaReadPipeFd); - return EXECUTE_TEST; - } - - // Flush the log buffers since the log streams are shared with the child. - FlushInfoLog(); - - // Build the child process command line. - const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + - kFilterFlag + "=" + info->test_suite_name() + - "." + info->name(); - const std::string internal_flag = - std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" - + file_ + "|" - + StreamableToString(line_) + "|" - + StreamableToString(death_test_index); - Arguments args; - args.AddArguments(GetInjectableArgvs()); - args.AddArgument(filter_flag.c_str()); - args.AddArgument(internal_flag.c_str()); - - // Build the pipe for communication with the child. - zx_status_t status; - zx_handle_t child_pipe_handle; - int child_pipe_fd; - status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle); - GTEST_DEATH_TEST_CHECK_(status == ZX_OK); - set_read_fd(child_pipe_fd); - - // Set the pipe handle for the child. - fdio_spawn_action_t spawn_actions[2] = {}; - fdio_spawn_action_t* add_handle_action = &spawn_actions[0]; - add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE; - add_handle_action->h.id = PA_HND(PA_FD, kFuchsiaReadPipeFd); - add_handle_action->h.handle = child_pipe_handle; - - // Create a socket pair will be used to receive the child process' stderr. - zx::socket stderr_producer_socket; - status = - zx::socket::create(0, &stderr_producer_socket, &stderr_socket_); - GTEST_DEATH_TEST_CHECK_(status >= 0); - int stderr_producer_fd = -1; - status = - fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd); - GTEST_DEATH_TEST_CHECK_(status >= 0); - - // Make the stderr socket nonblocking. - GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0); - - fdio_spawn_action_t* add_stderr_action = &spawn_actions[1]; - add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD; - add_stderr_action->fd.local_fd = stderr_producer_fd; - add_stderr_action->fd.target_fd = STDERR_FILENO; - - // Create a child job. - zx_handle_t child_job = ZX_HANDLE_INVALID; - status = zx_job_create(zx_job_default(), 0, & child_job); - GTEST_DEATH_TEST_CHECK_(status == ZX_OK); - zx_policy_basic_t policy; - policy.condition = ZX_POL_NEW_ANY; - policy.policy = ZX_POL_ACTION_ALLOW; - status = zx_job_set_policy( - child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1); - GTEST_DEATH_TEST_CHECK_(status == ZX_OK); - - // Create an exception channel attached to the |child_job|, to allow - // us to suppress the system default exception handler from firing. - status = - zx_task_create_exception_channel( - child_job, 0, exception_channel_.reset_and_get_address()); - GTEST_DEATH_TEST_CHECK_(status == ZX_OK); - - // Spawn the child process. - status = fdio_spawn_etc( - child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr, - 2, spawn_actions, child_process_.reset_and_get_address(), nullptr); - GTEST_DEATH_TEST_CHECK_(status == ZX_OK); - - set_spawned(true); - return OVERSEE_TEST; -} - -std::string FuchsiaDeathTest::GetErrorLogs() { - return captured_stderr_; -} - -#else // We are neither on Windows, nor on Fuchsia. - -// ForkingDeathTest provides implementations for most of the abstract -// methods of the DeathTest interface. Only the AssumeRole method is -// left undefined. -class ForkingDeathTest : public DeathTestImpl { - public: - ForkingDeathTest(const char* statement, Matcher matcher); - - // All of these virtual functions are inherited from DeathTest. - int Wait() override; - - protected: - void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } - - private: - // PID of child process during death test; 0 in the child process itself. - pid_t child_pid_; -}; - -// Constructs a ForkingDeathTest. -ForkingDeathTest::ForkingDeathTest(const char* a_statement, - Matcher matcher) - : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {} - -// Waits for the child in a death test to exit, returning its exit -// status, or 0 if no child process exists. As a side effect, sets the -// outcome data member. -int ForkingDeathTest::Wait() { - if (!spawned()) - return 0; - - ReadAndInterpretStatusByte(); - - int status_value; - GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); - set_status(status_value); - return status_value; -} - -// A concrete death test class that forks, then immediately runs the test -// in the child process. -class NoExecDeathTest : public ForkingDeathTest { - public: - NoExecDeathTest(const char* a_statement, Matcher matcher) - : ForkingDeathTest(a_statement, std::move(matcher)) {} - TestRole AssumeRole() override; -}; - -// The AssumeRole process for a fork-and-run death test. It implements a -// straightforward fork, with a simple pipe to transmit the status byte. -DeathTest::TestRole NoExecDeathTest::AssumeRole() { - const size_t thread_count = GetThreadCount(); - if (thread_count != 1) { - GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); - } - - int pipe_fd[2]; - GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); - - DeathTest::set_last_death_test_message(""); - CaptureStderr(); - // When we fork the process below, the log file buffers are copied, but the - // file descriptors are shared. We flush all log files here so that closing - // the file descriptors in the child process doesn't throw off the - // synchronization between descriptors and buffers in the parent process. - // This is as close to the fork as possible to avoid a race condition in case - // there are multiple threads running before the death test, and another - // thread writes to the log file. - FlushInfoLog(); - - const pid_t child_pid = fork(); - GTEST_DEATH_TEST_CHECK_(child_pid != -1); - set_child_pid(child_pid); - if (child_pid == 0) { - GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); - set_write_fd(pipe_fd[1]); - // Redirects all logging to stderr in the child process to prevent - // concurrent writes to the log files. We capture stderr in the parent - // process and append the child process' output to a log. - LogToStderr(); - // Event forwarding to the listeners of event listener API mush be shut - // down in death test subprocesses. - GetUnitTestImpl()->listeners()->SuppressEventForwarding(); - g_in_fast_death_test_child = true; - return EXECUTE_TEST; - } else { - GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); - set_read_fd(pipe_fd[0]); - set_spawned(true); - return OVERSEE_TEST; - } -} - -// A concrete death test class that forks and re-executes the main -// program from the beginning, with command-line flags set that cause -// only this specific death test to be run. -class ExecDeathTest : public ForkingDeathTest { - public: - ExecDeathTest(const char* a_statement, Matcher matcher, - const char* file, int line) - : ForkingDeathTest(a_statement, std::move(matcher)), - file_(file), - line_(line) {} - TestRole AssumeRole() override; - - private: - static ::std::vector GetArgvsForDeathTestChildProcess() { - ::std::vector args = GetInjectableArgvs(); -# if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_) - ::std::vector extra_args = - GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_(); - args.insert(args.end(), extra_args.begin(), extra_args.end()); -# endif // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_) - return args; - } - // The name of the file in which the death test is located. - const char* const file_; - // The line number on which the death test is located. - const int line_; -}; - -// Utility class for accumulating command-line arguments. -class Arguments { - public: - Arguments() { args_.push_back(nullptr); } - - ~Arguments() { - for (std::vector::iterator i = args_.begin(); i != args_.end(); - ++i) { - free(*i); - } - } - void AddArgument(const char* argument) { - args_.insert(args_.end() - 1, posix::StrDup(argument)); - } - - template - void AddArguments(const ::std::vector& arguments) { - for (typename ::std::vector::const_iterator i = arguments.begin(); - i != arguments.end(); - ++i) { - args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); - } - } - char* const* Argv() { - return &args_[0]; - } - - private: - std::vector args_; -}; - -// A struct that encompasses the arguments to the child process of a -// threadsafe-style death test process. -struct ExecDeathTestArgs { - char* const* argv; // Command-line arguments for the child's call to exec - int close_fd; // File descriptor to close; the read end of a pipe -}; - -# if GTEST_OS_MAC -inline char** GetEnviron() { - // When Google Test is built as a framework on MacOS X, the environ variable - // is unavailable. Apple's documentation (man environ) recommends using - // _NSGetEnviron() instead. - return *_NSGetEnviron(); -} -# else -// Some POSIX platforms expect you to declare environ. extern "C" makes -// it reside in the global namespace. -extern "C" char** environ; -inline char** GetEnviron() { return environ; } -# endif // GTEST_OS_MAC - -# if !GTEST_OS_QNX -// The main function for a threadsafe-style death test child process. -// This function is called in a clone()-ed process and thus must avoid -// any potentially unsafe operations like malloc or libc functions. -static int ExecDeathTestChildMain(void* child_arg) { - ExecDeathTestArgs* const args = static_cast(child_arg); - GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); - - // We need to execute the test program in the same environment where - // it was originally invoked. Therefore we change to the original - // working directory first. - const char* const original_dir = - UnitTest::GetInstance()->original_working_dir(); - // We can safely call chdir() as it's a direct system call. - if (chdir(original_dir) != 0) { - DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + - GetLastErrnoDescription()); - return EXIT_FAILURE; - } - - // We can safely call execve() as it's a direct system call. We - // cannot use execvp() as it's a libc function and thus potentially - // unsafe. Since execve() doesn't search the PATH, the user must - // invoke the test program via a valid path that contains at least - // one path separator. - execve(args->argv[0], args->argv, GetEnviron()); - DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " + - original_dir + " failed: " + - GetLastErrnoDescription()); - return EXIT_FAILURE; -} -# endif // !GTEST_OS_QNX - -# if GTEST_HAS_CLONE -// Two utility routines that together determine the direction the stack -// grows. -// This could be accomplished more elegantly by a single recursive -// function, but we want to guard against the unlikely possibility of -// a smart compiler optimizing the recursion away. -// -// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining -// StackLowerThanAddress into StackGrowsDown, which then doesn't give -// correct answer. -static void StackLowerThanAddress(const void* ptr, - bool* result) GTEST_NO_INLINE_; -// HWAddressSanitizer add a random tag to the MSB of the local variable address, -// making comparison result unpredictable. -GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -static void StackLowerThanAddress(const void* ptr, bool* result) { - int dummy; - *result = (&dummy < ptr); -} - -// Make sure AddressSanitizer does not tamper with the stack here. -GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -static bool StackGrowsDown() { - int dummy; - bool result; - StackLowerThanAddress(&dummy, &result); - return result; -} -# endif // GTEST_HAS_CLONE - -// Spawns a child process with the same executable as the current process in -// a thread-safe manner and instructs it to run the death test. The -// implementation uses fork(2) + exec. On systems where clone(2) is -// available, it is used instead, being slightly more thread-safe. On QNX, -// fork supports only single-threaded environments, so this function uses -// spawn(2) there instead. The function dies with an error message if -// anything goes wrong. -static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { - ExecDeathTestArgs args = { argv, close_fd }; - pid_t child_pid = -1; - -# if GTEST_OS_QNX - // Obtains the current directory and sets it to be closed in the child - // process. - const int cwd_fd = open(".", O_RDONLY); - GTEST_DEATH_TEST_CHECK_(cwd_fd != -1); - GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC)); - // We need to execute the test program in the same environment where - // it was originally invoked. Therefore we change to the original - // working directory first. - const char* const original_dir = - UnitTest::GetInstance()->original_working_dir(); - // We can safely call chdir() as it's a direct system call. - if (chdir(original_dir) != 0) { - DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + - GetLastErrnoDescription()); - return EXIT_FAILURE; - } - - int fd_flags; - // Set close_fd to be closed after spawn. - GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD)); - GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD, - fd_flags | FD_CLOEXEC)); - struct inheritance inherit = {0}; - // spawn is a system call. - child_pid = - spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron()); - // Restores the current working directory. - GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1); - GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd)); - -# else // GTEST_OS_QNX -# if GTEST_OS_LINUX - // When a SIGPROF signal is received while fork() or clone() are executing, - // the process may hang. To avoid this, we ignore SIGPROF here and re-enable - // it after the call to fork()/clone() is complete. - struct sigaction saved_sigprof_action; - struct sigaction ignore_sigprof_action; - memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action)); - sigemptyset(&ignore_sigprof_action.sa_mask); - ignore_sigprof_action.sa_handler = SIG_IGN; - GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction( - SIGPROF, &ignore_sigprof_action, &saved_sigprof_action)); -# endif // GTEST_OS_LINUX - -# if GTEST_HAS_CLONE - const bool use_fork = GTEST_FLAG(death_test_use_fork); - - if (!use_fork) { - static const bool stack_grows_down = StackGrowsDown(); - const auto stack_size = static_cast(getpagesize()); - // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. - void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE, - MAP_ANON | MAP_PRIVATE, -1, 0); - GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); - - // Maximum stack alignment in bytes: For a downward-growing stack, this - // amount is subtracted from size of the stack space to get an address - // that is within the stack space and is aligned on all systems we care - // about. As far as I know there is no ABI with stack alignment greater - // than 64. We assume stack and stack_size already have alignment of - // kMaxStackAlignment. - const size_t kMaxStackAlignment = 64; - void* const stack_top = - static_cast(stack) + - (stack_grows_down ? stack_size - kMaxStackAlignment : 0); - GTEST_DEATH_TEST_CHECK_( - static_cast(stack_size) > kMaxStackAlignment && - reinterpret_cast(stack_top) % kMaxStackAlignment == 0); - - child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); - - GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); - } -# else - const bool use_fork = true; -# endif // GTEST_HAS_CLONE - - if (use_fork && (child_pid = fork()) == 0) { - ExecDeathTestChildMain(&args); - _exit(0); - } -# endif // GTEST_OS_QNX -# if GTEST_OS_LINUX - GTEST_DEATH_TEST_CHECK_SYSCALL_( - sigaction(SIGPROF, &saved_sigprof_action, nullptr)); -# endif // GTEST_OS_LINUX - - GTEST_DEATH_TEST_CHECK_(child_pid != -1); - return child_pid; -} - -// The AssumeRole process for a fork-and-exec death test. It re-executes the -// main program from the beginning, setting the --gtest_filter -// and --gtest_internal_run_death_test flags to cause only the current -// death test to be re-run. -DeathTest::TestRole ExecDeathTest::AssumeRole() { - const UnitTestImpl* const impl = GetUnitTestImpl(); - const InternalRunDeathTestFlag* const flag = - impl->internal_run_death_test_flag(); - const TestInfo* const info = impl->current_test_info(); - const int death_test_index = info->result()->death_test_count(); - - if (flag != nullptr) { - set_write_fd(flag->write_fd()); - return EXECUTE_TEST; - } - - int pipe_fd[2]; - GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); - // Clear the close-on-exec flag on the write end of the pipe, lest - // it be closed when the child process does an exec: - GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); - - const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + - kFilterFlag + "=" + info->test_suite_name() + - "." + info->name(); - const std::string internal_flag = - std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" - + file_ + "|" + StreamableToString(line_) + "|" - + StreamableToString(death_test_index) + "|" - + StreamableToString(pipe_fd[1]); - Arguments args; - args.AddArguments(GetArgvsForDeathTestChildProcess()); - args.AddArgument(filter_flag.c_str()); - args.AddArgument(internal_flag.c_str()); - - DeathTest::set_last_death_test_message(""); - - CaptureStderr(); - // See the comment in NoExecDeathTest::AssumeRole for why the next line - // is necessary. - FlushInfoLog(); - - const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]); - GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); - set_child_pid(child_pid); - set_read_fd(pipe_fd[0]); - set_spawned(true); - return OVERSEE_TEST; -} - -# endif // !GTEST_OS_WINDOWS - -// Creates a concrete DeathTest-derived class that depends on the -// --gtest_death_test_style flag, and sets the pointer pointed to -// by the "test" argument to its address. If the test should be -// skipped, sets that pointer to NULL. Returns true, unless the -// flag is set to an invalid value. -bool DefaultDeathTestFactory::Create(const char* statement, - Matcher matcher, - const char* file, int line, - DeathTest** test) { - UnitTestImpl* const impl = GetUnitTestImpl(); - const InternalRunDeathTestFlag* const flag = - impl->internal_run_death_test_flag(); - const int death_test_index = impl->current_test_info() - ->increment_death_test_count(); - - if (flag != nullptr) { - if (death_test_index > flag->index()) { - DeathTest::set_last_death_test_message( - "Death test count (" + StreamableToString(death_test_index) - + ") somehow exceeded expected maximum (" - + StreamableToString(flag->index()) + ")"); - return false; - } - - if (!(flag->file() == file && flag->line() == line && - flag->index() == death_test_index)) { - *test = nullptr; - return true; - } - } - -# if GTEST_OS_WINDOWS - - if (GTEST_FLAG(death_test_style) == "threadsafe" || - GTEST_FLAG(death_test_style) == "fast") { - *test = new WindowsDeathTest(statement, std::move(matcher), file, line); - } - -# elif GTEST_OS_FUCHSIA - - if (GTEST_FLAG(death_test_style) == "threadsafe" || - GTEST_FLAG(death_test_style) == "fast") { - *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line); - } - -# else - - if (GTEST_FLAG(death_test_style) == "threadsafe") { - *test = new ExecDeathTest(statement, std::move(matcher), file, line); - } else if (GTEST_FLAG(death_test_style) == "fast") { - *test = new NoExecDeathTest(statement, std::move(matcher)); - } - -# endif // GTEST_OS_WINDOWS - - else { // NOLINT - this is more readable than unbalanced brackets inside #if. - DeathTest::set_last_death_test_message( - "Unknown death test style \"" + GTEST_FLAG(death_test_style) - + "\" encountered"); - return false; - } - - return true; -} - -# if GTEST_OS_WINDOWS -// Recreates the pipe and event handles from the provided parameters, -// signals the event, and returns a file descriptor wrapped around the pipe -// handle. This function is called in the child process only. -static int GetStatusFileDescriptor(unsigned int parent_process_id, - size_t write_handle_as_size_t, - size_t event_handle_as_size_t) { - AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, - FALSE, // Non-inheritable. - parent_process_id)); - if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { - DeathTestAbort("Unable to open parent process " + - StreamableToString(parent_process_id)); - } - - GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); - - const HANDLE write_handle = - reinterpret_cast(write_handle_as_size_t); - HANDLE dup_write_handle; - - // The newly initialized handle is accessible only in the parent - // process. To obtain one accessible within the child, we need to use - // DuplicateHandle. - if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, - ::GetCurrentProcess(), &dup_write_handle, - 0x0, // Requested privileges ignored since - // DUPLICATE_SAME_ACCESS is used. - FALSE, // Request non-inheritable handler. - DUPLICATE_SAME_ACCESS)) { - DeathTestAbort("Unable to duplicate the pipe handle " + - StreamableToString(write_handle_as_size_t) + - " from the parent process " + - StreamableToString(parent_process_id)); - } - - const HANDLE event_handle = reinterpret_cast(event_handle_as_size_t); - HANDLE dup_event_handle; - - if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, - ::GetCurrentProcess(), &dup_event_handle, - 0x0, - FALSE, - DUPLICATE_SAME_ACCESS)) { - DeathTestAbort("Unable to duplicate the event handle " + - StreamableToString(event_handle_as_size_t) + - " from the parent process " + - StreamableToString(parent_process_id)); - } - - const int write_fd = - ::_open_osfhandle(reinterpret_cast(dup_write_handle), O_APPEND); - if (write_fd == -1) { - DeathTestAbort("Unable to convert pipe handle " + - StreamableToString(write_handle_as_size_t) + - " to a file descriptor"); - } - - // Signals the parent that the write end of the pipe has been acquired - // so the parent can release its own write end. - ::SetEvent(dup_event_handle); - - return write_fd; -} -# endif // GTEST_OS_WINDOWS - -// Returns a newly created InternalRunDeathTestFlag object with fields -// initialized from the GTEST_FLAG(internal_run_death_test) flag if -// the flag is specified; otherwise returns NULL. -InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { - if (GTEST_FLAG(internal_run_death_test) == "") return nullptr; - - // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we - // can use it here. - int line = -1; - int index = -1; - ::std::vector< ::std::string> fields; - SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); - int write_fd = -1; - -# if GTEST_OS_WINDOWS - - unsigned int parent_process_id = 0; - size_t write_handle_as_size_t = 0; - size_t event_handle_as_size_t = 0; - - if (fields.size() != 6 - || !ParseNaturalNumber(fields[1], &line) - || !ParseNaturalNumber(fields[2], &index) - || !ParseNaturalNumber(fields[3], &parent_process_id) - || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) - || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { - DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + - GTEST_FLAG(internal_run_death_test)); - } - write_fd = GetStatusFileDescriptor(parent_process_id, - write_handle_as_size_t, - event_handle_as_size_t); - -# elif GTEST_OS_FUCHSIA - - if (fields.size() != 3 - || !ParseNaturalNumber(fields[1], &line) - || !ParseNaturalNumber(fields[2], &index)) { - DeathTestAbort("Bad --gtest_internal_run_death_test flag: " - + GTEST_FLAG(internal_run_death_test)); - } - -# else - - if (fields.size() != 4 - || !ParseNaturalNumber(fields[1], &line) - || !ParseNaturalNumber(fields[2], &index) - || !ParseNaturalNumber(fields[3], &write_fd)) { - DeathTestAbort("Bad --gtest_internal_run_death_test flag: " - + GTEST_FLAG(internal_run_death_test)); - } - -# endif // GTEST_OS_WINDOWS - - return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); -} - -} // namespace internal - -#endif // GTEST_HAS_DEATH_TEST - -} // namespace testing diff --git a/core/deps/gtest/src/gtest-filepath.cc b/core/deps/gtest/src/gtest-filepath.cc deleted file mode 100644 index 97be73023..000000000 --- a/core/deps/gtest/src/gtest-filepath.cc +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "gtest/internal/gtest-filepath.h" - -#include - -#include "gtest/gtest-message.h" -#include "gtest/internal/gtest-port.h" - -#if GTEST_OS_WINDOWS_MOBILE -# include -#elif GTEST_OS_WINDOWS -# include -# include -#else -# include -# include // Some Linux distributions define PATH_MAX here. -#endif // GTEST_OS_WINDOWS_MOBILE - -#include "gtest/internal/gtest-string.h" - -#if GTEST_OS_WINDOWS -# define GTEST_PATH_MAX_ _MAX_PATH -#elif defined(PATH_MAX) -# define GTEST_PATH_MAX_ PATH_MAX -#elif defined(_XOPEN_PATH_MAX) -# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX -#else -# define GTEST_PATH_MAX_ _POSIX_PATH_MAX -#endif // GTEST_OS_WINDOWS - -namespace testing { -namespace internal { - -#if GTEST_OS_WINDOWS -// On Windows, '\\' is the standard path separator, but many tools and the -// Windows API also accept '/' as an alternate path separator. Unless otherwise -// noted, a file path can contain either kind of path separators, or a mixture -// of them. -const char kPathSeparator = '\\'; -const char kAlternatePathSeparator = '/'; -const char kAlternatePathSeparatorString[] = "/"; -# if GTEST_OS_WINDOWS_MOBILE -// Windows CE doesn't have a current directory. You should not use -// the current directory in tests on Windows CE, but this at least -// provides a reasonable fallback. -const char kCurrentDirectoryString[] = "\\"; -// Windows CE doesn't define INVALID_FILE_ATTRIBUTES -const DWORD kInvalidFileAttributes = 0xffffffff; -# else -const char kCurrentDirectoryString[] = ".\\"; -# endif // GTEST_OS_WINDOWS_MOBILE -#else -const char kPathSeparator = '/'; -const char kCurrentDirectoryString[] = "./"; -#endif // GTEST_OS_WINDOWS - -// Returns whether the given character is a valid path separator. -static bool IsPathSeparator(char c) { -#if GTEST_HAS_ALT_PATH_SEP_ - return (c == kPathSeparator) || (c == kAlternatePathSeparator); -#else - return c == kPathSeparator; -#endif -} - -// Returns the current working directory, or "" if unsuccessful. -FilePath FilePath::GetCurrentDir() { -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ - GTEST_OS_WINDOWS_RT || GTEST_OS_ESP8266 || GTEST_OS_ESP32 - // These platforms do not have a current directory, so we just return - // something reasonable. - return FilePath(kCurrentDirectoryString); -#elif GTEST_OS_WINDOWS - char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; - return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd); -#else - char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; - char* result = getcwd(cwd, sizeof(cwd)); -# if GTEST_OS_NACL - // getcwd will likely fail in NaCl due to the sandbox, so return something - // reasonable. The user may have provided a shim implementation for getcwd, - // however, so fallback only when failure is detected. - return FilePath(result == nullptr ? kCurrentDirectoryString : cwd); -# endif // GTEST_OS_NACL - return FilePath(result == nullptr ? "" : cwd); -#endif // GTEST_OS_WINDOWS_MOBILE -} - -// Returns a copy of the FilePath with the case-insensitive extension removed. -// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns -// FilePath("dir/file"). If a case-insensitive extension is not -// found, returns a copy of the original FilePath. -FilePath FilePath::RemoveExtension(const char* extension) const { - const std::string dot_extension = std::string(".") + extension; - if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) { - return FilePath(pathname_.substr( - 0, pathname_.length() - dot_extension.length())); - } - return *this; -} - -// Returns a pointer to the last occurrence of a valid path separator in -// the FilePath. On Windows, for example, both '/' and '\' are valid path -// separators. Returns NULL if no path separator was found. -const char* FilePath::FindLastPathSeparator() const { - const char* const last_sep = strrchr(c_str(), kPathSeparator); -#if GTEST_HAS_ALT_PATH_SEP_ - const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); - // Comparing two pointers of which only one is NULL is undefined. - if (last_alt_sep != nullptr && - (last_sep == nullptr || last_alt_sep > last_sep)) { - return last_alt_sep; - } -#endif - return last_sep; -} - -// Returns a copy of the FilePath with the directory part removed. -// Example: FilePath("path/to/file").RemoveDirectoryName() returns -// FilePath("file"). If there is no directory part ("just_a_file"), it returns -// the FilePath unmodified. If there is no file part ("just_a_dir/") it -// returns an empty FilePath (""). -// On Windows platform, '\' is the path separator, otherwise it is '/'. -FilePath FilePath::RemoveDirectoryName() const { - const char* const last_sep = FindLastPathSeparator(); - return last_sep ? FilePath(last_sep + 1) : *this; -} - -// RemoveFileName returns the directory path with the filename removed. -// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". -// If the FilePath is "a_file" or "/a_file", RemoveFileName returns -// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does -// not have a file, like "just/a/dir/", it returns the FilePath unmodified. -// On Windows platform, '\' is the path separator, otherwise it is '/'. -FilePath FilePath::RemoveFileName() const { - const char* const last_sep = FindLastPathSeparator(); - std::string dir; - if (last_sep) { - dir = std::string(c_str(), static_cast(last_sep + 1 - c_str())); - } else { - dir = kCurrentDirectoryString; - } - return FilePath(dir); -} - -// Helper functions for naming files in a directory for xml output. - -// Given directory = "dir", base_name = "test", number = 0, -// extension = "xml", returns "dir/test.xml". If number is greater -// than zero (e.g., 12), returns "dir/test_12.xml". -// On Windows platform, uses \ as the separator rather than /. -FilePath FilePath::MakeFileName(const FilePath& directory, - const FilePath& base_name, - int number, - const char* extension) { - std::string file; - if (number == 0) { - file = base_name.string() + "." + extension; - } else { - file = base_name.string() + "_" + StreamableToString(number) - + "." + extension; - } - return ConcatPaths(directory, FilePath(file)); -} - -// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". -// On Windows, uses \ as the separator rather than /. -FilePath FilePath::ConcatPaths(const FilePath& directory, - const FilePath& relative_path) { - if (directory.IsEmpty()) - return relative_path; - const FilePath dir(directory.RemoveTrailingPathSeparator()); - return FilePath(dir.string() + kPathSeparator + relative_path.string()); -} - -// Returns true if pathname describes something findable in the file-system, -// either a file, directory, or whatever. -bool FilePath::FileOrDirectoryExists() const { -#if GTEST_OS_WINDOWS_MOBILE - LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); - const DWORD attributes = GetFileAttributes(unicode); - delete [] unicode; - return attributes != kInvalidFileAttributes; -#else - posix::StatStruct file_stat; - return posix::Stat(pathname_.c_str(), &file_stat) == 0; -#endif // GTEST_OS_WINDOWS_MOBILE -} - -// Returns true if pathname describes a directory in the file-system -// that exists. -bool FilePath::DirectoryExists() const { - bool result = false; -#if GTEST_OS_WINDOWS - // Don't strip off trailing separator if path is a root directory on - // Windows (like "C:\\"). - const FilePath& path(IsRootDirectory() ? *this : - RemoveTrailingPathSeparator()); -#else - const FilePath& path(*this); -#endif - -#if GTEST_OS_WINDOWS_MOBILE - LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); - const DWORD attributes = GetFileAttributes(unicode); - delete [] unicode; - if ((attributes != kInvalidFileAttributes) && - (attributes & FILE_ATTRIBUTE_DIRECTORY)) { - result = true; - } -#else - posix::StatStruct file_stat; - result = posix::Stat(path.c_str(), &file_stat) == 0 && - posix::IsDir(file_stat); -#endif // GTEST_OS_WINDOWS_MOBILE - - return result; -} - -// Returns true if pathname describes a root directory. (Windows has one -// root directory per disk drive.) -bool FilePath::IsRootDirectory() const { -#if GTEST_OS_WINDOWS - return pathname_.length() == 3 && IsAbsolutePath(); -#else - return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); -#endif -} - -// Returns true if pathname describes an absolute path. -bool FilePath::IsAbsolutePath() const { - const char* const name = pathname_.c_str(); -#if GTEST_OS_WINDOWS - return pathname_.length() >= 3 && - ((name[0] >= 'a' && name[0] <= 'z') || - (name[0] >= 'A' && name[0] <= 'Z')) && - name[1] == ':' && - IsPathSeparator(name[2]); -#else - return IsPathSeparator(name[0]); -#endif -} - -// Returns a pathname for a file that does not currently exist. The pathname -// will be directory/base_name.extension or -// directory/base_name_.extension if directory/base_name.extension -// already exists. The number will be incremented until a pathname is found -// that does not already exist. -// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. -// There could be a race condition if two or more processes are calling this -// function at the same time -- they could both pick the same filename. -FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, - const FilePath& base_name, - const char* extension) { - FilePath full_pathname; - int number = 0; - do { - full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); - } while (full_pathname.FileOrDirectoryExists()); - return full_pathname; -} - -// Returns true if FilePath ends with a path separator, which indicates that -// it is intended to represent a directory. Returns false otherwise. -// This does NOT check that a directory (or file) actually exists. -bool FilePath::IsDirectory() const { - return !pathname_.empty() && - IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); -} - -// Create directories so that path exists. Returns true if successful or if -// the directories already exist; returns false if unable to create directories -// for any reason. -bool FilePath::CreateDirectoriesRecursively() const { - if (!this->IsDirectory()) { - return false; - } - - if (pathname_.length() == 0 || this->DirectoryExists()) { - return true; - } - - const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); - return parent.CreateDirectoriesRecursively() && this->CreateFolder(); -} - -// Create the directory so that path exists. Returns true if successful or -// if the directory already exists; returns false if unable to create the -// directory for any reason, including if the parent directory does not -// exist. Not named "CreateDirectory" because that's a macro on Windows. -bool FilePath::CreateFolder() const { -#if GTEST_OS_WINDOWS_MOBILE - FilePath removed_sep(this->RemoveTrailingPathSeparator()); - LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); - int result = CreateDirectory(unicode, nullptr) ? 0 : -1; - delete [] unicode; -#elif GTEST_OS_WINDOWS - int result = _mkdir(pathname_.c_str()); -#elif GTEST_OS_ESP8266 - // do nothing - int result = 0; -#else - int result = mkdir(pathname_.c_str(), 0777); -#endif // GTEST_OS_WINDOWS_MOBILE - - if (result == -1) { - return this->DirectoryExists(); // An error is OK if the directory exists. - } - return true; // No error. -} - -// If input name has a trailing separator character, remove it and return the -// name, otherwise return the name string unmodified. -// On Windows platform, uses \ as the separator, other platforms use /. -FilePath FilePath::RemoveTrailingPathSeparator() const { - return IsDirectory() - ? FilePath(pathname_.substr(0, pathname_.length() - 1)) - : *this; -} - -// Removes any redundant separators that might be in the pathname. -// For example, "bar///foo" becomes "bar/foo". Does not eliminate other -// redundancies that might be in a pathname involving "." or "..". -void FilePath::Normalize() { - if (pathname_.c_str() == nullptr) { - pathname_ = ""; - return; - } - const char* src = pathname_.c_str(); - char* const dest = new char[pathname_.length() + 1]; - char* dest_ptr = dest; - memset(dest_ptr, 0, pathname_.length() + 1); - - while (*src != '\0') { - *dest_ptr = *src; - if (!IsPathSeparator(*src)) { - src++; - } else { -#if GTEST_HAS_ALT_PATH_SEP_ - if (*dest_ptr == kAlternatePathSeparator) { - *dest_ptr = kPathSeparator; - } -#endif - while (IsPathSeparator(*src)) - src++; - } - dest_ptr++; - } - *dest_ptr = '\0'; - pathname_ = dest; - delete[] dest; -} - -} // namespace internal -} // namespace testing diff --git a/core/deps/gtest/src/gtest-internal-inl.h b/core/deps/gtest/src/gtest-internal-inl.h deleted file mode 100644 index 8ed70daab..000000000 --- a/core/deps/gtest/src/gtest-internal-inl.h +++ /dev/null @@ -1,1211 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Utility functions and classes used by the Google C++ testing framework.// -// This file contains purely Google Test's internal implementation. Please -// DO NOT #INCLUDE IT IN A USER PROGRAM. - -#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ -#define GTEST_SRC_GTEST_INTERNAL_INL_H_ - -#ifndef _WIN32_WCE -# include -#endif // !_WIN32_WCE -#include -#include // For strtoll/_strtoul64/malloc/free. -#include // For memmove. - -#include -#include -#include -#include - -#include "gtest/internal/gtest-port.h" - -#if GTEST_CAN_STREAM_RESULTS_ -# include // NOLINT -# include // NOLINT -#endif - -#if GTEST_OS_WINDOWS -# include // NOLINT -#endif // GTEST_OS_WINDOWS - -#include "gtest/gtest.h" -#include "gtest/gtest-spi.h" - -GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ -/* class A needs to have dll-interface to be used by clients of class B */) - -namespace testing { - -// Declares the flags. -// -// We don't want the users to modify this flag in the code, but want -// Google Test's own unit tests to be able to access it. Therefore we -// declare it here as opposed to in gtest.h. -GTEST_DECLARE_bool_(death_test_use_fork); - -namespace internal { - -// The value of GetTestTypeId() as seen from within the Google Test -// library. This is solely for testing GetTestTypeId(). -GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; - -// Names of the flags (needed for parsing Google Test flags). -const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; -const char kBreakOnFailureFlag[] = "break_on_failure"; -const char kCatchExceptionsFlag[] = "catch_exceptions"; -const char kColorFlag[] = "color"; -const char kFilterFlag[] = "filter"; -const char kListTestsFlag[] = "list_tests"; -const char kOutputFlag[] = "output"; -const char kPrintTimeFlag[] = "print_time"; -const char kPrintUTF8Flag[] = "print_utf8"; -const char kRandomSeedFlag[] = "random_seed"; -const char kRepeatFlag[] = "repeat"; -const char kShuffleFlag[] = "shuffle"; -const char kStackTraceDepthFlag[] = "stack_trace_depth"; -const char kStreamResultToFlag[] = "stream_result_to"; -const char kThrowOnFailureFlag[] = "throw_on_failure"; -const char kFlagfileFlag[] = "flagfile"; - -// A valid random seed must be in [1, kMaxRandomSeed]. -const int kMaxRandomSeed = 99999; - -// g_help_flag is true if and only if the --help flag or an equivalent form -// is specified on the command line. -GTEST_API_ extern bool g_help_flag; - -// Returns the current time in milliseconds. -GTEST_API_ TimeInMillis GetTimeInMillis(); - -// Returns true if and only if Google Test should use colors in the output. -GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); - -// Formats the given time in milliseconds as seconds. -GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); - -// Converts the given time in milliseconds to a date string in the ISO 8601 -// format, without the timezone information. N.B.: due to the use the -// non-reentrant localtime() function, this function is not thread safe. Do -// not use it in any code that can be called from multiple threads. -GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); - -// Parses a string for an Int32 flag, in the form of "--flag=value". -// -// On success, stores the value of the flag in *value, and returns -// true. On failure, returns false without changing *value. -GTEST_API_ bool ParseInt32Flag( - const char* str, const char* flag, Int32* value); - -// Returns a random seed in range [1, kMaxRandomSeed] based on the -// given --gtest_random_seed flag value. -inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { - const unsigned int raw_seed = (random_seed_flag == 0) ? - static_cast(GetTimeInMillis()) : - static_cast(random_seed_flag); - - // Normalizes the actual seed to range [1, kMaxRandomSeed] such that - // it's easy to type. - const int normalized_seed = - static_cast((raw_seed - 1U) % - static_cast(kMaxRandomSeed)) + 1; - return normalized_seed; -} - -// Returns the first valid random seed after 'seed'. The behavior is -// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is -// considered to be 1. -inline int GetNextRandomSeed(int seed) { - GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) - << "Invalid random seed " << seed << " - must be in [1, " - << kMaxRandomSeed << "]."; - const int next_seed = seed + 1; - return (next_seed > kMaxRandomSeed) ? 1 : next_seed; -} - -// This class saves the values of all Google Test flags in its c'tor, and -// restores them in its d'tor. -class GTestFlagSaver { - public: - // The c'tor. - GTestFlagSaver() { - also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); - break_on_failure_ = GTEST_FLAG(break_on_failure); - catch_exceptions_ = GTEST_FLAG(catch_exceptions); - color_ = GTEST_FLAG(color); - death_test_style_ = GTEST_FLAG(death_test_style); - death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); - filter_ = GTEST_FLAG(filter); - internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); - list_tests_ = GTEST_FLAG(list_tests); - output_ = GTEST_FLAG(output); - print_time_ = GTEST_FLAG(print_time); - print_utf8_ = GTEST_FLAG(print_utf8); - random_seed_ = GTEST_FLAG(random_seed); - repeat_ = GTEST_FLAG(repeat); - shuffle_ = GTEST_FLAG(shuffle); - stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); - stream_result_to_ = GTEST_FLAG(stream_result_to); - throw_on_failure_ = GTEST_FLAG(throw_on_failure); - } - - // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. - ~GTestFlagSaver() { - GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; - GTEST_FLAG(break_on_failure) = break_on_failure_; - GTEST_FLAG(catch_exceptions) = catch_exceptions_; - GTEST_FLAG(color) = color_; - GTEST_FLAG(death_test_style) = death_test_style_; - GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; - GTEST_FLAG(filter) = filter_; - GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; - GTEST_FLAG(list_tests) = list_tests_; - GTEST_FLAG(output) = output_; - GTEST_FLAG(print_time) = print_time_; - GTEST_FLAG(print_utf8) = print_utf8_; - GTEST_FLAG(random_seed) = random_seed_; - GTEST_FLAG(repeat) = repeat_; - GTEST_FLAG(shuffle) = shuffle_; - GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; - GTEST_FLAG(stream_result_to) = stream_result_to_; - GTEST_FLAG(throw_on_failure) = throw_on_failure_; - } - - private: - // Fields for saving the original values of flags. - bool also_run_disabled_tests_; - bool break_on_failure_; - bool catch_exceptions_; - std::string color_; - std::string death_test_style_; - bool death_test_use_fork_; - std::string filter_; - std::string internal_run_death_test_; - bool list_tests_; - std::string output_; - bool print_time_; - bool print_utf8_; - internal::Int32 random_seed_; - internal::Int32 repeat_; - bool shuffle_; - internal::Int32 stack_trace_depth_; - std::string stream_result_to_; - bool throw_on_failure_; -} GTEST_ATTRIBUTE_UNUSED_; - -// Converts a Unicode code point to a narrow string in UTF-8 encoding. -// code_point parameter is of type UInt32 because wchar_t may not be -// wide enough to contain a code point. -// If the code_point is not a valid Unicode code point -// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted -// to "(Invalid Unicode 0xXXXXXXXX)". -GTEST_API_ std::string CodePointToUtf8(UInt32 code_point); - -// Converts a wide string to a narrow string in UTF-8 encoding. -// The wide string is assumed to have the following encoding: -// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin) -// UTF-32 if sizeof(wchar_t) == 4 (on Linux) -// Parameter str points to a null-terminated wide string. -// Parameter num_chars may additionally limit the number -// of wchar_t characters processed. -1 is used when the entire string -// should be processed. -// If the string contains code points that are not valid Unicode code points -// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output -// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding -// and contains invalid UTF-16 surrogate pairs, values in those pairs -// will be encoded as individual Unicode characters from Basic Normal Plane. -GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars); - -// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file -// if the variable is present. If a file already exists at this location, this -// function will write over it. If the variable is present, but the file cannot -// be created, prints an error and exits. -void WriteToShardStatusFileIfNeeded(); - -// Checks whether sharding is enabled by examining the relevant -// environment variable values. If the variables are present, -// but inconsistent (e.g., shard_index >= total_shards), prints -// an error and exits. If in_subprocess_for_death_test, sharding is -// disabled because it must only be applied to the original test -// process. Otherwise, we could filter out death tests we intended to execute. -GTEST_API_ bool ShouldShard(const char* total_shards_str, - const char* shard_index_str, - bool in_subprocess_for_death_test); - -// Parses the environment variable var as an Int32. If it is unset, -// returns default_val. If it is not an Int32, prints an error and -// and aborts. -GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); - -// Given the total number of shards, the shard index, and the test id, -// returns true if and only if the test should be run on this shard. The test id -// is some arbitrary but unique non-negative integer assigned to each test -// method. Assumes that 0 <= shard_index < total_shards. -GTEST_API_ bool ShouldRunTestOnShard( - int total_shards, int shard_index, int test_id); - -// STL container utilities. - -// Returns the number of elements in the given container that satisfy -// the given predicate. -template -inline int CountIf(const Container& c, Predicate predicate) { - // Implemented as an explicit loop since std::count_if() in libCstd on - // Solaris has a non-standard signature. - int count = 0; - for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { - if (predicate(*it)) - ++count; - } - return count; -} - -// Applies a function/functor to each element in the container. -template -void ForEach(const Container& c, Functor functor) { - std::for_each(c.begin(), c.end(), functor); -} - -// Returns the i-th element of the vector, or default_value if i is not -// in range [0, v.size()). -template -inline E GetElementOr(const std::vector& v, int i, E default_value) { - return (i < 0 || i >= static_cast(v.size())) ? default_value - : v[static_cast(i)]; -} - -// Performs an in-place shuffle of a range of the vector's elements. -// 'begin' and 'end' are element indices as an STL-style range; -// i.e. [begin, end) are shuffled, where 'end' == size() means to -// shuffle to the end of the vector. -template -void ShuffleRange(internal::Random* random, int begin, int end, - std::vector* v) { - const int size = static_cast(v->size()); - GTEST_CHECK_(0 <= begin && begin <= size) - << "Invalid shuffle range start " << begin << ": must be in range [0, " - << size << "]."; - GTEST_CHECK_(begin <= end && end <= size) - << "Invalid shuffle range finish " << end << ": must be in range [" - << begin << ", " << size << "]."; - - // Fisher-Yates shuffle, from - // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle - for (int range_width = end - begin; range_width >= 2; range_width--) { - const int last_in_range = begin + range_width - 1; - const int selected = - begin + - static_cast(random->Generate(static_cast(range_width))); - std::swap((*v)[static_cast(selected)], - (*v)[static_cast(last_in_range)]); - } -} - -// Performs an in-place shuffle of the vector's elements. -template -inline void Shuffle(internal::Random* random, std::vector* v) { - ShuffleRange(random, 0, static_cast(v->size()), v); -} - -// A function for deleting an object. Handy for being used as a -// functor. -template -static void Delete(T* x) { - delete x; -} - -// A predicate that checks the key of a TestProperty against a known key. -// -// TestPropertyKeyIs is copyable. -class TestPropertyKeyIs { - public: - // Constructor. - // - // TestPropertyKeyIs has NO default constructor. - explicit TestPropertyKeyIs(const std::string& key) : key_(key) {} - - // Returns true if and only if the test name of test property matches on key_. - bool operator()(const TestProperty& test_property) const { - return test_property.key() == key_; - } - - private: - std::string key_; -}; - -// Class UnitTestOptions. -// -// This class contains functions for processing options the user -// specifies when running the tests. It has only static members. -// -// In most cases, the user can specify an option using either an -// environment variable or a command line flag. E.g. you can set the -// test filter using either GTEST_FILTER or --gtest_filter. If both -// the variable and the flag are present, the latter overrides the -// former. -class GTEST_API_ UnitTestOptions { - public: - // Functions for processing the gtest_output flag. - - // Returns the output format, or "" for normal printed output. - static std::string GetOutputFormat(); - - // Returns the absolute path of the requested output file, or the - // default (test_detail.xml in the original working directory) if - // none was explicitly specified. - static std::string GetAbsolutePathToOutputFile(); - - // Functions for processing the gtest_filter flag. - - // Returns true if and only if the wildcard pattern matches the string. - // The first ':' or '\0' character in pattern marks the end of it. - // - // This recursive algorithm isn't very efficient, but is clear and - // works well enough for matching test names, which are short. - static bool PatternMatchesString(const char *pattern, const char *str); - - // Returns true if and only if the user-specified filter matches the test - // suite name and the test name. - static bool FilterMatchesTest(const std::string& test_suite_name, - const std::string& test_name); - -#if GTEST_OS_WINDOWS - // Function for supporting the gtest_catch_exception flag. - - // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the - // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. - // This function is useful as an __except condition. - static int GTestShouldProcessSEH(DWORD exception_code); -#endif // GTEST_OS_WINDOWS - - // Returns true if "name" matches the ':' separated list of glob-style - // filters in "filter". - static bool MatchesFilter(const std::string& name, const char* filter); -}; - -// Returns the current application's name, removing directory path if that -// is present. Used by UnitTestOptions::GetOutputFile. -GTEST_API_ FilePath GetCurrentExecutableName(); - -// The role interface for getting the OS stack trace as a string. -class OsStackTraceGetterInterface { - public: - OsStackTraceGetterInterface() {} - virtual ~OsStackTraceGetterInterface() {} - - // Returns the current OS stack trace as an std::string. Parameters: - // - // max_depth - the maximum number of stack frames to be included - // in the trace. - // skip_count - the number of top frames to be skipped; doesn't count - // against max_depth. - virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0; - - // UponLeavingGTest() should be called immediately before Google Test calls - // user code. It saves some information about the current stack that - // CurrentStackTrace() will use to find and hide Google Test stack frames. - virtual void UponLeavingGTest() = 0; - - // This string is inserted in place of stack frames that are part of - // Google Test's implementation. - static const char* const kElidedFramesMarker; - - private: - GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); -}; - -// A working implementation of the OsStackTraceGetterInterface interface. -class OsStackTraceGetter : public OsStackTraceGetterInterface { - public: - OsStackTraceGetter() {} - - std::string CurrentStackTrace(int max_depth, int skip_count) override; - void UponLeavingGTest() override; - - private: -#if GTEST_HAS_ABSL - Mutex mutex_; // Protects all internal state. - - // We save the stack frame below the frame that calls user code. - // We do this because the address of the frame immediately below - // the user code changes between the call to UponLeavingGTest() - // and any calls to the stack trace code from within the user code. - void* caller_frame_ = nullptr; -#endif // GTEST_HAS_ABSL - - GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); -}; - -// Information about a Google Test trace point. -struct TraceInfo { - const char* file; - int line; - std::string message; -}; - -// This is the default global test part result reporter used in UnitTestImpl. -// This class should only be used by UnitTestImpl. -class DefaultGlobalTestPartResultReporter - : public TestPartResultReporterInterface { - public: - explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); - // Implements the TestPartResultReporterInterface. Reports the test part - // result in the current test. - void ReportTestPartResult(const TestPartResult& result) override; - - private: - UnitTestImpl* const unit_test_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); -}; - -// This is the default per thread test part result reporter used in -// UnitTestImpl. This class should only be used by UnitTestImpl. -class DefaultPerThreadTestPartResultReporter - : public TestPartResultReporterInterface { - public: - explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); - // Implements the TestPartResultReporterInterface. The implementation just - // delegates to the current global test part result reporter of *unit_test_. - void ReportTestPartResult(const TestPartResult& result) override; - - private: - UnitTestImpl* const unit_test_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); -}; - -// The private implementation of the UnitTest class. We don't protect -// the methods under a mutex, as this class is not accessible by a -// user and the UnitTest class that delegates work to this class does -// proper locking. -class GTEST_API_ UnitTestImpl { - public: - explicit UnitTestImpl(UnitTest* parent); - virtual ~UnitTestImpl(); - - // There are two different ways to register your own TestPartResultReporter. - // You can register your own repoter to listen either only for test results - // from the current thread or for results from all threads. - // By default, each per-thread test result repoter just passes a new - // TestPartResult to the global test result reporter, which registers the - // test part result for the currently running test. - - // Returns the global test part result reporter. - TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); - - // Sets the global test part result reporter. - void SetGlobalTestPartResultReporter( - TestPartResultReporterInterface* reporter); - - // Returns the test part result reporter for the current thread. - TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); - - // Sets the test part result reporter for the current thread. - void SetTestPartResultReporterForCurrentThread( - TestPartResultReporterInterface* reporter); - - // Gets the number of successful test suites. - int successful_test_suite_count() const; - - // Gets the number of failed test suites. - int failed_test_suite_count() const; - - // Gets the number of all test suites. - int total_test_suite_count() const; - - // Gets the number of all test suites that contain at least one test - // that should run. - int test_suite_to_run_count() const; - - // Gets the number of successful tests. - int successful_test_count() const; - - // Gets the number of skipped tests. - int skipped_test_count() const; - - // Gets the number of failed tests. - int failed_test_count() const; - - // Gets the number of disabled tests that will be reported in the XML report. - int reportable_disabled_test_count() const; - - // Gets the number of disabled tests. - int disabled_test_count() const; - - // Gets the number of tests to be printed in the XML report. - int reportable_test_count() const; - - // Gets the number of all tests. - int total_test_count() const; - - // Gets the number of tests that should run. - int test_to_run_count() const; - - // Gets the time of the test program start, in ms from the start of the - // UNIX epoch. - TimeInMillis start_timestamp() const { return start_timestamp_; } - - // Gets the elapsed time, in milliseconds. - TimeInMillis elapsed_time() const { return elapsed_time_; } - - // Returns true if and only if the unit test passed (i.e. all test suites - // passed). - bool Passed() const { return !Failed(); } - - // Returns true if and only if the unit test failed (i.e. some test suite - // failed or something outside of all tests failed). - bool Failed() const { - return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed(); - } - - // Gets the i-th test suite among all the test suites. i can range from 0 to - // total_test_suite_count() - 1. If i is not in that range, returns NULL. - const TestSuite* GetTestSuite(int i) const { - const int index = GetElementOr(test_suite_indices_, i, -1); - return index < 0 ? nullptr : test_suites_[static_cast(i)]; - } - - // Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - const TestCase* GetTestCase(int i) const { return GetTestSuite(i); } -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Gets the i-th test suite among all the test suites. i can range from 0 to - // total_test_suite_count() - 1. If i is not in that range, returns NULL. - TestSuite* GetMutableSuiteCase(int i) { - const int index = GetElementOr(test_suite_indices_, i, -1); - return index < 0 ? nullptr : test_suites_[static_cast(index)]; - } - - // Provides access to the event listener list. - TestEventListeners* listeners() { return &listeners_; } - - // Returns the TestResult for the test that's currently running, or - // the TestResult for the ad hoc test if no test is running. - TestResult* current_test_result(); - - // Returns the TestResult for the ad hoc test. - const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } - - // Sets the OS stack trace getter. - // - // Does nothing if the input and the current OS stack trace getter - // are the same; otherwise, deletes the old getter and makes the - // input the current getter. - void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); - - // Returns the current OS stack trace getter if it is not NULL; - // otherwise, creates an OsStackTraceGetter, makes it the current - // getter, and returns it. - OsStackTraceGetterInterface* os_stack_trace_getter(); - - // Returns the current OS stack trace as an std::string. - // - // The maximum number of stack frames to be included is specified by - // the gtest_stack_trace_depth flag. The skip_count parameter - // specifies the number of top frames to be skipped, which doesn't - // count against the number of frames to be included. - // - // For example, if Foo() calls Bar(), which in turn calls - // CurrentOsStackTraceExceptTop(1), Foo() will be included in the - // trace but Bar() and CurrentOsStackTraceExceptTop() won't. - std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_; - - // Finds and returns a TestSuite with the given name. If one doesn't - // exist, creates one and returns it. - // - // Arguments: - // - // test_suite_name: name of the test suite - // type_param: the name of the test's type parameter, or NULL if - // this is not a typed or a type-parameterized test. - // set_up_tc: pointer to the function that sets up the test suite - // tear_down_tc: pointer to the function that tears down the test suite - TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param, - internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc); - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - TestCase* GetTestCase(const char* test_case_name, const char* type_param, - internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc) { - return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc); - } -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - // Adds a TestInfo to the unit test. - // - // Arguments: - // - // set_up_tc: pointer to the function that sets up the test suite - // tear_down_tc: pointer to the function that tears down the test suite - // test_info: the TestInfo object - void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc, - TestInfo* test_info) { - // In order to support thread-safe death tests, we need to - // remember the original working directory when the test program - // was first invoked. We cannot do this in RUN_ALL_TESTS(), as - // the user may have changed the current directory before calling - // RUN_ALL_TESTS(). Therefore we capture the current directory in - // AddTestInfo(), which is called to register a TEST or TEST_F - // before main() is reached. - if (original_working_dir_.IsEmpty()) { - original_working_dir_.Set(FilePath::GetCurrentDir()); - GTEST_CHECK_(!original_working_dir_.IsEmpty()) - << "Failed to get the current working directory."; - } - - GetTestSuite(test_info->test_suite_name(), test_info->type_param(), - set_up_tc, tear_down_tc) - ->AddTestInfo(test_info); - } - - // Returns ParameterizedTestSuiteRegistry object used to keep track of - // value-parameterized tests and instantiate and register them. - internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() { - return parameterized_test_registry_; - } - - // Sets the TestSuite object for the test that's currently running. - void set_current_test_suite(TestSuite* a_current_test_suite) { - current_test_suite_ = a_current_test_suite; - } - - // Sets the TestInfo object for the test that's currently running. If - // current_test_info is NULL, the assertion results will be stored in - // ad_hoc_test_result_. - void set_current_test_info(TestInfo* a_current_test_info) { - current_test_info_ = a_current_test_info; - } - - // Registers all parameterized tests defined using TEST_P and - // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter - // combination. This method can be called more then once; it has guards - // protecting from registering the tests more then once. If - // value-parameterized tests are disabled, RegisterParameterizedTests is - // present but does nothing. - void RegisterParameterizedTests(); - - // Runs all tests in this UnitTest object, prints the result, and - // returns true if all tests are successful. If any exception is - // thrown during a test, this test is considered to be failed, but - // the rest of the tests will still be run. - bool RunAllTests(); - - // Clears the results of all tests, except the ad hoc tests. - void ClearNonAdHocTestResult() { - ForEach(test_suites_, TestSuite::ClearTestSuiteResult); - } - - // Clears the results of ad-hoc test assertions. - void ClearAdHocTestResult() { - ad_hoc_test_result_.Clear(); - } - - // Adds a TestProperty to the current TestResult object when invoked in a - // context of a test or a test suite, or to the global property set. If the - // result already contains a property with the same key, the value will be - // updated. - void RecordProperty(const TestProperty& test_property); - - enum ReactionToSharding { - HONOR_SHARDING_PROTOCOL, - IGNORE_SHARDING_PROTOCOL - }; - - // Matches the full name of each test against the user-specified - // filter to decide whether the test should run, then records the - // result in each TestSuite and TestInfo object. - // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests - // based on sharding variables in the environment. - // Returns the number of tests that should run. - int FilterTests(ReactionToSharding shard_tests); - - // Prints the names of the tests matching the user-specified filter flag. - void ListTestsMatchingFilter(); - - const TestSuite* current_test_suite() const { return current_test_suite_; } - TestInfo* current_test_info() { return current_test_info_; } - const TestInfo* current_test_info() const { return current_test_info_; } - - // Returns the vector of environments that need to be set-up/torn-down - // before/after the tests are run. - std::vector& environments() { return environments_; } - - // Getters for the per-thread Google Test trace stack. - std::vector& gtest_trace_stack() { - return *(gtest_trace_stack_.pointer()); - } - const std::vector& gtest_trace_stack() const { - return gtest_trace_stack_.get(); - } - -#if GTEST_HAS_DEATH_TEST - void InitDeathTestSubprocessControlInfo() { - internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); - } - // Returns a pointer to the parsed --gtest_internal_run_death_test - // flag, or NULL if that flag was not specified. - // This information is useful only in a death test child process. - // Must not be called before a call to InitGoogleTest. - const InternalRunDeathTestFlag* internal_run_death_test_flag() const { - return internal_run_death_test_flag_.get(); - } - - // Returns a pointer to the current death test factory. - internal::DeathTestFactory* death_test_factory() { - return death_test_factory_.get(); - } - - void SuppressTestEventsIfInSubprocess(); - - friend class ReplaceDeathTestFactory; -#endif // GTEST_HAS_DEATH_TEST - - // Initializes the event listener performing XML output as specified by - // UnitTestOptions. Must not be called before InitGoogleTest. - void ConfigureXmlOutput(); - -#if GTEST_CAN_STREAM_RESULTS_ - // Initializes the event listener for streaming test results to a socket. - // Must not be called before InitGoogleTest. - void ConfigureStreamingOutput(); -#endif - - // Performs initialization dependent upon flag values obtained in - // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to - // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest - // this function is also called from RunAllTests. Since this function can be - // called more than once, it has to be idempotent. - void PostFlagParsingInit(); - - // Gets the random seed used at the start of the current test iteration. - int random_seed() const { return random_seed_; } - - // Gets the random number generator. - internal::Random* random() { return &random_; } - - // Shuffles all test suites, and the tests within each test suite, - // making sure that death tests are still run first. - void ShuffleTests(); - - // Restores the test suites and tests to their order before the first shuffle. - void UnshuffleTests(); - - // Returns the value of GTEST_FLAG(catch_exceptions) at the moment - // UnitTest::Run() starts. - bool catch_exceptions() const { return catch_exceptions_; } - - private: - friend class ::testing::UnitTest; - - // Used by UnitTest::Run() to capture the state of - // GTEST_FLAG(catch_exceptions) at the moment it starts. - void set_catch_exceptions(bool value) { catch_exceptions_ = value; } - - // The UnitTest object that owns this implementation object. - UnitTest* const parent_; - - // The working directory when the first TEST() or TEST_F() was - // executed. - internal::FilePath original_working_dir_; - - // The default test part result reporters. - DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; - DefaultPerThreadTestPartResultReporter - default_per_thread_test_part_result_reporter_; - - // Points to (but doesn't own) the global test part result reporter. - TestPartResultReporterInterface* global_test_part_result_repoter_; - - // Protects read and write access to global_test_part_result_reporter_. - internal::Mutex global_test_part_result_reporter_mutex_; - - // Points to (but doesn't own) the per-thread test part result reporter. - internal::ThreadLocal - per_thread_test_part_result_reporter_; - - // The vector of environments that need to be set-up/torn-down - // before/after the tests are run. - std::vector environments_; - - // The vector of TestSuites in their original order. It owns the - // elements in the vector. - std::vector test_suites_; - - // Provides a level of indirection for the test suite list to allow - // easy shuffling and restoring the test suite order. The i-th - // element of this vector is the index of the i-th test suite in the - // shuffled order. - std::vector test_suite_indices_; - - // ParameterizedTestRegistry object used to register value-parameterized - // tests. - internal::ParameterizedTestSuiteRegistry parameterized_test_registry_; - - // Indicates whether RegisterParameterizedTests() has been called already. - bool parameterized_tests_registered_; - - // Index of the last death test suite registered. Initially -1. - int last_death_test_suite_; - - // This points to the TestSuite for the currently running test. It - // changes as Google Test goes through one test suite after another. - // When no test is running, this is set to NULL and Google Test - // stores assertion results in ad_hoc_test_result_. Initially NULL. - TestSuite* current_test_suite_; - - // This points to the TestInfo for the currently running test. It - // changes as Google Test goes through one test after another. When - // no test is running, this is set to NULL and Google Test stores - // assertion results in ad_hoc_test_result_. Initially NULL. - TestInfo* current_test_info_; - - // Normally, a user only writes assertions inside a TEST or TEST_F, - // or inside a function called by a TEST or TEST_F. Since Google - // Test keeps track of which test is current running, it can - // associate such an assertion with the test it belongs to. - // - // If an assertion is encountered when no TEST or TEST_F is running, - // Google Test attributes the assertion result to an imaginary "ad hoc" - // test, and records the result in ad_hoc_test_result_. - TestResult ad_hoc_test_result_; - - // The list of event listeners that can be used to track events inside - // Google Test. - TestEventListeners listeners_; - - // The OS stack trace getter. Will be deleted when the UnitTest - // object is destructed. By default, an OsStackTraceGetter is used, - // but the user can set this field to use a custom getter if that is - // desired. - OsStackTraceGetterInterface* os_stack_trace_getter_; - - // True if and only if PostFlagParsingInit() has been called. - bool post_flag_parse_init_performed_; - - // The random number seed used at the beginning of the test run. - int random_seed_; - - // Our random number generator. - internal::Random random_; - - // The time of the test program start, in ms from the start of the - // UNIX epoch. - TimeInMillis start_timestamp_; - - // How long the test took to run, in milliseconds. - TimeInMillis elapsed_time_; - -#if GTEST_HAS_DEATH_TEST - // The decomposed components of the gtest_internal_run_death_test flag, - // parsed when RUN_ALL_TESTS is called. - std::unique_ptr internal_run_death_test_flag_; - std::unique_ptr death_test_factory_; -#endif // GTEST_HAS_DEATH_TEST - - // A per-thread stack of traces created by the SCOPED_TRACE() macro. - internal::ThreadLocal > gtest_trace_stack_; - - // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() - // starts. - bool catch_exceptions_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); -}; // class UnitTestImpl - -// Convenience function for accessing the global UnitTest -// implementation object. -inline UnitTestImpl* GetUnitTestImpl() { - return UnitTest::GetInstance()->impl(); -} - -#if GTEST_USES_SIMPLE_RE - -// Internal helper functions for implementing the simple regular -// expression matcher. -GTEST_API_ bool IsInSet(char ch, const char* str); -GTEST_API_ bool IsAsciiDigit(char ch); -GTEST_API_ bool IsAsciiPunct(char ch); -GTEST_API_ bool IsRepeat(char ch); -GTEST_API_ bool IsAsciiWhiteSpace(char ch); -GTEST_API_ bool IsAsciiWordChar(char ch); -GTEST_API_ bool IsValidEscape(char ch); -GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); -GTEST_API_ bool ValidateRegex(const char* regex); -GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); -GTEST_API_ bool MatchRepetitionAndRegexAtHead( - bool escaped, char ch, char repeat, const char* regex, const char* str); -GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); - -#endif // GTEST_USES_SIMPLE_RE - -// Parses the command line for Google Test flags, without initializing -// other parts of Google Test. -GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); -GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); - -#if GTEST_HAS_DEATH_TEST - -// Returns the message describing the last system error, regardless of the -// platform. -GTEST_API_ std::string GetLastErrnoDescription(); - -// Attempts to parse a string into a positive integer pointed to by the -// number parameter. Returns true if that is possible. -// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use -// it here. -template -bool ParseNaturalNumber(const ::std::string& str, Integer* number) { - // Fail fast if the given string does not begin with a digit; - // this bypasses strtoXXX's "optional leading whitespace and plus - // or minus sign" semantics, which are undesirable here. - if (str.empty() || !IsDigit(str[0])) { - return false; - } - errno = 0; - - char* end; - // BiggestConvertible is the largest integer type that system-provided - // string-to-number conversion routines can return. - -# if GTEST_OS_WINDOWS && !defined(__GNUC__) - - // MSVC and C++ Builder define __int64 instead of the standard long long. - typedef unsigned __int64 BiggestConvertible; - const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); - -# else - - typedef unsigned long long BiggestConvertible; // NOLINT - const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); - -# endif // GTEST_OS_WINDOWS && !defined(__GNUC__) - - const bool parse_success = *end == '\0' && errno == 0; - - GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); - - const Integer result = static_cast(parsed); - if (parse_success && static_cast(result) == parsed) { - *number = result; - return true; - } - return false; -} -#endif // GTEST_HAS_DEATH_TEST - -// TestResult contains some private methods that should be hidden from -// Google Test user but are required for testing. This class allow our tests -// to access them. -// -// This class is supplied only for the purpose of testing Google Test's own -// constructs. Do not use it in user tests, either directly or indirectly. -class TestResultAccessor { - public: - static void RecordProperty(TestResult* test_result, - const std::string& xml_element, - const TestProperty& property) { - test_result->RecordProperty(xml_element, property); - } - - static void ClearTestPartResults(TestResult* test_result) { - test_result->ClearTestPartResults(); - } - - static const std::vector& test_part_results( - const TestResult& test_result) { - return test_result.test_part_results(); - } -}; - -#if GTEST_CAN_STREAM_RESULTS_ - -// Streams test results to the given port on the given host machine. -class StreamingListener : public EmptyTestEventListener { - public: - // Abstract base class for writing strings to a socket. - class AbstractSocketWriter { - public: - virtual ~AbstractSocketWriter() {} - - // Sends a string to the socket. - virtual void Send(const std::string& message) = 0; - - // Closes the socket. - virtual void CloseConnection() {} - - // Sends a string and a newline to the socket. - void SendLn(const std::string& message) { Send(message + "\n"); } - }; - - // Concrete class for actually writing strings to a socket. - class SocketWriter : public AbstractSocketWriter { - public: - SocketWriter(const std::string& host, const std::string& port) - : sockfd_(-1), host_name_(host), port_num_(port) { - MakeConnection(); - } - - ~SocketWriter() override { - if (sockfd_ != -1) - CloseConnection(); - } - - // Sends a string to the socket. - void Send(const std::string& message) override { - GTEST_CHECK_(sockfd_ != -1) - << "Send() can be called only when there is a connection."; - - const auto len = static_cast(message.length()); - if (write(sockfd_, message.c_str(), len) != static_cast(len)) { - GTEST_LOG_(WARNING) - << "stream_result_to: failed to stream to " - << host_name_ << ":" << port_num_; - } - } - - private: - // Creates a client socket and connects to the server. - void MakeConnection(); - - // Closes the socket. - void CloseConnection() override { - GTEST_CHECK_(sockfd_ != -1) - << "CloseConnection() can be called only when there is a connection."; - - close(sockfd_); - sockfd_ = -1; - } - - int sockfd_; // socket file descriptor - const std::string host_name_; - const std::string port_num_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter); - }; // class SocketWriter - - // Escapes '=', '&', '%', and '\n' characters in str as "%xx". - static std::string UrlEncode(const char* str); - - StreamingListener(const std::string& host, const std::string& port) - : socket_writer_(new SocketWriter(host, port)) { - Start(); - } - - explicit StreamingListener(AbstractSocketWriter* socket_writer) - : socket_writer_(socket_writer) { Start(); } - - void OnTestProgramStart(const UnitTest& /* unit_test */) override { - SendLn("event=TestProgramStart"); - } - - void OnTestProgramEnd(const UnitTest& unit_test) override { - // Note that Google Test current only report elapsed time for each - // test iteration, not for the entire test program. - SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed())); - - // Notify the streaming server to stop. - socket_writer_->CloseConnection(); - } - - void OnTestIterationStart(const UnitTest& /* unit_test */, - int iteration) override { - SendLn("event=TestIterationStart&iteration=" + - StreamableToString(iteration)); - } - - void OnTestIterationEnd(const UnitTest& unit_test, - int /* iteration */) override { - SendLn("event=TestIterationEnd&passed=" + - FormatBool(unit_test.Passed()) + "&elapsed_time=" + - StreamableToString(unit_test.elapsed_time()) + "ms"); - } - - // Note that "event=TestCaseStart" is a wire format and has to remain - // "case" for compatibilty - void OnTestCaseStart(const TestCase& test_case) override { - SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); - } - - // Note that "event=TestCaseEnd" is a wire format and has to remain - // "case" for compatibilty - void OnTestCaseEnd(const TestCase& test_case) override { - SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) + - "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) + - "ms"); - } - - void OnTestStart(const TestInfo& test_info) override { - SendLn(std::string("event=TestStart&name=") + test_info.name()); - } - - void OnTestEnd(const TestInfo& test_info) override { - SendLn("event=TestEnd&passed=" + - FormatBool((test_info.result())->Passed()) + - "&elapsed_time=" + - StreamableToString((test_info.result())->elapsed_time()) + "ms"); - } - - void OnTestPartResult(const TestPartResult& test_part_result) override { - const char* file_name = test_part_result.file_name(); - if (file_name == nullptr) file_name = ""; - SendLn("event=TestPartResult&file=" + UrlEncode(file_name) + - "&line=" + StreamableToString(test_part_result.line_number()) + - "&message=" + UrlEncode(test_part_result.message())); - } - - private: - // Sends the given message and a newline to the socket. - void SendLn(const std::string& message) { socket_writer_->SendLn(message); } - - // Called at the start of streaming to notify the receiver what - // protocol we are using. - void Start() { SendLn("gtest_streaming_protocol_version=1.0"); } - - std::string FormatBool(bool value) { return value ? "1" : "0"; } - - const std::unique_ptr socket_writer_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); -}; // class StreamingListener - -#endif // GTEST_CAN_STREAM_RESULTS_ - -} // namespace internal -} // namespace testing - -GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 - -#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ diff --git a/core/deps/gtest/src/gtest-matchers.cc b/core/deps/gtest/src/gtest-matchers.cc deleted file mode 100644 index c66f646b9..000000000 --- a/core/deps/gtest/src/gtest-matchers.cc +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// The Google C++ Testing and Mocking Framework (Google Test) -// -// This file implements just enough of the matcher interface to allow -// EXPECT_DEATH and friends to accept a matcher argument. - -#include "gtest/gtest-matchers.h" - -#include -#include "gtest/internal/gtest-internal.h" -#include "gtest/internal/gtest-port.h" - -namespace testing { - -// Constructs a matcher that matches a const std::string& whose value is -// equal to s. -Matcher::Matcher(const std::string& s) { *this = Eq(s); } - -// Constructs a matcher that matches a const std::string& whose value is -// equal to s. -Matcher::Matcher(const char* s) { - *this = Eq(std::string(s)); -} - -// Constructs a matcher that matches a std::string whose value is equal to -// s. -Matcher::Matcher(const std::string& s) { *this = Eq(s); } - -// Constructs a matcher that matches a std::string whose value is equal to -// s. -Matcher::Matcher(const char* s) { *this = Eq(std::string(s)); } - -#if GTEST_HAS_ABSL -// Constructs a matcher that matches a const absl::string_view& whose value is -// equal to s. -Matcher::Matcher(const std::string& s) { - *this = Eq(s); -} - -// Constructs a matcher that matches a const absl::string_view& whose value is -// equal to s. -Matcher::Matcher(const char* s) { - *this = Eq(std::string(s)); -} - -// Constructs a matcher that matches a const absl::string_view& whose value is -// equal to s. -Matcher::Matcher(absl::string_view s) { - *this = Eq(std::string(s)); -} - -// Constructs a matcher that matches a absl::string_view whose value is equal to -// s. -Matcher::Matcher(const std::string& s) { *this = Eq(s); } - -// Constructs a matcher that matches a absl::string_view whose value is equal to -// s. -Matcher::Matcher(const char* s) { - *this = Eq(std::string(s)); -} - -// Constructs a matcher that matches a absl::string_view whose value is equal to -// s. -Matcher::Matcher(absl::string_view s) { - *this = Eq(std::string(s)); -} -#endif // GTEST_HAS_ABSL - -} // namespace testing diff --git a/core/deps/gtest/src/gtest-port.cc b/core/deps/gtest/src/gtest-port.cc deleted file mode 100644 index 169a10f45..000000000 --- a/core/deps/gtest/src/gtest-port.cc +++ /dev/null @@ -1,1399 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#include "gtest/internal/gtest-port.h" - -#include -#include -#include -#include -#include -#include - -#if GTEST_OS_WINDOWS -# include -# include -# include -# include // Used in ThreadLocal. -# ifdef _MSC_VER -# include -# endif // _MSC_VER -#else -# include -#endif // GTEST_OS_WINDOWS - -#if GTEST_OS_MAC -# include -# include -# include -#endif // GTEST_OS_MAC - -#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \ - GTEST_OS_NETBSD || GTEST_OS_OPENBSD -# include -# if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD -# include -# endif -#endif - -#if GTEST_OS_QNX -# include -# include -# include -#endif // GTEST_OS_QNX - -#if GTEST_OS_AIX -# include -# include -#endif // GTEST_OS_AIX - -#if GTEST_OS_FUCHSIA -# include -# include -#endif // GTEST_OS_FUCHSIA - -#include "gtest/gtest-spi.h" -#include "gtest/gtest-message.h" -#include "gtest/internal/gtest-internal.h" -#include "gtest/internal/gtest-string.h" -#include "gtest-internal-inl.h" - -namespace testing { -namespace internal { - -#if defined(_MSC_VER) || defined(__BORLANDC__) -// MSVC and C++Builder do not provide a definition of STDERR_FILENO. -const int kStdOutFileno = 1; -const int kStdErrFileno = 2; -#else -const int kStdOutFileno = STDOUT_FILENO; -const int kStdErrFileno = STDERR_FILENO; -#endif // _MSC_VER - -#if GTEST_OS_LINUX - -namespace { -template -T ReadProcFileField(const std::string& filename, int field) { - std::string dummy; - std::ifstream file(filename.c_str()); - while (field-- > 0) { - file >> dummy; - } - T output = 0; - file >> output; - return output; -} -} // namespace - -// Returns the number of active threads, or 0 when there is an error. -size_t GetThreadCount() { - const std::string filename = - (Message() << "/proc/" << getpid() << "/stat").GetString(); - return ReadProcFileField(filename, 19); -} - -#elif GTEST_OS_MAC - -size_t GetThreadCount() { - const task_t task = mach_task_self(); - mach_msg_type_number_t thread_count; - thread_act_array_t thread_list; - const kern_return_t status = task_threads(task, &thread_list, &thread_count); - if (status == KERN_SUCCESS) { - // task_threads allocates resources in thread_list and we need to free them - // to avoid leaks. - vm_deallocate(task, - reinterpret_cast(thread_list), - sizeof(thread_t) * thread_count); - return static_cast(thread_count); - } else { - return 0; - } -} - -#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \ - GTEST_OS_NETBSD - -#if GTEST_OS_NETBSD -#undef KERN_PROC -#define KERN_PROC KERN_PROC2 -#define kinfo_proc kinfo_proc2 -#endif - -#if GTEST_OS_DRAGONFLY -#define KP_NLWP(kp) (kp.kp_nthreads) -#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD -#define KP_NLWP(kp) (kp.ki_numthreads) -#elif GTEST_OS_NETBSD -#define KP_NLWP(kp) (kp.p_nlwps) -#endif - -// Returns the number of threads running in the process, or 0 to indicate that -// we cannot detect it. -size_t GetThreadCount() { - int mib[] = { - CTL_KERN, - KERN_PROC, - KERN_PROC_PID, - getpid(), -#if GTEST_OS_NETBSD - sizeof(struct kinfo_proc), - 1, -#endif - }; - u_int miblen = sizeof(mib) / sizeof(mib[0]); - struct kinfo_proc info; - size_t size = sizeof(info); - if (sysctl(mib, miblen, &info, &size, NULL, 0)) { - return 0; - } - return static_cast(KP_NLWP(info)); -} -#elif GTEST_OS_OPENBSD - -// Returns the number of threads running in the process, or 0 to indicate that -// we cannot detect it. -size_t GetThreadCount() { - int mib[] = { - CTL_KERN, - KERN_PROC, - KERN_PROC_PID | KERN_PROC_SHOW_THREADS, - getpid(), - sizeof(struct kinfo_proc), - 0, - }; - u_int miblen = sizeof(mib) / sizeof(mib[0]); - - // get number of structs - size_t size; - if (sysctl(mib, miblen, NULL, &size, NULL, 0)) { - return 0; - } - mib[5] = size / mib[4]; - - // populate array of structs - struct kinfo_proc info[mib[5]]; - if (sysctl(mib, miblen, &info, &size, NULL, 0)) { - return 0; - } - - // exclude empty members - int nthreads = 0; - for (int i = 0; i < size / mib[4]; i++) { - if (info[i].p_tid != -1) - nthreads++; - } - return nthreads; -} - -#elif GTEST_OS_QNX - -// Returns the number of threads running in the process, or 0 to indicate that -// we cannot detect it. -size_t GetThreadCount() { - const int fd = open("/proc/self/as", O_RDONLY); - if (fd < 0) { - return 0; - } - procfs_info process_info; - const int status = - devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr); - close(fd); - if (status == EOK) { - return static_cast(process_info.num_threads); - } else { - return 0; - } -} - -#elif GTEST_OS_AIX - -size_t GetThreadCount() { - struct procentry64 entry; - pid_t pid = getpid(); - int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1); - if (status == 1) { - return entry.pi_thcount; - } else { - return 0; - } -} - -#elif GTEST_OS_FUCHSIA - -size_t GetThreadCount() { - int dummy_buffer; - size_t avail; - zx_status_t status = zx_object_get_info( - zx_process_self(), - ZX_INFO_PROCESS_THREADS, - &dummy_buffer, - 0, - nullptr, - &avail); - if (status == ZX_OK) { - return avail; - } else { - return 0; - } -} - -#else - -size_t GetThreadCount() { - // There's no portable way to detect the number of threads, so we just - // return 0 to indicate that we cannot detect it. - return 0; -} - -#endif // GTEST_OS_LINUX - -#if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS - -void SleepMilliseconds(int n) { - ::Sleep(static_cast(n)); -} - -AutoHandle::AutoHandle() - : handle_(INVALID_HANDLE_VALUE) {} - -AutoHandle::AutoHandle(Handle handle) - : handle_(handle) {} - -AutoHandle::~AutoHandle() { - Reset(); -} - -AutoHandle::Handle AutoHandle::Get() const { - return handle_; -} - -void AutoHandle::Reset() { - Reset(INVALID_HANDLE_VALUE); -} - -void AutoHandle::Reset(HANDLE handle) { - // Resetting with the same handle we already own is invalid. - if (handle_ != handle) { - if (IsCloseable()) { - ::CloseHandle(handle_); - } - handle_ = handle; - } else { - GTEST_CHECK_(!IsCloseable()) - << "Resetting a valid handle to itself is likely a programmer error " - "and thus not allowed."; - } -} - -bool AutoHandle::IsCloseable() const { - // Different Windows APIs may use either of these values to represent an - // invalid handle. - return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE; -} - -Notification::Notification() - : event_(::CreateEvent(nullptr, // Default security attributes. - TRUE, // Do not reset automatically. - FALSE, // Initially unset. - nullptr)) { // Anonymous event. - GTEST_CHECK_(event_.Get() != nullptr); -} - -void Notification::Notify() { - GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE); -} - -void Notification::WaitForNotification() { - GTEST_CHECK_( - ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0); -} - -Mutex::Mutex() - : owner_thread_id_(0), - type_(kDynamic), - critical_section_init_phase_(0), - critical_section_(new CRITICAL_SECTION) { - ::InitializeCriticalSection(critical_section_); -} - -Mutex::~Mutex() { - // Static mutexes are leaked intentionally. It is not thread-safe to try - // to clean them up. - if (type_ == kDynamic) { - ::DeleteCriticalSection(critical_section_); - delete critical_section_; - critical_section_ = nullptr; - } -} - -void Mutex::Lock() { - ThreadSafeLazyInit(); - ::EnterCriticalSection(critical_section_); - owner_thread_id_ = ::GetCurrentThreadId(); -} - -void Mutex::Unlock() { - ThreadSafeLazyInit(); - // We don't protect writing to owner_thread_id_ here, as it's the - // caller's responsibility to ensure that the current thread holds the - // mutex when this is called. - owner_thread_id_ = 0; - ::LeaveCriticalSection(critical_section_); -} - -// Does nothing if the current thread holds the mutex. Otherwise, crashes -// with high probability. -void Mutex::AssertHeld() { - ThreadSafeLazyInit(); - GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId()) - << "The current thread is not holding the mutex @" << this; -} - -namespace { - -#ifdef _MSC_VER -// Use the RAII idiom to flag mem allocs that are intentionally never -// deallocated. The motivation is to silence the false positive mem leaks -// that are reported by the debug version of MS's CRT which can only detect -// if an alloc is missing a matching deallocation. -// Example: -// MemoryIsNotDeallocated memory_is_not_deallocated; -// critical_section_ = new CRITICAL_SECTION; -// -class MemoryIsNotDeallocated -{ - public: - MemoryIsNotDeallocated() : old_crtdbg_flag_(0) { - old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); - // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT - // doesn't report mem leak if there's no matching deallocation. - _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF); - } - - ~MemoryIsNotDeallocated() { - // Restore the original _CRTDBG_ALLOC_MEM_DF flag - _CrtSetDbgFlag(old_crtdbg_flag_); - } - - private: - int old_crtdbg_flag_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated); -}; -#endif // _MSC_VER - -} // namespace - -// Initializes owner_thread_id_ and critical_section_ in static mutexes. -void Mutex::ThreadSafeLazyInit() { - // Dynamic mutexes are initialized in the constructor. - if (type_ == kStatic) { - switch ( - ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) { - case 0: - // If critical_section_init_phase_ was 0 before the exchange, we - // are the first to test it and need to perform the initialization. - owner_thread_id_ = 0; - { - // Use RAII to flag that following mem alloc is never deallocated. -#ifdef _MSC_VER - MemoryIsNotDeallocated memory_is_not_deallocated; -#endif // _MSC_VER - critical_section_ = new CRITICAL_SECTION; - } - ::InitializeCriticalSection(critical_section_); - // Updates the critical_section_init_phase_ to 2 to signal - // initialization complete. - GTEST_CHECK_(::InterlockedCompareExchange( - &critical_section_init_phase_, 2L, 1L) == - 1L); - break; - case 1: - // Somebody else is already initializing the mutex; spin until they - // are done. - while (::InterlockedCompareExchange(&critical_section_init_phase_, - 2L, - 2L) != 2L) { - // Possibly yields the rest of the thread's time slice to other - // threads. - ::Sleep(0); - } - break; - - case 2: - break; // The mutex is already initialized and ready for use. - - default: - GTEST_CHECK_(false) - << "Unexpected value of critical_section_init_phase_ " - << "while initializing a static mutex."; - } - } -} - -namespace { - -class ThreadWithParamSupport : public ThreadWithParamBase { - public: - static HANDLE CreateThread(Runnable* runnable, - Notification* thread_can_start) { - ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start); - DWORD thread_id; - HANDLE thread_handle = ::CreateThread( - nullptr, // Default security. - 0, // Default stack size. - &ThreadWithParamSupport::ThreadMain, - param, // Parameter to ThreadMainStatic - 0x0, // Default creation flags. - &thread_id); // Need a valid pointer for the call to work under Win98. - GTEST_CHECK_(thread_handle != nullptr) - << "CreateThread failed with error " << ::GetLastError() << "."; - if (thread_handle == nullptr) { - delete param; - } - return thread_handle; - } - - private: - struct ThreadMainParam { - ThreadMainParam(Runnable* runnable, Notification* thread_can_start) - : runnable_(runnable), - thread_can_start_(thread_can_start) { - } - std::unique_ptr runnable_; - // Does not own. - Notification* thread_can_start_; - }; - - static DWORD WINAPI ThreadMain(void* ptr) { - // Transfers ownership. - std::unique_ptr param(static_cast(ptr)); - if (param->thread_can_start_ != nullptr) - param->thread_can_start_->WaitForNotification(); - param->runnable_->Run(); - return 0; - } - - // Prohibit instantiation. - ThreadWithParamSupport(); - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport); -}; - -} // namespace - -ThreadWithParamBase::ThreadWithParamBase(Runnable *runnable, - Notification* thread_can_start) - : thread_(ThreadWithParamSupport::CreateThread(runnable, - thread_can_start)) { -} - -ThreadWithParamBase::~ThreadWithParamBase() { - Join(); -} - -void ThreadWithParamBase::Join() { - GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0) - << "Failed to join the thread with error " << ::GetLastError() << "."; -} - -// Maps a thread to a set of ThreadIdToThreadLocals that have values -// instantiated on that thread and notifies them when the thread exits. A -// ThreadLocal instance is expected to persist until all threads it has -// values on have terminated. -class ThreadLocalRegistryImpl { - public: - // Registers thread_local_instance as having value on the current thread. - // Returns a value that can be used to identify the thread from other threads. - static ThreadLocalValueHolderBase* GetValueOnCurrentThread( - const ThreadLocalBase* thread_local_instance) { - DWORD current_thread = ::GetCurrentThreadId(); - MutexLock lock(&mutex_); - ThreadIdToThreadLocals* const thread_to_thread_locals = - GetThreadLocalsMapLocked(); - ThreadIdToThreadLocals::iterator thread_local_pos = - thread_to_thread_locals->find(current_thread); - if (thread_local_pos == thread_to_thread_locals->end()) { - thread_local_pos = thread_to_thread_locals->insert( - std::make_pair(current_thread, ThreadLocalValues())).first; - StartWatcherThreadFor(current_thread); - } - ThreadLocalValues& thread_local_values = thread_local_pos->second; - ThreadLocalValues::iterator value_pos = - thread_local_values.find(thread_local_instance); - if (value_pos == thread_local_values.end()) { - value_pos = - thread_local_values - .insert(std::make_pair( - thread_local_instance, - std::shared_ptr( - thread_local_instance->NewValueForCurrentThread()))) - .first; - } - return value_pos->second.get(); - } - - static void OnThreadLocalDestroyed( - const ThreadLocalBase* thread_local_instance) { - std::vector > value_holders; - // Clean up the ThreadLocalValues data structure while holding the lock, but - // defer the destruction of the ThreadLocalValueHolderBases. - { - MutexLock lock(&mutex_); - ThreadIdToThreadLocals* const thread_to_thread_locals = - GetThreadLocalsMapLocked(); - for (ThreadIdToThreadLocals::iterator it = - thread_to_thread_locals->begin(); - it != thread_to_thread_locals->end(); - ++it) { - ThreadLocalValues& thread_local_values = it->second; - ThreadLocalValues::iterator value_pos = - thread_local_values.find(thread_local_instance); - if (value_pos != thread_local_values.end()) { - value_holders.push_back(value_pos->second); - thread_local_values.erase(value_pos); - // This 'if' can only be successful at most once, so theoretically we - // could break out of the loop here, but we don't bother doing so. - } - } - } - // Outside the lock, let the destructor for 'value_holders' deallocate the - // ThreadLocalValueHolderBases. - } - - static void OnThreadExit(DWORD thread_id) { - GTEST_CHECK_(thread_id != 0) << ::GetLastError(); - std::vector > value_holders; - // Clean up the ThreadIdToThreadLocals data structure while holding the - // lock, but defer the destruction of the ThreadLocalValueHolderBases. - { - MutexLock lock(&mutex_); - ThreadIdToThreadLocals* const thread_to_thread_locals = - GetThreadLocalsMapLocked(); - ThreadIdToThreadLocals::iterator thread_local_pos = - thread_to_thread_locals->find(thread_id); - if (thread_local_pos != thread_to_thread_locals->end()) { - ThreadLocalValues& thread_local_values = thread_local_pos->second; - for (ThreadLocalValues::iterator value_pos = - thread_local_values.begin(); - value_pos != thread_local_values.end(); - ++value_pos) { - value_holders.push_back(value_pos->second); - } - thread_to_thread_locals->erase(thread_local_pos); - } - } - // Outside the lock, let the destructor for 'value_holders' deallocate the - // ThreadLocalValueHolderBases. - } - - private: - // In a particular thread, maps a ThreadLocal object to its value. - typedef std::map > - ThreadLocalValues; - // Stores all ThreadIdToThreadLocals having values in a thread, indexed by - // thread's ID. - typedef std::map ThreadIdToThreadLocals; - - // Holds the thread id and thread handle that we pass from - // StartWatcherThreadFor to WatcherThreadFunc. - typedef std::pair ThreadIdAndHandle; - - static void StartWatcherThreadFor(DWORD thread_id) { - // The returned handle will be kept in thread_map and closed by - // watcher_thread in WatcherThreadFunc. - HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION, - FALSE, - thread_id); - GTEST_CHECK_(thread != nullptr); - // We need to pass a valid thread ID pointer into CreateThread for it - // to work correctly under Win98. - DWORD watcher_thread_id; - HANDLE watcher_thread = ::CreateThread( - nullptr, // Default security. - 0, // Default stack size - &ThreadLocalRegistryImpl::WatcherThreadFunc, - reinterpret_cast(new ThreadIdAndHandle(thread_id, thread)), - CREATE_SUSPENDED, &watcher_thread_id); - GTEST_CHECK_(watcher_thread != nullptr); - // Give the watcher thread the same priority as ours to avoid being - // blocked by it. - ::SetThreadPriority(watcher_thread, - ::GetThreadPriority(::GetCurrentThread())); - ::ResumeThread(watcher_thread); - ::CloseHandle(watcher_thread); - } - - // Monitors exit from a given thread and notifies those - // ThreadIdToThreadLocals about thread termination. - static DWORD WINAPI WatcherThreadFunc(LPVOID param) { - const ThreadIdAndHandle* tah = - reinterpret_cast(param); - GTEST_CHECK_( - ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0); - OnThreadExit(tah->first); - ::CloseHandle(tah->second); - delete tah; - return 0; - } - - // Returns map of thread local instances. - static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() { - mutex_.AssertHeld(); -#ifdef _MSC_VER - MemoryIsNotDeallocated memory_is_not_deallocated; -#endif // _MSC_VER - static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals(); - return map; - } - - // Protects access to GetThreadLocalsMapLocked() and its return value. - static Mutex mutex_; - // Protects access to GetThreadMapLocked() and its return value. - static Mutex thread_map_mutex_; -}; - -Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex); -Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex); - -ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread( - const ThreadLocalBase* thread_local_instance) { - return ThreadLocalRegistryImpl::GetValueOnCurrentThread( - thread_local_instance); -} - -void ThreadLocalRegistry::OnThreadLocalDestroyed( - const ThreadLocalBase* thread_local_instance) { - ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance); -} - -#endif // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS - -#if GTEST_USES_POSIX_RE - -// Implements RE. Currently only needed for death tests. - -RE::~RE() { - if (is_valid_) { - // regfree'ing an invalid regex might crash because the content - // of the regex is undefined. Since the regex's are essentially - // the same, one cannot be valid (or invalid) without the other - // being so too. - regfree(&partial_regex_); - regfree(&full_regex_); - } - free(const_cast(pattern_)); -} - -// Returns true if and only if regular expression re matches the entire str. -bool RE::FullMatch(const char* str, const RE& re) { - if (!re.is_valid_) return false; - - regmatch_t match; - return regexec(&re.full_regex_, str, 1, &match, 0) == 0; -} - -// Returns true if and only if regular expression re matches a substring of -// str (including str itself). -bool RE::PartialMatch(const char* str, const RE& re) { - if (!re.is_valid_) return false; - - regmatch_t match; - return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; -} - -// Initializes an RE from its string representation. -void RE::Init(const char* regex) { - pattern_ = posix::StrDup(regex); - - // Reserves enough bytes to hold the regular expression used for a - // full match. - const size_t full_regex_len = strlen(regex) + 10; - char* const full_pattern = new char[full_regex_len]; - - snprintf(full_pattern, full_regex_len, "^(%s)$", regex); - is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; - // We want to call regcomp(&partial_regex_, ...) even if the - // previous expression returns false. Otherwise partial_regex_ may - // not be properly initialized can may cause trouble when it's - // freed. - // - // Some implementation of POSIX regex (e.g. on at least some - // versions of Cygwin) doesn't accept the empty string as a valid - // regex. We change it to an equivalent form "()" to be safe. - if (is_valid_) { - const char* const partial_regex = (*regex == '\0') ? "()" : regex; - is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; - } - EXPECT_TRUE(is_valid_) - << "Regular expression \"" << regex - << "\" is not a valid POSIX Extended regular expression."; - - delete[] full_pattern; -} - -#elif GTEST_USES_SIMPLE_RE - -// Returns true if and only if ch appears anywhere in str (excluding the -// terminating '\0' character). -bool IsInSet(char ch, const char* str) { - return ch != '\0' && strchr(str, ch) != nullptr; -} - -// Returns true if and only if ch belongs to the given classification. -// Unlike similar functions in , these aren't affected by the -// current locale. -bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } -bool IsAsciiPunct(char ch) { - return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); -} -bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } -bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } -bool IsAsciiWordChar(char ch) { - return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || - ('0' <= ch && ch <= '9') || ch == '_'; -} - -// Returns true if and only if "\\c" is a supported escape sequence. -bool IsValidEscape(char c) { - return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); -} - -// Returns true if and only if the given atom (specified by escaped and -// pattern) matches ch. The result is undefined if the atom is invalid. -bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { - if (escaped) { // "\\p" where p is pattern_char. - switch (pattern_char) { - case 'd': return IsAsciiDigit(ch); - case 'D': return !IsAsciiDigit(ch); - case 'f': return ch == '\f'; - case 'n': return ch == '\n'; - case 'r': return ch == '\r'; - case 's': return IsAsciiWhiteSpace(ch); - case 'S': return !IsAsciiWhiteSpace(ch); - case 't': return ch == '\t'; - case 'v': return ch == '\v'; - case 'w': return IsAsciiWordChar(ch); - case 'W': return !IsAsciiWordChar(ch); - } - return IsAsciiPunct(pattern_char) && pattern_char == ch; - } - - return (pattern_char == '.' && ch != '\n') || pattern_char == ch; -} - -// Helper function used by ValidateRegex() to format error messages. -static std::string FormatRegexSyntaxError(const char* regex, int index) { - return (Message() << "Syntax error at index " << index - << " in simple regular expression \"" << regex << "\": ").GetString(); -} - -// Generates non-fatal failures and returns false if regex is invalid; -// otherwise returns true. -bool ValidateRegex(const char* regex) { - if (regex == nullptr) { - ADD_FAILURE() << "NULL is not a valid simple regular expression."; - return false; - } - - bool is_valid = true; - - // True if and only if ?, *, or + can follow the previous atom. - bool prev_repeatable = false; - for (int i = 0; regex[i]; i++) { - if (regex[i] == '\\') { // An escape sequence - i++; - if (regex[i] == '\0') { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) - << "'\\' cannot appear at the end."; - return false; - } - - if (!IsValidEscape(regex[i])) { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) - << "invalid escape sequence \"\\" << regex[i] << "\"."; - is_valid = false; - } - prev_repeatable = true; - } else { // Not an escape sequence. - const char ch = regex[i]; - - if (ch == '^' && i > 0) { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i) - << "'^' can only appear at the beginning."; - is_valid = false; - } else if (ch == '$' && regex[i + 1] != '\0') { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i) - << "'$' can only appear at the end."; - is_valid = false; - } else if (IsInSet(ch, "()[]{}|")) { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i) - << "'" << ch << "' is unsupported."; - is_valid = false; - } else if (IsRepeat(ch) && !prev_repeatable) { - ADD_FAILURE() << FormatRegexSyntaxError(regex, i) - << "'" << ch << "' can only follow a repeatable token."; - is_valid = false; - } - - prev_repeatable = !IsInSet(ch, "^$?*+"); - } - } - - return is_valid; -} - -// Matches a repeated regex atom followed by a valid simple regular -// expression. The regex atom is defined as c if escaped is false, -// or \c otherwise. repeat is the repetition meta character (?, *, -// or +). The behavior is undefined if str contains too many -// characters to be indexable by size_t, in which case the test will -// probably time out anyway. We are fine with this limitation as -// std::string has it too. -bool MatchRepetitionAndRegexAtHead( - bool escaped, char c, char repeat, const char* regex, - const char* str) { - const size_t min_count = (repeat == '+') ? 1 : 0; - const size_t max_count = (repeat == '?') ? 1 : - static_cast(-1) - 1; - // We cannot call numeric_limits::max() as it conflicts with the - // max() macro on Windows. - - for (size_t i = 0; i <= max_count; ++i) { - // We know that the atom matches each of the first i characters in str. - if (i >= min_count && MatchRegexAtHead(regex, str + i)) { - // We have enough matches at the head, and the tail matches too. - // Since we only care about *whether* the pattern matches str - // (as opposed to *how* it matches), there is no need to find a - // greedy match. - return true; - } - if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) - return false; - } - return false; -} - -// Returns true if and only if regex matches a prefix of str. regex must -// be a valid simple regular expression and not start with "^", or the -// result is undefined. -bool MatchRegexAtHead(const char* regex, const char* str) { - if (*regex == '\0') // An empty regex matches a prefix of anything. - return true; - - // "$" only matches the end of a string. Note that regex being - // valid guarantees that there's nothing after "$" in it. - if (*regex == '$') - return *str == '\0'; - - // Is the first thing in regex an escape sequence? - const bool escaped = *regex == '\\'; - if (escaped) - ++regex; - if (IsRepeat(regex[1])) { - // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so - // here's an indirect recursion. It terminates as the regex gets - // shorter in each recursion. - return MatchRepetitionAndRegexAtHead( - escaped, regex[0], regex[1], regex + 2, str); - } else { - // regex isn't empty, isn't "$", and doesn't start with a - // repetition. We match the first atom of regex with the first - // character of str and recurse. - return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && - MatchRegexAtHead(regex + 1, str + 1); - } -} - -// Returns true if and only if regex matches any substring of str. regex must -// be a valid simple regular expression, or the result is undefined. -// -// The algorithm is recursive, but the recursion depth doesn't exceed -// the regex length, so we won't need to worry about running out of -// stack space normally. In rare cases the time complexity can be -// exponential with respect to the regex length + the string length, -// but usually it's must faster (often close to linear). -bool MatchRegexAnywhere(const char* regex, const char* str) { - if (regex == nullptr || str == nullptr) return false; - - if (*regex == '^') - return MatchRegexAtHead(regex + 1, str); - - // A successful match can be anywhere in str. - do { - if (MatchRegexAtHead(regex, str)) - return true; - } while (*str++ != '\0'); - return false; -} - -// Implements the RE class. - -RE::~RE() { - free(const_cast(pattern_)); - free(const_cast(full_pattern_)); -} - -// Returns true if and only if regular expression re matches the entire str. -bool RE::FullMatch(const char* str, const RE& re) { - return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); -} - -// Returns true if and only if regular expression re matches a substring of -// str (including str itself). -bool RE::PartialMatch(const char* str, const RE& re) { - return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); -} - -// Initializes an RE from its string representation. -void RE::Init(const char* regex) { - pattern_ = full_pattern_ = nullptr; - if (regex != nullptr) { - pattern_ = posix::StrDup(regex); - } - - is_valid_ = ValidateRegex(regex); - if (!is_valid_) { - // No need to calculate the full pattern when the regex is invalid. - return; - } - - const size_t len = strlen(regex); - // Reserves enough bytes to hold the regular expression used for a - // full match: we need space to prepend a '^', append a '$', and - // terminate the string with '\0'. - char* buffer = static_cast(malloc(len + 3)); - full_pattern_ = buffer; - - if (*regex != '^') - *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. - - // We don't use snprintf or strncpy, as they trigger a warning when - // compiled with VC++ 8.0. - memcpy(buffer, regex, len); - buffer += len; - - if (len == 0 || regex[len - 1] != '$') - *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. - - *buffer = '\0'; -} - -#endif // GTEST_USES_POSIX_RE - -const char kUnknownFile[] = "unknown file"; - -// Formats a source file path and a line number as they would appear -// in an error message from the compiler used to compile this code. -GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { - const std::string file_name(file == nullptr ? kUnknownFile : file); - - if (line < 0) { - return file_name + ":"; - } -#ifdef _MSC_VER - return file_name + "(" + StreamableToString(line) + "):"; -#else - return file_name + ":" + StreamableToString(line) + ":"; -#endif // _MSC_VER -} - -// Formats a file location for compiler-independent XML output. -// Although this function is not platform dependent, we put it next to -// FormatFileLocation in order to contrast the two functions. -// Note that FormatCompilerIndependentFileLocation() does NOT append colon -// to the file location it produces, unlike FormatFileLocation(). -GTEST_API_ ::std::string FormatCompilerIndependentFileLocation( - const char* file, int line) { - const std::string file_name(file == nullptr ? kUnknownFile : file); - - if (line < 0) - return file_name; - else - return file_name + ":" + StreamableToString(line); -} - -GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) - : severity_(severity) { - const char* const marker = - severity == GTEST_INFO ? "[ INFO ]" : - severity == GTEST_WARNING ? "[WARNING]" : - severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; - GetStream() << ::std::endl << marker << " " - << FormatFileLocation(file, line).c_str() << ": "; -} - -// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. -GTestLog::~GTestLog() { - GetStream() << ::std::endl; - if (severity_ == GTEST_FATAL) { - fflush(stderr); - posix::Abort(); - } -} - -// Disable Microsoft deprecation warnings for POSIX functions called from -// this class (creat, dup, dup2, and close) -GTEST_DISABLE_MSC_DEPRECATED_PUSH_() - -#if GTEST_HAS_STREAM_REDIRECTION - -// Object that captures an output stream (stdout/stderr). -class CapturedStream { - public: - // The ctor redirects the stream to a temporary file. - explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { -# if GTEST_OS_WINDOWS - char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT - char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT - - ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); - const UINT success = ::GetTempFileNameA(temp_dir_path, - "gtest_redir", - 0, // Generate unique file name. - temp_file_path); - GTEST_CHECK_(success != 0) - << "Unable to create a temporary file in " << temp_dir_path; - const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); - GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " - << temp_file_path; - filename_ = temp_file_path; -# else - // There's no guarantee that a test has write access to the current - // directory, so we create the temporary file in the /tmp directory - // instead. We use /tmp on most systems, and /sdcard on Android. - // That's because Android doesn't have /tmp. -# if GTEST_OS_LINUX_ANDROID - // Note: Android applications are expected to call the framework's - // Context.getExternalStorageDirectory() method through JNI to get - // the location of the world-writable SD Card directory. However, - // this requires a Context handle, which cannot be retrieved - // globally from native code. Doing so also precludes running the - // code as part of a regular standalone executable, which doesn't - // run in a Dalvik process (e.g. when running it through 'adb shell'). - // - // The location /data/local/tmp is directly accessible from native code. - // '/sdcard' and other variants cannot be relied on, as they are not - // guaranteed to be mounted, or may have a delay in mounting. - char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX"; -# else - char name_template[] = "/tmp/captured_stream.XXXXXX"; -# endif // GTEST_OS_LINUX_ANDROID - const int captured_fd = mkstemp(name_template); - if (captured_fd == -1) { - GTEST_LOG_(WARNING) - << "Failed to create tmp file " << name_template - << " for test; does the test have access to the /tmp directory?"; - } - filename_ = name_template; -# endif // GTEST_OS_WINDOWS - fflush(nullptr); - dup2(captured_fd, fd_); - close(captured_fd); - } - - ~CapturedStream() { - remove(filename_.c_str()); - } - - std::string GetCapturedString() { - if (uncaptured_fd_ != -1) { - // Restores the original stream. - fflush(nullptr); - dup2(uncaptured_fd_, fd_); - close(uncaptured_fd_); - uncaptured_fd_ = -1; - } - - FILE* const file = posix::FOpen(filename_.c_str(), "r"); - if (file == nullptr) { - GTEST_LOG_(FATAL) << "Failed to open tmp file " << filename_ - << " for capturing stream."; - } - const std::string content = ReadEntireFile(file); - posix::FClose(file); - return content; - } - - private: - const int fd_; // A stream to capture. - int uncaptured_fd_; - // Name of the temporary file holding the stderr output. - ::std::string filename_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); -}; - -GTEST_DISABLE_MSC_DEPRECATED_POP_() - -static CapturedStream* g_captured_stderr = nullptr; -static CapturedStream* g_captured_stdout = nullptr; - -// Starts capturing an output stream (stdout/stderr). -static void CaptureStream(int fd, const char* stream_name, - CapturedStream** stream) { - if (*stream != nullptr) { - GTEST_LOG_(FATAL) << "Only one " << stream_name - << " capturer can exist at a time."; - } - *stream = new CapturedStream(fd); -} - -// Stops capturing the output stream and returns the captured string. -static std::string GetCapturedStream(CapturedStream** captured_stream) { - const std::string content = (*captured_stream)->GetCapturedString(); - - delete *captured_stream; - *captured_stream = nullptr; - - return content; -} - -// Starts capturing stdout. -void CaptureStdout() { - CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); -} - -// Starts capturing stderr. -void CaptureStderr() { - CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); -} - -// Stops capturing stdout and returns the captured string. -std::string GetCapturedStdout() { - return GetCapturedStream(&g_captured_stdout); -} - -// Stops capturing stderr and returns the captured string. -std::string GetCapturedStderr() { - return GetCapturedStream(&g_captured_stderr); -} - -#endif // GTEST_HAS_STREAM_REDIRECTION - - - - - -size_t GetFileSize(FILE* file) { - fseek(file, 0, SEEK_END); - return static_cast(ftell(file)); -} - -std::string ReadEntireFile(FILE* file) { - const size_t file_size = GetFileSize(file); - char* const buffer = new char[file_size]; - - size_t bytes_last_read = 0; // # of bytes read in the last fread() - size_t bytes_read = 0; // # of bytes read so far - - fseek(file, 0, SEEK_SET); - - // Keeps reading the file until we cannot read further or the - // pre-determined file size is reached. - do { - bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); - bytes_read += bytes_last_read; - } while (bytes_last_read > 0 && bytes_read < file_size); - - const std::string content(buffer, bytes_read); - delete[] buffer; - - return content; -} - -#if GTEST_HAS_DEATH_TEST -static const std::vector* g_injected_test_argvs = - nullptr; // Owned. - -std::vector GetInjectableArgvs() { - if (g_injected_test_argvs != nullptr) { - return *g_injected_test_argvs; - } - return GetArgvs(); -} - -void SetInjectableArgvs(const std::vector* new_argvs) { - if (g_injected_test_argvs != new_argvs) delete g_injected_test_argvs; - g_injected_test_argvs = new_argvs; -} - -void SetInjectableArgvs(const std::vector& new_argvs) { - SetInjectableArgvs( - new std::vector(new_argvs.begin(), new_argvs.end())); -} - -void ClearInjectableArgvs() { - delete g_injected_test_argvs; - g_injected_test_argvs = nullptr; -} -#endif // GTEST_HAS_DEATH_TEST - -#if GTEST_OS_WINDOWS_MOBILE -namespace posix { -void Abort() { - DebugBreak(); - TerminateProcess(GetCurrentProcess(), 1); -} -} // namespace posix -#endif // GTEST_OS_WINDOWS_MOBILE - -// Returns the name of the environment variable corresponding to the -// given flag. For example, FlagToEnvVar("foo") will return -// "GTEST_FOO" in the open-source version. -static std::string FlagToEnvVar(const char* flag) { - const std::string full_flag = - (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); - - Message env_var; - for (size_t i = 0; i != full_flag.length(); i++) { - env_var << ToUpper(full_flag.c_str()[i]); - } - - return env_var.GetString(); -} - -// Parses 'str' for a 32-bit signed integer. If successful, writes -// the result to *value and returns true; otherwise leaves *value -// unchanged and returns false. -bool ParseInt32(const Message& src_text, const char* str, Int32* value) { - // Parses the environment variable as a decimal integer. - char* end = nullptr; - const long long_value = strtol(str, &end, 10); // NOLINT - - // Has strtol() consumed all characters in the string? - if (*end != '\0') { - // No - an invalid character was encountered. - Message msg; - msg << "WARNING: " << src_text - << " is expected to be a 32-bit integer, but actually" - << " has value \"" << str << "\".\n"; - printf("%s", msg.GetString().c_str()); - fflush(stdout); - return false; - } - - // Is the parsed value in the range of an Int32? - const Int32 result = static_cast(long_value); - if (long_value == LONG_MAX || long_value == LONG_MIN || - // The parsed value overflows as a long. (strtol() returns - // LONG_MAX or LONG_MIN when the input overflows.) - result != long_value - // The parsed value overflows as an Int32. - ) { - Message msg; - msg << "WARNING: " << src_text - << " is expected to be a 32-bit integer, but actually" - << " has value " << str << ", which overflows.\n"; - printf("%s", msg.GetString().c_str()); - fflush(stdout); - return false; - } - - *value = result; - return true; -} - -// Reads and returns the Boolean environment variable corresponding to -// the given flag; if it's not set, returns default_value. -// -// The value is considered true if and only if it's not "0". -bool BoolFromGTestEnv(const char* flag, bool default_value) { -#if defined(GTEST_GET_BOOL_FROM_ENV_) - return GTEST_GET_BOOL_FROM_ENV_(flag, default_value); -#else - const std::string env_var = FlagToEnvVar(flag); - const char* const string_value = posix::GetEnv(env_var.c_str()); - return string_value == nullptr ? default_value - : strcmp(string_value, "0") != 0; -#endif // defined(GTEST_GET_BOOL_FROM_ENV_) -} - -// Reads and returns a 32-bit integer stored in the environment -// variable corresponding to the given flag; if it isn't set or -// doesn't represent a valid 32-bit integer, returns default_value. -Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { -#if defined(GTEST_GET_INT32_FROM_ENV_) - return GTEST_GET_INT32_FROM_ENV_(flag, default_value); -#else - const std::string env_var = FlagToEnvVar(flag); - const char* const string_value = posix::GetEnv(env_var.c_str()); - if (string_value == nullptr) { - // The environment variable is not set. - return default_value; - } - - Int32 result = default_value; - if (!ParseInt32(Message() << "Environment variable " << env_var, - string_value, &result)) { - printf("The default value %s is used.\n", - (Message() << default_value).GetString().c_str()); - fflush(stdout); - return default_value; - } - - return result; -#endif // defined(GTEST_GET_INT32_FROM_ENV_) -} - -// As a special case for the 'output' flag, if GTEST_OUTPUT is not -// set, we look for XML_OUTPUT_FILE, which is set by the Bazel build -// system. The value of XML_OUTPUT_FILE is a filename without the -// "xml:" prefix of GTEST_OUTPUT. -// Note that this is meant to be called at the call site so it does -// not check that the flag is 'output' -// In essence this checks an env variable called XML_OUTPUT_FILE -// and if it is set we prepend "xml:" to its value, if it not set we return "" -std::string OutputFlagAlsoCheckEnvVar(){ - std::string default_value_for_output_flag = ""; - const char* xml_output_file_env = posix::GetEnv("XML_OUTPUT_FILE"); - if (nullptr != xml_output_file_env) { - default_value_for_output_flag = std::string("xml:") + xml_output_file_env; - } - return default_value_for_output_flag; -} - -// Reads and returns the string environment variable corresponding to -// the given flag; if it's not set, returns default_value. -const char* StringFromGTestEnv(const char* flag, const char* default_value) { -#if defined(GTEST_GET_STRING_FROM_ENV_) - return GTEST_GET_STRING_FROM_ENV_(flag, default_value); -#else - const std::string env_var = FlagToEnvVar(flag); - const char* const value = posix::GetEnv(env_var.c_str()); - return value == nullptr ? default_value : value; -#endif // defined(GTEST_GET_STRING_FROM_ENV_) -} - -} // namespace internal -} // namespace testing diff --git a/core/deps/gtest/src/gtest-printers.cc b/core/deps/gtest/src/gtest-printers.cc deleted file mode 100644 index b108235ed..000000000 --- a/core/deps/gtest/src/gtest-printers.cc +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright 2007, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Google Test - The Google C++ Testing and Mocking Framework -// -// This file implements a universal value printer that can print a -// value of any type T: -// -// void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); -// -// It uses the << operator when possible, and prints the bytes in the -// object otherwise. A user can override its behavior for a class -// type Foo by defining either operator<<(::std::ostream&, const Foo&) -// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that -// defines Foo. - -#include "gtest/gtest-printers.h" - -#include -#include -#include -#include // NOLINT -#include - -#include "gtest/internal/gtest-port.h" -#include "gtest-internal-inl.h" - -namespace testing { - -namespace { - -using ::std::ostream; - -// Prints a segment of bytes in the given object. -GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ -void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, - size_t count, ostream* os) { - char text[5] = ""; - for (size_t i = 0; i != count; i++) { - const size_t j = start + i; - if (i != 0) { - // Organizes the bytes into groups of 2 for easy parsing by - // human. - if ((j % 2) == 0) - *os << ' '; - else - *os << '-'; - } - GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]); - *os << text; - } -} - -// Prints the bytes in the given value to the given ostream. -void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, - ostream* os) { - // Tells the user how big the object is. - *os << count << "-byte object <"; - - const size_t kThreshold = 132; - const size_t kChunkSize = 64; - // If the object size is bigger than kThreshold, we'll have to omit - // some details by printing only the first and the last kChunkSize - // bytes. - if (count < kThreshold) { - PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); - } else { - PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); - *os << " ... "; - // Rounds up to 2-byte boundary. - const size_t resume_pos = (count - kChunkSize + 1)/2*2; - PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); - } - *os << ">"; -} - -} // namespace - -namespace internal2 { - -// Delegates to PrintBytesInObjectToImpl() to print the bytes in the -// given object. The delegation simplifies the implementation, which -// uses the << operator and thus is easier done outside of the -// ::testing::internal namespace, which contains a << operator that -// sometimes conflicts with the one in STL. -void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, - ostream* os) { - PrintBytesInObjectToImpl(obj_bytes, count, os); -} - -} // namespace internal2 - -namespace internal { - -// Depending on the value of a char (or wchar_t), we print it in one -// of three formats: -// - as is if it's a printable ASCII (e.g. 'a', '2', ' '), -// - as a hexadecimal escape sequence (e.g. '\x7F'), or -// - as a special escape sequence (e.g. '\r', '\n'). -enum CharFormat { - kAsIs, - kHexEscape, - kSpecialEscape -}; - -// Returns true if c is a printable ASCII character. We test the -// value of c directly instead of calling isprint(), which is buggy on -// Windows Mobile. -inline bool IsPrintableAscii(wchar_t c) { - return 0x20 <= c && c <= 0x7E; -} - -// Prints a wide or narrow char c as a character literal without the -// quotes, escaping it when necessary; returns how c was formatted. -// The template argument UnsignedChar is the unsigned version of Char, -// which is the type of c. -template -static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { - wchar_t w_c = static_cast(c); - switch (w_c) { - case L'\0': - *os << "\\0"; - break; - case L'\'': - *os << "\\'"; - break; - case L'\\': - *os << "\\\\"; - break; - case L'\a': - *os << "\\a"; - break; - case L'\b': - *os << "\\b"; - break; - case L'\f': - *os << "\\f"; - break; - case L'\n': - *os << "\\n"; - break; - case L'\r': - *os << "\\r"; - break; - case L'\t': - *os << "\\t"; - break; - case L'\v': - *os << "\\v"; - break; - default: - if (IsPrintableAscii(w_c)) { - *os << static_cast(c); - return kAsIs; - } else { - ostream::fmtflags flags = os->flags(); - *os << "\\x" << std::hex << std::uppercase - << static_cast(static_cast(c)); - os->flags(flags); - return kHexEscape; - } - } - return kSpecialEscape; -} - -// Prints a wchar_t c as if it's part of a string literal, escaping it when -// necessary; returns how c was formatted. -static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { - switch (c) { - case L'\'': - *os << "'"; - return kAsIs; - case L'"': - *os << "\\\""; - return kSpecialEscape; - default: - return PrintAsCharLiteralTo(c, os); - } -} - -// Prints a char c as if it's part of a string literal, escaping it when -// necessary; returns how c was formatted. -static CharFormat PrintAsStringLiteralTo(char c, ostream* os) { - return PrintAsStringLiteralTo( - static_cast(static_cast(c)), os); -} - -// Prints a wide or narrow character c and its code. '\0' is printed -// as "'\\0'", other unprintable characters are also properly escaped -// using the standard C++ escape sequence. The template argument -// UnsignedChar is the unsigned version of Char, which is the type of c. -template -void PrintCharAndCodeTo(Char c, ostream* os) { - // First, print c as a literal in the most readable form we can find. - *os << ((sizeof(c) > 1) ? "L'" : "'"); - const CharFormat format = PrintAsCharLiteralTo(c, os); - *os << "'"; - - // To aid user debugging, we also print c's code in decimal, unless - // it's 0 (in which case c was printed as '\\0', making the code - // obvious). - if (c == 0) - return; - *os << " (" << static_cast(c); - - // For more convenience, we print c's code again in hexadecimal, - // unless c was already printed in the form '\x##' or the code is in - // [1, 9]. - if (format == kHexEscape || (1 <= c && c <= 9)) { - // Do nothing. - } else { - *os << ", 0x" << String::FormatHexInt(static_cast(c)); - } - *os << ")"; -} - -void PrintTo(unsigned char c, ::std::ostream* os) { - PrintCharAndCodeTo(c, os); -} -void PrintTo(signed char c, ::std::ostream* os) { - PrintCharAndCodeTo(c, os); -} - -// Prints a wchar_t as a symbol if it is printable or as its internal -// code otherwise and also as its code. L'\0' is printed as "L'\\0'". -void PrintTo(wchar_t wc, ostream* os) { - PrintCharAndCodeTo(wc, os); -} - -// Prints the given array of characters to the ostream. CharType must be either -// char or wchar_t. -// The array starts at begin, the length is len, it may include '\0' characters -// and may not be NUL-terminated. -template -GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ -static CharFormat PrintCharsAsStringTo( - const CharType* begin, size_t len, ostream* os) { - const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; - *os << kQuoteBegin; - bool is_previous_hex = false; - CharFormat print_format = kAsIs; - for (size_t index = 0; index < len; ++index) { - const CharType cur = begin[index]; - if (is_previous_hex && IsXDigit(cur)) { - // Previous character is of '\x..' form and this character can be - // interpreted as another hexadecimal digit in its number. Break string to - // disambiguate. - *os << "\" " << kQuoteBegin; - } - is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape; - // Remember if any characters required hex escaping. - if (is_previous_hex) { - print_format = kHexEscape; - } - } - *os << "\""; - return print_format; -} - -// Prints a (const) char/wchar_t array of 'len' elements, starting at address -// 'begin'. CharType must be either char or wchar_t. -template -GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ -GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ -GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ -static void UniversalPrintCharArray( - const CharType* begin, size_t len, ostream* os) { - // The code - // const char kFoo[] = "foo"; - // generates an array of 4, not 3, elements, with the last one being '\0'. - // - // Therefore when printing a char array, we don't print the last element if - // it's '\0', such that the output matches the string literal as it's - // written in the source code. - if (len > 0 && begin[len - 1] == '\0') { - PrintCharsAsStringTo(begin, len - 1, os); - return; - } - - // If, however, the last element in the array is not '\0', e.g. - // const char kFoo[] = { 'f', 'o', 'o' }; - // we must print the entire array. We also print a message to indicate - // that the array is not NUL-terminated. - PrintCharsAsStringTo(begin, len, os); - *os << " (no terminating NUL)"; -} - -// Prints a (const) char array of 'len' elements, starting at address 'begin'. -void UniversalPrintArray(const char* begin, size_t len, ostream* os) { - UniversalPrintCharArray(begin, len, os); -} - -// Prints a (const) wchar_t array of 'len' elements, starting at address -// 'begin'. -void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) { - UniversalPrintCharArray(begin, len, os); -} - -// Prints the given C string to the ostream. -void PrintTo(const char* s, ostream* os) { - if (s == nullptr) { - *os << "NULL"; - } else { - *os << ImplicitCast_(s) << " pointing to "; - PrintCharsAsStringTo(s, strlen(s), os); - } -} - -// MSVC compiler can be configured to define whar_t as a typedef -// of unsigned short. Defining an overload for const wchar_t* in that case -// would cause pointers to unsigned shorts be printed as wide strings, -// possibly accessing more memory than intended and causing invalid -// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when -// wchar_t is implemented as a native type. -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) -// Prints the given wide C string to the ostream. -void PrintTo(const wchar_t* s, ostream* os) { - if (s == nullptr) { - *os << "NULL"; - } else { - *os << ImplicitCast_(s) << " pointing to "; - PrintCharsAsStringTo(s, wcslen(s), os); - } -} -#endif // wchar_t is native - -namespace { - -bool ContainsUnprintableControlCodes(const char* str, size_t length) { - const unsigned char *s = reinterpret_cast(str); - - for (size_t i = 0; i < length; i++) { - unsigned char ch = *s++; - if (std::iscntrl(ch)) { - switch (ch) { - case '\t': - case '\n': - case '\r': - break; - default: - return true; - } - } - } - return false; -} - -bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; } - -bool IsValidUTF8(const char* str, size_t length) { - const unsigned char *s = reinterpret_cast(str); - - for (size_t i = 0; i < length;) { - unsigned char lead = s[i++]; - - if (lead <= 0x7f) { - continue; // single-byte character (ASCII) 0..7F - } - if (lead < 0xc2) { - return false; // trail byte or non-shortest form - } else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) { - ++i; // 2-byte character - } else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length && - IsUTF8TrailByte(s[i]) && - IsUTF8TrailByte(s[i + 1]) && - // check for non-shortest form and surrogate - (lead != 0xe0 || s[i] >= 0xa0) && - (lead != 0xed || s[i] < 0xa0)) { - i += 2; // 3-byte character - } else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length && - IsUTF8TrailByte(s[i]) && - IsUTF8TrailByte(s[i + 1]) && - IsUTF8TrailByte(s[i + 2]) && - // check for non-shortest form - (lead != 0xf0 || s[i] >= 0x90) && - (lead != 0xf4 || s[i] < 0x90)) { - i += 3; // 4-byte character - } else { - return false; - } - } - return true; -} - -void ConditionalPrintAsText(const char* str, size_t length, ostream* os) { - if (!ContainsUnprintableControlCodes(str, length) && - IsValidUTF8(str, length)) { - *os << "\n As Text: \"" << str << "\""; - } -} - -} // anonymous namespace - -void PrintStringTo(const ::std::string& s, ostream* os) { - if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) { - if (GTEST_FLAG(print_utf8)) { - ConditionalPrintAsText(s.data(), s.size(), os); - } - } -} - -#if GTEST_HAS_STD_WSTRING -void PrintWideStringTo(const ::std::wstring& s, ostream* os) { - PrintCharsAsStringTo(s.data(), s.size(), os); -} -#endif // GTEST_HAS_STD_WSTRING - -} // namespace internal - -} // namespace testing diff --git a/core/deps/gtest/src/gtest-test-part.cc b/core/deps/gtest/src/gtest-test-part.cc deleted file mode 100644 index cad3b2ed2..000000000 --- a/core/deps/gtest/src/gtest-test-part.cc +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// The Google C++ Testing and Mocking Framework (Google Test) - -#include "gtest/gtest-test-part.h" - -#include "gtest/internal/gtest-port.h" -#include "gtest-internal-inl.h" - -namespace testing { - -using internal::GetUnitTestImpl; - -// Gets the summary of the failure message by omitting the stack trace -// in it. -std::string TestPartResult::ExtractSummary(const char* message) { - const char* const stack_trace = strstr(message, internal::kStackTraceMarker); - return stack_trace == nullptr ? message : std::string(message, stack_trace); -} - -// Prints a TestPartResult object. -std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { - return os << internal::FormatFileLocation(result.file_name(), - result.line_number()) - << " " - << (result.type() == TestPartResult::kSuccess - ? "Success" - : result.type() == TestPartResult::kSkip - ? "Skipped" - : result.type() == TestPartResult::kFatalFailure - ? "Fatal failure" - : "Non-fatal failure") - << ":\n" - << result.message() << std::endl; -} - -// Appends a TestPartResult to the array. -void TestPartResultArray::Append(const TestPartResult& result) { - array_.push_back(result); -} - -// Returns the TestPartResult at the given index (0-based). -const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { - if (index < 0 || index >= size()) { - printf("\nInvalid index (%d) into TestPartResultArray.\n", index); - internal::posix::Abort(); - } - - return array_[static_cast(index)]; -} - -// Returns the number of TestPartResult objects in the array. -int TestPartResultArray::size() const { - return static_cast(array_.size()); -} - -namespace internal { - -HasNewFatalFailureHelper::HasNewFatalFailureHelper() - : has_new_fatal_failure_(false), - original_reporter_(GetUnitTestImpl()-> - GetTestPartResultReporterForCurrentThread()) { - GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); -} - -HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { - GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( - original_reporter_); -} - -void HasNewFatalFailureHelper::ReportTestPartResult( - const TestPartResult& result) { - if (result.fatally_failed()) - has_new_fatal_failure_ = true; - original_reporter_->ReportTestPartResult(result); -} - -} // namespace internal - -} // namespace testing diff --git a/core/deps/gtest/src/gtest-typed-test.cc b/core/deps/gtest/src/gtest-typed-test.cc deleted file mode 100644 index 8677caf73..000000000 --- a/core/deps/gtest/src/gtest-typed-test.cc +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2008 Google Inc. -// All Rights Reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#include "gtest/gtest-typed-test.h" - -#include "gtest/gtest.h" - -namespace testing { -namespace internal { - -#if GTEST_HAS_TYPED_TEST_P - -// Skips to the first non-space char in str. Returns an empty string if str -// contains only whitespace characters. -static const char* SkipSpaces(const char* str) { - while (IsSpace(*str)) - str++; - return str; -} - -static std::vector SplitIntoTestNames(const char* src) { - std::vector name_vec; - src = SkipSpaces(src); - for (; src != nullptr; src = SkipComma(src)) { - name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src))); - } - return name_vec; -} - -// Verifies that registered_tests match the test names in -// registered_tests_; returns registered_tests if successful, or -// aborts the program otherwise. -const char* TypedTestSuitePState::VerifyRegisteredTestNames( - const char* file, int line, const char* registered_tests) { - typedef RegisteredTestsMap::const_iterator RegisteredTestIter; - registered_ = true; - - std::vector name_vec = SplitIntoTestNames(registered_tests); - - Message errors; - - std::set tests; - for (std::vector::const_iterator name_it = name_vec.begin(); - name_it != name_vec.end(); ++name_it) { - const std::string& name = *name_it; - if (tests.count(name) != 0) { - errors << "Test " << name << " is listed more than once.\n"; - continue; - } - - bool found = false; - for (RegisteredTestIter it = registered_tests_.begin(); - it != registered_tests_.end(); - ++it) { - if (name == it->first) { - found = true; - break; - } - } - - if (found) { - tests.insert(name); - } else { - errors << "No test named " << name - << " can be found in this test suite.\n"; - } - } - - for (RegisteredTestIter it = registered_tests_.begin(); - it != registered_tests_.end(); - ++it) { - if (tests.count(it->first) == 0) { - errors << "You forgot to list test " << it->first << ".\n"; - } - } - - const std::string& errors_str = errors.GetString(); - if (errors_str != "") { - fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), - errors_str.c_str()); - fflush(stderr); - posix::Abort(); - } - - return registered_tests; -} - -#endif // GTEST_HAS_TYPED_TEST_P - -} // namespace internal -} // namespace testing diff --git a/core/deps/gtest/src/gtest.cc b/core/deps/gtest/src/gtest.cc deleted file mode 100644 index 032f5d836..000000000 --- a/core/deps/gtest/src/gtest.cc +++ /dev/null @@ -1,6176 +0,0 @@ -// Copyright 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// The Google C++ Testing and Mocking Framework (Google Test) - -#include "gtest/gtest.h" -#include "gtest/internal/custom/gtest.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include // NOLINT -#include -#include -#include "gtest/gtest-spi.h" - -#if GTEST_OS_LINUX - -# define GTEST_HAS_GETTIMEOFDAY_ 1 - -# include // NOLINT -# include // NOLINT -# include // NOLINT -// Declares vsnprintf(). This header is not available on Windows. -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include - -#elif GTEST_OS_ZOS -# define GTEST_HAS_GETTIMEOFDAY_ 1 -# include // NOLINT - -// On z/OS we additionally need strings.h for strcasecmp. -# include // NOLINT - -#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. - -# include // NOLINT -# undef min - -#elif GTEST_OS_WINDOWS // We are on Windows proper. - -# include // NOLINT -# undef min - -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include // NOLINT - -# if GTEST_OS_WINDOWS_MINGW -// MinGW has gettimeofday() but not _ftime64(). -# define GTEST_HAS_GETTIMEOFDAY_ 1 -# include // NOLINT -# endif // GTEST_OS_WINDOWS_MINGW - -#else - -// Assume other platforms have gettimeofday(). -# define GTEST_HAS_GETTIMEOFDAY_ 1 - -// cpplint thinks that the header is already included, so we want to -// silence it. -# include // NOLINT -# include // NOLINT - -#endif // GTEST_OS_LINUX - -#if GTEST_HAS_EXCEPTIONS -# include -#endif - -#if GTEST_CAN_STREAM_RESULTS_ -# include // NOLINT -# include // NOLINT -# include // NOLINT -# include // NOLINT -#endif - -#include "gtest-internal-inl.h" - -#if GTEST_OS_WINDOWS -# define vsnprintf _vsnprintf -#endif // GTEST_OS_WINDOWS - -#if GTEST_OS_MAC -#ifndef GTEST_OS_IOS -#include -#endif -#endif - -#if GTEST_HAS_ABSL -#include "absl/debugging/failure_signal_handler.h" -#include "absl/debugging/stacktrace.h" -#include "absl/debugging/symbolize.h" -#include "absl/strings/str_cat.h" -#endif // GTEST_HAS_ABSL - -namespace testing { - -using internal::CountIf; -using internal::ForEach; -using internal::GetElementOr; -using internal::Shuffle; - -// Constants. - -// A test whose test suite name or test name matches this filter is -// disabled and not run. -static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; - -// A test suite whose name matches this filter is considered a death -// test suite and will be run before test suites whose name doesn't -// match this filter. -static const char kDeathTestSuiteFilter[] = "*DeathTest:*DeathTest/*"; - -// A test filter that matches everything. -static const char kUniversalFilter[] = "*"; - -// The default output format. -static const char kDefaultOutputFormat[] = "xml"; -// The default output file. -static const char kDefaultOutputFile[] = "test_detail"; - -// The environment variable name for the test shard index. -static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; -// The environment variable name for the total number of test shards. -static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; -// The environment variable name for the test shard status file. -static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; - -namespace internal { - -// The text used in failure messages to indicate the start of the -// stack trace. -const char kStackTraceMarker[] = "\nStack trace:\n"; - -// g_help_flag is true if and only if the --help flag or an equivalent form -// is specified on the command line. -bool g_help_flag = false; - -// Utilty function to Open File for Writing -static FILE* OpenFileForWriting(const std::string& output_file) { - FILE* fileout = nullptr; - FilePath output_file_path(output_file); - FilePath output_dir(output_file_path.RemoveFileName()); - - if (output_dir.CreateDirectoriesRecursively()) { - fileout = posix::FOpen(output_file.c_str(), "w"); - } - if (fileout == nullptr) { - GTEST_LOG_(FATAL) << "Unable to open file \"" << output_file << "\""; - } - return fileout; -} - -} // namespace internal - -// Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY -// environment variable. -static const char* GetDefaultFilter() { - const char* const testbridge_test_only = - internal::posix::GetEnv("TESTBRIDGE_TEST_ONLY"); - if (testbridge_test_only != nullptr) { - return testbridge_test_only; - } - return kUniversalFilter; -} - -GTEST_DEFINE_bool_( - also_run_disabled_tests, - internal::BoolFromGTestEnv("also_run_disabled_tests", false), - "Run disabled tests too, in addition to the tests normally being run."); - -GTEST_DEFINE_bool_( - break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false), - "True if and only if a failed assertion should be a debugger " - "break-point."); - -GTEST_DEFINE_bool_(catch_exceptions, - internal::BoolFromGTestEnv("catch_exceptions", true), - "True if and only if " GTEST_NAME_ - " should catch exceptions and treat them as test failures."); - -GTEST_DEFINE_string_( - color, - internal::StringFromGTestEnv("color", "auto"), - "Whether to use colors in the output. Valid values: yes, no, " - "and auto. 'auto' means to use colors if the output is " - "being sent to a terminal and the TERM environment variable " - "is set to a terminal type that supports colors."); - -GTEST_DEFINE_string_( - filter, - internal::StringFromGTestEnv("filter", GetDefaultFilter()), - "A colon-separated list of glob (not regex) patterns " - "for filtering the tests to run, optionally followed by a " - "'-' and a : separated list of negative patterns (tests to " - "exclude). A test is run if it matches one of the positive " - "patterns and does not match any of the negative patterns."); - -GTEST_DEFINE_bool_( - install_failure_signal_handler, - internal::BoolFromGTestEnv("install_failure_signal_handler", false), - "If true and supported on the current platform, " GTEST_NAME_ " should " - "install a signal handler that dumps debugging information when fatal " - "signals are raised."); - -GTEST_DEFINE_bool_(list_tests, false, - "List all tests without running them."); - -// The net priority order after flag processing is thus: -// --gtest_output command line flag -// GTEST_OUTPUT environment variable -// XML_OUTPUT_FILE environment variable -// '' -GTEST_DEFINE_string_( - output, - internal::StringFromGTestEnv("output", - internal::OutputFlagAlsoCheckEnvVar().c_str()), - "A format (defaults to \"xml\" but can be specified to be \"json\"), " - "optionally followed by a colon and an output file name or directory. " - "A directory is indicated by a trailing pathname separator. " - "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " - "If a directory is specified, output files will be created " - "within that directory, with file-names based on the test " - "executable's name and, if necessary, made unique by adding " - "digits."); - -GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true), - "True if and only if " GTEST_NAME_ - " should display elapsed time in text output."); - -GTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv("print_utf8", true), - "True if and only if " GTEST_NAME_ - " prints UTF8 characters as text."); - -GTEST_DEFINE_int32_( - random_seed, - internal::Int32FromGTestEnv("random_seed", 0), - "Random number seed to use when shuffling test orders. Must be in range " - "[1, 99999], or 0 to use a seed based on the current time."); - -GTEST_DEFINE_int32_( - repeat, - internal::Int32FromGTestEnv("repeat", 1), - "How many times to repeat each test. Specify a negative number " - "for repeating forever. Useful for shaking out flaky tests."); - -GTEST_DEFINE_bool_(show_internal_stack_frames, false, - "True if and only if " GTEST_NAME_ - " should include internal stack frames when " - "printing test failure stack traces."); - -GTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv("shuffle", false), - "True if and only if " GTEST_NAME_ - " should randomize tests' order on every run."); - -GTEST_DEFINE_int32_( - stack_trace_depth, - internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), - "The maximum number of stack frames to print when an " - "assertion fails. The valid range is 0 through 100, inclusive."); - -GTEST_DEFINE_string_( - stream_result_to, - internal::StringFromGTestEnv("stream_result_to", ""), - "This flag specifies the host name and the port number on which to stream " - "test results. Example: \"localhost:555\". The flag is effective only on " - "Linux."); - -GTEST_DEFINE_bool_( - throw_on_failure, - internal::BoolFromGTestEnv("throw_on_failure", false), - "When this flag is specified, a failed assertion will throw an exception " - "if exceptions are enabled or exit the program with a non-zero code " - "otherwise. For use with an external test framework."); - -#if GTEST_USE_OWN_FLAGFILE_FLAG_ -GTEST_DEFINE_string_( - flagfile, - internal::StringFromGTestEnv("flagfile", ""), - "This flag specifies the flagfile to read command-line flags from."); -#endif // GTEST_USE_OWN_FLAGFILE_FLAG_ - -namespace internal { - -// Generates a random number from [0, range), using a Linear -// Congruential Generator (LCG). Crashes if 'range' is 0 or greater -// than kMaxRange. -UInt32 Random::Generate(UInt32 range) { - // These constants are the same as are used in glibc's rand(3). - // Use wider types than necessary to prevent unsigned overflow diagnostics. - state_ = static_cast(1103515245ULL*state_ + 12345U) % kMaxRange; - - GTEST_CHECK_(range > 0) - << "Cannot generate a number in the range [0, 0)."; - GTEST_CHECK_(range <= kMaxRange) - << "Generation of a number in [0, " << range << ") was requested, " - << "but this can only generate numbers in [0, " << kMaxRange << ")."; - - // Converting via modulus introduces a bit of downward bias, but - // it's simple, and a linear congruential generator isn't too good - // to begin with. - return state_ % range; -} - -// GTestIsInitialized() returns true if and only if the user has initialized -// Google Test. Useful for catching the user mistake of not initializing -// Google Test before calling RUN_ALL_TESTS(). -static bool GTestIsInitialized() { return GetArgvs().size() > 0; } - -// Iterates over a vector of TestSuites, keeping a running sum of the -// results of calling a given int-returning method on each. -// Returns the sum. -static int SumOverTestSuiteList(const std::vector& case_list, - int (TestSuite::*method)() const) { - int sum = 0; - for (size_t i = 0; i < case_list.size(); i++) { - sum += (case_list[i]->*method)(); - } - return sum; -} - -// Returns true if and only if the test suite passed. -static bool TestSuitePassed(const TestSuite* test_suite) { - return test_suite->should_run() && test_suite->Passed(); -} - -// Returns true if and only if the test suite failed. -static bool TestSuiteFailed(const TestSuite* test_suite) { - return test_suite->should_run() && test_suite->Failed(); -} - -// Returns true if and only if test_suite contains at least one test that -// should run. -static bool ShouldRunTestSuite(const TestSuite* test_suite) { - return test_suite->should_run(); -} - -// AssertHelper constructor. -AssertHelper::AssertHelper(TestPartResult::Type type, - const char* file, - int line, - const char* message) - : data_(new AssertHelperData(type, file, line, message)) { -} - -AssertHelper::~AssertHelper() { - delete data_; -} - -// Message assignment, for assertion streaming support. -void AssertHelper::operator=(const Message& message) const { - UnitTest::GetInstance()-> - AddTestPartResult(data_->type, data_->file, data_->line, - AppendUserMessage(data_->message, message), - UnitTest::GetInstance()->impl() - ->CurrentOsStackTraceExceptTop(1) - // Skips the stack frame for this function itself. - ); // NOLINT -} - -// A copy of all command line arguments. Set by InitGoogleTest(). -static ::std::vector g_argvs; - -::std::vector GetArgvs() { -#if defined(GTEST_CUSTOM_GET_ARGVS_) - // GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or - // ::string. This code converts it to the appropriate type. - const auto& custom = GTEST_CUSTOM_GET_ARGVS_(); - return ::std::vector(custom.begin(), custom.end()); -#else // defined(GTEST_CUSTOM_GET_ARGVS_) - return g_argvs; -#endif // defined(GTEST_CUSTOM_GET_ARGVS_) -} - -// Returns the current application's name, removing directory path if that -// is present. -FilePath GetCurrentExecutableName() { - FilePath result; - -#if GTEST_OS_WINDOWS || GTEST_OS_OS2 - result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe")); -#else - result.Set(FilePath(GetArgvs()[0])); -#endif // GTEST_OS_WINDOWS - - return result.RemoveDirectoryName(); -} - -// Functions for processing the gtest_output flag. - -// Returns the output format, or "" for normal printed output. -std::string UnitTestOptions::GetOutputFormat() { - const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); - const char* const colon = strchr(gtest_output_flag, ':'); - return (colon == nullptr) - ? std::string(gtest_output_flag) - : std::string(gtest_output_flag, - static_cast(colon - gtest_output_flag)); -} - -// Returns the name of the requested output file, or the default if none -// was explicitly specified. -std::string UnitTestOptions::GetAbsolutePathToOutputFile() { - const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); - - std::string format = GetOutputFormat(); - if (format.empty()) - format = std::string(kDefaultOutputFormat); - - const char* const colon = strchr(gtest_output_flag, ':'); - if (colon == nullptr) - return internal::FilePath::MakeFileName( - internal::FilePath( - UnitTest::GetInstance()->original_working_dir()), - internal::FilePath(kDefaultOutputFile), 0, - format.c_str()).string(); - - internal::FilePath output_name(colon + 1); - if (!output_name.IsAbsolutePath()) - output_name = internal::FilePath::ConcatPaths( - internal::FilePath(UnitTest::GetInstance()->original_working_dir()), - internal::FilePath(colon + 1)); - - if (!output_name.IsDirectory()) - return output_name.string(); - - internal::FilePath result(internal::FilePath::GenerateUniqueFileName( - output_name, internal::GetCurrentExecutableName(), - GetOutputFormat().c_str())); - return result.string(); -} - -// Returns true if and only if the wildcard pattern matches the string. -// The first ':' or '\0' character in pattern marks the end of it. -// -// This recursive algorithm isn't very efficient, but is clear and -// works well enough for matching test names, which are short. -bool UnitTestOptions::PatternMatchesString(const char *pattern, - const char *str) { - switch (*pattern) { - case '\0': - case ':': // Either ':' or '\0' marks the end of the pattern. - return *str == '\0'; - case '?': // Matches any single character. - return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); - case '*': // Matches any string (possibly empty) of characters. - return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || - PatternMatchesString(pattern + 1, str); - default: // Non-special character. Matches itself. - return *pattern == *str && - PatternMatchesString(pattern + 1, str + 1); - } -} - -bool UnitTestOptions::MatchesFilter( - const std::string& name, const char* filter) { - const char *cur_pattern = filter; - for (;;) { - if (PatternMatchesString(cur_pattern, name.c_str())) { - return true; - } - - // Finds the next pattern in the filter. - cur_pattern = strchr(cur_pattern, ':'); - - // Returns if no more pattern can be found. - if (cur_pattern == nullptr) { - return false; - } - - // Skips the pattern separater (the ':' character). - cur_pattern++; - } -} - -// Returns true if and only if the user-specified filter matches the test -// suite name and the test name. -bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name, - const std::string& test_name) { - const std::string& full_name = test_suite_name + "." + test_name.c_str(); - - // Split --gtest_filter at '-', if there is one, to separate into - // positive filter and negative filter portions - const char* const p = GTEST_FLAG(filter).c_str(); - const char* const dash = strchr(p, '-'); - std::string positive; - std::string negative; - if (dash == nullptr) { - positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter - negative = ""; - } else { - positive = std::string(p, dash); // Everything up to the dash - negative = std::string(dash + 1); // Everything after the dash - if (positive.empty()) { - // Treat '-test1' as the same as '*-test1' - positive = kUniversalFilter; - } - } - - // A filter is a colon-separated list of patterns. It matches a - // test if any pattern in it matches the test. - return (MatchesFilter(full_name, positive.c_str()) && - !MatchesFilter(full_name, negative.c_str())); -} - -#if GTEST_HAS_SEH -// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the -// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. -// This function is useful as an __except condition. -int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { - // Google Test should handle a SEH exception if: - // 1. the user wants it to, AND - // 2. this is not a breakpoint exception, AND - // 3. this is not a C++ exception (VC++ implements them via SEH, - // apparently). - // - // SEH exception code for C++ exceptions. - // (see http://support.microsoft.com/kb/185294 for more information). - const DWORD kCxxExceptionCode = 0xe06d7363; - - bool should_handle = true; - - if (!GTEST_FLAG(catch_exceptions)) - should_handle = false; - else if (exception_code == EXCEPTION_BREAKPOINT) - should_handle = false; - else if (exception_code == kCxxExceptionCode) - should_handle = false; - - return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; -} -#endif // GTEST_HAS_SEH - -} // namespace internal - -// The c'tor sets this object as the test part result reporter used by -// Google Test. The 'result' parameter specifies where to report the -// results. Intercepts only failures from the current thread. -ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( - TestPartResultArray* result) - : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), - result_(result) { - Init(); -} - -// The c'tor sets this object as the test part result reporter used by -// Google Test. The 'result' parameter specifies where to report the -// results. -ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( - InterceptMode intercept_mode, TestPartResultArray* result) - : intercept_mode_(intercept_mode), - result_(result) { - Init(); -} - -void ScopedFakeTestPartResultReporter::Init() { - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - if (intercept_mode_ == INTERCEPT_ALL_THREADS) { - old_reporter_ = impl->GetGlobalTestPartResultReporter(); - impl->SetGlobalTestPartResultReporter(this); - } else { - old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); - impl->SetTestPartResultReporterForCurrentThread(this); - } -} - -// The d'tor restores the test part result reporter used by Google Test -// before. -ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - if (intercept_mode_ == INTERCEPT_ALL_THREADS) { - impl->SetGlobalTestPartResultReporter(old_reporter_); - } else { - impl->SetTestPartResultReporterForCurrentThread(old_reporter_); - } -} - -// Increments the test part result count and remembers the result. -// This method is from the TestPartResultReporterInterface interface. -void ScopedFakeTestPartResultReporter::ReportTestPartResult( - const TestPartResult& result) { - result_->Append(result); -} - -namespace internal { - -// Returns the type ID of ::testing::Test. We should always call this -// instead of GetTypeId< ::testing::Test>() to get the type ID of -// testing::Test. This is to work around a suspected linker bug when -// using Google Test as a framework on Mac OS X. The bug causes -// GetTypeId< ::testing::Test>() to return different values depending -// on whether the call is from the Google Test framework itself or -// from user test code. GetTestTypeId() is guaranteed to always -// return the same value, as it always calls GetTypeId<>() from the -// gtest.cc, which is within the Google Test framework. -TypeId GetTestTypeId() { - return GetTypeId(); -} - -// The value of GetTestTypeId() as seen from within the Google Test -// library. This is solely for testing GetTestTypeId(). -extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); - -// This predicate-formatter checks that 'results' contains a test part -// failure of the given type and that the failure message contains the -// given substring. -static AssertionResult HasOneFailure(const char* /* results_expr */, - const char* /* type_expr */, - const char* /* substr_expr */, - const TestPartResultArray& results, - TestPartResult::Type type, - const std::string& substr) { - const std::string expected(type == TestPartResult::kFatalFailure ? - "1 fatal failure" : - "1 non-fatal failure"); - Message msg; - if (results.size() != 1) { - msg << "Expected: " << expected << "\n" - << " Actual: " << results.size() << " failures"; - for (int i = 0; i < results.size(); i++) { - msg << "\n" << results.GetTestPartResult(i); - } - return AssertionFailure() << msg; - } - - const TestPartResult& r = results.GetTestPartResult(0); - if (r.type() != type) { - return AssertionFailure() << "Expected: " << expected << "\n" - << " Actual:\n" - << r; - } - - if (strstr(r.message(), substr.c_str()) == nullptr) { - return AssertionFailure() << "Expected: " << expected << " containing \"" - << substr << "\"\n" - << " Actual:\n" - << r; - } - - return AssertionSuccess(); -} - -// The constructor of SingleFailureChecker remembers where to look up -// test part results, what type of failure we expect, and what -// substring the failure message should contain. -SingleFailureChecker::SingleFailureChecker(const TestPartResultArray* results, - TestPartResult::Type type, - const std::string& substr) - : results_(results), type_(type), substr_(substr) {} - -// The destructor of SingleFailureChecker verifies that the given -// TestPartResultArray contains exactly one failure that has the given -// type and contains the given substring. If that's not the case, a -// non-fatal failure will be generated. -SingleFailureChecker::~SingleFailureChecker() { - EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); -} - -DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( - UnitTestImpl* unit_test) : unit_test_(unit_test) {} - -void DefaultGlobalTestPartResultReporter::ReportTestPartResult( - const TestPartResult& result) { - unit_test_->current_test_result()->AddTestPartResult(result); - unit_test_->listeners()->repeater()->OnTestPartResult(result); -} - -DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( - UnitTestImpl* unit_test) : unit_test_(unit_test) {} - -void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( - const TestPartResult& result) { - unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); -} - -// Returns the global test part result reporter. -TestPartResultReporterInterface* -UnitTestImpl::GetGlobalTestPartResultReporter() { - internal::MutexLock lock(&global_test_part_result_reporter_mutex_); - return global_test_part_result_repoter_; -} - -// Sets the global test part result reporter. -void UnitTestImpl::SetGlobalTestPartResultReporter( - TestPartResultReporterInterface* reporter) { - internal::MutexLock lock(&global_test_part_result_reporter_mutex_); - global_test_part_result_repoter_ = reporter; -} - -// Returns the test part result reporter for the current thread. -TestPartResultReporterInterface* -UnitTestImpl::GetTestPartResultReporterForCurrentThread() { - return per_thread_test_part_result_reporter_.get(); -} - -// Sets the test part result reporter for the current thread. -void UnitTestImpl::SetTestPartResultReporterForCurrentThread( - TestPartResultReporterInterface* reporter) { - per_thread_test_part_result_reporter_.set(reporter); -} - -// Gets the number of successful test suites. -int UnitTestImpl::successful_test_suite_count() const { - return CountIf(test_suites_, TestSuitePassed); -} - -// Gets the number of failed test suites. -int UnitTestImpl::failed_test_suite_count() const { - return CountIf(test_suites_, TestSuiteFailed); -} - -// Gets the number of all test suites. -int UnitTestImpl::total_test_suite_count() const { - return static_cast(test_suites_.size()); -} - -// Gets the number of all test suites that contain at least one test -// that should run. -int UnitTestImpl::test_suite_to_run_count() const { - return CountIf(test_suites_, ShouldRunTestSuite); -} - -// Gets the number of successful tests. -int UnitTestImpl::successful_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count); -} - -// Gets the number of skipped tests. -int UnitTestImpl::skipped_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count); -} - -// Gets the number of failed tests. -int UnitTestImpl::failed_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count); -} - -// Gets the number of disabled tests that will be reported in the XML report. -int UnitTestImpl::reportable_disabled_test_count() const { - return SumOverTestSuiteList(test_suites_, - &TestSuite::reportable_disabled_test_count); -} - -// Gets the number of disabled tests. -int UnitTestImpl::disabled_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count); -} - -// Gets the number of tests to be printed in the XML report. -int UnitTestImpl::reportable_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count); -} - -// Gets the number of all tests. -int UnitTestImpl::total_test_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count); -} - -// Gets the number of tests that should run. -int UnitTestImpl::test_to_run_count() const { - return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count); -} - -// Returns the current OS stack trace as an std::string. -// -// The maximum number of stack frames to be included is specified by -// the gtest_stack_trace_depth flag. The skip_count parameter -// specifies the number of top frames to be skipped, which doesn't -// count against the number of frames to be included. -// -// For example, if Foo() calls Bar(), which in turn calls -// CurrentOsStackTraceExceptTop(1), Foo() will be included in the -// trace but Bar() and CurrentOsStackTraceExceptTop() won't. -std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { - return os_stack_trace_getter()->CurrentStackTrace( - static_cast(GTEST_FLAG(stack_trace_depth)), - skip_count + 1 - // Skips the user-specified number of frames plus this function - // itself. - ); // NOLINT -} - -// Returns the current time in milliseconds. -TimeInMillis GetTimeInMillis() { -#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) - // Difference between 1970-01-01 and 1601-01-01 in milliseconds. - // http://analogous.blogspot.com/2005/04/epoch.html - const TimeInMillis kJavaEpochToWinFileTimeDelta = - static_cast(116444736UL) * 100000UL; - const DWORD kTenthMicrosInMilliSecond = 10000; - - SYSTEMTIME now_systime; - FILETIME now_filetime; - ULARGE_INTEGER now_int64; - GetSystemTime(&now_systime); - if (SystemTimeToFileTime(&now_systime, &now_filetime)) { - now_int64.LowPart = now_filetime.dwLowDateTime; - now_int64.HighPart = now_filetime.dwHighDateTime; - now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - - kJavaEpochToWinFileTimeDelta; - return now_int64.QuadPart; - } - return 0; -#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ - __timeb64 now; - - // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 - // (deprecated function) there. - GTEST_DISABLE_MSC_DEPRECATED_PUSH_() - _ftime64(&now); - GTEST_DISABLE_MSC_DEPRECATED_POP_() - - return static_cast(now.time) * 1000 + now.millitm; -#elif GTEST_HAS_GETTIMEOFDAY_ - struct timeval now; - gettimeofday(&now, nullptr); - return static_cast(now.tv_sec) * 1000 + now.tv_usec / 1000; -#else -# error "Don't know how to get the current time on your system." -#endif -} - -// Utilities - -// class String. - -#if GTEST_OS_WINDOWS_MOBILE -// Creates a UTF-16 wide string from the given ANSI string, allocating -// memory using new. The caller is responsible for deleting the return -// value using delete[]. Returns the wide string, or NULL if the -// input is NULL. -LPCWSTR String::AnsiToUtf16(const char* ansi) { - if (!ansi) return nullptr; - const int length = strlen(ansi); - const int unicode_length = - MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0); - WCHAR* unicode = new WCHAR[unicode_length + 1]; - MultiByteToWideChar(CP_ACP, 0, ansi, length, - unicode, unicode_length); - unicode[unicode_length] = 0; - return unicode; -} - -// Creates an ANSI string from the given wide string, allocating -// memory using new. The caller is responsible for deleting the return -// value using delete[]. Returns the ANSI string, or NULL if the -// input is NULL. -const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { - if (!utf16_str) return nullptr; - const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr, - 0, nullptr, nullptr); - char* ansi = new char[ansi_length + 1]; - WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr, - nullptr); - ansi[ansi_length] = 0; - return ansi; -} - -#endif // GTEST_OS_WINDOWS_MOBILE - -// Compares two C strings. Returns true if and only if they have the same -// content. -// -// Unlike strcmp(), this function can handle NULL argument(s). A NULL -// C string is considered different to any non-NULL C string, -// including the empty string. -bool String::CStringEquals(const char * lhs, const char * rhs) { - if (lhs == nullptr) return rhs == nullptr; - - if (rhs == nullptr) return false; - - return strcmp(lhs, rhs) == 0; -} - -#if GTEST_HAS_STD_WSTRING - -// Converts an array of wide chars to a narrow string using the UTF-8 -// encoding, and streams the result to the given Message object. -static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, - Message* msg) { - for (size_t i = 0; i != length; ) { // NOLINT - if (wstr[i] != L'\0') { - *msg << WideStringToUtf8(wstr + i, static_cast(length - i)); - while (i != length && wstr[i] != L'\0') - i++; - } else { - *msg << '\0'; - i++; - } - } -} - -#endif // GTEST_HAS_STD_WSTRING - -void SplitString(const ::std::string& str, char delimiter, - ::std::vector< ::std::string>* dest) { - ::std::vector< ::std::string> parsed; - ::std::string::size_type pos = 0; - while (::testing::internal::AlwaysTrue()) { - const ::std::string::size_type colon = str.find(delimiter, pos); - if (colon == ::std::string::npos) { - parsed.push_back(str.substr(pos)); - break; - } else { - parsed.push_back(str.substr(pos, colon - pos)); - pos = colon + 1; - } - } - dest->swap(parsed); -} - -} // namespace internal - -// Constructs an empty Message. -// We allocate the stringstream separately because otherwise each use of -// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's -// stack frame leading to huge stack frames in some cases; gcc does not reuse -// the stack space. -Message::Message() : ss_(new ::std::stringstream) { - // By default, we want there to be enough precision when printing - // a double to a Message. - *ss_ << std::setprecision(std::numeric_limits::digits10 + 2); -} - -// These two overloads allow streaming a wide C string to a Message -// using the UTF-8 encoding. -Message& Message::operator <<(const wchar_t* wide_c_str) { - return *this << internal::String::ShowWideCString(wide_c_str); -} -Message& Message::operator <<(wchar_t* wide_c_str) { - return *this << internal::String::ShowWideCString(wide_c_str); -} - -#if GTEST_HAS_STD_WSTRING -// Converts the given wide string to a narrow string using the UTF-8 -// encoding, and streams the result to this Message object. -Message& Message::operator <<(const ::std::wstring& wstr) { - internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); - return *this; -} -#endif // GTEST_HAS_STD_WSTRING - -// Gets the text streamed to this object so far as an std::string. -// Each '\0' character in the buffer is replaced with "\\0". -std::string Message::GetString() const { - return internal::StringStreamToString(ss_.get()); -} - -// AssertionResult constructors. -// Used in EXPECT_TRUE/FALSE(assertion_result). -AssertionResult::AssertionResult(const AssertionResult& other) - : success_(other.success_), - message_(other.message_.get() != nullptr - ? new ::std::string(*other.message_) - : static_cast< ::std::string*>(nullptr)) {} - -// Swaps two AssertionResults. -void AssertionResult::swap(AssertionResult& other) { - using std::swap; - swap(success_, other.success_); - swap(message_, other.message_); -} - -// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. -AssertionResult AssertionResult::operator!() const { - AssertionResult negation(!success_); - if (message_.get() != nullptr) negation << *message_; - return negation; -} - -// Makes a successful assertion result. -AssertionResult AssertionSuccess() { - return AssertionResult(true); -} - -// Makes a failed assertion result. -AssertionResult AssertionFailure() { - return AssertionResult(false); -} - -// Makes a failed assertion result with the given failure message. -// Deprecated; use AssertionFailure() << message. -AssertionResult AssertionFailure(const Message& message) { - return AssertionFailure() << message; -} - -namespace internal { - -namespace edit_distance { -std::vector CalculateOptimalEdits(const std::vector& left, - const std::vector& right) { - std::vector > costs( - left.size() + 1, std::vector(right.size() + 1)); - std::vector > best_move( - left.size() + 1, std::vector(right.size() + 1)); - - // Populate for empty right. - for (size_t l_i = 0; l_i < costs.size(); ++l_i) { - costs[l_i][0] = static_cast(l_i); - best_move[l_i][0] = kRemove; - } - // Populate for empty left. - for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) { - costs[0][r_i] = static_cast(r_i); - best_move[0][r_i] = kAdd; - } - - for (size_t l_i = 0; l_i < left.size(); ++l_i) { - for (size_t r_i = 0; r_i < right.size(); ++r_i) { - if (left[l_i] == right[r_i]) { - // Found a match. Consume it. - costs[l_i + 1][r_i + 1] = costs[l_i][r_i]; - best_move[l_i + 1][r_i + 1] = kMatch; - continue; - } - - const double add = costs[l_i + 1][r_i]; - const double remove = costs[l_i][r_i + 1]; - const double replace = costs[l_i][r_i]; - if (add < remove && add < replace) { - costs[l_i + 1][r_i + 1] = add + 1; - best_move[l_i + 1][r_i + 1] = kAdd; - } else if (remove < add && remove < replace) { - costs[l_i + 1][r_i + 1] = remove + 1; - best_move[l_i + 1][r_i + 1] = kRemove; - } else { - // We make replace a little more expensive than add/remove to lower - // their priority. - costs[l_i + 1][r_i + 1] = replace + 1.00001; - best_move[l_i + 1][r_i + 1] = kReplace; - } - } - } - - // Reconstruct the best path. We do it in reverse order. - std::vector best_path; - for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) { - EditType move = best_move[l_i][r_i]; - best_path.push_back(move); - l_i -= move != kAdd; - r_i -= move != kRemove; - } - std::reverse(best_path.begin(), best_path.end()); - return best_path; -} - -namespace { - -// Helper class to convert string into ids with deduplication. -class InternalStrings { - public: - size_t GetId(const std::string& str) { - IdMap::iterator it = ids_.find(str); - if (it != ids_.end()) return it->second; - size_t id = ids_.size(); - return ids_[str] = id; - } - - private: - typedef std::map IdMap; - IdMap ids_; -}; - -} // namespace - -std::vector CalculateOptimalEdits( - const std::vector& left, - const std::vector& right) { - std::vector left_ids, right_ids; - { - InternalStrings intern_table; - for (size_t i = 0; i < left.size(); ++i) { - left_ids.push_back(intern_table.GetId(left[i])); - } - for (size_t i = 0; i < right.size(); ++i) { - right_ids.push_back(intern_table.GetId(right[i])); - } - } - return CalculateOptimalEdits(left_ids, right_ids); -} - -namespace { - -// Helper class that holds the state for one hunk and prints it out to the -// stream. -// It reorders adds/removes when possible to group all removes before all -// adds. It also adds the hunk header before printint into the stream. -class Hunk { - public: - Hunk(size_t left_start, size_t right_start) - : left_start_(left_start), - right_start_(right_start), - adds_(), - removes_(), - common_() {} - - void PushLine(char edit, const char* line) { - switch (edit) { - case ' ': - ++common_; - FlushEdits(); - hunk_.push_back(std::make_pair(' ', line)); - break; - case '-': - ++removes_; - hunk_removes_.push_back(std::make_pair('-', line)); - break; - case '+': - ++adds_; - hunk_adds_.push_back(std::make_pair('+', line)); - break; - } - } - - void PrintTo(std::ostream* os) { - PrintHeader(os); - FlushEdits(); - for (std::list >::const_iterator it = - hunk_.begin(); - it != hunk_.end(); ++it) { - *os << it->first << it->second << "\n"; - } - } - - bool has_edits() const { return adds_ || removes_; } - - private: - void FlushEdits() { - hunk_.splice(hunk_.end(), hunk_removes_); - hunk_.splice(hunk_.end(), hunk_adds_); - } - - // Print a unified diff header for one hunk. - // The format is - // "@@ -, +, @@" - // where the left/right parts are omitted if unnecessary. - void PrintHeader(std::ostream* ss) const { - *ss << "@@ "; - if (removes_) { - *ss << "-" << left_start_ << "," << (removes_ + common_); - } - if (removes_ && adds_) { - *ss << " "; - } - if (adds_) { - *ss << "+" << right_start_ << "," << (adds_ + common_); - } - *ss << " @@\n"; - } - - size_t left_start_, right_start_; - size_t adds_, removes_, common_; - std::list > hunk_, hunk_adds_, hunk_removes_; -}; - -} // namespace - -// Create a list of diff hunks in Unified diff format. -// Each hunk has a header generated by PrintHeader above plus a body with -// lines prefixed with ' ' for no change, '-' for deletion and '+' for -// addition. -// 'context' represents the desired unchanged prefix/suffix around the diff. -// If two hunks are close enough that their contexts overlap, then they are -// joined into one hunk. -std::string CreateUnifiedDiff(const std::vector& left, - const std::vector& right, - size_t context) { - const std::vector edits = CalculateOptimalEdits(left, right); - - size_t l_i = 0, r_i = 0, edit_i = 0; - std::stringstream ss; - while (edit_i < edits.size()) { - // Find first edit. - while (edit_i < edits.size() && edits[edit_i] == kMatch) { - ++l_i; - ++r_i; - ++edit_i; - } - - // Find the first line to include in the hunk. - const size_t prefix_context = std::min(l_i, context); - Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1); - for (size_t i = prefix_context; i > 0; --i) { - hunk.PushLine(' ', left[l_i - i].c_str()); - } - - // Iterate the edits until we found enough suffix for the hunk or the input - // is over. - size_t n_suffix = 0; - for (; edit_i < edits.size(); ++edit_i) { - if (n_suffix >= context) { - // Continue only if the next hunk is very close. - auto it = edits.begin() + static_cast(edit_i); - while (it != edits.end() && *it == kMatch) ++it; - if (it == edits.end() || - static_cast(it - edits.begin()) - edit_i >= context) { - // There is no next edit or it is too far away. - break; - } - } - - EditType edit = edits[edit_i]; - // Reset count when a non match is found. - n_suffix = edit == kMatch ? n_suffix + 1 : 0; - - if (edit == kMatch || edit == kRemove || edit == kReplace) { - hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str()); - } - if (edit == kAdd || edit == kReplace) { - hunk.PushLine('+', right[r_i].c_str()); - } - - // Advance indices, depending on edit type. - l_i += edit != kAdd; - r_i += edit != kRemove; - } - - if (!hunk.has_edits()) { - // We are done. We don't want this hunk. - break; - } - - hunk.PrintTo(&ss); - } - return ss.str(); -} - -} // namespace edit_distance - -namespace { - -// The string representation of the values received in EqFailure() are already -// escaped. Split them on escaped '\n' boundaries. Leave all other escaped -// characters the same. -std::vector SplitEscapedString(const std::string& str) { - std::vector lines; - size_t start = 0, end = str.size(); - if (end > 2 && str[0] == '"' && str[end - 1] == '"') { - ++start; - --end; - } - bool escaped = false; - for (size_t i = start; i + 1 < end; ++i) { - if (escaped) { - escaped = false; - if (str[i] == 'n') { - lines.push_back(str.substr(start, i - start - 1)); - start = i + 1; - } - } else { - escaped = str[i] == '\\'; - } - } - lines.push_back(str.substr(start, end - start)); - return lines; -} - -} // namespace - -// Constructs and returns the message for an equality assertion -// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. -// -// The first four parameters are the expressions used in the assertion -// and their values, as strings. For example, for ASSERT_EQ(foo, bar) -// where foo is 5 and bar is 6, we have: -// -// lhs_expression: "foo" -// rhs_expression: "bar" -// lhs_value: "5" -// rhs_value: "6" -// -// The ignoring_case parameter is true if and only if the assertion is a -// *_STRCASEEQ*. When it's true, the string "Ignoring case" will -// be inserted into the message. -AssertionResult EqFailure(const char* lhs_expression, - const char* rhs_expression, - const std::string& lhs_value, - const std::string& rhs_value, - bool ignoring_case) { - Message msg; - msg << "Expected equality of these values:"; - msg << "\n " << lhs_expression; - if (lhs_value != lhs_expression) { - msg << "\n Which is: " << lhs_value; - } - msg << "\n " << rhs_expression; - if (rhs_value != rhs_expression) { - msg << "\n Which is: " << rhs_value; - } - - if (ignoring_case) { - msg << "\nIgnoring case"; - } - - if (!lhs_value.empty() && !rhs_value.empty()) { - const std::vector lhs_lines = - SplitEscapedString(lhs_value); - const std::vector rhs_lines = - SplitEscapedString(rhs_value); - if (lhs_lines.size() > 1 || rhs_lines.size() > 1) { - msg << "\nWith diff:\n" - << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines); - } - } - - return AssertionFailure() << msg; -} - -// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. -std::string GetBoolAssertionFailureMessage( - const AssertionResult& assertion_result, - const char* expression_text, - const char* actual_predicate_value, - const char* expected_predicate_value) { - const char* actual_message = assertion_result.message(); - Message msg; - msg << "Value of: " << expression_text - << "\n Actual: " << actual_predicate_value; - if (actual_message[0] != '\0') - msg << " (" << actual_message << ")"; - msg << "\nExpected: " << expected_predicate_value; - return msg.GetString(); -} - -// Helper function for implementing ASSERT_NEAR. -AssertionResult DoubleNearPredFormat(const char* expr1, - const char* expr2, - const char* abs_error_expr, - double val1, - double val2, - double abs_error) { - const double diff = fabs(val1 - val2); - if (diff <= abs_error) return AssertionSuccess(); - - return AssertionFailure() - << "The difference between " << expr1 << " and " << expr2 - << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" - << expr1 << " evaluates to " << val1 << ",\n" - << expr2 << " evaluates to " << val2 << ", and\n" - << abs_error_expr << " evaluates to " << abs_error << "."; -} - - -// Helper template for implementing FloatLE() and DoubleLE(). -template -AssertionResult FloatingPointLE(const char* expr1, - const char* expr2, - RawType val1, - RawType val2) { - // Returns success if val1 is less than val2, - if (val1 < val2) { - return AssertionSuccess(); - } - - // or if val1 is almost equal to val2. - const FloatingPoint lhs(val1), rhs(val2); - if (lhs.AlmostEquals(rhs)) { - return AssertionSuccess(); - } - - // Note that the above two checks will both fail if either val1 or - // val2 is NaN, as the IEEE floating-point standard requires that - // any predicate involving a NaN must return false. - - ::std::stringstream val1_ss; - val1_ss << std::setprecision(std::numeric_limits::digits10 + 2) - << val1; - - ::std::stringstream val2_ss; - val2_ss << std::setprecision(std::numeric_limits::digits10 + 2) - << val2; - - return AssertionFailure() - << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" - << " Actual: " << StringStreamToString(&val1_ss) << " vs " - << StringStreamToString(&val2_ss); -} - -} // namespace internal - -// Asserts that val1 is less than, or almost equal to, val2. Fails -// otherwise. In particular, it fails if either val1 or val2 is NaN. -AssertionResult FloatLE(const char* expr1, const char* expr2, - float val1, float val2) { - return internal::FloatingPointLE(expr1, expr2, val1, val2); -} - -// Asserts that val1 is less than, or almost equal to, val2. Fails -// otherwise. In particular, it fails if either val1 or val2 is NaN. -AssertionResult DoubleLE(const char* expr1, const char* expr2, - double val1, double val2) { - return internal::FloatingPointLE(expr1, expr2, val1, val2); -} - -namespace internal { - -// The helper function for {ASSERT|EXPECT}_EQ with int or enum -// arguments. -AssertionResult CmpHelperEQ(const char* lhs_expression, - const char* rhs_expression, std::intmax_t lhs, - std::intmax_t rhs) { - if (lhs == rhs) { - return AssertionSuccess(); - } - - return EqFailure(lhs_expression, - rhs_expression, - FormatForComparisonFailureMessage(lhs, rhs), - FormatForComparisonFailureMessage(rhs, lhs), - false); -} - -// A macro for implementing the helper functions needed to implement -// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here -// just to avoid copy-and-paste of similar code. -#define GTEST_IMPL_CMP_HELPER_(op_name, op) \ - AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ - std::intmax_t val1, std::intmax_t val2) { \ - if (val1 op val2) { \ - return AssertionSuccess(); \ - } else { \ - return AssertionFailure() \ - << "Expected: (" << expr1 << ") " #op " (" << expr2 \ - << "), actual: " << FormatForComparisonFailureMessage(val1, val2) \ - << " vs " << FormatForComparisonFailureMessage(val2, val1); \ - } \ - } - -// Implements the helper function for {ASSERT|EXPECT}_NE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(NE, !=) -// Implements the helper function for {ASSERT|EXPECT}_LE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(LE, <=) -// Implements the helper function for {ASSERT|EXPECT}_LT with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(LT, < ) -// Implements the helper function for {ASSERT|EXPECT}_GE with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(GE, >=) -// Implements the helper function for {ASSERT|EXPECT}_GT with int or -// enum arguments. -GTEST_IMPL_CMP_HELPER_(GT, > ) - -#undef GTEST_IMPL_CMP_HELPER_ - -// The helper function for {ASSERT|EXPECT}_STREQ. -AssertionResult CmpHelperSTREQ(const char* lhs_expression, - const char* rhs_expression, - const char* lhs, - const char* rhs) { - if (String::CStringEquals(lhs, rhs)) { - return AssertionSuccess(); - } - - return EqFailure(lhs_expression, - rhs_expression, - PrintToString(lhs), - PrintToString(rhs), - false); -} - -// The helper function for {ASSERT|EXPECT}_STRCASEEQ. -AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression, - const char* rhs_expression, - const char* lhs, - const char* rhs) { - if (String::CaseInsensitiveCStringEquals(lhs, rhs)) { - return AssertionSuccess(); - } - - return EqFailure(lhs_expression, - rhs_expression, - PrintToString(lhs), - PrintToString(rhs), - true); -} - -// The helper function for {ASSERT|EXPECT}_STRNE. -AssertionResult CmpHelperSTRNE(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2) { - if (!String::CStringEquals(s1, s2)) { - return AssertionSuccess(); - } else { - return AssertionFailure() << "Expected: (" << s1_expression << ") != (" - << s2_expression << "), actual: \"" - << s1 << "\" vs \"" << s2 << "\""; - } -} - -// The helper function for {ASSERT|EXPECT}_STRCASENE. -AssertionResult CmpHelperSTRCASENE(const char* s1_expression, - const char* s2_expression, - const char* s1, - const char* s2) { - if (!String::CaseInsensitiveCStringEquals(s1, s2)) { - return AssertionSuccess(); - } else { - return AssertionFailure() - << "Expected: (" << s1_expression << ") != (" - << s2_expression << ") (ignoring case), actual: \"" - << s1 << "\" vs \"" << s2 << "\""; - } -} - -} // namespace internal - -namespace { - -// Helper functions for implementing IsSubString() and IsNotSubstring(). - -// This group of overloaded functions return true if and only if needle -// is a substring of haystack. NULL is considered a substring of -// itself only. - -bool IsSubstringPred(const char* needle, const char* haystack) { - if (needle == nullptr || haystack == nullptr) return needle == haystack; - - return strstr(haystack, needle) != nullptr; -} - -bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { - if (needle == nullptr || haystack == nullptr) return needle == haystack; - - return wcsstr(haystack, needle) != nullptr; -} - -// StringType here can be either ::std::string or ::std::wstring. -template -bool IsSubstringPred(const StringType& needle, - const StringType& haystack) { - return haystack.find(needle) != StringType::npos; -} - -// This function implements either IsSubstring() or IsNotSubstring(), -// depending on the value of the expected_to_be_substring parameter. -// StringType here can be const char*, const wchar_t*, ::std::string, -// or ::std::wstring. -template -AssertionResult IsSubstringImpl( - bool expected_to_be_substring, - const char* needle_expr, const char* haystack_expr, - const StringType& needle, const StringType& haystack) { - if (IsSubstringPred(needle, haystack) == expected_to_be_substring) - return AssertionSuccess(); - - const bool is_wide_string = sizeof(needle[0]) > 1; - const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; - return AssertionFailure() - << "Value of: " << needle_expr << "\n" - << " Actual: " << begin_string_quote << needle << "\"\n" - << "Expected: " << (expected_to_be_substring ? "" : "not ") - << "a substring of " << haystack_expr << "\n" - << "Which is: " << begin_string_quote << haystack << "\""; -} - -} // namespace - -// IsSubstring() and IsNotSubstring() check whether needle is a -// substring of haystack (NULL is considered a substring of itself -// only), and return an appropriate error message when they fail. - -AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const char* needle, const char* haystack) { - return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const wchar_t* needle, const wchar_t* haystack) { - return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const char* needle, const char* haystack) { - return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const wchar_t* needle, const wchar_t* haystack) { - return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::string& needle, const ::std::string& haystack) { - return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::string& needle, const ::std::string& haystack) { - return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); -} - -#if GTEST_HAS_STD_WSTRING -AssertionResult IsSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::wstring& needle, const ::std::wstring& haystack) { - return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); -} - -AssertionResult IsNotSubstring( - const char* needle_expr, const char* haystack_expr, - const ::std::wstring& needle, const ::std::wstring& haystack) { - return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); -} -#endif // GTEST_HAS_STD_WSTRING - -namespace internal { - -#if GTEST_OS_WINDOWS - -namespace { - -// Helper function for IsHRESULT{SuccessFailure} predicates -AssertionResult HRESULTFailureHelper(const char* expr, - const char* expected, - long hr) { // NOLINT -# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE - - // Windows CE doesn't support FormatMessage. - const char error_text[] = ""; - -# else - - // Looks up the human-readable system message for the HRESULT code - // and since we're not passing any params to FormatMessage, we don't - // want inserts expanded. - const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS; - const DWORD kBufSize = 4096; - // Gets the system's human readable message string for this HRESULT. - char error_text[kBufSize] = { '\0' }; - DWORD message_length = ::FormatMessageA(kFlags, - 0, // no source, we're asking system - static_cast(hr), // the error - 0, // no line width restrictions - error_text, // output buffer - kBufSize, // buf size - nullptr); // no arguments for inserts - // Trims tailing white space (FormatMessage leaves a trailing CR-LF) - for (; message_length && IsSpace(error_text[message_length - 1]); - --message_length) { - error_text[message_length - 1] = '\0'; - } - -# endif // GTEST_OS_WINDOWS_MOBILE - - const std::string error_hex("0x" + String::FormatHexInt(hr)); - return ::testing::AssertionFailure() - << "Expected: " << expr << " " << expected << ".\n" - << " Actual: " << error_hex << " " << error_text << "\n"; -} - -} // namespace - -AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT - if (SUCCEEDED(hr)) { - return AssertionSuccess(); - } - return HRESULTFailureHelper(expr, "succeeds", hr); -} - -AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT - if (FAILED(hr)) { - return AssertionSuccess(); - } - return HRESULTFailureHelper(expr, "fails", hr); -} - -#endif // GTEST_OS_WINDOWS - -// Utility functions for encoding Unicode text (wide strings) in -// UTF-8. - -// A Unicode code-point can have up to 21 bits, and is encoded in UTF-8 -// like this: -// -// Code-point length Encoding -// 0 - 7 bits 0xxxxxxx -// 8 - 11 bits 110xxxxx 10xxxxxx -// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx -// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - -// The maximum code-point a one-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint1 = (static_cast(1) << 7) - 1; - -// The maximum code-point a two-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint2 = (static_cast(1) << (5 + 6)) - 1; - -// The maximum code-point a three-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint3 = (static_cast(1) << (4 + 2*6)) - 1; - -// The maximum code-point a four-byte UTF-8 sequence can represent. -const UInt32 kMaxCodePoint4 = (static_cast(1) << (3 + 3*6)) - 1; - -// Chops off the n lowest bits from a bit pattern. Returns the n -// lowest bits. As a side effect, the original bit pattern will be -// shifted to the right by n bits. -inline UInt32 ChopLowBits(UInt32* bits, int n) { - const UInt32 low_bits = *bits & ((static_cast(1) << n) - 1); - *bits >>= n; - return low_bits; -} - -// Converts a Unicode code point to a narrow string in UTF-8 encoding. -// code_point parameter is of type UInt32 because wchar_t may not be -// wide enough to contain a code point. -// If the code_point is not a valid Unicode code point -// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted -// to "(Invalid Unicode 0xXXXXXXXX)". -std::string CodePointToUtf8(UInt32 code_point) { - if (code_point > kMaxCodePoint4) { - return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")"; - } - - char str[5]; // Big enough for the largest valid code point. - if (code_point <= kMaxCodePoint1) { - str[1] = '\0'; - str[0] = static_cast(code_point); // 0xxxxxxx - } else if (code_point <= kMaxCodePoint2) { - str[2] = '\0'; - str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[0] = static_cast(0xC0 | code_point); // 110xxxxx - } else if (code_point <= kMaxCodePoint3) { - str[3] = '\0'; - str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[0] = static_cast(0xE0 | code_point); // 1110xxxx - } else { // code_point <= kMaxCodePoint4 - str[4] = '\0'; - str[3] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx - str[0] = static_cast(0xF0 | code_point); // 11110xxx - } - return str; -} - -// The following two functions only make sense if the system -// uses UTF-16 for wide string encoding. All supported systems -// with 16 bit wchar_t (Windows, Cygwin) do use UTF-16. - -// Determines if the arguments constitute UTF-16 surrogate pair -// and thus should be combined into a single Unicode code point -// using CreateCodePointFromUtf16SurrogatePair. -inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { - return sizeof(wchar_t) == 2 && - (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; -} - -// Creates a Unicode code point from UTF16 surrogate pair. -inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, - wchar_t second) { - const auto first_u = static_cast(first); - const auto second_u = static_cast(second); - const UInt32 mask = (1 << 10) - 1; - return (sizeof(wchar_t) == 2) - ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000 - : - // This function should not be called when the condition is - // false, but we provide a sensible default in case it is. - first_u; -} - -// Converts a wide string to a narrow string in UTF-8 encoding. -// The wide string is assumed to have the following encoding: -// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin) -// UTF-32 if sizeof(wchar_t) == 4 (on Linux) -// Parameter str points to a null-terminated wide string. -// Parameter num_chars may additionally limit the number -// of wchar_t characters processed. -1 is used when the entire string -// should be processed. -// If the string contains code points that are not valid Unicode code points -// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output -// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding -// and contains invalid UTF-16 surrogate pairs, values in those pairs -// will be encoded as individual Unicode characters from Basic Normal Plane. -std::string WideStringToUtf8(const wchar_t* str, int num_chars) { - if (num_chars == -1) - num_chars = static_cast(wcslen(str)); - - ::std::stringstream stream; - for (int i = 0; i < num_chars; ++i) { - UInt32 unicode_code_point; - - if (str[i] == L'\0') { - break; - } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { - unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], - str[i + 1]); - i++; - } else { - unicode_code_point = static_cast(str[i]); - } - - stream << CodePointToUtf8(unicode_code_point); - } - return StringStreamToString(&stream); -} - -// Converts a wide C string to an std::string using the UTF-8 encoding. -// NULL will be converted to "(null)". -std::string String::ShowWideCString(const wchar_t * wide_c_str) { - if (wide_c_str == nullptr) return "(null)"; - - return internal::WideStringToUtf8(wide_c_str, -1); -} - -// Compares two wide C strings. Returns true if and only if they have the -// same content. -// -// Unlike wcscmp(), this function can handle NULL argument(s). A NULL -// C string is considered different to any non-NULL C string, -// including the empty string. -bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { - if (lhs == nullptr) return rhs == nullptr; - - if (rhs == nullptr) return false; - - return wcscmp(lhs, rhs) == 0; -} - -// Helper function for *_STREQ on wide strings. -AssertionResult CmpHelperSTREQ(const char* lhs_expression, - const char* rhs_expression, - const wchar_t* lhs, - const wchar_t* rhs) { - if (String::WideCStringEquals(lhs, rhs)) { - return AssertionSuccess(); - } - - return EqFailure(lhs_expression, - rhs_expression, - PrintToString(lhs), - PrintToString(rhs), - false); -} - -// Helper function for *_STRNE on wide strings. -AssertionResult CmpHelperSTRNE(const char* s1_expression, - const char* s2_expression, - const wchar_t* s1, - const wchar_t* s2) { - if (!String::WideCStringEquals(s1, s2)) { - return AssertionSuccess(); - } - - return AssertionFailure() << "Expected: (" << s1_expression << ") != (" - << s2_expression << "), actual: " - << PrintToString(s1) - << " vs " << PrintToString(s2); -} - -// Compares two C strings, ignoring case. Returns true if and only if they have -// the same content. -// -// Unlike strcasecmp(), this function can handle NULL argument(s). A -// NULL C string is considered different to any non-NULL C string, -// including the empty string. -bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { - if (lhs == nullptr) return rhs == nullptr; - if (rhs == nullptr) return false; - return posix::StrCaseCmp(lhs, rhs) == 0; -} - -// Compares two wide C strings, ignoring case. Returns true if and only if they -// have the same content. -// -// Unlike wcscasecmp(), this function can handle NULL argument(s). -// A NULL C string is considered different to any non-NULL wide C string, -// including the empty string. -// NB: The implementations on different platforms slightly differ. -// On windows, this method uses _wcsicmp which compares according to LC_CTYPE -// environment variable. On GNU platform this method uses wcscasecmp -// which compares according to LC_CTYPE category of the current locale. -// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the -// current locale. -bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, - const wchar_t* rhs) { - if (lhs == nullptr) return rhs == nullptr; - - if (rhs == nullptr) return false; - -#if GTEST_OS_WINDOWS - return _wcsicmp(lhs, rhs) == 0; -#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID - return wcscasecmp(lhs, rhs) == 0; -#else - // Android, Mac OS X and Cygwin don't define wcscasecmp. - // Other unknown OSes may not define it either. - wint_t left, right; - do { - left = towlower(static_cast(*lhs++)); - right = towlower(static_cast(*rhs++)); - } while (left && left == right); - return left == right; -#endif // OS selector -} - -// Returns true if and only if str ends with the given suffix, ignoring case. -// Any string is considered to end with an empty suffix. -bool String::EndsWithCaseInsensitive( - const std::string& str, const std::string& suffix) { - const size_t str_len = str.length(); - const size_t suffix_len = suffix.length(); - return (str_len >= suffix_len) && - CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len, - suffix.c_str()); -} - -// Formats an int value as "%02d". -std::string String::FormatIntWidth2(int value) { - std::stringstream ss; - ss << std::setfill('0') << std::setw(2) << value; - return ss.str(); -} - -// Formats an int value as "%X". -std::string String::FormatHexUInt32(UInt32 value) { - std::stringstream ss; - ss << std::hex << std::uppercase << value; - return ss.str(); -} - -// Formats an int value as "%X". -std::string String::FormatHexInt(int value) { - return FormatHexUInt32(static_cast(value)); -} - -// Formats a byte as "%02X". -std::string String::FormatByte(unsigned char value) { - std::stringstream ss; - ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase - << static_cast(value); - return ss.str(); -} - -// Converts the buffer in a stringstream to an std::string, converting NUL -// bytes to "\\0" along the way. -std::string StringStreamToString(::std::stringstream* ss) { - const ::std::string& str = ss->str(); - const char* const start = str.c_str(); - const char* const end = start + str.length(); - - std::string result; - result.reserve(static_cast(2 * (end - start))); - for (const char* ch = start; ch != end; ++ch) { - if (*ch == '\0') { - result += "\\0"; // Replaces NUL with "\\0"; - } else { - result += *ch; - } - } - - return result; -} - -// Appends the user-supplied message to the Google-Test-generated message. -std::string AppendUserMessage(const std::string& gtest_msg, - const Message& user_msg) { - // Appends the user message if it's non-empty. - const std::string user_msg_string = user_msg.GetString(); - if (user_msg_string.empty()) { - return gtest_msg; - } - - return gtest_msg + "\n" + user_msg_string; -} - -} // namespace internal - -// class TestResult - -// Creates an empty TestResult. -TestResult::TestResult() - : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {} - -// D'tor. -TestResult::~TestResult() { -} - -// Returns the i-th test part result among all the results. i can -// range from 0 to total_part_count() - 1. If i is not in that range, -// aborts the program. -const TestPartResult& TestResult::GetTestPartResult(int i) const { - if (i < 0 || i >= total_part_count()) - internal::posix::Abort(); - return test_part_results_.at(static_cast(i)); -} - -// Returns the i-th test property. i can range from 0 to -// test_property_count() - 1. If i is not in that range, aborts the -// program. -const TestProperty& TestResult::GetTestProperty(int i) const { - if (i < 0 || i >= test_property_count()) - internal::posix::Abort(); - return test_properties_.at(static_cast(i)); -} - -// Clears the test part results. -void TestResult::ClearTestPartResults() { - test_part_results_.clear(); -} - -// Adds a test part result to the list. -void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { - test_part_results_.push_back(test_part_result); -} - -// Adds a test property to the list. If a property with the same key as the -// supplied property is already represented, the value of this test_property -// replaces the old value for that key. -void TestResult::RecordProperty(const std::string& xml_element, - const TestProperty& test_property) { - if (!ValidateTestProperty(xml_element, test_property)) { - return; - } - internal::MutexLock lock(&test_properites_mutex_); - const std::vector::iterator property_with_matching_key = - std::find_if(test_properties_.begin(), test_properties_.end(), - internal::TestPropertyKeyIs(test_property.key())); - if (property_with_matching_key == test_properties_.end()) { - test_properties_.push_back(test_property); - return; - } - property_with_matching_key->SetValue(test_property.value()); -} - -// The list of reserved attributes used in the element of XML -// output. -static const char* const kReservedTestSuitesAttributes[] = { - "disabled", - "errors", - "failures", - "name", - "random_seed", - "tests", - "time", - "timestamp" -}; - -// The list of reserved attributes used in the element of XML -// output. -static const char* const kReservedTestSuiteAttributes[] = { - "disabled", "errors", "failures", "name", "tests", "time", "timestamp"}; - -// The list of reserved attributes used in the element of XML output. -static const char* const kReservedTestCaseAttributes[] = { - "classname", "name", "status", "time", "type_param", - "value_param", "file", "line"}; - -// Use a slightly different set for allowed output to ensure existing tests can -// still RecordProperty("result") or "RecordProperty(timestamp") -static const char* const kReservedOutputTestCaseAttributes[] = { - "classname", "name", "status", "time", "type_param", - "value_param", "file", "line", "result", "timestamp"}; - -template -std::vector ArrayAsVector(const char* const (&array)[kSize]) { - return std::vector(array, array + kSize); -} - -static std::vector GetReservedAttributesForElement( - const std::string& xml_element) { - if (xml_element == "testsuites") { - return ArrayAsVector(kReservedTestSuitesAttributes); - } else if (xml_element == "testsuite") { - return ArrayAsVector(kReservedTestSuiteAttributes); - } else if (xml_element == "testcase") { - return ArrayAsVector(kReservedTestCaseAttributes); - } else { - GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; - } - // This code is unreachable but some compilers may not realizes that. - return std::vector(); -} - -// TODO(jdesprez): Merge the two getReserved attributes once skip is improved -static std::vector GetReservedOutputAttributesForElement( - const std::string& xml_element) { - if (xml_element == "testsuites") { - return ArrayAsVector(kReservedTestSuitesAttributes); - } else if (xml_element == "testsuite") { - return ArrayAsVector(kReservedTestSuiteAttributes); - } else if (xml_element == "testcase") { - return ArrayAsVector(kReservedOutputTestCaseAttributes); - } else { - GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; - } - // This code is unreachable but some compilers may not realizes that. - return std::vector(); -} - -static std::string FormatWordList(const std::vector& words) { - Message word_list; - for (size_t i = 0; i < words.size(); ++i) { - if (i > 0 && words.size() > 2) { - word_list << ", "; - } - if (i == words.size() - 1) { - word_list << "and "; - } - word_list << "'" << words[i] << "'"; - } - return word_list.GetString(); -} - -static bool ValidateTestPropertyName( - const std::string& property_name, - const std::vector& reserved_names) { - if (std::find(reserved_names.begin(), reserved_names.end(), property_name) != - reserved_names.end()) { - ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name - << " (" << FormatWordList(reserved_names) - << " are reserved by " << GTEST_NAME_ << ")"; - return false; - } - return true; -} - -// Adds a failure if the key is a reserved attribute of the element named -// xml_element. Returns true if the property is valid. -bool TestResult::ValidateTestProperty(const std::string& xml_element, - const TestProperty& test_property) { - return ValidateTestPropertyName(test_property.key(), - GetReservedAttributesForElement(xml_element)); -} - -// Clears the object. -void TestResult::Clear() { - test_part_results_.clear(); - test_properties_.clear(); - death_test_count_ = 0; - elapsed_time_ = 0; -} - -// Returns true off the test part was skipped. -static bool TestPartSkipped(const TestPartResult& result) { - return result.skipped(); -} - -// Returns true if and only if the test was skipped. -bool TestResult::Skipped() const { - return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0; -} - -// Returns true if and only if the test failed. -bool TestResult::Failed() const { - for (int i = 0; i < total_part_count(); ++i) { - if (GetTestPartResult(i).failed()) - return true; - } - return false; -} - -// Returns true if and only if the test part fatally failed. -static bool TestPartFatallyFailed(const TestPartResult& result) { - return result.fatally_failed(); -} - -// Returns true if and only if the test fatally failed. -bool TestResult::HasFatalFailure() const { - return CountIf(test_part_results_, TestPartFatallyFailed) > 0; -} - -// Returns true if and only if the test part non-fatally failed. -static bool TestPartNonfatallyFailed(const TestPartResult& result) { - return result.nonfatally_failed(); -} - -// Returns true if and only if the test has a non-fatal failure. -bool TestResult::HasNonfatalFailure() const { - return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; -} - -// Gets the number of all test parts. This is the sum of the number -// of successful test parts and the number of failed test parts. -int TestResult::total_part_count() const { - return static_cast(test_part_results_.size()); -} - -// Returns the number of the test properties. -int TestResult::test_property_count() const { - return static_cast(test_properties_.size()); -} - -// class Test - -// Creates a Test object. - -// The c'tor saves the states of all flags. -Test::Test() - : gtest_flag_saver_(new GTEST_FLAG_SAVER_) { -} - -// The d'tor restores the states of all flags. The actual work is -// done by the d'tor of the gtest_flag_saver_ field, and thus not -// visible here. -Test::~Test() { -} - -// Sets up the test fixture. -// -// A sub-class may override this. -void Test::SetUp() { -} - -// Tears down the test fixture. -// -// A sub-class may override this. -void Test::TearDown() { -} - -// Allows user supplied key value pairs to be recorded for later output. -void Test::RecordProperty(const std::string& key, const std::string& value) { - UnitTest::GetInstance()->RecordProperty(key, value); -} - -// Allows user supplied key value pairs to be recorded for later output. -void Test::RecordProperty(const std::string& key, int value) { - Message value_message; - value_message << value; - RecordProperty(key, value_message.GetString().c_str()); -} - -namespace internal { - -void ReportFailureInUnknownLocation(TestPartResult::Type result_type, - const std::string& message) { - // This function is a friend of UnitTest and as such has access to - // AddTestPartResult. - UnitTest::GetInstance()->AddTestPartResult( - result_type, - nullptr, // No info about the source file where the exception occurred. - -1, // We have no info on which line caused the exception. - message, - ""); // No stack trace, either. -} - -} // namespace internal - -// Google Test requires all tests in the same test suite to use the same test -// fixture class. This function checks if the current test has the -// same fixture class as the first test in the current test suite. If -// yes, it returns true; otherwise it generates a Google Test failure and -// returns false. -bool Test::HasSameFixtureClass() { - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - const TestSuite* const test_suite = impl->current_test_suite(); - - // Info about the first test in the current test suite. - const TestInfo* const first_test_info = test_suite->test_info_list()[0]; - const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; - const char* const first_test_name = first_test_info->name(); - - // Info about the current test. - const TestInfo* const this_test_info = impl->current_test_info(); - const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; - const char* const this_test_name = this_test_info->name(); - - if (this_fixture_id != first_fixture_id) { - // Is the first test defined using TEST? - const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); - // Is this test defined using TEST? - const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); - - if (first_is_TEST || this_is_TEST) { - // Both TEST and TEST_F appear in same test suite, which is incorrect. - // Tell the user how to fix this. - - // Gets the name of the TEST and the name of the TEST_F. Note - // that first_is_TEST and this_is_TEST cannot both be true, as - // the fixture IDs are different for the two tests. - const char* const TEST_name = - first_is_TEST ? first_test_name : this_test_name; - const char* const TEST_F_name = - first_is_TEST ? this_test_name : first_test_name; - - ADD_FAILURE() - << "All tests in the same test suite must use the same test fixture\n" - << "class, so mixing TEST_F and TEST in the same test suite is\n" - << "illegal. In test suite " << this_test_info->test_suite_name() - << ",\n" - << "test " << TEST_F_name << " is defined using TEST_F but\n" - << "test " << TEST_name << " is defined using TEST. You probably\n" - << "want to change the TEST to TEST_F or move it to another test\n" - << "case."; - } else { - // Two fixture classes with the same name appear in two different - // namespaces, which is not allowed. Tell the user how to fix this. - ADD_FAILURE() - << "All tests in the same test suite must use the same test fixture\n" - << "class. However, in test suite " - << this_test_info->test_suite_name() << ",\n" - << "you defined test " << first_test_name << " and test " - << this_test_name << "\n" - << "using two different test fixture classes. This can happen if\n" - << "the two classes are from different namespaces or translation\n" - << "units and have the same name. You should probably rename one\n" - << "of the classes to put the tests into different test suites."; - } - return false; - } - - return true; -} - -#if GTEST_HAS_SEH - -// Adds an "exception thrown" fatal failure to the current test. This -// function returns its result via an output parameter pointer because VC++ -// prohibits creation of objects with destructors on stack in functions -// using __try (see error C2712). -static std::string* FormatSehExceptionMessage(DWORD exception_code, - const char* location) { - Message message; - message << "SEH exception with code 0x" << std::setbase(16) << - exception_code << std::setbase(10) << " thrown in " << location << "."; - - return new std::string(message.GetString()); -} - -#endif // GTEST_HAS_SEH - -namespace internal { - -#if GTEST_HAS_EXCEPTIONS - -// Adds an "exception thrown" fatal failure to the current test. -static std::string FormatCxxExceptionMessage(const char* description, - const char* location) { - Message message; - if (description != nullptr) { - message << "C++ exception with description \"" << description << "\""; - } else { - message << "Unknown C++ exception"; - } - message << " thrown in " << location << "."; - - return message.GetString(); -} - -static std::string PrintTestPartResultToString( - const TestPartResult& test_part_result); - -GoogleTestFailureException::GoogleTestFailureException( - const TestPartResult& failure) - : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} - -#endif // GTEST_HAS_EXCEPTIONS - -// We put these helper functions in the internal namespace as IBM's xlC -// compiler rejects the code if they were declared static. - -// Runs the given method and handles SEH exceptions it throws, when -// SEH is supported; returns the 0-value for type Result in case of an -// SEH exception. (Microsoft compilers cannot handle SEH and C++ -// exceptions in the same function. Therefore, we provide a separate -// wrapper function for handling SEH exceptions.) -template -Result HandleSehExceptionsInMethodIfSupported( - T* object, Result (T::*method)(), const char* location) { -#if GTEST_HAS_SEH - __try { - return (object->*method)(); - } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT - GetExceptionCode())) { - // We create the exception message on the heap because VC++ prohibits - // creation of objects with destructors on stack in functions using __try - // (see error C2712). - std::string* exception_message = FormatSehExceptionMessage( - GetExceptionCode(), location); - internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, - *exception_message); - delete exception_message; - return static_cast(0); - } -#else - (void)location; - return (object->*method)(); -#endif // GTEST_HAS_SEH -} - -// Runs the given method and catches and reports C++ and/or SEH-style -// exceptions, if they are supported; returns the 0-value for type -// Result in case of an SEH exception. -template -Result HandleExceptionsInMethodIfSupported( - T* object, Result (T::*method)(), const char* location) { - // NOTE: The user code can affect the way in which Google Test handles - // exceptions by setting GTEST_FLAG(catch_exceptions), but only before - // RUN_ALL_TESTS() starts. It is technically possible to check the flag - // after the exception is caught and either report or re-throw the - // exception based on the flag's value: - // - // try { - // // Perform the test method. - // } catch (...) { - // if (GTEST_FLAG(catch_exceptions)) - // // Report the exception as failure. - // else - // throw; // Re-throws the original exception. - // } - // - // However, the purpose of this flag is to allow the program to drop into - // the debugger when the exception is thrown. On most platforms, once the - // control enters the catch block, the exception origin information is - // lost and the debugger will stop the program at the point of the - // re-throw in this function -- instead of at the point of the original - // throw statement in the code under test. For this reason, we perform - // the check early, sacrificing the ability to affect Google Test's - // exception handling in the method where the exception is thrown. - if (internal::GetUnitTestImpl()->catch_exceptions()) { -#if GTEST_HAS_EXCEPTIONS - try { - return HandleSehExceptionsInMethodIfSupported(object, method, location); - } catch (const AssertionException&) { // NOLINT - // This failure was reported already. - } catch (const internal::GoogleTestFailureException&) { // NOLINT - // This exception type can only be thrown by a failed Google - // Test assertion with the intention of letting another testing - // framework catch it. Therefore we just re-throw it. - throw; - } catch (const std::exception& e) { // NOLINT - internal::ReportFailureInUnknownLocation( - TestPartResult::kFatalFailure, - FormatCxxExceptionMessage(e.what(), location)); - } catch (...) { // NOLINT - internal::ReportFailureInUnknownLocation( - TestPartResult::kFatalFailure, - FormatCxxExceptionMessage(nullptr, location)); - } - return static_cast(0); -#else - return HandleSehExceptionsInMethodIfSupported(object, method, location); -#endif // GTEST_HAS_EXCEPTIONS - } else { - return (object->*method)(); - } -} - -} // namespace internal - -// Runs the test and updates the test result. -void Test::Run() { - if (!HasSameFixtureClass()) return; - - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); - // We will run the test only if SetUp() was successful and didn't call - // GTEST_SKIP(). - if (!HasFatalFailure() && !IsSkipped()) { - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported( - this, &Test::TestBody, "the test body"); - } - - // However, we want to clean up as much as possible. Hence we will - // always call TearDown(), even if SetUp() or the test body has - // failed. - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported( - this, &Test::TearDown, "TearDown()"); -} - -// Returns true if and only if the current test has a fatal failure. -bool Test::HasFatalFailure() { - return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); -} - -// Returns true if and only if the current test has a non-fatal failure. -bool Test::HasNonfatalFailure() { - return internal::GetUnitTestImpl()->current_test_result()-> - HasNonfatalFailure(); -} - -// Returns true if and only if the current test was skipped. -bool Test::IsSkipped() { - return internal::GetUnitTestImpl()->current_test_result()->Skipped(); -} - -// class TestInfo - -// Constructs a TestInfo object. It assumes ownership of the test factory -// object. -TestInfo::TestInfo(const std::string& a_test_suite_name, - const std::string& a_name, const char* a_type_param, - const char* a_value_param, - internal::CodeLocation a_code_location, - internal::TypeId fixture_class_id, - internal::TestFactoryBase* factory) - : test_suite_name_(a_test_suite_name), - name_(a_name), - type_param_(a_type_param ? new std::string(a_type_param) : nullptr), - value_param_(a_value_param ? new std::string(a_value_param) : nullptr), - location_(a_code_location), - fixture_class_id_(fixture_class_id), - should_run_(false), - is_disabled_(false), - matches_filter_(false), - factory_(factory), - result_() {} - -// Destructs a TestInfo object. -TestInfo::~TestInfo() { delete factory_; } - -namespace internal { - -// Creates a new TestInfo object and registers it with Google Test; -// returns the created object. -// -// Arguments: -// -// test_suite_name: name of the test suite -// name: name of the test -// type_param: the name of the test's type parameter, or NULL if -// this is not a typed or a type-parameterized test. -// value_param: text representation of the test's value parameter, -// or NULL if this is not a value-parameterized test. -// code_location: code location where the test is defined -// fixture_class_id: ID of the test fixture class -// set_up_tc: pointer to the function that sets up the test suite -// tear_down_tc: pointer to the function that tears down the test suite -// factory: pointer to the factory that creates a test object. -// The newly created TestInfo instance will assume -// ownership of the factory object. -TestInfo* MakeAndRegisterTestInfo( - const char* test_suite_name, const char* name, const char* type_param, - const char* value_param, CodeLocation code_location, - TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, - TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) { - TestInfo* const test_info = - new TestInfo(test_suite_name, name, type_param, value_param, - code_location, fixture_class_id, factory); - GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); - return test_info; -} - -void ReportInvalidTestSuiteType(const char* test_suite_name, - CodeLocation code_location) { - Message errors; - errors - << "Attempted redefinition of test suite " << test_suite_name << ".\n" - << "All tests in the same test suite must use the same test fixture\n" - << "class. However, in test suite " << test_suite_name << ", you tried\n" - << "to define a test using a fixture class different from the one\n" - << "used earlier. This can happen if the two fixture classes are\n" - << "from different namespaces and have the same name. You should\n" - << "probably rename one of the classes to put the tests into different\n" - << "test suites."; - - GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(), - code_location.line) - << " " << errors.GetString(); -} -} // namespace internal - -namespace { - -// A predicate that checks the test name of a TestInfo against a known -// value. -// -// This is used for implementation of the TestSuite class only. We put -// it in the anonymous namespace to prevent polluting the outer -// namespace. -// -// TestNameIs is copyable. -class TestNameIs { - public: - // Constructor. - // - // TestNameIs has NO default constructor. - explicit TestNameIs(const char* name) - : name_(name) {} - - // Returns true if and only if the test name of test_info matches name_. - bool operator()(const TestInfo * test_info) const { - return test_info && test_info->name() == name_; - } - - private: - std::string name_; -}; - -} // namespace - -namespace internal { - -// This method expands all parameterized tests registered with macros TEST_P -// and INSTANTIATE_TEST_SUITE_P into regular tests and registers those. -// This will be done just once during the program runtime. -void UnitTestImpl::RegisterParameterizedTests() { - if (!parameterized_tests_registered_) { - parameterized_test_registry_.RegisterTests(); - parameterized_tests_registered_ = true; - } -} - -} // namespace internal - -// Creates the test object, runs it, records its result, and then -// deletes it. -void TestInfo::Run() { - if (!should_run_) return; - - // Tells UnitTest where to store test result. - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_info(this); - - TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); - - // Notifies the unit test event listeners that a test is about to start. - repeater->OnTestStart(*this); - - const TimeInMillis start = internal::GetTimeInMillis(); - - impl->os_stack_trace_getter()->UponLeavingGTest(); - - // Creates the test object. - Test* const test = internal::HandleExceptionsInMethodIfSupported( - factory_, &internal::TestFactoryBase::CreateTest, - "the test fixture's constructor"); - - // Runs the test if the constructor didn't generate a fatal failure or invoke - // GTEST_SKIP(). - // Note that the object will not be null - if (!Test::HasFatalFailure() && !Test::IsSkipped()) { - // This doesn't throw as all user code that can throw are wrapped into - // exception handling code. - test->Run(); - } - - if (test != nullptr) { - // Deletes the test object. - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported( - test, &Test::DeleteSelf_, "the test fixture's destructor"); - } - - result_.set_start_timestamp(start); - result_.set_elapsed_time(internal::GetTimeInMillis() - start); - - // Notifies the unit test event listener that a test has just finished. - repeater->OnTestEnd(*this); - - // Tells UnitTest to stop associating assertion results to this - // test. - impl->set_current_test_info(nullptr); -} - -// class TestSuite - -// Gets the number of successful tests in this test suite. -int TestSuite::successful_test_count() const { - return CountIf(test_info_list_, TestPassed); -} - -// Gets the number of successful tests in this test suite. -int TestSuite::skipped_test_count() const { - return CountIf(test_info_list_, TestSkipped); -} - -// Gets the number of failed tests in this test suite. -int TestSuite::failed_test_count() const { - return CountIf(test_info_list_, TestFailed); -} - -// Gets the number of disabled tests that will be reported in the XML report. -int TestSuite::reportable_disabled_test_count() const { - return CountIf(test_info_list_, TestReportableDisabled); -} - -// Gets the number of disabled tests in this test suite. -int TestSuite::disabled_test_count() const { - return CountIf(test_info_list_, TestDisabled); -} - -// Gets the number of tests to be printed in the XML report. -int TestSuite::reportable_test_count() const { - return CountIf(test_info_list_, TestReportable); -} - -// Get the number of tests in this test suite that should run. -int TestSuite::test_to_run_count() const { - return CountIf(test_info_list_, ShouldRunTest); -} - -// Gets the number of all tests. -int TestSuite::total_test_count() const { - return static_cast(test_info_list_.size()); -} - -// Creates a TestSuite with the given name. -// -// Arguments: -// -// name: name of the test suite -// a_type_param: the name of the test suite's type parameter, or NULL if -// this is not a typed or a type-parameterized test suite. -// set_up_tc: pointer to the function that sets up the test suite -// tear_down_tc: pointer to the function that tears down the test suite -TestSuite::TestSuite(const char* a_name, const char* a_type_param, - internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc) - : name_(a_name), - type_param_(a_type_param ? new std::string(a_type_param) : nullptr), - set_up_tc_(set_up_tc), - tear_down_tc_(tear_down_tc), - should_run_(false), - start_timestamp_(0), - elapsed_time_(0) {} - -// Destructor of TestSuite. -TestSuite::~TestSuite() { - // Deletes every Test in the collection. - ForEach(test_info_list_, internal::Delete); -} - -// Returns the i-th test among all the tests. i can range from 0 to -// total_test_count() - 1. If i is not in that range, returns NULL. -const TestInfo* TestSuite::GetTestInfo(int i) const { - const int index = GetElementOr(test_indices_, i, -1); - return index < 0 ? nullptr : test_info_list_[static_cast(index)]; -} - -// Returns the i-th test among all the tests. i can range from 0 to -// total_test_count() - 1. If i is not in that range, returns NULL. -TestInfo* TestSuite::GetMutableTestInfo(int i) { - const int index = GetElementOr(test_indices_, i, -1); - return index < 0 ? nullptr : test_info_list_[static_cast(index)]; -} - -// Adds a test to this test suite. Will delete the test upon -// destruction of the TestSuite object. -void TestSuite::AddTestInfo(TestInfo* test_info) { - test_info_list_.push_back(test_info); - test_indices_.push_back(static_cast(test_indices_.size())); -} - -// Runs every test in this TestSuite. -void TestSuite::Run() { - if (!should_run_) return; - - internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); - impl->set_current_test_suite(this); - - TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); - - // Call both legacy and the new API - repeater->OnTestSuiteStart(*this); -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI - repeater->OnTestCaseStart(*this); -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI - - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported( - this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()"); - - start_timestamp_ = internal::GetTimeInMillis(); - for (int i = 0; i < total_test_count(); i++) { - GetMutableTestInfo(i)->Run(); - } - elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_; - - impl->os_stack_trace_getter()->UponLeavingGTest(); - internal::HandleExceptionsInMethodIfSupported( - this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()"); - - // Call both legacy and the new API - repeater->OnTestSuiteEnd(*this); -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI - repeater->OnTestCaseEnd(*this); -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI - - impl->set_current_test_suite(nullptr); -} - -// Clears the results of all tests in this test suite. -void TestSuite::ClearResult() { - ad_hoc_test_result_.Clear(); - ForEach(test_info_list_, TestInfo::ClearTestResult); -} - -// Shuffles the tests in this test suite. -void TestSuite::ShuffleTests(internal::Random* random) { - Shuffle(random, &test_indices_); -} - -// Restores the test order to before the first shuffle. -void TestSuite::UnshuffleTests() { - for (size_t i = 0; i < test_indices_.size(); i++) { - test_indices_[i] = static_cast(i); - } -} - -// Formats a countable noun. Depending on its quantity, either the -// singular form or the plural form is used. e.g. -// -// FormatCountableNoun(1, "formula", "formuli") returns "1 formula". -// FormatCountableNoun(5, "book", "books") returns "5 books". -static std::string FormatCountableNoun(int count, - const char * singular_form, - const char * plural_form) { - return internal::StreamableToString(count) + " " + - (count == 1 ? singular_form : plural_form); -} - -// Formats the count of tests. -static std::string FormatTestCount(int test_count) { - return FormatCountableNoun(test_count, "test", "tests"); -} - -// Formats the count of test suites. -static std::string FormatTestSuiteCount(int test_suite_count) { - return FormatCountableNoun(test_suite_count, "test suite", "test suites"); -} - -// Converts a TestPartResult::Type enum to human-friendly string -// representation. Both kNonFatalFailure and kFatalFailure are translated -// to "Failure", as the user usually doesn't care about the difference -// between the two when viewing the test result. -static const char * TestPartResultTypeToString(TestPartResult::Type type) { - switch (type) { - case TestPartResult::kSkip: - return "Skipped"; - case TestPartResult::kSuccess: - return "Success"; - - case TestPartResult::kNonFatalFailure: - case TestPartResult::kFatalFailure: -#ifdef _MSC_VER - return "error: "; -#else - return "Failure\n"; -#endif - default: - return "Unknown result type"; - } -} - -namespace internal { - -// Prints a TestPartResult to an std::string. -static std::string PrintTestPartResultToString( - const TestPartResult& test_part_result) { - return (Message() - << internal::FormatFileLocation(test_part_result.file_name(), - test_part_result.line_number()) - << " " << TestPartResultTypeToString(test_part_result.type()) - << test_part_result.message()).GetString(); -} - -// Prints a TestPartResult. -static void PrintTestPartResult(const TestPartResult& test_part_result) { - const std::string& result = - PrintTestPartResultToString(test_part_result); - printf("%s\n", result.c_str()); - fflush(stdout); - // If the test program runs in Visual Studio or a debugger, the - // following statements add the test part result message to the Output - // window such that the user can double-click on it to jump to the - // corresponding source code location; otherwise they do nothing. -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE - // We don't call OutputDebugString*() on Windows Mobile, as printing - // to stdout is done by OutputDebugString() there already - we don't - // want the same message printed twice. - ::OutputDebugStringA(result.c_str()); - ::OutputDebugStringA("\n"); -#endif -} - -// class PrettyUnitTestResultPrinter -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ - !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW - -// Returns the character attribute for the given color. -static WORD GetColorAttribute(GTestColor color) { - switch (color) { - case COLOR_RED: return FOREGROUND_RED; - case COLOR_GREEN: return FOREGROUND_GREEN; - case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; - default: return 0; - } -} - -static int GetBitOffset(WORD color_mask) { - if (color_mask == 0) return 0; - - int bitOffset = 0; - while ((color_mask & 1) == 0) { - color_mask >>= 1; - ++bitOffset; - } - return bitOffset; -} - -static WORD GetNewColor(GTestColor color, WORD old_color_attrs) { - // Let's reuse the BG - static const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN | - BACKGROUND_RED | BACKGROUND_INTENSITY; - static const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN | - FOREGROUND_RED | FOREGROUND_INTENSITY; - const WORD existing_bg = old_color_attrs & background_mask; - - WORD new_color = - GetColorAttribute(color) | existing_bg | FOREGROUND_INTENSITY; - static const int bg_bitOffset = GetBitOffset(background_mask); - static const int fg_bitOffset = GetBitOffset(foreground_mask); - - if (((new_color & background_mask) >> bg_bitOffset) == - ((new_color & foreground_mask) >> fg_bitOffset)) { - new_color ^= FOREGROUND_INTENSITY; // invert intensity - } - return new_color; -} - -#else - -// Returns the ANSI color code for the given color. COLOR_DEFAULT is -// an invalid input. -static const char* GetAnsiColorCode(GTestColor color) { - switch (color) { - case COLOR_RED: return "1"; - case COLOR_GREEN: return "2"; - case COLOR_YELLOW: return "3"; - default: - return nullptr; - } -} - -#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE - -// Returns true if and only if Google Test should use colors in the output. -bool ShouldUseColor(bool stdout_is_tty) { - const char* const gtest_color = GTEST_FLAG(color).c_str(); - - if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW - // On Windows the TERM variable is usually not set, but the - // console there does support colors. - return stdout_is_tty; -#else - // On non-Windows platforms, we rely on the TERM variable. - const char* const term = posix::GetEnv("TERM"); - const bool term_supports_color = - String::CStringEquals(term, "xterm") || - String::CStringEquals(term, "xterm-color") || - String::CStringEquals(term, "xterm-256color") || - String::CStringEquals(term, "screen") || - String::CStringEquals(term, "screen-256color") || - String::CStringEquals(term, "tmux") || - String::CStringEquals(term, "tmux-256color") || - String::CStringEquals(term, "rxvt-unicode") || - String::CStringEquals(term, "rxvt-unicode-256color") || - String::CStringEquals(term, "linux") || - String::CStringEquals(term, "cygwin"); - return stdout_is_tty && term_supports_color; -#endif // GTEST_OS_WINDOWS - } - - return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || - String::CaseInsensitiveCStringEquals(gtest_color, "true") || - String::CaseInsensitiveCStringEquals(gtest_color, "t") || - String::CStringEquals(gtest_color, "1"); - // We take "yes", "true", "t", and "1" as meaning "yes". If the - // value is neither one of these nor "auto", we treat it as "no" to - // be conservative. -} - -// Helpers for printing colored strings to stdout. Note that on Windows, we -// cannot simply emit special characters and have the terminal change colors. -// This routine must actually emit the characters rather than return a string -// that would be colored when printed, as can be done on Linux. -void ColoredPrintf(GTestColor color, const char* fmt, ...) { - va_list args; - va_start(args, fmt); - -#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \ - GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM) - const bool use_color = AlwaysFalse(); -#else - static const bool in_color_mode = - ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); - const bool use_color = in_color_mode && (color != COLOR_DEFAULT); -#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS - - if (!use_color) { - vprintf(fmt, args); - va_end(args); - return; - } - -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ - !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW - const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); - - // Gets the current text color. - CONSOLE_SCREEN_BUFFER_INFO buffer_info; - GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); - const WORD old_color_attrs = buffer_info.wAttributes; - const WORD new_color = GetNewColor(color, old_color_attrs); - - // We need to flush the stream buffers into the console before each - // SetConsoleTextAttribute call lest it affect the text that is already - // printed but has not yet reached the console. - fflush(stdout); - SetConsoleTextAttribute(stdout_handle, new_color); - - vprintf(fmt, args); - - fflush(stdout); - // Restores the text color. - SetConsoleTextAttribute(stdout_handle, old_color_attrs); -#else - printf("\033[0;3%sm", GetAnsiColorCode(color)); - vprintf(fmt, args); - printf("\033[m"); // Resets the terminal to default. -#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE - va_end(args); -} - -// Text printed in Google Test's text output and --gtest_list_tests -// output to label the type parameter and value parameter for a test. -static const char kTypeParamLabel[] = "TypeParam"; -static const char kValueParamLabel[] = "GetParam()"; - -static void PrintFullTestCommentIfPresent(const TestInfo& test_info) { - const char* const type_param = test_info.type_param(); - const char* const value_param = test_info.value_param(); - - if (type_param != nullptr || value_param != nullptr) { - printf(", where "); - if (type_param != nullptr) { - printf("%s = %s", kTypeParamLabel, type_param); - if (value_param != nullptr) printf(" and "); - } - if (value_param != nullptr) { - printf("%s = %s", kValueParamLabel, value_param); - } - } -} - -// This class implements the TestEventListener interface. -// -// Class PrettyUnitTestResultPrinter is copyable. -class PrettyUnitTestResultPrinter : public TestEventListener { - public: - PrettyUnitTestResultPrinter() {} - static void PrintTestName(const char* test_suite, const char* test) { - printf("%s.%s", test_suite, test); - } - - // The following methods override what's in the TestEventListener class. - void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} - void OnTestIterationStart(const UnitTest& unit_test, int iteration) override; - void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override; - void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseStart(const TestCase& test_case) override; -#else - void OnTestSuiteStart(const TestSuite& test_suite) override; -#endif // OnTestCaseStart - - void OnTestStart(const TestInfo& test_info) override; - - void OnTestPartResult(const TestPartResult& result) override; - void OnTestEnd(const TestInfo& test_info) override; -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseEnd(const TestCase& test_case) override; -#else - void OnTestSuiteEnd(const TestSuite& test_suite) override; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - - void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override; - void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} - void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; - void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} - - private: - static void PrintFailedTests(const UnitTest& unit_test); - static void PrintSkippedTests(const UnitTest& unit_test); -}; - - // Fired before each iteration of tests starts. -void PrettyUnitTestResultPrinter::OnTestIterationStart( - const UnitTest& unit_test, int iteration) { - if (GTEST_FLAG(repeat) != 1) - printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); - - const char* const filter = GTEST_FLAG(filter).c_str(); - - // Prints the filter if it's not *. This reminds the user that some - // tests may be skipped. - if (!String::CStringEquals(filter, kUniversalFilter)) { - ColoredPrintf(COLOR_YELLOW, - "Note: %s filter = %s\n", GTEST_NAME_, filter); - } - - if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { - const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); - ColoredPrintf(COLOR_YELLOW, - "Note: This is test shard %d of %s.\n", - static_cast(shard_index) + 1, - internal::posix::GetEnv(kTestTotalShards)); - } - - if (GTEST_FLAG(shuffle)) { - ColoredPrintf(COLOR_YELLOW, - "Note: Randomizing tests' orders with a seed of %d .\n", - unit_test.random_seed()); - } - - ColoredPrintf(COLOR_GREEN, "[==========] "); - printf("Running %s from %s.\n", - FormatTestCount(unit_test.test_to_run_count()).c_str(), - FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); - fflush(stdout); -} - -void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( - const UnitTest& /*unit_test*/) { - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("Global test environment set-up.\n"); - fflush(stdout); -} - -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { - const std::string counts = - FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("%s from %s", counts.c_str(), test_case.name()); - if (test_case.type_param() == nullptr) { - printf("\n"); - } else { - printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param()); - } - fflush(stdout); -} -#else -void PrettyUnitTestResultPrinter::OnTestSuiteStart( - const TestSuite& test_suite) { - const std::string counts = - FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("%s from %s", counts.c_str(), test_suite.name()); - if (test_suite.type_param() == nullptr) { - printf("\n"); - } else { - printf(", where %s = %s\n", kTypeParamLabel, test_suite.type_param()); - } - fflush(stdout); -} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { - ColoredPrintf(COLOR_GREEN, "[ RUN ] "); - PrintTestName(test_info.test_suite_name(), test_info.name()); - printf("\n"); - fflush(stdout); -} - -// Called after an assertion failure. -void PrettyUnitTestResultPrinter::OnTestPartResult( - const TestPartResult& result) { - switch (result.type()) { - // If the test part succeeded, we don't need to do anything. - case TestPartResult::kSuccess: - return; - default: - // Print failure message from the assertion - // (e.g. expected this and got that). - PrintTestPartResult(result); - fflush(stdout); - } -} - -void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { - if (test_info.result()->Passed()) { - ColoredPrintf(COLOR_GREEN, "[ OK ] "); - } else if (test_info.result()->Skipped()) { - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); - } else { - ColoredPrintf(COLOR_RED, "[ FAILED ] "); - } - PrintTestName(test_info.test_suite_name(), test_info.name()); - if (test_info.result()->Failed()) - PrintFullTestCommentIfPresent(test_info); - - if (GTEST_FLAG(print_time)) { - printf(" (%s ms)\n", internal::StreamableToString( - test_info.result()->elapsed_time()).c_str()); - } else { - printf("\n"); - } - fflush(stdout); -} - -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { - if (!GTEST_FLAG(print_time)) return; - - const std::string counts = - FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case.name(), - internal::StreamableToString(test_case.elapsed_time()).c_str()); - fflush(stdout); -} -#else -void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) { - if (!GTEST_FLAG(print_time)) return; - - const std::string counts = - FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_suite.name(), - internal::StreamableToString(test_suite.elapsed_time()).c_str()); - fflush(stdout); -} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( - const UnitTest& /*unit_test*/) { - ColoredPrintf(COLOR_GREEN, "[----------] "); - printf("Global test environment tear-down\n"); - fflush(stdout); -} - -// Internal helper for printing the list of failed tests. -void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { - const int failed_test_count = unit_test.failed_test_count(); - if (failed_test_count == 0) { - return; - } - - for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { - const TestSuite& test_suite = *unit_test.GetTestSuite(i); - if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) { - continue; - } - for (int j = 0; j < test_suite.total_test_count(); ++j) { - const TestInfo& test_info = *test_suite.GetTestInfo(j); - if (!test_info.should_run() || !test_info.result()->Failed()) { - continue; - } - ColoredPrintf(COLOR_RED, "[ FAILED ] "); - printf("%s.%s", test_suite.name(), test_info.name()); - PrintFullTestCommentIfPresent(test_info); - printf("\n"); - } - } -} - -// Internal helper for printing the list of skipped tests. -void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) { - const int skipped_test_count = unit_test.skipped_test_count(); - if (skipped_test_count == 0) { - return; - } - - for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { - const TestSuite& test_suite = *unit_test.GetTestSuite(i); - if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) { - continue; - } - for (int j = 0; j < test_suite.total_test_count(); ++j) { - const TestInfo& test_info = *test_suite.GetTestInfo(j); - if (!test_info.should_run() || !test_info.result()->Skipped()) { - continue; - } - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); - printf("%s.%s", test_suite.name(), test_info.name()); - printf("\n"); - } - } -} - -void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, - int /*iteration*/) { - ColoredPrintf(COLOR_GREEN, "[==========] "); - printf("%s from %s ran.", - FormatTestCount(unit_test.test_to_run_count()).c_str(), - FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); - if (GTEST_FLAG(print_time)) { - printf(" (%s ms total)", - internal::StreamableToString(unit_test.elapsed_time()).c_str()); - } - printf("\n"); - ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); - printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); - - const int skipped_test_count = unit_test.skipped_test_count(); - if (skipped_test_count > 0) { - ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); - printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str()); - PrintSkippedTests(unit_test); - } - - int num_failures = unit_test.failed_test_count(); - if (!unit_test.Passed()) { - const int failed_test_count = unit_test.failed_test_count(); - ColoredPrintf(COLOR_RED, "[ FAILED ] "); - printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); - PrintFailedTests(unit_test); - printf("\n%2d FAILED %s\n", num_failures, - num_failures == 1 ? "TEST" : "TESTS"); - } - - int num_disabled = unit_test.reportable_disabled_test_count(); - if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { - if (!num_failures) { - printf("\n"); // Add a spacer if no FAILURE banner is displayed. - } - ColoredPrintf(COLOR_YELLOW, - " YOU HAVE %d DISABLED %s\n\n", - num_disabled, - num_disabled == 1 ? "TEST" : "TESTS"); - } - // Ensure that Google Test output is printed before, e.g., heapchecker output. - fflush(stdout); -} - -// End PrettyUnitTestResultPrinter - -// class TestEventRepeater -// -// This class forwards events to other event listeners. -class TestEventRepeater : public TestEventListener { - public: - TestEventRepeater() : forwarding_enabled_(true) {} - ~TestEventRepeater() override; - void Append(TestEventListener *listener); - TestEventListener* Release(TestEventListener* listener); - - // Controls whether events will be forwarded to listeners_. Set to false - // in death test child processes. - bool forwarding_enabled() const { return forwarding_enabled_; } - void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } - - void OnTestProgramStart(const UnitTest& unit_test) override; - void OnTestIterationStart(const UnitTest& unit_test, int iteration) override; - void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override; - void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override; -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseStart(const TestSuite& parameter) override; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestSuiteStart(const TestSuite& parameter) override; - void OnTestStart(const TestInfo& test_info) override; - void OnTestPartResult(const TestPartResult& result) override; - void OnTestEnd(const TestInfo& test_info) override; -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestCaseEnd(const TestCase& parameter) override; -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - void OnTestSuiteEnd(const TestSuite& parameter) override; - void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override; - void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override; - void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; - void OnTestProgramEnd(const UnitTest& unit_test) override; - - private: - // Controls whether events will be forwarded to listeners_. Set to false - // in death test child processes. - bool forwarding_enabled_; - // The list of listeners that receive events. - std::vector listeners_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); -}; - -TestEventRepeater::~TestEventRepeater() { - ForEach(listeners_, Delete); -} - -void TestEventRepeater::Append(TestEventListener *listener) { - listeners_.push_back(listener); -} - -TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { - for (size_t i = 0; i < listeners_.size(); ++i) { - if (listeners_[i] == listener) { - listeners_.erase(listeners_.begin() + static_cast(i)); - return listener; - } - } - - return nullptr; -} - -// Since most methods are very similar, use macros to reduce boilerplate. -// This defines a member that forwards the call to all listeners. -#define GTEST_REPEATER_METHOD_(Name, Type) \ -void TestEventRepeater::Name(const Type& parameter) { \ - if (forwarding_enabled_) { \ - for (size_t i = 0; i < listeners_.size(); i++) { \ - listeners_[i]->Name(parameter); \ - } \ - } \ -} -// This defines a member that forwards the call to all listeners in reverse -// order. -#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ - void TestEventRepeater::Name(const Type& parameter) { \ - if (forwarding_enabled_) { \ - for (size_t i = listeners_.size(); i != 0; i--) { \ - listeners_[i - 1]->Name(parameter); \ - } \ - } \ - } - -GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) -GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite) -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite) -GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) -GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) -GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) -GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) -GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) -GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite) -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -GTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite) -GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) - -#undef GTEST_REPEATER_METHOD_ -#undef GTEST_REVERSE_REPEATER_METHOD_ - -void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, - int iteration) { - if (forwarding_enabled_) { - for (size_t i = 0; i < listeners_.size(); i++) { - listeners_[i]->OnTestIterationStart(unit_test, iteration); - } - } -} - -void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, - int iteration) { - if (forwarding_enabled_) { - for (size_t i = listeners_.size(); i > 0; i--) { - listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration); - } - } -} - -// End TestEventRepeater - -// This class generates an XML output file. -class XmlUnitTestResultPrinter : public EmptyTestEventListener { - public: - explicit XmlUnitTestResultPrinter(const char* output_file); - - void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; - void ListTestsMatchingFilter(const std::vector& test_suites); - - // Prints an XML summary of all unit tests. - static void PrintXmlTestsList(std::ostream* stream, - const std::vector& test_suites); - - private: - // Is c a whitespace character that is normalized to a space character - // when it appears in an XML attribute value? - static bool IsNormalizableWhitespace(char c) { - return c == 0x9 || c == 0xA || c == 0xD; - } - - // May c appear in a well-formed XML document? - static bool IsValidXmlCharacter(char c) { - return IsNormalizableWhitespace(c) || c >= 0x20; - } - - // Returns an XML-escaped copy of the input string str. If - // is_attribute is true, the text is meant to appear as an attribute - // value, and normalizable whitespace is preserved by replacing it - // with character references. - static std::string EscapeXml(const std::string& str, bool is_attribute); - - // Returns the given string with all characters invalid in XML removed. - static std::string RemoveInvalidXmlCharacters(const std::string& str); - - // Convenience wrapper around EscapeXml when str is an attribute value. - static std::string EscapeXmlAttribute(const std::string& str) { - return EscapeXml(str, true); - } - - // Convenience wrapper around EscapeXml when str is not an attribute value. - static std::string EscapeXmlText(const char* str) { - return EscapeXml(str, false); - } - - // Verifies that the given attribute belongs to the given element and - // streams the attribute as XML. - static void OutputXmlAttribute(std::ostream* stream, - const std::string& element_name, - const std::string& name, - const std::string& value); - - // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. - static void OutputXmlCDataSection(::std::ostream* stream, const char* data); - - // Streams an XML representation of a TestInfo object. - static void OutputXmlTestInfo(::std::ostream* stream, - const char* test_suite_name, - const TestInfo& test_info); - - // Prints an XML representation of a TestSuite object - static void PrintXmlTestSuite(::std::ostream* stream, - const TestSuite& test_suite); - - // Prints an XML summary of unit_test to output stream out. - static void PrintXmlUnitTest(::std::ostream* stream, - const UnitTest& unit_test); - - // Produces a string representing the test properties in a result as space - // delimited XML attributes based on the property key="value" pairs. - // When the std::string is not empty, it includes a space at the beginning, - // to delimit this attribute from prior attributes. - static std::string TestPropertiesAsXmlAttributes(const TestResult& result); - - // Streams an XML representation of the test properties of a TestResult - // object. - static void OutputXmlTestProperties(std::ostream* stream, - const TestResult& result); - - // The output file. - const std::string output_file_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); -}; - -// Creates a new XmlUnitTestResultPrinter. -XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) - : output_file_(output_file) { - if (output_file_.empty()) { - GTEST_LOG_(FATAL) << "XML output file may not be null"; - } -} - -// Called after the unit test ends. -void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, - int /*iteration*/) { - FILE* xmlout = OpenFileForWriting(output_file_); - std::stringstream stream; - PrintXmlUnitTest(&stream, unit_test); - fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); - fclose(xmlout); -} - -void XmlUnitTestResultPrinter::ListTestsMatchingFilter( - const std::vector& test_suites) { - FILE* xmlout = OpenFileForWriting(output_file_); - std::stringstream stream; - PrintXmlTestsList(&stream, test_suites); - fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); - fclose(xmlout); -} - -// Returns an XML-escaped copy of the input string str. If is_attribute -// is true, the text is meant to appear as an attribute value, and -// normalizable whitespace is preserved by replacing it with character -// references. -// -// Invalid XML characters in str, if any, are stripped from the output. -// It is expected that most, if not all, of the text processed by this -// module will consist of ordinary English text. -// If this module is ever modified to produce version 1.1 XML output, -// most invalid characters can be retained using character references. -std::string XmlUnitTestResultPrinter::EscapeXml( - const std::string& str, bool is_attribute) { - Message m; - - for (size_t i = 0; i < str.size(); ++i) { - const char ch = str[i]; - switch (ch) { - case '<': - m << "<"; - break; - case '>': - m << ">"; - break; - case '&': - m << "&"; - break; - case '\'': - if (is_attribute) - m << "'"; - else - m << '\''; - break; - case '"': - if (is_attribute) - m << """; - else - m << '"'; - break; - default: - if (IsValidXmlCharacter(ch)) { - if (is_attribute && IsNormalizableWhitespace(ch)) - m << "&#x" << String::FormatByte(static_cast(ch)) - << ";"; - else - m << ch; - } - break; - } - } - - return m.GetString(); -} - -// Returns the given string with all characters invalid in XML removed. -// Currently invalid characters are dropped from the string. An -// alternative is to replace them with certain characters such as . or ?. -std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters( - const std::string& str) { - std::string output; - output.reserve(str.size()); - for (std::string::const_iterator it = str.begin(); it != str.end(); ++it) - if (IsValidXmlCharacter(*it)) - output.push_back(*it); - - return output; -} - -// The following routines generate an XML representation of a UnitTest -// object. -// GOOGLETEST_CM0009 DO NOT DELETE -// -// This is how Google Test concepts map to the DTD: -// -// <-- corresponds to a UnitTest object -// <-- corresponds to a TestSuite object -// <-- corresponds to a TestInfo object -// ... -// ... -// ... -// <-- individual assertion failures -// -// -// - -// Formats the given time in milliseconds as seconds. -std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { - ::std::stringstream ss; - ss << (static_cast(ms) * 1e-3); - return ss.str(); -} - -static bool PortableLocaltime(time_t seconds, struct tm* out) { -#if defined(_MSC_VER) - return localtime_s(out, &seconds) == 0; -#elif defined(__MINGW32__) || defined(__MINGW64__) - // MINGW provides neither localtime_r nor localtime_s, but uses - // Windows' localtime(), which has a thread-local tm buffer. - struct tm* tm_ptr = localtime(&seconds); // NOLINT - if (tm_ptr == nullptr) return false; - *out = *tm_ptr; - return true; -#else - return localtime_r(&seconds, out) != nullptr; -#endif -} - -// Converts the given epoch time in milliseconds to a date string in the ISO -// 8601 format, without the timezone information. -std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { - struct tm time_struct; - if (!PortableLocaltime(static_cast(ms / 1000), &time_struct)) - return ""; - // YYYY-MM-DDThh:mm:ss - return StreamableToString(time_struct.tm_year + 1900) + "-" + - String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + - String::FormatIntWidth2(time_struct.tm_mday) + "T" + - String::FormatIntWidth2(time_struct.tm_hour) + ":" + - String::FormatIntWidth2(time_struct.tm_min) + ":" + - String::FormatIntWidth2(time_struct.tm_sec); -} - -// Streams an XML CDATA section, escaping invalid CDATA sequences as needed. -void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, - const char* data) { - const char* segment = data; - *stream << ""); - if (next_segment != nullptr) { - stream->write( - segment, static_cast(next_segment - segment)); - *stream << "]]>]]>"); - } else { - *stream << segment; - break; - } - } - *stream << "]]>"; -} - -void XmlUnitTestResultPrinter::OutputXmlAttribute( - std::ostream* stream, - const std::string& element_name, - const std::string& name, - const std::string& value) { - const std::vector& allowed_names = - GetReservedOutputAttributesForElement(element_name); - - GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != - allowed_names.end()) - << "Attribute " << name << " is not allowed for element <" << element_name - << ">."; - - *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\""; -} - -// Prints an XML representation of a TestInfo object. -void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, - const char* test_suite_name, - const TestInfo& test_info) { - const TestResult& result = *test_info.result(); - const std::string kTestsuite = "testcase"; - - if (test_info.is_in_another_shard()) { - return; - } - - *stream << " \n"; - return; - } - - OutputXmlAttribute(stream, kTestsuite, "status", - test_info.should_run() ? "run" : "notrun"); - OutputXmlAttribute(stream, kTestsuite, "result", - test_info.should_run() - ? (result.Skipped() ? "skipped" : "completed") - : "suppressed"); - OutputXmlAttribute(stream, kTestsuite, "time", - FormatTimeInMillisAsSeconds(result.elapsed_time())); - OutputXmlAttribute( - stream, kTestsuite, "timestamp", - FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); - OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name); - - int failures = 0; - for (int i = 0; i < result.total_part_count(); ++i) { - const TestPartResult& part = result.GetTestPartResult(i); - if (part.failed()) { - if (++failures == 1) { - *stream << ">\n"; - } - const std::string location = - internal::FormatCompilerIndependentFileLocation(part.file_name(), - part.line_number()); - const std::string summary = location + "\n" + part.summary(); - *stream << " "; - const std::string detail = location + "\n" + part.message(); - OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); - *stream << "\n"; - } - } - - if (failures == 0 && result.test_property_count() == 0) { - *stream << " />\n"; - } else { - if (failures == 0) { - *stream << ">\n"; - } - OutputXmlTestProperties(stream, result); - *stream << " \n"; - } -} - -// Prints an XML representation of a TestSuite object -void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream, - const TestSuite& test_suite) { - const std::string kTestsuite = "testsuite"; - *stream << " <" << kTestsuite; - OutputXmlAttribute(stream, kTestsuite, "name", test_suite.name()); - OutputXmlAttribute(stream, kTestsuite, "tests", - StreamableToString(test_suite.reportable_test_count())); - if (!GTEST_FLAG(list_tests)) { - OutputXmlAttribute(stream, kTestsuite, "failures", - StreamableToString(test_suite.failed_test_count())); - OutputXmlAttribute( - stream, kTestsuite, "disabled", - StreamableToString(test_suite.reportable_disabled_test_count())); - OutputXmlAttribute(stream, kTestsuite, "errors", "0"); - OutputXmlAttribute(stream, kTestsuite, "time", - FormatTimeInMillisAsSeconds(test_suite.elapsed_time())); - OutputXmlAttribute( - stream, kTestsuite, "timestamp", - FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp())); - *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result()); - } - *stream << ">\n"; - for (int i = 0; i < test_suite.total_test_count(); ++i) { - if (test_suite.GetTestInfo(i)->is_reportable()) - OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); - } - *stream << " \n"; -} - -// Prints an XML summary of unit_test to output stream out. -void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, - const UnitTest& unit_test) { - const std::string kTestsuites = "testsuites"; - - *stream << "\n"; - *stream << "<" << kTestsuites; - - OutputXmlAttribute(stream, kTestsuites, "tests", - StreamableToString(unit_test.reportable_test_count())); - OutputXmlAttribute(stream, kTestsuites, "failures", - StreamableToString(unit_test.failed_test_count())); - OutputXmlAttribute( - stream, kTestsuites, "disabled", - StreamableToString(unit_test.reportable_disabled_test_count())); - OutputXmlAttribute(stream, kTestsuites, "errors", "0"); - OutputXmlAttribute(stream, kTestsuites, "time", - FormatTimeInMillisAsSeconds(unit_test.elapsed_time())); - OutputXmlAttribute( - stream, kTestsuites, "timestamp", - FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp())); - - if (GTEST_FLAG(shuffle)) { - OutputXmlAttribute(stream, kTestsuites, "random_seed", - StreamableToString(unit_test.random_seed())); - } - *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result()); - - OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); - *stream << ">\n"; - - for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { - if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) - PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i)); - } - *stream << "\n"; -} - -void XmlUnitTestResultPrinter::PrintXmlTestsList( - std::ostream* stream, const std::vector& test_suites) { - const std::string kTestsuites = "testsuites"; - - *stream << "\n"; - *stream << "<" << kTestsuites; - - int total_tests = 0; - for (auto test_suite : test_suites) { - total_tests += test_suite->total_test_count(); - } - OutputXmlAttribute(stream, kTestsuites, "tests", - StreamableToString(total_tests)); - OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); - *stream << ">\n"; - - for (auto test_suite : test_suites) { - PrintXmlTestSuite(stream, *test_suite); - } - *stream << "\n"; -} - -// Produces a string representing the test properties in a result as space -// delimited XML attributes based on the property key="value" pairs. -std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( - const TestResult& result) { - Message attributes; - for (int i = 0; i < result.test_property_count(); ++i) { - const TestProperty& property = result.GetTestProperty(i); - attributes << " " << property.key() << "=" - << "\"" << EscapeXmlAttribute(property.value()) << "\""; - } - return attributes.GetString(); -} - -void XmlUnitTestResultPrinter::OutputXmlTestProperties( - std::ostream* stream, const TestResult& result) { - const std::string kProperties = "properties"; - const std::string kProperty = "property"; - - if (result.test_property_count() <= 0) { - return; - } - - *stream << "<" << kProperties << ">\n"; - for (int i = 0; i < result.test_property_count(); ++i) { - const TestProperty& property = result.GetTestProperty(i); - *stream << "<" << kProperty; - *stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\""; - *stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\""; - *stream << "/>\n"; - } - *stream << "\n"; -} - -// End XmlUnitTestResultPrinter - -// This class generates an JSON output file. -class JsonUnitTestResultPrinter : public EmptyTestEventListener { - public: - explicit JsonUnitTestResultPrinter(const char* output_file); - - void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; - - // Prints an JSON summary of all unit tests. - static void PrintJsonTestList(::std::ostream* stream, - const std::vector& test_suites); - - private: - // Returns an JSON-escaped copy of the input string str. - static std::string EscapeJson(const std::string& str); - - //// Verifies that the given attribute belongs to the given element and - //// streams the attribute as JSON. - static void OutputJsonKey(std::ostream* stream, - const std::string& element_name, - const std::string& name, - const std::string& value, - const std::string& indent, - bool comma = true); - static void OutputJsonKey(std::ostream* stream, - const std::string& element_name, - const std::string& name, - int value, - const std::string& indent, - bool comma = true); - - // Streams a JSON representation of a TestInfo object. - static void OutputJsonTestInfo(::std::ostream* stream, - const char* test_suite_name, - const TestInfo& test_info); - - // Prints a JSON representation of a TestSuite object - static void PrintJsonTestSuite(::std::ostream* stream, - const TestSuite& test_suite); - - // Prints a JSON summary of unit_test to output stream out. - static void PrintJsonUnitTest(::std::ostream* stream, - const UnitTest& unit_test); - - // Produces a string representing the test properties in a result as - // a JSON dictionary. - static std::string TestPropertiesAsJson(const TestResult& result, - const std::string& indent); - - // The output file. - const std::string output_file_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(JsonUnitTestResultPrinter); -}; - -// Creates a new JsonUnitTestResultPrinter. -JsonUnitTestResultPrinter::JsonUnitTestResultPrinter(const char* output_file) - : output_file_(output_file) { - if (output_file_.empty()) { - GTEST_LOG_(FATAL) << "JSON output file may not be null"; - } -} - -void JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, - int /*iteration*/) { - FILE* jsonout = OpenFileForWriting(output_file_); - std::stringstream stream; - PrintJsonUnitTest(&stream, unit_test); - fprintf(jsonout, "%s", StringStreamToString(&stream).c_str()); - fclose(jsonout); -} - -// Returns an JSON-escaped copy of the input string str. -std::string JsonUnitTestResultPrinter::EscapeJson(const std::string& str) { - Message m; - - for (size_t i = 0; i < str.size(); ++i) { - const char ch = str[i]; - switch (ch) { - case '\\': - case '"': - case '/': - m << '\\' << ch; - break; - case '\b': - m << "\\b"; - break; - case '\t': - m << "\\t"; - break; - case '\n': - m << "\\n"; - break; - case '\f': - m << "\\f"; - break; - case '\r': - m << "\\r"; - break; - default: - if (ch < ' ') { - m << "\\u00" << String::FormatByte(static_cast(ch)); - } else { - m << ch; - } - break; - } - } - - return m.GetString(); -} - -// The following routines generate an JSON representation of a UnitTest -// object. - -// Formats the given time in milliseconds as seconds. -static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) { - ::std::stringstream ss; - ss << (static_cast(ms) * 1e-3) << "s"; - return ss.str(); -} - -// Converts the given epoch time in milliseconds to a date string in the -// RFC3339 format, without the timezone information. -static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) { - struct tm time_struct; - if (!PortableLocaltime(static_cast(ms / 1000), &time_struct)) - return ""; - // YYYY-MM-DDThh:mm:ss - return StreamableToString(time_struct.tm_year + 1900) + "-" + - String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + - String::FormatIntWidth2(time_struct.tm_mday) + "T" + - String::FormatIntWidth2(time_struct.tm_hour) + ":" + - String::FormatIntWidth2(time_struct.tm_min) + ":" + - String::FormatIntWidth2(time_struct.tm_sec) + "Z"; -} - -static inline std::string Indent(size_t width) { - return std::string(width, ' '); -} - -void JsonUnitTestResultPrinter::OutputJsonKey( - std::ostream* stream, - const std::string& element_name, - const std::string& name, - const std::string& value, - const std::string& indent, - bool comma) { - const std::vector& allowed_names = - GetReservedOutputAttributesForElement(element_name); - - GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != - allowed_names.end()) - << "Key \"" << name << "\" is not allowed for value \"" << element_name - << "\"."; - - *stream << indent << "\"" << name << "\": \"" << EscapeJson(value) << "\""; - if (comma) - *stream << ",\n"; -} - -void JsonUnitTestResultPrinter::OutputJsonKey( - std::ostream* stream, - const std::string& element_name, - const std::string& name, - int value, - const std::string& indent, - bool comma) { - const std::vector& allowed_names = - GetReservedOutputAttributesForElement(element_name); - - GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != - allowed_names.end()) - << "Key \"" << name << "\" is not allowed for value \"" << element_name - << "\"."; - - *stream << indent << "\"" << name << "\": " << StreamableToString(value); - if (comma) - *stream << ",\n"; -} - -// Prints a JSON representation of a TestInfo object. -void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream, - const char* test_suite_name, - const TestInfo& test_info) { - const TestResult& result = *test_info.result(); - const std::string kTestsuite = "testcase"; - const std::string kIndent = Indent(10); - - *stream << Indent(8) << "{\n"; - OutputJsonKey(stream, kTestsuite, "name", test_info.name(), kIndent); - - if (test_info.value_param() != nullptr) { - OutputJsonKey(stream, kTestsuite, "value_param", test_info.value_param(), - kIndent); - } - if (test_info.type_param() != nullptr) { - OutputJsonKey(stream, kTestsuite, "type_param", test_info.type_param(), - kIndent); - } - if (GTEST_FLAG(list_tests)) { - OutputJsonKey(stream, kTestsuite, "file", test_info.file(), kIndent); - OutputJsonKey(stream, kTestsuite, "line", test_info.line(), kIndent, false); - *stream << "\n" << Indent(8) << "}"; - return; - } - - OutputJsonKey(stream, kTestsuite, "status", - test_info.should_run() ? "RUN" : "NOTRUN", kIndent); - OutputJsonKey(stream, kTestsuite, "result", - test_info.should_run() - ? (result.Skipped() ? "SKIPPED" : "COMPLETED") - : "SUPPRESSED", - kIndent); - OutputJsonKey(stream, kTestsuite, "timestamp", - FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()), - kIndent); - OutputJsonKey(stream, kTestsuite, "time", - FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent); - OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent, - false); - *stream << TestPropertiesAsJson(result, kIndent); - - int failures = 0; - for (int i = 0; i < result.total_part_count(); ++i) { - const TestPartResult& part = result.GetTestPartResult(i); - if (part.failed()) { - *stream << ",\n"; - if (++failures == 1) { - *stream << kIndent << "\"" << "failures" << "\": [\n"; - } - const std::string location = - internal::FormatCompilerIndependentFileLocation(part.file_name(), - part.line_number()); - const std::string message = EscapeJson(location + "\n" + part.message()); - *stream << kIndent << " {\n" - << kIndent << " \"failure\": \"" << message << "\",\n" - << kIndent << " \"type\": \"\"\n" - << kIndent << " }"; - } - } - - if (failures > 0) - *stream << "\n" << kIndent << "]"; - *stream << "\n" << Indent(8) << "}"; -} - -// Prints an JSON representation of a TestSuite object -void JsonUnitTestResultPrinter::PrintJsonTestSuite( - std::ostream* stream, const TestSuite& test_suite) { - const std::string kTestsuite = "testsuite"; - const std::string kIndent = Indent(6); - - *stream << Indent(4) << "{\n"; - OutputJsonKey(stream, kTestsuite, "name", test_suite.name(), kIndent); - OutputJsonKey(stream, kTestsuite, "tests", test_suite.reportable_test_count(), - kIndent); - if (!GTEST_FLAG(list_tests)) { - OutputJsonKey(stream, kTestsuite, "failures", - test_suite.failed_test_count(), kIndent); - OutputJsonKey(stream, kTestsuite, "disabled", - test_suite.reportable_disabled_test_count(), kIndent); - OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent); - OutputJsonKey( - stream, kTestsuite, "timestamp", - FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()), - kIndent); - OutputJsonKey(stream, kTestsuite, "time", - FormatTimeInMillisAsDuration(test_suite.elapsed_time()), - kIndent, false); - *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent) - << ",\n"; - } - - *stream << kIndent << "\"" << kTestsuite << "\": [\n"; - - bool comma = false; - for (int i = 0; i < test_suite.total_test_count(); ++i) { - if (test_suite.GetTestInfo(i)->is_reportable()) { - if (comma) { - *stream << ",\n"; - } else { - comma = true; - } - OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); - } - } - *stream << "\n" << kIndent << "]\n" << Indent(4) << "}"; -} - -// Prints a JSON summary of unit_test to output stream out. -void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream, - const UnitTest& unit_test) { - const std::string kTestsuites = "testsuites"; - const std::string kIndent = Indent(2); - *stream << "{\n"; - - OutputJsonKey(stream, kTestsuites, "tests", unit_test.reportable_test_count(), - kIndent); - OutputJsonKey(stream, kTestsuites, "failures", unit_test.failed_test_count(), - kIndent); - OutputJsonKey(stream, kTestsuites, "disabled", - unit_test.reportable_disabled_test_count(), kIndent); - OutputJsonKey(stream, kTestsuites, "errors", 0, kIndent); - if (GTEST_FLAG(shuffle)) { - OutputJsonKey(stream, kTestsuites, "random_seed", unit_test.random_seed(), - kIndent); - } - OutputJsonKey(stream, kTestsuites, "timestamp", - FormatEpochTimeInMillisAsRFC3339(unit_test.start_timestamp()), - kIndent); - OutputJsonKey(stream, kTestsuites, "time", - FormatTimeInMillisAsDuration(unit_test.elapsed_time()), kIndent, - false); - - *stream << TestPropertiesAsJson(unit_test.ad_hoc_test_result(), kIndent) - << ",\n"; - - OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent); - *stream << kIndent << "\"" << kTestsuites << "\": [\n"; - - bool comma = false; - for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { - if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) { - if (comma) { - *stream << ",\n"; - } else { - comma = true; - } - PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i)); - } - } - - *stream << "\n" << kIndent << "]\n" << "}\n"; -} - -void JsonUnitTestResultPrinter::PrintJsonTestList( - std::ostream* stream, const std::vector& test_suites) { - const std::string kTestsuites = "testsuites"; - const std::string kIndent = Indent(2); - *stream << "{\n"; - int total_tests = 0; - for (auto test_suite : test_suites) { - total_tests += test_suite->total_test_count(); - } - OutputJsonKey(stream, kTestsuites, "tests", total_tests, kIndent); - - OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent); - *stream << kIndent << "\"" << kTestsuites << "\": [\n"; - - for (size_t i = 0; i < test_suites.size(); ++i) { - if (i != 0) { - *stream << ",\n"; - } - PrintJsonTestSuite(stream, *test_suites[i]); - } - - *stream << "\n" - << kIndent << "]\n" - << "}\n"; -} -// Produces a string representing the test properties in a result as -// a JSON dictionary. -std::string JsonUnitTestResultPrinter::TestPropertiesAsJson( - const TestResult& result, const std::string& indent) { - Message attributes; - for (int i = 0; i < result.test_property_count(); ++i) { - const TestProperty& property = result.GetTestProperty(i); - attributes << ",\n" << indent << "\"" << property.key() << "\": " - << "\"" << EscapeJson(property.value()) << "\""; - } - return attributes.GetString(); -} - -// End JsonUnitTestResultPrinter - -#if GTEST_CAN_STREAM_RESULTS_ - -// Checks if str contains '=', '&', '%' or '\n' characters. If yes, -// replaces them by "%xx" where xx is their hexadecimal value. For -// example, replaces "=" with "%3D". This algorithm is O(strlen(str)) -// in both time and space -- important as the input str may contain an -// arbitrarily long test failure message and stack trace. -std::string StreamingListener::UrlEncode(const char* str) { - std::string result; - result.reserve(strlen(str) + 1); - for (char ch = *str; ch != '\0'; ch = *++str) { - switch (ch) { - case '%': - case '=': - case '&': - case '\n': - result.append("%" + String::FormatByte(static_cast(ch))); - break; - default: - result.push_back(ch); - break; - } - } - return result; -} - -void StreamingListener::SocketWriter::MakeConnection() { - GTEST_CHECK_(sockfd_ == -1) - << "MakeConnection() can't be called when there is already a connection."; - - addrinfo hints; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. - hints.ai_socktype = SOCK_STREAM; - addrinfo* servinfo = nullptr; - - // Use the getaddrinfo() to get a linked list of IP addresses for - // the given host name. - const int error_num = getaddrinfo( - host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); - if (error_num != 0) { - GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " - << gai_strerror(error_num); - } - - // Loop through all the results and connect to the first we can. - for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr; - cur_addr = cur_addr->ai_next) { - sockfd_ = socket( - cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); - if (sockfd_ != -1) { - // Connect the client socket to the server socket. - if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { - close(sockfd_); - sockfd_ = -1; - } - } - } - - freeaddrinfo(servinfo); // all done with this structure - - if (sockfd_ == -1) { - GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " - << host_name_ << ":" << port_num_; - } -} - -// End of class Streaming Listener -#endif // GTEST_CAN_STREAM_RESULTS__ - -// class OsStackTraceGetter - -const char* const OsStackTraceGetterInterface::kElidedFramesMarker = - "... " GTEST_NAME_ " internal frames ..."; - -std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count) - GTEST_LOCK_EXCLUDED_(mutex_) { -#if GTEST_HAS_ABSL - std::string result; - - if (max_depth <= 0) { - return result; - } - - max_depth = std::min(max_depth, kMaxStackTraceDepth); - - std::vector raw_stack(max_depth); - // Skips the frames requested by the caller, plus this function. - const int raw_stack_size = - absl::GetStackTrace(&raw_stack[0], max_depth, skip_count + 1); - - void* caller_frame = nullptr; - { - MutexLock lock(&mutex_); - caller_frame = caller_frame_; - } - - for (int i = 0; i < raw_stack_size; ++i) { - if (raw_stack[i] == caller_frame && - !GTEST_FLAG(show_internal_stack_frames)) { - // Add a marker to the trace and stop adding frames. - absl::StrAppend(&result, kElidedFramesMarker, "\n"); - break; - } - - char tmp[1024]; - const char* symbol = "(unknown)"; - if (absl::Symbolize(raw_stack[i], tmp, sizeof(tmp))) { - symbol = tmp; - } - - char line[1024]; - snprintf(line, sizeof(line), " %p: %s\n", raw_stack[i], symbol); - result += line; - } - - return result; - -#else // !GTEST_HAS_ABSL - static_cast(max_depth); - static_cast(skip_count); - return ""; -#endif // GTEST_HAS_ABSL -} - -void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) { -#if GTEST_HAS_ABSL - void* caller_frame = nullptr; - if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) { - caller_frame = nullptr; - } - - MutexLock lock(&mutex_); - caller_frame_ = caller_frame; -#endif // GTEST_HAS_ABSL -} - -// A helper class that creates the premature-exit file in its -// constructor and deletes the file in its destructor. -class ScopedPrematureExitFile { - public: - explicit ScopedPrematureExitFile(const char* premature_exit_filepath) - : premature_exit_filepath_(premature_exit_filepath ? - premature_exit_filepath : "") { - // If a path to the premature-exit file is specified... - if (!premature_exit_filepath_.empty()) { - // create the file with a single "0" character in it. I/O - // errors are ignored as there's nothing better we can do and we - // don't want to fail the test because of this. - FILE* pfile = posix::FOpen(premature_exit_filepath, "w"); - fwrite("0", 1, 1, pfile); - fclose(pfile); - } - } - - ~ScopedPrematureExitFile() { -#if !defined GTEST_OS_ESP8266 - if (!premature_exit_filepath_.empty()) { - int retval = remove(premature_exit_filepath_.c_str()); - if (retval) { - GTEST_LOG_(ERROR) << "Failed to remove premature exit filepath \"" - << premature_exit_filepath_ << "\" with error " - << retval; - } - } -#endif - } - - private: - const std::string premature_exit_filepath_; - - GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile); -}; - -} // namespace internal - -// class TestEventListeners - -TestEventListeners::TestEventListeners() - : repeater_(new internal::TestEventRepeater()), - default_result_printer_(nullptr), - default_xml_generator_(nullptr) {} - -TestEventListeners::~TestEventListeners() { delete repeater_; } - -// Returns the standard listener responsible for the default console -// output. Can be removed from the listeners list to shut down default -// console output. Note that removing this object from the listener list -// with Release transfers its ownership to the user. -void TestEventListeners::Append(TestEventListener* listener) { - repeater_->Append(listener); -} - -// Removes the given event listener from the list and returns it. It then -// becomes the caller's responsibility to delete the listener. Returns -// NULL if the listener is not found in the list. -TestEventListener* TestEventListeners::Release(TestEventListener* listener) { - if (listener == default_result_printer_) - default_result_printer_ = nullptr; - else if (listener == default_xml_generator_) - default_xml_generator_ = nullptr; - return repeater_->Release(listener); -} - -// Returns repeater that broadcasts the TestEventListener events to all -// subscribers. -TestEventListener* TestEventListeners::repeater() { return repeater_; } - -// Sets the default_result_printer attribute to the provided listener. -// The listener is also added to the listener list and previous -// default_result_printer is removed from it and deleted. The listener can -// also be NULL in which case it will not be added to the list. Does -// nothing if the previous and the current listener objects are the same. -void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { - if (default_result_printer_ != listener) { - // It is an error to pass this method a listener that is already in the - // list. - delete Release(default_result_printer_); - default_result_printer_ = listener; - if (listener != nullptr) Append(listener); - } -} - -// Sets the default_xml_generator attribute to the provided listener. The -// listener is also added to the listener list and previous -// default_xml_generator is removed from it and deleted. The listener can -// also be NULL in which case it will not be added to the list. Does -// nothing if the previous and the current listener objects are the same. -void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { - if (default_xml_generator_ != listener) { - // It is an error to pass this method a listener that is already in the - // list. - delete Release(default_xml_generator_); - default_xml_generator_ = listener; - if (listener != nullptr) Append(listener); - } -} - -// Controls whether events will be forwarded by the repeater to the -// listeners in the list. -bool TestEventListeners::EventForwardingEnabled() const { - return repeater_->forwarding_enabled(); -} - -void TestEventListeners::SuppressEventForwarding() { - repeater_->set_forwarding_enabled(false); -} - -// class UnitTest - -// Gets the singleton UnitTest object. The first time this method is -// called, a UnitTest object is constructed and returned. Consecutive -// calls will return the same object. -// -// We don't protect this under mutex_ as a user is not supposed to -// call this before main() starts, from which point on the return -// value will never change. -UnitTest* UnitTest::GetInstance() { - // CodeGear C++Builder insists on a public destructor for the - // default implementation. Use this implementation to keep good OO - // design with private destructor. - -#if defined(__BORLANDC__) - static UnitTest* const instance = new UnitTest; - return instance; -#else - static UnitTest instance; - return &instance; -#endif // defined(__BORLANDC__) -} - -// Gets the number of successful test suites. -int UnitTest::successful_test_suite_count() const { - return impl()->successful_test_suite_count(); -} - -// Gets the number of failed test suites. -int UnitTest::failed_test_suite_count() const { - return impl()->failed_test_suite_count(); -} - -// Gets the number of all test suites. -int UnitTest::total_test_suite_count() const { - return impl()->total_test_suite_count(); -} - -// Gets the number of all test suites that contain at least one test -// that should run. -int UnitTest::test_suite_to_run_count() const { - return impl()->test_suite_to_run_count(); -} - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -int UnitTest::successful_test_case_count() const { - return impl()->successful_test_suite_count(); -} -int UnitTest::failed_test_case_count() const { - return impl()->failed_test_suite_count(); -} -int UnitTest::total_test_case_count() const { - return impl()->total_test_suite_count(); -} -int UnitTest::test_case_to_run_count() const { - return impl()->test_suite_to_run_count(); -} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -// Gets the number of successful tests. -int UnitTest::successful_test_count() const { - return impl()->successful_test_count(); -} - -// Gets the number of skipped tests. -int UnitTest::skipped_test_count() const { - return impl()->skipped_test_count(); -} - -// Gets the number of failed tests. -int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } - -// Gets the number of disabled tests that will be reported in the XML report. -int UnitTest::reportable_disabled_test_count() const { - return impl()->reportable_disabled_test_count(); -} - -// Gets the number of disabled tests. -int UnitTest::disabled_test_count() const { - return impl()->disabled_test_count(); -} - -// Gets the number of tests to be printed in the XML report. -int UnitTest::reportable_test_count() const { - return impl()->reportable_test_count(); -} - -// Gets the number of all tests. -int UnitTest::total_test_count() const { return impl()->total_test_count(); } - -// Gets the number of tests that should run. -int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } - -// Gets the time of the test program start, in ms from the start of the -// UNIX epoch. -internal::TimeInMillis UnitTest::start_timestamp() const { - return impl()->start_timestamp(); -} - -// Gets the elapsed time, in milliseconds. -internal::TimeInMillis UnitTest::elapsed_time() const { - return impl()->elapsed_time(); -} - -// Returns true if and only if the unit test passed (i.e. all test suites -// passed). -bool UnitTest::Passed() const { return impl()->Passed(); } - -// Returns true if and only if the unit test failed (i.e. some test suite -// failed or something outside of all tests failed). -bool UnitTest::Failed() const { return impl()->Failed(); } - -// Gets the i-th test suite among all the test suites. i can range from 0 to -// total_test_suite_count() - 1. If i is not in that range, returns NULL. -const TestSuite* UnitTest::GetTestSuite(int i) const { - return impl()->GetTestSuite(i); -} - -// Legacy API is deprecated but still available -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -const TestCase* UnitTest::GetTestCase(int i) const { - return impl()->GetTestCase(i); -} -#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ - -// Returns the TestResult containing information on test failures and -// properties logged outside of individual test suites. -const TestResult& UnitTest::ad_hoc_test_result() const { - return *impl()->ad_hoc_test_result(); -} - -// Gets the i-th test suite among all the test suites. i can range from 0 to -// total_test_suite_count() - 1. If i is not in that range, returns NULL. -TestSuite* UnitTest::GetMutableTestSuite(int i) { - return impl()->GetMutableSuiteCase(i); -} - -// Returns the list of event listeners that can be used to track events -// inside Google Test. -TestEventListeners& UnitTest::listeners() { - return *impl()->listeners(); -} - -// Registers and returns a global test environment. When a test -// program is run, all global test environments will be set-up in the -// order they were registered. After all tests in the program have -// finished, all global test environments will be torn-down in the -// *reverse* order they were registered. -// -// The UnitTest object takes ownership of the given environment. -// -// We don't protect this under mutex_, as we only support calling it -// from the main thread. -Environment* UnitTest::AddEnvironment(Environment* env) { - if (env == nullptr) { - return nullptr; - } - - impl_->environments().push_back(env); - return env; -} - -// Adds a TestPartResult to the current TestResult object. All Google Test -// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call -// this to report their results. The user code should use the -// assertion macros instead of calling this directly. -void UnitTest::AddTestPartResult( - TestPartResult::Type result_type, - const char* file_name, - int line_number, - const std::string& message, - const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) { - Message msg; - msg << message; - - internal::MutexLock lock(&mutex_); - if (impl_->gtest_trace_stack().size() > 0) { - msg << "\n" << GTEST_NAME_ << " trace:"; - - for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) { - const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; - msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) - << " " << trace.message; - } - } - - if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) { - msg << internal::kStackTraceMarker << os_stack_trace; - } - - const TestPartResult result = TestPartResult( - result_type, file_name, line_number, msg.GetString().c_str()); - impl_->GetTestPartResultReporterForCurrentThread()-> - ReportTestPartResult(result); - - if (result_type != TestPartResult::kSuccess && - result_type != TestPartResult::kSkip) { - // gtest_break_on_failure takes precedence over - // gtest_throw_on_failure. This allows a user to set the latter - // in the code (perhaps in order to use Google Test assertions - // with another testing framework) and specify the former on the - // command line for debugging. - if (GTEST_FLAG(break_on_failure)) { -#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT - // Using DebugBreak on Windows allows gtest to still break into a debugger - // when a failure happens and both the --gtest_break_on_failure and - // the --gtest_catch_exceptions flags are specified. - DebugBreak(); -#elif (!defined(__native_client__)) && \ - ((defined(__clang__) || defined(__GNUC__)) && \ - (defined(__x86_64__) || defined(__i386__))) - // with clang/gcc we can achieve the same effect on x86 by invoking int3 - asm("int3"); -#else - // Dereference nullptr through a volatile pointer to prevent the compiler - // from removing. We use this rather than abort() or __builtin_trap() for - // portability: some debuggers don't correctly trap abort(). - *static_cast(nullptr) = 1; -#endif // GTEST_OS_WINDOWS - } else if (GTEST_FLAG(throw_on_failure)) { -#if GTEST_HAS_EXCEPTIONS - throw internal::GoogleTestFailureException(result); -#else - // We cannot call abort() as it generates a pop-up in debug mode - // that cannot be suppressed in VC 7.1 or below. - exit(1); -#endif - } - } -} - -// Adds a TestProperty to the current TestResult object when invoked from -// inside a test, to current TestSuite's ad_hoc_test_result_ when invoked -// from SetUpTestSuite or TearDownTestSuite, or to the global property set -// when invoked elsewhere. If the result already contains a property with -// the same key, the value will be updated. -void UnitTest::RecordProperty(const std::string& key, - const std::string& value) { - impl_->RecordProperty(TestProperty(key, value)); -} - -// Runs all tests in this UnitTest object and prints the result. -// Returns 0 if successful, or 1 otherwise. -// -// We don't protect this under mutex_, as we only support calling it -// from the main thread. -int UnitTest::Run() { - const bool in_death_test_child_process = - internal::GTEST_FLAG(internal_run_death_test).length() > 0; - - // Google Test implements this protocol for catching that a test - // program exits before returning control to Google Test: - // - // 1. Upon start, Google Test creates a file whose absolute path - // is specified by the environment variable - // TEST_PREMATURE_EXIT_FILE. - // 2. When Google Test has finished its work, it deletes the file. - // - // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before - // running a Google-Test-based test program and check the existence - // of the file at the end of the test execution to see if it has - // exited prematurely. - - // If we are in the child process of a death test, don't - // create/delete the premature exit file, as doing so is unnecessary - // and will confuse the parent process. Otherwise, create/delete - // the file upon entering/leaving this function. If the program - // somehow exits before this function has a chance to return, the - // premature-exit file will be left undeleted, causing a test runner - // that understands the premature-exit-file protocol to report the - // test as having failed. - const internal::ScopedPrematureExitFile premature_exit_file( - in_death_test_child_process - ? nullptr - : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE")); - - // Captures the value of GTEST_FLAG(catch_exceptions). This value will be - // used for the duration of the program. - impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); - -#if GTEST_OS_WINDOWS - // Either the user wants Google Test to catch exceptions thrown by the - // tests or this is executing in the context of death test child - // process. In either case the user does not want to see pop-up dialogs - // about crashes - they are expected. - if (impl()->catch_exceptions() || in_death_test_child_process) { -# if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT - // SetErrorMode doesn't exist on CE. - SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | - SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); -# endif // !GTEST_OS_WINDOWS_MOBILE - -# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE - // Death test children can be terminated with _abort(). On Windows, - // _abort() can show a dialog with a warning message. This forces the - // abort message to go to stderr instead. - _set_error_mode(_OUT_TO_STDERR); -# endif - -# if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE - // In the debug version, Visual Studio pops up a separate dialog - // offering a choice to debug the aborted program. We need to suppress - // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement - // executed. Google Test will notify the user of any unexpected - // failure via stderr. - if (!GTEST_FLAG(break_on_failure)) - _set_abort_behavior( - 0x0, // Clear the following flags: - _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. -# endif - - // In debug mode, the Windows CRT can crash with an assertion over invalid - // input (e.g. passing an invalid file descriptor). The default handling - // for these assertions is to pop up a dialog and wait for user input. - // Instead ask the CRT to dump such assertions to stderr non-interactively. - if (!IsDebuggerPresent()) { - (void)_CrtSetReportMode(_CRT_ASSERT, - _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); - } - } -#endif // GTEST_OS_WINDOWS - - return internal::HandleExceptionsInMethodIfSupported( - impl(), - &internal::UnitTestImpl::RunAllTests, - "auxiliary test code (environments or event listeners)") ? 0 : 1; -} - -// Returns the working directory when the first TEST() or TEST_F() was -// executed. -const char* UnitTest::original_working_dir() const { - return impl_->original_working_dir_.c_str(); -} - -// Returns the TestSuite object for the test that's currently running, -// or NULL if no test is running. -const TestSuite* UnitTest::current_test_suite() const - GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); - return impl_->current_test_suite(); -} - -// Legacy API is still available but deprecated -#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ -const TestCase* UnitTest::current_test_case() const - GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); - return impl_->current_test_suite(); -} -#endif - -// Returns the TestInfo object for the test that's currently running, -// or NULL if no test is running. -const TestInfo* UnitTest::current_test_info() const - GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); - return impl_->current_test_info(); -} - -// Returns the random seed used at the start of the current test run. -int UnitTest::random_seed() const { return impl_->random_seed(); } - -// Returns ParameterizedTestSuiteRegistry object used to keep track of -// value-parameterized tests and instantiate and register them. -internal::ParameterizedTestSuiteRegistry& -UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) { - return impl_->parameterized_test_registry(); -} - -// Creates an empty UnitTest. -UnitTest::UnitTest() { - impl_ = new internal::UnitTestImpl(this); -} - -// Destructor of UnitTest. -UnitTest::~UnitTest() { - delete impl_; -} - -// Pushes a trace defined by SCOPED_TRACE() on to the per-thread -// Google Test trace stack. -void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) - GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); - impl_->gtest_trace_stack().push_back(trace); -} - -// Pops a trace from the per-thread Google Test trace stack. -void UnitTest::PopGTestTrace() - GTEST_LOCK_EXCLUDED_(mutex_) { - internal::MutexLock lock(&mutex_); - impl_->gtest_trace_stack().pop_back(); -} - -namespace internal { - -UnitTestImpl::UnitTestImpl(UnitTest* parent) - : parent_(parent), - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */) - default_global_test_part_result_reporter_(this), - default_per_thread_test_part_result_reporter_(this), - GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_( - &default_global_test_part_result_reporter_), - per_thread_test_part_result_reporter_( - &default_per_thread_test_part_result_reporter_), - parameterized_test_registry_(), - parameterized_tests_registered_(false), - last_death_test_suite_(-1), - current_test_suite_(nullptr), - current_test_info_(nullptr), - ad_hoc_test_result_(), - os_stack_trace_getter_(nullptr), - post_flag_parse_init_performed_(false), - random_seed_(0), // Will be overridden by the flag before first use. - random_(0), // Will be reseeded before first use. - start_timestamp_(0), - elapsed_time_(0), -#if GTEST_HAS_DEATH_TEST - death_test_factory_(new DefaultDeathTestFactory), -#endif - // Will be overridden by the flag before first use. - catch_exceptions_(false) { - listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); -} - -UnitTestImpl::~UnitTestImpl() { - // Deletes every TestSuite. - ForEach(test_suites_, internal::Delete); - - // Deletes every Environment. - ForEach(environments_, internal::Delete); - - delete os_stack_trace_getter_; -} - -// Adds a TestProperty to the current TestResult object when invoked in a -// context of a test, to current test suite's ad_hoc_test_result when invoke -// from SetUpTestSuite/TearDownTestSuite, or to the global property set -// otherwise. If the result already contains a property with the same key, -// the value will be updated. -void UnitTestImpl::RecordProperty(const TestProperty& test_property) { - std::string xml_element; - TestResult* test_result; // TestResult appropriate for property recording. - - if (current_test_info_ != nullptr) { - xml_element = "testcase"; - test_result = &(current_test_info_->result_); - } else if (current_test_suite_ != nullptr) { - xml_element = "testsuite"; - test_result = &(current_test_suite_->ad_hoc_test_result_); - } else { - xml_element = "testsuites"; - test_result = &ad_hoc_test_result_; - } - test_result->RecordProperty(xml_element, test_property); -} - -#if GTEST_HAS_DEATH_TEST -// Disables event forwarding if the control is currently in a death test -// subprocess. Must not be called before InitGoogleTest. -void UnitTestImpl::SuppressTestEventsIfInSubprocess() { - if (internal_run_death_test_flag_.get() != nullptr) - listeners()->SuppressEventForwarding(); -} -#endif // GTEST_HAS_DEATH_TEST - -// Initializes event listeners performing XML output as specified by -// UnitTestOptions. Must not be called before InitGoogleTest. -void UnitTestImpl::ConfigureXmlOutput() { - const std::string& output_format = UnitTestOptions::GetOutputFormat(); - if (output_format == "xml") { - listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( - UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); - } else if (output_format == "json") { - listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter( - UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); - } else if (output_format != "") { - GTEST_LOG_(WARNING) << "WARNING: unrecognized output format \"" - << output_format << "\" ignored."; - } -} - -#if GTEST_CAN_STREAM_RESULTS_ -// Initializes event listeners for streaming test results in string form. -// Must not be called before InitGoogleTest. -void UnitTestImpl::ConfigureStreamingOutput() { - const std::string& target = GTEST_FLAG(stream_result_to); - if (!target.empty()) { - const size_t pos = target.find(':'); - if (pos != std::string::npos) { - listeners()->Append(new StreamingListener(target.substr(0, pos), - target.substr(pos+1))); - } else { - GTEST_LOG_(WARNING) << "unrecognized streaming target \"" << target - << "\" ignored."; - } - } -} -#endif // GTEST_CAN_STREAM_RESULTS_ - -// Performs initialization dependent upon flag values obtained in -// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to -// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest -// this function is also called from RunAllTests. Since this function can be -// called more than once, it has to be idempotent. -void UnitTestImpl::PostFlagParsingInit() { - // Ensures that this function does not execute more than once. - if (!post_flag_parse_init_performed_) { - post_flag_parse_init_performed_ = true; - -#if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_) - // Register to send notifications about key process state changes. - listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_()); -#endif // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_) - -#if GTEST_HAS_DEATH_TEST - InitDeathTestSubprocessControlInfo(); - SuppressTestEventsIfInSubprocess(); -#endif // GTEST_HAS_DEATH_TEST - - // Registers parameterized tests. This makes parameterized tests - // available to the UnitTest reflection API without running - // RUN_ALL_TESTS. - RegisterParameterizedTests(); - - // Configures listeners for XML output. This makes it possible for users - // to shut down the default XML output before invoking RUN_ALL_TESTS. - ConfigureXmlOutput(); - -#if GTEST_CAN_STREAM_RESULTS_ - // Configures listeners for streaming test results to the specified server. - ConfigureStreamingOutput(); -#endif // GTEST_CAN_STREAM_RESULTS_ - -#if GTEST_HAS_ABSL - if (GTEST_FLAG(install_failure_signal_handler)) { - absl::FailureSignalHandlerOptions options; - absl::InstallFailureSignalHandler(options); - } -#endif // GTEST_HAS_ABSL - } -} - -// A predicate that checks the name of a TestSuite against a known -// value. -// -// This is used for implementation of the UnitTest class only. We put -// it in the anonymous namespace to prevent polluting the outer -// namespace. -// -// TestSuiteNameIs is copyable. -class TestSuiteNameIs { - public: - // Constructor. - explicit TestSuiteNameIs(const std::string& name) : name_(name) {} - - // Returns true if and only if the name of test_suite matches name_. - bool operator()(const TestSuite* test_suite) const { - return test_suite != nullptr && - strcmp(test_suite->name(), name_.c_str()) == 0; - } - - private: - std::string name_; -}; - -// Finds and returns a TestSuite with the given name. If one doesn't -// exist, creates one and returns it. It's the CALLER'S -// RESPONSIBILITY to ensure that this function is only called WHEN THE -// TESTS ARE NOT SHUFFLED. -// -// Arguments: -// -// test_suite_name: name of the test suite -// type_param: the name of the test suite's type parameter, or NULL if -// this is not a typed or a type-parameterized test suite. -// set_up_tc: pointer to the function that sets up the test suite -// tear_down_tc: pointer to the function that tears down the test suite -TestSuite* UnitTestImpl::GetTestSuite( - const char* test_suite_name, const char* type_param, - internal::SetUpTestSuiteFunc set_up_tc, - internal::TearDownTestSuiteFunc tear_down_tc) { - // Can we find a TestSuite with the given name? - const auto test_suite = - std::find_if(test_suites_.rbegin(), test_suites_.rend(), - TestSuiteNameIs(test_suite_name)); - - if (test_suite != test_suites_.rend()) return *test_suite; - - // No. Let's create one. - auto* const new_test_suite = - new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc); - - // Is this a death test suite? - if (internal::UnitTestOptions::MatchesFilter(test_suite_name, - kDeathTestSuiteFilter)) { - // Yes. Inserts the test suite after the last death test suite - // defined so far. This only works when the test suites haven't - // been shuffled. Otherwise we may end up running a death test - // after a non-death test. - ++last_death_test_suite_; - test_suites_.insert(test_suites_.begin() + last_death_test_suite_, - new_test_suite); - } else { - // No. Appends to the end of the list. - test_suites_.push_back(new_test_suite); - } - - test_suite_indices_.push_back(static_cast(test_suite_indices_.size())); - return new_test_suite; -} - -// Helpers for setting up / tearing down the given environment. They -// are for use in the ForEach() function. -static void SetUpEnvironment(Environment* env) { env->SetUp(); } -static void TearDownEnvironment(Environment* env) { env->TearDown(); } - -// Runs all tests in this UnitTest object, prints the result, and -// returns true if all tests are successful. If any exception is -// thrown during a test, the test is considered to be failed, but the -// rest of the tests will still be run. -// -// When parameterized tests are enabled, it expands and registers -// parameterized tests first in RegisterParameterizedTests(). -// All other functions called from RunAllTests() may safely assume that -// parameterized tests are ready to be counted and run. -bool UnitTestImpl::RunAllTests() { - // True if and only if Google Test is initialized before RUN_ALL_TESTS() is - // called. - const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized(); - - // Do not run any test if the --help flag was specified. - if (g_help_flag) - return true; - - // Repeats the call to the post-flag parsing initialization in case the - // user didn't call InitGoogleTest. - PostFlagParsingInit(); - - // Even if sharding is not on, test runners may want to use the - // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding - // protocol. - internal::WriteToShardStatusFileIfNeeded(); - - // True if and only if we are in a subprocess for running a thread-safe-style - // death test. - bool in_subprocess_for_death_test = false; - -#if GTEST_HAS_DEATH_TEST - in_subprocess_for_death_test = - (internal_run_death_test_flag_.get() != nullptr); -# if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_) - if (in_subprocess_for_death_test) { - GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_(); - } -# endif // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_) -#endif // GTEST_HAS_DEATH_TEST - - const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, - in_subprocess_for_death_test); - - // Compares the full test names with the filter to decide which - // tests to run. - const bool has_tests_to_run = FilterTests(should_shard - ? HONOR_SHARDING_PROTOCOL - : IGNORE_SHARDING_PROTOCOL) > 0; - - // Lists the tests and exits if the --gtest_list_tests flag was specified. - if (GTEST_FLAG(list_tests)) { - // This must be called *after* FilterTests() has been called. - ListTestsMatchingFilter(); - return true; - } - - random_seed_ = GTEST_FLAG(shuffle) ? - GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; - - // True if and only if at least one test has failed. - bool failed = false; - - TestEventListener* repeater = listeners()->repeater(); - - start_timestamp_ = GetTimeInMillis(); - repeater->OnTestProgramStart(*parent_); - - // How many times to repeat the tests? We don't want to repeat them - // when we are inside the subprocess of a death test. - const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); - // Repeats forever if the repeat count is negative. - const bool gtest_repeat_forever = repeat < 0; - for (int i = 0; gtest_repeat_forever || i != repeat; i++) { - // We want to preserve failures generated by ad-hoc test - // assertions executed before RUN_ALL_TESTS(). - ClearNonAdHocTestResult(); - - const TimeInMillis start = GetTimeInMillis(); - - // Shuffles test suites and tests if requested. - if (has_tests_to_run && GTEST_FLAG(shuffle)) { - random()->Reseed(static_cast(random_seed_)); - // This should be done before calling OnTestIterationStart(), - // such that a test event listener can see the actual test order - // in the event. - ShuffleTests(); - } - - // Tells the unit test event listeners that the tests are about to start. - repeater->OnTestIterationStart(*parent_, i); - - // Runs each test suite if there is at least one test to run. - if (has_tests_to_run) { - // Sets up all environments beforehand. - repeater->OnEnvironmentsSetUpStart(*parent_); - ForEach(environments_, SetUpEnvironment); - repeater->OnEnvironmentsSetUpEnd(*parent_); - - // Runs the tests only if there was no fatal failure or skip triggered - // during global set-up. - if (Test::IsSkipped()) { - // Emit diagnostics when global set-up calls skip, as it will not be - // emitted by default. - TestResult& test_result = - *internal::GetUnitTestImpl()->current_test_result(); - for (int j = 0; j < test_result.total_part_count(); ++j) { - const TestPartResult& test_part_result = - test_result.GetTestPartResult(j); - if (test_part_result.type() == TestPartResult::kSkip) { - const std::string& result = test_part_result.message(); - printf("%s\n", result.c_str()); - } - } - fflush(stdout); - } else if (!Test::HasFatalFailure()) { - for (int test_index = 0; test_index < total_test_suite_count(); - test_index++) { - GetMutableSuiteCase(test_index)->Run(); - } - } - - // Tears down all environments in reverse order afterwards. - repeater->OnEnvironmentsTearDownStart(*parent_); - std::for_each(environments_.rbegin(), environments_.rend(), - TearDownEnvironment); - repeater->OnEnvironmentsTearDownEnd(*parent_); - } - - elapsed_time_ = GetTimeInMillis() - start; - - // Tells the unit test event listener that the tests have just finished. - repeater->OnTestIterationEnd(*parent_, i); - - // Gets the result and clears it. - if (!Passed()) { - failed = true; - } - - // Restores the original test order after the iteration. This - // allows the user to quickly repro a failure that happens in the - // N-th iteration without repeating the first (N - 1) iterations. - // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in - // case the user somehow changes the value of the flag somewhere - // (it's always safe to unshuffle the tests). - UnshuffleTests(); - - if (GTEST_FLAG(shuffle)) { - // Picks a new random seed for each iteration. - random_seed_ = GetNextRandomSeed(random_seed_); - } - } - - repeater->OnTestProgramEnd(*parent_); - - if (!gtest_is_initialized_before_run_all_tests) { - ColoredPrintf( - COLOR_RED, - "\nIMPORTANT NOTICE - DO NOT IGNORE:\n" - "This test program did NOT call " GTEST_INIT_GOOGLE_TEST_NAME_ - "() before calling RUN_ALL_TESTS(). This is INVALID. Soon " GTEST_NAME_ - " will start to enforce the valid usage. " - "Please fix it ASAP, or IT WILL START TO FAIL.\n"); // NOLINT -#if GTEST_FOR_GOOGLE_ - ColoredPrintf(COLOR_RED, - "For more details, see http://wiki/Main/ValidGUnitMain.\n"); -#endif // GTEST_FOR_GOOGLE_ - } - - return !failed; -} - -// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file -// if the variable is present. If a file already exists at this location, this -// function will write over it. If the variable is present, but the file cannot -// be created, prints an error and exits. -void WriteToShardStatusFileIfNeeded() { - const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); - if (test_shard_file != nullptr) { - FILE* const file = posix::FOpen(test_shard_file, "w"); - if (file == nullptr) { - ColoredPrintf(COLOR_RED, - "Could not write to the test shard status file \"%s\" " - "specified by the %s environment variable.\n", - test_shard_file, kTestShardStatusFile); - fflush(stdout); - exit(EXIT_FAILURE); - } - fclose(file); - } -} - -// Checks whether sharding is enabled by examining the relevant -// environment variable values. If the variables are present, -// but inconsistent (i.e., shard_index >= total_shards), prints -// an error and exits. If in_subprocess_for_death_test, sharding is -// disabled because it must only be applied to the original test -// process. Otherwise, we could filter out death tests we intended to execute. -bool ShouldShard(const char* total_shards_env, - const char* shard_index_env, - bool in_subprocess_for_death_test) { - if (in_subprocess_for_death_test) { - return false; - } - - const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); - const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); - - if (total_shards == -1 && shard_index == -1) { - return false; - } else if (total_shards == -1 && shard_index != -1) { - const Message msg = Message() - << "Invalid environment variables: you have " - << kTestShardIndex << " = " << shard_index - << ", but have left " << kTestTotalShards << " unset.\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); - fflush(stdout); - exit(EXIT_FAILURE); - } else if (total_shards != -1 && shard_index == -1) { - const Message msg = Message() - << "Invalid environment variables: you have " - << kTestTotalShards << " = " << total_shards - << ", but have left " << kTestShardIndex << " unset.\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); - fflush(stdout); - exit(EXIT_FAILURE); - } else if (shard_index < 0 || shard_index >= total_shards) { - const Message msg = Message() - << "Invalid environment variables: we require 0 <= " - << kTestShardIndex << " < " << kTestTotalShards - << ", but you have " << kTestShardIndex << "=" << shard_index - << ", " << kTestTotalShards << "=" << total_shards << ".\n"; - ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); - fflush(stdout); - exit(EXIT_FAILURE); - } - - return total_shards > 1; -} - -// Parses the environment variable var as an Int32. If it is unset, -// returns default_val. If it is not an Int32, prints an error -// and aborts. -Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) { - const char* str_val = posix::GetEnv(var); - if (str_val == nullptr) { - return default_val; - } - - Int32 result; - if (!ParseInt32(Message() << "The value of environment variable " << var, - str_val, &result)) { - exit(EXIT_FAILURE); - } - return result; -} - -// Given the total number of shards, the shard index, and the test id, -// returns true if and only if the test should be run on this shard. The test id -// is some arbitrary but unique non-negative integer assigned to each test -// method. Assumes that 0 <= shard_index < total_shards. -bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { - return (test_id % total_shards) == shard_index; -} - -// Compares the name of each test with the user-specified filter to -// decide whether the test should be run, then records the result in -// each TestSuite and TestInfo object. -// If shard_tests == true, further filters tests based on sharding -// variables in the environment - see -// https://github.com/google/googletest/blob/master/googletest/docs/advanced.md -// . Returns the number of tests that should run. -int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { - const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? - Int32FromEnvOrDie(kTestTotalShards, -1) : -1; - const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? - Int32FromEnvOrDie(kTestShardIndex, -1) : -1; - - // num_runnable_tests are the number of tests that will - // run across all shards (i.e., match filter and are not disabled). - // num_selected_tests are the number of tests to be run on - // this shard. - int num_runnable_tests = 0; - int num_selected_tests = 0; - for (auto* test_suite : test_suites_) { - const std::string& test_suite_name = test_suite->name(); - test_suite->set_should_run(false); - - for (size_t j = 0; j < test_suite->test_info_list().size(); j++) { - TestInfo* const test_info = test_suite->test_info_list()[j]; - const std::string test_name(test_info->name()); - // A test is disabled if test suite name or test name matches - // kDisableTestFilter. - const bool is_disabled = internal::UnitTestOptions::MatchesFilter( - test_suite_name, kDisableTestFilter) || - internal::UnitTestOptions::MatchesFilter( - test_name, kDisableTestFilter); - test_info->is_disabled_ = is_disabled; - - const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest( - test_suite_name, test_name); - test_info->matches_filter_ = matches_filter; - - const bool is_runnable = - (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && - matches_filter; - - const bool is_in_another_shard = - shard_tests != IGNORE_SHARDING_PROTOCOL && - !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests); - test_info->is_in_another_shard_ = is_in_another_shard; - const bool is_selected = is_runnable && !is_in_another_shard; - - num_runnable_tests += is_runnable; - num_selected_tests += is_selected; - - test_info->should_run_ = is_selected; - test_suite->set_should_run(test_suite->should_run() || is_selected); - } - } - return num_selected_tests; -} - -// Prints the given C-string on a single line by replacing all '\n' -// characters with string "\\n". If the output takes more than -// max_length characters, only prints the first max_length characters -// and "...". -static void PrintOnOneLine(const char* str, int max_length) { - if (str != nullptr) { - for (int i = 0; *str != '\0'; ++str) { - if (i >= max_length) { - printf("..."); - break; - } - if (*str == '\n') { - printf("\\n"); - i += 2; - } else { - printf("%c", *str); - ++i; - } - } - } -} - -// Prints the names of the tests matching the user-specified filter flag. -void UnitTestImpl::ListTestsMatchingFilter() { - // Print at most this many characters for each type/value parameter. - const int kMaxParamLength = 250; - - for (auto* test_suite : test_suites_) { - bool printed_test_suite_name = false; - - for (size_t j = 0; j < test_suite->test_info_list().size(); j++) { - const TestInfo* const test_info = test_suite->test_info_list()[j]; - if (test_info->matches_filter_) { - if (!printed_test_suite_name) { - printed_test_suite_name = true; - printf("%s.", test_suite->name()); - if (test_suite->type_param() != nullptr) { - printf(" # %s = ", kTypeParamLabel); - // We print the type parameter on a single line to make - // the output easy to parse by a program. - PrintOnOneLine(test_suite->type_param(), kMaxParamLength); - } - printf("\n"); - } - printf(" %s", test_info->name()); - if (test_info->value_param() != nullptr) { - printf(" # %s = ", kValueParamLabel); - // We print the value parameter on a single line to make the - // output easy to parse by a program. - PrintOnOneLine(test_info->value_param(), kMaxParamLength); - } - printf("\n"); - } - } - } - fflush(stdout); - const std::string& output_format = UnitTestOptions::GetOutputFormat(); - if (output_format == "xml" || output_format == "json") { - FILE* fileout = OpenFileForWriting( - UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); - std::stringstream stream; - if (output_format == "xml") { - XmlUnitTestResultPrinter( - UnitTestOptions::GetAbsolutePathToOutputFile().c_str()) - .PrintXmlTestsList(&stream, test_suites_); - } else if (output_format == "json") { - JsonUnitTestResultPrinter( - UnitTestOptions::GetAbsolutePathToOutputFile().c_str()) - .PrintJsonTestList(&stream, test_suites_); - } - fprintf(fileout, "%s", StringStreamToString(&stream).c_str()); - fclose(fileout); - } -} - -// Sets the OS stack trace getter. -// -// Does nothing if the input and the current OS stack trace getter are -// the same; otherwise, deletes the old getter and makes the input the -// current getter. -void UnitTestImpl::set_os_stack_trace_getter( - OsStackTraceGetterInterface* getter) { - if (os_stack_trace_getter_ != getter) { - delete os_stack_trace_getter_; - os_stack_trace_getter_ = getter; - } -} - -// Returns the current OS stack trace getter if it is not NULL; -// otherwise, creates an OsStackTraceGetter, makes it the current -// getter, and returns it. -OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { - if (os_stack_trace_getter_ == nullptr) { -#ifdef GTEST_OS_STACK_TRACE_GETTER_ - os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_; -#else - os_stack_trace_getter_ = new OsStackTraceGetter; -#endif // GTEST_OS_STACK_TRACE_GETTER_ - } - - return os_stack_trace_getter_; -} - -// Returns the most specific TestResult currently running. -TestResult* UnitTestImpl::current_test_result() { - if (current_test_info_ != nullptr) { - return ¤t_test_info_->result_; - } - if (current_test_suite_ != nullptr) { - return ¤t_test_suite_->ad_hoc_test_result_; - } - return &ad_hoc_test_result_; -} - -// Shuffles all test suites, and the tests within each test suite, -// making sure that death tests are still run first. -void UnitTestImpl::ShuffleTests() { - // Shuffles the death test suites. - ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_); - - // Shuffles the non-death test suites. - ShuffleRange(random(), last_death_test_suite_ + 1, - static_cast(test_suites_.size()), &test_suite_indices_); - - // Shuffles the tests inside each test suite. - for (auto& test_suite : test_suites_) { - test_suite->ShuffleTests(random()); - } -} - -// Restores the test suites and tests to their order before the first shuffle. -void UnitTestImpl::UnshuffleTests() { - for (size_t i = 0; i < test_suites_.size(); i++) { - // Unshuffles the tests in each test suite. - test_suites_[i]->UnshuffleTests(); - // Resets the index of each test suite. - test_suite_indices_[i] = static_cast(i); - } -} - -// Returns the current OS stack trace as an std::string. -// -// The maximum number of stack frames to be included is specified by -// the gtest_stack_trace_depth flag. The skip_count parameter -// specifies the number of top frames to be skipped, which doesn't -// count against the number of frames to be included. -// -// For example, if Foo() calls Bar(), which in turn calls -// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in -// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. -std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, - int skip_count) { - // We pass skip_count + 1 to skip this wrapper function in addition - // to what the user really wants to skip. - return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); -} - -// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to -// suppress unreachable code warnings. -namespace { -class ClassUniqueToAlwaysTrue {}; -} - -bool IsTrue(bool condition) { return condition; } - -bool AlwaysTrue() { -#if GTEST_HAS_EXCEPTIONS - // This condition is always false so AlwaysTrue() never actually throws, - // but it makes the compiler think that it may throw. - if (IsTrue(false)) - throw ClassUniqueToAlwaysTrue(); -#endif // GTEST_HAS_EXCEPTIONS - return true; -} - -// If *pstr starts with the given prefix, modifies *pstr to be right -// past the prefix and returns true; otherwise leaves *pstr unchanged -// and returns false. None of pstr, *pstr, and prefix can be NULL. -bool SkipPrefix(const char* prefix, const char** pstr) { - const size_t prefix_len = strlen(prefix); - if (strncmp(*pstr, prefix, prefix_len) == 0) { - *pstr += prefix_len; - return true; - } - return false; -} - -// Parses a string as a command line flag. The string should have -// the format "--flag=value". When def_optional is true, the "=value" -// part can be omitted. -// -// Returns the value of the flag, or NULL if the parsing failed. -static const char* ParseFlagValue(const char* str, const char* flag, - bool def_optional) { - // str and flag must not be NULL. - if (str == nullptr || flag == nullptr) return nullptr; - - // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. - const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag; - const size_t flag_len = flag_str.length(); - if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr; - - // Skips the flag name. - const char* flag_end = str + flag_len; - - // When def_optional is true, it's OK to not have a "=value" part. - if (def_optional && (flag_end[0] == '\0')) { - return flag_end; - } - - // If def_optional is true and there are more characters after the - // flag name, or if def_optional is false, there must be a '=' after - // the flag name. - if (flag_end[0] != '=') return nullptr; - - // Returns the string after "=". - return flag_end + 1; -} - -// Parses a string for a bool flag, in the form of either -// "--flag=value" or "--flag". -// -// In the former case, the value is taken as true as long as it does -// not start with '0', 'f', or 'F'. -// -// In the latter case, the value is taken as true. -// -// On success, stores the value of the flag in *value, and returns -// true. On failure, returns false without changing *value. -static bool ParseBoolFlag(const char* str, const char* flag, bool* value) { - // Gets the value of the flag as a string. - const char* const value_str = ParseFlagValue(str, flag, true); - - // Aborts if the parsing failed. - if (value_str == nullptr) return false; - - // Converts the string value to a bool. - *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); - return true; -} - -// Parses a string for an Int32 flag, in the form of -// "--flag=value". -// -// On success, stores the value of the flag in *value, and returns -// true. On failure, returns false without changing *value. -bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { - // Gets the value of the flag as a string. - const char* const value_str = ParseFlagValue(str, flag, false); - - // Aborts if the parsing failed. - if (value_str == nullptr) return false; - - // Sets *value to the value of the flag. - return ParseInt32(Message() << "The value of flag --" << flag, - value_str, value); -} - -// Parses a string for a string flag, in the form of -// "--flag=value". -// -// On success, stores the value of the flag in *value, and returns -// true. On failure, returns false without changing *value. -template -static bool ParseStringFlag(const char* str, const char* flag, String* value) { - // Gets the value of the flag as a string. - const char* const value_str = ParseFlagValue(str, flag, false); - - // Aborts if the parsing failed. - if (value_str == nullptr) return false; - - // Sets *value to the value of the flag. - *value = value_str; - return true; -} - -// Determines whether a string has a prefix that Google Test uses for its -// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. -// If Google Test detects that a command line flag has its prefix but is not -// recognized, it will print its help message. Flags starting with -// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test -// internal flags and do not trigger the help message. -static bool HasGoogleTestFlagPrefix(const char* str) { - return (SkipPrefix("--", &str) || - SkipPrefix("-", &str) || - SkipPrefix("/", &str)) && - !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && - (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || - SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); -} - -// Prints a string containing code-encoded text. The following escape -// sequences can be used in the string to control the text color: -// -// @@ prints a single '@' character. -// @R changes the color to red. -// @G changes the color to green. -// @Y changes the color to yellow. -// @D changes to the default terminal text color. -// -static void PrintColorEncoded(const char* str) { - GTestColor color = COLOR_DEFAULT; // The current color. - - // Conceptually, we split the string into segments divided by escape - // sequences. Then we print one segment at a time. At the end of - // each iteration, the str pointer advances to the beginning of the - // next segment. - for (;;) { - const char* p = strchr(str, '@'); - if (p == nullptr) { - ColoredPrintf(color, "%s", str); - return; - } - - ColoredPrintf(color, "%s", std::string(str, p).c_str()); - - const char ch = p[1]; - str = p + 2; - if (ch == '@') { - ColoredPrintf(color, "@"); - } else if (ch == 'D') { - color = COLOR_DEFAULT; - } else if (ch == 'R') { - color = COLOR_RED; - } else if (ch == 'G') { - color = COLOR_GREEN; - } else if (ch == 'Y') { - color = COLOR_YELLOW; - } else { - --str; - } - } -} - -static const char kColorEncodedHelpMessage[] = -"This program contains tests written using " GTEST_NAME_ ". You can use the\n" -"following command line flags to control its behavior:\n" -"\n" -"Test Selection:\n" -" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" -" List the names of all tests instead of running them. The name of\n" -" TEST(Foo, Bar) is \"Foo.Bar\".\n" -" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" - "[@G-@YNEGATIVE_PATTERNS]@D\n" -" Run only the tests whose name matches one of the positive patterns but\n" -" none of the negative patterns. '?' matches any single character; '*'\n" -" matches any substring; ':' separates two patterns.\n" -" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" -" Run all disabled tests too.\n" -"\n" -"Test Execution:\n" -" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" -" Run the tests repeatedly; use a negative count to repeat forever.\n" -" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" -" Randomize tests' orders on every iteration.\n" -" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" -" Random number seed to use for shuffling test orders (between 1 and\n" -" 99999, or 0 to use a seed based on the current time).\n" -"\n" -"Test Output:\n" -" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" -" Enable/disable colored output. The default is @Gauto@D.\n" -" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" -" Don't print the elapsed time of each test.\n" -" @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" - GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" -" Generate a JSON or XML report in the given directory or with the given\n" -" file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n" -# if GTEST_CAN_STREAM_RESULTS_ -" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" -" Stream test results to the given server.\n" -# endif // GTEST_CAN_STREAM_RESULTS_ -"\n" -"Assertion Behavior:\n" -# if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS -" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" -" Set the default death test style.\n" -# endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS -" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" -" Turn assertion failures into debugger break-points.\n" -" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" -" Turn assertion failures into C++ exceptions for use by an external\n" -" test framework.\n" -" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" -" Do not report exceptions as test failures. Instead, allow them\n" -" to crash the program or throw a pop-up (on Windows).\n" -"\n" -"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " - "the corresponding\n" -"environment variable of a flag (all letters in upper-case). For example, to\n" -"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ - "color=no@D or set\n" -"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" -"\n" -"For more information, please read the " GTEST_NAME_ " documentation at\n" -"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" -"(not one in your own code or tests), please report it to\n" -"@G<" GTEST_DEV_EMAIL_ ">@D.\n"; - -static bool ParseGoogleTestFlag(const char* const arg) { - return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, - >EST_FLAG(also_run_disabled_tests)) || - ParseBoolFlag(arg, kBreakOnFailureFlag, - >EST_FLAG(break_on_failure)) || - ParseBoolFlag(arg, kCatchExceptionsFlag, - >EST_FLAG(catch_exceptions)) || - ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || - ParseStringFlag(arg, kDeathTestStyleFlag, - >EST_FLAG(death_test_style)) || - ParseBoolFlag(arg, kDeathTestUseFork, - >EST_FLAG(death_test_use_fork)) || - ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || - ParseStringFlag(arg, kInternalRunDeathTestFlag, - >EST_FLAG(internal_run_death_test)) || - ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || - ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || - ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || - ParseBoolFlag(arg, kPrintUTF8Flag, >EST_FLAG(print_utf8)) || - ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || - ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || - ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || - ParseInt32Flag(arg, kStackTraceDepthFlag, - >EST_FLAG(stack_trace_depth)) || - ParseStringFlag(arg, kStreamResultToFlag, - >EST_FLAG(stream_result_to)) || - ParseBoolFlag(arg, kThrowOnFailureFlag, - >EST_FLAG(throw_on_failure)); -} - -#if GTEST_USE_OWN_FLAGFILE_FLAG_ -static void LoadFlagsFromFile(const std::string& path) { - FILE* flagfile = posix::FOpen(path.c_str(), "r"); - if (!flagfile) { - GTEST_LOG_(FATAL) << "Unable to open file \"" << GTEST_FLAG(flagfile) - << "\""; - } - std::string contents(ReadEntireFile(flagfile)); - posix::FClose(flagfile); - std::vector lines; - SplitString(contents, '\n', &lines); - for (size_t i = 0; i < lines.size(); ++i) { - if (lines[i].empty()) - continue; - if (!ParseGoogleTestFlag(lines[i].c_str())) - g_help_flag = true; - } -} -#endif // GTEST_USE_OWN_FLAGFILE_FLAG_ - -// Parses the command line for Google Test flags, without initializing -// other parts of Google Test. The type parameter CharType can be -// instantiated to either char or wchar_t. -template -void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { - for (int i = 1; i < *argc; i++) { - const std::string arg_string = StreamableToString(argv[i]); - const char* const arg = arg_string.c_str(); - - using internal::ParseBoolFlag; - using internal::ParseInt32Flag; - using internal::ParseStringFlag; - - bool remove_flag = false; - if (ParseGoogleTestFlag(arg)) { - remove_flag = true; -#if GTEST_USE_OWN_FLAGFILE_FLAG_ - } else if (ParseStringFlag(arg, kFlagfileFlag, >EST_FLAG(flagfile))) { - LoadFlagsFromFile(GTEST_FLAG(flagfile)); - remove_flag = true; -#endif // GTEST_USE_OWN_FLAGFILE_FLAG_ - } else if (arg_string == "--help" || arg_string == "-h" || - arg_string == "-?" || arg_string == "/?" || - HasGoogleTestFlagPrefix(arg)) { - // Both help flag and unrecognized Google Test flags (excluding - // internal ones) trigger help display. - g_help_flag = true; - } - - if (remove_flag) { - // Shift the remainder of the argv list left by one. Note - // that argv has (*argc + 1) elements, the last one always being - // NULL. The following loop moves the trailing NULL element as - // well. - for (int j = i; j != *argc; j++) { - argv[j] = argv[j + 1]; - } - - // Decrements the argument count. - (*argc)--; - - // We also need to decrement the iterator as we just removed - // an element. - i--; - } - } - - if (g_help_flag) { - // We print the help here instead of in RUN_ALL_TESTS(), as the - // latter may not be called at all if the user is using Google - // Test with another testing framework. - PrintColorEncoded(kColorEncodedHelpMessage); - } -} - -// Parses the command line for Google Test flags, without initializing -// other parts of Google Test. -void ParseGoogleTestFlagsOnly(int* argc, char** argv) { - ParseGoogleTestFlagsOnlyImpl(argc, argv); - - // Fix the value of *_NSGetArgc() on macOS, but if and only if - // *_NSGetArgv() == argv - // Only applicable to char** version of argv -#if GTEST_OS_MAC -#ifndef GTEST_OS_IOS - if (*_NSGetArgv() == argv) { - *_NSGetArgc() = *argc; - } -#endif -#endif -} -void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { - ParseGoogleTestFlagsOnlyImpl(argc, argv); -} - -// The internal implementation of InitGoogleTest(). -// -// The type parameter CharType can be instantiated to either char or -// wchar_t. -template -void InitGoogleTestImpl(int* argc, CharType** argv) { - // We don't want to run the initialization code twice. - if (GTestIsInitialized()) return; - - if (*argc <= 0) return; - - g_argvs.clear(); - for (int i = 0; i != *argc; i++) { - g_argvs.push_back(StreamableToString(argv[i])); - } - -#if GTEST_HAS_ABSL - absl::InitializeSymbolizer(g_argvs[0].c_str()); -#endif // GTEST_HAS_ABSL - - ParseGoogleTestFlagsOnly(argc, argv); - GetUnitTestImpl()->PostFlagParsingInit(); -} - -} // namespace internal - -// Initializes Google Test. This must be called before calling -// RUN_ALL_TESTS(). In particular, it parses a command line for the -// flags that Google Test recognizes. Whenever a Google Test flag is -// seen, it is removed from argv, and *argc is decremented. -// -// No value is returned. Instead, the Google Test flag variables are -// updated. -// -// Calling the function for the second time has no user-visible effect. -void InitGoogleTest(int* argc, char** argv) { -#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv); -#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - internal::InitGoogleTestImpl(argc, argv); -#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) -} - -// This overloaded version can be used in Windows programs compiled in -// UNICODE mode. -void InitGoogleTest(int* argc, wchar_t** argv) { -#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv); -#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - internal::InitGoogleTestImpl(argc, argv); -#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) -} - -// This overloaded version can be used on Arduino/embedded platforms where -// there is no argc/argv. -void InitGoogleTest() { - // Since Arduino doesn't have a command line, fake out the argc/argv arguments - int argc = 1; - const auto arg0 = "dummy"; - char* argv0 = const_cast(arg0); - char** argv = &argv0; - -#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv); -#else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) - internal::InitGoogleTestImpl(&argc, argv); -#endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) -} - -std::string TempDir() { -#if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_) - return GTEST_CUSTOM_TEMPDIR_FUNCTION_(); -#endif - -#if GTEST_OS_WINDOWS_MOBILE - return "\\temp\\"; -#elif GTEST_OS_WINDOWS - const char* temp_dir = internal::posix::GetEnv("TEMP"); - if (temp_dir == nullptr || temp_dir[0] == '\0') - return "\\temp\\"; - else if (temp_dir[strlen(temp_dir) - 1] == '\\') - return temp_dir; - else - return std::string(temp_dir) + "\\"; -#elif GTEST_OS_LINUX_ANDROID - return "/sdcard/"; -#else - return "/tmp/"; -#endif // GTEST_OS_WINDOWS_MOBILE -} - -// Class ScopedTrace - -// Pushes the given source file location and message onto a per-thread -// trace stack maintained by Google Test. -void ScopedTrace::PushTrace(const char* file, int line, std::string message) { - internal::TraceInfo trace; - trace.file = file; - trace.line = line; - trace.message.swap(message); - - UnitTest::GetInstance()->PushGTestTrace(trace); -} - -// Pops the info pushed by the c'tor. -ScopedTrace::~ScopedTrace() - GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { - UnitTest::GetInstance()->PopGTestTrace(); -} - -} // namespace testing diff --git a/core/deps/gtest/src/gtest_main.cc b/core/deps/gtest/src/gtest_main.cc deleted file mode 100644 index d63cfd79f..000000000 --- a/core/deps/gtest/src/gtest_main.cc +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2006, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -#include "gtest/gtest.h" - -#if GTEST_OS_ESP8266 || GTEST_OS_ESP32 -#if GTEST_OS_ESP8266 -extern "C" { -#endif -void setup() { - testing::InitGoogleTest(); -} - -void loop() { RUN_ALL_TESTS(); } - -#if GTEST_OS_ESP8266 -} -#endif - -#else - -GTEST_API_ int main(int argc, char **argv) { - printf("Running main() from %s\n", __FILE__); - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} -#endif diff --git a/core/deps/imgui/backends/imgui_impl_dx11.cpp b/core/deps/imgui/backends/imgui_impl_dx11.cpp index 909ac7825..c36e1579d 100644 --- a/core/deps/imgui/backends/imgui_impl_dx11.cpp +++ b/core/deps/imgui/backends/imgui_impl_dx11.cpp @@ -7,8 +7,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) @@ -30,7 +33,8 @@ // 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. // 2016-05-07: DirectX11: Disabling depth-write. -#include "imgui/imgui.h" +#include "imgui.h" +#ifndef IMGUI_DISABLE #include "imgui_impl_dx11.h" // DirectX @@ -55,7 +59,8 @@ struct ImGui_ImplDX11_Data ID3D11PixelShader* pPixelShader; ID3D11SamplerState* pFontSampler; ID3D11SamplerState* pTextureSampler; - ID3D11ShaderResourceView* pFontTextureView; + ID3D11SamplerState* pPointSampler; + ImTextureDX11 FontTexture; ID3D11RasterizerState* pRasterizerState; ID3D11BlendState* pBlendState; ID3D11DepthStencilState* pDepthStencilState; @@ -275,11 +280,17 @@ void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data) ctx->RSSetScissorRects(1, &r); // Bind texture, Draw - ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); - if (pcmd->TextureId != (ImTextureID)bd->pFontTextureView) - ctx->PSSetSamplers(0, 1, &bd->pTextureSampler); + ImTextureDX11 *tex = (ImTextureDX11 *)pcmd->GetTexID(); + if (tex != &bd->FontTexture) + { + if (tex->pointSampling) + ctx->PSSetSamplers(0, 1, &bd->pPointSampler); + else + ctx->PSSetSamplers(0, 1, &bd->pTextureSampler); + } else ctx->PSSetSamplers(0, 1, &bd->pFontSampler); + ID3D11ShaderResourceView* texture_srv = tex->shaderResourceView; ctx->PSSetShaderResources(0, 1, &texture_srv); ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset); } @@ -346,12 +357,12 @@ static void ImGui_ImplDX11_CreateFontsTexture() srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; srvDesc.Texture2D.MipLevels = desc.MipLevels; srvDesc.Texture2D.MostDetailedMip = 0; - bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->pFontTextureView); + bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->FontTexture.shaderResourceView); pTexture->Release(); } // Store our identifier - io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView); + io.Fonts->SetTexID((ImTextureID)&bd->FontTexture); // Create texture samplers // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) @@ -371,6 +382,9 @@ static void ImGui_ImplDX11_CreateFontsTexture() desc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER; desc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER; bd->pd3dDevice->CreateSamplerState(&desc, &bd->pTextureSampler); + + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + bd->pd3dDevice->CreateSamplerState(&desc, &bd->pPointSampler); } } @@ -430,9 +444,9 @@ bool ImGui_ImplDX11_CreateDeviceObjects() // Create the input layout D3D11_INPUT_ELEMENT_DESC local_layout[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)offsetof(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK) { @@ -536,7 +550,13 @@ void ImGui_ImplDX11_InvalidateDeviceObjects() if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = nullptr; } if (bd->pTextureSampler) { bd->pTextureSampler->Release(); bd->pTextureSampler = nullptr; } - if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied data->pFontTextureView to io.Fonts->TexID so let's clear that as well. + if (bd->pPointSampler) { bd->pPointSampler->Release(); bd->pPointSampler = nullptr; } + if (bd->FontTexture.shaderResourceView) { + bd->FontTexture.shaderResourceView->Release(); + bd->FontTexture.shaderResourceView = nullptr; + // We copied data->FontTexture.shaderResourceView to io.Fonts->TexID so let's clear that as well. + ImGui::GetIO().Fonts->SetTexID(0); + } if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; } @@ -551,6 +571,7 @@ void ImGui_ImplDX11_InvalidateDeviceObjects() bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context) { ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); // Setup backend capabilities flags @@ -599,8 +620,12 @@ void ImGui_ImplDX11_Shutdown() void ImGui_ImplDX11_NewFrame() { ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); - IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX11_Init()?"); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX11_Init()?"); if (!bd->pFontSampler) ImGui_ImplDX11_CreateDeviceObjects(); } + +//----------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/backends/imgui_impl_dx11.h b/core/deps/imgui/backends/imgui_impl_dx11.h index f3cd0b9f2..be5657bd6 100644 --- a/core/deps/imgui/backends/imgui_impl_dx11.h +++ b/core/deps/imgui/backends/imgui_impl_dx11.h @@ -5,16 +5,21 @@ // [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! // [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp #pragma once -#include "imgui/imgui.h" // IMGUI_IMPL_API +#include "imgui.h" // IMGUI_IMPL_API +#ifndef IMGUI_DISABLE struct ID3D11Device; struct ID3D11DeviceContext; +struct ID3D11ShaderResourceView; IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context); IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown(); @@ -24,3 +29,12 @@ IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data); // Use if you want to reset your rendering device without losing Dear ImGui state. IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects(); IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects(); + +// ImTextureID should be a pointer to this struct +struct ImTextureDX11 +{ + ID3D11ShaderResourceView *shaderResourceView; + bool pointSampling; +}; + +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/backends/imgui_impl_dx9.cpp b/core/deps/imgui/backends/imgui_impl_dx9.cpp index 431d02148..5d5edbc86 100644 --- a/core/deps/imgui/backends/imgui_impl_dx9.cpp +++ b/core/deps/imgui/backends/imgui_impl_dx9.cpp @@ -7,11 +7,15 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2024-02-12: DirectX9: Using RGBA format when supported by the driver to avoid CPU side conversion. (#6575) // 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. // 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). // 2021-06-25: DirectX9: Explicitly disable texture state stages after >= 1. @@ -31,7 +35,8 @@ // 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX9_RenderDrawData() in the .h file so you can call it yourself. // 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. -#include "imgui/imgui.h" +#include "imgui.h" +#ifndef IMGUI_DISABLE #include "imgui_impl_dx9.h" // DirectX @@ -43,7 +48,7 @@ struct ImGui_ImplDX9_Data LPDIRECT3DDEVICE9 pd3dDevice; LPDIRECT3DVERTEXBUFFER9 pVB; LPDIRECT3DINDEXBUFFER9 pIB; - LPDIRECT3DTEXTURE9 FontTexture; + ImTextureDX9 FontTexture; int VertexBufferSize; int IndexBufferSize; @@ -239,17 +244,30 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data) // Apply Scissor/clipping rectangle, Bind texture, Draw const RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; - const LPDIRECT3DTEXTURE9 texture = (LPDIRECT3DTEXTURE9)pcmd->GetTexID(); + const ImTextureDX9 *tex = (const ImTextureDX9 *)pcmd->GetTexID(); + const LPDIRECT3DTEXTURE9 texture = tex->d3dTexture; bd->pd3dDevice->SetTexture(0, texture); - if (texture != bd->FontTexture) + if (tex != &bd->FontTexture) { bd->pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); bd->pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); + if (tex->pointSampling) + { + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + } + else + { + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + } } else { bd->pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); bd->pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); } bd->pd3dDevice->SetScissorRect(&r); bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pcmd->VtxOffset + global_vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, pcmd->IdxOffset + global_idx_offset, pcmd->ElemCount / 3); @@ -263,6 +281,7 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data) bool ImGui_ImplDX9_Init(IDirect3DDevice9* device) { ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); // Setup backend capabilities flags @@ -291,6 +310,24 @@ void ImGui_ImplDX9_Shutdown() IM_DELETE(bd); } +static bool ImGui_ImplDX9_CheckFormatSupport(IDirect3DDevice9* pDevice, D3DFORMAT format) +{ + IDirect3D9* pd3d = nullptr; + if (pDevice->GetDirect3D(&pd3d) != D3D_OK) + return false; + D3DDEVICE_CREATION_PARAMETERS param = {}; + D3DDISPLAYMODE mode = {}; + if (pDevice->GetCreationParameters(¶m) != D3D_OK || pDevice->GetDisplayMode(0, &mode) != D3D_OK) + { + pd3d->Release(); + return false; + } + // Font texture should support linear filter, color blend and write to render-target + bool support = (pd3d->CheckDeviceFormat(param.AdapterOrdinal, param.DeviceType, mode.Format, D3DUSAGE_DYNAMIC | D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, format)) == D3D_OK; + pd3d->Release(); + return support; +} + static bool ImGui_ImplDX9_CreateFontsTexture() { // Build texture atlas @@ -302,31 +339,34 @@ static bool ImGui_ImplDX9_CreateFontsTexture() // Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices) #ifndef IMGUI_USE_BGRA_PACKED_COLOR - if (io.Fonts->TexPixelsUseColors) + const bool rgba_support = ImGui_ImplDX9_CheckFormatSupport(bd->pd3dDevice, D3DFMT_A8B8G8R8); + if (!rgba_support && io.Fonts->TexPixelsUseColors) { ImU32* dst_start = (ImU32*)ImGui::MemAlloc((size_t)width * height * bytes_per_pixel); for (ImU32* src = (ImU32*)pixels, *dst = dst_start, *dst_end = dst_start + (size_t)width * height; dst < dst_end; src++, dst++) *dst = IMGUI_COL_TO_DX9_ARGB(*src); pixels = (unsigned char*)dst_start; } +#else + const bool rgba_support = false; #endif // Upload texture to graphics system - bd->FontTexture = nullptr; - if (bd->pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bd->FontTexture, nullptr) < 0) + bd->FontTexture.d3dTexture = nullptr; + if (bd->pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, rgba_support ? D3DFMT_A8B8G8R8 : D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bd->FontTexture.d3dTexture, nullptr) < 0) return false; D3DLOCKED_RECT tex_locked_rect; - if (bd->FontTexture->LockRect(0, &tex_locked_rect, nullptr, 0) != D3D_OK) + if (bd->FontTexture.d3dTexture->LockRect(0, &tex_locked_rect, nullptr, 0) != D3D_OK) return false; for (int y = 0; y < height; y++) memcpy((unsigned char*)tex_locked_rect.pBits + (size_t)tex_locked_rect.Pitch * y, pixels + (size_t)width * bytes_per_pixel * y, (size_t)width * bytes_per_pixel); - bd->FontTexture->UnlockRect(0); + bd->FontTexture.d3dTexture->UnlockRect(0); // Store our identifier - io.Fonts->SetTexID((ImTextureID)bd->FontTexture); + io.Fonts->SetTexID((ImTextureID)&bd->FontTexture); #ifndef IMGUI_USE_BGRA_PACKED_COLOR - if (io.Fonts->TexPixelsUseColors) + if (!rgba_support && io.Fonts->TexPixelsUseColors) ImGui::MemFree(pixels); #endif @@ -350,14 +390,24 @@ void ImGui_ImplDX9_InvalidateDeviceObjects() return; if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } - if (bd->FontTexture) { bd->FontTexture->Release(); bd->FontTexture = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well. + if (bd->FontTexture.d3dTexture) + { + bd->FontTexture.d3dTexture->Release(); + bd->FontTexture.d3dTexture = nullptr; + // We copied bd->FontTexture to io.Fonts->TexID so let's clear that as well. + ImGui::GetIO().Fonts->SetTexID(0); + } } void ImGui_ImplDX9_NewFrame() { ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); - IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX9_Init()?"); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX9_Init()?"); - if (!bd->FontTexture) + if (!bd->FontTexture.d3dTexture) ImGui_ImplDX9_CreateDeviceObjects(); } + +//----------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/backends/imgui_impl_dx9.h b/core/deps/imgui/backends/imgui_impl_dx9.h index e2e6a5ea6..e8205a6e3 100644 --- a/core/deps/imgui/backends/imgui_impl_dx9.h +++ b/core/deps/imgui/backends/imgui_impl_dx9.h @@ -5,15 +5,20 @@ // [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID! // [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp #pragma once -#include "imgui/imgui.h" // IMGUI_IMPL_API +#include "imgui.h" // IMGUI_IMPL_API +#ifndef IMGUI_DISABLE struct IDirect3DDevice9; +struct IDirect3DTexture9; IMGUI_IMPL_API bool ImGui_ImplDX9_Init(IDirect3DDevice9* device); IMGUI_IMPL_API void ImGui_ImplDX9_Shutdown(); @@ -23,3 +28,12 @@ IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data); // Use if you want to reset your rendering device without losing Dear ImGui state. IMGUI_IMPL_API bool ImGui_ImplDX9_CreateDeviceObjects(); IMGUI_IMPL_API void ImGui_ImplDX9_InvalidateDeviceObjects(); + +// ImTextureID should be a pointer to this struct +struct ImTextureDX9 +{ + IDirect3DTexture9 *d3dTexture; + bool pointSampling; +}; + +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/backends/imgui_impl_opengl3.cpp b/core/deps/imgui/backends/imgui_impl_opengl3.cpp index 33fc24254..cc68e9b81 100644 --- a/core/deps/imgui/backends/imgui_impl_opengl3.cpp +++ b/core/deps/imgui/backends/imgui_impl_opengl3.cpp @@ -54,7 +54,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#include "imgui/imgui.h" +#include "imgui.h" #include "imgui_impl_opengl3.h" #include #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier @@ -66,9 +66,7 @@ #include "TargetConditionals.h" #endif -#include "wsi/gl_context.h" #include "rend/gles/glcache.h" -#include "hw/pvr/Renderer_if.h" // OpenGL Data static char g_GlslVersionString[32] = ""; @@ -81,11 +79,12 @@ static unsigned int g_VboHandle = 0, g_ElementsHandle = 0; // Functions static bool ImGui_ImplOpenGL3_CreateDeviceObjects(); static void ImGui_ImplOpenGL3_DestroyDeviceObjects(); -static void ImGui_ImplOpenGL3_DrawBackground(); bool ImGui_ImplOpenGL3_Init() { ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); + io.BackendRendererName = "imgui_impl_opengl3"; // Store GLSL version string so we can refer to it later in case we recreate shaders. Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. @@ -114,7 +113,6 @@ void ImGui_ImplOpenGL3_NewFrame() { if (!g_FontTexture) ImGui_ImplOpenGL3_CreateDeviceObjects(); - ImGui_ImplOpenGL3_DrawBackground(); } // OpenGL3 Render function. @@ -191,9 +189,9 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) glEnableVertexAttribArray(g_AttribLocationPosition); glEnableVertexAttribArray(g_AttribLocationUV); glEnableVertexAttribArray(g_AttribLocationColor); - glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos)); - glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv)); - glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col)); + glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, pos)); + glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, uv)); + glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)offsetof(ImDrawVert, col)); // Draw ImVec2 pos = draw_data->DisplayPos; @@ -489,15 +487,3 @@ static void ImGui_ImplOpenGL3_DestroyDeviceObjects() ImGui_ImplOpenGL3_DestroyFontsTexture(); } - -static void ImGui_ImplOpenGL3_DrawBackground() -{ -#ifndef TARGET_IPHONE - glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif - glcache.Disable(GL_SCISSOR_TEST); - glcache.ClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); - if (renderer != nullptr) - renderer->RenderLastFrame(); -} diff --git a/core/deps/imgui/backends/imgui_impl_vulkan.cpp b/core/deps/imgui/backends/imgui_impl_vulkan.cpp index fb503b340..3b757eb66 100644 --- a/core/deps/imgui/backends/imgui_impl_vulkan.cpp +++ b/core/deps/imgui/backends/imgui_impl_vulkan.cpp @@ -13,14 +13,17 @@ // - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!) // - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in our batch files) -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - // The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification. // IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/ +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp + // Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. // - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. // You will use those if you want to use this rendering backend in your engine/app. @@ -30,9 +33,23 @@ // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2024-04-19: Vulkan: Added convenience support for Volk via IMGUI_IMPL_VULKAN_USE_VOLK define (you can also use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + wrap Volk via ImGui_ImplVulkan_LoadFunctions().) +// 2024-02-14: *BREAKING CHANGE*: Moved RenderPass parameter from ImGui_ImplVulkan_Init() function to ImGui_ImplVulkan_InitInfo structure. Not required when using dynamic rendering. +// 2024-02-12: *BREAKING CHANGE*: Dynamic rendering now require filling PipelineRenderingCreateInfo structure. +// 2024-01-19: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by allocating one extra semaphore than in-flight frames. (#7236) +// 2024-01-11: Vulkan: Fixed vkMapMemory() calls unnecessarily using full buffer size (#3957). Fixed MinAllocationSize handing (#7189). +// 2024-01-03: Vulkan: Added MinAllocationSize field in ImGui_ImplVulkan_InitInfo to workaround zealous "best practice" validation layer. (#7189, #4238) +// 2024-01-03: Vulkan: Stopped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT as we don't reset them. +// 2023-11-29: Vulkan: Fixed mismatching allocator passed to vkCreateCommandPool() vs vkDestroyCommandPool(). (#7075) +// 2023-11-10: *BREAKING CHANGE*: Removed parameter from ImGui_ImplVulkan_CreateFontsTexture(): backend now creates its own command-buffer to upload fonts. +// *BREAKING CHANGE*: Removed ImGui_ImplVulkan_DestroyFontUploadObjects() which is now unnecessary as we create and destroy those objects in the backend. +// ImGui_ImplVulkan_CreateFontsTexture() is automatically called by NewFrame() the first time. +// You can call ImGui_ImplVulkan_CreateFontsTexture() again to recreate the font atlas texture. +// Added ImGui_ImplVulkan_DestroyFontsTexture() but you probably never need to call this. +// 2023-07-04: Vulkan: Added optional support for VK_KHR_dynamic_rendering. User needs to set init_info->UseDynamicRendering = true and init_info->ColorAttachmentFormat. // 2023-01-02: Vulkan: Fixed sampler passed to ImGui_ImplVulkan_AddTexture() not being honored + removed a bunch of duplicate code. // 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. -// 2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738). +// 2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symmetry. (#914, #5738). // 2022-01-20: Vulkan: Added support for ImTextureID as VkDescriptorSet. User need to call ImGui_ImplVulkan_AddTexture(). Building for 32-bit targets requires '#define ImTextureID ImU64'. (#914). // 2021-10-15: Vulkan: Call vkCmdSetScissor() at the end of render a full-viewport to reduce likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling vkCmdSetScissor() explicitly every frame. // 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). @@ -65,90 +82,45 @@ // 2016-10-18: Vulkan: Add location decorators & change to use structs as in/out in glsl, update embedded spv (produced with glslangValidator -x). Null the released resources. // 2016-08-27: Vulkan: Fix Vulkan example for use when a depth buffer is active. +#include "imgui.h" +#ifndef IMGUI_DISABLE #include "imgui_impl_vulkan.h" #include +#ifndef IM_MAX +#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) +#endif // Visual Studio warnings #ifdef _MSC_VER #pragma warning (disable: 4127) // condition expression is constant #endif -// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData() -// [Please zero-clear before use!] -struct ImGui_ImplVulkanH_FrameRenderBuffers -{ - VkDeviceMemory VertexBufferMemory; - VkDeviceMemory IndexBufferMemory; - VkDeviceSize VertexBufferSize; - VkDeviceSize IndexBufferSize; - VkBuffer VertexBuffer; - VkBuffer IndexBuffer; -}; - -// Each viewport will hold 1 ImGui_ImplVulkanH_WindowRenderBuffers -// [Please zero-clear before use!] -struct ImGui_ImplVulkanH_WindowRenderBuffers -{ - uint32_t Index; - uint32_t Count; - ImGui_ImplVulkanH_FrameRenderBuffers* FrameRenderBuffers; -}; - -// Vulkan data -struct ImGui_ImplVulkan_Data -{ - ImGui_ImplVulkan_InitInfo VulkanInitInfo; - VkRenderPass RenderPass; - VkDeviceSize BufferMemoryAlignment; - VkPipelineCreateFlags PipelineCreateFlags; - VkDescriptorSetLayout DescriptorSetLayout; - VkPipelineLayout PipelineLayout; - VkPipeline Pipeline; - uint32_t Subpass; - VkShaderModule ShaderModuleVert; - VkShaderModule ShaderModuleFrag; - - // Font data - VkSampler FontSampler; - VkDeviceMemory FontMemory; - VkImage FontImage; - VkImageView FontView; - VkDescriptorSet FontDescriptorSet; - VkDeviceMemory UploadBufferMemory; - VkBuffer UploadBuffer; - - // Render buffers for main window - ImGui_ImplVulkanH_WindowRenderBuffers MainWindowRenderBuffers; - - ImGui_ImplVulkan_Data() - { - memset((void*)this, 0, sizeof(*this)); - BufferMemoryAlignment = 256; - } -}; - // Forward Declarations +struct ImGui_ImplVulkan_FrameRenderBuffers; +struct ImGui_ImplVulkan_WindowRenderBuffers; bool ImGui_ImplVulkan_CreateDeviceObjects(); void ImGui_ImplVulkan_DestroyDeviceObjects(); +void ImGui_ImplVulkan_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkan_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator); +void ImGui_ImplVulkan_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkan_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator); void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator); void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator); -void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator); -void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator); void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count); void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator); // Vulkan prototypes for use with custom loaders // (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h -#ifdef VK_NO_PROTOTYPES +#if defined(VK_NO_PROTOTYPES) && !defined(VOLK_H_) +#define IMGUI_IMPL_VULKAN_USE_LOADER static bool g_FunctionsLoaded = false; #else static bool g_FunctionsLoaded = true; #endif -#ifdef VK_NO_PROTOTYPES +#ifdef IMGUI_IMPL_VULKAN_USE_LOADER #define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkBeginCommandBuffer) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindBufferMemory) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindImageMemory) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindDescriptorSets) \ @@ -191,6 +163,7 @@ static bool g_FunctionsLoaded = true; IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySurfaceKHR) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySwapchainKHR) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkDeviceWaitIdle) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkEndCommandBuffer) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkFlushMappedMemoryRanges) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeCommandBuffers) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeDescriptorSets) \ @@ -203,6 +176,9 @@ static bool g_FunctionsLoaded = true; IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfacePresentModesKHR) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetSwapchainImagesKHR) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkMapMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkQueueSubmit) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkQueueWaitIdle) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkResetCommandPool) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkUnmapMemory) \ IMGUI_VULKAN_FUNC_MAP_MACRO(vkUpdateDescriptorSets) @@ -210,13 +186,70 @@ static bool g_FunctionsLoaded = true; #define IMGUI_VULKAN_FUNC_DEF(func) static PFN_##func func; IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF) #undef IMGUI_VULKAN_FUNC_DEF -#endif // VK_NO_PROTOTYPES +#endif // IMGUI_IMPL_VULKAN_USE_LOADER + +#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING +static PFN_vkCmdBeginRenderingKHR ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR; +static PFN_vkCmdEndRenderingKHR ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR; +#endif + +// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData() +// [Please zero-clear before use!] +struct ImGui_ImplVulkan_FrameRenderBuffers +{ + VkDeviceMemory VertexBufferMemory; + VkDeviceMemory IndexBufferMemory; + VkDeviceSize VertexBufferSize; + VkDeviceSize IndexBufferSize; + VkBuffer VertexBuffer; + VkBuffer IndexBuffer; +}; + +// Each viewport will hold 1 ImGui_ImplVulkanH_WindowRenderBuffers +// [Please zero-clear before use!] +struct ImGui_ImplVulkan_WindowRenderBuffers +{ + uint32_t Index; + uint32_t Count; + ImGui_ImplVulkan_FrameRenderBuffers* FrameRenderBuffers; +}; + +// Vulkan data +struct ImGui_ImplVulkan_Data +{ + ImGui_ImplVulkan_InitInfo VulkanInitInfo; + VkDeviceSize BufferMemoryAlignment; + VkPipelineCreateFlags PipelineCreateFlags; + VkDescriptorSetLayout DescriptorSetLayout; + VkPipelineLayout PipelineLayout; + VkPipeline Pipeline; + VkShaderModule ShaderModuleVert; + VkShaderModule ShaderModuleFrag; + + // Font data + VkSampler FontSampler; + VkDeviceMemory FontMemory; + VkImage FontImage; + VkImageView FontView; + VkDescriptorSet FontDescriptorSet; + VkCommandPool FontCommandPool; + VkCommandBuffer FontCommandBuffer; + + // Render buffers for main window + ImGui_ImplVulkan_WindowRenderBuffers MainWindowRenderBuffers; + + ImGui_ImplVulkan_Data() + { + memset((void*)this, 0, sizeof(*this)); + BufferMemoryAlignment = 256; + } +}; //----------------------------------------------------------------------------- // SHADERS //----------------------------------------------------------------------------- -// glsl_shader.vert, compiled with: +// backends/vulkan/glsl_shader.vert, compiled with: // # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert /* #version 450 core @@ -280,7 +313,7 @@ static uint32_t __glsl_shader_vert_spv[] = 0x0000002d,0x0000002c,0x000100fd,0x00010038 }; -// glsl_shader.frag, compiled with: +// backends/vulkan/glsl_shader.frag, compiled with: // # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag /* #version 450 core @@ -355,7 +388,13 @@ static void check_vk_result(VkResult err) v->CheckVkResultFn(err); } -static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage) +// Same as IM_MEMALIGN(). 'alignment' must be a power of two. +static inline VkDeviceSize AlignBufferSize(VkDeviceSize size, VkDeviceSize alignment) +{ + return (size + alignment - 1) & ~(alignment - 1); +} + +static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& buffer_size, size_t new_size, VkBufferUsageFlagBits usage) { ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; @@ -365,10 +404,10 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory if (buffer_memory != VK_NULL_HANDLE) vkFreeMemory(v->Device, buffer_memory, v->Allocator); - VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment; + VkDeviceSize buffer_size_aligned = AlignBufferSize(IM_MAX(v->MinAllocationSize, new_size), bd->BufferMemoryAlignment); VkBufferCreateInfo buffer_info = {}; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - buffer_info.size = vertex_buffer_size_aligned; + buffer_info.size = buffer_size_aligned; buffer_info.usage = usage; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &buffer); @@ -386,10 +425,10 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory err = vkBindBufferMemory(v->Device, buffer, buffer_memory, 0); check_vk_result(err); - p_buffer_size = req.size; + buffer_size = buffer_size_aligned; } -static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height) +static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkan_FrameRenderBuffers* rb, int fb_width, int fb_height) { ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); @@ -448,28 +487,23 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm pipeline = bd->Pipeline; // Allocate array to store enough vertex/index buffers - ImGui_ImplVulkanH_WindowRenderBuffers* wrb = &bd->MainWindowRenderBuffers; + ImGui_ImplVulkan_WindowRenderBuffers* wrb = &bd->MainWindowRenderBuffers; if (wrb->FrameRenderBuffers == nullptr) { wrb->Index = 0; wrb->Count = v->ImageCount; - wrb->FrameRenderBuffers = (ImGui_ImplVulkanH_FrameRenderBuffers*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count); - memset(wrb->FrameRenderBuffers, 0, sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count); + wrb->FrameRenderBuffers = (ImGui_ImplVulkan_FrameRenderBuffers*)IM_ALLOC(sizeof(ImGui_ImplVulkan_FrameRenderBuffers) * wrb->Count); + memset(wrb->FrameRenderBuffers, 0, sizeof(ImGui_ImplVulkan_FrameRenderBuffers) * wrb->Count); } IM_ASSERT(wrb->Count == v->ImageCount); wrb->Index = (wrb->Index + 1) % wrb->Count; - ImGui_ImplVulkanH_FrameRenderBuffers* rb = &wrb->FrameRenderBuffers[wrb->Index]; + ImGui_ImplVulkan_FrameRenderBuffers* rb = &wrb->FrameRenderBuffers[wrb->Index]; if (draw_data->TotalVtxCount > 0) { // Create or resize the vertex/index buffers - size_t vertex_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); - size_t index_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); - if (vertex_size != 0) - vertex_size = ((vertex_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment; - if (index_size != 0) - index_size = ((index_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment; - + size_t vertex_size = AlignBufferSize(draw_data->TotalVtxCount * sizeof(ImDrawVert), bd->BufferMemoryAlignment); + size_t index_size = AlignBufferSize(draw_data->TotalIdxCount * sizeof(ImDrawIdx), bd->BufferMemoryAlignment); if (rb->VertexBuffer == VK_NULL_HANDLE || rb->VertexBufferSize < vertex_size) CreateOrResizeBuffer(rb->VertexBuffer, rb->VertexBufferMemory, rb->VertexBufferSize, vertex_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); if (rb->IndexBuffer == VK_NULL_HANDLE || rb->IndexBufferSize < index_size) @@ -478,9 +512,9 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm // Upload vertex/index data into a single contiguous GPU buffer ImDrawVert* vtx_dst = nullptr; ImDrawIdx* idx_dst = nullptr; - VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, rb->VertexBufferSize, 0, (void**)(&vtx_dst)); + VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, vertex_size, 0, (void**)&vtx_dst); check_vk_result(err); - err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, rb->IndexBufferSize, 0, (void**)(&idx_dst)); + err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, index_size, 0, (void**)&idx_dst); check_vk_result(err); for (int n = 0; n < draw_data->CmdListsCount; n++) { @@ -580,19 +614,55 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm vkCmdSetScissor(command_buffer, 0, 1, &scissor); } -bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) +bool ImGui_ImplVulkan_CreateFontsTexture() { ImGuiIO& io = ImGui::GetIO(); ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + VkResult err; + + // Destroy existing texture (if any) + if (bd->FontView || bd->FontImage || bd->FontMemory || bd->FontDescriptorSet) + { + vkQueueWaitIdle(v->Queue); + ImGui_ImplVulkan_DestroyFontsTexture(); + } + + // Create command pool/buffer + if (bd->FontCommandPool == VK_NULL_HANDLE) + { + VkCommandPoolCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + info.flags = 0; + info.queueFamilyIndex = v->QueueFamily; + vkCreateCommandPool(v->Device, &info, v->Allocator, &bd->FontCommandPool); + } + if (bd->FontCommandBuffer == VK_NULL_HANDLE) + { + VkCommandBufferAllocateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + info.commandPool = bd->FontCommandPool; + info.commandBufferCount = 1; + err = vkAllocateCommandBuffers(v->Device, &info, &bd->FontCommandBuffer); + check_vk_result(err); + } + + // Start command buffer + { + err = vkResetCommandPool(v->Device, bd->FontCommandPool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo begin_info = {}; + begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + begin_info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(bd->FontCommandBuffer, &begin_info); + check_vk_result(err); + } unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); size_t upload_size = width * height * 4 * sizeof(char); - VkResult err; - // Create the Image: { VkImageCreateInfo info = {}; @@ -615,7 +685,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) vkGetImageMemoryRequirements(v->Device, bd->FontImage, &req); VkMemoryAllocateInfo alloc_info = {}; alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - alloc_info.allocationSize = req.size; + alloc_info.allocationSize = IM_MAX(v->MinAllocationSize, req.size); alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits); err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->FontMemory); check_vk_result(err); @@ -641,40 +711,42 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) bd->FontDescriptorSet = (VkDescriptorSet)ImGui_ImplVulkan_AddTexture(bd->FontSampler, bd->FontView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); // Create the Upload Buffer: + VkDeviceMemory upload_buffer_memory; + VkBuffer upload_buffer; { VkBufferCreateInfo buffer_info = {}; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buffer_info.size = upload_size; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &bd->UploadBuffer); + err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &upload_buffer); check_vk_result(err); VkMemoryRequirements req; - vkGetBufferMemoryRequirements(v->Device, bd->UploadBuffer, &req); + vkGetBufferMemoryRequirements(v->Device, upload_buffer, &req); bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment; VkMemoryAllocateInfo alloc_info = {}; alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - alloc_info.allocationSize = req.size; + alloc_info.allocationSize = IM_MAX(v->MinAllocationSize, req.size); alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits); - err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->UploadBufferMemory); + err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &upload_buffer_memory); check_vk_result(err); - err = vkBindBufferMemory(v->Device, bd->UploadBuffer, bd->UploadBufferMemory, 0); + err = vkBindBufferMemory(v->Device, upload_buffer, upload_buffer_memory, 0); check_vk_result(err); } // Upload to Buffer: { char* map = nullptr; - err = vkMapMemory(v->Device, bd->UploadBufferMemory, 0, upload_size, 0, (void**)(&map)); + err = vkMapMemory(v->Device, upload_buffer_memory, 0, upload_size, 0, (void**)(&map)); check_vk_result(err); memcpy(map, pixels, upload_size); VkMappedMemoryRange range[1] = {}; range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; - range[0].memory = bd->UploadBufferMemory; + range[0].memory = upload_buffer_memory; range[0].size = upload_size; err = vkFlushMappedMemoryRanges(v->Device, 1, range); check_vk_result(err); - vkUnmapMemory(v->Device, bd->UploadBufferMemory); + vkUnmapMemory(v->Device, upload_buffer_memory); } // Copy to Image: @@ -690,7 +762,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy_barrier[0].subresourceRange.levelCount = 1; copy_barrier[0].subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, copy_barrier); + vkCmdPipelineBarrier(bd->FontCommandBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, copy_barrier); VkBufferImageCopy region = {}; region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; @@ -698,7 +770,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) region.imageExtent.width = width; region.imageExtent.height = height; region.imageExtent.depth = 1; - vkCmdCopyBufferToImage(command_buffer, bd->UploadBuffer, bd->FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + vkCmdCopyBufferToImage(bd->FontCommandBuffer, upload_buffer, bd->FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); VkImageMemoryBarrier use_barrier[1] = {}; use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -712,15 +784,50 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; use_barrier[0].subresourceRange.levelCount = 1; use_barrier[0].subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, use_barrier); + vkCmdPipelineBarrier(bd->FontCommandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, use_barrier); } // Store our identifier io.Fonts->SetTexID((ImTextureID)bd->FontDescriptorSet); + // End command buffer + VkSubmitInfo end_info = {}; + end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + end_info.commandBufferCount = 1; + end_info.pCommandBuffers = &bd->FontCommandBuffer; + err = vkEndCommandBuffer(bd->FontCommandBuffer); + check_vk_result(err); + err = vkQueueSubmit(v->Queue, 1, &end_info, VK_NULL_HANDLE); + check_vk_result(err); + + err = vkQueueWaitIdle(v->Queue); + check_vk_result(err); + + vkDestroyBuffer(v->Device, upload_buffer, v->Allocator); + vkFreeMemory(v->Device, upload_buffer_memory, v->Allocator); + return true; } +// You probably never need to call this, as it is called by ImGui_ImplVulkan_CreateFontsTexture() and ImGui_ImplVulkan_Shutdown(). +void ImGui_ImplVulkan_DestroyFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + + if (bd->FontDescriptorSet) + { + ImGui_ImplVulkan_RemoveTexture(bd->FontDescriptorSet); + bd->FontDescriptorSet = VK_NULL_HANDLE; + io.Fonts->SetTexID(0); + } + + if (bd->FontView) { vkDestroyImageView(v->Device, bd->FontView, v->Allocator); bd->FontView = VK_NULL_HANDLE; } + if (bd->FontImage) { vkDestroyImage(v->Device, bd->FontImage, v->Allocator); bd->FontImage = VK_NULL_HANDLE; } + if (bd->FontMemory) { vkFreeMemory(v->Device, bd->FontMemory, v->Allocator); bd->FontMemory = VK_NULL_HANDLE; } +} + static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator) { // Create the shader modules @@ -768,15 +875,15 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC attribute_desc[0].location = 0; attribute_desc[0].binding = binding_desc[0].binding; attribute_desc[0].format = VK_FORMAT_R32G32_SFLOAT; - attribute_desc[0].offset = IM_OFFSETOF(ImDrawVert, pos); + attribute_desc[0].offset = offsetof(ImDrawVert, pos); attribute_desc[1].location = 1; attribute_desc[1].binding = binding_desc[0].binding; attribute_desc[1].format = VK_FORMAT_R32G32_SFLOAT; - attribute_desc[1].offset = IM_OFFSETOF(ImDrawVert, uv); + attribute_desc[1].offset = offsetof(ImDrawVert, uv); attribute_desc[2].location = 2; attribute_desc[2].binding = binding_desc[0].binding; attribute_desc[2].format = VK_FORMAT_R8G8B8A8_UNORM; - attribute_desc[2].offset = IM_OFFSETOF(ImDrawVert, col); + attribute_desc[2].offset = offsetof(ImDrawVert, col); VkPipelineVertexInputStateCreateInfo vertex_info = {}; vertex_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; @@ -845,6 +952,17 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC info.layout = bd->PipelineLayout; info.renderPass = renderPass; info.subpass = subpass; + +#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING + if (bd->VulkanInitInfo.UseDynamicRendering) + { + IM_ASSERT(bd->VulkanInitInfo.PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR && "PipelineRenderingCreateInfo sType must be VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR"); + IM_ASSERT(bd->VulkanInitInfo.PipelineRenderingCreateInfo.pNext == nullptr && "PipelineRenderingCreateInfo pNext must be NULL"); + info.pNext = &bd->VulkanInitInfo.PipelineRenderingCreateInfo; + info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr. + } +#endif + VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline); check_vk_result(err); } @@ -905,39 +1023,22 @@ bool ImGui_ImplVulkan_CreateDeviceObjects() check_vk_result(err); } - ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, bd->RenderPass, v->MSAASamples, &bd->Pipeline, bd->Subpass); + ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, v->RenderPass, v->MSAASamples, &bd->Pipeline, v->Subpass); return true; } -void ImGui_ImplVulkan_DestroyFontUploadObjects() -{ - ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); - ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; - if (bd->UploadBuffer) - { - vkDestroyBuffer(v->Device, bd->UploadBuffer, v->Allocator); - bd->UploadBuffer = VK_NULL_HANDLE; - } - if (bd->UploadBufferMemory) - { - vkFreeMemory(v->Device, bd->UploadBufferMemory, v->Allocator); - bd->UploadBufferMemory = VK_NULL_HANDLE; - } -} - void ImGui_ImplVulkan_DestroyDeviceObjects() { ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; - ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); - ImGui_ImplVulkan_DestroyFontUploadObjects(); + ImGui_ImplVulkan_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); + ImGui_ImplVulkan_DestroyFontsTexture(); + if (bd->FontCommandBuffer) { vkFreeCommandBuffers(v->Device, bd->FontCommandPool, 1, &bd->FontCommandBuffer); bd->FontCommandBuffer = VK_NULL_HANDLE; } + if (bd->FontCommandPool) { vkDestroyCommandPool(v->Device, bd->FontCommandPool, v->Allocator); bd->FontCommandPool = VK_NULL_HANDLE; } if (bd->ShaderModuleVert) { vkDestroyShaderModule(v->Device, bd->ShaderModuleVert, v->Allocator); bd->ShaderModuleVert = VK_NULL_HANDLE; } if (bd->ShaderModuleFrag) { vkDestroyShaderModule(v->Device, bd->ShaderModuleFrag, v->Allocator); bd->ShaderModuleFrag = VK_NULL_HANDLE; } - if (bd->FontView) { vkDestroyImageView(v->Device, bd->FontView, v->Allocator); bd->FontView = VK_NULL_HANDLE; } - if (bd->FontImage) { vkDestroyImage(v->Device, bd->FontImage, v->Allocator); bd->FontImage = VK_NULL_HANDLE; ImGui::GetIO().Fonts->SetTexID(ImTextureID()); } - if (bd->FontMemory) { vkFreeMemory(v->Device, bd->FontMemory, v->Allocator); bd->FontMemory = VK_NULL_HANDLE; } if (bd->FontSampler) { vkDestroySampler(v->Device, bd->FontSampler, v->Allocator); bd->FontSampler = VK_NULL_HANDLE; } if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; } if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; } @@ -949,27 +1050,49 @@ bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const ch // Load function pointers // You can use the default Vulkan loader using: // ImGui_ImplVulkan_LoadFunctions([](const char* function_name, void*) { return vkGetInstanceProcAddr(your_vk_isntance, function_name); }); - // But this would be equivalent to not setting VK_NO_PROTOTYPES. -#ifdef VK_NO_PROTOTYPES + // But this would be roughly equivalent to not setting VK_NO_PROTOTYPES. +#ifdef IMGUI_IMPL_VULKAN_USE_LOADER #define IMGUI_VULKAN_FUNC_LOAD(func) \ func = reinterpret_cast(loader_func(#func, user_data)); \ if (func == nullptr) \ return false; IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_LOAD) #undef IMGUI_VULKAN_FUNC_LOAD + +#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING + // Manually load those two (see #5446) + ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast(loader_func("vkCmdBeginRenderingKHR", user_data)); + ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast(loader_func("vkCmdEndRenderingKHR", user_data)); +#endif #else IM_UNUSED(loader_func); IM_UNUSED(user_data); #endif + g_FunctionsLoaded = true; return true; } -bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass) +bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info) { IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!"); + if (info->UseDynamicRendering) + { +#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING +#ifndef IMGUI_IMPL_VULKAN_USE_LOADER + ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast(vkGetInstanceProcAddr(info->Instance, "vkCmdBeginRenderingKHR")); + ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast(vkGetInstanceProcAddr(info->Instance, "vkCmdEndRenderingKHR")); +#endif + IM_ASSERT(ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR != nullptr); + IM_ASSERT(ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR != nullptr); +#else + IM_ASSERT(0 && "Can't use dynamic rendering when neither VK_VERSION_1_3 or VK_KHR_dynamic_rendering is defined."); +#endif + } + ImGuiIO& io = ImGui::GetIO(); + IMGUI_CHECKVERSION(); IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); // Setup backend capabilities flags @@ -985,11 +1108,10 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE); IM_ASSERT(info->MinImageCount >= 2); IM_ASSERT(info->ImageCount >= info->MinImageCount); - IM_ASSERT(render_pass != VK_NULL_HANDLE); + if (info->UseDynamicRendering == false) + IM_ASSERT(info->RenderPass != VK_NULL_HANDLE); bd->VulkanInitInfo = *info; - bd->RenderPass = render_pass; - bd->Subpass = info->Subpass; ImGui_ImplVulkan_CreateDeviceObjects(); @@ -1012,8 +1134,10 @@ void ImGui_ImplVulkan_Shutdown() void ImGui_ImplVulkan_NewFrame() { ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); - IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplVulkan_Init()?"); - IM_UNUSED(bd); + IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplVulkan_Init()?"); + + if (!bd->FontDescriptorSet) + ImGui_ImplVulkan_CreateFontsTexture(); } void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count) @@ -1026,7 +1150,7 @@ void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count) ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; VkResult err = vkDeviceWaitIdle(v->Device); check_vk_result(err); - ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); + ImGui_ImplVulkan_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); bd->VulkanInitInfo.MinImageCount = min_image_count; } @@ -1073,6 +1197,26 @@ void ImGui_ImplVulkan_RemoveTexture(VkDescriptorSet descriptor_set) vkFreeDescriptorSets(v->Device, v->DescriptorPool, 1, &descriptor_set); } +void ImGui_ImplVulkan_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkan_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator) +{ + if (buffers->VertexBuffer) { vkDestroyBuffer(device, buffers->VertexBuffer, allocator); buffers->VertexBuffer = VK_NULL_HANDLE; } + if (buffers->VertexBufferMemory) { vkFreeMemory(device, buffers->VertexBufferMemory, allocator); buffers->VertexBufferMemory = VK_NULL_HANDLE; } + if (buffers->IndexBuffer) { vkDestroyBuffer(device, buffers->IndexBuffer, allocator); buffers->IndexBuffer = VK_NULL_HANDLE; } + if (buffers->IndexBufferMemory) { vkFreeMemory(device, buffers->IndexBufferMemory, allocator); buffers->IndexBufferMemory = VK_NULL_HANDLE; } + buffers->VertexBufferSize = 0; + buffers->IndexBufferSize = 0; +} + +void ImGui_ImplVulkan_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkan_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator) +{ + for (uint32_t n = 0; n < buffers->Count; n++) + ImGui_ImplVulkan_DestroyFrameRenderBuffers(device, &buffers->FrameRenderBuffers[n], allocator); + IM_FREE(buffers->FrameRenderBuffers); + buffers->FrameRenderBuffers = nullptr; + buffers->Index = 0; + buffers->Count = 0; +} + //------------------------------------------------------------------------- // Internal / Miscellaneous Vulkan Helpers // (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own app.) @@ -1160,19 +1304,17 @@ VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_d void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator) { IM_ASSERT(physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE); - (void)physical_device; - (void)allocator; + IM_UNUSED(physical_device); // Create Command Buffers VkResult err; for (uint32_t i = 0; i < wd->ImageCount; i++) { ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; - ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i]; { VkCommandPoolCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + info.flags = 0; info.queueFamilyIndex = queue_family; err = vkCreateCommandPool(device, &info, allocator, &fd->CommandPool); check_vk_result(err); @@ -1193,6 +1335,11 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_devi err = vkCreateFence(device, &info, allocator, &fd->Fence); check_vk_result(err); } + } + + for (uint32_t i = 0; i < wd->SemaphoreCount; i++) + { + ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i]; { VkSemaphoreCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; @@ -1228,10 +1375,9 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V // We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one. // Destroy old Framebuffer for (uint32_t i = 0; i < wd->ImageCount; i++) - { ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); + for (uint32_t i = 0; i < wd->SemaphoreCount; i++) ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); - } IM_FREE(wd->Frames); IM_FREE(wd->FrameSemaphores); wd->Frames = nullptr; @@ -1290,11 +1436,12 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, backbuffers); check_vk_result(err); - IM_ASSERT(wd->Frames == nullptr); + IM_ASSERT(wd->Frames == nullptr && wd->FrameSemaphores == nullptr); + wd->SemaphoreCount = wd->ImageCount + 1; wd->Frames = (ImGui_ImplVulkanH_Frame*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_Frame) * wd->ImageCount); - wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->ImageCount); + wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->SemaphoreCount); memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->ImageCount); - memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->ImageCount); + memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->SemaphoreCount); for (uint32_t i = 0; i < wd->ImageCount; i++) wd->Frames[i].Backbuffer = backbuffers[i]; } @@ -1302,6 +1449,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V vkDestroySwapchainKHR(device, old_swapchain, allocator); // Create the Render Pass + if (wd->UseDynamicRendering == false) { VkAttachmentDescription attachment = {}; attachment.format = wd->SurfaceFormat.format; @@ -1339,7 +1487,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V // We do not create a pipeline by default as this is also used by examples' main.cpp, // but secondary viewport in multi-viewport mode may want to create one with: - //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, bd->Subpass); + //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, v->Subpass); } // Create The Image Views @@ -1364,6 +1512,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V } // Create Framebuffer + if (wd->UseDynamicRendering == false) { VkImageView attachment[1]; VkFramebufferCreateInfo info = {}; @@ -1399,10 +1548,9 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui //vkQueueWaitIdle(bd->Queue); for (uint32_t i = 0; i < wd->ImageCount; i++) - { ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); + for (uint32_t i = 0; i < wd->SemaphoreCount; i++) ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); - } IM_FREE(wd->Frames); IM_FREE(wd->FrameSemaphores); wd->Frames = nullptr; @@ -1435,22 +1583,6 @@ void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH fsd->ImageAcquiredSemaphore = fsd->RenderCompleteSemaphore = VK_NULL_HANDLE; } -void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator) -{ - if (buffers->VertexBuffer) { vkDestroyBuffer(device, buffers->VertexBuffer, allocator); buffers->VertexBuffer = VK_NULL_HANDLE; } - if (buffers->VertexBufferMemory) { vkFreeMemory(device, buffers->VertexBufferMemory, allocator); buffers->VertexBufferMemory = VK_NULL_HANDLE; } - if (buffers->IndexBuffer) { vkDestroyBuffer(device, buffers->IndexBuffer, allocator); buffers->IndexBuffer = VK_NULL_HANDLE; } - if (buffers->IndexBufferMemory) { vkFreeMemory(device, buffers->IndexBufferMemory, allocator); buffers->IndexBufferMemory = VK_NULL_HANDLE; } - buffers->VertexBufferSize = 0; - buffers->IndexBufferSize = 0; -} +//----------------------------------------------------------------------------- -void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator) -{ - for (uint32_t n = 0; n < buffers->Count; n++) - ImGui_ImplVulkanH_DestroyFrameRenderBuffers(device, &buffers->FrameRenderBuffers[n], allocator); - IM_FREE(buffers->FrameRenderBuffers); - buffers->FrameRenderBuffers = nullptr; - buffers->Index = 0; - buffers->Count = 0; -} +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/backends/imgui_impl_vulkan.h b/core/deps/imgui/backends/imgui_impl_vulkan.h index 9fdc76a49..c174a6ca1 100644 --- a/core/deps/imgui/backends/imgui_impl_vulkan.h +++ b/core/deps/imgui/backends/imgui_impl_vulkan.h @@ -8,14 +8,17 @@ // Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'. // See imgui_impl_vulkan.cpp file for details. -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. -// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - // The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification. // IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/ +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp + // Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. // - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. // You will use those if you want to use this rendering backend in your engine/app. @@ -24,7 +27,8 @@ // Read comments in imgui_impl_vulkan.h. #pragma once -#include "imgui/imgui.h" // IMGUI_IMPL_API +#ifndef IMGUI_DISABLE +#include "imgui.h" // IMGUI_IMPL_API // [Configuration] in order to use a custom Vulkan function loader: // (1) You'll need to disable default Vulkan function prototypes. @@ -38,13 +42,31 @@ // If you have no idea what this is, leave it alone! //#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES -// Vulkan includes +// Convenience support for Volk +// (you can also technically use IMGUI_IMPL_VULKAN_NO_PROTOTYPES + wrap Volk via ImGui_ImplVulkan_LoadFunctions().) +//#define IMGUI_IMPL_VULKAN_USE_VOLK + #if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES) #define VK_NO_PROTOTYPES #endif +#if defined(VK_USE_PLATFORM_WIN32_KHR) && !defined(NOMINMAX) +#define NOMINMAX +#endif + +// Vulkan includes +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +#include +#else #include +#endif +#if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering) +#define IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING +#endif // Initialization data, for ImGui_ImplVulkan_Init() +// - VkDescriptorPool should be created with VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, +// and must contain a pool size large enough to hold an ImGui VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER descriptor. +// - When using dynamic rendering, set UseDynamicRendering=true and fill PipelineRenderingCreateInfo structure. // [Please zero-clear before use!] struct ImGui_ImplVulkan_InitInfo { @@ -53,23 +75,36 @@ struct ImGui_ImplVulkan_InitInfo VkDevice Device; uint32_t QueueFamily; VkQueue Queue; + VkDescriptorPool DescriptorPool; // See requirements in note above + VkRenderPass RenderPass; // Ignored if using dynamic rendering + uint32_t MinImageCount; // >= 2 + uint32_t ImageCount; // >= MinImageCount + VkSampleCountFlagBits MSAASamples; // 0 defaults to VK_SAMPLE_COUNT_1_BIT + + // (Optional) VkPipelineCache PipelineCache; - VkDescriptorPool DescriptorPool; uint32_t Subpass; - uint32_t MinImageCount; // >= 2 - uint32_t ImageCount; // >= MinImageCount - VkSampleCountFlagBits MSAASamples; // >= VK_SAMPLE_COUNT_1_BIT (0 -> default to VK_SAMPLE_COUNT_1_BIT) + + // (Optional) Dynamic Rendering + // Need to explicitly enable VK_KHR_dynamic_rendering extension to use this, even for Vulkan 1.3. + bool UseDynamicRendering; +#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING + VkPipelineRenderingCreateInfoKHR PipelineRenderingCreateInfo; +#endif + + // (Optional) Allocation, Debugging const VkAllocationCallbacks* Allocator; void (*CheckVkResultFn)(VkResult err); + VkDeviceSize MinAllocationSize; // Minimum allocation size. Set to 1024*1024 to satisfy zealous best practices validation layer and waste a little memory. }; // Called by user code -IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass); +IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info); IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown(); IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame(); IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE); -IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer); -IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontUploadObjects(); +IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(); +IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontsTexture(); IMGUI_IMPL_API void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated) // Register a texture (VkDescriptorSet == ImTextureID) @@ -139,10 +174,12 @@ struct ImGui_ImplVulkanH_Window VkPresentModeKHR PresentMode; VkRenderPass RenderPass; VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo + bool UseDynamicRendering; bool ClearEnable; VkClearValue ClearValue; uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount) uint32_t ImageCount; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count) + uint32_t SemaphoreCount; // Number of simultaneous in-flight frames + 1, to be able to use it in vkAcquireNextImageKHR uint32_t SemaphoreIndex; // Current set of swapchain wait semaphores we're using (needs to be distinct from per frame data) ImGui_ImplVulkanH_Frame* Frames; ImGui_ImplVulkanH_FrameSemaphores* FrameSemaphores; @@ -155,3 +192,4 @@ struct ImGui_ImplVulkanH_Window } }; +#endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/imconfig.h b/core/deps/imgui/imconfig.h index 876cf32f7..d556cbaf1 100644 --- a/core/deps/imgui/imconfig.h +++ b/core/deps/imgui/imconfig.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// COMPILE-TIME OPTIONS FOR DEAR IMGUI +// DEAR IMGUI COMPILE-TIME OPTIONS // Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. // You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. //----------------------------------------------------------------------------- @@ -9,7 +9,7 @@ // You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp // files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. // Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. -// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. +// Call IMGUI_CHECKVERSION() from your .cpp file to verify that the data structures your files are using are matching the ones imgui.cpp is using. //----------------------------------------------------------------------------- #pragma once @@ -26,21 +26,21 @@ //#define IMGUI_API __declspec( dllexport ) //#define IMGUI_API __declspec( dllimport ) -//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. +//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names. //#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS -//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions. +//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87+ disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This is automatically done by IMGUI_DISABLE_OBSOLETE_FUNCTIONS. //---- Disable all of Dear ImGui or don't implement standard windows/tools. // It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp. //#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. //#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. -//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowStackToolWindow() will be empty (this was called IMGUI_DISABLE_METRICS_WINDOW before 1.88). +//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty. //---- Don't implement some functions to reduce linkage requirements. //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) //#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) -//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). +//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, IME). //#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). //#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) //#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. @@ -50,21 +50,24 @@ //#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available //---- Include imgui_user.h at the end of imgui.h as a convenience +// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included. //#define IMGUI_INCLUDE_IMGUI_USER_H +//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h" //---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) //#define IMGUI_USE_BGRA_PACKED_COLOR -//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) +//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) //#define IMGUI_USE_WCHAR32 //---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version // By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. //#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" //#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" -//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if enabled +//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if IMGUI_USE_STB_SPRINTF is defined. //#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION //#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION // only disabled if IMGUI_USE_STB_SPRINTF is defined. //---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) // Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h. @@ -75,6 +78,12 @@ // On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. //#define IMGUI_ENABLE_FREETYPE +//---- Use FreeType+lunasvg library to render OpenType SVG fonts (SVGinOT) +// Requires lunasvg headers to be available in the include path + program to be linked with the lunasvg library (not provided). +// Only works in combination with IMGUI_ENABLE_FREETYPE. +// (implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement) +//#define IMGUI_ENABLE_FREETYPE_LUNASVG + //---- Use stb_truetype to build and rasterize the font atlas (default) // The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. //#define IMGUI_ENABLE_STB_TRUETYPE @@ -105,7 +114,7 @@ //typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); //#define ImDrawCallback MyImDrawCallback -//---- Debug Tools: Macro to break in Debugger +//---- Debug Tools: Macro to break in Debugger (we provide a default implementation of this in the codebase) // (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) //#define IM_DEBUG_BREAK IM_ASSERT(0) //#define IM_DEBUG_BREAK __debugbreak() @@ -113,10 +122,10 @@ //---- Debug Tools: Enable slower asserts //#define IMGUI_DEBUG_PARANOID -//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. +//---- Tip: You can add extra functions within the ImGui:: namespace from anywhere (e.g. your own sources/header files) /* namespace ImGui { - void MyFunction(const char* name, const MyMatrix44& v); + void MyFunction(const char* name, MyMatrix44* mtx); } */ diff --git a/core/deps/imgui/imgui.cpp b/core/deps/imgui/imgui.cpp index 533f8edc8..900267eb7 100644 --- a/core/deps/imgui/imgui.cpp +++ b/core/deps/imgui/imgui.cpp @@ -1,30 +1,37 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (main code and documentation) // Help: -// - Read FAQ at http://dearimgui.com/faq -// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. +// - See links below. // - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. +// - Read top of imgui.cpp for more details, links and comments. // Resources: -// - FAQ http://dearimgui.com/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/6478 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues - -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. - +// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md) +// - Homepage ................... https://github.com/ocornut/imgui +// - Releases & changelog ....... https://github.com/ocornut/imgui/releases +// - Gallery .................... https://github.com/ocornut/imgui/issues/7503 (please post your screenshots/video there!) +// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code) +// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more) +// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools +// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui +// - Issues & support ........... https://github.com/ocornut/imgui/issues +// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps) + +// For first-time users having issues compiling/linking/running/loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there. + +// Copyright (c) 2014-2024 Omar Cornut // Developed by Omar Cornut and every direct or indirect contributors to the GitHub. // See LICENSE.txt for copyright and licensing details (standard MIT License). // This library is free but needs your support to sustain development and maintenance. -// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com". -// Individuals: you can support continued development via donations. See docs/README or web page. +// Businesses: you can support continued development via B2B invoiced technical support, maintenance and sponsoring contracts. +// PLEASE reach out at omar AT dearimgui DOT com. See https://github.com/ocornut/imgui/wiki/Funding +// Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine. // It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. // Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without @@ -70,8 +77,10 @@ CODE // [SECTION] RENDER HELPERS // [SECTION] INITIALIZATION, SHUTDOWN // [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +// [SECTION] ID STACK // [SECTION] INPUTS // [SECTION] ERROR CHECKING +// [SECTION] ITEM SUBMISSION // [SECTION] LAYOUT // [SECTION] SCROLLING // [SECTION] TOOLTIPS @@ -85,7 +94,7 @@ CODE // [SECTION] PLATFORM DEPENDENT HELPERS // [SECTION] METRICS/DEBUGGER WINDOW // [SECTION] DEBUG LOG WINDOW -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL) */ @@ -107,9 +116,10 @@ CODE - Portable, minimize dependencies, run on target (consoles, phones, etc.). - Efficient runtime and memory consumption. - Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: + Designed primarily for developers and content-creators, not the typical end-user! + Some of the current weaknesses (which we aim to address in the future) includes: - - Doesn't look fancy, doesn't animate. + - Doesn't look fancy. - Limited layout features, intricate layouts are typically crafted in code. @@ -133,7 +143,7 @@ CODE - CTRL+X, CTRL+C, CTRL+V: Use OS clipboard. - CTRL+Z, CTRL+Y: Undo, Redo. - ESCAPE: Revert text to its original value. - - On OSX, controls are automatically adjusted to match standard OSX text editing shortcuts and behaviors. + - On OSX, controls are automatically adjusted to match standard OSX text editing 2ts and behaviors. - KEYBOARD CONTROLS - Basic: @@ -188,9 +198,11 @@ CODE READ FIRST ---------- - Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki) - - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or - destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs. + - Your code creates the UI every frame of your application loop, if your code doesn't run the UI is gone! + The UI can be highly dynamic, there are no construction or destruction steps, less superfluous + data retention on your side, less state duplication, less state synchronization, fewer bugs. - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. + Or browse https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html for interactive web version. - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki. @@ -198,18 +210,38 @@ CODE For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI, where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. - Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right. - - This codebase is also optimized to yield decent performances with typical "Debug" builds settings. - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected). If you get an assert, read the messages and comments around the assert. - - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace. - - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. - See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. - However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. - - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). + - This codebase aims to be highly optimized: + - A typical idle frame should never call malloc/free. + - We rely on a maximum of constant-time or O(N) algorithms. Limiting searches/scans as much as possible. + - We put particular energy in making sure performances are decent with typical "Debug" build settings as well. + Which mean we tend to avoid over-relying on "zero-cost abstraction" as they aren't zero-cost at all. + - This codebase aims to be both highly opinionated and highly flexible: + - This code works because of the things it choose to solve or not solve. + - C++: this is a pragmatic C-ish codebase: we don't use fancy C++ features, we don't include C++ headers, + and ImGui:: is a namespace. We rarely use member functions (and when we did, I am mostly regretting it now). + This is to increase compatibility, increase maintainability and facilitate use from other languages. + - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. + See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. + We can can optionally export math operators for ImVec2/ImVec4 using IMGUI_DEFINE_MATH_OPERATORS, which we use internally. + - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction + (so don't use ImVector in your code or at our own risk!). + - Building: We don't use nor mandate a build system for the main library. + This is in an effort to ensure that it works in the real world aka with any esoteric build setup. + This is also because providing a build system for the main library would be of little-value. + The build problems are almost never coming from the main library but from specific backends. HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI ---------------------------------------------- + - Update submodule or copy/overwrite every file. + - About imconfig.h: + - You may modify your copy of imconfig.h, in this case don't overwrite it. + - or you may locally branch to modify imconfig.h and merge/rebase latest. + - or you may '#define IMGUI_USER_CONFIG "my_config_file.h"' globally from your build system to + specify a custom path for your imconfig.h file and instead not have to modify the default one. + - Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h) - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master". - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. @@ -218,11 +250,12 @@ CODE from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it. Please report any issue to the GitHub page! - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. - - Try to keep your copy of Dear ImGui reasonably up to date. + - Try to keep your copy of Dear ImGui reasonably up to date! GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE --------------------------------------------------------------- + - See https://github.com/ocornut/imgui/wiki/Getting-Started. - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. @@ -330,7 +363,7 @@ CODE To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application, you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! - Please read the FAQ and example applications for details about this! + Please read the FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" about this. HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE @@ -397,6 +430,72 @@ CODE When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. You can read releases logs https://github.com/ocornut/imgui/releases for more details. + - 2024/06/06 (1.90.8) - reordered ImGuiInputTextFlags values. This should not be breaking unless you are using generated headers that have values not matching the main library. + - 2024/06/06 (1.90.8) - removed 'ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft', was mostly unused and misleading. + - 2024/05/27 (1.90.7) - commented out obsolete symbols marked obsolete in 1.88 (May 2022): + - old: CaptureKeyboardFromApp(bool) + - new: SetNextFrameWantCaptureKeyboard(bool) + - old: CaptureMouseFromApp(bool) + - new: SetNextFrameWantCaptureMouse(bool) + - 2024/05/22 (1.90.7) - inputs (internals): renamed ImGuiKeyOwner_None to ImGuiKeyOwner_NoOwner, to make use more explicit and reduce confusion with the default it is a non-zero value and cannot be the default value (never made public, but disclosing as I expect a few users caught on owner-aware inputs). + - inputs (internals): renamed ImGuiInputFlags_RouteGlobalLow -> ImGuiInputFlags_RouteGlobal, ImGuiInputFlags_RouteGlobal -> ImGuiInputFlags_RouteGlobalOverFocused, ImGuiInputFlags_RouteGlobalHigh -> ImGuiInputFlags_RouteGlobalHighest. + - inputs (internals): Shortcut(), SetShortcutRouting(): swapped last two parameters order in function signatures: + - old: Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); + - new: Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0, ImGuiID owner_id = 0); + - inputs (internals): owner-aware versions of IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(): swapped last two parameters order in function signatures. + - old: IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + - new: IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); + - old: IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); + - new: IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); + for various reasons those changes makes sense. They are being made because making some of those API public. + only past users of imgui_internal.h with the extra parameters will be affected. Added asserts for valid flags in various functions to detect _some_ misuses, BUT NOT ALL. + - 2024/05/16 (1.90.7) - inputs: on macOS X, Cmd and Ctrl keys are now automatically swapped by io.AddKeyEvent() as this naturally align with how macOS X uses those keys. + - it shouldn't really affect you unless you had custom shortcut swapping in place for macOS X apps. + - removed ImGuiMod_Shortcut which was previously dynamically remapping to Ctrl or Cmd/Super. It is now unnecessary to specific cross-platform idiomatic shortcuts. (#2343, #4084, #5923, #456) + - 2024/05/14 (1.90.7) - backends: SDL_Renderer2 and SDL_Renderer3 backend now take a SDL_Renderer* in their RenderDrawData() functions. + - 2024/04/18 (1.90.6) - TreeNode: Fixed a layout inconsistency when using an empty/hidden label followed by a SameLine() call. (#7505, #282) + - old: TreeNode("##Hidden"); SameLine(); Text("Hello"); // <-- This was actually incorrect! BUT appeared to look ok with the default style where ItemSpacing.x == FramePadding.x * 2 (it didn't look aligned otherwise). + - new: TreeNode("##Hidden"); SameLine(0, 0); Text("Hello"); // <-- This is correct for all styles values. + with the fix, IF you were successfully using TreeNode("")+SameLine(); you will now have extra spacing between your TreeNode and the following item. + You'll need to change the SameLine() call to SameLine(0,0) to remove this extraneous spacing. This seemed like the more sensible fix that's not making things less consistent. + (Note: when using this idiom you are likely to also use ImGuiTreeNodeFlags_SpanAvailWidth). + - 2024/03/18 (1.90.5) - merged the radius_x/radius_y parameters in ImDrawList::AddEllipse(), AddEllipseFilled() and PathEllipticalArcTo() into a single ImVec2 parameter. Exceptionally, because those functions were added in 1.90, we are not adding inline redirection functions. The transition is easy and should affect few users. (#2743, #7417) + - 2024/03/08 (1.90.5) - inputs: more formally obsoleted GetKeyIndex() when IMGUI_DISABLE_OBSOLETE_FUNCTIONS is set. It has been unnecessary and a no-op since 1.87 (it returns the same value as passed when used with a 1.87+ backend using io.AddKeyEvent() function). (#4921) + - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) + - 2024/01/15 (1.90.2) - commented out obsolete ImGuiIO::ImeWindowHandle marked obsolete in 1.87, favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'. + - 2023/12/19 (1.90.1) - commented out obsolete ImGuiKey_KeyPadEnter redirection to ImGuiKey_KeypadEnter. + - 2023/11/06 (1.90.1) - removed CalcListClipping() marked obsolete in 1.86. Prefer using ImGuiListClipper which can return non-contiguous ranges. + - 2023/11/05 (1.90.1) - imgui_freetype: commented out ImGuiFreeType::BuildFontAtlas() obsoleted in 1.81. prefer using #define IMGUI_ENABLE_FREETYPE or see commented code for manual calls. + - 2023/11/05 (1.90.1) - internals,columns: commented out legacy ImGuiColumnsFlags_XXX symbols redirecting to ImGuiOldColumnsFlags_XXX, obsoleted from imgui_internal.h in 1.80. + - 2023/11/09 (1.90.0) - removed IM_OFFSETOF() macro in favor of using offsetof() available in C++11. Kept redirection define (will obsolete). + - 2023/11/07 (1.90.0) - removed BeginChildFrame()/EndChildFrame() in favor of using BeginChild() with the ImGuiChildFlags_FrameStyle flag. kept inline redirection function (will obsolete). + those functions were merely PushStyle/PopStyle helpers, the removal isn't so much motivated by needing to add the feature in BeginChild(), but by the necessity to avoid BeginChildFrame() signature mismatching BeginChild() signature and features. + - 2023/11/02 (1.90.0) - BeginChild: upgraded 'bool border = true' parameter to 'ImGuiChildFlags flags' type, added ImGuiChildFlags_Border equivalent. As with our prior "bool-to-flags" API updates, the ImGuiChildFlags_Border value is guaranteed to be == true forever to ensure a smoother transition, meaning all existing calls will still work. + - old: BeginChild("Name", size, true) + - new: BeginChild("Name", size, ImGuiChildFlags_Border) + - old: BeginChild("Name", size, false) + - new: BeginChild("Name", size) or BeginChild("Name", 0) or BeginChild("Name", size, ImGuiChildFlags_None) + - 2023/11/02 (1.90.0) - BeginChild: added child-flag ImGuiChildFlags_AlwaysUseWindowPadding as a replacement for the window-flag ImGuiWindowFlags_AlwaysUseWindowPadding: the feature only ever made sense for BeginChild() anyhow. + - old: BeginChild("Name", size, 0, ImGuiWindowFlags_AlwaysUseWindowPadding); + - new: BeginChild("Name", size, ImGuiChildFlags_AlwaysUseWindowPadding, 0); + - 2023/09/27 (1.90.0) - io: removed io.MetricsActiveAllocations introduced in 1.63. Same as 'g.DebugMemAllocCount - g.DebugMemFreeCount' (still displayed in Metrics, unlikely to be accessed by end-user). + - 2023/09/26 (1.90.0) - debug tools: Renamed ShowStackToolWindow() ("Stack Tool") to ShowIDStackToolWindow() ("ID Stack Tool"), as earlier name was misleading. Kept inline redirection function. (#4631) + - 2023/09/15 (1.90.0) - ListBox, Combo: changed signature of "name getter" callback in old one-liner ListBox()/Combo() apis. kept inline redirection function (will obsolete). + - old: bool Combo(const char* label, int* current_item, bool (*getter)(void* user_data, int idx, const char** out_text), ...) + - new: bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...); + - old: bool ListBox(const char* label, int* current_item, bool (*getting)(void* user_data, int idx, const char** out_text), ...); + - new: bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), ...); + - 2023/09/08 (1.90.0) - commented out obsolete redirecting functions: + - GetWindowContentRegionWidth() -> use GetWindowContentRegionMax().x - GetWindowContentRegionMin().x. Consider that generally 'GetContentRegionAvail().x' is more useful. + - ImDrawCornerFlags_XXX -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details + grep commented names in sources. + - commented out runtime support for hardcoded ~0 or 0x01..0x0F rounding flags values for AddRect()/AddRectFilled()/PathRect()/AddImageRounded() -> use ImDrawFlags_RoundCornersXXX flags. Read 1.82 Changelog for details + - 2023/08/25 (1.89.9) - clipper: Renamed IncludeRangeByIndices() (also called ForceDisplayRangeByIndices() before 1.89.6) to IncludeItemsByIndex(). Kept inline redirection function. Sorry! + - 2023/07/12 (1.89.8) - ImDrawData: CmdLists now owned, changed from ImDrawList** to ImVector. Majority of users shouldn't be affected, but you cannot compare to NULL nor reassign manually anymore. Instead use AddDrawList(). (#6406, #4879, #1878) + - 2023/06/28 (1.89.7) - overlapping items: obsoleted 'SetItemAllowOverlap()' (called after item) in favor of calling 'SetNextItemAllowOverlap()' (called before item). 'SetItemAllowOverlap()' didn't and couldn't work reliably since 1.89 (2022-11-15). + - 2023/06/28 (1.89.7) - overlapping items: renamed 'ImGuiTreeNodeFlags_AllowItemOverlap' to 'ImGuiTreeNodeFlags_AllowOverlap', 'ImGuiSelectableFlags_AllowItemOverlap' to 'ImGuiSelectableFlags_AllowOverlap'. Kept redirecting enums (will obsolete). + - 2023/06/28 (1.89.7) - overlapping items: IsItemHovered() now by default return false when querying an item using AllowOverlap mode which is being overlapped. Use ImGuiHoveredFlags_AllowWhenOverlappedByItem to revert to old behavior. + - 2023/06/28 (1.89.7) - overlapping items: Selectable and TreeNode don't allow overlap when active so overlapping widgets won't appear as hovered. While this fixes a common small visual issue, it also means that calling IsItemHovered() after a non-reactive elements - e.g. Text() - overlapping an active one may fail if you don't use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem). (#6610) + - 2023/06/20 (1.89.7) - moved io.HoverDelayShort/io.HoverDelayNormal to style.HoverDelayShort/style.HoverDelayNormal. As the fields were added in 1.89 and expected to be left unchanged by most users, or only tweaked once during app initialization, we are exceptionally accepting the breakage. - 2023/05/30 (1.89.6) - backends: renamed "imgui_impl_sdlrenderer.cpp" to "imgui_impl_sdlrenderer2.cpp" and "imgui_impl_sdlrenderer.h" to "imgui_impl_sdlrenderer2.h". This is in prevision for the future release of SDL3. - 2023/05/22 (1.89.6) - listbox: commented out obsolete/redirecting functions that were marked obsolete more than two years ago: - ListBoxHeader() -> use BeginListBox() (note how two variants of ListBoxHeader() existed. Check commented versions in imgui.h for reference) @@ -475,7 +574,7 @@ CODE - Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only] note: for all calls to IO new functions, the Dear ImGui context should be bound/current. read https://github.com/ocornut/imgui/issues/4921 for details. - - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. + - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. - IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX) - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes). @@ -799,11 +898,12 @@ CODE Q: Where is the documentation? A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++. - - Run the examples/ and explore them. + - Run the examples/ applications and explore them. + - Read Getting Started (https://github.com/ocornut/imgui/wiki/Getting-Started) guide. - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. - The demo covers most features of Dear ImGui, so you can read the code and see its output. - See documentation and comments at the top of imgui.cpp + effectively imgui.h. - - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the + - 20+ standalone example applications using e.g. OpenGL/DirectX are provided in the examples/ folder to explain how to integrate Dear ImGui with your own engine/application. - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. @@ -819,14 +919,14 @@ CODE ================ Q: How to get started? - A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. + A: Read https://github.com/ocornut/imgui/wiki/Getting-Started. Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application? A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! >> See https://www.dearimgui.com/faq for a fully detailed answer. You really want to read this. - Q. How can I enable keyboard controls? - Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) + Q. How can I enable keyboard or gamepad controls? + Q: How can I use this on a machine without mouse, keyboard or screen? (input share, remote display) Q: I integrated Dear ImGui in my engine and little squares are showing instead of text... Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around... Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries... @@ -841,7 +941,7 @@ CODE - How can I have multiple widgets with the same label? - How can I have multiple windows with the same label? Q: How can I display an image? What is ImTextureID, how does it work? - Q: How can I use my own math types instead of ImVec2/ImVec4? + Q: How can I use my own math types instead of ImVec2? Q: How can I interact with standard C++ types (such as std::string and std::vector)? Q: How can I display custom shapes? (using low-level ImDrawList API) >> See https://www.dearimgui.com/faq @@ -854,7 +954,7 @@ CODE Q: How can I easily use icons in my application? Q: How can I load multiple fonts? Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? - >> See https://www.dearimgui.com/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md + >> See https://www.dearimgui.com/faq and https://github.com/ocornut/imgui/blob/master/docs/FONTS.md Q&A: Concerns ============= @@ -869,12 +969,12 @@ CODE ============== Q: How can I help? - A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui! + A: - Businesses: please reach out to "omar AT dearimgui DOT com" if you work in a place using Dear ImGui! We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. - This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project. - - Individuals: you can support continued development via PayPal donations. See README. - - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt - and see how you want to help and can help! + This is among the most useful thing you can do for Dear ImGui. With increased funding, we sustain and grow work on this project. + >>> See https://github.com/ocornut/imgui/wiki/Funding + - Businesses: you can also purchase licenses for the Dear ImGui Automation/Test Engine. + - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, and see how you want to help and can help! - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers. But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions. @@ -900,11 +1000,7 @@ CODE // System includes #include // vsnprintf, sscanf, printf -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif // [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled #if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) @@ -927,7 +1023,8 @@ CODE #else #include #endif -#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_GAMES) +// The UWP and GDK Win32 API subsets don't support clipboard nor IME functions #define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS #define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS #endif @@ -967,6 +1064,7 @@ CODE #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) // We disable -Wpragmas because GCC doesn't provide a has_warning equivalent and some forks/patches may not follow the warning/version association. #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -983,27 +1081,29 @@ CODE // Debug options #define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL #define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window -#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) // When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear +static const float NAV_ACTIVATE_HIGHLIGHT_TIMER = 0.10f; // Time to highlight an item activated by a shortcut. + // Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow(). static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 0.70f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. +// Tooltip offset +static const ImVec2 TOOLTIP_DEFAULT_OFFSET = ImVec2(16, 10); // Multiplied by g.Style.MouseCursorScale + //------------------------------------------------------------------------- // [SECTION] FORWARD DECLARATIONS //------------------------------------------------------------------------- static void SetCurrentWindow(ImGuiWindow* window); -static void FindHoveredWindow(); static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list); static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window); // Settings @@ -1020,6 +1120,9 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport namespace ImGui { +// Item +static void ItemHandleShortcut(ImGuiID id); + // Navigation static void NavUpdate(); static void NavUpdateWindowing(); @@ -1039,7 +1142,6 @@ static ImVec2 NavCalcPreferredRefPos(); static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); static void NavRestoreLayer(ImGuiNavLayer layer); -static void NavRestoreHighlightAfterMove(); static int FindWindowFocusIndex(ImGuiWindow* window); // Error Checking and Debug Tools @@ -1047,6 +1149,7 @@ static void ErrorCheckNewFrameSanityChecks(); static void ErrorCheckEndFrameSanityChecks(); static void UpdateDebugToolItemPicker(); static void UpdateDebugToolStackQueries(); +static void UpdateDebugToolFlashStyleColor(); // Inputs static void UpdateKeyboardInputs(); @@ -1056,14 +1159,16 @@ static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt); // Misc static void UpdateSettings(); -static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); +static int UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); static void RenderWindowOuterBorders(ImGuiWindow* window); static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); static void RenderDimmedBackgrounds(); +static void SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect); // Viewports +const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbitrary constant instead of e.g. ImHashStr("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter. static void UpdateViewportsNewFrame(); } @@ -1116,49 +1221,59 @@ static void* GImAllocatorUserData = NULL; ImGuiStyle::ImGuiStyle() { - Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. - DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. - WindowPadding = ImVec2(8,8); // Padding within a window - WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. - WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. - WindowMinSize = ImVec2(32,32); // Minimum window size - WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text - WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. - ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows - ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. - PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows - PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. - FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) - FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). - FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. - ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines - ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) - CellPadding = ImVec2(4,2); // Padding within a table cell - TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! - IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). - ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). - ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar - ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar - GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar - GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. - LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. - TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. - TabBorderSize = 0.0f; // Thickness of border around tabs. - TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. - ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. - ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. - SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. - SeparatorTextBorderSize = 3.0f; // Thickkness of border in SeparatorText() - SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). - SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. - DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. - DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. - MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. - AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. - AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). - AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). - CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. - CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. + DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + WindowPadding = ImVec2(8,8); // Padding within a window + WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. + WindowMinSize = ImVec2(32,32); // Minimum window size + WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text + WindowMenuButtonPosition = ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. + ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows + ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. + PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows + PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. + FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) + FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). + FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. + ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines + ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) + CellPadding = ImVec2(4,2); // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows. + TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar + ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar + GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar + GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + TabBorderSize = 0.0f; // Thickness of border around tabs. + TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + TabBarBorderSize = 1.0f; // Thickness of tab-bar separator, which takes on the tab active color to denote focus. + TableAngledHeadersAngle = 35.0f * (IM_PI / 180.0f); // Angle of angled headers (supported values range from -50 degrees to +50 degrees). + TableAngledHeadersTextAlign = ImVec2(0.5f,0.0f);// Alignment of angled headers within the cell + ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. + SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + SeparatorTextBorderSize = 3.0f; // Thickkness of border in SeparatorText() + SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). + SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. + DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. + MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. + AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). + CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + + // Behaviors + HoverStationaryDelay = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary. + HoverDelayShort = 0.15f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay. + HoverDelayNormal = 0.40f; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). " + HoverFlagsForTooltipMouse = ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse. + HoverFlagsForTooltipNav = ImGuiHoveredFlags_NoSharedDelay | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_AllowWhenDisabled; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad. // Default theme ImGui::StyleColorsDark(this); @@ -1168,30 +1283,30 @@ ImGuiStyle::ImGuiStyle() // Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. void ImGuiStyle::ScaleAllSizes(float scale_factor) { - WindowPadding = ImFloor(WindowPadding * scale_factor); - WindowRounding = ImFloor(WindowRounding * scale_factor); - WindowMinSize = ImFloor(WindowMinSize * scale_factor); - ChildRounding = ImFloor(ChildRounding * scale_factor); - PopupRounding = ImFloor(PopupRounding * scale_factor); - FramePadding = ImFloor(FramePadding * scale_factor); - FrameRounding = ImFloor(FrameRounding * scale_factor); - ItemSpacing = ImFloor(ItemSpacing * scale_factor); - ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); - CellPadding = ImFloor(CellPadding * scale_factor); - TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); - IndentSpacing = ImFloor(IndentSpacing * scale_factor); - ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); - ScrollbarSize = ImFloor(ScrollbarSize * scale_factor); - ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); - GrabMinSize = ImFloor(GrabMinSize * scale_factor); - GrabRounding = ImFloor(GrabRounding * scale_factor); - LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor); - TabRounding = ImFloor(TabRounding * scale_factor); - TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; - SeparatorTextPadding = ImFloor(SeparatorTextPadding * scale_factor); - DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); - DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); - MouseCursorScale = ImFloor(MouseCursorScale * scale_factor); + WindowPadding = ImTrunc(WindowPadding * scale_factor); + WindowRounding = ImTrunc(WindowRounding * scale_factor); + WindowMinSize = ImTrunc(WindowMinSize * scale_factor); + ChildRounding = ImTrunc(ChildRounding * scale_factor); + PopupRounding = ImTrunc(PopupRounding * scale_factor); + FramePadding = ImTrunc(FramePadding * scale_factor); + FrameRounding = ImTrunc(FrameRounding * scale_factor); + ItemSpacing = ImTrunc(ItemSpacing * scale_factor); + ItemInnerSpacing = ImTrunc(ItemInnerSpacing * scale_factor); + CellPadding = ImTrunc(CellPadding * scale_factor); + TouchExtraPadding = ImTrunc(TouchExtraPadding * scale_factor); + IndentSpacing = ImTrunc(IndentSpacing * scale_factor); + ColumnsMinSpacing = ImTrunc(ColumnsMinSpacing * scale_factor); + ScrollbarSize = ImTrunc(ScrollbarSize * scale_factor); + ScrollbarRounding = ImTrunc(ScrollbarRounding * scale_factor); + GrabMinSize = ImTrunc(GrabMinSize * scale_factor); + GrabRounding = ImTrunc(GrabRounding * scale_factor); + LogSliderDeadzone = ImTrunc(LogSliderDeadzone * scale_factor); + TabRounding = ImTrunc(TabRounding * scale_factor); + TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImTrunc(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; + SeparatorTextPadding = ImTrunc(SeparatorTextPadding * scale_factor); + DisplayWindowPadding = ImTrunc(DisplayWindowPadding * scale_factor); + DisplaySafeAreaPadding = ImTrunc(DisplaySafeAreaPadding * scale_factor); + MouseCursorScale = ImTrunc(MouseCursorScale * scale_factor); } ImGuiIO::ImGuiIO() @@ -1208,16 +1323,10 @@ ImGuiIO::ImGuiIO() IniSavingRate = 5.0f; IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables). LogFilename = "imgui_log.txt"; - MouseDoubleClickTime = 0.30f; - MouseDoubleClickMaxDist = 6.0f; #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO for (int i = 0; i < ImGuiKey_COUNT; i++) KeyMap[i] = -1; #endif - KeyRepeatDelay = 0.275f; - KeyRepeatRate = 0.050f; - HoverDelayNormal = 0.30f; - HoverDelayShort = 0.10f; UserData = NULL; Fonts = NULL; @@ -1226,6 +1335,12 @@ ImGuiIO::ImGuiIO() FontAllowUserScaling = false; DisplayFramebufferScale = ImVec2(1.0f, 1.0f); + MouseDoubleClickTime = 0.30f; + MouseDoubleClickMaxDist = 6.0f; + MouseDragThreshold = 6.0f; + KeyRepeatDelay = 0.275f; + KeyRepeatRate = 0.050f; + // Miscellaneous options MouseDrawCursor = false; #ifdef __APPLE__ @@ -1247,12 +1362,12 @@ ImGuiIO::ImGuiIO() // Note: Initialize() will setup default clipboard/ime handlers. BackendPlatformName = BackendRendererName = NULL; BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL; + PlatformLocaleDecimalPoint = '.'; // Input (NB: we already have memset zero the entire structure!) MousePos = ImVec2(-FLT_MAX, -FLT_MAX); MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); MouseSource = ImGuiMouseSource_Mouse; - MouseDragThreshold = 6.0f; for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; } AppAcceptingEvents = true; @@ -1327,13 +1442,15 @@ void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) } } -// FIXME: Perhaps we could clear queued events as well? -void ImGuiIO::ClearInputCharacters() +// Clear all incoming events. +void ImGuiIO::ClearEventsQueue() { - InputQueueCharacters.resize(0); + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + g.InputEventsQueue.clear(); } -// FIXME: Perhaps we could clear queued events as well? +// Clear current keyboard/mouse/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons. void ImGuiIO::ClearInputKeys() { #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -1354,7 +1471,17 @@ void ImGuiIO::ClearInputKeys() MouseDownDuration[n] = MouseDownDurationPrev[n] = -1.0f; } MouseWheel = MouseWheelH = 0.0f; + InputQueueCharacters.resize(0); // Behavior of old ClearInputCharacters(). +} + +// Removed this as it is ambiguous/misleading and generally incorrect to use with the existence of a higher-level input queue. +// Current frame character buffer is now also cleared by ClearInputKeys(). +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +void ImGuiIO::ClearInputCharacters() +{ + InputQueueCharacters.resize(0); } +#endif static ImGuiInputEvent* FindLatestInputEvent(ImGuiContext* ctx, ImGuiInputEventType type, int arg = -1) { @@ -1378,7 +1505,7 @@ static ImGuiInputEvent* FindLatestInputEvent(ImGuiContext* ctx, ImGuiInputEventT // - bool down: Is the key down? use false to signify a key release. // - float analog_value: 0.0f..1.0f // IMPORTANT: THIS FUNCTION AND OTHER "ADD" GRABS THE CONTEXT FROM OUR INSTANCE. -// WE NEED TO ENSURE THAT ALL FUNCTION CALLS ARE FULLFILLING THIS, WHICH IS WHY GetKeyData() HAS AN EXPLICIT CONTEXT. +// WE NEED TO ENSURE THAT ALL FUNCTION CALLS ARE FULFILLING THIS, WHICH IS WHY GetKeyData() HAS AN EXPLICIT CONTEXT. void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) { //if (e->Down) { IMGUI_DEBUG_LOG_IO("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); } @@ -1386,9 +1513,19 @@ void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) if (key == ImGuiKey_None || !AppAcceptingEvents) return; ImGuiContext& g = *Ctx; - IM_ASSERT(ImGui::IsNamedKeyOrModKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. + IM_ASSERT(ImGui::IsNamedKeyOrMod(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. IM_ASSERT(ImGui::IsAliasKey(key) == false); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events. - IM_ASSERT(key != ImGuiMod_Shortcut); // We could easily support the translation here but it seems saner to not accept it (TestEngine perform a translation itself) + + // MacOS: swap Cmd(Super) and Ctrl + if (g.IO.ConfigMacOSXBehaviors) + { + if (key == ImGuiMod_Super) { key = ImGuiMod_Ctrl; } + else if (key == ImGuiMod_Ctrl) { key = ImGuiMod_Super; } + else if (key == ImGuiKey_LeftSuper) { key = ImGuiKey_LeftCtrl; } + else if (key == ImGuiKey_RightSuper){ key = ImGuiKey_RightCtrl; } + else if (key == ImGuiKey_LeftCtrl) { key = ImGuiKey_LeftSuper; } + else if (key == ImGuiKey_RightCtrl) { key = ImGuiKey_RightSuper; } + } // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data. #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -1467,7 +1604,7 @@ void ImGuiIO::AddMousePosEvent(float x, float y) return; // Apply same flooring as UpdateMouseInputs() - ImVec2 pos((x > -FLT_MAX) ? ImFloorSigned(x) : x, (y > -FLT_MAX) ? ImFloorSigned(y) : y); + ImVec2 pos((x > -FLT_MAX) ? ImFloor(x) : x, (y > -FLT_MAX) ? ImFloor(y) : y); // Filter duplicate const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MousePos); @@ -1481,7 +1618,7 @@ void ImGuiIO::AddMousePosEvent(float x, float y) e.EventId = g.InputEventsNextEventId++; e.MousePos.PosX = pos.x; e.MousePos.PosY = pos.y; - e.MouseWheel.MouseSource = g.InputEventsNextMouseSource; + e.MousePos.MouseSource = g.InputEventsNextMouseSource; g.InputEventsQueue.push_back(e); } @@ -1493,19 +1630,43 @@ void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down) if (!AppAcceptingEvents) return; + // On MacOS X: Convert Ctrl(Super)+Left click into Right-click: handle held button. + if (ConfigMacOSXBehaviors && mouse_button == 0 && MouseCtrlLeftAsRightClick) + { + // Order of both statements matterns: this event will still release mouse button 1 + mouse_button = 1; + if (!down) + MouseCtrlLeftAsRightClick = false; + } + // Filter duplicate const ImGuiInputEvent* latest_event = FindLatestInputEvent(&g, ImGuiInputEventType_MouseButton, (int)mouse_button); const bool latest_button_down = latest_event ? latest_event->MouseButton.Down : g.IO.MouseDown[mouse_button]; if (latest_button_down == down) return; + // On MacOS X: Convert Ctrl(Super)+Left click into Right-click. + // - Note that this is actual physical Ctrl which is ImGuiMod_Super for us. + // - At this point we want from !down to down, so this is handling the initial press. + if (ConfigMacOSXBehaviors && mouse_button == 0 && down) + { + const ImGuiInputEvent* latest_super_event = FindLatestInputEvent(&g, ImGuiInputEventType_Key, (int)ImGuiMod_Super); + if (latest_super_event ? latest_super_event->Key.Down : g.IO.KeySuper) + { + IMGUI_DEBUG_LOG_IO("[io] Super+Left Click aliased into Right Click\n"); + MouseCtrlLeftAsRightClick = true; + AddMouseButtonEvent(1, true); // This is just quicker to write that passing through, as we need to filter duplicate again. + return; + } + } + ImGuiInputEvent e; e.Type = ImGuiInputEventType_MouseButton; e.Source = ImGuiInputSource_Mouse; e.EventId = g.InputEventsNextEventId++; e.MouseButton.Button = mouse_button; e.MouseButton.Down = down; - e.MouseWheel.MouseSource = g.InputEventsNextMouseSource; + e.MouseButton.MouseSource = g.InputEventsNextMouseSource; g.InputEventsQueue.push_back(e); } @@ -1808,13 +1969,15 @@ const char* ImStrSkipBlank(const char* str) // and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are // designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) #ifdef IMGUI_USE_STB_SPRINTF +#ifndef IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION #define STB_SPRINTF_IMPLEMENTATION +#endif #ifdef IMGUI_STB_SPRINTF_FILENAME #include IMGUI_STB_SPRINTF_FILENAME #else #include "stb_sprintf.h" #endif -#endif +#endif // #ifdef IMGUI_USE_STB_SPRINTF #if defined(_MSC_VER) && !defined(vsnprintf) #define vsnprintf _vsnprintf @@ -1856,21 +2019,9 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) { - ImGuiContext& g = *GImGui; va_list args; va_start(args, fmt); - if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) - { - const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" - *out_buf = buf; - if (out_buf_end) { *out_buf_end = buf + strlen(buf); } - } - else - { - int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); - *out_buf = g.TempBuffer.Data; - if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } - } + ImFormatStringToTempBufferV(out_buf, out_buf_end, fmt, args); va_end(args); } @@ -1880,9 +2031,23 @@ void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) { const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" + if (buf == NULL) + buf = "(null)"; *out_buf = buf; if (out_buf_end) { *out_buf_end = buf + strlen(buf); } } + else if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '*' && fmt[3] == 's' && fmt[4] == 0) + { + int buf_len = va_arg(args, int); // Skip formatting when using "%.*s" + const char* buf = va_arg(args, const char*); + if (buf == NULL) + { + buf = "(null)"; + buf_len = ImMin(buf_len, 6); + } + *out_buf = buf; + *out_buf_end = buf + buf_len; // Disallow not passing 'out_buf_end' here. User is expected to use it. + } else { int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); @@ -1975,11 +2140,18 @@ ImFileHandle ImFileOpen(const char* filename, const char* mode) // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); - ImVector buf; - buf.resize(filename_wsize + mode_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); - ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); - return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); + + // Use stack buffer if possible, otherwise heap buffer. Sizes include zero terminator. + // We don't rely on current ImGuiContext as this is implied to be a helper function which doesn't depend on it (see #7314). + wchar_t local_temp_stack[FILENAME_MAX]; + ImVector local_temp_heap; + if (filename_wsize + mode_wsize > IM_ARRAYSIZE(local_temp_stack)) + local_temp_heap.resize(filename_wsize + mode_wsize); + wchar_t* filename_wbuf = local_temp_heap.Data ? local_temp_heap.Data : local_temp_stack; + wchar_t* mode_wbuf = filename_wbuf + filename_wsize; + ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_wbuf, filename_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, mode_wbuf, mode_wsize); + return ::_wfopen(filename_wbuf, mode_wbuf); #else return fopen(filename, mode); #endif @@ -2211,6 +2383,32 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e } return bytes_count; } + +const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr) +{ + while (in_text_curr > in_text_start) + { + in_text_curr--; + if ((*in_text_curr & 0xC0) != 0x80) + return in_text_curr; + } + return in_text_start; +} + +int ImTextCountLines(const char* in_text, const char* in_text_end) +{ + if (in_text_end == NULL) + in_text_end = in_text + strlen(in_text); // FIXME-OPT: Not optimal approach, discourage use for now. + int count = 0; + while (in_text < in_text_end) + { + const char* line_end = (const char*)memchr(in_text, '\n', in_text_end - in_text); + in_text = line_end ? line_end + 1 : in_text_end; + count++; + } + return count; +} + IM_MSVC_RUNTIME_CHECKS_RESTORE //----------------------------------------------------------------------------- @@ -2406,11 +2604,9 @@ void ImGuiStorage::SetInt(ImGuiID key, int val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_i = val; + else + it->val_i = val; } void ImGuiStorage::SetBool(ImGuiID key, bool val) @@ -2422,22 +2618,18 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_f = val; + else + it->val_f = val; } void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) { ImGuiStoragePair* it = LowerBound(Data, key); if (it == Data.end() || it->key != key) - { Data.insert(it, ImGuiStoragePair(key, val)); - return; - } - it->val_p = val; + else + it->val_p = val; } void ImGuiStorage::SetAllInt(int v) @@ -2497,16 +2689,15 @@ void ImGuiTextFilter::Build() input_range.split(',', &Filters); CountGrep = 0; - for (int i = 0; i != Filters.Size; i++) + for (ImGuiTextRange& f : Filters) { - ImGuiTextRange& f = Filters[i]; while (f.b < f.e && ImCharIsBlankA(f.b[0])) f.b++; while (f.e > f.b && ImCharIsBlankA(f.e[-1])) f.e--; if (f.empty()) continue; - if (Filters[i].b[0] != '-') + if (f.b[0] != '-') CountGrep += 1; } } @@ -2519,9 +2710,8 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const if (text == NULL) text = ""; - for (int i = 0; i != Filters.Size; i++) + for (const ImGuiTextRange& f : Filters) { - const ImGuiTextRange& f = Filters[i]; if (f.empty()) continue; if (f.b[0] == '-') @@ -2630,8 +2820,6 @@ void ImGuiTextIndex::append(const char* base, int old_size, int new_size) //----------------------------------------------------------------------------- // [SECTION] ImGuiListClipper -// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed -// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) //----------------------------------------------------------------------------- // FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. @@ -2642,54 +2830,6 @@ static bool GetSkipItemForListClipping() return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); } -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS -// Legacy helper to calculate coarse clipping of large list of evenly sized items. -// This legacy API is not ideal because it assumes we will return a single contiguous rectangle. -// Prefer using ImGuiListClipper which can returns non-contiguous ranges. -void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (g.LogEnabled) - { - // If logging is active, do not perform any clipping - *out_items_display_start = 0; - *out_items_display_end = items_count; - return; - } - if (GetSkipItemForListClipping()) - { - *out_items_display_start = *out_items_display_end = 0; - return; - } - - // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect - // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly. - ImRect rect = window->ClipRect; - if (g.NavMoveScoringItems) - rect.Add(g.NavScoringNoClipRect); - if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) - rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel - - const ImVec2 pos = window->DC.CursorPos; - int start = (int)((rect.Min.y - pos.y) / items_height); - int end = (int)((rect.Max.y - pos.y) / items_height); - - // When performing a navigation request, ensure we have one item extra in the direction we are moving to - // FIXME: Verify this works with tabbing - const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) - start--; - if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) - end++; - - start = ImClamp(start, 0, items_count); - end = ImClamp(end + 1, start, items_count); - *out_items_display_start = start; - *out_items_display_end = end; -} -#endif - static void ImGuiListClipper_SortAndFuseRanges(ImVector& ranges, int offset = 0) { if (ranges.Size - offset <= 1) @@ -2751,9 +2891,6 @@ static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int it ImGuiListClipper::ImGuiListClipper() { memset(this, 0, sizeof(*this)); - Ctx = ImGui::GetCurrentContext(); - IM_ASSERT(Ctx != NULL); - ItemsCount = -1; } ImGuiListClipper::~ImGuiListClipper() @@ -2763,6 +2900,9 @@ ImGuiListClipper::~ImGuiListClipper() void ImGuiListClipper::Begin(int items_count, float items_height) { + if (Ctx == NULL) + Ctx = ImGui::GetCurrentContext(); + ImGuiContext& g = *Ctx; ImGuiWindow* window = g.CurrentWindow; IMGUI_DEBUG_LOG_CLIPPER("Clipper: Begin(%d,%.2f) in '%s'\n", items_count, items_height, window->Name); @@ -2788,10 +2928,10 @@ void ImGuiListClipper::Begin(int items_count, float items_height) void ImGuiListClipper::End() { - ImGuiContext& g = *Ctx; if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData) { // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user. + ImGuiContext& g = *Ctx; IMGUI_DEBUG_LOG_CLIPPER("Clipper: End() in '%s'\n", g.CurrentWindow->Name); if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0) ImGuiListClipper_SeekCursorForItem(this, ItemsCount); @@ -2809,7 +2949,7 @@ void ImGuiListClipper::End() ItemsCount = -1; } -void ImGuiListClipper::IncludeRangeByIndices(int item_begin, int item_end) +void ImGuiListClipper::IncludeItemsByIndex(int item_begin, int item_end) { ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet. @@ -2892,7 +3032,7 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); if (is_nav_request) data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0)); - if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1) + if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && g.NavTabbingDir == -1) data->Ranges.push_back(ImGuiListClipperRange::FromIndices(clipper->ItemsCount - 1, clipper->ItemsCount)); // Add focused/active item @@ -2910,26 +3050,28 @@ static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) // - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping. // - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list, // which with the flooring/ceiling tend to lead to 2 items instead of one being submitted. - for (int i = 0; i < data->Ranges.Size; i++) - if (data->Ranges[i].PosToIndexConvert) + for (ImGuiListClipperRange& range : data->Ranges) + if (range.PosToIndexConvert) { - int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight); - int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f); - data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1); - data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, clipper->ItemsCount); - data->Ranges[i].PosToIndexConvert = false; + int m1 = (int)(((double)range.Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight); + int m2 = (int)((((double)range.Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f); + range.Min = ImClamp(already_submitted + m1 + range.PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1); + range.Max = ImClamp(already_submitted + m2 + range.PosToIndexOffsetMax, range.Min + 1, clipper->ItemsCount); + range.PosToIndexConvert = false; } ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo); } // Step 0+ (if item height is given in advance) or 1+: Display the next range in line. - if (data->StepNo < data->Ranges.Size) + while (data->StepNo < data->Ranges.Size) { clipper->DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted); clipper->DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, clipper->ItemsCount); if (clipper->DisplayStart > already_submitted) //-V1051 ImGuiListClipper_SeekCursorForItem(clipper, clipper->DisplayStart); data->StepNo++; + if (clipper->DisplayStart == clipper->DisplayEnd && data->StepNo < data->Ranges.Size) + continue; return true; } @@ -2996,13 +3138,14 @@ const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) return style.Colors[idx]; } -ImU32 ImGui::GetColorU32(ImU32 col) +ImU32 ImGui::GetColorU32(ImU32 col, float alpha_mul) { ImGuiStyle& style = GImGui->Style; - if (style.Alpha >= 1.0f) + alpha_mul *= style.Alpha; + if (alpha_mul >= 1.0f) return col; ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; - a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. + a = (ImU32)(a * alpha_mul); // We don't need to clamp 0..255 because alpha is in 0..1 range. return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); } @@ -3014,7 +3157,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) backup.Col = idx; backup.BackupValue = g.Style.Colors[idx]; g.ColorStack.push_back(backup); - g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); + if (g.DebugFlashStyleColorIdx != idx) + g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); } void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) @@ -3024,7 +3168,8 @@ void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) backup.Col = idx; backup.BackupValue = g.Style.Colors[idx]; g.ColorStack.push_back(backup); - g.Style.Colors[idx] = col; + if (g.DebugFlashStyleColorIdx != idx) + g.Style.Colors[idx] = col; } void ImGui::PopStyleColor(int count) @@ -3032,7 +3177,7 @@ void ImGui::PopStyleColor(int count) ImGuiContext& g = *GImGui; if (g.ColorStack.Size < count) { - IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times: stack underflow."); + IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times!"); count = g.ColorStack.Size; } while (count > 0) @@ -3046,34 +3191,38 @@ void ImGui::PopStyleColor(int count) static const ImGuiDataVarInfo GStyleVarInfo[] = { - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextBorderSize) },// ImGuiStyleVar_SeparatorTextBorderSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBorderSize) }, // ImGuiStyleVar_TabBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TabBarBorderSize) }, // ImGuiStyleVar_TabBarBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersAngle)}, // ImGuiStyleVar_TableAngledHeadersAngle + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, TableAngledHeadersTextAlign)},// ImGuiStyleVar_TableAngledHeadersTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImGuiStyle, SeparatorTextBorderSize)}, // ImGuiStyleVar_SeparatorTextBorderSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding }; const ImGuiDataVarInfo* ImGui::GetStyleVarInfo(ImGuiStyleVar idx) @@ -3094,7 +3243,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) *pvar = val; return; } - IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); + IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!"); } void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) @@ -3108,7 +3257,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) *pvar = val; return; } - IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); + IM_ASSERT_USER_ERROR(0, "Calling PushStyleVar() variant with wrong type!"); } void ImGui::PopStyleVar(int count) @@ -3116,7 +3265,7 @@ void ImGui::PopStyleVar(int count) ImGuiContext& g = *GImGui; if (g.StyleVarStack.Size < count) { - IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times: stack underflow."); + IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times!"); count = g.StyleVarStack.Size; } while (count > 0) @@ -3351,7 +3500,7 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con // Render text, render ellipsis RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); - ImVec2 ellipsis_pos = ImFloor(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y)); + ImVec2 ellipsis_pos = ImTrunc(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y)); if (ellipsis_pos.x + ellipsis_width <= ellipsis_max_x) for (int i = 0; i < font->EllipsisCharCount; i++, ellipsis_pos.x += font->EllipsisCharStep * font_scale) font->RenderChar(draw_list, font_size, ellipsis_pos, GetColorU32(ImGuiCol_Text), font->EllipsisChar); @@ -3405,22 +3554,22 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding; ImRect display_rect = bb; display_rect.ClipWith(window->ClipRect); - if (flags & ImGuiNavHighlightFlags_TypeDefault) + const float thickness = 2.0f; + if (flags & ImGuiNavHighlightFlags_Compact) { - const float THICKNESS = 2.0f; - const float DISTANCE = 3.0f + THICKNESS * 0.5f; - display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness); + } + else + { + const float distance = 3.0f + thickness * 0.5f; + display_rect.Expand(ImVec2(distance, distance)); bool fully_visible = window->ClipRect.Contains(display_rect); if (!fully_visible) window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); - window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness); if (!fully_visible) window->DrawList->PopClipRect(); } - if (flags & ImGuiNavHighlightFlags_TypeThin) - { - window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); - } } void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) @@ -3428,13 +3577,12 @@ void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCurso ImGuiContext& g = *GImGui; IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor. ImVec2 offset, size, uv[4]; if (!font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) continue; - ImGuiViewportP* viewport = g.Viewports[n]; const ImVec2 pos = base_pos - offset; const float scale = base_scale; if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale))) @@ -3510,6 +3658,7 @@ void ImGui::DestroyContext(ImGuiContext* ctx) // IMPORTANT: ###xxx suffixes must be same in ALL languages static const ImGuiLocEntry GLocalizationEntriesEnUS[] = { + { ImGuiLocKey_VersionStr, "Dear ImGui " IMGUI_VERSION " (" IM_STRINGIFY(IMGUI_VERSION_NUM) ")" }, { ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" }, { ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" }, { ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" }, @@ -3549,9 +3698,18 @@ void ImGui::Initialize() // Create default viewport ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); + viewport->ID = IMGUI_VIEWPORT_DEFAULT_ID; g.Viewports.push_back(viewport); g.TempBuffer.resize(1024 * 3 + 1, 0); + // Build KeysMayBeCharInput[] lookup table (1 bool per named key) + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + if ((key >= ImGuiKey_0 && key <= ImGuiKey_9) || (key >= ImGuiKey_A && key <= ImGuiKey_Z) || (key >= ImGuiKey_Keypad0 && key <= ImGuiKey_Keypad9) + || key == ImGuiKey_Tab || key == ImGuiKey_Space || key == ImGuiKey_Apostrophe || key == ImGuiKey_Comma || key == ImGuiKey_Minus || key == ImGuiKey_Period + || key == ImGuiKey_Slash || key == ImGuiKey_Semicolon || key == ImGuiKey_Equal || key == ImGuiKey_LeftBracket || key == ImGuiKey_RightBracket || key == ImGuiKey_GraveAccent + || key == ImGuiKey_KeypadDecimal || key == ImGuiKey_KeypadDivide || key == ImGuiKey_KeypadMultiply || key == ImGuiKey_KeypadSubtract || key == ImGuiKey_KeypadAdd || key == ImGuiKey_KeypadEqual) + g.KeysMayBeCharInput.SetBit(key); + #ifdef IMGUI_HAS_DOCK #endif @@ -3561,8 +3719,11 @@ void ImGui::Initialize() // This function is merely here to free heap allocations. void ImGui::Shutdown() { - // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) ImGuiContext& g = *GImGui; + IM_ASSERT_USER_ERROR(g.IO.BackendPlatformUserData == NULL, "Forgot to shutdown Platform backend?"); + IM_ASSERT_USER_ERROR(g.IO.BackendRendererUserData == NULL, "Forgot to shutdown Renderer backend?"); + + // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) if (g.IO.Fonts && g.FontAtlasOwnedByContext) { g.IO.Fonts->Locked = false; @@ -3600,6 +3761,7 @@ void ImGui::Shutdown() g.FontStack.clear(); g.OpenPopupStack.clear(); g.BeginPopupStack.clear(); + g.NavTreeNodeStack.clear(); g.Viewports.clear_delete(); @@ -3651,9 +3813,9 @@ void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) { ImGuiContext& g = *ctx; IM_ASSERT(hook_id != 0); - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].HookId == hook_id) - g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; + for (ImGuiContextHook& hook : g.Hooks) + if (hook.HookId == hook_id) + hook.Type = ImGuiContextHookType_PendingRemoval_; } // Call context hooks (used by e.g. test engine) @@ -3661,9 +3823,9 @@ void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) { ImGuiContext& g = *ctx; - for (int n = 0; n < g.Hooks.Size; n++) - if (g.Hooks[n].Type == hook_type) - g.Hooks[n].Callback(&g, &g.Hooks[n]); + for (ImGuiContextHook& hook : g.Hooks) + if (hook.Type == hook_type) + hook.Callback(&g, &hook); } @@ -3705,50 +3867,12 @@ ImGuiWindow::~ImGuiWindow() ColumnsStorage.clear_destruct(); } -ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); - return id; -} - -ImGuiID ImGuiWindow::GetID(const void* ptr) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); - return id; -} - -ImGuiID ImGuiWindow::GetID(int n) -{ - ImGuiID seed = IDStack.back(); - ImGuiID id = ImHashData(&n, sizeof(n), seed); - ImGuiContext& g = *Ctx; - if (g.DebugHookIdInfo == id) - ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); - return id; -} - -// This is only used in rare/specific situations to manufacture an ID out of nowhere. -ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) -{ - ImGuiID seed = IDStack.back(); - ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); - ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); - return id; -} - static void SetCurrentWindow(ImGuiWindow* window) { ImGuiContext& g = *GImGui; g.CurrentWindow = window; g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; + g.CurrentDpiScale = 1.0f; // FIXME-DPI: WIP this is modified in docking if (window) { g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); @@ -3833,6 +3957,7 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) g.ActiveIdNoClearOnFocusLoss = false; g.ActiveIdWindow = window; g.ActiveIdHasBeenEditedThisFrame = false; + g.ActiveIdFromShortcut = false; if (id) { g.ActiveIdIsAlive = id; @@ -3869,22 +3994,13 @@ ImGuiID ImGui::GetHoveredID() return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame; } -// This is called by ItemAdd(). -// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). -void ImGui::KeepAliveID(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - if (g.ActiveId == id) - g.ActiveIdIsAlive = id; - if (g.ActiveIdPreviousFrame == id) - g.ActiveIdPreviousFrameIsAlive = true; -} - void ImGui::MarkItemEdited(ImGuiID id) { // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit(). // ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need to fill the data. ImGuiContext& g = *GImGui; + if (g.LockMarkEdited > 0) + return; if (g.ActiveId == id || g.ActiveId == 0) { g.ActiveIdHasBeenEditedThisFrame = true; @@ -3924,6 +4040,24 @@ bool ImGui::IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flag return true; } +static inline float CalcDelayFromHoveredFlags(ImGuiHoveredFlags flags) +{ + ImGuiContext& g = *GImGui; + if (flags & ImGuiHoveredFlags_DelayNormal) + return g.Style.HoverDelayNormal; + if (flags & ImGuiHoveredFlags_DelayShort) + return g.Style.HoverDelayShort; + return 0.0f; +} + +static ImGuiHoveredFlags ApplyHoverFlagsForTooltip(ImGuiHoveredFlags user_flags, ImGuiHoveredFlags shared_flags) +{ + // Allow instance flags to override shared flags + if (user_flags & (ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal)) + shared_flags &= ~(ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal); + return user_flags | shared_flags; +} + // This is roughly matching the behavior of internal-facing ItemHoverable() // - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() // - this should work even for non-interactive items that have no ID, so we cannot use LastItemId @@ -3931,12 +4065,17 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT((flags & ~ImGuiHoveredFlags_AllowedMaskForIsItemHovered) == 0 && "Invalid flags for IsItemHovered()!"); + if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride)) { if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) return false; if (!IsItemFocused()) return false; + + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipNav); } else { @@ -3944,6 +4083,10 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags; if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) return false; + + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse); + IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function // Done with rectangle culling so we can perform heavier checks now @@ -3953,12 +4096,13 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was // the test that has been running for a long while. if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) - if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByWindow) == 0) return false; // Test if another item is active (e.g. being dragged) + const ImGuiID id = g.LastItemData.ID; if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) - if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) return false; // Test if interactions on this window are blocked by an active popup or modal. @@ -3972,48 +4116,61 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) // Special handling for calling after Begin() which represent the title bar or tab. // When the window is skipped/collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. - if (g.LastItemData.ID == window->MoveId && window->WriteAccessed) + if (id == window->MoveId && window->WriteAccessed) return false; + + // Test if using AllowOverlap and overlapped + if ((g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap) && id != 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlappedByItem) == 0) + if (g.HoveredIdPreviousFrame != g.LastItemData.ID) + return false; } // Handle hover delay // (some ideas: https://www.nngroup.com/articles/timing-exposing-content) - float delay; - if (flags & ImGuiHoveredFlags_DelayNormal) - delay = g.IO.HoverDelayNormal; - else if (flags & ImGuiHoveredFlags_DelayShort) - delay = g.IO.HoverDelayShort; - else - delay = 0.0f; - if (delay > 0.0f) + const float delay = CalcDelayFromHoveredFlags(flags); + if (delay > 0.0f || (flags & ImGuiHoveredFlags_Stationary)) { ImGuiID hover_delay_id = (g.LastItemData.ID != 0) ? g.LastItemData.ID : window->GetIDFromRectangle(g.LastItemData.Rect); - if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverDelayIdPreviousFrame != hover_delay_id)) - g.HoverDelayTimer = 0.0f; - g.HoverDelayId = hover_delay_id; - return g.HoverDelayTimer >= delay; + if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverItemDelayIdPreviousFrame != hover_delay_id)) + g.HoverItemDelayTimer = 0.0f; + g.HoverItemDelayId = hover_delay_id; + + // When changing hovered item we requires a bit of stationary delay before activating hover timer, + // but once unlocked on a given item we also moving. + //if (g.HoverDelayTimer >= delay && (g.HoverDelayTimer - g.IO.DeltaTime < delay || g.MouseStationaryTimer - g.IO.DeltaTime < g.Style.HoverStationaryDelay)) { IMGUI_DEBUG_LOG("HoverDelayTimer = %f/%f, MouseStationaryTimer = %f\n", g.HoverDelayTimer, delay, g.MouseStationaryTimer); } + if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverItemUnlockedStationaryId != hover_delay_id) + return false; + + if (g.HoverItemDelayTimer < delay) + return false; } return true; } // Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). -bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) +// (this does not rely on LastItemData it can be called from a ButtonBehavior() call not following an ItemAdd() call) +// FIXME-LEGACY: the 'ImGuiItemFlags item_flags' parameter was added on 2023-06-28. +// If you used this in your legacy/custom widgets code: +// - Commonly: if your ItemHoverable() call comes after an ItemAdd() call: pass 'item_flags = g.LastItemData.InFlags'. +// - Rare: otherwise you may pass 'item_flags = 0' (ImGuiItemFlags_None) unless you want to benefit from special behavior handled by ItemHoverable. +bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags) { ImGuiContext& g = *GImGui; - if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) - return false; - ImGuiWindow* window = g.CurrentWindow; if (g.HoveredWindow != window) return false; - if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) - return false; if (!IsMouseHoveringRect(bb.Min, bb.Max)) return false; + if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) + return false; + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) + if (!g.ActiveIdFromShortcut) + return false; + // Done with rectangle culling so we can perform heavier checks now. - ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) { g.HoveredIdDisabled = true; @@ -4023,29 +4180,51 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level // hover test in widgets code. We could also decide to split this function is two. if (id != 0) + { + // Drag source doesn't report as hovered + if (g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) + return false; + SetHoveredID(id); + // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. + // This allows using patterns where a later submitted widget overlaps a previous one. Generally perceived as a front-to-back hit-test. + if (item_flags & ImGuiItemFlags_AllowOverlap) + { + g.HoveredIdAllowOverlap = true; + if (g.HoveredIdPreviousFrame != id) + return false; + } + + // Display shortcut (only works with mouse) + if (id == g.LastItemData.ID && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasShortcut)) + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_DelayNormal)) + SetTooltip("%s", GetKeyChordName(g.LastItemData.Shortcut)); + } + // When disabled we'll return false but still set HoveredId if (item_flags & ImGuiItemFlags_Disabled) { // Release active id if turning disabled - if (g.ActiveId == id) + if (g.ActiveId == id && id != 0) ClearActiveID(); g.HoveredIdDisabled = true; return false; } +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (id != 0) { // [DEBUG] Item Picker tool! - // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making - // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered - // items if we performed the test in ItemAdd(), but that would incur a small runtime cost. + // We perform the check here because reaching is path is rare (1~ time a frame), + // making the cost of this tool near-zero! We could get better call-stack and support picking non-hovered + // items if we performed the test in ItemAdd(), but that would incur a bigger runtime cost. if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); if (g.DebugItemPickerBreakId == id) IM_DEBUG_BREAK(); } +#endif if (g.NavDisableMouseHover) return false; @@ -4054,13 +4233,14 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) } // FIXME: This is inlined/duplicated in ItemAdd() +// FIXME: The id != 0 path is not used by our codebase, may get rid of it? bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (!bb.Overlaps(window->ClipRect)) - if (id == 0 || (id != g.ActiveId && id != g.NavId)) - if (!g.LogEnabled) + if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId)) + if (!g.ItemUnclipByLog) return true; return false; } @@ -4103,20 +4283,51 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) // IM_ALLOC() == ImGui::MemAlloc() void* ImGui::MemAlloc(size_t size) { + void* ptr = (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations++; - return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); + DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, size); +#endif + return ptr; } // IM_FREE() == ImGui::MemFree() void ImGui::MemFree(void* ptr) { - if (ptr) +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (ptr != NULL) if (ImGuiContext* ctx = GImGui) - ctx->IO.MetricsActiveAllocations--; + DebugAllocHook(&ctx->DebugAllocInfo, ctx->FrameCount, ptr, (size_t)-1); +#endif return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); } +// We record the number of allocation in recent frames, as a way to audit/sanitize our guiding principles of "no allocations on idle/repeating frames" +void ImGui::DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size) +{ + ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[info->LastEntriesIdx]; + IM_UNUSED(ptr); + if (entry->FrameCount != frame_count) + { + info->LastEntriesIdx = (info->LastEntriesIdx + 1) % IM_ARRAYSIZE(info->LastEntriesBuf); + entry = &info->LastEntriesBuf[info->LastEntriesIdx]; + entry->FrameCount = frame_count; + entry->AllocCount = entry->FreeCount = 0; + } + if (size != (size_t)-1) + { + entry->AllocCount++; + info->TotalAllocCount++; + //printf("[%05d] MemAlloc(%d) -> 0x%p\n", frame_count, size, ptr); + } + else + { + entry->FreeCount++; + info->TotalFreeCount++; + //printf("[%05d] MemFree(0x%p)\n", frame_count, ptr); + } +} + const char* ImGui::GetClipboardText() { ImGuiContext& g = *GImGui; @@ -4159,33 +4370,33 @@ int ImGui::GetFrameCount() return GImGui->FrameCount; } -static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) +static ImDrawList* GetViewportBgFgDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) { // Create the draw list on demand, because they are not frequently used for all viewports ImGuiContext& g = *GImGui; - IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); - ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; + IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->BgFgDrawLists)); + ImDrawList* draw_list = viewport->BgFgDrawLists[drawlist_no]; if (draw_list == NULL) { draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); draw_list->_OwnerName = drawlist_name; - viewport->DrawLists[drawlist_no] = draw_list; + viewport->BgFgDrawLists[drawlist_no] = draw_list; } // Our ImDrawList system requires that there is always a command - if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) + if (viewport->BgFgDrawListsLastFrame[drawlist_no] != g.FrameCount) { draw_list->_ResetForNewFrame(); draw_list->PushTextureID(g.IO.Fonts->TexID); draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); - viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; + viewport->BgFgDrawListsLastFrame[drawlist_no] = g.FrameCount; } return draw_list; } ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) { - return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); + return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 0, "##Background"); } ImDrawList* ImGui::GetBackgroundDrawList() @@ -4196,7 +4407,7 @@ ImDrawList* ImGui::GetBackgroundDrawList() ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) { - return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); + return GetViewportBgFgDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); } ImDrawList* ImGui::GetForegroundDrawList() @@ -4333,6 +4544,9 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() { ImGuiContext& g = *GImGui; ImGuiIO& io = g.IO; + + // FIXME-DPI: This storage was added on 2021/03/31 for test engine, but if we want to multiply WINDOWS_HOVER_PADDING + // by DpiScale, we need to make this window-agnostic anyhow, maybe need storing inside ImGuiWindow. g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING)); // Find the window hovered by mouse: @@ -4340,7 +4554,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. bool clear_hovered_windows = false; - FindHoveredWindow(); + FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow); // Modal windows prevents mouse from hovering behind them. ImGuiWindow* modal_window = GetTopMostPopupModal(); @@ -4394,17 +4608,37 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags() } // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app) - if (g.WantCaptureKeyboardNextFrame != -1) - io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); - else - io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); + io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)) io.WantCaptureKeyboard = true; + if (g.WantCaptureKeyboardNextFrame != -1) // Manual override + io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); // Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; } +// Calling SetupDrawListSharedData() is followed by SetCurrentFont() which sets up the remaining data. +static void SetupDrawListSharedData() +{ + ImGuiContext& g = *GImGui; + ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (ImGuiViewportP* viewport : g.Viewports) + virtual_space.Add(viewport->GetMainRect()); + g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); + g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; + g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); + g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; + if (g.Style.AntiAliasedLines) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; + if (g.Style.AntiAliasedLinesUseTex && !(g.IO.Fonts->Flags & ImFontAtlasFlags_NoBakedLines)) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; + if (g.Style.AntiAliasedFill) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; + if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; +} + void ImGui::NewFrame() { IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); @@ -4447,30 +4681,13 @@ void ImGui::NewFrame() // Setup current font and draw list shared data g.IO.Fonts->Locked = true; + SetupDrawListSharedData(); SetCurrentFont(GetDefaultFont()); IM_ASSERT(g.Font->IsLoaded()); - ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - virtual_space.Add(g.Viewports[n]->GetMainRect()); - g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); - g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; - g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); - g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; - if (g.Style.AntiAliasedLines) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; - if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; - if (g.Style.AntiAliasedFill) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; - if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) - g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; // Mark rendering data as invalid to prevent user who may have a handle on it to use it. - for (int n = 0; n < g.Viewports.Size; n++) - { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataP.Clear(); - } + for (ImGuiViewportP* viewport : g.Viewports) + viewport->DrawDataP.Valid = false; // Drag and drop keep the source ID alive so even if the source disappear our state is consistent if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) @@ -4535,21 +4752,33 @@ void ImGui::NewFrame() } #endif + // Record when we have been stationary as this state is preserved while over same item. + // FIXME: The way this is expressed means user cannot alter HoverStationaryDelay during the frame to use varying values. + // To allow this we should store HoverItemMaxStationaryTime+ID and perform the >= check in IsItemHovered() function. + if (g.HoverItemDelayId != 0 && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay) + g.HoverItemUnlockedStationaryId = g.HoverItemDelayId; + else if (g.HoverItemDelayId == 0) + g.HoverItemUnlockedStationaryId = 0; + if (g.HoveredWindow != NULL && g.MouseStationaryTimer >= g.Style.HoverStationaryDelay) + g.HoverWindowUnlockedStationaryId = g.HoveredWindow->ID; + else if (g.HoveredWindow == NULL) + g.HoverWindowUnlockedStationaryId = 0; + // Update hover delay for IsItemHovered() with delays and tooltips - g.HoverDelayIdPreviousFrame = g.HoverDelayId; - if (g.HoverDelayId != 0) + g.HoverItemDelayIdPreviousFrame = g.HoverItemDelayId; + if (g.HoverItemDelayId != 0) { - //if (g.IO.MouseDelta.x == 0.0f && g.IO.MouseDelta.y == 0.0f) // Need design/flags - g.HoverDelayTimer += g.IO.DeltaTime; - g.HoverDelayClearTimer = 0.0f; - g.HoverDelayId = 0; + g.HoverItemDelayTimer += g.IO.DeltaTime; + g.HoverItemDelayClearTimer = 0.0f; + g.HoverItemDelayId = 0; } - else if (g.HoverDelayTimer > 0.0f) + else if (g.HoverItemDelayTimer > 0.0f) { // This gives a little bit of leeway before clearing the hover timer, allowing mouse to cross gaps - g.HoverDelayClearTimer += g.IO.DeltaTime; - if (g.HoverDelayClearTimer >= ImMax(0.20f, g.IO.DeltaTime * 2.0f)) // ~6 frames at 30 Hz + allow for low framerate - g.HoverDelayTimer = g.HoverDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer. + // We could expose 0.25f as style.HoverClearDelay but I am not sure of the logic yet, this is particularly subtle. + g.HoverItemDelayClearTimer += g.IO.DeltaTime; + if (g.HoverItemDelayClearTimer >= ImMax(0.25f, g.IO.DeltaTime * 2.0f)) // ~7 frames at 30 Hz + allow for low framerate + g.HoverItemDelayTimer = g.HoverItemDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer. } // Drag and drop @@ -4604,9 +4833,8 @@ void ImGui::NewFrame() // Mark all windows as not visible and compact unused memory. IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size); const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; window->WasActive = window->Active; window->Active = false; window->WriteAccessed = false; @@ -4622,9 +4850,9 @@ void ImGui::NewFrame() for (int i = 0; i < g.TablesLastTimeActive.Size; i++) if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); - for (int i = 0; i < g.TablesTempData.Size; i++) - if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time) - TableGcCompactTransientBuffers(&g.TablesTempData[i]); + for (ImGuiTableTempData& table_temp_data : g.TablesTempData) + if (table_temp_data.LastTimeActive >= 0.0f && table_temp_data.LastTimeActive < memory_compact_start_time) + TableGcCompactTransientBuffers(&table_temp_data); if (g.GcCompactAll) GcCompactTransientMiscBuffers(); g.GcCompactAll = false; @@ -4642,15 +4870,22 @@ void ImGui::NewFrame() g.GroupStack.resize(0); // [DEBUG] Update debug features +#ifndef IMGUI_DISABLE_DEBUG_TOOLS UpdateDebugToolItemPicker(); UpdateDebugToolStackQueries(); + UpdateDebugToolFlashStyleColor(); if (g.DebugLocateFrames > 0 && --g.DebugLocateFrames == 0) + { g.DebugLocateId = 0; - if (g.DebugLogClipperAutoDisableFrames > 0 && --g.DebugLogClipperAutoDisableFrames == 0) + g.DebugBreakInLocateId = false; + } + if (g.DebugLogAutoDisableFrames > 0 && --g.DebugLogAutoDisableFrames == 0) { - DebugLog("(Auto-disabled ImGuiDebugLogFlags_EventClipper to avoid spamming)\n"); - g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper; + DebugLog("(Debug Log: Auto-disabled some ImGuiDebugLogFlags after 2 frames)\n"); + g.DebugLogFlags &= ~g.DebugLogAutoDisableFlags; + g.DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None; } +#endif // Create implicit/fallback window - which we will only render it if the user has added something to it. // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. @@ -4662,10 +4897,12 @@ void ImGui::NewFrame() // [DEBUG] When io.ConfigDebugBeginReturnValue is set, we make Begin()/BeginChild() return false at different level of the window-stack, // allowing to validate correct Begin/End behavior in user code. +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (g.IO.ConfigDebugBeginReturnValueLoop) g.DebugBeginReturnValueCullDepth = (g.DebugBeginReturnValueCullDepth == -1) ? 0 : ((g.DebugBeginReturnValueCullDepth + ((g.FrameCount % 4) == 0 ? 1 : 0)) % 10); else g.DebugBeginReturnValueCullDepth = -1; +#endif CallContextHooks(&g, ImGuiContextHookType_NewFramePost); } @@ -4698,53 +4935,17 @@ static void AddWindowToSortBuffer(ImVector* out_sorted_windows, Im } } -static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list) -{ - if (draw_list->CmdBuffer.Size == 0) - return; - if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) - return; - - // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. - // May trigger for you if you are using PrimXXX functions incorrectly. - IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); - IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); - if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) - IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); - - // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) - // If this assert triggers because you are drawing lots of stuff manually: - // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. - // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. - // - If you want large meshes with more than 64K vertices, you can either: - // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. - // Most example backends already support this from 1.71. Pre-1.71 backends won't. - // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. - // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. - // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: - // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); - // Your own engine or render API may use different parameters or function calls to specify index sizes. - // 2 and 4 bytes indices are generally supported by most graphics API. - // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching - // the 64K limit to split your draw commands in multiple draw lists. - if (sizeof(ImDrawIdx) == 2) - IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); - - out_list->push_back(draw_list); -} - static void AddWindowToDrawData(ImGuiWindow* window, int layer) { ImGuiContext& g = *GImGui; ImGuiViewportP* viewport = g.Viewports[0]; g.IO.MetricsRenderWindows++; - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); - for (int i = 0; i < window->DC.ChildWindows.Size; i++) - { - ImGuiWindow* child = window->DC.ChildWindows[i]; + if (window->DrawList->_Splitter._Count > 1) + window->DrawList->ChannelsMerge(); // Merge if user forgot to merge back. Also required in Docking branch for ImGuiWindowFlags_DockNodeHost windows. + ImGui::AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[layer], window->DrawList); + for (ImGuiWindow* child : window->DC.ChildWindows) if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active AddWindowToDrawData(child, layer); - } } static inline int GetWindowDisplayLayer(ImGuiWindow* window) @@ -4758,42 +4959,41 @@ static inline void AddRootWindowToDrawData(ImGuiWindow* window) AddWindowToDrawData(window, GetWindowDisplayLayer(window)); } -void ImDrawDataBuilder::FlattenIntoSingleLayer() +static void FlattenDrawDataIntoSingleLayer(ImDrawDataBuilder* builder) { - int n = Layers[0].Size; - int size = n; - for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) - size += Layers[i].Size; - Layers[0].resize(size); - for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) + int n = builder->Layers[0]->Size; + int full_size = n; + for (int i = 1; i < IM_ARRAYSIZE(builder->Layers); i++) + full_size += builder->Layers[i]->Size; + builder->Layers[0]->resize(full_size); + for (int layer_n = 1; layer_n < IM_ARRAYSIZE(builder->Layers); layer_n++) { - ImVector& layer = Layers[layer_n]; - if (layer.empty()) + ImVector* layer = builder->Layers[layer_n]; + if (layer->empty()) continue; - memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); - n += layer.Size; - layer.resize(0); + memcpy(builder->Layers[0]->Data + n, layer->Data, layer->Size * sizeof(ImDrawList*)); + n += layer->Size; + layer->resize(0); } } -static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector* draw_lists) +static void InitViewportDrawData(ImGuiViewportP* viewport) { ImGuiIO& io = ImGui::GetIO(); ImDrawData* draw_data = &viewport->DrawDataP; + + viewport->DrawDataBuilder.Layers[0] = &draw_data->CmdLists; + viewport->DrawDataBuilder.Layers[1] = &viewport->DrawDataBuilder.LayerData1; + viewport->DrawDataBuilder.Layers[0]->resize(0); + viewport->DrawDataBuilder.Layers[1]->resize(0); + draw_data->Valid = true; - draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; - draw_data->CmdListsCount = draw_lists->Size; + draw_data->CmdListsCount = 0; draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; draw_data->DisplayPos = viewport->Pos; draw_data->DisplaySize = viewport->Size; draw_data->FramebufferScale = io.DisplayFramebufferScale; - for (int n = 0; n < draw_lists->Size; n++) - { - ImDrawList* draw_list = draw_lists->Data[n]; - draw_list->_PopUnusedDrawCmd(); - draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; - draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; - } + draw_data->OwnerViewport = viewport; } // Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. @@ -4832,14 +5032,14 @@ static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 ImDrawList* draw_list = window->RootWindow->DrawList; if (draw_list->CmdBuffer.Size == 0) draw_list->AddDrawCmd(); - draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged + draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // FIXME: Need to stricty ensure ImDrawCmd are not merged (ElemCount==6 checks below will verify that) draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); ImDrawCmd cmd = draw_list->CmdBuffer.back(); IM_ASSERT(cmd.ElemCount == 6); draw_list->CmdBuffer.pop_back(); draw_list->CmdBuffer.push_front(cmd); - draw_list->PopClipRect(); draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command. + draw_list->PopClipRect(); } } @@ -4875,7 +5075,7 @@ static void ImGui::RenderDimmedBackgrounds() { // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); - RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); + RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(modal_window->DC.ModalDimBgColor, g.DimBgRatio)); } else if (dim_bg_for_window_list) { @@ -4919,18 +5119,7 @@ void ImGui::EndFrame() { IMGUI_DEBUG_LOG_IO("[io] Calling io.SetPlatformImeDataFn(): WantVisible: %d, InputPos (%.2f,%.2f)\n", ime_data->WantVisible, ime_data->InputPos.x, ime_data->InputPos.y); ImGuiViewport* viewport = GetMainViewport(); -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - if (viewport->PlatformHandleRaw == NULL && g.IO.ImeWindowHandle != NULL) - { - viewport->PlatformHandleRaw = g.IO.ImeWindowHandle; - g.IO.SetPlatformImeDataFn(viewport, ime_data); - viewport->PlatformHandleRaw = NULL; - } - else -#endif - { - g.IO.SetPlatformImeDataFn(viewport, ime_data); - } + g.IO.SetPlatformImeDataFn(viewport, ime_data); } // Hide implicit/fallback "Debug" window if it hasn't been used @@ -4970,9 +5159,8 @@ void ImGui::EndFrame() // We cannot do that on FocusWindow() because children may not exist yet g.WindowsTempSortBuffer.resize(0); g.WindowsTempSortBuffer.reserve(g.Windows.Size); - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it continue; AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); @@ -4987,6 +5175,7 @@ void ImGui::EndFrame() g.IO.Fonts->Locked = false; // Clear Input data for next frame + g.IO.MousePosPrev = g.IO.MousePos; g.IO.AppFocusLost = false; g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; g.IO.InputQueueCharacters.resize(0); @@ -5004,32 +5193,30 @@ void ImGui::Render() if (g.FrameCountEnded != g.FrameCount) EndFrame(); - const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount); + if (g.FrameCountRendered == g.FrameCount) + return; g.FrameCountRendered = g.FrameCount; - g.IO.MetricsRenderWindows = 0; + g.IO.MetricsRenderWindows = 0; CallContextHooks(&g, ImGuiContextHookType_RenderPre); + // Draw modal/window whitening backgrounds + RenderDimmedBackgrounds(); + // Add background ImDrawList (for each active viewport) - for (int n = 0; n != g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.Clear(); - if (viewport->DrawLists[0] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); + InitViewportDrawData(viewport); + if (viewport->BgFgDrawLists[0] != NULL) + AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); } - // Draw modal/window whitening backgrounds - if (first_render_of_frame) - RenderDimmedBackgrounds(); - // Add ImDrawList to render ImGuiWindow* windows_to_render_top_most[2]; windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); - for (int n = 0; n != g.Windows.Size; n++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[n]; IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) AddRootWindowToDrawData(window); @@ -5039,22 +5226,25 @@ void ImGui::Render() AddRootWindowToDrawData(windows_to_render_top_most[n]); // Draw software mouse cursor if requested by io.MouseDrawCursor flag - if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None) + if (g.IO.MouseDrawCursor && g.MouseCursor != ImGuiMouseCursor_None) RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); // Setup ImDrawData structures for end-user g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; - viewport->DrawDataBuilder.FlattenIntoSingleLayer(); + FlattenDrawDataIntoSingleLayer(&viewport->DrawDataBuilder); // Add foreground ImDrawList (for each active viewport) - if (viewport->DrawLists[1] != NULL) - AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); + if (viewport->BgFgDrawLists[1] != NULL) + AddDrawListToDrawDataEx(&viewport->DrawDataP, viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); - SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); + // We call _PopUnusedDrawCmd() last thing, as RenderDimmedBackgrounds() rely on a valid command being there (especially in docking branch). ImDrawData* draw_data = &viewport->DrawDataP; + IM_ASSERT(draw_data->CmdLists.Size == draw_data->CmdListsCount); + for (ImDrawList* draw_list : draw_data->CmdLists) + draw_list->_PopUnusedDrawCmd(); + g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; } @@ -5085,22 +5275,24 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex // FIXME: Investigate using ceilf or e.g. // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html - text_size.x = IM_FLOOR(text_size.x + 0.99999f); + text_size.x = IM_TRUNC(text_size.x + 0.99999f); return text_size; } // Find window given position, search front-to-back -// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically -// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is -// called, aka before the next Begin(). Moving window isn't affected. -static void FindHoveredWindow() +// - Typically write output back to g.HoveredWindow and g.HoveredWindowUnderMovingWindow. +// - FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically +// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is +// called, aka before the next Begin(). Moving window isn't affected. +// - The 'find_first_and_in_any_viewport = true' mode is only used by TestEngine. It is simpler to maintain here. +void ImGui::FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window) { ImGuiContext& g = *GImGui; - ImGuiWindow* hovered_window = NULL; - ImGuiWindow* hovered_window_ignoring_moving_window = NULL; - if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) + ImGuiWindow* hovered_window_under_moving_window = NULL; + + if (find_first_and_in_any_viewport == false && g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) hovered_window = g.MovingWindow; ImVec2 padding_regular = g.Style.TouchExtraPadding; @@ -5115,12 +5307,8 @@ static void FindHoveredWindow() continue; // Using the clipped AABB, a child window will typically be clipped by its parent (not always) - ImRect bb(window->OuterRectClipped); - if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) - bb.Expand(padding_regular); - else - bb.Expand(padding_for_resize); - if (!bb.Contains(g.IO.MousePos)) + ImVec2 hit_padding = (window->Flags & (ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) ? padding_regular : padding_for_resize; + if (!window->OuterRectClipped.ContainsWithPad(pos, hit_padding)) continue; // Support for one rectangular hole in any given window @@ -5129,21 +5317,30 @@ static void FindHoveredWindow() { ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); - if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) + if (ImRect(hole_pos, hole_pos + hole_size).Contains(pos)) continue; } - if (hovered_window == NULL) + if (find_first_and_in_any_viewport) + { hovered_window = window; - IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. - if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) - hovered_window_ignoring_moving_window = window; - if (hovered_window && hovered_window_ignoring_moving_window) break; + } + else + { + if (hovered_window == NULL) + hovered_window = window; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (hovered_window_under_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) + hovered_window_under_moving_window = window; + if (hovered_window && hovered_window_under_moving_window) + break; + } } - g.HoveredWindow = hovered_window; - g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; + *out_hovered_window = hovered_window; + if (out_hovered_window_under_moving_window != NULL) + *out_hovered_window_under_moving_window = hovered_window_under_moving_window; } bool ImGui::IsItemActive() @@ -5205,6 +5402,9 @@ bool ImGui::IsItemToggledSelection() return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; } +// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, +// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! +// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. bool ImGui::IsAnyItemHovered() { ImGuiContext& g = *GImGui; @@ -5235,17 +5435,28 @@ bool ImGui::IsItemEdited() return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0; } +// Allow next item to be overlapped by subsequent items. +// This works by requiring HoveredId to match for two subsequent frames, +// so if a following items overwrite it our interactions will naturally be disabled. +void ImGui::SetNextItemAllowOverlap() +{ + ImGuiContext& g = *GImGui; + g.NextItemData.ItemFlags |= ImGuiItemFlags_AllowOverlap; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. -// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. +// FIXME-LEGACY: Use SetNextItemAllowOverlap() *before* your item instead. void ImGui::SetItemAllowOverlap() { ImGuiContext& g = *GImGui; ImGuiID id = g.LastItemData.ID; if (g.HoveredId == id) g.HoveredIdAllowOverlap = true; - if (g.ActiveId == id) + if (g.ActiveId == id) // Before we made this obsolete, most calls to SetItemAllowOverlap() used to avoid this path by testing g.ActiveId != id. g.ActiveIdAllowOverlap = true; } +#endif // FIXME: It might be undesirable that this will likely disable KeyOwner-aware shortcuts systems. Consider a more fine-tuned version for the two users of this function. void ImGui::SetActiveIdUsingAllKeyboardKeys() @@ -5281,40 +5492,105 @@ ImVec2 ImGui::GetItemRectSize() return g.LastItemData.Rect.GetSize(); } -bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) +// Prior to v1.90 2023/10/16, the BeginChild() function took a 'bool border = false' parameter instead of 'ImGuiChildFlags child_flags = 0'. +// ImGuiChildFlags_Border is defined as always == 1 in order to allow old code passing 'true'. Read comments in imgui.h for details! +bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) +{ + ImGuiID id = GetCurrentWindow()->GetID(str_id); + return BeginChildEx(str_id, id, size_arg, child_flags, window_flags); +} + +bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) +{ + return BeginChildEx(NULL, id, size_arg, child_flags, window_flags); +} + +bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags) { ImGuiContext& g = *GImGui; ImGuiWindow* parent_window = g.CurrentWindow; + IM_ASSERT(id != 0); - flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; - flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag - - // Size - const ImVec2 content_avail = GetContentRegionAvail(); - ImVec2 size = ImFloor(size_arg); - const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); - if (size.x <= 0.0f) - size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too many issues) - if (size.y <= 0.0f) - size.y = ImMax(content_avail.y + size.y, 4.0f); + // Sanity check as it is likely that some user will accidentally pass ImGuiWindowFlags into the ImGuiChildFlags argument. + const ImGuiChildFlags ImGuiChildFlags_SupportedMask_ = ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_FrameStyle; + IM_UNUSED(ImGuiChildFlags_SupportedMask_); + IM_ASSERT((child_flags & ~ImGuiChildFlags_SupportedMask_) == 0 && "Illegal ImGuiChildFlags value. Did you pass ImGuiWindowFlags values instead of ImGuiChildFlags?"); + IM_ASSERT((window_flags & ImGuiWindowFlags_AlwaysAutoResize) == 0 && "Cannot specify ImGuiWindowFlags_AlwaysAutoResize for BeginChild(). Use ImGuiChildFlags_AlwaysAutoResize!"); + if (child_flags & ImGuiChildFlags_AlwaysAutoResize) + { + IM_ASSERT((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0 && "Cannot use ImGuiChildFlags_ResizeX or ImGuiChildFlags_ResizeY with ImGuiChildFlags_AlwaysAutoResize!"); + IM_ASSERT((child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY)) != 0 && "Must use ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY with ImGuiChildFlags_AlwaysAutoResize!"); + } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (window_flags & ImGuiWindowFlags_AlwaysUseWindowPadding) + child_flags |= ImGuiChildFlags_AlwaysUseWindowPadding; +#endif + if (child_flags & ImGuiChildFlags_AutoResizeX) + child_flags &= ~ImGuiChildFlags_ResizeX; + if (child_flags & ImGuiChildFlags_AutoResizeY) + child_flags &= ~ImGuiChildFlags_ResizeY; + + // Set window flags + window_flags |= ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoTitleBar; + window_flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag + if (child_flags & (ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize)) + window_flags |= ImGuiWindowFlags_AlwaysAutoResize; + if ((child_flags & (ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY)) == 0) + window_flags |= ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; + + // Special framed style + if (child_flags & ImGuiChildFlags_FrameStyle) + { + PushStyleColor(ImGuiCol_ChildBg, g.Style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, g.Style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, g.Style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.FramePadding); + child_flags |= ImGuiChildFlags_Border | ImGuiChildFlags_AlwaysUseWindowPadding; + window_flags |= ImGuiWindowFlags_NoMove; + } + + // Forward child flags + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasChildFlags; + g.NextWindowData.ChildFlags = child_flags; + + // Forward size + // Important: Begin() has special processing to switch condition to ImGuiCond_FirstUseEver for a given axis when ImGuiChildFlags_ResizeXXX is set. + // (the alternative would to store conditional flags per axis, which is possible but more code) + const ImVec2 size_avail = GetContentRegionAvail(); + const ImVec2 size_default((child_flags & ImGuiChildFlags_AutoResizeX) ? 0.0f : size_avail.x, (child_flags & ImGuiChildFlags_AutoResizeY) ? 0.0f : size_avail.y); + const ImVec2 size = CalcItemSize(size_arg, size_default.x, size_default.y); SetNextWindowSize(size); // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. + // FIXME: 2023/11/14: commented out shorted version. We had an issue with multiple ### in child window path names, which the trailing hash helped workaround. + // e.g. "ParentName###ParentIdentifier/ChildName###ChildIdentifier" would get hashed incorrectly by ImHashStr(), trailing _%08X somehow fixes it. const char* temp_window_name; + /*if (name && parent_window->IDStack.back() == parent_window->ID) + ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s", parent_window->Name, name); // May omit ID if in root of ID stack + else*/ if (name) ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s_%08X", parent_window->Name, name, id); else ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%08X", parent_window->Name, id); + // Set style const float backup_border_size = g.Style.ChildBorderSize; - if (!border) + if ((child_flags & ImGuiChildFlags_Border) == 0) g.Style.ChildBorderSize = 0.0f; - bool ret = Begin(temp_window_name, NULL, flags); + + // Begin into window + const bool ret = Begin(temp_window_name, NULL, window_flags); + + // Restore style g.Style.ChildBorderSize = backup_border_size; + if (child_flags & ImGuiChildFlags_FrameStyle) + { + PopStyleVar(3); + PopStyleColor(); + } ImGuiWindow* child_window = g.CurrentWindow; child_window->ChildId = id; - child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. // While this is not really documented/defined, it seems that the expected thing to do. @@ -5322,11 +5598,11 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b parent_window->DC.CursorPos = child_window->Pos; // Process navigation-in immediately so NavInit can run on first frame - // Can enter a child if (A) it has navigatable items or (B) it can be scrolled. - const ImGuiID temp_id_for_activation = (id + 1); + // Can enter a child if (A) it has navigable items or (B) it can be scrolled. + const ImGuiID temp_id_for_activation = ImHashStr("##Child", 0, id); if (g.ActiveId == temp_id_for_activation) ClearActiveID(); - if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY)) + if (g.NavActivateId == id && !(window_flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY)) { FocusWindow(child_window); NavInitWindow(child_window, false); @@ -5336,88 +5612,49 @@ bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, b return ret; } -bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - ImGuiWindow* window = GetCurrentWindow(); - return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); -} - -bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) -{ - IM_ASSERT(id != 0); - return BeginChildEx(NULL, id, size_arg, border, extra_flags); -} - void ImGui::EndChild() { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; + ImGuiWindow* child_window = g.CurrentWindow; IM_ASSERT(g.WithinEndChild == false); - IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls + IM_ASSERT(child_window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls g.WithinEndChild = true; - if (window->BeginCount > 1) - { - End(); - } - else + ImVec2 child_size = child_window->Size; + End(); + if (child_window->BeginCount == 1) { - ImVec2 sz = window->Size; - if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f - sz.x = ImMax(4.0f, sz.x); - if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) - sz.y = ImMax(4.0f, sz.y); - End(); - ImGuiWindow* parent_window = g.CurrentWindow; - ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); - ItemSize(sz); - if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavWindowHasScrollY) && !(window->Flags & ImGuiWindowFlags_NavFlattened)) + ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + child_size); + ItemSize(child_size); + if ((child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavWindowHasScrollY) && !(child_window->Flags & ImGuiWindowFlags_NavFlattened)) { - ItemAdd(bb, window->ChildId); - RenderNavHighlight(bb, window->ChildId); + ItemAdd(bb, child_window->ChildId); + RenderNavHighlight(bb, child_window->ChildId); // When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying) - if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow) - RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); + if (child_window->DC.NavLayersActiveMask == 0 && child_window == g.NavWindow) + RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_Compact); } else { // Not navigable into - ItemAdd(bb, 0); + // - This is a bit of a fringe use case, mostly useful for undecorated, non-scrolling contents childs, or empty childs. + // - We could later decide to not apply this path if ImGuiChildFlags_FrameStyle or ImGuiChildFlags_Borders is set. + ItemAdd(bb, child_window->ChildId, NULL, ImGuiItemFlags_NoNav); // But when flattened we directly reach items, adjust active layer mask accordingly - if (window->Flags & ImGuiWindowFlags_NavFlattened) - parent_window->DC.NavLayersActiveMaskNext |= window->DC.NavLayersActiveMaskNext; + if (child_window->Flags & ImGuiWindowFlags_NavFlattened) + parent_window->DC.NavLayersActiveMaskNext |= child_window->DC.NavLayersActiveMaskNext; } - if (g.HoveredWindow == window) + if (g.HoveredWindow == child_window) g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; } g.WithinEndChild = false; g.LogLinePosY = -FLT_MAX; // To enforce a carriage return } -// Helper to create a child window / scrolling region that looks like a normal widget frame. -bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); - PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); - PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); - PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); - bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); - PopStyleVar(3); - PopStyleColor(); - return ret; -} - -void ImGui::EndChildFrame() -{ - EndChild(); -} - static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) { window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); @@ -5439,9 +5676,9 @@ ImGuiWindow* ImGui::FindWindowByName(const char* name) static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) { - window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); + window->Pos = ImTrunc(ImVec2(settings->Pos.x, settings->Pos.y)); if (settings->Size.x > 0 && settings->Size.y > 0) - window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); + window->Size = window->SizeFull = ImTrunc(ImVec2(settings->Size.x, settings->Size.y)); window->Collapsed = settings->Collapsed; } @@ -5474,6 +5711,7 @@ static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* s // Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); window->Pos = main_viewport->Pos + ImVec2(60, 60); + window->Size = window->SizeFull = ImVec2(0, 0); window->SetWindowPosAllowFlags = window->SetWindowSizeAllowFlags = window->SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; if (settings != NULL) @@ -5522,13 +5760,37 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) return window; } +static inline ImVec2 CalcWindowMinSize(ImGuiWindow* window) +{ + // We give windows non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) + // FIXME: Essentially we want to restrict manual resizing to WindowMinSize+Decoration, and allow api resizing to be smaller. + // Perhaps should tend further a neater test for this. + ImGuiContext& g = *GImGui; + ImVec2 size_min; + if ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup)) + { + size_min.x = (window->ChildFlags & ImGuiChildFlags_ResizeX) ? g.Style.WindowMinSize.x : 4.0f; + size_min.y = (window->ChildFlags & ImGuiChildFlags_ResizeY) ? g.Style.WindowMinSize.y : 4.0f; + } + else + { + size_min.x = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.x : 4.0f; + size_min.y = ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) == 0) ? g.Style.WindowMinSize.y : 4.0f; + } + + // Reduce artifacts with very small windows + ImGuiWindow* window_for_height = window; + size_min.y = ImMax(size_min.y, window_for_height->TitleBarHeight + window_for_height->MenuBarHeight + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); + return size_min; +} + static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) { ImGuiContext& g = *GImGui; ImVec2 new_size = size_desired; if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) { - // Using -1,-1 on either X/Y axis to preserve the current size. + // See comments in SetNextWindowSizeConstraints() for details about setting size_min an size_max. ImRect cr = g.NextWindowData.SizeConstraintRect; new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; @@ -5542,19 +5804,13 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& s g.NextWindowData.SizeCallback(&data); new_size = data.DesiredSize; } - new_size.x = IM_FLOOR(new_size.x); - new_size.y = IM_FLOOR(new_size.y); + new_size.x = IM_TRUNC(new_size.x); + new_size.y = IM_TRUNC(new_size.y); } // Minimum size - if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) - { - ImGuiWindow* window_for_height = window; - new_size = ImMax(new_size, g.Style.WindowMinSize); - const float minimum_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f); - new_size.y = ImMax(new_size.y, minimum_height); // Reduce artifacts with very small windows - } - return new_size; + ImVec2 size_min = CalcWindowMinSize(window); + return ImMax(new_size, size_min); } static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) @@ -5571,10 +5827,10 @@ static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_cur return; } - content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); - content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); - content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); - content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); + content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); + content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); + content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_TRUNC(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); + content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_TRUNC(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); } static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) @@ -5593,19 +5849,22 @@ static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_cont else { // Maximum window size is determined by the viewport size or monitor size - const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; - const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; - ImVec2 size_min = style.WindowMinSize; - if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) - size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); - - ImVec2 avail_size = ImGui::GetMainViewport()->WorkSize; - ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); + ImVec2 size_min = CalcWindowMinSize(window); + ImVec2 size_max = ((window->Flags & ImGuiWindowFlags_ChildWindow) && !(window->Flags & ImGuiWindowFlags_Popup)) ? ImVec2(FLT_MAX, FLT_MAX) : ImGui::GetMainViewport()->WorkSize - style.DisplaySafeAreaPadding * 2.0f; + ImVec2 size_auto_fit = ImClamp(size_desired, size_min, size_max); + + // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one axis may be auto-fit when calculating scrollbars, + // we may need to compute/store three variants of size_auto_fit, for x/y/xy. + // Here we implement a workaround for child windows only, but a full solution would apply to normal windows as well: + if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && !(window->ChildFlags & ImGuiChildFlags_ResizeY)) + size_auto_fit.y = window->SizeFull.y; + else if (!(window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->ChildFlags & ImGuiChildFlags_ResizeY)) + size_auto_fit.x = window->SizeFull.x; // When the window cannot fit all contents (either because of constraints, either because screen is too small), // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); - bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); + bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_h_without_scrollbars < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); if (will_have_scrollbar_x) size_auto_fit.y += style.ScrollbarSize; @@ -5648,7 +5907,7 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co *out_size = size_constrained; } -// Data for resizing from corner +// Data for resizing from resize grip / corner struct ImGuiResizeGripDef { ImVec2 CornerPosN; @@ -5666,9 +5925,9 @@ static const ImGuiResizeGripDef resize_grip_def[4] = // Data for resizing from borders struct ImGuiResizeBorderDef { - ImVec2 InnerDir; - ImVec2 SegmentN1, SegmentN2; - float OuterAngle; + ImVec2 InnerDir; // Normal toward inside + ImVec2 SegmentN1, SegmentN2; // End positions, normalized (0,0: upper left) + float OuterAngle; // Angle toward outside }; static const ImGuiResizeBorderDef resize_border_def[4] = { @@ -5714,7 +5973,7 @@ ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir) // Handle resize for: Resize Grips, Borders, Gamepad // Return true when using auto-fit (double-click on resize grip) -static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) +static int ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_hovered, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) { ImGuiContext& g = *GImGui; ImGuiWindowFlags flags = window->Flags; @@ -5724,16 +5983,15 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (window->WasActive == false) // Early out to avoid running this code for e.g. a hidden implicit/fallback Debug window. return false; - bool ret_auto_fit = false; - const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; - const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); - const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); + int ret_auto_fit_mask = 0x00; + const float grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const float grip_hover_inner_size = (resize_grip_count > 0) ? IM_TRUNC(grip_draw_size * 0.75f) : 0.0f; const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f; ImRect clamp_rect = visibility_rect; const bool window_move_from_title_bar = g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar); if (window_move_from_title_bar) - clamp_rect.Min.y -= window->TitleBarHeight(); + clamp_rect.Min.y -= window->TitleBarHeight; ImVec2 pos_target(FLT_MAX, FLT_MAX); ImVec2 size_target(FLT_MAX, FLT_MAX); @@ -5760,11 +6018,11 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (hovered || held) g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; - if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0) + if (held && g.IO.MouseDoubleClicked[0]) { - // Manual auto-fit when double-clicking + // Auto-fit when double-clicking size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); - ret_auto_fit = true; + ret_auto_fit_mask = 0x03; // Both axises ClearActiveID(); } else if (held) @@ -5782,8 +6040,16 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s if (resize_grip_n == 0 || held || hovered) resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); } - for (int border_n = 0; border_n < resize_border_count; border_n++) + + int resize_border_mask = 0x00; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + resize_border_mask |= ((window->ChildFlags & ImGuiChildFlags_ResizeX) ? 0x02 : 0) | ((window->ChildFlags & ImGuiChildFlags_ResizeY) ? 0x08 : 0); + else + resize_border_mask = g.IO.ConfigWindowsResizeFromEdges ? 0x0F : 0x00; + for (int border_n = 0; border_n < 4; border_n++) { + if ((resize_border_mask & (1 << border_n)) == 0) + continue; const ImGuiResizeBorderDef& def = resize_border_def[border_n]; const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y; @@ -5792,22 +6058,77 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID() ItemAdd(border_rect, border_id, NULL, ImGuiItemFlags_NoNav); ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); - //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); - if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) - { + //GetForegroundDrawList(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); + if (hovered && g.HoveredIdTimer <= WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) + hovered = false; + if (hovered || held) g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; - if (held) - *border_held = border_n; + if (held && g.IO.MouseDoubleClicked[0]) + { + // Double-clicking bottom or right border auto-fit on this axis + // FIXME: CalcWindowAutoFitSize() doesn't take into account that only one side may be auto-fit when calculating scrollbars. + // FIXME: Support top and right borders: rework CalcResizePosSizeFromAnyCorner() to be reusable in both cases. + if (border_n == 1 || border_n == 3) // Right and bottom border + { + size_target[axis] = CalcWindowSizeAfterConstraint(window, size_auto_fit)[axis]; + ret_auto_fit_mask |= (1 << axis); + hovered = held = false; // So border doesn't show highlighted at new position + } + ClearActiveID(); } - if (held) + else if (held) { + // Switch to relative resizing mode when border geometry moved (e.g. resizing a child altering parent scroll), in order to avoid resizing feedback loop. + // Currently only using relative mode on resizable child windows, as the problem to solve is more likely noticeable for them, but could apply for all windows eventually. + // FIXME: May want to generalize this idiom at lower-level, so more widgets can use it! + const bool just_scrolled_manually_while_resizing = (g.WheelingWindow != NULL && g.WheelingWindowScrolledFrame == g.FrameCount && IsWindowChildOf(window, g.WheelingWindow, false)); + if (g.ActiveIdIsJustActivated || just_scrolled_manually_while_resizing) + { + g.WindowResizeBorderExpectedRect = border_rect; + g.WindowResizeRelativeMode = false; + } + if ((window->Flags & ImGuiWindowFlags_ChildWindow) && memcmp(&g.WindowResizeBorderExpectedRect, &border_rect, sizeof(ImRect)) != 0) + g.WindowResizeRelativeMode = true; + + const ImVec2 border_curr = (window->Pos + ImMin(def.SegmentN1, def.SegmentN2) * window->Size); + const float border_target_rel_mode_for_axis = border_curr[axis] + g.IO.MouseDelta[axis]; + const float border_target_abs_mode_for_axis = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; // Match ButtonBehavior() padding above. + + // Use absolute mode position + ImVec2 border_target = window->Pos; + border_target[axis] = border_target_abs_mode_for_axis; + + // Use relative mode target for child window, ignore resize when moving back toward the ideal absolute position. + bool ignore_resize = false; + if (g.WindowResizeRelativeMode) + { + //GetForegroundDrawList()->AddText(GetMainViewport()->WorkPos, IM_COL32_WHITE, "Relative Mode"); + border_target[axis] = border_target_rel_mode_for_axis; + if (g.IO.MouseDelta[axis] == 0.0f || (g.IO.MouseDelta[axis] > 0.0f) == (border_target_rel_mode_for_axis > border_target_abs_mode_for_axis)) + ignore_resize = true; + } + + // Clamp, apply ImVec2 clamp_min(border_n == ImGuiDir_Right ? clamp_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down || (border_n == ImGuiDir_Up && window_move_from_title_bar) ? clamp_rect.Min.y : -FLT_MAX); ImVec2 clamp_max(border_n == ImGuiDir_Left ? clamp_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? clamp_rect.Max.y : +FLT_MAX); - ImVec2 border_target = window->Pos; - border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; border_target = ImClamp(border_target, clamp_min, clamp_max); - CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); + if (flags & ImGuiWindowFlags_ChildWindow) // Clamp resizing of childs within parent + { + ImGuiWindowFlags parent_flags = window->ParentWindow->Flags; + ImRect border_limit_rect = window->ParentWindow->InnerRect; + border_limit_rect.Expand(ImVec2(-ImMax(window->WindowPadding.x, window->WindowBorderSize), -ImMax(window->WindowPadding.y, window->WindowBorderSize))); + if ((parent_flags & (ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar)) == 0 || (parent_flags & ImGuiWindowFlags_NoScrollbar)) + border_target.x = ImClamp(border_target.x, border_limit_rect.Min.x, border_limit_rect.Max.x); + if (parent_flags & ImGuiWindowFlags_NoScrollbar) + border_target.y = ImClamp(border_target.y, border_limit_rect.Min.y, border_limit_rect.Max.y); + } + if (!ignore_resize) + CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); } + if (hovered) + *border_hovered = border_n; + if (held) + *border_held = border_n; } PopID(); @@ -5833,7 +6154,7 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s g.NavWindowingToggleLayer = false; g.NavDisableMouseHover = true; resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaSize); + ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaSize); if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) { // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. @@ -5844,19 +6165,24 @@ static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& s } // Apply back modified position/size to window - if (size_target.x != FLT_MAX) - { - window->SizeFull = size_target; - MarkIniSettingsDirty(window); - } - if (pos_target.x != FLT_MAX) - { - window->Pos = ImFloor(pos_target); + const ImVec2 curr_pos = window->Pos; + const ImVec2 curr_size = window->SizeFull; + if (size_target.x != FLT_MAX && (window->Size.x != size_target.x || window->SizeFull.x != size_target.x)) + window->Size.x = window->SizeFull.x = size_target.x; + if (size_target.y != FLT_MAX && (window->Size.y != size_target.y || window->SizeFull.y != size_target.y)) + window->Size.y = window->SizeFull.y = size_target.y; + if (pos_target.x != FLT_MAX && window->Pos.x != ImTrunc(pos_target.x)) + window->Pos.x = ImTrunc(pos_target.x); + if (pos_target.y != FLT_MAX && window->Pos.y != ImTrunc(pos_target.y)) + window->Pos.y = ImTrunc(pos_target.y); + if (curr_pos.x != window->Pos.x || curr_pos.y != window->Pos.y || curr_size.x != window->SizeFull.x || curr_size.y != window->SizeFull.y) MarkIniSettingsDirty(window); - } - window->Size = window->SizeFull; - return ret_auto_fit; + // Recalculate next expected border expected coordinates + if (*border_held != -1) + g.WindowResizeBorderExpectedRect = GetResizeBorderRect(window, *border_held, grip_hover_inner_size, WINDOWS_HOVER_PADDING); + + return ret_auto_fit_mask; } static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_rect) @@ -5864,31 +6190,44 @@ static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_ ImGuiContext& g = *GImGui; ImVec2 size_for_clamping = window->Size; if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) - size_for_clamping.y = window->TitleBarHeight(); + size_for_clamping.y = window->TitleBarHeight; window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); } +static void RenderWindowOuterSingleBorder(ImGuiWindow* window, int border_n, ImU32 border_col, float border_size) +{ + const ImGuiResizeBorderDef& def = resize_border_def[border_n]; + const float rounding = window->WindowRounding; + const ImRect border_r = GetResizeBorderRect(window, border_n, rounding, 0.0f); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); + window->DrawList->PathStroke(border_col, ImDrawFlags_None, border_size); +} + static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) { ImGuiContext& g = *GImGui; - float rounding = window->WindowRounding; - float border_size = window->WindowBorderSize; - if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) - window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); - - int border_held = window->ResizeBorderHeld; - if (border_held != -1) + const float border_size = window->WindowBorderSize; + const ImU32 border_col = GetColorU32(ImGuiCol_Border); + if (border_size > 0.0f && (window->Flags & ImGuiWindowFlags_NoBackground) == 0) + window->DrawList->AddRect(window->Pos, window->Pos + window->Size, border_col, window->WindowRounding, 0, window->WindowBorderSize); + else if (border_size > 0.0f) + { + if (window->ChildFlags & ImGuiChildFlags_ResizeX) // Similar code as 'resize_border_mask' computation in UpdateWindowManualResize() but we specifically only always draw explicit child resize border. + RenderWindowOuterSingleBorder(window, 1, border_col, border_size); + if (window->ChildFlags & ImGuiChildFlags_ResizeY) + RenderWindowOuterSingleBorder(window, 3, border_col, border_size); + } + if (window->ResizeBorderHovered != -1 || window->ResizeBorderHeld != -1) { - const ImGuiResizeBorderDef& def = resize_border_def[border_held]; - ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); - window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); - window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual + const int border_n = (window->ResizeBorderHeld != -1) ? window->ResizeBorderHeld : window->ResizeBorderHovered; + const ImU32 border_col_resizing = GetColorU32((window->ResizeBorderHeld != -1) ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered); + RenderWindowOuterSingleBorder(window, border_n, border_col_resizing, ImMax(2.0f, window->WindowBorderSize)); // Thicker than usual } if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) { - float y = window->Pos.y + window->TitleBarHeight() - 1; - window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize); + float y = window->Pos.y + window->TitleBarHeight - 1; + window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), border_col, g.Style.FrameBorderSize); } } @@ -5932,7 +6271,7 @@ void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar } if (override_alpha) bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); - window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); + window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); } // Title bar @@ -6006,18 +6345,18 @@ void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& titl ImVec2 collapse_button_pos; if (has_close_button) { - pad_r += button_sz; - close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y); + pad_r += button_sz + style.ItemInnerSpacing.x; } if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) { - pad_r += button_sz; - collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - button_sz, title_bar_rect.Min.y + style.FramePadding.y); + pad_r += button_sz + style.ItemInnerSpacing.x; } if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) { - collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); - pad_l += button_sz; + collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y + style.FramePadding.y); + pad_l += button_sz + style.ItemInnerSpacing.x; } // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) @@ -6087,18 +6426,43 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags } } +// [EXPERIMENTAL] Called by Begin(). NextWindowData is valid at this point. +// This is designed as a toy/test-bed for +void ImGui::UpdateWindowSkipRefresh(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + window->SkipRefresh = false; + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasRefreshPolicy) == 0) + return; + if (g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_TryToAvoidRefresh) + { + // FIXME-IDLE: Tests for e.g. mouse clicks or keyboard while focused. + if (window->Appearing) // If currently appearing + return; + if (window->Hidden) // If was hidden (previous frame) + return; + if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnHover) && g.HoveredWindow && window->RootWindow == g.HoveredWindow->RootWindow) + return; + if ((g.NextWindowData.RefreshFlagsVal & ImGuiWindowRefreshFlags_RefreshOnFocus) && g.NavWindow && window->RootWindow == g.NavWindow->RootWindow) + return; + window->DrawList = NULL; + window->SkipRefresh = true; + } +} + // When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing) // should be positioned behind that modal window, unless the window was created inside the modal begin-stack. // In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent. -// - Window // FindBlockingModal() returns Modal1 -// - Window // .. returns Modal1 +// - WindowA // FindBlockingModal() returns Modal1 +// - WindowB // .. returns Modal1 // - Modal1 // .. returns Modal2 -// - Window // .. returns Modal2 -// - Window // .. returns Modal2 +// - WindowC // .. returns Modal2 +// - WindowD // .. returns Modal2 // - Modal2 // .. returns Modal2 +// - WindowE // .. returns NULL // Notes: // - FindBlockingModal(NULL) == NULL is generally equivalent to GetTopMostPopupModal() == NULL. -// Only difference is here we check for ->Active/WasActive but it may be unecessary. +// Only difference is here we check for ->Active/WasActive but it may be unnecessary. ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) { ImGuiContext& g = *GImGui; @@ -6106,20 +6470,18 @@ ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) return NULL; // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal. - for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--) + for (ImGuiPopupData& popup_data : g.OpenPopupStack) { - ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window; + ImGuiWindow* popup_window = popup_data.Window; if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal)) continue; if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows. continue; if (window == NULL) // FindBlockingModal(NULL) test for if FocusWindow(NULL) is naturally possible via a mouse click. return popup_window; - if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed. - break; - for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow) - if (IsWindowWithinBeginStackOf(window, parent)) - return popup_window; // Place window above its begin stack parent. + if (IsWindowWithinBeginStackOf(window, popup_window)) // Window may be over modal + continue; + return popup_window; // Place window right below first block modal } return NULL; } @@ -6145,6 +6507,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (window_just_created) window = CreateNewWindow(name, flags); + // [DEBUG] Debug break requested by user + if (g.DebugBreakInWindow == window->ID) + IM_DEBUG_BREAK(); + // Automatically disable manual moving/resizing when NoInputs is set if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; @@ -6173,6 +6539,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { UpdateWindowInFocusOrderList(window, window_just_created, flags); window->Flags = (ImGuiWindowFlags)flags; + window->ChildFlags = (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasChildFlags) ? g.NextWindowData.ChildFlags : 0; window->LastFrameActive = current_frame; window->LastTimeActive = (float)g.Time; window->BeginOrderWithinParent = 0; @@ -6193,29 +6560,32 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->IDStack.push_back(window->ID); // Add to stack - // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() g.CurrentWindow = window; ImGuiWindowStackData window_stack_data; window_stack_data.Window = window; window_stack_data.ParentLastItemDataBackup = g.LastItemData; window_stack_data.StackSizesOnBegin.SetToContextState(&g); + window_stack_data.DisabledOverrideReenable = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; g.CurrentWindowStack.push_back(window_stack_data); if (flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount++; + g.BeginMenuDepth++; // Update ->RootWindow and others pointers (before any possible call to FocusWindow) if (first_begin_of_the_frame) { UpdateWindowParentAndRootLinks(window, flags, parent_window); window->ParentWindowInBeginStack = parent_window_in_stack; + + // There's little point to expose a flag to set this: because the interesting cases won't be using parent_window_in_stack, + // e.g. linking a tool window in a standalone viewport to a document window, regardless of their Begin() stack parenting. (#6798) + window->ParentWindowForFocusRoute = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window_in_stack : NULL; } // Add to focus scope stack - PushFocusScope(window->ID); + PushFocusScope((flags & ImGuiWindowFlags_NavFlattened) ? g.CurrentFocusScopeId : window->ID); window->NavRootFocusScopeId = g.CurrentFocusScopeId; - g.CurrentWindow = NULL; - // Add to popup stack + // Add to popup stacks: update OpenPopupStack[] data, push to BeginPopupStack[] if (flags & ImGuiWindowFlags_Popup) { ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; @@ -6249,6 +6619,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); + if ((window->ChildFlags & ImGuiChildFlags_ResizeX) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0) // Axis-specific conditions for BeginChild() + g.NextWindowData.SizeVal.x = window->SizeFull.x; + if ((window->ChildFlags & ImGuiChildFlags_ResizeY) && (window->SetWindowSizeAllowFlags & ImGuiCond_FirstUseEver) == 0) + g.NextWindowData.SizeVal.y = window->SizeFull.y; SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); } if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) @@ -6275,8 +6649,18 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (window->Appearing) SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); + // [EXPERIMENTAL] Skip Refresh mode + UpdateWindowSkipRefresh(window); + + // Nested root windows (typically tooltips) override disabled state + if (window_stack_data.DisabledOverrideReenable && window->RootWindow == window) + BeginDisabledOverrideReenable(); + + // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() + g.CurrentWindow = NULL; + // When reusing window again multiple times a frame, just append content (don't need to setup again) - if (first_begin_of_the_frame) + if (first_begin_of_the_frame && !window->SkipRefresh) { // Initialize const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) @@ -6348,15 +6732,23 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) else window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; window->WindowPadding = style.WindowPadding; - if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !(window->ChildFlags & ImGuiChildFlags_AlwaysUseWindowPadding) && window->WindowBorderSize == 0.0f) window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; + window->TitleBarHeight = (flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : g.FontSize + g.Style.FramePadding.y * 2.0f; + window->MenuBarHeight = (flags & ImGuiWindowFlags_MenuBar) ? window->DC.MenuBarOffset.y + g.FontSize + g.Style.FramePadding.y * 2.0f : 0.0f; + // Depending on condition we use previous or current window size to compare against contents size to decide if a scrollbar should be visible. + // Those flags will be altered further down in the function depending on more conditions. bool use_current_size_for_scrollbar_x = window_just_created; bool use_current_size_for_scrollbar_y = window_just_created; + if (window_size_x_set_by_api && window->ContentSizeExplicit.x != 0.0f) + use_current_size_for_scrollbar_x = true; + if (window_size_y_set_by_api && window->ContentSizeExplicit.y != 0.0f) // #7252 + use_current_size_for_scrollbar_y = true; // Collapse window by double-clicking on title bar // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing @@ -6364,8 +6756,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) { // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar. ImRect title_bar_rect = window->TitleBarRect(); - if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2) - window->WantCollapseToggle = true; + if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max)) + if (g.IO.MouseClickedCount[0] == 2 && GetKeyOwner(ImGuiKey_MouseLeft) == ImGuiKeyOwner_NoOwner) + window->WantCollapseToggle = true; if (window->WantCollapseToggle) { window->Collapsed = !window->Collapsed; @@ -6383,11 +6776,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // SIZE // Outer Decoration Sizes - // (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations). + // (we need to clear ScrollbarSize immediately as CalcWindowAutoFitSize() needs it and can be called from other locations). const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes; window->DecoOuterSizeX1 = 0.0f; window->DecoOuterSizeX2 = 0.0f; - window->DecoOuterSizeY1 = window->TitleBarHeight() + window->MenuBarHeight(); + window->DecoOuterSizeY1 = window->TitleBarHeight + window->MenuBarHeight; window->DecoOuterSizeY2 = 0.0f; window->ScrollbarSizes = ImVec2(0.0f, 0.0f); @@ -6471,7 +6864,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow)) if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) ClampWindowPos(window, visibility_rect); - window->Pos = ImFloor(window->Pos); + window->Pos = ImTrunc(window->Pos); // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) // Large values tend to lead to variety of artifacts and are not recommended. @@ -6504,13 +6897,19 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) #endif // Handle manual resize: Resize Grips, Borders, Gamepad - int border_held = -1; + int border_hovered = -1, border_held = -1; ImU32 resize_grip_col[4] = {}; - const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. - const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const int resize_grip_count = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup)) ? 0 : g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. + const float resize_grip_draw_size = IM_TRUNC(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); if (!window->Collapsed) - if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) - use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; + if (int auto_fit_mask = UpdateWindowManualResize(window, size_auto_fit, &border_hovered, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) + { + if (auto_fit_mask & (1 << ImGuiAxis_X)) + use_current_size_for_scrollbar_x = true; + if (auto_fit_mask & (1 << ImGuiAxis_Y)) + use_current_size_for_scrollbar_y = true; + } + window->ResizeBorderHovered = (signed char)border_hovered; window->ResizeBorderHeld = (signed char)border_held; // SCROLLBAR VISIBILITY @@ -6530,7 +6929,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); if (window->ScrollbarX && !window->ScrollbarY) - window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); + window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar); window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); // Amend the partially filled window->DecorationXXX values. @@ -6565,24 +6964,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->DecoOuterSizeY2; // Inner clipping rectangle. - // Will extend a little bit outside the normal work region. - // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. - // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. + // - Extend a outside of normal work region up to borders. + // - This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. + // - It also makes clipped items be more noticeable. + // - And is consistent on both axis (prior to 2024/05/03 ClipRect used WindowPadding.x * 0.5f on left and right edge), see #3312 + // - Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. // Affected by window/frame border size. Used by: // - Begin() initial clip rect float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); - window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + window->WindowBorderSize); window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); - window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - window->WindowBorderSize); window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); window->InnerClipRect.ClipWithFull(host_rect); // Default item width. Make it proportional to window size if window manually resizes if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) - window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); + window->ItemWidthDefault = ImTrunc(window->Size.x * 0.65f); else - window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); + window->ItemWidthDefault = ImTrunc(g.FontSize * 16.0f); // SCROLLING @@ -6643,14 +7044,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2))); const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2))); - window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); - window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); + window->WorkRect.Min.x = ImTrunc(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); + window->WorkRect.Min.y = ImTrunc(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; window->ParentWorkRect = window->WorkRect; // [LEGACY] Content Region // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. + // Unless explicit content size is specified by user, this currently represent the region leading to no scrolling. // Used by: // - Mouse wheel scrolling + many other things window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x + window->DecoOuterSizeX1; @@ -6699,6 +7101,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) window->DC.TextWrapPos = -1.0f; // disabled window->DC.ItemWidthStack.resize(0); window->DC.TextWrapPosStack.resize(0); + if (flags & ImGuiWindowFlags_Modal) + window->DC.ModalDimBgColor = ColorConvertFloat4ToU32(GetStyleColorVec4(ImGuiCol_ModalWindowDimBg)); if (window->AutoFitFramesX > 0) window->AutoFitFramesX--; @@ -6733,7 +7137,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). // This is useful to allow creating context menus on title bar only, etc. - SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + SetLastItemDataForWindow(window, title_bar_rect); // [DEBUG] #ifndef IMGUI_DISABLE_DEBUG_TOOLS @@ -6749,11 +7153,17 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) } else { + // Skip refresh always mark active + if (window->SkipRefresh) + window->Active = true; + // Append SetCurrentWindow(window); + SetLastItemDataForWindow(window, window->TitleBarRect()); } - PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); + if (!window->SkipRefresh) + PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) window->WriteAccessed = false; @@ -6761,20 +7171,22 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) g.NextWindowData.ClearFlags(); // Update visibility - if (first_begin_of_the_frame) + if (first_begin_of_the_frame && !window->SkipRefresh) { - if (flags & ImGuiWindowFlags_ChildWindow) + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_ChildMenu)) { // Child window can be out of sight and have "negative" clip windows. // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); - if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? - { - const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); - if (!g.LogEnabled && !nav_request) - if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (!g.LogEnabled && !nav_request) + if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + { + if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + window->HiddenFramesCannotSkipItems = 1; + else window->HiddenFramesCanSkipItems = 1; - } + } // Hide along with parent or if parent is collapsed if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) @@ -6805,19 +7217,33 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) skip_items = true; window->SkipItems = skip_items; } + else if (first_begin_of_the_frame) + { + // Skip refresh mode + window->SkipItems = true; + } // [DEBUG] io.ConfigDebugBeginReturnValue override return value to test Begin/End and BeginChild/EndChild behaviors. // (The implicit fallback window is NOT automatically ended allowing it to always be able to receive commands without crashing) - if (!window->IsFallbackWindow && ((g.IO.ConfigDebugBeginReturnValueOnce && window_just_created) || (g.IO.ConfigDebugBeginReturnValueLoop && g.DebugBeginReturnValueCullDepth == g.CurrentWindowStack.Size))) - { - if (window->AutoFitFramesX > 0) { window->AutoFitFramesX++; } - if (window->AutoFitFramesY > 0) { window->AutoFitFramesY++; } - return false; - } +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (!window->IsFallbackWindow) + if ((g.IO.ConfigDebugBeginReturnValueOnce && window_just_created) || (g.IO.ConfigDebugBeginReturnValueLoop && g.DebugBeginReturnValueCullDepth == g.CurrentWindowStack.Size)) + { + if (window->AutoFitFramesX > 0) { window->AutoFitFramesX++; } + if (window->AutoFitFramesY > 0) { window->AutoFitFramesY++; } + return false; + } +#endif return !window->SkipItems; } +static void ImGui::SetLastItemDataForWindow(ImGuiWindow* window, const ImRect& rect) +{ + ImGuiContext& g = *GImGui; + SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(rect.Min, rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, rect); +} + void ImGui::End() { ImGuiContext& g = *GImGui; @@ -6829,7 +7255,7 @@ void ImGui::End() IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!"); return; } - IM_ASSERT(g.CurrentWindowStack.Size > 0); + ImGuiWindowStackData& window_stack_data = g.CurrentWindowStack.back(); // Error checking: verify that user doesn't directly call End() on a child window. if (window->Flags & ImGuiWindowFlags_ChildWindow) @@ -6838,8 +7264,17 @@ void ImGui::End() // Close anything that is open if (window->DC.CurrentColumns) EndColumns(); - PopClipRect(); // Inner window clip rectangle + if (!window->SkipRefresh) + PopClipRect(); // Inner window clip rectangle PopFocusScope(); + if (window_stack_data.DisabledOverrideReenable && window->RootWindow == window) + EndDisabledOverrideReenable(); + + if (window->SkipRefresh) + { + IM_ASSERT(window->DrawList == NULL); + window->DrawList = &window->DrawListInst; + } // Stop logging if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging @@ -6849,12 +7284,12 @@ void ImGui::End() ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); // Pop from window stack - g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup; + g.LastItemData = window_stack_data.ParentLastItemDataBackup; if (window->Flags & ImGuiWindowFlags_ChildMenu) - g.BeginMenuCount--; + g.BeginMenuDepth--; if (window->Flags & ImGuiWindowFlags_Popup) g.BeginPopupStack.pop_back(); - g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithContextState(&g); + window_stack_data.StackSizesOnBegin.CompareWithContextState(&g); g.CurrentWindowStack.pop_back(); SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window); } @@ -6946,9 +7381,13 @@ void ImGui::FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags) if ((flags & ImGuiFocusRequestFlags_UnlessBelowModal) && (g.NavWindow != window)) // Early out in common case. if (ImGuiWindow* blocking_modal = FindBlockingModal(window)) { + // This block would typically be reached in two situations: + // - API call to FocusWindow() with a window under a modal and ImGuiFocusRequestFlags_UnlessBelowModal flag. + // - User clicking on void or anything behind a modal while a modal is open (window == NULL) IMGUI_DEBUG_LOG_FOCUS("[focus] FocusWindow(\"%s\", UnlessBelowModal): prevented by \"%s\".\n", window ? window->Name : "", blocking_modal->Name); if (window && window == window->RootWindow && (window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0) - BringWindowToDisplayBehind(window, blocking_modal); // Still bring to right below modal. + BringWindowToDisplayBehind(window, blocking_modal); // Still bring right under modal. (FIXME: Could move in focus list too?) + ClosePopupsOverWindow(GetTopMostPopupModal(), false); // Note how we need to use GetTopMostPopupModal() aad NOT blocking_modal, to handle nested modals return; } @@ -6964,8 +7403,9 @@ void ImGui::FocusWindow(ImGuiWindow* window, ImGuiFocusRequestFlags flags) g.NavMousePosDirty = true; g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId g.NavLayer = ImGuiNavLayer_Main; - g.NavFocusScopeId = window ? window->NavRootFocusScopeId : 0; + SetNavFocusScope(window ? window->NavRootFocusScopeId : 0); g.NavIdIsAlive = false; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; // Close popups if any ClosePopupsOverWindow(window, false); @@ -7013,7 +7453,6 @@ void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWind { // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user. ImGuiWindow* window = g.WindowsFocusOrder[i]; - IM_ASSERT(window == window->RootWindow); if (window == ignore_window || !window->WasActive) continue; if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) @@ -7098,7 +7537,7 @@ void ImGui::BeginDisabled(bool disabled) } if (was_disabled || disabled) g.CurrentItemFlags |= ImGuiItemFlags_Disabled; - g.ItemFlagsStack.push_back(g.CurrentItemFlags); + g.ItemFlagsStack.push_back(g.CurrentItemFlags); // FIXME-OPT: can we simply skip this and use DisabledStackSize? g.DisabledStackSize++; } @@ -7115,6 +7554,29 @@ void ImGui::EndDisabled() g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar(); } +// Could have been called BeginDisabledDisable() but it didn't want to be award nominated for most awkward function name. +// Ideally we would use a shared e.g. BeginDisabled()->BeginDisabledEx() but earlier needs to be optimal. +// The whole code for this is awkward, will reevaluate if we find a way to implement SetNextItemDisabled(). +void ImGui::BeginDisabledOverrideReenable() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.CurrentItemFlags & ImGuiItemFlags_Disabled); + g.Style.Alpha = g.DisabledAlphaBackup; + g.CurrentItemFlags &= ~ImGuiItemFlags_Disabled; + g.ItemFlagsStack.push_back(g.CurrentItemFlags); + g.DisabledStackSize++; +} + +void ImGui::EndDisabledOverrideReenable() +{ + ImGuiContext& g = *GImGui; + g.DisabledStackSize--; + IM_ASSERT(g.DisabledStackSize > 0); + g.ItemFlagsStack.pop_back(); + g.CurrentItemFlags = g.ItemFlagsStack.back(); + g.Style.Alpha = g.DisabledAlphaBackup * g.Style.DisabledAlpha; +} + void ImGui::PushTabStop(bool tab_stop) { PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop); @@ -7211,9 +7673,14 @@ bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_b return false; } +// Is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options. +// IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, +// you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! +// Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) { - IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function + IM_ASSERT((flags & ~ImGuiHoveredFlags_AllowedMaskForIsWindowHovered) == 0 && "Invalid flags for IsWindowHovered()!"); + ImGuiContext& g = *GImGui; ImGuiWindow* ref_window = g.HoveredWindow; ImGuiWindow* cur_window = g.CurrentWindow; @@ -7241,6 +7708,17 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId) return false; + + // When changing hovered window we requires a bit of stationary delay before activating hover timer. + // FIXME: We don't support delay other than stationary one for now, other delay would need a way + // to fulfill the possibility that multiple IsWindowHovered() with varying flag could return true + // for different windows of the hierarchy. Possibly need a Hash(Current+Flags) ==> (Timer) cache. + // We can implement this for _Stationary because the data is linked to HoveredWindow rather than CurrentWindow. + if (flags & ImGuiHoveredFlags_ForTooltip) + flags = ApplyHoverFlagsForTooltip(flags, g.Style.HoverFlagsForTooltipMouse); + if ((flags & ImGuiHoveredFlags_Stationary) != 0 && g.HoverWindowUnlockedStationaryId != ref_window->ID) + return false; + return true; } @@ -7305,7 +7783,7 @@ void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) // Set const ImVec2 old_pos = window->Pos; - window->Pos = ImFloor(pos); + window->Pos = ImTrunc(pos); ImVec2 offset = window->Pos - old_pos; if (offset.x == 0.0f && offset.y == 0.0f) return; @@ -7343,18 +7821,22 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + // Enable auto-fit (not done in BeginChild() path unless appearing or combined with ImGuiChildFlags_AlwaysAutoResize) + if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0) + window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; + if ((window->Flags & ImGuiWindowFlags_ChildWindow) == 0 || window->Appearing || (window->ChildFlags & ImGuiChildFlags_AlwaysAutoResize) != 0) + window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; + // Set ImVec2 old_size = window->SizeFull; - window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; - window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; if (size.x <= 0.0f) window->AutoFitOnlyGrows = false; else - window->SizeFull.x = IM_FLOOR(size.x); + window->SizeFull.x = IM_TRUNC(size.x); if (size.y <= 0.0f) window->AutoFitOnlyGrows = false; else - window->SizeFull.y = IM_FLOOR(size.y); + window->SizeFull.y = IM_TRUNC(size.y); if (old_size.x != window->SizeFull.x || old_size.y != window->SizeFull.y) MarkIniSettingsDirty(window); } @@ -7388,7 +7870,7 @@ void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const I window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); } -void ImGui::SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window) +void ImGui::SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window) { window->Hidden = window->SkipItems = true; window->HiddenFramesCanSkipItems = 1; @@ -7454,6 +7936,10 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; } +// For each axis: +// - Use 0.0f as min or FLT_MAX as max if you don't want limits, e.g. size_min = (500.0f, 0.0f), size_max = (FLT_MAX, FLT_MAX) sets a minimum width. +// - Use -1 for both min and max of same axis to preserve current size which itself is a constraint. +// - See "Demo->Examples->Constrained-resizing window" for examples. void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) { ImGuiContext& g = *GImGui; @@ -7469,7 +7955,7 @@ void ImGui::SetNextWindowContentSize(const ImVec2& size) { ImGuiContext& g = *GImGui; g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; - g.NextWindowData.ContentSizeVal = ImFloor(size); + g.NextWindowData.ContentSizeVal = ImTrunc(size); } void ImGui::SetNextWindowScroll(const ImVec2& scroll) @@ -7501,6 +7987,14 @@ void ImGui::SetNextWindowBgAlpha(float alpha) g.NextWindowData.BgAlphaVal = alpha; } +// This is experimental and meant to be a toy for exploring a future/wider range of features. +void ImGui::SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasRefreshPolicy; + g.NextWindowData.RefreshFlagsVal = flags; +} + ImDrawList* ImGui::GetWindowDrawList() { ImGuiWindow* window = GetCurrentWindow(); @@ -7531,50 +8025,105 @@ void ImGui::SetWindowFontScale(float scale) g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); } -void ImGui::ActivateItem(ImGuiID id) -{ - ImGuiContext& g = *GImGui; - g.NavNextActivateId = id; - g.NavNextActivateFlags = ImGuiActivateFlags_None; -} - void ImGui::PushFocusScope(ImGuiID id) { ImGuiContext& g = *GImGui; - g.FocusScopeStack.push_back(id); + ImGuiFocusScopeData data; + data.ID = id; + data.WindowID = g.CurrentWindow->ID; + g.FocusScopeStack.push_back(data); g.CurrentFocusScopeId = id; } void ImGui::PopFocusScope() { ImGuiContext& g = *GImGui; - IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? + if (g.FocusScopeStack.Size == 0) + { + IM_ASSERT_USER_ERROR(g.FocusScopeStack.Size > 0, "Calling PopFocusScope() too many times!"); + return; + } g.FocusScopeStack.pop_back(); - g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back() : 0; + g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back().ID : 0; } -// Note: this will likely be called ActivateItem() once we rework our Focus/Activation system! -void ImGui::SetKeyboardFocusHere(int offset) +void ImGui::SetNavFocusScope(ImGuiID focus_scope_id) { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - IM_ASSERT(offset >= -1); // -1 is allowed but not below - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); + g.NavFocusScopeId = focus_scope_id; + g.NavFocusRoute.resize(0); // Invalidate + if (focus_scope_id == 0) + return; + IM_ASSERT(g.NavWindow != NULL); - // It makes sense in the vast majority of cases to never interrupt a drag and drop. - // When we refactor this function into ActivateItem() we may want to make this an option. - // MovingWindow is protected from most user inputs using SetActiveIdUsingNavAndKeys(), but - // is also automatically dropped in the event g.ActiveId is stolen. - if (g.DragDropActive || g.MovingWindow != NULL) + // Store current path (in reverse order) + if (focus_scope_id == g.CurrentFocusScopeId) { - IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere() ignored while DragDropActive!\n"); - return; + // Top of focus stack contains local focus scopes inside current window + for (int n = g.FocusScopeStack.Size - 1; n >= 0 && g.FocusScopeStack.Data[n].WindowID == g.CurrentWindow->ID; n--) + g.NavFocusRoute.push_back(g.FocusScopeStack.Data[n]); + } + else if (focus_scope_id == g.NavWindow->NavRootFocusScopeId) + g.NavFocusRoute.push_back({ focus_scope_id, g.NavWindow->ID }); + else + return; + + // Then follow on manually set ParentWindowForFocusRoute field (#6798) + for (ImGuiWindow* window = g.NavWindow->ParentWindowForFocusRoute; window != NULL; window = window->ParentWindowForFocusRoute) + g.NavFocusRoute.push_back({ window->NavRootFocusScopeId, window->ID }); + IM_ASSERT(g.NavFocusRoute.Size < 100); // Maximum depth is technically 251 as per CalcRoutingScore(): 254 - 3 +} + +// Focus = move navigation cursor, set scrolling, set focus window. +void ImGui::FocusItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IMGUI_DEBUG_LOG_FOCUS("FocusItem(0x%08x) in window \"%s\"\n", g.LastItemData.ID, window->Name); + if (g.DragDropActive || g.MovingWindow != NULL) // FIXME: Opt-in flags for this? + { + IMGUI_DEBUG_LOG_FOCUS("FocusItem() ignored while DragDropActive!\n"); + return; + } + + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavHighlight | ImGuiNavMoveFlags_NoSelect; + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + SetNavWindow(window); + NavMoveRequestSubmit(ImGuiDir_None, ImGuiDir_Up, move_flags, scroll_flags); + NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); +} + +void ImGui::ActivateItemByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavNextActivateId = id; + g.NavNextActivateFlags = ImGuiActivateFlags_None; +} + +// Note: this will likely be called ActivateItem() once we rework our Focus/Activation system! +// But ActivateItem() should function without altering scroll/focus? +void ImGui::SetKeyboardFocusHere(int offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(offset >= -1); // -1 is allowed but not below + IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); + + // It makes sense in the vast majority of cases to never interrupt a drag and drop. + // When we refactor this function into ActivateItem() we may want to make this an option. + // MovingWindow is protected from most user inputs using SetActiveIdUsingNavAndKeys(), but + // is also automatically dropped in the event g.ActiveId is stolen. + if (g.DragDropActive || g.MovingWindow != NULL) + { + IMGUI_DEBUG_LOG_FOCUS("SetKeyboardFocusHere() ignored while DragDropActive!\n"); + return; } SetNavWindow(window); + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate | ImGuiNavMoveFlags_FocusApi | ImGuiNavMoveFlags_NoSetNavHighlight; ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; - NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. if (offset == -1) { NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); @@ -7616,6 +8165,69 @@ ImGuiStorage* ImGui::GetStateStorage() return window->DC.StateStorage; } +bool ImGui::IsRectVisible(const ImVec2& size) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); +} + +bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); +} + +//----------------------------------------------------------------------------- +// [SECTION] ID STACK +//----------------------------------------------------------------------------- + +// This is one of the very rare legacy case where we use ImGuiWindow methods, +// it should ideally be flattened at some point but it's been used a lots by widgets. +ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetID(const void* ptr) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); +#endif + return id; +} + +ImGuiID ImGuiWindow::GetID(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); +#endif + return id; +} + +// This is only used in rare/specific situations to manufacture an ID out of nowhere. +ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) +{ + ImGuiID seed = IDStack.back(); + ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); + ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); + return id; +} + void ImGui::PushID(const char* str_id) { ImGuiContext& g = *GImGui; @@ -7653,29 +8265,35 @@ void ImGui::PushOverrideID(ImGuiID id) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; +#ifndef IMGUI_DISABLE_DEBUG_TOOLS if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL); +#endif window->IDStack.push_back(id); } // Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call -// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. +// (note that when using this pattern, ID Stack Tool will tend to not display the intermediate stack level. // for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) { ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS ImGuiContext& g = *GImGui; if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); +#endif return id; } ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed) { ImGuiID id = ImHashData(&n, sizeof(n), seed); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS ImGuiContext& g = *GImGui; if (g.DebugHookIdInfo == id) DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); +#endif return id; } @@ -7704,22 +8322,11 @@ ImGuiID ImGui::GetID(const void* ptr_id) return window->GetID(ptr_id); } -bool ImGui::IsRectVisible(const ImVec2& size) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); -} - -bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) -{ - ImGuiWindow* window = GImGui->CurrentWindow; - return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); -} - - //----------------------------------------------------------------------------- // [SECTION] INPUTS //----------------------------------------------------------------------------- +// - GetModForModKey() [Internal] +// - FixupKeyChord() [Internal] // - GetKeyData() [Internal] // - GetKeyIndex() [Internal] // - GetKeyName() @@ -7749,6 +8356,7 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) // - IsMouseDragPastThreshold() [Internal] // - IsMouseDragging() // - GetMousePos() +// - SetMousePos() [Internal] // - GetMousePosOnOpeningCurrentPopup() // - IsMousePosValid() // - IsAnyMouseDown() @@ -7780,13 +8388,35 @@ bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) // - Shortcut() [Internal] //----------------------------------------------------------------------------- +static ImGuiKeyChord GetModForModKey(ImGuiKey key) +{ + if (key == ImGuiKey_LeftCtrl || key == ImGuiKey_RightCtrl) + return ImGuiMod_Ctrl; + if (key == ImGuiKey_LeftShift || key == ImGuiKey_RightShift) + return ImGuiMod_Shift; + if (key == ImGuiKey_LeftAlt || key == ImGuiKey_RightAlt) + return ImGuiMod_Alt; + if (key == ImGuiKey_LeftSuper || key == ImGuiKey_RightSuper) + return ImGuiMod_Super; + return ImGuiMod_None; +} + +ImGuiKeyChord ImGui::FixupKeyChord(ImGuiKeyChord key_chord) +{ + // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified. + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (IsModKey(key)) + key_chord |= GetModForModKey(key); + return key_chord; +} + ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key) { ImGuiContext& g = *ctx; // Special storage location for mods if (key & ImGuiMod_Mask_) - key = ConvertSingleModFlagToKey(ctx, key); + key = ConvertSingleModFlagToKey(key); #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END); @@ -7799,6 +8429,7 @@ ImGuiKeyData* ImGui::GetKeyData(ImGuiContext* ctx, ImGuiKey key) } #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO +// Formally moved to obsolete section in 1.90.5 in spite of documented as obsolete since 1.87 ImGuiKey ImGui::GetKeyIndex(ImGuiKey key) { ImGuiContext& g = *GImGui; @@ -7817,11 +8448,13 @@ static const char* const GKeyNames[] = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket", "Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen", "Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6", "Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply", "KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual", + "AppBack", "AppForward", "GamepadStart", "GamepadBack", "GamepadFaceLeft", "GamepadFaceRight", "GamepadFaceUp", "GamepadFaceDown", "GamepadDpadLeft", "GamepadDpadRight", "GamepadDpadUp", "GamepadDpadDown", @@ -7835,10 +8468,12 @@ IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames)); const char* ImGui::GetKeyName(ImGuiKey key) { - ImGuiContext& g = *GImGui; + if (key == ImGuiKey_None) + return "None"; #ifdef IMGUI_DISABLE_OBSOLETE_KEYIO - IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); + IM_ASSERT(IsNamedKeyOrMod(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); #else + ImGuiContext& g = *GImGui; if (IsLegacyKey(key)) { if (g.IO.KeyMap[key] == -1) @@ -7847,28 +8482,34 @@ const char* ImGui::GetKeyName(ImGuiKey key) key = (ImGuiKey)g.IO.KeyMap[key]; } #endif - if (key == ImGuiKey_None) - return "None"; if (key & ImGuiMod_Mask_) - key = ConvertSingleModFlagToKey(&g, key); + key = ConvertSingleModFlagToKey(key); if (!IsNamedKey(key)) return "Unknown"; return GKeyNames[key - ImGuiKey_NamedKey_BEGIN]; } -// ImGuiMod_Shortcut is translated to either Ctrl or Super. -void ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size) +// Return untranslated names: on macOS, Cmd key will show as Ctrl, Ctrl key will show as super. +// Lifetime of return value: valid until next call to same function. +const char* ImGui::GetKeyChordName(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); - ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s", + + const ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (IsModKey(key)) + key_chord &= ~GetModForModKey(key); // Return "Ctrl+LeftShift" instead of "Ctrl+Shift+LeftShift" + ImFormatString(g.TempKeychordName, IM_ARRAYSIZE(g.TempKeychordName), "%s%s%s%s%s", (key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "", (key_chord & ImGuiMod_Shift) ? "Shift+" : "", (key_chord & ImGuiMod_Alt) ? "Alt+" : "", - (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "", - GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_))); + (key_chord & ImGuiMod_Super) ? "Super+" : "", + (key != ImGuiKey_None || key_chord == ImGuiKey_None) ? GetKeyName(key) : ""); + size_t len; + if (key == ImGuiKey_None && key_chord != 0) + if ((len = strlen(g.TempKeychordName)) != 0) // Remove trailing '+' + g.TempKeychordName[len - 1] = 0; + return g.TempKeychordName; } // t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) @@ -7935,19 +8576,24 @@ static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt) for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex) { routing_entry = &rt->Entries[old_routing_idx]; + routing_entry->RoutingCurrScore = routing_entry->RoutingNextScore; routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry - routing_entry->RoutingNext = ImGuiKeyOwner_None; + routing_entry->RoutingNext = ImGuiKeyOwner_NoOwner; routing_entry->RoutingNextScore = 255; - if (routing_entry->RoutingCurr == ImGuiKeyOwner_None) + if (routing_entry->RoutingCurr == ImGuiKeyOwner_NoOwner) continue; rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer // Apply routing to owner if there's no owner already (RoutingCurr == None at this point) + // This is the result of previous frame's SetShortcutRouting() call. if (routing_entry->Mods == g.IO.KeyMods) { ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); - if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner) + { owner_data->OwnerCurr = routing_entry->RoutingCurr; + //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X) via Routing\n", GetKeyName(key), routing_entry->RoutingCurr); + } } } @@ -7963,7 +8609,7 @@ static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt) static inline ImGuiID GetRoutingIdFromOwnerId(ImGuiID owner_id) { ImGuiContext& g = *GImGui; - return (owner_id != ImGuiKeyOwner_None && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId; + return (owner_id != ImGuiKeyOwner_NoOwner && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId; } ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) @@ -7977,12 +8623,10 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) ImGuiContext& g = *GImGui; ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; ImGuiKeyRoutingData* routing_data; - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); if (key == ImGuiKey_None) - key = ConvertSingleModFlagToKey(&g, mods); + key = ConvertSingleModFlagToKey(mods); IM_ASSERT(IsNamedKey(key)); // Get (in the majority of case, the linked list will have one element so this should be 2 reads. @@ -8005,20 +8649,18 @@ ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) } // Current score encoding (lower is highest priority): -// - 0: ImGuiInputFlags_RouteGlobalHigh -// - 1: ImGuiInputFlags_RouteFocused (if item active) -// - 2: ImGuiInputFlags_RouteGlobal +// - 0: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverActive +// - 1: ImGuiInputFlags_ActiveItem or ImGuiInputFlags_RouteFocused (if item active) +// - 2: ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused // - 3+: ImGuiInputFlags_RouteFocused (if window in focus-stack) -// - 254: ImGuiInputFlags_RouteGlobalLow +// - 254: ImGuiInputFlags_RouteGlobal // - 255: never route // 'flags' should include an explicit routing policy -static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputFlags flags) +static int CalcRoutingScore(ImGuiID focus_scope_id, ImGuiID owner_id, ImGuiInputFlags flags) { + ImGuiContext& g = *GImGui; if (flags & ImGuiInputFlags_RouteFocused) { - ImGuiContext& g = *GImGui; - ImGuiWindow* focused = g.NavWindow; - // ActiveID gets top priority // (we don't check g.ActiveIdUsingAllKeys here. Routing is applied but if input ownership is tested later it may discard it) if (owner_id != 0 && g.ActiveId == owner_id) @@ -8030,65 +8672,136 @@ static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputF // - When Window/ChildB is focused -> Window scores 4, Window/ChildB scores 3 (best) // Assuming only WindowA is submitting a routing request, // - When Window/ChildB is focused -> Window scores 4 (best), Window/ChildB doesn't have a score. - if (focused != NULL && focused->RootWindow == location->RootWindow) - for (int next_score = 3; focused != NULL; next_score++) - { - if (focused == location) - { - IM_ASSERT(next_score < 255); - return next_score; - } - focused = (focused->RootWindow != focused) ? focused->ParentWindow : NULL; // FIXME: This could be later abstracted as a focus path - } + // This essentially follow the window->ParentWindowForFocusRoute chain. + if (focus_scope_id == 0) + return 255; + for (int index_in_focus_path = 0; index_in_focus_path < g.NavFocusRoute.Size; index_in_focus_path++) + if (g.NavFocusRoute.Data[index_in_focus_path].ID == focus_scope_id) + return 3 + index_in_focus_path; return 255; } - - // ImGuiInputFlags_RouteGlobalHigh is default, so calls without flags are not conditional - if (flags & ImGuiInputFlags_RouteGlobal) - return 2; - if (flags & ImGuiInputFlags_RouteGlobalLow) + else if (flags & ImGuiInputFlags_RouteActive) + { + if (owner_id != 0 && g.ActiveId == owner_id) + return 1; + return 255; + } + else if (flags & ImGuiInputFlags_RouteGlobal) + { + if (flags & ImGuiInputFlags_RouteOverActive) + return 0; + if (flags & ImGuiInputFlags_RouteOverFocused) + return 2; return 254; + } + IM_ASSERT(0); return 0; } +// We need this to filter some Shortcut() routes when an item e.g. an InputText() is active +// e.g. ImGuiKey_G won't be considered a shortcut when item is active, but ImGuiMod|ImGuiKey_G can be. +static bool IsKeyChordPotentiallyCharInput(ImGuiKeyChord key_chord) +{ + // Mimic 'ignore_char_inputs' logic in InputText() + ImGuiContext& g = *GImGui; + + // When the right mods are pressed it cannot be a char input so we won't filter the shortcut out. + ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); + const bool ignore_char_inputs = ((mods & ImGuiMod_Ctrl) && !(mods & ImGuiMod_Alt)) || (g.IO.ConfigMacOSXBehaviors && (mods & ImGuiMod_Ctrl)); + if (ignore_char_inputs) + return false; + + // Return true for A-Z, 0-9 and other keys associated to char inputs. Other keys such as F1-F12 won't be filtered. + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + return g.KeysMayBeCharInput.TestBit(key); +} + // Request a desired route for an input chord (key + mods). // Return true if the route is available this frame. // - Routes and key ownership are attributed at the beginning of next frame based on best score and mod state. // (Conceptually this does a "Submit for next frame" + "Test for current frame". // As such, it could be called TrySetXXX or SubmitXXX, or the Submit and Test operations should be separate.) -// - Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default) -// - Using 'owner_id == ImGuiKeyOwner_None': allows disabling/locking a shortcut. -bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) { ImGuiContext& g = *GImGui; - if ((flags & ImGuiInputFlags_RouteMask_) == 0) - flags |= ImGuiInputFlags_RouteGlobalHigh; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut() + if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0) + flags |= ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut() else - IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteTypeMask_)); // Check that only 1 routing flag is used + IM_ASSERT(owner_id != ImGuiKeyOwner_Any && owner_id != ImGuiKeyOwner_NoOwner); + if (flags & (ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused)) + IM_ASSERT(flags & ImGuiInputFlags_RouteGlobal); + + // Add ImGuiMod_XXXX when a corresponding ImGuiKey_LeftXXX/ImGuiKey_RightXXX is specified. + key_chord = FixupKeyChord(key_chord); + + // [DEBUG] Debug break requested by user + if (g.DebugBreakInShortcutRouting == key_chord) + IM_DEBUG_BREAK(); if (flags & ImGuiInputFlags_RouteUnlessBgFocused) if (g.NavWindow == NULL) return false; + + // Note how ImGuiInputFlags_RouteAlways won't set routing and thus won't set owner. May want to rework this? if (flags & ImGuiInputFlags_RouteAlways) + { + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> always, no register\n", GetKeyChordName(key_chord), flags, owner_id); return true; + } + + // Specific culling when there's an active item. + if (g.ActiveId != 0 && g.ActiveId != owner_id) + { + if (flags & ImGuiInputFlags_RouteActive) + return false; + + // Cull shortcuts with no modifiers when it could generate a character. + // e.g. Shortcut(ImGuiKey_G) also generates 'g' character, should not trigger when InputText() is active. + // but Shortcut(Ctrl+G) should generally trigger when InputText() is active. + // TL;DR: lettered shortcut with no mods or with only Alt mod will not trigger while an item reading text input is active. + // (We cannot filter based on io.InputQueueCharacters[] contents because of trickling and key<>chars submission order are undefined) + if (g.IO.WantTextInput && IsKeyChordPotentiallyCharInput(key_chord)) + { + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> filtered as potential char input\n", GetKeyChordName(key_chord), flags, owner_id); + return false; + } + + // ActiveIdUsingAllKeyboardKeys trumps all for ActiveId + if ((flags & ImGuiInputFlags_RouteOverActive) == 0 && g.ActiveIdUsingAllKeyboardKeys) + { + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (key == ImGuiKey_None) + key = ConvertSingleModFlagToKey((ImGuiKey)(key_chord & ImGuiMod_Mask_)); + if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) + return false; + } + } - const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags); + // Where do we evaluate route for? + ImGuiID focus_scope_id = g.CurrentFocusScopeId; + if (flags & ImGuiInputFlags_RouteFromRootWindow) + focus_scope_id = g.CurrentWindow->RootWindow->ID; // See PushFocusScope() call in Begin() + + const int score = CalcRoutingScore(focus_scope_id, owner_id, flags); + IMGUI_DEBUG_LOG_INPUTROUTING("SetShortcutRouting(%s, flags=%04X, owner_id=0x%08X) -> score %d\n", GetKeyChordName(key_chord), flags, owner_id, score); if (score == 255) return false; // Submit routing for NEXT frame (assuming score is sufficient) // FIXME: Could expose a way to use a "serve last" policy for same score resolution (using <= instead of <). ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); - const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); //const bool set_route = (flags & ImGuiInputFlags_ServeLast) ? (score <= routing_data->RoutingNextScore) : (score < routing_data->RoutingNextScore); if (score < routing_data->RoutingNextScore) { - routing_data->RoutingNext = routing_id; + routing_data->RoutingNext = owner_id; routing_data->RoutingNextScore = (ImU8)score; } // Return routing state for CURRENT frame - return routing_data->RoutingCurr == routing_id; + if (routing_data->RoutingCurr == owner_id) + IMGUI_DEBUG_LOG_INPUTROUTING("--> granting current route\n"); + return routing_data->RoutingCurr == owner_id; } // Currently unused by core (but used by tests) @@ -8096,6 +8809,7 @@ bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiI bool ImGui::TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id) { const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); + key_chord = FixupKeyChord(key_chord); ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); // FIXME: Could avoid creating entry. return routing_data->RoutingCurr == routing_id; } @@ -8119,11 +8833,11 @@ bool ImGui::IsKeyDown(ImGuiKey key, ImGuiID owner_id) bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) { - return IsKeyPressed(key, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); + return IsKeyPressed(key, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any); } // Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. -bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id) { const ImGuiKeyData* key_data = GetKeyData(key); if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) @@ -8132,13 +8846,28 @@ bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) if (t < 0.0f) return false; IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + if (flags & (ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_)) // Setting any _RepeatXXX option enables _Repeat + flags |= ImGuiInputFlags_Repeat; bool pressed = (t == 0.0f); - if (!pressed && ((flags & ImGuiInputFlags_Repeat) != 0)) + if (!pressed && (flags & ImGuiInputFlags_Repeat) != 0) { float repeat_delay, repeat_rate; GetTypematicRepeatRate(flags, &repeat_delay, &repeat_rate); pressed = (t > repeat_delay) && GetKeyPressedAmount(key, repeat_delay, repeat_rate) > 0; + if (pressed && (flags & ImGuiInputFlags_RepeatUntilMask_)) + { + // Slightly bias 'key_pressed_time' as DownDuration is an accumulation of DeltaTime which we compare to an absolute time value. + // Ideally we'd replace DownDuration with KeyPressedTime but it would break user's code. + ImGuiContext& g = *GImGui; + double key_pressed_time = g.Time - t + 0.00001f; + if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChange) && (g.LastKeyModsChangeTime > key_pressed_time)) + pressed = false; + if ((flags & ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone) && (g.LastKeyModsChangeFromNoneTime > key_pressed_time)) + pressed = false; + if ((flags & ImGuiInputFlags_RepeatUntilOtherKeyPress) && (g.LastKeyboardKeyPressTime > key_pressed_time)) + pressed = false; + } } if (!pressed) return false; @@ -8178,10 +8907,10 @@ bool ImGui::IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id) bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) { - return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); + return IsMouseClicked(button, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None, ImGuiKeyOwner_Any); } -bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags) +bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id) { ImGuiContext& g = *GImGui; IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); @@ -8190,7 +8919,7 @@ bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInput const float t = g.IO.MouseDownDuration[button]; if (t < 0.0f) return false; - IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsMouseClicked) == 0); // Passing flags not supported by this function! // FIXME: Could support RepeatRate and RepeatUntil flags here. const bool repeat = (flags & ImGuiInputFlags_Repeat) != 0; const bool pressed = (t == 0.0f) || (repeat && t > g.IO.KeyRepeatDelay && CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0); @@ -8224,6 +8953,13 @@ bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any); } +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), owner_id); +} + int ImGui::GetMouseClickedCount(ImGuiMouseButton button) { ImGuiContext& g = *GImGui; @@ -8243,9 +8979,8 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c if (clip) rect_clipped.ClipWith(g.CurrentWindow->ClipRect); - // Expand for touch input - const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); - if (!rect_for_touch.Contains(g.IO.MousePos)) + // Hit testing, expanded for touch input + if (!rect_clipped.ContainsWithPad(g.IO.MousePos, g.Style.TouchExtraPadding)) return false; return true; } @@ -8276,6 +9011,17 @@ ImVec2 ImGui::GetMousePos() return g.IO.MousePos; } +// This is called TeleportMousePos() and not SetMousePos() to emphasis that setting MousePosPrev will effectively clear mouse delta as well. +// It is expected you only call this if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) is set and supported by backend. +void ImGui::TeleportMousePos(const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + g.IO.MousePos = g.IO.MousePosPrev = pos; + g.IO.MouseDelta = ImVec2(0.0f, 0.0f); + g.IO.WantSetMousePos = true; + //IMGUI_DEBUG_LOG_IO("TeleportMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); +} + // NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() { @@ -8411,7 +9157,9 @@ static void ImGui::UpdateKeyboardInputs() GetKeyData(ImGuiMod_Super)->Down = io.KeySuper; } } +#endif + // Import legacy ImGuiNavInput_ io inputs and convert to gamepad keys #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active) @@ -8434,7 +9182,6 @@ static void ImGui::UpdateKeyboardInputs() MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown); #undef NAV_MAP_KEY } -#endif #endif // Update aliases @@ -8443,15 +9190,20 @@ static void ImGui::UpdateKeyboardInputs() UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH); UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel); - // Synchronize io.KeyMods and io.KeyXXX values. + // Synchronize io.KeyMods and io.KeyCtrl/io.KeyShift/etc. values. // - New backends (1.87+): send io.AddKeyEvent(ImGuiMod_XXX) -> -> (here) deriving io.KeyMods + io.KeyXXX from key array. // - Legacy backends: set io.KeyXXX bools -> (above) set key array from io.KeyXXX -> (here) deriving io.KeyMods + io.KeyXXX from key array. // So with legacy backends the 4 values will do a unnecessary back-and-forth but it makes the code simpler and future facing. + const ImGuiKeyChord prev_key_mods = io.KeyMods; io.KeyMods = GetMergedModsFromKeys(); io.KeyCtrl = (io.KeyMods & ImGuiMod_Ctrl) != 0; io.KeyShift = (io.KeyMods & ImGuiMod_Shift) != 0; io.KeyAlt = (io.KeyMods & ImGuiMod_Alt) != 0; io.KeySuper = (io.KeyMods & ImGuiMod_Super) != 0; + if (prev_key_mods != io.KeyMods) + g.LastKeyModsChangeTime = g.Time; + if (prev_key_mods != io.KeyMods && prev_key_mods == 0) + g.LastKeyModsChangeFromNoneTime = g.Time; // Clear gamepad data if disabled if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) @@ -8467,6 +9219,14 @@ static void ImGui::UpdateKeyboardInputs() ImGuiKeyData* key_data = &io.KeysData[i]; key_data->DownDurationPrev = key_data->DownDuration; key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f; + if (key_data->DownDuration == 0.0f) + { + ImGuiKey key = (ImGuiKey)(ImGuiKey_KeysData_OFFSET + i); + if (IsKeyboardKey(key)) + g.LastKeyboardKeyPressTime = g.Time; + else if (key == ImGuiKey_ReservedForModCtrl || key == ImGuiKey_ReservedForModShift || key == ImGuiKey_ReservedForModAlt || key == ImGuiKey_ReservedForModSuper) + g.LastKeyboardKeyPressTime = g.Time; + } } // Update keys/input owner (named keys only): one entry per key @@ -8476,10 +9236,11 @@ static void ImGui::UpdateKeyboardInputs() ImGuiKeyOwnerData* owner_data = &g.KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; owner_data->OwnerCurr = owner_data->OwnerNext; if (!key_data->Down) // Important: ownership is released on the frame after a release. Ensure a 'MouseDown -> CloseWindow -> MouseUp' chain doesn't lead to someone else seeing the MouseUp. - owner_data->OwnerNext = ImGuiKeyOwner_None; + owner_data->OwnerNext = ImGuiKeyOwner_NoOwner; owner_data->LockThisFrame = owner_data->LockUntilRelease = owner_data->LockUntilRelease && key_data->Down; // Clear LockUntilRelease when key is not Down anymore } + // Update key routing (for e.g. shortcuts) UpdateKeyRoutingTable(&g.KeysRoutingTable); } @@ -8497,7 +9258,7 @@ static void ImGui::UpdateMouseInputs() // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well) if (IsMousePosValid(&io.MousePos)) - io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos); + io.MousePos = g.MouseLastValidPos = ImFloor(io.MousePos); // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev)) @@ -8505,11 +9266,17 @@ static void ImGui::UpdateMouseInputs() else io.MouseDelta = ImVec2(0.0f, 0.0f); + // Update stationary timer. + // FIXME: May need to rework again to have some tolerance for occasional small movement, while being functional on high-framerates. + const float mouse_stationary_threshold = (io.MouseSource == ImGuiMouseSource_Mouse) ? 2.0f : 3.0f; // Slightly higher threshold for ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen, may need rework. + const bool mouse_stationary = (ImLengthSqr(io.MouseDelta) <= mouse_stationary_threshold * mouse_stationary_threshold); + g.MouseStationaryTimer = mouse_stationary ? (g.MouseStationaryTimer + io.DeltaTime) : 0.0f; + //IMGUI_DEBUG_LOG("%.4f\n", g.MouseStationaryTimer); + // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) g.NavDisableMouseHover = false; - io.MousePosPrev = io.MousePos; for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) { io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f; @@ -8625,8 +9392,8 @@ void ImGui::UpdateMouseWheel() } ImVec2 wheel; - wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_None) ? g.IO.MouseWheelH : 0.0f; - wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_None) ? g.IO.MouseWheel : 0.0f; + wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheelH : 0.0f; + wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_NoOwner) ? g.IO.MouseWheel : 0.0f; //IMGUI_DEBUG_LOG("MouseWheel X:%.3f Y:%.3f\n", wheel_x, wheel_y); ImGuiWindow* mouse_window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; @@ -8646,8 +9413,8 @@ void ImGui::UpdateMouseWheel() { const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; SetWindowPos(window, window->Pos + offset, 0); - window->Size = ImFloor(window->Size * scale); - window->SizeFull = ImFloor(window->SizeFull * scale); + window->Size = ImTrunc(window->Size * scale); + window->SizeFull = ImTrunc(window->SizeFull * scale); } return; } @@ -8683,15 +9450,17 @@ void ImGui::UpdateMouseWheel() { LockWheelingWindow(window, wheel.x); float max_step = window->InnerRect.GetWidth() * 0.67f; - float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); + float scroll_step = ImTrunc(ImMin(2 * window->CalcFontSize(), max_step)); SetScrollX(window, window->Scroll.x - wheel.x * scroll_step); + g.WheelingWindowScrolledFrame = g.FrameCount; } if (do_scroll[ImGuiAxis_Y]) { LockWheelingWindow(window, wheel.y); float max_step = window->InnerRect.GetHeight() * 0.67f; - float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); + float scroll_step = ImTrunc(ImMin(5 * window->CalcFontSize(), max_step)); SetScrollY(window, window->Scroll.y - wheel.y * scroll_step); + g.WheelingWindowScrolledFrame = g.FrameCount; } } } @@ -8711,7 +9480,7 @@ void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse) #ifndef IMGUI_DISABLE_DEBUG_TOOLS static const char* GetInputSourceName(ImGuiInputSource source) { - const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Clipboard" }; + const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT); return input_source_names[source]; } @@ -8724,8 +9493,8 @@ static const char* GetMouseSourceName(ImGuiMouseSource source) static void DebugPrintInputEvent(const char* prefix, const ImGuiInputEvent* e) { ImGuiContext& g = *GImGui; - if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (%.1f, %.1f) (%s)\n", prefix, e->MousePos.PosX, e->MousePos.PosY, GetMouseSourceName(e->MouseWheel.MouseSource)); return; } - if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseButton %d %s (%s)\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up", GetMouseSourceName(e->MouseWheel.MouseSource)); return; } + if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("[io] %s: MousePos (%.1f, %.1f) (%s)\n", prefix, e->MousePos.PosX, e->MousePos.PosY, GetMouseSourceName(e->MousePos.MouseSource)); return; } + if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseButton %d %s (%s)\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up", GetMouseSourceName(e->MouseButton.MouseSource)); return; } if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("[io] %s: MouseWheel (%.3f, %.3f) (%s)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY, GetMouseSourceName(e->MouseWheel.MouseSource)); return; } if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("[io] %s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; } if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("[io] %s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; } @@ -8757,6 +9526,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs) ImGuiInputEvent* e = &g.InputEventsQueue[event_n]; if (e->Type == ImGuiInputEventType_MousePos) { + if (g.IO.WantSetMousePos) + continue; // Trickling Rule: Stop processing queued events if we already handled a mouse button change ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY); if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted)) @@ -8860,8 +9631,8 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs) ImGuiID ImGui::GetKeyOwner(ImGuiKey key) { - if (!IsNamedKeyOrModKey(key)) - return ImGuiKeyOwner_None; + if (!IsNamedKeyOrMod(key)) + return ImGuiKeyOwner_NoOwner; ImGuiContext& g = *GImGui; ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); @@ -8869,7 +9640,7 @@ ImGuiID ImGui::GetKeyOwner(ImGuiKey key) if (g.ActiveIdUsingAllKeyboardKeys && owner_id != g.ActiveId && owner_id != ImGuiKeyOwner_Any) if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) - return ImGuiKeyOwner_None; + return ImGuiKeyOwner_NoOwner; return owner_id; } @@ -8880,7 +9651,7 @@ ImGuiID ImGui::GetKeyOwner(ImGuiKey key) // All paths are also testing for key not being locked, for the rare cases that key have been locked with using ImGuiInputFlags_LockXXX flags. bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) { - if (!IsNamedKeyOrModKey(key)) + if (!IsNamedKeyOrMod(key)) return true; ImGuiContext& g = *GImGui; @@ -8899,7 +9670,7 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) { if (owner_data->LockThisFrame) return false; - if (owner_data->OwnerCurr != ImGuiKeyOwner_None) + if (owner_data->OwnerCurr != ImGuiKeyOwner_NoOwner) return false; } @@ -8913,10 +9684,11 @@ bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) // - SetKeyOwner(..., Any or None, Lock) : set lock void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) { - IM_ASSERT(IsNamedKeyOrModKey(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it) + ImGuiContext& g = *GImGui; + IM_ASSERT(IsNamedKeyOrMod(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it) IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function! + //IMGUI_DEBUG_LOG("SetKeyOwner(%s, owner_id=0x%08X, flags=%08X)\n", GetKeyName(key), owner_id, flags); - ImGuiContext& g = *GImGui; ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); owner_data->OwnerCurr = owner_data->OwnerNext = owner_id; @@ -8933,7 +9705,6 @@ void ImGui::SetKeyOwnersForKeyChord(ImGuiKeyChord key_chord, ImGuiID owner_id, I if (key_chord & ImGuiMod_Shift) { SetKeyOwner(ImGuiMod_Shift, owner_id, flags); } if (key_chord & ImGuiMod_Alt) { SetKeyOwner(ImGuiMod_Alt, owner_id, flags); } if (key_chord & ImGuiMod_Super) { SetKeyOwner(ImGuiMod_Super, owner_id, flags); } - if (key_chord & ImGuiMod_Shortcut) { SetKeyOwner(ImGuiMod_Shortcut, owner_id, flags); } if (key_chord & ~ImGuiMod_Mask_) { SetKeyOwner((ImGuiKey)(key_chord & ~ImGuiMod_Mask_), owner_id, flags); } } @@ -8958,18 +9729,17 @@ void ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags) } } -bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +// This is the only public API until we expose owner_id versions of the API as replacements. +bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord) { - ImGuiContext& g = *GImGui; - - // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any. - if ((flags & ImGuiInputFlags_RouteMask_) == 0) - flags |= ImGuiInputFlags_RouteFocused; - if (!SetShortcutRouting(key_chord, owner_id, flags)) - return false; + return IsKeyChordPressed(key_chord, ImGuiInputFlags_None, ImGuiKeyOwner_Any); +} - if (key_chord & ImGuiMod_Shortcut) - key_chord = ConvertShortcutMod(key_chord); +// This is equivalent to comparing KeyMods + doing a IsKeyPressed() +bool ImGui::IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + key_chord = FixupKeyChord(key_chord); ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); if (g.IO.KeyMods != mods) return false; @@ -8977,12 +9747,77 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags // Special storage location for mods ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); if (key == ImGuiKey_None) - key = ConvertSingleModFlagToKey(&g, mods); + key = ConvertSingleModFlagToKey(mods); + if (!IsKeyPressed(key, (flags & ImGuiInputFlags_RepeatMask_), owner_id)) + return false; + return true; +} + +void ImGui::SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasShortcut; + g.NextItemData.Shortcut = key_chord; + g.NextItemData.ShortcutFlags = flags; +} + +void ImGui::ItemHandleShortcut(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiInputFlags flags = g.NextItemData.ShortcutFlags; + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetNextItemShortcut) == 0); // Passing flags not supported by SetNextItemShortcut()! + + if (flags & ImGuiInputFlags_Tooltip) + { + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasShortcut; + g.LastItemData.Shortcut = g.NextItemData.Shortcut; + } + if (!Shortcut(g.NextItemData.Shortcut, flags & ImGuiInputFlags_SupportedByShortcut, id) || g.NavActivateId != 0) + return; + + // FIXME: Generalize Activation queue? + g.NavActivateId = id; // Will effectively disable clipping. + g.NavActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_FromShortcut; + //if (g.ActiveId == 0 || g.ActiveId == id) + g.NavActivateDownId = g.NavActivatePressedId = id; + NavHighlightActivated(id); +} - if (!IsKeyPressed(key, owner_id, (flags & (ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateMask_)))) +bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags) +{ + return Shortcut(key_chord, flags, ImGuiKeyOwner_Any); +} + +bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id) +{ + //ImGuiContext& g = *GImGui; + //IMGUI_DEBUG_LOG("Shortcut(%s, flags=%X, owner_id=0x%08X)\n", GetKeyChordName(key_chord, g.TempBuffer.Data, g.TempBuffer.Size), flags, owner_id); + + // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any. + if ((flags & ImGuiInputFlags_RouteTypeMask_) == 0) + flags |= ImGuiInputFlags_RouteFocused; + + // Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default) + // Effectively makes Shortcut() always input-owner aware. + if (owner_id == ImGuiKeyOwner_Any || owner_id == ImGuiKeyOwner_NoOwner) + owner_id = GetRoutingIdFromOwnerId(owner_id); + + // Submit route + if (!SetShortcutRouting(key_chord, flags, owner_id)) return false; - IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! + // Default repeat behavior for Shortcut() + // So e.g. pressing Ctrl+W and releasing Ctrl while holding W will not trigger the W shortcut. + if ((flags & ImGuiInputFlags_Repeat) != 0 && (flags & ImGuiInputFlags_RepeatUntilMask_) == 0) + flags |= ImGuiInputFlags_RepeatUntilKeyModsChange; + + if (!IsKeyChordPressed(key_chord, flags, owner_id)) + return false; + + // Claim mods during the press + SetKeyOwnersForKeyChord(key_chord & ImGuiMod_Mask_, owner_id); + + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! return true; } @@ -8991,24 +9826,26 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags // [SECTION] ERROR CHECKING //----------------------------------------------------------------------------- -// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. +// Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues. +// Called by IMGUI_CHECKVERSION(). // Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit -// If this triggers you have an issue: -// - Most commonly: mismatched headers and compiled code version. -// - Or: mismatched configuration #define, compilation settings, packing pragma etc. -// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui, -// which is way it is required you put them in your imconfig file (and not just before including imgui.h). -// Otherwise it is possible that different compilation units would see different structure layout +// If this triggers you have mismatched headers and compiled code versions. +// - It could be because of a build issue (using new headers with old compiled code) +// - It could be because of mismatched configuration #define, compilation settings, packing pragma etc. +// THE CONFIGURATION SETTINGS MENTIONED IN imconfig.h MUST BE SET FOR ALL COMPILATION UNITS INVOLVED WITH DEAR IMGUI. +// Which is why it is required you put them in your imconfig file (and NOT only before including imgui.h). +// Otherwise it is possible that different compilation units would see different structure layout. +// If you don't want to modify imconfig.h you can use the IMGUI_USER_CONFIG define to change filename. bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) { bool error = false; if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } - if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } + if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } - if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } - if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } - if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } - if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } + if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } + if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } + if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } + if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } return !error; } @@ -9195,7 +10032,13 @@ void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, vo while (g.DisabledStackSize > stack_sizes->SizeOfDisabledStack) //-V1044 { if (log_callback) log_callback(user_data, "Recovered from missing EndDisabled() in '%s'", window->Name); - EndDisabled(); + if (g.CurrentItemFlags & ImGuiItemFlags_Disabled) + EndDisabled(); + else + { + EndDisabledOverrideReenable(); + g.CurrentWindowStack.back().DisabledOverrideReenable = false; + } } while (g.ColorStack.Size > stack_sizes->SizeOfColorStack) { @@ -9263,81 +10106,28 @@ void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx) IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); } - //----------------------------------------------------------------------------- -// [SECTION] LAYOUT +// [SECTION] ITEM SUBMISSION //----------------------------------------------------------------------------- -// - ItemSize() +// - KeepAliveID() // - ItemAdd() -// - SameLine() -// - GetCursorScreenPos() -// - SetCursorScreenPos() -// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() -// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() -// - GetCursorStartPos() -// - Indent() -// - Unindent() -// - SetNextItemWidth() -// - PushItemWidth() -// - PushMultiItemsWidths() -// - PopItemWidth() -// - CalcItemWidth() -// - CalcItemSize() -// - GetTextLineHeight() -// - GetTextLineHeightWithSpacing() -// - GetFrameHeight() -// - GetFrameHeightWithSpacing() -// - GetContentRegionMax() -// - GetContentRegionMaxAbs() [Internal] -// - GetContentRegionAvail(), -// - GetWindowContentRegionMin(), GetWindowContentRegionMax() -// - BeginGroup() -// - EndGroup() -// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns. //----------------------------------------------------------------------------- -// Advance cursor given item size for layout. -// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. -// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. -void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) +// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). +void ImGui::KeepAliveID(ImGuiID id) { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - if (window->SkipItems) - return; - - // We increase the height in this function to accommodate for baseline offset. - // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, - // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. - const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; - - const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y; - const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y); - - // Always align ourselves on pixel boundaries - //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] - window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; - window->DC.CursorPosPrevLine.y = line_y1; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line - window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line - window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); - window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); - //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] - - window->DC.PrevLineSize.y = line_height; - window->DC.CurrLineSize.y = 0.0f; - window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); - window->DC.CurrLineTextBaseOffset = 0.0f; - window->DC.IsSameLine = window->DC.IsSetPos = false; - - // Horizontal layout mode - if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) - SameLine(); + if (g.ActiveId == id) + g.ActiveIdIsAlive = id; + if (g.ActiveIdPreviousFrame == id) + g.ActiveIdPreviousFrameIsAlive = true; } // Declare item bounding box for clipping and interaction. // Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface // declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. +// THIS IS IN THE PERFORMANCE CRITICAL PATH (UNTIL THE CLIPPING TEST AND EARLY-RETURN) +IM_MSVC_RUNTIME_CHECKS_OFF bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) { ImGuiContext& g = *GImGui; @@ -9348,14 +10138,15 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu g.LastItemData.ID = id; g.LastItemData.Rect = bb; g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; - g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags; + g.LastItemData.InFlags = g.CurrentItemFlags | g.NextItemData.ItemFlags | extra_flags; g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; + // Note: we don't copy 'g.NextItemData.SelectionUserData' to an hypothetical g.LastItemData.SelectionUserData: since the former is not cleared. - // Directional navigation processing if (id != 0) { KeepAliveID(id); + // Directional navigation processing // Runs prior to clipping early-out // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests @@ -9367,6 +10158,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. if (!(g.LastItemData.InFlags & ImGuiItemFlags_NoNav)) { + // FIMXE-NAV: investigate changing the window tests into a simple 'if (g.NavFocusScopeId == g.CurrentFocusScopeId)' test. window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); if (g.NavId == id || g.NavAnyRequest) if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) @@ -9374,12 +10166,13 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu NavProcessItem(); } - // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". - // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". - // READ THE FAQ: https://dearimgui.com/faq - IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasShortcut) + ItemHandleShortcut(id); } + + // Lightweight clear of SetNextItemXXX data. g.NextItemData.Flags = ImGuiNextItemDataFlags_None; + g.NextItemData.ItemFlags = ImGuiItemFlags_None; #ifdef IMGUI_ENABLE_TEST_ENGINE if (id != 0) @@ -9387,24 +10180,30 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu #endif // Clipping test - // (FIXME: This is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value) - //const bool is_clipped = IsClippedEx(bb, id); - //if (is_clipped) - // return false; + // (this is an inline copy of IsClippedEx() so we can reuse the is_rect_visible value, otherwise we'd do 'if (IsClippedEx(bb, id)) return false') + // g.NavActivateId is not necessarily == g.NavId, in the case of remote activation (e.g. shortcuts) const bool is_rect_visible = bb.Overlaps(window->ClipRect); if (!is_rect_visible) - if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId)) - if (!g.LogEnabled) + if (id == 0 || (id != g.ActiveId && id != g.ActiveIdPreviousFrame && id != g.NavId && id != g.NavActivateId)) + if (!g.ItemUnclipByLog) return false; // [DEBUG] #ifndef IMGUI_DISABLE_DEBUG_TOOLS - if (id != 0 && id == g.DebugLocateId) - DebugLocateItemResolveWithLastItem(); -#endif + if (id != 0) + { + if (id == g.DebugLocateId) + DebugLocateItemResolveWithLastItem(); + + // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". + // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". + // READ THE FAQ: https://dearimgui.com/faq + IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); + } //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] //if ((g.LastItemData.InFlags & ImGuiItemFlags_NoNav) == 0) // window->DrawList->AddRect(g.LastItemData.NavRect.Min, g.LastItemData.NavRect.Max, IM_COL32(255,255,0,255)); // [DEBUG] +#endif // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) if (is_rect_visible) @@ -9413,11 +10212,85 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGu g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; return true; } +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] LAYOUT +//----------------------------------------------------------------------------- +// - ItemSize() +// - SameLine() +// - GetCursorScreenPos() +// - SetCursorScreenPos() +// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() +// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() +// - GetCursorStartPos() +// - Indent() +// - Unindent() +// - SetNextItemWidth() +// - PushItemWidth() +// - PushMultiItemsWidths() +// - PopItemWidth() +// - CalcItemWidth() +// - CalcItemSize() +// - GetTextLineHeight() +// - GetTextLineHeightWithSpacing() +// - GetFrameHeight() +// - GetFrameHeightWithSpacing() +// - GetContentRegionMax() +// - GetContentRegionMaxAbs() [Internal] +// - GetContentRegionAvail(), +// - GetWindowContentRegionMin(), GetWindowContentRegionMax() +// - BeginGroup() +// - EndGroup() +// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns. +//----------------------------------------------------------------------------- + +// Advance cursor given item size for layout. +// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. +// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. +// THIS IS IN THE PERFORMANCE CRITICAL PATH. +IM_MSVC_RUNTIME_CHECKS_OFF +void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // We increase the height in this function to accommodate for baseline offset. + // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, + // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. + const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; + + const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y; + const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y); + + // Always align ourselves on pixel boundaries + //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; + window->DC.CursorPosPrevLine.y = line_y1; + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line + window->DC.CursorPos.y = IM_TRUNC(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line + window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); + //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] + + window->DC.PrevLineSize.y = line_height; + window->DC.CurrLineSize.y = 0.0f; + window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); + window->DC.CurrLineTextBaseOffset = 0.0f; + window->DC.IsSameLine = window->DC.IsSetPos = false; + + // Horizontal layout mode + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + SameLine(); +} +IM_MSVC_RUNTIME_CHECKS_RESTORE // Gets back to previous line and continue with horizontal layout // offset_from_start_x == 0 : follow right after previous item // offset_from_start_x != 0 : align to specified x position (relative to window/group left) -// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 +// spacing_w < 0 : use default spacing if offset_from_start_x == 0, no spacing if offset_from_start_x != 0 // spacing_w >= 0 : enforce spacing amount void ImGui::SameLine(float offset_from_start_x, float spacing_w) { @@ -9451,9 +10324,6 @@ ImVec2 ImGui::GetCursorScreenPos() return window->DC.CursorPos; } -// 2022/08/05: Setting cursor position also extend boundaries (via modifying CursorMaxPos) used to compute window size, group size etc. -// I believe this was is a judicious choice but it's probably being relied upon (it has been the case since 1.31 and 1.50) -// It would be sane if we requested user to use SetCursorPos() + Dummy(ImVec2(0,0)) to extend CursorMaxPos... void ImGui::SetCursorScreenPos(const ImVec2& pos) { ImGuiWindow* window = GetCurrentWindow(); @@ -9550,14 +10420,18 @@ void ImGui::PushMultiItemsWidths(int components, float w_full) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(components > 0); const ImGuiStyle& style = g.Style; - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width - window->DC.ItemWidthStack.push_back(w_item_last); - for (int i = 0; i < components - 2; i++) - window->DC.ItemWidthStack.push_back(w_item_one); - window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; + float w_items = w_full - style.ItemInnerSpacing.x * (components - 1); + float prev_split = w_items; + for (int i = components - 1; i > 0; i--) + { + float next_split = IM_TRUNC(w_items * i / components); + window->DC.ItemWidthStack.push_back(ImMax(prev_split - next_split, 1.0f)); + prev_split = next_split; + } + window->DC.ItemWidth = ImMax(prev_split, 1.0f); g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; } @@ -9584,7 +10458,7 @@ float ImGui::CalcItemWidth() float region_max_x = GetContentRegionMaxAbs().x; w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); } - w = IM_FLOOR(w); + w = IM_TRUNC(w); return w; } @@ -9645,10 +10519,8 @@ ImVec2 ImGui::GetContentRegionMax() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max - window->Pos; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x - window->Pos.x; - return mx; + ImVec2 mx = (window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max; + return mx - window->Pos; } // [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. @@ -9656,9 +10528,7 @@ ImVec2 ImGui::GetContentRegionMaxAbs() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImVec2 mx = window->ContentRegionRect.Max; - if (window->DC.CurrentColumns || g.CurrentTable) - mx.x = window->WorkRect.Max.x; + ImVec2 mx = (window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max; return mx; } @@ -9693,6 +10563,7 @@ void ImGui::BeginGroup() ImGuiGroupData& group_data = g.GroupStack.back(); group_data.WindowID = window->ID; group_data.BackupCursorPos = window->DC.CursorPos; + group_data.BackupCursorPosPrevLine = window->DC.CursorPosPrevLine; group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; group_data.BackupIndent = window->DC.Indent; group_data.BackupGroupOffset = window->DC.GroupOffset; @@ -9700,6 +10571,7 @@ void ImGui::BeginGroup() group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; + group_data.BackupIsSameLine = window->DC.IsSameLine; group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; group_data.EmitItem = true; @@ -9726,11 +10598,13 @@ void ImGui::EndGroup() ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); window->DC.CursorPos = group_data.BackupCursorPos; + window->DC.CursorPosPrevLine = group_data.BackupCursorPosPrevLine; window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); window->DC.Indent = group_data.BackupIndent; window->DC.GroupOffset = group_data.BackupGroupOffset; window->DC.CurrLineSize = group_data.BackupCurrLineSize; window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; + window->DC.IsSameLine = group_data.BackupIsSameLine; if (g.LogEnabled) g.LogLinePosY = -FLT_MAX; // To enforce a carriage return @@ -9771,7 +10645,8 @@ void ImGui::EndGroup() g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated; g.GroupStack.pop_back(); - //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] + if (g.DebugShowGroupRects) + window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] } @@ -9810,7 +10685,7 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) } scroll[axis] = scroll_target - center_ratio * (window->SizeFull[axis] - decoration_size[axis]); } - scroll[axis] = IM_FLOOR(ImMax(scroll[axis], 0.0f)); + scroll[axis] = IM_ROUND(ImMax(scroll[axis], 0.0f)); if (!window->Collapsed && !window->SkipItems) scroll[axis] = ImMin(scroll[axis], window->ScrollMax[axis]); } @@ -9865,7 +10740,7 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) { if (can_be_fully_visible_x) - SetScrollFromPosX(window, ImFloor((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f); + SetScrollFromPosX(window, ImTrunc((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f); else SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x, 0.0f); } @@ -9880,7 +10755,7 @@ ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGui else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) { if (can_be_fully_visible_y) - SetScrollFromPosY(window, ImFloor((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f); + SetScrollFromPosY(window, ImTrunc((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f); else SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y, 0.0f); } @@ -9965,7 +10840,7 @@ void ImGui::SetScrollY(float scroll_y) void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) { IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); - window->ScrollTarget.x = IM_FLOOR(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset + window->ScrollTarget.x = IM_TRUNC(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset window->ScrollTargetCenterRatio.x = center_x_ratio; window->ScrollTargetEdgeSnapDist.x = 0.0f; } @@ -9973,7 +10848,7 @@ void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) { IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); - window->ScrollTarget.y = IM_FLOOR(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset + window->ScrollTarget.y = IM_TRUNC(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset window->ScrollTargetCenterRatio.y = center_y_ratio; window->ScrollTargetEdgeSnapDist.y = 0.0f; } @@ -10025,31 +10900,40 @@ bool ImGui::BeginTooltip() return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); } +bool ImGui::BeginItemTooltip() +{ + if (!IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + return false; + return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); +} + bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) { ImGuiContext& g = *GImGui; if (g.DragDropWithinSource || g.DragDropWithinTarget) { - // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) - // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. - // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. + // Drag and Drop tooltips are positioning differently than other tooltips: + // - offset visibility to increase visibility around mouse. + // - never clamp within outer viewport boundary. + // We call SetNextWindowPos() to enforce position and disable clamping. + // See FindBestWindowPosForPopup() for positionning logic of other tooltips (not drag and drop ones). //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; - ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); + ImVec2 tooltip_pos = g.IO.MousePos + TOOLTIP_DEFAULT_OFFSET * g.Style.MouseCursorScale; SetNextWindowPos(tooltip_pos); SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( - tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; + tooltip_flags |= ImGuiTooltipFlags_OverridePrevious; } char window_name[16]; ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); - if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) + if (tooltip_flags & ImGuiTooltipFlags_OverridePrevious) if (ImGuiWindow* window = FindWindowByName(window_name)) if (window->Active) { // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. - SetWindowHiddendAndSkipItemsForCurrentFrame(window); + SetWindowHiddenAndSkipItemsForCurrentFrame(window); ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); } ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; @@ -10064,26 +10948,44 @@ bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags ext void ImGui::EndTooltip() { - IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls - End(); + IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls + End(); +} + +void ImGui::SetTooltip(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + SetTooltipV(fmt, args); + va_end(args); } void ImGui::SetTooltipV(const char* fmt, va_list args) { - if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None)) + if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None)) return; TextV(fmt, args); EndTooltip(); } -void ImGui::SetTooltip(const char* fmt, ...) +// Shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav'. +// Defaults to == ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort when using the mouse. +void ImGui::SetItemTooltip(const char* fmt, ...) { va_list args; va_start(args, fmt); - SetTooltipV(fmt, args); + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + SetTooltipV(fmt, args); va_end(args); } +void ImGui::SetItemTooltipV(const char* fmt, va_list args) +{ + if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + SetTooltipV(fmt, args); +} + + //----------------------------------------------------------------------------- // [SECTION] POPUPS //----------------------------------------------------------------------------- @@ -10181,7 +11083,7 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. popup_ref.PopupId = id; popup_ref.Window = NULL; - popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type). + popup_ref.RestoreNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type). popup_ref.OpenFrameCount = g.FrameCount; popup_ref.OpenParentId = parent_window->IDStack.back(); popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); @@ -10194,17 +11096,23 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) } else { - // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui - // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing - // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand. - if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) - { + // Gently handle the user mistakenly calling OpenPopup() every frames: it is likely a programming mistake! + // However, if we were to run the regular code path, the ui would become completely unusable because the popup will always be + // in hidden-while-calculating-size state _while_ claiming focus. Which is extremely confusing situation for the programmer. + // Instead, for successive frames calls to OpenPopup(), we silently avoid reopening even if ImGuiPopupFlags_NoReopen is not specified. + bool keep_existing = false; + if (g.OpenPopupStack[current_stack_size].PopupId == id) + if ((g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) || (popup_flags & ImGuiPopupFlags_NoReopen)) + keep_existing = true; + if (keep_existing) + { + // No reopen g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount; } else { - // Close child popups if any, then flag popup for open/reopen - ClosePopupToLevel(current_stack_size, false); + // Reopen: close child popups if any, then flag popup for open/reopen (set position, focus, init navigation) + ClosePopupToLevel(current_stack_size, true); g.OpenPopupStack.push_back(popup_ref); } @@ -10224,6 +11132,7 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to return; // Don't close our own child popup windows. + //IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\") restore_under=%d\n", ref_window ? ref_window->Name : "", restore_focus_to_window_under_popup); int popup_count_to_keep = 0; if (ref_window) { @@ -10234,14 +11143,15 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to if (!popup.Window) continue; IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); - if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) - continue; // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) - // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: - // Window -> Popup1 -> Popup2 -> Popup3 + // - Clicking/Focusing Window2 won't close Popup1: + // Window -> Popup1 -> Window2(Ref) + // - Clicking/focusing Popup1 will close Popup2 and Popup3: + // Window -> Popup1(Ref) -> Popup2 -> Popup3 // - Each popups may contain child windows, which is why we compare ->RootWindow! // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child + // We step through every popup from bottom to top to validate their position relative to reference window. bool ref_window_is_descendent_of_popup = false; for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) @@ -10279,18 +11189,19 @@ void ImGui::ClosePopupsExceptModals() void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) { ImGuiContext& g = *GImGui; - IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); + IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_under=%d\n", remaining, restore_focus_to_window_under_popup); IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); // Trim open popup stack - ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; - ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow; + ImGuiPopupData prev_popup = g.OpenPopupStack[remaining]; g.OpenPopupStack.resize(remaining); - if (restore_focus_to_window_under_popup) + // Restore focus (unless popup window was not yet submitted, and didn't have a chance to take focus anyhow. See #7325 for an edge case) + if (restore_focus_to_window_under_popup && prev_popup.Window) { - ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window; - if (focus_window && !focus_window->WasActive && popup_window) + ImGuiWindow* popup_window = prev_popup.Window; + ImGuiWindow* focus_window = (popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : prev_popup.RestoreNavWindow; + if (focus_window && !focus_window->WasActive) FocusTopMostWindowUnderOne(popup_window, NULL, NULL, ImGuiFocusRequestFlags_RestoreFocusedChild); // Fallback else FocusWindow(focus_window, (g.NavLayer == ImGuiNavLayer_Main) ? ImGuiFocusRequestFlags_RestoreFocusedChild : ImGuiFocusRequestFlags_None); @@ -10340,7 +11251,7 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) char name[20]; if (flags & ImGuiWindowFlags_ChildMenu) - ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth + ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuDepth); // Recycle windows based on depth else ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame @@ -10349,6 +11260,8 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) EndPopup(); + //g.CurrentWindow->FocusRouteParentWindow = g.CurrentWindow->ParentWindowInBeginStack; + return is_open; } @@ -10366,7 +11279,9 @@ bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) } // If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. -// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. +// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup). +// - *p_open set back to false in BeginPopupModal() when popup is not open. +// - if you set *p_open to false before calling BeginPopupModal(), it will close the popup. bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) { ImGuiContext& g = *GImGui; @@ -10375,6 +11290,8 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla if (!IsPopupOpen(id, ImGuiPopupFlags_None)) { g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + if (p_open && *p_open) + *p_open = false; return false; } @@ -10606,15 +11523,20 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) } if (window->Flags & ImGuiWindowFlags_Tooltip) { - // Position tooltip (always follows mouse) - float sc = g.Style.MouseCursorScale; - ImVec2 ref_pos = NavCalcPreferredRefPos(); + // Position tooltip (always follows mouse + clamp within outer boundaries) + // Note that drag and drop tooltips are NOT using this path: BeginTooltipEx() manually sets their position. + // In theory we could handle both cases in same location, but requires a bit of shuffling as drag and drop tooltips are calling SetWindowPos() leading to 'window_pos_set_by_api' being set in Begin() + IM_ASSERT(g.CurrentWindow == window); + const float scale = g.Style.MouseCursorScale; + const ImVec2 ref_pos = NavCalcPreferredRefPos(); + const ImVec2 tooltip_pos = ref_pos + TOOLTIP_DEFAULT_OFFSET * scale; ImRect r_avoid; if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)) r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); else - r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. - return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * scale, ref_pos.y + 24 * scale); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. + //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255, 0, 255, 255)); + return FindBestWindowPosForPopupEx(tooltip_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); } IM_ASSERT(0); return window->Pos; @@ -10635,11 +11557,19 @@ void ImGui::SetNavWindow(ImGuiWindow* window) { IMGUI_DEBUG_LOG_FOCUS("[focus] SetNavWindow(\"%s\")\n", window ? window->Name : ""); g.NavWindow = window; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; } g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false; NavUpdateAnyRequestFlag(); } +void ImGui::NavHighlightActivated(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavHighlightActivatedId = id; + g.NavHighlightActivatedTimer = NAV_ACTIVATE_HIGHLIGHT_TIMER; +} + void ImGui::NavClearPreferredPosForAxis(ImGuiAxis axis) { ImGuiContext& g = *GImGui; @@ -10653,7 +11583,7 @@ void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); g.NavId = id; g.NavLayer = nav_layer; - g.NavFocusScopeId = focus_scope_id; + SetNavFocusScope(focus_scope_id); g.NavWindow->NavLastIds[nav_layer] = id; g.NavWindow->NavRectRel[nav_layer] = rect_rel; @@ -10675,7 +11605,7 @@ void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; g.NavId = id; g.NavLayer = nav_layer; - g.NavFocusScopeId = g.CurrentFocusScopeId; + SetNavFocusScope(g.CurrentFocusScopeId); window->NavLastIds[nav_layer] = id; if (g.LastItemData.ID == id) window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect); @@ -10731,7 +11661,10 @@ static bool ImGui::NavScoreItem(ImGuiNavItemData* result) // Compute distance between boxes // FIXME-NAV: Introducing biases for vertical navigation, needs to be removed. float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x); - float dby = NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)); // Scale down on Y to keep using box-distance for vertically touching items + float dby = ImFabs(cand.Min.y - curr.Max.y) < 1 || ImFabs(cand.Max.y - curr.Min.y) < 1 + // Scale down on Y to keep using box-distance for vertically touching items + ? NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)) + : NavScoreItemDistInterval(cand.Min.y, cand.Max.y, curr.Min.y, curr.Max.y); if (dby != 0.0f && dbx != 0.0f) dbx = (dbx / 1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); float dist_box = ImFabs(dbx) + ImFabs(dby); @@ -10854,6 +11787,11 @@ static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result) result->FocusScopeId = g.CurrentFocusScopeId; result->InFlags = g.LastItemData.InFlags; result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect); + if (result->InFlags & ImGuiItemFlags_HasSelectionUserData) + { + IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid); + result->SelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData. + } } // True when current work location may be scrolled horizontally when moving left / right. @@ -10866,7 +11804,7 @@ void ImGui::NavUpdateCurrentWindowIsScrollPushableX() } // We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) -// This is called after LastItemData is set. +// This is called after LastItemData is set, but NextItemData is also still valid. static void ImGui::NavProcessItem() { ImGuiContext& g = *GImGui; @@ -10902,23 +11840,26 @@ static void ImGui::NavProcessItem() // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy) if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0) { - const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0; - if (is_tabbing) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi) || (window->Flags & ImGuiWindowFlags_NoNavInputs) == 0) { - NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags); - } - else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) - { - ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; - if (NavScoreItem(result)) - NavApplyItemToResult(result); - - // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. - const float VISIBLE_RATIO = 0.70f; - if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) - if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) - if (NavScoreItem(&g.NavMoveResultLocalVisible)) - NavApplyItemToResult(&g.NavMoveResultLocalVisible); + const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0; + if (is_tabbing) + { + NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags); + } + else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) + { + ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; + if (NavScoreItem(result)) + NavApplyItemToResult(result); + + // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. + const float VISIBLE_RATIO = 0.70f; + if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) + if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) + if (NavScoreItem(&g.NavMoveResultLocalVisible)) + NavApplyItemToResult(&g.NavMoveResultLocalVisible); + } } } @@ -10928,8 +11869,14 @@ static void ImGui::NavProcessItem() if (g.NavWindow != window) SetNavWindow(window); // Always refresh g.NavWindow, because some operations such as FocusItem() may not have a window. g.NavLayer = window->DC.NavLayerCurrent; + SetNavFocusScope(g.CurrentFocusScopeId); // Will set g.NavFocusScopeId AND store g.NavFocusScopePath g.NavFocusScopeId = g.CurrentFocusScopeId; g.NavIdIsAlive = true; + if (g.LastItemData.InFlags & ImGuiItemFlags_HasSelectionUserData) + { + IM_ASSERT(g.NextItemData.SelectionUserData != ImGuiSelectionUserData_Invalid); + g.NavLastValidSelectionUserData = g.NextItemData.SelectionUserData; // INTENTIONAL: At this point this field is not cleared in NextItemData. Avoid unnecessary copy to LastItemData. + } window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position) } } @@ -10946,8 +11893,12 @@ void ImGui::NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flag ImGuiContext& g = *GImGui; if ((move_flags & ImGuiNavMoveFlags_FocusApi) == 0) + { if (g.NavLayer != g.CurrentWindow->DC.NavLayerCurrent) return; + if (g.NavFocusScopeId != g.CurrentFocusScopeId) + return; + } // - Can always land on an item when using API call. // - Tabbing with _NavEnableKeyboard (space/enter/arrows): goes through every item. @@ -11008,7 +11959,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM ImGuiContext& g = *GImGui; IM_ASSERT(g.NavWindow != NULL); - if (move_flags & ImGuiNavMoveFlags_Tabbing) + if (move_flags & ImGuiNavMoveFlags_IsTabbing) move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId; g.NavMoveSubmitted = g.NavMoveScoringItems = true; @@ -11018,7 +11969,7 @@ void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavM g.NavMoveFlags = move_flags; g.NavMoveScrollFlags = scroll_flags; g.NavMoveForwardToNextFrame = false; - g.NavMoveKeyMods = g.IO.KeyMods; + g.NavMoveKeyMods = (move_flags & ImGuiNavMoveFlags_FocusApi) ? 0 : g.IO.KeyMods; g.NavMoveResultLocal.Clear(); g.NavMoveResultLocalVisible.Clear(); g.NavMoveResultOther.Clear(); @@ -11035,6 +11986,19 @@ void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result) NavUpdateAnyRequestFlag(); } +// Called by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere +void ImGui::NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiNavTreeNodeData* tree_node_data) +{ + ImGuiContext& g = *GImGui; + g.NavMoveScoringItems = false; + g.LastItemData.ID = tree_node_data->ID; + g.LastItemData.InFlags = tree_node_data->InFlags & ~ImGuiItemFlags_HasSelectionUserData; // Losing SelectionUserData, recovered next-frame (cheaper). + g.LastItemData.NavRect = tree_node_data->NavRect; + NavApplyItemToResult(result); // Result this instead of implementing a NavApplyPastTreeNodeToResult() + NavClearPreferredPosForAxis(ImGuiAxis_Y); + NavUpdateAnyRequestFlag(); +} + void ImGui::NavMoveRequestCancel() { ImGuiContext& g = *GImGui; @@ -11095,6 +12059,7 @@ void ImGui::NavRestoreLayer(ImGuiNavLayer layer) { ImGuiWindow* prev_nav_window = g.NavWindow; g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); // FIXME-NAV: Should clear ongoing nav requests? + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; if (prev_nav_window) IMGUI_DEBUG_LOG_FOCUS("[focus] NavRestoreLayer: from \"%s\" to SetNavWindow(\"%s\")\n", prev_nav_window->Name, g.NavWindow->Name); } @@ -11134,7 +12099,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) if (window->Flags & ImGuiWindowFlags_NoNavInputs) { g.NavId = 0; - g.NavFocusScopeId = window->NavRootFocusScopeId; + SetNavFocusScope(window->NavRootFocusScopeId); return; } @@ -11153,7 +12118,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) else { g.NavId = window->NavLastIds[0]; - g.NavFocusScopeId = window->NavRootFocusScopeId; + SetNavFocusScope(window->NavRootFocusScopeId); } } @@ -11161,7 +12126,10 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.NavWindow; - if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) + const bool activated_shortcut = g.ActiveId != 0 && g.ActiveIdFromShortcut && g.ActiveId == g.LastItemData.ID; + + // Testing for !activated_shortcut here could in theory be removed if we decided that activating a remote shortcut altered one of the g.NavDisableXXX flag. + if ((g.NavDisableHighlight || !g.NavDisableMouseHover || !window) && !activated_shortcut) { // Mouse (we need a fallback in case the mouse becomes invalid after being used) // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. @@ -11172,16 +12140,21 @@ static ImVec2 ImGui::NavCalcPreferredRefPos() else { // When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item + ImRect ref_rect; + if (activated_shortcut) + ref_rect = g.LastItemData.NavRect; + else + ref_rect = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); + // Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?) - ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX)) { ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); - rect_rel.Translate(window->Scroll - next_scroll); + ref_rect.Translate(window->Scroll - next_scroll); } - ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); + ImVec2 pos = ImVec2(ref_rect.Min.x + ImMin(g.Style.FramePadding.x * 4, ref_rect.GetWidth()), ref_rect.Max.y - ImMin(g.Style.FramePadding.y, ref_rect.GetHeight())); ImGuiViewport* viewport = GetMainViewport(); - return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. + return ImTrunc(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImTrunc() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. } } @@ -11274,10 +12247,10 @@ static void ImGui::NavUpdate() g.NavActivateFlags = ImGuiActivateFlags_None; if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) { - const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate)); - const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, false))); - const bool input_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Enter)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput)); - const bool input_pressed = input_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Enter, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, false))); + const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate, ImGuiKeyOwner_NoOwner)); + const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, 0, ImGuiKeyOwner_NoOwner)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, 0, ImGuiKeyOwner_NoOwner))); + const bool input_down = (nav_keyboard_active && (IsKeyDown(ImGuiKey_Enter, ImGuiKeyOwner_NoOwner) || IsKeyDown(ImGuiKey_KeypadEnter, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput, ImGuiKeyOwner_NoOwner)); + const bool input_pressed = input_down && ((nav_keyboard_active && (IsKeyPressed(ImGuiKey_Enter, 0, ImGuiKeyOwner_NoOwner) || IsKeyPressed(ImGuiKey_KeypadEnter, 0, ImGuiKeyOwner_NoOwner))) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, 0, ImGuiKeyOwner_NoOwner))); if (g.ActiveId == 0 && activate_pressed) { g.NavActivateId = g.NavId; @@ -11291,13 +12264,22 @@ static void ImGui::NavUpdate() if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_down || input_down)) g.NavActivateDownId = g.NavId; if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_pressed || input_pressed)) + { g.NavActivatePressedId = g.NavId; + NavHighlightActivated(g.NavId); + } } if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) g.NavDisableHighlight = true; if (g.NavActivateId != 0) IM_ASSERT(g.NavActivateDownId == g.NavActivateId); + // Highlight + if (g.NavHighlightActivatedTimer > 0.0f) + g.NavHighlightActivatedTimer = ImMax(0.0f, g.NavHighlightActivatedTimer - io.DeltaTime); + if (g.NavHighlightActivatedTimer == 0.0f) + g.NavHighlightActivatedId = 0; + // Process programmatic activation request // FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others) if (g.NavNextActivateId != 0) @@ -11324,9 +12306,9 @@ static void ImGui::NavUpdate() if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY && move_dir != ImGuiDir_None) { if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) - SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollX(window, ImTrunc(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) - SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); + SetScrollY(window, ImTrunc(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); } // *Normal* Manual scroll with LStick @@ -11336,9 +12318,9 @@ static void ImGui::NavUpdate() const ImVec2 scroll_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); const float tweak_factor = IsKeyDown(ImGuiKey_NavGamepadTweakSlow) ? 1.0f / 10.0f : IsKeyDown(ImGuiKey_NavGamepadTweakFast) ? 10.0f : 1.0f; if (scroll_dir.x != 0.0f && window->ScrollbarX) - SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); + SetScrollX(window, ImTrunc(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); if (scroll_dir.y != 0.0f) - SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); + SetScrollY(window, ImTrunc(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); } } @@ -11352,11 +12334,7 @@ static void ImGui::NavUpdate() // Update mouse position if requested // (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied) if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) - { - io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); - io.WantSetMousePos = true; - //IMGUI_DEBUG_LOG_IO("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); - } + TeleportMousePos(NavCalcPreferredRefPos()); // [DEBUG] g.NavScoringDebugCount = 0; @@ -11390,6 +12368,8 @@ void ImGui::NavInitRequestApplyResult() IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result + if (result->SelectionUserData != ImGuiSelectionUserData_Invalid) + g.NavLastValidSelectionUserData = result->SelectionUserData; if (g.NavInitRequestFromMove) NavRestoreHighlightAfterMove(); } @@ -11444,10 +12424,10 @@ void ImGui::NavUpdateCreateMoveRequest() if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) { const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateNavMove; - if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; } - if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Left; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Right; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Up; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, repeat_mode, ImGuiKeyOwner_NoOwner)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, repeat_mode, ImGuiKeyOwner_NoOwner)))) { g.NavMoveDir = ImGuiDir_Down; } } g.NavMoveClipDir = g.NavMoveDir; g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); @@ -11527,7 +12507,7 @@ void ImGui::NavUpdateCreateMoveRequest() scoring_rect.TranslateY(scoring_rect_offset_y); if (g.NavMoveSubmitted) NavBiasScoringRect(scoring_rect, window->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer], g.NavMoveDir, g.NavMoveFlags); - IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem(). + IM_ASSERT(!scoring_rect.IsInverted()); // Ensure we have a non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem(). //GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG] //if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG] } @@ -11543,22 +12523,22 @@ void ImGui::NavUpdateCreateTabbingRequest() if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) return; - const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat) && !g.IO.KeyCtrl && !g.IO.KeyAlt; + const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner) && !g.IO.KeyCtrl && !g.IO.KeyAlt; if (!tab_pressed) return; // Initiate tabbing request // (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!) - // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests. // See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping. const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; if (nav_keyboard_active) g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.NavDisableHighlight == true && g.ActiveId == 0) ? 0 : +1; else g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1; + ImGuiNavMoveFlags move_flags = ImGuiNavMoveFlags_IsTabbing | ImGuiNavMoveFlags_Activate; ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down; - NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + NavMoveRequestSubmit(ImGuiDir_None, clip_dir, move_flags, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. g.NavTabbingCounter = -1; } @@ -11575,7 +12555,7 @@ void ImGui::NavMoveRequestApplyResult() ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL; // Tabbing forward wrap - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && result == NULL) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && result == NULL) if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID) result = &g.NavTabbingResultFirst; @@ -11583,9 +12563,9 @@ void ImGui::NavMoveRequestApplyResult() const ImGuiAxis axis = (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X; if (result == NULL) { - if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) + g.NavMoveFlags |= ImGuiNavMoveFlags_NoSetNavHighlight; + if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavHighlight) == 0) NavRestoreHighlightAfterMove(); NavClearPreferredPosForAxis(axis); // On a failed move, clear preferred pos for this axis. IMGUI_DEBUG_LOG_NAV("[nav] NavMoveSubmitted but not led to a result!\n"); @@ -11621,12 +12601,19 @@ void ImGui::NavMoveRequestApplyResult() { IMGUI_DEBUG_LOG_FOCUS("[focus] NavMoveRequest: SetNavWindow(\"%s\")\n", result->Window->Name); g.NavWindow = result->Window; + g.NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; } - if (g.ActiveId != result->ID) + + // Clear active id unless requested not to + // FIXME: ImGuiNavMoveFlags_NoClearActiveId is currently unused as we don't have a clear strategy to preserve active id after interaction, + // so this is mostly provided as a gateway for further experiments (see #1418, #2890) + if (g.ActiveId != result->ID && (g.NavMoveFlags & ImGuiNavMoveFlags_NoClearActiveId) == 0) ClearActiveID(); - if (g.NavId != result->ID) + + // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) + // PageUp/PageDown however sets always set NavJustMovedTo (vs Home/End which doesn't) mimicking Windows behavior. + if ((g.NavId != result->ID || (g.NavMoveFlags & ImGuiNavMoveFlags_IsPageMove)) && (g.NavMoveFlags & ImGuiNavMoveFlags_NoSelect) == 0) { - // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) g.NavJustMovedToId = result->ID; g.NavJustMovedToFocusScopeId = result->FocusScopeId; g.NavJustMovedToKeyMods = g.NavMoveKeyMods; @@ -11636,32 +12623,32 @@ void ImGui::NavMoveRequestApplyResult() IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); ImVec2 preferred_scoring_pos_rel = g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer]; SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); + if (result->SelectionUserData != ImGuiSelectionUserData_Invalid) + g.NavLastValidSelectionUserData = result->SelectionUserData; // Restore last preferred position for current axis // (storing in RootWindowForNav-> as the info is desirable at the beginning of a Move Request. In theory all storage should use RootWindowForNav..) - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) == 0) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) == 0) { preferred_scoring_pos_rel[axis] = result->RectRel.GetCenter()[axis]; g.NavWindow->RootWindowForNav->NavPreferredScoringPosRel[g.NavLayer] = preferred_scoring_pos_rel; } - // Tabbing: Activates Inputable or Focus non-Inputable - if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable)) - { - g.NavNextActivateId = result->ID; - g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState; - g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; - } + // Tabbing: Activates Inputable, otherwise only Focus + if ((g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) && (result->InFlags & ImGuiItemFlags_Inputable) == 0) + g.NavMoveFlags &= ~ImGuiNavMoveFlags_Activate; // Activate if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate) { g.NavNextActivateId = result->ID; g.NavNextActivateFlags = ImGuiActivateFlags_None; + if (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) + g.NavNextActivateFlags |= ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState | ImGuiActivateFlags_FromTabbing; } // Enable nav highlight - if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + if ((g.NavMoveFlags & ImGuiNavMoveFlags_NoSetNavHighlight) == 0) NavRestoreHighlightAfterMove(); } @@ -11674,7 +12661,7 @@ static void ImGui::NavUpdateCancelRequest() ImGuiContext& g = *GImGui; const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, ImGuiKeyOwner_None)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, ImGuiKeyOwner_None))) + if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, 0, ImGuiKeyOwner_NoOwner)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, 0, ImGuiKeyOwner_NoOwner))) return; IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); @@ -11688,15 +12675,14 @@ static void ImGui::NavUpdateCancelRequest() NavRestoreLayer(ImGuiNavLayer_Main); NavRestoreHighlightAfterMove(); } - else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) + else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow) { // Exit child window - ImGuiWindow* child_window = g.NavWindow; - ImGuiWindow* parent_window = g.NavWindow->ParentWindow; + ImGuiWindow* child_window = g.NavWindow->RootWindowForNav; + ImGuiWindow* parent_window = child_window->ParentWindow; IM_ASSERT(child_window->ChildId != 0); - ImRect child_rect = child_window->Rect(); FocusWindow(parent_window); - SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect)); + SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_window->Rect())); NavRestoreHighlightAfterMove(); } else if (g.OpenPopupStack.Size > 0 && g.OpenPopupStack.back().Window != NULL && !(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) @@ -11724,10 +12710,10 @@ static float ImGui::NavUpdatePageUpPageDown() if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL) return 0.0f; - const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_None); - const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_None); - const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); - const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); + const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_NoOwner); + const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_NoOwner); + const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); + const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner); if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out return 0.0f; @@ -11737,9 +12723,9 @@ static float ImGui::NavUpdatePageUpPageDown() if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavWindowHasScrollY) { // Fallback manual-scroll when window has no navigable item - if (IsKeyPressed(ImGuiKey_PageUp, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + if (IsKeyPressed(ImGuiKey_PageUp, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); - else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiInputFlags_Repeat, ImGuiKeyOwner_NoOwner)) SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); else if (home_pressed) SetScrollY(window, 0.0f); @@ -11756,14 +12742,14 @@ static float ImGui::NavUpdatePageUpPageDown() nav_scoring_rect_offset_y = -page_offset_y; g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) g.NavMoveClipDir = ImGuiDir_Up; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove; } else if (IsKeyPressed(ImGuiKey_PageDown, true)) { nav_scoring_rect_offset_y = +page_offset_y; g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) g.NavMoveClipDir = ImGuiDir_Down; - g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet | ImGuiNavMoveFlags_IsPageMove; } else if (home_pressed) { @@ -11928,12 +12914,13 @@ static void ImGui::NavUpdateWindowing() } // Start CTRL+Tab or Square+L/R window selection + // (g.ConfigNavWindowingKeyNext/g.ConfigNavWindowingKeyPrev defaults are ImGuiMod_Ctrl|ImGuiKey_Tab and ImGuiMod_Ctrl|ImGuiMod_Shift|ImGuiKey_Tab) const ImGuiID owner_id = ImHashStr("###NavUpdateWindowing"); const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; - const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, owner_id, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); - const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, owner_id, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); - const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, 0, ImGuiInputFlags_None); + const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); + const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id); + const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_None); const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard! if (start_windowing_with_gamepad || start_windowing_with_keyboard) if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) @@ -11944,7 +12931,7 @@ static void ImGui::NavUpdateWindowing() g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; - // Register ownership of our mods. Using ImGuiInputFlags_RouteGlobalHigh in the Shortcut() calls instead would probably be correct but may have more side-effects. + // Manually register ownership of our mods. Using a global route in the Shortcut() calls instead would probably be correct but may have more side-effects. if (keyboard_next_window || keyboard_prev_window) SetKeyOwnersForKeyChord((g.ConfigNavWindowingKeyNext | g.ConfigNavWindowingKeyPrev) & ImGuiMod_Mask_, owner_id); } @@ -11990,28 +12977,33 @@ static void ImGui::NavUpdateWindowing() } // Keyboard: Press and Release ALT to toggle menu layer - // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. - // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. - if (nav_keyboard_active && IsKeyPressed(ImGuiMod_Alt, ImGuiKeyOwner_None)) - { - g.NavWindowingToggleLayer = true; - g.NavInputSource = ImGuiInputSource_Keyboard; - } + const ImGuiKey windowing_toggle_keys[] = { ImGuiKey_LeftAlt, ImGuiKey_RightAlt }; + for (ImGuiKey windowing_toggle_key : windowing_toggle_keys) + if (nav_keyboard_active && IsKeyPressed(windowing_toggle_key, 0, ImGuiKeyOwner_NoOwner)) + { + g.NavWindowingToggleLayer = true; + g.NavWindowingToggleKey = windowing_toggle_key; + g.NavInputSource = ImGuiInputSource_Keyboard; + break; + } if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard) { // We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370) // We cancel toggling nav layer when other modifiers are pressed. (See #4439) + // - AltGR is Alt+Ctrl on some layout but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). // We cancel toggling nav layer if an owner has claimed the key. - if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_None) == false) + if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper) + g.NavWindowingToggleLayer = false; + if (TestKeyOwner(g.NavWindowingToggleKey, ImGuiKeyOwner_NoOwner) == false || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_NoOwner) == false) g.NavWindowingToggleLayer = false; - // Apply layer toggle on release + // Apply layer toggle on Alt release // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. - if (IsKeyReleased(ImGuiMod_Alt) && g.NavWindowingToggleLayer) + if (IsKeyReleased(g.NavWindowingToggleKey) && g.NavWindowingToggleLayer) if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) apply_toggle_layer = true; - if (!IsKeyDown(ImGuiMod_Alt)) + if (!IsKeyDown(g.NavWindowingToggleKey)) g.NavWindowingToggleLayer = false; } @@ -12029,7 +13021,7 @@ static void ImGui::NavUpdateWindowing() const float move_step = NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); g.NavWindowingAccumDeltaPos += nav_move_dir * move_step; g.NavDisableMouseHover = true; - ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaPos); + ImVec2 accum_floored = ImTrunc(g.NavWindowingAccumDeltaPos); if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) { ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; @@ -12150,6 +13142,8 @@ bool ImGui::IsDragDropActive() void ImGui::ClearDragDrop() { ImGuiContext& g = *GImGui; + if (g.DragDropActive) + IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] ClearDragDrop()\n"); g.DragDropActive = false; g.DragDropPayload.Clear(); g.DragDropAcceptFlags = ImGuiDragDropFlags_None; @@ -12161,6 +13155,14 @@ void ImGui::ClearDragDrop() memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); } +bool ImGui::BeginTooltipHidden() +{ + ImGuiContext& g = *GImGui; + bool ret = Begin("##Tooltip_Hidden", NULL, ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize); + SetWindowHiddenAndSkipItemsForCurrentFrame(g.CurrentWindow); + return ret; +} + // When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() // If the item has an identifier: // - This assume/require the item to be activated (typically via ButtonBehavior). @@ -12180,7 +13182,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) bool source_drag_active = false; ImGuiID source_id = 0; ImGuiID source_parent_id = 0; - if (!(flags & ImGuiDragDropFlags_SourceExtern)) + if ((flags & ImGuiDragDropFlags_SourceExtern) == 0) { source_id = g.LastItemData.ID; if (source_id != 0) @@ -12217,7 +13219,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) // Rely on keeping other window->LastItemXXX fields intact. source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect); KeepAliveID(source_id); - bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id); + bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id, g.LastItemData.InFlags); if (is_hovered && g.IO.MouseClicked[mouse_button]) { SetActiveID(source_id, window); @@ -12241,42 +13243,45 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) source_drag_active = true; } - if (source_drag_active) - { - if (!g.DragDropActive) - { - IM_ASSERT(source_id != 0); - ClearDragDrop(); - ImGuiPayload& payload = g.DragDropPayload; - payload.SourceId = source_id; - payload.SourceParentId = source_parent_id; - g.DragDropActive = true; - g.DragDropSourceFlags = flags; - g.DragDropMouseButton = mouse_button; - if (payload.SourceId == g.ActiveId) - g.ActiveIdNoClearOnFocusLoss = true; - } - g.DragDropSourceFrameCount = g.FrameCount; - g.DragDropWithinSource = true; - - if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) - { - // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) - // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. - bool ret = BeginTooltip(); - IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame(). - IM_UNUSED(ret); + IM_ASSERT(g.DragDropWithinTarget == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() + if (!source_drag_active) + return false; - if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) - SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow); - } + // Activate drag and drop + if (!g.DragDropActive) + { + IM_ASSERT(source_id != 0); + ClearDragDrop(); + IMGUI_DEBUG_LOG_ACTIVEID("[dragdrop] BeginDragDropSource() DragDropActive = true, source_id = %08X\n", source_id); + ImGuiPayload& payload = g.DragDropPayload; + payload.SourceId = source_id; + payload.SourceParentId = source_parent_id; + g.DragDropActive = true; + g.DragDropSourceFlags = flags; + g.DragDropMouseButton = mouse_button; + if (payload.SourceId == g.ActiveId) + g.ActiveIdNoClearOnFocusLoss = true; + } + g.DragDropSourceFrameCount = g.FrameCount; + g.DragDropWithinSource = true; + + if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + { + // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) + // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. + bool ret; + if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) + ret = BeginTooltipHidden(); + else + ret = BeginTooltip(); + IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame(). + IM_UNUSED(ret); + } - if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) - g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect; + if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) + g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect; - return true; - } - return false; + return true; } void ImGui::EndDragDropSource() @@ -12355,15 +13360,16 @@ bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) if (window->SkipItems) return false; - IM_ASSERT(g.DragDropWithinTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() g.DragDropTargetRect = bb; + g.DragDropTargetClipRect = window->ClipRect; // May want to be overriden by user depending on use case? g.DragDropTargetId = id; g.DragDropWithinTarget = true; return true; } // We don't use BeginDragDropTargetCustom() and duplicate its code because: -// 1) we use LastItemRectHoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. +// 1) we use LastItemData's ImGuiItemStatusFlags_HoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. // 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. // Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) bool ImGui::BeginDragDropTarget() @@ -12389,8 +13395,9 @@ bool ImGui::BeginDragDropTarget() if (g.DragDropPayload.SourceId == id) return false; - IM_ASSERT(g.DragDropWithinTarget == false); + IM_ASSERT(g.DragDropWithinTarget == false && g.DragDropWithinSource == false); // Can't nest BeginDragDropSource() and BeginDragDropTarget() g.DragDropTargetRect = display_rect; + g.DragDropTargetClipRect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasClipRect) ? g.LastItemData.ClipRect : window->ClipRect; g.DragDropTargetId = id; g.DragDropWithinTarget = true; return true; @@ -12405,7 +13412,6 @@ bool ImGui::IsDragDropPayloadBeingAccepted() const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) { ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; ImGuiPayload& payload = g.DragDropPayload; IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? @@ -12429,7 +13435,7 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop payload.Preview = was_accepted_previously; flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that live for 1 frame) if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) - window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + RenderDragDropTargetRect(r, g.DragDropTargetClipRect); g.DragDropAcceptFrameCount = g.FrameCount; payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() @@ -12440,10 +13446,20 @@ const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDrop return &payload; } -// FIXME-DRAGDROP: Settle on a proper default visuals for drop target. -void ImGui::RenderDragDropTargetRect(const ImRect& bb) +// FIXME-STYLE FIXME-DRAGDROP: Settle on a proper default visuals for drop target. +void ImGui::RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect) { - GetWindowDrawList()->AddRect(bb.Min - ImVec2(3.5f, 3.5f), bb.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImRect bb_display = bb; + bb_display.ClipWith(item_clip_rect); // Clip THEN expand so we have a way to visualize that target is not entirely visible. + bb_display.Expand(3.5f); + bool push_clip_rect = !window->ClipRect.Contains(bb_display); + if (push_clip_rect) + window->DrawList->PushClipRectFullScreen(); + window->DrawList->AddRect(bb_display.Min, bb_display.Max, GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + if (push_clip_rect) + window->DrawList->PopClipRect(); } const ImGuiPayload* ImGui::GetDragDropPayload() @@ -12576,7 +13592,7 @@ void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth) IM_ASSERT(g.LogEnabled == false); IM_ASSERT(g.LogFile == NULL); IM_ASSERT(g.LogBuffer.empty()); - g.LogEnabled = true; + g.LogEnabled = g.ItemUnclipByLog = true; g.LogType = type; g.LogNextPrefix = g.LogNextSuffix = NULL; g.LogDepthRef = window->DC.TreeDepth; @@ -12675,7 +13691,7 @@ void ImGui::LogFinish() break; } - g.LogEnabled = false; + g.LogEnabled = g.ItemUnclipByLog = false; g.LogType = ImGuiLogType_None; g.LogFile = NULL; g.LogBuffer.clear(); @@ -12791,9 +13807,9 @@ ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) { ImGuiContext& g = *GImGui; const ImGuiID type_hash = ImHashStr(type_name); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].TypeHash == type_hash) - return &g.SettingsHandlers[handler_n]; + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.TypeHash == type_hash) + return &handler; return NULL; } @@ -12802,9 +13818,9 @@ void ImGui::ClearIniSettings() { ImGuiContext& g = *GImGui; g.SettingsIniData.clear(); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ClearAllFn) - g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ClearAllFn != NULL) + handler.ClearAllFn(&g, &handler); } void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) @@ -12839,9 +13855,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) // Call pre-read handlers // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ReadInitFn) - g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ReadInitFn != NULL) + handler.ReadInitFn(&g, &handler); void* entry_data = NULL; ImGuiSettingsHandler* entry_handler = NULL; @@ -12885,9 +13901,9 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) memcpy(buf, ini_data, ini_size); // Call post-read handlers - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - if (g.SettingsHandlers[handler_n].ApplyAllFn) - g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + if (handler.ApplyAllFn != NULL) + handler.ApplyAllFn(&g, &handler); } void ImGui::SaveIniSettingsToDisk(const char* ini_filename) @@ -12913,11 +13929,8 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) g.SettingsDirtyTimer = 0.0f; g.SettingsIniData.Buf.resize(0); g.SettingsIniData.Buf.push_back(0); - for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) - { - ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n]; - handler->WriteAllFn(&g, handler, &g.SettingsIniData); - } + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + handler.WriteAllFn(&g, &handler, &g.SettingsIniData); if (out_size) *out_size = (size_t)g.SettingsIniData.size(); return g.SettingsIniData.c_str(); @@ -12927,12 +13940,13 @@ ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) { ImGuiContext& g = *GImGui; -#if !IMGUI_DEBUG_INI_SETTINGS - // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() - // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. - if (const char* p = strstr(name, "###")) - name = p; -#endif + if (g.IO.ConfigDebugIniSettings == false) + { + // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() + // Preserve the full string when ConfigDebugVerboseIniSettings is set to make .ini inspection easier. + if (const char* p = strstr(name, "###")) + name = p; + } const size_t name_len = strlen(name); // Allocate chunk @@ -12982,8 +13996,8 @@ void ImGui::ClearWindowSettings(const char* name) static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) { ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) - g.Windows[i]->SettingsOffset = -1; + for (ImGuiWindow* window : g.Windows) + window->SettingsOffset = -1; g.SettingsWindows.clear(); } @@ -13008,6 +14022,7 @@ static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } + else if (sscanf(line, "IsChild=%d", &i) == 1) { settings->IsChild = (i != 0); } } // Apply to existing windows (if any) @@ -13028,9 +14043,8 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl // Gather data from windows that were active during this session // (if a window wasn't opened in this session we preserve its settings) ImGuiContext& g = *ctx; - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[i]; if (window->Flags & ImGuiWindowFlags_NoSavedSettings) continue; @@ -13043,7 +14057,7 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl IM_ASSERT(settings->ID == window->ID); settings->Pos = ImVec2ih(window->Pos); settings->Size = ImVec2ih(window->SizeFull); - + settings->IsChild = (window->Flags & ImGuiWindowFlags_ChildWindow) != 0; settings->Collapsed = window->Collapsed; settings->WantDelete = false; } @@ -13056,9 +14070,18 @@ static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandl continue; const char* settings_name = settings->GetName(); buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); - buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); - buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); - buf->appendf("Collapsed=%d\n", settings->Collapsed); + if (settings->IsChild) + { + buf->appendf("IsChild=1\n"); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + } + else + { + buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + if (settings->Collapsed) + buf->appendf("Collapsed=1\n"); + } buf->append("\n"); } } @@ -13109,10 +14132,8 @@ static void ImGui::UpdateViewportsNewFrame() main_viewport->Pos = ImVec2(0.0f, 0.0f); main_viewport->Size = g.IO.DisplaySize; - for (int n = 0; n < g.Viewports.Size; n++) + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; - // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin; viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax; @@ -13299,7 +14320,7 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeDat //----------------------------------------------------------------------------- // [SECTION] METRICS/DEBUGGER WINDOW //----------------------------------------------------------------------------- -// - RenderViewportThumbnail() [Internal] +// - DebugRenderViewportThumbnail() [Internal] // - RenderViewportsThumbnails() [Internal] // - DebugTextEncoding() // - MetricsHelpMarker() [Internal] @@ -13330,16 +14351,15 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* ImVec2 off = bb.Min - viewport->Pos * scale; float alpha_mul = 1.0f; window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); - for (int i = 0; i != g.Windows.Size; i++) + for (ImGuiWindow* thumb_window : g.Windows) { - ImGuiWindow* thumb_window = g.Windows[i]; if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) continue; ImRect thumb_r = thumb_window->Rect(); ImRect title_r = thumb_window->TitleBarRect(); - thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); - title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height + thumb_r = ImRect(ImTrunc(off + thumb_r.Min * scale), ImTrunc(off + thumb_r.Max * scale)); + title_r = ImRect(ImTrunc(off + title_r.Min * scale), ImTrunc(off + ImVec2(title_r.Max.x, title_r.Min.y + title_r.GetHeight() * 3.0f) * scale)); // Exaggerate title bar height thumb_r.ClipWithFull(bb); title_r.ClipWithFull(bb); const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); @@ -13349,6 +14369,8 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); } draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); + if (viewport->ID == g.DebugMetricsConfig.HighlightViewportID) + window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); } static void RenderViewportsThumbnails() @@ -13356,16 +14378,14 @@ static void RenderViewportsThumbnails() ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. float SCALE = 1.0f / 8.0f; - ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int n = 0; n < g.Viewports.Size; n++) - bb_full.Add(g.Viewports[n]->GetMainRect()); + ImRect bb_full(g.Viewports[0]->Pos, g.Viewports[0]->Pos + g.Viewports[0]->Size); ImVec2 p = window->DC.CursorPos; ImVec2 off = p - bb_full.Min * SCALE; - for (int n = 0; n < g.Viewports.Size; n++) + + // Draw viewports + for (ImGuiViewportP* viewport : g.Viewports) { - ImGuiViewportP* viewport = g.Viewports[n]; ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); } @@ -13375,14 +14395,15 @@ static void RenderViewportsThumbnails() // Draw an arbitrary US keyboard layout to visualize translated keys void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list) { - const ImVec2 key_size = ImVec2(35.0f, 35.0f); - const float key_rounding = 3.0f; - const ImVec2 key_face_size = ImVec2(25.0f, 25.0f); - const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f); - const float key_face_rounding = 2.0f; - const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f); + const float scale = ImGui::GetFontSize() / 13.0f; + const ImVec2 key_size = ImVec2(35.0f, 35.0f) * scale; + const float key_rounding = 3.0f * scale; + const ImVec2 key_face_size = ImVec2(25.0f, 25.0f) * scale; + const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f) * scale; + const float key_face_rounding = 2.0f * scale; + const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f) * scale; const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); - const float key_row_offset = 9.0f; + const float key_row_offset = 9.0f * scale; ImVec2 board_min = GetCursorScreenPos(); ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); @@ -13457,11 +14478,40 @@ void ImGui::DebugTextEncoding(const char* str) EndTable(); } +static void DebugFlashStyleColorStop() +{ + ImGuiContext& g = *GImGui; + if (g.DebugFlashStyleColorIdx != ImGuiCol_COUNT) + g.Style.Colors[g.DebugFlashStyleColorIdx] = g.DebugFlashStyleColorBackup; + g.DebugFlashStyleColorIdx = ImGuiCol_COUNT; +} + +// Flash a given style color for some + inhibit modifications of this color via PushStyleColor() calls. +void ImGui::DebugFlashStyleColor(ImGuiCol idx) +{ + ImGuiContext& g = *GImGui; + DebugFlashStyleColorStop(); + g.DebugFlashStyleColorTime = 0.5f; + g.DebugFlashStyleColorIdx = idx; + g.DebugFlashStyleColorBackup = g.Style.Colors[idx]; +} + +void ImGui::UpdateDebugToolFlashStyleColor() +{ + ImGuiContext& g = *GImGui; + if (g.DebugFlashStyleColorTime <= 0.0f) + return; + ColorConvertHSVtoRGB(cosf(g.DebugFlashStyleColorTime * 6.0f) * 0.5f + 0.5f, 0.5f, 0.5f, g.Style.Colors[g.DebugFlashStyleColorIdx].x, g.Style.Colors[g.DebugFlashStyleColorIdx].y, g.Style.Colors[g.DebugFlashStyleColorIdx].z); + g.Style.Colors[g.DebugFlashStyleColorIdx].w = 1.0f; + if ((g.DebugFlashStyleColorTime -= g.IO.DeltaTime) <= 0.0f) + DebugFlashStyleColorStop(); +} + // Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. static void MetricsHelpMarker(const char* desc) { ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) + if (ImGui::BeginItemTooltip()) { ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); ImGui::TextUnformatted(desc); @@ -13473,9 +14523,8 @@ static void MetricsHelpMarker(const char* desc) // [DEBUG] List fonts in a font atlas and display its texture void ImGui::ShowFontAtlas(ImFontAtlas* atlas) { - for (int i = 0; i < atlas->Fonts.Size; i++) + for (ImFont* font : atlas->Fonts) { - ImFont* font = atlas->Fonts[i]; PushID(font); DebugNodeFont(font); PopID(); @@ -13499,8 +14548,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; if (cfg->ShowDebugLog) ShowDebugLogWindow(&cfg->ShowDebugLog); - if (cfg->ShowStackTool) - ShowStackToolWindow(&cfg->ShowStackTool); + if (cfg->ShowIDStackTool) + ShowIDStackToolWindow(&cfg->ShowIDStackTool); if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1) { @@ -13508,11 +14557,14 @@ void ImGui::ShowMetricsWindow(bool* p_open) return; } + // [DEBUG] Clear debug breaks hooks after exactly one cycle. + DebugBreakClearData(); + // Basic info Text("Dear ImGui %s", GetVersion()); Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); - Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations); + Text("%d visible windows, %d current allocations", io.MetricsRenderWindows, g.DebugAllocInfo.TotalAllocCount - g.DebugAllocInfo.TotalFreeCount); //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } Separator(); @@ -13541,8 +14593,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); } else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } - else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate - else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); } // Note: y1/y2 not always accurate + else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastTopHeadersRowHeight); } else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight); } else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } IM_ASSERT(0); @@ -13556,7 +14608,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) else if (rect_type == WRT_InnerRect) { return window->InnerRect; } else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } else if (rect_type == WRT_WorkRect) { return window->WorkRect; } - else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } + else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } IM_ASSERT(0); @@ -13567,34 +14619,24 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Tools if (TreeNode("Tools")) { - bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer"); - SameLine(); - MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); - if (show_encoding_viewer) - { - static char buf[100] = ""; - SetNextItemWidth(-FLT_MIN); - InputText("##Text", buf, IM_ARRAYSIZE(buf)); - if (buf[0] != 0) - DebugTextEncoding(buf); - TreePop(); - } - + // Debug Break features // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. - if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) - DebugStartItemPicker(); + SeparatorTextEx(0, "Debug breaks", NULL, CalcTextSize("(?)").x + g.Style.SeparatorTextPadding.x); SameLine(); MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); + if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) + DebugStartItemPicker(); + Checkbox("Show \"Debug Break\" buttons in other sections (io.ConfigDebugIsDebuggerPresent)", &g.IO.ConfigDebugIsDebuggerPresent); + + SeparatorText("Visualize"); - // Stack Tool is your best friend! Checkbox("Show Debug Log", &cfg->ShowDebugLog); SameLine(); MetricsHelpMarker("You can also call ImGui::ShowDebugLogWindow() from your code."); - // Stack Tool is your best friend! - Checkbox("Show Stack Tool", &cfg->ShowStackTool); + Checkbox("Show ID Stack Tool", &cfg->ShowIDStackTool); SameLine(); - MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code."); + MetricsHelpMarker("You can also call ImGui::ShowIDStackToolWindow() from your code."); Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); @@ -13657,11 +14699,26 @@ void ImGui::ShowMetricsWindow(bool* p_open) Unindent(); } } + Checkbox("Show groups rectangles", &g.DebugShowGroupRects); // Storing in context as this is used by group code and prefers to be in hot-data + + SeparatorText("Validate"); Checkbox("Debug Begin/BeginChild return value", &io.ConfigDebugBeginReturnValueLoop); SameLine(); MetricsHelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running."); + Checkbox("UTF-8 Encoding viewer", &cfg->ShowTextEncodingViewer); + SameLine(); + MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); + if (cfg->ShowTextEncodingViewer) + { + static char buf[64] = ""; + SetNextItemWidth(-FLT_MIN); + InputText("##DebugTextEncodingBuf", buf, IM_ARRAYSIZE(buf)); + if (buf[0] != 0) + DebugTextEncoding(buf); + } + TreePop(); } @@ -13676,9 +14733,9 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! ImVector& temp_buffer = g.WindowsTempSortBuffer; temp_buffer.resize(0); - for (int i = 0; i < g.Windows.Size; i++) - if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) - temp_buffer.push_back(g.Windows[i]); + for (ImGuiWindow* window : g.Windows) + if (window->LastFrameActive + 1 >= g.FrameCount) + temp_buffer.push_back(window); struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); @@ -13690,44 +14747,44 @@ void ImGui::ShowMetricsWindow(bool* p_open) // DrawLists int drawlist_count = 0; - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); + for (ImGuiViewportP* viewport : g.Viewports) + drawlist_count += viewport->DrawDataP.CmdLists.Size; if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) { Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); - for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) - { - ImGuiViewportP* viewport = g.Viewports[viewport_i]; - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); - } + for (ImGuiViewportP* viewport : g.Viewports) + for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists) + DebugNodeDrawList(NULL, viewport, draw_list, "DrawList"); TreePop(); } // Viewports if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) { - Indent(GetTreeNodeToLabelSpacing()); - RenderViewportsThumbnails(); - Unindent(GetTreeNodeToLabelSpacing()); - for (int i = 0; i < g.Viewports.Size; i++) - DebugNodeViewport(g.Viewports[i]); + SetNextItemOpen(true, ImGuiCond_Once); + if (TreeNode("Windows Minimap")) + { + RenderViewportsThumbnails(); + TreePop(); + } + cfg->HighlightViewportID = 0; + + for (ImGuiViewportP* viewport : g.Viewports) + DebugNodeViewport(viewport); TreePop(); } // Details for Popups if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) { - for (int i = 0; i < g.OpenPopupStack.Size; i++) + for (const ImGuiPopupData& popup_data : g.OpenPopupStack) { // As it's difficult to interact with tree nodes while popups are open, we display everything inline. - const ImGuiPopupData* popup_data = &g.OpenPopupStack[i]; - ImGuiWindow* window = popup_data->Window; - BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'", - popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", - popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); + ImGuiWindow* window = popup_data.Window; + BulletText("PopupID: %08x, Window: '%s' (%s%s), RestoreNavWindow '%s', ParentWindow '%s'", + popup_data.PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", + popup_data.RestoreNavWindow ? popup_data.RestoreNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); } TreePop(); } @@ -13769,6 +14826,13 @@ void ImGui::ShowMetricsWindow(bool* p_open) TreePop(); } + // Details for TypingSelect + if (TreeNode("TypingSelect", "TypingSelect (%d)", g.TypingSelectState.SearchBuffer[0] != 0 ? 1 : 0)) + { + DebugNodeTypingSelectState(&g.TypingSelectState); + TreePop(); + } + // Details for Docking #ifdef IMGUI_HAS_DOCK if (TreeNode("Docking")) @@ -13793,11 +14857,12 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("\"%s\"", g.IO.IniFilename); else TextUnformatted(""); + Checkbox("io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings); Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) { - for (int n = 0; n < g.SettingsHandlers.Size; n++) - BulletText("%s", g.SettingsHandlers[n].TypeName); + for (ImGuiSettingsHandler& handler : g.SettingsHandlers) + BulletText("\"%s\"", handler.TypeName); TreePop(); } if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) @@ -13825,6 +14890,22 @@ void ImGui::ShowMetricsWindow(bool* p_open) TreePop(); } + // Settings + if (TreeNode("Memory allocations")) + { + ImGuiDebugAllocInfo* info = &g.DebugAllocInfo; + Text("%d current allocations", info->TotalAllocCount - info->TotalFreeCount); + if (SmallButton("GC now")) { g.GcCompactAll = true; } + Text("Recent frames with allocations:"); + int buf_size = IM_ARRAYSIZE(info->LastEntriesBuf); + for (int n = buf_size - 1; n >= 0; n--) + { + ImGuiDebugAllocEntry* entry = &info->LastEntriesBuf[(info->LastEntriesIdx - n + buf_size) % buf_size]; + BulletText("Frame %06d: %+3d ( %2d malloc, %2d free )%s", entry->FrameCount, entry->AllocCount - entry->FreeCount, entry->AllocCount, entry->FreeCount, (n == 0) ? " (most recent)" : ""); + } + TreePop(); + } + if (TreeNode("Inputs")) { Text("KEYBOARD/GAMEPAD/MOUSE KEYS"); @@ -13835,7 +14916,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) #ifdef IMGUI_DISABLE_OBSOLETE_KEYIO struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; #else - struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key >= 0 && key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array //Text("Legacy raw:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { SameLine(); Text("\"%s\" %d", GetKeyName(key), key); } } #endif Text("Keys down:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); } @@ -13860,6 +14941,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (IsMouseClicked(i)) { SameLine(); Text("b%d (%d)", i, io.MouseClickedCount[i]); } Text("Mouse released:"); for (int i = 0; i < count; i++) if (IsMouseReleased(i)) { SameLine(); Text("b%d", i); } Text("Mouse wheel: %.1f", io.MouseWheel); + Text("MouseStationaryTimer: %.2f", g.MouseStationaryTimer); Text("Mouse source: %s", GetMouseSourceName(io.MouseSource)); Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused Unindent(); @@ -13877,41 +14959,44 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("KEY OWNERS"); { Indent(); - if (BeginListBox("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) - { + if (BeginChild("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings)) for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(&g, key); - if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + if (owner_data->OwnerCurr == ImGuiKeyOwner_NoOwner) continue; Text("%s: 0x%08X%s", GetKeyName(key), owner_data->OwnerCurr, owner_data->LockUntilRelease ? " LockUntilRelease" : owner_data->LockThisFrame ? " LockThisFrame" : ""); DebugLocateItemOnHover(owner_data->OwnerCurr); } - EndListBox(); - } + EndChild(); Unindent(); } Text("SHORTCUT ROUTING"); + SameLine(); + MetricsHelpMarker("Declared shortcut routes automatically set key owner when mods matches."); { Indent(); - if (BeginListBox("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) - { + if (BeginChild("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_FrameStyle | ImGuiChildFlags_ResizeY, ImGuiWindowFlags_NoSavedSettings)) for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; ) { - char key_chord_name[64]; ImGuiKeyRoutingData* routing_data = &rt->Entries[idx]; - GetKeyChordName(key | routing_data->Mods, key_chord_name, IM_ARRAYSIZE(key_chord_name)); - Text("%s: 0x%08X", key_chord_name, routing_data->RoutingCurr); + ImGuiKeyChord key_chord = key | routing_data->Mods; + Text("%s: 0x%08X (scored %d)", GetKeyChordName(key_chord), routing_data->RoutingCurr, routing_data->RoutingCurrScore); DebugLocateItemOnHover(routing_data->RoutingCurr); + if (g.IO.ConfigDebugIsDebuggerPresent) + { + SameLine(); + if (DebugBreakButton("**DebugBreak**", "in SetShortcutRouting() for this KeyChord")) + g.DebugBreakInShortcutRouting = key_chord; + } idx = routing_data->NextEntryIndex; } } - EndListBox(); - } + EndChild(); Text("(ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: 0x%X)", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); Unindent(); } @@ -13935,7 +15020,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); Text("ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: %X", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame - Text("HoverDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverDelayId, g.HoverDelayTimer, g.HoverDelayClearTimer); + Text("HoverItemDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverItemDelayId, g.HoverItemDelayTimer, g.HoverItemDelayClearTimer); Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); DebugLocateItemOnHover(g.DragDropPayload.SourceId); Unindent(); @@ -13946,11 +15031,20 @@ void ImGui::ShowMetricsWindow(bool* p_open) Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); DebugLocateItemOnHover(g.NavId); Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource)); + Text("NavLastValidSelectionUserData = %" IM_PRId64 " (0x%" IM_PRIX64 ")", g.NavLastValidSelectionUserData, g.NavLastValidSelectionUserData); Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); Text("NavActivateId/DownId/PressedId: %08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId); Text("NavActivateFlags: %04X", g.NavActivateFlags); Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); + Text("NavFocusRoute[] = "); + for (int path_n = g.NavFocusRoute.Size - 1; path_n >= 0; path_n--) + { + const ImGuiFocusScopeData& focus_scope = g.NavFocusRoute[path_n]; + SameLine(0.0f, 0.0f); + Text("0x%08X/", focus_scope.ID); + SetItemTooltip("In window \"%s\"", FindWindowByID(focus_scope.WindowID)->Name); + } Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); Unindent(); @@ -13960,9 +15054,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) // Overlay: Display windows Rectangles and Begin Order if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) { - for (int n = 0; n < g.Windows.Size; n++) + for (ImGuiWindow* window : g.Windows) { - ImGuiWindow* window = g.Windows[n]; if (!window->WasActive) continue; ImDrawList* draw_list = GetForegroundDrawList(window); @@ -14019,21 +15112,90 @@ void ImGui::ShowMetricsWindow(bool* p_open) End(); } +void ImGui::DebugBreakClearData() +{ + // Those fields are scattered in their respective subsystem to stay in hot-data locations + ImGuiContext& g = *GImGui; + g.DebugBreakInWindow = 0; + g.DebugBreakInTable = 0; + g.DebugBreakInShortcutRouting = ImGuiKey_None; +} + +void ImGui::DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location) +{ + if (!BeginItemTooltip()) + return; + Text("To call IM_DEBUG_BREAK() %s:", description_of_location); + Separator(); + TextUnformatted(keyboard_only ? "- Press 'Pause/Break' on keyboard." : "- Press 'Pause/Break' on keyboard.\n- or Click (may alter focus/active id).\n- or navigate using keyboard and press space."); + Separator(); + TextUnformatted("Choose one way that doesn't interfere with what you are trying to debug!\nYou need a debugger attached or this will crash!"); + EndTooltip(); +} + +// Special button that doesn't take focus, doesn't take input owner, and can be activated without a click etc. +// In order to reduce interferences with the contents we are trying to debug into. +bool ImGui::DebugBreakButton(const char* label, const char* description_of_location) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrLineTextBaseOffset); + ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x * 2.0f, label_size.y); + + const ImRect bb(pos, pos + size); + ItemSize(size, 0.0f); + if (!ItemAdd(bb, id)) + return false; + + // WE DO NOT USE ButtonEx() or ButtonBehavior() in order to reduce our side-effects. + bool hovered = ItemHoverable(bb, id, g.CurrentItemFlags); + bool pressed = hovered && (IsKeyChordPressed(g.DebugBreakKeyChord) || IsMouseClicked(0) || g.NavActivateId == id); + DebugBreakButtonTooltip(false, description_of_location); + + ImVec4 col4f = GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImVec4 hsv; + ColorConvertRGBtoHSV(col4f.x, col4f.y, col4f.z, hsv.x, hsv.y, hsv.z); + ColorConvertHSVtoRGB(hsv.x + 0.20f, hsv.y, hsv.z, col4f.x, col4f.y, col4f.z); + + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, GetColorU32(col4f), true, g.Style.FrameRounding); + RenderTextClipped(bb.Min, bb.Max, label, NULL, &label_size, g.Style.ButtonTextAlign, &bb); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + // [DEBUG] Display contents of Columns void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) { if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) return; BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); - for (int column_n = 0; column_n < columns->Columns.Size; column_n++) - BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); + for (ImGuiOldColumnData& column : columns->Columns) + BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", (int)columns->Columns.index_from_ptr(&column), column.OffsetNorm, GetColumnOffsetFromNorm(columns, column.OffsetNorm)); TreePop(); } +static void FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id) +{ + union { void* ptr; int integer; } tex_id_opaque; + memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id))); + if (sizeof(tex_id) >= sizeof(void*)) + ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr); + else + ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer); +} + // [DEBUG] Display contents of ImDrawList -void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) +void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label) { ImGuiContext& g = *GImGui; + IM_UNUSED(viewport); // Used in docking branch ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; int cmd_count = draw_list->CmdBuffer.Size; if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) @@ -14065,10 +15227,11 @@ void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, continue; } + char texid_desc[20]; + FormatTextureIDForDebugDisplay(texid_desc, IM_ARRAYSIZE(texid_desc), pcmd->TextureId); char buf[300]; - ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", - pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, - pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); + ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex %s, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", + pcmd->ElemCount / 3, texid_desc, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); @@ -14148,8 +15311,8 @@ void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, co // Draw bounding boxes if (show_aabb) { - out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU - out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles + out_draw_list->AddRect(ImTrunc(clip_rect.Min), ImTrunc(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU + out_draw_list->AddRect(ImTrunc(vtxs_rect.Min), ImTrunc(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles } out_draw_list->Flags = backup_flags; } @@ -14174,7 +15337,7 @@ void ImGui::DebugNodeFont(ImFont* font) SetNextItemWidth(GetFontSize() * 8); DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); SameLine(); MetricsHelpMarker( - "Note than the default embedded font is NOT meant to be scaled.\n\n" + "Note that the default embedded font is NOT meant to be scaled.\n\n" "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " "You may oversample them to get some flexibility with scaling. " "You can also render at multiple sizes and select which one to use at runtime.\n\n" @@ -14260,11 +15423,8 @@ void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) { if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) return; - for (int n = 0; n < storage->Data.Size; n++) - { - const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; + for (const ImGuiStorage::ImGuiStoragePair& p : storage->Data) BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. - } TreePop(); } @@ -14311,8 +15471,12 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) { + ImGuiContext& g = *GImGui; SetNextItemOpen(true, ImGuiCond_Once); - if (TreeNode("viewport0", "Viewport #%d", 0)) + bool open = TreeNode("viewport0", "Viewport #%d", 0); + if (IsItemHovered()) + g.DebugMetricsConfig.HighlightViewportID = viewport->ID; + if (open) { ImGuiWindowFlags flags = viewport->Flags; BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", @@ -14322,9 +15486,8 @@ void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); - for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) - for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) - DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + for (ImDrawList* draw_list : viewport->DrawDataP.CmdLists) + DebugNodeDrawList(NULL, viewport, draw_list, "DrawList"); TreePop(); } } @@ -14351,8 +15514,11 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) if (window->MemoryCompacted) TextDisabled("Note: some memory buffers have been compacted/freed."); + if (g.IO.ConfigDebugIsDebuggerPresent && DebugBreakButton("**DebugBreak**", "in Begin()")) + g.DebugBreakInWindow = window->ID; + ImGuiWindowFlags flags = window->Flags; - DebugNodeDrawList(window, window->DrawList, "DrawList"); + DebugNodeDrawList(window, window->Viewport, window->DrawList, "DrawList"); BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", @@ -14374,13 +15540,14 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++) BulletText("NavPreferredScoringPosRel[%d] = {%.1f,%.1f)", layer, (pr[layer].x == FLT_MAX ? -99999.0f : pr[layer].x), (pr[layer].y == FLT_MAX ? -99999.0f : pr[layer].y)); // Display as 99999.0f so it looks neater. BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); - if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } - if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } - if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } + if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } + if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } + if (window->ParentWindowForFocusRoute != NULL) { DebugNodeWindow(window->ParentWindowForFocusRoute, "ParentWindowForFocusRoute"); } + if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) { - for (int n = 0; n < window->ColumnsStorage.Size; n++) - DebugNodeColumns(&window->ColumnsStorage[n]); + for (ImGuiOldColumns& columns : window->ColumnsStorage) + DebugNodeColumns(&columns); TreePop(); } DebugNodeStorage(&window->StateStorage, "Storage"); @@ -14446,9 +15613,39 @@ void ImGui::DebugLogV(const char* fmt, va_list args) const int old_size = g.DebugLogBuf.size(); g.DebugLogBuf.appendf("[%05d] ", g.FrameCount); g.DebugLogBuf.appendfv(fmt, args); + g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size()); if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY) IMGUI_DEBUG_PRINTF("%s", g.DebugLogBuf.begin() + old_size); - g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size()); +#ifdef IMGUI_ENABLE_TEST_ENGINE + // IMGUI_TEST_ENGINE_LOG() adds a trailing \n automatically + const int new_size = g.DebugLogBuf.size(); + const bool trailing_carriage_return = (g.DebugLogBuf[new_size - 1] == '\n'); + if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTestEngine) + IMGUI_TEST_ENGINE_LOG("%.*s", new_size - old_size - (trailing_carriage_return ? 1 : 0), g.DebugLogBuf.begin() + old_size); +#endif +} + +// FIXME-LAYOUT: To be done automatically via layout mode once we rework ItemSize/ItemAdd into ItemLayout. +static void SameLineOrWrap(const ImVec2& size) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 pos(window->DC.CursorPosPrevLine.x + g.Style.ItemSpacing.x, window->DC.CursorPosPrevLine.y); + if (window->ClipRect.Contains(ImRect(pos, pos + size))) + ImGui::SameLine(); +} + +static void ShowDebugLogFlag(const char* name, ImGuiDebugLogFlags flags) +{ + ImGuiContext& g = *GImGui; + ImVec2 size(ImGui::GetFrameHeight() + g.Style.ItemInnerSpacing.x + ImGui::CalcTextSize(name).x, ImGui::GetFrameHeight()); + SameLineOrWrap(size); // FIXME-LAYOUT: To be done automatically once we rework ItemSize/ItemAdd into ItemLayout. + if (ImGui::CheckboxFlags(name, &g.DebugLogFlags, flags) && g.IO.KeyShift && (g.DebugLogFlags & flags) != 0) + { + g.DebugLogAutoDisableFrames = 2; + g.DebugLogAutoDisableFlags |= flags; + } + ImGui::SetItemTooltip("Hold SHIFT when clicking to enable for 2 frames only (useful for spammy log entries)"); } void ImGui::ShowDebugLogWindow(bool* p_open) @@ -14462,14 +15659,18 @@ void ImGui::ShowDebugLogWindow(bool* p_open) return; } - CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_); - SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId); - SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus); - SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup); - SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav); - SameLine(); if (CheckboxFlags("Clipper", &g.DebugLogFlags, ImGuiDebugLogFlags_EventClipper)) { g.DebugLogClipperAutoDisableFrames = 2; } if (IsItemHovered()) SetTooltip("Clipper log auto-disabled after 2 frames"); - //SameLine(); CheckboxFlags("Selection", &g.DebugLogFlags, ImGuiDebugLogFlags_EventSelection); - SameLine(); CheckboxFlags("IO", &g.DebugLogFlags, ImGuiDebugLogFlags_EventIO); + ImGuiDebugLogFlags all_enable_flags = ImGuiDebugLogFlags_EventMask_ & ~ImGuiDebugLogFlags_EventInputRouting; + CheckboxFlags("All", &g.DebugLogFlags, all_enable_flags); + SetItemTooltip("(except InputRouting which is spammy)"); + + ShowDebugLogFlag("ActiveId", ImGuiDebugLogFlags_EventActiveId); + ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper); + ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus); + ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO); + ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav); + ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup); + //ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection); + ShowDebugLogFlag("InputRouting", ImGuiDebugLogFlags_EventInputRouting); if (SmallButton("Clear")) { @@ -14479,31 +15680,17 @@ void ImGui::ShowDebugLogWindow(bool* p_open) SameLine(); if (SmallButton("Copy")) SetClipboardText(g.DebugLogBuf.c_str()); - BeginChild("##log", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); + BeginChild("##log", ImVec2(0.0f, 0.0f), ImGuiChildFlags_Border, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); + + const ImGuiDebugLogFlags backup_log_flags = g.DebugLogFlags; + g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper; ImGuiListClipper clipper; clipper.Begin(g.DebugLogIndex.size()); while (clipper.Step()) for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) - { - const char* line_begin = g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no); - const char* line_end = g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no); - TextUnformatted(line_begin, line_end); - ImRect text_rect = g.LastItemData.Rect; - if (IsItemHovered()) - for (const char* p = line_begin; p <= line_end - 10; p++) - { - ImGuiID id = 0; - if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1) - continue; - ImVec2 p0 = CalcTextSize(line_begin, p); - ImVec2 p1 = CalcTextSize(p, p + 10); - g.LastItemData.Rect = ImRect(text_rect.Min + ImVec2(p0.x, 0.0f), text_rect.Min + ImVec2(p0.x + p1.x, p1.y)); - if (IsMouseHoveringRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, true)) - DebugLocateItemOnHover(id); - p += 10; - } - } + DebugTextUnformattedWithLocateItem(g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no), g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no)); + g.DebugLogFlags = backup_log_flags; if (GetScrollY() >= GetScrollMaxY()) SetScrollHereY(1.0f); EndChild(); @@ -14511,10 +15698,64 @@ void ImGui::ShowDebugLogWindow(bool* p_open) End(); } +// Display line, search for 0xXXXXXXXX identifiers and call DebugLocateItemOnHover() when hovered. +void ImGui::DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end) +{ + TextUnformatted(line_begin, line_end); + if (!IsItemHovered()) + return; + ImGuiContext& g = *GImGui; + ImRect text_rect = g.LastItemData.Rect; + for (const char* p = line_begin; p <= line_end - 10; p++) + { + ImGuiID id = 0; + if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1) + continue; + ImVec2 p0 = CalcTextSize(line_begin, p); + ImVec2 p1 = CalcTextSize(p, p + 10); + g.LastItemData.Rect = ImRect(text_rect.Min + ImVec2(p0.x, 0.0f), text_rect.Min + ImVec2(p0.x + p1.x, p1.y)); + if (IsMouseHoveringRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, true)) + DebugLocateItemOnHover(id); + p += 10; + } +} + //----------------------------------------------------------------------------- -// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, ID STACK TOOL) //----------------------------------------------------------------------------- +// Draw a small cross at current CursorPos in current window's DrawList +void ImGui::DebugDrawCursorPos(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 pos = window->DC.CursorPos; + window->DrawList->AddLine(ImVec2(pos.x, pos.y - 3.0f), ImVec2(pos.x, pos.y + 4.0f), col, 1.0f); + window->DrawList->AddLine(ImVec2(pos.x - 3.0f, pos.y), ImVec2(pos.x + 4.0f, pos.y), col, 1.0f); +} + +// Draw a 10px wide rectangle around CurposPos.x using Line Y1/Y2 in current window's DrawList +void ImGui::DebugDrawLineExtents(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float curr_x = window->DC.CursorPos.x; + float line_y1 = (window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y); + float line_y2 = line_y1 + (window->DC.IsSameLine ? window->DC.PrevLineSize.y : window->DC.CurrLineSize.y); + window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y1), ImVec2(curr_x + 5.0f, line_y1), col, 1.0f); + window->DrawList->AddLine(ImVec2(curr_x - 0.5f, line_y1), ImVec2(curr_x - 0.5f, line_y2), col, 1.0f); + window->DrawList->AddLine(ImVec2(curr_x - 5.0f, line_y2), ImVec2(curr_x + 5.0f, line_y2), col, 1.0f); +} + +// Draw last item rect in ForegroundDrawList (so it is always visible) +void ImGui::DebugDrawItemRect(ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); +} + +// [DEBUG] Locate item position/rectangle given an ID. static const ImU32 DEBUG_LOCATE_ITEM_COLOR = IM_COL32(0, 255, 0, 255); // Green void ImGui::DebugLocateItem(ImGuiID target_id) @@ -14522,8 +15763,10 @@ void ImGui::DebugLocateItem(ImGuiID target_id) ImGuiContext& g = *GImGui; g.DebugLocateId = target_id; g.DebugLocateFrames = 2; + g.DebugBreakInLocateId = false; } +// FIXME: Doesn't work over through a modal window, because they clear HoveredWindow. void ImGui::DebugLocateItemOnHover(ImGuiID target_id) { if (target_id == 0 || !IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenBlockedByPopup)) @@ -14531,11 +15774,24 @@ void ImGui::DebugLocateItemOnHover(ImGuiID target_id) ImGuiContext& g = *GImGui; DebugLocateItem(target_id); GetForegroundDrawList(g.CurrentWindow)->AddRect(g.LastItemData.Rect.Min - ImVec2(3.0f, 3.0f), g.LastItemData.Rect.Max + ImVec2(3.0f, 3.0f), DEBUG_LOCATE_ITEM_COLOR); + + // Can't easily use a context menu here because it will mess with focus, active id etc. + if (g.IO.ConfigDebugIsDebuggerPresent && g.MouseStationaryTimer > 1.0f) + { + DebugBreakButtonTooltip(false, "in ItemAdd()"); + if (IsKeyChordPressed(g.DebugBreakKeyChord)) + g.DebugBreakInLocateId = true; + } } void ImGui::DebugLocateItemResolveWithLastItem() { ImGuiContext& g = *GImGui; + + // [DEBUG] Debug break requested by user + if (g.DebugBreakInLocateId) + IM_DEBUG_BREAK(); + ImGuiLastItemData item_data = g.LastItemData; g.DebugLocateId = 0; ImDrawList* draw_list = GetForegroundDrawList(g.CurrentWindow); @@ -14547,6 +15803,12 @@ void ImGui::DebugLocateItemResolveWithLastItem() draw_list->AddLine(p1, p2, DEBUG_LOCATE_ITEM_COLOR); } +void ImGui::DebugStartItemPicker() +{ + ImGuiContext& g = *GImGui; + g.DebugItemPickerActive = true; +} + // [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. void ImGui::UpdateDebugToolItemPicker() { @@ -14581,13 +15843,13 @@ void ImGui::UpdateDebugToolItemPicker() EndTooltip(); } -// [DEBUG] Stack Tool: update queries. Called by NewFrame() +// [DEBUG] ID Stack Tool: update queries. Called by NewFrame() void ImGui::UpdateDebugToolStackQueries() { ImGuiContext& g = *GImGui; - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; - // Clear hook when stack tool is not visible + // Clear hook when id stack tool is not visible g.DebugHookIdInfo = 0; if (g.FrameCount != tool->LastActiveFrame + 1) return; @@ -14621,12 +15883,12 @@ void ImGui::UpdateDebugToolStackQueries() } } -// [DEBUG] Stack tool: hooks called by GetID() family functions +// [DEBUG] ID Stack tool: hooks called by GetID() family functions void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; // Step 0: stack query // This assumes that the ID was computed with the current ID stack, which tends to be the case for our widget. @@ -14669,7 +15931,7 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat info->DataType = data_type; } -static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) +static int StackToolFormatLevelInfo(ImGuiIDStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) { ImGuiStackLevelInfo* info = &tool->Results[n]; ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL; @@ -14686,20 +15948,20 @@ static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for return ImFormatString(buf, buf_size, "???"); } -// Stack Tool: Display UI -void ImGui::ShowStackToolWindow(bool* p_open) +// ID Stack Tool: Display UI +void ImGui::ShowIDStackToolWindow(bool* p_open) { ImGuiContext& g = *GImGui; if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver); - if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) + if (!Begin("Dear ImGui ID Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) { End(); return; } // Display hovered/active status - ImGuiStackTool* tool = &g.DebugStackTool; + ImGuiIDStackTool* tool = &g.DebugIDStackTool; const ImGuiID hovered_id = g.HoveredIdPreviousFrame; const ImGuiID active_id = g.ActiveId; #ifdef IMGUI_ENABLE_TEST_ENGINE @@ -14715,7 +15977,7 @@ void ImGui::ShowStackToolWindow(bool* p_open) Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC); SameLine(); TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*"); - if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiMod_Ctrl) && IsKeyPressed(ImGuiKey_C)) + if (tool->CopyToClipboardOnCtrlC && Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteOverFocused)) { tool->CopyToClipboardLastTime = (float)g.Time; char* p = g.TempBuffer.Data; @@ -14768,7 +16030,7 @@ void ImGui::ShowStackToolWindow(bool* p_open) void ImGui::ShowMetricsWindow(bool*) {} void ImGui::ShowFontAtlas(ImFontAtlas*) {} void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} -void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} +void ImGui::DebugNodeDrawList(ImGuiWindow*, ImGuiViewportP*, const ImDrawList*, const char*) {} void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} void ImGui::DebugNodeFont(ImFont*) {} void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} @@ -14781,10 +16043,9 @@ void ImGui::DebugNodeViewport(ImGuiViewportP*) {} void ImGui::DebugLog(const char*, ...) {} void ImGui::DebugLogV(const char*, va_list) {} void ImGui::ShowDebugLogWindow(bool*) {} -void ImGui::ShowStackToolWindow(bool*) {} +void ImGui::ShowIDStackToolWindow(bool*) {} +void ImGui::DebugStartItemPicker() {} void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {} -void ImGui::UpdateDebugToolItemPicker() {} -void ImGui::UpdateDebugToolStackQueries() {} #endif // #ifndef IMGUI_DISABLE_DEBUG_TOOLS diff --git a/core/deps/imgui/imgui.h b/core/deps/imgui/imgui.h index 22c3c6229..fd13ec06c 100644 --- a/core/deps/imgui/imgui.h +++ b/core/deps/imgui/imgui.h @@ -1,29 +1,34 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (headers) // Help: -// - Read FAQ at http://dearimgui.com/faq -// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - See links below. // - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for details, links and comments. +// - Read top of imgui.cpp for more details, links and comments. // Resources: -// - FAQ http://dearimgui.com/faq -// - Homepage & latest https://github.com/ocornut/imgui -// - Releases & changelog https://github.com/ocornut/imgui/releases -// - Gallery https://github.com/ocornut/imgui/issues/6478 (please post your screenshots/video there!) -// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) -// - Glossary https://github.com/ocornut/imgui/wiki/Glossary -// - Issues & support https://github.com/ocornut/imgui/issues - -// Getting Started? -// - For first-time users having issues compiling/linking/running or issues loading fonts: -// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// - FAQ ........................ https://dearimgui.com/faq (in repository as docs/FAQ.md) +// - Homepage ................... https://github.com/ocornut/imgui +// - Releases & changelog ....... https://github.com/ocornut/imgui/releases +// - Gallery .................... https://github.com/ocornut/imgui/issues/7503 (please post your screenshots/video there!) +// - Wiki ....................... https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started (how to integrate in an existing app by adding ~25 lines of code) +// - Third-party Extensions https://github.com/ocornut/imgui/wiki/Useful-Extensions (ImPlot & many more) +// - Bindings/Backends https://github.com/ocornut/imgui/wiki/Bindings (language bindings, backends for various tech/engines) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Debug Tools https://github.com/ocornut/imgui/wiki/Debug-Tools +// - Software using Dear ImGui https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui +// - Issues & support ........... https://github.com/ocornut/imgui/issues +// - Test Engine & Automation ... https://github.com/ocornut/imgui_test_engine (test suite, test engine to automate your apps) + +// For first-time users having issues compiling/linking/running/loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. +// Everything else should be asked in 'Issues'! We are building a database of cross-linked knowledge there. // Library Version // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345') -#define IMGUI_VERSION "1.89.6" -#define IMGUI_VERSION_NUM 18960 +#define IMGUI_VERSION "1.90.8" +#define IMGUI_VERSION_NUM 19080 #define IMGUI_HAS_TABLE /* @@ -33,10 +38,11 @@ Index of this file: // [SECTION] Forward declarations and basic types // [SECTION] Dear ImGui end-user API functions // [SECTION] Flags & Enumerations +// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) // [SECTION] Helpers: Memory allocations macros, ImVector<> // [SECTION] ImGuiStyle // [SECTION] ImGuiIO -// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload) // [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) // [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) // [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) @@ -49,7 +55,7 @@ Index of this file: #pragma once // Configuration file with compile-time options -// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') +// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system) #ifdef IMGUI_USER_CONFIG #include IMGUI_USER_CONFIG #endif @@ -69,7 +75,7 @@ Index of this file: // Define attributes of all API symbols declarations (e.g. for DLL under Windows) // IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) -// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) +// Using dear imgui via a shared library is not recommended: we don't guarantee backward nor forward ABI compatibility + this is a call-heavy library and function call overhead adds up. #ifndef IMGUI_API #define IMGUI_API #endif @@ -84,10 +90,13 @@ Index of this file: #endif #define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! #define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. -#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 + +// Check that version and structures layouts are matching between compiled imgui code and caller. Read comments above DebugCheckVersionAndDataLayout() for details. #define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) // Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. +// (MSVC provides an equivalent mechanism via SAL Annotations but it would require the macros in a different +// location. e.g. #include + void myprintf(_Printf_format_string_ const char* format, ...)) #if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__) #define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) #define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) @@ -115,10 +124,15 @@ Index of this file: #endif #if defined(__clang__) #pragma clang diagnostic push +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' #pragma clang diagnostic ignored "-Wold-style-cast" -#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#endif +#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -129,6 +143,17 @@ Index of this file: // [SECTION] Forward declarations and basic types //----------------------------------------------------------------------------- +// Scalar data types +typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string) +typedef signed char ImS8; // 8-bit signed integer +typedef unsigned char ImU8; // 8-bit unsigned integer +typedef signed short ImS16; // 16-bit signed integer +typedef unsigned short ImU16; // 16-bit unsigned integer +typedef signed int ImS32; // 32-bit signed integer == int +typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) +typedef signed long long ImS64; // 64-bit signed integer +typedef unsigned long long ImU64; // 64-bit unsigned integer + // Forward declarations struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit() struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback) @@ -164,37 +189,41 @@ struct ImGuiViewport; // A Platform Window (always only one in 'ma // Enumerations // - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration) // - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. +enum ImGuiDir : int; // -> enum ImGuiDir // Enum: A cardinal direction (Left, Right, Up, Down) enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value) enum ImGuiMouseSource : int; // -> enum ImGuiMouseSource // Enum; A mouse input source identifier (Mouse, TouchScreen, Pen) +enum ImGuiSortDirection : ImU8; // -> enum ImGuiSortDirection // Enum: A sorting direction (ascending or descending) typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type -typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle) typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor shape -typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending) typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() -// Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file) +// Flags (declared as int to allow using as flags without overhead, and to not pollute the top of this file) // - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() +typedef int ImGuiChildFlags; // -> enum ImGuiChildFlags_ // Flags: for BeginChild() typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. +typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for Shortcut(), SetNextItemShortcut() typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() -typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for storage only for now: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values. +typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for IsKeyChordPressed(), Shortcut() etc. an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values. typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. @@ -221,21 +250,10 @@ typedef void* ImTextureID; // Default: store a pointer or an integer fi typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends) #endif -// Scalar data types -typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string) -typedef signed char ImS8; // 8-bit signed integer -typedef unsigned char ImU8; // 8-bit unsigned integer -typedef signed short ImS16; // 16-bit signed integer -typedef unsigned short ImU16; // 16-bit unsigned integer -typedef signed int ImS32; // 32-bit signed integer == int -typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) -typedef signed long long ImS64; // 64-bit signed integer -typedef unsigned long long ImU64; // 64-bit unsigned integer - // Character types // (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) -typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. +typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. #ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] typedef ImWchar32 ImWchar; #else @@ -250,6 +268,7 @@ typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type] // This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type. +// Add '#define IMGUI_DEFINE_MATH_OPERATORS' in your imconfig.h file to benefit from courtesy maths operators for those types. IM_MSVC_RUNTIME_CHECKS_OFF struct ImVec2 { @@ -293,7 +312,7 @@ namespace ImGui // Main IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) - IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! + IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleColor(), PushStyleVar() to modify style mid-frame! IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). @@ -303,7 +322,7 @@ namespace ImGui IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. IMGUI_API void ShowDebugLogWindow(bool* p_open = NULL); // create Debug Log window. display a simplified log of important dear imgui events. - IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. + IMGUI_API void ShowIDStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. @@ -324,23 +343,33 @@ namespace ImGui // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions + // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding + // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] // - Note that the bottom of window stack always contains a window called "Debug". IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); IMGUI_API void End(); // Child Windows // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. - // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). - // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. - // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. - // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, - // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function - // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] - IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); - IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + // - Before 1.90 (November 2023), the "ImGuiChildFlags child_flags = 0" parameter was "bool border = false". + // This API is backward compatible with old code, as we guarantee that ImGuiChildFlags_Border == true. + // Consider updating your old code: + // BeginChild("Name", size, false) -> Begin("Name", size, 0); or Begin("Name", size, ImGuiChildFlags_None); + // BeginChild("Name", size, true) -> Begin("Name", size, ImGuiChildFlags_Border); + // - Manual sizing (each axis can use a different setting e.g. ImVec2(0.0f, 400.0f)): + // == 0.0f: use remaining parent window size for this axis. + // > 0.0f: use specified size for this axis. + // < 0.0f: right/bottom-align to specified distance from available content boundaries. + // - Specifying ImGuiChildFlags_AutoResizeX or ImGuiChildFlags_AutoResizeY makes the sizing automatic based on child contents. + // Combining both ImGuiChildFlags_AutoResizeX _and_ ImGuiChildFlags_AutoResizeY defeats purpose of a scrolling region and is NOT recommended. + // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting + // anything to the window. Always call a matching EndChild() for each BeginChild() call, regardless of its return value. + // [Important: due to legacy reason, Begin/End and BeginChild/EndChild are inconsistent with all other functions + // such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding + // BeginXXX function returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0); + IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), ImGuiChildFlags child_flags = 0, ImGuiWindowFlags window_flags = 0); IMGUI_API void EndChild(); // Windows Utilities @@ -348,10 +377,10 @@ namespace ImGui IMGUI_API bool IsWindowAppearing(); IMGUI_API bool IsWindowCollapsed(); IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. - IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ! + IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered and hoverable (e.g. not blocked by a popup/modal)? See ImGuiHoveredFlags_ for options. IMPORTANT: If you are trying to check whether your mouse should be dispatched to Dear ImGui or to your underlying app, you should not use this function! Use the 'io.WantCaptureMouse' boolean for that! Refer to FAQ entry "How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application?" for details. IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives - IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API) - IMGUI_API ImVec2 GetWindowSize(); // get current window size + IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (note: it is unlikely you need to use this. Consider using current layout pos instead, GetCursorScreenPos()) + IMGUI_API ImVec2 GetWindowSize(); // get current window size (note: it is unlikely you need to use this. Consider using GetCursorScreenPos() and e.g. GetContentRegionAvail() instead) IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x) IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) @@ -359,7 +388,7 @@ namespace ImGui // - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() - IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. + IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use 0.0f or FLT_MAX if you don't want limits. Use -1 for both min and max of same axis to preserve current size (which itself is a constraint). Use callback to apply non-trivial programmatic constraints. IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() @@ -426,16 +455,28 @@ namespace ImGui IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList - IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(ImU32 col, float alpha_mul = 1.0f); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. - // Cursor / Layout + // Layout cursor positioning // - By "cursor" we mean the current output position. // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: - // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() - // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. + // - Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. -> this is the preferred way forward. + // - Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() + // - GetCursorScreenPos() = GetCursorPos() + GetWindowPos(). GetWindowPos() is almost only ever useful to convert from window-local to absolute coordinates. + IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (prefer using this, also more useful to work with ImDrawList API). + IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates + IMGUI_API ImVec2 GetCursorPos(); // [window-local] cursor position in window coordinates (relative to window position) + IMGUI_API float GetCursorPosX(); // [window-local] " + IMGUI_API float GetCursorPosY(); // [window-local] " + IMGUI_API void SetCursorPos(const ImVec2& local_pos); // [window-local] " + IMGUI_API void SetCursorPosX(float local_x); // [window-local] " + IMGUI_API void SetCursorPosY(float local_y); // [window-local] " + IMGUI_API ImVec2 GetCursorStartPos(); // [window-local] initial cursor position, in window coordinates + + // Other layout functions IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in a horizontal-layout context. @@ -445,15 +486,6 @@ namespace ImGui IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 IMGUI_API void BeginGroup(); // lock horizontal starting position IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) - IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) - IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc. - IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList:: - IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system. - IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) - IMGUI_API void SetCursorPosY(float local_y); // - IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates - IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. - IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) IMGUI_API float GetTextLineHeight(); // ~ FontSize IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) @@ -500,7 +532,7 @@ namespace ImGui // - Most widgets return true when the value has been changed or when pressed/selected // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button - IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text + IMGUI_API bool SmallButton(const char* label); // button with (FramePadding.y == 0) to easily embed within text IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape IMGUI_API bool Checkbox(const char* label, bool* v); @@ -513,8 +545,10 @@ namespace ImGui // Widgets: Images // - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples - IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0)); - IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); + // - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above. + // - Note that Image() may add +2.0f to provided size if a border is visible, ImageButton() adds style.FramePadding*2.0f to provided size. + IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0)); + IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Widgets: Combo Box (Dropdown) // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. @@ -523,7 +557,7 @@ namespace ImGui IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" - IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items = -1); // Widgets: Drag Sliders // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. @@ -611,9 +645,9 @@ namespace ImGui IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); - IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. + IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushID(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. IMGUI_API void TreePush(const void* ptr_id); // " - IMGUI_API void TreePop(); // ~ Unindent()+PopId() + IMGUI_API void TreePop(); // ~ Unindent()+PopID() IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. @@ -626,22 +660,22 @@ namespace ImGui IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. // Widgets: List Boxes - // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. - // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. + // - This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label. + // - You can submit contents and manage your selection state however you want it, by creating e.g. Selectable() or any other items. // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); - IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); + IMGUI_API bool ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items = -1); // Widgets: Data Plotting // - Consider using ImPlot (https://github.com/epezent/implot) which is much better! IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); - IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); // Widgets: Value() Helpers. // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) @@ -665,12 +699,22 @@ namespace ImGui IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL // Tooltips - // - Tooltip are windows following the mouse. They do not take focus away. - IMGUI_API bool BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). - IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip() returns true! - IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). + // - Tooltips are windows following the mouse. They do not take focus away. + // - A tooltip window can contain items of any types. + // - SetTooltip() is more or less a shortcut for the 'if (BeginTooltip()) { Text(...); EndTooltip(); }' idiom (with a subtlety that it discard any previously submitted tooltip) + IMGUI_API bool BeginTooltip(); // begin/append a tooltip window. + IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip()/BeginItemTooltip() returns true! + IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip. Often used after a ImGui::IsItemHovered() check. Override any previous call to SetTooltip(). IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + // Tooltips: helpers for showing a tooltip when hovering an item + // - BeginItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip) && BeginTooltip())' idiom. + // - SetItemTooltip() is a shortcut for the 'if (IsItemHovered(ImGuiHoveredFlags_ForTooltip)) { SetTooltip(...); }' idiom. + // - Where 'ImGuiHoveredFlags_ForTooltip' itself is a shortcut to use 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' depending on active input type. For mouse it defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'. + IMGUI_API bool BeginItemTooltip(); // begin/append a tooltip window if preceding item was hovered. + IMGUI_API void SetItemTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip if preceding item was hovered. override any previous call to SetTooltip(). + IMGUI_API void SetItemTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + // Popups, Modals // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. @@ -679,9 +723,7 @@ namespace ImGui // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. // This is sometimes leading to confusing mistakes. May rework this in the future. - - // Popups: begin/end functions - // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. + // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards if returned true. ImGuiWindowFlags are forwarded to the window. // - BeginPopupModal(): block every interaction behind the window, cannot be closed by user, add a dimming background, has a title bar. IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. @@ -731,12 +773,10 @@ namespace ImGui // TableNextColumn() will automatically wrap-around into the next row if needed. // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! // - Summary of possible call flow: - // -------------------------------------------------------------------------------------------------------- - // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK - // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK - // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! - // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! - // -------------------------------------------------------------------------------------------------------- + // - TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK + // - TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK + // - TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! + // - TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! // - 5. Call EndTable() IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! @@ -754,8 +794,9 @@ namespace ImGui // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. - IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) + IMGUI_API void TableHeadersRow(); // submit a row with headers cells based on data provided to TableSetupColumn() + submit context menu + IMGUI_API void TableAngledHeadersRow(); // submit a row with angled headers for every column with the ImGuiTableColumnFlags_AngledHeader flag. MUST BE FIRST ROW. // Tables: Sorting & Miscellaneous functions // - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. @@ -813,7 +854,7 @@ namespace ImGui IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true! - IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. + IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. returns NULL when drag and drop is finished or inactive. use ImGuiPayload::IsDataType() to test for the payload type. // Disabling [BETA API] // - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors) @@ -832,6 +873,9 @@ namespace ImGui IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window. IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. + // Overlapping mode + IMGUI_API void SetNextItemAllowOverlap(); // allow next item to be overlapped by a subsequent item. Useful with invisible buttons, selectable, treenode covering an area where subsequent items may need to be added. Note that both Selectable() and TreeNode() have dedicated flags doing this. + // Item/Widgets Utilities and Query Functions // - Most of the functions are referring to the previous Item that has been submitted. // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. @@ -852,7 +896,6 @@ namespace ImGui IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space) IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space) IMGUI_API ImVec2 GetItemRectSize(); // get size of last item - IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. // Viewports // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. @@ -873,8 +916,6 @@ namespace ImGui IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) IMGUI_API ImGuiStorage* GetStateStorage(); - IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame - IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) // Text Utilities IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); @@ -893,10 +934,29 @@ namespace ImGui IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held. IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)? + IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord); // was key chord (mods + key) pressed, e.g. you can pass 'ImGuiMod_Ctrl | ImGuiKey_S' as a key-chord. This doesn't do any routing or focus check, please consider using Shortcut() function instead. IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared. IMGUI_API void SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard); // Override io.WantCaptureKeyboard flag next frame (said flag is left for your application to handle, typically when true it instructs your app to ignore inputs). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard"; after the next NewFrame() call. + // Inputs Utilities: Shortcut Testing & Routing [BETA] + // - ImGuiKeyChord = a ImGuiKey + optional ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super. + // ImGuiKey_C // Accepted by functions taking ImGuiKey or ImGuiKeyChord arguments) + // ImGuiMod_Ctrl | ImGuiKey_C // Accepted by functions taking ImGuiKeyChord arguments) + // only ImGuiMod_XXX values are legal to combine with an ImGuiKey. You CANNOT combine two ImGuiKey values. + // - The general idea is that several callers may register interest in a shortcut, and only one owner gets it. + // Parent -> call Shortcut(Ctrl+S) // When Parent is focused, Parent gets the shortcut. + // Child1 -> call Shortcut(Ctrl+S) // When Child1 is focused, Child1 gets the shortcut (Child1 overrides Parent shortcuts) + // Child2 -> no call // When Child2 is focused, Parent gets the shortcut. + // The whole system is order independent, so if Child1 makes its calls before Parent, results will be identical. + // This is an important property as it facilitate working with foreign code or larger codebase. + // - To understand the difference: + // - IsKeyChordPressed() compares mods and call IsKeyPressed() -> function has no side-effect. + // - Shortcut() submits a route, routes are resolved, if it currently can be routed it calls IsKeyChordPressed() -> function has (desirable) side-effects as it can prevents another call from getting the route. + // - Visualize registered routes in 'Metrics/Debugger->Inputs'. + IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0); + IMGUI_API void SetNextItemShortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags = 0); + // Inputs Utilities: Mouse specific // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. @@ -911,8 +971,8 @@ namespace ImGui IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) - IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) - IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (uses io.MouseDraggingThreshold if lock_threshold < 0.0f) + IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (uses io.MouseDraggingThreshold if lock_threshold < 0.0f) IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired mouse cursor shape. Important: reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired mouse cursor shape @@ -933,7 +993,10 @@ namespace ImGui IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. // Debug Utilities + // - Your main debugging friend is the ShowMetricsWindow() function, which is also accessible from Demo->Tools->Metrics Debugger IMGUI_API void DebugTextEncoding(const char* text); + IMGUI_API void DebugFlashStyleColor(ImGuiCol idx); + IMGUI_API void DebugStartItemPicker(); IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. // Memory Allocators @@ -972,50 +1035,85 @@ enum ImGuiWindowFlags_ ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus) ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) - ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) - ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window - ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) - ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiWindowFlags_NoNavInputs = 1 << 16, // No gamepad/keyboard navigation within the window + ImGuiWindowFlags_NoNavFocus = 1 << 17, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) + ImGuiWindowFlags_UnsavedDocument = 1 << 18, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, ImGuiWindowFlags_DragScrolling = 1 << 21, // Allow scrolling by dragging content // [Internal] - ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. + ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: share focus scope, allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() ImGuiWindowFlags_ChildMenu = 1 << 28, // Don't use! For internal use by BeginMenu() + + // Obsolete names +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 30, // Obsoleted in 1.90: Use ImGuiChildFlags_AlwaysUseWindowPadding in BeginChild() call. +#endif +}; + +// Flags for ImGui::BeginChild() +// (Legacy: bit 0 must always correspond to ImGuiChildFlags_Border to be backward compatible with old API using 'bool border = false'. +// About using AutoResizeX/AutoResizeY flags: +// - May be combined with SetNextWindowSizeConstraints() to set a min/max size for each axis (see "Demo->Child->Auto-resize with Constraints"). +// - Size measurement for a given axis is only performed when the child window is within visible boundaries, or is just appearing. +// - This allows BeginChild() to return false when not within boundaries (e.g. when scrolling), which is more optimal. BUT it won't update its auto-size while clipped. +// While not perfect, it is a better default behavior as the always-on performance gain is more valuable than the occasional "resizing after becoming visible again" glitch. +// - You may also use ImGuiChildFlags_AlwaysAutoResize to force an update even when child window is not in view. +// HOWEVER PLEASE UNDERSTAND THAT DOING SO WILL PREVENT BeginChild() FROM EVER RETURNING FALSE, disabling benefits of coarse clipping. +enum ImGuiChildFlags_ +{ + ImGuiChildFlags_None = 0, + ImGuiChildFlags_Border = 1 << 0, // Show an outer border and enable WindowPadding. (IMPORTANT: this is always == 1 == true for legacy reason) + ImGuiChildFlags_AlwaysUseWindowPadding = 1 << 1, // Pad with style.WindowPadding even if no border are drawn (no padding by default for non-bordered child windows because it makes more sense) + ImGuiChildFlags_ResizeX = 1 << 2, // Allow resize from right border (layout direction). Enable .ini saving (unless ImGuiWindowFlags_NoSavedSettings passed to window flags) + ImGuiChildFlags_ResizeY = 1 << 3, // Allow resize from bottom border (layout direction). " + ImGuiChildFlags_AutoResizeX = 1 << 4, // Enable auto-resizing width. Read "IMPORTANT: Size measurement" details above. + ImGuiChildFlags_AutoResizeY = 1 << 5, // Enable auto-resizing height. Read "IMPORTANT: Size measurement" details above. + ImGuiChildFlags_AlwaysAutoResize = 1 << 6, // Combined with AutoResizeX/AutoResizeY. Always measure size even when child is hidden, always return true, always disable clipping optimization! NOT RECOMMENDED. + ImGuiChildFlags_FrameStyle = 1 << 7, // Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding. }; // Flags for ImGui::InputText() // (Those are per-item flags. There are shared flags in ImGuiIO: io.ConfigInputTextCursorBlink and io.ConfigInputTextEnterKeepActive) enum ImGuiInputTextFlags_ { + // Basic filters (also see ImGuiInputTextFlags_CallbackCharFilter) ImGuiInputTextFlags_None = 0, ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/ ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef - ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z - ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs - ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus - ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. - ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling) - ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling) - ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer. - ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. - ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field - ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). - ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally - ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode - ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode - ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' + ImGuiInputTextFlags_CharsScientific = 1 << 2, // Allow 0123456789.+-*/eE (Scientific notation input) + ImGuiInputTextFlags_CharsUppercase = 1 << 3, // Turn a..z into A..Z + ImGuiInputTextFlags_CharsNoBlank = 1 << 4, // Filter out spaces, tabs + + // Inputs + ImGuiInputTextFlags_AllowTabInput = 1 << 5, // Pressing TAB input a '\t' character into the text field + ImGuiInputTextFlags_EnterReturnsTrue = 1 << 6, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. + ImGuiInputTextFlags_EscapeClearsAll = 1 << 7, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert) + ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 8, // In multi-line mode, validate with Enter, add new line with Ctrl+Enter (default is opposite: validate with Ctrl+Enter, add line with Enter). + + // Other options + ImGuiInputTextFlags_ReadOnly = 1 << 9, // Read-only mode + ImGuiInputTextFlags_Password = 1 << 10, // Password mode, display all characters as '*', disable copy + ImGuiInputTextFlags_AlwaysOverwrite = 1 << 11, // Overwrite mode + ImGuiInputTextFlags_AutoSelectAll = 1 << 12, // Select entire text when first taking mouse focus + ImGuiInputTextFlags_ParseEmptyRefVal = 1 << 13, // InputFloat(), InputInt(), InputScalar() etc. only: parse empty string as zero value. + ImGuiInputTextFlags_DisplayEmptyRefVal = 1 << 14, // InputFloat(), InputInt(), InputScalar() etc. only: when value is zero, do not display it. Generally used with ImGuiInputTextFlags_ParseEmptyRefVal. + ImGuiInputTextFlags_NoHorizontalScroll = 1 << 15, // Disable following the cursor horizontally ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). - ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) - ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) - ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) - ImGuiInputTextFlags_EscapeClearsAll = 1 << 20, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert) + + // Callback features + ImGuiInputTextFlags_CallbackCompletion = 1 << 17, // Callback on pressing TAB (for completion handling) + ImGuiInputTextFlags_CallbackHistory = 1 << 18, // Callback on pressing Up/Down arrows (for history handling) + ImGuiInputTextFlags_CallbackAlways = 1 << 19, // Callback on each iteration. User code may query cursor position, modify text buffer. + ImGuiInputTextFlags_CallbackCharFilter = 1 << 20, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. + ImGuiInputTextFlags_CallbackResize = 1 << 21, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) + ImGuiInputTextFlags_CallbackEdit = 1 << 22, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) // Obsolete names //ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior @@ -1027,25 +1125,31 @@ enum ImGuiTreeNodeFlags_ ImGuiTreeNodeFlags_None = 0, ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) - ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one + ImGuiTreeNodeFlags_AllowOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). - ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow - ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). - ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. - ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). - ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) - //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible + ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow. IMPORTANT: node can still be marked open/close if you don't set the _Leaf flag! + ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding() before the node. + ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line without using AllowOverlap mode. + ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (cover the indent area). + ImGuiTreeNodeFlags_SpanTextWidth = 1 << 13, // Narrow hit box + narrow hovering highlight, will only cover the label text. + ImGuiTreeNodeFlags_SpanAllColumns = 1 << 14, // Frame will span all columns of its container table (text will still fit in current column) + ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 15, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) + //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 16, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog, + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiTreeNodeFlags_AllowItemOverlap = ImGuiTreeNodeFlags_AllowOverlap, // Renamed in 1.89.7 +#endif }; // Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. -// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat -// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. +// - To be backward compatible with older API which took an 'int mouse_button = 1' argument instead of 'ImGuiPopupFlags flags', +// we need to treat small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. // It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. // - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. // IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter @@ -1059,10 +1163,12 @@ enum ImGuiPopupFlags_ ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) ImGuiPopupFlags_MouseButtonMask_ = 0x1F, ImGuiPopupFlags_MouseButtonDefault_ = 1, - ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack - ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space - ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. - ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) + ImGuiPopupFlags_NoReopen = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't reopen same popup if already open (won't reposition, won't reinitialize navigation) + //ImGuiPopupFlags_NoReopenAlwaysNavInit = 1 << 6, // For OpenPopup*(), BeginPopupContext*(): focus and initialize navigation even when not reopening. + ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 7, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack + ImGuiPopupFlags_NoOpenOverItems = 1 << 8, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space + ImGuiPopupFlags_AnyPopupId = 1 << 10, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. + ImGuiPopupFlags_AnyPopupLevel = 1 << 11, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel, }; @@ -1071,10 +1177,14 @@ enum ImGuiSelectableFlags_ { ImGuiSelectableFlags_None = 0, ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this doesn't close parent popup window - ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) + ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Frame will span all columns of its container table (text will still fit in current column) ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text - ImGuiSelectableFlags_AllowItemOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one + ImGuiSelectableFlags_AllowOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiSelectableFlags_AllowItemOverlap = ImGuiSelectableFlags_AllowOverlap, // Renamed in 1.89.7 +#endif }; // Flags for ImGui::BeginCombo() @@ -1088,6 +1198,7 @@ enum ImGuiComboFlags_ ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button + ImGuiComboFlags_WidthFitPreview = 1 << 7, // Width dynamically calculated from preview contents ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest, }; @@ -1098,7 +1209,7 @@ enum ImGuiTabBarFlags_ ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup - ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit @@ -1111,147 +1222,15 @@ enum ImGuiTabBarFlags_ enum ImGuiTabItemFlags_ { ImGuiTabItemFlags_None = 0, - ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + set ImGuiTabItemFlags_NoAssumedClosure. ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() - ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. - ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You may handle this behavior manually on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID()/PopID() on BeginTabItem()/EndTabItem() ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) ImGuiTabItemFlags_Trailing = 1 << 7, // Enforce the tab position to the right of the tab bar (before the scrolling buttons) -}; - -// Flags for ImGui::BeginTable() -// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. -// Read comments/demos carefully + experiment with live demos to get acquainted with them. -// - The DEFAULT sizing policies are: -// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. -// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. -// - When ScrollX is off: -// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. -// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. -// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). -// - Stretch Columns will share the remaining width according to their respective weight. -// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. -// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. -// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). -// - When ScrollX is on: -// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed -// - Columns sizing policy allowed: Fixed/Auto mostly. -// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed. -// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. -// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). -// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. -// - Read on documentation at the top of imgui_tables.cpp for details. -enum ImGuiTableFlags_ -{ - // Features - ImGuiTableFlags_None = 0, - ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. - ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) - ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. - ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. - ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. - ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). - // Decorations - ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) - ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. - ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. - ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. - ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. - ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. - ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. - ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. - ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. - ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. - ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style - ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style - // Sizing Policy (read above for defaults) - ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. - ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. - ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. - ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). - // Sizing Extra Options - ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. - ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. - ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. - ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. - // Clipping - ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). - // Padding - ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers. - ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding. - ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). - // Scrolling - ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX. - ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. - // Sorting - ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). - ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). - - // [Internal] Combinations and masks - ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, -}; - -// Flags for ImGui::TableSetupColumn() -enum ImGuiTableColumnFlags_ -{ - // Input configuration flags - ImGuiTableColumnFlags_None = 0, - ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) - ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. - ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. - ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). - ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). - ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. - ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. - ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. - ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). - ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). - ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. - ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. - ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu. - ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. - ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). - ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. - ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). - ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. - - // Output status flags, read-only via TableGetColumnFlags() - ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. - ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. - ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs - ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse - - // [Internal] Combinations and masks - ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, - ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, - ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, - ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) -}; - -// Flags for ImGui::TableNextRow() -enum ImGuiTableRowFlags_ -{ - ImGuiTableRowFlags_None = 0, - ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) -}; - -// Enum for ImGui::TableSetBgColor() -// Background colors are rendering in 3 layers: -// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. -// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. -// - Layer 2: draw with CellBg color if set. -// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color. -// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. -// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. -// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. -enum ImGuiTableBgTarget_ -{ - ImGuiTableBgTarget_None = 0, - ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) - ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) - ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) + ImGuiTabItemFlags_NoAssumedClosure = 1 << 8, // Tab is selected when trying to close + closure is not immediately assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. }; // Flags for ImGui::IsWindowFocused() @@ -1280,16 +1259,30 @@ enum ImGuiHoveredFlags_ ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. - ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window - ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled - ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse. + ImGuiHoveredFlags_AllowWhenOverlappedByItem = 1 << 8, // IsItemHovered() only: Return true even if the item uses AllowOverlap mode and is overlapped by another hoverable item. + ImGuiHoveredFlags_AllowWhenOverlappedByWindow = 1 << 9, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window. + ImGuiHoveredFlags_AllowWhenDisabled = 1 << 10, // IsItemHovered() only: Return true even if the item is disabled + ImGuiHoveredFlags_NoNavOverride = 1 << 11, // IsItemHovered() only: Disable using gamepad/keyboard navigation state when active, always query mouse + ImGuiHoveredFlags_AllowWhenOverlapped = ImGuiHoveredFlags_AllowWhenOverlappedByItem | ImGuiHoveredFlags_AllowWhenOverlappedByWindow, ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows, - // Hovering delays (for tooltips) - ImGuiHoveredFlags_DelayNormal = 1 << 11, // Return true after io.HoverDelayNormal elapsed (~0.30 sec) - ImGuiHoveredFlags_DelayShort = 1 << 12, // Return true after io.HoverDelayShort elapsed (~0.10 sec) - ImGuiHoveredFlags_NoSharedDelay = 1 << 13, // Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays) + // Tooltips mode + // - typically used in IsItemHovered() + SetTooltip() sequence. + // - this is a shortcut to pull flags from 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' where you can reconfigure desired behavior. + // e.g. 'TooltipHoveredFlagsForMouse' defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'. + // - for frequently actioned or hovered items providing a tooltip, you want may to use ImGuiHoveredFlags_ForTooltip (stationary + delay) so the tooltip doesn't show too often. + // - for items which main purpose is to be hovered, or items with low affordance, or in less consistent apps, prefer no delay or shorter delay. + ImGuiHoveredFlags_ForTooltip = 1 << 12, // Shortcut for standard flags when using IsItemHovered() + SetTooltip() sequence. + + // (Advanced) Mouse Hovering delays. + // - generally you can use ImGuiHoveredFlags_ForTooltip to use application-standardized flags. + // - use those if you need specific overrides. + ImGuiHoveredFlags_Stationary = 1 << 13, // Require mouse to be stationary for style.HoverStationaryDelay (~0.15 sec) _at least one time_. After this, can move on same item/window. Using the stationary test tends to reduces the need for a long delay. + ImGuiHoveredFlags_DelayNone = 1 << 14, // IsItemHovered() only: Return true immediately (default). As this is the default you generally ignore this. + ImGuiHoveredFlags_DelayShort = 1 << 15, // IsItemHovered() only: Return true after style.HoverDelayShort elapsed (~0.15 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item). + ImGuiHoveredFlags_DelayNormal = 1 << 16, // IsItemHovered() only: Return true after style.HoverDelayNormal elapsed (~0.40 sec) (shared between items) + requires mouse to be stationary for style.HoverStationaryDelay (once per item). + ImGuiHoveredFlags_NoSharedDelay = 1 << 17, // IsItemHovered() only: Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays) }; // Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() @@ -1331,7 +1324,7 @@ enum ImGuiDataType_ }; // A cardinal direction -enum ImGuiDir_ +enum ImGuiDir : int { ImGuiDir_None = -1, ImGuiDir_Left = 0, @@ -1342,18 +1335,24 @@ enum ImGuiDir_ }; // A sorting direction -enum ImGuiSortDirection_ +enum ImGuiSortDirection : ImU8 { ImGuiSortDirection_None = 0, ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc. ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. }; +// Since 1.90, defining IMGUI_DISABLE_OBSOLETE_FUNCTIONS automatically defines IMGUI_DISABLE_OBSOLETE_KEYIO as well. +#if defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && !defined(IMGUI_DISABLE_OBSOLETE_KEYIO) +#define IMGUI_DISABLE_OBSOLETE_KEYIO +#endif + // A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value): can represent Keyboard, Mouse and Gamepad values. // All our named keys are >= 512. Keys value 0 to 511 are left unused as legacy native/opaque key values (< 1.87). // Since >= 1.89 we increased typing (went from int to enum), some legacy code may need a cast to ImGuiKey. // Read details about the 1.87 and 1.89 transition : https://github.com/ocornut/imgui/issues/4921 // Note that "Keys" related to physical keys and are not the same concept as input "Characters", the later are submitted via io.AddInputCharacter(). +// The keyboard key enum values are named after the keys on a standard US keyboard, and on other keyboard types the keys reported may not match the keycaps. enum ImGuiKey : int { // Keyboard @@ -1382,6 +1381,8 @@ enum ImGuiKey : int ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z, ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6, ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12, + ImGuiKey_F13, ImGuiKey_F14, ImGuiKey_F15, ImGuiKey_F16, ImGuiKey_F17, ImGuiKey_F18, + ImGuiKey_F19, ImGuiKey_F20, ImGuiKey_F21, ImGuiKey_F22, ImGuiKey_F23, ImGuiKey_F24, ImGuiKey_Apostrophe, // ' ImGuiKey_Comma, // , ImGuiKey_Minus, // - @@ -1407,6 +1408,8 @@ enum ImGuiKey : int ImGuiKey_KeypadAdd, ImGuiKey_KeypadEnter, ImGuiKey_KeypadEqual, + ImGuiKey_AppBack, // Available on some keyboard/mouses. Often referred as "Browser Back" + ImGuiKey_AppForward, // Gamepad (some of those are analog values, 0.0f to 1.0f) // NAVIGATION ACTION // (download controller mapping PNG/PSD at http://dearimgui.com/controls_sheets) @@ -1451,13 +1454,13 @@ enum ImGuiKey : int // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys. // In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and // backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user... + // - On macOS, we swap Cmd(Super) and Ctrl keys at the time of the io.AddKeyEvent() call. ImGuiMod_None = 0, - ImGuiMod_Ctrl = 1 << 12, // Ctrl + ImGuiMod_Ctrl = 1 << 12, // Ctrl (non-macOS), Cmd (macOS) ImGuiMod_Shift = 1 << 13, // Shift ImGuiMod_Alt = 1 << 14, // Option/Menu - ImGuiMod_Super = 1 << 15, // Cmd/Super/Windows - ImGuiMod_Shortcut = 1 << 11, // Alias for Ctrl (non-macOS) _or_ Super (macOS). - ImGuiMod_Mask_ = 0xF800, // 5-bits + ImGuiMod_Super = 1 << 15, // Windows/Super (non-macOS), Ctrl (macOS) + ImGuiMod_Mask_ = 0xF000, // 4-bits // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + the io.KeyMap[] array. // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE) @@ -1474,11 +1477,37 @@ enum ImGuiKey : int #endif #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiMod_Shortcut = ImGuiMod_Ctrl, // Removed in 1.90.7, you can now simply use ImGuiMod_Ctrl ImGuiKey_ModCtrl = ImGuiMod_Ctrl, ImGuiKey_ModShift = ImGuiMod_Shift, ImGuiKey_ModAlt = ImGuiMod_Alt, ImGuiKey_ModSuper = ImGuiMod_Super, // Renamed in 1.89 - ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 + //ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 #endif }; +// Flags for Shortcut(), SetNextItemShortcut(), +// (and for upcoming extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() that are still in imgui_internal.h) +// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function) +enum ImGuiInputFlags_ +{ + ImGuiInputFlags_None = 0, + ImGuiInputFlags_Repeat = 1 << 0, // Enable repeat. Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. + + // Flags for Shortcut(), SetNextItemShortcut() + // - Routing policies: RouteGlobal+OverActive >> RouteActive or RouteFocused (if owner is active item) >> RouteGlobal+OverFocused >> RouteFocused (if in focused window stack) >> RouteGlobal. + // - Default policy is RouteFocused. Can select only 1 policy among all available. + ImGuiInputFlags_RouteActive = 1 << 10, // Route to active item only. + ImGuiInputFlags_RouteFocused = 1 << 11, // Route to windows in the focus stack (DEFAULT). Deep-most focused window takes inputs. Active item takes inputs over deep-most focused window. + ImGuiInputFlags_RouteGlobal = 1 << 12, // Global route (unless a focused window or active item registered the route). + ImGuiInputFlags_RouteAlways = 1 << 13, // Do not register route, poll keys directly. + // - Routing options + ImGuiInputFlags_RouteOverFocused = 1 << 14, // Option: global route: higher priority than focused route (unless active item in focused route). + ImGuiInputFlags_RouteOverActive = 1 << 15, // Option: global route: higher priority than active item. Unlikely you need to use that: will interfere with every active items, e.g. CTRL+A registered by InputText will be overridden by this. May not be fully honored as user/internal code is likely to always assume they can access keys when active. + ImGuiInputFlags_RouteUnlessBgFocused = 1 << 16, // Option: global route: will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications. + ImGuiInputFlags_RouteFromRootWindow = 1 << 17, // Option: route evaluated from the point of view of root window rather than current window. + + // Flags for SetNextItemShortcut() + ImGuiInputFlags_Tooltip = 1 << 18, // Automatically display a tooltip when hovering item [BETA] Unsure of right api (opt-in/opt-out) +}; + #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO // OBSOLETED in 1.88 (from July 2022): ImGuiNavInput and io.NavInputs[]. // Official backends between 1.60 and 1.86: will keep working and feed gamepad inputs as long as IMGUI_DISABLE_OBSOLETE_KEYIO is not set. @@ -1530,15 +1559,15 @@ enum ImGuiCol_ ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive, - ImGuiCol_TitleBg, - ImGuiCol_TitleBgActive, - ImGuiCol_TitleBgCollapsed, + ImGuiCol_TitleBg, // Title bar + ImGuiCol_TitleBgActive, // Title bar when focused + ImGuiCol_TitleBgCollapsed, // Title bar when collapsed ImGuiCol_MenuBarBg, ImGuiCol_ScrollbarBg, ImGuiCol_ScrollbarGrab, ImGuiCol_ScrollbarGrabHovered, ImGuiCol_ScrollbarGrabActive, - ImGuiCol_CheckMark, + ImGuiCol_CheckMark, // Checkbox tick and RadioButton circle ImGuiCol_SliderGrab, ImGuiCol_SliderGrabActive, ImGuiCol_Button, @@ -1580,40 +1609,45 @@ enum ImGuiCol_ // - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. // During initialization or between frames, feel free to just poke into ImGuiStyle directly. // - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. -// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. // - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. enum ImGuiStyleVar_ { - // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) - ImGuiStyleVar_Alpha, // float Alpha - ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha - ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding - ImGuiStyleVar_WindowRounding, // float WindowRounding - ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize - ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize - ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign - ImGuiStyleVar_ChildRounding, // float ChildRounding - ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize - ImGuiStyleVar_PopupRounding, // float PopupRounding - ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize - ImGuiStyleVar_FramePadding, // ImVec2 FramePadding - ImGuiStyleVar_FrameRounding, // float FrameRounding - ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize - ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing - ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing - ImGuiStyleVar_IndentSpacing, // float IndentSpacing - ImGuiStyleVar_CellPadding, // ImVec2 CellPadding - ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize - ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding - ImGuiStyleVar_GrabMinSize, // float GrabMinSize - ImGuiStyleVar_GrabRounding, // float GrabRounding - ImGuiStyleVar_TabRounding, // float TabRounding - ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign - ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign - ImGuiStyleVar_SeparatorTextBorderSize,// float SeparatorTextBorderSize - ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign - ImGuiStyleVar_SeparatorTextPadding,// ImVec2 SeparatorTextPadding + // Enum name -------------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) + ImGuiStyleVar_Alpha, // float Alpha + ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha + ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding + ImGuiStyleVar_WindowRounding, // float WindowRounding + ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize + ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize + ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign + ImGuiStyleVar_ChildRounding, // float ChildRounding + ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize + ImGuiStyleVar_PopupRounding, // float PopupRounding + ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize + ImGuiStyleVar_FramePadding, // ImVec2 FramePadding + ImGuiStyleVar_FrameRounding, // float FrameRounding + ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize + ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing + ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing + ImGuiStyleVar_IndentSpacing, // float IndentSpacing + ImGuiStyleVar_CellPadding, // ImVec2 CellPadding + ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize + ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding + ImGuiStyleVar_GrabMinSize, // float GrabMinSize + ImGuiStyleVar_GrabRounding, // float GrabRounding + ImGuiStyleVar_TabRounding, // float TabRounding + ImGuiStyleVar_TabBorderSize, // float TabBorderSize + ImGuiStyleVar_TabBarBorderSize, // float TabBarBorderSize + ImGuiStyleVar_TableAngledHeadersAngle, // float TableAngledHeadersAngle + ImGuiStyleVar_TableAngledHeadersTextAlign,// ImVec2 TableAngledHeadersTextAlign + ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign + ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign + ImGuiStyleVar_SeparatorTextBorderSize, // float SeparatorTextBorderSize + ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign + ImGuiStyleVar_SeparatorTextPadding, // ImVec2 SeparatorTextPadding ImGuiStyleVar_COUNT }; @@ -1624,10 +1658,8 @@ enum ImGuiButtonFlags_ ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default) ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button - - // [Internal] - ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, - ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft, + ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, // [Internal] + //ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft, }; // Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() @@ -1729,7 +1761,7 @@ enum ImGuiMouseSource : int ImGuiMouseSource_COUNT }; -// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions +// Enumeration for ImGui::SetNextWindow***(), SetWindow***(), SetNextItem***() functions // Represent a condition. // Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. enum ImGuiCond_ @@ -1741,6 +1773,170 @@ enum ImGuiCond_ ImGuiCond_Appearing = 1 << 3, // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) }; +//----------------------------------------------------------------------------- +// [SECTION] Tables API flags and structures (ImGuiTableFlags, ImGuiTableColumnFlags, ImGuiTableRowFlags, ImGuiTableBgTarget, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +//----------------------------------------------------------------------------- + +// Flags for ImGui::BeginTable() +// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. +// Read comments/demos carefully + experiment with live demos to get acquainted with them. +// - The DEFAULT sizing policies are: +// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. +// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. +// - When ScrollX is off: +// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. +// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. +// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). +// - Stretch Columns will share the remaining width according to their respective weight. +// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. +// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). +// - When ScrollX is on: +// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed +// - Columns sizing policy allowed: Fixed/Auto mostly. +// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed. +// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. +// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). +// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. +// - Read on documentation at the top of imgui_tables.cpp for details. +enum ImGuiTableFlags_ +{ + // Features + ImGuiTableFlags_None = 0, + ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. + ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) + ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. + ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. + ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. + ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). + // Decorations + ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) + ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. + ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. + ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. + ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. + ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. + ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. + ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. + ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. + ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. + ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style + ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style + // Sizing Policy (read above for defaults) + ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. + ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. + ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. + ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). + // Sizing Extra Options + ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. + ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. + ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. + ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. + // Clipping + ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). + // Padding + ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers. + ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding. + ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). + // Scrolling + ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX. + ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. + // Sorting + ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). + ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). + // Miscellaneous + ImGuiTableFlags_HighlightHoveredColumn = 1 << 28, // Highlight column headers when hovered (may evolve into a fuller highlight) + + // [Internal] Combinations and masks + ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, +}; + +// Flags for ImGui::TableSetupColumn() +enum ImGuiTableColumnFlags_ +{ + // Input configuration flags + ImGuiTableColumnFlags_None = 0, + ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) + ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. + ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. + ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). + ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). + ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. + ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. + ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. + ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). + ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). + ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. + ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. + ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit horizontal label for this column. Convenient for some small columns. Name will still appear in context menu or in angled headers. + ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. + ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). + ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. + ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). + ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. + ImGuiTableColumnFlags_AngledHeader = 1 << 18, // TableHeadersRow() will submit an angled header row for this column. Note this will add an extra row. + + // Output status flags, read-only via TableGetColumnFlags() + ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. + ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. + ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs + ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse + + // [Internal] Combinations and masks + ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, + ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, + ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, + ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) +}; + +// Flags for ImGui::TableNextRow() +enum ImGuiTableRowFlags_ +{ + ImGuiTableRowFlags_None = 0, + ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) +}; + +// Enum for ImGui::TableSetBgColor() +// Background colors are rendering in 3 layers: +// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. +// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. +// - Layer 2: draw with CellBg color if set. +// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color. +// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. +// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. +// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. +enum ImGuiTableBgTarget_ +{ + ImGuiTableBgTarget_None = 0, + ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) + ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) + ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) +}; + +// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +// Obtained by calling TableGetSortSpecs(). +// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. +// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! +struct ImGuiTableSortSpecs +{ + const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. + int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. + bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. + + ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +// Sorting specification for one column of a table (sizeof == 12 bytes) +struct ImGuiTableColumnSortSpecs +{ + ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) + ImS16 ColumnIndex; // Index of the column + ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) + ImGuiSortDirection SortDirection; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending + + ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + //----------------------------------------------------------------------------- // [SECTION] Helpers: Memory allocations macros, ImVector<> //----------------------------------------------------------------------------- @@ -1830,6 +2026,7 @@ struct ImVector inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline int find_index(const T& v) const { const T* data_end = Data + Size; const T* it = find(v); if (it == data_end) return -1; const ptrdiff_t off = it - Data; return (int)off; } inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } @@ -1863,7 +2060,7 @@ struct ImGuiStyle float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). - ImVec2 CellPadding; // Padding within a table cell + ImVec2 CellPadding; // Padding within a table cell. Cellpadding.x is locked for entire table. CellPadding.y may be altered between different rows. ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). @@ -1875,15 +2072,18 @@ struct ImGuiStyle float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. float TabBorderSize; // Thickness of border around tabs. float TabMinWidthForCloseButton; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + float TabBarBorderSize; // Thickness of tab-bar separator, which takes on the tab active color to denote focus. + float TableAngledHeadersAngle; // Angle of angled headers (supported values range from -50.0f degrees to +50.0f degrees). + ImVec2 TableAngledHeadersTextAlign;// Alignment of angled headers within the cell ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. float SeparatorTextBorderSize; // Thickkness of border in SeparatorText() ImVec2 SeparatorTextAlign; // Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). ImVec2 SeparatorTextPadding; // Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. - ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. - ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! - float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + ImVec2 DisplayWindowPadding; // Apply to regular windows: amount which we enforce to keep visible when moving near edges of your screen. + ImVec2 DisplaySafeAreaPadding; // Apply to every windows, menus, popups, tooltips: amount where we avoid displaying contents. Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured). + float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). We apply per-monitor DPI scaling over this scale. May be removed later. bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). Latched at the beginning of the frame (copied to ImDrawList). bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). @@ -1891,6 +2091,14 @@ struct ImGuiStyle float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. ImVec4 Colors[ImGuiCol_COUNT]; + // Behaviors + // (It is possible to modify those fields mid-frame if specific behavior need it, unlike e.g. configuration fields in ImGuiIO) + float HoverStationaryDelay; // Delay for IsItemHovered(ImGuiHoveredFlags_Stationary). Time required to consider mouse stationary. + float HoverDelayShort; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayShort). Usually used along with HoverStationaryDelay. + float HoverDelayNormal; // Delay for IsItemHovered(ImGuiHoveredFlags_DelayNormal). " + ImGuiHoveredFlags HoverFlagsForTooltipMouse;// Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using mouse. + ImGuiHoveredFlags HoverFlagsForTooltipNav; // Default flags when using IsItemHovered(ImGuiHoveredFlags_ForTooltip) or BeginItemTooltip()/SetItemTooltip() while using keyboard/gamepad. + IMGUI_API ImGuiStyle(); IMGUI_API void ScaleAllSizes(float scale_factor); }; @@ -1900,6 +2108,9 @@ struct ImGuiStyle //----------------------------------------------------------------------------- // Communicate most settings and inputs/outputs to Dear ImGui using this structure. // Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. +// It is generally expected that: +// - initialization: backends and user code writes to ImGuiIO. +// - main loop: backends writes to ImGuiIO, user code and imgui code reads from ImGuiIO. //----------------------------------------------------------------------------- // [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions. @@ -1925,13 +2136,6 @@ struct ImGuiIO float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions. const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified). - float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. - float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. - float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. - float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). - float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. - float HoverDelayNormal; // = 0.30 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayNormal) returns true. - float HoverDelayShort; // = 0.10 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayShort) returns true. void* UserData; // = NULL // Store your own data. ImFontAtlas*Fonts; // // Font atlas: load, rasterize and pack one or more fonts into a single texture. @@ -1942,7 +2146,7 @@ struct ImGuiIO // Miscellaneous options bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. - bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. + bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // Swap Cmd<>Ctrl keys + OS X style text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates. bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). bool ConfigInputTextEnterKeepActive; // = false // [BETA] Pressing Enter will keep item active and select contents (single-line only). @@ -1951,18 +2155,39 @@ struct ImGuiIO bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. + // Inputs Behaviors + // (other variables, ones which are expected to be tweaked within UI code, are exposed in ImGuiStyle) + float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. + float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. + float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. + float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). + float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. + + //------------------------------------------------------------------ // Debug options - // - tools to test correct Begin/End and BeginChild/EndChild behaviors. - // - presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX() - // this is inconsistent with other BeginXXX functions and create confusion for many users. - // - we expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior. + //------------------------------------------------------------------ + + // Option to enable various debug tools showing buttons that will call the IM_DEBUG_BREAK() macro. + // - The Item Picker tool will be available regardless of this being enabled, in order to maximize its discoverability. + // - Requires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application. + // e.g. io.ConfigDebugIsDebuggerPresent = ::IsDebuggerPresent() on Win32, or refer to ImOsIsDebuggerPresent() imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version). + bool ConfigDebugIsDebuggerPresent; // = false // Enable various tools calling IM_DEBUG_BREAK(). + + // Tools to test correct Begin/End and BeginChild/EndChild behaviors. + // - Presently Begin()/End() and BeginChild()/EndChild() needs to ALWAYS be called in tandem, regardless of return value of BeginXXX() + // - This is inconsistent with other BeginXXX functions and create confusion for many users. + // - We expect to update the API eventually. In the meanwhile we provide tools to facilitate checking user-code behavior. bool ConfigDebugBeginReturnValueOnce;// = false // First-time calls to Begin()/BeginChild() will return false. NEEDS TO BE SET AT APPLICATION BOOT TIME if you don't want to miss windows. bool ConfigDebugBeginReturnValueLoop;// = false // Some calls to Begin()/BeginChild() will return false. Will cycle through window depths then repeat. Suggested use: add "io.ConfigDebugBeginReturnValue = io.KeyShift" in your main loop then occasionally press SHIFT. Windows should be flickering while running. - // - option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data. - // - backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them. - // - consider using e.g. Win32's IsDebuggerPresent() as an additional filter (or see ImOsIsDebuggerPresent() in imgui_test_engine/imgui_te_utils.cpp for a Unix compatible version). + + // Option to deactivate io.AddFocusEvent(false) handling. + // - May facilitate interactions with a debugger when focus loss leads to clearing inputs data. + // - Backends may have other side-effects on focus loss, so this will reduce side-effects but not necessary remove all of them. bool ConfigDebugIgnoreFocusLoss; // = false // Ignore io.AddFocusEvent(false), consequently not calling io.ClearInputKeys() in input processing. + // Options to audit .ini data + bool ConfigDebugIniSettings; // = false // Save .ini data with extra comments (particularly helpful for Docking, but makes saving slower) + //------------------------------------------------------------------ // Platform Functions // (the imgui_impl_xxxx backend files are setting those up for you) @@ -1984,11 +2209,9 @@ struct ImGuiIO // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows) // (default to use native imm32 api on Windows) void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. -#else - void* _UnusedPadding; // Unused field to keep data structure the same size. -#endif + + // Optional: Platform locale + ImWchar PlatformLocaleDecimalPoint; // '.' // [Experimental] Configure decimal point e.g. '.' or ',' useful for some languages (e.g. German), generally pulled from *localeconv()->decimal_point //------------------------------------------------------------------ // Input - Call before calling NewFrame() @@ -2008,8 +2231,11 @@ struct ImGuiIO IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode. IMGUI_API void SetAppAcceptingEvents(bool accepting_events); // Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. - IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually - IMGUI_API void ClearInputKeys(); // [Internal] Release all keys + IMGUI_API void ClearEventsQueue(); // Clear all incoming events. + IMGUI_API void ClearInputKeys(); // Clear current keyboard/mouse/gamepad state + current frame text input buffer. Equivalent to releasing all keys/buttons. +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + IMGUI_API void ClearInputCharacters(); // [Obsoleted in 1.89.8] Clear the current frame text input buffer. Now included within ClearInputKeys(). +#endif //------------------------------------------------------------------ // Output - Updated by NewFrame() or EndFrame()/Render() @@ -2029,18 +2255,8 @@ struct ImGuiIO int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 int MetricsRenderWindows; // Number of visible windows int MetricsActiveWindows; // Number of active windows - int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. - // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. - // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). - // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space) -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. - bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. - float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. -#endif - //------------------------------------------------------------------ // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! //------------------------------------------------------------------ @@ -2061,7 +2277,7 @@ struct ImGuiIO bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows // Other state maintained from data above + IO function calls - ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. DOES NOT CONTAINS ImGuiMod_Shortcut which is pretranslated). Read-only, updated by NewFrame() + ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. Read-only, updated by NewFrame() ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this. bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) @@ -2075,6 +2291,7 @@ struct ImGuiIO bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds. bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window. bool MouseWheelRequestAxisSwap; // On a non-Mac system, holding SHIFT requests WheelY to perform the equivalent of a WheelX event. On a Mac system this is already enforced by the system. + bool MouseCtrlLeftAsRightClick; // (OSX) Set to true when the current click was a ctrl-click that spawned a simulated right click float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) float MouseDownDurationPrev[5]; // Previous time the mouse button has been down float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds) @@ -2086,11 +2303,21 @@ struct ImGuiIO ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16() ImVector InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. + // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. + // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). + // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space) +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. + bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. + float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. + //void* ImeWindowHandle; // [Obsoleted in 1.87] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. +#endif + IMGUI_API ImGuiIO(); }; //----------------------------------------------------------------------------- -// [SECTION] Misc data structures +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload) //----------------------------------------------------------------------------- // Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. @@ -2110,6 +2337,8 @@ struct ImGuiInputTextCallbackData void* UserData; // What user passed to InputText() // Read-only // Arguments for the different callback events + // - During Resize callback, Buf will be same as your input buffer. + // - However, during Completion/History/Always callback, Buf always points to our own internal data (it is not the same as your buffer)! Changes to it will be reflected into your own buffer shortly after the callback. // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary. // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state. ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; @@ -2164,30 +2393,6 @@ struct ImGuiPayload bool IsDelivery() const { return Delivery; } }; -// Sorting specification for one column of a table (sizeof == 12 bytes) -struct ImGuiTableColumnSortSpecs -{ - ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) - ImS16 ColumnIndex; // Index of the column - ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) - ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) - - ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - -// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) -// Obtained by calling TableGetSortSpecs(). -// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. -// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! -struct ImGuiTableSortSpecs -{ - const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. - int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. - bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. - - ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } -}; - //----------------------------------------------------------------------------- // [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) //----------------------------------------------------------------------------- @@ -2271,9 +2476,9 @@ struct ImGuiStorage { ImGuiID key; union { int val_i; float val_f; void* val_p; }; - ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } - ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } - ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } + ImGuiStoragePair(ImGuiID _key, int _val) { key = _key; val_i = _val; } + ImGuiStoragePair(ImGuiID _key, float _val) { key = _key; val_f = _val; } + ImGuiStoragePair(ImGuiID _key, void* _val) { key = _key; val_p = _val; } }; ImVector Data; @@ -2300,11 +2505,10 @@ struct ImGuiStorage IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); - // Use on your own storage if you know only integer are being stored (open/close all tree nodes) - IMGUI_API void SetAllInt(int val); - - // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. + // Advanced: for quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. IMGUI_API void BuildSortByKey(); + // Obsolete: use on your own storage if you know only integer are being stored (open/close all tree nodes) + IMGUI_API void SetAllInt(int val); }; // Helper: Manually clip large list of items. @@ -2345,12 +2549,14 @@ struct ImGuiListClipper IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. - // Call IncludeRangeByIndices() *BEFORE* first call to Step() if you need a range of items to not be clipped, regardless of their visibility. + // Call IncludeItemByIndex() or IncludeItemsByIndex() *BEFORE* first call to Step() if you need a range of items to not be clipped, regardless of their visibility. // (Due to alignment / padding of certain items it is possible that an extra item may be included on either end of the display range). - IMGUI_API void IncludeRangeByIndices(int item_begin, int item_end); // item_end is exclusive e.g. use (42, 42+1) to make item 42 never clipped. + inline void IncludeItemByIndex(int item_index) { IncludeItemsByIndex(item_index, item_index + 1); } + IMGUI_API void IncludeItemsByIndex(int item_begin, int item_end); // item_end is exclusive e.g. use (42, 42+1) to make item 42 never clipped. #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - inline void ForceDisplayRangeByIndices(int item_begin, int item_end) { IncludeRangeByIndices(item_begin, item_end); } // [renamed in 1.89.6] + inline void IncludeRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.9] + inline void ForceDisplayRangeByIndices(int item_begin, int item_end) { IncludeItemsByIndex(item_begin, item_end); } // [renamed in 1.89.6] //inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] #endif }; @@ -2375,9 +2581,13 @@ static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } +static inline bool operator==(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; } +static inline bool operator!=(const ImVec2& lhs, const ImVec2& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y; } static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } +static inline bool operator==(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w; } +static inline bool operator!=(const ImVec4& lhs, const ImVec4& rhs) { return lhs.x != rhs.x || lhs.y != rhs.y || lhs.z != rhs.z || lhs.w != rhs.w; } IM_MSVC_RUNTIME_CHECKS_RESTORE #endif @@ -2414,8 +2624,8 @@ struct ImColor constexpr ImColor() { } constexpr ImColor(float r, float g, float b, float a = 1.0f) : Value(r, g, b, a) { } constexpr ImColor(const ImVec4& col) : Value(col) {} - ImColor(int r, int g, int b, int a = 255) { float sc = 1.0f / 255.0f; Value.x = (float)r * sc; Value.y = (float)g * sc; Value.z = (float)b * sc; Value.w = (float)a * sc; } - ImColor(ImU32 rgba) { float sc = 1.0f / 255.0f; Value.x = (float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } + constexpr ImColor(int r, int g, int b, int a = 255) : Value((float)r * (1.0f / 255.0f), (float)g * (1.0f / 255.0f), (float)b * (1.0f / 255.0f), (float)a* (1.0f / 255.0f)) {} + constexpr ImColor(ImU32 rgba) : Value((float)((rgba >> IM_COL32_R_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * (1.0f / 255.0f), (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * (1.0f / 255.0f)) {} inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } inline operator ImVec4() const { return Value; } @@ -2447,9 +2657,9 @@ typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* c // Special Draw callback value to request renderer backend to reset the graphics/render state. // The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. -// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. -// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). -#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) +// This is useful, for example, if you submitted callbacks which you know have altered the render state and you want it to be restored. +// Render state is not reset by default because they are many perfectly useful way of altering render state (e.g. changing shader/blending settings before an Image call). +#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-8) // Typically, 1 command = 1 GPU draw call (unless command is a callback) // - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, @@ -2572,15 +2782,15 @@ struct ImDrawList // [Internal, used while building lists] unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) - const char* _OwnerName; // Pointer to owner window's name for debugging ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) - ImVector _ClipRectStack; // [Internal] - ImVector _TextureIdStack; // [Internal] ImVector _Path; // [Internal] current path building ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) + ImVector _ClipRectStack; // [Internal] + ImVector _TextureIdStack; // [Internal] float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content + const char* _OwnerName; // Pointer to owner window's name for debugging // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) ImDrawList(ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } @@ -2613,13 +2823,20 @@ struct ImDrawList IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); + IMGUI_API void AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f); + IMGUI_API void AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot = 0.0f, int num_segments = 0); IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); - IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); - IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) + // General polygon + // - Only simple polygons are supported by filling functions (no self-intersections, no holes). + // - Concave polygon fill is more expensive than convex one: it has O(N^2) complexity. Provided as a convenience fo user but not used by main library. + IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); + IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); + IMGUI_API void AddConcavePolyFilled(const ImVec2* points, int num_points, ImU32 col); + // Image primitives // - Read FAQ to understand what ImTextureID is. // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. @@ -2629,14 +2846,17 @@ struct ImDrawList IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); // Stateful path API, add points then finish with PathFillConvex() or PathStroke() - // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // - Important: filled shapes must always use clockwise winding order! The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // so e.g. 'PathArcTo(center, radius, PI * -0.5f, PI)' is ok, whereas 'PathArcTo(center, radius, PI, PI * -0.5f)' won't have correct anti-aliasing when followed by PathFillConvex(). inline void PathClear() { _Path.Size = 0; } inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } + inline void PathFillConcave(ImU32 col) { AddConcavePolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle + IMGUI_API void PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments = 0); // Ellipse IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); @@ -2649,7 +2869,7 @@ struct ImDrawList // Advanced: Channels // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) - // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! + // - This API shouldn't have been in ImDrawList in the first place! // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } @@ -2669,6 +2889,9 @@ struct ImDrawList inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index // Obsolete names + //inline void AddEllipse(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0, float thickness = 1.0f) { AddEllipse(center, ImVec2(radius_x, radius_y), col, rot, num_segments, thickness); } // OBSOLETED in 1.90.5 (Mar 2024) + //inline void AddEllipseFilled(const ImVec2& center, float radius_x, float radius_y, ImU32 col, float rot = 0.0f, int num_segments = 0) { AddEllipseFilled(center, ImVec2(radius_x, radius_y), col, rot, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024) + //inline void PathEllipticalArcTo(const ImVec2& center, float radius_x, float radius_y, float rot, float a_min, float a_max, int num_segments = 0) { PathEllipticalArcTo(center, ImVec2(radius_x, radius_y), rot, a_min, a_max, num_segments); } // OBSOLETED in 1.90.5 (Mar 2024) //inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021) //inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021) @@ -2690,18 +2913,20 @@ struct ImDrawList // as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) struct ImDrawData { - bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. - int CmdListsCount; // Number of ImDrawList* to render - int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size - int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size - ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. - ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) - ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) - ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. + int CmdListsCount; // Number of ImDrawList* to render (should always be == CmdLists.size) + int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size + int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size + ImVector CmdLists; // Array of ImDrawList* to render. The ImDrawLists are owned by ImGuiContext and only pointed to from here. + ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) + ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) + ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + ImGuiViewport* OwnerViewport; // Viewport carrying the ImDrawData instance, might be of use to the renderer (generally not). // Functions ImDrawData() { Clear(); } - void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! + IMGUI_API void Clear(); + IMGUI_API void AddDrawList(ImDrawList* draw_list); // Helper to add an external draw list into an existing ImDrawData. IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. }; @@ -2717,7 +2942,7 @@ struct ImFontConfig bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). int FontNo; // 0 // Index of font within TTF/OTF file float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). - int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. + int OversampleH; // 2 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal. You can reduce this to 1 for large glyphs save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. @@ -2727,7 +2952,8 @@ struct ImFontConfig float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. - float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. + float RasterizerMultiply; // 1.0f // Linearly brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. This is a silly thing we may remove in the future. + float RasterizerDensity; // 1.0f // DPI scale for rasterization, not altering other font metrics: make it easy to swap between e.g. a 100% and a 400% fonts for a zooming display. IMPORTANT: If you increase this it is expected that you increase font scale accordingly, otherwise quality may look lowered. ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. // [Internal] @@ -2811,8 +3037,8 @@ struct ImFontAtlas IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); - IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. - IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. + IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. + IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_data_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts. IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory. @@ -2854,7 +3080,7 @@ struct ImFontAtlas // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. // - After calling Build(), you can query the rectangle position and render your pixels. - // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. + // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of preferred texture format. // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), // so you can render e.g. custom colorful icons and use them as regular glyphs. // - Read docs/FONTS.md for more details about using colorful icons. @@ -2983,6 +3209,7 @@ enum ImGuiViewportFlags_ // - Windows are generally trying to stay within the Work Area of their host viewport. struct ImGuiViewport { + ImGuiID ID; // Unique identifier for the viewport ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) ImVec2 Size; // Main Area: Size of the viewport. @@ -3019,32 +3246,36 @@ struct ImGuiPlatformImeData // Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. //----------------------------------------------------------------------------- -namespace ImGui -{ -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key] -#else - static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; } -#endif -} - #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS namespace ImGui { + // OBSOLETED in 1.90.0 (from September 2023) + static inline bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags window_flags = 0) { return BeginChild(id, size, ImGuiChildFlags_FrameStyle, window_flags); } + static inline void EndChildFrame() { EndChild(); } + //static inline bool BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags window_flags){ return BeginChild(str_id, size_arg, border ? ImGuiChildFlags_Border : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Border + //static inline bool BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags window_flags) { return BeginChild(id, size_arg, border ? ImGuiChildFlags_Border : ImGuiChildFlags_None, window_flags); } // Unnecessary as true == ImGuiChildFlags_Border + static inline void ShowStackToolWindow(bool* p_open = NULL) { ShowIDStackToolWindow(p_open); } + IMGUI_API bool ListBox(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, bool (*old_callback)(void* user_data, int idx, const char** out_text), void* user_data, int items_count, int popup_max_height_in_items = -1); + // OBSOLETED in 1.89.7 (from June 2023) + IMGUI_API void SetItemAllowOverlap(); // Use SetNextItemAllowOverlap() before item. // OBSOLETED in 1.89.4 (from March 2023) static inline void PushAllowKeyboardFocus(bool tab_stop) { PushTabStop(tab_stop); } static inline void PopAllowKeyboardFocus() { PopTabStop(); } // OBSOLETED in 1.89 (from August 2022) IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Use new ImageButton() signature (explicit item id, regular FramePadding) - // OBSOLETED in 1.88 (from May 2022) - static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. - static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. - // OBSOLETED in 1.86 (from November 2021) - IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper. - // OBSOLETED in 1.85 (from August 2021) - static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } + // OBSOLETED in 1.87 (from February 2022 but more formally obsoleted April 2024) + IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // Map ImGuiKey_* values into legacy native key index. == io.KeyMap[key]. When using a 1.87+ backend using io.AddKeyEvent(), calling GetKeyIndex() with ANY ImGuiKey_XXXX values will return the same value! + //static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END); return key; } // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) + //-- OBSOLETED in 1.88 (from May 2022) + //static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. + //static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. + //-- OBSOLETED in 1.86 (from November 2021) + //IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Code removed, see 1.90 for last version of the code. Calculate range of visible items for large list of evenly sized items. Prefer using ImGuiListClipper. + //-- OBSOLETED in 1.85 (from August 2021) + //static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } //-- OBSOLETED in 1.81 (from February 2021) //static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } //static inline bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1) { float height = GetTextLineHeightWithSpacing() * ((height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f) + GetStyle().FramePadding.y * 2.0f; return BeginListBox(label, ImVec2(0.0f, height)); } // Helper to calculate size from items_count and height_in_items @@ -3095,21 +3326,21 @@ namespace ImGui //static inline void SetScrollPosHere() { SetScrollHere(); } // OBSOLETED in 1.42 } -// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() -typedef ImDrawFlags ImDrawCornerFlags; -enum ImDrawCornerFlags_ -{ - ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit - ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). - ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. - ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. - ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. - ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 - ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, - ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, - ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, - ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, -}; +//-- OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() +//typedef ImDrawFlags ImDrawCornerFlags; +//enum ImDrawCornerFlags_ +//{ +// ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit +// ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). +// ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. +// ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. +// ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. +// ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 +// ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, +// ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, +// ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, +// ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, +//}; // RENAMED and MERGED both ImGuiKey_ModXXX and ImGuiModFlags_XXX into ImGuiMod_XXX (from September 2022) // RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022). Exceptionally commented out ahead of obscolescence schedule to reduce confusion and because they were not meant to be used in the first place. @@ -3118,6 +3349,8 @@ enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl //typedef ImGuiKeyChord ImGuiKeyModFlags; // == int //enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = 0, ImGuiKeyModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiKeyModFlags_Shift = ImGuiMod_Shift, ImGuiKeyModFlags_Alt = ImGuiMod_Alt, ImGuiKeyModFlags_Super = ImGuiMod_Super }; +#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // OBSOLETED IN 1.90 (now using C++11 standard version) + #endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // RENAMED IMGUI_DISABLE_METRICS_WINDOW > IMGUI_DISABLE_DEBUG_TOOLS in 1.88 (from June 2022) @@ -3140,9 +3373,14 @@ enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl #pragma warning (pop) #endif -// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) +// Include imgui_user.h at the end of imgui.h +// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included. #ifdef IMGUI_INCLUDE_IMGUI_USER_H +#ifdef IMGUI_USER_H_FILENAME +#include IMGUI_USER_H_FILENAME +#else #include "imgui_user.h" #endif +#endif #endif // #ifndef IMGUI_DISABLE diff --git a/core/deps/imgui/imgui_demo.cpp b/core/deps/imgui/imgui_demo.cpp index fd0adc9eb..febb58058 100644 --- a/core/deps/imgui/imgui_demo.cpp +++ b/core/deps/imgui/imgui_demo.cpp @@ -1,16 +1,23 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (demo code) // Help: // - Read FAQ at http://dearimgui.com/faq -// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. // - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. -// Read imgui.cpp for more details, documentation and comments. +// - Need help integrating Dear ImGui in your codebase? +// - Read Getting Started https://github.com/ocornut/imgui/wiki/Getting-Started +// - Read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// Read top of imgui.cpp and imgui.h for many details, documentation, comments, links. // Get the latest version at https://github.com/ocornut/imgui -// ------------------------------------------------- +// How to easily locate code? +// - Use the Item Picker to debug break in code by clicking any widgets: https://github.com/ocornut/imgui/wiki/Debug-Tools +// - Browse an online version the demo with code linked to hovered widgets: https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html +// - Find a visible string and search for it in the code! + +//--------------------------------------------------- // PLEASE DO NOT REMOVE THIS FILE FROM YOUR PROJECT! -// ------------------------------------------------- +//--------------------------------------------------- // Message to the person tempted to delete this file when integrating Dear ImGui into their codebase: // Think again! It is the most useful reference code that you and other coders will want to refer to and call. // Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of your game/app! @@ -24,14 +31,23 @@ // Thank you, // -Your beloved friend, imgui_demo.cpp (which you won't delete) -// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: -// In this demo code, we frequently use 'static' variables inside functions. A static variable persists across calls, -// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to -// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller -// in size. It also happens to be a convenient way of storing simple UI related information as long as your function -// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code, -// but most of the real data you would be editing is likely going to be stored outside your functions. - +//-------------------------------------------- +// ABOUT THE MEANING OF THE 'static' KEYWORD: +//-------------------------------------------- +// In this demo code, we frequently use 'static' variables inside functions. +// A static variable persists across calls. It is essentially a global variable but declared inside the scope of the function. +// Think of "static int n = 0;" as "global int n = 0;" ! +// We do this IN THE DEMO because we want: +// - to gather code and data in the same place. +// - to make the demo source code faster to read, faster to change, smaller in size. +// - it is also a convenient way of storing simple UI related information as long as your function +// doesn't need to be reentrant or used in multiple threads. +// This might be a pattern you will want to use in your code, but most of the data you would be working +// with in a complex codebase is likely going to be stored outside your functions. + +//----------------------------------------- +// ABOUT THE CODING STYLE OF OUR DEMO CODE +//----------------------------------------- // The Demo code in this file is designed to be easy to copy-and-paste into your application! // Because of this: // - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace. @@ -43,8 +59,9 @@ // Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp. // Navigating this file: -// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. /* @@ -91,10 +108,9 @@ Index of this file: #include // sqrtf, powf, cosf, sinf, floorf, ceilf #include // vsnprintf, sscanf, printf #include // NULL, malloc, free, atoi -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t +#if !defined(_MSC_VER) || _MSC_VER >= 1800 +#include // PRId64/PRIu64, not avail in some MinGW headers. #endif // Visual Studio warnings @@ -120,6 +136,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. #pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size @@ -144,14 +161,13 @@ Index of this file: #define vsnprintf _vsnprintf #endif -// Format specifiers, printing 64-bit hasn't been decently standardized... -// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. -#ifdef _MSC_VER -#define IM_PRId64 "I64d" -#define IM_PRIu64 "I64u" -#else -#define IM_PRId64 "lld" -#define IM_PRIu64 "llu" +// Format specifiers for 64-bit values (hasn't been decently standardized before VS2013) +#if !defined(PRId64) && defined(_MSC_VER) +#define PRId64 "I64d" +#define PRIu64 "I64u" +#elif !defined(PRId64) +#define PRId64 "lld" +#define PRIu64 "llu" #endif // Helpers macros @@ -162,7 +178,8 @@ Index of this file: #define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) #define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V)) -// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +// Enforce cdecl calling convention for functions called by the standard library, +// in case compilation settings changed the default to e.g. __vectorcall #ifndef IMGUI_CDECL #ifdef _MSC_VER #define IMGUI_CDECL __cdecl @@ -178,19 +195,19 @@ Index of this file: #if !defined(IMGUI_DISABLE_DEMO_WINDOWS) // Forward Declarations -static void ShowExampleAppDocuments(bool* p_open); static void ShowExampleAppMainMenuBar(); static void ShowExampleAppConsole(bool* p_open); +static void ShowExampleAppCustomRendering(bool* p_open); +static void ShowExampleAppDocuments(bool* p_open); static void ShowExampleAppLog(bool* p_open); static void ShowExampleAppLayout(bool* p_open); static void ShowExampleAppPropertyEditor(bool* p_open); -static void ShowExampleAppLongText(bool* p_open); +static void ShowExampleAppSimpleOverlay(bool* p_open); static void ShowExampleAppAutoResize(bool* p_open); static void ShowExampleAppConstrainedResize(bool* p_open); -static void ShowExampleAppSimpleOverlay(bool* p_open); static void ShowExampleAppFullscreen(bool* p_open); +static void ShowExampleAppLongText(bool* p_open); static void ShowExampleAppWindowTitles(bool* p_open); -static void ShowExampleAppCustomRendering(bool* p_open); static void ShowExampleMenuFile(); // We split the contents of the big ShowDemoWindow() function into smaller functions @@ -211,7 +228,7 @@ static void ShowDemoWindowInputs(); static void HelpMarker(const char* desc) { ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) + if (ImGui::BeginItemTooltip()) { ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); ImGui::TextUnformatted(desc); @@ -246,59 +263,62 @@ void* GImGuiDemoMarkerCallbackUserData = NULL; void ImGui::ShowDemoWindow(bool* p_open) { // Exceptionally add an extra assert here for people confused about initial Dear ImGui setup - // Most functions would normally just crash if the context is missing. - IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); + // Most functions would normally just assert/crash if the context is missing. + IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing Dear ImGui context. Refer to examples app!"); + + // Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues. + IMGUI_CHECKVERSION(); // Examples Apps (accessible from the "Examples" menu) static bool show_app_main_menu_bar = false; - static bool show_app_documents = false; static bool show_app_console = false; + static bool show_app_custom_rendering = false; + static bool show_app_documents = false; static bool show_app_log = false; static bool show_app_layout = false; static bool show_app_property_editor = false; - static bool show_app_long_text = false; + static bool show_app_simple_overlay = false; static bool show_app_auto_resize = false; static bool show_app_constrained_resize = false; - static bool show_app_simple_overlay = false; static bool show_app_fullscreen = false; + static bool show_app_long_text = false; static bool show_app_window_titles = false; - static bool show_app_custom_rendering = false; if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); if (show_app_console) ShowExampleAppConsole(&show_app_console); + if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); if (show_app_log) ShowExampleAppLog(&show_app_log); if (show_app_layout) ShowExampleAppLayout(&show_app_layout); if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); - if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); + if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); - if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen); + if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); - if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); - // Dear ImGui Tools/Apps (accessible from the "Tools" menu) - static bool show_app_metrics = false; - static bool show_app_debug_log = false; - static bool show_app_stack_tool = false; - static bool show_app_about = false; - static bool show_app_style_editor = false; - - if (show_app_metrics) - ImGui::ShowMetricsWindow(&show_app_metrics); - if (show_app_debug_log) - ImGui::ShowDebugLogWindow(&show_app_debug_log); - if (show_app_stack_tool) - ImGui::ShowStackToolWindow(&show_app_stack_tool); - if (show_app_about) - ImGui::ShowAboutWindow(&show_app_about); - if (show_app_style_editor) - { - ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor); + // Dear ImGui Tools (accessible from the "Tools" menu) + static bool show_tool_metrics = false; + static bool show_tool_debug_log = false; + static bool show_tool_id_stack_tool = false; + static bool show_tool_style_editor = false; + static bool show_tool_about = false; + + if (show_tool_metrics) + ImGui::ShowMetricsWindow(&show_tool_metrics); + if (show_tool_debug_log) + ImGui::ShowDebugLogWindow(&show_tool_debug_log); + if (show_tool_id_stack_tool) + ImGui::ShowIDStackToolWindow(&show_tool_id_stack_tool); + if (show_tool_style_editor) + { + ImGui::Begin("Dear ImGui Style Editor", &show_tool_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); } + if (show_tool_about) + ImGui::ShowAboutWindow(&show_tool_about); // Demonstrate the various window flags. Typically you would just use the default! static bool no_titlebar = false; @@ -359,18 +379,23 @@ void ImGui::ShowDemoWindow(bool* p_open) { IMGUI_DEMO_MARKER("Menu/Examples"); ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); + + ImGui::SeparatorText("Mini apps"); ImGui::MenuItem("Console", NULL, &show_app_console); + ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); + ImGui::MenuItem("Documents", NULL, &show_app_documents); ImGui::MenuItem("Log", NULL, &show_app_log); - ImGui::MenuItem("Simple layout", NULL, &show_app_layout); ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); - ImGui::MenuItem("Long text display", NULL, &show_app_long_text); + ImGui::MenuItem("Simple layout", NULL, &show_app_layout); + ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); + + ImGui::SeparatorText("Concepts"); ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); - ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen); + ImGui::MenuItem("Long text display", NULL, &show_app_long_text); ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); - ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); - ImGui::MenuItem("Documents", NULL, &show_app_documents); + ImGui::EndMenu(); } //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar! @@ -382,11 +407,17 @@ void ImGui::ShowDemoWindow(bool* p_open) #else const bool has_debug_tools = false; #endif - ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics, has_debug_tools); - ImGui::MenuItem("Debug Log", NULL, &show_app_debug_log, has_debug_tools); - ImGui::MenuItem("Stack Tool", NULL, &show_app_stack_tool, has_debug_tools); - ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); - ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); + ImGui::MenuItem("Metrics/Debugger", NULL, &show_tool_metrics, has_debug_tools); + ImGui::MenuItem("Debug Log", NULL, &show_tool_debug_log, has_debug_tools); + ImGui::MenuItem("ID Stack Tool", NULL, &show_tool_id_stack_tool, has_debug_tools); + ImGui::MenuItem("Style Editor", NULL, &show_tool_style_editor); + bool is_debugger_present = ImGui::GetIO().ConfigDebugIsDebuggerPresent; + if (ImGui::MenuItem("Item Picker", NULL, false, has_debug_tools && is_debugger_present)) + ImGui::DebugStartItemPicker(); + if (!is_debugger_present) + ImGui::SetItemTooltip("Requires io.ConfigDebugIsDebuggerPresent=true to be set.\n\nWe otherwise disable the menu option to avoid casual users crashing the application.\n\nYou can however always access the Item Picker in Metrics->Tools."); + ImGui::Separator(); + ImGui::MenuItem("About Dear ImGui", NULL, &show_tool_about); ImGui::EndMenu(); } ImGui::EndMenuBar(); @@ -408,7 +439,7 @@ void ImGui::ShowDemoWindow(bool* p_open) ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); ImGui::BulletText("See comments in imgui.cpp."); ImGui::BulletText("See example applications in the examples/ folder."); - ImGui::BulletText("Read the FAQ at http://www.dearimgui.com/faq/"); + ImGui::BulletText("Read the FAQ at https://www.dearimgui.com/faq/"); ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); @@ -460,17 +491,22 @@ void ImGui::ShowDemoWindow(bool* p_open) ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); ImGui::Checkbox("io.ConfigMacOSXBehaviors", &io.ConfigMacOSXBehaviors); + ImGui::SameLine(); HelpMarker("Swap Cmd<>Ctrl keys, enable various MacOS style behaviors."); ImGui::Text("Also see Style->Rendering for rendering options."); ImGui::SeparatorText("Debug"); + ImGui::Checkbox("io.ConfigDebugIsDebuggerPresent", &io.ConfigDebugIsDebuggerPresent); + ImGui::SameLine(); HelpMarker("Enable various tools calling IM_DEBUG_BREAK().\n\nRequires a debugger being attached, otherwise IM_DEBUG_BREAK() options will appear to crash your application."); ImGui::BeginDisabled(); ImGui::Checkbox("io.ConfigDebugBeginReturnValueOnce", &io.ConfigDebugBeginReturnValueOnce); // . ImGui::EndDisabled(); - ImGui::SameLine(); HelpMarker("First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover"); + ImGui::SameLine(); HelpMarker("First calls to Begin()/BeginChild() will return false.\n\nTHIS OPTION IS DISABLED because it needs to be set at application boot-time to make sense. Showing the disabled option is a way to make this feature easier to discover."); ImGui::Checkbox("io.ConfigDebugBeginReturnValueLoop", &io.ConfigDebugBeginReturnValueLoop); ImGui::SameLine(); HelpMarker("Some calls to Begin()/BeginChild() will return false.\n\nWill cycle through window depths then repeat. Windows should be flickering while running."); ImGui::Checkbox("io.ConfigDebugIgnoreFocusLoss", &io.ConfigDebugIgnoreFocusLoss); ImGui::SameLine(); HelpMarker("Option to deactivate io.AddFocusEvent(false) handling. May facilitate interactions with a debugger when focus loss leads to clearing inputs data."); + ImGui::Checkbox("io.ConfigDebugIniSettings", &io.ConfigDebugIniSettings); + ImGui::SameLine(); HelpMarker("Option to save .ini data with extra comments (particularly helpful for Docking, but makes saving slower)."); ImGui::TreePop(); ImGui::Spacing(); @@ -624,37 +660,8 @@ static void ShowDemoWindowWidgets() ImGui::SameLine(); ImGui::Text("%d", counter); - { - // Tooltips - IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips"); - //ImGui::AlignTextToFramePadding(); - ImGui::Text("Tooltips:"); - - ImGui::SameLine(); - ImGui::SmallButton("Basic"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip"); - - ImGui::SameLine(); - ImGui::SmallButton("Fancy"); - if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) - { - ImGui::Text("I am a fancy tooltip"); - static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; - ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); - ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime())); - ImGui::EndTooltip(); - } - - ImGui::SameLine(); - ImGui::SmallButton("Delayed"); - if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal)) // With a delay - ImGui::SetTooltip("I am a tooltip with a delay."); - - ImGui::SameLine(); - HelpMarker( - "Tooltip are created by using the IsItemHovered() function over any kind of item."); - } + ImGui::Button("Tooltip"); + ImGui::SetItemTooltip("I am a tooltip"); ImGui::LabelText("label", "Value"); @@ -772,7 +779,8 @@ static void ShowDemoWindowWidgets() static int item_current = 0; ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); HelpMarker( - "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); + "Using the simplified one-liner Combo API here.\n" + "Refer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); } { @@ -783,9 +791,103 @@ static void ShowDemoWindowWidgets() static int item_current = 1; ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4); ImGui::SameLine(); HelpMarker( - "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); + "Using the simplified one-liner ListBox API here.\n" + "Refer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Tooltips"); + if (ImGui::TreeNode("Tooltips")) + { + // Tooltips are windows following the mouse. They do not take focus away. + ImGui::SeparatorText("General"); + + // Typical use cases: + // - Short-form (text only): SetItemTooltip("Hello"); + // - Short-form (any contents): if (BeginItemTooltip()) { Text("Hello"); EndTooltip(); } + + // - Full-form (text only): if (IsItemHovered(...)) { SetTooltip("Hello"); } + // - Full-form (any contents): if (IsItemHovered(...) && BeginTooltip()) { Text("Hello"); EndTooltip(); } + + HelpMarker( + "Tooltip are typically created by using a IsItemHovered() + SetTooltip() sequence.\n\n" + "We provide a helper SetItemTooltip() function to perform the two with standards flags."); + + ImVec2 sz = ImVec2(-FLT_MIN, 0.0f); + + ImGui::Button("Basic", sz); + ImGui::SetItemTooltip("I am a tooltip"); + + ImGui::Button("Fancy", sz); + if (ImGui::BeginItemTooltip()) + { + ImGui::Text("I am a fancy tooltip"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); + ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime())); + ImGui::EndTooltip(); } + ImGui::SeparatorText("Always On"); + + // Showcase NOT relying on a IsItemHovered() to emit a tooltip. + // Here the tooltip is always emitted when 'always_on == true'. + static int always_on = 0; + ImGui::RadioButton("Off", &always_on, 0); + ImGui::SameLine(); + ImGui::RadioButton("Always On (Simple)", &always_on, 1); + ImGui::SameLine(); + ImGui::RadioButton("Always On (Advanced)", &always_on, 2); + if (always_on == 1) + ImGui::SetTooltip("I am following you around."); + else if (always_on == 2 && ImGui::BeginTooltip()) + { + ImGui::ProgressBar(sinf((float)ImGui::GetTime()) * 0.5f + 0.5f, ImVec2(ImGui::GetFontSize() * 25, 0.0f)); + ImGui::EndTooltip(); + } + + ImGui::SeparatorText("Custom"); + + HelpMarker( + "Passing ImGuiHoveredFlags_ForTooltip to IsItemHovered() is the preferred way to standardize" + "tooltip activation details across your application. You may however decide to use custom" + "flags for a specific tooltip instance."); + + // The following examples are passed for documentation purpose but may not be useful to most users. + // Passing ImGuiHoveredFlags_ForTooltip to IsItemHovered() will pull ImGuiHoveredFlags flags values from + // 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav' depending on whether mouse or gamepad/keyboard is being used. + // With default settings, ImGuiHoveredFlags_ForTooltip is equivalent to ImGuiHoveredFlags_DelayShort + ImGuiHoveredFlags_Stationary. + ImGui::Button("Manual", sz); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + ImGui::SetTooltip("I am a manually emitted tooltip."); + + ImGui::Button("DelayNone", sz); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNone)) + ImGui::SetTooltip("I am a tooltip with no delay."); + + ImGui::Button("DelayShort", sz); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_NoSharedDelay)) + ImGui::SetTooltip("I am a tooltip with a short delay (%0.2f sec).", ImGui::GetStyle().HoverDelayShort); + + ImGui::Button("DelayLong", sz); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay)) + ImGui::SetTooltip("I am a tooltip with a long delay (%0.2f sec).", ImGui::GetStyle().HoverDelayNormal); + + ImGui::Button("Stationary", sz); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary)) + ImGui::SetTooltip("I am a tooltip requiring mouse to be stationary before activating."); + + // Using ImGuiHoveredFlags_ForTooltip will pull flags from 'style.HoverFlagsForTooltipMouse' or 'style.HoverFlagsForTooltipNav', + // which default value include the ImGuiHoveredFlags_AllowWhenDisabled flag. + // As a result, Set + ImGui::BeginDisabled(); + ImGui::Button("Disabled item", sz); + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip)) + ImGui::SetTooltip("I am a a tooltip for a disabled item."); + ImGui::TreePop(); } @@ -795,10 +897,10 @@ static void ShowDemoWindowWidgets() // if (once) // ImGui::Text("This will be displayed only once."); - IMGUI_DEMO_MARKER("Widgets/Trees"); - if (ImGui::TreeNode("Trees")) + IMGUI_DEMO_MARKER("Widgets/Tree Nodes"); + if (ImGui::TreeNode("Tree Nodes")) { - IMGUI_DEMO_MARKER("Widgets/Trees/Basic trees"); + IMGUI_DEMO_MARKER("Widgets/Tree Nodes/Basic trees"); if (ImGui::TreeNode("Basic trees")) { for (int i = 0; i < 5; i++) @@ -808,18 +910,23 @@ static void ShowDemoWindowWidgets() if (i == 0) ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) + // Here we use PushID() to generate a unique base ID, and then the "" used as TreeNode id won't conflict. + // An alternative to using 'PushID() + TreeNode("", ...)' to generate a unique ID is to use 'TreeNode((void*)(intptr_t)i, ...)', + // aka generate a dummy pointer-sized value to be hashed. The demo below uses that technique. Both are fine. + ImGui::PushID(i); + if (ImGui::TreeNode("", "Child %d", i)) { ImGui::Text("blah blah"); ImGui::SameLine(); if (ImGui::SmallButton("button")) {} ImGui::TreePop(); } + ImGui::PopID(); } ImGui::TreePop(); } - IMGUI_DEMO_MARKER("Widgets/Trees/Advanced, with Selectable nodes"); + IMGUI_DEMO_MARKER("Widgets/Tree Nodes/Advanced, with Selectable nodes"); if (ImGui::TreeNode("Advanced, with Selectable nodes")) { HelpMarker( @@ -832,6 +939,10 @@ static void ShowDemoWindowWidgets() ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node."); ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanTextWidth", &base_flags, ImGuiTreeNodeFlags_SpanTextWidth); ImGui::SameLine(); HelpMarker("Reduce hit area to the text label and a bit of margin."); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAllColumns", &base_flags, ImGuiTreeNodeFlags_SpanAllColumns); ImGui::SameLine(); HelpMarker("For use in Tables only."); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_AllowOverlap", &base_flags, ImGuiTreeNodeFlags_AllowOverlap); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_Framed", &base_flags, ImGuiTreeNodeFlags_Framed); ImGui::SameLine(); HelpMarker("Draw frame with background (e.g. for CollapsingHeader)"); ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop); ImGui::Text("Hello!"); @@ -864,6 +975,12 @@ static void ShowDemoWindowWidgets() ImGui::Text("This is a drag and drop source"); ImGui::EndDragDropSource(); } + if (i == 2) + { + // Item 2 has an additional inline button to help demonstrate SpanTextWidth. + ImGui::SameLine(); + if (ImGui::SmallButton("button")) {} + } if (node_open) { ImGui::BulletText("Blah blah\nBlah Blah"); @@ -1007,7 +1124,7 @@ static void ShowDemoWindowWidgets() "CJK text will only appear if the font was loaded with the appropriate CJK character ranges. " "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. " "Read docs/FONTS.md for details."); - ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. + ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis @@ -1051,10 +1168,10 @@ static void ShowDemoWindowWidgets() ImVec2 pos = ImGui::GetCursorScreenPos(); ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right - ImVec4 tint_col = use_text_color_for_tint ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + ImVec4 tint_col = use_text_color_for_tint ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint ImVec4 border_col = ImGui::GetStyleColorVec4(ImGuiCol_Border); ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); - if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) + if (ImGui::BeginItemTooltip()) { float region_sz = 32.0f; float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; @@ -1110,16 +1227,29 @@ static void ShowDemoWindowWidgets() ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft); ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton)) - flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both + flags &= ~ImGuiComboFlags_NoPreview; // Clear incompatible flags if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview)) - flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both + flags &= ~(ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_WidthFitPreview); // Clear incompatible flags + if (ImGui::CheckboxFlags("ImGuiComboFlags_WidthFitPreview", &flags, ImGuiComboFlags_WidthFitPreview)) + flags &= ~ImGuiComboFlags_NoPreview; + + // Override default popup height + if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightSmall", &flags, ImGuiComboFlags_HeightSmall)) + flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightSmall); + if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightRegular", &flags, ImGuiComboFlags_HeightRegular)) + flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightRegular); + if (ImGui::CheckboxFlags("ImGuiComboFlags_HeightLargest", &flags, ImGuiComboFlags_HeightLargest)) + flags &= ~(ImGuiComboFlags_HeightMask_ & ~ImGuiComboFlags_HeightLargest); // Using the generic BeginCombo() API, you have full control over how to display the combo contents. // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively // stored in the object itself, etc.) const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; static int item_current_idx = 0; // Here we store our selection data as an index. - const char* combo_preview_value = items[item_current_idx]; // Pass in the preview value visible before opening the combo (it could be anything) + + // Pass in the preview value visible before opening the combo (it could technically be different contents or not pulled from items[]) + const char* combo_preview_value = items[item_current_idx]; + if (ImGui::BeginCombo("combo 1", combo_preview_value, flags)) { for (int n = 0; n < IM_ARRAYSIZE(items); n++) @@ -1135,6 +1265,10 @@ static void ShowDemoWindowWidgets() ImGui::EndCombo(); } + ImGui::Spacing(); + ImGui::SeparatorText("One-liner variants"); + HelpMarker("Flags above don't apply to this section."); + // Simplified one-liner Combo() API, using values packed in a single constant string // This is a convenience for when the selection set is small and known at compile-time. static int item_current_2 = 0; @@ -1146,9 +1280,8 @@ static void ShowDemoWindowWidgets() ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); // Simplified one-liner Combo() using an accessor function - struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } }; static int item_current_4 = 0; - ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items)); + ImGui::Combo("combo 4 (function)", &item_current_4, [](void* data, int n) { return ((const char**)data)[n]; }, items, IM_ARRAYSIZE(items)); ImGui::TreePop(); } @@ -1156,6 +1289,11 @@ static void ShowDemoWindowWidgets() IMGUI_DEMO_MARKER("Widgets/List Boxes"); if (ImGui::TreeNode("List boxes")) { + // BeginListBox() is essentially a thin wrapper to using BeginChild()/EndChild() + // using the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label. + // You may be tempted to simply use BeginChild() directly. However note that BeginChild() requires EndChild() + // to always be called (inconsistent with BeginListBox()/EndListBox()). + // Using the generic BeginListBox() API, you have full control over how to display the combo contents. // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively // stored in the object itself, etc.) @@ -1175,6 +1313,7 @@ static void ShowDemoWindowWidgets() } ImGui::EndListBox(); } + ImGui::SameLine(); HelpMarker("Here we are sharing selection state between both boxes."); // Custom size: use all width, 5 items tall ImGui::Text("Full-width:"); @@ -1208,16 +1347,16 @@ static void ShowDemoWindowWidgets() IMGUI_DEMO_MARKER("Widgets/Selectables/Basic"); if (ImGui::TreeNode("Basic")) { - static bool selection[5] = { false, true, false, false, false }; + static bool selection[5] = { false, true, false, false }; ImGui::Selectable("1. I am selectable", &selection[0]); ImGui::Selectable("2. I am selectable", &selection[1]); - ImGui::Text("(I am not selectable)"); - ImGui::Selectable("4. I am selectable", &selection[3]); - if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) + ImGui::Selectable("3. I am selectable", &selection[2]); + if (ImGui::Selectable("4. I am double clickable", selection[3], ImGuiSelectableFlags_AllowDoubleClick)) if (ImGui::IsMouseDoubleClicked(0)) - selection[4] = !selection[4]; + selection[3] = !selection[3]; ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Selectables/Single Selection"); if (ImGui::TreeNode("Selection State: Single Selection")) { @@ -1249,17 +1388,18 @@ static void ShowDemoWindowWidgets() } ImGui::TreePop(); } - IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more text into the same line"); - if (ImGui::TreeNode("Rendering more text into the same line")) + IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more items on the same line"); + if (ImGui::TreeNode("Rendering more items on the same line")) { - // Using the Selectable() override that takes "bool* p_selected" parameter, - // this function toggle your bool value automatically. + // (1) Using SetNextItemAllowOverlap() + // (2) Using the Selectable() override that takes "bool* p_selected" parameter, the bool value is toggled automatically. static bool selected[3] = { false, false, false }; - ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); - ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); - ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(); ImGui::SmallButton("Link 1"); + ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(); ImGui::SmallButton("Link 2"); + ImGui::SetNextItemAllowOverlap(); ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(); ImGui::SmallButton("Link 3"); ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Selectables/In columns"); if (ImGui::TreeNode("In columns")) { @@ -1295,6 +1435,7 @@ static void ShowDemoWindowWidgets() } ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Selectables/Grid"); if (ImGui::TreeNode("Grid")) { @@ -1380,6 +1521,7 @@ static void ShowDemoWindowWidgets() HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include in here)"); ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput); + ImGui::SameLine(); HelpMarker("When _AllowTabInput is set, passing through the widget with Tabbing doesn't automatically activate it, in order to also cycling through subsequent widgets."); ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine); ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags); ImGui::TreePop(); @@ -1393,8 +1535,8 @@ static void ShowDemoWindowWidgets() // Modify character input by altering 'data->Eventchar' (ImGuiInputTextFlags_CallbackCharFilter callback) static int FilterCasingSwap(ImGuiInputTextCallbackData* data) { - if (data->EventChar >= 'a' && data->EventChar <= 'z') { data->EventChar = data->EventChar - 'A' - 'a'; } // Lowercase becomes uppercase - else if (data->EventChar >= 'A' && data->EventChar <= 'Z') { data->EventChar = data->EventChar + 'a' - 'A'; } // Uppercase becomes lowercase + if (data->EventChar >= 'a' && data->EventChar <= 'z') { data->EventChar -= 'a' - 'A'; } // Lowercase becomes uppercase + else if (data->EventChar >= 'A' && data->EventChar <= 'Z') { data->EventChar += 'a' - 'A'; } // Uppercase becomes lowercase return 0; } @@ -1428,6 +1570,7 @@ static void ShowDemoWindowWidgets() ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Text Input/Completion, History, Edit Callbacks"); if (ImGui::TreeNode("Completion, History, Edit Callbacks")) { struct Funcs @@ -1469,16 +1612,21 @@ static void ShowDemoWindowWidgets() }; static char buf1[64]; ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback); - ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + ImGui::SameLine(); HelpMarker( + "Here we append \"..\" each time Tab is pressed. " + "See 'Examples>Console' for a more meaningful demonstration of using this callback."); static char buf2[64]; ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback); - ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + ImGui::SameLine(); HelpMarker( + "Here we replace and select text each time Up/Down are pressed. " + "See 'Examples>Console' for a more meaningful demonstration of using this callback."); static char buf3[64]; static int edit_count = 0; ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count); - ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edit + count edits."); + ImGui::SameLine(); HelpMarker( + "Here we toggle the casing of the first character on every edit + count edits."); ImGui::SameLine(); ImGui::Text("(%d)", edit_count); ImGui::TreePop(); @@ -1527,6 +1675,18 @@ static void ShowDemoWindowWidgets() ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Text Input/Miscellaneous"); + if (ImGui::TreeNode("Miscellaneous")) + { + static char buf1[16]; + static ImGuiInputTextFlags flags = ImGuiInputTextFlags_EscapeClearsAll; + ImGui::CheckboxFlags("ImGuiInputTextFlags_EscapeClearsAll", &flags, ImGuiInputTextFlags_EscapeClearsAll); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); + ImGui::CheckboxFlags("ImGuiInputTextFlags_NoUndoRedo", &flags, ImGuiInputTextFlags_NoUndoRedo); + ImGui::InputText("Hello", buf1, IM_ARRAYSIZE(buf1), flags); + ImGui::TreePop(); + } + ImGui::TreePop(); } @@ -1641,8 +1801,9 @@ static void ShowDemoWindowWidgets() ImGui::EndPopup(); } - // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+") - // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end. + // Demo Trailing Tabs: click the "+" button to add a new tab. + // (In your app you may want to use a font icon instead of the "+") + // We submit it before the regular tabs, but thanks to the ImGuiTabItemFlags_Trailing flag it will always appear at the end. if (show_trailing_button) if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip)) active_tabs.push_back(next_tab_id++); // Add new tab @@ -1683,10 +1844,10 @@ static void ShowDemoWindowWidgets() ImGui::Checkbox("Animate", &animate); // Plot as lines and plot as histogram - IMGUI_DEMO_MARKER("Widgets/Plotting/PlotLines, PlotHistogram"); static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f)); + //ImGui::SameLine(); HelpMarker("Consider using ImPlot instead!"); // Fill an array of contiguous float values to plot // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float @@ -1736,15 +1897,17 @@ static void ShowDemoWindowWidgets() ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Progress Bars"); + if (ImGui::TreeNode("Progress Bars")) + { // Animate a simple progress bar - IMGUI_DEMO_MARKER("Widgets/Plotting/ProgressBar"); static float progress = 0.0f, progress_dir = 1.0f; - if (animate) - { - progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; - if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } - if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } - } + progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; + if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } + if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width, // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. @@ -1756,6 +1919,13 @@ static void ShowDemoWindowWidgets() char buf[32]; sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753); ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf); + + // Pass an animated negative value, e.g. -1.0f * (float)ImGui::GetTime() is the recommended value. + // Adjust the factor if you want to adjust the animation speed. + ImGui::ProgressBar(-1.0f * (float)ImGui::GetTime(), ImVec2(0.0f, 0.0f), "Searching.."); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Text("Indeterminate"); + ImGui::TreePop(); } @@ -1926,7 +2096,8 @@ static void ShowDemoWindowWidgets() if (ImGui::Button("Default: Float + HDR + Hue Wheel")) ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); - // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it) + // Always display a small version of both types of pickers + // (that's in order to make it more visible in the demo to people who are skimming quickly through it) ImGui::Text("Both types:"); float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f; ImGui::SetNextItemWidth(w); @@ -2079,12 +2250,12 @@ static void ShowDemoWindowWidgets() ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); - ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64); - ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64); - ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64); - ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms"); - ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms"); - ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" PRId64); + ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" PRId64); + ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" PRId64); + ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" PRIu64 " ms"); + ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" PRIu64 " ms"); + ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" PRIu64 " ms"); ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic); ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); @@ -2097,25 +2268,29 @@ static void ShowDemoWindowWidgets() ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u"); ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d"); ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u"); - ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64); - ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" PRId64); + ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" PRIu64 " ms"); IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs"); static bool inputs_step = true; + static ImGuiInputTextFlags flags = ImGuiInputTextFlags_None; ImGui::SeparatorText("Inputs"); ImGui::Checkbox("Show step buttons", &inputs_step); - ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); - ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); - ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); - ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X"); - ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); - ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X"); - ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); - ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); - ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); - ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ParseEmptyRefVal", &flags, ImGuiInputTextFlags_ParseEmptyRefVal); + ImGui::CheckboxFlags("ImGuiInputTextFlags_DisplayEmptyRefVal", &flags, ImGuiInputTextFlags_DisplayEmptyRefVal); + ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d", flags); + ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u", flags); + ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d", flags); + ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u", flags); + ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d", flags); + ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X", flags); + ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u", flags); + ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X", flags); + ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL, NULL, NULL, flags); + ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL, NULL, NULL, flags); + ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL, NULL, NULL, flags); + ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL, NULL, NULL, flags); ImGui::TreePop(); } @@ -2331,6 +2506,34 @@ static void ShowDemoWindowWidgets() ImGui::TreePop(); } + IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Tooltip at target location"); + if (ImGui::TreeNode("Tooltip at target location")) + { + for (int n = 0; n < 2; n++) + { + // Drop targets + ImGui::Button(n ? "drop here##1" : "drop here##0"); + if (ImGui::BeginDragDropTarget()) + { + ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip; + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags)) + { + IM_UNUSED(payload); + ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed); + ImGui::SetTooltip("Cannot drop here!"); + } + ImGui::EndDragDropTarget(); + } + + // Drop source + static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f }; + if (n == 0) + ImGui::ColorButton("drag me", col4); + + } + ImGui::TreePop(); + } + ImGui::TreePop(); } @@ -2375,8 +2578,10 @@ static void ShowDemoWindowWidgets() if (item_type == 15){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } bool hovered_delay_none = ImGui::IsItemHovered(); + bool hovered_delay_stationary = ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary); bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort); bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal); + bool hovered_delay_tooltip = ImGui::IsItemHovered(ImGuiHoveredFlags_ForTooltip); // = Normal + Stationary // Display the values of IsItemHovered() and other common item state functions. // Note that the ImGuiHoveredFlags_XXX flags can be combined. @@ -2388,7 +2593,8 @@ static void ShowDemoWindowWidgets() "IsItemHovered() = %d\n" "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" - "IsItemHovered(_AllowWhenOverlapped) = %d\n" + "IsItemHovered(_AllowWhenOverlappedByItem) = %d\n" + "IsItemHovered(_AllowWhenOverlappedByWindow) = %d\n" "IsItemHovered(_AllowWhenDisabled) = %d\n" "IsItemHovered(_RectOnly) = %d\n" "IsItemActive() = %d\n" @@ -2407,7 +2613,8 @@ static void ShowDemoWindowWidgets() ImGui::IsItemHovered(), ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), - ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByItem), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlappedByWindow), ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled), ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), ImGui::IsItemActive(), @@ -2423,7 +2630,13 @@ static void ShowDemoWindowWidgets() ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y ); ImGui::BulletText( - "w/ Hovering Delay: None = %d, Fast %d, Normal = %d", hovered_delay_none, hovered_delay_short, hovered_delay_normal); + "with Hovering Delay or Stationary test:\n" + "IsItemHovered() = = %d\n" + "IsItemHovered(_Stationary) = %d\n" + "IsItemHovered(_DelayShort) = %d\n" + "IsItemHovered(_DelayNormal) = %d\n" + "IsItemHovered(_Tooltip) = %d", + hovered_delay_none, hovered_delay_stationary, hovered_delay_short, hovered_delay_normal, hovered_delay_tooltip); if (item_disabled) ImGui::EndDisabled(); @@ -2442,7 +2655,7 @@ static void ShowDemoWindowWidgets() static bool embed_all_inside_a_child_window = false; ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window); if (embed_all_inside_a_child_window) - ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true); + ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), ImGuiChildFlags_Border); // Testing IsWindowFocused() function with its various flags. ImGui::BulletText( @@ -2475,7 +2688,8 @@ static void ShowDemoWindowWidgets() "IsWindowHovered(_RootWindow) = %d\n" "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n" "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" - "IsWindowHovered(_AnyWindow) = %d\n", + "IsWindowHovered(_AnyWindow) = %d\n" + "IsWindowHovered(_Stationary) = %d\n", ImGui::IsWindowHovered(), ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), @@ -2486,9 +2700,10 @@ static void ShowDemoWindowWidgets() ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), - ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); + ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_Stationary)); - ImGui::BeginChild("child", ImVec2(0, 50), true); + ImGui::BeginChild("child", ImVec2(0, 50), ImGuiChildFlags_Border); ImGui::Text("This is another child window for testing the _ChildWindows flag."); ImGui::EndChild(); if (embed_all_inside_a_child_window) @@ -2572,7 +2787,7 @@ static void ShowDemoWindowLayout() ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; if (disable_mouse_wheel) window_flags |= ImGuiWindowFlags_NoScrollWithMouse; - ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), false, window_flags); + ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), ImGuiChildFlags_None, window_flags); for (int i = 0; i < 100; i++) ImGui::Text("%04d: scrollable region", i); ImGui::EndChild(); @@ -2588,7 +2803,7 @@ static void ShowDemoWindowLayout() if (!disable_menu) window_flags |= ImGuiWindowFlags_MenuBar; ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); - ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags); + ImGui::BeginChild("ChildR", ImVec2(0, 260), ImGuiChildFlags_Border, window_flags); if (!disable_menu && ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("Menu")) @@ -2613,6 +2828,35 @@ static void ShowDemoWindowLayout() ImGui::PopStyleVar(); } + // Child 3: manual-resize + ImGui::SeparatorText("Manual-resize"); + { + HelpMarker("Drag bottom border to resize. Double-click bottom border to auto-fit to vertical contents."); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_FrameBg)); + if (ImGui::BeginChild("ResizableChild", ImVec2(-FLT_MIN, ImGui::GetTextLineHeightWithSpacing() * 8), ImGuiChildFlags_Border | ImGuiChildFlags_ResizeY)) + for (int n = 0; n < 10; n++) + ImGui::Text("Line %04d", n); + ImGui::PopStyleColor(); + ImGui::EndChild(); + } + + // Child 4: auto-resizing height with a limit + ImGui::SeparatorText("Auto-resize with constraints"); + { + static int draw_lines = 3; + static int max_height_in_lines = 10; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("Lines Count", &draw_lines, 0.2f); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("Max Height (in Lines)", &max_height_in_lines, 0.2f); + + ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 1), ImVec2(FLT_MAX, ImGui::GetTextLineHeightWithSpacing() * max_height_in_lines)); + if (ImGui::BeginChild("ConstrainedChild", ImVec2(-FLT_MIN, 0.0f), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY)) + for (int n = 0; n < draw_lines; n++) + ImGui::Text("Line %04d", n); + ImGui::EndChild(); + } + ImGui::SeparatorText("Misc/Advanced"); // Demonstrate a few extra things @@ -2624,19 +2868,33 @@ static void ShowDemoWindowLayout() // the POV of the parent window). See 'Demo->Querying Status (Edited/Active/Hovered etc.)' for details. { static int offset_x = 0; + static bool override_bg_color = true; + static ImGuiChildFlags child_flags = ImGuiChildFlags_Border | ImGuiChildFlags_ResizeX | ImGuiChildFlags_ResizeY; ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000); + ImGui::Checkbox("Override ChildBg color", &override_bg_color); + ImGui::CheckboxFlags("ImGuiChildFlags_Border", &child_flags, ImGuiChildFlags_Border); + ImGui::CheckboxFlags("ImGuiChildFlags_AlwaysUseWindowPadding", &child_flags, ImGuiChildFlags_AlwaysUseWindowPadding); + ImGui::CheckboxFlags("ImGuiChildFlags_ResizeX", &child_flags, ImGuiChildFlags_ResizeX); + ImGui::CheckboxFlags("ImGuiChildFlags_ResizeY", &child_flags, ImGuiChildFlags_ResizeY); + ImGui::CheckboxFlags("ImGuiChildFlags_FrameStyle", &child_flags, ImGuiChildFlags_FrameStyle); + ImGui::SameLine(); HelpMarker("Style the child window like a framed item: use FrameBg, FrameRounding, FrameBorderSize, FramePadding instead of ChildBg, ChildRounding, ChildBorderSize, WindowPadding."); + if (child_flags & ImGuiChildFlags_FrameStyle) + override_bg_color = false; ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x); - ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); - ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None); + if (override_bg_color) + ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); + ImGui::BeginChild("Red", ImVec2(200, 100), child_flags, ImGuiWindowFlags_None); + if (override_bg_color) + ImGui::PopStyleColor(); + for (int n = 0; n < 50; n++) ImGui::Text("Some test %d", n); ImGui::EndChild(); bool child_is_hovered = ImGui::IsItemHovered(); ImVec2 child_rect_min = ImGui::GetItemRectMin(); ImVec2 child_rect_max = ImGui::GetItemRectMax(); - ImGui::PopStyleColor(); ImGui::Text("Hovered: %d", child_is_hovered); ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); } @@ -2729,11 +2987,11 @@ static void ShowDemoWindowLayout() // Text IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine"); ImGui::Text("Two items: Hello"); ImGui::SameLine(); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Sailor"); // Adjust spacing ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); - ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Sailor"); // Button ImGui::AlignTextToFramePadding(); @@ -2784,7 +3042,7 @@ static void ShowDemoWindowLayout() ImGui::PushID(i); ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); ImGui::PopID(); - //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); + //ImGui::SetItemTooltip("ListBox %d hovered", i); } ImGui::PopItemWidth(); @@ -2837,8 +3095,7 @@ static void ShowDemoWindowLayout() ImGui::SameLine(); ImGui::Button("EEE"); ImGui::EndGroup(); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("First group hovered"); + ImGui::SetItemTooltip("First group hovered"); } // Capture the group size and create widgets using the same size ImVec2 size = ImGui::GetItemRectSize(); @@ -3026,7 +3283,7 @@ static void ShowDemoWindowLayout() const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0; const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); - const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags); + const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), ImGuiChildFlags_Border, child_flags); if (ImGui::BeginMenuBar()) { ImGui::TextUnformatted("abc"); @@ -3073,7 +3330,7 @@ static void ShowDemoWindowLayout() float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f; ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0); ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); - bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags); + bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), ImGuiChildFlags_Border, child_flags); if (scroll_to_off) ImGui::SetScrollX(scroll_to_off_px); if (scroll_to_pos) @@ -3115,7 +3372,7 @@ static void ShowDemoWindowLayout() ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30); - ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::BeginChild("scrolling", scrolling_child_size, ImGuiChildFlags_Border, ImGuiWindowFlags_HorizontalScrollbar); for (int line = 0; line < lines; line++) { // Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine() @@ -3184,7 +3441,9 @@ static void ShowDemoWindowLayout() IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal contents size demo window"); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); - HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); + HelpMarker( + "Test how different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\n" + "Use 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); ImGui::Checkbox("H-scrollbar", &show_h_scrollbar); ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten) ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width @@ -3259,7 +3518,7 @@ static void ShowDemoWindowLayout() } if (show_child) { - ImGui::BeginChild("child", ImVec2(0, 0), true); + ImGui::BeginChild("child", ImVec2(0, 0), ImGuiChildFlags_Border); ImGui::EndChild(); } ImGui::End(); @@ -3332,6 +3591,37 @@ static void ShowDemoWindowLayout() ImGui::TreePop(); } + + IMGUI_DEMO_MARKER("Layout/Overlap Mode"); + if (ImGui::TreeNode("Overlap Mode")) + { + static bool enable_allow_overlap = true; + + HelpMarker( + "Hit-testing is by default performed in item submission order, which generally is perceived as 'back-to-front'.\n\n" + "By using SetNextItemAllowOverlap() you can notify that an item may be overlapped by another. " + "Doing so alters the hovering logic: items using AllowOverlap mode requires an extra frame to accept hovered state."); + ImGui::Checkbox("Enable AllowOverlap", &enable_allow_overlap); + + ImVec2 button1_pos = ImGui::GetCursorScreenPos(); + ImVec2 button2_pos = ImVec2(button1_pos.x + 50.0f, button1_pos.y + 50.0f); + if (enable_allow_overlap) + ImGui::SetNextItemAllowOverlap(); + ImGui::Button("Button 1", ImVec2(80, 80)); + ImGui::SetCursorScreenPos(button2_pos); + ImGui::Button("Button 2", ImVec2(80, 80)); + + // This is typically used with width-spanning items. + // (note that Selectable() has a dedicated flag ImGuiSelectableFlags_AllowOverlap, which is a shortcut + // for using SetNextItemAllowOverlap(). For demo purpose we use SetNextItemAllowOverlap() here.) + if (enable_allow_overlap) + ImGui::SetNextItemAllowOverlap(); + ImGui::Selectable("Some Selectable", false); + ImGui::SameLine(); + ImGui::SmallButton("++"); + + ImGui::TreePop(); + } } static void ShowDemoWindowPopups() @@ -3399,8 +3689,7 @@ static void ShowDemoWindowPopups() ImGui::Separator(); ImGui::Text("Tooltip here"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("I am a tooltip over a popup"); + ImGui::SetItemTooltip("I am a tooltip over a popup"); if (ImGui::Button("Stacked Popup")) ImGui::OpenPopup("another popup"); @@ -3484,8 +3773,7 @@ static void ShowDemoWindowPopups() ImGui::CloseCurrentPopup(); ImGui::EndPopup(); } - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("Right-click to open popup"); + ImGui::SetItemTooltip("Right-click to open popup"); } } @@ -3591,7 +3879,7 @@ static void ShowDemoWindowPopups() static int item = 1; static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); - ImGui::ColorEdit4("color", color); + ImGui::ColorEdit4("Color", color); if (ImGui::Button("Add another modal..")) ImGui::OpenPopup("Stacked 2"); @@ -3603,6 +3891,7 @@ static void ShowDemoWindowPopups() if (ImGui::BeginPopupModal("Stacked 2", &unused_open)) { ImGui::Text("Hello from Stacked The Second!"); + ImGui::ColorEdit4("Color", color); // Allow opening another nested popup if (ImGui::Button("Close")) ImGui::CloseCurrentPopup(); ImGui::EndPopup(); @@ -3665,6 +3954,14 @@ struct MyItem // very often by the sorting algorithm it would be a little wasteful. static const ImGuiTableSortSpecs* s_current_sort_specs; + static void SortWithSortSpecs(ImGuiTableSortSpecs* sort_specs, MyItem* items, int items_count) + { + s_current_sort_specs = sort_specs; // Store in variable accessible by the sort function. + if (items_count > 1) + qsort(items, (size_t)items_count, sizeof(items[0]), MyItem::CompareWithSortSpecs); + s_current_sort_specs = NULL; + } + // Compare function to be used by qsort() static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs) { @@ -3691,7 +3988,8 @@ struct MyItem } // qsort() is instable so always return a way to differenciate items. - // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs. + // Your own compare function may want to avoid fallback on implicit sort specs. + // e.g. a Name compare if it wasn't already part of the sort specs. return (a->ID - b->ID); } }; @@ -3737,7 +4035,7 @@ static void EditTableSizingFlags(ImGuiTableFlags* p_flags) } ImGui::SameLine(); ImGui::TextDisabled("(?)"); - if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) + if (ImGui::BeginItemTooltip()) { ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); for (int m = 0; m < IM_ARRAYSIZE(policies); m++) @@ -3775,6 +4073,7 @@ static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags) ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending); ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0"); ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0"); + ImGui::CheckboxFlags("_AngledHeader", p_flags, ImGuiTableColumnFlags_AngledHeader); } static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags) @@ -3799,10 +4098,10 @@ static void ShowDemoWindowTables() ImGui::PushID("Tables"); int open_action = -1; - if (ImGui::Button("Open all")) + if (ImGui::Button("Expand all")) open_action = 1; ImGui::SameLine(); - if (ImGui::Button("Close all")) + if (ImGui::Button("Collapse all")) open_action = 0; ImGui::SameLine(); @@ -3873,8 +4172,9 @@ static void ShowDemoWindowTables() // as TableNextColumn() will automatically wrap around and create new rows as needed. // This is generally more convenient when your cells all contains the same type of data. HelpMarker( - "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains the same type of contents.\n" - "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition."); + "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains " + "the same type of contents.\n This is also more similar to the old NextColumn() function of the " + "Columns API, and provided to facilitate the Columns->Tables API transition."); if (ImGui::BeginTable("table3", 3)) { for (int item = 0; item < 14; item++) @@ -3930,8 +4230,8 @@ static void ShowDemoWindowTables() if (ImGui::BeginTable("table1", 3, flags)) { - // Display headers so we can inspect their interaction with borders. - // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details) + // Display headers so we can inspect their interaction with borders + // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them now. See other sections for details) if (display_headers) { ImGui::TableSetupColumn("One"); @@ -3970,7 +4270,9 @@ static void ShowDemoWindowTables() PushStyleCompact(); ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); - ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this."); + ImGui::SameLine(); HelpMarker( + "Using the _Resizable flag automatically enables the _BordersInnerV flag as well, " + "this is why the resize borders are still showing when unchecking this."); PopStyleCompact(); if (ImGui::BeginTable("table1", 3, flags)) @@ -4088,6 +4390,7 @@ static void ShowDemoWindowTables() ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)"); + ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn); PopStyleCompact(); if (ImGui::BeginTable("table1", 3, flags)) @@ -4110,7 +4413,8 @@ static void ShowDemoWindowTables() ImGui::EndTable(); } - // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column) + // Use outer_size.x == 0.0f instead of default to make the table as tight as possible + // (only valid when no scrolling and no stretch column) if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f))) { ImGui::TableSetupColumn("One"); @@ -4143,7 +4447,8 @@ static void ShowDemoWindowTables() "e.g.:\n" "- BorderOuterV\n" "- any form of row selection\n" - "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n" + "Because of this, activating BorderOuterV sets the default to PadOuterX. " + "Using PadOuterX or NoPadOuterX you can override the default.\n\n" "Actual padding values are using style.CellPadding.\n\n" "In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding."); @@ -4259,7 +4564,8 @@ static void ShowDemoWindowTables() EditTableSizingFlags(&sizing_policy_flags[table_n]); // To make it easier to understand the different sizing policy, - // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width. + // For each policy: we display one table where the columns have equal contents width, + // and one where the columns have different contents width. if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1)) { for (int row = 0; row < 3; row++) @@ -4288,7 +4594,9 @@ static void ShowDemoWindowTables() ImGui::Spacing(); ImGui::TextUnformatted("Advanced"); ImGui::SameLine(); - HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns."); + HelpMarker( + "This section allows you to interact and see the effect of various sizing policies " + "depending on whether Scroll is enabled and the contents of your columns."); enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText }; static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable; @@ -4303,7 +4611,9 @@ static void ShowDemoWindowTables() if (contents_type == CT_FillButton) { ImGui::SameLine(); - HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width."); + HelpMarker( + "Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop " + "where contents width can feed into auto-column width can feed into contents width."); } ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp); ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); @@ -4349,7 +4659,9 @@ static void ShowDemoWindowTables() IMGUI_DEMO_MARKER("Tables/Vertical scrolling, with clipping"); if (ImGui::TreeNode("Vertical scrolling, with clipping")) { - HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items."); + HelpMarker( + "Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\n" + "We also demonstrate using ImGuiListClipper to virtualize the submission of many items."); static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; PushStyleCompact(); @@ -4395,8 +4707,9 @@ static void ShowDemoWindowTables() HelpMarker( "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, " "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n" - "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX," - "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions)."); + "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX, " + "because the container window won't automatically extend vertically to fix contents " + "(this may be improved in future versions)."); static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; static int freeze_cols = 1; static int freeze_rows = 1; @@ -4453,7 +4766,8 @@ static void ShowDemoWindowTables() HelpMarker( "Showcase using Stretch columns + ScrollX together: " "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n" - "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense."); + "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns " + "along with ScrollX doesn't make sense."); static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; static float inner_width = 1000.0f; PushStyleCompact(); @@ -4511,8 +4825,9 @@ static void ShowDemoWindowTables() } // Create the real table we care about for the example! - // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in - // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down) + // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, + // otherwise in a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + // + resizing the parent window down). const ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV @@ -4520,15 +4835,22 @@ static void ShowDemoWindowTables() ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9); if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size)) { + bool has_angled_header = false; for (int column = 0; column < column_count; column++) + { + has_angled_header |= (column_flags[column] & ImGuiTableColumnFlags_AngledHeader) != 0; ImGui::TableSetupColumn(column_names[column], column_flags[column]); + } + if (has_angled_header) + ImGui::TableAngledHeadersRow(); ImGui::TableHeadersRow(); for (int column = 0; column < column_count; column++) column_flags_out[column] = ImGui::TableGetColumnFlags(column); float indent_step = (float)((int)TEXT_BASE_WIDTH / 2); for (int row = 0; row < 8; row++) { - ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. + // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. + ImGui::Indent(indent_step); ImGui::TableNextRow(); for (int column = 0; column < column_count; column++) { @@ -4577,7 +4899,9 @@ static void ShowDemoWindowTables() ImGui::EndTable(); } - HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host."); + HelpMarker( + "Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, " + "fixed columns with set width may still be shrunk down if there's not enough space in the host."); static ImGuiTableFlags flags2 = ImGuiTableFlags_None; PushStyleCompact(); @@ -4587,7 +4911,8 @@ static void ShowDemoWindowTables() PopStyleCompact(); if (ImGui::BeginTable("table2", 4, flags2)) { - // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + // We could also set ImGuiTableFlags_SizingFixedFit on the table and then all columns + // will default to ImGuiTableColumnFlags_WidthFixed. ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f); @@ -4659,10 +4984,13 @@ static void ShowDemoWindowTables() IMGUI_DEMO_MARKER("Tables/Row height"); if (ImGui::TreeNode("Row height")) { - HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row."); - if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV)) + HelpMarker( + "You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, " + "so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\n" + "We cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row."); + if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_Borders)) { - for (int row = 0; row < 10; row++) + for (int row = 0; row < 8; row++) { float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row); ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height); @@ -4671,6 +4999,48 @@ static void ShowDemoWindowTables() } ImGui::EndTable(); } + + HelpMarker( + "Showcase using SameLine(0,0) to share Current Line Height between cells.\n\n" + "Please note that Tables Row Height is not the same thing as Current Line Height, " + "as a table cell may contains multiple lines."); + if (ImGui::BeginTable("table_share_lineheight", 2, ImGuiTableFlags_Borders)) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::ColorButton("##1", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40)); + ImGui::TableNextColumn(); + ImGui::Text("Line 1"); + ImGui::Text("Line 2"); + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::ColorButton("##2", ImVec4(0.13f, 0.26f, 0.40f, 1.0f), ImGuiColorEditFlags_None, ImVec2(40, 40)); + ImGui::TableNextColumn(); + ImGui::SameLine(0.0f, 0.0f); // Reuse line height from previous column + ImGui::Text("Line 1, with SameLine(0,0)"); + ImGui::Text("Line 2"); + + ImGui::EndTable(); + } + + HelpMarker("Showcase altering CellPadding.y between rows. Note that CellPadding.x is locked for the entire table."); + if (ImGui::BeginTable("table_changing_cellpadding_y", 1, ImGuiTableFlags_Borders)) + { + ImGuiStyle& style = ImGui::GetStyle(); + for (int row = 0; row < 8; row++) + { + if ((row % 3) == 2) + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(style.CellPadding.x, 20.0f)); + ImGui::TableNextRow(ImGuiTableRowFlags_None); + ImGui::TableNextColumn(); + ImGui::Text("CellPadding.y = %.2f", style.CellPadding.y); + if ((row % 3) == 2) + ImGui::PopStyleVar(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); } @@ -4806,6 +5176,12 @@ static void ShowDemoWindowTables() { static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; + static ImGuiTreeNodeFlags tree_node_flags = ImGuiTreeNodeFlags_SpanAllColumns; + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &tree_node_flags, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanTextWidth", &tree_node_flags, ImGuiTreeNodeFlags_SpanTextWidth); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAllColumns", &tree_node_flags, ImGuiTreeNodeFlags_SpanAllColumns); + + HelpMarker("See \"Columns flags\" section to configure how indentation is applied to individual columns."); if (ImGui::BeginTable("3ways", 3, flags)) { // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On @@ -4829,7 +5205,7 @@ static void ShowDemoWindowTables() const bool is_folder = (node->ChildCount > 0); if (is_folder) { - bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth); + bool open = ImGui::TreeNodeEx(node->Name, tree_node_flags); ImGui::TableNextColumn(); ImGui::TextDisabled("--"); ImGui::TableNextColumn(); @@ -4843,7 +5219,7 @@ static void ShowDemoWindowTables() } else { - ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TreeNodeEx(node->Name, tree_node_flags | ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen); ImGui::TableNextColumn(); ImGui::Text("%d", node->Size); ImGui::TableNextColumn(); @@ -4878,7 +5254,8 @@ static void ShowDemoWindowTables() { HelpMarker( "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n" - "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense."); + "Note that on auto-resizing non-resizable fixed columns, querying the content width for " + "e.g. right-alignment doesn't make sense."); if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders)) { ImGui::TableSetupColumn("small"); @@ -4964,13 +5341,83 @@ static void ShowDemoWindowTables() ImGui::TreePop(); } - // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader() + // Demonstrate using ImGuiTableColumnFlags_AngledHeader flag to create angled headers + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Angled headers"); + if (ImGui::TreeNode("Angled headers")) + { + const char* column_names[] = { "Track", "cabasa", "ride", "smash", "tom-hi", "tom-mid", "tom-low", "hihat-o", "hihat-c", "snare-s", "snare-c", "clap", "rim", "kick" }; + const int columns_count = IM_ARRAYSIZE(column_names); + const int rows_count = 12; + + static ImGuiTableFlags table_flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_Hideable | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_HighlightHoveredColumn; + static ImGuiTableColumnFlags column_flags = ImGuiTableColumnFlags_AngledHeader | ImGuiTableColumnFlags_WidthFixed; + static bool bools[columns_count * rows_count] = {}; // Dummy storage selection storage + static int frozen_cols = 1; + static int frozen_rows = 2; + ImGui::CheckboxFlags("_ScrollX", &table_flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("_ScrollY", &table_flags, ImGuiTableFlags_ScrollY); + ImGui::CheckboxFlags("_Resizable", &table_flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("_NoBordersInBody", &table_flags, ImGuiTableFlags_NoBordersInBody); + ImGui::CheckboxFlags("_HighlightHoveredColumn", &table_flags, ImGuiTableFlags_HighlightHoveredColumn); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::SliderInt("Frozen columns", &frozen_cols, 0, 2); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::SliderInt("Frozen rows", &frozen_rows, 0, 2); + ImGui::CheckboxFlags("Disable header contributing to column width", &column_flags, ImGuiTableColumnFlags_NoHeaderWidth); + + if (ImGui::TreeNode("Style settings")) + { + ImGui::SameLine(); + HelpMarker("Giving access to some ImGuiStyle value in this demo for convenience."); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::SliderAngle("style.TableAngledHeadersAngle", &ImGui::GetStyle().TableAngledHeadersAngle, -50.0f, +50.0f); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::SliderFloat2("style.TableAngledHeadersTextAlign", (float*)&ImGui::GetStyle().TableAngledHeadersTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::TreePop(); + } + + if (ImGui::BeginTable("table_angled_headers", columns_count, table_flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 12))) + { + ImGui::TableSetupColumn(column_names[0], ImGuiTableColumnFlags_NoHide | ImGuiTableColumnFlags_NoReorder); + for (int n = 1; n < columns_count; n++) + ImGui::TableSetupColumn(column_names[n], column_flags); + ImGui::TableSetupScrollFreeze(frozen_cols, frozen_rows); + + ImGui::TableAngledHeadersRow(); // Draw angled headers for all columns with the ImGuiTableColumnFlags_AngledHeader flag. + ImGui::TableHeadersRow(); // Draw remaining headers and allow access to context-menu and other functions. + for (int row = 0; row < rows_count; row++) + { + ImGui::PushID(row); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Track %d", row); + for (int column = 1; column < columns_count; column++) + if (ImGui::TableSetColumnIndex(column)) + { + ImGui::PushID(column); + ImGui::Checkbox("", &bools[row * columns_count + column]); + ImGui::PopID(); + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate creating custom context menus inside columns, + // while playing it nice with context menus provided by TableHeadersRow()/TableHeader() if (open_action != -1) ImGui::SetNextItemOpen(open_action != 0); IMGUI_DEMO_MARKER("Tables/Context menus"); if (ImGui::TreeNode("Context menus")) { - HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); + HelpMarker( + "By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\n" + "Using ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody; PushStyleCompact(); @@ -5007,7 +5454,9 @@ static void ShowDemoWindowTables() // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. // [2.2] Right-click on the ".." to open a custom popup // [2.3] Right-click in columns to open another custom popup - HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body)."); + HelpMarker( + "Demonstrate mixing table context menu (over header), item context button (over button) " + "and custom per-colunm context menu (over column body)."); ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2)) { @@ -5080,8 +5529,10 @@ static void ShowDemoWindowTables() HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc."); static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings; + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit); + ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn); for (int n = 0; n < 3; n++) { char buf[32]; @@ -5162,14 +5613,11 @@ static void ShowDemoWindowTables() ImGui::TableHeadersRow(); // Sort our data if sort specs have been changed! - if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs()) - if (sorts_specs->SpecsDirty) + if (ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs()) + if (sort_specs->SpecsDirty) { - MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. - if (items.Size > 1) - qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); - MyItem::s_current_sort_specs = NULL; - sorts_specs->SpecsDirty = false; + MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size); + sort_specs->SpecsDirty = false; } // Demonstrate using clipper for large vertical lists @@ -5212,6 +5660,7 @@ static void ShowDemoWindowTables() | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit; + static ImGuiTableColumnFlags columns_base_flags = ImGuiTableColumnFlags_None; enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow }; static int contents_type = CT_SelectableSpanRow; @@ -5305,9 +5754,17 @@ static void ShowDemoWindowTables() ImGui::TreePop(); } - if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) + if (ImGui::TreeNodeEx("Headers:", ImGuiTreeNodeFlags_DefaultOpen)) { ImGui::Checkbox("show_headers", &show_headers); + ImGui::CheckboxFlags("ImGuiTableFlags_HighlightHoveredColumn", &flags, ImGuiTableFlags_HighlightHoveredColumn); + ImGui::CheckboxFlags("ImGuiTableColumnFlags_AngledHeader", &columns_base_flags, ImGuiTableColumnFlags_AngledHeader); + ImGui::SameLine(); HelpMarker("Enable AngledHeader on all columns. Best enabled on selected narrow columns (see \"Angled headers\" section of the demo)."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) + { ImGui::Checkbox("show_wrapped_text", &show_wrapped_text); ImGui::DragFloat2("##OuterSize", &outer_size_value.x); @@ -5368,24 +5825,22 @@ static void ShowDemoWindowTables() // Declare columns // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! - ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); - ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); - ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); - ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description); - ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); + ImGui::TableSetupColumn("ID", columns_base_flags | ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", columns_base_flags | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", columns_base_flags | ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", columns_base_flags | ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupColumn("Description", columns_base_flags | ((flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch), 0.0f, MyItemColumnID_Description); + ImGui::TableSetupColumn("Hidden", columns_base_flags | ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); // Sort our data if sort specs have been changed! - ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs(); - if (sorts_specs && sorts_specs->SpecsDirty) + ImGuiTableSortSpecs* sort_specs = ImGui::TableGetSortSpecs(); + if (sort_specs && sort_specs->SpecsDirty) items_need_sort = true; - if (sorts_specs && items_need_sort && items.Size > 1) + if (sort_specs && items_need_sort && items.Size > 1) { - MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. - qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); - MyItem::s_current_sort_specs = NULL; - sorts_specs->SpecsDirty = false; + MyItem::SortWithSortSpecs(sort_specs, items.Data, items.Size); + sort_specs->SpecsDirty = false; } items_need_sort = false; @@ -5394,6 +5849,8 @@ static void ShowDemoWindowTables() const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0; // Show headers + if (show_headers && (columns_base_flags & ImGuiTableColumnFlags_AngledHeader) != 0) + ImGui::TableAngledHeadersRow(); if (show_headers) ImGui::TableHeadersRow(); @@ -5435,7 +5892,7 @@ static void ShowDemoWindowTables() ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow) { - ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None; + ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap : ImGuiSelectableFlags_None; if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height))) { if (ImGui::GetIO().KeyCtrl) @@ -5459,7 +5916,7 @@ static void ShowDemoWindowTables() // Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity, // and we are currently sorting on the column showing the Quantity. // To avoid triggering a sort while holding the button, we only trigger it when the button has been released. - // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes. + // You will probably need some extra logic if you want to automatically sort when a specific entry changes. if (ImGui::TableSetColumnIndex(2)) { if (ImGui::SmallButton("Chop")) { item->Quantity += 1; } @@ -5661,7 +6118,7 @@ static void ShowDemoWindowColumns() { ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f); - ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::BeginChild("##ScrollingRegion", child_size, ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar); ImGui::Columns(10); // Also demonstrate using clipper for large vertical lists @@ -5732,12 +6189,14 @@ static void ShowDemoWindowInputs() // Display inputs submitted to ImGuiIO IMGUI_DEMO_MARKER("Inputs & Focus/Inputs"); ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode("Inputs")) + bool inputs_opened = ImGui::TreeNode("Inputs"); + ImGui::SameLine(); + HelpMarker( + "This is a simplified view. See more detailed input state:\n" + "- in 'Tools->Metrics/Debugger->Inputs'.\n" + "- in 'Tools->Debug Log->IO'."); + if (inputs_opened) { - HelpMarker( - "This is a simplified view. See more detailed input state:\n" - "- in 'Tools->Metrics/Debugger->Inputs'.\n" - "- in 'Tools->Debug Log->IO'."); if (ImGui::IsMousePosValid()) ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); else @@ -5747,13 +6206,15 @@ static void ShowDemoWindowInputs() for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); - // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends. - // User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END. + // We iterate both legacy native range and named ImGuiKey ranges. This is a little unusual/odd but this allows + // displaying the data for old/new backends. + // User code should never have to go through such hoops! + // You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END. #ifdef IMGUI_DISABLE_OBSOLETE_KEYIO struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN; #else - struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key >= 0 && key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array ImGuiKey start_key = (ImGuiKey)0; #endif ImGui::Text("Keys down:"); for (ImGuiKey key = start_key; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !ImGui::IsKeyDown(key)) continue; ImGui::SameLine(); ImGui::Text((key < ImGuiKey_NamedKey_BEGIN) ? "\"%s\"" : "\"%s\" %d", ImGui::GetKeyName(key), key); } @@ -5766,15 +6227,17 @@ static void ShowDemoWindowInputs() // Display ImGuiIO output flags IMGUI_DEMO_MARKER("Inputs & Focus/Outputs"); ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode("Outputs")) + bool outputs_opened = ImGui::TreeNode("Outputs"); + ImGui::SameLine(); + HelpMarker( + "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui " + "to instruct your application of how to route inputs. Typically, when a value is true, it means " + "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n" + "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, " + "and underlying application should ignore mouse inputs (in practice there are many and more subtle " + "rules leading to how those flags are set)."); + if (outputs_opened) { - HelpMarker( - "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui " - "to instruct your application of how to route inputs. Typically, when a value is true, it means " - "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n" - "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, " - "and underlying application should ignore mouse inputs (in practice there are many and more subtle " - "rules leading to how those flags are set)."); ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse); ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose); ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard); @@ -5787,7 +6250,8 @@ static void ShowDemoWindowInputs() { HelpMarker( "Hovering the colored canvas will override io.WantCaptureXXX fields.\n" - "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking."); + "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering " + "and true when clicking."); static int capture_override_mouse = -1; static int capture_override_keyboard = -1; const char* capture_override_desc[] = { "None", "Set to false", "Set to true" }; @@ -5807,6 +6271,102 @@ static void ShowDemoWindowInputs() ImGui::TreePop(); } + // Demonstrate using Shortcut() and Routing Policies. + // The general flow is: + // - Code interested in a chord (e.g. "Ctrl+A") declares their intent. + // - Multiple locations may be interested in same chord! Routing helps find a winner. + // - Every frame, we resolve all claims and assign one owner if the modifiers are matching. + // - The lower-level function is 'bool SetShortcutRouting()', returns true when caller got the route. + // - Most of the times, SetShortcutRouting() is not called directly. User mostly calls Shortcut() with routing flags. + // - If you call Shortcut() WITHOUT any routing option, it uses ImGuiInputFlags_RouteFocused. + // TL;DR: Most uses will simply be: + // - Shortcut(ImGuiMod_Ctrl | ImGuiKey_A); // Use ImGuiInputFlags_RouteFocused policy. + IMGUI_DEMO_MARKER("Inputs & Focus/Shortcuts"); + if (ImGui::TreeNode("Shortcuts")) + { + static ImGuiInputFlags route_options = ImGuiInputFlags_Repeat; + static ImGuiInputFlags route_type = ImGuiInputFlags_RouteFocused; + ImGui::CheckboxFlags("ImGuiInputFlags_Repeat", &route_options, ImGuiInputFlags_Repeat); + ImGui::RadioButton("ImGuiInputFlags_RouteActive", &route_type, ImGuiInputFlags_RouteActive); + ImGui::RadioButton("ImGuiInputFlags_RouteFocused (default)", &route_type, ImGuiInputFlags_RouteFocused); + ImGui::RadioButton("ImGuiInputFlags_RouteGlobal", &route_type, ImGuiInputFlags_RouteGlobal); + ImGui::Indent(); + ImGui::BeginDisabled(route_type != ImGuiInputFlags_RouteGlobal); + ImGui::CheckboxFlags("ImGuiInputFlags_RouteOverFocused", &route_options, ImGuiInputFlags_RouteOverFocused); + ImGui::CheckboxFlags("ImGuiInputFlags_RouteOverActive", &route_options, ImGuiInputFlags_RouteOverActive); + ImGui::CheckboxFlags("ImGuiInputFlags_RouteUnlessBgFocused", &route_options, ImGuiInputFlags_RouteUnlessBgFocused); + ImGui::EndDisabled(); + ImGui::Unindent(); + ImGui::RadioButton("ImGuiInputFlags_RouteAlways", &route_type, ImGuiInputFlags_RouteAlways); + ImGuiInputFlags flags = route_type | route_options; // Merged flags + if (route_type != ImGuiInputFlags_RouteGlobal) + flags &= ~(ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused); + + ImGui::SeparatorText("Using SetNextItemShortcut()"); + ImGui::Text("Ctrl+S"); + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, flags | ImGuiInputFlags_Tooltip); + ImGui::Button("Save"); + ImGui::Text("Alt+F"); + ImGui::SetNextItemShortcut(ImGuiMod_Alt | ImGuiKey_F, flags | ImGuiInputFlags_Tooltip); + static float f = 0.5f; + ImGui::SliderFloat("Factor", &f, 0.0f, 1.0f); + + ImGui::SeparatorText("Using Shortcut()"); + const float line_height = ImGui::GetTextLineHeightWithSpacing(); + const ImGuiKeyChord key_chord = ImGuiMod_Ctrl | ImGuiKey_A; + + ImGui::Text("Ctrl+A"); + ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "..."); + + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 0.0f, 1.0f, 0.1f)); + + ImGui::BeginChild("WindowA", ImVec2(-FLT_MIN, line_height * 14), true); + ImGui::Text("Press CTRL+A and see who receives it!"); + ImGui::Separator(); + + // 1: Window polling for CTRL+A + ImGui::Text("(in WindowA)"); + ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "..."); + + // 2: InputText also polling for CTRL+A: it always uses _RouteFocused internally (gets priority when active) + // (Commmented because the owner-aware version of Shortcut() is still in imgui_internal.h) + //char str[16] = "Press CTRL+A"; + //ImGui::Spacing(); + //ImGui::InputText("InputTextB", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly); + //ImGuiID item_id = ImGui::GetItemID(); + //ImGui::SameLine(); HelpMarker("Internal widgets always use _RouteFocused"); + //ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags, item_id) ? "PRESSED" : "..."); + + // 3: Dummy child is not claiming the route: focusing them shouldn't steal route away from WindowA + ImGui::BeginChild("ChildD", ImVec2(-FLT_MIN, line_height * 4), true); + ImGui::Text("(in ChildD: not using same Shortcut)"); + ImGui::Text("IsWindowFocused: %d", ImGui::IsWindowFocused()); + ImGui::EndChild(); + + // 4: Child window polling for CTRL+A. It is deeper than WindowA and gets priority when focused. + ImGui::BeginChild("ChildE", ImVec2(-FLT_MIN, line_height * 4), true); + ImGui::Text("(in ChildE: using same Shortcut)"); + ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "..."); + ImGui::EndChild(); + + // 5: In a popup + if (ImGui::Button("Open Popup")) + ImGui::OpenPopup("PopupF"); + if (ImGui::BeginPopup("PopupF")) + { + ImGui::Text("(in PopupF)"); + ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags) ? "PRESSED" : "..."); + // (Commmented because the owner-aware version of Shortcut() is still in imgui_internal.h) + //ImGui::InputText("InputTextG", str, IM_ARRAYSIZE(str), ImGuiInputTextFlags_ReadOnly); + //ImGui::Text("IsWindowFocused: %d, Shortcut: %s", ImGui::IsWindowFocused(), ImGui::Shortcut(key_chord, flags, ImGui::GetItemID()) ? "PRESSED" : "..."); + ImGui::EndPopup(); + } + ImGui::EndChild(); + ImGui::PopStyleColor(); + + ImGui::TreePop(); + } + // Display mouse cursors IMGUI_DEMO_MARKER("Inputs & Focus/Mouse Cursors"); if (ImGui::TreeNode("Mouse Cursors")) @@ -5938,10 +6498,11 @@ void ImGui::ShowAboutWindow(bool* p_open) return; } IMGUI_DEMO_MARKER("Tools/About Dear ImGui"); - ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); + ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); ImGui::Separator(); ImGui::Text("By Omar Cornut and all Dear ImGui contributors."); ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); + ImGui::Text("If your company uses this, please consider funding the project."); static bool show_config_info = false; ImGui::Checkbox("Config/Build Information", &show_config_info); @@ -5952,7 +6513,7 @@ void ImGui::ShowAboutWindow(bool* p_open) bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18); - ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove); + ImGui::BeginChild(ImGui::GetID("cfg_infos"), child_size, ImGuiChildFlags_FrameStyle); if (copy_to_clipboard) { ImGui::LogToClipboard(); @@ -6068,7 +6629,7 @@ void ImGui::ShowAboutWindow(bool* p_open) ImGui::LogText("\n```\n"); ImGui::LogFinish(); } - ImGui::EndChildFrame(); + ImGui::EndChild(); } ImGui::End(); } @@ -6092,9 +6653,8 @@ void ImGui::ShowFontSelector(const char* label) ImFont* font_current = ImGui::GetFont(); if (ImGui::BeginCombo(label, font_current->GetDebugName())) { - for (int n = 0; n < io.Fonts->Fonts.Size; n++) + for (ImFont* font : io.Fonts->Fonts) { - ImFont* font = io.Fonts->Fonts[n]; ImGui::PushID((void*)font); if (ImGui::Selectable(font->GetDebugName(), font == font_current)) io.FontDefault = font; @@ -6180,7 +6740,6 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) ImGui::SeparatorText("Main"); ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); - ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); @@ -6194,6 +6753,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("TabBarBorderSize", &style.TabBarBorderSize, 0.0f, 2.0f, "%.0f"); ImGui::SeparatorText("Rounding"); ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); @@ -6204,11 +6764,16 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SeparatorText("Tables"); + ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderAngle("TableAngledHeadersAngle", &style.TableAngledHeadersAngle, -50.0f, +50.0f); + ImGui::SliderFloat2("TableAngledHeadersTextAlign", (float*)&style.TableAngledHeadersTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SeparatorText("Widgets"); ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); int window_menu_button_position = style.WindowMenuButtonPosition + 1; if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0")) - style.WindowMenuButtonPosition = window_menu_button_position - 1; + style.WindowMenuButtonPosition = (ImGuiDir)(window_menu_button_position - 1); ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); @@ -6216,11 +6781,26 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); ImGui::SliderFloat("SeparatorTextBorderSize", &style.SeparatorTextBorderSize, 0.0f, 10.0f, "%.0f"); ImGui::SliderFloat2("SeparatorTextAlign", (float*)&style.SeparatorTextAlign, 0.0f, 1.0f, "%.2f"); - ImGui::SliderFloat2("SeparatorTextPadding", (float*)&style.SeparatorTextPadding, 0.0f, 40.0f, "%0.f"); + ImGui::SliderFloat2("SeparatorTextPadding", (float*)&style.SeparatorTextPadding, 0.0f, 40.0f, "%.0f"); ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f"); + ImGui::SeparatorText("Tooltips"); + for (int n = 0; n < 2; n++) + if (ImGui::TreeNodeEx(n == 0 ? "HoverFlagsForTooltipMouse" : "HoverFlagsForTooltipNav")) + { + ImGuiHoveredFlags* p = (n == 0) ? &style.HoverFlagsForTooltipMouse : &style.HoverFlagsForTooltipNav; + ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayNone", p, ImGuiHoveredFlags_DelayNone); + ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayShort", p, ImGuiHoveredFlags_DelayShort); + ImGui::CheckboxFlags("ImGuiHoveredFlags_DelayNormal", p, ImGuiHoveredFlags_DelayNormal); + ImGui::CheckboxFlags("ImGuiHoveredFlags_Stationary", p, ImGuiHoveredFlags_Stationary); + ImGui::CheckboxFlags("ImGuiHoveredFlags_NoSharedDelay", p, ImGuiHoveredFlags_NoSharedDelay); + ImGui::TreePop(); + } + ImGui::SeparatorText("Misc"); - ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); + ImGui::SliderFloat2("DisplayWindowPadding", (float*)&style.DisplayWindowPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Apply to regular windows: amount which we enforce to keep visible when moving near edges of your screen."); + ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Apply to every windows, menus, popups, tooltips: amount where we avoid displaying contents. Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); + ImGui::EndTabItem(); } @@ -6260,14 +6840,21 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) "Left-click on color square to open color picker,\n" "Right-click to open edit options menu."); - ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); - ImGui::PushItemWidth(-160); + ImGui::SetNextWindowSizeConstraints(ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 10), ImVec2(FLT_MAX, FLT_MAX)); + ImGui::BeginChild("##colors", ImVec2(0, 0), ImGuiChildFlags_Border, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); + ImGui::PushItemWidth(ImGui::GetFontSize() * -12); for (int i = 0; i < ImGuiCol_COUNT; i++) { const char* name = ImGui::GetStyleColorName(i); if (!filter.PassFilter(name)) continue; ImGui::PushID(i); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (ImGui::Button("?")) + ImGui::DebugFlashStyleColor((ImGuiCol)i); + ImGui::SetItemTooltip("Flash given color to identify places where it is used."); + ImGui::SameLine(); +#endif ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) { @@ -6487,7 +7074,7 @@ static void ShowExampleMenuFile() { static bool enabled = true; ImGui::MenuItem("Enabled", "", &enabled); - ImGui::BeginChild("child", ImVec2(0, 60), true); + ImGui::BeginChild("child", ImVec2(0, 60), ImGuiChildFlags_Border); for (int i = 0; i < 10; i++) ImGui::Text("Scrolling Text %d", i); ImGui::EndChild(); @@ -6572,19 +7159,19 @@ struct ExampleAppConsole { ClearLog(); for (int i = 0; i < History.Size; i++) - free(History[i]); + ImGui::MemFree(History[i]); } // Portable helpers static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } - static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } + static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = ImGui::MemAlloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } void ClearLog() { for (int i = 0; i < Items.Size; i++) - free(Items[i]); + ImGui::MemFree(Items[i]); Items.clear(); } @@ -6645,6 +7232,7 @@ struct ExampleAppConsole } // Options, Filter + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_O, ImGuiInputFlags_Tooltip); if (ImGui::Button("Options")) ImGui::OpenPopup("Options"); ImGui::SameLine(); @@ -6653,7 +7241,7 @@ struct ExampleAppConsole // Reserve enough left-over height for 1 separator + 1 input text const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); - if (ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar)) + if (ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar | ImGuiWindowFlags_NavFlattened)) { if (ImGui::BeginPopupContextWindow()) { @@ -6688,9 +7276,8 @@ struct ExampleAppConsole ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing if (copy_to_clipboard) ImGui::LogToClipboard(); - for (int i = 0; i < Items.Size; i++) + for (const char* item : Items) { - const char* item = Items[i]; if (!Filter.PassFilter(item)) continue; @@ -6751,7 +7338,7 @@ struct ExampleAppConsole for (int i = History.Size - 1; i >= 0; i--) if (Stricmp(History[i], command_line) == 0) { - free(History[i]); + ImGui::MemFree(History[i]); History.erase(History.begin() + i); break; } @@ -6965,7 +7552,7 @@ struct ExampleAppLog ImGui::Separator(); - if (ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar)) + if (ImGui::BeginChild("scrolling", ImVec2(0, 0), ImGuiChildFlags_None, ImGuiWindowFlags_HorizontalScrollbar)) { if (clear) Clear(); @@ -7084,7 +7671,7 @@ static void ShowExampleAppLayout(bool* p_open) // Left static int selected = 0; { - ImGui::BeginChild("left pane", ImVec2(150, 0), true); + ImGui::BeginChild("left pane", ImVec2(150, 0), ImGuiChildFlags_Border | ImGuiChildFlags_ResizeX); for (int i = 0; i < 100; i++) { // FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav @@ -7179,6 +7766,7 @@ static void ShowPlaceholderObject(const char* prefix, int uid) } // Demonstrate create a simple property editor. +// This demo is a bit lackluster nowadays, would be nice to improve. static void ShowExampleAppPropertyEditor(bool* p_open) { ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver); @@ -7187,23 +7775,24 @@ static void ShowExampleAppPropertyEditor(bool* p_open) ImGui::End(); return; } - IMGUI_DEMO_MARKER("Examples/Property Editor"); + IMGUI_DEMO_MARKER("Examples/Property Editor"); HelpMarker( "This example shows how you may implement a property editor using two columns.\n" - "All objects/fields data are dummies here.\n" - "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n" - "your cursor horizontally instead of using the Columns() API."); + "All objects/fields data are dummies here.\n"); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2)); - if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable)) + if (ImGui::BeginTable("##split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable | ImGuiTableFlags_ScrollY)) { + ImGui::TableSetupScrollFreeze(0, 1); + ImGui::TableSetupColumn("Object"); + ImGui::TableSetupColumn("Contents"); + ImGui::TableHeadersRow(); + // Iterate placeholder objects (all the same data) for (int obj_i = 0; obj_i < 4; obj_i++) - { ShowPlaceholderObject("Object", obj_i); - //ImGui::Separator(); - } + ImGui::EndTable(); } ImGui::PopStyleVar(); @@ -7310,18 +7899,31 @@ static void ShowExampleAppConstrainedResize(bool* p_open) { // Helper functions to demonstrate programmatic constraints // FIXME: This doesn't take account of decoration size (e.g. title bar), library should make this easier. - static void AspectRatio(ImGuiSizeCallbackData* data) { float aspect_ratio = *(float*)data->UserData; data->DesiredSize.x = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio); } - static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); } - static void Step(ImGuiSizeCallbackData* data) { float step = *(float*)data->UserData; data->DesiredSize = ImVec2((int)(data->CurrentSize.x / step + 0.5f) * step, (int)(data->CurrentSize.y / step + 0.5f) * step); } + // FIXME: None of the three demos works consistently when resizing from borders. + static void AspectRatio(ImGuiSizeCallbackData* data) + { + float aspect_ratio = *(float*)data->UserData; + data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio); + } + static void Square(ImGuiSizeCallbackData* data) + { + data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y); + } + static void Step(ImGuiSizeCallbackData* data) + { + float step = *(float*)data->UserData; + data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); + } }; const char* test_desc[] = { "Between 100x100 and 500x500", "At least 100x100", - "Resize vertical only", - "Resize horizontal only", + "Resize vertical + lock current width", + "Resize horizontal + lock current height", "Width Between 400 and 500", + "Height at least 400", "Custom: Aspect Ratio 16:9", "Custom: Always Square", "Custom: Fixed Steps (100)", @@ -7330,7 +7932,7 @@ static void ShowExampleAppConstrainedResize(bool* p_open) // Options static bool auto_resize = false; static bool window_padding = true; - static int type = 5; // Aspect Ratio + static int type = 6; // Aspect Ratio static int display_lines = 10; // Submit constraint @@ -7338,12 +7940,13 @@ static void ShowExampleAppConstrainedResize(bool* p_open) float fixed_step = 100.0f; if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(500, 500)); // Between 100x100 and 500x500 if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 - if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only - if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only + if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Resize vertical + lock current width + if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Resize horizontal + lock current height if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500 - if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio - if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square - if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step + if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, FLT_MAX)); // Height at least 400 + if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio + if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square + if (type == 8) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step // Submit window if (!window_padding) @@ -7515,6 +8118,14 @@ static void ShowExampleAppWindowTitles(bool*) // [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() //----------------------------------------------------------------------------- +// Add a |_| looking shape +static void PathConcaveShape(ImDrawList* draw_list, float x, float y, float sz) +{ + const ImVec2 pos_norms[] = { { 0.0f, 0.0f }, { 0.3f, 0.0f }, { 0.3f, 0.7f }, { 0.7f, 0.7f }, { 0.7f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f } }; + for (const ImVec2& p : pos_norms) + draw_list->PathLineTo(ImVec2(x + 0.5f + (int)(sz * p.x), y + 0.5f + (int)(sz * p.y))); +} + // Demonstrate using the low-level ImDrawList to draw custom shapes. static void ShowExampleAppCustomRendering(bool* p_open) { @@ -7587,6 +8198,9 @@ static void ShowExampleAppCustomRendering(bool* p_open) const float rounding = sz / 5.0f; const int circle_segments = circle_segments_override ? circle_segments_override_v : 0; const int curve_segments = curve_segments_override ? curve_segments_override_v : 0; + const ImVec2 cp3[3] = { ImVec2(0.0f, sz * 0.6f), ImVec2(sz * 0.5f, -sz * 0.4f), ImVec2(sz, sz) }; // Control points for curves + const ImVec2 cp4[4] = { ImVec2(0.0f, 0.0f), ImVec2(sz * 1.3f, sz * 0.3f), ImVec2(sz - sz * 1.3f, sz - sz * 0.3f), ImVec2(sz, sz) }; + float x = p.x + 4.0f; float y = p.y + 4.0f; for (int n = 0; n < 2; n++) @@ -7595,39 +8209,63 @@ static void ShowExampleAppCustomRendering(bool* p_open) float th = (n == 0) ? 1.0f : thickness; draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle + draw_list->AddEllipse(ImVec2(x + sz*0.5f, y + sz*0.5f), ImVec2(sz*0.5f, sz*0.3f), col, -0.3f, circle_segments, th); x += sz + spacing; // Ellipse draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle //draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle + PathConcaveShape(draw_list, x, y, sz); draw_list->PathStroke(col, ImDrawFlags_Closed, th); x += sz + spacing; // Concave Shape + //draw_list->AddPolyline(concave_shape, IM_ARRAYSIZE(concave_shape), col, ImDrawFlags_Closed, th); draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line + // Path + draw_list->PathArcTo(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, 3.141592f, 3.141592f * -0.5f); + draw_list->PathStroke(col, ImDrawFlags_None, th); + x += sz + spacing; + // Quadratic Bezier Curve (3 control points) - ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) }; - draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing; + draw_list->AddBezierQuadratic(ImVec2(x + cp3[0].x, y + cp3[0].y), ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), col, th, curve_segments); + x += sz + spacing; // Cubic Bezier Curve (4 control points) - ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) }; - draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments); + draw_list->AddBezierCubic(ImVec2(x + cp4[0].x, y + cp4[0].y), ImVec2(x + cp4[1].x, y + cp4[1].y), ImVec2(x + cp4[2].x, y + cp4[2].y), ImVec2(x + cp4[3].x, y + cp4[3].y), col, th, curve_segments); x = p.x + 4; y += sz + spacing; } - draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon - draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle + + // Filled shapes + draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, ngon_sides); x += sz + spacing; // N-gon + draw_list->AddCircleFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, col, circle_segments); x += sz + spacing; // Circle + draw_list->AddEllipseFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), ImVec2(sz * 0.5f, sz * 0.3f), col, -0.3f, circle_segments); x += sz + spacing;// Ellipse draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle //draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle + PathConcaveShape(draw_list, x, y, sz); draw_list->PathFillConcave(col); x += sz + spacing; // Concave shape draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness) draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) + + // Path + draw_list->PathArcTo(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz * 0.5f, 3.141592f * -0.5f, 3.141592f); + draw_list->PathFillConvex(col); + x += sz + spacing; + + // Quadratic Bezier Curve (3 control points) + draw_list->PathLineTo(ImVec2(x + cp3[0].x, y + cp3[0].y)); + draw_list->PathBezierQuadraticCurveTo(ImVec2(x + cp3[1].x, y + cp3[1].y), ImVec2(x + cp3[2].x, y + cp3[2].y), curve_segments); + draw_list->PathFillConvex(col); + x += sz + spacing; + draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); + x += sz + spacing; - ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f)); + ImGui::Dummy(ImVec2((sz + spacing) * 13.2f, (sz + spacing) * 3.0f)); ImGui::PopItemWidth(); ImGui::EndTabItem(); } @@ -7649,7 +8287,7 @@ static void ShowExampleAppCustomRendering(bool* p_open) // To use a child window instead we could use, e.g: // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding // ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color - // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove); + // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), ImGuiChildFlags_Border, ImGuiWindowFlags_NoMove); // ImGui::PopStyleColor(); // ImGui::PopStyleVar(); // [...] @@ -7747,6 +8385,43 @@ static void ShowExampleAppCustomRendering(bool* p_open) ImGui::EndTabItem(); } + // Demonstrate out-of-order rendering via channels splitting + // We use functions in ImDrawList as each draw list contains a convenience splitter, + // but you can also instantiate your own ImDrawListSplitter if you need to nest them. + if (ImGui::BeginTabItem("Draw Channels")) + { + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + { + ImGui::Text("Blue shape is drawn first: appears in back"); + ImGui::Text("Red shape is drawn after: appears in front"); + ImVec2 p0 = ImGui::GetCursorScreenPos(); + draw_list->AddRectFilled(ImVec2(p0.x, p0.y), ImVec2(p0.x + 50, p0.y + 50), IM_COL32(0, 0, 255, 255)); // Blue + draw_list->AddRectFilled(ImVec2(p0.x + 25, p0.y + 25), ImVec2(p0.x + 75, p0.y + 75), IM_COL32(255, 0, 0, 255)); // Red + ImGui::Dummy(ImVec2(75, 75)); + } + ImGui::Separator(); + { + ImGui::Text("Blue shape is drawn first, into channel 1: appears in front"); + ImGui::Text("Red shape is drawn after, into channel 0: appears in back"); + ImVec2 p1 = ImGui::GetCursorScreenPos(); + + // Create 2 channels and draw a Blue shape THEN a Red shape. + // You can create any number of channels. Tables API use 1 channel per column in order to better batch draw calls. + draw_list->ChannelsSplit(2); + draw_list->ChannelsSetCurrent(1); + draw_list->AddRectFilled(ImVec2(p1.x, p1.y), ImVec2(p1.x + 50, p1.y + 50), IM_COL32(0, 0, 255, 255)); // Blue + draw_list->ChannelsSetCurrent(0); + draw_list->AddRectFilled(ImVec2(p1.x + 25, p1.y + 25), ImVec2(p1.x + 75, p1.y + 75), IM_COL32(255, 0, 0, 255)); // Red + + // Flatten/reorder channels. Red shape is in channel 0 and it appears below the Blue shape in channel 1. + // This works by copying draw indices only (vertices are not copied). + draw_list->ChannelsMerge(); + ImGui::Dummy(ImVec2(75, 75)); + ImGui::Text("After reordering, contents of channel 0 appears below channel 1."); + } + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); } @@ -7760,93 +8435,119 @@ static void ShowExampleAppCustomRendering(bool* p_open) // Simplified structure to mimic a Document model struct MyDocument { - const char* Name; // Document title + char Name[32]; // Document title + int UID; // Unique ID (necessary as we can change title) bool Open; // Set when open (we keep an array of all available documents to simplify demo code!) bool OpenPrev; // Copy of Open from last update. bool Dirty; // Set when the document has been modified - bool WantClose; // Set when the document ImVec4 Color; // An arbitrary variable associated to the document - MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) + MyDocument(int uid, const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) { - Name = name; + UID = uid; + snprintf(Name, sizeof(Name), "%s", name); Open = OpenPrev = open; Dirty = false; - WantClose = false; Color = color; } void DoOpen() { Open = true; } - void DoQueueClose() { WantClose = true; } void DoForceClose() { Open = false; Dirty = false; } void DoSave() { Dirty = false; } +}; + +struct ExampleAppDocuments +{ + ImVector Documents; + ImVector CloseQueue; + MyDocument* RenamingDoc = NULL; + bool RenamingStarted = false; + + ExampleAppDocuments() + { + Documents.push_back(MyDocument(0, "Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); + Documents.push_back(MyDocument(1, "Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); + Documents.push_back(MyDocument(2, "Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); + Documents.push_back(MyDocument(3, "Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); + Documents.push_back(MyDocument(4, "A Rather Long Title", false, ImVec4(0.4f, 0.8f, 0.8f, 1.0f))); + Documents.push_back(MyDocument(5, "Some Document", false, ImVec4(0.8f, 0.8f, 1.0f, 1.0f))); + } + + // As we allow to change document name, we append a never-changing document ID so tabs are stable + void GetTabName(MyDocument* doc, char* out_buf, size_t out_buf_size) + { + snprintf(out_buf, out_buf_size, "%s###doc%d", doc->Name, doc->UID); + } // Display placeholder contents for the Document - static void DisplayContents(MyDocument* doc) + void DisplayDocContents(MyDocument* doc) { ImGui::PushID(doc); ImGui::Text("Document \"%s\"", doc->Name); ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); ImGui::PopStyleColor(); - if (ImGui::Button("Modify", ImVec2(100, 0))) + + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_R, ImGuiInputFlags_Tooltip); + if (ImGui::Button("Rename..")) + { + RenamingDoc = doc; + RenamingStarted = true; + } + ImGui::SameLine(); + + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_M, ImGuiInputFlags_Tooltip); + if (ImGui::Button("Modify")) doc->Dirty = true; + ImGui::SameLine(); - if (ImGui::Button("Save", ImVec2(100, 0))) + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_S, ImGuiInputFlags_Tooltip); + if (ImGui::Button("Save")) doc->DoSave(); + + ImGui::SameLine(); + ImGui::SetNextItemShortcut(ImGuiMod_Ctrl | ImGuiKey_W, ImGuiInputFlags_Tooltip); + if (ImGui::Button("Close")) + CloseQueue.push_back(doc); ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. ImGui::PopID(); } // Display context menu for the Document - static void DisplayContextMenu(MyDocument* doc) + void DisplayDocContextMenu(MyDocument* doc) { if (!ImGui::BeginPopupContextItem()) return; char buf[256]; sprintf(buf, "Save %s", doc->Name); - if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) + if (ImGui::MenuItem(buf, "Ctrl+S", false, doc->Open)) doc->DoSave(); - if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) - doc->DoQueueClose(); + if (ImGui::MenuItem("Rename...", "Ctrl+R", false, doc->Open)) + RenamingDoc = doc; + if (ImGui::MenuItem("Close", "Ctrl+W", false, doc->Open)) + CloseQueue.push_back(doc); ImGui::EndPopup(); } -}; - -struct ExampleAppDocuments -{ - ImVector Documents; - ExampleAppDocuments() + // [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. + // If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, + // as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for + // the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has + // disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively + // give the impression of a flicker for one frame. + // We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. + // Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. + void NotifyOfDocumentsClosedElsewhere() { - Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); - Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); - Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); - Documents.push_back(MyDocument("A Rather Long Title", false)); - Documents.push_back(MyDocument("Some Document", false)); + for (MyDocument& doc : Documents) + { + if (!doc.Open && doc.OpenPrev) + ImGui::SetTabItemClosed(doc.Name); + doc.OpenPrev = doc.Open; + } } }; -// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. -// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, -// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for -// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has -// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively -// give the impression of a flicker for one frame. -// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. -// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. -static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) -{ - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open && doc->OpenPrev) - ImGui::SetTabItemClosed(doc->Name); - doc->OpenPrev = doc->Open; - } -} - void ShowExampleAppDocuments(bool* p_open) { static ExampleAppDocuments app; @@ -7868,24 +8569,20 @@ void ShowExampleAppDocuments(bool* p_open) if (ImGui::BeginMenu("File")) { int open_count = 0; - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - open_count += app.Documents[doc_n].Open ? 1 : 0; + for (MyDocument& doc : app.Documents) + open_count += doc.Open ? 1 : 0; if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) { - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) - if (ImGui::MenuItem(doc->Name)) - doc->DoOpen(); - } + for (MyDocument& doc : app.Documents) + if (!doc.Open && ImGui::MenuItem(doc.Name)) + doc.DoOpen(); ImGui::EndMenu(); } if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) - app.Documents[doc_n].DoQueueClose(); - if (ImGui::MenuItem("Exit", "Ctrl+F4") && p_open) + for (MyDocument& doc : app.Documents) + app.CloseQueue.push_back(&doc); + if (ImGui::MenuItem("Exit") && p_open) *p_open = false; ImGui::EndMenu(); } @@ -7895,13 +8592,13 @@ void ShowExampleAppDocuments(bool* p_open) // [Debug] List documents with one checkbox for each for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) { - MyDocument* doc = &app.Documents[doc_n]; + MyDocument& doc = app.Documents[doc_n]; if (doc_n > 0) ImGui::SameLine(); - ImGui::PushID(doc); - if (ImGui::Checkbox(doc->Name, &doc->Open)) - if (!doc->Open) - doc->DoForceClose(); + ImGui::PushID(&doc); + if (ImGui::Checkbox(doc.Name, &doc.Open)) + if (!doc.Open) + doc.DoForceClose(); ImGui::PopID(); } @@ -7923,33 +8620,35 @@ void ShowExampleAppDocuments(bool* p_open) if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) { if (opt_reorderable) - NotifyOfDocumentsClosedElsewhere(app); + app.NotifyOfDocumentsClosedElsewhere(); // [DEBUG] Stress tests //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. // Submit Tabs - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + for (MyDocument& doc : app.Documents) { - MyDocument* doc = &app.Documents[doc_n]; - if (!doc->Open) + if (!doc.Open) continue; - ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); - bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); + // As we allow to change document name, we append a never-changing document id so tabs are stable + char doc_name_buf[64]; + app.GetTabName(&doc, doc_name_buf, sizeof(doc_name_buf)); + ImGuiTabItemFlags tab_flags = (doc.Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); + bool visible = ImGui::BeginTabItem(doc_name_buf, &doc.Open, tab_flags); // Cancel attempt to close when unsaved add to save queue so we can display a popup. - if (!doc->Open && doc->Dirty) + if (!doc.Open && doc.Dirty) { - doc->Open = true; - doc->DoQueueClose(); + doc.Open = true; + app.CloseQueue.push_back(&doc); } - MyDocument::DisplayContextMenu(doc); + app.DisplayDocContextMenu(&doc); if (visible) { - MyDocument::DisplayContents(doc); + app.DisplayDocContents(&doc); ImGui::EndTabItem(); } } @@ -7958,36 +8657,44 @@ void ShowExampleAppDocuments(bool* p_open) } } - // Update closing queue - static ImVector close_queue; - if (close_queue.empty()) + // Display renaming UI + if (app.RenamingDoc != NULL) { - // Close queue is locked once we started a popup - for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + if (app.RenamingStarted) + ImGui::OpenPopup("Rename"); + if (ImGui::BeginPopup("Rename")) { - MyDocument* doc = &app.Documents[doc_n]; - if (doc->WantClose) + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 30); + if (ImGui::InputText("###Name", app.RenamingDoc->Name, IM_ARRAYSIZE(app.RenamingDoc->Name), ImGuiInputTextFlags_EnterReturnsTrue)) { - doc->WantClose = false; - close_queue.push_back(doc); + ImGui::CloseCurrentPopup(); + app.RenamingDoc = NULL; } + if (app.RenamingStarted) + ImGui::SetKeyboardFocusHere(-1); + ImGui::EndPopup(); + } + else + { + app.RenamingDoc = NULL; } + app.RenamingStarted = false; } // Display closing confirmation UI - if (!close_queue.empty()) + if (!app.CloseQueue.empty()) { int close_queue_unsaved_documents = 0; - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) + for (int n = 0; n < app.CloseQueue.Size; n++) + if (app.CloseQueue[n]->Dirty) close_queue_unsaved_documents++; if (close_queue_unsaved_documents == 0) { // Close documents when all are unsaved - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); + for (int n = 0; n < app.CloseQueue.Size; n++) + app.CloseQueue[n]->DoForceClose(); + app.CloseQueue.clear(); } else { @@ -7997,38 +8704,36 @@ void ShowExampleAppDocuments(bool* p_open) { ImGui::Text("Save change to the following items?"); float item_height = ImGui::GetTextLineHeightWithSpacing(); - if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height))) - { - for (int n = 0; n < close_queue.Size; n++) - if (close_queue[n]->Dirty) - ImGui::Text("%s", close_queue[n]->Name); - ImGui::EndChildFrame(); - } + if (ImGui::BeginChild(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height), ImGuiChildFlags_FrameStyle)) + for (MyDocument* doc : app.CloseQueue) + if (doc->Dirty) + ImGui::Text("%s", doc->Name); + ImGui::EndChild(); ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f); if (ImGui::Button("Yes", button_size)) { - for (int n = 0; n < close_queue.Size; n++) + for (MyDocument* doc : app.CloseQueue) { - if (close_queue[n]->Dirty) - close_queue[n]->DoSave(); - close_queue[n]->DoForceClose(); + if (doc->Dirty) + doc->DoSave(); + doc->DoForceClose(); } - close_queue.clear(); + app.CloseQueue.clear(); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); if (ImGui::Button("No", button_size)) { - for (int n = 0; n < close_queue.Size; n++) - close_queue[n]->DoForceClose(); - close_queue.clear(); + for (MyDocument* doc : app.CloseQueue) + doc->DoForceClose(); + app.CloseQueue.clear(); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); if (ImGui::Button("Cancel", button_size)) { - close_queue.clear(); + app.CloseQueue.clear(); ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); diff --git a/core/deps/imgui/imgui_draw.cpp b/core/deps/imgui/imgui_draw.cpp index 0280c6e7c..382608524 100644 --- a/core/deps/imgui/imgui_draw.cpp +++ b/core/deps/imgui/imgui_draw.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (drawing and font code) /* @@ -8,6 +8,7 @@ Index of this file: // [SECTION] STB libraries implementation // [SECTION] Style functions // [SECTION] ImDrawList +// [SECTION] ImTriangulator, ImDrawList concave polygon fill // [SECTION] ImDrawListSplitter // [SECTION] ImDrawData // [SECTION] Helpers ShadeVertsXXX functions @@ -63,6 +64,8 @@ Index of this file: #pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wreserved-identifier" // warning: identifier '_Xxx' is reserved because it starts with '_' followed by a capital letter +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used @@ -134,7 +137,7 @@ namespace IMGUI_STB_NAMESPACE #define STBTT_sqrt(x) ImSqrt(x) #define STBTT_pow(x,y) ImPow(x,y) #define STBTT_fabs(x) ImFabs(x) -#define STBTT_ifloor(x) ((int)ImFloorSigned(x)) +#define STBTT_ifloor(x) ((int)ImFloor(x)) #define STBTT_iceil(x) ((int)ImCeil(x)) #define STBTT_STATIC #define STB_TRUETYPE_IMPLEMENTATION @@ -382,12 +385,13 @@ void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) } // Initialize before use in a new frame. We always have a command ready in the buffer. +// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this. void ImDrawList::_ResetForNewFrame() { // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); - IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, ClipRect) == 0); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, TextureId) == sizeof(ImVec4)); + IM_STATIC_ASSERT(offsetof(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); if (_Splitter._Count > 1) _Splitter.Merge(this); @@ -474,7 +478,7 @@ void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) } // Compare ClipRect, TextureId and VtxOffset with a single memcmp() -#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) +#define ImDrawCmd_HeaderSize (offsetof(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) #define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset #define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset #define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset) @@ -560,7 +564,7 @@ int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const { // Automatic segment count const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy - if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) + if (radius_idx >= 0 && radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) return _Data->CircleSegmentCounts[radius_idx]; // Use cached value else return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); @@ -640,7 +644,7 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count) _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; } -// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). +// Release the number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) { IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); @@ -1190,8 +1194,8 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f); const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f); - const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f); - const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f); + const int a_min_sample = a_is_reverse ? (int)ImFloor(a_min_sample_f) : (int)ImCeil(a_min_sample_f); + const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloor(a_max_sample_f); const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0); const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; @@ -1216,6 +1220,26 @@ void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, floa } } +void ImDrawList::PathEllipticalArcTo(const ImVec2& center, const ImVec2& radius, float rot, float a_min, float a_max, int num_segments) +{ + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + _Path.reserve(_Path.Size + (num_segments + 1)); + + const float cos_rot = ImCos(rot); + const float sin_rot = ImSin(rot); + for (int i = 0; i <= num_segments; i++) + { + const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); + ImVec2 point(ImCos(a) * radius.x, ImSin(a) * radius.y); + const ImVec2 rel((point.x * cos_rot) - (point.y * sin_rot), (point.x * sin_rot) + (point.y * cos_rot)); + point.x = rel.x + center.x; + point.y = rel.y + center.y; + _Path.push_back(point); + } +} + ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) { float u = 1.0f - t; @@ -1311,33 +1335,22 @@ void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, } } -IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) { + /* + IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - // Obsoleted in 1.82 (from February 2021) - // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) - // ~0 --> ImDrawFlags_RoundCornersAll or 0 - if (flags == ~0) - return ImDrawFlags_RoundCornersAll; - - // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) - // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) - // 0x02 --> ImDrawFlags_RoundCornersTopRight - // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight - // 0x04 --> ImDrawFlags_RoundCornersBotLeft - // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft - // ... - // 0x0F --> ImDrawFlags_RoundCornersAll or 0 - // (See all values in ImDrawCornerFlags_) - if (flags >= 0x01 && flags <= 0x0F) - return (flags << 4); - + // Obsoleted in 1.82 (from February 2021). This code was stripped/simplified and mostly commented in 1.90 (from September 2023) + // - Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) + if (flags == ~0) { return ImDrawFlags_RoundCornersAll; } + // - Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations). Read details in older version of this code. + if (flags >= 0x01 && flags <= 0x0F) { return (flags << 4); } // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' #endif - - // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. - // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... + */ + // If this assert triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. + // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc. anyway. + // See details in 1.82 Changelog as well as 2021/03/12 and 2023/09/08 entries in "API BREAKING CHANGES" section. IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); if ((flags & ImDrawFlags_RoundCornersMask_) == 0) @@ -1348,10 +1361,12 @@ static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) { - flags = FixRectCornerFlags(flags); - rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); - rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); - + if (rounding >= 0.5f) + { + flags = FixRectCornerFlags(flags); + rounding = ImMin(rounding, ImFabs(b.x - a.x) * (((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f) - 1.0f); + rounding = ImMin(rounding, ImFabs(b.y - a.y) * (((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f) - 1.0f); + } if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) { PathLineTo(a); @@ -1544,6 +1559,35 @@ void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, in PathFillConvex(col); } +// Ellipse +void ImDrawList::AddEllipse(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments; + PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1); + PathStroke(col, true, thickness); +} + +void ImDrawList::AddEllipseFilled(const ImVec2& center, const ImVec2& radius, ImU32 col, float rot, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (num_segments <= 0) + num_segments = _CalcCircleAutoSegmentCount(ImMax(radius.x, radius.y)); // A bit pessimistic, maybe there's a better computation to do here. + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = IM_PI * 2.0f * ((float)num_segments - 1.0f) / (float)num_segments; + PathEllipticalArcTo(center, radius, rot, 0.0f, a_max, num_segments - 1); + PathFillConvex(col); +} + // Cubic Bezier takes 4 controls points void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) { @@ -1571,10 +1615,11 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, if ((col & IM_COL32_A_MASK) == 0) return; + // Accept null ranges + if (text_begin == text_end || text_begin[0] == 0) + return; if (text_end == NULL) text_end = text_begin + strlen(text_begin); - if (text_begin == text_end) - return; // Pull default font/size from the shared ImDrawListSharedData instance if (font == NULL) @@ -1658,6 +1703,316 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_mi PopTextureID(); } +//----------------------------------------------------------------------------- +// [SECTION] ImTriangulator, ImDrawList concave polygon fill +//----------------------------------------------------------------------------- +// Triangulate concave polygons. Based on "Triangulation by Ear Clipping" paper, O(N^2) complexity. +// Reference: https://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf +// Provided as a convenience for user but not used by main library. +//----------------------------------------------------------------------------- +// - ImTriangulator [Internal] +// - AddConcavePolyFilled() +//----------------------------------------------------------------------------- + +enum ImTriangulatorNodeType +{ + ImTriangulatorNodeType_Convex, + ImTriangulatorNodeType_Ear, + ImTriangulatorNodeType_Reflex +}; + +struct ImTriangulatorNode +{ + ImTriangulatorNodeType Type; + int Index; + ImVec2 Pos; + ImTriangulatorNode* Next; + ImTriangulatorNode* Prev; + + void Unlink() { Next->Prev = Prev; Prev->Next = Next; } +}; + +struct ImTriangulatorNodeSpan +{ + ImTriangulatorNode** Data = NULL; + int Size = 0; + + void push_back(ImTriangulatorNode* node) { Data[Size++] = node; } + void find_erase_unsorted(int idx) { for (int i = Size - 1; i >= 0; i--) if (Data[i]->Index == idx) { Data[i] = Data[Size - 1]; Size--; return; } } +}; + +struct ImTriangulator +{ + static int EstimateTriangleCount(int points_count) { return (points_count < 3) ? 0 : points_count - 2; } + static int EstimateScratchBufferSize(int points_count) { return sizeof(ImTriangulatorNode) * points_count + sizeof(ImTriangulatorNode*) * points_count * 2; } + + void Init(const ImVec2* points, int points_count, void* scratch_buffer); + void GetNextTriangle(unsigned int out_triangle[3]); // Return relative indexes for next triangle + + // Internal functions + void BuildNodes(const ImVec2* points, int points_count); + void BuildReflexes(); + void BuildEars(); + void FlipNodeList(); + bool IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const; + void ReclassifyNode(ImTriangulatorNode* node); + + // Internal members + int _TrianglesLeft = 0; + ImTriangulatorNode* _Nodes = NULL; + ImTriangulatorNodeSpan _Ears; + ImTriangulatorNodeSpan _Reflexes; +}; + +// Distribute storage for nodes, ears and reflexes. +// FIXME-OPT: if everything is convex, we could report it to caller and let it switch to an convex renderer +// (this would require first building reflexes to bail to convex if empty, without even building nodes) +void ImTriangulator::Init(const ImVec2* points, int points_count, void* scratch_buffer) +{ + IM_ASSERT(scratch_buffer != NULL && points_count >= 3); + _TrianglesLeft = EstimateTriangleCount(points_count); + _Nodes = (ImTriangulatorNode*)scratch_buffer; // points_count x Node + _Ears.Data = (ImTriangulatorNode**)(_Nodes + points_count); // points_count x Node* + _Reflexes.Data = (ImTriangulatorNode**)(_Nodes + points_count) + points_count; // points_count x Node* + BuildNodes(points, points_count); + BuildReflexes(); + BuildEars(); +} + +void ImTriangulator::BuildNodes(const ImVec2* points, int points_count) +{ + for (int i = 0; i < points_count; i++) + { + _Nodes[i].Type = ImTriangulatorNodeType_Convex; + _Nodes[i].Index = i; + _Nodes[i].Pos = points[i]; + _Nodes[i].Next = _Nodes + i + 1; + _Nodes[i].Prev = _Nodes + i - 1; + } + _Nodes[0].Prev = _Nodes + points_count - 1; + _Nodes[points_count - 1].Next = _Nodes; +} + +void ImTriangulator::BuildReflexes() +{ + ImTriangulatorNode* n1 = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next) + { + if (ImTriangleIsClockwise(n1->Prev->Pos, n1->Pos, n1->Next->Pos)) + continue; + n1->Type = ImTriangulatorNodeType_Reflex; + _Reflexes.push_back(n1); + } +} + +void ImTriangulator::BuildEars() +{ + ImTriangulatorNode* n1 = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, n1 = n1->Next) + { + if (n1->Type != ImTriangulatorNodeType_Convex) + continue; + if (!IsEar(n1->Prev->Index, n1->Index, n1->Next->Index, n1->Prev->Pos, n1->Pos, n1->Next->Pos)) + continue; + n1->Type = ImTriangulatorNodeType_Ear; + _Ears.push_back(n1); + } +} + +void ImTriangulator::GetNextTriangle(unsigned int out_triangle[3]) +{ + if (_Ears.Size == 0) + { + FlipNodeList(); + + ImTriangulatorNode* node = _Nodes; + for (int i = _TrianglesLeft; i >= 0; i--, node = node->Next) + node->Type = ImTriangulatorNodeType_Convex; + _Reflexes.Size = 0; + BuildReflexes(); + BuildEars(); + + // If we still don't have ears, it means geometry is degenerated. + if (_Ears.Size == 0) + { + // Return first triangle available, mimicking the behavior of convex fill. + IM_ASSERT(_TrianglesLeft > 0); // Geometry is degenerated + _Ears.Data[0] = _Nodes; + _Ears.Size = 1; + } + } + + ImTriangulatorNode* ear = _Ears.Data[--_Ears.Size]; + out_triangle[0] = ear->Prev->Index; + out_triangle[1] = ear->Index; + out_triangle[2] = ear->Next->Index; + + ear->Unlink(); + if (ear == _Nodes) + _Nodes = ear->Next; + + ReclassifyNode(ear->Prev); + ReclassifyNode(ear->Next); + _TrianglesLeft--; +} + +void ImTriangulator::FlipNodeList() +{ + ImTriangulatorNode* prev = _Nodes; + ImTriangulatorNode* temp = _Nodes; + ImTriangulatorNode* current = _Nodes->Next; + prev->Next = prev; + prev->Prev = prev; + while (current != _Nodes) + { + temp = current->Next; + + current->Next = prev; + prev->Prev = current; + _Nodes->Next = current; + current->Prev = _Nodes; + + prev = current; + current = temp; + } + _Nodes = prev; +} + +// A triangle is an ear is no other vertex is inside it. We can test reflexes vertices only (see reference algorithm) +bool ImTriangulator::IsEar(int i0, int i1, int i2, const ImVec2& v0, const ImVec2& v1, const ImVec2& v2) const +{ + ImTriangulatorNode** p_end = _Reflexes.Data + _Reflexes.Size; + for (ImTriangulatorNode** p = _Reflexes.Data; p < p_end; p++) + { + ImTriangulatorNode* reflex = *p; + if (reflex->Index != i0 && reflex->Index != i1 && reflex->Index != i2) + if (ImTriangleContainsPoint(v0, v1, v2, reflex->Pos)) + return false; + } + return true; +} + +void ImTriangulator::ReclassifyNode(ImTriangulatorNode* n1) +{ + // Classify node + ImTriangulatorNodeType type; + const ImTriangulatorNode* n0 = n1->Prev; + const ImTriangulatorNode* n2 = n1->Next; + if (!ImTriangleIsClockwise(n0->Pos, n1->Pos, n2->Pos)) + type = ImTriangulatorNodeType_Reflex; + else if (IsEar(n0->Index, n1->Index, n2->Index, n0->Pos, n1->Pos, n2->Pos)) + type = ImTriangulatorNodeType_Ear; + else + type = ImTriangulatorNodeType_Convex; + + // Update lists when a type changes + if (type == n1->Type) + return; + if (n1->Type == ImTriangulatorNodeType_Reflex) + _Reflexes.find_erase_unsorted(n1->Index); + else if (n1->Type == ImTriangulatorNodeType_Ear) + _Ears.find_erase_unsorted(n1->Index); + if (type == ImTriangulatorNodeType_Reflex) + _Reflexes.push_back(n1); + else if (type == ImTriangulatorNodeType_Ear) + _Ears.push_back(n1); + n1->Type = type; +} + +// Use ear-clipping algorithm to triangulate a simple polygon (no self-interaction, no holes). +// (Reminder: we don't perform any coarse clipping/culling in ImDrawList layer! +// It is up to caller to ensure not making costly calls that will be outside of visible area. +// As concave fill is noticeably more expensive than other primitives, be mindful of this... +// Caller can build AABB of points, and avoid filling if 'draw_list->_CmdHeader.ClipRect.Overlays(points_bb) == false') +void ImDrawList::AddConcavePolyFilled(const ImVec2* points, const int points_count, ImU32 col) +{ + if (points_count < 3 || (col & IM_COL32_A_MASK) == 0) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + ImTriangulator triangulator; + unsigned int triangle[3]; + if (Flags & ImDrawListFlags_AntiAliasedFill) + { + // Anti-aliased Fill + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + const int idx_count = (points_count - 2) * 3 + points_count * 6; + const int vtx_count = (points_count * 2); + PrimReserve(idx_count, vtx_count); + + // Add indexes for fill + unsigned int vtx_inner_idx = _VtxCurrentIdx; + unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; + + _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2)); + triangulator.Init(points, points_count, _Data->TempBuffer.Data); + while (triangulator._TrianglesLeft > 0) + { + triangulator.GetNextTriangle(triangle); + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (triangle[0] << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (triangle[1] << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (triangle[2] << 1)); + _IdxWritePtr += 3; + } + + // Compute normals + _Data->TempBuffer.reserve_discard(points_count); + ImVec2* temp_normals = _Data->TempBuffer.Data; + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + const ImVec2& p0 = points[i0]; + const ImVec2& p1 = points[i1]; + float dx = p1.x - p0.x; + float dy = p1.y - p0.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i0].x = dy; + temp_normals[i0].y = -dx; + } + + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + // Average normals + const ImVec2& n0 = temp_normals[i0]; + const ImVec2& n1 = temp_normals[i1]; + float dm_x = (n0.x + n1.x) * 0.5f; + float dm_y = (n0.y + n1.y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= AA_SIZE * 0.5f; + dm_y *= AA_SIZE * 0.5f; + + // Add vertices + _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner + _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer + _VtxWritePtr += 2; + + // Add indexes for fringes + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); + _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); + _IdxWritePtr += 6; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // Non Anti-aliased Fill + const int idx_count = (points_count - 2) * 3; + const int vtx_count = points_count; + PrimReserve(idx_count, vtx_count); + for (int i = 0; i < vtx_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr++; + } + _Data->TempBuffer.reserve_discard((ImTriangulator::EstimateScratchBufferSize(points_count) + sizeof(ImVec2)) / sizeof(ImVec2)); + triangulator.Init(points, points_count, _Data->TempBuffer.Data); + while (triangulator._TrianglesLeft > 0) + { + triangulator.GetNextTriangle(triangle); + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx + triangle[0]); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + triangle[1]); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + triangle[2]); + _IdxWritePtr += 3; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } +} //----------------------------------------------------------------------------- // [SECTION] ImDrawListSplitter @@ -1808,6 +2163,63 @@ void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) // [SECTION] ImDrawData //----------------------------------------------------------------------------- +void ImDrawData::Clear() +{ + Valid = false; + CmdListsCount = TotalIdxCount = TotalVtxCount = 0; + CmdLists.resize(0); // The ImDrawList are NOT owned by ImDrawData but e.g. by ImGuiContext, so we don't clear them. + DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.0f, 0.0f); + OwnerViewport = NULL; +} + +// Important: 'out_list' is generally going to be draw_data->CmdLists, but may be another temporary list +// as long at it is expected that the result will be later merged into draw_data->CmdLists[]. +void ImGui::AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector* out_list, ImDrawList* draw_list) +{ + if (draw_list->CmdBuffer.Size == 0) + return; + if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) + return; + + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + // May trigger for you if you are using PrimXXX functions incorrectly. + IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); + IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); + if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + + // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) + // If this assert triggers because you are drawing lots of stuff manually: + // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. + // Be mindful that the lower-level ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. + // - If you want large meshes with more than 64K vertices, you can either: + // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. + // Most example backends already support this from 1.71. Pre-1.71 backends won't. + // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. + // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. + // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: + // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); + // Your own engine or render API may use different parameters or function calls to specify index sizes. + // 2 and 4 bytes indices are generally supported by most graphics API. + // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching + // the 64K limit to split your draw commands in multiple draw lists. + if (sizeof(ImDrawIdx) == 2) + IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); + + // Add to output list + records state in ImDrawData + out_list->push_back(draw_list); + draw_data->CmdListsCount++; + draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; + draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; +} + +void ImDrawData::AddDrawList(ImDrawList* draw_list) +{ + IM_ASSERT(CmdLists.Size == CmdListsCount); + draw_list->_PopUnusedDrawCmd(); + ImGui::AddDrawListToDrawDataEx(this, &CmdLists, draw_list); +} + // For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! void ImDrawData::DeIndexAllBuffers() { @@ -1832,15 +2244,9 @@ void ImDrawData::DeIndexAllBuffers() // or if there is a difference between your window resolution and framebuffer resolution. void ImDrawData::ScaleClipRects(const ImVec2& fb_scale) { - for (int i = 0; i < CmdListsCount; i++) - { - ImDrawList* cmd_list = CmdLists[i]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) - { - ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; - cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y); - } - } + for (ImDrawList* draw_list : CmdLists) + for (ImDrawCmd& cmd : draw_list->CmdBuffer) + cmd.ClipRect = ImVec4(cmd.ClipRect.x * fb_scale.x, cmd.ClipRect.y * fb_scale.y, cmd.ClipRect.z * fb_scale.x, cmd.ClipRect.w * fb_scale.y); } //----------------------------------------------------------------------------- @@ -1896,6 +2302,14 @@ void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int ve } } +void ImGui::ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out) +{ + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->pos = ImRotate(vertex->pos- pivot_in, cos_a, sin_a) + pivot_out; +} + //----------------------------------------------------------------------------- // [SECTION] ImFontConfig //----------------------------------------------------------------------------- @@ -1904,10 +2318,11 @@ ImFontConfig::ImFontConfig() { memset(this, 0, sizeof(*this)); FontDataOwnedByAtlas = true; - OversampleH = 3; // FIXME: 2 may be a better default? + OversampleH = 2; OversampleV = 1; GlyphMaxAdvanceX = FLT_MAX; RasterizerMultiply = 1.0f; + RasterizerDensity = 1.0f; EllipsisChar = (ImWchar)-1; } @@ -1981,19 +2396,19 @@ ImFontAtlas::~ImFontAtlas() void ImFontAtlas::ClearInputData() { IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); - for (int i = 0; i < ConfigData.Size; i++) - if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) + for (ImFontConfig& font_cfg : ConfigData) + if (font_cfg.FontData && font_cfg.FontDataOwnedByAtlas) { - IM_FREE(ConfigData[i].FontData); - ConfigData[i].FontData = NULL; + IM_FREE(font_cfg.FontData); + font_cfg.FontData = NULL; } // When clearing this we lose access to the font name and other information used to build the font. - for (int i = 0; i < Fonts.Size; i++) - if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) + for (ImFont* font : Fonts) + if (font->ConfigData >= ConfigData.Data && font->ConfigData < ConfigData.Data + ConfigData.Size) { - Fonts[i]->ConfigData = NULL; - Fonts[i]->ConfigDataCount = 0; + font->ConfigData = NULL; + font->ConfigDataCount = 0; } ConfigData.clear(); CustomRects.clear(); @@ -2090,6 +2505,8 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; + ImFontAtlasUpdateConfigDataPointers(this); + // Invalidate texture TexReady = false; ClearTexData(); @@ -2126,7 +2543,7 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) if (font_cfg.Name[0] == '\0') ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); font_cfg.EllipsisChar = (ImWchar)0x0085; - font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units + font_cfg.GlyphOffset.y = 1.0f * IM_TRUNC(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); @@ -2156,13 +2573,14 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, } // NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). -ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* font_data, int font_data_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) { IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); IM_ASSERT(font_cfg.FontData == NULL); - font_cfg.FontData = ttf_data; - font_cfg.FontDataSize = ttf_size; + IM_ASSERT(font_data_size > 100 && "Incorrect value for font_data_size!"); // Heuristic to prevent accidentally passing a wrong value to font_data_size. + font_cfg.FontData = font_data; + font_cfg.FontDataSize = font_data_size; font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels; if (glyph_ranges) font_cfg.GlyphRanges = glyph_ranges; @@ -2355,6 +2773,9 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) dst_tmp_array.resize(atlas->Fonts.Size); memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); + ImVector src_tmp_array_skip; + src_tmp_array_skip.resize(atlas->ConfigData.Size); + memset(src_tmp_array_skip.Data, 0, (size_t)src_tmp_array_skip.size_in_bytes()); // 1. Initialize font loading structure, check font data validity for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++) @@ -2377,7 +2798,11 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) - return false; + { + IM_ASSERT(0 && "stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize."); + src_tmp_array_skip[src_i] = true; + continue; + } // Measure highest codepoints ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; @@ -2397,6 +2822,8 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) int total_glyphs_count = 0; for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) { + if (src_tmp_array_skip[src_i]) + continue; ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); @@ -2423,6 +2850,8 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) // 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another) for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) { + if (src_tmp_array_skip[src_i]) + continue; ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); UnpackBitVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); @@ -2459,7 +2888,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) // Convert our ranges in the format stb_truetype wants ImFontConfig& cfg = atlas->ConfigData[src_i]; - src_tmp.PackRange.font_size = cfg.SizePixels; + src_tmp.PackRange.font_size = cfg.SizePixels * cfg.RasterizerDensity; src_tmp.PackRange.first_unicode_codepoint_in_range = 0; src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data; src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size; @@ -2468,7 +2897,7 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV; // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects) - const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels); + const float scale = (cfg.SizePixels > 0.0f) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels * cfg.RasterizerDensity) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels * cfg.RasterizerDensity); const int padding = atlas->TexGlyphPadding; for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++) { @@ -2553,6 +2982,8 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) // 9. Setup ImFont and glyphs for runtime for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) { + if (src_tmp_array_skip[src_i]) + continue; // When merging fonts with MergeMode=true: // - We can have multiple input fonts writing into a same destination font. // - dst_font->ConfigData is != from cfg which is our source configuration. @@ -2564,12 +2995,14 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) int unscaled_ascent, unscaled_descent, unscaled_line_gap; stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); - const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1)); - const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); + const float ascent = ImCeil(unscaled_ascent * font_scale); + const float descent = ImFloor(unscaled_descent * font_scale); ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); const float font_off_x = cfg.GlyphOffset.x; const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); + const float inv_rasterization_scale = 1.0f / cfg.RasterizerDensity; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) { // Register glyph @@ -2578,7 +3011,11 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) stbtt_aligned_quad q; float unused_x = 0.0f, unused_y = 0.0f; stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); - dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); + float x0 = q.x0 * inv_rasterization_scale + font_off_x; + float y0 = q.y0 * inv_rasterization_scale + font_off_y; + float x1 = q.x1 * inv_rasterization_scale + font_off_x; + float y1 = q.y1 * inv_rasterization_scale + font_off_y; + dst_font->AddGlyph(&cfg, (ImWchar)codepoint, x0, y0, x1, y1, q.s0, q.t0, q.s1, q.t1, pc.xadvance * inv_rasterization_scale); } } @@ -2598,19 +3035,31 @@ const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() #endif // IMGUI_ENABLE_STB_TRUETYPE +void ImFontAtlasUpdateConfigDataPointers(ImFontAtlas* atlas) +{ + for (ImFontConfig& font_cfg : atlas->ConfigData) + { + ImFont* font = font_cfg.DstFont; + if (!font_cfg.MergeMode) + { + font->ConfigData = &font_cfg; + font->ConfigDataCount = 0; + } + font->ConfigDataCount++; + } +} + void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) { if (!font_config->MergeMode) { font->ClearOutputData(); font->FontSize = font_config->SizePixels; - font->ConfigData = font_config; - font->ConfigDataCount = 0; + IM_ASSERT(font->ConfigData == font_config); font->ContainerAtlas = atlas; font->Ascent = ascent; font->Descent = descent; } - font->ConfigDataCount++; } void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque) @@ -2757,6 +3206,13 @@ static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) // Note: this is called / shared by both the stb_truetype and the FreeType builder void ImFontAtlasBuildInit(ImFontAtlas* atlas) { + // Round font size + // - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet. + // - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes. + // - We may support it better later and remove this rounding. + for (ImFontConfig& cfg : atlas->ConfigData) + cfg.SizePixels = ImTrunc(cfg.SizePixels); + // Register texture region for mouse cursors or standard white pixels if (atlas->PackIdMouseCursors < 0) { @@ -2798,9 +3254,9 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas) } // Build all fonts lookup tables - for (int i = 0; i < atlas->Fonts.Size; i++) - if (atlas->Fonts[i]->DirtyLookupTables) - atlas->Fonts[i]->BuildLookupTable(); + for (ImFont* font : atlas->Fonts) + if (font->DirtyLookupTables) + font->BuildLookupTable(); atlas->TexReady = true; } @@ -3165,6 +3621,7 @@ void ImFont::BuildLookupTable() max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); // Build lookup table + IM_ASSERT(Glyphs.Size > 0 && "Font has not loaded glyph!"); IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved IndexAdvanceX.clear(); IndexLookup.clear(); @@ -3281,7 +3738,7 @@ void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, floa advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); if (advance_x != advance_x_original) { - float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; + float char_off_x = cfg->PixelSnapH ? ImTrunc((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; x0 += char_off_x; x1 += char_off_x; } @@ -3549,8 +4006,8 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, Im if (glyph->Colored) col |= ~IM_COL32_A_MASK; float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); + float x = IM_TRUNC(pos.x); + float y = IM_TRUNC(pos.y); draw_list->PrimReserve(6, 4); draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); } @@ -3562,8 +4019,8 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. // Align to be pixel perfect - float x = IM_FLOOR(pos.x); - float y = IM_FLOOR(pos.y); + float x = IM_TRUNC(pos.x); + float y = IM_TRUNC(pos.y); if (y > clip_rect.w) return; @@ -3634,6 +4091,8 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im { x = start_x; y += line_height; + if (y > clip_rect.w) + break; // break out of main loop word_wrap_eol = NULL; s = CalcWordWrapNextLineStartA(s, text_end); // Wrapping skips upcoming blanks continue; @@ -3863,8 +4322,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im } else { - draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL - draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR + draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b); // BL + draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e); // TR } if (p1.x > rect.Min.x + rounding) { @@ -3883,8 +4342,8 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im } else { - draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR - draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR + draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b); // TR + draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e); // BR } } draw_list->PathFillConvex(col); @@ -4071,8 +4530,8 @@ static unsigned int stb_decompress(unsigned char *output, const unsigned char *i //----------------------------------------------------------------------------- // ProggyClean.ttf // Copyright (c) 2004, 2005 Tristan Grimmer -// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) -// Download and more information at http://upperbounds.net +// MIT license (see License.txt in http://www.proggyfonts.net/index.php?menu=download) +// Download and more information at http://www.proggyfonts.net or http://upperboundsinteractive.com/fonts.php //----------------------------------------------------------------------------- // File: 'ProggyClean.ttf' (41208 bytes) // Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). diff --git a/core/deps/imgui/imgui_internal.h b/core/deps/imgui/imgui_internal.h index 1ec002b8b..de7d49029 100644 --- a/core/deps/imgui/imgui_internal.h +++ b/core/deps/imgui/imgui_internal.h @@ -1,12 +1,7 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (internal structures/api) // You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility. -// To implement maths operators for ImVec2 (disabled by default to not conflict with using IM_VEC2_CLASS_EXTRA with your own math types+operators), use: -/* -#define IMGUI_DEFINE_MATH_OPERATORS -#include "imgui_internal.h" -*/ /* @@ -19,10 +14,13 @@ Index of this file: // [SECTION] Macros // [SECTION] Generic helpers // [SECTION] ImDrawList support +// [SECTION] Data types support // [SECTION] Widgets support: flags, enums, data structures +// [SECTION] Popup support // [SECTION] Inputs support // [SECTION] Clipper support // [SECTION] Navigation support +// [SECTION] Typing-select support // [SECTION] Columns support // [SECTION] Multi-select support // [SECTION] Docking support @@ -81,7 +79,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' #endif #pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' -#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloor() #pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h #pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h #pragma clang diagnostic ignored "-Wold-style-cast" @@ -89,6 +87,8 @@ Index of this file: #pragma clang diagnostic ignored "-Wdouble-promotion" #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision #pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn' +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind @@ -126,7 +126,7 @@ struct ImDrawListSharedData; // Data shared between all ImDrawList instan struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it struct ImGuiContext; // Main Dear ImGui context struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine -struct ImGuiDataVarInfo; // Variable information (e.g. to avoid style variables from an enum) +struct ImGuiDataVarInfo; // Variable information (e.g. to access style variables from an enum) struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box @@ -135,6 +135,7 @@ struct ImGuiLastItemData; // Status storage for last submitted items struct ImGuiLocEntry; // A localization entry. struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result +struct ImGuiNavTreeNodeData; // Temporary storage for last TreeNode() being a Left arrow landing candidate. struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions struct ImGuiNextWindowData; // Storage for SetNextWindow** functions struct ImGuiNextItemData; // Storage for SetNextItem** functions @@ -147,11 +148,14 @@ struct ImGuiStyleMod; // Stacked style modifier, backup of modifie struct ImGuiTabBar; // Storage for a tab bar struct ImGuiTabItem; // Storage for a tab item (within a tab bar) struct ImGuiTable; // Storage for a table +struct ImGuiTableHeaderData; // Storage for TableAngledHeadersRow() struct ImGuiTableColumn; // Storage for one column of a table struct ImGuiTableInstanceData; // Storage for one instance of a same table struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. struct ImGuiTableSettings; // Storage for a table .ini settings struct ImGuiTableColumnsSettings; // Storage for a column .ini settings +struct ImGuiTypingSelectState; // Storage for GetTypingSelectRequest() +struct ImGuiTypingSelectRequest; // Storage for GetTypingSelectRequest() (aimed to be public) struct ImGuiWindow; // Storage for one window struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) @@ -165,7 +169,6 @@ typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // E typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later) typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags typedef int ImGuiFocusRequestFlags; // -> enum ImGuiFocusRequestFlags_ // Flags: for FocusWindow(); -typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc. typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() @@ -177,6 +180,8 @@ typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // F typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() +typedef int ImGuiTypingSelectFlags; // -> enum ImGuiTypingSelectFlags_ // Flags: for GetTypingSelectRequest() +typedef int ImGuiWindowRefreshFlags; // -> enum ImGuiWindowRefreshFlags_ // Flags: for SetNextWindowRefreshPolicy() typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); @@ -196,13 +201,13 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer namespace ImStb { -#undef STB_TEXTEDIT_STRING -#undef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_STRING ImGuiInputTextState -#define STB_TEXTEDIT_CHARTYPE ImWchar -#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#undef IMSTB_TEXTEDIT_STRING +#undef IMSTB_TEXTEDIT_CHARTYPE +#define IMSTB_TEXTEDIT_STRING ImGuiInputTextState +#define IMSTB_TEXTEDIT_CHARTYPE ImWchar +#define IMSTB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) +#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99 +#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999 #include "imstb_textedit.h" } // namespace ImStb @@ -227,13 +232,14 @@ namespace ImStb #else #define IMGUI_DEBUG_LOG(...) ((void)0) #endif -#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) -#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) // Static Asserts #define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") @@ -266,8 +272,13 @@ namespace ImStb #define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 #define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose #define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 -#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds +#define IM_TRUNC(_VAL) ((float)(int)(_VAL)) // ImTrunc() is not inlined in MSVC debug builds #define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // +#define IM_STRINGIFY_HELPER(_X) #_X +#define IM_STRINGIFY(_X) IM_STRINGIFY_HELPER(_X) // Preprocessor idiom to stringify e.g. an integer. +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +#define IM_FLOOR IM_TRUNC +#endif // Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall #ifdef _MSC_VER @@ -292,16 +303,28 @@ namespace ImStb #elif defined(__clang__) #define IM_DEBUG_BREAK() __builtin_debugtrap() #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03") +#define IM_DEBUG_BREAK() __asm__ volatile("int3;nop") #elif defined(__GNUC__) && defined(__thumb__) #define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01") #elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__) -#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0"); +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0") #else #define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! #endif #endif // #ifndef IM_DEBUG_BREAK +// Format specifiers, printing 64-bit hasn't been decently standardized... +// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. +#if defined(_MSC_VER) && !defined(__clang__) +#define IM_PRId64 "I64d" +#define IM_PRIu64 "I64u" +#define IM_PRIX64 "I64X" +#else +#define IM_PRId64 "lld" +#define IM_PRIu64 "llu" +#define IM_PRIX64 "llX" +#endif + //----------------------------------------------------------------------------- // [SECTION] Generic helpers // Note that the ImXXX helpers functions are lower-level than ImGui functions. @@ -345,18 +368,18 @@ static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } // Helpers: String -IMGUI_API int ImStricmp(const char* str1, const char* str2); -IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); -IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); -IMGUI_API char* ImStrdup(const char* str); -IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); -IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); -IMGUI_API int ImStrlenW(const ImWchar* str); +IMGUI_API int ImStricmp(const char* str1, const char* str2); // Case insensitive compare. +IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); // Case insensitive compare to a certain count. +IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); // Copy to a certain count and always zero terminate (strncpy doesn't). +IMGUI_API char* ImStrdup(const char* str); // Duplicate a string. +IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); // Copy in provided buffer, recreate buffer if needed. +IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); // Find first occurrence of 'c' in string range. IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line -IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line -IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); -IMGUI_API void ImStrTrimBlanks(char* str); -IMGUI_API const char* ImStrSkipBlank(const char* str); +IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); // Find a substring in a string range. +IMGUI_API void ImStrTrimBlanks(char* str); // Remove leading and trailing blanks from a buffer. +IMGUI_API const char* ImStrSkipBlank(const char* str); // Find first non-blank character. +IMGUI_API int ImStrlenW(const ImWchar* str); // Computer string length (ImWchar string) +IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line (ImWchar string) IM_MSVC_RUNTIME_CHECKS_OFF static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; } static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } @@ -383,6 +406,8 @@ IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, co IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 +IMGUI_API const char* ImTextFindPreviousUtf8Codepoint(const char* in_text_start, const char* in_text_curr); // return previous UTF-8 code-point. +IMGUI_API int ImTextCountLines(const char* in_text, const char* in_text_end); // return number of lines taken by text. trailing carriage return doesn't count as an extra line. // Helpers: File System #ifdef IMGUI_DISABLE_FILE_FUNCTIONS @@ -418,7 +443,6 @@ IM_MSVC_RUNTIME_CHECKS_OFF #define ImAcos(X) acosf(X) #define ImAtan2(Y, X) atan2f((Y), (X)) #define ImAtof(STR) atof(STR) -//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() #define ImCeil(X) ceilf(X) static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision static inline double ImPow(double x, double y) { return pow(x, y); } @@ -448,7 +472,7 @@ template static inline T ImSubClampOverflow(T a, T b, T mn, T mx) // - Misc maths helpers static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); } static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); } -static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } +static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2&mn, const ImVec2&mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } @@ -456,10 +480,10 @@ static inline float ImSaturate(float f) static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; } -static inline float ImFloor(float f) { return (float)(int)(f); } -static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() -static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } -static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); } +static inline float ImTrunc(float f) { return (float)(int)(f); } +static inline ImVec2 ImTrunc(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } +static inline float ImFloor(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() +static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2(ImFloor(v.x), ImFloor(v.y)); } static inline int ImModPositive(int a, int b) { return (a + b) % b; } static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } @@ -478,7 +502,8 @@ IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); -inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +inline bool ImTriangleIsClockwise(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ((b.x - a.x) * (c.y - b.y)) - ((c.x - b.x) * (b.y - a.y)) > 0.0f; } // Helper: ImVec1 (1D vector) // (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) @@ -522,6 +547,7 @@ struct IMGUI_API ImRect ImVec2 GetBR() const { return Max; } // Bottom-right bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } + bool ContainsWithPad(const ImVec2& p, const ImVec2& pad) const { return p.x >= Min.x - pad.x && p.y >= Min.y - pad.y && p.x < Max.x + pad.x && p.y < Max.y + pad.y; } bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } @@ -532,7 +558,7 @@ struct IMGUI_API ImRect void TranslateY(float dy) { Min.y += dy; Max.y += dy; } void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. - void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } + void Floor() { Min.x = IM_TRUNC(Min.x); Min.y = IM_TRUNC(Min.y); Max.x = IM_TRUNC(Max.x); Max.y = IM_TRUNC(Max.y); } bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } }; @@ -671,9 +697,6 @@ struct ImPool int GetBufSize() const { return Buf.Size; } int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); } -#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304) -#endif }; // Helper: ImChunkStream<> @@ -697,7 +720,6 @@ struct ImChunkStream int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } void swap(ImChunkStream& rhs) { rhs.Buf.swap(Buf); } - }; // Helper: ImGuiTextIndex<> @@ -770,12 +792,44 @@ struct IMGUI_API ImDrawListSharedData struct ImDrawDataBuilder { - ImVector Layers[2]; // Global layers for: regular, tooltip + ImVector* Layers[2]; // Pointers to global layers for: regular, tooltip. LayersP[0] is owned by DrawData. + ImVector LayerData1; - void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } - void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } - int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } - IMGUI_API void FlattenIntoSingleLayer(); + ImDrawDataBuilder() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Data types support +//----------------------------------------------------------------------------- + +struct ImGuiDataVarInfo +{ + ImGuiDataType Type; + ImU32 Count; // 1+ + ImU32 Offset; // Offset in parent structure + void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); } +}; + +struct ImGuiDataTypeStorage +{ + ImU8 Data[8]; // Opaque storage to fit any data up to ImGuiDataType_COUNT +}; + +// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). +struct ImGuiDataTypeInfo +{ + size_t Size; // Size in bytes + const char* Name; // Short descriptive name for the type, for debugging + const char* PrintFmt; // Default printf format for the type + const char* ScanFmt; // Default scanf format for the type +}; + +// Extend ImGuiDataType_ +enum ImGuiDataTypePrivate_ +{ + ImGuiDataType_String = ImGuiDataType_COUNT + 1, + ImGuiDataType_Pointer, + ImGuiDataType_ID, }; //----------------------------------------------------------------------------- @@ -800,9 +854,11 @@ enum ImGuiItemFlags_ ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable() + ImGuiItemFlags_AllowOverlap = 1 << 9, // false // Allow being overlapped by another widget. Not-hovered to Hovered transition deferred by a frame. // Controlled by widget code ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature. + ImGuiItemFlags_HasSelectionUserData = 1 << 11, // false // Set by SetNextItemSelectionUserData() }; // Status flags for an already submitted item @@ -818,8 +874,9 @@ enum ImGuiItemStatusFlags_ ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. - ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon) - ImGuiItemStatusFlags_Visible = 1 << 9, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()). + ImGuiItemStatusFlags_Visible = 1 << 8, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()). + ImGuiItemStatusFlags_HasClipRect = 1 << 9, // g.LastItemData.ClipRect is valid. + ImGuiItemStatusFlags_HasShortcut = 1 << 10, // g.LastItemData.Shortcut valid. Set by SetNextItemShortcut() -> ItemAdd(). // Additional status + semantic for ImGuiTestEngine #ifdef IMGUI_ENABLE_TEST_ENGINE @@ -831,6 +888,14 @@ enum ImGuiItemStatusFlags_ #endif }; +// Extend ImGuiHoveredFlags_ +enum ImGuiHoveredFlagsPrivate_ +{ + ImGuiHoveredFlags_DelayMask_ = ImGuiHoveredFlags_DelayNone | ImGuiHoveredFlags_DelayShort | ImGuiHoveredFlags_DelayNormal | ImGuiHoveredFlags_NoSharedDelay, + ImGuiHoveredFlags_AllowedMaskForIsWindowHovered = ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_NoPopupHierarchy | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary, + ImGuiHoveredFlags_AllowedMaskForIsItemHovered = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_ForTooltip | ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayMask_, +}; + // Extend ImGuiInputTextFlags_ enum ImGuiInputTextFlagsPrivate_ { @@ -838,6 +903,7 @@ enum ImGuiInputTextFlagsPrivate_ ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. + ImGuiInputTextFlags_LocalizeDecimalPoint= 1 << 29, // For internal use by InputScalar() and TempInputScalar() }; // Extend ImGuiButtonFlags_ @@ -851,13 +917,13 @@ enum ImGuiButtonFlagsPrivate_ ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping - ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() + ImGuiButtonFlags_AllowOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable. ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) - ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags) + ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used every time an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags) ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) @@ -875,7 +941,7 @@ enum ImGuiComboFlagsPrivate_ enum ImGuiSliderFlagsPrivate_ { ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? - ImGuiSliderFlags_ReadOnly = 1 << 21, + ImGuiSliderFlags_ReadOnly = 1 << 21, // Consider using g.NextItemData.ItemFlags |= ImGuiItemFlags_ReadOnly instead. }; // Extend ImGuiSelectableFlags_ @@ -896,6 +962,7 @@ enum ImGuiSelectableFlagsPrivate_ enum ImGuiTreeNodeFlagsPrivate_ { ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20, + ImGuiTreeNodeFlags_UpsideDownArrow = 1 << 21,// (FIXME-WIP) Turn Down arrow into an Up arrow, but reversed trees (#6517) }; enum ImGuiSeparatorFlags_ @@ -925,7 +992,7 @@ enum ImGuiTextFlags_ enum ImGuiTooltipFlags_ { ImGuiTooltipFlags_None = 0, - ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append) + ImGuiTooltipFlags_OverridePrevious = 1 << 1, // Clear/ignore previously submitted tooltip (defaults to append) }; // FIXME: this is in development, not exposed/functional as a generic feature yet. @@ -959,43 +1026,6 @@ enum ImGuiPlotType ImGuiPlotType_Histogram, }; -enum ImGuiPopupPositionPolicy -{ - ImGuiPopupPositionPolicy_Default, - ImGuiPopupPositionPolicy_ComboBox, - ImGuiPopupPositionPolicy_Tooltip, -}; - -struct ImGuiDataVarInfo -{ - ImGuiDataType Type; - ImU32 Count; // 1+ - ImU32 Offset; // Offset in parent structure - void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); } -}; - -struct ImGuiDataTypeTempStorage -{ - ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT -}; - -// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). -struct ImGuiDataTypeInfo -{ - size_t Size; // Size in bytes - const char* Name; // Short descriptive name for the type, for debugging - const char* PrintFmt; // Default printf format for the type - const char* ScanFmt; // Default scanf format for the type -}; - -// Extend ImGuiDataType_ -enum ImGuiDataTypePrivate_ -{ - ImGuiDataType_String = ImGuiDataType_COUNT + 1, - ImGuiDataType_Pointer, - ImGuiDataType_ID, -}; - // Stacked color modifier, backup of modified data so we can restore it struct ImGuiColorMod { @@ -1032,6 +1062,7 @@ struct IMGUI_API ImGuiGroupData ImGuiID WindowID; ImVec2 BackupCursorPos; ImVec2 BackupCursorMaxPos; + ImVec2 BackupCursorPosPrevLine; ImVec1 BackupIndent; ImVec1 BackupGroupOffset; ImVec2 BackupCurrLineSize; @@ -1039,6 +1070,7 @@ struct IMGUI_API ImGuiGroupData ImGuiID BackupActiveIdIsAlive; bool BackupActiveIdPreviousFrameIsAlive; bool BackupHoveredIdIsAlive; + bool BackupIsSameLine; bool EmitItem; }; @@ -1078,7 +1110,7 @@ struct IMGUI_API ImGuiInputTextState int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. ImVector TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. ImVector TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. - ImVector InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) + ImVector InitialTextA; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered) bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) int BufCapacityA; // end-user buffer capacity float ScrollX; // horizontal scrolling/offset @@ -1088,12 +1120,15 @@ struct IMGUI_API ImGuiInputTextState bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection bool Edited; // edited this frame ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set. + bool ReloadUserBuf; // force a reload of user buf so it may be modified externally. may be automatic in future version. + int ReloadSelectionStart; // POSITIONS ARE IN IMWCHAR units *NOT* UTF-8 this is why this is not exposed yet. + int ReloadSelectionEnd; ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } int GetUndoAvailCount() const { return Stb.undostate.undo_point; } - int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } + int GetRedoAvailCount() const { return IMSTB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation // Cursor & Selection @@ -1105,21 +1140,25 @@ struct IMGUI_API ImGuiInputTextState int GetSelectionStart() const { return Stb.select_start; } int GetSelectionEnd() const { return Stb.select_end; } void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } + + // Reload user buf (WIP #2890) + // If you modify underlying user-passed const char* while active you need to call this (InputText V2 may lift this) + // strcpy(my_buf, "hello"); + // if (ImGuiInputTextState* state = ImGui::GetInputTextState(id)) // id may be ImGui::GetItemID() is last item + // state->ReloadUserBufAndSelectAll(); + void ReloadUserBufAndSelectAll() { ReloadUserBuf = true; ReloadSelectionStart = 0; ReloadSelectionEnd = INT_MAX; } + void ReloadUserBufAndKeepSelection() { ReloadUserBuf = true; ReloadSelectionStart = Stb.select_start; ReloadSelectionEnd = Stb.select_end; } + void ReloadUserBufAndMoveToEnd() { ReloadUserBuf = true; ReloadSelectionStart = ReloadSelectionEnd = INT_MAX; } + }; -// Storage for current popup stack -struct ImGuiPopupData +enum ImGuiWindowRefreshFlags_ { - ImGuiID PopupId; // Set on OpenPopup() - ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() - ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close - int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value - int OpenFrameCount; // Set on OpenPopup() - ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) - ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) - ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup - - ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } + ImGuiWindowRefreshFlags_None = 0, + ImGuiWindowRefreshFlags_TryToAvoidRefresh = 1 << 0, // [EXPERIMENTAL] Try to keep existing contents, USER MUST NOT HONOR BEGIN() RETURNING FALSE AND NOT APPEND. + ImGuiWindowRefreshFlags_RefreshOnHover = 1 << 1, // [EXPERIMENTAL] Always refresh on hover + ImGuiWindowRefreshFlags_RefreshOnFocus = 1 << 2, // [EXPERIMENTAL] Always refresh on focus + // Refresh policy/frequency, Load Balancing etc. }; enum ImGuiNextWindowDataFlags_ @@ -1133,6 +1172,8 @@ enum ImGuiNextWindowDataFlags_ ImGuiNextWindowDataFlags_HasFocus = 1 << 5, ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, ImGuiNextWindowDataFlags_HasScroll = 1 << 7, + ImGuiNextWindowDataFlags_HasChildFlags = 1 << 8, + ImGuiNextWindowDataFlags_HasRefreshPolicy = 1 << 9, }; // Storage for SetNexWindow** functions @@ -1147,34 +1188,47 @@ struct ImGuiNextWindowData ImVec2 SizeVal; ImVec2 ContentSizeVal; ImVec2 ScrollVal; + ImGuiChildFlags ChildFlags; bool CollapsedVal; ImRect SizeConstraintRect; ImGuiSizeCallback SizeCallback; void* SizeCallbackUserData; float BgAlphaVal; // Override background alpha ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?) + ImGuiWindowRefreshFlags RefreshFlagsVal; ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } }; +// Multi-Selection item index or identifier when using SetNextItemSelectionUserData()/BeginMultiSelect() +// (Most users are likely to use this store an item INDEX but this may be used to store a POINTER as well.) +typedef ImS64 ImGuiSelectionUserData; + enum ImGuiNextItemDataFlags_ { - ImGuiNextItemDataFlags_None = 0, - ImGuiNextItemDataFlags_HasWidth = 1 << 0, - ImGuiNextItemDataFlags_HasOpen = 1 << 1, + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1, + ImGuiNextItemDataFlags_HasShortcut = 1 << 2, + ImGuiNextItemDataFlags_HasRefVal = 1 << 3, }; struct ImGuiNextItemData { ImGuiNextItemDataFlags Flags; - float Width; // Set by SetNextItemWidth() - ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) - ImGuiCond OpenCond; - bool OpenVal; // Set by SetNextItemOpen() + ImGuiItemFlags ItemFlags; // Currently only tested/used for ImGuiItemFlags_AllowOverlap. + // Non-flags members are NOT cleared by ItemAdd() meaning they are still valid during NavProcessItem() + ImGuiSelectionUserData SelectionUserData; // Set by SetNextItemSelectionUserData() (note that NULL/0 is a valid value, we use -1 == ImGuiSelectionUserData_Invalid to mark invalid values) + float Width; // Set by SetNextItemWidth() + ImGuiKeyChord Shortcut; // Set by SetNextItemShortcut() + ImGuiInputFlags ShortcutFlags; // Set by SetNextItemShortcut() + bool OpenVal; // Set by SetNextItemOpen() + ImU8 OpenCond; // Set by SetNextItemOpen() + ImGuiDataTypeStorage RefVal; // Not exposed yet, for ImGuiInputTextFlags_ParseEmptyAsRefVal - ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } - inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! + ImGuiNextItemData() { memset(this, 0, sizeof(*this)); SelectionUserData = -1; } + inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; ItemFlags = ImGuiItemFlags_None; } // Also cleared manually by ItemAdd()! }; // Status storage for the last submitted item @@ -1185,11 +1239,24 @@ struct ImGuiLastItemData ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_ ImRect Rect; // Full rectangle ImRect NavRect; // Navigation scoring rectangle (not displayed) - ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set) + // Rarely used fields are not explicitly cleared, only valid when the corresponding ImGuiItemStatusFlags ar set. + ImRect DisplayRect; // Display rectangle. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) is set. + ImRect ClipRect; // Clip rectangle at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasClipRect) is set.. + ImGuiKeyChord Shortcut; // Shortcut at the time of submitting item. ONLY VALID IF (StatusFlags & ImGuiItemStatusFlags_HasShortcut) is set.. ImGuiLastItemData() { memset(this, 0, sizeof(*this)); } }; +// Store data emitted by TreeNode() for usage by TreePop() to implement ImGuiTreeNodeFlags_NavLeftJumpsBackHere. +// This is the minimum amount of data that we need to perform the equivalent of NavApplyItemToResult() and which we can't infer in TreePop() +// Only stored when the node is a potential candidate for landing on a Left arrow jump. +struct ImGuiNavTreeNodeData +{ + ImGuiID ID; + ImGuiItemFlags InFlags; + ImRect NavRect; +}; + struct IMGUI_API ImGuiStackSizes { short SizeOfIDStack; @@ -1210,9 +1277,10 @@ struct IMGUI_API ImGuiStackSizes // Data saved for each window pushed into the stack struct ImGuiWindowStackData { - ImGuiWindow* Window; - ImGuiLastItemData ParentLastItemDataBackup; - ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting + ImGuiWindow* Window; + ImGuiLastItemData ParentLastItemDataBackup; + ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting + bool DisabledOverrideReenable; // Non-child window override disabled flag }; struct ImGuiShrinkWidthItem @@ -1231,6 +1299,32 @@ struct ImGuiPtrOrIndex ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } }; +//----------------------------------------------------------------------------- +// [SECTION] Popup support +//----------------------------------------------------------------------------- + +enum ImGuiPopupPositionPolicy +{ + ImGuiPopupPositionPolicy_Default, + ImGuiPopupPositionPolicy_ComboBox, + ImGuiPopupPositionPolicy_Tooltip, +}; + +// Storage for popup stacks (g.OpenPopupStack and g.BeginPopupStack) +struct ImGuiPopupData +{ + ImGuiID PopupId; // Set on OpenPopup() + ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() + ImGuiWindow* RestoreNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close + int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value + int OpenFrameCount; // Set on OpenPopup() + ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) + ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) + ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup + + ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } +}; + //----------------------------------------------------------------------------- // [SECTION] Inputs support //----------------------------------------------------------------------------- @@ -1278,7 +1372,6 @@ enum ImGuiInputSource ImGuiInputSource_Mouse, // Note: may be Mouse or TouchScreen or Pen. See io.MouseSource to distinguish them. ImGuiInputSource_Keyboard, ImGuiInputSource_Gamepad, - ImGuiInputSource_Clipboard, // Currently only used by InputText() ImGuiInputSource_COUNT }; @@ -1312,7 +1405,8 @@ struct ImGuiInputEvent // Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior. #define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. -#define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner. +#define ImGuiKeyOwner_NoOwner ((ImGuiID)-1) // Require key to have no owner. +//#define ImGuiKeyOwner_None ImGuiKeyOwner_NoOwner // We previously called this 'ImGuiKeyOwner_None' but it was inconsistent with our pattern that _None values == 0 and quite dangerous. Also using _NoOwner makes the IsKeyPressed() calls more explicit. typedef ImS16 ImGuiKeyRoutingIndex; @@ -1320,12 +1414,13 @@ typedef ImS16 ImGuiKeyRoutingIndex; struct ImGuiKeyRoutingData { ImGuiKeyRoutingIndex NextEntryIndex; - ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super. + ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. + ImU8 RoutingCurrScore; // [DEBUG] For debug display ImU8 RoutingNextScore; // Lower is better (0: perfect score) ImGuiID RoutingCurr; ImGuiID RoutingNext; - ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; } + ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingCurrScore = RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_NoOwner; } }; // Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching. @@ -1349,53 +1444,47 @@ struct ImGuiKeyOwnerData bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame. bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well. - ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; } + ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_NoOwner; LockThisFrame = LockUntilRelease = false; } }; +// Extend ImGuiInputFlags_ // Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() -// Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function) -enum ImGuiInputFlags_ -{ - // Flags for IsKeyPressed(), IsMouseClicked(), Shortcut() - ImGuiInputFlags_None = 0, - ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. - ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) - ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast - ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster - ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, - - // Flags for SetItemKeyOwner() - ImGuiInputFlags_CondHovered = 1 << 4, // Only set if item is hovered (default to both) - ImGuiInputFlags_CondActive = 1 << 5, // Only set if item is active (default to both) - ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, - ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, +// Don't mistake with ImGuiInputTextFlags! (which is for ImGui::InputText() function) +enum ImGuiInputFlagsPrivate_ +{ + // Flags for IsKeyPressed(), IsKeyChordPressed(), IsMouseClicked(), Shortcut() + // - Repeat mode: Repeat rate selection + ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) + ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast + ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster + // - Repeat mode: Specify when repeating key pressed can be interrupted. + // - In theory ImGuiInputFlags_RepeatUntilOtherKeyPress may be a desirable default, but it would break too many behavior so everything is opt-in. + ImGuiInputFlags_RepeatUntilRelease = 1 << 4, // Stop repeating when released (default for all functions except Shortcut). This only exists to allow overriding Shortcut() default behavior. + ImGuiInputFlags_RepeatUntilKeyModsChange = 1 << 5, // Stop repeating when released OR if keyboard mods are changed (default for Shortcut) + ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone = 1 << 6, // Stop repeating when released OR if keyboard mods are leaving the None state. Allows going from Mod+Key to Key by releasing Mod. + ImGuiInputFlags_RepeatUntilOtherKeyPress = 1 << 7, // Stop repeating when released OR if any other keyboard key is pressed during the repeat // Flags for SetKeyOwner(), SetItemKeyOwner() - ImGuiInputFlags_LockThisFrame = 1 << 6, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. - ImGuiInputFlags_LockUntilRelease = 1 << 7, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. + // - Locking key away from non-input aware code. Locking is useful to make input-owner-aware code steal keys from non-input-owner-aware code. If all code is input-owner-aware locking would never be necessary. + ImGuiInputFlags_LockThisFrame = 1 << 20, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. + ImGuiInputFlags_LockUntilRelease = 1 << 21, // Further accesses to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. - // Routing policies for Shortcut() + low-level SetShortcutRouting() - // - The general idea is that several callers register interest in a shortcut, and only one owner gets it. - // - When a policy (other than _RouteAlways) is set, Shortcut() will register itself with SetShortcutRouting(), - // allowing the system to decide where to route the input among other route-aware calls. - // - Shortcut() uses ImGuiInputFlags_RouteFocused by default: meaning that a simple Shortcut() poll - // will register a route and only succeed when parent window is in the focus stack and if no-one - // with a higher priority is claiming the shortcut. - // - Using ImGuiInputFlags_RouteAlways is roughly equivalent to doing e.g. IsKeyPressed(key) + testing mods. - // - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow. - // - Can select only 1 policy among all available. - ImGuiInputFlags_RouteFocused = 1 << 8, // (Default) Register focused route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window. - ImGuiInputFlags_RouteGlobalLow = 1 << 9, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority. - ImGuiInputFlags_RouteGlobal = 1 << 10, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText). - ImGuiInputFlags_RouteGlobalHigh = 1 << 11, // Register route globally (highest priority: unlikely you need to use that: will interfere with every active items) - ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this! - ImGuiInputFlags_RouteAlways = 1 << 12, // Do not register route, poll keys directly. - ImGuiInputFlags_RouteUnlessBgFocused= 1 << 13, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications. - ImGuiInputFlags_RouteExtraMask_ = ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused, + // - Condition for SetItemKeyOwner() + ImGuiInputFlags_CondHovered = 1 << 22, // Only set if item is hovered (default to both) + ImGuiInputFlags_CondActive = 1 << 23, // Only set if item is active (default to both) + ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, // [Internal] Mask of which function support which flags - ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_, - ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteExtraMask_, + ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, + ImGuiInputFlags_RepeatUntilMask_ = ImGuiInputFlags_RepeatUntilRelease | ImGuiInputFlags_RepeatUntilKeyModsChange | ImGuiInputFlags_RepeatUntilKeyModsChangeFromNone | ImGuiInputFlags_RepeatUntilOtherKeyPress, + ImGuiInputFlags_RepeatMask_ = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RepeatUntilMask_, + ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, + ImGuiInputFlags_RouteTypeMask_ = ImGuiInputFlags_RouteActive | ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteAlways, + ImGuiInputFlags_RouteOptionsMask_ = ImGuiInputFlags_RouteOverFocused | ImGuiInputFlags_RouteOverActive | ImGuiInputFlags_RouteUnlessBgFocused | ImGuiInputFlags_RouteFromRootWindow, + ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_RepeatMask_, + ImGuiInputFlags_SupportedByIsMouseClicked = ImGuiInputFlags_Repeat, + ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_, + ImGuiInputFlags_SupportedBySetNextItemShortcut = ImGuiInputFlags_RepeatMask_ | ImGuiInputFlags_RouteTypeMask_ | ImGuiInputFlags_RouteOptionsMask_ | ImGuiInputFlags_Tooltip, ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease, ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_, }; @@ -1440,6 +1529,8 @@ enum ImGuiActivateFlags_ ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key. ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used. ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) + ImGuiActivateFlags_FromTabbing = 1 << 3, // Activation requested by a tabbing request + ImGuiActivateFlags_FromShortcut = 1 << 4, // Activation requested by an item shortcut via SetNextItemShortcut() function. }; // Early work-in-progress API for ScrollToItem() @@ -1460,8 +1551,7 @@ enum ImGuiScrollFlags_ enum ImGuiNavHighlightFlags_ { ImGuiNavHighlightFlags_None = 0, - ImGuiNavHighlightFlags_TypeDefault = 1 << 0, - ImGuiNavHighlightFlags_TypeThin = 1 << 1, + ImGuiNavHighlightFlags_Compact = 1 << 1, // Compact highlight, no padding ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. ImGuiNavHighlightFlags_NoRounding = 1 << 3, }; @@ -1479,10 +1569,13 @@ enum ImGuiNavMoveFlags_ ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary ImGuiNavMoveFlags_Forwarded = 1 << 7, ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result - ImGuiNavMoveFlags_FocusApi = 1 << 9, - ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight - ImGuiNavMoveFlags_Activate = 1 << 11, - ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight + ImGuiNavMoveFlags_FocusApi = 1 << 9, // Requests from focus API can land/focus/activate items even if they are marked with _NoTabStop (see NavProcessItemForTabbingRequest() for details) + ImGuiNavMoveFlags_IsTabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight + ImGuiNavMoveFlags_IsPageMove = 1 << 11, // Identify a PageDown/PageUp request. + ImGuiNavMoveFlags_Activate = 1 << 12, // Activate/select target item. + ImGuiNavMoveFlags_NoSelect = 1 << 13, // Don't trigger selection by not setting g.NavJustMovedTo + ImGuiNavMoveFlags_NoSetNavHighlight = 1 << 14, // Do not alter the visible state of keyboard vs mouse nav highlight + ImGuiNavMoveFlags_NoClearActiveId = 1 << 15, // (Experimental) Do not clear active id when applying move result }; enum ImGuiNavLayer @@ -1492,6 +1585,7 @@ enum ImGuiNavLayer ImGuiNavLayer_COUNT }; +// Storage for navigation query/results struct ImGuiNavItemData { ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window) @@ -1502,16 +1596,61 @@ struct ImGuiNavItemData float DistBox; // Move // Best candidate box distance to current NavId float DistCenter; // Move // Best candidate center distance to current NavId float DistAxial; // Move // Best candidate axial distance to current NavId + ImGuiSelectionUserData SelectionUserData;//I+Mov // Best candidate SetNextItemSelectionData() value. ImGuiNavItemData() { Clear(); } - void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; } + void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; SelectionUserData = -1; DistBox = DistCenter = DistAxial = FLT_MAX; } +}; + +// Storage for PushFocusScope() +struct ImGuiFocusScopeData +{ + ImGuiID ID; + ImGuiID WindowID; +}; + +//----------------------------------------------------------------------------- +// [SECTION] Typing-select support +//----------------------------------------------------------------------------- + +// Flags for GetTypingSelectRequest() +enum ImGuiTypingSelectFlags_ +{ + ImGuiTypingSelectFlags_None = 0, + ImGuiTypingSelectFlags_AllowBackspace = 1 << 0, // Backspace to delete character inputs. If using: ensure GetTypingSelectRequest() is not called more than once per frame (filter by e.g. focus state) + ImGuiTypingSelectFlags_AllowSingleCharMode = 1 << 1, // Allow "single char" search mode which is activated when pressing the same character multiple times. +}; + +// Returned by GetTypingSelectRequest(), designed to eventually be public. +struct IMGUI_API ImGuiTypingSelectRequest +{ + ImGuiTypingSelectFlags Flags; // Flags passed to GetTypingSelectRequest() + int SearchBufferLen; + const char* SearchBuffer; // Search buffer contents (use full string. unless SingleCharMode is set, in which case use SingleCharSize). + bool SelectRequest; // Set when buffer was modified this frame, requesting a selection. + bool SingleCharMode; // Notify when buffer contains same character repeated, to implement special mode. In this situation it preferred to not display any on-screen search indication. + ImS8 SingleCharSize; // Length in bytes of first letter codepoint (1 for ascii, 2-4 for UTF-8). If (SearchBufferLen==RepeatCharSize) only 1 letter has been input. +}; + +// Storage for GetTypingSelectRequest() +struct IMGUI_API ImGuiTypingSelectState +{ + ImGuiTypingSelectRequest Request; // User-facing data + char SearchBuffer[64]; // Search buffer: no need to make dynamic as this search is very transient. + ImGuiID FocusScope; + int LastRequestFrame = 0; + float LastRequestTime = 0.0f; + bool SingleCharModeLock = false; // After a certain single char repeat count we lock into SingleCharMode. Two benefits: 1) buffer never fill, 2) we can provide an immediate SingleChar mode without timer elapsing. + + ImGuiTypingSelectState() { memset(this, 0, sizeof(*this)); } + void Clear() { SearchBuffer[0] = 0; SingleCharModeLock = false; } // We preserve remaining data for easier debugging }; //----------------------------------------------------------------------------- // [SECTION] Columns support //----------------------------------------------------------------------------- -// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! +// Flags for internal's BeginColumns(). This is an obsolete API. Prefer using BeginTable() nowadays! enum ImGuiOldColumnFlags_ { ImGuiOldColumnFlags_None = 0, @@ -1519,16 +1658,16 @@ enum ImGuiOldColumnFlags_ ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window - ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. + ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. // Obsolete names (will be removed) #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS - ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, - ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, - ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, - ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, - ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, - ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, + //ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, + //ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, + //ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, + //ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, + //ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, + //ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, #endif }; @@ -1567,6 +1706,9 @@ struct ImGuiOldColumns // [SECTION] Multi-select support //----------------------------------------------------------------------------- +// We always assume that -1 is an invalid value (which works for indices and pointers) +#define ImGuiSelectionUserData_Invalid ((ImGuiSelectionUserData)-1) + #ifdef IMGUI_HAS_MULTI_SELECT // #endif // #ifdef IMGUI_HAS_MULTI_SELECT @@ -1587,18 +1729,17 @@ struct ImGuiOldColumns // Every instance of ImGuiViewport is in fact a ImGuiViewportP. struct ImGuiViewportP : public ImGuiViewport { - int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used - ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. + int BgFgDrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used + ImDrawList* BgFgDrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. ImDrawData DrawDataP; - ImDrawDataBuilder DrawDataBuilder; - + ImDrawDataBuilder DrawDataBuilder; // Temporary data while building final ImDrawData ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. - ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } - ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } + ImGuiViewportP() { BgFgDrawListsLastFrame[0] = BgFgDrawListsLastFrame[1] = -1; BgFgDrawLists[0] = BgFgDrawLists[1] = NULL; } + ~ImGuiViewportP() { if (BgFgDrawLists[0]) IM_DELETE(BgFgDrawLists[0]); if (BgFgDrawLists[1]) IM_DELETE(BgFgDrawLists[1]); } // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } @@ -1624,6 +1765,7 @@ struct ImGuiWindowSettings ImVec2ih Pos; ImVec2ih Size; bool Collapsed; + bool IsChild; bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) bool WantDelete; // Set to invalidate/delete the settings entry @@ -1653,6 +1795,7 @@ struct ImGuiSettingsHandler // This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack. enum ImGuiLocKey : int { + ImGuiLocKey_VersionStr, ImGuiLocKey_TableSizeOne, ImGuiLocKey_TableSizeAllFit, ImGuiLocKey_TableSizeAllDefault, @@ -1677,30 +1820,53 @@ struct ImGuiLocEntry enum ImGuiDebugLogFlags_ { // Event types - ImGuiDebugLogFlags_None = 0, - ImGuiDebugLogFlags_EventActiveId = 1 << 0, - ImGuiDebugLogFlags_EventFocus = 1 << 1, - ImGuiDebugLogFlags_EventPopup = 1 << 2, - ImGuiDebugLogFlags_EventNav = 1 << 3, - ImGuiDebugLogFlags_EventClipper = 1 << 4, - ImGuiDebugLogFlags_EventSelection = 1 << 5, - ImGuiDebugLogFlags_EventIO = 1 << 6, - ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO, - ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY + ImGuiDebugLogFlags_None = 0, + ImGuiDebugLogFlags_EventActiveId = 1 << 0, + ImGuiDebugLogFlags_EventFocus = 1 << 1, + ImGuiDebugLogFlags_EventPopup = 1 << 2, + ImGuiDebugLogFlags_EventNav = 1 << 3, + ImGuiDebugLogFlags_EventClipper = 1 << 4, + ImGuiDebugLogFlags_EventSelection = 1 << 5, + ImGuiDebugLogFlags_EventIO = 1 << 6, + ImGuiDebugLogFlags_EventInputRouting = 1 << 7, + + ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting, + ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY + ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine +}; + +struct ImGuiDebugAllocEntry +{ + int FrameCount; + ImS16 AllocCount; + ImS16 FreeCount; +}; + +struct ImGuiDebugAllocInfo +{ + int TotalAllocCount; // Number of call to MemAlloc(). + int TotalFreeCount; + ImS16 LastEntriesIdx; // Current index in buffer + ImGuiDebugAllocEntry LastEntriesBuf[6]; // Track last 6 frames that had allocations + + ImGuiDebugAllocInfo() { memset(this, 0, sizeof(*this)); } }; struct ImGuiMetricsConfig { bool ShowDebugLog = false; - bool ShowStackTool = false; + bool ShowIDStackTool = false; bool ShowWindowsRects = false; bool ShowWindowsBeginOrder = false; bool ShowTablesRects = false; bool ShowDrawCmdMesh = true; bool ShowDrawCmdBoundingBoxes = true; + bool ShowTextEncodingViewer = false; bool ShowAtlasTintedWithTextColor = false; int ShowWindowsRectsType = -1; int ShowTablesRectsType = -1; + int HighlightMonitorIdx = -1; + ImGuiID HighlightViewportID = 0; }; struct ImGuiStackLevelInfo @@ -1714,8 +1880,8 @@ struct ImGuiStackLevelInfo ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); } }; -// State for Stack tool queries -struct ImGuiStackTool +// State for ID Stack tool queries +struct ImGuiIDStackTool { int LastActiveFrame; int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level @@ -1724,7 +1890,7 @@ struct ImGuiStackTool bool CopyToClipboardOnCtrlC; float CopyToClipboardLastTime; - ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } + ImGuiIDStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } }; //----------------------------------------------------------------------------- @@ -1758,6 +1924,7 @@ struct ImGuiContext ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. + float CurrentDpiScale; // Current window/viewport DpiScale ImDrawListSharedData DrawListSharedData; double Time; int FrameCount; @@ -1783,7 +1950,8 @@ struct ImGuiContext ImVector CurrentWindowStack; ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* int WindowsActiveCount; // Number of unique windows submitted by frame - ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) + ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING). + ImGuiID DebugBreakInWindow; // Set to break in Begin() call. ImGuiWindow* CurrentWindow; // Window being drawn into ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. @@ -1791,18 +1959,20 @@ struct ImGuiContext ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. ImVec2 WheelingWindowRefMousePos; int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL + int WheelingWindowScrolledFrame; float WheelingWindowReleaseTimer; ImVec2 WheelingWindowWheelRemainder; ImVec2 WheelingAxisAvg; // Item/widgets state and tracking information - ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] + ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by ID Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] ImGuiID HoveredId; // Hovered widget, filled during the frame ImGuiID HoveredIdPreviousFrame; - bool HoveredIdAllowOverlap; - bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. float HoveredIdTimer; // Measure contiguous hovering time float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active + bool HoveredIdAllowOverlap; + bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. + bool ItemUnclipByLog; // Disable ItemAdd() clipping, essentially a memory-locality friendly copy of LogEnabled ImGuiID ActiveId; // Active widget ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) float ActiveIdTimer; @@ -1812,10 +1982,11 @@ struct ImGuiContext bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. bool ActiveIdHasBeenEditedThisFrame; + bool ActiveIdFromShortcut; + int ActiveIdMouseButton : 8; ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) ImGuiWindow* ActiveIdWindow; ImGuiInputSource ActiveIdSource; // Activating source: ImGuiInputSource_Mouse OR ImGuiInputSource_Keyboard OR ImGuiInputSource_Gamepad - int ActiveIdMouseButton; ImGuiID ActiveIdPreviousFrame; bool ActiveIdPreviousFrameIsAlive; bool ActiveIdPreviousFrameHasBeenEditedBefore; @@ -1823,36 +1994,43 @@ struct ImGuiContext ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. - // [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system + // Key/Input Ownership + Shortcut Routing system // - The idea is that instead of "eating" a given key, we can link to an owner. - // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID. // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame(). + double LastKeyModsChangeTime; // Record the last time key mods changed (affect repeat delay when using shortcut logic) + double LastKeyModsChangeFromNoneTime; // Record the last time key mods changed away from being 0 (affect repeat delay when using shortcut logic) + double LastKeyboardKeyPressTime; // Record the last time a keyboard key (ignore mouse/gamepad ones) was pressed. + ImBitArrayForNamedKeys KeysMayBeCharInput; // Lookup to tell if a key can emit char input, see IsKeyChordPotentiallyCharInput(). sizeof() = 20 bytes ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT]; ImGuiKeyRoutingTable KeysRoutingTable; ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency) + ImGuiKeyChord DebugBreakInShortcutRouting; // Set to break in SetShortcutRouting()/Shortcut() calls. #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);' #endif // Next window/item data - ImGuiID CurrentFocusScopeId; // == g.FocusScopeStack.back() - ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() + ImGuiID CurrentFocusScopeId; // Value for currently appending items == g.FocusScopeStack.back(). Not to be mistaken with g.NavFocusScopeId. + ImGuiItemFlags CurrentItemFlags; // Value for currently appending items == g.ItemFlagsStack.back() ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd) ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + bool DebugShowGroupRects; // Shared stacks - ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() - ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() - ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() - ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin() - ImVectorItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() - ImVectorGroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() - ImVectorOpenPopupStack; // Which popups are open (persistent) - ImVectorBeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) - int BeginMenuCount; + ImGuiCol DebugFlashStyleColorIdx; // (Keep close to ColorStack to share cache line) + ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() + ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() + ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() + ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin() + ImVector ItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() + ImVector GroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() + ImVector OpenPopupStack; // Which popups are open (persistent) + ImVector BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) + ImVector NavTreeNodeStack; // Stack for TreeNode() when a NavLeft requested is emitted. // Viewports ImVector Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. @@ -1860,11 +2038,14 @@ struct ImGuiContext // Gamepad/keyboard Navigation ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow' ImGuiID NavId; // Focused item for navigation - ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) + ImGuiID NavFocusScopeId; // Focused focus scope (e.g. selection code often wants to "clear other items" when landing on an item of the same scope) ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem() ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0 ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat) ImGuiActivateFlags NavActivateFlags; + ImVector NavFocusRoute; // Reversed copy focus scope stack for NavId (should contains NavFocusScopeId). This essentially follow the window->ParentWindowForFocusRoute chain. + ImGuiID NavHighlightActivatedId; + float NavHighlightActivatedTimer; ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). ImGuiKeyChord NavJustMovedToKeyMods; @@ -1872,6 +2053,7 @@ struct ImGuiContext ImGuiActivateFlags NavNextActivateFlags; ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS CAN ONLY BE ImGuiInputSource_Keyboard or ImGuiInputSource_Mouse ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. + ImGuiSelectionUserData NavLastValidSelectionUserData; // Last valid data passed to SetNextItemSelectionUser(), or -1. For current window. Not reset when focusing an item that doesn't have selection data. bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) @@ -1902,20 +2084,20 @@ struct ImGuiContext ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) - ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828) - ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab + ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiKey_Tab on OS X). For reconfiguration (see #4828) + ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab (or ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab on OS X) ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents float NavWindowingTimer; float NavWindowingHighlightAlpha; bool NavWindowingToggleLayer; + ImGuiKey NavWindowingToggleKey; ImVec2 NavWindowingAccumDeltaPos; ImVec2 NavWindowingAccumDeltaSize; // Render float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) - ImGuiMouseCursor MouseCursor; // Drag and Drop bool DragDropActive; @@ -1926,6 +2108,7 @@ struct ImGuiContext int DragDropMouseButton; ImGuiPayload DragDropPayload; ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) + ImRect DragDropTargetClipRect; // Store ClipRect at the time of item's drawing ImGuiID DragDropTargetId; ImGuiDragDropFlags DragDropAcceptFlags; float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) @@ -1942,6 +2125,7 @@ struct ImGuiContext // Tables ImGuiTable* CurrentTable; + ImGuiID DebugBreakInTable; // Set to break in BeginTable() call. int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size) ImVector TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting) ImPool Tables; // Persistent table data @@ -1955,17 +2139,26 @@ struct ImGuiContext ImVector ShrinkWidthBuffer; // Hover Delay system - ImGuiID HoverDelayId; - ImGuiID HoverDelayIdPreviousFrame; - float HoverDelayTimer; // Currently used IsItemHovered(), generally inferred from g.HoveredIdTimer but kept uncleared until clear timer elapse. - float HoverDelayClearTimer; // Currently used IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared. + ImGuiID HoverItemDelayId; + ImGuiID HoverItemDelayIdPreviousFrame; + float HoverItemDelayTimer; // Currently used by IsItemHovered() + float HoverItemDelayClearTimer; // Currently used by IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared. + ImGuiID HoverItemUnlockedStationaryId; // Mouse has once been stationary on this item. Only reset after departing the item. + ImGuiID HoverWindowUnlockedStationaryId; // Mouse has once been stationary on this window. Only reset after departing the window. + + // Mouse state + ImGuiMouseCursor MouseCursor; + float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic) + ImVec2 MouseLastValidPos; // Widget state - ImVec2 MouseLastValidPos; ImGuiInputTextState InputTextState; ImGuiInputTextDeactivatedState InputTextDeactivatedState; ImFont InputTextPasswordFont; ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. + ImGuiDataTypeStorage DataTypeZeroValue; // 0 for all data types + int BeginMenuDepth; + int BeginComboDepth; ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others). ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for @@ -1974,23 +2167,27 @@ struct ImGuiContext ImU32 ColorEditSavedColor; // RGB value with alpha set to 0. ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. ImGuiComboPreviewData ComboPreviewData; + ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving + bool WindowResizeRelativeMode; + short ScrollbarSeekMode; // 0: relative, -1/+1: prev/next page. + float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? float SliderGrabClickOffset; float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? bool DragCurrentAccumDirty; float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio - float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled() short DisabledStackSize; + short LockMarkEdited; short TooltipOverrideCount; ImVector ClipboardHandlerData; // If no custom clipboard handler is defined ImVector MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once + ImGuiTypingSelectState TypingSelectState; // State for GetTypingSelectRequest() // Platform support ImGuiPlatformImeData PlatformImeData; // Data updated by current frame ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn - char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point // Settings bool SettingsLoaded; @@ -2019,17 +2216,24 @@ struct ImGuiContext int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. // Debug Tools + // (some of the highly frequently used data are interleaved in other structures above: DebugBreakXXX fields, DebugHookIdInfo, DebugLocateId etc.) ImGuiDebugLogFlags DebugLogFlags; ImGuiTextBuffer DebugLogBuf; ImGuiTextIndex DebugLogIndex; - ImU8 DebugLogClipperAutoDisableFrames; + ImGuiDebugLogFlags DebugLogAutoDisableFlags; + ImU8 DebugLogAutoDisableFrames; ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above. + bool DebugBreakInLocateId; // Debug break in ItemAdd() call for g.DebugLocateId. + ImGuiKeyChord DebugBreakKeyChord; // = ImGuiKey_Pause ImS8 DebugBeginReturnValueCullDepth; // Cycle between 0..9 then wrap around. bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) ImU8 DebugItemPickerMouseButton; ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID + float DebugFlashStyleColorTime; + ImVec4 DebugFlashStyleColorBackup; ImGuiMetricsConfig DebugMetricsConfig; - ImGuiStackTool DebugStackTool; + ImGuiIDStackTool DebugIDStackTool; + ImGuiDebugAllocInfo DebugAllocInfo; // Misc float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames.. @@ -2040,6 +2244,7 @@ struct ImGuiContext int WantCaptureKeyboardNextFrame; // " int WantTextInputNextFrame; ImVector TempBuffer; // Temporary text buffer + char TempKeychordName[64]; ImGuiContext(ImFontAtlas* shared_font_atlas) { @@ -2049,7 +2254,7 @@ struct ImGuiContext Initialized = false; FontAtlasOwnedByContext = shared_font_atlas ? false : true; Font = NULL; - FontSize = FontBaseSize = 0.0f; + FontSize = FontBaseSize = CurrentDpiScale = 0.0f; IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); Time = 0.0f; FrameCount = 0; @@ -2068,7 +2273,7 @@ struct ImGuiContext HoveredWindowUnderMovingWindow = NULL; MovingWindow = NULL; WheelingWindow = NULL; - WheelingWindowStartFrame = -1; + WheelingWindowStartFrame = WheelingWindowScrolledFrame = -1; WheelingWindowReleaseTimer = 0.0f; DebugHookIdInfo = 0; @@ -2076,6 +2281,7 @@ struct ImGuiContext HoveredIdAllowOverlap = false; HoveredIdDisabled = false; HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; + ItemUnclipByLog = false; ActiveId = 0; ActiveIdIsAlive = 0; ActiveIdTimer = 0.0f; @@ -2085,6 +2291,7 @@ struct ImGuiContext ActiveIdHasBeenPressedBefore = false; ActiveIdHasBeenEditedBefore = false; ActiveIdHasBeenEditedThisFrame = false; + ActiveIdFromShortcut = false; ActiveIdClickOffset = ImVec2(-1, -1); ActiveIdWindow = NULL; ActiveIdSource = ImGuiInputSource_None; @@ -2096,6 +2303,8 @@ struct ImGuiContext LastActiveId = 0; LastActiveIdTimer = 0.0f; + LastKeyboardKeyPressTime = LastKeyModsChangeTime = LastKeyModsChangeFromNoneTime = -1.0; + ActiveIdUsingNavDirMask = 0x00; ActiveIdUsingAllKeyboardKeys = false; #ifndef IMGUI_DISABLE_OBSOLETE_KEYIO @@ -2104,15 +2313,18 @@ struct ImGuiContext CurrentFocusScopeId = 0; CurrentItemFlags = ImGuiItemFlags_None; - BeginMenuCount = 0; + DebugShowGroupRects = false; NavWindow = NULL; NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = 0; NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None; + NavHighlightActivatedId = 0; + NavHighlightActivatedTimer = 0.0f; NavJustMovedToKeyMods = ImGuiMod_None; NavInputSource = ImGuiInputSource_Keyboard; NavLayer = ImGuiNavLayer_Main; + NavLastValidSelectionUserData = ImGuiSelectionUserData_Invalid; NavIdIsAlive = false; NavMousePosDirty = false; NavDisableHighlight = true; @@ -2131,14 +2343,16 @@ struct ImGuiContext NavTabbingDir = 0; NavTabbingCounter = 0; - ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab; - ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab; + // All platforms use Ctrl+Tab but Ctrl<>Super are swapped on Mac... + // FIXME: Because this value is stored, it annoyingly interfere with toggling io.ConfigMacOSXBehaviors updating this.. + ConfigNavWindowingKeyNext = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiKey_Tab); + ConfigNavWindowingKeyPrev = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab); NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; NavWindowingToggleLayer = false; + NavWindowingToggleKey = ImGuiKey_None; DimBgRatio = 0.0f; - MouseCursor = ImGuiMouseCursor_Arrow; DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; DragDropSourceFlags = ImGuiDragDropFlags_None; @@ -2158,28 +2372,35 @@ struct ImGuiContext TablesTempDataStacked = 0; CurrentTabBar = NULL; - HoverDelayId = HoverDelayIdPreviousFrame = 0; - HoverDelayTimer = HoverDelayClearTimer = 0.0f; + HoverItemDelayId = HoverItemDelayIdPreviousFrame = HoverItemUnlockedStationaryId = HoverWindowUnlockedStationaryId = 0; + HoverItemDelayTimer = HoverItemDelayClearTimer = 0.0f; + + MouseCursor = ImGuiMouseCursor_Arrow; + MouseStationaryTimer = 0.0f; TempInputId = 0; + memset(&DataTypeZeroValue, 0, sizeof(DataTypeZeroValue)); + BeginMenuDepth = BeginComboDepth = 0; ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; ColorEditCurrentID = ColorEditSavedID = 0; ColorEditSavedHue = ColorEditSavedSat = 0.0f; ColorEditSavedColor = 0; + WindowResizeRelativeMode = false; + ScrollbarSeekMode = 0; + ScrollbarClickDeltaToGrabCenter = 0.0f; SliderGrabClickOffset = 0.0f; SliderCurrentAccum = 0.0f; SliderCurrentAccumDirty = false; DragCurrentAccumDirty = false; DragCurrentAccum = 0.0f; DragSpeedDefaultRatio = 1.0f / 100.0f; - ScrollbarClickDeltaToGrabCenter = 0.0f; DisabledAlphaBackup = 0.0f; DisabledStackSize = 0; + LockMarkEdited = 0; TooltipOverrideCount = 0; PlatformImeData.InputPos = ImVec2(0.0f, 0.0f); PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission - PlatformLocaleDecimalPoint = '.'; SettingsLoaded = false; SettingsDirtyTimer = 0.0f; @@ -2198,17 +2419,28 @@ struct ImGuiContext DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY; DebugLocateId = 0; - DebugLogClipperAutoDisableFrames = 0; + DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None; + DebugLogAutoDisableFrames = 0; DebugLocateFrames = 0; DebugBeginReturnValueCullDepth = -1; DebugItemPickerActive = false; DebugItemPickerMouseButton = ImGuiMouseButton_Left; DebugItemPickerBreakId = 0; + DebugFlashStyleColorTime = 0.0f; + DebugFlashStyleColorIdx = ImGuiCol_COUNT; + + // Same as DebugBreakClearData(). Those fields are scattered in their respective subsystem to stay in hot-data locations + DebugBreakInWindow = 0; + DebugBreakInTable = 0; + DebugBreakInLocateId = false; + DebugBreakKeyChord = ImGuiKey_Pause; + DebugBreakInShortcutRouting = ImGuiKey_None; memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; FramerateSecPerFrameAccum = 0.0f; WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; + memset(TempKeychordName, 0, sizeof(TempKeychordName)); } }; @@ -2258,6 +2490,7 @@ struct IMGUI_API ImGuiWindowTempData int CurrentTableIdx; // Current table index (into g.Tables) ImGuiLayoutType LayoutType; ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() + ImU32 ModalDimBgColor; // Local parameters stacks // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. @@ -2274,6 +2507,7 @@ struct IMGUI_API ImGuiWindow char* Name; // Window name, owned by the window. ImGuiID ID; // == ImHashStr(Name) ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + ImGuiChildFlags ChildFlags; // Set when window is a child window. See enum ImGuiChildFlags_ ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded. ImVec2 Pos; // Position (always rounded-up to nearest pixel) ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) @@ -2284,12 +2518,14 @@ struct IMGUI_API ImGuiWindow ImVec2 WindowPadding; // Window padding at the time of Begin(). float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. float WindowBorderSize; // Window border size at the time of Begin(). + float TitleBarHeight, MenuBarHeight; float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin(). float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y). float DecoInnerSizeX1, DecoInnerSizeY1; // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes). int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! ImGuiID MoveId; // == window->GetID("#MOVE") ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) + ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) ImVec2 Scroll; ImVec2 ScrollMax; ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) @@ -2305,20 +2541,20 @@ struct IMGUI_API ImGuiWindow bool Collapsed; // Set when collapsing window to become only title-bar bool WantCollapseToggle; bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) + bool SkipRefresh; // [EXPERIMENTAL] Reuse previous frame drawn contents, Begin() returns false. bool Appearing; // Set during the frame where the window is appearing (or re-appearing) bool Hidden; // Do not display (== HiddenFrames*** > 0) bool IsFallbackWindow; // Set on the "Debug##Default" window. bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() bool HasCloseButton; // Set when the window has a close button (p_open != NULL) + signed char ResizeBorderHovered; // Current border being hovered for resize (-1: none, otherwise 0-3) signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) short BeginCountPreviousFrame; // Number of Begin() during the previous frame short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0. short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues. short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. - ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) ImS8 AutoFitFramesX, AutoFitFramesY; - ImS8 AutoFitChildAxises; bool AutoFitOnlyGrows; ImGuiDir AutoPosLastDirection; ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames @@ -2362,6 +2598,7 @@ struct IMGUI_API ImGuiWindow ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. + ImGuiWindow* ParentWindowForFocusRoute; // Set to manual link a window to its logical parent so that Shortcut() chain are honoerd (e.g. Tool linked to Document) ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) @@ -2385,10 +2622,8 @@ struct IMGUI_API ImGuiWindow // We don't use g.FontSize because the window may be != g.CurrentWindow. ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } float CalcFontSize() const { ImGuiContext& g = *Ctx; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } - float TitleBarHeight() const { ImGuiContext& g = *Ctx; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } - ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } - float MenuBarHeight() const { ImGuiContext& g = *Ctx; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } - ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } + ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight)); } + ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight; return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight); } }; //----------------------------------------------------------------------------- @@ -2452,6 +2687,8 @@ struct IMGUI_API ImGuiTabBar float ScrollingSpeed; float ScrollingRectMinX; float ScrollingRectMaxX; + float SeparatorMinX; + float SeparatorMaxX; ImGuiID ReorderRequestTabId; ImS16 ReorderRequestOffset; ImS8 BeginCount; @@ -2541,26 +2778,39 @@ struct ImGuiTableColumn }; // Transient cell data stored per row. -// sizeof() ~ 6 +// sizeof() ~ 6 bytes struct ImGuiTableCellData { ImU32 BgColor; // Actual color ImGuiTableColumnIdx Column; // Column number }; +// Parameters for TableAngledHeadersRowEx() +// This may end up being refactored for more general purpose. +// sizeof() ~ 12 bytes +struct ImGuiTableHeaderData +{ + ImGuiTableColumnIdx Index; // Column index + ImU32 TextColor; + ImU32 BgColor0; + ImU32 BgColor1; +}; + // Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?) +// sizeof() ~ 24 bytes struct ImGuiTableInstanceData { ImGuiID TableInstanceID; float LastOuterHeight; // Outer height from last frame - float LastFirstRowHeight; // Height of first row from last frame (FIXME: this is used as "header height" and may be reworked) + float LastTopHeadersRowHeight; // Height of first consecutive header rows from last frame (FIXME: this is used assuming consecutive headers are in same frozen set) float LastFrozenHeight; // Height of frozen section from last frame + int HoveredRowLast; // Index of row which was hovered last frame. + int HoveredRowNext; // Index of row hovered this frame, set after encountering it. - ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastFirstRowHeight = LastFrozenHeight = 0.0f; } + ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastTopHeadersRowHeight = LastFrozenHeight = 0.0f; HoveredRowLast = HoveredRowNext = -1; } }; -// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs, incoming RowData -// sizeof() ~ 580 bytes + heap allocs described in TableBeginInitMemory() +// sizeof() ~ 592 bytes + heap allocs described in TableBeginInitMemory() struct IMGUI_API ImGuiTable { ImGuiID ID; @@ -2584,6 +2834,7 @@ struct IMGUI_API ImGuiTable float RowPosY1; float RowPosY2; float RowMinHeight; // Height submitted to TableNextRow() + float RowCellPaddingY; // Top and bottom padding. Reloaded during row change. float RowTextBaseline; float RowIndentOffsetX; ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ @@ -2597,9 +2848,8 @@ struct IMGUI_API ImGuiTable float HostIndentX; float MinColumnWidth; float OuterPaddingX; - float CellPaddingX; // Padding from each borders - float CellPaddingY; - float CellSpacingX1; // Spacing between non-bordered cells + float CellPaddingX; // Padding from each borders. Locked in BeginTable()/Layout. + float CellSpacingX1; // Spacing between non-bordered cells. Locked in BeginTable()/Layout. float CellSpacingX2; float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. float ColumnsGivenWidth; // Sum of current column width @@ -2608,6 +2858,8 @@ struct IMGUI_API ImGuiTable float ResizedColumnNextWidth; float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + float AngledHeadersHeight; // Set by TableAngledHeadersRow(), used in TableUpdateLayout() + float AngledHeadersSlope; // Set by TableAngledHeadersRow(), used in TableUpdateLayout() ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is ImRect WorkRect; @@ -2628,10 +2880,12 @@ struct IMGUI_API ImGuiTable ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() ImGuiTableColumnIdx SortSpecsCount; ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) - ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns using fixed width (<= ColumnsCount) ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() + ImGuiTableColumnIdx AngledHeadersCount; // Count columns with angled headers ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). + ImGuiTableColumnIdx HighlightColumnHeader; // Index of column which should be highlighted. ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. @@ -2657,6 +2911,7 @@ struct IMGUI_API ImGuiTable bool IsSortSpecsDirty; bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). + bool DisableDefaultContextMenu; // Disable default context menu contents. You may submit your own using TableBeginContextMenuPopup()/EndPopup() bool IsSettingsRequestLoad; bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) @@ -2664,6 +2919,8 @@ struct IMGUI_API ImGuiTable bool IsResetDisplayOrderRequest; bool IsUnfrozenRows; // Set when we got past the frozen row. bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() + bool IsActiveIdAliveBeforeTable; + bool IsActiveIdInTable; bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame. bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous. bool MemoryCompacted; @@ -2676,11 +2933,14 @@ struct IMGUI_API ImGuiTable // Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). // - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. // - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. -// sizeof() ~ 112 bytes. +// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs. +// sizeof() ~ 136 bytes. struct IMGUI_API ImGuiTableTempData { int TableIndex; // Index in g.Tables.Buf[] pool float LastTimeActive; // Last timestamp this structure was used + float AngledHeadersExtraWidth; // Used in EndTable() + ImVector AngledHeadersRequests; // Used in TableAngledHeadersRow() ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() ImDrawListSplitter DrawSplitter; @@ -2744,7 +3004,7 @@ namespace ImGui { // Windows // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) - // If this ever crash because g.CurrentWindow is NULL it means that either + // If this ever crashes because g.CurrentWindow is NULL, it means that either: // - ImGui::NewFrame() has never been called, which is illegal. // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } @@ -2752,6 +3012,7 @@ namespace ImGui IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); IMGUI_API ImGuiWindow* FindWindowByName(const char* name); IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); + IMGUI_API void UpdateWindowSkipRefresh(ImGuiWindow* window); IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy); IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent); @@ -2761,7 +3022,8 @@ namespace ImGui IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); - IMGUI_API void SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window); + IMGUI_API void SetWindowHiddenAndSkipItemsForCurrentFrame(ImGuiWindow* window); + inline void SetWindowParentWindowForFocusRoute(ImGuiWindow* window, ImGuiWindow* parent_window) { window->ParentWindowForFocusRoute = parent_window; } inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } inline ImVec2 WindowPosRelToAbs(ImGuiWindow* window, const ImVec2& p) { ImVec2 off = window->DC.CursorStartPos; return ImVec2(p.x + off.x, p.y + off.y); } @@ -2776,12 +3038,16 @@ namespace ImGui IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window); IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window); + // Windows: Idle, Refresh Policies [EXPERIMENTAL] + IMGUI_API void SetNextWindowRefreshPolicy(ImGuiWindowRefreshFlags flags); + // Fonts, drawing IMGUI_API void SetCurrentFont(ImFont* font); inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + IMGUI_API void AddDrawListToDrawDataEx(ImDrawData* draw_data, ImVector* out_list, ImDrawList* draw_list); // Init IMGUI_API void Initialize(); @@ -2790,6 +3056,7 @@ namespace ImGui // NewFrame IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); + IMGUI_API void FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window); IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); IMGUI_API void UpdateMouseMovingWindowNewFrame(); IMGUI_API void UpdateMouseMovingWindowEndFrame(); @@ -2854,7 +3121,7 @@ namespace ImGui IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min. IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0); - IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); + IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id, ImGuiItemFlags item_flags); IMGUI_API bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags = 0); IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id); IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); @@ -2869,6 +3136,8 @@ namespace ImGui IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); IMGUI_API void PopItemFlag(); IMGUI_API const ImGuiDataVarInfo* GetStyleVarInfo(ImGuiStyleVar idx); + IMGUI_API void BeginDisabledOverrideReenable(); + IMGUI_API void EndDisabledOverrideReenable(); // Logging/Capture IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. @@ -2877,7 +3146,7 @@ namespace ImGui IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); // Popups, Modals, Tooltips - IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); + IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags); IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); @@ -2885,6 +3154,7 @@ namespace ImGui IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); + IMGUI_API bool BeginTooltipHidden(); IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window); IMGUI_API ImGuiWindow* GetTopMostPopupModal(); IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal(); @@ -2909,52 +3179,61 @@ namespace ImGui IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result); + IMGUI_API void NavMoveRequestResolveWithPastTreeNode(ImGuiNavItemData* result, ImGuiNavTreeNodeData* tree_node_data); IMGUI_API void NavMoveRequestCancel(); IMGUI_API void NavMoveRequestApplyResult(); IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); + IMGUI_API void NavHighlightActivated(ImGuiID id); IMGUI_API void NavClearPreferredPosForAxis(ImGuiAxis axis); + IMGUI_API void NavRestoreHighlightAfterMove(); IMGUI_API void NavUpdateCurrentWindowIsScrollPushableX(); - IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. IMGUI_API void SetNavWindow(ImGuiWindow* window); IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); + IMGUI_API void SetNavFocusScope(ImGuiID focus_scope_id); + + // Focus/Activation + // This should be part of a larger set of API: FocusItem(offset = -1), FocusItemByID(id), ActivateItem(offset = -1), ActivateItemByID(id) etc. which are + // much harder to design and implement than expected. I have a couple of private branches on this matter but it's not simple. For now implementing the easy ones. + IMGUI_API void FocusItem(); // Focus last item (no selection/activation). + IMGUI_API void ActivateItemByID(ImGuiID id); // Activate an item by ID (button, checkbox, tree node etc.). Activation is queued and processed on the next frame when the item is encountered again. // Inputs // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. - inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } - inline bool IsNamedKeyOrModKey(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super || key == ImGuiMod_Shortcut; } - inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } - inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; } - inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } - inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; } - inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } - inline ImGuiKeyChord ConvertShortcutMod(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; IM_ASSERT_PARANOID(key_chord & ImGuiMod_Shortcut); return (key_chord & ~ImGuiMod_Shortcut) | (g.IO.ConfigMacOSXBehaviors ? ImGuiMod_Super : ImGuiMod_Ctrl); } - inline ImGuiKey ConvertSingleModFlagToKey(ImGuiContext* ctx, ImGuiKey key) + inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } + inline bool IsNamedKeyOrMod(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super; } + inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } + inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; } + inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } + inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; } + inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } + inline bool IsModKey(ImGuiKey key) { return key >= ImGuiKey_LeftCtrl && key <= ImGuiKey_RightSuper; } + ImGuiKeyChord FixupKeyChord(ImGuiKeyChord key_chord); + inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key) { - ImGuiContext& g = *ctx; if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl; if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift; if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt; if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper; - if (key == ImGuiMod_Shortcut) return (g.IO.ConfigMacOSXBehaviors ? ImGuiKey_ReservedForModSuper : ImGuiKey_ReservedForModCtrl); return key; } IMGUI_API ImGuiKeyData* GetKeyData(ImGuiContext* ctx, ImGuiKey key); inline ImGuiKeyData* GetKeyData(ImGuiKey key) { ImGuiContext& g = *GImGui; return GetKeyData(&g, key); } - IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size); + IMGUI_API const char* GetKeyChordName(ImGuiKeyChord key_chord); inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); } IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down); IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis); IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate); + IMGUI_API void TeleportMousePos(const ImVec2& pos); IMGUI_API void SetActiveIdUsingAllKeyboardKeys(); inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } // [EXPERIMENTAL] Low-Level: Key/Input Ownership // - The idea is that instead of "eating" a given input, we can link to an owner id. // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead). - // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_NoOwner (== -1) or a custom ID. // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0). // - Input ownership is automatically released on the frame after a key is released. Therefore: // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case). @@ -2962,12 +3241,12 @@ namespace ImGui // - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state. // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step. // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved. - IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key); - IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'. - IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id' - inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(ctx, key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; } + IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key); + IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API void SetKeyOwnersForKeyChord(ImGuiKeyChord key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'. + IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id' + inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiContext* ctx, ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &ctx->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; } // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag. @@ -2975,26 +3254,32 @@ namespace ImGui // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'. // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API. - IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id); - IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. - IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id); - IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); - IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); - IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); - - // [EXPERIMENTAL] Shortcut Routing - // - ImGuiKeyChord = a ImGuiKey optionally OR-red with ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super. - // ImGuiKey_C (accepted by functions taking ImGuiKey or ImGuiKeyChord) - // ImGuiKey_C | ImGuiMod_Ctrl (accepted by functions taking ImGuiKeyChord) - // ONLY ImGuiMod_XXX values are legal to 'OR' with an ImGuiKey. You CANNOT 'OR' two ImGuiKey values. - // - When using one of the routing flags (e.g. ImGuiInputFlags_RouteFocused): routes requested ahead of time given a chord (key + modifiers) and a routing policy. - // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame. - // - Route is granted to a single owner. When multiple requests are made we have policies to select the winning route. - // - Multiple read sites may use the same owner id and will all get the granted route. - // - For routing: when owner_id is 0 we use the current Focus Scope ID as a default owner in order to identify our location. - IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); - IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); - IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id); + IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiInputFlags flags, ImGuiID owner_id = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. + IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsKeyChordPressed(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id = 0); + IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiInputFlags flags, ImGuiID owner_id = 0); + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button, ImGuiID owner_id); + + // Shortcut Testing & Routing + // - Set Shortcut() and SetNextItemShortcut() in imgui.h + // - When a policy (except for ImGuiInputFlags_RouteAlways *) is set, Shortcut() will register itself with SetShortcutRouting(), + // allowing the system to decide where to route the input among other route-aware calls. + // (* using ImGuiInputFlags_RouteAlways is roughly equivalent to calling IsKeyChordPressed(key) and bypassing route registration and check) + // - When using one of the routing option: + // - The default route is ImGuiInputFlags_RouteFocused (accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window.) + // - Routes are requested given a chord (key + modifiers) and a routing policy. + // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame. + // - Each route may be granted to a single owner. When multiple requests are made we have policies to select the winning route (e.g. deep most window). + // - Multiple read sites may use the same owner id can all access the granted route. + // - When owner_id is 0 we use the current Focus Scope ID as a owner ID in order to identify our location. + // - You can chain two unrelated windows in the focus stack using SetWindowParentWindowForFocusRoute() + // e.g. if you have a tool window associated to a document, and you want document shortcuts to run when the tool is focused. + IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); + IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiInputFlags flags, ImGuiID owner_id); // owner_id needs to be explicit and cannot be 0 + IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id); IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord); // [EXPERIMENTAL] Focus Scope @@ -3014,7 +3299,13 @@ namespace ImGui IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); IMGUI_API void ClearDragDrop(); IMGUI_API bool IsDragDropPayloadBeingAccepted(); - IMGUI_API void RenderDragDropTargetRect(const ImRect& bb); + IMGUI_API void RenderDragDropTargetRect(const ImRect& bb, const ImRect& item_clip_rect); + + // Typing-Select API + IMGUI_API ImGuiTypingSelectRequest* GetTypingSelectRequest(ImGuiTypingSelectFlags flags = ImGuiTypingSelectFlags_None); + IMGUI_API int TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx); + IMGUI_API int TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx); + IMGUI_API int TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data); // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); @@ -3032,10 +3323,13 @@ namespace ImGui IMGUI_API void TableOpenContextMenu(int column_n = -1); IMGUI_API void TableSetColumnWidth(int column_n, float width); IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); - IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API int TableGetHoveredRow(); // Retrieve *PREVIOUS FRAME* hovered row. This difference with TableGetHoveredColumn() is the reason why this is not public yet. IMGUI_API float TableGetHeaderRowHeight(); + IMGUI_API float TableGetHeaderAngledMaxLabelWidth(); IMGUI_API void TablePushBackgroundChannel(); IMGUI_API void TablePopBackgroundChannel(); + IMGUI_API void TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count); // Tables: Internals inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } @@ -3048,7 +3342,7 @@ namespace ImGui IMGUI_API void TableUpdateBorders(ImGuiTable* table); IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); IMGUI_API void TableDrawBorders(ImGuiTable* table); - IMGUI_API void TableDrawContextMenu(ImGuiTable* table); + IMGUI_API void TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display); IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table); IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; } @@ -3113,7 +3407,7 @@ namespace ImGui IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); - IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight + IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_None); // Navigation highlight IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); @@ -3129,7 +3423,7 @@ namespace ImGui IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); - IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0); + IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0); IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags, float thickness = 1.0f); IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width); IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); @@ -3154,6 +3448,7 @@ namespace ImGui IMGUI_API void TreePushOverrideID(ImGuiID id); IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open); IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging. + IMGUI_API void SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data); // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). @@ -3169,7 +3464,7 @@ namespace ImGui IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); - IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format); + IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty = NULL); IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); @@ -3180,6 +3475,7 @@ namespace ImGui IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active + IMGUI_API void SetNextItemRefVal(ImGuiDataType data_type, void* p_data); // Color IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); @@ -3192,6 +3488,7 @@ namespace ImGui // Shade functions (write over already created vertices) IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); + IMGUI_API void ShadeVertsTransformPos(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& pivot_in, float cos_a, float sin_a, const ImVec2& pivot_out); // Garbage collection IMGUI_API void GcCompactTransientMiscBuffers(); @@ -3201,20 +3498,26 @@ namespace ImGui // Debug Log IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1); IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void DebugAllocHook(ImGuiDebugAllocInfo* info, int frame_count, void* ptr, size_t size); // size >= 0 : alloc, size = -1 : free // Debug Tools IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + IMGUI_API void DebugDrawCursorPos(ImU32 col = IM_COL32(255, 0, 0, 255)); + IMGUI_API void DebugDrawLineExtents(ImU32 col = IM_COL32(255, 0, 0, 255)); + IMGUI_API void DebugDrawItemRect(ImU32 col = IM_COL32(255, 0, 0, 255)); + IMGUI_API void DebugTextUnformattedWithLocateItem(const char* line_begin, const char* line_end); IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time! IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time! IMGUI_API void DebugLocateItemResolveWithLastItem(); - inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); } - inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } + IMGUI_API void DebugBreakClearData(); + IMGUI_API bool DebugBreakButton(const char* label, const char* description_of_location); + IMGUI_API void DebugBreakButtonTooltip(bool keyboard_only, const char* description_of_location); IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end); IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); - IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); + IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label); IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); IMGUI_API void DebugNodeFont(ImFont* font); IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph); @@ -3223,6 +3526,7 @@ namespace ImGui IMGUI_API void DebugNodeTable(ImGuiTable* table); IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state); + IMGUI_API void DebugNodeTypingSelectState(ImGuiTypingSelectState* state); IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); IMGUI_API void DebugNodeWindowsList(ImVector* windows, const char* label); @@ -3236,16 +3540,14 @@ namespace ImGui inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89 inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89 - // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): + //inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity! + + // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets which used FocusableItemRegister(): // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)' - // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' - // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))' (WIP) - // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() - inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() - inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem -#endif -#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO - inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity! + // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Focused) != 0' + // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))' + //inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() + //inline void FocusableItemUnregister(ImGuiWindow* window) // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem #endif } // namespace ImGui @@ -3265,6 +3567,7 @@ struct ImFontBuilderIO #ifdef IMGUI_ENABLE_STB_TRUETYPE IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); #endif +IMGUI_API void ImFontAtlasUpdateConfigDataPointers(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); diff --git a/core/deps/imgui/imgui_stdlib.cpp b/core/deps/imgui/imgui_stdlib.cpp new file mode 100644 index 000000000..cf69aa89a --- /dev/null +++ b/core/deps/imgui/imgui_stdlib.cpp @@ -0,0 +1,85 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +// See more C++ related extension (fmt, RAII, syntaxis sugar) on Wiki: +// https://github.com/ocornut/imgui/wiki/Useful-Extensions#cness + +#include "imgui.h" +#include "imgui_stdlib.h" + +// Clang warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#endif + +struct InputTextCallback_UserData +{ + std::string* Str; + ImGuiInputTextCallback ChainCallback; + void* ChainCallbackUserData; +}; + +static int InputTextCallback(ImGuiInputTextCallbackData* data) +{ + InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + // Resize string callback + // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. + std::string* str = user_data->Str; + IM_ASSERT(data->Buf == str->c_str()); + str->resize(data->BufTextLen); + data->Buf = (char*)str->c_str(); + } + else if (user_data->ChainCallback) + { + // Forward to user callback, if any + data->UserData = user_data->ChainCallbackUserData; + return user_data->ChainCallback(data); + } + return 0; +} + +bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/core/deps/imgui/imgui_stdlib.h b/core/deps/imgui/imgui_stdlib.h new file mode 100644 index 000000000..835a808f2 --- /dev/null +++ b/core/deps/imgui/imgui_stdlib.h @@ -0,0 +1,21 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +// See more C++ related extension (fmt, RAII, syntaxis sugar) on Wiki: +// https://github.com/ocornut/imgui/wiki/Useful-Extensions#cness + +#pragma once + +#include + +namespace ImGui +{ + // ImGui::InputText() with std::string + // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity + IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr); + IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = nullptr, void* user_data = nullptr); +} diff --git a/core/deps/imgui/imgui_tables.cpp b/core/deps/imgui/imgui_tables.cpp index 8850094de..24263bd85 100644 --- a/core/deps/imgui/imgui_tables.cpp +++ b/core/deps/imgui/imgui_tables.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (tables and columns code) /* @@ -24,8 +24,9 @@ Index of this file: */ // Navigating this file: -// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. -// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - In Visual Studio: CTRL+comma ("Edit.GoToAll") can follow symbols inside comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - In Visual Studio w/ Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols inside comments. +// - In VS Code, CLion, etc.: CTRL+click can follow symbols inside comments. //----------------------------------------------------------------------------- // [SECTION] Commentary @@ -48,7 +49,8 @@ Index of this file: // - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). // | TableSetupDrawChannels() - setup ImDrawList channels // | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission -// | TableDrawContextMenu() - draw right-click context menu +// | TableBeginContextMenuPopup() +// | - TableDrawDefaultContextMenu() - draw right-click context menu contents //----------------------------------------------------------------------------- // - TableHeadersRow() or TableHeader() user submit a headers row (optional) // | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction @@ -82,7 +84,7 @@ Index of this file: // Y with ScrollX/ScrollY disabled: we output table directly in current window // - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful if parent window can vertically scroll. // - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) -// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) +// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtendY is set) // Y with ScrollX/ScrollY enabled: using a child window for scrolling // - outer_size.y < 0.0f -> Bottom-align. Not meaningful if parent window can vertically scroll. // - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. @@ -198,11 +200,7 @@ Index of this file: #include "imgui_internal.h" // System includes -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif // Visual Studio warnings #ifdef _MSC_VER @@ -230,6 +228,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') #pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked @@ -321,19 +320,30 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG IM_ASSERT(inner_width >= 0.0f); // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping criteria may evolve. + // FIXME: coarse clipping because access to table data causes two issues: + // - instance numbers varying/unstable. may not be a direct problem for users, but could make outside access broken or confusing, e.g. TestEngine. + // - can't implement support for ImGuiChildFlags_ResizeY as we need to somehow pull the height data from somewhere. this also needs stable instance numbers. + // The side-effects of accessing table data on coarse clip would be: + // - always reserving the pooled ImGuiTable data ahead for a fully clipped table (minor IMHO). Also the 'outer_window_is_measuring_size' criteria may already be defeating this in some situations. + // - always performing the GetOrAddByKey() O(log N) query in g.Tables.Map[]. const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; const ImVec2 avail_size = GetContentRegionAvail(); - ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); - ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); - if (use_child_window && IsClippedEx(outer_rect, 0)) + const ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); + const ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); + const bool outer_window_is_measuring_size = (outer_window->AutoFitFramesX > 0) || (outer_window->AutoFitFramesY > 0); // Doesn't apply to AlwaysAutoResize windows! + if (use_child_window && IsClippedEx(outer_rect, 0) && !outer_window_is_measuring_size) { ItemSize(outer_rect); + ItemAdd(outer_rect, id); return false; } + // [DEBUG] Debug break requested by user + if (g.DebugBreakInTable == id) + IM_DEBUG_BREAK(); + // Acquire storage for the table ImGuiTable* table = g.Tables.GetOrAddByKey(id); - const ImGuiTableFlags table_last_flags = table->Flags; // Acquire temporary buffers const int table_idx = g.Tables.GetIndex(table); @@ -349,7 +359,9 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG flags = TableFixFlags(flags, outer_window); // Initialize - const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const int previous_frame_active = table->LastFrameActive; + const int instance_no = (previous_frame_active != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const ImGuiTableFlags previous_flags = table->Flags; table->ID = id; table->Flags = flags; table->LastFrameActive = g.FrameCount; @@ -396,7 +408,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); // Reset scroll if we are reactivating it - if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) + if ((previous_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) SetNextWindowScroll(ImVec2(0.0f, 0.0f)); // Create scrolling region (without border and zero window padding) @@ -408,19 +420,24 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->InnerRect = table->InnerWindow->InnerRect; IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); + // Allow submitting when host is measuring + if (table->InnerWindow->SkipItems && outer_window_is_measuring_size) + table->InnerWindow->SkipItems = false; + // When using multiple instances, ensure they have the same amount of horizontal decorations (aka vertical scrollbar) so stretched columns can be aligned) if (instance_no == 0) { table->HasScrollbarYPrev = table->HasScrollbarYCurr; table->HasScrollbarYCurr = false; } - table->HasScrollbarYCurr |= (table->InnerWindow->ScrollMax.y > 0.0f); + table->HasScrollbarYCurr |= table->InnerWindow->ScrollbarY; } else { // For non-scrolling tables, WorkRect == OuterRect == InnerRect. // But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable(). table->WorkRect = table->OuterRect = table->InnerRect = outer_rect; + table->HasScrollbarYPrev = table->HasScrollbarYCurr = false; } // Push a standardized ID for both child-using and not-child-using tables @@ -443,6 +460,18 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + // Make left and top borders not overlap our contents by offsetting HostClipRect (#6765) + // (we normally shouldn't alter HostClipRect as we rely on TableMergeDrawChannels() expanding non-clipped column toward the + // limits of that rectangle, in order for ImDrawListSplitter::Merge() to merge the draw commands. However since the overlap + // problem only affect scrolling tables in this case we can get away with doing it without extra cost). + if (inner_window != outer_window) + { + if (flags & ImGuiTableFlags_BordersOuterV) + table->HostClipRect.Min.x = ImMin(table->HostClipRect.Min.x + TABLE_BORDER_SIZE, table->HostClipRect.Max.x); + if (flags & ImGuiTableFlags_BordersOuterH) + table->HostClipRect.Min.y = ImMin(table->HostClipRect.Min.y + TABLE_BORDER_SIZE, table->HostClipRect.Max.y); + } + // Padding and Spacing // - None ........Content..... Pad .....Content........ // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | @@ -456,7 +485,6 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; table->CellSpacingX2 = inner_spacing_explicit; table->CellPaddingX = inner_padding_explicit; - table->CellPaddingY = g.Style.CellPadding.y; const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; @@ -473,10 +501,15 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() + table->RowCellPaddingY = 0.0f; table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; table->IsUnfrozenRows = true; - table->DeclColumnsCount = 0; + table->DeclColumnsCount = table->AngledHeadersCount = 0; + if (previous_frame_active + 1 < g.FrameCount) + table->IsActiveIdInTable = false; + table->AngledHeadersHeight = 0.0f; + temp_data->AngledHeadersExtraWidth = 0.0f; // Using opaque colors facilitate overlapping lines of the grid, otherwise we'd need to improve TableDrawBorders() table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); @@ -489,7 +522,7 @@ bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImG if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. inner_window->DC.CurrentTableIdx = table_idx; - if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) + if ((previous_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) table->IsResetDisplayOrderRequest = true; // Mark as used to avoid GC @@ -850,8 +883,8 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); - // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible - // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). + // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible to avoid + // the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). Also see #6510. // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) table->InnerWindow->SkipItems = false; @@ -936,7 +969,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) if (column->Flags & ImGuiTableColumnFlags_WidthStretch) { float weight_ratio = column->StretchWeight / stretch_sum_weights; - column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); + column->WidthRequest = IM_TRUNC(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); width_remaining_for_stretched_columns -= column->WidthRequest; } @@ -946,7 +979,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; // Assign final width, record width in case we will need to shrink - column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); + column->WidthGiven = ImTrunc(ImMax(column->WidthRequest, table->MinColumnWidth)); table->ColumnsGivenWidth += column->WidthGiven; } @@ -971,17 +1004,25 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // clear ActiveId, which is equivalent to the change provided by _AllowWhenBLockedByActiveItem). // - This allows columns to be marked as hovered when e.g. clicking a button inside the column, or using drag and drop. ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - table->HoveredColumnBody = -1; - table->HoveredColumnBorder = -1; + table_instance->HoveredRowLast = table_instance->HoveredRowNext; + table_instance->HoveredRowNext = -1; + table->HoveredColumnBody = table->HoveredColumnBorder = -1; const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight)); const ImGuiID backup_active_id = g.ActiveId; g.ActiveId = 0; - const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); + const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0, ImGuiItemFlags_None); g.ActiveId = backup_active_id; + // Determine skewed MousePos.x to support angled headers. + float mouse_skewed_x = g.IO.MousePos.x; + if (table->AngledHeadersHeight > 0.0f) + if (g.IO.MousePos.y >= table->OuterRect.Min.y && g.IO.MousePos.y <= table->OuterRect.Min.y + table->AngledHeadersHeight) + mouse_skewed_x += ImTrunc((table->OuterRect.Min.y + table->AngledHeadersHeight - g.IO.MousePos.y) * table->AngledHeadersSlope); + // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. int visible_n = 0; + bool has_at_least_one_column_requesting_output = false; bool offset_x_frozen = (table->FreezeColumnsCount > 0); float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; ImRect host_clip_rect = table->InnerClipRect; @@ -1019,7 +1060,7 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) } // Detect hovered column - if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) + if (is_hovering_table && mouse_skewed_x >= column->ClipRect.Min.x && mouse_skewed_x < column->ClipRect.Max.x) table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; // Lock start position @@ -1036,9 +1077,10 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. + const float previous_instance_work_min_x = column->WorkMinX; column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max - column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); + column->ItemWidth = ImTrunc(column->WidthGiven * 0.65f); column->ClipRect.Min.x = column->MinX; column->ClipRect.Min.y = work_rect.Min.y; column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; @@ -1062,9 +1104,12 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; // Mark column as SkipItems (ignoring all items/layout) + // (table->HostSkipItems is a copy of inner_window->SkipItems before we cleared it above in Part 2) column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; if (column->IsSkipItems) IM_ASSERT(!is_visible); + if (column->IsRequestOutput && !column->IsSkipItems) + has_at_least_one_column_requesting_output = true; // Update status flags column->Flags |= ImGuiTableColumnFlags_IsEnabled; @@ -1085,8 +1130,22 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); // Reset content width variables - column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; - column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; + if (table->InstanceCurrent == 0) + { + column->ContentMaxXFrozen = column->WorkMinX; + column->ContentMaxXUnfrozen = column->WorkMinX; + column->ContentMaxXHeadersUsed = column->WorkMinX; + column->ContentMaxXHeadersIdeal = column->WorkMinX; + } + else + { + // As we store an absolute value to make per-cell updates faster, we need to offset values used for width computation. + const float offset_from_previous_instance = column->WorkMinX - previous_instance_work_min_x; + column->ContentMaxXFrozen += offset_from_previous_instance; + column->ContentMaxXUnfrozen += offset_from_previous_instance; + column->ContentMaxXHeadersUsed += offset_from_previous_instance; + column->ContentMaxXHeadersIdeal += offset_from_previous_instance; + } // Don't decrement auto-fit counters until container window got a chance to submit its items if (table->HostSkipItems == false) @@ -1102,18 +1161,26 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) visible_n++; } + // In case the table is visible (e.g. decorations) but all columns clipped, we keep a column visible. + // Else if give no chance to a clipper-savy user to submit rows and therefore total contents height used by scrollbar. + if (has_at_least_one_column_requesting_output == false) + { + table->Columns[table->LeftMostEnabledColumn].IsRequestOutput = true; + table->Columns[table->LeftMostEnabledColumn].IsSkipItems = false; + } + // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); if (is_hovering_table && table->HoveredColumnBody == -1) - { - if (g.IO.MousePos.x >= unused_x1) + if (mouse_skewed_x >= unused_x1) table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; - } if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) table->Flags &= ~ImGuiTableFlags_Resizable; + table->IsActiveIdAliveBeforeTable = (g.ActiveIdIsAlive != 0); + // [Part 8] Lock actual OuterRect/WorkRect right-most position. // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. @@ -1125,8 +1192,16 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); } table->InnerWindow->ParentWorkRect = table->WorkRect; - table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); - table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); + table->BorderX1 = table->InnerClipRect.Min.x; + table->BorderX2 = table->InnerClipRect.Max.x; + + // Setup window's WorkRect.Max.y for GetContentRegionAvail(). Other values will be updated in each TableBeginCell() call. + float window_content_max_y; + if (table->Flags & ImGuiTableFlags_NoHostExtendY) + window_content_max_y = table->OuterRect.Max.y; + else + window_content_max_y = ImMax(table->InnerWindow->ContentRegionRect.Max.y, (table->Flags & ImGuiTableFlags_ScrollY) ? 0.0f : table->OuterRect.Max.y); + table->InnerWindow->WorkRect.Max.y = ImClamp(window_content_max_y - g.Style.CellPadding.y, table->InnerWindow->WorkRect.Min.y, table->InnerWindow->WorkRect.Max.y); // [Part 9] Allocate draw channels and setup background cliprect TableSetupDrawChannels(table); @@ -1134,14 +1209,26 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // [Part 10] Hit testing on borders if (table->Flags & ImGuiTableFlags_Resizable) TableUpdateBorders(table); - table_instance->LastFirstRowHeight = 0.0f; + table_instance->LastTopHeadersRowHeight = 0.0f; table->IsLayoutLocked = true; table->IsUsingHeaders = false; - // [Part 11] Context menu - if (TableBeginContextMenuPopup(table)) + // Highlight header + table->HighlightColumnHeader = -1; + if (table->IsContextPopupOpen && table->ContextPopupColumn != -1 && table->InstanceInteracted == table->InstanceCurrent) + table->HighlightColumnHeader = table->ContextPopupColumn; + else if ((table->Flags & ImGuiTableFlags_HighlightHoveredColumn) && table->HoveredColumnBody != -1 && table->HoveredColumnBody != table->ColumnsCount && table->HoveredColumnBorder == -1) + if (g.ActiveId == 0 || (table->IsActiveIdInTable || g.DragDropActive)) + table->HighlightColumnHeader = table->HoveredColumnBody; + + // [Part 11] Default context menu + // - To append to this menu: you can call TableBeginContextMenuPopup()/.../EndPopup(). + // - To modify or replace this: set table->IsContextPopupNoDefaultContents = true, then call TableBeginContextMenuPopup()/.../EndPopup(). + // - You may call TableDrawDefaultContextMenu() with selected flags to display specific sections of the default menu, + // e.g. TableDrawDefaultContextMenu(table, table->Flags & ~ImGuiTableFlags_Hideable) will display everything EXCEPT columns visibility options. + if (table->DisableDefaultContextMenu == false && TableBeginContextMenuPopup(table)) { - TableDrawContextMenu(table); + TableDrawDefaultContextMenu(table, table->Flags); EndPopup(); } @@ -1167,8 +1254,6 @@ void ImGui::TableUpdateLayout(ImGuiTable* table) // Process hit-testing on resizing borders. Actual size change will be applied in EndTable() // - Set table->HoveredColumnBorder with a short delay/timer to reduce visual feedback noise. -// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize -// widgets overlapping the same area. void ImGui::TableUpdateBorders(ImGuiTable* table) { ImGuiContext& g = *GImGui; @@ -1179,10 +1264,10 @@ void ImGui::TableUpdateBorders(ImGuiTable* table) // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). // Actual columns highlight/render will be performed in EndTable() and not be affected. ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); - const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; - const float hit_y1 = table->OuterRect.Min.y; - const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight); - const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight; + const float hit_half_width = ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale); + const float hit_y1 = (table->FreezeRowsCount >= 1 ? table->OuterRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight; + const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight - table->AngledHeadersHeight); + const float hit_y2_head = hit_y1 + table_instance->LastTopHeadersRowHeight; for (int order_n = 0; order_n < table->ColumnsCount; order_n++) { @@ -1208,12 +1293,12 @@ void ImGui::TableUpdateBorders(ImGuiTable* table) //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); bool hovered = false, held = false; - bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); + bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); if (pressed && IsMouseDoubleClicked(0)) { TableSetColumnWidthAutoSingle(table, column_n); ClearActiveID(); - held = hovered = false; + held = false; } if (held) { @@ -1285,7 +1370,7 @@ void ImGui::EndTable() max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); if (table->ResizedColumn != -1) max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); - table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; + table->InnerWindow->DC.CursorMaxPos.x = max_pos_x + table->TempData->AngledHeadersExtraWidth; } // Pop clipping rect @@ -1356,11 +1441,13 @@ void ImGui::EndTable() if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) { ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; - const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); - const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); + const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(TABLE_RESIZE_SEPARATOR_HALF_THICKNESS * g.CurrentDpiScale)); + const float new_width = ImTrunc(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); table->ResizedColumnNextWidth = new_width; } + table->IsActiveIdInTable = (g.ActiveIdIsAlive != 0 && table->IsActiveIdAliveBeforeTable == false); + // Pop from id stack IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table_instance->TableInstanceID, "Mismatching PushID/PopID!"); IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); @@ -1383,7 +1470,10 @@ void ImGui::EndTable() // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) if (inner_window != outer_window) { + short backup_nav_layers_active_mask = inner_window->DC.NavLayersActiveMask; + inner_window->DC.NavLayersActiveMask |= 1 << ImGuiNavLayer_Main; // So empty table don't appear to navigate differently. EndChild(); + inner_window->DC.NavLayersActiveMask = backup_nav_layers_active_mask; } else { @@ -1401,9 +1491,13 @@ void ImGui::EndTable() } else if (temp_data->UserOuterSize.x <= 0.0f) { - const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; - outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x); - outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); + // Some references for this: #7651 + tests "table_reported_size", "table_reported_size_outer" equivalent Y block + // - Checking for ImGuiTableFlags_ScrollX/ScrollY flag makes us a frame ahead when disabling those flags. + // - FIXME-TABLE: Would make sense to pre-compute expected scrollbar visibility/sizes to generally save a frame of feedback. + const float inner_content_max_x = table->OuterRect.Min.x + table->ColumnsAutoFitWidth; // Slightly misleading name but used for code symmetry with inner_content_max_y + const float decoration_size = table->TempData->AngledHeadersExtraWidth + ((table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.x : 0.0f); + outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, inner_content_max_x + decoration_size - temp_data->UserOuterSize.x); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, inner_content_max_x + decoration_size)); } else { @@ -1411,9 +1505,9 @@ void ImGui::EndTable() } if (temp_data->UserOuterSize.y <= 0.0f) { - const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f; + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.y : 0.0f; outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - temp_data->UserOuterSize.y); - outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y)); + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y + decoration_size)); } else { @@ -1440,7 +1534,7 @@ void ImGui::EndTable() NavUpdateCurrentWindowIsScrollPushableX(); } -// See "COLUMN SIZING POLICIES" comments at the top of this file +// See "COLUMNS SIZING POLICIES" comments at the top of this file // If (init_width_or_weight <= 0.0f) it is ignored void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) { @@ -1468,6 +1562,11 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) flags |= ImGuiTableColumnFlags_WidthFixed; + if (flags & ImGuiTableColumnFlags_AngledHeader) + { + flags |= ImGuiTableColumnFlags_NoHeaderLabel; + table->AngledHeadersCount++; + } TableSetupColumnFlags(table, column, flags); column->UserID = user_id; @@ -1501,6 +1600,7 @@ void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, flo } // Store name (append with zero-terminator in contiguous buffer) + // FIXME: If we recorded the number of \n in names we could compute header row height column->NameOffset = -1; if (label != NULL && label[0] != 0) { @@ -1549,6 +1649,7 @@ void ImGui::TableSetupScrollFreeze(int columns, int rows) // - TableGetCellBgRect() [Internal] // - TableGetColumnResizeID() [Internal] // - TableGetHoveredColumn() [Internal] +// - TableGetHoveredRow() [Internal] // - TableSetBgColor() //----------------------------------------------------------------------------- @@ -1653,6 +1754,19 @@ int ImGui::TableGetHoveredColumn() return (int)table->HoveredColumnBody; } +// Return -1 when table is not hovered. Return maxrow+1 if in table but below last submitted row. +// *IMPORTANT* Unlike TableGetHoveredColumn(), this has a one frame latency in updating the value. +// This difference with is the reason why this is not public yet. +int ImGui::TableGetHoveredRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return -1; + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + return (int)table_instance->HoveredRowLast; +} + void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) { ImGuiContext& g = *GImGui; @@ -1727,19 +1841,20 @@ void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) table->LastRowFlags = table->RowFlags; table->RowFlags = row_flags; + table->RowCellPaddingY = g.Style.CellPadding.y; table->RowMinHeight = row_min_height; TableBeginRow(table); // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, // because that would essentially require a unique clipping rectangle per-cell. - table->RowPosY2 += table->CellPaddingY * 2.0f; + table->RowPosY2 += table->RowCellPaddingY * 2.0f; table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); // Disable output until user calls TableNextColumn() table->InnerWindow->SkipItems = true; } -// [Internal] Called by TableNextRow() +// [Internal] Only called by TableNextRow() void ImGui::TableBeginRow(ImGuiTable* table) { ImGuiWindow* window = table->InnerWindow; @@ -1760,8 +1875,10 @@ void ImGui::TableBeginRow(ImGuiTable* table) table->RowPosY1 = table->RowPosY2 = next_y1; table->RowTextBaseline = 0.0f; table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent + window->DC.PrevLineTextBaseOffset = 0.0f; - window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x, window->DC.CursorPos.y + table->RowCellPaddingY); // This allows users to call SameLine() to share LineSize between columns. + window->DC.PrevLineSize = window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); // This allows users to call SameLine() to share LineSize between columns, and to call it from first column too. window->DC.IsSameLine = window->DC.IsSetPos = false; window->DC.CursorMaxPos.y = next_y1; @@ -1798,12 +1915,17 @@ void ImGui::TableEndRow(ImGuiTable* table) const float bg_y2 = table->RowPosY2; const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); - if (table->CurrentRow == 0) - TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1; + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + if ((table->RowFlags & ImGuiTableRowFlags_Headers) && (table->CurrentRow == 0 || (table->LastRowFlags & ImGuiTableRowFlags_Headers))) + table_instance->LastTopHeadersRowHeight += bg_y2 - bg_y1; const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); if (is_visible) { + // Update data for TableGetHoveredRow() + if (table->HoveredColumnBody != -1 && g.IO.MousePos.y >= bg_y1 && g.IO.MousePos.y < bg_y2 && table_instance->HoveredRowNext < 0) + table_instance->HoveredRowNext = table->CurrentRow; + // Decide of background color for the row ImU32 bg_col0 = 0; ImU32 bg_col1 = 0; @@ -1815,15 +1937,14 @@ void ImGui::TableEndRow(ImGuiTable* table) bg_col1 = table->RowBgColor[1]; // Decide of top border color - ImU32 border_col = 0; + ImU32 top_border_col = 0; const float border_size = TABLE_BORDER_SIZE; - if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) - if (table->Flags & ImGuiTableFlags_BordersInnerH) - border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; + if (table->CurrentRow > 0 && (table->Flags & ImGuiTableFlags_BordersInnerH)) + top_border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; const bool draw_strong_bottom_border = unfreeze_rows_actual; - if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) + if ((bg_col0 | bg_col1 | top_border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) { // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. @@ -1857,13 +1978,14 @@ void ImGui::TableEndRow(ImGuiTable* table) cell_bg_rect.ClipWith(table->BgClipRect); cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); - window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); + if (cell_bg_rect.Min.y < cell_bg_rect.Max.y) + window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); } } // Draw top border - if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) - window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); + if (top_border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), top_border_col, border_size); // Draw bottom border at the row unfreezing mark (always strong) if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) @@ -1881,7 +2003,7 @@ void ImGui::TableEndRow(ImGuiTable* table) IM_ASSERT(table->IsUnfrozenRows == false); const float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); table->IsUnfrozenRows = true; - TableGetInstanceData(table, table->InstanceCurrent)->LastFrozenHeight = y0 - table->OuterRect.Min.y; + table_instance->LastFrozenHeight = y0 - table->OuterRect.Min.y; // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); @@ -1991,12 +2113,14 @@ void ImGui::TableBeginCell(ImGuiTable* table, int column_n) start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. window->DC.CursorPos.x = start_x; - window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; + window->DC.CursorPos.y = table->RowPosY1 + table->RowCellPaddingY; window->DC.CursorMaxPos.x = window->DC.CursorPos.x; window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x; // PrevLine.y is preserved. This allows users to call SameLine() to share LineSize between columns. window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; + // Note how WorkRect.Max.y is only set once during layout window->WorkRect.Min.y = window->DC.CursorPos.y; window->WorkRect.Min.x = column->WorkMinX; window->WorkRect.Max.x = column->WorkMaxX; @@ -2047,7 +2171,7 @@ void ImGui::TableEndCell(ImGuiTable* table) p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); if (column->IsEnabled) - table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); + table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->RowCellPaddingY); column->ItemWidth = window->DC.ItemWidth; // Propagate text baseline for the entire row @@ -2065,6 +2189,8 @@ void ImGui::TableEndCell(ImGuiTable* table) // - TableSetColumnWidthAutoAll() [Internal] // - TableUpdateColumnsWeightFromWidth() [Internal] //------------------------------------------------------------------------- +// Note that actual columns widths are computed in TableUpdateLayout(). +//------------------------------------------------------------------------- // Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) @@ -2257,6 +2383,7 @@ void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) // - TablePopBackgroundChannel() [Internal] // - TableSetupDrawChannels() [Internal] // - TableMergeDrawChannels() [Internal] +// - TableGetColumnBorderCol() [Internal] // - TableDrawBorders() [Internal] //------------------------------------------------------------------------- @@ -2540,6 +2667,18 @@ void ImGui::TableMergeDrawChannels(ImGuiTable* table) } } +static ImU32 TableGetColumnBorderCol(ImGuiTable* table, int order_n, int column_n) +{ + const bool is_hovered = (table->HoveredColumnBorder == column_n); + const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); + const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1); + if (is_resized || is_hovered) + return ImGui::GetColorU32(is_resized ? ImGuiCol_SeparatorActive : ImGuiCol_SeparatorHovered); + if (is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize))) + return table->BorderColorStrong; + return table->BorderColorLight; +} + // FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) void ImGui::TableDrawBorders(ImGuiTable* table) { @@ -2554,9 +2693,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) // Draw inner border and resizing feedback ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); const float border_size = TABLE_BORDER_SIZE; - const float draw_y1 = table->InnerRect.Min.y; + const float draw_y1 = ImMax(table->InnerRect.Min.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table->AngledHeadersHeight) + ((table->Flags & ImGuiTableFlags_BordersOuterH) ? 1.0f : 0.0f); const float draw_y2_body = table->InnerRect.Max.y; - const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1; + const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastTopHeadersRowHeight) : draw_y1; if (table->Flags & ImGuiTableFlags_BordersInnerV) { for (int order_n = 0; order_n < table->ColumnsCount; order_n++) @@ -2582,21 +2721,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) // Draw in outer window so right-most column won't be clipped // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. - ImU32 col; - float draw_y2; - if (is_hovered || is_resized || is_frozen_separator) - { - draw_y2 = draw_y2_body; - col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; - } - else - { - draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; - col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; - } - + float draw_y2 = (is_hovered || is_resized || is_frozen_separator || (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) == 0) ? draw_y2_body : draw_y2_head; if (draw_y2 > draw_y1) - inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); + inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), TableGetColumnBorderCol(table, order_n, column_n), border_size); } } @@ -2613,7 +2740,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table) const ImU32 outer_col = table->BorderColorStrong; if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) { - inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); + inner_drawlist->AddRect(outer_border.Min, outer_border.Max + ImVec2(1, 1), outer_col, 0.0f, 0, border_size); } else if (table->Flags & ImGuiTableFlags_BordersOuterV) { @@ -2628,7 +2755,7 @@ void ImGui::TableDrawBorders(ImGuiTable* table) } if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) { - // Draw bottom-most row border + // Draw bottom-most row border between it is above outer border. const float border_y = table->RowPosY2; if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); @@ -2649,8 +2776,9 @@ void ImGui::TableDrawBorders(ImGuiTable* table) //------------------------------------------------------------------------- // Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) -// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since -// last call, or the first time. +// When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have +// changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, +// else you may wastefully sort your data every frame! // Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() { @@ -2672,7 +2800,7 @@ ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n) { IM_ASSERT(n < column->SortDirectionsAvailCount); - return (column->SortDirectionsAvailList >> (n << 1)) & 0x03; + return (ImGuiSortDirection)((column->SortDirectionsAvailList >> (n << 1)) & 0x03); } // Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending) @@ -2813,6 +2941,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table) } // Write output + // May be able to move all SortSpecs data from table (48 bytes) to ImGuiTableTempData if we decide to write it back on every BeginTable() ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; if (dirty && sort_specs != NULL) for (int column_n = 0; column_n < table->ColumnsCount; column_n++) @@ -2825,7 +2954,7 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table) sort_spec->ColumnUserID = column->UserID; sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n; sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder; - sort_spec->SortDirection = column->SortDirection; + sort_spec->SortDirection = (ImGuiSortDirection)column->SortDirection; } table->SortSpecs.Specs = sort_specs; @@ -2836,8 +2965,11 @@ void ImGui::TableSortSpecsBuild(ImGuiTable* table) // [SECTION] Tables: Headers //------------------------------------------------------------------------- // - TableGetHeaderRowHeight() [Internal] +// - TableGetHeaderAngledMaxLabelWidth() [Internal] // - TableHeadersRow() // - TableHeader() +// - TableAngledHeadersRow() +// - TableAngledHeadersRowEx() [Internal] //------------------------------------------------------------------------- float ImGui::TableGetHeaderRowHeight() @@ -2846,21 +2978,31 @@ float ImGui::TableGetHeaderRowHeight() // Calculate row height, for the unlikely case that some labels may be taller than others. // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. // In your custom header row you may omit this all together and just call TableNextRow() without a height... - float row_height = GetTextLineHeight(); - int columns_count = TableGetColumnCount(); - for (int column_n = 0; column_n < columns_count; column_n++) - { - ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n); - if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel)) - row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); - } - row_height += GetStyle().CellPadding.y * 2.0f; - return row_height; + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + float row_height = g.FontSize; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + if ((table->Columns[column_n].Flags & ImGuiTableColumnFlags_NoHeaderLabel) == 0) + row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(table, column_n)).y); + return row_height + g.Style.CellPadding.y * 2.0f; +} + +float ImGui::TableGetHeaderAngledMaxLabelWidth() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + float width = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + if (table->Columns[column_n].Flags & ImGuiTableColumnFlags_AngledHeader) + width = ImMax(width, CalcTextSize(TableGetColumnName(table, column_n), NULL, true).x); + return width + g.Style.CellPadding.y * 2.0f; // Swap padding } // [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). // The intent is that advanced users willing to create customized headers would not need to use this helper -// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. +// and can create their own! For example: TableHeader() may be preceded by Checkbox() or other custom widgets. // See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. // This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. // FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. @@ -2875,9 +3017,9 @@ void ImGui::TableHeadersRow() TableUpdateLayout(table); // Open row - const float row_y1 = GetCursorScreenPos().y; const float row_height = TableGetHeaderRowHeight(); TableNextRow(ImGuiTableRowFlags_Headers, row_height); + const float row_y1 = GetCursorScreenPos().y; if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. return; @@ -2899,7 +3041,7 @@ void ImGui::TableHeadersRow() ImVec2 mouse_pos = ImGui::GetMousePos(); if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) - TableOpenContextMenu(-1); // Will open a non-column-specific popup. + TableOpenContextMenu(columns_count); // Will open a non-column-specific popup. } // Emit a column header (text + optional sort order) @@ -2928,16 +3070,19 @@ void ImGui::TableHeader(const char* label) // If we already got a row height, there's use that. // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? ImRect cell_r = TableGetCellBgRect(table, column_n); - float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); + float label_height = ImMax(label_size.y, table->RowMinHeight - table->RowCellPaddingY * 2.0f); // Calculate ideal size for sort order arrow float w_arrow = 0.0f; float w_sort_text = 0.0f; + bool sort_arrow = false; char sort_order_suf[4] = ""; const float ARROW_SCALE = 0.65f; if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) { - w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + w_arrow = ImTrunc(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + if (column->SortOrder != -1) + sort_arrow = true; if (column->SortOrder > 0) { ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); @@ -2945,13 +3090,12 @@ void ImGui::TableHeader(const char* label) } } - // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. + // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considered for merging. float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; - column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); + column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, sort_arrow ? cell_r.Max.x : ImMin(max_pos_x, cell_r.Max.x)); column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); // Keep header highlighted when context menu is open. - const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); ImGuiID id = window->GetID(label); ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal @@ -2961,12 +3105,11 @@ void ImGui::TableHeader(const char* label) //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] - // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + // Using AllowOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + const bool highlight = (table->HighlightColumnHeader == column_n); bool hovered, held; - bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); - if (g.ActiveId != id) - SetItemAllowOverlap(); - if (held || hovered || selected) + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowOverlap); + if (held || hovered || highlight) { const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); @@ -2978,7 +3121,7 @@ void ImGui::TableHeader(const char* label) if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding); if (held) table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; @@ -3036,19 +3179,190 @@ void ImGui::TableHeader(const char* label) RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); - if (text_clipped && hovered && g.ActiveId == 0 && IsItemHovered(ImGuiHoveredFlags_DelayNormal)) - SetTooltip("%.*s", (int)(label_end - label), label); + if (text_clipped && hovered && g.ActiveId == 0) + SetItemTooltip("%.*s", (int)(label_end - label), label); // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden if (IsMouseReleased(1) && IsItemHovered()) TableOpenContextMenu(column_n); } +// Unlike TableHeadersRow() it is not expected that you can reimplement or customize this with custom widgets. +// FIXME: No hit-testing/button on the angled header. +void ImGui::TableAngledHeadersRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + ImGuiTableTempData* temp_data = table->TempData; + temp_data->AngledHeadersRequests.resize(0); + temp_data->AngledHeadersRequests.reserve(table->ColumnsEnabledCount); + + // Which column needs highlight? + const ImGuiID row_id = GetID("##AngledHeaders"); + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + int highlight_column_n = table->HighlightColumnHeader; + if (highlight_column_n == -1 && table->HoveredColumnBody != -1) + if (table_instance->HoveredRowLast == 0 && table->HoveredColumnBorder == -1 && (g.ActiveId == 0 || g.ActiveId == row_id || (table->IsActiveIdInTable || g.DragDropActive))) + highlight_column_n = table->HoveredColumnBody; + + // Build up request + ImU32 col_header_bg = GetColorU32(ImGuiCol_TableHeaderBg); + ImU32 col_text = GetColorU32(ImGuiCol_Text); + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + if ((column->Flags & ImGuiTableColumnFlags_AngledHeader) == 0) // Note: can't rely on ImGuiTableColumnFlags_IsVisible test here. + continue; + ImGuiTableHeaderData request = { (ImGuiTableColumnIdx)column_n, col_text, col_header_bg, (column_n == highlight_column_n) ? GetColorU32(ImGuiCol_Header) : 0 }; + temp_data->AngledHeadersRequests.push_back(request); + } + + // Render row + TableAngledHeadersRowEx(row_id, g.Style.TableAngledHeadersAngle, 0.0f, temp_data->AngledHeadersRequests.Data, temp_data->AngledHeadersRequests.Size); +} + +// Important: data must be fed left to right +void ImGui::TableAngledHeadersRowEx(ImGuiID row_id, float angle, float max_label_width, const ImGuiTableHeaderData* data, int data_count) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + ImGuiWindow* window = g.CurrentWindow; + ImDrawList* draw_list = window->DrawList; + IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); + IM_ASSERT(table->CurrentRow == -1 && "Must be first row"); + + if (max_label_width == 0.0f) + max_label_width = TableGetHeaderAngledMaxLabelWidth(); + + // Angle argument expressed in (-IM_PI/2 .. +IM_PI/2) as it is easier to think about for user. + const bool flip_label = (angle < 0.0f); + angle -= IM_PI * 0.5f; + const float cos_a = ImCos(angle); + const float sin_a = ImSin(angle); + const float label_cos_a = flip_label ? ImCos(angle + IM_PI) : cos_a; + const float label_sin_a = flip_label ? ImSin(angle + IM_PI) : sin_a; + const ImVec2 unit_right = ImVec2(cos_a, sin_a); + + // Calculate our base metrics and set angled headers data _before_ the first call to TableNextRow() + // FIXME-STYLE: Would it be better for user to submit 'max_label_width' or 'row_height' ? One can be derived from the other. + const float header_height = g.FontSize + g.Style.CellPadding.x * 2.0f; + const float row_height = ImTrunc(ImFabs(ImRotate(ImVec2(max_label_width, flip_label ? +header_height : -header_height), cos_a, sin_a).y)); + table->AngledHeadersHeight = row_height; + table->AngledHeadersSlope = (sin_a != 0.0f) ? (cos_a / sin_a) : 0.0f; + const ImVec2 header_angled_vector = unit_right * (row_height / -sin_a); // vector from bottom-left to top-left, and from bottom-right to top-right + + // Declare row, override and draw our own background + TableNextRow(ImGuiTableRowFlags_Headers, row_height); + TableNextColumn(); + const ImRect row_r(table->WorkRect.Min.x, table->BgClipRect.Min.y, table->WorkRect.Max.x, table->RowPosY2); + table->DrawSplitter->SetCurrentChannel(draw_list, TABLE_DRAW_CHANNEL_BG0); + float clip_rect_min_x = table->BgClipRect.Min.x; + if (table->FreezeColumnsCount > 0) + clip_rect_min_x = ImMax(clip_rect_min_x, table->Columns[table->FreezeColumnsCount - 1].MaxX); + TableSetBgColor(ImGuiTableBgTarget_RowBg0, 0); // Cancel + PushClipRect(table->BgClipRect.Min, table->BgClipRect.Max, false); // Span all columns + draw_list->AddRectFilled(ImVec2(table->BgClipRect.Min.x, row_r.Min.y), ImVec2(table->BgClipRect.Max.x, row_r.Max.y), GetColorU32(ImGuiCol_TableHeaderBg, 0.25f)); // FIXME-STYLE: Change row background with an arbitrary color. + PushClipRect(ImVec2(clip_rect_min_x, table->BgClipRect.Min.y), table->BgClipRect.Max, true); // Span all columns + + ButtonBehavior(row_r, row_id, NULL, NULL); + KeepAliveID(row_id); + + const float ascent_scaled = g.Font->Ascent * (g.FontSize / g.Font->FontSize); // FIXME: Standardize those scaling factors better + const float line_off_for_ascent_x = (ImMax((g.FontSize - ascent_scaled) * 0.5f, 0.0f) / -sin_a) * (flip_label ? -1.0f : 1.0f); + const ImVec2 padding = g.Style.CellPadding; // We will always use swapped component + const ImVec2 align = g.Style.TableAngledHeadersTextAlign; + + // Draw background and labels in first pass, then all borders. + float max_x = 0.0f; + for (int pass = 0; pass < 2; pass++) + for (int order_n = 0; order_n < data_count; order_n++) + { + const ImGuiTableHeaderData* request = &data[order_n]; + const int column_n = request->Index; + ImGuiTableColumn* column = &table->Columns[column_n]; + + ImVec2 bg_shape[4]; + bg_shape[0] = ImVec2(column->MaxX, row_r.Max.y); + bg_shape[1] = ImVec2(column->MinX, row_r.Max.y); + bg_shape[2] = bg_shape[1] + header_angled_vector; + bg_shape[3] = bg_shape[0] + header_angled_vector; + if (pass == 0) + { + // Draw shape + draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor0); + draw_list->AddQuadFilled(bg_shape[0], bg_shape[1], bg_shape[2], bg_shape[3], request->BgColor1); // Optional highlight + max_x = ImMax(max_x, bg_shape[3].x); + + // Draw label + // - First draw at an offset where RenderTextXXX() function won't meddle with applying current ClipRect, then transform to final offset. + // - Handle multiple lines manually, as we want each lines to follow on the horizontal border, rather than see a whole block rotated. + const char* label_name = TableGetColumnName(table, column_n); + const char* label_name_end = FindRenderedTextEnd(label_name); + const float line_off_step_x = (g.FontSize / -sin_a); + const int label_lines = ImTextCountLines(label_name, label_name_end); + + // Left<>Right alignment + float line_off_curr_x = flip_label ? (label_lines - 1) * line_off_step_x : 0.0f; + float line_off_for_align_x = ImMax((((column->MaxX - column->MinX) - padding.x * 2.0f) - (label_lines * line_off_step_x)), 0.0f) * align.x; + line_off_curr_x += line_off_for_align_x - line_off_for_ascent_x; + + // Register header width + column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX + ImCeil(label_lines * line_off_step_x - line_off_for_align_x); + + while (label_name < label_name_end) + { + const char* label_name_eol = strchr(label_name, '\n'); + if (label_name_eol == NULL) + label_name_eol = label_name_end; + + // FIXME: Individual line clipping for right-most column is broken for negative angles. + ImVec2 label_size = CalcTextSize(label_name, label_name_eol); + float clip_width = max_label_width - padding.y; // Using padding.y*2.0f would be symmetrical but hide more text. + float clip_height = ImMin(label_size.y, column->ClipRect.Max.x - column->WorkMinX - line_off_curr_x); + ImRect clip_r(window->ClipRect.Min, window->ClipRect.Min + ImVec2(clip_width, clip_height)); + int vtx_idx_begin = draw_list->_VtxCurrentIdx; + PushStyleColor(ImGuiCol_Text, request->TextColor); + RenderTextEllipsis(draw_list, clip_r.Min, clip_r.Max, clip_r.Max.x, clip_r.Max.x, label_name, label_name_eol, &label_size); + PopStyleColor(); + int vtx_idx_end = draw_list->_VtxCurrentIdx; + + // Up<>Down alignment + const float available_space = ImMax(clip_width - label_size.x + ImAbs(padding.x * cos_a) * 2.0f - ImAbs(padding.y * sin_a) * 2.0f, 0.0f); + const float vertical_offset = available_space * align.y * (flip_label ? -1.0f : 1.0f); + + // Rotate and offset label + ImVec2 pivot_in = ImVec2(window->ClipRect.Min.x - vertical_offset, window->ClipRect.Min.y + label_size.y); + ImVec2 pivot_out = ImVec2(column->WorkMinX, row_r.Max.y); + line_off_curr_x += flip_label ? -line_off_step_x : line_off_step_x; + pivot_out += unit_right * padding.y; + if (flip_label) + pivot_out += unit_right * (clip_width - ImMax(0.0f, clip_width - label_size.x)); + pivot_out.x += flip_label ? line_off_curr_x + line_off_step_x : line_off_curr_x; + ShadeVertsTransformPos(draw_list, vtx_idx_begin, vtx_idx_end, pivot_in, label_cos_a, label_sin_a, pivot_out); // Rotate and offset + //if (g.IO.KeyShift) { ImDrawList* fg_dl = GetForegroundDrawList(); vtx_idx_begin = fg_dl->_VtxCurrentIdx; fg_dl->AddRect(clip_r.Min, clip_r.Max, IM_COL32(0, 255, 0, 255), 0.0f, 0, 1.0f); ShadeVertsTransformPos(fg_dl, vtx_idx_begin, fg_dl->_VtxCurrentIdx, pivot_in, label_cos_a, label_sin_a, pivot_out); } + + label_name = label_name_eol + 1; + } + } + if (pass == 1) + { + // Draw border + draw_list->AddLine(bg_shape[0], bg_shape[3], TableGetColumnBorderCol(table, order_n, column_n)); + } + } + PopClipRect(); + PopClipRect(); + table->TempData->AngledHeadersExtraWidth = ImMax(0.0f, max_x - table->Columns[table->RightMostEnabledColumn].MaxX); +} + //------------------------------------------------------------------------- // [SECTION] Tables: Context Menu //------------------------------------------------------------------------- // - TableOpenContextMenu() [Internal] -// - TableDrawContextMenu() [Internal] +// - TableBeginContextMenuPopup() [Internal] +// - TableDrawDefaultContextMenu() [Internal] //------------------------------------------------------------------------- // Use -1 to open menu not specific to a given column. @@ -3084,7 +3398,13 @@ bool ImGui::TableBeginContextMenuPopup(ImGuiTable* table) // Output context menu into current window (generally a popup) // FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? -void ImGui::TableDrawContextMenu(ImGuiTable* table) +// Sections to display are pulled from 'flags_for_section_to_display', which is typically == table->Flags. +// - ImGuiTableFlags_Resizable -> display Sizing menu items +// - ImGuiTableFlags_Reorderable -> display "Reset Order" +////- ImGuiTableFlags_Sortable -> display sorting options (disabled) +// - ImGuiTableFlags_Hideable -> display columns visibility menu items +// It means if you have a custom context menus you can call this section and omit some sections, and add your own. +void ImGui::TableDrawDefaultContextMenu(ImGuiTable* table, ImGuiTableFlags flags_for_section_to_display) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; @@ -3096,7 +3416,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; // Sizing - if (table->Flags & ImGuiTableFlags_Resizable) + if (flags_for_section_to_display & ImGuiTableFlags_Resizable) { if (column != NULL) { @@ -3116,7 +3436,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) } // Ordering - if (table->Flags & ImGuiTableFlags_Reorderable) + if (flags_for_section_to_display & ImGuiTableFlags_Reorderable) { if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableResetOrder), NULL, false, !table->IsDefaultDisplayOrder)) table->IsResetDisplayOrderRequest = true; @@ -3130,7 +3450,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) // Sorting // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) #if 0 - if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) + if ((flags_for_section_to_display & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) { if (want_separator) Separator(); @@ -3145,7 +3465,7 @@ void ImGui::TableDrawContextMenu(ImGuiTable* table) #endif // Hiding / Visibility - if (table->Flags & ImGuiTableFlags_Hideable) + if (flags_for_section_to_display & ImGuiTableFlags_Hideable) { if (want_separator) Separator(); @@ -3581,7 +3901,8 @@ static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_poli void ImGui::DebugNodeTable(ImGuiTable* table) { - const bool is_active = (table->LastFrameActive >= GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. + ImGuiContext& g = *GImGui; + const bool is_active = (table->LastFrameActive >= g.FrameCount - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } bool open = TreeNode(table, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); if (!is_active) { PopStyleColor(); } @@ -3593,12 +3914,24 @@ void ImGui::DebugNodeTable(ImGuiTable* table) return; if (table->InstanceCurrent > 0) Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1); + if (g.IO.ConfigDebugIsDebuggerPresent) + { + if (DebugBreakButton("**DebugBreak**", "in BeginTable()")) + g.DebugBreakInTable = table->ID; + SameLine(); + } + bool clear_settings = SmallButton("Clear settings"); BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); + for (int n = 0; n < table->InstanceCurrent + 1; n++) + { + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, n); + BulletText("Instance %d: HoveredRow: %d, LastOuterHeight: %.2f", n, table_instance->HoveredRowLast, table_instance->LastOuterHeight); + } //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); float sum_weights = 0.0f; for (int n = 0; n < table->ColumnsCount; n++) @@ -3724,7 +4057,7 @@ float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offse return offset / (columns->OffMaxX - columns->OffMinX); } -static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; +static const float COLUMNS_HIT_RECT_HALF_THICKNESS = 4.0f; static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) { @@ -3735,7 +4068,7 @@ static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); - float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; + float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale) - window->Pos.x; x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); @@ -3908,7 +4241,7 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl // Set state for first column // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect const float column_padding = g.Style.ItemSpacing.x; - const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); + const float half_clip_extend_x = ImTrunc(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); @@ -3955,8 +4288,9 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFl float width = offset_1 - offset_0; PushItemWidth(width * 0.65f); window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; + window->WorkRect.Max.y = window->ContentRegionRect.Max.y; } void ImGui::NextColumn() @@ -3970,7 +4304,7 @@ void ImGui::NextColumn() if (columns->Count == 1) { - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); IM_ASSERT(columns->Current == 0); return; } @@ -4002,7 +4336,7 @@ void ImGui::NextColumn() window->DC.IsSameLine = false; columns->LineMinY = columns->LineMaxY; } - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); window->DC.CursorPos.y = columns->LineMinY; window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); window->DC.CurrLineTextBaseOffset = 0.0f; @@ -4049,7 +4383,7 @@ void ImGui::EndColumns() ImGuiOldColumnData* column = &columns->Columns[n]; float x = window->Pos.x + GetColumnOffset(n); const ImGuiID column_id = columns->ID + ImGuiID(n); - const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; + const float column_hit_hw = ImTrunc(COLUMNS_HIT_RECT_HALF_THICKNESS * g.CurrentDpiScale); const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); if (!ItemAdd(column_hit_rect, column_id, NULL, ImGuiItemFlags_NoNav)) continue; @@ -4066,7 +4400,7 @@ void ImGui::EndColumns() // Draw column const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); - const float xi = IM_FLOOR(x); + const float xi = IM_TRUNC(x); window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); } @@ -4087,7 +4421,7 @@ void ImGui::EndColumns() window->ParentWorkRect = columns->HostBackupParentWorkRect; window->DC.CurrentColumns = NULL; window->DC.ColumnsOffset.x = 0.0f; - window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.x = IM_TRUNC(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); NavUpdateCurrentWindowIsScrollPushableX(); } diff --git a/core/deps/imgui/imgui_widgets.cpp b/core/deps/imgui/imgui_widgets.cpp index af4799d12..1b13bfd05 100644 --- a/core/deps/imgui/imgui_widgets.cpp +++ b/core/deps/imgui/imgui_widgets.cpp @@ -1,4 +1,4 @@ -// dear imgui, v1.89.6 +// dear imgui, v1.90.8 // (widgets code) /* @@ -18,6 +18,8 @@ Index of this file: // [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. // [SECTION] Widgets: TreeNode, CollapsingHeader, etc. // [SECTION] Widgets: Selectable +// [SECTION] Widgets: Typing-Select support +// [SECTION] Widgets: Multi-Select support // [SECTION] Widgets: ListBox // [SECTION] Widgets: PlotLines, PlotHistogram // [SECTION] Widgets: Value helpers @@ -41,11 +43,7 @@ Index of this file: #include "imgui_internal.h" // System includes -#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier -#include // intptr_t -#else #include // intptr_t -#endif //------------------------------------------------------------------------- // Warnings @@ -77,6 +75,7 @@ Index of this file: #pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') #pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" // warning: 'xxx' is an unsafe pointer used for buffer access #elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind #pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked @@ -124,9 +123,9 @@ static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1); //------------------------------------------------------------------------- // For InputTextEx() -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source); -static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); -static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); +static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard = false); +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); +static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); //------------------------------------------------------------------------- // [SECTION] Widgets: Text, etc. @@ -479,6 +478,9 @@ void ImGui::BulletTextV(const char* fmt, va_list args) // Frame N + RepeatDelay + RepeatRate*N true true - true //------------------------------------------------------------------------------------------------------------------------------------------------- +// FIXME: For refactor we could output flags, incl mouse hovered vs nav keyboard vs nav triggered etc. +// And better standardize how widgets use 'GetColor32((held && hovered) ? ... : hovered ? ...)' vs 'GetColor32(held ? ... : hovered ? ...);' +// For mouse feedback we typically prefer the 'held && hovered' test, but for nav feedback not always. Outputting hovered=true on Activation may be misleading. bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) { ImGuiContext& g = *GImGui; @@ -486,12 +488,20 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // Default only reacts to left mouse button if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0) - flags |= ImGuiButtonFlags_MouseButtonDefault_; + flags |= ImGuiButtonFlags_MouseButtonLeft; // Default behavior requires click + release inside bounding box if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) flags |= ImGuiButtonFlags_PressedOnDefault_; + // Default behavior inherited from item flags + // Note that _both_ ButtonFlags and ItemFlags are valid sources, so copy one into the item_flags and only check that. + ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); + if (flags & ImGuiButtonFlags_AllowOverlap) + item_flags |= ImGuiItemFlags_AllowOverlap; + if (flags & ImGuiButtonFlags_Repeat) + item_flags |= ImGuiItemFlags_ButtonRepeat; + ImGuiWindow* backup_hovered_window = g.HoveredWindow; const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; if (flatten_hovered_children) @@ -499,16 +509,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool #ifdef IMGUI_ENABLE_TEST_ENGINE // Alternate registration spot, for when caller didn't use ItemAdd() - if (id != 0 && g.LastItemData.ID != id) + if (g.LastItemData.ID != id) IMGUI_TEST_ENGINE_ITEM_ADD(id, bb, NULL); #endif bool pressed = false; - bool hovered = ItemHoverable(bb, id); - - // Drag source doesn't report as hovered - if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) - hovered = false; + bool hovered = ItemHoverable(bb, id, item_flags); // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) @@ -527,14 +533,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool if (flatten_hovered_children) g.HoveredWindow = backup_hovered_window; - // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. - if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) - hovered = false; - // Mouse handling const ImGuiID test_owner_id = (flags & ImGuiButtonFlags_NoTestKeyOwner) ? ImGuiKeyOwner_Any : id; if (hovered) { + IM_ASSERT(id != 0); // Lazily check inside rare path. + // Poll mouse buttons // - 'mouse_button_clicked' is generally carried into ActiveIdMouseButton when setting ActiveId. // - Technically we only need some values in one code path, but since this is gated by hovered test this is fine. @@ -543,7 +547,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool for (int button = 0; button < 3; button++) if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here. { - if (IsMouseClicked(button, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } + if (IsMouseClicked(button, ImGuiInputFlags_None, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; } } @@ -579,7 +583,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool { if (mouse_button_released != -1) { - const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior + const bool has_repeated_at_least_once = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior if (!has_repeated_at_least_once) pressed = true; if (!(flags & ImGuiButtonFlags_NoNavFocus)) @@ -590,8 +594,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. - if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) - if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, test_owner_id, ImGuiInputFlags_Repeat)) + if (g.ActiveId == id && (item_flags & ImGuiItemFlags_ButtonRepeat)) + if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, ImGuiInputFlags_Repeat, test_owner_id)) pressed = true; } @@ -599,16 +603,16 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool g.NavDisableHighlight = true; } - // Gamepad/Keyboard navigation - // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. - if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) + // Gamepad/Keyboard handling + // We report navigated and navigation-activated items as hovered but we don't set g.HoveredId to not interfere with mouse. + if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover) if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) hovered = true; if (g.NavActivateDownId == id) { bool nav_activated_by_code = (g.NavActivateId == id); bool nav_activated_by_inputs = (g.NavActivatePressedId == id); - if (!nav_activated_by_inputs && (flags & ImGuiButtonFlags_Repeat)) + if (!nav_activated_by_inputs && (item_flags & ImGuiItemFlags_ButtonRepeat)) { // Avoid pressing multiple keys from triggering excessive amount of repeat events const ImGuiKeyData* key1 = GetKeyData(ImGuiKey_Space); @@ -623,8 +627,10 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool pressed = true; SetActiveID(id, window); g.ActiveIdSource = g.NavInputSource; - if (!(flags & ImGuiButtonFlags_NoNavFocus)) + if (!(flags & ImGuiButtonFlags_NoNavFocus) && !(g.NavActivateFlags & ImGuiActivateFlags_FromShortcut)) SetFocusID(id, window); + if (g.NavActivateFlags & ImGuiActivateFlags_FromShortcut) + g.ActiveIdFromShortcut = true; } } @@ -655,7 +661,7 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool { // Report as pressed when releasing the mouse (this is the most common path) bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2; - bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps + bool is_repeating_already = (item_flags & ImGuiItemFlags_ButtonRepeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps bool is_button_avail_or_owned = TestKeyOwner(MouseButtonToKey(mouse_button), test_owner_id); if (!is_double_click_release && !is_repeating_already && is_button_avail_or_owned) pressed = true; @@ -692,13 +698,19 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool else if (g.ActiveIdSource == ImGuiInputSource_Keyboard || g.ActiveIdSource == ImGuiInputSource_Gamepad) { // When activated using Nav, we hold on the ActiveID until activation button is released - if (g.NavActivateDownId != id) + if (g.NavActivateDownId == id) + held = true; // hovered == true not true as we are already likely hovered on direct activation. + else ClearActiveID(); } if (pressed) g.ActiveIdHasBeenPressedBefore = true; } + // Activation highlight (this may be a remote activation) + if (g.NavHighlightActivatedId == id) + hovered = true; + if (out_hovered) *out_hovered = hovered; if (out_held) *out_held = held; @@ -726,9 +738,6 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags if (!ItemAdd(bb, id)) return false; - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); @@ -805,9 +814,6 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu if (!ItemAdd(bb, id)) return false; - if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) - flags |= ImGuiButtonFlags_Repeat; - bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); @@ -836,14 +842,14 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? - const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize)); ImRect bb_interact = bb; const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); if (area_to_visible_ratio < 1.5f) - bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); + bb_interact.Expand(ImTrunc(bb_interact.GetSize() * -0.25f)); // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. - // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). + // (this isn't the common behavior of buttons, but it doesn't affect the user because navigation tends to keep items visible in scrolling layer). bool is_clipped = !ItemAdd(bb_interact, id); bool hovered, held; @@ -872,17 +878,19 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; - ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); - ItemAdd(bb, id); + ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize)); + bool is_clipped = !ItemAdd(bb, id); bool hovered, held; bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); + if (is_clipped) + return pressed; // Render ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); ImU32 text_col = GetColorU32(ImGuiCol_Text); if (hovered || held) - window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col); - RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); + window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0.0f, -0.5f), g.FontSize * 0.5f + 1.0f, bg_col); + RenderArrow(window->DrawList, bb.Min, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); // Switch to moving the window after mouse is moved beyond the initial drag threshold if (IsItemActive() && IsMouseDragging(0)) @@ -905,9 +913,9 @@ ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) IM_ASSERT(scrollbar_size > 0.0f); if (axis == ImGuiAxis_X) - return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); + return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x - border_size, outer_rect.Max.y - border_size); else - return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); + return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x - border_size, inner_rect.Max.y - border_size); } void ImGui::Scrollbar(ImGuiAxis axis) @@ -932,10 +940,10 @@ void ImGui::Scrollbar(ImGuiAxis axis) if (!window->ScrollbarX) rounding_corners |= ImDrawFlags_RoundCornersBottomRight; } - float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; + float size_visible = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f; ImS64 scroll = (ImS64)window->Scroll[axis]; - ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_avail, (ImS64)size_contents, rounding_corners); + ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_visible, (ImS64)size_contents, rounding_corners); window->Scroll[axis] = (float)scroll; } @@ -945,7 +953,7 @@ void ImGui::Scrollbar(ImGuiAxis axis) // - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar // - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. // Still, the code should probably be made simpler.. -bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_avail_v, ImS64 size_contents_v, ImDrawFlags flags) +bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_visible_v, ImS64 size_contents_v, ImDrawFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; @@ -968,16 +976,16 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 const bool allow_interaction = (alpha >= 1.0f); ImRect bb = bb_frame; - bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); + bb.Expand(ImVec2(-ImClamp(IM_TRUNC((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_TRUNC((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) // But we maintain a minimum size in pixel to allow for the user to still aim inside. - IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. - const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), (ImS64)1); - const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_avail_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v); + IM_ASSERT(ImMax(size_contents_v, size_visible_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. + const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_visible_v), (ImS64)1); + const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_visible_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v); const float grab_h_norm = grab_h_pixels / scrollbar_size_v; // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). @@ -986,7 +994,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 ItemAdd(bb_frame, id, NULL, ImGuiItemFlags_NoNav); ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); - const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_avail_v); + const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_visible_v); float scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space if (held && allow_interaction && grab_h_norm < 1.0f) @@ -996,31 +1004,40 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 // Click position in scrollbar normalized space (0.0f->1.0f) const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); - SetHoveredID(id); - bool seek_absolute = false; + const int held_dir = (clicked_v_norm < grab_v_norm) ? -1 : (clicked_v_norm > grab_v_norm + grab_h_norm) ? +1 : 0; if (g.ActiveIdIsJustActivated) { // On initial click calculate the distance between mouse and the center of the grab - seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm); - if (seek_absolute) - g.ScrollbarClickDeltaToGrabCenter = 0.0f; - else - g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + g.ScrollbarSeekMode = (short)held_dir; + g.ScrollbarClickDeltaToGrabCenter = (g.ScrollbarSeekMode == 0.0f) ? clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f : 0.0f; } // Apply scroll (p_scroll_v will generally point on one member of window->Scroll) // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position - const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); - *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max); + if (g.ScrollbarSeekMode == 0) + { + // Absolute seeking + const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); + *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max); + } + else + { + // Page by page + if (IsMouseClicked(ImGuiMouseButton_Left, ImGuiInputFlags_Repeat) && held_dir == g.ScrollbarSeekMode) + { + float page_dir = (g.ScrollbarSeekMode > 0.0f) ? +1.0f : -1.0f; + *p_scroll_v = ImClamp(*p_scroll_v + (ImS64)(page_dir * size_visible_v), (ImS64)0, scroll_max); + } + } // Update values for rendering scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; - // Update distance to grab now that we have seeked and saturated - if (seek_absolute) - g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + // Update distance to grab now that we have seek'ed and saturated + //if (seek_absolute) + // g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; } // Render @@ -1037,33 +1054,30 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 return held; } -void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) +// - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples +// - 'uv0' and 'uv1' are texture coordinates. Read about them from the same link above. +void ImGui::Image(ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) { ImGuiWindow* window = GetCurrentWindow(); if (window->SkipItems) return; - ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); - if (border_col.w > 0.0f) - bb.Max += ImVec2(2, 2); + const float border_size = (border_col.w > 0.0f) ? 1.0f : 0.0f; + const ImVec2 padding(border_size, border_size); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f); ItemSize(bb); if (!ItemAdd(bb, 0)) return; - if (border_col.w > 0.0f) - { - window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); - window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col)); - } - else - { - window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); - } + // Render + if (border_size > 0.0f) + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f, ImDrawFlags_None, border_size); + window->DrawList->AddImage(user_texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); } // ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) // We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. -bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) { ImGuiContext& g = *GImGui; ImGuiWindow* window = GetCurrentWindow(); @@ -1071,7 +1085,7 @@ bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size return false; const ImVec2 padding = g.Style.FramePadding; - const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2.0f); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + image_size + padding * 2.0f); ItemSize(bb); if (!ItemAdd(bb, id)) return false; @@ -1090,14 +1104,15 @@ bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size return pressed; } -bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col) +// Note that ImageButton() adds style.FramePadding*2.0f to provided size. This is in order to facilitate fitting an image in a button. +bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& image_size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; if (window->SkipItems) return false; - return ImageButtonEx(window->GetID(str_id), user_texture_id, size, uv0, uv1, bg_col, tint_col); + return ImageButtonEx(window->GetID(str_id), user_texture_id, image_size, uv0, uv1, bg_col, tint_col); } #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS @@ -1164,12 +1179,12 @@ bool ImGui::Checkbox(const char* label, bool* v) { // Undocumented tristate/mixed/indeterminate checkbox (#2644) // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) - ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + ImVec2 pad(ImMax(1.0f, IM_TRUNC(square_sz / 3.6f)), ImMax(1.0f, IM_TRUNC(square_sz / 3.6f))); window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); } else if (*v) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); } @@ -1192,10 +1207,8 @@ bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) if (!all_on && any_on) { ImGuiContext& g = *GImGui; - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_MixedValue; + g.NextItemData.ItemFlags |= ImGuiItemFlags_MixedValue; pressed = Checkbox(label, &all_on); - g.CurrentItemFlags = backup_item_flags; } else { @@ -1266,7 +1279,7 @@ bool ImGui::RadioButton(const char* label, bool active) window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), num_segment); if (active) { - const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + const float pad = ImMax(1.0f, IM_TRUNC(square_sz / 6.0f)); window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark)); } @@ -1312,24 +1325,47 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over if (!ItemAdd(bb, 0)) return; + // Fraction < 0.0f will display an indeterminate progress bar animation + // The value must be animated along with time, so e.g. passing '-1.0f * ImGui::GetTime()' as fraction works. + const bool is_indeterminate = (fraction < 0.0f); + if (!is_indeterminate) + fraction = ImSaturate(fraction); + + // Out of courtesy we accept a NaN fraction without crashing + float fill_n0 = 0.0f; + float fill_n1 = (fraction == fraction) ? fraction : 0.0f; + + if (is_indeterminate) + { + const float fill_width_n = 0.2f; + fill_n0 = ImFmod(-fraction, 1.0f) * (1.0f + fill_width_n) - fill_width_n; + fill_n1 = ImSaturate(fill_n0 + fill_width_n); + fill_n0 = ImSaturate(fill_n0); + } + // Render - fraction = ImSaturate(fraction); RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); - const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); - RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); + RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), fill_n0, fill_n1, style.FrameRounding); // Default displaying the fraction as percentage string, but user can override it + // Don't display text for indeterminate bars by default char overlay_buf[32]; - if (!overlay) + if (!is_indeterminate || overlay != NULL) { - ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); - overlay = overlay_buf; - } + if (!overlay) + { + ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); + overlay = overlay_buf; + } - ImVec2 overlay_size = CalcTextSize(overlay, NULL); - if (overlay_size.x > 0.0f) - RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); + ImVec2 overlay_size = CalcTextSize(overlay, NULL); + if (overlay_size.x > 0.0f) + { + float text_x = is_indeterminate ? (bb.Min.x + bb.Max.x - overlay_size.x) * 0.5f : ImLerp(bb.Min.x, bb.Max.x, fill_n1) + style.ItemSpacing.x; + RenderTextClipped(ImVec2(ImClamp(text_x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); + } + } } void ImGui::Bullet() @@ -1446,26 +1482,19 @@ void ImGui::SeparatorEx(ImGuiSeparatorFlags flags, float thickness) else if (flags & ImGuiSeparatorFlags_Horizontal) { // Horizontal Separator - float x1 = window->Pos.x; - float x2 = window->Pos.x + window->Size.x; - - // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator - if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) - x1 += window->DC.Indent.x; - - // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want, - // need to introduce a variant of WorkRect for that purpose. (#4787) - if (ImGuiTable* table = g.CurrentTable) - { - x1 = table->Columns[table->CurrentColumn].MinX; - x2 = table->Columns[table->CurrentColumn].MaxX; - } + float x1 = window->DC.CursorPos.x; + float x2 = window->WorkRect.Max.x; + // Preserve legacy behavior inside Columns() // Before Tables API happened, we relied on Separator() to span all columns of a Columns() set. // We currently don't need to provide the same feature for tables because tables naturally have border features. ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; if (columns) + { + x1 = window->Pos.x + window->DC.Indent.x; // Used to be Pos.x before 2023/10/03 + x2 = window->Pos.x + window->Size.x; PushColumnsBackground(); + } // We don't provide our width to the layout so that it doesn't get feed back into AutoFit // FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell) @@ -1499,7 +1528,11 @@ void ImGui::Separator() // Those flags should eventually be configurable by the user // FIXME: We cannot g.Style.SeparatorTextBorderSize for thickness as it relates to SeparatorText() which is a decorated separator, not defaulting to 1.0f. ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; - flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot. + + // Only applies to legacy Columns() api as they relied on Separator() a lot. + if (window->DC.CurrentColumns) + flags |= ImGuiSeparatorFlags_SpanAllColumns; + SeparatorEx(flags, 1.0f); } @@ -1516,14 +1549,14 @@ void ImGui::SeparatorTextEx(ImGuiID id, const char* label, const char* label_end const float separator_thickness = style.SeparatorTextBorderSize; const ImVec2 min_size(label_size.x + extra_w + padding.x * 2.0f, ImMax(label_size.y + padding.y * 2.0f, separator_thickness)); const ImRect bb(pos, ImVec2(window->WorkRect.Max.x, pos.y + min_size.y)); - const float text_baseline_y = ImFloor((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f)); + const float text_baseline_y = ImTrunc((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f)); ItemSize(min_size, text_baseline_y); if (!ItemAdd(bb, id)) return; const float sep1_x1 = pos.x; const float sep2_x2 = bb.Max.x; - const float seps_y = ImFloor((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f); + const float seps_y = ImTrunc((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f); const float label_avail_w = ImMax(0.0f, sep2_x2 - sep1_x1 - padding.x * 2.0f); const ImVec2 label_pos(pos.x + padding.x + ImMax(0.0f, (label_avail_w - label_size.x - extra_w) * style.SeparatorTextAlign.x), pos.y + text_baseline_y); // FIXME-ALIGN @@ -1577,14 +1610,20 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float if (!ItemAdd(bb, id, NULL, ImGuiItemFlags_NoNav)) return false; + // FIXME: AFAIK the only leftover reason for passing ImGuiButtonFlags_AllowOverlap here is + // to allow caller of SplitterBehavior() to call SetItemAllowOverlap() after the item. + // Nowadays we would instead want to use SetNextItemAllowOverlap() before the item. + ImGuiButtonFlags button_flags = ImGuiButtonFlags_FlattenChildren; +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + button_flags |= ImGuiButtonFlags_AllowOverlap; +#endif + bool hovered, held; ImRect bb_interact = bb; bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); - ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); + ButtonBehavior(bb_interact, id, &hovered, &held, button_flags); if (hovered) g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb - if (g.ActiveId != id) - SetItemAllowOverlap(); if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay)) SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); @@ -1592,8 +1631,7 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float ImRect bb_render = bb; if (held) { - ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; - float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; + float mouse_delta = (g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min)[axis]; // Minimum pane size float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1); @@ -1606,12 +1644,8 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float // Apply resize if (mouse_delta != 0.0f) { - if (mouse_delta < 0.0f) - IM_ASSERT(*size1 + mouse_delta >= min_size1); - if (mouse_delta > 0.0f) - IM_ASSERT(*size2 - mouse_delta >= min_size2); - *size1 += mouse_delta; - *size2 -= mouse_delta; + *size1 = ImMax(*size1 + mouse_delta, min_size1); + *size2 = ImMax(*size2 - mouse_delta, min_size2); bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); MarkItemEdited(id); } @@ -1665,7 +1699,7 @@ void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_exc width_excess = 0.0f; for (int n = 0; n < count; n++) { - float width_rounded = ImFloor(items[n].Width); + float width_rounded = ImTrunc(items[n].Width); width_excess += items[n].Width - width_rounded; items[n].Width = width_rounded; } @@ -1711,10 +1745,13 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF const ImGuiStyle& style = g.Style; const ImGuiID id = window->GetID(label); IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together + if (flags & ImGuiComboFlags_WidthFitPreview) + IM_ASSERT((flags & (ImGuiComboFlags_NoPreview | (ImGuiComboFlags)ImGuiComboFlags_CustomPreview)) == 0); const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); const ImVec2 label_size = CalcTextSize(label, NULL, true); - const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth(); + const float preview_width = ((flags & ImGuiComboFlags_WidthFitPreview) && (preview_value != NULL)) ? CalcTextSize(preview_value, NULL, true).x : 0.0f; + const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : ((flags & ImGuiComboFlags_WidthFitPreview) ? (arrow_size + preview_width + style.FramePadding.x * 2.0f) : CalcItemWidth()); const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); ItemSize(total_bb, style.FramePadding.y); @@ -1807,7 +1844,7 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags // This is essentially a specialized version of BeginPopupEx() char name[16]; - ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth + ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginComboDepth); // Recycle windows based on depth // Set position given a custom constraint (peak into expected window size so we can position it) // FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function? @@ -1834,12 +1871,15 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above return false; } + g.BeginComboDepth++; return true; } void ImGui::EndCombo() { + ImGuiContext& g = *GImGui; EndPopup(); + g.BeginComboDepth--; } // Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements @@ -1853,7 +1893,7 @@ bool ImGui::BeginComboPreview() if (window->SkipItems || !(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible)) return false; IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag? - if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional) + if (!window->ClipRect.Overlaps(preview_data->PreviewRect)) // Narrower test (optional) return false; // FIXME: This could be contained in a PushWorkRect() api @@ -1896,18 +1936,15 @@ void ImGui::EndComboPreview() } // Getter for the old Combo() API: const char*[] -static bool Items_ArrayGetter(void* data, int idx, const char** out_text) +static const char* Items_ArrayGetter(void* data, int idx) { const char* const* items = (const char* const*)data; - if (out_text) - *out_text = items[idx]; - return true; + return items[idx]; } // Getter for the old Combo() API: "item1\0item2\0item3\0" -static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) +static const char* Items_SingleStringGetter(void* data, int idx) { - // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. const char* items_separated_by_zeros = (const char*)data; int items_count = 0; const char* p = items_separated_by_zeros; @@ -1918,22 +1955,18 @@ static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) p += strlen(p) + 1; items_count++; } - if (!*p) - return false; - if (out_text) - *out_text = p; - return true; + return *p ? p : NULL; } // Old API, prefer using BeginCombo() nowadays if you can. -bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) +bool ImGui::Combo(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int popup_max_height_in_items) { ImGuiContext& g = *GImGui; // Call the getter to obtain the preview string which is a parameter to BeginCombo() const char* preview_value = NULL; if (*current_item >= 0 && *current_item < items_count) - items_getter(data, *current_item, &preview_value); + preview_value = getter(user_data, *current_item); // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) @@ -1943,27 +1976,30 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi return false; // Display items - // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed) bool value_changed = false; - for (int i = 0; i < items_count; i++) - { - PushID(i); - const bool item_selected = (i == *current_item); - const char* item_text; - if (!items_getter(data, i, &item_text)) - item_text = "*Unknown item*"; - if (Selectable(item_text, item_selected)) + ImGuiListClipper clipper; + clipper.Begin(items_count); + clipper.IncludeItemByIndex(*current_item); + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - value_changed = true; - *current_item = i; + const char* item_text = getter(user_data, i); + if (item_text == NULL) + item_text = "*Unknown item*"; + + PushID(i); + const bool item_selected = (i == *current_item); + if (Selectable(item_text, item_selected) && *current_item != i) + { + value_changed = true; + *current_item = i; + } + if (item_selected) + SetItemDefaultFocus(); + PopID(); } - if (item_selected) - SetItemDefaultFocus(); - PopID(); - } EndCombo(); - if (value_changed) MarkItemEdited(g.LastItemData.ID); @@ -1991,13 +2027,37 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa return value_changed; } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +struct ImGuiGetNameFromIndexOldToNewCallbackData { void* UserData; bool (*OldCallback)(void*, int, const char**); }; +static const char* ImGuiGetNameFromIndexOldToNewCallback(void* user_data, int idx) +{ + ImGuiGetNameFromIndexOldToNewCallbackData* data = (ImGuiGetNameFromIndexOldToNewCallbackData*)user_data; + const char* s = NULL; + data->OldCallback(data->UserData, idx, &s); + return s; +} + +bool ImGui::ListBox(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int height_in_items) +{ + ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter }; + return ListBox(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, height_in_items); +} +bool ImGui::Combo(const char* label, int* current_item, bool (*old_getter)(void*, int, const char**), void* user_data, int items_count, int popup_max_height_in_items) +{ + ImGuiGetNameFromIndexOldToNewCallbackData old_to_new_data = { user_data, old_getter }; + return Combo(label, current_item, ImGuiGetNameFromIndexOldToNewCallback, &old_to_new_data, items_count, popup_max_height_in_items); +} + +#endif + //------------------------------------------------------------------------- // [SECTION] Data Type and Data Formatting Helpers [Internal] //------------------------------------------------------------------------- // - DataTypeGetInfo() // - DataTypeFormatString() // - DataTypeApplyOp() -// - DataTypeApplyOpFromText() +// - DataTypeApplyFromText() // - DataTypeCompare() // - DataTypeClamp() // - GetMinimumStepAtDecimalPrecision @@ -2105,17 +2165,24 @@ void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const // User can input math operators (e.g. +100) to edit a numerical values. // NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. -bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format) +bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format, void* p_data_when_empty) { + // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. + const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); + ImGuiDataTypeStorage data_backup; + memcpy(&data_backup, p_data, type_info->Size); + while (ImCharIsBlankA(*buf)) buf++; if (!buf[0]) + { + if (p_data_when_empty != NULL) + { + memcpy(p_data, p_data_when_empty, type_info->Size); + return memcmp(&data_backup, p_data, type_info->Size) != 0; + } return false; - - // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. - const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); - ImGuiDataTypeTempStorage data_backup; - memcpy(&data_backup, p_data, type_info->Size); + } // Sanitize format // - For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf @@ -2285,7 +2352,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); - const float tweak_factor = tweak_slow ? 1.0f / 1.0f : tweak_fast ? 10.0f : 1.0f; + const float tweak_factor = tweak_slow ? 1.0f / 10.0f : tweak_fast ? 10.0f : 1.0f; adjust_delta = GetNavTweakPressedAmount(axis) * tweak_factor; v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); } @@ -2439,19 +2506,18 @@ bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { // Tabbing or CTRL-clicking on Drag turns it into an InputText - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = hovered && IsMouseClicked(0, id); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id)); - const bool make_active = (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id); + const bool make_active = (clicked || double_clicked || g.NavActivateId == id); if (make_active && (clicked || double_clicked)) SetKeyOwner(ImGuiKey_MouseLeft, id); if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + if ((clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) temp_input_is_active = true; // (Optional) simple click (without moving) turns Drag into an InputText @@ -2802,14 +2868,14 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); - const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); + const float v_range_f = (float)(v_min < v_max ? v_max - v_min : v_min - v_max); // We don't need high precision for what we do with it. // Calculate bounds const float grab_padding = 2.0f; // FIXME: Should be part of style. const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; float grab_sz = style.GrabMinSize; - if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows - grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit + if (!is_floating_point && v_range_f >= 0.0f) // v_range_f < 0 may happen on integer overflows + grab_sz = ImMax(slider_sz / (v_range_f + 1), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit grab_sz = ImMin(grab_sz, slider_sz); const float slider_usable_sz = slider_sz - grab_sz; const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; @@ -2878,8 +2944,8 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ } else { - if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow) - input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps + if ((v_range_f >= -100.0f && v_range_f <= 100.0f && v_range_f != 0.0f) || tweak_slow) + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / v_range_f; // Gamepad/keyboard tweak speeds in integer steps else input_delta /= 100.0f; } @@ -2926,6 +2992,10 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ } } + if (set_new_value) + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + set_new_value = false; + if (set_new_value) { TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); @@ -2971,11 +3041,6 @@ bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); - // Those are the things we can do easily outside the SliderBehaviorT<> template, saves code generation. - ImGuiContext& g = *GImGui; - if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) - return false; - switch (data_type) { case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } @@ -3032,18 +3097,17 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_dat if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); if (!temp_input_is_active) { // Tabbing or CTRL-clicking on Slider turns it into an input box - const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; - const bool clicked = hovered && IsMouseClicked(0, id); - const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); + const bool make_active = (clicked || g.NavActivateId == id); if (make_active && clicked) SetKeyOwner(ImGuiKey_MouseLeft, id); if (make_active && temp_input_allowed) - if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + if ((clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) temp_input_is_active = true; if (make_active && !temp_input_is_active) @@ -3199,8 +3263,8 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - const bool hovered = ItemHoverable(frame_bb, id); - const bool clicked = hovered && IsMouseClicked(0, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); + const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); if (clicked || g.NavActivateId == id) { if (clicked) @@ -3415,14 +3479,6 @@ bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* return value_changed; } -static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format) -{ - if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) - return ImGuiInputTextFlags_CharsScientific; - const char format_last_char = format[0] ? format[strlen(format) - 1] : 0; - return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal; -} - // Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! // This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. // However this may not be ideal for all uses, as some user code may break on out of bound values. @@ -3439,19 +3495,18 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); ImStrTrimBlanks(data_buf); - ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; - flags |= InputScalar_DefaultCharsFilter(data_type, format); + ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint; bool value_changed = false; if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) { // Backup old value size_t data_type_size = type_info->Size; - ImGuiDataTypeTempStorage data_backup; + ImGuiDataTypeStorage data_backup; memcpy(&data_backup, p_data, data_type_size); // Apply new value (or operations) then clamp - DataTypeApplyFromText(data_buf, data_type, p_data, format); + DataTypeApplyFromText(data_buf, data_type, p_data, format, NULL); if (p_clamp_min || p_clamp_max) { if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0) @@ -3467,6 +3522,13 @@ bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImG return value_changed; } +void ImGui::SetNextItemRefVal(ImGuiDataType data_type, void* p_data) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasRefVal; + memcpy(&g.NextItemData.RefVal, p_data, DataTypeGetInfo(data_type)->Size); +} + // Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. // Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) @@ -3481,19 +3543,22 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; + void* p_data_default = (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasRefVal) ? &g.NextItemData.RefVal : &g.DataTypeZeroValue; + char buf[64]; - DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); + if ((flags & ImGuiInputTextFlags_DisplayEmptyRefVal) && DataTypeCompare(data_type, p_data, p_data_default) == 0) + buf[0] = 0; + else + DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); - // Testing ActiveId as a minor optimization as filtering is not needed until active - if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) - flags |= InputScalar_DefaultCharsFilter(data_type, format); - flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + flags |= ImGuiInputTextFlags_AutoSelectAll | (ImGuiInputTextFlags)ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + flags |= (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint; bool value_changed = false; if (p_step == NULL) { if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) - value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL); } else { @@ -3503,7 +3568,7 @@ bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data PushID(label); SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view - value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format, (flags & ImGuiInputTextFlags_ParseEmptyRefVal) ? p_data_default : NULL); IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable); // Step buttons @@ -3581,7 +3646,6 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_dat bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) { - flags |= ImGuiInputTextFlags_CharsScientific; return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); } @@ -3624,7 +3688,6 @@ bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) { - flags |= ImGuiInputTextFlags_CharsScientific; return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); } @@ -3722,8 +3785,8 @@ namespace ImStb { static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; } -static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; } -static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } +static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { IM_ASSERT(idx <= obj->CurLenW); return obj->TextW[idx]; } +static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return IMSTB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx) @@ -3841,12 +3904,13 @@ static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const Im #define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page #define STB_TEXTEDIT_K_SHIFT 0x400000 -#define STB_TEXTEDIT_IMPLEMENTATION +#define IMSTB_TEXTEDIT_IMPLEMENTATION +#define IMSTB_TEXTEDIT_memmove memmove #include "imstb_textedit.h" // stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling // the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) -static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) +static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const IMSTB_TEXTEDIT_CHARTYPE* text, int text_len) { stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); @@ -3899,6 +3963,10 @@ void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) { + // Accept null ranges + if (new_text == new_text_end) + return; + const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); if (new_text_len + BufTextLen >= BufSize) @@ -3930,9 +3998,8 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons } // Return false to discard a character. -static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source) +static bool InputTextFilterCharacter(ImGuiContext* ctx, unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, bool input_source_is_clipboard) { - IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard); unsigned int c = *p_char; // Filter non-printable (NB: isprint is unreliable! see #2467) @@ -3940,14 +4007,14 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f if (c < 0x20) { bool pass = false; - pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) - pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); + pass |= (c == '\n') && (flags & ImGuiInputTextFlags_Multiline) != 0; // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) + pass |= (c == '\t') && (flags & ImGuiInputTextFlags_AllowTabInput) != 0; if (!pass) return false; apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted. } - if (input_source != ImGuiInputSource_Clipboard) + if (input_source_is_clipboard == false) { // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) if (c == 127) @@ -3963,16 +4030,19 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f return false; // Generic named filters - if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))) + if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint))) { // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'. // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. // Change the default decimal_point with: - // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; + // ImGui::GetIO()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; // Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions. - ImGuiContext& g = *GImGui; - const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; + ImGuiContext& g = *ctx; + const unsigned c_decimal_point = (unsigned int)g.IO.PlatformLocaleDecimalPoint; + if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific | (ImGuiInputTextFlags)ImGuiInputTextFlags_LocalizeDecimalPoint)) + if (c == '.' || c == ',') + c = c_decimal_point; // Full-width -> half-width conversion for numeric fields (https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block) // While this is mostly convenient, this has the side-effect for uninformed users accidentally inputting full-width characters that they may @@ -4058,7 +4128,7 @@ static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* st const int insert_len = new_last_diff - first_diff + 1; const int delete_len = old_last_diff - first_diff + 1; if (insert_len > 0 || delete_len > 0) - if (STB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) + if (IMSTB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) for (int i = 0; i < delete_len; i++) p[i] = ImStb::STB_TEXTEDIT_GETCHAR(state, first_diff + i); } @@ -4074,8 +4144,16 @@ void ImGui::InputTextDeactivateHook(ImGuiID id) if (id == 0 || state->ID != id) return; g.InputTextDeactivatedState.ID = state->ID; - g.InputTextDeactivatedState.TextA.resize(state->CurLenA + 1); - memcpy(g.InputTextDeactivatedState.TextA.Data, state->TextA.Data ? state->TextA.Data : "", state->CurLenA + 1); + if (state->Flags & ImGuiInputTextFlags_ReadOnly) + { + g.InputTextDeactivatedState.TextA.resize(0); // In theory this data won't be used, but clear to be neat. + } + else + { + IM_ASSERT(state->TextA.Data != 0); + g.InputTextDeactivatedState.TextA.resize(state->CurLenA + 1); + memcpy(g.InputTextDeactivatedState.TextA.Data, state->TextA.Data, state->CurLenA + 1); + } } // Edit a string of text @@ -4102,12 +4180,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const bool RENDER_SELECTION_WHEN_INACTIVE = false; const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; - const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; - const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; - const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; - const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; - if (is_resizable) - IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar) BeginGroup(); @@ -4121,7 +4193,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ ImGuiWindow* draw_window = window; ImVec2 inner_size = frame_size; - ImGuiItemStatusFlags item_status_flags = 0; ImGuiLastItemData item_data_backup; if (is_multiline) { @@ -4132,17 +4203,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ EndGroup(); return false; } - item_status_flags = g.LastItemData.StatusFlags; item_data_backup = g.LastItemData; window->DC.CursorPos = backup_pos; + // Prevent NavActivation from Tabbing when our widget accepts Tab inputs: this allows cycling through widgets without stopping. + if (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_FromTabbing) && (flags & ImGuiInputTextFlags_AllowTabInput)) + g.NavActivateId = 0; + + // Prevent NavActivate reactivating in BeginChild() when we are already active. + const ImGuiID backup_activate_id = g.NavActivateId; + if (g.ActiveId == id) // Prevent reactivation + g.NavActivateId = 0; + // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. - // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre. PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); + g.NavActivateId = backup_activate_id; PopStyleVar(3); PopStyleColor(); if (!child_visible) @@ -4163,16 +4242,23 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (!(flags & ImGuiInputTextFlags_MergedItem)) if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) return false; - item_status_flags = g.LastItemData.StatusFlags; } - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); if (hovered) g.MouseCursor = ImGuiMouseCursor_TextInput; // We are only allowed to access the state if we are already the active widget. ImGuiInputTextState* state = GetInputTextState(id); - const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + if (g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) + flags |= ImGuiInputTextFlags_ReadOnly; + const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; + const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; + const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; + const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; + if (is_resizable) + IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! + const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateId == id) && ((g.NavActivateFlags & ImGuiActivateFlags_PreferInput) || (g.NavInputSource == ImGuiInputSource_Keyboard))); const bool user_clicked = hovered && io.MouseClicked[0]; @@ -4183,27 +4269,32 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; + const bool init_reload_from_user_buf = (state != NULL && state->ReloadUserBuf); const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); // state != NULL means its our state. - const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing); + const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav); const bool init_state = (init_make_active || user_scroll_active); - if ((init_state && g.ActiveId != id) || init_changed_specs) + if ((init_state && g.ActiveId != id) || init_changed_specs || init_reload_from_user_buf) { // Access state even if we don't own it yet. state = &g.InputTextState; state->CursorAnimReset(); + state->ReloadUserBuf = false; // Backup state of deactivating item so they'll have a chance to do a write to output buffer on the same frame they report IsItemDeactivatedAfterEdit (#4714) InputTextDeactivateHook(state->ID); - // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) - // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) + // From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode) const int buf_len = (int)strlen(buf); - state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. - memcpy(state->InitialTextA.Data, buf, buf_len + 1); + if (!init_reload_from_user_buf) + { + // Take a copy of the initial buffer value. + state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. + memcpy(state->InitialTextA.Data, buf, buf_len + 1); + } // Preserve cursor position and undo/redo stack if we come back to same widget - // FIXME: Since we reworked this on 2022/06, may want to differenciate recycle_cursor vs recycle_undostate? - bool recycle_state = (state->ID == id && !init_changed_specs); + // FIXME: Since we reworked this on 2022/06, may want to differentiate recycle_cursor vs recycle_undostate? + bool recycle_state = (state->ID == id && !init_changed_specs && !init_reload_from_user_buf); if (recycle_state && (state->CurLenA != buf_len || (state->TextAIsValid && strncmp(state->TextA.Data, buf, buf_len) != 0))) recycle_state = false; @@ -4228,13 +4319,19 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ stb_textedit_initialize_state(&state->Stb, !is_multiline); } - if (!is_multiline) + if (init_reload_from_user_buf) + { + state->Stb.select_start = state->ReloadSelectionStart; + state->Stb.cursor = state->Stb.select_end = state->ReloadSelectionEnd; + state->CursorClamp(); + } + else if (!is_multiline) { if (flags & ImGuiInputTextFlags_AutoSelectAll) select_all = true; if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState))) select_all = true; - if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl)) + if (user_clicked && io.KeyCtrl) select_all = true; } @@ -4258,6 +4355,8 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + SetKeyOwner(ImGuiKey_Enter, id); + SetKeyOwner(ImGuiKey_KeypadEnter, id); SetKeyOwner(ImGuiKey_Home, id); SetKeyOwner(ImGuiKey_End, id); if (is_multiline) @@ -4265,10 +4364,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ SetKeyOwner(ImGuiKey_PageUp, id); SetKeyOwner(ImGuiKey_PageDown, id); } + // FIXME: May be a problem to always steal Alt on OSX, would ideally still allow an uninterrupted Alt down-up to toggle menu if (is_osx) SetKeyOwner(ImGuiMod_Alt, id); - if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. - SetShortcutRouting(ImGuiKey_Tab, id); } // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) @@ -4397,16 +4495,25 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // We expect backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336) // (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes) - if ((flags & ImGuiInputTextFlags_AllowTabInput) && Shortcut(ImGuiKey_Tab, id) && !is_readonly) + if ((flags & ImGuiInputTextFlags_AllowTabInput) && !is_readonly) { - unsigned int c = '\t'; // Insert TAB - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) - state->OnKeyPressed((int)c); + if (Shortcut(ImGuiKey_Tab, ImGuiInputFlags_Repeat, id)) + { + unsigned int c = '\t'; // Insert TAB + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) + state->OnKeyPressed((int)c); + } + // FIXME: Implement Shift+Tab + /* + if (Shortcut(ImGuiKey_Tab | ImGuiMod_Shift, ImGuiInputFlags_Repeat, id)) + { + } + */ } // Process regular text input (before we check for Return because using some IME will effectively send a Return?) // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters. - const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); + const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeyCtrl); if (io.InputQueueCharacters.Size > 0) { if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav) @@ -4416,7 +4523,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ unsigned int c = (unsigned int)io.InputQueueCharacters[n]; if (c == '\t') // Skip Tab, see above. continue; - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) state->OnKeyPressed((int)c); } @@ -4436,25 +4543,26 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl - const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End + const bool is_startend_key_down = is_osx && io.KeyCtrl && !io.KeySuper && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End // Using Shortcut() with ImGuiInputFlags_RouteFocused (default policy) to allow routing operations for other code (e.g. calling window trying to use CTRL+A and CTRL+B: formet would be handled by InputText) // Otherwise we could simply assume that we own the keys as we are active. const ImGuiInputFlags f_repeat = ImGuiInputFlags_Repeat; - const bool is_cut = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_X, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, id, f_repeat)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); - const bool is_copy = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_C, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, id)) && !is_password && (!is_multiline || state->HasSelection()); - const bool is_paste = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_V, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, id, f_repeat)) && !is_readonly; - const bool is_undo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Z, id, f_repeat)) && !is_readonly && is_undoable; - const bool is_redo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Y, id, f_repeat) || (is_osx && Shortcut(ImGuiMod_Shortcut | ImGuiMod_Shift | ImGuiKey_Z, id, f_repeat))) && !is_readonly && is_undoable; - const bool is_select_all = Shortcut(ImGuiMod_Shortcut | ImGuiKey_A, id); + const bool is_cut = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_X, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, f_repeat, id)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); + const bool is_copy = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_C, 0, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, 0, id)) && !is_password && (!is_multiline || state->HasSelection()); + const bool is_paste = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_V, f_repeat, id) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, f_repeat, id)) && !is_readonly; + const bool is_undo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Z, f_repeat, id)) && !is_readonly && is_undoable; + const bool is_redo = (Shortcut(ImGuiMod_Ctrl | ImGuiKey_Y, f_repeat, id) || (is_osx && Shortcut(ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Z, f_repeat, id))) && !is_readonly && is_undoable; + const bool is_select_all = Shortcut(ImGuiMod_Ctrl | ImGuiKey_A, 0, id); // We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful. const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; const bool is_enter_pressed = IsKeyPressed(ImGuiKey_Enter, true) || IsKeyPressed(ImGuiKey_KeypadEnter, true); const bool is_gamepad_validate = nav_gamepad_active && (IsKeyPressed(ImGuiKey_NavGamepadActivate, false) || IsKeyPressed(ImGuiKey_NavGamepadInput, false)); - const bool is_cancel = Shortcut(ImGuiKey_Escape, id, f_repeat) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, id, f_repeat)); + const bool is_cancel = Shortcut(ImGuiKey_Escape, f_repeat, id) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, f_repeat, id)); // FIXME: Should use more Shortcut() and reduce IsKeyPressed()+SetKeyOwner(), but requires modifiers combination to be taken account of. + // FIXME-OSX: Missing support for Alt(option)+Right/Left = go to end of line, or next line if already in end of line. if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } @@ -4479,7 +4587,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { if (is_wordmove_key_down) state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); - else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) + else if (is_osx && io.KeyCtrl && !io.KeyAlt && !io.KeySuper) state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); } state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); @@ -4499,7 +4607,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ else if (!is_readonly) { unsigned int c = '\n'; // Insert new line - if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + if (InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data)) state->OnKeyPressed((int)c); } } @@ -4507,7 +4615,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { if (flags & ImGuiInputTextFlags_EscapeClearsAll) { - if (state->CurLenA > 0) + if (buf[0] != 0) { revert_edit = true; } @@ -4566,7 +4674,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { unsigned int c; s += ImTextCharFromUtf8(&c, s, NULL); - if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard)) + if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true)) continue; clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; } @@ -4595,9 +4703,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (flags & ImGuiInputTextFlags_EscapeClearsAll) { // Clear input + IM_ASSERT(buf[0] != 0); apply_new_text = ""; apply_new_text_length = 0; - STB_TEXTEDIT_CHARTYPE empty_string; + value_changed = true; + IMSTB_TEXTEDIT_CHARTYPE empty_string; stb_textedit_replace(state, &state->Stb, &empty_string, 0); } else if (strcmp(buf, state->InitialTextA.Data) != 0) @@ -4625,9 +4735,12 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL); } - // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. + // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer + // before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. - // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). + // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage + // (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object + // unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). const bool apply_edit_back_to_user_buffer = !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); if (apply_edit_back_to_user_buffer) { @@ -4644,7 +4757,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. ImGuiInputTextFlags event_flag = 0; ImGuiKey event_key = ImGuiKey_None; - if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, id)) + if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, 0, id)) { event_flag = ImGuiInputTextFlags_CallbackCompletion; event_key = ImGuiKey_Tab; @@ -4703,7 +4816,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } if (buf_dirty) { - IM_ASSERT((flags & ImGuiInputTextFlags_ReadOnly) == 0); + IM_ASSERT(!is_readonly); IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! InputTextReconcileUndoStateAfterUserCallback(state, callback_data.Buf, callback_data.BufTextLen); // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ? if (callback_data.BufTextLen > backup_current_text_length && is_resizable) @@ -4728,11 +4841,11 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Handle reapplying final data on deactivation (see InputTextDeactivateHook() for details) if (g.InputTextDeactivatedState.ID == id) { - if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly) + if (g.ActiveId != id && IsItemDeactivatedAfterEdit() && !is_readonly && strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0) { apply_new_text = g.InputTextDeactivatedState.TextA.Data; apply_new_text_length = g.InputTextDeactivatedState.TextA.Size - 1; - value_changed |= (strcmp(g.InputTextDeactivatedState.TextA.Data, buf) != 0); + value_changed = true; //IMGUI_DEBUG_LOG("InputText(): apply Deactivated data for 0x%08X: \"%.*s\".\n", id, apply_new_text_length, apply_new_text); } g.InputTextDeactivatedState.ID = 0; @@ -4874,9 +4987,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ const float scroll_increment_x = inner_size.x * 0.25f; const float visible_width = inner_size.x - style.FramePadding.x; if (cursor_offset.x < state->ScrollX) - state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); + state->ScrollX = IM_TRUNC(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); else if (cursor_offset.x - visible_width >= state->ScrollX) - state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); + state->ScrollX = IM_TRUNC(cursor_offset.x - visible_width + scroll_increment_x); } else { @@ -4926,7 +5039,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ else { ImVec2 rect_size = InputTextCalcTextSizeW(&g, p, text_selected_end, &p, NULL, true); - if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines + if (rect_size.x <= 0.0f) rect_size.x = IM_TRUNC(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); rect.ClipWith(clip_rect); if (rect.Overlaps(clip_rect)) @@ -4949,7 +5062,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { state->CursorAnim += io.DeltaTime; bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f; - ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll); + ImVec2 cursor_screen_pos = ImTrunc(draw_pos + cursor_offset - draw_scroll); ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f); if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); @@ -4987,11 +5100,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ { // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)... Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); - ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; - g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; + g.NextItemData.ItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; EndChild(); item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow); - g.CurrentItemFlags = backup_item_flags; // ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active... // FIXME: This quite messy/tricky, should attempt to get rid of the child window. @@ -5035,10 +5146,10 @@ void ImGui::DebugNodeInputTextState(ImGuiInputTextState* state) Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenW, state->CurLenA, stb_state->cursor, stb_state->select_start, stb_state->select_end); Text("has_preferred_x: %d (%.2f)", stb_state->has_preferred_x, stb_state->preferred_x); Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point); - if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), true)) // Visualize undo state + if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 10), ImGuiChildFlags_Border | ImGuiChildFlags_ResizeY)) // Visualize undo state { PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - for (int n = 0; n < STB_TEXTEDIT_UNDOSTATECOUNT; n++) + for (int n = 0; n < IMSTB_TEXTEDIT_UNDOSTATECOUNT; n++) { ImStb::StbUndoRecord* undo_rec = &undo_state->undo_rec[n]; const char undo_rec_type = (n < undo_state->undo_point) ? 'u' : (n >= undo_state->redo_point) ? 'r' : ' '; @@ -5120,10 +5231,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag ImGuiContext& g = *GImGui; const ImGuiStyle& style = g.Style; const float square_sz = GetFrameHeight(); - const float w_full = CalcItemWidth(); - const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); - const float w_inputs = w_full - w_button; const char* label_display_end = FindRenderedTextEnd(label); + float w_full = CalcItemWidth(); g.NextItemData.ClearFlags(); BeginGroup(); @@ -5157,6 +5266,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; const int components = alpha ? 4 : 3; + const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); + const float w_inputs = ImMax(w_full - w_button, 1.0f); + w_full = w_inputs + w_button; // Convert to the formats we need float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; @@ -5180,10 +5292,9 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) { // RGB/HSV 0..255 Sliders - const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); - const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + const float w_items = w_inputs - style.ItemInnerSpacing.x * (components - 1); - const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); + const bool hide_prefix = (IM_TRUNC(w_items / components) <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; static const char* fmt_table_int[3][4] = { @@ -5199,11 +5310,14 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag }; const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1; + float prev_split = 0.0f; for (int n = 0; n < components; n++) { if (n > 0) SameLine(0, style.ItemInnerSpacing.x); - SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); + float next_split = IM_TRUNC(w_items * (n + 1) / components); + SetNextItemWidth(ImMax(next_split - prev_split, 1.0f)); + prev_split = next_split; // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. if (flags & ImGuiColorEditFlags_Float) @@ -5228,7 +5342,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag else ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); SetNextItemWidth(w_inputs); - if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) + if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsUppercase)) { value_changed = true; char* p = buf; @@ -5326,7 +5440,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag // Drag and Drop Target // NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test. - if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) { bool accepted_drag_drop = false; if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) @@ -5391,6 +5505,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl ImGuiIO& io = g.IO; const float width = CalcItemWidth(); + const bool is_readonly = ((g.NextItemData.ItemFlags | g.CurrentItemFlags) & ImGuiItemFlags_ReadOnly) != 0; g.NextItemData.ClearFlags(); PushID(label); @@ -5425,7 +5540,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; - float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); + float bars_triangles_half_sz = IM_TRUNC(bars_width * 0.20f); float backup_initial_col[4]; memcpy(backup_initial_col, col, components * sizeof(float)); @@ -5461,7 +5576,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { // Hue wheel + SV triangle logic InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; ImVec2 current_off = g.IO.MousePos - wheel_center; @@ -5496,7 +5611,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl { // SV rectangle logic InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); @@ -5509,7 +5624,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl // Hue bar logic SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); - if (IsItemActive()) + if (IsItemActive() && !is_readonly) { H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); value_changed = value_changed_h = true; @@ -5593,7 +5708,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl if ((flags & ImGuiColorEditFlags_NoInputs) == 0) { PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); - ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) @@ -5715,7 +5830,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl } // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) - float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; + float sv_cursor_rad = value_changed_sv ? wheel_thickness * 0.55f : wheel_thickness * 0.40f; int sv_cursor_segments = draw_list->_CalcCircleAutoSegmentCount(sv_cursor_rad); // Lock segment count so the +1 one matches others. draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, sv_cursor_segments); draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, sv_cursor_segments); @@ -5825,7 +5940,7 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl } // Tooltip - if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) + if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered && IsItemHovered(ImGuiHoveredFlags_ForTooltip)) ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); return pressed; @@ -5855,7 +5970,7 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags { ImGuiContext& g = *GImGui; - if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None)) + if (!BeginTooltipEx(ImGuiTooltipFlags_OverridePrevious, ImGuiWindowFlags_None)) return; const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; if (text_end > text) @@ -5893,6 +6008,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) return; ImGuiContext& g = *GImGui; + g.LockMarkEdited++; ImGuiColorEditFlags opts = g.ColorEditOptions; if (allow_opt_inputs) { @@ -5935,6 +6051,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) g.ColorEditOptions = opts; EndPopup(); + g.LockMarkEdited--; } void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) @@ -5944,6 +6061,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) return; ImGuiContext& g = *GImGui; + g.LockMarkEdited++; if (allow_opt_picker) { ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function @@ -5973,6 +6091,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); } EndPopup(); + g.LockMarkEdited--; } //------------------------------------------------------------------------- @@ -6143,44 +6262,72 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l label_end = FindRenderedTextEnd(label); const ImVec2 label_size = CalcTextSize(label, label_end, false); + const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapsing arrow width + Spacing + const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it + const float text_width = g.FontSize + label_size.x + padding.x * 2; // Include collapsing arrow + // We vertically grow up to current line height up the typical widget height. const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); + const bool span_all_columns = (flags & ImGuiTreeNodeFlags_SpanAllColumns) != 0 && (g.CurrentTable != NULL); ImRect frame_bb; - frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; + frame_bb.Min.x = span_all_columns ? window->ParentWorkRect.Min.x : (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; frame_bb.Min.y = window->DC.CursorPos.y; - frame_bb.Max.x = window->WorkRect.Max.x; + frame_bb.Max.x = span_all_columns ? window->ParentWorkRect.Max.x : (flags & ImGuiTreeNodeFlags_SpanTextWidth) ? window->DC.CursorPos.x + text_width + padding.x : window->WorkRect.Max.x; frame_bb.Max.y = window->DC.CursorPos.y + frame_height; if (display_frame) { // Framed header expand a little outside the default padding, to the edge of InnerClipRect // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) - frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); - frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); + frame_bb.Min.x -= IM_TRUNC(window->WindowPadding.x * 0.5f - 1.0f); + frame_bb.Max.x += IM_TRUNC(window->WindowPadding.x * 0.5f); } - const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing - const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it - const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); ItemSize(ImVec2(text_width, frame_height), padding.y); // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing ImRect interact_bb = frame_bb; - if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) - interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; + if ((flags & (ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth | ImGuiTreeNodeFlags_SpanTextWidth | ImGuiTreeNodeFlags_SpanAllColumns)) == 0) + interact_bb.Max.x = frame_bb.Min.x + text_width + (label_size.x > 0.0f ? style.ItemSpacing.x * 2.0f : 0.0f); - // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. - // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). - // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. - const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; - bool is_open = TreeNodeUpdateNextOpen(id, flags); - if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) - window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable.. + const float backup_clip_rect_min_x = window->ClipRect.Min.x; + const float backup_clip_rect_max_x = window->ClipRect.Max.x; + if (span_all_columns) + { + window->ClipRect.Min.x = window->ParentWorkRect.Min.x; + window->ClipRect.Max.x = window->ParentWorkRect.Max.x; + } + // Compute open and multi-select states before ItemAdd() as it clear NextItem data. + bool is_open = TreeNodeUpdateNextOpen(id, flags); bool item_add = ItemAdd(interact_bb, id); g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; g.LastItemData.DisplayRect = frame_bb; + if (span_all_columns) + { + window->ClipRect.Min.x = backup_clip_rect_min_x; + window->ClipRect.Max.x = backup_clip_rect_max_x; + } + + // If a NavLeft request is happening and ImGuiTreeNodeFlags_NavLeftJumpsBackHere enabled: + // Store data for the current depth to allow returning to this node from any child item. + // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). + // It will become tempting to enable ImGuiTreeNodeFlags_NavLeftJumpsBackHere by default or move it to ImGuiStyle. + // Currently only supports 32 level deep and we are fine with (1 << Depth) overflowing into a zero, easy to increase. + if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + { + g.NavTreeNodeStack.resize(g.NavTreeNodeStack.Size + 1); + ImGuiNavTreeNodeData* nav_tree_node_data = &g.NavTreeNodeStack.back(); + nav_tree_node_data->ID = id; + nav_tree_node_data->InFlags = g.LastItemData.InFlags; + nav_tree_node_data->NavRect = g.LastItemData.NavRect; + window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); + } + + const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; if (!item_add) { if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) @@ -6189,9 +6336,16 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l return is_open; } + if (span_all_columns) + { + TablePushBackgroundChannel(); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect; + g.LastItemData.ClipRect = window->ClipRect; + } + ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - button_flags |= ImGuiButtonFlags_AllowItemOverlap; + if ((flags & ImGuiTreeNodeFlags_AllowOverlap) || (g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap)) + button_flags |= ImGuiButtonFlags_AllowOverlap; if (!is_leaf) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; @@ -6264,8 +6418,6 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen; } } - if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) - SetItemAllowOverlap(); // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. if (selected != was_selected) //-V547 @@ -6273,7 +6425,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l // Render const ImU32 text_col = GetColorU32(ImGuiCol_Text); - ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; + ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_Compact; if (display_frame) { // Framed type @@ -6283,15 +6435,14 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l if (flags & ImGuiTreeNodeFlags_Bullet) RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 1.0f); else // Leaf without bullet, left-adjusted text - text_pos.x -= text_offset_x; + text_pos.x -= text_offset_x -padding.x; if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) frame_bb.Max.x -= g.FontSize + style.FramePadding.x; if (g.LogEnabled) LogSetNextTextDecoration("###", "###"); - RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); } else { @@ -6305,12 +6456,20 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l if (flags & ImGuiTreeNodeFlags_Bullet) RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); else if (!is_leaf) - RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ((flags & ImGuiTreeNodeFlags_UpsideDownArrow) ? ImGuiDir_Up : ImGuiDir_Down) : ImGuiDir_Right, 0.70f); if (g.LogEnabled) LogSetNextTextDecoration(">", NULL); - RenderText(text_pos, label, label_end, false); } + if (span_all_columns) + TablePopBackgroundChannel(); + + // Label + if (display_frame) + RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); + else + RenderText(text_pos, label, label_end, false); + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) TreePushOverrideID(id); IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); @@ -6352,12 +6511,14 @@ void ImGui::TreePop() ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) - if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) - if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) - { - SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); - NavMoveRequestCancel(); - } + if (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask) // Only set during request + { + ImGuiNavTreeNodeData* nav_tree_node_data = &g.NavTreeNodeStack.back(); + IM_ASSERT(nav_tree_node_data->ID == window->IDStack.back()); + if (g.NavIdIsAlive && g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + NavMoveRequestResolveWithPastTreeNode(&g.NavMoveResultLocal, nav_tree_node_data); + g.NavTreeNodeStack.pop_back(); + } window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. @@ -6379,7 +6540,7 @@ void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond) return; g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen; g.NextItemData.OpenVal = is_open; - g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always; + g.NextItemData.OpenCond = (ImU8)(cond ? cond : ImGuiCond_Always); } // CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). @@ -6409,7 +6570,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl ImGuiID id = window->GetID(label); flags |= ImGuiTreeNodeFlags_CollapsingHeader; if (p_visible) - flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; + flags |= ImGuiTreeNodeFlags_AllowOverlap | (ImGuiTreeNodeFlags)ImGuiTreeNodeFlags_ClipLabelForTrailingButton; bool is_open = TreeNodeBehavior(id, flags, label); if (p_visible != NULL) { @@ -6419,8 +6580,8 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl ImGuiContext& g = *GImGui; ImGuiLastItemData last_item_backup = g.LastItemData; float button_size = g.FontSize; - float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); - float button_y = g.LastItemData.Rect.Min.y; + float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x - button_size); + float button_y = g.LastItemData.Rect.Min.y + g.Style.FramePadding.y; ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); if (CloseButton(close_button_id, ImVec2(button_x, button_y))) *p_visible = false; @@ -6438,7 +6599,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFl // Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. // But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. -// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. +// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowOverlap are also frequently used flags. // FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) { @@ -6475,8 +6636,8 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl { const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; const float spacing_y = style.ItemSpacing.y; - const float spacing_L = IM_FLOOR(spacing_x * 0.50f); - const float spacing_U = IM_FLOOR(spacing_y * 0.50f); + const float spacing_L = IM_TRUNC(spacing_x * 0.50f); + const float spacing_U = IM_TRUNC(spacing_y * 0.50f); bb.Min.x -= spacing_L; bb.Min.y -= spacing_U; bb.Max.x += (spacing_x - spacing_L); @@ -6484,7 +6645,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl } //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } - // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable.. const float backup_clip_rect_min_x = window->ClipRect.Min.x; const float backup_clip_rect_max_x = window->ClipRect.Max.x; if (span_all_columns) @@ -6510,10 +6671,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, // which would be advantageous since most selectable are not selected. - if (span_all_columns && window->DC.CurrentColumns) - PushColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePushBackgroundChannel(); + if (span_all_columns) + { + if (g.CurrentTable) + TablePushBackgroundChannel(); + else if (window->DC.CurrentColumns) + PushColumnsBackground(); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasClipRect; + g.LastItemData.ClipRect = window->ClipRect; + } // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries ImGuiButtonFlags button_flags = 0; @@ -6522,7 +6688,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } - if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } + if ((flags & ImGuiSelectableFlags_AllowOverlap) || (g.LastItemData.InFlags & ImGuiItemFlags_AllowOverlap)) { button_flags |= ImGuiButtonFlags_AllowOverlap; } if (window->DragScrolling) { @@ -6557,9 +6723,6 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl if (pressed) MarkItemEdited(id); - if (flags & ImGuiSelectableFlags_AllowItemOverlap) - SetItemAllowOverlap(); - // In this branch, Selectable() cannot toggle the selection so this will never trigger. if (selected != was_selected) //-V547 g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; @@ -6570,12 +6733,16 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); RenderFrame(bb.Min, bb.Max, col, false, 0.0f); } - RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + if (g.NavId == id) + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding); - if (span_all_columns && window->DC.CurrentColumns) - PopColumnsBackground(); - else if (span_all_columns && g.CurrentTable) - TablePopBackgroundChannel(); + if (span_all_columns) + { + if (g.CurrentTable) + TablePopBackgroundChannel(); + else if (window->DC.CurrentColumns) + PopColumnsBackground(); + } RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); @@ -6600,6 +6767,212 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags return false; } + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Typing-Select support +//------------------------------------------------------------------------- + +// [Experimental] Currently not exposed in public API. +// Consume character inputs and return search request, if any. +// This would typically only be called on the focused window or location you want to grab inputs for, e.g. +// if (ImGui::IsWindowFocused(...)) +// if (ImGuiTypingSelectRequest* req = ImGui::GetTypingSelectRequest()) +// focus_idx = ImGui::TypingSelectFindMatch(req, my_items.size(), [](void*, int n) { return my_items[n]->Name; }, &my_items, -1); +// However the code is written in a way where calling it from multiple locations is safe (e.g. to obtain buffer). +ImGuiTypingSelectRequest* ImGui::GetTypingSelectRequest(ImGuiTypingSelectFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiTypingSelectState* data = &g.TypingSelectState; + ImGuiTypingSelectRequest* out_request = &data->Request; + + // Clear buffer + const float TYPING_SELECT_RESET_TIMER = 1.80f; // FIXME: Potentially move to IO config. + const int TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK = 4; // Lock single char matching when repeating same char 4 times + if (data->SearchBuffer[0] != 0) + { + bool clear_buffer = false; + clear_buffer |= (g.NavFocusScopeId != data->FocusScope); + clear_buffer |= (data->LastRequestTime + TYPING_SELECT_RESET_TIMER < g.Time); + clear_buffer |= g.NavAnyRequest; + clear_buffer |= g.ActiveId != 0 && g.NavActivateId == 0; // Allow temporary SPACE activation to not interfere + clear_buffer |= IsKeyPressed(ImGuiKey_Escape) || IsKeyPressed(ImGuiKey_Enter); + clear_buffer |= IsKeyPressed(ImGuiKey_Backspace) && (flags & ImGuiTypingSelectFlags_AllowBackspace) == 0; + //if (clear_buffer) { IMGUI_DEBUG_LOG("GetTypingSelectRequest(): Clear SearchBuffer.\n"); } + if (clear_buffer) + data->Clear(); + } + + // Append to buffer + const int buffer_max_len = IM_ARRAYSIZE(data->SearchBuffer) - 1; + int buffer_len = (int)strlen(data->SearchBuffer); + bool select_request = false; + for (ImWchar w : g.IO.InputQueueCharacters) + { + const int w_len = ImTextCountUtf8BytesFromStr(&w, &w + 1); + if (w < 32 || (buffer_len == 0 && ImCharIsBlankW(w)) || (buffer_len + w_len > buffer_max_len)) // Ignore leading blanks + continue; + char w_buf[5]; + ImTextCharToUtf8(w_buf, (unsigned int)w); + if (data->SingleCharModeLock && w_len == out_request->SingleCharSize && memcmp(w_buf, data->SearchBuffer, w_len) == 0) + { + select_request = true; // Same character: don't need to append to buffer. + continue; + } + if (data->SingleCharModeLock) + { + data->Clear(); // Different character: clear + buffer_len = 0; + } + memcpy(data->SearchBuffer + buffer_len, w_buf, w_len + 1); // Append + buffer_len += w_len; + select_request = true; + } + g.IO.InputQueueCharacters.resize(0); + + // Handle backspace + if ((flags & ImGuiTypingSelectFlags_AllowBackspace) && IsKeyPressed(ImGuiKey_Backspace, ImGuiInputFlags_Repeat)) + { + char* p = (char*)(void*)ImTextFindPreviousUtf8Codepoint(data->SearchBuffer, data->SearchBuffer + buffer_len); + *p = 0; + buffer_len = (int)(p - data->SearchBuffer); + } + + // Return request if any + if (buffer_len == 0) + return NULL; + if (select_request) + { + data->FocusScope = g.NavFocusScopeId; + data->LastRequestFrame = g.FrameCount; + data->LastRequestTime = (float)g.Time; + } + out_request->Flags = flags; + out_request->SearchBufferLen = buffer_len; + out_request->SearchBuffer = data->SearchBuffer; + out_request->SelectRequest = (data->LastRequestFrame == g.FrameCount); + out_request->SingleCharMode = false; + out_request->SingleCharSize = 0; + + // Calculate if buffer contains the same character repeated. + // - This can be used to implement a special search mode on first character. + // - Performed on UTF-8 codepoint for correctness. + // - SingleCharMode is always set for first input character, because it usually leads to a "next". + if (flags & ImGuiTypingSelectFlags_AllowSingleCharMode) + { + const char* buf_begin = out_request->SearchBuffer; + const char* buf_end = out_request->SearchBuffer + out_request->SearchBufferLen; + const int c0_len = ImTextCountUtf8BytesFromChar(buf_begin, buf_end); + const char* p = buf_begin + c0_len; + for (; p < buf_end; p += c0_len) + if (memcmp(buf_begin, p, (size_t)c0_len) != 0) + break; + const int single_char_count = (p == buf_end) ? (out_request->SearchBufferLen / c0_len) : 0; + out_request->SingleCharMode = (single_char_count > 0 || data->SingleCharModeLock); + out_request->SingleCharSize = (ImS8)c0_len; + data->SingleCharModeLock |= (single_char_count >= TYPING_SELECT_SINGLE_CHAR_COUNT_FOR_LOCK); // From now on we stop search matching to lock to single char mode. + } + + return out_request; +} + +static int ImStrimatchlen(const char* s1, const char* s1_end, const char* s2) +{ + int match_len = 0; + while (s1 < s1_end && ImToUpper(*s1++) == ImToUpper(*s2++)) + match_len++; + return match_len; +} + +// Default handler for finding a result for typing-select. You may implement your own. +// You might want to display a tooltip to visualize the current request SearchBuffer +// When SingleCharMode is set: +// - it is better to NOT display a tooltip of other on-screen display indicator. +// - the index of the currently focused item is required. +// if your SetNextItemSelectionData() values are indices, you can obtain it from ImGuiMultiSelectIO::NavIdItem, otherwise from g.NavLastValidSelectionUserData. +int ImGui::TypingSelectFindMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx) +{ + if (req == NULL || req->SelectRequest == false) // Support NULL parameter so both calls can be done from same spot. + return -1; + int idx = -1; + if (req->SingleCharMode && (req->Flags & ImGuiTypingSelectFlags_AllowSingleCharMode)) + idx = TypingSelectFindNextSingleCharMatch(req, items_count, get_item_name_func, user_data, nav_item_idx); + else + idx = TypingSelectFindBestLeadingMatch(req, items_count, get_item_name_func, user_data); + if (idx != -1) + NavRestoreHighlightAfterMove(); + return idx; +} + +// Special handling when a single character is repeated: perform search on a single letter and goes to next. +int ImGui::TypingSelectFindNextSingleCharMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data, int nav_item_idx) +{ + // FIXME: Assume selection user data is index. Would be extremely practical. + //if (nav_item_idx == -1) + // nav_item_idx = (int)g.NavLastValidSelectionUserData; + + int first_match_idx = -1; + bool return_next_match = false; + for (int idx = 0; idx < items_count; idx++) + { + const char* item_name = get_item_name_func(user_data, idx); + if (ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SingleCharSize, item_name) < req->SingleCharSize) + continue; + if (return_next_match) // Return next matching item after current item. + return idx; + if (first_match_idx == -1 && nav_item_idx == -1) // Return first match immediately if we don't have a nav_item_idx value. + return idx; + if (first_match_idx == -1) // Record first match for wrapping. + first_match_idx = idx; + if (nav_item_idx == idx) // Record that we encountering nav_item so we can return next match. + return_next_match = true; + } + return first_match_idx; // First result +} + +int ImGui::TypingSelectFindBestLeadingMatch(ImGuiTypingSelectRequest* req, int items_count, const char* (*get_item_name_func)(void*, int), void* user_data) +{ + int longest_match_idx = -1; + int longest_match_len = 0; + for (int idx = 0; idx < items_count; idx++) + { + const char* item_name = get_item_name_func(user_data, idx); + const int match_len = ImStrimatchlen(req->SearchBuffer, req->SearchBuffer + req->SearchBufferLen, item_name); + if (match_len <= longest_match_len) + continue; + longest_match_idx = idx; + longest_match_len = match_len; + if (match_len == req->SearchBufferLen) + break; + } + return longest_match_idx; +} + +void ImGui::DebugNodeTypingSelectState(ImGuiTypingSelectState* data) +{ +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + Text("SearchBuffer = \"%s\"", data->SearchBuffer); + Text("SingleCharMode = %d, Size = %d, Lock = %d", data->Request.SingleCharMode, data->Request.SingleCharSize, data->SingleCharModeLock); + Text("LastRequest = time: %.2f, frame: %d", data->LastRequestTime, data->LastRequestFrame); +#else + IM_UNUSED(data); +#endif +} + + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Multi-Select support +//------------------------------------------------------------------------- + +void ImGui::SetNextItemSelectionUserData(ImGuiSelectionUserData selection_user_data) +{ + // Note that flags will be cleared by ItemAdd(), so it's only useful for Navigation code! + // This designed so widgets can also cheaply set this before calling ItemAdd(), so we are not tied to MultiSelect api. + ImGuiContext& g = *GImGui; + g.NextItemData.ItemFlags |= ImGuiItemFlags_HasSelectionUserData; + g.NextItemData.SelectionUserData = selection_user_data; +} + + //------------------------------------------------------------------------- // [SECTION] Widgets: ListBox //------------------------------------------------------------------------- @@ -6608,6 +6981,7 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags // - ListBox() //------------------------------------------------------------------------- +// This is essentially a thin wrapper to using BeginChild/EndChild with the ImGuiChildFlags_FrameStyle flag for stylistic changes + displaying a label. // Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" // Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) @@ -6623,7 +6997,7 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) // Size default to hold ~7.25 items. // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. - ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); + ImVec2 size = ImTrunc(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); @@ -6633,19 +7007,21 @@ bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) { ItemSize(bb.GetSize(), style.FramePadding.y); ItemAdd(bb, 0, &frame_bb); + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values return false; } - // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. + // FIXME-OPT: We could omit the BeginGroup() if label_size.x == 0.0f but would need to omit the EndGroup() as well. BeginGroup(); if (label_size.x > 0.0f) { ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); RenderText(label_pos, label); window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + AlignTextToFramePadding(); } - BeginChildFrame(id, frame_bb.GetSize()); + BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle); return true; } @@ -6656,7 +7032,7 @@ void ImGui::EndListBox() IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); IM_UNUSED(window); - EndChildFrame(); + EndChild(); EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label } @@ -6668,7 +7044,7 @@ bool ImGui::ListBox(const char* label, int* current_item, const char* const item // This is merely a helper around BeginListBox(), EndListBox(). // Considering using those directly to submit custom data or store selection differently. -bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) +bool ImGui::ListBox(const char* label, int* current_item, const char* (*getter)(void* user_data, int idx), void* user_data, int items_count, int height_in_items) { ImGuiContext& g = *GImGui; @@ -6676,7 +7052,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v if (height_in_items < 0) height_in_items = ImMin(items_count, 7); float height_in_items_f = height_in_items + 0.25f; - ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); + ImVec2 size(0.0f, ImTrunc(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); if (!BeginListBox(label, size)) return false; @@ -6686,11 +7062,12 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v bool value_changed = false; ImGuiListClipper clipper; clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. + clipper.IncludeItemByIndex(*current_item); while (clipper.Step()) for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - const char* item_text; - if (!items_getter(data, i, &item_text)) + const char* item_text = getter(user_data, i); + if (item_text == NULL) item_text = "*Unknown item*"; PushID(i); @@ -6744,7 +7121,7 @@ int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_get ItemSize(total_bb, style.FramePadding.y); if (!ItemAdd(total_bb, 0, &frame_bb)) return -1; - const bool hovered = ItemHoverable(frame_bb, id); + const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.InFlags); // Determine scale from values if not specified if (scale_min == FLT_MAX || scale_max == FLT_MAX) @@ -7037,12 +7414,18 @@ void ImGui::EndMenuBar() PopClipRect(); PopID(); window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. - g.GroupStack.back().EmitItem = false; - EndGroup(); // Restore position on layer 0 + + // FIXME: Extremely confusing, cleanup by (a) working on WorkRect stack system (b) not using a Group confusingly here. + ImGuiGroupData& group_data = g.GroupStack.back(); + group_data.EmitItem = false; + ImVec2 restore_cursor_max_pos = group_data.BackupCursorMaxPos; + window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, window->DC.CursorMaxPos.x - window->Scroll.x); // Convert ideal extents for scrolling layer equivalent. + EndGroup(); // Restore position on layer 0 // FIXME: Misleading to use a group for that backup/restore window->DC.LayoutType = ImGuiLayoutType_Vertical; window->DC.IsSameLine = false; window->DC.NavLayerCurrent = ImGuiNavLayer_Main; window->DC.MenuBarAppending = false; + window->DC.CursorMaxPos = restore_cursor_max_pos; } // Important: calling order matters! @@ -7198,15 +7581,15 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // Menu inside an horizontal menu bar // Selectable extend their highlight by half ItemSpacing in each direction. // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() - popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + popup_pos = ImVec2(pos.x - 1.0f - IM_TRUNC(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight); + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); float w = label_size.x; ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, label_size.y)); RenderText(text_pos, label); PopStyleVar(); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { @@ -7215,7 +7598,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float checkmark_w = IM_TRUNC(g.FontSize * 1.20f); float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); @@ -7233,6 +7616,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) PopItemFlag(); bool want_open = false; + bool want_open_nav_init = false; bool want_close = false; if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) { @@ -7243,18 +7627,18 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL; if (g.HoveredWindow == window && child_menu_window != NULL) { - float ref_unit = g.FontSize; // FIXME-DPI - float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f; - ImRect next_window_rect = child_menu_window->Rect(); + const float ref_unit = g.FontSize; // FIXME-DPI + const float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f; + const ImRect next_window_rect = child_menu_window->Rect(); ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta); ImVec2 tb = (child_dir > 0.0f) ? next_window_rect.GetTL() : next_window_rect.GetTR(); ImVec2 tc = (child_dir > 0.0f) ? next_window_rect.GetBL() : next_window_rect.GetBR(); - float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack. + const float pad_farmost_h = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // Add a bit of extra slack. ta.x += child_dir * -0.5f; tb.x += child_dir * ref_unit; tc.x += child_dir * ref_unit; - tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus - tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); + tb.y = ta.y + ImMax((tb.y - pad_farmost_h) - ta.y, -ref_unit * 8.0f); // Triangle has maximum height to limit the slope and the bias toward large sub-menus + tc.y = ta.y + ImMin((tc.y + pad_farmost_h) - ta.y, +ref_unit * 8.0f); moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] } @@ -7262,18 +7646,22 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) - if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover) + if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover && g.ActiveId == 0) want_close = true; // Open + // (note: at this point 'hovered' actually includes the NavDisableMouseHover == false test) if (!menu_is_open && pressed) // Click/activate to open want_open = true; else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open want_open = true; + else if (!menu_is_open && hovered && g.HoveredIdTimer >= 0.30f && g.MouseStationaryTimer >= 0.30f) // Hover to open (timer fallback) + want_open = true; if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open { - want_open = true; + want_open = want_open_nav_init = true; NavMoveRequestCancel(); + NavRestoreHighlightAfterMove(); } } else @@ -7305,13 +7693,13 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size) { - // Don't reopen/recycle same menu level in the same frame, first close the other menu and yield for a frame. + // Don't reopen/recycle same menu level in the same frame if it is a different menu ID, first close the other menu and yield for a frame. OpenPopup(label); } else if (want_open) { menu_is_open = true; - OpenPopup(label); + OpenPopup(label, ImGuiPopupFlags_NoReopen);// | (want_open_nav_init ? ImGuiPopupFlags_NoReopenAlwaysNavInit : 0)); } if (menu_is_open) @@ -7323,6 +7711,14 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) PopStyleVar(); if (menu_is_open) { + // Implement what ImGuiPopupFlags_NoReopenAlwaysNavInit would do: + // Perform an init request in the case the popup was already open (via a previous mouse hover) + if (want_open && want_open_nav_init && !g.NavInitRequest) + { + FocusWindow(g.CurrentWindow, ImGuiFocusRequestFlags_UnlessBelowModal); + NavInitWindow(g.CurrentWindow, false); + } + // Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu() // (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck) g.LastItemData = last_item_in_parent; @@ -7392,14 +7788,14 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful // Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark. float w = label_size.x; - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * 0.5f); ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f)); PopStyleVar(); if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) RenderText(text_pos, label); - window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + window->DC.CursorPos.x += IM_TRUNC(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). } else { @@ -7408,7 +7804,7 @@ bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f; - float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float checkmark_w = IM_TRUNC(g.FontSize * 1.20f); float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y)); @@ -7553,6 +7949,8 @@ bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); tab_bar->ID = id; + tab_bar->SeparatorMinX = tab_bar->BarRect.Min.x - IM_TRUNC(window->WindowPadding.x * 0.5f); + tab_bar->SeparatorMaxX = tab_bar->BarRect.Max.x + IM_TRUNC(window->WindowPadding.x * 0.5f); return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); } @@ -7563,6 +7961,7 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG if (window->SkipItems) return false; + IM_ASSERT(tab_bar->ID != 0); if ((flags & ImGuiTabBarFlags_DockNode) == 0) PushOverrideID(tab_bar->ID); @@ -7605,12 +8004,12 @@ bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); // Draw separator + // (it would be misleading to draw this in EndTabBar() suggesting that it may be drawn over tabs, as tab bar are appendable) const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); - const float y = tab_bar->BarRect.Max.y - 1.0f; + if (g.Style.TabBarBorderSize > 0.0f) { - const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); - const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); - window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); + const float y = tab_bar->BarRect.Max.y; + window->DrawList->AddRectFilled(ImVec2(tab_bar->SeparatorMinX, y - g.Style.TabBarBorderSize), ImVec2(tab_bar->SeparatorMaxX, y), col); } return true; } @@ -7817,7 +8216,7 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) { ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; - float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); + float shrinked_width = IM_TRUNC(g.ShrinkWidthBuffer[tab_n].Width); if (shrinked_width < 0.0f) continue; @@ -7948,7 +8347,7 @@ ImGuiTabItem* ImGui::TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order) ImGuiTabItem* ImGui::TabBarGetCurrentTab(ImGuiTabBar* tab_bar) { - if (tab_bar->LastTabItemIdx <= 0 || tab_bar->LastTabItemIdx >= tab_bar->Tabs.Size) + if (tab_bar->LastTabItemIdx < 0 || tab_bar->LastTabItemIdx >= tab_bar->Tabs.Size) return NULL; return &tab_bar->Tabs[tab_bar->LastTabItemIdx]; } @@ -7977,7 +8376,7 @@ void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) if (tab->Flags & ImGuiTabItemFlags_Button) return; // A button appended with TabItemButton(). - if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + if ((tab->Flags & (ImGuiTabItemFlags_UnsavedDocument | ImGuiTabItemFlags_NoAssumedClosure)) == 0) { // This will remove a frame of lag for selecting another tab on closure. // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure @@ -8404,7 +8803,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; size.x = tab->Width; if (is_central_section) - window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_TRUNC(tab->Offset - tab_bar->ScrollingAnim), 0.0f); else window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); ImVec2 pos = window->DC.CursorPos; @@ -8428,7 +8827,8 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, } // Click to Select a tab - ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); + // Allow the close button to overlap + ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowOverlap); if (g.DragDropActive) button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; bool hovered, held; @@ -8436,10 +8836,6 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (pressed && !is_tab_button) TabBarQueueFocus(tab_bar, tab); - // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) - if (g.ActiveId != id) - SetItemAllowOverlap(); - // Drag and drop: re-order tabs if (held && !tab_appearing && IsMouseDragging(0)) { @@ -8461,7 +8857,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) { // Enlarge tab display when hovering - bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); + bb.Max.x = bb.Min.x + IM_TRUNC(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); display_draw_list = GetForegroundDrawList(window); TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); } @@ -8504,8 +8900,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, // FIXME: We may want disabled tab to still display the tooltip? if (text_clipped && g.HoveredId == id && !held) if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) - if (IsItemHovered(ImGuiHoveredFlags_DelayNormal)) - SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); + SetItemTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected if (is_tab_button) @@ -8556,7 +8951,7 @@ void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabI IM_ASSERT(width > 0.0f); const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); const float y1 = bb.Min.y + 1.0f; - const float y2 = bb.Max.y - 1.0f; + const float y2 = bb.Max.y - g.Style.TabBarBorderSize; draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9); draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12); @@ -8607,7 +9002,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, } const float button_sz = g.FontSize; - const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y); + const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x - button_sz), bb.Min.y + frame_padding.y); // Close Button & Unsaved Marker // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() @@ -8625,10 +9020,8 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, if (close_button_visible) { ImGuiLastItemData last_item_backup = g.LastItemData; - PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); if (CloseButton(close_button_id, button_pos)) close_button_pressed = true; - PopStyleVar(); g.LastItemData = last_item_backup; // Close with middle mouse button @@ -8637,7 +9030,7 @@ void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, } else if (unsaved_marker_visible) { - const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f); + const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz)); RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text)); } diff --git a/core/deps/imgui/imstb_textedit.h b/core/deps/imgui/imstb_textedit.h index a8a823110..783054ab9 100644 --- a/core/deps/imgui/imstb_textedit.h +++ b/core/deps/imgui/imstb_textedit.h @@ -2,8 +2,9 @@ // This is a slightly modified version of stb_textedit.h 1.14. // Those changes would need to be pushed into nothings/stb: // - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) -// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000) +// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000 + #6783) // Grep for [DEAR IMGUI] to find the changes. +// - Also renamed macros used or defined outside of IMSTB_TEXTEDIT_IMPLEMENTATION block from STB_TEXTEDIT_* to IMSTB_TEXTEDIT_* // stb_textedit.h - v1.14 - public domain - Sean Barrett // Development of this library was sponsored by RAD Game Tools @@ -30,7 +31,7 @@ // DEPENDENCIES // // Uses the C runtime function 'memmove', which you can override -// by defining STB_TEXTEDIT_memmove before the implementation. +// by defining IMSTB_TEXTEDIT_memmove before the implementation. // Uses no other functions. Performs no runtime allocations. // // @@ -40,7 +41,7 @@ // 1.13 (2019-02-07) fix bug in undo size management // 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash // 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield -// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual +// 1.10 (2016-10-25) suppress warnings about casting away const with -Wcast-qual // 1.9 (2016-08-27) customizable move-by-word // 1.8 (2016-04-02) better keyboard handling when mouse button is down // 1.7 (2015-09-13) change y range handling in case baseline is non-0 @@ -274,8 +275,8 @@ //// //// -#ifndef INCLUDE_STB_TEXTEDIT_H -#define INCLUDE_STB_TEXTEDIT_H +#ifndef INCLUDE_IMSTB_TEXTEDIT_H +#define INCLUDE_IMSTB_TEXTEDIT_H //////////////////////////////////////////////////////////////////////// // @@ -286,33 +287,33 @@ // and undo state. // -#ifndef STB_TEXTEDIT_UNDOSTATECOUNT -#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#ifndef IMSTB_TEXTEDIT_UNDOSTATECOUNT +#define IMSTB_TEXTEDIT_UNDOSTATECOUNT 99 #endif -#ifndef STB_TEXTEDIT_UNDOCHARCOUNT -#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#ifndef IMSTB_TEXTEDIT_UNDOCHARCOUNT +#define IMSTB_TEXTEDIT_UNDOCHARCOUNT 999 #endif -#ifndef STB_TEXTEDIT_CHARTYPE -#define STB_TEXTEDIT_CHARTYPE int +#ifndef IMSTB_TEXTEDIT_CHARTYPE +#define IMSTB_TEXTEDIT_CHARTYPE int #endif -#ifndef STB_TEXTEDIT_POSITIONTYPE -#define STB_TEXTEDIT_POSITIONTYPE int +#ifndef IMSTB_TEXTEDIT_POSITIONTYPE +#define IMSTB_TEXTEDIT_POSITIONTYPE int #endif typedef struct { // private data - STB_TEXTEDIT_POSITIONTYPE where; - STB_TEXTEDIT_POSITIONTYPE insert_length; - STB_TEXTEDIT_POSITIONTYPE delete_length; + IMSTB_TEXTEDIT_POSITIONTYPE where; + IMSTB_TEXTEDIT_POSITIONTYPE insert_length; + IMSTB_TEXTEDIT_POSITIONTYPE delete_length; int char_storage; } StbUndoRecord; typedef struct { // private data - StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; - STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; + StbUndoRecord undo_rec [IMSTB_TEXTEDIT_UNDOSTATECOUNT]; + IMSTB_TEXTEDIT_CHARTYPE undo_char[IMSTB_TEXTEDIT_UNDOCHARCOUNT]; short undo_point, redo_point; int undo_char_point, redo_char_point; } StbUndoState; @@ -371,7 +372,7 @@ typedef struct float ymin,ymax; // height of row above and below baseline int num_chars; } StbTexteditRow; -#endif //INCLUDE_STB_TEXTEDIT_H +#endif //INCLUDE_IMSTB_TEXTEDIT_H //////////////////////////////////////////////////////////////////////////// @@ -384,11 +385,11 @@ typedef struct // implementation isn't include-guarded, since it might have indirectly // included just the "header" portion -#ifdef STB_TEXTEDIT_IMPLEMENTATION +#ifdef IMSTB_TEXTEDIT_IMPLEMENTATION -#ifndef STB_TEXTEDIT_memmove +#ifndef IMSTB_TEXTEDIT_memmove #include -#define STB_TEXTEDIT_memmove memmove +#define IMSTB_TEXTEDIT_memmove memmove #endif @@ -398,7 +399,7 @@ typedef struct // // traverse the layout to locate the nearest character to a display position -static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) +static int stb_text_locate_coord(IMSTB_TEXTEDIT_STRING *str, float x, float y) { StbTexteditRow r; int n = STB_TEXTEDIT_STRINGLEN(str); @@ -458,7 +459,7 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) } // API click: on mouse down, move the cursor to the clicked location, and reset the selection -static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +static void stb_textedit_click(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) { // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse // goes off the top or bottom of the text @@ -476,7 +477,7 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat } // API drag: on mouse drag, move the cursor and selection endpoint to the clicked location -static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +static void stb_textedit_drag(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) { int p = 0; @@ -502,11 +503,11 @@ static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state // // forward declarations -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); +static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); +static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); typedef struct { @@ -518,7 +519,7 @@ typedef struct // find the x/y location of a character, and remember info about the previous row in // case we get a move-up event (for page up, we'll have to rescan) -static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) +static void stb_textedit_find_charpos(StbFindState *find, IMSTB_TEXTEDIT_STRING *str, int n, int single_line) { StbTexteditRow r; int prev_start = 0; @@ -549,7 +550,10 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s i += r.num_chars; find->y += r.baseline_y_delta; if (i == z) // [DEAR IMGUI] + { + r.num_chars = 0; // [DEAR IMGUI] break; // [DEAR IMGUI] + } } find->first_char = first = i; @@ -566,7 +570,7 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s #define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) // make the selection/cursor state valid if client altered the string -static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_clamp(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { int n = STB_TEXTEDIT_STRINGLEN(str); if (STB_TEXT_HAS_SELECTION(state)) { @@ -580,7 +584,7 @@ static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat } // delete characters while updating undo -static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) +static void stb_textedit_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) { stb_text_makeundo_delete(str, state, where, len); STB_TEXTEDIT_DELETECHARS(str, where, len); @@ -588,7 +592,7 @@ static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *sta } // delete the section -static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_delete_selection(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { stb_textedit_clamp(str, state); if (STB_TEXT_HAS_SELECTION(state)) { @@ -625,7 +629,7 @@ static void stb_textedit_move_to_first(STB_TexteditState *state) } // move cursor to last character of selection -static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_textedit_move_to_last(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { if (STB_TEXT_HAS_SELECTION(state)) { stb_textedit_sortselection(state); @@ -637,13 +641,13 @@ static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditStat } #ifdef STB_TEXTEDIT_IS_SPACE -static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) +static int is_word_boundary( IMSTB_TEXTEDIT_STRING *str, int idx ) { return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; } #ifndef STB_TEXTEDIT_MOVEWORDLEFT -static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) +static int stb_textedit_move_to_word_previous( IMSTB_TEXTEDIT_STRING *str, int c ) { --c; // always move at least one character while( c >= 0 && !is_word_boundary( str, c ) ) @@ -658,7 +662,7 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) #endif #ifndef STB_TEXTEDIT_MOVEWORDRIGHT -static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) +static int stb_textedit_move_to_word_next( IMSTB_TEXTEDIT_STRING *str, int c ) { const int len = STB_TEXTEDIT_STRINGLEN(str); ++c; // always move at least one character @@ -685,7 +689,7 @@ static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) } // API cut: delete selection -static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static int stb_textedit_cut(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { if (STB_TEXT_HAS_SELECTION(state)) { stb_textedit_delete_selection(str,state); // implicitly clamps @@ -696,7 +700,7 @@ static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) } // API paste: replace existing selection with passed-in text -static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +static int stb_textedit_paste_internal(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE *text, int len) { // if there's a selection, the paste should delete it stb_textedit_clamp(str, state); @@ -717,14 +721,14 @@ static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditSta #endif // API key: process a keyboard input -static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) +static void stb_textedit_key(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) { retry: switch (key) { default: { int c = STB_TEXTEDIT_KEYTOTEXT(key); if (c > 0) { - STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; + IMSTB_TEXTEDIT_CHARTYPE ch = (IMSTB_TEXTEDIT_CHARTYPE) c; // can't add newline in single-line mode if (c == '\n' && state->single_line) @@ -889,8 +893,8 @@ static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, x = row.x0; for (i=0; i < row.num_chars; ++i) { float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE) break; #endif x += dx; @@ -951,8 +955,8 @@ static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, x = row.x0; for (i=0; i < row.num_chars; ++i) { float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); - #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE - if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + #ifdef IMSTB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == IMSTB_TEXTEDIT_GETWIDTH_NEWLINE) break; #endif x += dx; @@ -1109,8 +1113,8 @@ static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, static void stb_textedit_flush_redo(StbUndoState *state) { - state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT; + state->redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT; } // discard the oldest entry in the undo list @@ -1122,13 +1126,13 @@ static void stb_textedit_discard_undo(StbUndoState *state) int n = state->undo_rec[0].insert_length, i; // delete n characters from all other records state->undo_char_point -= n; - STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); + IMSTB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(IMSTB_TEXTEDIT_CHARTYPE))); for (i=0; i < state->undo_point; ++i) if (state->undo_rec[i].char_storage >= 0) state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it } --state->undo_point; - STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); + IMSTB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); } } @@ -1138,7 +1142,7 @@ static void stb_textedit_discard_undo(StbUndoState *state) // fill up even though the undo buffer didn't static void stb_textedit_discard_redo(StbUndoState *state) { - int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; + int k = IMSTB_TEXTEDIT_UNDOSTATECOUNT-1; if (state->redo_point <= k) { // if the k'th undo state has characters, clean those up @@ -1146,7 +1150,7 @@ static void stb_textedit_discard_redo(StbUndoState *state) int n = state->undo_rec[k].insert_length, i; // move the remaining redo character data to the end of the buffer state->redo_char_point += n; - STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); + IMSTB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((IMSTB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(IMSTB_TEXTEDIT_CHARTYPE))); // adjust the position of all the other records to account for above memmove for (i=state->redo_point; i < k; ++i) if (state->undo_rec[i].char_storage >= 0) @@ -1154,12 +1158,12 @@ static void stb_textedit_discard_redo(StbUndoState *state) } // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' // [DEAR IMGUI] - size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); + size_t move_size = (size_t)((IMSTB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin); IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end); - STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); + IMSTB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); // now move redo_point to point to the new one ++state->redo_point; @@ -1173,32 +1177,32 @@ static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numch // if we have no free records, we have to make room, by sliding the // existing records down - if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (state->undo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) stb_textedit_discard_undo(state); // if the characters to store won't possibly fit in the buffer, we can't undo - if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { + if (numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT) { state->undo_point = 0; state->undo_char_point = 0; return NULL; } // if we don't have enough free characters in the buffer, we have to make room - while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) + while (state->undo_char_point + numchars > IMSTB_TEXTEDIT_UNDOCHARCOUNT) stb_textedit_discard_undo(state); return &state->undo_rec[state->undo_point++]; } -static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) +static IMSTB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) { StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); if (r == NULL) return NULL; r->where = pos; - r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len; - r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len; + r->insert_length = (IMSTB_TEXTEDIT_POSITIONTYPE) insert_len; + r->delete_length = (IMSTB_TEXTEDIT_POSITIONTYPE) delete_len; if (insert_len == 0) { r->char_storage = -1; @@ -1210,7 +1214,7 @@ static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, } } -static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_text_undo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { StbUndoState *s = &state->undostate; StbUndoRecord u, *r; @@ -1237,7 +1241,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) // characters stored for *undoing* don't leave room for redo // if the last is true, we have to bail - if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { + if (s->undo_char_point + u.delete_length >= IMSTB_TEXTEDIT_UNDOCHARCOUNT) { // the undo records take up too much character space; there's no space to store the redo characters r->insert_length = 0; } else { @@ -1246,7 +1250,7 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) // there's definitely room to store the characters eventually while (s->undo_char_point + u.delete_length > s->redo_char_point) { // should never happen: - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) return; // there's currently not enough room, so discard a redo record stb_textedit_discard_redo(s); @@ -1278,11 +1282,11 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) s->redo_point--; } -static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +static void stb_text_redo(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state) { StbUndoState *s = &state->undostate; StbUndoRecord *u, r; - if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + if (s->redo_point == IMSTB_TEXTEDIT_UNDOSTATECOUNT) return; // we need to do two things: apply the redo record, and create an undo record @@ -1334,20 +1338,20 @@ static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int le stb_text_createundo(&state->undostate, where, 0, length); } -static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) +static void stb_text_makeundo_delete(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) { int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); + IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); if (p) { for (i=0; i < length; ++i) p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); } } -static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) +static void stb_text_makeundo_replace(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) { int i; - STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); + IMSTB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); if (p) { for (i=0; i < old_length; ++i) p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); @@ -1359,8 +1363,8 @@ static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_lin { state->undostate.undo_point = 0; state->undostate.undo_char_point = 0; - state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; - state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->undostate.redo_point = IMSTB_TEXTEDIT_UNDOSTATECOUNT; + state->undostate.redo_char_point = IMSTB_TEXTEDIT_UNDOCHARCOUNT; state->select_end = state->select_start = 0; state->cursor = 0; state->has_preferred_x = 0; @@ -1383,16 +1387,16 @@ static void stb_textedit_initialize_state(STB_TexteditState *state, int is_singl #pragma GCC diagnostic ignored "-Wcast-qual" #endif -static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) +static int stb_textedit_paste(IMSTB_TEXTEDIT_STRING *str, STB_TexteditState *state, IMSTB_TEXTEDIT_CHARTYPE const *ctext, int len) { - return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len); + return stb_textedit_paste_internal(str, state, (IMSTB_TEXTEDIT_CHARTYPE *) ctext, len); } #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif -#endif//STB_TEXTEDIT_IMPLEMENTATION +#endif//IMSTB_TEXTEDIT_IMPLEMENTATION /* ------------------------------------------------------------------------------ diff --git a/core/deps/imgui/imstb_truetype.h b/core/deps/imgui/imstb_truetype.h index 35c827e6b..976f09cb9 100644 --- a/core/deps/imgui/imstb_truetype.h +++ b/core/deps/imgui/imstb_truetype.h @@ -656,7 +656,7 @@ STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); // If skip != 0, this tells stb_truetype to skip any codepoints for which // there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, +// codepoints without a glyph received the font's "missing character" glyph, // typically an empty box by convention. STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above diff --git a/core/deps/implot/implot.cpp b/core/deps/implot/implot.cpp index f94ebce42..d92602811 100644 --- a/core/deps/implot/implot.cpp +++ b/core/deps/implot/implot.cpp @@ -1,6 +1,6 @@ // MIT License -// Copyright (c) 2022 Evan Pezent +// Copyright (c) 2023 Evan Pezent // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -// ImPlot v0.14 +// ImPlot v0.17 /* @@ -31,6 +31,9 @@ Below is a change-log of API breaking changes only. If you are using one of the When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all implot files. You can read releases logs https://github.com/epezent/implot/releases for more details. +- 2023/08/20 (0.17) - ImPlotFlags_NoChild was removed as child windows are no longer needed to capture scroll. You can safely remove this flag if you were using it. +- 2023/06/26 (0.15) - Various build fixes related to updates in Dear ImGui internals. +- 2022/11/25 (0.15) - Make PlotText honor ImPlotItemFlags_NoFit. - 2022/06/19 (0.14) - The signature of ColormapScale has changed to accommodate a new ImPlotColormapScaleFlags parameter - 2022/06/17 (0.14) - **IMPORTANT** All PlotX functions now take an ImPlotX_Flags `flags` parameter. Where applicable, it is located before the existing `offset` and `stride` parameters. If you were providing offset and stride values, you will need to update your function call to include a `flags` value. If you fail to do this, you will likely see @@ -133,6 +136,11 @@ You can read releases logs https://github.com/epezent/implot/releases for more d #define ImDrawFlags_RoundCornersAll ImDrawCornerFlags_All #endif +// Support for pre-1.89.7 versions. +#if (IMGUI_VERSION_NUM < 18966) +#define ImGuiButtonFlags_AllowOverlap ImGuiButtonFlags_AllowItemOverlap +#endif + // Visual Studio warnings #ifdef _MSC_VER #pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen @@ -285,35 +293,35 @@ struct ImPlotStyleVarInfo { static const ImPlotStyleVarInfo GPlotStyleVarInfo[] = { - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, LineWeight) }, // ImPlotStyleVar_LineWeight - { ImGuiDataType_S32, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, Marker) }, // ImPlotStyleVar_Marker - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, MarkerSize) }, // ImPlotStyleVar_MarkerSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, MarkerWeight) }, // ImPlotStyleVar_MarkerWeight - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, FillAlpha) }, // ImPlotStyleVar_FillAlpha - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, ErrorBarSize) }, // ImPlotStyleVar_ErrorBarSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, ErrorBarWeight) }, // ImPlotStyleVar_ErrorBarWeight - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, DigitalBitHeight) }, // ImPlotStyleVar_DigitalBitHeight - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, DigitalBitGap) }, // ImPlotStyleVar_DigitalBitGap - - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, PlotBorderSize) }, // ImPlotStyleVar_PlotBorderSize - { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImPlotStyle, MinorAlpha) }, // ImPlotStyleVar_MinorAlpha - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MajorTickLen) }, // ImPlotStyleVar_MajorTickLen - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MinorTickLen) }, // ImPlotStyleVar_MinorTickLen - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MajorTickSize) }, // ImPlotStyleVar_MajorTickSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MinorTickSize) }, // ImPlotStyleVar_MinorTickSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MajorGridSize) }, // ImPlotStyleVar_MajorGridSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MinorGridSize) }, // ImPlotStyleVar_MinorGridSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, PlotPadding) }, // ImPlotStyleVar_PlotPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, LabelPadding) }, // ImPlotStyleVar_LabelPaddine - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, LegendPadding) }, // ImPlotStyleVar_LegendPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, LegendInnerPadding) }, // ImPlotStyleVar_LegendInnerPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, LegendSpacing) }, // ImPlotStyleVar_LegendSpacing - - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, MousePosPadding) }, // ImPlotStyleVar_MousePosPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, AnnotationPadding) }, // ImPlotStyleVar_AnnotationPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, FitPadding) }, // ImPlotStyleVar_FitPadding - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, PlotDefaultSize) }, // ImPlotStyleVar_PlotDefaultSize - { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImPlotStyle, PlotMinSize) } // ImPlotStyleVar_PlotMinSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, LineWeight) }, // ImPlotStyleVar_LineWeight + { ImGuiDataType_S32, 1, (ImU32)offsetof(ImPlotStyle, Marker) }, // ImPlotStyleVar_Marker + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, MarkerSize) }, // ImPlotStyleVar_MarkerSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, MarkerWeight) }, // ImPlotStyleVar_MarkerWeight + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, FillAlpha) }, // ImPlotStyleVar_FillAlpha + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, ErrorBarSize) }, // ImPlotStyleVar_ErrorBarSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, ErrorBarWeight) }, // ImPlotStyleVar_ErrorBarWeight + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, DigitalBitHeight) }, // ImPlotStyleVar_DigitalBitHeight + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, DigitalBitGap) }, // ImPlotStyleVar_DigitalBitGap + + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, PlotBorderSize) }, // ImPlotStyleVar_PlotBorderSize + { ImGuiDataType_Float, 1, (ImU32)offsetof(ImPlotStyle, MinorAlpha) }, // ImPlotStyleVar_MinorAlpha + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorTickLen) }, // ImPlotStyleVar_MajorTickLen + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorTickLen) }, // ImPlotStyleVar_MinorTickLen + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorTickSize) }, // ImPlotStyleVar_MajorTickSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorTickSize) }, // ImPlotStyleVar_MinorTickSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MajorGridSize) }, // ImPlotStyleVar_MajorGridSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MinorGridSize) }, // ImPlotStyleVar_MinorGridSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotPadding) }, // ImPlotStyleVar_PlotPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LabelPadding) }, // ImPlotStyleVar_LabelPaddine + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendPadding) }, // ImPlotStyleVar_LegendPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendInnerPadding) }, // ImPlotStyleVar_LegendInnerPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, LegendSpacing) }, // ImPlotStyleVar_LegendSpacing + + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, MousePosPadding) }, // ImPlotStyleVar_MousePosPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, AnnotationPadding) }, // ImPlotStyleVar_AnnotationPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, FitPadding) }, // ImPlotStyleVar_FitPadding + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotDefaultSize) }, // ImPlotStyleVar_PlotDefaultSize + { ImGuiDataType_Float, 2, (ImU32)offsetof(ImPlotStyle, PlotMinSize) } // ImPlotStyleVar_PlotMinSize }; static const ImPlotStyleVarInfo* GetPlotStyleVarInfo(ImPlotStyleVar idx) { @@ -333,8 +341,8 @@ void AddTextVertical(ImDrawList *DrawList, ImVec2 pos, ImU32 col, const char *te ImGuiContext& g = *GImGui; ImFont* font = g.Font; // Align to be pixel perfect - pos.x = IM_FLOOR(pos.x); - pos.y = IM_FLOOR(pos.y); + pos.x = ImFloor(pos.x); + pos.y = ImFloor(pos.y); const float scale = g.FontSize / font->FontSize; const char* s = text_begin; int chars_exp = (int)(text_end - s); @@ -485,10 +493,6 @@ void Initialize(ImPlotContext* ctx) { } void ResetCtxForNextPlot(ImPlotContext* ctx) { - // end child window if it was made - if (ctx->ChildWindowMade) - ImGui::EndChild(); - ctx->ChildWindowMade = false; // reset the next plot/item data ctx->NextPlotData.Reset(); ctx->NextItemData.Reset(); @@ -582,6 +586,28 @@ ImVec2 CalcLegendSize(ImPlotItemGroup& items, const ImVec2& pad, const ImVec2& s return legend_size; } +bool ClampLegendRect(ImRect& legend_rect, const ImRect& outer_rect, const ImVec2& pad) { + bool clamped = false; + ImRect outer_rect_pad(outer_rect.Min + pad, outer_rect.Max - pad); + if (legend_rect.Min.x < outer_rect_pad.Min.x) { + legend_rect.Min.x = outer_rect_pad.Min.x; + clamped = true; + } + if (legend_rect.Min.y < outer_rect_pad.Min.y) { + legend_rect.Min.y = outer_rect_pad.Min.y; + clamped = true; + } + if (legend_rect.Max.x > outer_rect_pad.Max.x) { + legend_rect.Max.x = outer_rect_pad.Max.x; + clamped = true; + } + if (legend_rect.Max.y > outer_rect_pad.Max.y) { + legend_rect.Max.y = outer_rect_pad.Max.y; + clamped = true; + } + return clamped; +} + int LegendSortingComp(const void* _a, const void* _b) { ImPlotItemGroup* items = GImPlot->SortItems; const int a = *(const int*)_a; @@ -1296,12 +1322,12 @@ bool DragFloat(const char*, F*, float, F, F) { template <> bool DragFloat(const char* label, double* v, float v_speed, double v_min, double v_max) { - return ImGui::DragScalar(label, ImGuiDataType_Double, v, v_speed, &v_min, &v_max, "%.3f", 1); + return ImGui::DragScalar(label, ImGuiDataType_Double, v, v_speed, &v_min, &v_max, "%.3g", 1); } template <> bool DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max) { - return ImGui::DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, "%.3f", 1); + return ImGui::DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, "%.3g", 1); } inline void BeginDisabledControls(bool cond) { @@ -1548,7 +1574,7 @@ void ShowPlotContextMenu(ImPlotPlot& plot) { ImFlipFlag(plot.Flags, ImPlotFlags_Crosshairs); ImGui::EndMenu(); } - if (gp.CurrentSubplot != nullptr && !ImHasFlag(gp.CurrentPlot->Flags, ImPlotSubplotFlags_NoMenus)) { + if (gp.CurrentSubplot != nullptr && !ImHasFlag(gp.CurrentSubplot->Flags, ImPlotSubplotFlags_NoMenus)) { ImGui::Separator(); if ((ImGui::BeginMenu("Subplots"))) { ShowSubplotsContextMenu(*gp.CurrentSubplot); @@ -1808,7 +1834,7 @@ bool UpdateInput(ImPlotPlot& plot) { // BUTTON STATE ----------------------------------------------------------- - const ImGuiButtonFlags plot_button_flags = ImGuiButtonFlags_AllowItemOverlap + const ImGuiButtonFlags plot_button_flags = ImGuiButtonFlags_AllowOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_MouseButtonLeft @@ -1818,7 +1844,9 @@ bool UpdateInput(ImPlotPlot& plot) { | plot_button_flags; const bool plot_clicked = ImGui::ButtonBehavior(plot.PlotRect,plot.ID,&plot.Hovered,&plot.Held,plot_button_flags); - ImGui::SetItemAllowOverlap(); +#if (IMGUI_VERSION_NUM < 18966) + ImGui::SetItemAllowOverlap(); // Handled by ButtonBehavior() +#endif if (plot_clicked) { if (!ImHasFlag(plot.Flags, ImPlotFlags_NoBoxSelect) && IO.MouseClicked[gp.InputMap.Select] && ImHasFlag(IO.KeyMods, gp.InputMap.SelectMod)) { @@ -1951,10 +1979,12 @@ bool UpdateInput(ImPlotPlot& plot) { // SCROLL INPUT ----------------------------------------------------------- - if (any_hov && IO.MouseWheel != 0 && ImHasFlag(IO.KeyMods, gp.InputMap.ZoomMod)) { + if (any_hov && ImHasFlag(IO.KeyMods, gp.InputMap.ZoomMod)) { float zoom_rate = gp.InputMap.ZoomRate; - if (IO.MouseWheel > 0) + if (IO.MouseWheel == 0.0f) + zoom_rate = 0; + else if (IO.MouseWheel > 0) zoom_rate = (-zoom_rate) / (1.0f + (2.0f * zoom_rate)); ImVec2 rect_size = plot.PlotRect.GetSize(); float tx = ImRemap(IO.MousePos.x, plot.PlotRect.Min.x, plot.PlotRect.Max.x, 0.0f, 1.0f); @@ -1965,14 +1995,17 @@ bool UpdateInput(ImPlotPlot& plot) { const bool equal_zoom = axis_equal && x_axis.OrthoAxis != nullptr; const bool equal_locked = (equal_zoom != false) && x_axis.OrthoAxis->IsInputLocked(); if (x_hov[i] && !x_axis.IsInputLocked() && !equal_locked) { - float correction = (plot.Hovered && equal_zoom) ? 0.5f : 1.0f; - const double plot_l = x_axis.PixelsToPlot(plot.PlotRect.Min.x - rect_size.x * tx * zoom_rate * correction); - const double plot_r = x_axis.PixelsToPlot(plot.PlotRect.Max.x + rect_size.x * (1 - tx) * zoom_rate * correction); - x_axis.SetMin(x_axis.IsInverted() ? plot_r : plot_l); - x_axis.SetMax(x_axis.IsInverted() ? plot_l : plot_r); - if (axis_equal && x_axis.OrthoAxis != nullptr) - x_axis.OrthoAxis->SetAspect(x_axis.GetAspect()); - changed = true; + ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.ID); + if (zoom_rate != 0.0f) { + float correction = (plot.Hovered && equal_zoom) ? 0.5f : 1.0f; + const double plot_l = x_axis.PixelsToPlot(plot.PlotRect.Min.x - rect_size.x * tx * zoom_rate * correction); + const double plot_r = x_axis.PixelsToPlot(plot.PlotRect.Max.x + rect_size.x * (1 - tx) * zoom_rate * correction); + x_axis.SetMin(x_axis.IsInverted() ? plot_r : plot_l); + x_axis.SetMax(x_axis.IsInverted() ? plot_l : plot_r); + if (axis_equal && x_axis.OrthoAxis != nullptr) + x_axis.OrthoAxis->SetAspect(x_axis.GetAspect()); + changed = true; + } } } for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) { @@ -1980,14 +2013,17 @@ bool UpdateInput(ImPlotPlot& plot) { const bool equal_zoom = axis_equal && y_axis.OrthoAxis != nullptr; const bool equal_locked = equal_zoom && y_axis.OrthoAxis->IsInputLocked(); if (y_hov[i] && !y_axis.IsInputLocked() && !equal_locked) { - float correction = (plot.Hovered && equal_zoom) ? 0.5f : 1.0f; - const double plot_t = y_axis.PixelsToPlot(plot.PlotRect.Min.y - rect_size.y * ty * zoom_rate * correction); - const double plot_b = y_axis.PixelsToPlot(plot.PlotRect.Max.y + rect_size.y * (1 - ty) * zoom_rate * correction); - y_axis.SetMin(y_axis.IsInverted() ? plot_t : plot_b); - y_axis.SetMax(y_axis.IsInverted() ? plot_b : plot_t); - if (axis_equal && y_axis.OrthoAxis != nullptr) - y_axis.OrthoAxis->SetAspect(y_axis.GetAspect()); - changed = true; + ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.ID); + if (zoom_rate != 0.0f) { + float correction = (plot.Hovered && equal_zoom) ? 0.5f : 1.0f; + const double plot_t = y_axis.PixelsToPlot(plot.PlotRect.Min.y - rect_size.y * ty * zoom_rate * correction); + const double plot_b = y_axis.PixelsToPlot(plot.PlotRect.Max.y + rect_size.y * (1 - ty) * zoom_rate * correction); + y_axis.SetMin(y_axis.IsInverted() ? plot_t : plot_b); + y_axis.SetMax(y_axis.IsInverted() ? plot_b : plot_t); + if (axis_equal && y_axis.OrthoAxis != nullptr) + y_axis.OrthoAxis->SetAspect(y_axis.GetAspect()); + changed = true; + } } } } @@ -2269,19 +2305,19 @@ void SetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImP void SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags) { ImPlotContext& gp = *GImPlot; - IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked, - "Setup needs to be called after BeginPlot and before any setup locking functions (e.g. PlotX)!"); - IM_ASSERT_USER_ERROR(gp.CurrentItems != nullptr, - "SetupLegend() needs to be called within an itemized context!"); - ImPlotLegend& legend = gp.CurrentItems->Legend; - // check and set location - if (location != legend.PreviousLocation) - legend.Location = location; - legend.PreviousLocation = location; - // check and set flags - if (flags != legend.PreviousFlags) - legend.Flags = flags; - legend.PreviousFlags = flags; + IM_ASSERT_USER_ERROR((gp.CurrentPlot != nullptr && !gp.CurrentPlot->SetupLocked) || (gp.CurrentSubplot != nullptr && gp.CurrentPlot == nullptr), + "Setup needs to be called after BeginPlot or BeginSubplots and before any setup locking functions (e.g. PlotX)!"); + if (gp.CurrentItems) { + ImPlotLegend& legend = gp.CurrentItems->Legend; + // check and set location + if (location != legend.PreviousLocation) + legend.Location = location; + legend.PreviousLocation = location; + // check and set flags + if (flags != legend.PreviousFlags) + legend.Flags = flags; + legend.PreviousFlags = flags; + } } void SetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags) { @@ -2393,22 +2429,6 @@ bool BeginPlot(const char* title_id, const ImVec2& size, ImPlotFlags flags) { for (int i = 0; i < ImAxis_COUNT; ++i) ApplyNextPlotData(i); - // capture scroll with a child region - if (!ImHasFlag(plot.Flags, ImPlotFlags_NoChild)) { - ImVec2 child_size; - if (gp.CurrentSubplot != nullptr) - child_size = gp.CurrentSubplot->CellSize; - else - child_size = ImVec2(size.x == 0 ? gp.Style.PlotDefaultSize.x : size.x, size.y == 0 ? gp.Style.PlotDefaultSize.y : size.y); - ImGui::BeginChild(title_id, child_size, false, ImGuiWindowFlags_NoScrollbar); - Window = ImGui::GetCurrentWindow(); - Window->ScrollMax.y = 1.0f; - gp.ChildWindowMade = true; - } - else { - gp.ChildWindowMade = false; - } - // clear text buffers plot.ClearTextBuffer(); plot.SetTitle(title_id); @@ -2431,7 +2451,7 @@ bool BeginPlot(const char* title_id, const ImVec2& size, ImPlotFlags flags) { ResetCtxForNextPlot(GImPlot); return false; } - + // setup items (or dont) if (gp.CurrentItems == nullptr) gp.CurrentItems = &plot.Items; @@ -2550,7 +2570,7 @@ void SetupFinish() { // (2) get y tick labels (needed for left/right pad) for (int i = 0; i < IMPLOT_NUM_Y_AXES; i++) { ImPlotAxis& axis = plot.YAxis(i); - if (axis.WillRender() && axis.ShowDefaultTicks) { + if (axis.WillRender() && axis.ShowDefaultTicks && plot_height > 0) { axis.Locator(axis.Ticker, axis.Range, plot_height, true, axis.Formatter, axis.FormatterData); } } @@ -2563,7 +2583,7 @@ void SetupFinish() { // (4) get x ticks for (int i = 0; i < IMPLOT_NUM_X_AXES; i++) { ImPlotAxis& axis = plot.XAxis(i); - if (axis.WillRender() && axis.ShowDefaultTicks) { + if (axis.WillRender() && axis.ShowDefaultTicks && plot_width > 0) { axis.Locator(axis.Ticker, axis.Range, plot_width, false, axis.Formatter, axis.FormatterData); } } @@ -2758,7 +2778,7 @@ void EndPlot() { // FINAL RENDER ----------------------------------------------------------- - const bool render_border = gp.Style.PlotBorderSize > 0 && gp.Style.Colors[ImPlotCol_PlotBorder].w > 0; + const bool render_border = gp.Style.PlotBorderSize > 0 && GetStyleColorVec4(ImPlotCol_PlotBorder).w > 0; const bool any_x_held = plot.Held || AnyAxesHeld(&plot.Axes[ImAxis_X1], IMPLOT_NUM_X_AXES); const bool any_y_held = plot.Held || AnyAxesHeld(&plot.Axes[ImAxis_Y1], IMPLOT_NUM_Y_AXES); @@ -3023,24 +3043,57 @@ void EndPlot() { legend.Location, legend_out ? gp.Style.PlotPadding : gp.Style.LegendPadding); legend.Rect = ImRect(legend_pos, legend_pos + legend_size); - // test hover - legend.Hovered = ImGui::IsWindowHovered() && legend.Rect.Contains(IO.MousePos); + legend.RectClamped = legend.Rect; + const bool legend_scrollable = ClampLegendRect(legend.RectClamped, + legend_out ? plot.FrameRect : plot.PlotRect, + legend_out ? gp.Style.PlotPadding : gp.Style.LegendPadding + ); + const ImGuiButtonFlags legend_button_flags = ImGuiButtonFlags_AllowOverlap + | ImGuiButtonFlags_PressedOnClick + | ImGuiButtonFlags_PressedOnDoubleClick + | ImGuiButtonFlags_MouseButtonLeft + | ImGuiButtonFlags_MouseButtonRight + | ImGuiButtonFlags_MouseButtonMiddle + | ImGuiButtonFlags_FlattenChildren; + ImGui::KeepAliveID(plot.Items.ID); + ImGui::ButtonBehavior(legend.RectClamped, plot.Items.ID, &legend.Hovered, &legend.Held, legend_button_flags); + legend.Hovered = legend.Hovered || (ImGui::IsWindowHovered() && legend.RectClamped.Contains(IO.MousePos)); + + if (legend_scrollable) { + if (legend.Hovered) { + ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, plot.Items.ID); + if (IO.MouseWheel != 0.0f) { + ImVec2 max_step = legend.Rect.GetSize() * 0.67f; + float font_size = ImGui::GetCurrentWindow()->CalcFontSize(); + float scroll_step = ImFloor(ImMin(2 * font_size, max_step.x)); + legend.Scroll.x += scroll_step * IO.MouseWheel; + legend.Scroll.y += scroll_step * IO.MouseWheel; + } + } + const ImVec2 min_scroll_offset = legend.RectClamped.GetSize() - legend.Rect.GetSize(); + legend.Scroll.x = ImClamp(legend.Scroll.x, min_scroll_offset.x, 0.0f); + legend.Scroll.y = ImClamp(legend.Scroll.y, min_scroll_offset.y, 0.0f); + const ImVec2 scroll_offset = legend_horz ? ImVec2(legend.Scroll.x, 0) : ImVec2(0, legend.Scroll.y); + ImVec2 legend_offset = legend.RectClamped.Min - legend.Rect.Min + scroll_offset; + legend.Rect.Min += legend_offset; + legend.Rect.Max += legend_offset; + } else { + legend.Scroll = ImVec2(0,0); + } - if (legend_out) - ImGui::PushClipRect(plot.FrameRect.Min, plot.FrameRect.Max, true); - else - PushPlotClipRect(); - ImU32 col_bg = GetStyleColorU32(ImPlotCol_LegendBg); - ImU32 col_bd = GetStyleColorU32(ImPlotCol_LegendBorder); - DrawList.AddRectFilled(legend.Rect.Min, legend.Rect.Max, col_bg); - DrawList.AddRect(legend.Rect.Min, legend.Rect.Max, col_bd); + const ImU32 col_bg = GetStyleColorU32(ImPlotCol_LegendBg); + const ImU32 col_bd = GetStyleColorU32(ImPlotCol_LegendBorder); + ImGui::PushClipRect(legend.RectClamped.Min, legend.RectClamped.Max, true); + DrawList.AddRectFilled(legend.RectClamped.Min, legend.RectClamped.Max, col_bg); bool legend_contextable = ShowLegendEntries(plot.Items, legend.Rect, legend.Hovered, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz, DrawList) - && !ImHasFlag(legend.Flags, ImPlotLegendFlags_NoMenus); + && !ImHasFlag(legend.Flags, ImPlotLegendFlags_NoMenus); + DrawList.AddRect(legend.RectClamped.Min, legend.RectClamped.Max, col_bd); + ImGui::PopClipRect(); // main ctx menu if (gp.OpenContextThisFrame && legend_contextable && !ImHasFlag(plot.Flags, ImPlotFlags_NoMenus)) - ImGui::OpenPopup("##LegendContext"); - ImGui::PopClipRect(); + ImGui::OpenPopup("##LegendContext"); + if (ImGui::BeginPopup("##LegendContext")) { ImGui::Text("Legend"); ImGui::Separator(); if (ShowLegendContextMenu(legend, !ImHasFlag(plot.Flags, ImPlotFlags_NoLegend))) @@ -3350,7 +3403,7 @@ bool BeginSubplots(const char* title, int rows, int cols, const ImVec2& size, Im subplot.FrameRect = ImRect(Window->DC.CursorPos, Window->DC.CursorPos + frame_size); subplot.GridRect.Min = subplot.FrameRect.Min + half_pad + ImVec2(0,pad_top); subplot.GridRect.Max = subplot.FrameRect.Max - half_pad; - subplot.FrameHovered = subplot.FrameRect.Contains(ImGui::GetMousePos()) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows); + subplot.FrameHovered = subplot.FrameRect.Contains(ImGui::GetMousePos()) && ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows|ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); // outside legend adjustments (TODO: make function) const bool share_items = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems); @@ -3397,7 +3450,7 @@ bool BeginSubplots(const char* title, int rows, int cols, const ImVec2& size, Im ImGui::KeepAliveID(sep_id); const ImRect sep_bb = ImRect(subplot.GridRect.Min.x, ypos-SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Max.x, ypos+SUBPLOT_SPLITTER_HALF_THICKNESS); bool sep_hov = false, sep_hld = false; - const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick); + const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick); if ((sep_hov && G.HoveredIdTimer > SUBPLOT_SPLITTER_FEEDBACK_TIMER) || sep_hld) { if (sep_clk && ImGui::IsMouseDoubleClicked(0)) { float p = (subplot.RowRatios[r] + subplot.RowRatios[r+1])/2; @@ -3427,7 +3480,7 @@ bool BeginSubplots(const char* title, int rows, int cols, const ImVec2& size, Im ImGui::KeepAliveID(sep_id); const ImRect sep_bb = ImRect(xpos-SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Min.y, xpos+SUBPLOT_SPLITTER_HALF_THICKNESS, subplot.GridRect.Max.y); bool sep_hov = false, sep_hld = false; - const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick); + const bool sep_clk = ImGui::ButtonBehavior(sep_bb, sep_id, &sep_hov, &sep_hld, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick); if ((sep_hov && G.HoveredIdTimer > SUBPLOT_SPLITTER_FEEDBACK_TIMER) || sep_hld) { if (sep_clk && ImGui::IsMouseDoubleClicked(0)) { float p = (subplot.ColRatios[c] + subplot.ColRatios[c+1])/2; @@ -3488,6 +3541,7 @@ void EndSubplots() { ImPlotContext& gp = *GImPlot; IM_ASSERT_USER_ERROR(gp.CurrentSubplot != nullptr, "Mismatched BeginSubplots()/EndSubplots()!"); ImPlotSubplot& subplot = *gp.CurrentSubplot; + const ImGuiIO& IO = ImGui::GetIO(); // set alignments for (int r = 0; r < subplot.Rows; ++r) subplot.RowAlignmentData[r].End(); @@ -3506,24 +3560,60 @@ void EndSubplots() { const bool share_items = ImHasFlag(subplot.Flags, ImPlotSubplotFlags_ShareItems); ImDrawList& DrawList = *ImGui::GetWindowDrawList(); if (share_items && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoLegend) && subplot.Items.GetLegendCount() > 0) { - const bool legend_horz = ImHasFlag(subplot.Items.Legend.Flags, ImPlotLegendFlags_Horizontal); + ImPlotLegend& legend = subplot.Items.Legend; + const bool legend_horz = ImHasFlag(legend.Flags, ImPlotLegendFlags_Horizontal); const ImVec2 legend_size = CalcLegendSize(subplot.Items, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz); - const ImVec2 legend_pos = GetLocationPos(subplot.FrameRect, legend_size, subplot.Items.Legend.Location, gp.Style.PlotPadding); - subplot.Items.Legend.Rect = ImRect(legend_pos, legend_pos + legend_size); - subplot.Items.Legend.Hovered = subplot.FrameHovered && subplot.Items.Legend.Rect.Contains(ImGui::GetIO().MousePos); - ImGui::PushClipRect(subplot.FrameRect.Min, subplot.FrameRect.Max, true); - ImU32 col_bg = GetStyleColorU32(ImPlotCol_LegendBg); - ImU32 col_bd = GetStyleColorU32(ImPlotCol_LegendBorder); - DrawList.AddRectFilled(subplot.Items.Legend.Rect.Min, subplot.Items.Legend.Rect.Max, col_bg); - DrawList.AddRect(subplot.Items.Legend.Rect.Min, subplot.Items.Legend.Rect.Max, col_bd); - bool legend_contextable = ShowLegendEntries(subplot.Items, subplot.Items.Legend.Rect, subplot.Items.Legend.Hovered, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz, DrawList) - && !ImHasFlag(subplot.Items.Legend.Flags, ImPlotLegendFlags_NoMenus); + const ImVec2 legend_pos = GetLocationPos(subplot.FrameRect, legend_size, legend.Location, gp.Style.PlotPadding); + legend.Rect = ImRect(legend_pos, legend_pos + legend_size); + legend.RectClamped = legend.Rect; + const bool legend_scrollable = ClampLegendRect(legend.RectClamped,subplot.FrameRect, gp.Style.PlotPadding); + const ImGuiButtonFlags legend_button_flags = ImGuiButtonFlags_AllowOverlap + | ImGuiButtonFlags_PressedOnClick + | ImGuiButtonFlags_PressedOnDoubleClick + | ImGuiButtonFlags_MouseButtonLeft + | ImGuiButtonFlags_MouseButtonRight + | ImGuiButtonFlags_MouseButtonMiddle + | ImGuiButtonFlags_FlattenChildren; + ImGui::KeepAliveID(subplot.Items.ID); + ImGui::ButtonBehavior(legend.RectClamped, subplot.Items.ID, &legend.Hovered, &legend.Held, legend_button_flags); + legend.Hovered = legend.Hovered || (subplot.FrameHovered && legend.RectClamped.Contains(ImGui::GetIO().MousePos)); + + if (legend_scrollable) { + if (legend.Hovered) { + ImGui::SetKeyOwner(ImGuiKey_MouseWheelY, subplot.Items.ID); + if (IO.MouseWheel != 0.0f) { + ImVec2 max_step = legend.Rect.GetSize() * 0.67f; + float font_size = ImGui::GetCurrentWindow()->CalcFontSize(); + float scroll_step = ImFloor(ImMin(2 * font_size, max_step.x)); + legend.Scroll.x += scroll_step * IO.MouseWheel; + legend.Scroll.y += scroll_step * IO.MouseWheel; + } + } + const ImVec2 min_scroll_offset = legend.RectClamped.GetSize() - legend.Rect.GetSize(); + legend.Scroll.x = ImClamp(legend.Scroll.x, min_scroll_offset.x, 0.0f); + legend.Scroll.y = ImClamp(legend.Scroll.y, min_scroll_offset.y, 0.0f); + const ImVec2 scroll_offset = legend_horz ? ImVec2(legend.Scroll.x, 0) : ImVec2(0, legend.Scroll.y); + ImVec2 legend_offset = legend.RectClamped.Min - legend.Rect.Min + scroll_offset; + legend.Rect.Min += legend_offset; + legend.Rect.Max += legend_offset; + } else { + legend.Scroll = ImVec2(0,0); + } + + const ImU32 col_bg = GetStyleColorU32(ImPlotCol_LegendBg); + const ImU32 col_bd = GetStyleColorU32(ImPlotCol_LegendBorder); + ImGui::PushClipRect(legend.RectClamped.Min, legend.RectClamped.Max, true); + DrawList.AddRectFilled(legend.RectClamped.Min, legend.RectClamped.Max, col_bg); + bool legend_contextable = ShowLegendEntries(subplot.Items, legend.Rect, legend.Hovered, gp.Style.LegendInnerPadding, gp.Style.LegendSpacing, !legend_horz, DrawList) + && !ImHasFlag(legend.Flags, ImPlotLegendFlags_NoMenus); + DrawList.AddRect(legend.RectClamped.Min, legend.RectClamped.Max, col_bd); + ImGui::PopClipRect(); + if (legend_contextable && !ImHasFlag(subplot.Flags, ImPlotSubplotFlags_NoMenus) && ImGui::GetIO().MouseReleased[gp.InputMap.Menu]) ImGui::OpenPopup("##LegendContext"); - ImGui::PopClipRect(); if (ImGui::BeginPopup("##LegendContext")) { ImGui::Text("Legend"); ImGui::Separator(); - if (ShowLegendContextMenu(subplot.Items.Legend, !ImHasFlag(subplot.Flags, ImPlotFlags_NoLegend))) + if (ShowLegendContextMenu(legend, !ImHasFlag(subplot.Flags, ImPlotFlags_NoLegend))) ImFlipFlag(subplot.Flags, ImPlotFlags_NoLegend); ImGui::EndPopup(); } @@ -3804,7 +3894,7 @@ IMPLOT_API void TagYV(double y, const ImVec4& color, const char* fmt, va_list ar static const float DRAG_GRAB_HALF_SIZE = 4.0f; -bool DragPoint(int n_id, double* x, double* y, const ImVec4& col, float radius, ImPlotDragToolFlags flags) { +bool DragPoint(int n_id, double* x, double* y, const ImVec4& col, float radius, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) { ImGui::PushID("#IMPLOT_DRAG_POINT"); IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "DragPoint() needs to be called between BeginPlot() and EndPlot()!"); SetupLock(); @@ -3826,30 +3916,34 @@ bool DragPoint(int n_id, double* x, double* y, const ImVec4& col, float radius, bool hovered = false, held = false; ImGui::KeepAliveID(id); - if (input) - ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (input) { + bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (out_clicked) *out_clicked = clicked; + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + } - bool dragging = false; + bool modified = false; if (held && ImGui::IsMouseDragging(0)) { *x = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x; *y = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y; - dragging = true; + modified = true; } PushPlotClipRect(); ImDrawList& DrawList = *GetPlotDrawList(); if ((hovered || held) && show_curs) ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); - if (dragging && no_delay) + if (modified && no_delay) pos = PlotToPixels(*x,*y,IMPLOT_AUTO,IMPLOT_AUTO); DrawList.AddCircleFilled(pos, radius, col32); PopPlotClipRect(); ImGui::PopID(); - return dragging; + return modified; } -bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags) { +bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) { // ImGui::PushID("#IMPLOT_DRAG_LINE_X"); ImPlotContext& gp = *GImPlot; IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "DragLineX() needs to be called between BeginPlot() and EndPlot()!"); @@ -3871,8 +3965,12 @@ bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPl bool hovered = false, held = false; ImGui::KeepAliveID(id); - if (input) - ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (input) { + bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (out_clicked) *out_clicked = clicked; + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + } if ((hovered || held) && show_curs) ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW); @@ -3881,15 +3979,15 @@ bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPl ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col; ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color); - bool dragging = false; + bool modified = false; if (held && ImGui::IsMouseDragging(0)) { *value = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x; - dragging = true; + modified = true; } PushPlotClipRect(); ImDrawList& DrawList = *GetPlotDrawList(); - if (dragging && no_delay) + if (modified && no_delay) x = IM_ROUND(PlotToPixels(*value,0,IMPLOT_AUTO,IMPLOT_AUTO).x); DrawList.AddLine(ImVec2(x,yt), ImVec2(x,yb), col32, thickness); DrawList.AddLine(ImVec2(x,yt), ImVec2(x,yt+len), col32, 3*thickness); @@ -3897,10 +3995,10 @@ bool DragLineX(int n_id, double* value, const ImVec4& col, float thickness, ImPl PopPlotClipRect(); // ImGui::PopID(); - return dragging; + return modified; } -bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags) { +bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) { ImGui::PushID("#IMPLOT_DRAG_LINE_Y"); ImPlotContext& gp = *GImPlot; IM_ASSERT_USER_ERROR(gp.CurrentPlot != nullptr, "DragLineY() needs to be called between BeginPlot() and EndPlot()!"); @@ -3923,8 +4021,12 @@ bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPl bool hovered = false, held = false; ImGui::KeepAliveID(id); - if (input) - ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (input) { + bool clicked = ImGui::ButtonBehavior(rect,id,&hovered,&held); + if (out_clicked) *out_clicked = clicked; + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + } if ((hovered || held) && show_curs) ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS); @@ -3933,15 +4035,15 @@ bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPl ImVec4 color = IsColorAuto(col) ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : col; ImU32 col32 = ImGui::ColorConvertFloat4ToU32(color); - bool dragging = false; + bool modified = false; if (held && ImGui::IsMouseDragging(0)) { *value = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y; - dragging = true; + modified = true; } PushPlotClipRect(); ImDrawList& DrawList = *GetPlotDrawList(); - if (dragging && no_delay) + if (modified && no_delay) y = IM_ROUND(PlotToPixels(0, *value,IMPLOT_AUTO,IMPLOT_AUTO).y); DrawList.AddLine(ImVec2(xl,y), ImVec2(xr,y), col32, thickness); DrawList.AddLine(ImVec2(xl,y), ImVec2(xl+len,y), col32, 3*thickness); @@ -3949,10 +4051,10 @@ bool DragLineY(int n_id, double* value, const ImVec4& col, float thickness, ImPl PopPlotClipRect(); ImGui::PopID(); - return dragging; + return modified; } -bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_max, const ImVec4& col, ImPlotDragToolFlags flags) { +bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_max, const ImVec4& col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) { ImGui::PushID("#IMPLOT_DRAG_RECT"); IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "DragRect() needs to be called between BeginPlot() and EndPlot()!"); SetupLock(); @@ -3989,13 +4091,18 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m ImU32 col32_a = ImGui::ColorConvertFloat4ToU32(color); const ImGuiID id = ImGui::GetCurrentWindow()->GetID(n_id); - bool dragging = false; - bool hovered = false, held = false; + bool modified = false; + bool clicked = false, hovered = false, held = false; ImRect b_rect(pc.x-DRAG_GRAB_HALF_SIZE,pc.y-DRAG_GRAB_HALF_SIZE,pc.x+DRAG_GRAB_HALF_SIZE,pc.y+DRAG_GRAB_HALF_SIZE); ImGui::KeepAliveID(id); - if (input) - ImGui::ButtonBehavior(b_rect,id,&hovered,&held); + if (input) { + // middle point + clicked = ImGui::ButtonBehavior(b_rect,id,&hovered,&held); + if (out_clicked) *out_clicked = clicked; + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + } if ((hovered || held) && show_curs) ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll); @@ -4005,7 +4112,7 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m *y[i] = pp.y; *x[i] = pp.x; } - dragging = true; + modified = true; } for (int i = 0; i < 4; ++i) { @@ -4013,15 +4120,19 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m b_rect = ImRect(p[i].x-DRAG_GRAB_HALF_SIZE,p[i].y-DRAG_GRAB_HALF_SIZE,p[i].x+DRAG_GRAB_HALF_SIZE,p[i].y+DRAG_GRAB_HALF_SIZE); ImGuiID p_id = id + i + 1; ImGui::KeepAliveID(p_id); - if (input) - ImGui::ButtonBehavior(b_rect,p_id,&hovered,&held); + if (input) { + clicked = ImGui::ButtonBehavior(b_rect,p_id,&hovered,&held); + if (out_clicked) *out_clicked = *out_clicked || clicked; + if (out_hovered) *out_hovered = *out_hovered || hovered; + if (out_held) *out_held = *out_held || held; + } if ((hovered || held) && show_curs) ImGui::SetMouseCursor(cur[i]); if (held && ImGui::IsMouseDragging(0)) { *x[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x; *y[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y; - dragging = true; + modified = true; } // edges @@ -4031,8 +4142,12 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m : ImRect(e_min.x - DRAG_GRAB_HALF_SIZE, e_min.y + DRAG_GRAB_HALF_SIZE, e_max.x + DRAG_GRAB_HALF_SIZE, e_max.y - DRAG_GRAB_HALF_SIZE); ImGuiID e_id = id + i + 5; ImGui::KeepAliveID(e_id); - if (input) - ImGui::ButtonBehavior(b_rect,e_id,&hovered,&held); + if (input) { + clicked = ImGui::ButtonBehavior(b_rect,e_id,&hovered,&held); + if (out_clicked) *out_clicked = *out_clicked || clicked; + if (out_hovered) *out_hovered = *out_hovered || hovered; + if (out_held) *out_held = *out_held || held; + } if ((hovered || held) && show_curs) h[i] ? ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS) : ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW); if (held && ImGui::IsMouseDragging(0)) { @@ -4040,7 +4155,7 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m *y[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).y; else *x[i] = ImPlot::GetPlotMousePos(IMPLOT_AUTO,IMPLOT_AUTO).x; - dragging = true; + modified = true; } if (hovered && ImGui::IsMouseDoubleClicked(0)) { @@ -4049,14 +4164,22 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m *y[i] = ((y[i] == y_min && *y_min < *y_max) || (y[i] == y_max && *y_max < *y_min)) ? b.Y.Min : b.Y.Max; else *x[i] = ((x[i] == x_min && *x_min < *x_max) || (x[i] == x_max && *x_max < *x_min)) ? b.X.Min : b.X.Max; - dragging = true; + modified = true; } } + const bool mouse_inside = rect_grab.Contains(ImGui::GetMousePos()); + const bool mouse_clicked = ImGui::IsMouseClicked(0); + const bool mouse_down = ImGui::IsMouseDown(0); + if (input && mouse_inside) { + if (out_clicked) *out_clicked = *out_clicked || mouse_clicked; + if (out_hovered) *out_hovered = true; + if (out_held) *out_held = *out_held || mouse_down; + } PushPlotClipRect(); ImDrawList& DrawList = *GetPlotDrawList(); - if (dragging && no_delay) { + if (modified && no_delay) { for (int i = 0; i < 4; ++i) p[i] = PlotToPixels(*x[i],*y[i],IMPLOT_AUTO,IMPLOT_AUTO); pc = PlotToPixels((*x_min+*x_max)/2,(*y_min+*y_max)/2,IMPLOT_AUTO,IMPLOT_AUTO); @@ -4064,18 +4187,18 @@ bool DragRect(int n_id, double* x_min, double* y_min, double* x_max, double* y_m } DrawList.AddRectFilled(rect.Min, rect.Max, col32_a); DrawList.AddRect(rect.Min, rect.Max, col32); - if (input && (dragging || rect_grab.Contains(ImGui::GetMousePos()))) { + if (input && (modified || mouse_inside)) { DrawList.AddCircleFilled(pc,DRAG_GRAB_HALF_SIZE,col32); for (int i = 0; i < 4; ++i) DrawList.AddCircleFilled(p[i],DRAG_GRAB_HALF_SIZE,col32); } PopPlotClipRect(); ImGui::PopID(); - return dragging; + return modified; } -bool DragRect(int id, ImPlotRect* bounds, const ImVec4& col, ImPlotDragToolFlags flags) { - return DragRect(id, &bounds->X.Min, &bounds->Y.Min,&bounds->X.Max, &bounds->Y.Max, col, flags); +bool DragRect(int id, ImPlotRect* bounds, const ImVec4& col, ImPlotDragToolFlags flags, bool* out_clicked, bool* out_hovered, bool* out_held) { + return DragRect(id, &bounds->X.Min, &bounds->Y.Min,&bounds->X.Max, &bounds->Y.Max, col, flags, out_clicked, out_hovered, out_held); } //----------------------------------------------------------------------------- @@ -4171,7 +4294,7 @@ bool BeginDragDropTargetAxis(ImAxis axis) { bool BeginDragDropTargetLegend() { SetupLock(); ImPlotItemGroup& items = *GImPlot->CurrentItems; - ImRect rect = items.Legend.Rect; + ImRect rect = items.Legend.RectClamped; return ImGui::BeginDragDropTargetCustom(rect, items.ID); } @@ -5110,6 +5233,7 @@ void ShowMetricsWindow(bool* p_popen) { static bool show_frame_rects = false; static bool show_subplot_frame_rects = false; static bool show_subplot_grid_rects = false; + static bool show_legend_rects = false; ImDrawList& fg = *ImGui::GetForegroundDrawList(); @@ -5134,6 +5258,7 @@ void ShowMetricsWindow(bool* p_popen) { ImGui::Checkbox("Show Axis Rects", &show_axis_rects); ImGui::Checkbox("Show Subplot Frame Rects", &show_subplot_frame_rects); ImGui::Checkbox("Show Subplot Grid Rects", &show_subplot_grid_rects); + ImGui::Checkbox("Show Legend Rects", &show_legend_rects); ImGui::TreePop(); } const int n_plots = gp.Plots.GetBufSize(); @@ -5155,6 +5280,10 @@ void ShowMetricsWindow(bool* p_popen) { fg.AddRect(plot->Axes[i].HoverRect.Min, plot->Axes[i].HoverRect.Max, IM_COL32(0,255,0,255)); } } + if (show_legend_rects && plot->Items.GetLegendCount() > 0) { + fg.AddRect(plot->Items.Legend.Rect.Min, plot->Items.Legend.Rect.Max, IM_COL32(255,192,0,255)); + fg.AddRect(plot->Items.Legend.RectClamped.Min, plot->Items.Legend.RectClamped.Max, IM_COL32(255,128,0,255)); + } } for (int p = 0; p < n_subplots; ++p) { ImPlotSubplot* subplot = gp.Subplots.GetByIndex(p); @@ -5162,6 +5291,10 @@ void ShowMetricsWindow(bool* p_popen) { fg.AddRect(subplot->FrameRect.Min, subplot->FrameRect.Max, IM_COL32(255,0,0,255)); if (show_subplot_grid_rects) fg.AddRect(subplot->GridRect.Min, subplot->GridRect.Max, IM_COL32(0,0,255,255)); + if (show_legend_rects && subplot->Items.GetLegendCount() > 0) { + fg.AddRect(subplot->Items.Legend.Rect.Min, subplot->Items.Legend.Rect.Max, IM_COL32(255,192,0,255)); + fg.AddRect(subplot->Items.Legend.RectClamped.Min, subplot->Items.Legend.RectClamped.Max, IM_COL32(255,128,0,255)); + } } if (ImGui::TreeNode("Plots","Plots (%d)", n_plots)) { for (int p = 0; p < n_plots; ++p) { diff --git a/core/deps/implot/implot.h b/core/deps/implot/implot.h index a394569ac..305433123 100644 --- a/core/deps/implot/implot.h +++ b/core/deps/implot/implot.h @@ -1,6 +1,6 @@ // MIT License -// Copyright (c) 2022 Evan Pezent +// Copyright (c) 2023 Evan Pezent // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -// ImPlot v0.14 +// ImPlot v0.17 // Table of Contents: // @@ -45,7 +45,7 @@ // [SECTION] Obsolete API #pragma once -#include "imgui/imgui.h" +#include "imgui.h" //----------------------------------------------------------------------------- // [SECTION] Macros and Defines @@ -60,7 +60,7 @@ #endif // ImPlot version string. -#define IMPLOT_VERSION "0.14" +#define IMPLOT_VERSION "0.17" // Indicates variable should deduced automatically. #define IMPLOT_AUTO -1 // Special color used to indicate that a color should be deduced automatically. @@ -135,10 +135,9 @@ enum ImPlotFlags_ { ImPlotFlags_NoInputs = 1 << 3, // the user will not be able to interact with the plot ImPlotFlags_NoMenus = 1 << 4, // the user will not be able to open context menus ImPlotFlags_NoBoxSelect = 1 << 5, // the user will not be able to box-select - ImPlotFlags_NoChild = 1 << 6, // a child window region will not be used to capture mouse scroll (can boost performance for single ImGui window applications) - ImPlotFlags_NoFrame = 1 << 7, // the ImGui frame will not be rendered - ImPlotFlags_Equal = 1 << 8, // x and y axes pairs will be constrained to have the same units/pixel - ImPlotFlags_Crosshairs = 1 << 9, // the default mouse cursor will be replaced with a crosshair when hovered + ImPlotFlags_NoFrame = 1 << 6, // the ImGui frame will not be rendered + ImPlotFlags_Equal = 1 << 7, // x and y axes pairs will be constrained to have the same units/pixel + ImPlotFlags_Crosshairs = 1 << 8, // the default mouse cursor will be replaced with a crosshair when hovered ImPlotFlags_CanvasOnly = ImPlotFlags_NoTitle | ImPlotFlags_NoLegend | ImPlotFlags_NoMenus | ImPlotFlags_NoBoxSelect | ImPlotFlags_NoMouseText }; @@ -287,8 +286,9 @@ enum ImPlotInfLinesFlags_ { // Flags for PlotPieChart enum ImPlotPieChartFlags_ { - ImPlotPieChartFlags_None = 0, // default - ImPlotPieChartFlags_Normalize = 1 << 10 // force normalization of pie chart values (i.e. always make a full circle if sum < 0) + ImPlotPieChartFlags_None = 0, // default + ImPlotPieChartFlags_Normalize = 1 << 10, // force normalization of pie chart values (i.e. always make a full circle if sum < 0) + ImPlotPieChartFlags_IgnoreHidden = 1 << 11 // ignore hidden slices when drawing the pie chart (as if they were not there) }; // Flags for PlotHeatmap @@ -464,41 +464,43 @@ enum ImPlotBin_ { }; // Double precision version of ImVec2 used by ImPlot. Extensible by end users. +IM_MSVC_RUNTIME_CHECKS_OFF struct ImPlotPoint { double x, y; - ImPlotPoint() { x = y = 0.0; } - ImPlotPoint(double _x, double _y) { x = _x; y = _y; } - ImPlotPoint(const ImVec2& p) { x = p.x; y = p.y; } - double operator[] (size_t idx) const { return (&x)[idx]; } - double& operator[] (size_t idx) { return (&x)[idx]; } + constexpr ImPlotPoint() : x(0.0), y(0.0) { } + constexpr ImPlotPoint(double _x, double _y) : x(_x), y(_y) { } + constexpr ImPlotPoint(const ImVec2& p) : x((double)p.x), y((double)p.y) { } + double& operator[] (size_t idx) { IM_ASSERT(idx == 0 || idx == 1); return ((double*)(void*)(char*)this)[idx]; } + double operator[] (size_t idx) const { IM_ASSERT(idx == 0 || idx == 1); return ((const double*)(const void*)(const char*)this)[idx]; } #ifdef IMPLOT_POINT_CLASS_EXTRA IMPLOT_POINT_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h // to convert back and forth between your math types and ImPlotPoint. #endif }; +IM_MSVC_RUNTIME_CHECKS_RESTORE // Range defined by a min/max value. struct ImPlotRange { double Min, Max; - ImPlotRange() { Min = 0; Max = 0; } - ImPlotRange(double _min, double _max) { Min = _min; Max = _max; } - bool Contains(double value) const { return value >= Min && value <= Max; } - double Size() const { return Max - Min; } - double Clamp(double value) const { return (value < Min) ? Min : (value > Max) ? Max : value; } + constexpr ImPlotRange() : Min(0.0), Max(0.0) { } + constexpr ImPlotRange(double _min, double _max) : Min(_min), Max(_max) { } + bool Contains(double value) const { return value >= Min && value <= Max; } + double Size() const { return Max - Min; } + double Clamp(double value) const { return (value < Min) ? Min : (value > Max) ? Max : value; } }; // Combination of two range limits for X and Y axes. Also an AABB defined by Min()/Max(). struct ImPlotRect { ImPlotRange X, Y; - ImPlotRect() { } - ImPlotRect(double x_min, double x_max, double y_min, double y_max) { X.Min = x_min; X.Max = x_max; Y.Min = y_min; Y.Max = y_max; } - bool Contains(const ImPlotPoint& p) const { return Contains(p.x, p.y); } - bool Contains(double x, double y) const { return X.Contains(x) && Y.Contains(y); } - ImPlotPoint Size() const { return ImPlotPoint(X.Size(), Y.Size()); } - ImPlotPoint Clamp(const ImPlotPoint& p) { return Clamp(p.x, p.y); } - ImPlotPoint Clamp(double x, double y) { return ImPlotPoint(X.Clamp(x),Y.Clamp(y)); } - ImPlotPoint Min() const { return ImPlotPoint(X.Min, Y.Min); } - ImPlotPoint Max() const { return ImPlotPoint(X.Max, Y.Max); } + constexpr ImPlotRect() : X(0.0,0.0), Y(0.0,0.0) { } + constexpr ImPlotRect(double x_min, double x_max, double y_min, double y_max) : X(x_min, x_max), Y(y_min, y_max) { } + bool Contains(const ImPlotPoint& p) const { return Contains(p.x, p.y); } + bool Contains(double x, double y) const { return X.Contains(x) && Y.Contains(y); } + ImPlotPoint Size() const { return ImPlotPoint(X.Size(), Y.Size()); } + ImPlotPoint Clamp(const ImPlotPoint& p) { return Clamp(p.x, p.y); } + ImPlotPoint Clamp(double x, double y) { return ImPlotPoint(X.Clamp(x),Y.Clamp(y)); } + ImPlotPoint Min() const { return ImPlotPoint(X.Min, Y.Min); } + ImPlotPoint Max() const { return ImPlotPoint(X.Max, Y.Max); } }; // Plot style structure @@ -728,7 +730,7 @@ IMPLOT_API void EndSubplots(); // Enables an axis or sets the label and/or flags for an existing axis. Leave #label = nullptr for no label. IMPLOT_API void SetupAxis(ImAxis axis, const char* label=nullptr, ImPlotAxisFlags flags=0); -// Sets an axis range limits. If ImPlotCond_Always is used, the axes limits will be locked. +// Sets an axis range limits. If ImPlotCond_Always is used, the axes limits will be locked. Inversion with v_min > v_max is not supported; use SetupAxisLimits instead. IMPLOT_API void SetupAxisLimits(ImAxis axis, double v_min, double v_max, ImPlotCond cond = ImPlotCond_Once); // Links an axis range limits to external values. Set to nullptr for no linkage. The pointer data must remain valid until EndPlot. IMPLOT_API void SetupAxisLinks(ImAxis axis, double* link_min, double* link_max); @@ -754,7 +756,7 @@ IMPLOT_API void SetupAxes(const char* x_label, const char* y_label, ImPlotAxisFl // Sets the primary X and Y axes range limits. If ImPlotCond_Always is used, the axes limits will be locked (shorthand for two calls to SetupAxisLimits). IMPLOT_API void SetupAxesLimits(double x_min, double x_max, double y_min, double y_max, ImPlotCond cond = ImPlotCond_Once); -// Sets up the plot legend. +// Sets up the plot legend. This can also be called immediately after BeginSubplots when using ImPlotSubplotFlags_ShareItems. IMPLOT_API void SetupLegend(ImPlotLocation location, ImPlotLegendFlags flags=0); // Set the location of the current plot's mouse position text (default = South|East). IMPLOT_API void SetupMouseText(ImPlotLocation location, ImPlotMouseTextFlags flags=0); @@ -891,6 +893,7 @@ IMPLOT_TMP void PlotStems(const char* label_id, const T* xs, const T* ys, int co IMPLOT_TMP void PlotInfLines(const char* label_id, const T* values, int count, ImPlotInfLinesFlags flags=0, int offset=0, int stride=sizeof(T)); // Plots a pie chart. Center and radius are in plot units. #label_fmt can be set to nullptr for no labels. +IMPLOT_TMP void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data=nullptr, double angle0=90, ImPlotPieChartFlags flags=0); IMPLOT_TMP void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* label_fmt="%.1f", double angle0=90, ImPlotPieChartFlags flags=0); // Plots a 2D heatmap chart. Values are expected to be in row-major order by default. Leave #scale_min and scale_max both at 0 for automatic color scaling, or set them to a predefined range. #label_fmt can be set to nullptr for no labels. @@ -923,16 +926,18 @@ IMPLOT_API void PlotDummy(const char* label_id, ImPlotDummyFlags flags=0); // The following can be used to render interactive elements and/or annotations. // Like the item plotting functions above, they apply to the current x and y -// axes, which can be changed with `SetAxis/SetAxes`. +// axes, which can be changed with `SetAxis/SetAxes`. These functions return true +// when user interaction causes the provided coordinates to change. Additional +// user interactions can be retrieved through the optional output parameters. // Shows a draggable point at x,y. #col defaults to ImGuiCol_Text. -IMPLOT_API bool DragPoint(int id, double* x, double* y, const ImVec4& col, float size = 4, ImPlotDragToolFlags flags=0); +IMPLOT_API bool DragPoint(int id, double* x, double* y, const ImVec4& col, float size = 4, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* held = nullptr); // Shows a draggable vertical guide line at an x-value. #col defaults to ImGuiCol_Text. -IMPLOT_API bool DragLineX(int id, double* x, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags=0); +IMPLOT_API bool DragLineX(int id, double* x, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* held = nullptr); // Shows a draggable horizontal guide line at a y-value. #col defaults to ImGuiCol_Text. -IMPLOT_API bool DragLineY(int id, double* y, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags=0); +IMPLOT_API bool DragLineY(int id, double* y, const ImVec4& col, float thickness = 1, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* held = nullptr); // Shows a draggable and resizeable rectangle. -IMPLOT_API bool DragRect(int id, double* x1, double* y1, double* x2, double* y2, const ImVec4& col, ImPlotDragToolFlags flags=0); +IMPLOT_API bool DragRect(int id, double* x1, double* y1, double* x2, double* y2, const ImVec4& col, ImPlotDragToolFlags flags = 0, bool* out_clicked = nullptr, bool* out_hovered = nullptr, bool* held = nullptr); // Shows an annotation callout at a chosen point. Clamping keeps annotations in the plot area. Annotations are always rendered on top. IMPLOT_API void Annotation(double x, double y, const ImVec4& col, const ImVec2& pix_offset, bool clamp, bool round = false); diff --git a/core/deps/implot/implot_internal.h b/core/deps/implot/implot_internal.h index 51f0b429c..8c1650ef1 100644 --- a/core/deps/implot/implot_internal.h +++ b/core/deps/implot/implot_internal.h @@ -1,6 +1,6 @@ // MIT License -// Copyright (c) 2022 Evan Pezent +// Copyright (c) 2023 Evan Pezent // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -// ImPlot v0.14 +// ImPlot v0.17 // You may use this file to debug, understand or extend ImPlot features but we // don't provide any guarantee of forward compatibility! @@ -907,8 +907,9 @@ struct ImPlotAxis } void PullLinks() { - if (LinkedMin) { SetMin(*LinkedMin,true); } - if (LinkedMax) { SetMax(*LinkedMax,true); } + if (LinkedMin && LinkedMax) { SetRange(*LinkedMin, *LinkedMax); } + else if (LinkedMin) { SetMin(*LinkedMin,true); } + else if (LinkedMax) { SetMax(*LinkedMax,true); } } }; @@ -965,9 +966,11 @@ struct ImPlotLegend ImPlotLegendFlags PreviousFlags; ImPlotLocation Location; ImPlotLocation PreviousLocation; + ImVec2 Scroll; ImVector Indices; ImGuiTextBuffer Labels; ImRect Rect; + ImRect RectClamped; bool Hovered; bool Held; bool CanGoInside; @@ -977,6 +980,7 @@ struct ImPlotLegend CanGoInside = true; Hovered = Held = false; Location = PreviousLocation = ImPlotLocation_NorthWest; + Scroll = ImVec2(0,0); } void Reset() { Indices.shrink(0); Labels.Buf.shrink(0); } @@ -1136,7 +1140,6 @@ struct ImPlotSubplot { ID = 0; Flags = PreviousFlags = ImPlotSubplotFlags_None; Rows = Cols = CurrentIdx = 0; - FrameHovered = false; Items.Legend.Location = ImPlotLocation_North; Items.Legend.Flags = ImPlotLegendFlags_Horizontal|ImPlotLegendFlags_Outside; Items.Legend.CanGoInside = false; @@ -1215,9 +1218,6 @@ struct ImPlotContext { ImPlotAnnotationCollection Annotations; ImPlotTagCollection Tags; - // Flags - bool ChildWindowMade; - // Style and Colormaps ImPlotStyle Style; ImVector ColorModifiers; @@ -1414,13 +1414,15 @@ IMPLOT_API void ShowAxisContextMenu(ImPlotAxis& axis, ImPlotAxis* equal_axis, bo // Gets the position of an inner rect that is located inside of an outer rect according to an ImPlotLocation and padding amount. IMPLOT_API ImVec2 GetLocationPos(const ImRect& outer_rect, const ImVec2& inner_size, ImPlotLocation location, const ImVec2& pad = ImVec2(0,0)); -// Calculates the bounding box size of a legend +// Calculates the bounding box size of a legend _before_ clipping. IMPLOT_API ImVec2 CalcLegendSize(ImPlotItemGroup& items, const ImVec2& pad, const ImVec2& spacing, bool vertical); +// Clips calculated legend size +IMPLOT_API bool ClampLegendRect(ImRect& legend_rect, const ImRect& outer_rect, const ImVec2& pad); // Renders legend entries into a bounding box IMPLOT_API bool ShowLegendEntries(ImPlotItemGroup& items, const ImRect& legend_bb, bool interactable, const ImVec2& pad, const ImVec2& spacing, bool vertical, ImDrawList& DrawList); -// Shows an alternate legend for the plot identified by #title_id, outside of the plot frame (can be called before or after of Begin/EndPlot but must occur in the same ImGui window!). +// Shows an alternate legend for the plot identified by #title_id, outside of the plot frame (can be called before or after of Begin/EndPlot but must occur in the same ImGui window! This is not thoroughly tested nor scrollable!). IMPLOT_API void ShowAltLegend(const char* title_id, bool vertical = true, const ImVec2 size = ImVec2(0,0), bool interactable = true); -// Shows an legends's context menu. +// Shows a legend's context menu. IMPLOT_API bool ShowLegendContextMenu(ImPlotLegend& legend, bool visible); //----------------------------------------------------------------------------- diff --git a/core/deps/implot/implot_items.cpp b/core/deps/implot/implot_items.cpp index 345f703a9..91c71d829 100644 --- a/core/deps/implot/implot_items.cpp +++ b/core/deps/implot/implot_items.cpp @@ -1,6 +1,6 @@ // MIT License -// Copyright (c) 2020 Evan Pezent +// Copyright (c) 2023 Evan Pezent // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -// ImPlot v0.14 +// ImPlot v0.17 #define IMGUI_DEFINE_MATH_OPERATORS #include "implot.h" @@ -98,11 +98,11 @@ static IMPLOT_INLINE float ImInvSqrt(float x) { return 1.0f / sqrtf(x); } #define _CAT(x, y) _CAT_(x, y) #define _CAT_(x,y) x ## y #define _INSTANTIATE_FOR_NUMERIC_TYPES(chain) _CAT(_INSTANTIATE_FOR_NUMERIC_TYPES_1 chain, _END) -#define _INSTANTIATE_FOR_NUMERIC_TYPES_1(T) INSTANTIATE_MACRO(T); _INSTANTIATE_FOR_NUMERIC_TYPES_2 -#define _INSTANTIATE_FOR_NUMERIC_TYPES_2(T) INSTANTIATE_MACRO(T); _INSTANTIATE_FOR_NUMERIC_TYPES_1 +#define _INSTANTIATE_FOR_NUMERIC_TYPES_1(T) INSTANTIATE_MACRO(T) _INSTANTIATE_FOR_NUMERIC_TYPES_2 +#define _INSTANTIATE_FOR_NUMERIC_TYPES_2(T) INSTANTIATE_MACRO(T) _INSTANTIATE_FOR_NUMERIC_TYPES_1 #define _INSTANTIATE_FOR_NUMERIC_TYPES_1_END #define _INSTANTIATE_FOR_NUMERIC_TYPES_2_END -#define CALL_INSTANTIATE_FOR_NUMERIC_TYPES() _INSTANTIATE_FOR_NUMERIC_TYPES(IMPLOT_NUMERIC_TYPES); +#define CALL_INSTANTIATE_FOR_NUMERIC_TYPES() _INSTANTIATE_FOR_NUMERIC_TYPES(IMPLOT_NUMERIC_TYPES) namespace ImPlot { @@ -1287,7 +1287,7 @@ struct RendererShaded : RendererBase { return false; } const int intersect = (P11.y > P12.y && P22.y > P21.y) || (P12.y > P11.y && P21.y > P22.y); - ImVec2 intersection = Intersection(P11,P21,P12,P22); + const ImVec2 intersection = intersect == 0 ? ImVec2(0,0) : Intersection(P11,P21,P12,P22); draw_list._VtxWritePtr[0].pos = P11; draw_list._VtxWritePtr[0].uv = UV; draw_list._VtxWritePtr[0].col = Col; @@ -1569,6 +1569,10 @@ void RenderMarkers(const _Getter& getter, ImPlotMarker marker, float size, bool template void PlotLineEx(const char* label_id, const _Getter& getter, ImPlotLineFlags flags) { if (BeginItemEx(label_id, Fitter1<_Getter>(getter), flags, ImPlotCol_Line)) { + if (getter.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); if (getter.Count > 1) { if (ImHasFlag(flags, ImPlotLineFlags_Shaded) && s.RenderFill) { @@ -1640,6 +1644,10 @@ void PlotLineG(const char* label_id, ImPlotGetter getter_func, void* data, int c template void PlotScatterEx(const char* label_id, const Getter& getter, ImPlotScatterFlags flags) { if (BeginItemEx(label_id, Fitter1(getter), flags, ImPlotCol_MarkerOutline)) { + if (getter.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); ImPlotMarker marker = s.Marker == ImPlotMarker_None ? ImPlotMarker_Circle: s.Marker; if (marker != ImPlotMarker_None) { @@ -1686,8 +1694,12 @@ void PlotScatterG(const char* label_id, ImPlotGetter getter_func, void* data, in template void PlotStairsEx(const char* label_id, const Getter& getter, ImPlotStairsFlags flags) { if (BeginItemEx(label_id, Fitter1(getter), flags, ImPlotCol_Line)) { + if (getter.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); - if (getter.Count > 1 ) { + if (getter.Count > 1) { if (s.RenderFill && ImHasFlag(flags,ImPlotStairsFlags_Shaded)) { const ImU32 col_fill = ImGui::GetColorU32(s.Colors[ImPlotCol_Fill]); if (ImHasFlag(flags, ImPlotStairsFlags_PreStep)) @@ -1746,6 +1758,10 @@ void PlotStairsG(const char* label_id, ImPlotGetter getter_func, void* data, int template void PlotShadedEx(const char* label_id, const Getter1& getter1, const Getter2& getter2, ImPlotShadedFlags flags) { if (BeginItemEx(label_id, Fitter2(getter1,getter2), flags, ImPlotCol_Fill)) { + if (getter1.Count <= 0 || getter2.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); if (s.RenderFill) { const ImU32 col = ImGui::GetColorU32(s.Colors[ImPlotCol_Fill]); @@ -1806,6 +1822,10 @@ void PlotShadedG(const char* label_id, ImPlotGetter getter_func1, void* data1, I template void PlotBarsVEx(const char* label_id, const Getter1& getter1, const Getter2 getter2, double width, ImPlotBarsFlags flags) { if (BeginItemEx(label_id, FitterBarV(getter1,getter2,width), flags, ImPlotCol_Fill)) { + if (getter1.Count <= 0 || getter2.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); const ImU32 col_fill = ImGui::GetColorU32(s.Colors[ImPlotCol_Fill]); const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_Line]); @@ -1826,6 +1846,10 @@ void PlotBarsVEx(const char* label_id, const Getter1& getter1, const Getter2 get template void PlotBarsHEx(const char* label_id, const Getter1& getter1, const Getter2& getter2, double height, ImPlotBarsFlags flags) { if (BeginItemEx(label_id, FitterBarH(getter1,getter2,height), flags, ImPlotCol_Fill)) { + if (getter1.Count <= 0 || getter2.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); const ImU32 col_fill = ImGui::GetColorU32(s.Colors[ImPlotCol_Fill]); const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_Line]); @@ -1982,6 +2006,10 @@ CALL_INSTANTIATE_FOR_NUMERIC_TYPES() template void PlotErrorBarsVEx(const char* label_id, const _GetterPos& getter_pos, const _GetterNeg& getter_neg, ImPlotErrorBarsFlags flags) { if (BeginItemEx(label_id, Fitter2<_GetterPos,_GetterNeg>(getter_pos, getter_neg), flags, IMPLOT_AUTO)) { + if (getter_pos.Count <= 0 || getter_neg.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); ImDrawList& draw_list = *GetPlotDrawList(); const ImU32 col = ImGui::GetColorU32(s.Colors[ImPlotCol_ErrorBar]); @@ -2003,6 +2031,10 @@ void PlotErrorBarsVEx(const char* label_id, const _GetterPos& getter_pos, const template void PlotErrorBarsHEx(const char* label_id, const _GetterPos& getter_pos, const _GetterNeg& getter_neg, ImPlotErrorBarsFlags flags) { if (BeginItemEx(label_id, Fitter2<_GetterPos,_GetterNeg>(getter_pos, getter_neg), flags, IMPLOT_AUTO)) { + if (getter_pos.Count <= 0 || getter_neg.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); ImDrawList& draw_list = *GetPlotDrawList(); const ImU32 col = ImGui::GetColorU32(s.Colors[ImPlotCol_ErrorBar]); @@ -2060,13 +2092,17 @@ CALL_INSTANTIATE_FOR_NUMERIC_TYPES() //----------------------------------------------------------------------------- template -void PlotStemsEx(const char* label_id, const _GetterM& get_mark, const _GetterB& get_base, ImPlotStemsFlags flags) { - if (BeginItemEx(label_id, Fitter2<_GetterM,_GetterB>(get_mark,get_base), flags, ImPlotCol_Line)) { +void PlotStemsEx(const char* label_id, const _GetterM& getter_mark, const _GetterB& getter_base, ImPlotStemsFlags flags) { + if (BeginItemEx(label_id, Fitter2<_GetterM,_GetterB>(getter_mark,getter_base), flags, ImPlotCol_Line)) { + if (getter_mark.Count <= 0 || getter_base.Count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); // render stems if (s.RenderLine) { const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_Line]); - RenderPrimitives2(get_mark, get_base, col_line, s.LineWeight); + RenderPrimitives2(getter_mark, getter_base, col_line, s.LineWeight); } // render markers if (s.Marker != ImPlotMarker_None) { @@ -2074,7 +2110,7 @@ void PlotStemsEx(const char* label_id, const _GetterM& get_mark, const _GetterB& PushPlotClipRect(s.MarkerSize); const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_MarkerOutline]); const ImU32 col_fill = ImGui::GetColorU32(s.Colors[ImPlotCol_MarkerFill]); - RenderMarkers<_GetterM>(get_mark, s.Marker, s.MarkerSize, s.RenderMarkerFill, col_fill, s.RenderMarkerLine, col_line, s.MarkerWeight); + RenderMarkers<_GetterM>(getter_mark, s.Marker, s.MarkerSize, s.RenderMarkerFill, col_fill, s.RenderMarkerLine, col_line, s.MarkerWeight); } EndItem(); } @@ -2123,13 +2159,17 @@ template void PlotInfLines(const char* label_id, const T* values, int count, ImPlotInfLinesFlags flags, int offset, int stride) { const ImPlotRect lims = GetPlotLimits(IMPLOT_AUTO,IMPLOT_AUTO); if (ImHasFlag(flags, ImPlotInfLinesFlags_Horizontal)) { - GetterXY> get_min(IndexerConst(lims.X.Min),IndexerIdx(values,count,offset,stride),count); - GetterXY> get_max(IndexerConst(lims.X.Max),IndexerIdx(values,count,offset,stride),count); - if (BeginItemEx(label_id, FitterY>>(get_min), flags, ImPlotCol_Line)) { + GetterXY> getter_min(IndexerConst(lims.X.Min),IndexerIdx(values,count,offset,stride),count); + GetterXY> getter_max(IndexerConst(lims.X.Max),IndexerIdx(values,count,offset,stride),count); + if (BeginItemEx(label_id, FitterY>>(getter_min), flags, ImPlotCol_Line)) { + if (count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_Line]); if (s.RenderLine) - RenderPrimitives2(get_min, get_max, col_line, s.LineWeight); + RenderPrimitives2(getter_min, getter_max, col_line, s.LineWeight); EndItem(); } } @@ -2137,6 +2177,10 @@ void PlotInfLines(const char* label_id, const T* values, int count, ImPlotInfLin GetterXY,IndexerConst> get_min(IndexerIdx(values,count,offset,stride),IndexerConst(lims.Y.Min),count); GetterXY,IndexerConst> get_max(IndexerIdx(values,count,offset,stride),IndexerConst(lims.Y.Max),count); if (BeginItemEx(label_id, FitterX,IndexerConst>>(get_min), flags, ImPlotCol_Line)) { + if (count <= 0) { + EndItem(); + return; + } const ImPlotNextItemData& s = GetItemData(); const ImU32 col_line = ImGui::GetColorU32(s.Colors[ImPlotCol_Line]); if (s.RenderLine) @@ -2172,57 +2216,121 @@ IMPLOT_INLINE void RenderPieSlice(ImDrawList& draw_list, const ImPlotPoint& cent } template -void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, ImPlotPieChartFlags flags) { - IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "PlotPieChart() needs to be called between BeginPlot() and EndPlot()!"); - ImDrawList & draw_list = *GetPlotDrawList(); +double PieChartSum(const T* values, int count, bool ignore_hidden) { double sum = 0; - for (int i = 0; i < count; ++i) - sum += (double)values[i]; - const bool normalize = ImHasFlag(flags,ImPlotPieChartFlags_Normalize) || sum > 1.0; - ImPlotPoint center(x,y); - PushPlotClipRect(); + if (ignore_hidden) { + ImPlotContext& gp = *GImPlot; + ImPlotItemGroup& Items = *gp.CurrentItems; + for (int i = 0; i < count; ++i) { + if (i >= Items.GetItemCount()) + break; + + ImPlotItem* item = Items.GetItemByIndex(i); + IM_ASSERT(item != nullptr); + if (item->Show) { + sum += (double)values[i]; + } + } + } + else { + for (int i = 0; i < count; ++i) { + sum += (double)values[i]; + } + } + return sum; +} + +template +void PlotPieChartEx(const char* const label_ids[], const T* values, int count, ImPlotPoint center, double radius, double angle0, ImPlotPieChartFlags flags) { + ImDrawList& draw_list = *GetPlotDrawList(); + + const bool ignore_hidden = ImHasFlag(flags, ImPlotPieChartFlags_IgnoreHidden); + const double sum = PieChartSum(values, count, ignore_hidden); + const bool normalize = ImHasFlag(flags, ImPlotPieChartFlags_Normalize) || sum > 1.0; + double a0 = angle0 * 2 * IM_PI / 360.0; double a1 = angle0 * 2 * IM_PI / 360.0; - ImPlotPoint Pmin = ImPlotPoint(x-radius,y-radius); - ImPlotPoint Pmax = ImPlotPoint(x+radius,y+radius); + ImPlotPoint Pmin = ImPlotPoint(center.x - radius, center.y - radius); + ImPlotPoint Pmax = ImPlotPoint(center.x + radius, center.y + radius); for (int i = 0; i < count; ++i) { - double percent = normalize ? (double)values[i] / sum : (double)values[i]; - a1 = a0 + 2 * IM_PI * percent; - if (BeginItemEx(label_ids[i], FitterRect(Pmin,Pmax))) { - ImU32 col = GetCurrentItem()->Color; - if (percent < 0.5) { - RenderPieSlice(draw_list, center, radius, a0, a1, col); - } - else { - RenderPieSlice(draw_list, center, radius, a0, a0 + (a1 - a0) * 0.5, col); - RenderPieSlice(draw_list, center, radius, a0 + (a1 - a0) * 0.5, a1, col); + ImPlotItem* item = GetItem(label_ids[i]); + + const double percent = normalize ? (double)values[i] / sum : (double)values[i]; + const bool skip = sum <= 0.0 || (ignore_hidden && item != nullptr && !item->Show); + if (!skip) + a1 = a0 + 2 * IM_PI * percent; + + if (BeginItemEx(label_ids[i], FitterRect(Pmin, Pmax))) { + if (sum > 0.0) { + ImU32 col = GetCurrentItem()->Color; + if (percent < 0.5) { + RenderPieSlice(draw_list, center, radius, a0, a1, col); + } + else { + RenderPieSlice(draw_list, center, radius, a0, a0 + (a1 - a0) * 0.5, col); + RenderPieSlice(draw_list, center, radius, a0 + (a1 - a0) * 0.5, a1, col); + } } EndItem(); } - a0 = a1; + if (!skip) + a0 = a1; } +} + +int PieChartFormatter(double value, char* buff, int size, void* data) { + const char* fmt = (const char*)data; + return snprintf(buff, size, fmt, value); +}; + +template +void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, ImPlotPieChartFlags flags) { + PlotPieChart(label_ids, values, count, x, y, radius, PieChartFormatter, (void*)fmt, angle0, flags); +} +#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, ImPlotPieChartFlags flags); +CALL_INSTANTIATE_FOR_NUMERIC_TYPES() +#undef INSTANTIATE_MACRO + +template +void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotPieChartFlags flags) { + IM_ASSERT_USER_ERROR(GImPlot->CurrentPlot != nullptr, "PlotPieChart() needs to be called between BeginPlot() and EndPlot()!"); + ImDrawList& draw_list = *GetPlotDrawList(); + + const bool ignore_hidden = ImHasFlag(flags, ImPlotPieChartFlags_IgnoreHidden); + const double sum = PieChartSum(values, count, ignore_hidden); + const bool normalize = ImHasFlag(flags, ImPlotPieChartFlags_Normalize) || sum > 1.0; + ImPlotPoint center(x, y); + + PushPlotClipRect(); + PlotPieChartEx(label_ids, values, count, center, radius, angle0, flags); if (fmt != nullptr) { - a0 = angle0 * 2 * IM_PI / 360.0; - a1 = angle0 * 2 * IM_PI / 360.0; + double a0 = angle0 * 2 * IM_PI / 360.0; + double a1 = angle0 * 2 * IM_PI / 360.0; char buffer[32]; for (int i = 0; i < count; ++i) { ImPlotItem* item = GetItem(label_ids[i]); - double percent = normalize ? (double)values[i] / sum : (double)values[i]; - a1 = a0 + 2 * IM_PI * percent; - if (item->Show) { - ImFormatString(buffer, 32, fmt, (double)values[i]); - ImVec2 size = ImGui::CalcTextSize(buffer); - double angle = a0 + (a1 - a0) * 0.5; - ImVec2 pos = PlotToPixels(center.x + 0.5 * radius * cos(angle), center.y + 0.5 * radius * sin(angle),IMPLOT_AUTO,IMPLOT_AUTO); - ImU32 col = CalcTextColor(ImGui::ColorConvertU32ToFloat4(item->Color)); - draw_list.AddText(pos - size * 0.5f, col, buffer); + IM_ASSERT(item != nullptr); + + const double percent = normalize ? (double)values[i] / sum : (double)values[i]; + const bool skip = ignore_hidden && item != nullptr && !item->Show; + + if (!skip) { + a1 = a0 + 2 * IM_PI * percent; + if (item->Show) { + fmt((double)values[i], buffer, 32, fmt_data); + ImVec2 size = ImGui::CalcTextSize(buffer); + double angle = a0 + (a1 - a0) * 0.5; + ImVec2 pos = PlotToPixels(center.x + 0.5 * radius * cos(angle), center.y + 0.5 * radius * sin(angle), IMPLOT_AUTO, IMPLOT_AUTO); + ImU32 col = CalcTextColor(ImGui::ColorConvertU32ToFloat4(item->Color)); + draw_list.AddText(pos - size * 0.5f, col, buffer); + } + a0 = a1; } - a0 = a1; } } PopPlotClipRect(); } -#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, const char* fmt, double angle0, ImPlotPieChartFlags flags); +#define INSTANTIATE_MACRO(T) template IMPLOT_API void PlotPieChart(const char* const label_ids[], const T* values, int count, double x, double y, double radius, ImPlotFormatter fmt, void* fmt_data, double angle0, ImPlotPieChartFlags flags); CALL_INSTANTIATE_FOR_NUMERIC_TYPES() #undef INSTANTIATE_MACRO @@ -2283,8 +2391,8 @@ struct GetterHeatmapColMaj { { } template IMPLOT_INLINE RectC operator()(I idx) const { double val = (double)Values[idx]; - const int r = idx % Cols; - const int c = idx / Cols; + const int r = idx % Rows; + const int c = idx / Rows; const ImPlotPoint p(XRef + HalfSize.x + c*Width, YRef + YDir * (HalfSize.y + r*Height)); RectC rect; rect.Pos = p; @@ -2375,6 +2483,10 @@ void RenderHeatmap(ImDrawList& draw_list, const T* values, int rows, int cols, d template void PlotHeatmap(const char* label_id, const T* values, int rows, int cols, double scale_min, double scale_max, const char* fmt, const ImPlotPoint& bounds_min, const ImPlotPoint& bounds_max, ImPlotHeatmapFlags flags) { if (BeginItemEx(label_id, FitterRect(bounds_min, bounds_max))) { + if (rows <= 0 || cols <= 0) { + EndItem(); + return; + } ImDrawList& draw_list = *GetPlotDrawList(); const bool col_maj = ImHasFlag(flags, ImPlotHeatmapFlags_ColMajor); RenderHeatmap(draw_list, values, rows, cols, scale_min, scale_max, fmt, bounds_min, bounds_max, true, col_maj); @@ -2539,6 +2651,10 @@ double PlotHistogram2D(const char* label_id, const T* xs, const T* ys, int count } if (BeginItemEx(label_id, FitterRect(range))) { + if (y_bins <= 0 || x_bins <= 0) { + EndItem(); + return max_count; + } ImDrawList& draw_list = *GetPlotDrawList(); RenderHeatmap(draw_list, &bin_counts.Data[0], y_bins, x_bins, 0, max_count, nullptr, range.Min(), range.Max(), false, col_maj); EndItem(); @@ -2597,8 +2713,8 @@ void PlotDigitalEx(const char* label_id, Getter getter, ImPlotDigitalFlags flags //do not extend plot outside plot range if (pMin.x < x_axis.PixelMin) pMin.x = x_axis.PixelMin; if (pMax.x < x_axis.PixelMin) pMax.x = x_axis.PixelMin; - if (pMin.x > x_axis.PixelMax) pMin.x = x_axis.PixelMax; - if (pMax.x > x_axis.PixelMax) pMax.x = x_axis.PixelMax; + if (pMin.x > x_axis.PixelMax) pMin.x = x_axis.PixelMax - 1; //fix issue related to https://github.com/ocornut/imgui/issues/3976 + if (pMax.x > x_axis.PixelMax) pMax.x = x_axis.PixelMax - 1; //fix issue related to https://github.com/ocornut/imgui/issues/3976 //plot a rectangle that extends up to x2 with y1 height if ((pMax.x > pMin.x) && (gp.CurrentPlot->PlotRect.Contains(pMin) || gp.CurrentPlot->PlotRect.Contains(pMax))) { // ImVec4 colAlpha = item->Color; diff --git a/core/deps/khronos/APPLE/egl.h b/core/deps/khronos/APPLE/egl.h deleted file mode 100644 index 2dbe218b4..000000000 --- a/core/deps/khronos/APPLE/egl.h +++ /dev/null @@ -1,329 +0,0 @@ -/* -*- mode: c; tab-width: 8; -*- */ -/* vi: set sw=4 ts=8: */ -/* Reference version of egl.h for EGL 1.4. - * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $ - */ - -/* -** Copyright (c) 2007-2009 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -#ifndef __egl_h_ -#define __egl_h_ - -/* All platform-dependent types and macro boilerplate (such as EGLAPI - * and EGLAPIENTRY) should go in eglplatform.h. - */ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* EGL Types */ -/* EGLint is defined in eglplatform.h */ -typedef unsigned int EGLBoolean; -typedef unsigned int EGLenum; -typedef void *EGLConfig; -typedef void *EGLContext; -typedef void *EGLDisplay; -typedef void *EGLSurface; -typedef void *EGLClientBuffer; - -/* EGL Versioning */ -#define EGL_VERSION_1_0 1 -#define EGL_VERSION_1_1 1 -#define EGL_VERSION_1_2 1 -#define EGL_VERSION_1_3 1 -#define EGL_VERSION_1_4 1 - -/* EGL Enumerants. Bitmasks and other exceptional cases aside, most - * enums are assigned unique values starting at 0x3000. - */ - -/* EGL aliases */ -#define EGL_FALSE 0 -#define EGL_TRUE 1 - -/* Out-of-band handle values */ -#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) -#define EGL_NO_CONTEXT ((EGLContext)0) -#define EGL_NO_DISPLAY ((EGLDisplay)0) -#define EGL_NO_SURFACE ((EGLSurface)0) - -/* Out-of-band attribute value */ -#define EGL_DONT_CARE ((EGLint)-1) - -/* Errors / GetError return values */ -#define EGL_SUCCESS 0x3000 -#define EGL_NOT_INITIALIZED 0x3001 -#define EGL_BAD_ACCESS 0x3002 -#define EGL_BAD_ALLOC 0x3003 -#define EGL_BAD_ATTRIBUTE 0x3004 -#define EGL_BAD_CONFIG 0x3005 -#define EGL_BAD_CONTEXT 0x3006 -#define EGL_BAD_CURRENT_SURFACE 0x3007 -#define EGL_BAD_DISPLAY 0x3008 -#define EGL_BAD_MATCH 0x3009 -#define EGL_BAD_NATIVE_PIXMAP 0x300A -#define EGL_BAD_NATIVE_WINDOW 0x300B -#define EGL_BAD_PARAMETER 0x300C -#define EGL_BAD_SURFACE 0x300D -#define EGL_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */ - -/* Reserved 0x300F-0x301F for additional errors */ - -/* Config attributes */ -#define EGL_BUFFER_SIZE 0x3020 -#define EGL_ALPHA_SIZE 0x3021 -#define EGL_BLUE_SIZE 0x3022 -#define EGL_GREEN_SIZE 0x3023 -#define EGL_RED_SIZE 0x3024 -#define EGL_DEPTH_SIZE 0x3025 -#define EGL_STENCIL_SIZE 0x3026 -#define EGL_CONFIG_CAVEAT 0x3027 -#define EGL_CONFIG_ID 0x3028 -#define EGL_LEVEL 0x3029 -#define EGL_MAX_PBUFFER_HEIGHT 0x302A -#define EGL_MAX_PBUFFER_PIXELS 0x302B -#define EGL_MAX_PBUFFER_WIDTH 0x302C -#define EGL_NATIVE_RENDERABLE 0x302D -#define EGL_NATIVE_VISUAL_ID 0x302E -#define EGL_NATIVE_VISUAL_TYPE 0x302F -#define EGL_SAMPLES 0x3031 -#define EGL_SAMPLE_BUFFERS 0x3032 -#define EGL_SURFACE_TYPE 0x3033 -#define EGL_TRANSPARENT_TYPE 0x3034 -#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 -#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 -#define EGL_TRANSPARENT_RED_VALUE 0x3037 -#define EGL_NONE 0x3038 /* Attrib list terminator */ -#define EGL_BIND_TO_TEXTURE_RGB 0x3039 -#define EGL_BIND_TO_TEXTURE_RGBA 0x303A -#define EGL_MIN_SWAP_INTERVAL 0x303B -#define EGL_MAX_SWAP_INTERVAL 0x303C -#define EGL_LUMINANCE_SIZE 0x303D -#define EGL_ALPHA_MASK_SIZE 0x303E -#define EGL_COLOR_BUFFER_TYPE 0x303F -#define EGL_RENDERABLE_TYPE 0x3040 -#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */ -#define EGL_CONFORMANT 0x3042 - -/* Reserved 0x3041-0x304F for additional config attributes */ - -/* Config attribute values */ -#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */ -#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */ -#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */ -#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */ -#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */ - -/* More config attribute values, for EGL_TEXTURE_FORMAT */ -#define EGL_NO_TEXTURE 0x305C -#define EGL_TEXTURE_RGB 0x305D -#define EGL_TEXTURE_RGBA 0x305E -#define EGL_TEXTURE_2D 0x305F - -/* Config attribute mask bits */ -#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */ -#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */ - -#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */ -#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */ -#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */ -#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */ - -/* QueryString targets */ -#define EGL_VENDOR 0x3053 -#define EGL_VERSION 0x3054 -#define EGL_EXTENSIONS 0x3055 -#define EGL_CLIENT_APIS 0x308D - -/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */ -#define EGL_HEIGHT 0x3056 -#define EGL_WIDTH 0x3057 -#define EGL_LARGEST_PBUFFER 0x3058 -#define EGL_TEXTURE_FORMAT 0x3080 -#define EGL_TEXTURE_TARGET 0x3081 -#define EGL_MIPMAP_TEXTURE 0x3082 -#define EGL_MIPMAP_LEVEL 0x3083 -#define EGL_RENDER_BUFFER 0x3086 -#define EGL_VG_COLORSPACE 0x3087 -#define EGL_VG_ALPHA_FORMAT 0x3088 -#define EGL_HORIZONTAL_RESOLUTION 0x3090 -#define EGL_VERTICAL_RESOLUTION 0x3091 -#define EGL_PIXEL_ASPECT_RATIO 0x3092 -#define EGL_SWAP_BEHAVIOR 0x3093 -#define EGL_MULTISAMPLE_RESOLVE 0x3099 - -/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */ -#define EGL_BACK_BUFFER 0x3084 -#define EGL_SINGLE_BUFFER 0x3085 - -/* OpenVG color spaces */ -#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */ -#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */ - -/* OpenVG alpha formats */ -#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */ -#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */ - -/* Constant scale factor by which fractional display resolutions & - * aspect ratio are scaled when queried as integer values. - */ -#define EGL_DISPLAY_SCALING 10000 - -/* Unknown display resolution/aspect ratio */ -#define EGL_UNKNOWN ((EGLint)-1) - -/* Back buffer swap behaviors */ -#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */ -#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */ - -/* CreatePbufferFromClientBuffer buffer types */ -#define EGL_OPENVG_IMAGE 0x3096 - -/* QueryContext targets */ -#define EGL_CONTEXT_CLIENT_TYPE 0x3097 - -/* CreateContext attributes */ -#define EGL_CONTEXT_CLIENT_VERSION 0x3098 - -/* Multisample resolution behaviors */ -#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */ -#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */ - -/* BindAPI/QueryAPI targets */ -#define EGL_OPENGL_ES_API 0x30A0 -#define EGL_OPENVG_API 0x30A1 -#define EGL_OPENGL_API 0x30A2 - -/* GetCurrentSurface targets */ -#define EGL_DRAW 0x3059 -#define EGL_READ 0x305A - -/* WaitNative engines */ -#define EGL_CORE_NATIVE_ENGINE 0x305B - -/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */ -#define EGL_COLORSPACE EGL_VG_COLORSPACE -#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT -#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB -#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR -#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE -#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE - -/* EGL extensions must request enum blocks from the Khronos - * API Registrar, who maintains the enumerant registry. Submit - * a bug in Khronos Bugzilla against task "Registry". - */ - - - -/* EGL Functions */ - -EGLAPI EGLint EGLAPIENTRY eglGetError(void); - -EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id); -EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor); -EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy); - -EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name); - -EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, - EGLint config_size, EGLint *num_config); -EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, - EGLConfig *configs, EGLint config_size, - EGLint *num_config); -EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, - EGLint attribute, EGLint *value); - -EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, - EGLNativeWindowType win, - const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, - const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, - EGLNativePixmapType pixmap, - const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface); -EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, - EGLint attribute, EGLint *value); - -EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api); -EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void); - -EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void); - -EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void); - -EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer( - EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, - EGLConfig config, const EGLint *attrib_list); - -EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, - EGLint attribute, EGLint value); -EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); -EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); - - -EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval); - - -EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, - EGLContext share_context, - const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx); -EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, - EGLSurface read, EGLContext ctx); - -EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void); -EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw); -EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, - EGLint attribute, EGLint *value); - -EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void); -EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine); -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface); -EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, - EGLNativePixmapType target); - -/* This is a generic function pointer type, whose name indicates it must - * be cast to the proper type *and calling convention* before use. - */ -typedef void (*__eglMustCastToProperFunctionPointerType)(void); - -/* Now, define eglGetProcAddress using the generic function ptr. type */ -EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY - eglGetProcAddress(const char *procname); - -#ifdef __cplusplus -} -#endif - -#endif /* __egl_h_ */ diff --git a/core/deps/khronos/APPLE/eglplatform.h b/core/deps/khronos/APPLE/eglplatform.h deleted file mode 100644 index 7eca9a427..000000000 --- a/core/deps/khronos/APPLE/eglplatform.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef __eglplatform_h_ -#define __eglplatform_h_ - -/* -** Copyright (c) 2007-2009 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Platform-specific types and definitions for egl.h - * $Revision: 12306 $ on $Date: 2010-08-25 09:51:28 -0700 (Wed, 25 Aug 2010) $ - * - * Adopters may modify khrplatform.h and this file to suit their platform. - * You are encouraged to submit all modifications to the Khronos group so that - * they can be included in future versions of this file. Please submit changes - * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) - * by filing a bug against product "EGL" component "Registry". - */ - -#include - -/* Macros used in EGL function prototype declarations. - * - * EGL functions should be prototyped as: - * - * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); - * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); - * - * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h - */ - -#ifndef EGLAPI -#define EGLAPI KHRONOS_APICALL -#endif - -#ifndef EGLAPIENTRY -#define EGLAPIENTRY KHRONOS_APIENTRY -#endif -#define EGLAPIENTRYP EGLAPIENTRY* - -/* The types NativeDisplayType, NativeWindowType, and NativePixmapType - * are aliases of window-system-dependent types, such as X Display * or - * Windows Device Context. They must be defined in platform-specific - * code below. The EGL-prefixed versions of Native*Type are the same - * types, renamed in EGL 1.3 so all types in the API start with "EGL". - * - * Khronos STRONGLY RECOMMENDS that you use the default definitions - * provided below, since these changes affect both binary and source - * portability of applications using EGL running on different EGL - * implementations. - */ - -#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#include - -typedef HDC EGLNativeDisplayType; -typedef HBITMAP EGLNativePixmapType; -typedef HWND EGLNativeWindowType; - -#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ - -typedef int EGLNativeDisplayType; -typedef void *EGLNativeWindowType; -typedef void *EGLNativePixmapType; - -#elif defined(__unix__) - -/* X11 (tentative) */ -#include -#include - -typedef Display *EGLNativeDisplayType; -typedef Pixmap EGLNativePixmapType; -typedef Window EGLNativeWindowType; - -#elif defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) ) - // this line is taken from the TargetConditionals.h file in any on the iOS or Mac OS X platforms - -struct appleEGLWindow; - -typedef int EGLNativeDisplayType; -typedef void *EGLNativePixmapType; -typedef struct appleEGLWindow *EGLNativeWindowType; - -#else -#error "Platform not recognized" -#endif - -/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ -typedef EGLNativeDisplayType NativeDisplayType; -typedef EGLNativePixmapType NativePixmapType; -typedef EGLNativeWindowType NativeWindowType; - - -/* Define EGLint. This must be a signed integral type large enough to contain - * all legal attribute names and values passed into and out of EGL, whether - * their type is boolean, bitmask, enumerant (symbolic constant), integer, - * handle, or other. While in general a 32-bit integer will suffice, if - * handles are 64 bit types, then EGLint should be defined as a signed 64-bit - * integer type. - */ -typedef khronos_int32_t EGLint; - -#endif /* __eglplatform_h */ diff --git a/core/deps/khronos/APPLE/khrplatform.h b/core/deps/khronos/APPLE/khrplatform.h deleted file mode 100644 index 8ec0d199f..000000000 --- a/core/deps/khronos/APPLE/khrplatform.h +++ /dev/null @@ -1,269 +0,0 @@ -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2009 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. - * - * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $ - * - * Adopters may modify this file to suit their platform. Adopters are - * encouraged to submit platform specific modifications to the Khronos - * group so that they can be included in future versions of this file. - * Please submit changes by sending them to the public Khronos Bugzilla - * (http://khronos.org/bugzilla) by filing a bug against product - * "Khronos (general)" component "Registry". - * - * A predefined template which fills in some of the bug fields can be - * reached using http://tinyurl.com/khrplatform-h-bugreport, but you - * must create a Bugzilla login first. - * - * - * See the Implementer's Guidelines for information about where this file - * should be located on your system and for more details of its use: - * http://www.khronos.org/registry/implementers_guide.pdf - * - * This file should be included as - * #include - * by Khronos client API header files that use its types and defines. - * - * The types in khrplatform.h should only be used to define API-specific types. - * - * Types defined in khrplatform.h: - * khronos_int8_t signed 8 bit - * khronos_uint8_t unsigned 8 bit - * khronos_int16_t signed 16 bit - * khronos_uint16_t unsigned 16 bit - * khronos_int32_t signed 32 bit - * khronos_uint32_t unsigned 32 bit - * khronos_int64_t signed 64 bit - * khronos_uint64_t unsigned 64 bit - * khronos_intptr_t signed same number of bits as a pointer - * khronos_uintptr_t unsigned same number of bits as a pointer - * khronos_ssize_t signed size - * khronos_usize_t unsigned size - * khronos_float_t signed 32 bit floating point - * khronos_time_ns_t unsigned 64 bit time in nanoseconds - * khronos_utime_nanoseconds_t unsigned time interval or absolute time in - * nanoseconds - * khronos_stime_nanoseconds_t signed time interval in nanoseconds - * khronos_boolean_enum_t enumerated boolean type. This should - * only be used as a base type when a client API's boolean type is - * an enum. Client APIs which use an integer or other type for - * booleans cannot use this as the base type for their boolean. - * - * Tokens defined in khrplatform.h: - * - * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. - * - * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. - * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. - * - * Calling convention macros defined in this file: - * KHRONOS_APICALL - * KHRONOS_APIENTRY - * KHRONOS_APIATTRIBUTES - * - * These may be used in function prototypes as: - * - * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( - * int arg1, - * int arg2) KHRONOS_APIATTRIBUTES; - */ - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIENTRY - *------------------------------------------------------------------------- - * This follows the return type of the function and precedes the function - * name in the function prototype. - */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) - /* Win32 but not WinCE */ -# define KHRONOS_APIENTRY __stdcall -#else -# define KHRONOS_APIENTRY -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIATTRIBUTES - *------------------------------------------------------------------------- - * This follows the closing parenthesis of the function prototype arguments. - */ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- - * basic type definitions - *-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__VMS ) || defined(__sgi) - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* - * Win32 - */ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* - * Sun or Digital - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* - * Hypothetical platform with no float or int64 support - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* - * Generic fallback - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* - * Types that are (so far) the same on all platforms - */ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; - -#if KHRONOS_SUPPORT_FLOAT -/* - * Float type - */ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types - * - * These types can be used to represent a time interval in nanoseconds or - * an absolute Unadjusted System Time. Unadjusted System Time is the number - * of nanoseconds since some arbitrary system event (e.g. since the last - * time the system booted). The Unadjusted System Time is an unsigned - * 64 bit value that wraps back to 0 every 584 years. Time intervals - * may be either signed or unsigned. - */ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* - * Dummy value used to pad enum types to 32 bits. - */ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* - * Enumerated boolean type - * - * Values other than zero should be considered to be true. Therefore - * comparisons should not be made against KHRONOS_TRUE. - */ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM -} khronos_boolean_enum_t; - -#endif /* __khrplatform_h_ */ diff --git a/core/deps/khronos/EGL/egl.h b/core/deps/khronos/EGL/egl.h deleted file mode 100644 index fd835d909..000000000 --- a/core/deps/khronos/EGL/egl.h +++ /dev/null @@ -1,342 +0,0 @@ -#ifndef __egl_h_ -#define __egl_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright 2013-2020 The Khronos Group Inc. -** SPDX-License-Identifier: Apache-2.0 -** -** This header is generated from the Khronos EGL XML API Registry. -** The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** http://www.khronos.org/registry/egl -** -** Khronos $Git commit SHA1: 5a9a7e3fcb $ on $Git commit date: 2020-08-24 11:05:32 -0700 $ -*/ - -#include - -#ifndef EGL_EGL_PROTOTYPES -#define EGL_EGL_PROTOTYPES 1 -#endif - -/* Generated on date 20201001 */ - -/* Generated C header for: - * API: egl - * Versions considered: .* - * Versions emitted: .* - * Default extensions included: None - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef EGL_VERSION_1_0 -#define EGL_VERSION_1_0 1 -typedef unsigned int EGLBoolean; -typedef void *EGLDisplay; -#include -#include -typedef void *EGLConfig; -typedef void *EGLSurface; -typedef void *EGLContext; -typedef void (*__eglMustCastToProperFunctionPointerType)(void); -#define EGL_ALPHA_SIZE 0x3021 -#define EGL_BAD_ACCESS 0x3002 -#define EGL_BAD_ALLOC 0x3003 -#define EGL_BAD_ATTRIBUTE 0x3004 -#define EGL_BAD_CONFIG 0x3005 -#define EGL_BAD_CONTEXT 0x3006 -#define EGL_BAD_CURRENT_SURFACE 0x3007 -#define EGL_BAD_DISPLAY 0x3008 -#define EGL_BAD_MATCH 0x3009 -#define EGL_BAD_NATIVE_PIXMAP 0x300A -#define EGL_BAD_NATIVE_WINDOW 0x300B -#define EGL_BAD_PARAMETER 0x300C -#define EGL_BAD_SURFACE 0x300D -#define EGL_BLUE_SIZE 0x3022 -#define EGL_BUFFER_SIZE 0x3020 -#define EGL_CONFIG_CAVEAT 0x3027 -#define EGL_CONFIG_ID 0x3028 -#define EGL_CORE_NATIVE_ENGINE 0x305B -#define EGL_DEPTH_SIZE 0x3025 -#define EGL_DONT_CARE EGL_CAST(EGLint,-1) -#define EGL_DRAW 0x3059 -#define EGL_EXTENSIONS 0x3055 -#define EGL_FALSE 0 -#define EGL_GREEN_SIZE 0x3023 -#define EGL_HEIGHT 0x3056 -#define EGL_LARGEST_PBUFFER 0x3058 -#define EGL_LEVEL 0x3029 -#define EGL_MAX_PBUFFER_HEIGHT 0x302A -#define EGL_MAX_PBUFFER_PIXELS 0x302B -#define EGL_MAX_PBUFFER_WIDTH 0x302C -#define EGL_NATIVE_RENDERABLE 0x302D -#define EGL_NATIVE_VISUAL_ID 0x302E -#define EGL_NATIVE_VISUAL_TYPE 0x302F -#define EGL_NONE 0x3038 -#define EGL_NON_CONFORMANT_CONFIG 0x3051 -#define EGL_NOT_INITIALIZED 0x3001 -#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) -#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) -#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) -#define EGL_PBUFFER_BIT 0x0001 -#define EGL_PIXMAP_BIT 0x0002 -#define EGL_READ 0x305A -#define EGL_RED_SIZE 0x3024 -#define EGL_SAMPLES 0x3031 -#define EGL_SAMPLE_BUFFERS 0x3032 -#define EGL_SLOW_CONFIG 0x3050 -#define EGL_STENCIL_SIZE 0x3026 -#define EGL_SUCCESS 0x3000 -#define EGL_SURFACE_TYPE 0x3033 -#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 -#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 -#define EGL_TRANSPARENT_RED_VALUE 0x3037 -#define EGL_TRANSPARENT_RGB 0x3052 -#define EGL_TRANSPARENT_TYPE 0x3034 -#define EGL_TRUE 1 -#define EGL_VENDOR 0x3053 -#define EGL_VERSION 0x3054 -#define EGL_WIDTH 0x3057 -#define EGL_WINDOW_BIT 0x0004 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); -typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); -typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void); -typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); -typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); -typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void); -typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); -typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine); -#if EGL_EGL_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); -EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); -EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface); -EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); -EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); -EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void); -EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw); -EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id); -EGLAPI EGLint EGLAPIENTRY eglGetError (void); -EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); -EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor); -EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); -EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name); -EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface); -EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy); -EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void); -EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); -#endif -#endif /* EGL_VERSION_1_0 */ - -#ifndef EGL_VERSION_1_1 -#define EGL_VERSION_1_1 1 -#define EGL_BACK_BUFFER 0x3084 -#define EGL_BIND_TO_TEXTURE_RGB 0x3039 -#define EGL_BIND_TO_TEXTURE_RGBA 0x303A -#define EGL_CONTEXT_LOST 0x300E -#define EGL_MIN_SWAP_INTERVAL 0x303B -#define EGL_MAX_SWAP_INTERVAL 0x303C -#define EGL_MIPMAP_TEXTURE 0x3082 -#define EGL_MIPMAP_LEVEL 0x3083 -#define EGL_NO_TEXTURE 0x305C -#define EGL_TEXTURE_2D 0x305F -#define EGL_TEXTURE_FORMAT 0x3080 -#define EGL_TEXTURE_RGB 0x305D -#define EGL_TEXTURE_RGBA 0x305E -#define EGL_TEXTURE_TARGET 0x3081 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); -#if EGL_EGL_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); -EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); -EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval); -#endif -#endif /* EGL_VERSION_1_1 */ - -#ifndef EGL_VERSION_1_2 -#define EGL_VERSION_1_2 1 -typedef unsigned int EGLenum; -typedef void *EGLClientBuffer; -#define EGL_ALPHA_FORMAT 0x3088 -#define EGL_ALPHA_FORMAT_NONPRE 0x308B -#define EGL_ALPHA_FORMAT_PRE 0x308C -#define EGL_ALPHA_MASK_SIZE 0x303E -#define EGL_BUFFER_PRESERVED 0x3094 -#define EGL_BUFFER_DESTROYED 0x3095 -#define EGL_CLIENT_APIS 0x308D -#define EGL_COLORSPACE 0x3087 -#define EGL_COLORSPACE_sRGB 0x3089 -#define EGL_COLORSPACE_LINEAR 0x308A -#define EGL_COLOR_BUFFER_TYPE 0x303F -#define EGL_CONTEXT_CLIENT_TYPE 0x3097 -#define EGL_DISPLAY_SCALING 10000 -#define EGL_HORIZONTAL_RESOLUTION 0x3090 -#define EGL_LUMINANCE_BUFFER 0x308F -#define EGL_LUMINANCE_SIZE 0x303D -#define EGL_OPENGL_ES_BIT 0x0001 -#define EGL_OPENVG_BIT 0x0002 -#define EGL_OPENGL_ES_API 0x30A0 -#define EGL_OPENVG_API 0x30A1 -#define EGL_OPENVG_IMAGE 0x3096 -#define EGL_PIXEL_ASPECT_RATIO 0x3092 -#define EGL_RENDERABLE_TYPE 0x3040 -#define EGL_RENDER_BUFFER 0x3086 -#define EGL_RGB_BUFFER 0x308E -#define EGL_SINGLE_BUFFER 0x3085 -#define EGL_SWAP_BEHAVIOR 0x3093 -#define EGL_UNKNOWN EGL_CAST(EGLint,-1) -#define EGL_VERTICAL_RESOLUTION 0x3091 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api); -typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void); -#if EGL_EGL_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api); -EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void); -EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); -#endif -#endif /* EGL_VERSION_1_2 */ - -#ifndef EGL_VERSION_1_3 -#define EGL_VERSION_1_3 1 -#define EGL_CONFORMANT 0x3042 -#define EGL_CONTEXT_CLIENT_VERSION 0x3098 -#define EGL_MATCH_NATIVE_PIXMAP 0x3041 -#define EGL_OPENGL_ES2_BIT 0x0004 -#define EGL_VG_ALPHA_FORMAT 0x3088 -#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B -#define EGL_VG_ALPHA_FORMAT_PRE 0x308C -#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 -#define EGL_VG_COLORSPACE 0x3087 -#define EGL_VG_COLORSPACE_sRGB 0x3089 -#define EGL_VG_COLORSPACE_LINEAR 0x308A -#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 -#endif /* EGL_VERSION_1_3 */ - -#ifndef EGL_VERSION_1_4 -#define EGL_VERSION_1_4 1 -#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) -#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 -#define EGL_MULTISAMPLE_RESOLVE 0x3099 -#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A -#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B -#define EGL_OPENGL_API 0x30A2 -#define EGL_OPENGL_BIT 0x0008 -#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 -typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void); -#if EGL_EGL_PROTOTYPES -EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void); -#endif -#endif /* EGL_VERSION_1_4 */ - -#ifndef EGL_VERSION_1_5 -#define EGL_VERSION_1_5 1 -typedef void *EGLSync; -typedef intptr_t EGLAttrib; -typedef khronos_utime_nanoseconds_t EGLTime; -typedef void *EGLImage; -#define EGL_CONTEXT_MAJOR_VERSION 0x3098 -#define EGL_CONTEXT_MINOR_VERSION 0x30FB -#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD -#define EGL_NO_RESET_NOTIFICATION 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF -#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 -#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 -#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 -#define EGL_OPENGL_ES3_BIT 0x00000040 -#define EGL_CL_EVENT_HANDLE 0x309C -#define EGL_SYNC_CL_EVENT 0x30FE -#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 -#define EGL_SYNC_TYPE 0x30F7 -#define EGL_SYNC_STATUS 0x30F1 -#define EGL_SYNC_CONDITION 0x30F8 -#define EGL_SIGNALED 0x30F2 -#define EGL_UNSIGNALED 0x30F3 -#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 -#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull -#define EGL_TIMEOUT_EXPIRED 0x30F5 -#define EGL_CONDITION_SATISFIED 0x30F6 -#define EGL_NO_SYNC EGL_CAST(EGLSync,0) -#define EGL_SYNC_FENCE 0x30F9 -#define EGL_GL_COLORSPACE 0x309D -#define EGL_GL_COLORSPACE_SRGB 0x3089 -#define EGL_GL_COLORSPACE_LINEAR 0x308A -#define EGL_GL_RENDERBUFFER 0x30B9 -#define EGL_GL_TEXTURE_2D 0x30B1 -#define EGL_GL_TEXTURE_LEVEL 0x30BC -#define EGL_GL_TEXTURE_3D 0x30B2 -#define EGL_GL_TEXTURE_ZOFFSET 0x30BD -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 -#define EGL_IMAGE_PRESERVED 0x30D2 -#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) -typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); -typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); -typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); -typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); -#if EGL_EGL_PROTOTYPES -EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync); -EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); -EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); -EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image); -EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags); -#endif -#endif /* EGL_VERSION_1_5 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/EGL/eglext.h b/core/deps/khronos/EGL/eglext.h deleted file mode 100644 index c8df7f1e1..000000000 --- a/core/deps/khronos/EGL/eglext.h +++ /dev/null @@ -1,1419 +0,0 @@ -#ifndef __eglext_h_ -#define __eglext_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright 2013-2020 The Khronos Group Inc. -** SPDX-License-Identifier: Apache-2.0 -** -** This header is generated from the Khronos EGL XML API Registry. -** The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** http://www.khronos.org/registry/egl -** -** Khronos $Git commit SHA1: 5a9a7e3fcb $ on $Git commit date: 2020-08-24 11:05:32 -0700 $ -*/ - -#include - -#define EGL_EGLEXT_VERSION 20201001 - -/* Generated C header for: - * API: egl - * Versions considered: .* - * Versions emitted: _nomatch_^ - * Default extensions included: egl - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef EGL_KHR_cl_event -#define EGL_KHR_cl_event 1 -#define EGL_CL_EVENT_HANDLE_KHR 0x309C -#define EGL_SYNC_CL_EVENT_KHR 0x30FE -#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF -#endif /* EGL_KHR_cl_event */ - -#ifndef EGL_KHR_cl_event2 -#define EGL_KHR_cl_event2 1 -typedef void *EGLSyncKHR; -typedef intptr_t EGLAttribKHR; -typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); -#endif -#endif /* EGL_KHR_cl_event2 */ - -#ifndef EGL_KHR_client_get_all_proc_addresses -#define EGL_KHR_client_get_all_proc_addresses 1 -#endif /* EGL_KHR_client_get_all_proc_addresses */ - -#ifndef EGL_KHR_config_attribs -#define EGL_KHR_config_attribs 1 -#define EGL_CONFORMANT_KHR 0x3042 -#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 -#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 -#endif /* EGL_KHR_config_attribs */ - -#ifndef EGL_KHR_context_flush_control -#define EGL_KHR_context_flush_control 1 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 -#endif /* EGL_KHR_context_flush_control */ - -#ifndef EGL_KHR_create_context -#define EGL_KHR_create_context 1 -#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 -#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB -#define EGL_CONTEXT_FLAGS_KHR 0x30FC -#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD -#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF -#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 -#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 -#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 -#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 -#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 -#endif /* EGL_KHR_create_context */ - -#ifndef EGL_KHR_create_context_no_error -#define EGL_KHR_create_context_no_error 1 -#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 -#endif /* EGL_KHR_create_context_no_error */ - -#ifndef EGL_KHR_debug -#define EGL_KHR_debug 1 -typedef void *EGLLabelKHR; -typedef void *EGLObjectKHR; -typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); -#define EGL_OBJECT_THREAD_KHR 0x33B0 -#define EGL_OBJECT_DISPLAY_KHR 0x33B1 -#define EGL_OBJECT_CONTEXT_KHR 0x33B2 -#define EGL_OBJECT_SURFACE_KHR 0x33B3 -#define EGL_OBJECT_IMAGE_KHR 0x33B4 -#define EGL_OBJECT_SYNC_KHR 0x33B5 -#define EGL_OBJECT_STREAM_KHR 0x33B6 -#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 -#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA -#define EGL_DEBUG_MSG_WARN_KHR 0x33BB -#define EGL_DEBUG_MSG_INFO_KHR 0x33BC -#define EGL_DEBUG_CALLBACK_KHR 0x33B8 -typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value); -typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLint EGLAPIENTRY eglDebugMessageControlKHR (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDebugKHR (EGLint attribute, EGLAttrib *value); -EGLAPI EGLint EGLAPIENTRY eglLabelObjectKHR (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); -#endif -#endif /* EGL_KHR_debug */ - -#ifndef EGL_KHR_display_reference -#define EGL_KHR_display_reference 1 -#define EGL_TRACK_REFERENCES_KHR 0x3352 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC) (EGLDisplay dpy, EGLint name, EGLAttrib *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribKHR (EGLDisplay dpy, EGLint name, EGLAttrib *value); -#endif -#endif /* EGL_KHR_display_reference */ - -#ifndef EGL_KHR_fence_sync -#define EGL_KHR_fence_sync 1 -typedef khronos_utime_nanoseconds_t EGLTimeKHR; -#ifdef KHRONOS_SUPPORT_INT64 -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 -#define EGL_SYNC_CONDITION_KHR 0x30F8 -#define EGL_SYNC_FENCE_KHR 0x30F9 -typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); -typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync); -EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); -EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_KHR_fence_sync */ - -#ifndef EGL_KHR_get_all_proc_addresses -#define EGL_KHR_get_all_proc_addresses 1 -#endif /* EGL_KHR_get_all_proc_addresses */ - -#ifndef EGL_KHR_gl_colorspace -#define EGL_KHR_gl_colorspace 1 -#define EGL_GL_COLORSPACE_KHR 0x309D -#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 -#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A -#endif /* EGL_KHR_gl_colorspace */ - -#ifndef EGL_KHR_gl_renderbuffer_image -#define EGL_KHR_gl_renderbuffer_image 1 -#define EGL_GL_RENDERBUFFER_KHR 0x30B9 -#endif /* EGL_KHR_gl_renderbuffer_image */ - -#ifndef EGL_KHR_gl_texture_2D_image -#define EGL_KHR_gl_texture_2D_image 1 -#define EGL_GL_TEXTURE_2D_KHR 0x30B1 -#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC -#endif /* EGL_KHR_gl_texture_2D_image */ - -#ifndef EGL_KHR_gl_texture_3D_image -#define EGL_KHR_gl_texture_3D_image 1 -#define EGL_GL_TEXTURE_3D_KHR 0x30B2 -#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD -#endif /* EGL_KHR_gl_texture_3D_image */ - -#ifndef EGL_KHR_gl_texture_cubemap_image -#define EGL_KHR_gl_texture_cubemap_image 1 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 -#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 -#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 -#endif /* EGL_KHR_gl_texture_cubemap_image */ - -#ifndef EGL_KHR_image -#define EGL_KHR_image 1 -typedef void *EGLImageKHR; -#define EGL_NATIVE_PIXMAP_KHR 0x30B0 -#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0) -typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); -#endif -#endif /* EGL_KHR_image */ - -#ifndef EGL_KHR_image_base -#define EGL_KHR_image_base 1 -#define EGL_IMAGE_PRESERVED_KHR 0x30D2 -#endif /* EGL_KHR_image_base */ - -#ifndef EGL_KHR_image_pixmap -#define EGL_KHR_image_pixmap 1 -#endif /* EGL_KHR_image_pixmap */ - -#ifndef EGL_KHR_lock_surface -#define EGL_KHR_lock_surface 1 -#define EGL_READ_SURFACE_BIT_KHR 0x0001 -#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 -#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 -#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 -#define EGL_MATCH_FORMAT_KHR 0x3043 -#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 -#define EGL_FORMAT_RGB_565_KHR 0x30C1 -#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 -#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 -#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 -#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 -#define EGL_BITMAP_POINTER_KHR 0x30C6 -#define EGL_BITMAP_PITCH_KHR 0x30C7 -#define EGL_BITMAP_ORIGIN_KHR 0x30C8 -#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 -#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA -#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB -#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC -#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD -#define EGL_LOWER_LEFT_KHR 0x30CE -#define EGL_UPPER_LEFT_KHR 0x30CF -typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface); -#endif -#endif /* EGL_KHR_lock_surface */ - -#ifndef EGL_KHR_lock_surface2 -#define EGL_KHR_lock_surface2 1 -#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 -#endif /* EGL_KHR_lock_surface2 */ - -#ifndef EGL_KHR_lock_surface3 -#define EGL_KHR_lock_surface3 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); -#endif -#endif /* EGL_KHR_lock_surface3 */ - -#ifndef EGL_KHR_mutable_render_buffer -#define EGL_KHR_mutable_render_buffer 1 -#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 -#endif /* EGL_KHR_mutable_render_buffer */ - -#ifndef EGL_KHR_no_config_context -#define EGL_KHR_no_config_context 1 -#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0) -#endif /* EGL_KHR_no_config_context */ - -#ifndef EGL_KHR_partial_update -#define EGL_KHR_partial_update 1 -#define EGL_BUFFER_AGE_KHR 0x313D -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); -#endif -#endif /* EGL_KHR_partial_update */ - -#ifndef EGL_KHR_platform_android -#define EGL_KHR_platform_android 1 -#define EGL_PLATFORM_ANDROID_KHR 0x3141 -#endif /* EGL_KHR_platform_android */ - -#ifndef EGL_KHR_platform_gbm -#define EGL_KHR_platform_gbm 1 -#define EGL_PLATFORM_GBM_KHR 0x31D7 -#endif /* EGL_KHR_platform_gbm */ - -#ifndef EGL_KHR_platform_wayland -#define EGL_KHR_platform_wayland 1 -#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 -#endif /* EGL_KHR_platform_wayland */ - -#ifndef EGL_KHR_platform_x11 -#define EGL_KHR_platform_x11 1 -#define EGL_PLATFORM_X11_KHR 0x31D5 -#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 -#endif /* EGL_KHR_platform_x11 */ - -#ifndef EGL_KHR_reusable_sync -#define EGL_KHR_reusable_sync 1 -#ifdef KHRONOS_SUPPORT_INT64 -#define EGL_SYNC_STATUS_KHR 0x30F1 -#define EGL_SIGNALED_KHR 0x30F2 -#define EGL_UNSIGNALED_KHR 0x30F3 -#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 -#define EGL_CONDITION_SATISFIED_KHR 0x30F6 -#define EGL_SYNC_TYPE_KHR 0x30F7 -#define EGL_SYNC_REUSABLE_KHR 0x30FA -#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 -#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull -#define EGL_NO_SYNC_KHR EGL_CAST(EGLSyncKHR,0) -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_KHR_reusable_sync */ - -#ifndef EGL_KHR_stream -#define EGL_KHR_stream 1 -typedef void *EGLStreamKHR; -typedef khronos_uint64_t EGLuint64KHR; -#ifdef KHRONOS_SUPPORT_INT64 -#define EGL_NO_STREAM_KHR EGL_CAST(EGLStreamKHR,0) -#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 -#define EGL_PRODUCER_FRAME_KHR 0x3212 -#define EGL_CONSUMER_FRAME_KHR 0x3213 -#define EGL_STREAM_STATE_KHR 0x3214 -#define EGL_STREAM_STATE_CREATED_KHR 0x3215 -#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 -#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 -#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 -#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 -#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A -#define EGL_BAD_STREAM_KHR 0x321B -#define EGL_BAD_STATE_KHR 0x321C -typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_KHR_stream */ - -#ifndef EGL_KHR_stream_attrib -#define EGL_KHR_stream_attrib 1 -#ifdef KHRONOS_SUPPORT_INT64 -typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamAttribKHR (EGLDisplay dpy, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_KHR_stream_attrib */ - -#ifndef EGL_KHR_stream_consumer_gltexture -#define EGL_KHR_stream_consumer_gltexture 1 -#ifdef EGL_KHR_stream -#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream); -#endif -#endif /* EGL_KHR_stream */ -#endif /* EGL_KHR_stream_consumer_gltexture */ - -#ifndef EGL_KHR_stream_cross_process_fd -#define EGL_KHR_stream_cross_process_fd 1 -typedef int EGLNativeFileDescriptorKHR; -#ifdef EGL_KHR_stream -#define EGL_NO_FILE_DESCRIPTOR_KHR EGL_CAST(EGLNativeFileDescriptorKHR,-1) -typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); -typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream); -EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); -#endif -#endif /* EGL_KHR_stream */ -#endif /* EGL_KHR_stream_cross_process_fd */ - -#ifndef EGL_KHR_stream_fifo -#define EGL_KHR_stream_fifo 1 -#ifdef EGL_KHR_stream -#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC -#define EGL_STREAM_TIME_NOW_KHR 0x31FD -#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE -#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); -#endif -#endif /* EGL_KHR_stream */ -#endif /* EGL_KHR_stream_fifo */ - -#ifndef EGL_KHR_stream_producer_aldatalocator -#define EGL_KHR_stream_producer_aldatalocator 1 -#ifdef EGL_KHR_stream -#endif /* EGL_KHR_stream */ -#endif /* EGL_KHR_stream_producer_aldatalocator */ - -#ifndef EGL_KHR_stream_producer_eglsurface -#define EGL_KHR_stream_producer_eglsurface 1 -#ifdef EGL_KHR_stream -#define EGL_STREAM_BIT_KHR 0x0800 -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); -#endif -#endif /* EGL_KHR_stream */ -#endif /* EGL_KHR_stream_producer_eglsurface */ - -#ifndef EGL_KHR_surfaceless_context -#define EGL_KHR_surfaceless_context 1 -#endif /* EGL_KHR_surfaceless_context */ - -#ifndef EGL_KHR_swap_buffers_with_damage -#define EGL_KHR_swap_buffers_with_damage 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); -#endif -#endif /* EGL_KHR_swap_buffers_with_damage */ - -#ifndef EGL_KHR_vg_parent_image -#define EGL_KHR_vg_parent_image 1 -#define EGL_VG_PARENT_IMAGE_KHR 0x30BA -#endif /* EGL_KHR_vg_parent_image */ - -#ifndef EGL_KHR_wait_sync -#define EGL_KHR_wait_sync 1 -typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); -#endif -#endif /* EGL_KHR_wait_sync */ - -#ifndef EGL_ANDROID_GLES_layers -#define EGL_ANDROID_GLES_layers 1 -#endif /* EGL_ANDROID_GLES_layers */ - -#ifndef EGL_ANDROID_blob_cache -#define EGL_ANDROID_blob_cache 1 -typedef khronos_ssize_t EGLsizeiANDROID; -typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); -typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); -typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); -#endif -#endif /* EGL_ANDROID_blob_cache */ - -#ifndef EGL_ANDROID_create_native_client_buffer -#define EGL_ANDROID_create_native_client_buffer 1 -#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 -#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 -#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 -#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 -typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID (const EGLint *attrib_list); -#endif -#endif /* EGL_ANDROID_create_native_client_buffer */ - -#ifndef EGL_ANDROID_framebuffer_target -#define EGL_ANDROID_framebuffer_target 1 -#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 -#endif /* EGL_ANDROID_framebuffer_target */ - -#ifndef EGL_ANDROID_front_buffer_auto_refresh -#define EGL_ANDROID_front_buffer_auto_refresh 1 -#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C -#endif /* EGL_ANDROID_front_buffer_auto_refresh */ - -#ifndef EGL_ANDROID_get_frame_timestamps -#define EGL_ANDROID_get_frame_timestamps 1 -typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; -#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2) -#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1) -#define EGL_TIMESTAMPS_ANDROID 0x3430 -#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431 -#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432 -#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433 -#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434 -#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435 -#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436 -#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437 -#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438 -#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439 -#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A -#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B -#define EGL_READS_DONE_TIME_ANDROID 0x343C -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint name); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint name); -EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingANDROID (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); -EGLAPI EGLBoolean EGLAPIENTRY eglGetNextFrameIdANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); -EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); -EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampsANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); -#endif -#endif /* EGL_ANDROID_get_frame_timestamps */ - -#ifndef EGL_ANDROID_get_native_client_buffer -#define EGL_ANDROID_get_native_client_buffer 1 -struct AHardwareBuffer; -typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHardwareBuffer *buffer); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer); -#endif -#endif /* EGL_ANDROID_get_native_client_buffer */ - -#ifndef EGL_ANDROID_image_native_buffer -#define EGL_ANDROID_image_native_buffer 1 -#define EGL_NATIVE_BUFFER_ANDROID 0x3140 -#endif /* EGL_ANDROID_image_native_buffer */ - -#ifndef EGL_ANDROID_native_fence_sync -#define EGL_ANDROID_native_fence_sync 1 -#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 -#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 -#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 -#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 -typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync); -#endif -#endif /* EGL_ANDROID_native_fence_sync */ - -#ifndef EGL_ANDROID_presentation_time -#define EGL_ANDROID_presentation_time 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); -#endif -#endif /* EGL_ANDROID_presentation_time */ - -#ifndef EGL_ANDROID_recordable -#define EGL_ANDROID_recordable 1 -#define EGL_RECORDABLE_ANDROID 0x3142 -#endif /* EGL_ANDROID_recordable */ - -#ifndef EGL_ANGLE_d3d_share_handle_client_buffer -#define EGL_ANGLE_d3d_share_handle_client_buffer 1 -#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 -#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ - -#ifndef EGL_ANGLE_device_d3d -#define EGL_ANGLE_device_d3d 1 -#define EGL_D3D9_DEVICE_ANGLE 0x33A0 -#define EGL_D3D11_DEVICE_ANGLE 0x33A1 -#endif /* EGL_ANGLE_device_d3d */ - -#ifndef EGL_ANGLE_query_surface_pointer -#define EGL_ANGLE_query_surface_pointer 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); -#endif -#endif /* EGL_ANGLE_query_surface_pointer */ - -#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle -#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 -#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ - -#ifndef EGL_ANGLE_window_fixed_size -#define EGL_ANGLE_window_fixed_size 1 -#define EGL_FIXED_SIZE_ANGLE 0x3201 -#endif /* EGL_ANGLE_window_fixed_size */ - -#ifndef EGL_ARM_image_format -#define EGL_ARM_image_format 1 -#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287 -#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288 -#endif /* EGL_ARM_image_format */ - -#ifndef EGL_ARM_implicit_external_sync -#define EGL_ARM_implicit_external_sync 1 -#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A -#endif /* EGL_ARM_implicit_external_sync */ - -#ifndef EGL_ARM_pixmap_multisample_discard -#define EGL_ARM_pixmap_multisample_discard 1 -#define EGL_DISCARD_SAMPLES_ARM 0x3286 -#endif /* EGL_ARM_pixmap_multisample_discard */ - -#ifndef EGL_EXT_bind_to_front -#define EGL_EXT_bind_to_front 1 -#define EGL_FRONT_BUFFER_EXT 0x3464 -#endif /* EGL_EXT_bind_to_front */ - -#ifndef EGL_EXT_buffer_age -#define EGL_EXT_buffer_age 1 -#define EGL_BUFFER_AGE_EXT 0x313D -#endif /* EGL_EXT_buffer_age */ - -#ifndef EGL_EXT_client_extensions -#define EGL_EXT_client_extensions 1 -#endif /* EGL_EXT_client_extensions */ - -#ifndef EGL_EXT_client_sync -#define EGL_EXT_client_sync 1 -#define EGL_SYNC_CLIENT_EXT 0x3364 -#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglClientSignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); -#endif -#endif /* EGL_EXT_client_sync */ - -#ifndef EGL_EXT_compositor -#define EGL_EXT_compositor 1 -#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460 -#define EGL_EXTERNAL_REF_ID_EXT 0x3461 -#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT 0x3462 -#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT 0x3463 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC) (const EGLint *external_ref_ids, EGLint num_entries); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC) (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC) (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC) (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC) (EGLint external_win_id); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC) (EGLint external_win_id, EGLint width, EGLint height); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC) (EGLint external_win_id, EGLint policy); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextListEXT (const EGLint *external_ref_ids, EGLint num_entries); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextAttributesEXT (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowListEXT (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowAttributesEXT (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorBindTexWindowEXT (EGLint external_win_id); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetSizeEXT (EGLint external_win_id, EGLint width, EGLint height); -EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSwapPolicyEXT (EGLint external_win_id, EGLint policy); -#endif -#endif /* EGL_EXT_compositor */ - -#ifndef EGL_EXT_create_context_robustness -#define EGL_EXT_create_context_robustness 1 -#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF -#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 -#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF -#endif /* EGL_EXT_create_context_robustness */ - -#ifndef EGL_EXT_device_base -#define EGL_EXT_device_base 1 -typedef void *EGLDeviceEXT; -#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0) -#define EGL_BAD_DEVICE_EXT 0x322B -#define EGL_DEVICE_EXT 0x322C -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); -typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); -EGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); -#endif -#endif /* EGL_EXT_device_base */ - -#ifndef EGL_EXT_device_drm -#define EGL_EXT_device_drm 1 -#define EGL_DRM_DEVICE_FILE_EXT 0x3233 -#define EGL_DRM_MASTER_FD_EXT 0x333C -#endif /* EGL_EXT_device_drm */ - -#ifndef EGL_EXT_device_enumeration -#define EGL_EXT_device_enumeration 1 -#endif /* EGL_EXT_device_enumeration */ - -#ifndef EGL_EXT_device_openwf -#define EGL_EXT_device_openwf 1 -#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 -#endif /* EGL_EXT_device_openwf */ - -#ifndef EGL_EXT_device_query -#define EGL_EXT_device_query 1 -#endif /* EGL_EXT_device_query */ - -#ifndef EGL_EXT_device_query_name -#define EGL_EXT_device_query_name 1 -#define EGL_RENDERER_EXT 0x335F -#endif /* EGL_EXT_device_query_name */ - -#ifndef EGL_EXT_gl_colorspace_bt2020_linear -#define EGL_EXT_gl_colorspace_bt2020_linear 1 -#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F -#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ - -#ifndef EGL_EXT_gl_colorspace_bt2020_pq -#define EGL_EXT_gl_colorspace_bt2020_pq 1 -#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 -#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ - -#ifndef EGL_EXT_gl_colorspace_display_p3 -#define EGL_EXT_gl_colorspace_display_p3 1 -#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT 0x3363 -#endif /* EGL_EXT_gl_colorspace_display_p3 */ - -#ifndef EGL_EXT_gl_colorspace_display_p3_linear -#define EGL_EXT_gl_colorspace_display_p3_linear 1 -#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT 0x3362 -#endif /* EGL_EXT_gl_colorspace_display_p3_linear */ - -#ifndef EGL_EXT_gl_colorspace_display_p3_passthrough -#define EGL_EXT_gl_colorspace_display_p3_passthrough 1 -#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT 0x3490 -#endif /* EGL_EXT_gl_colorspace_display_p3_passthrough */ - -#ifndef EGL_EXT_gl_colorspace_scrgb -#define EGL_EXT_gl_colorspace_scrgb 1 -#define EGL_GL_COLORSPACE_SCRGB_EXT 0x3351 -#endif /* EGL_EXT_gl_colorspace_scrgb */ - -#ifndef EGL_EXT_gl_colorspace_scrgb_linear -#define EGL_EXT_gl_colorspace_scrgb_linear 1 -#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 -#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ - -#ifndef EGL_EXT_image_dma_buf_import -#define EGL_EXT_image_dma_buf_import 1 -#define EGL_LINUX_DMA_BUF_EXT 0x3270 -#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 -#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 -#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 -#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 -#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 -#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 -#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 -#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 -#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 -#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A -#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B -#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C -#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D -#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E -#define EGL_ITU_REC601_EXT 0x327F -#define EGL_ITU_REC709_EXT 0x3280 -#define EGL_ITU_REC2020_EXT 0x3281 -#define EGL_YUV_FULL_RANGE_EXT 0x3282 -#define EGL_YUV_NARROW_RANGE_EXT 0x3283 -#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 -#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 -#endif /* EGL_EXT_image_dma_buf_import */ - -#ifndef EGL_EXT_image_dma_buf_import_modifiers -#define EGL_EXT_image_dma_buf_import_modifiers 1 -#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 -#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 -#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 -#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 -#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 -#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 -#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 -#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 -#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 -#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 -#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufFormatsEXT (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufModifiersEXT (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); -#endif -#endif /* EGL_EXT_image_dma_buf_import_modifiers */ - -#ifndef EGL_EXT_image_gl_colorspace -#define EGL_EXT_image_gl_colorspace 1 -#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D -#endif /* EGL_EXT_image_gl_colorspace */ - -#ifndef EGL_EXT_image_implicit_sync_control -#define EGL_EXT_image_implicit_sync_control 1 -#define EGL_IMPORT_SYNC_TYPE_EXT 0x3470 -#define EGL_IMPORT_IMPLICIT_SYNC_EXT 0x3471 -#define EGL_IMPORT_EXPLICIT_SYNC_EXT 0x3472 -#endif /* EGL_EXT_image_implicit_sync_control */ - -#ifndef EGL_EXT_multiview_window -#define EGL_EXT_multiview_window 1 -#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 -#endif /* EGL_EXT_multiview_window */ - -#ifndef EGL_EXT_output_base -#define EGL_EXT_output_base 1 -typedef void *EGLOutputLayerEXT; -typedef void *EGLOutputPortEXT; -#define EGL_NO_OUTPUT_LAYER_EXT EGL_CAST(EGLOutputLayerEXT,0) -#define EGL_NO_OUTPUT_PORT_EXT EGL_CAST(EGLOutputPortEXT,0) -#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D -#define EGL_BAD_OUTPUT_PORT_EXT 0x322E -#define EGL_SWAP_INTERVAL_EXT 0x322F -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); -typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); -typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); -EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); -EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); -EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); -EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); -EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); -#endif -#endif /* EGL_EXT_output_base */ - -#ifndef EGL_EXT_output_drm -#define EGL_EXT_output_drm 1 -#define EGL_DRM_CRTC_EXT 0x3234 -#define EGL_DRM_PLANE_EXT 0x3235 -#define EGL_DRM_CONNECTOR_EXT 0x3236 -#endif /* EGL_EXT_output_drm */ - -#ifndef EGL_EXT_output_openwf -#define EGL_EXT_output_openwf 1 -#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 -#define EGL_OPENWF_PORT_ID_EXT 0x3239 -#endif /* EGL_EXT_output_openwf */ - -#ifndef EGL_EXT_pixel_format_float -#define EGL_EXT_pixel_format_float 1 -#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 -#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A -#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B -#endif /* EGL_EXT_pixel_format_float */ - -#ifndef EGL_EXT_platform_base -#define EGL_EXT_platform_base 1 -typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); -EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); -#endif -#endif /* EGL_EXT_platform_base */ - -#ifndef EGL_EXT_platform_device -#define EGL_EXT_platform_device 1 -#define EGL_PLATFORM_DEVICE_EXT 0x313F -#endif /* EGL_EXT_platform_device */ - -#ifndef EGL_EXT_platform_wayland -#define EGL_EXT_platform_wayland 1 -#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 -#endif /* EGL_EXT_platform_wayland */ - -#ifndef EGL_EXT_platform_x11 -#define EGL_EXT_platform_x11 1 -#define EGL_PLATFORM_X11_EXT 0x31D5 -#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 -#endif /* EGL_EXT_platform_x11 */ - -#ifndef EGL_EXT_platform_xcb -#define EGL_EXT_platform_xcb 1 -#define EGL_PLATFORM_XCB_EXT 0x31DC -#define EGL_PLATFORM_XCB_SCREEN_EXT 0x31DE -#endif /* EGL_EXT_platform_xcb */ - -#ifndef EGL_EXT_protected_content -#define EGL_EXT_protected_content 1 -#define EGL_PROTECTED_CONTENT_EXT 0x32C0 -#endif /* EGL_EXT_protected_content */ - -#ifndef EGL_EXT_protected_surface -#define EGL_EXT_protected_surface 1 -#endif /* EGL_EXT_protected_surface */ - -#ifndef EGL_EXT_stream_consumer_egloutput -#define EGL_EXT_stream_consumer_egloutput 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); -#endif -#endif /* EGL_EXT_stream_consumer_egloutput */ - -#ifndef EGL_EXT_surface_CTA861_3_metadata -#define EGL_EXT_surface_CTA861_3_metadata 1 -#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT 0x3360 -#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT 0x3361 -#endif /* EGL_EXT_surface_CTA861_3_metadata */ - -#ifndef EGL_EXT_surface_SMPTE2086_metadata -#define EGL_EXT_surface_SMPTE2086_metadata 1 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 -#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 -#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 -#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 -#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 -#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A -#define EGL_METADATA_SCALING_EXT 50000 -#endif /* EGL_EXT_surface_SMPTE2086_metadata */ - -#ifndef EGL_EXT_swap_buffers_with_damage -#define EGL_EXT_swap_buffers_with_damage 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); -#endif -#endif /* EGL_EXT_swap_buffers_with_damage */ - -#ifndef EGL_EXT_sync_reuse -#define EGL_EXT_sync_reuse 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglUnsignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); -#endif -#endif /* EGL_EXT_sync_reuse */ - -#ifndef EGL_EXT_yuv_surface -#define EGL_EXT_yuv_surface 1 -#define EGL_YUV_ORDER_EXT 0x3301 -#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 -#define EGL_YUV_SUBSAMPLE_EXT 0x3312 -#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 -#define EGL_YUV_CSC_STANDARD_EXT 0x330A -#define EGL_YUV_PLANE_BPP_EXT 0x331A -#define EGL_YUV_BUFFER_EXT 0x3300 -#define EGL_YUV_ORDER_YUV_EXT 0x3302 -#define EGL_YUV_ORDER_YVU_EXT 0x3303 -#define EGL_YUV_ORDER_YUYV_EXT 0x3304 -#define EGL_YUV_ORDER_UYVY_EXT 0x3305 -#define EGL_YUV_ORDER_YVYU_EXT 0x3306 -#define EGL_YUV_ORDER_VYUY_EXT 0x3307 -#define EGL_YUV_ORDER_AYUV_EXT 0x3308 -#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 -#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 -#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 -#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 -#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 -#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B -#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C -#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D -#define EGL_YUV_PLANE_BPP_0_EXT 0x331B -#define EGL_YUV_PLANE_BPP_8_EXT 0x331C -#define EGL_YUV_PLANE_BPP_10_EXT 0x331D -#endif /* EGL_EXT_yuv_surface */ - -#ifndef EGL_HI_clientpixmap -#define EGL_HI_clientpixmap 1 -struct EGLClientPixmapHI { - void *pData; - EGLint iWidth; - EGLint iHeight; - EGLint iStride; -}; -#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 -typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); -#endif -#endif /* EGL_HI_clientpixmap */ - -#ifndef EGL_HI_colorformats -#define EGL_HI_colorformats 1 -#define EGL_COLOR_FORMAT_HI 0x8F70 -#define EGL_COLOR_RGB_HI 0x8F71 -#define EGL_COLOR_RGBA_HI 0x8F72 -#define EGL_COLOR_ARGB_HI 0x8F73 -#endif /* EGL_HI_colorformats */ - -#ifndef EGL_IMG_context_priority -#define EGL_IMG_context_priority 1 -#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 -#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 -#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 -#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 -#endif /* EGL_IMG_context_priority */ - -#ifndef EGL_IMG_image_plane_attribs -#define EGL_IMG_image_plane_attribs 1 -#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 -#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 -#endif /* EGL_IMG_image_plane_attribs */ - -#ifndef EGL_MESA_drm_image -#define EGL_MESA_drm_image 1 -#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 -#define EGL_DRM_BUFFER_USE_MESA 0x31D1 -#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 -#define EGL_DRM_BUFFER_MESA 0x31D3 -#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 -#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 -#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 -#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004 -typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); -#endif -#endif /* EGL_MESA_drm_image */ - -#ifndef EGL_MESA_image_dma_buf_export -#define EGL_MESA_image_dma_buf_export 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); -EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); -#endif -#endif /* EGL_MESA_image_dma_buf_export */ - -#ifndef EGL_MESA_platform_gbm -#define EGL_MESA_platform_gbm 1 -#define EGL_PLATFORM_GBM_MESA 0x31D7 -#endif /* EGL_MESA_platform_gbm */ - -#ifndef EGL_MESA_platform_surfaceless -#define EGL_MESA_platform_surfaceless 1 -#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD -#endif /* EGL_MESA_platform_surfaceless */ - -#ifndef EGL_MESA_query_driver -#define EGL_MESA_query_driver 1 -typedef char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC) (EGLDisplay dpy); -typedef const char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC) (EGLDisplay dpy); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI char *EGLAPIENTRY eglGetDisplayDriverConfig (EGLDisplay dpy); -EGLAPI const char *EGLAPIENTRY eglGetDisplayDriverName (EGLDisplay dpy); -#endif -#endif /* EGL_MESA_query_driver */ - -#ifndef EGL_NOK_swap_region -#define EGL_NOK_swap_region 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); -#endif -#endif /* EGL_NOK_swap_region */ - -#ifndef EGL_NOK_swap_region2 -#define EGL_NOK_swap_region2 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); -#endif -#endif /* EGL_NOK_swap_region2 */ - -#ifndef EGL_NOK_texture_from_pixmap -#define EGL_NOK_texture_from_pixmap 1 -#define EGL_Y_INVERTED_NOK 0x307F -#endif /* EGL_NOK_texture_from_pixmap */ - -#ifndef EGL_NV_3dvision_surface -#define EGL_NV_3dvision_surface 1 -#define EGL_AUTO_STEREO_NV 0x3136 -#endif /* EGL_NV_3dvision_surface */ - -#ifndef EGL_NV_context_priority_realtime -#define EGL_NV_context_priority_realtime 1 -#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357 -#endif /* EGL_NV_context_priority_realtime */ - -#ifndef EGL_NV_coverage_sample -#define EGL_NV_coverage_sample 1 -#define EGL_COVERAGE_BUFFERS_NV 0x30E0 -#define EGL_COVERAGE_SAMPLES_NV 0x30E1 -#endif /* EGL_NV_coverage_sample */ - -#ifndef EGL_NV_coverage_sample_resolve -#define EGL_NV_coverage_sample_resolve 1 -#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 -#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 -#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 -#endif /* EGL_NV_coverage_sample_resolve */ - -#ifndef EGL_NV_cuda_event -#define EGL_NV_cuda_event 1 -#define EGL_CUDA_EVENT_HANDLE_NV 0x323B -#define EGL_SYNC_CUDA_EVENT_NV 0x323C -#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D -#endif /* EGL_NV_cuda_event */ - -#ifndef EGL_NV_depth_nonlinear -#define EGL_NV_depth_nonlinear 1 -#define EGL_DEPTH_ENCODING_NV 0x30E2 -#define EGL_DEPTH_ENCODING_NONE_NV 0 -#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 -#endif /* EGL_NV_depth_nonlinear */ - -#ifndef EGL_NV_device_cuda -#define EGL_NV_device_cuda 1 -#define EGL_CUDA_DEVICE_NV 0x323A -#endif /* EGL_NV_device_cuda */ - -#ifndef EGL_NV_native_query -#define EGL_NV_native_query 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); -#endif -#endif /* EGL_NV_native_query */ - -#ifndef EGL_NV_post_convert_rounding -#define EGL_NV_post_convert_rounding 1 -#endif /* EGL_NV_post_convert_rounding */ - -#ifndef EGL_NV_post_sub_buffer -#define EGL_NV_post_sub_buffer 1 -#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE -typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); -#endif -#endif /* EGL_NV_post_sub_buffer */ - -#ifndef EGL_NV_quadruple_buffer -#define EGL_NV_quadruple_buffer 1 -#define EGL_QUADRUPLE_BUFFER_NV 0x3231 -#endif /* EGL_NV_quadruple_buffer */ - -#ifndef EGL_NV_robustness_video_memory_purge -#define EGL_NV_robustness_video_memory_purge 1 -#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C -#endif /* EGL_NV_robustness_video_memory_purge */ - -#ifndef EGL_NV_stream_consumer_eglimage -#define EGL_NV_stream_consumer_eglimage 1 -#define EGL_STREAM_CONSUMER_IMAGE_NV 0x3373 -#define EGL_STREAM_IMAGE_ADD_NV 0x3374 -#define EGL_STREAM_IMAGE_REMOVE_NV 0x3375 -#define EGL_STREAM_IMAGE_AVAILABLE_NV 0x3376 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMIMAGECONSUMERCONNECTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, EGLuint64KHR *modifiers, EGLAttrib *attrib_list); -typedef EGLint (EGLAPIENTRYP PFNEGLQUERYSTREAMCONSUMEREVENTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMACQUIREIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMRELEASEIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglStreamImageConsumerConnectNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, EGLuint64KHR *modifiers, EGLAttrib *attrib_list); -EGLAPI EGLint EGLAPIENTRY eglQueryStreamConsumerEventNV (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamAcquireImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); -EGLAPI EGLBoolean EGLAPIENTRY eglStreamReleaseImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); -#endif -#endif /* EGL_NV_stream_consumer_eglimage */ - -#ifndef EGL_NV_stream_consumer_gltexture_yuv -#define EGL_NV_stream_consumer_gltexture_yuv 1 -#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C -#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D -#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); -#endif -#endif /* EGL_NV_stream_consumer_gltexture_yuv */ - -#ifndef EGL_NV_stream_cross_display -#define EGL_NV_stream_cross_display 1 -#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E -#endif /* EGL_NV_stream_cross_display */ - -#ifndef EGL_NV_stream_cross_object -#define EGL_NV_stream_cross_object 1 -#define EGL_STREAM_CROSS_OBJECT_NV 0x334D -#endif /* EGL_NV_stream_cross_object */ - -#ifndef EGL_NV_stream_cross_partition -#define EGL_NV_stream_cross_partition 1 -#define EGL_STREAM_CROSS_PARTITION_NV 0x323F -#endif /* EGL_NV_stream_cross_partition */ - -#ifndef EGL_NV_stream_cross_process -#define EGL_NV_stream_cross_process 1 -#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 -#endif /* EGL_NV_stream_cross_process */ - -#ifndef EGL_NV_stream_cross_system -#define EGL_NV_stream_cross_system 1 -#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F -#endif /* EGL_NV_stream_cross_system */ - -#ifndef EGL_NV_stream_dma -#define EGL_NV_stream_dma 1 -#define EGL_STREAM_DMA_NV 0x3371 -#define EGL_STREAM_DMA_SERVER_NV 0x3372 -#endif /* EGL_NV_stream_dma */ - -#ifndef EGL_NV_stream_fifo_next -#define EGL_NV_stream_fifo_next 1 -#define EGL_PENDING_FRAME_NV 0x3329 -#define EGL_STREAM_TIME_PENDING_NV 0x332A -#endif /* EGL_NV_stream_fifo_next */ - -#ifndef EGL_NV_stream_fifo_synchronous -#define EGL_NV_stream_fifo_synchronous 1 -#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 -#endif /* EGL_NV_stream_fifo_synchronous */ - -#ifndef EGL_NV_stream_flush -#define EGL_NV_stream_flush 1 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglStreamFlushNV (EGLDisplay dpy, EGLStreamKHR stream); -#endif -#endif /* EGL_NV_stream_flush */ - -#ifndef EGL_NV_stream_frame_limits -#define EGL_NV_stream_frame_limits 1 -#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 -#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 -#endif /* EGL_NV_stream_frame_limits */ - -#ifndef EGL_NV_stream_metadata -#define EGL_NV_stream_metadata 1 -#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 -#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 -#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 -#define EGL_PRODUCER_METADATA_NV 0x3253 -#define EGL_CONSUMER_METADATA_NV 0x3254 -#define EGL_PENDING_METADATA_NV 0x3328 -#define EGL_METADATA0_SIZE_NV 0x3255 -#define EGL_METADATA1_SIZE_NV 0x3256 -#define EGL_METADATA2_SIZE_NV 0x3257 -#define EGL_METADATA3_SIZE_NV 0x3258 -#define EGL_METADATA0_TYPE_NV 0x3259 -#define EGL_METADATA1_TYPE_NV 0x325A -#define EGL_METADATA2_TYPE_NV 0x325B -#define EGL_METADATA3_TYPE_NV 0x325C -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribNV (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); -EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); -#endif -#endif /* EGL_NV_stream_metadata */ - -#ifndef EGL_NV_stream_origin -#define EGL_NV_stream_origin 1 -#define EGL_STREAM_FRAME_ORIGIN_X_NV 0x3366 -#define EGL_STREAM_FRAME_ORIGIN_Y_NV 0x3367 -#define EGL_STREAM_FRAME_MAJOR_AXIS_NV 0x3368 -#define EGL_CONSUMER_AUTO_ORIENTATION_NV 0x3369 -#define EGL_PRODUCER_AUTO_ORIENTATION_NV 0x336A -#define EGL_LEFT_NV 0x336B -#define EGL_RIGHT_NV 0x336C -#define EGL_TOP_NV 0x336D -#define EGL_BOTTOM_NV 0x336E -#define EGL_X_AXIS_NV 0x336F -#define EGL_Y_AXIS_NV 0x3370 -#endif /* EGL_NV_stream_origin */ - -#ifndef EGL_NV_stream_remote -#define EGL_NV_stream_remote 1 -#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 -#define EGL_STREAM_TYPE_NV 0x3241 -#define EGL_STREAM_PROTOCOL_NV 0x3242 -#define EGL_STREAM_ENDPOINT_NV 0x3243 -#define EGL_STREAM_LOCAL_NV 0x3244 -#define EGL_STREAM_PRODUCER_NV 0x3247 -#define EGL_STREAM_CONSUMER_NV 0x3248 -#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 -#endif /* EGL_NV_stream_remote */ - -#ifndef EGL_NV_stream_reset -#define EGL_NV_stream_reset 1 -#define EGL_SUPPORT_RESET_NV 0x3334 -#define EGL_SUPPORT_REUSE_NV 0x3335 -typedef EGLBoolean (EGLAPIENTRYP PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglResetStreamNV (EGLDisplay dpy, EGLStreamKHR stream); -#endif -#endif /* EGL_NV_stream_reset */ - -#ifndef EGL_NV_stream_socket -#define EGL_NV_stream_socket 1 -#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B -#define EGL_SOCKET_HANDLE_NV 0x324C -#define EGL_SOCKET_TYPE_NV 0x324D -#endif /* EGL_NV_stream_socket */ - -#ifndef EGL_NV_stream_socket_inet -#define EGL_NV_stream_socket_inet 1 -#define EGL_SOCKET_TYPE_INET_NV 0x324F -#endif /* EGL_NV_stream_socket_inet */ - -#ifndef EGL_NV_stream_socket_unix -#define EGL_NV_stream_socket_unix 1 -#define EGL_SOCKET_TYPE_UNIX_NV 0x324E -#endif /* EGL_NV_stream_socket_unix */ - -#ifndef EGL_NV_stream_sync -#define EGL_NV_stream_sync 1 -#define EGL_SYNC_NEW_FRAME_NV 0x321F -typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); -#endif -#endif /* EGL_NV_stream_sync */ - -#ifndef EGL_NV_sync -#define EGL_NV_sync 1 -typedef void *EGLSyncNV; -typedef khronos_utime_nanoseconds_t EGLTimeNV; -#ifdef KHRONOS_SUPPORT_INT64 -#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 -#define EGL_SYNC_STATUS_NV 0x30E7 -#define EGL_SIGNALED_NV 0x30E8 -#define EGL_UNSIGNALED_NV 0x30E9 -#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 -#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull -#define EGL_ALREADY_SIGNALED_NV 0x30EA -#define EGL_TIMEOUT_EXPIRED_NV 0x30EB -#define EGL_CONDITION_SATISFIED_NV 0x30EC -#define EGL_SYNC_TYPE_NV 0x30ED -#define EGL_SYNC_CONDITION_NV 0x30EE -#define EGL_SYNC_FENCE_NV 0x30EF -#define EGL_NO_SYNC_NV EGL_CAST(EGLSyncNV,0) -typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); -typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); -EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); -EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); -EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); -EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); -EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_NV_sync */ - -#ifndef EGL_NV_system_time -#define EGL_NV_system_time 1 -typedef khronos_utime_nanoseconds_t EGLuint64NV; -#ifdef KHRONOS_SUPPORT_INT64 -typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); -typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void); -EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void); -#endif -#endif /* KHRONOS_SUPPORT_INT64 */ -#endif /* EGL_NV_system_time */ - -#ifndef EGL_NV_triple_buffer -#define EGL_NV_triple_buffer 1 -#define EGL_TRIPLE_BUFFER_NV 0x3230 -#endif /* EGL_NV_triple_buffer */ - -#ifndef EGL_TIZEN_image_native_buffer -#define EGL_TIZEN_image_native_buffer 1 -#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 -#endif /* EGL_TIZEN_image_native_buffer */ - -#ifndef EGL_TIZEN_image_native_surface -#define EGL_TIZEN_image_native_surface 1 -#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 -#endif /* EGL_TIZEN_image_native_surface */ - -#ifndef EGL_WL_bind_wayland_display -#define EGL_WL_bind_wayland_display 1 -#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC -#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC -#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC -struct wl_display; -struct wl_resource; -#define EGL_WAYLAND_BUFFER_WL 0x31D5 -#define EGL_WAYLAND_PLANE_WL 0x31D6 -#define EGL_TEXTURE_Y_U_V_WL 0x31D7 -#define EGL_TEXTURE_Y_UV_WL 0x31D8 -#define EGL_TEXTURE_Y_XUXV_WL 0x31D9 -#define EGL_TEXTURE_EXTERNAL_WL 0x31DA -#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB -typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); -typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); -EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); -EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); -#endif -#endif /* EGL_WL_bind_wayland_display */ - -#ifndef EGL_WL_create_wayland_buffer_from_image -#define EGL_WL_create_wayland_buffer_from_image 1 -#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC -struct wl_buffer; -typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dpy, EGLImageKHR image); -#ifdef EGL_EGLEXT_PROTOTYPES -EGLAPI struct wl_buffer *EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy, EGLImageKHR image); -#endif -#endif /* EGL_WL_create_wayland_buffer_from_image */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GL3/gl3.h b/core/deps/khronos/GL3/gl3.h deleted file mode 100644 index 9d59db980..000000000 --- a/core/deps/khronos/GL3/gl3.h +++ /dev/null @@ -1,4544 +0,0 @@ -#ifndef __glcorearb_h_ -#define __glcorearb_h_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** THIS FILE IS OBSOLETE. Please migrate away from using the -** ".spec" files and the headers generated from them to the -** XML Registry and headers generated from that. See -** http://www.opengl.org/registry/api/README.txt -** for more information. -** -** -** Copyright (c) 2007-2013 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* glcorearb.h replaces gl3.h. It is for use with OpenGL core - * profile implementations. - * - * glcorearb.h last updated on $Date: 2013-06-13 02:52:31 -0700 (Thu, 13 Jun 2013) $ - * - * RELEASE NOTES - 2013/06/10 - * - * glcorearb.h should be placed in the same directory as gl.h and - * included as - * ''. - * - * glcorearb.h includes only APIs in the latest OpenGL core profile - * implementation together with APIs in newer ARB extensions which can be - * can be supported by the core profile. It does not, and never will - * include functionality removed from the core profile, such as - * fixed-function vertex and fragment processing. - * - * It is not possible to #include both and either of - * or in the same source file. - * - * Feedback can be given by registering for the Khronos Bugzilla - * (www.khronos.org/bugzilla) and filing issues there under product - * "OpenGL", category "Registry". - */ - -/* Function declaration macros - to move into glplatform.h */ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define WIN32_LEAN_AND_MEAN 1 -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/* Base GL types */ - -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef signed char GLbyte; -typedef short GLshort; -typedef int GLint; -typedef int GLsizei; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned int GLuint; -typedef unsigned short GLhalf; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; - -/*************************************************************/ - -#ifndef GL_VERSION_1_1 -/* AttribMask */ -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -/* Boolean */ -#define GL_FALSE 0 -#define GL_TRUE 1 -/* PrimitiveType */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -/* AlphaFunction */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -/* BlendingFactorDest */ -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -/* BlendingFactorSrc */ -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -/* DrawBufferMode */ -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -/* ErrorCode */ -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -/* FrontFaceDirection */ -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -/* GetPName */ -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_VIEWPORT 0x0BA2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -/* GetTextureParameter */ -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -/* HintMode */ -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -/* DataType */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_DOUBLE 0x140A -/* ErrorCode */ -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -/* LogicOp */ -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -/* MatrixMode (for gl3.h, FBO attachment type) */ -#define GL_TEXTURE 0x1702 -/* PixelCopyType */ -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -/* PixelFormat */ -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -/* PolygonMode */ -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -/* StencilOp */ -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -/* StringName */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -/* TextureMagFilter */ -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -/* TextureMinFilter */ -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -/* TextureParameterName */ -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -/* TextureTarget */ -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -/* TextureWrapMode */ -#define GL_REPEAT 0x2901 -/* PixelInternalFormat */ -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#endif - -#ifndef GL_VERSION_1_2 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#endif - -#ifndef GL_VERSION_1_3 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#endif - -#ifndef GL_VERSION_1_4 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#endif - -#ifndef GL_VERSION_1_5 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SRC1_ALPHA 0x8589 -#endif - -#ifndef GL_VERSION_2_0 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#endif - -#ifndef GL_VERSION_2_1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#endif - -#ifndef GL_VERSION_3_0 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -/* Reuse tokens from ARB_depth_buffer_float */ -/* reuse GL_DEPTH_COMPONENT32F */ -/* reuse GL_DEPTH32F_STENCIL8 */ -/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */ -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_DEFAULT */ -/* reuse GL_FRAMEBUFFER_UNDEFINED */ -/* reuse GL_DEPTH_STENCIL_ATTACHMENT */ -/* reuse GL_INDEX */ -/* reuse GL_MAX_RENDERBUFFER_SIZE */ -/* reuse GL_DEPTH_STENCIL */ -/* reuse GL_UNSIGNED_INT_24_8 */ -/* reuse GL_DEPTH24_STENCIL8 */ -/* reuse GL_TEXTURE_STENCIL_SIZE */ -/* reuse GL_TEXTURE_RED_TYPE */ -/* reuse GL_TEXTURE_GREEN_TYPE */ -/* reuse GL_TEXTURE_BLUE_TYPE */ -/* reuse GL_TEXTURE_ALPHA_TYPE */ -/* reuse GL_TEXTURE_DEPTH_TYPE */ -/* reuse GL_UNSIGNED_NORMALIZED */ -/* reuse GL_FRAMEBUFFER_BINDING */ -/* reuse GL_DRAW_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_BINDING */ -/* reuse GL_READ_FRAMEBUFFER */ -/* reuse GL_DRAW_FRAMEBUFFER */ -/* reuse GL_READ_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_SAMPLES */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* reuse GL_FRAMEBUFFER_COMPLETE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */ -/* reuse GL_FRAMEBUFFER_UNSUPPORTED */ -/* reuse GL_MAX_COLOR_ATTACHMENTS */ -/* reuse GL_COLOR_ATTACHMENT0 */ -/* reuse GL_COLOR_ATTACHMENT1 */ -/* reuse GL_COLOR_ATTACHMENT2 */ -/* reuse GL_COLOR_ATTACHMENT3 */ -/* reuse GL_COLOR_ATTACHMENT4 */ -/* reuse GL_COLOR_ATTACHMENT5 */ -/* reuse GL_COLOR_ATTACHMENT6 */ -/* reuse GL_COLOR_ATTACHMENT7 */ -/* reuse GL_COLOR_ATTACHMENT8 */ -/* reuse GL_COLOR_ATTACHMENT9 */ -/* reuse GL_COLOR_ATTACHMENT10 */ -/* reuse GL_COLOR_ATTACHMENT11 */ -/* reuse GL_COLOR_ATTACHMENT12 */ -/* reuse GL_COLOR_ATTACHMENT13 */ -/* reuse GL_COLOR_ATTACHMENT14 */ -/* reuse GL_COLOR_ATTACHMENT15 */ -/* reuse GL_DEPTH_ATTACHMENT */ -/* reuse GL_STENCIL_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_RENDERBUFFER_WIDTH */ -/* reuse GL_RENDERBUFFER_HEIGHT */ -/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */ -/* reuse GL_STENCIL_INDEX1 */ -/* reuse GL_STENCIL_INDEX4 */ -/* reuse GL_STENCIL_INDEX8 */ -/* reuse GL_STENCIL_INDEX16 */ -/* reuse GL_RENDERBUFFER_RED_SIZE */ -/* reuse GL_RENDERBUFFER_GREEN_SIZE */ -/* reuse GL_RENDERBUFFER_BLUE_SIZE */ -/* reuse GL_RENDERBUFFER_ALPHA_SIZE */ -/* reuse GL_RENDERBUFFER_DEPTH_SIZE */ -/* reuse GL_RENDERBUFFER_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */ -/* reuse GL_MAX_SAMPLES */ -/* Reuse tokens from ARB_framebuffer_sRGB */ -/* reuse GL_FRAMEBUFFER_SRGB */ -/* Reuse tokens from ARB_half_float_vertex */ -/* reuse GL_HALF_FLOAT */ -/* Reuse tokens from ARB_map_buffer_range */ -/* reuse GL_MAP_READ_BIT */ -/* reuse GL_MAP_WRITE_BIT */ -/* reuse GL_MAP_INVALIDATE_RANGE_BIT */ -/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */ -/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */ -/* reuse GL_MAP_UNSYNCHRONIZED_BIT */ -/* Reuse tokens from ARB_texture_compression_rgtc */ -/* reuse GL_COMPRESSED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_RG_RGTC2 */ -/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */ -/* Reuse tokens from ARB_texture_rg */ -/* reuse GL_RG */ -/* reuse GL_RG_INTEGER */ -/* reuse GL_R8 */ -/* reuse GL_R16 */ -/* reuse GL_RG8 */ -/* reuse GL_RG16 */ -/* reuse GL_R16F */ -/* reuse GL_R32F */ -/* reuse GL_RG16F */ -/* reuse GL_RG32F */ -/* reuse GL_R8I */ -/* reuse GL_R8UI */ -/* reuse GL_R16I */ -/* reuse GL_R16UI */ -/* reuse GL_R32I */ -/* reuse GL_R32UI */ -/* reuse GL_RG8I */ -/* reuse GL_RG8UI */ -/* reuse GL_RG16I */ -/* reuse GL_RG16UI */ -/* reuse GL_RG32I */ -/* reuse GL_RG32UI */ -/* Reuse tokens from ARB_vertex_array_object */ -/* reuse GL_VERTEX_ARRAY_BINDING */ -#endif - -#ifndef GL_VERSION_3_1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -/* Reuse tokens from ARB_copy_buffer */ -/* reuse GL_COPY_READ_BUFFER */ -/* reuse GL_COPY_WRITE_BUFFER */ -/* Reuse tokens from ARB_draw_instanced (none) */ -/* Reuse tokens from ARB_uniform_buffer_object */ -/* reuse GL_UNIFORM_BUFFER */ -/* reuse GL_UNIFORM_BUFFER_BINDING */ -/* reuse GL_UNIFORM_BUFFER_START */ -/* reuse GL_UNIFORM_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ -/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ -/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ -/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ -/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ -/* reuse GL_UNIFORM_TYPE */ -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_INDEX */ -/* reuse GL_UNIFORM_OFFSET */ -/* reuse GL_UNIFORM_ARRAY_STRIDE */ -/* reuse GL_UNIFORM_MATRIX_STRIDE */ -/* reuse GL_UNIFORM_IS_ROW_MAJOR */ -/* reuse GL_UNIFORM_BLOCK_BINDING */ -/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ -/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_INVALID_INDEX */ -#endif - -#ifndef GL_VERSION_3_2 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* Reuse tokens from ARB_depth_clamp */ -/* reuse GL_DEPTH_CLAMP */ -/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ -/* Reuse tokens from ARB_fragment_coord_conventions (none) */ -/* Reuse tokens from ARB_provoking_vertex */ -/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -/* Reuse tokens from ARB_seamless_cube_map */ -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ -/* Reuse tokens from ARB_sync */ -/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ -/* reuse GL_OBJECT_TYPE */ -/* reuse GL_SYNC_CONDITION */ -/* reuse GL_SYNC_STATUS */ -/* reuse GL_SYNC_FLAGS */ -/* reuse GL_SYNC_FENCE */ -/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ -/* reuse GL_UNSIGNALED */ -/* reuse GL_SIGNALED */ -/* reuse GL_ALREADY_SIGNALED */ -/* reuse GL_TIMEOUT_EXPIRED */ -/* reuse GL_CONDITION_SATISFIED */ -/* reuse GL_WAIT_FAILED */ -/* reuse GL_TIMEOUT_IGNORED */ -/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ -/* reuse GL_TIMEOUT_IGNORED */ -/* Reuse tokens from ARB_texture_multisample */ -/* reuse GL_SAMPLE_POSITION */ -/* reuse GL_SAMPLE_MASK */ -/* reuse GL_SAMPLE_MASK_VALUE */ -/* reuse GL_MAX_SAMPLE_MASK_WORDS */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_SAMPLES */ -/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ -/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ -/* reuse GL_MAX_INTEGER_SAMPLES */ -/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -/* Reuse tokens from ARB_blend_func_extended */ -/* reuse GL_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_ALPHA */ -/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ -/* Reuse tokens from ARB_explicit_attrib_location (none) */ -/* Reuse tokens from ARB_occlusion_query2 */ -/* reuse GL_ANY_SAMPLES_PASSED */ -/* Reuse tokens from ARB_sampler_objects */ -/* reuse GL_SAMPLER_BINDING */ -/* Reuse tokens from ARB_shader_bit_encoding (none) */ -/* Reuse tokens from ARB_texture_rgb10_a2ui */ -/* reuse GL_RGB10_A2UI */ -/* Reuse tokens from ARB_texture_swizzle */ -/* reuse GL_TEXTURE_SWIZZLE_R */ -/* reuse GL_TEXTURE_SWIZZLE_G */ -/* reuse GL_TEXTURE_SWIZZLE_B */ -/* reuse GL_TEXTURE_SWIZZLE_A */ -/* reuse GL_TEXTURE_SWIZZLE_RGBA */ -/* Reuse tokens from ARB_timer_query */ -/* reuse GL_TIME_ELAPSED */ -/* reuse GL_TIMESTAMP */ -/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ -/* reuse GL_INT_2_10_10_10_REV */ -#endif - -#ifndef GL_VERSION_4_0 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -/* Reuse tokens from ARB_texture_query_lod (none) */ -/* Reuse tokens from ARB_draw_buffers_blend (none) */ -/* Reuse tokens from ARB_draw_indirect */ -/* reuse GL_DRAW_INDIRECT_BUFFER */ -/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_gpu_shader5 */ -/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ -/* Reuse tokens from ARB_gpu_shader_fp64 */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -/* Reuse tokens from ARB_shader_subroutine */ -/* reuse GL_ACTIVE_SUBROUTINES */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ -/* reuse GL_MAX_SUBROUTINES */ -/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -/* Reuse tokens from ARB_tessellation_shader */ -/* reuse GL_PATCHES */ -/* reuse GL_PATCH_VERTICES */ -/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ -/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ -/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ -/* reuse GL_TESS_GEN_MODE */ -/* reuse GL_TESS_GEN_SPACING */ -/* reuse GL_TESS_GEN_VERTEX_ORDER */ -/* reuse GL_TESS_GEN_POINT_MODE */ -/* reuse GL_ISOLINES */ -/* reuse GL_FRACTIONAL_ODD */ -/* reuse GL_FRACTIONAL_EVEN */ -/* reuse GL_MAX_PATCH_VERTICES */ -/* reuse GL_MAX_TESS_GEN_LEVEL */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_CONTROL_SHADER */ -/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ -/* Reuse tokens from ARB_transform_feedback2 */ -/* reuse GL_TRANSFORM_FEEDBACK */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ -/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ -/* Reuse tokens from ARB_transform_feedback3 */ -/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_VERSION_4_1 -/* Reuse tokens from ARB_ES2_compatibility */ -/* reuse GL_FIXED */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ -/* reuse GL_LOW_FLOAT */ -/* reuse GL_MEDIUM_FLOAT */ -/* reuse GL_HIGH_FLOAT */ -/* reuse GL_LOW_INT */ -/* reuse GL_MEDIUM_INT */ -/* reuse GL_HIGH_INT */ -/* reuse GL_SHADER_COMPILER */ -/* reuse GL_SHADER_BINARY_FORMATS */ -/* reuse GL_NUM_SHADER_BINARY_FORMATS */ -/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ -/* reuse GL_MAX_VARYING_VECTORS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ -/* reuse GL_RGB565 */ -/* Reuse tokens from ARB_get_program_binary */ -/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ -/* reuse GL_PROGRAM_BINARY_LENGTH */ -/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ -/* reuse GL_PROGRAM_BINARY_FORMATS */ -/* Reuse tokens from ARB_separate_shader_objects */ -/* reuse GL_VERTEX_SHADER_BIT */ -/* reuse GL_FRAGMENT_SHADER_BIT */ -/* reuse GL_GEOMETRY_SHADER_BIT */ -/* reuse GL_TESS_CONTROL_SHADER_BIT */ -/* reuse GL_TESS_EVALUATION_SHADER_BIT */ -/* reuse GL_ALL_SHADER_BITS */ -/* reuse GL_PROGRAM_SEPARABLE */ -/* reuse GL_ACTIVE_PROGRAM */ -/* reuse GL_PROGRAM_PIPELINE_BINDING */ -/* Reuse tokens from ARB_shader_precision (none) */ -/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ -/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ -/* reuse GL_MAX_VIEWPORTS */ -/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ -/* reuse GL_VIEWPORT_BOUNDS_RANGE */ -/* reuse GL_LAYER_PROVOKING_VERTEX */ -/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ -/* reuse GL_UNDEFINED_VERTEX */ -#endif - -#ifndef GL_VERSION_4_2 -/* Reuse tokens from ARB_base_instance (none) */ -/* Reuse tokens from ARB_shading_language_420pack (none) */ -/* Reuse tokens from ARB_transform_feedback_instanced (none) */ -/* Reuse tokens from ARB_compressed_texture_pixel_storage */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_DEPTH */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_SIZE */ -/* reuse GL_PACK_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_PACK_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_PACK_COMPRESSED_BLOCK_DEPTH */ -/* reuse GL_PACK_COMPRESSED_BLOCK_SIZE */ -/* Reuse tokens from ARB_conservative_depth (none) */ -/* Reuse tokens from ARB_internalformat_query */ -/* reuse GL_NUM_SAMPLE_COUNTS */ -/* Reuse tokens from ARB_map_buffer_alignment */ -/* reuse GL_MIN_MAP_BUFFER_ALIGNMENT */ -/* Reuse tokens from ARB_shader_atomic_counters */ -/* reuse GL_ATOMIC_COUNTER_BUFFER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_BINDING */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_START */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_SIZE */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_VERTEX_ATOMIC_COUNTERS */ -/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS */ -/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS */ -/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTERS */ -/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTERS */ -/* reuse GL_MAX_COMBINED_ATOMIC_COUNTERS */ -/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE */ -/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS */ -/* reuse GL_ACTIVE_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX */ -/* reuse GL_UNSIGNED_INT_ATOMIC_COUNTER */ -/* Reuse tokens from ARB_shader_image_load_store */ -/* reuse GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT */ -/* reuse GL_ELEMENT_ARRAY_BARRIER_BIT */ -/* reuse GL_UNIFORM_BARRIER_BIT */ -/* reuse GL_TEXTURE_FETCH_BARRIER_BIT */ -/* reuse GL_SHADER_IMAGE_ACCESS_BARRIER_BIT */ -/* reuse GL_COMMAND_BARRIER_BIT */ -/* reuse GL_PIXEL_BUFFER_BARRIER_BIT */ -/* reuse GL_TEXTURE_UPDATE_BARRIER_BIT */ -/* reuse GL_BUFFER_UPDATE_BARRIER_BIT */ -/* reuse GL_FRAMEBUFFER_BARRIER_BIT */ -/* reuse GL_TRANSFORM_FEEDBACK_BARRIER_BIT */ -/* reuse GL_ATOMIC_COUNTER_BARRIER_BIT */ -/* reuse GL_ALL_BARRIER_BITS */ -/* reuse GL_MAX_IMAGE_UNITS */ -/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */ -/* reuse GL_IMAGE_BINDING_NAME */ -/* reuse GL_IMAGE_BINDING_LEVEL */ -/* reuse GL_IMAGE_BINDING_LAYERED */ -/* reuse GL_IMAGE_BINDING_LAYER */ -/* reuse GL_IMAGE_BINDING_ACCESS */ -/* reuse GL_IMAGE_1D */ -/* reuse GL_IMAGE_2D */ -/* reuse GL_IMAGE_3D */ -/* reuse GL_IMAGE_2D_RECT */ -/* reuse GL_IMAGE_CUBE */ -/* reuse GL_IMAGE_BUFFER */ -/* reuse GL_IMAGE_1D_ARRAY */ -/* reuse GL_IMAGE_2D_ARRAY */ -/* reuse GL_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_IMAGE_1D */ -/* reuse GL_INT_IMAGE_2D */ -/* reuse GL_INT_IMAGE_3D */ -/* reuse GL_INT_IMAGE_2D_RECT */ -/* reuse GL_INT_IMAGE_CUBE */ -/* reuse GL_INT_IMAGE_BUFFER */ -/* reuse GL_INT_IMAGE_1D_ARRAY */ -/* reuse GL_INT_IMAGE_2D_ARRAY */ -/* reuse GL_INT_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_INT_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_1D */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D */ -/* reuse GL_UNSIGNED_INT_IMAGE_3D */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_RECT */ -/* reuse GL_UNSIGNED_INT_IMAGE_CUBE */ -/* reuse GL_UNSIGNED_INT_IMAGE_BUFFER */ -/* reuse GL_UNSIGNED_INT_IMAGE_1D_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_IMAGE_SAMPLES */ -/* reuse GL_IMAGE_BINDING_FORMAT */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS */ -/* reuse GL_MAX_VERTEX_IMAGE_UNIFORMS */ -/* reuse GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS */ -/* reuse GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS */ -/* reuse GL_MAX_GEOMETRY_IMAGE_UNIFORMS */ -/* reuse GL_MAX_FRAGMENT_IMAGE_UNIFORMS */ -/* reuse GL_MAX_COMBINED_IMAGE_UNIFORMS */ -/* Reuse tokens from ARB_shading_language_packing (none) */ -/* Reuse tokens from ARB_texture_storage */ -/* reuse GL_TEXTURE_IMMUTABLE_FORMAT */ -#endif - -#ifndef GL_VERSION_4_3 -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E -/* Reuse tokens from ARB_arrays_of_arrays (none, GLSL only) */ -/* Reuse tokens from ARB_fragment_layer_viewport (none, GLSL only) */ -/* Reuse tokens from ARB_shader_image_size (none, GLSL only) */ -/* Reuse tokens from ARB_ES3_compatibility */ -/* reuse GL_COMPRESSED_RGB8_ETC2 */ -/* reuse GL_COMPRESSED_SRGB8_ETC2 */ -/* reuse GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ -/* reuse GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ -/* reuse GL_COMPRESSED_RGBA8_ETC2_EAC */ -/* reuse GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC */ -/* reuse GL_COMPRESSED_R11_EAC */ -/* reuse GL_COMPRESSED_SIGNED_R11_EAC */ -/* reuse GL_COMPRESSED_RG11_EAC */ -/* reuse GL_COMPRESSED_SIGNED_RG11_EAC */ -/* reuse GL_PRIMITIVE_RESTART_FIXED_INDEX */ -/* reuse GL_ANY_SAMPLES_PASSED_CONSERVATIVE */ -/* reuse GL_MAX_ELEMENT_INDEX */ -/* Reuse tokens from ARB_clear_buffer_object (none) */ -/* Reuse tokens from ARB_compute_shader */ -/* reuse GL_COMPUTE_SHADER */ -/* reuse GL_MAX_COMPUTE_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_COMPUTE_IMAGE_UNIFORMS */ -/* reuse GL_MAX_COMPUTE_SHARED_MEMORY_SIZE */ -/* reuse GL_MAX_COMPUTE_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTERS */ -/* reuse GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMPUTE_LOCAL_INVOCATIONS */ -/* reuse GL_MAX_COMPUTE_WORK_GROUP_COUNT */ -/* reuse GL_MAX_COMPUTE_WORK_GROUP_SIZE */ -/* reuse GL_COMPUTE_LOCAL_WORK_SIZE */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_DISPATCH_INDIRECT_BUFFER */ -/* reuse GL_DISPATCH_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_copy_image (none) */ -/* Reuse tokens from KHR_debug */ -/* reuse GL_DEBUG_OUTPUT_SYNCHRONOUS */ -/* reuse GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH */ -/* reuse GL_DEBUG_CALLBACK_FUNCTION */ -/* reuse GL_DEBUG_CALLBACK_USER_PARAM */ -/* reuse GL_DEBUG_SOURCE_API */ -/* reuse GL_DEBUG_SOURCE_WINDOW_SYSTEM */ -/* reuse GL_DEBUG_SOURCE_SHADER_COMPILER */ -/* reuse GL_DEBUG_SOURCE_THIRD_PARTY */ -/* reuse GL_DEBUG_SOURCE_APPLICATION */ -/* reuse GL_DEBUG_SOURCE_OTHER */ -/* reuse GL_DEBUG_TYPE_ERROR */ -/* reuse GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR */ -/* reuse GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR */ -/* reuse GL_DEBUG_TYPE_PORTABILITY */ -/* reuse GL_DEBUG_TYPE_PERFORMANCE */ -/* reuse GL_DEBUG_TYPE_OTHER */ -/* reuse GL_MAX_DEBUG_MESSAGE_LENGTH */ -/* reuse GL_MAX_DEBUG_LOGGED_MESSAGES */ -/* reuse GL_DEBUG_LOGGED_MESSAGES */ -/* reuse GL_DEBUG_SEVERITY_HIGH */ -/* reuse GL_DEBUG_SEVERITY_MEDIUM */ -/* reuse GL_DEBUG_SEVERITY_LOW */ -/* reuse GL_DEBUG_TYPE_MARKER */ -/* reuse GL_DEBUG_TYPE_PUSH_GROUP */ -/* reuse GL_DEBUG_TYPE_POP_GROUP */ -/* reuse GL_DEBUG_SEVERITY_NOTIFICATION */ -/* reuse GL_MAX_DEBUG_GROUP_STACK_DEPTH */ -/* reuse GL_DEBUG_GROUP_STACK_DEPTH */ -/* reuse GL_BUFFER */ -/* reuse GL_SHADER */ -/* reuse GL_PROGRAM */ -/* reuse GL_QUERY */ -/* reuse GL_PROGRAM_PIPELINE */ -/* reuse GL_SAMPLER */ -/* reuse GL_DISPLAY_LIST */ -/* reuse GL_MAX_LABEL_LENGTH */ -/* reuse GL_DEBUG_OUTPUT */ -/* reuse GL_CONTEXT_FLAG_DEBUG_BIT */ -/* reuse GL_STACK_UNDERFLOW */ -/* reuse GL_STACK_OVERFLOW */ -/* Reuse tokens from ARB_explicit_uniform_location */ -/* reuse GL_MAX_UNIFORM_LOCATIONS */ -/* Reuse tokens from ARB_framebuffer_no_attachments */ -/* reuse GL_FRAMEBUFFER_DEFAULT_WIDTH */ -/* reuse GL_FRAMEBUFFER_DEFAULT_HEIGHT */ -/* reuse GL_FRAMEBUFFER_DEFAULT_LAYERS */ -/* reuse GL_FRAMEBUFFER_DEFAULT_SAMPLES */ -/* reuse GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_MAX_FRAMEBUFFER_WIDTH */ -/* reuse GL_MAX_FRAMEBUFFER_HEIGHT */ -/* reuse GL_MAX_FRAMEBUFFER_LAYERS */ -/* reuse GL_MAX_FRAMEBUFFER_SAMPLES */ -/* Reuse tokens from ARB_internalformat_query2 */ -/* reuse GL_INTERNALFORMAT_SUPPORTED */ -/* reuse GL_INTERNALFORMAT_PREFERRED */ -/* reuse GL_INTERNALFORMAT_RED_SIZE */ -/* reuse GL_INTERNALFORMAT_GREEN_SIZE */ -/* reuse GL_INTERNALFORMAT_BLUE_SIZE */ -/* reuse GL_INTERNALFORMAT_ALPHA_SIZE */ -/* reuse GL_INTERNALFORMAT_DEPTH_SIZE */ -/* reuse GL_INTERNALFORMAT_STENCIL_SIZE */ -/* reuse GL_INTERNALFORMAT_SHARED_SIZE */ -/* reuse GL_INTERNALFORMAT_RED_TYPE */ -/* reuse GL_INTERNALFORMAT_GREEN_TYPE */ -/* reuse GL_INTERNALFORMAT_BLUE_TYPE */ -/* reuse GL_INTERNALFORMAT_ALPHA_TYPE */ -/* reuse GL_INTERNALFORMAT_DEPTH_TYPE */ -/* reuse GL_INTERNALFORMAT_STENCIL_TYPE */ -/* reuse GL_MAX_WIDTH */ -/* reuse GL_MAX_HEIGHT */ -/* reuse GL_MAX_DEPTH */ -/* reuse GL_MAX_LAYERS */ -/* reuse GL_MAX_COMBINED_DIMENSIONS */ -/* reuse GL_COLOR_COMPONENTS */ -/* reuse GL_DEPTH_COMPONENTS */ -/* reuse GL_STENCIL_COMPONENTS */ -/* reuse GL_COLOR_RENDERABLE */ -/* reuse GL_DEPTH_RENDERABLE */ -/* reuse GL_STENCIL_RENDERABLE */ -/* reuse GL_FRAMEBUFFER_RENDERABLE */ -/* reuse GL_FRAMEBUFFER_RENDERABLE_LAYERED */ -/* reuse GL_FRAMEBUFFER_BLEND */ -/* reuse GL_READ_PIXELS */ -/* reuse GL_READ_PIXELS_FORMAT */ -/* reuse GL_READ_PIXELS_TYPE */ -/* reuse GL_TEXTURE_IMAGE_FORMAT */ -/* reuse GL_TEXTURE_IMAGE_TYPE */ -/* reuse GL_GET_TEXTURE_IMAGE_FORMAT */ -/* reuse GL_GET_TEXTURE_IMAGE_TYPE */ -/* reuse GL_MIPMAP */ -/* reuse GL_MANUAL_GENERATE_MIPMAP */ -/* reuse GL_AUTO_GENERATE_MIPMAP */ -/* reuse GL_COLOR_ENCODING */ -/* reuse GL_SRGB_READ */ -/* reuse GL_SRGB_WRITE */ -/* reuse GL_FILTER */ -/* reuse GL_VERTEX_TEXTURE */ -/* reuse GL_TESS_CONTROL_TEXTURE */ -/* reuse GL_TESS_EVALUATION_TEXTURE */ -/* reuse GL_GEOMETRY_TEXTURE */ -/* reuse GL_FRAGMENT_TEXTURE */ -/* reuse GL_COMPUTE_TEXTURE */ -/* reuse GL_TEXTURE_SHADOW */ -/* reuse GL_TEXTURE_GATHER */ -/* reuse GL_TEXTURE_GATHER_SHADOW */ -/* reuse GL_SHADER_IMAGE_LOAD */ -/* reuse GL_SHADER_IMAGE_STORE */ -/* reuse GL_SHADER_IMAGE_ATOMIC */ -/* reuse GL_IMAGE_TEXEL_SIZE */ -/* reuse GL_IMAGE_COMPATIBILITY_CLASS */ -/* reuse GL_IMAGE_PIXEL_FORMAT */ -/* reuse GL_IMAGE_PIXEL_TYPE */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_SIZE */ -/* reuse GL_CLEAR_BUFFER */ -/* reuse GL_TEXTURE_VIEW */ -/* reuse GL_VIEW_COMPATIBILITY_CLASS */ -/* reuse GL_FULL_SUPPORT */ -/* reuse GL_CAVEAT_SUPPORT */ -/* reuse GL_IMAGE_CLASS_4_X_32 */ -/* reuse GL_IMAGE_CLASS_2_X_32 */ -/* reuse GL_IMAGE_CLASS_1_X_32 */ -/* reuse GL_IMAGE_CLASS_4_X_16 */ -/* reuse GL_IMAGE_CLASS_2_X_16 */ -/* reuse GL_IMAGE_CLASS_1_X_16 */ -/* reuse GL_IMAGE_CLASS_4_X_8 */ -/* reuse GL_IMAGE_CLASS_2_X_8 */ -/* reuse GL_IMAGE_CLASS_1_X_8 */ -/* reuse GL_IMAGE_CLASS_11_11_10 */ -/* reuse GL_IMAGE_CLASS_10_10_10_2 */ -/* reuse GL_VIEW_CLASS_128_BITS */ -/* reuse GL_VIEW_CLASS_96_BITS */ -/* reuse GL_VIEW_CLASS_64_BITS */ -/* reuse GL_VIEW_CLASS_48_BITS */ -/* reuse GL_VIEW_CLASS_32_BITS */ -/* reuse GL_VIEW_CLASS_24_BITS */ -/* reuse GL_VIEW_CLASS_16_BITS */ -/* reuse GL_VIEW_CLASS_8_BITS */ -/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGB */ -/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGBA */ -/* reuse GL_VIEW_CLASS_S3TC_DXT3_RGBA */ -/* reuse GL_VIEW_CLASS_S3TC_DXT5_RGBA */ -/* reuse GL_VIEW_CLASS_RGTC1_RED */ -/* reuse GL_VIEW_CLASS_RGTC2_RG */ -/* reuse GL_VIEW_CLASS_BPTC_UNORM */ -/* reuse GL_VIEW_CLASS_BPTC_FLOAT */ -/* Reuse tokens from ARB_invalidate_subdata (none) */ -/* Reuse tokens from ARB_multi_draw_indirect (none) */ -/* Reuse tokens from ARB_program_interface_query */ -/* reuse GL_UNIFORM */ -/* reuse GL_UNIFORM_BLOCK */ -/* reuse GL_PROGRAM_INPUT */ -/* reuse GL_PROGRAM_OUTPUT */ -/* reuse GL_BUFFER_VARIABLE */ -/* reuse GL_SHADER_STORAGE_BLOCK */ -/* reuse GL_VERTEX_SUBROUTINE */ -/* reuse GL_TESS_CONTROL_SUBROUTINE */ -/* reuse GL_TESS_EVALUATION_SUBROUTINE */ -/* reuse GL_GEOMETRY_SUBROUTINE */ -/* reuse GL_FRAGMENT_SUBROUTINE */ -/* reuse GL_COMPUTE_SUBROUTINE */ -/* reuse GL_VERTEX_SUBROUTINE_UNIFORM */ -/* reuse GL_TESS_CONTROL_SUBROUTINE_UNIFORM */ -/* reuse GL_TESS_EVALUATION_SUBROUTINE_UNIFORM */ -/* reuse GL_GEOMETRY_SUBROUTINE_UNIFORM */ -/* reuse GL_FRAGMENT_SUBROUTINE_UNIFORM */ -/* reuse GL_COMPUTE_SUBROUTINE_UNIFORM */ -/* reuse GL_TRANSFORM_FEEDBACK_VARYING */ -/* reuse GL_ACTIVE_RESOURCES */ -/* reuse GL_MAX_NAME_LENGTH */ -/* reuse GL_MAX_NUM_ACTIVE_VARIABLES */ -/* reuse GL_MAX_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_NAME_LENGTH */ -/* reuse GL_TYPE */ -/* reuse GL_ARRAY_SIZE */ -/* reuse GL_OFFSET */ -/* reuse GL_BLOCK_INDEX */ -/* reuse GL_ARRAY_STRIDE */ -/* reuse GL_MATRIX_STRIDE */ -/* reuse GL_IS_ROW_MAJOR */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_INDEX */ -/* reuse GL_BUFFER_BINDING */ -/* reuse GL_BUFFER_DATA_SIZE */ -/* reuse GL_NUM_ACTIVE_VARIABLES */ -/* reuse GL_ACTIVE_VARIABLES */ -/* reuse GL_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_REFERENCED_BY_GEOMETRY_SHADER */ -/* reuse GL_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_TOP_LEVEL_ARRAY_SIZE */ -/* reuse GL_TOP_LEVEL_ARRAY_STRIDE */ -/* reuse GL_LOCATION */ -/* reuse GL_LOCATION_INDEX */ -/* reuse GL_IS_PER_PATCH */ -/* Reuse tokens from ARB_robust_buffer_access_behavior (none) */ -/* Reuse tokens from ARB_shader_storage_buffer_object */ -/* reuse GL_SHADER_STORAGE_BUFFER */ -/* reuse GL_SHADER_STORAGE_BUFFER_BINDING */ -/* reuse GL_SHADER_STORAGE_BUFFER_START */ -/* reuse GL_SHADER_STORAGE_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS */ -/* reuse GL_MAX_SHADER_STORAGE_BLOCK_SIZE */ -/* reuse GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_SHADER_STORAGE_BARRIER_BIT */ -/* reuse GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES */ -/* Reuse tokens from ARB_stencil_texturing */ -/* reuse GL_DEPTH_STENCIL_TEXTURE_MODE */ -/* Reuse tokens from ARB_texture_buffer_range */ -/* reuse GL_TEXTURE_BUFFER_OFFSET */ -/* reuse GL_TEXTURE_BUFFER_SIZE */ -/* reuse GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT */ -/* Reuse tokens from ARB_texture_query_levels (none) */ -/* Reuse tokens from ARB_texture_storage_multisample (none) */ -/* Reuse tokens from ARB_texture_view */ -/* reuse GL_TEXTURE_VIEW_MIN_LEVEL */ -/* reuse GL_TEXTURE_VIEW_NUM_LEVELS */ -/* reuse GL_TEXTURE_VIEW_MIN_LAYER */ -/* reuse GL_TEXTURE_VIEW_NUM_LAYERS */ -/* reuse GL_TEXTURE_IMMUTABLE_LEVELS */ -/* Reuse tokens from ARB_vertex_attrib_binding */ -/* reuse GL_VERTEX_ATTRIB_BINDING */ -/* reuse GL_VERTEX_ATTRIB_RELATIVE_OFFSET */ -/* reuse GL_VERTEX_BINDING_DIVISOR */ -/* reuse GL_VERTEX_BINDING_OFFSET */ -/* reuse GL_VERTEX_BINDING_STRIDE */ -/* reuse GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET */ -/* reuse GL_MAX_VERTEX_ATTRIB_BINDINGS */ -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_HALF_FLOAT 0x140B -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#endif - -#ifndef GL_ARB_texture_rg -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_DEPTH_CLAMP 0x864F -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#endif - -#ifndef GL_ARB_sync -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#endif - -#ifndef GL_ARB_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_ARB_draw_buffers_blend -#endif - -#ifndef GL_ARB_sample_shading -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif - -#ifndef GL_ARB_texture_gather -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F -#endif - -#ifndef GL_ARB_texture_query_lod -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_SRC1_COLOR 0x88F9 -/* reuse GL_SRC1_ALPHA */ -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#endif - -#ifndef GL_ARB_explicit_attrib_location -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_SAMPLER_BINDING 0x8919 -#endif - -#ifndef GL_ARB_shader_bit_encoding -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_RGB10_A2UI 0x906F -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#endif - -#ifndef GL_ARB_timer_query -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ -#define GL_INT_2_10_10_10_REV 0x8D9F -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -/* reuse GL_TRIANGLES */ -/* reuse GL_QUADS */ -#define GL_ISOLINES 0x8E7A -/* reuse GL_EQUAL */ -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -/* reuse GL_CCW */ -/* reuse GL_CW */ -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -/* reuse GL_RGB32F */ -/* reuse GL_RGB32UI */ -/* reuse GL_RGB32I */ -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_RGB565 0x8D62 -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#endif - -#ifndef GL_ARB_shader_precision -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -/* reuse GL_RGB32I */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -#endif - -#ifndef GL_ARB_viewport_array -/* reuse GL_SCISSOR_BOX */ -/* reuse GL_VIEWPORT */ -/* reuse GL_DEPTH_RANGE */ -/* reuse GL_SCISSOR_TEST */ -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -#endif - -#ifndef GL_ARB_cl_event -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -#endif - -#ifndef GL_ARB_debug_output -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -#endif - -#ifndef GL_ARB_robustness -/* reuse GL_NO_ERROR */ -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -#endif - -#ifndef GL_ARB_shader_stencil_export -#endif - -#ifndef GL_ARB_base_instance -#endif - -#ifndef GL_ARB_shading_language_420pack -#endif - -#ifndef GL_ARB_transform_feedback_instanced -#endif - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E -#endif - -#ifndef GL_ARB_conservative_depth -#endif - -#ifndef GL_ARB_internalformat_query -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#endif - -#ifndef GL_ARB_map_buffer_alignment -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC -#endif - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#endif - -#ifndef GL_ARB_shader_image_load_store -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#endif - -#ifndef GL_ARB_shading_language_packing -#endif - -#ifndef GL_ARB_texture_storage -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -#endif - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif - -#ifndef GL_KHR_debug -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_DISPLAY_LIST 0x82E7 -/* DISPLAY_LIST used in compatibility profile only */ -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -/* reuse GL_STACK_UNDERFLOW */ -/* reuse GL_STACK_OVERFLOW */ -#endif - -#ifndef GL_ARB_arrays_of_arrays -#endif - -#ifndef GL_ARB_clear_buffer_object -#endif - -#ifndef GL_ARB_compute_shader -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_LOCAL_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_LOCAL_WORK_SIZE 0x8267 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#endif - -#ifndef GL_ARB_copy_image -#endif - -#ifndef GL_ARB_texture_view -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#endif - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#endif - -#ifndef GL_ARB_robustness_isolation -#endif - -#ifndef GL_ARB_ES3_compatibility -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#endif - -#ifndef GL_ARB_explicit_uniform_location -#define GL_MAX_UNIFORM_LOCATIONS 0x826E -#endif - -#ifndef GL_ARB_fragment_layer_viewport -#endif - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#endif - -#ifndef GL_ARB_internalformat_query2 -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */ -/* reuse GL_NUM_SAMPLE_COUNTS */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_SAMPLES */ -/* reuse GL_TEXTURE_1D */ -/* reuse GL_TEXTURE_1D_ARRAY */ -/* reuse GL_TEXTURE_2D */ -/* reuse GL_TEXTURE_2D_ARRAY */ -/* reuse GL_TEXTURE_3D */ -/* reuse GL_TEXTURE_CUBE_MAP */ -/* reuse GL_TEXTURE_CUBE_MAP_ARRAY */ -/* reuse GL_TEXTURE_RECTANGLE */ -/* reuse GL_TEXTURE_BUFFER */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_COMPRESSED */ -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#endif - -#ifndef GL_ARB_invalidate_subdata -#endif - -#ifndef GL_ARB_multi_draw_indirect -#endif - -#ifndef GL_ARB_program_interface_query -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -/* reuse GL_ATOMIC_COUNTER_BUFFER */ -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F -#define GL_IS_PER_PATCH 0x92E7 -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -#endif - -#ifndef GL_ARB_robust_buffer_access_behavior -#endif - -#ifndef GL_ARB_shader_image_size -#endif - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF -#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */ -#endif - -#ifndef GL_ARB_stencil_texturing -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#endif - -#ifndef GL_ARB_texture_buffer_range -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F -#endif - -#ifndef GL_ARB_texture_query_levels -#endif - -#ifndef GL_ARB_texture_storage_multisample -#endif - - -/*************************************************************/ - -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; -#endif - -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; -#endif - -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for program/shader text and shader object handles */ -typedef char GLcharARB; -typedef unsigned int GLhandleARB; -#endif - -/* GL type for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GLEXT_64_TYPES_DEFINED -/* This code block is duplicated in glxext.h, so must be protected */ -#define GLEXT_64_TYPES_DEFINED -/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ -/* (as used in the GL_EXT_timer_query extension). */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#elif defined(__sun__) || defined(__digital__) -#include -#if defined(__STDC__) -#if defined(__arch64__) || defined(_LP64) -typedef long int int64_t; -typedef unsigned long int uint64_t; -#else -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#endif /* __arch64__ */ -#endif /* __STDC__ */ -#elif defined( __VMS ) || defined(__sgi) -#include -#elif defined(__SCO__) || defined(__USLC__) -#include -#elif defined(__UNIXOS2__) || defined(__SOL64__) -typedef long int int32_t; -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#elif defined(_WIN32) && defined(__GNUC__) -#include -#elif defined(_WIN32) -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -/* Fallback if nothing above works */ -#include -#endif -#endif - -#ifndef GL_EXT_timer_query -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif - -#ifndef GL_ARB_sync -typedef int64_t GLint64; -typedef uint64_t GLuint64; -typedef struct __GLsync *GLsync; -#endif - -#ifndef GL_ARB_cl_event -/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ -struct _cl_context; -struct _cl_event; -#endif - -#ifndef GL_ARB_debug_output -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_AMD_debug_output -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_KHR_debug -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_NV_vdpau_interop -typedef GLintptr GLvdpauSurfaceNV; -#endif - -#ifndef GL_OES_fixed_point -/* GLint must be 32 bits, a relatively safe assumption on modern CPUs */ -typedef GLint GLfixed; -#endif - -#ifndef GL_VERSION_1_0 -#define GL_VERSION_1_0 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glCullFace (GLenum mode); -GLAPI void APIENTRY glFrontFace (GLenum mode); -GLAPI void APIENTRY glHint (GLenum target, GLenum mode); -GLAPI void APIENTRY glLineWidth (GLfloat width); -GLAPI void APIENTRY glPointSize (GLfloat size); -GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glDrawBuffer (GLenum mode); -GLAPI void APIENTRY glClear (GLbitfield mask); -GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glClearStencil (GLint s); -GLAPI void APIENTRY glClearDepth (GLdouble depth); -GLAPI void APIENTRY glStencilMask (GLuint mask); -GLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void APIENTRY glDepthMask (GLboolean flag); -GLAPI void APIENTRY glDisable (GLenum cap); -GLAPI void APIENTRY glEnable (GLenum cap); -GLAPI void APIENTRY glFinish (void); -GLAPI void APIENTRY glFlush (void); -GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void APIENTRY glLogicOp (GLenum opcode); -GLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void APIENTRY glDepthFunc (GLenum func); -GLAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void APIENTRY glReadBuffer (GLenum mode); -GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -GLAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params); -GLAPI GLenum APIENTRY glGetError (void); -GLAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params); -GLAPI const GLubyte * APIENTRY glGetString (GLenum name); -GLAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap); -GLAPI void APIENTRY glDepthRange (GLdouble near, GLdouble far); -GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); -typedef void (APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); -typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size); -typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); -typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); -typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); -typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLFINISHPROC) (void); -typedef void (APIENTRYP PFNGLFLUSHPROC) (void); -typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); -typedef void (APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode); -typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); -typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); -typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLREADBUFFERPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *params); -typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *params); -typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void); -typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); -typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) (GLdouble near, GLdouble far); -typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTexture (GLuint texture); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -/* OpenGL 3.0 also reuses entry points from these extensions: */ -/* ARB_framebuffer_object */ -/* ARB_map_buffer_range */ -/* ARB_vertex_array_object */ -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -#endif - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -/* OpenGL 3.1 also reuses entry points from these extensions: */ -/* ARB_copy_buffer */ -/* ARB_uniform_buffer_object */ -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -#endif - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -/* OpenGL 3.2 also reuses entry points from these extensions: */ -/* ARB_draw_elements_base_vertex */ -/* ARB_provoking_vertex */ -/* ARB_sync */ -/* ARB_texture_multisample */ -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -/* OpenGL 3.3 also reuses entry points from these extensions: */ -/* ARB_blend_func_extended */ -/* ARB_sampler_objects */ -/* ARB_explicit_attrib_location, but it has none */ -/* ARB_occlusion_query2 (no entry points) */ -/* ARB_shader_bit_encoding (no entry points) */ -/* ARB_texture_rgb10_a2ui (no entry points) */ -/* ARB_texture_swizzle (no entry points) */ -/* ARB_timer_query */ -/* ARB_vertex_type_2_10_10_10_rev */ -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -/* OpenGL 4.0 also reuses entry points from these extensions: */ -/* ARB_texture_query_lod (no entry points) */ -/* ARB_draw_indirect */ -/* ARB_gpu_shader5 (no entry points) */ -/* ARB_gpu_shader_fp64 */ -/* ARB_shader_subroutine */ -/* ARB_tessellation_shader */ -/* ARB_texture_buffer_object_rgb32 (no entry points) */ -/* ARB_texture_cube_map_array (no entry points) */ -/* ARB_texture_gather (no entry points) */ -/* ARB_transform_feedback2 */ -/* ARB_transform_feedback3 */ -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLfloat value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -/* OpenGL 4.1 reuses entry points from these extensions: */ -/* ARB_ES2_compatibility */ -/* ARB_get_program_binary */ -/* ARB_separate_shader_objects */ -/* ARB_shader_precision (no entry points) */ -/* ARB_vertex_attrib_64bit */ -/* ARB_viewport_array */ -#endif - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 -/* OpenGL 4.2 reuses entry points from these extensions: */ -/* ARB_base_instance */ -/* ARB_shading_language_420pack (no entry points) */ -/* ARB_transform_feedback_instanced */ -/* ARB_compressed_texture_pixel_storage (no entry points) */ -/* ARB_conservative_depth (no entry points) */ -/* ARB_internalformat_query */ -/* ARB_map_buffer_alignment (no entry points) */ -/* ARB_shader_atomic_counters */ -/* ARB_shader_image_load_store */ -/* ARB_shading_language_packing (no entry points) */ -/* ARB_texture_storage */ -#endif - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 -/* OpenGL 4.3 reuses entry points from these extensions: */ -/* ARB_arrays_of_arrays (no entry points, GLSL only) */ -/* ARB_fragment_layer_viewport (no entry points, GLSL only) */ -/* ARB_shader_image_size (no entry points, GLSL only) */ -/* ARB_ES3_compatibility (no entry points) */ -/* ARB_clear_buffer_object */ -/* ARB_compute_shader */ -/* ARB_copy_image */ -/* KHR_debug (includes ARB_debug_output commands promoted to KHR without suffixes) */ -/* ARB_explicit_uniform_location (no entry points) */ -/* ARB_framebuffer_no_attachments */ -/* ARB_internalformat_query2 */ -/* ARB_invalidate_subdata */ -/* ARB_multi_draw_indirect */ -/* ARB_program_interface_query */ -/* ARB_robust_buffer_access_behavior (no entry points) */ -/* ARB_shader_storage_buffer_object */ -/* ARB_stencil_texturing (no entry points) */ -/* ARB_texture_buffer_range */ -/* ARB_texture_query_levels (no entry points) */ -/* ARB_texture_storage_multisample */ -/* ARB_texture_view */ -/* ARB_vertex_attrib_binding */ -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex); -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -#endif - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#endif - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#endif - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -#endif - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GLAPI void APIENTRY glClearDepthf (GLfloat d); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* const *strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* const *strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -#endif - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#endif - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#endif - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 -#endif - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); -GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 -#endif - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 -#endif - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 -#endif - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -#endif - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 -#endif - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI void APIENTRY glPopDebugGroup (void); -GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 -#endif - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data); -#endif - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -#endif - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -#endif - -#ifndef GL_ARB_robustness_isolation -#define GL_ARB_robustness_isolation 1 -#endif - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 -#endif - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 -#endif - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 -#endif - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -#endif - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); -GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); -GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#endif - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -#endif - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 -#endif - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 -#endif - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -#endif - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 -#endif - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 -#endif - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 -#ifdef GLCOREARB_PROTOTYPES -GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif /* GLCOREARB_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GL3/gl3w.c b/core/deps/khronos/GL3/gl3w.c deleted file mode 100644 index 99955fb26..000000000 --- a/core/deps/khronos/GL3/gl3w.c +++ /dev/null @@ -1,1375 +0,0 @@ -#include - -#if defined(USE_SDL) - #include - static void open_libgl(void) - { - SDL_GL_LoadLibrary(NULL); - } - - static void close_libgl(void) - { - SDL_GL_UnloadLibrary(); - } - - static void *get_proc(const char *proc) - { - void *res = NULL; - res = (void*)SDL_GL_GetProcAddress(proc); - return res; - } - -#elif defined(_WIN32) -#define WIN32_LEAN_AND_MEAN 1 -#include - -static HMODULE libgl; - -static void open_libgl(void) -{ - libgl = LoadLibraryA("opengl32.dll"); -} - -static void close_libgl(void) -{ - FreeLibrary(libgl); -} - -static void *get_proc(const char *proc) -{ - void *res; - - res = wglGetProcAddress(proc); - if (!res) - res = GetProcAddress(libgl, proc); - return res; -} -#elif defined(__APPLE__) || defined(__APPLE_CC__) -#include - -CFBundleRef bundle; -CFURLRef bundleURL; - -static void open_libgl(void) -{ - bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, - CFSTR("/System/Library/Frameworks/OpenGL.framework"), - kCFURLPOSIXPathStyle, true); - - bundle = CFBundleCreate(kCFAllocatorDefault, bundleURL); - assert(bundle != NULL); -} - -static void close_libgl(void) -{ - CFRelease(bundle); - CFRelease(bundleURL); -} - -static void *get_proc(const char *proc) -{ - void *res; - - CFStringRef procname = CFStringCreateWithCString(kCFAllocatorDefault, proc, - kCFStringEncodingASCII); - res = CFBundleGetFunctionPointerForName(bundle, procname); - CFRelease(procname); - return res; -} -#elif defined(__ANDROID__) -#include -#include - -static void open_libgl(void) -{ -} - -static void close_libgl(void) -{ -} - -static void *get_proc(const char *proc) -{ - return (void *)eglGetProcAddress(proc); -} -#else -#include -#include - -static void *libgl; - -static void open_libgl(void) -{ - libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); -} - -static void close_libgl(void) -{ - dlclose(libgl); -} - -static void *get_proc(const char *proc) -{ - void *res; - - res = (void*)glXGetProcAddress((const GLubyte *) proc); - if (!res) - res = dlsym(libgl, proc); - return res; -} -#endif - -static struct { - int major, minor; -} version; - -static int parse_version(void) -{ - if (!glGetIntegerv) - return -1; - - glGetIntegerv(GL_MAJOR_VERSION, &version.major); - glGetIntegerv(GL_MINOR_VERSION, &version.minor); - - printf("GL context version: %d.%d\n", version.major, version.minor); - if (version.major < 3) - return -1; - return 0; -} - -static void load_procs(void); - -int gl3wInit(void) -{ - open_libgl(); - load_procs(); - close_libgl(); - return parse_version(); -} - -int gl3wIsSupported(int major, int minor) -{ - if (major < 3) - return 0; - if (version.major == major) - return version.minor >= minor; - return version.major >= major; -} - -void *gl3wGetProcAddress(const char *proc) -{ - return get_proc(proc); -} - -PFNGLCULLFACEPROC gl3wCullFace; -PFNGLFRONTFACEPROC gl3wFrontFace; -PFNGLHINTPROC gl3wHint; -PFNGLLINEWIDTHPROC gl3wLineWidth; -PFNGLPOINTSIZEPROC gl3wPointSize; -PFNGLPOLYGONMODEPROC gl3wPolygonMode; -PFNGLSCISSORPROC gl3wScissor; -PFNGLTEXPARAMETERFPROC gl3wTexParameterf; -PFNGLTEXPARAMETERFVPROC gl3wTexParameterfv; -PFNGLTEXPARAMETERIPROC gl3wTexParameteri; -PFNGLTEXPARAMETERIVPROC gl3wTexParameteriv; -PFNGLTEXIMAGE1DPROC gl3wTexImage1D; -PFNGLTEXIMAGE2DPROC gl3wTexImage2D; -PFNGLDRAWBUFFERPROC gl3wDrawBuffer; -PFNGLCLEARPROC gl3wClear; -PFNGLCLEARCOLORPROC gl3wClearColor; -PFNGLCLEARSTENCILPROC gl3wClearStencil; -PFNGLCLEARDEPTHPROC gl3wClearDepth; -PFNGLSTENCILMASKPROC gl3wStencilMask; -PFNGLCOLORMASKPROC gl3wColorMask; -PFNGLDEPTHMASKPROC gl3wDepthMask; -PFNGLDISABLEPROC gl3wDisable; -PFNGLENABLEPROC gl3wEnable; -PFNGLFINISHPROC gl3wFinish; -PFNGLFLUSHPROC gl3wFlush; -PFNGLBLENDFUNCPROC gl3wBlendFunc; -PFNGLLOGICOPPROC gl3wLogicOp; -PFNGLSTENCILFUNCPROC gl3wStencilFunc; -PFNGLSTENCILOPPROC gl3wStencilOp; -PFNGLDEPTHFUNCPROC gl3wDepthFunc; -PFNGLPIXELSTOREFPROC gl3wPixelStoref; -PFNGLPIXELSTOREIPROC gl3wPixelStorei; -PFNGLREADBUFFERPROC gl3wReadBuffer; -PFNGLREADPIXELSPROC gl3wReadPixels; -PFNGLGETBOOLEANVPROC gl3wGetBooleanv; -PFNGLGETDOUBLEVPROC gl3wGetDoublev; -PFNGLGETERRORPROC gl3wGetError; -PFNGLGETFLOATVPROC gl3wGetFloatv; -PFNGLGETINTEGERVPROC gl3wGetIntegerv; -PFNGLGETSTRINGPROC gl3wGetString; -PFNGLGETTEXIMAGEPROC gl3wGetTexImage; -PFNGLGETTEXPARAMETERFVPROC gl3wGetTexParameterfv; -PFNGLGETTEXPARAMETERIVPROC gl3wGetTexParameteriv; -PFNGLGETTEXLEVELPARAMETERFVPROC gl3wGetTexLevelParameterfv; -PFNGLGETTEXLEVELPARAMETERIVPROC gl3wGetTexLevelParameteriv; -PFNGLISENABLEDPROC gl3wIsEnabled; -PFNGLDEPTHRANGEPROC gl3wDepthRange; -PFNGLVIEWPORTPROC gl3wViewport; -PFNGLDRAWARRAYSPROC gl3wDrawArrays; -PFNGLDRAWELEMENTSPROC gl3wDrawElements; -PFNGLGETPOINTERVPROC gl3wGetPointerv; -PFNGLPOLYGONOFFSETPROC gl3wPolygonOffset; -PFNGLCOPYTEXIMAGE1DPROC gl3wCopyTexImage1D; -PFNGLCOPYTEXIMAGE2DPROC gl3wCopyTexImage2D; -PFNGLCOPYTEXSUBIMAGE1DPROC gl3wCopyTexSubImage1D; -PFNGLCOPYTEXSUBIMAGE2DPROC gl3wCopyTexSubImage2D; -PFNGLTEXSUBIMAGE1DPROC gl3wTexSubImage1D; -PFNGLTEXSUBIMAGE2DPROC gl3wTexSubImage2D; -PFNGLBINDTEXTUREPROC gl3wBindTexture; -PFNGLDELETETEXTURESPROC gl3wDeleteTextures; -PFNGLGENTEXTURESPROC gl3wGenTextures; -PFNGLISTEXTUREPROC gl3wIsTexture; -PFNGLBLENDCOLORPROC gl3wBlendColor; -PFNGLBLENDEQUATIONPROC gl3wBlendEquation; -PFNGLDRAWRANGEELEMENTSPROC gl3wDrawRangeElements; -PFNGLTEXIMAGE3DPROC gl3wTexImage3D; -PFNGLTEXSUBIMAGE3DPROC gl3wTexSubImage3D; -PFNGLCOPYTEXSUBIMAGE3DPROC gl3wCopyTexSubImage3D; -PFNGLACTIVETEXTUREPROC gl3wActiveTexture; -PFNGLSAMPLECOVERAGEPROC gl3wSampleCoverage; -PFNGLCOMPRESSEDTEXIMAGE3DPROC gl3wCompressedTexImage3D; -PFNGLCOMPRESSEDTEXIMAGE2DPROC gl3wCompressedTexImage2D; -PFNGLCOMPRESSEDTEXIMAGE1DPROC gl3wCompressedTexImage1D; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC gl3wCompressedTexSubImage3D; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC gl3wCompressedTexSubImage2D; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC gl3wCompressedTexSubImage1D; -PFNGLGETCOMPRESSEDTEXIMAGEPROC gl3wGetCompressedTexImage; -PFNGLBLENDFUNCSEPARATEPROC gl3wBlendFuncSeparate; -PFNGLMULTIDRAWARRAYSPROC gl3wMultiDrawArrays; -PFNGLMULTIDRAWELEMENTSPROC gl3wMultiDrawElements; -PFNGLPOINTPARAMETERFPROC gl3wPointParameterf; -PFNGLPOINTPARAMETERFVPROC gl3wPointParameterfv; -PFNGLPOINTPARAMETERIPROC gl3wPointParameteri; -PFNGLPOINTPARAMETERIVPROC gl3wPointParameteriv; -PFNGLGENQUERIESPROC gl3wGenQueries; -PFNGLDELETEQUERIESPROC gl3wDeleteQueries; -PFNGLISQUERYPROC gl3wIsQuery; -PFNGLBEGINQUERYPROC gl3wBeginQuery; -PFNGLENDQUERYPROC gl3wEndQuery; -PFNGLGETQUERYIVPROC gl3wGetQueryiv; -PFNGLGETQUERYOBJECTIVPROC gl3wGetQueryObjectiv; -PFNGLGETQUERYOBJECTUIVPROC gl3wGetQueryObjectuiv; -PFNGLBINDBUFFERPROC gl3wBindBuffer; -PFNGLDELETEBUFFERSPROC gl3wDeleteBuffers; -PFNGLGENBUFFERSPROC gl3wGenBuffers; -PFNGLISBUFFERPROC gl3wIsBuffer; -PFNGLBUFFERDATAPROC gl3wBufferData; -PFNGLBUFFERSUBDATAPROC gl3wBufferSubData; -PFNGLGETBUFFERSUBDATAPROC gl3wGetBufferSubData; -PFNGLMAPBUFFERPROC gl3wMapBuffer; -PFNGLUNMAPBUFFERPROC gl3wUnmapBuffer; -PFNGLGETBUFFERPARAMETERIVPROC gl3wGetBufferParameteriv; -PFNGLGETBUFFERPOINTERVPROC gl3wGetBufferPointerv; -PFNGLBLENDEQUATIONSEPARATEPROC gl3wBlendEquationSeparate; -PFNGLDRAWBUFFERSPROC gl3wDrawBuffers; -PFNGLSTENCILOPSEPARATEPROC gl3wStencilOpSeparate; -PFNGLSTENCILFUNCSEPARATEPROC gl3wStencilFuncSeparate; -PFNGLSTENCILMASKSEPARATEPROC gl3wStencilMaskSeparate; -PFNGLATTACHSHADERPROC gl3wAttachShader; -PFNGLBINDATTRIBLOCATIONPROC gl3wBindAttribLocation; -PFNGLCOMPILESHADERPROC gl3wCompileShader; -PFNGLCREATEPROGRAMPROC gl3wCreateProgram; -PFNGLCREATESHADERPROC gl3wCreateShader; -PFNGLDELETEPROGRAMPROC gl3wDeleteProgram; -PFNGLDELETESHADERPROC gl3wDeleteShader; -PFNGLDETACHSHADERPROC gl3wDetachShader; -PFNGLDISABLEVERTEXATTRIBARRAYPROC gl3wDisableVertexAttribArray; -PFNGLENABLEVERTEXATTRIBARRAYPROC gl3wEnableVertexAttribArray; -PFNGLGETACTIVEATTRIBPROC gl3wGetActiveAttrib; -PFNGLGETACTIVEUNIFORMPROC gl3wGetActiveUniform; -PFNGLGETATTACHEDSHADERSPROC gl3wGetAttachedShaders; -PFNGLGETATTRIBLOCATIONPROC gl3wGetAttribLocation; -PFNGLGETPROGRAMIVPROC gl3wGetProgramiv; -PFNGLGETPROGRAMINFOLOGPROC gl3wGetProgramInfoLog; -PFNGLGETSHADERIVPROC gl3wGetShaderiv; -PFNGLGETSHADERINFOLOGPROC gl3wGetShaderInfoLog; -PFNGLGETSHADERSOURCEPROC gl3wGetShaderSource; -PFNGLGETUNIFORMLOCATIONPROC gl3wGetUniformLocation; -PFNGLGETUNIFORMFVPROC gl3wGetUniformfv; -PFNGLGETUNIFORMIVPROC gl3wGetUniformiv; -PFNGLGETVERTEXATTRIBDVPROC gl3wGetVertexAttribdv; -PFNGLGETVERTEXATTRIBFVPROC gl3wGetVertexAttribfv; -PFNGLGETVERTEXATTRIBIVPROC gl3wGetVertexAttribiv; -PFNGLGETVERTEXATTRIBPOINTERVPROC gl3wGetVertexAttribPointerv; -PFNGLISPROGRAMPROC gl3wIsProgram; -PFNGLISSHADERPROC gl3wIsShader; -PFNGLLINKPROGRAMPROC gl3wLinkProgram; -PFNGLSHADERSOURCEPROC gl3wShaderSource; -PFNGLUSEPROGRAMPROC gl3wUseProgram; -PFNGLUNIFORM1FPROC gl3wUniform1f; -PFNGLUNIFORM2FPROC gl3wUniform2f; -PFNGLUNIFORM3FPROC gl3wUniform3f; -PFNGLUNIFORM4FPROC gl3wUniform4f; -PFNGLUNIFORM1IPROC gl3wUniform1i; -PFNGLUNIFORM2IPROC gl3wUniform2i; -PFNGLUNIFORM3IPROC gl3wUniform3i; -PFNGLUNIFORM4IPROC gl3wUniform4i; -PFNGLUNIFORM1FVPROC gl3wUniform1fv; -PFNGLUNIFORM2FVPROC gl3wUniform2fv; -PFNGLUNIFORM3FVPROC gl3wUniform3fv; -PFNGLUNIFORM4FVPROC gl3wUniform4fv; -PFNGLUNIFORM1IVPROC gl3wUniform1iv; -PFNGLUNIFORM2IVPROC gl3wUniform2iv; -PFNGLUNIFORM3IVPROC gl3wUniform3iv; -PFNGLUNIFORM4IVPROC gl3wUniform4iv; -PFNGLUNIFORMMATRIX2FVPROC gl3wUniformMatrix2fv; -PFNGLUNIFORMMATRIX3FVPROC gl3wUniformMatrix3fv; -PFNGLUNIFORMMATRIX4FVPROC gl3wUniformMatrix4fv; -PFNGLVALIDATEPROGRAMPROC gl3wValidateProgram; -PFNGLVERTEXATTRIB1DPROC gl3wVertexAttrib1d; -PFNGLVERTEXATTRIB1DVPROC gl3wVertexAttrib1dv; -PFNGLVERTEXATTRIB1FPROC gl3wVertexAttrib1f; -PFNGLVERTEXATTRIB1FVPROC gl3wVertexAttrib1fv; -PFNGLVERTEXATTRIB1SPROC gl3wVertexAttrib1s; -PFNGLVERTEXATTRIB1SVPROC gl3wVertexAttrib1sv; -PFNGLVERTEXATTRIB2DPROC gl3wVertexAttrib2d; -PFNGLVERTEXATTRIB2DVPROC gl3wVertexAttrib2dv; -PFNGLVERTEXATTRIB2FPROC gl3wVertexAttrib2f; -PFNGLVERTEXATTRIB2FVPROC gl3wVertexAttrib2fv; -PFNGLVERTEXATTRIB2SPROC gl3wVertexAttrib2s; -PFNGLVERTEXATTRIB2SVPROC gl3wVertexAttrib2sv; -PFNGLVERTEXATTRIB3DPROC gl3wVertexAttrib3d; -PFNGLVERTEXATTRIB3DVPROC gl3wVertexAttrib3dv; -PFNGLVERTEXATTRIB3FPROC gl3wVertexAttrib3f; -PFNGLVERTEXATTRIB3FVPROC gl3wVertexAttrib3fv; -PFNGLVERTEXATTRIB3SPROC gl3wVertexAttrib3s; -PFNGLVERTEXATTRIB3SVPROC gl3wVertexAttrib3sv; -PFNGLVERTEXATTRIB4NBVPROC gl3wVertexAttrib4Nbv; -PFNGLVERTEXATTRIB4NIVPROC gl3wVertexAttrib4Niv; -PFNGLVERTEXATTRIB4NSVPROC gl3wVertexAttrib4Nsv; -PFNGLVERTEXATTRIB4NUBPROC gl3wVertexAttrib4Nub; -PFNGLVERTEXATTRIB4NUBVPROC gl3wVertexAttrib4Nubv; -PFNGLVERTEXATTRIB4NUIVPROC gl3wVertexAttrib4Nuiv; -PFNGLVERTEXATTRIB4NUSVPROC gl3wVertexAttrib4Nusv; -PFNGLVERTEXATTRIB4BVPROC gl3wVertexAttrib4bv; -PFNGLVERTEXATTRIB4DPROC gl3wVertexAttrib4d; -PFNGLVERTEXATTRIB4DVPROC gl3wVertexAttrib4dv; -PFNGLVERTEXATTRIB4FPROC gl3wVertexAttrib4f; -PFNGLVERTEXATTRIB4FVPROC gl3wVertexAttrib4fv; -PFNGLVERTEXATTRIB4IVPROC gl3wVertexAttrib4iv; -PFNGLVERTEXATTRIB4SPROC gl3wVertexAttrib4s; -PFNGLVERTEXATTRIB4SVPROC gl3wVertexAttrib4sv; -PFNGLVERTEXATTRIB4UBVPROC gl3wVertexAttrib4ubv; -PFNGLVERTEXATTRIB4UIVPROC gl3wVertexAttrib4uiv; -PFNGLVERTEXATTRIB4USVPROC gl3wVertexAttrib4usv; -PFNGLVERTEXATTRIBPOINTERPROC gl3wVertexAttribPointer; -PFNGLUNIFORMMATRIX2X3FVPROC gl3wUniformMatrix2x3fv; -PFNGLUNIFORMMATRIX3X2FVPROC gl3wUniformMatrix3x2fv; -PFNGLUNIFORMMATRIX2X4FVPROC gl3wUniformMatrix2x4fv; -PFNGLUNIFORMMATRIX4X2FVPROC gl3wUniformMatrix4x2fv; -PFNGLUNIFORMMATRIX3X4FVPROC gl3wUniformMatrix3x4fv; -PFNGLUNIFORMMATRIX4X3FVPROC gl3wUniformMatrix4x3fv; -PFNGLCOLORMASKIPROC gl3wColorMaski; -PFNGLGETBOOLEANI_VPROC gl3wGetBooleani_v; -PFNGLGETINTEGERI_VPROC gl3wGetIntegeri_v; -PFNGLENABLEIPROC gl3wEnablei; -PFNGLDISABLEIPROC gl3wDisablei; -PFNGLISENABLEDIPROC gl3wIsEnabledi; -PFNGLBEGINTRANSFORMFEEDBACKPROC gl3wBeginTransformFeedback; -PFNGLENDTRANSFORMFEEDBACKPROC gl3wEndTransformFeedback; -PFNGLBINDBUFFERRANGEPROC gl3wBindBufferRange; -PFNGLBINDBUFFERBASEPROC gl3wBindBufferBase; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC gl3wTransformFeedbackVaryings; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC gl3wGetTransformFeedbackVarying; -PFNGLCLAMPCOLORPROC gl3wClampColor; -PFNGLBEGINCONDITIONALRENDERPROC gl3wBeginConditionalRender; -PFNGLENDCONDITIONALRENDERPROC gl3wEndConditionalRender; -PFNGLVERTEXATTRIBIPOINTERPROC gl3wVertexAttribIPointer; -PFNGLGETVERTEXATTRIBIIVPROC gl3wGetVertexAttribIiv; -PFNGLGETVERTEXATTRIBIUIVPROC gl3wGetVertexAttribIuiv; -PFNGLVERTEXATTRIBI1IPROC gl3wVertexAttribI1i; -PFNGLVERTEXATTRIBI2IPROC gl3wVertexAttribI2i; -PFNGLVERTEXATTRIBI3IPROC gl3wVertexAttribI3i; -PFNGLVERTEXATTRIBI4IPROC gl3wVertexAttribI4i; -PFNGLVERTEXATTRIBI1UIPROC gl3wVertexAttribI1ui; -PFNGLVERTEXATTRIBI2UIPROC gl3wVertexAttribI2ui; -PFNGLVERTEXATTRIBI3UIPROC gl3wVertexAttribI3ui; -PFNGLVERTEXATTRIBI4UIPROC gl3wVertexAttribI4ui; -PFNGLVERTEXATTRIBI1IVPROC gl3wVertexAttribI1iv; -PFNGLVERTEXATTRIBI2IVPROC gl3wVertexAttribI2iv; -PFNGLVERTEXATTRIBI3IVPROC gl3wVertexAttribI3iv; -PFNGLVERTEXATTRIBI4IVPROC gl3wVertexAttribI4iv; -PFNGLVERTEXATTRIBI1UIVPROC gl3wVertexAttribI1uiv; -PFNGLVERTEXATTRIBI2UIVPROC gl3wVertexAttribI2uiv; -PFNGLVERTEXATTRIBI3UIVPROC gl3wVertexAttribI3uiv; -PFNGLVERTEXATTRIBI4UIVPROC gl3wVertexAttribI4uiv; -PFNGLVERTEXATTRIBI4BVPROC gl3wVertexAttribI4bv; -PFNGLVERTEXATTRIBI4SVPROC gl3wVertexAttribI4sv; -PFNGLVERTEXATTRIBI4UBVPROC gl3wVertexAttribI4ubv; -PFNGLVERTEXATTRIBI4USVPROC gl3wVertexAttribI4usv; -PFNGLGETUNIFORMUIVPROC gl3wGetUniformuiv; -PFNGLBINDFRAGDATALOCATIONPROC gl3wBindFragDataLocation; -PFNGLGETFRAGDATALOCATIONPROC gl3wGetFragDataLocation; -PFNGLUNIFORM1UIPROC gl3wUniform1ui; -PFNGLUNIFORM2UIPROC gl3wUniform2ui; -PFNGLUNIFORM3UIPROC gl3wUniform3ui; -PFNGLUNIFORM4UIPROC gl3wUniform4ui; -PFNGLUNIFORM1UIVPROC gl3wUniform1uiv; -PFNGLUNIFORM2UIVPROC gl3wUniform2uiv; -PFNGLUNIFORM3UIVPROC gl3wUniform3uiv; -PFNGLUNIFORM4UIVPROC gl3wUniform4uiv; -PFNGLTEXPARAMETERIIVPROC gl3wTexParameterIiv; -PFNGLTEXPARAMETERIUIVPROC gl3wTexParameterIuiv; -PFNGLGETTEXPARAMETERIIVPROC gl3wGetTexParameterIiv; -PFNGLGETTEXPARAMETERIUIVPROC gl3wGetTexParameterIuiv; -PFNGLCLEARBUFFERIVPROC gl3wClearBufferiv; -PFNGLCLEARBUFFERUIVPROC gl3wClearBufferuiv; -PFNGLCLEARBUFFERFVPROC gl3wClearBufferfv; -PFNGLCLEARBUFFERFIPROC gl3wClearBufferfi; -PFNGLGETSTRINGIPROC gl3wGetStringi; -PFNGLDRAWARRAYSINSTANCEDPROC gl3wDrawArraysInstanced; -PFNGLDRAWELEMENTSINSTANCEDPROC gl3wDrawElementsInstanced; -PFNGLTEXBUFFERPROC gl3wTexBuffer; -PFNGLPRIMITIVERESTARTINDEXPROC gl3wPrimitiveRestartIndex; -PFNGLGETINTEGER64I_VPROC gl3wGetInteger64i_v; -PFNGLGETBUFFERPARAMETERI64VPROC gl3wGetBufferParameteri64v; -PFNGLFRAMEBUFFERTEXTUREPROC gl3wFramebufferTexture; -PFNGLVERTEXATTRIBDIVISORPROC gl3wVertexAttribDivisor; -PFNGLMINSAMPLESHADINGPROC gl3wMinSampleShading; -PFNGLBLENDEQUATIONIPROC gl3wBlendEquationi; -PFNGLBLENDEQUATIONSEPARATEIPROC gl3wBlendEquationSeparatei; -PFNGLBLENDFUNCIPROC gl3wBlendFunci; -PFNGLBLENDFUNCSEPARATEIPROC gl3wBlendFuncSeparatei; -PFNGLISRENDERBUFFERPROC gl3wIsRenderbuffer; -PFNGLBINDRENDERBUFFERPROC gl3wBindRenderbuffer; -PFNGLDELETERENDERBUFFERSPROC gl3wDeleteRenderbuffers; -PFNGLGENRENDERBUFFERSPROC gl3wGenRenderbuffers; -PFNGLRENDERBUFFERSTORAGEPROC gl3wRenderbufferStorage; -PFNGLGETRENDERBUFFERPARAMETERIVPROC gl3wGetRenderbufferParameteriv; -PFNGLISFRAMEBUFFERPROC gl3wIsFramebuffer; -PFNGLBINDFRAMEBUFFERPROC gl3wBindFramebuffer; -PFNGLDELETEFRAMEBUFFERSPROC gl3wDeleteFramebuffers; -PFNGLGENFRAMEBUFFERSPROC gl3wGenFramebuffers; -PFNGLCHECKFRAMEBUFFERSTATUSPROC gl3wCheckFramebufferStatus; -PFNGLFRAMEBUFFERTEXTURE1DPROC gl3wFramebufferTexture1D; -PFNGLFRAMEBUFFERTEXTURE2DPROC gl3wFramebufferTexture2D; -PFNGLFRAMEBUFFERTEXTURE3DPROC gl3wFramebufferTexture3D; -PFNGLFRAMEBUFFERRENDERBUFFERPROC gl3wFramebufferRenderbuffer; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC gl3wGetFramebufferAttachmentParameteriv; -PFNGLGENERATEMIPMAPPROC gl3wGenerateMipmap; -PFNGLBLITFRAMEBUFFERPROC gl3wBlitFramebuffer; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC gl3wRenderbufferStorageMultisample; -PFNGLFRAMEBUFFERTEXTURELAYERPROC gl3wFramebufferTextureLayer; -PFNGLMAPBUFFERRANGEPROC gl3wMapBufferRange; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl3wFlushMappedBufferRange; -PFNGLBINDVERTEXARRAYPROC gl3wBindVertexArray; -PFNGLDELETEVERTEXARRAYSPROC gl3wDeleteVertexArrays; -PFNGLGENVERTEXARRAYSPROC gl3wGenVertexArrays; -PFNGLISVERTEXARRAYPROC gl3wIsVertexArray; -PFNGLGETUNIFORMINDICESPROC gl3wGetUniformIndices; -PFNGLGETACTIVEUNIFORMSIVPROC gl3wGetActiveUniformsiv; -PFNGLGETACTIVEUNIFORMNAMEPROC gl3wGetActiveUniformName; -PFNGLGETUNIFORMBLOCKINDEXPROC gl3wGetUniformBlockIndex; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC gl3wGetActiveUniformBlockiv; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC gl3wGetActiveUniformBlockName; -PFNGLUNIFORMBLOCKBINDINGPROC gl3wUniformBlockBinding; -PFNGLCOPYBUFFERSUBDATAPROC gl3wCopyBufferSubData; -PFNGLDRAWELEMENTSBASEVERTEXPROC gl3wDrawElementsBaseVertex; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC gl3wDrawRangeElementsBaseVertex; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC gl3wDrawElementsInstancedBaseVertex; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC gl3wMultiDrawElementsBaseVertex; -PFNGLPROVOKINGVERTEXPROC gl3wProvokingVertex; -PFNGLFENCESYNCPROC gl3wFenceSync; -PFNGLISSYNCPROC gl3wIsSync; -PFNGLDELETESYNCPROC gl3wDeleteSync; -PFNGLCLIENTWAITSYNCPROC gl3wClientWaitSync; -PFNGLWAITSYNCPROC gl3wWaitSync; -PFNGLGETINTEGER64VPROC gl3wGetInteger64v; -PFNGLGETSYNCIVPROC gl3wGetSynciv; -PFNGLTEXIMAGE2DMULTISAMPLEPROC gl3wTexImage2DMultisample; -PFNGLTEXIMAGE3DMULTISAMPLEPROC gl3wTexImage3DMultisample; -PFNGLGETMULTISAMPLEFVPROC gl3wGetMultisamplefv; -PFNGLSAMPLEMASKIPROC gl3wSampleMaski; -PFNGLBLENDEQUATIONIARBPROC gl3wBlendEquationiARB; -PFNGLBLENDEQUATIONSEPARATEIARBPROC gl3wBlendEquationSeparateiARB; -PFNGLBLENDFUNCIARBPROC gl3wBlendFunciARB; -PFNGLBLENDFUNCSEPARATEIARBPROC gl3wBlendFuncSeparateiARB; -PFNGLMINSAMPLESHADINGARBPROC gl3wMinSampleShadingARB; -PFNGLNAMEDSTRINGARBPROC gl3wNamedStringARB; -PFNGLDELETENAMEDSTRINGARBPROC gl3wDeleteNamedStringARB; -PFNGLCOMPILESHADERINCLUDEARBPROC gl3wCompileShaderIncludeARB; -PFNGLISNAMEDSTRINGARBPROC gl3wIsNamedStringARB; -PFNGLGETNAMEDSTRINGARBPROC gl3wGetNamedStringARB; -PFNGLGETNAMEDSTRINGIVARBPROC gl3wGetNamedStringivARB; -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC gl3wBindFragDataLocationIndexed; -PFNGLGETFRAGDATAINDEXPROC gl3wGetFragDataIndex; -PFNGLGENSAMPLERSPROC gl3wGenSamplers; -PFNGLDELETESAMPLERSPROC gl3wDeleteSamplers; -PFNGLISSAMPLERPROC gl3wIsSampler; -PFNGLBINDSAMPLERPROC gl3wBindSampler; -PFNGLSAMPLERPARAMETERIPROC gl3wSamplerParameteri; -PFNGLSAMPLERPARAMETERIVPROC gl3wSamplerParameteriv; -PFNGLSAMPLERPARAMETERFPROC gl3wSamplerParameterf; -PFNGLSAMPLERPARAMETERFVPROC gl3wSamplerParameterfv; -PFNGLSAMPLERPARAMETERIIVPROC gl3wSamplerParameterIiv; -PFNGLSAMPLERPARAMETERIUIVPROC gl3wSamplerParameterIuiv; -PFNGLGETSAMPLERPARAMETERIVPROC gl3wGetSamplerParameteriv; -PFNGLGETSAMPLERPARAMETERIIVPROC gl3wGetSamplerParameterIiv; -PFNGLGETSAMPLERPARAMETERFVPROC gl3wGetSamplerParameterfv; -PFNGLGETSAMPLERPARAMETERIUIVPROC gl3wGetSamplerParameterIuiv; -PFNGLQUERYCOUNTERPROC gl3wQueryCounter; -PFNGLGETQUERYOBJECTI64VPROC gl3wGetQueryObjecti64v; -PFNGLGETQUERYOBJECTUI64VPROC gl3wGetQueryObjectui64v; -PFNGLVERTEXP2UIPROC gl3wVertexP2ui; -PFNGLVERTEXP2UIVPROC gl3wVertexP2uiv; -PFNGLVERTEXP3UIPROC gl3wVertexP3ui; -PFNGLVERTEXP3UIVPROC gl3wVertexP3uiv; -PFNGLVERTEXP4UIPROC gl3wVertexP4ui; -PFNGLVERTEXP4UIVPROC gl3wVertexP4uiv; -PFNGLTEXCOORDP1UIPROC gl3wTexCoordP1ui; -PFNGLTEXCOORDP1UIVPROC gl3wTexCoordP1uiv; -PFNGLTEXCOORDP2UIPROC gl3wTexCoordP2ui; -PFNGLTEXCOORDP2UIVPROC gl3wTexCoordP2uiv; -PFNGLTEXCOORDP3UIPROC gl3wTexCoordP3ui; -PFNGLTEXCOORDP3UIVPROC gl3wTexCoordP3uiv; -PFNGLTEXCOORDP4UIPROC gl3wTexCoordP4ui; -PFNGLTEXCOORDP4UIVPROC gl3wTexCoordP4uiv; -PFNGLMULTITEXCOORDP1UIPROC gl3wMultiTexCoordP1ui; -PFNGLMULTITEXCOORDP1UIVPROC gl3wMultiTexCoordP1uiv; -PFNGLMULTITEXCOORDP2UIPROC gl3wMultiTexCoordP2ui; -PFNGLMULTITEXCOORDP2UIVPROC gl3wMultiTexCoordP2uiv; -PFNGLMULTITEXCOORDP3UIPROC gl3wMultiTexCoordP3ui; -PFNGLMULTITEXCOORDP3UIVPROC gl3wMultiTexCoordP3uiv; -PFNGLMULTITEXCOORDP4UIPROC gl3wMultiTexCoordP4ui; -PFNGLMULTITEXCOORDP4UIVPROC gl3wMultiTexCoordP4uiv; -PFNGLNORMALP3UIPROC gl3wNormalP3ui; -PFNGLNORMALP3UIVPROC gl3wNormalP3uiv; -PFNGLCOLORP3UIPROC gl3wColorP3ui; -PFNGLCOLORP3UIVPROC gl3wColorP3uiv; -PFNGLCOLORP4UIPROC gl3wColorP4ui; -PFNGLCOLORP4UIVPROC gl3wColorP4uiv; -PFNGLSECONDARYCOLORP3UIPROC gl3wSecondaryColorP3ui; -PFNGLSECONDARYCOLORP3UIVPROC gl3wSecondaryColorP3uiv; -PFNGLVERTEXATTRIBP1UIPROC gl3wVertexAttribP1ui; -PFNGLVERTEXATTRIBP1UIVPROC gl3wVertexAttribP1uiv; -PFNGLVERTEXATTRIBP2UIPROC gl3wVertexAttribP2ui; -PFNGLVERTEXATTRIBP2UIVPROC gl3wVertexAttribP2uiv; -PFNGLVERTEXATTRIBP3UIPROC gl3wVertexAttribP3ui; -PFNGLVERTEXATTRIBP3UIVPROC gl3wVertexAttribP3uiv; -PFNGLVERTEXATTRIBP4UIPROC gl3wVertexAttribP4ui; -PFNGLVERTEXATTRIBP4UIVPROC gl3wVertexAttribP4uiv; -PFNGLDRAWARRAYSINDIRECTPROC gl3wDrawArraysIndirect; -PFNGLDRAWELEMENTSINDIRECTPROC gl3wDrawElementsIndirect; -PFNGLUNIFORM1DPROC gl3wUniform1d; -PFNGLUNIFORM2DPROC gl3wUniform2d; -PFNGLUNIFORM3DPROC gl3wUniform3d; -PFNGLUNIFORM4DPROC gl3wUniform4d; -PFNGLUNIFORM1DVPROC gl3wUniform1dv; -PFNGLUNIFORM2DVPROC gl3wUniform2dv; -PFNGLUNIFORM3DVPROC gl3wUniform3dv; -PFNGLUNIFORM4DVPROC gl3wUniform4dv; -PFNGLUNIFORMMATRIX2DVPROC gl3wUniformMatrix2dv; -PFNGLUNIFORMMATRIX3DVPROC gl3wUniformMatrix3dv; -PFNGLUNIFORMMATRIX4DVPROC gl3wUniformMatrix4dv; -PFNGLUNIFORMMATRIX2X3DVPROC gl3wUniformMatrix2x3dv; -PFNGLUNIFORMMATRIX2X4DVPROC gl3wUniformMatrix2x4dv; -PFNGLUNIFORMMATRIX3X2DVPROC gl3wUniformMatrix3x2dv; -PFNGLUNIFORMMATRIX3X4DVPROC gl3wUniformMatrix3x4dv; -PFNGLUNIFORMMATRIX4X2DVPROC gl3wUniformMatrix4x2dv; -PFNGLUNIFORMMATRIX4X3DVPROC gl3wUniformMatrix4x3dv; -PFNGLGETUNIFORMDVPROC gl3wGetUniformdv; -PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC gl3wGetSubroutineUniformLocation; -PFNGLGETSUBROUTINEINDEXPROC gl3wGetSubroutineIndex; -PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC gl3wGetActiveSubroutineUniformiv; -PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC gl3wGetActiveSubroutineUniformName; -PFNGLGETACTIVESUBROUTINENAMEPROC gl3wGetActiveSubroutineName; -PFNGLUNIFORMSUBROUTINESUIVPROC gl3wUniformSubroutinesuiv; -PFNGLGETUNIFORMSUBROUTINEUIVPROC gl3wGetUniformSubroutineuiv; -PFNGLGETPROGRAMSTAGEIVPROC gl3wGetProgramStageiv; -PFNGLPATCHPARAMETERIPROC gl3wPatchParameteri; -PFNGLPATCHPARAMETERFVPROC gl3wPatchParameterfv; -PFNGLBINDTRANSFORMFEEDBACKPROC gl3wBindTransformFeedback; -PFNGLDELETETRANSFORMFEEDBACKSPROC gl3wDeleteTransformFeedbacks; -PFNGLGENTRANSFORMFEEDBACKSPROC gl3wGenTransformFeedbacks; -PFNGLISTRANSFORMFEEDBACKPROC gl3wIsTransformFeedback; -PFNGLPAUSETRANSFORMFEEDBACKPROC gl3wPauseTransformFeedback; -PFNGLRESUMETRANSFORMFEEDBACKPROC gl3wResumeTransformFeedback; -PFNGLDRAWTRANSFORMFEEDBACKPROC gl3wDrawTransformFeedback; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC gl3wDrawTransformFeedbackStream; -PFNGLBEGINQUERYINDEXEDPROC gl3wBeginQueryIndexed; -PFNGLENDQUERYINDEXEDPROC gl3wEndQueryIndexed; -PFNGLGETQUERYINDEXEDIVPROC gl3wGetQueryIndexediv; -PFNGLRELEASESHADERCOMPILERPROC gl3wReleaseShaderCompiler; -PFNGLSHADERBINARYPROC gl3wShaderBinary; -PFNGLGETSHADERPRECISIONFORMATPROC gl3wGetShaderPrecisionFormat; -PFNGLDEPTHRANGEFPROC gl3wDepthRangef; -PFNGLCLEARDEPTHFPROC gl3wClearDepthf; -PFNGLGETPROGRAMBINARYPROC gl3wGetProgramBinary; -PFNGLPROGRAMBINARYPROC gl3wProgramBinary; -PFNGLPROGRAMPARAMETERIPROC gl3wProgramParameteri; -PFNGLUSEPROGRAMSTAGESPROC gl3wUseProgramStages; -PFNGLACTIVESHADERPROGRAMPROC gl3wActiveShaderProgram; -PFNGLCREATESHADERPROGRAMVPROC gl3wCreateShaderProgramv; -PFNGLBINDPROGRAMPIPELINEPROC gl3wBindProgramPipeline; -PFNGLDELETEPROGRAMPIPELINESPROC gl3wDeleteProgramPipelines; -PFNGLGENPROGRAMPIPELINESPROC gl3wGenProgramPipelines; -PFNGLISPROGRAMPIPELINEPROC gl3wIsProgramPipeline; -PFNGLGETPROGRAMPIPELINEIVPROC gl3wGetProgramPipelineiv; -PFNGLPROGRAMUNIFORM1IPROC gl3wProgramUniform1i; -PFNGLPROGRAMUNIFORM1IVPROC gl3wProgramUniform1iv; -PFNGLPROGRAMUNIFORM1FPROC gl3wProgramUniform1f; -PFNGLPROGRAMUNIFORM1FVPROC gl3wProgramUniform1fv; -PFNGLPROGRAMUNIFORM1DPROC gl3wProgramUniform1d; -PFNGLPROGRAMUNIFORM1DVPROC gl3wProgramUniform1dv; -PFNGLPROGRAMUNIFORM1UIPROC gl3wProgramUniform1ui; -PFNGLPROGRAMUNIFORM1UIVPROC gl3wProgramUniform1uiv; -PFNGLPROGRAMUNIFORM2IPROC gl3wProgramUniform2i; -PFNGLPROGRAMUNIFORM2IVPROC gl3wProgramUniform2iv; -PFNGLPROGRAMUNIFORM2FPROC gl3wProgramUniform2f; -PFNGLPROGRAMUNIFORM2FVPROC gl3wProgramUniform2fv; -PFNGLPROGRAMUNIFORM2DPROC gl3wProgramUniform2d; -PFNGLPROGRAMUNIFORM2DVPROC gl3wProgramUniform2dv; -PFNGLPROGRAMUNIFORM2UIPROC gl3wProgramUniform2ui; -PFNGLPROGRAMUNIFORM2UIVPROC gl3wProgramUniform2uiv; -PFNGLPROGRAMUNIFORM3IPROC gl3wProgramUniform3i; -PFNGLPROGRAMUNIFORM3IVPROC gl3wProgramUniform3iv; -PFNGLPROGRAMUNIFORM3FPROC gl3wProgramUniform3f; -PFNGLPROGRAMUNIFORM3FVPROC gl3wProgramUniform3fv; -PFNGLPROGRAMUNIFORM3DPROC gl3wProgramUniform3d; -PFNGLPROGRAMUNIFORM3DVPROC gl3wProgramUniform3dv; -PFNGLPROGRAMUNIFORM3UIPROC gl3wProgramUniform3ui; -PFNGLPROGRAMUNIFORM3UIVPROC gl3wProgramUniform3uiv; -PFNGLPROGRAMUNIFORM4IPROC gl3wProgramUniform4i; -PFNGLPROGRAMUNIFORM4IVPROC gl3wProgramUniform4iv; -PFNGLPROGRAMUNIFORM4FPROC gl3wProgramUniform4f; -PFNGLPROGRAMUNIFORM4FVPROC gl3wProgramUniform4fv; -PFNGLPROGRAMUNIFORM4DPROC gl3wProgramUniform4d; -PFNGLPROGRAMUNIFORM4DVPROC gl3wProgramUniform4dv; -PFNGLPROGRAMUNIFORM4UIPROC gl3wProgramUniform4ui; -PFNGLPROGRAMUNIFORM4UIVPROC gl3wProgramUniform4uiv; -PFNGLPROGRAMUNIFORMMATRIX2FVPROC gl3wProgramUniformMatrix2fv; -PFNGLPROGRAMUNIFORMMATRIX3FVPROC gl3wProgramUniformMatrix3fv; -PFNGLPROGRAMUNIFORMMATRIX4FVPROC gl3wProgramUniformMatrix4fv; -PFNGLPROGRAMUNIFORMMATRIX2DVPROC gl3wProgramUniformMatrix2dv; -PFNGLPROGRAMUNIFORMMATRIX3DVPROC gl3wProgramUniformMatrix3dv; -PFNGLPROGRAMUNIFORMMATRIX4DVPROC gl3wProgramUniformMatrix4dv; -PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC gl3wProgramUniformMatrix2x3fv; -PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC gl3wProgramUniformMatrix3x2fv; -PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC gl3wProgramUniformMatrix2x4fv; -PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC gl3wProgramUniformMatrix4x2fv; -PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC gl3wProgramUniformMatrix3x4fv; -PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC gl3wProgramUniformMatrix4x3fv; -PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC gl3wProgramUniformMatrix2x3dv; -PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC gl3wProgramUniformMatrix3x2dv; -PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC gl3wProgramUniformMatrix2x4dv; -PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC gl3wProgramUniformMatrix4x2dv; -PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC gl3wProgramUniformMatrix3x4dv; -PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC gl3wProgramUniformMatrix4x3dv; -PFNGLVALIDATEPROGRAMPIPELINEPROC gl3wValidateProgramPipeline; -PFNGLGETPROGRAMPIPELINEINFOLOGPROC gl3wGetProgramPipelineInfoLog; -PFNGLVERTEXATTRIBL1DPROC gl3wVertexAttribL1d; -PFNGLVERTEXATTRIBL2DPROC gl3wVertexAttribL2d; -PFNGLVERTEXATTRIBL3DPROC gl3wVertexAttribL3d; -PFNGLVERTEXATTRIBL4DPROC gl3wVertexAttribL4d; -PFNGLVERTEXATTRIBL1DVPROC gl3wVertexAttribL1dv; -PFNGLVERTEXATTRIBL2DVPROC gl3wVertexAttribL2dv; -PFNGLVERTEXATTRIBL3DVPROC gl3wVertexAttribL3dv; -PFNGLVERTEXATTRIBL4DVPROC gl3wVertexAttribL4dv; -PFNGLVERTEXATTRIBLPOINTERPROC gl3wVertexAttribLPointer; -PFNGLGETVERTEXATTRIBLDVPROC gl3wGetVertexAttribLdv; -PFNGLVIEWPORTARRAYVPROC gl3wViewportArrayv; -PFNGLVIEWPORTINDEXEDFPROC gl3wViewportIndexedf; -PFNGLVIEWPORTINDEXEDFVPROC gl3wViewportIndexedfv; -PFNGLSCISSORARRAYVPROC gl3wScissorArrayv; -PFNGLSCISSORINDEXEDPROC gl3wScissorIndexed; -PFNGLSCISSORINDEXEDVPROC gl3wScissorIndexedv; -PFNGLDEPTHRANGEARRAYVPROC gl3wDepthRangeArrayv; -PFNGLDEPTHRANGEINDEXEDPROC gl3wDepthRangeIndexed; -PFNGLGETFLOATI_VPROC gl3wGetFloati_v; -PFNGLGETDOUBLEI_VPROC gl3wGetDoublei_v; -PFNGLCREATESYNCFROMCLEVENTARBPROC gl3wCreateSyncFromCLeventARB; -PFNGLDEBUGMESSAGECONTROLARBPROC gl3wDebugMessageControlARB; -PFNGLDEBUGMESSAGEINSERTARBPROC gl3wDebugMessageInsertARB; -PFNGLDEBUGMESSAGECALLBACKARBPROC gl3wDebugMessageCallbackARB; -PFNGLGETDEBUGMESSAGELOGARBPROC gl3wGetDebugMessageLogARB; -PFNGLGETGRAPHICSRESETSTATUSARBPROC gl3wGetGraphicsResetStatusARB; -PFNGLGETNTEXIMAGEARBPROC gl3wGetnTexImageARB; -PFNGLREADNPIXELSARBPROC gl3wReadnPixelsARB; -PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC gl3wGetnCompressedTexImageARB; -PFNGLGETNUNIFORMFVARBPROC gl3wGetnUniformfvARB; -PFNGLGETNUNIFORMIVARBPROC gl3wGetnUniformivARB; -PFNGLGETNUNIFORMUIVARBPROC gl3wGetnUniformuivARB; -PFNGLGETNUNIFORMDVARBPROC gl3wGetnUniformdvARB; -PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC gl3wDrawArraysInstancedBaseInstance; -PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC gl3wDrawElementsInstancedBaseInstance; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC gl3wDrawElementsInstancedBaseVertexBaseInstance; -PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC gl3wDrawTransformFeedbackInstanced; -PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC gl3wDrawTransformFeedbackStreamInstanced; -PFNGLGETINTERNALFORMATIVPROC gl3wGetInternalformativ; -PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC gl3wGetActiveAtomicCounterBufferiv; -PFNGLBINDIMAGETEXTUREPROC gl3wBindImageTexture; -PFNGLMEMORYBARRIERPROC gl3wMemoryBarrier; -PFNGLTEXSTORAGE1DPROC gl3wTexStorage1D; -PFNGLTEXSTORAGE2DPROC gl3wTexStorage2D; -PFNGLTEXSTORAGE3DPROC gl3wTexStorage3D; -PFNGLTEXTURESTORAGE1DEXTPROC gl3wTextureStorage1DEXT; -PFNGLTEXTURESTORAGE2DEXTPROC gl3wTextureStorage2DEXT; -PFNGLTEXTURESTORAGE3DEXTPROC gl3wTextureStorage3DEXT; -PFNGLDEBUGMESSAGECONTROLPROC gl3wDebugMessageControl; -PFNGLDEBUGMESSAGEINSERTPROC gl3wDebugMessageInsert; -PFNGLDEBUGMESSAGECALLBACKPROC gl3wDebugMessageCallback; -PFNGLGETDEBUGMESSAGELOGPROC gl3wGetDebugMessageLog; -PFNGLPUSHDEBUGGROUPPROC gl3wPushDebugGroup; -PFNGLPOPDEBUGGROUPPROC gl3wPopDebugGroup; -PFNGLOBJECTLABELPROC gl3wObjectLabel; -PFNGLGETOBJECTLABELPROC gl3wGetObjectLabel; -PFNGLOBJECTPTRLABELPROC gl3wObjectPtrLabel; -PFNGLGETOBJECTPTRLABELPROC gl3wGetObjectPtrLabel; -PFNGLCLEARBUFFERDATAPROC gl3wClearBufferData; -PFNGLCLEARBUFFERSUBDATAPROC gl3wClearBufferSubData; -PFNGLCLEARNAMEDBUFFERDATAEXTPROC gl3wClearNamedBufferDataEXT; -PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC gl3wClearNamedBufferSubDataEXT; -PFNGLDISPATCHCOMPUTEPROC gl3wDispatchCompute; -PFNGLDISPATCHCOMPUTEINDIRECTPROC gl3wDispatchComputeIndirect; -PFNGLCOPYIMAGESUBDATAPROC gl3wCopyImageSubData; -PFNGLTEXTUREVIEWPROC gl3wTextureView; -PFNGLBINDVERTEXBUFFERPROC gl3wBindVertexBuffer; -PFNGLVERTEXATTRIBFORMATPROC gl3wVertexAttribFormat; -PFNGLVERTEXATTRIBIFORMATPROC gl3wVertexAttribIFormat; -PFNGLVERTEXATTRIBLFORMATPROC gl3wVertexAttribLFormat; -PFNGLVERTEXATTRIBBINDINGPROC gl3wVertexAttribBinding; -PFNGLVERTEXBINDINGDIVISORPROC gl3wVertexBindingDivisor; -PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC gl3wVertexArrayBindVertexBufferEXT; -PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC gl3wVertexArrayVertexAttribFormatEXT; -PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC gl3wVertexArrayVertexAttribIFormatEXT; -PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC gl3wVertexArrayVertexAttribLFormatEXT; -PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC gl3wVertexArrayVertexAttribBindingEXT; -PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC gl3wVertexArrayVertexBindingDivisorEXT; -PFNGLFRAMEBUFFERPARAMETERIPROC gl3wFramebufferParameteri; -PFNGLGETFRAMEBUFFERPARAMETERIVPROC gl3wGetFramebufferParameteriv; -PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC gl3wNamedFramebufferParameteriEXT; -PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC gl3wGetNamedFramebufferParameterivEXT; -PFNGLGETINTERNALFORMATI64VPROC gl3wGetInternalformati64v; -PFNGLINVALIDATETEXSUBIMAGEPROC gl3wInvalidateTexSubImage; -PFNGLINVALIDATETEXIMAGEPROC gl3wInvalidateTexImage; -PFNGLINVALIDATEBUFFERSUBDATAPROC gl3wInvalidateBufferSubData; -PFNGLINVALIDATEBUFFERDATAPROC gl3wInvalidateBufferData; -PFNGLINVALIDATEFRAMEBUFFERPROC gl3wInvalidateFramebuffer; -PFNGLINVALIDATESUBFRAMEBUFFERPROC gl3wInvalidateSubFramebuffer; -PFNGLMULTIDRAWARRAYSINDIRECTPROC gl3wMultiDrawArraysIndirect; -PFNGLMULTIDRAWELEMENTSINDIRECTPROC gl3wMultiDrawElementsIndirect; -PFNGLGETPROGRAMINTERFACEIVPROC gl3wGetProgramInterfaceiv; -PFNGLGETPROGRAMRESOURCEINDEXPROC gl3wGetProgramResourceIndex; -PFNGLGETPROGRAMRESOURCENAMEPROC gl3wGetProgramResourceName; -PFNGLGETPROGRAMRESOURCEIVPROC gl3wGetProgramResourceiv; -PFNGLGETPROGRAMRESOURCELOCATIONPROC gl3wGetProgramResourceLocation; -PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC gl3wGetProgramResourceLocationIndex; -PFNGLSHADERSTORAGEBLOCKBINDINGPROC gl3wShaderStorageBlockBinding; -PFNGLTEXBUFFERRANGEPROC gl3wTexBufferRange; -PFNGLTEXTUREBUFFERRANGEEXTPROC gl3wTextureBufferRangeEXT; -PFNGLTEXSTORAGE2DMULTISAMPLEPROC gl3wTexStorage2DMultisample; -PFNGLTEXSTORAGE3DMULTISAMPLEPROC gl3wTexStorage3DMultisample; -PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC gl3wTextureStorage2DMultisampleEXT; -PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC gl3wTextureStorage3DMultisampleEXT; - -static void load_procs(void) -{ - gl3wCullFace = (PFNGLCULLFACEPROC) get_proc("glCullFace"); - gl3wFrontFace = (PFNGLFRONTFACEPROC) get_proc("glFrontFace"); - gl3wHint = (PFNGLHINTPROC) get_proc("glHint"); - gl3wLineWidth = (PFNGLLINEWIDTHPROC) get_proc("glLineWidth"); - gl3wPointSize = (PFNGLPOINTSIZEPROC) get_proc("glPointSize"); - gl3wPolygonMode = (PFNGLPOLYGONMODEPROC) get_proc("glPolygonMode"); - gl3wScissor = (PFNGLSCISSORPROC) get_proc("glScissor"); - gl3wTexParameterf = (PFNGLTEXPARAMETERFPROC) get_proc("glTexParameterf"); - gl3wTexParameterfv = (PFNGLTEXPARAMETERFVPROC) get_proc("glTexParameterfv"); - gl3wTexParameteri = (PFNGLTEXPARAMETERIPROC) get_proc("glTexParameteri"); - gl3wTexParameteriv = (PFNGLTEXPARAMETERIVPROC) get_proc("glTexParameteriv"); - gl3wTexImage1D = (PFNGLTEXIMAGE1DPROC) get_proc("glTexImage1D"); - gl3wTexImage2D = (PFNGLTEXIMAGE2DPROC) get_proc("glTexImage2D"); - gl3wDrawBuffer = (PFNGLDRAWBUFFERPROC) get_proc("glDrawBuffer"); - gl3wClear = (PFNGLCLEARPROC) get_proc("glClear"); - gl3wClearColor = (PFNGLCLEARCOLORPROC) get_proc("glClearColor"); - gl3wClearStencil = (PFNGLCLEARSTENCILPROC) get_proc("glClearStencil"); - gl3wClearDepth = (PFNGLCLEARDEPTHPROC) get_proc("glClearDepth"); - gl3wStencilMask = (PFNGLSTENCILMASKPROC) get_proc("glStencilMask"); - gl3wColorMask = (PFNGLCOLORMASKPROC) get_proc("glColorMask"); - gl3wDepthMask = (PFNGLDEPTHMASKPROC) get_proc("glDepthMask"); - gl3wDisable = (PFNGLDISABLEPROC) get_proc("glDisable"); - gl3wEnable = (PFNGLENABLEPROC) get_proc("glEnable"); - gl3wFinish = (PFNGLFINISHPROC) get_proc("glFinish"); - gl3wFlush = (PFNGLFLUSHPROC) get_proc("glFlush"); - gl3wBlendFunc = (PFNGLBLENDFUNCPROC) get_proc("glBlendFunc"); - gl3wLogicOp = (PFNGLLOGICOPPROC) get_proc("glLogicOp"); - gl3wStencilFunc = (PFNGLSTENCILFUNCPROC) get_proc("glStencilFunc"); - gl3wStencilOp = (PFNGLSTENCILOPPROC) get_proc("glStencilOp"); - gl3wDepthFunc = (PFNGLDEPTHFUNCPROC) get_proc("glDepthFunc"); - gl3wPixelStoref = (PFNGLPIXELSTOREFPROC) get_proc("glPixelStoref"); - gl3wPixelStorei = (PFNGLPIXELSTOREIPROC) get_proc("glPixelStorei"); - gl3wReadBuffer = (PFNGLREADBUFFERPROC) get_proc("glReadBuffer"); - gl3wReadPixels = (PFNGLREADPIXELSPROC) get_proc("glReadPixels"); - gl3wGetBooleanv = (PFNGLGETBOOLEANVPROC) get_proc("glGetBooleanv"); - gl3wGetDoublev = (PFNGLGETDOUBLEVPROC) get_proc("glGetDoublev"); - gl3wGetError = (PFNGLGETERRORPROC) get_proc("glGetError"); - gl3wGetFloatv = (PFNGLGETFLOATVPROC) get_proc("glGetFloatv"); - gl3wGetIntegerv = (PFNGLGETINTEGERVPROC) get_proc("glGetIntegerv"); - gl3wGetString = (PFNGLGETSTRINGPROC) get_proc("glGetString"); - gl3wGetTexImage = (PFNGLGETTEXIMAGEPROC) get_proc("glGetTexImage"); - gl3wGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) get_proc("glGetTexParameterfv"); - gl3wGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) get_proc("glGetTexParameteriv"); - gl3wGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) get_proc("glGetTexLevelParameterfv"); - gl3wGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) get_proc("glGetTexLevelParameteriv"); - gl3wIsEnabled = (PFNGLISENABLEDPROC) get_proc("glIsEnabled"); - gl3wDepthRange = (PFNGLDEPTHRANGEPROC) get_proc("glDepthRange"); - gl3wViewport = (PFNGLVIEWPORTPROC) get_proc("glViewport"); - gl3wDrawArrays = (PFNGLDRAWARRAYSPROC) get_proc("glDrawArrays"); - gl3wDrawElements = (PFNGLDRAWELEMENTSPROC) get_proc("glDrawElements"); - gl3wGetPointerv = (PFNGLGETPOINTERVPROC) get_proc("glGetPointerv"); - gl3wPolygonOffset = (PFNGLPOLYGONOFFSETPROC) get_proc("glPolygonOffset"); - gl3wCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) get_proc("glCopyTexImage1D"); - gl3wCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) get_proc("glCopyTexImage2D"); - gl3wCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) get_proc("glCopyTexSubImage1D"); - gl3wCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) get_proc("glCopyTexSubImage2D"); - gl3wTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) get_proc("glTexSubImage1D"); - gl3wTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) get_proc("glTexSubImage2D"); - gl3wBindTexture = (PFNGLBINDTEXTUREPROC) get_proc("glBindTexture"); - gl3wDeleteTextures = (PFNGLDELETETEXTURESPROC) get_proc("glDeleteTextures"); - gl3wGenTextures = (PFNGLGENTEXTURESPROC) get_proc("glGenTextures"); - gl3wIsTexture = (PFNGLISTEXTUREPROC) get_proc("glIsTexture"); - gl3wBlendColor = (PFNGLBLENDCOLORPROC) get_proc("glBlendColor"); - gl3wBlendEquation = (PFNGLBLENDEQUATIONPROC) get_proc("glBlendEquation"); - gl3wDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) get_proc("glDrawRangeElements"); - gl3wTexImage3D = (PFNGLTEXIMAGE3DPROC) get_proc("glTexImage3D"); - gl3wTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) get_proc("glTexSubImage3D"); - gl3wCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) get_proc("glCopyTexSubImage3D"); - gl3wActiveTexture = (PFNGLACTIVETEXTUREPROC) get_proc("glActiveTexture"); - gl3wSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) get_proc("glSampleCoverage"); - gl3wCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) get_proc("glCompressedTexImage3D"); - gl3wCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) get_proc("glCompressedTexImage2D"); - gl3wCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) get_proc("glCompressedTexImage1D"); - gl3wCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) get_proc("glCompressedTexSubImage3D"); - gl3wCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) get_proc("glCompressedTexSubImage2D"); - gl3wCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) get_proc("glCompressedTexSubImage1D"); - gl3wGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) get_proc("glGetCompressedTexImage"); - gl3wBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) get_proc("glBlendFuncSeparate"); - gl3wMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) get_proc("glMultiDrawArrays"); - gl3wMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) get_proc("glMultiDrawElements"); - gl3wPointParameterf = (PFNGLPOINTPARAMETERFPROC) get_proc("glPointParameterf"); - gl3wPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) get_proc("glPointParameterfv"); - gl3wPointParameteri = (PFNGLPOINTPARAMETERIPROC) get_proc("glPointParameteri"); - gl3wPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) get_proc("glPointParameteriv"); - gl3wGenQueries = (PFNGLGENQUERIESPROC) get_proc("glGenQueries"); - gl3wDeleteQueries = (PFNGLDELETEQUERIESPROC) get_proc("glDeleteQueries"); - gl3wIsQuery = (PFNGLISQUERYPROC) get_proc("glIsQuery"); - gl3wBeginQuery = (PFNGLBEGINQUERYPROC) get_proc("glBeginQuery"); - gl3wEndQuery = (PFNGLENDQUERYPROC) get_proc("glEndQuery"); - gl3wGetQueryiv = (PFNGLGETQUERYIVPROC) get_proc("glGetQueryiv"); - gl3wGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) get_proc("glGetQueryObjectiv"); - gl3wGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) get_proc("glGetQueryObjectuiv"); - gl3wBindBuffer = (PFNGLBINDBUFFERPROC) get_proc("glBindBuffer"); - gl3wDeleteBuffers = (PFNGLDELETEBUFFERSPROC) get_proc("glDeleteBuffers"); - gl3wGenBuffers = (PFNGLGENBUFFERSPROC) get_proc("glGenBuffers"); - gl3wIsBuffer = (PFNGLISBUFFERPROC) get_proc("glIsBuffer"); - gl3wBufferData = (PFNGLBUFFERDATAPROC) get_proc("glBufferData"); - gl3wBufferSubData = (PFNGLBUFFERSUBDATAPROC) get_proc("glBufferSubData"); - gl3wGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) get_proc("glGetBufferSubData"); - gl3wMapBuffer = (PFNGLMAPBUFFERPROC) get_proc("glMapBuffer"); - gl3wUnmapBuffer = (PFNGLUNMAPBUFFERPROC) get_proc("glUnmapBuffer"); - gl3wGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) get_proc("glGetBufferParameteriv"); - gl3wGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) get_proc("glGetBufferPointerv"); - gl3wBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) get_proc("glBlendEquationSeparate"); - gl3wDrawBuffers = (PFNGLDRAWBUFFERSPROC) get_proc("glDrawBuffers"); - gl3wStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) get_proc("glStencilOpSeparate"); - gl3wStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) get_proc("glStencilFuncSeparate"); - gl3wStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) get_proc("glStencilMaskSeparate"); - gl3wAttachShader = (PFNGLATTACHSHADERPROC) get_proc("glAttachShader"); - gl3wBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) get_proc("glBindAttribLocation"); - gl3wCompileShader = (PFNGLCOMPILESHADERPROC) get_proc("glCompileShader"); - gl3wCreateProgram = (PFNGLCREATEPROGRAMPROC) get_proc("glCreateProgram"); - gl3wCreateShader = (PFNGLCREATESHADERPROC) get_proc("glCreateShader"); - gl3wDeleteProgram = (PFNGLDELETEPROGRAMPROC) get_proc("glDeleteProgram"); - gl3wDeleteShader = (PFNGLDELETESHADERPROC) get_proc("glDeleteShader"); - gl3wDetachShader = (PFNGLDETACHSHADERPROC) get_proc("glDetachShader"); - gl3wDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) get_proc("glDisableVertexAttribArray"); - gl3wEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) get_proc("glEnableVertexAttribArray"); - gl3wGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) get_proc("glGetActiveAttrib"); - gl3wGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) get_proc("glGetActiveUniform"); - gl3wGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) get_proc("glGetAttachedShaders"); - gl3wGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) get_proc("glGetAttribLocation"); - gl3wGetProgramiv = (PFNGLGETPROGRAMIVPROC) get_proc("glGetProgramiv"); - gl3wGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) get_proc("glGetProgramInfoLog"); - gl3wGetShaderiv = (PFNGLGETSHADERIVPROC) get_proc("glGetShaderiv"); - gl3wGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) get_proc("glGetShaderInfoLog"); - gl3wGetShaderSource = (PFNGLGETSHADERSOURCEPROC) get_proc("glGetShaderSource"); - gl3wGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) get_proc("glGetUniformLocation"); - gl3wGetUniformfv = (PFNGLGETUNIFORMFVPROC) get_proc("glGetUniformfv"); - gl3wGetUniformiv = (PFNGLGETUNIFORMIVPROC) get_proc("glGetUniformiv"); - gl3wGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) get_proc("glGetVertexAttribdv"); - gl3wGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) get_proc("glGetVertexAttribfv"); - gl3wGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) get_proc("glGetVertexAttribiv"); - gl3wGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) get_proc("glGetVertexAttribPointerv"); - gl3wIsProgram = (PFNGLISPROGRAMPROC) get_proc("glIsProgram"); - gl3wIsShader = (PFNGLISSHADERPROC) get_proc("glIsShader"); - gl3wLinkProgram = (PFNGLLINKPROGRAMPROC) get_proc("glLinkProgram"); - gl3wShaderSource = (PFNGLSHADERSOURCEPROC) get_proc("glShaderSource"); - gl3wUseProgram = (PFNGLUSEPROGRAMPROC) get_proc("glUseProgram"); - gl3wUniform1f = (PFNGLUNIFORM1FPROC) get_proc("glUniform1f"); - gl3wUniform2f = (PFNGLUNIFORM2FPROC) get_proc("glUniform2f"); - gl3wUniform3f = (PFNGLUNIFORM3FPROC) get_proc("glUniform3f"); - gl3wUniform4f = (PFNGLUNIFORM4FPROC) get_proc("glUniform4f"); - gl3wUniform1i = (PFNGLUNIFORM1IPROC) get_proc("glUniform1i"); - gl3wUniform2i = (PFNGLUNIFORM2IPROC) get_proc("glUniform2i"); - gl3wUniform3i = (PFNGLUNIFORM3IPROC) get_proc("glUniform3i"); - gl3wUniform4i = (PFNGLUNIFORM4IPROC) get_proc("glUniform4i"); - gl3wUniform1fv = (PFNGLUNIFORM1FVPROC) get_proc("glUniform1fv"); - gl3wUniform2fv = (PFNGLUNIFORM2FVPROC) get_proc("glUniform2fv"); - gl3wUniform3fv = (PFNGLUNIFORM3FVPROC) get_proc("glUniform3fv"); - gl3wUniform4fv = (PFNGLUNIFORM4FVPROC) get_proc("glUniform4fv"); - gl3wUniform1iv = (PFNGLUNIFORM1IVPROC) get_proc("glUniform1iv"); - gl3wUniform2iv = (PFNGLUNIFORM2IVPROC) get_proc("glUniform2iv"); - gl3wUniform3iv = (PFNGLUNIFORM3IVPROC) get_proc("glUniform3iv"); - gl3wUniform4iv = (PFNGLUNIFORM4IVPROC) get_proc("glUniform4iv"); - gl3wUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) get_proc("glUniformMatrix2fv"); - gl3wUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) get_proc("glUniformMatrix3fv"); - gl3wUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) get_proc("glUniformMatrix4fv"); - gl3wValidateProgram = (PFNGLVALIDATEPROGRAMPROC) get_proc("glValidateProgram"); - gl3wVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) get_proc("glVertexAttrib1d"); - gl3wVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) get_proc("glVertexAttrib1dv"); - gl3wVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) get_proc("glVertexAttrib1f"); - gl3wVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) get_proc("glVertexAttrib1fv"); - gl3wVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) get_proc("glVertexAttrib1s"); - gl3wVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) get_proc("glVertexAttrib1sv"); - gl3wVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) get_proc("glVertexAttrib2d"); - gl3wVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) get_proc("glVertexAttrib2dv"); - gl3wVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) get_proc("glVertexAttrib2f"); - gl3wVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) get_proc("glVertexAttrib2fv"); - gl3wVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) get_proc("glVertexAttrib2s"); - gl3wVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) get_proc("glVertexAttrib2sv"); - gl3wVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) get_proc("glVertexAttrib3d"); - gl3wVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) get_proc("glVertexAttrib3dv"); - gl3wVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) get_proc("glVertexAttrib3f"); - gl3wVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) get_proc("glVertexAttrib3fv"); - gl3wVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) get_proc("glVertexAttrib3s"); - gl3wVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) get_proc("glVertexAttrib3sv"); - gl3wVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) get_proc("glVertexAttrib4Nbv"); - gl3wVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) get_proc("glVertexAttrib4Niv"); - gl3wVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) get_proc("glVertexAttrib4Nsv"); - gl3wVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) get_proc("glVertexAttrib4Nub"); - gl3wVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) get_proc("glVertexAttrib4Nubv"); - gl3wVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) get_proc("glVertexAttrib4Nuiv"); - gl3wVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) get_proc("glVertexAttrib4Nusv"); - gl3wVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) get_proc("glVertexAttrib4bv"); - gl3wVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) get_proc("glVertexAttrib4d"); - gl3wVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) get_proc("glVertexAttrib4dv"); - gl3wVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) get_proc("glVertexAttrib4f"); - gl3wVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) get_proc("glVertexAttrib4fv"); - gl3wVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) get_proc("glVertexAttrib4iv"); - gl3wVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) get_proc("glVertexAttrib4s"); - gl3wVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) get_proc("glVertexAttrib4sv"); - gl3wVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) get_proc("glVertexAttrib4ubv"); - gl3wVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) get_proc("glVertexAttrib4uiv"); - gl3wVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) get_proc("glVertexAttrib4usv"); - gl3wVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) get_proc("glVertexAttribPointer"); - gl3wUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) get_proc("glUniformMatrix2x3fv"); - gl3wUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) get_proc("glUniformMatrix3x2fv"); - gl3wUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) get_proc("glUniformMatrix2x4fv"); - gl3wUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) get_proc("glUniformMatrix4x2fv"); - gl3wUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) get_proc("glUniformMatrix3x4fv"); - gl3wUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) get_proc("glUniformMatrix4x3fv"); - gl3wColorMaski = (PFNGLCOLORMASKIPROC) get_proc("glColorMaski"); - gl3wGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) get_proc("glGetBooleani_v"); - gl3wGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) get_proc("glGetIntegeri_v"); - gl3wEnablei = (PFNGLENABLEIPROC) get_proc("glEnablei"); - gl3wDisablei = (PFNGLDISABLEIPROC) get_proc("glDisablei"); - gl3wIsEnabledi = (PFNGLISENABLEDIPROC) get_proc("glIsEnabledi"); - gl3wBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) get_proc("glBeginTransformFeedback"); - gl3wEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) get_proc("glEndTransformFeedback"); - gl3wBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) get_proc("glBindBufferRange"); - gl3wBindBufferBase = (PFNGLBINDBUFFERBASEPROC) get_proc("glBindBufferBase"); - gl3wTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) get_proc("glTransformFeedbackVaryings"); - gl3wGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) get_proc("glGetTransformFeedbackVarying"); - gl3wClampColor = (PFNGLCLAMPCOLORPROC) get_proc("glClampColor"); - gl3wBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) get_proc("glBeginConditionalRender"); - gl3wEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) get_proc("glEndConditionalRender"); - gl3wVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) get_proc("glVertexAttribIPointer"); - gl3wGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) get_proc("glGetVertexAttribIiv"); - gl3wGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) get_proc("glGetVertexAttribIuiv"); - gl3wVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) get_proc("glVertexAttribI1i"); - gl3wVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) get_proc("glVertexAttribI2i"); - gl3wVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) get_proc("glVertexAttribI3i"); - gl3wVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) get_proc("glVertexAttribI4i"); - gl3wVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) get_proc("glVertexAttribI1ui"); - gl3wVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) get_proc("glVertexAttribI2ui"); - gl3wVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) get_proc("glVertexAttribI3ui"); - gl3wVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) get_proc("glVertexAttribI4ui"); - gl3wVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) get_proc("glVertexAttribI1iv"); - gl3wVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) get_proc("glVertexAttribI2iv"); - gl3wVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) get_proc("glVertexAttribI3iv"); - gl3wVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) get_proc("glVertexAttribI4iv"); - gl3wVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) get_proc("glVertexAttribI1uiv"); - gl3wVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) get_proc("glVertexAttribI2uiv"); - gl3wVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) get_proc("glVertexAttribI3uiv"); - gl3wVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) get_proc("glVertexAttribI4uiv"); - gl3wVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) get_proc("glVertexAttribI4bv"); - gl3wVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) get_proc("glVertexAttribI4sv"); - gl3wVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) get_proc("glVertexAttribI4ubv"); - gl3wVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) get_proc("glVertexAttribI4usv"); - gl3wGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) get_proc("glGetUniformuiv"); - gl3wBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) get_proc("glBindFragDataLocation"); - gl3wGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) get_proc("glGetFragDataLocation"); - gl3wUniform1ui = (PFNGLUNIFORM1UIPROC) get_proc("glUniform1ui"); - gl3wUniform2ui = (PFNGLUNIFORM2UIPROC) get_proc("glUniform2ui"); - gl3wUniform3ui = (PFNGLUNIFORM3UIPROC) get_proc("glUniform3ui"); - gl3wUniform4ui = (PFNGLUNIFORM4UIPROC) get_proc("glUniform4ui"); - gl3wUniform1uiv = (PFNGLUNIFORM1UIVPROC) get_proc("glUniform1uiv"); - gl3wUniform2uiv = (PFNGLUNIFORM2UIVPROC) get_proc("glUniform2uiv"); - gl3wUniform3uiv = (PFNGLUNIFORM3UIVPROC) get_proc("glUniform3uiv"); - gl3wUniform4uiv = (PFNGLUNIFORM4UIVPROC) get_proc("glUniform4uiv"); - gl3wTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) get_proc("glTexParameterIiv"); - gl3wTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) get_proc("glTexParameterIuiv"); - gl3wGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) get_proc("glGetTexParameterIiv"); - gl3wGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) get_proc("glGetTexParameterIuiv"); - gl3wClearBufferiv = (PFNGLCLEARBUFFERIVPROC) get_proc("glClearBufferiv"); - gl3wClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) get_proc("glClearBufferuiv"); - gl3wClearBufferfv = (PFNGLCLEARBUFFERFVPROC) get_proc("glClearBufferfv"); - gl3wClearBufferfi = (PFNGLCLEARBUFFERFIPROC) get_proc("glClearBufferfi"); - gl3wGetStringi = (PFNGLGETSTRINGIPROC) get_proc("glGetStringi"); - gl3wDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) get_proc("glDrawArraysInstanced"); - gl3wDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) get_proc("glDrawElementsInstanced"); - gl3wTexBuffer = (PFNGLTEXBUFFERPROC) get_proc("glTexBuffer"); - gl3wPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) get_proc("glPrimitiveRestartIndex"); - gl3wGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) get_proc("glGetInteger64i_v"); - gl3wGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) get_proc("glGetBufferParameteri64v"); - gl3wFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) get_proc("glFramebufferTexture"); - gl3wVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) get_proc("glVertexAttribDivisor"); - gl3wMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) get_proc("glMinSampleShading"); - gl3wBlendEquationi = (PFNGLBLENDEQUATIONIPROC) get_proc("glBlendEquationi"); - gl3wBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) get_proc("glBlendEquationSeparatei"); - gl3wBlendFunci = (PFNGLBLENDFUNCIPROC) get_proc("glBlendFunci"); - gl3wBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) get_proc("glBlendFuncSeparatei"); - gl3wIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) get_proc("glIsRenderbuffer"); - gl3wBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) get_proc("glBindRenderbuffer"); - gl3wDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) get_proc("glDeleteRenderbuffers"); - gl3wGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) get_proc("glGenRenderbuffers"); - gl3wRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) get_proc("glRenderbufferStorage"); - gl3wGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) get_proc("glGetRenderbufferParameteriv"); - gl3wIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) get_proc("glIsFramebuffer"); - gl3wBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) get_proc("glBindFramebuffer"); - gl3wDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) get_proc("glDeleteFramebuffers"); - gl3wGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) get_proc("glGenFramebuffers"); - gl3wCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) get_proc("glCheckFramebufferStatus"); - gl3wFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) get_proc("glFramebufferTexture1D"); - gl3wFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) get_proc("glFramebufferTexture2D"); - gl3wFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) get_proc("glFramebufferTexture3D"); - gl3wFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) get_proc("glFramebufferRenderbuffer"); - gl3wGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) get_proc("glGetFramebufferAttachmentParameteriv"); - gl3wGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) get_proc("glGenerateMipmap"); - gl3wBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) get_proc("glBlitFramebuffer"); - gl3wRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) get_proc("glRenderbufferStorageMultisample"); - gl3wFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) get_proc("glFramebufferTextureLayer"); - gl3wMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) get_proc("glMapBufferRange"); - gl3wFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) get_proc("glFlushMappedBufferRange"); - gl3wBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) get_proc("glBindVertexArray"); - gl3wDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) get_proc("glDeleteVertexArrays"); - gl3wGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) get_proc("glGenVertexArrays"); - gl3wIsVertexArray = (PFNGLISVERTEXARRAYPROC) get_proc("glIsVertexArray"); - gl3wGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) get_proc("glGetUniformIndices"); - gl3wGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) get_proc("glGetActiveUniformsiv"); - gl3wGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) get_proc("glGetActiveUniformName"); - gl3wGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) get_proc("glGetUniformBlockIndex"); - gl3wGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) get_proc("glGetActiveUniformBlockiv"); - gl3wGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) get_proc("glGetActiveUniformBlockName"); - gl3wUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) get_proc("glUniformBlockBinding"); - gl3wCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) get_proc("glCopyBufferSubData"); - gl3wDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) get_proc("glDrawElementsBaseVertex"); - gl3wDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) get_proc("glDrawRangeElementsBaseVertex"); - gl3wDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) get_proc("glDrawElementsInstancedBaseVertex"); - gl3wMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) get_proc("glMultiDrawElementsBaseVertex"); - gl3wProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) get_proc("glProvokingVertex"); - gl3wFenceSync = (PFNGLFENCESYNCPROC) get_proc("glFenceSync"); - gl3wIsSync = (PFNGLISSYNCPROC) get_proc("glIsSync"); - gl3wDeleteSync = (PFNGLDELETESYNCPROC) get_proc("glDeleteSync"); - gl3wClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) get_proc("glClientWaitSync"); - gl3wWaitSync = (PFNGLWAITSYNCPROC) get_proc("glWaitSync"); - gl3wGetInteger64v = (PFNGLGETINTEGER64VPROC) get_proc("glGetInteger64v"); - gl3wGetSynciv = (PFNGLGETSYNCIVPROC) get_proc("glGetSynciv"); - gl3wTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) get_proc("glTexImage2DMultisample"); - gl3wTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) get_proc("glTexImage3DMultisample"); - gl3wGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) get_proc("glGetMultisamplefv"); - gl3wSampleMaski = (PFNGLSAMPLEMASKIPROC) get_proc("glSampleMaski"); - gl3wBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC) get_proc("glBlendEquationiARB"); - gl3wBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC) get_proc("glBlendEquationSeparateiARB"); - gl3wBlendFunciARB = (PFNGLBLENDFUNCIARBPROC) get_proc("glBlendFunciARB"); - gl3wBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC) get_proc("glBlendFuncSeparateiARB"); - gl3wMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC) get_proc("glMinSampleShadingARB"); - gl3wNamedStringARB = (PFNGLNAMEDSTRINGARBPROC) get_proc("glNamedStringARB"); - gl3wDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC) get_proc("glDeleteNamedStringARB"); - gl3wCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC) get_proc("glCompileShaderIncludeARB"); - gl3wIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC) get_proc("glIsNamedStringARB"); - gl3wGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC) get_proc("glGetNamedStringARB"); - gl3wGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC) get_proc("glGetNamedStringivARB"); - gl3wBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) get_proc("glBindFragDataLocationIndexed"); - gl3wGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) get_proc("glGetFragDataIndex"); - gl3wGenSamplers = (PFNGLGENSAMPLERSPROC) get_proc("glGenSamplers"); - gl3wDeleteSamplers = (PFNGLDELETESAMPLERSPROC) get_proc("glDeleteSamplers"); - gl3wIsSampler = (PFNGLISSAMPLERPROC) get_proc("glIsSampler"); - gl3wBindSampler = (PFNGLBINDSAMPLERPROC) get_proc("glBindSampler"); - gl3wSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) get_proc("glSamplerParameteri"); - gl3wSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) get_proc("glSamplerParameteriv"); - gl3wSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) get_proc("glSamplerParameterf"); - gl3wSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) get_proc("glSamplerParameterfv"); - gl3wSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) get_proc("glSamplerParameterIiv"); - gl3wSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) get_proc("glSamplerParameterIuiv"); - gl3wGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) get_proc("glGetSamplerParameteriv"); - gl3wGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) get_proc("glGetSamplerParameterIiv"); - gl3wGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) get_proc("glGetSamplerParameterfv"); - gl3wGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) get_proc("glGetSamplerParameterIuiv"); - gl3wQueryCounter = (PFNGLQUERYCOUNTERPROC) get_proc("glQueryCounter"); - gl3wGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) get_proc("glGetQueryObjecti64v"); - gl3wGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) get_proc("glGetQueryObjectui64v"); - gl3wVertexP2ui = (PFNGLVERTEXP2UIPROC) get_proc("glVertexP2ui"); - gl3wVertexP2uiv = (PFNGLVERTEXP2UIVPROC) get_proc("glVertexP2uiv"); - gl3wVertexP3ui = (PFNGLVERTEXP3UIPROC) get_proc("glVertexP3ui"); - gl3wVertexP3uiv = (PFNGLVERTEXP3UIVPROC) get_proc("glVertexP3uiv"); - gl3wVertexP4ui = (PFNGLVERTEXP4UIPROC) get_proc("glVertexP4ui"); - gl3wVertexP4uiv = (PFNGLVERTEXP4UIVPROC) get_proc("glVertexP4uiv"); - gl3wTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) get_proc("glTexCoordP1ui"); - gl3wTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) get_proc("glTexCoordP1uiv"); - gl3wTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) get_proc("glTexCoordP2ui"); - gl3wTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) get_proc("glTexCoordP2uiv"); - gl3wTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) get_proc("glTexCoordP3ui"); - gl3wTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) get_proc("glTexCoordP3uiv"); - gl3wTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) get_proc("glTexCoordP4ui"); - gl3wTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) get_proc("glTexCoordP4uiv"); - gl3wMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) get_proc("glMultiTexCoordP1ui"); - gl3wMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) get_proc("glMultiTexCoordP1uiv"); - gl3wMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) get_proc("glMultiTexCoordP2ui"); - gl3wMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) get_proc("glMultiTexCoordP2uiv"); - gl3wMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) get_proc("glMultiTexCoordP3ui"); - gl3wMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) get_proc("glMultiTexCoordP3uiv"); - gl3wMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) get_proc("glMultiTexCoordP4ui"); - gl3wMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) get_proc("glMultiTexCoordP4uiv"); - gl3wNormalP3ui = (PFNGLNORMALP3UIPROC) get_proc("glNormalP3ui"); - gl3wNormalP3uiv = (PFNGLNORMALP3UIVPROC) get_proc("glNormalP3uiv"); - gl3wColorP3ui = (PFNGLCOLORP3UIPROC) get_proc("glColorP3ui"); - gl3wColorP3uiv = (PFNGLCOLORP3UIVPROC) get_proc("glColorP3uiv"); - gl3wColorP4ui = (PFNGLCOLORP4UIPROC) get_proc("glColorP4ui"); - gl3wColorP4uiv = (PFNGLCOLORP4UIVPROC) get_proc("glColorP4uiv"); - gl3wSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) get_proc("glSecondaryColorP3ui"); - gl3wSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) get_proc("glSecondaryColorP3uiv"); - gl3wVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) get_proc("glVertexAttribP1ui"); - gl3wVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) get_proc("glVertexAttribP1uiv"); - gl3wVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) get_proc("glVertexAttribP2ui"); - gl3wVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) get_proc("glVertexAttribP2uiv"); - gl3wVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) get_proc("glVertexAttribP3ui"); - gl3wVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) get_proc("glVertexAttribP3uiv"); - gl3wVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) get_proc("glVertexAttribP4ui"); - gl3wVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) get_proc("glVertexAttribP4uiv"); - gl3wDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) get_proc("glDrawArraysIndirect"); - gl3wDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) get_proc("glDrawElementsIndirect"); - gl3wUniform1d = (PFNGLUNIFORM1DPROC) get_proc("glUniform1d"); - gl3wUniform2d = (PFNGLUNIFORM2DPROC) get_proc("glUniform2d"); - gl3wUniform3d = (PFNGLUNIFORM3DPROC) get_proc("glUniform3d"); - gl3wUniform4d = (PFNGLUNIFORM4DPROC) get_proc("glUniform4d"); - gl3wUniform1dv = (PFNGLUNIFORM1DVPROC) get_proc("glUniform1dv"); - gl3wUniform2dv = (PFNGLUNIFORM2DVPROC) get_proc("glUniform2dv"); - gl3wUniform3dv = (PFNGLUNIFORM3DVPROC) get_proc("glUniform3dv"); - gl3wUniform4dv = (PFNGLUNIFORM4DVPROC) get_proc("glUniform4dv"); - gl3wUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) get_proc("glUniformMatrix2dv"); - gl3wUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) get_proc("glUniformMatrix3dv"); - gl3wUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) get_proc("glUniformMatrix4dv"); - gl3wUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) get_proc("glUniformMatrix2x3dv"); - gl3wUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) get_proc("glUniformMatrix2x4dv"); - gl3wUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) get_proc("glUniformMatrix3x2dv"); - gl3wUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) get_proc("glUniformMatrix3x4dv"); - gl3wUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) get_proc("glUniformMatrix4x2dv"); - gl3wUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) get_proc("glUniformMatrix4x3dv"); - gl3wGetUniformdv = (PFNGLGETUNIFORMDVPROC) get_proc("glGetUniformdv"); - gl3wGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) get_proc("glGetSubroutineUniformLocation"); - gl3wGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) get_proc("glGetSubroutineIndex"); - gl3wGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) get_proc("glGetActiveSubroutineUniformiv"); - gl3wGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) get_proc("glGetActiveSubroutineUniformName"); - gl3wGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) get_proc("glGetActiveSubroutineName"); - gl3wUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) get_proc("glUniformSubroutinesuiv"); - gl3wGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) get_proc("glGetUniformSubroutineuiv"); - gl3wGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) get_proc("glGetProgramStageiv"); - gl3wPatchParameteri = (PFNGLPATCHPARAMETERIPROC) get_proc("glPatchParameteri"); - gl3wPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) get_proc("glPatchParameterfv"); - gl3wBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) get_proc("glBindTransformFeedback"); - gl3wDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) get_proc("glDeleteTransformFeedbacks"); - gl3wGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) get_proc("glGenTransformFeedbacks"); - gl3wIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) get_proc("glIsTransformFeedback"); - gl3wPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) get_proc("glPauseTransformFeedback"); - gl3wResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) get_proc("glResumeTransformFeedback"); - gl3wDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) get_proc("glDrawTransformFeedback"); - gl3wDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) get_proc("glDrawTransformFeedbackStream"); - gl3wBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) get_proc("glBeginQueryIndexed"); - gl3wEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) get_proc("glEndQueryIndexed"); - gl3wGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) get_proc("glGetQueryIndexediv"); - gl3wReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) get_proc("glReleaseShaderCompiler"); - gl3wShaderBinary = (PFNGLSHADERBINARYPROC) get_proc("glShaderBinary"); - gl3wGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) get_proc("glGetShaderPrecisionFormat"); - gl3wDepthRangef = (PFNGLDEPTHRANGEFPROC) get_proc("glDepthRangef"); - gl3wClearDepthf = (PFNGLCLEARDEPTHFPROC) get_proc("glClearDepthf"); - gl3wGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) get_proc("glGetProgramBinary"); - gl3wProgramBinary = (PFNGLPROGRAMBINARYPROC) get_proc("glProgramBinary"); - gl3wProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) get_proc("glProgramParameteri"); - gl3wUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) get_proc("glUseProgramStages"); - gl3wActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) get_proc("glActiveShaderProgram"); - gl3wCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) get_proc("glCreateShaderProgramv"); - gl3wBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) get_proc("glBindProgramPipeline"); - gl3wDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) get_proc("glDeleteProgramPipelines"); - gl3wGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) get_proc("glGenProgramPipelines"); - gl3wIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) get_proc("glIsProgramPipeline"); - gl3wGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) get_proc("glGetProgramPipelineiv"); - gl3wProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) get_proc("glProgramUniform1i"); - gl3wProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) get_proc("glProgramUniform1iv"); - gl3wProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) get_proc("glProgramUniform1f"); - gl3wProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) get_proc("glProgramUniform1fv"); - gl3wProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) get_proc("glProgramUniform1d"); - gl3wProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) get_proc("glProgramUniform1dv"); - gl3wProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) get_proc("glProgramUniform1ui"); - gl3wProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) get_proc("glProgramUniform1uiv"); - gl3wProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) get_proc("glProgramUniform2i"); - gl3wProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) get_proc("glProgramUniform2iv"); - gl3wProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) get_proc("glProgramUniform2f"); - gl3wProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) get_proc("glProgramUniform2fv"); - gl3wProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) get_proc("glProgramUniform2d"); - gl3wProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) get_proc("glProgramUniform2dv"); - gl3wProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) get_proc("glProgramUniform2ui"); - gl3wProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) get_proc("glProgramUniform2uiv"); - gl3wProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) get_proc("glProgramUniform3i"); - gl3wProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) get_proc("glProgramUniform3iv"); - gl3wProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) get_proc("glProgramUniform3f"); - gl3wProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) get_proc("glProgramUniform3fv"); - gl3wProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) get_proc("glProgramUniform3d"); - gl3wProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) get_proc("glProgramUniform3dv"); - gl3wProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) get_proc("glProgramUniform3ui"); - gl3wProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) get_proc("glProgramUniform3uiv"); - gl3wProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) get_proc("glProgramUniform4i"); - gl3wProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) get_proc("glProgramUniform4iv"); - gl3wProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) get_proc("glProgramUniform4f"); - gl3wProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) get_proc("glProgramUniform4fv"); - gl3wProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) get_proc("glProgramUniform4d"); - gl3wProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) get_proc("glProgramUniform4dv"); - gl3wProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) get_proc("glProgramUniform4ui"); - gl3wProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) get_proc("glProgramUniform4uiv"); - gl3wProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) get_proc("glProgramUniformMatrix2fv"); - gl3wProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) get_proc("glProgramUniformMatrix3fv"); - gl3wProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) get_proc("glProgramUniformMatrix4fv"); - gl3wProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) get_proc("glProgramUniformMatrix2dv"); - gl3wProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) get_proc("glProgramUniformMatrix3dv"); - gl3wProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) get_proc("glProgramUniformMatrix4dv"); - gl3wProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) get_proc("glProgramUniformMatrix2x3fv"); - gl3wProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) get_proc("glProgramUniformMatrix3x2fv"); - gl3wProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) get_proc("glProgramUniformMatrix2x4fv"); - gl3wProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) get_proc("glProgramUniformMatrix4x2fv"); - gl3wProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) get_proc("glProgramUniformMatrix3x4fv"); - gl3wProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) get_proc("glProgramUniformMatrix4x3fv"); - gl3wProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) get_proc("glProgramUniformMatrix2x3dv"); - gl3wProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) get_proc("glProgramUniformMatrix3x2dv"); - gl3wProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) get_proc("glProgramUniformMatrix2x4dv"); - gl3wProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) get_proc("glProgramUniformMatrix4x2dv"); - gl3wProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) get_proc("glProgramUniformMatrix3x4dv"); - gl3wProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) get_proc("glProgramUniformMatrix4x3dv"); - gl3wValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) get_proc("glValidateProgramPipeline"); - gl3wGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) get_proc("glGetProgramPipelineInfoLog"); - gl3wVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) get_proc("glVertexAttribL1d"); - gl3wVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) get_proc("glVertexAttribL2d"); - gl3wVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) get_proc("glVertexAttribL3d"); - gl3wVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) get_proc("glVertexAttribL4d"); - gl3wVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) get_proc("glVertexAttribL1dv"); - gl3wVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) get_proc("glVertexAttribL2dv"); - gl3wVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) get_proc("glVertexAttribL3dv"); - gl3wVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) get_proc("glVertexAttribL4dv"); - gl3wVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) get_proc("glVertexAttribLPointer"); - gl3wGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) get_proc("glGetVertexAttribLdv"); - gl3wViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) get_proc("glViewportArrayv"); - gl3wViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) get_proc("glViewportIndexedf"); - gl3wViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) get_proc("glViewportIndexedfv"); - gl3wScissorArrayv = (PFNGLSCISSORARRAYVPROC) get_proc("glScissorArrayv"); - gl3wScissorIndexed = (PFNGLSCISSORINDEXEDPROC) get_proc("glScissorIndexed"); - gl3wScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) get_proc("glScissorIndexedv"); - gl3wDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) get_proc("glDepthRangeArrayv"); - gl3wDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) get_proc("glDepthRangeIndexed"); - gl3wGetFloati_v = (PFNGLGETFLOATI_VPROC) get_proc("glGetFloati_v"); - gl3wGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) get_proc("glGetDoublei_v"); - gl3wCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC) get_proc("glCreateSyncFromCLeventARB"); - gl3wDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) get_proc("glDebugMessageControlARB"); - gl3wDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC) get_proc("glDebugMessageInsertARB"); - gl3wDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC) get_proc("glDebugMessageCallbackARB"); - gl3wGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC) get_proc("glGetDebugMessageLogARB"); - gl3wGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC) get_proc("glGetGraphicsResetStatusARB"); - gl3wGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC) get_proc("glGetnTexImageARB"); - gl3wReadnPixelsARB = (PFNGLREADNPIXELSARBPROC) get_proc("glReadnPixelsARB"); - gl3wGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) get_proc("glGetnCompressedTexImageARB"); - gl3wGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC) get_proc("glGetnUniformfvARB"); - gl3wGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC) get_proc("glGetnUniformivARB"); - gl3wGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC) get_proc("glGetnUniformuivARB"); - gl3wGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC) get_proc("glGetnUniformdvARB"); - gl3wDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) get_proc("glDrawArraysInstancedBaseInstance"); - gl3wDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) get_proc("glDrawElementsInstancedBaseInstance"); - gl3wDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) get_proc("glDrawElementsInstancedBaseVertexBaseInstance"); - gl3wDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) get_proc("glDrawTransformFeedbackInstanced"); - gl3wDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) get_proc("glDrawTransformFeedbackStreamInstanced"); - gl3wGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) get_proc("glGetInternalformativ"); - gl3wGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) get_proc("glGetActiveAtomicCounterBufferiv"); - gl3wBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) get_proc("glBindImageTexture"); - gl3wMemoryBarrier = (PFNGLMEMORYBARRIERPROC) get_proc("glMemoryBarrier"); - gl3wTexStorage1D = (PFNGLTEXSTORAGE1DPROC) get_proc("glTexStorage1D"); - gl3wTexStorage2D = (PFNGLTEXSTORAGE2DPROC) get_proc("glTexStorage2D"); - gl3wTexStorage3D = (PFNGLTEXSTORAGE3DPROC) get_proc("glTexStorage3D"); - gl3wTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) get_proc("glTextureStorage1DEXT"); - gl3wTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) get_proc("glTextureStorage2DEXT"); - gl3wTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) get_proc("glTextureStorage3DEXT"); - gl3wDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) get_proc("glDebugMessageControl"); - gl3wDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) get_proc("glDebugMessageInsert"); - gl3wDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) get_proc("glDebugMessageCallback"); - gl3wGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) get_proc("glGetDebugMessageLog"); - gl3wPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) get_proc("glPushDebugGroup"); - gl3wPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) get_proc("glPopDebugGroup"); - gl3wObjectLabel = (PFNGLOBJECTLABELPROC) get_proc("glObjectLabel"); - gl3wGetObjectLabel = (PFNGLGETOBJECTLABELPROC) get_proc("glGetObjectLabel"); - gl3wObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) get_proc("glObjectPtrLabel"); - gl3wGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) get_proc("glGetObjectPtrLabel"); - gl3wClearBufferData = (PFNGLCLEARBUFFERDATAPROC) get_proc("glClearBufferData"); - gl3wClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) get_proc("glClearBufferSubData"); - gl3wClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC) get_proc("glClearNamedBufferDataEXT"); - gl3wClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) get_proc("glClearNamedBufferSubDataEXT"); - gl3wDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) get_proc("glDispatchCompute"); - gl3wDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) get_proc("glDispatchComputeIndirect"); - gl3wCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) get_proc("glCopyImageSubData"); - gl3wTextureView = (PFNGLTEXTUREVIEWPROC) get_proc("glTextureView"); - gl3wBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) get_proc("glBindVertexBuffer"); - gl3wVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) get_proc("glVertexAttribFormat"); - gl3wVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) get_proc("glVertexAttribIFormat"); - gl3wVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) get_proc("glVertexAttribLFormat"); - gl3wVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) get_proc("glVertexAttribBinding"); - gl3wVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) get_proc("glVertexBindingDivisor"); - gl3wVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) get_proc("glVertexArrayBindVertexBufferEXT"); - gl3wVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) get_proc("glVertexArrayVertexAttribFormatEXT"); - gl3wVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) get_proc("glVertexArrayVertexAttribIFormatEXT"); - gl3wVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) get_proc("glVertexArrayVertexAttribLFormatEXT"); - gl3wVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) get_proc("glVertexArrayVertexAttribBindingEXT"); - gl3wVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) get_proc("glVertexArrayVertexBindingDivisorEXT"); - gl3wFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) get_proc("glFramebufferParameteri"); - gl3wGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) get_proc("glGetFramebufferParameteriv"); - gl3wNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) get_proc("glNamedFramebufferParameteriEXT"); - gl3wGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) get_proc("glGetNamedFramebufferParameterivEXT"); - gl3wGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) get_proc("glGetInternalformati64v"); - gl3wInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) get_proc("glInvalidateTexSubImage"); - gl3wInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) get_proc("glInvalidateTexImage"); - gl3wInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) get_proc("glInvalidateBufferSubData"); - gl3wInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) get_proc("glInvalidateBufferData"); - gl3wInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) get_proc("glInvalidateFramebuffer"); - gl3wInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) get_proc("glInvalidateSubFramebuffer"); - gl3wMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) get_proc("glMultiDrawArraysIndirect"); - gl3wMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) get_proc("glMultiDrawElementsIndirect"); - gl3wGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) get_proc("glGetProgramInterfaceiv"); - gl3wGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) get_proc("glGetProgramResourceIndex"); - gl3wGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) get_proc("glGetProgramResourceName"); - gl3wGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) get_proc("glGetProgramResourceiv"); - gl3wGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) get_proc("glGetProgramResourceLocation"); - gl3wGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) get_proc("glGetProgramResourceLocationIndex"); - gl3wShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) get_proc("glShaderStorageBlockBinding"); - gl3wTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) get_proc("glTexBufferRange"); - gl3wTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC) get_proc("glTextureBufferRangeEXT"); - gl3wTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) get_proc("glTexStorage2DMultisample"); - gl3wTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) get_proc("glTexStorage3DMultisample"); - gl3wTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) get_proc("glTextureStorage2DMultisampleEXT"); - gl3wTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) get_proc("glTextureStorage3DMultisampleEXT"); -} diff --git a/core/deps/khronos/GL3/gl3w.h b/core/deps/khronos/GL3/gl3w.h deleted file mode 100644 index cc9d29fac..000000000 --- a/core/deps/khronos/GL3/gl3w.h +++ /dev/null @@ -1,1234 +0,0 @@ -#ifndef __gl3w_h_ -#define __gl3w_h_ - -#include - -#ifndef __gl_h_ -#define __gl_h_ -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* gl3w api */ -int gl3wInit(void); -int gl3wIsSupported(int major, int minor); -void *gl3wGetProcAddress(const char *proc); - -/* OpenGL functions */ -extern PFNGLCULLFACEPROC gl3wCullFace; -extern PFNGLFRONTFACEPROC gl3wFrontFace; -extern PFNGLHINTPROC gl3wHint; -extern PFNGLLINEWIDTHPROC gl3wLineWidth; -extern PFNGLPOINTSIZEPROC gl3wPointSize; -extern PFNGLPOLYGONMODEPROC gl3wPolygonMode; -extern PFNGLSCISSORPROC gl3wScissor; -extern PFNGLTEXPARAMETERFPROC gl3wTexParameterf; -extern PFNGLTEXPARAMETERFVPROC gl3wTexParameterfv; -extern PFNGLTEXPARAMETERIPROC gl3wTexParameteri; -extern PFNGLTEXPARAMETERIVPROC gl3wTexParameteriv; -extern PFNGLTEXIMAGE1DPROC gl3wTexImage1D; -extern PFNGLTEXIMAGE2DPROC gl3wTexImage2D; -extern PFNGLDRAWBUFFERPROC gl3wDrawBuffer; -extern PFNGLCLEARPROC gl3wClear; -extern PFNGLCLEARCOLORPROC gl3wClearColor; -extern PFNGLCLEARSTENCILPROC gl3wClearStencil; -extern PFNGLCLEARDEPTHPROC gl3wClearDepth; -extern PFNGLSTENCILMASKPROC gl3wStencilMask; -extern PFNGLCOLORMASKPROC gl3wColorMask; -extern PFNGLDEPTHMASKPROC gl3wDepthMask; -extern PFNGLDISABLEPROC gl3wDisable; -extern PFNGLENABLEPROC gl3wEnable; -extern PFNGLFINISHPROC gl3wFinish; -extern PFNGLFLUSHPROC gl3wFlush; -extern PFNGLBLENDFUNCPROC gl3wBlendFunc; -extern PFNGLLOGICOPPROC gl3wLogicOp; -extern PFNGLSTENCILFUNCPROC gl3wStencilFunc; -extern PFNGLSTENCILOPPROC gl3wStencilOp; -extern PFNGLDEPTHFUNCPROC gl3wDepthFunc; -extern PFNGLPIXELSTOREFPROC gl3wPixelStoref; -extern PFNGLPIXELSTOREIPROC gl3wPixelStorei; -extern PFNGLREADBUFFERPROC gl3wReadBuffer; -extern PFNGLREADPIXELSPROC gl3wReadPixels; -extern PFNGLGETBOOLEANVPROC gl3wGetBooleanv; -extern PFNGLGETDOUBLEVPROC gl3wGetDoublev; -extern PFNGLGETERRORPROC gl3wGetError; -extern PFNGLGETFLOATVPROC gl3wGetFloatv; -extern PFNGLGETINTEGERVPROC gl3wGetIntegerv; -extern PFNGLGETSTRINGPROC gl3wGetString; -extern PFNGLGETTEXIMAGEPROC gl3wGetTexImage; -extern PFNGLGETTEXPARAMETERFVPROC gl3wGetTexParameterfv; -extern PFNGLGETTEXPARAMETERIVPROC gl3wGetTexParameteriv; -extern PFNGLGETTEXLEVELPARAMETERFVPROC gl3wGetTexLevelParameterfv; -extern PFNGLGETTEXLEVELPARAMETERIVPROC gl3wGetTexLevelParameteriv; -extern PFNGLISENABLEDPROC gl3wIsEnabled; -extern PFNGLDEPTHRANGEPROC gl3wDepthRange; -extern PFNGLVIEWPORTPROC gl3wViewport; -extern PFNGLDRAWARRAYSPROC gl3wDrawArrays; -extern PFNGLDRAWELEMENTSPROC gl3wDrawElements; -extern PFNGLGETPOINTERVPROC gl3wGetPointerv; -extern PFNGLPOLYGONOFFSETPROC gl3wPolygonOffset; -extern PFNGLCOPYTEXIMAGE1DPROC gl3wCopyTexImage1D; -extern PFNGLCOPYTEXIMAGE2DPROC gl3wCopyTexImage2D; -extern PFNGLCOPYTEXSUBIMAGE1DPROC gl3wCopyTexSubImage1D; -extern PFNGLCOPYTEXSUBIMAGE2DPROC gl3wCopyTexSubImage2D; -extern PFNGLTEXSUBIMAGE1DPROC gl3wTexSubImage1D; -extern PFNGLTEXSUBIMAGE2DPROC gl3wTexSubImage2D; -extern PFNGLBINDTEXTUREPROC gl3wBindTexture; -extern PFNGLDELETETEXTURESPROC gl3wDeleteTextures; -extern PFNGLGENTEXTURESPROC gl3wGenTextures; -extern PFNGLISTEXTUREPROC gl3wIsTexture; -extern PFNGLBLENDCOLORPROC gl3wBlendColor; -extern PFNGLBLENDEQUATIONPROC gl3wBlendEquation; -extern PFNGLDRAWRANGEELEMENTSPROC gl3wDrawRangeElements; -extern PFNGLTEXIMAGE3DPROC gl3wTexImage3D; -extern PFNGLTEXSUBIMAGE3DPROC gl3wTexSubImage3D; -extern PFNGLCOPYTEXSUBIMAGE3DPROC gl3wCopyTexSubImage3D; -extern PFNGLACTIVETEXTUREPROC gl3wActiveTexture; -extern PFNGLSAMPLECOVERAGEPROC gl3wSampleCoverage; -extern PFNGLCOMPRESSEDTEXIMAGE3DPROC gl3wCompressedTexImage3D; -extern PFNGLCOMPRESSEDTEXIMAGE2DPROC gl3wCompressedTexImage2D; -extern PFNGLCOMPRESSEDTEXIMAGE1DPROC gl3wCompressedTexImage1D; -extern PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC gl3wCompressedTexSubImage3D; -extern PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC gl3wCompressedTexSubImage2D; -extern PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC gl3wCompressedTexSubImage1D; -extern PFNGLGETCOMPRESSEDTEXIMAGEPROC gl3wGetCompressedTexImage; -extern PFNGLBLENDFUNCSEPARATEPROC gl3wBlendFuncSeparate; -extern PFNGLMULTIDRAWARRAYSPROC gl3wMultiDrawArrays; -extern PFNGLMULTIDRAWELEMENTSPROC gl3wMultiDrawElements; -extern PFNGLPOINTPARAMETERFPROC gl3wPointParameterf; -extern PFNGLPOINTPARAMETERFVPROC gl3wPointParameterfv; -extern PFNGLPOINTPARAMETERIPROC gl3wPointParameteri; -extern PFNGLPOINTPARAMETERIVPROC gl3wPointParameteriv; -extern PFNGLGENQUERIESPROC gl3wGenQueries; -extern PFNGLDELETEQUERIESPROC gl3wDeleteQueries; -extern PFNGLISQUERYPROC gl3wIsQuery; -extern PFNGLBEGINQUERYPROC gl3wBeginQuery; -extern PFNGLENDQUERYPROC gl3wEndQuery; -extern PFNGLGETQUERYIVPROC gl3wGetQueryiv; -extern PFNGLGETQUERYOBJECTIVPROC gl3wGetQueryObjectiv; -extern PFNGLGETQUERYOBJECTUIVPROC gl3wGetQueryObjectuiv; -extern PFNGLBINDBUFFERPROC gl3wBindBuffer; -extern PFNGLDELETEBUFFERSPROC gl3wDeleteBuffers; -extern PFNGLGENBUFFERSPROC gl3wGenBuffers; -extern PFNGLISBUFFERPROC gl3wIsBuffer; -extern PFNGLBUFFERDATAPROC gl3wBufferData; -extern PFNGLBUFFERSUBDATAPROC gl3wBufferSubData; -extern PFNGLGETBUFFERSUBDATAPROC gl3wGetBufferSubData; -extern PFNGLMAPBUFFERPROC gl3wMapBuffer; -extern PFNGLUNMAPBUFFERPROC gl3wUnmapBuffer; -extern PFNGLGETBUFFERPARAMETERIVPROC gl3wGetBufferParameteriv; -extern PFNGLGETBUFFERPOINTERVPROC gl3wGetBufferPointerv; -extern PFNGLBLENDEQUATIONSEPARATEPROC gl3wBlendEquationSeparate; -extern PFNGLDRAWBUFFERSPROC gl3wDrawBuffers; -extern PFNGLSTENCILOPSEPARATEPROC gl3wStencilOpSeparate; -extern PFNGLSTENCILFUNCSEPARATEPROC gl3wStencilFuncSeparate; -extern PFNGLSTENCILMASKSEPARATEPROC gl3wStencilMaskSeparate; -extern PFNGLATTACHSHADERPROC gl3wAttachShader; -extern PFNGLBINDATTRIBLOCATIONPROC gl3wBindAttribLocation; -extern PFNGLCOMPILESHADERPROC gl3wCompileShader; -extern PFNGLCREATEPROGRAMPROC gl3wCreateProgram; -extern PFNGLCREATESHADERPROC gl3wCreateShader; -extern PFNGLDELETEPROGRAMPROC gl3wDeleteProgram; -extern PFNGLDELETESHADERPROC gl3wDeleteShader; -extern PFNGLDETACHSHADERPROC gl3wDetachShader; -extern PFNGLDISABLEVERTEXATTRIBARRAYPROC gl3wDisableVertexAttribArray; -extern PFNGLENABLEVERTEXATTRIBARRAYPROC gl3wEnableVertexAttribArray; -extern PFNGLGETACTIVEATTRIBPROC gl3wGetActiveAttrib; -extern PFNGLGETACTIVEUNIFORMPROC gl3wGetActiveUniform; -extern PFNGLGETATTACHEDSHADERSPROC gl3wGetAttachedShaders; -extern PFNGLGETATTRIBLOCATIONPROC gl3wGetAttribLocation; -extern PFNGLGETPROGRAMIVPROC gl3wGetProgramiv; -extern PFNGLGETPROGRAMINFOLOGPROC gl3wGetProgramInfoLog; -extern PFNGLGETSHADERIVPROC gl3wGetShaderiv; -extern PFNGLGETSHADERINFOLOGPROC gl3wGetShaderInfoLog; -extern PFNGLGETSHADERSOURCEPROC gl3wGetShaderSource; -extern PFNGLGETUNIFORMLOCATIONPROC gl3wGetUniformLocation; -extern PFNGLGETUNIFORMFVPROC gl3wGetUniformfv; -extern PFNGLGETUNIFORMIVPROC gl3wGetUniformiv; -extern PFNGLGETVERTEXATTRIBDVPROC gl3wGetVertexAttribdv; -extern PFNGLGETVERTEXATTRIBFVPROC gl3wGetVertexAttribfv; -extern PFNGLGETVERTEXATTRIBIVPROC gl3wGetVertexAttribiv; -extern PFNGLGETVERTEXATTRIBPOINTERVPROC gl3wGetVertexAttribPointerv; -extern PFNGLISPROGRAMPROC gl3wIsProgram; -extern PFNGLISSHADERPROC gl3wIsShader; -extern PFNGLLINKPROGRAMPROC gl3wLinkProgram; -extern PFNGLSHADERSOURCEPROC gl3wShaderSource; -extern PFNGLUSEPROGRAMPROC gl3wUseProgram; -extern PFNGLUNIFORM1FPROC gl3wUniform1f; -extern PFNGLUNIFORM2FPROC gl3wUniform2f; -extern PFNGLUNIFORM3FPROC gl3wUniform3f; -extern PFNGLUNIFORM4FPROC gl3wUniform4f; -extern PFNGLUNIFORM1IPROC gl3wUniform1i; -extern PFNGLUNIFORM2IPROC gl3wUniform2i; -extern PFNGLUNIFORM3IPROC gl3wUniform3i; -extern PFNGLUNIFORM4IPROC gl3wUniform4i; -extern PFNGLUNIFORM1FVPROC gl3wUniform1fv; -extern PFNGLUNIFORM2FVPROC gl3wUniform2fv; -extern PFNGLUNIFORM3FVPROC gl3wUniform3fv; -extern PFNGLUNIFORM4FVPROC gl3wUniform4fv; -extern PFNGLUNIFORM1IVPROC gl3wUniform1iv; -extern PFNGLUNIFORM2IVPROC gl3wUniform2iv; -extern PFNGLUNIFORM3IVPROC gl3wUniform3iv; -extern PFNGLUNIFORM4IVPROC gl3wUniform4iv; -extern PFNGLUNIFORMMATRIX2FVPROC gl3wUniformMatrix2fv; -extern PFNGLUNIFORMMATRIX3FVPROC gl3wUniformMatrix3fv; -extern PFNGLUNIFORMMATRIX4FVPROC gl3wUniformMatrix4fv; -extern PFNGLVALIDATEPROGRAMPROC gl3wValidateProgram; -extern PFNGLVERTEXATTRIB1DPROC gl3wVertexAttrib1d; -extern PFNGLVERTEXATTRIB1DVPROC gl3wVertexAttrib1dv; -extern PFNGLVERTEXATTRIB1FPROC gl3wVertexAttrib1f; -extern PFNGLVERTEXATTRIB1FVPROC gl3wVertexAttrib1fv; -extern PFNGLVERTEXATTRIB1SPROC gl3wVertexAttrib1s; -extern PFNGLVERTEXATTRIB1SVPROC gl3wVertexAttrib1sv; -extern PFNGLVERTEXATTRIB2DPROC gl3wVertexAttrib2d; -extern PFNGLVERTEXATTRIB2DVPROC gl3wVertexAttrib2dv; -extern PFNGLVERTEXATTRIB2FPROC gl3wVertexAttrib2f; -extern PFNGLVERTEXATTRIB2FVPROC gl3wVertexAttrib2fv; -extern PFNGLVERTEXATTRIB2SPROC gl3wVertexAttrib2s; -extern PFNGLVERTEXATTRIB2SVPROC gl3wVertexAttrib2sv; -extern PFNGLVERTEXATTRIB3DPROC gl3wVertexAttrib3d; -extern PFNGLVERTEXATTRIB3DVPROC gl3wVertexAttrib3dv; -extern PFNGLVERTEXATTRIB3FPROC gl3wVertexAttrib3f; -extern PFNGLVERTEXATTRIB3FVPROC gl3wVertexAttrib3fv; -extern PFNGLVERTEXATTRIB3SPROC gl3wVertexAttrib3s; -extern PFNGLVERTEXATTRIB3SVPROC gl3wVertexAttrib3sv; -extern PFNGLVERTEXATTRIB4NBVPROC gl3wVertexAttrib4Nbv; -extern PFNGLVERTEXATTRIB4NIVPROC gl3wVertexAttrib4Niv; -extern PFNGLVERTEXATTRIB4NSVPROC gl3wVertexAttrib4Nsv; -extern PFNGLVERTEXATTRIB4NUBPROC gl3wVertexAttrib4Nub; -extern PFNGLVERTEXATTRIB4NUBVPROC gl3wVertexAttrib4Nubv; -extern PFNGLVERTEXATTRIB4NUIVPROC gl3wVertexAttrib4Nuiv; -extern PFNGLVERTEXATTRIB4NUSVPROC gl3wVertexAttrib4Nusv; -extern PFNGLVERTEXATTRIB4BVPROC gl3wVertexAttrib4bv; -extern PFNGLVERTEXATTRIB4DPROC gl3wVertexAttrib4d; -extern PFNGLVERTEXATTRIB4DVPROC gl3wVertexAttrib4dv; -extern PFNGLVERTEXATTRIB4FPROC gl3wVertexAttrib4f; -extern PFNGLVERTEXATTRIB4FVPROC gl3wVertexAttrib4fv; -extern PFNGLVERTEXATTRIB4IVPROC gl3wVertexAttrib4iv; -extern PFNGLVERTEXATTRIB4SPROC gl3wVertexAttrib4s; -extern PFNGLVERTEXATTRIB4SVPROC gl3wVertexAttrib4sv; -extern PFNGLVERTEXATTRIB4UBVPROC gl3wVertexAttrib4ubv; -extern PFNGLVERTEXATTRIB4UIVPROC gl3wVertexAttrib4uiv; -extern PFNGLVERTEXATTRIB4USVPROC gl3wVertexAttrib4usv; -extern PFNGLVERTEXATTRIBPOINTERPROC gl3wVertexAttribPointer; -extern PFNGLUNIFORMMATRIX2X3FVPROC gl3wUniformMatrix2x3fv; -extern PFNGLUNIFORMMATRIX3X2FVPROC gl3wUniformMatrix3x2fv; -extern PFNGLUNIFORMMATRIX2X4FVPROC gl3wUniformMatrix2x4fv; -extern PFNGLUNIFORMMATRIX4X2FVPROC gl3wUniformMatrix4x2fv; -extern PFNGLUNIFORMMATRIX3X4FVPROC gl3wUniformMatrix3x4fv; -extern PFNGLUNIFORMMATRIX4X3FVPROC gl3wUniformMatrix4x3fv; -extern PFNGLCOLORMASKIPROC gl3wColorMaski; -extern PFNGLGETBOOLEANI_VPROC gl3wGetBooleani_v; -extern PFNGLGETINTEGERI_VPROC gl3wGetIntegeri_v; -extern PFNGLENABLEIPROC gl3wEnablei; -extern PFNGLDISABLEIPROC gl3wDisablei; -extern PFNGLISENABLEDIPROC gl3wIsEnabledi; -extern PFNGLBEGINTRANSFORMFEEDBACKPROC gl3wBeginTransformFeedback; -extern PFNGLENDTRANSFORMFEEDBACKPROC gl3wEndTransformFeedback; -extern PFNGLBINDBUFFERRANGEPROC gl3wBindBufferRange; -extern PFNGLBINDBUFFERBASEPROC gl3wBindBufferBase; -extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC gl3wTransformFeedbackVaryings; -extern PFNGLGETTRANSFORMFEEDBACKVARYINGPROC gl3wGetTransformFeedbackVarying; -extern PFNGLCLAMPCOLORPROC gl3wClampColor; -extern PFNGLBEGINCONDITIONALRENDERPROC gl3wBeginConditionalRender; -extern PFNGLENDCONDITIONALRENDERPROC gl3wEndConditionalRender; -extern PFNGLVERTEXATTRIBIPOINTERPROC gl3wVertexAttribIPointer; -extern PFNGLGETVERTEXATTRIBIIVPROC gl3wGetVertexAttribIiv; -extern PFNGLGETVERTEXATTRIBIUIVPROC gl3wGetVertexAttribIuiv; -extern PFNGLVERTEXATTRIBI1IPROC gl3wVertexAttribI1i; -extern PFNGLVERTEXATTRIBI2IPROC gl3wVertexAttribI2i; -extern PFNGLVERTEXATTRIBI3IPROC gl3wVertexAttribI3i; -extern PFNGLVERTEXATTRIBI4IPROC gl3wVertexAttribI4i; -extern PFNGLVERTEXATTRIBI1UIPROC gl3wVertexAttribI1ui; -extern PFNGLVERTEXATTRIBI2UIPROC gl3wVertexAttribI2ui; -extern PFNGLVERTEXATTRIBI3UIPROC gl3wVertexAttribI3ui; -extern PFNGLVERTEXATTRIBI4UIPROC gl3wVertexAttribI4ui; -extern PFNGLVERTEXATTRIBI1IVPROC gl3wVertexAttribI1iv; -extern PFNGLVERTEXATTRIBI2IVPROC gl3wVertexAttribI2iv; -extern PFNGLVERTEXATTRIBI3IVPROC gl3wVertexAttribI3iv; -extern PFNGLVERTEXATTRIBI4IVPROC gl3wVertexAttribI4iv; -extern PFNGLVERTEXATTRIBI1UIVPROC gl3wVertexAttribI1uiv; -extern PFNGLVERTEXATTRIBI2UIVPROC gl3wVertexAttribI2uiv; -extern PFNGLVERTEXATTRIBI3UIVPROC gl3wVertexAttribI3uiv; -extern PFNGLVERTEXATTRIBI4UIVPROC gl3wVertexAttribI4uiv; -extern PFNGLVERTEXATTRIBI4BVPROC gl3wVertexAttribI4bv; -extern PFNGLVERTEXATTRIBI4SVPROC gl3wVertexAttribI4sv; -extern PFNGLVERTEXATTRIBI4UBVPROC gl3wVertexAttribI4ubv; -extern PFNGLVERTEXATTRIBI4USVPROC gl3wVertexAttribI4usv; -extern PFNGLGETUNIFORMUIVPROC gl3wGetUniformuiv; -extern PFNGLBINDFRAGDATALOCATIONPROC gl3wBindFragDataLocation; -extern PFNGLGETFRAGDATALOCATIONPROC gl3wGetFragDataLocation; -extern PFNGLUNIFORM1UIPROC gl3wUniform1ui; -extern PFNGLUNIFORM2UIPROC gl3wUniform2ui; -extern PFNGLUNIFORM3UIPROC gl3wUniform3ui; -extern PFNGLUNIFORM4UIPROC gl3wUniform4ui; -extern PFNGLUNIFORM1UIVPROC gl3wUniform1uiv; -extern PFNGLUNIFORM2UIVPROC gl3wUniform2uiv; -extern PFNGLUNIFORM3UIVPROC gl3wUniform3uiv; -extern PFNGLUNIFORM4UIVPROC gl3wUniform4uiv; -extern PFNGLTEXPARAMETERIIVPROC gl3wTexParameterIiv; -extern PFNGLTEXPARAMETERIUIVPROC gl3wTexParameterIuiv; -extern PFNGLGETTEXPARAMETERIIVPROC gl3wGetTexParameterIiv; -extern PFNGLGETTEXPARAMETERIUIVPROC gl3wGetTexParameterIuiv; -extern PFNGLCLEARBUFFERIVPROC gl3wClearBufferiv; -extern PFNGLCLEARBUFFERUIVPROC gl3wClearBufferuiv; -extern PFNGLCLEARBUFFERFVPROC gl3wClearBufferfv; -extern PFNGLCLEARBUFFERFIPROC gl3wClearBufferfi; -extern PFNGLGETSTRINGIPROC gl3wGetStringi; -extern PFNGLDRAWARRAYSINSTANCEDPROC gl3wDrawArraysInstanced; -extern PFNGLDRAWELEMENTSINSTANCEDPROC gl3wDrawElementsInstanced; -extern PFNGLTEXBUFFERPROC gl3wTexBuffer; -extern PFNGLPRIMITIVERESTARTINDEXPROC gl3wPrimitiveRestartIndex; -extern PFNGLGETINTEGER64I_VPROC gl3wGetInteger64i_v; -extern PFNGLGETBUFFERPARAMETERI64VPROC gl3wGetBufferParameteri64v; -extern PFNGLFRAMEBUFFERTEXTUREPROC gl3wFramebufferTexture; -extern PFNGLVERTEXATTRIBDIVISORPROC gl3wVertexAttribDivisor; -extern PFNGLMINSAMPLESHADINGPROC gl3wMinSampleShading; -extern PFNGLBLENDEQUATIONIPROC gl3wBlendEquationi; -extern PFNGLBLENDEQUATIONSEPARATEIPROC gl3wBlendEquationSeparatei; -extern PFNGLBLENDFUNCIPROC gl3wBlendFunci; -extern PFNGLBLENDFUNCSEPARATEIPROC gl3wBlendFuncSeparatei; -extern PFNGLISRENDERBUFFERPROC gl3wIsRenderbuffer; -extern PFNGLBINDRENDERBUFFERPROC gl3wBindRenderbuffer; -extern PFNGLDELETERENDERBUFFERSPROC gl3wDeleteRenderbuffers; -extern PFNGLGENRENDERBUFFERSPROC gl3wGenRenderbuffers; -extern PFNGLRENDERBUFFERSTORAGEPROC gl3wRenderbufferStorage; -extern PFNGLGETRENDERBUFFERPARAMETERIVPROC gl3wGetRenderbufferParameteriv; -extern PFNGLISFRAMEBUFFERPROC gl3wIsFramebuffer; -extern PFNGLBINDFRAMEBUFFERPROC gl3wBindFramebuffer; -extern PFNGLDELETEFRAMEBUFFERSPROC gl3wDeleteFramebuffers; -extern PFNGLGENFRAMEBUFFERSPROC gl3wGenFramebuffers; -extern PFNGLCHECKFRAMEBUFFERSTATUSPROC gl3wCheckFramebufferStatus; -extern PFNGLFRAMEBUFFERTEXTURE1DPROC gl3wFramebufferTexture1D; -extern PFNGLFRAMEBUFFERTEXTURE2DPROC gl3wFramebufferTexture2D; -extern PFNGLFRAMEBUFFERTEXTURE3DPROC gl3wFramebufferTexture3D; -extern PFNGLFRAMEBUFFERRENDERBUFFERPROC gl3wFramebufferRenderbuffer; -extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC gl3wGetFramebufferAttachmentParameteriv; -extern PFNGLGENERATEMIPMAPPROC gl3wGenerateMipmap; -extern PFNGLBLITFRAMEBUFFERPROC gl3wBlitFramebuffer; -extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC gl3wRenderbufferStorageMultisample; -extern PFNGLFRAMEBUFFERTEXTURELAYERPROC gl3wFramebufferTextureLayer; -extern PFNGLMAPBUFFERRANGEPROC gl3wMapBufferRange; -extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl3wFlushMappedBufferRange; -extern PFNGLBINDVERTEXARRAYPROC gl3wBindVertexArray; -extern PFNGLDELETEVERTEXARRAYSPROC gl3wDeleteVertexArrays; -extern PFNGLGENVERTEXARRAYSPROC gl3wGenVertexArrays; -extern PFNGLISVERTEXARRAYPROC gl3wIsVertexArray; -extern PFNGLGETUNIFORMINDICESPROC gl3wGetUniformIndices; -extern PFNGLGETACTIVEUNIFORMSIVPROC gl3wGetActiveUniformsiv; -extern PFNGLGETACTIVEUNIFORMNAMEPROC gl3wGetActiveUniformName; -extern PFNGLGETUNIFORMBLOCKINDEXPROC gl3wGetUniformBlockIndex; -extern PFNGLGETACTIVEUNIFORMBLOCKIVPROC gl3wGetActiveUniformBlockiv; -extern PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC gl3wGetActiveUniformBlockName; -extern PFNGLUNIFORMBLOCKBINDINGPROC gl3wUniformBlockBinding; -extern PFNGLCOPYBUFFERSUBDATAPROC gl3wCopyBufferSubData; -extern PFNGLDRAWELEMENTSBASEVERTEXPROC gl3wDrawElementsBaseVertex; -extern PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC gl3wDrawRangeElementsBaseVertex; -extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC gl3wDrawElementsInstancedBaseVertex; -extern PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC gl3wMultiDrawElementsBaseVertex; -extern PFNGLPROVOKINGVERTEXPROC gl3wProvokingVertex; -extern PFNGLFENCESYNCPROC gl3wFenceSync; -extern PFNGLISSYNCPROC gl3wIsSync; -extern PFNGLDELETESYNCPROC gl3wDeleteSync; -extern PFNGLCLIENTWAITSYNCPROC gl3wClientWaitSync; -extern PFNGLWAITSYNCPROC gl3wWaitSync; -extern PFNGLGETINTEGER64VPROC gl3wGetInteger64v; -extern PFNGLGETSYNCIVPROC gl3wGetSynciv; -extern PFNGLTEXIMAGE2DMULTISAMPLEPROC gl3wTexImage2DMultisample; -extern PFNGLTEXIMAGE3DMULTISAMPLEPROC gl3wTexImage3DMultisample; -extern PFNGLGETMULTISAMPLEFVPROC gl3wGetMultisamplefv; -extern PFNGLSAMPLEMASKIPROC gl3wSampleMaski; -extern PFNGLBLENDEQUATIONIARBPROC gl3wBlendEquationiARB; -extern PFNGLBLENDEQUATIONSEPARATEIARBPROC gl3wBlendEquationSeparateiARB; -extern PFNGLBLENDFUNCIARBPROC gl3wBlendFunciARB; -extern PFNGLBLENDFUNCSEPARATEIARBPROC gl3wBlendFuncSeparateiARB; -extern PFNGLMINSAMPLESHADINGARBPROC gl3wMinSampleShadingARB; -extern PFNGLNAMEDSTRINGARBPROC gl3wNamedStringARB; -extern PFNGLDELETENAMEDSTRINGARBPROC gl3wDeleteNamedStringARB; -extern PFNGLCOMPILESHADERINCLUDEARBPROC gl3wCompileShaderIncludeARB; -extern PFNGLISNAMEDSTRINGARBPROC gl3wIsNamedStringARB; -extern PFNGLGETNAMEDSTRINGARBPROC gl3wGetNamedStringARB; -extern PFNGLGETNAMEDSTRINGIVARBPROC gl3wGetNamedStringivARB; -extern PFNGLBINDFRAGDATALOCATIONINDEXEDPROC gl3wBindFragDataLocationIndexed; -extern PFNGLGETFRAGDATAINDEXPROC gl3wGetFragDataIndex; -extern PFNGLGENSAMPLERSPROC gl3wGenSamplers; -extern PFNGLDELETESAMPLERSPROC gl3wDeleteSamplers; -extern PFNGLISSAMPLERPROC gl3wIsSampler; -extern PFNGLBINDSAMPLERPROC gl3wBindSampler; -extern PFNGLSAMPLERPARAMETERIPROC gl3wSamplerParameteri; -extern PFNGLSAMPLERPARAMETERIVPROC gl3wSamplerParameteriv; -extern PFNGLSAMPLERPARAMETERFPROC gl3wSamplerParameterf; -extern PFNGLSAMPLERPARAMETERFVPROC gl3wSamplerParameterfv; -extern PFNGLSAMPLERPARAMETERIIVPROC gl3wSamplerParameterIiv; -extern PFNGLSAMPLERPARAMETERIUIVPROC gl3wSamplerParameterIuiv; -extern PFNGLGETSAMPLERPARAMETERIVPROC gl3wGetSamplerParameteriv; -extern PFNGLGETSAMPLERPARAMETERIIVPROC gl3wGetSamplerParameterIiv; -extern PFNGLGETSAMPLERPARAMETERFVPROC gl3wGetSamplerParameterfv; -extern PFNGLGETSAMPLERPARAMETERIUIVPROC gl3wGetSamplerParameterIuiv; -extern PFNGLQUERYCOUNTERPROC gl3wQueryCounter; -extern PFNGLGETQUERYOBJECTI64VPROC gl3wGetQueryObjecti64v; -extern PFNGLGETQUERYOBJECTUI64VPROC gl3wGetQueryObjectui64v; -extern PFNGLVERTEXP2UIPROC gl3wVertexP2ui; -extern PFNGLVERTEXP2UIVPROC gl3wVertexP2uiv; -extern PFNGLVERTEXP3UIPROC gl3wVertexP3ui; -extern PFNGLVERTEXP3UIVPROC gl3wVertexP3uiv; -extern PFNGLVERTEXP4UIPROC gl3wVertexP4ui; -extern PFNGLVERTEXP4UIVPROC gl3wVertexP4uiv; -extern PFNGLTEXCOORDP1UIPROC gl3wTexCoordP1ui; -extern PFNGLTEXCOORDP1UIVPROC gl3wTexCoordP1uiv; -extern PFNGLTEXCOORDP2UIPROC gl3wTexCoordP2ui; -extern PFNGLTEXCOORDP2UIVPROC gl3wTexCoordP2uiv; -extern PFNGLTEXCOORDP3UIPROC gl3wTexCoordP3ui; -extern PFNGLTEXCOORDP3UIVPROC gl3wTexCoordP3uiv; -extern PFNGLTEXCOORDP4UIPROC gl3wTexCoordP4ui; -extern PFNGLTEXCOORDP4UIVPROC gl3wTexCoordP4uiv; -extern PFNGLMULTITEXCOORDP1UIPROC gl3wMultiTexCoordP1ui; -extern PFNGLMULTITEXCOORDP1UIVPROC gl3wMultiTexCoordP1uiv; -extern PFNGLMULTITEXCOORDP2UIPROC gl3wMultiTexCoordP2ui; -extern PFNGLMULTITEXCOORDP2UIVPROC gl3wMultiTexCoordP2uiv; -extern PFNGLMULTITEXCOORDP3UIPROC gl3wMultiTexCoordP3ui; -extern PFNGLMULTITEXCOORDP3UIVPROC gl3wMultiTexCoordP3uiv; -extern PFNGLMULTITEXCOORDP4UIPROC gl3wMultiTexCoordP4ui; -extern PFNGLMULTITEXCOORDP4UIVPROC gl3wMultiTexCoordP4uiv; -extern PFNGLNORMALP3UIPROC gl3wNormalP3ui; -extern PFNGLNORMALP3UIVPROC gl3wNormalP3uiv; -extern PFNGLCOLORP3UIPROC gl3wColorP3ui; -extern PFNGLCOLORP3UIVPROC gl3wColorP3uiv; -extern PFNGLCOLORP4UIPROC gl3wColorP4ui; -extern PFNGLCOLORP4UIVPROC gl3wColorP4uiv; -extern PFNGLSECONDARYCOLORP3UIPROC gl3wSecondaryColorP3ui; -extern PFNGLSECONDARYCOLORP3UIVPROC gl3wSecondaryColorP3uiv; -extern PFNGLVERTEXATTRIBP1UIPROC gl3wVertexAttribP1ui; -extern PFNGLVERTEXATTRIBP1UIVPROC gl3wVertexAttribP1uiv; -extern PFNGLVERTEXATTRIBP2UIPROC gl3wVertexAttribP2ui; -extern PFNGLVERTEXATTRIBP2UIVPROC gl3wVertexAttribP2uiv; -extern PFNGLVERTEXATTRIBP3UIPROC gl3wVertexAttribP3ui; -extern PFNGLVERTEXATTRIBP3UIVPROC gl3wVertexAttribP3uiv; -extern PFNGLVERTEXATTRIBP4UIPROC gl3wVertexAttribP4ui; -extern PFNGLVERTEXATTRIBP4UIVPROC gl3wVertexAttribP4uiv; -extern PFNGLDRAWARRAYSINDIRECTPROC gl3wDrawArraysIndirect; -extern PFNGLDRAWELEMENTSINDIRECTPROC gl3wDrawElementsIndirect; -extern PFNGLUNIFORM1DPROC gl3wUniform1d; -extern PFNGLUNIFORM2DPROC gl3wUniform2d; -extern PFNGLUNIFORM3DPROC gl3wUniform3d; -extern PFNGLUNIFORM4DPROC gl3wUniform4d; -extern PFNGLUNIFORM1DVPROC gl3wUniform1dv; -extern PFNGLUNIFORM2DVPROC gl3wUniform2dv; -extern PFNGLUNIFORM3DVPROC gl3wUniform3dv; -extern PFNGLUNIFORM4DVPROC gl3wUniform4dv; -extern PFNGLUNIFORMMATRIX2DVPROC gl3wUniformMatrix2dv; -extern PFNGLUNIFORMMATRIX3DVPROC gl3wUniformMatrix3dv; -extern PFNGLUNIFORMMATRIX4DVPROC gl3wUniformMatrix4dv; -extern PFNGLUNIFORMMATRIX2X3DVPROC gl3wUniformMatrix2x3dv; -extern PFNGLUNIFORMMATRIX2X4DVPROC gl3wUniformMatrix2x4dv; -extern PFNGLUNIFORMMATRIX3X2DVPROC gl3wUniformMatrix3x2dv; -extern PFNGLUNIFORMMATRIX3X4DVPROC gl3wUniformMatrix3x4dv; -extern PFNGLUNIFORMMATRIX4X2DVPROC gl3wUniformMatrix4x2dv; -extern PFNGLUNIFORMMATRIX4X3DVPROC gl3wUniformMatrix4x3dv; -extern PFNGLGETUNIFORMDVPROC gl3wGetUniformdv; -extern PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC gl3wGetSubroutineUniformLocation; -extern PFNGLGETSUBROUTINEINDEXPROC gl3wGetSubroutineIndex; -extern PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC gl3wGetActiveSubroutineUniformiv; -extern PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC gl3wGetActiveSubroutineUniformName; -extern PFNGLGETACTIVESUBROUTINENAMEPROC gl3wGetActiveSubroutineName; -extern PFNGLUNIFORMSUBROUTINESUIVPROC gl3wUniformSubroutinesuiv; -extern PFNGLGETUNIFORMSUBROUTINEUIVPROC gl3wGetUniformSubroutineuiv; -extern PFNGLGETPROGRAMSTAGEIVPROC gl3wGetProgramStageiv; -extern PFNGLPATCHPARAMETERIPROC gl3wPatchParameteri; -extern PFNGLPATCHPARAMETERFVPROC gl3wPatchParameterfv; -extern PFNGLBINDTRANSFORMFEEDBACKPROC gl3wBindTransformFeedback; -extern PFNGLDELETETRANSFORMFEEDBACKSPROC gl3wDeleteTransformFeedbacks; -extern PFNGLGENTRANSFORMFEEDBACKSPROC gl3wGenTransformFeedbacks; -extern PFNGLISTRANSFORMFEEDBACKPROC gl3wIsTransformFeedback; -extern PFNGLPAUSETRANSFORMFEEDBACKPROC gl3wPauseTransformFeedback; -extern PFNGLRESUMETRANSFORMFEEDBACKPROC gl3wResumeTransformFeedback; -extern PFNGLDRAWTRANSFORMFEEDBACKPROC gl3wDrawTransformFeedback; -extern PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC gl3wDrawTransformFeedbackStream; -extern PFNGLBEGINQUERYINDEXEDPROC gl3wBeginQueryIndexed; -extern PFNGLENDQUERYINDEXEDPROC gl3wEndQueryIndexed; -extern PFNGLGETQUERYINDEXEDIVPROC gl3wGetQueryIndexediv; -extern PFNGLRELEASESHADERCOMPILERPROC gl3wReleaseShaderCompiler; -extern PFNGLSHADERBINARYPROC gl3wShaderBinary; -extern PFNGLGETSHADERPRECISIONFORMATPROC gl3wGetShaderPrecisionFormat; -extern PFNGLDEPTHRANGEFPROC gl3wDepthRangef; -extern PFNGLCLEARDEPTHFPROC gl3wClearDepthf; -extern PFNGLGETPROGRAMBINARYPROC gl3wGetProgramBinary; -extern PFNGLPROGRAMBINARYPROC gl3wProgramBinary; -extern PFNGLPROGRAMPARAMETERIPROC gl3wProgramParameteri; -extern PFNGLUSEPROGRAMSTAGESPROC gl3wUseProgramStages; -extern PFNGLACTIVESHADERPROGRAMPROC gl3wActiveShaderProgram; -extern PFNGLCREATESHADERPROGRAMVPROC gl3wCreateShaderProgramv; -extern PFNGLBINDPROGRAMPIPELINEPROC gl3wBindProgramPipeline; -extern PFNGLDELETEPROGRAMPIPELINESPROC gl3wDeleteProgramPipelines; -extern PFNGLGENPROGRAMPIPELINESPROC gl3wGenProgramPipelines; -extern PFNGLISPROGRAMPIPELINEPROC gl3wIsProgramPipeline; -extern PFNGLGETPROGRAMPIPELINEIVPROC gl3wGetProgramPipelineiv; -extern PFNGLPROGRAMUNIFORM1IPROC gl3wProgramUniform1i; -extern PFNGLPROGRAMUNIFORM1IVPROC gl3wProgramUniform1iv; -extern PFNGLPROGRAMUNIFORM1FPROC gl3wProgramUniform1f; -extern PFNGLPROGRAMUNIFORM1FVPROC gl3wProgramUniform1fv; -extern PFNGLPROGRAMUNIFORM1DPROC gl3wProgramUniform1d; -extern PFNGLPROGRAMUNIFORM1DVPROC gl3wProgramUniform1dv; -extern PFNGLPROGRAMUNIFORM1UIPROC gl3wProgramUniform1ui; -extern PFNGLPROGRAMUNIFORM1UIVPROC gl3wProgramUniform1uiv; -extern PFNGLPROGRAMUNIFORM2IPROC gl3wProgramUniform2i; -extern PFNGLPROGRAMUNIFORM2IVPROC gl3wProgramUniform2iv; -extern PFNGLPROGRAMUNIFORM2FPROC gl3wProgramUniform2f; -extern PFNGLPROGRAMUNIFORM2FVPROC gl3wProgramUniform2fv; -extern PFNGLPROGRAMUNIFORM2DPROC gl3wProgramUniform2d; -extern PFNGLPROGRAMUNIFORM2DVPROC gl3wProgramUniform2dv; -extern PFNGLPROGRAMUNIFORM2UIPROC gl3wProgramUniform2ui; -extern PFNGLPROGRAMUNIFORM2UIVPROC gl3wProgramUniform2uiv; -extern PFNGLPROGRAMUNIFORM3IPROC gl3wProgramUniform3i; -extern PFNGLPROGRAMUNIFORM3IVPROC gl3wProgramUniform3iv; -extern PFNGLPROGRAMUNIFORM3FPROC gl3wProgramUniform3f; -extern PFNGLPROGRAMUNIFORM3FVPROC gl3wProgramUniform3fv; -extern PFNGLPROGRAMUNIFORM3DPROC gl3wProgramUniform3d; -extern PFNGLPROGRAMUNIFORM3DVPROC gl3wProgramUniform3dv; -extern PFNGLPROGRAMUNIFORM3UIPROC gl3wProgramUniform3ui; -extern PFNGLPROGRAMUNIFORM3UIVPROC gl3wProgramUniform3uiv; -extern PFNGLPROGRAMUNIFORM4IPROC gl3wProgramUniform4i; -extern PFNGLPROGRAMUNIFORM4IVPROC gl3wProgramUniform4iv; -extern PFNGLPROGRAMUNIFORM4FPROC gl3wProgramUniform4f; -extern PFNGLPROGRAMUNIFORM4FVPROC gl3wProgramUniform4fv; -extern PFNGLPROGRAMUNIFORM4DPROC gl3wProgramUniform4d; -extern PFNGLPROGRAMUNIFORM4DVPROC gl3wProgramUniform4dv; -extern PFNGLPROGRAMUNIFORM4UIPROC gl3wProgramUniform4ui; -extern PFNGLPROGRAMUNIFORM4UIVPROC gl3wProgramUniform4uiv; -extern PFNGLPROGRAMUNIFORMMATRIX2FVPROC gl3wProgramUniformMatrix2fv; -extern PFNGLPROGRAMUNIFORMMATRIX3FVPROC gl3wProgramUniformMatrix3fv; -extern PFNGLPROGRAMUNIFORMMATRIX4FVPROC gl3wProgramUniformMatrix4fv; -extern PFNGLPROGRAMUNIFORMMATRIX2DVPROC gl3wProgramUniformMatrix2dv; -extern PFNGLPROGRAMUNIFORMMATRIX3DVPROC gl3wProgramUniformMatrix3dv; -extern PFNGLPROGRAMUNIFORMMATRIX4DVPROC gl3wProgramUniformMatrix4dv; -extern PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC gl3wProgramUniformMatrix2x3fv; -extern PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC gl3wProgramUniformMatrix3x2fv; -extern PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC gl3wProgramUniformMatrix2x4fv; -extern PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC gl3wProgramUniformMatrix4x2fv; -extern PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC gl3wProgramUniformMatrix3x4fv; -extern PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC gl3wProgramUniformMatrix4x3fv; -extern PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC gl3wProgramUniformMatrix2x3dv; -extern PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC gl3wProgramUniformMatrix3x2dv; -extern PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC gl3wProgramUniformMatrix2x4dv; -extern PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC gl3wProgramUniformMatrix4x2dv; -extern PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC gl3wProgramUniformMatrix3x4dv; -extern PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC gl3wProgramUniformMatrix4x3dv; -extern PFNGLVALIDATEPROGRAMPIPELINEPROC gl3wValidateProgramPipeline; -extern PFNGLGETPROGRAMPIPELINEINFOLOGPROC gl3wGetProgramPipelineInfoLog; -extern PFNGLVERTEXATTRIBL1DPROC gl3wVertexAttribL1d; -extern PFNGLVERTEXATTRIBL2DPROC gl3wVertexAttribL2d; -extern PFNGLVERTEXATTRIBL3DPROC gl3wVertexAttribL3d; -extern PFNGLVERTEXATTRIBL4DPROC gl3wVertexAttribL4d; -extern PFNGLVERTEXATTRIBL1DVPROC gl3wVertexAttribL1dv; -extern PFNGLVERTEXATTRIBL2DVPROC gl3wVertexAttribL2dv; -extern PFNGLVERTEXATTRIBL3DVPROC gl3wVertexAttribL3dv; -extern PFNGLVERTEXATTRIBL4DVPROC gl3wVertexAttribL4dv; -extern PFNGLVERTEXATTRIBLPOINTERPROC gl3wVertexAttribLPointer; -extern PFNGLGETVERTEXATTRIBLDVPROC gl3wGetVertexAttribLdv; -extern PFNGLVIEWPORTARRAYVPROC gl3wViewportArrayv; -extern PFNGLVIEWPORTINDEXEDFPROC gl3wViewportIndexedf; -extern PFNGLVIEWPORTINDEXEDFVPROC gl3wViewportIndexedfv; -extern PFNGLSCISSORARRAYVPROC gl3wScissorArrayv; -extern PFNGLSCISSORINDEXEDPROC gl3wScissorIndexed; -extern PFNGLSCISSORINDEXEDVPROC gl3wScissorIndexedv; -extern PFNGLDEPTHRANGEARRAYVPROC gl3wDepthRangeArrayv; -extern PFNGLDEPTHRANGEINDEXEDPROC gl3wDepthRangeIndexed; -extern PFNGLGETFLOATI_VPROC gl3wGetFloati_v; -extern PFNGLGETDOUBLEI_VPROC gl3wGetDoublei_v; -extern PFNGLCREATESYNCFROMCLEVENTARBPROC gl3wCreateSyncFromCLeventARB; -extern PFNGLDEBUGMESSAGECONTROLARBPROC gl3wDebugMessageControlARB; -extern PFNGLDEBUGMESSAGEINSERTARBPROC gl3wDebugMessageInsertARB; -extern PFNGLDEBUGMESSAGECALLBACKARBPROC gl3wDebugMessageCallbackARB; -extern PFNGLGETDEBUGMESSAGELOGARBPROC gl3wGetDebugMessageLogARB; -extern PFNGLGETGRAPHICSRESETSTATUSARBPROC gl3wGetGraphicsResetStatusARB; -extern PFNGLGETNTEXIMAGEARBPROC gl3wGetnTexImageARB; -extern PFNGLREADNPIXELSARBPROC gl3wReadnPixelsARB; -extern PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC gl3wGetnCompressedTexImageARB; -extern PFNGLGETNUNIFORMFVARBPROC gl3wGetnUniformfvARB; -extern PFNGLGETNUNIFORMIVARBPROC gl3wGetnUniformivARB; -extern PFNGLGETNUNIFORMUIVARBPROC gl3wGetnUniformuivARB; -extern PFNGLGETNUNIFORMDVARBPROC gl3wGetnUniformdvARB; -extern PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC gl3wDrawArraysInstancedBaseInstance; -extern PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC gl3wDrawElementsInstancedBaseInstance; -extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC gl3wDrawElementsInstancedBaseVertexBaseInstance; -extern PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC gl3wDrawTransformFeedbackInstanced; -extern PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC gl3wDrawTransformFeedbackStreamInstanced; -extern PFNGLGETINTERNALFORMATIVPROC gl3wGetInternalformativ; -extern PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC gl3wGetActiveAtomicCounterBufferiv; -extern PFNGLBINDIMAGETEXTUREPROC gl3wBindImageTexture; -extern PFNGLMEMORYBARRIERPROC gl3wMemoryBarrier; -extern PFNGLTEXSTORAGE1DPROC gl3wTexStorage1D; -extern PFNGLTEXSTORAGE2DPROC gl3wTexStorage2D; -extern PFNGLTEXSTORAGE3DPROC gl3wTexStorage3D; -extern PFNGLTEXTURESTORAGE1DEXTPROC gl3wTextureStorage1DEXT; -extern PFNGLTEXTURESTORAGE2DEXTPROC gl3wTextureStorage2DEXT; -extern PFNGLTEXTURESTORAGE3DEXTPROC gl3wTextureStorage3DEXT; -extern PFNGLDEBUGMESSAGECONTROLPROC gl3wDebugMessageControl; -extern PFNGLDEBUGMESSAGEINSERTPROC gl3wDebugMessageInsert; -extern PFNGLDEBUGMESSAGECALLBACKPROC gl3wDebugMessageCallback; -extern PFNGLGETDEBUGMESSAGELOGPROC gl3wGetDebugMessageLog; -extern PFNGLPUSHDEBUGGROUPPROC gl3wPushDebugGroup; -extern PFNGLPOPDEBUGGROUPPROC gl3wPopDebugGroup; -extern PFNGLOBJECTLABELPROC gl3wObjectLabel; -extern PFNGLGETOBJECTLABELPROC gl3wGetObjectLabel; -extern PFNGLOBJECTPTRLABELPROC gl3wObjectPtrLabel; -extern PFNGLGETOBJECTPTRLABELPROC gl3wGetObjectPtrLabel; -extern PFNGLCLEARBUFFERDATAPROC gl3wClearBufferData; -extern PFNGLCLEARBUFFERSUBDATAPROC gl3wClearBufferSubData; -extern PFNGLCLEARNAMEDBUFFERDATAEXTPROC gl3wClearNamedBufferDataEXT; -extern PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC gl3wClearNamedBufferSubDataEXT; -extern PFNGLDISPATCHCOMPUTEPROC gl3wDispatchCompute; -extern PFNGLDISPATCHCOMPUTEINDIRECTPROC gl3wDispatchComputeIndirect; -extern PFNGLCOPYIMAGESUBDATAPROC gl3wCopyImageSubData; -extern PFNGLTEXTUREVIEWPROC gl3wTextureView; -extern PFNGLBINDVERTEXBUFFERPROC gl3wBindVertexBuffer; -extern PFNGLVERTEXATTRIBFORMATPROC gl3wVertexAttribFormat; -extern PFNGLVERTEXATTRIBIFORMATPROC gl3wVertexAttribIFormat; -extern PFNGLVERTEXATTRIBLFORMATPROC gl3wVertexAttribLFormat; -extern PFNGLVERTEXATTRIBBINDINGPROC gl3wVertexAttribBinding; -extern PFNGLVERTEXBINDINGDIVISORPROC gl3wVertexBindingDivisor; -extern PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC gl3wVertexArrayBindVertexBufferEXT; -extern PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC gl3wVertexArrayVertexAttribFormatEXT; -extern PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC gl3wVertexArrayVertexAttribIFormatEXT; -extern PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC gl3wVertexArrayVertexAttribLFormatEXT; -extern PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC gl3wVertexArrayVertexAttribBindingEXT; -extern PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC gl3wVertexArrayVertexBindingDivisorEXT; -extern PFNGLFRAMEBUFFERPARAMETERIPROC gl3wFramebufferParameteri; -extern PFNGLGETFRAMEBUFFERPARAMETERIVPROC gl3wGetFramebufferParameteriv; -extern PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC gl3wNamedFramebufferParameteriEXT; -extern PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC gl3wGetNamedFramebufferParameterivEXT; -extern PFNGLGETINTERNALFORMATI64VPROC gl3wGetInternalformati64v; -extern PFNGLINVALIDATETEXSUBIMAGEPROC gl3wInvalidateTexSubImage; -extern PFNGLINVALIDATETEXIMAGEPROC gl3wInvalidateTexImage; -extern PFNGLINVALIDATEBUFFERSUBDATAPROC gl3wInvalidateBufferSubData; -extern PFNGLINVALIDATEBUFFERDATAPROC gl3wInvalidateBufferData; -extern PFNGLINVALIDATEFRAMEBUFFERPROC gl3wInvalidateFramebuffer; -extern PFNGLINVALIDATESUBFRAMEBUFFERPROC gl3wInvalidateSubFramebuffer; -extern PFNGLMULTIDRAWARRAYSINDIRECTPROC gl3wMultiDrawArraysIndirect; -extern PFNGLMULTIDRAWELEMENTSINDIRECTPROC gl3wMultiDrawElementsIndirect; -extern PFNGLGETPROGRAMINTERFACEIVPROC gl3wGetProgramInterfaceiv; -extern PFNGLGETPROGRAMRESOURCEINDEXPROC gl3wGetProgramResourceIndex; -extern PFNGLGETPROGRAMRESOURCENAMEPROC gl3wGetProgramResourceName; -extern PFNGLGETPROGRAMRESOURCEIVPROC gl3wGetProgramResourceiv; -extern PFNGLGETPROGRAMRESOURCELOCATIONPROC gl3wGetProgramResourceLocation; -extern PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC gl3wGetProgramResourceLocationIndex; -extern PFNGLSHADERSTORAGEBLOCKBINDINGPROC gl3wShaderStorageBlockBinding; -extern PFNGLTEXBUFFERRANGEPROC gl3wTexBufferRange; -extern PFNGLTEXTUREBUFFERRANGEEXTPROC gl3wTextureBufferRangeEXT; -extern PFNGLTEXSTORAGE2DMULTISAMPLEPROC gl3wTexStorage2DMultisample; -extern PFNGLTEXSTORAGE3DMULTISAMPLEPROC gl3wTexStorage3DMultisample; -extern PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC gl3wTextureStorage2DMultisampleEXT; -extern PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC gl3wTextureStorage3DMultisampleEXT; - -#define glCullFace gl3wCullFace -#define glFrontFace gl3wFrontFace -#define glHint gl3wHint -#define glLineWidth gl3wLineWidth -#define glPointSize gl3wPointSize -#define glPolygonMode gl3wPolygonMode -#define glScissor gl3wScissor -#define glTexParameterf gl3wTexParameterf -#define glTexParameterfv gl3wTexParameterfv -#define glTexParameteri gl3wTexParameteri -#define glTexParameteriv gl3wTexParameteriv -#define glTexImage1D gl3wTexImage1D -#define glTexImage2D gl3wTexImage2D -#define glDrawBuffer gl3wDrawBuffer -#define glClear gl3wClear -#define glClearColor gl3wClearColor -#define glClearStencil gl3wClearStencil -#define glClearDepth gl3wClearDepth -#define glStencilMask gl3wStencilMask -#define glColorMask gl3wColorMask -#define glDepthMask gl3wDepthMask -#define glDisable gl3wDisable -#define glEnable gl3wEnable -#define glFinish gl3wFinish -#define glFlush gl3wFlush -#define glBlendFunc gl3wBlendFunc -#define glLogicOp gl3wLogicOp -#define glStencilFunc gl3wStencilFunc -#define glStencilOp gl3wStencilOp -#define glDepthFunc gl3wDepthFunc -#define glPixelStoref gl3wPixelStoref -#define glPixelStorei gl3wPixelStorei -#define glReadBuffer gl3wReadBuffer -#define glReadPixels gl3wReadPixels -#define glGetBooleanv gl3wGetBooleanv -#define glGetDoublev gl3wGetDoublev -#define glGetError gl3wGetError -#define glGetFloatv gl3wGetFloatv -#define glGetIntegerv gl3wGetIntegerv -#define glGetString gl3wGetString -#define glGetTexImage gl3wGetTexImage -#define glGetTexParameterfv gl3wGetTexParameterfv -#define glGetTexParameteriv gl3wGetTexParameteriv -#define glGetTexLevelParameterfv gl3wGetTexLevelParameterfv -#define glGetTexLevelParameteriv gl3wGetTexLevelParameteriv -#define glIsEnabled gl3wIsEnabled -#define glDepthRange gl3wDepthRange -#define glViewport gl3wViewport -#define glDrawArrays gl3wDrawArrays -#define glDrawElements gl3wDrawElements -#define glGetPointerv gl3wGetPointerv -#define glPolygonOffset gl3wPolygonOffset -#define glCopyTexImage1D gl3wCopyTexImage1D -#define glCopyTexImage2D gl3wCopyTexImage2D -#define glCopyTexSubImage1D gl3wCopyTexSubImage1D -#define glCopyTexSubImage2D gl3wCopyTexSubImage2D -#define glTexSubImage1D gl3wTexSubImage1D -#define glTexSubImage2D gl3wTexSubImage2D -#define glBindTexture gl3wBindTexture -#define glDeleteTextures gl3wDeleteTextures -#define glGenTextures gl3wGenTextures -#define glIsTexture gl3wIsTexture -#define glBlendColor gl3wBlendColor -#define glBlendEquation gl3wBlendEquation -#define glDrawRangeElements gl3wDrawRangeElements -#define glTexImage3D gl3wTexImage3D -#define glTexSubImage3D gl3wTexSubImage3D -#define glCopyTexSubImage3D gl3wCopyTexSubImage3D -#define glActiveTexture gl3wActiveTexture -#define glSampleCoverage gl3wSampleCoverage -#define glCompressedTexImage3D gl3wCompressedTexImage3D -#define glCompressedTexImage2D gl3wCompressedTexImage2D -#define glCompressedTexImage1D gl3wCompressedTexImage1D -#define glCompressedTexSubImage3D gl3wCompressedTexSubImage3D -#define glCompressedTexSubImage2D gl3wCompressedTexSubImage2D -#define glCompressedTexSubImage1D gl3wCompressedTexSubImage1D -#define glGetCompressedTexImage gl3wGetCompressedTexImage -#define glBlendFuncSeparate gl3wBlendFuncSeparate -#define glMultiDrawArrays gl3wMultiDrawArrays -#define glMultiDrawElements gl3wMultiDrawElements -#define glPointParameterf gl3wPointParameterf -#define glPointParameterfv gl3wPointParameterfv -#define glPointParameteri gl3wPointParameteri -#define glPointParameteriv gl3wPointParameteriv -#define glGenQueries gl3wGenQueries -#define glDeleteQueries gl3wDeleteQueries -#define glIsQuery gl3wIsQuery -#define glBeginQuery gl3wBeginQuery -#define glEndQuery gl3wEndQuery -#define glGetQueryiv gl3wGetQueryiv -#define glGetQueryObjectiv gl3wGetQueryObjectiv -#define glGetQueryObjectuiv gl3wGetQueryObjectuiv -#define glBindBuffer gl3wBindBuffer -#define glDeleteBuffers gl3wDeleteBuffers -#define glGenBuffers gl3wGenBuffers -#define glIsBuffer gl3wIsBuffer -#define glBufferData gl3wBufferData -#define glBufferSubData gl3wBufferSubData -#define glGetBufferSubData gl3wGetBufferSubData -#define glMapBuffer gl3wMapBuffer -#define glUnmapBuffer gl3wUnmapBuffer -#define glGetBufferParameteriv gl3wGetBufferParameteriv -#define glGetBufferPointerv gl3wGetBufferPointerv -#define glBlendEquationSeparate gl3wBlendEquationSeparate -#define glDrawBuffers gl3wDrawBuffers -#define glStencilOpSeparate gl3wStencilOpSeparate -#define glStencilFuncSeparate gl3wStencilFuncSeparate -#define glStencilMaskSeparate gl3wStencilMaskSeparate -#define glAttachShader gl3wAttachShader -#define glBindAttribLocation gl3wBindAttribLocation -#define glCompileShader gl3wCompileShader -#define glCreateProgram gl3wCreateProgram -#define glCreateShader gl3wCreateShader -#define glDeleteProgram gl3wDeleteProgram -#define glDeleteShader gl3wDeleteShader -#define glDetachShader gl3wDetachShader -#define glDisableVertexAttribArray gl3wDisableVertexAttribArray -#define glEnableVertexAttribArray gl3wEnableVertexAttribArray -#define glGetActiveAttrib gl3wGetActiveAttrib -#define glGetActiveUniform gl3wGetActiveUniform -#define glGetAttachedShaders gl3wGetAttachedShaders -#define glGetAttribLocation gl3wGetAttribLocation -#define glGetProgramiv gl3wGetProgramiv -#define glGetProgramInfoLog gl3wGetProgramInfoLog -#define glGetShaderiv gl3wGetShaderiv -#define glGetShaderInfoLog gl3wGetShaderInfoLog -#define glGetShaderSource gl3wGetShaderSource -#define glGetUniformLocation gl3wGetUniformLocation -#define glGetUniformfv gl3wGetUniformfv -#define glGetUniformiv gl3wGetUniformiv -#define glGetVertexAttribdv gl3wGetVertexAttribdv -#define glGetVertexAttribfv gl3wGetVertexAttribfv -#define glGetVertexAttribiv gl3wGetVertexAttribiv -#define glGetVertexAttribPointerv gl3wGetVertexAttribPointerv -#define glIsProgram gl3wIsProgram -#define glIsShader gl3wIsShader -#define glLinkProgram gl3wLinkProgram -#define glShaderSource gl3wShaderSource -#define glUseProgram gl3wUseProgram -#define glUniform1f gl3wUniform1f -#define glUniform2f gl3wUniform2f -#define glUniform3f gl3wUniform3f -#define glUniform4f gl3wUniform4f -#define glUniform1i gl3wUniform1i -#define glUniform2i gl3wUniform2i -#define glUniform3i gl3wUniform3i -#define glUniform4i gl3wUniform4i -#define glUniform1fv gl3wUniform1fv -#define glUniform2fv gl3wUniform2fv -#define glUniform3fv gl3wUniform3fv -#define glUniform4fv gl3wUniform4fv -#define glUniform1iv gl3wUniform1iv -#define glUniform2iv gl3wUniform2iv -#define glUniform3iv gl3wUniform3iv -#define glUniform4iv gl3wUniform4iv -#define glUniformMatrix2fv gl3wUniformMatrix2fv -#define glUniformMatrix3fv gl3wUniformMatrix3fv -#define glUniformMatrix4fv gl3wUniformMatrix4fv -#define glValidateProgram gl3wValidateProgram -#define glVertexAttrib1d gl3wVertexAttrib1d -#define glVertexAttrib1dv gl3wVertexAttrib1dv -#define glVertexAttrib1f gl3wVertexAttrib1f -#define glVertexAttrib1fv gl3wVertexAttrib1fv -#define glVertexAttrib1s gl3wVertexAttrib1s -#define glVertexAttrib1sv gl3wVertexAttrib1sv -#define glVertexAttrib2d gl3wVertexAttrib2d -#define glVertexAttrib2dv gl3wVertexAttrib2dv -#define glVertexAttrib2f gl3wVertexAttrib2f -#define glVertexAttrib2fv gl3wVertexAttrib2fv -#define glVertexAttrib2s gl3wVertexAttrib2s -#define glVertexAttrib2sv gl3wVertexAttrib2sv -#define glVertexAttrib3d gl3wVertexAttrib3d -#define glVertexAttrib3dv gl3wVertexAttrib3dv -#define glVertexAttrib3f gl3wVertexAttrib3f -#define glVertexAttrib3fv gl3wVertexAttrib3fv -#define glVertexAttrib3s gl3wVertexAttrib3s -#define glVertexAttrib3sv gl3wVertexAttrib3sv -#define glVertexAttrib4Nbv gl3wVertexAttrib4Nbv -#define glVertexAttrib4Niv gl3wVertexAttrib4Niv -#define glVertexAttrib4Nsv gl3wVertexAttrib4Nsv -#define glVertexAttrib4Nub gl3wVertexAttrib4Nub -#define glVertexAttrib4Nubv gl3wVertexAttrib4Nubv -#define glVertexAttrib4Nuiv gl3wVertexAttrib4Nuiv -#define glVertexAttrib4Nusv gl3wVertexAttrib4Nusv -#define glVertexAttrib4bv gl3wVertexAttrib4bv -#define glVertexAttrib4d gl3wVertexAttrib4d -#define glVertexAttrib4dv gl3wVertexAttrib4dv -#define glVertexAttrib4f gl3wVertexAttrib4f -#define glVertexAttrib4fv gl3wVertexAttrib4fv -#define glVertexAttrib4iv gl3wVertexAttrib4iv -#define glVertexAttrib4s gl3wVertexAttrib4s -#define glVertexAttrib4sv gl3wVertexAttrib4sv -#define glVertexAttrib4ubv gl3wVertexAttrib4ubv -#define glVertexAttrib4uiv gl3wVertexAttrib4uiv -#define glVertexAttrib4usv gl3wVertexAttrib4usv -#define glVertexAttribPointer gl3wVertexAttribPointer -#define glUniformMatrix2x3fv gl3wUniformMatrix2x3fv -#define glUniformMatrix3x2fv gl3wUniformMatrix3x2fv -#define glUniformMatrix2x4fv gl3wUniformMatrix2x4fv -#define glUniformMatrix4x2fv gl3wUniformMatrix4x2fv -#define glUniformMatrix3x4fv gl3wUniformMatrix3x4fv -#define glUniformMatrix4x3fv gl3wUniformMatrix4x3fv -#define glColorMaski gl3wColorMaski -#define glGetBooleani_v gl3wGetBooleani_v -#define glGetIntegeri_v gl3wGetIntegeri_v -#define glEnablei gl3wEnablei -#define glDisablei gl3wDisablei -#define glIsEnabledi gl3wIsEnabledi -#define glBeginTransformFeedback gl3wBeginTransformFeedback -#define glEndTransformFeedback gl3wEndTransformFeedback -#define glBindBufferRange gl3wBindBufferRange -#define glBindBufferBase gl3wBindBufferBase -#define glTransformFeedbackVaryings gl3wTransformFeedbackVaryings -#define glGetTransformFeedbackVarying gl3wGetTransformFeedbackVarying -#define glClampColor gl3wClampColor -#define glBeginConditionalRender gl3wBeginConditionalRender -#define glEndConditionalRender gl3wEndConditionalRender -#define glVertexAttribIPointer gl3wVertexAttribIPointer -#define glGetVertexAttribIiv gl3wGetVertexAttribIiv -#define glGetVertexAttribIuiv gl3wGetVertexAttribIuiv -#define glVertexAttribI1i gl3wVertexAttribI1i -#define glVertexAttribI2i gl3wVertexAttribI2i -#define glVertexAttribI3i gl3wVertexAttribI3i -#define glVertexAttribI4i gl3wVertexAttribI4i -#define glVertexAttribI1ui gl3wVertexAttribI1ui -#define glVertexAttribI2ui gl3wVertexAttribI2ui -#define glVertexAttribI3ui gl3wVertexAttribI3ui -#define glVertexAttribI4ui gl3wVertexAttribI4ui -#define glVertexAttribI1iv gl3wVertexAttribI1iv -#define glVertexAttribI2iv gl3wVertexAttribI2iv -#define glVertexAttribI3iv gl3wVertexAttribI3iv -#define glVertexAttribI4iv gl3wVertexAttribI4iv -#define glVertexAttribI1uiv gl3wVertexAttribI1uiv -#define glVertexAttribI2uiv gl3wVertexAttribI2uiv -#define glVertexAttribI3uiv gl3wVertexAttribI3uiv -#define glVertexAttribI4uiv gl3wVertexAttribI4uiv -#define glVertexAttribI4bv gl3wVertexAttribI4bv -#define glVertexAttribI4sv gl3wVertexAttribI4sv -#define glVertexAttribI4ubv gl3wVertexAttribI4ubv -#define glVertexAttribI4usv gl3wVertexAttribI4usv -#define glGetUniformuiv gl3wGetUniformuiv -#define glBindFragDataLocation gl3wBindFragDataLocation -#define glGetFragDataLocation gl3wGetFragDataLocation -#define glUniform1ui gl3wUniform1ui -#define glUniform2ui gl3wUniform2ui -#define glUniform3ui gl3wUniform3ui -#define glUniform4ui gl3wUniform4ui -#define glUniform1uiv gl3wUniform1uiv -#define glUniform2uiv gl3wUniform2uiv -#define glUniform3uiv gl3wUniform3uiv -#define glUniform4uiv gl3wUniform4uiv -#define glTexParameterIiv gl3wTexParameterIiv -#define glTexParameterIuiv gl3wTexParameterIuiv -#define glGetTexParameterIiv gl3wGetTexParameterIiv -#define glGetTexParameterIuiv gl3wGetTexParameterIuiv -#define glClearBufferiv gl3wClearBufferiv -#define glClearBufferuiv gl3wClearBufferuiv -#define glClearBufferfv gl3wClearBufferfv -#define glClearBufferfi gl3wClearBufferfi -#define glGetStringi gl3wGetStringi -#define glDrawArraysInstanced gl3wDrawArraysInstanced -#define glDrawElementsInstanced gl3wDrawElementsInstanced -#define glTexBuffer gl3wTexBuffer -#define glPrimitiveRestartIndex gl3wPrimitiveRestartIndex -#define glGetInteger64i_v gl3wGetInteger64i_v -#define glGetBufferParameteri64v gl3wGetBufferParameteri64v -#define glFramebufferTexture gl3wFramebufferTexture -#define glVertexAttribDivisor gl3wVertexAttribDivisor -#define glMinSampleShading gl3wMinSampleShading -#define glBlendEquationi gl3wBlendEquationi -#define glBlendEquationSeparatei gl3wBlendEquationSeparatei -#define glBlendFunci gl3wBlendFunci -#define glBlendFuncSeparatei gl3wBlendFuncSeparatei -#define glIsRenderbuffer gl3wIsRenderbuffer -#define glBindRenderbuffer gl3wBindRenderbuffer -#define glDeleteRenderbuffers gl3wDeleteRenderbuffers -#define glGenRenderbuffers gl3wGenRenderbuffers -#define glRenderbufferStorage gl3wRenderbufferStorage -#define glGetRenderbufferParameteriv gl3wGetRenderbufferParameteriv -#define glIsFramebuffer gl3wIsFramebuffer -#define glBindFramebuffer gl3wBindFramebuffer -#define glDeleteFramebuffers gl3wDeleteFramebuffers -#define glGenFramebuffers gl3wGenFramebuffers -#define glCheckFramebufferStatus gl3wCheckFramebufferStatus -#define glFramebufferTexture1D gl3wFramebufferTexture1D -#define glFramebufferTexture2D gl3wFramebufferTexture2D -#define glFramebufferTexture3D gl3wFramebufferTexture3D -#define glFramebufferRenderbuffer gl3wFramebufferRenderbuffer -#define glGetFramebufferAttachmentParameteriv gl3wGetFramebufferAttachmentParameteriv -#define glGenerateMipmap gl3wGenerateMipmap -#define glBlitFramebuffer gl3wBlitFramebuffer -#define glRenderbufferStorageMultisample gl3wRenderbufferStorageMultisample -#define glFramebufferTextureLayer gl3wFramebufferTextureLayer -#define glMapBufferRange gl3wMapBufferRange -#define glFlushMappedBufferRange gl3wFlushMappedBufferRange -#define glBindVertexArray gl3wBindVertexArray -#define glDeleteVertexArrays gl3wDeleteVertexArrays -#define glGenVertexArrays gl3wGenVertexArrays -#define glIsVertexArray gl3wIsVertexArray -#define glGetUniformIndices gl3wGetUniformIndices -#define glGetActiveUniformsiv gl3wGetActiveUniformsiv -#define glGetActiveUniformName gl3wGetActiveUniformName -#define glGetUniformBlockIndex gl3wGetUniformBlockIndex -#define glGetActiveUniformBlockiv gl3wGetActiveUniformBlockiv -#define glGetActiveUniformBlockName gl3wGetActiveUniformBlockName -#define glUniformBlockBinding gl3wUniformBlockBinding -#define glCopyBufferSubData gl3wCopyBufferSubData -#define glDrawElementsBaseVertex gl3wDrawElementsBaseVertex -#define glDrawRangeElementsBaseVertex gl3wDrawRangeElementsBaseVertex -#define glDrawElementsInstancedBaseVertex gl3wDrawElementsInstancedBaseVertex -#define glMultiDrawElementsBaseVertex gl3wMultiDrawElementsBaseVertex -#define glProvokingVertex gl3wProvokingVertex -#define glFenceSync gl3wFenceSync -#define glIsSync gl3wIsSync -#define glDeleteSync gl3wDeleteSync -#define glClientWaitSync gl3wClientWaitSync -#define glWaitSync gl3wWaitSync -#define glGetInteger64v gl3wGetInteger64v -#define glGetSynciv gl3wGetSynciv -#define glTexImage2DMultisample gl3wTexImage2DMultisample -#define glTexImage3DMultisample gl3wTexImage3DMultisample -#define glGetMultisamplefv gl3wGetMultisamplefv -#define glSampleMaski gl3wSampleMaski -#define glBlendEquationiARB gl3wBlendEquationiARB -#define glBlendEquationSeparateiARB gl3wBlendEquationSeparateiARB -#define glBlendFunciARB gl3wBlendFunciARB -#define glBlendFuncSeparateiARB gl3wBlendFuncSeparateiARB -#define glMinSampleShadingARB gl3wMinSampleShadingARB -#define glNamedStringARB gl3wNamedStringARB -#define glDeleteNamedStringARB gl3wDeleteNamedStringARB -#define glCompileShaderIncludeARB gl3wCompileShaderIncludeARB -#define glIsNamedStringARB gl3wIsNamedStringARB -#define glGetNamedStringARB gl3wGetNamedStringARB -#define glGetNamedStringivARB gl3wGetNamedStringivARB -#define glBindFragDataLocationIndexed gl3wBindFragDataLocationIndexed -#define glGetFragDataIndex gl3wGetFragDataIndex -#define glGenSamplers gl3wGenSamplers -#define glDeleteSamplers gl3wDeleteSamplers -#define glIsSampler gl3wIsSampler -#define glBindSampler gl3wBindSampler -#define glSamplerParameteri gl3wSamplerParameteri -#define glSamplerParameteriv gl3wSamplerParameteriv -#define glSamplerParameterf gl3wSamplerParameterf -#define glSamplerParameterfv gl3wSamplerParameterfv -#define glSamplerParameterIiv gl3wSamplerParameterIiv -#define glSamplerParameterIuiv gl3wSamplerParameterIuiv -#define glGetSamplerParameteriv gl3wGetSamplerParameteriv -#define glGetSamplerParameterIiv gl3wGetSamplerParameterIiv -#define glGetSamplerParameterfv gl3wGetSamplerParameterfv -#define glGetSamplerParameterIuiv gl3wGetSamplerParameterIuiv -#define glQueryCounter gl3wQueryCounter -#define glGetQueryObjecti64v gl3wGetQueryObjecti64v -#define glGetQueryObjectui64v gl3wGetQueryObjectui64v -#define glVertexP2ui gl3wVertexP2ui -#define glVertexP2uiv gl3wVertexP2uiv -#define glVertexP3ui gl3wVertexP3ui -#define glVertexP3uiv gl3wVertexP3uiv -#define glVertexP4ui gl3wVertexP4ui -#define glVertexP4uiv gl3wVertexP4uiv -#define glTexCoordP1ui gl3wTexCoordP1ui -#define glTexCoordP1uiv gl3wTexCoordP1uiv -#define glTexCoordP2ui gl3wTexCoordP2ui -#define glTexCoordP2uiv gl3wTexCoordP2uiv -#define glTexCoordP3ui gl3wTexCoordP3ui -#define glTexCoordP3uiv gl3wTexCoordP3uiv -#define glTexCoordP4ui gl3wTexCoordP4ui -#define glTexCoordP4uiv gl3wTexCoordP4uiv -#define glMultiTexCoordP1ui gl3wMultiTexCoordP1ui -#define glMultiTexCoordP1uiv gl3wMultiTexCoordP1uiv -#define glMultiTexCoordP2ui gl3wMultiTexCoordP2ui -#define glMultiTexCoordP2uiv gl3wMultiTexCoordP2uiv -#define glMultiTexCoordP3ui gl3wMultiTexCoordP3ui -#define glMultiTexCoordP3uiv gl3wMultiTexCoordP3uiv -#define glMultiTexCoordP4ui gl3wMultiTexCoordP4ui -#define glMultiTexCoordP4uiv gl3wMultiTexCoordP4uiv -#define glNormalP3ui gl3wNormalP3ui -#define glNormalP3uiv gl3wNormalP3uiv -#define glColorP3ui gl3wColorP3ui -#define glColorP3uiv gl3wColorP3uiv -#define glColorP4ui gl3wColorP4ui -#define glColorP4uiv gl3wColorP4uiv -#define glSecondaryColorP3ui gl3wSecondaryColorP3ui -#define glSecondaryColorP3uiv gl3wSecondaryColorP3uiv -#define glVertexAttribP1ui gl3wVertexAttribP1ui -#define glVertexAttribP1uiv gl3wVertexAttribP1uiv -#define glVertexAttribP2ui gl3wVertexAttribP2ui -#define glVertexAttribP2uiv gl3wVertexAttribP2uiv -#define glVertexAttribP3ui gl3wVertexAttribP3ui -#define glVertexAttribP3uiv gl3wVertexAttribP3uiv -#define glVertexAttribP4ui gl3wVertexAttribP4ui -#define glVertexAttribP4uiv gl3wVertexAttribP4uiv -#define glDrawArraysIndirect gl3wDrawArraysIndirect -#define glDrawElementsIndirect gl3wDrawElementsIndirect -#define glUniform1d gl3wUniform1d -#define glUniform2d gl3wUniform2d -#define glUniform3d gl3wUniform3d -#define glUniform4d gl3wUniform4d -#define glUniform1dv gl3wUniform1dv -#define glUniform2dv gl3wUniform2dv -#define glUniform3dv gl3wUniform3dv -#define glUniform4dv gl3wUniform4dv -#define glUniformMatrix2dv gl3wUniformMatrix2dv -#define glUniformMatrix3dv gl3wUniformMatrix3dv -#define glUniformMatrix4dv gl3wUniformMatrix4dv -#define glUniformMatrix2x3dv gl3wUniformMatrix2x3dv -#define glUniformMatrix2x4dv gl3wUniformMatrix2x4dv -#define glUniformMatrix3x2dv gl3wUniformMatrix3x2dv -#define glUniformMatrix3x4dv gl3wUniformMatrix3x4dv -#define glUniformMatrix4x2dv gl3wUniformMatrix4x2dv -#define glUniformMatrix4x3dv gl3wUniformMatrix4x3dv -#define glGetUniformdv gl3wGetUniformdv -#define glGetSubroutineUniformLocation gl3wGetSubroutineUniformLocation -#define glGetSubroutineIndex gl3wGetSubroutineIndex -#define glGetActiveSubroutineUniformiv gl3wGetActiveSubroutineUniformiv -#define glGetActiveSubroutineUniformName gl3wGetActiveSubroutineUniformName -#define glGetActiveSubroutineName gl3wGetActiveSubroutineName -#define glUniformSubroutinesuiv gl3wUniformSubroutinesuiv -#define glGetUniformSubroutineuiv gl3wGetUniformSubroutineuiv -#define glGetProgramStageiv gl3wGetProgramStageiv -#define glPatchParameteri gl3wPatchParameteri -#define glPatchParameterfv gl3wPatchParameterfv -#define glBindTransformFeedback gl3wBindTransformFeedback -#define glDeleteTransformFeedbacks gl3wDeleteTransformFeedbacks -#define glGenTransformFeedbacks gl3wGenTransformFeedbacks -#define glIsTransformFeedback gl3wIsTransformFeedback -#define glPauseTransformFeedback gl3wPauseTransformFeedback -#define glResumeTransformFeedback gl3wResumeTransformFeedback -#define glDrawTransformFeedback gl3wDrawTransformFeedback -#define glDrawTransformFeedbackStream gl3wDrawTransformFeedbackStream -#define glBeginQueryIndexed gl3wBeginQueryIndexed -#define glEndQueryIndexed gl3wEndQueryIndexed -#define glGetQueryIndexediv gl3wGetQueryIndexediv -#define glReleaseShaderCompiler gl3wReleaseShaderCompiler -#define glShaderBinary gl3wShaderBinary -#define glGetShaderPrecisionFormat gl3wGetShaderPrecisionFormat -#define glDepthRangef gl3wDepthRangef -#define glClearDepthf gl3wClearDepthf -#define glGetProgramBinary gl3wGetProgramBinary -#define glProgramBinary gl3wProgramBinary -#define glProgramParameteri gl3wProgramParameteri -#define glUseProgramStages gl3wUseProgramStages -#define glActiveShaderProgram gl3wActiveShaderProgram -#define glCreateShaderProgramv gl3wCreateShaderProgramv -#define glBindProgramPipeline gl3wBindProgramPipeline -#define glDeleteProgramPipelines gl3wDeleteProgramPipelines -#define glGenProgramPipelines gl3wGenProgramPipelines -#define glIsProgramPipeline gl3wIsProgramPipeline -#define glGetProgramPipelineiv gl3wGetProgramPipelineiv -#define glProgramUniform1i gl3wProgramUniform1i -#define glProgramUniform1iv gl3wProgramUniform1iv -#define glProgramUniform1f gl3wProgramUniform1f -#define glProgramUniform1fv gl3wProgramUniform1fv -#define glProgramUniform1d gl3wProgramUniform1d -#define glProgramUniform1dv gl3wProgramUniform1dv -#define glProgramUniform1ui gl3wProgramUniform1ui -#define glProgramUniform1uiv gl3wProgramUniform1uiv -#define glProgramUniform2i gl3wProgramUniform2i -#define glProgramUniform2iv gl3wProgramUniform2iv -#define glProgramUniform2f gl3wProgramUniform2f -#define glProgramUniform2fv gl3wProgramUniform2fv -#define glProgramUniform2d gl3wProgramUniform2d -#define glProgramUniform2dv gl3wProgramUniform2dv -#define glProgramUniform2ui gl3wProgramUniform2ui -#define glProgramUniform2uiv gl3wProgramUniform2uiv -#define glProgramUniform3i gl3wProgramUniform3i -#define glProgramUniform3iv gl3wProgramUniform3iv -#define glProgramUniform3f gl3wProgramUniform3f -#define glProgramUniform3fv gl3wProgramUniform3fv -#define glProgramUniform3d gl3wProgramUniform3d -#define glProgramUniform3dv gl3wProgramUniform3dv -#define glProgramUniform3ui gl3wProgramUniform3ui -#define glProgramUniform3uiv gl3wProgramUniform3uiv -#define glProgramUniform4i gl3wProgramUniform4i -#define glProgramUniform4iv gl3wProgramUniform4iv -#define glProgramUniform4f gl3wProgramUniform4f -#define glProgramUniform4fv gl3wProgramUniform4fv -#define glProgramUniform4d gl3wProgramUniform4d -#define glProgramUniform4dv gl3wProgramUniform4dv -#define glProgramUniform4ui gl3wProgramUniform4ui -#define glProgramUniform4uiv gl3wProgramUniform4uiv -#define glProgramUniformMatrix2fv gl3wProgramUniformMatrix2fv -#define glProgramUniformMatrix3fv gl3wProgramUniformMatrix3fv -#define glProgramUniformMatrix4fv gl3wProgramUniformMatrix4fv -#define glProgramUniformMatrix2dv gl3wProgramUniformMatrix2dv -#define glProgramUniformMatrix3dv gl3wProgramUniformMatrix3dv -#define glProgramUniformMatrix4dv gl3wProgramUniformMatrix4dv -#define glProgramUniformMatrix2x3fv gl3wProgramUniformMatrix2x3fv -#define glProgramUniformMatrix3x2fv gl3wProgramUniformMatrix3x2fv -#define glProgramUniformMatrix2x4fv gl3wProgramUniformMatrix2x4fv -#define glProgramUniformMatrix4x2fv gl3wProgramUniformMatrix4x2fv -#define glProgramUniformMatrix3x4fv gl3wProgramUniformMatrix3x4fv -#define glProgramUniformMatrix4x3fv gl3wProgramUniformMatrix4x3fv -#define glProgramUniformMatrix2x3dv gl3wProgramUniformMatrix2x3dv -#define glProgramUniformMatrix3x2dv gl3wProgramUniformMatrix3x2dv -#define glProgramUniformMatrix2x4dv gl3wProgramUniformMatrix2x4dv -#define glProgramUniformMatrix4x2dv gl3wProgramUniformMatrix4x2dv -#define glProgramUniformMatrix3x4dv gl3wProgramUniformMatrix3x4dv -#define glProgramUniformMatrix4x3dv gl3wProgramUniformMatrix4x3dv -#define glValidateProgramPipeline gl3wValidateProgramPipeline -#define glGetProgramPipelineInfoLog gl3wGetProgramPipelineInfoLog -#define glVertexAttribL1d gl3wVertexAttribL1d -#define glVertexAttribL2d gl3wVertexAttribL2d -#define glVertexAttribL3d gl3wVertexAttribL3d -#define glVertexAttribL4d gl3wVertexAttribL4d -#define glVertexAttribL1dv gl3wVertexAttribL1dv -#define glVertexAttribL2dv gl3wVertexAttribL2dv -#define glVertexAttribL3dv gl3wVertexAttribL3dv -#define glVertexAttribL4dv gl3wVertexAttribL4dv -#define glVertexAttribLPointer gl3wVertexAttribLPointer -#define glGetVertexAttribLdv gl3wGetVertexAttribLdv -#define glViewportArrayv gl3wViewportArrayv -#define glViewportIndexedf gl3wViewportIndexedf -#define glViewportIndexedfv gl3wViewportIndexedfv -#define glScissorArrayv gl3wScissorArrayv -#define glScissorIndexed gl3wScissorIndexed -#define glScissorIndexedv gl3wScissorIndexedv -#define glDepthRangeArrayv gl3wDepthRangeArrayv -#define glDepthRangeIndexed gl3wDepthRangeIndexed -#define glGetFloati_v gl3wGetFloati_v -#define glGetDoublei_v gl3wGetDoublei_v -#define glCreateSyncFromCLeventARB gl3wCreateSyncFromCLeventARB -#define glDebugMessageControlARB gl3wDebugMessageControlARB -#define glDebugMessageInsertARB gl3wDebugMessageInsertARB -#define glDebugMessageCallbackARB gl3wDebugMessageCallbackARB -#define glGetDebugMessageLogARB gl3wGetDebugMessageLogARB -#define glGetGraphicsResetStatusARB gl3wGetGraphicsResetStatusARB -#define glGetnTexImageARB gl3wGetnTexImageARB -#define glReadnPixelsARB gl3wReadnPixelsARB -#define glGetnCompressedTexImageARB gl3wGetnCompressedTexImageARB -#define glGetnUniformfvARB gl3wGetnUniformfvARB -#define glGetnUniformivARB gl3wGetnUniformivARB -#define glGetnUniformuivARB gl3wGetnUniformuivARB -#define glGetnUniformdvARB gl3wGetnUniformdvARB -#define glDrawArraysInstancedBaseInstance gl3wDrawArraysInstancedBaseInstance -#define glDrawElementsInstancedBaseInstance gl3wDrawElementsInstancedBaseInstance -#define glDrawElementsInstancedBaseVertexBaseInstance gl3wDrawElementsInstancedBaseVertexBaseInstance -#define glDrawTransformFeedbackInstanced gl3wDrawTransformFeedbackInstanced -#define glDrawTransformFeedbackStreamInstanced gl3wDrawTransformFeedbackStreamInstanced -#define glGetInternalformativ gl3wGetInternalformativ -#define glGetActiveAtomicCounterBufferiv gl3wGetActiveAtomicCounterBufferiv -#define glBindImageTexture gl3wBindImageTexture -#define glMemoryBarrier gl3wMemoryBarrier -#define glTexStorage1D gl3wTexStorage1D -#define glTexStorage2D gl3wTexStorage2D -#define glTexStorage3D gl3wTexStorage3D -#define glTextureStorage1DEXT gl3wTextureStorage1DEXT -#define glTextureStorage2DEXT gl3wTextureStorage2DEXT -#define glTextureStorage3DEXT gl3wTextureStorage3DEXT -#define glDebugMessageControl gl3wDebugMessageControl -#define glDebugMessageInsert gl3wDebugMessageInsert -#define glDebugMessageCallback gl3wDebugMessageCallback -#define glGetDebugMessageLog gl3wGetDebugMessageLog -#define glPushDebugGroup gl3wPushDebugGroup -#define glPopDebugGroup gl3wPopDebugGroup -#define glObjectLabel gl3wObjectLabel -#define glGetObjectLabel gl3wGetObjectLabel -#define glObjectPtrLabel gl3wObjectPtrLabel -#define glGetObjectPtrLabel gl3wGetObjectPtrLabel -#define glClearBufferData gl3wClearBufferData -#define glClearBufferSubData gl3wClearBufferSubData -#define glClearNamedBufferDataEXT gl3wClearNamedBufferDataEXT -#define glClearNamedBufferSubDataEXT gl3wClearNamedBufferSubDataEXT -#define glDispatchCompute gl3wDispatchCompute -#define glDispatchComputeIndirect gl3wDispatchComputeIndirect -#define glCopyImageSubData gl3wCopyImageSubData -#define glTextureView gl3wTextureView -#define glBindVertexBuffer gl3wBindVertexBuffer -#define glVertexAttribFormat gl3wVertexAttribFormat -#define glVertexAttribIFormat gl3wVertexAttribIFormat -#define glVertexAttribLFormat gl3wVertexAttribLFormat -#define glVertexAttribBinding gl3wVertexAttribBinding -#define glVertexBindingDivisor gl3wVertexBindingDivisor -#define glVertexArrayBindVertexBufferEXT gl3wVertexArrayBindVertexBufferEXT -#define glVertexArrayVertexAttribFormatEXT gl3wVertexArrayVertexAttribFormatEXT -#define glVertexArrayVertexAttribIFormatEXT gl3wVertexArrayVertexAttribIFormatEXT -#define glVertexArrayVertexAttribLFormatEXT gl3wVertexArrayVertexAttribLFormatEXT -#define glVertexArrayVertexAttribBindingEXT gl3wVertexArrayVertexAttribBindingEXT -#define glVertexArrayVertexBindingDivisorEXT gl3wVertexArrayVertexBindingDivisorEXT -#define glFramebufferParameteri gl3wFramebufferParameteri -#define glGetFramebufferParameteriv gl3wGetFramebufferParameteriv -#define glNamedFramebufferParameteriEXT gl3wNamedFramebufferParameteriEXT -#define glGetNamedFramebufferParameterivEXT gl3wGetNamedFramebufferParameterivEXT -#define glGetInternalformati64v gl3wGetInternalformati64v -#define glInvalidateTexSubImage gl3wInvalidateTexSubImage -#define glInvalidateTexImage gl3wInvalidateTexImage -#define glInvalidateBufferSubData gl3wInvalidateBufferSubData -#define glInvalidateBufferData gl3wInvalidateBufferData -#define glInvalidateFramebuffer gl3wInvalidateFramebuffer -#define glInvalidateSubFramebuffer gl3wInvalidateSubFramebuffer -#define glMultiDrawArraysIndirect gl3wMultiDrawArraysIndirect -#define glMultiDrawElementsIndirect gl3wMultiDrawElementsIndirect -#define glGetProgramInterfaceiv gl3wGetProgramInterfaceiv -#define glGetProgramResourceIndex gl3wGetProgramResourceIndex -#define glGetProgramResourceName gl3wGetProgramResourceName -#define glGetProgramResourceiv gl3wGetProgramResourceiv -#define glGetProgramResourceLocation gl3wGetProgramResourceLocation -#define glGetProgramResourceLocationIndex gl3wGetProgramResourceLocationIndex -#define glShaderStorageBlockBinding gl3wShaderStorageBlockBinding -#define glTexBufferRange gl3wTexBufferRange -#define glTextureBufferRangeEXT gl3wTextureBufferRangeEXT -#define glTexStorage2DMultisample gl3wTexStorage2DMultisample -#define glTexStorage3DMultisample gl3wTexStorage3DMultisample -#define glTextureStorage2DMultisampleEXT gl3wTextureStorage2DMultisampleEXT -#define glTextureStorage3DMultisampleEXT gl3wTextureStorage3DMultisampleEXT - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GL4/gl3w.c b/core/deps/khronos/GL4/gl3w.c deleted file mode 100644 index f6e0c9815..000000000 --- a/core/deps/khronos/GL4/gl3w.c +++ /dev/null @@ -1,865 +0,0 @@ -/* - * This file was generated with gl3w_gen.py, part of gl3w - * (hosted at https://github.com/skaslev/gl3w) - * - * This is free and unencumbered software released into the public domain. - * - * Anyone is free to copy, modify, publish, use, compile, sell, or - * distribute this software, either in source code form or as a compiled - * binary, for any purpose, commercial or non-commercial, and by any - * means. - * - * In jurisdictions that recognize copyright laws, the author or authors - * of this software dedicate any and all copyright interest in the - * software to the public domain. We make this dedication for the benefit - * of the public at large and to the detriment of our heirs and - * successors. We intend this dedication to be an overt act of - * relinquishment in perpetuity of all present and future rights to this - * software under copyright law. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - -#if defined(_WIN32) -#define WIN32_LEAN_AND_MEAN 1 -#include - -static HMODULE libgl; -static PROC (__stdcall *wgl_get_proc_address)(LPCSTR); - -static int open_libgl(void) -{ - libgl = LoadLibraryA("opengl32.dll"); - if (!libgl) - return GL3W_ERROR_LIBRARY_OPEN; - - *(void **)(&wgl_get_proc_address) = (void *)GetProcAddress(libgl, "wglGetProcAddress"); - return GL3W_OK; -} - -static void close_libgl(void) -{ - FreeLibrary(libgl); -} - -static GL3WglProc get_proc(const char *proc) -{ - GL3WglProc res; - - res = (GL3WglProc)wgl_get_proc_address(proc); - if (!res) - res = (GL3WglProc)GetProcAddress(libgl, proc); - return res; -} -#elif defined(__APPLE__) -#include - -static void *libgl; - -static int open_libgl(void) -{ - libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL); - if (!libgl) - return GL3W_ERROR_LIBRARY_OPEN; - - return GL3W_OK; -} - -static void close_libgl(void) -{ - dlclose(libgl); -} - -static GL3WglProc get_proc(const char *proc) -{ - GL3WglProc res; - - *(void **)(&res) = dlsym(libgl, proc); - return res; -} -#elif defined(__ANDROID__) || defined(__SWITCH__) -#ifdef __ANDROID__ -#include -#endif -#include - -static int open_libgl(void) -{ - return GL3W_OK; -} - -static void close_libgl(void) -{ -} - -static GL3WglProc get_proc(const char *proc) -{ - return (GL3WglProc)eglGetProcAddress(proc); -} -#else -#include - -static void *libgl; -static GL3WglProc (*glx_get_proc_address)(const GLubyte *); - -static int open_libgl(void) -{ -#if defined(__OpenBSD__) - libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL); -#else - libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); -#endif - if (!libgl) - return GL3W_ERROR_LIBRARY_OPEN; - - *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB"); - return GL3W_OK; -} - -static void close_libgl(void) -{ - dlclose(libgl); -} - -static GL3WglProc get_proc(const char *proc) -{ - GL3WglProc res; - - res = glx_get_proc_address((const GLubyte *)proc); - if (!res) - *(void **)(&res) = dlsym(libgl, proc); - return res; -} -#endif - -static struct { - int major, minor; -} version; - -static int parse_version(void) -{ - if (!glGetIntegerv) - return GL3W_ERROR_INIT; - - glGetIntegerv(GL_MAJOR_VERSION, &version.major); - glGetIntegerv(GL_MINOR_VERSION, &version.minor); - - if (version.major < 3) - return GL3W_ERROR_OPENGL_VERSION; - return GL3W_OK; -} - -static void load_procs(GL3WGetProcAddressProc proc); - -int gl3wInit(void) -{ - int res; - - res = open_libgl(); - if (res) - return res; - - atexit(close_libgl); - return gl3wInit2(get_proc); -} - -int gl3wInit2(GL3WGetProcAddressProc proc) -{ - load_procs(proc); - return parse_version(); -} - -int gl3wIsSupported(int major, int minor) -{ - if (major < 3) - return 0; - if (version.major == major) - return version.minor >= minor; - return version.major >= major; -} - -GL3WglProc gl3wGetProcAddress(const char *proc) -{ - return get_proc(proc); -} - -static const char *proc_names[] = { - "glActiveShaderProgram", - "glActiveTexture", - "glAttachShader", - "glBeginConditionalRender", - "glBeginQuery", - "glBeginQueryIndexed", - "glBeginTransformFeedback", - "glBindAttribLocation", - "glBindBuffer", - "glBindBufferBase", - "glBindBufferRange", - "glBindBuffersBase", - "glBindBuffersRange", - "glBindFragDataLocation", - "glBindFragDataLocationIndexed", - "glBindFramebuffer", - "glBindImageTexture", - "glBindImageTextures", - "glBindProgramPipeline", - "glBindRenderbuffer", - "glBindSampler", - "glBindSamplers", - "glBindTexture", - "glBindTextureUnit", - "glBindTextures", - "glBindTransformFeedback", - "glBindVertexArray", - "glBindVertexBuffer", - "glBindVertexBuffers", - "glBlendColor", - "glBlendEquation", - "glBlendEquationSeparate", - "glBlendEquationSeparatei", - "glBlendEquationi", - "glBlendFunc", - "glBlendFuncSeparate", - "glBlendFuncSeparatei", - "glBlendFunci", - "glBlitFramebuffer", - "glBlitNamedFramebuffer", - "glBufferData", - "glBufferStorage", - "glBufferSubData", - "glCheckFramebufferStatus", - "glCheckNamedFramebufferStatus", - "glClampColor", - "glClear", - "glClearBufferData", - "glClearBufferSubData", - "glClearBufferfi", - "glClearBufferfv", - "glClearBufferiv", - "glClearBufferuiv", - "glClearColor", - "glClearDepth", - "glClearDepthf", - "glClearNamedBufferData", - "glClearNamedBufferSubData", - "glClearNamedFramebufferfi", - "glClearNamedFramebufferfv", - "glClearNamedFramebufferiv", - "glClearNamedFramebufferuiv", - "glClearStencil", - "glClearTexImage", - "glClearTexSubImage", - "glClientWaitSync", - "glClipControl", - "glColorMask", - "glColorMaski", - "glCompileShader", - "glCompressedTexImage1D", - "glCompressedTexImage2D", - "glCompressedTexImage3D", - "glCompressedTexSubImage1D", - "glCompressedTexSubImage2D", - "glCompressedTexSubImage3D", - "glCompressedTextureSubImage1D", - "glCompressedTextureSubImage2D", - "glCompressedTextureSubImage3D", - "glCopyBufferSubData", - "glCopyImageSubData", - "glCopyNamedBufferSubData", - "glCopyTexImage1D", - "glCopyTexImage2D", - "glCopyTexSubImage1D", - "glCopyTexSubImage2D", - "glCopyTexSubImage3D", - "glCopyTextureSubImage1D", - "glCopyTextureSubImage2D", - "glCopyTextureSubImage3D", - "glCreateBuffers", - "glCreateFramebuffers", - "glCreateProgram", - "glCreateProgramPipelines", - "glCreateQueries", - "glCreateRenderbuffers", - "glCreateSamplers", - "glCreateShader", - "glCreateShaderProgramv", - "glCreateTextures", - "glCreateTransformFeedbacks", - "glCreateVertexArrays", - "glCullFace", - "glDebugMessageCallback", - "glDebugMessageControl", - "glDebugMessageInsert", - "glDeleteBuffers", - "glDeleteFramebuffers", - "glDeleteProgram", - "glDeleteProgramPipelines", - "glDeleteQueries", - "glDeleteRenderbuffers", - "glDeleteSamplers", - "glDeleteShader", - "glDeleteSync", - "glDeleteTextures", - "glDeleteTransformFeedbacks", - "glDeleteVertexArrays", - "glDepthFunc", - "glDepthMask", - "glDepthRange", - "glDepthRangeArrayv", - "glDepthRangeIndexed", - "glDepthRangef", - "glDetachShader", - "glDisable", - "glDisableVertexArrayAttrib", - "glDisableVertexAttribArray", - "glDisablei", - "glDispatchCompute", - "glDispatchComputeIndirect", - "glDrawArrays", - "glDrawArraysIndirect", - "glDrawArraysInstanced", - "glDrawArraysInstancedBaseInstance", - "glDrawBuffer", - "glDrawBuffers", - "glDrawElements", - "glDrawElementsBaseVertex", - "glDrawElementsIndirect", - "glDrawElementsInstanced", - "glDrawElementsInstancedBaseInstance", - "glDrawElementsInstancedBaseVertex", - "glDrawElementsInstancedBaseVertexBaseInstance", - "glDrawRangeElements", - "glDrawRangeElementsBaseVertex", - "glDrawTransformFeedback", - "glDrawTransformFeedbackInstanced", - "glDrawTransformFeedbackStream", - "glDrawTransformFeedbackStreamInstanced", - "glEnable", - "glEnableVertexArrayAttrib", - "glEnableVertexAttribArray", - "glEnablei", - "glEndConditionalRender", - "glEndQuery", - "glEndQueryIndexed", - "glEndTransformFeedback", - "glFenceSync", - "glFinish", - "glFlush", - "glFlushMappedBufferRange", - "glFlushMappedNamedBufferRange", - "glFramebufferParameteri", - "glFramebufferRenderbuffer", - "glFramebufferTexture", - "glFramebufferTexture1D", - "glFramebufferTexture2D", - "glFramebufferTexture3D", - "glFramebufferTextureLayer", - "glFrontFace", - "glGenBuffers", - "glGenFramebuffers", - "glGenProgramPipelines", - "glGenQueries", - "glGenRenderbuffers", - "glGenSamplers", - "glGenTextures", - "glGenTransformFeedbacks", - "glGenVertexArrays", - "glGenerateMipmap", - "glGenerateTextureMipmap", - "glGetActiveAtomicCounterBufferiv", - "glGetActiveAttrib", - "glGetActiveSubroutineName", - "glGetActiveSubroutineUniformName", - "glGetActiveSubroutineUniformiv", - "glGetActiveUniform", - "glGetActiveUniformBlockName", - "glGetActiveUniformBlockiv", - "glGetActiveUniformName", - "glGetActiveUniformsiv", - "glGetAttachedShaders", - "glGetAttribLocation", - "glGetBooleani_v", - "glGetBooleanv", - "glGetBufferParameteri64v", - "glGetBufferParameteriv", - "glGetBufferPointerv", - "glGetBufferSubData", - "glGetCompressedTexImage", - "glGetCompressedTextureImage", - "glGetCompressedTextureSubImage", - "glGetDebugMessageLog", - "glGetDoublei_v", - "glGetDoublev", - "glGetError", - "glGetFloati_v", - "glGetFloatv", - "glGetFragDataIndex", - "glGetFragDataLocation", - "glGetFramebufferAttachmentParameteriv", - "glGetFramebufferParameteriv", - "glGetGraphicsResetStatus", - "glGetInteger64i_v", - "glGetInteger64v", - "glGetIntegeri_v", - "glGetIntegerv", - "glGetInternalformati64v", - "glGetInternalformativ", - "glGetMultisamplefv", - "glGetNamedBufferParameteri64v", - "glGetNamedBufferParameteriv", - "glGetNamedBufferPointerv", - "glGetNamedBufferSubData", - "glGetNamedFramebufferAttachmentParameteriv", - "glGetNamedFramebufferParameteriv", - "glGetNamedRenderbufferParameteriv", - "glGetObjectLabel", - "glGetObjectPtrLabel", - "glGetPointerv", - "glGetProgramBinary", - "glGetProgramInfoLog", - "glGetProgramInterfaceiv", - "glGetProgramPipelineInfoLog", - "glGetProgramPipelineiv", - "glGetProgramResourceIndex", - "glGetProgramResourceLocation", - "glGetProgramResourceLocationIndex", - "glGetProgramResourceName", - "glGetProgramResourceiv", - "glGetProgramStageiv", - "glGetProgramiv", - "glGetQueryBufferObjecti64v", - "glGetQueryBufferObjectiv", - "glGetQueryBufferObjectui64v", - "glGetQueryBufferObjectuiv", - "glGetQueryIndexediv", - "glGetQueryObjecti64v", - "glGetQueryObjectiv", - "glGetQueryObjectui64v", - "glGetQueryObjectuiv", - "glGetQueryiv", - "glGetRenderbufferParameteriv", - "glGetSamplerParameterIiv", - "glGetSamplerParameterIuiv", - "glGetSamplerParameterfv", - "glGetSamplerParameteriv", - "glGetShaderInfoLog", - "glGetShaderPrecisionFormat", - "glGetShaderSource", - "glGetShaderiv", - "glGetString", - "glGetStringi", - "glGetSubroutineIndex", - "glGetSubroutineUniformLocation", - "glGetSynciv", - "glGetTexImage", - "glGetTexLevelParameterfv", - "glGetTexLevelParameteriv", - "glGetTexParameterIiv", - "glGetTexParameterIuiv", - "glGetTexParameterfv", - "glGetTexParameteriv", - "glGetTextureImage", - "glGetTextureLevelParameterfv", - "glGetTextureLevelParameteriv", - "glGetTextureParameterIiv", - "glGetTextureParameterIuiv", - "glGetTextureParameterfv", - "glGetTextureParameteriv", - "glGetTextureSubImage", - "glGetTransformFeedbackVarying", - "glGetTransformFeedbacki64_v", - "glGetTransformFeedbacki_v", - "glGetTransformFeedbackiv", - "glGetUniformBlockIndex", - "glGetUniformIndices", - "glGetUniformLocation", - "glGetUniformSubroutineuiv", - "glGetUniformdv", - "glGetUniformfv", - "glGetUniformiv", - "glGetUniformuiv", - "glGetVertexArrayIndexed64iv", - "glGetVertexArrayIndexediv", - "glGetVertexArrayiv", - "glGetVertexAttribIiv", - "glGetVertexAttribIuiv", - "glGetVertexAttribLdv", - "glGetVertexAttribPointerv", - "glGetVertexAttribdv", - "glGetVertexAttribfv", - "glGetVertexAttribiv", - "glGetnCompressedTexImage", - "glGetnTexImage", - "glGetnUniformdv", - "glGetnUniformfv", - "glGetnUniformiv", - "glGetnUniformuiv", - "glHint", - "glInvalidateBufferData", - "glInvalidateBufferSubData", - "glInvalidateFramebuffer", - "glInvalidateNamedFramebufferData", - "glInvalidateNamedFramebufferSubData", - "glInvalidateSubFramebuffer", - "glInvalidateTexImage", - "glInvalidateTexSubImage", - "glIsBuffer", - "glIsEnabled", - "glIsEnabledi", - "glIsFramebuffer", - "glIsProgram", - "glIsProgramPipeline", - "glIsQuery", - "glIsRenderbuffer", - "glIsSampler", - "glIsShader", - "glIsSync", - "glIsTexture", - "glIsTransformFeedback", - "glIsVertexArray", - "glLineWidth", - "glLinkProgram", - "glLogicOp", - "glMapBuffer", - "glMapBufferRange", - "glMapNamedBuffer", - "glMapNamedBufferRange", - "glMemoryBarrier", - "glMemoryBarrierByRegion", - "glMinSampleShading", - "glMultiDrawArrays", - "glMultiDrawArraysIndirect", - "glMultiDrawArraysIndirectCount", - "glMultiDrawElements", - "glMultiDrawElementsBaseVertex", - "glMultiDrawElementsIndirect", - "glMultiDrawElementsIndirectCount", - "glNamedBufferData", - "glNamedBufferStorage", - "glNamedBufferSubData", - "glNamedFramebufferDrawBuffer", - "glNamedFramebufferDrawBuffers", - "glNamedFramebufferParameteri", - "glNamedFramebufferReadBuffer", - "glNamedFramebufferRenderbuffer", - "glNamedFramebufferTexture", - "glNamedFramebufferTextureLayer", - "glNamedRenderbufferStorage", - "glNamedRenderbufferStorageMultisample", - "glObjectLabel", - "glObjectPtrLabel", - "glPatchParameterfv", - "glPatchParameteri", - "glPauseTransformFeedback", - "glPixelStoref", - "glPixelStorei", - "glPointParameterf", - "glPointParameterfv", - "glPointParameteri", - "glPointParameteriv", - "glPointSize", - "glPolygonMode", - "glPolygonOffset", - "glPolygonOffsetClamp", - "glPopDebugGroup", - "glPrimitiveRestartIndex", - "glProgramBinary", - "glProgramParameteri", - "glProgramUniform1d", - "glProgramUniform1dv", - "glProgramUniform1f", - "glProgramUniform1fv", - "glProgramUniform1i", - "glProgramUniform1iv", - "glProgramUniform1ui", - "glProgramUniform1uiv", - "glProgramUniform2d", - "glProgramUniform2dv", - "glProgramUniform2f", - "glProgramUniform2fv", - "glProgramUniform2i", - "glProgramUniform2iv", - "glProgramUniform2ui", - "glProgramUniform2uiv", - "glProgramUniform3d", - "glProgramUniform3dv", - "glProgramUniform3f", - "glProgramUniform3fv", - "glProgramUniform3i", - "glProgramUniform3iv", - "glProgramUniform3ui", - "glProgramUniform3uiv", - "glProgramUniform4d", - "glProgramUniform4dv", - "glProgramUniform4f", - "glProgramUniform4fv", - "glProgramUniform4i", - "glProgramUniform4iv", - "glProgramUniform4ui", - "glProgramUniform4uiv", - "glProgramUniformMatrix2dv", - "glProgramUniformMatrix2fv", - "glProgramUniformMatrix2x3dv", - "glProgramUniformMatrix2x3fv", - "glProgramUniformMatrix2x4dv", - "glProgramUniformMatrix2x4fv", - "glProgramUniformMatrix3dv", - "glProgramUniformMatrix3fv", - "glProgramUniformMatrix3x2dv", - "glProgramUniformMatrix3x2fv", - "glProgramUniformMatrix3x4dv", - "glProgramUniformMatrix3x4fv", - "glProgramUniformMatrix4dv", - "glProgramUniformMatrix4fv", - "glProgramUniformMatrix4x2dv", - "glProgramUniformMatrix4x2fv", - "glProgramUniformMatrix4x3dv", - "glProgramUniformMatrix4x3fv", - "glProvokingVertex", - "glPushDebugGroup", - "glQueryCounter", - "glReadBuffer", - "glReadPixels", - "glReadnPixels", - "glReleaseShaderCompiler", - "glRenderbufferStorage", - "glRenderbufferStorageMultisample", - "glResumeTransformFeedback", - "glSampleCoverage", - "glSampleMaski", - "glSamplerParameterIiv", - "glSamplerParameterIuiv", - "glSamplerParameterf", - "glSamplerParameterfv", - "glSamplerParameteri", - "glSamplerParameteriv", - "glScissor", - "glScissorArrayv", - "glScissorIndexed", - "glScissorIndexedv", - "glShaderBinary", - "glShaderSource", - "glShaderStorageBlockBinding", - "glSpecializeShader", - "glStencilFunc", - "glStencilFuncSeparate", - "glStencilMask", - "glStencilMaskSeparate", - "glStencilOp", - "glStencilOpSeparate", - "glTexBuffer", - "glTexBufferRange", - "glTexImage1D", - "glTexImage2D", - "glTexImage2DMultisample", - "glTexImage3D", - "glTexImage3DMultisample", - "glTexParameterIiv", - "glTexParameterIuiv", - "glTexParameterf", - "glTexParameterfv", - "glTexParameteri", - "glTexParameteriv", - "glTexStorage1D", - "glTexStorage2D", - "glTexStorage2DMultisample", - "glTexStorage3D", - "glTexStorage3DMultisample", - "glTexSubImage1D", - "glTexSubImage2D", - "glTexSubImage3D", - "glTextureBarrier", - "glTextureBuffer", - "glTextureBufferRange", - "glTextureParameterIiv", - "glTextureParameterIuiv", - "glTextureParameterf", - "glTextureParameterfv", - "glTextureParameteri", - "glTextureParameteriv", - "glTextureStorage1D", - "glTextureStorage2D", - "glTextureStorage2DMultisample", - "glTextureStorage3D", - "glTextureStorage3DMultisample", - "glTextureSubImage1D", - "glTextureSubImage2D", - "glTextureSubImage3D", - "glTextureView", - "glTransformFeedbackBufferBase", - "glTransformFeedbackBufferRange", - "glTransformFeedbackVaryings", - "glUniform1d", - "glUniform1dv", - "glUniform1f", - "glUniform1fv", - "glUniform1i", - "glUniform1iv", - "glUniform1ui", - "glUniform1uiv", - "glUniform2d", - "glUniform2dv", - "glUniform2f", - "glUniform2fv", - "glUniform2i", - "glUniform2iv", - "glUniform2ui", - "glUniform2uiv", - "glUniform3d", - "glUniform3dv", - "glUniform3f", - "glUniform3fv", - "glUniform3i", - "glUniform3iv", - "glUniform3ui", - "glUniform3uiv", - "glUniform4d", - "glUniform4dv", - "glUniform4f", - "glUniform4fv", - "glUniform4i", - "glUniform4iv", - "glUniform4ui", - "glUniform4uiv", - "glUniformBlockBinding", - "glUniformMatrix2dv", - "glUniformMatrix2fv", - "glUniformMatrix2x3dv", - "glUniformMatrix2x3fv", - "glUniformMatrix2x4dv", - "glUniformMatrix2x4fv", - "glUniformMatrix3dv", - "glUniformMatrix3fv", - "glUniformMatrix3x2dv", - "glUniformMatrix3x2fv", - "glUniformMatrix3x4dv", - "glUniformMatrix3x4fv", - "glUniformMatrix4dv", - "glUniformMatrix4fv", - "glUniformMatrix4x2dv", - "glUniformMatrix4x2fv", - "glUniformMatrix4x3dv", - "glUniformMatrix4x3fv", - "glUniformSubroutinesuiv", - "glUnmapBuffer", - "glUnmapNamedBuffer", - "glUseProgram", - "glUseProgramStages", - "glValidateProgram", - "glValidateProgramPipeline", - "glVertexArrayAttribBinding", - "glVertexArrayAttribFormat", - "glVertexArrayAttribIFormat", - "glVertexArrayAttribLFormat", - "glVertexArrayBindingDivisor", - "glVertexArrayElementBuffer", - "glVertexArrayVertexBuffer", - "glVertexArrayVertexBuffers", - "glVertexAttrib1d", - "glVertexAttrib1dv", - "glVertexAttrib1f", - "glVertexAttrib1fv", - "glVertexAttrib1s", - "glVertexAttrib1sv", - "glVertexAttrib2d", - "glVertexAttrib2dv", - "glVertexAttrib2f", - "glVertexAttrib2fv", - "glVertexAttrib2s", - "glVertexAttrib2sv", - "glVertexAttrib3d", - "glVertexAttrib3dv", - "glVertexAttrib3f", - "glVertexAttrib3fv", - "glVertexAttrib3s", - "glVertexAttrib3sv", - "glVertexAttrib4Nbv", - "glVertexAttrib4Niv", - "glVertexAttrib4Nsv", - "glVertexAttrib4Nub", - "glVertexAttrib4Nubv", - "glVertexAttrib4Nuiv", - "glVertexAttrib4Nusv", - "glVertexAttrib4bv", - "glVertexAttrib4d", - "glVertexAttrib4dv", - "glVertexAttrib4f", - "glVertexAttrib4fv", - "glVertexAttrib4iv", - "glVertexAttrib4s", - "glVertexAttrib4sv", - "glVertexAttrib4ubv", - "glVertexAttrib4uiv", - "glVertexAttrib4usv", - "glVertexAttribBinding", - "glVertexAttribDivisor", - "glVertexAttribFormat", - "glVertexAttribI1i", - "glVertexAttribI1iv", - "glVertexAttribI1ui", - "glVertexAttribI1uiv", - "glVertexAttribI2i", - "glVertexAttribI2iv", - "glVertexAttribI2ui", - "glVertexAttribI2uiv", - "glVertexAttribI3i", - "glVertexAttribI3iv", - "glVertexAttribI3ui", - "glVertexAttribI3uiv", - "glVertexAttribI4bv", - "glVertexAttribI4i", - "glVertexAttribI4iv", - "glVertexAttribI4sv", - "glVertexAttribI4ubv", - "glVertexAttribI4ui", - "glVertexAttribI4uiv", - "glVertexAttribI4usv", - "glVertexAttribIFormat", - "glVertexAttribIPointer", - "glVertexAttribL1d", - "glVertexAttribL1dv", - "glVertexAttribL2d", - "glVertexAttribL2dv", - "glVertexAttribL3d", - "glVertexAttribL3dv", - "glVertexAttribL4d", - "glVertexAttribL4dv", - "glVertexAttribLFormat", - "glVertexAttribLPointer", - "glVertexAttribP1ui", - "glVertexAttribP1uiv", - "glVertexAttribP2ui", - "glVertexAttribP2uiv", - "glVertexAttribP3ui", - "glVertexAttribP3uiv", - "glVertexAttribP4ui", - "glVertexAttribP4uiv", - "glVertexAttribPointer", - "glVertexBindingDivisor", - "glViewport", - "glViewportArrayv", - "glViewportIndexedf", - "glViewportIndexedfv", - "glWaitSync", -}; - -union GL3WProcs gl3wProcs; - -static void load_procs(GL3WGetProcAddressProc proc) -{ - size_t i; - - for (i = 0; i < ARRAY_SIZE(proc_names); i++) - gl3wProcs.ptr[i] = proc(proc_names[i]); -} diff --git a/core/deps/khronos/GL4/gl3w.h b/core/deps/khronos/GL4/gl3w.h deleted file mode 100644 index e6698395b..000000000 --- a/core/deps/khronos/GL4/gl3w.h +++ /dev/null @@ -1,1385 +0,0 @@ -/* - * This file was generated with gl3w_gen.py, part of gl3w - * (hosted at https://github.com/skaslev/gl3w) - * - * This is free and unencumbered software released into the public domain. - * - * Anyone is free to copy, modify, publish, use, compile, sell, or - * distribute this software, either in source code form or as a compiled - * binary, for any purpose, commercial or non-commercial, and by any - * means. - * - * In jurisdictions that recognize copyright laws, the author or authors - * of this software dedicate any and all copyright interest in the - * software to the public domain. We make this dedication for the benefit - * of the public at large and to the detriment of our heirs and - * successors. We intend this dedication to be an overt act of - * relinquishment in perpetuity of all present and future rights to this - * software under copyright law. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef __gl3w_h_ -#define __gl3w_h_ - -#include - -#ifndef __gl_h_ -#define __gl_h_ -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define GL3W_OK 0 -#define GL3W_ERROR_INIT -1 -#define GL3W_ERROR_LIBRARY_OPEN -2 -#define GL3W_ERROR_OPENGL_VERSION -3 - -typedef void (*GL3WglProc)(void); -typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc); - -/* gl3w api */ -int gl3wInit(void); -int gl3wInit2(GL3WGetProcAddressProc proc); -int gl3wIsSupported(int major, int minor); -GL3WglProc gl3wGetProcAddress(const char *proc); - -/* gl3w internal state */ -union GL3WProcs { - GL3WglProc ptr[657]; - struct { - PFNGLACTIVESHADERPROGRAMPROC ActiveShaderProgram; - PFNGLACTIVETEXTUREPROC ActiveTexture; - PFNGLATTACHSHADERPROC AttachShader; - PFNGLBEGINCONDITIONALRENDERPROC BeginConditionalRender; - PFNGLBEGINQUERYPROC BeginQuery; - PFNGLBEGINQUERYINDEXEDPROC BeginQueryIndexed; - PFNGLBEGINTRANSFORMFEEDBACKPROC BeginTransformFeedback; - PFNGLBINDATTRIBLOCATIONPROC BindAttribLocation; - PFNGLBINDBUFFERPROC BindBuffer; - PFNGLBINDBUFFERBASEPROC BindBufferBase; - PFNGLBINDBUFFERRANGEPROC BindBufferRange; - PFNGLBINDBUFFERSBASEPROC BindBuffersBase; - PFNGLBINDBUFFERSRANGEPROC BindBuffersRange; - PFNGLBINDFRAGDATALOCATIONPROC BindFragDataLocation; - PFNGLBINDFRAGDATALOCATIONINDEXEDPROC BindFragDataLocationIndexed; - PFNGLBINDFRAMEBUFFERPROC BindFramebuffer; - PFNGLBINDIMAGETEXTUREPROC BindImageTexture; - PFNGLBINDIMAGETEXTURESPROC BindImageTextures; - PFNGLBINDPROGRAMPIPELINEPROC BindProgramPipeline; - PFNGLBINDRENDERBUFFERPROC BindRenderbuffer; - PFNGLBINDSAMPLERPROC BindSampler; - PFNGLBINDSAMPLERSPROC BindSamplers; - PFNGLBINDTEXTUREPROC BindTexture; - PFNGLBINDTEXTUREUNITPROC BindTextureUnit; - PFNGLBINDTEXTURESPROC BindTextures; - PFNGLBINDTRANSFORMFEEDBACKPROC BindTransformFeedback; - PFNGLBINDVERTEXARRAYPROC BindVertexArray; - PFNGLBINDVERTEXBUFFERPROC BindVertexBuffer; - PFNGLBINDVERTEXBUFFERSPROC BindVertexBuffers; - PFNGLBLENDCOLORPROC BlendColor; - PFNGLBLENDEQUATIONPROC BlendEquation; - PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate; - PFNGLBLENDEQUATIONSEPARATEIPROC BlendEquationSeparatei; - PFNGLBLENDEQUATIONIPROC BlendEquationi; - PFNGLBLENDFUNCPROC BlendFunc; - PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate; - PFNGLBLENDFUNCSEPARATEIPROC BlendFuncSeparatei; - PFNGLBLENDFUNCIPROC BlendFunci; - PFNGLBLITFRAMEBUFFERPROC BlitFramebuffer; - PFNGLBLITNAMEDFRAMEBUFFERPROC BlitNamedFramebuffer; - PFNGLBUFFERDATAPROC BufferData; - PFNGLBUFFERSTORAGEPROC BufferStorage; - PFNGLBUFFERSUBDATAPROC BufferSubData; - PFNGLCHECKFRAMEBUFFERSTATUSPROC CheckFramebufferStatus; - PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC CheckNamedFramebufferStatus; - PFNGLCLAMPCOLORPROC ClampColor; - PFNGLCLEARPROC Clear; - PFNGLCLEARBUFFERDATAPROC ClearBufferData; - PFNGLCLEARBUFFERSUBDATAPROC ClearBufferSubData; - PFNGLCLEARBUFFERFIPROC ClearBufferfi; - PFNGLCLEARBUFFERFVPROC ClearBufferfv; - PFNGLCLEARBUFFERIVPROC ClearBufferiv; - PFNGLCLEARBUFFERUIVPROC ClearBufferuiv; - PFNGLCLEARCOLORPROC ClearColor; - PFNGLCLEARDEPTHPROC ClearDepth; - PFNGLCLEARDEPTHFPROC ClearDepthf; - PFNGLCLEARNAMEDBUFFERDATAPROC ClearNamedBufferData; - PFNGLCLEARNAMEDBUFFERSUBDATAPROC ClearNamedBufferSubData; - PFNGLCLEARNAMEDFRAMEBUFFERFIPROC ClearNamedFramebufferfi; - PFNGLCLEARNAMEDFRAMEBUFFERFVPROC ClearNamedFramebufferfv; - PFNGLCLEARNAMEDFRAMEBUFFERIVPROC ClearNamedFramebufferiv; - PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC ClearNamedFramebufferuiv; - PFNGLCLEARSTENCILPROC ClearStencil; - PFNGLCLEARTEXIMAGEPROC ClearTexImage; - PFNGLCLEARTEXSUBIMAGEPROC ClearTexSubImage; - PFNGLCLIENTWAITSYNCPROC ClientWaitSync; - PFNGLCLIPCONTROLPROC ClipControl; - PFNGLCOLORMASKPROC ColorMask; - PFNGLCOLORMASKIPROC ColorMaski; - PFNGLCOMPILESHADERPROC CompileShader; - PFNGLCOMPRESSEDTEXIMAGE1DPROC CompressedTexImage1D; - PFNGLCOMPRESSEDTEXIMAGE2DPROC CompressedTexImage2D; - PFNGLCOMPRESSEDTEXIMAGE3DPROC CompressedTexImage3D; - PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC CompressedTexSubImage1D; - PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC CompressedTexSubImage2D; - PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC CompressedTexSubImage3D; - PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC CompressedTextureSubImage1D; - PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC CompressedTextureSubImage2D; - PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC CompressedTextureSubImage3D; - PFNGLCOPYBUFFERSUBDATAPROC CopyBufferSubData; - PFNGLCOPYIMAGESUBDATAPROC CopyImageSubData; - PFNGLCOPYNAMEDBUFFERSUBDATAPROC CopyNamedBufferSubData; - PFNGLCOPYTEXIMAGE1DPROC CopyTexImage1D; - PFNGLCOPYTEXIMAGE2DPROC CopyTexImage2D; - PFNGLCOPYTEXSUBIMAGE1DPROC CopyTexSubImage1D; - PFNGLCOPYTEXSUBIMAGE2DPROC CopyTexSubImage2D; - PFNGLCOPYTEXSUBIMAGE3DPROC CopyTexSubImage3D; - PFNGLCOPYTEXTURESUBIMAGE1DPROC CopyTextureSubImage1D; - PFNGLCOPYTEXTURESUBIMAGE2DPROC CopyTextureSubImage2D; - PFNGLCOPYTEXTURESUBIMAGE3DPROC CopyTextureSubImage3D; - PFNGLCREATEBUFFERSPROC CreateBuffers; - PFNGLCREATEFRAMEBUFFERSPROC CreateFramebuffers; - PFNGLCREATEPROGRAMPROC CreateProgram; - PFNGLCREATEPROGRAMPIPELINESPROC CreateProgramPipelines; - PFNGLCREATEQUERIESPROC CreateQueries; - PFNGLCREATERENDERBUFFERSPROC CreateRenderbuffers; - PFNGLCREATESAMPLERSPROC CreateSamplers; - PFNGLCREATESHADERPROC CreateShader; - PFNGLCREATESHADERPROGRAMVPROC CreateShaderProgramv; - PFNGLCREATETEXTURESPROC CreateTextures; - PFNGLCREATETRANSFORMFEEDBACKSPROC CreateTransformFeedbacks; - PFNGLCREATEVERTEXARRAYSPROC CreateVertexArrays; - PFNGLCULLFACEPROC CullFace; - PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback; - PFNGLDEBUGMESSAGECONTROLPROC DebugMessageControl; - PFNGLDEBUGMESSAGEINSERTPROC DebugMessageInsert; - PFNGLDELETEBUFFERSPROC DeleteBuffers; - PFNGLDELETEFRAMEBUFFERSPROC DeleteFramebuffers; - PFNGLDELETEPROGRAMPROC DeleteProgram; - PFNGLDELETEPROGRAMPIPELINESPROC DeleteProgramPipelines; - PFNGLDELETEQUERIESPROC DeleteQueries; - PFNGLDELETERENDERBUFFERSPROC DeleteRenderbuffers; - PFNGLDELETESAMPLERSPROC DeleteSamplers; - PFNGLDELETESHADERPROC DeleteShader; - PFNGLDELETESYNCPROC DeleteSync; - PFNGLDELETETEXTURESPROC DeleteTextures; - PFNGLDELETETRANSFORMFEEDBACKSPROC DeleteTransformFeedbacks; - PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays; - PFNGLDEPTHFUNCPROC DepthFunc; - PFNGLDEPTHMASKPROC DepthMask; - PFNGLDEPTHRANGEPROC DepthRange; - PFNGLDEPTHRANGEARRAYVPROC DepthRangeArrayv; - PFNGLDEPTHRANGEINDEXEDPROC DepthRangeIndexed; - PFNGLDEPTHRANGEFPROC DepthRangef; - PFNGLDETACHSHADERPROC DetachShader; - PFNGLDISABLEPROC Disable; - PFNGLDISABLEVERTEXARRAYATTRIBPROC DisableVertexArrayAttrib; - PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray; - PFNGLDISABLEIPROC Disablei; - PFNGLDISPATCHCOMPUTEPROC DispatchCompute; - PFNGLDISPATCHCOMPUTEINDIRECTPROC DispatchComputeIndirect; - PFNGLDRAWARRAYSPROC DrawArrays; - PFNGLDRAWARRAYSINDIRECTPROC DrawArraysIndirect; - PFNGLDRAWARRAYSINSTANCEDPROC DrawArraysInstanced; - PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC DrawArraysInstancedBaseInstance; - PFNGLDRAWBUFFERPROC DrawBuffer; - PFNGLDRAWBUFFERSPROC DrawBuffers; - PFNGLDRAWELEMENTSPROC DrawElements; - PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex; - PFNGLDRAWELEMENTSINDIRECTPROC DrawElementsIndirect; - PFNGLDRAWELEMENTSINSTANCEDPROC DrawElementsInstanced; - PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC DrawElementsInstancedBaseInstance; - PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC DrawElementsInstancedBaseVertex; - PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC DrawElementsInstancedBaseVertexBaseInstance; - PFNGLDRAWRANGEELEMENTSPROC DrawRangeElements; - PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC DrawRangeElementsBaseVertex; - PFNGLDRAWTRANSFORMFEEDBACKPROC DrawTransformFeedback; - PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC DrawTransformFeedbackInstanced; - PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC DrawTransformFeedbackStream; - PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC DrawTransformFeedbackStreamInstanced; - PFNGLENABLEPROC Enable; - PFNGLENABLEVERTEXARRAYATTRIBPROC EnableVertexArrayAttrib; - PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray; - PFNGLENABLEIPROC Enablei; - PFNGLENDCONDITIONALRENDERPROC EndConditionalRender; - PFNGLENDQUERYPROC EndQuery; - PFNGLENDQUERYINDEXEDPROC EndQueryIndexed; - PFNGLENDTRANSFORMFEEDBACKPROC EndTransformFeedback; - PFNGLFENCESYNCPROC FenceSync; - PFNGLFINISHPROC Finish; - PFNGLFLUSHPROC Flush; - PFNGLFLUSHMAPPEDBUFFERRANGEPROC FlushMappedBufferRange; - PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC FlushMappedNamedBufferRange; - PFNGLFRAMEBUFFERPARAMETERIPROC FramebufferParameteri; - PFNGLFRAMEBUFFERRENDERBUFFERPROC FramebufferRenderbuffer; - PFNGLFRAMEBUFFERTEXTUREPROC FramebufferTexture; - PFNGLFRAMEBUFFERTEXTURE1DPROC FramebufferTexture1D; - PFNGLFRAMEBUFFERTEXTURE2DPROC FramebufferTexture2D; - PFNGLFRAMEBUFFERTEXTURE3DPROC FramebufferTexture3D; - PFNGLFRAMEBUFFERTEXTURELAYERPROC FramebufferTextureLayer; - PFNGLFRONTFACEPROC FrontFace; - PFNGLGENBUFFERSPROC GenBuffers; - PFNGLGENFRAMEBUFFERSPROC GenFramebuffers; - PFNGLGENPROGRAMPIPELINESPROC GenProgramPipelines; - PFNGLGENQUERIESPROC GenQueries; - PFNGLGENRENDERBUFFERSPROC GenRenderbuffers; - PFNGLGENSAMPLERSPROC GenSamplers; - PFNGLGENTEXTURESPROC GenTextures; - PFNGLGENTRANSFORMFEEDBACKSPROC GenTransformFeedbacks; - PFNGLGENVERTEXARRAYSPROC GenVertexArrays; - PFNGLGENERATEMIPMAPPROC GenerateMipmap; - PFNGLGENERATETEXTUREMIPMAPPROC GenerateTextureMipmap; - PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC GetActiveAtomicCounterBufferiv; - PFNGLGETACTIVEATTRIBPROC GetActiveAttrib; - PFNGLGETACTIVESUBROUTINENAMEPROC GetActiveSubroutineName; - PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC GetActiveSubroutineUniformName; - PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC GetActiveSubroutineUniformiv; - PFNGLGETACTIVEUNIFORMPROC GetActiveUniform; - PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC GetActiveUniformBlockName; - PFNGLGETACTIVEUNIFORMBLOCKIVPROC GetActiveUniformBlockiv; - PFNGLGETACTIVEUNIFORMNAMEPROC GetActiveUniformName; - PFNGLGETACTIVEUNIFORMSIVPROC GetActiveUniformsiv; - PFNGLGETATTACHEDSHADERSPROC GetAttachedShaders; - PFNGLGETATTRIBLOCATIONPROC GetAttribLocation; - PFNGLGETBOOLEANI_VPROC GetBooleani_v; - PFNGLGETBOOLEANVPROC GetBooleanv; - PFNGLGETBUFFERPARAMETERI64VPROC GetBufferParameteri64v; - PFNGLGETBUFFERPARAMETERIVPROC GetBufferParameteriv; - PFNGLGETBUFFERPOINTERVPROC GetBufferPointerv; - PFNGLGETBUFFERSUBDATAPROC GetBufferSubData; - PFNGLGETCOMPRESSEDTEXIMAGEPROC GetCompressedTexImage; - PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC GetCompressedTextureImage; - PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC GetCompressedTextureSubImage; - PFNGLGETDEBUGMESSAGELOGPROC GetDebugMessageLog; - PFNGLGETDOUBLEI_VPROC GetDoublei_v; - PFNGLGETDOUBLEVPROC GetDoublev; - PFNGLGETERRORPROC GetError; - PFNGLGETFLOATI_VPROC GetFloati_v; - PFNGLGETFLOATVPROC GetFloatv; - PFNGLGETFRAGDATAINDEXPROC GetFragDataIndex; - PFNGLGETFRAGDATALOCATIONPROC GetFragDataLocation; - PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetFramebufferAttachmentParameteriv; - PFNGLGETFRAMEBUFFERPARAMETERIVPROC GetFramebufferParameteriv; - PFNGLGETGRAPHICSRESETSTATUSPROC GetGraphicsResetStatus; - PFNGLGETINTEGER64I_VPROC GetInteger64i_v; - PFNGLGETINTEGER64VPROC GetInteger64v; - PFNGLGETINTEGERI_VPROC GetIntegeri_v; - PFNGLGETINTEGERVPROC GetIntegerv; - PFNGLGETINTERNALFORMATI64VPROC GetInternalformati64v; - PFNGLGETINTERNALFORMATIVPROC GetInternalformativ; - PFNGLGETMULTISAMPLEFVPROC GetMultisamplefv; - PFNGLGETNAMEDBUFFERPARAMETERI64VPROC GetNamedBufferParameteri64v; - PFNGLGETNAMEDBUFFERPARAMETERIVPROC GetNamedBufferParameteriv; - PFNGLGETNAMEDBUFFERPOINTERVPROC GetNamedBufferPointerv; - PFNGLGETNAMEDBUFFERSUBDATAPROC GetNamedBufferSubData; - PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetNamedFramebufferAttachmentParameteriv; - PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC GetNamedFramebufferParameteriv; - PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC GetNamedRenderbufferParameteriv; - PFNGLGETOBJECTLABELPROC GetObjectLabel; - PFNGLGETOBJECTPTRLABELPROC GetObjectPtrLabel; - PFNGLGETPOINTERVPROC GetPointerv; - PFNGLGETPROGRAMBINARYPROC GetProgramBinary; - PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog; - PFNGLGETPROGRAMINTERFACEIVPROC GetProgramInterfaceiv; - PFNGLGETPROGRAMPIPELINEINFOLOGPROC GetProgramPipelineInfoLog; - PFNGLGETPROGRAMPIPELINEIVPROC GetProgramPipelineiv; - PFNGLGETPROGRAMRESOURCEINDEXPROC GetProgramResourceIndex; - PFNGLGETPROGRAMRESOURCELOCATIONPROC GetProgramResourceLocation; - PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC GetProgramResourceLocationIndex; - PFNGLGETPROGRAMRESOURCENAMEPROC GetProgramResourceName; - PFNGLGETPROGRAMRESOURCEIVPROC GetProgramResourceiv; - PFNGLGETPROGRAMSTAGEIVPROC GetProgramStageiv; - PFNGLGETPROGRAMIVPROC GetProgramiv; - PFNGLGETQUERYBUFFEROBJECTI64VPROC GetQueryBufferObjecti64v; - PFNGLGETQUERYBUFFEROBJECTIVPROC GetQueryBufferObjectiv; - PFNGLGETQUERYBUFFEROBJECTUI64VPROC GetQueryBufferObjectui64v; - PFNGLGETQUERYBUFFEROBJECTUIVPROC GetQueryBufferObjectuiv; - PFNGLGETQUERYINDEXEDIVPROC GetQueryIndexediv; - PFNGLGETQUERYOBJECTI64VPROC GetQueryObjecti64v; - PFNGLGETQUERYOBJECTIVPROC GetQueryObjectiv; - PFNGLGETQUERYOBJECTUI64VPROC GetQueryObjectui64v; - PFNGLGETQUERYOBJECTUIVPROC GetQueryObjectuiv; - PFNGLGETQUERYIVPROC GetQueryiv; - PFNGLGETRENDERBUFFERPARAMETERIVPROC GetRenderbufferParameteriv; - PFNGLGETSAMPLERPARAMETERIIVPROC GetSamplerParameterIiv; - PFNGLGETSAMPLERPARAMETERIUIVPROC GetSamplerParameterIuiv; - PFNGLGETSAMPLERPARAMETERFVPROC GetSamplerParameterfv; - PFNGLGETSAMPLERPARAMETERIVPROC GetSamplerParameteriv; - PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog; - PFNGLGETSHADERPRECISIONFORMATPROC GetShaderPrecisionFormat; - PFNGLGETSHADERSOURCEPROC GetShaderSource; - PFNGLGETSHADERIVPROC GetShaderiv; - PFNGLGETSTRINGPROC GetString; - PFNGLGETSTRINGIPROC GetStringi; - PFNGLGETSUBROUTINEINDEXPROC GetSubroutineIndex; - PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC GetSubroutineUniformLocation; - PFNGLGETSYNCIVPROC GetSynciv; - PFNGLGETTEXIMAGEPROC GetTexImage; - PFNGLGETTEXLEVELPARAMETERFVPROC GetTexLevelParameterfv; - PFNGLGETTEXLEVELPARAMETERIVPROC GetTexLevelParameteriv; - PFNGLGETTEXPARAMETERIIVPROC GetTexParameterIiv; - PFNGLGETTEXPARAMETERIUIVPROC GetTexParameterIuiv; - PFNGLGETTEXPARAMETERFVPROC GetTexParameterfv; - PFNGLGETTEXPARAMETERIVPROC GetTexParameteriv; - PFNGLGETTEXTUREIMAGEPROC GetTextureImage; - PFNGLGETTEXTURELEVELPARAMETERFVPROC GetTextureLevelParameterfv; - PFNGLGETTEXTURELEVELPARAMETERIVPROC GetTextureLevelParameteriv; - PFNGLGETTEXTUREPARAMETERIIVPROC GetTextureParameterIiv; - PFNGLGETTEXTUREPARAMETERIUIVPROC GetTextureParameterIuiv; - PFNGLGETTEXTUREPARAMETERFVPROC GetTextureParameterfv; - PFNGLGETTEXTUREPARAMETERIVPROC GetTextureParameteriv; - PFNGLGETTEXTURESUBIMAGEPROC GetTextureSubImage; - PFNGLGETTRANSFORMFEEDBACKVARYINGPROC GetTransformFeedbackVarying; - PFNGLGETTRANSFORMFEEDBACKI64_VPROC GetTransformFeedbacki64_v; - PFNGLGETTRANSFORMFEEDBACKI_VPROC GetTransformFeedbacki_v; - PFNGLGETTRANSFORMFEEDBACKIVPROC GetTransformFeedbackiv; - PFNGLGETUNIFORMBLOCKINDEXPROC GetUniformBlockIndex; - PFNGLGETUNIFORMINDICESPROC GetUniformIndices; - PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation; - PFNGLGETUNIFORMSUBROUTINEUIVPROC GetUniformSubroutineuiv; - PFNGLGETUNIFORMDVPROC GetUniformdv; - PFNGLGETUNIFORMFVPROC GetUniformfv; - PFNGLGETUNIFORMIVPROC GetUniformiv; - PFNGLGETUNIFORMUIVPROC GetUniformuiv; - PFNGLGETVERTEXARRAYINDEXED64IVPROC GetVertexArrayIndexed64iv; - PFNGLGETVERTEXARRAYINDEXEDIVPROC GetVertexArrayIndexediv; - PFNGLGETVERTEXARRAYIVPROC GetVertexArrayiv; - PFNGLGETVERTEXATTRIBIIVPROC GetVertexAttribIiv; - PFNGLGETVERTEXATTRIBIUIVPROC GetVertexAttribIuiv; - PFNGLGETVERTEXATTRIBLDVPROC GetVertexAttribLdv; - PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv; - PFNGLGETVERTEXATTRIBDVPROC GetVertexAttribdv; - PFNGLGETVERTEXATTRIBFVPROC GetVertexAttribfv; - PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv; - PFNGLGETNCOMPRESSEDTEXIMAGEPROC GetnCompressedTexImage; - PFNGLGETNTEXIMAGEPROC GetnTexImage; - PFNGLGETNUNIFORMDVPROC GetnUniformdv; - PFNGLGETNUNIFORMFVPROC GetnUniformfv; - PFNGLGETNUNIFORMIVPROC GetnUniformiv; - PFNGLGETNUNIFORMUIVPROC GetnUniformuiv; - PFNGLHINTPROC Hint; - PFNGLINVALIDATEBUFFERDATAPROC InvalidateBufferData; - PFNGLINVALIDATEBUFFERSUBDATAPROC InvalidateBufferSubData; - PFNGLINVALIDATEFRAMEBUFFERPROC InvalidateFramebuffer; - PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC InvalidateNamedFramebufferData; - PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC InvalidateNamedFramebufferSubData; - PFNGLINVALIDATESUBFRAMEBUFFERPROC InvalidateSubFramebuffer; - PFNGLINVALIDATETEXIMAGEPROC InvalidateTexImage; - PFNGLINVALIDATETEXSUBIMAGEPROC InvalidateTexSubImage; - PFNGLISBUFFERPROC IsBuffer; - PFNGLISENABLEDPROC IsEnabled; - PFNGLISENABLEDIPROC IsEnabledi; - PFNGLISFRAMEBUFFERPROC IsFramebuffer; - PFNGLISPROGRAMPROC IsProgram; - PFNGLISPROGRAMPIPELINEPROC IsProgramPipeline; - PFNGLISQUERYPROC IsQuery; - PFNGLISRENDERBUFFERPROC IsRenderbuffer; - PFNGLISSAMPLERPROC IsSampler; - PFNGLISSHADERPROC IsShader; - PFNGLISSYNCPROC IsSync; - PFNGLISTEXTUREPROC IsTexture; - PFNGLISTRANSFORMFEEDBACKPROC IsTransformFeedback; - PFNGLISVERTEXARRAYPROC IsVertexArray; - PFNGLLINEWIDTHPROC LineWidth; - PFNGLLINKPROGRAMPROC LinkProgram; - PFNGLLOGICOPPROC LogicOp; - PFNGLMAPBUFFERPROC MapBuffer; - PFNGLMAPBUFFERRANGEPROC MapBufferRange; - PFNGLMAPNAMEDBUFFERPROC MapNamedBuffer; - PFNGLMAPNAMEDBUFFERRANGEPROC MapNamedBufferRange; - PFNGLMEMORYBARRIERPROC MemoryBarrier; - PFNGLMEMORYBARRIERBYREGIONPROC MemoryBarrierByRegion; - PFNGLMINSAMPLESHADINGPROC MinSampleShading; - PFNGLMULTIDRAWARRAYSPROC MultiDrawArrays; - PFNGLMULTIDRAWARRAYSINDIRECTPROC MultiDrawArraysIndirect; - PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC MultiDrawArraysIndirectCount; - PFNGLMULTIDRAWELEMENTSPROC MultiDrawElements; - PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC MultiDrawElementsBaseVertex; - PFNGLMULTIDRAWELEMENTSINDIRECTPROC MultiDrawElementsIndirect; - PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC MultiDrawElementsIndirectCount; - PFNGLNAMEDBUFFERDATAPROC NamedBufferData; - PFNGLNAMEDBUFFERSTORAGEPROC NamedBufferStorage; - PFNGLNAMEDBUFFERSUBDATAPROC NamedBufferSubData; - PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC NamedFramebufferDrawBuffer; - PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC NamedFramebufferDrawBuffers; - PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC NamedFramebufferParameteri; - PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC NamedFramebufferReadBuffer; - PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC NamedFramebufferRenderbuffer; - PFNGLNAMEDFRAMEBUFFERTEXTUREPROC NamedFramebufferTexture; - PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC NamedFramebufferTextureLayer; - PFNGLNAMEDRENDERBUFFERSTORAGEPROC NamedRenderbufferStorage; - PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC NamedRenderbufferStorageMultisample; - PFNGLOBJECTLABELPROC ObjectLabel; - PFNGLOBJECTPTRLABELPROC ObjectPtrLabel; - PFNGLPATCHPARAMETERFVPROC PatchParameterfv; - PFNGLPATCHPARAMETERIPROC PatchParameteri; - PFNGLPAUSETRANSFORMFEEDBACKPROC PauseTransformFeedback; - PFNGLPIXELSTOREFPROC PixelStoref; - PFNGLPIXELSTOREIPROC PixelStorei; - PFNGLPOINTPARAMETERFPROC PointParameterf; - PFNGLPOINTPARAMETERFVPROC PointParameterfv; - PFNGLPOINTPARAMETERIPROC PointParameteri; - PFNGLPOINTPARAMETERIVPROC PointParameteriv; - PFNGLPOINTSIZEPROC PointSize; - PFNGLPOLYGONMODEPROC PolygonMode; - PFNGLPOLYGONOFFSETPROC PolygonOffset; - PFNGLPOLYGONOFFSETCLAMPPROC PolygonOffsetClamp; - PFNGLPOPDEBUGGROUPPROC PopDebugGroup; - PFNGLPRIMITIVERESTARTINDEXPROC PrimitiveRestartIndex; - PFNGLPROGRAMBINARYPROC ProgramBinary; - PFNGLPROGRAMPARAMETERIPROC ProgramParameteri; - PFNGLPROGRAMUNIFORM1DPROC ProgramUniform1d; - PFNGLPROGRAMUNIFORM1DVPROC ProgramUniform1dv; - PFNGLPROGRAMUNIFORM1FPROC ProgramUniform1f; - PFNGLPROGRAMUNIFORM1FVPROC ProgramUniform1fv; - PFNGLPROGRAMUNIFORM1IPROC ProgramUniform1i; - PFNGLPROGRAMUNIFORM1IVPROC ProgramUniform1iv; - PFNGLPROGRAMUNIFORM1UIPROC ProgramUniform1ui; - PFNGLPROGRAMUNIFORM1UIVPROC ProgramUniform1uiv; - PFNGLPROGRAMUNIFORM2DPROC ProgramUniform2d; - PFNGLPROGRAMUNIFORM2DVPROC ProgramUniform2dv; - PFNGLPROGRAMUNIFORM2FPROC ProgramUniform2f; - PFNGLPROGRAMUNIFORM2FVPROC ProgramUniform2fv; - PFNGLPROGRAMUNIFORM2IPROC ProgramUniform2i; - PFNGLPROGRAMUNIFORM2IVPROC ProgramUniform2iv; - PFNGLPROGRAMUNIFORM2UIPROC ProgramUniform2ui; - PFNGLPROGRAMUNIFORM2UIVPROC ProgramUniform2uiv; - PFNGLPROGRAMUNIFORM3DPROC ProgramUniform3d; - PFNGLPROGRAMUNIFORM3DVPROC ProgramUniform3dv; - PFNGLPROGRAMUNIFORM3FPROC ProgramUniform3f; - PFNGLPROGRAMUNIFORM3FVPROC ProgramUniform3fv; - PFNGLPROGRAMUNIFORM3IPROC ProgramUniform3i; - PFNGLPROGRAMUNIFORM3IVPROC ProgramUniform3iv; - PFNGLPROGRAMUNIFORM3UIPROC ProgramUniform3ui; - PFNGLPROGRAMUNIFORM3UIVPROC ProgramUniform3uiv; - PFNGLPROGRAMUNIFORM4DPROC ProgramUniform4d; - PFNGLPROGRAMUNIFORM4DVPROC ProgramUniform4dv; - PFNGLPROGRAMUNIFORM4FPROC ProgramUniform4f; - PFNGLPROGRAMUNIFORM4FVPROC ProgramUniform4fv; - PFNGLPROGRAMUNIFORM4IPROC ProgramUniform4i; - PFNGLPROGRAMUNIFORM4IVPROC ProgramUniform4iv; - PFNGLPROGRAMUNIFORM4UIPROC ProgramUniform4ui; - PFNGLPROGRAMUNIFORM4UIVPROC ProgramUniform4uiv; - PFNGLPROGRAMUNIFORMMATRIX2DVPROC ProgramUniformMatrix2dv; - PFNGLPROGRAMUNIFORMMATRIX2FVPROC ProgramUniformMatrix2fv; - PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC ProgramUniformMatrix2x3dv; - PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC ProgramUniformMatrix2x3fv; - PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC ProgramUniformMatrix2x4dv; - PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC ProgramUniformMatrix2x4fv; - PFNGLPROGRAMUNIFORMMATRIX3DVPROC ProgramUniformMatrix3dv; - PFNGLPROGRAMUNIFORMMATRIX3FVPROC ProgramUniformMatrix3fv; - PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC ProgramUniformMatrix3x2dv; - PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC ProgramUniformMatrix3x2fv; - PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC ProgramUniformMatrix3x4dv; - PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC ProgramUniformMatrix3x4fv; - PFNGLPROGRAMUNIFORMMATRIX4DVPROC ProgramUniformMatrix4dv; - PFNGLPROGRAMUNIFORMMATRIX4FVPROC ProgramUniformMatrix4fv; - PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC ProgramUniformMatrix4x2dv; - PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC ProgramUniformMatrix4x2fv; - PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC ProgramUniformMatrix4x3dv; - PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC ProgramUniformMatrix4x3fv; - PFNGLPROVOKINGVERTEXPROC ProvokingVertex; - PFNGLPUSHDEBUGGROUPPROC PushDebugGroup; - PFNGLQUERYCOUNTERPROC QueryCounter; - PFNGLREADBUFFERPROC ReadBuffer; - PFNGLREADPIXELSPROC ReadPixels; - PFNGLREADNPIXELSPROC ReadnPixels; - PFNGLRELEASESHADERCOMPILERPROC ReleaseShaderCompiler; - PFNGLRENDERBUFFERSTORAGEPROC RenderbufferStorage; - PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC RenderbufferStorageMultisample; - PFNGLRESUMETRANSFORMFEEDBACKPROC ResumeTransformFeedback; - PFNGLSAMPLECOVERAGEPROC SampleCoverage; - PFNGLSAMPLEMASKIPROC SampleMaski; - PFNGLSAMPLERPARAMETERIIVPROC SamplerParameterIiv; - PFNGLSAMPLERPARAMETERIUIVPROC SamplerParameterIuiv; - PFNGLSAMPLERPARAMETERFPROC SamplerParameterf; - PFNGLSAMPLERPARAMETERFVPROC SamplerParameterfv; - PFNGLSAMPLERPARAMETERIPROC SamplerParameteri; - PFNGLSAMPLERPARAMETERIVPROC SamplerParameteriv; - PFNGLSCISSORPROC Scissor; - PFNGLSCISSORARRAYVPROC ScissorArrayv; - PFNGLSCISSORINDEXEDPROC ScissorIndexed; - PFNGLSCISSORINDEXEDVPROC ScissorIndexedv; - PFNGLSHADERBINARYPROC ShaderBinary; - PFNGLSHADERSOURCEPROC ShaderSource; - PFNGLSHADERSTORAGEBLOCKBINDINGPROC ShaderStorageBlockBinding; - PFNGLSPECIALIZESHADERPROC SpecializeShader; - PFNGLSTENCILFUNCPROC StencilFunc; - PFNGLSTENCILFUNCSEPARATEPROC StencilFuncSeparate; - PFNGLSTENCILMASKPROC StencilMask; - PFNGLSTENCILMASKSEPARATEPROC StencilMaskSeparate; - PFNGLSTENCILOPPROC StencilOp; - PFNGLSTENCILOPSEPARATEPROC StencilOpSeparate; - PFNGLTEXBUFFERPROC TexBuffer; - PFNGLTEXBUFFERRANGEPROC TexBufferRange; - PFNGLTEXIMAGE1DPROC TexImage1D; - PFNGLTEXIMAGE2DPROC TexImage2D; - PFNGLTEXIMAGE2DMULTISAMPLEPROC TexImage2DMultisample; - PFNGLTEXIMAGE3DPROC TexImage3D; - PFNGLTEXIMAGE3DMULTISAMPLEPROC TexImage3DMultisample; - PFNGLTEXPARAMETERIIVPROC TexParameterIiv; - PFNGLTEXPARAMETERIUIVPROC TexParameterIuiv; - PFNGLTEXPARAMETERFPROC TexParameterf; - PFNGLTEXPARAMETERFVPROC TexParameterfv; - PFNGLTEXPARAMETERIPROC TexParameteri; - PFNGLTEXPARAMETERIVPROC TexParameteriv; - PFNGLTEXSTORAGE1DPROC TexStorage1D; - PFNGLTEXSTORAGE2DPROC TexStorage2D; - PFNGLTEXSTORAGE2DMULTISAMPLEPROC TexStorage2DMultisample; - PFNGLTEXSTORAGE3DPROC TexStorage3D; - PFNGLTEXSTORAGE3DMULTISAMPLEPROC TexStorage3DMultisample; - PFNGLTEXSUBIMAGE1DPROC TexSubImage1D; - PFNGLTEXSUBIMAGE2DPROC TexSubImage2D; - PFNGLTEXSUBIMAGE3DPROC TexSubImage3D; - PFNGLTEXTUREBARRIERPROC TextureBarrier; - PFNGLTEXTUREBUFFERPROC TextureBuffer; - PFNGLTEXTUREBUFFERRANGEPROC TextureBufferRange; - PFNGLTEXTUREPARAMETERIIVPROC TextureParameterIiv; - PFNGLTEXTUREPARAMETERIUIVPROC TextureParameterIuiv; - PFNGLTEXTUREPARAMETERFPROC TextureParameterf; - PFNGLTEXTUREPARAMETERFVPROC TextureParameterfv; - PFNGLTEXTUREPARAMETERIPROC TextureParameteri; - PFNGLTEXTUREPARAMETERIVPROC TextureParameteriv; - PFNGLTEXTURESTORAGE1DPROC TextureStorage1D; - PFNGLTEXTURESTORAGE2DPROC TextureStorage2D; - PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC TextureStorage2DMultisample; - PFNGLTEXTURESTORAGE3DPROC TextureStorage3D; - PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC TextureStorage3DMultisample; - PFNGLTEXTURESUBIMAGE1DPROC TextureSubImage1D; - PFNGLTEXTURESUBIMAGE2DPROC TextureSubImage2D; - PFNGLTEXTURESUBIMAGE3DPROC TextureSubImage3D; - PFNGLTEXTUREVIEWPROC TextureView; - PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC TransformFeedbackBufferBase; - PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC TransformFeedbackBufferRange; - PFNGLTRANSFORMFEEDBACKVARYINGSPROC TransformFeedbackVaryings; - PFNGLUNIFORM1DPROC Uniform1d; - PFNGLUNIFORM1DVPROC Uniform1dv; - PFNGLUNIFORM1FPROC Uniform1f; - PFNGLUNIFORM1FVPROC Uniform1fv; - PFNGLUNIFORM1IPROC Uniform1i; - PFNGLUNIFORM1IVPROC Uniform1iv; - PFNGLUNIFORM1UIPROC Uniform1ui; - PFNGLUNIFORM1UIVPROC Uniform1uiv; - PFNGLUNIFORM2DPROC Uniform2d; - PFNGLUNIFORM2DVPROC Uniform2dv; - PFNGLUNIFORM2FPROC Uniform2f; - PFNGLUNIFORM2FVPROC Uniform2fv; - PFNGLUNIFORM2IPROC Uniform2i; - PFNGLUNIFORM2IVPROC Uniform2iv; - PFNGLUNIFORM2UIPROC Uniform2ui; - PFNGLUNIFORM2UIVPROC Uniform2uiv; - PFNGLUNIFORM3DPROC Uniform3d; - PFNGLUNIFORM3DVPROC Uniform3dv; - PFNGLUNIFORM3FPROC Uniform3f; - PFNGLUNIFORM3FVPROC Uniform3fv; - PFNGLUNIFORM3IPROC Uniform3i; - PFNGLUNIFORM3IVPROC Uniform3iv; - PFNGLUNIFORM3UIPROC Uniform3ui; - PFNGLUNIFORM3UIVPROC Uniform3uiv; - PFNGLUNIFORM4DPROC Uniform4d; - PFNGLUNIFORM4DVPROC Uniform4dv; - PFNGLUNIFORM4FPROC Uniform4f; - PFNGLUNIFORM4FVPROC Uniform4fv; - PFNGLUNIFORM4IPROC Uniform4i; - PFNGLUNIFORM4IVPROC Uniform4iv; - PFNGLUNIFORM4UIPROC Uniform4ui; - PFNGLUNIFORM4UIVPROC Uniform4uiv; - PFNGLUNIFORMBLOCKBINDINGPROC UniformBlockBinding; - PFNGLUNIFORMMATRIX2DVPROC UniformMatrix2dv; - PFNGLUNIFORMMATRIX2FVPROC UniformMatrix2fv; - PFNGLUNIFORMMATRIX2X3DVPROC UniformMatrix2x3dv; - PFNGLUNIFORMMATRIX2X3FVPROC UniformMatrix2x3fv; - PFNGLUNIFORMMATRIX2X4DVPROC UniformMatrix2x4dv; - PFNGLUNIFORMMATRIX2X4FVPROC UniformMatrix2x4fv; - PFNGLUNIFORMMATRIX3DVPROC UniformMatrix3dv; - PFNGLUNIFORMMATRIX3FVPROC UniformMatrix3fv; - PFNGLUNIFORMMATRIX3X2DVPROC UniformMatrix3x2dv; - PFNGLUNIFORMMATRIX3X2FVPROC UniformMatrix3x2fv; - PFNGLUNIFORMMATRIX3X4DVPROC UniformMatrix3x4dv; - PFNGLUNIFORMMATRIX3X4FVPROC UniformMatrix3x4fv; - PFNGLUNIFORMMATRIX4DVPROC UniformMatrix4dv; - PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv; - PFNGLUNIFORMMATRIX4X2DVPROC UniformMatrix4x2dv; - PFNGLUNIFORMMATRIX4X2FVPROC UniformMatrix4x2fv; - PFNGLUNIFORMMATRIX4X3DVPROC UniformMatrix4x3dv; - PFNGLUNIFORMMATRIX4X3FVPROC UniformMatrix4x3fv; - PFNGLUNIFORMSUBROUTINESUIVPROC UniformSubroutinesuiv; - PFNGLUNMAPBUFFERPROC UnmapBuffer; - PFNGLUNMAPNAMEDBUFFERPROC UnmapNamedBuffer; - PFNGLUSEPROGRAMPROC UseProgram; - PFNGLUSEPROGRAMSTAGESPROC UseProgramStages; - PFNGLVALIDATEPROGRAMPROC ValidateProgram; - PFNGLVALIDATEPROGRAMPIPELINEPROC ValidateProgramPipeline; - PFNGLVERTEXARRAYATTRIBBINDINGPROC VertexArrayAttribBinding; - PFNGLVERTEXARRAYATTRIBFORMATPROC VertexArrayAttribFormat; - PFNGLVERTEXARRAYATTRIBIFORMATPROC VertexArrayAttribIFormat; - PFNGLVERTEXARRAYATTRIBLFORMATPROC VertexArrayAttribLFormat; - PFNGLVERTEXARRAYBINDINGDIVISORPROC VertexArrayBindingDivisor; - PFNGLVERTEXARRAYELEMENTBUFFERPROC VertexArrayElementBuffer; - PFNGLVERTEXARRAYVERTEXBUFFERPROC VertexArrayVertexBuffer; - PFNGLVERTEXARRAYVERTEXBUFFERSPROC VertexArrayVertexBuffers; - PFNGLVERTEXATTRIB1DPROC VertexAttrib1d; - PFNGLVERTEXATTRIB1DVPROC VertexAttrib1dv; - PFNGLVERTEXATTRIB1FPROC VertexAttrib1f; - PFNGLVERTEXATTRIB1FVPROC VertexAttrib1fv; - PFNGLVERTEXATTRIB1SPROC VertexAttrib1s; - PFNGLVERTEXATTRIB1SVPROC VertexAttrib1sv; - PFNGLVERTEXATTRIB2DPROC VertexAttrib2d; - PFNGLVERTEXATTRIB2DVPROC VertexAttrib2dv; - PFNGLVERTEXATTRIB2FPROC VertexAttrib2f; - PFNGLVERTEXATTRIB2FVPROC VertexAttrib2fv; - PFNGLVERTEXATTRIB2SPROC VertexAttrib2s; - PFNGLVERTEXATTRIB2SVPROC VertexAttrib2sv; - PFNGLVERTEXATTRIB3DPROC VertexAttrib3d; - PFNGLVERTEXATTRIB3DVPROC VertexAttrib3dv; - PFNGLVERTEXATTRIB3FPROC VertexAttrib3f; - PFNGLVERTEXATTRIB3FVPROC VertexAttrib3fv; - PFNGLVERTEXATTRIB3SPROC VertexAttrib3s; - PFNGLVERTEXATTRIB3SVPROC VertexAttrib3sv; - PFNGLVERTEXATTRIB4NBVPROC VertexAttrib4Nbv; - PFNGLVERTEXATTRIB4NIVPROC VertexAttrib4Niv; - PFNGLVERTEXATTRIB4NSVPROC VertexAttrib4Nsv; - PFNGLVERTEXATTRIB4NUBPROC VertexAttrib4Nub; - PFNGLVERTEXATTRIB4NUBVPROC VertexAttrib4Nubv; - PFNGLVERTEXATTRIB4NUIVPROC VertexAttrib4Nuiv; - PFNGLVERTEXATTRIB4NUSVPROC VertexAttrib4Nusv; - PFNGLVERTEXATTRIB4BVPROC VertexAttrib4bv; - PFNGLVERTEXATTRIB4DPROC VertexAttrib4d; - PFNGLVERTEXATTRIB4DVPROC VertexAttrib4dv; - PFNGLVERTEXATTRIB4FPROC VertexAttrib4f; - PFNGLVERTEXATTRIB4FVPROC VertexAttrib4fv; - PFNGLVERTEXATTRIB4IVPROC VertexAttrib4iv; - PFNGLVERTEXATTRIB4SPROC VertexAttrib4s; - PFNGLVERTEXATTRIB4SVPROC VertexAttrib4sv; - PFNGLVERTEXATTRIB4UBVPROC VertexAttrib4ubv; - PFNGLVERTEXATTRIB4UIVPROC VertexAttrib4uiv; - PFNGLVERTEXATTRIB4USVPROC VertexAttrib4usv; - PFNGLVERTEXATTRIBBINDINGPROC VertexAttribBinding; - PFNGLVERTEXATTRIBDIVISORPROC VertexAttribDivisor; - PFNGLVERTEXATTRIBFORMATPROC VertexAttribFormat; - PFNGLVERTEXATTRIBI1IPROC VertexAttribI1i; - PFNGLVERTEXATTRIBI1IVPROC VertexAttribI1iv; - PFNGLVERTEXATTRIBI1UIPROC VertexAttribI1ui; - PFNGLVERTEXATTRIBI1UIVPROC VertexAttribI1uiv; - PFNGLVERTEXATTRIBI2IPROC VertexAttribI2i; - PFNGLVERTEXATTRIBI2IVPROC VertexAttribI2iv; - PFNGLVERTEXATTRIBI2UIPROC VertexAttribI2ui; - PFNGLVERTEXATTRIBI2UIVPROC VertexAttribI2uiv; - PFNGLVERTEXATTRIBI3IPROC VertexAttribI3i; - PFNGLVERTEXATTRIBI3IVPROC VertexAttribI3iv; - PFNGLVERTEXATTRIBI3UIPROC VertexAttribI3ui; - PFNGLVERTEXATTRIBI3UIVPROC VertexAttribI3uiv; - PFNGLVERTEXATTRIBI4BVPROC VertexAttribI4bv; - PFNGLVERTEXATTRIBI4IPROC VertexAttribI4i; - PFNGLVERTEXATTRIBI4IVPROC VertexAttribI4iv; - PFNGLVERTEXATTRIBI4SVPROC VertexAttribI4sv; - PFNGLVERTEXATTRIBI4UBVPROC VertexAttribI4ubv; - PFNGLVERTEXATTRIBI4UIPROC VertexAttribI4ui; - PFNGLVERTEXATTRIBI4UIVPROC VertexAttribI4uiv; - PFNGLVERTEXATTRIBI4USVPROC VertexAttribI4usv; - PFNGLVERTEXATTRIBIFORMATPROC VertexAttribIFormat; - PFNGLVERTEXATTRIBIPOINTERPROC VertexAttribIPointer; - PFNGLVERTEXATTRIBL1DPROC VertexAttribL1d; - PFNGLVERTEXATTRIBL1DVPROC VertexAttribL1dv; - PFNGLVERTEXATTRIBL2DPROC VertexAttribL2d; - PFNGLVERTEXATTRIBL2DVPROC VertexAttribL2dv; - PFNGLVERTEXATTRIBL3DPROC VertexAttribL3d; - PFNGLVERTEXATTRIBL3DVPROC VertexAttribL3dv; - PFNGLVERTEXATTRIBL4DPROC VertexAttribL4d; - PFNGLVERTEXATTRIBL4DVPROC VertexAttribL4dv; - PFNGLVERTEXATTRIBLFORMATPROC VertexAttribLFormat; - PFNGLVERTEXATTRIBLPOINTERPROC VertexAttribLPointer; - PFNGLVERTEXATTRIBP1UIPROC VertexAttribP1ui; - PFNGLVERTEXATTRIBP1UIVPROC VertexAttribP1uiv; - PFNGLVERTEXATTRIBP2UIPROC VertexAttribP2ui; - PFNGLVERTEXATTRIBP2UIVPROC VertexAttribP2uiv; - PFNGLVERTEXATTRIBP3UIPROC VertexAttribP3ui; - PFNGLVERTEXATTRIBP3UIVPROC VertexAttribP3uiv; - PFNGLVERTEXATTRIBP4UIPROC VertexAttribP4ui; - PFNGLVERTEXATTRIBP4UIVPROC VertexAttribP4uiv; - PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer; - PFNGLVERTEXBINDINGDIVISORPROC VertexBindingDivisor; - PFNGLVIEWPORTPROC Viewport; - PFNGLVIEWPORTARRAYVPROC ViewportArrayv; - PFNGLVIEWPORTINDEXEDFPROC ViewportIndexedf; - PFNGLVIEWPORTINDEXEDFVPROC ViewportIndexedfv; - PFNGLWAITSYNCPROC WaitSync; - } gl; -}; - -extern union GL3WProcs gl3wProcs; - -/* OpenGL functions */ -#define glActiveShaderProgram gl3wProcs.gl.ActiveShaderProgram -#define glActiveTexture gl3wProcs.gl.ActiveTexture -#define glAttachShader gl3wProcs.gl.AttachShader -#define glBeginConditionalRender gl3wProcs.gl.BeginConditionalRender -#define glBeginQuery gl3wProcs.gl.BeginQuery -#define glBeginQueryIndexed gl3wProcs.gl.BeginQueryIndexed -#define glBeginTransformFeedback gl3wProcs.gl.BeginTransformFeedback -#define glBindAttribLocation gl3wProcs.gl.BindAttribLocation -#define glBindBuffer gl3wProcs.gl.BindBuffer -#define glBindBufferBase gl3wProcs.gl.BindBufferBase -#define glBindBufferRange gl3wProcs.gl.BindBufferRange -#define glBindBuffersBase gl3wProcs.gl.BindBuffersBase -#define glBindBuffersRange gl3wProcs.gl.BindBuffersRange -#define glBindFragDataLocation gl3wProcs.gl.BindFragDataLocation -#define glBindFragDataLocationIndexed gl3wProcs.gl.BindFragDataLocationIndexed -#define glBindFramebuffer gl3wProcs.gl.BindFramebuffer -#define glBindImageTexture gl3wProcs.gl.BindImageTexture -#define glBindImageTextures gl3wProcs.gl.BindImageTextures -#define glBindProgramPipeline gl3wProcs.gl.BindProgramPipeline -#define glBindRenderbuffer gl3wProcs.gl.BindRenderbuffer -#define glBindSampler gl3wProcs.gl.BindSampler -#define glBindSamplers gl3wProcs.gl.BindSamplers -#define glBindTexture gl3wProcs.gl.BindTexture -#define glBindTextureUnit gl3wProcs.gl.BindTextureUnit -#define glBindTextures gl3wProcs.gl.BindTextures -#define glBindTransformFeedback gl3wProcs.gl.BindTransformFeedback -#define glBindVertexArray gl3wProcs.gl.BindVertexArray -#define glBindVertexBuffer gl3wProcs.gl.BindVertexBuffer -#define glBindVertexBuffers gl3wProcs.gl.BindVertexBuffers -#define glBlendColor gl3wProcs.gl.BlendColor -#define glBlendEquation gl3wProcs.gl.BlendEquation -#define glBlendEquationSeparate gl3wProcs.gl.BlendEquationSeparate -#define glBlendEquationSeparatei gl3wProcs.gl.BlendEquationSeparatei -#define glBlendEquationi gl3wProcs.gl.BlendEquationi -#define glBlendFunc gl3wProcs.gl.BlendFunc -#define glBlendFuncSeparate gl3wProcs.gl.BlendFuncSeparate -#define glBlendFuncSeparatei gl3wProcs.gl.BlendFuncSeparatei -#define glBlendFunci gl3wProcs.gl.BlendFunci -#define glBlitFramebuffer gl3wProcs.gl.BlitFramebuffer -#define glBlitNamedFramebuffer gl3wProcs.gl.BlitNamedFramebuffer -#define glBufferData gl3wProcs.gl.BufferData -#define glBufferStorage gl3wProcs.gl.BufferStorage -#define glBufferSubData gl3wProcs.gl.BufferSubData -#define glCheckFramebufferStatus gl3wProcs.gl.CheckFramebufferStatus -#define glCheckNamedFramebufferStatus gl3wProcs.gl.CheckNamedFramebufferStatus -#define glClampColor gl3wProcs.gl.ClampColor -#define glClear gl3wProcs.gl.Clear -#define glClearBufferData gl3wProcs.gl.ClearBufferData -#define glClearBufferSubData gl3wProcs.gl.ClearBufferSubData -#define glClearBufferfi gl3wProcs.gl.ClearBufferfi -#define glClearBufferfv gl3wProcs.gl.ClearBufferfv -#define glClearBufferiv gl3wProcs.gl.ClearBufferiv -#define glClearBufferuiv gl3wProcs.gl.ClearBufferuiv -#define glClearColor gl3wProcs.gl.ClearColor -#define glClearDepth gl3wProcs.gl.ClearDepth -#define glClearDepthf gl3wProcs.gl.ClearDepthf -#define glClearNamedBufferData gl3wProcs.gl.ClearNamedBufferData -#define glClearNamedBufferSubData gl3wProcs.gl.ClearNamedBufferSubData -#define glClearNamedFramebufferfi gl3wProcs.gl.ClearNamedFramebufferfi -#define glClearNamedFramebufferfv gl3wProcs.gl.ClearNamedFramebufferfv -#define glClearNamedFramebufferiv gl3wProcs.gl.ClearNamedFramebufferiv -#define glClearNamedFramebufferuiv gl3wProcs.gl.ClearNamedFramebufferuiv -#define glClearStencil gl3wProcs.gl.ClearStencil -#define glClearTexImage gl3wProcs.gl.ClearTexImage -#define glClearTexSubImage gl3wProcs.gl.ClearTexSubImage -#define glClientWaitSync gl3wProcs.gl.ClientWaitSync -#define glClipControl gl3wProcs.gl.ClipControl -#define glColorMask gl3wProcs.gl.ColorMask -#define glColorMaski gl3wProcs.gl.ColorMaski -#define glCompileShader gl3wProcs.gl.CompileShader -#define glCompressedTexImage1D gl3wProcs.gl.CompressedTexImage1D -#define glCompressedTexImage2D gl3wProcs.gl.CompressedTexImage2D -#define glCompressedTexImage3D gl3wProcs.gl.CompressedTexImage3D -#define glCompressedTexSubImage1D gl3wProcs.gl.CompressedTexSubImage1D -#define glCompressedTexSubImage2D gl3wProcs.gl.CompressedTexSubImage2D -#define glCompressedTexSubImage3D gl3wProcs.gl.CompressedTexSubImage3D -#define glCompressedTextureSubImage1D gl3wProcs.gl.CompressedTextureSubImage1D -#define glCompressedTextureSubImage2D gl3wProcs.gl.CompressedTextureSubImage2D -#define glCompressedTextureSubImage3D gl3wProcs.gl.CompressedTextureSubImage3D -#define glCopyBufferSubData gl3wProcs.gl.CopyBufferSubData -#define glCopyImageSubData gl3wProcs.gl.CopyImageSubData -#define glCopyNamedBufferSubData gl3wProcs.gl.CopyNamedBufferSubData -#define glCopyTexImage1D gl3wProcs.gl.CopyTexImage1D -#define glCopyTexImage2D gl3wProcs.gl.CopyTexImage2D -#define glCopyTexSubImage1D gl3wProcs.gl.CopyTexSubImage1D -#define glCopyTexSubImage2D gl3wProcs.gl.CopyTexSubImage2D -#define glCopyTexSubImage3D gl3wProcs.gl.CopyTexSubImage3D -#define glCopyTextureSubImage1D gl3wProcs.gl.CopyTextureSubImage1D -#define glCopyTextureSubImage2D gl3wProcs.gl.CopyTextureSubImage2D -#define glCopyTextureSubImage3D gl3wProcs.gl.CopyTextureSubImage3D -#define glCreateBuffers gl3wProcs.gl.CreateBuffers -#define glCreateFramebuffers gl3wProcs.gl.CreateFramebuffers -#define glCreateProgram gl3wProcs.gl.CreateProgram -#define glCreateProgramPipelines gl3wProcs.gl.CreateProgramPipelines -#define glCreateQueries gl3wProcs.gl.CreateQueries -#define glCreateRenderbuffers gl3wProcs.gl.CreateRenderbuffers -#define glCreateSamplers gl3wProcs.gl.CreateSamplers -#define glCreateShader gl3wProcs.gl.CreateShader -#define glCreateShaderProgramv gl3wProcs.gl.CreateShaderProgramv -#define glCreateTextures gl3wProcs.gl.CreateTextures -#define glCreateTransformFeedbacks gl3wProcs.gl.CreateTransformFeedbacks -#define glCreateVertexArrays gl3wProcs.gl.CreateVertexArrays -#define glCullFace gl3wProcs.gl.CullFace -#define glDebugMessageCallback gl3wProcs.gl.DebugMessageCallback -#define glDebugMessageControl gl3wProcs.gl.DebugMessageControl -#define glDebugMessageInsert gl3wProcs.gl.DebugMessageInsert -#define glDeleteBuffers gl3wProcs.gl.DeleteBuffers -#define glDeleteFramebuffers gl3wProcs.gl.DeleteFramebuffers -#define glDeleteProgram gl3wProcs.gl.DeleteProgram -#define glDeleteProgramPipelines gl3wProcs.gl.DeleteProgramPipelines -#define glDeleteQueries gl3wProcs.gl.DeleteQueries -#define glDeleteRenderbuffers gl3wProcs.gl.DeleteRenderbuffers -#define glDeleteSamplers gl3wProcs.gl.DeleteSamplers -#define glDeleteShader gl3wProcs.gl.DeleteShader -#define glDeleteSync gl3wProcs.gl.DeleteSync -#define glDeleteTextures gl3wProcs.gl.DeleteTextures -#define glDeleteTransformFeedbacks gl3wProcs.gl.DeleteTransformFeedbacks -#define glDeleteVertexArrays gl3wProcs.gl.DeleteVertexArrays -#define glDepthFunc gl3wProcs.gl.DepthFunc -#define glDepthMask gl3wProcs.gl.DepthMask -#define glDepthRange gl3wProcs.gl.DepthRange -#define glDepthRangeArrayv gl3wProcs.gl.DepthRangeArrayv -#define glDepthRangeIndexed gl3wProcs.gl.DepthRangeIndexed -#define glDepthRangef gl3wProcs.gl.DepthRangef -#define glDetachShader gl3wProcs.gl.DetachShader -#define glDisable gl3wProcs.gl.Disable -#define glDisableVertexArrayAttrib gl3wProcs.gl.DisableVertexArrayAttrib -#define glDisableVertexAttribArray gl3wProcs.gl.DisableVertexAttribArray -#define glDisablei gl3wProcs.gl.Disablei -#define glDispatchCompute gl3wProcs.gl.DispatchCompute -#define glDispatchComputeIndirect gl3wProcs.gl.DispatchComputeIndirect -#define glDrawArrays gl3wProcs.gl.DrawArrays -#define glDrawArraysIndirect gl3wProcs.gl.DrawArraysIndirect -#define glDrawArraysInstanced gl3wProcs.gl.DrawArraysInstanced -#define glDrawArraysInstancedBaseInstance gl3wProcs.gl.DrawArraysInstancedBaseInstance -#define glDrawBuffer gl3wProcs.gl.DrawBuffer -#define glDrawBuffers gl3wProcs.gl.DrawBuffers -#define glDrawElements gl3wProcs.gl.DrawElements -#define glDrawElementsBaseVertex gl3wProcs.gl.DrawElementsBaseVertex -#define glDrawElementsIndirect gl3wProcs.gl.DrawElementsIndirect -#define glDrawElementsInstanced gl3wProcs.gl.DrawElementsInstanced -#define glDrawElementsInstancedBaseInstance gl3wProcs.gl.DrawElementsInstancedBaseInstance -#define glDrawElementsInstancedBaseVertex gl3wProcs.gl.DrawElementsInstancedBaseVertex -#define glDrawElementsInstancedBaseVertexBaseInstance gl3wProcs.gl.DrawElementsInstancedBaseVertexBaseInstance -#define glDrawRangeElements gl3wProcs.gl.DrawRangeElements -#define glDrawRangeElementsBaseVertex gl3wProcs.gl.DrawRangeElementsBaseVertex -#define glDrawTransformFeedback gl3wProcs.gl.DrawTransformFeedback -#define glDrawTransformFeedbackInstanced gl3wProcs.gl.DrawTransformFeedbackInstanced -#define glDrawTransformFeedbackStream gl3wProcs.gl.DrawTransformFeedbackStream -#define glDrawTransformFeedbackStreamInstanced gl3wProcs.gl.DrawTransformFeedbackStreamInstanced -#define glEnable gl3wProcs.gl.Enable -#define glEnableVertexArrayAttrib gl3wProcs.gl.EnableVertexArrayAttrib -#define glEnableVertexAttribArray gl3wProcs.gl.EnableVertexAttribArray -#define glEnablei gl3wProcs.gl.Enablei -#define glEndConditionalRender gl3wProcs.gl.EndConditionalRender -#define glEndQuery gl3wProcs.gl.EndQuery -#define glEndQueryIndexed gl3wProcs.gl.EndQueryIndexed -#define glEndTransformFeedback gl3wProcs.gl.EndTransformFeedback -#define glFenceSync gl3wProcs.gl.FenceSync -#define glFinish gl3wProcs.gl.Finish -#define glFlush gl3wProcs.gl.Flush -#define glFlushMappedBufferRange gl3wProcs.gl.FlushMappedBufferRange -#define glFlushMappedNamedBufferRange gl3wProcs.gl.FlushMappedNamedBufferRange -#define glFramebufferParameteri gl3wProcs.gl.FramebufferParameteri -#define glFramebufferRenderbuffer gl3wProcs.gl.FramebufferRenderbuffer -#define glFramebufferTexture gl3wProcs.gl.FramebufferTexture -#define glFramebufferTexture1D gl3wProcs.gl.FramebufferTexture1D -#define glFramebufferTexture2D gl3wProcs.gl.FramebufferTexture2D -#define glFramebufferTexture3D gl3wProcs.gl.FramebufferTexture3D -#define glFramebufferTextureLayer gl3wProcs.gl.FramebufferTextureLayer -#define glFrontFace gl3wProcs.gl.FrontFace -#define glGenBuffers gl3wProcs.gl.GenBuffers -#define glGenFramebuffers gl3wProcs.gl.GenFramebuffers -#define glGenProgramPipelines gl3wProcs.gl.GenProgramPipelines -#define glGenQueries gl3wProcs.gl.GenQueries -#define glGenRenderbuffers gl3wProcs.gl.GenRenderbuffers -#define glGenSamplers gl3wProcs.gl.GenSamplers -#define glGenTextures gl3wProcs.gl.GenTextures -#define glGenTransformFeedbacks gl3wProcs.gl.GenTransformFeedbacks -#define glGenVertexArrays gl3wProcs.gl.GenVertexArrays -#define glGenerateMipmap gl3wProcs.gl.GenerateMipmap -#define glGenerateTextureMipmap gl3wProcs.gl.GenerateTextureMipmap -#define glGetActiveAtomicCounterBufferiv gl3wProcs.gl.GetActiveAtomicCounterBufferiv -#define glGetActiveAttrib gl3wProcs.gl.GetActiveAttrib -#define glGetActiveSubroutineName gl3wProcs.gl.GetActiveSubroutineName -#define glGetActiveSubroutineUniformName gl3wProcs.gl.GetActiveSubroutineUniformName -#define glGetActiveSubroutineUniformiv gl3wProcs.gl.GetActiveSubroutineUniformiv -#define glGetActiveUniform gl3wProcs.gl.GetActiveUniform -#define glGetActiveUniformBlockName gl3wProcs.gl.GetActiveUniformBlockName -#define glGetActiveUniformBlockiv gl3wProcs.gl.GetActiveUniformBlockiv -#define glGetActiveUniformName gl3wProcs.gl.GetActiveUniformName -#define glGetActiveUniformsiv gl3wProcs.gl.GetActiveUniformsiv -#define glGetAttachedShaders gl3wProcs.gl.GetAttachedShaders -#define glGetAttribLocation gl3wProcs.gl.GetAttribLocation -#define glGetBooleani_v gl3wProcs.gl.GetBooleani_v -#define glGetBooleanv gl3wProcs.gl.GetBooleanv -#define glGetBufferParameteri64v gl3wProcs.gl.GetBufferParameteri64v -#define glGetBufferParameteriv gl3wProcs.gl.GetBufferParameteriv -#define glGetBufferPointerv gl3wProcs.gl.GetBufferPointerv -#define glGetBufferSubData gl3wProcs.gl.GetBufferSubData -#define glGetCompressedTexImage gl3wProcs.gl.GetCompressedTexImage -#define glGetCompressedTextureImage gl3wProcs.gl.GetCompressedTextureImage -#define glGetCompressedTextureSubImage gl3wProcs.gl.GetCompressedTextureSubImage -#define glGetDebugMessageLog gl3wProcs.gl.GetDebugMessageLog -#define glGetDoublei_v gl3wProcs.gl.GetDoublei_v -#define glGetDoublev gl3wProcs.gl.GetDoublev -#define glGetError gl3wProcs.gl.GetError -#define glGetFloati_v gl3wProcs.gl.GetFloati_v -#define glGetFloatv gl3wProcs.gl.GetFloatv -#define glGetFragDataIndex gl3wProcs.gl.GetFragDataIndex -#define glGetFragDataLocation gl3wProcs.gl.GetFragDataLocation -#define glGetFramebufferAttachmentParameteriv gl3wProcs.gl.GetFramebufferAttachmentParameteriv -#define glGetFramebufferParameteriv gl3wProcs.gl.GetFramebufferParameteriv -#define glGetGraphicsResetStatus gl3wProcs.gl.GetGraphicsResetStatus -#define glGetInteger64i_v gl3wProcs.gl.GetInteger64i_v -#define glGetInteger64v gl3wProcs.gl.GetInteger64v -#define glGetIntegeri_v gl3wProcs.gl.GetIntegeri_v -#define glGetIntegerv gl3wProcs.gl.GetIntegerv -#define glGetInternalformati64v gl3wProcs.gl.GetInternalformati64v -#define glGetInternalformativ gl3wProcs.gl.GetInternalformativ -#define glGetMultisamplefv gl3wProcs.gl.GetMultisamplefv -#define glGetNamedBufferParameteri64v gl3wProcs.gl.GetNamedBufferParameteri64v -#define glGetNamedBufferParameteriv gl3wProcs.gl.GetNamedBufferParameteriv -#define glGetNamedBufferPointerv gl3wProcs.gl.GetNamedBufferPointerv -#define glGetNamedBufferSubData gl3wProcs.gl.GetNamedBufferSubData -#define glGetNamedFramebufferAttachmentParameteriv gl3wProcs.gl.GetNamedFramebufferAttachmentParameteriv -#define glGetNamedFramebufferParameteriv gl3wProcs.gl.GetNamedFramebufferParameteriv -#define glGetNamedRenderbufferParameteriv gl3wProcs.gl.GetNamedRenderbufferParameteriv -#define glGetObjectLabel gl3wProcs.gl.GetObjectLabel -#define glGetObjectPtrLabel gl3wProcs.gl.GetObjectPtrLabel -#define glGetPointerv gl3wProcs.gl.GetPointerv -#define glGetProgramBinary gl3wProcs.gl.GetProgramBinary -#define glGetProgramInfoLog gl3wProcs.gl.GetProgramInfoLog -#define glGetProgramInterfaceiv gl3wProcs.gl.GetProgramInterfaceiv -#define glGetProgramPipelineInfoLog gl3wProcs.gl.GetProgramPipelineInfoLog -#define glGetProgramPipelineiv gl3wProcs.gl.GetProgramPipelineiv -#define glGetProgramResourceIndex gl3wProcs.gl.GetProgramResourceIndex -#define glGetProgramResourceLocation gl3wProcs.gl.GetProgramResourceLocation -#define glGetProgramResourceLocationIndex gl3wProcs.gl.GetProgramResourceLocationIndex -#define glGetProgramResourceName gl3wProcs.gl.GetProgramResourceName -#define glGetProgramResourceiv gl3wProcs.gl.GetProgramResourceiv -#define glGetProgramStageiv gl3wProcs.gl.GetProgramStageiv -#define glGetProgramiv gl3wProcs.gl.GetProgramiv -#define glGetQueryBufferObjecti64v gl3wProcs.gl.GetQueryBufferObjecti64v -#define glGetQueryBufferObjectiv gl3wProcs.gl.GetQueryBufferObjectiv -#define glGetQueryBufferObjectui64v gl3wProcs.gl.GetQueryBufferObjectui64v -#define glGetQueryBufferObjectuiv gl3wProcs.gl.GetQueryBufferObjectuiv -#define glGetQueryIndexediv gl3wProcs.gl.GetQueryIndexediv -#define glGetQueryObjecti64v gl3wProcs.gl.GetQueryObjecti64v -#define glGetQueryObjectiv gl3wProcs.gl.GetQueryObjectiv -#define glGetQueryObjectui64v gl3wProcs.gl.GetQueryObjectui64v -#define glGetQueryObjectuiv gl3wProcs.gl.GetQueryObjectuiv -#define glGetQueryiv gl3wProcs.gl.GetQueryiv -#define glGetRenderbufferParameteriv gl3wProcs.gl.GetRenderbufferParameteriv -#define glGetSamplerParameterIiv gl3wProcs.gl.GetSamplerParameterIiv -#define glGetSamplerParameterIuiv gl3wProcs.gl.GetSamplerParameterIuiv -#define glGetSamplerParameterfv gl3wProcs.gl.GetSamplerParameterfv -#define glGetSamplerParameteriv gl3wProcs.gl.GetSamplerParameteriv -#define glGetShaderInfoLog gl3wProcs.gl.GetShaderInfoLog -#define glGetShaderPrecisionFormat gl3wProcs.gl.GetShaderPrecisionFormat -#define glGetShaderSource gl3wProcs.gl.GetShaderSource -#define glGetShaderiv gl3wProcs.gl.GetShaderiv -#define glGetString gl3wProcs.gl.GetString -#define glGetStringi gl3wProcs.gl.GetStringi -#define glGetSubroutineIndex gl3wProcs.gl.GetSubroutineIndex -#define glGetSubroutineUniformLocation gl3wProcs.gl.GetSubroutineUniformLocation -#define glGetSynciv gl3wProcs.gl.GetSynciv -#define glGetTexImage gl3wProcs.gl.GetTexImage -#define glGetTexLevelParameterfv gl3wProcs.gl.GetTexLevelParameterfv -#define glGetTexLevelParameteriv gl3wProcs.gl.GetTexLevelParameteriv -#define glGetTexParameterIiv gl3wProcs.gl.GetTexParameterIiv -#define glGetTexParameterIuiv gl3wProcs.gl.GetTexParameterIuiv -#define glGetTexParameterfv gl3wProcs.gl.GetTexParameterfv -#define glGetTexParameteriv gl3wProcs.gl.GetTexParameteriv -#define glGetTextureImage gl3wProcs.gl.GetTextureImage -#define glGetTextureLevelParameterfv gl3wProcs.gl.GetTextureLevelParameterfv -#define glGetTextureLevelParameteriv gl3wProcs.gl.GetTextureLevelParameteriv -#define glGetTextureParameterIiv gl3wProcs.gl.GetTextureParameterIiv -#define glGetTextureParameterIuiv gl3wProcs.gl.GetTextureParameterIuiv -#define glGetTextureParameterfv gl3wProcs.gl.GetTextureParameterfv -#define glGetTextureParameteriv gl3wProcs.gl.GetTextureParameteriv -#define glGetTextureSubImage gl3wProcs.gl.GetTextureSubImage -#define glGetTransformFeedbackVarying gl3wProcs.gl.GetTransformFeedbackVarying -#define glGetTransformFeedbacki64_v gl3wProcs.gl.GetTransformFeedbacki64_v -#define glGetTransformFeedbacki_v gl3wProcs.gl.GetTransformFeedbacki_v -#define glGetTransformFeedbackiv gl3wProcs.gl.GetTransformFeedbackiv -#define glGetUniformBlockIndex gl3wProcs.gl.GetUniformBlockIndex -#define glGetUniformIndices gl3wProcs.gl.GetUniformIndices -#define glGetUniformLocation gl3wProcs.gl.GetUniformLocation -#define glGetUniformSubroutineuiv gl3wProcs.gl.GetUniformSubroutineuiv -#define glGetUniformdv gl3wProcs.gl.GetUniformdv -#define glGetUniformfv gl3wProcs.gl.GetUniformfv -#define glGetUniformiv gl3wProcs.gl.GetUniformiv -#define glGetUniformuiv gl3wProcs.gl.GetUniformuiv -#define glGetVertexArrayIndexed64iv gl3wProcs.gl.GetVertexArrayIndexed64iv -#define glGetVertexArrayIndexediv gl3wProcs.gl.GetVertexArrayIndexediv -#define glGetVertexArrayiv gl3wProcs.gl.GetVertexArrayiv -#define glGetVertexAttribIiv gl3wProcs.gl.GetVertexAttribIiv -#define glGetVertexAttribIuiv gl3wProcs.gl.GetVertexAttribIuiv -#define glGetVertexAttribLdv gl3wProcs.gl.GetVertexAttribLdv -#define glGetVertexAttribPointerv gl3wProcs.gl.GetVertexAttribPointerv -#define glGetVertexAttribdv gl3wProcs.gl.GetVertexAttribdv -#define glGetVertexAttribfv gl3wProcs.gl.GetVertexAttribfv -#define glGetVertexAttribiv gl3wProcs.gl.GetVertexAttribiv -#define glGetnCompressedTexImage gl3wProcs.gl.GetnCompressedTexImage -#define glGetnTexImage gl3wProcs.gl.GetnTexImage -#define glGetnUniformdv gl3wProcs.gl.GetnUniformdv -#define glGetnUniformfv gl3wProcs.gl.GetnUniformfv -#define glGetnUniformiv gl3wProcs.gl.GetnUniformiv -#define glGetnUniformuiv gl3wProcs.gl.GetnUniformuiv -#define glHint gl3wProcs.gl.Hint -#define glInvalidateBufferData gl3wProcs.gl.InvalidateBufferData -#define glInvalidateBufferSubData gl3wProcs.gl.InvalidateBufferSubData -#define glInvalidateFramebuffer gl3wProcs.gl.InvalidateFramebuffer -#define glInvalidateNamedFramebufferData gl3wProcs.gl.InvalidateNamedFramebufferData -#define glInvalidateNamedFramebufferSubData gl3wProcs.gl.InvalidateNamedFramebufferSubData -#define glInvalidateSubFramebuffer gl3wProcs.gl.InvalidateSubFramebuffer -#define glInvalidateTexImage gl3wProcs.gl.InvalidateTexImage -#define glInvalidateTexSubImage gl3wProcs.gl.InvalidateTexSubImage -#define glIsBuffer gl3wProcs.gl.IsBuffer -#define glIsEnabled gl3wProcs.gl.IsEnabled -#define glIsEnabledi gl3wProcs.gl.IsEnabledi -#define glIsFramebuffer gl3wProcs.gl.IsFramebuffer -#define glIsProgram gl3wProcs.gl.IsProgram -#define glIsProgramPipeline gl3wProcs.gl.IsProgramPipeline -#define glIsQuery gl3wProcs.gl.IsQuery -#define glIsRenderbuffer gl3wProcs.gl.IsRenderbuffer -#define glIsSampler gl3wProcs.gl.IsSampler -#define glIsShader gl3wProcs.gl.IsShader -#define glIsSync gl3wProcs.gl.IsSync -#define glIsTexture gl3wProcs.gl.IsTexture -#define glIsTransformFeedback gl3wProcs.gl.IsTransformFeedback -#define glIsVertexArray gl3wProcs.gl.IsVertexArray -#define glLineWidth gl3wProcs.gl.LineWidth -#define glLinkProgram gl3wProcs.gl.LinkProgram -#define glLogicOp gl3wProcs.gl.LogicOp -#define glMapBuffer gl3wProcs.gl.MapBuffer -#define glMapBufferRange gl3wProcs.gl.MapBufferRange -#define glMapNamedBuffer gl3wProcs.gl.MapNamedBuffer -#define glMapNamedBufferRange gl3wProcs.gl.MapNamedBufferRange -#define glMemoryBarrier gl3wProcs.gl.MemoryBarrier -#define glMemoryBarrierByRegion gl3wProcs.gl.MemoryBarrierByRegion -#define glMinSampleShading gl3wProcs.gl.MinSampleShading -#define glMultiDrawArrays gl3wProcs.gl.MultiDrawArrays -#define glMultiDrawArraysIndirect gl3wProcs.gl.MultiDrawArraysIndirect -#define glMultiDrawArraysIndirectCount gl3wProcs.gl.MultiDrawArraysIndirectCount -#define glMultiDrawElements gl3wProcs.gl.MultiDrawElements -#define glMultiDrawElementsBaseVertex gl3wProcs.gl.MultiDrawElementsBaseVertex -#define glMultiDrawElementsIndirect gl3wProcs.gl.MultiDrawElementsIndirect -#define glMultiDrawElementsIndirectCount gl3wProcs.gl.MultiDrawElementsIndirectCount -#define glNamedBufferData gl3wProcs.gl.NamedBufferData -#define glNamedBufferStorage gl3wProcs.gl.NamedBufferStorage -#define glNamedBufferSubData gl3wProcs.gl.NamedBufferSubData -#define glNamedFramebufferDrawBuffer gl3wProcs.gl.NamedFramebufferDrawBuffer -#define glNamedFramebufferDrawBuffers gl3wProcs.gl.NamedFramebufferDrawBuffers -#define glNamedFramebufferParameteri gl3wProcs.gl.NamedFramebufferParameteri -#define glNamedFramebufferReadBuffer gl3wProcs.gl.NamedFramebufferReadBuffer -#define glNamedFramebufferRenderbuffer gl3wProcs.gl.NamedFramebufferRenderbuffer -#define glNamedFramebufferTexture gl3wProcs.gl.NamedFramebufferTexture -#define glNamedFramebufferTextureLayer gl3wProcs.gl.NamedFramebufferTextureLayer -#define glNamedRenderbufferStorage gl3wProcs.gl.NamedRenderbufferStorage -#define glNamedRenderbufferStorageMultisample gl3wProcs.gl.NamedRenderbufferStorageMultisample -#define glObjectLabel gl3wProcs.gl.ObjectLabel -#define glObjectPtrLabel gl3wProcs.gl.ObjectPtrLabel -#define glPatchParameterfv gl3wProcs.gl.PatchParameterfv -#define glPatchParameteri gl3wProcs.gl.PatchParameteri -#define glPauseTransformFeedback gl3wProcs.gl.PauseTransformFeedback -#define glPixelStoref gl3wProcs.gl.PixelStoref -#define glPixelStorei gl3wProcs.gl.PixelStorei -#define glPointParameterf gl3wProcs.gl.PointParameterf -#define glPointParameterfv gl3wProcs.gl.PointParameterfv -#define glPointParameteri gl3wProcs.gl.PointParameteri -#define glPointParameteriv gl3wProcs.gl.PointParameteriv -#define glPointSize gl3wProcs.gl.PointSize -#define glPolygonMode gl3wProcs.gl.PolygonMode -#define glPolygonOffset gl3wProcs.gl.PolygonOffset -#define glPolygonOffsetClamp gl3wProcs.gl.PolygonOffsetClamp -#define glPopDebugGroup gl3wProcs.gl.PopDebugGroup -#define glPrimitiveRestartIndex gl3wProcs.gl.PrimitiveRestartIndex -#define glProgramBinary gl3wProcs.gl.ProgramBinary -#define glProgramParameteri gl3wProcs.gl.ProgramParameteri -#define glProgramUniform1d gl3wProcs.gl.ProgramUniform1d -#define glProgramUniform1dv gl3wProcs.gl.ProgramUniform1dv -#define glProgramUniform1f gl3wProcs.gl.ProgramUniform1f -#define glProgramUniform1fv gl3wProcs.gl.ProgramUniform1fv -#define glProgramUniform1i gl3wProcs.gl.ProgramUniform1i -#define glProgramUniform1iv gl3wProcs.gl.ProgramUniform1iv -#define glProgramUniform1ui gl3wProcs.gl.ProgramUniform1ui -#define glProgramUniform1uiv gl3wProcs.gl.ProgramUniform1uiv -#define glProgramUniform2d gl3wProcs.gl.ProgramUniform2d -#define glProgramUniform2dv gl3wProcs.gl.ProgramUniform2dv -#define glProgramUniform2f gl3wProcs.gl.ProgramUniform2f -#define glProgramUniform2fv gl3wProcs.gl.ProgramUniform2fv -#define glProgramUniform2i gl3wProcs.gl.ProgramUniform2i -#define glProgramUniform2iv gl3wProcs.gl.ProgramUniform2iv -#define glProgramUniform2ui gl3wProcs.gl.ProgramUniform2ui -#define glProgramUniform2uiv gl3wProcs.gl.ProgramUniform2uiv -#define glProgramUniform3d gl3wProcs.gl.ProgramUniform3d -#define glProgramUniform3dv gl3wProcs.gl.ProgramUniform3dv -#define glProgramUniform3f gl3wProcs.gl.ProgramUniform3f -#define glProgramUniform3fv gl3wProcs.gl.ProgramUniform3fv -#define glProgramUniform3i gl3wProcs.gl.ProgramUniform3i -#define glProgramUniform3iv gl3wProcs.gl.ProgramUniform3iv -#define glProgramUniform3ui gl3wProcs.gl.ProgramUniform3ui -#define glProgramUniform3uiv gl3wProcs.gl.ProgramUniform3uiv -#define glProgramUniform4d gl3wProcs.gl.ProgramUniform4d -#define glProgramUniform4dv gl3wProcs.gl.ProgramUniform4dv -#define glProgramUniform4f gl3wProcs.gl.ProgramUniform4f -#define glProgramUniform4fv gl3wProcs.gl.ProgramUniform4fv -#define glProgramUniform4i gl3wProcs.gl.ProgramUniform4i -#define glProgramUniform4iv gl3wProcs.gl.ProgramUniform4iv -#define glProgramUniform4ui gl3wProcs.gl.ProgramUniform4ui -#define glProgramUniform4uiv gl3wProcs.gl.ProgramUniform4uiv -#define glProgramUniformMatrix2dv gl3wProcs.gl.ProgramUniformMatrix2dv -#define glProgramUniformMatrix2fv gl3wProcs.gl.ProgramUniformMatrix2fv -#define glProgramUniformMatrix2x3dv gl3wProcs.gl.ProgramUniformMatrix2x3dv -#define glProgramUniformMatrix2x3fv gl3wProcs.gl.ProgramUniformMatrix2x3fv -#define glProgramUniformMatrix2x4dv gl3wProcs.gl.ProgramUniformMatrix2x4dv -#define glProgramUniformMatrix2x4fv gl3wProcs.gl.ProgramUniformMatrix2x4fv -#define glProgramUniformMatrix3dv gl3wProcs.gl.ProgramUniformMatrix3dv -#define glProgramUniformMatrix3fv gl3wProcs.gl.ProgramUniformMatrix3fv -#define glProgramUniformMatrix3x2dv gl3wProcs.gl.ProgramUniformMatrix3x2dv -#define glProgramUniformMatrix3x2fv gl3wProcs.gl.ProgramUniformMatrix3x2fv -#define glProgramUniformMatrix3x4dv gl3wProcs.gl.ProgramUniformMatrix3x4dv -#define glProgramUniformMatrix3x4fv gl3wProcs.gl.ProgramUniformMatrix3x4fv -#define glProgramUniformMatrix4dv gl3wProcs.gl.ProgramUniformMatrix4dv -#define glProgramUniformMatrix4fv gl3wProcs.gl.ProgramUniformMatrix4fv -#define glProgramUniformMatrix4x2dv gl3wProcs.gl.ProgramUniformMatrix4x2dv -#define glProgramUniformMatrix4x2fv gl3wProcs.gl.ProgramUniformMatrix4x2fv -#define glProgramUniformMatrix4x3dv gl3wProcs.gl.ProgramUniformMatrix4x3dv -#define glProgramUniformMatrix4x3fv gl3wProcs.gl.ProgramUniformMatrix4x3fv -#define glProvokingVertex gl3wProcs.gl.ProvokingVertex -#define glPushDebugGroup gl3wProcs.gl.PushDebugGroup -#define glQueryCounter gl3wProcs.gl.QueryCounter -#define glReadBuffer gl3wProcs.gl.ReadBuffer -#define glReadPixels gl3wProcs.gl.ReadPixels -#define glReadnPixels gl3wProcs.gl.ReadnPixels -#define glReleaseShaderCompiler gl3wProcs.gl.ReleaseShaderCompiler -#define glRenderbufferStorage gl3wProcs.gl.RenderbufferStorage -#define glRenderbufferStorageMultisample gl3wProcs.gl.RenderbufferStorageMultisample -#define glResumeTransformFeedback gl3wProcs.gl.ResumeTransformFeedback -#define glSampleCoverage gl3wProcs.gl.SampleCoverage -#define glSampleMaski gl3wProcs.gl.SampleMaski -#define glSamplerParameterIiv gl3wProcs.gl.SamplerParameterIiv -#define glSamplerParameterIuiv gl3wProcs.gl.SamplerParameterIuiv -#define glSamplerParameterf gl3wProcs.gl.SamplerParameterf -#define glSamplerParameterfv gl3wProcs.gl.SamplerParameterfv -#define glSamplerParameteri gl3wProcs.gl.SamplerParameteri -#define glSamplerParameteriv gl3wProcs.gl.SamplerParameteriv -#define glScissor gl3wProcs.gl.Scissor -#define glScissorArrayv gl3wProcs.gl.ScissorArrayv -#define glScissorIndexed gl3wProcs.gl.ScissorIndexed -#define glScissorIndexedv gl3wProcs.gl.ScissorIndexedv -#define glShaderBinary gl3wProcs.gl.ShaderBinary -#define glShaderSource gl3wProcs.gl.ShaderSource -#define glShaderStorageBlockBinding gl3wProcs.gl.ShaderStorageBlockBinding -#define glSpecializeShader gl3wProcs.gl.SpecializeShader -#define glStencilFunc gl3wProcs.gl.StencilFunc -#define glStencilFuncSeparate gl3wProcs.gl.StencilFuncSeparate -#define glStencilMask gl3wProcs.gl.StencilMask -#define glStencilMaskSeparate gl3wProcs.gl.StencilMaskSeparate -#define glStencilOp gl3wProcs.gl.StencilOp -#define glStencilOpSeparate gl3wProcs.gl.StencilOpSeparate -#define glTexBuffer gl3wProcs.gl.TexBuffer -#define glTexBufferRange gl3wProcs.gl.TexBufferRange -#define glTexImage1D gl3wProcs.gl.TexImage1D -#define glTexImage2D gl3wProcs.gl.TexImage2D -#define glTexImage2DMultisample gl3wProcs.gl.TexImage2DMultisample -#define glTexImage3D gl3wProcs.gl.TexImage3D -#define glTexImage3DMultisample gl3wProcs.gl.TexImage3DMultisample -#define glTexParameterIiv gl3wProcs.gl.TexParameterIiv -#define glTexParameterIuiv gl3wProcs.gl.TexParameterIuiv -#define glTexParameterf gl3wProcs.gl.TexParameterf -#define glTexParameterfv gl3wProcs.gl.TexParameterfv -#define glTexParameteri gl3wProcs.gl.TexParameteri -#define glTexParameteriv gl3wProcs.gl.TexParameteriv -#define glTexStorage1D gl3wProcs.gl.TexStorage1D -#define glTexStorage2D gl3wProcs.gl.TexStorage2D -#define glTexStorage2DMultisample gl3wProcs.gl.TexStorage2DMultisample -#define glTexStorage3D gl3wProcs.gl.TexStorage3D -#define glTexStorage3DMultisample gl3wProcs.gl.TexStorage3DMultisample -#define glTexSubImage1D gl3wProcs.gl.TexSubImage1D -#define glTexSubImage2D gl3wProcs.gl.TexSubImage2D -#define glTexSubImage3D gl3wProcs.gl.TexSubImage3D -#define glTextureBarrier gl3wProcs.gl.TextureBarrier -#define glTextureBuffer gl3wProcs.gl.TextureBuffer -#define glTextureBufferRange gl3wProcs.gl.TextureBufferRange -#define glTextureParameterIiv gl3wProcs.gl.TextureParameterIiv -#define glTextureParameterIuiv gl3wProcs.gl.TextureParameterIuiv -#define glTextureParameterf gl3wProcs.gl.TextureParameterf -#define glTextureParameterfv gl3wProcs.gl.TextureParameterfv -#define glTextureParameteri gl3wProcs.gl.TextureParameteri -#define glTextureParameteriv gl3wProcs.gl.TextureParameteriv -#define glTextureStorage1D gl3wProcs.gl.TextureStorage1D -#define glTextureStorage2D gl3wProcs.gl.TextureStorage2D -#define glTextureStorage2DMultisample gl3wProcs.gl.TextureStorage2DMultisample -#define glTextureStorage3D gl3wProcs.gl.TextureStorage3D -#define glTextureStorage3DMultisample gl3wProcs.gl.TextureStorage3DMultisample -#define glTextureSubImage1D gl3wProcs.gl.TextureSubImage1D -#define glTextureSubImage2D gl3wProcs.gl.TextureSubImage2D -#define glTextureSubImage3D gl3wProcs.gl.TextureSubImage3D -#define glTextureView gl3wProcs.gl.TextureView -#define glTransformFeedbackBufferBase gl3wProcs.gl.TransformFeedbackBufferBase -#define glTransformFeedbackBufferRange gl3wProcs.gl.TransformFeedbackBufferRange -#define glTransformFeedbackVaryings gl3wProcs.gl.TransformFeedbackVaryings -#define glUniform1d gl3wProcs.gl.Uniform1d -#define glUniform1dv gl3wProcs.gl.Uniform1dv -#define glUniform1f gl3wProcs.gl.Uniform1f -#define glUniform1fv gl3wProcs.gl.Uniform1fv -#define glUniform1i gl3wProcs.gl.Uniform1i -#define glUniform1iv gl3wProcs.gl.Uniform1iv -#define glUniform1ui gl3wProcs.gl.Uniform1ui -#define glUniform1uiv gl3wProcs.gl.Uniform1uiv -#define glUniform2d gl3wProcs.gl.Uniform2d -#define glUniform2dv gl3wProcs.gl.Uniform2dv -#define glUniform2f gl3wProcs.gl.Uniform2f -#define glUniform2fv gl3wProcs.gl.Uniform2fv -#define glUniform2i gl3wProcs.gl.Uniform2i -#define glUniform2iv gl3wProcs.gl.Uniform2iv -#define glUniform2ui gl3wProcs.gl.Uniform2ui -#define glUniform2uiv gl3wProcs.gl.Uniform2uiv -#define glUniform3d gl3wProcs.gl.Uniform3d -#define glUniform3dv gl3wProcs.gl.Uniform3dv -#define glUniform3f gl3wProcs.gl.Uniform3f -#define glUniform3fv gl3wProcs.gl.Uniform3fv -#define glUniform3i gl3wProcs.gl.Uniform3i -#define glUniform3iv gl3wProcs.gl.Uniform3iv -#define glUniform3ui gl3wProcs.gl.Uniform3ui -#define glUniform3uiv gl3wProcs.gl.Uniform3uiv -#define glUniform4d gl3wProcs.gl.Uniform4d -#define glUniform4dv gl3wProcs.gl.Uniform4dv -#define glUniform4f gl3wProcs.gl.Uniform4f -#define glUniform4fv gl3wProcs.gl.Uniform4fv -#define glUniform4i gl3wProcs.gl.Uniform4i -#define glUniform4iv gl3wProcs.gl.Uniform4iv -#define glUniform4ui gl3wProcs.gl.Uniform4ui -#define glUniform4uiv gl3wProcs.gl.Uniform4uiv -#define glUniformBlockBinding gl3wProcs.gl.UniformBlockBinding -#define glUniformMatrix2dv gl3wProcs.gl.UniformMatrix2dv -#define glUniformMatrix2fv gl3wProcs.gl.UniformMatrix2fv -#define glUniformMatrix2x3dv gl3wProcs.gl.UniformMatrix2x3dv -#define glUniformMatrix2x3fv gl3wProcs.gl.UniformMatrix2x3fv -#define glUniformMatrix2x4dv gl3wProcs.gl.UniformMatrix2x4dv -#define glUniformMatrix2x4fv gl3wProcs.gl.UniformMatrix2x4fv -#define glUniformMatrix3dv gl3wProcs.gl.UniformMatrix3dv -#define glUniformMatrix3fv gl3wProcs.gl.UniformMatrix3fv -#define glUniformMatrix3x2dv gl3wProcs.gl.UniformMatrix3x2dv -#define glUniformMatrix3x2fv gl3wProcs.gl.UniformMatrix3x2fv -#define glUniformMatrix3x4dv gl3wProcs.gl.UniformMatrix3x4dv -#define glUniformMatrix3x4fv gl3wProcs.gl.UniformMatrix3x4fv -#define glUniformMatrix4dv gl3wProcs.gl.UniformMatrix4dv -#define glUniformMatrix4fv gl3wProcs.gl.UniformMatrix4fv -#define glUniformMatrix4x2dv gl3wProcs.gl.UniformMatrix4x2dv -#define glUniformMatrix4x2fv gl3wProcs.gl.UniformMatrix4x2fv -#define glUniformMatrix4x3dv gl3wProcs.gl.UniformMatrix4x3dv -#define glUniformMatrix4x3fv gl3wProcs.gl.UniformMatrix4x3fv -#define glUniformSubroutinesuiv gl3wProcs.gl.UniformSubroutinesuiv -#define glUnmapBuffer gl3wProcs.gl.UnmapBuffer -#define glUnmapNamedBuffer gl3wProcs.gl.UnmapNamedBuffer -#define glUseProgram gl3wProcs.gl.UseProgram -#define glUseProgramStages gl3wProcs.gl.UseProgramStages -#define glValidateProgram gl3wProcs.gl.ValidateProgram -#define glValidateProgramPipeline gl3wProcs.gl.ValidateProgramPipeline -#define glVertexArrayAttribBinding gl3wProcs.gl.VertexArrayAttribBinding -#define glVertexArrayAttribFormat gl3wProcs.gl.VertexArrayAttribFormat -#define glVertexArrayAttribIFormat gl3wProcs.gl.VertexArrayAttribIFormat -#define glVertexArrayAttribLFormat gl3wProcs.gl.VertexArrayAttribLFormat -#define glVertexArrayBindingDivisor gl3wProcs.gl.VertexArrayBindingDivisor -#define glVertexArrayElementBuffer gl3wProcs.gl.VertexArrayElementBuffer -#define glVertexArrayVertexBuffer gl3wProcs.gl.VertexArrayVertexBuffer -#define glVertexArrayVertexBuffers gl3wProcs.gl.VertexArrayVertexBuffers -#define glVertexAttrib1d gl3wProcs.gl.VertexAttrib1d -#define glVertexAttrib1dv gl3wProcs.gl.VertexAttrib1dv -#define glVertexAttrib1f gl3wProcs.gl.VertexAttrib1f -#define glVertexAttrib1fv gl3wProcs.gl.VertexAttrib1fv -#define glVertexAttrib1s gl3wProcs.gl.VertexAttrib1s -#define glVertexAttrib1sv gl3wProcs.gl.VertexAttrib1sv -#define glVertexAttrib2d gl3wProcs.gl.VertexAttrib2d -#define glVertexAttrib2dv gl3wProcs.gl.VertexAttrib2dv -#define glVertexAttrib2f gl3wProcs.gl.VertexAttrib2f -#define glVertexAttrib2fv gl3wProcs.gl.VertexAttrib2fv -#define glVertexAttrib2s gl3wProcs.gl.VertexAttrib2s -#define glVertexAttrib2sv gl3wProcs.gl.VertexAttrib2sv -#define glVertexAttrib3d gl3wProcs.gl.VertexAttrib3d -#define glVertexAttrib3dv gl3wProcs.gl.VertexAttrib3dv -#define glVertexAttrib3f gl3wProcs.gl.VertexAttrib3f -#define glVertexAttrib3fv gl3wProcs.gl.VertexAttrib3fv -#define glVertexAttrib3s gl3wProcs.gl.VertexAttrib3s -#define glVertexAttrib3sv gl3wProcs.gl.VertexAttrib3sv -#define glVertexAttrib4Nbv gl3wProcs.gl.VertexAttrib4Nbv -#define glVertexAttrib4Niv gl3wProcs.gl.VertexAttrib4Niv -#define glVertexAttrib4Nsv gl3wProcs.gl.VertexAttrib4Nsv -#define glVertexAttrib4Nub gl3wProcs.gl.VertexAttrib4Nub -#define glVertexAttrib4Nubv gl3wProcs.gl.VertexAttrib4Nubv -#define glVertexAttrib4Nuiv gl3wProcs.gl.VertexAttrib4Nuiv -#define glVertexAttrib4Nusv gl3wProcs.gl.VertexAttrib4Nusv -#define glVertexAttrib4bv gl3wProcs.gl.VertexAttrib4bv -#define glVertexAttrib4d gl3wProcs.gl.VertexAttrib4d -#define glVertexAttrib4dv gl3wProcs.gl.VertexAttrib4dv -#define glVertexAttrib4f gl3wProcs.gl.VertexAttrib4f -#define glVertexAttrib4fv gl3wProcs.gl.VertexAttrib4fv -#define glVertexAttrib4iv gl3wProcs.gl.VertexAttrib4iv -#define glVertexAttrib4s gl3wProcs.gl.VertexAttrib4s -#define glVertexAttrib4sv gl3wProcs.gl.VertexAttrib4sv -#define glVertexAttrib4ubv gl3wProcs.gl.VertexAttrib4ubv -#define glVertexAttrib4uiv gl3wProcs.gl.VertexAttrib4uiv -#define glVertexAttrib4usv gl3wProcs.gl.VertexAttrib4usv -#define glVertexAttribBinding gl3wProcs.gl.VertexAttribBinding -#define glVertexAttribDivisor gl3wProcs.gl.VertexAttribDivisor -#define glVertexAttribFormat gl3wProcs.gl.VertexAttribFormat -#define glVertexAttribI1i gl3wProcs.gl.VertexAttribI1i -#define glVertexAttribI1iv gl3wProcs.gl.VertexAttribI1iv -#define glVertexAttribI1ui gl3wProcs.gl.VertexAttribI1ui -#define glVertexAttribI1uiv gl3wProcs.gl.VertexAttribI1uiv -#define glVertexAttribI2i gl3wProcs.gl.VertexAttribI2i -#define glVertexAttribI2iv gl3wProcs.gl.VertexAttribI2iv -#define glVertexAttribI2ui gl3wProcs.gl.VertexAttribI2ui -#define glVertexAttribI2uiv gl3wProcs.gl.VertexAttribI2uiv -#define glVertexAttribI3i gl3wProcs.gl.VertexAttribI3i -#define glVertexAttribI3iv gl3wProcs.gl.VertexAttribI3iv -#define glVertexAttribI3ui gl3wProcs.gl.VertexAttribI3ui -#define glVertexAttribI3uiv gl3wProcs.gl.VertexAttribI3uiv -#define glVertexAttribI4bv gl3wProcs.gl.VertexAttribI4bv -#define glVertexAttribI4i gl3wProcs.gl.VertexAttribI4i -#define glVertexAttribI4iv gl3wProcs.gl.VertexAttribI4iv -#define glVertexAttribI4sv gl3wProcs.gl.VertexAttribI4sv -#define glVertexAttribI4ubv gl3wProcs.gl.VertexAttribI4ubv -#define glVertexAttribI4ui gl3wProcs.gl.VertexAttribI4ui -#define glVertexAttribI4uiv gl3wProcs.gl.VertexAttribI4uiv -#define glVertexAttribI4usv gl3wProcs.gl.VertexAttribI4usv -#define glVertexAttribIFormat gl3wProcs.gl.VertexAttribIFormat -#define glVertexAttribIPointer gl3wProcs.gl.VertexAttribIPointer -#define glVertexAttribL1d gl3wProcs.gl.VertexAttribL1d -#define glVertexAttribL1dv gl3wProcs.gl.VertexAttribL1dv -#define glVertexAttribL2d gl3wProcs.gl.VertexAttribL2d -#define glVertexAttribL2dv gl3wProcs.gl.VertexAttribL2dv -#define glVertexAttribL3d gl3wProcs.gl.VertexAttribL3d -#define glVertexAttribL3dv gl3wProcs.gl.VertexAttribL3dv -#define glVertexAttribL4d gl3wProcs.gl.VertexAttribL4d -#define glVertexAttribL4dv gl3wProcs.gl.VertexAttribL4dv -#define glVertexAttribLFormat gl3wProcs.gl.VertexAttribLFormat -#define glVertexAttribLPointer gl3wProcs.gl.VertexAttribLPointer -#define glVertexAttribP1ui gl3wProcs.gl.VertexAttribP1ui -#define glVertexAttribP1uiv gl3wProcs.gl.VertexAttribP1uiv -#define glVertexAttribP2ui gl3wProcs.gl.VertexAttribP2ui -#define glVertexAttribP2uiv gl3wProcs.gl.VertexAttribP2uiv -#define glVertexAttribP3ui gl3wProcs.gl.VertexAttribP3ui -#define glVertexAttribP3uiv gl3wProcs.gl.VertexAttribP3uiv -#define glVertexAttribP4ui gl3wProcs.gl.VertexAttribP4ui -#define glVertexAttribP4uiv gl3wProcs.gl.VertexAttribP4uiv -#define glVertexAttribPointer gl3wProcs.gl.VertexAttribPointer -#define glVertexBindingDivisor gl3wProcs.gl.VertexBindingDivisor -#define glViewport gl3wProcs.gl.Viewport -#define glViewportArrayv gl3wProcs.gl.ViewportArrayv -#define glViewportIndexedf gl3wProcs.gl.ViewportIndexedf -#define glViewportIndexedfv gl3wProcs.gl.ViewportIndexedfv -#define glWaitSync gl3wProcs.gl.WaitSync - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GL4/glcorearb.h b/core/deps/khronos/GL4/glcorearb.h deleted file mode 100644 index 3b3bade57..000000000 --- a/core/deps/khronos/GL4/glcorearb.h +++ /dev/null @@ -1,5866 +0,0 @@ -#ifndef __gl_glcorearb_h_ -#define __gl_glcorearb_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2013-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ -/* -** This header is generated from the Khronos OpenGL / OpenGL ES XML -** API Registry. The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** https://github.com/KhronosGroup/OpenGL-Registry -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -/* glcorearb.h is for use with OpenGL core profile implementations. -** It should should be placed in the same directory as gl.h and -** included as . -** -** glcorearb.h includes only APIs in the latest OpenGL core profile -** implementation together with APIs in newer ARB extensions which -** can be supported by the core profile. It does not, and never will -** include functionality removed from the core profile, such as -** fixed-function vertex and fragment processing. -** -** Do not #include both and either of or -** in the same source file. -*/ - -/* Generated C header for: - * API: gl - * Profile: core - * Versions considered: .* - * Versions emitted: .* - * Default extensions included: glcore - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_VERSION_1_0 -#define GL_VERSION_1_0 1 -typedef void GLvoid; -typedef unsigned int GLenum; -#include -typedef khronos_float_t GLfloat; -typedef int GLint; -typedef int GLsizei; -typedef unsigned int GLbitfield; -typedef double GLdouble; -typedef unsigned int GLuint; -typedef unsigned char GLboolean; -typedef khronos_uint8_t GLubyte; -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_VIEWPORT 0x0BA2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_REPEAT 0x2901 -typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); -typedef void (APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); -typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size); -typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLDRAWBUFFERPROC) (GLenum buf); -typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); -typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); -typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); -typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLFINISHPROC) (void); -typedef void (APIENTRYP PFNGLFLUSHPROC) (void); -typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); -typedef void (APIENTRYP PFNGLLOGICOPPROC) (GLenum opcode); -typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); -typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); -typedef void (APIENTRYP PFNGLPIXELSTOREFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLREADBUFFERPROC) (GLenum src); -typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); -typedef void (APIENTRYP PFNGLGETDOUBLEVPROC) (GLenum pname, GLdouble *data); -typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void); -typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); -typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); -typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); -typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); -typedef void (APIENTRYP PFNGLDEPTHRANGEPROC) (GLdouble n, GLdouble f); -typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullFace (GLenum mode); -GLAPI void APIENTRY glFrontFace (GLenum mode); -GLAPI void APIENTRY glHint (GLenum target, GLenum mode); -GLAPI void APIENTRY glLineWidth (GLfloat width); -GLAPI void APIENTRY glPointSize (GLfloat size); -GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); -GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glDrawBuffer (GLenum buf); -GLAPI void APIENTRY glClear (GLbitfield mask); -GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glClearStencil (GLint s); -GLAPI void APIENTRY glClearDepth (GLdouble depth); -GLAPI void APIENTRY glStencilMask (GLuint mask); -GLAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI void APIENTRY glDepthMask (GLboolean flag); -GLAPI void APIENTRY glDisable (GLenum cap); -GLAPI void APIENTRY glEnable (GLenum cap); -GLAPI void APIENTRY glFinish (void); -GLAPI void APIENTRY glFlush (void); -GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GLAPI void APIENTRY glLogicOp (GLenum opcode); -GLAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GLAPI void APIENTRY glDepthFunc (GLenum func); -GLAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); -GLAPI void APIENTRY glReadBuffer (GLenum src); -GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); -GLAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *data); -GLAPI GLenum APIENTRY glGetError (void); -GLAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *data); -GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data); -GLAPI const GLubyte *APIENTRY glGetString (GLenum name); -GLAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap); -GLAPI void APIENTRY glDepthRange (GLdouble n, GLdouble f); -GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_VERSION_1_0 */ - -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 -typedef khronos_float_t GLclampf; -typedef double GLclampd; -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_DOUBLE 0x140A -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_VERTEX_ARRAY 0x8074 -typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); -typedef void (APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI void APIENTRY glGetPointerv (GLenum pname, void **params); -GLAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GLAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTexture (GLuint texture); -#endif -#endif /* GL_VERSION_1_1 */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_VERSION_1_2 */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); -#endif -#endif /* GL_VERSION_1_3 */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_EQUATION 0x8009 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -#endif -#endif /* GL_VERSION_1_4 */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_intptr_t GLintptr; -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SRC1_ALPHA 0x8589 -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); -typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_VERSION_1_5 */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -typedef char GLchar; -typedef khronos_int16_t GLshort; -typedef khronos_int8_t GLbyte; -typedef khronos_uint16_t GLushort; -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -#endif -#endif /* GL_VERSION_2_0 */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_VERSION_2_1 */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -typedef khronos_uint16_t GLhalf; -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif -#endif /* GL_VERSION_3_0 */ - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif -#endif /* GL_VERSION_3_1 */ - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -typedef struct __GLsync *GLsync; -typedef khronos_uint64_t GLuint64; -typedef khronos_int64_t GLint64; -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_DEPTH_CLAMP 0x864F -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); -#endif -#endif /* GL_VERSION_3_2 */ - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#define GL_INT_2_10_10_10_REV 0x8D9F -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif -#endif /* GL_VERSION_3_3 */ - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_MAX_VERTEX_STREAMS 0x8E71 -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLfloat value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif -#endif /* GL_VERSION_4_0 */ - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_RGB565 0x8D62 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GLAPI void APIENTRY glClearDepthf (GLfloat d); -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif -#endif /* GL_VERSION_4_1 */ - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); -GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); -GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif -#endif /* GL_VERSION_4_2 */ - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_MAX_UNIFORM_LOCATIONS 0x826E -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F -#define GL_IS_PER_PATCH 0x92E7 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF -#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_VERTEX_BINDING_BUFFER 0x8F4F -typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); -GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); -GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); -GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI void APIENTRY glPopDebugGroup (void); -GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_VERSION_4_3 */ - -#ifndef GL_VERSION_4_4 -#define GL_VERSION_4_4 1 -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A -#define GL_MAP_PERSISTENT_BIT 0x0040 -#define GL_MAP_COHERENT_BIT 0x0080 -#define GL_DYNAMIC_STORAGE_BIT 0x0100 -#define GL_CLIENT_STORAGE_BIT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F -#define GL_BUFFER_STORAGE_FLAGS 0x8220 -#define GL_CLEAR_TEXTURE 0x9365 -#define GL_LOCATION_COMPONENT 0x934A -#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B -#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C -#define GL_QUERY_BUFFER 0x9192 -#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 -#define GL_QUERY_BUFFER_BINDING 0x9193 -#define GL_QUERY_RESULT_NO_WAIT 0x9194 -#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 -typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); -typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); -typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); -typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); -GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); -GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); -GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); -GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -#endif -#endif /* GL_VERSION_4_4 */ - -#ifndef GL_VERSION_4_5 -#define GL_VERSION_4_5 1 -#define GL_CONTEXT_LOST 0x0507 -#define GL_NEGATIVE_ONE_TO_ONE 0x935E -#define GL_ZERO_TO_ONE 0x935F -#define GL_CLIP_ORIGIN 0x935C -#define GL_CLIP_DEPTH_MODE 0x935D -#define GL_QUERY_WAIT_INVERTED 0x8E17 -#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 -#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 -#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A -#define GL_MAX_CULL_DISTANCES 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA -#define GL_TEXTURE_TARGET 0x1006 -#define GL_QUERY_TARGET 0x82EA -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 -#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB -#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC -typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); -typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); -typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); -typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); -typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); -typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); -typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); -GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); -GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); -GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); -GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); -GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); -GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); -GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); -GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); -GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); -GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); -GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); -GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); -GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); -GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); -GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); -GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); -GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); -GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); -GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); -GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GLAPI void APIENTRY glTextureBarrier (void); -#endif -#endif /* GL_VERSION_4_5 */ - -#ifndef GL_VERSION_4_6 -#define GL_VERSION_4_6 1 -#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 -#define GL_SPIR_V_BINARY 0x9552 -#define GL_PARAMETER_BUFFER 0x80EE -#define GL_PARAMETER_BUFFER_BINDING 0x80EF -#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 -#define GL_VERTICES_SUBMITTED 0x82EE -#define GL_PRIMITIVES_SUBMITTED 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF -#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED -typedef void (APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpecializeShader (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -GLAPI void APIENTRY glMultiDrawArraysIndirectCount (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectCount (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glPolygonOffsetClamp (GLfloat factor, GLfloat units, GLfloat clamp); -#endif -#endif /* GL_VERSION_4_6 */ - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#endif /* GL_ARB_ES2_compatibility */ - -#ifndef GL_ARB_ES3_1_compatibility -#define GL_ARB_ES3_1_compatibility 1 -#endif /* GL_ARB_ES3_1_compatibility */ - -#ifndef GL_ARB_ES3_2_compatibility -#define GL_ARB_ES3_2_compatibility 1 -#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 -typedef void (APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveBoundingBoxARB (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#endif -#endif /* GL_ARB_ES3_2_compatibility */ - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 -#endif /* GL_ARB_ES3_compatibility */ - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 -#endif /* GL_ARB_arrays_of_arrays */ - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 -#endif /* GL_ARB_base_instance */ - -#ifndef GL_ARB_bindless_texture -#define GL_ARB_bindless_texture 1 -typedef khronos_uint64_t GLuint64EXT; -#define GL_UNSIGNED_INT64_ARB 0x140F -typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); -typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); -GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); -GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); -GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); -GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); -GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); -GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); -GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); -GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); -GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); -GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); -#endif -#endif /* GL_ARB_bindless_texture */ - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#endif /* GL_ARB_blend_func_extended */ - -#ifndef GL_ARB_buffer_storage -#define GL_ARB_buffer_storage 1 -#endif /* GL_ARB_buffer_storage */ - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -struct _cl_context; -struct _cl_event; -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); -#endif -#endif /* GL_ARB_cl_event */ - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 -#endif /* GL_ARB_clear_buffer_object */ - -#ifndef GL_ARB_clear_texture -#define GL_ARB_clear_texture 1 -#endif /* GL_ARB_clear_texture */ - -#ifndef GL_ARB_clip_control -#define GL_ARB_clip_control 1 -#endif /* GL_ARB_clip_control */ - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 -#endif /* GL_ARB_compressed_texture_pixel_storage */ - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 -#endif /* GL_ARB_compute_shader */ - -#ifndef GL_ARB_compute_variable_group_size -#define GL_ARB_compute_variable_group_size 1 -#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 -#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB -#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 -#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); -#endif -#endif /* GL_ARB_compute_variable_group_size */ - -#ifndef GL_ARB_conditional_render_inverted -#define GL_ARB_conditional_render_inverted 1 -#endif /* GL_ARB_conditional_render_inverted */ - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 -#endif /* GL_ARB_conservative_depth */ - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#endif /* GL_ARB_copy_buffer */ - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 -#endif /* GL_ARB_copy_image */ - -#ifndef GL_ARB_cull_distance -#define GL_ARB_cull_distance 1 -#endif /* GL_ARB_cull_distance */ - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif -#endif /* GL_ARB_debug_output */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif /* GL_ARB_depth_buffer_float */ - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif /* GL_ARB_depth_clamp */ - -#ifndef GL_ARB_derivative_control -#define GL_ARB_derivative_control 1 -#endif /* GL_ARB_derivative_control */ - -#ifndef GL_ARB_direct_state_access -#define GL_ARB_direct_state_access 1 -#endif /* GL_ARB_direct_state_access */ - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif -#endif /* GL_ARB_draw_buffers_blend */ - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#endif /* GL_ARB_draw_elements_base_vertex */ - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#endif /* GL_ARB_draw_indirect */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_ARB_draw_instanced */ - -#ifndef GL_ARB_enhanced_layouts -#define GL_ARB_enhanced_layouts 1 -#endif /* GL_ARB_enhanced_layouts */ - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif /* GL_ARB_explicit_attrib_location */ - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 -#endif /* GL_ARB_explicit_uniform_location */ - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif /* GL_ARB_fragment_coord_conventions */ - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 -#endif /* GL_ARB_fragment_layer_viewport */ - -#ifndef GL_ARB_fragment_shader_interlock -#define GL_ARB_fragment_shader_interlock 1 -#endif /* GL_ARB_fragment_shader_interlock */ - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 -#endif /* GL_ARB_framebuffer_no_attachments */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#endif /* GL_ARB_framebuffer_object */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif /* GL_ARB_framebuffer_sRGB */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif -#endif /* GL_ARB_geometry_shader4 */ - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#endif /* GL_ARB_get_program_binary */ - -#ifndef GL_ARB_get_texture_sub_image -#define GL_ARB_get_texture_sub_image 1 -#endif /* GL_ARB_get_texture_sub_image */ - -#ifndef GL_ARB_gl_spirv -#define GL_ARB_gl_spirv 1 -#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 -#define GL_SPIR_V_BINARY_ARB 0x9552 -typedef void (APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpecializeShaderARB (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -#endif -#endif /* GL_ARB_gl_spirv */ - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif /* GL_ARB_gpu_shader5 */ - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#endif /* GL_ARB_gpu_shader_fp64 */ - -#ifndef GL_ARB_gpu_shader_int64 -#define GL_ARB_gpu_shader_int64 1 -#define GL_INT64_ARB 0x140E -#define GL_INT64_VEC2_ARB 0x8FE9 -#define GL_INT64_VEC3_ARB 0x8FEA -#define GL_INT64_VEC4_ARB 0x8FEB -#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 -typedef void (APIENTRYP PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); -typedef void (APIENTRYP PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); -typedef void (APIENTRYP PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (APIENTRYP PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64 *params); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64 *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64ARB (GLint location, GLint64 x); -GLAPI void APIENTRY glUniform2i64ARB (GLint location, GLint64 x, GLint64 y); -GLAPI void APIENTRY glUniform3i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z); -GLAPI void APIENTRY glUniform4i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -GLAPI void APIENTRY glUniform1i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform2i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform3i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform4i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform1ui64ARB (GLint location, GLuint64 x); -GLAPI void APIENTRY glUniform2ui64ARB (GLint location, GLuint64 x, GLuint64 y); -GLAPI void APIENTRY glUniform3ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -GLAPI void APIENTRY glUniform4ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -GLAPI void APIENTRY glUniform1ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform2ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform3ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform4ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glGetUniformi64vARB (GLuint program, GLint location, GLint64 *params); -GLAPI void APIENTRY glGetUniformui64vARB (GLuint program, GLint location, GLuint64 *params); -GLAPI void APIENTRY glGetnUniformi64vARB (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); -GLAPI void APIENTRY glGetnUniformui64vARB (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); -GLAPI void APIENTRY glProgramUniform1i64ARB (GLuint program, GLint location, GLint64 x); -GLAPI void APIENTRY glProgramUniform2i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y); -GLAPI void APIENTRY glProgramUniform3i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -GLAPI void APIENTRY glProgramUniform4i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -GLAPI void APIENTRY glProgramUniform1i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform2i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform3i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform4i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform1ui64ARB (GLuint program, GLint location, GLuint64 x); -GLAPI void APIENTRY glProgramUniform2ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y); -GLAPI void APIENTRY glProgramUniform3ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -GLAPI void APIENTRY glProgramUniform4ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -GLAPI void APIENTRY glProgramUniform1ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform2ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform3ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform4ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -#endif -#endif /* GL_ARB_gpu_shader_int64 */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif /* GL_ARB_half_float_vertex */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 -#endif /* GL_ARB_imaging */ - -#ifndef GL_ARB_indirect_parameters -#define GL_ARB_indirect_parameters 1 -#define GL_PARAMETER_BUFFER_ARB 0x80EE -#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#endif -#endif /* GL_ARB_indirect_parameters */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); -#endif -#endif /* GL_ARB_instanced_arrays */ - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 -#endif /* GL_ARB_internalformat_query */ - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_VIEW_CLASS_EAC_R11 0x9383 -#define GL_VIEW_CLASS_EAC_RG11 0x9384 -#define GL_VIEW_CLASS_ETC2_RGB 0x9385 -#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 -#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 -#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 -#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 -#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A -#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B -#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C -#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D -#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E -#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F -#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 -#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 -#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 -#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 -#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 -#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 -#endif /* GL_ARB_internalformat_query2 */ - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 -#endif /* GL_ARB_invalidate_subdata */ - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 -#endif /* GL_ARB_map_buffer_alignment */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#endif /* GL_ARB_map_buffer_range */ - -#ifndef GL_ARB_multi_bind -#define GL_ARB_multi_bind 1 -#endif /* GL_ARB_multi_bind */ - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 -#endif /* GL_ARB_multi_draw_indirect */ - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif /* GL_ARB_occlusion_query2 */ - -#ifndef GL_ARB_parallel_shader_compile -#define GL_ARB_parallel_shader_compile 1 -#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 -#define GL_COMPLETION_STATUS_ARB 0x91B1 -typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMaxShaderCompilerThreadsARB (GLuint count); -#endif -#endif /* GL_ARB_parallel_shader_compile */ - -#ifndef GL_ARB_pipeline_statistics_query -#define GL_ARB_pipeline_statistics_query 1 -#define GL_VERTICES_SUBMITTED_ARB 0x82EE -#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 -#endif /* GL_ARB_pipeline_statistics_query */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif /* GL_ARB_pixel_buffer_object */ - -#ifndef GL_ARB_polygon_offset_clamp -#define GL_ARB_polygon_offset_clamp 1 -#endif /* GL_ARB_polygon_offset_clamp */ - -#ifndef GL_ARB_post_depth_coverage -#define GL_ARB_post_depth_coverage 1 -#endif /* GL_ARB_post_depth_coverage */ - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 -#endif /* GL_ARB_program_interface_query */ - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#endif /* GL_ARB_provoking_vertex */ - -#ifndef GL_ARB_query_buffer_object -#define GL_ARB_query_buffer_object 1 -#endif /* GL_ARB_query_buffer_object */ - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 -#endif /* GL_ARB_robust_buffer_access_behavior */ - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif -#endif /* GL_ARB_robustness */ - -#ifndef GL_ARB_robustness_isolation -#define GL_ARB_robustness_isolation 1 -#endif /* GL_ARB_robustness_isolation */ - -#ifndef GL_ARB_sample_locations -#define GL_ARB_sample_locations 1 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 -#define GL_SAMPLE_LOCATION_ARB 0x8E50 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 -typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLEVALUATEDEPTHVALUESARBPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferSampleLocationsfvARB (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvARB (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glEvaluateDepthValuesARB (void); -#endif -#endif /* GL_ARB_sample_locations */ - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); -#endif -#endif /* GL_ARB_sample_shading */ - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#endif /* GL_ARB_sampler_objects */ - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif /* GL_ARB_seamless_cube_map */ - -#ifndef GL_ARB_seamless_cubemap_per_texture -#define GL_ARB_seamless_cubemap_per_texture 1 -#endif /* GL_ARB_seamless_cubemap_per_texture */ - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#endif /* GL_ARB_separate_shader_objects */ - -#ifndef GL_ARB_shader_atomic_counter_ops -#define GL_ARB_shader_atomic_counter_ops 1 -#endif /* GL_ARB_shader_atomic_counter_ops */ - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 -#endif /* GL_ARB_shader_atomic_counters */ - -#ifndef GL_ARB_shader_ballot -#define GL_ARB_shader_ballot 1 -#endif /* GL_ARB_shader_ballot */ - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 -#endif /* GL_ARB_shader_bit_encoding */ - -#ifndef GL_ARB_shader_clock -#define GL_ARB_shader_clock 1 -#endif /* GL_ARB_shader_clock */ - -#ifndef GL_ARB_shader_draw_parameters -#define GL_ARB_shader_draw_parameters 1 -#endif /* GL_ARB_shader_draw_parameters */ - -#ifndef GL_ARB_shader_group_vote -#define GL_ARB_shader_group_vote 1 -#endif /* GL_ARB_shader_group_vote */ - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 -#endif /* GL_ARB_shader_image_load_store */ - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 -#endif /* GL_ARB_shader_image_size */ - -#ifndef GL_ARB_shader_precision -#define GL_ARB_shader_precision 1 -#endif /* GL_ARB_shader_precision */ - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif /* GL_ARB_shader_stencil_export */ - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 -#endif /* GL_ARB_shader_storage_buffer_object */ - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#endif /* GL_ARB_shader_subroutine */ - -#ifndef GL_ARB_shader_texture_image_samples -#define GL_ARB_shader_texture_image_samples 1 -#endif /* GL_ARB_shader_texture_image_samples */ - -#ifndef GL_ARB_shader_viewport_layer_array -#define GL_ARB_shader_viewport_layer_array 1 -#endif /* GL_ARB_shader_viewport_layer_array */ - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 -#endif /* GL_ARB_shading_language_420pack */ - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif -#endif /* GL_ARB_shading_language_include */ - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 -#endif /* GL_ARB_shading_language_packing */ - -#ifndef GL_ARB_sparse_buffer -#define GL_ARB_sparse_buffer 1 -#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 -#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 -typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); -typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); -GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -#endif -#endif /* GL_ARB_sparse_buffer */ - -#ifndef GL_ARB_sparse_texture -#define GL_ARB_sparse_texture 1 -#define GL_TEXTURE_SPARSE_ARB 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA -#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 -#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 -typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#endif -#endif /* GL_ARB_sparse_texture */ - -#ifndef GL_ARB_sparse_texture2 -#define GL_ARB_sparse_texture2 1 -#endif /* GL_ARB_sparse_texture2 */ - -#ifndef GL_ARB_sparse_texture_clamp -#define GL_ARB_sparse_texture_clamp 1 -#endif /* GL_ARB_sparse_texture_clamp */ - -#ifndef GL_ARB_spirv_extensions -#define GL_ARB_spirv_extensions 1 -#endif /* GL_ARB_spirv_extensions */ - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 -#endif /* GL_ARB_stencil_texturing */ - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#endif /* GL_ARB_sync */ - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#endif /* GL_ARB_tessellation_shader */ - -#ifndef GL_ARB_texture_barrier -#define GL_ARB_texture_barrier 1 -#endif /* GL_ARB_texture_barrier */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif /* GL_ARB_texture_border_clamp */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); -#endif -#endif /* GL_ARB_texture_buffer_object */ - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif /* GL_ARB_texture_buffer_object_rgb32 */ - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 -#endif /* GL_ARB_texture_buffer_range */ - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif /* GL_ARB_texture_compression_bptc */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif /* GL_ARB_texture_compression_rgtc */ - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif /* GL_ARB_texture_cube_map_array */ - -#ifndef GL_ARB_texture_filter_anisotropic -#define GL_ARB_texture_filter_anisotropic 1 -#endif /* GL_ARB_texture_filter_anisotropic */ - -#ifndef GL_ARB_texture_filter_minmax -#define GL_ARB_texture_filter_minmax 1 -#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 -#define GL_WEIGHTED_AVERAGE_ARB 0x9367 -#endif /* GL_ARB_texture_filter_minmax */ - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F -#endif /* GL_ARB_texture_gather */ - -#ifndef GL_ARB_texture_mirror_clamp_to_edge -#define GL_ARB_texture_mirror_clamp_to_edge 1 -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif /* GL_ARB_texture_mirrored_repeat */ - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#endif /* GL_ARB_texture_multisample */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif /* GL_ARB_texture_non_power_of_two */ - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 -#endif /* GL_ARB_texture_query_levels */ - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif /* GL_ARB_texture_query_lod */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif /* GL_ARB_texture_rg */ - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif /* GL_ARB_texture_rgb10_a2ui */ - -#ifndef GL_ARB_texture_stencil8 -#define GL_ARB_texture_stencil8 1 -#endif /* GL_ARB_texture_stencil8 */ - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 -#endif /* GL_ARB_texture_storage */ - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 -#endif /* GL_ARB_texture_storage_multisample */ - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif /* GL_ARB_texture_swizzle */ - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 -#endif /* GL_ARB_texture_view */ - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#endif /* GL_ARB_timer_query */ - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#endif /* GL_ARB_transform_feedback2 */ - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#endif /* GL_ARB_transform_feedback3 */ - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 -#endif /* GL_ARB_transform_feedback_instanced */ - -#ifndef GL_ARB_transform_feedback_overflow_query -#define GL_ARB_transform_feedback_overflow_query 1 -#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED -#endif /* GL_ARB_transform_feedback_overflow_query */ - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#endif /* GL_ARB_uniform_buffer_object */ - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif /* GL_ARB_vertex_array_bgra */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#endif /* GL_ARB_vertex_array_object */ - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#endif /* GL_ARB_vertex_attrib_64bit */ - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 -#endif /* GL_ARB_vertex_attrib_binding */ - -#ifndef GL_ARB_vertex_type_10f_11f_11f_rev -#define GL_ARB_vertex_type_10f_11f_11f_rev 1 -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#endif /* GL_ARB_viewport_array */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 -typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendBarrierKHR (void); -#endif -#endif /* GL_KHR_blend_equation_advanced */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 -#endif /* GL_KHR_context_flush_control */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -#endif /* GL_KHR_debug */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 -#endif /* GL_KHR_no_error */ - -#ifndef GL_KHR_parallel_shader_compile -#define GL_KHR_parallel_shader_compile 1 -#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 -#define GL_COMPLETION_STATUS_KHR 0x91B1 -typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); -#endif -#endif /* GL_KHR_parallel_shader_compile */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 -#endif /* GL_KHR_robust_buffer_access_behavior */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 -#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 -#endif /* GL_KHR_robustness */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif /* GL_KHR_texture_compression_astc_hdr */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif /* GL_KHR_texture_compression_astc_ldr */ - -#ifndef GL_KHR_texture_compression_astc_sliced_3d -#define GL_KHR_texture_compression_astc_sliced_3d 1 -#endif /* GL_KHR_texture_compression_astc_sliced_3d */ - -#ifndef GL_AMD_framebuffer_multisample_advanced -#define GL_AMD_framebuffer_multisample_advanced 1 -#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 -#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 -#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 -#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 -#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 -#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_AMD_framebuffer_multisample_advanced */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); -GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -#endif /* GL_AMD_performance_monitor */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_RAW_422_APPLE 0x8A51 -#endif /* GL_APPLE_rgb_422 */ - -#ifndef GL_EXT_EGL_image_storage -#define GL_EXT_EGL_image_storage 1 -typedef void *GLeglImageOES; -typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); -typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); -GLAPI void APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#endif -#endif /* GL_EXT_EGL_image_storage */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_EXT_debug_label */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 -typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); -GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); -GLAPI void APIENTRY glPopGroupMarkerEXT (void); -#endif -#endif /* GL_EXT_debug_marker */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); -typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); -typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); -GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); -GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); -GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); -GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); -GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); -GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); -#endif -#endif /* GL_EXT_direct_state_access */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B -typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); -#endif -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 -#endif /* GL_EXT_post_depth_coverage */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); -#endif -#endif /* GL_EXT_raster_multisample */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D -typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); -typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); -GLAPI void APIENTRY glActiveProgramEXT (GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); -#endif -#endif /* GL_EXT_separate_shader_objects */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent -#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 -typedef void (APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferFetchBarrierEXT (void); -#endif -#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 -#endif /* GL_EXT_shader_integer_mix */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 -#endif /* GL_EXT_texture_filter_minmax */ - -#ifndef GL_EXT_texture_sRGB_R8 -#define GL_EXT_texture_sRGB_R8 1 -#define GL_SR8_EXT 0x8FBD -#endif /* GL_EXT_texture_sRGB_R8 */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif /* GL_EXT_texture_sRGB_decode */ - -#ifndef GL_EXT_window_rectangles -#define GL_EXT_window_rectangles 1 -#define GL_INCLUSIVE_EXT 0x8F10 -#define GL_EXCLUSIVE_EXT 0x8F11 -#define GL_WINDOW_RECTANGLE_EXT 0x8F12 -#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 -#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 -#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 -typedef void (APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); -#endif -#endif /* GL_EXT_window_rectangles */ - -#ifndef GL_INTEL_blackhole_render -#define GL_INTEL_blackhole_render 1 -#define GL_BLACKHOLE_RENDER_INTEL 0x83FC -#endif /* GL_INTEL_blackhole_render */ - -#ifndef GL_INTEL_conservative_rasterization -#define GL_INTEL_conservative_rasterization 1 -#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE -#endif /* GL_INTEL_conservative_rasterization */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 -typedef void (APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); -#endif -#endif /* GL_INTEL_framebuffer_CMAA */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 -typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); -typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); -typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); -typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); -typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); -GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); -GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); -GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); -GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#endif -#endif /* GL_INTEL_performance_query */ - -#ifndef GL_NV_bindless_multi_draw_indirect -#define GL_NV_bindless_multi_draw_indirect 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -#endif -#endif /* GL_NV_bindless_multi_draw_indirect */ - -#ifndef GL_NV_bindless_multi_draw_indirect_count -#define GL_NV_bindless_multi_draw_indirect_count 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -#endif -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 -typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); -GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); -GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); -GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); -GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); -GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); -GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); -GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); -GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); -GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); -#endif -#endif /* GL_NV_bindless_texture */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLUE_NV 0x1905 -#define GL_COLORBURN_NV 0x929A -#define GL_COLORDODGE_NV 0x9299 -#define GL_CONJOINT_NV 0x9284 -#define GL_CONTRAST_NV 0x92A1 -#define GL_DARKEN_NV 0x9297 -#define GL_DIFFERENCE_NV 0x929E -#define GL_DISJOINT_NV 0x9283 -#define GL_DST_ATOP_NV 0x928F -#define GL_DST_IN_NV 0x928B -#define GL_DST_NV 0x9287 -#define GL_DST_OUT_NV 0x928D -#define GL_DST_OVER_NV 0x9289 -#define GL_EXCLUSION_NV 0x92A0 -#define GL_GREEN_NV 0x1904 -#define GL_HARDLIGHT_NV 0x929B -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_INVERT_OVG_NV 0x92B4 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LIGHTEN_NV 0x9298 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_MINUS_NV 0x929F -#define GL_MULTIPLY_NV 0x9294 -#define GL_OVERLAY_NV 0x9296 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_PLUS_NV 0x9291 -#define GL_RED_NV 0x1903 -#define GL_SCREEN_NV 0x9295 -#define GL_SOFTLIGHT_NV 0x929C -#define GL_SRC_ATOP_NV 0x928E -#define GL_SRC_IN_NV 0x928A -#define GL_SRC_NV 0x9286 -#define GL_SRC_OUT_NV 0x928C -#define GL_SRC_OVER_NV 0x9288 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_XOR_NV 0x1506 -typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); -GLAPI void APIENTRY glBlendBarrierNV (void); -#endif -#endif /* GL_NV_blend_equation_advanced */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#endif /* GL_NV_blend_equation_advanced_coherent */ - -#ifndef GL_NV_blend_minmax_factor -#define GL_NV_blend_minmax_factor 1 -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D -#endif /* GL_NV_blend_minmax_factor */ - -#ifndef GL_NV_clip_space_w_scaling -#define GL_NV_clip_space_w_scaling 1 -#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C -#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D -#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E -typedef void (APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#endif -#endif /* GL_NV_clip_space_w_scaling */ - -#ifndef GL_NV_command_list -#define GL_NV_command_list 1 -#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 -#define GL_NOP_COMMAND_NV 0x0001 -#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 -#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 -#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 -#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 -#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 -#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 -#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 -#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 -#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A -#define GL_BLEND_COLOR_COMMAND_NV 0x000B -#define GL_STENCIL_REF_COMMAND_NV 0x000C -#define GL_LINE_WIDTH_COMMAND_NV 0x000D -#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E -#define GL_ALPHA_REF_COMMAND_NV 0x000F -#define GL_VIEWPORT_COMMAND_NV 0x0010 -#define GL_SCISSOR_COMMAND_NV 0x0011 -#define GL_FRONT_FACE_COMMAND_NV 0x0012 -typedef void (APIENTRYP PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint *states); -typedef void (APIENTRYP PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint *states); -typedef GLboolean (APIENTRYP PFNGLISSTATENVPROC) (GLuint state); -typedef void (APIENTRYP PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); -typedef GLuint (APIENTRYP PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); -typedef GLushort (APIENTRYP PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint *lists); -typedef void (APIENTRYP PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint *lists); -typedef GLboolean (APIENTRYP PFNGLISCOMMANDLISTNVPROC) (GLuint list); -typedef void (APIENTRYP PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); -typedef void (APIENTRYP PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); -typedef void (APIENTRYP PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCreateStatesNV (GLsizei n, GLuint *states); -GLAPI void APIENTRY glDeleteStatesNV (GLsizei n, const GLuint *states); -GLAPI GLboolean APIENTRY glIsStateNV (GLuint state); -GLAPI void APIENTRY glStateCaptureNV (GLuint state, GLenum mode); -GLAPI GLuint APIENTRY glGetCommandHeaderNV (GLenum tokenID, GLuint size); -GLAPI GLushort APIENTRY glGetStageIndexNV (GLenum shadertype); -GLAPI void APIENTRY glDrawCommandsNV (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); -GLAPI void APIENTRY glDrawCommandsAddressNV (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); -GLAPI void APIENTRY glDrawCommandsStatesNV (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glDrawCommandsStatesAddressNV (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glCreateCommandListsNV (GLsizei n, GLuint *lists); -GLAPI void APIENTRY glDeleteCommandListsNV (GLsizei n, const GLuint *lists); -GLAPI GLboolean APIENTRY glIsCommandListNV (GLuint list); -GLAPI void APIENTRY glListDrawCommandsStatesClientNV (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glCommandListSegmentsNV (GLuint list, GLuint segments); -GLAPI void APIENTRY glCompileCommandListNV (GLuint list); -GLAPI void APIENTRY glCallCommandListNV (GLuint list); -#endif -#endif /* GL_NV_command_list */ - -#ifndef GL_NV_compute_shader_derivatives -#define GL_NV_compute_shader_derivatives 1 -#endif /* GL_NV_compute_shader_derivatives */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRenderNV (void); -#endif -#endif /* GL_NV_conditional_render */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 -typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); -#endif -#endif /* GL_NV_conservative_raster */ - -#ifndef GL_NV_conservative_raster_dilate -#define GL_NV_conservative_raster_dilate 1 -#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 -#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A -#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B -typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConservativeRasterParameterfNV (GLenum pname, GLfloat value); -#endif -#endif /* GL_NV_conservative_raster_dilate */ - -#ifndef GL_NV_conservative_raster_pre_snap -#define GL_NV_conservative_raster_pre_snap 1 -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 -#endif /* GL_NV_conservative_raster_pre_snap */ - -#ifndef GL_NV_conservative_raster_pre_snap_triangles -#define GL_NV_conservative_raster_pre_snap_triangles 1 -#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D -#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F -typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); -#endif -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -#ifndef GL_NV_conservative_raster_underestimation -#define GL_NV_conservative_raster_underestimation 1 -#endif /* GL_NV_conservative_raster_underestimation */ - -#ifndef GL_NV_draw_vulkan_image -#define GL_NV_draw_vulkan_image 1 -typedef void (APIENTRY *GLVULKANPROCNV)(void); -typedef void (APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -typedef GLVULKANPROCNV (APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); -typedef void (APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -GLAPI GLVULKANPROCNV APIENTRY glGetVkProcAddrNV (const GLchar *name); -GLAPI void APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); -GLAPI void APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); -GLAPI void APIENTRY glSignalVkFenceNV (GLuint64 vkFence); -#endif -#endif /* GL_NV_draw_vulkan_image */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 -#define GL_FILL_RECTANGLE_NV 0x933C -#endif /* GL_NV_fill_rectangle */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE -typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); -#endif -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifndef GL_NV_fragment_shader_barycentric -#define GL_NV_fragment_shader_barycentric 1 -#endif /* GL_NV_fragment_shader_barycentric */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 -#endif /* GL_NV_fragment_shader_interlock */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 -typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); -typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); -typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); -GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); -GLAPI void APIENTRY glCoverageModulationNV (GLenum components); -#endif -#endif /* GL_NV_framebuffer_mixed_samples */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_NV_framebuffer_multisample_coverage */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 -#endif /* GL_NV_geometry_shader_passthrough */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -typedef khronos_int64_t GLint64EXT; -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif -#endif /* GL_NV_gpu_shader5 */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 -typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_NV_internalformat_sample_query */ - -#ifndef GL_NV_memory_attachment -#define GL_NV_memory_attachment 1 -#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 -#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 -#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 -#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 -#define GL_MEMORY_ATTACHABLE_NV 0x95A8 -#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 -#define GL_DETACHED_TEXTURES_NV 0x95AA -#define GL_DETACHED_BUFFERS_NV 0x95AB -#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC -#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD -typedef void (APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -typedef void (APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); -typedef void (APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -GLAPI void APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); -GLAPI void APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); -#endif -#endif /* GL_NV_memory_attachment */ - -#ifndef GL_NV_mesh_shader -#define GL_NV_mesh_shader 1 -#define GL_MESH_SHADER_NV 0x9559 -#define GL_TASK_SHADER_NV 0x955A -#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 -#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 -#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 -#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 -#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 -#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 -#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 -#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 -#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 -#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 -#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A -#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B -#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C -#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D -#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E -#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F -#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 -#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 -#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 -#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 -#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 -#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 -#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A -#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D -#define GL_MAX_MESH_VIEWS_NV 0x9557 -#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF -#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 -#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B -#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C -#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E -#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F -#define GL_MESH_VERTICES_OUT_NV 0x9579 -#define GL_MESH_PRIMITIVES_OUT_NV 0x957A -#define GL_MESH_OUTPUT_TYPE_NV 0x957B -#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F -#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 -#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 -#define GL_MESH_SUBROUTINE_NV 0x957C -#define GL_TASK_SUBROUTINE_NV 0x957D -#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E -#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F -#define GL_MESH_SHADER_BIT_NV 0x00000040 -#define GL_TASK_SHADER_BIT_NV 0x00000080 -typedef void (APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); -typedef void (APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); -typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); -GLAPI void APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); -GLAPI void APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#endif -#endif /* GL_NV_mesh_shader */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_CLOSE_PATH_NV 0x00 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_BOLD_BIT_NV 0x01 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_PATH_PROJECTION_NV 0x1701 -#define GL_PATH_MODELVIEW_NV 0x1700 -#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 -#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 -#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 -#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 -#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 -#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 -#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 -#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 -#define GL_FRAGMENT_INPUT_NV 0x936D -typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); -typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); -typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); -typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); -typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); -typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); -typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); -GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); -GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); -GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); -GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); -GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); -GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); -GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); -GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); -GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); -GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); -GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); -GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); -GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); -GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); -GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); -GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); -GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); -GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); -GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); -GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -#endif -#endif /* GL_NV_path_rendering */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 -#define GL_SHARED_EDGE_NV 0xC0 -#endif /* GL_NV_path_rendering_shared_edge */ - -#ifndef GL_NV_representative_fragment_test -#define GL_NV_representative_fragment_test 1 -#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F -#endif /* GL_NV_representative_fragment_test */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 -typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glResolveDepthValuesNV (void); -#endif -#endif /* GL_NV_sample_locations */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 -#endif /* GL_NV_sample_mask_override_coverage */ - -#ifndef GL_NV_scissor_exclusive -#define GL_NV_scissor_exclusive 1 -#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 -#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 -typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); -#endif -#endif /* GL_NV_scissor_exclusive */ - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 -#endif /* GL_NV_shader_atomic_counters */ - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 -#endif /* GL_NV_shader_atomic_float */ - -#ifndef GL_NV_shader_atomic_float64 -#define GL_NV_shader_atomic_float64 1 -#endif /* GL_NV_shader_atomic_float64 */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 -#endif /* GL_NV_shader_atomic_fp16_vector */ - -#ifndef GL_NV_shader_atomic_int64 -#define GL_NV_shader_atomic_int64 1 -#endif /* GL_NV_shader_atomic_int64 */ - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 -typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); -typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); -GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); -GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); -GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); -GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); -GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); -GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); -GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); -GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); -GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); -GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif -#endif /* GL_NV_shader_buffer_load */ - -#ifndef GL_NV_shader_buffer_store -#define GL_NV_shader_buffer_store 1 -#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 -#endif /* GL_NV_shader_buffer_store */ - -#ifndef GL_NV_shader_texture_footprint -#define GL_NV_shader_texture_footprint 1 -#endif /* GL_NV_shader_texture_footprint */ - -#ifndef GL_NV_shader_thread_group -#define GL_NV_shader_thread_group 1 -#define GL_WARP_SIZE_NV 0x9339 -#define GL_WARPS_PER_SM_NV 0x933A -#define GL_SM_COUNT_NV 0x933B -#endif /* GL_NV_shader_thread_group */ - -#ifndef GL_NV_shader_thread_shuffle -#define GL_NV_shader_thread_shuffle 1 -#endif /* GL_NV_shader_thread_shuffle */ - -#ifndef GL_NV_shading_rate_image -#define GL_NV_shading_rate_image 1 -#define GL_SHADING_RATE_IMAGE_NV 0x9563 -#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 -#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 -#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 -#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A -#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B -#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C -#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D -#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E -#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F -#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B -#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C -#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D -#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E -#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F -#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE -#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF -#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 -typedef void (APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); -typedef void (APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); -typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); -typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); -typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindShadingRateImageNV (GLuint texture); -GLAPI void APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); -GLAPI void APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); -GLAPI void APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); -GLAPI void APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); -GLAPI void APIENTRY glShadingRateSampleOrderNV (GLenum order); -GLAPI void APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); -#endif -#endif /* GL_NV_shading_rate_image */ - -#ifndef GL_NV_stereo_view_rendering -#define GL_NV_stereo_view_rendering 1 -#endif /* GL_NV_stereo_view_rendering */ - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 -typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureBarrierNV (void); -#endif -#endif /* GL_NV_texture_barrier */ - -#ifndef GL_NV_texture_rectangle_compressed -#define GL_NV_texture_rectangle_compressed 1 -#endif /* GL_NV_texture_rectangle_compressed */ - -#ifndef GL_NV_uniform_buffer_unified_memory -#define GL_NV_uniform_buffer_unified_memory 1 -#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E -#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F -#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 -#endif /* GL_NV_uniform_buffer_unified_memory */ - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); -GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 -typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); -GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); -#endif -#endif /* GL_NV_vertex_buffer_unified_memory */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 -#endif /* GL_NV_viewport_array2 */ - -#ifndef GL_NV_viewport_swizzle -#define GL_NV_viewport_swizzle 1 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 -#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 -#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 -#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A -#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B -typedef void (APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#endif -#endif /* GL_NV_viewport_swizzle */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#endif -#endif /* GL_OVR_multiview */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 -#endif /* GL_OVR_multiview2 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GL4/glext.h b/core/deps/khronos/GL4/glext.h deleted file mode 100644 index 151dcf2b0..000000000 --- a/core/deps/khronos/GL4/glext.h +++ /dev/null @@ -1,12742 +0,0 @@ -#ifndef __gl_glext_h_ -#define __gl_glext_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2013-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ -/* -** This header is generated from the Khronos OpenGL / OpenGL ES XML -** API Registry. The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** https://github.com/KhronosGroup/OpenGL-Registry -*/ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif -#include -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif -#ifndef GLAPI -#define GLAPI extern -#endif - -#define GL_GLEXT_VERSION 20190204 - -#include - -/* Generated C header for: - * API: gl - * Profile: compatibility - * Versions considered: .* - * Versions emitted: 1\.[2-9]|[234]\.[0-9] - * Default extensions included: gl - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_RESCALE_NORMAL 0x803A -#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 -#define GL_SINGLE_COLOR 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR 0x81FA -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_VERSION_1_2 */ - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 -#define GL_MULTISAMPLE_BIT 0x20000000 -#define GL_NORMAL_MAP 0x8511 -#define GL_REFLECTION_MAP 0x8512 -#define GL_COMPRESSED_ALPHA 0x84E9 -#define GL_COMPRESSED_LUMINANCE 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB -#define GL_COMPRESSED_INTENSITY 0x84EC -#define GL_COMBINE 0x8570 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_RGB 0x8582 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_RGB 0x8592 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_RGB_SCALE 0x8573 -#define GL_ADD_SIGNED 0x8574 -#define GL_INTERPOLATE 0x8575 -#define GL_SUBTRACT 0x84E7 -#define GL_CONSTANT 0x8576 -#define GL_PRIMARY_COLOR 0x8577 -#define GL_PREVIOUS 0x8578 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); -GLAPI void APIENTRY glClientActiveTexture (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); -#endif -#endif /* GL_VERSION_1_3 */ - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_FOG_COORDINATE_SOURCE 0x8450 -#define GL_FOG_COORDINATE 0x8451 -#define GL_FRAGMENT_DEPTH 0x8452 -#define GL_CURRENT_FOG_COORDINATE 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 -#define GL_FOG_COORDINATE_ARRAY 0x8457 -#define GL_COLOR_SUM 0x8458 -#define GL_CURRENT_SECONDARY_COLOR 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D -#define GL_SECONDARY_COLOR_ARRAY 0x845E -#define GL_TEXTURE_FILTER_CONTROL 0x8500 -#define GL_DEPTH_TEXTURE_MODE 0x884B -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_EQUATION 0x8009 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -GLAPI void APIENTRY glFogCoordf (GLfloat coord); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); -GLAPI void APIENTRY glFogCoordd (GLdouble coord); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2iv (const GLint *v); -GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); -GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3iv (const GLint *v); -GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); -GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -#endif -#endif /* GL_VERSION_1_4 */ - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_intptr_t GLintptr; -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SRC1_ALPHA 0x8589 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E -#define GL_FOG_COORD_SRC 0x8450 -#define GL_FOG_COORD 0x8451 -#define GL_CURRENT_FOG_COORD 0x8453 -#define GL_FOG_COORD_ARRAY_TYPE 0x8454 -#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 -#define GL_FOG_COORD_ARRAY_POINTER 0x8456 -#define GL_FOG_COORD_ARRAY 0x8457 -#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D -#define GL_SRC0_RGB 0x8580 -#define GL_SRC1_RGB 0x8581 -#define GL_SRC2_RGB 0x8582 -#define GL_SRC0_ALPHA 0x8588 -#define GL_SRC2_ALPHA 0x858A -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); -typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_VERSION_1_5 */ - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -typedef char GLchar; -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_TEXTURE_COORDS 0x8871 -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -#endif -#endif /* GL_VERSION_2_0 */ - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F -#define GL_SLUMINANCE_ALPHA 0x8C44 -#define GL_SLUMINANCE8_ALPHA8 0x8C45 -#define GL_SLUMINANCE 0x8C46 -#define GL_SLUMINANCE8 0x8C47 -#define GL_COMPRESSED_SLUMINANCE 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_VERSION_2_1 */ - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -typedef khronos_uint16_t GLhalf; -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_INDEX 0x8222 -#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_ALPHA_INTEGER 0x8D97 -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif -#endif /* GL_VERSION_3_0 */ - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif -#endif /* GL_VERSION_3_1 */ - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -typedef struct __GLsync *GLsync; -typedef khronos_uint64_t GLuint64; -typedef khronos_int64_t GLint64; -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_DEPTH_CLAMP 0x864F -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); -#endif -#endif /* GL_VERSION_3_2 */ - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#define GL_INT_2_10_10_10_REV 0x8D9F -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); -#endif -#endif /* GL_VERSION_3_3 */ - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_MAX_VERTEX_STREAMS 0x8E71 -#define GL_DOUBLE_VEC2 0x8FFC -#define GL_DOUBLE_VEC3 0x8FFD -#define GL_DOUBLE_VEC4 0x8FFE -#define GL_DOUBLE_MAT2 0x8F46 -#define GL_DOUBLE_MAT3 0x8F47 -#define GL_DOUBLE_MAT4 0x8F48 -#define GL_DOUBLE_MAT2x3 0x8F49 -#define GL_DOUBLE_MAT2x4 0x8F4A -#define GL_DOUBLE_MAT3x2 0x8F4B -#define GL_DOUBLE_MAT3x4 0x8F4C -#define GL_DOUBLE_MAT4x2 0x8F4D -#define GL_DOUBLE_MAT4x3 0x8F4E -#define GL_ACTIVE_SUBROUTINES 0x8DE5 -#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 -#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 -#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 -#define GL_MAX_SUBROUTINES 0x8DE7 -#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 -#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A -#define GL_COMPATIBLE_SUBROUTINES 0x8E4B -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 -#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLfloat value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif -#endif /* GL_VERSION_4_0 */ - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -#define GL_FIXED 0x140C -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_RGB565 0x8D62 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_MAX_VIEWPORTS 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE 0x825D -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F -#define GL_UNDEFINED_VERTEX 0x8260 -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GLAPI void APIENTRY glClearDepthf (GLfloat d); -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif -#endif /* GL_VERSION_4_1 */ - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 -#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 -#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 -#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A -#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B -#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C -#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D -#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 -#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_1D 0x904C -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_2D_RECT 0x904F -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_IMAGE_1D_ARRAY 0x9052 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 -#define GL_INT_IMAGE_1D 0x9057 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_2D_RECT 0x905A -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_INT_IMAGE_1D_ARRAY 0x905D -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C -#define GL_MAX_IMAGE_SAMPLES 0x906D -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); -GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); -GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif -#endif /* GL_VERSION_4_2 */ - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_MAX_UNIFORM_LOCATIONS 0x826E -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#define GL_INTERNALFORMAT_SUPPORTED 0x826F -#define GL_INTERNALFORMAT_PREFERRED 0x8270 -#define GL_INTERNALFORMAT_RED_SIZE 0x8271 -#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 -#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 -#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 -#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 -#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 -#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 -#define GL_INTERNALFORMAT_RED_TYPE 0x8278 -#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 -#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A -#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B -#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C -#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D -#define GL_MAX_WIDTH 0x827E -#define GL_MAX_HEIGHT 0x827F -#define GL_MAX_DEPTH 0x8280 -#define GL_MAX_LAYERS 0x8281 -#define GL_MAX_COMBINED_DIMENSIONS 0x8282 -#define GL_COLOR_COMPONENTS 0x8283 -#define GL_DEPTH_COMPONENTS 0x8284 -#define GL_STENCIL_COMPONENTS 0x8285 -#define GL_COLOR_RENDERABLE 0x8286 -#define GL_DEPTH_RENDERABLE 0x8287 -#define GL_STENCIL_RENDERABLE 0x8288 -#define GL_FRAMEBUFFER_RENDERABLE 0x8289 -#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A -#define GL_FRAMEBUFFER_BLEND 0x828B -#define GL_READ_PIXELS 0x828C -#define GL_READ_PIXELS_FORMAT 0x828D -#define GL_READ_PIXELS_TYPE 0x828E -#define GL_TEXTURE_IMAGE_FORMAT 0x828F -#define GL_TEXTURE_IMAGE_TYPE 0x8290 -#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 -#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 -#define GL_MIPMAP 0x8293 -#define GL_MANUAL_GENERATE_MIPMAP 0x8294 -#define GL_AUTO_GENERATE_MIPMAP 0x8295 -#define GL_COLOR_ENCODING 0x8296 -#define GL_SRGB_READ 0x8297 -#define GL_SRGB_WRITE 0x8298 -#define GL_FILTER 0x829A -#define GL_VERTEX_TEXTURE 0x829B -#define GL_TESS_CONTROL_TEXTURE 0x829C -#define GL_TESS_EVALUATION_TEXTURE 0x829D -#define GL_GEOMETRY_TEXTURE 0x829E -#define GL_FRAGMENT_TEXTURE 0x829F -#define GL_COMPUTE_TEXTURE 0x82A0 -#define GL_TEXTURE_SHADOW 0x82A1 -#define GL_TEXTURE_GATHER 0x82A2 -#define GL_TEXTURE_GATHER_SHADOW 0x82A3 -#define GL_SHADER_IMAGE_LOAD 0x82A4 -#define GL_SHADER_IMAGE_STORE 0x82A5 -#define GL_SHADER_IMAGE_ATOMIC 0x82A6 -#define GL_IMAGE_TEXEL_SIZE 0x82A7 -#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 -#define GL_IMAGE_PIXEL_FORMAT 0x82A9 -#define GL_IMAGE_PIXEL_TYPE 0x82AA -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD -#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE -#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF -#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 -#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 -#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 -#define GL_CLEAR_BUFFER 0x82B4 -#define GL_TEXTURE_VIEW 0x82B5 -#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 -#define GL_FULL_SUPPORT 0x82B7 -#define GL_CAVEAT_SUPPORT 0x82B8 -#define GL_IMAGE_CLASS_4_X_32 0x82B9 -#define GL_IMAGE_CLASS_2_X_32 0x82BA -#define GL_IMAGE_CLASS_1_X_32 0x82BB -#define GL_IMAGE_CLASS_4_X_16 0x82BC -#define GL_IMAGE_CLASS_2_X_16 0x82BD -#define GL_IMAGE_CLASS_1_X_16 0x82BE -#define GL_IMAGE_CLASS_4_X_8 0x82BF -#define GL_IMAGE_CLASS_2_X_8 0x82C0 -#define GL_IMAGE_CLASS_1_X_8 0x82C1 -#define GL_IMAGE_CLASS_11_11_10 0x82C2 -#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 -#define GL_VIEW_CLASS_128_BITS 0x82C4 -#define GL_VIEW_CLASS_96_BITS 0x82C5 -#define GL_VIEW_CLASS_64_BITS 0x82C6 -#define GL_VIEW_CLASS_48_BITS 0x82C7 -#define GL_VIEW_CLASS_32_BITS 0x82C8 -#define GL_VIEW_CLASS_24_BITS 0x82C9 -#define GL_VIEW_CLASS_16_BITS 0x82CA -#define GL_VIEW_CLASS_8_BITS 0x82CB -#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC -#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD -#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE -#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF -#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 -#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 -#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 -#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_VERTEX_SUBROUTINE 0x92E8 -#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 -#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA -#define GL_GEOMETRY_SUBROUTINE 0x92EB -#define GL_FRAGMENT_SUBROUTINE 0x92EC -#define GL_COMPUTE_SUBROUTINE 0x92ED -#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE -#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF -#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 -#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 -#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 -#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_LOCATION_INDEX 0x930F -#define GL_IS_PER_PATCH 0x92E7 -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF -#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_VERTEX_BINDING_BUFFER 0x8F4F -#define GL_DISPLAY_LIST 0x82E7 -typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); -GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); -GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); -GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI void APIENTRY glPopDebugGroup (void); -GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_VERSION_4_3 */ - -#ifndef GL_VERSION_4_4 -#define GL_VERSION_4_4 1 -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A -#define GL_MAP_PERSISTENT_BIT 0x0040 -#define GL_MAP_COHERENT_BIT 0x0080 -#define GL_DYNAMIC_STORAGE_BIT 0x0100 -#define GL_CLIENT_STORAGE_BIT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F -#define GL_BUFFER_STORAGE_FLAGS 0x8220 -#define GL_CLEAR_TEXTURE 0x9365 -#define GL_LOCATION_COMPONENT 0x934A -#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B -#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C -#define GL_QUERY_BUFFER 0x9192 -#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 -#define GL_QUERY_BUFFER_BINDING 0x9193 -#define GL_QUERY_RESULT_NO_WAIT 0x9194 -#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 -typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); -typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); -typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); -typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); -GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); -GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); -GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); -GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); -GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -#endif -#endif /* GL_VERSION_4_4 */ - -#ifndef GL_VERSION_4_5 -#define GL_VERSION_4_5 1 -#define GL_CONTEXT_LOST 0x0507 -#define GL_NEGATIVE_ONE_TO_ONE 0x935E -#define GL_ZERO_TO_ONE 0x935F -#define GL_CLIP_ORIGIN 0x935C -#define GL_CLIP_DEPTH_MODE 0x935D -#define GL_QUERY_WAIT_INVERTED 0x8E17 -#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 -#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 -#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A -#define GL_MAX_CULL_DISTANCES 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA -#define GL_TEXTURE_TARGET 0x1006 -#define GL_QUERY_TARGET 0x82EA -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 -#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB -#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC -typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); -typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); -typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); -typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); -typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); -typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); -typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); -typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); -typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); -typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); -GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); -GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); -GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); -GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); -GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); -GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); -GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); -GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); -GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); -GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); -GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); -GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); -GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); -GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); -GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); -GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); -GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); -GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); -GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); -GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); -GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); -GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); -GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); -GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); -GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); -GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); -GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); -GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); -GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); -GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); -GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); -GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -GLAPI void APIENTRY glTextureBarrier (void); -#endif -#endif /* GL_VERSION_4_5 */ - -#ifndef GL_VERSION_4_6 -#define GL_VERSION_4_6 1 -#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 -#define GL_SPIR_V_BINARY 0x9552 -#define GL_PARAMETER_BUFFER 0x80EE -#define GL_PARAMETER_BUFFER_BINDING 0x80EF -#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 -#define GL_VERTICES_SUBMITTED 0x82EE -#define GL_PRIMITIVES_SUBMITTED 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 -#define GL_POLYGON_OFFSET_CLAMP 0x8E1B -#define GL_SPIR_V_EXTENSIONS 0x9553 -#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 -#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF -#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED -typedef void (APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpecializeShader (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -GLAPI void APIENTRY glMultiDrawArraysIndirectCount (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectCount (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glPolygonOffsetClamp (GLfloat factor, GLfloat units, GLfloat clamp); -#endif -#endif /* GL_VERSION_4_6 */ - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#endif /* GL_ARB_ES2_compatibility */ - -#ifndef GL_ARB_ES3_1_compatibility -#define GL_ARB_ES3_1_compatibility 1 -#endif /* GL_ARB_ES3_1_compatibility */ - -#ifndef GL_ARB_ES3_2_compatibility -#define GL_ARB_ES3_2_compatibility 1 -#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 -typedef void (APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveBoundingBoxARB (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#endif -#endif /* GL_ARB_ES3_2_compatibility */ - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 -#endif /* GL_ARB_ES3_compatibility */ - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 -#endif /* GL_ARB_arrays_of_arrays */ - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 -#endif /* GL_ARB_base_instance */ - -#ifndef GL_ARB_bindless_texture -#define GL_ARB_bindless_texture 1 -typedef khronos_uint64_t GLuint64EXT; -#define GL_UNSIGNED_INT64_ARB 0x140F -typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); -typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); -GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); -GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); -GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); -GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); -GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); -GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); -GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); -GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); -GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); -GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); -#endif -#endif /* GL_ARB_bindless_texture */ - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#endif /* GL_ARB_blend_func_extended */ - -#ifndef GL_ARB_buffer_storage -#define GL_ARB_buffer_storage 1 -#endif /* GL_ARB_buffer_storage */ - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -struct _cl_context; -struct _cl_event; -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); -#endif -#endif /* GL_ARB_cl_event */ - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 -#endif /* GL_ARB_clear_buffer_object */ - -#ifndef GL_ARB_clear_texture -#define GL_ARB_clear_texture 1 -#endif /* GL_ARB_clear_texture */ - -#ifndef GL_ARB_clip_control -#define GL_ARB_clip_control 1 -#endif /* GL_ARB_clip_control */ - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); -#endif -#endif /* GL_ARB_color_buffer_float */ - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 -#endif /* GL_ARB_compatibility */ - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 -#endif /* GL_ARB_compressed_texture_pixel_storage */ - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 -#endif /* GL_ARB_compute_shader */ - -#ifndef GL_ARB_compute_variable_group_size -#define GL_ARB_compute_variable_group_size 1 -#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 -#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB -#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 -#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); -#endif -#endif /* GL_ARB_compute_variable_group_size */ - -#ifndef GL_ARB_conditional_render_inverted -#define GL_ARB_conditional_render_inverted 1 -#endif /* GL_ARB_conditional_render_inverted */ - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 -#endif /* GL_ARB_conservative_depth */ - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#endif /* GL_ARB_copy_buffer */ - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 -#endif /* GL_ARB_copy_image */ - -#ifndef GL_ARB_cull_distance -#define GL_ARB_cull_distance 1 -#endif /* GL_ARB_cull_distance */ - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif -#endif /* GL_ARB_debug_output */ - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif /* GL_ARB_depth_buffer_float */ - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif /* GL_ARB_depth_clamp */ - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif /* GL_ARB_depth_texture */ - -#ifndef GL_ARB_derivative_control -#define GL_ARB_derivative_control 1 -#endif /* GL_ARB_derivative_control */ - -#ifndef GL_ARB_direct_state_access -#define GL_ARB_direct_state_access 1 -#endif /* GL_ARB_direct_state_access */ - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_ARB_draw_buffers */ - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif -#endif /* GL_ARB_draw_buffers_blend */ - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#endif /* GL_ARB_draw_elements_base_vertex */ - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#endif /* GL_ARB_draw_indirect */ - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_ARB_draw_instanced */ - -#ifndef GL_ARB_enhanced_layouts -#define GL_ARB_enhanced_layouts 1 -#endif /* GL_ARB_enhanced_layouts */ - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif /* GL_ARB_explicit_attrib_location */ - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 -#endif /* GL_ARB_explicit_uniform_location */ - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif /* GL_ARB_fragment_coord_conventions */ - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 -#endif /* GL_ARB_fragment_layer_viewport */ - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); -GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); -#endif -#endif /* GL_ARB_fragment_program */ - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif /* GL_ARB_fragment_program_shadow */ - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif /* GL_ARB_fragment_shader */ - -#ifndef GL_ARB_fragment_shader_interlock -#define GL_ARB_fragment_shader_interlock 1 -#endif /* GL_ARB_fragment_shader_interlock */ - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 -#endif /* GL_ARB_framebuffer_no_attachments */ - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#endif /* GL_ARB_framebuffer_object */ - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif /* GL_ARB_framebuffer_sRGB */ - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif -#endif /* GL_ARB_geometry_shader4 */ - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#endif /* GL_ARB_get_program_binary */ - -#ifndef GL_ARB_get_texture_sub_image -#define GL_ARB_get_texture_sub_image 1 -#endif /* GL_ARB_get_texture_sub_image */ - -#ifndef GL_ARB_gl_spirv -#define GL_ARB_gl_spirv 1 -#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 -#define GL_SPIR_V_BINARY_ARB 0x9552 -typedef void (APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpecializeShaderARB (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); -#endif -#endif /* GL_ARB_gl_spirv */ - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif /* GL_ARB_gpu_shader5 */ - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#endif /* GL_ARB_gpu_shader_fp64 */ - -#ifndef GL_ARB_gpu_shader_int64 -#define GL_ARB_gpu_shader_int64 1 -#define GL_INT64_ARB 0x140E -#define GL_INT64_VEC2_ARB 0x8FE9 -#define GL_INT64_VEC3_ARB 0x8FEA -#define GL_INT64_VEC4_ARB 0x8FEB -#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 -typedef void (APIENTRYP PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); -typedef void (APIENTRYP PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); -typedef void (APIENTRYP PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (APIENTRYP PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64 *params); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64 *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64ARB (GLint location, GLint64 x); -GLAPI void APIENTRY glUniform2i64ARB (GLint location, GLint64 x, GLint64 y); -GLAPI void APIENTRY glUniform3i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z); -GLAPI void APIENTRY glUniform4i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -GLAPI void APIENTRY glUniform1i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform2i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform3i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform4i64vARB (GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glUniform1ui64ARB (GLint location, GLuint64 x); -GLAPI void APIENTRY glUniform2ui64ARB (GLint location, GLuint64 x, GLuint64 y); -GLAPI void APIENTRY glUniform3ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -GLAPI void APIENTRY glUniform4ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -GLAPI void APIENTRY glUniform1ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform2ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform3ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glUniform4ui64vARB (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glGetUniformi64vARB (GLuint program, GLint location, GLint64 *params); -GLAPI void APIENTRY glGetUniformui64vARB (GLuint program, GLint location, GLuint64 *params); -GLAPI void APIENTRY glGetnUniformi64vARB (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); -GLAPI void APIENTRY glGetnUniformui64vARB (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); -GLAPI void APIENTRY glProgramUniform1i64ARB (GLuint program, GLint location, GLint64 x); -GLAPI void APIENTRY glProgramUniform2i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y); -GLAPI void APIENTRY glProgramUniform3i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); -GLAPI void APIENTRY glProgramUniform4i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); -GLAPI void APIENTRY glProgramUniform1i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform2i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform3i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform4i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); -GLAPI void APIENTRY glProgramUniform1ui64ARB (GLuint program, GLint location, GLuint64 x); -GLAPI void APIENTRY glProgramUniform2ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y); -GLAPI void APIENTRY glProgramUniform3ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); -GLAPI void APIENTRY glProgramUniform4ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); -GLAPI void APIENTRY glProgramUniform1ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform2ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform3ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniform4ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); -#endif -#endif /* GL_ARB_gpu_shader_int64 */ - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -typedef khronos_uint16_t GLhalfARB; -#define GL_HALF_FLOAT_ARB 0x140B -#endif /* GL_ARB_half_float_pixel */ - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif /* GL_ARB_half_float_vertex */ - -#ifndef GL_ARB_imaging -#define GL_ARB_imaging 1 -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); -GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogram (GLenum target); -GLAPI void APIENTRY glResetMinmax (GLenum target); -#endif -#endif /* GL_ARB_imaging */ - -#ifndef GL_ARB_indirect_parameters -#define GL_ARB_indirect_parameters 1 -#define GL_PARAMETER_BUFFER_ARB 0x80EE -#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#endif -#endif /* GL_ARB_indirect_parameters */ - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); -#endif -#endif /* GL_ARB_instanced_arrays */ - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 -#endif /* GL_ARB_internalformat_query */ - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 -#define GL_SRGB_DECODE_ARB 0x8299 -#define GL_VIEW_CLASS_EAC_R11 0x9383 -#define GL_VIEW_CLASS_EAC_RG11 0x9384 -#define GL_VIEW_CLASS_ETC2_RGB 0x9385 -#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 -#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 -#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 -#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 -#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A -#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B -#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C -#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D -#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E -#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F -#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 -#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 -#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 -#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 -#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 -#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 -#endif /* GL_ARB_internalformat_query2 */ - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 -#endif /* GL_ARB_invalidate_subdata */ - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 -#endif /* GL_ARB_map_buffer_alignment */ - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#endif /* GL_ARB_map_buffer_range */ - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); -#endif -#endif /* GL_ARB_matrix_palette */ - -#ifndef GL_ARB_multi_bind -#define GL_ARB_multi_bind 1 -#endif /* GL_ARB_multi_bind */ - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 -#endif /* GL_ARB_multi_draw_indirect */ - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); -#endif -#endif /* GL_ARB_multisample */ - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); -#endif -#endif /* GL_ARB_multitexture */ - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); -GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQueryARB (GLenum target); -GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); -#endif -#endif /* GL_ARB_occlusion_query */ - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif /* GL_ARB_occlusion_query2 */ - -#ifndef GL_ARB_parallel_shader_compile -#define GL_ARB_parallel_shader_compile 1 -#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 -#define GL_COMPLETION_STATUS_ARB 0x91B1 -typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMaxShaderCompilerThreadsARB (GLuint count); -#endif -#endif /* GL_ARB_parallel_shader_compile */ - -#ifndef GL_ARB_pipeline_statistics_query -#define GL_ARB_pipeline_statistics_query 1 -#define GL_VERTICES_SUBMITTED_ARB 0x82EE -#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF -#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 -#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 -#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 -#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 -#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 -#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 -#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 -#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 -#endif /* GL_ARB_pipeline_statistics_query */ - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif /* GL_ARB_pixel_buffer_object */ - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); -#endif -#endif /* GL_ARB_point_parameters */ - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif /* GL_ARB_point_sprite */ - -#ifndef GL_ARB_polygon_offset_clamp -#define GL_ARB_polygon_offset_clamp 1 -#endif /* GL_ARB_polygon_offset_clamp */ - -#ifndef GL_ARB_post_depth_coverage -#define GL_ARB_post_depth_coverage 1 -#endif /* GL_ARB_post_depth_coverage */ - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 -#endif /* GL_ARB_program_interface_query */ - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#endif /* GL_ARB_provoking_vertex */ - -#ifndef GL_ARB_query_buffer_object -#define GL_ARB_query_buffer_object 1 -#endif /* GL_ARB_query_buffer_object */ - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 -#endif /* GL_ARB_robust_buffer_access_behavior */ - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); -typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); -typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); -typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); -GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); -GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); -GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); -GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); -GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); -GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); -GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -#endif -#endif /* GL_ARB_robustness */ - -#ifndef GL_ARB_robustness_isolation -#define GL_ARB_robustness_isolation 1 -#endif /* GL_ARB_robustness_isolation */ - -#ifndef GL_ARB_sample_locations -#define GL_ARB_sample_locations 1 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 -#define GL_SAMPLE_LOCATION_ARB 0x8E50 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 -typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLEVALUATEDEPTHVALUESARBPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferSampleLocationsfvARB (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvARB (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glEvaluateDepthValuesARB (void); -#endif -#endif /* GL_ARB_sample_locations */ - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); -#endif -#endif /* GL_ARB_sample_shading */ - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#endif /* GL_ARB_sampler_objects */ - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif /* GL_ARB_seamless_cube_map */ - -#ifndef GL_ARB_seamless_cubemap_per_texture -#define GL_ARB_seamless_cubemap_per_texture 1 -#endif /* GL_ARB_seamless_cubemap_per_texture */ - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#endif /* GL_ARB_separate_shader_objects */ - -#ifndef GL_ARB_shader_atomic_counter_ops -#define GL_ARB_shader_atomic_counter_ops 1 -#endif /* GL_ARB_shader_atomic_counter_ops */ - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 -#endif /* GL_ARB_shader_atomic_counters */ - -#ifndef GL_ARB_shader_ballot -#define GL_ARB_shader_ballot 1 -#endif /* GL_ARB_shader_ballot */ - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 -#endif /* GL_ARB_shader_bit_encoding */ - -#ifndef GL_ARB_shader_clock -#define GL_ARB_shader_clock 1 -#endif /* GL_ARB_shader_clock */ - -#ifndef GL_ARB_shader_draw_parameters -#define GL_ARB_shader_draw_parameters 1 -#endif /* GL_ARB_shader_draw_parameters */ - -#ifndef GL_ARB_shader_group_vote -#define GL_ARB_shader_group_vote 1 -#endif /* GL_ARB_shader_group_vote */ - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 -#endif /* GL_ARB_shader_image_load_store */ - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 -#endif /* GL_ARB_shader_image_size */ - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef __APPLE__ -typedef void *GLhandleARB; -#else -typedef unsigned int GLhandleARB; -#endif -typedef char GLcharARB; -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif -#endif /* GL_ARB_shader_objects */ - -#ifndef GL_ARB_shader_precision -#define GL_ARB_shader_precision 1 -#endif /* GL_ARB_shader_precision */ - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif /* GL_ARB_shader_stencil_export */ - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 -#endif /* GL_ARB_shader_storage_buffer_object */ - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#endif /* GL_ARB_shader_subroutine */ - -#ifndef GL_ARB_shader_texture_image_samples -#define GL_ARB_shader_texture_image_samples 1 -#endif /* GL_ARB_shader_texture_image_samples */ - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 -#endif /* GL_ARB_shader_texture_lod */ - -#ifndef GL_ARB_shader_viewport_layer_array -#define GL_ARB_shader_viewport_layer_array 1 -#endif /* GL_ARB_shader_viewport_layer_array */ - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif /* GL_ARB_shading_language_100 */ - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 -#endif /* GL_ARB_shading_language_420pack */ - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif -#endif /* GL_ARB_shading_language_include */ - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 -#endif /* GL_ARB_shading_language_packing */ - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif /* GL_ARB_shadow */ - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif /* GL_ARB_shadow_ambient */ - -#ifndef GL_ARB_sparse_buffer -#define GL_ARB_sparse_buffer 1 -#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 -#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 -typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); -typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); -GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); -#endif -#endif /* GL_ARB_sparse_buffer */ - -#ifndef GL_ARB_sparse_texture -#define GL_ARB_sparse_texture 1 -#define GL_TEXTURE_SPARSE_ARB 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA -#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 -#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 -typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#endif -#endif /* GL_ARB_sparse_texture */ - -#ifndef GL_ARB_sparse_texture2 -#define GL_ARB_sparse_texture2 1 -#endif /* GL_ARB_sparse_texture2 */ - -#ifndef GL_ARB_sparse_texture_clamp -#define GL_ARB_sparse_texture_clamp 1 -#endif /* GL_ARB_sparse_texture_clamp */ - -#ifndef GL_ARB_spirv_extensions -#define GL_ARB_spirv_extensions 1 -#endif /* GL_ARB_spirv_extensions */ - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 -#endif /* GL_ARB_stencil_texturing */ - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#endif /* GL_ARB_sync */ - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#endif /* GL_ARB_tessellation_shader */ - -#ifndef GL_ARB_texture_barrier -#define GL_ARB_texture_barrier 1 -#endif /* GL_ARB_texture_barrier */ - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif /* GL_ARB_texture_border_clamp */ - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); -#endif -#endif /* GL_ARB_texture_buffer_object */ - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif /* GL_ARB_texture_buffer_object_rgb32 */ - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 -#endif /* GL_ARB_texture_buffer_range */ - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); -#endif -#endif /* GL_ARB_texture_compression */ - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif /* GL_ARB_texture_compression_bptc */ - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif /* GL_ARB_texture_compression_rgtc */ - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif /* GL_ARB_texture_cube_map */ - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif /* GL_ARB_texture_cube_map_array */ - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif /* GL_ARB_texture_env_add */ - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif /* GL_ARB_texture_env_combine */ - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif /* GL_ARB_texture_env_crossbar */ - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif /* GL_ARB_texture_env_dot3 */ - -#ifndef GL_ARB_texture_filter_anisotropic -#define GL_ARB_texture_filter_anisotropic 1 -#endif /* GL_ARB_texture_filter_anisotropic */ - -#ifndef GL_ARB_texture_filter_minmax -#define GL_ARB_texture_filter_minmax 1 -#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 -#define GL_WEIGHTED_AVERAGE_ARB 0x9367 -#endif /* GL_ARB_texture_filter_minmax */ - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif /* GL_ARB_texture_float */ - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F -#endif /* GL_ARB_texture_gather */ - -#ifndef GL_ARB_texture_mirror_clamp_to_edge -#define GL_ARB_texture_mirror_clamp_to_edge 1 -#endif /* GL_ARB_texture_mirror_clamp_to_edge */ - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif /* GL_ARB_texture_mirrored_repeat */ - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#endif /* GL_ARB_texture_multisample */ - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif /* GL_ARB_texture_non_power_of_two */ - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 -#endif /* GL_ARB_texture_query_levels */ - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif /* GL_ARB_texture_query_lod */ - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif /* GL_ARB_texture_rectangle */ - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif /* GL_ARB_texture_rg */ - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif /* GL_ARB_texture_rgb10_a2ui */ - -#ifndef GL_ARB_texture_stencil8 -#define GL_ARB_texture_stencil8 1 -#endif /* GL_ARB_texture_stencil8 */ - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 -#endif /* GL_ARB_texture_storage */ - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 -#endif /* GL_ARB_texture_storage_multisample */ - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif /* GL_ARB_texture_swizzle */ - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 -#endif /* GL_ARB_texture_view */ - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#endif /* GL_ARB_timer_query */ - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#endif /* GL_ARB_transform_feedback2 */ - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#endif /* GL_ARB_transform_feedback3 */ - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 -#endif /* GL_ARB_transform_feedback_instanced */ - -#ifndef GL_ARB_transform_feedback_overflow_query -#define GL_ARB_transform_feedback_overflow_query 1 -#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC -#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED -#endif /* GL_ARB_transform_feedback_overflow_query */ - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); -#endif -#endif /* GL_ARB_transpose_matrix */ - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#endif /* GL_ARB_uniform_buffer_object */ - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif /* GL_ARB_vertex_array_bgra */ - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#endif /* GL_ARB_vertex_array_object */ - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#endif /* GL_ARB_vertex_attrib_64bit */ - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 -#endif /* GL_ARB_vertex_attrib_binding */ - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); -GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); -GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); -GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); -GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); -GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); -GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); -GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); -GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glVertexBlendARB (GLint count); -#endif -#endif /* GL_ARB_vertex_blend */ - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -typedef khronos_ssize_t GLsizeiptrARB; -typedef khronos_intptr_t GLintptrARB; -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); -GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_ARB_vertex_buffer_object */ - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); -#endif -#endif /* GL_ARB_vertex_program */ - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); -#endif -#endif /* GL_ARB_vertex_shader */ - -#ifndef GL_ARB_vertex_type_10f_11f_11f_rev -#define GL_ARB_vertex_type_10f_11f_11f_rev 1 -#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#endif /* GL_ARB_viewport_array */ - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); -#endif -#endif /* GL_ARB_window_pos */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 -typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendBarrierKHR (void); -#endif -#endif /* GL_KHR_blend_equation_advanced */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 -#endif /* GL_KHR_context_flush_control */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -#endif /* GL_KHR_debug */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 -#endif /* GL_KHR_no_error */ - -#ifndef GL_KHR_parallel_shader_compile -#define GL_KHR_parallel_shader_compile 1 -#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 -#define GL_COMPLETION_STATUS_KHR 0x91B1 -typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); -#endif -#endif /* GL_KHR_parallel_shader_compile */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 -#endif /* GL_KHR_robust_buffer_access_behavior */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 -#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 -#endif /* GL_KHR_robustness */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif /* GL_KHR_texture_compression_astc_hdr */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif /* GL_KHR_texture_compression_astc_ldr */ - -#ifndef GL_KHR_texture_compression_astc_sliced_3d -#define GL_KHR_texture_compression_astc_sliced_3d 1 -#endif /* GL_KHR_texture_compression_astc_sliced_3d */ - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 -typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); -typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); -typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); -typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); -typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); -typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); -GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); -GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); -GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); -GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); -GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); -GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); -GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); -GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); -GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); -GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); -GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); -#endif -#endif /* GL_OES_byte_coordinates */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif /* GL_OES_compressed_paletted_texture */ - -#ifndef GL_OES_fixed_point -#define GL_OES_fixed_point 1 -typedef khronos_int32_t GLfixed; -#define GL_FIXED_OES 0x140C -typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); -typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); -typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); -typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); -typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); -typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); -typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); -typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); -typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); -typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); -typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); -typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); -typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); -typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); -typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); -typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); -typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); -typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); -typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); -typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); -typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); -typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); -typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); -typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); -typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); -typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); -typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); -GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); -GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); -GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); -GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); -GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); -GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glLineWidthxOES (GLfixed width); -GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); -GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); -GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glPointSizexOES (GLfixed size); -GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); -GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); -GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); -GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); -GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); -GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); -GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); -GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); -GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); -GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); -GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); -GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); -GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); -GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glIndexxOES (GLfixed component); -GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); -GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); -GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); -GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); -GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); -GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); -GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); -GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); -GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glPassThroughxOES (GLfixed token); -GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); -GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); -GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); -GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); -GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); -GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); -GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); -GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); -GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); -GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); -GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); -GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); -GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glVertex2xOES (GLfixed x); -GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); -GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); -#endif -#endif /* GL_OES_fixed_point */ - -#ifndef GL_OES_query_matrix -#define GL_OES_query_matrix 1 -typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); -#endif -#endif /* GL_OES_query_matrix */ - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif /* GL_OES_read_format */ - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 -typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); -typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); -typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); -typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); -GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); -GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); -GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); -GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -#endif -#endif /* GL_OES_single_precision */ - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#define GL_MULTISAMPLE_3DFX 0x86B2 -#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 -#define GL_SAMPLES_3DFX 0x86B4 -#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif /* GL_3DFX_multisample */ - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); -#endif -#endif /* GL_3DFX_tbuffer */ - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif /* GL_3DFX_texture_compression_FXT1 */ - -#ifndef GL_AMD_blend_minmax_factor -#define GL_AMD_blend_minmax_factor 1 -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D -#endif /* GL_AMD_blend_minmax_factor */ - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 -#endif /* GL_AMD_conservative_depth */ - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); -#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 -typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif -#endif /* GL_AMD_debug_output */ - -#ifndef GL_AMD_depth_clamp_separate -#define GL_AMD_depth_clamp_separate 1 -#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E -#define GL_DEPTH_CLAMP_FAR_AMD 0x901F -#endif /* GL_AMD_depth_clamp_separate */ - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 -typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif -#endif /* GL_AMD_draw_buffers_blend */ - -#ifndef GL_AMD_framebuffer_multisample_advanced -#define GL_AMD_framebuffer_multisample_advanced 1 -#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 -#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 -#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 -#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 -#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 -#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_AMD_framebuffer_multisample_advanced */ - -#ifndef GL_AMD_framebuffer_sample_positions -#define GL_AMD_framebuffer_sample_positions 1 -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F -#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE -#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF -#define GL_ALL_PIXELS_AMD 0xFFFFFFFF -typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferSamplePositionsfvAMD (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); -GLAPI void APIENTRY glNamedFramebufferSamplePositionsfvAMD (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); -GLAPI void APIENTRY glGetFramebufferParameterfvAMD (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); -GLAPI void APIENTRY glGetNamedFramebufferParameterfvAMD (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); -#endif -#endif /* GL_AMD_framebuffer_sample_positions */ - -#ifndef GL_AMD_gcn_shader -#define GL_AMD_gcn_shader 1 -#endif /* GL_AMD_gcn_shader */ - -#ifndef GL_AMD_gpu_shader_half_float -#define GL_AMD_gpu_shader_half_float 1 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -#define GL_FLOAT16_MAT2_AMD 0x91C5 -#define GL_FLOAT16_MAT3_AMD 0x91C6 -#define GL_FLOAT16_MAT4_AMD 0x91C7 -#define GL_FLOAT16_MAT2x3_AMD 0x91C8 -#define GL_FLOAT16_MAT2x4_AMD 0x91C9 -#define GL_FLOAT16_MAT3x2_AMD 0x91CA -#define GL_FLOAT16_MAT3x4_AMD 0x91CB -#define GL_FLOAT16_MAT4x2_AMD 0x91CC -#define GL_FLOAT16_MAT4x3_AMD 0x91CD -#endif /* GL_AMD_gpu_shader_half_float */ - -#ifndef GL_AMD_gpu_shader_int16 -#define GL_AMD_gpu_shader_int16 1 -#endif /* GL_AMD_gpu_shader_int16 */ - -#ifndef GL_AMD_gpu_shader_int64 -#define GL_AMD_gpu_shader_int64 1 -typedef khronos_int64_t GLint64EXT; -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); -GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif -#endif /* GL_AMD_gpu_shader_int64 */ - -#ifndef GL_AMD_interleaved_elements -#define GL_AMD_interleaved_elements 1 -#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 -#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 -typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); -#endif -#endif /* GL_AMD_interleaved_elements */ - -#ifndef GL_AMD_multi_draw_indirect -#define GL_AMD_multi_draw_indirect 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); -#endif -#endif /* GL_AMD_multi_draw_indirect */ - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 -typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); -typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); -typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); -GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); -GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); -#endif -#endif /* GL_AMD_name_gen_delete */ - -#ifndef GL_AMD_occlusion_query_event -#define GL_AMD_occlusion_query_event 1 -#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F -#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 -#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 -#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 -#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 -#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF -typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); -#endif -#endif /* GL_AMD_occlusion_query_event */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); -GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -#endif /* GL_AMD_performance_monitor */ - -#ifndef GL_AMD_pinned_memory -#define GL_AMD_pinned_memory 1 -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 -#endif /* GL_AMD_pinned_memory */ - -#ifndef GL_AMD_query_buffer_object -#define GL_AMD_query_buffer_object 1 -#define GL_QUERY_BUFFER_AMD 0x9192 -#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 -#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 -#endif /* GL_AMD_query_buffer_object */ - -#ifndef GL_AMD_sample_positions -#define GL_AMD_sample_positions 1 -typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); -#endif -#endif /* GL_AMD_sample_positions */ - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 -#endif /* GL_AMD_seamless_cubemap_per_texture */ - -#ifndef GL_AMD_shader_atomic_counter_ops -#define GL_AMD_shader_atomic_counter_ops 1 -#endif /* GL_AMD_shader_atomic_counter_ops */ - -#ifndef GL_AMD_shader_ballot -#define GL_AMD_shader_ballot 1 -#endif /* GL_AMD_shader_ballot */ - -#ifndef GL_AMD_shader_explicit_vertex_parameter -#define GL_AMD_shader_explicit_vertex_parameter 1 -#endif /* GL_AMD_shader_explicit_vertex_parameter */ - -#ifndef GL_AMD_shader_gpu_shader_half_float_fetch -#define GL_AMD_shader_gpu_shader_half_float_fetch 1 -#endif /* GL_AMD_shader_gpu_shader_half_float_fetch */ - -#ifndef GL_AMD_shader_image_load_store_lod -#define GL_AMD_shader_image_load_store_lod 1 -#endif /* GL_AMD_shader_image_load_store_lod */ - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 -#endif /* GL_AMD_shader_stencil_export */ - -#ifndef GL_AMD_shader_trinary_minmax -#define GL_AMD_shader_trinary_minmax 1 -#endif /* GL_AMD_shader_trinary_minmax */ - -#ifndef GL_AMD_sparse_texture -#define GL_AMD_sparse_texture 1 -#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A -#define GL_MIN_SPARSE_LEVEL_AMD 0x919B -#define GL_MIN_LOD_WARNING_AMD 0x919C -#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 -typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -#endif -#endif /* GL_AMD_sparse_texture */ - -#ifndef GL_AMD_stencil_operation_extended -#define GL_AMD_stencil_operation_extended 1 -#define GL_SET_AMD 0x874A -#define GL_REPLACE_VALUE_AMD 0x874B -#define GL_STENCIL_OP_VALUE_AMD 0x874C -#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D -typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); -#endif -#endif /* GL_AMD_stencil_operation_extended */ - -#ifndef GL_AMD_texture_gather_bias_lod -#define GL_AMD_texture_gather_bias_lod 1 -#endif /* GL_AMD_texture_gather_bias_lod */ - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 -#endif /* GL_AMD_texture_texture4 */ - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 -#endif /* GL_AMD_transform_feedback3_lines_triangles */ - -#ifndef GL_AMD_transform_feedback4 -#define GL_AMD_transform_feedback4 1 -#define GL_STREAM_RASTERIZATION_AMD 0x91A0 -#endif /* GL_AMD_transform_feedback4 */ - -#ifndef GL_AMD_vertex_shader_layer -#define GL_AMD_vertex_shader_layer 1 -#endif /* GL_AMD_vertex_shader_layer */ - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_AMD_vertex_shader_tessellator 1 -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 -typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); -GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); -#endif -#endif /* GL_AMD_vertex_shader_tessellator */ - -#ifndef GL_AMD_vertex_shader_viewport_index -#define GL_AMD_vertex_shader_viewport_index 1 -#endif /* GL_AMD_vertex_shader_viewport_index */ - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 -#endif /* GL_APPLE_aux_depth_stencil */ - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif /* GL_APPLE_client_storage */ - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif -#endif /* GL_APPLE_element_array */ - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); -#endif -#endif /* GL_APPLE_fence */ - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F -#endif /* GL_APPLE_float_pixels */ - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); -#endif -#endif /* GL_APPLE_flush_buffer_range */ - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D -typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif -#endif /* GL_APPLE_object_purgeable */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_RAW_422_APPLE 0x8A51 -#endif /* GL_APPLE_rgb_422 */ - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 -#endif /* GL_APPLE_row_bytes */ - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif /* GL_APPLE_specular_vector */ - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); -GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_APPLE_texture_range */ - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif /* GL_APPLE_transform_hint */ - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); -#endif -#endif /* GL_APPLE_vertex_array_object */ - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); -#endif -#endif /* GL_APPLE_vertex_array_range */ - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif -#endif /* GL_APPLE_vertex_program_evaluators */ - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#define GL_YCBCR_422_APPLE 0x85B9 -#endif /* GL_APPLE_ycbcr_422 */ - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_ATI_draw_buffers */ - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif -#endif /* GL_ATI_element_array */ - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); -#endif -#endif /* GL_ATI_envmap_bumpmap */ - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); -GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); -#endif -#endif /* GL_ATI_fragment_shader */ - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); -#endif -#endif /* GL_ATI_map_object_buffer */ - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD -#endif /* GL_ATI_meminfo */ - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif /* GL_ATI_pixel_format_float */ - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); -#endif -#endif /* GL_ATI_pn_triangles */ - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif -#endif /* GL_ATI_separate_stencil */ - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif /* GL_ATI_text_fragment_shader */ - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif /* GL_ATI_texture_env_combine3 */ - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif /* GL_ATI_texture_float */ - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif /* GL_ATI_texture_mirror_once */ - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); -#endif -#endif /* GL_ATI_vertex_array_object */ - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); -#endif -#endif /* GL_ATI_vertex_attrib_array_object */ - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); -GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); -GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); -#endif -#endif /* GL_ATI_vertex_streams */ - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif /* GL_EXT_422_pixels */ - -#ifndef GL_EXT_EGL_image_storage -#define GL_EXT_EGL_image_storage 1 -typedef void *GLeglImageOES; -typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); -typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); -GLAPI void APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#endif -#endif /* GL_EXT_EGL_image_storage */ - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#define GL_ABGR_EXT 0x8000 -#endif /* GL_EXT_abgr */ - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif /* GL_EXT_bgra */ - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); -typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); -GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); -GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); -#endif -#endif /* GL_EXT_bindable_uniform */ - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -#endif -#endif /* GL_EXT_blend_color */ - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); -#endif -#endif /* GL_EXT_blend_equation_separate */ - -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif -#endif /* GL_EXT_blend_func_separate */ - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif /* GL_EXT_blend_logic_op */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_BLEND_EQUATION_EXT 0x8009 -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); -#endif -#endif /* GL_EXT_blend_minmax */ - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif /* GL_EXT_blend_subtract */ - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif /* GL_EXT_clip_volume_hint */ - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif /* GL_EXT_cmyka */ - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif -#endif /* GL_EXT_color_subtable */ - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif -#endif /* GL_EXT_compiled_vertex_array */ - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); -#endif -#endif /* GL_EXT_convolution */ - -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); -GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); -GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); -GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); -#endif -#endif /* GL_EXT_coordinate_frame */ - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_EXT_copy_texture */ - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); -#endif -#endif /* GL_EXT_cull_vertex */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_EXT_debug_label */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 -typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); -GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); -GLAPI void APIENTRY glPopGroupMarkerEXT (void); -#endif -#endif /* GL_EXT_debug_marker */ - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); -#endif -#endif /* GL_EXT_depth_bounds_test */ - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); -typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); -typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); -typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); -typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); -GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); -GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); -GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); -GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); -GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); -GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); -GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); -GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); -GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); -#endif -#endif /* GL_EXT_direct_state_access */ - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -#endif -#endif /* GL_EXT_draw_buffers2 */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -#endif -#endif /* GL_EXT_draw_range_elements */ - -#ifndef GL_EXT_external_buffer -#define GL_EXT_external_buffer 1 -typedef void *GLeglClientBufferEXT; -typedef void (APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -GLAPI void APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -#endif -#endif /* GL_EXT_external_buffer */ - -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); -#endif -#endif /* GL_EXT_fog_coord */ - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_EXT_framebuffer_blit */ - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_EXT_framebuffer_multisample */ - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_EXT_framebuffer_multisample_blit_scaled 1 -#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA -#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB -#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); -#endif -#endif /* GL_EXT_framebuffer_object */ - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif /* GL_EXT_framebuffer_sRGB */ - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_LINES_ADJACENCY_EXT 0x000A -#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B -#define GL_TRIANGLES_ADJACENCY_EXT 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -#endif -#endif /* GL_EXT_geometry_shader4 */ - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif -#endif /* GL_EXT_gpu_program_parameters */ - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 -typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); -#endif -#endif /* GL_EXT_gpu_shader4 */ - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogramEXT (GLenum target); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); -#endif -#endif /* GL_EXT_histogram */ - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif /* GL_EXT_index_array_formats */ - -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); -#endif -#endif /* GL_EXT_index_func */ - -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); -#endif -#endif /* GL_EXT_index_material */ - -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif /* GL_EXT_index_texture */ - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); -GLAPI void APIENTRY glTextureLightEXT (GLenum pname); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); -#endif -#endif /* GL_EXT_light_texture */ - -#ifndef GL_EXT_memory_object -#define GL_EXT_memory_object 1 -#define GL_TEXTURE_TILING_EXT 0x9580 -#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 -#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B -#define GL_NUM_TILING_TYPES_EXT 0x9582 -#define GL_TILING_TYPES_EXT 0x9583 -#define GL_OPTIMAL_TILING_EXT 0x9584 -#define GL_LINEAR_TILING_EXT 0x9585 -#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 -#define GL_DEVICE_UUID_EXT 0x9597 -#define GL_DRIVER_UUID_EXT 0x9598 -#define GL_UUID_SIZE_EXT 16 -typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); -typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); -typedef void (APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); -typedef GLboolean (APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); -typedef void (APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); -typedef void (APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); -GLAPI void APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); -GLAPI void APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); -GLAPI GLboolean APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); -GLAPI void APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); -GLAPI void APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); -GLAPI void APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTexStorageMem1DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureStorageMem1DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); -#endif -#endif /* GL_EXT_memory_object */ - -#ifndef GL_EXT_memory_object_fd -#define GL_EXT_memory_object_fd 1 -#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 -typedef void (APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); -#endif -#endif /* GL_EXT_memory_object_fd */ - -#ifndef GL_EXT_memory_object_win32 -#define GL_EXT_memory_object_win32 1 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 -#define GL_DEVICE_LUID_EXT 0x9599 -#define GL_DEVICE_NODE_MASK_EXT 0x959A -#define GL_LUID_SIZE_EXT 8 -#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 -#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A -#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B -#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C -typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -GLAPI void APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); -#endif -#endif /* GL_EXT_memory_object_win32 */ - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif /* GL_EXT_misc_attribute */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#endif -#endif /* GL_EXT_multi_draw_arrays */ - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); -#endif -#endif /* GL_EXT_multisample */ - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 -#endif /* GL_EXT_packed_depth_stencil */ - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C -#endif /* GL_EXT_packed_float */ - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif /* GL_EXT_packed_pixels */ - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); -GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif -#endif /* GL_EXT_paletted_texture */ - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif /* GL_EXT_pixel_buffer_object */ - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif -#endif /* GL_EXT_pixel_transform */ - -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif /* GL_EXT_pixel_transform_color_table */ - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); -#endif -#endif /* GL_EXT_point_parameters */ - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); -#endif -#endif /* GL_EXT_polygon_offset */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B -typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); -#endif -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 -#endif /* GL_EXT_post_depth_coverage */ - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); -#endif -#endif /* GL_EXT_provoking_vertex */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); -#endif -#endif /* GL_EXT_raster_multisample */ - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif /* GL_EXT_rescale_normal */ - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); -#endif -#endif /* GL_EXT_secondary_color */ - -#ifndef GL_EXT_semaphore -#define GL_EXT_semaphore 1 -#define GL_LAYOUT_GENERAL_EXT 0x958D -#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E -#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F -#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 -#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 -#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 -#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 -#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 -#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 -typedef void (APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); -typedef void (APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); -typedef GLboolean (APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); -typedef void (APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); -typedef void (APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); -typedef void (APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); -typedef void (APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); -GLAPI void APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); -GLAPI GLboolean APIENTRY glIsSemaphoreEXT (GLuint semaphore); -GLAPI void APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); -GLAPI void APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); -GLAPI void APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); -GLAPI void APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -#endif -#endif /* GL_EXT_semaphore */ - -#ifndef GL_EXT_semaphore_fd -#define GL_EXT_semaphore_fd 1 -typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); -#endif -#endif /* GL_EXT_semaphore_fd */ - -#ifndef GL_EXT_semaphore_win32 -#define GL_EXT_semaphore_win32 1 -#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 -#define GL_D3D12_FENCE_VALUE_EXT 0x9595 -typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); -typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); -GLAPI void APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); -#endif -#endif /* GL_EXT_semaphore_win32 */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D -typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); -typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); -GLAPI void APIENTRY glActiveProgramEXT (GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); -#endif -#endif /* GL_EXT_separate_shader_objects */ - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif /* GL_EXT_separate_specular_color */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent -#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 -typedef void (APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferFetchBarrierEXT (void); -#endif -#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ - -#ifndef GL_EXT_shader_image_load_formatted -#define GL_EXT_shader_image_load_formatted 1 -#endif /* GL_EXT_shader_image_load_formatted */ - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); -#endif -#endif /* GL_EXT_shader_image_load_store */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 -#endif /* GL_EXT_shader_integer_mix */ - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif /* GL_EXT_shadow_funcs */ - -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif /* GL_EXT_shared_texture_palette */ - -#ifndef GL_EXT_sparse_texture2 -#define GL_EXT_sparse_texture2 1 -#endif /* GL_EXT_sparse_texture2 */ - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 -typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif -#endif /* GL_EXT_stencil_clear_tag */ - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); -#endif -#endif /* GL_EXT_stencil_two_side */ - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif /* GL_EXT_stencil_wrap */ - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -#endif -#endif /* GL_EXT_subtexture */ - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif /* GL_EXT_texture */ - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -#endif -#endif /* GL_EXT_texture3D */ - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif -#endif /* GL_EXT_texture_array */ - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -#endif -#endif /* GL_EXT_texture_buffer_object */ - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif /* GL_EXT_texture_compression_latc */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif /* GL_EXT_texture_compression_rgtc */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_cube_map -#define GL_EXT_texture_cube_map 1 -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif /* GL_EXT_texture_cube_map */ - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif /* GL_EXT_texture_env_add */ - -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif /* GL_EXT_texture_env_combine */ - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif /* GL_EXT_texture_env_dot3 */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif /* GL_EXT_texture_filter_anisotropic */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 -#endif /* GL_EXT_texture_filter_minmax */ - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif -#endif /* GL_EXT_texture_integer */ - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif /* GL_EXT_texture_lod_bias */ - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif /* GL_EXT_texture_mirror_clamp */ - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif -#endif /* GL_EXT_texture_object */ - -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); -#endif -#endif /* GL_EXT_texture_perturb_normal */ - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif /* GL_EXT_texture_sRGB */ - -#ifndef GL_EXT_texture_sRGB_R8 -#define GL_EXT_texture_sRGB_R8 1 -#define GL_SR8_EXT 0x8FBD -#endif /* GL_EXT_texture_sRGB_R8 */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif /* GL_EXT_texture_sRGB_decode */ - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif /* GL_EXT_texture_shared_exponent */ - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#endif /* GL_EXT_texture_snorm */ - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif /* GL_EXT_texture_swizzle */ - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 -#define GL_TIME_ELAPSED_EXT 0x88BF -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); -#endif -#endif /* GL_EXT_timer_query */ - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackEXT (void); -GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif -#endif /* GL_EXT_transform_feedback */ - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint i); -GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); -GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); -GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); -#endif -#endif /* GL_EXT_vertex_array */ - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 -#endif /* GL_EXT_vertex_array_bgra */ - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); -#endif -#endif /* GL_EXT_vertex_attrib_64bit */ - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); -GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); -GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); -GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); -GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); -GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); -GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); -GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); -GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); -GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); -GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); -GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -#endif -#endif /* GL_EXT_vertex_shader */ - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); -#endif -#endif /* GL_EXT_vertex_weighting */ - -#ifndef GL_EXT_win32_keyed_mutex -#define GL_EXT_win32_keyed_mutex 1 -typedef GLboolean (APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); -typedef GLboolean (APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); -GLAPI GLboolean APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); -#endif -#endif /* GL_EXT_win32_keyed_mutex */ - -#ifndef GL_EXT_window_rectangles -#define GL_EXT_window_rectangles 1 -#define GL_INCLUSIVE_EXT 0x8F10 -#define GL_EXCLUSIVE_EXT 0x8F11 -#define GL_WINDOW_RECTANGLE_EXT 0x8F12 -#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 -#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 -#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 -typedef void (APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); -#endif -#endif /* GL_EXT_window_rectangles */ - -#ifndef GL_EXT_x11_sync_object -#define GL_EXT_x11_sync_object 1 -#define GL_SYNC_X11_FENCE_EXT 0x90E1 -typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); -#endif -#endif /* GL_EXT_x11_sync_object */ - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 -typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); -#endif -#endif /* GL_GREMEDY_frame_terminator */ - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); -#endif -#endif /* GL_GREMEDY_string_marker */ - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif /* GL_HP_convolution_border_modes */ - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); -#endif -#endif /* GL_HP_image_transform */ - -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif /* GL_HP_occlusion_test */ - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif /* GL_HP_texture_lighting */ - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#define GL_CULL_VERTEX_IBM 103050 -#endif /* GL_IBM_cull_vertex */ - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); -#endif -#endif /* GL_IBM_multimode_draw_arrays */ - -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif /* GL_IBM_rasterpos_clip */ - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 -typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); -#endif -#endif /* GL_IBM_static_data */ - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 -#define GL_MIRRORED_REPEAT_IBM 0x8370 -#endif /* GL_IBM_texture_mirrored_repeat */ - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); -#endif -#endif /* GL_IBM_vertex_array_lists */ - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif -#endif /* GL_INGR_blend_func_separate */ - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif /* GL_INGR_color_clamp */ - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#define GL_INTERLACE_READ_INGR 0x8568 -#endif /* GL_INGR_interlace_read */ - -#ifndef GL_INTEL_blackhole_render -#define GL_INTEL_blackhole_render 1 -#define GL_BLACKHOLE_RENDER_INTEL 0x83FC -#endif /* GL_INTEL_blackhole_render */ - -#ifndef GL_INTEL_conservative_rasterization -#define GL_INTEL_conservative_rasterization 1 -#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE -#endif /* GL_INTEL_conservative_rasterization */ - -#ifndef GL_INTEL_fragment_shader_ordering -#define GL_INTEL_fragment_shader_ordering 1 -#endif /* GL_INTEL_fragment_shader_ordering */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 -typedef void (APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); -#endif -#endif /* GL_INTEL_framebuffer_CMAA */ - -#ifndef GL_INTEL_map_texture -#define GL_INTEL_map_texture 1 -#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF -#define GL_LAYOUT_DEFAULT_INTEL 0 -#define GL_LAYOUT_LINEAR_INTEL 1 -#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 -typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); -typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); -GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); -GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); -#endif -#endif /* GL_INTEL_map_texture */ - -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); -GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); -#endif -#endif /* GL_INTEL_parallel_arrays */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 -typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); -typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); -typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); -typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); -typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); -GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); -GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); -GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); -GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); -GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#endif -#endif /* GL_INTEL_performance_query */ - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E -#endif /* GL_MESAX_texture_stack */ - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#define GL_PACK_INVERT_MESA 0x8758 -#endif /* GL_MESA_pack_invert */ - -#ifndef GL_MESA_program_binary_formats -#define GL_MESA_program_binary_formats 1 -#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F -#endif /* GL_MESA_program_binary_formats */ - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif -#endif /* GL_MESA_resize_buffers */ - -#ifndef GL_MESA_shader_integer_functions -#define GL_MESA_shader_integer_functions 1 -#endif /* GL_MESA_shader_integer_functions */ - -#ifndef GL_MESA_tile_raster_order -#define GL_MESA_tile_raster_order 1 -#define GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8 -#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9 -#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA -#endif /* GL_MESA_tile_raster_order */ - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); -#endif -#endif /* GL_MESA_window_pos */ - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif /* GL_MESA_ycbcr_texture */ - -#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers -#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 -#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ - -#ifndef GL_NVX_conditional_render -#define GL_NVX_conditional_render 1 -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); -GLAPI void APIENTRY glEndConditionalRenderNVX (void); -#endif -#endif /* GL_NVX_conditional_render */ - -#ifndef GL_NVX_gpu_memory_info -#define GL_NVX_gpu_memory_info 1 -#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 -#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 -#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 -#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A -#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B -#endif /* GL_NVX_gpu_memory_info */ - -#ifndef GL_NVX_linked_gpu_multicast -#define GL_NVX_linked_gpu_multicast 1 -#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 -#define GL_MAX_LGPU_GPUS_NVX 0x92BA -typedef void (APIENTRYP PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLLGPUINTERLOCKNVXPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLGPUNamedBufferSubDataNVX (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glLGPUCopyImageSubDataNVX (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glLGPUInterlockNVX (void); -#endif -#endif /* GL_NVX_linked_gpu_multicast */ - -#ifndef GL_NV_alpha_to_coverage_dither_control -#define GL_NV_alpha_to_coverage_dither_control 1 -#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D -#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E -#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F -#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF -typedef void (APIENTRYP PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAlphaToCoverageDitherControlNV (GLenum mode); -#endif -#endif /* GL_NV_alpha_to_coverage_dither_control */ - -#ifndef GL_NV_bindless_multi_draw_indirect -#define GL_NV_bindless_multi_draw_indirect 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); -#endif -#endif /* GL_NV_bindless_multi_draw_indirect */ - -#ifndef GL_NV_bindless_multi_draw_indirect_count -#define GL_NV_bindless_multi_draw_indirect_count 1 -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); -#endif -#endif /* GL_NV_bindless_multi_draw_indirect_count */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 -typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); -GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); -GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); -GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); -GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); -GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); -GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); -GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); -GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); -GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); -#endif -#endif /* GL_NV_bindless_texture */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLUE_NV 0x1905 -#define GL_COLORBURN_NV 0x929A -#define GL_COLORDODGE_NV 0x9299 -#define GL_CONJOINT_NV 0x9284 -#define GL_CONTRAST_NV 0x92A1 -#define GL_DARKEN_NV 0x9297 -#define GL_DIFFERENCE_NV 0x929E -#define GL_DISJOINT_NV 0x9283 -#define GL_DST_ATOP_NV 0x928F -#define GL_DST_IN_NV 0x928B -#define GL_DST_NV 0x9287 -#define GL_DST_OUT_NV 0x928D -#define GL_DST_OVER_NV 0x9289 -#define GL_EXCLUSION_NV 0x92A0 -#define GL_GREEN_NV 0x1904 -#define GL_HARDLIGHT_NV 0x929B -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_INVERT_OVG_NV 0x92B4 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LIGHTEN_NV 0x9298 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_MINUS_NV 0x929F -#define GL_MULTIPLY_NV 0x9294 -#define GL_OVERLAY_NV 0x9296 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_PLUS_NV 0x9291 -#define GL_RED_NV 0x1903 -#define GL_SCREEN_NV 0x9295 -#define GL_SOFTLIGHT_NV 0x929C -#define GL_SRC_ATOP_NV 0x928E -#define GL_SRC_IN_NV 0x928A -#define GL_SRC_NV 0x9286 -#define GL_SRC_OUT_NV 0x928C -#define GL_SRC_OVER_NV 0x9288 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_XOR_NV 0x1506 -typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); -GLAPI void APIENTRY glBlendBarrierNV (void); -#endif -#endif /* GL_NV_blend_equation_advanced */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#endif /* GL_NV_blend_equation_advanced_coherent */ - -#ifndef GL_NV_blend_minmax_factor -#define GL_NV_blend_minmax_factor 1 -#endif /* GL_NV_blend_minmax_factor */ - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif /* GL_NV_blend_square */ - -#ifndef GL_NV_clip_space_w_scaling -#define GL_NV_clip_space_w_scaling 1 -#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C -#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D -#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E -typedef void (APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#endif -#endif /* GL_NV_clip_space_w_scaling */ - -#ifndef GL_NV_command_list -#define GL_NV_command_list 1 -#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 -#define GL_NOP_COMMAND_NV 0x0001 -#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 -#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 -#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 -#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 -#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 -#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 -#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 -#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 -#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A -#define GL_BLEND_COLOR_COMMAND_NV 0x000B -#define GL_STENCIL_REF_COMMAND_NV 0x000C -#define GL_LINE_WIDTH_COMMAND_NV 0x000D -#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E -#define GL_ALPHA_REF_COMMAND_NV 0x000F -#define GL_VIEWPORT_COMMAND_NV 0x0010 -#define GL_SCISSOR_COMMAND_NV 0x0011 -#define GL_FRONT_FACE_COMMAND_NV 0x0012 -typedef void (APIENTRYP PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint *states); -typedef void (APIENTRYP PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint *states); -typedef GLboolean (APIENTRYP PFNGLISSTATENVPROC) (GLuint state); -typedef void (APIENTRYP PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); -typedef GLuint (APIENTRYP PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); -typedef GLushort (APIENTRYP PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint *lists); -typedef void (APIENTRYP PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint *lists); -typedef GLboolean (APIENTRYP PFNGLISCOMMANDLISTNVPROC) (GLuint list); -typedef void (APIENTRYP PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -typedef void (APIENTRYP PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); -typedef void (APIENTRYP PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); -typedef void (APIENTRYP PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCreateStatesNV (GLsizei n, GLuint *states); -GLAPI void APIENTRY glDeleteStatesNV (GLsizei n, const GLuint *states); -GLAPI GLboolean APIENTRY glIsStateNV (GLuint state); -GLAPI void APIENTRY glStateCaptureNV (GLuint state, GLenum mode); -GLAPI GLuint APIENTRY glGetCommandHeaderNV (GLenum tokenID, GLuint size); -GLAPI GLushort APIENTRY glGetStageIndexNV (GLenum shadertype); -GLAPI void APIENTRY glDrawCommandsNV (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); -GLAPI void APIENTRY glDrawCommandsAddressNV (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); -GLAPI void APIENTRY glDrawCommandsStatesNV (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glDrawCommandsStatesAddressNV (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glCreateCommandListsNV (GLsizei n, GLuint *lists); -GLAPI void APIENTRY glDeleteCommandListsNV (GLsizei n, const GLuint *lists); -GLAPI GLboolean APIENTRY glIsCommandListNV (GLuint list); -GLAPI void APIENTRY glListDrawCommandsStatesClientNV (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); -GLAPI void APIENTRY glCommandListSegmentsNV (GLuint list, GLuint segments); -GLAPI void APIENTRY glCompileCommandListNV (GLuint list); -GLAPI void APIENTRY glCallCommandListNV (GLuint list); -#endif -#endif /* GL_NV_command_list */ - -#ifndef GL_NV_compute_program5 -#define GL_NV_compute_program5 1 -#define GL_COMPUTE_PROGRAM_NV 0x90FB -#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC -#endif /* GL_NV_compute_program5 */ - -#ifndef GL_NV_compute_shader_derivatives -#define GL_NV_compute_shader_derivatives 1 -#endif /* GL_NV_compute_shader_derivatives */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRenderNV (void); -#endif -#endif /* GL_NV_conditional_render */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 -typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); -#endif -#endif /* GL_NV_conservative_raster */ - -#ifndef GL_NV_conservative_raster_dilate -#define GL_NV_conservative_raster_dilate 1 -#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 -#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A -#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B -typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConservativeRasterParameterfNV (GLenum pname, GLfloat value); -#endif -#endif /* GL_NV_conservative_raster_dilate */ - -#ifndef GL_NV_conservative_raster_pre_snap -#define GL_NV_conservative_raster_pre_snap 1 -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 -#endif /* GL_NV_conservative_raster_pre_snap */ - -#ifndef GL_NV_conservative_raster_pre_snap_triangles -#define GL_NV_conservative_raster_pre_snap_triangles 1 -#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D -#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F -typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); -#endif -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -#ifndef GL_NV_conservative_raster_underestimation -#define GL_NV_conservative_raster_underestimation 1 -#endif /* GL_NV_conservative_raster_underestimation */ - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F -#endif /* GL_NV_copy_depth_to_color */ - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif -#endif /* GL_NV_copy_image */ - -#ifndef GL_NV_deep_texture3D -#define GL_NV_deep_texture3D 1 -#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 -#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 -#endif /* GL_NV_deep_texture3D */ - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); -GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); -#endif -#endif /* GL_NV_depth_buffer_float */ - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#define GL_DEPTH_CLAMP_NV 0x864F -#endif /* GL_NV_depth_clamp */ - -#ifndef GL_NV_draw_texture -#define GL_NV_draw_texture 1 -typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -#endif -#endif /* GL_NV_draw_texture */ - -#ifndef GL_NV_draw_vulkan_image -#define GL_NV_draw_vulkan_image 1 -typedef void (APIENTRY *GLVULKANPROCNV)(void); -typedef void (APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -typedef GLVULKANPROCNV (APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); -typedef void (APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -GLAPI GLVULKANPROCNV APIENTRY glGetVkProcAddrNV (const GLchar *name); -GLAPI void APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); -GLAPI void APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); -GLAPI void APIENTRY glSignalVkFenceNV (GLuint64 vkFence); -#endif -#endif /* GL_NV_draw_vulkan_image */ - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); -GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); -#endif -#endif /* GL_NV_evaluators */ - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); -GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); -#endif -#endif /* GL_NV_explicit_multisample */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); -GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); -GLAPI void APIENTRY glFinishFenceNV (GLuint fence); -GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif -#endif /* GL_NV_fence */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 -#define GL_FILL_RECTANGLE_NV 0x933C -#endif /* GL_NV_fill_rectangle */ - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#define GL_FLOAT_R_NV 0x8880 -#define GL_FLOAT_RG_NV 0x8881 -#define GL_FLOAT_RGB_NV 0x8882 -#define GL_FLOAT_RGBA_NV 0x8883 -#define GL_FLOAT_R16_NV 0x8884 -#define GL_FLOAT_R32_NV 0x8885 -#define GL_FLOAT_RG16_NV 0x8886 -#define GL_FLOAT_RG32_NV 0x8887 -#define GL_FLOAT_RGB16_NV 0x8888 -#define GL_FLOAT_RGB32_NV 0x8889 -#define GL_FLOAT_RGBA16_NV 0x888A -#define GL_FLOAT_RGBA32_NV 0x888B -#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C -#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D -#define GL_FLOAT_RGBA_MODE_NV 0x888E -#endif /* GL_NV_float_buffer */ - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -#endif /* GL_NV_fog_distance */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE -typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); -#endif -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif -#endif /* GL_NV_fragment_program */ - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif /* GL_NV_fragment_program2 */ - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 -#endif /* GL_NV_fragment_program4 */ - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif /* GL_NV_fragment_program_option */ - -#ifndef GL_NV_fragment_shader_barycentric -#define GL_NV_fragment_shader_barycentric 1 -#endif /* GL_NV_fragment_shader_barycentric */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 -#endif /* GL_NV_fragment_shader_interlock */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 -typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); -typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); -typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); -GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); -GLAPI void APIENTRY glCoverageModulationNV (GLenum components); -#endif -#endif /* GL_NV_framebuffer_mixed_samples */ - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_NV_framebuffer_multisample_coverage */ - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); -GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif -#endif /* GL_NV_geometry_program4 */ - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 -#endif /* GL_NV_geometry_shader4 */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 -#endif /* GL_NV_geometry_shader_passthrough */ - -#ifndef GL_NV_gpu_multicast -#define GL_NV_gpu_multicast 1 -#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 -#define GL_MULTICAST_GPUS_NV 0x92BA -#define GL_RENDER_GPU_MASK_NV 0x9558 -#define GL_PER_GPU_STORAGE_NV 0x9548 -#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 -typedef void (APIENTRYP PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -typedef void (APIENTRYP PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (APIENTRYP PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTICASTBARRIERNVPROC) (void); -typedef void (APIENTRYP PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); -typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderGpuMaskNV (GLbitfield mask); -GLAPI void APIENTRY glMulticastBufferSubDataNV (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI void APIENTRY glMulticastCopyBufferSubDataNV (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glMulticastCopyImageSubDataNV (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -GLAPI void APIENTRY glMulticastBlitFramebufferNV (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glMulticastFramebufferSampleLocationsfvNV (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glMulticastBarrierNV (void); -GLAPI void APIENTRY glMulticastWaitSyncNV (GLuint signalGpu, GLbitfield waitGpuMask); -GLAPI void APIENTRY glMulticastGetQueryObjectivNV (GLuint gpu, GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glMulticastGetQueryObjectuivNV (GLuint gpu, GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMulticastGetQueryObjecti64vNV (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glMulticastGetQueryObjectui64vNV (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); -#endif -#endif /* GL_NV_gpu_multicast */ - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 -#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 -#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 -#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 -#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 -#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 -#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); -#endif -#endif /* GL_NV_gpu_program4 */ - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 -#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C -#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F -#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 -#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 -typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); -#endif -#endif /* GL_NV_gpu_program5 */ - -#ifndef GL_NV_gpu_program5_mem_extended -#define GL_NV_gpu_program5_mem_extended 1 -#endif /* GL_NV_gpu_program5_mem_extended */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -#endif /* GL_NV_gpu_shader5 */ - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -typedef unsigned short GLhalfNV; -#define GL_HALF_FLOAT_NV 0x140B -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -#endif -#endif /* GL_NV_half_float */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 -typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_NV_internalformat_sample_query */ - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif /* GL_NV_light_max_exponent */ - -#ifndef GL_NV_memory_attachment -#define GL_NV_memory_attachment 1 -#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 -#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 -#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 -#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 -#define GL_MEMORY_ATTACHABLE_NV 0x95A8 -#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 -#define GL_DETACHED_TEXTURES_NV 0x95AA -#define GL_DETACHED_BUFFERS_NV 0x95AB -#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC -#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD -typedef void (APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -typedef void (APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); -typedef void (APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); -typedef void (APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -GLAPI void APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); -GLAPI void APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); -GLAPI void APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); -#endif -#endif /* GL_NV_memory_attachment */ - -#ifndef GL_NV_mesh_shader -#define GL_NV_mesh_shader 1 -#define GL_MESH_SHADER_NV 0x9559 -#define GL_TASK_SHADER_NV 0x955A -#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 -#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 -#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 -#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 -#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 -#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 -#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 -#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 -#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 -#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 -#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A -#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B -#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C -#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D -#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E -#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F -#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 -#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 -#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 -#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 -#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 -#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 -#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A -#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D -#define GL_MAX_MESH_VIEWS_NV 0x9557 -#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF -#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 -#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B -#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C -#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E -#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F -#define GL_MESH_VERTICES_OUT_NV 0x9579 -#define GL_MESH_PRIMITIVES_OUT_NV 0x957A -#define GL_MESH_OUTPUT_TYPE_NV 0x957B -#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C -#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F -#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 -#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 -#define GL_MESH_SUBROUTINE_NV 0x957C -#define GL_TASK_SUBROUTINE_NV 0x957D -#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E -#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F -#define GL_MESH_SHADER_BIT_NV 0x00000040 -#define GL_TASK_SHADER_BIT_NV 0x00000080 -typedef void (APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); -typedef void (APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); -typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); -GLAPI void APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); -GLAPI void APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -#endif -#endif /* GL_NV_mesh_shader */ - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 -#endif /* GL_NV_multisample_coverage */ - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 -#endif /* GL_NV_multisample_filter_hint */ - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); -#endif -#endif /* GL_NV_occlusion_query */ - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA -#endif /* GL_NV_packed_depth_stencil */ - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); -#endif -#endif /* GL_NV_parameter_buffer_object */ - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 -#endif /* GL_NV_parameter_buffer_object2 */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_CLOSE_PATH_NV 0x00 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_BOLD_BIT_NV 0x01 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_2_BYTES_NV 0x1407 -#define GL_3_BYTES_NV 0x1408 -#define GL_4_BYTES_NV 0x1409 -#define GL_EYE_LINEAR_NV 0x2400 -#define GL_OBJECT_LINEAR_NV 0x2401 -#define GL_CONSTANT_NV 0x8576 -#define GL_PATH_FOG_GEN_MODE_NV 0x90AC -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 -#define GL_PATH_PROJECTION_NV 0x1701 -#define GL_PATH_MODELVIEW_NV 0x1700 -#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 -#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 -#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 -#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 -#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 -#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 -#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 -#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 -#define GL_FRAGMENT_INPUT_NV 0x936D -typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); -typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); -typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); -typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); -typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); -typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); -typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); -typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); -typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); -GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); -GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); -GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); -GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); -GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); -GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); -GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); -GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); -GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); -GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); -GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); -GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); -GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); -GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); -GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); -GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); -GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); -GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); -GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); -GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); -GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); -GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); -GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); -GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); -#endif -#endif /* GL_NV_path_rendering */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 -#define GL_SHARED_EDGE_NV 0xC0 -#endif /* GL_NV_path_rendering_shared_edge */ - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); -#endif -#endif /* GL_NV_pixel_data_range */ - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); -#endif -#endif /* GL_NV_point_sprite */ - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B -typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif -#endif /* GL_NV_present_video */ - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); -#endif -#endif /* GL_NV_primitive_restart */ - -#ifndef GL_NV_query_resource -#define GL_NV_query_resource 1 -#define GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV 0x9540 -#define GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV 0x9542 -#define GL_QUERY_RESOURCE_SYS_RESERVED_NV 0x9544 -#define GL_QUERY_RESOURCE_TEXTURE_NV 0x9545 -#define GL_QUERY_RESOURCE_RENDERBUFFER_NV 0x9546 -#define GL_QUERY_RESOURCE_BUFFEROBJECT_NV 0x9547 -typedef GLint (APIENTRYP PFNGLQUERYRESOURCENVPROC) (GLenum queryType, GLint tagId, GLuint bufSize, GLint *buffer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glQueryResourceNV (GLenum queryType, GLint tagId, GLuint bufSize, GLint *buffer); -#endif -#endif /* GL_NV_query_resource */ - -#ifndef GL_NV_query_resource_tag -#define GL_NV_query_resource_tag 1 -typedef void (APIENTRYP PFNGLGENQUERYRESOURCETAGNVPROC) (GLsizei n, GLint *tagIds); -typedef void (APIENTRYP PFNGLDELETEQUERYRESOURCETAGNVPROC) (GLsizei n, const GLint *tagIds); -typedef void (APIENTRYP PFNGLQUERYRESOURCETAGNVPROC) (GLint tagId, const GLchar *tagString); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueryResourceTagNV (GLsizei n, GLint *tagIds); -GLAPI void APIENTRY glDeleteQueryResourceTagNV (GLsizei n, const GLint *tagIds); -GLAPI void APIENTRY glQueryResourceTagNV (GLint tagId, const GLchar *tagString); -#endif -#endif /* GL_NV_query_resource_tag */ - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); -#endif -#endif /* GL_NV_register_combiners */ - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); -#endif -#endif /* GL_NV_register_combiners2 */ - -#ifndef GL_NV_representative_fragment_test -#define GL_NV_representative_fragment_test 1 -#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F -#endif /* GL_NV_representative_fragment_test */ - -#ifndef GL_NV_robustness_video_memory_purge -#define GL_NV_robustness_video_memory_purge 1 -#define GL_PURGED_CONTEXT_RESET_NV 0x92BB -#endif /* GL_NV_robustness_video_memory_purge */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 -typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glResolveDepthValuesNV (void); -#endif -#endif /* GL_NV_sample_locations */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 -#endif /* GL_NV_sample_mask_override_coverage */ - -#ifndef GL_NV_scissor_exclusive -#define GL_NV_scissor_exclusive 1 -#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 -#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 -typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); -#endif -#endif /* GL_NV_scissor_exclusive */ - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 -#endif /* GL_NV_shader_atomic_counters */ - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 -#endif /* GL_NV_shader_atomic_float */ - -#ifndef GL_NV_shader_atomic_float64 -#define GL_NV_shader_atomic_float64 1 -#endif /* GL_NV_shader_atomic_float64 */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 -#endif /* GL_NV_shader_atomic_fp16_vector */ - -#ifndef GL_NV_shader_atomic_int64 -#define GL_NV_shader_atomic_int64 1 -#endif /* GL_NV_shader_atomic_int64 */ - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 -typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); -typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); -GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); -GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); -GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); -GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); -GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); -GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); -GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); -GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); -GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif -#endif /* GL_NV_shader_buffer_load */ - -#ifndef GL_NV_shader_buffer_store -#define GL_NV_shader_buffer_store 1 -#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 -#endif /* GL_NV_shader_buffer_store */ - -#ifndef GL_NV_shader_storage_buffer_object -#define GL_NV_shader_storage_buffer_object 1 -#endif /* GL_NV_shader_storage_buffer_object */ - -#ifndef GL_NV_shader_texture_footprint -#define GL_NV_shader_texture_footprint 1 -#endif /* GL_NV_shader_texture_footprint */ - -#ifndef GL_NV_shader_thread_group -#define GL_NV_shader_thread_group 1 -#define GL_WARP_SIZE_NV 0x9339 -#define GL_WARPS_PER_SM_NV 0x933A -#define GL_SM_COUNT_NV 0x933B -#endif /* GL_NV_shader_thread_group */ - -#ifndef GL_NV_shader_thread_shuffle -#define GL_NV_shader_thread_shuffle 1 -#endif /* GL_NV_shader_thread_shuffle */ - -#ifndef GL_NV_shading_rate_image -#define GL_NV_shading_rate_image 1 -#define GL_SHADING_RATE_IMAGE_NV 0x9563 -#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 -#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 -#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 -#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 -#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A -#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B -#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C -#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D -#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E -#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F -#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B -#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C -#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D -#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E -#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F -#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE -#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF -#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 -typedef void (APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); -typedef void (APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); -typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); -typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); -typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindShadingRateImageNV (GLuint texture); -GLAPI void APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); -GLAPI void APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); -GLAPI void APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); -GLAPI void APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); -GLAPI void APIENTRY glShadingRateSampleOrderNV (GLenum order); -GLAPI void APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); -#endif -#endif /* GL_NV_shading_rate_image */ - -#ifndef GL_NV_stereo_view_rendering -#define GL_NV_stereo_view_rendering 1 -#endif /* GL_NV_stereo_view_rendering */ - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 -#endif /* GL_NV_tessellation_program5 */ - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif /* GL_NV_texgen_emboss */ - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif /* GL_NV_texgen_reflection */ - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 -typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureBarrierNV (void); -#endif -#endif /* GL_NV_texture_barrier */ - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif /* GL_NV_texture_compression_vtc */ - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif /* GL_NV_texture_env_combine4 */ - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif /* GL_NV_texture_expand_normal */ - -#ifndef GL_NV_texture_multisample -#define GL_NV_texture_multisample 1 -#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 -#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -#endif -#endif /* GL_NV_texture_multisample */ - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 -#endif /* GL_NV_texture_rectangle */ - -#ifndef GL_NV_texture_rectangle_compressed -#define GL_NV_texture_rectangle_compressed 1 -#endif /* GL_NV_texture_rectangle_compressed */ - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif /* GL_NV_texture_shader */ - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif /* GL_NV_texture_shader2 */ - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif /* GL_NV_texture_shader3 */ - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#define GL_LAYER_NV 0x8DAA -#define GL_NEXT_BUFFER_NV -2 -#define GL_SKIP_COMPONENTS4_NV -3 -#define GL_SKIP_COMPONENTS3_NV -4 -#define GL_SKIP_COMPONENTS2_NV -5 -#define GL_SKIP_COMPONENTS1_NV -6 -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackNV (void); -GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); -GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); -GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); -GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif -#endif /* GL_NV_transform_feedback */ - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedbackNV (void); -GLAPI void APIENTRY glResumeTransformFeedbackNV (void); -GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); -#endif -#endif /* GL_NV_transform_feedback2 */ - -#ifndef GL_NV_uniform_buffer_unified_memory -#define GL_NV_uniform_buffer_unified_memory 1 -#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E -#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F -#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 -#endif /* GL_NV_uniform_buffer_unified_memory */ - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 -typedef GLintptr GLvdpauSurfaceNV; -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE -typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); -typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); -GLAPI void APIENTRY glVDPAUFiniNV (void); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); -GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif -#endif /* GL_NV_vdpau_interop */ - -#ifndef GL_NV_vdpau_interop2 -#define GL_NV_vdpau_interop2 1 -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceWithPictureStructureNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); -#endif -#endif /* GL_NV_vdpau_interop2 */ - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); -#endif -#endif /* GL_NV_vertex_array_range */ - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif /* GL_NV_vertex_array_range2 */ - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); -GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif -#endif /* GL_NV_vertex_attrib_integer_64bit */ - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 -typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); -GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); -#endif -#endif /* GL_NV_vertex_buffer_unified_memory */ - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); -GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); -GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); -GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); -#endif -#endif /* GL_NV_vertex_program */ - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif /* GL_NV_vertex_program1_1 */ - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif /* GL_NV_vertex_program2 */ - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif /* GL_NV_vertex_program2_option */ - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif /* GL_NV_vertex_program3 */ - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); -#endif -#endif /* GL_NV_vertex_program4 */ - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C -typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif -#endif /* GL_NV_video_capture */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 -#endif /* GL_NV_viewport_array2 */ - -#ifndef GL_NV_viewport_swizzle -#define GL_NV_viewport_swizzle 1 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 -#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 -#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 -#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A -#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B -typedef void (APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#endif -#endif /* GL_NV_viewport_swizzle */ - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif /* GL_OML_interlace */ - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif /* GL_OML_resample */ - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif /* GL_OML_subsample */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#endif -#endif /* GL_OVR_multiview */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 -#endif /* GL_OVR_multiview2 */ - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); -#endif -#endif /* GL_PGI_misc_hints */ - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#endif /* GL_PGI_vertex_hints */ - -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif /* GL_REND_screen_coordinates */ - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 -#endif /* GL_S3_s3tc */ - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); -#endif -#endif /* GL_SGIS_detail_texture */ - -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); -#endif -#endif /* GL_SGIS_fog_function */ - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif /* GL_SGIS_generate_mipmap */ - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); -#endif -#endif /* GL_SGIS_multisample */ - -#ifndef GL_SGIS_pixel_texture -#define GL_SGIS_pixel_texture 1 -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); -GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); -#endif -#endif /* GL_SGIS_pixel_texture */ - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif /* GL_SGIS_point_line_texgen */ - -#ifndef GL_SGIS_point_parameters -#define GL_SGIS_point_parameters 1 -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); -#endif -#endif /* GL_SGIS_point_parameters */ - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); -#endif -#endif /* GL_SGIS_sharpen_texture */ - -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); -#endif -#endif /* GL_SGIS_texture4D */ - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif /* GL_SGIS_texture_border_clamp */ - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif -#endif /* GL_SGIS_texture_color_mask */ - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif /* GL_SGIS_texture_edge_clamp */ - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif -#endif /* GL_SGIS_texture_filter4 */ - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif /* GL_SGIS_texture_lod */ - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif /* GL_SGIS_texture_select */ - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 -#define GL_ASYNC_MARKER_SGIX 0x8329 -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); -#endif -#endif /* GL_SGIX_async */ - -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif /* GL_SGIX_async_histogram */ - -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif /* GL_SGIX_async_pixel */ - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif /* GL_SGIX_blend_alpha_minmax */ - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_SGIX_calligraphic_fragment 1 -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif /* GL_SGIX_calligraphic_fragment */ - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif /* GL_SGIX_clipmap */ - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif /* GL_SGIX_convolution_accuracy */ - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif /* GL_SGIX_depth_pass_instrument */ - -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif /* GL_SGIX_depth_texture */ - -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif -#endif /* GL_SGIX_flush_raster */ - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif /* GL_SGIX_fog_offset */ - -#ifndef GL_SGIX_fragment_lighting -#define GL_SGIX_fragment_lighting 1 -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); -GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); -GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); -GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); -GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); -GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); -#endif -#endif /* GL_SGIX_fragment_lighting */ - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); -#endif -#endif /* GL_SGIX_framezoom */ - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); -#endif -#endif /* GL_SGIX_igloo_interface */ - -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); -#endif -#endif /* GL_SGIX_instruments */ - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#define GL_INTERLACE_SGIX 0x8094 -#endif /* GL_SGIX_interlace */ - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif /* GL_SGIX_ir_instrument1 */ - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#define GL_LIST_PRIORITY_SGIX 0x8182 -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); -GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); -GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); -#endif -#endif /* GL_SGIX_list_priority */ - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); -#endif -#endif /* GL_SGIX_pixel_texture */ - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif /* GL_SGIX_pixel_tiles */ - -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); -#endif -#endif /* GL_SGIX_polynomial_ffd */ - -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); -#endif -#endif /* GL_SGIX_reference_plane */ - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#define GL_PACK_RESAMPLE_SGIX 0x842E -#define GL_UNPACK_RESAMPLE_SGIX 0x842F -#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 -#endif /* GL_SGIX_resample */ - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#define GL_SCALEBIAS_HINT_SGIX 0x8322 -#endif /* GL_SGIX_scalebias_hint */ - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif /* GL_SGIX_shadow */ - -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif /* GL_SGIX_shadow_ambient */ - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); -#endif -#endif /* GL_SGIX_sprite */ - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif /* GL_SGIX_subsample */ - -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif -#endif /* GL_SGIX_tag_sample_buffer */ - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif /* GL_SGIX_texture_add_env */ - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B -#endif /* GL_SGIX_texture_coordinate_clamp */ - -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif /* GL_SGIX_texture_lod_bias */ - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif /* GL_SGIX_texture_multi_buffer */ - -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif /* GL_SGIX_texture_scale_bias */ - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif /* GL_SGIX_vertex_preclip */ - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif /* GL_SGIX_ycrcb */ - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif /* GL_SGIX_ycrcb_subsample */ - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif /* GL_SGIX_ycrcba */ - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif /* GL_SGI_color_matrix */ - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); -#endif -#endif /* GL_SGI_color_table */ - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif /* GL_SGI_texture_color_table */ - -#ifndef GL_SUNX_constant_data -#define GL_SUNX_constant_data 1 -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif -#endif /* GL_SUNX_constant_data */ - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif /* GL_SUN_convolution_border_modes */ - -#ifndef GL_SUN_global_alpha -#define GL_SUN_global_alpha 1 -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); -GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); -GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); -GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); -GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); -GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); -GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); -#endif -#endif /* GL_SUN_global_alpha */ - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif -#endif /* GL_SUN_mesh_array */ - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#define GL_SLICE_ACCUM_SUN 0x85CC -#endif /* GL_SUN_slice_accum */ - -#ifndef GL_SUN_triangle_list -#define GL_SUN_triangle_list 1 -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); -GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); -GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); -GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); -GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); -GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); -#endif -#endif /* GL_SUN_triangle_list */ - -#ifndef GL_SUN_vertex -#define GL_SUN_vertex 1 -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif -#endif /* GL_SUN_vertex */ - -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif /* GL_WIN_phong_shading */ - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif /* GL_WIN_specular_fog */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GLES2/gl2.h b/core/deps/khronos/GLES2/gl2.h deleted file mode 100644 index 1d6a7e763..000000000 --- a/core/deps/khronos/GLES2/gl2.h +++ /dev/null @@ -1,525 +0,0 @@ -#ifndef __gl2_h_ -#define __gl2_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - /* - ** Copyright (c) 2013 The Khronos Group Inc. - ** - ** Permission is hereby granted, free of charge, to any person obtaining a - ** copy of this software and/or associated documentation files (the - ** "Materials"), to deal in the Materials without restriction, including - ** without limitation the rights to use, copy, modify, merge, publish, - ** distribute, sublicense, and/or sell copies of the Materials, and to - ** permit persons to whom the Materials are furnished to do so, subject to - ** the following conditions: - ** - ** The above copyright notice and this permission notice shall be included - ** in all copies or substantial portions of the Materials. - ** - ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - */ - /* - ** This header is generated from the Khronos OpenGL / OpenGL ES XML - ** API Registry. The current version of the Registry, generator scripts - ** used to make the header, and the header can be found at - ** http://www.opengl.org/registry/ - ** - ** Khronos $Revision: 24614 $ on $Date: 2013-12-30 04:44:46 -0800 (Mon, 30 Dec 2013) $ - */ - -#include - - /* Generated on date 20131230 */ - - /* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9] - * Versions emitted: .* - * Default extensions included: None - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_ES_VERSION_2_0 -#define GL_ES_VERSION_2_0 1 -#include - typedef khronos_int8_t GLbyte; - typedef khronos_float_t GLclampf; - typedef khronos_int32_t GLfixed; - typedef short GLshort; - typedef unsigned short GLushort; - typedef void GLvoid; - typedef struct __GLsync *GLsync; - typedef khronos_int64_t GLint64; - typedef khronos_uint64_t GLuint64; - typedef unsigned int GLenum; - typedef unsigned int GLuint; - typedef char GLchar; - typedef khronos_float_t GLfloat; - typedef khronos_ssize_t GLsizeiptr; - typedef khronos_intptr_t GLintptr; - typedef unsigned int GLbitfield; - typedef int GLint; - typedef unsigned char GLboolean; - typedef int GLsizei; - typedef khronos_uint8_t GLubyte; -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_FUNC_ADD 0x8006 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_BLEND 0x0BE2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_LINE_WIDTH 0x0B21 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_SHADER_TYPE 0x8B4F -#define GL_DELETE_STATUS 0x8B80 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_INVERT 0x150A -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE 0x1702 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_COMPILE_STATUS 0x8B81 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGB565 0x8D62 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_NONE 0 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 - GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); - GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); - GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); - GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); - GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); - GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); - GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); - GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); - GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); - GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); - GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); - GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); - GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); - GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); - GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); - GL_APICALL void GL_APIENTRY glClearStencil (GLint s); - GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); - GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); - GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); - GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); - GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); - GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); - GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); - GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); - GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); - GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); - GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); - GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); - GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); - GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); - GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); - GL_APICALL void GL_APIENTRY glDisable (GLenum cap); - GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); - GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); - GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); - GL_APICALL void GL_APIENTRY glEnable (GLenum cap); - GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); - GL_APICALL void GL_APIENTRY glFinish (void); - GL_APICALL void GL_APIENTRY glFlush (void); - GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); - GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); - GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); - GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); - GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); - GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); - GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); - GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); - GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); - GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL GLenum GL_APIENTRY glGetError (void); - GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); - GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); - GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); - GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); - GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); - GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); - GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); - GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); - GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); - GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); - GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); - GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); - GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); - GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); - GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); - GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); - GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); - GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); - GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); - GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); - GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); - GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); - GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); - GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); - GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); - GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); - GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); - GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); - GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); - GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); - GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); - GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); - GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); - GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); - GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); - GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); - GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); - GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); - GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); - GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); - GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_ES_VERSION_2_0 */ - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/core/deps/khronos/GLES2/gl2ext.h b/core/deps/khronos/GLES2/gl2ext.h deleted file mode 100644 index 36a0f95c7..000000000 --- a/core/deps/khronos/GLES2/gl2ext.h +++ /dev/null @@ -1,1626 +0,0 @@ -#ifndef __gl2ext_h_ -#define __gl2ext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - /* - ** Copyright (c) 2013 The Khronos Group Inc. - ** - ** Permission is hereby granted, free of charge, to any person obtaining a - ** copy of this software and/or associated documentation files (the - ** "Materials"), to deal in the Materials without restriction, including - ** without limitation the rights to use, copy, modify, merge, publish, - ** distribute, sublicense, and/or sell copies of the Materials, and to - ** permit persons to whom the Materials are furnished to do so, subject to - ** the following conditions: - ** - ** The above copyright notice and this permission notice shall be included - ** in all copies or substantial portions of the Materials. - ** - ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - */ - /* - ** This header is generated from the Khronos OpenGL / OpenGL ES XML - ** API Registry. The current version of the Registry, generator scripts - ** used to make the header, and the header can be found at - ** http://www.opengl.org/registry/ - ** - ** Khronos $Revision: 24614 $ on $Date: 2013-12-30 04:44:46 -0800 (Mon, 30 Dec 2013) $ - */ - -#ifndef GL_APIENTRYP -#define GL_APIENTRYP GL_APIENTRY* -#endif - - /* Generated on date 20131230 */ - - /* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9] - * Versions emitted: _nomatch_^ - * Default extensions included: gles2 - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 - typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_SAMPLER 0x82E6 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 -#define GL_DEBUG_SOURCE_API_KHR 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A -#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B -#define GL_DEBUG_TYPE_ERROR_KHR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 -#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 -#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D -#define GL_BUFFER_KHR 0x82E0 -#define GL_SHADER_KHR 0x82E1 -#define GL_PROGRAM_KHR 0x82E2 -#define GL_VERTEX_ARRAY_KHR 0x8074 -#define GL_QUERY_KHR 0x82E3 -#define GL_SAMPLER_KHR 0x82E6 -#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 -#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 -#define GL_DEBUG_OUTPUT_KHR 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 -#define GL_STACK_OVERFLOW_KHR 0x0503 -#define GL_STACK_UNDERFLOW_KHR 0x0504 - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); - typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); - typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); - typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); - typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); - typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); - GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); - GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); - GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); - GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); - GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); - GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); - GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); - GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); -#endif -#endif /* GL_KHR_debug */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif /* GL_KHR_texture_compression_astc_hdr */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif /* GL_KHR_texture_compression_astc_ldr */ - -#ifndef GL_OES_EGL_image -#define GL_OES_EGL_image 1 - typedef void *GLeglImageOES; - typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); - typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); - GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); -#endif -#endif /* GL_OES_EGL_image */ - -#ifndef GL_OES_EGL_image_external -#define GL_OES_EGL_image_external 1 -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#endif /* GL_OES_EGL_image_external */ - -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_OES_compressed_ETC1_RGB8_texture 1 -#define GL_ETC1_RGB8_OES 0x8D64 -#endif /* GL_OES_compressed_ETC1_RGB8_texture */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif /* GL_OES_compressed_paletted_texture */ - -#ifndef GL_OES_depth24 -#define GL_OES_depth24 1 -#define GL_DEPTH_COMPONENT24_OES 0x81A6 -#endif /* GL_OES_depth24 */ - -#ifndef GL_OES_depth32 -#define GL_OES_depth32 1 -#define GL_DEPTH_COMPONENT32_OES 0x81A7 -#endif /* GL_OES_depth32 */ - -#ifndef GL_OES_depth_texture -#define GL_OES_depth_texture 1 -#endif /* GL_OES_depth_texture */ - -#ifndef GL_OES_element_index_uint -#define GL_OES_element_index_uint 1 -#endif /* GL_OES_element_index_uint */ - -#ifndef GL_OES_fbo_render_mipmap -#define GL_OES_fbo_render_mipmap 1 -#endif /* GL_OES_fbo_render_mipmap */ - -#ifndef GL_OES_fragment_precision_high -#define GL_OES_fragment_precision_high 1 -#endif /* GL_OES_fragment_precision_high */ - -#ifndef GL_OES_get_program_binary -#define GL_OES_get_program_binary 1 -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE -#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF - typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); - typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); - GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#endif -#endif /* GL_OES_get_program_binary */ - -#ifndef GL_OES_mapbuffer -#define GL_OES_mapbuffer 1 -#define GL_WRITE_ONLY_OES 0x88B9 -#define GL_BUFFER_ACCESS_OES 0x88BB -#define GL_BUFFER_MAPPED_OES 0x88BC -#define GL_BUFFER_MAP_POINTER_OES 0x88BD - typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); - typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); - typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); - GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); - GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_OES_mapbuffer */ - -#ifndef GL_OES_packed_depth_stencil -#define GL_OES_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_DEPTH24_STENCIL8_OES 0x88F0 -#endif /* GL_OES_packed_depth_stencil */ - -#ifndef GL_OES_required_internalformat -#define GL_OES_required_internalformat 1 -#define GL_ALPHA8_OES 0x803C -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -#define GL_LUMINANCE4_ALPHA4_OES 0x8043 -#define GL_LUMINANCE8_ALPHA8_OES 0x8045 -#define GL_LUMINANCE8_OES 0x8040 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_RGB565_OES 0x8D62 -#define GL_RGB8_OES 0x8051 -#define GL_RGBA8_OES 0x8058 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB10_A2_EXT 0x8059 -#endif /* GL_OES_required_internalformat */ - -#ifndef GL_OES_rgb8_rgba8 -#define GL_OES_rgb8_rgba8 1 -#endif /* GL_OES_rgb8_rgba8 */ - -#ifndef GL_OES_standard_derivatives -#define GL_OES_standard_derivatives 1 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B -#endif /* GL_OES_standard_derivatives */ - -#ifndef GL_OES_stencil1 -#define GL_OES_stencil1 1 -#define GL_STENCIL_INDEX1_OES 0x8D46 -#endif /* GL_OES_stencil1 */ - -#ifndef GL_OES_stencil4 -#define GL_OES_stencil4 1 -#define GL_STENCIL_INDEX4_OES 0x8D47 -#endif /* GL_OES_stencil4 */ - -#ifndef GL_OES_surfaceless_context -#define GL_OES_surfaceless_context 1 -#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 -#endif /* GL_OES_surfaceless_context */ - -#ifndef GL_OES_texture_3D -#define GL_OES_texture_3D 1 -#define GL_TEXTURE_WRAP_R_OES 0x8072 -#define GL_TEXTURE_3D_OES 0x806F -#define GL_TEXTURE_BINDING_3D_OES 0x806A -#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 -#define GL_SAMPLER_3D_OES 0x8B5F -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 - typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); - typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#endif -#endif /* GL_OES_texture_3D */ - -#ifndef GL_OES_texture_compression_astc -#define GL_OES_texture_compression_astc 1 -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 -#endif /* GL_OES_texture_compression_astc */ - -#ifndef GL_OES_texture_float -#define GL_OES_texture_float 1 -#endif /* GL_OES_texture_float */ - -#ifndef GL_OES_texture_float_linear -#define GL_OES_texture_float_linear 1 -#endif /* GL_OES_texture_float_linear */ - -#ifndef GL_OES_texture_half_float -#define GL_OES_texture_half_float 1 -#define GL_HALF_FLOAT_OES 0x8D61 -#endif /* GL_OES_texture_half_float */ - -#ifndef GL_OES_texture_half_float_linear -#define GL_OES_texture_half_float_linear 1 -#endif /* GL_OES_texture_half_float_linear */ - -#ifndef GL_OES_texture_npot -#define GL_OES_texture_npot 1 -#endif /* GL_OES_texture_npot */ - -#ifndef GL_OES_vertex_array_object -#define GL_OES_vertex_array_object 1 -#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 - typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); - typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); - typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); - typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); - GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); - GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); - GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); -#endif -#endif /* GL_OES_vertex_array_object */ - -#ifndef GL_OES_vertex_half_float -#define GL_OES_vertex_half_float 1 -#endif /* GL_OES_vertex_half_float */ - -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_OES_vertex_type_10_10_10_2 1 -#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 -#define GL_INT_10_10_10_2_OES 0x8DF7 -#endif /* GL_OES_vertex_type_10_10_10_2 */ - -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA -#endif /* GL_AMD_compressed_3DC_texture */ - -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#endif /* GL_AMD_compressed_ATC_texture */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); - typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); - typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); - typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); - typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); - typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); - GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); - GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); - GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); - GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); - GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); - GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -#endif /* GL_AMD_performance_monitor */ - -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 -#define GL_Z400_BINARY_AMD 0x8740 -#endif /* GL_AMD_program_binary_Z400 */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 -#endif /* GL_ANGLE_depth_texture */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA - typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); -#endif -#endif /* GL_ANGLE_instanced_arrays */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 -#endif /* GL_ANGLE_pack_reverse_row_order */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 -#endif /* GL_ANGLE_program_binary */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 -#endif /* GL_ANGLE_texture_usage */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 - typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#endif -#endif /* GL_ANGLE_translated_shader_source */ - -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 - typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#endif -#endif /* GL_APPLE_copy_texture_levels */ - -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); -#endif -#endif /* GL_APPLE_framebuffer_multisample */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_RAW_422_APPLE 0x8A51 -#endif /* GL_APPLE_rgb_422 */ - -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull - typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); - typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); - typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); - typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); - typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); - typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); - typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); - GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); - GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); - GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); - GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif -#endif /* GL_APPLE_sync */ - -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 -#define GL_BGRA_EXT 0x80E1 -#define GL_BGRA8_EXT 0x93A1 -#endif /* GL_APPLE_texture_format_BGRA8888 */ - -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D -#endif /* GL_APPLE_texture_max_level */ - -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 -#endif /* GL_ARM_mali_program_binary */ - -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 -#endif /* GL_ARM_mali_shader_binary */ - -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 -#endif /* GL_ARM_rgba8 */ - -#ifndef GL_DMP_shader_binary -#define GL_DMP_shader_binary 1 -#define GL_SHADER_BINARY_DMP 0x9250 -#endif /* GL_DMP_shader_binary */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#endif /* GL_EXT_blend_minmax */ - -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_RG16F_EXT 0x822F -#define GL_R16F_EXT 0x822D -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 -#endif /* GL_EXT_color_buffer_half_float */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -#define GL_TRANSFORM_FEEDBACK 0x8E22 - typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_EXT_debug_label */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 - typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); - typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); - typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); - GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); - GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); -#endif -#endif /* GL_EXT_debug_marker */ - -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 - typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#endif -#endif /* GL_EXT_discard_framebuffer */ - -#ifndef GL_EXT_disjoint_timer_query -#define GL_EXT_disjoint_timer_query 1 -#define GL_QUERY_COUNTER_BITS_EXT 0x8864 -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#define GL_TIME_ELAPSED_EXT 0x88BF -#define GL_TIMESTAMP_EXT 0x8E28 -#define GL_GPU_DISJOINT_EXT 0x8FBB - typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); - typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); - typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); - typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); - typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); - typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); - typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); - GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); - GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); - GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); - GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); - GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); - GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); -#endif -#endif /* GL_EXT_disjoint_timer_query */ - -#ifndef GL_EXT_draw_buffers -#define GL_EXT_draw_buffers 1 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 -#define GL_DRAW_BUFFER0_EXT 0x8825 -#define GL_DRAW_BUFFER1_EXT 0x8826 -#define GL_DRAW_BUFFER2_EXT 0x8827 -#define GL_DRAW_BUFFER3_EXT 0x8828 -#define GL_DRAW_BUFFER4_EXT 0x8829 -#define GL_DRAW_BUFFER5_EXT 0x882A -#define GL_DRAW_BUFFER6_EXT 0x882B -#define GL_DRAW_BUFFER7_EXT 0x882C -#define GL_DRAW_BUFFER8_EXT 0x882D -#define GL_DRAW_BUFFER9_EXT 0x882E -#define GL_DRAW_BUFFER10_EXT 0x882F -#define GL_DRAW_BUFFER11_EXT 0x8830 -#define GL_DRAW_BUFFER12_EXT 0x8831 -#define GL_DRAW_BUFFER13_EXT 0x8832 -#define GL_DRAW_BUFFER14_EXT 0x8833 -#define GL_DRAW_BUFFER15_EXT 0x8834 -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_EXT_draw_buffers */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_instanced_arrays -#define GL_EXT_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor); -#endif -#endif /* GL_EXT_instanced_arrays */ - -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 - typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); -#endif -#endif /* GL_EXT_map_buffer_range */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#endif -#endif /* GL_EXT_multi_draw_arrays */ - -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_EXT_multisampled_render_to_texture */ - -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 - typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); - typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); - GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); - GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); -#endif -#endif /* GL_EXT_multiview_draw_buffers */ - -#ifndef GL_EXT_occlusion_query_boolean -#define GL_EXT_occlusion_query_boolean 1 -#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A -#endif /* GL_EXT_occlusion_query_boolean */ - -#ifndef GL_EXT_pvrtc_sRGB -#define GL_EXT_pvrtc_sRGB 1 -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 -#endif /* GL_EXT_pvrtc_sRGB */ - -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 -#endif /* GL_EXT_read_format_bgra */ - -#ifndef GL_EXT_robustness -#define GL_EXT_robustness 1 -#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 -#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 -#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 -#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 - typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); - typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); - typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); - GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_EXT_robustness */ - -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#endif /* GL_EXT_sRGB */ - -#ifndef GL_EXT_sRGB_write_control -#define GL_EXT_sRGB_write_control 1 -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#endif /* GL_EXT_sRGB_write_control */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#define GL_ACTIVE_PROGRAM_EXT 0x8259 -#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 -#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE_EXT 0x8258 -#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A - typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); - typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); - typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); - typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); - typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); - typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); - typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); - GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); - GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); - GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); - GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); - GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); - GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); - GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); - GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); - GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); - GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); - GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); - GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); - GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); - GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); - GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); - GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); - GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); - GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_EXT_separate_shader_objects */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 -#endif /* GL_EXT_shader_integer_mix */ - -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 -#endif /* GL_EXT_shader_texture_lod */ - -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 -#endif /* GL_EXT_shadow_samplers */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif /* GL_EXT_texture_compression_dxt1 */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif /* GL_EXT_texture_filter_anisotropic */ - -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 -#endif /* GL_EXT_texture_format_BGRA8888 */ - -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#endif /* GL_EXT_texture_rg */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif /* GL_EXT_texture_sRGB_decode */ - -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_R32F_EXT 0x822E -#define GL_RG32F_EXT 0x8230 - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif -#endif /* GL_EXT_texture_storage */ - -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 -#endif /* GL_EXT_texture_type_2_10_10_10_REV */ - -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 -#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 -#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 -#endif /* GL_EXT_unpack_subimage */ - -#ifndef GL_FJ_shader_binary_GCCSO -#define GL_FJ_shader_binary_GCCSO 1 -#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 -#endif /* GL_FJ_shader_binary_GCCSO */ - -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_IMG_multisampled_render_to_texture 1 -#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 -#define GL_MAX_SAMPLES_IMG 0x9135 -#define GL_TEXTURE_SAMPLES_IMG 0x9136 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_IMG_multisampled_render_to_texture */ - -#ifndef GL_IMG_program_binary -#define GL_IMG_program_binary 1 -#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 -#endif /* GL_IMG_program_binary */ - -#ifndef GL_IMG_read_format -#define GL_IMG_read_format 1 -#define GL_BGRA_IMG 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 -#endif /* GL_IMG_read_format */ - -#ifndef GL_IMG_shader_binary -#define GL_IMG_shader_binary 1 -#define GL_SGX_BINARY_IMG 0x8C0A -#endif /* GL_IMG_shader_binary */ - -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_IMG_texture_compression_pvrtc 1 -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#endif /* GL_IMG_texture_compression_pvrtc */ - -#ifndef GL_IMG_texture_compression_pvrtc2 -#define GL_IMG_texture_compression_pvrtc2 1 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 -#endif /* GL_IMG_texture_compression_pvrtc2 */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 - typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); - typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); - typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); - typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); - GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); - GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); - GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); - GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); - GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); - GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#endif -#endif /* GL_INTEL_performance_query */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLUE_NV 0x1905 -#define GL_COLORBURN_NV 0x929A -#define GL_COLORDODGE_NV 0x9299 -#define GL_CONJOINT_NV 0x9284 -#define GL_CONTRAST_NV 0x92A1 -#define GL_DARKEN_NV 0x9297 -#define GL_DIFFERENCE_NV 0x929E -#define GL_DISJOINT_NV 0x9283 -#define GL_DST_ATOP_NV 0x928F -#define GL_DST_IN_NV 0x928B -#define GL_DST_NV 0x9287 -#define GL_DST_OUT_NV 0x928D -#define GL_DST_OVER_NV 0x9289 -#define GL_EXCLUSION_NV 0x92A0 -#define GL_GREEN_NV 0x1904 -#define GL_HARDLIGHT_NV 0x929B -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_INVERT_OVG_NV 0x92B4 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LIGHTEN_NV 0x9298 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_MINUS_NV 0x929F -#define GL_MULTIPLY_NV 0x9294 -#define GL_OVERLAY_NV 0x9296 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_PLUS_NV 0x9291 -#define GL_RED_NV 0x1903 -#define GL_SCREEN_NV 0x9295 -#define GL_SOFTLIGHT_NV 0x929C -#define GL_SRC_ATOP_NV 0x928E -#define GL_SRC_IN_NV 0x928A -#define GL_SRC_NV 0x9286 -#define GL_SRC_OUT_NV 0x928C -#define GL_SRC_OVER_NV 0x9288 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_XOR_NV 0x1506 - typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); - typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value); - GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); -#endif -#endif /* GL_NV_blend_equation_advanced */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#endif /* GL_NV_blend_equation_advanced_coherent */ - -#ifndef GL_NV_copy_buffer -#define GL_NV_copy_buffer 1 -#define GL_COPY_READ_BUFFER_NV 0x8F36 -#define GL_COPY_WRITE_BUFFER_NV 0x8F37 - typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif -#endif /* GL_NV_copy_buffer */ - -#ifndef GL_NV_coverage_sample -#define GL_NV_coverage_sample 1 -#define GL_COVERAGE_COMPONENT_NV 0x8ED0 -#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 -#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 -#define GL_COVERAGE_BUFFERS_NV 0x8ED3 -#define GL_COVERAGE_SAMPLES_NV 0x8ED4 -#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 -#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 -#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 -#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 - typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); - typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); - GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); -#endif -#endif /* GL_NV_coverage_sample */ - -#ifndef GL_NV_depth_nonlinear -#define GL_NV_depth_nonlinear 1 -#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C -#endif /* GL_NV_depth_nonlinear */ - -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_NV_draw_buffers */ - -#ifndef GL_NV_draw_instanced -#define GL_NV_draw_instanced 1 - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_NV_draw_instanced */ - -#ifndef GL_NV_explicit_attrib_location -#define GL_NV_explicit_attrib_location 1 -#endif /* GL_NV_explicit_attrib_location */ - -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -#endif /* GL_NV_fbo_color_attachments */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); - typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); - typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); - typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); - typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); - typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); - GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); - GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); - GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); - GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); - GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif -#endif /* GL_NV_fence */ - -#ifndef GL_NV_framebuffer_blit -#define GL_NV_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_NV 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA - typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_NV_framebuffer_blit */ - -#ifndef GL_NV_framebuffer_multisample -#define GL_NV_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 -#define GL_MAX_SAMPLES_NV 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_NV_framebuffer_multisample */ - -#ifndef GL_NV_generate_mipmap_sRGB -#define GL_NV_generate_mipmap_sRGB 1 -#endif /* GL_NV_generate_mipmap_sRGB */ - -#ifndef GL_NV_instanced_arrays -#define GL_NV_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); -#endif -#endif /* GL_NV_instanced_arrays */ - -#ifndef GL_NV_non_square_matrices -#define GL_NV_non_square_matrices 1 -#define GL_FLOAT_MAT2x3_NV 0x8B65 -#define GL_FLOAT_MAT2x4_NV 0x8B66 -#define GL_FLOAT_MAT3x2_NV 0x8B67 -#define GL_FLOAT_MAT3x4_NV 0x8B68 -#define GL_FLOAT_MAT4x2_NV 0x8B69 -#define GL_FLOAT_MAT4x3_NV 0x8B6A - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_NV_non_square_matrices */ - -#ifndef GL_NV_read_buffer -#define GL_NV_read_buffer 1 -#define GL_READ_BUFFER_NV 0x0C02 - typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); -#endif -#endif /* GL_NV_read_buffer */ - -#ifndef GL_NV_read_buffer_front -#define GL_NV_read_buffer_front 1 -#endif /* GL_NV_read_buffer_front */ - -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 -#endif /* GL_NV_read_depth */ - -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 -#endif /* GL_NV_read_depth_stencil */ - -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 -#endif /* GL_NV_read_stencil */ - -#ifndef GL_NV_sRGB_formats -#define GL_NV_sRGB_formats 1 -#define GL_SLUMINANCE_NV 0x8C46 -#define GL_SLUMINANCE_ALPHA_NV 0x8C44 -#define GL_SRGB8_NV 0x8C41 -#define GL_SLUMINANCE8_NV 0x8C47 -#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F -#define GL_ETC1_SRGB8_NV 0x88EE -#endif /* GL_NV_sRGB_formats */ - -#ifndef GL_NV_shadow_samplers_array -#define GL_NV_shadow_samplers_array 1 -#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 -#endif /* GL_NV_shadow_samplers_array */ - -#ifndef GL_NV_shadow_samplers_cube -#define GL_NV_shadow_samplers_cube 1 -#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 -#endif /* GL_NV_shadow_samplers_cube */ - -#ifndef GL_NV_texture_border_clamp -#define GL_NV_texture_border_clamp 1 -#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 -#define GL_CLAMP_TO_BORDER_NV 0x812D -#endif /* GL_NV_texture_border_clamp */ - -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 -#endif /* GL_NV_texture_compression_s3tc_update */ - -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 -#endif /* GL_NV_texture_npot_2D_mipmap */ - -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 - typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); -#endif -#endif /* GL_QCOM_alpha_test */ - -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 -#endif /* GL_QCOM_binning_control */ - -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 - typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); - typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); - typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); - typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); - GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); - GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); - GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); -#endif -#endif /* GL_QCOM_driver_control */ - -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC - typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); - typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); - typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); - typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); - GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); - GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); - GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); - GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); - GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); -#endif -#endif /* GL_QCOM_extended_get */ - -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 - typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); - typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); - typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); - typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); - GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); - GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); - GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#endif -#endif /* GL_QCOM_extended_get2 */ - -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 -#endif /* GL_QCOM_perfmon_global_mode */ - -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 - typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); -#endif -#endif /* GL_QCOM_tiled_rendering */ - -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 -#endif /* GL_QCOM_writeonly_rendering */ - -#ifndef GL_VIV_shader_binary -#define GL_VIV_shader_binary 1 -#define GL_SHADER_BINARY_VIV 0x8FC4 -#endif /* GL_VIV_shader_binary */ - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/core/deps/khronos/GLES2/gl2platform.h b/core/deps/khronos/GLES2/gl2platform.h deleted file mode 100644 index f5c6b88ed..000000000 --- a/core/deps/khronos/GLES2/gl2platform.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __gl2platform_h_ -#define __gl2platform_h_ - -/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */ - -/* - * This document is licensed under the SGI Free Software B License Version - * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . - */ - -/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h - * - * Adopters may modify khrplatform.h and this file to suit their platform. - * You are encouraged to submit all modifications to the Khronos group so that - * they can be included in future versions of this file. Please submit changes - * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) - * by filing a bug against product "OpenGL-ES" component "Registry". - */ - -#include - -#ifndef GL_APICALL -#define GL_APICALL KHRONOS_APICALL -#endif - -#ifndef GL_APIENTRY -#define GL_APIENTRY KHRONOS_APIENTRY -#endif - -#endif /* __gl2platform_h_ */ \ No newline at end of file diff --git a/core/deps/khronos/GLES3/gl2ext.h b/core/deps/khronos/GLES3/gl2ext.h deleted file mode 100644 index 36a0f95c7..000000000 --- a/core/deps/khronos/GLES3/gl2ext.h +++ /dev/null @@ -1,1626 +0,0 @@ -#ifndef __gl2ext_h_ -#define __gl2ext_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - /* - ** Copyright (c) 2013 The Khronos Group Inc. - ** - ** Permission is hereby granted, free of charge, to any person obtaining a - ** copy of this software and/or associated documentation files (the - ** "Materials"), to deal in the Materials without restriction, including - ** without limitation the rights to use, copy, modify, merge, publish, - ** distribute, sublicense, and/or sell copies of the Materials, and to - ** permit persons to whom the Materials are furnished to do so, subject to - ** the following conditions: - ** - ** The above copyright notice and this permission notice shall be included - ** in all copies or substantial portions of the Materials. - ** - ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - */ - /* - ** This header is generated from the Khronos OpenGL / OpenGL ES XML - ** API Registry. The current version of the Registry, generator scripts - ** used to make the header, and the header can be found at - ** http://www.opengl.org/registry/ - ** - ** Khronos $Revision: 24614 $ on $Date: 2013-12-30 04:44:46 -0800 (Mon, 30 Dec 2013) $ - */ - -#ifndef GL_APIENTRYP -#define GL_APIENTRYP GL_APIENTRY* -#endif - - /* Generated on date 20131230 */ - - /* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9] - * Versions emitted: _nomatch_^ - * Default extensions included: gles2 - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 - typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_SAMPLER 0x82E6 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 -#define GL_DEBUG_SOURCE_API_KHR 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A -#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B -#define GL_DEBUG_TYPE_ERROR_KHR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 -#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 -#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D -#define GL_BUFFER_KHR 0x82E0 -#define GL_SHADER_KHR 0x82E1 -#define GL_PROGRAM_KHR 0x82E2 -#define GL_VERTEX_ARRAY_KHR 0x8074 -#define GL_QUERY_KHR 0x82E3 -#define GL_SAMPLER_KHR 0x82E6 -#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 -#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 -#define GL_DEBUG_OUTPUT_KHR 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 -#define GL_STACK_OVERFLOW_KHR 0x0503 -#define GL_STACK_UNDERFLOW_KHR 0x0504 - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); - typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); - typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); - typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); - typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); - typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); - typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); - GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); - GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); - GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); - GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); - GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); - GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); - GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); - GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); -#endif -#endif /* GL_KHR_debug */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif /* GL_KHR_texture_compression_astc_hdr */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif /* GL_KHR_texture_compression_astc_ldr */ - -#ifndef GL_OES_EGL_image -#define GL_OES_EGL_image 1 - typedef void *GLeglImageOES; - typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); - typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); - GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); -#endif -#endif /* GL_OES_EGL_image */ - -#ifndef GL_OES_EGL_image_external -#define GL_OES_EGL_image_external 1 -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#endif /* GL_OES_EGL_image_external */ - -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_OES_compressed_ETC1_RGB8_texture 1 -#define GL_ETC1_RGB8_OES 0x8D64 -#endif /* GL_OES_compressed_ETC1_RGB8_texture */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif /* GL_OES_compressed_paletted_texture */ - -#ifndef GL_OES_depth24 -#define GL_OES_depth24 1 -#define GL_DEPTH_COMPONENT24_OES 0x81A6 -#endif /* GL_OES_depth24 */ - -#ifndef GL_OES_depth32 -#define GL_OES_depth32 1 -#define GL_DEPTH_COMPONENT32_OES 0x81A7 -#endif /* GL_OES_depth32 */ - -#ifndef GL_OES_depth_texture -#define GL_OES_depth_texture 1 -#endif /* GL_OES_depth_texture */ - -#ifndef GL_OES_element_index_uint -#define GL_OES_element_index_uint 1 -#endif /* GL_OES_element_index_uint */ - -#ifndef GL_OES_fbo_render_mipmap -#define GL_OES_fbo_render_mipmap 1 -#endif /* GL_OES_fbo_render_mipmap */ - -#ifndef GL_OES_fragment_precision_high -#define GL_OES_fragment_precision_high 1 -#endif /* GL_OES_fragment_precision_high */ - -#ifndef GL_OES_get_program_binary -#define GL_OES_get_program_binary 1 -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE -#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF - typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); - typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); - GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#endif -#endif /* GL_OES_get_program_binary */ - -#ifndef GL_OES_mapbuffer -#define GL_OES_mapbuffer 1 -#define GL_WRITE_ONLY_OES 0x88B9 -#define GL_BUFFER_ACCESS_OES 0x88BB -#define GL_BUFFER_MAPPED_OES 0x88BC -#define GL_BUFFER_MAP_POINTER_OES 0x88BD - typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); - typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); - typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); - GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); - GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_OES_mapbuffer */ - -#ifndef GL_OES_packed_depth_stencil -#define GL_OES_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_DEPTH24_STENCIL8_OES 0x88F0 -#endif /* GL_OES_packed_depth_stencil */ - -#ifndef GL_OES_required_internalformat -#define GL_OES_required_internalformat 1 -#define GL_ALPHA8_OES 0x803C -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -#define GL_LUMINANCE4_ALPHA4_OES 0x8043 -#define GL_LUMINANCE8_ALPHA8_OES 0x8045 -#define GL_LUMINANCE8_OES 0x8040 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_RGB565_OES 0x8D62 -#define GL_RGB8_OES 0x8051 -#define GL_RGBA8_OES 0x8058 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB10_A2_EXT 0x8059 -#endif /* GL_OES_required_internalformat */ - -#ifndef GL_OES_rgb8_rgba8 -#define GL_OES_rgb8_rgba8 1 -#endif /* GL_OES_rgb8_rgba8 */ - -#ifndef GL_OES_standard_derivatives -#define GL_OES_standard_derivatives 1 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B -#endif /* GL_OES_standard_derivatives */ - -#ifndef GL_OES_stencil1 -#define GL_OES_stencil1 1 -#define GL_STENCIL_INDEX1_OES 0x8D46 -#endif /* GL_OES_stencil1 */ - -#ifndef GL_OES_stencil4 -#define GL_OES_stencil4 1 -#define GL_STENCIL_INDEX4_OES 0x8D47 -#endif /* GL_OES_stencil4 */ - -#ifndef GL_OES_surfaceless_context -#define GL_OES_surfaceless_context 1 -#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 -#endif /* GL_OES_surfaceless_context */ - -#ifndef GL_OES_texture_3D -#define GL_OES_texture_3D 1 -#define GL_TEXTURE_WRAP_R_OES 0x8072 -#define GL_TEXTURE_3D_OES 0x806F -#define GL_TEXTURE_BINDING_3D_OES 0x806A -#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 -#define GL_SAMPLER_3D_OES 0x8B5F -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 - typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); - typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#endif -#endif /* GL_OES_texture_3D */ - -#ifndef GL_OES_texture_compression_astc -#define GL_OES_texture_compression_astc 1 -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 -#endif /* GL_OES_texture_compression_astc */ - -#ifndef GL_OES_texture_float -#define GL_OES_texture_float 1 -#endif /* GL_OES_texture_float */ - -#ifndef GL_OES_texture_float_linear -#define GL_OES_texture_float_linear 1 -#endif /* GL_OES_texture_float_linear */ - -#ifndef GL_OES_texture_half_float -#define GL_OES_texture_half_float 1 -#define GL_HALF_FLOAT_OES 0x8D61 -#endif /* GL_OES_texture_half_float */ - -#ifndef GL_OES_texture_half_float_linear -#define GL_OES_texture_half_float_linear 1 -#endif /* GL_OES_texture_half_float_linear */ - -#ifndef GL_OES_texture_npot -#define GL_OES_texture_npot 1 -#endif /* GL_OES_texture_npot */ - -#ifndef GL_OES_vertex_array_object -#define GL_OES_vertex_array_object 1 -#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 - typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); - typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); - typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); - typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); - GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); - GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); - GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); -#endif -#endif /* GL_OES_vertex_array_object */ - -#ifndef GL_OES_vertex_half_float -#define GL_OES_vertex_half_float 1 -#endif /* GL_OES_vertex_half_float */ - -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_OES_vertex_type_10_10_10_2 1 -#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 -#define GL_INT_10_10_10_2_OES 0x8DF7 -#endif /* GL_OES_vertex_type_10_10_10_2 */ - -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA -#endif /* GL_AMD_compressed_3DC_texture */ - -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#endif /* GL_AMD_compressed_ATC_texture */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); - typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); - typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); - typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); - typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); - typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); - typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); - GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); - GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); - GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); - GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); - GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); - GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); - GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -#endif /* GL_AMD_performance_monitor */ - -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 -#define GL_Z400_BINARY_AMD 0x8740 -#endif /* GL_AMD_program_binary_Z400 */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 -#endif /* GL_ANGLE_depth_texture */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA - typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); - GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); -#endif -#endif /* GL_ANGLE_instanced_arrays */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 -#endif /* GL_ANGLE_pack_reverse_row_order */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 -#endif /* GL_ANGLE_program_binary */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 -#endif /* GL_ANGLE_texture_usage */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 - typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#endif -#endif /* GL_ANGLE_translated_shader_source */ - -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 - typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#endif -#endif /* GL_APPLE_copy_texture_levels */ - -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); -#endif -#endif /* GL_APPLE_framebuffer_multisample */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_RAW_422_APPLE 0x8A51 -#endif /* GL_APPLE_rgb_422 */ - -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull - typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); - typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); - typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); - typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); - typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); - typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); - typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); - GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); - GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); - GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); - GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif -#endif /* GL_APPLE_sync */ - -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 -#define GL_BGRA_EXT 0x80E1 -#define GL_BGRA8_EXT 0x93A1 -#endif /* GL_APPLE_texture_format_BGRA8888 */ - -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D -#endif /* GL_APPLE_texture_max_level */ - -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 -#endif /* GL_ARM_mali_program_binary */ - -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 -#endif /* GL_ARM_mali_shader_binary */ - -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 -#endif /* GL_ARM_rgba8 */ - -#ifndef GL_DMP_shader_binary -#define GL_DMP_shader_binary 1 -#define GL_SHADER_BINARY_DMP 0x9250 -#endif /* GL_DMP_shader_binary */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#endif /* GL_EXT_blend_minmax */ - -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_RG16F_EXT 0x822F -#define GL_R16F_EXT 0x822D -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 -#endif /* GL_EXT_color_buffer_half_float */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -#define GL_TRANSFORM_FEEDBACK 0x8E22 - typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); - typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); - GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_EXT_debug_label */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 - typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); - typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); - typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); - GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); - GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); -#endif -#endif /* GL_EXT_debug_marker */ - -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 - typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#endif -#endif /* GL_EXT_discard_framebuffer */ - -#ifndef GL_EXT_disjoint_timer_query -#define GL_EXT_disjoint_timer_query 1 -#define GL_QUERY_COUNTER_BITS_EXT 0x8864 -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#define GL_TIME_ELAPSED_EXT 0x88BF -#define GL_TIMESTAMP_EXT 0x8E28 -#define GL_GPU_DISJOINT_EXT 0x8FBB - typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); - typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); - typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); - typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); - typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); - typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); - typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); - typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); - GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); - GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); - GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); - GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); - GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); - GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); -#endif -#endif /* GL_EXT_disjoint_timer_query */ - -#ifndef GL_EXT_draw_buffers -#define GL_EXT_draw_buffers 1 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 -#define GL_DRAW_BUFFER0_EXT 0x8825 -#define GL_DRAW_BUFFER1_EXT 0x8826 -#define GL_DRAW_BUFFER2_EXT 0x8827 -#define GL_DRAW_BUFFER3_EXT 0x8828 -#define GL_DRAW_BUFFER4_EXT 0x8829 -#define GL_DRAW_BUFFER5_EXT 0x882A -#define GL_DRAW_BUFFER6_EXT 0x882B -#define GL_DRAW_BUFFER7_EXT 0x882C -#define GL_DRAW_BUFFER8_EXT 0x882D -#define GL_DRAW_BUFFER9_EXT 0x882E -#define GL_DRAW_BUFFER10_EXT 0x882F -#define GL_DRAW_BUFFER11_EXT 0x8830 -#define GL_DRAW_BUFFER12_EXT 0x8831 -#define GL_DRAW_BUFFER13_EXT 0x8832 -#define GL_DRAW_BUFFER14_EXT 0x8833 -#define GL_DRAW_BUFFER15_EXT 0x8834 -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_EXT_draw_buffers */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_instanced_arrays -#define GL_EXT_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor); -#endif -#endif /* GL_EXT_instanced_arrays */ - -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 - typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); -#endif -#endif /* GL_EXT_map_buffer_range */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 - typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#endif -#endif /* GL_EXT_multi_draw_arrays */ - -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_EXT_multisampled_render_to_texture */ - -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 - typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); - typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); - GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); - GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); -#endif -#endif /* GL_EXT_multiview_draw_buffers */ - -#ifndef GL_EXT_occlusion_query_boolean -#define GL_EXT_occlusion_query_boolean 1 -#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A -#endif /* GL_EXT_occlusion_query_boolean */ - -#ifndef GL_EXT_pvrtc_sRGB -#define GL_EXT_pvrtc_sRGB 1 -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 -#endif /* GL_EXT_pvrtc_sRGB */ - -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 -#endif /* GL_EXT_read_format_bgra */ - -#ifndef GL_EXT_robustness -#define GL_EXT_robustness 1 -#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 -#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 -#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 -#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 - typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); - typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); - typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); - GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); - GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_EXT_robustness */ - -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#endif /* GL_EXT_sRGB */ - -#ifndef GL_EXT_sRGB_write_control -#define GL_EXT_sRGB_write_control 1 -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#endif /* GL_EXT_sRGB_write_control */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#define GL_ACTIVE_PROGRAM_EXT 0x8259 -#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 -#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE_EXT 0x8258 -#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A - typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); - typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); - typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); - typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); - typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); - typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); - typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); - GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); - GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); - GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); - GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); - GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); - GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); - GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); - GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); - GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); - GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); - GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); - GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); - GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); - GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); - GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); - GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); - GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); - GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_EXT_separate_shader_objects */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 -#endif /* GL_EXT_shader_integer_mix */ - -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 -#endif /* GL_EXT_shader_texture_lod */ - -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 -#endif /* GL_EXT_shadow_samplers */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif /* GL_EXT_texture_compression_dxt1 */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif /* GL_EXT_texture_filter_anisotropic */ - -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 -#endif /* GL_EXT_texture_format_BGRA8888 */ - -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#endif /* GL_EXT_texture_rg */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif /* GL_EXT_texture_sRGB_decode */ - -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_R32F_EXT 0x822E -#define GL_RG32F_EXT 0x8230 - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); - GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif -#endif /* GL_EXT_texture_storage */ - -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 -#endif /* GL_EXT_texture_type_2_10_10_10_REV */ - -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 -#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 -#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 -#endif /* GL_EXT_unpack_subimage */ - -#ifndef GL_FJ_shader_binary_GCCSO -#define GL_FJ_shader_binary_GCCSO 1 -#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 -#endif /* GL_FJ_shader_binary_GCCSO */ - -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_IMG_multisampled_render_to_texture 1 -#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 -#define GL_MAX_SAMPLES_IMG 0x9135 -#define GL_TEXTURE_SAMPLES_IMG 0x9136 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_IMG_multisampled_render_to_texture */ - -#ifndef GL_IMG_program_binary -#define GL_IMG_program_binary 1 -#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 -#endif /* GL_IMG_program_binary */ - -#ifndef GL_IMG_read_format -#define GL_IMG_read_format 1 -#define GL_BGRA_IMG 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 -#endif /* GL_IMG_read_format */ - -#ifndef GL_IMG_shader_binary -#define GL_IMG_shader_binary 1 -#define GL_SGX_BINARY_IMG 0x8C0A -#endif /* GL_IMG_shader_binary */ - -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_IMG_texture_compression_pvrtc 1 -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#endif /* GL_IMG_texture_compression_pvrtc */ - -#ifndef GL_IMG_texture_compression_pvrtc2 -#define GL_IMG_texture_compression_pvrtc2 1 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 -#endif /* GL_IMG_texture_compression_pvrtc2 */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 - typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); - typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); - typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); - typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); - typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); - typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); - GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); - GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); - GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); - GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); - GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); - GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); - GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#endif -#endif /* GL_INTEL_performance_query */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLUE_NV 0x1905 -#define GL_COLORBURN_NV 0x929A -#define GL_COLORDODGE_NV 0x9299 -#define GL_CONJOINT_NV 0x9284 -#define GL_CONTRAST_NV 0x92A1 -#define GL_DARKEN_NV 0x9297 -#define GL_DIFFERENCE_NV 0x929E -#define GL_DISJOINT_NV 0x9283 -#define GL_DST_ATOP_NV 0x928F -#define GL_DST_IN_NV 0x928B -#define GL_DST_NV 0x9287 -#define GL_DST_OUT_NV 0x928D -#define GL_DST_OVER_NV 0x9289 -#define GL_EXCLUSION_NV 0x92A0 -#define GL_GREEN_NV 0x1904 -#define GL_HARDLIGHT_NV 0x929B -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_INVERT_OVG_NV 0x92B4 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LIGHTEN_NV 0x9298 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_MINUS_NV 0x929F -#define GL_MULTIPLY_NV 0x9294 -#define GL_OVERLAY_NV 0x9296 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_PLUS_NV 0x9291 -#define GL_RED_NV 0x1903 -#define GL_SCREEN_NV 0x9295 -#define GL_SOFTLIGHT_NV 0x929C -#define GL_SRC_ATOP_NV 0x928E -#define GL_SRC_IN_NV 0x928A -#define GL_SRC_NV 0x9286 -#define GL_SRC_OUT_NV 0x928C -#define GL_SRC_OVER_NV 0x9288 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_XOR_NV 0x1506 - typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); - typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value); - GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); -#endif -#endif /* GL_NV_blend_equation_advanced */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#endif /* GL_NV_blend_equation_advanced_coherent */ - -#ifndef GL_NV_copy_buffer -#define GL_NV_copy_buffer 1 -#define GL_COPY_READ_BUFFER_NV 0x8F36 -#define GL_COPY_WRITE_BUFFER_NV 0x8F37 - typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif -#endif /* GL_NV_copy_buffer */ - -#ifndef GL_NV_coverage_sample -#define GL_NV_coverage_sample 1 -#define GL_COVERAGE_COMPONENT_NV 0x8ED0 -#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 -#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 -#define GL_COVERAGE_BUFFERS_NV 0x8ED3 -#define GL_COVERAGE_SAMPLES_NV 0x8ED4 -#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 -#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 -#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 -#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 - typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); - typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); - GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); -#endif -#endif /* GL_NV_coverage_sample */ - -#ifndef GL_NV_depth_nonlinear -#define GL_NV_depth_nonlinear 1 -#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C -#endif /* GL_NV_depth_nonlinear */ - -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF - typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_NV_draw_buffers */ - -#ifndef GL_NV_draw_instanced -#define GL_NV_draw_instanced 1 - typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); - GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_NV_draw_instanced */ - -#ifndef GL_NV_explicit_attrib_location -#define GL_NV_explicit_attrib_location 1 -#endif /* GL_NV_explicit_attrib_location */ - -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -#endif /* GL_NV_fbo_color_attachments */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 - typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); - typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); - typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); - typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); - typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); - typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); - GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); - GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); - GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); - GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); - GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif -#endif /* GL_NV_fence */ - -#ifndef GL_NV_framebuffer_blit -#define GL_NV_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_NV 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA - typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_NV_framebuffer_blit */ - -#ifndef GL_NV_framebuffer_multisample -#define GL_NV_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 -#define GL_MAX_SAMPLES_NV 0x8D57 - typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_NV_framebuffer_multisample */ - -#ifndef GL_NV_generate_mipmap_sRGB -#define GL_NV_generate_mipmap_sRGB 1 -#endif /* GL_NV_generate_mipmap_sRGB */ - -#ifndef GL_NV_instanced_arrays -#define GL_NV_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE - typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); -#endif -#endif /* GL_NV_instanced_arrays */ - -#ifndef GL_NV_non_square_matrices -#define GL_NV_non_square_matrices 1 -#define GL_FLOAT_MAT2x3_NV 0x8B65 -#define GL_FLOAT_MAT2x4_NV 0x8B66 -#define GL_FLOAT_MAT3x2_NV 0x8B67 -#define GL_FLOAT_MAT3x4_NV 0x8B68 -#define GL_FLOAT_MAT4x2_NV 0x8B69 -#define GL_FLOAT_MAT4x3_NV 0x8B6A - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_NV_non_square_matrices */ - -#ifndef GL_NV_read_buffer -#define GL_NV_read_buffer 1 -#define GL_READ_BUFFER_NV 0x0C02 - typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); -#endif -#endif /* GL_NV_read_buffer */ - -#ifndef GL_NV_read_buffer_front -#define GL_NV_read_buffer_front 1 -#endif /* GL_NV_read_buffer_front */ - -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 -#endif /* GL_NV_read_depth */ - -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 -#endif /* GL_NV_read_depth_stencil */ - -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 -#endif /* GL_NV_read_stencil */ - -#ifndef GL_NV_sRGB_formats -#define GL_NV_sRGB_formats 1 -#define GL_SLUMINANCE_NV 0x8C46 -#define GL_SLUMINANCE_ALPHA_NV 0x8C44 -#define GL_SRGB8_NV 0x8C41 -#define GL_SLUMINANCE8_NV 0x8C47 -#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F -#define GL_ETC1_SRGB8_NV 0x88EE -#endif /* GL_NV_sRGB_formats */ - -#ifndef GL_NV_shadow_samplers_array -#define GL_NV_shadow_samplers_array 1 -#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 -#endif /* GL_NV_shadow_samplers_array */ - -#ifndef GL_NV_shadow_samplers_cube -#define GL_NV_shadow_samplers_cube 1 -#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 -#endif /* GL_NV_shadow_samplers_cube */ - -#ifndef GL_NV_texture_border_clamp -#define GL_NV_texture_border_clamp 1 -#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 -#define GL_CLAMP_TO_BORDER_NV 0x812D -#endif /* GL_NV_texture_border_clamp */ - -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 -#endif /* GL_NV_texture_compression_s3tc_update */ - -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 -#endif /* GL_NV_texture_npot_2D_mipmap */ - -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 - typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); -#endif -#endif /* GL_QCOM_alpha_test */ - -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 -#endif /* GL_QCOM_binning_control */ - -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 - typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); - typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); - typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); - typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); - GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); - GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); - GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); -#endif -#endif /* GL_QCOM_driver_control */ - -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC - typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); - typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); - typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); - typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); - typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); - typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); - GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); - GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); - GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); - GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); - GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); -#endif -#endif /* GL_QCOM_extended_get */ - -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 - typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); - typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); - typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); - typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); - GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); - GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); - GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#endif -#endif /* GL_QCOM_extended_get2 */ - -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 -#endif /* GL_QCOM_perfmon_global_mode */ - -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 - typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -#ifdef GL_GLEXT_PROTOTYPES - GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); - GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); -#endif -#endif /* GL_QCOM_tiled_rendering */ - -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 -#endif /* GL_QCOM_writeonly_rendering */ - -#ifndef GL_VIV_shader_binary -#define GL_VIV_shader_binary 1 -#define GL_SHADER_BINARY_VIV 0x8FC4 -#endif /* GL_VIV_shader_binary */ - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/core/deps/khronos/GLES3/gl3.h b/core/deps/khronos/GLES3/gl3.h deleted file mode 100644 index 509ea3e5a..000000000 --- a/core/deps/khronos/GLES3/gl3.h +++ /dev/null @@ -1,939 +0,0 @@ -#ifndef __gl3_h_ -#define __gl3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - /* - ** Copyright (c) 2013 The Khronos Group Inc. - ** - ** Permission is hereby granted, free of charge, to any person obtaining a - ** copy of this software and/or associated documentation files (the - ** "Materials"), to deal in the Materials without restriction, including - ** without limitation the rights to use, copy, modify, merge, publish, - ** distribute, sublicense, and/or sell copies of the Materials, and to - ** permit persons to whom the Materials are furnished to do so, subject to - ** the following conditions: - ** - ** The above copyright notice and this permission notice shall be included - ** in all copies or substantial portions of the Materials. - ** - ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - */ - /* - ** This header is generated from the Khronos OpenGL / OpenGL ES XML - ** API Registry. The current version of the Registry, generator scripts - ** used to make the header, and the header can be found at - ** http://www.opengl.org/registry/ - ** - ** Khronos $Revision: 24614 $ on $Date: 2013-12-30 04:44:46 -0800 (Mon, 30 Dec 2013) $ - */ - -#include - - /* Generated on date 20131230 */ - - /* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: [23]\.[0-9] - * Versions emitted: .* - * Default extensions included: None - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_ES_VERSION_2_0 -#define GL_ES_VERSION_2_0 1 -#include - typedef khronos_int8_t GLbyte; - typedef khronos_float_t GLclampf; - typedef khronos_int32_t GLfixed; - typedef short GLshort; - typedef unsigned short GLushort; - typedef void GLvoid; - typedef struct __GLsync *GLsync; - typedef khronos_int64_t GLint64; - typedef khronos_uint64_t GLuint64; - typedef unsigned int GLenum; - typedef unsigned int GLuint; - typedef char GLchar; - typedef khronos_float_t GLfloat; - typedef khronos_ssize_t GLsizeiptr; - typedef khronos_intptr_t GLintptr; - typedef unsigned int GLbitfield; - typedef int GLint; - typedef unsigned char GLboolean; - typedef int GLsizei; - typedef khronos_uint8_t GLubyte; -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_FUNC_ADD 0x8006 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_BLEND 0x0BE2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_LINE_WIDTH 0x0B21 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_SHADER_TYPE 0x8B4F -#define GL_DELETE_STATUS 0x8B80 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_INVERT 0x150A -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE 0x1702 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_COMPILE_STATUS 0x8B81 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGB565 0x8D62 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_NONE 0 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 - GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); - GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); - GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); - GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); - GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); - GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); - GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); - GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); - GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); - GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); - GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); - GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); - GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); - GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); - GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); - GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); - GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); - GL_APICALL void GL_APIENTRY glClearStencil (GLint s); - GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); - GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); - GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); - GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); - GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); - GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); - GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); - GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); - GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); - GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); - GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); - GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); - GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); - GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); - GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); - GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); - GL_APICALL void GL_APIENTRY glDisable (GLenum cap); - GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); - GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); - GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); - GL_APICALL void GL_APIENTRY glEnable (GLenum cap); - GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); - GL_APICALL void GL_APIENTRY glFinish (void); - GL_APICALL void GL_APIENTRY glFlush (void); - GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); - GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); - GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); - GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); - GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); - GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); - GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); - GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); - GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); - GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); - GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); - GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL GLenum GL_APIENTRY glGetError (void); - GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); - GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); - GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); - GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); - GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); - GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); - GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); - GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); - GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); - GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); - GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); - GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); - GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); - GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); - GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); - GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); - GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); - GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); - GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); - GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); - GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); - GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); - GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); - GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); - GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); - GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); - GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); - GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); - GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); - GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); - GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); - GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); - GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); - GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); - GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); - GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); - GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); - GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); - GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); - GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); - GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); - GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); - GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); - GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); - GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); - GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); - GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); - GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); - GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); - GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_ES_VERSION_2_0 */ - -#ifndef GL_ES_VERSION_3_0 -#define GL_ES_VERSION_3_0 1 - typedef unsigned short GLhalf; -#define GL_READ_BUFFER 0x0C02 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_RED 0x1903 -#define GL_RGB8 0x8051 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_RG8 0x822B -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_INT_2_10_10_10_REV 0x8D9F -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF - GL_APICALL void GL_APIENTRY glReadBuffer (GLenum mode); - GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); - GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); - GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); - GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids); - GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); - GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id); - GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id); - GL_APICALL void GL_APIENTRY glEndQuery (GLenum target); - GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); - GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target); - GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); - GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); - GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); - GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); - GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); - GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); - GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array); - GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); - GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); - GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array); - GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); - GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode); - GL_APICALL void GL_APIENTRY glEndTransformFeedback (void); - GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); - GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); - GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); - GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); - GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); - GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); - GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); - GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); - GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); - GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); - GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); - GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0); - GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); - GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); - GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); - GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); - GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); - GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); - GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); - GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); - GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index); - GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); - GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); - GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); - GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); - GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); - GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); - GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); - GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); - GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags); - GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync); - GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync); - GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); - GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); - GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); - GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); - GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); - GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); - GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); - GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler); - GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler); - GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); - GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); - GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); - GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); - GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); - GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); - GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); - GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id); - GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); - GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); - GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id); - GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void); - GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void); - GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); - GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); - GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); - GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); - GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); - GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); - GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif /* GL_ES_VERSION_3_0 */ - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/core/deps/khronos/GLES3/gl3platform.h b/core/deps/khronos/GLES3/gl3platform.h deleted file mode 100644 index 854aef4fd..000000000 --- a/core/deps/khronos/GLES3/gl3platform.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __gl3platform_h_ -#define __gl3platform_h_ - -/* $Revision: 23328 $ on $Date:: 2013-10-02 02:28:28 -0700 #$ */ - -/* - * This document is licensed under the SGI Free Software B License Version - * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . - */ - -/* Platform-specific types and definitions for OpenGL ES 3.X gl3.h - * - * Adopters may modify khrplatform.h and this file to suit their platform. - * You are encouraged to submit all modifications to the Khronos group so that - * they can be included in future versions of this file. Please submit changes - * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) - * by filing a bug against product "OpenGL-ES" component "Registry". - */ - -#include - -#ifndef GL_APICALL -#define GL_APICALL KHRONOS_APICALL -#endif - -#ifndef GL_APIENTRY -#define GL_APIENTRY KHRONOS_APIENTRY -#endif - -#endif /* __gl3platform_h_ */ \ No newline at end of file diff --git a/core/deps/khronos/GLES32/gl2ext.h b/core/deps/khronos/GLES32/gl2ext.h deleted file mode 100644 index a217b74e9..000000000 --- a/core/deps/khronos/GLES32/gl2ext.h +++ /dev/null @@ -1,3691 +0,0 @@ -#ifndef __gles2_gl2ext_h_ -#define __gles2_gl2ext_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2013-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ -/* -** This header is generated from the Khronos OpenGL / OpenGL ES XML -** API Registry. The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** https://github.com/KhronosGroup/OpenGL-Registry -*/ - -#ifndef GL_APIENTRYP -#define GL_APIENTRYP GL_APIENTRY* -#endif - -/* Generated on date 20190204 */ - -/* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9] - * Versions emitted: _nomatch_^ - * Default extensions included: gles2 - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_KHR_blend_equation_advanced -#define GL_KHR_blend_equation_advanced 1 -#define GL_MULTIPLY_KHR 0x9294 -#define GL_SCREEN_KHR 0x9295 -#define GL_OVERLAY_KHR 0x9296 -#define GL_DARKEN_KHR 0x9297 -#define GL_LIGHTEN_KHR 0x9298 -#define GL_COLORDODGE_KHR 0x9299 -#define GL_COLORBURN_KHR 0x929A -#define GL_HARDLIGHT_KHR 0x929B -#define GL_SOFTLIGHT_KHR 0x929C -#define GL_DIFFERENCE_KHR 0x929E -#define GL_EXCLUSION_KHR 0x92A0 -#define GL_HSL_HUE_KHR 0x92AD -#define GL_HSL_SATURATION_KHR 0x92AE -#define GL_HSL_COLOR_KHR 0x92AF -#define GL_HSL_LUMINOSITY_KHR 0x92B0 -typedef void (GL_APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void); -#endif -#endif /* GL_KHR_blend_equation_advanced */ - -#ifndef GL_KHR_blend_equation_advanced_coherent -#define GL_KHR_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 -#endif /* GL_KHR_blend_equation_advanced_coherent */ - -#ifndef GL_KHR_context_flush_control -#define GL_KHR_context_flush_control 1 -#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB -#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC -#endif /* GL_KHR_context_flush_control */ - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_SAMPLER 0x82E6 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 -#define GL_DEBUG_SOURCE_API_KHR 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A -#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B -#define GL_DEBUG_TYPE_ERROR_KHR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 -#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 -#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D -#define GL_BUFFER_KHR 0x82E0 -#define GL_SHADER_KHR 0x82E1 -#define GL_PROGRAM_KHR 0x82E2 -#define GL_VERTEX_ARRAY_KHR 0x8074 -#define GL_QUERY_KHR 0x82E3 -#define GL_PROGRAM_PIPELINE_KHR 0x82E4 -#define GL_SAMPLER_KHR 0x82E6 -#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 -#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 -#define GL_DEBUG_OUTPUT_KHR 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 -#define GL_STACK_OVERFLOW_KHR 0x0503 -#define GL_STACK_UNDERFLOW_KHR 0x0504 -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); -typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); -typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); -GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); -GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); -#endif -#endif /* GL_KHR_debug */ - -#ifndef GL_KHR_no_error -#define GL_KHR_no_error 1 -#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 -#endif /* GL_KHR_no_error */ - -#ifndef GL_KHR_parallel_shader_compile -#define GL_KHR_parallel_shader_compile 1 -#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 -#define GL_COMPLETION_STATUS_KHR 0x91B1 -typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); -#endif -#endif /* GL_KHR_parallel_shader_compile */ - -#ifndef GL_KHR_robust_buffer_access_behavior -#define GL_KHR_robust_buffer_access_behavior 1 -#endif /* GL_KHR_robust_buffer_access_behavior */ - -#ifndef GL_KHR_robustness -#define GL_KHR_robustness 1 -#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 -#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 -#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 -#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 -#define GL_CONTEXT_LOST_KHR 0x0507 -typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC) (void); -typedef void (GL_APIENTRYP PFNGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void); -GL_APICALL void GL_APIENTRY glReadnPixelsKHR (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GL_APICALL void GL_APIENTRY glGetnUniformfvKHR (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetnUniformivKHR (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -#endif -#endif /* GL_KHR_robustness */ - -#ifndef GL_KHR_texture_compression_astc_hdr -#define GL_KHR_texture_compression_astc_hdr 1 -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif /* GL_KHR_texture_compression_astc_hdr */ - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif /* GL_KHR_texture_compression_astc_ldr */ - -#ifndef GL_KHR_texture_compression_astc_sliced_3d -#define GL_KHR_texture_compression_astc_sliced_3d 1 -#endif /* GL_KHR_texture_compression_astc_sliced_3d */ - -#ifndef GL_OES_EGL_image -#define GL_OES_EGL_image 1 -typedef void *GLeglImageOES; -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); -GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); -#endif -#endif /* GL_OES_EGL_image */ - -#ifndef GL_OES_EGL_image_external -#define GL_OES_EGL_image_external 1 -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 -#define GL_SAMPLER_EXTERNAL_OES 0x8D66 -#endif /* GL_OES_EGL_image_external */ - -#ifndef GL_OES_EGL_image_external_essl3 -#define GL_OES_EGL_image_external_essl3 1 -#endif /* GL_OES_EGL_image_external_essl3 */ - -#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture -#define GL_OES_compressed_ETC1_RGB8_sub_texture 1 -#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */ - -#ifndef GL_OES_compressed_ETC1_RGB8_texture -#define GL_OES_compressed_ETC1_RGB8_texture 1 -#define GL_ETC1_RGB8_OES 0x8D64 -#endif /* GL_OES_compressed_ETC1_RGB8_texture */ - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif /* GL_OES_compressed_paletted_texture */ - -#ifndef GL_OES_copy_image -#define GL_OES_copy_image 1 -typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCopyImageSubDataOES (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif -#endif /* GL_OES_copy_image */ - -#ifndef GL_OES_depth24 -#define GL_OES_depth24 1 -#define GL_DEPTH_COMPONENT24_OES 0x81A6 -#endif /* GL_OES_depth24 */ - -#ifndef GL_OES_depth32 -#define GL_OES_depth32 1 -#define GL_DEPTH_COMPONENT32_OES 0x81A7 -#endif /* GL_OES_depth32 */ - -#ifndef GL_OES_depth_texture -#define GL_OES_depth_texture 1 -#endif /* GL_OES_depth_texture */ - -#ifndef GL_OES_draw_buffers_indexed -#define GL_OES_draw_buffers_indexed 1 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -typedef void (GL_APIENTRYP PFNGLENABLEIOESPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLDISABLEIOESPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP PFNGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glEnableiOES (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glDisableiOES (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glBlendEquationiOES (GLuint buf, GLenum mode); -GL_APICALL void GL_APIENTRY glBlendEquationSeparateiOES (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunciOES (GLuint buf, GLenum src, GLenum dst); -GL_APICALL void GL_APIENTRY glBlendFuncSeparateiOES (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GL_APICALL void GL_APIENTRY glColorMaskiOES (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index); -#endif -#endif /* GL_OES_draw_buffers_indexed */ - -#ifndef GL_OES_draw_elements_base_vertex -#define GL_OES_draw_elements_base_vertex 1 -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); -#endif -#endif /* GL_OES_draw_elements_base_vertex */ - -#ifndef GL_OES_element_index_uint -#define GL_OES_element_index_uint 1 -#endif /* GL_OES_element_index_uint */ - -#ifndef GL_OES_fbo_render_mipmap -#define GL_OES_fbo_render_mipmap 1 -#endif /* GL_OES_fbo_render_mipmap */ - -#ifndef GL_OES_fragment_precision_high -#define GL_OES_fragment_precision_high 1 -#endif /* GL_OES_fragment_precision_high */ - -#ifndef GL_OES_geometry_point_size -#define GL_OES_geometry_point_size 1 -#endif /* GL_OES_geometry_point_size */ - -#ifndef GL_OES_geometry_shader -#define GL_OES_geometry_shader 1 -#define GL_GEOMETRY_SHADER_OES 0x8DD9 -#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 -#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 -#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F -#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E -#define GL_LINES_ADJACENCY_OES 0x000A -#define GL_LINE_STRIP_ADJACENCY_OES 0x000B -#define GL_TRIANGLES_ADJACENCY_OES 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 -#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E -#define GL_UNDEFINED_VERTEX_OES 0x8260 -#define GL_PRIMITIVES_GENERATED_OES 0x8C87 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferTextureOES (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif -#endif /* GL_OES_geometry_shader */ - -#ifndef GL_OES_get_program_binary -#define GL_OES_get_program_binary 1 -#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE -#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF -typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -#endif -#endif /* GL_OES_get_program_binary */ - -#ifndef GL_OES_gpu_shader5 -#define GL_OES_gpu_shader5 1 -#endif /* GL_OES_gpu_shader5 */ - -#ifndef GL_OES_mapbuffer -#define GL_OES_mapbuffer 1 -#define GL_WRITE_ONLY_OES 0x88B9 -#define GL_BUFFER_ACCESS_OES 0x88BB -#define GL_BUFFER_MAPPED_OES 0x88BC -#define GL_BUFFER_MAP_POINTER_OES 0x88BD -typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); -typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); -GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); -GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); -#endif -#endif /* GL_OES_mapbuffer */ - -#ifndef GL_OES_packed_depth_stencil -#define GL_OES_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_DEPTH24_STENCIL8_OES 0x88F0 -#endif /* GL_OES_packed_depth_stencil */ - -#ifndef GL_OES_primitive_bounding_box -#define GL_OES_primitive_bounding_box 1 -#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE -typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxOES (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#endif -#endif /* GL_OES_primitive_bounding_box */ - -#ifndef GL_OES_required_internalformat -#define GL_OES_required_internalformat 1 -#define GL_ALPHA8_OES 0x803C -#define GL_DEPTH_COMPONENT16_OES 0x81A5 -#define GL_LUMINANCE4_ALPHA4_OES 0x8043 -#define GL_LUMINANCE8_ALPHA8_OES 0x8045 -#define GL_LUMINANCE8_OES 0x8040 -#define GL_RGBA4_OES 0x8056 -#define GL_RGB5_A1_OES 0x8057 -#define GL_RGB565_OES 0x8D62 -#define GL_RGB8_OES 0x8051 -#define GL_RGBA8_OES 0x8058 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB10_A2_EXT 0x8059 -#endif /* GL_OES_required_internalformat */ - -#ifndef GL_OES_rgb8_rgba8 -#define GL_OES_rgb8_rgba8 1 -#endif /* GL_OES_rgb8_rgba8 */ - -#ifndef GL_OES_sample_shading -#define GL_OES_sample_shading 1 -#define GL_SAMPLE_SHADING_OES 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 -typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glMinSampleShadingOES (GLfloat value); -#endif -#endif /* GL_OES_sample_shading */ - -#ifndef GL_OES_sample_variables -#define GL_OES_sample_variables 1 -#endif /* GL_OES_sample_variables */ - -#ifndef GL_OES_shader_image_atomic -#define GL_OES_shader_image_atomic 1 -#endif /* GL_OES_shader_image_atomic */ - -#ifndef GL_OES_shader_io_blocks -#define GL_OES_shader_io_blocks 1 -#endif /* GL_OES_shader_io_blocks */ - -#ifndef GL_OES_shader_multisample_interpolation -#define GL_OES_shader_multisample_interpolation 1 -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D -#endif /* GL_OES_shader_multisample_interpolation */ - -#ifndef GL_OES_standard_derivatives -#define GL_OES_standard_derivatives 1 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B -#endif /* GL_OES_standard_derivatives */ - -#ifndef GL_OES_stencil1 -#define GL_OES_stencil1 1 -#define GL_STENCIL_INDEX1_OES 0x8D46 -#endif /* GL_OES_stencil1 */ - -#ifndef GL_OES_stencil4 -#define GL_OES_stencil4 1 -#define GL_STENCIL_INDEX4_OES 0x8D47 -#endif /* GL_OES_stencil4 */ - -#ifndef GL_OES_surfaceless_context -#define GL_OES_surfaceless_context 1 -#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 -#endif /* GL_OES_surfaceless_context */ - -#ifndef GL_OES_tessellation_point_size -#define GL_OES_tessellation_point_size 1 -#endif /* GL_OES_tessellation_point_size */ - -#ifndef GL_OES_tessellation_shader -#define GL_OES_tessellation_shader 1 -#define GL_PATCHES_OES 0x000E -#define GL_PATCH_VERTICES_OES 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 -#define GL_TESS_GEN_MODE_OES 0x8E76 -#define GL_TESS_GEN_SPACING_OES 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 -#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 -#define GL_ISOLINES_OES 0x8E7A -#define GL_QUADS_OES 0x0007 -#define GL_FRACTIONAL_ODD_OES 0x8E7B -#define GL_FRACTIONAL_EVEN_OES 0x8E7C -#define GL_MAX_PATCH_VERTICES_OES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 -#define GL_IS_PER_PATCH_OES 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 -#define GL_TESS_CONTROL_SHADER_OES 0x8E88 -#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 -#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 -typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPatchParameteriOES (GLenum pname, GLint value); -#endif -#endif /* GL_OES_tessellation_shader */ - -#ifndef GL_OES_texture_3D -#define GL_OES_texture_3D 1 -#define GL_TEXTURE_WRAP_R_OES 0x8072 -#define GL_TEXTURE_3D_OES 0x806F -#define GL_TEXTURE_BINDING_3D_OES 0x806A -#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 -#define GL_SAMPLER_3D_OES 0x8B5F -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 -typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -#endif -#endif /* GL_OES_texture_3D */ - -#ifndef GL_OES_texture_border_clamp -#define GL_OES_texture_border_clamp 1 -#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 -#define GL_CLAMP_TO_BORDER_OES 0x812D -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexParameterIivOES (GLenum target, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glTexParameterIuivOES (GLenum target, GLenum pname, const GLuint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIivOES (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIuivOES (GLenum target, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glSamplerParameterIivOES (GLuint sampler, GLenum pname, const GLint *param); -GL_APICALL void GL_APIENTRY glSamplerParameterIuivOES (GLuint sampler, GLenum pname, const GLuint *param); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOES (GLuint sampler, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOES (GLuint sampler, GLenum pname, GLuint *params); -#endif -#endif /* GL_OES_texture_border_clamp */ - -#ifndef GL_OES_texture_buffer -#define GL_OES_texture_buffer 1 -#define GL_TEXTURE_BUFFER_OES 0x8C2A -#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F -#define GL_SAMPLER_BUFFER_OES 0x8DC2 -#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 -#define GL_IMAGE_BUFFER_OES 0x9051 -#define GL_INT_IMAGE_BUFFER_OES 0x905C -#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 -#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D -#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E -typedef void (GL_APIENTRYP PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexBufferOES (GLenum target, GLenum internalformat, GLuint buffer); -GL_APICALL void GL_APIENTRY glTexBufferRangeOES (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif -#endif /* GL_OES_texture_buffer */ - -#ifndef GL_OES_texture_compression_astc -#define GL_OES_texture_compression_astc 1 -#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 -#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 -#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 -#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 -#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 -#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 -#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 -#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 -#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 -#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 -#endif /* GL_OES_texture_compression_astc */ - -#ifndef GL_OES_texture_cube_map_array -#define GL_OES_texture_cube_map_array 1 -#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A -#endif /* GL_OES_texture_cube_map_array */ - -#ifndef GL_OES_texture_float -#define GL_OES_texture_float 1 -#endif /* GL_OES_texture_float */ - -#ifndef GL_OES_texture_float_linear -#define GL_OES_texture_float_linear 1 -#endif /* GL_OES_texture_float_linear */ - -#ifndef GL_OES_texture_half_float -#define GL_OES_texture_half_float 1 -#define GL_HALF_FLOAT_OES 0x8D61 -#endif /* GL_OES_texture_half_float */ - -#ifndef GL_OES_texture_half_float_linear -#define GL_OES_texture_half_float_linear 1 -#endif /* GL_OES_texture_half_float_linear */ - -#ifndef GL_OES_texture_npot -#define GL_OES_texture_npot 1 -#endif /* GL_OES_texture_npot */ - -#ifndef GL_OES_texture_stencil8 -#define GL_OES_texture_stencil8 1 -#define GL_STENCIL_INDEX_OES 0x1901 -#define GL_STENCIL_INDEX8_OES 0x8D48 -#endif /* GL_OES_texture_stencil8 */ - -#ifndef GL_OES_texture_storage_multisample_2d_array -#define GL_OES_texture_storage_multisample_2d_array 1 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOES (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif -#endif /* GL_OES_texture_storage_multisample_2d_array */ - -#ifndef GL_OES_texture_view -#define GL_OES_texture_view 1 -#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTextureViewOES (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif -#endif /* GL_OES_texture_view */ - -#ifndef GL_OES_vertex_array_object -#define GL_OES_vertex_array_object 1 -#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 -typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); -typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); -typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); -GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); -GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); -GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); -#endif -#endif /* GL_OES_vertex_array_object */ - -#ifndef GL_OES_vertex_half_float -#define GL_OES_vertex_half_float 1 -#endif /* GL_OES_vertex_half_float */ - -#ifndef GL_OES_vertex_type_10_10_10_2 -#define GL_OES_vertex_type_10_10_10_2 1 -#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 -#define GL_INT_10_10_10_2_OES 0x8DF7 -#endif /* GL_OES_vertex_type_10_10_10_2 */ - -#ifndef GL_OES_viewport_array -#define GL_OES_viewport_array 1 -#define GL_MAX_VIEWPORTS_OES 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS_OES 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE_OES 0x825D -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES 0x825F -typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP PFNGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glViewportArrayvOES (GLuint first, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glViewportIndexedfOES (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GL_APICALL void GL_APIENTRY glViewportIndexedfvOES (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glScissorArrayvOES (GLuint first, GLsizei count, const GLint *v); -GL_APICALL void GL_APIENTRY glScissorIndexedOES (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glScissorIndexedvOES (GLuint index, const GLint *v); -GL_APICALL void GL_APIENTRY glDepthRangeArrayfvOES (GLuint first, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glDepthRangeIndexedfOES (GLuint index, GLfloat n, GLfloat f); -GL_APICALL void GL_APIENTRY glGetFloati_vOES (GLenum target, GLuint index, GLfloat *data); -#endif -#endif /* GL_OES_viewport_array */ - -#ifndef GL_AMD_compressed_3DC_texture -#define GL_AMD_compressed_3DC_texture 1 -#define GL_3DC_X_AMD 0x87F9 -#define GL_3DC_XY_AMD 0x87FA -#endif /* GL_AMD_compressed_3DC_texture */ - -#ifndef GL_AMD_compressed_ATC_texture -#define GL_AMD_compressed_ATC_texture 1 -#define GL_ATC_RGB_AMD 0x8C92 -#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 -#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE -#endif /* GL_AMD_compressed_ATC_texture */ - -#ifndef GL_AMD_framebuffer_multisample_advanced -#define GL_AMD_framebuffer_multisample_advanced 1 -#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 -#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 -#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 -#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 -#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 -#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_AMD_framebuffer_multisample_advanced */ - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); -typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); -GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif -#endif /* GL_AMD_performance_monitor */ - -#ifndef GL_AMD_program_binary_Z400 -#define GL_AMD_program_binary_Z400 1 -#define GL_Z400_BINARY_AMD 0x8740 -#endif /* GL_AMD_program_binary_Z400 */ - -#ifndef GL_ANDROID_extension_pack_es31a -#define GL_ANDROID_extension_pack_es31a 1 -#endif /* GL_ANDROID_extension_pack_es31a */ - -#ifndef GL_ANGLE_depth_texture -#define GL_ANGLE_depth_texture 1 -#endif /* GL_ANGLE_depth_texture */ - -#ifndef GL_ANGLE_framebuffer_blit -#define GL_ANGLE_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA -typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_ANGLE_framebuffer_blit */ - -#ifndef GL_ANGLE_framebuffer_multisample -#define GL_ANGLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 -#define GL_MAX_SAMPLES_ANGLE 0x8D57 -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_ANGLE_framebuffer_multisample */ - -#ifndef GL_ANGLE_instanced_arrays -#define GL_ANGLE_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); -#endif -#endif /* GL_ANGLE_instanced_arrays */ - -#ifndef GL_ANGLE_pack_reverse_row_order -#define GL_ANGLE_pack_reverse_row_order 1 -#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 -#endif /* GL_ANGLE_pack_reverse_row_order */ - -#ifndef GL_ANGLE_program_binary -#define GL_ANGLE_program_binary 1 -#define GL_PROGRAM_BINARY_ANGLE 0x93A6 -#endif /* GL_ANGLE_program_binary */ - -#ifndef GL_ANGLE_texture_compression_dxt3 -#define GL_ANGLE_texture_compression_dxt3 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 -#endif /* GL_ANGLE_texture_compression_dxt3 */ - -#ifndef GL_ANGLE_texture_compression_dxt5 -#define GL_ANGLE_texture_compression_dxt5 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 -#endif /* GL_ANGLE_texture_compression_dxt5 */ - -#ifndef GL_ANGLE_texture_usage -#define GL_ANGLE_texture_usage 1 -#define GL_TEXTURE_USAGE_ANGLE 0x93A2 -#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 -#endif /* GL_ANGLE_texture_usage */ - -#ifndef GL_ANGLE_translated_shader_source -#define GL_ANGLE_translated_shader_source 1 -#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 -typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source); -#endif -#endif /* GL_ANGLE_translated_shader_source */ - -#ifndef GL_APPLE_clip_distance -#define GL_APPLE_clip_distance 1 -#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 -#define GL_CLIP_DISTANCE0_APPLE 0x3000 -#define GL_CLIP_DISTANCE1_APPLE 0x3001 -#define GL_CLIP_DISTANCE2_APPLE 0x3002 -#define GL_CLIP_DISTANCE3_APPLE 0x3003 -#define GL_CLIP_DISTANCE4_APPLE 0x3004 -#define GL_CLIP_DISTANCE5_APPLE 0x3005 -#define GL_CLIP_DISTANCE6_APPLE 0x3006 -#define GL_CLIP_DISTANCE7_APPLE 0x3007 -#endif /* GL_APPLE_clip_distance */ - -#ifndef GL_APPLE_color_buffer_packed_float -#define GL_APPLE_color_buffer_packed_float 1 -#endif /* GL_APPLE_color_buffer_packed_float */ - -#ifndef GL_APPLE_copy_texture_levels -#define GL_APPLE_copy_texture_levels 1 -typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); -#endif -#endif /* GL_APPLE_copy_texture_levels */ - -#ifndef GL_APPLE_framebuffer_multisample -#define GL_APPLE_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 -#define GL_MAX_SAMPLES_APPLE 0x8D57 -#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); -#endif -#endif /* GL_APPLE_framebuffer_multisample */ - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#define GL_RGB_422_APPLE 0x8A1F -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#define GL_RGB_RAW_422_APPLE 0x8A51 -#endif /* GL_APPLE_rgb_422 */ - -#ifndef GL_APPLE_sync -#define GL_APPLE_sync 1 -#define GL_SYNC_OBJECT_APPLE 0x8A53 -#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 -#define GL_OBJECT_TYPE_APPLE 0x9112 -#define GL_SYNC_CONDITION_APPLE 0x9113 -#define GL_SYNC_STATUS_APPLE 0x9114 -#define GL_SYNC_FLAGS_APPLE 0x9115 -#define GL_SYNC_FENCE_APPLE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 -#define GL_UNSIGNALED_APPLE 0x9118 -#define GL_SIGNALED_APPLE 0x9119 -#define GL_ALREADY_SIGNALED_APPLE 0x911A -#define GL_TIMEOUT_EXPIRED_APPLE 0x911B -#define GL_CONDITION_SATISFIED_APPLE 0x911C -#define GL_WAIT_FAILED_APPLE 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 -#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull -typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); -typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); -typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); -GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); -GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); -GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); -GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif -#endif /* GL_APPLE_sync */ - -#ifndef GL_APPLE_texture_format_BGRA8888 -#define GL_APPLE_texture_format_BGRA8888 1 -#define GL_BGRA_EXT 0x80E1 -#define GL_BGRA8_EXT 0x93A1 -#endif /* GL_APPLE_texture_format_BGRA8888 */ - -#ifndef GL_APPLE_texture_max_level -#define GL_APPLE_texture_max_level 1 -#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D -#endif /* GL_APPLE_texture_max_level */ - -#ifndef GL_APPLE_texture_packed_float -#define GL_APPLE_texture_packed_float 1 -#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B -#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E -#define GL_R11F_G11F_B10F_APPLE 0x8C3A -#define GL_RGB9_E5_APPLE 0x8C3D -#endif /* GL_APPLE_texture_packed_float */ - -#ifndef GL_ARM_mali_program_binary -#define GL_ARM_mali_program_binary 1 -#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 -#endif /* GL_ARM_mali_program_binary */ - -#ifndef GL_ARM_mali_shader_binary -#define GL_ARM_mali_shader_binary 1 -#define GL_MALI_SHADER_BINARY_ARM 0x8F60 -#endif /* GL_ARM_mali_shader_binary */ - -#ifndef GL_ARM_rgba8 -#define GL_ARM_rgba8 1 -#endif /* GL_ARM_rgba8 */ - -#ifndef GL_ARM_shader_framebuffer_fetch -#define GL_ARM_shader_framebuffer_fetch 1 -#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 -#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 -#endif /* GL_ARM_shader_framebuffer_fetch */ - -#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil -#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 -#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ - -#ifndef GL_DMP_program_binary -#define GL_DMP_program_binary 1 -#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 -#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 -#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 -#endif /* GL_DMP_program_binary */ - -#ifndef GL_DMP_shader_binary -#define GL_DMP_shader_binary 1 -#define GL_SHADER_BINARY_DMP 0x9250 -#endif /* GL_DMP_shader_binary */ - -#ifndef GL_EXT_EGL_image_array -#define GL_EXT_EGL_image_array 1 -#endif /* GL_EXT_EGL_image_array */ - -#ifndef GL_EXT_EGL_image_storage -#define GL_EXT_EGL_image_storage 1 -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); -typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); -GL_APICALL void GL_APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); -#endif -#endif /* GL_EXT_EGL_image_storage */ - -#ifndef GL_EXT_YUV_target -#define GL_EXT_YUV_target 1 -#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 -#endif /* GL_EXT_YUV_target */ - -#ifndef GL_EXT_base_instance -#define GL_EXT_base_instance 1 -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawArraysInstancedBaseInstanceEXT (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#endif -#endif /* GL_EXT_base_instance */ - -#ifndef GL_EXT_blend_func_extended -#define GL_EXT_blend_func_extended 1 -#define GL_SRC1_COLOR_EXT 0x88F9 -#define GL_SRC1_ALPHA_EXT 0x8589 -#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB -#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 -#define GL_LOCATION_INDEX_EXT 0x930F -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC -typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXT (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GL_APICALL void GL_APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXT (GLuint program, GLenum programInterface, const GLchar *name); -GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXT (GLuint program, const GLchar *name); -#endif -#endif /* GL_EXT_blend_func_extended */ - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#endif /* GL_EXT_blend_minmax */ - -#ifndef GL_EXT_buffer_storage -#define GL_EXT_buffer_storage 1 -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 -#define GL_MAP_COHERENT_BIT_EXT 0x0080 -#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 -#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 -#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 -#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F -#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 -typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBufferStorageEXT (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -#endif -#endif /* GL_EXT_buffer_storage */ - -#ifndef GL_EXT_clear_texture -#define GL_EXT_clear_texture 1 -typedef void (GL_APIENTRYP PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GL_APIENTRYP PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glClearTexImageEXT (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -GL_APICALL void GL_APIENTRY glClearTexSubImageEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -#endif -#endif /* GL_EXT_clear_texture */ - -#ifndef GL_EXT_clip_control -#define GL_EXT_clip_control 1 -#define GL_LOWER_LEFT_EXT 0x8CA1 -#define GL_UPPER_LEFT_EXT 0x8CA2 -#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E -#define GL_ZERO_TO_ONE_EXT 0x935F -#define GL_CLIP_ORIGIN_EXT 0x935C -#define GL_CLIP_DEPTH_MODE_EXT 0x935D -typedef void (GL_APIENTRYP PFNGLCLIPCONTROLEXTPROC) (GLenum origin, GLenum depth); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glClipControlEXT (GLenum origin, GLenum depth); -#endif -#endif /* GL_EXT_clip_control */ - -#ifndef GL_EXT_clip_cull_distance -#define GL_EXT_clip_cull_distance 1 -#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 -#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 -#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA -#define GL_CLIP_DISTANCE0_EXT 0x3000 -#define GL_CLIP_DISTANCE1_EXT 0x3001 -#define GL_CLIP_DISTANCE2_EXT 0x3002 -#define GL_CLIP_DISTANCE3_EXT 0x3003 -#define GL_CLIP_DISTANCE4_EXT 0x3004 -#define GL_CLIP_DISTANCE5_EXT 0x3005 -#define GL_CLIP_DISTANCE6_EXT 0x3006 -#define GL_CLIP_DISTANCE7_EXT 0x3007 -#endif /* GL_EXT_clip_cull_distance */ - -#ifndef GL_EXT_color_buffer_float -#define GL_EXT_color_buffer_float 1 -#endif /* GL_EXT_color_buffer_float */ - -#ifndef GL_EXT_color_buffer_half_float -#define GL_EXT_color_buffer_half_float 1 -#define GL_RGBA16F_EXT 0x881A -#define GL_RGB16F_EXT 0x881B -#define GL_RG16F_EXT 0x822F -#define GL_R16F_EXT 0x822D -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 -#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 -#endif /* GL_EXT_color_buffer_half_float */ - -#ifndef GL_EXT_conservative_depth -#define GL_EXT_conservative_depth 1 -#endif /* GL_EXT_conservative_depth */ - -#ifndef GL_EXT_copy_image -#define GL_EXT_copy_image 1 -typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCopyImageSubDataEXT (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif -#endif /* GL_EXT_copy_image */ - -#ifndef GL_EXT_debug_label -#define GL_EXT_debug_label 1 -#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F -#define GL_PROGRAM_OBJECT_EXT 0x8B40 -#define GL_SHADER_OBJECT_EXT 0x8B48 -#define GL_BUFFER_OBJECT_EXT 0x9151 -#define GL_QUERY_OBJECT_EXT 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 -#define GL_TRANSFORM_FEEDBACK 0x8E22 -typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif -#endif /* GL_EXT_debug_label */ - -#ifndef GL_EXT_debug_marker -#define GL_EXT_debug_marker 1 -typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); -GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); -GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); -#endif -#endif /* GL_EXT_debug_marker */ - -#ifndef GL_EXT_depth_clamp -#define GL_EXT_depth_clamp 1 -#define GL_DEPTH_CLAMP_EXT 0x864F -#endif /* GL_EXT_depth_clamp */ - -#ifndef GL_EXT_discard_framebuffer -#define GL_EXT_discard_framebuffer 1 -#define GL_COLOR_EXT 0x1800 -#define GL_DEPTH_EXT 0x1801 -#define GL_STENCIL_EXT 0x1802 -typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); -#endif -#endif /* GL_EXT_discard_framebuffer */ - -#ifndef GL_EXT_disjoint_timer_query -#define GL_EXT_disjoint_timer_query 1 -#define GL_QUERY_COUNTER_BITS_EXT 0x8864 -#define GL_CURRENT_QUERY_EXT 0x8865 -#define GL_QUERY_RESULT_EXT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 -#define GL_TIME_ELAPSED_EXT 0x88BF -#define GL_TIMESTAMP_EXT 0x8E28 -#define GL_GPU_DISJOINT_EXT 0x8FBB -typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); -typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); -typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); -typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); -GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); -GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); -GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); -GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); -GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); -GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); -GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); -#endif -#endif /* GL_EXT_disjoint_timer_query */ - -#ifndef GL_EXT_draw_buffers -#define GL_EXT_draw_buffers 1 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 -#define GL_DRAW_BUFFER0_EXT 0x8825 -#define GL_DRAW_BUFFER1_EXT 0x8826 -#define GL_DRAW_BUFFER2_EXT 0x8827 -#define GL_DRAW_BUFFER3_EXT 0x8828 -#define GL_DRAW_BUFFER4_EXT 0x8829 -#define GL_DRAW_BUFFER5_EXT 0x882A -#define GL_DRAW_BUFFER6_EXT 0x882B -#define GL_DRAW_BUFFER7_EXT 0x882C -#define GL_DRAW_BUFFER8_EXT 0x882D -#define GL_DRAW_BUFFER9_EXT 0x882E -#define GL_DRAW_BUFFER10_EXT 0x882F -#define GL_DRAW_BUFFER11_EXT 0x8830 -#define GL_DRAW_BUFFER12_EXT 0x8831 -#define GL_DRAW_BUFFER13_EXT 0x8832 -#define GL_DRAW_BUFFER14_EXT 0x8833 -#define GL_DRAW_BUFFER15_EXT 0x8834 -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_EXT_draw_buffers */ - -#ifndef GL_EXT_draw_buffers_indexed -#define GL_EXT_draw_buffers_indexed 1 -typedef void (GL_APIENTRYP PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP PFNGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glEnableiEXT (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glDisableiEXT (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glBlendEquationiEXT (GLuint buf, GLenum mode); -GL_APICALL void GL_APIENTRY glBlendEquationSeparateiEXT (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunciEXT (GLuint buf, GLenum src, GLenum dst); -GL_APICALL void GL_APIENTRY glBlendFuncSeparateiEXT (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GL_APICALL void GL_APIENTRY glColorMaskiEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index); -#endif -#endif /* GL_EXT_draw_buffers_indexed */ - -#ifndef GL_EXT_draw_elements_base_vertex -#define GL_EXT_draw_elements_base_vertex 1 -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -#endif -#endif /* GL_EXT_draw_elements_base_vertex */ - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_EXT_draw_instanced */ - -#ifndef GL_EXT_draw_transform_feedback -#define GL_EXT_draw_transform_feedback 1 -typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKEXTPROC) (GLenum mode, GLuint id); -typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC) (GLenum mode, GLuint id, GLsizei instancecount); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawTransformFeedbackEXT (GLenum mode, GLuint id); -GL_APICALL void GL_APIENTRY glDrawTransformFeedbackInstancedEXT (GLenum mode, GLuint id, GLsizei instancecount); -#endif -#endif /* GL_EXT_draw_transform_feedback */ - -#ifndef GL_EXT_external_buffer -#define GL_EXT_external_buffer 1 -typedef void *GLeglClientBufferEXT; -typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -GL_APICALL void GL_APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); -#endif -#endif /* GL_EXT_external_buffer */ - -#ifndef GL_EXT_float_blend -#define GL_EXT_float_blend 1 -#endif /* GL_EXT_float_blend */ - -#ifndef GL_EXT_geometry_point_size -#define GL_EXT_geometry_point_size 1 -#endif /* GL_EXT_geometry_point_size */ - -#ifndef GL_EXT_geometry_shader -#define GL_EXT_geometry_shader 1 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 -#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 -#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 -#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 -#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F -#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E -#define GL_LINES_ADJACENCY_EXT 0x000A -#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B -#define GL_TRIANGLES_ADJACENCY_EXT 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_UNDEFINED_VERTEX_EXT 0x8260 -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif -#endif /* GL_EXT_geometry_shader */ - -#ifndef GL_EXT_gpu_shader5 -#define GL_EXT_gpu_shader5 1 -#endif /* GL_EXT_gpu_shader5 */ - -#ifndef GL_EXT_instanced_arrays -#define GL_EXT_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor); -#endif -#endif /* GL_EXT_instanced_arrays */ - -#ifndef GL_EXT_map_buffer_range -#define GL_EXT_map_buffer_range 1 -#define GL_MAP_READ_BIT_EXT 0x0001 -#define GL_MAP_WRITE_BIT_EXT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 -typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); -#endif -#endif /* GL_EXT_map_buffer_range */ - -#ifndef GL_EXT_memory_object -#define GL_EXT_memory_object 1 -#define GL_TEXTURE_TILING_EXT 0x9580 -#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 -#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B -#define GL_NUM_TILING_TYPES_EXT 0x9582 -#define GL_TILING_TYPES_EXT 0x9583 -#define GL_OPTIMAL_TILING_EXT 0x9584 -#define GL_LINEAR_TILING_EXT 0x9585 -#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 -#define GL_DEVICE_UUID_EXT 0x9597 -#define GL_DRIVER_UUID_EXT 0x9598 -#define GL_UUID_SIZE_EXT 16 -typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); -typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); -typedef void (GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); -typedef GLboolean (GL_APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); -typedef void (GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); -typedef void (GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); -GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); -GL_APICALL void GL_APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); -GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); -GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); -GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); -#endif -#endif /* GL_EXT_memory_object */ - -#ifndef GL_EXT_memory_object_fd -#define GL_EXT_memory_object_fd 1 -#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 -typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); -#endif -#endif /* GL_EXT_memory_object_fd */ - -#ifndef GL_EXT_memory_object_win32 -#define GL_EXT_memory_object_win32 1 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 -#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 -#define GL_DEVICE_LUID_EXT 0x9599 -#define GL_DEVICE_NODE_MASK_EXT 0x959A -#define GL_LUID_SIZE_EXT 8 -#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 -#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A -#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B -#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C -typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); -GL_APICALL void GL_APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); -#endif -#endif /* GL_EXT_memory_object_win32 */ - -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 -typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -#endif -#endif /* GL_EXT_multi_draw_arrays */ - -#ifndef GL_EXT_multi_draw_indirect -#define GL_EXT_multi_draw_indirect 1 -typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glMultiDrawArraysIndirectEXT (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -GL_APICALL void GL_APIENTRY glMultiDrawElementsIndirectEXT (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#endif -#endif /* GL_EXT_multi_draw_indirect */ - -#ifndef GL_EXT_multisampled_compatibility -#define GL_EXT_multisampled_compatibility 1 -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#endif /* GL_EXT_multisampled_compatibility */ - -#ifndef GL_EXT_multisampled_render_to_texture -#define GL_EXT_multisampled_render_to_texture 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_EXT_multisampled_render_to_texture */ - -#ifndef GL_EXT_multiview_draw_buffers -#define GL_EXT_multiview_draw_buffers 1 -#define GL_COLOR_ATTACHMENT_EXT 0x90F0 -#define GL_MULTIVIEW_EXT 0x90F1 -#define GL_DRAW_BUFFER_EXT 0x0C01 -#define GL_READ_BUFFER_EXT 0x0C02 -#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 -typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); -typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); -GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); -GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); -#endif -#endif /* GL_EXT_multiview_draw_buffers */ - -#ifndef GL_EXT_occlusion_query_boolean -#define GL_EXT_occlusion_query_boolean 1 -#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A -#endif /* GL_EXT_occlusion_query_boolean */ - -#ifndef GL_EXT_polygon_offset_clamp -#define GL_EXT_polygon_offset_clamp 1 -#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B -typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); -#endif -#endif /* GL_EXT_polygon_offset_clamp */ - -#ifndef GL_EXT_post_depth_coverage -#define GL_EXT_post_depth_coverage 1 -#endif /* GL_EXT_post_depth_coverage */ - -#ifndef GL_EXT_primitive_bounding_box -#define GL_EXT_primitive_bounding_box 1 -#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE -typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxEXT (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -#endif -#endif /* GL_EXT_primitive_bounding_box */ - -#ifndef GL_EXT_protected_textures -#define GL_EXT_protected_textures 1 -#define GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT 0x00000010 -#define GL_TEXTURE_PROTECTED_EXT 0x8BFA -#endif /* GL_EXT_protected_textures */ - -#ifndef GL_EXT_pvrtc_sRGB -#define GL_EXT_pvrtc_sRGB 1 -#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 -#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 -#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 -#endif /* GL_EXT_pvrtc_sRGB */ - -#ifndef GL_EXT_raster_multisample -#define GL_EXT_raster_multisample 1 -#define GL_RASTER_MULTISAMPLE_EXT 0x9327 -#define GL_RASTER_SAMPLES_EXT 0x9328 -#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 -#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A -#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B -#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C -typedef void (GL_APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); -#endif -#endif /* GL_EXT_raster_multisample */ - -#ifndef GL_EXT_read_format_bgra -#define GL_EXT_read_format_bgra 1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 -#endif /* GL_EXT_read_format_bgra */ - -#ifndef GL_EXT_render_snorm -#define GL_EXT_render_snorm 1 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM_EXT 0x8F98 -#define GL_RG16_SNORM_EXT 0x8F99 -#define GL_RGBA16_SNORM_EXT 0x8F9B -#endif /* GL_EXT_render_snorm */ - -#ifndef GL_EXT_robustness -#define GL_EXT_robustness 1 -#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 -#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 -#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 -#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 -#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 -typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); -typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); -GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_EXT_robustness */ - -#ifndef GL_EXT_sRGB -#define GL_EXT_sRGB 1 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 -#endif /* GL_EXT_sRGB */ - -#ifndef GL_EXT_sRGB_write_control -#define GL_EXT_sRGB_write_control 1 -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#endif /* GL_EXT_sRGB_write_control */ - -#ifndef GL_EXT_semaphore -#define GL_EXT_semaphore 1 -#define GL_LAYOUT_GENERAL_EXT 0x958D -#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E -#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F -#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 -#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 -#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 -#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 -#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 -#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 -typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); -typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); -typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); -typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); -typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); -typedef void (GL_APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); -typedef void (GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); -GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); -GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXT (GLuint semaphore); -GL_APICALL void GL_APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); -GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); -GL_APICALL void GL_APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); -GL_APICALL void GL_APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); -#endif -#endif /* GL_EXT_semaphore */ - -#ifndef GL_EXT_semaphore_fd -#define GL_EXT_semaphore_fd 1 -typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); -#endif -#endif /* GL_EXT_semaphore_fd */ - -#ifndef GL_EXT_semaphore_win32 -#define GL_EXT_semaphore_win32 1 -#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 -#define GL_D3D12_FENCE_VALUE_EXT 0x9595 -typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); -typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); -GL_APICALL void GL_APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); -#endif -#endif /* GL_EXT_semaphore_win32 */ - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#define GL_ACTIVE_PROGRAM_EXT 0x8259 -#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 -#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE_EXT 0x8258 -#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A -typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); -typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); -typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); -typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); -GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); -GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); -GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); -GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); -GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); -GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); -GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); -GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); -GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_EXT_separate_shader_objects */ - -#ifndef GL_EXT_shader_framebuffer_fetch -#define GL_EXT_shader_framebuffer_fetch 1 -#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 -#endif /* GL_EXT_shader_framebuffer_fetch */ - -#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent -#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierEXT (void); -#endif -#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ - -#ifndef GL_EXT_shader_group_vote -#define GL_EXT_shader_group_vote 1 -#endif /* GL_EXT_shader_group_vote */ - -#ifndef GL_EXT_shader_implicit_conversions -#define GL_EXT_shader_implicit_conversions 1 -#endif /* GL_EXT_shader_implicit_conversions */ - -#ifndef GL_EXT_shader_integer_mix -#define GL_EXT_shader_integer_mix 1 -#endif /* GL_EXT_shader_integer_mix */ - -#ifndef GL_EXT_shader_io_blocks -#define GL_EXT_shader_io_blocks 1 -#endif /* GL_EXT_shader_io_blocks */ - -#ifndef GL_EXT_shader_non_constant_global_initializers -#define GL_EXT_shader_non_constant_global_initializers 1 -#endif /* GL_EXT_shader_non_constant_global_initializers */ - -#ifndef GL_EXT_shader_pixel_local_storage -#define GL_EXT_shader_pixel_local_storage 1 -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 -#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 -#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 -#endif /* GL_EXT_shader_pixel_local_storage */ - -#ifndef GL_EXT_shader_pixel_local_storage2 -#define GL_EXT_shader_pixel_local_storage2 1 -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 -#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 -#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); -typedef GLsizei (GL_APIENTRYP PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); -typedef void (GL_APIENTRYP PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferPixelLocalStorageSizeEXT (GLuint target, GLsizei size); -GL_APICALL GLsizei GL_APIENTRY glGetFramebufferPixelLocalStorageSizeEXT (GLuint target); -GL_APICALL void GL_APIENTRY glClearPixelLocalStorageuiEXT (GLsizei offset, GLsizei n, const GLuint *values); -#endif -#endif /* GL_EXT_shader_pixel_local_storage2 */ - -#ifndef GL_EXT_shader_texture_lod -#define GL_EXT_shader_texture_lod 1 -#endif /* GL_EXT_shader_texture_lod */ - -#ifndef GL_EXT_shadow_samplers -#define GL_EXT_shadow_samplers 1 -#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C -#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D -#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E -#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 -#endif /* GL_EXT_shadow_samplers */ - -#ifndef GL_EXT_sparse_texture -#define GL_EXT_sparse_texture 1 -#define GL_TEXTURE_SPARSE_EXT 0x91A6 -#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 -#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA -#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 -#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_3D 0x806F -#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A -#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 -typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexPageCommitmentEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -#endif -#endif /* GL_EXT_sparse_texture */ - -#ifndef GL_EXT_sparse_texture2 -#define GL_EXT_sparse_texture2 1 -#endif /* GL_EXT_sparse_texture2 */ - -#ifndef GL_EXT_tessellation_point_size -#define GL_EXT_tessellation_point_size 1 -#endif /* GL_EXT_tessellation_point_size */ - -#ifndef GL_EXT_tessellation_shader -#define GL_EXT_tessellation_shader 1 -#define GL_PATCHES_EXT 0x000E -#define GL_PATCH_VERTICES_EXT 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 -#define GL_TESS_GEN_MODE_EXT 0x8E76 -#define GL_TESS_GEN_SPACING_EXT 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 -#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 -#define GL_ISOLINES_EXT 0x8E7A -#define GL_QUADS_EXT 0x0007 -#define GL_FRACTIONAL_ODD_EXT 0x8E7B -#define GL_FRACTIONAL_EVEN_EXT 0x8E7C -#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_IS_PER_PATCH_EXT 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 -#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 -#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 -#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 -typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPatchParameteriEXT (GLenum pname, GLint value); -#endif -#endif /* GL_EXT_tessellation_shader */ - -#ifndef GL_EXT_texture_border_clamp -#define GL_EXT_texture_border_clamp 1 -#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 -#define GL_CLAMP_TO_BORDER_EXT 0x812D -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glSamplerParameterIivEXT (GLuint sampler, GLenum pname, const GLint *param); -GL_APICALL void GL_APIENTRY glSamplerParameterIuivEXT (GLuint sampler, GLenum pname, const GLuint *param); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIivEXT (GLuint sampler, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivEXT (GLuint sampler, GLenum pname, GLuint *params); -#endif -#endif /* GL_EXT_texture_border_clamp */ - -#ifndef GL_EXT_texture_buffer -#define GL_EXT_texture_buffer 1 -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D -#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E -typedef void (GL_APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif -#endif /* GL_EXT_texture_buffer */ - -#ifndef GL_EXT_texture_compression_astc_decode_mode -#define GL_EXT_texture_compression_astc_decode_mode 1 -#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 -#endif /* GL_EXT_texture_compression_astc_decode_mode */ - -#ifndef GL_EXT_texture_compression_bptc -#define GL_EXT_texture_compression_bptc 1 -#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F -#endif /* GL_EXT_texture_compression_bptc */ - -#ifndef GL_EXT_texture_compression_dxt1 -#define GL_EXT_texture_compression_dxt1 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#endif /* GL_EXT_texture_compression_dxt1 */ - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif /* GL_EXT_texture_compression_rgtc */ - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifndef GL_EXT_texture_compression_s3tc_srgb -#define GL_EXT_texture_compression_s3tc_srgb 1 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif /* GL_EXT_texture_compression_s3tc_srgb */ - -#ifndef GL_EXT_texture_cube_map_array -#define GL_EXT_texture_cube_map_array 1 -#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#endif /* GL_EXT_texture_cube_map_array */ - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif /* GL_EXT_texture_filter_anisotropic */ - -#ifndef GL_EXT_texture_filter_minmax -#define GL_EXT_texture_filter_minmax 1 -#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 -#define GL_WEIGHTED_AVERAGE_EXT 0x9367 -#endif /* GL_EXT_texture_filter_minmax */ - -#ifndef GL_EXT_texture_format_BGRA8888 -#define GL_EXT_texture_format_BGRA8888 1 -#endif /* GL_EXT_texture_format_BGRA8888 */ - -#ifndef GL_EXT_texture_format_sRGB_override -#define GL_EXT_texture_format_sRGB_override 1 -#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF -#endif /* GL_EXT_texture_format_sRGB_override */ - -#ifndef GL_EXT_texture_mirror_clamp_to_edge -#define GL_EXT_texture_mirror_clamp_to_edge 1 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#endif /* GL_EXT_texture_mirror_clamp_to_edge */ - -#ifndef GL_EXT_texture_norm16 -#define GL_EXT_texture_norm16 1 -#define GL_R16_EXT 0x822A -#define GL_RG16_EXT 0x822C -#define GL_RGBA16_EXT 0x805B -#define GL_RGB16_EXT 0x8054 -#define GL_RGB16_SNORM_EXT 0x8F9A -#endif /* GL_EXT_texture_norm16 */ - -#ifndef GL_EXT_texture_rg -#define GL_EXT_texture_rg 1 -#define GL_RED_EXT 0x1903 -#define GL_RG_EXT 0x8227 -#define GL_R8_EXT 0x8229 -#define GL_RG8_EXT 0x822B -#endif /* GL_EXT_texture_rg */ - -#ifndef GL_EXT_texture_sRGB_R8 -#define GL_EXT_texture_sRGB_R8 1 -#define GL_SR8_EXT 0x8FBD -#endif /* GL_EXT_texture_sRGB_R8 */ - -#ifndef GL_EXT_texture_sRGB_RG8 -#define GL_EXT_texture_sRGB_RG8 1 -#define GL_SRG8_EXT 0x8FBE -#endif /* GL_EXT_texture_sRGB_RG8 */ - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif /* GL_EXT_texture_sRGB_decode */ - -#ifndef GL_EXT_texture_storage -#define GL_EXT_texture_storage 1 -#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F -#define GL_ALPHA8_EXT 0x803C -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_RGBA32F_EXT 0x8814 -#define GL_RGB32F_EXT 0x8815 -#define GL_ALPHA32F_EXT 0x8816 -#define GL_LUMINANCE32F_EXT 0x8818 -#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 -#define GL_ALPHA16F_EXT 0x881C -#define GL_LUMINANCE16F_EXT 0x881E -#define GL_LUMINANCE_ALPHA16F_EXT 0x881F -#define GL_R32F_EXT 0x822E -#define GL_RG32F_EXT 0x8230 -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif -#endif /* GL_EXT_texture_storage */ - -#ifndef GL_EXT_texture_type_2_10_10_10_REV -#define GL_EXT_texture_type_2_10_10_10_REV 1 -#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 -#endif /* GL_EXT_texture_type_2_10_10_10_REV */ - -#ifndef GL_EXT_texture_view -#define GL_EXT_texture_view 1 -#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE -typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif -#endif /* GL_EXT_texture_view */ - -#ifndef GL_EXT_unpack_subimage -#define GL_EXT_unpack_subimage 1 -#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 -#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 -#endif /* GL_EXT_unpack_subimage */ - -#ifndef GL_EXT_win32_keyed_mutex -#define GL_EXT_win32_keyed_mutex 1 -typedef GLboolean (GL_APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); -typedef GLboolean (GL_APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLboolean GL_APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); -GL_APICALL GLboolean GL_APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); -#endif -#endif /* GL_EXT_win32_keyed_mutex */ - -#ifndef GL_EXT_window_rectangles -#define GL_EXT_window_rectangles 1 -#define GL_INCLUSIVE_EXT 0x8F10 -#define GL_EXCLUSIVE_EXT 0x8F11 -#define GL_WINDOW_RECTANGLE_EXT 0x8F12 -#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 -#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 -#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 -typedef void (GL_APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); -#endif -#endif /* GL_EXT_window_rectangles */ - -#ifndef GL_FJ_shader_binary_GCCSO -#define GL_FJ_shader_binary_GCCSO 1 -#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 -#endif /* GL_FJ_shader_binary_GCCSO */ - -#ifndef GL_IMG_bindless_texture -#define GL_IMG_bindless_texture 1 -typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLEIMGPROC) (GLuint texture); -typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEIMGPROC) (GLuint texture, GLuint sampler); -typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64IMGPROC) (GLint location, GLuint64 value); -typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VIMGPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleIMG (GLuint texture); -GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleIMG (GLuint texture, GLuint sampler); -GL_APICALL void GL_APIENTRY glUniformHandleui64IMG (GLint location, GLuint64 value); -GL_APICALL void GL_APIENTRY glUniformHandleui64vIMG (GLint location, GLsizei count, const GLuint64 *value); -GL_APICALL void GL_APIENTRY glProgramUniformHandleui64IMG (GLuint program, GLint location, GLuint64 value); -GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vIMG (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -#endif -#endif /* GL_IMG_bindless_texture */ - -#ifndef GL_IMG_framebuffer_downsample -#define GL_IMG_framebuffer_downsample 1 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG 0x913C -#define GL_NUM_DOWNSAMPLE_SCALES_IMG 0x913D -#define GL_DOWNSAMPLE_SCALES_IMG 0x913E -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG 0x913F -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferTexture2DDownsampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); -GL_APICALL void GL_APIENTRY glFramebufferTextureLayerDownsampleIMG (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); -#endif -#endif /* GL_IMG_framebuffer_downsample */ - -#ifndef GL_IMG_multisampled_render_to_texture -#define GL_IMG_multisampled_render_to_texture 1 -#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 -#define GL_MAX_SAMPLES_IMG 0x9135 -#define GL_TEXTURE_SAMPLES_IMG 0x9136 -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -#endif -#endif /* GL_IMG_multisampled_render_to_texture */ - -#ifndef GL_IMG_program_binary -#define GL_IMG_program_binary 1 -#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 -#endif /* GL_IMG_program_binary */ - -#ifndef GL_IMG_read_format -#define GL_IMG_read_format 1 -#define GL_BGRA_IMG 0x80E1 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 -#endif /* GL_IMG_read_format */ - -#ifndef GL_IMG_shader_binary -#define GL_IMG_shader_binary 1 -#define GL_SGX_BINARY_IMG 0x8C0A -#endif /* GL_IMG_shader_binary */ - -#ifndef GL_IMG_texture_compression_pvrtc -#define GL_IMG_texture_compression_pvrtc 1 -#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#endif /* GL_IMG_texture_compression_pvrtc */ - -#ifndef GL_IMG_texture_compression_pvrtc2 -#define GL_IMG_texture_compression_pvrtc2 1 -#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 -#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 -#endif /* GL_IMG_texture_compression_pvrtc2 */ - -#ifndef GL_IMG_texture_filter_cubic -#define GL_IMG_texture_filter_cubic 1 -#define GL_CUBIC_IMG 0x9139 -#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A -#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B -#endif /* GL_IMG_texture_filter_cubic */ - -#ifndef GL_INTEL_blackhole_render -#define GL_INTEL_blackhole_render 1 -#define GL_BLACKHOLE_RENDER_INTEL 0x83FC -#endif /* GL_INTEL_blackhole_render */ - -#ifndef GL_INTEL_conservative_rasterization -#define GL_INTEL_conservative_rasterization 1 -#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE -#endif /* GL_INTEL_conservative_rasterization */ - -#ifndef GL_INTEL_framebuffer_CMAA -#define GL_INTEL_framebuffer_CMAA 1 -typedef void (GL_APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); -#endif -#endif /* GL_INTEL_framebuffer_CMAA */ - -#ifndef GL_INTEL_performance_query -#define GL_INTEL_performance_query 1 -#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 -#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 -#define GL_PERFQUERY_WAIT_INTEL 0x83FB -#define GL_PERFQUERY_FLUSH_INTEL 0x83FA -#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 -#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 -#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 -#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 -#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 -#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 -#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 -#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 -#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 -#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA -#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB -#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC -#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD -#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE -#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF -#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 -typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); -typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); -typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); -typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); -typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); -typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); -GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); -GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); -GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); -GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); -GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); -GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); -GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); -GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); -GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); -#endif -#endif /* GL_INTEL_performance_query */ - -#ifndef GL_MESA_framebuffer_flip_y -#define GL_MESA_framebuffer_flip_y 1 -#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB -#endif /* GL_MESA_framebuffer_flip_y */ - -#ifndef GL_MESA_program_binary_formats -#define GL_MESA_program_binary_formats 1 -#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F -#endif /* GL_MESA_program_binary_formats */ - -#ifndef GL_MESA_shader_integer_functions -#define GL_MESA_shader_integer_functions 1 -#endif /* GL_MESA_shader_integer_functions */ - -#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers -#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 -#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 -typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef GLuint64 (GL_APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (GL_APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleNV (GLuint texture); -GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); -GL_APICALL void GL_APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); -GL_APICALL void GL_APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); -GL_APICALL GLuint64 GL_APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GL_APICALL void GL_APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); -GL_APICALL void GL_APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); -GL_APICALL void GL_APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); -GL_APICALL void GL_APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); -GL_APICALL void GL_APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); -GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GL_APICALL GLboolean GL_APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); -GL_APICALL GLboolean GL_APIENTRY glIsImageHandleResidentNV (GLuint64 handle); -#endif -#endif /* GL_NV_bindless_texture */ - -#ifndef GL_NV_blend_equation_advanced -#define GL_NV_blend_equation_advanced 1 -#define GL_BLEND_OVERLAP_NV 0x9281 -#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 -#define GL_BLUE_NV 0x1905 -#define GL_COLORBURN_NV 0x929A -#define GL_COLORDODGE_NV 0x9299 -#define GL_CONJOINT_NV 0x9284 -#define GL_CONTRAST_NV 0x92A1 -#define GL_DARKEN_NV 0x9297 -#define GL_DIFFERENCE_NV 0x929E -#define GL_DISJOINT_NV 0x9283 -#define GL_DST_ATOP_NV 0x928F -#define GL_DST_IN_NV 0x928B -#define GL_DST_NV 0x9287 -#define GL_DST_OUT_NV 0x928D -#define GL_DST_OVER_NV 0x9289 -#define GL_EXCLUSION_NV 0x92A0 -#define GL_GREEN_NV 0x1904 -#define GL_HARDLIGHT_NV 0x929B -#define GL_HARDMIX_NV 0x92A9 -#define GL_HSL_COLOR_NV 0x92AF -#define GL_HSL_HUE_NV 0x92AD -#define GL_HSL_LUMINOSITY_NV 0x92B0 -#define GL_HSL_SATURATION_NV 0x92AE -#define GL_INVERT_OVG_NV 0x92B4 -#define GL_INVERT_RGB_NV 0x92A3 -#define GL_LIGHTEN_NV 0x9298 -#define GL_LINEARBURN_NV 0x92A5 -#define GL_LINEARDODGE_NV 0x92A4 -#define GL_LINEARLIGHT_NV 0x92A7 -#define GL_MINUS_CLAMPED_NV 0x92B3 -#define GL_MINUS_NV 0x929F -#define GL_MULTIPLY_NV 0x9294 -#define GL_OVERLAY_NV 0x9296 -#define GL_PINLIGHT_NV 0x92A8 -#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 -#define GL_PLUS_CLAMPED_NV 0x92B1 -#define GL_PLUS_DARKER_NV 0x9292 -#define GL_PLUS_NV 0x9291 -#define GL_RED_NV 0x1903 -#define GL_SCREEN_NV 0x9295 -#define GL_SOFTLIGHT_NV 0x929C -#define GL_SRC_ATOP_NV 0x928E -#define GL_SRC_IN_NV 0x928A -#define GL_SRC_NV 0x9286 -#define GL_SRC_OUT_NV 0x928C -#define GL_SRC_OVER_NV 0x9288 -#define GL_UNCORRELATED_NV 0x9282 -#define GL_VIVIDLIGHT_NV 0x92A6 -#define GL_XOR_NV 0x1506 -typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); -#endif -#endif /* GL_NV_blend_equation_advanced */ - -#ifndef GL_NV_blend_equation_advanced_coherent -#define GL_NV_blend_equation_advanced_coherent 1 -#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 -#endif /* GL_NV_blend_equation_advanced_coherent */ - -#ifndef GL_NV_blend_minmax_factor -#define GL_NV_blend_minmax_factor 1 -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D -#endif /* GL_NV_blend_minmax_factor */ - -#ifndef GL_NV_clip_space_w_scaling -#define GL_NV_clip_space_w_scaling 1 -#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C -#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D -#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E -typedef void (GL_APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); -#endif -#endif /* GL_NV_clip_space_w_scaling */ - -#ifndef GL_NV_compute_shader_derivatives -#define GL_NV_compute_shader_derivatives 1 -#endif /* GL_NV_compute_shader_derivatives */ - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -typedef void (GL_APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (GL_APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GL_APICALL void GL_APIENTRY glEndConditionalRenderNV (void); -#endif -#endif /* GL_NV_conditional_render */ - -#ifndef GL_NV_conservative_raster -#define GL_NV_conservative_raster 1 -#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 -#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 -#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 -#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 -typedef void (GL_APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); -#endif -#endif /* GL_NV_conservative_raster */ - -#ifndef GL_NV_conservative_raster_pre_snap -#define GL_NV_conservative_raster_pre_snap 1 -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 -#endif /* GL_NV_conservative_raster_pre_snap */ - -#ifndef GL_NV_conservative_raster_pre_snap_triangles -#define GL_NV_conservative_raster_pre_snap_triangles 1 -#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D -#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E -#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F -typedef void (GL_APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); -#endif -#endif /* GL_NV_conservative_raster_pre_snap_triangles */ - -#ifndef GL_NV_copy_buffer -#define GL_NV_copy_buffer 1 -#define GL_COPY_READ_BUFFER_NV 0x8F36 -#define GL_COPY_WRITE_BUFFER_NV 0x8F37 -typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif -#endif /* GL_NV_copy_buffer */ - -#ifndef GL_NV_coverage_sample -#define GL_NV_coverage_sample 1 -#define GL_COVERAGE_COMPONENT_NV 0x8ED0 -#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 -#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 -#define GL_COVERAGE_BUFFERS_NV 0x8ED3 -#define GL_COVERAGE_SAMPLES_NV 0x8ED4 -#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 -#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 -#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 -#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 -typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); -typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); -GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); -#endif -#endif /* GL_NV_coverage_sample */ - -#ifndef GL_NV_depth_nonlinear -#define GL_NV_depth_nonlinear 1 -#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C -#endif /* GL_NV_depth_nonlinear */ - -#ifndef GL_NV_draw_buffers -#define GL_NV_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_NV 0x8824 -#define GL_DRAW_BUFFER0_NV 0x8825 -#define GL_DRAW_BUFFER1_NV 0x8826 -#define GL_DRAW_BUFFER2_NV 0x8827 -#define GL_DRAW_BUFFER3_NV 0x8828 -#define GL_DRAW_BUFFER4_NV 0x8829 -#define GL_DRAW_BUFFER5_NV 0x882A -#define GL_DRAW_BUFFER6_NV 0x882B -#define GL_DRAW_BUFFER7_NV 0x882C -#define GL_DRAW_BUFFER8_NV 0x882D -#define GL_DRAW_BUFFER9_NV 0x882E -#define GL_DRAW_BUFFER10_NV 0x882F -#define GL_DRAW_BUFFER11_NV 0x8830 -#define GL_DRAW_BUFFER12_NV 0x8831 -#define GL_DRAW_BUFFER13_NV 0x8832 -#define GL_DRAW_BUFFER14_NV 0x8833 -#define GL_DRAW_BUFFER15_NV 0x8834 -#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 -#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 -#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 -#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 -#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 -#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 -#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 -#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 -#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 -#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 -#define GL_COLOR_ATTACHMENT10_NV 0x8CEA -#define GL_COLOR_ATTACHMENT11_NV 0x8CEB -#define GL_COLOR_ATTACHMENT12_NV 0x8CEC -#define GL_COLOR_ATTACHMENT13_NV 0x8CED -#define GL_COLOR_ATTACHMENT14_NV 0x8CEE -#define GL_COLOR_ATTACHMENT15_NV 0x8CEF -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); -#endif -#endif /* GL_NV_draw_buffers */ - -#ifndef GL_NV_draw_instanced -#define GL_NV_draw_instanced 1 -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -#endif -#endif /* GL_NV_draw_instanced */ - -#ifndef GL_NV_draw_vulkan_image -#define GL_NV_draw_vulkan_image 1 -typedef void (GL_APIENTRY *GLVULKANPROCNV)(void); -typedef void (GL_APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -typedef GLVULKANPROCNV (GL_APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); -typedef void (GL_APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (GL_APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); -typedef void (GL_APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -GL_APICALL GLVULKANPROCNV GL_APIENTRY glGetVkProcAddrNV (const GLchar *name); -GL_APICALL void GL_APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); -GL_APICALL void GL_APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); -GL_APICALL void GL_APIENTRY glSignalVkFenceNV (GLuint64 vkFence); -#endif -#endif /* GL_NV_draw_vulkan_image */ - -#ifndef GL_NV_explicit_attrib_location -#define GL_NV_explicit_attrib_location 1 -#endif /* GL_NV_explicit_attrib_location */ - -#ifndef GL_NV_fbo_color_attachments -#define GL_NV_fbo_color_attachments 1 -#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF -#endif /* GL_NV_fbo_color_attachments */ - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); -GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); -GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); -GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); -GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); -GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif -#endif /* GL_NV_fence */ - -#ifndef GL_NV_fill_rectangle -#define GL_NV_fill_rectangle 1 -#define GL_FILL_RECTANGLE_NV 0x933C -#endif /* GL_NV_fill_rectangle */ - -#ifndef GL_NV_fragment_coverage_to_color -#define GL_NV_fragment_coverage_to_color 1 -#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD -#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE -typedef void (GL_APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color); -#endif -#endif /* GL_NV_fragment_coverage_to_color */ - -#ifndef GL_NV_fragment_shader_interlock -#define GL_NV_fragment_shader_interlock 1 -#endif /* GL_NV_fragment_shader_interlock */ - -#ifndef GL_NV_framebuffer_blit -#define GL_NV_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_NV 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA -typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif -#endif /* GL_NV_framebuffer_blit */ - -#ifndef GL_NV_framebuffer_mixed_samples -#define GL_NV_framebuffer_mixed_samples 1 -#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 -#define GL_COLOR_SAMPLES_NV 0x8E20 -#define GL_DEPTH_SAMPLES_NV 0x932D -#define GL_STENCIL_SAMPLES_NV 0x932E -#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F -#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 -#define GL_COVERAGE_MODULATION_NV 0x9332 -#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 -typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); -typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); -GL_APICALL void GL_APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); -GL_APICALL void GL_APIENTRY glCoverageModulationNV (GLenum components); -#endif -#endif /* GL_NV_framebuffer_mixed_samples */ - -#ifndef GL_NV_framebuffer_multisample -#define GL_NV_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 -#define GL_MAX_SAMPLES_NV 0x8D57 -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif -#endif /* GL_NV_framebuffer_multisample */ - -#ifndef GL_NV_generate_mipmap_sRGB -#define GL_NV_generate_mipmap_sRGB 1 -#endif /* GL_NV_generate_mipmap_sRGB */ - -#ifndef GL_NV_geometry_shader_passthrough -#define GL_NV_geometry_shader_passthrough 1 -#endif /* GL_NV_geometry_shader_passthrough */ - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -typedef khronos_int64_t GLint64EXT; -typedef khronos_uint64_t GLuint64EXT; -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -#define GL_PATCHES 0x000E -typedef void (GL_APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (GL_APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GL_APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GL_APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GL_APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GL_APICALL void GL_APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GL_APICALL void GL_APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GL_APICALL void GL_APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GL_APICALL void GL_APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GL_APICALL void GL_APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GL_APICALL void GL_APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GL_APICALL void GL_APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GL_APICALL void GL_APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GL_APICALL void GL_APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GL_APICALL void GL_APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GL_APICALL void GL_APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GL_APICALL void GL_APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GL_APICALL void GL_APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GL_APICALL void GL_APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GL_APICALL void GL_APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GL_APICALL void GL_APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GL_APICALL void GL_APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GL_APICALL void GL_APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif -#endif /* GL_NV_gpu_shader5 */ - -#ifndef GL_NV_image_formats -#define GL_NV_image_formats 1 -#endif /* GL_NV_image_formats */ - -#ifndef GL_NV_instanced_arrays -#define GL_NV_instanced_arrays 1 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); -#endif -#endif /* GL_NV_instanced_arrays */ - -#ifndef GL_NV_internalformat_sample_query -#define GL_NV_internalformat_sample_query 1 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_MULTISAMPLES_NV 0x9371 -#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 -#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 -#define GL_CONFORMANT_NV 0x9374 -typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_NV_internalformat_sample_query */ - -#ifndef GL_NV_memory_attachment -#define GL_NV_memory_attachment 1 -#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 -#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 -#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 -#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 -#define GL_MEMORY_ATTACHABLE_NV 0x95A8 -#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 -#define GL_DETACHED_TEXTURES_NV 0x95AA -#define GL_DETACHED_BUFFERS_NV 0x95AB -#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC -#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD -typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -typedef void (GL_APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); -typedef void (GL_APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); -typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); -GL_APICALL void GL_APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); -GL_APICALL void GL_APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); -GL_APICALL void GL_APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); -#endif -#endif /* GL_NV_memory_attachment */ - -#ifndef GL_NV_non_square_matrices -#define GL_NV_non_square_matrices 1 -#define GL_FLOAT_MAT2x3_NV 0x8B65 -#define GL_FLOAT_MAT2x4_NV 0x8B66 -#define GL_FLOAT_MAT3x2_NV 0x8B67 -#define GL_FLOAT_MAT3x4_NV 0x8B68 -#define GL_FLOAT_MAT4x2_NV 0x8B69 -#define GL_FLOAT_MAT4x3_NV 0x8B6A -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif -#endif /* GL_NV_non_square_matrices */ - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 -typedef double GLdouble; -#define GL_PATH_FORMAT_SVG_NV 0x9070 -#define GL_PATH_FORMAT_PS_NV 0x9071 -#define GL_STANDARD_FONT_NAME_NV 0x9072 -#define GL_SYSTEM_FONT_NAME_NV 0x9073 -#define GL_FILE_NAME_NV 0x9074 -#define GL_PATH_STROKE_WIDTH_NV 0x9075 -#define GL_PATH_END_CAPS_NV 0x9076 -#define GL_PATH_INITIAL_END_CAP_NV 0x9077 -#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 -#define GL_PATH_JOIN_STYLE_NV 0x9079 -#define GL_PATH_MITER_LIMIT_NV 0x907A -#define GL_PATH_DASH_CAPS_NV 0x907B -#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C -#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D -#define GL_PATH_DASH_OFFSET_NV 0x907E -#define GL_PATH_CLIENT_LENGTH_NV 0x907F -#define GL_PATH_FILL_MODE_NV 0x9080 -#define GL_PATH_FILL_MASK_NV 0x9081 -#define GL_PATH_FILL_COVER_MODE_NV 0x9082 -#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 -#define GL_PATH_STROKE_MASK_NV 0x9084 -#define GL_COUNT_UP_NV 0x9088 -#define GL_COUNT_DOWN_NV 0x9089 -#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A -#define GL_CONVEX_HULL_NV 0x908B -#define GL_BOUNDING_BOX_NV 0x908D -#define GL_TRANSLATE_X_NV 0x908E -#define GL_TRANSLATE_Y_NV 0x908F -#define GL_TRANSLATE_2D_NV 0x9090 -#define GL_TRANSLATE_3D_NV 0x9091 -#define GL_AFFINE_2D_NV 0x9092 -#define GL_AFFINE_3D_NV 0x9094 -#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 -#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 -#define GL_UTF8_NV 0x909A -#define GL_UTF16_NV 0x909B -#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C -#define GL_PATH_COMMAND_COUNT_NV 0x909D -#define GL_PATH_COORD_COUNT_NV 0x909E -#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F -#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 -#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 -#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 -#define GL_SQUARE_NV 0x90A3 -#define GL_ROUND_NV 0x90A4 -#define GL_TRIANGULAR_NV 0x90A5 -#define GL_BEVEL_NV 0x90A6 -#define GL_MITER_REVERT_NV 0x90A7 -#define GL_MITER_TRUNCATE_NV 0x90A8 -#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 -#define GL_USE_MISSING_GLYPH_NV 0x90AA -#define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD -#define GL_ADJACENT_PAIRS_NV 0x90AE -#define GL_FIRST_TO_REST_NV 0x90AF -#define GL_PATH_GEN_MODE_NV 0x90B0 -#define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 -#define GL_PATH_STENCIL_FUNC_NV 0x90B7 -#define GL_PATH_STENCIL_REF_NV 0x90B8 -#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 -#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD -#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE -#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF -#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 -#define GL_MOVE_TO_RESETS_NV 0x90B5 -#define GL_MOVE_TO_CONTINUES_NV 0x90B6 -#define GL_CLOSE_PATH_NV 0x00 -#define GL_MOVE_TO_NV 0x02 -#define GL_RELATIVE_MOVE_TO_NV 0x03 -#define GL_LINE_TO_NV 0x04 -#define GL_RELATIVE_LINE_TO_NV 0x05 -#define GL_HORIZONTAL_LINE_TO_NV 0x06 -#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 -#define GL_VERTICAL_LINE_TO_NV 0x08 -#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 -#define GL_QUADRATIC_CURVE_TO_NV 0x0A -#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B -#define GL_CUBIC_CURVE_TO_NV 0x0C -#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D -#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E -#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F -#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 -#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 -#define GL_SMALL_CCW_ARC_TO_NV 0x12 -#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 -#define GL_SMALL_CW_ARC_TO_NV 0x14 -#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 -#define GL_LARGE_CCW_ARC_TO_NV 0x16 -#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 -#define GL_LARGE_CW_ARC_TO_NV 0x18 -#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 -#define GL_RESTART_PATH_NV 0xF0 -#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 -#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 -#define GL_RECT_NV 0xF6 -#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 -#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA -#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC -#define GL_ARC_TO_NV 0xFE -#define GL_RELATIVE_ARC_TO_NV 0xFF -#define GL_BOLD_BIT_NV 0x01 -#define GL_ITALIC_BIT_NV 0x02 -#define GL_GLYPH_WIDTH_BIT_NV 0x01 -#define GL_GLYPH_HEIGHT_BIT_NV 0x02 -#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 -#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 -#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 -#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 -#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 -#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 -#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 -#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 -#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 -#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 -#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 -#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 -#define GL_FONT_ASCENDER_BIT_NV 0x00200000 -#define GL_FONT_DESCENDER_BIT_NV 0x00400000 -#define GL_FONT_HEIGHT_BIT_NV 0x00800000 -#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 -#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 -#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 -#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 -#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -#define GL_ROUNDED_RECT_NV 0xE8 -#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 -#define GL_ROUNDED_RECT2_NV 0xEA -#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB -#define GL_ROUNDED_RECT4_NV 0xEC -#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED -#define GL_ROUNDED_RECT8_NV 0xEE -#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF -#define GL_RELATIVE_RECT_NV 0xF7 -#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 -#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 -#define GL_FONT_UNAVAILABLE_NV 0x936A -#define GL_FONT_UNINTELLIGIBLE_NV 0x936B -#define GL_CONIC_CURVE_TO_NV 0x1A -#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B -#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 -#define GL_STANDARD_FONT_FORMAT_NV 0x936C -#define GL_PATH_PROJECTION_NV 0x1701 -#define GL_PATH_MODELVIEW_NV 0x1700 -#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 -#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 -#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 -#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 -#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 -#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 -#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 -#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 -#define GL_FRAGMENT_INPUT_NV 0x936D -typedef GLuint (GL_APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (GL_APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLboolean (GL_APIENTRYP PFNGLISPATHNVPROC) (GLuint path); -typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GL_APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GL_APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GL_APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -typedef void (GL_APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); -typedef void (GL_APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GL_APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GL_APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -typedef void (GL_APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (GL_APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef void (GL_APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (GL_APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); -typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); -typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); -typedef void (GL_APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); -typedef void (GL_APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); -typedef void (GL_APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); -typedef void (GL_APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (GL_APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -typedef void (GL_APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef GLfloat (GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef GLboolean (GL_APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (GL_APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (GL_APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (GL_APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (GL_APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range); -GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range); -GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path); -GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); -GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); -GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); -GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); -GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); -GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); -GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); -GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); -GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); -GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func); -GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); -GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); -GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); -GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); -GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); -GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); -GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); -GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); -GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); -GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); -GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); -GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); -GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); -GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); -GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); -GL_APICALL void GL_APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GL_APICALL void GL_APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GL_APICALL void GL_APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GL_APICALL void GL_APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GL_APICALL void GL_APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GL_APICALL void GL_APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GL_APICALL void GL_APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GL_APICALL void GL_APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GL_APICALL void GL_APIENTRY glMatrixPopEXT (GLenum mode); -GL_APICALL void GL_APIENTRY glMatrixPushEXT (GLenum mode); -GL_APICALL void GL_APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GL_APICALL void GL_APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GL_APICALL void GL_APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -#endif -#endif /* GL_NV_path_rendering */ - -#ifndef GL_NV_path_rendering_shared_edge -#define GL_NV_path_rendering_shared_edge 1 -#define GL_SHARED_EDGE_NV 0xC0 -#endif /* GL_NV_path_rendering_shared_edge */ - -#ifndef GL_NV_pixel_buffer_object -#define GL_NV_pixel_buffer_object 1 -#define GL_PIXEL_PACK_BUFFER_NV 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF -#endif /* GL_NV_pixel_buffer_object */ - -#ifndef GL_NV_polygon_mode -#define GL_NV_polygon_mode 1 -#define GL_POLYGON_MODE_NV 0x0B40 -#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 -#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 -#define GL_POINT_NV 0x1B00 -#define GL_LINE_NV 0x1B01 -#define GL_FILL_NV 0x1B02 -typedef void (GL_APIENTRYP PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glPolygonModeNV (GLenum face, GLenum mode); -#endif -#endif /* GL_NV_polygon_mode */ - -#ifndef GL_NV_read_buffer -#define GL_NV_read_buffer 1 -#define GL_READ_BUFFER_NV 0x0C02 -typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); -#endif -#endif /* GL_NV_read_buffer */ - -#ifndef GL_NV_read_buffer_front -#define GL_NV_read_buffer_front 1 -#endif /* GL_NV_read_buffer_front */ - -#ifndef GL_NV_read_depth -#define GL_NV_read_depth 1 -#endif /* GL_NV_read_depth */ - -#ifndef GL_NV_read_depth_stencil -#define GL_NV_read_depth_stencil 1 -#endif /* GL_NV_read_depth_stencil */ - -#ifndef GL_NV_read_stencil -#define GL_NV_read_stencil 1 -#endif /* GL_NV_read_stencil */ - -#ifndef GL_NV_sRGB_formats -#define GL_NV_sRGB_formats 1 -#define GL_SLUMINANCE_NV 0x8C46 -#define GL_SLUMINANCE_ALPHA_NV 0x8C44 -#define GL_SRGB8_NV 0x8C41 -#define GL_SLUMINANCE8_NV 0x8C47 -#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 -#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F -#define GL_ETC1_SRGB8_NV 0x88EE -#endif /* GL_NV_sRGB_formats */ - -#ifndef GL_NV_sample_locations -#define GL_NV_sample_locations 1 -#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D -#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E -#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 -#define GL_SAMPLE_LOCATION_NV 0x8E50 -#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 -#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 -#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); -#endif -#endif /* GL_NV_sample_locations */ - -#ifndef GL_NV_sample_mask_override_coverage -#define GL_NV_sample_mask_override_coverage 1 -#endif /* GL_NV_sample_mask_override_coverage */ - -#ifndef GL_NV_shader_atomic_fp16_vector -#define GL_NV_shader_atomic_fp16_vector 1 -#endif /* GL_NV_shader_atomic_fp16_vector */ - -#ifndef GL_NV_shader_noperspective_interpolation -#define GL_NV_shader_noperspective_interpolation 1 -#endif /* GL_NV_shader_noperspective_interpolation */ - -#ifndef GL_NV_shadow_samplers_array -#define GL_NV_shadow_samplers_array 1 -#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 -#endif /* GL_NV_shadow_samplers_array */ - -#ifndef GL_NV_shadow_samplers_cube -#define GL_NV_shadow_samplers_cube 1 -#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 -#endif /* GL_NV_shadow_samplers_cube */ - -#ifndef GL_NV_stereo_view_rendering -#define GL_NV_stereo_view_rendering 1 -#endif /* GL_NV_stereo_view_rendering */ - -#ifndef GL_NV_texture_border_clamp -#define GL_NV_texture_border_clamp 1 -#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 -#define GL_CLAMP_TO_BORDER_NV 0x812D -#endif /* GL_NV_texture_border_clamp */ - -#ifndef GL_NV_texture_compression_s3tc_update -#define GL_NV_texture_compression_s3tc_update 1 -#endif /* GL_NV_texture_compression_s3tc_update */ - -#ifndef GL_NV_texture_npot_2D_mipmap -#define GL_NV_texture_npot_2D_mipmap 1 -#endif /* GL_NV_texture_npot_2D_mipmap */ - -#ifndef GL_NV_viewport_array -#define GL_NV_viewport_array 1 -#define GL_MAX_VIEWPORTS_NV 0x825B -#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C -#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D -#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F -typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint *v); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (GL_APIENTRYP PFNGLENABLEINVPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLDISABLEINVPROC) (GLenum target, GLuint index); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glViewportArrayvNV (GLuint first, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glViewportIndexedfNV (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GL_APICALL void GL_APIENTRY glViewportIndexedfvNV (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glScissorArrayvNV (GLuint first, GLsizei count, const GLint *v); -GL_APICALL void GL_APIENTRY glScissorIndexedNV (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glScissorIndexedvNV (GLuint index, const GLint *v); -GL_APICALL void GL_APIENTRY glDepthRangeArrayfvNV (GLuint first, GLsizei count, const GLfloat *v); -GL_APICALL void GL_APIENTRY glDepthRangeIndexedfNV (GLuint index, GLfloat n, GLfloat f); -GL_APICALL void GL_APIENTRY glGetFloati_vNV (GLenum target, GLuint index, GLfloat *data); -GL_APICALL void GL_APIENTRY glEnableiNV (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glDisableiNV (GLenum target, GLuint index); -GL_APICALL GLboolean GL_APIENTRY glIsEnablediNV (GLenum target, GLuint index); -#endif -#endif /* GL_NV_viewport_array */ - -#ifndef GL_NV_viewport_array2 -#define GL_NV_viewport_array2 1 -#endif /* GL_NV_viewport_array2 */ - -#ifndef GL_NV_viewport_swizzle -#define GL_NV_viewport_swizzle 1 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 -#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 -#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 -#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 -#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 -#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A -#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B -typedef void (GL_APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); -#endif -#endif /* GL_NV_viewport_swizzle */ - -#ifndef GL_OVR_multiview -#define GL_OVR_multiview 1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 -#define GL_MAX_VIEWS_OVR 0x9631 -#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -#endif -#endif /* GL_OVR_multiview */ - -#ifndef GL_OVR_multiview2 -#define GL_OVR_multiview2 1 -#endif /* GL_OVR_multiview2 */ - -#ifndef GL_OVR_multiview_multisampled_render_to_texture -#define GL_OVR_multiview_multisampled_render_to_texture 1 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferTextureMultisampleMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); -#endif -#endif /* GL_OVR_multiview_multisampled_render_to_texture */ - -#ifndef GL_QCOM_YUV_texture_gather -#define GL_QCOM_YUV_texture_gather 1 -#endif /* GL_QCOM_YUV_texture_gather */ - -#ifndef GL_QCOM_alpha_test -#define GL_QCOM_alpha_test 1 -#define GL_ALPHA_TEST_QCOM 0x0BC0 -#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 -#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 -typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); -#endif -#endif /* GL_QCOM_alpha_test */ - -#ifndef GL_QCOM_binning_control -#define GL_QCOM_binning_control 1 -#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 -#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 -#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 -#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 -#endif /* GL_QCOM_binning_control */ - -#ifndef GL_QCOM_driver_control -#define GL_QCOM_driver_control 1 -typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); -typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); -typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); -GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); -GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); -GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); -#endif -#endif /* GL_QCOM_driver_control */ - -#ifndef GL_QCOM_extended_get -#define GL_QCOM_extended_get 1 -#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 -#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 -#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 -#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 -#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 -#define GL_TEXTURE_TYPE_QCOM 0x8BD7 -#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 -#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 -#define GL_TEXTURE_TARGET_QCOM 0x8BDA -#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB -#define GL_STATE_RESTORE 0x8BDC -typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); -typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); -typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); -typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); -GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); -GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); -GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); -GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); -GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); -#endif -#endif /* GL_QCOM_extended_get */ - -#ifndef GL_QCOM_extended_get2 -#define GL_QCOM_extended_get2 1 -typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); -typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); -typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); -GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); -GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); -GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); -#endif -#endif /* GL_QCOM_extended_get2 */ - -#ifndef GL_QCOM_framebuffer_foveated -#define GL_QCOM_framebuffer_foveated 1 -#define GL_FOVEATION_ENABLE_BIT_QCOM 0x00000001 -#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x00000002 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferFoveationConfigQCOM (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); -GL_APICALL void GL_APIENTRY glFramebufferFoveationParametersQCOM (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); -#endif -#endif /* GL_QCOM_framebuffer_foveated */ - -#ifndef GL_QCOM_perfmon_global_mode -#define GL_QCOM_perfmon_global_mode 1 -#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 -#endif /* GL_QCOM_perfmon_global_mode */ - -#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent -#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 -#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierQCOM (void); -#endif -#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ - -#ifndef GL_QCOM_shader_framebuffer_fetch_rate -#define GL_QCOM_shader_framebuffer_fetch_rate 1 -#endif /* GL_QCOM_shader_framebuffer_fetch_rate */ - -#ifndef GL_QCOM_texture_foveated -#define GL_QCOM_texture_foveated 1 -#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB -#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC -#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD -#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE -#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF -typedef void (GL_APIENTRYP PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glTextureFoveationParametersQCOM (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); -#endif -#endif /* GL_QCOM_texture_foveated */ - -#ifndef GL_QCOM_texture_foveated_subsampled_layout -#define GL_QCOM_texture_foveated_subsampled_layout 1 -#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x00000004 -#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 -#endif /* GL_QCOM_texture_foveated_subsampled_layout */ - -#ifndef GL_QCOM_tiled_rendering -#define GL_QCOM_tiled_rendering 1 -#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 -#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 -#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 -#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 -#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 -#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 -#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 -#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 -#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 -#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 -#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 -#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 -#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 -#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 -#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 -#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 -#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 -#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 -#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 -#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 -#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 -#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 -#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 -#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 -#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 -#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 -#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 -#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 -#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 -#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 -#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 -#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 -typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); -typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); -GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); -#endif -#endif /* GL_QCOM_tiled_rendering */ - -#ifndef GL_QCOM_writeonly_rendering -#define GL_QCOM_writeonly_rendering 1 -#define GL_WRITEONLY_RENDERING_QCOM 0x8823 -#endif /* GL_QCOM_writeonly_rendering */ - -#ifndef GL_VIV_shader_binary -#define GL_VIV_shader_binary 1 -#define GL_SHADER_BINARY_VIV 0x8FC4 -#endif /* GL_VIV_shader_binary */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/khronos/GLES32/gl32.h b/core/deps/khronos/GLES32/gl32.h deleted file mode 100644 index a1af7c697..000000000 --- a/core/deps/khronos/GLES32/gl32.h +++ /dev/null @@ -1,1829 +0,0 @@ -#ifndef __gl32_h_ -#define __gl32_h_ 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright (c) 2013-2016 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ -/* -** This header is generated from the Khronos OpenGL / OpenGL ES XML -** API Registry. The current version of the Registry, generator scripts -** used to make the header, and the header can be found at -** http://www.opengl.org/registry/ -** -** Khronos $Revision$ on $Date$ -*/ - -#include - -#ifndef GL_APIENTRYP -#define GL_APIENTRYP GL_APIENTRY* -#endif - -#ifndef GL_GLES_PROTOTYPES -#define GL_GLES_PROTOTYPES 1 -#endif - -/* Generated on date 20161024 */ - -/* Generated C header for: - * API: gles2 - * Profile: common - * Versions considered: 2\.[0-9]|3\.[012] - * Versions emitted: .* - * Default extensions included: None - * Additional extensions included: _nomatch_^ - * Extensions removed: _nomatch_^ - */ - -#ifndef GL_ES_VERSION_2_0 -#define GL_ES_VERSION_2_0 1 -#include -typedef khronos_int8_t GLbyte; -typedef khronos_float_t GLclampf; -typedef khronos_int32_t GLfixed; -typedef short GLshort; -typedef unsigned short GLushort; -typedef void GLvoid; -typedef struct __GLsync *GLsync; -typedef khronos_int64_t GLint64; -typedef khronos_uint64_t GLuint64; -typedef unsigned int GLenum; -typedef unsigned int GLuint; -typedef char GLchar; -typedef khronos_float_t GLfloat; -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_intptr_t GLintptr; -typedef unsigned int GLbitfield; -typedef int GLint; -typedef unsigned char GLboolean; -typedef int GLsizei; -typedef khronos_uint8_t GLubyte; -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_FUNC_ADD 0x8006 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STATIC_DRAW 0x88E4 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_CULL_FACE 0x0B44 -#define GL_BLEND 0x0BE2 -#define GL_DITHER 0x0BD0 -#define GL_STENCIL_TEST 0x0B90 -#define GL_DEPTH_TEST 0x0B71 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_LINE_WIDTH 0x0B21 -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_VIEWPORT 0x0BA2 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_FIXED 0x140C -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_SHADER_TYPE 0x8B4F -#define GL_DELETE_STATUS 0x8B80 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_INVERT 0x150A -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_TEXTURE 0x1702 -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_REPEAT 0x2901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B -#define GL_COMPILE_STATUS 0x8B81 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_LOW_INT 0x8DF3 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_HIGH_INT 0x8DF5 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGB565 0x8D62 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_NONE 0 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); -typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); -typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); -typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); -typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); -typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); -typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); -typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void); -typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); -typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void); -typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); -typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); -typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); -typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); -typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); -typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); -typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); -typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); -typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -#if GL_GLES_PROTOTYPES -GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); -GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); -GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); -GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); -GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); -GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); -GL_APICALL void GL_APIENTRY glClearStencil (GLint s); -GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); -GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); -GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); -GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); -GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); -GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); -GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); -GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); -GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); -GL_APICALL void GL_APIENTRY glDisable (GLenum cap); -GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); -GL_APICALL void GL_APIENTRY glEnable (GLenum cap); -GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); -GL_APICALL void GL_APIENTRY glFinish (void); -GL_APICALL void GL_APIENTRY glFlush (void); -GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); -GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); -GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); -GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); -GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL GLenum GL_APIENTRY glGetError (void); -GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); -GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); -GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); -GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); -GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); -GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); -GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); -GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); -GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); -GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); -GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); -GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); -GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); -GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); -GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); -GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); -GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); -GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); -GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); -GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); -#endif -#endif /* GL_ES_VERSION_2_0 */ - -#ifndef GL_ES_VERSION_3_0 -#define GL_ES_VERSION_3_0 1 -typedef unsigned short GLhalf; -#define GL_READ_BUFFER 0x0C02 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_RED 0x1903 -#define GL_RGB8 0x8051 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_RG8 0x822B -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFFu -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_INT_2_10_10_10_REV 0x8D9F -#define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_NUM_SAMPLE_COUNTS 0x9380 -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src); -typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); -typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); -typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#if GL_GLES_PROTOTYPES -GL_APICALL void GL_APIENTRY glReadBuffer (GLenum src); -GL_APICALL void GL_APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -GL_APICALL void GL_APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GL_APICALL void GL_APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GL_APICALL void GL_APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GL_APICALL void GL_APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GL_APICALL GLboolean GL_APIENTRY glIsQuery (GLuint id); -GL_APICALL void GL_APIENTRY glBeginQuery (GLenum target, GLuint id); -GL_APICALL void GL_APIENTRY glEndQuery (GLenum target); -GL_APICALL void GL_APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GL_APICALL GLboolean GL_APIENTRY glUnmapBuffer (GLenum target); -GL_APICALL void GL_APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); -GL_APICALL void GL_APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GL_APICALL void GL_APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GL_APICALL void *GL_APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GL_APICALL void GL_APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -GL_APICALL void GL_APIENTRY glBindVertexArray (GLuint array); -GL_APICALL void GL_APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GL_APICALL void GL_APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GL_APICALL GLboolean GL_APIENTRY glIsVertexArray (GLuint array); -GL_APICALL void GL_APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GL_APICALL void GL_APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GL_APICALL void GL_APIENTRY glEndTransformFeedback (void); -GL_APICALL void GL_APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GL_APICALL void GL_APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GL_APICALL void GL_APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GL_APICALL void GL_APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GL_APICALL void GL_APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GL_APICALL void GL_APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GL_APICALL void GL_APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GL_APICALL void GL_APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GL_APICALL void GL_APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GL_APICALL void GL_APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GL_APICALL GLint GL_APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GL_APICALL void GL_APIENTRY glUniform1ui (GLint location, GLuint v0); -GL_APICALL void GL_APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GL_APICALL void GL_APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GL_APICALL void GL_APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GL_APICALL void GL_APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GL_APICALL void GL_APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GL_APICALL void GL_APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GL_APICALL void GL_APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GL_APICALL const GLubyte *GL_APIENTRY glGetStringi (GLenum name, GLuint index); -GL_APICALL void GL_APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GL_APICALL void GL_APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -GL_APICALL void GL_APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GL_APICALL GLuint GL_APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GL_APICALL void GL_APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GL_APICALL void GL_APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -GL_APICALL void GL_APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GL_APICALL void GL_APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -GL_APICALL GLsync GL_APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GL_APICALL GLboolean GL_APIENTRY glIsSync (GLsync sync); -GL_APICALL void GL_APIENTRY glDeleteSync (GLsync sync); -GL_APICALL GLenum GL_APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GL_APICALL void GL_APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); -GL_APICALL void GL_APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GL_APICALL void GL_APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GL_APICALL void GL_APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GL_APICALL void GL_APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GL_APICALL void GL_APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GL_APICALL GLboolean GL_APIENTRY glIsSampler (GLuint sampler); -GL_APICALL void GL_APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GL_APICALL void GL_APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GL_APICALL void GL_APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GL_APICALL void GL_APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GL_APICALL void GL_APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -GL_APICALL void GL_APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GL_APICALL void GL_APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GL_APICALL GLboolean GL_APIENTRY glIsTransformFeedback (GLuint id); -GL_APICALL void GL_APIENTRY glPauseTransformFeedback (void); -GL_APICALL void GL_APIENTRY glResumeTransformFeedback (void); -GL_APICALL void GL_APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -GL_APICALL void GL_APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -GL_APICALL void GL_APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); -GL_APICALL void GL_APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GL_APICALL void GL_APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GL_APICALL void GL_APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif -#endif /* GL_ES_VERSION_3_0 */ - -#ifndef GL_ES_VERSION_3_1 -#define GL_ES_VERSION_3_1 1 -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#define GL_DRAW_INDIRECT_BUFFER 0x8F3F -#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#define GL_MAX_UNIFORM_LOCATIONS 0x826E -#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 -#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 -#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 -#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 -#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 -#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 -#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#define GL_UNIFORM 0x92E1 -#define GL_UNIFORM_BLOCK 0x92E2 -#define GL_PROGRAM_INPUT 0x92E3 -#define GL_PROGRAM_OUTPUT 0x92E4 -#define GL_BUFFER_VARIABLE 0x92E5 -#define GL_SHADER_STORAGE_BLOCK 0x92E6 -#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 -#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 -#define GL_ACTIVE_RESOURCES 0x92F5 -#define GL_MAX_NAME_LENGTH 0x92F6 -#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 -#define GL_NAME_LENGTH 0x92F9 -#define GL_TYPE 0x92FA -#define GL_ARRAY_SIZE 0x92FB -#define GL_OFFSET 0x92FC -#define GL_BLOCK_INDEX 0x92FD -#define GL_ARRAY_STRIDE 0x92FE -#define GL_MATRIX_STRIDE 0x92FF -#define GL_IS_ROW_MAJOR 0x9300 -#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 -#define GL_BUFFER_BINDING 0x9302 -#define GL_BUFFER_DATA_SIZE 0x9303 -#define GL_NUM_ACTIVE_VARIABLES 0x9304 -#define GL_ACTIVE_VARIABLES 0x9305 -#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 -#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A -#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B -#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C -#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D -#define GL_LOCATION 0x930E -#define GL_VERTEX_SHADER_BIT 0x00000001 -#define GL_FRAGMENT_SHADER_BIT 0x00000002 -#define GL_ALL_SHADER_BITS 0xFFFFFFFF -#define GL_PROGRAM_SEPARABLE 0x8258 -#define GL_ACTIVE_PROGRAM 0x8259 -#define GL_PROGRAM_PIPELINE_BINDING 0x825A -#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 -#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 -#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 -#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC -#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 -#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 -#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 -#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 -#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 -#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC -#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 -#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#define GL_MAX_IMAGE_UNITS 0x8F38 -#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA -#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE -#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#define GL_IMAGE_BINDING_NAME 0x8F3A -#define GL_IMAGE_BINDING_LEVEL 0x8F3B -#define GL_IMAGE_BINDING_LAYERED 0x8F3C -#define GL_IMAGE_BINDING_LAYER 0x8F3D -#define GL_IMAGE_BINDING_ACCESS 0x8F3E -#define GL_IMAGE_BINDING_FORMAT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 -#define GL_COMMAND_BARRIER_BIT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 -#define GL_ALL_BARRIER_BITS 0xFFFFFFFF -#define GL_IMAGE_2D 0x904D -#define GL_IMAGE_3D 0x904E -#define GL_IMAGE_CUBE 0x9050 -#define GL_IMAGE_2D_ARRAY 0x9053 -#define GL_INT_IMAGE_2D 0x9058 -#define GL_INT_IMAGE_3D 0x9059 -#define GL_INT_IMAGE_CUBE 0x905B -#define GL_INT_IMAGE_2D_ARRAY 0x905E -#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 -#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 -#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 -#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_SHADER_STORAGE_BUFFER 0x90D2 -#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 -#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 -#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 -#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 -#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA -#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB -#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC -#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD -#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE -#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF -#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 -#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#define GL_STENCIL_INDEX 0x1901 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_VERTEX_BINDING_BUFFER 0x8F4F -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 -typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); -typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); -typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -#if GL_GLES_PROTOTYPES -GL_APICALL void GL_APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GL_APICALL void GL_APIENTRY glDispatchComputeIndirect (GLintptr indirect); -GL_APICALL void GL_APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); -GL_APICALL void GL_APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); -GL_APICALL void GL_APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); -GL_APICALL void GL_APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GL_APICALL GLuint GL_APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); -GL_APICALL void GL_APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GL_APICALL void GL_APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); -GL_APICALL void GL_APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GL_APICALL void GL_APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); -GL_APICALL void GL_APIENTRY glBindProgramPipeline (GLuint pipeline); -GL_APICALL void GL_APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GL_APICALL void GL_APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GL_APICALL GLboolean GL_APIENTRY glIsProgramPipeline (GLuint pipeline); -GL_APICALL void GL_APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GL_APICALL void GL_APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GL_APICALL void GL_APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GL_APICALL void GL_APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GL_APICALL void GL_APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GL_APICALL void GL_APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GL_APICALL void GL_APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GL_APICALL void GL_APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GL_APICALL void GL_APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GL_APICALL void GL_APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GL_APICALL void GL_APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GL_APICALL void GL_APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GL_APICALL void GL_APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GL_APICALL void GL_APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GL_APICALL void GL_APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GL_APICALL void GL_APIENTRY glValidateProgramPipeline (GLuint pipeline); -GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GL_APICALL void GL_APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GL_APICALL void GL_APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GL_APICALL void GL_APIENTRY glMemoryBarrier (GLbitfield barriers); -GL_APICALL void GL_APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); -GL_APICALL void GL_APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GL_APICALL void GL_APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GL_APICALL void GL_APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); -GL_APICALL void GL_APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -GL_APICALL void GL_APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GL_APICALL void GL_APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); -GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); -#endif -#endif /* GL_ES_VERSION_3_1 */ - -#ifndef GL_ES_VERSION_3_2 -#define GL_ES_VERSION_3_2 1 -typedef void (GL_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -#define GL_MULTISAMPLE_LINE_WIDTH_RANGE 0x9381 -#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY 0x9382 -#define GL_MULTIPLY 0x9294 -#define GL_SCREEN 0x9295 -#define GL_OVERLAY 0x9296 -#define GL_DARKEN 0x9297 -#define GL_LIGHTEN 0x9298 -#define GL_COLORDODGE 0x9299 -#define GL_COLORBURN 0x929A -#define GL_HARDLIGHT 0x929B -#define GL_SOFTLIGHT 0x929C -#define GL_DIFFERENCE 0x929E -#define GL_EXCLUSION 0x92A0 -#define GL_HSL_HUE 0x92AD -#define GL_HSL_SATURATION 0x92AE -#define GL_HSL_COLOR 0x92AF -#define GL_HSL_LUMINOSITY 0x92B0 -#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 -#define GL_DEBUG_SOURCE_API 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION 0x824A -#define GL_DEBUG_SOURCE_OTHER 0x824B -#define GL_DEBUG_TYPE_ERROR 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E -#define GL_DEBUG_TYPE_PORTABILITY 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 -#define GL_DEBUG_TYPE_OTHER 0x8251 -#define GL_DEBUG_TYPE_MARKER 0x8268 -#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 -#define GL_DEBUG_TYPE_POP_GROUP 0x826A -#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B -#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C -#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D -#define GL_BUFFER 0x82E0 -#define GL_SHADER 0x82E1 -#define GL_PROGRAM 0x82E2 -#define GL_VERTEX_ARRAY 0x8074 -#define GL_QUERY 0x82E3 -#define GL_PROGRAM_PIPELINE 0x82E4 -#define GL_SAMPLER 0x82E6 -#define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 -#define GL_DEBUG_OUTPUT 0x92E0 -#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_SHADER_BIT 0x00000004 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F -#define GL_LAYER_PROVOKING_VERTEX 0x825E -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF -#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 -#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD -#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_UNDEFINED_VERTEX 0x8260 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 -#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 -#define GL_PRIMITIVE_BOUNDING_BOX 0x92BE -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 -#define GL_CONTEXT_FLAGS 0x821E -#define GL_LOSE_CONTEXT_ON_RESET 0x8252 -#define GL_GUILTY_CONTEXT_RESET 0x8253 -#define GL_INNOCENT_CONTEXT_RESET 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 -#define GL_NO_RESET_NOTIFICATION 0x8261 -#define GL_CONTEXT_LOST 0x0507 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B -#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C -#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -#define GL_PATCHES 0x000E -#define GL_PATCH_VERTICES 0x8E72 -#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 -#define GL_TESS_GEN_MODE 0x8E76 -#define GL_TESS_GEN_SPACING 0x8E77 -#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 -#define GL_TESS_GEN_POINT_MODE 0x8E79 -#define GL_ISOLINES 0x8E7A -#define GL_QUADS 0x0007 -#define GL_FRACTIONAL_ODD 0x8E7B -#define GL_FRACTIONAL_EVEN 0x8E7C -#define GL_MAX_PATCH_VERTICES 0x8E7D -#define GL_MAX_TESS_GEN_LEVEL 0x8E7E -#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F -#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 -#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 -#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 -#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 -#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 -#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 -#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 -#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 -#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A -#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C -#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D -#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E -#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE -#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 -#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 -#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB -#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC -#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 -#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 -#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 -#define GL_IS_PER_PATCH 0x92E7 -#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 -#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 -#define GL_TESS_CONTROL_SHADER 0x8E88 -#define GL_TESS_EVALUATION_SHADER 0x8E87 -#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 -#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_TEXTURE_BUFFER_BINDING 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_IMAGE_BUFFER 0x9051 -#define GL_INT_IMAGE_BUFFER 0x905C -#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 -#define GL_TEXTURE_BUFFER_OFFSET 0x919D -#define GL_TEXTURE_BUFFER_SIZE 0x919E -#define GL_COMPRESSED_RGBA_ASTC_4x4 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12 0x93DD -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 -#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -typedef void (GL_APIENTRYP PFNGLBLENDBARRIERPROC) (void); -typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); -typedef void (GL_APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (GL_APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#if GL_GLES_PROTOTYPES -GL_APICALL void GL_APIENTRY glBlendBarrier (void); -GL_APICALL void GL_APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -GL_APICALL void GL_APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GL_APICALL void GL_APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GL_APICALL void GL_APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GL_APICALL void GL_APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GL_APICALL void GL_APIENTRY glPopDebugGroup (void); -GL_APICALL void GL_APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GL_APICALL void GL_APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -GL_APICALL void GL_APIENTRY glGetPointerv (GLenum pname, void **params); -GL_APICALL void GL_APIENTRY glEnablei (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glDisablei (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GL_APICALL void GL_APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GL_APICALL void GL_APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GL_APICALL void GL_APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GL_APICALL void GL_APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GL_APICALL GLboolean GL_APIENTRY glIsEnabledi (GLenum target, GLuint index); -GL_APICALL void GL_APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GL_APICALL void GL_APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -GL_APICALL void GL_APIENTRY glPrimitiveBoundingBox (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatus (void); -GL_APICALL void GL_APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -GL_APICALL void GL_APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GL_APICALL void GL_APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GL_APICALL void GL_APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GL_APICALL void GL_APIENTRY glMinSampleShading (GLfloat value); -GL_APICALL void GL_APIENTRY glPatchParameteri (GLenum pname, GLint value); -GL_APICALL void GL_APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GL_APICALL void GL_APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GL_APICALL void GL_APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GL_APICALL void GL_APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -GL_APICALL void GL_APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GL_APICALL void GL_APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GL_APICALL void GL_APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif -#endif /* GL_ES_VERSION_3_2 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/core/deps/libadrenotools b/core/deps/libadrenotools new file mode 160000 index 000000000..5deac9f1a --- /dev/null +++ b/core/deps/libadrenotools @@ -0,0 +1 @@ +Subproject commit 5deac9f1ab2bd833ad664bc3386ac1e8998cecb3 diff --git a/core/deps/libchdr b/core/deps/libchdr index 8e09bf2ba..9b6ff6c3c 160000 --- a/core/deps/libchdr +++ b/core/deps/libchdr @@ -1 +1 @@ -Subproject commit 8e09bf2badf8866a360babbf722fada2393b26e3 +Subproject commit 9b6ff6c3c24311750096232a05ee9c5b4963e66c diff --git a/core/deps/libretro-common/compat/fopen_utf8.c b/core/deps/libretro-common/compat/fopen_utf8.c index 52b481e7e..d3d467798 100644 --- a/core/deps/libretro-common/compat/fopen_utf8.c +++ b/core/deps/libretro-common/compat/fopen_utf8.c @@ -31,7 +31,7 @@ #endif #endif -#ifdef _WIN32 +#if defined(_WIN32) && !defined(USE_LIBCDIO) // libcdio has its equivalent version #undef fopen void *fopen_utf8(const char * filename, const char * mode) diff --git a/core/deps/libretro-common/glsm/glsm.c b/core/deps/libretro-common/glsm/glsm.c index 8788e9cdc..b7b7f9e27 100644 --- a/core/deps/libretro-common/glsm/glsm.c +++ b/core/deps/libretro-common/glsm/glsm.c @@ -2360,7 +2360,11 @@ void * rglMapBuffer( GLenum target, GLenum access) log_cb(RETRO_LOG_INFO, "glMapBuffer.\n"); #endif #if defined(HAVE_OPENGLES) +#ifdef glMapBufferOES return glMapBufferOES(target, access); +#else + return NULL; +#endif #else return glMapBuffer(target, access); #endif @@ -2377,7 +2381,11 @@ GLboolean rglUnmapBuffer( GLenum target) log_cb(RETRO_LOG_INFO, "glUnmapBuffer.\n"); #endif #if defined(HAVE_OPENGLES) +#ifdef glUnmapBufferOES return glUnmapBufferOES(target); +#else + return false; +#endif #else return glUnmapBuffer(target); #endif @@ -2735,6 +2743,14 @@ void rglPrimitiveRestartIndex(GLuint index) #endif } +void rglHint(GLenum target, GLenum mode) +{ +#ifdef GLSM_DEBUG + log_cb(RETRO_LOG_INFO, "glHint.\n"); +#endif + glHint(target, mode); +} + /* GLSM-side */ static void glsm_state_setup(void) diff --git a/core/deps/libretro-common/glsym/glgen.py b/core/deps/libretro-common/glsym/glgen.py index 3fe2cf527..66c12f508 100755 --- a/core/deps/libretro-common/glsym/glgen.py +++ b/core/deps/libretro-common/glsym/glgen.py @@ -25,7 +25,7 @@ import os import re -banned_ext = [ 'AMD', 'APPLE', 'NV', 'NVX', 'ATI', '3DLABS', 'SUN', 'SGI', 'SGIX', 'SGIS', 'INTEL', '3DFX', 'IBM', 'MESA', 'GREMEDY', 'OML', 'PGI', 'I3D', 'INGL', 'MTX', 'QCOM', 'IMG', 'ANGLE', 'SUNX', 'INGR' ] +banned_ext = [ 'AMD', 'APPLE', 'NVX', 'ATI', '3DLABS', 'SUN', 'SGI', 'SGIX', 'SGIS', 'INTEL', '3DFX', 'IBM', 'MESA', 'GREMEDY', 'OML', 'PGI', 'I3D', 'INGL', 'MTX', 'QCOM', 'IMG', 'ANGLE', 'SUNX', 'INGR' ] def noext(sym): for ext in banned_ext: @@ -57,7 +57,7 @@ def find_gl_symbols(lines): syms = [] for line in lines: m = re.search(r'^typedef.+PFN(\S+)PROC.+$', line) - g = re.search(r'^.+(gl\S+)\W*\(.+\).*$', line) + g = re.search(r'^.+\W(gl\S+)\W*\(.+\).*$', line) if m and noext(m.group(1)): typedefs.append(m.group(0).replace('PFN', 'RGLSYM').replace('GLDEBUGPROC', 'RGLGENGLDEBUGPROC')) if g and noext(g.group(1)): @@ -73,8 +73,13 @@ def generate_defines(gl_syms): def generate_declarations(gl_syms): return ['RGLSYM' + x.upper() + 'PROC ' + '__rglgen_' + x + ';' for x in gl_syms] +def remove_prefix(text, prefix): + if text.startswith(prefix): + return text[len(prefix):] + return text + def generate_macros(gl_syms): - return [' SYM(' + x.replace('gl', '') + '),' for x in gl_syms] + return [' SYM(' + remove_prefix(x, 'gl') + '),' for x in gl_syms] def dump(f, lines): f.write('\n'.join(lines)) diff --git a/core/deps/libretro-common/glsym/glsym_es3.c b/core/deps/libretro-common/glsym/glsym_es3.c index 86d46d9e7..3068303ae 100644 --- a/core/deps/libretro-common/glsym/glsym_es3.c +++ b/core/deps/libretro-common/glsym/glsym_es3.c @@ -2,412 +2,723 @@ #include #define SYM(x) { "gl" #x, &(gl##x) } const struct rglgen_sym_map rglgen_symbol_map[] = { - SYM(BlendBarrierKHR), - SYM(DebugMessageControlKHR), - SYM(DebugMessageInsertKHR), - SYM(DebugMessageCallbackKHR), - SYM(GetDebugMessageLogKHR), - SYM(PushDebugGroupKHR), - SYM(PopDebugGroupKHR), - SYM(ObjectLabelKHR), - SYM(GetObjectLabelKHR), - SYM(ObjectPtrLabelKHR), - SYM(GetObjectPtrLabelKHR), - SYM(GetPointervKHR), - SYM(GetGraphicsResetStatusKHR), - SYM(ReadnPixelsKHR), - SYM(GetnUniformfvKHR), - SYM(GetnUniformivKHR), - SYM(GetnUniformuivKHR), - SYM(EGLImageTargetTexture2DOES), - SYM(EGLImageTargetRenderbufferStorageOES), - SYM(CopyImageSubDataOES), - SYM(EnableiOES), - SYM(DisableiOES), - SYM(BlendEquationiOES), - SYM(BlendEquationSeparateiOES), - SYM(BlendFunciOES), - SYM(BlendFuncSeparateiOES), - SYM(ColorMaskiOES), - SYM(IsEnablediOES), - SYM(DrawElementsBaseVertexOES), - SYM(DrawRangeElementsBaseVertexOES), - SYM(DrawElementsInstancedBaseVertexOES), - SYM(MultiDrawElementsBaseVertexOES), - SYM(FramebufferTextureOES), - SYM(GetProgramBinaryOES), - SYM(ProgramBinaryOES), - SYM(MapBufferOES), - SYM(UnmapBufferOES), - SYM(GetBufferPointervOES), - SYM(PrimitiveBoundingBoxOES), - SYM(MinSampleShadingOES), - SYM(PatchParameteriOES), - SYM(TexImage3DOES), - SYM(TexSubImage3DOES), - SYM(CopyTexSubImage3DOES), - SYM(CompressedTexImage3DOES), - SYM(CompressedTexSubImage3DOES), - SYM(FramebufferTexture3DOES), - SYM(TexParameterIivOES), - SYM(TexParameterIuivOES), - SYM(GetTexParameterIivOES), - SYM(GetTexParameterIuivOES), - SYM(SamplerParameterIivOES), - SYM(SamplerParameterIuivOES), - SYM(GetSamplerParameterIivOES), - SYM(GetSamplerParameterIuivOES), - SYM(TexBufferOES), - SYM(TexBufferRangeOES), - SYM(TexStorage3DMultisampleOES), - SYM(TextureViewOES), - SYM(BindVertexArrayOES), - SYM(DeleteVertexArraysOES), - SYM(GenVertexArraysOES), - SYM(IsVertexArrayOES), - SYM(ViewportArrayvOES), - SYM(ViewportIndexedfOES), - SYM(ViewportIndexedfvOES), - SYM(ScissorArrayvOES), - SYM(ScissorIndexedOES), - SYM(ScissorIndexedvOES), - SYM(DepthRangeArrayfvOES), - SYM(DepthRangeIndexedfOES), - SYM(GetFloati_vOES), - SYM(DrawArraysInstancedBaseInstanceEXT), - SYM(DrawElementsInstancedBaseInstanceEXT), - SYM(DrawElementsInstancedBaseVertexBaseInstanceEXT), - SYM(BindFragDataLocationIndexedEXT), - SYM(BindFragDataLocationEXT), - SYM(GetProgramResourceLocationIndexEXT), - SYM(GetFragDataIndexEXT), - SYM(BufferStorageEXT), - SYM(ClearTexImageEXT), - SYM(ClearTexSubImageEXT), - SYM(CopyImageSubDataEXT), - SYM(LabelObjectEXT), - SYM(GetObjectLabelEXT), - SYM(InsertEventMarkerEXT), - SYM(PushGroupMarkerEXT), - SYM(PopGroupMarkerEXT), - SYM(DiscardFramebufferEXT), - SYM(GenQueriesEXT), - SYM(DeleteQueriesEXT), - SYM(IsQueryEXT), - SYM(BeginQueryEXT), - SYM(EndQueryEXT), - SYM(QueryCounterEXT), - SYM(GetQueryivEXT), - SYM(GetQueryObjectivEXT), - SYM(GetQueryObjectuivEXT), - SYM(GetQueryObjecti64vEXT), - SYM(GetQueryObjectui64vEXT), - SYM(DrawBuffersEXT), - SYM(EnableiEXT), - SYM(DisableiEXT), - SYM(BlendEquationiEXT), - SYM(BlendEquationSeparateiEXT), - SYM(BlendFunciEXT), - SYM(BlendFuncSeparateiEXT), - SYM(ColorMaskiEXT), - SYM(IsEnablediEXT), - SYM(DrawElementsBaseVertexEXT), - SYM(DrawRangeElementsBaseVertexEXT), - SYM(DrawElementsInstancedBaseVertexEXT), - SYM(MultiDrawElementsBaseVertexEXT), - SYM(DrawArraysInstancedEXT), - SYM(DrawElementsInstancedEXT), - SYM(FramebufferTextureEXT), - SYM(VertexAttribDivisorEXT), - SYM(MapBufferRangeEXT), - SYM(FlushMappedBufferRangeEXT), - SYM(MultiDrawArraysEXT), - SYM(MultiDrawElementsEXT), - SYM(MultiDrawArraysIndirectEXT), - SYM(MultiDrawElementsIndirectEXT), - SYM(RenderbufferStorageMultisampleEXT), - SYM(FramebufferTexture2DMultisampleEXT), - SYM(ReadBufferIndexedEXT), - SYM(DrawBuffersIndexedEXT), - SYM(GetIntegeri_vEXT), - SYM(PolygonOffsetClampEXT), - SYM(PrimitiveBoundingBoxEXT), - SYM(RasterSamplesEXT), - SYM(GetGraphicsResetStatusEXT), - SYM(ReadnPixelsEXT), - SYM(GetnUniformfvEXT), - SYM(GetnUniformivEXT), - SYM(ActiveShaderProgramEXT), - SYM(BindProgramPipelineEXT), - SYM(CreateShaderProgramvEXT), - SYM(DeleteProgramPipelinesEXT), - SYM(GenProgramPipelinesEXT), - SYM(GetProgramPipelineInfoLogEXT), - SYM(GetProgramPipelineivEXT), - SYM(IsProgramPipelineEXT), - SYM(ProgramParameteriEXT), - SYM(ProgramUniform1fEXT), - SYM(ProgramUniform1fvEXT), - SYM(ProgramUniform1iEXT), - SYM(ProgramUniform1ivEXT), - SYM(ProgramUniform2fEXT), - SYM(ProgramUniform2fvEXT), - SYM(ProgramUniform2iEXT), - SYM(ProgramUniform2ivEXT), - SYM(ProgramUniform3fEXT), - SYM(ProgramUniform3fvEXT), - SYM(ProgramUniform3iEXT), - SYM(ProgramUniform3ivEXT), - SYM(ProgramUniform4fEXT), - SYM(ProgramUniform4fvEXT), - SYM(ProgramUniform4iEXT), - SYM(ProgramUniform4ivEXT), - SYM(ProgramUniformMatrix2fvEXT), - SYM(ProgramUniformMatrix3fvEXT), - SYM(ProgramUniformMatrix4fvEXT), - SYM(UseProgramStagesEXT), - SYM(ValidateProgramPipelineEXT), - SYM(ProgramUniform1uiEXT), - SYM(ProgramUniform2uiEXT), - SYM(ProgramUniform3uiEXT), - SYM(ProgramUniform4uiEXT), - SYM(ProgramUniform1uivEXT), - SYM(ProgramUniform2uivEXT), - SYM(ProgramUniform3uivEXT), - SYM(ProgramUniform4uivEXT), - SYM(ProgramUniformMatrix2x3fvEXT), - SYM(ProgramUniformMatrix3x2fvEXT), - SYM(ProgramUniformMatrix2x4fvEXT), - SYM(ProgramUniformMatrix4x2fvEXT), - SYM(ProgramUniformMatrix3x4fvEXT), - SYM(ProgramUniformMatrix4x3fvEXT), - SYM(FramebufferPixelLocalStorageSizeEXT), - SYM(GetFramebufferPixelLocalStorageSizeEXT), - SYM(ClearPixelLocalStorageuiEXT), - SYM(TexPageCommitmentEXT), - SYM(PatchParameteriEXT), - SYM(TexParameterIivEXT), - SYM(TexParameterIuivEXT), - SYM(GetTexParameterIivEXT), - SYM(GetTexParameterIuivEXT), - SYM(SamplerParameterIivEXT), - SYM(SamplerParameterIuivEXT), - SYM(GetSamplerParameterIivEXT), - SYM(GetSamplerParameterIuivEXT), - SYM(TexBufferEXT), - SYM(TexBufferRangeEXT), - SYM(TexStorage1DEXT), - SYM(TexStorage2DEXT), - SYM(TexStorage3DEXT), - SYM(TextureStorage1DEXT), - SYM(TextureStorage2DEXT), - SYM(TextureStorage3DEXT), - SYM(TextureViewEXT), - SYM(FramebufferTextureMultiviewOVR), - SYM(FramebufferTextureMultisampleMultiviewOVR), + SYM(ActiveTexture), + SYM(AttachShader), + SYM(BindAttribLocation), + SYM(BindBuffer), + SYM(BindFramebuffer), + SYM(BindRenderbuffer), + SYM(BindTexture), + SYM(BlendColor), + SYM(BlendEquation), + SYM(BlendEquationSeparate), + SYM(BlendFunc), + SYM(BlendFuncSeparate), + SYM(BufferData), + SYM(BufferSubData), + SYM(CheckFramebufferStatus), + SYM(Clear), + SYM(ClearColor), + SYM(ClearDepthf), + SYM(ClearStencil), + SYM(ColorMask), + SYM(CompileShader), + SYM(CompressedTexImage2D), + SYM(CompressedTexSubImage2D), + SYM(CopyTexImage2D), + SYM(CopyTexSubImage2D), + SYM(CreateProgram), + SYM(CreateShader), + SYM(CullFace), + SYM(DeleteBuffers), + SYM(DeleteFramebuffers), + SYM(DeleteProgram), + SYM(DeleteRenderbuffers), + SYM(DeleteShader), + SYM(DeleteTextures), + SYM(DepthFunc), + SYM(DepthMask), + SYM(DepthRangef), + SYM(DetachShader), + SYM(Disable), + SYM(DisableVertexAttribArray), + SYM(DrawArrays), + SYM(DrawElements), + SYM(Enable), + SYM(EnableVertexAttribArray), + SYM(Finish), + SYM(Flush), + SYM(FramebufferRenderbuffer), + SYM(FramebufferTexture2D), + SYM(FrontFace), + SYM(GenBuffers), + SYM(GenerateMipmap), + SYM(GenFramebuffers), + SYM(GenRenderbuffers), + SYM(GenTextures), + SYM(GetActiveAttrib), + SYM(GetActiveUniform), + SYM(GetAttachedShaders), + SYM(GetAttribLocation), + SYM(GetBooleanv), + SYM(GetBufferParameteriv), + SYM(GetError), + SYM(GetFloatv), + SYM(GetFramebufferAttachmentParameteriv), + SYM(GetIntegerv), + SYM(GetProgramiv), + SYM(GetProgramInfoLog), + SYM(GetRenderbufferParameteriv), + SYM(GetShaderiv), + SYM(GetShaderInfoLog), + SYM(GetShaderPrecisionFormat), + SYM(GetShaderSource), + SYM(GetString), + SYM(GetTexParameterfv), + SYM(GetTexParameteriv), + SYM(GetUniformfv), + SYM(GetUniformiv), + SYM(GetUniformLocation), + SYM(GetVertexAttribfv), + SYM(GetVertexAttribiv), + SYM(GetVertexAttribPointerv), + SYM(Hint), + SYM(IsBuffer), + SYM(IsEnabled), + SYM(IsFramebuffer), + SYM(IsProgram), + SYM(IsRenderbuffer), + SYM(IsShader), + SYM(IsTexture), + SYM(LineWidth), + SYM(LinkProgram), + SYM(PixelStorei), + SYM(PolygonOffset), + SYM(ReadPixels), + SYM(ReleaseShaderCompiler), + SYM(RenderbufferStorage), + SYM(SampleCoverage), + SYM(Scissor), + SYM(ShaderBinary), + SYM(ShaderSource), + SYM(StencilFunc), + SYM(StencilFuncSeparate), + SYM(StencilMask), + SYM(StencilMaskSeparate), + SYM(StencilOp), + SYM(StencilOpSeparate), + SYM(TexImage2D), + SYM(TexParameterf), + SYM(TexParameterfv), + SYM(TexParameteri), + SYM(TexParameteriv), + SYM(TexSubImage2D), + SYM(Uniform1f), + SYM(Uniform1fv), + SYM(Uniform1i), + SYM(Uniform1iv), + SYM(Uniform2f), + SYM(Uniform2fv), + SYM(Uniform2i), + SYM(Uniform2iv), + SYM(Uniform3f), + SYM(Uniform3fv), + SYM(Uniform3i), + SYM(Uniform3iv), + SYM(Uniform4f), + SYM(Uniform4fv), + SYM(Uniform4i), + SYM(Uniform4iv), + SYM(UniformMatrix2fv), + SYM(UniformMatrix3fv), + SYM(UniformMatrix4fv), + SYM(UseProgram), + SYM(ValidateProgram), + SYM(VertexAttrib1f), + SYM(VertexAttrib1fv), + SYM(VertexAttrib2f), + SYM(VertexAttrib2fv), + SYM(VertexAttrib3f), + SYM(VertexAttrib3fv), + SYM(VertexAttrib4f), + SYM(VertexAttrib4fv), + SYM(VertexAttribPointer), + SYM(Viewport), + SYM(ReadBuffer), + SYM(DrawRangeElements), + SYM(TexImage3D), + SYM(TexSubImage3D), + SYM(CopyTexSubImage3D), + SYM(CompressedTexImage3D), + SYM(CompressedTexSubImage3D), + SYM(GenQueries), + SYM(DeleteQueries), + SYM(IsQuery), + SYM(BeginQuery), + SYM(EndQuery), + SYM(GetQueryiv), + SYM(GetQueryObjectuiv), + SYM(UnmapBuffer), + SYM(GetBufferPointerv), + SYM(DrawBuffers), + SYM(UniformMatrix2x3fv), + SYM(UniformMatrix3x2fv), + SYM(UniformMatrix2x4fv), + SYM(UniformMatrix4x2fv), + SYM(UniformMatrix3x4fv), + SYM(UniformMatrix4x3fv), + SYM(BlitFramebuffer), + SYM(RenderbufferStorageMultisample), + SYM(FramebufferTextureLayer), + SYM(MapBufferRange), + SYM(FlushMappedBufferRange), + SYM(BindVertexArray), + SYM(DeleteVertexArrays), + SYM(GenVertexArrays), + SYM(IsVertexArray), + SYM(GetIntegeri_v), + SYM(BeginTransformFeedback), + SYM(EndTransformFeedback), + SYM(BindBufferRange), + SYM(BindBufferBase), + SYM(TransformFeedbackVaryings), + SYM(GetTransformFeedbackVarying), + SYM(VertexAttribIPointer), + SYM(GetVertexAttribIiv), + SYM(GetVertexAttribIuiv), + SYM(VertexAttribI4i), + SYM(VertexAttribI4ui), + SYM(VertexAttribI4iv), + SYM(VertexAttribI4uiv), + SYM(GetUniformuiv), + SYM(GetFragDataLocation), + SYM(Uniform1ui), + SYM(Uniform2ui), + SYM(Uniform3ui), + SYM(Uniform4ui), + SYM(Uniform1uiv), + SYM(Uniform2uiv), + SYM(Uniform3uiv), + SYM(Uniform4uiv), + SYM(ClearBufferiv), + SYM(ClearBufferuiv), + SYM(ClearBufferfv), + SYM(ClearBufferfi), + SYM(GetStringi), + SYM(CopyBufferSubData), + SYM(GetUniformIndices), + SYM(GetActiveUniformsiv), + SYM(GetUniformBlockIndex), + SYM(GetActiveUniformBlockiv), + SYM(GetActiveUniformBlockName), + SYM(UniformBlockBinding), + SYM(DrawArraysInstanced), + SYM(DrawElementsInstanced), + SYM(FenceSync), + SYM(IsSync), + SYM(DeleteSync), + SYM(ClientWaitSync), + SYM(WaitSync), + SYM(GetInteger64v), + SYM(GetSynciv), + SYM(GetInteger64i_v), + SYM(GetBufferParameteri64v), + SYM(GenSamplers), + SYM(DeleteSamplers), + SYM(IsSampler), + SYM(BindSampler), + SYM(SamplerParameteri), + SYM(SamplerParameteriv), + SYM(SamplerParameterf), + SYM(SamplerParameterfv), + SYM(GetSamplerParameteriv), + SYM(GetSamplerParameterfv), + SYM(VertexAttribDivisor), + SYM(BindTransformFeedback), + SYM(DeleteTransformFeedbacks), + SYM(GenTransformFeedbacks), + SYM(IsTransformFeedback), + SYM(PauseTransformFeedback), + SYM(ResumeTransformFeedback), + SYM(GetProgramBinary), + SYM(ProgramBinary), + SYM(ProgramParameteri), + SYM(InvalidateFramebuffer), + SYM(InvalidateSubFramebuffer), + SYM(TexStorage2D), + SYM(TexStorage3D), + SYM(GetInternalformativ), + SYM(DispatchCompute), + SYM(DispatchComputeIndirect), + SYM(DrawArraysIndirect), + SYM(DrawElementsIndirect), + SYM(FramebufferParameteri), + SYM(GetFramebufferParameteriv), + SYM(GetProgramInterfaceiv), + SYM(GetProgramResourceIndex), + SYM(GetProgramResourceName), + SYM(GetProgramResourceiv), + SYM(GetProgramResourceLocation), + SYM(UseProgramStages), + SYM(ActiveShaderProgram), + SYM(CreateShaderProgramv), + SYM(BindProgramPipeline), + SYM(DeleteProgramPipelines), + SYM(GenProgramPipelines), + SYM(IsProgramPipeline), + SYM(GetProgramPipelineiv), + SYM(ProgramUniform1i), + SYM(ProgramUniform2i), + SYM(ProgramUniform3i), + SYM(ProgramUniform4i), + SYM(ProgramUniform1ui), + SYM(ProgramUniform2ui), + SYM(ProgramUniform3ui), + SYM(ProgramUniform4ui), + SYM(ProgramUniform1f), + SYM(ProgramUniform2f), + SYM(ProgramUniform3f), + SYM(ProgramUniform4f), + SYM(ProgramUniform1iv), + SYM(ProgramUniform2iv), + SYM(ProgramUniform3iv), + SYM(ProgramUniform4iv), + SYM(ProgramUniform1uiv), + SYM(ProgramUniform2uiv), + SYM(ProgramUniform3uiv), + SYM(ProgramUniform4uiv), + SYM(ProgramUniform1fv), + SYM(ProgramUniform2fv), + SYM(ProgramUniform3fv), + SYM(ProgramUniform4fv), + SYM(ProgramUniformMatrix2fv), + SYM(ProgramUniformMatrix3fv), + SYM(ProgramUniformMatrix4fv), + SYM(ProgramUniformMatrix2x3fv), + SYM(ProgramUniformMatrix3x2fv), + SYM(ProgramUniformMatrix2x4fv), + SYM(ProgramUniformMatrix4x2fv), + SYM(ProgramUniformMatrix3x4fv), + SYM(ProgramUniformMatrix4x3fv), + SYM(ValidateProgramPipeline), + SYM(GetProgramPipelineInfoLog), + SYM(BindImageTexture), + SYM(GetBooleani_v), + SYM(MemoryBarrier), + SYM(MemoryBarrierByRegion), + SYM(TexStorage2DMultisample), + SYM(GetMultisamplefv), + SYM(SampleMaski), + SYM(GetTexLevelParameteriv), + SYM(GetTexLevelParameterfv), + SYM(BindVertexBuffer), + SYM(VertexAttribFormat), + SYM(VertexAttribIFormat), + SYM(VertexAttribBinding), + SYM(VertexBindingDivisor), + SYM(BlendBarrier), + SYM(CopyImageSubData), + SYM(DebugMessageControl), + SYM(DebugMessageInsert), + SYM(DebugMessageCallback), + SYM(GetDebugMessageLog), + SYM(PushDebugGroup), + SYM(PopDebugGroup), + SYM(ObjectLabel), + SYM(GetObjectLabel), + SYM(ObjectPtrLabel), + SYM(GetObjectPtrLabel), + SYM(GetPointerv), + SYM(Enablei), + SYM(Disablei), + SYM(BlendEquationi), + SYM(BlendEquationSeparatei), + SYM(BlendFunci), + SYM(BlendFuncSeparatei), + SYM(ColorMaski), + SYM(IsEnabledi), + SYM(DrawElementsBaseVertex), + SYM(DrawRangeElementsBaseVertex), + SYM(DrawElementsInstancedBaseVertex), + SYM(FramebufferTexture), + SYM(PrimitiveBoundingBox), + SYM(GetGraphicsResetStatus), + SYM(ReadnPixels), + SYM(GetnUniformfv), + SYM(GetnUniformiv), + SYM(GetnUniformuiv), + SYM(MinSampleShading), + SYM(PatchParameteri), + SYM(TexParameterIiv), + SYM(TexParameterIuiv), + SYM(GetTexParameterIiv), + SYM(GetTexParameterIuiv), + SYM(SamplerParameterIiv), + SYM(SamplerParameterIuiv), + SYM(GetSamplerParameterIiv), + SYM(GetSamplerParameterIuiv), + SYM(TexBuffer), + SYM(TexBufferRange), + SYM(TexStorage3DMultisample), { NULL, NULL }, }; -RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; -RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; -RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; -RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; -RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; -RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; -RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; -RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; -RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; -RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; -RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; -RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; -RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; -RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; -RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; -RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; -RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; -RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; -RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; -RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; -RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; -RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; -RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; -RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; -RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; -RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; -RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; -RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; -RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; -RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; -RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; -RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; -RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; -RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; -RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; -RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; -RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; -RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; -RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; -RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; -RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; -RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; -RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; -RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; -RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; -RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; -RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; -RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; -RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; -RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; -RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; -RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; -RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; -RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; -RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; -RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; -RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; -RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; -RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; -RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; -RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; -RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; -RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; -RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; -RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; -RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; -RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; -RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; -RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; -RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; -RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; -RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; -RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; -RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; -RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; -RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; -RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; -RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; -RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; -RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; -RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; -RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; -RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; -RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; -RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; -RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; -RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; -RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; -RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; -RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; -RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; -RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; -RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; -RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; -RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; -RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; -RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; -RGLSYMGLGETQUERYOBJECTI64VEXTPROC __rglgen_glGetQueryObjecti64vEXT; -RGLSYMGLGETQUERYOBJECTUI64VEXTPROC __rglgen_glGetQueryObjectui64vEXT; -RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; -RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; -RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; -RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; -RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; -RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; -RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; -RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; -RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; -RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; -RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; -RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; -RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; -RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; -RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; -RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; -RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; -RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; -RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; -RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; -RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; -RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; -RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; -RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; -RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; -RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; -RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; -RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; -RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; -RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; -RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; -RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; -RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; -RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; -RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; -RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; -RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; -RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; -RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; -RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; -RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; -RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; -RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; -RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; -RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; -RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; -RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; -RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; -RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; -RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; -RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; -RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; -RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; -RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; -RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; -RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; -RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; -RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; -RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; -RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; -RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; -RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; -RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; -RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; -RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; -RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; -RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; -RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; -RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; -RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; -RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; -RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; -RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; -RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; -RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; -RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; -RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; -RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; -RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; -RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; -RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; -RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; -RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; -RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; -RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; -RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; -RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; -RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; -RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; -RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; -RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; -RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; -RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; -RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; -RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR; +RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; +RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; +RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; +RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; +RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; +RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; +RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; +RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; +RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; +RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; +RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; +RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; +RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; +RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; +RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; +RGLSYMGLCLEARPROC __rglgen_glClear; +RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; +RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; +RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; +RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; +RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; +RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; +RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; +RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; +RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; +RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; +RGLSYMGLCULLFACEPROC __rglgen_glCullFace; +RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; +RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; +RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; +RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; +RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; +RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; +RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; +RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; +RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; +RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; +RGLSYMGLDISABLEPROC __rglgen_glDisable; +RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; +RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; +RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; +RGLSYMGLENABLEPROC __rglgen_glEnable; +RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; +RGLSYMGLFINISHPROC __rglgen_glFinish; +RGLSYMGLFLUSHPROC __rglgen_glFlush; +RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; +RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; +RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; +RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; +RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; +RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; +RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; +RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; +RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; +RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; +RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; +RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; +RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; +RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; +RGLSYMGLGETERRORPROC __rglgen_glGetError; +RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; +RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; +RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; +RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; +RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; +RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; +RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; +RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; +RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; +RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; +RGLSYMGLGETSTRINGPROC __rglgen_glGetString; +RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; +RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; +RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; +RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; +RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; +RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; +RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; +RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; +RGLSYMGLHINTPROC __rglgen_glHint; +RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; +RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; +RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; +RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; +RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; +RGLSYMGLISSHADERPROC __rglgen_glIsShader; +RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; +RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; +RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; +RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; +RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; +RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; +RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; +RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; +RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; +RGLSYMGLSCISSORPROC __rglgen_glScissor; +RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; +RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; +RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; +RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; +RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; +RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; +RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; +RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; +RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; +RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; +RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; +RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; +RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; +RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; +RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; +RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; +RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; +RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; +RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; +RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; +RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; +RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; +RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; +RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; +RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; +RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; +RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; +RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; +RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; +RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; +RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; +RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; +RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; +RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; +RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; +RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; +RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; +RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; +RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; +RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; +RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; +RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; +RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; +RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; +RGLSYMGLVIEWPORTPROC __rglgen_glViewport; +RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; +RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; +RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; +RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; +RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; +RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; +RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; +RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; +RGLSYMGLISQUERYPROC __rglgen_glIsQuery; +RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; +RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; +RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; +RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; +RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; +RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; +RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; +RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; +RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; +RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; +RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; +RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; +RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; +RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; +RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; +RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; +RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; +RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; +RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; +RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; +RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; +RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; +RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; +RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; +RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; +RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; +RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; +RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; +RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; +RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; +RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; +RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; +RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; +RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; +RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; +RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; +RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; +RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; +RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; +RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; +RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; +RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; +RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; +RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; +RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; +RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; +RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; +RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; +RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; +RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; +RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; +RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; +RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; +RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; +RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; +RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; +RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; +RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; +RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; +RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; +RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; +RGLSYMGLISSYNCPROC __rglgen_glIsSync; +RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; +RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; +RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; +RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; +RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; +RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; +RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; +RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; +RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; +RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; +RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; +RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; +RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; +RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; +RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; +RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; +RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; +RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; +RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; +RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; +RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; +RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; +RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; +RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; +RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; +RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; +RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; +RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; +RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; +RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; +RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; +RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; +RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; +RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; +RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; +RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; +RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; +RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; +RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; +RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; +RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; +RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; +RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; +RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; +RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; +RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; +RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; +RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; +RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; +RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; +RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; +RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; +RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; +RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; +RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; +RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; +RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; +RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; +RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; +RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; +RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; +RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; +RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; +RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; +RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; +RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; +RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; +RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; +RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; +RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; +RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; +RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; +RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; +RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; +RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; +RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; +RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; +RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; +RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; +RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; +RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; +RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; +RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; +RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; +RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; +RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; +RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; +RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; +RGLSYMGLBLENDBARRIERPROC __rglgen_glBlendBarrier; +RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; +RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; +RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; +RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; +RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; +RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; +RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; +RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; +RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; +RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; +RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; +RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; +RGLSYMGLENABLEIPROC __rglgen_glEnablei; +RGLSYMGLDISABLEIPROC __rglgen_glDisablei; +RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; +RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; +RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; +RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; +RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; +RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; +RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; +RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; +RGLSYMGLPRIMITIVEBOUNDINGBOXPROC __rglgen_glPrimitiveBoundingBox; +RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; +RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; +RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; +RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; +RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; +RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; +RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; +RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; +RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; +RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; +RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; +RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; +RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; +RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; +RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; +RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; +RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; + diff --git a/core/deps/libretro-common/glsym/glsym_gl.c b/core/deps/libretro-common/glsym/glsym_gl.c index 51d3bf0f3..b9d8912e2 100644 --- a/core/deps/libretro-common/glsym/glsym_gl.c +++ b/core/deps/libretro-common/glsym/glsym_gl.c @@ -27,465 +27,68 @@ #define SYM(x) { "gl" #x, (void*)&(gl##x) } const struct rglgen_sym_map rglgen_symbol_map[] = { -#ifdef HAVE_LIBNX - SYM(ClearIndex), - SYM(ClearColor), - SYM(Clear), - SYM(IndexMask), - SYM(ColorMask), - SYM(AlphaFunc), - SYM(BlendFunc), - SYM(LogicOp), SYM(CullFace), SYM(FrontFace), - SYM(PointSize), + SYM(Hint), SYM(LineWidth), - SYM(LineStipple), + SYM(PointSize), SYM(PolygonMode), - SYM(PolygonOffset), - SYM(PolygonStipple), - SYM(GetPolygonStipple), - SYM(EdgeFlag), - SYM(EdgeFlagv), SYM(Scissor), - SYM(ClipPlane), - SYM(GetClipPlane), + SYM(TexParameterf), + SYM(TexParameterfv), + SYM(TexParameteri), + SYM(TexParameteriv), + SYM(TexImage1D), + SYM(TexImage2D), SYM(DrawBuffer), - SYM(ReadBuffer), - SYM(Enable), + SYM(Clear), + SYM(ClearColor), + SYM(ClearStencil), + SYM(ClearDepth), + SYM(StencilMask), + SYM(ColorMask), + SYM(DepthMask), SYM(Disable), - SYM(IsEnabled), - SYM(EnableClientState), - SYM(DisableClientState), - SYM(GetBooleanv), - SYM(GetDoublev), - SYM(GetFloatv), - SYM(GetIntegerv), - SYM(PushAttrib), - SYM(PopAttrib), - SYM(PushClientAttrib), - SYM(PopClientAttrib), - SYM(RenderMode), - SYM(GetError), - SYM(GetString), + SYM(Enable), SYM(Finish), SYM(Flush), - SYM(Hint), - SYM(ClearDepth), + SYM(BlendFunc), + SYM(LogicOp), + SYM(StencilFunc), + SYM(StencilOp), SYM(DepthFunc), - SYM(DepthMask), - SYM(DepthRange), - SYM(ClearAccum), - SYM(Accum), - SYM(MatrixMode), - SYM(Ortho), - SYM(Frustum), - SYM(Viewport), - SYM(PushMatrix), - SYM(PopMatrix), - SYM(LoadIdentity), - SYM(LoadMatrixd), - SYM(LoadMatrixf), - SYM(MultMatrixd), - SYM(MultMatrixf), - SYM(Rotated), - SYM(Rotatef), - SYM(Scaled), - SYM(Scalef), - SYM(Translated), - SYM(Translatef), - SYM(IsList), - SYM(DeleteLists), - SYM(GenLists), - SYM(NewList), - SYM(EndList), - SYM(CallList), - SYM(CallLists), - SYM(ListBase), - SYM(Begin), - SYM(End), - SYM(Vertex2d), - SYM(Vertex2f), - SYM(Vertex2i), - SYM(Vertex2s), - SYM(Vertex3d), - SYM(Vertex3f), - SYM(Vertex3i), - SYM(Vertex3s), - SYM(Vertex4d), - SYM(Vertex4f), - SYM(Vertex4i), - SYM(Vertex4s), - SYM(Vertex2dv), - SYM(Vertex2fv), - SYM(Vertex2iv), - SYM(Vertex2sv), - SYM(Vertex3dv), - SYM(Vertex3fv), - SYM(Vertex3iv), - SYM(Vertex3sv), - SYM(Vertex4dv), - SYM(Vertex4fv), - SYM(Vertex4iv), - SYM(Vertex4sv), - SYM(Normal3b), - SYM(Normal3d), - SYM(Normal3f), - SYM(Normal3i), - SYM(Normal3s), - SYM(Normal3bv), - SYM(Normal3dv), - SYM(Normal3fv), - SYM(Normal3iv), - SYM(Normal3sv), - SYM(Indexd), - SYM(Indexf), - SYM(Indexi), - SYM(Indexs), - SYM(Indexub), - SYM(Indexdv), - SYM(Indexfv), - SYM(Indexiv), - SYM(Indexsv), - SYM(Indexubv), - SYM(Color3b), - SYM(Color3d), - SYM(Color3f), - SYM(Color3i), - SYM(Color3s), - SYM(Color3ub), - SYM(Color3ui), - SYM(Color3us), - SYM(Color4b), - SYM(Color4d), - SYM(Color4f), - SYM(Color4i), - SYM(Color4s), - SYM(Color4ub), - SYM(Color4ui), - SYM(Color4us), - SYM(Color3bv), - SYM(Color3dv), - SYM(Color3fv), - SYM(Color3iv), - SYM(Color3sv), - SYM(Color3ubv), - SYM(Color3uiv), - SYM(Color3usv), - SYM(Color4bv), - SYM(Color4dv), - SYM(Color4fv), - SYM(Color4iv), - SYM(Color4sv), - SYM(Color4ubv), - SYM(Color4uiv), - SYM(Color4usv), - SYM(TexCoord1d), - SYM(TexCoord1f), - SYM(TexCoord1i), - SYM(TexCoord1s), - SYM(TexCoord2d), - SYM(TexCoord2f), - SYM(TexCoord2i), - SYM(TexCoord2s), - SYM(TexCoord3d), - SYM(TexCoord3f), - SYM(TexCoord3i), - SYM(TexCoord3s), - SYM(TexCoord4d), - SYM(TexCoord4f), - SYM(TexCoord4i), - SYM(TexCoord4s), - SYM(TexCoord1dv), - SYM(TexCoord1fv), - SYM(TexCoord1iv), - SYM(TexCoord1sv), - SYM(TexCoord2dv), - SYM(TexCoord2fv), - SYM(TexCoord2iv), - SYM(TexCoord2sv), - SYM(TexCoord3dv), - SYM(TexCoord3fv), - SYM(TexCoord3iv), - SYM(TexCoord3sv), - SYM(TexCoord4dv), - SYM(TexCoord4fv), - SYM(TexCoord4iv), - SYM(TexCoord4sv), - SYM(RasterPos2d), - SYM(RasterPos2f), - SYM(RasterPos2i), - SYM(RasterPos2s), - SYM(RasterPos3d), - SYM(RasterPos3f), - SYM(RasterPos3i), - SYM(RasterPos3s), - SYM(RasterPos4d), - SYM(RasterPos4f), - SYM(RasterPos4i), - SYM(RasterPos4s), - SYM(RasterPos2dv), - SYM(RasterPos2fv), - SYM(RasterPos2iv), - SYM(RasterPos2sv), - SYM(RasterPos3dv), - SYM(RasterPos3fv), - SYM(RasterPos3iv), - SYM(RasterPos3sv), - SYM(RasterPos4dv), - SYM(RasterPos4fv), - SYM(RasterPos4iv), - SYM(RasterPos4sv), - SYM(Rectd), - SYM(Rectf), - SYM(Recti), - SYM(Rects), - SYM(Rectdv), - SYM(Rectfv), - SYM(Rectiv), - SYM(Rectsv), - SYM(VertexPointer), - SYM(NormalPointer), - SYM(ColorPointer), - SYM(IndexPointer), - SYM(TexCoordPointer), - SYM(EdgeFlagPointer), - SYM(GetPointerv), - SYM(ArrayElement), - SYM(DrawArrays), - SYM(DrawElements), - SYM(InterleavedArrays), - SYM(ShadeModel), - SYM(Lightf), - SYM(Lighti), - SYM(Lightfv), - SYM(Lightiv), - SYM(GetLightfv), - SYM(GetLightiv), - SYM(LightModelf), - SYM(LightModeli), - SYM(LightModelfv), - SYM(LightModeliv), - SYM(Materialf), - SYM(Materiali), - SYM(Materialfv), - SYM(Materialiv), - SYM(GetMaterialfv), - SYM(GetMaterialiv), - SYM(ColorMaterial), - SYM(PixelZoom), SYM(PixelStoref), SYM(PixelStorei), - SYM(PixelTransferf), - SYM(PixelTransferi), - SYM(PixelMapfv), - SYM(PixelMapuiv), - SYM(PixelMapusv), - SYM(GetPixelMapfv), - SYM(GetPixelMapuiv), - SYM(GetPixelMapusv), - SYM(Bitmap), + SYM(ReadBuffer), SYM(ReadPixels), - SYM(DrawPixels), - SYM(CopyPixels), - SYM(StencilFunc), - SYM(StencilMask), - SYM(StencilOp), - SYM(ClearStencil), - SYM(TexGend), - SYM(TexGenf), - SYM(TexGeni), - SYM(TexGendv), - SYM(TexGenfv), - SYM(TexGeniv), - SYM(GetTexGendv), - SYM(GetTexGenfv), - SYM(GetTexGeniv), - SYM(TexEnvf), - SYM(TexEnvi), - SYM(TexEnvfv), - SYM(TexEnviv), - SYM(GetTexEnvfv), - SYM(GetTexEnviv), - SYM(TexParameterf), - SYM(TexParameteri), - SYM(TexParameterfv), - SYM(TexParameteriv), + SYM(GetBooleanv), + SYM(GetDoublev), + SYM(GetError), + SYM(GetFloatv), + SYM(GetIntegerv), + SYM(GetString), + SYM(GetTexImage), SYM(GetTexParameterfv), SYM(GetTexParameteriv), SYM(GetTexLevelParameterfv), SYM(GetTexLevelParameteriv), - SYM(TexImage1D), - SYM(TexImage2D), - SYM(GetTexImage), - SYM(GenTextures), - SYM(DeleteTextures), - SYM(BindTexture), - SYM(PrioritizeTextures), - SYM(AreTexturesResident), - SYM(IsTexture), - SYM(TexSubImage1D), - SYM(TexSubImage2D), + SYM(IsEnabled), + SYM(DepthRange), + SYM(Viewport), + SYM(DrawArrays), + SYM(DrawElements), + SYM(GetPointerv), + SYM(PolygonOffset), SYM(CopyTexImage1D), SYM(CopyTexImage2D), SYM(CopyTexSubImage1D), SYM(CopyTexSubImage2D), - SYM(Map1d), - SYM(Map1f), - SYM(Map2d), - SYM(Map2f), - SYM(GetMapdv), - SYM(GetMapfv), - SYM(GetMapiv), - SYM(EvalCoord1d), - SYM(EvalCoord1f), - SYM(EvalCoord1dv), - SYM(EvalCoord1fv), - SYM(EvalCoord2d), - SYM(EvalCoord2f), - SYM(EvalCoord2dv), - SYM(EvalCoord2fv), - SYM(MapGrid1d), - SYM(MapGrid1f), - SYM(MapGrid2d), - SYM(MapGrid2f), - SYM(EvalPoint1), - SYM(EvalPoint2), - SYM(EvalMesh1), - SYM(EvalMesh2), - SYM(Fogf), - SYM(Fogi), - SYM(Fogfv), - SYM(Fogiv), - SYM(FeedbackBuffer), - SYM(PassThrough), - SYM(SelectBuffer), - SYM(InitNames), - SYM(LoadName), - SYM(PushName), - SYM(PopName), - SYM(DrawRangeElements), - SYM(TexImage3D), - SYM(TexSubImage3D), - SYM(CopyTexSubImage3D), - SYM(ColorTable), - SYM(ColorSubTable), - SYM(ColorTableParameteriv), - SYM(ColorTableParameterfv), - SYM(CopyColorSubTable), - SYM(CopyColorTable), - SYM(GetColorTable), - SYM(GetColorTableParameterfv), - SYM(GetColorTableParameteriv), - SYM(BlendEquation), - SYM(BlendColor), - SYM(Histogram), - SYM(ResetHistogram), - SYM(GetHistogram), - SYM(GetHistogramParameterfv), - SYM(GetHistogramParameteriv), - SYM(Minmax), - SYM(ResetMinmax), - SYM(GetMinmax), - SYM(GetMinmaxParameterfv), - SYM(GetMinmaxParameteriv), - SYM(ConvolutionFilter1D), - SYM(ConvolutionFilter2D), - SYM(ConvolutionParameterf), - SYM(ConvolutionParameterfv), - SYM(ConvolutionParameteri), - SYM(ConvolutionParameteriv), - SYM(CopyConvolutionFilter1D), - SYM(CopyConvolutionFilter2D), - SYM(GetConvolutionFilter), - SYM(GetConvolutionParameterfv), - SYM(GetConvolutionParameteriv), - SYM(SeparableFilter2D), - SYM(GetSeparableFilter), - SYM(ActiveTexture), - SYM(ClientActiveTexture), - SYM(CompressedTexImage1D), - SYM(CompressedTexImage2D), - SYM(CompressedTexImage3D), - SYM(CompressedTexSubImage1D), - SYM(CompressedTexSubImage2D), - SYM(CompressedTexSubImage3D), - SYM(GetCompressedTexImage), - SYM(MultiTexCoord1d), - SYM(MultiTexCoord1dv), - SYM(MultiTexCoord1f), - SYM(MultiTexCoord1fv), - SYM(MultiTexCoord1i), - SYM(MultiTexCoord1iv), - SYM(MultiTexCoord1s), - SYM(MultiTexCoord1sv), - SYM(MultiTexCoord2d), - SYM(MultiTexCoord2dv), - SYM(MultiTexCoord2f), - SYM(MultiTexCoord2fv), - SYM(MultiTexCoord2i), - SYM(MultiTexCoord2iv), - SYM(MultiTexCoord2s), - SYM(MultiTexCoord2sv), - SYM(MultiTexCoord3d), - SYM(MultiTexCoord3dv), - SYM(MultiTexCoord3f), - SYM(MultiTexCoord3fv), - SYM(MultiTexCoord3i), - SYM(MultiTexCoord3iv), - SYM(MultiTexCoord3s), - SYM(MultiTexCoord3sv), - SYM(MultiTexCoord4d), - SYM(MultiTexCoord4dv), - SYM(MultiTexCoord4f), - SYM(MultiTexCoord4fv), - SYM(MultiTexCoord4i), - SYM(MultiTexCoord4iv), - SYM(MultiTexCoord4s), - SYM(MultiTexCoord4sv), - SYM(LoadTransposeMatrixd), - SYM(LoadTransposeMatrixf), - SYM(MultTransposeMatrixd), - SYM(MultTransposeMatrixf), - SYM(SampleCoverage), - SYM(ActiveTextureARB), - SYM(ClientActiveTextureARB), - SYM(MultiTexCoord1dARB), - SYM(MultiTexCoord1dvARB), - SYM(MultiTexCoord1fARB), - SYM(MultiTexCoord1fvARB), - SYM(MultiTexCoord1iARB), - SYM(MultiTexCoord1ivARB), - SYM(MultiTexCoord1sARB), - SYM(MultiTexCoord1svARB), - SYM(MultiTexCoord2dARB), - SYM(MultiTexCoord2dvARB), - SYM(MultiTexCoord2fARB), - SYM(MultiTexCoord2fvARB), - SYM(MultiTexCoord2iARB), - SYM(MultiTexCoord2ivARB), - SYM(MultiTexCoord2sARB), - SYM(MultiTexCoord2svARB), - SYM(MultiTexCoord3dARB), - SYM(MultiTexCoord3dvARB), - SYM(MultiTexCoord3fARB), - SYM(MultiTexCoord3fvARB), - SYM(MultiTexCoord3iARB), - SYM(MultiTexCoord3ivARB), - SYM(MultiTexCoord3sARB), - SYM(MultiTexCoord3svARB), - SYM(MultiTexCoord4dARB), - SYM(MultiTexCoord4dvARB), - SYM(MultiTexCoord4fARB), - SYM(MultiTexCoord4fvARB), - SYM(MultiTexCoord4iARB), - SYM(MultiTexCoord4ivARB), - SYM(MultiTexCoord4sARB), - SYM(MultiTexCoord4svARB), - SYM(EGLImageTargetTexture2DOES), - SYM(EGLImageTargetRenderbufferStorageOES), -#endif - + SYM(TexSubImage1D), + SYM(TexSubImage2D), + SYM(BindTexture), + SYM(DeleteTextures), + SYM(GenTextures), + SYM(IsTexture), SYM(DrawRangeElements), SYM(TexImage3D), SYM(TexSubImage3D), @@ -499,43 +102,6 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(CompressedTexSubImage2D), SYM(CompressedTexSubImage1D), SYM(GetCompressedTexImage), - SYM(ClientActiveTexture), - SYM(MultiTexCoord1d), - SYM(MultiTexCoord1dv), - SYM(MultiTexCoord1f), - SYM(MultiTexCoord1fv), - SYM(MultiTexCoord1i), - SYM(MultiTexCoord1iv), - SYM(MultiTexCoord1s), - SYM(MultiTexCoord1sv), - SYM(MultiTexCoord2d), - SYM(MultiTexCoord2dv), - SYM(MultiTexCoord2f), - SYM(MultiTexCoord2fv), - SYM(MultiTexCoord2i), - SYM(MultiTexCoord2iv), - SYM(MultiTexCoord2s), - SYM(MultiTexCoord2sv), - SYM(MultiTexCoord3d), - SYM(MultiTexCoord3dv), - SYM(MultiTexCoord3f), - SYM(MultiTexCoord3fv), - SYM(MultiTexCoord3i), - SYM(MultiTexCoord3iv), - SYM(MultiTexCoord3s), - SYM(MultiTexCoord3sv), - SYM(MultiTexCoord4d), - SYM(MultiTexCoord4dv), - SYM(MultiTexCoord4f), - SYM(MultiTexCoord4fv), - SYM(MultiTexCoord4i), - SYM(MultiTexCoord4iv), - SYM(MultiTexCoord4s), - SYM(MultiTexCoord4sv), - SYM(LoadTransposeMatrixf), - SYM(LoadTransposeMatrixd), - SYM(MultTransposeMatrixf), - SYM(MultTransposeMatrixd), SYM(BlendFuncSeparate), SYM(MultiDrawArrays), SYM(MultiDrawElements), @@ -543,44 +109,6 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(PointParameterfv), SYM(PointParameteri), SYM(PointParameteriv), - SYM(FogCoordf), - SYM(FogCoordfv), - SYM(FogCoordd), - SYM(FogCoorddv), - SYM(FogCoordPointer), - SYM(SecondaryColor3b), - SYM(SecondaryColor3bv), - SYM(SecondaryColor3d), - SYM(SecondaryColor3dv), - SYM(SecondaryColor3f), - SYM(SecondaryColor3fv), - SYM(SecondaryColor3i), - SYM(SecondaryColor3iv), - SYM(SecondaryColor3s), - SYM(SecondaryColor3sv), - SYM(SecondaryColor3ub), - SYM(SecondaryColor3ubv), - SYM(SecondaryColor3ui), - SYM(SecondaryColor3uiv), - SYM(SecondaryColor3us), - SYM(SecondaryColor3usv), - SYM(SecondaryColorPointer), - SYM(WindowPos2d), - SYM(WindowPos2dv), - SYM(WindowPos2f), - SYM(WindowPos2fv), - SYM(WindowPos2i), - SYM(WindowPos2iv), - SYM(WindowPos2s), - SYM(WindowPos2sv), - SYM(WindowPos3d), - SYM(WindowPos3dv), - SYM(WindowPos3f), - SYM(WindowPos3fv), - SYM(WindowPos3i), - SYM(WindowPos3iv), - SYM(WindowPos3s), - SYM(WindowPos3sv), SYM(BlendColor), SYM(BlendEquation), SYM(GenQueries), @@ -844,36 +372,6 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(VertexAttribP3uiv), SYM(VertexAttribP4ui), SYM(VertexAttribP4uiv), - SYM(VertexP2ui), - SYM(VertexP2uiv), - SYM(VertexP3ui), - SYM(VertexP3uiv), - SYM(VertexP4ui), - SYM(VertexP4uiv), - SYM(TexCoordP1ui), - SYM(TexCoordP1uiv), - SYM(TexCoordP2ui), - SYM(TexCoordP2uiv), - SYM(TexCoordP3ui), - SYM(TexCoordP3uiv), - SYM(TexCoordP4ui), - SYM(TexCoordP4uiv), - SYM(MultiTexCoordP1ui), - SYM(MultiTexCoordP1uiv), - SYM(MultiTexCoordP2ui), - SYM(MultiTexCoordP2uiv), - SYM(MultiTexCoordP3ui), - SYM(MultiTexCoordP3uiv), - SYM(MultiTexCoordP4ui), - SYM(MultiTexCoordP4uiv), - SYM(NormalP3ui), - SYM(NormalP3uiv), - SYM(ColorP3ui), - SYM(ColorP3uiv), - SYM(ColorP4ui), - SYM(ColorP4uiv), - SYM(SecondaryColorP3ui), - SYM(SecondaryColorP3uiv), SYM(MinSampleShading), SYM(BlendEquationi), SYM(BlendEquationSeparatei), @@ -1072,6 +570,121 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(BindSamplers), SYM(BindImageTextures), SYM(BindVertexBuffers), + SYM(ClipControl), + SYM(CreateTransformFeedbacks), + SYM(TransformFeedbackBufferBase), + SYM(TransformFeedbackBufferRange), + SYM(GetTransformFeedbackiv), + SYM(GetTransformFeedbacki_v), + SYM(GetTransformFeedbacki64_v), + SYM(CreateBuffers), + SYM(NamedBufferStorage), + SYM(NamedBufferData), + SYM(NamedBufferSubData), + SYM(CopyNamedBufferSubData), + SYM(ClearNamedBufferData), + SYM(ClearNamedBufferSubData), + SYM(MapNamedBuffer), + SYM(MapNamedBufferRange), + SYM(UnmapNamedBuffer), + SYM(FlushMappedNamedBufferRange), + SYM(GetNamedBufferParameteriv), + SYM(GetNamedBufferParameteri64v), + SYM(GetNamedBufferPointerv), + SYM(GetNamedBufferSubData), + SYM(CreateFramebuffers), + SYM(NamedFramebufferRenderbuffer), + SYM(NamedFramebufferParameteri), + SYM(NamedFramebufferTexture), + SYM(NamedFramebufferTextureLayer), + SYM(NamedFramebufferDrawBuffer), + SYM(NamedFramebufferDrawBuffers), + SYM(NamedFramebufferReadBuffer), + SYM(InvalidateNamedFramebufferData), + SYM(InvalidateNamedFramebufferSubData), + SYM(ClearNamedFramebufferiv), + SYM(ClearNamedFramebufferuiv), + SYM(ClearNamedFramebufferfv), + SYM(ClearNamedFramebufferfi), + SYM(BlitNamedFramebuffer), + SYM(CheckNamedFramebufferStatus), + SYM(GetNamedFramebufferParameteriv), + SYM(GetNamedFramebufferAttachmentParameteriv), + SYM(CreateRenderbuffers), + SYM(NamedRenderbufferStorage), + SYM(NamedRenderbufferStorageMultisample), + SYM(GetNamedRenderbufferParameteriv), + SYM(CreateTextures), + SYM(TextureBuffer), + SYM(TextureBufferRange), + SYM(TextureStorage1D), + SYM(TextureStorage2D), + SYM(TextureStorage3D), + SYM(TextureStorage2DMultisample), + SYM(TextureStorage3DMultisample), + SYM(TextureSubImage1D), + SYM(TextureSubImage2D), + SYM(TextureSubImage3D), + SYM(CompressedTextureSubImage1D), + SYM(CompressedTextureSubImage2D), + SYM(CompressedTextureSubImage3D), + SYM(CopyTextureSubImage1D), + SYM(CopyTextureSubImage2D), + SYM(CopyTextureSubImage3D), + SYM(TextureParameterf), + SYM(TextureParameterfv), + SYM(TextureParameteri), + SYM(TextureParameterIiv), + SYM(TextureParameterIuiv), + SYM(TextureParameteriv), + SYM(GenerateTextureMipmap), + SYM(BindTextureUnit), + SYM(GetTextureImage), + SYM(GetCompressedTextureImage), + SYM(GetTextureLevelParameterfv), + SYM(GetTextureLevelParameteriv), + SYM(GetTextureParameterfv), + SYM(GetTextureParameterIiv), + SYM(GetTextureParameterIuiv), + SYM(GetTextureParameteriv), + SYM(CreateVertexArrays), + SYM(DisableVertexArrayAttrib), + SYM(EnableVertexArrayAttrib), + SYM(VertexArrayElementBuffer), + SYM(VertexArrayVertexBuffer), + SYM(VertexArrayVertexBuffers), + SYM(VertexArrayAttribBinding), + SYM(VertexArrayAttribFormat), + SYM(VertexArrayAttribIFormat), + SYM(VertexArrayAttribLFormat), + SYM(VertexArrayBindingDivisor), + SYM(GetVertexArrayiv), + SYM(GetVertexArrayIndexediv), + SYM(GetVertexArrayIndexed64iv), + SYM(CreateSamplers), + SYM(CreateProgramPipelines), + SYM(CreateQueries), + SYM(GetQueryBufferObjecti64v), + SYM(GetQueryBufferObjectiv), + SYM(GetQueryBufferObjectui64v), + SYM(GetQueryBufferObjectuiv), + SYM(MemoryBarrierByRegion), + SYM(GetTextureSubImage), + SYM(GetCompressedTextureSubImage), + SYM(GetGraphicsResetStatus), + SYM(GetnCompressedTexImage), + SYM(GetnTexImage), + SYM(GetnUniformdv), + SYM(GetnUniformfv), + SYM(GetnUniformiv), + SYM(GetnUniformuiv), + SYM(ReadnPixels), + SYM(TextureBarrier), + SYM(SpecializeShader), + SYM(MultiDrawArraysIndirectCount), + SYM(MultiDrawElementsIndirectCount), + SYM(PolygonOffsetClamp), + SYM(PrimitiveBoundingBoxARB), SYM(GetTextureHandleARB), SYM(GetTextureSamplerHandleARB), SYM(MakeTextureHandleResidentARB), @@ -1088,128 +701,62 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(VertexAttribL1ui64ARB), SYM(VertexAttribL1ui64vARB), SYM(GetVertexAttribLui64vARB), - SYM(CreateSyncFromCLeventARB), - SYM(ClampColorARB), SYM(DispatchComputeGroupSizeARB), SYM(DebugMessageControlARB), SYM(DebugMessageInsertARB), SYM(DebugMessageCallbackARB), SYM(GetDebugMessageLogARB), - SYM(DrawBuffersARB), SYM(BlendEquationiARB), SYM(BlendEquationSeparateiARB), SYM(BlendFunciARB), SYM(BlendFuncSeparateiARB), SYM(DrawArraysInstancedARB), SYM(DrawElementsInstancedARB), - SYM(ProgramStringARB), - SYM(BindProgramARB), - SYM(DeleteProgramsARB), - SYM(GenProgramsARB), - SYM(ProgramEnvParameter4dARB), - SYM(ProgramEnvParameter4dvARB), - SYM(ProgramEnvParameter4fARB), - SYM(ProgramEnvParameter4fvARB), - SYM(ProgramLocalParameter4dARB), - SYM(ProgramLocalParameter4dvARB), - SYM(ProgramLocalParameter4fARB), - SYM(ProgramLocalParameter4fvARB), - SYM(GetProgramEnvParameterdvARB), - SYM(GetProgramEnvParameterfvARB), - SYM(GetProgramLocalParameterdvARB), - SYM(GetProgramLocalParameterfvARB), - SYM(GetProgramivARB), - SYM(GetProgramStringARB), - SYM(IsProgramARB), SYM(ProgramParameteriARB), SYM(FramebufferTextureARB), SYM(FramebufferTextureLayerARB), SYM(FramebufferTextureFaceARB), - SYM(ColorTable), - SYM(ColorTableParameterfv), - SYM(ColorTableParameteriv), - SYM(CopyColorTable), - SYM(GetColorTable), - SYM(GetColorTableParameterfv), - SYM(GetColorTableParameteriv), - SYM(ColorSubTable), - SYM(CopyColorSubTable), - SYM(ConvolutionFilter1D), - SYM(ConvolutionFilter2D), - SYM(ConvolutionParameterf), - SYM(ConvolutionParameterfv), - SYM(ConvolutionParameteri), - SYM(ConvolutionParameteriv), - SYM(CopyConvolutionFilter1D), - SYM(CopyConvolutionFilter2D), - SYM(GetConvolutionFilter), - SYM(GetConvolutionParameterfv), - SYM(GetConvolutionParameteriv), - SYM(GetSeparableFilter), - SYM(SeparableFilter2D), - SYM(GetHistogram), - SYM(GetHistogramParameterfv), - SYM(GetHistogramParameteriv), - SYM(GetMinmax), - SYM(GetMinmaxParameterfv), - SYM(GetMinmaxParameteriv), - SYM(Histogram), - SYM(Minmax), - SYM(ResetHistogram), - SYM(ResetMinmax), + SYM(SpecializeShaderARB), + SYM(Uniform1i64ARB), + SYM(Uniform2i64ARB), + SYM(Uniform3i64ARB), + SYM(Uniform4i64ARB), + SYM(Uniform1i64vARB), + SYM(Uniform2i64vARB), + SYM(Uniform3i64vARB), + SYM(Uniform4i64vARB), + SYM(Uniform1ui64ARB), + SYM(Uniform2ui64ARB), + SYM(Uniform3ui64ARB), + SYM(Uniform4ui64ARB), + SYM(Uniform1ui64vARB), + SYM(Uniform2ui64vARB), + SYM(Uniform3ui64vARB), + SYM(Uniform4ui64vARB), + SYM(GetUniformi64vARB), + SYM(GetUniformui64vARB), + SYM(GetnUniformi64vARB), + SYM(GetnUniformui64vARB), + SYM(ProgramUniform1i64ARB), + SYM(ProgramUniform2i64ARB), + SYM(ProgramUniform3i64ARB), + SYM(ProgramUniform4i64ARB), + SYM(ProgramUniform1i64vARB), + SYM(ProgramUniform2i64vARB), + SYM(ProgramUniform3i64vARB), + SYM(ProgramUniform4i64vARB), + SYM(ProgramUniform1ui64ARB), + SYM(ProgramUniform2ui64ARB), + SYM(ProgramUniform3ui64ARB), + SYM(ProgramUniform4ui64ARB), + SYM(ProgramUniform1ui64vARB), + SYM(ProgramUniform2ui64vARB), + SYM(ProgramUniform3ui64vARB), + SYM(ProgramUniform4ui64vARB), SYM(MultiDrawArraysIndirectCountARB), SYM(MultiDrawElementsIndirectCountARB), SYM(VertexAttribDivisorARB), - SYM(CurrentPaletteMatrixARB), - SYM(MatrixIndexubvARB), - SYM(MatrixIndexusvARB), - SYM(MatrixIndexuivARB), - SYM(MatrixIndexPointerARB), - SYM(SampleCoverageARB), - SYM(ActiveTextureARB), - SYM(ClientActiveTextureARB), - SYM(MultiTexCoord1dARB), - SYM(MultiTexCoord1dvARB), - SYM(MultiTexCoord1fARB), - SYM(MultiTexCoord1fvARB), - SYM(MultiTexCoord1iARB), - SYM(MultiTexCoord1ivARB), - SYM(MultiTexCoord1sARB), - SYM(MultiTexCoord1svARB), - SYM(MultiTexCoord2dARB), - SYM(MultiTexCoord2dvARB), - SYM(MultiTexCoord2fARB), - SYM(MultiTexCoord2fvARB), - SYM(MultiTexCoord2iARB), - SYM(MultiTexCoord2ivARB), - SYM(MultiTexCoord2sARB), - SYM(MultiTexCoord2svARB), - SYM(MultiTexCoord3dARB), - SYM(MultiTexCoord3dvARB), - SYM(MultiTexCoord3fARB), - SYM(MultiTexCoord3fvARB), - SYM(MultiTexCoord3iARB), - SYM(MultiTexCoord3ivARB), - SYM(MultiTexCoord3sARB), - SYM(MultiTexCoord3svARB), - SYM(MultiTexCoord4dARB), - SYM(MultiTexCoord4dvARB), - SYM(MultiTexCoord4fARB), - SYM(MultiTexCoord4fvARB), - SYM(MultiTexCoord4iARB), - SYM(MultiTexCoord4ivARB), - SYM(MultiTexCoord4sARB), - SYM(MultiTexCoord4svARB), - SYM(GenQueriesARB), - SYM(DeleteQueriesARB), - SYM(IsQueryARB), - SYM(BeginQueryARB), - SYM(EndQueryARB), - SYM(GetQueryivARB), - SYM(GetQueryObjectivARB), - SYM(GetQueryObjectuivARB), - SYM(PointParameterfARB), - SYM(PointParameterfvARB), + SYM(MaxShaderCompilerThreadsARB), SYM(GetGraphicsResetStatusARB), SYM(GetnTexImageARB), SYM(ReadnPixelsARB), @@ -1218,302 +765,575 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(GetnUniformivARB), SYM(GetnUniformuivARB), SYM(GetnUniformdvARB), - SYM(GetnMapdvARB), - SYM(GetnMapfvARB), - SYM(GetnMapivARB), - SYM(GetnPixelMapfvARB), - SYM(GetnPixelMapuivARB), - SYM(GetnPixelMapusvARB), - SYM(GetnPolygonStippleARB), - SYM(GetnColorTableARB), - SYM(GetnConvolutionFilterARB), - SYM(GetnSeparableFilterARB), - SYM(GetnHistogramARB), - SYM(GetnMinmaxARB), + SYM(FramebufferSampleLocationsfvARB), + SYM(NamedFramebufferSampleLocationsfvARB), + SYM(EvaluateDepthValuesARB), SYM(MinSampleShadingARB), - SYM(DeleteObjectARB), - SYM(GetHandleARB), - SYM(DetachObjectARB), - SYM(CreateShaderObjectARB), - SYM(ShaderSourceARB), - SYM(CompileShaderARB), - SYM(CreateProgramObjectARB), - SYM(AttachObjectARB), - SYM(LinkProgramARB), - SYM(UseProgramObjectARB), - SYM(ValidateProgramARB), - SYM(Uniform1fARB), - SYM(Uniform2fARB), - SYM(Uniform3fARB), - SYM(Uniform4fARB), - SYM(Uniform1iARB), - SYM(Uniform2iARB), - SYM(Uniform3iARB), - SYM(Uniform4iARB), - SYM(Uniform1fvARB), - SYM(Uniform2fvARB), - SYM(Uniform3fvARB), - SYM(Uniform4fvARB), - SYM(Uniform1ivARB), - SYM(Uniform2ivARB), - SYM(Uniform3ivARB), - SYM(Uniform4ivARB), - SYM(UniformMatrix2fvARB), - SYM(UniformMatrix3fvARB), - SYM(UniformMatrix4fvARB), - SYM(GetObjectParameterfvARB), - SYM(GetObjectParameterivARB), - SYM(GetInfoLogARB), - SYM(GetAttachedObjectsARB), - SYM(GetUniformLocationARB), - SYM(GetActiveUniformARB), - SYM(GetUniformfvARB), - SYM(GetUniformivARB), - SYM(GetShaderSourceARB), SYM(NamedStringARB), SYM(DeleteNamedStringARB), SYM(CompileShaderIncludeARB), SYM(IsNamedStringARB), SYM(GetNamedStringARB), SYM(GetNamedStringivARB), + SYM(BufferPageCommitmentARB), + SYM(NamedBufferPageCommitmentEXT), + SYM(NamedBufferPageCommitmentARB), SYM(TexPageCommitmentARB), SYM(TexBufferARB), - SYM(CompressedTexImage3DARB), - SYM(CompressedTexImage2DARB), - SYM(CompressedTexImage1DARB), - SYM(CompressedTexSubImage3DARB), - SYM(CompressedTexSubImage2DARB), - SYM(CompressedTexSubImage1DARB), - SYM(GetCompressedTexImageARB), - SYM(LoadTransposeMatrixfARB), - SYM(LoadTransposeMatrixdARB), - SYM(MultTransposeMatrixfARB), - SYM(MultTransposeMatrixdARB), - SYM(WeightbvARB), - SYM(WeightsvARB), - SYM(WeightivARB), - SYM(WeightfvARB), - SYM(WeightdvARB), - SYM(WeightubvARB), - SYM(WeightusvARB), - SYM(WeightuivARB), - SYM(WeightPointerARB), - SYM(VertexBlendARB), - SYM(BindBufferARB), - SYM(DeleteBuffersARB), - SYM(GenBuffersARB), - SYM(IsBufferARB), - SYM(BufferDataARB), - SYM(BufferSubDataARB), - SYM(GetBufferSubDataARB), - SYM(MapBufferARB), - SYM(UnmapBufferARB), - SYM(GetBufferParameterivARB), - SYM(GetBufferPointervARB), - SYM(VertexAttrib1dARB), - SYM(VertexAttrib1dvARB), - SYM(VertexAttrib1fARB), - SYM(VertexAttrib1fvARB), - SYM(VertexAttrib1sARB), - SYM(VertexAttrib1svARB), - SYM(VertexAttrib2dARB), - SYM(VertexAttrib2dvARB), - SYM(VertexAttrib2fARB), - SYM(VertexAttrib2fvARB), - SYM(VertexAttrib2sARB), - SYM(VertexAttrib2svARB), - SYM(VertexAttrib3dARB), - SYM(VertexAttrib3dvARB), - SYM(VertexAttrib3fARB), - SYM(VertexAttrib3fvARB), - SYM(VertexAttrib3sARB), - SYM(VertexAttrib3svARB), - SYM(VertexAttrib4NbvARB), - SYM(VertexAttrib4NivARB), - SYM(VertexAttrib4NsvARB), - SYM(VertexAttrib4NubARB), - SYM(VertexAttrib4NubvARB), - SYM(VertexAttrib4NuivARB), - SYM(VertexAttrib4NusvARB), - SYM(VertexAttrib4bvARB), - SYM(VertexAttrib4dARB), - SYM(VertexAttrib4dvARB), - SYM(VertexAttrib4fARB), - SYM(VertexAttrib4fvARB), - SYM(VertexAttrib4ivARB), - SYM(VertexAttrib4sARB), - SYM(VertexAttrib4svARB), - SYM(VertexAttrib4ubvARB), - SYM(VertexAttrib4uivARB), - SYM(VertexAttrib4usvARB), - SYM(VertexAttribPointerARB), - SYM(EnableVertexAttribArrayARB), - SYM(DisableVertexAttribArrayARB), - SYM(GetVertexAttribdvARB), - SYM(GetVertexAttribfvARB), - SYM(GetVertexAttribivARB), - SYM(GetVertexAttribPointervARB), - SYM(BindAttribLocationARB), - SYM(GetActiveAttribARB), - SYM(GetAttribLocationARB), - SYM(WindowPos2dARB), - SYM(WindowPos2dvARB), - SYM(WindowPos2fARB), - SYM(WindowPos2fvARB), - SYM(WindowPos2iARB), - SYM(WindowPos2ivARB), - SYM(WindowPos2sARB), - SYM(WindowPos2svARB), - SYM(WindowPos3dARB), - SYM(WindowPos3dvARB), - SYM(WindowPos3fARB), - SYM(WindowPos3fvARB), - SYM(WindowPos3iARB), - SYM(WindowPos3ivARB), - SYM(WindowPos3sARB), - SYM(WindowPos3svARB), - SYM(MultiTexCoord1bOES), - SYM(MultiTexCoord1bvOES), - SYM(MultiTexCoord2bOES), - SYM(MultiTexCoord2bvOES), - SYM(MultiTexCoord3bOES), - SYM(MultiTexCoord3bvOES), - SYM(MultiTexCoord4bOES), - SYM(MultiTexCoord4bvOES), - SYM(TexCoord1bOES), - SYM(TexCoord1bvOES), - SYM(TexCoord2bOES), - SYM(TexCoord2bvOES), - SYM(TexCoord3bOES), - SYM(TexCoord3bvOES), - SYM(TexCoord4bOES), - SYM(TexCoord4bvOES), - SYM(Vertex2bOES), - SYM(Vertex2bvOES), - SYM(Vertex3bOES), - SYM(Vertex3bvOES), - SYM(Vertex4bOES), - SYM(Vertex4bvOES), - SYM(AlphaFuncxOES), - SYM(ClearColorxOES), - SYM(ClearDepthxOES), - SYM(ClipPlanexOES), - SYM(Color4xOES), - SYM(DepthRangexOES), - SYM(FogxOES), - SYM(FogxvOES), - SYM(FrustumxOES), - SYM(GetClipPlanexOES), - SYM(GetFixedvOES), - SYM(GetTexEnvxvOES), - SYM(GetTexParameterxvOES), - SYM(LightModelxOES), - SYM(LightModelxvOES), - SYM(LightxOES), - SYM(LightxvOES), - SYM(LineWidthxOES), - SYM(LoadMatrixxOES), - SYM(MaterialxOES), - SYM(MaterialxvOES), - SYM(MultMatrixxOES), - SYM(MultiTexCoord4xOES), - SYM(Normal3xOES), - SYM(OrthoxOES), - SYM(PointParameterxvOES), - SYM(PointSizexOES), - SYM(PolygonOffsetxOES), - SYM(RotatexOES), - SYM(SampleCoverageOES), - SYM(ScalexOES), - SYM(TexEnvxOES), - SYM(TexEnvxvOES), - SYM(TexParameterxOES), - SYM(TexParameterxvOES), - SYM(TranslatexOES), - SYM(AccumxOES), - SYM(BitmapxOES), - SYM(BlendColorxOES), - SYM(ClearAccumxOES), - SYM(Color3xOES), - SYM(Color3xvOES), - SYM(Color4xvOES), - SYM(ConvolutionParameterxOES), - SYM(ConvolutionParameterxvOES), - SYM(EvalCoord1xOES), - SYM(EvalCoord1xvOES), - SYM(EvalCoord2xOES), - SYM(EvalCoord2xvOES), - SYM(FeedbackBufferxOES), - SYM(GetConvolutionParameterxvOES), - SYM(GetHistogramParameterxvOES), - SYM(GetLightxOES), - SYM(GetMapxvOES), - SYM(GetMaterialxOES), - SYM(GetPixelMapxv), - SYM(GetTexGenxvOES), - SYM(GetTexLevelParameterxvOES), - SYM(IndexxOES), - SYM(IndexxvOES), - SYM(LoadTransposeMatrixxOES), - SYM(Map1xOES), - SYM(Map2xOES), - SYM(MapGrid1xOES), - SYM(MapGrid2xOES), - SYM(MultTransposeMatrixxOES), - SYM(MultiTexCoord1xOES), - SYM(MultiTexCoord1xvOES), - SYM(MultiTexCoord2xOES), - SYM(MultiTexCoord2xvOES), - SYM(MultiTexCoord3xOES), - SYM(MultiTexCoord3xvOES), - SYM(MultiTexCoord4xvOES), - SYM(Normal3xvOES), - SYM(PassThroughxOES), - SYM(PixelMapx), - SYM(PixelStorex), - SYM(PixelTransferxOES), - SYM(PixelZoomxOES), - SYM(PrioritizeTexturesxOES), - SYM(RasterPos2xOES), - SYM(RasterPos2xvOES), - SYM(RasterPos3xOES), - SYM(RasterPos3xvOES), - SYM(RasterPos4xOES), - SYM(RasterPos4xvOES), - SYM(RectxOES), - SYM(RectxvOES), - SYM(TexCoord1xOES), - SYM(TexCoord1xvOES), - SYM(TexCoord2xOES), - SYM(TexCoord2xvOES), - SYM(TexCoord3xOES), - SYM(TexCoord3xvOES), - SYM(TexCoord4xOES), - SYM(TexCoord4xvOES), - SYM(TexGenxOES), - SYM(TexGenxvOES), - SYM(Vertex2xOES), - SYM(Vertex2xvOES), - SYM(Vertex3xOES), - SYM(Vertex3xvOES), - SYM(Vertex4xOES), - SYM(Vertex4xvOES), - SYM(QueryMatrixxOES), - SYM(ClearDepthfOES), - SYM(ClipPlanefOES), - SYM(DepthRangefOES), - SYM(FrustumfOES), - SYM(GetClipPlanefOES), - SYM(OrthofOES), - SYM(ImageTransformParameteriHP), - SYM(ImageTransformParameterfHP), - SYM(ImageTransformParameterivHP), - SYM(ImageTransformParameterfvHP), - SYM(GetImageTransformParameterivHP), - SYM(GetImageTransformParameterfvHP), + SYM(BlendBarrierKHR), + SYM(MaxShaderCompilerThreadsKHR), + SYM(EGLImageTargetTexStorageEXT), + SYM(EGLImageTargetTextureStorageEXT), + SYM(LabelObjectEXT), + SYM(GetObjectLabelEXT), + SYM(InsertEventMarkerEXT), + SYM(PushGroupMarkerEXT), + SYM(PopGroupMarkerEXT), + SYM(MatrixLoadfEXT), + SYM(MatrixLoaddEXT), + SYM(MatrixMultfEXT), + SYM(MatrixMultdEXT), + SYM(MatrixLoadIdentityEXT), + SYM(MatrixRotatefEXT), + SYM(MatrixRotatedEXT), + SYM(MatrixScalefEXT), + SYM(MatrixScaledEXT), + SYM(MatrixTranslatefEXT), + SYM(MatrixTranslatedEXT), + SYM(MatrixFrustumEXT), + SYM(MatrixOrthoEXT), + SYM(MatrixPopEXT), + SYM(MatrixPushEXT), + SYM(ClientAttribDefaultEXT), + SYM(PushClientAttribDefaultEXT), + SYM(TextureParameterfEXT), + SYM(TextureParameterfvEXT), + SYM(TextureParameteriEXT), + SYM(TextureParameterivEXT), + SYM(TextureImage1DEXT), + SYM(TextureImage2DEXT), + SYM(TextureSubImage1DEXT), + SYM(TextureSubImage2DEXT), + SYM(CopyTextureImage1DEXT), + SYM(CopyTextureImage2DEXT), + SYM(CopyTextureSubImage1DEXT), + SYM(CopyTextureSubImage2DEXT), + SYM(GetTextureImageEXT), + SYM(GetTextureParameterfvEXT), + SYM(GetTextureParameterivEXT), + SYM(GetTextureLevelParameterfvEXT), + SYM(GetTextureLevelParameterivEXT), + SYM(TextureImage3DEXT), + SYM(TextureSubImage3DEXT), + SYM(CopyTextureSubImage3DEXT), + SYM(BindMultiTextureEXT), + SYM(MultiTexCoordPointerEXT), + SYM(MultiTexEnvfEXT), + SYM(MultiTexEnvfvEXT), + SYM(MultiTexEnviEXT), + SYM(MultiTexEnvivEXT), + SYM(MultiTexGendEXT), + SYM(MultiTexGendvEXT), + SYM(MultiTexGenfEXT), + SYM(MultiTexGenfvEXT), + SYM(MultiTexGeniEXT), + SYM(MultiTexGenivEXT), + SYM(GetMultiTexEnvfvEXT), + SYM(GetMultiTexEnvivEXT), + SYM(GetMultiTexGendvEXT), + SYM(GetMultiTexGenfvEXT), + SYM(GetMultiTexGenivEXT), + SYM(MultiTexParameteriEXT), + SYM(MultiTexParameterivEXT), + SYM(MultiTexParameterfEXT), + SYM(MultiTexParameterfvEXT), + SYM(MultiTexImage1DEXT), + SYM(MultiTexImage2DEXT), + SYM(MultiTexSubImage1DEXT), + SYM(MultiTexSubImage2DEXT), + SYM(CopyMultiTexImage1DEXT), + SYM(CopyMultiTexImage2DEXT), + SYM(CopyMultiTexSubImage1DEXT), + SYM(CopyMultiTexSubImage2DEXT), + SYM(GetMultiTexImageEXT), + SYM(GetMultiTexParameterfvEXT), + SYM(GetMultiTexParameterivEXT), + SYM(GetMultiTexLevelParameterfvEXT), + SYM(GetMultiTexLevelParameterivEXT), + SYM(MultiTexImage3DEXT), + SYM(MultiTexSubImage3DEXT), + SYM(CopyMultiTexSubImage3DEXT), + SYM(EnableClientStateIndexedEXT), + SYM(DisableClientStateIndexedEXT), + SYM(GetFloatIndexedvEXT), + SYM(GetDoubleIndexedvEXT), + SYM(GetPointerIndexedvEXT), + SYM(EnableIndexedEXT), + SYM(DisableIndexedEXT), + SYM(IsEnabledIndexedEXT), + SYM(GetIntegerIndexedvEXT), + SYM(GetBooleanIndexedvEXT), + SYM(CompressedTextureImage3DEXT), + SYM(CompressedTextureImage2DEXT), + SYM(CompressedTextureImage1DEXT), + SYM(CompressedTextureSubImage3DEXT), + SYM(CompressedTextureSubImage2DEXT), + SYM(CompressedTextureSubImage1DEXT), + SYM(GetCompressedTextureImageEXT), + SYM(CompressedMultiTexImage3DEXT), + SYM(CompressedMultiTexImage2DEXT), + SYM(CompressedMultiTexImage1DEXT), + SYM(CompressedMultiTexSubImage3DEXT), + SYM(CompressedMultiTexSubImage2DEXT), + SYM(CompressedMultiTexSubImage1DEXT), + SYM(GetCompressedMultiTexImageEXT), + SYM(MatrixLoadTransposefEXT), + SYM(MatrixLoadTransposedEXT), + SYM(MatrixMultTransposefEXT), + SYM(MatrixMultTransposedEXT), + SYM(NamedBufferDataEXT), + SYM(NamedBufferSubDataEXT), + SYM(MapNamedBufferEXT), + SYM(UnmapNamedBufferEXT), + SYM(GetNamedBufferParameterivEXT), + SYM(GetNamedBufferPointervEXT), + SYM(GetNamedBufferSubDataEXT), + SYM(ProgramUniform1fEXT), + SYM(ProgramUniform2fEXT), + SYM(ProgramUniform3fEXT), + SYM(ProgramUniform4fEXT), + SYM(ProgramUniform1iEXT), + SYM(ProgramUniform2iEXT), + SYM(ProgramUniform3iEXT), + SYM(ProgramUniform4iEXT), + SYM(ProgramUniform1fvEXT), + SYM(ProgramUniform2fvEXT), + SYM(ProgramUniform3fvEXT), + SYM(ProgramUniform4fvEXT), + SYM(ProgramUniform1ivEXT), + SYM(ProgramUniform2ivEXT), + SYM(ProgramUniform3ivEXT), + SYM(ProgramUniform4ivEXT), + SYM(ProgramUniformMatrix2fvEXT), + SYM(ProgramUniformMatrix3fvEXT), + SYM(ProgramUniformMatrix4fvEXT), + SYM(ProgramUniformMatrix2x3fvEXT), + SYM(ProgramUniformMatrix3x2fvEXT), + SYM(ProgramUniformMatrix2x4fvEXT), + SYM(ProgramUniformMatrix4x2fvEXT), + SYM(ProgramUniformMatrix3x4fvEXT), + SYM(ProgramUniformMatrix4x3fvEXT), + SYM(TextureBufferEXT), + SYM(MultiTexBufferEXT), + SYM(TextureParameterIivEXT), + SYM(TextureParameterIuivEXT), + SYM(GetTextureParameterIivEXT), + SYM(GetTextureParameterIuivEXT), + SYM(MultiTexParameterIivEXT), + SYM(MultiTexParameterIuivEXT), + SYM(GetMultiTexParameterIivEXT), + SYM(GetMultiTexParameterIuivEXT), + SYM(ProgramUniform1uiEXT), + SYM(ProgramUniform2uiEXT), + SYM(ProgramUniform3uiEXT), + SYM(ProgramUniform4uiEXT), + SYM(ProgramUniform1uivEXT), + SYM(ProgramUniform2uivEXT), + SYM(ProgramUniform3uivEXT), + SYM(ProgramUniform4uivEXT), + SYM(NamedProgramLocalParameters4fvEXT), + SYM(NamedProgramLocalParameterI4iEXT), + SYM(NamedProgramLocalParameterI4ivEXT), + SYM(NamedProgramLocalParametersI4ivEXT), + SYM(NamedProgramLocalParameterI4uiEXT), + SYM(NamedProgramLocalParameterI4uivEXT), + SYM(NamedProgramLocalParametersI4uivEXT), + SYM(GetNamedProgramLocalParameterIivEXT), + SYM(GetNamedProgramLocalParameterIuivEXT), + SYM(EnableClientStateiEXT), + SYM(DisableClientStateiEXT), + SYM(GetFloati_vEXT), + SYM(GetDoublei_vEXT), + SYM(GetPointeri_vEXT), + SYM(NamedProgramStringEXT), + SYM(NamedProgramLocalParameter4dEXT), + SYM(NamedProgramLocalParameter4dvEXT), + SYM(NamedProgramLocalParameter4fEXT), + SYM(NamedProgramLocalParameter4fvEXT), + SYM(GetNamedProgramLocalParameterdvEXT), + SYM(GetNamedProgramLocalParameterfvEXT), + SYM(GetNamedProgramivEXT), + SYM(GetNamedProgramStringEXT), + SYM(NamedRenderbufferStorageEXT), + SYM(GetNamedRenderbufferParameterivEXT), + SYM(NamedRenderbufferStorageMultisampleEXT), + SYM(NamedRenderbufferStorageMultisampleCoverageEXT), + SYM(CheckNamedFramebufferStatusEXT), + SYM(NamedFramebufferTexture1DEXT), + SYM(NamedFramebufferTexture2DEXT), + SYM(NamedFramebufferTexture3DEXT), + SYM(NamedFramebufferRenderbufferEXT), + SYM(GetNamedFramebufferAttachmentParameterivEXT), + SYM(GenerateTextureMipmapEXT), + SYM(GenerateMultiTexMipmapEXT), + SYM(FramebufferDrawBufferEXT), + SYM(FramebufferDrawBuffersEXT), + SYM(FramebufferReadBufferEXT), + SYM(GetFramebufferParameterivEXT), + SYM(NamedCopyBufferSubDataEXT), + SYM(NamedFramebufferTextureEXT), + SYM(NamedFramebufferTextureLayerEXT), + SYM(NamedFramebufferTextureFaceEXT), + SYM(TextureRenderbufferEXT), + SYM(MultiTexRenderbufferEXT), + SYM(VertexArrayVertexOffsetEXT), + SYM(VertexArrayColorOffsetEXT), + SYM(VertexArrayEdgeFlagOffsetEXT), + SYM(VertexArrayIndexOffsetEXT), + SYM(VertexArrayNormalOffsetEXT), + SYM(VertexArrayTexCoordOffsetEXT), + SYM(VertexArrayMultiTexCoordOffsetEXT), + SYM(VertexArrayFogCoordOffsetEXT), + SYM(VertexArraySecondaryColorOffsetEXT), + SYM(VertexArrayVertexAttribOffsetEXT), + SYM(VertexArrayVertexAttribIOffsetEXT), + SYM(EnableVertexArrayEXT), + SYM(DisableVertexArrayEXT), + SYM(EnableVertexArrayAttribEXT), + SYM(DisableVertexArrayAttribEXT), + SYM(GetVertexArrayIntegervEXT), + SYM(GetVertexArrayPointervEXT), + SYM(GetVertexArrayIntegeri_vEXT), + SYM(GetVertexArrayPointeri_vEXT), + SYM(MapNamedBufferRangeEXT), + SYM(FlushMappedNamedBufferRangeEXT), + SYM(NamedBufferStorageEXT), + SYM(ClearNamedBufferDataEXT), + SYM(ClearNamedBufferSubDataEXT), + SYM(NamedFramebufferParameteriEXT), + SYM(GetNamedFramebufferParameterivEXT), + SYM(ProgramUniform1dEXT), + SYM(ProgramUniform2dEXT), + SYM(ProgramUniform3dEXT), + SYM(ProgramUniform4dEXT), + SYM(ProgramUniform1dvEXT), + SYM(ProgramUniform2dvEXT), + SYM(ProgramUniform3dvEXT), + SYM(ProgramUniform4dvEXT), + SYM(ProgramUniformMatrix2dvEXT), + SYM(ProgramUniformMatrix3dvEXT), + SYM(ProgramUniformMatrix4dvEXT), + SYM(ProgramUniformMatrix2x3dvEXT), + SYM(ProgramUniformMatrix2x4dvEXT), + SYM(ProgramUniformMatrix3x2dvEXT), + SYM(ProgramUniformMatrix3x4dvEXT), + SYM(ProgramUniformMatrix4x2dvEXT), + SYM(ProgramUniformMatrix4x3dvEXT), + SYM(TextureBufferRangeEXT), + SYM(TextureStorage1DEXT), + SYM(TextureStorage2DEXT), + SYM(TextureStorage3DEXT), + SYM(TextureStorage2DMultisampleEXT), + SYM(TextureStorage3DMultisampleEXT), + SYM(VertexArrayBindVertexBufferEXT), + SYM(VertexArrayVertexAttribFormatEXT), + SYM(VertexArrayVertexAttribIFormatEXT), + SYM(VertexArrayVertexAttribLFormatEXT), + SYM(VertexArrayVertexAttribBindingEXT), + SYM(VertexArrayVertexBindingDivisorEXT), + SYM(VertexArrayVertexAttribLOffsetEXT), + SYM(TexturePageCommitmentEXT), + SYM(VertexArrayVertexAttribDivisorEXT), + SYM(DrawArraysInstancedEXT), + SYM(DrawElementsInstancedEXT), + SYM(PolygonOffsetClampEXT), + SYM(RasterSamplesEXT), + SYM(UseShaderProgramEXT), + SYM(ActiveProgramEXT), + SYM(CreateShaderProgramEXT), + SYM(FramebufferFetchBarrierEXT), + SYM(WindowRectanglesEXT), + SYM(MultiDrawArraysIndirectBindlessNV), + SYM(MultiDrawElementsIndirectBindlessNV), + SYM(MultiDrawArraysIndirectBindlessCountNV), + SYM(MultiDrawElementsIndirectBindlessCountNV), + SYM(GetTextureHandleNV), + SYM(GetTextureSamplerHandleNV), + SYM(MakeTextureHandleResidentNV), + SYM(MakeTextureHandleNonResidentNV), + SYM(GetImageHandleNV), + SYM(MakeImageHandleResidentNV), + SYM(MakeImageHandleNonResidentNV), + SYM(UniformHandleui64NV), + SYM(UniformHandleui64vNV), + SYM(ProgramUniformHandleui64NV), + SYM(ProgramUniformHandleui64vNV), + SYM(IsTextureHandleResidentNV), + SYM(IsImageHandleResidentNV), + SYM(BlendParameteriNV), + SYM(BlendBarrierNV), + SYM(ViewportPositionWScaleNV), + SYM(CreateStatesNV), + SYM(DeleteStatesNV), + SYM(IsStateNV), + SYM(StateCaptureNV), + SYM(GetCommandHeaderNV), + SYM(GetStageIndexNV), + SYM(DrawCommandsNV), + SYM(DrawCommandsAddressNV), + SYM(DrawCommandsStatesNV), + SYM(DrawCommandsStatesAddressNV), + SYM(CreateCommandListsNV), + SYM(DeleteCommandListsNV), + SYM(IsCommandListNV), + SYM(ListDrawCommandsStatesClientNV), + SYM(CommandListSegmentsNV), + SYM(CompileCommandListNV), + SYM(CallCommandListNV), + SYM(BeginConditionalRenderNV), + SYM(EndConditionalRenderNV), + SYM(SubpixelPrecisionBiasNV), + SYM(ConservativeRasterParameterfNV), + SYM(ConservativeRasterParameteriNV), + SYM(DrawVkImageNV), + SYM(WaitVkSemaphoreNV), + SYM(SignalVkSemaphoreNV), + SYM(SignalVkFenceNV), + SYM(FragmentCoverageColorNV), + SYM(CoverageModulationTableNV), + SYM(GetCoverageModulationTableNV), + SYM(CoverageModulationNV), + SYM(RenderbufferStorageMultisampleCoverageNV), + SYM(Uniform1i64NV), + SYM(Uniform2i64NV), + SYM(Uniform3i64NV), + SYM(Uniform4i64NV), + SYM(Uniform1i64vNV), + SYM(Uniform2i64vNV), + SYM(Uniform3i64vNV), + SYM(Uniform4i64vNV), + SYM(Uniform1ui64NV), + SYM(Uniform2ui64NV), + SYM(Uniform3ui64NV), + SYM(Uniform4ui64NV), + SYM(Uniform1ui64vNV), + SYM(Uniform2ui64vNV), + SYM(Uniform3ui64vNV), + SYM(Uniform4ui64vNV), + SYM(GetUniformi64vNV), + SYM(ProgramUniform1i64NV), + SYM(ProgramUniform2i64NV), + SYM(ProgramUniform3i64NV), + SYM(ProgramUniform4i64NV), + SYM(ProgramUniform1i64vNV), + SYM(ProgramUniform2i64vNV), + SYM(ProgramUniform3i64vNV), + SYM(ProgramUniform4i64vNV), + SYM(ProgramUniform1ui64NV), + SYM(ProgramUniform2ui64NV), + SYM(ProgramUniform3ui64NV), + SYM(ProgramUniform4ui64NV), + SYM(ProgramUniform1ui64vNV), + SYM(ProgramUniform2ui64vNV), + SYM(ProgramUniform3ui64vNV), + SYM(ProgramUniform4ui64vNV), + SYM(GetInternalformatSampleivNV), + SYM(GetMemoryObjectDetachedResourcesuivNV), + SYM(ResetMemoryObjectParameterNV), + SYM(TexAttachMemoryNV), + SYM(BufferAttachMemoryNV), + SYM(TextureAttachMemoryNV), + SYM(NamedBufferAttachMemoryNV), + SYM(DrawMeshTasksNV), + SYM(DrawMeshTasksIndirectNV), + SYM(MultiDrawMeshTasksIndirectNV), + SYM(MultiDrawMeshTasksIndirectCountNV), + SYM(GenPathsNV), + SYM(DeletePathsNV), + SYM(IsPathNV), + SYM(PathCommandsNV), + SYM(PathCoordsNV), + SYM(PathSubCommandsNV), + SYM(PathSubCoordsNV), + SYM(PathStringNV), + SYM(PathGlyphsNV), + SYM(PathGlyphRangeNV), + SYM(WeightPathsNV), + SYM(CopyPathNV), + SYM(InterpolatePathsNV), + SYM(TransformPathNV), + SYM(PathParameterivNV), + SYM(PathParameteriNV), + SYM(PathParameterfvNV), + SYM(PathParameterfNV), + SYM(PathDashArrayNV), + SYM(PathStencilFuncNV), + SYM(PathStencilDepthOffsetNV), + SYM(StencilFillPathNV), + SYM(StencilStrokePathNV), + SYM(StencilFillPathInstancedNV), + SYM(StencilStrokePathInstancedNV), + SYM(PathCoverDepthFuncNV), + SYM(CoverFillPathNV), + SYM(CoverStrokePathNV), + SYM(CoverFillPathInstancedNV), + SYM(CoverStrokePathInstancedNV), + SYM(GetPathParameterivNV), + SYM(GetPathParameterfvNV), + SYM(GetPathCommandsNV), + SYM(GetPathCoordsNV), + SYM(GetPathDashArrayNV), + SYM(GetPathMetricsNV), + SYM(GetPathMetricRangeNV), + SYM(GetPathSpacingNV), + SYM(IsPointInFillPathNV), + SYM(IsPointInStrokePathNV), + SYM(GetPathLengthNV), + SYM(PointAlongPathNV), + SYM(MatrixLoad3x2fNV), + SYM(MatrixLoad3x3fNV), + SYM(MatrixLoadTranspose3x3fNV), + SYM(MatrixMult3x2fNV), + SYM(MatrixMult3x3fNV), + SYM(MatrixMultTranspose3x3fNV), + SYM(StencilThenCoverFillPathNV), + SYM(StencilThenCoverStrokePathNV), + SYM(StencilThenCoverFillPathInstancedNV), + SYM(StencilThenCoverStrokePathInstancedNV), + SYM(PathGlyphIndexRangeNV), + SYM(PathGlyphIndexArrayNV), + SYM(PathMemoryGlyphIndexArrayNV), + SYM(ProgramPathFragmentInputGenNV), + SYM(GetProgramResourcefvNV), + SYM(FramebufferSampleLocationsfvNV), + SYM(NamedFramebufferSampleLocationsfvNV), + SYM(ResolveDepthValuesNV), + SYM(ScissorExclusiveNV), + SYM(ScissorExclusiveArrayvNV), + SYM(MakeBufferResidentNV), + SYM(MakeBufferNonResidentNV), + SYM(IsBufferResidentNV), + SYM(MakeNamedBufferResidentNV), + SYM(MakeNamedBufferNonResidentNV), + SYM(IsNamedBufferResidentNV), + SYM(GetBufferParameterui64vNV), + SYM(GetNamedBufferParameterui64vNV), + SYM(GetIntegerui64vNV), + SYM(Uniformui64NV), + SYM(Uniformui64vNV), + SYM(GetUniformui64vNV), + SYM(ProgramUniformui64NV), + SYM(ProgramUniformui64vNV), + SYM(BindShadingRateImageNV), + SYM(GetShadingRateImagePaletteNV), + SYM(GetShadingRateSampleLocationivNV), + SYM(ShadingRateImageBarrierNV), + SYM(ShadingRateImagePaletteNV), + SYM(ShadingRateSampleOrderNV), + SYM(ShadingRateSampleOrderCustomNV), + SYM(TextureBarrierNV), + SYM(VertexAttribL1i64NV), + SYM(VertexAttribL2i64NV), + SYM(VertexAttribL3i64NV), + SYM(VertexAttribL4i64NV), + SYM(VertexAttribL1i64vNV), + SYM(VertexAttribL2i64vNV), + SYM(VertexAttribL3i64vNV), + SYM(VertexAttribL4i64vNV), + SYM(VertexAttribL1ui64NV), + SYM(VertexAttribL2ui64NV), + SYM(VertexAttribL3ui64NV), + SYM(VertexAttribL4ui64NV), + SYM(VertexAttribL1ui64vNV), + SYM(VertexAttribL2ui64vNV), + SYM(VertexAttribL3ui64vNV), + SYM(VertexAttribL4ui64vNV), + SYM(GetVertexAttribLi64vNV), + SYM(GetVertexAttribLui64vNV), + SYM(VertexAttribLFormatNV), + SYM(BufferAddressRangeNV), + SYM(VertexFormatNV), + SYM(NormalFormatNV), + SYM(ColorFormatNV), + SYM(IndexFormatNV), + SYM(TexCoordFormatNV), + SYM(EdgeFlagFormatNV), + SYM(SecondaryColorFormatNV), + SYM(FogCoordFormatNV), + SYM(VertexAttribFormatNV), + SYM(VertexAttribIFormatNV), + SYM(GetIntegerui64i_vNV), + SYM(ViewportSwizzleNV), + SYM(FramebufferTextureMultiviewOVR), +#ifndef __APPLE__ + SYM(CreateSyncFromCLeventARB), + SYM(GetVkProcAddrNV), +#endif { NULL, NULL }, }; +RGLSYMGLCULLFACEPROC __rglgen_glCullFace; +RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; +RGLSYMGLHINTPROC __rglgen_glHint; +RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; +RGLSYMGLPOINTSIZEPROC __rglgen_glPointSize; +RGLSYMGLPOLYGONMODEPROC __rglgen_glPolygonMode; +RGLSYMGLSCISSORPROC __rglgen_glScissor; +RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; +RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; +RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; +RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; +RGLSYMGLTEXIMAGE1DPROC __rglgen_glTexImage1D; +RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; +RGLSYMGLDRAWBUFFERPROC __rglgen_glDrawBuffer; +RGLSYMGLCLEARPROC __rglgen_glClear; +RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; +RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; +RGLSYMGLCLEARDEPTHPROC __rglgen_glClearDepth; +RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; +RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; +RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; +RGLSYMGLDISABLEPROC __rglgen_glDisable; +RGLSYMGLENABLEPROC __rglgen_glEnable; +RGLSYMGLFINISHPROC __rglgen_glFinish; +RGLSYMGLFLUSHPROC __rglgen_glFlush; +RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; +RGLSYMGLLOGICOPPROC __rglgen_glLogicOp; +RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; +RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; +RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; +RGLSYMGLPIXELSTOREFPROC __rglgen_glPixelStoref; +RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; +RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; +RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; +RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; +RGLSYMGLGETDOUBLEVPROC __rglgen_glGetDoublev; +RGLSYMGLGETERRORPROC __rglgen_glGetError; +RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; +RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; +RGLSYMGLGETSTRINGPROC __rglgen_glGetString; +RGLSYMGLGETTEXIMAGEPROC __rglgen_glGetTexImage; +RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; +RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; +RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; +RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; +RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; +RGLSYMGLDEPTHRANGEPROC __rglgen_glDepthRange; +RGLSYMGLVIEWPORTPROC __rglgen_glViewport; +RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; +RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; +RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; +RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; +RGLSYMGLCOPYTEXIMAGE1DPROC __rglgen_glCopyTexImage1D; +RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; +RGLSYMGLCOPYTEXSUBIMAGE1DPROC __rglgen_glCopyTexSubImage1D; +RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; +RGLSYMGLTEXSUBIMAGE1DPROC __rglgen_glTexSubImage1D; +RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; +RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; +RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; +RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; +RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; @@ -1527,43 +1347,6 @@ RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC __rglgen_glCompressedTexSubImage1D; RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC __rglgen_glGetCompressedTexImage; -RGLSYMGLCLIENTACTIVETEXTUREPROC __rglgen_glClientActiveTexture; -RGLSYMGLMULTITEXCOORD1DPROC __rglgen_glMultiTexCoord1d; -RGLSYMGLMULTITEXCOORD1DVPROC __rglgen_glMultiTexCoord1dv; -RGLSYMGLMULTITEXCOORD1FPROC __rglgen_glMultiTexCoord1f; -RGLSYMGLMULTITEXCOORD1FVPROC __rglgen_glMultiTexCoord1fv; -RGLSYMGLMULTITEXCOORD1IPROC __rglgen_glMultiTexCoord1i; -RGLSYMGLMULTITEXCOORD1IVPROC __rglgen_glMultiTexCoord1iv; -RGLSYMGLMULTITEXCOORD1SPROC __rglgen_glMultiTexCoord1s; -RGLSYMGLMULTITEXCOORD1SVPROC __rglgen_glMultiTexCoord1sv; -RGLSYMGLMULTITEXCOORD2DPROC __rglgen_glMultiTexCoord2d; -RGLSYMGLMULTITEXCOORD2DVPROC __rglgen_glMultiTexCoord2dv; -RGLSYMGLMULTITEXCOORD2FPROC __rglgen_glMultiTexCoord2f; -RGLSYMGLMULTITEXCOORD2FVPROC __rglgen_glMultiTexCoord2fv; -RGLSYMGLMULTITEXCOORD2IPROC __rglgen_glMultiTexCoord2i; -RGLSYMGLMULTITEXCOORD2IVPROC __rglgen_glMultiTexCoord2iv; -RGLSYMGLMULTITEXCOORD2SPROC __rglgen_glMultiTexCoord2s; -RGLSYMGLMULTITEXCOORD2SVPROC __rglgen_glMultiTexCoord2sv; -RGLSYMGLMULTITEXCOORD3DPROC __rglgen_glMultiTexCoord3d; -RGLSYMGLMULTITEXCOORD3DVPROC __rglgen_glMultiTexCoord3dv; -RGLSYMGLMULTITEXCOORD3FPROC __rglgen_glMultiTexCoord3f; -RGLSYMGLMULTITEXCOORD3FVPROC __rglgen_glMultiTexCoord3fv; -RGLSYMGLMULTITEXCOORD3IPROC __rglgen_glMultiTexCoord3i; -RGLSYMGLMULTITEXCOORD3IVPROC __rglgen_glMultiTexCoord3iv; -RGLSYMGLMULTITEXCOORD3SPROC __rglgen_glMultiTexCoord3s; -RGLSYMGLMULTITEXCOORD3SVPROC __rglgen_glMultiTexCoord3sv; -RGLSYMGLMULTITEXCOORD4DPROC __rglgen_glMultiTexCoord4d; -RGLSYMGLMULTITEXCOORD4DVPROC __rglgen_glMultiTexCoord4dv; -RGLSYMGLMULTITEXCOORD4FPROC __rglgen_glMultiTexCoord4f; -RGLSYMGLMULTITEXCOORD4FVPROC __rglgen_glMultiTexCoord4fv; -RGLSYMGLMULTITEXCOORD4IPROC __rglgen_glMultiTexCoord4i; -RGLSYMGLMULTITEXCOORD4IVPROC __rglgen_glMultiTexCoord4iv; -RGLSYMGLMULTITEXCOORD4SPROC __rglgen_glMultiTexCoord4s; -RGLSYMGLMULTITEXCOORD4SVPROC __rglgen_glMultiTexCoord4sv; -RGLSYMGLLOADTRANSPOSEMATRIXFPROC __rglgen_glLoadTransposeMatrixf; -RGLSYMGLLOADTRANSPOSEMATRIXDPROC __rglgen_glLoadTransposeMatrixd; -RGLSYMGLMULTTRANSPOSEMATRIXFPROC __rglgen_glMultTransposeMatrixf; -RGLSYMGLMULTTRANSPOSEMATRIXDPROC __rglgen_glMultTransposeMatrixd; RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; RGLSYMGLMULTIDRAWARRAYSPROC __rglgen_glMultiDrawArrays; RGLSYMGLMULTIDRAWELEMENTSPROC __rglgen_glMultiDrawElements; @@ -1571,44 +1354,6 @@ RGLSYMGLPOINTPARAMETERFPROC __rglgen_glPointParameterf; RGLSYMGLPOINTPARAMETERFVPROC __rglgen_glPointParameterfv; RGLSYMGLPOINTPARAMETERIPROC __rglgen_glPointParameteri; RGLSYMGLPOINTPARAMETERIVPROC __rglgen_glPointParameteriv; -RGLSYMGLFOGCOORDFPROC __rglgen_glFogCoordf; -RGLSYMGLFOGCOORDFVPROC __rglgen_glFogCoordfv; -RGLSYMGLFOGCOORDDPROC __rglgen_glFogCoordd; -RGLSYMGLFOGCOORDDVPROC __rglgen_glFogCoorddv; -RGLSYMGLFOGCOORDPOINTERPROC __rglgen_glFogCoordPointer; -RGLSYMGLSECONDARYCOLOR3BPROC __rglgen_glSecondaryColor3b; -RGLSYMGLSECONDARYCOLOR3BVPROC __rglgen_glSecondaryColor3bv; -RGLSYMGLSECONDARYCOLOR3DPROC __rglgen_glSecondaryColor3d; -RGLSYMGLSECONDARYCOLOR3DVPROC __rglgen_glSecondaryColor3dv; -RGLSYMGLSECONDARYCOLOR3FPROC __rglgen_glSecondaryColor3f; -RGLSYMGLSECONDARYCOLOR3FVPROC __rglgen_glSecondaryColor3fv; -RGLSYMGLSECONDARYCOLOR3IPROC __rglgen_glSecondaryColor3i; -RGLSYMGLSECONDARYCOLOR3IVPROC __rglgen_glSecondaryColor3iv; -RGLSYMGLSECONDARYCOLOR3SPROC __rglgen_glSecondaryColor3s; -RGLSYMGLSECONDARYCOLOR3SVPROC __rglgen_glSecondaryColor3sv; -RGLSYMGLSECONDARYCOLOR3UBPROC __rglgen_glSecondaryColor3ub; -RGLSYMGLSECONDARYCOLOR3UBVPROC __rglgen_glSecondaryColor3ubv; -RGLSYMGLSECONDARYCOLOR3UIPROC __rglgen_glSecondaryColor3ui; -RGLSYMGLSECONDARYCOLOR3UIVPROC __rglgen_glSecondaryColor3uiv; -RGLSYMGLSECONDARYCOLOR3USPROC __rglgen_glSecondaryColor3us; -RGLSYMGLSECONDARYCOLOR3USVPROC __rglgen_glSecondaryColor3usv; -RGLSYMGLSECONDARYCOLORPOINTERPROC __rglgen_glSecondaryColorPointer; -RGLSYMGLWINDOWPOS2DPROC __rglgen_glWindowPos2d; -RGLSYMGLWINDOWPOS2DVPROC __rglgen_glWindowPos2dv; -RGLSYMGLWINDOWPOS2FPROC __rglgen_glWindowPos2f; -RGLSYMGLWINDOWPOS2FVPROC __rglgen_glWindowPos2fv; -RGLSYMGLWINDOWPOS2IPROC __rglgen_glWindowPos2i; -RGLSYMGLWINDOWPOS2IVPROC __rglgen_glWindowPos2iv; -RGLSYMGLWINDOWPOS2SPROC __rglgen_glWindowPos2s; -RGLSYMGLWINDOWPOS2SVPROC __rglgen_glWindowPos2sv; -RGLSYMGLWINDOWPOS3DPROC __rglgen_glWindowPos3d; -RGLSYMGLWINDOWPOS3DVPROC __rglgen_glWindowPos3dv; -RGLSYMGLWINDOWPOS3FPROC __rglgen_glWindowPos3f; -RGLSYMGLWINDOWPOS3FVPROC __rglgen_glWindowPos3fv; -RGLSYMGLWINDOWPOS3IPROC __rglgen_glWindowPos3i; -RGLSYMGLWINDOWPOS3IVPROC __rglgen_glWindowPos3iv; -RGLSYMGLWINDOWPOS3SPROC __rglgen_glWindowPos3s; -RGLSYMGLWINDOWPOS3SVPROC __rglgen_glWindowPos3sv; RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; @@ -1872,36 +1617,6 @@ RGLSYMGLVERTEXATTRIBP3UIPROC __rglgen_glVertexAttribP3ui; RGLSYMGLVERTEXATTRIBP3UIVPROC __rglgen_glVertexAttribP3uiv; RGLSYMGLVERTEXATTRIBP4UIPROC __rglgen_glVertexAttribP4ui; RGLSYMGLVERTEXATTRIBP4UIVPROC __rglgen_glVertexAttribP4uiv; -RGLSYMGLVERTEXP2UIPROC __rglgen_glVertexP2ui; -RGLSYMGLVERTEXP2UIVPROC __rglgen_glVertexP2uiv; -RGLSYMGLVERTEXP3UIPROC __rglgen_glVertexP3ui; -RGLSYMGLVERTEXP3UIVPROC __rglgen_glVertexP3uiv; -RGLSYMGLVERTEXP4UIPROC __rglgen_glVertexP4ui; -RGLSYMGLVERTEXP4UIVPROC __rglgen_glVertexP4uiv; -RGLSYMGLTEXCOORDP1UIPROC __rglgen_glTexCoordP1ui; -RGLSYMGLTEXCOORDP1UIVPROC __rglgen_glTexCoordP1uiv; -RGLSYMGLTEXCOORDP2UIPROC __rglgen_glTexCoordP2ui; -RGLSYMGLTEXCOORDP2UIVPROC __rglgen_glTexCoordP2uiv; -RGLSYMGLTEXCOORDP3UIPROC __rglgen_glTexCoordP3ui; -RGLSYMGLTEXCOORDP3UIVPROC __rglgen_glTexCoordP3uiv; -RGLSYMGLTEXCOORDP4UIPROC __rglgen_glTexCoordP4ui; -RGLSYMGLTEXCOORDP4UIVPROC __rglgen_glTexCoordP4uiv; -RGLSYMGLMULTITEXCOORDP1UIPROC __rglgen_glMultiTexCoordP1ui; -RGLSYMGLMULTITEXCOORDP1UIVPROC __rglgen_glMultiTexCoordP1uiv; -RGLSYMGLMULTITEXCOORDP2UIPROC __rglgen_glMultiTexCoordP2ui; -RGLSYMGLMULTITEXCOORDP2UIVPROC __rglgen_glMultiTexCoordP2uiv; -RGLSYMGLMULTITEXCOORDP3UIPROC __rglgen_glMultiTexCoordP3ui; -RGLSYMGLMULTITEXCOORDP3UIVPROC __rglgen_glMultiTexCoordP3uiv; -RGLSYMGLMULTITEXCOORDP4UIPROC __rglgen_glMultiTexCoordP4ui; -RGLSYMGLMULTITEXCOORDP4UIVPROC __rglgen_glMultiTexCoordP4uiv; -RGLSYMGLNORMALP3UIPROC __rglgen_glNormalP3ui; -RGLSYMGLNORMALP3UIVPROC __rglgen_glNormalP3uiv; -RGLSYMGLCOLORP3UIPROC __rglgen_glColorP3ui; -RGLSYMGLCOLORP3UIVPROC __rglgen_glColorP3uiv; -RGLSYMGLCOLORP4UIPROC __rglgen_glColorP4ui; -RGLSYMGLCOLORP4UIVPROC __rglgen_glColorP4uiv; -RGLSYMGLSECONDARYCOLORP3UIPROC __rglgen_glSecondaryColorP3ui; -RGLSYMGLSECONDARYCOLORP3UIVPROC __rglgen_glSecondaryColorP3uiv; RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; @@ -2100,6 +1815,121 @@ RGLSYMGLBINDTEXTURESPROC __rglgen_glBindTextures; RGLSYMGLBINDSAMPLERSPROC __rglgen_glBindSamplers; RGLSYMGLBINDIMAGETEXTURESPROC __rglgen_glBindImageTextures; RGLSYMGLBINDVERTEXBUFFERSPROC __rglgen_glBindVertexBuffers; +RGLSYMGLCLIPCONTROLPROC __rglgen_glClipControl; +RGLSYMGLCREATETRANSFORMFEEDBACKSPROC __rglgen_glCreateTransformFeedbacks; +RGLSYMGLTRANSFORMFEEDBACKBUFFERBASEPROC __rglgen_glTransformFeedbackBufferBase; +RGLSYMGLTRANSFORMFEEDBACKBUFFERRANGEPROC __rglgen_glTransformFeedbackBufferRange; +RGLSYMGLGETTRANSFORMFEEDBACKIVPROC __rglgen_glGetTransformFeedbackiv; +RGLSYMGLGETTRANSFORMFEEDBACKI_VPROC __rglgen_glGetTransformFeedbacki_v; +RGLSYMGLGETTRANSFORMFEEDBACKI64_VPROC __rglgen_glGetTransformFeedbacki64_v; +RGLSYMGLCREATEBUFFERSPROC __rglgen_glCreateBuffers; +RGLSYMGLNAMEDBUFFERSTORAGEPROC __rglgen_glNamedBufferStorage; +RGLSYMGLNAMEDBUFFERDATAPROC __rglgen_glNamedBufferData; +RGLSYMGLNAMEDBUFFERSUBDATAPROC __rglgen_glNamedBufferSubData; +RGLSYMGLCOPYNAMEDBUFFERSUBDATAPROC __rglgen_glCopyNamedBufferSubData; +RGLSYMGLCLEARNAMEDBUFFERDATAPROC __rglgen_glClearNamedBufferData; +RGLSYMGLCLEARNAMEDBUFFERSUBDATAPROC __rglgen_glClearNamedBufferSubData; +RGLSYMGLMAPNAMEDBUFFERPROC __rglgen_glMapNamedBuffer; +RGLSYMGLMAPNAMEDBUFFERRANGEPROC __rglgen_glMapNamedBufferRange; +RGLSYMGLUNMAPNAMEDBUFFERPROC __rglgen_glUnmapNamedBuffer; +RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __rglgen_glFlushMappedNamedBufferRange; +RGLSYMGLGETNAMEDBUFFERPARAMETERIVPROC __rglgen_glGetNamedBufferParameteriv; +RGLSYMGLGETNAMEDBUFFERPARAMETERI64VPROC __rglgen_glGetNamedBufferParameteri64v; +RGLSYMGLGETNAMEDBUFFERPOINTERVPROC __rglgen_glGetNamedBufferPointerv; +RGLSYMGLGETNAMEDBUFFERSUBDATAPROC __rglgen_glGetNamedBufferSubData; +RGLSYMGLCREATEFRAMEBUFFERSPROC __rglgen_glCreateFramebuffers; +RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __rglgen_glNamedFramebufferRenderbuffer; +RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIPROC __rglgen_glNamedFramebufferParameteri; +RGLSYMGLNAMEDFRAMEBUFFERTEXTUREPROC __rglgen_glNamedFramebufferTexture; +RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __rglgen_glNamedFramebufferTextureLayer; +RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __rglgen_glNamedFramebufferDrawBuffer; +RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __rglgen_glNamedFramebufferDrawBuffers; +RGLSYMGLNAMEDFRAMEBUFFERREADBUFFERPROC __rglgen_glNamedFramebufferReadBuffer; +RGLSYMGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __rglgen_glInvalidateNamedFramebufferData; +RGLSYMGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __rglgen_glInvalidateNamedFramebufferSubData; +RGLSYMGLCLEARNAMEDFRAMEBUFFERIVPROC __rglgen_glClearNamedFramebufferiv; +RGLSYMGLCLEARNAMEDFRAMEBUFFERUIVPROC __rglgen_glClearNamedFramebufferuiv; +RGLSYMGLCLEARNAMEDFRAMEBUFFERFVPROC __rglgen_glClearNamedFramebufferfv; +RGLSYMGLCLEARNAMEDFRAMEBUFFERFIPROC __rglgen_glClearNamedFramebufferfi; +RGLSYMGLBLITNAMEDFRAMEBUFFERPROC __rglgen_glBlitNamedFramebuffer; +RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __rglgen_glCheckNamedFramebufferStatus; +RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetNamedFramebufferParameteriv; +RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetNamedFramebufferAttachmentParameteriv; +RGLSYMGLCREATERENDERBUFFERSPROC __rglgen_glCreateRenderbuffers; +RGLSYMGLNAMEDRENDERBUFFERSTORAGEPROC __rglgen_glNamedRenderbufferStorage; +RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glNamedRenderbufferStorageMultisample; +RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __rglgen_glGetNamedRenderbufferParameteriv; +RGLSYMGLCREATETEXTURESPROC __rglgen_glCreateTextures; +RGLSYMGLTEXTUREBUFFERPROC __rglgen_glTextureBuffer; +RGLSYMGLTEXTUREBUFFERRANGEPROC __rglgen_glTextureBufferRange; +RGLSYMGLTEXTURESTORAGE1DPROC __rglgen_glTextureStorage1D; +RGLSYMGLTEXTURESTORAGE2DPROC __rglgen_glTextureStorage2D; +RGLSYMGLTEXTURESTORAGE3DPROC __rglgen_glTextureStorage3D; +RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEPROC __rglgen_glTextureStorage2DMultisample; +RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEPROC __rglgen_glTextureStorage3DMultisample; +RGLSYMGLTEXTURESUBIMAGE1DPROC __rglgen_glTextureSubImage1D; +RGLSYMGLTEXTURESUBIMAGE2DPROC __rglgen_glTextureSubImage2D; +RGLSYMGLTEXTURESUBIMAGE3DPROC __rglgen_glTextureSubImage3D; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __rglgen_glCompressedTextureSubImage1D; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __rglgen_glCompressedTextureSubImage2D; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __rglgen_glCompressedTextureSubImage3D; +RGLSYMGLCOPYTEXTURESUBIMAGE1DPROC __rglgen_glCopyTextureSubImage1D; +RGLSYMGLCOPYTEXTURESUBIMAGE2DPROC __rglgen_glCopyTextureSubImage2D; +RGLSYMGLCOPYTEXTURESUBIMAGE3DPROC __rglgen_glCopyTextureSubImage3D; +RGLSYMGLTEXTUREPARAMETERFPROC __rglgen_glTextureParameterf; +RGLSYMGLTEXTUREPARAMETERFVPROC __rglgen_glTextureParameterfv; +RGLSYMGLTEXTUREPARAMETERIPROC __rglgen_glTextureParameteri; +RGLSYMGLTEXTUREPARAMETERIIVPROC __rglgen_glTextureParameterIiv; +RGLSYMGLTEXTUREPARAMETERIUIVPROC __rglgen_glTextureParameterIuiv; +RGLSYMGLTEXTUREPARAMETERIVPROC __rglgen_glTextureParameteriv; +RGLSYMGLGENERATETEXTUREMIPMAPPROC __rglgen_glGenerateTextureMipmap; +RGLSYMGLBINDTEXTUREUNITPROC __rglgen_glBindTextureUnit; +RGLSYMGLGETTEXTUREIMAGEPROC __rglgen_glGetTextureImage; +RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEPROC __rglgen_glGetCompressedTextureImage; +RGLSYMGLGETTEXTURELEVELPARAMETERFVPROC __rglgen_glGetTextureLevelParameterfv; +RGLSYMGLGETTEXTURELEVELPARAMETERIVPROC __rglgen_glGetTextureLevelParameteriv; +RGLSYMGLGETTEXTUREPARAMETERFVPROC __rglgen_glGetTextureParameterfv; +RGLSYMGLGETTEXTUREPARAMETERIIVPROC __rglgen_glGetTextureParameterIiv; +RGLSYMGLGETTEXTUREPARAMETERIUIVPROC __rglgen_glGetTextureParameterIuiv; +RGLSYMGLGETTEXTUREPARAMETERIVPROC __rglgen_glGetTextureParameteriv; +RGLSYMGLCREATEVERTEXARRAYSPROC __rglgen_glCreateVertexArrays; +RGLSYMGLDISABLEVERTEXARRAYATTRIBPROC __rglgen_glDisableVertexArrayAttrib; +RGLSYMGLENABLEVERTEXARRAYATTRIBPROC __rglgen_glEnableVertexArrayAttrib; +RGLSYMGLVERTEXARRAYELEMENTBUFFERPROC __rglgen_glVertexArrayElementBuffer; +RGLSYMGLVERTEXARRAYVERTEXBUFFERPROC __rglgen_glVertexArrayVertexBuffer; +RGLSYMGLVERTEXARRAYVERTEXBUFFERSPROC __rglgen_glVertexArrayVertexBuffers; +RGLSYMGLVERTEXARRAYATTRIBBINDINGPROC __rglgen_glVertexArrayAttribBinding; +RGLSYMGLVERTEXARRAYATTRIBFORMATPROC __rglgen_glVertexArrayAttribFormat; +RGLSYMGLVERTEXARRAYATTRIBIFORMATPROC __rglgen_glVertexArrayAttribIFormat; +RGLSYMGLVERTEXARRAYATTRIBLFORMATPROC __rglgen_glVertexArrayAttribLFormat; +RGLSYMGLVERTEXARRAYBINDINGDIVISORPROC __rglgen_glVertexArrayBindingDivisor; +RGLSYMGLGETVERTEXARRAYIVPROC __rglgen_glGetVertexArrayiv; +RGLSYMGLGETVERTEXARRAYINDEXEDIVPROC __rglgen_glGetVertexArrayIndexediv; +RGLSYMGLGETVERTEXARRAYINDEXED64IVPROC __rglgen_glGetVertexArrayIndexed64iv; +RGLSYMGLCREATESAMPLERSPROC __rglgen_glCreateSamplers; +RGLSYMGLCREATEPROGRAMPIPELINESPROC __rglgen_glCreateProgramPipelines; +RGLSYMGLCREATEQUERIESPROC __rglgen_glCreateQueries; +RGLSYMGLGETQUERYBUFFEROBJECTI64VPROC __rglgen_glGetQueryBufferObjecti64v; +RGLSYMGLGETQUERYBUFFEROBJECTIVPROC __rglgen_glGetQueryBufferObjectiv; +RGLSYMGLGETQUERYBUFFEROBJECTUI64VPROC __rglgen_glGetQueryBufferObjectui64v; +RGLSYMGLGETQUERYBUFFEROBJECTUIVPROC __rglgen_glGetQueryBufferObjectuiv; +RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; +RGLSYMGLGETTEXTURESUBIMAGEPROC __rglgen_glGetTextureSubImage; +RGLSYMGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __rglgen_glGetCompressedTextureSubImage; +RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; +RGLSYMGLGETNCOMPRESSEDTEXIMAGEPROC __rglgen_glGetnCompressedTexImage; +RGLSYMGLGETNTEXIMAGEPROC __rglgen_glGetnTexImage; +RGLSYMGLGETNUNIFORMDVPROC __rglgen_glGetnUniformdv; +RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; +RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; +RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; +RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; +RGLSYMGLTEXTUREBARRIERPROC __rglgen_glTextureBarrier; +RGLSYMGLSPECIALIZESHADERPROC __rglgen_glSpecializeShader; +RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __rglgen_glMultiDrawArraysIndirectCount; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __rglgen_glMultiDrawElementsIndirectCount; +RGLSYMGLPOLYGONOFFSETCLAMPPROC __rglgen_glPolygonOffsetClamp; +RGLSYMGLPRIMITIVEBOUNDINGBOXARBPROC __rglgen_glPrimitiveBoundingBoxARB; RGLSYMGLGETTEXTUREHANDLEARBPROC __rglgen_glGetTextureHandleARB; RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC __rglgen_glGetTextureSamplerHandleARB; RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC __rglgen_glMakeTextureHandleResidentARB; @@ -2116,128 +1946,62 @@ RGLSYMGLISIMAGEHANDLERESIDENTARBPROC __rglgen_glIsImageHandleResidentARB; RGLSYMGLVERTEXATTRIBL1UI64ARBPROC __rglgen_glVertexAttribL1ui64ARB; RGLSYMGLVERTEXATTRIBL1UI64VARBPROC __rglgen_glVertexAttribL1ui64vARB; RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC __rglgen_glGetVertexAttribLui64vARB; -RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; -RGLSYMGLCLAMPCOLORARBPROC __rglgen_glClampColorARB; RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC __rglgen_glDispatchComputeGroupSizeARB; RGLSYMGLDEBUGMESSAGECONTROLARBPROC __rglgen_glDebugMessageControlARB; RGLSYMGLDEBUGMESSAGEINSERTARBPROC __rglgen_glDebugMessageInsertARB; RGLSYMGLDEBUGMESSAGECALLBACKARBPROC __rglgen_glDebugMessageCallbackARB; RGLSYMGLGETDEBUGMESSAGELOGARBPROC __rglgen_glGetDebugMessageLogARB; -RGLSYMGLDRAWBUFFERSARBPROC __rglgen_glDrawBuffersARB; RGLSYMGLBLENDEQUATIONIARBPROC __rglgen_glBlendEquationiARB; RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC __rglgen_glBlendEquationSeparateiARB; RGLSYMGLBLENDFUNCIARBPROC __rglgen_glBlendFunciARB; RGLSYMGLBLENDFUNCSEPARATEIARBPROC __rglgen_glBlendFuncSeparateiARB; RGLSYMGLDRAWARRAYSINSTANCEDARBPROC __rglgen_glDrawArraysInstancedARB; RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC __rglgen_glDrawElementsInstancedARB; -RGLSYMGLPROGRAMSTRINGARBPROC __rglgen_glProgramStringARB; -RGLSYMGLBINDPROGRAMARBPROC __rglgen_glBindProgramARB; -RGLSYMGLDELETEPROGRAMSARBPROC __rglgen_glDeleteProgramsARB; -RGLSYMGLGENPROGRAMSARBPROC __rglgen_glGenProgramsARB; -RGLSYMGLPROGRAMENVPARAMETER4DARBPROC __rglgen_glProgramEnvParameter4dARB; -RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC __rglgen_glProgramEnvParameter4dvARB; -RGLSYMGLPROGRAMENVPARAMETER4FARBPROC __rglgen_glProgramEnvParameter4fARB; -RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC __rglgen_glProgramEnvParameter4fvARB; -RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC __rglgen_glProgramLocalParameter4dARB; -RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC __rglgen_glProgramLocalParameter4dvARB; -RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC __rglgen_glProgramLocalParameter4fARB; -RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC __rglgen_glProgramLocalParameter4fvARB; -RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC __rglgen_glGetProgramEnvParameterdvARB; -RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC __rglgen_glGetProgramEnvParameterfvARB; -RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC __rglgen_glGetProgramLocalParameterdvARB; -RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC __rglgen_glGetProgramLocalParameterfvARB; -RGLSYMGLGETPROGRAMIVARBPROC __rglgen_glGetProgramivARB; -RGLSYMGLGETPROGRAMSTRINGARBPROC __rglgen_glGetProgramStringARB; -RGLSYMGLISPROGRAMARBPROC __rglgen_glIsProgramARB; RGLSYMGLPROGRAMPARAMETERIARBPROC __rglgen_glProgramParameteriARB; RGLSYMGLFRAMEBUFFERTEXTUREARBPROC __rglgen_glFramebufferTextureARB; RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC __rglgen_glFramebufferTextureLayerARB; RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC __rglgen_glFramebufferTextureFaceARB; -RGLSYMGLCOLORTABLEPROC __rglgen_glColorTable; -RGLSYMGLCOLORTABLEPARAMETERFVPROC __rglgen_glColorTableParameterfv; -RGLSYMGLCOLORTABLEPARAMETERIVPROC __rglgen_glColorTableParameteriv; -RGLSYMGLCOPYCOLORTABLEPROC __rglgen_glCopyColorTable; -RGLSYMGLGETCOLORTABLEPROC __rglgen_glGetColorTable; -RGLSYMGLGETCOLORTABLEPARAMETERFVPROC __rglgen_glGetColorTableParameterfv; -RGLSYMGLGETCOLORTABLEPARAMETERIVPROC __rglgen_glGetColorTableParameteriv; -RGLSYMGLCOLORSUBTABLEPROC __rglgen_glColorSubTable; -RGLSYMGLCOPYCOLORSUBTABLEPROC __rglgen_glCopyColorSubTable; -RGLSYMGLCONVOLUTIONFILTER1DPROC __rglgen_glConvolutionFilter1D; -RGLSYMGLCONVOLUTIONFILTER2DPROC __rglgen_glConvolutionFilter2D; -RGLSYMGLCONVOLUTIONPARAMETERFPROC __rglgen_glConvolutionParameterf; -RGLSYMGLCONVOLUTIONPARAMETERFVPROC __rglgen_glConvolutionParameterfv; -RGLSYMGLCONVOLUTIONPARAMETERIPROC __rglgen_glConvolutionParameteri; -RGLSYMGLCONVOLUTIONPARAMETERIVPROC __rglgen_glConvolutionParameteriv; -RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC __rglgen_glCopyConvolutionFilter1D; -RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC __rglgen_glCopyConvolutionFilter2D; -RGLSYMGLGETCONVOLUTIONFILTERPROC __rglgen_glGetConvolutionFilter; -RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC __rglgen_glGetConvolutionParameterfv; -RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC __rglgen_glGetConvolutionParameteriv; -RGLSYMGLGETSEPARABLEFILTERPROC __rglgen_glGetSeparableFilter; -RGLSYMGLSEPARABLEFILTER2DPROC __rglgen_glSeparableFilter2D; -RGLSYMGLGETHISTOGRAMPROC __rglgen_glGetHistogram; -RGLSYMGLGETHISTOGRAMPARAMETERFVPROC __rglgen_glGetHistogramParameterfv; -RGLSYMGLGETHISTOGRAMPARAMETERIVPROC __rglgen_glGetHistogramParameteriv; -RGLSYMGLGETMINMAXPROC __rglgen_glGetMinmax; -RGLSYMGLGETMINMAXPARAMETERFVPROC __rglgen_glGetMinmaxParameterfv; -RGLSYMGLGETMINMAXPARAMETERIVPROC __rglgen_glGetMinmaxParameteriv; -RGLSYMGLHISTOGRAMPROC __rglgen_glHistogram; -RGLSYMGLMINMAXPROC __rglgen_glMinmax; -RGLSYMGLRESETHISTOGRAMPROC __rglgen_glResetHistogram; -RGLSYMGLRESETMINMAXPROC __rglgen_glResetMinmax; +RGLSYMGLSPECIALIZESHADERARBPROC __rglgen_glSpecializeShaderARB; +RGLSYMGLUNIFORM1I64ARBPROC __rglgen_glUniform1i64ARB; +RGLSYMGLUNIFORM2I64ARBPROC __rglgen_glUniform2i64ARB; +RGLSYMGLUNIFORM3I64ARBPROC __rglgen_glUniform3i64ARB; +RGLSYMGLUNIFORM4I64ARBPROC __rglgen_glUniform4i64ARB; +RGLSYMGLUNIFORM1I64VARBPROC __rglgen_glUniform1i64vARB; +RGLSYMGLUNIFORM2I64VARBPROC __rglgen_glUniform2i64vARB; +RGLSYMGLUNIFORM3I64VARBPROC __rglgen_glUniform3i64vARB; +RGLSYMGLUNIFORM4I64VARBPROC __rglgen_glUniform4i64vARB; +RGLSYMGLUNIFORM1UI64ARBPROC __rglgen_glUniform1ui64ARB; +RGLSYMGLUNIFORM2UI64ARBPROC __rglgen_glUniform2ui64ARB; +RGLSYMGLUNIFORM3UI64ARBPROC __rglgen_glUniform3ui64ARB; +RGLSYMGLUNIFORM4UI64ARBPROC __rglgen_glUniform4ui64ARB; +RGLSYMGLUNIFORM1UI64VARBPROC __rglgen_glUniform1ui64vARB; +RGLSYMGLUNIFORM2UI64VARBPROC __rglgen_glUniform2ui64vARB; +RGLSYMGLUNIFORM3UI64VARBPROC __rglgen_glUniform3ui64vARB; +RGLSYMGLUNIFORM4UI64VARBPROC __rglgen_glUniform4ui64vARB; +RGLSYMGLGETUNIFORMI64VARBPROC __rglgen_glGetUniformi64vARB; +RGLSYMGLGETUNIFORMUI64VARBPROC __rglgen_glGetUniformui64vARB; +RGLSYMGLGETNUNIFORMI64VARBPROC __rglgen_glGetnUniformi64vARB; +RGLSYMGLGETNUNIFORMUI64VARBPROC __rglgen_glGetnUniformui64vARB; +RGLSYMGLPROGRAMUNIFORM1I64ARBPROC __rglgen_glProgramUniform1i64ARB; +RGLSYMGLPROGRAMUNIFORM2I64ARBPROC __rglgen_glProgramUniform2i64ARB; +RGLSYMGLPROGRAMUNIFORM3I64ARBPROC __rglgen_glProgramUniform3i64ARB; +RGLSYMGLPROGRAMUNIFORM4I64ARBPROC __rglgen_glProgramUniform4i64ARB; +RGLSYMGLPROGRAMUNIFORM1I64VARBPROC __rglgen_glProgramUniform1i64vARB; +RGLSYMGLPROGRAMUNIFORM2I64VARBPROC __rglgen_glProgramUniform2i64vARB; +RGLSYMGLPROGRAMUNIFORM3I64VARBPROC __rglgen_glProgramUniform3i64vARB; +RGLSYMGLPROGRAMUNIFORM4I64VARBPROC __rglgen_glProgramUniform4i64vARB; +RGLSYMGLPROGRAMUNIFORM1UI64ARBPROC __rglgen_glProgramUniform1ui64ARB; +RGLSYMGLPROGRAMUNIFORM2UI64ARBPROC __rglgen_glProgramUniform2ui64ARB; +RGLSYMGLPROGRAMUNIFORM3UI64ARBPROC __rglgen_glProgramUniform3ui64ARB; +RGLSYMGLPROGRAMUNIFORM4UI64ARBPROC __rglgen_glProgramUniform4ui64ARB; +RGLSYMGLPROGRAMUNIFORM1UI64VARBPROC __rglgen_glProgramUniform1ui64vARB; +RGLSYMGLPROGRAMUNIFORM2UI64VARBPROC __rglgen_glProgramUniform2ui64vARB; +RGLSYMGLPROGRAMUNIFORM3UI64VARBPROC __rglgen_glProgramUniform3ui64vARB; +RGLSYMGLPROGRAMUNIFORM4UI64VARBPROC __rglgen_glProgramUniform4ui64vARB; RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawArraysIndirectCountARB; RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawElementsIndirectCountARB; RGLSYMGLVERTEXATTRIBDIVISORARBPROC __rglgen_glVertexAttribDivisorARB; -RGLSYMGLCURRENTPALETTEMATRIXARBPROC __rglgen_glCurrentPaletteMatrixARB; -RGLSYMGLMATRIXINDEXUBVARBPROC __rglgen_glMatrixIndexubvARB; -RGLSYMGLMATRIXINDEXUSVARBPROC __rglgen_glMatrixIndexusvARB; -RGLSYMGLMATRIXINDEXUIVARBPROC __rglgen_glMatrixIndexuivARB; -RGLSYMGLMATRIXINDEXPOINTERARBPROC __rglgen_glMatrixIndexPointerARB; -RGLSYMGLSAMPLECOVERAGEARBPROC __rglgen_glSampleCoverageARB; -RGLSYMGLACTIVETEXTUREARBPROC __rglgen_glActiveTextureARB; -RGLSYMGLCLIENTACTIVETEXTUREARBPROC __rglgen_glClientActiveTextureARB; -RGLSYMGLMULTITEXCOORD1DARBPROC __rglgen_glMultiTexCoord1dARB; -RGLSYMGLMULTITEXCOORD1DVARBPROC __rglgen_glMultiTexCoord1dvARB; -RGLSYMGLMULTITEXCOORD1FARBPROC __rglgen_glMultiTexCoord1fARB; -RGLSYMGLMULTITEXCOORD1FVARBPROC __rglgen_glMultiTexCoord1fvARB; -RGLSYMGLMULTITEXCOORD1IARBPROC __rglgen_glMultiTexCoord1iARB; -RGLSYMGLMULTITEXCOORD1IVARBPROC __rglgen_glMultiTexCoord1ivARB; -RGLSYMGLMULTITEXCOORD1SARBPROC __rglgen_glMultiTexCoord1sARB; -RGLSYMGLMULTITEXCOORD1SVARBPROC __rglgen_glMultiTexCoord1svARB; -RGLSYMGLMULTITEXCOORD2DARBPROC __rglgen_glMultiTexCoord2dARB; -RGLSYMGLMULTITEXCOORD2DVARBPROC __rglgen_glMultiTexCoord2dvARB; -RGLSYMGLMULTITEXCOORD2FARBPROC __rglgen_glMultiTexCoord2fARB; -RGLSYMGLMULTITEXCOORD2FVARBPROC __rglgen_glMultiTexCoord2fvARB; -RGLSYMGLMULTITEXCOORD2IARBPROC __rglgen_glMultiTexCoord2iARB; -RGLSYMGLMULTITEXCOORD2IVARBPROC __rglgen_glMultiTexCoord2ivARB; -RGLSYMGLMULTITEXCOORD2SARBPROC __rglgen_glMultiTexCoord2sARB; -RGLSYMGLMULTITEXCOORD2SVARBPROC __rglgen_glMultiTexCoord2svARB; -RGLSYMGLMULTITEXCOORD3DARBPROC __rglgen_glMultiTexCoord3dARB; -RGLSYMGLMULTITEXCOORD3DVARBPROC __rglgen_glMultiTexCoord3dvARB; -RGLSYMGLMULTITEXCOORD3FARBPROC __rglgen_glMultiTexCoord3fARB; -RGLSYMGLMULTITEXCOORD3FVARBPROC __rglgen_glMultiTexCoord3fvARB; -RGLSYMGLMULTITEXCOORD3IARBPROC __rglgen_glMultiTexCoord3iARB; -RGLSYMGLMULTITEXCOORD3IVARBPROC __rglgen_glMultiTexCoord3ivARB; -RGLSYMGLMULTITEXCOORD3SARBPROC __rglgen_glMultiTexCoord3sARB; -RGLSYMGLMULTITEXCOORD3SVARBPROC __rglgen_glMultiTexCoord3svARB; -RGLSYMGLMULTITEXCOORD4DARBPROC __rglgen_glMultiTexCoord4dARB; -RGLSYMGLMULTITEXCOORD4DVARBPROC __rglgen_glMultiTexCoord4dvARB; -RGLSYMGLMULTITEXCOORD4FARBPROC __rglgen_glMultiTexCoord4fARB; -RGLSYMGLMULTITEXCOORD4FVARBPROC __rglgen_glMultiTexCoord4fvARB; -RGLSYMGLMULTITEXCOORD4IARBPROC __rglgen_glMultiTexCoord4iARB; -RGLSYMGLMULTITEXCOORD4IVARBPROC __rglgen_glMultiTexCoord4ivARB; -RGLSYMGLMULTITEXCOORD4SARBPROC __rglgen_glMultiTexCoord4sARB; -RGLSYMGLMULTITEXCOORD4SVARBPROC __rglgen_glMultiTexCoord4svARB; -RGLSYMGLGENQUERIESARBPROC __rglgen_glGenQueriesARB; -RGLSYMGLDELETEQUERIESARBPROC __rglgen_glDeleteQueriesARB; -RGLSYMGLISQUERYARBPROC __rglgen_glIsQueryARB; -RGLSYMGLBEGINQUERYARBPROC __rglgen_glBeginQueryARB; -RGLSYMGLENDQUERYARBPROC __rglgen_glEndQueryARB; -RGLSYMGLGETQUERYIVARBPROC __rglgen_glGetQueryivARB; -RGLSYMGLGETQUERYOBJECTIVARBPROC __rglgen_glGetQueryObjectivARB; -RGLSYMGLGETQUERYOBJECTUIVARBPROC __rglgen_glGetQueryObjectuivARB; -RGLSYMGLPOINTPARAMETERFARBPROC __rglgen_glPointParameterfARB; -RGLSYMGLPOINTPARAMETERFVARBPROC __rglgen_glPointParameterfvARB; +RGLSYMGLMAXSHADERCOMPILERTHREADSARBPROC __rglgen_glMaxShaderCompilerThreadsARB; RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC __rglgen_glGetGraphicsResetStatusARB; RGLSYMGLGETNTEXIMAGEARBPROC __rglgen_glGetnTexImageARB; RGLSYMGLREADNPIXELSARBPROC __rglgen_glReadnPixelsARB; @@ -2246,296 +2010,508 @@ RGLSYMGLGETNUNIFORMFVARBPROC __rglgen_glGetnUniformfvARB; RGLSYMGLGETNUNIFORMIVARBPROC __rglgen_glGetnUniformivARB; RGLSYMGLGETNUNIFORMUIVARBPROC __rglgen_glGetnUniformuivARB; RGLSYMGLGETNUNIFORMDVARBPROC __rglgen_glGetnUniformdvARB; -RGLSYMGLGETNMAPDVARBPROC __rglgen_glGetnMapdvARB; -RGLSYMGLGETNMAPFVARBPROC __rglgen_glGetnMapfvARB; -RGLSYMGLGETNMAPIVARBPROC __rglgen_glGetnMapivARB; -RGLSYMGLGETNPIXELMAPFVARBPROC __rglgen_glGetnPixelMapfvARB; -RGLSYMGLGETNPIXELMAPUIVARBPROC __rglgen_glGetnPixelMapuivARB; -RGLSYMGLGETNPIXELMAPUSVARBPROC __rglgen_glGetnPixelMapusvARB; -RGLSYMGLGETNPOLYGONSTIPPLEARBPROC __rglgen_glGetnPolygonStippleARB; -RGLSYMGLGETNCOLORTABLEARBPROC __rglgen_glGetnColorTableARB; -RGLSYMGLGETNCONVOLUTIONFILTERARBPROC __rglgen_glGetnConvolutionFilterARB; -RGLSYMGLGETNSEPARABLEFILTERARBPROC __rglgen_glGetnSeparableFilterARB; -RGLSYMGLGETNHISTOGRAMARBPROC __rglgen_glGetnHistogramARB; -RGLSYMGLGETNMINMAXARBPROC __rglgen_glGetnMinmaxARB; +RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __rglgen_glFramebufferSampleLocationsfvARB; +RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __rglgen_glNamedFramebufferSampleLocationsfvARB; +RGLSYMGLEVALUATEDEPTHVALUESARBPROC __rglgen_glEvaluateDepthValuesARB; RGLSYMGLMINSAMPLESHADINGARBPROC __rglgen_glMinSampleShadingARB; -RGLSYMGLDELETEOBJECTARBPROC __rglgen_glDeleteObjectARB; -RGLSYMGLGETHANDLEARBPROC __rglgen_glGetHandleARB; -RGLSYMGLDETACHOBJECTARBPROC __rglgen_glDetachObjectARB; -RGLSYMGLCREATESHADEROBJECTARBPROC __rglgen_glCreateShaderObjectARB; -RGLSYMGLSHADERSOURCEARBPROC __rglgen_glShaderSourceARB; -RGLSYMGLCOMPILESHADERARBPROC __rglgen_glCompileShaderARB; -RGLSYMGLCREATEPROGRAMOBJECTARBPROC __rglgen_glCreateProgramObjectARB; -RGLSYMGLATTACHOBJECTARBPROC __rglgen_glAttachObjectARB; -RGLSYMGLLINKPROGRAMARBPROC __rglgen_glLinkProgramARB; -RGLSYMGLUSEPROGRAMOBJECTARBPROC __rglgen_glUseProgramObjectARB; -RGLSYMGLVALIDATEPROGRAMARBPROC __rglgen_glValidateProgramARB; -RGLSYMGLUNIFORM1FARBPROC __rglgen_glUniform1fARB; -RGLSYMGLUNIFORM2FARBPROC __rglgen_glUniform2fARB; -RGLSYMGLUNIFORM3FARBPROC __rglgen_glUniform3fARB; -RGLSYMGLUNIFORM4FARBPROC __rglgen_glUniform4fARB; -RGLSYMGLUNIFORM1IARBPROC __rglgen_glUniform1iARB; -RGLSYMGLUNIFORM2IARBPROC __rglgen_glUniform2iARB; -RGLSYMGLUNIFORM3IARBPROC __rglgen_glUniform3iARB; -RGLSYMGLUNIFORM4IARBPROC __rglgen_glUniform4iARB; -RGLSYMGLUNIFORM1FVARBPROC __rglgen_glUniform1fvARB; -RGLSYMGLUNIFORM2FVARBPROC __rglgen_glUniform2fvARB; -RGLSYMGLUNIFORM3FVARBPROC __rglgen_glUniform3fvARB; -RGLSYMGLUNIFORM4FVARBPROC __rglgen_glUniform4fvARB; -RGLSYMGLUNIFORM1IVARBPROC __rglgen_glUniform1ivARB; -RGLSYMGLUNIFORM2IVARBPROC __rglgen_glUniform2ivARB; -RGLSYMGLUNIFORM3IVARBPROC __rglgen_glUniform3ivARB; -RGLSYMGLUNIFORM4IVARBPROC __rglgen_glUniform4ivARB; -RGLSYMGLUNIFORMMATRIX2FVARBPROC __rglgen_glUniformMatrix2fvARB; -RGLSYMGLUNIFORMMATRIX3FVARBPROC __rglgen_glUniformMatrix3fvARB; -RGLSYMGLUNIFORMMATRIX4FVARBPROC __rglgen_glUniformMatrix4fvARB; -RGLSYMGLGETOBJECTPARAMETERFVARBPROC __rglgen_glGetObjectParameterfvARB; -RGLSYMGLGETOBJECTPARAMETERIVARBPROC __rglgen_glGetObjectParameterivARB; -RGLSYMGLGETINFOLOGARBPROC __rglgen_glGetInfoLogARB; -RGLSYMGLGETATTACHEDOBJECTSARBPROC __rglgen_glGetAttachedObjectsARB; -RGLSYMGLGETUNIFORMLOCATIONARBPROC __rglgen_glGetUniformLocationARB; -RGLSYMGLGETACTIVEUNIFORMARBPROC __rglgen_glGetActiveUniformARB; -RGLSYMGLGETUNIFORMFVARBPROC __rglgen_glGetUniformfvARB; -RGLSYMGLGETUNIFORMIVARBPROC __rglgen_glGetUniformivARB; -RGLSYMGLGETSHADERSOURCEARBPROC __rglgen_glGetShaderSourceARB; RGLSYMGLNAMEDSTRINGARBPROC __rglgen_glNamedStringARB; RGLSYMGLDELETENAMEDSTRINGARBPROC __rglgen_glDeleteNamedStringARB; RGLSYMGLCOMPILESHADERINCLUDEARBPROC __rglgen_glCompileShaderIncludeARB; RGLSYMGLISNAMEDSTRINGARBPROC __rglgen_glIsNamedStringARB; RGLSYMGLGETNAMEDSTRINGARBPROC __rglgen_glGetNamedStringARB; RGLSYMGLGETNAMEDSTRINGIVARBPROC __rglgen_glGetNamedStringivARB; +RGLSYMGLBUFFERPAGECOMMITMENTARBPROC __rglgen_glBufferPageCommitmentARB; +RGLSYMGLNAMEDBUFFERPAGECOMMITMENTEXTPROC __rglgen_glNamedBufferPageCommitmentEXT; +RGLSYMGLNAMEDBUFFERPAGECOMMITMENTARBPROC __rglgen_glNamedBufferPageCommitmentARB; RGLSYMGLTEXPAGECOMMITMENTARBPROC __rglgen_glTexPageCommitmentARB; RGLSYMGLTEXBUFFERARBPROC __rglgen_glTexBufferARB; -RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC __rglgen_glCompressedTexImage3DARB; -RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC __rglgen_glCompressedTexImage2DARB; -RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC __rglgen_glCompressedTexImage1DARB; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __rglgen_glCompressedTexSubImage3DARB; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __rglgen_glCompressedTexSubImage2DARB; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __rglgen_glCompressedTexSubImage1DARB; -RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetCompressedTexImageARB; -RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC __rglgen_glLoadTransposeMatrixfARB; -RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC __rglgen_glLoadTransposeMatrixdARB; -RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC __rglgen_glMultTransposeMatrixfARB; -RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC __rglgen_glMultTransposeMatrixdARB; -RGLSYMGLWEIGHTBVARBPROC __rglgen_glWeightbvARB; -RGLSYMGLWEIGHTSVARBPROC __rglgen_glWeightsvARB; -RGLSYMGLWEIGHTIVARBPROC __rglgen_glWeightivARB; -RGLSYMGLWEIGHTFVARBPROC __rglgen_glWeightfvARB; -RGLSYMGLWEIGHTDVARBPROC __rglgen_glWeightdvARB; -RGLSYMGLWEIGHTUBVARBPROC __rglgen_glWeightubvARB; -RGLSYMGLWEIGHTUSVARBPROC __rglgen_glWeightusvARB; -RGLSYMGLWEIGHTUIVARBPROC __rglgen_glWeightuivARB; -RGLSYMGLWEIGHTPOINTERARBPROC __rglgen_glWeightPointerARB; -RGLSYMGLVERTEXBLENDARBPROC __rglgen_glVertexBlendARB; -RGLSYMGLBINDBUFFERARBPROC __rglgen_glBindBufferARB; -RGLSYMGLDELETEBUFFERSARBPROC __rglgen_glDeleteBuffersARB; -RGLSYMGLGENBUFFERSARBPROC __rglgen_glGenBuffersARB; -RGLSYMGLISBUFFERARBPROC __rglgen_glIsBufferARB; -RGLSYMGLBUFFERDATAARBPROC __rglgen_glBufferDataARB; -RGLSYMGLBUFFERSUBDATAARBPROC __rglgen_glBufferSubDataARB; -RGLSYMGLGETBUFFERSUBDATAARBPROC __rglgen_glGetBufferSubDataARB; -RGLSYMGLMAPBUFFERARBPROC __rglgen_glMapBufferARB; -RGLSYMGLUNMAPBUFFERARBPROC __rglgen_glUnmapBufferARB; -RGLSYMGLGETBUFFERPARAMETERIVARBPROC __rglgen_glGetBufferParameterivARB; -RGLSYMGLGETBUFFERPOINTERVARBPROC __rglgen_glGetBufferPointervARB; -RGLSYMGLVERTEXATTRIB1DARBPROC __rglgen_glVertexAttrib1dARB; -RGLSYMGLVERTEXATTRIB1DVARBPROC __rglgen_glVertexAttrib1dvARB; -RGLSYMGLVERTEXATTRIB1FARBPROC __rglgen_glVertexAttrib1fARB; -RGLSYMGLVERTEXATTRIB1FVARBPROC __rglgen_glVertexAttrib1fvARB; -RGLSYMGLVERTEXATTRIB1SARBPROC __rglgen_glVertexAttrib1sARB; -RGLSYMGLVERTEXATTRIB1SVARBPROC __rglgen_glVertexAttrib1svARB; -RGLSYMGLVERTEXATTRIB2DARBPROC __rglgen_glVertexAttrib2dARB; -RGLSYMGLVERTEXATTRIB2DVARBPROC __rglgen_glVertexAttrib2dvARB; -RGLSYMGLVERTEXATTRIB2FARBPROC __rglgen_glVertexAttrib2fARB; -RGLSYMGLVERTEXATTRIB2FVARBPROC __rglgen_glVertexAttrib2fvARB; -RGLSYMGLVERTEXATTRIB2SARBPROC __rglgen_glVertexAttrib2sARB; -RGLSYMGLVERTEXATTRIB2SVARBPROC __rglgen_glVertexAttrib2svARB; -RGLSYMGLVERTEXATTRIB3DARBPROC __rglgen_glVertexAttrib3dARB; -RGLSYMGLVERTEXATTRIB3DVARBPROC __rglgen_glVertexAttrib3dvARB; -RGLSYMGLVERTEXATTRIB3FARBPROC __rglgen_glVertexAttrib3fARB; -RGLSYMGLVERTEXATTRIB3FVARBPROC __rglgen_glVertexAttrib3fvARB; -RGLSYMGLVERTEXATTRIB3SARBPROC __rglgen_glVertexAttrib3sARB; -RGLSYMGLVERTEXATTRIB3SVARBPROC __rglgen_glVertexAttrib3svARB; -RGLSYMGLVERTEXATTRIB4NBVARBPROC __rglgen_glVertexAttrib4NbvARB; -RGLSYMGLVERTEXATTRIB4NIVARBPROC __rglgen_glVertexAttrib4NivARB; -RGLSYMGLVERTEXATTRIB4NSVARBPROC __rglgen_glVertexAttrib4NsvARB; -RGLSYMGLVERTEXATTRIB4NUBARBPROC __rglgen_glVertexAttrib4NubARB; -RGLSYMGLVERTEXATTRIB4NUBVARBPROC __rglgen_glVertexAttrib4NubvARB; -RGLSYMGLVERTEXATTRIB4NUIVARBPROC __rglgen_glVertexAttrib4NuivARB; -RGLSYMGLVERTEXATTRIB4NUSVARBPROC __rglgen_glVertexAttrib4NusvARB; -RGLSYMGLVERTEXATTRIB4BVARBPROC __rglgen_glVertexAttrib4bvARB; -RGLSYMGLVERTEXATTRIB4DARBPROC __rglgen_glVertexAttrib4dARB; -RGLSYMGLVERTEXATTRIB4DVARBPROC __rglgen_glVertexAttrib4dvARB; -RGLSYMGLVERTEXATTRIB4FARBPROC __rglgen_glVertexAttrib4fARB; -RGLSYMGLVERTEXATTRIB4FVARBPROC __rglgen_glVertexAttrib4fvARB; -RGLSYMGLVERTEXATTRIB4IVARBPROC __rglgen_glVertexAttrib4ivARB; -RGLSYMGLVERTEXATTRIB4SARBPROC __rglgen_glVertexAttrib4sARB; -RGLSYMGLVERTEXATTRIB4SVARBPROC __rglgen_glVertexAttrib4svARB; -RGLSYMGLVERTEXATTRIB4UBVARBPROC __rglgen_glVertexAttrib4ubvARB; -RGLSYMGLVERTEXATTRIB4UIVARBPROC __rglgen_glVertexAttrib4uivARB; -RGLSYMGLVERTEXATTRIB4USVARBPROC __rglgen_glVertexAttrib4usvARB; -RGLSYMGLVERTEXATTRIBPOINTERARBPROC __rglgen_glVertexAttribPointerARB; -RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC __rglgen_glEnableVertexAttribArrayARB; -RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC __rglgen_glDisableVertexAttribArrayARB; -RGLSYMGLGETVERTEXATTRIBDVARBPROC __rglgen_glGetVertexAttribdvARB; -RGLSYMGLGETVERTEXATTRIBFVARBPROC __rglgen_glGetVertexAttribfvARB; -RGLSYMGLGETVERTEXATTRIBIVARBPROC __rglgen_glGetVertexAttribivARB; -RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC __rglgen_glGetVertexAttribPointervARB; -RGLSYMGLBINDATTRIBLOCATIONARBPROC __rglgen_glBindAttribLocationARB; -RGLSYMGLGETACTIVEATTRIBARBPROC __rglgen_glGetActiveAttribARB; -RGLSYMGLGETATTRIBLOCATIONARBPROC __rglgen_glGetAttribLocationARB; -RGLSYMGLWINDOWPOS2DARBPROC __rglgen_glWindowPos2dARB; -RGLSYMGLWINDOWPOS2DVARBPROC __rglgen_glWindowPos2dvARB; -RGLSYMGLWINDOWPOS2FARBPROC __rglgen_glWindowPos2fARB; -RGLSYMGLWINDOWPOS2FVARBPROC __rglgen_glWindowPos2fvARB; -RGLSYMGLWINDOWPOS2IARBPROC __rglgen_glWindowPos2iARB; -RGLSYMGLWINDOWPOS2IVARBPROC __rglgen_glWindowPos2ivARB; -RGLSYMGLWINDOWPOS2SARBPROC __rglgen_glWindowPos2sARB; -RGLSYMGLWINDOWPOS2SVARBPROC __rglgen_glWindowPos2svARB; -RGLSYMGLWINDOWPOS3DARBPROC __rglgen_glWindowPos3dARB; -RGLSYMGLWINDOWPOS3DVARBPROC __rglgen_glWindowPos3dvARB; -RGLSYMGLWINDOWPOS3FARBPROC __rglgen_glWindowPos3fARB; -RGLSYMGLWINDOWPOS3FVARBPROC __rglgen_glWindowPos3fvARB; -RGLSYMGLWINDOWPOS3IARBPROC __rglgen_glWindowPos3iARB; -RGLSYMGLWINDOWPOS3IVARBPROC __rglgen_glWindowPos3ivARB; -RGLSYMGLWINDOWPOS3SARBPROC __rglgen_glWindowPos3sARB; -RGLSYMGLWINDOWPOS3SVARBPROC __rglgen_glWindowPos3svARB; -RGLSYMGLMULTITEXCOORD1BOESPROC __rglgen_glMultiTexCoord1bOES; -RGLSYMGLMULTITEXCOORD1BVOESPROC __rglgen_glMultiTexCoord1bvOES; -RGLSYMGLMULTITEXCOORD2BOESPROC __rglgen_glMultiTexCoord2bOES; -RGLSYMGLMULTITEXCOORD2BVOESPROC __rglgen_glMultiTexCoord2bvOES; -RGLSYMGLMULTITEXCOORD3BOESPROC __rglgen_glMultiTexCoord3bOES; -RGLSYMGLMULTITEXCOORD3BVOESPROC __rglgen_glMultiTexCoord3bvOES; -RGLSYMGLMULTITEXCOORD4BOESPROC __rglgen_glMultiTexCoord4bOES; -RGLSYMGLMULTITEXCOORD4BVOESPROC __rglgen_glMultiTexCoord4bvOES; -RGLSYMGLTEXCOORD1BOESPROC __rglgen_glTexCoord1bOES; -RGLSYMGLTEXCOORD1BVOESPROC __rglgen_glTexCoord1bvOES; -RGLSYMGLTEXCOORD2BOESPROC __rglgen_glTexCoord2bOES; -RGLSYMGLTEXCOORD2BVOESPROC __rglgen_glTexCoord2bvOES; -RGLSYMGLTEXCOORD3BOESPROC __rglgen_glTexCoord3bOES; -RGLSYMGLTEXCOORD3BVOESPROC __rglgen_glTexCoord3bvOES; -RGLSYMGLTEXCOORD4BOESPROC __rglgen_glTexCoord4bOES; -RGLSYMGLTEXCOORD4BVOESPROC __rglgen_glTexCoord4bvOES; -RGLSYMGLVERTEX2BOESPROC __rglgen_glVertex2bOES; -RGLSYMGLVERTEX2BVOESPROC __rglgen_glVertex2bvOES; -RGLSYMGLVERTEX3BOESPROC __rglgen_glVertex3bOES; -RGLSYMGLVERTEX3BVOESPROC __rglgen_glVertex3bvOES; -RGLSYMGLVERTEX4BOESPROC __rglgen_glVertex4bOES; -RGLSYMGLVERTEX4BVOESPROC __rglgen_glVertex4bvOES; -RGLSYMGLALPHAFUNCXOESPROC __rglgen_glAlphaFuncxOES; -RGLSYMGLCLEARCOLORXOESPROC __rglgen_glClearColorxOES; -RGLSYMGLCLEARDEPTHXOESPROC __rglgen_glClearDepthxOES; -RGLSYMGLCLIPPLANEXOESPROC __rglgen_glClipPlanexOES; -RGLSYMGLCOLOR4XOESPROC __rglgen_glColor4xOES; -RGLSYMGLDEPTHRANGEXOESPROC __rglgen_glDepthRangexOES; -RGLSYMGLFOGXOESPROC __rglgen_glFogxOES; -RGLSYMGLFOGXVOESPROC __rglgen_glFogxvOES; -RGLSYMGLFRUSTUMXOESPROC __rglgen_glFrustumxOES; -RGLSYMGLGETCLIPPLANEXOESPROC __rglgen_glGetClipPlanexOES; -RGLSYMGLGETFIXEDVOESPROC __rglgen_glGetFixedvOES; -RGLSYMGLGETTEXENVXVOESPROC __rglgen_glGetTexEnvxvOES; -RGLSYMGLGETTEXPARAMETERXVOESPROC __rglgen_glGetTexParameterxvOES; -RGLSYMGLLIGHTMODELXOESPROC __rglgen_glLightModelxOES; -RGLSYMGLLIGHTMODELXVOESPROC __rglgen_glLightModelxvOES; -RGLSYMGLLIGHTXOESPROC __rglgen_glLightxOES; -RGLSYMGLLIGHTXVOESPROC __rglgen_glLightxvOES; -RGLSYMGLLINEWIDTHXOESPROC __rglgen_glLineWidthxOES; -RGLSYMGLLOADMATRIXXOESPROC __rglgen_glLoadMatrixxOES; -RGLSYMGLMATERIALXOESPROC __rglgen_glMaterialxOES; -RGLSYMGLMATERIALXVOESPROC __rglgen_glMaterialxvOES; -RGLSYMGLMULTMATRIXXOESPROC __rglgen_glMultMatrixxOES; -RGLSYMGLMULTITEXCOORD4XOESPROC __rglgen_glMultiTexCoord4xOES; -RGLSYMGLNORMAL3XOESPROC __rglgen_glNormal3xOES; -RGLSYMGLORTHOXOESPROC __rglgen_glOrthoxOES; -RGLSYMGLPOINTPARAMETERXVOESPROC __rglgen_glPointParameterxvOES; -RGLSYMGLPOINTSIZEXOESPROC __rglgen_glPointSizexOES; -RGLSYMGLPOLYGONOFFSETXOESPROC __rglgen_glPolygonOffsetxOES; -RGLSYMGLROTATEXOESPROC __rglgen_glRotatexOES; -RGLSYMGLSAMPLECOVERAGEOESPROC __rglgen_glSampleCoverageOES; -RGLSYMGLSCALEXOESPROC __rglgen_glScalexOES; -RGLSYMGLTEXENVXOESPROC __rglgen_glTexEnvxOES; -RGLSYMGLTEXENVXVOESPROC __rglgen_glTexEnvxvOES; -RGLSYMGLTEXPARAMETERXOESPROC __rglgen_glTexParameterxOES; -RGLSYMGLTEXPARAMETERXVOESPROC __rglgen_glTexParameterxvOES; -RGLSYMGLTRANSLATEXOESPROC __rglgen_glTranslatexOES; -RGLSYMGLACCUMXOESPROC __rglgen_glAccumxOES; -RGLSYMGLBITMAPXOESPROC __rglgen_glBitmapxOES; -RGLSYMGLBLENDCOLORXOESPROC __rglgen_glBlendColorxOES; -RGLSYMGLCLEARACCUMXOESPROC __rglgen_glClearAccumxOES; -RGLSYMGLCOLOR3XOESPROC __rglgen_glColor3xOES; -RGLSYMGLCOLOR3XVOESPROC __rglgen_glColor3xvOES; -RGLSYMGLCOLOR4XVOESPROC __rglgen_glColor4xvOES; -RGLSYMGLCONVOLUTIONPARAMETERXOESPROC __rglgen_glConvolutionParameterxOES; -RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC __rglgen_glConvolutionParameterxvOES; -RGLSYMGLEVALCOORD1XOESPROC __rglgen_glEvalCoord1xOES; -RGLSYMGLEVALCOORD1XVOESPROC __rglgen_glEvalCoord1xvOES; -RGLSYMGLEVALCOORD2XOESPROC __rglgen_glEvalCoord2xOES; -RGLSYMGLEVALCOORD2XVOESPROC __rglgen_glEvalCoord2xvOES; -RGLSYMGLFEEDBACKBUFFERXOESPROC __rglgen_glFeedbackBufferxOES; -RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC __rglgen_glGetConvolutionParameterxvOES; -RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC __rglgen_glGetHistogramParameterxvOES; -RGLSYMGLGETLIGHTXOESPROC __rglgen_glGetLightxOES; -RGLSYMGLGETMAPXVOESPROC __rglgen_glGetMapxvOES; -RGLSYMGLGETMATERIALXOESPROC __rglgen_glGetMaterialxOES; -RGLSYMGLGETPIXELMAPXVPROC __rglgen_glGetPixelMapxv; -RGLSYMGLGETTEXGENXVOESPROC __rglgen_glGetTexGenxvOES; -RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC __rglgen_glGetTexLevelParameterxvOES; -RGLSYMGLINDEXXOESPROC __rglgen_glIndexxOES; -RGLSYMGLINDEXXVOESPROC __rglgen_glIndexxvOES; -RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC __rglgen_glLoadTransposeMatrixxOES; -RGLSYMGLMAP1XOESPROC __rglgen_glMap1xOES; -RGLSYMGLMAP2XOESPROC __rglgen_glMap2xOES; -RGLSYMGLMAPGRID1XOESPROC __rglgen_glMapGrid1xOES; -RGLSYMGLMAPGRID2XOESPROC __rglgen_glMapGrid2xOES; -RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC __rglgen_glMultTransposeMatrixxOES; -RGLSYMGLMULTITEXCOORD1XOESPROC __rglgen_glMultiTexCoord1xOES; -RGLSYMGLMULTITEXCOORD1XVOESPROC __rglgen_glMultiTexCoord1xvOES; -RGLSYMGLMULTITEXCOORD2XOESPROC __rglgen_glMultiTexCoord2xOES; -RGLSYMGLMULTITEXCOORD2XVOESPROC __rglgen_glMultiTexCoord2xvOES; -RGLSYMGLMULTITEXCOORD3XOESPROC __rglgen_glMultiTexCoord3xOES; -RGLSYMGLMULTITEXCOORD3XVOESPROC __rglgen_glMultiTexCoord3xvOES; -RGLSYMGLMULTITEXCOORD4XVOESPROC __rglgen_glMultiTexCoord4xvOES; -RGLSYMGLNORMAL3XVOESPROC __rglgen_glNormal3xvOES; -RGLSYMGLPASSTHROUGHXOESPROC __rglgen_glPassThroughxOES; -RGLSYMGLPIXELMAPXPROC __rglgen_glPixelMapx; -RGLSYMGLPIXELSTOREXPROC __rglgen_glPixelStorex; -RGLSYMGLPIXELTRANSFERXOESPROC __rglgen_glPixelTransferxOES; -RGLSYMGLPIXELZOOMXOESPROC __rglgen_glPixelZoomxOES; -RGLSYMGLPRIORITIZETEXTURESXOESPROC __rglgen_glPrioritizeTexturesxOES; -RGLSYMGLRASTERPOS2XOESPROC __rglgen_glRasterPos2xOES; -RGLSYMGLRASTERPOS2XVOESPROC __rglgen_glRasterPos2xvOES; -RGLSYMGLRASTERPOS3XOESPROC __rglgen_glRasterPos3xOES; -RGLSYMGLRASTERPOS3XVOESPROC __rglgen_glRasterPos3xvOES; -RGLSYMGLRASTERPOS4XOESPROC __rglgen_glRasterPos4xOES; -RGLSYMGLRASTERPOS4XVOESPROC __rglgen_glRasterPos4xvOES; -RGLSYMGLRECTXOESPROC __rglgen_glRectxOES; -RGLSYMGLRECTXVOESPROC __rglgen_glRectxvOES; -RGLSYMGLTEXCOORD1XOESPROC __rglgen_glTexCoord1xOES; -RGLSYMGLTEXCOORD1XVOESPROC __rglgen_glTexCoord1xvOES; -RGLSYMGLTEXCOORD2XOESPROC __rglgen_glTexCoord2xOES; -RGLSYMGLTEXCOORD2XVOESPROC __rglgen_glTexCoord2xvOES; -RGLSYMGLTEXCOORD3XOESPROC __rglgen_glTexCoord3xOES; -RGLSYMGLTEXCOORD3XVOESPROC __rglgen_glTexCoord3xvOES; -RGLSYMGLTEXCOORD4XOESPROC __rglgen_glTexCoord4xOES; -RGLSYMGLTEXCOORD4XVOESPROC __rglgen_glTexCoord4xvOES; -RGLSYMGLTEXGENXOESPROC __rglgen_glTexGenxOES; -RGLSYMGLTEXGENXVOESPROC __rglgen_glTexGenxvOES; -RGLSYMGLVERTEX2XOESPROC __rglgen_glVertex2xOES; -RGLSYMGLVERTEX2XVOESPROC __rglgen_glVertex2xvOES; -RGLSYMGLVERTEX3XOESPROC __rglgen_glVertex3xOES; -RGLSYMGLVERTEX3XVOESPROC __rglgen_glVertex3xvOES; -RGLSYMGLVERTEX4XOESPROC __rglgen_glVertex4xOES; -RGLSYMGLVERTEX4XVOESPROC __rglgen_glVertex4xvOES; -RGLSYMGLQUERYMATRIXXOESPROC __rglgen_glQueryMatrixxOES; -RGLSYMGLCLEARDEPTHFOESPROC __rglgen_glClearDepthfOES; -RGLSYMGLCLIPPLANEFOESPROC __rglgen_glClipPlanefOES; -RGLSYMGLDEPTHRANGEFOESPROC __rglgen_glDepthRangefOES; -RGLSYMGLFRUSTUMFOESPROC __rglgen_glFrustumfOES; -RGLSYMGLGETCLIPPLANEFOESPROC __rglgen_glGetClipPlanefOES; -RGLSYMGLORTHOFOESPROC __rglgen_glOrthofOES; -RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC __rglgen_glImageTransformParameteriHP; -RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC __rglgen_glImageTransformParameterfHP; -RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glImageTransformParameterivHP; -RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glImageTransformParameterfvHP; -RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glGetImageTransformParameterivHP; -RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glGetImageTransformParameterfvHP; +RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +RGLSYMGLMAXSHADERCOMPILERTHREADSKHRPROC __rglgen_glMaxShaderCompilerThreadsKHR; +RGLSYMGLEGLIMAGETARGETTEXSTORAGEEXTPROC __rglgen_glEGLImageTargetTexStorageEXT; +RGLSYMGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC __rglgen_glEGLImageTargetTextureStorageEXT; +RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +RGLSYMGLMATRIXLOADFEXTPROC __rglgen_glMatrixLoadfEXT; +RGLSYMGLMATRIXLOADDEXTPROC __rglgen_glMatrixLoaddEXT; +RGLSYMGLMATRIXMULTFEXTPROC __rglgen_glMatrixMultfEXT; +RGLSYMGLMATRIXMULTDEXTPROC __rglgen_glMatrixMultdEXT; +RGLSYMGLMATRIXLOADIDENTITYEXTPROC __rglgen_glMatrixLoadIdentityEXT; +RGLSYMGLMATRIXROTATEFEXTPROC __rglgen_glMatrixRotatefEXT; +RGLSYMGLMATRIXROTATEDEXTPROC __rglgen_glMatrixRotatedEXT; +RGLSYMGLMATRIXSCALEFEXTPROC __rglgen_glMatrixScalefEXT; +RGLSYMGLMATRIXSCALEDEXTPROC __rglgen_glMatrixScaledEXT; +RGLSYMGLMATRIXTRANSLATEFEXTPROC __rglgen_glMatrixTranslatefEXT; +RGLSYMGLMATRIXTRANSLATEDEXTPROC __rglgen_glMatrixTranslatedEXT; +RGLSYMGLMATRIXFRUSTUMEXTPROC __rglgen_glMatrixFrustumEXT; +RGLSYMGLMATRIXORTHOEXTPROC __rglgen_glMatrixOrthoEXT; +RGLSYMGLMATRIXPOPEXTPROC __rglgen_glMatrixPopEXT; +RGLSYMGLMATRIXPUSHEXTPROC __rglgen_glMatrixPushEXT; +RGLSYMGLCLIENTATTRIBDEFAULTEXTPROC __rglgen_glClientAttribDefaultEXT; +RGLSYMGLPUSHCLIENTATTRIBDEFAULTEXTPROC __rglgen_glPushClientAttribDefaultEXT; +RGLSYMGLTEXTUREPARAMETERFEXTPROC __rglgen_glTextureParameterfEXT; +RGLSYMGLTEXTUREPARAMETERFVEXTPROC __rglgen_glTextureParameterfvEXT; +RGLSYMGLTEXTUREPARAMETERIEXTPROC __rglgen_glTextureParameteriEXT; +RGLSYMGLTEXTUREPARAMETERIVEXTPROC __rglgen_glTextureParameterivEXT; +RGLSYMGLTEXTUREIMAGE1DEXTPROC __rglgen_glTextureImage1DEXT; +RGLSYMGLTEXTUREIMAGE2DEXTPROC __rglgen_glTextureImage2DEXT; +RGLSYMGLTEXTURESUBIMAGE1DEXTPROC __rglgen_glTextureSubImage1DEXT; +RGLSYMGLTEXTURESUBIMAGE2DEXTPROC __rglgen_glTextureSubImage2DEXT; +RGLSYMGLCOPYTEXTUREIMAGE1DEXTPROC __rglgen_glCopyTextureImage1DEXT; +RGLSYMGLCOPYTEXTUREIMAGE2DEXTPROC __rglgen_glCopyTextureImage2DEXT; +RGLSYMGLCOPYTEXTURESUBIMAGE1DEXTPROC __rglgen_glCopyTextureSubImage1DEXT; +RGLSYMGLCOPYTEXTURESUBIMAGE2DEXTPROC __rglgen_glCopyTextureSubImage2DEXT; +RGLSYMGLGETTEXTUREIMAGEEXTPROC __rglgen_glGetTextureImageEXT; +RGLSYMGLGETTEXTUREPARAMETERFVEXTPROC __rglgen_glGetTextureParameterfvEXT; +RGLSYMGLGETTEXTUREPARAMETERIVEXTPROC __rglgen_glGetTextureParameterivEXT; +RGLSYMGLGETTEXTURELEVELPARAMETERFVEXTPROC __rglgen_glGetTextureLevelParameterfvEXT; +RGLSYMGLGETTEXTURELEVELPARAMETERIVEXTPROC __rglgen_glGetTextureLevelParameterivEXT; +RGLSYMGLTEXTUREIMAGE3DEXTPROC __rglgen_glTextureImage3DEXT; +RGLSYMGLTEXTURESUBIMAGE3DEXTPROC __rglgen_glTextureSubImage3DEXT; +RGLSYMGLCOPYTEXTURESUBIMAGE3DEXTPROC __rglgen_glCopyTextureSubImage3DEXT; +RGLSYMGLBINDMULTITEXTUREEXTPROC __rglgen_glBindMultiTextureEXT; +RGLSYMGLMULTITEXCOORDPOINTEREXTPROC __rglgen_glMultiTexCoordPointerEXT; +RGLSYMGLMULTITEXENVFEXTPROC __rglgen_glMultiTexEnvfEXT; +RGLSYMGLMULTITEXENVFVEXTPROC __rglgen_glMultiTexEnvfvEXT; +RGLSYMGLMULTITEXENVIEXTPROC __rglgen_glMultiTexEnviEXT; +RGLSYMGLMULTITEXENVIVEXTPROC __rglgen_glMultiTexEnvivEXT; +RGLSYMGLMULTITEXGENDEXTPROC __rglgen_glMultiTexGendEXT; +RGLSYMGLMULTITEXGENDVEXTPROC __rglgen_glMultiTexGendvEXT; +RGLSYMGLMULTITEXGENFEXTPROC __rglgen_glMultiTexGenfEXT; +RGLSYMGLMULTITEXGENFVEXTPROC __rglgen_glMultiTexGenfvEXT; +RGLSYMGLMULTITEXGENIEXTPROC __rglgen_glMultiTexGeniEXT; +RGLSYMGLMULTITEXGENIVEXTPROC __rglgen_glMultiTexGenivEXT; +RGLSYMGLGETMULTITEXENVFVEXTPROC __rglgen_glGetMultiTexEnvfvEXT; +RGLSYMGLGETMULTITEXENVIVEXTPROC __rglgen_glGetMultiTexEnvivEXT; +RGLSYMGLGETMULTITEXGENDVEXTPROC __rglgen_glGetMultiTexGendvEXT; +RGLSYMGLGETMULTITEXGENFVEXTPROC __rglgen_glGetMultiTexGenfvEXT; +RGLSYMGLGETMULTITEXGENIVEXTPROC __rglgen_glGetMultiTexGenivEXT; +RGLSYMGLMULTITEXPARAMETERIEXTPROC __rglgen_glMultiTexParameteriEXT; +RGLSYMGLMULTITEXPARAMETERIVEXTPROC __rglgen_glMultiTexParameterivEXT; +RGLSYMGLMULTITEXPARAMETERFEXTPROC __rglgen_glMultiTexParameterfEXT; +RGLSYMGLMULTITEXPARAMETERFVEXTPROC __rglgen_glMultiTexParameterfvEXT; +RGLSYMGLMULTITEXIMAGE1DEXTPROC __rglgen_glMultiTexImage1DEXT; +RGLSYMGLMULTITEXIMAGE2DEXTPROC __rglgen_glMultiTexImage2DEXT; +RGLSYMGLMULTITEXSUBIMAGE1DEXTPROC __rglgen_glMultiTexSubImage1DEXT; +RGLSYMGLMULTITEXSUBIMAGE2DEXTPROC __rglgen_glMultiTexSubImage2DEXT; +RGLSYMGLCOPYMULTITEXIMAGE1DEXTPROC __rglgen_glCopyMultiTexImage1DEXT; +RGLSYMGLCOPYMULTITEXIMAGE2DEXTPROC __rglgen_glCopyMultiTexImage2DEXT; +RGLSYMGLCOPYMULTITEXSUBIMAGE1DEXTPROC __rglgen_glCopyMultiTexSubImage1DEXT; +RGLSYMGLCOPYMULTITEXSUBIMAGE2DEXTPROC __rglgen_glCopyMultiTexSubImage2DEXT; +RGLSYMGLGETMULTITEXIMAGEEXTPROC __rglgen_glGetMultiTexImageEXT; +RGLSYMGLGETMULTITEXPARAMETERFVEXTPROC __rglgen_glGetMultiTexParameterfvEXT; +RGLSYMGLGETMULTITEXPARAMETERIVEXTPROC __rglgen_glGetMultiTexParameterivEXT; +RGLSYMGLGETMULTITEXLEVELPARAMETERFVEXTPROC __rglgen_glGetMultiTexLevelParameterfvEXT; +RGLSYMGLGETMULTITEXLEVELPARAMETERIVEXTPROC __rglgen_glGetMultiTexLevelParameterivEXT; +RGLSYMGLMULTITEXIMAGE3DEXTPROC __rglgen_glMultiTexImage3DEXT; +RGLSYMGLMULTITEXSUBIMAGE3DEXTPROC __rglgen_glMultiTexSubImage3DEXT; +RGLSYMGLCOPYMULTITEXSUBIMAGE3DEXTPROC __rglgen_glCopyMultiTexSubImage3DEXT; +RGLSYMGLENABLECLIENTSTATEINDEXEDEXTPROC __rglgen_glEnableClientStateIndexedEXT; +RGLSYMGLDISABLECLIENTSTATEINDEXEDEXTPROC __rglgen_glDisableClientStateIndexedEXT; +RGLSYMGLGETFLOATINDEXEDVEXTPROC __rglgen_glGetFloatIndexedvEXT; +RGLSYMGLGETDOUBLEINDEXEDVEXTPROC __rglgen_glGetDoubleIndexedvEXT; +RGLSYMGLGETPOINTERINDEXEDVEXTPROC __rglgen_glGetPointerIndexedvEXT; +RGLSYMGLENABLEINDEXEDEXTPROC __rglgen_glEnableIndexedEXT; +RGLSYMGLDISABLEINDEXEDEXTPROC __rglgen_glDisableIndexedEXT; +RGLSYMGLISENABLEDINDEXEDEXTPROC __rglgen_glIsEnabledIndexedEXT; +RGLSYMGLGETINTEGERINDEXEDVEXTPROC __rglgen_glGetIntegerIndexedvEXT; +RGLSYMGLGETBOOLEANINDEXEDVEXTPROC __rglgen_glGetBooleanIndexedvEXT; +RGLSYMGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __rglgen_glCompressedTextureImage3DEXT; +RGLSYMGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __rglgen_glCompressedTextureImage2DEXT; +RGLSYMGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __rglgen_glCompressedTextureImage1DEXT; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __rglgen_glCompressedTextureSubImage3DEXT; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __rglgen_glCompressedTextureSubImage2DEXT; +RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __rglgen_glCompressedTextureSubImage1DEXT; +RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __rglgen_glGetCompressedTextureImageEXT; +RGLSYMGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __rglgen_glCompressedMultiTexImage3DEXT; +RGLSYMGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __rglgen_glCompressedMultiTexImage2DEXT; +RGLSYMGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __rglgen_glCompressedMultiTexImage1DEXT; +RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __rglgen_glCompressedMultiTexSubImage3DEXT; +RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __rglgen_glCompressedMultiTexSubImage2DEXT; +RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __rglgen_glCompressedMultiTexSubImage1DEXT; +RGLSYMGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __rglgen_glGetCompressedMultiTexImageEXT; +RGLSYMGLMATRIXLOADTRANSPOSEFEXTPROC __rglgen_glMatrixLoadTransposefEXT; +RGLSYMGLMATRIXLOADTRANSPOSEDEXTPROC __rglgen_glMatrixLoadTransposedEXT; +RGLSYMGLMATRIXMULTTRANSPOSEFEXTPROC __rglgen_glMatrixMultTransposefEXT; +RGLSYMGLMATRIXMULTTRANSPOSEDEXTPROC __rglgen_glMatrixMultTransposedEXT; +RGLSYMGLNAMEDBUFFERDATAEXTPROC __rglgen_glNamedBufferDataEXT; +RGLSYMGLNAMEDBUFFERSUBDATAEXTPROC __rglgen_glNamedBufferSubDataEXT; +RGLSYMGLMAPNAMEDBUFFEREXTPROC __rglgen_glMapNamedBufferEXT; +RGLSYMGLUNMAPNAMEDBUFFEREXTPROC __rglgen_glUnmapNamedBufferEXT; +RGLSYMGLGETNAMEDBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedBufferParameterivEXT; +RGLSYMGLGETNAMEDBUFFERPOINTERVEXTPROC __rglgen_glGetNamedBufferPointervEXT; +RGLSYMGLGETNAMEDBUFFERSUBDATAEXTPROC __rglgen_glGetNamedBufferSubDataEXT; +RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +RGLSYMGLTEXTUREBUFFEREXTPROC __rglgen_glTextureBufferEXT; +RGLSYMGLMULTITEXBUFFEREXTPROC __rglgen_glMultiTexBufferEXT; +RGLSYMGLTEXTUREPARAMETERIIVEXTPROC __rglgen_glTextureParameterIivEXT; +RGLSYMGLTEXTUREPARAMETERIUIVEXTPROC __rglgen_glTextureParameterIuivEXT; +RGLSYMGLGETTEXTUREPARAMETERIIVEXTPROC __rglgen_glGetTextureParameterIivEXT; +RGLSYMGLGETTEXTUREPARAMETERIUIVEXTPROC __rglgen_glGetTextureParameterIuivEXT; +RGLSYMGLMULTITEXPARAMETERIIVEXTPROC __rglgen_glMultiTexParameterIivEXT; +RGLSYMGLMULTITEXPARAMETERIUIVEXTPROC __rglgen_glMultiTexParameterIuivEXT; +RGLSYMGLGETMULTITEXPARAMETERIIVEXTPROC __rglgen_glGetMultiTexParameterIivEXT; +RGLSYMGLGETMULTITEXPARAMETERIUIVEXTPROC __rglgen_glGetMultiTexParameterIuivEXT; +RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __rglgen_glNamedProgramLocalParameters4fvEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __rglgen_glNamedProgramLocalParameterI4iEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __rglgen_glNamedProgramLocalParameterI4ivEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __rglgen_glNamedProgramLocalParametersI4ivEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __rglgen_glNamedProgramLocalParameterI4uiEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __rglgen_glNamedProgramLocalParameterI4uivEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __rglgen_glNamedProgramLocalParametersI4uivEXT; +RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __rglgen_glGetNamedProgramLocalParameterIivEXT; +RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __rglgen_glGetNamedProgramLocalParameterIuivEXT; +RGLSYMGLENABLECLIENTSTATEIEXTPROC __rglgen_glEnableClientStateiEXT; +RGLSYMGLDISABLECLIENTSTATEIEXTPROC __rglgen_glDisableClientStateiEXT; +RGLSYMGLGETFLOATI_VEXTPROC __rglgen_glGetFloati_vEXT; +RGLSYMGLGETDOUBLEI_VEXTPROC __rglgen_glGetDoublei_vEXT; +RGLSYMGLGETPOINTERI_VEXTPROC __rglgen_glGetPointeri_vEXT; +RGLSYMGLNAMEDPROGRAMSTRINGEXTPROC __rglgen_glNamedProgramStringEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __rglgen_glNamedProgramLocalParameter4dEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __rglgen_glNamedProgramLocalParameter4dvEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __rglgen_glNamedProgramLocalParameter4fEXT; +RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __rglgen_glNamedProgramLocalParameter4fvEXT; +RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __rglgen_glGetNamedProgramLocalParameterdvEXT; +RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __rglgen_glGetNamedProgramLocalParameterfvEXT; +RGLSYMGLGETNAMEDPROGRAMIVEXTPROC __rglgen_glGetNamedProgramivEXT; +RGLSYMGLGETNAMEDPROGRAMSTRINGEXTPROC __rglgen_glGetNamedProgramStringEXT; +RGLSYMGLNAMEDRENDERBUFFERSTORAGEEXTPROC __rglgen_glNamedRenderbufferStorageEXT; +RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedRenderbufferParameterivEXT; +RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glNamedRenderbufferStorageMultisampleEXT; +RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __rglgen_glNamedRenderbufferStorageMultisampleCoverageEXT; +RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __rglgen_glCheckNamedFramebufferStatusEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __rglgen_glNamedFramebufferTexture1DEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __rglgen_glNamedFramebufferTexture2DEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __rglgen_glNamedFramebufferTexture3DEXT; +RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __rglgen_glNamedFramebufferRenderbufferEXT; +RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __rglgen_glGetNamedFramebufferAttachmentParameterivEXT; +RGLSYMGLGENERATETEXTUREMIPMAPEXTPROC __rglgen_glGenerateTextureMipmapEXT; +RGLSYMGLGENERATEMULTITEXMIPMAPEXTPROC __rglgen_glGenerateMultiTexMipmapEXT; +RGLSYMGLFRAMEBUFFERDRAWBUFFEREXTPROC __rglgen_glFramebufferDrawBufferEXT; +RGLSYMGLFRAMEBUFFERDRAWBUFFERSEXTPROC __rglgen_glFramebufferDrawBuffersEXT; +RGLSYMGLFRAMEBUFFERREADBUFFEREXTPROC __rglgen_glFramebufferReadBufferEXT; +RGLSYMGLGETFRAMEBUFFERPARAMETERIVEXTPROC __rglgen_glGetFramebufferParameterivEXT; +RGLSYMGLNAMEDCOPYBUFFERSUBDATAEXTPROC __rglgen_glNamedCopyBufferSubDataEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __rglgen_glNamedFramebufferTextureEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __rglgen_glNamedFramebufferTextureLayerEXT; +RGLSYMGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __rglgen_glNamedFramebufferTextureFaceEXT; +RGLSYMGLTEXTURERENDERBUFFEREXTPROC __rglgen_glTextureRenderbufferEXT; +RGLSYMGLMULTITEXRENDERBUFFEREXTPROC __rglgen_glMultiTexRenderbufferEXT; +RGLSYMGLVERTEXARRAYVERTEXOFFSETEXTPROC __rglgen_glVertexArrayVertexOffsetEXT; +RGLSYMGLVERTEXARRAYCOLOROFFSETEXTPROC __rglgen_glVertexArrayColorOffsetEXT; +RGLSYMGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __rglgen_glVertexArrayEdgeFlagOffsetEXT; +RGLSYMGLVERTEXARRAYINDEXOFFSETEXTPROC __rglgen_glVertexArrayIndexOffsetEXT; +RGLSYMGLVERTEXARRAYNORMALOFFSETEXTPROC __rglgen_glVertexArrayNormalOffsetEXT; +RGLSYMGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __rglgen_glVertexArrayTexCoordOffsetEXT; +RGLSYMGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __rglgen_glVertexArrayMultiTexCoordOffsetEXT; +RGLSYMGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __rglgen_glVertexArrayFogCoordOffsetEXT; +RGLSYMGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __rglgen_glVertexArraySecondaryColorOffsetEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribOffsetEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribIOffsetEXT; +RGLSYMGLENABLEVERTEXARRAYEXTPROC __rglgen_glEnableVertexArrayEXT; +RGLSYMGLDISABLEVERTEXARRAYEXTPROC __rglgen_glDisableVertexArrayEXT; +RGLSYMGLENABLEVERTEXARRAYATTRIBEXTPROC __rglgen_glEnableVertexArrayAttribEXT; +RGLSYMGLDISABLEVERTEXARRAYATTRIBEXTPROC __rglgen_glDisableVertexArrayAttribEXT; +RGLSYMGLGETVERTEXARRAYINTEGERVEXTPROC __rglgen_glGetVertexArrayIntegervEXT; +RGLSYMGLGETVERTEXARRAYPOINTERVEXTPROC __rglgen_glGetVertexArrayPointervEXT; +RGLSYMGLGETVERTEXARRAYINTEGERI_VEXTPROC __rglgen_glGetVertexArrayIntegeri_vEXT; +RGLSYMGLGETVERTEXARRAYPOINTERI_VEXTPROC __rglgen_glGetVertexArrayPointeri_vEXT; +RGLSYMGLMAPNAMEDBUFFERRANGEEXTPROC __rglgen_glMapNamedBufferRangeEXT; +RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedNamedBufferRangeEXT; +RGLSYMGLNAMEDBUFFERSTORAGEEXTPROC __rglgen_glNamedBufferStorageEXT; +RGLSYMGLCLEARNAMEDBUFFERDATAEXTPROC __rglgen_glClearNamedBufferDataEXT; +RGLSYMGLCLEARNAMEDBUFFERSUBDATAEXTPROC __rglgen_glClearNamedBufferSubDataEXT; +RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __rglgen_glNamedFramebufferParameteriEXT; +RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedFramebufferParameterivEXT; +RGLSYMGLPROGRAMUNIFORM1DEXTPROC __rglgen_glProgramUniform1dEXT; +RGLSYMGLPROGRAMUNIFORM2DEXTPROC __rglgen_glProgramUniform2dEXT; +RGLSYMGLPROGRAMUNIFORM3DEXTPROC __rglgen_glProgramUniform3dEXT; +RGLSYMGLPROGRAMUNIFORM4DEXTPROC __rglgen_glProgramUniform4dEXT; +RGLSYMGLPROGRAMUNIFORM1DVEXTPROC __rglgen_glProgramUniform1dvEXT; +RGLSYMGLPROGRAMUNIFORM2DVEXTPROC __rglgen_glProgramUniform2dvEXT; +RGLSYMGLPROGRAMUNIFORM3DVEXTPROC __rglgen_glProgramUniform3dvEXT; +RGLSYMGLPROGRAMUNIFORM4DVEXTPROC __rglgen_glProgramUniform4dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2DVEXTPROC __rglgen_glProgramUniformMatrix2dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3DVEXTPROC __rglgen_glProgramUniformMatrix3dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4DVEXTPROC __rglgen_glProgramUniformMatrix4dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __rglgen_glProgramUniformMatrix2x3dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __rglgen_glProgramUniformMatrix2x4dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __rglgen_glProgramUniformMatrix3x2dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __rglgen_glProgramUniformMatrix3x4dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __rglgen_glProgramUniformMatrix4x2dvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __rglgen_glProgramUniformMatrix4x3dvEXT; +RGLSYMGLTEXTUREBUFFERRANGEEXTPROC __rglgen_glTextureBufferRangeEXT; +RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __rglgen_glTextureStorage2DMultisampleEXT; +RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __rglgen_glTextureStorage3DMultisampleEXT; +RGLSYMGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __rglgen_glVertexArrayBindVertexBufferEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __rglgen_glVertexArrayVertexAttribFormatEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __rglgen_glVertexArrayVertexAttribIFormatEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __rglgen_glVertexArrayVertexAttribLFormatEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __rglgen_glVertexArrayVertexAttribBindingEXT; +RGLSYMGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __rglgen_glVertexArrayVertexBindingDivisorEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribLOffsetEXT; +RGLSYMGLTEXTUREPAGECOMMITMENTEXTPROC __rglgen_glTexturePageCommitmentEXT; +RGLSYMGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexArrayVertexAttribDivisorEXT; +RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +RGLSYMGLUSESHADERPROGRAMEXTPROC __rglgen_glUseShaderProgramEXT; +RGLSYMGLACTIVEPROGRAMEXTPROC __rglgen_glActiveProgramEXT; +RGLSYMGLCREATESHADERPROGRAMEXTPROC __rglgen_glCreateShaderProgramEXT; +RGLSYMGLFRAMEBUFFERFETCHBARRIEREXTPROC __rglgen_glFramebufferFetchBarrierEXT; +RGLSYMGLWINDOWRECTANGLESEXTPROC __rglgen_glWindowRectanglesEXT; +RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __rglgen_glMultiDrawArraysIndirectBindlessNV; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __rglgen_glMultiDrawElementsIndirectBindlessNV; +RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __rglgen_glMultiDrawArraysIndirectBindlessCountNV; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __rglgen_glMultiDrawElementsIndirectBindlessCountNV; +RGLSYMGLGETTEXTUREHANDLENVPROC __rglgen_glGetTextureHandleNV; +RGLSYMGLGETTEXTURESAMPLERHANDLENVPROC __rglgen_glGetTextureSamplerHandleNV; +RGLSYMGLMAKETEXTUREHANDLERESIDENTNVPROC __rglgen_glMakeTextureHandleResidentNV; +RGLSYMGLMAKETEXTUREHANDLENONRESIDENTNVPROC __rglgen_glMakeTextureHandleNonResidentNV; +RGLSYMGLGETIMAGEHANDLENVPROC __rglgen_glGetImageHandleNV; +RGLSYMGLMAKEIMAGEHANDLERESIDENTNVPROC __rglgen_glMakeImageHandleResidentNV; +RGLSYMGLMAKEIMAGEHANDLENONRESIDENTNVPROC __rglgen_glMakeImageHandleNonResidentNV; +RGLSYMGLUNIFORMHANDLEUI64NVPROC __rglgen_glUniformHandleui64NV; +RGLSYMGLUNIFORMHANDLEUI64VNVPROC __rglgen_glUniformHandleui64vNV; +RGLSYMGLPROGRAMUNIFORMHANDLEUI64NVPROC __rglgen_glProgramUniformHandleui64NV; +RGLSYMGLPROGRAMUNIFORMHANDLEUI64VNVPROC __rglgen_glProgramUniformHandleui64vNV; +RGLSYMGLISTEXTUREHANDLERESIDENTNVPROC __rglgen_glIsTextureHandleResidentNV; +RGLSYMGLISIMAGEHANDLERESIDENTNVPROC __rglgen_glIsImageHandleResidentNV; +RGLSYMGLBLENDPARAMETERINVPROC __rglgen_glBlendParameteriNV; +RGLSYMGLBLENDBARRIERNVPROC __rglgen_glBlendBarrierNV; +RGLSYMGLVIEWPORTPOSITIONWSCALENVPROC __rglgen_glViewportPositionWScaleNV; +RGLSYMGLCREATESTATESNVPROC __rglgen_glCreateStatesNV; +RGLSYMGLDELETESTATESNVPROC __rglgen_glDeleteStatesNV; +RGLSYMGLISSTATENVPROC __rglgen_glIsStateNV; +RGLSYMGLSTATECAPTURENVPROC __rglgen_glStateCaptureNV; +RGLSYMGLGETCOMMANDHEADERNVPROC __rglgen_glGetCommandHeaderNV; +RGLSYMGLGETSTAGEINDEXNVPROC __rglgen_glGetStageIndexNV; +RGLSYMGLDRAWCOMMANDSNVPROC __rglgen_glDrawCommandsNV; +RGLSYMGLDRAWCOMMANDSADDRESSNVPROC __rglgen_glDrawCommandsAddressNV; +RGLSYMGLDRAWCOMMANDSSTATESNVPROC __rglgen_glDrawCommandsStatesNV; +RGLSYMGLDRAWCOMMANDSSTATESADDRESSNVPROC __rglgen_glDrawCommandsStatesAddressNV; +RGLSYMGLCREATECOMMANDLISTSNVPROC __rglgen_glCreateCommandListsNV; +RGLSYMGLDELETECOMMANDLISTSNVPROC __rglgen_glDeleteCommandListsNV; +RGLSYMGLISCOMMANDLISTNVPROC __rglgen_glIsCommandListNV; +RGLSYMGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __rglgen_glListDrawCommandsStatesClientNV; +RGLSYMGLCOMMANDLISTSEGMENTSNVPROC __rglgen_glCommandListSegmentsNV; +RGLSYMGLCOMPILECOMMANDLISTNVPROC __rglgen_glCompileCommandListNV; +RGLSYMGLCALLCOMMANDLISTNVPROC __rglgen_glCallCommandListNV; +RGLSYMGLBEGINCONDITIONALRENDERNVPROC __rglgen_glBeginConditionalRenderNV; +RGLSYMGLENDCONDITIONALRENDERNVPROC __rglgen_glEndConditionalRenderNV; +RGLSYMGLSUBPIXELPRECISIONBIASNVPROC __rglgen_glSubpixelPrecisionBiasNV; +RGLSYMGLCONSERVATIVERASTERPARAMETERFNVPROC __rglgen_glConservativeRasterParameterfNV; +RGLSYMGLCONSERVATIVERASTERPARAMETERINVPROC __rglgen_glConservativeRasterParameteriNV; +RGLSYMGLDRAWVKIMAGENVPROC __rglgen_glDrawVkImageNV; +RGLSYMGLWAITVKSEMAPHORENVPROC __rglgen_glWaitVkSemaphoreNV; +RGLSYMGLSIGNALVKSEMAPHORENVPROC __rglgen_glSignalVkSemaphoreNV; +RGLSYMGLSIGNALVKFENCENVPROC __rglgen_glSignalVkFenceNV; +RGLSYMGLFRAGMENTCOVERAGECOLORNVPROC __rglgen_glFragmentCoverageColorNV; +RGLSYMGLCOVERAGEMODULATIONTABLENVPROC __rglgen_glCoverageModulationTableNV; +RGLSYMGLGETCOVERAGEMODULATIONTABLENVPROC __rglgen_glGetCoverageModulationTableNV; +RGLSYMGLCOVERAGEMODULATIONNVPROC __rglgen_glCoverageModulationNV; +RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __rglgen_glRenderbufferStorageMultisampleCoverageNV; +RGLSYMGLUNIFORM1I64NVPROC __rglgen_glUniform1i64NV; +RGLSYMGLUNIFORM2I64NVPROC __rglgen_glUniform2i64NV; +RGLSYMGLUNIFORM3I64NVPROC __rglgen_glUniform3i64NV; +RGLSYMGLUNIFORM4I64NVPROC __rglgen_glUniform4i64NV; +RGLSYMGLUNIFORM1I64VNVPROC __rglgen_glUniform1i64vNV; +RGLSYMGLUNIFORM2I64VNVPROC __rglgen_glUniform2i64vNV; +RGLSYMGLUNIFORM3I64VNVPROC __rglgen_glUniform3i64vNV; +RGLSYMGLUNIFORM4I64VNVPROC __rglgen_glUniform4i64vNV; +RGLSYMGLUNIFORM1UI64NVPROC __rglgen_glUniform1ui64NV; +RGLSYMGLUNIFORM2UI64NVPROC __rglgen_glUniform2ui64NV; +RGLSYMGLUNIFORM3UI64NVPROC __rglgen_glUniform3ui64NV; +RGLSYMGLUNIFORM4UI64NVPROC __rglgen_glUniform4ui64NV; +RGLSYMGLUNIFORM1UI64VNVPROC __rglgen_glUniform1ui64vNV; +RGLSYMGLUNIFORM2UI64VNVPROC __rglgen_glUniform2ui64vNV; +RGLSYMGLUNIFORM3UI64VNVPROC __rglgen_glUniform3ui64vNV; +RGLSYMGLUNIFORM4UI64VNVPROC __rglgen_glUniform4ui64vNV; +RGLSYMGLGETUNIFORMI64VNVPROC __rglgen_glGetUniformi64vNV; +RGLSYMGLPROGRAMUNIFORM1I64NVPROC __rglgen_glProgramUniform1i64NV; +RGLSYMGLPROGRAMUNIFORM2I64NVPROC __rglgen_glProgramUniform2i64NV; +RGLSYMGLPROGRAMUNIFORM3I64NVPROC __rglgen_glProgramUniform3i64NV; +RGLSYMGLPROGRAMUNIFORM4I64NVPROC __rglgen_glProgramUniform4i64NV; +RGLSYMGLPROGRAMUNIFORM1I64VNVPROC __rglgen_glProgramUniform1i64vNV; +RGLSYMGLPROGRAMUNIFORM2I64VNVPROC __rglgen_glProgramUniform2i64vNV; +RGLSYMGLPROGRAMUNIFORM3I64VNVPROC __rglgen_glProgramUniform3i64vNV; +RGLSYMGLPROGRAMUNIFORM4I64VNVPROC __rglgen_glProgramUniform4i64vNV; +RGLSYMGLPROGRAMUNIFORM1UI64NVPROC __rglgen_glProgramUniform1ui64NV; +RGLSYMGLPROGRAMUNIFORM2UI64NVPROC __rglgen_glProgramUniform2ui64NV; +RGLSYMGLPROGRAMUNIFORM3UI64NVPROC __rglgen_glProgramUniform3ui64NV; +RGLSYMGLPROGRAMUNIFORM4UI64NVPROC __rglgen_glProgramUniform4ui64NV; +RGLSYMGLPROGRAMUNIFORM1UI64VNVPROC __rglgen_glProgramUniform1ui64vNV; +RGLSYMGLPROGRAMUNIFORM2UI64VNVPROC __rglgen_glProgramUniform2ui64vNV; +RGLSYMGLPROGRAMUNIFORM3UI64VNVPROC __rglgen_glProgramUniform3ui64vNV; +RGLSYMGLPROGRAMUNIFORM4UI64VNVPROC __rglgen_glProgramUniform4ui64vNV; +RGLSYMGLGETINTERNALFORMATSAMPLEIVNVPROC __rglgen_glGetInternalformatSampleivNV; +RGLSYMGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC __rglgen_glGetMemoryObjectDetachedResourcesuivNV; +RGLSYMGLRESETMEMORYOBJECTPARAMETERNVPROC __rglgen_glResetMemoryObjectParameterNV; +RGLSYMGLTEXATTACHMEMORYNVPROC __rglgen_glTexAttachMemoryNV; +RGLSYMGLBUFFERATTACHMEMORYNVPROC __rglgen_glBufferAttachMemoryNV; +RGLSYMGLTEXTUREATTACHMEMORYNVPROC __rglgen_glTextureAttachMemoryNV; +RGLSYMGLNAMEDBUFFERATTACHMEMORYNVPROC __rglgen_glNamedBufferAttachMemoryNV; +RGLSYMGLDRAWMESHTASKSNVPROC __rglgen_glDrawMeshTasksNV; +RGLSYMGLDRAWMESHTASKSINDIRECTNVPROC __rglgen_glDrawMeshTasksIndirectNV; +RGLSYMGLMULTIDRAWMESHTASKSINDIRECTNVPROC __rglgen_glMultiDrawMeshTasksIndirectNV; +RGLSYMGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC __rglgen_glMultiDrawMeshTasksIndirectCountNV; +RGLSYMGLGENPATHSNVPROC __rglgen_glGenPathsNV; +RGLSYMGLDELETEPATHSNVPROC __rglgen_glDeletePathsNV; +RGLSYMGLISPATHNVPROC __rglgen_glIsPathNV; +RGLSYMGLPATHCOMMANDSNVPROC __rglgen_glPathCommandsNV; +RGLSYMGLPATHCOORDSNVPROC __rglgen_glPathCoordsNV; +RGLSYMGLPATHSUBCOMMANDSNVPROC __rglgen_glPathSubCommandsNV; +RGLSYMGLPATHSUBCOORDSNVPROC __rglgen_glPathSubCoordsNV; +RGLSYMGLPATHSTRINGNVPROC __rglgen_glPathStringNV; +RGLSYMGLPATHGLYPHSNVPROC __rglgen_glPathGlyphsNV; +RGLSYMGLPATHGLYPHRANGENVPROC __rglgen_glPathGlyphRangeNV; +RGLSYMGLWEIGHTPATHSNVPROC __rglgen_glWeightPathsNV; +RGLSYMGLCOPYPATHNVPROC __rglgen_glCopyPathNV; +RGLSYMGLINTERPOLATEPATHSNVPROC __rglgen_glInterpolatePathsNV; +RGLSYMGLTRANSFORMPATHNVPROC __rglgen_glTransformPathNV; +RGLSYMGLPATHPARAMETERIVNVPROC __rglgen_glPathParameterivNV; +RGLSYMGLPATHPARAMETERINVPROC __rglgen_glPathParameteriNV; +RGLSYMGLPATHPARAMETERFVNVPROC __rglgen_glPathParameterfvNV; +RGLSYMGLPATHPARAMETERFNVPROC __rglgen_glPathParameterfNV; +RGLSYMGLPATHDASHARRAYNVPROC __rglgen_glPathDashArrayNV; +RGLSYMGLPATHSTENCILFUNCNVPROC __rglgen_glPathStencilFuncNV; +RGLSYMGLPATHSTENCILDEPTHOFFSETNVPROC __rglgen_glPathStencilDepthOffsetNV; +RGLSYMGLSTENCILFILLPATHNVPROC __rglgen_glStencilFillPathNV; +RGLSYMGLSTENCILSTROKEPATHNVPROC __rglgen_glStencilStrokePathNV; +RGLSYMGLSTENCILFILLPATHINSTANCEDNVPROC __rglgen_glStencilFillPathInstancedNV; +RGLSYMGLSTENCILSTROKEPATHINSTANCEDNVPROC __rglgen_glStencilStrokePathInstancedNV; +RGLSYMGLPATHCOVERDEPTHFUNCNVPROC __rglgen_glPathCoverDepthFuncNV; +RGLSYMGLCOVERFILLPATHNVPROC __rglgen_glCoverFillPathNV; +RGLSYMGLCOVERSTROKEPATHNVPROC __rglgen_glCoverStrokePathNV; +RGLSYMGLCOVERFILLPATHINSTANCEDNVPROC __rglgen_glCoverFillPathInstancedNV; +RGLSYMGLCOVERSTROKEPATHINSTANCEDNVPROC __rglgen_glCoverStrokePathInstancedNV; +RGLSYMGLGETPATHPARAMETERIVNVPROC __rglgen_glGetPathParameterivNV; +RGLSYMGLGETPATHPARAMETERFVNVPROC __rglgen_glGetPathParameterfvNV; +RGLSYMGLGETPATHCOMMANDSNVPROC __rglgen_glGetPathCommandsNV; +RGLSYMGLGETPATHCOORDSNVPROC __rglgen_glGetPathCoordsNV; +RGLSYMGLGETPATHDASHARRAYNVPROC __rglgen_glGetPathDashArrayNV; +RGLSYMGLGETPATHMETRICSNVPROC __rglgen_glGetPathMetricsNV; +RGLSYMGLGETPATHMETRICRANGENVPROC __rglgen_glGetPathMetricRangeNV; +RGLSYMGLGETPATHSPACINGNVPROC __rglgen_glGetPathSpacingNV; +RGLSYMGLISPOINTINFILLPATHNVPROC __rglgen_glIsPointInFillPathNV; +RGLSYMGLISPOINTINSTROKEPATHNVPROC __rglgen_glIsPointInStrokePathNV; +RGLSYMGLGETPATHLENGTHNVPROC __rglgen_glGetPathLengthNV; +RGLSYMGLPOINTALONGPATHNVPROC __rglgen_glPointAlongPathNV; +RGLSYMGLMATRIXLOAD3X2FNVPROC __rglgen_glMatrixLoad3x2fNV; +RGLSYMGLMATRIXLOAD3X3FNVPROC __rglgen_glMatrixLoad3x3fNV; +RGLSYMGLMATRIXLOADTRANSPOSE3X3FNVPROC __rglgen_glMatrixLoadTranspose3x3fNV; +RGLSYMGLMATRIXMULT3X2FNVPROC __rglgen_glMatrixMult3x2fNV; +RGLSYMGLMATRIXMULT3X3FNVPROC __rglgen_glMatrixMult3x3fNV; +RGLSYMGLMATRIXMULTTRANSPOSE3X3FNVPROC __rglgen_glMatrixMultTranspose3x3fNV; +RGLSYMGLSTENCILTHENCOVERFILLPATHNVPROC __rglgen_glStencilThenCoverFillPathNV; +RGLSYMGLSTENCILTHENCOVERSTROKEPATHNVPROC __rglgen_glStencilThenCoverStrokePathNV; +RGLSYMGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __rglgen_glStencilThenCoverFillPathInstancedNV; +RGLSYMGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __rglgen_glStencilThenCoverStrokePathInstancedNV; +RGLSYMGLPATHGLYPHINDEXRANGENVPROC __rglgen_glPathGlyphIndexRangeNV; +RGLSYMGLPATHGLYPHINDEXARRAYNVPROC __rglgen_glPathGlyphIndexArrayNV; +RGLSYMGLPATHMEMORYGLYPHINDEXARRAYNVPROC __rglgen_glPathMemoryGlyphIndexArrayNV; +RGLSYMGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __rglgen_glProgramPathFragmentInputGenNV; +RGLSYMGLGETPROGRAMRESOURCEFVNVPROC __rglgen_glGetProgramResourcefvNV; +RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __rglgen_glFramebufferSampleLocationsfvNV; +RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __rglgen_glNamedFramebufferSampleLocationsfvNV; +RGLSYMGLRESOLVEDEPTHVALUESNVPROC __rglgen_glResolveDepthValuesNV; +RGLSYMGLSCISSOREXCLUSIVENVPROC __rglgen_glScissorExclusiveNV; +RGLSYMGLSCISSOREXCLUSIVEARRAYVNVPROC __rglgen_glScissorExclusiveArrayvNV; +RGLSYMGLMAKEBUFFERRESIDENTNVPROC __rglgen_glMakeBufferResidentNV; +RGLSYMGLMAKEBUFFERNONRESIDENTNVPROC __rglgen_glMakeBufferNonResidentNV; +RGLSYMGLISBUFFERRESIDENTNVPROC __rglgen_glIsBufferResidentNV; +RGLSYMGLMAKENAMEDBUFFERRESIDENTNVPROC __rglgen_glMakeNamedBufferResidentNV; +RGLSYMGLMAKENAMEDBUFFERNONRESIDENTNVPROC __rglgen_glMakeNamedBufferNonResidentNV; +RGLSYMGLISNAMEDBUFFERRESIDENTNVPROC __rglgen_glIsNamedBufferResidentNV; +RGLSYMGLGETBUFFERPARAMETERUI64VNVPROC __rglgen_glGetBufferParameterui64vNV; +RGLSYMGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __rglgen_glGetNamedBufferParameterui64vNV; +RGLSYMGLGETINTEGERUI64VNVPROC __rglgen_glGetIntegerui64vNV; +RGLSYMGLUNIFORMUI64NVPROC __rglgen_glUniformui64NV; +RGLSYMGLUNIFORMUI64VNVPROC __rglgen_glUniformui64vNV; +RGLSYMGLGETUNIFORMUI64VNVPROC __rglgen_glGetUniformui64vNV; +RGLSYMGLPROGRAMUNIFORMUI64NVPROC __rglgen_glProgramUniformui64NV; +RGLSYMGLPROGRAMUNIFORMUI64VNVPROC __rglgen_glProgramUniformui64vNV; +RGLSYMGLBINDSHADINGRATEIMAGENVPROC __rglgen_glBindShadingRateImageNV; +RGLSYMGLGETSHADINGRATEIMAGEPALETTENVPROC __rglgen_glGetShadingRateImagePaletteNV; +RGLSYMGLGETSHADINGRATESAMPLELOCATIONIVNVPROC __rglgen_glGetShadingRateSampleLocationivNV; +RGLSYMGLSHADINGRATEIMAGEBARRIERNVPROC __rglgen_glShadingRateImageBarrierNV; +RGLSYMGLSHADINGRATEIMAGEPALETTENVPROC __rglgen_glShadingRateImagePaletteNV; +RGLSYMGLSHADINGRATESAMPLEORDERNVPROC __rglgen_glShadingRateSampleOrderNV; +RGLSYMGLSHADINGRATESAMPLEORDERCUSTOMNVPROC __rglgen_glShadingRateSampleOrderCustomNV; +RGLSYMGLTEXTUREBARRIERNVPROC __rglgen_glTextureBarrierNV; +RGLSYMGLVERTEXATTRIBL1I64NVPROC __rglgen_glVertexAttribL1i64NV; +RGLSYMGLVERTEXATTRIBL2I64NVPROC __rglgen_glVertexAttribL2i64NV; +RGLSYMGLVERTEXATTRIBL3I64NVPROC __rglgen_glVertexAttribL3i64NV; +RGLSYMGLVERTEXATTRIBL4I64NVPROC __rglgen_glVertexAttribL4i64NV; +RGLSYMGLVERTEXATTRIBL1I64VNVPROC __rglgen_glVertexAttribL1i64vNV; +RGLSYMGLVERTEXATTRIBL2I64VNVPROC __rglgen_glVertexAttribL2i64vNV; +RGLSYMGLVERTEXATTRIBL3I64VNVPROC __rglgen_glVertexAttribL3i64vNV; +RGLSYMGLVERTEXATTRIBL4I64VNVPROC __rglgen_glVertexAttribL4i64vNV; +RGLSYMGLVERTEXATTRIBL1UI64NVPROC __rglgen_glVertexAttribL1ui64NV; +RGLSYMGLVERTEXATTRIBL2UI64NVPROC __rglgen_glVertexAttribL2ui64NV; +RGLSYMGLVERTEXATTRIBL3UI64NVPROC __rglgen_glVertexAttribL3ui64NV; +RGLSYMGLVERTEXATTRIBL4UI64NVPROC __rglgen_glVertexAttribL4ui64NV; +RGLSYMGLVERTEXATTRIBL1UI64VNVPROC __rglgen_glVertexAttribL1ui64vNV; +RGLSYMGLVERTEXATTRIBL2UI64VNVPROC __rglgen_glVertexAttribL2ui64vNV; +RGLSYMGLVERTEXATTRIBL3UI64VNVPROC __rglgen_glVertexAttribL3ui64vNV; +RGLSYMGLVERTEXATTRIBL4UI64VNVPROC __rglgen_glVertexAttribL4ui64vNV; +RGLSYMGLGETVERTEXATTRIBLI64VNVPROC __rglgen_glGetVertexAttribLi64vNV; +RGLSYMGLGETVERTEXATTRIBLUI64VNVPROC __rglgen_glGetVertexAttribLui64vNV; +RGLSYMGLVERTEXATTRIBLFORMATNVPROC __rglgen_glVertexAttribLFormatNV; +RGLSYMGLBUFFERADDRESSRANGENVPROC __rglgen_glBufferAddressRangeNV; +RGLSYMGLVERTEXFORMATNVPROC __rglgen_glVertexFormatNV; +RGLSYMGLNORMALFORMATNVPROC __rglgen_glNormalFormatNV; +RGLSYMGLCOLORFORMATNVPROC __rglgen_glColorFormatNV; +RGLSYMGLINDEXFORMATNVPROC __rglgen_glIndexFormatNV; +RGLSYMGLTEXCOORDFORMATNVPROC __rglgen_glTexCoordFormatNV; +RGLSYMGLEDGEFLAGFORMATNVPROC __rglgen_glEdgeFlagFormatNV; +RGLSYMGLSECONDARYCOLORFORMATNVPROC __rglgen_glSecondaryColorFormatNV; +RGLSYMGLFOGCOORDFORMATNVPROC __rglgen_glFogCoordFormatNV; +RGLSYMGLVERTEXATTRIBFORMATNVPROC __rglgen_glVertexAttribFormatNV; +RGLSYMGLVERTEXATTRIBIFORMATNVPROC __rglgen_glVertexAttribIFormatNV; +RGLSYMGLGETINTEGERUI64I_VNVPROC __rglgen_glGetIntegerui64i_vNV; +RGLSYMGLVIEWPORTSWIZZLENVPROC __rglgen_glViewportSwizzleNV; +RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; + +#ifndef __APPLE__ +RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; +RGLSYMGLGETVKPROCADDRNVPROC __rglgen_glGetVkProcAddrNV; +#endif diff --git a/core/deps/libretro-common/include/glsm/glsmsym.h b/core/deps/libretro-common/include/glsm/glsmsym.h index 2609056c9..0c6cd1652 100644 --- a/core/deps/libretro-common/include/glsm/glsmsym.h +++ b/core/deps/libretro-common/include/glsm/glsmsym.h @@ -200,6 +200,7 @@ RETRO_BEGIN_DECLS #define glGetShaderPrecisionFormat rglGetShaderPrecisionFormat #define glClearDepthf rglClearDepthf #define glPrimitiveRestartIndex rglPrimitiveRestartIndex +#define glHint rglHint const GLubyte* rglGetStringi(GLenum name, GLuint index); void rglTexBuffer(GLenum target, GLenum internalFormat, GLuint buffer); @@ -508,6 +509,7 @@ void rglGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei *count, GLu void rglGetShaderPrecisionFormat(GLenum shaderType, GLenum precisionType, GLint *range, GLint *precision); void rglClearDepthf(GLfloat depth); void rglPrimitiveRestartIndex(GLuint index); +void rglHint(GLenum target, GLenum mode); RETRO_END_DECLS diff --git a/core/deps/libretro-common/include/glsym/glsym_es3.h b/core/deps/libretro-common/include/glsym/glsym_es3.h index 9ffd15064..92ecdc020 100644 --- a/core/deps/libretro-common/include/glsym/glsym_es3.h +++ b/core/deps/libretro-common/include/glsym/glsym_es3.h @@ -28,619 +28,1082 @@ typedef unsigned long long int GLuint64; typedef unsigned long long int GLuint64EXT; typedef struct __GLsync *GLsync; #endif -typedef void (GL_APIENTRYP RGLSYMGLBLENDBARRIERKHRPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC) (RGLGENGLDEBUGPROCKHR callback, const void *userParam); -typedef GLuint (GL_APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (GL_APIENTRYP RGLSYMGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (GL_APIENTRYP RGLSYMGLPOPDEBUGGROUPKHRPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETPOINTERVKHRPROC) (GLenum pname, void **params); -typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); -typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); -typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GL_APIENTRYP RGLSYMGLENABLEIOESPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDISABLEIOESPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIOESPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); -typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFEROESPROC) (GLenum target, GLenum access); -typedef GLboolean (GL_APIENTRYP RGLSYMGLUNMAPBUFFEROESPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); -typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -typedef void (GL_APIENTRYP RGLSYMGLMINSAMPLESHADINGOESPROC) (GLfloat value); -typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); -typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXARRAYOESPROC) (GLuint array); -typedef void (GL_APIENTRYP RGLSYMGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); -typedef void (GL_APIENTRYP RGLSYMGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISVERTEXARRAYOESPROC) (GLuint array); -typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); -typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP RGLSYMGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (GL_APIENTRYP RGLSYMGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); -typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GL_APIENTRYP RGLSYMGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP RGLSYMGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); -typedef void (GL_APIENTRYP RGLSYMGLPOPGROUPMARKEREXTPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (GL_APIENTRYP RGLSYMGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); -typedef void (GL_APIENTRYP RGLSYMGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISQUERYEXTPROC) (GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLENDQUERYEXTPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); -typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); -typedef void (GL_APIENTRYP RGLSYMGLENABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDISABLEIEXTPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIEXTPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); -typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GL_APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); -typedef void (GL_APIENTRYP RGLSYMGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); -typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); -typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (GL_APIENTRYP RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); -typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -typedef void (GL_APIENTRYP RGLSYMGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); -typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); -typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); -typedef void (GL_APIENTRYP RGLSYMGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); -typedef GLsizei (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); -typedef void (GL_APIENTRYP RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); -typedef void (GL_APIENTRYP RGLSYMGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); -typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -typedef void (GL_APIENTRYP RGLSYMGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +typedef void (GL_APIENTRYP RGLSYMGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GL_APIENTRYP RGLSYMGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP RGLSYMGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GL_APIENTRYP RGLSYMGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GL_APIENTRYP RGLSYMGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (GL_APIENTRYP RGLSYMGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GL_APIENTRYP RGLSYMGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef GLenum (GL_APIENTRYP RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLCLEARPROC) (GLbitfield mask); +typedef void (GL_APIENTRYP RGLSYMGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP RGLSYMGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (GL_APIENTRYP RGLSYMGLCLEARSTENCILPROC) (GLint s); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GL_APIENTRYP RGLSYMGLCOMPILESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GL_APIENTRYP RGLSYMGLCREATEPROGRAMPROC) (void); +typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROC) (GLenum type); +typedef void (GL_APIENTRYP RGLSYMGLCULLFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (GL_APIENTRYP RGLSYMGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (GL_APIENTRYP RGLSYMGLDELETESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP RGLSYMGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHFUNCPROC) (GLenum func); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHMASKPROC) (GLboolean flag); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP RGLSYMGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); +typedef void (GL_APIENTRYP RGLSYMGLENABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP RGLSYMGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLFINISHPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLFLUSHPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLFRONTFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (GL_APIENTRYP RGLSYMGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (GL_APIENTRYP RGLSYMGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (GL_APIENTRYP RGLSYMGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (GL_APIENTRYP RGLSYMGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); +typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETERRORPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLGETFLOATVPROC) (GLenum pname, GLfloat *data); +typedef void (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERVPROC) (GLenum pname, GLint *data); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP RGLSYMGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (GL_APIENTRYP RGLSYMGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef const GLubyte *(GL_APIENTRYP RGLSYMGLGETSTRINGPROC) (GLenum name); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef GLint (GL_APIENTRYP RGLSYMGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef void (GL_APIENTRYP RGLSYMGLHINTPROC) (GLenum target, GLenum mode); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDPROC) (GLenum cap); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISSHADERPROC) (GLuint shader); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISTEXTUREPROC) (GLuint texture); +typedef void (GL_APIENTRYP RGLSYMGLLINEWIDTHPROC) (GLfloat width); +typedef void (GL_APIENTRYP RGLSYMGLLINKPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (GL_APIENTRYP RGLSYMGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); +typedef void (GL_APIENTRYP RGLSYMGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (GL_APIENTRYP RGLSYMGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILMASKPROC) (GLuint mask); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GL_APIENTRYP RGLSYMGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLREADBUFFERPROC) (GLenum src); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP RGLSYMGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISQUERYPROC) (GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLENDQUERYPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef GLboolean (GL_APIENTRYP RGLSYMGLUNMAPBUFFERPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP RGLSYMGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISVERTEXARRAYPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (GL_APIENTRYP RGLSYMGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GL_APIENTRYP RGLSYMGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (GL_APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef GLint (GL_APIENTRYP RGLSYMGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(GL_APIENTRYP RGLSYMGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef GLuint (GL_APIENTRYP RGLSYMGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (GL_APIENTRYP RGLSYMGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef GLsync (GL_APIENTRYP RGLSYMGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISSYNCPROC) (GLsync sync); +typedef void (GL_APIENTRYP RGLSYMGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP RGLSYMGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP RGLSYMGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (GL_APIENTRYP RGLSYMGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP RGLSYMGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (GL_APIENTRYP RGLSYMGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISSAMPLERPROC) (GLuint sampler); +typedef void (GL_APIENTRYP RGLSYMGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (GL_APIENTRYP RGLSYMGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (GL_APIENTRYP RGLSYMGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (GL_APIENTRYP RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP RGLSYMGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GL_APIENTRYP RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (GL_APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP RGLSYMGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP RGLSYMGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GL_APIENTRYP RGLSYMGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GL_APIENTRYP RGLSYMGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (GL_APIENTRYP RGLSYMGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GL_APIENTRYP RGLSYMGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (GL_APIENTRYP RGLSYMGLBLENDBARRIERPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKPROC) (RGLGENGLDEBUGPROC callback, const void *userParam); +typedef GLuint (GL_APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP RGLSYMGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP RGLSYMGLPOPDEBUGGROUPPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETPOINTERVPROC) (GLenum pname, void **params); +typedef void (GL_APIENTRYP RGLSYMGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#define glBlendBarrierKHR __rglgen_glBlendBarrierKHR -#define glDebugMessageControlKHR __rglgen_glDebugMessageControlKHR -#define glDebugMessageInsertKHR __rglgen_glDebugMessageInsertKHR -#define glDebugMessageCallbackKHR __rglgen_glDebugMessageCallbackKHR -#define glGetDebugMessageLogKHR __rglgen_glGetDebugMessageLogKHR -#define glPushDebugGroupKHR __rglgen_glPushDebugGroupKHR -#define glPopDebugGroupKHR __rglgen_glPopDebugGroupKHR -#define glObjectLabelKHR __rglgen_glObjectLabelKHR -#define glGetObjectLabelKHR __rglgen_glGetObjectLabelKHR -#define glObjectPtrLabelKHR __rglgen_glObjectPtrLabelKHR -#define glGetObjectPtrLabelKHR __rglgen_glGetObjectPtrLabelKHR -#define glGetPointervKHR __rglgen_glGetPointervKHR -#define glGetGraphicsResetStatusKHR __rglgen_glGetGraphicsResetStatusKHR -#define glReadnPixelsKHR __rglgen_glReadnPixelsKHR -#define glGetnUniformfvKHR __rglgen_glGetnUniformfvKHR -#define glGetnUniformivKHR __rglgen_glGetnUniformivKHR -#define glGetnUniformuivKHR __rglgen_glGetnUniformuivKHR -#define glEGLImageTargetTexture2DOES __rglgen_glEGLImageTargetTexture2DOES -#define glEGLImageTargetRenderbufferStorageOES __rglgen_glEGLImageTargetRenderbufferStorageOES -#define glCopyImageSubDataOES __rglgen_glCopyImageSubDataOES -#define glEnableiOES __rglgen_glEnableiOES -#define glDisableiOES __rglgen_glDisableiOES -#define glBlendEquationiOES __rglgen_glBlendEquationiOES -#define glBlendEquationSeparateiOES __rglgen_glBlendEquationSeparateiOES -#define glBlendFunciOES __rglgen_glBlendFunciOES -#define glBlendFuncSeparateiOES __rglgen_glBlendFuncSeparateiOES -#define glColorMaskiOES __rglgen_glColorMaskiOES -#define glIsEnablediOES __rglgen_glIsEnablediOES -#define glDrawElementsBaseVertexOES __rglgen_glDrawElementsBaseVertexOES -#define glDrawRangeElementsBaseVertexOES __rglgen_glDrawRangeElementsBaseVertexOES -#define glDrawElementsInstancedBaseVertexOES __rglgen_glDrawElementsInstancedBaseVertexOES -#define glMultiDrawElementsBaseVertexOES __rglgen_glMultiDrawElementsBaseVertexOES -#define glFramebufferTextureOES __rglgen_glFramebufferTextureOES -#define glGetProgramBinaryOES __rglgen_glGetProgramBinaryOES -#define glProgramBinaryOES __rglgen_glProgramBinaryOES -#define glMapBufferOES __rglgen_glMapBufferOES -#define glUnmapBufferOES __rglgen_glUnmapBufferOES -#define glGetBufferPointervOES __rglgen_glGetBufferPointervOES -#define glPrimitiveBoundingBoxOES __rglgen_glPrimitiveBoundingBoxOES -#define glMinSampleShadingOES __rglgen_glMinSampleShadingOES -#define glPatchParameteriOES __rglgen_glPatchParameteriOES -#define glTexImage3DOES __rglgen_glTexImage3DOES -#define glTexSubImage3DOES __rglgen_glTexSubImage3DOES -#define glCopyTexSubImage3DOES __rglgen_glCopyTexSubImage3DOES -#define glCompressedTexImage3DOES __rglgen_glCompressedTexImage3DOES -#define glCompressedTexSubImage3DOES __rglgen_glCompressedTexSubImage3DOES -#define glFramebufferTexture3DOES __rglgen_glFramebufferTexture3DOES -#define glTexParameterIivOES __rglgen_glTexParameterIivOES -#define glTexParameterIuivOES __rglgen_glTexParameterIuivOES -#define glGetTexParameterIivOES __rglgen_glGetTexParameterIivOES -#define glGetTexParameterIuivOES __rglgen_glGetTexParameterIuivOES -#define glSamplerParameterIivOES __rglgen_glSamplerParameterIivOES -#define glSamplerParameterIuivOES __rglgen_glSamplerParameterIuivOES -#define glGetSamplerParameterIivOES __rglgen_glGetSamplerParameterIivOES -#define glGetSamplerParameterIuivOES __rglgen_glGetSamplerParameterIuivOES -#define glTexBufferOES __rglgen_glTexBufferOES -#define glTexBufferRangeOES __rglgen_glTexBufferRangeOES -#define glTexStorage3DMultisampleOES __rglgen_glTexStorage3DMultisampleOES -#define glTextureViewOES __rglgen_glTextureViewOES -#define glBindVertexArrayOES __rglgen_glBindVertexArrayOES -#define glDeleteVertexArraysOES __rglgen_glDeleteVertexArraysOES -#define glGenVertexArraysOES __rglgen_glGenVertexArraysOES -#define glIsVertexArrayOES __rglgen_glIsVertexArrayOES -#define glViewportArrayvOES __rglgen_glViewportArrayvOES -#define glViewportIndexedfOES __rglgen_glViewportIndexedfOES -#define glViewportIndexedfvOES __rglgen_glViewportIndexedfvOES -#define glScissorArrayvOES __rglgen_glScissorArrayvOES -#define glScissorIndexedOES __rglgen_glScissorIndexedOES -#define glScissorIndexedvOES __rglgen_glScissorIndexedvOES -#define glDepthRangeArrayfvOES __rglgen_glDepthRangeArrayfvOES -#define glDepthRangeIndexedfOES __rglgen_glDepthRangeIndexedfOES -#define glGetFloati_vOES __rglgen_glGetFloati_vOES -#define glDrawArraysInstancedBaseInstanceEXT __rglgen_glDrawArraysInstancedBaseInstanceEXT -#define glDrawElementsInstancedBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseInstanceEXT -#define glDrawElementsInstancedBaseVertexBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT -#define glBindFragDataLocationIndexedEXT __rglgen_glBindFragDataLocationIndexedEXT -#define glBindFragDataLocationEXT __rglgen_glBindFragDataLocationEXT -#define glGetProgramResourceLocationIndexEXT __rglgen_glGetProgramResourceLocationIndexEXT -#define glGetFragDataIndexEXT __rglgen_glGetFragDataIndexEXT -#define glBufferStorageEXT __rglgen_glBufferStorageEXT -#define glClearTexImageEXT __rglgen_glClearTexImageEXT -#define glClearTexSubImageEXT __rglgen_glClearTexSubImageEXT -#define glCopyImageSubDataEXT __rglgen_glCopyImageSubDataEXT -#define glLabelObjectEXT __rglgen_glLabelObjectEXT -#define glGetObjectLabelEXT __rglgen_glGetObjectLabelEXT -#define glInsertEventMarkerEXT __rglgen_glInsertEventMarkerEXT -#define glPushGroupMarkerEXT __rglgen_glPushGroupMarkerEXT -#define glPopGroupMarkerEXT __rglgen_glPopGroupMarkerEXT -#define glDiscardFramebufferEXT __rglgen_glDiscardFramebufferEXT -#define glGenQueriesEXT __rglgen_glGenQueriesEXT -#define glDeleteQueriesEXT __rglgen_glDeleteQueriesEXT -#define glIsQueryEXT __rglgen_glIsQueryEXT -#define glBeginQueryEXT __rglgen_glBeginQueryEXT -#define glEndQueryEXT __rglgen_glEndQueryEXT -#define glQueryCounterEXT __rglgen_glQueryCounterEXT -#define glGetQueryivEXT __rglgen_glGetQueryivEXT -#define glGetQueryObjectivEXT __rglgen_glGetQueryObjectivEXT -#define glGetQueryObjectuivEXT __rglgen_glGetQueryObjectuivEXT -#define glGetQueryObjecti64vEXT __rglgen_glGetQueryObjecti64vEXT -#define glGetQueryObjectui64vEXT __rglgen_glGetQueryObjectui64vEXT -#define glDrawBuffersEXT __rglgen_glDrawBuffersEXT -#define glEnableiEXT __rglgen_glEnableiEXT -#define glDisableiEXT __rglgen_glDisableiEXT -#define glBlendEquationiEXT __rglgen_glBlendEquationiEXT -#define glBlendEquationSeparateiEXT __rglgen_glBlendEquationSeparateiEXT -#define glBlendFunciEXT __rglgen_glBlendFunciEXT -#define glBlendFuncSeparateiEXT __rglgen_glBlendFuncSeparateiEXT -#define glColorMaskiEXT __rglgen_glColorMaskiEXT -#define glIsEnablediEXT __rglgen_glIsEnablediEXT -#define glDrawElementsBaseVertexEXT __rglgen_glDrawElementsBaseVertexEXT -#define glDrawRangeElementsBaseVertexEXT __rglgen_glDrawRangeElementsBaseVertexEXT -#define glDrawElementsInstancedBaseVertexEXT __rglgen_glDrawElementsInstancedBaseVertexEXT -#define glMultiDrawElementsBaseVertexEXT __rglgen_glMultiDrawElementsBaseVertexEXT -#define glDrawArraysInstancedEXT __rglgen_glDrawArraysInstancedEXT -#define glDrawElementsInstancedEXT __rglgen_glDrawElementsInstancedEXT -#define glFramebufferTextureEXT __rglgen_glFramebufferTextureEXT -#define glVertexAttribDivisorEXT __rglgen_glVertexAttribDivisorEXT -#define glMapBufferRangeEXT __rglgen_glMapBufferRangeEXT -#define glFlushMappedBufferRangeEXT __rglgen_glFlushMappedBufferRangeEXT -#define glMultiDrawArraysEXT __rglgen_glMultiDrawArraysEXT -#define glMultiDrawElementsEXT __rglgen_glMultiDrawElementsEXT -#define glMultiDrawArraysIndirectEXT __rglgen_glMultiDrawArraysIndirectEXT -#define glMultiDrawElementsIndirectEXT __rglgen_glMultiDrawElementsIndirectEXT -#define glRenderbufferStorageMultisampleEXT __rglgen_glRenderbufferStorageMultisampleEXT -#define glFramebufferTexture2DMultisampleEXT __rglgen_glFramebufferTexture2DMultisampleEXT -#define glReadBufferIndexedEXT __rglgen_glReadBufferIndexedEXT -#define glDrawBuffersIndexedEXT __rglgen_glDrawBuffersIndexedEXT -#define glGetIntegeri_vEXT __rglgen_glGetIntegeri_vEXT -#define glPolygonOffsetClampEXT __rglgen_glPolygonOffsetClampEXT -#define glPrimitiveBoundingBoxEXT __rglgen_glPrimitiveBoundingBoxEXT -#define glRasterSamplesEXT __rglgen_glRasterSamplesEXT -#define glGetGraphicsResetStatusEXT __rglgen_glGetGraphicsResetStatusEXT -#define glReadnPixelsEXT __rglgen_glReadnPixelsEXT -#define glGetnUniformfvEXT __rglgen_glGetnUniformfvEXT -#define glGetnUniformivEXT __rglgen_glGetnUniformivEXT -#define glActiveShaderProgramEXT __rglgen_glActiveShaderProgramEXT -#define glBindProgramPipelineEXT __rglgen_glBindProgramPipelineEXT -#define glCreateShaderProgramvEXT __rglgen_glCreateShaderProgramvEXT -#define glDeleteProgramPipelinesEXT __rglgen_glDeleteProgramPipelinesEXT -#define glGenProgramPipelinesEXT __rglgen_glGenProgramPipelinesEXT -#define glGetProgramPipelineInfoLogEXT __rglgen_glGetProgramPipelineInfoLogEXT -#define glGetProgramPipelineivEXT __rglgen_glGetProgramPipelineivEXT -#define glIsProgramPipelineEXT __rglgen_glIsProgramPipelineEXT -#define glProgramParameteriEXT __rglgen_glProgramParameteriEXT -#define glProgramUniform1fEXT __rglgen_glProgramUniform1fEXT -#define glProgramUniform1fvEXT __rglgen_glProgramUniform1fvEXT -#define glProgramUniform1iEXT __rglgen_glProgramUniform1iEXT -#define glProgramUniform1ivEXT __rglgen_glProgramUniform1ivEXT -#define glProgramUniform2fEXT __rglgen_glProgramUniform2fEXT -#define glProgramUniform2fvEXT __rglgen_glProgramUniform2fvEXT -#define glProgramUniform2iEXT __rglgen_glProgramUniform2iEXT -#define glProgramUniform2ivEXT __rglgen_glProgramUniform2ivEXT -#define glProgramUniform3fEXT __rglgen_glProgramUniform3fEXT -#define glProgramUniform3fvEXT __rglgen_glProgramUniform3fvEXT -#define glProgramUniform3iEXT __rglgen_glProgramUniform3iEXT -#define glProgramUniform3ivEXT __rglgen_glProgramUniform3ivEXT -#define glProgramUniform4fEXT __rglgen_glProgramUniform4fEXT -#define glProgramUniform4fvEXT __rglgen_glProgramUniform4fvEXT -#define glProgramUniform4iEXT __rglgen_glProgramUniform4iEXT -#define glProgramUniform4ivEXT __rglgen_glProgramUniform4ivEXT -#define glProgramUniformMatrix2fvEXT __rglgen_glProgramUniformMatrix2fvEXT -#define glProgramUniformMatrix3fvEXT __rglgen_glProgramUniformMatrix3fvEXT -#define glProgramUniformMatrix4fvEXT __rglgen_glProgramUniformMatrix4fvEXT -#define glUseProgramStagesEXT __rglgen_glUseProgramStagesEXT -#define glValidateProgramPipelineEXT __rglgen_glValidateProgramPipelineEXT -#define glProgramUniform1uiEXT __rglgen_glProgramUniform1uiEXT -#define glProgramUniform2uiEXT __rglgen_glProgramUniform2uiEXT -#define glProgramUniform3uiEXT __rglgen_glProgramUniform3uiEXT -#define glProgramUniform4uiEXT __rglgen_glProgramUniform4uiEXT -#define glProgramUniform1uivEXT __rglgen_glProgramUniform1uivEXT -#define glProgramUniform2uivEXT __rglgen_glProgramUniform2uivEXT -#define glProgramUniform3uivEXT __rglgen_glProgramUniform3uivEXT -#define glProgramUniform4uivEXT __rglgen_glProgramUniform4uivEXT -#define glProgramUniformMatrix2x3fvEXT __rglgen_glProgramUniformMatrix2x3fvEXT -#define glProgramUniformMatrix3x2fvEXT __rglgen_glProgramUniformMatrix3x2fvEXT -#define glProgramUniformMatrix2x4fvEXT __rglgen_glProgramUniformMatrix2x4fvEXT -#define glProgramUniformMatrix4x2fvEXT __rglgen_glProgramUniformMatrix4x2fvEXT -#define glProgramUniformMatrix3x4fvEXT __rglgen_glProgramUniformMatrix3x4fvEXT -#define glProgramUniformMatrix4x3fvEXT __rglgen_glProgramUniformMatrix4x3fvEXT -#define glFramebufferPixelLocalStorageSizeEXT __rglgen_glFramebufferPixelLocalStorageSizeEXT -#define glGetFramebufferPixelLocalStorageSizeEXT __rglgen_glGetFramebufferPixelLocalStorageSizeEXT -#define glClearPixelLocalStorageuiEXT __rglgen_glClearPixelLocalStorageuiEXT -#define glTexPageCommitmentEXT __rglgen_glTexPageCommitmentEXT -#define glPatchParameteriEXT __rglgen_glPatchParameteriEXT -#define glTexParameterIivEXT __rglgen_glTexParameterIivEXT -#define glTexParameterIuivEXT __rglgen_glTexParameterIuivEXT -#define glGetTexParameterIivEXT __rglgen_glGetTexParameterIivEXT -#define glGetTexParameterIuivEXT __rglgen_glGetTexParameterIuivEXT -#define glSamplerParameterIivEXT __rglgen_glSamplerParameterIivEXT -#define glSamplerParameterIuivEXT __rglgen_glSamplerParameterIuivEXT -#define glGetSamplerParameterIivEXT __rglgen_glGetSamplerParameterIivEXT -#define glGetSamplerParameterIuivEXT __rglgen_glGetSamplerParameterIuivEXT -#define glTexBufferEXT __rglgen_glTexBufferEXT -#define glTexBufferRangeEXT __rglgen_glTexBufferRangeEXT -#define glTexStorage1DEXT __rglgen_glTexStorage1DEXT -#define glTexStorage2DEXT __rglgen_glTexStorage2DEXT -#define glTexStorage3DEXT __rglgen_glTexStorage3DEXT -#define glTextureStorage1DEXT __rglgen_glTextureStorage1DEXT -#define glTextureStorage2DEXT __rglgen_glTextureStorage2DEXT -#define glTextureStorage3DEXT __rglgen_glTextureStorage3DEXT -#define glTextureViewEXT __rglgen_glTextureViewEXT -#define glesEXT __rglgen_glesEXT -#define glFramebufferTextureMultiviewOVR __rglgen_glFramebufferTextureMultiviewOVR -#define glFramebufferTextureMultisampleMultiviewOVR __rglgen_glFramebufferTextureMultisampleMultiviewOVR +#define glActiveTexture __rglgen_glActiveTexture +#define glAttachShader __rglgen_glAttachShader +#define glBindAttribLocation __rglgen_glBindAttribLocation +#define glBindBuffer __rglgen_glBindBuffer +#define glBindFramebuffer __rglgen_glBindFramebuffer +#define glBindRenderbuffer __rglgen_glBindRenderbuffer +#define glBindTexture __rglgen_glBindTexture +#define glBlendColor __rglgen_glBlendColor +#define glBlendEquation __rglgen_glBlendEquation +#define glBlendEquationSeparate __rglgen_glBlendEquationSeparate +#define glBlendFunc __rglgen_glBlendFunc +#define glBlendFuncSeparate __rglgen_glBlendFuncSeparate +#define glBufferData __rglgen_glBufferData +#define glBufferSubData __rglgen_glBufferSubData +#define glCheckFramebufferStatus __rglgen_glCheckFramebufferStatus +#define glClear __rglgen_glClear +#define glClearColor __rglgen_glClearColor +#define glClearDepthf __rglgen_glClearDepthf +#define glClearStencil __rglgen_glClearStencil +#define glColorMask __rglgen_glColorMask +#define glCompileShader __rglgen_glCompileShader +#define glCompressedTexImage2D __rglgen_glCompressedTexImage2D +#define glCompressedTexSubImage2D __rglgen_glCompressedTexSubImage2D +#define glCopyTexImage2D __rglgen_glCopyTexImage2D +#define glCopyTexSubImage2D __rglgen_glCopyTexSubImage2D +#define glCreateProgram __rglgen_glCreateProgram +#define glCreateShader __rglgen_glCreateShader +#define glCullFace __rglgen_glCullFace +#define glDeleteBuffers __rglgen_glDeleteBuffers +#define glDeleteFramebuffers __rglgen_glDeleteFramebuffers +#define glDeleteProgram __rglgen_glDeleteProgram +#define glDeleteRenderbuffers __rglgen_glDeleteRenderbuffers +#define glDeleteShader __rglgen_glDeleteShader +#define glDeleteTextures __rglgen_glDeleteTextures +#define glDepthFunc __rglgen_glDepthFunc +#define glDepthMask __rglgen_glDepthMask +#define glDepthRangef __rglgen_glDepthRangef +#define glDetachShader __rglgen_glDetachShader +#define glDisable __rglgen_glDisable +#define glDisableVertexAttribArray __rglgen_glDisableVertexAttribArray +#define glDrawArrays __rglgen_glDrawArrays +#define glDrawElements __rglgen_glDrawElements +#define glEnable __rglgen_glEnable +#define glEnableVertexAttribArray __rglgen_glEnableVertexAttribArray +#define glFinish __rglgen_glFinish +#define glFlush __rglgen_glFlush +#define glFramebufferRenderbuffer __rglgen_glFramebufferRenderbuffer +#define glFramebufferTexture2D __rglgen_glFramebufferTexture2D +#define glFrontFace __rglgen_glFrontFace +#define glGenBuffers __rglgen_glGenBuffers +#define glGenerateMipmap __rglgen_glGenerateMipmap +#define glGenFramebuffers __rglgen_glGenFramebuffers +#define glGenRenderbuffers __rglgen_glGenRenderbuffers +#define glGenTextures __rglgen_glGenTextures +#define glGetActiveAttrib __rglgen_glGetActiveAttrib +#define glGetActiveUniform __rglgen_glGetActiveUniform +#define glGetAttachedShaders __rglgen_glGetAttachedShaders +#define glGetAttribLocation __rglgen_glGetAttribLocation +#define glGetBooleanv __rglgen_glGetBooleanv +#define glGetBufferParameteriv __rglgen_glGetBufferParameteriv +#define glGetError __rglgen_glGetError +#define glGetFloatv __rglgen_glGetFloatv +#define glGetFramebufferAttachmentParameteriv __rglgen_glGetFramebufferAttachmentParameteriv +#define glGetIntegerv __rglgen_glGetIntegerv +#define glGetProgramiv __rglgen_glGetProgramiv +#define glGetProgramInfoLog __rglgen_glGetProgramInfoLog +#define glGetRenderbufferParameteriv __rglgen_glGetRenderbufferParameteriv +#define glGetShaderiv __rglgen_glGetShaderiv +#define glGetShaderInfoLog __rglgen_glGetShaderInfoLog +#define glGetShaderPrecisionFormat __rglgen_glGetShaderPrecisionFormat +#define glGetShaderSource __rglgen_glGetShaderSource +#define glGetString __rglgen_glGetString +#define glGetTexParameterfv __rglgen_glGetTexParameterfv +#define glGetTexParameteriv __rglgen_glGetTexParameteriv +#define glGetUniformfv __rglgen_glGetUniformfv +#define glGetUniformiv __rglgen_glGetUniformiv +#define glGetUniformLocation __rglgen_glGetUniformLocation +#define glGetVertexAttribfv __rglgen_glGetVertexAttribfv +#define glGetVertexAttribiv __rglgen_glGetVertexAttribiv +#define glGetVertexAttribPointerv __rglgen_glGetVertexAttribPointerv +#define glHint __rglgen_glHint +#define glIsBuffer __rglgen_glIsBuffer +#define glIsEnabled __rglgen_glIsEnabled +#define glIsFramebuffer __rglgen_glIsFramebuffer +#define glIsProgram __rglgen_glIsProgram +#define glIsRenderbuffer __rglgen_glIsRenderbuffer +#define glIsShader __rglgen_glIsShader +#define glIsTexture __rglgen_glIsTexture +#define glLineWidth __rglgen_glLineWidth +#define glLinkProgram __rglgen_glLinkProgram +#define glPixelStorei __rglgen_glPixelStorei +#define glPolygonOffset __rglgen_glPolygonOffset +#define glReadPixels __rglgen_glReadPixels +#define glReleaseShaderCompiler __rglgen_glReleaseShaderCompiler +#define glRenderbufferStorage __rglgen_glRenderbufferStorage +#define glSampleCoverage __rglgen_glSampleCoverage +#define glScissor __rglgen_glScissor +#define glShaderBinary __rglgen_glShaderBinary +#define glShaderSource __rglgen_glShaderSource +#define glStencilFunc __rglgen_glStencilFunc +#define glStencilFuncSeparate __rglgen_glStencilFuncSeparate +#define glStencilMask __rglgen_glStencilMask +#define glStencilMaskSeparate __rglgen_glStencilMaskSeparate +#define glStencilOp __rglgen_glStencilOp +#define glStencilOpSeparate __rglgen_glStencilOpSeparate +#define glTexImage2D __rglgen_glTexImage2D +#define glTexParameterf __rglgen_glTexParameterf +#define glTexParameterfv __rglgen_glTexParameterfv +#define glTexParameteri __rglgen_glTexParameteri +#define glTexParameteriv __rglgen_glTexParameteriv +#define glTexSubImage2D __rglgen_glTexSubImage2D +#define glUniform1f __rglgen_glUniform1f +#define glUniform1fv __rglgen_glUniform1fv +#define glUniform1i __rglgen_glUniform1i +#define glUniform1iv __rglgen_glUniform1iv +#define glUniform2f __rglgen_glUniform2f +#define glUniform2fv __rglgen_glUniform2fv +#define glUniform2i __rglgen_glUniform2i +#define glUniform2iv __rglgen_glUniform2iv +#define glUniform3f __rglgen_glUniform3f +#define glUniform3fv __rglgen_glUniform3fv +#define glUniform3i __rglgen_glUniform3i +#define glUniform3iv __rglgen_glUniform3iv +#define glUniform4f __rglgen_glUniform4f +#define glUniform4fv __rglgen_glUniform4fv +#define glUniform4i __rglgen_glUniform4i +#define glUniform4iv __rglgen_glUniform4iv +#define glUniformMatrix2fv __rglgen_glUniformMatrix2fv +#define glUniformMatrix3fv __rglgen_glUniformMatrix3fv +#define glUniformMatrix4fv __rglgen_glUniformMatrix4fv +#define glUseProgram __rglgen_glUseProgram +#define glValidateProgram __rglgen_glValidateProgram +#define glVertexAttrib1f __rglgen_glVertexAttrib1f +#define glVertexAttrib1fv __rglgen_glVertexAttrib1fv +#define glVertexAttrib2f __rglgen_glVertexAttrib2f +#define glVertexAttrib2fv __rglgen_glVertexAttrib2fv +#define glVertexAttrib3f __rglgen_glVertexAttrib3f +#define glVertexAttrib3fv __rglgen_glVertexAttrib3fv +#define glVertexAttrib4f __rglgen_glVertexAttrib4f +#define glVertexAttrib4fv __rglgen_glVertexAttrib4fv +#define glVertexAttribPointer __rglgen_glVertexAttribPointer +#define glViewport __rglgen_glViewport +#define glReadBuffer __rglgen_glReadBuffer +#define glDrawRangeElements __rglgen_glDrawRangeElements +#define glTexImage3D __rglgen_glTexImage3D +#define glTexSubImage3D __rglgen_glTexSubImage3D +#define glCopyTexSubImage3D __rglgen_glCopyTexSubImage3D +#define glCompressedTexImage3D __rglgen_glCompressedTexImage3D +#define glCompressedTexSubImage3D __rglgen_glCompressedTexSubImage3D +#define glGenQueries __rglgen_glGenQueries +#define glDeleteQueries __rglgen_glDeleteQueries +#define glIsQuery __rglgen_glIsQuery +#define glBeginQuery __rglgen_glBeginQuery +#define glEndQuery __rglgen_glEndQuery +#define glGetQueryiv __rglgen_glGetQueryiv +#define glGetQueryObjectuiv __rglgen_glGetQueryObjectuiv +#define glUnmapBuffer __rglgen_glUnmapBuffer +#define glGetBufferPointerv __rglgen_glGetBufferPointerv +#define glDrawBuffers __rglgen_glDrawBuffers +#define glUniformMatrix2x3fv __rglgen_glUniformMatrix2x3fv +#define glUniformMatrix3x2fv __rglgen_glUniformMatrix3x2fv +#define glUniformMatrix2x4fv __rglgen_glUniformMatrix2x4fv +#define glUniformMatrix4x2fv __rglgen_glUniformMatrix4x2fv +#define glUniformMatrix3x4fv __rglgen_glUniformMatrix3x4fv +#define glUniformMatrix4x3fv __rglgen_glUniformMatrix4x3fv +#define glBlitFramebuffer __rglgen_glBlitFramebuffer +#define glRenderbufferStorageMultisample __rglgen_glRenderbufferStorageMultisample +#define glFramebufferTextureLayer __rglgen_glFramebufferTextureLayer +#define glMapBufferRange __rglgen_glMapBufferRange +#define glFlushMappedBufferRange __rglgen_glFlushMappedBufferRange +#define glBindVertexArray __rglgen_glBindVertexArray +#define glDeleteVertexArrays __rglgen_glDeleteVertexArrays +#define glGenVertexArrays __rglgen_glGenVertexArrays +#define glIsVertexArray __rglgen_glIsVertexArray +#define glGetIntegeri_v __rglgen_glGetIntegeri_v +#define glBeginTransformFeedback __rglgen_glBeginTransformFeedback +#define glEndTransformFeedback __rglgen_glEndTransformFeedback +#define glBindBufferRange __rglgen_glBindBufferRange +#define glBindBufferBase __rglgen_glBindBufferBase +#define glTransformFeedbackVaryings __rglgen_glTransformFeedbackVaryings +#define glGetTransformFeedbackVarying __rglgen_glGetTransformFeedbackVarying +#define glVertexAttribIPointer __rglgen_glVertexAttribIPointer +#define glGetVertexAttribIiv __rglgen_glGetVertexAttribIiv +#define glGetVertexAttribIuiv __rglgen_glGetVertexAttribIuiv +#define glVertexAttribI4i __rglgen_glVertexAttribI4i +#define glVertexAttribI4ui __rglgen_glVertexAttribI4ui +#define glVertexAttribI4iv __rglgen_glVertexAttribI4iv +#define glVertexAttribI4uiv __rglgen_glVertexAttribI4uiv +#define glGetUniformuiv __rglgen_glGetUniformuiv +#define glGetFragDataLocation __rglgen_glGetFragDataLocation +#define glUniform1ui __rglgen_glUniform1ui +#define glUniform2ui __rglgen_glUniform2ui +#define glUniform3ui __rglgen_glUniform3ui +#define glUniform4ui __rglgen_glUniform4ui +#define glUniform1uiv __rglgen_glUniform1uiv +#define glUniform2uiv __rglgen_glUniform2uiv +#define glUniform3uiv __rglgen_glUniform3uiv +#define glUniform4uiv __rglgen_glUniform4uiv +#define glClearBufferiv __rglgen_glClearBufferiv +#define glClearBufferuiv __rglgen_glClearBufferuiv +#define glClearBufferfv __rglgen_glClearBufferfv +#define glClearBufferfi __rglgen_glClearBufferfi +#define glGetStringi __rglgen_glGetStringi +#define glCopyBufferSubData __rglgen_glCopyBufferSubData +#define glGetUniformIndices __rglgen_glGetUniformIndices +#define glGetActiveUniformsiv __rglgen_glGetActiveUniformsiv +#define glGetUniformBlockIndex __rglgen_glGetUniformBlockIndex +#define glGetActiveUniformBlockiv __rglgen_glGetActiveUniformBlockiv +#define glGetActiveUniformBlockName __rglgen_glGetActiveUniformBlockName +#define glUniformBlockBinding __rglgen_glUniformBlockBinding +#define glDrawArraysInstanced __rglgen_glDrawArraysInstanced +#define glDrawElementsInstanced __rglgen_glDrawElementsInstanced +#define glFenceSync __rglgen_glFenceSync +#define glIsSync __rglgen_glIsSync +#define glDeleteSync __rglgen_glDeleteSync +#define glClientWaitSync __rglgen_glClientWaitSync +#define glWaitSync __rglgen_glWaitSync +#define glGetInteger64v __rglgen_glGetInteger64v +#define glGetSynciv __rglgen_glGetSynciv +#define glGetInteger64i_v __rglgen_glGetInteger64i_v +#define glGetBufferParameteri64v __rglgen_glGetBufferParameteri64v +#define glGenSamplers __rglgen_glGenSamplers +#define glDeleteSamplers __rglgen_glDeleteSamplers +#define glIsSampler __rglgen_glIsSampler +#define glBindSampler __rglgen_glBindSampler +#define glSamplerParameteri __rglgen_glSamplerParameteri +#define glSamplerParameteriv __rglgen_glSamplerParameteriv +#define glSamplerParameterf __rglgen_glSamplerParameterf +#define glSamplerParameterfv __rglgen_glSamplerParameterfv +#define glGetSamplerParameteriv __rglgen_glGetSamplerParameteriv +#define glGetSamplerParameterfv __rglgen_glGetSamplerParameterfv +#define glVertexAttribDivisor __rglgen_glVertexAttribDivisor +#define glBindTransformFeedback __rglgen_glBindTransformFeedback +#define glDeleteTransformFeedbacks __rglgen_glDeleteTransformFeedbacks +#define glGenTransformFeedbacks __rglgen_glGenTransformFeedbacks +#define glIsTransformFeedback __rglgen_glIsTransformFeedback +#define glPauseTransformFeedback __rglgen_glPauseTransformFeedback +#define glResumeTransformFeedback __rglgen_glResumeTransformFeedback +#define glGetProgramBinary __rglgen_glGetProgramBinary +#define glProgramBinary __rglgen_glProgramBinary +#define glProgramParameteri __rglgen_glProgramParameteri +#define glInvalidateFramebuffer __rglgen_glInvalidateFramebuffer +#define glInvalidateSubFramebuffer __rglgen_glInvalidateSubFramebuffer +#define glTexStorage2D __rglgen_glTexStorage2D +#define glTexStorage3D __rglgen_glTexStorage3D +#define glGetInternalformativ __rglgen_glGetInternalformativ +#define glDispatchCompute __rglgen_glDispatchCompute +#define glDispatchComputeIndirect __rglgen_glDispatchComputeIndirect +#define glDrawArraysIndirect __rglgen_glDrawArraysIndirect +#define glDrawElementsIndirect __rglgen_glDrawElementsIndirect +#define glFramebufferParameteri __rglgen_glFramebufferParameteri +#define glGetFramebufferParameteriv __rglgen_glGetFramebufferParameteriv +#define glGetProgramInterfaceiv __rglgen_glGetProgramInterfaceiv +#define glGetProgramResourceIndex __rglgen_glGetProgramResourceIndex +#define glGetProgramResourceName __rglgen_glGetProgramResourceName +#define glGetProgramResourceiv __rglgen_glGetProgramResourceiv +#define glGetProgramResourceLocation __rglgen_glGetProgramResourceLocation +#define glUseProgramStages __rglgen_glUseProgramStages +#define glActiveShaderProgram __rglgen_glActiveShaderProgram +#define glCreateShaderProgramv __rglgen_glCreateShaderProgramv +#define glBindProgramPipeline __rglgen_glBindProgramPipeline +#define glDeleteProgramPipelines __rglgen_glDeleteProgramPipelines +#define glGenProgramPipelines __rglgen_glGenProgramPipelines +#define glIsProgramPipeline __rglgen_glIsProgramPipeline +#define glGetProgramPipelineiv __rglgen_glGetProgramPipelineiv +#define glProgramUniform1i __rglgen_glProgramUniform1i +#define glProgramUniform2i __rglgen_glProgramUniform2i +#define glProgramUniform3i __rglgen_glProgramUniform3i +#define glProgramUniform4i __rglgen_glProgramUniform4i +#define glProgramUniform1ui __rglgen_glProgramUniform1ui +#define glProgramUniform2ui __rglgen_glProgramUniform2ui +#define glProgramUniform3ui __rglgen_glProgramUniform3ui +#define glProgramUniform4ui __rglgen_glProgramUniform4ui +#define glProgramUniform1f __rglgen_glProgramUniform1f +#define glProgramUniform2f __rglgen_glProgramUniform2f +#define glProgramUniform3f __rglgen_glProgramUniform3f +#define glProgramUniform4f __rglgen_glProgramUniform4f +#define glProgramUniform1iv __rglgen_glProgramUniform1iv +#define glProgramUniform2iv __rglgen_glProgramUniform2iv +#define glProgramUniform3iv __rglgen_glProgramUniform3iv +#define glProgramUniform4iv __rglgen_glProgramUniform4iv +#define glProgramUniform1uiv __rglgen_glProgramUniform1uiv +#define glProgramUniform2uiv __rglgen_glProgramUniform2uiv +#define glProgramUniform3uiv __rglgen_glProgramUniform3uiv +#define glProgramUniform4uiv __rglgen_glProgramUniform4uiv +#define glProgramUniform1fv __rglgen_glProgramUniform1fv +#define glProgramUniform2fv __rglgen_glProgramUniform2fv +#define glProgramUniform3fv __rglgen_glProgramUniform3fv +#define glProgramUniform4fv __rglgen_glProgramUniform4fv +#define glProgramUniformMatrix2fv __rglgen_glProgramUniformMatrix2fv +#define glProgramUniformMatrix3fv __rglgen_glProgramUniformMatrix3fv +#define glProgramUniformMatrix4fv __rglgen_glProgramUniformMatrix4fv +#define glProgramUniformMatrix2x3fv __rglgen_glProgramUniformMatrix2x3fv +#define glProgramUniformMatrix3x2fv __rglgen_glProgramUniformMatrix3x2fv +#define glProgramUniformMatrix2x4fv __rglgen_glProgramUniformMatrix2x4fv +#define glProgramUniformMatrix4x2fv __rglgen_glProgramUniformMatrix4x2fv +#define glProgramUniformMatrix3x4fv __rglgen_glProgramUniformMatrix3x4fv +#define glProgramUniformMatrix4x3fv __rglgen_glProgramUniformMatrix4x3fv +#define glValidateProgramPipeline __rglgen_glValidateProgramPipeline +#define glGetProgramPipelineInfoLog __rglgen_glGetProgramPipelineInfoLog +#define glBindImageTexture __rglgen_glBindImageTexture +#define glGetBooleani_v __rglgen_glGetBooleani_v +#define glMemoryBarrier __rglgen_glMemoryBarrier +#define glMemoryBarrierByRegion __rglgen_glMemoryBarrierByRegion +#define glTexStorage2DMultisample __rglgen_glTexStorage2DMultisample +#define glGetMultisamplefv __rglgen_glGetMultisamplefv +#define glSampleMaski __rglgen_glSampleMaski +#define glGetTexLevelParameteriv __rglgen_glGetTexLevelParameteriv +#define glGetTexLevelParameterfv __rglgen_glGetTexLevelParameterfv +#define glBindVertexBuffer __rglgen_glBindVertexBuffer +#define glVertexAttribFormat __rglgen_glVertexAttribFormat +#define glVertexAttribIFormat __rglgen_glVertexAttribIFormat +#define glVertexAttribBinding __rglgen_glVertexAttribBinding +#define glVertexBindingDivisor __rglgen_glVertexBindingDivisor +#define glBlendBarrier __rglgen_glBlendBarrier +#define glCopyImageSubData __rglgen_glCopyImageSubData +#define glDebugMessageControl __rglgen_glDebugMessageControl +#define glDebugMessageInsert __rglgen_glDebugMessageInsert +#define glDebugMessageCallback __rglgen_glDebugMessageCallback +#define glGetDebugMessageLog __rglgen_glGetDebugMessageLog +#define glPushDebugGroup __rglgen_glPushDebugGroup +#define glPopDebugGroup __rglgen_glPopDebugGroup +#define glObjectLabel __rglgen_glObjectLabel +#define glGetObjectLabel __rglgen_glGetObjectLabel +#define glObjectPtrLabel __rglgen_glObjectPtrLabel +#define glGetObjectPtrLabel __rglgen_glGetObjectPtrLabel +#define glGetPointerv __rglgen_glGetPointerv +#define glEnablei __rglgen_glEnablei +#define glDisablei __rglgen_glDisablei +#define glBlendEquationi __rglgen_glBlendEquationi +#define glBlendEquationSeparatei __rglgen_glBlendEquationSeparatei +#define glBlendFunci __rglgen_glBlendFunci +#define glBlendFuncSeparatei __rglgen_glBlendFuncSeparatei +#define glColorMaski __rglgen_glColorMaski +#define glIsEnabledi __rglgen_glIsEnabledi +#define glDrawElementsBaseVertex __rglgen_glDrawElementsBaseVertex +#define glDrawRangeElementsBaseVertex __rglgen_glDrawRangeElementsBaseVertex +#define glDrawElementsInstancedBaseVertex __rglgen_glDrawElementsInstancedBaseVertex +#define glFramebufferTexture __rglgen_glFramebufferTexture +#define glPrimitiveBoundingBox __rglgen_glPrimitiveBoundingBox +#define glGetGraphicsResetStatus __rglgen_glGetGraphicsResetStatus +#define glReadnPixels __rglgen_glReadnPixels +#define glGetnUniformfv __rglgen_glGetnUniformfv +#define glGetnUniformiv __rglgen_glGetnUniformiv +#define glGetnUniformuiv __rglgen_glGetnUniformuiv +#define glMinSampleShading __rglgen_glMinSampleShading +#define glPatchParameteri __rglgen_glPatchParameteri +#define glTexParameterIiv __rglgen_glTexParameterIiv +#define glTexParameterIuiv __rglgen_glTexParameterIuiv +#define glGetTexParameterIiv __rglgen_glGetTexParameterIiv +#define glGetTexParameterIuiv __rglgen_glGetTexParameterIuiv +#define glSamplerParameterIiv __rglgen_glSamplerParameterIiv +#define glSamplerParameterIuiv __rglgen_glSamplerParameterIuiv +#define glGetSamplerParameterIiv __rglgen_glGetSamplerParameterIiv +#define glGetSamplerParameterIuiv __rglgen_glGetSamplerParameterIuiv +#define glTexBuffer __rglgen_glTexBuffer +#define glTexBufferRange __rglgen_glTexBufferRange +#define glTexStorage3DMultisample __rglgen_glTexStorage3DMultisample -extern RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; -extern RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; -extern RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; -extern RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; -extern RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; -extern RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; -extern RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; -extern RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; -extern RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; -extern RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; -extern RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; -extern RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; -extern RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; -extern RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; -extern RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; -extern RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; -extern RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; -extern RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; -extern RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; -extern RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; -extern RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; -extern RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; -extern RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; -extern RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; -extern RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; -extern RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; -extern RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; -extern RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; -extern RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; -extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; -extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; -extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; -extern RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; -extern RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; -extern RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; -extern RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; -extern RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; -extern RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; -extern RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; -extern RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; -extern RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; -extern RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; -extern RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; -extern RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; -extern RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; -extern RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; -extern RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; -extern RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; -extern RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; -extern RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; -extern RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; -extern RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; -extern RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; -extern RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; -extern RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; -extern RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; -extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; -extern RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; -extern RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; -extern RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; -extern RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; -extern RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; -extern RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; -extern RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; -extern RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; -extern RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; -extern RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; -extern RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; -extern RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; -extern RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; -extern RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; -extern RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; -extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; -extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; -extern RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; -extern RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; -extern RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; -extern RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; -extern RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; -extern RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; -extern RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; -extern RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; -extern RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; -extern RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; -extern RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; -extern RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; -extern RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; -extern RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; -extern RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; -extern RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; -extern RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; -extern RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; -extern RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; -extern RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; -extern RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; -extern RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; -extern RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; -extern RGLSYMGLGETQUERYOBJECTI64VEXTPROC __rglgen_glGetQueryObjecti64vEXT; -extern RGLSYMGLGETQUERYOBJECTUI64VEXTPROC __rglgen_glGetQueryObjectui64vEXT; -extern RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; -extern RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; -extern RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; -extern RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; -extern RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; -extern RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; -extern RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; -extern RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; -extern RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; -extern RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; -extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; -extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; -extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; -extern RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; -extern RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; -extern RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; -extern RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; -extern RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; -extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; -extern RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; -extern RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; -extern RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; -extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; -extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; -extern RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; -extern RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; -extern RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; -extern RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; -extern RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; -extern RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; -extern RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; -extern RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; -extern RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; -extern RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; -extern RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; -extern RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; -extern RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; -extern RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; -extern RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; -extern RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; -extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; -extern RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; -extern RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; -extern RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; -extern RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; -extern RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; -extern RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; -extern RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; -extern RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; -extern RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; -extern RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; -extern RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; -extern RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; -extern RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; -extern RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; -extern RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; -extern RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; -extern RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; -extern RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; -extern RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; -extern RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; -extern RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; -extern RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; -extern RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; -extern RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; -extern RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; -extern RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; -extern RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; -extern RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; -extern RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; -extern RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; -extern RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; -extern RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; -extern RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; -extern RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; -extern RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; -extern RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; -extern RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; -extern RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; -extern RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; -extern RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; -extern RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; -extern RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; -extern RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; -extern RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; -extern RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; -extern RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; -extern RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; -extern RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; -extern RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; -extern RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; -extern RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; -extern RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; -extern RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR; +extern RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; +extern RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; +extern RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; +extern RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; +extern RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; +extern RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; +extern RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; +extern RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; +extern RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; +extern RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; +extern RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; +extern RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; +extern RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; +extern RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; +extern RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; +extern RGLSYMGLCLEARPROC __rglgen_glClear; +extern RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; +extern RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; +extern RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; +extern RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; +extern RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; +extern RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; +extern RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; +extern RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; +extern RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; +extern RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; +extern RGLSYMGLCULLFACEPROC __rglgen_glCullFace; +extern RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; +extern RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; +extern RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; +extern RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; +extern RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; +extern RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; +extern RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; +extern RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; +extern RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; +extern RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; +extern RGLSYMGLDISABLEPROC __rglgen_glDisable; +extern RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; +extern RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; +extern RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; +extern RGLSYMGLENABLEPROC __rglgen_glEnable; +extern RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; +extern RGLSYMGLFINISHPROC __rglgen_glFinish; +extern RGLSYMGLFLUSHPROC __rglgen_glFlush; +extern RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; +extern RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; +extern RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; +extern RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; +extern RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; +extern RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; +extern RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; +extern RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; +extern RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; +extern RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; +extern RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; +extern RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; +extern RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; +extern RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; +extern RGLSYMGLGETERRORPROC __rglgen_glGetError; +extern RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; +extern RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; +extern RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; +extern RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; +extern RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; +extern RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; +extern RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; +extern RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; +extern RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; +extern RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; +extern RGLSYMGLGETSTRINGPROC __rglgen_glGetString; +extern RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; +extern RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; +extern RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; +extern RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; +extern RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; +extern RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; +extern RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; +extern RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; +extern RGLSYMGLHINTPROC __rglgen_glHint; +extern RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; +extern RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; +extern RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; +extern RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; +extern RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; +extern RGLSYMGLISSHADERPROC __rglgen_glIsShader; +extern RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; +extern RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; +extern RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; +extern RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; +extern RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; +extern RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; +extern RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; +extern RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; +extern RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; +extern RGLSYMGLSCISSORPROC __rglgen_glScissor; +extern RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; +extern RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; +extern RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; +extern RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; +extern RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; +extern RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; +extern RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; +extern RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; +extern RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; +extern RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; +extern RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; +extern RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; +extern RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; +extern RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; +extern RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; +extern RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; +extern RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; +extern RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; +extern RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; +extern RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; +extern RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; +extern RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; +extern RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; +extern RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; +extern RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; +extern RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; +extern RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; +extern RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; +extern RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; +extern RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; +extern RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; +extern RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; +extern RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; +extern RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; +extern RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; +extern RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; +extern RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; +extern RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; +extern RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; +extern RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; +extern RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; +extern RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; +extern RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; +extern RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; +extern RGLSYMGLVIEWPORTPROC __rglgen_glViewport; +extern RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; +extern RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; +extern RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; +extern RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; +extern RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; +extern RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; +extern RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; +extern RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; +extern RGLSYMGLISQUERYPROC __rglgen_glIsQuery; +extern RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; +extern RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; +extern RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; +extern RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; +extern RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; +extern RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; +extern RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; +extern RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; +extern RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; +extern RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; +extern RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; +extern RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; +extern RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; +extern RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; +extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; +extern RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; +extern RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; +extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; +extern RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; +extern RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; +extern RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; +extern RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; +extern RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; +extern RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; +extern RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; +extern RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; +extern RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; +extern RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; +extern RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; +extern RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; +extern RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; +extern RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; +extern RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; +extern RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; +extern RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; +extern RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; +extern RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; +extern RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; +extern RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; +extern RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; +extern RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; +extern RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; +extern RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; +extern RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; +extern RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; +extern RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; +extern RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; +extern RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; +extern RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; +extern RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; +extern RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; +extern RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; +extern RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; +extern RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; +extern RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; +extern RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; +extern RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; +extern RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; +extern RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; +extern RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; +extern RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; +extern RGLSYMGLISSYNCPROC __rglgen_glIsSync; +extern RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; +extern RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; +extern RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; +extern RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; +extern RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; +extern RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; +extern RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; +extern RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; +extern RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; +extern RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; +extern RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; +extern RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; +extern RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; +extern RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; +extern RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; +extern RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; +extern RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; +extern RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; +extern RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; +extern RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; +extern RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; +extern RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; +extern RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; +extern RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; +extern RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; +extern RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; +extern RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; +extern RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; +extern RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; +extern RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; +extern RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; +extern RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; +extern RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +extern RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; +extern RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; +extern RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; +extern RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; +extern RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; +extern RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; +extern RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; +extern RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; +extern RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; +extern RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; +extern RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; +extern RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; +extern RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; +extern RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; +extern RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; +extern RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; +extern RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; +extern RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; +extern RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; +extern RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; +extern RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; +extern RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; +extern RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; +extern RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; +extern RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; +extern RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; +extern RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; +extern RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; +extern RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; +extern RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; +extern RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; +extern RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; +extern RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; +extern RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; +extern RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; +extern RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; +extern RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; +extern RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; +extern RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; +extern RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; +extern RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; +extern RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; +extern RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; +extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; +extern RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +extern RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; +extern RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +extern RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; +extern RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; +extern RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; +extern RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; +extern RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; +extern RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; +extern RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; +extern RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; +extern RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; +extern RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; +extern RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; +extern RGLSYMGLBLENDBARRIERPROC __rglgen_glBlendBarrier; +extern RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; +extern RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; +extern RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; +extern RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; +extern RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; +extern RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; +extern RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; +extern RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; +extern RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; +extern RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; +extern RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; +extern RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; +extern RGLSYMGLENABLEIPROC __rglgen_glEnablei; +extern RGLSYMGLDISABLEIPROC __rglgen_glDisablei; +extern RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; +extern RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; +extern RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; +extern RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; +extern RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; +extern RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; +extern RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXPROC __rglgen_glPrimitiveBoundingBox; +extern RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; +extern RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; +extern RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; +extern RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; +extern RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; +extern RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; +extern RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +extern RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; +extern RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; +extern RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; +extern RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; +extern RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; +extern RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; +extern RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; +extern RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; +extern RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; +extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; struct rglgen_sym_map { const char *sym; void *ptr; }; extern const struct rglgen_sym_map rglgen_symbol_map[]; diff --git a/core/deps/libretro-common/include/glsym/glsym_gl.h b/core/deps/libretro-common/include/glsym/glsym_gl.h index 1934287f2..0b627c275 100644 --- a/core/deps/libretro-common/include/glsym/glsym_gl.h +++ b/core/deps/libretro-common/include/glsym/glsym_gl.h @@ -50,6 +50,68 @@ typedef unsigned long long int GLuint64; typedef unsigned long long int GLuint64EXT; typedef struct __GLsync *GLsync; #endif +typedef void (APIENTRYP RGLSYMGLCULLFACEPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLFRONTFACEPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLHINTPROC) (GLenum target, GLenum mode); +typedef void (APIENTRYP RGLSYMGLLINEWIDTHPROC) (GLfloat width); +typedef void (APIENTRYP RGLSYMGLPOINTSIZEPROC) (GLfloat size); +typedef void (APIENTRYP RGLSYMGLPOLYGONMODEPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP RGLSYMGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE1DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLDRAWBUFFERPROC) (GLenum buf); +typedef void (APIENTRYP RGLSYMGLCLEARPROC) (GLbitfield mask); +typedef void (APIENTRYP RGLSYMGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP RGLSYMGLCLEARSTENCILPROC) (GLint s); +typedef void (APIENTRYP RGLSYMGLCLEARDEPTHPROC) (GLdouble depth); +typedef void (APIENTRYP RGLSYMGLSTENCILMASKPROC) (GLuint mask); +typedef void (APIENTRYP RGLSYMGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (APIENTRYP RGLSYMGLDEPTHMASKPROC) (GLboolean flag); +typedef void (APIENTRYP RGLSYMGLDISABLEPROC) (GLenum cap); +typedef void (APIENTRYP RGLSYMGLENABLEPROC) (GLenum cap); +typedef void (APIENTRYP RGLSYMGLFINISHPROC) (void); +typedef void (APIENTRYP RGLSYMGLFLUSHPROC) (void); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); +typedef void (APIENTRYP RGLSYMGLLOGICOPPROC) (GLenum opcode); +typedef void (APIENTRYP RGLSYMGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP RGLSYMGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (APIENTRYP RGLSYMGLDEPTHFUNCPROC) (GLenum func); +typedef void (APIENTRYP RGLSYMGLPIXELSTOREFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLREADBUFFERPROC) (GLenum src); +typedef void (APIENTRYP RGLSYMGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); +typedef void (APIENTRYP RGLSYMGLGETDOUBLEVPROC) (GLenum pname, GLdouble *data); +typedef GLenum (APIENTRYP RGLSYMGLGETERRORPROC) (void); +typedef void (APIENTRYP RGLSYMGLGETFLOATVPROC) (GLenum pname, GLfloat *data); +typedef void (APIENTRYP RGLSYMGLGETINTEGERVPROC) (GLenum pname, GLint *data); +typedef const GLubyte *(APIENTRYP RGLSYMGLGETSTRINGPROC) (GLenum name); +typedef void (APIENTRYP RGLSYMGLGETTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP RGLSYMGLISENABLEDPROC) (GLenum cap); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEPROC) (GLdouble n, GLdouble f); +typedef void (APIENTRYP RGLSYMGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP RGLSYMGLGETPOINTERVPROC) (GLenum pname, void **params); +typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP RGLSYMGLCOPYTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP RGLSYMGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP RGLSYMGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP RGLSYMGLISTEXTUREPROC) (GLuint texture); typedef void (APIENTRYP RGLSYMGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); typedef void (APIENTRYP RGLSYMGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); @@ -63,43 +125,6 @@ typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLi typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); -typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); typedef void (APIENTRYP RGLSYMGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); @@ -107,44 +132,6 @@ typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat para typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP RGLSYMGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP RGLSYMGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP RGLSYMGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP RGLSYMGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP RGLSYMGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SVPROC) (const GLshort *v); typedef void (APIENTRYP RGLSYMGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONPROC) (GLenum mode); typedef void (APIENTRYP RGLSYMGLGENQUERIESPROC) (GLsizei n, GLuint *ids); @@ -379,7 +366,7 @@ typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum a typedef void (APIENTRYP RGLSYMGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); typedef void (APIENTRYP RGLSYMGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (APIENTRYP RGLSYMGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP RGLSYMGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP RGLSYMGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); typedef void (APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); typedef GLint (APIENTRYP RGLSYMGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP RGLSYMGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); @@ -408,36 +395,6 @@ typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP RGLSYMGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP RGLSYMGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP RGLSYMGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP RGLSYMGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP RGLSYMGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP RGLSYMGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP RGLSYMGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP RGLSYMGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP RGLSYMGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP RGLSYMGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP RGLSYMGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); typedef void (APIENTRYP RGLSYMGLMINSAMPLESHADINGPROC) (GLfloat value); typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); @@ -636,6 +593,121 @@ typedef void (APIENTRYP RGLSYMGLBINDTEXTURESPROC) (GLuint first, GLsizei count, typedef void (APIENTRYP RGLSYMGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); typedef void (APIENTRYP RGLSYMGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP RGLSYMGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP RGLSYMGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP RGLSYMGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP RGLSYMGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP RGLSYMGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP RGLSYMGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP RGLSYMGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP RGLSYMGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GLboolean (APIENTRYP RGLSYMGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP RGLSYMGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP RGLSYMGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP RGLSYMGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (APIENTRYP RGLSYMGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP RGLSYMGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP RGLSYMGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP RGLSYMGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP RGLSYMGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP RGLSYMGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP RGLSYMGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP RGLSYMGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP RGLSYMGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP RGLSYMGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP RGLSYMGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP RGLSYMGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP RGLSYMGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP RGLSYMGLTEXTUREBARRIERPROC) (void); +typedef void (APIENTRYP RGLSYMGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTUREHANDLEARBPROC) (GLuint texture); typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); @@ -652,132 +724,62 @@ typedef GLboolean (APIENTRYP RGLSYMGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 han typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -#ifdef __APPLE__ - struct _cl_context; - struct _cl_event; -#endif -typedef GLsync (APIENTRYP RGLSYMGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); -typedef void (APIENTRYP RGLSYMGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); typedef void (APIENTRYP RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKARBPROC) (RGLGENGLDEBUGPROCARB callback, const void *userParam); typedef GLuint (APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (APIENTRYP RGLSYMGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP RGLSYMGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); typedef void (APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); -typedef void (APIENTRYP RGLSYMGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); -typedef void (APIENTRYP RGLSYMGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP RGLSYMGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP RGLSYMGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); -typedef GLboolean (APIENTRYP RGLSYMGLISPROGRAMARBPROC) (GLuint program); typedef void (APIENTRYP RGLSYMGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP RGLSYMGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); -typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP RGLSYMGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); -typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP RGLSYMGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); -typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); -typedef void (APIENTRYP RGLSYMGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); -typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); -typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP RGLSYMGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP RGLSYMGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP RGLSYMGLRESETMINMAXPROC) (GLenum target); -typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); -typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +typedef void (APIENTRYP RGLSYMGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (APIENTRYP RGLSYMGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP RGLSYMGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP RGLSYMGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP RGLSYMGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64 *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -typedef void (APIENTRYP RGLSYMGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP RGLSYMGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); -typedef void (APIENTRYP RGLSYMGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP RGLSYMGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP RGLSYMGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP RGLSYMGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP RGLSYMGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP RGLSYMGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); typedef GLenum (APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC) (void); typedef void (APIENTRYP RGLSYMGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); typedef void (APIENTRYP RGLSYMGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); @@ -786,300 +788,569 @@ typedef void (APIENTRYP RGLSYMGLGETNUNIFORMFVARBPROC) (GLuint program, GLint loc typedef void (APIENTRYP RGLSYMGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); typedef void (APIENTRYP RGLSYMGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); typedef void (APIENTRYP RGLSYMGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -typedef void (APIENTRYP RGLSYMGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP RGLSYMGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP RGLSYMGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP RGLSYMGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP RGLSYMGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); -typedef void (APIENTRYP RGLSYMGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); -typedef void (APIENTRYP RGLSYMGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); -typedef void (APIENTRYP RGLSYMGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); -typedef void (APIENTRYP RGLSYMGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLEVALUATEDEPTHVALUESARBPROC) (void); typedef void (APIENTRYP RGLSYMGLMINSAMPLESHADINGARBPROC) (GLfloat value); -typedef void (APIENTRYP RGLSYMGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP RGLSYMGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP RGLSYMGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP RGLSYMGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP RGLSYMGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); -typedef void (APIENTRYP RGLSYMGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP RGLSYMGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP RGLSYMGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP RGLSYMGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP RGLSYMGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP RGLSYMGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP RGLSYMGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP RGLSYMGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP RGLSYMGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP RGLSYMGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP RGLSYMGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP RGLSYMGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP RGLSYMGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP RGLSYMGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP RGLSYMGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP RGLSYMGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP RGLSYMGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP RGLSYMGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP RGLSYMGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP RGLSYMGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); typedef void (APIENTRYP RGLSYMGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); typedef void (APIENTRYP RGLSYMGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP RGLSYMGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); typedef GLboolean (APIENTRYP RGLSYMGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); typedef void (APIENTRYP RGLSYMGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); typedef void (APIENTRYP RGLSYMGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP RGLSYMGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP RGLSYMGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); typedef void (APIENTRYP RGLSYMGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); -typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP RGLSYMGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP RGLSYMGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (APIENTRYP RGLSYMGLVERTEXBLENDARBPROC) (GLint count); -typedef void (APIENTRYP RGLSYMGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP RGLSYMGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP RGLSYMGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP RGLSYMGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP RGLSYMGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); -typedef void (APIENTRYP RGLSYMGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); -typedef void (APIENTRYP RGLSYMGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); -typedef void *(APIENTRYP RGLSYMGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP RGLSYMGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP RGLSYMGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -typedef void (APIENTRYP RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); -typedef void (APIENTRYP RGLSYMGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP RGLSYMGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP RGLSYMGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD1BOESPROC) (GLbyte s); -typedef void (APIENTRYP RGLSYMGLTEXCOORD1BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); -typedef void (APIENTRYP RGLSYMGLTEXCOORD2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP RGLSYMGLTEXCOORD3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP RGLSYMGLTEXCOORD4BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLVERTEX2BOESPROC) (GLbyte x); -typedef void (APIENTRYP RGLSYMGLVERTEX2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLVERTEX3BOESPROC) (GLbyte x, GLbyte y); -typedef void (APIENTRYP RGLSYMGLVERTEX3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z); -typedef void (APIENTRYP RGLSYMGLVERTEX4BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP RGLSYMGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); -typedef void (APIENTRYP RGLSYMGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP RGLSYMGLCLEARDEPTHXOESPROC) (GLfixed depth); -typedef void (APIENTRYP RGLSYMGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); -typedef void (APIENTRYP RGLSYMGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP RGLSYMGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); -typedef void (APIENTRYP RGLSYMGLFOGXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP RGLSYMGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP RGLSYMGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); -typedef void (APIENTRYP RGLSYMGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP RGLSYMGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLLINEWIDTHXOESPROC) (GLfixed width); -typedef void (APIENTRYP RGLSYMGLLOADMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP RGLSYMGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); -typedef void (APIENTRYP RGLSYMGLMULTMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP RGLSYMGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (APIENTRYP RGLSYMGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLPOINTSIZEXOESPROC) (GLfixed size); -typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); -typedef void (APIENTRYP RGLSYMGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); -typedef void (APIENTRYP RGLSYMGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP RGLSYMGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP RGLSYMGLACCUMXOESPROC) (GLenum op, GLfixed value); -typedef void (APIENTRYP RGLSYMGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); -typedef void (APIENTRYP RGLSYMGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP RGLSYMGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP RGLSYMGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); -typedef void (APIENTRYP RGLSYMGLCOLOR3XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP RGLSYMGLCOLOR4XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLEVALCOORD1XOESPROC) (GLfixed u); -typedef void (APIENTRYP RGLSYMGLEVALCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); -typedef void (APIENTRYP RGLSYMGLEVALCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); -typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); -typedef void (APIENTRYP RGLSYMGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); -typedef void (APIENTRYP RGLSYMGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); -typedef void (APIENTRYP RGLSYMGLINDEXXOESPROC) (GLfixed component); -typedef void (APIENTRYP RGLSYMGLINDEXXVOESPROC) (const GLfixed *component); -typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP RGLSYMGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); -typedef void (APIENTRYP RGLSYMGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); -typedef void (APIENTRYP RGLSYMGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); -typedef void (APIENTRYP RGLSYMGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); -typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLNORMAL3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLPASSTHROUGHXOESPROC) (GLfixed token); -typedef void (APIENTRYP RGLSYMGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); -typedef void (APIENTRYP RGLSYMGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); -typedef void (APIENTRYP RGLSYMGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); -typedef void (APIENTRYP RGLSYMGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP RGLSYMGLRASTERPOS2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP RGLSYMGLRASTERPOS3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); -typedef void (APIENTRYP RGLSYMGLRASTERPOS4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); -typedef void (APIENTRYP RGLSYMGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); -typedef void (APIENTRYP RGLSYMGLTEXCOORD1XOESPROC) (GLfixed s); -typedef void (APIENTRYP RGLSYMGLTEXCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); -typedef void (APIENTRYP RGLSYMGLTEXCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP RGLSYMGLTEXCOORD3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP RGLSYMGLTEXCOORD4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); -typedef void (APIENTRYP RGLSYMGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP RGLSYMGLVERTEX2XOESPROC) (GLfixed x); -typedef void (APIENTRYP RGLSYMGLVERTEX2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP RGLSYMGLVERTEX3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP RGLSYMGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP RGLSYMGLVERTEX4XVOESPROC) (const GLfixed *coords); -typedef GLbitfield (APIENTRYP RGLSYMGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); -typedef void (APIENTRYP RGLSYMGLCLEARDEPTHFOESPROC) (GLclampf depth); -typedef void (APIENTRYP RGLSYMGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); -typedef void (APIENTRYP RGLSYMGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (APIENTRYP RGLSYMGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (APIENTRYP RGLSYMGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); -typedef void (APIENTRYP RGLSYMGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLBLENDBARRIERKHRPROC) (void); +typedef void (APIENTRYP RGLSYMGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); +typedef void (APIENTRYP RGLSYMGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); +typedef void (APIENTRYP RGLSYMGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +typedef void (APIENTRYP RGLSYMGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP RGLSYMGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP RGLSYMGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP RGLSYMGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP RGLSYMGLPOPGROUPMARKEREXTPROC) (void); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP RGLSYMGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP RGLSYMGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP RGLSYMGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP RGLSYMGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP RGLSYMGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP RGLSYMGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP RGLSYMGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP RGLSYMGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP RGLSYMGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP RGLSYMGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP RGLSYMGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP RGLSYMGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP RGLSYMGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP RGLSYMGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP RGLSYMGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP RGLSYMGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP RGLSYMGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP RGLSYMGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP RGLSYMGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP RGLSYMGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP RGLSYMGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP RGLSYMGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP RGLSYMGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (APIENTRYP RGLSYMGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (APIENTRYP RGLSYMGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP RGLSYMGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP RGLSYMGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); +typedef void (APIENTRYP RGLSYMGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP RGLSYMGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP RGLSYMGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP RGLSYMGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP RGLSYMGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP RGLSYMGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP RGLSYMGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP RGLSYMGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP RGLSYMGLBLENDBARRIERNVPROC) (void); +typedef void (APIENTRYP RGLSYMGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +typedef void (APIENTRYP RGLSYMGLCREATESTATESNVPROC) (GLsizei n, GLuint *states); +typedef void (APIENTRYP RGLSYMGLDELETESTATESNVPROC) (GLsizei n, const GLuint *states); +typedef GLboolean (APIENTRYP RGLSYMGLISSTATENVPROC) (GLuint state); +typedef void (APIENTRYP RGLSYMGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); +typedef GLuint (APIENTRYP RGLSYMGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (APIENTRYP RGLSYMGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef void (APIENTRYP RGLSYMGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP RGLSYMGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP RGLSYMGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP RGLSYMGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP RGLSYMGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint *lists); +typedef void (APIENTRYP RGLSYMGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint *lists); +typedef GLboolean (APIENTRYP RGLSYMGLISCOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP RGLSYMGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP RGLSYMGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (APIENTRYP RGLSYMGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP RGLSYMGLCALLCOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP RGLSYMGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP RGLSYMGLENDCONDITIONALRENDERNVPROC) (void); +typedef void (APIENTRYP RGLSYMGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +typedef void (APIENTRYP RGLSYMGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); +typedef void (APIENTRYP RGLSYMGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef void (APIENTRYP RGLSYMGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP RGLSYMGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP RGLSYMGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +typedef void (APIENTRYP RGLSYMGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +typedef void (APIENTRYP RGLSYMGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); +typedef void (APIENTRYP RGLSYMGLCOVERAGEMODULATIONNVPROC) (GLenum components); +typedef void (APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP RGLSYMGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP RGLSYMGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP RGLSYMGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP RGLSYMGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +typedef void (APIENTRYP RGLSYMGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); +typedef void (APIENTRYP RGLSYMGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP RGLSYMGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP RGLSYMGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP RGLSYMGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP RGLSYMGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); +typedef void (APIENTRYP RGLSYMGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef GLuint (APIENTRYP RGLSYMGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP RGLSYMGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP RGLSYMGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP RGLSYMGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP RGLSYMGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP RGLSYMGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP RGLSYMGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP RGLSYMGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP RGLSYMGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP RGLSYMGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP RGLSYMGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP RGLSYMGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP RGLSYMGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP RGLSYMGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP RGLSYMGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP RGLSYMGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP RGLSYMGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP RGLSYMGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP RGLSYMGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP RGLSYMGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP RGLSYMGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP RGLSYMGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP RGLSYMGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP RGLSYMGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP RGLSYMGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP RGLSYMGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP RGLSYMGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP RGLSYMGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP RGLSYMGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP RGLSYMGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP RGLSYMGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (APIENTRYP RGLSYMGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP RGLSYMGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP RGLSYMGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP RGLSYMGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP RGLSYMGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP RGLSYMGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP RGLSYMGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP RGLSYMGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP RGLSYMGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef GLenum (APIENTRYP RGLSYMGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP RGLSYMGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP RGLSYMGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLRESOLVEDEPTHVALUESNVPROC) (void); +typedef void (APIENTRYP RGLSYMGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP RGLSYMGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP RGLSYMGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP RGLSYMGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP RGLSYMGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP RGLSYMGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP RGLSYMGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP RGLSYMGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP RGLSYMGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP RGLSYMGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); +typedef void (APIENTRYP RGLSYMGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); +typedef void (APIENTRYP RGLSYMGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); +typedef void (APIENTRYP RGLSYMGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); +typedef void (APIENTRYP RGLSYMGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +typedef void (APIENTRYP RGLSYMGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); +typedef void (APIENTRYP RGLSYMGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); +typedef void (APIENTRYP RGLSYMGLTEXTUREBARRIERNVPROC) (void); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP RGLSYMGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +typedef void (APIENTRYP RGLSYMGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#define glCullFace __rglgen_glCullFace +#define glFrontFace __rglgen_glFrontFace +#define glHint __rglgen_glHint +#define glLineWidth __rglgen_glLineWidth +#define glPointSize __rglgen_glPointSize +#define glPolygonMode __rglgen_glPolygonMode +#define glScissor __rglgen_glScissor +#define glTexParameterf __rglgen_glTexParameterf +#define glTexParameterfv __rglgen_glTexParameterfv +#define glTexParameteri __rglgen_glTexParameteri +#define glTexParameteriv __rglgen_glTexParameteriv +#define glTexImage1D __rglgen_glTexImage1D +#define glTexImage2D __rglgen_glTexImage2D +#define glDrawBuffer __rglgen_glDrawBuffer +#define glClear __rglgen_glClear +#define glClearColor __rglgen_glClearColor +#define glClearStencil __rglgen_glClearStencil +#define glClearDepth __rglgen_glClearDepth +#define glStencilMask __rglgen_glStencilMask +#define glColorMask __rglgen_glColorMask +#define glDepthMask __rglgen_glDepthMask +#define glDisable __rglgen_glDisable +#define glEnable __rglgen_glEnable +#define glFinish __rglgen_glFinish +#define glFlush __rglgen_glFlush +#define glBlendFunc __rglgen_glBlendFunc +#define glLogicOp __rglgen_glLogicOp +#define glStencilFunc __rglgen_glStencilFunc +#define glStencilOp __rglgen_glStencilOp +#define glDepthFunc __rglgen_glDepthFunc +#define glPixelStoref __rglgen_glPixelStoref +#define glPixelStorei __rglgen_glPixelStorei +#define glReadBuffer __rglgen_glReadBuffer +#define glReadPixels __rglgen_glReadPixels +#define glGetBooleanv __rglgen_glGetBooleanv +#define glGetDoublev __rglgen_glGetDoublev +#define glGetError __rglgen_glGetError +#define glGetFloatv __rglgen_glGetFloatv +#define glGetIntegerv __rglgen_glGetIntegerv +#define glGetString __rglgen_glGetString +#define glGetTexImage __rglgen_glGetTexImage +#define glGetTexParameterfv __rglgen_glGetTexParameterfv +#define glGetTexParameteriv __rglgen_glGetTexParameteriv +#define glGetTexLevelParameterfv __rglgen_glGetTexLevelParameterfv +#define glGetTexLevelParameteriv __rglgen_glGetTexLevelParameteriv +#define glIsEnabled __rglgen_glIsEnabled +#define glDepthRange __rglgen_glDepthRange +#define glViewport __rglgen_glViewport +#define glDrawArrays __rglgen_glDrawArrays +#define glDrawElements __rglgen_glDrawElements +#define glGetPointerv __rglgen_glGetPointerv +#define glPolygonOffset __rglgen_glPolygonOffset +#define glCopyTexImage1D __rglgen_glCopyTexImage1D +#define glCopyTexImage2D __rglgen_glCopyTexImage2D +#define glCopyTexSubImage1D __rglgen_glCopyTexSubImage1D +#define glCopyTexSubImage2D __rglgen_glCopyTexSubImage2D +#define glTexSubImage1D __rglgen_glTexSubImage1D +#define glTexSubImage2D __rglgen_glTexSubImage2D +#define glBindTexture __rglgen_glBindTexture +#define glDeleteTextures __rglgen_glDeleteTextures +#define glGenTextures __rglgen_glGenTextures +#define glIsTexture __rglgen_glIsTexture #define glDrawRangeElements __rglgen_glDrawRangeElements #define glTexImage3D __rglgen_glTexImage3D #define glTexSubImage3D __rglgen_glTexSubImage3D @@ -1093,43 +1364,6 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glCompressedTexSubImage2D __rglgen_glCompressedTexSubImage2D #define glCompressedTexSubImage1D __rglgen_glCompressedTexSubImage1D #define glGetCompressedTexImage __rglgen_glGetCompressedTexImage -#define glClientActiveTexture __rglgen_glClientActiveTexture -#define glMultiTexCoord1d __rglgen_glMultiTexCoord1d -#define glMultiTexCoord1dv __rglgen_glMultiTexCoord1dv -#define glMultiTexCoord1f __rglgen_glMultiTexCoord1f -#define glMultiTexCoord1fv __rglgen_glMultiTexCoord1fv -#define glMultiTexCoord1i __rglgen_glMultiTexCoord1i -#define glMultiTexCoord1iv __rglgen_glMultiTexCoord1iv -#define glMultiTexCoord1s __rglgen_glMultiTexCoord1s -#define glMultiTexCoord1sv __rglgen_glMultiTexCoord1sv -#define glMultiTexCoord2d __rglgen_glMultiTexCoord2d -#define glMultiTexCoord2dv __rglgen_glMultiTexCoord2dv -#define glMultiTexCoord2f __rglgen_glMultiTexCoord2f -#define glMultiTexCoord2fv __rglgen_glMultiTexCoord2fv -#define glMultiTexCoord2i __rglgen_glMultiTexCoord2i -#define glMultiTexCoord2iv __rglgen_glMultiTexCoord2iv -#define glMultiTexCoord2s __rglgen_glMultiTexCoord2s -#define glMultiTexCoord2sv __rglgen_glMultiTexCoord2sv -#define glMultiTexCoord3d __rglgen_glMultiTexCoord3d -#define glMultiTexCoord3dv __rglgen_glMultiTexCoord3dv -#define glMultiTexCoord3f __rglgen_glMultiTexCoord3f -#define glMultiTexCoord3fv __rglgen_glMultiTexCoord3fv -#define glMultiTexCoord3i __rglgen_glMultiTexCoord3i -#define glMultiTexCoord3iv __rglgen_glMultiTexCoord3iv -#define glMultiTexCoord3s __rglgen_glMultiTexCoord3s -#define glMultiTexCoord3sv __rglgen_glMultiTexCoord3sv -#define glMultiTexCoord4d __rglgen_glMultiTexCoord4d -#define glMultiTexCoord4dv __rglgen_glMultiTexCoord4dv -#define glMultiTexCoord4f __rglgen_glMultiTexCoord4f -#define glMultiTexCoord4fv __rglgen_glMultiTexCoord4fv -#define glMultiTexCoord4i __rglgen_glMultiTexCoord4i -#define glMultiTexCoord4iv __rglgen_glMultiTexCoord4iv -#define glMultiTexCoord4s __rglgen_glMultiTexCoord4s -#define glMultiTexCoord4sv __rglgen_glMultiTexCoord4sv -#define glLoadTransposeMatrixf __rglgen_glLoadTransposeMatrixf -#define glLoadTransposeMatrixd __rglgen_glLoadTransposeMatrixd -#define glMultTransposeMatrixf __rglgen_glMultTransposeMatrixf -#define glMultTransposeMatrixd __rglgen_glMultTransposeMatrixd #define glBlendFuncSeparate __rglgen_glBlendFuncSeparate #define glMultiDrawArrays __rglgen_glMultiDrawArrays #define glMultiDrawElements __rglgen_glMultiDrawElements @@ -1137,44 +1371,6 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glPointParameterfv __rglgen_glPointParameterfv #define glPointParameteri __rglgen_glPointParameteri #define glPointParameteriv __rglgen_glPointParameteriv -#define glFogCoordf __rglgen_glFogCoordf -#define glFogCoordfv __rglgen_glFogCoordfv -#define glFogCoordd __rglgen_glFogCoordd -#define glFogCoorddv __rglgen_glFogCoorddv -#define glFogCoordPointer __rglgen_glFogCoordPointer -#define glSecondaryColor3b __rglgen_glSecondaryColor3b -#define glSecondaryColor3bv __rglgen_glSecondaryColor3bv -#define glSecondaryColor3d __rglgen_glSecondaryColor3d -#define glSecondaryColor3dv __rglgen_glSecondaryColor3dv -#define glSecondaryColor3f __rglgen_glSecondaryColor3f -#define glSecondaryColor3fv __rglgen_glSecondaryColor3fv -#define glSecondaryColor3i __rglgen_glSecondaryColor3i -#define glSecondaryColor3iv __rglgen_glSecondaryColor3iv -#define glSecondaryColor3s __rglgen_glSecondaryColor3s -#define glSecondaryColor3sv __rglgen_glSecondaryColor3sv -#define glSecondaryColor3ub __rglgen_glSecondaryColor3ub -#define glSecondaryColor3ubv __rglgen_glSecondaryColor3ubv -#define glSecondaryColor3ui __rglgen_glSecondaryColor3ui -#define glSecondaryColor3uiv __rglgen_glSecondaryColor3uiv -#define glSecondaryColor3us __rglgen_glSecondaryColor3us -#define glSecondaryColor3usv __rglgen_glSecondaryColor3usv -#define glSecondaryColorPointer __rglgen_glSecondaryColorPointer -#define glWindowPos2d __rglgen_glWindowPos2d -#define glWindowPos2dv __rglgen_glWindowPos2dv -#define glWindowPos2f __rglgen_glWindowPos2f -#define glWindowPos2fv __rglgen_glWindowPos2fv -#define glWindowPos2i __rglgen_glWindowPos2i -#define glWindowPos2iv __rglgen_glWindowPos2iv -#define glWindowPos2s __rglgen_glWindowPos2s -#define glWindowPos2sv __rglgen_glWindowPos2sv -#define glWindowPos3d __rglgen_glWindowPos3d -#define glWindowPos3dv __rglgen_glWindowPos3dv -#define glWindowPos3f __rglgen_glWindowPos3f -#define glWindowPos3fv __rglgen_glWindowPos3fv -#define glWindowPos3i __rglgen_glWindowPos3i -#define glWindowPos3iv __rglgen_glWindowPos3iv -#define glWindowPos3s __rglgen_glWindowPos3s -#define glWindowPos3sv __rglgen_glWindowPos3sv #define glBlendColor __rglgen_glBlendColor #define glBlendEquation __rglgen_glBlendEquation #define glGenQueries __rglgen_glGenQueries @@ -1438,36 +1634,6 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glVertexAttribP3uiv __rglgen_glVertexAttribP3uiv #define glVertexAttribP4ui __rglgen_glVertexAttribP4ui #define glVertexAttribP4uiv __rglgen_glVertexAttribP4uiv -#define glVertexP2ui __rglgen_glVertexP2ui -#define glVertexP2uiv __rglgen_glVertexP2uiv -#define glVertexP3ui __rglgen_glVertexP3ui -#define glVertexP3uiv __rglgen_glVertexP3uiv -#define glVertexP4ui __rglgen_glVertexP4ui -#define glVertexP4uiv __rglgen_glVertexP4uiv -#define glTexCoordP1ui __rglgen_glTexCoordP1ui -#define glTexCoordP1uiv __rglgen_glTexCoordP1uiv -#define glTexCoordP2ui __rglgen_glTexCoordP2ui -#define glTexCoordP2uiv __rglgen_glTexCoordP2uiv -#define glTexCoordP3ui __rglgen_glTexCoordP3ui -#define glTexCoordP3uiv __rglgen_glTexCoordP3uiv -#define glTexCoordP4ui __rglgen_glTexCoordP4ui -#define glTexCoordP4uiv __rglgen_glTexCoordP4uiv -#define glMultiTexCoordP1ui __rglgen_glMultiTexCoordP1ui -#define glMultiTexCoordP1uiv __rglgen_glMultiTexCoordP1uiv -#define glMultiTexCoordP2ui __rglgen_glMultiTexCoordP2ui -#define glMultiTexCoordP2uiv __rglgen_glMultiTexCoordP2uiv -#define glMultiTexCoordP3ui __rglgen_glMultiTexCoordP3ui -#define glMultiTexCoordP3uiv __rglgen_glMultiTexCoordP3uiv -#define glMultiTexCoordP4ui __rglgen_glMultiTexCoordP4ui -#define glMultiTexCoordP4uiv __rglgen_glMultiTexCoordP4uiv -#define glNormalP3ui __rglgen_glNormalP3ui -#define glNormalP3uiv __rglgen_glNormalP3uiv -#define glColorP3ui __rglgen_glColorP3ui -#define glColorP3uiv __rglgen_glColorP3uiv -#define glColorP4ui __rglgen_glColorP4ui -#define glColorP4uiv __rglgen_glColorP4uiv -#define glSecondaryColorP3ui __rglgen_glSecondaryColorP3ui -#define glSecondaryColorP3uiv __rglgen_glSecondaryColorP3uiv #define glMinSampleShading __rglgen_glMinSampleShading #define glBlendEquationi __rglgen_glBlendEquationi #define glBlendEquationSeparatei __rglgen_glBlendEquationSeparatei @@ -1666,6 +1832,121 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glBindSamplers __rglgen_glBindSamplers #define glBindImageTextures __rglgen_glBindImageTextures #define glBindVertexBuffers __rglgen_glBindVertexBuffers +#define glClipControl __rglgen_glClipControl +#define glCreateTransformFeedbacks __rglgen_glCreateTransformFeedbacks +#define glTransformFeedbackBufferBase __rglgen_glTransformFeedbackBufferBase +#define glTransformFeedbackBufferRange __rglgen_glTransformFeedbackBufferRange +#define glGetTransformFeedbackiv __rglgen_glGetTransformFeedbackiv +#define glGetTransformFeedbacki_v __rglgen_glGetTransformFeedbacki_v +#define glGetTransformFeedbacki64_v __rglgen_glGetTransformFeedbacki64_v +#define glCreateBuffers __rglgen_glCreateBuffers +#define glNamedBufferStorage __rglgen_glNamedBufferStorage +#define glNamedBufferData __rglgen_glNamedBufferData +#define glNamedBufferSubData __rglgen_glNamedBufferSubData +#define glCopyNamedBufferSubData __rglgen_glCopyNamedBufferSubData +#define glClearNamedBufferData __rglgen_glClearNamedBufferData +#define glClearNamedBufferSubData __rglgen_glClearNamedBufferSubData +#define glMapNamedBuffer __rglgen_glMapNamedBuffer +#define glMapNamedBufferRange __rglgen_glMapNamedBufferRange +#define glUnmapNamedBuffer __rglgen_glUnmapNamedBuffer +#define glFlushMappedNamedBufferRange __rglgen_glFlushMappedNamedBufferRange +#define glGetNamedBufferParameteriv __rglgen_glGetNamedBufferParameteriv +#define glGetNamedBufferParameteri64v __rglgen_glGetNamedBufferParameteri64v +#define glGetNamedBufferPointerv __rglgen_glGetNamedBufferPointerv +#define glGetNamedBufferSubData __rglgen_glGetNamedBufferSubData +#define glCreateFramebuffers __rglgen_glCreateFramebuffers +#define glNamedFramebufferRenderbuffer __rglgen_glNamedFramebufferRenderbuffer +#define glNamedFramebufferParameteri __rglgen_glNamedFramebufferParameteri +#define glNamedFramebufferTexture __rglgen_glNamedFramebufferTexture +#define glNamedFramebufferTextureLayer __rglgen_glNamedFramebufferTextureLayer +#define glNamedFramebufferDrawBuffer __rglgen_glNamedFramebufferDrawBuffer +#define glNamedFramebufferDrawBuffers __rglgen_glNamedFramebufferDrawBuffers +#define glNamedFramebufferReadBuffer __rglgen_glNamedFramebufferReadBuffer +#define glInvalidateNamedFramebufferData __rglgen_glInvalidateNamedFramebufferData +#define glInvalidateNamedFramebufferSubData __rglgen_glInvalidateNamedFramebufferSubData +#define glClearNamedFramebufferiv __rglgen_glClearNamedFramebufferiv +#define glClearNamedFramebufferuiv __rglgen_glClearNamedFramebufferuiv +#define glClearNamedFramebufferfv __rglgen_glClearNamedFramebufferfv +#define glClearNamedFramebufferfi __rglgen_glClearNamedFramebufferfi +#define glBlitNamedFramebuffer __rglgen_glBlitNamedFramebuffer +#define glCheckNamedFramebufferStatus __rglgen_glCheckNamedFramebufferStatus +#define glGetNamedFramebufferParameteriv __rglgen_glGetNamedFramebufferParameteriv +#define glGetNamedFramebufferAttachmentParameteriv __rglgen_glGetNamedFramebufferAttachmentParameteriv +#define glCreateRenderbuffers __rglgen_glCreateRenderbuffers +#define glNamedRenderbufferStorage __rglgen_glNamedRenderbufferStorage +#define glNamedRenderbufferStorageMultisample __rglgen_glNamedRenderbufferStorageMultisample +#define glGetNamedRenderbufferParameteriv __rglgen_glGetNamedRenderbufferParameteriv +#define glCreateTextures __rglgen_glCreateTextures +#define glTextureBuffer __rglgen_glTextureBuffer +#define glTextureBufferRange __rglgen_glTextureBufferRange +#define glTextureStorage1D __rglgen_glTextureStorage1D +#define glTextureStorage2D __rglgen_glTextureStorage2D +#define glTextureStorage3D __rglgen_glTextureStorage3D +#define glTextureStorage2DMultisample __rglgen_glTextureStorage2DMultisample +#define glTextureStorage3DMultisample __rglgen_glTextureStorage3DMultisample +#define glTextureSubImage1D __rglgen_glTextureSubImage1D +#define glTextureSubImage2D __rglgen_glTextureSubImage2D +#define glTextureSubImage3D __rglgen_glTextureSubImage3D +#define glCompressedTextureSubImage1D __rglgen_glCompressedTextureSubImage1D +#define glCompressedTextureSubImage2D __rglgen_glCompressedTextureSubImage2D +#define glCompressedTextureSubImage3D __rglgen_glCompressedTextureSubImage3D +#define glCopyTextureSubImage1D __rglgen_glCopyTextureSubImage1D +#define glCopyTextureSubImage2D __rglgen_glCopyTextureSubImage2D +#define glCopyTextureSubImage3D __rglgen_glCopyTextureSubImage3D +#define glTextureParameterf __rglgen_glTextureParameterf +#define glTextureParameterfv __rglgen_glTextureParameterfv +#define glTextureParameteri __rglgen_glTextureParameteri +#define glTextureParameterIiv __rglgen_glTextureParameterIiv +#define glTextureParameterIuiv __rglgen_glTextureParameterIuiv +#define glTextureParameteriv __rglgen_glTextureParameteriv +#define glGenerateTextureMipmap __rglgen_glGenerateTextureMipmap +#define glBindTextureUnit __rglgen_glBindTextureUnit +#define glGetTextureImage __rglgen_glGetTextureImage +#define glGetCompressedTextureImage __rglgen_glGetCompressedTextureImage +#define glGetTextureLevelParameterfv __rglgen_glGetTextureLevelParameterfv +#define glGetTextureLevelParameteriv __rglgen_glGetTextureLevelParameteriv +#define glGetTextureParameterfv __rglgen_glGetTextureParameterfv +#define glGetTextureParameterIiv __rglgen_glGetTextureParameterIiv +#define glGetTextureParameterIuiv __rglgen_glGetTextureParameterIuiv +#define glGetTextureParameteriv __rglgen_glGetTextureParameteriv +#define glCreateVertexArrays __rglgen_glCreateVertexArrays +#define glDisableVertexArrayAttrib __rglgen_glDisableVertexArrayAttrib +#define glEnableVertexArrayAttrib __rglgen_glEnableVertexArrayAttrib +#define glVertexArrayElementBuffer __rglgen_glVertexArrayElementBuffer +#define glVertexArrayVertexBuffer __rglgen_glVertexArrayVertexBuffer +#define glVertexArrayVertexBuffers __rglgen_glVertexArrayVertexBuffers +#define glVertexArrayAttribBinding __rglgen_glVertexArrayAttribBinding +#define glVertexArrayAttribFormat __rglgen_glVertexArrayAttribFormat +#define glVertexArrayAttribIFormat __rglgen_glVertexArrayAttribIFormat +#define glVertexArrayAttribLFormat __rglgen_glVertexArrayAttribLFormat +#define glVertexArrayBindingDivisor __rglgen_glVertexArrayBindingDivisor +#define glGetVertexArrayiv __rglgen_glGetVertexArrayiv +#define glGetVertexArrayIndexediv __rglgen_glGetVertexArrayIndexediv +#define glGetVertexArrayIndexed64iv __rglgen_glGetVertexArrayIndexed64iv +#define glCreateSamplers __rglgen_glCreateSamplers +#define glCreateProgramPipelines __rglgen_glCreateProgramPipelines +#define glCreateQueries __rglgen_glCreateQueries +#define glGetQueryBufferObjecti64v __rglgen_glGetQueryBufferObjecti64v +#define glGetQueryBufferObjectiv __rglgen_glGetQueryBufferObjectiv +#define glGetQueryBufferObjectui64v __rglgen_glGetQueryBufferObjectui64v +#define glGetQueryBufferObjectuiv __rglgen_glGetQueryBufferObjectuiv +#define glMemoryBarrierByRegion __rglgen_glMemoryBarrierByRegion +#define glGetTextureSubImage __rglgen_glGetTextureSubImage +#define glGetCompressedTextureSubImage __rglgen_glGetCompressedTextureSubImage +#define glGetGraphicsResetStatus __rglgen_glGetGraphicsResetStatus +#define glGetnCompressedTexImage __rglgen_glGetnCompressedTexImage +#define glGetnTexImage __rglgen_glGetnTexImage +#define glGetnUniformdv __rglgen_glGetnUniformdv +#define glGetnUniformfv __rglgen_glGetnUniformfv +#define glGetnUniformiv __rglgen_glGetnUniformiv +#define glGetnUniformuiv __rglgen_glGetnUniformuiv +#define glReadnPixels __rglgen_glReadnPixels +#define glTextureBarrier __rglgen_glTextureBarrier +#define glSpecializeShader __rglgen_glSpecializeShader +#define glMultiDrawArraysIndirectCount __rglgen_glMultiDrawArraysIndirectCount +#define glMultiDrawElementsIndirectCount __rglgen_glMultiDrawElementsIndirectCount +#define glPolygonOffsetClamp __rglgen_glPolygonOffsetClamp +#define glPrimitiveBoundingBoxARB __rglgen_glPrimitiveBoundingBoxARB #define glGetTextureHandleARB __rglgen_glGetTextureHandleARB #define glGetTextureSamplerHandleARB __rglgen_glGetTextureSamplerHandleARB #define glMakeTextureHandleResidentARB __rglgen_glMakeTextureHandleResidentARB @@ -1683,127 +1964,62 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glVertexAttribL1ui64vARB __rglgen_glVertexAttribL1ui64vARB #define glGetVertexAttribLui64vARB __rglgen_glGetVertexAttribLui64vARB #define glCreateSyncFromCLeventARB __rglgen_glCreateSyncFromCLeventARB -#define glClampColorARB __rglgen_glClampColorARB #define glDispatchComputeGroupSizeARB __rglgen_glDispatchComputeGroupSizeARB #define glDebugMessageControlARB __rglgen_glDebugMessageControlARB #define glDebugMessageInsertARB __rglgen_glDebugMessageInsertARB #define glDebugMessageCallbackARB __rglgen_glDebugMessageCallbackARB #define glGetDebugMessageLogARB __rglgen_glGetDebugMessageLogARB -#define glDrawBuffersARB __rglgen_glDrawBuffersARB #define glBlendEquationiARB __rglgen_glBlendEquationiARB #define glBlendEquationSeparateiARB __rglgen_glBlendEquationSeparateiARB #define glBlendFunciARB __rglgen_glBlendFunciARB #define glBlendFuncSeparateiARB __rglgen_glBlendFuncSeparateiARB #define glDrawArraysInstancedARB __rglgen_glDrawArraysInstancedARB #define glDrawElementsInstancedARB __rglgen_glDrawElementsInstancedARB -#define glProgramStringARB __rglgen_glProgramStringARB -#define glBindProgramARB __rglgen_glBindProgramARB -#define glDeleteProgramsARB __rglgen_glDeleteProgramsARB -#define glGenProgramsARB __rglgen_glGenProgramsARB -#define glProgramEnvParameter4dARB __rglgen_glProgramEnvParameter4dARB -#define glProgramEnvParameter4dvARB __rglgen_glProgramEnvParameter4dvARB -#define glProgramEnvParameter4fARB __rglgen_glProgramEnvParameter4fARB -#define glProgramEnvParameter4fvARB __rglgen_glProgramEnvParameter4fvARB -#define glProgramLocalParameter4dARB __rglgen_glProgramLocalParameter4dARB -#define glProgramLocalParameter4dvARB __rglgen_glProgramLocalParameter4dvARB -#define glProgramLocalParameter4fARB __rglgen_glProgramLocalParameter4fARB -#define glProgramLocalParameter4fvARB __rglgen_glProgramLocalParameter4fvARB -#define glGetProgramEnvParameterdvARB __rglgen_glGetProgramEnvParameterdvARB -#define glGetProgramEnvParameterfvARB __rglgen_glGetProgramEnvParameterfvARB -#define glGetProgramLocalParameterdvARB __rglgen_glGetProgramLocalParameterdvARB -#define glGetProgramLocalParameterfvARB __rglgen_glGetProgramLocalParameterfvARB -#define glGetProgramivARB __rglgen_glGetProgramivARB -#define glGetProgramStringARB __rglgen_glGetProgramStringARB -#define glIsProgramARB __rglgen_glIsProgramARB #define glProgramParameteriARB __rglgen_glProgramParameteriARB #define glFramebufferTextureARB __rglgen_glFramebufferTextureARB #define glFramebufferTextureLayerARB __rglgen_glFramebufferTextureLayerARB #define glFramebufferTextureFaceARB __rglgen_glFramebufferTextureFaceARB -#define glColorTable __rglgen_glColorTable -#define glColorTableParameterfv __rglgen_glColorTableParameterfv -#define glColorTableParameteriv __rglgen_glColorTableParameteriv -#define glCopyColorTable __rglgen_glCopyColorTable -#define glGetColorTable __rglgen_glGetColorTable -#define glGetColorTableParameterfv __rglgen_glGetColorTableParameterfv -#define glGetColorTableParameteriv __rglgen_glGetColorTableParameteriv -#define glColorSubTable __rglgen_glColorSubTable -#define glCopyColorSubTable __rglgen_glCopyColorSubTable -#define glConvolutionFilter1D __rglgen_glConvolutionFilter1D -#define glConvolutionFilter2D __rglgen_glConvolutionFilter2D -#define glConvolutionParameterf __rglgen_glConvolutionParameterf -#define glConvolutionParameterfv __rglgen_glConvolutionParameterfv -#define glConvolutionParameteri __rglgen_glConvolutionParameteri -#define glConvolutionParameteriv __rglgen_glConvolutionParameteriv -#define glCopyConvolutionFilter1D __rglgen_glCopyConvolutionFilter1D -#define glCopyConvolutionFilter2D __rglgen_glCopyConvolutionFilter2D -#define glGetConvolutionFilter __rglgen_glGetConvolutionFilter -#define glGetConvolutionParameterfv __rglgen_glGetConvolutionParameterfv -#define glGetConvolutionParameteriv __rglgen_glGetConvolutionParameteriv -#define glGetSeparableFilter __rglgen_glGetSeparableFilter -#define glSeparableFilter2D __rglgen_glSeparableFilter2D -#define glGetHistogram __rglgen_glGetHistogram -#define glGetHistogramParameterfv __rglgen_glGetHistogramParameterfv -#define glGetHistogramParameteriv __rglgen_glGetHistogramParameteriv -#define glGetMinmax __rglgen_glGetMinmax -#define glGetMinmaxParameterfv __rglgen_glGetMinmaxParameterfv -#define glGetMinmaxParameteriv __rglgen_glGetMinmaxParameteriv -#define glHistogram __rglgen_glHistogram -#define glMinmax __rglgen_glMinmax -#define glResetHistogram __rglgen_glResetHistogram -#define glResetMinmax __rglgen_glResetMinmax +#define glSpecializeShaderARB __rglgen_glSpecializeShaderARB +#define glUniform1i64ARB __rglgen_glUniform1i64ARB +#define glUniform2i64ARB __rglgen_glUniform2i64ARB +#define glUniform3i64ARB __rglgen_glUniform3i64ARB +#define glUniform4i64ARB __rglgen_glUniform4i64ARB +#define glUniform1i64vARB __rglgen_glUniform1i64vARB +#define glUniform2i64vARB __rglgen_glUniform2i64vARB +#define glUniform3i64vARB __rglgen_glUniform3i64vARB +#define glUniform4i64vARB __rglgen_glUniform4i64vARB +#define glUniform1ui64ARB __rglgen_glUniform1ui64ARB +#define glUniform2ui64ARB __rglgen_glUniform2ui64ARB +#define glUniform3ui64ARB __rglgen_glUniform3ui64ARB +#define glUniform4ui64ARB __rglgen_glUniform4ui64ARB +#define glUniform1ui64vARB __rglgen_glUniform1ui64vARB +#define glUniform2ui64vARB __rglgen_glUniform2ui64vARB +#define glUniform3ui64vARB __rglgen_glUniform3ui64vARB +#define glUniform4ui64vARB __rglgen_glUniform4ui64vARB +#define glGetUniformi64vARB __rglgen_glGetUniformi64vARB +#define glGetUniformui64vARB __rglgen_glGetUniformui64vARB +#define glGetnUniformi64vARB __rglgen_glGetnUniformi64vARB +#define glGetnUniformui64vARB __rglgen_glGetnUniformui64vARB +#define glProgramUniform1i64ARB __rglgen_glProgramUniform1i64ARB +#define glProgramUniform2i64ARB __rglgen_glProgramUniform2i64ARB +#define glProgramUniform3i64ARB __rglgen_glProgramUniform3i64ARB +#define glProgramUniform4i64ARB __rglgen_glProgramUniform4i64ARB +#define glProgramUniform1i64vARB __rglgen_glProgramUniform1i64vARB +#define glProgramUniform2i64vARB __rglgen_glProgramUniform2i64vARB +#define glProgramUniform3i64vARB __rglgen_glProgramUniform3i64vARB +#define glProgramUniform4i64vARB __rglgen_glProgramUniform4i64vARB +#define glProgramUniform1ui64ARB __rglgen_glProgramUniform1ui64ARB +#define glProgramUniform2ui64ARB __rglgen_glProgramUniform2ui64ARB +#define glProgramUniform3ui64ARB __rglgen_glProgramUniform3ui64ARB +#define glProgramUniform4ui64ARB __rglgen_glProgramUniform4ui64ARB +#define glProgramUniform1ui64vARB __rglgen_glProgramUniform1ui64vARB +#define glProgramUniform2ui64vARB __rglgen_glProgramUniform2ui64vARB +#define glProgramUniform3ui64vARB __rglgen_glProgramUniform3ui64vARB +#define glProgramUniform4ui64vARB __rglgen_glProgramUniform4ui64vARB #define glMultiDrawArraysIndirectCountARB __rglgen_glMultiDrawArraysIndirectCountARB #define glMultiDrawElementsIndirectCountARB __rglgen_glMultiDrawElementsIndirectCountARB #define glVertexAttribDivisorARB __rglgen_glVertexAttribDivisorARB -#define glCurrentPaletteMatrixARB __rglgen_glCurrentPaletteMatrixARB -#define glMatrixIndexubvARB __rglgen_glMatrixIndexubvARB -#define glMatrixIndexusvARB __rglgen_glMatrixIndexusvARB -#define glMatrixIndexuivARB __rglgen_glMatrixIndexuivARB -#define glMatrixIndexPointerARB __rglgen_glMatrixIndexPointerARB -#define glSampleCoverageARB __rglgen_glSampleCoverageARB -#define glActiveTextureARB __rglgen_glActiveTextureARB -#define glClientActiveTextureARB __rglgen_glClientActiveTextureARB -#define glMultiTexCoord1dARB __rglgen_glMultiTexCoord1dARB -#define glMultiTexCoord1dvARB __rglgen_glMultiTexCoord1dvARB -#define glMultiTexCoord1fARB __rglgen_glMultiTexCoord1fARB -#define glMultiTexCoord1fvARB __rglgen_glMultiTexCoord1fvARB -#define glMultiTexCoord1iARB __rglgen_glMultiTexCoord1iARB -#define glMultiTexCoord1ivARB __rglgen_glMultiTexCoord1ivARB -#define glMultiTexCoord1sARB __rglgen_glMultiTexCoord1sARB -#define glMultiTexCoord1svARB __rglgen_glMultiTexCoord1svARB -#define glMultiTexCoord2dARB __rglgen_glMultiTexCoord2dARB -#define glMultiTexCoord2dvARB __rglgen_glMultiTexCoord2dvARB -#define glMultiTexCoord2fARB __rglgen_glMultiTexCoord2fARB -#define glMultiTexCoord2fvARB __rglgen_glMultiTexCoord2fvARB -#define glMultiTexCoord2iARB __rglgen_glMultiTexCoord2iARB -#define glMultiTexCoord2ivARB __rglgen_glMultiTexCoord2ivARB -#define glMultiTexCoord2sARB __rglgen_glMultiTexCoord2sARB -#define glMultiTexCoord2svARB __rglgen_glMultiTexCoord2svARB -#define glMultiTexCoord3dARB __rglgen_glMultiTexCoord3dARB -#define glMultiTexCoord3dvARB __rglgen_glMultiTexCoord3dvARB -#define glMultiTexCoord3fARB __rglgen_glMultiTexCoord3fARB -#define glMultiTexCoord3fvARB __rglgen_glMultiTexCoord3fvARB -#define glMultiTexCoord3iARB __rglgen_glMultiTexCoord3iARB -#define glMultiTexCoord3ivARB __rglgen_glMultiTexCoord3ivARB -#define glMultiTexCoord3sARB __rglgen_glMultiTexCoord3sARB -#define glMultiTexCoord3svARB __rglgen_glMultiTexCoord3svARB -#define glMultiTexCoord4dARB __rglgen_glMultiTexCoord4dARB -#define glMultiTexCoord4dvARB __rglgen_glMultiTexCoord4dvARB -#define glMultiTexCoord4fARB __rglgen_glMultiTexCoord4fARB -#define glMultiTexCoord4fvARB __rglgen_glMultiTexCoord4fvARB -#define glMultiTexCoord4iARB __rglgen_glMultiTexCoord4iARB -#define glMultiTexCoord4ivARB __rglgen_glMultiTexCoord4ivARB -#define glMultiTexCoord4sARB __rglgen_glMultiTexCoord4sARB -#define glMultiTexCoord4svARB __rglgen_glMultiTexCoord4svARB -#define glGenQueriesARB __rglgen_glGenQueriesARB -#define glDeleteQueriesARB __rglgen_glDeleteQueriesARB -#define glIsQueryARB __rglgen_glIsQueryARB -#define glBeginQueryARB __rglgen_glBeginQueryARB -#define glEndQueryARB __rglgen_glEndQueryARB -#define glGetQueryivARB __rglgen_glGetQueryivARB -#define glGetQueryObjectivARB __rglgen_glGetQueryObjectivARB -#define glGetQueryObjectuivARB __rglgen_glGetQueryObjectuivARB -#define glPointParameterfARB __rglgen_glPointParameterfARB -#define glPointParameterfvARB __rglgen_glPointParameterfvARB +#define glMaxShaderCompilerThreadsARB __rglgen_glMaxShaderCompilerThreadsARB #define glGetGraphicsResetStatusARB __rglgen_glGetGraphicsResetStatusARB #define glGetnTexImageARB __rglgen_glGetnTexImageARB #define glReadnPixelsARB __rglgen_glReadnPixelsARB @@ -1812,300 +2028,570 @@ typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum targ #define glGetnUniformivARB __rglgen_glGetnUniformivARB #define glGetnUniformuivARB __rglgen_glGetnUniformuivARB #define glGetnUniformdvARB __rglgen_glGetnUniformdvARB -#define glGetnMapdvARB __rglgen_glGetnMapdvARB -#define glGetnMapfvARB __rglgen_glGetnMapfvARB -#define glGetnMapivARB __rglgen_glGetnMapivARB -#define glGetnPixelMapfvARB __rglgen_glGetnPixelMapfvARB -#define glGetnPixelMapuivARB __rglgen_glGetnPixelMapuivARB -#define glGetnPixelMapusvARB __rglgen_glGetnPixelMapusvARB -#define glGetnPolygonStippleARB __rglgen_glGetnPolygonStippleARB -#define glGetnColorTableARB __rglgen_glGetnColorTableARB -#define glGetnConvolutionFilterARB __rglgen_glGetnConvolutionFilterARB -#define glGetnSeparableFilterARB __rglgen_glGetnSeparableFilterARB -#define glGetnHistogramARB __rglgen_glGetnHistogramARB -#define glGetnMinmaxARB __rglgen_glGetnMinmaxARB +#define glFramebufferSampleLocationsfvARB __rglgen_glFramebufferSampleLocationsfvARB +#define glNamedFramebufferSampleLocationsfvARB __rglgen_glNamedFramebufferSampleLocationsfvARB +#define glEvaluateDepthValuesARB __rglgen_glEvaluateDepthValuesARB #define glMinSampleShadingARB __rglgen_glMinSampleShadingARB -#define glDeleteObjectARB __rglgen_glDeleteObjectARB -#define glGetHandleARB __rglgen_glGetHandleARB -#define glDetachObjectARB __rglgen_glDetachObjectARB -#define glCreateShaderObjectARB __rglgen_glCreateShaderObjectARB -#define glShaderSourceARB __rglgen_glShaderSourceARB -#define glCompileShaderARB __rglgen_glCompileShaderARB -#define glCreateProgramObjectARB __rglgen_glCreateProgramObjectARB -#define glAttachObjectARB __rglgen_glAttachObjectARB -#define glLinkProgramARB __rglgen_glLinkProgramARB -#define glUseProgramObjectARB __rglgen_glUseProgramObjectARB -#define glValidateProgramARB __rglgen_glValidateProgramARB -#define glUniform1fARB __rglgen_glUniform1fARB -#define glUniform2fARB __rglgen_glUniform2fARB -#define glUniform3fARB __rglgen_glUniform3fARB -#define glUniform4fARB __rglgen_glUniform4fARB -#define glUniform1iARB __rglgen_glUniform1iARB -#define glUniform2iARB __rglgen_glUniform2iARB -#define glUniform3iARB __rglgen_glUniform3iARB -#define glUniform4iARB __rglgen_glUniform4iARB -#define glUniform1fvARB __rglgen_glUniform1fvARB -#define glUniform2fvARB __rglgen_glUniform2fvARB -#define glUniform3fvARB __rglgen_glUniform3fvARB -#define glUniform4fvARB __rglgen_glUniform4fvARB -#define glUniform1ivARB __rglgen_glUniform1ivARB -#define glUniform2ivARB __rglgen_glUniform2ivARB -#define glUniform3ivARB __rglgen_glUniform3ivARB -#define glUniform4ivARB __rglgen_glUniform4ivARB -#define glUniformMatrix2fvARB __rglgen_glUniformMatrix2fvARB -#define glUniformMatrix3fvARB __rglgen_glUniformMatrix3fvARB -#define glUniformMatrix4fvARB __rglgen_glUniformMatrix4fvARB -#define glGetObjectParameterfvARB __rglgen_glGetObjectParameterfvARB -#define glGetObjectParameterivARB __rglgen_glGetObjectParameterivARB -#define glGetInfoLogARB __rglgen_glGetInfoLogARB -#define glGetAttachedObjectsARB __rglgen_glGetAttachedObjectsARB -#define glGetUniformLocationARB __rglgen_glGetUniformLocationARB -#define glGetActiveUniformARB __rglgen_glGetActiveUniformARB -#define glGetUniformfvARB __rglgen_glGetUniformfvARB -#define glGetUniformivARB __rglgen_glGetUniformivARB -#define glGetShaderSourceARB __rglgen_glGetShaderSourceARB #define glNamedStringARB __rglgen_glNamedStringARB #define glDeleteNamedStringARB __rglgen_glDeleteNamedStringARB #define glCompileShaderIncludeARB __rglgen_glCompileShaderIncludeARB #define glIsNamedStringARB __rglgen_glIsNamedStringARB #define glGetNamedStringARB __rglgen_glGetNamedStringARB #define glGetNamedStringivARB __rglgen_glGetNamedStringivARB +#define glBufferPageCommitmentARB __rglgen_glBufferPageCommitmentARB +#define glNamedBufferPageCommitmentEXT __rglgen_glNamedBufferPageCommitmentEXT +#define glNamedBufferPageCommitmentARB __rglgen_glNamedBufferPageCommitmentARB #define glTexPageCommitmentARB __rglgen_glTexPageCommitmentARB #define glTexBufferARB __rglgen_glTexBufferARB -#define glCompressedTexImage3DARB __rglgen_glCompressedTexImage3DARB -#define glCompressedTexImage2DARB __rglgen_glCompressedTexImage2DARB -#define glCompressedTexImage1DARB __rglgen_glCompressedTexImage1DARB -#define glCompressedTexSubImage3DARB __rglgen_glCompressedTexSubImage3DARB -#define glCompressedTexSubImage2DARB __rglgen_glCompressedTexSubImage2DARB -#define glCompressedTexSubImage1DARB __rglgen_glCompressedTexSubImage1DARB -#define glGetCompressedTexImageARB __rglgen_glGetCompressedTexImageARB -#define glLoadTransposeMatrixfARB __rglgen_glLoadTransposeMatrixfARB -#define glLoadTransposeMatrixdARB __rglgen_glLoadTransposeMatrixdARB -#define glMultTransposeMatrixfARB __rglgen_glMultTransposeMatrixfARB -#define glMultTransposeMatrixdARB __rglgen_glMultTransposeMatrixdARB -#define glWeightbvARB __rglgen_glWeightbvARB -#define glWeightsvARB __rglgen_glWeightsvARB -#define glWeightivARB __rglgen_glWeightivARB -#define glWeightfvARB __rglgen_glWeightfvARB -#define glWeightdvARB __rglgen_glWeightdvARB -#define glWeightubvARB __rglgen_glWeightubvARB -#define glWeightusvARB __rglgen_glWeightusvARB -#define glWeightuivARB __rglgen_glWeightuivARB -#define glWeightPointerARB __rglgen_glWeightPointerARB -#define glVertexBlendARB __rglgen_glVertexBlendARB -#define glBindBufferARB __rglgen_glBindBufferARB -#define glDeleteBuffersARB __rglgen_glDeleteBuffersARB -#define glGenBuffersARB __rglgen_glGenBuffersARB -#define glIsBufferARB __rglgen_glIsBufferARB -#define glBufferDataARB __rglgen_glBufferDataARB -#define glBufferSubDataARB __rglgen_glBufferSubDataARB -#define glGetBufferSubDataARB __rglgen_glGetBufferSubDataARB -#define glMapBufferARB __rglgen_glMapBufferARB -#define glUnmapBufferARB __rglgen_glUnmapBufferARB -#define glGetBufferParameterivARB __rglgen_glGetBufferParameterivARB -#define glGetBufferPointervARB __rglgen_glGetBufferPointervARB -#define glVertexAttrib1dARB __rglgen_glVertexAttrib1dARB -#define glVertexAttrib1dvARB __rglgen_glVertexAttrib1dvARB -#define glVertexAttrib1fARB __rglgen_glVertexAttrib1fARB -#define glVertexAttrib1fvARB __rglgen_glVertexAttrib1fvARB -#define glVertexAttrib1sARB __rglgen_glVertexAttrib1sARB -#define glVertexAttrib1svARB __rglgen_glVertexAttrib1svARB -#define glVertexAttrib2dARB __rglgen_glVertexAttrib2dARB -#define glVertexAttrib2dvARB __rglgen_glVertexAttrib2dvARB -#define glVertexAttrib2fARB __rglgen_glVertexAttrib2fARB -#define glVertexAttrib2fvARB __rglgen_glVertexAttrib2fvARB -#define glVertexAttrib2sARB __rglgen_glVertexAttrib2sARB -#define glVertexAttrib2svARB __rglgen_glVertexAttrib2svARB -#define glVertexAttrib3dARB __rglgen_glVertexAttrib3dARB -#define glVertexAttrib3dvARB __rglgen_glVertexAttrib3dvARB -#define glVertexAttrib3fARB __rglgen_glVertexAttrib3fARB -#define glVertexAttrib3fvARB __rglgen_glVertexAttrib3fvARB -#define glVertexAttrib3sARB __rglgen_glVertexAttrib3sARB -#define glVertexAttrib3svARB __rglgen_glVertexAttrib3svARB -#define glVertexAttrib4NbvARB __rglgen_glVertexAttrib4NbvARB -#define glVertexAttrib4NivARB __rglgen_glVertexAttrib4NivARB -#define glVertexAttrib4NsvARB __rglgen_glVertexAttrib4NsvARB -#define glVertexAttrib4NubARB __rglgen_glVertexAttrib4NubARB -#define glVertexAttrib4NubvARB __rglgen_glVertexAttrib4NubvARB -#define glVertexAttrib4NuivARB __rglgen_glVertexAttrib4NuivARB -#define glVertexAttrib4NusvARB __rglgen_glVertexAttrib4NusvARB -#define glVertexAttrib4bvARB __rglgen_glVertexAttrib4bvARB -#define glVertexAttrib4dARB __rglgen_glVertexAttrib4dARB -#define glVertexAttrib4dvARB __rglgen_glVertexAttrib4dvARB -#define glVertexAttrib4fARB __rglgen_glVertexAttrib4fARB -#define glVertexAttrib4fvARB __rglgen_glVertexAttrib4fvARB -#define glVertexAttrib4ivARB __rglgen_glVertexAttrib4ivARB -#define glVertexAttrib4sARB __rglgen_glVertexAttrib4sARB -#define glVertexAttrib4svARB __rglgen_glVertexAttrib4svARB -#define glVertexAttrib4ubvARB __rglgen_glVertexAttrib4ubvARB -#define glVertexAttrib4uivARB __rglgen_glVertexAttrib4uivARB -#define glVertexAttrib4usvARB __rglgen_glVertexAttrib4usvARB -#define glVertexAttribPointerARB __rglgen_glVertexAttribPointerARB -#define glEnableVertexAttribArrayARB __rglgen_glEnableVertexAttribArrayARB -#define glDisableVertexAttribArrayARB __rglgen_glDisableVertexAttribArrayARB -#define glGetVertexAttribdvARB __rglgen_glGetVertexAttribdvARB -#define glGetVertexAttribfvARB __rglgen_glGetVertexAttribfvARB -#define glGetVertexAttribivARB __rglgen_glGetVertexAttribivARB -#define glGetVertexAttribPointervARB __rglgen_glGetVertexAttribPointervARB -#define glBindAttribLocationARB __rglgen_glBindAttribLocationARB -#define glGetActiveAttribARB __rglgen_glGetActiveAttribARB -#define glGetAttribLocationARB __rglgen_glGetAttribLocationARB -#define glWindowPos2dARB __rglgen_glWindowPos2dARB -#define glWindowPos2dvARB __rglgen_glWindowPos2dvARB -#define glWindowPos2fARB __rglgen_glWindowPos2fARB -#define glWindowPos2fvARB __rglgen_glWindowPos2fvARB -#define glWindowPos2iARB __rglgen_glWindowPos2iARB -#define glWindowPos2ivARB __rglgen_glWindowPos2ivARB -#define glWindowPos2sARB __rglgen_glWindowPos2sARB -#define glWindowPos2svARB __rglgen_glWindowPos2svARB -#define glWindowPos3dARB __rglgen_glWindowPos3dARB -#define glWindowPos3dvARB __rglgen_glWindowPos3dvARB -#define glWindowPos3fARB __rglgen_glWindowPos3fARB -#define glWindowPos3fvARB __rglgen_glWindowPos3fvARB -#define glWindowPos3iARB __rglgen_glWindowPos3iARB -#define glWindowPos3ivARB __rglgen_glWindowPos3ivARB -#define glWindowPos3sARB __rglgen_glWindowPos3sARB -#define glWindowPos3svARB __rglgen_glWindowPos3svARB -#define glMultiTexCoord1bOES __rglgen_glMultiTexCoord1bOES -#define glMultiTexCoord1bvOES __rglgen_glMultiTexCoord1bvOES -#define glMultiTexCoord2bOES __rglgen_glMultiTexCoord2bOES -#define glMultiTexCoord2bvOES __rglgen_glMultiTexCoord2bvOES -#define glMultiTexCoord3bOES __rglgen_glMultiTexCoord3bOES -#define glMultiTexCoord3bvOES __rglgen_glMultiTexCoord3bvOES -#define glMultiTexCoord4bOES __rglgen_glMultiTexCoord4bOES -#define glMultiTexCoord4bvOES __rglgen_glMultiTexCoord4bvOES -#define glTexCoord1bOES __rglgen_glTexCoord1bOES -#define glTexCoord1bvOES __rglgen_glTexCoord1bvOES -#define glTexCoord2bOES __rglgen_glTexCoord2bOES -#define glTexCoord2bvOES __rglgen_glTexCoord2bvOES -#define glTexCoord3bOES __rglgen_glTexCoord3bOES -#define glTexCoord3bvOES __rglgen_glTexCoord3bvOES -#define glTexCoord4bOES __rglgen_glTexCoord4bOES -#define glTexCoord4bvOES __rglgen_glTexCoord4bvOES -#define glVertex2bOES __rglgen_glVertex2bOES -#define glVertex2bvOES __rglgen_glVertex2bvOES -#define glVertex3bOES __rglgen_glVertex3bOES -#define glVertex3bvOES __rglgen_glVertex3bvOES -#define glVertex4bOES __rglgen_glVertex4bOES -#define glVertex4bvOES __rglgen_glVertex4bvOES -#define glAlphaFuncxOES __rglgen_glAlphaFuncxOES -#define glClearColorxOES __rglgen_glClearColorxOES -#define glClearDepthxOES __rglgen_glClearDepthxOES -#define glClipPlanexOES __rglgen_glClipPlanexOES -#define glColor4xOES __rglgen_glColor4xOES -#define glDepthRangexOES __rglgen_glDepthRangexOES -#define glFogxOES __rglgen_glFogxOES -#define glFogxvOES __rglgen_glFogxvOES -#define glFrustumxOES __rglgen_glFrustumxOES -#define glGetClipPlanexOES __rglgen_glGetClipPlanexOES -#define glGetFixedvOES __rglgen_glGetFixedvOES -#define glGetTexEnvxvOES __rglgen_glGetTexEnvxvOES -#define glGetTexParameterxvOES __rglgen_glGetTexParameterxvOES -#define glLightModelxOES __rglgen_glLightModelxOES -#define glLightModelxvOES __rglgen_glLightModelxvOES -#define glLightxOES __rglgen_glLightxOES -#define glLightxvOES __rglgen_glLightxvOES -#define glLineWidthxOES __rglgen_glLineWidthxOES -#define glLoadMatrixxOES __rglgen_glLoadMatrixxOES -#define glMaterialxOES __rglgen_glMaterialxOES -#define glMaterialxvOES __rglgen_glMaterialxvOES -#define glMultMatrixxOES __rglgen_glMultMatrixxOES -#define glMultiTexCoord4xOES __rglgen_glMultiTexCoord4xOES -#define glNormal3xOES __rglgen_glNormal3xOES -#define glOrthoxOES __rglgen_glOrthoxOES -#define glPointParameterxvOES __rglgen_glPointParameterxvOES -#define glPointSizexOES __rglgen_glPointSizexOES -#define glPolygonOffsetxOES __rglgen_glPolygonOffsetxOES -#define glRotatexOES __rglgen_glRotatexOES -#define glSampleCoverageOES __rglgen_glSampleCoverageOES -#define glScalexOES __rglgen_glScalexOES -#define glTexEnvxOES __rglgen_glTexEnvxOES -#define glTexEnvxvOES __rglgen_glTexEnvxvOES -#define glTexParameterxOES __rglgen_glTexParameterxOES -#define glTexParameterxvOES __rglgen_glTexParameterxvOES -#define glTranslatexOES __rglgen_glTranslatexOES -#define glAccumxOES __rglgen_glAccumxOES -#define glBitmapxOES __rglgen_glBitmapxOES -#define glBlendColorxOES __rglgen_glBlendColorxOES -#define glClearAccumxOES __rglgen_glClearAccumxOES -#define glColor3xOES __rglgen_glColor3xOES -#define glColor3xvOES __rglgen_glColor3xvOES -#define glColor4xvOES __rglgen_glColor4xvOES -#define glConvolutionParameterxOES __rglgen_glConvolutionParameterxOES -#define glConvolutionParameterxvOES __rglgen_glConvolutionParameterxvOES -#define glEvalCoord1xOES __rglgen_glEvalCoord1xOES -#define glEvalCoord1xvOES __rglgen_glEvalCoord1xvOES -#define glEvalCoord2xOES __rglgen_glEvalCoord2xOES -#define glEvalCoord2xvOES __rglgen_glEvalCoord2xvOES -#define glFeedbackBufferxOES __rglgen_glFeedbackBufferxOES -#define glGetConvolutionParameterxvOES __rglgen_glGetConvolutionParameterxvOES -#define glGetHistogramParameterxvOES __rglgen_glGetHistogramParameterxvOES -#define glGetLightxOES __rglgen_glGetLightxOES -#define glGetMapxvOES __rglgen_glGetMapxvOES -#define glGetMaterialxOES __rglgen_glGetMaterialxOES -#define glGetPixelMapxv __rglgen_glGetPixelMapxv -#define glGetTexGenxvOES __rglgen_glGetTexGenxvOES -#define glGetTexLevelParameterxvOES __rglgen_glGetTexLevelParameterxvOES -#define glIndexxOES __rglgen_glIndexxOES -#define glIndexxvOES __rglgen_glIndexxvOES -#define glLoadTransposeMatrixxOES __rglgen_glLoadTransposeMatrixxOES -#define glMap1xOES __rglgen_glMap1xOES -#define glMap2xOES __rglgen_glMap2xOES -#define glMapGrid1xOES __rglgen_glMapGrid1xOES -#define glMapGrid2xOES __rglgen_glMapGrid2xOES -#define glMultTransposeMatrixxOES __rglgen_glMultTransposeMatrixxOES -#define glMultiTexCoord1xOES __rglgen_glMultiTexCoord1xOES -#define glMultiTexCoord1xvOES __rglgen_glMultiTexCoord1xvOES -#define glMultiTexCoord2xOES __rglgen_glMultiTexCoord2xOES -#define glMultiTexCoord2xvOES __rglgen_glMultiTexCoord2xvOES -#define glMultiTexCoord3xOES __rglgen_glMultiTexCoord3xOES -#define glMultiTexCoord3xvOES __rglgen_glMultiTexCoord3xvOES -#define glMultiTexCoord4xvOES __rglgen_glMultiTexCoord4xvOES -#define glNormal3xvOES __rglgen_glNormal3xvOES -#define glPassThroughxOES __rglgen_glPassThroughxOES -#define glPixelMapx __rglgen_glPixelMapx -#define glPixelStorex __rglgen_glPixelStorex -#define glPixelTransferxOES __rglgen_glPixelTransferxOES -#define glPixelZoomxOES __rglgen_glPixelZoomxOES -#define glPrioritizeTexturesxOES __rglgen_glPrioritizeTexturesxOES -#define glRasterPos2xOES __rglgen_glRasterPos2xOES -#define glRasterPos2xvOES __rglgen_glRasterPos2xvOES -#define glRasterPos3xOES __rglgen_glRasterPos3xOES -#define glRasterPos3xvOES __rglgen_glRasterPos3xvOES -#define glRasterPos4xOES __rglgen_glRasterPos4xOES -#define glRasterPos4xvOES __rglgen_glRasterPos4xvOES -#define glRectxOES __rglgen_glRectxOES -#define glRectxvOES __rglgen_glRectxvOES -#define glTexCoord1xOES __rglgen_glTexCoord1xOES -#define glTexCoord1xvOES __rglgen_glTexCoord1xvOES -#define glTexCoord2xOES __rglgen_glTexCoord2xOES -#define glTexCoord2xvOES __rglgen_glTexCoord2xvOES -#define glTexCoord3xOES __rglgen_glTexCoord3xOES -#define glTexCoord3xvOES __rglgen_glTexCoord3xvOES -#define glTexCoord4xOES __rglgen_glTexCoord4xOES -#define glTexCoord4xvOES __rglgen_glTexCoord4xvOES -#define glTexGenxOES __rglgen_glTexGenxOES -#define glTexGenxvOES __rglgen_glTexGenxvOES -#define glVertex2xOES __rglgen_glVertex2xOES -#define glVertex2xvOES __rglgen_glVertex2xvOES -#define glVertex3xOES __rglgen_glVertex3xOES -#define glVertex3xvOES __rglgen_glVertex3xvOES -#define glVertex4xOES __rglgen_glVertex4xOES -#define glVertex4xvOES __rglgen_glVertex4xvOES -#define glQueryMatrixxOES __rglgen_glQueryMatrixxOES -#define glClearDepthfOES __rglgen_glClearDepthfOES -#define glClipPlanefOES __rglgen_glClipPlanefOES -#define glDepthRangefOES __rglgen_glDepthRangefOES -#define glFrustumfOES __rglgen_glFrustumfOES -#define glGetClipPlanefOES __rglgen_glGetClipPlanefOES -#define glOrthofOES __rglgen_glOrthofOES -#define glImageTransformParameteriHP __rglgen_glImageTransformParameteriHP -#define glImageTransformParameterfHP __rglgen_glImageTransformParameterfHP -#define glImageTransformParameterivHP __rglgen_glImageTransformParameterivHP -#define glImageTransformParameterfvHP __rglgen_glImageTransformParameterfvHP -#define glGetImageTransformParameterivHP __rglgen_glGetImageTransformParameterivHP -#define glGetImageTransformParameterfvHP __rglgen_glGetImageTransformParameterfvHP +#define glBlendBarrierKHR __rglgen_glBlendBarrierKHR +#define glMaxShaderCompilerThreadsKHR __rglgen_glMaxShaderCompilerThreadsKHR +#define glEGLImageTargetTexStorageEXT __rglgen_glEGLImageTargetTexStorageEXT +#define glEGLImageTargetTextureStorageEXT __rglgen_glEGLImageTargetTextureStorageEXT +#define glLabelObjectEXT __rglgen_glLabelObjectEXT +#define glGetObjectLabelEXT __rglgen_glGetObjectLabelEXT +#define glInsertEventMarkerEXT __rglgen_glInsertEventMarkerEXT +#define glPushGroupMarkerEXT __rglgen_glPushGroupMarkerEXT +#define glPopGroupMarkerEXT __rglgen_glPopGroupMarkerEXT +#define glMatrixLoadfEXT __rglgen_glMatrixLoadfEXT +#define glMatrixLoaddEXT __rglgen_glMatrixLoaddEXT +#define glMatrixMultfEXT __rglgen_glMatrixMultfEXT +#define glMatrixMultdEXT __rglgen_glMatrixMultdEXT +#define glMatrixLoadIdentityEXT __rglgen_glMatrixLoadIdentityEXT +#define glMatrixRotatefEXT __rglgen_glMatrixRotatefEXT +#define glMatrixRotatedEXT __rglgen_glMatrixRotatedEXT +#define glMatrixScalefEXT __rglgen_glMatrixScalefEXT +#define glMatrixScaledEXT __rglgen_glMatrixScaledEXT +#define glMatrixTranslatefEXT __rglgen_glMatrixTranslatefEXT +#define glMatrixTranslatedEXT __rglgen_glMatrixTranslatedEXT +#define glMatrixFrustumEXT __rglgen_glMatrixFrustumEXT +#define glMatrixOrthoEXT __rglgen_glMatrixOrthoEXT +#define glMatrixPopEXT __rglgen_glMatrixPopEXT +#define glMatrixPushEXT __rglgen_glMatrixPushEXT +#define glClientAttribDefaultEXT __rglgen_glClientAttribDefaultEXT +#define glPushClientAttribDefaultEXT __rglgen_glPushClientAttribDefaultEXT +#define glTextureParameterfEXT __rglgen_glTextureParameterfEXT +#define glTextureParameterfvEXT __rglgen_glTextureParameterfvEXT +#define glTextureParameteriEXT __rglgen_glTextureParameteriEXT +#define glTextureParameterivEXT __rglgen_glTextureParameterivEXT +#define glTextureImage1DEXT __rglgen_glTextureImage1DEXT +#define glTextureImage2DEXT __rglgen_glTextureImage2DEXT +#define glTextureSubImage1DEXT __rglgen_glTextureSubImage1DEXT +#define glTextureSubImage2DEXT __rglgen_glTextureSubImage2DEXT +#define glCopyTextureImage1DEXT __rglgen_glCopyTextureImage1DEXT +#define glCopyTextureImage2DEXT __rglgen_glCopyTextureImage2DEXT +#define glCopyTextureSubImage1DEXT __rglgen_glCopyTextureSubImage1DEXT +#define glCopyTextureSubImage2DEXT __rglgen_glCopyTextureSubImage2DEXT +#define glGetTextureImageEXT __rglgen_glGetTextureImageEXT +#define glGetTextureParameterfvEXT __rglgen_glGetTextureParameterfvEXT +#define glGetTextureParameterivEXT __rglgen_glGetTextureParameterivEXT +#define glGetTextureLevelParameterfvEXT __rglgen_glGetTextureLevelParameterfvEXT +#define glGetTextureLevelParameterivEXT __rglgen_glGetTextureLevelParameterivEXT +#define glTextureImage3DEXT __rglgen_glTextureImage3DEXT +#define glTextureSubImage3DEXT __rglgen_glTextureSubImage3DEXT +#define glCopyTextureSubImage3DEXT __rglgen_glCopyTextureSubImage3DEXT +#define glBindMultiTextureEXT __rglgen_glBindMultiTextureEXT +#define glMultiTexCoordPointerEXT __rglgen_glMultiTexCoordPointerEXT +#define glMultiTexEnvfEXT __rglgen_glMultiTexEnvfEXT +#define glMultiTexEnvfvEXT __rglgen_glMultiTexEnvfvEXT +#define glMultiTexEnviEXT __rglgen_glMultiTexEnviEXT +#define glMultiTexEnvivEXT __rglgen_glMultiTexEnvivEXT +#define glMultiTexGendEXT __rglgen_glMultiTexGendEXT +#define glMultiTexGendvEXT __rglgen_glMultiTexGendvEXT +#define glMultiTexGenfEXT __rglgen_glMultiTexGenfEXT +#define glMultiTexGenfvEXT __rglgen_glMultiTexGenfvEXT +#define glMultiTexGeniEXT __rglgen_glMultiTexGeniEXT +#define glMultiTexGenivEXT __rglgen_glMultiTexGenivEXT +#define glGetMultiTexEnvfvEXT __rglgen_glGetMultiTexEnvfvEXT +#define glGetMultiTexEnvivEXT __rglgen_glGetMultiTexEnvivEXT +#define glGetMultiTexGendvEXT __rglgen_glGetMultiTexGendvEXT +#define glGetMultiTexGenfvEXT __rglgen_glGetMultiTexGenfvEXT +#define glGetMultiTexGenivEXT __rglgen_glGetMultiTexGenivEXT +#define glMultiTexParameteriEXT __rglgen_glMultiTexParameteriEXT +#define glMultiTexParameterivEXT __rglgen_glMultiTexParameterivEXT +#define glMultiTexParameterfEXT __rglgen_glMultiTexParameterfEXT +#define glMultiTexParameterfvEXT __rglgen_glMultiTexParameterfvEXT +#define glMultiTexImage1DEXT __rglgen_glMultiTexImage1DEXT +#define glMultiTexImage2DEXT __rglgen_glMultiTexImage2DEXT +#define glMultiTexSubImage1DEXT __rglgen_glMultiTexSubImage1DEXT +#define glMultiTexSubImage2DEXT __rglgen_glMultiTexSubImage2DEXT +#define glCopyMultiTexImage1DEXT __rglgen_glCopyMultiTexImage1DEXT +#define glCopyMultiTexImage2DEXT __rglgen_glCopyMultiTexImage2DEXT +#define glCopyMultiTexSubImage1DEXT __rglgen_glCopyMultiTexSubImage1DEXT +#define glCopyMultiTexSubImage2DEXT __rglgen_glCopyMultiTexSubImage2DEXT +#define glGetMultiTexImageEXT __rglgen_glGetMultiTexImageEXT +#define glGetMultiTexParameterfvEXT __rglgen_glGetMultiTexParameterfvEXT +#define glGetMultiTexParameterivEXT __rglgen_glGetMultiTexParameterivEXT +#define glGetMultiTexLevelParameterfvEXT __rglgen_glGetMultiTexLevelParameterfvEXT +#define glGetMultiTexLevelParameterivEXT __rglgen_glGetMultiTexLevelParameterivEXT +#define glMultiTexImage3DEXT __rglgen_glMultiTexImage3DEXT +#define glMultiTexSubImage3DEXT __rglgen_glMultiTexSubImage3DEXT +#define glCopyMultiTexSubImage3DEXT __rglgen_glCopyMultiTexSubImage3DEXT +#define glEnableClientStateIndexedEXT __rglgen_glEnableClientStateIndexedEXT +#define glDisableClientStateIndexedEXT __rglgen_glDisableClientStateIndexedEXT +#define glGetFloatIndexedvEXT __rglgen_glGetFloatIndexedvEXT +#define glGetDoubleIndexedvEXT __rglgen_glGetDoubleIndexedvEXT +#define glGetPointerIndexedvEXT __rglgen_glGetPointerIndexedvEXT +#define glEnableIndexedEXT __rglgen_glEnableIndexedEXT +#define glDisableIndexedEXT __rglgen_glDisableIndexedEXT +#define glIsEnabledIndexedEXT __rglgen_glIsEnabledIndexedEXT +#define glGetIntegerIndexedvEXT __rglgen_glGetIntegerIndexedvEXT +#define glGetBooleanIndexedvEXT __rglgen_glGetBooleanIndexedvEXT +#define glCompressedTextureImage3DEXT __rglgen_glCompressedTextureImage3DEXT +#define glCompressedTextureImage2DEXT __rglgen_glCompressedTextureImage2DEXT +#define glCompressedTextureImage1DEXT __rglgen_glCompressedTextureImage1DEXT +#define glCompressedTextureSubImage3DEXT __rglgen_glCompressedTextureSubImage3DEXT +#define glCompressedTextureSubImage2DEXT __rglgen_glCompressedTextureSubImage2DEXT +#define glCompressedTextureSubImage1DEXT __rglgen_glCompressedTextureSubImage1DEXT +#define glGetCompressedTextureImageEXT __rglgen_glGetCompressedTextureImageEXT +#define glCompressedMultiTexImage3DEXT __rglgen_glCompressedMultiTexImage3DEXT +#define glCompressedMultiTexImage2DEXT __rglgen_glCompressedMultiTexImage2DEXT +#define glCompressedMultiTexImage1DEXT __rglgen_glCompressedMultiTexImage1DEXT +#define glCompressedMultiTexSubImage3DEXT __rglgen_glCompressedMultiTexSubImage3DEXT +#define glCompressedMultiTexSubImage2DEXT __rglgen_glCompressedMultiTexSubImage2DEXT +#define glCompressedMultiTexSubImage1DEXT __rglgen_glCompressedMultiTexSubImage1DEXT +#define glGetCompressedMultiTexImageEXT __rglgen_glGetCompressedMultiTexImageEXT +#define glMatrixLoadTransposefEXT __rglgen_glMatrixLoadTransposefEXT +#define glMatrixLoadTransposedEXT __rglgen_glMatrixLoadTransposedEXT +#define glMatrixMultTransposefEXT __rglgen_glMatrixMultTransposefEXT +#define glMatrixMultTransposedEXT __rglgen_glMatrixMultTransposedEXT +#define glNamedBufferDataEXT __rglgen_glNamedBufferDataEXT +#define glNamedBufferSubDataEXT __rglgen_glNamedBufferSubDataEXT +#define glMapNamedBufferEXT __rglgen_glMapNamedBufferEXT +#define glUnmapNamedBufferEXT __rglgen_glUnmapNamedBufferEXT +#define glGetNamedBufferParameterivEXT __rglgen_glGetNamedBufferParameterivEXT +#define glGetNamedBufferPointervEXT __rglgen_glGetNamedBufferPointervEXT +#define glGetNamedBufferSubDataEXT __rglgen_glGetNamedBufferSubDataEXT +#define glProgramUniform1fEXT __rglgen_glProgramUniform1fEXT +#define glProgramUniform2fEXT __rglgen_glProgramUniform2fEXT +#define glProgramUniform3fEXT __rglgen_glProgramUniform3fEXT +#define glProgramUniform4fEXT __rglgen_glProgramUniform4fEXT +#define glProgramUniform1iEXT __rglgen_glProgramUniform1iEXT +#define glProgramUniform2iEXT __rglgen_glProgramUniform2iEXT +#define glProgramUniform3iEXT __rglgen_glProgramUniform3iEXT +#define glProgramUniform4iEXT __rglgen_glProgramUniform4iEXT +#define glProgramUniform1fvEXT __rglgen_glProgramUniform1fvEXT +#define glProgramUniform2fvEXT __rglgen_glProgramUniform2fvEXT +#define glProgramUniform3fvEXT __rglgen_glProgramUniform3fvEXT +#define glProgramUniform4fvEXT __rglgen_glProgramUniform4fvEXT +#define glProgramUniform1ivEXT __rglgen_glProgramUniform1ivEXT +#define glProgramUniform2ivEXT __rglgen_glProgramUniform2ivEXT +#define glProgramUniform3ivEXT __rglgen_glProgramUniform3ivEXT +#define glProgramUniform4ivEXT __rglgen_glProgramUniform4ivEXT +#define glProgramUniformMatrix2fvEXT __rglgen_glProgramUniformMatrix2fvEXT +#define glProgramUniformMatrix3fvEXT __rglgen_glProgramUniformMatrix3fvEXT +#define glProgramUniformMatrix4fvEXT __rglgen_glProgramUniformMatrix4fvEXT +#define glProgramUniformMatrix2x3fvEXT __rglgen_glProgramUniformMatrix2x3fvEXT +#define glProgramUniformMatrix3x2fvEXT __rglgen_glProgramUniformMatrix3x2fvEXT +#define glProgramUniformMatrix2x4fvEXT __rglgen_glProgramUniformMatrix2x4fvEXT +#define glProgramUniformMatrix4x2fvEXT __rglgen_glProgramUniformMatrix4x2fvEXT +#define glProgramUniformMatrix3x4fvEXT __rglgen_glProgramUniformMatrix3x4fvEXT +#define glProgramUniformMatrix4x3fvEXT __rglgen_glProgramUniformMatrix4x3fvEXT +#define glTextureBufferEXT __rglgen_glTextureBufferEXT +#define glMultiTexBufferEXT __rglgen_glMultiTexBufferEXT +#define glTextureParameterIivEXT __rglgen_glTextureParameterIivEXT +#define glTextureParameterIuivEXT __rglgen_glTextureParameterIuivEXT +#define glGetTextureParameterIivEXT __rglgen_glGetTextureParameterIivEXT +#define glGetTextureParameterIuivEXT __rglgen_glGetTextureParameterIuivEXT +#define glMultiTexParameterIivEXT __rglgen_glMultiTexParameterIivEXT +#define glMultiTexParameterIuivEXT __rglgen_glMultiTexParameterIuivEXT +#define glGetMultiTexParameterIivEXT __rglgen_glGetMultiTexParameterIivEXT +#define glGetMultiTexParameterIuivEXT __rglgen_glGetMultiTexParameterIuivEXT +#define glProgramUniform1uiEXT __rglgen_glProgramUniform1uiEXT +#define glProgramUniform2uiEXT __rglgen_glProgramUniform2uiEXT +#define glProgramUniform3uiEXT __rglgen_glProgramUniform3uiEXT +#define glProgramUniform4uiEXT __rglgen_glProgramUniform4uiEXT +#define glProgramUniform1uivEXT __rglgen_glProgramUniform1uivEXT +#define glProgramUniform2uivEXT __rglgen_glProgramUniform2uivEXT +#define glProgramUniform3uivEXT __rglgen_glProgramUniform3uivEXT +#define glProgramUniform4uivEXT __rglgen_glProgramUniform4uivEXT +#define glNamedProgramLocalParameters4fvEXT __rglgen_glNamedProgramLocalParameters4fvEXT +#define glNamedProgramLocalParameterI4iEXT __rglgen_glNamedProgramLocalParameterI4iEXT +#define glNamedProgramLocalParameterI4ivEXT __rglgen_glNamedProgramLocalParameterI4ivEXT +#define glNamedProgramLocalParametersI4ivEXT __rglgen_glNamedProgramLocalParametersI4ivEXT +#define glNamedProgramLocalParameterI4uiEXT __rglgen_glNamedProgramLocalParameterI4uiEXT +#define glNamedProgramLocalParameterI4uivEXT __rglgen_glNamedProgramLocalParameterI4uivEXT +#define glNamedProgramLocalParametersI4uivEXT __rglgen_glNamedProgramLocalParametersI4uivEXT +#define glGetNamedProgramLocalParameterIivEXT __rglgen_glGetNamedProgramLocalParameterIivEXT +#define glGetNamedProgramLocalParameterIuivEXT __rglgen_glGetNamedProgramLocalParameterIuivEXT +#define glEnableClientStateiEXT __rglgen_glEnableClientStateiEXT +#define glDisableClientStateiEXT __rglgen_glDisableClientStateiEXT +#define glGetFloati_vEXT __rglgen_glGetFloati_vEXT +#define glGetDoublei_vEXT __rglgen_glGetDoublei_vEXT +#define glGetPointeri_vEXT __rglgen_glGetPointeri_vEXT +#define glNamedProgramStringEXT __rglgen_glNamedProgramStringEXT +#define glNamedProgramLocalParameter4dEXT __rglgen_glNamedProgramLocalParameter4dEXT +#define glNamedProgramLocalParameter4dvEXT __rglgen_glNamedProgramLocalParameter4dvEXT +#define glNamedProgramLocalParameter4fEXT __rglgen_glNamedProgramLocalParameter4fEXT +#define glNamedProgramLocalParameter4fvEXT __rglgen_glNamedProgramLocalParameter4fvEXT +#define glGetNamedProgramLocalParameterdvEXT __rglgen_glGetNamedProgramLocalParameterdvEXT +#define glGetNamedProgramLocalParameterfvEXT __rglgen_glGetNamedProgramLocalParameterfvEXT +#define glGetNamedProgramivEXT __rglgen_glGetNamedProgramivEXT +#define glGetNamedProgramStringEXT __rglgen_glGetNamedProgramStringEXT +#define glNamedRenderbufferStorageEXT __rglgen_glNamedRenderbufferStorageEXT +#define glGetNamedRenderbufferParameterivEXT __rglgen_glGetNamedRenderbufferParameterivEXT +#define glNamedRenderbufferStorageMultisampleEXT __rglgen_glNamedRenderbufferStorageMultisampleEXT +#define glNamedRenderbufferStorageMultisampleCoverageEXT __rglgen_glNamedRenderbufferStorageMultisampleCoverageEXT +#define glCheckNamedFramebufferStatusEXT __rglgen_glCheckNamedFramebufferStatusEXT +#define glNamedFramebufferTexture1DEXT __rglgen_glNamedFramebufferTexture1DEXT +#define glNamedFramebufferTexture2DEXT __rglgen_glNamedFramebufferTexture2DEXT +#define glNamedFramebufferTexture3DEXT __rglgen_glNamedFramebufferTexture3DEXT +#define glNamedFramebufferRenderbufferEXT __rglgen_glNamedFramebufferRenderbufferEXT +#define glGetNamedFramebufferAttachmentParameterivEXT __rglgen_glGetNamedFramebufferAttachmentParameterivEXT +#define glGenerateTextureMipmapEXT __rglgen_glGenerateTextureMipmapEXT +#define glGenerateMultiTexMipmapEXT __rglgen_glGenerateMultiTexMipmapEXT +#define glFramebufferDrawBufferEXT __rglgen_glFramebufferDrawBufferEXT +#define glFramebufferDrawBuffersEXT __rglgen_glFramebufferDrawBuffersEXT +#define glFramebufferReadBufferEXT __rglgen_glFramebufferReadBufferEXT +#define glGetFramebufferParameterivEXT __rglgen_glGetFramebufferParameterivEXT +#define glNamedCopyBufferSubDataEXT __rglgen_glNamedCopyBufferSubDataEXT +#define glNamedFramebufferTextureEXT __rglgen_glNamedFramebufferTextureEXT +#define glNamedFramebufferTextureLayerEXT __rglgen_glNamedFramebufferTextureLayerEXT +#define glNamedFramebufferTextureFaceEXT __rglgen_glNamedFramebufferTextureFaceEXT +#define glTextureRenderbufferEXT __rglgen_glTextureRenderbufferEXT +#define glMultiTexRenderbufferEXT __rglgen_glMultiTexRenderbufferEXT +#define glVertexArrayVertexOffsetEXT __rglgen_glVertexArrayVertexOffsetEXT +#define glVertexArrayColorOffsetEXT __rglgen_glVertexArrayColorOffsetEXT +#define glVertexArrayEdgeFlagOffsetEXT __rglgen_glVertexArrayEdgeFlagOffsetEXT +#define glVertexArrayIndexOffsetEXT __rglgen_glVertexArrayIndexOffsetEXT +#define glVertexArrayNormalOffsetEXT __rglgen_glVertexArrayNormalOffsetEXT +#define glVertexArrayTexCoordOffsetEXT __rglgen_glVertexArrayTexCoordOffsetEXT +#define glVertexArrayMultiTexCoordOffsetEXT __rglgen_glVertexArrayMultiTexCoordOffsetEXT +#define glVertexArrayFogCoordOffsetEXT __rglgen_glVertexArrayFogCoordOffsetEXT +#define glVertexArraySecondaryColorOffsetEXT __rglgen_glVertexArraySecondaryColorOffsetEXT +#define glVertexArrayVertexAttribOffsetEXT __rglgen_glVertexArrayVertexAttribOffsetEXT +#define glVertexArrayVertexAttribIOffsetEXT __rglgen_glVertexArrayVertexAttribIOffsetEXT +#define glEnableVertexArrayEXT __rglgen_glEnableVertexArrayEXT +#define glDisableVertexArrayEXT __rglgen_glDisableVertexArrayEXT +#define glEnableVertexArrayAttribEXT __rglgen_glEnableVertexArrayAttribEXT +#define glDisableVertexArrayAttribEXT __rglgen_glDisableVertexArrayAttribEXT +#define glGetVertexArrayIntegervEXT __rglgen_glGetVertexArrayIntegervEXT +#define glGetVertexArrayPointervEXT __rglgen_glGetVertexArrayPointervEXT +#define glGetVertexArrayIntegeri_vEXT __rglgen_glGetVertexArrayIntegeri_vEXT +#define glGetVertexArrayPointeri_vEXT __rglgen_glGetVertexArrayPointeri_vEXT +#define glMapNamedBufferRangeEXT __rglgen_glMapNamedBufferRangeEXT +#define glFlushMappedNamedBufferRangeEXT __rglgen_glFlushMappedNamedBufferRangeEXT +#define glNamedBufferStorageEXT __rglgen_glNamedBufferStorageEXT +#define glClearNamedBufferDataEXT __rglgen_glClearNamedBufferDataEXT +#define glClearNamedBufferSubDataEXT __rglgen_glClearNamedBufferSubDataEXT +#define glNamedFramebufferParameteriEXT __rglgen_glNamedFramebufferParameteriEXT +#define glGetNamedFramebufferParameterivEXT __rglgen_glGetNamedFramebufferParameterivEXT +#define glProgramUniform1dEXT __rglgen_glProgramUniform1dEXT +#define glProgramUniform2dEXT __rglgen_glProgramUniform2dEXT +#define glProgramUniform3dEXT __rglgen_glProgramUniform3dEXT +#define glProgramUniform4dEXT __rglgen_glProgramUniform4dEXT +#define glProgramUniform1dvEXT __rglgen_glProgramUniform1dvEXT +#define glProgramUniform2dvEXT __rglgen_glProgramUniform2dvEXT +#define glProgramUniform3dvEXT __rglgen_glProgramUniform3dvEXT +#define glProgramUniform4dvEXT __rglgen_glProgramUniform4dvEXT +#define glProgramUniformMatrix2dvEXT __rglgen_glProgramUniformMatrix2dvEXT +#define glProgramUniformMatrix3dvEXT __rglgen_glProgramUniformMatrix3dvEXT +#define glProgramUniformMatrix4dvEXT __rglgen_glProgramUniformMatrix4dvEXT +#define glProgramUniformMatrix2x3dvEXT __rglgen_glProgramUniformMatrix2x3dvEXT +#define glProgramUniformMatrix2x4dvEXT __rglgen_glProgramUniformMatrix2x4dvEXT +#define glProgramUniformMatrix3x2dvEXT __rglgen_glProgramUniformMatrix3x2dvEXT +#define glProgramUniformMatrix3x4dvEXT __rglgen_glProgramUniformMatrix3x4dvEXT +#define glProgramUniformMatrix4x2dvEXT __rglgen_glProgramUniformMatrix4x2dvEXT +#define glProgramUniformMatrix4x3dvEXT __rglgen_glProgramUniformMatrix4x3dvEXT +#define glTextureBufferRangeEXT __rglgen_glTextureBufferRangeEXT +#define glTextureStorage1DEXT __rglgen_glTextureStorage1DEXT +#define glTextureStorage2DEXT __rglgen_glTextureStorage2DEXT +#define glTextureStorage3DEXT __rglgen_glTextureStorage3DEXT +#define glTextureStorage2DMultisampleEXT __rglgen_glTextureStorage2DMultisampleEXT +#define glTextureStorage3DMultisampleEXT __rglgen_glTextureStorage3DMultisampleEXT +#define glVertexArrayBindVertexBufferEXT __rglgen_glVertexArrayBindVertexBufferEXT +#define glVertexArrayVertexAttribFormatEXT __rglgen_glVertexArrayVertexAttribFormatEXT +#define glVertexArrayVertexAttribIFormatEXT __rglgen_glVertexArrayVertexAttribIFormatEXT +#define glVertexArrayVertexAttribLFormatEXT __rglgen_glVertexArrayVertexAttribLFormatEXT +#define glVertexArrayVertexAttribBindingEXT __rglgen_glVertexArrayVertexAttribBindingEXT +#define glVertexArrayVertexBindingDivisorEXT __rglgen_glVertexArrayVertexBindingDivisorEXT +#define glVertexArrayVertexAttribLOffsetEXT __rglgen_glVertexArrayVertexAttribLOffsetEXT +#define glTexturePageCommitmentEXT __rglgen_glTexturePageCommitmentEXT +#define glVertexArrayVertexAttribDivisorEXT __rglgen_glVertexArrayVertexAttribDivisorEXT +#define glDrawArraysInstancedEXT __rglgen_glDrawArraysInstancedEXT +#define glDrawElementsInstancedEXT __rglgen_glDrawElementsInstancedEXT +#define glPolygonOffsetClampEXT __rglgen_glPolygonOffsetClampEXT +#define glRasterSamplesEXT __rglgen_glRasterSamplesEXT +#define glUseShaderProgramEXT __rglgen_glUseShaderProgramEXT +#define glActiveProgramEXT __rglgen_glActiveProgramEXT +#define glCreateShaderProgramEXT __rglgen_glCreateShaderProgramEXT +#define glFramebufferFetchBarrierEXT __rglgen_glFramebufferFetchBarrierEXT +#define glWindowRectanglesEXT __rglgen_glWindowRectanglesEXT +#define glMultiDrawArraysIndirectBindlessNV __rglgen_glMultiDrawArraysIndirectBindlessNV +#define glMultiDrawElementsIndirectBindlessNV __rglgen_glMultiDrawElementsIndirectBindlessNV +#define glMultiDrawArraysIndirectBindlessCountNV __rglgen_glMultiDrawArraysIndirectBindlessCountNV +#define glMultiDrawElementsIndirectBindlessCountNV __rglgen_glMultiDrawElementsIndirectBindlessCountNV +#define glGetTextureHandleNV __rglgen_glGetTextureHandleNV +#define glGetTextureSamplerHandleNV __rglgen_glGetTextureSamplerHandleNV +#define glMakeTextureHandleResidentNV __rglgen_glMakeTextureHandleResidentNV +#define glMakeTextureHandleNonResidentNV __rglgen_glMakeTextureHandleNonResidentNV +#define glGetImageHandleNV __rglgen_glGetImageHandleNV +#define glMakeImageHandleResidentNV __rglgen_glMakeImageHandleResidentNV +#define glMakeImageHandleNonResidentNV __rglgen_glMakeImageHandleNonResidentNV +#define glUniformHandleui64NV __rglgen_glUniformHandleui64NV +#define glUniformHandleui64vNV __rglgen_glUniformHandleui64vNV +#define glProgramUniformHandleui64NV __rglgen_glProgramUniformHandleui64NV +#define glProgramUniformHandleui64vNV __rglgen_glProgramUniformHandleui64vNV +#define glIsTextureHandleResidentNV __rglgen_glIsTextureHandleResidentNV +#define glIsImageHandleResidentNV __rglgen_glIsImageHandleResidentNV +#define glBlendParameteriNV __rglgen_glBlendParameteriNV +#define glBlendBarrierNV __rglgen_glBlendBarrierNV +#define glViewportPositionWScaleNV __rglgen_glViewportPositionWScaleNV +#define glCreateStatesNV __rglgen_glCreateStatesNV +#define glDeleteStatesNV __rglgen_glDeleteStatesNV +#define glIsStateNV __rglgen_glIsStateNV +#define glStateCaptureNV __rglgen_glStateCaptureNV +#define glGetCommandHeaderNV __rglgen_glGetCommandHeaderNV +#define glGetStageIndexNV __rglgen_glGetStageIndexNV +#define glDrawCommandsNV __rglgen_glDrawCommandsNV +#define glDrawCommandsAddressNV __rglgen_glDrawCommandsAddressNV +#define glDrawCommandsStatesNV __rglgen_glDrawCommandsStatesNV +#define glDrawCommandsStatesAddressNV __rglgen_glDrawCommandsStatesAddressNV +#define glCreateCommandListsNV __rglgen_glCreateCommandListsNV +#define glDeleteCommandListsNV __rglgen_glDeleteCommandListsNV +#define glIsCommandListNV __rglgen_glIsCommandListNV +#define glListDrawCommandsStatesClientNV __rglgen_glListDrawCommandsStatesClientNV +#define glCommandListSegmentsNV __rglgen_glCommandListSegmentsNV +#define glCompileCommandListNV __rglgen_glCompileCommandListNV +#define glCallCommandListNV __rglgen_glCallCommandListNV +#define glBeginConditionalRenderNV __rglgen_glBeginConditionalRenderNV +#define glEndConditionalRenderNV __rglgen_glEndConditionalRenderNV +#define glSubpixelPrecisionBiasNV __rglgen_glSubpixelPrecisionBiasNV +#define glConservativeRasterParameterfNV __rglgen_glConservativeRasterParameterfNV +#define glConservativeRasterParameteriNV __rglgen_glConservativeRasterParameteriNV +#define glDrawVkImageNV __rglgen_glDrawVkImageNV +#define glGetVkProcAddrNV __rglgen_glGetVkProcAddrNV +#define glWaitVkSemaphoreNV __rglgen_glWaitVkSemaphoreNV +#define glSignalVkSemaphoreNV __rglgen_glSignalVkSemaphoreNV +#define glSignalVkFenceNV __rglgen_glSignalVkFenceNV +#define glFragmentCoverageColorNV __rglgen_glFragmentCoverageColorNV +#define glCoverageModulationTableNV __rglgen_glCoverageModulationTableNV +#define glGetCoverageModulationTableNV __rglgen_glGetCoverageModulationTableNV +#define glCoverageModulationNV __rglgen_glCoverageModulationNV +#define glRenderbufferStorageMultisampleCoverageNV __rglgen_glRenderbufferStorageMultisampleCoverageNV +#define glUniform1i64NV __rglgen_glUniform1i64NV +#define glUniform2i64NV __rglgen_glUniform2i64NV +#define glUniform3i64NV __rglgen_glUniform3i64NV +#define glUniform4i64NV __rglgen_glUniform4i64NV +#define glUniform1i64vNV __rglgen_glUniform1i64vNV +#define glUniform2i64vNV __rglgen_glUniform2i64vNV +#define glUniform3i64vNV __rglgen_glUniform3i64vNV +#define glUniform4i64vNV __rglgen_glUniform4i64vNV +#define glUniform1ui64NV __rglgen_glUniform1ui64NV +#define glUniform2ui64NV __rglgen_glUniform2ui64NV +#define glUniform3ui64NV __rglgen_glUniform3ui64NV +#define glUniform4ui64NV __rglgen_glUniform4ui64NV +#define glUniform1ui64vNV __rglgen_glUniform1ui64vNV +#define glUniform2ui64vNV __rglgen_glUniform2ui64vNV +#define glUniform3ui64vNV __rglgen_glUniform3ui64vNV +#define glUniform4ui64vNV __rglgen_glUniform4ui64vNV +#define glGetUniformi64vNV __rglgen_glGetUniformi64vNV +#define glProgramUniform1i64NV __rglgen_glProgramUniform1i64NV +#define glProgramUniform2i64NV __rglgen_glProgramUniform2i64NV +#define glProgramUniform3i64NV __rglgen_glProgramUniform3i64NV +#define glProgramUniform4i64NV __rglgen_glProgramUniform4i64NV +#define glProgramUniform1i64vNV __rglgen_glProgramUniform1i64vNV +#define glProgramUniform2i64vNV __rglgen_glProgramUniform2i64vNV +#define glProgramUniform3i64vNV __rglgen_glProgramUniform3i64vNV +#define glProgramUniform4i64vNV __rglgen_glProgramUniform4i64vNV +#define glProgramUniform1ui64NV __rglgen_glProgramUniform1ui64NV +#define glProgramUniform2ui64NV __rglgen_glProgramUniform2ui64NV +#define glProgramUniform3ui64NV __rglgen_glProgramUniform3ui64NV +#define glProgramUniform4ui64NV __rglgen_glProgramUniform4ui64NV +#define glProgramUniform1ui64vNV __rglgen_glProgramUniform1ui64vNV +#define glProgramUniform2ui64vNV __rglgen_glProgramUniform2ui64vNV +#define glProgramUniform3ui64vNV __rglgen_glProgramUniform3ui64vNV +#define glProgramUniform4ui64vNV __rglgen_glProgramUniform4ui64vNV +#define glGetInternalformatSampleivNV __rglgen_glGetInternalformatSampleivNV +#define glGetMemoryObjectDetachedResourcesuivNV __rglgen_glGetMemoryObjectDetachedResourcesuivNV +#define glResetMemoryObjectParameterNV __rglgen_glResetMemoryObjectParameterNV +#define glTexAttachMemoryNV __rglgen_glTexAttachMemoryNV +#define glBufferAttachMemoryNV __rglgen_glBufferAttachMemoryNV +#define glTextureAttachMemoryNV __rglgen_glTextureAttachMemoryNV +#define glNamedBufferAttachMemoryNV __rglgen_glNamedBufferAttachMemoryNV +#define glDrawMeshTasksNV __rglgen_glDrawMeshTasksNV +#define glDrawMeshTasksIndirectNV __rglgen_glDrawMeshTasksIndirectNV +#define glMultiDrawMeshTasksIndirectNV __rglgen_glMultiDrawMeshTasksIndirectNV +#define glMultiDrawMeshTasksIndirectCountNV __rglgen_glMultiDrawMeshTasksIndirectCountNV +#define glGenPathsNV __rglgen_glGenPathsNV +#define glDeletePathsNV __rglgen_glDeletePathsNV +#define glIsPathNV __rglgen_glIsPathNV +#define glPathCommandsNV __rglgen_glPathCommandsNV +#define glPathCoordsNV __rglgen_glPathCoordsNV +#define glPathSubCommandsNV __rglgen_glPathSubCommandsNV +#define glPathSubCoordsNV __rglgen_glPathSubCoordsNV +#define glPathStringNV __rglgen_glPathStringNV +#define glPathGlyphsNV __rglgen_glPathGlyphsNV +#define glPathGlyphRangeNV __rglgen_glPathGlyphRangeNV +#define glWeightPathsNV __rglgen_glWeightPathsNV +#define glCopyPathNV __rglgen_glCopyPathNV +#define glInterpolatePathsNV __rglgen_glInterpolatePathsNV +#define glTransformPathNV __rglgen_glTransformPathNV +#define glPathParameterivNV __rglgen_glPathParameterivNV +#define glPathParameteriNV __rglgen_glPathParameteriNV +#define glPathParameterfvNV __rglgen_glPathParameterfvNV +#define glPathParameterfNV __rglgen_glPathParameterfNV +#define glPathDashArrayNV __rglgen_glPathDashArrayNV +#define glPathStencilFuncNV __rglgen_glPathStencilFuncNV +#define glPathStencilDepthOffsetNV __rglgen_glPathStencilDepthOffsetNV +#define glStencilFillPathNV __rglgen_glStencilFillPathNV +#define glStencilStrokePathNV __rglgen_glStencilStrokePathNV +#define glStencilFillPathInstancedNV __rglgen_glStencilFillPathInstancedNV +#define glStencilStrokePathInstancedNV __rglgen_glStencilStrokePathInstancedNV +#define glPathCoverDepthFuncNV __rglgen_glPathCoverDepthFuncNV +#define glCoverFillPathNV __rglgen_glCoverFillPathNV +#define glCoverStrokePathNV __rglgen_glCoverStrokePathNV +#define glCoverFillPathInstancedNV __rglgen_glCoverFillPathInstancedNV +#define glCoverStrokePathInstancedNV __rglgen_glCoverStrokePathInstancedNV +#define glGetPathParameterivNV __rglgen_glGetPathParameterivNV +#define glGetPathParameterfvNV __rglgen_glGetPathParameterfvNV +#define glGetPathCommandsNV __rglgen_glGetPathCommandsNV +#define glGetPathCoordsNV __rglgen_glGetPathCoordsNV +#define glGetPathDashArrayNV __rglgen_glGetPathDashArrayNV +#define glGetPathMetricsNV __rglgen_glGetPathMetricsNV +#define glGetPathMetricRangeNV __rglgen_glGetPathMetricRangeNV +#define glGetPathSpacingNV __rglgen_glGetPathSpacingNV +#define glIsPointInFillPathNV __rglgen_glIsPointInFillPathNV +#define glIsPointInStrokePathNV __rglgen_glIsPointInStrokePathNV +#define glGetPathLengthNV __rglgen_glGetPathLengthNV +#define glPointAlongPathNV __rglgen_glPointAlongPathNV +#define glMatrixLoad3x2fNV __rglgen_glMatrixLoad3x2fNV +#define glMatrixLoad3x3fNV __rglgen_glMatrixLoad3x3fNV +#define glMatrixLoadTranspose3x3fNV __rglgen_glMatrixLoadTranspose3x3fNV +#define glMatrixMult3x2fNV __rglgen_glMatrixMult3x2fNV +#define glMatrixMult3x3fNV __rglgen_glMatrixMult3x3fNV +#define glMatrixMultTranspose3x3fNV __rglgen_glMatrixMultTranspose3x3fNV +#define glStencilThenCoverFillPathNV __rglgen_glStencilThenCoverFillPathNV +#define glStencilThenCoverStrokePathNV __rglgen_glStencilThenCoverStrokePathNV +#define glStencilThenCoverFillPathInstancedNV __rglgen_glStencilThenCoverFillPathInstancedNV +#define glStencilThenCoverStrokePathInstancedNV __rglgen_glStencilThenCoverStrokePathInstancedNV +#define glPathGlyphIndexRangeNV __rglgen_glPathGlyphIndexRangeNV +#define glPathGlyphIndexArrayNV __rglgen_glPathGlyphIndexArrayNV +#define glPathMemoryGlyphIndexArrayNV __rglgen_glPathMemoryGlyphIndexArrayNV +#define glProgramPathFragmentInputGenNV __rglgen_glProgramPathFragmentInputGenNV +#define glGetProgramResourcefvNV __rglgen_glGetProgramResourcefvNV +#define glFramebufferSampleLocationsfvNV __rglgen_glFramebufferSampleLocationsfvNV +#define glNamedFramebufferSampleLocationsfvNV __rglgen_glNamedFramebufferSampleLocationsfvNV +#define glResolveDepthValuesNV __rglgen_glResolveDepthValuesNV +#define glScissorExclusiveNV __rglgen_glScissorExclusiveNV +#define glScissorExclusiveArrayvNV __rglgen_glScissorExclusiveArrayvNV +#define glMakeBufferResidentNV __rglgen_glMakeBufferResidentNV +#define glMakeBufferNonResidentNV __rglgen_glMakeBufferNonResidentNV +#define glIsBufferResidentNV __rglgen_glIsBufferResidentNV +#define glMakeNamedBufferResidentNV __rglgen_glMakeNamedBufferResidentNV +#define glMakeNamedBufferNonResidentNV __rglgen_glMakeNamedBufferNonResidentNV +#define glIsNamedBufferResidentNV __rglgen_glIsNamedBufferResidentNV +#define glGetBufferParameterui64vNV __rglgen_glGetBufferParameterui64vNV +#define glGetNamedBufferParameterui64vNV __rglgen_glGetNamedBufferParameterui64vNV +#define glGetIntegerui64vNV __rglgen_glGetIntegerui64vNV +#define glUniformui64NV __rglgen_glUniformui64NV +#define glUniformui64vNV __rglgen_glUniformui64vNV +#define glGetUniformui64vNV __rglgen_glGetUniformui64vNV +#define glProgramUniformui64NV __rglgen_glProgramUniformui64NV +#define glProgramUniformui64vNV __rglgen_glProgramUniformui64vNV +#define glBindShadingRateImageNV __rglgen_glBindShadingRateImageNV +#define glGetShadingRateImagePaletteNV __rglgen_glGetShadingRateImagePaletteNV +#define glGetShadingRateSampleLocationivNV __rglgen_glGetShadingRateSampleLocationivNV +#define glShadingRateImageBarrierNV __rglgen_glShadingRateImageBarrierNV +#define glShadingRateImagePaletteNV __rglgen_glShadingRateImagePaletteNV +#define glShadingRateSampleOrderNV __rglgen_glShadingRateSampleOrderNV +#define glShadingRateSampleOrderCustomNV __rglgen_glShadingRateSampleOrderCustomNV +#define glTextureBarrierNV __rglgen_glTextureBarrierNV +#define glVertexAttribL1i64NV __rglgen_glVertexAttribL1i64NV +#define glVertexAttribL2i64NV __rglgen_glVertexAttribL2i64NV +#define glVertexAttribL3i64NV __rglgen_glVertexAttribL3i64NV +#define glVertexAttribL4i64NV __rglgen_glVertexAttribL4i64NV +#define glVertexAttribL1i64vNV __rglgen_glVertexAttribL1i64vNV +#define glVertexAttribL2i64vNV __rglgen_glVertexAttribL2i64vNV +#define glVertexAttribL3i64vNV __rglgen_glVertexAttribL3i64vNV +#define glVertexAttribL4i64vNV __rglgen_glVertexAttribL4i64vNV +#define glVertexAttribL1ui64NV __rglgen_glVertexAttribL1ui64NV +#define glVertexAttribL2ui64NV __rglgen_glVertexAttribL2ui64NV +#define glVertexAttribL3ui64NV __rglgen_glVertexAttribL3ui64NV +#define glVertexAttribL4ui64NV __rglgen_glVertexAttribL4ui64NV +#define glVertexAttribL1ui64vNV __rglgen_glVertexAttribL1ui64vNV +#define glVertexAttribL2ui64vNV __rglgen_glVertexAttribL2ui64vNV +#define glVertexAttribL3ui64vNV __rglgen_glVertexAttribL3ui64vNV +#define glVertexAttribL4ui64vNV __rglgen_glVertexAttribL4ui64vNV +#define glGetVertexAttribLi64vNV __rglgen_glGetVertexAttribLi64vNV +#define glGetVertexAttribLui64vNV __rglgen_glGetVertexAttribLui64vNV +#define glVertexAttribLFormatNV __rglgen_glVertexAttribLFormatNV +#define glBufferAddressRangeNV __rglgen_glBufferAddressRangeNV +#define glVertexFormatNV __rglgen_glVertexFormatNV +#define glNormalFormatNV __rglgen_glNormalFormatNV +#define glColorFormatNV __rglgen_glColorFormatNV +#define glIndexFormatNV __rglgen_glIndexFormatNV +#define glTexCoordFormatNV __rglgen_glTexCoordFormatNV +#define glEdgeFlagFormatNV __rglgen_glEdgeFlagFormatNV +#define glSecondaryColorFormatNV __rglgen_glSecondaryColorFormatNV +#define glFogCoordFormatNV __rglgen_glFogCoordFormatNV +#define glVertexAttribFormatNV __rglgen_glVertexAttribFormatNV +#define glVertexAttribIFormatNV __rglgen_glVertexAttribIFormatNV +#define glGetIntegerui64i_vNV __rglgen_glGetIntegerui64i_vNV +#define glViewportSwizzleNV __rglgen_glViewportSwizzleNV +#define glFramebufferTextureMultiviewOVR __rglgen_glFramebufferTextureMultiviewOVR +extern RGLSYMGLCULLFACEPROC __rglgen_glCullFace; +extern RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; +extern RGLSYMGLHINTPROC __rglgen_glHint; +extern RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; +extern RGLSYMGLPOINTSIZEPROC __rglgen_glPointSize; +extern RGLSYMGLPOLYGONMODEPROC __rglgen_glPolygonMode; +extern RGLSYMGLSCISSORPROC __rglgen_glScissor; +extern RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; +extern RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; +extern RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; +extern RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; +extern RGLSYMGLTEXIMAGE1DPROC __rglgen_glTexImage1D; +extern RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; +extern RGLSYMGLDRAWBUFFERPROC __rglgen_glDrawBuffer; +extern RGLSYMGLCLEARPROC __rglgen_glClear; +extern RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; +extern RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; +extern RGLSYMGLCLEARDEPTHPROC __rglgen_glClearDepth; +extern RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; +extern RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; +extern RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; +extern RGLSYMGLDISABLEPROC __rglgen_glDisable; +extern RGLSYMGLENABLEPROC __rglgen_glEnable; +extern RGLSYMGLFINISHPROC __rglgen_glFinish; +extern RGLSYMGLFLUSHPROC __rglgen_glFlush; +extern RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; +extern RGLSYMGLLOGICOPPROC __rglgen_glLogicOp; +extern RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; +extern RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; +extern RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; +extern RGLSYMGLPIXELSTOREFPROC __rglgen_glPixelStoref; +extern RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; +extern RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; +extern RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; +extern RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; +extern RGLSYMGLGETDOUBLEVPROC __rglgen_glGetDoublev; +extern RGLSYMGLGETERRORPROC __rglgen_glGetError; +extern RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; +extern RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; +extern RGLSYMGLGETSTRINGPROC __rglgen_glGetString; +extern RGLSYMGLGETTEXIMAGEPROC __rglgen_glGetTexImage; +extern RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; +extern RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; +extern RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; +extern RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; +extern RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; +extern RGLSYMGLDEPTHRANGEPROC __rglgen_glDepthRange; +extern RGLSYMGLVIEWPORTPROC __rglgen_glViewport; +extern RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; +extern RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; +extern RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; +extern RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; +extern RGLSYMGLCOPYTEXIMAGE1DPROC __rglgen_glCopyTexImage1D; +extern RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; +extern RGLSYMGLCOPYTEXSUBIMAGE1DPROC __rglgen_glCopyTexSubImage1D; +extern RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; +extern RGLSYMGLTEXSUBIMAGE1DPROC __rglgen_glTexSubImage1D; +extern RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; +extern RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; +extern RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; +extern RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; +extern RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; extern RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; extern RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; extern RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; @@ -2119,43 +2605,6 @@ extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC __rglgen_glCompressedTexSubImage1D; extern RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC __rglgen_glGetCompressedTexImage; -extern RGLSYMGLCLIENTACTIVETEXTUREPROC __rglgen_glClientActiveTexture; -extern RGLSYMGLMULTITEXCOORD1DPROC __rglgen_glMultiTexCoord1d; -extern RGLSYMGLMULTITEXCOORD1DVPROC __rglgen_glMultiTexCoord1dv; -extern RGLSYMGLMULTITEXCOORD1FPROC __rglgen_glMultiTexCoord1f; -extern RGLSYMGLMULTITEXCOORD1FVPROC __rglgen_glMultiTexCoord1fv; -extern RGLSYMGLMULTITEXCOORD1IPROC __rglgen_glMultiTexCoord1i; -extern RGLSYMGLMULTITEXCOORD1IVPROC __rglgen_glMultiTexCoord1iv; -extern RGLSYMGLMULTITEXCOORD1SPROC __rglgen_glMultiTexCoord1s; -extern RGLSYMGLMULTITEXCOORD1SVPROC __rglgen_glMultiTexCoord1sv; -extern RGLSYMGLMULTITEXCOORD2DPROC __rglgen_glMultiTexCoord2d; -extern RGLSYMGLMULTITEXCOORD2DVPROC __rglgen_glMultiTexCoord2dv; -extern RGLSYMGLMULTITEXCOORD2FPROC __rglgen_glMultiTexCoord2f; -extern RGLSYMGLMULTITEXCOORD2FVPROC __rglgen_glMultiTexCoord2fv; -extern RGLSYMGLMULTITEXCOORD2IPROC __rglgen_glMultiTexCoord2i; -extern RGLSYMGLMULTITEXCOORD2IVPROC __rglgen_glMultiTexCoord2iv; -extern RGLSYMGLMULTITEXCOORD2SPROC __rglgen_glMultiTexCoord2s; -extern RGLSYMGLMULTITEXCOORD2SVPROC __rglgen_glMultiTexCoord2sv; -extern RGLSYMGLMULTITEXCOORD3DPROC __rglgen_glMultiTexCoord3d; -extern RGLSYMGLMULTITEXCOORD3DVPROC __rglgen_glMultiTexCoord3dv; -extern RGLSYMGLMULTITEXCOORD3FPROC __rglgen_glMultiTexCoord3f; -extern RGLSYMGLMULTITEXCOORD3FVPROC __rglgen_glMultiTexCoord3fv; -extern RGLSYMGLMULTITEXCOORD3IPROC __rglgen_glMultiTexCoord3i; -extern RGLSYMGLMULTITEXCOORD3IVPROC __rglgen_glMultiTexCoord3iv; -extern RGLSYMGLMULTITEXCOORD3SPROC __rglgen_glMultiTexCoord3s; -extern RGLSYMGLMULTITEXCOORD3SVPROC __rglgen_glMultiTexCoord3sv; -extern RGLSYMGLMULTITEXCOORD4DPROC __rglgen_glMultiTexCoord4d; -extern RGLSYMGLMULTITEXCOORD4DVPROC __rglgen_glMultiTexCoord4dv; -extern RGLSYMGLMULTITEXCOORD4FPROC __rglgen_glMultiTexCoord4f; -extern RGLSYMGLMULTITEXCOORD4FVPROC __rglgen_glMultiTexCoord4fv; -extern RGLSYMGLMULTITEXCOORD4IPROC __rglgen_glMultiTexCoord4i; -extern RGLSYMGLMULTITEXCOORD4IVPROC __rglgen_glMultiTexCoord4iv; -extern RGLSYMGLMULTITEXCOORD4SPROC __rglgen_glMultiTexCoord4s; -extern RGLSYMGLMULTITEXCOORD4SVPROC __rglgen_glMultiTexCoord4sv; -extern RGLSYMGLLOADTRANSPOSEMATRIXFPROC __rglgen_glLoadTransposeMatrixf; -extern RGLSYMGLLOADTRANSPOSEMATRIXDPROC __rglgen_glLoadTransposeMatrixd; -extern RGLSYMGLMULTTRANSPOSEMATRIXFPROC __rglgen_glMultTransposeMatrixf; -extern RGLSYMGLMULTTRANSPOSEMATRIXDPROC __rglgen_glMultTransposeMatrixd; extern RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; extern RGLSYMGLMULTIDRAWARRAYSPROC __rglgen_glMultiDrawArrays; extern RGLSYMGLMULTIDRAWELEMENTSPROC __rglgen_glMultiDrawElements; @@ -2163,44 +2612,6 @@ extern RGLSYMGLPOINTPARAMETERFPROC __rglgen_glPointParameterf; extern RGLSYMGLPOINTPARAMETERFVPROC __rglgen_glPointParameterfv; extern RGLSYMGLPOINTPARAMETERIPROC __rglgen_glPointParameteri; extern RGLSYMGLPOINTPARAMETERIVPROC __rglgen_glPointParameteriv; -extern RGLSYMGLFOGCOORDFPROC __rglgen_glFogCoordf; -extern RGLSYMGLFOGCOORDFVPROC __rglgen_glFogCoordfv; -extern RGLSYMGLFOGCOORDDPROC __rglgen_glFogCoordd; -extern RGLSYMGLFOGCOORDDVPROC __rglgen_glFogCoorddv; -extern RGLSYMGLFOGCOORDPOINTERPROC __rglgen_glFogCoordPointer; -extern RGLSYMGLSECONDARYCOLOR3BPROC __rglgen_glSecondaryColor3b; -extern RGLSYMGLSECONDARYCOLOR3BVPROC __rglgen_glSecondaryColor3bv; -extern RGLSYMGLSECONDARYCOLOR3DPROC __rglgen_glSecondaryColor3d; -extern RGLSYMGLSECONDARYCOLOR3DVPROC __rglgen_glSecondaryColor3dv; -extern RGLSYMGLSECONDARYCOLOR3FPROC __rglgen_glSecondaryColor3f; -extern RGLSYMGLSECONDARYCOLOR3FVPROC __rglgen_glSecondaryColor3fv; -extern RGLSYMGLSECONDARYCOLOR3IPROC __rglgen_glSecondaryColor3i; -extern RGLSYMGLSECONDARYCOLOR3IVPROC __rglgen_glSecondaryColor3iv; -extern RGLSYMGLSECONDARYCOLOR3SPROC __rglgen_glSecondaryColor3s; -extern RGLSYMGLSECONDARYCOLOR3SVPROC __rglgen_glSecondaryColor3sv; -extern RGLSYMGLSECONDARYCOLOR3UBPROC __rglgen_glSecondaryColor3ub; -extern RGLSYMGLSECONDARYCOLOR3UBVPROC __rglgen_glSecondaryColor3ubv; -extern RGLSYMGLSECONDARYCOLOR3UIPROC __rglgen_glSecondaryColor3ui; -extern RGLSYMGLSECONDARYCOLOR3UIVPROC __rglgen_glSecondaryColor3uiv; -extern RGLSYMGLSECONDARYCOLOR3USPROC __rglgen_glSecondaryColor3us; -extern RGLSYMGLSECONDARYCOLOR3USVPROC __rglgen_glSecondaryColor3usv; -extern RGLSYMGLSECONDARYCOLORPOINTERPROC __rglgen_glSecondaryColorPointer; -extern RGLSYMGLWINDOWPOS2DPROC __rglgen_glWindowPos2d; -extern RGLSYMGLWINDOWPOS2DVPROC __rglgen_glWindowPos2dv; -extern RGLSYMGLWINDOWPOS2FPROC __rglgen_glWindowPos2f; -extern RGLSYMGLWINDOWPOS2FVPROC __rglgen_glWindowPos2fv; -extern RGLSYMGLWINDOWPOS2IPROC __rglgen_glWindowPos2i; -extern RGLSYMGLWINDOWPOS2IVPROC __rglgen_glWindowPos2iv; -extern RGLSYMGLWINDOWPOS2SPROC __rglgen_glWindowPos2s; -extern RGLSYMGLWINDOWPOS2SVPROC __rglgen_glWindowPos2sv; -extern RGLSYMGLWINDOWPOS3DPROC __rglgen_glWindowPos3d; -extern RGLSYMGLWINDOWPOS3DVPROC __rglgen_glWindowPos3dv; -extern RGLSYMGLWINDOWPOS3FPROC __rglgen_glWindowPos3f; -extern RGLSYMGLWINDOWPOS3FVPROC __rglgen_glWindowPos3fv; -extern RGLSYMGLWINDOWPOS3IPROC __rglgen_glWindowPos3i; -extern RGLSYMGLWINDOWPOS3IVPROC __rglgen_glWindowPos3iv; -extern RGLSYMGLWINDOWPOS3SPROC __rglgen_glWindowPos3s; -extern RGLSYMGLWINDOWPOS3SVPROC __rglgen_glWindowPos3sv; extern RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; extern RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; extern RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; @@ -2464,36 +2875,6 @@ extern RGLSYMGLVERTEXATTRIBP3UIPROC __rglgen_glVertexAttribP3ui; extern RGLSYMGLVERTEXATTRIBP3UIVPROC __rglgen_glVertexAttribP3uiv; extern RGLSYMGLVERTEXATTRIBP4UIPROC __rglgen_glVertexAttribP4ui; extern RGLSYMGLVERTEXATTRIBP4UIVPROC __rglgen_glVertexAttribP4uiv; -extern RGLSYMGLVERTEXP2UIPROC __rglgen_glVertexP2ui; -extern RGLSYMGLVERTEXP2UIVPROC __rglgen_glVertexP2uiv; -extern RGLSYMGLVERTEXP3UIPROC __rglgen_glVertexP3ui; -extern RGLSYMGLVERTEXP3UIVPROC __rglgen_glVertexP3uiv; -extern RGLSYMGLVERTEXP4UIPROC __rglgen_glVertexP4ui; -extern RGLSYMGLVERTEXP4UIVPROC __rglgen_glVertexP4uiv; -extern RGLSYMGLTEXCOORDP1UIPROC __rglgen_glTexCoordP1ui; -extern RGLSYMGLTEXCOORDP1UIVPROC __rglgen_glTexCoordP1uiv; -extern RGLSYMGLTEXCOORDP2UIPROC __rglgen_glTexCoordP2ui; -extern RGLSYMGLTEXCOORDP2UIVPROC __rglgen_glTexCoordP2uiv; -extern RGLSYMGLTEXCOORDP3UIPROC __rglgen_glTexCoordP3ui; -extern RGLSYMGLTEXCOORDP3UIVPROC __rglgen_glTexCoordP3uiv; -extern RGLSYMGLTEXCOORDP4UIPROC __rglgen_glTexCoordP4ui; -extern RGLSYMGLTEXCOORDP4UIVPROC __rglgen_glTexCoordP4uiv; -extern RGLSYMGLMULTITEXCOORDP1UIPROC __rglgen_glMultiTexCoordP1ui; -extern RGLSYMGLMULTITEXCOORDP1UIVPROC __rglgen_glMultiTexCoordP1uiv; -extern RGLSYMGLMULTITEXCOORDP2UIPROC __rglgen_glMultiTexCoordP2ui; -extern RGLSYMGLMULTITEXCOORDP2UIVPROC __rglgen_glMultiTexCoordP2uiv; -extern RGLSYMGLMULTITEXCOORDP3UIPROC __rglgen_glMultiTexCoordP3ui; -extern RGLSYMGLMULTITEXCOORDP3UIVPROC __rglgen_glMultiTexCoordP3uiv; -extern RGLSYMGLMULTITEXCOORDP4UIPROC __rglgen_glMultiTexCoordP4ui; -extern RGLSYMGLMULTITEXCOORDP4UIVPROC __rglgen_glMultiTexCoordP4uiv; -extern RGLSYMGLNORMALP3UIPROC __rglgen_glNormalP3ui; -extern RGLSYMGLNORMALP3UIVPROC __rglgen_glNormalP3uiv; -extern RGLSYMGLCOLORP3UIPROC __rglgen_glColorP3ui; -extern RGLSYMGLCOLORP3UIVPROC __rglgen_glColorP3uiv; -extern RGLSYMGLCOLORP4UIPROC __rglgen_glColorP4ui; -extern RGLSYMGLCOLORP4UIVPROC __rglgen_glColorP4uiv; -extern RGLSYMGLSECONDARYCOLORP3UIPROC __rglgen_glSecondaryColorP3ui; -extern RGLSYMGLSECONDARYCOLORP3UIVPROC __rglgen_glSecondaryColorP3uiv; extern RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; extern RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; extern RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; @@ -2692,6 +3073,121 @@ extern RGLSYMGLBINDTEXTURESPROC __rglgen_glBindTextures; extern RGLSYMGLBINDSAMPLERSPROC __rglgen_glBindSamplers; extern RGLSYMGLBINDIMAGETEXTURESPROC __rglgen_glBindImageTextures; extern RGLSYMGLBINDVERTEXBUFFERSPROC __rglgen_glBindVertexBuffers; +extern RGLSYMGLCLIPCONTROLPROC __rglgen_glClipControl; +extern RGLSYMGLCREATETRANSFORMFEEDBACKSPROC __rglgen_glCreateTransformFeedbacks; +extern RGLSYMGLTRANSFORMFEEDBACKBUFFERBASEPROC __rglgen_glTransformFeedbackBufferBase; +extern RGLSYMGLTRANSFORMFEEDBACKBUFFERRANGEPROC __rglgen_glTransformFeedbackBufferRange; +extern RGLSYMGLGETTRANSFORMFEEDBACKIVPROC __rglgen_glGetTransformFeedbackiv; +extern RGLSYMGLGETTRANSFORMFEEDBACKI_VPROC __rglgen_glGetTransformFeedbacki_v; +extern RGLSYMGLGETTRANSFORMFEEDBACKI64_VPROC __rglgen_glGetTransformFeedbacki64_v; +extern RGLSYMGLCREATEBUFFERSPROC __rglgen_glCreateBuffers; +extern RGLSYMGLNAMEDBUFFERSTORAGEPROC __rglgen_glNamedBufferStorage; +extern RGLSYMGLNAMEDBUFFERDATAPROC __rglgen_glNamedBufferData; +extern RGLSYMGLNAMEDBUFFERSUBDATAPROC __rglgen_glNamedBufferSubData; +extern RGLSYMGLCOPYNAMEDBUFFERSUBDATAPROC __rglgen_glCopyNamedBufferSubData; +extern RGLSYMGLCLEARNAMEDBUFFERDATAPROC __rglgen_glClearNamedBufferData; +extern RGLSYMGLCLEARNAMEDBUFFERSUBDATAPROC __rglgen_glClearNamedBufferSubData; +extern RGLSYMGLMAPNAMEDBUFFERPROC __rglgen_glMapNamedBuffer; +extern RGLSYMGLMAPNAMEDBUFFERRANGEPROC __rglgen_glMapNamedBufferRange; +extern RGLSYMGLUNMAPNAMEDBUFFERPROC __rglgen_glUnmapNamedBuffer; +extern RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __rglgen_glFlushMappedNamedBufferRange; +extern RGLSYMGLGETNAMEDBUFFERPARAMETERIVPROC __rglgen_glGetNamedBufferParameteriv; +extern RGLSYMGLGETNAMEDBUFFERPARAMETERI64VPROC __rglgen_glGetNamedBufferParameteri64v; +extern RGLSYMGLGETNAMEDBUFFERPOINTERVPROC __rglgen_glGetNamedBufferPointerv; +extern RGLSYMGLGETNAMEDBUFFERSUBDATAPROC __rglgen_glGetNamedBufferSubData; +extern RGLSYMGLCREATEFRAMEBUFFERSPROC __rglgen_glCreateFramebuffers; +extern RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __rglgen_glNamedFramebufferRenderbuffer; +extern RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIPROC __rglgen_glNamedFramebufferParameteri; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTUREPROC __rglgen_glNamedFramebufferTexture; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __rglgen_glNamedFramebufferTextureLayer; +extern RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __rglgen_glNamedFramebufferDrawBuffer; +extern RGLSYMGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __rglgen_glNamedFramebufferDrawBuffers; +extern RGLSYMGLNAMEDFRAMEBUFFERREADBUFFERPROC __rglgen_glNamedFramebufferReadBuffer; +extern RGLSYMGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __rglgen_glInvalidateNamedFramebufferData; +extern RGLSYMGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __rglgen_glInvalidateNamedFramebufferSubData; +extern RGLSYMGLCLEARNAMEDFRAMEBUFFERIVPROC __rglgen_glClearNamedFramebufferiv; +extern RGLSYMGLCLEARNAMEDFRAMEBUFFERUIVPROC __rglgen_glClearNamedFramebufferuiv; +extern RGLSYMGLCLEARNAMEDFRAMEBUFFERFVPROC __rglgen_glClearNamedFramebufferfv; +extern RGLSYMGLCLEARNAMEDFRAMEBUFFERFIPROC __rglgen_glClearNamedFramebufferfi; +extern RGLSYMGLBLITNAMEDFRAMEBUFFERPROC __rglgen_glBlitNamedFramebuffer; +extern RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __rglgen_glCheckNamedFramebufferStatus; +extern RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetNamedFramebufferParameteriv; +extern RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetNamedFramebufferAttachmentParameteriv; +extern RGLSYMGLCREATERENDERBUFFERSPROC __rglgen_glCreateRenderbuffers; +extern RGLSYMGLNAMEDRENDERBUFFERSTORAGEPROC __rglgen_glNamedRenderbufferStorage; +extern RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glNamedRenderbufferStorageMultisample; +extern RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __rglgen_glGetNamedRenderbufferParameteriv; +extern RGLSYMGLCREATETEXTURESPROC __rglgen_glCreateTextures; +extern RGLSYMGLTEXTUREBUFFERPROC __rglgen_glTextureBuffer; +extern RGLSYMGLTEXTUREBUFFERRANGEPROC __rglgen_glTextureBufferRange; +extern RGLSYMGLTEXTURESTORAGE1DPROC __rglgen_glTextureStorage1D; +extern RGLSYMGLTEXTURESTORAGE2DPROC __rglgen_glTextureStorage2D; +extern RGLSYMGLTEXTURESTORAGE3DPROC __rglgen_glTextureStorage3D; +extern RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEPROC __rglgen_glTextureStorage2DMultisample; +extern RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEPROC __rglgen_glTextureStorage3DMultisample; +extern RGLSYMGLTEXTURESUBIMAGE1DPROC __rglgen_glTextureSubImage1D; +extern RGLSYMGLTEXTURESUBIMAGE2DPROC __rglgen_glTextureSubImage2D; +extern RGLSYMGLTEXTURESUBIMAGE3DPROC __rglgen_glTextureSubImage3D; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __rglgen_glCompressedTextureSubImage1D; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __rglgen_glCompressedTextureSubImage2D; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __rglgen_glCompressedTextureSubImage3D; +extern RGLSYMGLCOPYTEXTURESUBIMAGE1DPROC __rglgen_glCopyTextureSubImage1D; +extern RGLSYMGLCOPYTEXTURESUBIMAGE2DPROC __rglgen_glCopyTextureSubImage2D; +extern RGLSYMGLCOPYTEXTURESUBIMAGE3DPROC __rglgen_glCopyTextureSubImage3D; +extern RGLSYMGLTEXTUREPARAMETERFPROC __rglgen_glTextureParameterf; +extern RGLSYMGLTEXTUREPARAMETERFVPROC __rglgen_glTextureParameterfv; +extern RGLSYMGLTEXTUREPARAMETERIPROC __rglgen_glTextureParameteri; +extern RGLSYMGLTEXTUREPARAMETERIIVPROC __rglgen_glTextureParameterIiv; +extern RGLSYMGLTEXTUREPARAMETERIUIVPROC __rglgen_glTextureParameterIuiv; +extern RGLSYMGLTEXTUREPARAMETERIVPROC __rglgen_glTextureParameteriv; +extern RGLSYMGLGENERATETEXTUREMIPMAPPROC __rglgen_glGenerateTextureMipmap; +extern RGLSYMGLBINDTEXTUREUNITPROC __rglgen_glBindTextureUnit; +extern RGLSYMGLGETTEXTUREIMAGEPROC __rglgen_glGetTextureImage; +extern RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEPROC __rglgen_glGetCompressedTextureImage; +extern RGLSYMGLGETTEXTURELEVELPARAMETERFVPROC __rglgen_glGetTextureLevelParameterfv; +extern RGLSYMGLGETTEXTURELEVELPARAMETERIVPROC __rglgen_glGetTextureLevelParameteriv; +extern RGLSYMGLGETTEXTUREPARAMETERFVPROC __rglgen_glGetTextureParameterfv; +extern RGLSYMGLGETTEXTUREPARAMETERIIVPROC __rglgen_glGetTextureParameterIiv; +extern RGLSYMGLGETTEXTUREPARAMETERIUIVPROC __rglgen_glGetTextureParameterIuiv; +extern RGLSYMGLGETTEXTUREPARAMETERIVPROC __rglgen_glGetTextureParameteriv; +extern RGLSYMGLCREATEVERTEXARRAYSPROC __rglgen_glCreateVertexArrays; +extern RGLSYMGLDISABLEVERTEXARRAYATTRIBPROC __rglgen_glDisableVertexArrayAttrib; +extern RGLSYMGLENABLEVERTEXARRAYATTRIBPROC __rglgen_glEnableVertexArrayAttrib; +extern RGLSYMGLVERTEXARRAYELEMENTBUFFERPROC __rglgen_glVertexArrayElementBuffer; +extern RGLSYMGLVERTEXARRAYVERTEXBUFFERPROC __rglgen_glVertexArrayVertexBuffer; +extern RGLSYMGLVERTEXARRAYVERTEXBUFFERSPROC __rglgen_glVertexArrayVertexBuffers; +extern RGLSYMGLVERTEXARRAYATTRIBBINDINGPROC __rglgen_glVertexArrayAttribBinding; +extern RGLSYMGLVERTEXARRAYATTRIBFORMATPROC __rglgen_glVertexArrayAttribFormat; +extern RGLSYMGLVERTEXARRAYATTRIBIFORMATPROC __rglgen_glVertexArrayAttribIFormat; +extern RGLSYMGLVERTEXARRAYATTRIBLFORMATPROC __rglgen_glVertexArrayAttribLFormat; +extern RGLSYMGLVERTEXARRAYBINDINGDIVISORPROC __rglgen_glVertexArrayBindingDivisor; +extern RGLSYMGLGETVERTEXARRAYIVPROC __rglgen_glGetVertexArrayiv; +extern RGLSYMGLGETVERTEXARRAYINDEXEDIVPROC __rglgen_glGetVertexArrayIndexediv; +extern RGLSYMGLGETVERTEXARRAYINDEXED64IVPROC __rglgen_glGetVertexArrayIndexed64iv; +extern RGLSYMGLCREATESAMPLERSPROC __rglgen_glCreateSamplers; +extern RGLSYMGLCREATEPROGRAMPIPELINESPROC __rglgen_glCreateProgramPipelines; +extern RGLSYMGLCREATEQUERIESPROC __rglgen_glCreateQueries; +extern RGLSYMGLGETQUERYBUFFEROBJECTI64VPROC __rglgen_glGetQueryBufferObjecti64v; +extern RGLSYMGLGETQUERYBUFFEROBJECTIVPROC __rglgen_glGetQueryBufferObjectiv; +extern RGLSYMGLGETQUERYBUFFEROBJECTUI64VPROC __rglgen_glGetQueryBufferObjectui64v; +extern RGLSYMGLGETQUERYBUFFEROBJECTUIVPROC __rglgen_glGetQueryBufferObjectuiv; +extern RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; +extern RGLSYMGLGETTEXTURESUBIMAGEPROC __rglgen_glGetTextureSubImage; +extern RGLSYMGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __rglgen_glGetCompressedTextureSubImage; +extern RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; +extern RGLSYMGLGETNCOMPRESSEDTEXIMAGEPROC __rglgen_glGetnCompressedTexImage; +extern RGLSYMGLGETNTEXIMAGEPROC __rglgen_glGetnTexImage; +extern RGLSYMGLGETNUNIFORMDVPROC __rglgen_glGetnUniformdv; +extern RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; +extern RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; +extern RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; +extern RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; +extern RGLSYMGLTEXTUREBARRIERPROC __rglgen_glTextureBarrier; +extern RGLSYMGLSPECIALIZESHADERPROC __rglgen_glSpecializeShader; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTPROC __rglgen_glMultiDrawArraysIndirectCount; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC __rglgen_glMultiDrawElementsIndirectCount; +extern RGLSYMGLPOLYGONOFFSETCLAMPPROC __rglgen_glPolygonOffsetClamp; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXARBPROC __rglgen_glPrimitiveBoundingBoxARB; extern RGLSYMGLGETTEXTUREHANDLEARBPROC __rglgen_glGetTextureHandleARB; extern RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC __rglgen_glGetTextureSamplerHandleARB; extern RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC __rglgen_glMakeTextureHandleResidentARB; @@ -2708,128 +3204,62 @@ extern RGLSYMGLISIMAGEHANDLERESIDENTARBPROC __rglgen_glIsImageHandleResidentARB; extern RGLSYMGLVERTEXATTRIBL1UI64ARBPROC __rglgen_glVertexAttribL1ui64ARB; extern RGLSYMGLVERTEXATTRIBL1UI64VARBPROC __rglgen_glVertexAttribL1ui64vARB; extern RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC __rglgen_glGetVertexAttribLui64vARB; -extern RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; -extern RGLSYMGLCLAMPCOLORARBPROC __rglgen_glClampColorARB; extern RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC __rglgen_glDispatchComputeGroupSizeARB; extern RGLSYMGLDEBUGMESSAGECONTROLARBPROC __rglgen_glDebugMessageControlARB; extern RGLSYMGLDEBUGMESSAGEINSERTARBPROC __rglgen_glDebugMessageInsertARB; extern RGLSYMGLDEBUGMESSAGECALLBACKARBPROC __rglgen_glDebugMessageCallbackARB; extern RGLSYMGLGETDEBUGMESSAGELOGARBPROC __rglgen_glGetDebugMessageLogARB; -extern RGLSYMGLDRAWBUFFERSARBPROC __rglgen_glDrawBuffersARB; extern RGLSYMGLBLENDEQUATIONIARBPROC __rglgen_glBlendEquationiARB; extern RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC __rglgen_glBlendEquationSeparateiARB; extern RGLSYMGLBLENDFUNCIARBPROC __rglgen_glBlendFunciARB; extern RGLSYMGLBLENDFUNCSEPARATEIARBPROC __rglgen_glBlendFuncSeparateiARB; extern RGLSYMGLDRAWARRAYSINSTANCEDARBPROC __rglgen_glDrawArraysInstancedARB; extern RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC __rglgen_glDrawElementsInstancedARB; -extern RGLSYMGLPROGRAMSTRINGARBPROC __rglgen_glProgramStringARB; -extern RGLSYMGLBINDPROGRAMARBPROC __rglgen_glBindProgramARB; -extern RGLSYMGLDELETEPROGRAMSARBPROC __rglgen_glDeleteProgramsARB; -extern RGLSYMGLGENPROGRAMSARBPROC __rglgen_glGenProgramsARB; -extern RGLSYMGLPROGRAMENVPARAMETER4DARBPROC __rglgen_glProgramEnvParameter4dARB; -extern RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC __rglgen_glProgramEnvParameter4dvARB; -extern RGLSYMGLPROGRAMENVPARAMETER4FARBPROC __rglgen_glProgramEnvParameter4fARB; -extern RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC __rglgen_glProgramEnvParameter4fvARB; -extern RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC __rglgen_glProgramLocalParameter4dARB; -extern RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC __rglgen_glProgramLocalParameter4dvARB; -extern RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC __rglgen_glProgramLocalParameter4fARB; -extern RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC __rglgen_glProgramLocalParameter4fvARB; -extern RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC __rglgen_glGetProgramEnvParameterdvARB; -extern RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC __rglgen_glGetProgramEnvParameterfvARB; -extern RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC __rglgen_glGetProgramLocalParameterdvARB; -extern RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC __rglgen_glGetProgramLocalParameterfvARB; -extern RGLSYMGLGETPROGRAMIVARBPROC __rglgen_glGetProgramivARB; -extern RGLSYMGLGETPROGRAMSTRINGARBPROC __rglgen_glGetProgramStringARB; -extern RGLSYMGLISPROGRAMARBPROC __rglgen_glIsProgramARB; extern RGLSYMGLPROGRAMPARAMETERIARBPROC __rglgen_glProgramParameteriARB; extern RGLSYMGLFRAMEBUFFERTEXTUREARBPROC __rglgen_glFramebufferTextureARB; extern RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC __rglgen_glFramebufferTextureLayerARB; extern RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC __rglgen_glFramebufferTextureFaceARB; -extern RGLSYMGLCOLORTABLEPROC __rglgen_glColorTable; -extern RGLSYMGLCOLORTABLEPARAMETERFVPROC __rglgen_glColorTableParameterfv; -extern RGLSYMGLCOLORTABLEPARAMETERIVPROC __rglgen_glColorTableParameteriv; -extern RGLSYMGLCOPYCOLORTABLEPROC __rglgen_glCopyColorTable; -extern RGLSYMGLGETCOLORTABLEPROC __rglgen_glGetColorTable; -extern RGLSYMGLGETCOLORTABLEPARAMETERFVPROC __rglgen_glGetColorTableParameterfv; -extern RGLSYMGLGETCOLORTABLEPARAMETERIVPROC __rglgen_glGetColorTableParameteriv; -extern RGLSYMGLCOLORSUBTABLEPROC __rglgen_glColorSubTable; -extern RGLSYMGLCOPYCOLORSUBTABLEPROC __rglgen_glCopyColorSubTable; -extern RGLSYMGLCONVOLUTIONFILTER1DPROC __rglgen_glConvolutionFilter1D; -extern RGLSYMGLCONVOLUTIONFILTER2DPROC __rglgen_glConvolutionFilter2D; -extern RGLSYMGLCONVOLUTIONPARAMETERFPROC __rglgen_glConvolutionParameterf; -extern RGLSYMGLCONVOLUTIONPARAMETERFVPROC __rglgen_glConvolutionParameterfv; -extern RGLSYMGLCONVOLUTIONPARAMETERIPROC __rglgen_glConvolutionParameteri; -extern RGLSYMGLCONVOLUTIONPARAMETERIVPROC __rglgen_glConvolutionParameteriv; -extern RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC __rglgen_glCopyConvolutionFilter1D; -extern RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC __rglgen_glCopyConvolutionFilter2D; -extern RGLSYMGLGETCONVOLUTIONFILTERPROC __rglgen_glGetConvolutionFilter; -extern RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC __rglgen_glGetConvolutionParameterfv; -extern RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC __rglgen_glGetConvolutionParameteriv; -extern RGLSYMGLGETSEPARABLEFILTERPROC __rglgen_glGetSeparableFilter; -extern RGLSYMGLSEPARABLEFILTER2DPROC __rglgen_glSeparableFilter2D; -extern RGLSYMGLGETHISTOGRAMPROC __rglgen_glGetHistogram; -extern RGLSYMGLGETHISTOGRAMPARAMETERFVPROC __rglgen_glGetHistogramParameterfv; -extern RGLSYMGLGETHISTOGRAMPARAMETERIVPROC __rglgen_glGetHistogramParameteriv; -extern RGLSYMGLGETMINMAXPROC __rglgen_glGetMinmax; -extern RGLSYMGLGETMINMAXPARAMETERFVPROC __rglgen_glGetMinmaxParameterfv; -extern RGLSYMGLGETMINMAXPARAMETERIVPROC __rglgen_glGetMinmaxParameteriv; -extern RGLSYMGLHISTOGRAMPROC __rglgen_glHistogram; -extern RGLSYMGLMINMAXPROC __rglgen_glMinmax; -extern RGLSYMGLRESETHISTOGRAMPROC __rglgen_glResetHistogram; -extern RGLSYMGLRESETMINMAXPROC __rglgen_glResetMinmax; +extern RGLSYMGLSPECIALIZESHADERARBPROC __rglgen_glSpecializeShaderARB; +extern RGLSYMGLUNIFORM1I64ARBPROC __rglgen_glUniform1i64ARB; +extern RGLSYMGLUNIFORM2I64ARBPROC __rglgen_glUniform2i64ARB; +extern RGLSYMGLUNIFORM3I64ARBPROC __rglgen_glUniform3i64ARB; +extern RGLSYMGLUNIFORM4I64ARBPROC __rglgen_glUniform4i64ARB; +extern RGLSYMGLUNIFORM1I64VARBPROC __rglgen_glUniform1i64vARB; +extern RGLSYMGLUNIFORM2I64VARBPROC __rglgen_glUniform2i64vARB; +extern RGLSYMGLUNIFORM3I64VARBPROC __rglgen_glUniform3i64vARB; +extern RGLSYMGLUNIFORM4I64VARBPROC __rglgen_glUniform4i64vARB; +extern RGLSYMGLUNIFORM1UI64ARBPROC __rglgen_glUniform1ui64ARB; +extern RGLSYMGLUNIFORM2UI64ARBPROC __rglgen_glUniform2ui64ARB; +extern RGLSYMGLUNIFORM3UI64ARBPROC __rglgen_glUniform3ui64ARB; +extern RGLSYMGLUNIFORM4UI64ARBPROC __rglgen_glUniform4ui64ARB; +extern RGLSYMGLUNIFORM1UI64VARBPROC __rglgen_glUniform1ui64vARB; +extern RGLSYMGLUNIFORM2UI64VARBPROC __rglgen_glUniform2ui64vARB; +extern RGLSYMGLUNIFORM3UI64VARBPROC __rglgen_glUniform3ui64vARB; +extern RGLSYMGLUNIFORM4UI64VARBPROC __rglgen_glUniform4ui64vARB; +extern RGLSYMGLGETUNIFORMI64VARBPROC __rglgen_glGetUniformi64vARB; +extern RGLSYMGLGETUNIFORMUI64VARBPROC __rglgen_glGetUniformui64vARB; +extern RGLSYMGLGETNUNIFORMI64VARBPROC __rglgen_glGetnUniformi64vARB; +extern RGLSYMGLGETNUNIFORMUI64VARBPROC __rglgen_glGetnUniformui64vARB; +extern RGLSYMGLPROGRAMUNIFORM1I64ARBPROC __rglgen_glProgramUniform1i64ARB; +extern RGLSYMGLPROGRAMUNIFORM2I64ARBPROC __rglgen_glProgramUniform2i64ARB; +extern RGLSYMGLPROGRAMUNIFORM3I64ARBPROC __rglgen_glProgramUniform3i64ARB; +extern RGLSYMGLPROGRAMUNIFORM4I64ARBPROC __rglgen_glProgramUniform4i64ARB; +extern RGLSYMGLPROGRAMUNIFORM1I64VARBPROC __rglgen_glProgramUniform1i64vARB; +extern RGLSYMGLPROGRAMUNIFORM2I64VARBPROC __rglgen_glProgramUniform2i64vARB; +extern RGLSYMGLPROGRAMUNIFORM3I64VARBPROC __rglgen_glProgramUniform3i64vARB; +extern RGLSYMGLPROGRAMUNIFORM4I64VARBPROC __rglgen_glProgramUniform4i64vARB; +extern RGLSYMGLPROGRAMUNIFORM1UI64ARBPROC __rglgen_glProgramUniform1ui64ARB; +extern RGLSYMGLPROGRAMUNIFORM2UI64ARBPROC __rglgen_glProgramUniform2ui64ARB; +extern RGLSYMGLPROGRAMUNIFORM3UI64ARBPROC __rglgen_glProgramUniform3ui64ARB; +extern RGLSYMGLPROGRAMUNIFORM4UI64ARBPROC __rglgen_glProgramUniform4ui64ARB; +extern RGLSYMGLPROGRAMUNIFORM1UI64VARBPROC __rglgen_glProgramUniform1ui64vARB; +extern RGLSYMGLPROGRAMUNIFORM2UI64VARBPROC __rglgen_glProgramUniform2ui64vARB; +extern RGLSYMGLPROGRAMUNIFORM3UI64VARBPROC __rglgen_glProgramUniform3ui64vARB; +extern RGLSYMGLPROGRAMUNIFORM4UI64VARBPROC __rglgen_glProgramUniform4ui64vARB; extern RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawArraysIndirectCountARB; extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawElementsIndirectCountARB; extern RGLSYMGLVERTEXATTRIBDIVISORARBPROC __rglgen_glVertexAttribDivisorARB; -extern RGLSYMGLCURRENTPALETTEMATRIXARBPROC __rglgen_glCurrentPaletteMatrixARB; -extern RGLSYMGLMATRIXINDEXUBVARBPROC __rglgen_glMatrixIndexubvARB; -extern RGLSYMGLMATRIXINDEXUSVARBPROC __rglgen_glMatrixIndexusvARB; -extern RGLSYMGLMATRIXINDEXUIVARBPROC __rglgen_glMatrixIndexuivARB; -extern RGLSYMGLMATRIXINDEXPOINTERARBPROC __rglgen_glMatrixIndexPointerARB; -extern RGLSYMGLSAMPLECOVERAGEARBPROC __rglgen_glSampleCoverageARB; -extern RGLSYMGLACTIVETEXTUREARBPROC __rglgen_glActiveTextureARB; -extern RGLSYMGLCLIENTACTIVETEXTUREARBPROC __rglgen_glClientActiveTextureARB; -extern RGLSYMGLMULTITEXCOORD1DARBPROC __rglgen_glMultiTexCoord1dARB; -extern RGLSYMGLMULTITEXCOORD1DVARBPROC __rglgen_glMultiTexCoord1dvARB; -extern RGLSYMGLMULTITEXCOORD1FARBPROC __rglgen_glMultiTexCoord1fARB; -extern RGLSYMGLMULTITEXCOORD1FVARBPROC __rglgen_glMultiTexCoord1fvARB; -extern RGLSYMGLMULTITEXCOORD1IARBPROC __rglgen_glMultiTexCoord1iARB; -extern RGLSYMGLMULTITEXCOORD1IVARBPROC __rglgen_glMultiTexCoord1ivARB; -extern RGLSYMGLMULTITEXCOORD1SARBPROC __rglgen_glMultiTexCoord1sARB; -extern RGLSYMGLMULTITEXCOORD1SVARBPROC __rglgen_glMultiTexCoord1svARB; -extern RGLSYMGLMULTITEXCOORD2DARBPROC __rglgen_glMultiTexCoord2dARB; -extern RGLSYMGLMULTITEXCOORD2DVARBPROC __rglgen_glMultiTexCoord2dvARB; -extern RGLSYMGLMULTITEXCOORD2FARBPROC __rglgen_glMultiTexCoord2fARB; -extern RGLSYMGLMULTITEXCOORD2FVARBPROC __rglgen_glMultiTexCoord2fvARB; -extern RGLSYMGLMULTITEXCOORD2IARBPROC __rglgen_glMultiTexCoord2iARB; -extern RGLSYMGLMULTITEXCOORD2IVARBPROC __rglgen_glMultiTexCoord2ivARB; -extern RGLSYMGLMULTITEXCOORD2SARBPROC __rglgen_glMultiTexCoord2sARB; -extern RGLSYMGLMULTITEXCOORD2SVARBPROC __rglgen_glMultiTexCoord2svARB; -extern RGLSYMGLMULTITEXCOORD3DARBPROC __rglgen_glMultiTexCoord3dARB; -extern RGLSYMGLMULTITEXCOORD3DVARBPROC __rglgen_glMultiTexCoord3dvARB; -extern RGLSYMGLMULTITEXCOORD3FARBPROC __rglgen_glMultiTexCoord3fARB; -extern RGLSYMGLMULTITEXCOORD3FVARBPROC __rglgen_glMultiTexCoord3fvARB; -extern RGLSYMGLMULTITEXCOORD3IARBPROC __rglgen_glMultiTexCoord3iARB; -extern RGLSYMGLMULTITEXCOORD3IVARBPROC __rglgen_glMultiTexCoord3ivARB; -extern RGLSYMGLMULTITEXCOORD3SARBPROC __rglgen_glMultiTexCoord3sARB; -extern RGLSYMGLMULTITEXCOORD3SVARBPROC __rglgen_glMultiTexCoord3svARB; -extern RGLSYMGLMULTITEXCOORD4DARBPROC __rglgen_glMultiTexCoord4dARB; -extern RGLSYMGLMULTITEXCOORD4DVARBPROC __rglgen_glMultiTexCoord4dvARB; -extern RGLSYMGLMULTITEXCOORD4FARBPROC __rglgen_glMultiTexCoord4fARB; -extern RGLSYMGLMULTITEXCOORD4FVARBPROC __rglgen_glMultiTexCoord4fvARB; -extern RGLSYMGLMULTITEXCOORD4IARBPROC __rglgen_glMultiTexCoord4iARB; -extern RGLSYMGLMULTITEXCOORD4IVARBPROC __rglgen_glMultiTexCoord4ivARB; -extern RGLSYMGLMULTITEXCOORD4SARBPROC __rglgen_glMultiTexCoord4sARB; -extern RGLSYMGLMULTITEXCOORD4SVARBPROC __rglgen_glMultiTexCoord4svARB; -extern RGLSYMGLGENQUERIESARBPROC __rglgen_glGenQueriesARB; -extern RGLSYMGLDELETEQUERIESARBPROC __rglgen_glDeleteQueriesARB; -extern RGLSYMGLISQUERYARBPROC __rglgen_glIsQueryARB; -extern RGLSYMGLBEGINQUERYARBPROC __rglgen_glBeginQueryARB; -extern RGLSYMGLENDQUERYARBPROC __rglgen_glEndQueryARB; -extern RGLSYMGLGETQUERYIVARBPROC __rglgen_glGetQueryivARB; -extern RGLSYMGLGETQUERYOBJECTIVARBPROC __rglgen_glGetQueryObjectivARB; -extern RGLSYMGLGETQUERYOBJECTUIVARBPROC __rglgen_glGetQueryObjectuivARB; -extern RGLSYMGLPOINTPARAMETERFARBPROC __rglgen_glPointParameterfARB; -extern RGLSYMGLPOINTPARAMETERFVARBPROC __rglgen_glPointParameterfvARB; +extern RGLSYMGLMAXSHADERCOMPILERTHREADSARBPROC __rglgen_glMaxShaderCompilerThreadsARB; extern RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC __rglgen_glGetGraphicsResetStatusARB; extern RGLSYMGLGETNTEXIMAGEARBPROC __rglgen_glGetnTexImageARB; extern RGLSYMGLREADNPIXELSARBPROC __rglgen_glReadnPixelsARB; @@ -2838,299 +3268,513 @@ extern RGLSYMGLGETNUNIFORMFVARBPROC __rglgen_glGetnUniformfvARB; extern RGLSYMGLGETNUNIFORMIVARBPROC __rglgen_glGetnUniformivARB; extern RGLSYMGLGETNUNIFORMUIVARBPROC __rglgen_glGetnUniformuivARB; extern RGLSYMGLGETNUNIFORMDVARBPROC __rglgen_glGetnUniformdvARB; -extern RGLSYMGLGETNMAPDVARBPROC __rglgen_glGetnMapdvARB; -extern RGLSYMGLGETNMAPFVARBPROC __rglgen_glGetnMapfvARB; -extern RGLSYMGLGETNMAPIVARBPROC __rglgen_glGetnMapivARB; -extern RGLSYMGLGETNPIXELMAPFVARBPROC __rglgen_glGetnPixelMapfvARB; -extern RGLSYMGLGETNPIXELMAPUIVARBPROC __rglgen_glGetnPixelMapuivARB; -extern RGLSYMGLGETNPIXELMAPUSVARBPROC __rglgen_glGetnPixelMapusvARB; -extern RGLSYMGLGETNPOLYGONSTIPPLEARBPROC __rglgen_glGetnPolygonStippleARB; -extern RGLSYMGLGETNCOLORTABLEARBPROC __rglgen_glGetnColorTableARB; -extern RGLSYMGLGETNCONVOLUTIONFILTERARBPROC __rglgen_glGetnConvolutionFilterARB; -extern RGLSYMGLGETNSEPARABLEFILTERARBPROC __rglgen_glGetnSeparableFilterARB; -extern RGLSYMGLGETNHISTOGRAMARBPROC __rglgen_glGetnHistogramARB; -extern RGLSYMGLGETNMINMAXARBPROC __rglgen_glGetnMinmaxARB; +extern RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __rglgen_glFramebufferSampleLocationsfvARB; +extern RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __rglgen_glNamedFramebufferSampleLocationsfvARB; +extern RGLSYMGLEVALUATEDEPTHVALUESARBPROC __rglgen_glEvaluateDepthValuesARB; extern RGLSYMGLMINSAMPLESHADINGARBPROC __rglgen_glMinSampleShadingARB; -extern RGLSYMGLDELETEOBJECTARBPROC __rglgen_glDeleteObjectARB; -extern RGLSYMGLGETHANDLEARBPROC __rglgen_glGetHandleARB; -extern RGLSYMGLDETACHOBJECTARBPROC __rglgen_glDetachObjectARB; -extern RGLSYMGLCREATESHADEROBJECTARBPROC __rglgen_glCreateShaderObjectARB; -extern RGLSYMGLSHADERSOURCEARBPROC __rglgen_glShaderSourceARB; -extern RGLSYMGLCOMPILESHADERARBPROC __rglgen_glCompileShaderARB; -extern RGLSYMGLCREATEPROGRAMOBJECTARBPROC __rglgen_glCreateProgramObjectARB; -extern RGLSYMGLATTACHOBJECTARBPROC __rglgen_glAttachObjectARB; -extern RGLSYMGLLINKPROGRAMARBPROC __rglgen_glLinkProgramARB; -extern RGLSYMGLUSEPROGRAMOBJECTARBPROC __rglgen_glUseProgramObjectARB; -extern RGLSYMGLVALIDATEPROGRAMARBPROC __rglgen_glValidateProgramARB; -extern RGLSYMGLUNIFORM1FARBPROC __rglgen_glUniform1fARB; -extern RGLSYMGLUNIFORM2FARBPROC __rglgen_glUniform2fARB; -extern RGLSYMGLUNIFORM3FARBPROC __rglgen_glUniform3fARB; -extern RGLSYMGLUNIFORM4FARBPROC __rglgen_glUniform4fARB; -extern RGLSYMGLUNIFORM1IARBPROC __rglgen_glUniform1iARB; -extern RGLSYMGLUNIFORM2IARBPROC __rglgen_glUniform2iARB; -extern RGLSYMGLUNIFORM3IARBPROC __rglgen_glUniform3iARB; -extern RGLSYMGLUNIFORM4IARBPROC __rglgen_glUniform4iARB; -extern RGLSYMGLUNIFORM1FVARBPROC __rglgen_glUniform1fvARB; -extern RGLSYMGLUNIFORM2FVARBPROC __rglgen_glUniform2fvARB; -extern RGLSYMGLUNIFORM3FVARBPROC __rglgen_glUniform3fvARB; -extern RGLSYMGLUNIFORM4FVARBPROC __rglgen_glUniform4fvARB; -extern RGLSYMGLUNIFORM1IVARBPROC __rglgen_glUniform1ivARB; -extern RGLSYMGLUNIFORM2IVARBPROC __rglgen_glUniform2ivARB; -extern RGLSYMGLUNIFORM3IVARBPROC __rglgen_glUniform3ivARB; -extern RGLSYMGLUNIFORM4IVARBPROC __rglgen_glUniform4ivARB; -extern RGLSYMGLUNIFORMMATRIX2FVARBPROC __rglgen_glUniformMatrix2fvARB; -extern RGLSYMGLUNIFORMMATRIX3FVARBPROC __rglgen_glUniformMatrix3fvARB; -extern RGLSYMGLUNIFORMMATRIX4FVARBPROC __rglgen_glUniformMatrix4fvARB; -extern RGLSYMGLGETOBJECTPARAMETERFVARBPROC __rglgen_glGetObjectParameterfvARB; -extern RGLSYMGLGETOBJECTPARAMETERIVARBPROC __rglgen_glGetObjectParameterivARB; -extern RGLSYMGLGETINFOLOGARBPROC __rglgen_glGetInfoLogARB; -extern RGLSYMGLGETATTACHEDOBJECTSARBPROC __rglgen_glGetAttachedObjectsARB; -extern RGLSYMGLGETUNIFORMLOCATIONARBPROC __rglgen_glGetUniformLocationARB; -extern RGLSYMGLGETACTIVEUNIFORMARBPROC __rglgen_glGetActiveUniformARB; -extern RGLSYMGLGETUNIFORMFVARBPROC __rglgen_glGetUniformfvARB; -extern RGLSYMGLGETUNIFORMIVARBPROC __rglgen_glGetUniformivARB; -extern RGLSYMGLGETSHADERSOURCEARBPROC __rglgen_glGetShaderSourceARB; extern RGLSYMGLNAMEDSTRINGARBPROC __rglgen_glNamedStringARB; extern RGLSYMGLDELETENAMEDSTRINGARBPROC __rglgen_glDeleteNamedStringARB; extern RGLSYMGLCOMPILESHADERINCLUDEARBPROC __rglgen_glCompileShaderIncludeARB; extern RGLSYMGLISNAMEDSTRINGARBPROC __rglgen_glIsNamedStringARB; extern RGLSYMGLGETNAMEDSTRINGARBPROC __rglgen_glGetNamedStringARB; extern RGLSYMGLGETNAMEDSTRINGIVARBPROC __rglgen_glGetNamedStringivARB; +extern RGLSYMGLBUFFERPAGECOMMITMENTARBPROC __rglgen_glBufferPageCommitmentARB; +extern RGLSYMGLNAMEDBUFFERPAGECOMMITMENTEXTPROC __rglgen_glNamedBufferPageCommitmentEXT; +extern RGLSYMGLNAMEDBUFFERPAGECOMMITMENTARBPROC __rglgen_glNamedBufferPageCommitmentARB; extern RGLSYMGLTEXPAGECOMMITMENTARBPROC __rglgen_glTexPageCommitmentARB; extern RGLSYMGLTEXBUFFERARBPROC __rglgen_glTexBufferARB; -extern RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC __rglgen_glCompressedTexImage3DARB; -extern RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC __rglgen_glCompressedTexImage2DARB; -extern RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC __rglgen_glCompressedTexImage1DARB; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __rglgen_glCompressedTexSubImage3DARB; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __rglgen_glCompressedTexSubImage2DARB; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __rglgen_glCompressedTexSubImage1DARB; -extern RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetCompressedTexImageARB; -extern RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC __rglgen_glLoadTransposeMatrixfARB; -extern RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC __rglgen_glLoadTransposeMatrixdARB; -extern RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC __rglgen_glMultTransposeMatrixfARB; -extern RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC __rglgen_glMultTransposeMatrixdARB; -extern RGLSYMGLWEIGHTBVARBPROC __rglgen_glWeightbvARB; -extern RGLSYMGLWEIGHTSVARBPROC __rglgen_glWeightsvARB; -extern RGLSYMGLWEIGHTIVARBPROC __rglgen_glWeightivARB; -extern RGLSYMGLWEIGHTFVARBPROC __rglgen_glWeightfvARB; -extern RGLSYMGLWEIGHTDVARBPROC __rglgen_glWeightdvARB; -extern RGLSYMGLWEIGHTUBVARBPROC __rglgen_glWeightubvARB; -extern RGLSYMGLWEIGHTUSVARBPROC __rglgen_glWeightusvARB; -extern RGLSYMGLWEIGHTUIVARBPROC __rglgen_glWeightuivARB; -extern RGLSYMGLWEIGHTPOINTERARBPROC __rglgen_glWeightPointerARB; -extern RGLSYMGLVERTEXBLENDARBPROC __rglgen_glVertexBlendARB; -extern RGLSYMGLBINDBUFFERARBPROC __rglgen_glBindBufferARB; -extern RGLSYMGLDELETEBUFFERSARBPROC __rglgen_glDeleteBuffersARB; -extern RGLSYMGLGENBUFFERSARBPROC __rglgen_glGenBuffersARB; -extern RGLSYMGLISBUFFERARBPROC __rglgen_glIsBufferARB; -extern RGLSYMGLBUFFERDATAARBPROC __rglgen_glBufferDataARB; -extern RGLSYMGLBUFFERSUBDATAARBPROC __rglgen_glBufferSubDataARB; -extern RGLSYMGLGETBUFFERSUBDATAARBPROC __rglgen_glGetBufferSubDataARB; -extern RGLSYMGLMAPBUFFERARBPROC __rglgen_glMapBufferARB; -extern RGLSYMGLUNMAPBUFFERARBPROC __rglgen_glUnmapBufferARB; -extern RGLSYMGLGETBUFFERPARAMETERIVARBPROC __rglgen_glGetBufferParameterivARB; -extern RGLSYMGLGETBUFFERPOINTERVARBPROC __rglgen_glGetBufferPointervARB; -extern RGLSYMGLVERTEXATTRIB1DARBPROC __rglgen_glVertexAttrib1dARB; -extern RGLSYMGLVERTEXATTRIB1DVARBPROC __rglgen_glVertexAttrib1dvARB; -extern RGLSYMGLVERTEXATTRIB1FARBPROC __rglgen_glVertexAttrib1fARB; -extern RGLSYMGLVERTEXATTRIB1FVARBPROC __rglgen_glVertexAttrib1fvARB; -extern RGLSYMGLVERTEXATTRIB1SARBPROC __rglgen_glVertexAttrib1sARB; -extern RGLSYMGLVERTEXATTRIB1SVARBPROC __rglgen_glVertexAttrib1svARB; -extern RGLSYMGLVERTEXATTRIB2DARBPROC __rglgen_glVertexAttrib2dARB; -extern RGLSYMGLVERTEXATTRIB2DVARBPROC __rglgen_glVertexAttrib2dvARB; -extern RGLSYMGLVERTEXATTRIB2FARBPROC __rglgen_glVertexAttrib2fARB; -extern RGLSYMGLVERTEXATTRIB2FVARBPROC __rglgen_glVertexAttrib2fvARB; -extern RGLSYMGLVERTEXATTRIB2SARBPROC __rglgen_glVertexAttrib2sARB; -extern RGLSYMGLVERTEXATTRIB2SVARBPROC __rglgen_glVertexAttrib2svARB; -extern RGLSYMGLVERTEXATTRIB3DARBPROC __rglgen_glVertexAttrib3dARB; -extern RGLSYMGLVERTEXATTRIB3DVARBPROC __rglgen_glVertexAttrib3dvARB; -extern RGLSYMGLVERTEXATTRIB3FARBPROC __rglgen_glVertexAttrib3fARB; -extern RGLSYMGLVERTEXATTRIB3FVARBPROC __rglgen_glVertexAttrib3fvARB; -extern RGLSYMGLVERTEXATTRIB3SARBPROC __rglgen_glVertexAttrib3sARB; -extern RGLSYMGLVERTEXATTRIB3SVARBPROC __rglgen_glVertexAttrib3svARB; -extern RGLSYMGLVERTEXATTRIB4NBVARBPROC __rglgen_glVertexAttrib4NbvARB; -extern RGLSYMGLVERTEXATTRIB4NIVARBPROC __rglgen_glVertexAttrib4NivARB; -extern RGLSYMGLVERTEXATTRIB4NSVARBPROC __rglgen_glVertexAttrib4NsvARB; -extern RGLSYMGLVERTEXATTRIB4NUBARBPROC __rglgen_glVertexAttrib4NubARB; -extern RGLSYMGLVERTEXATTRIB4NUBVARBPROC __rglgen_glVertexAttrib4NubvARB; -extern RGLSYMGLVERTEXATTRIB4NUIVARBPROC __rglgen_glVertexAttrib4NuivARB; -extern RGLSYMGLVERTEXATTRIB4NUSVARBPROC __rglgen_glVertexAttrib4NusvARB; -extern RGLSYMGLVERTEXATTRIB4BVARBPROC __rglgen_glVertexAttrib4bvARB; -extern RGLSYMGLVERTEXATTRIB4DARBPROC __rglgen_glVertexAttrib4dARB; -extern RGLSYMGLVERTEXATTRIB4DVARBPROC __rglgen_glVertexAttrib4dvARB; -extern RGLSYMGLVERTEXATTRIB4FARBPROC __rglgen_glVertexAttrib4fARB; -extern RGLSYMGLVERTEXATTRIB4FVARBPROC __rglgen_glVertexAttrib4fvARB; -extern RGLSYMGLVERTEXATTRIB4IVARBPROC __rglgen_glVertexAttrib4ivARB; -extern RGLSYMGLVERTEXATTRIB4SARBPROC __rglgen_glVertexAttrib4sARB; -extern RGLSYMGLVERTEXATTRIB4SVARBPROC __rglgen_glVertexAttrib4svARB; -extern RGLSYMGLVERTEXATTRIB4UBVARBPROC __rglgen_glVertexAttrib4ubvARB; -extern RGLSYMGLVERTEXATTRIB4UIVARBPROC __rglgen_glVertexAttrib4uivARB; -extern RGLSYMGLVERTEXATTRIB4USVARBPROC __rglgen_glVertexAttrib4usvARB; -extern RGLSYMGLVERTEXATTRIBPOINTERARBPROC __rglgen_glVertexAttribPointerARB; -extern RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC __rglgen_glEnableVertexAttribArrayARB; -extern RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC __rglgen_glDisableVertexAttribArrayARB; -extern RGLSYMGLGETVERTEXATTRIBDVARBPROC __rglgen_glGetVertexAttribdvARB; -extern RGLSYMGLGETVERTEXATTRIBFVARBPROC __rglgen_glGetVertexAttribfvARB; -extern RGLSYMGLGETVERTEXATTRIBIVARBPROC __rglgen_glGetVertexAttribivARB; -extern RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC __rglgen_glGetVertexAttribPointervARB; -extern RGLSYMGLBINDATTRIBLOCATIONARBPROC __rglgen_glBindAttribLocationARB; -extern RGLSYMGLGETACTIVEATTRIBARBPROC __rglgen_glGetActiveAttribARB; -extern RGLSYMGLGETATTRIBLOCATIONARBPROC __rglgen_glGetAttribLocationARB; -extern RGLSYMGLWINDOWPOS2DARBPROC __rglgen_glWindowPos2dARB; -extern RGLSYMGLWINDOWPOS2DVARBPROC __rglgen_glWindowPos2dvARB; -extern RGLSYMGLWINDOWPOS2FARBPROC __rglgen_glWindowPos2fARB; -extern RGLSYMGLWINDOWPOS2FVARBPROC __rglgen_glWindowPos2fvARB; -extern RGLSYMGLWINDOWPOS2IARBPROC __rglgen_glWindowPos2iARB; -extern RGLSYMGLWINDOWPOS2IVARBPROC __rglgen_glWindowPos2ivARB; -extern RGLSYMGLWINDOWPOS2SARBPROC __rglgen_glWindowPos2sARB; -extern RGLSYMGLWINDOWPOS2SVARBPROC __rglgen_glWindowPos2svARB; -extern RGLSYMGLWINDOWPOS3DARBPROC __rglgen_glWindowPos3dARB; -extern RGLSYMGLWINDOWPOS3DVARBPROC __rglgen_glWindowPos3dvARB; -extern RGLSYMGLWINDOWPOS3FARBPROC __rglgen_glWindowPos3fARB; -extern RGLSYMGLWINDOWPOS3FVARBPROC __rglgen_glWindowPos3fvARB; -extern RGLSYMGLWINDOWPOS3IARBPROC __rglgen_glWindowPos3iARB; -extern RGLSYMGLWINDOWPOS3IVARBPROC __rglgen_glWindowPos3ivARB; -extern RGLSYMGLWINDOWPOS3SARBPROC __rglgen_glWindowPos3sARB; -extern RGLSYMGLWINDOWPOS3SVARBPROC __rglgen_glWindowPos3svARB; -extern RGLSYMGLMULTITEXCOORD1BOESPROC __rglgen_glMultiTexCoord1bOES; -extern RGLSYMGLMULTITEXCOORD1BVOESPROC __rglgen_glMultiTexCoord1bvOES; -extern RGLSYMGLMULTITEXCOORD2BOESPROC __rglgen_glMultiTexCoord2bOES; -extern RGLSYMGLMULTITEXCOORD2BVOESPROC __rglgen_glMultiTexCoord2bvOES; -extern RGLSYMGLMULTITEXCOORD3BOESPROC __rglgen_glMultiTexCoord3bOES; -extern RGLSYMGLMULTITEXCOORD3BVOESPROC __rglgen_glMultiTexCoord3bvOES; -extern RGLSYMGLMULTITEXCOORD4BOESPROC __rglgen_glMultiTexCoord4bOES; -extern RGLSYMGLMULTITEXCOORD4BVOESPROC __rglgen_glMultiTexCoord4bvOES; -extern RGLSYMGLTEXCOORD1BOESPROC __rglgen_glTexCoord1bOES; -extern RGLSYMGLTEXCOORD1BVOESPROC __rglgen_glTexCoord1bvOES; -extern RGLSYMGLTEXCOORD2BOESPROC __rglgen_glTexCoord2bOES; -extern RGLSYMGLTEXCOORD2BVOESPROC __rglgen_glTexCoord2bvOES; -extern RGLSYMGLTEXCOORD3BOESPROC __rglgen_glTexCoord3bOES; -extern RGLSYMGLTEXCOORD3BVOESPROC __rglgen_glTexCoord3bvOES; -extern RGLSYMGLTEXCOORD4BOESPROC __rglgen_glTexCoord4bOES; -extern RGLSYMGLTEXCOORD4BVOESPROC __rglgen_glTexCoord4bvOES; -extern RGLSYMGLVERTEX2BOESPROC __rglgen_glVertex2bOES; -extern RGLSYMGLVERTEX2BVOESPROC __rglgen_glVertex2bvOES; -extern RGLSYMGLVERTEX3BOESPROC __rglgen_glVertex3bOES; -extern RGLSYMGLVERTEX3BVOESPROC __rglgen_glVertex3bvOES; -extern RGLSYMGLVERTEX4BOESPROC __rglgen_glVertex4bOES; -extern RGLSYMGLVERTEX4BVOESPROC __rglgen_glVertex4bvOES; -extern RGLSYMGLALPHAFUNCXOESPROC __rglgen_glAlphaFuncxOES; -extern RGLSYMGLCLEARCOLORXOESPROC __rglgen_glClearColorxOES; -extern RGLSYMGLCLEARDEPTHXOESPROC __rglgen_glClearDepthxOES; -extern RGLSYMGLCLIPPLANEXOESPROC __rglgen_glClipPlanexOES; -extern RGLSYMGLCOLOR4XOESPROC __rglgen_glColor4xOES; -extern RGLSYMGLDEPTHRANGEXOESPROC __rglgen_glDepthRangexOES; -extern RGLSYMGLFOGXOESPROC __rglgen_glFogxOES; -extern RGLSYMGLFOGXVOESPROC __rglgen_glFogxvOES; -extern RGLSYMGLFRUSTUMXOESPROC __rglgen_glFrustumxOES; -extern RGLSYMGLGETCLIPPLANEXOESPROC __rglgen_glGetClipPlanexOES; -extern RGLSYMGLGETFIXEDVOESPROC __rglgen_glGetFixedvOES; -extern RGLSYMGLGETTEXENVXVOESPROC __rglgen_glGetTexEnvxvOES; -extern RGLSYMGLGETTEXPARAMETERXVOESPROC __rglgen_glGetTexParameterxvOES; -extern RGLSYMGLLIGHTMODELXOESPROC __rglgen_glLightModelxOES; -extern RGLSYMGLLIGHTMODELXVOESPROC __rglgen_glLightModelxvOES; -extern RGLSYMGLLIGHTXOESPROC __rglgen_glLightxOES; -extern RGLSYMGLLIGHTXVOESPROC __rglgen_glLightxvOES; -extern RGLSYMGLLINEWIDTHXOESPROC __rglgen_glLineWidthxOES; -extern RGLSYMGLLOADMATRIXXOESPROC __rglgen_glLoadMatrixxOES; -extern RGLSYMGLMATERIALXOESPROC __rglgen_glMaterialxOES; -extern RGLSYMGLMATERIALXVOESPROC __rglgen_glMaterialxvOES; -extern RGLSYMGLMULTMATRIXXOESPROC __rglgen_glMultMatrixxOES; -extern RGLSYMGLMULTITEXCOORD4XOESPROC __rglgen_glMultiTexCoord4xOES; -extern RGLSYMGLNORMAL3XOESPROC __rglgen_glNormal3xOES; -extern RGLSYMGLORTHOXOESPROC __rglgen_glOrthoxOES; -extern RGLSYMGLPOINTPARAMETERXVOESPROC __rglgen_glPointParameterxvOES; -extern RGLSYMGLPOINTSIZEXOESPROC __rglgen_glPointSizexOES; -extern RGLSYMGLPOLYGONOFFSETXOESPROC __rglgen_glPolygonOffsetxOES; -extern RGLSYMGLROTATEXOESPROC __rglgen_glRotatexOES; -extern RGLSYMGLSAMPLECOVERAGEOESPROC __rglgen_glSampleCoverageOES; -extern RGLSYMGLSCALEXOESPROC __rglgen_glScalexOES; -extern RGLSYMGLTEXENVXOESPROC __rglgen_glTexEnvxOES; -extern RGLSYMGLTEXENVXVOESPROC __rglgen_glTexEnvxvOES; -extern RGLSYMGLTEXPARAMETERXOESPROC __rglgen_glTexParameterxOES; -extern RGLSYMGLTEXPARAMETERXVOESPROC __rglgen_glTexParameterxvOES; -extern RGLSYMGLTRANSLATEXOESPROC __rglgen_glTranslatexOES; -extern RGLSYMGLACCUMXOESPROC __rglgen_glAccumxOES; -extern RGLSYMGLBITMAPXOESPROC __rglgen_glBitmapxOES; -extern RGLSYMGLBLENDCOLORXOESPROC __rglgen_glBlendColorxOES; -extern RGLSYMGLCLEARACCUMXOESPROC __rglgen_glClearAccumxOES; -extern RGLSYMGLCOLOR3XOESPROC __rglgen_glColor3xOES; -extern RGLSYMGLCOLOR3XVOESPROC __rglgen_glColor3xvOES; -extern RGLSYMGLCOLOR4XVOESPROC __rglgen_glColor4xvOES; -extern RGLSYMGLCONVOLUTIONPARAMETERXOESPROC __rglgen_glConvolutionParameterxOES; -extern RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC __rglgen_glConvolutionParameterxvOES; -extern RGLSYMGLEVALCOORD1XOESPROC __rglgen_glEvalCoord1xOES; -extern RGLSYMGLEVALCOORD1XVOESPROC __rglgen_glEvalCoord1xvOES; -extern RGLSYMGLEVALCOORD2XOESPROC __rglgen_glEvalCoord2xOES; -extern RGLSYMGLEVALCOORD2XVOESPROC __rglgen_glEvalCoord2xvOES; -extern RGLSYMGLFEEDBACKBUFFERXOESPROC __rglgen_glFeedbackBufferxOES; -extern RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC __rglgen_glGetConvolutionParameterxvOES; -extern RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC __rglgen_glGetHistogramParameterxvOES; -extern RGLSYMGLGETLIGHTXOESPROC __rglgen_glGetLightxOES; -extern RGLSYMGLGETMAPXVOESPROC __rglgen_glGetMapxvOES; -extern RGLSYMGLGETMATERIALXOESPROC __rglgen_glGetMaterialxOES; -extern RGLSYMGLGETPIXELMAPXVPROC __rglgen_glGetPixelMapxv; -extern RGLSYMGLGETTEXGENXVOESPROC __rglgen_glGetTexGenxvOES; -extern RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC __rglgen_glGetTexLevelParameterxvOES; -extern RGLSYMGLINDEXXOESPROC __rglgen_glIndexxOES; -extern RGLSYMGLINDEXXVOESPROC __rglgen_glIndexxvOES; -extern RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC __rglgen_glLoadTransposeMatrixxOES; -extern RGLSYMGLMAP1XOESPROC __rglgen_glMap1xOES; -extern RGLSYMGLMAP2XOESPROC __rglgen_glMap2xOES; -extern RGLSYMGLMAPGRID1XOESPROC __rglgen_glMapGrid1xOES; -extern RGLSYMGLMAPGRID2XOESPROC __rglgen_glMapGrid2xOES; -extern RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC __rglgen_glMultTransposeMatrixxOES; -extern RGLSYMGLMULTITEXCOORD1XOESPROC __rglgen_glMultiTexCoord1xOES; -extern RGLSYMGLMULTITEXCOORD1XVOESPROC __rglgen_glMultiTexCoord1xvOES; -extern RGLSYMGLMULTITEXCOORD2XOESPROC __rglgen_glMultiTexCoord2xOES; -extern RGLSYMGLMULTITEXCOORD2XVOESPROC __rglgen_glMultiTexCoord2xvOES; -extern RGLSYMGLMULTITEXCOORD3XOESPROC __rglgen_glMultiTexCoord3xOES; -extern RGLSYMGLMULTITEXCOORD3XVOESPROC __rglgen_glMultiTexCoord3xvOES; -extern RGLSYMGLMULTITEXCOORD4XVOESPROC __rglgen_glMultiTexCoord4xvOES; -extern RGLSYMGLNORMAL3XVOESPROC __rglgen_glNormal3xvOES; -extern RGLSYMGLPASSTHROUGHXOESPROC __rglgen_glPassThroughxOES; -extern RGLSYMGLPIXELMAPXPROC __rglgen_glPixelMapx; -extern RGLSYMGLPIXELSTOREXPROC __rglgen_glPixelStorex; -extern RGLSYMGLPIXELTRANSFERXOESPROC __rglgen_glPixelTransferxOES; -extern RGLSYMGLPIXELZOOMXOESPROC __rglgen_glPixelZoomxOES; -extern RGLSYMGLPRIORITIZETEXTURESXOESPROC __rglgen_glPrioritizeTexturesxOES; -extern RGLSYMGLRASTERPOS2XOESPROC __rglgen_glRasterPos2xOES; -extern RGLSYMGLRASTERPOS2XVOESPROC __rglgen_glRasterPos2xvOES; -extern RGLSYMGLRASTERPOS3XOESPROC __rglgen_glRasterPos3xOES; -extern RGLSYMGLRASTERPOS3XVOESPROC __rglgen_glRasterPos3xvOES; -extern RGLSYMGLRASTERPOS4XOESPROC __rglgen_glRasterPos4xOES; -extern RGLSYMGLRASTERPOS4XVOESPROC __rglgen_glRasterPos4xvOES; -extern RGLSYMGLRECTXOESPROC __rglgen_glRectxOES; -extern RGLSYMGLRECTXVOESPROC __rglgen_glRectxvOES; -extern RGLSYMGLTEXCOORD1XOESPROC __rglgen_glTexCoord1xOES; -extern RGLSYMGLTEXCOORD1XVOESPROC __rglgen_glTexCoord1xvOES; -extern RGLSYMGLTEXCOORD2XOESPROC __rglgen_glTexCoord2xOES; -extern RGLSYMGLTEXCOORD2XVOESPROC __rglgen_glTexCoord2xvOES; -extern RGLSYMGLTEXCOORD3XOESPROC __rglgen_glTexCoord3xOES; -extern RGLSYMGLTEXCOORD3XVOESPROC __rglgen_glTexCoord3xvOES; -extern RGLSYMGLTEXCOORD4XOESPROC __rglgen_glTexCoord4xOES; -extern RGLSYMGLTEXCOORD4XVOESPROC __rglgen_glTexCoord4xvOES; -extern RGLSYMGLTEXGENXOESPROC __rglgen_glTexGenxOES; -extern RGLSYMGLTEXGENXVOESPROC __rglgen_glTexGenxvOES; -extern RGLSYMGLVERTEX2XOESPROC __rglgen_glVertex2xOES; -extern RGLSYMGLVERTEX2XVOESPROC __rglgen_glVertex2xvOES; -extern RGLSYMGLVERTEX3XOESPROC __rglgen_glVertex3xOES; -extern RGLSYMGLVERTEX3XVOESPROC __rglgen_glVertex3xvOES; -extern RGLSYMGLVERTEX4XOESPROC __rglgen_glVertex4xOES; -extern RGLSYMGLVERTEX4XVOESPROC __rglgen_glVertex4xvOES; -extern RGLSYMGLQUERYMATRIXXOESPROC __rglgen_glQueryMatrixxOES; -extern RGLSYMGLCLEARDEPTHFOESPROC __rglgen_glClearDepthfOES; -extern RGLSYMGLCLIPPLANEFOESPROC __rglgen_glClipPlanefOES; -extern RGLSYMGLDEPTHRANGEFOESPROC __rglgen_glDepthRangefOES; -extern RGLSYMGLFRUSTUMFOESPROC __rglgen_glFrustumfOES; -extern RGLSYMGLGETCLIPPLANEFOESPROC __rglgen_glGetClipPlanefOES; -extern RGLSYMGLORTHOFOESPROC __rglgen_glOrthofOES; -extern RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC __rglgen_glImageTransformParameteriHP; -extern RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC __rglgen_glImageTransformParameterfHP; -extern RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glImageTransformParameterivHP; -extern RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glImageTransformParameterfvHP; -extern RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glGetImageTransformParameterivHP; -extern RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glGetImageTransformParameterfvHP; +extern RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +extern RGLSYMGLMAXSHADERCOMPILERTHREADSKHRPROC __rglgen_glMaxShaderCompilerThreadsKHR; +extern RGLSYMGLEGLIMAGETARGETTEXSTORAGEEXTPROC __rglgen_glEGLImageTargetTexStorageEXT; +extern RGLSYMGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC __rglgen_glEGLImageTargetTextureStorageEXT; +extern RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +extern RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +extern RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +extern RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +extern RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +extern RGLSYMGLMATRIXLOADFEXTPROC __rglgen_glMatrixLoadfEXT; +extern RGLSYMGLMATRIXLOADDEXTPROC __rglgen_glMatrixLoaddEXT; +extern RGLSYMGLMATRIXMULTFEXTPROC __rglgen_glMatrixMultfEXT; +extern RGLSYMGLMATRIXMULTDEXTPROC __rglgen_glMatrixMultdEXT; +extern RGLSYMGLMATRIXLOADIDENTITYEXTPROC __rglgen_glMatrixLoadIdentityEXT; +extern RGLSYMGLMATRIXROTATEFEXTPROC __rglgen_glMatrixRotatefEXT; +extern RGLSYMGLMATRIXROTATEDEXTPROC __rglgen_glMatrixRotatedEXT; +extern RGLSYMGLMATRIXSCALEFEXTPROC __rglgen_glMatrixScalefEXT; +extern RGLSYMGLMATRIXSCALEDEXTPROC __rglgen_glMatrixScaledEXT; +extern RGLSYMGLMATRIXTRANSLATEFEXTPROC __rglgen_glMatrixTranslatefEXT; +extern RGLSYMGLMATRIXTRANSLATEDEXTPROC __rglgen_glMatrixTranslatedEXT; +extern RGLSYMGLMATRIXFRUSTUMEXTPROC __rglgen_glMatrixFrustumEXT; +extern RGLSYMGLMATRIXORTHOEXTPROC __rglgen_glMatrixOrthoEXT; +extern RGLSYMGLMATRIXPOPEXTPROC __rglgen_glMatrixPopEXT; +extern RGLSYMGLMATRIXPUSHEXTPROC __rglgen_glMatrixPushEXT; +extern RGLSYMGLCLIENTATTRIBDEFAULTEXTPROC __rglgen_glClientAttribDefaultEXT; +extern RGLSYMGLPUSHCLIENTATTRIBDEFAULTEXTPROC __rglgen_glPushClientAttribDefaultEXT; +extern RGLSYMGLTEXTUREPARAMETERFEXTPROC __rglgen_glTextureParameterfEXT; +extern RGLSYMGLTEXTUREPARAMETERFVEXTPROC __rglgen_glTextureParameterfvEXT; +extern RGLSYMGLTEXTUREPARAMETERIEXTPROC __rglgen_glTextureParameteriEXT; +extern RGLSYMGLTEXTUREPARAMETERIVEXTPROC __rglgen_glTextureParameterivEXT; +extern RGLSYMGLTEXTUREIMAGE1DEXTPROC __rglgen_glTextureImage1DEXT; +extern RGLSYMGLTEXTUREIMAGE2DEXTPROC __rglgen_glTextureImage2DEXT; +extern RGLSYMGLTEXTURESUBIMAGE1DEXTPROC __rglgen_glTextureSubImage1DEXT; +extern RGLSYMGLTEXTURESUBIMAGE2DEXTPROC __rglgen_glTextureSubImage2DEXT; +extern RGLSYMGLCOPYTEXTUREIMAGE1DEXTPROC __rglgen_glCopyTextureImage1DEXT; +extern RGLSYMGLCOPYTEXTUREIMAGE2DEXTPROC __rglgen_glCopyTextureImage2DEXT; +extern RGLSYMGLCOPYTEXTURESUBIMAGE1DEXTPROC __rglgen_glCopyTextureSubImage1DEXT; +extern RGLSYMGLCOPYTEXTURESUBIMAGE2DEXTPROC __rglgen_glCopyTextureSubImage2DEXT; +extern RGLSYMGLGETTEXTUREIMAGEEXTPROC __rglgen_glGetTextureImageEXT; +extern RGLSYMGLGETTEXTUREPARAMETERFVEXTPROC __rglgen_glGetTextureParameterfvEXT; +extern RGLSYMGLGETTEXTUREPARAMETERIVEXTPROC __rglgen_glGetTextureParameterivEXT; +extern RGLSYMGLGETTEXTURELEVELPARAMETERFVEXTPROC __rglgen_glGetTextureLevelParameterfvEXT; +extern RGLSYMGLGETTEXTURELEVELPARAMETERIVEXTPROC __rglgen_glGetTextureLevelParameterivEXT; +extern RGLSYMGLTEXTUREIMAGE3DEXTPROC __rglgen_glTextureImage3DEXT; +extern RGLSYMGLTEXTURESUBIMAGE3DEXTPROC __rglgen_glTextureSubImage3DEXT; +extern RGLSYMGLCOPYTEXTURESUBIMAGE3DEXTPROC __rglgen_glCopyTextureSubImage3DEXT; +extern RGLSYMGLBINDMULTITEXTUREEXTPROC __rglgen_glBindMultiTextureEXT; +extern RGLSYMGLMULTITEXCOORDPOINTEREXTPROC __rglgen_glMultiTexCoordPointerEXT; +extern RGLSYMGLMULTITEXENVFEXTPROC __rglgen_glMultiTexEnvfEXT; +extern RGLSYMGLMULTITEXENVFVEXTPROC __rglgen_glMultiTexEnvfvEXT; +extern RGLSYMGLMULTITEXENVIEXTPROC __rglgen_glMultiTexEnviEXT; +extern RGLSYMGLMULTITEXENVIVEXTPROC __rglgen_glMultiTexEnvivEXT; +extern RGLSYMGLMULTITEXGENDEXTPROC __rglgen_glMultiTexGendEXT; +extern RGLSYMGLMULTITEXGENDVEXTPROC __rglgen_glMultiTexGendvEXT; +extern RGLSYMGLMULTITEXGENFEXTPROC __rglgen_glMultiTexGenfEXT; +extern RGLSYMGLMULTITEXGENFVEXTPROC __rglgen_glMultiTexGenfvEXT; +extern RGLSYMGLMULTITEXGENIEXTPROC __rglgen_glMultiTexGeniEXT; +extern RGLSYMGLMULTITEXGENIVEXTPROC __rglgen_glMultiTexGenivEXT; +extern RGLSYMGLGETMULTITEXENVFVEXTPROC __rglgen_glGetMultiTexEnvfvEXT; +extern RGLSYMGLGETMULTITEXENVIVEXTPROC __rglgen_glGetMultiTexEnvivEXT; +extern RGLSYMGLGETMULTITEXGENDVEXTPROC __rglgen_glGetMultiTexGendvEXT; +extern RGLSYMGLGETMULTITEXGENFVEXTPROC __rglgen_glGetMultiTexGenfvEXT; +extern RGLSYMGLGETMULTITEXGENIVEXTPROC __rglgen_glGetMultiTexGenivEXT; +extern RGLSYMGLMULTITEXPARAMETERIEXTPROC __rglgen_glMultiTexParameteriEXT; +extern RGLSYMGLMULTITEXPARAMETERIVEXTPROC __rglgen_glMultiTexParameterivEXT; +extern RGLSYMGLMULTITEXPARAMETERFEXTPROC __rglgen_glMultiTexParameterfEXT; +extern RGLSYMGLMULTITEXPARAMETERFVEXTPROC __rglgen_glMultiTexParameterfvEXT; +extern RGLSYMGLMULTITEXIMAGE1DEXTPROC __rglgen_glMultiTexImage1DEXT; +extern RGLSYMGLMULTITEXIMAGE2DEXTPROC __rglgen_glMultiTexImage2DEXT; +extern RGLSYMGLMULTITEXSUBIMAGE1DEXTPROC __rglgen_glMultiTexSubImage1DEXT; +extern RGLSYMGLMULTITEXSUBIMAGE2DEXTPROC __rglgen_glMultiTexSubImage2DEXT; +extern RGLSYMGLCOPYMULTITEXIMAGE1DEXTPROC __rglgen_glCopyMultiTexImage1DEXT; +extern RGLSYMGLCOPYMULTITEXIMAGE2DEXTPROC __rglgen_glCopyMultiTexImage2DEXT; +extern RGLSYMGLCOPYMULTITEXSUBIMAGE1DEXTPROC __rglgen_glCopyMultiTexSubImage1DEXT; +extern RGLSYMGLCOPYMULTITEXSUBIMAGE2DEXTPROC __rglgen_glCopyMultiTexSubImage2DEXT; +extern RGLSYMGLGETMULTITEXIMAGEEXTPROC __rglgen_glGetMultiTexImageEXT; +extern RGLSYMGLGETMULTITEXPARAMETERFVEXTPROC __rglgen_glGetMultiTexParameterfvEXT; +extern RGLSYMGLGETMULTITEXPARAMETERIVEXTPROC __rglgen_glGetMultiTexParameterivEXT; +extern RGLSYMGLGETMULTITEXLEVELPARAMETERFVEXTPROC __rglgen_glGetMultiTexLevelParameterfvEXT; +extern RGLSYMGLGETMULTITEXLEVELPARAMETERIVEXTPROC __rglgen_glGetMultiTexLevelParameterivEXT; +extern RGLSYMGLMULTITEXIMAGE3DEXTPROC __rglgen_glMultiTexImage3DEXT; +extern RGLSYMGLMULTITEXSUBIMAGE3DEXTPROC __rglgen_glMultiTexSubImage3DEXT; +extern RGLSYMGLCOPYMULTITEXSUBIMAGE3DEXTPROC __rglgen_glCopyMultiTexSubImage3DEXT; +extern RGLSYMGLENABLECLIENTSTATEINDEXEDEXTPROC __rglgen_glEnableClientStateIndexedEXT; +extern RGLSYMGLDISABLECLIENTSTATEINDEXEDEXTPROC __rglgen_glDisableClientStateIndexedEXT; +extern RGLSYMGLGETFLOATINDEXEDVEXTPROC __rglgen_glGetFloatIndexedvEXT; +extern RGLSYMGLGETDOUBLEINDEXEDVEXTPROC __rglgen_glGetDoubleIndexedvEXT; +extern RGLSYMGLGETPOINTERINDEXEDVEXTPROC __rglgen_glGetPointerIndexedvEXT; +extern RGLSYMGLENABLEINDEXEDEXTPROC __rglgen_glEnableIndexedEXT; +extern RGLSYMGLDISABLEINDEXEDEXTPROC __rglgen_glDisableIndexedEXT; +extern RGLSYMGLISENABLEDINDEXEDEXTPROC __rglgen_glIsEnabledIndexedEXT; +extern RGLSYMGLGETINTEGERINDEXEDVEXTPROC __rglgen_glGetIntegerIndexedvEXT; +extern RGLSYMGLGETBOOLEANINDEXEDVEXTPROC __rglgen_glGetBooleanIndexedvEXT; +extern RGLSYMGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __rglgen_glCompressedTextureImage3DEXT; +extern RGLSYMGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __rglgen_glCompressedTextureImage2DEXT; +extern RGLSYMGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __rglgen_glCompressedTextureImage1DEXT; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __rglgen_glCompressedTextureSubImage3DEXT; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __rglgen_glCompressedTextureSubImage2DEXT; +extern RGLSYMGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __rglgen_glCompressedTextureSubImage1DEXT; +extern RGLSYMGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __rglgen_glGetCompressedTextureImageEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __rglgen_glCompressedMultiTexImage3DEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __rglgen_glCompressedMultiTexImage2DEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __rglgen_glCompressedMultiTexImage1DEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __rglgen_glCompressedMultiTexSubImage3DEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __rglgen_glCompressedMultiTexSubImage2DEXT; +extern RGLSYMGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __rglgen_glCompressedMultiTexSubImage1DEXT; +extern RGLSYMGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __rglgen_glGetCompressedMultiTexImageEXT; +extern RGLSYMGLMATRIXLOADTRANSPOSEFEXTPROC __rglgen_glMatrixLoadTransposefEXT; +extern RGLSYMGLMATRIXLOADTRANSPOSEDEXTPROC __rglgen_glMatrixLoadTransposedEXT; +extern RGLSYMGLMATRIXMULTTRANSPOSEFEXTPROC __rglgen_glMatrixMultTransposefEXT; +extern RGLSYMGLMATRIXMULTTRANSPOSEDEXTPROC __rglgen_glMatrixMultTransposedEXT; +extern RGLSYMGLNAMEDBUFFERDATAEXTPROC __rglgen_glNamedBufferDataEXT; +extern RGLSYMGLNAMEDBUFFERSUBDATAEXTPROC __rglgen_glNamedBufferSubDataEXT; +extern RGLSYMGLMAPNAMEDBUFFEREXTPROC __rglgen_glMapNamedBufferEXT; +extern RGLSYMGLUNMAPNAMEDBUFFEREXTPROC __rglgen_glUnmapNamedBufferEXT; +extern RGLSYMGLGETNAMEDBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedBufferParameterivEXT; +extern RGLSYMGLGETNAMEDBUFFERPOINTERVEXTPROC __rglgen_glGetNamedBufferPointervEXT; +extern RGLSYMGLGETNAMEDBUFFERSUBDATAEXTPROC __rglgen_glGetNamedBufferSubDataEXT; +extern RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +extern RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +extern RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +extern RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +extern RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +extern RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +extern RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +extern RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +extern RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +extern RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +extern RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +extern RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +extern RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +extern RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +extern RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +extern RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +extern RGLSYMGLTEXTUREBUFFEREXTPROC __rglgen_glTextureBufferEXT; +extern RGLSYMGLMULTITEXBUFFEREXTPROC __rglgen_glMultiTexBufferEXT; +extern RGLSYMGLTEXTUREPARAMETERIIVEXTPROC __rglgen_glTextureParameterIivEXT; +extern RGLSYMGLTEXTUREPARAMETERIUIVEXTPROC __rglgen_glTextureParameterIuivEXT; +extern RGLSYMGLGETTEXTUREPARAMETERIIVEXTPROC __rglgen_glGetTextureParameterIivEXT; +extern RGLSYMGLGETTEXTUREPARAMETERIUIVEXTPROC __rglgen_glGetTextureParameterIuivEXT; +extern RGLSYMGLMULTITEXPARAMETERIIVEXTPROC __rglgen_glMultiTexParameterIivEXT; +extern RGLSYMGLMULTITEXPARAMETERIUIVEXTPROC __rglgen_glMultiTexParameterIuivEXT; +extern RGLSYMGLGETMULTITEXPARAMETERIIVEXTPROC __rglgen_glGetMultiTexParameterIivEXT; +extern RGLSYMGLGETMULTITEXPARAMETERIUIVEXTPROC __rglgen_glGetMultiTexParameterIuivEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __rglgen_glNamedProgramLocalParameters4fvEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __rglgen_glNamedProgramLocalParameterI4iEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __rglgen_glNamedProgramLocalParameterI4ivEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __rglgen_glNamedProgramLocalParametersI4ivEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __rglgen_glNamedProgramLocalParameterI4uiEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __rglgen_glNamedProgramLocalParameterI4uivEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __rglgen_glNamedProgramLocalParametersI4uivEXT; +extern RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __rglgen_glGetNamedProgramLocalParameterIivEXT; +extern RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __rglgen_glGetNamedProgramLocalParameterIuivEXT; +extern RGLSYMGLENABLECLIENTSTATEIEXTPROC __rglgen_glEnableClientStateiEXT; +extern RGLSYMGLDISABLECLIENTSTATEIEXTPROC __rglgen_glDisableClientStateiEXT; +extern RGLSYMGLGETFLOATI_VEXTPROC __rglgen_glGetFloati_vEXT; +extern RGLSYMGLGETDOUBLEI_VEXTPROC __rglgen_glGetDoublei_vEXT; +extern RGLSYMGLGETPOINTERI_VEXTPROC __rglgen_glGetPointeri_vEXT; +extern RGLSYMGLNAMEDPROGRAMSTRINGEXTPROC __rglgen_glNamedProgramStringEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __rglgen_glNamedProgramLocalParameter4dEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __rglgen_glNamedProgramLocalParameter4dvEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __rglgen_glNamedProgramLocalParameter4fEXT; +extern RGLSYMGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __rglgen_glNamedProgramLocalParameter4fvEXT; +extern RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __rglgen_glGetNamedProgramLocalParameterdvEXT; +extern RGLSYMGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __rglgen_glGetNamedProgramLocalParameterfvEXT; +extern RGLSYMGLGETNAMEDPROGRAMIVEXTPROC __rglgen_glGetNamedProgramivEXT; +extern RGLSYMGLGETNAMEDPROGRAMSTRINGEXTPROC __rglgen_glGetNamedProgramStringEXT; +extern RGLSYMGLNAMEDRENDERBUFFERSTORAGEEXTPROC __rglgen_glNamedRenderbufferStorageEXT; +extern RGLSYMGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedRenderbufferParameterivEXT; +extern RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glNamedRenderbufferStorageMultisampleEXT; +extern RGLSYMGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __rglgen_glNamedRenderbufferStorageMultisampleCoverageEXT; +extern RGLSYMGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __rglgen_glCheckNamedFramebufferStatusEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __rglgen_glNamedFramebufferTexture1DEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __rglgen_glNamedFramebufferTexture2DEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __rglgen_glNamedFramebufferTexture3DEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __rglgen_glNamedFramebufferRenderbufferEXT; +extern RGLSYMGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __rglgen_glGetNamedFramebufferAttachmentParameterivEXT; +extern RGLSYMGLGENERATETEXTUREMIPMAPEXTPROC __rglgen_glGenerateTextureMipmapEXT; +extern RGLSYMGLGENERATEMULTITEXMIPMAPEXTPROC __rglgen_glGenerateMultiTexMipmapEXT; +extern RGLSYMGLFRAMEBUFFERDRAWBUFFEREXTPROC __rglgen_glFramebufferDrawBufferEXT; +extern RGLSYMGLFRAMEBUFFERDRAWBUFFERSEXTPROC __rglgen_glFramebufferDrawBuffersEXT; +extern RGLSYMGLFRAMEBUFFERREADBUFFEREXTPROC __rglgen_glFramebufferReadBufferEXT; +extern RGLSYMGLGETFRAMEBUFFERPARAMETERIVEXTPROC __rglgen_glGetFramebufferParameterivEXT; +extern RGLSYMGLNAMEDCOPYBUFFERSUBDATAEXTPROC __rglgen_glNamedCopyBufferSubDataEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __rglgen_glNamedFramebufferTextureEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __rglgen_glNamedFramebufferTextureLayerEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __rglgen_glNamedFramebufferTextureFaceEXT; +extern RGLSYMGLTEXTURERENDERBUFFEREXTPROC __rglgen_glTextureRenderbufferEXT; +extern RGLSYMGLMULTITEXRENDERBUFFEREXTPROC __rglgen_glMultiTexRenderbufferEXT; +extern RGLSYMGLVERTEXARRAYVERTEXOFFSETEXTPROC __rglgen_glVertexArrayVertexOffsetEXT; +extern RGLSYMGLVERTEXARRAYCOLOROFFSETEXTPROC __rglgen_glVertexArrayColorOffsetEXT; +extern RGLSYMGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __rglgen_glVertexArrayEdgeFlagOffsetEXT; +extern RGLSYMGLVERTEXARRAYINDEXOFFSETEXTPROC __rglgen_glVertexArrayIndexOffsetEXT; +extern RGLSYMGLVERTEXARRAYNORMALOFFSETEXTPROC __rglgen_glVertexArrayNormalOffsetEXT; +extern RGLSYMGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __rglgen_glVertexArrayTexCoordOffsetEXT; +extern RGLSYMGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __rglgen_glVertexArrayMultiTexCoordOffsetEXT; +extern RGLSYMGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __rglgen_glVertexArrayFogCoordOffsetEXT; +extern RGLSYMGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __rglgen_glVertexArraySecondaryColorOffsetEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribOffsetEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribIOffsetEXT; +extern RGLSYMGLENABLEVERTEXARRAYEXTPROC __rglgen_glEnableVertexArrayEXT; +extern RGLSYMGLDISABLEVERTEXARRAYEXTPROC __rglgen_glDisableVertexArrayEXT; +extern RGLSYMGLENABLEVERTEXARRAYATTRIBEXTPROC __rglgen_glEnableVertexArrayAttribEXT; +extern RGLSYMGLDISABLEVERTEXARRAYATTRIBEXTPROC __rglgen_glDisableVertexArrayAttribEXT; +extern RGLSYMGLGETVERTEXARRAYINTEGERVEXTPROC __rglgen_glGetVertexArrayIntegervEXT; +extern RGLSYMGLGETVERTEXARRAYPOINTERVEXTPROC __rglgen_glGetVertexArrayPointervEXT; +extern RGLSYMGLGETVERTEXARRAYINTEGERI_VEXTPROC __rglgen_glGetVertexArrayIntegeri_vEXT; +extern RGLSYMGLGETVERTEXARRAYPOINTERI_VEXTPROC __rglgen_glGetVertexArrayPointeri_vEXT; +extern RGLSYMGLMAPNAMEDBUFFERRANGEEXTPROC __rglgen_glMapNamedBufferRangeEXT; +extern RGLSYMGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedNamedBufferRangeEXT; +extern RGLSYMGLNAMEDBUFFERSTORAGEEXTPROC __rglgen_glNamedBufferStorageEXT; +extern RGLSYMGLCLEARNAMEDBUFFERDATAEXTPROC __rglgen_glClearNamedBufferDataEXT; +extern RGLSYMGLCLEARNAMEDBUFFERSUBDATAEXTPROC __rglgen_glClearNamedBufferSubDataEXT; +extern RGLSYMGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __rglgen_glNamedFramebufferParameteriEXT; +extern RGLSYMGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __rglgen_glGetNamedFramebufferParameterivEXT; +extern RGLSYMGLPROGRAMUNIFORM1DEXTPROC __rglgen_glProgramUniform1dEXT; +extern RGLSYMGLPROGRAMUNIFORM2DEXTPROC __rglgen_glProgramUniform2dEXT; +extern RGLSYMGLPROGRAMUNIFORM3DEXTPROC __rglgen_glProgramUniform3dEXT; +extern RGLSYMGLPROGRAMUNIFORM4DEXTPROC __rglgen_glProgramUniform4dEXT; +extern RGLSYMGLPROGRAMUNIFORM1DVEXTPROC __rglgen_glProgramUniform1dvEXT; +extern RGLSYMGLPROGRAMUNIFORM2DVEXTPROC __rglgen_glProgramUniform2dvEXT; +extern RGLSYMGLPROGRAMUNIFORM3DVEXTPROC __rglgen_glProgramUniform3dvEXT; +extern RGLSYMGLPROGRAMUNIFORM4DVEXTPROC __rglgen_glProgramUniform4dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2DVEXTPROC __rglgen_glProgramUniformMatrix2dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3DVEXTPROC __rglgen_glProgramUniformMatrix3dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4DVEXTPROC __rglgen_glProgramUniformMatrix4dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __rglgen_glProgramUniformMatrix2x3dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __rglgen_glProgramUniformMatrix2x4dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __rglgen_glProgramUniformMatrix3x2dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __rglgen_glProgramUniformMatrix3x4dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __rglgen_glProgramUniformMatrix4x2dvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __rglgen_glProgramUniformMatrix4x3dvEXT; +extern RGLSYMGLTEXTUREBUFFERRANGEEXTPROC __rglgen_glTextureBufferRangeEXT; +extern RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +extern RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +extern RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +extern RGLSYMGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __rglgen_glTextureStorage2DMultisampleEXT; +extern RGLSYMGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __rglgen_glTextureStorage3DMultisampleEXT; +extern RGLSYMGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __rglgen_glVertexArrayBindVertexBufferEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __rglgen_glVertexArrayVertexAttribFormatEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __rglgen_glVertexArrayVertexAttribIFormatEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __rglgen_glVertexArrayVertexAttribLFormatEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __rglgen_glVertexArrayVertexAttribBindingEXT; +extern RGLSYMGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __rglgen_glVertexArrayVertexBindingDivisorEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __rglgen_glVertexArrayVertexAttribLOffsetEXT; +extern RGLSYMGLTEXTUREPAGECOMMITMENTEXTPROC __rglgen_glTexturePageCommitmentEXT; +extern RGLSYMGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexArrayVertexAttribDivisorEXT; +extern RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +extern RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +extern RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +extern RGLSYMGLUSESHADERPROGRAMEXTPROC __rglgen_glUseShaderProgramEXT; +extern RGLSYMGLACTIVEPROGRAMEXTPROC __rglgen_glActiveProgramEXT; +extern RGLSYMGLCREATESHADERPROGRAMEXTPROC __rglgen_glCreateShaderProgramEXT; +extern RGLSYMGLFRAMEBUFFERFETCHBARRIEREXTPROC __rglgen_glFramebufferFetchBarrierEXT; +extern RGLSYMGLWINDOWRECTANGLESEXTPROC __rglgen_glWindowRectanglesEXT; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __rglgen_glMultiDrawArraysIndirectBindlessNV; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __rglgen_glMultiDrawElementsIndirectBindlessNV; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __rglgen_glMultiDrawArraysIndirectBindlessCountNV; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __rglgen_glMultiDrawElementsIndirectBindlessCountNV; +extern RGLSYMGLGETTEXTUREHANDLENVPROC __rglgen_glGetTextureHandleNV; +extern RGLSYMGLGETTEXTURESAMPLERHANDLENVPROC __rglgen_glGetTextureSamplerHandleNV; +extern RGLSYMGLMAKETEXTUREHANDLERESIDENTNVPROC __rglgen_glMakeTextureHandleResidentNV; +extern RGLSYMGLMAKETEXTUREHANDLENONRESIDENTNVPROC __rglgen_glMakeTextureHandleNonResidentNV; +extern RGLSYMGLGETIMAGEHANDLENVPROC __rglgen_glGetImageHandleNV; +extern RGLSYMGLMAKEIMAGEHANDLERESIDENTNVPROC __rglgen_glMakeImageHandleResidentNV; +extern RGLSYMGLMAKEIMAGEHANDLENONRESIDENTNVPROC __rglgen_glMakeImageHandleNonResidentNV; +extern RGLSYMGLUNIFORMHANDLEUI64NVPROC __rglgen_glUniformHandleui64NV; +extern RGLSYMGLUNIFORMHANDLEUI64VNVPROC __rglgen_glUniformHandleui64vNV; +extern RGLSYMGLPROGRAMUNIFORMHANDLEUI64NVPROC __rglgen_glProgramUniformHandleui64NV; +extern RGLSYMGLPROGRAMUNIFORMHANDLEUI64VNVPROC __rglgen_glProgramUniformHandleui64vNV; +extern RGLSYMGLISTEXTUREHANDLERESIDENTNVPROC __rglgen_glIsTextureHandleResidentNV; +extern RGLSYMGLISIMAGEHANDLERESIDENTNVPROC __rglgen_glIsImageHandleResidentNV; +extern RGLSYMGLBLENDPARAMETERINVPROC __rglgen_glBlendParameteriNV; +extern RGLSYMGLBLENDBARRIERNVPROC __rglgen_glBlendBarrierNV; +extern RGLSYMGLVIEWPORTPOSITIONWSCALENVPROC __rglgen_glViewportPositionWScaleNV; +extern RGLSYMGLCREATESTATESNVPROC __rglgen_glCreateStatesNV; +extern RGLSYMGLDELETESTATESNVPROC __rglgen_glDeleteStatesNV; +extern RGLSYMGLISSTATENVPROC __rglgen_glIsStateNV; +extern RGLSYMGLSTATECAPTURENVPROC __rglgen_glStateCaptureNV; +extern RGLSYMGLGETCOMMANDHEADERNVPROC __rglgen_glGetCommandHeaderNV; +extern RGLSYMGLGETSTAGEINDEXNVPROC __rglgen_glGetStageIndexNV; +extern RGLSYMGLDRAWCOMMANDSNVPROC __rglgen_glDrawCommandsNV; +extern RGLSYMGLDRAWCOMMANDSADDRESSNVPROC __rglgen_glDrawCommandsAddressNV; +extern RGLSYMGLDRAWCOMMANDSSTATESNVPROC __rglgen_glDrawCommandsStatesNV; +extern RGLSYMGLDRAWCOMMANDSSTATESADDRESSNVPROC __rglgen_glDrawCommandsStatesAddressNV; +extern RGLSYMGLCREATECOMMANDLISTSNVPROC __rglgen_glCreateCommandListsNV; +extern RGLSYMGLDELETECOMMANDLISTSNVPROC __rglgen_glDeleteCommandListsNV; +extern RGLSYMGLISCOMMANDLISTNVPROC __rglgen_glIsCommandListNV; +extern RGLSYMGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC __rglgen_glListDrawCommandsStatesClientNV; +extern RGLSYMGLCOMMANDLISTSEGMENTSNVPROC __rglgen_glCommandListSegmentsNV; +extern RGLSYMGLCOMPILECOMMANDLISTNVPROC __rglgen_glCompileCommandListNV; +extern RGLSYMGLCALLCOMMANDLISTNVPROC __rglgen_glCallCommandListNV; +extern RGLSYMGLBEGINCONDITIONALRENDERNVPROC __rglgen_glBeginConditionalRenderNV; +extern RGLSYMGLENDCONDITIONALRENDERNVPROC __rglgen_glEndConditionalRenderNV; +extern RGLSYMGLSUBPIXELPRECISIONBIASNVPROC __rglgen_glSubpixelPrecisionBiasNV; +extern RGLSYMGLCONSERVATIVERASTERPARAMETERFNVPROC __rglgen_glConservativeRasterParameterfNV; +extern RGLSYMGLCONSERVATIVERASTERPARAMETERINVPROC __rglgen_glConservativeRasterParameteriNV; +extern RGLSYMGLDRAWVKIMAGENVPROC __rglgen_glDrawVkImageNV; +extern RGLSYMGLWAITVKSEMAPHORENVPROC __rglgen_glWaitVkSemaphoreNV; +extern RGLSYMGLSIGNALVKSEMAPHORENVPROC __rglgen_glSignalVkSemaphoreNV; +extern RGLSYMGLSIGNALVKFENCENVPROC __rglgen_glSignalVkFenceNV; +extern RGLSYMGLFRAGMENTCOVERAGECOLORNVPROC __rglgen_glFragmentCoverageColorNV; +extern RGLSYMGLCOVERAGEMODULATIONTABLENVPROC __rglgen_glCoverageModulationTableNV; +extern RGLSYMGLGETCOVERAGEMODULATIONTABLENVPROC __rglgen_glGetCoverageModulationTableNV; +extern RGLSYMGLCOVERAGEMODULATIONNVPROC __rglgen_glCoverageModulationNV; +extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __rglgen_glRenderbufferStorageMultisampleCoverageNV; +extern RGLSYMGLUNIFORM1I64NVPROC __rglgen_glUniform1i64NV; +extern RGLSYMGLUNIFORM2I64NVPROC __rglgen_glUniform2i64NV; +extern RGLSYMGLUNIFORM3I64NVPROC __rglgen_glUniform3i64NV; +extern RGLSYMGLUNIFORM4I64NVPROC __rglgen_glUniform4i64NV; +extern RGLSYMGLUNIFORM1I64VNVPROC __rglgen_glUniform1i64vNV; +extern RGLSYMGLUNIFORM2I64VNVPROC __rglgen_glUniform2i64vNV; +extern RGLSYMGLUNIFORM3I64VNVPROC __rglgen_glUniform3i64vNV; +extern RGLSYMGLUNIFORM4I64VNVPROC __rglgen_glUniform4i64vNV; +extern RGLSYMGLUNIFORM1UI64NVPROC __rglgen_glUniform1ui64NV; +extern RGLSYMGLUNIFORM2UI64NVPROC __rglgen_glUniform2ui64NV; +extern RGLSYMGLUNIFORM3UI64NVPROC __rglgen_glUniform3ui64NV; +extern RGLSYMGLUNIFORM4UI64NVPROC __rglgen_glUniform4ui64NV; +extern RGLSYMGLUNIFORM1UI64VNVPROC __rglgen_glUniform1ui64vNV; +extern RGLSYMGLUNIFORM2UI64VNVPROC __rglgen_glUniform2ui64vNV; +extern RGLSYMGLUNIFORM3UI64VNVPROC __rglgen_glUniform3ui64vNV; +extern RGLSYMGLUNIFORM4UI64VNVPROC __rglgen_glUniform4ui64vNV; +extern RGLSYMGLGETUNIFORMI64VNVPROC __rglgen_glGetUniformi64vNV; +extern RGLSYMGLPROGRAMUNIFORM1I64NVPROC __rglgen_glProgramUniform1i64NV; +extern RGLSYMGLPROGRAMUNIFORM2I64NVPROC __rglgen_glProgramUniform2i64NV; +extern RGLSYMGLPROGRAMUNIFORM3I64NVPROC __rglgen_glProgramUniform3i64NV; +extern RGLSYMGLPROGRAMUNIFORM4I64NVPROC __rglgen_glProgramUniform4i64NV; +extern RGLSYMGLPROGRAMUNIFORM1I64VNVPROC __rglgen_glProgramUniform1i64vNV; +extern RGLSYMGLPROGRAMUNIFORM2I64VNVPROC __rglgen_glProgramUniform2i64vNV; +extern RGLSYMGLPROGRAMUNIFORM3I64VNVPROC __rglgen_glProgramUniform3i64vNV; +extern RGLSYMGLPROGRAMUNIFORM4I64VNVPROC __rglgen_glProgramUniform4i64vNV; +extern RGLSYMGLPROGRAMUNIFORM1UI64NVPROC __rglgen_glProgramUniform1ui64NV; +extern RGLSYMGLPROGRAMUNIFORM2UI64NVPROC __rglgen_glProgramUniform2ui64NV; +extern RGLSYMGLPROGRAMUNIFORM3UI64NVPROC __rglgen_glProgramUniform3ui64NV; +extern RGLSYMGLPROGRAMUNIFORM4UI64NVPROC __rglgen_glProgramUniform4ui64NV; +extern RGLSYMGLPROGRAMUNIFORM1UI64VNVPROC __rglgen_glProgramUniform1ui64vNV; +extern RGLSYMGLPROGRAMUNIFORM2UI64VNVPROC __rglgen_glProgramUniform2ui64vNV; +extern RGLSYMGLPROGRAMUNIFORM3UI64VNVPROC __rglgen_glProgramUniform3ui64vNV; +extern RGLSYMGLPROGRAMUNIFORM4UI64VNVPROC __rglgen_glProgramUniform4ui64vNV; +extern RGLSYMGLGETINTERNALFORMATSAMPLEIVNVPROC __rglgen_glGetInternalformatSampleivNV; +extern RGLSYMGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC __rglgen_glGetMemoryObjectDetachedResourcesuivNV; +extern RGLSYMGLRESETMEMORYOBJECTPARAMETERNVPROC __rglgen_glResetMemoryObjectParameterNV; +extern RGLSYMGLTEXATTACHMEMORYNVPROC __rglgen_glTexAttachMemoryNV; +extern RGLSYMGLBUFFERATTACHMEMORYNVPROC __rglgen_glBufferAttachMemoryNV; +extern RGLSYMGLTEXTUREATTACHMEMORYNVPROC __rglgen_glTextureAttachMemoryNV; +extern RGLSYMGLNAMEDBUFFERATTACHMEMORYNVPROC __rglgen_glNamedBufferAttachMemoryNV; +extern RGLSYMGLDRAWMESHTASKSNVPROC __rglgen_glDrawMeshTasksNV; +extern RGLSYMGLDRAWMESHTASKSINDIRECTNVPROC __rglgen_glDrawMeshTasksIndirectNV; +extern RGLSYMGLMULTIDRAWMESHTASKSINDIRECTNVPROC __rglgen_glMultiDrawMeshTasksIndirectNV; +extern RGLSYMGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC __rglgen_glMultiDrawMeshTasksIndirectCountNV; +extern RGLSYMGLGENPATHSNVPROC __rglgen_glGenPathsNV; +extern RGLSYMGLDELETEPATHSNVPROC __rglgen_glDeletePathsNV; +extern RGLSYMGLISPATHNVPROC __rglgen_glIsPathNV; +extern RGLSYMGLPATHCOMMANDSNVPROC __rglgen_glPathCommandsNV; +extern RGLSYMGLPATHCOORDSNVPROC __rglgen_glPathCoordsNV; +extern RGLSYMGLPATHSUBCOMMANDSNVPROC __rglgen_glPathSubCommandsNV; +extern RGLSYMGLPATHSUBCOORDSNVPROC __rglgen_glPathSubCoordsNV; +extern RGLSYMGLPATHSTRINGNVPROC __rglgen_glPathStringNV; +extern RGLSYMGLPATHGLYPHSNVPROC __rglgen_glPathGlyphsNV; +extern RGLSYMGLPATHGLYPHRANGENVPROC __rglgen_glPathGlyphRangeNV; +extern RGLSYMGLWEIGHTPATHSNVPROC __rglgen_glWeightPathsNV; +extern RGLSYMGLCOPYPATHNVPROC __rglgen_glCopyPathNV; +extern RGLSYMGLINTERPOLATEPATHSNVPROC __rglgen_glInterpolatePathsNV; +extern RGLSYMGLTRANSFORMPATHNVPROC __rglgen_glTransformPathNV; +extern RGLSYMGLPATHPARAMETERIVNVPROC __rglgen_glPathParameterivNV; +extern RGLSYMGLPATHPARAMETERINVPROC __rglgen_glPathParameteriNV; +extern RGLSYMGLPATHPARAMETERFVNVPROC __rglgen_glPathParameterfvNV; +extern RGLSYMGLPATHPARAMETERFNVPROC __rglgen_glPathParameterfNV; +extern RGLSYMGLPATHDASHARRAYNVPROC __rglgen_glPathDashArrayNV; +extern RGLSYMGLPATHSTENCILFUNCNVPROC __rglgen_glPathStencilFuncNV; +extern RGLSYMGLPATHSTENCILDEPTHOFFSETNVPROC __rglgen_glPathStencilDepthOffsetNV; +extern RGLSYMGLSTENCILFILLPATHNVPROC __rglgen_glStencilFillPathNV; +extern RGLSYMGLSTENCILSTROKEPATHNVPROC __rglgen_glStencilStrokePathNV; +extern RGLSYMGLSTENCILFILLPATHINSTANCEDNVPROC __rglgen_glStencilFillPathInstancedNV; +extern RGLSYMGLSTENCILSTROKEPATHINSTANCEDNVPROC __rglgen_glStencilStrokePathInstancedNV; +extern RGLSYMGLPATHCOVERDEPTHFUNCNVPROC __rglgen_glPathCoverDepthFuncNV; +extern RGLSYMGLCOVERFILLPATHNVPROC __rglgen_glCoverFillPathNV; +extern RGLSYMGLCOVERSTROKEPATHNVPROC __rglgen_glCoverStrokePathNV; +extern RGLSYMGLCOVERFILLPATHINSTANCEDNVPROC __rglgen_glCoverFillPathInstancedNV; +extern RGLSYMGLCOVERSTROKEPATHINSTANCEDNVPROC __rglgen_glCoverStrokePathInstancedNV; +extern RGLSYMGLGETPATHPARAMETERIVNVPROC __rglgen_glGetPathParameterivNV; +extern RGLSYMGLGETPATHPARAMETERFVNVPROC __rglgen_glGetPathParameterfvNV; +extern RGLSYMGLGETPATHCOMMANDSNVPROC __rglgen_glGetPathCommandsNV; +extern RGLSYMGLGETPATHCOORDSNVPROC __rglgen_glGetPathCoordsNV; +extern RGLSYMGLGETPATHDASHARRAYNVPROC __rglgen_glGetPathDashArrayNV; +extern RGLSYMGLGETPATHMETRICSNVPROC __rglgen_glGetPathMetricsNV; +extern RGLSYMGLGETPATHMETRICRANGENVPROC __rglgen_glGetPathMetricRangeNV; +extern RGLSYMGLGETPATHSPACINGNVPROC __rglgen_glGetPathSpacingNV; +extern RGLSYMGLISPOINTINFILLPATHNVPROC __rglgen_glIsPointInFillPathNV; +extern RGLSYMGLISPOINTINSTROKEPATHNVPROC __rglgen_glIsPointInStrokePathNV; +extern RGLSYMGLGETPATHLENGTHNVPROC __rglgen_glGetPathLengthNV; +extern RGLSYMGLPOINTALONGPATHNVPROC __rglgen_glPointAlongPathNV; +extern RGLSYMGLMATRIXLOAD3X2FNVPROC __rglgen_glMatrixLoad3x2fNV; +extern RGLSYMGLMATRIXLOAD3X3FNVPROC __rglgen_glMatrixLoad3x3fNV; +extern RGLSYMGLMATRIXLOADTRANSPOSE3X3FNVPROC __rglgen_glMatrixLoadTranspose3x3fNV; +extern RGLSYMGLMATRIXMULT3X2FNVPROC __rglgen_glMatrixMult3x2fNV; +extern RGLSYMGLMATRIXMULT3X3FNVPROC __rglgen_glMatrixMult3x3fNV; +extern RGLSYMGLMATRIXMULTTRANSPOSE3X3FNVPROC __rglgen_glMatrixMultTranspose3x3fNV; +extern RGLSYMGLSTENCILTHENCOVERFILLPATHNVPROC __rglgen_glStencilThenCoverFillPathNV; +extern RGLSYMGLSTENCILTHENCOVERSTROKEPATHNVPROC __rglgen_glStencilThenCoverStrokePathNV; +extern RGLSYMGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __rglgen_glStencilThenCoverFillPathInstancedNV; +extern RGLSYMGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __rglgen_glStencilThenCoverStrokePathInstancedNV; +extern RGLSYMGLPATHGLYPHINDEXRANGENVPROC __rglgen_glPathGlyphIndexRangeNV; +extern RGLSYMGLPATHGLYPHINDEXARRAYNVPROC __rglgen_glPathGlyphIndexArrayNV; +extern RGLSYMGLPATHMEMORYGLYPHINDEXARRAYNVPROC __rglgen_glPathMemoryGlyphIndexArrayNV; +extern RGLSYMGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __rglgen_glProgramPathFragmentInputGenNV; +extern RGLSYMGLGETPROGRAMRESOURCEFVNVPROC __rglgen_glGetProgramResourcefvNV; +extern RGLSYMGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __rglgen_glFramebufferSampleLocationsfvNV; +extern RGLSYMGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __rglgen_glNamedFramebufferSampleLocationsfvNV; +extern RGLSYMGLRESOLVEDEPTHVALUESNVPROC __rglgen_glResolveDepthValuesNV; +extern RGLSYMGLSCISSOREXCLUSIVENVPROC __rglgen_glScissorExclusiveNV; +extern RGLSYMGLSCISSOREXCLUSIVEARRAYVNVPROC __rglgen_glScissorExclusiveArrayvNV; +extern RGLSYMGLMAKEBUFFERRESIDENTNVPROC __rglgen_glMakeBufferResidentNV; +extern RGLSYMGLMAKEBUFFERNONRESIDENTNVPROC __rglgen_glMakeBufferNonResidentNV; +extern RGLSYMGLISBUFFERRESIDENTNVPROC __rglgen_glIsBufferResidentNV; +extern RGLSYMGLMAKENAMEDBUFFERRESIDENTNVPROC __rglgen_glMakeNamedBufferResidentNV; +extern RGLSYMGLMAKENAMEDBUFFERNONRESIDENTNVPROC __rglgen_glMakeNamedBufferNonResidentNV; +extern RGLSYMGLISNAMEDBUFFERRESIDENTNVPROC __rglgen_glIsNamedBufferResidentNV; +extern RGLSYMGLGETBUFFERPARAMETERUI64VNVPROC __rglgen_glGetBufferParameterui64vNV; +extern RGLSYMGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __rglgen_glGetNamedBufferParameterui64vNV; +extern RGLSYMGLGETINTEGERUI64VNVPROC __rglgen_glGetIntegerui64vNV; +extern RGLSYMGLUNIFORMUI64NVPROC __rglgen_glUniformui64NV; +extern RGLSYMGLUNIFORMUI64VNVPROC __rglgen_glUniformui64vNV; +extern RGLSYMGLGETUNIFORMUI64VNVPROC __rglgen_glGetUniformui64vNV; +extern RGLSYMGLPROGRAMUNIFORMUI64NVPROC __rglgen_glProgramUniformui64NV; +extern RGLSYMGLPROGRAMUNIFORMUI64VNVPROC __rglgen_glProgramUniformui64vNV; +extern RGLSYMGLBINDSHADINGRATEIMAGENVPROC __rglgen_glBindShadingRateImageNV; +extern RGLSYMGLGETSHADINGRATEIMAGEPALETTENVPROC __rglgen_glGetShadingRateImagePaletteNV; +extern RGLSYMGLGETSHADINGRATESAMPLELOCATIONIVNVPROC __rglgen_glGetShadingRateSampleLocationivNV; +extern RGLSYMGLSHADINGRATEIMAGEBARRIERNVPROC __rglgen_glShadingRateImageBarrierNV; +extern RGLSYMGLSHADINGRATEIMAGEPALETTENVPROC __rglgen_glShadingRateImagePaletteNV; +extern RGLSYMGLSHADINGRATESAMPLEORDERNVPROC __rglgen_glShadingRateSampleOrderNV; +extern RGLSYMGLSHADINGRATESAMPLEORDERCUSTOMNVPROC __rglgen_glShadingRateSampleOrderCustomNV; +extern RGLSYMGLTEXTUREBARRIERNVPROC __rglgen_glTextureBarrierNV; +extern RGLSYMGLVERTEXATTRIBL1I64NVPROC __rglgen_glVertexAttribL1i64NV; +extern RGLSYMGLVERTEXATTRIBL2I64NVPROC __rglgen_glVertexAttribL2i64NV; +extern RGLSYMGLVERTEXATTRIBL3I64NVPROC __rglgen_glVertexAttribL3i64NV; +extern RGLSYMGLVERTEXATTRIBL4I64NVPROC __rglgen_glVertexAttribL4i64NV; +extern RGLSYMGLVERTEXATTRIBL1I64VNVPROC __rglgen_glVertexAttribL1i64vNV; +extern RGLSYMGLVERTEXATTRIBL2I64VNVPROC __rglgen_glVertexAttribL2i64vNV; +extern RGLSYMGLVERTEXATTRIBL3I64VNVPROC __rglgen_glVertexAttribL3i64vNV; +extern RGLSYMGLVERTEXATTRIBL4I64VNVPROC __rglgen_glVertexAttribL4i64vNV; +extern RGLSYMGLVERTEXATTRIBL1UI64NVPROC __rglgen_glVertexAttribL1ui64NV; +extern RGLSYMGLVERTEXATTRIBL2UI64NVPROC __rglgen_glVertexAttribL2ui64NV; +extern RGLSYMGLVERTEXATTRIBL3UI64NVPROC __rglgen_glVertexAttribL3ui64NV; +extern RGLSYMGLVERTEXATTRIBL4UI64NVPROC __rglgen_glVertexAttribL4ui64NV; +extern RGLSYMGLVERTEXATTRIBL1UI64VNVPROC __rglgen_glVertexAttribL1ui64vNV; +extern RGLSYMGLVERTEXATTRIBL2UI64VNVPROC __rglgen_glVertexAttribL2ui64vNV; +extern RGLSYMGLVERTEXATTRIBL3UI64VNVPROC __rglgen_glVertexAttribL3ui64vNV; +extern RGLSYMGLVERTEXATTRIBL4UI64VNVPROC __rglgen_glVertexAttribL4ui64vNV; +extern RGLSYMGLGETVERTEXATTRIBLI64VNVPROC __rglgen_glGetVertexAttribLi64vNV; +extern RGLSYMGLGETVERTEXATTRIBLUI64VNVPROC __rglgen_glGetVertexAttribLui64vNV; +extern RGLSYMGLVERTEXATTRIBLFORMATNVPROC __rglgen_glVertexAttribLFormatNV; +extern RGLSYMGLBUFFERADDRESSRANGENVPROC __rglgen_glBufferAddressRangeNV; +extern RGLSYMGLVERTEXFORMATNVPROC __rglgen_glVertexFormatNV; +extern RGLSYMGLNORMALFORMATNVPROC __rglgen_glNormalFormatNV; +extern RGLSYMGLCOLORFORMATNVPROC __rglgen_glColorFormatNV; +extern RGLSYMGLINDEXFORMATNVPROC __rglgen_glIndexFormatNV; +extern RGLSYMGLTEXCOORDFORMATNVPROC __rglgen_glTexCoordFormatNV; +extern RGLSYMGLEDGEFLAGFORMATNVPROC __rglgen_glEdgeFlagFormatNV; +extern RGLSYMGLSECONDARYCOLORFORMATNVPROC __rglgen_glSecondaryColorFormatNV; +extern RGLSYMGLFOGCOORDFORMATNVPROC __rglgen_glFogCoordFormatNV; +extern RGLSYMGLVERTEXATTRIBFORMATNVPROC __rglgen_glVertexAttribFormatNV; +extern RGLSYMGLVERTEXATTRIBIFORMATNVPROC __rglgen_glVertexAttribIFormatNV; +extern RGLSYMGLGETINTEGERUI64I_VNVPROC __rglgen_glGetIntegerui64i_vNV; +extern RGLSYMGLVIEWPORTSWIZZLENVPROC __rglgen_glViewportSwizzleNV; +extern RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; + +#ifndef __APPLE__ +typedef GLsync (APIENTRYP RGLSYMGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +typedef GLVULKANPROCNV (APIENTRYP RGLSYMGLGETVKPROCADDRNVPROC) (const GLchar *name); +extern RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; +extern RGLSYMGLGETVKPROCADDRNVPROC __rglgen_glGetVkProcAddrNV; +#endif struct rglgen_sym_map { const char *sym; void *ptr; }; extern const struct rglgen_sym_map rglgen_symbol_map[]; diff --git a/core/deps/libzip/.clang-format b/core/deps/libzip/.clang-format new file mode 100644 index 000000000..8bb62b8c2 --- /dev/null +++ b/core/deps/libzip/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: LLVM +IndentWidth: 4 +ColumnLimit: 2000 +AlwaysBreakAfterReturnType: TopLevelDefinitions +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 2 +BreakBeforeBraces: Custom +BraceWrapping: + BeforeElse: true +AlignEscapedNewlines: Left +UseTab: Never +#PPDirectiveIndentStyle: AfterHash diff --git a/core/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md b/core/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..86c107807 --- /dev/null +++ b/core/deps/libzip/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,32 @@ +--- +name: Bug Report +about: Report where libzip didn't behave like you expected. +title: '' +labels: bug +assignees: '' + +--- + +**Describe the Bug** +A clear and concise description of what the bug is. + +**Expected Behavior** +A clear and concise description of what you expected to happen. + +**Observed Behavior** +A clear and concise description of what actually happened. + +**To Reproduce** +Short program or code snippet that reproduces the problem. + +**libzip Version** +Version of libzip or revision repository used. + +**Operating System** +Operating system and version, used compiler. + +**Test Files** +If applicable, attach and describe zip archives that trigger the problem. + +**Additional context** +Add any other context about the problem here. diff --git a/core/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md b/core/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md new file mode 100644 index 000000000..45c8a7a72 --- /dev/null +++ b/core/deps/libzip/.github/ISSUE_TEMPLATE/compile-error.md @@ -0,0 +1,25 @@ +--- +name: Compile Error +about: Report when libzip does not compile. +title: '' +labels: compile +assignees: '' + +--- + +**Compiler Error** +Output from the compiler, including exact and complete error message, file name and line number. + +**libzip Version** +Version of libzip or revision repository used. + +**Operating System and Compiler** +The operating system and compiler used, including version number. + +Also, any flags passed to `cmake`. + +**Autodetected Configuration** +Attach `CmakeCache.txt` from your build directory. This list everything `cmake` detected on your system. + +**Additional context** +Add any other context about the problem here. diff --git a/core/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md b/core/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..c23381e02 --- /dev/null +++ b/core/deps/libzip/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,22 @@ +--- +name: Feature Request +about: Suggest an idea for this project. +title: '' +labels: enhancement +assignees: '' + +--- + +**Description** +A clear and concise description of what you want to achieve, why the current features are insufficient, and why you think it is generally useful. + +Also, have you checked whether the feature is already mentioned in TODO.md? If so, only submit a new issue if you expand on it. + +**Solution** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the feature request here. diff --git a/core/deps/libzip/.github/workflows/CIFuzz.yml b/core/deps/libzip/.github/workflows/CIFuzz.yml new file mode 100644 index 000000000..773e2715a --- /dev/null +++ b/core/deps/libzip/.github/workflows/CIFuzz.yml @@ -0,0 +1,25 @@ +name: CIFuzz +on: [pull_request] +permissions: + contents: read +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'libzip' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'libzip' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() + with: + name: artifacts + path: ./out/artifacts diff --git a/core/deps/libzip/.github/workflows/build.yml b/core/deps/libzip/.github/workflows/build.yml new file mode 100644 index 000000000..79030522b --- /dev/null +++ b/core/deps/libzip/.github/workflows/build.yml @@ -0,0 +1,65 @@ +name: build +on: [push] +permissions: + contents: read +jobs: + all: + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }}${{ matrix.name_extra }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + cmake_extra: [""] + name_extra: [""] + include: + - os: windows-latest + cmake_extra: "-T ClangCl" + name_extra: " clang-cl" + steps: + - name: checkout + uses: actions/checkout@v3 + - name: install python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.11' + - name: install dependencies (Linux) + if: ${{ runner.os == 'Linux' }} + run: | + sudo apt-get install libzstd-dev + - name: install dependencies (Windows) + if: ${{ runner.os == 'Windows' }} + uses: lukka/run-vcpkg@v7 + id: runvcpkg + with: + vcpkgGitCommitId: f93ba152d55e1d243160e690bc302ffe8638358e + vcpkgTriplet: x64-windows + vcpkgArguments: zlib bzip2 liblzma zstd + - name: prepare build directory and install nihtest + run: | + cmake -E make_directory ${{runner.workspace}}/build + pip install nihtest + - name: configure (Unix) + if: ${{ runner.os != 'Windows' }} + working-directory: ${{runner.workspace}}/build + run: | + cmake ${{ matrix.cmake_extra }} ${{github.workspace}} + - name: configure (Windows) + if: ${{ runner.os == 'Windows' }} + working-directory: ${{runner.workspace}}/build + run: | + cmake ${{ matrix.cmake_extra }} -DCMAKE_TOOLCHAIN_FILE=${{env.VCPKG_ROOT}}/scripts/buildsystems/vcpkg.cmake ${{github.workspace}} + - name: build + working-directory: ${{runner.workspace}}/build + run: | + cmake --build . --config Release + - name: Archive production artifacts + uses: actions/upload-artifact@v3 + with: + name: regress-directory + path: | + ${{runner.workspace}}/build/regress + - name: test + working-directory: ${{runner.workspace}}/build + run: | + ctest --output-on-failure -v -C Release diff --git a/core/deps/libzip/.github/workflows/codeql-analysis.yml b/core/deps/libzip/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..64c659a2f --- /dev/null +++ b/core/deps/libzip/.github/workflows/codeql-analysis.yml @@ -0,0 +1,74 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 10 * * 4' + +permissions: + contents: read + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/core/deps/libzip/API-CHANGES.md b/core/deps/libzip/API-CHANGES.md index 24e3d8e1a..4bfb7b283 100644 --- a/core/deps/libzip/API-CHANGES.md +++ b/core/deps/libzip/API-CHANGES.md @@ -7,6 +7,18 @@ You can define `ZIP_DISABLE_DEPRECATED` before including `` to hide prototypes for deprecated functions, to find out about functions that might be removed at some point. +## Changed in libzip-1.10.0 + +### deprecated `zip_source_zip` and `zip_source_zip_create` + +These functions were replaced with `zip_source_zip_file` and `zip_source_zip_file_create`. The implicit handling of the flag `ZIP_FL_COMPRESSED` was removed, the flag can now be specified explicitly. + +If you want to get the compressed data for the whole file, use + +```C +zip_source_zip_file(za, source_archive, source_index, ZIP_FL_COMPRESSED, 0, -1, NULL) +``` + ## Changed in libzip-1.0 ### new type `zip_error_t` diff --git a/core/deps/libzip/CMakeLists.txt b/core/deps/libzip/CMakeLists.txt index afcc6fc31..b2e77241a 100644 --- a/core/deps/libzip/CMakeLists.txt +++ b/core/deps/libzip/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0.2) +cmake_minimum_required(VERSION 3.5.0) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) if (${CMAKE_VERSION} VERSION_LESS "3.17.0") @@ -6,7 +6,7 @@ if (${CMAKE_VERSION} VERSION_LESS "3.17.0") endif() project(libzip - VERSION 1.7.3.1 + VERSION 1.10.1 LANGUAGES C) option(ENABLE_COMMONCRYPTO "Enable use of CommonCrypto" ON) @@ -19,6 +19,8 @@ option(ENABLE_BZIP2 "Enable use of BZip2" ON) option(ENABLE_LZMA "Enable use of LZMA" ON) option(ENABLE_ZSTD "Enable use of Zstandard" ON) +option(ENABLE_FDOPEN "Enable zip_fdopen, which is not allowed in Microsoft CRT secure libraries" ON) + option(BUILD_TOOLS "Build tools in the src directory (zipcmp, zipmerge, ziptool)" ON) option(BUILD_REGRESS "Build regression tests" ON) option(BUILD_EXAMPLES "Build examples" ON) @@ -87,14 +89,19 @@ endif() # Checks +# Request ISO C secure library functions (memcpy_s &c) +list(APPEND CMAKE_REQUIRED_DEFINITIONS -D__STDC_WANT_LIB_EXT1__=1) + check_function_exists(_close HAVE__CLOSE) check_function_exists(_dup HAVE__DUP) check_function_exists(_fdopen HAVE__FDOPEN) check_function_exists(_fileno HAVE__FILENO) check_function_exists(_setmode HAVE__SETMODE) -check_function_exists(_snprintf HAVE__SNPRINTF) +check_symbol_exists(_snprintf stdio.h HAVE__SNPRINTF) +check_symbol_exists(_snprintf_s stdio.h HAVE__SNPRINTF_S) +check_symbol_exists(_snwprintf_s stdio.h HAVE__SNWPRINTF_S) check_function_exists(_strdup HAVE__STRDUP) -check_function_exists(_stricmp HAVE__STRICMP) +check_symbol_exists(_stricmp string.h HAVE__STRICMP) check_function_exists(_strtoi64 HAVE__STRTOI64) check_function_exists(_strtoui64 HAVE__STRTOUI64) check_function_exists(_unlink HAVE__UNLINK) @@ -102,15 +109,24 @@ check_function_exists(arc4random HAVE_ARC4RANDOM) check_function_exists(clonefile HAVE_CLONEFILE) check_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO) check_function_exists(explicit_memset HAVE_EXPLICIT_MEMSET) +check_function_exists(fchmod HAVE_FCHMOD) check_function_exists(fileno HAVE_FILENO) check_function_exists(fseeko HAVE_FSEEKO) check_function_exists(ftello HAVE_FTELLO) check_function_exists(getprogname HAVE_GETPROGNAME) -check_function_exists(localtime_r HAVE_LOCALTIME_R) +check_symbol_exists(localtime_r time.h HAVE_LOCALTIME_R) +check_symbol_exists(localtime_s time.h HAVE_LOCALTIME_S) +check_function_exists(memcpy_s HAVE_MEMCPY_S) +check_function_exists(random HAVE_RANDOM) check_function_exists(setmode HAVE_SETMODE) -check_function_exists(strcasecmp HAVE_STRCASECMP) +check_symbol_exists(snprintf stdio.h HAVE_SNPRINTF) +check_symbol_exists(snprintf_s stdio.h HAVE_SNPRINTF_S) +check_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP) check_function_exists(strdup HAVE_STRDUP) +check_function_exists(strerror_s HAVE_STRERROR_S) +check_function_exists(strerrorlen_s HAVE_STRERRORLEN_S) check_function_exists(stricmp HAVE_STRICMP) +check_function_exists(strncpy_s HAVE_STRNCPY_S) check_function_exists(strtoll HAVE_STRTOLL) check_function_exists(strtoull HAVE_STRTOULL) @@ -175,6 +191,34 @@ int main(int argc, char *argv[]) { }" HAVE_NULLABLE) test_big_endian(WORDS_BIGENDIAN) find_package(ZLIB 1.1.2 REQUIRED) +# so developers on systems where zlib is named differently (Windows, sometimes) +# can override the name used in the pkg-config file +if (NOT ZLIB_LINK_LIBRARY_NAME) + set(ZLIB_LINK_LIBRARY_NAME "z") + + # Get the correct name in common cases + list(LENGTH ZLIB_LIBRARIES N_ZLIB_LIBRARIES) + if(N_ZLIB_LIBRARIES EQUAL 1) + set(ZLIB_FILENAME ${ZLIB_LIBRARIES}) + elseif(N_ZLIB_LIBRARIES EQUAL 4) + # ZLIB_LIBRARIES might have the target_link_library() format like + # "optimized;path/to/zlib.lib;debug;path/to/zlibd.lib". Use the 'optimized' + # case unless we know we are in a Debug build. + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + list(FIND ZLIB_LIBRARIES "debug" ZLIB_LIBRARIES_INDEX_OF_CONFIG) + else() + list(FIND ZLIB_LIBRARIES "optimized" ZLIB_LIBRARIES_INDEX_OF_CONFIG) + endif() + if(ZLIB_LIBRARIES_INDEX_OF_CONFIG GREATER_EQUAL 0) + math(EXPR ZLIB_FILENAME_INDEX "${ZLIB_LIBRARIES_INDEX_OF_CONFIG}+1") + list(GET ZLIB_LIBRARIES ${ZLIB_FILENAME_INDEX} ZLIB_FILENAME) + endif() + endif() + if(ZLIB_FILENAME) + get_filename_component(ZLIB_FILENAME ${ZLIB_FILENAME} NAME_WE) + string(REGEX REPLACE "^lib" "" ZLIB_LINK_LIBRARY_NAME ${ZLIB_FILENAME}) + endif() +endif(NOT ZLIB_LINK_LIBRARY_NAME) if(ENABLE_BZIP2) find_package(BZip2) @@ -195,12 +239,17 @@ if(ENABLE_LZMA) endif(ENABLE_LZMA) if(ENABLE_ZSTD) - find_package(Zstd) - if(Zstd_FOUND) + find_package(zstd 1.3.6) + if(zstd_FOUND) set(HAVE_LIBZSTD 1) + if(TARGET zstd::libzstd_shared) + set(zstd_TARGET zstd::libzstd_shared) + else() + set(zstd_TARGET zstd::libzstd_static) + endif() else() message(WARNING "-- zstd library not found; zstandard support disabled") - endif(Zstd_FOUND) + endif(zstd_FOUND) endif(ENABLE_ZSTD) if (COMMONCRYPTO_FOUND) @@ -209,18 +258,18 @@ if (COMMONCRYPTO_FOUND) elseif (WINDOWS_CRYPTO_FOUND) set(HAVE_CRYPTO 1) set(HAVE_WINDOWS_CRYPTO 1) -elseif (GNUTLS_FOUND AND NETTLE_FOUND) - set(HAVE_CRYPTO 1) - set(HAVE_GNUTLS 1) elseif (OPENSSL_FOUND) set(HAVE_CRYPTO 1) set(HAVE_OPENSSL 1) +elseif (GNUTLS_FOUND AND NETTLE_FOUND) + set(HAVE_CRYPTO 1) + set(HAVE_GNUTLS 1) elseif (MBEDTLS_FOUND) set(HAVE_CRYPTO 1) set(HAVE_MBEDTLS 1) endif() -if (NOT HAVE_CRYPTO) +if ((ENABLE_COMMONCRYPTO OR ENABLE_GNUTLS OR ENABLE_MBEDTLS OR ENABLE_OPENSSL OR ENABLE_WINDOWS_CRYPTO) AND NOT HAVE_CRYPTO) message(WARNING "-- neither Common Crypto, GnuTLS, mbed TLS, OpenSSL, nor Windows Cryptography found; AES support disabled") endif() @@ -263,10 +312,10 @@ else(BUILD_TOOLS) endif(BUILD_REGRESS) endif() -include(FindPerl) +find_program(NIHTEST nihtest) -if(NOT PERL_FOUND) - message(WARNING "-- perl not found, regression testing disabled") +if(BUILD_REGRESS AND NOT NIHTEST) + message(WARNING "-- nihtest not found, regression testing disabled") set(BUILD_REGRESS OFF) endif() @@ -280,11 +329,12 @@ endif() # pkgconfig file -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix \${prefix}) -SET(bindir ${CMAKE_INSTALL_FULL_BINDIR}) -SET(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) -SET(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +file(RELATIVE_PATH pc_relative_bindir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_BINDIR}) +set(bindir "\${prefix}/${pc_relative_bindir}") +file(RELATIVE_PATH pc_relative_libdir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_LIBDIR}) +set(libdir "\${prefix}/${pc_relative_libdir}") +file(RELATIVE_PATH pc_relative_includedir ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +set(includedir "\${prefix}/${pc_relative_includedir}") if(CMAKE_SYSTEM_NAME MATCHES BSD) set(PKG_CONFIG_RPATH "-Wl,-R\${libdir}") endif(CMAKE_SYSTEM_NAME MATCHES BSD) @@ -296,10 +346,14 @@ foreach(LIB ${LIBS_PRIVATE}) endif() set(LIBS "${LIBS} -l${LIB}") endforeach() +STRING(CONCAT zlib_link_name "-l" ${ZLIB_LINK_LIBRARY_NAME}) string(REGEX REPLACE "-lBZip2::BZip2" "-lbz2" LIBS ${LIBS}) string(REGEX REPLACE "-lLibLZMA::LibLZMA" "-llzma" LIBS ${LIBS}) +if(ENABLE_ZSTD) + string(REGEX REPLACE "-l${zstd_TARGET}" "-lzstd" LIBS ${LIBS}) +endif() string(REGEX REPLACE "-lOpenSSL::Crypto" "-lssl -lcrypto" LIBS ${LIBS}) -string(REGEX REPLACE "-lZLIB::ZLIB" "-lz" LIBS ${LIBS}) +string(REGEX REPLACE "-lZLIB::ZLIB" ${zlib_link_name} LIBS ${LIBS}) string(REGEX REPLACE "-lGnuTLS::GnuTLS" "-lgnutls" LIBS ${LIBS}) string(REGEX REPLACE "-lNettle::Nettle" "-lnettle" LIBS ${LIBS}) configure_file(libzip.pc.in libzip.pc @ONLY) @@ -409,17 +463,6 @@ set(srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress) set(abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR}/regress) set(top_builddir ${PROJECT_BINARY_DIR}) # used to find config.h -configure_file(regress/nihtest.conf.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf @ONLY) -file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/nihtest.conf - DESTINATION ${PROJECT_BINARY_DIR}/regress - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - -configure_file(regress/runtest.in ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest @ONLY) -file(COPY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/runtest - DESTINATION ${PROJECT_BINARY_DIR}/regress - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - ) - # create package config file include(CMakePackageConfigHelpers) write_basic_package_version_file("${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" @@ -428,6 +471,15 @@ write_basic_package_version_file("${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-v configure_package_config_file("${PROJECT_NAME}-config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libzip) +# Install Find* modules, they are required by libzip-config.cmake to resolve dependencies +install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindNettle.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Findzstd.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindMbedTLS.cmake + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/libzip/modules + ) + if(LIBZIP_DO_INSTALL) # Add targets to the build-tree export set export(TARGETS zip @@ -442,4 +494,3 @@ if(LIBZIP_DO_INSTALL) DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) endif() - diff --git a/core/deps/libzip/INSTALL.md b/core/deps/libzip/INSTALL.md index 512768cf5..83f1d97db 100644 --- a/core/deps/libzip/INSTALL.md +++ b/core/deps/libzip/INSTALL.md @@ -1,7 +1,5 @@ libzip uses [cmake](https://cmake.org) to build. -For running the tests, you need to have [perl](https://www.perl.org). - You'll need [zlib](http://www.zlib.net/) (at least version 1.1.2). It comes with most operating systems. @@ -18,15 +16,19 @@ For AES (encryption) support, you need one of these cryptographic libraries, listed in order of preference: - Apple's CommonCrypto (available on macOS and iOS) +- Microsoft Windows Cryptography Framework +- [OpenSSL](https://www.openssl.org/) >= 1.0. - [GnuTLS](https://www.gnutls.org/) and [Nettle](https://www.lysator.liu.se/~nisse/nettle/) (at least nettle 3.0) - [mbed TLS](https://tls.mbed.org/) -- [OpenSSL](https://www.openssl.org/) >= 1.0. -- Microsoft Windows Cryptography Framework If you don't want a library even if it is installed, you can pass `-DENABLE_=OFF` to cmake, where `` is one of `COMMONCRYPTO`, `GNUTLS`, `MBEDTLS`, or `OPENSSL`. +For running the tests, you need to have +[Python](https://www.python.org/) and +[nihtest](https://pypi.org/project/nihtest/) installed. + The basic usage is ```sh mkdir build @@ -48,7 +50,7 @@ Some useful parameters you can pass to `cmake` with `-Dparameter=value`: - `LIBZIP_DO_INSTALL`: If you include libzip as a subproject, link it statically and do not want to let it install its files, set this variable to `OFF`. Defaults to `ON`. - + If you want to compile with custom `CFLAGS`, set them in the environment before running `cmake`: ```sh @@ -66,4 +68,4 @@ will break in `zipcmp`. You can get verbose build output with by passing `VERBOSE=1` to `make`. -You can also check the [cmake FAQ](https://cmake.org/Wiki/CMake_FAQ). +You can also check the [cmake FAQ](https://gitlab.kitware.com/cmake/community/-/wikis/FAQ). diff --git a/core/deps/libzip/LICENSE b/core/deps/libzip/LICENSE index 573d5d94d..fa7060961 100644 --- a/core/deps/libzip/LICENSE +++ b/core/deps/libzip/LICENSE @@ -1,6 +1,6 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner -The authors can be contacted at +The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/NEWS.md b/core/deps/libzip/NEWS.md index ea1dd9ff4..e117422d8 100644 --- a/core/deps/libzip/NEWS.md +++ b/core/deps/libzip/NEWS.md @@ -1,32 +1,81 @@ -1.8.0 [2020-xx-xx] -================== +# 1.10.1 [2023-08-23] + +* Add `ZIP_LENGTH_TO_END` and `ZIP_LENGTH_UNCHECKED`. Unless `ZIP_LENGTH_UNCHECKED` is used as `length`, it is an error for a file to shrink between the time when the source is created and when its data is read. +* Fix test on Windows. + +# 1.10.0 [2023-06-23] + +* Make support for layered sources public. +* Add `zip_source_zip_file` and `zip_source_zip_file_create`, deprecate `zip_source_zip` and `zip_source_zip_create`. +* Allow reading changed file data. +* Fix handling of files of size 4294967295. +* `zipmerge`: copy extra fields. +* `zipmerge`: add option to keep files uncompressed. +* Switch test framework to use nihtest instead of Perl. +* Fix reading/writing compressed data with buffers > 4GiB. +* Restore support for torrentzip. +* Add warnings when using deprecated functions. +* Allow keeping files for empty archives. +* Support mbedTLS>=3.3.0. +* Support OpenSSL 3. +* Use ISO C secure library functions, if available. + + +# 1.9.2 [2022-06-28] + +* Fix version number in header file. + + +# 1.9.1 [2022-06-28] + +* Fix `zip_file_is_seekable()`. + + +# 1.9.0 [2022-06-13] + +* Add `zip_file_is_seekable()`. +* Improve compatibility with WinAES. +* Fix encoding handling in `zip_name_locate()`. +* Add option to `zipcmp` to output summary of changes. +* Various bug fixes and documentation improvements. + + +# 1.8.0 [2021-06-18] * Add support for zstd (Zstandard) compression. * Add support for lzma (ID 14) compression. +* Add `zip_source_window_create()`. +* Add `zip_source_zip_create()` variant to `zip_source_zip()`. +* Allow method specific `comp_flags` in `zip_set_file_compression()`. +* Allow `zip_source_tell()` on sources that don't support seeking and `zip_ftell()` on compressed data. +* Provide more details for consistency check errors. +* Improve output of `zipcmp`. +* In `zipcmp`, don’t ignore empty directories when comparing directory listing. +* Treat empty string as no password given in `zip_file_set_encryption()`, `zip_fopen_encrypted()`, and `zip_set_default_password()`. + -1.7.3 [2020-07-15] -================== +# 1.7.3 [2020-07-15] * Support cmake < 3.17 again. * Fix pkgconfig file (regression in 1.7.2). -1.7.2 [2020-07-11] -================== + +# 1.7.2 [2020-07-11] * Fixes for the CMake `find_project()` files. * libzip moved to the CMake `libzip::` `NAMESPACE`. * CMake usage best practice cleanups. -1.7.1 [2020-06-13] -================== + +# 1.7.1 [2020-06-13] * Restore `LIBZIP_VERSION_{MAJOR,MINOR,MICRO}` symbols. * Fixes warnings reported by PVS-Studio. * Add `LIBZIP_DO_INSTALL` build setting to make it easier to use libzip as subproject. -1.7.0 [2020-06-05] -================== + +# 1.7.0 [2020-06-05] * Add support for encrypting using traditional PKWare encryption. * Add `zip_compression_method_supported()`. @@ -35,13 +84,13 @@ * Refactor stdio file backend. * Add CMake find_project() support. -1.6.1 [2020-02-03] -================== + +# 1.6.1 [2020-02-03] * Bugfix for double-free in `zipcmp(1)` during cleanup. -1.6.0 [2020-01-24] -================== + +# 1.6.0 [2020-01-24] * Avoid using `umask()` since it's not thread-safe. * Set close-on-exec flag when opening files. @@ -50,8 +99,8 @@ * Add support for cancelling while closing zip archives. * Add support for setting the time in the on-disk format. -1.5.2 [2019-03-12] -================== + +# 1.5.2 [2019-03-12] * Fix bug in AES encryption affecting certain file sizes * Keep file permissions when modifying zip archives @@ -59,8 +108,8 @@ * Support mbed TLS as crypto backend. * Add nullability annotations. -1.5.1 [2018-04-11] -================== + +# 1.5.1 [2018-04-11] * Choose format of installed documentation based on available tools. * Fix visibility of symbols. @@ -70,16 +119,16 @@ * Fix build with LibreSSL. * Various bugfixes. -1.5.0 [2018-03-11] -================== + +# 1.5.0 [2018-03-11] * Use standard cryptographic library instead of custom AES implementation. This also simplifies the license. * Use `clang-format` to format the source code. * More Windows improvements. -1.4.0 [2017-12-29] -================== + +# 1.4.0 [2017-12-29] * Improve build with cmake * Retire autoconf/automake build system @@ -88,20 +137,20 @@ Supported for buffer sources and on Apple File System. * Add support for Microsoft Universal Windows Platform. -1.3.2 [2017-11-20] -================== + +# 1.3.2 [2017-11-20] * Fix bug introduced in last: zip_t was erroneously freed if zip_close() failed. -1.3.1 [2017-11-19] -================== + +# 1.3.1 [2017-11-19] * Install zipconf.h into ${PREFIX}/include * Add zip_libzip_version() * Fix AES tests on Linux -1.3.0 [2017-09-02] -================== + +# 1.3.0 [2017-09-02] * Support bzip2 compressed zip archives * Improve file progress callback code @@ -109,8 +158,8 @@ * CVE-2017-12858: Fix double free() * CVE-2017-14107: Improve EOCD64 parsing -1.2.0 [2017-02-19] -================== + +# 1.2.0 [2017-02-19] * Support for AES encryption (Winzip version), both encryption and decryption @@ -120,24 +169,24 @@ * Add zip_ftell() for telling position in uncompressed data * Add zip_register_progress_callback() for UI updates during zip_close() -1.1.3 [2016-05-28] -================== + +# 1.1.3 [2016-05-28] * Fix build on Windows when using autoconf -1.1.2 [2016-02-19] -================== + +# 1.1.2 [2016-02-19] * Improve support for 3MF files -1.1.1 [2016-02-07] -================== + +# 1.1.1 [2016-02-07] * Build fixes for Linux * Fix some warnings reported by PVS-Studio -1.1 [2016-01-26] -================ + +# 1.1 [2016-01-26] * ziptool(1): command line tool to modify zip archives * Speedups for archives with many entries @@ -148,13 +197,13 @@ * Portability fixes * Documentation improvements -1.0.1 [2015-05-04] -================== + +# 1.0.1 [2015-05-04] * Build fixes for Windows -1.0 [2015-05-03] -================ + +# 1.0 [2015-05-03] * Implemented an I/O abstraction layer * Added support for native Windows API for files @@ -165,22 +214,22 @@ * CVE-2015-2331 was fixed * Addressed all Coverity CIDs -0.11.2 [2013-12-19] -=================== + +# 0.11.2 [2013-12-19] * Support querying/setting operating system and external attributes * For newly added files, set operating system to UNIX, permissions to 0666 (0777 for directories) * Fix bug when writing zip archives containing files bigger than 4GB -0.11.1 [2013-04-27] -=================== + +# 0.11.1 [2013-04-27] * Fix bugs in zip_set_file_compression() * Include Xcode build infrastructure -0.11 [2013-03-23] -================= + +# 0.11 [2013-03-23] * Added Zip64 support (large file support) * Added UTF-8 support for file names, file comments, and archive comments @@ -194,14 +243,14 @@ * More changes for Windows support * Additional test cases -0.10.1 [2012-03-20] -=================== + +# 0.10.1 [2012-03-20] * Fixed CVE-2012-1162 * Fixed CVE-2012-1163 -0.10 [2010-03-18] -================= + +# 0.10 [2010-03-18] * Added zip_get_num_entries(), deprecated zip_get_num_files() * Better windows support @@ -213,27 +262,27 @@ * Fixed CVE-2011-0421 (no security implications though) * More documentation -0.9.3 [2010-02-01] -================== + +# 0.9.3 [2010-02-01] * Include m4/ directory in distribution; some packagers need it -0.9.2 [2010-01-31] -================== + +# 0.9.2 [2010-01-31] * Avoid passing uninitialized data to deflate() * Fix memory leak when closing zip archives -0.9.1 [2010-01-24] -================== + +# 0.9.1 [2010-01-24] * Fix infinite loop on reading some broken files * Optimization in time conversion (don't call localtime()) * Clear data descriptor flag in central directory, fixing Open Office files * Allow more than 64k entries -0.9 [2008-07-25] -================== + +# 0.9 [2008-07-25] * on Windows, explicitly set dllimport/dllexport * remove erroneous references to GPL @@ -242,8 +291,8 @@ * zip_source_zip: add flag to force recompression * zip_sorce_file: only keep file open while reading from it -0.8 [2007-06-06] -================== + +# 0.8 [2007-06-06] * fix for zip archives larger than 2GiB * fix zip_error_strerror to include libzip error string @@ -251,13 +300,13 @@ * new functions: zip_add_dir, zip_error_clear, zip_file_error_clear * add basic support for building with CMake (incomplete) -0.7.1 [2006-05-18] -================== + +# 0.7.1 [2006-05-18] * bugfix for zip_close -0.7 [2006-05-06] -================ + +# 0.7 [2006-05-06] * struct zip_stat increased for future encryption support * zip_add return value changed (now returns new index of added file) @@ -266,13 +315,13 @@ New functions: zip_get_archive_comment, zip_get_file_comment, zip_set_archive_comment, zip_set_file_comment, zip_unchange_archive -0.6.1 [2005-07-14] -================== + +# 0.6.1 [2005-07-14] * various bug fixes -0.6 [2005-06-09] -================ + +# 0.6 [2005-06-09] * first standalone release * changed license to three-clause BSD diff --git a/core/deps/libzip/README.md b/core/deps/libzip/README.md index 9262c3def..2ca60e1d7 100644 --- a/core/deps/libzip/README.md +++ b/core/deps/libzip/README.md @@ -3,7 +3,7 @@ zip and zip64 archives. Files can be added from data buffers, files, or compressed data copied directly from other zip archives. Changes made without closing the archive can be reverted. Decryption and encryption of Winzip AES and legacy PKware encrypted files is -supported. The API is documented by man pages. +supported. libzip is fully documented via man pages. HTML versions of the man pages are on [libzip.org](https://libzip.org/documentation/) and @@ -13,13 +13,13 @@ lists all others. Example source code is in the [examples](examples) and [src](src) subdirectories. +See the [INSTALL.md](INSTALL.md) file for installation instructions and +dependencies. + If you have developed an application using libzip, you can find out about API changes and how to adapt your code for them in the included file [API-CHANGES.md](API-CHANGES.md). -See the [INSTALL.md](INSTALL.md) file for installation instructions and -dependencies. - If you make a binary distribution, please include a pointer to the distribution site: > https://libzip.org/ @@ -27,13 +27,8 @@ distribution site: The latest version can always be found there. The official repository is at [github](https://github.com/nih-at/libzip/). -There is a mailing list for developers using libzip. You can -subscribe to it by sending a mail with the subject "subscribe -libzip-discuss" to minimalist at nih.at. List mail should be sent -to libzip-discuss at nih.at. Use this for bug reports or questions. - -If you want to reach the authors in private, use . +If you want to reach the authors in private, use . -[![Travis Build Status](https://api.travis-ci.org/nih-at/libzip.svg?branch=master)](https://travis-ci.org/nih-at/libzip) +[![Github Actions Build Status](https://github.com/nih-at/libzip/workflows/build/badge.svg)](https://github.com/nih-at/libzip/actions?query=workflow%3Abuild) [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/f1bqqt9djvf22f5g?svg=true)](https://ci.appveyor.com/project/nih-at/libzip) [![Coverity Status](https://scan.coverity.com/projects/127/badge.svg)](https://scan.coverity.com/projects/libzip) diff --git a/core/deps/libzip/SECURITY.md b/core/deps/libzip/SECURITY.md new file mode 100644 index 000000000..67c84eb1d --- /dev/null +++ b/core/deps/libzip/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +We are not maintaining multiple branches, so all fixes will be committed to head and included in the next release. + +We take great care to maintain backwards compatibility, so we expect our users to use the latest version. + +## Reporting a Vulnerability + +You can reach us per email at info@libzip.org. + +For less sensitive reports, you can also open an issue or pull request on GitHub. diff --git a/core/deps/libzip/THANKS b/core/deps/libzip/THANKS index b7e4497f6..d36ecc9e5 100644 --- a/core/deps/libzip/THANKS +++ b/core/deps/libzip/THANKS @@ -3,10 +3,13 @@ and some other general information gathered from their sources. Thanks to these people for suggestions, testing, and bug reports: +ag2s20150909 Agostino Sarubbo +Alberto Spin Alexander Galanin Alexandr Shadchin Alexey Bykov +Andreas Deininger Andreas Falkenhahn Andrew Brampton Andrew Molyneux @@ -19,36 +22,50 @@ Beuc Boaz Stolk Bogdan Brian 'geeknik' Carpenter +BruceFan Carl Mastrangelo Cédric Tabin celan69 +chaoticgd Charlie Li Chris Nehren Christoph Cullmann Christoph M. Becker Coverity +cryi +ctenter-scs Dane Springmeyer +Daniel Russel Ларионов Даниил David Demelier Dean Ellis Declan Moran Del Merritt +Devin Davila Dmytro Rybachenko +Dylan T. +Eelco Dolstra Elvis Angelaccio Erwin Haid Eun-cheol Joo Fabrice Fontaine +Filip Niksic Florian Delizy Force Charlie François Simon Frederik Ramm +Gabriela Gutierrez +Gerard ODonnell +Giovanni gk7huki Hanno Böck HeeMyung Heiko Becker Heiko Hund +hongjunwang Ilya Voronin Info-ZIP group +Ivan Kolesnikov Jan Weiß Jay Freeman (saurik) jloqfjgk@github @@ -56,24 +73,35 @@ Joachim Reichel João Custódio Joel Ebrahimi Jono Spiro +Julien Matthey Julien Schueller +Justin Cohen kensington Keith Jones Khaled Mardam-Bey Kohei Yoshida +Krzesimir Nowak Leith Bade Lubomir I. Ivanov +Lucas Bustamante +Ludovic LANGE +M. Reiningħaus Maël Nison +Manuel Massing +Marcin Kowalczyk +Mark A. Tsuchida Martin Buchholz Martin Herkt Martin Szulecki Michael Balzer Michael Beck +Michael Heimpold Michał Janiszewski Michal Vyskocil Mikhail Gusarov . Miklos Vajna Morris Hafner +Muhammad Arslan Kabeer Oliver Kaiser Oliver Kuckertz OSS-Fuzz Team @@ -84,34 +112,51 @@ Paul Harris Paul Sheppard Pavel Raiskup Pierre Joye +Pierre Wendling Pierre-Louis Cabelguen +PW Hu +Rafał Mikrut +ralfjunker Randy Remi Collet +rezso Richard Schütz Rick Carback Rikard Falkeborn Robert Norris Roberto Tirabassi +robhz786 Roland Ortloff Rosen Penev +Rudi Heitbaum Ryan Burns +Sam Sappenfield +scribam Sebastian Kemper Sebastian Schmitt Sergei Ozerov +shenlebantongying +Shimi Simon Talbot +SpaceIm Stephen Bryant Tabata Shintaro Tarmo Pikaro Taylor C. Richberger TC +Thomas Debesse Tim Lunn Timo Warns +Timofey Tom Callaway Tomas Hoger Tomáš Malý Torsten Paul Transporter Vassili Courzakis +Vinpasso +Vitaly Murashev William Lee +William Ouwehand Wojciech Michalski Wolfgang Glunz diff --git a/core/deps/libzip/TODO.md b/core/deps/libzip/TODO.md index bd81107ac..3eeba6156 100644 --- a/core/deps/libzip/TODO.md +++ b/core/deps/libzip/TODO.md @@ -1,3 +1,14 @@ +### Torrentzip + +- Handle data sources with unknown uncompressed size. +- Handle when uncompressed size < 4GB but compressed size > 4GB. + +## Other + +- split `zip_source_t` in main part and reference so we can keep track which reference called open and we can invalidate references if the underlying source gets invalidated (e. g. by `zip_close`). +- Support extended timestamp extra field (0x5455): mtime overrides dos mtime from dirent, function to get/set all three. +- Check UTF-8 code against https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + ## Prefixes For example for adding extractors for self-extracting zip archives. @@ -13,6 +24,8 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) ## API Issues +* Add `zip_file_use_password` to set per-file password to use if libzip needs to decrypt the file (e.g. when changing encryption or compression method). + * `zip_get_archive_comment` has `int *lenp` argument. Cleaner would be `zip_uint32_t *`. rename and fix. which other functions for naming consistency? * rename remaining `zip_XXX_{file,archive}_*` to `zip_{file,archive}_XXX_*`? @@ -21,7 +34,6 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) ## Features -* add seek support for AES-encrypted files * consistently use `_zip_crypto_clear()` for passwords * support setting extra fields from `zip_source` * introduce layers of extra fields: @@ -75,6 +87,7 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) ## Documentation +* document valid file paths * document: `zip_source_write()`: length can't be > `ZIP_INT64_MAX` * document: `ZIP_SOURCE_CLOSE` implementation can't return error * keep error codes in man pages in sync @@ -82,11 +95,12 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) ## Infrastructure +* add coverage reports, e.g. using gcovr or https://github.com/eddyxu/cpp-coveralls (coveralls.io) * review guidelines/community standards - [Linux Foundation Core Infrastructure Initiative Best Practices](https://bestpractices.coreinfrastructure.org/) - [Readme Maturity Level](https://github.com/LappleApple/feedmereadmes/blob/master/README-maturity-model.md) - [Github Community Profile](https://github.com/nih-at/libzip/community) -* test different crypto backends with TravisCI. +* test different crypto backends with GitHub actions. * improve man page formatting of tagged lists on webpage (`
`) * rewrite `make_zip_errors.sh` in cmake * script to check if all exported symbols are marked with `ZIP_EXTERN`, add to `make distcheck` @@ -97,6 +111,8 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) ## Test Case Issues +* add test cases for all `ZIP_INCONS` detail errors +* `incons-local-filename-short.zzip` doesn't test short filename, since extra fields fail to parse. * test error cases with special source - tell it which command should fail - use it both as source for `zip_add` and `zip_open_from_source` @@ -113,14 +129,14 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) - state of source (opened, EOF reached, ...) * test for zipcmp reading directory (requires fts) * add test case for clone with files > 4k -* consider testing for malloc/realloc failures +* consider testing for `malloc`/`realloc` failures * Winzip AES support * test cases decryption: <=20, >20, stat for both * test cases encryption: no password, default password, file-specific password, 128/192/256, <=20, >20 * support testing on macOS * add test cases for lots of files (including too many) * add test cases for holes (between files, between files and cdir, between cdir and eocd, + zip64 where appropriate) -* test seek in `zip_source_crc()` +* test seek in `zip_source_crc_create()` * test cases for `set_extra*`, `delete_extra*`, `*extra_field*` * test cases for in memory archives * add @@ -150,7 +166,7 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) * close * zipcmp copy expected * remove copy -* (`error_get) +* (`error_get`) * (`error_get_sys_type`) * (`error_to_str`) * (`extra_fields`) @@ -170,3 +186,4 @@ const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp) * I/O abstraction layer * `zip_open_from_source` * read two zip entries interleaved +* test `zip_file_is_seekable` (via `ziptool`?) diff --git a/core/deps/libzip/android/do.sh b/core/deps/libzip/android/do.sh index c4641c9f2..0c72242af 100644 --- a/core/deps/libzip/android/do.sh +++ b/core/deps/libzip/android/do.sh @@ -20,7 +20,7 @@ build_it() want_shared=$1 cmake -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=../../${INSTALL_DIR}/${ANDROID_TARGET_PLATFORM} \ + -DCMAKE_INSTALL_PREFIX:PATH=$(pwd)/../../${INSTALL_DIR}/${ANDROID_TARGET_PLATFORM} \ -DANDROID_ABI=${ANDROID_TARGET_PLATFORM} \ -DENABLE_OPENSSL:BOOL=OFF \ -DENABLE_COMMONCRYPTO:BOOL=OFF \ diff --git a/core/deps/libzip/android/readme.txt b/core/deps/libzip/android/readme.txt index aa69fbd45..dadc4b479 100644 --- a/core/deps/libzip/android/readme.txt +++ b/core/deps/libzip/android/readme.txt @@ -8,3 +8,6 @@ Prerequisites for the development machine - see docker/Dockerfile You can either set you host machine up with these prerequisites or simply use docker (in which case you need not install anything on your host machine except docker itself). See "Usage" in docker/Dockerfile for detailed instructions. + + +Please note: The libzip development team does not use Android, so this script is provided as is, as we cannot properly maintain it. We will, however, gladly accept fixes and try to work with users to resolve any issues they may have. diff --git a/core/deps/libzip/appveyor.yml b/core/deps/libzip/appveyor.yml new file mode 100644 index 000000000..609f1a60a --- /dev/null +++ b/core/deps/libzip/appveyor.yml @@ -0,0 +1,90 @@ +os: +- Visual Studio 2019 + +environment: + PATH: C:\Python311-x64\Scripts;C:\Python311-arm\Scripts;$(PATH) + matrix: + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: x64 + TRIPLET: x64-windows + CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" + CMAKE_CONFIG: Release + RUN_TESTS: yes + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: x64 + TRIPLET: x64-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: Win32 + TRIPLET: x86-windows + CMAKE_OPTS: "-DBUILD_SHARED_LIBS=off" + CMAKE_CONFIG: Release + RUN_TESTS: yes + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: Win32 + TRIPLET: x86-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: ARM + TRIPLET: arm-windows + CMAKE_OPTS: "-DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: ARM + TRIPLET: arm-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: ARM64 + TRIPLET: arm64-windows + CMAKE_OPTS: "-DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + - GENERATOR: "Visual Studio 16 2019" + PLATFORM: ARM64 + TRIPLET: arm64-uwp + CMAKE_OPTS: "-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DENABLE_OPENSSL=off" + CMAKE_CONFIG: Release + RUN_TESTS: no + TOXENV: py311 + +before_build: + cmd: >- + py -m pip install nihtest + + vcpkg install zlib:%TRIPLET% bzip2:%TRIPLET% liblzma:%TRIPLET% zstd:%TRIPLET% + + mkdir build + + cd build + + cmake -DCMAKE_TOOLCHAIN_FILE=C:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake .. -G "%GENERATOR%" -A "%PLATFORM%" %CMAKE_OPTS% + + appveyor PushArtifact config.h + + appveyor PushArtifact CMakeCache.txt + +build_script: + cmd: >- + cmake --build . --config %CMAKE_CONFIG% --target INSTALL + + cmake --build . --config %CMAKE_CONFIG% + +test_script: + cmd: >- + set VERBOSE=yes + + IF %RUN_TESTS%==yes ( ctest -C %CMAKE_CONFIG% --output-on-failure ) diff --git a/core/deps/libzip/cmake-config.h.in b/core/deps/libzip/cmake-config.h.in index b234acba9..630ed23f6 100644 --- a/core/deps/libzip/cmake-config.h.in +++ b/core/deps/libzip/cmake-config.h.in @@ -4,6 +4,7 @@ #include "zipconf.h" #endif /* BEGIN DEFINES */ +#cmakedefine ENABLE_FDOPEN #cmakedefine HAVE___PROGNAME #cmakedefine HAVE__CLOSE #cmakedefine HAVE__DUP @@ -11,11 +12,12 @@ #cmakedefine HAVE__FILENO #cmakedefine HAVE__SETMODE #cmakedefine HAVE__SNPRINTF +#cmakedefine HAVE__SNPRINTF_S +#cmakedefine HAVE__SNWPRINTF_S #cmakedefine HAVE__STRDUP #cmakedefine HAVE__STRICMP #cmakedefine HAVE__STRTOI64 #cmakedefine HAVE__STRTOUI64 -#cmakedefine HAVE__UMASK #cmakedefine HAVE__UNLINK #cmakedefine HAVE_ARC4RANDOM #cmakedefine HAVE_CLONEFILE @@ -23,6 +25,7 @@ #cmakedefine HAVE_CRYPTO #cmakedefine HAVE_FICLONERANGE #cmakedefine HAVE_FILENO +#cmakedefine HAVE_FCHMOD #cmakedefine HAVE_FSEEKO #cmakedefine HAVE_FTELLO #cmakedefine HAVE_GETPROGNAME @@ -31,14 +34,21 @@ #cmakedefine HAVE_LIBLZMA #cmakedefine HAVE_LIBZSTD #cmakedefine HAVE_LOCALTIME_R +#cmakedefine HAVE_LOCALTIME_S +#cmakedefine HAVE_MEMCPY_S #cmakedefine HAVE_MBEDTLS #cmakedefine HAVE_MKSTEMP #cmakedefine HAVE_NULLABLE #cmakedefine HAVE_OPENSSL #cmakedefine HAVE_SETMODE +#cmakedefine HAVE_SNPRINTF +#cmakedefine HAVE_SNPRINTF_S #cmakedefine HAVE_STRCASECMP #cmakedefine HAVE_STRDUP +#cmakedefine HAVE_STRERROR_S +#cmakedefine HAVE_STRERRORLEN_S #cmakedefine HAVE_STRICMP +#cmakedefine HAVE_STRNCPY_S #cmakedefine HAVE_STRTOLL #cmakedefine HAVE_STRTOULL #cmakedefine HAVE_STRUCT_TM_TM_ZONE diff --git a/core/deps/libzip/cmake/Dist.cmake b/core/deps/libzip/cmake/Dist.cmake index 829112f44..d2adf9f6c 100644 --- a/core/deps/libzip/cmake/Dist.cmake +++ b/core/deps/libzip/cmake/Dist.cmake @@ -1,6 +1,6 @@ # Copyright (C) 2020 Dieter Baron and Thomas Klausner # -# The authors can be contacted at +# The authors can be contacted at # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -55,14 +55,14 @@ function(Dist ARCHIVE_NAME) if(NOT TARGET dist AND NOT TARGET distcheck) add_custom_target(dist COMMAND git config tar.tar.xz.command "xz -c" - COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.gz HEAD - COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${ARCHIVE_NAME}.tar.xz HEAD + COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz HEAD + COMMAND git archive --prefix=${ARCHIVE_NAME}/ -o ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.xz HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) add_custom_target(distcheck COMMAND chmod -R u+w ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest 2>/dev/null || true COMMAND rm -rf ${ARCHIVE_NAME} ${ARCHIVE_NAME}-build ${ARCHIVE_NAME}-dest - COMMAND ${CMAKE_COMMAND} -E tar xf ${ARCHIVE_NAME}.tar.gz + COMMAND ${CMAKE_COMMAND} -E tar xf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz COMMAND chmod -R u-w ${ARCHIVE_NAME} COMMAND mkdir ${ARCHIVE_NAME}-build COMMAND mkdir ${ARCHIVE_NAME}-dest diff --git a/core/deps/libzip/cmake/FindMbedTLS.cmake b/core/deps/libzip/cmake/FindMbedTLS.cmake index 244b0c57c..5a6ef9d73 100644 --- a/core/deps/libzip/cmake/FindMbedTLS.cmake +++ b/core/deps/libzip/cmake/FindMbedTLS.cmake @@ -1,6 +1,6 @@ # Copyright (C) 2020 Dieter Baron and Thomas Klausner # -# The authors can be contacted at +# The authors can be contacted at # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -85,7 +85,16 @@ find_library(MbedTLS_LIBRARY # Extract version information from the header file if(MbedTLS_INCLUDE_DIR) - if(EXISTS ${MbedTLS_INCLUDE_DIR}/mbedtls/version.h) + # for major version 3 + if(EXISTS ${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h) + file(STRINGS ${MbedTLS_INCLUDE_DIR}/mbedtls/build_info.h _ver_line + REGEX "^#define MBEDTLS_VERSION_STRING *\"[0-9]+\\.[0-9]+\\.[0-9]+\"" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" + MbedTLS_VERSION "${_ver_line}") + unset(_ver_line) + # for major version 2 + elseif(EXISTS ${MbedTLS_INCLUDE_DIR}/mbedtls/version.h) file(STRINGS ${MbedTLS_INCLUDE_DIR}/mbedtls/version.h _ver_line REGEX "^#define MBEDTLS_VERSION_STRING *\"[0-9]+\\.[0-9]+\\.[0-9]+\"" LIMIT_COUNT 1) diff --git a/core/deps/libzip/cmake/FindNettle.cmake b/core/deps/libzip/cmake/FindNettle.cmake index 982ac81ee..8f0deb014 100644 --- a/core/deps/libzip/cmake/FindNettle.cmake +++ b/core/deps/libzip/cmake/FindNettle.cmake @@ -1,6 +1,6 @@ # Copyright (C) 2020 Dieter Baron and Thomas Klausner # -# The authors can be contacted at +# The authors can be contacted at # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/cmake/FindZstd.cmake b/core/deps/libzip/cmake/FindZstd.cmake deleted file mode 100644 index a0da50381..000000000 --- a/core/deps/libzip/cmake/FindZstd.cmake +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright (C) 2020 Dieter Baron and Thomas Klausner -# -# The authors can be contacted at -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. The names of the authors may not be used to endorse or promote -# products derived from this software without specific prior -# written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS -# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#[=======================================================================[.rst: -FindZstd -------- - -Finds the Zstandard (zstd) library. - -Imported Targets -^^^^^^^^^^^^^^^^ - -This module provides the following imported targets, if found: - -``Zstd::Zstd`` - The Zstandard library - -Result Variables -^^^^^^^^^^^^^^^^ - -This will define the following variables: - -``Zstd_FOUND`` - True if the system has the Zstandard library. -``Zstd_VERSION`` - The version of the Zstandard library which was found. -``Zstd_INCLUDE_DIRS`` - Include directories needed to use Zstandard. -``Zstd_LIBRARIES`` - Libraries needed to link to Zstandard. - -Cache Variables -^^^^^^^^^^^^^^^ - -The following cache variables may also be set: - -``Zstd_INCLUDE_DIR`` - The directory containing ``zstd.h``. -``Zstd_LIBRARY`` - The path to the Zstandard library. - -#]=======================================================================] - -find_package(PkgConfig) -pkg_check_modules(PC_Zstd QUIET zstd) - -find_path(Zstd_INCLUDE_DIR - NAMES zstd.h - PATHS ${PC_Zstd_INCLUDE_DIRS} -) -find_library(Zstd_LIBRARY - NAMES zstd - PATHS ${PC_Zstd_LIBRARY_DIRS} -) - -# Extract version information from the header file -if(Zstd_INCLUDE_DIR) - file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_major_line - REGEX "^#define ZSTD_VERSION_MAJOR *[0-9]+" - LIMIT_COUNT 1) - string(REGEX MATCH "[0-9]+" - Zstd_MAJOR_VERSION "${_ver_major_line}") - file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_minor_line - REGEX "^#define ZSTD_VERSION_MINOR *[0-9]+" - LIMIT_COUNT 1) - string(REGEX MATCH "[0-9]+" - Zstd_MINOR_VERSION "${_ver_minor_line}") - file(STRINGS ${Zstd_INCLUDE_DIR}/zstd.h _ver_release_line - REGEX "^#define ZSTD_VERSION_RELEASE *[0-9]+" - LIMIT_COUNT 1) - string(REGEX MATCH "[0-9]+" - Zstd_RELEASE_VERSION "${_ver_release_line}") - set(Zstd_VERSION "${Zstd_MAJOR_VERSION}.${Zstd_MINOR_VERSION}.${Zstd_RELEASE_VERSION}") - unset(_ver_major_line) - unset(_ver_minor_line) - unset(_ver_release_line) -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Zstd - FOUND_VAR Zstd_FOUND - REQUIRED_VARS - Zstd_LIBRARY - Zstd_INCLUDE_DIR - VERSION_VAR Zstd_VERSION -) - -if(Zstd_FOUND) - set(Zstd_LIBRARIES ${Zstd_LIBRARY}) - set(Zstd_INCLUDE_DIRS ${Zstd_INCLUDE_DIR}) - set(Zstd_DEFINITIONS ${PC_Zstd_CFLAGS_OTHER}) -endif() - -if(Zstd_FOUND AND NOT TARGET Zstd::Zstd) - add_library(Zstd::Zstd UNKNOWN IMPORTED) - set_target_properties(Zstd::Zstd PROPERTIES - IMPORTED_LOCATION "${Zstd_LIBRARY}" - INTERFACE_COMPILE_OPTIONS "${PC_Zstd_CFLAGS_OTHER}" - INTERFACE_INCLUDE_DIRECTORIES "${Zstd_INCLUDE_DIR}" - ) -endif() - -mark_as_advanced( - Zstd_INCLUDE_DIR - Zstd_LIBRARY -) diff --git a/core/deps/libzip/cmake/Findzstd.cmake b/core/deps/libzip/cmake/Findzstd.cmake new file mode 100644 index 000000000..b389c6b3d --- /dev/null +++ b/core/deps/libzip/cmake/Findzstd.cmake @@ -0,0 +1,186 @@ +# Copyright (C) 2020 Dieter Baron and Thomas Klausner +# +# The authors can be contacted at +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. The names of the authors may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +Findzstd +------- + +Finds the Zstandard (zstd) library. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``zstd::libzstd_shared`` + The shared Zstandard library +``zstd::libzstd_static`` + The shared Zstandard library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``zstd_FOUND`` + True if the system has the Zstandard library. +``zstd_VERSION`` + The version of the Zstandard library which was found. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``zstd_INCLUDE_DIR`` + The directory containing ``zstd.h``. +``zstd_STATIC_LIBRARY`` + The path to the Zstandard static library. +``zstd_SHARED_LIBRARY`` + The path to the Zstandard shared library. +``zstd_DLL`` + The path to the Zstandard DLL. + +#]=======================================================================] + +find_package(PkgConfig) +pkg_check_modules(PC_zstd QUIET libzstd) + +find_path(zstd_INCLUDE_DIR + NAMES zstd.h + HINTS ${PC_zstd_INCLUDE_DIRS} +) + +find_file(zstd_DLL + NAMES libzstd.dll zstd.dll + PATH_SUFFIXES bin + HINTS ${PC_zstd_PREFIX} +) + +# On Windows, we manually define the library names to avoid mistaking the +# implib for the static library +if(zstd_DLL) + set(_zstd_win_static_name zstd-static) + set(_zstd_win_shared_name zstd) +else() + # vcpkg removes the -static suffix in static builds + set(_zstd_win_static_name zstd zstd_static) + set(_zstd_win_shared_name) +endif() + +set(_previous_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) +set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dylib" ".dll.a" ".lib") +find_library(zstd_SHARED_LIBRARY + NAMES zstd ${_zstd_win_shared_name} + HINTS ${PC_zstd_LIBDIR} +) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") +find_library(zstd_STATIC_LIBRARY + NAMES zstd ${_zstd_win_static_name} + HINTS ${PC_zstd_LIBDIR} +) +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_previous_suffixes}) + +# Set zstd_LIBRARY to the shared library or fall back to the static library +if(zstd_SHARED_LIBRARY) + set(_zstd_LIBRARY ${zstd_SHARED_LIBRARY}) +else() + set(_zstd_LIBRARY ${zstd_STATIC_LIBRARY}) +endif() + +# Extract version information from the header file +if(zstd_INCLUDE_DIR) + file(STRINGS ${zstd_INCLUDE_DIR}/zstd.h _ver_major_line + REGEX "^#define ZSTD_VERSION_MAJOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + zstd_MAJOR_VERSION "${_ver_major_line}") + file(STRINGS ${zstd_INCLUDE_DIR}/zstd.h _ver_minor_line + REGEX "^#define ZSTD_VERSION_MINOR *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + zstd_MINOR_VERSION "${_ver_minor_line}") + file(STRINGS ${zstd_INCLUDE_DIR}/zstd.h _ver_release_line + REGEX "^#define ZSTD_VERSION_RELEASE *[0-9]+" + LIMIT_COUNT 1) + string(REGEX MATCH "[0-9]+" + zstd_RELEASE_VERSION "${_ver_release_line}") + set(Zstd_VERSION "${zstd_MAJOR_VERSION}.${zstd_MINOR_VERSION}.${zstd_RELEASE_VERSION}") + unset(_ver_major_line) + unset(_ver_minor_line) + unset(_ver_release_line) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(zstd + FOUND_VAR zstd_FOUND + REQUIRED_VARS + _zstd_LIBRARY + zstd_INCLUDE_DIR + VERSION_VAR zstd_VERSION +) + +if(zstd_FOUND AND zstd_SHARED_LIBRARY AND NOT TARGET zstd::libzstd_shared) + add_library(zstd::libzstd_shared SHARED IMPORTED) + if(WIN32) + set_target_properties(zstd::libzstd_shared PROPERTIES + IMPORTED_LOCATION "${zstd_DLL}" + IMPORTED_IMPLIB "${zstd_SHARED_LIBRARY}" + ) + else() + set_target_properties(zstd::libzstd_shared PROPERTIES + IMPORTED_LOCATION "${zstd_SHARED_LIBRARY}" + ) + endif() + + set_target_properties(zstd::libzstd_shared PROPERTIES + INTERFACE_COMPILE_OPTIONS "${PC_zstd_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${zstd_INCLUDE_DIR}" + ) +endif() + +if(zstd_FOUND AND zstd_STATIC_LIBRARY AND NOT TARGET zstd::libzstd_static) + add_library(zstd::libzstd_static STATIC IMPORTED) + set_target_properties(zstd::libzstd_static PROPERTIES + IMPORTED_LOCATION "${zstd_STATIC_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_zstd_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${zstd_INCLUDE_DIR}" + ) +endif() + +mark_as_advanced( + zstd_INCLUDE_DIR + zstd_DLL + zstd_SHARED_LIBRARY + zstd_STATIC_LIBRARY +) diff --git a/core/deps/libzip/cmake/GenerateZipErrorStrings.cmake b/core/deps/libzip/cmake/GenerateZipErrorStrings.cmake new file mode 100644 index 000000000..550412b6c --- /dev/null +++ b/core/deps/libzip/cmake/GenerateZipErrorStrings.cmake @@ -0,0 +1,47 @@ +# create zip_err_str.c from zip.h and zipint.h +file(READ ${PROJECT_SOURCE_DIR}/lib/zip.h zip_h) +string(REGEX MATCHALL "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" zip_h_err ${zip_h}) +file(READ ${PROJECT_SOURCE_DIR}/lib/zipint.h zipint_h) +string(REGEX MATCHALL "#define ZIP_ER_DETAIL_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" zipint_h_err ${zipint_h}) +set(zip_err_str [=[ +/* + This file was generated automatically by CMake + from zip.h and zipint.h\; make changes there. +*/ + +#include "zipint.h" + +#define L ZIP_ET_LIBZIP +#define N ZIP_ET_NONE +#define S ZIP_ET_SYS +#define Z ZIP_ET_ZLIB + +#define E ZIP_DETAIL_ET_ENTRY +#define G ZIP_DETAIL_ET_GLOBAL + +const struct _zip_err_info _zip_err_str[] = { +]=]) +set(zip_err_type) +foreach(errln ${zip_h_err}) + string(REGEX MATCH "#define ZIP_ER_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) + string(REGEX MATCH "([L|N|S|Z]+) ([-0-9a-zA-Z,, ']*)" err_t_tt "${CMAKE_MATCH_3}") + string(STRIP "${CMAKE_MATCH_2}" err_t_tt) + string(APPEND zip_err_str " { ${CMAKE_MATCH_1}, \"${err_t_tt}\" },\n") +endforeach() +string(APPEND zip_err_str [=[}\; + +const int _zip_err_str_count = sizeof(_zip_err_str)/sizeof(_zip_err_str[0])\; + +const struct _zip_err_info _zip_err_details[] = { +]=]) +foreach(errln ${zipint_h_err}) + string(REGEX MATCH "#define ZIP_ER_DETAIL_([A-Z0-9_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z, ']*)/" err_t_tt ${errln}) + string(REGEX MATCH "([E|G]+) ([-0-9a-zA-Z, ']*)" err_t_tt "${CMAKE_MATCH_3}") + string(STRIP "${CMAKE_MATCH_2}" err_t_tt) + string(APPEND zip_err_str " { ${CMAKE_MATCH_1}, \"${err_t_tt}\" },\n") +endforeach() +string(APPEND zip_err_str [=[}\; + +const int _zip_err_details_count = sizeof(_zip_err_details)/sizeof(_zip_err_details[0])\; +]=]) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c ${zip_err_str}) diff --git a/core/deps/libzip/developer-xcode/Info.plist b/core/deps/libzip/developer-xcode/Info.plist deleted file mode 100644 index 4cc3a77e5..000000000 --- a/core/deps/libzip/developer-xcode/Info.plist +++ /dev/null @@ -1,46 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - PACKAGE_VERSION - CFBundleSignature - ???? - CFBundleVersion - 1 - CFPlugInDynamicRegisterFunction - - CFPlugInDynamicRegistration - NO - CFPlugInFactories - - 00000000-0000-0000-0000-000000000000 - MyFactoryFunction - - CFPlugInTypes - - 00000000-0000-0000-0000-000000000000 - - 00000000-0000-0000-0000-000000000000 - - - CFPlugInUnloadFunction - - NSHumanReadableCopyright - Copyright © 2014 Dieter Baron and Thomas Klausner - - diff --git a/core/deps/libzip/developer-xcode/README Xcode Project.md b/core/deps/libzip/developer-xcode/README Xcode Project.md deleted file mode 100644 index 8ae1f65bb..000000000 --- a/core/deps/libzip/developer-xcode/README Xcode Project.md +++ /dev/null @@ -1,6 +0,0 @@ -This Xcode project is for development only, it is not meant to -compile production builds. - -It is used internally to develop libzip and to run Xcode's diagnostic -tools on the source, and is not always kept up-to-date. Please use -the standard build method instead. diff --git a/core/deps/libzip/developer-xcode/config.h b/core/deps/libzip/developer-xcode/config.h deleted file mode 100644 index a89b2fe2f..000000000 --- a/core/deps/libzip/developer-xcode/config.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef HAD_CONFIG_H -#define HAD_CONFIG_H -#ifndef _HAD_ZIPCONF_H -#include "zipconf.h" -#endif -/* BEGIN DEFINES */ -/* #undef HAVE___PROGNAME */ -/* #undef HAVE__CHMOD */ -/* #undef HAVE__CLOSE */ -/* #undef HAVE__DUP */ -/* #undef HAVE__FDOPEN */ -/* #undef HAVE__FILENO */ -/* #undef HAVE__OPEN */ -/* #undef HAVE__SETMODE */ -/* #undef HAVE__SNPRINTF */ -/* #undef HAVE__STRDUP */ -/* #undef HAVE__STRICMP */ -/* #undef HAVE__STRTOI64 */ -/* #undef HAVE__STRTOUI64 */ -/* #undef HAVE__UMASK */ -/* #undef HAVE__UNLINK */ -#define HAVE_ARC4RANDOM -#define HAVE_CLONEFILE -#define HAVE_COMMONCRYPTO -#define HAVE_CRYPTO -/* #undef HAVE_FICLONERANGE */ -#define HAVE_FILENO -#define HAVE_FSEEKO -#define HAVE_FTELLO -#define HAVE_GETPROGNAME -/* #undef HAVE_GNUTLS */ -#define HAVE_LIBBZ2 -#define HAVE_LIBLZMA -#define HAVE_LOCALTIME_R -/* #undef HAVE_MBEDTLS */ -/* #undef HAVE_MKSTEMP */ -#define HAVE_NULLABLE -#define HAVE_OPEN -/* #undef HAVE_OPENSSL */ -#define HAVE_SETMODE -#define HAVE_SSIZE_T_LIBZIP -#define HAVE_STRCASECMP -#define HAVE_STRDUP -/* #undef HAVE_STRICMP */ -#define HAVE_STRTOLL -#define HAVE_STRTOULL -/* #undef HAVE_STRUCT_TM_TM_ZONE */ -#define HAVE_STDBOOL_H -#define HAVE_STRINGS_H -#define HAVE_UNISTD_H -/* #undef HAVE_WINDOWS_CRYPTO */ -/* #undef __INT8_LIBZIP */ -#define INT8_T_LIBZIP 1 -#define UINT8_T_LIBZIP 1 -/* #undef __INT16_LIBZIP */ -#define INT16_T_LIBZIP 2 -#define UINT16_T_LIBZIP 2 -/* #undef __INT32_LIBZIP */ -#define INT32_T_LIBZIP 4 -#define UINT32_T_LIBZIP 4 -/* #undef __INT64_LIBZIP */ -#define INT64_T_LIBZIP 8 -#define UINT64_T_LIBZIP 8 -#define SHORT_LIBZIP 2 -#define INT_LIBZIP 4 -#define LONG_LIBZIP 8 -#define LONG_LONG_LIBZIP 8 -#define SIZEOF_OFF_T 8 -#define SIZE_T_LIBZIP 8 -#define SSIZE_T_LIBZIP 8 -/* #undef HAVE_DIRENT_H */ -#define HAVE_FTS_H -/* #undef HAVE_NDIR_H */ -/* #undef HAVE_SYS_DIR_H */ -/* #undef HAVE_SYS_NDIR_H */ -/* #undef WORDS_BIGENDIAN */ -#define HAVE_SHARED -/* END DEFINES */ -#define PACKAGE "libzip" -#define VERSION "1.5.2a" - -#ifndef HAVE_SSIZE_T_LIBZIP -#if SIZE_T_LIBZIP == INT_LIBZIP -typedef int ssize_t; -#elif SIZE_T_LIBZIP == LONG_LIBZIP -typedef long ssize_t; -#elif SIZE_T_LIBZIP == LONG_LONG_LIBZIP -typedef long long ssize_t; -#else -#error no suitable type for ssize_t found -#endif -#endif - -#endif /* HAD_CONFIG_H */ diff --git a/core/deps/libzip/developer-xcode/extract-version.sh b/core/deps/libzip/developer-xcode/extract-version.sh deleted file mode 100644 index 85e83fcb3..000000000 --- a/core/deps/libzip/developer-xcode/extract-version.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# Replace the value for PLIST_KEY with the resolved definition from the header file that was passed in. - -SOURCE_HEADER_FILE_PATH=$1 -SOURCE_PLIST_PATH=$2 - -PLIST_KEY="CFBundleShortVersionString" - -VERSION_KEY=`/usr/libexec/PlistBuddy -c "Print :${PLIST_KEY}" "${SOURCE_PLIST_PATH}"` - -#echo "Key: ${VERSION_KEY}" - -VERSION_NUM=`cat "${SOURCE_HEADER_FILE_PATH}" | sed -n "s|#define ${VERSION_KEY} \"\(.*\)\".*|\1|p"` - -#echo "Value: ${VERSION_NUM}" - -TARGET_PLIST_PATH="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" - -/usr/libexec/PlistBuddy -c "Set :${PLIST_KEY} ${VERSION_NUM}" "${TARGET_PLIST_PATH}" diff --git a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.pbxproj b/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.pbxproj deleted file mode 100644 index 8e7d23b2f..000000000 --- a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2934 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 4B01D72815B2F5A2002D5007 /* command line tools */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 4B01D72915B2F5A2002D5007 /* Build configuration list for PBXAggregateTarget "command line tools" */; - buildPhases = ( - ); - dependencies = ( - 4B2CADAC1C50D57800291DE6 /* PBXTargetDependency */, - 4B01D72D15B2F5AC002D5007 /* PBXTargetDependency */, - 4B01D72F15B2F5AC002D5007 /* PBXTargetDependency */, - ); - name = "command line tools"; - productName = "command line tools"; - }; - 4B54447915C977A20067BA33 /* all */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 4B54447C15C977A20067BA33 /* Build configuration list for PBXAggregateTarget "all" */; - buildPhases = ( - ); - dependencies = ( - 4BCF6A7B1C3BDDFF00F036E9 /* PBXTargetDependency */, - 4B54447F15C977AF0067BA33 /* PBXTargetDependency */, - 4B54448115C977B10067BA33 /* PBXTargetDependency */, - ); - name = all; - productName = all; - }; - 4BACD5A715BC2D8200920691 /* test programs */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 4BACD5AE15BC2D8200920691 /* Build configuration list for PBXAggregateTarget "test programs" */; - buildPhases = ( - ); - dependencies = ( - 4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */, - 4BD6CB6E19E71D0800710654 /* PBXTargetDependency */, - 4BACD65515BC303B00920691 /* PBXTargetDependency */, - 4BACD65715BC303B00920691 /* PBXTargetDependency */, - 4BACD65915BC303B00920691 /* PBXTargetDependency */, - 4BACD66915BC303B00920691 /* PBXTargetDependency */, - 4B51DDC51FDAE2F000C5CA85 /* PBXTargetDependency */, - ); - name = "test programs"; - productName = "test programs"; - }; - 4BCF6A681C3BDDD500F036E9 /* examples */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 4BCF6A751C3BDDD500F036E9 /* Build configuration list for PBXAggregateTarget "examples" */; - buildPhases = ( - ); - dependencies = ( - 4BCF6A791C3BDDF900F036E9 /* PBXTargetDependency */, - ); - name = examples; - productName = examples; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 3D7E35431B33063F00022624 /* in-memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 3D7E35401B33063600022624 /* in-memory.c */; }; - 3D7E35461B33064B00022624 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 3D7E35481B33076C00022624 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D7E35471B33076C00022624 /* libz.dylib */; }; - 3D7E35491B330AD500022624 /* zip_source_is_deleted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */; }; - 3D9284821C309510001EABA7 /* zip_hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 3D9284801C309510001EABA7 /* zip_hash.c */; }; - 4B00CA24242F59D700E0B71C /* zip_source_pkware_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B00CA21242F59D700E0B71C /* zip_source_pkware_decode.c */; }; - 4B00CA25242F59D700E0B71C /* zip_pkware.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B00CA22242F59D700E0B71C /* zip_pkware.c */; }; - 4B00CA26242F59D700E0B71C /* zip_source_pkware_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B00CA23242F59D700E0B71C /* zip_source_pkware_encode.c */; }; - 4B00CA2D242F5C2500E0B71C /* set_file_dostime.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA27242F5C2500E0B71C /* set_file_dostime.test */; }; - 4B00CA2E242F5C2500E0B71C /* cancel_45.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA28242F5C2500E0B71C /* cancel_45.test */; }; - 4B00CA2F242F5C2500E0B71C /* set_compression_store_to_xz.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA29242F5C2500E0B71C /* set_compression_store_to_xz.test */; }; - 4B00CA30242F5C2500E0B71C /* encryption-nonrandom-pkware.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA2A242F5C2500E0B71C /* encryption-nonrandom-pkware.test */; }; - 4B00CA31242F5C2500E0B71C /* cancel_90.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA2B242F5C2500E0B71C /* cancel_90.test */; }; - 4B00CA32242F5C2500E0B71C /* set_compression_xz_to_store.test in Resources */ = {isa = PBXBuildFile; fileRef = 4B00CA2C242F5C2500E0B71C /* set_compression_xz_to_store.test */; }; - 4B01D6A615B2F46B002D5007 /* zip_add_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F115B1B25E00236D3C /* zip_add_dir.c */; }; - 4B01D6A715B2F46B002D5007 /* zip_add_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F215B1B25E00236D3C /* zip_add_entry.c */; }; - 4B01D6A815B2F46B002D5007 /* zip_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F315B1B25E00236D3C /* zip_add.c */; }; - 4B01D6A915B2F46B002D5007 /* zip_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F415B1B25E00236D3C /* zip_close.c */; }; - 4B01D6AA15B2F46B002D5007 /* zip_delete.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F515B1B25E00236D3C /* zip_delete.c */; }; - 4B01D6AB15B2F46B002D5007 /* zip_dir_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F615B1B25E00236D3C /* zip_dir_add.c */; }; - 4B01D6AC15B2F46B002D5007 /* zip_dirent.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F715B1B25E00236D3C /* zip_dirent.c */; }; - 4B01D6AD15B2F46B002D5007 /* zip_discard.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F815B1B25E00236D3C /* zip_discard.c */; }; - 4B01D6AE15B2F46B002D5007 /* zip_entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71F915B1B25E00236D3C /* zip_entry.c */; }; - 4B01D6B015B2F46B002D5007 /* zip_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */; }; - 4B01D6B115B2F46B002D5007 /* zip_error_get_sys_type.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */; }; - 4B01D6B215B2F46B002D5007 /* zip_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FD15B1B25E00236D3C /* zip_error_get.c */; }; - 4B01D6B315B2F46B002D5007 /* zip_error_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */; }; - 4B01D6B415B2F46B002D5007 /* zip_error_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */; }; - 4B01D6B515B2F46B002D5007 /* zip_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720015B1B25E00236D3C /* zip_error.c */; }; - 4B01D6B615B2F46B002D5007 /* zip_extra_field_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */; }; - 4B01D6B715B2F46B002D5007 /* zip_extra_field.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720215B1B25E00236D3C /* zip_extra_field.c */; }; - 4B01D6B815B2F46B002D5007 /* zip_fclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720315B1B25E00236D3C /* zip_fclose.c */; }; - 4B01D6B915B2F46B002D5007 /* zip_fdopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720415B1B25E00236D3C /* zip_fdopen.c */; }; - 4B01D6BA15B2F46B002D5007 /* zip_file_add.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720515B1B25E00236D3C /* zip_file_add.c */; }; - 4B01D6BB15B2F46B002D5007 /* zip_file_error_clear.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */; }; - 4B01D6BC15B2F46B002D5007 /* zip_file_error_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720715B1B25E00236D3C /* zip_file_error_get.c */; }; - 4B01D6BD15B2F46B002D5007 /* zip_file_get_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */; }; - 4B01D6BE15B2F46B002D5007 /* zip_file_get_offset.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */; }; - 4B01D6BF15B2F46B002D5007 /* zip_file_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720A15B1B25E00236D3C /* zip_file_rename.c */; }; - 4B01D6C015B2F46B002D5007 /* zip_file_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720B15B1B25E00236D3C /* zip_file_replace.c */; }; - 4B01D6C115B2F46B002D5007 /* zip_file_set_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */; }; - 4B01D6C215B2F46B002D5007 /* zip_file_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */; }; - 4B01D6C415B2F46B002D5007 /* zip_fopen_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */; }; - 4B01D6C515B2F46B002D5007 /* zip_fopen_index_encrypted.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */; }; - 4B01D6C615B2F46B002D5007 /* zip_fopen_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721115B1B25E00236D3C /* zip_fopen_index.c */; }; - 4B01D6C715B2F46B002D5007 /* zip_fopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721215B1B25E00236D3C /* zip_fopen.c */; }; - 4B01D6C815B2F46B002D5007 /* zip_fread.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721315B1B25E00236D3C /* zip_fread.c */; }; - 4B01D6C915B2F46B002D5007 /* zip_get_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */; }; - 4B01D6CA15B2F46B002D5007 /* zip_get_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */; }; - 4B01D6CC15B2F46B002D5007 /* zip_get_encryption_implementation.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */; }; - 4B01D6CD15B2F46B002D5007 /* zip_get_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */; }; - 4B01D6CE15B2F46B002D5007 /* zip_get_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721915B1B25E00236D3C /* zip_get_name.c */; }; - 4B01D6CF15B2F46B002D5007 /* zip_get_num_entries.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */; }; - 4B01D6D015B2F46B002D5007 /* zip_get_num_files.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */; }; - 4B01D6D115B2F46B002D5007 /* zip_memdup.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721C15B1B25E00236D3C /* zip_memdup.c */; }; - 4B01D6D215B2F46B002D5007 /* zip_name_locate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721D15B1B25E00236D3C /* zip_name_locate.c */; }; - 4B01D6D315B2F46B002D5007 /* zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721E15B1B25E00236D3C /* zip_new.c */; }; - 4B01D6D415B2F46B002D5007 /* zip_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC721F15B1B25E00236D3C /* zip_open.c */; }; - 4B01D6D515B2F46B002D5007 /* zip_rename.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722015B1B25E00236D3C /* zip_rename.c */; }; - 4B01D6D615B2F46B002D5007 /* zip_replace.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722115B1B25E00236D3C /* zip_replace.c */; }; - 4B01D6D715B2F46B002D5007 /* zip_set_archive_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */; }; - 4B01D6D815B2F46B002D5007 /* zip_set_archive_flag.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */; }; - 4B01D6D915B2F46B002D5007 /* zip_set_default_password.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722415B1B25E00236D3C /* zip_set_default_password.c */; }; - 4B01D6DA15B2F46B002D5007 /* zip_set_file_comment.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */; }; - 4B01D6DB15B2F46B002D5007 /* zip_set_file_compression.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */; }; - 4B01D6DC15B2F46B002D5007 /* zip_set_name.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722715B1B25E00236D3C /* zip_set_name.c */; }; - 4B01D6DD15B2F46B002D5007 /* zip_source_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722815B1B25E00236D3C /* zip_source_buffer.c */; }; - 4B01D6DE15B2F46B002D5007 /* zip_source_close.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722915B1B25E00236D3C /* zip_source_close.c */; }; - 4B01D6DF15B2F46B002D5007 /* zip_source_crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722A15B1B25E00236D3C /* zip_source_crc.c */; }; - 4B01D6E115B2F46B002D5007 /* zip_source_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722C15B1B25E00236D3C /* zip_source_error.c */; }; - 4B01D6E415B2F46B002D5007 /* zip_source_free.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC722F15B1B25E00236D3C /* zip_source_free.c */; }; - 4B01D6E515B2F46B002D5007 /* zip_source_function.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723015B1B25E00236D3C /* zip_source_function.c */; }; - 4B01D6E615B2F46B002D5007 /* zip_source_layered.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723115B1B25E00236D3C /* zip_source_layered.c */; }; - 4B01D6E715B2F46B002D5007 /* zip_source_open.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723215B1B25E00236D3C /* zip_source_open.c */; }; - 4B01D6EA15B2F46B002D5007 /* zip_source_read.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723515B1B25E00236D3C /* zip_source_read.c */; }; - 4B01D6EB15B2F46B002D5007 /* zip_source_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723615B1B25E00236D3C /* zip_source_stat.c */; }; - 4B01D6EC15B2F46B002D5007 /* zip_source_window.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723715B1B25E00236D3C /* zip_source_window.c */; }; - 4B01D6ED15B2F46B002D5007 /* zip_source_zip_new.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */; }; - 4B01D6EE15B2F46B002D5007 /* zip_source_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723915B1B25E00236D3C /* zip_source_zip.c */; }; - 4B01D6EF15B2F46B002D5007 /* zip_stat_index.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723A15B1B25E00236D3C /* zip_stat_index.c */; }; - 4B01D6F015B2F46B002D5007 /* zip_stat_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723B15B1B25E00236D3C /* zip_stat_init.c */; }; - 4B01D6F115B2F46B002D5007 /* zip_stat.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723C15B1B25E00236D3C /* zip_stat.c */; }; - 4B01D6F215B2F46B002D5007 /* zip_strerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723D15B1B25E00236D3C /* zip_strerror.c */; }; - 4B01D6F315B2F46B002D5007 /* zip_string.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723E15B1B25E00236D3C /* zip_string.c */; }; - 4B01D6F415B2F46B002D5007 /* zip_unchange_all.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */; }; - 4B01D6F515B2F46B002D5007 /* zip_unchange_archive.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */; }; - 4B01D6F615B2F46B002D5007 /* zip_unchange_data.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724115B1B25E00236D3C /* zip_unchange_data.c */; }; - 4B01D6F715B2F46B002D5007 /* zip_unchange.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724215B1B25E00236D3C /* zip_unchange.c */; }; - 4B01D6F815B2F46B002D5007 /* zip_utf-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC724315B1B25E00236D3C /* zip_utf-8.c */; }; - 4B01D70715B2F4C5002D5007 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4B01D70915B2F4CF002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4B01D70D15B2F4EB002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4B01D70E15B2F4EB002D5007 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4B01D72515B2F57B002D5007 /* zipcmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B01D72115B2F572002D5007 /* zipcmp.c */; }; - 4B01D72615B2F57F002D5007 /* zipmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B01D72215B2F572002D5007 /* zipmerge.c */; }; - 4B01D73215B2F5EE002D5007 /* zipconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BDC729E15B1B4E900236D3C /* zipconf.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4B01D73C15B2F6AF002D5007 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4B0454BA1E8E3E08002FA1F9 /* zip_source_compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0454B61E8E3DF7002FA1F9 /* zip_source_compress.c */; }; - 4B0454BC1E8E3E24002FA1F9 /* zip_algorithm_bzip2.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0454B41E8E3DF7002FA1F9 /* zip_algorithm_bzip2.c */; }; - 4B0454BD1E8E3E24002FA1F9 /* zip_algorithm_deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B0454B51E8E3DF7002FA1F9 /* zip_algorithm_deflate.c */; }; - 4B3A5F521DF96EB4005A53A1 /* zip_fseek.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B3A5F4D1DF96D83005A53A1 /* zip_fseek.c */; }; - 4B3A5F531DF96EB4005A53A1 /* zip_ftell.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B3A5F4E1DF96D83005A53A1 /* zip_ftell.c */; }; - 4B3FAE802385C5CC00192D6A /* zip_algorithm_xz.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B3FAE7F2385C5A300192D6A /* zip_algorithm_xz.c */; }; - 4B3FAE822385C79200192D6A /* liblzma.5.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B3FAE812385C79200192D6A /* liblzma.5.dylib */; }; - 4B5169A822A7993E00AA4340 /* zip_mkstempm.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B5169A722A7993D00AA4340 /* zip_mkstempm.c */; }; - 4B51DDBA1FDAE20A00C5CA85 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4B51DDBB1FDAE20A00C5CA85 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4B51DDC11FDAE25B00C5CA85 /* ziptool.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57C15BC2AEF00920691 /* ziptool.c */; }; - 4B51DDC21FDAE25F00C5CA85 /* ziptool_regress.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B51DDB31FDAE1DB00C5CA85 /* ziptool_regress.c */; }; - 4B51DDC31FDAE26600C5CA85 /* source_hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5C19E6A5D900710654 /* source_hole.c */; }; - 4B542C2C22B12E3900960B38 /* zip_random_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B81E3D688C00C36873 /* zip_random_unix.c */; }; - 4B5D0CD5244B154E006C2E93 /* zip_source_get_file_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B5D0CD4244B154E006C2E93 /* zip_source_get_file_attributes.c */; }; - 4B69E6EE2032F18B0001EEE7 /* zip_winzip_aes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B69E6ED2032F1870001EEE7 /* zip_winzip_aes.c */; }; - 4B82CED519915F360097BC18 /* zip_file_set_mtime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B82CED319915F360097BC18 /* zip_file_set_mtime.c */; }; - 4B908F532385BE6D00886355 /* zip_libzip_version.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B908F502385BE6C00886355 /* zip_libzip_version.c */; }; - 4B908F552385BE6D00886355 /* zip_source_accept_empty.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B908F522385BE6D00886355 /* zip_source_accept_empty.c */; }; - 4B93995A24631B3E00AEBDA4 /* zip_source_file_stdio_named.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B93995524631B3D00AEBDA4 /* zip_source_file_stdio_named.c */; }; - 4B93995B24631B3E00AEBDA4 /* zip_source_file_common.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B93995624631B3E00AEBDA4 /* zip_source_file_common.c */; }; - 4B93995C24631B3E00AEBDA4 /* zip_source_file_stdio.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B93995724631B3E00AEBDA4 /* zip_source_file_stdio.c */; }; - 4B93995D24631B3E00AEBDA4 /* zip_source_file_stdio.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B93995824631B3E00AEBDA4 /* zip_source_file_stdio.h */; }; - 4B93995E24631B3E00AEBDA4 /* zip_source_file.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B93995924631B3E00AEBDA4 /* zip_source_file.h */; }; - 4B972050188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */; }; - 4B972052188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */; }; - 4B9E577C24C7202000CEE0D6 /* zip_algorithm_zstd.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B9E577A24C7026B00CEE0D6 /* zip_algorithm_zstd.c */; }; - 4B9E578824C9770C00CEE0D6 /* libzstd.1.4.5.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B9E578724C9770C00CEE0D6 /* libzstd.1.4.5.dylib */; }; - 4B9E578A24C9779900CEE0D6 /* zip_err_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B9E578924C9779900CEE0D6 /* zip_err_str.c */; }; - 4BACD59315BC2CFA00920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BACD59415BC2D0800920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BACD5BB15BC2DC900920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BACD5BC15BC2DC900920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BACD5C315BC2DE000920691 /* add_from_filep.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57715BC2AEF00920691 /* add_from_filep.c */; }; - 4BACD5CA15BC2DF200920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BACD5CB15BC2DF200920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BACD5D215BC2EFE00920691 /* fopen_unchanged.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */; }; - 4BACD5D915BC2F3700920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BACD5DA15BC2F3700920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BACD5E115BC2F4500920691 /* fread.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD57B15BC2AEF00920691 /* fread.c */; }; - 4BACD64A15BC301300920691 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BACD64B15BC301300920691 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BACD65315BC302500920691 /* tryopen.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BACD58415BC2AEF00920691 /* tryopen.c */; }; - 4BC03FA41FDD6B6F003C7B62 /* zip_source_begin_write_cloning.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BC03FA21FDD6B6F003C7B62 /* zip_source_begin_write_cloning.c */; }; - 4BCB434319E9347E0067FAA3 /* zip_buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCB434119E9347E0067FAA3 /* zip_buffer.c */; }; - 4BCF3022199A2F820064207B /* zip_io_util.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3019199A2F820064207B /* zip_io_util.c */; }; - 4BCF3024199A2F820064207B /* zip_source_begin_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301A199A2F820064207B /* zip_source_begin_write.c */; }; - 4BCF3026199A2F820064207B /* zip_source_commit_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301B199A2F820064207B /* zip_source_commit_write.c */; }; - 4BCF3028199A2F820064207B /* zip_source_rollback_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301C199A2F820064207B /* zip_source_rollback_write.c */; }; - 4BCF302A199A2F820064207B /* zip_source_seek.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301D199A2F820064207B /* zip_source_seek.c */; }; - 4BCF302C199A2F820064207B /* zip_source_supports.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301E199A2F820064207B /* zip_source_supports.c */; }; - 4BCF302E199A2F820064207B /* zip_source_tell.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF301F199A2F820064207B /* zip_source_tell.c */; }; - 4BCF3030199A2F820064207B /* zip_source_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3020199A2F820064207B /* zip_source_write.c */; }; - 4BCF3033199ABD3A0064207B /* zip_source_remove.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3031199ABD3A0064207B /* zip_source_remove.c */; }; - 4BCF3037199ABDDA0064207B /* zip_source_seek_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */; }; - 4BCF3039199ABDDA0064207B /* zip_source_tell_write.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */; }; - 4BD5053419A01BB0007DD28A /* zip_source_call.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD5053219A0116D007DD28A /* zip_source_call.c */; }; - 4BD6CB6419E71CD100710654 /* source_hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5C19E6A5D900710654 /* source_hole.c */; }; - 4BD6CB6619E71CD100710654 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D70815B2F4CF002D5007 /* libz.dylib */; }; - 4BD6CB6719E71CD100710654 /* libzip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; }; - 4BD6CB6F19E71D6900710654 /* hole.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD6CB5E19E71B3B00710654 /* hole.c */; }; - 4BD7087A1EB1CF73003F351F /* zip_progress.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BD708781EB1CF73003F351F /* zip_progress.c */; }; - 4BE92AA720345E3800509BC8 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BE92AA620345E3800509BC8 /* libbz2.tbd */; }; - 4BE92AAD20346B1900509BC8 /* zip_crypto_openssl.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE92AAA20346B1900509BC8 /* zip_crypto_openssl.h */; }; - 4BE92AB3203597D700509BC8 /* zip_crypto_commoncrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE92AB0203597D700509BC8 /* zip_crypto_commoncrypto.h */; }; - 4BE92AB5203597D700509BC8 /* zip_crypto_commoncrypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BE92AB1203597D700509BC8 /* zip_crypto_commoncrypto.c */; }; - 4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */; }; - 736ED9BB1E3D6B6B00C36873 /* zip_source_winzip_aes_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */; }; - 736ED9BC1E3D6B6F00C36873 /* zip_source_winzip_aes_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9BA1E3D688C00C36873 /* zip_source_winzip_aes_encode.c */; }; - 736ED9BF1E3D6B7C00C36873 /* zip_file_set_encryption.c in Sources */ = {isa = PBXBuildFile; fileRef = 736ED9B71E3D688C00C36873 /* zip_file_set_encryption.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3D7E35441B33064500022624 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = libzip; - }; - 4B01D72C15B2F5AC002D5007 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D6FC15B2F4B1002D5007; - remoteInfo = zipmerge; - }; - 4B01D72E15B2F5AC002D5007 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D70A15B2F4EB002D5007; - remoteInfo = zipcmp; - }; - 4B01D73515B2F639002D5007 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4B01D73715B2F643002D5007 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4B2CADAB1C50D57800291DE6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD58815BC2CEA00920691; - remoteInfo = ziptool; - }; - 4B51DDB61FDAE20A00C5CA85 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4B51DDC41FDAE2F000C5CA85 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B51DDB41FDAE20A00C5CA85; - remoteInfo = ziptool_regress; - }; - 4B54447E15C977AF0067BA33 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D72815B2F5A2002D5007; - remoteInfo = "command line tools"; - }; - 4B54448015C977B10067BA33 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD5A715BC2D8200920691; - remoteInfo = "test programs"; - }; - 4BACD59615BC2D3800920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BACD5B715BC2DC900920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BACD5C615BC2DF200920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BACD5D515BC2F3700920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BACD64715BC301300920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BACD65415BC303B00920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD5B515BC2DC900920691; - remoteInfo = add_from_filep; - }; - 4BACD65615BC303B00920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD5C415BC2DF200920691; - remoteInfo = fopen_unchanged; - }; - 4BACD65815BC303B00920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD5D315BC2F3700920691; - remoteInfo = fread; - }; - 4BACD66815BC303B00920691 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BACD64515BC301300920691; - remoteInfo = tryopen; - }; - 4BCF6A781C3BDDF900F036E9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3D7E35361B3305FB00022624; - remoteInfo = "in-memory"; - }; - 4BCF6A7A1C3BDDFF00F036E9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BCF6A681C3BDDD500F036E9; - remoteInfo = examples; - }; - 4BD6CB6119E71CD100710654 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4B01D68A15B2F3F1002D5007; - remoteInfo = "libzip Mac"; - }; - 4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BD6CB5F19E71CD100710654; - remoteInfo = hole; - }; - 4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4BDC71BF15B181DA00236D3C /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BFF2B451FE12FCA006EF3F3; - remoteInfo = can_clone_file; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 3D7E35351B3305FB00022624 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; - 4B01D6FB15B2F4B1002D5007 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; - 4B01D70F15B2F4EB002D5007 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; - 4B51DDBC1FDAE20A00C5CA85 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD58715BC2CEA00920691 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5BD15BC2DC900920691 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5CC15BC2DF200920691 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5DB15BC2F3700920691 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD64C15BC301300920691 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BD6CB6819E71CD100710654 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3D77B86517009AA1000A5794 /* extract-version.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "extract-version.sh"; sourceTree = SOURCE_ROOT; }; - 3D7E35371B3305FB00022624 /* in-memory */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "in-memory"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D7E35401B33063600022624 /* in-memory.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "in-memory.c"; sourceTree = ""; }; - 3D7E35421B33063600022624 /* windows-open.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "windows-open.c"; sourceTree = ""; }; - 3D7E35471B33076C00022624 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - 3D9284801C309510001EABA7 /* zip_hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_hash.c; sourceTree = ""; usesTabs = 1; }; - 4B00CA21242F59D700E0B71C /* zip_source_pkware_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_pkware_decode.c; sourceTree = ""; }; - 4B00CA22242F59D700E0B71C /* zip_pkware.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_pkware.c; sourceTree = ""; }; - 4B00CA23242F59D700E0B71C /* zip_source_pkware_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_pkware_encode.c; sourceTree = ""; }; - 4B00CA27242F5C2500E0B71C /* set_file_dostime.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_file_dostime.test; sourceTree = ""; }; - 4B00CA28242F5C2500E0B71C /* cancel_45.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cancel_45.test; sourceTree = ""; }; - 4B00CA29242F5C2500E0B71C /* set_compression_store_to_xz.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_xz.test; sourceTree = ""; }; - 4B00CA2A242F5C2500E0B71C /* encryption-nonrandom-pkware.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "encryption-nonrandom-pkware.test"; sourceTree = ""; }; - 4B00CA2B242F5C2500E0B71C /* cancel_90.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cancel_90.test; sourceTree = ""; }; - 4B00CA2C242F5C2500E0B71C /* set_compression_xz_to_store.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_xz_to_store.test; sourceTree = ""; }; - 4B01D68B15B2F3F1002D5007 /* libzip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libzip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4B01D6FD15B2F4B1002D5007 /* zipmerge */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = zipmerge; sourceTree = BUILT_PRODUCTS_DIR; }; - 4B01D70815B2F4CF002D5007 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; }; - 4B01D71315B2F4EB002D5007 /* zipcmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = zipcmp; sourceTree = BUILT_PRODUCTS_DIR; }; - 4B01D72115B2F572002D5007 /* zipcmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zipcmp.c; sourceTree = ""; }; - 4B01D72215B2F572002D5007 /* zipmerge.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zipmerge.c; sourceTree = ""; }; - 4B01D73D15B2FB6B002D5007 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; - 4B0454B41E8E3DF7002FA1F9 /* zip_algorithm_bzip2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_algorithm_bzip2.c; sourceTree = ""; }; - 4B0454B51E8E3DF7002FA1F9 /* zip_algorithm_deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_algorithm_deflate.c; sourceTree = ""; }; - 4B0454B61E8E3DF7002FA1F9 /* zip_source_compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_compress.c; sourceTree = ""; }; - 4B1ABD1A1A2E5DA700C93867 /* links */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = links; sourceTree = ""; }; - 4B1ABD1B1A2E5E4D00C93867 /* handle_links */ = {isa = PBXFileReference; explicitFileType = text.script.perl; fileEncoding = 4; path = handle_links; sourceTree = ""; }; - 4B1E46E51A08CB7600A376D2 /* zip_error_code_system.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_code_system.mdoc; sourceTree = ""; }; - 4B1E46E61A08CB7600A376D2 /* zip_error_code_zip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_code_zip.mdoc; sourceTree = ""; }; - 4B1E46E71A08CB7600A376D2 /* zip_error_fini.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_fini.mdoc; sourceTree = ""; }; - 4B1E46E81A08CB7600A376D2 /* zip_error_init.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_init.mdoc; sourceTree = ""; }; - 4B1E46E91A08CB7600A376D2 /* zip_error_set.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_set.mdoc; sourceTree = ""; }; - 4B1E46EA1A08CB7600A376D2 /* zip_error_strerror.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_strerror.mdoc; sourceTree = ""; }; - 4B1E46EB1A08CB7600A376D2 /* zip_error_system_type.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_system_type.mdoc; sourceTree = ""; }; - 4B26FF151A07DF1A000E9788 /* zip_file_get_external_attributes.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_external_attributes.mdoc; sourceTree = ""; }; - 4B26FF161A07DF1A000E9788 /* zip_file_set_external_attributes.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_external_attributes.mdoc; sourceTree = ""; }; - 4B26FF171A07DF1A000E9788 /* zip_file_set_mtime.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_mtime.mdoc; sourceTree = ""; }; - 4B26FF181A07DFEA000E9788 /* mkdocset.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; path = mkdocset.pl; sourceTree = ""; }; - 4B28A9EC15BACC3900D0C17D /* libzip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = libzip.mdoc; sourceTree = ""; }; - 4B28A9ED15BACC3900D0C17D /* zip_add_dir.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_add_dir.mdoc; sourceTree = ""; }; - 4B28A9EE15BACC3900D0C17D /* zip_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_add.mdoc; sourceTree = ""; }; - 4B28A9EF15BACC3900D0C17D /* zip_close.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_close.mdoc; sourceTree = ""; }; - 4B28A9F015BACC3900D0C17D /* zip_delete.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_delete.mdoc; sourceTree = ""; }; - 4B28A9F115BACC3900D0C17D /* zip_dir_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_dir_add.mdoc; sourceTree = ""; }; - 4B28A9F215BACC3900D0C17D /* zip_discard.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_discard.mdoc; sourceTree = ""; }; - 4B28A9F315BACC3900D0C17D /* zip_error_clear.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_clear.mdoc; sourceTree = ""; }; - 4B28A9F415BACC3900D0C17D /* zip_error_get_sys_type.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_get_sys_type.mdoc; sourceTree = ""; }; - 4B28A9F515BACC3900D0C17D /* zip_error_get.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_get.mdoc; sourceTree = ""; }; - 4B28A9F615BACC3900D0C17D /* zip_error_to_str.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_to_str.mdoc; sourceTree = ""; }; - 4B28A9F715BACC3900D0C17D /* zip_errors.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_errors.mdoc; sourceTree = ""; }; - 4B28A9F815BACC3900D0C17D /* zip_fclose.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fclose.mdoc; sourceTree = ""; }; - 4B28A9F915BACC3900D0C17D /* zip_fdopen.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fdopen.mdoc; sourceTree = ""; }; - 4B28A9FA15BACC3900D0C17D /* zip_file_add.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_add.mdoc; sourceTree = ""; }; - 4B28A9FB15BACC3900D0C17D /* zip_file_extra_field_delete.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_delete.mdoc; sourceTree = ""; }; - 4B28A9FC15BACC3900D0C17D /* zip_file_extra_field_get.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_get.mdoc; sourceTree = ""; }; - 4B28A9FD15BACC3900D0C17D /* zip_file_extra_field_set.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_field_set.mdoc; sourceTree = ""; }; - 4B28A9FE15BACC3900D0C17D /* zip_file_extra_fields_count.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_extra_fields_count.mdoc; sourceTree = ""; }; - 4B28A9FF15BACC3900D0C17D /* zip_file_get_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_comment.mdoc; sourceTree = ""; }; - 4B28AA0015BACC3900D0C17D /* zip_file_rename.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_rename.mdoc; sourceTree = ""; }; - 4B28AA0115BACC3900D0C17D /* zip_file_set_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_comment.mdoc; sourceTree = ""; }; - 4B28AA0215BACC3900D0C17D /* zip_file_strerror.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_strerror.mdoc; sourceTree = ""; }; - 4B28AA0315BACC3900D0C17D /* zip_fopen_encrypted.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fopen_encrypted.mdoc; sourceTree = ""; }; - 4B28AA0415BACC3900D0C17D /* zip_fopen.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fopen.mdoc; sourceTree = ""; }; - 4B28AA0515BACC3900D0C17D /* zip_fread.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fread.mdoc; sourceTree = ""; }; - 4B28AA0615BACC3900D0C17D /* zip_get_archive_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_archive_comment.mdoc; sourceTree = ""; }; - 4B28AA0715BACC3900D0C17D /* zip_get_archive_flag.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_archive_flag.mdoc; sourceTree = ""; }; - 4B28AA0815BACC3900D0C17D /* zip_get_file_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_file_comment.mdoc; sourceTree = ""; }; - 4B28AA0915BACC3900D0C17D /* zip_get_name.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_name.mdoc; sourceTree = ""; }; - 4B28AA0A15BACC3900D0C17D /* zip_get_num_entries.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_num_entries.mdoc; sourceTree = ""; }; - 4B28AA0B15BACC3900D0C17D /* zip_get_num_files.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_num_files.mdoc; sourceTree = ""; }; - 4B28AA0C15BACC3900D0C17D /* zip_name_locate.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_name_locate.mdoc; sourceTree = ""; }; - 4B28AA0D15BACC3900D0C17D /* zip_open.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_open.mdoc; sourceTree = ""; }; - 4B28AA0E15BACC3900D0C17D /* zip_rename.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_rename.mdoc; sourceTree = ""; }; - 4B28AA0F15BACC3900D0C17D /* zip_set_archive_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_archive_comment.mdoc; sourceTree = ""; }; - 4B28AA1015BACC3900D0C17D /* zip_set_archive_flag.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_archive_flag.mdoc; sourceTree = ""; }; - 4B28AA1115BACC3900D0C17D /* zip_set_default_password.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_default_password.mdoc; sourceTree = ""; }; - 4B28AA1215BACC3900D0C17D /* zip_set_file_comment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_file_comment.mdoc; sourceTree = ""; }; - 4B28AA1315BACC3900D0C17D /* zip_set_file_compression.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_set_file_compression.mdoc; sourceTree = ""; }; - 4B28AA1415BACC3900D0C17D /* zip_source_buffer.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_buffer.mdoc; sourceTree = ""; }; - 4B28AA1515BACC3900D0C17D /* zip_source_file.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_file.mdoc; sourceTree = ""; }; - 4B28AA1615BACC3900D0C17D /* zip_source_filep.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_filep.mdoc; sourceTree = ""; }; - 4B28AA1715BACC3900D0C17D /* zip_source_free.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_free.mdoc; sourceTree = ""; }; - 4B28AA1815BACC3900D0C17D /* zip_source_function.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_function.mdoc; sourceTree = ""; }; - 4B28AA1915BACC3900D0C17D /* zip_source_zip.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_zip.mdoc; sourceTree = ""; }; - 4B28AA1A15BACC3900D0C17D /* zip_stat_init.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_stat_init.mdoc; sourceTree = ""; }; - 4B28AA1B15BACC3900D0C17D /* zip_stat.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_stat.mdoc; sourceTree = ""; }; - 4B28AA1C15BACC3900D0C17D /* zip_unchange_all.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange_all.mdoc; sourceTree = ""; }; - 4B28AA1D15BACC3900D0C17D /* zip_unchange_archive.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange_archive.mdoc; sourceTree = ""; }; - 4B28AA1E15BACC3900D0C17D /* zip_unchange.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_unchange.mdoc; sourceTree = ""; }; - 4B28AA1F15BACC3900D0C17D /* zipcmp.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zipcmp.mdoc; sourceTree = ""; }; - 4B28AA2015BACC3900D0C17D /* zipmerge.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zipmerge.mdoc; sourceTree = ""; }; - 4B28AA2215BAD4E200D0C17D /* API-CHANGES.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = "API-CHANGES.md"; sourceTree = ""; }; - 4B28AA2315BAD4E200D0C17D /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS; sourceTree = ""; }; - 4B28AA2415BAD4E200D0C17D /* NEWS.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = NEWS.md; sourceTree = ""; }; - 4B28AA2515BAD4E200D0C17D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 4B28AA2615BAD4E200D0C17D /* THANKS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = THANKS; sourceTree = ""; }; - 4B28AA2715BAD4E200D0C17D /* TODO.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = TODO.md; sourceTree = ""; }; - 4B3A5F4D1DF96D83005A53A1 /* zip_fseek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_fseek.c; sourceTree = ""; }; - 4B3A5F4E1DF96D83005A53A1 /* zip_ftell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_ftell.c; sourceTree = ""; }; - 4B3FAE7F2385C5A300192D6A /* zip_algorithm_xz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_algorithm_xz.c; sourceTree = ""; }; - 4B3FAE812385C79200192D6A /* liblzma.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = liblzma.5.dylib; path = ../../../../../../opt/pkg/lib/liblzma.5.dylib; sourceTree = ""; }; - 4B3FAE832385C9E900192D6A /* README Xcode Project.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "README Xcode Project.md"; sourceTree = ""; }; - 4B41A2651FE15E99005D8C91 /* clone-fs-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-add.test"; sourceTree = ""; }; - 4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-delete.test"; sourceTree = ""; }; - 4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-fs-replace.test"; sourceTree = ""; }; - 4B4CB5572483D7B7005C5428 /* nihtest.conf.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = nihtest.conf.in; sourceTree = ""; }; - 4B5169A722A7993D00AA4340 /* zip_mkstempm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_mkstempm.c; sourceTree = ""; }; - 4B51DDB21FDADEDF00C5CA85 /* INSTALL.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = INSTALL.md; sourceTree = ""; }; - 4B51DDB31FDAE1DB00C5CA85 /* ziptool_regress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ziptool_regress.c; sourceTree = ""; }; - 4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ziptool_regress; sourceTree = BUILT_PRODUCTS_DIR; }; - 4B55D93F2475274B00CE8C38 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; - 4B5D0CD4244B154E006C2E93 /* zip_source_get_file_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_get_file_attributes.c; sourceTree = ""; }; - 4B69E6ED2032F1870001EEE7 /* zip_winzip_aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_winzip_aes.c; sourceTree = ""; }; - 4B69E6F020330D460001EEE7 /* zip_crypto_gnutls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_crypto_gnutls.c; sourceTree = ""; }; - 4B69E6F2203341D50001EEE7 /* zip_crypto_gnutls.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto_gnutls.h; sourceTree = ""; }; - 4B69E6F3203342E30001EEE7 /* zip_crypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto.h; sourceTree = ""; }; - 4B77E61A1FDDCD3A006786BA /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; - 4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-delete.test"; sourceTree = ""; }; - 4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-replace.test"; sourceTree = ""; }; - 4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "clone-buffer-add.test"; sourceTree = ""; }; - 4B82CED319915F360097BC18 /* zip_file_set_mtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_mtime.c; sourceTree = ""; }; - 4B908F502385BE6C00886355 /* zip_libzip_version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_libzip_version.c; sourceTree = ""; }; - 4B908F522385BE6D00886355 /* zip_source_accept_empty.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_accept_empty.c; sourceTree = ""; }; - 4B93995524631B3D00AEBDA4 /* zip_source_file_stdio_named.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_file_stdio_named.c; sourceTree = ""; }; - 4B93995624631B3E00AEBDA4 /* zip_source_file_common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_file_common.c; sourceTree = ""; }; - 4B93995724631B3E00AEBDA4 /* zip_source_file_stdio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_file_stdio.c; sourceTree = ""; }; - 4B93995824631B3E00AEBDA4 /* zip_source_file_stdio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip_source_file_stdio.h; sourceTree = ""; }; - 4B93995924631B3E00AEBDA4 /* zip_source_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip_source_file.h; sourceTree = ""; }; - 4B93995F24640B1700AEBDA4 /* zip_source_file_win32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_source_file_win32.h; sourceTree = ""; }; - 4B93996024640B1700AEBDA4 /* zip_source_file_win32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_file_win32.c; sourceTree = ""; }; - 4B93996124641D5700AEBDA4 /* zip_source_file_win32_ansi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_file_win32_ansi.c; sourceTree = ""; }; - 4B93996224643F5700AEBDA4 /* zip_source_file_win32_utf8.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_file_win32_utf8.c; sourceTree = ""; }; - 4B9399632464401300AEBDA4 /* zip_source_file_win32_utf16.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_file_win32_utf16.c; sourceTree = ""; }; - 4B93996424644E7E00AEBDA4 /* zip_source_file_win32_named.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_source_file_win32_named.c; sourceTree = ""; }; - 4B939965246553FD00AEBDA4 /* appveyor.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = appveyor.yml; sourceTree = ""; }; - 4B939966246E842200AEBDA4 /* zip_random_win32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_random_win32.c; sourceTree = ""; }; - 4B939967246E842200AEBDA4 /* zip_random_uwp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_random_uwp.c; sourceTree = ""; }; - 4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_get_external_attributes.c; sourceTree = ""; }; - 4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_external_attributes.c; sourceTree = ""; }; - 4B9E577A24C7026B00CEE0D6 /* zip_algorithm_zstd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_algorithm_zstd.c; sourceTree = ""; }; - 4B9E578324C9769F00CEE0D6 /* zip_crypto_win.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_crypto_win.c; sourceTree = ""; }; - 4B9E578424C9769F00CEE0D6 /* zip_crypto_mbedtls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_crypto_mbedtls.c; sourceTree = ""; }; - 4B9E578524C9769F00CEE0D6 /* zip_crypto_win.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto_win.h; sourceTree = ""; }; - 4B9E578624C9769F00CEE0D6 /* zip_crypto_mbedtls.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto_mbedtls.h; sourceTree = ""; }; - 4B9E578724C9770C00CEE0D6 /* libzstd.1.4.5.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libzstd.1.4.5.dylib; path = ../../../../../../usr/local/Cellar/zstd/1.4.5/lib/libzstd.1.4.5.dylib; sourceTree = ""; }; - 4B9E578924C9779900CEE0D6 /* zip_err_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_err_str.c; sourceTree = SOURCE_ROOT; }; - 4BACD57715BC2AEF00920691 /* add_from_filep.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = add_from_filep.c; path = ../regress/add_from_filep.c; sourceTree = ""; }; - 4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fopen_unchanged.c; path = ../regress/fopen_unchanged.c; sourceTree = ""; }; - 4BACD57B15BC2AEF00920691 /* fread.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fread.c; path = ../regress/fread.c; sourceTree = ""; }; - 4BACD57C15BC2AEF00920691 /* ziptool.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ziptool.c; sourceTree = ""; }; - 4BACD58415BC2AEF00920691 /* tryopen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tryopen.c; path = ../regress/tryopen.c; sourceTree = ""; }; - 4BACD58915BC2CEA00920691 /* ziptool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ziptool; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BACD5C115BC2DC900920691 /* add_from_filep */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = add_from_filep; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BACD5D015BC2DF200920691 /* fopen_unchanged */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fopen_unchanged; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BACD5DF15BC2F3700920691 /* fread */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fread; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BACD65015BC301300920691 /* tryopen */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tryopen; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BC03F781FDD55C1003C7B62 /* zip-in-archive-comment.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "zip-in-archive-comment.test"; sourceTree = ""; }; - 4BC03F791FDD55C1003C7B62 /* decrypt-wrong-password-aes192.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-wrong-password-aes192.test"; sourceTree = ""; }; - 4BC03F7A1FDD55C1003C7B62 /* decrypt-correct-password-pkware.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-correct-password-pkware.test"; sourceTree = ""; }; - 4BC03F7B1FDD55C1003C7B62 /* encryption-nonrandom-aes192.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "encryption-nonrandom-aes192.test"; sourceTree = ""; }; - 4BC03F7C1FDD55C1003C7B62 /* decrypt-wrong-password-pkware.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-wrong-password-pkware.test"; sourceTree = ""; }; - 4BC03F7D1FDD55C1003C7B62 /* preload.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = preload.test; sourceTree = ""; }; - 4BC03F7E1FDD55C1003C7B62 /* open_file_count.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_file_count.test; sourceTree = ""; }; - 4BC03F7F1FDD55C2003C7B62 /* fseek_fail.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fseek_fail.test; sourceTree = ""; }; - 4BC03F801FDD55C2003C7B62 /* open_multidisk.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_multidisk.test; sourceTree = ""; }; - 4BC03F811FDD55C2003C7B62 /* set_compression_deflate_to_bzip2.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_deflate_to_bzip2.test; sourceTree = ""; }; - 4BC03F821FDD55C2003C7B62 /* decrypt-correct-password-aes192.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-correct-password-aes192.test"; sourceTree = ""; }; - 4BC03F831FDD55C2003C7B62 /* encryption-nonrandom-aes256.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "encryption-nonrandom-aes256.test"; sourceTree = ""; }; - 4BC03F841FDD55C2003C7B62 /* fseek_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fseek_ok.test; sourceTree = ""; }; - 4BC03F851FDD55C3003C7B62 /* set_compression_store_to_bzip2.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_bzip2.test; sourceTree = ""; }; - 4BC03F861FDD55C3003C7B62 /* open_zip64_3mf.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_zip64_3mf.test; sourceTree = ""; }; - 4BC03F871FDD55C3003C7B62 /* fseek_deflated.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fseek_deflated.test; sourceTree = ""; }; - 4BC03F881FDD55C3003C7B62 /* encryption-remove.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "encryption-remove.test"; sourceTree = ""; }; - 4BC03F891FDD55C3003C7B62 /* add_from_zip_deflated2.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_deflated2.test; sourceTree = ""; }; - 4BC03F8A1FDD55C3003C7B62 /* decrypt-wrong-password-aes256.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-wrong-password-aes256.test"; sourceTree = ""; }; - 4BC03F8B1FDD55C3003C7B62 /* encryption-nonrandom-aes128.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "encryption-nonrandom-aes128.test"; sourceTree = ""; }; - 4BC03F8C1FDD55C4003C7B62 /* progress.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = progress.test; sourceTree = ""; }; - 4BC03F8D1FDD55C4003C7B62 /* junk_at_start.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = junk_at_start.test; sourceTree = ""; }; - 4BC03F8E1FDD55C4003C7B62 /* buffer-fragment-read.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "buffer-fragment-read.test"; sourceTree = ""; }; - 4BC03F8F1FDD55C4003C7B62 /* decrypt-wrong-password-aes128.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-wrong-password-aes128.test"; sourceTree = ""; }; - 4BC03F901FDD55C4003C7B62 /* fdopen_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fdopen_ok.test; sourceTree = ""; }; - 4BC03F911FDD55C4003C7B62 /* junk_at_end.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = junk_at_end.test; sourceTree = ""; }; - 4BC03F921FDD55C4003C7B62 /* decrypt-correct-password-aes128.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-correct-password-aes128.test"; sourceTree = ""; }; - 4BC03F931FDD55C5003C7B62 /* decrypt-no-password-aes256.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-no-password-aes256.test"; sourceTree = ""; }; - 4BC03F941FDD55C5003C7B62 /* buffer-fragment-write.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "buffer-fragment-write.test"; sourceTree = ""; }; - 4BC03F951FDD55C5003C7B62 /* decrypt-correct-password-aes256.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "decrypt-correct-password-aes256.test"; sourceTree = ""; }; - 4BC03F961FDD55C5003C7B62 /* open_many_fail.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_many_fail.test; sourceTree = ""; }; - 4BC03F971FDD55C5003C7B62 /* set_compression_bzip2_to_deflate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_bzip2_to_deflate.test; sourceTree = ""; }; - 4BC03F981FDD55C5003C7B62 /* set_file_mtime.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_file_mtime.test; sourceTree = ""; }; - 4BC03F991FDD5617003C7B62 /* nonrandomopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nonrandomopen.c; sourceTree = ""; }; - 4BC03F9A1FDD5617003C7B62 /* fseek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fseek.c; sourceTree = ""; }; - 4BC03F9B1FDD5617003C7B62 /* nonrandomopentest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nonrandomopentest.c; sourceTree = ""; }; - 4BC03F9C1FDD5617003C7B62 /* malloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = malloc.c; sourceTree = ""; }; - 4BC03F9D1FDD5617003C7B62 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; - 4BC03F9E1FDD5642003C7B62 /* extra_field_align.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_field_align.test; sourceTree = ""; }; - 4BC03F9F1FDD5642003C7B62 /* count_entries.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = count_entries.test; sourceTree = ""; }; - 4BC03FA01FDD5660003C7B62 /* cleanup.cmake */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cleanup.cmake; sourceTree = ""; }; - 4BC03FA11FDD603F003C7B62 /* zip_source_buffer_fragment.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_buffer_fragment.mdoc; sourceTree = ""; }; - 4BC03FA21FDD6B6F003C7B62 /* zip_source_begin_write_cloning.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_begin_write_cloning.c; sourceTree = ""; }; - 4BC3863E1A1BE00E00CDCAAC /* zip_get_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_get_error.mdoc; sourceTree = ""; }; - 4BC3863F1A1BE00E00CDCAAC /* zip_source_begin_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_begin_write.mdoc; sourceTree = ""; }; - 4BC386401A1BE00E00CDCAAC /* zip_source_close.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_close.mdoc; sourceTree = ""; }; - 4BC386411A1BE00E00CDCAAC /* zip_source_commit_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_commit_write.mdoc; sourceTree = ""; }; - 4BC386421A1BE00E00CDCAAC /* zip_source_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_error.mdoc; sourceTree = ""; }; - 4BC386431A1BE00E00CDCAAC /* ZIP_SOURCE_GET_ARGS.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = ZIP_SOURCE_GET_ARGS.mdoc; sourceTree = ""; }; - 4BC386441A1BE00E00CDCAAC /* zip_source_is_deleted.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_is_deleted.mdoc; sourceTree = ""; }; - 4BC386451A1BE00E00CDCAAC /* zip_source_keep.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_keep.mdoc; sourceTree = ""; }; - 4BC386461A1BE00E00CDCAAC /* zip_source_make_command_bitmap.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_make_command_bitmap.mdoc; sourceTree = ""; }; - 4BC386471A1BE00E00CDCAAC /* zip_source_open.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_open.mdoc; sourceTree = ""; }; - 4BC386481A1BE00E00CDCAAC /* zip_source_read.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_read.mdoc; sourceTree = ""; }; - 4BC386491A1BE00E00CDCAAC /* zip_source_rollback_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_rollback_write.mdoc; sourceTree = ""; }; - 4BC3864A1A1BE00E00CDCAAC /* zip_source_seek_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_seek_write.mdoc; sourceTree = ""; }; - 4BC3864B1A1BE00E00CDCAAC /* zip_source_seek.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_seek.mdoc; sourceTree = ""; }; - 4BC3864C1A1BE00E00CDCAAC /* zip_source_stat.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_stat.mdoc; sourceTree = ""; }; - 4BC3864D1A1BE00E00CDCAAC /* zip_source_tell_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_tell_write.mdoc; sourceTree = ""; }; - 4BC3864E1A1BE00E00CDCAAC /* zip_source_tell.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_tell.mdoc; sourceTree = ""; }; - 4BC3864F1A1BE00E00CDCAAC /* zip_source_write.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_write.mdoc; sourceTree = ""; }; - 4BC386501A1BE00E00CDCAAC /* zip_source.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source.mdoc; sourceTree = ""; }; - 4BC386511A1BE04700CDCAAC /* fix-man-links.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "fix-man-links.sh"; sourceTree = ""; }; - 4BC386521A1BE04700CDCAAC /* make_zip_errors.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = make_zip_errors.sh; sourceTree = ""; }; - 4BC386531A1BE04700CDCAAC /* nih-man.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = "nih-man.css"; sourceTree = ""; }; - 4BC972001A0A1D85003A2981 /* zip_error_to_data.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_error_to_data.mdoc; sourceTree = ""; }; - 4BCB434119E9347E0067FAA3 /* zip_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_buffer.c; sourceTree = ""; }; - 4BCD77A71A14E404001A9F55 /* zip_file_get_error.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_get_error.mdoc; sourceTree = ""; }; - 4BCD77A81A14E921001A9F55 /* zip_source_seek_compute_offset.mdoc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip_source_seek_compute_offset.mdoc; sourceTree = ""; }; - 4BCD77A91A14ED5C001A9F55 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; - 4BCF3019199A2F820064207B /* zip_io_util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_io_util.c; sourceTree = ""; }; - 4BCF301A199A2F820064207B /* zip_source_begin_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_begin_write.c; sourceTree = ""; }; - 4BCF301B199A2F820064207B /* zip_source_commit_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_commit_write.c; sourceTree = ""; }; - 4BCF301C199A2F820064207B /* zip_source_rollback_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_rollback_write.c; sourceTree = ""; }; - 4BCF301D199A2F820064207B /* zip_source_seek.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_seek.c; sourceTree = ""; }; - 4BCF301E199A2F820064207B /* zip_source_supports.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_supports.c; sourceTree = ""; }; - 4BCF301F199A2F820064207B /* zip_source_tell.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_tell.c; sourceTree = ""; }; - 4BCF3020199A2F820064207B /* zip_source_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_write.c; sourceTree = ""; }; - 4BCF3031199ABD3A0064207B /* zip_source_remove.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_remove.c; sourceTree = ""; }; - 4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_seek_write.c; sourceTree = ""; }; - 4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_tell_write.c; sourceTree = ""; }; - 4BD155CE191CD28D0046F012 /* NiHTest.pm */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = text.script.perl; path = NiHTest.pm; sourceTree = ""; tabWidth = 4; usesTabs = 1; }; - 4BD155CF191CD28D0046F012 /* runtest.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = runtest.in; sourceTree = ""; }; - 4BD25DA51CF58790005A9EC4 /* compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compat.h; sourceTree = ""; }; - 4BD35E411A33366200256CB7 /* add_dir.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_dir.test; sourceTree = ""; }; - 4BD35E421A33366200256CB7 /* add_from_buffer.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_buffer.test; sourceTree = ""; }; - 4BD35E431A33366200256CB7 /* add_from_file_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file_duplicate.test; sourceTree = ""; }; - 4BD35E441A33366200256CB7 /* add_from_file_twice_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file_twice_duplicate.test; sourceTree = ""; }; - 4BD35E451A33366200256CB7 /* add_from_file.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_file.test; sourceTree = ""; }; - 4BD35E461A33366200256CB7 /* add_from_filep.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_filep.test; sourceTree = ""; }; - 4BD35E471A33366200256CB7 /* add_from_stdin.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_stdin.test; sourceTree = ""; }; - 4BD35E481A33366200256CB7 /* add_from_zip_closed.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_closed.test; sourceTree = ""; }; - 4BD35E491A33366200256CB7 /* add_from_zip_deflated.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_deflated.test; sourceTree = ""; }; - 4BD35E4A1A33366200256CB7 /* add_from_zip_partial_deflated.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_partial_deflated.test; sourceTree = ""; }; - 4BD35E4B1A33366200256CB7 /* add_from_zip_partial_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_partial_stored.test; sourceTree = ""; }; - 4BD35E4C1A33366200256CB7 /* add_from_zip_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_from_zip_stored.test; sourceTree = ""; }; - 4BD35E4E1A33366200256CB7 /* add_stored_in_memory.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_stored_in_memory.test; sourceTree = ""; }; - 4BD35E4F1A33366200256CB7 /* add_stored.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = add_stored.test; sourceTree = ""; }; - 4BD35E501A33366200256CB7 /* cm-default.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cm-default.test"; sourceTree = ""; }; - 4BD35E511A33366200256CB7 /* delete_add_same.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_add_same.test; sourceTree = ""; }; - 4BD35E521A33366200256CB7 /* delete_invalid.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_invalid.test; sourceTree = ""; }; - 4BD35E531A33366200256CB7 /* delete_last.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_last.test; sourceTree = ""; }; - 4BD35E541A33366200256CB7 /* delete_multiple_last.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_multiple_last.test; sourceTree = ""; }; - 4BD35E551A33366200256CB7 /* delete_multiple_partial.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_multiple_partial.test; sourceTree = ""; }; - 4BD35E561A33366200256CB7 /* delete_renamed_rename.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = delete_renamed_rename.test; sourceTree = ""; }; - 4BD35E5B1A33366200256CB7 /* encrypt.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = encrypt.test; sourceTree = ""; }; - 4BD35E5C1A33366200256CB7 /* extra_add_multiple.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_add_multiple.test; sourceTree = ""; }; - 4BD35E5D1A33366200256CB7 /* extra_add.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_add.test; sourceTree = ""; }; - 4BD35E5E1A33366200256CB7 /* extra_count_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count_by_id.test; sourceTree = ""; }; - 4BD35E5F1A33366200256CB7 /* extra_count_ignore_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count_ignore_zip64.test; sourceTree = ""; }; - 4BD35E601A33366200256CB7 /* extra_count.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_count.test; sourceTree = ""; }; - 4BD35E611A33366200256CB7 /* extra_delete_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_delete_by_id.test; sourceTree = ""; }; - 4BD35E621A33366200256CB7 /* extra_delete.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_delete.test; sourceTree = ""; }; - 4BD35E631A33366200256CB7 /* extra_get_by_id.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_get_by_id.test; sourceTree = ""; }; - 4BD35E641A33366200256CB7 /* extra_get.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_get.test; sourceTree = ""; }; - 4BD35E651A33366200256CB7 /* extra_set_modify_c.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set_modify_c.test; sourceTree = ""; }; - 4BD35E661A33366200256CB7 /* extra_set_modify_l.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set_modify_l.test; sourceTree = ""; }; - 4BD35E671A33366200256CB7 /* extra_set.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extra_set.test; sourceTree = ""; }; - 4BD35E681A33366200256CB7 /* file_comment_encmismatch.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = file_comment_encmismatch.test; sourceTree = ""; }; - 4BD35E691A33366200256CB7 /* fopen_unchanged.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fopen_unchanged.test; sourceTree = ""; }; - 4BD35E6A1A33366200256CB7 /* fread.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fread.test; sourceTree = ""; }; - 4BD35E6B1A33366200256CB7 /* get_comment.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = get_comment.test; sourceTree = ""; }; - 4BD35E8E1A33366200256CB7 /* name_locate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = name_locate.test; sourceTree = ""; }; - 4BD35E8F1A33366200256CB7 /* open_cons_extrabytes.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_cons_extrabytes.test; sourceTree = ""; }; - 4BD35E901A33366200256CB7 /* open_empty_2.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_empty_2.test; sourceTree = ""; }; - 4BD35E911A33366200256CB7 /* open_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_empty.test; sourceTree = ""; }; - 4BD35E921A33366200256CB7 /* open_extrabytes.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_extrabytes.test; sourceTree = ""; }; - 4BD35E931A33366200256CB7 /* open_filename_duplicate_consistency.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_consistency.test; sourceTree = ""; }; - 4BD35E941A33366200256CB7 /* open_filename_duplicate_empty_consistency.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_empty_consistency.test; sourceTree = ""; }; - 4BD35E951A33366200256CB7 /* open_filename_duplicate_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate_empty.test; sourceTree = ""; }; - 4BD35E961A33366200256CB7 /* open_filename_duplicate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_duplicate.test; sourceTree = ""; }; - 4BD35E971A33366200256CB7 /* open_filename_empty.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_filename_empty.test; sourceTree = ""; }; - 4BD35E981A33366200256CB7 /* open_incons.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_incons.test; sourceTree = ""; }; - 4BD35E991A33366200256CB7 /* open_many_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_many_ok.test; sourceTree = ""; }; - 4BD35E9A1A33366200256CB7 /* open_new_but_exists.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_new_but_exists.test; sourceTree = ""; }; - 4BD35E9B1A33366200256CB7 /* open_new_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_new_ok.test; sourceTree = ""; }; - 4BD35E9C1A33366200256CB7 /* open_nonarchive.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_nonarchive.test; sourceTree = ""; }; - 4BD35E9D1A33366200256CB7 /* open_nosuchfile.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_nosuchfile.test; sourceTree = ""; }; - 4BD35E9E1A33366200256CB7 /* open_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_ok.test; sourceTree = ""; }; - 4BD35E9F1A33366200256CB7 /* open_too_short.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_too_short.test; sourceTree = ""; }; - 4BD35EA01A33366200256CB7 /* open_truncate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_truncate.test; sourceTree = ""; }; - 4BD35EA11A33366200256CB7 /* open_zip64_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = open_zip64_ok.test; sourceTree = ""; }; - 4BD35EA21A33366200256CB7 /* rename_ascii.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_ascii.test; sourceTree = ""; }; - 4BD35EA31A33366200256CB7 /* rename_cp437.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_cp437.test; sourceTree = ""; }; - 4BD35EA41A33366200256CB7 /* rename_deleted.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_deleted.test; sourceTree = ""; }; - 4BD35EA51A33366200256CB7 /* rename_fail.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_fail.test; sourceTree = ""; }; - 4BD35EA61A33366200256CB7 /* rename_ok.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_ok.test; sourceTree = ""; }; - 4BD35EA81A33366200256CB7 /* rename_utf8_encmismatch.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_utf8_encmismatch.test; sourceTree = ""; }; - 4BD35EA91A33366200256CB7 /* rename_utf8.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rename_utf8.test; sourceTree = ""; }; - 4BD35EAA1A33366200256CB7 /* set_comment_all.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_all.test; sourceTree = ""; }; - 4BD35EAB1A33366200256CB7 /* set_comment_localonly.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_localonly.test; sourceTree = ""; }; - 4BD35EAC1A33366200256CB7 /* set_comment_removeglobal.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_removeglobal.test; sourceTree = ""; }; - 4BD35EAD1A33366200256CB7 /* set_comment_revert.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_comment_revert.test; sourceTree = ""; }; - 4BD35EAE1A33366200256CB7 /* set_compression_deflate_to_deflate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_deflate_to_deflate.test; sourceTree = ""; }; - 4BD35EAF1A33366200256CB7 /* set_compression_deflate_to_store.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_deflate_to_store.test; sourceTree = ""; }; - 4BD35EB01A33366200256CB7 /* set_compression_store_to_deflate.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_deflate.test; sourceTree = ""; }; - 4BD35EB11A33366200256CB7 /* set_compression_store_to_store.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_store_to_store.test; sourceTree = ""; }; - 4BD35EB21A33366200256CB7 /* set_compression_unknown.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = set_compression_unknown.test; sourceTree = ""; }; - 4BD35EB41A33366200256CB7 /* stat_index_cp437_guess.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_guess.test; sourceTree = ""; }; - 4BD35EB51A33366200256CB7 /* stat_index_cp437_raw.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_raw.test; sourceTree = ""; }; - 4BD35EB61A33366200256CB7 /* stat_index_cp437_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_cp437_strict.test; sourceTree = ""; }; - 4BD35EB71A33366200256CB7 /* stat_index_fileorder.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_fileorder.test; sourceTree = ""; }; - 4BD35EB81A33366200256CB7 /* stat_index_streamed_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_streamed_zip64.test; sourceTree = ""; }; - 4BD35EB91A33366200256CB7 /* stat_index_streamed.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_streamed.test; sourceTree = ""; }; - 4BD35EBA1A33366200256CB7 /* stat_index_utf8_guess.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_guess.test; sourceTree = ""; }; - 4BD35EBB1A33366200256CB7 /* stat_index_utf8_raw.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_raw.test; sourceTree = ""; }; - 4BD35EBC1A33366200256CB7 /* stat_index_utf8_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_strict.test; sourceTree = ""; }; - 4BD35EBD1A33366200256CB7 /* stat_index_utf8_unmarked_strict.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_utf8_unmarked_strict.test; sourceTree = ""; }; - 4BD35EBE1A33366200256CB7 /* stat_index_zip64.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stat_index_zip64.test; sourceTree = ""; }; - 4BD35EE11A33366300256CB7 /* utf-8-standardization.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "utf-8-standardization.test"; sourceTree = ""; }; - 4BD35EE31A33366300256CB7 /* zip64_creation.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip64_creation.test; sourceTree = ""; }; - 4BD35EE41A33366300256CB7 /* zip64_stored_creation.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = zip64_stored_creation.test; sourceTree = ""; }; - 4BD5053219A0116D007DD28A /* zip_source_call.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_call.c; sourceTree = ""; }; - 4BD6CB5C19E6A5D900710654 /* source_hole.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = source_hole.c; sourceTree = ""; }; - 4BD6CB5E19E71B3B00710654 /* hole.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hole.c; sourceTree = ""; }; - 4BD6CB6C19E71CD100710654 /* hole */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = hole; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BD708781EB1CF73003F351F /* zip_progress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_progress.c; sourceTree = ""; }; - 4BDC71F115B1B25E00236D3C /* zip_add_dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add_dir.c; path = ../lib/zip_add_dir.c; sourceTree = ""; }; - 4BDC71F215B1B25E00236D3C /* zip_add_entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add_entry.c; path = ../lib/zip_add_entry.c; sourceTree = ""; }; - 4BDC71F315B1B25E00236D3C /* zip_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_add.c; path = ../lib/zip_add.c; sourceTree = ""; }; - 4BDC71F415B1B25E00236D3C /* zip_close.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_close.c; path = ../lib/zip_close.c; sourceTree = ""; }; - 4BDC71F515B1B25E00236D3C /* zip_delete.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_delete.c; path = ../lib/zip_delete.c; sourceTree = ""; }; - 4BDC71F615B1B25E00236D3C /* zip_dir_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_dir_add.c; path = ../lib/zip_dir_add.c; sourceTree = ""; }; - 4BDC71F715B1B25E00236D3C /* zip_dirent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_dirent.c; path = ../lib/zip_dirent.c; sourceTree = ""; }; - 4BDC71F815B1B25E00236D3C /* zip_discard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_discard.c; path = ../lib/zip_discard.c; sourceTree = ""; }; - 4BDC71F915B1B25E00236D3C /* zip_entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_entry.c; path = ../lib/zip_entry.c; sourceTree = ""; }; - 4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_clear.c; path = ../lib/zip_error_clear.c; sourceTree = ""; }; - 4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_get_sys_type.c; path = ../lib/zip_error_get_sys_type.c; sourceTree = ""; }; - 4BDC71FD15B1B25E00236D3C /* zip_error_get.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_get.c; path = ../lib/zip_error_get.c; sourceTree = ""; }; - 4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_strerror.c; path = ../lib/zip_error_strerror.c; sourceTree = ""; }; - 4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error_to_str.c; path = ../lib/zip_error_to_str.c; sourceTree = ""; }; - 4BDC720015B1B25E00236D3C /* zip_error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_error.c; path = ../lib/zip_error.c; sourceTree = ""; }; - 4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_extra_field_api.c; path = ../lib/zip_extra_field_api.c; sourceTree = ""; }; - 4BDC720215B1B25E00236D3C /* zip_extra_field.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_extra_field.c; path = ../lib/zip_extra_field.c; sourceTree = ""; }; - 4BDC720315B1B25E00236D3C /* zip_fclose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fclose.c; path = ../lib/zip_fclose.c; sourceTree = ""; }; - 4BDC720415B1B25E00236D3C /* zip_fdopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fdopen.c; path = ../lib/zip_fdopen.c; sourceTree = ""; }; - 4BDC720515B1B25E00236D3C /* zip_file_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_add.c; path = ../lib/zip_file_add.c; sourceTree = ""; }; - 4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_error_clear.c; path = ../lib/zip_file_error_clear.c; sourceTree = ""; }; - 4BDC720715B1B25E00236D3C /* zip_file_error_get.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_error_get.c; path = ../lib/zip_file_error_get.c; sourceTree = ""; }; - 4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_get_comment.c; path = ../lib/zip_file_get_comment.c; sourceTree = ""; }; - 4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_get_offset.c; path = ../lib/zip_file_get_offset.c; sourceTree = ""; }; - 4BDC720A15B1B25E00236D3C /* zip_file_rename.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_rename.c; path = ../lib/zip_file_rename.c; sourceTree = ""; }; - 4BDC720B15B1B25E00236D3C /* zip_file_replace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_replace.c; path = ../lib/zip_file_replace.c; sourceTree = ""; }; - 4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_set_comment.c; path = ../lib/zip_file_set_comment.c; sourceTree = ""; }; - 4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_file_strerror.c; path = ../lib/zip_file_strerror.c; sourceTree = ""; }; - 4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_encrypted.c; path = ../lib/zip_fopen_encrypted.c; sourceTree = ""; }; - 4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_index_encrypted.c; path = ../lib/zip_fopen_index_encrypted.c; sourceTree = ""; }; - 4BDC721115B1B25E00236D3C /* zip_fopen_index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen_index.c; path = ../lib/zip_fopen_index.c; sourceTree = ""; }; - 4BDC721215B1B25E00236D3C /* zip_fopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fopen.c; path = ../lib/zip_fopen.c; sourceTree = ""; }; - 4BDC721315B1B25E00236D3C /* zip_fread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_fread.c; path = ../lib/zip_fread.c; sourceTree = ""; }; - 4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_archive_comment.c; path = ../lib/zip_get_archive_comment.c; sourceTree = ""; }; - 4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_archive_flag.c; path = ../lib/zip_get_archive_flag.c; sourceTree = ""; }; - 4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_encryption_implementation.c; path = ../lib/zip_get_encryption_implementation.c; sourceTree = ""; }; - 4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_file_comment.c; path = ../lib/zip_get_file_comment.c; sourceTree = ""; }; - 4BDC721915B1B25E00236D3C /* zip_get_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_name.c; path = ../lib/zip_get_name.c; sourceTree = ""; }; - 4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_num_entries.c; path = ../lib/zip_get_num_entries.c; sourceTree = ""; }; - 4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_get_num_files.c; path = ../lib/zip_get_num_files.c; sourceTree = ""; }; - 4BDC721C15B1B25E00236D3C /* zip_memdup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_memdup.c; path = ../lib/zip_memdup.c; sourceTree = ""; }; - 4BDC721D15B1B25E00236D3C /* zip_name_locate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_name_locate.c; path = ../lib/zip_name_locate.c; sourceTree = ""; }; - 4BDC721E15B1B25E00236D3C /* zip_new.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_new.c; path = ../lib/zip_new.c; sourceTree = ""; }; - 4BDC721F15B1B25E00236D3C /* zip_open.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_open.c; path = ../lib/zip_open.c; sourceTree = ""; tabWidth = 8; usesTabs = 1; }; - 4BDC722015B1B25E00236D3C /* zip_rename.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_rename.c; path = ../lib/zip_rename.c; sourceTree = ""; }; - 4BDC722115B1B25E00236D3C /* zip_replace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_replace.c; path = ../lib/zip_replace.c; sourceTree = ""; }; - 4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_archive_comment.c; path = ../lib/zip_set_archive_comment.c; sourceTree = ""; }; - 4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_archive_flag.c; path = ../lib/zip_set_archive_flag.c; sourceTree = ""; }; - 4BDC722415B1B25E00236D3C /* zip_set_default_password.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_default_password.c; path = ../lib/zip_set_default_password.c; sourceTree = ""; }; - 4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_file_comment.c; path = ../lib/zip_set_file_comment.c; sourceTree = ""; }; - 4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_file_compression.c; path = ../lib/zip_set_file_compression.c; sourceTree = ""; }; - 4BDC722715B1B25E00236D3C /* zip_set_name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_set_name.c; path = ../lib/zip_set_name.c; sourceTree = ""; }; - 4BDC722815B1B25E00236D3C /* zip_source_buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_buffer.c; path = ../lib/zip_source_buffer.c; sourceTree = ""; }; - 4BDC722915B1B25E00236D3C /* zip_source_close.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_close.c; path = ../lib/zip_source_close.c; sourceTree = ""; }; - 4BDC722A15B1B25E00236D3C /* zip_source_crc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_crc.c; path = ../lib/zip_source_crc.c; sourceTree = ""; }; - 4BDC722C15B1B25E00236D3C /* zip_source_error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_error.c; path = ../lib/zip_source_error.c; sourceTree = ""; }; - 4BDC722F15B1B25E00236D3C /* zip_source_free.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_free.c; path = ../lib/zip_source_free.c; sourceTree = ""; }; - 4BDC723015B1B25E00236D3C /* zip_source_function.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_function.c; path = ../lib/zip_source_function.c; sourceTree = ""; }; - 4BDC723115B1B25E00236D3C /* zip_source_layered.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_layered.c; path = ../lib/zip_source_layered.c; sourceTree = ""; }; - 4BDC723215B1B25E00236D3C /* zip_source_open.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_open.c; path = ../lib/zip_source_open.c; sourceTree = ""; }; - 4BDC723515B1B25E00236D3C /* zip_source_read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_read.c; path = ../lib/zip_source_read.c; sourceTree = ""; }; - 4BDC723615B1B25E00236D3C /* zip_source_stat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_stat.c; path = ../lib/zip_source_stat.c; sourceTree = ""; }; - 4BDC723715B1B25E00236D3C /* zip_source_window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_window.c; path = ../lib/zip_source_window.c; sourceTree = ""; }; - 4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_zip_new.c; path = ../lib/zip_source_zip_new.c; sourceTree = ""; }; - 4BDC723915B1B25E00236D3C /* zip_source_zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_source_zip.c; path = ../lib/zip_source_zip.c; sourceTree = ""; }; - 4BDC723A15B1B25E00236D3C /* zip_stat_index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat_index.c; path = ../lib/zip_stat_index.c; sourceTree = ""; }; - 4BDC723B15B1B25E00236D3C /* zip_stat_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat_init.c; path = ../lib/zip_stat_init.c; sourceTree = ""; }; - 4BDC723C15B1B25E00236D3C /* zip_stat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_stat.c; path = ../lib/zip_stat.c; sourceTree = ""; }; - 4BDC723D15B1B25E00236D3C /* zip_strerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_strerror.c; path = ../lib/zip_strerror.c; sourceTree = ""; }; - 4BDC723E15B1B25E00236D3C /* zip_string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_string.c; path = ../lib/zip_string.c; sourceTree = ""; }; - 4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_all.c; path = ../lib/zip_unchange_all.c; sourceTree = ""; }; - 4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_archive.c; path = ../lib/zip_unchange_archive.c; sourceTree = ""; }; - 4BDC724115B1B25E00236D3C /* zip_unchange_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange_data.c; path = ../lib/zip_unchange_data.c; sourceTree = ""; }; - 4BDC724215B1B25E00236D3C /* zip_unchange.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zip_unchange.c; path = ../lib/zip_unchange.c; sourceTree = ""; }; - 4BDC724315B1B25E00236D3C /* zip_utf-8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "zip_utf-8.c"; path = "../lib/zip_utf-8.c"; sourceTree = ""; }; - 4BDC729815B1B2A600236D3C /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zip.h; path = ../lib/zip.h; sourceTree = ""; }; - 4BDC729915B1B2A600236D3C /* zipint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zipint.h; path = ../lib/zipint.h; sourceTree = ""; }; - 4BDC729E15B1B4E900236D3C /* zipconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zipconf.h; sourceTree = SOURCE_ROOT; }; - 4BDC72A015B1B56400236D3C /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = SOURCE_ROOT; }; - 4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_is_deleted.c; sourceTree = ""; }; - 4BE92AA420345E2E00509BC8 /* libgnutls.30.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libgnutls.30.dylib; path = ../../../../../../opt/pkg/lib/libgnutls.30.dylib; sourceTree = ""; }; - 4BE92AA620345E3800509BC8 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; - 4BE92AA820345E5500509BC8 /* libnettle.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libnettle.6.dylib; path = ../../../../../../opt/pkg/lib/libnettle.6.dylib; sourceTree = ""; }; - 4BE92AAA20346B1900509BC8 /* zip_crypto_openssl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto_openssl.h; sourceTree = ""; }; - 4BE92AAB20346B1900509BC8 /* zip_crypto_openssl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_crypto_openssl.c; sourceTree = ""; }; - 4BE92AB0203597D700509BC8 /* zip_crypto_commoncrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zip_crypto_commoncrypto.h; sourceTree = ""; }; - 4BE92AB1203597D700509BC8 /* zip_crypto_commoncrypto.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = zip_crypto_commoncrypto.c; sourceTree = ""; }; - 4BFF2B341FDEEF8B006EF3F3 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; - 4BFF2B351FDEF277006EF3F3 /* cmake-config.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-config.h.in"; sourceTree = ""; }; - 4BFF2B361FDEF277006EF3F3 /* cmake-zipconf.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "cmake-zipconf.h.in"; sourceTree = ""; }; - 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = can_clone_file; sourceTree = BUILT_PRODUCTS_DIR; }; - 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = can_clone_file.c; sourceTree = ""; }; - 736ED9B71E3D688C00C36873 /* zip_file_set_encryption.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_file_set_encryption.c; sourceTree = ""; }; - 736ED9B81E3D688C00C36873 /* zip_random_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_random_unix.c; sourceTree = ""; }; - 736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_winzip_aes_decode.c; sourceTree = ""; }; - 736ED9BA1E3D688C00C36873 /* zip_source_winzip_aes_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_winzip_aes_encode.c; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3D7E35341B3305FB00022624 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D7E35481B33076C00022624 /* libz.dylib in Frameworks */, - 3D7E35461B33064B00022624 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D68715B2F3F1002D5007 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B9E578824C9770C00CEE0D6 /* libzstd.1.4.5.dylib in Frameworks */, - 4BE92AA720345E3800509BC8 /* libbz2.tbd in Frameworks */, - 4B01D73C15B2F6AF002D5007 /* libz.dylib in Frameworks */, - 4B3FAE822385C79200192D6A /* liblzma.5.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D6FA15B2F4B1002D5007 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B01D70915B2F4CF002D5007 /* libz.dylib in Frameworks */, - 4B01D70715B2F4C5002D5007 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D70C15B2F4EB002D5007 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B01D70D15B2F4EB002D5007 /* libz.dylib in Frameworks */, - 4B01D70E15B2F4EB002D5007 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B51DDB91FDAE20A00C5CA85 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B51DDBA1FDAE20A00C5CA85 /* libz.dylib in Frameworks */, - 4B51DDBB1FDAE20A00C5CA85 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD58615BC2CEA00920691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD59415BC2D0800920691 /* libz.dylib in Frameworks */, - 4BACD59315BC2CFA00920691 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5BA15BC2DC900920691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5BB15BC2DC900920691 /* libz.dylib in Frameworks */, - 4BACD5BC15BC2DC900920691 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5C915BC2DF200920691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5CA15BC2DF200920691 /* libz.dylib in Frameworks */, - 4BACD5CB15BC2DF200920691 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5D815BC2F3700920691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5D915BC2F3700920691 /* libz.dylib in Frameworks */, - 4BACD5DA15BC2F3700920691 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD64915BC301300920691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD64A15BC301300920691 /* libz.dylib in Frameworks */, - 4BACD64B15BC301300920691 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BD6CB6519E71CD100710654 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BD6CB6619E71CD100710654 /* libz.dylib in Frameworks */, - 4BD6CB6719E71CD100710654 /* libzip.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3D7E353E1B33063600022624 /* examples */ = { - isa = PBXGroup; - children = ( - 3D7E35401B33063600022624 /* in-memory.c */, - 3D7E35421B33063600022624 /* windows-open.c */, - ); - name = examples; - path = ../examples; - sourceTree = ""; - }; - 4B01D72015B2F54C002D5007 /* src */ = { - isa = PBXGroup; - children = ( - 4B55D93F2475274B00CE8C38 /* CMakeLists.txt */, - 4B01D72115B2F572002D5007 /* zipcmp.c */, - 4B01D72215B2F572002D5007 /* zipmerge.c */, - 4BACD57C15BC2AEF00920691 /* ziptool.c */, - ); - name = src; - path = ../src; - sourceTree = ""; - }; - 4B28A9EA15BACBE100D0C17D /* man */ = { - isa = PBXGroup; - children = ( - 4BCD77A91A14ED5C001A9F55 /* CMakeLists.txt */, - 4B1ABD1B1A2E5E4D00C93867 /* handle_links */, - 4B1ABD1A1A2E5DA700C93867 /* links */, - 4BC386511A1BE04700CDCAAC /* fix-man-links.sh */, - 4BC386521A1BE04700CDCAAC /* make_zip_errors.sh */, - 4B26FF181A07DFEA000E9788 /* mkdocset.pl */, - 4BC386531A1BE04700CDCAAC /* nih-man.css */, - 4B28A9EC15BACC3900D0C17D /* libzip.mdoc */, - 4B28A9ED15BACC3900D0C17D /* zip_add_dir.mdoc */, - 4B28A9EE15BACC3900D0C17D /* zip_add.mdoc */, - 4B28A9EF15BACC3900D0C17D /* zip_close.mdoc */, - 4B28A9F015BACC3900D0C17D /* zip_delete.mdoc */, - 4B28A9F115BACC3900D0C17D /* zip_dir_add.mdoc */, - 4B28A9F215BACC3900D0C17D /* zip_discard.mdoc */, - 4B28A9F315BACC3900D0C17D /* zip_error_clear.mdoc */, - 4B1E46E51A08CB7600A376D2 /* zip_error_code_system.mdoc */, - 4B1E46E61A08CB7600A376D2 /* zip_error_code_zip.mdoc */, - 4B1E46E71A08CB7600A376D2 /* zip_error_fini.mdoc */, - 4B28A9F415BACC3900D0C17D /* zip_error_get_sys_type.mdoc */, - 4B28A9F515BACC3900D0C17D /* zip_error_get.mdoc */, - 4B1E46E81A08CB7600A376D2 /* zip_error_init.mdoc */, - 4B1E46E91A08CB7600A376D2 /* zip_error_set.mdoc */, - 4B1E46EA1A08CB7600A376D2 /* zip_error_strerror.mdoc */, - 4B1E46EB1A08CB7600A376D2 /* zip_error_system_type.mdoc */, - 4BC972001A0A1D85003A2981 /* zip_error_to_data.mdoc */, - 4B28A9F615BACC3900D0C17D /* zip_error_to_str.mdoc */, - 4B28A9F715BACC3900D0C17D /* zip_errors.mdoc */, - 4B28A9F815BACC3900D0C17D /* zip_fclose.mdoc */, - 4B28A9F915BACC3900D0C17D /* zip_fdopen.mdoc */, - 4B28A9FA15BACC3900D0C17D /* zip_file_add.mdoc */, - 4B28A9FB15BACC3900D0C17D /* zip_file_extra_field_delete.mdoc */, - 4B28A9FC15BACC3900D0C17D /* zip_file_extra_field_get.mdoc */, - 4B28A9FD15BACC3900D0C17D /* zip_file_extra_field_set.mdoc */, - 4B28A9FE15BACC3900D0C17D /* zip_file_extra_fields_count.mdoc */, - 4B28A9FF15BACC3900D0C17D /* zip_file_get_comment.mdoc */, - 4BCD77A71A14E404001A9F55 /* zip_file_get_error.mdoc */, - 4B26FF151A07DF1A000E9788 /* zip_file_get_external_attributes.mdoc */, - 4B28AA0015BACC3900D0C17D /* zip_file_rename.mdoc */, - 4B28AA0115BACC3900D0C17D /* zip_file_set_comment.mdoc */, - 4B26FF161A07DF1A000E9788 /* zip_file_set_external_attributes.mdoc */, - 4B26FF171A07DF1A000E9788 /* zip_file_set_mtime.mdoc */, - 4B28AA0215BACC3900D0C17D /* zip_file_strerror.mdoc */, - 4B28AA0315BACC3900D0C17D /* zip_fopen_encrypted.mdoc */, - 4B28AA0415BACC3900D0C17D /* zip_fopen.mdoc */, - 4B28AA0515BACC3900D0C17D /* zip_fread.mdoc */, - 4B28AA0615BACC3900D0C17D /* zip_get_archive_comment.mdoc */, - 4B28AA0715BACC3900D0C17D /* zip_get_archive_flag.mdoc */, - 4BC3863E1A1BE00E00CDCAAC /* zip_get_error.mdoc */, - 4B28AA0815BACC3900D0C17D /* zip_get_file_comment.mdoc */, - 4B28AA0915BACC3900D0C17D /* zip_get_name.mdoc */, - 4B28AA0A15BACC3900D0C17D /* zip_get_num_entries.mdoc */, - 4B28AA0B15BACC3900D0C17D /* zip_get_num_files.mdoc */, - 4B28AA0C15BACC3900D0C17D /* zip_name_locate.mdoc */, - 4B28AA0D15BACC3900D0C17D /* zip_open.mdoc */, - 4B28AA0E15BACC3900D0C17D /* zip_rename.mdoc */, - 4B28AA0F15BACC3900D0C17D /* zip_set_archive_comment.mdoc */, - 4B28AA1015BACC3900D0C17D /* zip_set_archive_flag.mdoc */, - 4B28AA1115BACC3900D0C17D /* zip_set_default_password.mdoc */, - 4B28AA1215BACC3900D0C17D /* zip_set_file_comment.mdoc */, - 4B28AA1315BACC3900D0C17D /* zip_set_file_compression.mdoc */, - 4BC3863F1A1BE00E00CDCAAC /* zip_source_begin_write.mdoc */, - 4B28AA1415BACC3900D0C17D /* zip_source_buffer.mdoc */, - 4BC03FA11FDD603F003C7B62 /* zip_source_buffer_fragment.mdoc */, - 4BC386401A1BE00E00CDCAAC /* zip_source_close.mdoc */, - 4BC386411A1BE00E00CDCAAC /* zip_source_commit_write.mdoc */, - 4BC386421A1BE00E00CDCAAC /* zip_source_error.mdoc */, - 4B28AA1515BACC3900D0C17D /* zip_source_file.mdoc */, - 4B28AA1615BACC3900D0C17D /* zip_source_filep.mdoc */, - 4B28AA1715BACC3900D0C17D /* zip_source_free.mdoc */, - 4B28AA1815BACC3900D0C17D /* zip_source_function.mdoc */, - 4BC386431A1BE00E00CDCAAC /* ZIP_SOURCE_GET_ARGS.mdoc */, - 4BC386441A1BE00E00CDCAAC /* zip_source_is_deleted.mdoc */, - 4BC386451A1BE00E00CDCAAC /* zip_source_keep.mdoc */, - 4BC386461A1BE00E00CDCAAC /* zip_source_make_command_bitmap.mdoc */, - 4BC386471A1BE00E00CDCAAC /* zip_source_open.mdoc */, - 4BC386481A1BE00E00CDCAAC /* zip_source_read.mdoc */, - 4BC386491A1BE00E00CDCAAC /* zip_source_rollback_write.mdoc */, - 4BCD77A81A14E921001A9F55 /* zip_source_seek_compute_offset.mdoc */, - 4BC3864A1A1BE00E00CDCAAC /* zip_source_seek_write.mdoc */, - 4BC3864B1A1BE00E00CDCAAC /* zip_source_seek.mdoc */, - 4BC3864C1A1BE00E00CDCAAC /* zip_source_stat.mdoc */, - 4BC3864D1A1BE00E00CDCAAC /* zip_source_tell_write.mdoc */, - 4BC3864E1A1BE00E00CDCAAC /* zip_source_tell.mdoc */, - 4BC3864F1A1BE00E00CDCAAC /* zip_source_write.mdoc */, - 4B28AA1915BACC3900D0C17D /* zip_source_zip.mdoc */, - 4BC386501A1BE00E00CDCAAC /* zip_source.mdoc */, - 4B28AA1A15BACC3900D0C17D /* zip_stat_init.mdoc */, - 4B28AA1B15BACC3900D0C17D /* zip_stat.mdoc */, - 4B28AA1C15BACC3900D0C17D /* zip_unchange_all.mdoc */, - 4B28AA1D15BACC3900D0C17D /* zip_unchange_archive.mdoc */, - 4B28AA1E15BACC3900D0C17D /* zip_unchange.mdoc */, - 4B28AA1F15BACC3900D0C17D /* zipcmp.mdoc */, - 4B28AA2015BACC3900D0C17D /* zipmerge.mdoc */, - ); - name = man; - path = ../man; - sourceTree = ""; - }; - 4B28AA2815BAD4F800D0C17D /* info */ = { - isa = PBXGroup; - children = ( - 4B939965246553FD00AEBDA4 /* appveyor.yml */, - 4B28AA2215BAD4E200D0C17D /* API-CHANGES.md */, - 4B28AA2315BAD4E200D0C17D /* AUTHORS */, - 4B28AA2415BAD4E200D0C17D /* NEWS.md */, - 4B28AA2515BAD4E200D0C17D /* README.md */, - 4B51DDB21FDADEDF00C5CA85 /* INSTALL.md */, - 4B28AA2615BAD4E200D0C17D /* THANKS */, - 4B28AA2715BAD4E200D0C17D /* TODO.md */, - 4BFF2B341FDEEF8B006EF3F3 /* CMakeLists.txt */, - 4BFF2B351FDEF277006EF3F3 /* cmake-config.h.in */, - 4BFF2B361FDEF277006EF3F3 /* cmake-zipconf.h.in */, - ); - name = info; - path = ..; - sourceTree = ""; - }; - 4BACD57415BC2AA100920691 /* regress */ = { - isa = PBXGroup; - children = ( - 4BACD57715BC2AEF00920691 /* add_from_filep.c */, - 4BFF2B541FE13033006EF3F3 /* can_clone_file.c */, - 4BC03FA01FDD5660003C7B62 /* cleanup.cmake */, - 4BC03F9D1FDD5617003C7B62 /* CMakeLists.txt */, - 4BACD57A15BC2AEF00920691 /* fopen_unchanged.c */, - 4BACD57B15BC2AEF00920691 /* fread.c */, - 4BC03F9A1FDD5617003C7B62 /* fseek.c */, - 4BD6CB5E19E71B3B00710654 /* hole.c */, - 4BC03F9C1FDD5617003C7B62 /* malloc.c */, - 4B4CB5572483D7B7005C5428 /* nihtest.conf.in */, - 4BD155CE191CD28D0046F012 /* NiHTest.pm */, - 4BC03F991FDD5617003C7B62 /* nonrandomopen.c */, - 4BC03F9B1FDD5617003C7B62 /* nonrandomopentest.c */, - 4BD155CF191CD28D0046F012 /* runtest.in */, - 4BD6CB5C19E6A5D900710654 /* source_hole.c */, - 4BD35E401A33362A00256CB7 /* test cases */, - 4BACD58415BC2AEF00920691 /* tryopen.c */, - 4B51DDB31FDAE1DB00C5CA85 /* ziptool_regress.c */, - ); - name = regress; - path = ../regress; - sourceTree = ""; - }; - 4BD35E401A33362A00256CB7 /* test cases */ = { - isa = PBXGroup; - children = ( - 4BD35E411A33366200256CB7 /* add_dir.test */, - 4BD35E421A33366200256CB7 /* add_from_buffer.test */, - 4BD35E431A33366200256CB7 /* add_from_file_duplicate.test */, - 4BD35E441A33366200256CB7 /* add_from_file_twice_duplicate.test */, - 4BD35E451A33366200256CB7 /* add_from_file.test */, - 4BD35E461A33366200256CB7 /* add_from_filep.test */, - 4BD35E471A33366200256CB7 /* add_from_stdin.test */, - 4BD35E481A33366200256CB7 /* add_from_zip_closed.test */, - 4BD35E491A33366200256CB7 /* add_from_zip_deflated.test */, - 4BC03F891FDD55C3003C7B62 /* add_from_zip_deflated2.test */, - 4BD35E4A1A33366200256CB7 /* add_from_zip_partial_deflated.test */, - 4BD35E4B1A33366200256CB7 /* add_from_zip_partial_stored.test */, - 4BD35E4C1A33366200256CB7 /* add_from_zip_stored.test */, - 4BD35E4E1A33366200256CB7 /* add_stored_in_memory.test */, - 4BD35E4F1A33366200256CB7 /* add_stored.test */, - 4BC03F8E1FDD55C4003C7B62 /* buffer-fragment-read.test */, - 4BC03F941FDD55C5003C7B62 /* buffer-fragment-write.test */, - 4B00CA28242F5C2500E0B71C /* cancel_45.test */, - 4B00CA2B242F5C2500E0B71C /* cancel_90.test */, - 4B77E61D1FDEDEA5006786BA /* clone-buffer-add.test */, - 4B77E61B1FDEDEA4006786BA /* clone-buffer-delete.test */, - 4B77E61C1FDEDEA5006786BA /* clone-buffer-replace.test */, - 4B41A2651FE15E99005D8C91 /* clone-fs-add.test */, - 4B41A2661FE15FCE005D8C91 /* clone-fs-delete.test */, - 4B41A2671FE1604E005D8C91 /* clone-fs-replace.test */, - 4BD35E501A33366200256CB7 /* cm-default.test */, - 4BC03F9F1FDD5642003C7B62 /* count_entries.test */, - 4BC03F921FDD55C4003C7B62 /* decrypt-correct-password-aes128.test */, - 4BC03F821FDD55C2003C7B62 /* decrypt-correct-password-aes192.test */, - 4BC03F951FDD55C5003C7B62 /* decrypt-correct-password-aes256.test */, - 4BC03F7A1FDD55C1003C7B62 /* decrypt-correct-password-pkware.test */, - 4BC03F931FDD55C5003C7B62 /* decrypt-no-password-aes256.test */, - 4BC03F8F1FDD55C4003C7B62 /* decrypt-wrong-password-aes128.test */, - 4BC03F791FDD55C1003C7B62 /* decrypt-wrong-password-aes192.test */, - 4BC03F8A1FDD55C3003C7B62 /* decrypt-wrong-password-aes256.test */, - 4BC03F7C1FDD55C1003C7B62 /* decrypt-wrong-password-pkware.test */, - 4BD35E511A33366200256CB7 /* delete_add_same.test */, - 4BD35E521A33366200256CB7 /* delete_invalid.test */, - 4BD35E531A33366200256CB7 /* delete_last.test */, - 4BD35E541A33366200256CB7 /* delete_multiple_last.test */, - 4BD35E551A33366200256CB7 /* delete_multiple_partial.test */, - 4BD35E561A33366200256CB7 /* delete_renamed_rename.test */, - 4BD35E5B1A33366200256CB7 /* encrypt.test */, - 4BC03F8B1FDD55C3003C7B62 /* encryption-nonrandom-aes128.test */, - 4BC03F7B1FDD55C1003C7B62 /* encryption-nonrandom-aes192.test */, - 4BC03F831FDD55C2003C7B62 /* encryption-nonrandom-aes256.test */, - 4B00CA2A242F5C2500E0B71C /* encryption-nonrandom-pkware.test */, - 4BC03F881FDD55C3003C7B62 /* encryption-remove.test */, - 4BD35E5C1A33366200256CB7 /* extra_add_multiple.test */, - 4BD35E5D1A33366200256CB7 /* extra_add.test */, - 4BD35E5E1A33366200256CB7 /* extra_count_by_id.test */, - 4BD35E5F1A33366200256CB7 /* extra_count_ignore_zip64.test */, - 4BD35E601A33366200256CB7 /* extra_count.test */, - 4BD35E611A33366200256CB7 /* extra_delete_by_id.test */, - 4BD35E621A33366200256CB7 /* extra_delete.test */, - 4BC03F9E1FDD5642003C7B62 /* extra_field_align.test */, - 4BD35E631A33366200256CB7 /* extra_get_by_id.test */, - 4BD35E641A33366200256CB7 /* extra_get.test */, - 4BD35E651A33366200256CB7 /* extra_set_modify_c.test */, - 4BD35E661A33366200256CB7 /* extra_set_modify_l.test */, - 4BD35E671A33366200256CB7 /* extra_set.test */, - 4BC03F901FDD55C4003C7B62 /* fdopen_ok.test */, - 4BD35E681A33366200256CB7 /* file_comment_encmismatch.test */, - 4BD35E691A33366200256CB7 /* fopen_unchanged.test */, - 4BD35E6A1A33366200256CB7 /* fread.test */, - 4BC03F871FDD55C3003C7B62 /* fseek_deflated.test */, - 4BC03F7F1FDD55C2003C7B62 /* fseek_fail.test */, - 4BC03F841FDD55C2003C7B62 /* fseek_ok.test */, - 4BD35E6B1A33366200256CB7 /* get_comment.test */, - 4BC03F911FDD55C4003C7B62 /* junk_at_end.test */, - 4BC03F8D1FDD55C4003C7B62 /* junk_at_start.test */, - 4BD35E8E1A33366200256CB7 /* name_locate.test */, - 4BD35E8F1A33366200256CB7 /* open_cons_extrabytes.test */, - 4BD35E901A33366200256CB7 /* open_empty_2.test */, - 4BD35E911A33366200256CB7 /* open_empty.test */, - 4BD35E921A33366200256CB7 /* open_extrabytes.test */, - 4BC03F7E1FDD55C1003C7B62 /* open_file_count.test */, - 4BD35E931A33366200256CB7 /* open_filename_duplicate_consistency.test */, - 4BD35E941A33366200256CB7 /* open_filename_duplicate_empty_consistency.test */, - 4BD35E951A33366200256CB7 /* open_filename_duplicate_empty.test */, - 4BD35E961A33366200256CB7 /* open_filename_duplicate.test */, - 4BD35E971A33366200256CB7 /* open_filename_empty.test */, - 4BD35E981A33366200256CB7 /* open_incons.test */, - 4BC03F961FDD55C5003C7B62 /* open_many_fail.test */, - 4BD35E991A33366200256CB7 /* open_many_ok.test */, - 4BC03F801FDD55C2003C7B62 /* open_multidisk.test */, - 4BD35E9A1A33366200256CB7 /* open_new_but_exists.test */, - 4BD35E9B1A33366200256CB7 /* open_new_ok.test */, - 4BD35E9C1A33366200256CB7 /* open_nonarchive.test */, - 4BD35E9D1A33366200256CB7 /* open_nosuchfile.test */, - 4BD35E9E1A33366200256CB7 /* open_ok.test */, - 4BD35E9F1A33366200256CB7 /* open_too_short.test */, - 4BD35EA01A33366200256CB7 /* open_truncate.test */, - 4BC03F861FDD55C3003C7B62 /* open_zip64_3mf.test */, - 4BD35EA11A33366200256CB7 /* open_zip64_ok.test */, - 4BC03F7D1FDD55C1003C7B62 /* preload.test */, - 4BC03F8C1FDD55C4003C7B62 /* progress.test */, - 4BD35EA21A33366200256CB7 /* rename_ascii.test */, - 4BD35EA31A33366200256CB7 /* rename_cp437.test */, - 4BD35EA41A33366200256CB7 /* rename_deleted.test */, - 4BD35EA51A33366200256CB7 /* rename_fail.test */, - 4BD35EA61A33366200256CB7 /* rename_ok.test */, - 4BD35EA81A33366200256CB7 /* rename_utf8_encmismatch.test */, - 4BD35EA91A33366200256CB7 /* rename_utf8.test */, - 4BD35EAA1A33366200256CB7 /* set_comment_all.test */, - 4BD35EAB1A33366200256CB7 /* set_comment_localonly.test */, - 4BD35EAC1A33366200256CB7 /* set_comment_removeglobal.test */, - 4BD35EAD1A33366200256CB7 /* set_comment_revert.test */, - 4BC03F971FDD55C5003C7B62 /* set_compression_bzip2_to_deflate.test */, - 4BC03F811FDD55C2003C7B62 /* set_compression_deflate_to_bzip2.test */, - 4BD35EAE1A33366200256CB7 /* set_compression_deflate_to_deflate.test */, - 4BD35EAF1A33366200256CB7 /* set_compression_deflate_to_store.test */, - 4BC03F851FDD55C3003C7B62 /* set_compression_store_to_bzip2.test */, - 4BD35EB01A33366200256CB7 /* set_compression_store_to_deflate.test */, - 4BD35EB11A33366200256CB7 /* set_compression_store_to_store.test */, - 4B00CA29242F5C2500E0B71C /* set_compression_store_to_xz.test */, - 4BD35EB21A33366200256CB7 /* set_compression_unknown.test */, - 4B00CA2C242F5C2500E0B71C /* set_compression_xz_to_store.test */, - 4B00CA27242F5C2500E0B71C /* set_file_dostime.test */, - 4BC03F981FDD55C5003C7B62 /* set_file_mtime.test */, - 4BD35EB41A33366200256CB7 /* stat_index_cp437_guess.test */, - 4BD35EB51A33366200256CB7 /* stat_index_cp437_raw.test */, - 4BD35EB61A33366200256CB7 /* stat_index_cp437_strict.test */, - 4BD35EB71A33366200256CB7 /* stat_index_fileorder.test */, - 4BD35EB81A33366200256CB7 /* stat_index_streamed_zip64.test */, - 4BD35EB91A33366200256CB7 /* stat_index_streamed.test */, - 4BD35EBA1A33366200256CB7 /* stat_index_utf8_guess.test */, - 4BD35EBB1A33366200256CB7 /* stat_index_utf8_raw.test */, - 4BD35EBC1A33366200256CB7 /* stat_index_utf8_strict.test */, - 4BD35EBD1A33366200256CB7 /* stat_index_utf8_unmarked_strict.test */, - 4BD35EBE1A33366200256CB7 /* stat_index_zip64.test */, - 4BD35EE11A33366300256CB7 /* utf-8-standardization.test */, - 4BC03F781FDD55C1003C7B62 /* zip-in-archive-comment.test */, - 4BD35EE31A33366300256CB7 /* zip64_creation.test */, - 4BD35EE41A33366300256CB7 /* zip64_stored_creation.test */, - ); - name = "test cases"; - sourceTree = ""; - }; - 4BDC71BD15B181DA00236D3C = { - isa = PBXGroup; - children = ( - 4B3FAE832385C9E900192D6A /* README Xcode Project.md */, - 4B28AA2815BAD4F800D0C17D /* info */, - 4BDC71E415B182B200236D3C /* Supporting Files */, - 3D7E353E1B33063600022624 /* examples */, - 4BDC71E315B182B200236D3C /* libzip */, - 4B01D72015B2F54C002D5007 /* src */, - 4BACD57415BC2AA100920691 /* regress */, - 4B28A9EA15BACBE100D0C17D /* man */, - 4BDC71CA15B181DA00236D3C /* Frameworks */, - 4BDC71C915B181DA00236D3C /* Products */, - ); - sourceTree = ""; - tabWidth = 8; - }; - 4BDC71C915B181DA00236D3C /* Products */ = { - isa = PBXGroup; - children = ( - 4B01D68B15B2F3F1002D5007 /* libzip.framework */, - 4B01D6FD15B2F4B1002D5007 /* zipmerge */, - 4B01D71315B2F4EB002D5007 /* zipcmp */, - 4BACD58915BC2CEA00920691 /* ziptool */, - 4BACD5C115BC2DC900920691 /* add_from_filep */, - 4BACD5D015BC2DF200920691 /* fopen_unchanged */, - 4BACD5DF15BC2F3700920691 /* fread */, - 4BACD65015BC301300920691 /* tryopen */, - 4BD6CB6C19E71CD100710654 /* hole */, - 3D7E35371B3305FB00022624 /* in-memory */, - 4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */, - 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */, - ); - name = Products; - sourceTree = ""; - }; - 4BDC71CA15B181DA00236D3C /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4B9E578724C9770C00CEE0D6 /* libzstd.1.4.5.dylib */, - 4B3FAE812385C79200192D6A /* liblzma.5.dylib */, - 4BE92AA820345E5500509BC8 /* libnettle.6.dylib */, - 4BE92AA620345E3800509BC8 /* libbz2.tbd */, - 4BE92AA420345E2E00509BC8 /* libgnutls.30.dylib */, - 3D7E35471B33076C00022624 /* libz.dylib */, - 4B01D70815B2F4CF002D5007 /* libz.dylib */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4BDC71E315B182B200236D3C /* libzip */ = { - isa = PBXGroup; - children = ( - 4B77E61A1FDDCD3A006786BA /* CMakeLists.txt */, - 4BD25DA51CF58790005A9EC4 /* compat.h */, - 4BDC72A015B1B56400236D3C /* config.h */, - 4BDC71F115B1B25E00236D3C /* zip_add_dir.c */, - 4BDC71F215B1B25E00236D3C /* zip_add_entry.c */, - 4BDC71F315B1B25E00236D3C /* zip_add.c */, - 4B0454B41E8E3DF7002FA1F9 /* zip_algorithm_bzip2.c */, - 4B0454B51E8E3DF7002FA1F9 /* zip_algorithm_deflate.c */, - 4B3FAE7F2385C5A300192D6A /* zip_algorithm_xz.c */, - 4B9E577A24C7026B00CEE0D6 /* zip_algorithm_zstd.c */, - 4BCB434119E9347E0067FAA3 /* zip_buffer.c */, - 4BDC71F415B1B25E00236D3C /* zip_close.c */, - 4BE92AB1203597D700509BC8 /* zip_crypto_commoncrypto.c */, - 4BE92AB0203597D700509BC8 /* zip_crypto_commoncrypto.h */, - 4B69E6F020330D460001EEE7 /* zip_crypto_gnutls.c */, - 4B69E6F2203341D50001EEE7 /* zip_crypto_gnutls.h */, - 4B9E578424C9769F00CEE0D6 /* zip_crypto_mbedtls.c */, - 4B9E578624C9769F00CEE0D6 /* zip_crypto_mbedtls.h */, - 4BE92AAB20346B1900509BC8 /* zip_crypto_openssl.c */, - 4BE92AAA20346B1900509BC8 /* zip_crypto_openssl.h */, - 4B9E578324C9769F00CEE0D6 /* zip_crypto_win.c */, - 4B9E578524C9769F00CEE0D6 /* zip_crypto_win.h */, - 4B69E6F3203342E30001EEE7 /* zip_crypto.h */, - 4BDC71F515B1B25E00236D3C /* zip_delete.c */, - 4BDC71F615B1B25E00236D3C /* zip_dir_add.c */, - 4BDC71F715B1B25E00236D3C /* zip_dirent.c */, - 4BDC71F815B1B25E00236D3C /* zip_discard.c */, - 4BDC71F915B1B25E00236D3C /* zip_entry.c */, - 4B9E578924C9779900CEE0D6 /* zip_err_str.c */, - 4BDC71FB15B1B25E00236D3C /* zip_error_clear.c */, - 4BDC71FC15B1B25E00236D3C /* zip_error_get_sys_type.c */, - 4BDC71FD15B1B25E00236D3C /* zip_error_get.c */, - 4BDC71FE15B1B25E00236D3C /* zip_error_strerror.c */, - 4BDC71FF15B1B25E00236D3C /* zip_error_to_str.c */, - 4BDC720015B1B25E00236D3C /* zip_error.c */, - 4BDC720115B1B25E00236D3C /* zip_extra_field_api.c */, - 4BDC720215B1B25E00236D3C /* zip_extra_field.c */, - 4BDC720315B1B25E00236D3C /* zip_fclose.c */, - 4BDC720415B1B25E00236D3C /* zip_fdopen.c */, - 4BDC720515B1B25E00236D3C /* zip_file_add.c */, - 4BDC720615B1B25E00236D3C /* zip_file_error_clear.c */, - 4BDC720715B1B25E00236D3C /* zip_file_error_get.c */, - 4BDC720815B1B25E00236D3C /* zip_file_get_comment.c */, - 4B97204D188EBE85002FAFAD /* zip_file_get_external_attributes.c */, - 4BDC720915B1B25E00236D3C /* zip_file_get_offset.c */, - 4BDC720A15B1B25E00236D3C /* zip_file_rename.c */, - 4BDC720B15B1B25E00236D3C /* zip_file_replace.c */, - 4BDC720C15B1B25E00236D3C /* zip_file_set_comment.c */, - 736ED9B71E3D688C00C36873 /* zip_file_set_encryption.c */, - 4B97204E188EBE85002FAFAD /* zip_file_set_external_attributes.c */, - 4B82CED319915F360097BC18 /* zip_file_set_mtime.c */, - 4BDC720D15B1B25E00236D3C /* zip_file_strerror.c */, - 4BDC720F15B1B25E00236D3C /* zip_fopen_encrypted.c */, - 4BDC721015B1B25E00236D3C /* zip_fopen_index_encrypted.c */, - 4BDC721115B1B25E00236D3C /* zip_fopen_index.c */, - 4BDC721215B1B25E00236D3C /* zip_fopen.c */, - 4BDC721315B1B25E00236D3C /* zip_fread.c */, - 4B3A5F4D1DF96D83005A53A1 /* zip_fseek.c */, - 4B3A5F4E1DF96D83005A53A1 /* zip_ftell.c */, - 4BDC721415B1B25E00236D3C /* zip_get_archive_comment.c */, - 4BDC721515B1B25E00236D3C /* zip_get_archive_flag.c */, - 4BDC721715B1B25E00236D3C /* zip_get_encryption_implementation.c */, - 4BDC721815B1B25E00236D3C /* zip_get_file_comment.c */, - 4BDC721915B1B25E00236D3C /* zip_get_name.c */, - 4BDC721A15B1B25E00236D3C /* zip_get_num_entries.c */, - 4BDC721B15B1B25E00236D3C /* zip_get_num_files.c */, - 3D9284801C309510001EABA7 /* zip_hash.c */, - 4BCF3019199A2F820064207B /* zip_io_util.c */, - 4B908F502385BE6C00886355 /* zip_libzip_version.c */, - 4BDC721C15B1B25E00236D3C /* zip_memdup.c */, - 4B5169A722A7993D00AA4340 /* zip_mkstempm.c */, - 4BDC721D15B1B25E00236D3C /* zip_name_locate.c */, - 4BDC721E15B1B25E00236D3C /* zip_new.c */, - 4BDC721F15B1B25E00236D3C /* zip_open.c */, - 4B00CA22242F59D700E0B71C /* zip_pkware.c */, - 4BD708781EB1CF73003F351F /* zip_progress.c */, - 736ED9B81E3D688C00C36873 /* zip_random_unix.c */, - 4B939967246E842200AEBDA4 /* zip_random_uwp.c */, - 4B939966246E842200AEBDA4 /* zip_random_win32.c */, - 4BDC722015B1B25E00236D3C /* zip_rename.c */, - 4BDC722115B1B25E00236D3C /* zip_replace.c */, - 4BDC722215B1B25E00236D3C /* zip_set_archive_comment.c */, - 4BDC722315B1B25E00236D3C /* zip_set_archive_flag.c */, - 4BDC722415B1B25E00236D3C /* zip_set_default_password.c */, - 4BDC722515B1B25E00236D3C /* zip_set_file_comment.c */, - 4BDC722615B1B25E00236D3C /* zip_set_file_compression.c */, - 4BDC722715B1B25E00236D3C /* zip_set_name.c */, - 4B908F522385BE6D00886355 /* zip_source_accept_empty.c */, - 4BC03FA21FDD6B6F003C7B62 /* zip_source_begin_write_cloning.c */, - 4BCF301A199A2F820064207B /* zip_source_begin_write.c */, - 4BDC722815B1B25E00236D3C /* zip_source_buffer.c */, - 4BD5053219A0116D007DD28A /* zip_source_call.c */, - 4BDC722915B1B25E00236D3C /* zip_source_close.c */, - 4BCF301B199A2F820064207B /* zip_source_commit_write.c */, - 4B0454B61E8E3DF7002FA1F9 /* zip_source_compress.c */, - 4BDC722A15B1B25E00236D3C /* zip_source_crc.c */, - 4BDC722C15B1B25E00236D3C /* zip_source_error.c */, - 4B93995624631B3E00AEBDA4 /* zip_source_file_common.c */, - 4B93995524631B3D00AEBDA4 /* zip_source_file_stdio_named.c */, - 4B93995724631B3E00AEBDA4 /* zip_source_file_stdio.c */, - 4B93995824631B3E00AEBDA4 /* zip_source_file_stdio.h */, - 4B93996124641D5700AEBDA4 /* zip_source_file_win32_ansi.c */, - 4B93996424644E7E00AEBDA4 /* zip_source_file_win32_named.c */, - 4B93996224643F5700AEBDA4 /* zip_source_file_win32_utf8.c */, - 4B9399632464401300AEBDA4 /* zip_source_file_win32_utf16.c */, - 4B93996024640B1700AEBDA4 /* zip_source_file_win32.c */, - 4B93995F24640B1700AEBDA4 /* zip_source_file_win32.h */, - 4B93995924631B3E00AEBDA4 /* zip_source_file.h */, - 4BDC722F15B1B25E00236D3C /* zip_source_free.c */, - 4BDC723015B1B25E00236D3C /* zip_source_function.c */, - 4B5D0CD4244B154E006C2E93 /* zip_source_get_file_attributes.c */, - 4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */, - 4BDC723115B1B25E00236D3C /* zip_source_layered.c */, - 4BDC723215B1B25E00236D3C /* zip_source_open.c */, - 4B00CA21242F59D700E0B71C /* zip_source_pkware_decode.c */, - 4B00CA23242F59D700E0B71C /* zip_source_pkware_encode.c */, - 4BDC723515B1B25E00236D3C /* zip_source_read.c */, - 4BCF3031199ABD3A0064207B /* zip_source_remove.c */, - 4BCF301C199A2F820064207B /* zip_source_rollback_write.c */, - 4BCF3034199ABDDA0064207B /* zip_source_seek_write.c */, - 4BCF301D199A2F820064207B /* zip_source_seek.c */, - 4BDC723615B1B25E00236D3C /* zip_source_stat.c */, - 4BCF301E199A2F820064207B /* zip_source_supports.c */, - 4BCF3035199ABDDA0064207B /* zip_source_tell_write.c */, - 4BCF301F199A2F820064207B /* zip_source_tell.c */, - 4BDC723715B1B25E00236D3C /* zip_source_window.c */, - 736ED9B91E3D688C00C36873 /* zip_source_winzip_aes_decode.c */, - 736ED9BA1E3D688C00C36873 /* zip_source_winzip_aes_encode.c */, - 4BCF3020199A2F820064207B /* zip_source_write.c */, - 4BDC723815B1B25E00236D3C /* zip_source_zip_new.c */, - 4BDC723915B1B25E00236D3C /* zip_source_zip.c */, - 4BDC723A15B1B25E00236D3C /* zip_stat_index.c */, - 4BDC723B15B1B25E00236D3C /* zip_stat_init.c */, - 4BDC723C15B1B25E00236D3C /* zip_stat.c */, - 4BDC723D15B1B25E00236D3C /* zip_strerror.c */, - 4BDC723E15B1B25E00236D3C /* zip_string.c */, - 4BDC723F15B1B25E00236D3C /* zip_unchange_all.c */, - 4BDC724015B1B25E00236D3C /* zip_unchange_archive.c */, - 4BDC724115B1B25E00236D3C /* zip_unchange_data.c */, - 4BDC724215B1B25E00236D3C /* zip_unchange.c */, - 4BDC724315B1B25E00236D3C /* zip_utf-8.c */, - 4B69E6ED2032F1870001EEE7 /* zip_winzip_aes.c */, - 4BDC729815B1B2A600236D3C /* zip.h */, - 4BDC729E15B1B4E900236D3C /* zipconf.h */, - 4BDC729915B1B2A600236D3C /* zipint.h */, - ); - name = libzip; - path = ../lib; - sourceTree = ""; - }; - 4BDC71E415B182B200236D3C /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3D77B86517009AA1000A5794 /* extract-version.sh */, - 4B01D73D15B2FB6B002D5007 /* Info.plist */, - ); - name = "Supporting Files"; - path = libzip; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4B01D68815B2F3F1002D5007 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BE92AB3203597D700509BC8 /* zip_crypto_commoncrypto.h in Headers */, - 4B93995D24631B3E00AEBDA4 /* zip_source_file_stdio.h in Headers */, - 4BE92AAD20346B1900509BC8 /* zip_crypto_openssl.h in Headers */, - 4B93995E24631B3E00AEBDA4 /* zip_source_file.h in Headers */, - 4B01D73215B2F5EE002D5007 /* zipconf.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 3D7E35361B3305FB00022624 /* in-memory */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3D7E353D1B3305FB00022624 /* Build configuration list for PBXNativeTarget "in-memory" */; - buildPhases = ( - 3D7E35331B3305FB00022624 /* Sources */, - 3D7E35341B3305FB00022624 /* Frameworks */, - 3D7E35351B3305FB00022624 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 3D7E35451B33064500022624 /* PBXTargetDependency */, - ); - name = "in-memory"; - productName = "in-memory-example"; - productReference = 3D7E35371B3305FB00022624 /* in-memory */; - productType = "com.apple.product-type.tool"; - }; - 4B01D68A15B2F3F1002D5007 /* libzip */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4B01D69E15B2F3F1002D5007 /* Build configuration list for PBXNativeTarget "libzip" */; - buildPhases = ( - 4B01D68615B2F3F1002D5007 /* Sources */, - 4B01D68715B2F3F1002D5007 /* Frameworks */, - 4B01D68815B2F3F1002D5007 /* Headers */, - 4B01D68915B2F3F1002D5007 /* Resources */, - 3D77B86617009AC5000A5794 /* Copy Version Info from config.h */, - 4B972053188EBEB8002FAFAD /* Fix zipconf.h include. */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = libzip; - productName = "libzip Mac"; - productReference = 4B01D68B15B2F3F1002D5007 /* libzip.framework */; - productType = "com.apple.product-type.framework"; - }; - 4B01D6FC15B2F4B1002D5007 /* zipmerge */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4B01D70415B2F4B1002D5007 /* Build configuration list for PBXNativeTarget "zipmerge" */; - buildPhases = ( - 4B01D6F915B2F4B1002D5007 /* Sources */, - 4B01D6FA15B2F4B1002D5007 /* Frameworks */, - 4B01D6FB15B2F4B1002D5007 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4B01D73615B2F639002D5007 /* PBXTargetDependency */, - ); - name = zipmerge; - productName = zipmerge; - productReference = 4B01D6FD15B2F4B1002D5007 /* zipmerge */; - productType = "com.apple.product-type.tool"; - }; - 4B01D70A15B2F4EB002D5007 /* zipcmp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4B01D71015B2F4EB002D5007 /* Build configuration list for PBXNativeTarget "zipcmp" */; - buildPhases = ( - 4B01D70B15B2F4EB002D5007 /* Sources */, - 4B01D70C15B2F4EB002D5007 /* Frameworks */, - 4B01D70F15B2F4EB002D5007 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4B01D73815B2F643002D5007 /* PBXTargetDependency */, - ); - name = zipcmp; - productName = zipcmp; - productReference = 4B01D71315B2F4EB002D5007 /* zipcmp */; - productType = "com.apple.product-type.tool"; - }; - 4B51DDB41FDAE20A00C5CA85 /* ziptool_regress */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4B51DDBD1FDAE20A00C5CA85 /* Build configuration list for PBXNativeTarget "ziptool_regress" */; - buildPhases = ( - 4B51DDB71FDAE20A00C5CA85 /* Sources */, - 4B51DDB91FDAE20A00C5CA85 /* Frameworks */, - 4B51DDBC1FDAE20A00C5CA85 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4B51DDB51FDAE20A00C5CA85 /* PBXTargetDependency */, - ); - name = ziptool_regress; - productName = ziptool; - productReference = 4B51DDC01FDAE20A00C5CA85 /* ziptool_regress */; - productType = "com.apple.product-type.tool"; - }; - 4BACD58815BC2CEA00920691 /* ziptool */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BACD59015BC2CEA00920691 /* Build configuration list for PBXNativeTarget "ziptool" */; - buildPhases = ( - 4BACD58515BC2CEA00920691 /* Sources */, - 4BACD58615BC2CEA00920691 /* Frameworks */, - 4BACD58715BC2CEA00920691 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BACD59715BC2D3800920691 /* PBXTargetDependency */, - ); - name = ziptool; - productName = ziptool; - productReference = 4BACD58915BC2CEA00920691 /* ziptool */; - productType = "com.apple.product-type.tool"; - }; - 4BACD5B515BC2DC900920691 /* add_from_filep */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BACD5BE15BC2DC900920691 /* Build configuration list for PBXNativeTarget "add_from_filep" */; - buildPhases = ( - 4BACD5B815BC2DC900920691 /* Sources */, - 4BACD5BA15BC2DC900920691 /* Frameworks */, - 4BACD5BD15BC2DC900920691 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BACD5B615BC2DC900920691 /* PBXTargetDependency */, - ); - name = add_from_filep; - productName = add_from_filep; - productReference = 4BACD5C115BC2DC900920691 /* add_from_filep */; - productType = "com.apple.product-type.tool"; - }; - 4BACD5C415BC2DF200920691 /* fopen_unchanged */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BACD5CD15BC2DF200920691 /* Build configuration list for PBXNativeTarget "fopen_unchanged" */; - buildPhases = ( - 4BACD5C715BC2DF200920691 /* Sources */, - 4BACD5C915BC2DF200920691 /* Frameworks */, - 4BACD5CC15BC2DF200920691 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BACD5C515BC2DF200920691 /* PBXTargetDependency */, - ); - name = fopen_unchanged; - productName = fopen_unchanged; - productReference = 4BACD5D015BC2DF200920691 /* fopen_unchanged */; - productType = "com.apple.product-type.tool"; - }; - 4BACD5D315BC2F3700920691 /* fread */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BACD5DC15BC2F3700920691 /* Build configuration list for PBXNativeTarget "fread" */; - buildPhases = ( - 4BACD5D615BC2F3700920691 /* Sources */, - 4BACD5D815BC2F3700920691 /* Frameworks */, - 4BACD5DB15BC2F3700920691 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BACD5D415BC2F3700920691 /* PBXTargetDependency */, - ); - name = fread; - productName = fread; - productReference = 4BACD5DF15BC2F3700920691 /* fread */; - productType = "com.apple.product-type.tool"; - }; - 4BACD64515BC301300920691 /* tryopen */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BACD64D15BC301300920691 /* Build configuration list for PBXNativeTarget "tryopen" */; - buildPhases = ( - 4BACD64815BC301300920691 /* Sources */, - 4BACD64915BC301300920691 /* Frameworks */, - 4BACD64C15BC301300920691 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BACD64615BC301300920691 /* PBXTargetDependency */, - ); - name = tryopen; - productName = tryopen; - productReference = 4BACD65015BC301300920691 /* tryopen */; - productType = "com.apple.product-type.tool"; - }; - 4BD6CB5F19E71CD100710654 /* hole */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BD6CB6919E71CD100710654 /* Build configuration list for PBXNativeTarget "hole" */; - buildPhases = ( - 4BD6CB6219E71CD100710654 /* Sources */, - 4BD6CB6519E71CD100710654 /* Frameworks */, - 4BD6CB6819E71CD100710654 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - 4BD6CB6019E71CD100710654 /* PBXTargetDependency */, - ); - name = hole; - productName = hole; - productReference = 4BD6CB6C19E71CD100710654 /* hole */; - productType = "com.apple.product-type.tool"; - }; - 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */; - buildPhases = ( - 4BFF2B481FE12FCA006EF3F3 /* Sources */, - 4BFF2B4A1FE12FCA006EF3F3 /* Frameworks */, - 4BFF2B4D1FE12FCA006EF3F3 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = can_clone_file; - productName = tryopen; - productReference = 4BFF2B511FE12FCA006EF3F3 /* can_clone_file */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 4BDC71BF15B181DA00236D3C /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1140; - ORGANIZATIONNAME = NiH; - TargetAttributes = { - 3D7E35361B3305FB00022624 = { - CreatedOnToolsVersion = 6.3.2; - }; - }; - }; - buildConfigurationList = 4BDC71C215B181DA00236D3C /* Build configuration list for PBXProject "libzip" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 4BDC71BD15B181DA00236D3C; - productRefGroup = 4BDC71C915B181DA00236D3C /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 4B54447915C977A20067BA33 /* all */, - 4B01D72815B2F5A2002D5007 /* command line tools */, - 4BCF6A681C3BDDD500F036E9 /* examples */, - 4BACD5A715BC2D8200920691 /* test programs */, - 4B01D68A15B2F3F1002D5007 /* libzip */, - 4B01D6FC15B2F4B1002D5007 /* zipmerge */, - 4B01D70A15B2F4EB002D5007 /* zipcmp */, - 3D7E35361B3305FB00022624 /* in-memory */, - 4BACD5B515BC2DC900920691 /* add_from_filep */, - 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */, - 4BACD5C415BC2DF200920691 /* fopen_unchanged */, - 4BACD5D315BC2F3700920691 /* fread */, - 4BD6CB5F19E71CD100710654 /* hole */, - 4BACD58815BC2CEA00920691 /* ziptool */, - 4BACD64515BC301300920691 /* tryopen */, - 4B51DDB41FDAE20A00C5CA85 /* ziptool_regress */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4B01D68915B2F3F1002D5007 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B00CA32242F5C2500E0B71C /* set_compression_xz_to_store.test in Resources */, - 4B00CA2E242F5C2500E0B71C /* cancel_45.test in Resources */, - 4B00CA31242F5C2500E0B71C /* cancel_90.test in Resources */, - 4B00CA2D242F5C2500E0B71C /* set_file_dostime.test in Resources */, - 4B00CA30242F5C2500E0B71C /* encryption-nonrandom-pkware.test in Resources */, - 4B00CA2F242F5C2500E0B71C /* set_compression_store_to_xz.test in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3D77B86617009AC5000A5794 /* Copy Version Info from config.h */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Version Info from config.h"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "./extract-version.sh \"config.h\" \"Info.plist\" "; - }; - 4B972053188EBEB8002FAFAD /* Fix zipconf.h include. */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Fix zipconf.h include."; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "sed \"s,,<$EXECUTABLE_NAME/zipconf.h>,\" ../lib/zip.h > \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Headers/zip.h\""; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3D7E35331B3305FB00022624 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D7E35431B33063F00022624 /* in-memory.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D68615B2F3F1002D5007 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D7E35491B330AD500022624 /* zip_source_is_deleted.c in Sources */, - 4BCF3039199ABDDA0064207B /* zip_source_tell_write.c in Sources */, - 4B01D6A615B2F46B002D5007 /* zip_add_dir.c in Sources */, - 4B972052188EBE85002FAFAD /* zip_file_set_external_attributes.c in Sources */, - 4B0454BA1E8E3E08002FA1F9 /* zip_source_compress.c in Sources */, - 4B3FAE802385C5CC00192D6A /* zip_algorithm_xz.c in Sources */, - 4BCF3024199A2F820064207B /* zip_source_begin_write.c in Sources */, - 4B01D6A715B2F46B002D5007 /* zip_add_entry.c in Sources */, - 4B01D6A815B2F46B002D5007 /* zip_add.c in Sources */, - 4B01D6A915B2F46B002D5007 /* zip_close.c in Sources */, - 4B01D6AA15B2F46B002D5007 /* zip_delete.c in Sources */, - 4B01D6AB15B2F46B002D5007 /* zip_dir_add.c in Sources */, - 4BD7087A1EB1CF73003F351F /* zip_progress.c in Sources */, - 4B01D6AC15B2F46B002D5007 /* zip_dirent.c in Sources */, - 4B00CA24242F59D700E0B71C /* zip_source_pkware_decode.c in Sources */, - 4B93995A24631B3E00AEBDA4 /* zip_source_file_stdio_named.c in Sources */, - 4B01D6AD15B2F46B002D5007 /* zip_discard.c in Sources */, - 4B00CA25242F59D700E0B71C /* zip_pkware.c in Sources */, - 4B01D6AE15B2F46B002D5007 /* zip_entry.c in Sources */, - 4B3A5F521DF96EB4005A53A1 /* zip_fseek.c in Sources */, - 4B01D6B015B2F46B002D5007 /* zip_error_clear.c in Sources */, - 4B01D6B115B2F46B002D5007 /* zip_error_get_sys_type.c in Sources */, - 4B01D6B215B2F46B002D5007 /* zip_error_get.c in Sources */, - 4B01D6B315B2F46B002D5007 /* zip_error_strerror.c in Sources */, - 4B01D6B415B2F46B002D5007 /* zip_error_to_str.c in Sources */, - 4B01D6B515B2F46B002D5007 /* zip_error.c in Sources */, - 736ED9BB1E3D6B6B00C36873 /* zip_source_winzip_aes_decode.c in Sources */, - 4B01D6B615B2F46B002D5007 /* zip_extra_field_api.c in Sources */, - 4B9E578A24C9779900CEE0D6 /* zip_err_str.c in Sources */, - 4B3A5F531DF96EB4005A53A1 /* zip_ftell.c in Sources */, - 4B01D6B715B2F46B002D5007 /* zip_extra_field.c in Sources */, - 4B01D6B815B2F46B002D5007 /* zip_fclose.c in Sources */, - 4B01D6B915B2F46B002D5007 /* zip_fdopen.c in Sources */, - 4B01D6BA15B2F46B002D5007 /* zip_file_add.c in Sources */, - 4B01D6BB15B2F46B002D5007 /* zip_file_error_clear.c in Sources */, - 4BCF3026199A2F820064207B /* zip_source_commit_write.c in Sources */, - 4B93995C24631B3E00AEBDA4 /* zip_source_file_stdio.c in Sources */, - 4B01D6BC15B2F46B002D5007 /* zip_file_error_get.c in Sources */, - 4B01D6BD15B2F46B002D5007 /* zip_file_get_comment.c in Sources */, - 4B01D6BE15B2F46B002D5007 /* zip_file_get_offset.c in Sources */, - 4B01D6BF15B2F46B002D5007 /* zip_file_rename.c in Sources */, - 4B0454BD1E8E3E24002FA1F9 /* zip_algorithm_deflate.c in Sources */, - 4B01D6C015B2F46B002D5007 /* zip_file_replace.c in Sources */, - 4B01D6C115B2F46B002D5007 /* zip_file_set_comment.c in Sources */, - 4BCF3033199ABD3A0064207B /* zip_source_remove.c in Sources */, - 4B01D6C215B2F46B002D5007 /* zip_file_strerror.c in Sources */, - 4B01D6C415B2F46B002D5007 /* zip_fopen_encrypted.c in Sources */, - 4BCF302A199A2F820064207B /* zip_source_seek.c in Sources */, - 4B01D6C515B2F46B002D5007 /* zip_fopen_index_encrypted.c in Sources */, - 4B01D6C615B2F46B002D5007 /* zip_fopen_index.c in Sources */, - 4B5169A822A7993E00AA4340 /* zip_mkstempm.c in Sources */, - 4B69E6EE2032F18B0001EEE7 /* zip_winzip_aes.c in Sources */, - 4B01D6C715B2F46B002D5007 /* zip_fopen.c in Sources */, - 3D9284821C309510001EABA7 /* zip_hash.c in Sources */, - 4B01D6C815B2F46B002D5007 /* zip_fread.c in Sources */, - 736ED9BF1E3D6B7C00C36873 /* zip_file_set_encryption.c in Sources */, - 4B01D6C915B2F46B002D5007 /* zip_get_archive_comment.c in Sources */, - 4B5D0CD5244B154E006C2E93 /* zip_source_get_file_attributes.c in Sources */, - 4B01D6CA15B2F46B002D5007 /* zip_get_archive_flag.c in Sources */, - 4BE92AB5203597D700509BC8 /* zip_crypto_commoncrypto.c in Sources */, - 4B0454BC1E8E3E24002FA1F9 /* zip_algorithm_bzip2.c in Sources */, - 736ED9BC1E3D6B6F00C36873 /* zip_source_winzip_aes_encode.c in Sources */, - 4BD5053419A01BB0007DD28A /* zip_source_call.c in Sources */, - 4B93995B24631B3E00AEBDA4 /* zip_source_file_common.c in Sources */, - 4BCF3030199A2F820064207B /* zip_source_write.c in Sources */, - 4B01D6CC15B2F46B002D5007 /* zip_get_encryption_implementation.c in Sources */, - 4B908F552385BE6D00886355 /* zip_source_accept_empty.c in Sources */, - 4B01D6CD15B2F46B002D5007 /* zip_get_file_comment.c in Sources */, - 4B01D6CE15B2F46B002D5007 /* zip_get_name.c in Sources */, - 4B01D6CF15B2F46B002D5007 /* zip_get_num_entries.c in Sources */, - 4B01D6D015B2F46B002D5007 /* zip_get_num_files.c in Sources */, - 4B01D6D115B2F46B002D5007 /* zip_memdup.c in Sources */, - 4B01D6D215B2F46B002D5007 /* zip_name_locate.c in Sources */, - 4B9E577C24C7202000CEE0D6 /* zip_algorithm_zstd.c in Sources */, - 4B01D6D315B2F46B002D5007 /* zip_new.c in Sources */, - 4B01D6D415B2F46B002D5007 /* zip_open.c in Sources */, - 4B01D6D515B2F46B002D5007 /* zip_rename.c in Sources */, - 4BCF302E199A2F820064207B /* zip_source_tell.c in Sources */, - 4B542C2C22B12E3900960B38 /* zip_random_unix.c in Sources */, - 4B972050188EBE85002FAFAD /* zip_file_get_external_attributes.c in Sources */, - 4B01D6D615B2F46B002D5007 /* zip_replace.c in Sources */, - 4B01D6D715B2F46B002D5007 /* zip_set_archive_comment.c in Sources */, - 4B01D6D815B2F46B002D5007 /* zip_set_archive_flag.c in Sources */, - 4B01D6D915B2F46B002D5007 /* zip_set_default_password.c in Sources */, - 4B01D6DA15B2F46B002D5007 /* zip_set_file_comment.c in Sources */, - 4B01D6DB15B2F46B002D5007 /* zip_set_file_compression.c in Sources */, - 4B01D6DC15B2F46B002D5007 /* zip_set_name.c in Sources */, - 4B01D6DD15B2F46B002D5007 /* zip_source_buffer.c in Sources */, - 4BCB434319E9347E0067FAA3 /* zip_buffer.c in Sources */, - 4B01D6DE15B2F46B002D5007 /* zip_source_close.c in Sources */, - 4B01D6DF15B2F46B002D5007 /* zip_source_crc.c in Sources */, - 4B01D6E115B2F46B002D5007 /* zip_source_error.c in Sources */, - 4B01D6E415B2F46B002D5007 /* zip_source_free.c in Sources */, - 4B01D6E515B2F46B002D5007 /* zip_source_function.c in Sources */, - 4BCF3022199A2F820064207B /* zip_io_util.c in Sources */, - 4B01D6E615B2F46B002D5007 /* zip_source_layered.c in Sources */, - 4B01D6E715B2F46B002D5007 /* zip_source_open.c in Sources */, - 4B908F532385BE6D00886355 /* zip_libzip_version.c in Sources */, - 4B01D6EA15B2F46B002D5007 /* zip_source_read.c in Sources */, - 4BC03FA41FDD6B6F003C7B62 /* zip_source_begin_write_cloning.c in Sources */, - 4B01D6EB15B2F46B002D5007 /* zip_source_stat.c in Sources */, - 4BCF302C199A2F820064207B /* zip_source_supports.c in Sources */, - 4B01D6EC15B2F46B002D5007 /* zip_source_window.c in Sources */, - 4B01D6ED15B2F46B002D5007 /* zip_source_zip_new.c in Sources */, - 4B01D6EE15B2F46B002D5007 /* zip_source_zip.c in Sources */, - 4B01D6EF15B2F46B002D5007 /* zip_stat_index.c in Sources */, - 4B01D6F015B2F46B002D5007 /* zip_stat_init.c in Sources */, - 4B82CED519915F360097BC18 /* zip_file_set_mtime.c in Sources */, - 4B01D6F115B2F46B002D5007 /* zip_stat.c in Sources */, - 4B01D6F215B2F46B002D5007 /* zip_strerror.c in Sources */, - 4B01D6F315B2F46B002D5007 /* zip_string.c in Sources */, - 4B01D6F415B2F46B002D5007 /* zip_unchange_all.c in Sources */, - 4B01D6F515B2F46B002D5007 /* zip_unchange_archive.c in Sources */, - 4BCF3028199A2F820064207B /* zip_source_rollback_write.c in Sources */, - 4BCF3037199ABDDA0064207B /* zip_source_seek_write.c in Sources */, - 4B01D6F615B2F46B002D5007 /* zip_unchange_data.c in Sources */, - 4B01D6F715B2F46B002D5007 /* zip_unchange.c in Sources */, - 4B00CA26242F59D700E0B71C /* zip_source_pkware_encode.c in Sources */, - 4B01D6F815B2F46B002D5007 /* zip_utf-8.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D6F915B2F4B1002D5007 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B01D72615B2F57F002D5007 /* zipmerge.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B01D70B15B2F4EB002D5007 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B01D72515B2F57B002D5007 /* zipcmp.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4B51DDB71FDAE20A00C5CA85 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B51DDC31FDAE26600C5CA85 /* source_hole.c in Sources */, - 4B51DDC21FDAE25F00C5CA85 /* ziptool_regress.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD58515BC2CEA00920691 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4B51DDC11FDAE25B00C5CA85 /* ziptool.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5B815BC2DC900920691 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5C315BC2DE000920691 /* add_from_filep.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5C715BC2DF200920691 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5D215BC2EFE00920691 /* fopen_unchanged.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD5D615BC2F3700920691 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD5E115BC2F4500920691 /* fread.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BACD64815BC301300920691 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BACD65315BC302500920691 /* tryopen.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BD6CB6219E71CD100710654 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BD6CB6F19E71D6900710654 /* hole.c in Sources */, - 4BD6CB6419E71CD100710654 /* source_hole.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4BFF2B481FE12FCA006EF3F3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BFF2B551FE13033006EF3F3 /* can_clone_file.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 3D7E35451B33064500022624 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 3D7E35441B33064500022624 /* PBXContainerItemProxy */; - }; - 4B01D72D15B2F5AC002D5007 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D6FC15B2F4B1002D5007 /* zipmerge */; - targetProxy = 4B01D72C15B2F5AC002D5007 /* PBXContainerItemProxy */; - }; - 4B01D72F15B2F5AC002D5007 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D70A15B2F4EB002D5007 /* zipcmp */; - targetProxy = 4B01D72E15B2F5AC002D5007 /* PBXContainerItemProxy */; - }; - 4B01D73615B2F639002D5007 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4B01D73515B2F639002D5007 /* PBXContainerItemProxy */; - }; - 4B01D73815B2F643002D5007 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4B01D73715B2F643002D5007 /* PBXContainerItemProxy */; - }; - 4B2CADAC1C50D57800291DE6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD58815BC2CEA00920691 /* ziptool */; - targetProxy = 4B2CADAB1C50D57800291DE6 /* PBXContainerItemProxy */; - }; - 4B51DDB51FDAE20A00C5CA85 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4B51DDB61FDAE20A00C5CA85 /* PBXContainerItemProxy */; - }; - 4B51DDC51FDAE2F000C5CA85 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B51DDB41FDAE20A00C5CA85 /* ziptool_regress */; - targetProxy = 4B51DDC41FDAE2F000C5CA85 /* PBXContainerItemProxy */; - }; - 4B54447F15C977AF0067BA33 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D72815B2F5A2002D5007 /* command line tools */; - targetProxy = 4B54447E15C977AF0067BA33 /* PBXContainerItemProxy */; - }; - 4B54448115C977B10067BA33 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD5A715BC2D8200920691 /* test programs */; - targetProxy = 4B54448015C977B10067BA33 /* PBXContainerItemProxy */; - }; - 4BACD59715BC2D3800920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BACD59615BC2D3800920691 /* PBXContainerItemProxy */; - }; - 4BACD5B615BC2DC900920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BACD5B715BC2DC900920691 /* PBXContainerItemProxy */; - }; - 4BACD5C515BC2DF200920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BACD5C615BC2DF200920691 /* PBXContainerItemProxy */; - }; - 4BACD5D415BC2F3700920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BACD5D515BC2F3700920691 /* PBXContainerItemProxy */; - }; - 4BACD64615BC301300920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BACD64715BC301300920691 /* PBXContainerItemProxy */; - }; - 4BACD65515BC303B00920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD5B515BC2DC900920691 /* add_from_filep */; - targetProxy = 4BACD65415BC303B00920691 /* PBXContainerItemProxy */; - }; - 4BACD65715BC303B00920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD5C415BC2DF200920691 /* fopen_unchanged */; - targetProxy = 4BACD65615BC303B00920691 /* PBXContainerItemProxy */; - }; - 4BACD65915BC303B00920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD5D315BC2F3700920691 /* fread */; - targetProxy = 4BACD65815BC303B00920691 /* PBXContainerItemProxy */; - }; - 4BACD66915BC303B00920691 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BACD64515BC301300920691 /* tryopen */; - targetProxy = 4BACD66815BC303B00920691 /* PBXContainerItemProxy */; - }; - 4BCF6A791C3BDDF900F036E9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3D7E35361B3305FB00022624 /* in-memory */; - targetProxy = 4BCF6A781C3BDDF900F036E9 /* PBXContainerItemProxy */; - }; - 4BCF6A7B1C3BDDFF00F036E9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BCF6A681C3BDDD500F036E9 /* examples */; - targetProxy = 4BCF6A7A1C3BDDFF00F036E9 /* PBXContainerItemProxy */; - }; - 4BD6CB6019E71CD100710654 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4B01D68A15B2F3F1002D5007 /* libzip */; - targetProxy = 4BD6CB6119E71CD100710654 /* PBXContainerItemProxy */; - }; - 4BD6CB6E19E71D0800710654 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BD6CB5F19E71CD100710654 /* hole */; - targetProxy = 4BD6CB6D19E71D0800710654 /* PBXContainerItemProxy */; - }; - 4BFF2B531FE13002006EF3F3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4BFF2B451FE12FCA006EF3F3 /* can_clone_file */; - targetProxy = 4BFF2B521FE13002006EF3F3 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 3D7E353B1B3305FB00022624 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 3D7E353C1B3305FB00022624 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4B01D69C15B2F3F1002D5007 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - COMBINE_HIDPI_IMAGES = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = NO; - GCC_PREFIX_HEADER = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_PEDANTIC = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "@rpath"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - /usr/local/Cellar/zstd/1.4.5/lib, - ); - PRODUCT_BUNDLE_IDENTIFIER = "at.nih.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - VERSION_INFO_BUILDER = ""; - VERSION_INFO_FILE = ""; - WRAPPER_EXTENSION = framework; - }; - name = Debug; - }; - 4B01D69D15B2F3F1002D5007 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = NO; - GCC_PREFIX_HEADER = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_PEDANTIC = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "@rpath"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - /usr/local/Cellar/zstd/1.4.5/lib, - ); - PRODUCT_BUNDLE_IDENTIFIER = "at.nih.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - VERSION_INFO_BUILDER = ""; - VERSION_INFO_FILE = ""; - WRAPPER_EXTENSION = framework; - }; - name = Release; - }; - 4B01D70515B2F4B1002D5007 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_PEDANTIC = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4B01D70615B2F4B1002D5007 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_PEDANTIC = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4B01D71115B2F4EB002D5007 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = zipcmp; - }; - name = Debug; - }; - 4B01D71215B2F4EB002D5007 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = zipcmp; - }; - name = Release; - }; - 4B01D72A15B2F5A2002D5007 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4B01D72B15B2F5A2002D5007 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4B51DDBE1FDAE20A00C5CA85 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4B51DDBF1FDAE20A00C5CA85 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4B54447A15C977A20067BA33 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4B54447B15C977A20067BA33 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4BACD59115BC2CEA00920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4BACD59215BC2CEA00920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4BACD5AF15BC2D8200920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "command line tools copy"; - }; - name = Debug; - }; - 4BACD5B015BC2D8200920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "command line tools copy"; - }; - name = Release; - }; - 4BACD5BF15BC2DC900920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = add_from_filep; - }; - name = Debug; - }; - 4BACD5C015BC2DC900920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = add_from_filep; - }; - name = Release; - }; - 4BACD5CE15BC2DF200920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = fopen_unchanged; - }; - name = Debug; - }; - 4BACD5CF15BC2DF200920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = fopen_unchanged; - }; - name = Release; - }; - 4BACD5DD15BC2F3700920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = fread; - }; - name = Debug; - }; - 4BACD5DE15BC2F3700920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = fread; - }; - name = Release; - }; - 4BACD64E15BC301300920691 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = tryopen; - }; - name = Debug; - }; - 4BACD64F15BC301300920691 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = tryopen; - }; - name = Release; - }; - 4BCF6A761C3BDDD500F036E9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4BCF6A771C3BDDD500F036E9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 4BD6CB6A19E71CD100710654 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = hole; - }; - name = Debug; - }; - 4BD6CB6B19E71CD100710654 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = hole; - }; - name = Release; - }; - 4BDC71D315B181DA00236D3C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = "HAVE_CONFIG_H=1"; - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - /usr/local/include, - ../lib, - ., - ../src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ""; - SDKROOT = macosx; - USE_HEADERMAP = NO; - WARNING_CFLAGS = "-Wno-nullability-extension"; - }; - name = Debug; - }; - 4BDC71D415B181DA00236D3C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = "HAVE_CONFIG_H=1"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - /usr/local/include, - ../lib, - ., - ../src, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_CFLAGS = ""; - SDKROOT = macosx; - USE_HEADERMAP = NO; - VALIDATE_PRODUCT = YES; - WARNING_CFLAGS = "-Wno-nullability-extension"; - }; - name = Release; - }; - 4BFF2B4F1FE12FCA006EF3F3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 4BFF2B501FE12FCA006EF3F3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - LD_RUNPATH_SEARCH_PATHS = "@loader_path/"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3D7E353D1B3305FB00022624 /* Build configuration list for PBXNativeTarget "in-memory" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3D7E353B1B3305FB00022624 /* Debug */, - 3D7E353C1B3305FB00022624 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B01D69E15B2F3F1002D5007 /* Build configuration list for PBXNativeTarget "libzip" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B01D69C15B2F3F1002D5007 /* Debug */, - 4B01D69D15B2F3F1002D5007 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B01D70415B2F4B1002D5007 /* Build configuration list for PBXNativeTarget "zipmerge" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B01D70515B2F4B1002D5007 /* Debug */, - 4B01D70615B2F4B1002D5007 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B01D71015B2F4EB002D5007 /* Build configuration list for PBXNativeTarget "zipcmp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B01D71115B2F4EB002D5007 /* Debug */, - 4B01D71215B2F4EB002D5007 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B01D72915B2F5A2002D5007 /* Build configuration list for PBXAggregateTarget "command line tools" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B01D72A15B2F5A2002D5007 /* Debug */, - 4B01D72B15B2F5A2002D5007 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B51DDBD1FDAE20A00C5CA85 /* Build configuration list for PBXNativeTarget "ziptool_regress" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B51DDBE1FDAE20A00C5CA85 /* Debug */, - 4B51DDBF1FDAE20A00C5CA85 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4B54447C15C977A20067BA33 /* Build configuration list for PBXAggregateTarget "all" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4B54447A15C977A20067BA33 /* Debug */, - 4B54447B15C977A20067BA33 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD59015BC2CEA00920691 /* Build configuration list for PBXNativeTarget "ziptool" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD59115BC2CEA00920691 /* Debug */, - 4BACD59215BC2CEA00920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD5AE15BC2D8200920691 /* Build configuration list for PBXAggregateTarget "test programs" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD5AF15BC2D8200920691 /* Debug */, - 4BACD5B015BC2D8200920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD5BE15BC2DC900920691 /* Build configuration list for PBXNativeTarget "add_from_filep" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD5BF15BC2DC900920691 /* Debug */, - 4BACD5C015BC2DC900920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD5CD15BC2DF200920691 /* Build configuration list for PBXNativeTarget "fopen_unchanged" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD5CE15BC2DF200920691 /* Debug */, - 4BACD5CF15BC2DF200920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD5DC15BC2F3700920691 /* Build configuration list for PBXNativeTarget "fread" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD5DD15BC2F3700920691 /* Debug */, - 4BACD5DE15BC2F3700920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BACD64D15BC301300920691 /* Build configuration list for PBXNativeTarget "tryopen" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BACD64E15BC301300920691 /* Debug */, - 4BACD64F15BC301300920691 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BCF6A751C3BDDD500F036E9 /* Build configuration list for PBXAggregateTarget "examples" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BCF6A761C3BDDD500F036E9 /* Debug */, - 4BCF6A771C3BDDD500F036E9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BD6CB6919E71CD100710654 /* Build configuration list for PBXNativeTarget "hole" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BD6CB6A19E71CD100710654 /* Debug */, - 4BD6CB6B19E71CD100710654 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BDC71C215B181DA00236D3C /* Build configuration list for PBXProject "libzip" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BDC71D315B181DA00236D3C /* Debug */, - 4BDC71D415B181DA00236D3C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4BFF2B4E1FE12FCA006EF3F3 /* Build configuration list for PBXNativeTarget "can_clone_file" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BFF2B4F1FE12FCA006EF3F3 /* Debug */, - 4BFF2B501FE12FCA006EF3F3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 4BDC71BF15B181DA00236D3C /* Project object */; -} diff --git a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a3025873b..000000000 --- a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/core/deps/libzip/developer-xcode/libzip.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/core/deps/libzip/developer-xcode/mkconfig-h.sh b/core/deps/libzip/developer-xcode/mkconfig-h.sh deleted file mode 100644 index 43199f73b..000000000 --- a/core/deps/libzip/developer-xcode/mkconfig-h.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -DIR=tmp.$$ - -mkdir -p $DIR/32 $DIR/64 - -(cd $DIR/32; ../../../configure CFLAGS=-m32) -(cd $DIR/64; ../../../configure CFLAGS=-m64) - -diff -D __LP64__ $DIR/32/config.h $DIR/64/config.h > config.h - -rm -r $DIR diff --git a/core/deps/libzip/developer-xcode/zip_err_str.c b/core/deps/libzip/developer-xcode/zip_err_str.c deleted file mode 100644 index c46258b4a..000000000 --- a/core/deps/libzip/developer-xcode/zip_err_str.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file was generated automatically by CMake - from zip.h; make changes there. -*/ - -#include "zipint.h" - -const char * const _zip_err_str[] = { - "No error", - "Multi-disk zip archives not supported", - "Renaming temporary file failed", - "Closing zip archive failed", - "Seek error", - "Read error", - "Write error", - "CRC error", - "Containing zip archive was closed", - "No such file", - "File already exists", - "Can't open file", - "Failure to create temporary file", - "Zlib error", - "Malloc failure", - "Entry has been changed", - "Compression method not supported", - "Premature end of file", - "Invalid argument", - "Not a zip archive", - "Internal error", - "Zip archive inconsistent", - "Can't remove file", - "Entry has been deleted", - "Encryption method not supported", - "Read-only archive", - "No password provided", - "Wrong password provided", - "Operation not supported", - "Resource still in use", - "Tell error", - "Compressed data invalid", - "Operation cancelled", -}; - -const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); - -#define N ZIP_ET_NONE -#define S ZIP_ET_SYS -#define Z ZIP_ET_ZLIB - -const int _zip_err_type[] = { - N, - N, - S, - S, - S, - S, - S, - N, - N, - N, - N, - S, - S, - Z, - N, - N, - N, - N, - N, - N, - N, - N, - S, - N, - N, - N, - N, - N, - N, - N, - S, - N, - N, -}; diff --git a/core/deps/libzip/developer-xcode/zipconf.h b/core/deps/libzip/developer-xcode/zipconf.h deleted file mode 100644 index 99b3f07c4..000000000 --- a/core/deps/libzip/developer-xcode/zipconf.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _HAD_ZIPCONF_H -#define _HAD_ZIPCONF_H - -/* - zipconf.h -- platform specific include file - - This file was generated automatically by CMake - based on ../cmake-zipconf.h.in. - */ - -#define LIBZIP_VERSION "1.5.2a" -#define LIBZIP_VERSION_MAJOR 1 -#define LIBZIP_VERSION_MINOR 5 -#define LIBZIP_VERSION_MICRO 2a - -/* #undef ZIP_STATIC */ - - -#define __STDC_FORMAT_MACROS 1 -#include - -typedef int8_t zip_int8_t; -typedef uint8_t zip_uint8_t; -typedef int16_t zip_int16_t; -typedef uint16_t zip_uint16_t; -typedef int32_t zip_int32_t; -typedef uint32_t zip_uint32_t; -typedef int64_t zip_int64_t; -typedef uint64_t zip_uint64_t; - -#define ZIP_INT8_MIN (-ZIP_INT8_MAX - 1) -#define ZIP_INT8_MAX 0x7f -#define ZIP_UINT8_MAX 0xff - -#define ZIP_INT16_MIN (-ZIP_INT16_MAX - 1) -#define ZIP_INT16_MAX 0x7fff -#define ZIP_UINT16_MAX 0xffff - -#define ZIP_INT32_MIN (-ZIP_INT32_MAX - 1L) -#define ZIP_INT32_MAX 0x7fffffffL -#define ZIP_UINT32_MAX 0xffffffffLU - -#define ZIP_INT64_MIN (-ZIP_INT64_MAX - 1LL) -#define ZIP_INT64_MAX 0x7fffffffffffffffLL -#define ZIP_UINT64_MAX 0xffffffffffffffffULL - -#endif /* zipconf.h */ diff --git a/core/deps/libzip/examples/CMakeLists.txt b/core/deps/libzip/examples/CMakeLists.txt index 9019e0ab6..008323236 100644 --- a/core/deps/libzip/examples/CMakeLists.txt +++ b/core/deps/libzip/examples/CMakeLists.txt @@ -1,3 +1,5 @@ -add_executable(in-memory in-memory.c) -target_link_libraries(in-memory zip) -target_include_directories(in-memory PRIVATE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) +foreach(PROGRAM add-compressed-data autoclose-archive in-memory) + add_executable(${PROGRAM} ${PROGRAM}.c) + target_link_libraries(${PROGRAM} zip) + target_include_directories(${PROGRAM} PRIVATE BEFORE ${PROJECT_SOURCE_DIR}/lib ${PROJECT_BINARY_DIR}) +endforeach() diff --git a/core/deps/libzip/examples/add-compressed-data.c b/core/deps/libzip/examples/add-compressed-data.c new file mode 100644 index 000000000..6f5810662 --- /dev/null +++ b/core/deps/libzip/examples/add-compressed-data.c @@ -0,0 +1,171 @@ +/* + add-compressed-data.c -- add already compressed file to zip archive + Copyright (C) 2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + This layered source can be used to add pre-compressed data to a zip archive. + The data is taken from the lower layer source. + Metadata (uncompressed size, crc, compression method) must be provided by the caller. +*/ + +#include +#include +#include + +#include + +struct ctx { + zip_uint64_t uncompressed_size; + zip_uint32_t crc; + zip_uint32_t compression_method; +}; + +zip_int64_t callback(zip_source_t* src, void *ud, void* data, zip_uint64_t length, zip_source_cmd_t command) { + struct ctx* ctx = (struct ctx*)ud; + + switch (command) { + case ZIP_SOURCE_FREE: + /* Free our context. */ + free(ctx); + return 0; + + case ZIP_SOURCE_STAT: { + zip_stat_t *st = (zip_stat_t *)data; + /* Fix metadata with provided values. */ + if (st->valid & ZIP_STAT_SIZE) { + st->comp_size = st->size; + st->valid |= ZIP_STAT_COMP_SIZE; + } + st->size = ctx->uncompressed_size; + st->crc = ctx->crc; + st->comp_method = ctx->compression_method; + st->valid |= ZIP_STAT_COMP_METHOD | ZIP_STAT_SIZE | ZIP_STAT_CRC; + + return 0; + } + + default: + /* For all other commands, use default implementation */ + return zip_source_pass_to_lower_layer(src, data, length, command); + } +} + +zip_source_t* create_layered_compressed_source(zip_source_t* source, zip_uint64_t uncompressed_size, zip_uint32_t crc, zip_uint32_t compression_method, zip_error_t *error) { + struct ctx* ctx = (struct ctx*)malloc(sizeof(*ctx)); + zip_source_t *compressed_source; + + /* Allocate context. */ + if (ctx == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + /* Initialize context */ + ctx->compression_method = compression_method; + ctx->uncompressed_size = uncompressed_size; + ctx->crc = crc; + + /* Create layered source using our callback and context. */ + compressed_source = zip_source_layered_create(source, callback, ctx, error); + + /* In case of error, free context. */ + if (compressed_source == NULL) { + free(ctx); + } + + return compressed_source; +} + + +/* This is the information needed to add pre-compressed data to a zip archive. data must be compressed in a format compatible with Zip (e.g. no gzip header for deflate). */ + +zip_uint16_t compression_method = ZIP_CM_DEFLATE; +zip_uint64_t uncompressed_size = 60; +zip_uint32_t crc = 0xb0354048; +zip_uint8_t data[] = { + 0x4B, 0x4C, 0x44, 0x06, 0x5C, 0x49, 0x28, 0x80, + 0x2B, 0x11, 0x55 ,0x36, 0x19, 0x05, 0x70, 0x01, + 0x00 +}; + + +int +main(int argc, char *argv[]) { + const char *archive; + zip_source_t *src, *src_comp; + zip_t *za; + int err; + + if (argc != 2) { + fprintf(stderr, "usage: %s archive\n", argv[0]); + return 1; + } + archive = argv[1]; + + if ((za = zip_open(archive, ZIP_CREATE, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], archive, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + /* The data can come from any source. To keep the example simple, it is provided in a static buffer here. */ + if ((src = zip_source_buffer(za, data, sizeof(data), 0)) == NULL) { + fprintf(stderr, "%s: cannot create buffer source: %s\n", argv[0], zip_strerror(za)); + zip_discard(za); + exit(1); + } + + zip_error_t error; + if ((src_comp = create_layered_compressed_source(src, uncompressed_size, crc, compression_method, &error)) == NULL) { + fprintf(stderr, "%s: cannot create layered source: %s\n", argv[0], zip_error_strerror(&error)); + zip_source_free(src); + zip_discard(za); + exit(1); + } + + if ((zip_file_add(za, "precompressed", src_comp, 0)) < 0) { + fprintf(stderr, "%s: cannot add precompressed file: %s\n", argv[0], zip_strerror(za)); + zip_source_free(src_comp); + zip_discard(za); + exit(1); + } + + if ((zip_close(za)) < 0) { + fprintf(stderr, "%s: cannot close archive '%s': %s\n", argv[0], archive, zip_strerror(za)); + zip_discard(za); + exit(1); + } + + exit(0); +} diff --git a/core/deps/libzip/examples/autoclose-archive.c b/core/deps/libzip/examples/autoclose-archive.c new file mode 100644 index 000000000..73cc46faa --- /dev/null +++ b/core/deps/libzip/examples/autoclose-archive.c @@ -0,0 +1,160 @@ +/* + autoclose-archive.c -- automatically close archive when source is closed + Copyright (C) 2022 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + This example layered source takes ownership of a zip archive and discards it when the source is freed. + It can be used to add files from various zip archives without having to keep track of them yourself. +*/ + + +#include +#include +#include + +#include + +struct ctx { + zip_t* archive; +}; + +zip_int64_t callback(zip_source_t* src, void *ud, void* data, zip_uint64_t length, zip_source_cmd_t command) { + struct ctx* ctx = (struct ctx*)ud; + + switch (command) { + case ZIP_SOURCE_FREE: + /* Close zip archive we took ownership of */ + zip_discard(ctx->archive); + /* Free our own context */ + free(ctx); + return 0; + + default: + /* For all other commands, use default implementation */ + return zip_source_pass_to_lower_layer(src, data, length, command); + } +} + +zip_source_t* create_layered_autoclose(zip_source_t* source, zip_t *archive, zip_error_t *error) { + struct ctx* ctx = (struct ctx*)malloc(sizeof(*ctx)); + zip_source_t *autoclose_source; + + /* Allocate context. */ + if (ctx == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + /* Initialize context */ + ctx->archive = archive; + + /* Create layered source using our callback and context. */ + autoclose_source = zip_source_layered_create(source, callback, ctx, error); + + /* In case of error, free context. */ + if (autoclose_source == NULL) { + free(ctx); + } + + return autoclose_source; +} + + +int +main(int argc, char *argv[]) { + const char *destination_archive, *source_archive, *source_file; + zip_int64_t index; + zip_source_t *src, *src_autoclose; + zip_t *z_source, *z_destination; + int err; + + if (argc != 4) { + fprintf(stderr, "usage: %s destination-archive source-archive source-file\n", argv[0]); + return 1; + } + destination_archive = argv[1]; + source_archive = argv[2]; + source_file = argv[3]; + + + if ((z_source = zip_open(source_archive, 0, &err)) == NULL) { + zip_error_t error; + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], source_archive, zip_error_strerror(&error)); + zip_error_fini(&error); + exit(1); + } + + if ((index = zip_name_locate(z_source, source_file, 0)) < 0) { + fprintf(stderr, "%s: cannot find file '%s' in '%s': %s\n", argv[0], source_file, source_archive, zip_strerror(z_source)); + zip_discard(z_source); + exit(1); + + } + if ((src = zip_source_zip_file(z_source, z_source, index, 0, 0, -1, NULL)) == NULL) { + fprintf(stderr, "%s: cannot open file '%s' in '%s': %s\n", argv[0], source_file, source_archive, zip_strerror(z_source)); + zip_discard(z_source); + exit(1); + } + + zip_error_t error; + if ((src_autoclose = create_layered_autoclose(src, z_source, &error)) == NULL) { + fprintf(stderr, "%s: cannot create layered source: %s\n", argv[0], zip_error_strerror(&error)); + zip_source_free(src); + zip_discard(z_source); + exit(1); + } + + if ((z_destination = zip_open(destination_archive, ZIP_CREATE, &err)) == NULL) { + zip_error_init_with_code(&error, err); + fprintf(stderr, "%s: cannot open zip archive '%s': %s\n", argv[0], destination_archive, zip_error_strerror(&error)); + zip_error_fini(&error); + zip_source_free(src_autoclose); /* freeing src_autoclose closes z_source */ + exit(1); + } + + + if ((zip_file_add(z_destination, source_file, src_autoclose, 0)) < 0) { + fprintf(stderr, "%s: cannot add file: %s\n", argv[0], zip_strerror(z_source)); + zip_source_free(src_autoclose); + zip_discard(z_destination); + exit(1); + } + + if ((zip_close(z_destination)) < 0) { + fprintf(stderr, "%s: cannot close archive '%s': %s\n", argv[0], destination_archive, zip_strerror(z_source)); + zip_discard(z_destination); + exit(1); + } + + exit(0); +} diff --git a/core/deps/libzip/examples/in-memory.c b/core/deps/libzip/examples/in-memory.c index 1a6f9fae6..e022a0b24 100644 --- a/core/deps/libzip/examples/in-memory.c +++ b/core/deps/libzip/examples/in-memory.c @@ -1,9 +1,9 @@ /* in-memory.c -- modify zip file in memory - Copyright (C) 2014-2019 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/examples/windows-open.c b/core/deps/libzip/examples/windows-open.c index 31704a661..67902484e 100644 --- a/core/deps/libzip/examples/windows-open.c +++ b/core/deps/libzip/examples/windows-open.c @@ -1,9 +1,9 @@ /* windows-open.c -- open zip archive using Windows UTF-16/Unicode file name - Copyright (C) 2015-2019 Dieter Baron and Thomas Klausner + Copyright (C) 2015-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/CMakeLists.txt b/core/deps/libzip/lib/CMakeLists.txt index 133ca67dd..1afefae00 100644 --- a/core/deps/libzip/lib/CMakeLists.txt +++ b/core/deps/libzip/lib/CMakeLists.txt @@ -86,6 +86,7 @@ add_library(zip zip_source_is_deleted.c zip_source_layered.c zip_source_open.c + zip_source_pass_to_lower_layer.c zip_source_pkware_decode.c zip_source_pkware_encode.c zip_source_read.c @@ -123,7 +124,6 @@ if(WIN32) zip_source_file_win32_utf8.c ) if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore) - target_compile_definitions(zip PRIVATE _WIN32_WINNT=0x0A00) target_sources(zip PRIVATE zip_random_uwp.c) else() target_sources(zip PRIVATE zip_source_file_win32_ansi.c zip_random_win32.c) @@ -131,7 +131,6 @@ if(WIN32) endif() else(WIN32) target_sources(zip PRIVATE - zip_mkstempm.c zip_source_file_stdio_named.c zip_random_unix.c ) @@ -149,7 +148,7 @@ endif() if(HAVE_LIBZSTD) target_sources(zip PRIVATE zip_algorithm_zstd.c) - target_link_libraries(zip PRIVATE Zstd::Zstd) + target_link_libraries(zip PRIVATE ${zstd_TARGET}) endif() if(HAVE_COMMONCRYPTO) @@ -173,7 +172,7 @@ if(HAVE_CRYPTO) endif() if(SHARED_LIB_VERSIONNING) - set_target_properties(zip PROPERTIES VERSION 5.3 SOVERSION 5) + set_target_properties(zip PROPERTIES VERSION 5.5 SOVERSION 5) endif() target_link_libraries(zip PRIVATE ZLIB::ZLIB) @@ -194,36 +193,16 @@ if(LIBZIP_DO_INSTALL) install(FILES zip.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() -# create zip_err_str.h from zip.h -file(READ ${PROJECT_SOURCE_DIR}/lib/zip.h zip_h) -string(REGEX MATCHALL "#define ZIP_ER_([A-Z_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z ']*)/" zip_h_err ${zip_h}) -set(zip_err_str [=[ -/* - This file was generated automatically by CMake - from zip.h\; make changes there. -*/ - -#include "zipint.h" - -const char * const _zip_err_str[] = { -]=]) -set(zip_err_type) -foreach(errln ${zip_h_err}) - string(REGEX MATCH "#define ZIP_ER_([A-Z_]+) ([0-9]+)[ \t]+/([-*0-9a-zA-Z ']*)/" err_t_tt ${errln}) - string(REGEX MATCH "([N|S|Z]+) ([-0-9a-zA-Z ']*)" err_t_tt "${CMAKE_MATCH_3}") - string(APPEND zip_err_type " ${CMAKE_MATCH_1},\n") - string(STRIP "${CMAKE_MATCH_2}" err_t_tt) - string(APPEND zip_err_str " \"${err_t_tt}\",\n") -endforeach() -string(APPEND zip_err_str [=[}\; - -const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0])\; - -#define N ZIP_ET_NONE -#define S ZIP_ET_SYS -#define Z ZIP_ET_ZLIB - -const int _zip_err_type[] = { -]=]) -string(APPEND zip_err_str "${zip_err_type}}\;\n") -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c ${zip_err_str}) +# create zip_err_str.c from zip.h and zipint.h +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zip_err_str.c + COMMAND "${CMAKE_COMMAND}" + "-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}" + "-DCMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}" + "-P" "${PROJECT_SOURCE_DIR}/cmake/GenerateZipErrorStrings.cmake" + DEPENDS + ${PROJECT_SOURCE_DIR}/cmake/GenerateZipErrorStrings.cmake + ${PROJECT_SOURCE_DIR}/lib/zip.h + ${PROJECT_SOURCE_DIR}/lib/zipint.h + COMMENT "Generating zip_err_str.c" +) diff --git a/core/deps/libzip/lib/compat.h b/core/deps/libzip/lib/compat.h index 257e0ab45..384a611ff 100644 --- a/core/deps/libzip/lib/compat.h +++ b/core/deps/libzip/lib/compat.h @@ -3,10 +3,10 @@ /* compat.h -- compatibility defines. - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -41,6 +41,9 @@ /* to have *_MAX definitions for all types when compiling with g++ */ #define __STDC_LIMIT_MACROS +/* to have ISO C secure library functions */ +#define __STDC_WANT_LIB_EXT1__ 1 + #ifdef _WIN32 #ifndef ZIP_EXTERN #ifndef ZIP_STATIC @@ -94,9 +97,12 @@ typedef char bool; #if !defined(HAVE_FILENO) && defined(HAVE__FILENO) #define fileno _fileno #endif -#if defined(HAVE__SNPRINTF) +#if !defined(HAVE_SNPRINTF) && defined(HAVE__SNPRINTF) #define snprintf _snprintf #endif +#if !defined(HAVE__SNWPRINTF_S) +#define _snwprintf_s(buf, bufsz, len, fmt, ...) (_snwprintf((buf), (len), (fmt), __VA_ARGS__)) +#endif #if defined(HAVE__STRDUP) #if !defined(HAVE_STRDUP) || defined(_WIN32) #undef strdup @@ -125,6 +131,33 @@ typedef char bool; #define ftello(s) ((long)ftell((s))) #endif +#ifdef HAVE_LOCALTIME_S +#ifdef _WIN32 +/* Windows is incompatible to the C11 standard, hurray! */ +#define zip_localtime(t, tm) (localtime_s((tm), (t)) == 0 ? tm : NULL) +#else +#define zip_localtime localtime_s +#endif +#else +#ifdef HAVE_LOCALTIME_R +#define zip_localtime localtime_r +#else +#define zip_localtime(t, tm) (localtime(t)) +#endif +#endif + +#ifndef HAVE_MEMCPY_S +#define memcpy_s(dest, destsz, src, count) (memcpy((dest), (src), (count)) == NULL) +#endif + +#ifndef HAVE_SNPRINTF_S +#ifdef HAVE__SNPRINTF_S +#define snprintf_s(buf, bufsz, fmt, ...) (_snprintf_s((buf), (bufsz), (bufsz), (fmt), __VA_ARGS__)) +#else +#define snprintf_s snprintf +#endif +#endif + #if !defined(HAVE_STRCASECMP) #if defined(HAVE__STRICMP) #define strcasecmp _stricmp @@ -133,6 +166,19 @@ typedef char bool; #endif #endif +#ifndef HAVE_STRNCPY_S +#define strncpy_s(dest, destsz, src, count) (strncpy((dest), (src), (count)), 0) +#endif + +#ifndef HAVE_STRERROR_S +#define strerrorlen_s(errnum) (strlen(strerror(errnum))) +#define strerror_s(buf, bufsz, errnum) ((void)strncpy_s((buf), (bufsz), strerror(errnum), (bufsz)), (buf)[(bufsz)-1] = '\0', strerrorlen_s(errnum) >= (bufsz)) +#else +#ifndef HAVE_STRERRORLEN_S +#define strerrorlen_s(errnum) 8192 +#endif +#endif + #if SIZEOF_OFF_T == 8 #define ZIP_OFF_MAX ZIP_INT64_MAX #define ZIP_OFF_MIN ZIP_INT64_MIN diff --git a/core/deps/libzip/lib/zip.h b/core/deps/libzip/lib/zip.h index 4a1bf8912..0d31d4068 100644 --- a/core/deps/libzip/lib/zip.h +++ b/core/deps/libzip/lib/zip.h @@ -3,10 +3,10 @@ /* zip.h -- exported declarations. - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -58,6 +58,16 @@ extern "C" { #endif #endif +#ifndef ZIP_DEPRECATED +#if defined(__GNUC__) || defined(__clang__) +#define ZIP_DEPRECATED(x) __attribute__((deprecated(x))) +#elif defined(_MSC_VER) +#define ZIP_DEPRECATED(x) __declspec(deprecated(x)) +#else +#define ZIP_DEPRECATED(x) +#endif +#endif + #include #include #include @@ -77,7 +87,7 @@ extern "C" { #define ZIP_FL_NODIR 2u /* ignore directory component */ #define ZIP_FL_COMPRESSED 4u /* read compressed data */ #define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */ -#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ +/* 16u was ZIP_FL_RECOMPRESS, which is deprecated */ #define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */ #define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */ #define ZIP_FL_ENC_RAW 64u /* get unmodified string */ @@ -91,7 +101,10 @@ extern "C" { /* archive global flags flags */ -#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ +#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ +#define ZIP_AFL_IS_TORRENTZIP 4u /* current archive is torrentzipped */ +#define ZIP_AFL_WANT_TORRENTZIP 8u /* write archive in torrentzip format */ +#define ZIP_AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE 16u /* don't remove file if archive is empty */ /* create a new extra field */ @@ -99,6 +112,10 @@ extern "C" { #define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX #define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX +/* length parameter to various functions */ + +#define ZIP_LENGTH_TO_END 0 +#define ZIP_LENGTH_UNCHECKED (-2) /* only supported by zip_source_file and its variants */ /* libzip error codes */ @@ -123,7 +140,7 @@ extern "C" { #define ZIP_ER_INVAL 18 /* N Invalid argument */ #define ZIP_ER_NOZIP 19 /* N Not a zip archive */ #define ZIP_ER_INTERNAL 20 /* N Internal error */ -#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ +#define ZIP_ER_INCONS 21 /* L Zip archive inconsistent */ #define ZIP_ER_REMOVE 22 /* S Can't remove file */ #define ZIP_ER_DELETED 23 /* N Entry has been deleted */ #define ZIP_ER_ENCRNOTSUPP 24 /* N Encryption method not supported */ @@ -135,12 +152,15 @@ extern "C" { #define ZIP_ER_TELL 30 /* S Tell error */ #define ZIP_ER_COMPRESSED_DATA 31 /* N Compressed data invalid */ #define ZIP_ER_CANCELLED 32 /* N Operation cancelled */ +#define ZIP_ER_DATA_LENGTH 33 /* N Unexpected length of data */ +#define ZIP_ER_NOT_ALLOWED 34 /* N Not allowed in torrentzip */ /* type of system error value */ -#define ZIP_ET_NONE 0 /* sys_err unused */ -#define ZIP_ET_SYS 1 /* sys_err is errno */ -#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ +#define ZIP_ET_NONE 0 /* sys_err unused */ +#define ZIP_ET_SYS 1 /* sys_err is errno */ +#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ +#define ZIP_ET_LIBZIP 3 /* sys_err is libzip error code */ /* compression methods */ @@ -235,12 +255,15 @@ enum zip_source_cmd { ZIP_SOURCE_RESERVED_1, /* previously used internally */ ZIP_SOURCE_BEGIN_WRITE_CLONING, /* like ZIP_SOURCE_BEGIN_WRITE, but keep part of original file */ ZIP_SOURCE_ACCEPT_EMPTY, /* whether empty files are valid archives */ - ZIP_SOURCE_GET_FILE_ATTRIBUTES /* get additional file attributes */ + ZIP_SOURCE_GET_FILE_ATTRIBUTES, /* get additional file attributes */ + ZIP_SOURCE_SUPPORTS_REOPEN /* allow reading from changed entry */ }; typedef enum zip_source_cmd zip_source_cmd_t; #define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (((zip_int64_t)1) << (cmd)) +#define ZIP_SOURCE_CHECK_SUPPORTED(supported, cmd) (((supported) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd)) != 0) + /* clang-format off */ #define ZIP_SOURCE_SUPPORTS_READABLE (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \ @@ -344,24 +367,29 @@ typedef struct zip_buffer_fragment zip_buffer_fragment_t; typedef zip_uint32_t zip_flags_t; typedef zip_int64_t (*zip_source_callback)(void *_Nullable, void *_Nullable, zip_uint64_t, zip_source_cmd_t); +typedef zip_int64_t (*zip_source_layered_callback)(zip_source_t *_Nonnull, void *_Nullable, void *_Nullable, zip_uint64_t, enum zip_source_cmd); typedef void (*zip_progress_callback)(zip_t *_Nonnull, double, void *_Nullable); typedef int (*zip_cancel_callback)(zip_t *_Nonnull, void *_Nullable); #ifndef ZIP_DISABLE_DEPRECATED +#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ + typedef void (*zip_progress_callback_t)(double); -ZIP_EXTERN void zip_register_progress_callback(zip_t *_Nonnull, zip_progress_callback_t _Nullable); /* use zip_register_progress_callback_with_state */ - -ZIP_EXTERN zip_int64_t zip_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull); /* use zip_file_add */ -ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *_Nonnull, const char *_Nonnull); /* use zip_dir_add */ -ZIP_EXTERN const char *_Nullable zip_get_file_comment(zip_t *_Nonnull, zip_uint64_t, int *_Nullable, int); /* use zip_file_get_comment */ -ZIP_EXTERN int zip_get_num_files(zip_t *_Nonnull); /* use zip_get_num_entries instead */ -ZIP_EXTERN int zip_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull); /* use zip_file_rename */ -ZIP_EXTERN int zip_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull); /* use zip_file_replace */ -ZIP_EXTERN int zip_set_file_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, int); /* use zip_file_set_comment */ -ZIP_EXTERN int zip_error_get_sys_type(int); /* use zip_error_system_type */ -ZIP_EXTERN void zip_error_get(zip_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_get_error, zip_error_code_zip / zip_error_code_system */ -ZIP_EXTERN int zip_error_to_str(char *_Nonnull, zip_uint64_t, int, int); /* use zip_error_init_with_code / zip_error_strerror */ -ZIP_EXTERN void zip_file_error_get(zip_file_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_file_get_error, zip_error_code_zip / zip_error_code_system */ +ZIP_DEPRECATED("use 'zip_register_progress_callback_with_state' instead") ZIP_EXTERN void zip_register_progress_callback(zip_t *_Nonnull, zip_progress_callback_t _Nullable); + +ZIP_DEPRECATED("use 'zip_file_add' instead") ZIP_EXTERN zip_int64_t zip_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull); +ZIP_DEPRECATED("use 'zip_dir_add' instead") ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *_Nonnull, const char *_Nonnull); +ZIP_DEPRECATED("use 'zip_file_get_comment' instead") ZIP_EXTERN const char *_Nullable zip_get_file_comment(zip_t *_Nonnull, zip_uint64_t, int *_Nullable, int); +ZIP_DEPRECATED("use 'zip_get_num_entries' instead") ZIP_EXTERN int zip_get_num_files(zip_t *_Nonnull); +ZIP_DEPRECATED("use 'zip_file_rename' instead") ZIP_EXTERN int zip_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull); +ZIP_DEPRECATED("use 'zip_file_replace' instead") ZIP_EXTERN int zip_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull); +ZIP_DEPRECATED("use 'zip_file_set_comment' instead") ZIP_EXTERN int zip_set_file_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, int); +ZIP_DEPRECATED("use 'zip_error_init_with_code' and 'zip_error_system_type' instead") ZIP_EXTERN int zip_error_get_sys_type(int); +ZIP_DEPRECATED("use 'zip_get_error' instead") ZIP_EXTERN void zip_error_get(zip_t *_Nonnull, int *_Nullable, int *_Nullable); +ZIP_DEPRECATED("use 'zip_error_strerror' instead") ZIP_EXTERN int zip_error_to_str(char *_Nonnull, zip_uint64_t, int, int); +ZIP_DEPRECATED("use 'zip_file_get_error' instead") ZIP_EXTERN void zip_file_error_get(zip_file_t *_Nonnull, int *_Nullable, int *_Nullable); +ZIP_DEPRECATED("use 'zip_source_zip_file' instead") ZIP_EXTERN zip_source_t *_Nullable zip_source_zip(zip_t *_Nonnull, zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_DEPRECATED("use 'zip_source_zip_file_create' instead") ZIP_EXTERN zip_source_t *_Nullable zip_source_zip_create(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); #endif ZIP_EXTERN int zip_close(zip_t *_Nonnull); @@ -377,6 +405,7 @@ ZIP_EXTERN void zip_error_fini(zip_error_t *_Nonnull); ZIP_EXTERN void zip_error_init(zip_error_t *_Nonnull); ZIP_EXTERN void zip_error_init_with_code(zip_error_t *_Nonnull, int); ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int); +ZIP_EXTERN void zip_error_set_from_source(zip_error_t *_Nonnull, zip_source_t *_Nullable); ZIP_EXTERN const char *_Nonnull zip_error_strerror(zip_error_t *_Nonnull); ZIP_EXTERN int zip_error_system_type(const zip_error_t *_Nonnull); ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t *_Nonnull, void *_Nonnull, zip_uint64_t); @@ -396,6 +425,7 @@ ZIP_EXTERN const zip_uint8_t *_Nullable zip_file_extra_field_get_by_id(zip_t *_N ZIP_EXTERN const char *_Nullable zip_file_get_comment(zip_t *_Nonnull, zip_uint64_t, zip_uint32_t *_Nullable, zip_flags_t); ZIP_EXTERN zip_error_t *_Nonnull zip_file_get_error(zip_file_t *_Nonnull); ZIP_EXTERN int zip_file_get_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t *_Nullable, zip_uint32_t *_Nullable); +ZIP_EXTERN int zip_file_is_seekable(zip_file_t *_Nonnull); ZIP_EXTERN int zip_file_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull, zip_flags_t); ZIP_EXTERN int zip_file_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull, zip_flags_t); ZIP_EXTERN int zip_file_set_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, zip_uint16_t, zip_flags_t); @@ -443,9 +473,13 @@ ZIP_EXTERN zip_source_t *_Nullable zip_source_function(zip_t *_Nonnull, zip_sour ZIP_EXTERN zip_source_t *_Nullable zip_source_function_create(zip_source_callback _Nonnull, void *_Nullable, zip_error_t *_Nullable); ZIP_EXTERN int zip_source_get_file_attributes(zip_source_t *_Nonnull, zip_file_attributes_t *_Nonnull); ZIP_EXTERN int zip_source_is_deleted(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_is_seekable(zip_source_t *_Nonnull); ZIP_EXTERN void zip_source_keep(zip_source_t *_Nonnull); +ZIP_EXTERN zip_source_t *_Nullable zip_source_layered(zip_t *_Nullable, zip_source_t *_Nonnull, zip_source_layered_callback _Nonnull, void *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_layered_create(zip_source_t *_Nonnull, zip_source_layered_callback _Nonnull, void *_Nullable, zip_error_t *_Nullable); ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...); ZIP_EXTERN int zip_source_open(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_pass_to_lower_layer(zip_source_t *_Nonnull, void *_Nullable, zip_uint64_t, zip_source_cmd_t); ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *_Nonnull, void *_Nonnull, zip_uint64_t); ZIP_EXTERN void zip_source_rollback_write(zip_source_t *_Nonnull); ZIP_EXTERN int zip_source_seek(zip_source_t *_Nonnull, zip_int64_t, int); @@ -455,15 +489,17 @@ ZIP_EXTERN int zip_source_stat(zip_source_t *_Nonnull, zip_stat_t *_Nonnull); ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t *_Nonnull); ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *_Nonnull); #ifdef _WIN32 -ZIP_EXTERN zip_source_t *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t); -ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *); -ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t); -ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *); -ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t); -ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32a(zip_t *_Nonnull, const char *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32a_create(const char *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32handle(zip_t *_Nonnull, void *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32handle_create(void *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32w(zip_t *_Nonnull, const wchar_t *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_win32w_create(const wchar_t *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); #endif +ZIP_EXTERN zip_source_t *_Nullable zip_source_window_create(zip_source_t *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t *_Nonnull, const void *_Nullable, zip_uint64_t); -ZIP_EXTERN zip_source_t *_Nullable zip_source_zip(zip_t *_Nonnull, zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_zip_file(zip_t *_Nonnull, zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t, const char *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_zip_file_create(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t, const char *_Nullable, zip_error_t *_Nullable); ZIP_EXTERN int zip_stat(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t, zip_stat_t *_Nonnull); ZIP_EXTERN int zip_stat_index(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_stat_t *_Nonnull); ZIP_EXTERN void zip_stat_init(zip_stat_t *_Nonnull); diff --git a/core/deps/libzip/lib/zip_add.c b/core/deps/libzip/lib/zip_add.c index ef04f1e51..9770139d6 100644 --- a/core/deps/libzip/lib/zip_add.c +++ b/core/deps/libzip/lib/zip_add.c @@ -1,9 +1,9 @@ /* zip_add.c -- add file via callback function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_add_dir.c b/core/deps/libzip/lib/zip_add_dir.c index 9999c8da2..c31fea365 100644 --- a/core/deps/libzip/lib/zip_add_dir.c +++ b/core/deps/libzip/lib/zip_add_dir.c @@ -1,9 +1,9 @@ /* zip_add_dir.c -- add directory - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_add_entry.c b/core/deps/libzip/lib/zip_add_entry.c index 1c9fcff6a..bf12dd541 100644 --- a/core/deps/libzip/lib/zip_add_entry.c +++ b/core/deps/libzip/lib/zip_add_entry.c @@ -1,9 +1,9 @@ /* zip_add_entry.c -- create and init struct zip_entry - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_algorithm_bzip2.c b/core/deps/libzip/lib/zip_algorithm_bzip2.c index 7434e5409..f25be1438 100644 --- a/core/deps/libzip/lib/zip_algorithm_bzip2.c +++ b/core/deps/libzip/lib/zip_algorithm_bzip2.c @@ -1,9 +1,9 @@ /* zip_algorithm_bzip2.c -- bzip2 (de)compression routines - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -58,7 +58,7 @@ maximum_compressed_size(zip_uint64_t uncompressed_size) { static void * -allocate(bool compress, int compression_flags, zip_error_t *error) { +allocate(bool compress, zip_uint32_t compression_flags, zip_error_t *error) { struct ctx *ctx; if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { @@ -67,8 +67,10 @@ allocate(bool compress, int compression_flags, zip_error_t *error) { ctx->error = error; ctx->compress = compress; - ctx->compression_flags = compression_flags; - if (ctx->compression_flags < 1 || ctx->compression_flags > 9) { + if (compression_flags >= 1 && compression_flags <= 9) { + ctx->compression_flags = (int)compression_flags; + } + else { ctx->compression_flags = 9; } ctx->end_of_input = false; @@ -82,13 +84,15 @@ allocate(bool compress, int compression_flags, zip_error_t *error) { static void * -compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +compress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(true, compression_flags, error); } static void * -decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +decompress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(false, compression_flags, error); } @@ -103,6 +107,7 @@ deallocate(void *ud) { static zip_uint16_t general_purpose_bit_flags(void *ud) { + (void)ud; return 0; } @@ -132,8 +137,6 @@ map_error(int ret) { case BZ_IO_ERROR: case BZ_OUTBUFF_FULL: case BZ_SEQUENCE_ERROR: - return ZIP_ER_INTERNAL; - default: return ZIP_ER_INTERNAL; } @@ -144,6 +147,9 @@ start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { struct ctx *ctx = (struct ctx *)ud; int ret; + (void)st; + (void)attributes; + ctx->zstr.avail_in = 0; ctx->zstr.next_in = NULL; ctx->zstr.avail_out = 0; @@ -213,6 +219,7 @@ end_of_input(void *ud) { static zip_compression_status_t process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { struct ctx *ctx = (struct ctx *)ud; + unsigned int avail_out; int ret; @@ -221,7 +228,8 @@ process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { return ZIP_COMPRESSION_NEED_DATA; } - ctx->zstr.avail_out = (unsigned int)ZIP_MIN(UINT_MAX, *length); + avail_out = (unsigned int)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; ctx->zstr.next_out = (char *)data; if (ctx->compress) { @@ -231,7 +239,7 @@ process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { ret = BZ2_bzDecompress(&ctx->zstr); } - *length = *length - ctx->zstr.avail_out; + *length = avail_out - ctx->zstr.avail_out; switch (ret) { case BZ_FINISH_OK: /* compression */ diff --git a/core/deps/libzip/lib/zip_algorithm_deflate.c b/core/deps/libzip/lib/zip_algorithm_deflate.c index 99d8a597b..3c85e2045 100644 --- a/core/deps/libzip/lib/zip_algorithm_deflate.c +++ b/core/deps/libzip/lib/zip_algorithm_deflate.c @@ -1,9 +1,9 @@ /* zip_algorithm_deflate.c -- deflate (de)compression routines - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,7 +40,8 @@ struct ctx { zip_error_t *error; bool compress; - int compression_flags; + int level; + int mem_level; bool end_of_input; z_stream zstr; }; @@ -60,7 +61,7 @@ maximum_compressed_size(zip_uint64_t uncompressed_size) { static void * -allocate(bool compress, int compression_flags, zip_error_t *error) { +allocate(bool compress, zip_uint32_t compression_flags, zip_error_t *error) { struct ctx *ctx; if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { @@ -70,10 +71,13 @@ allocate(bool compress, int compression_flags, zip_error_t *error) { ctx->error = error; ctx->compress = compress; - ctx->compression_flags = compression_flags; - if (ctx->compression_flags < 1 || ctx->compression_flags > 9) { - ctx->compression_flags = Z_BEST_COMPRESSION; + if (compression_flags >= 1 && compression_flags <= 9) { + ctx->level = (int)compression_flags; } + else { + ctx->level = Z_BEST_COMPRESSION; + } + ctx->mem_level = compression_flags == TORRENTZIP_COMPRESSION_FLAGS ? TORRENTZIP_MEM_LEVEL : MAX_MEM_LEVEL; ctx->end_of_input = false; ctx->zstr.zalloc = Z_NULL; @@ -85,13 +89,15 @@ allocate(bool compress, int compression_flags, zip_error_t *error) { static void * -compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +compress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(true, compression_flags, error); } static void * -decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +decompress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(false, compression_flags, error); } @@ -112,10 +118,10 @@ general_purpose_bit_flags(void *ud) { return 0; } - if (ctx->compression_flags < 3) { + if (ctx->level < 3) { return 2 << 1; } - else if (ctx->compression_flags > 7) { + else if (ctx->level > 7) { return 1 << 1; } return 0; @@ -127,6 +133,9 @@ start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { struct ctx *ctx = (struct ctx *)ud; int ret; + (void)st; + (void)attributes; + ctx->zstr.avail_in = 0; ctx->zstr.next_in = NULL; ctx->zstr.avail_out = 0; @@ -134,7 +143,7 @@ start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { if (ctx->compress) { /* negative value to tell zlib not to write a header */ - ret = deflateInit2(&ctx->zstr, ctx->compression_flags, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + ret = deflateInit2(&ctx->zstr, ctx->level, Z_DEFLATED, -MAX_WBITS, ctx->mem_level, Z_DEFAULT_STRATEGY); } else { ret = inflateInit2(&ctx->zstr, -MAX_WBITS); @@ -198,10 +207,12 @@ end_of_input(void *ud) { static zip_compression_status_t process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { struct ctx *ctx = (struct ctx *)ud; + uInt avail_out; int ret; - ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; ctx->zstr.next_out = (Bytef *)data; if (ctx->compress) { @@ -211,7 +222,7 @@ process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { ret = inflate(&ctx->zstr, Z_SYNC_FLUSH); } - *length = *length - ctx->zstr.avail_out; + *length = avail_out - ctx->zstr.avail_out; switch (ret) { case Z_OK: diff --git a/core/deps/libzip/lib/zip_algorithm_xz.c b/core/deps/libzip/lib/zip_algorithm_xz.c index 25abaf2d2..d7a7142d4 100644 --- a/core/deps/libzip/lib/zip_algorithm_xz.c +++ b/core/deps/libzip/lib/zip_algorithm_xz.c @@ -1,10 +1,10 @@ /* zip_algorithm_xz.c -- LZMA/XZ (de)compression routines Bazed on zip_algorithm_deflate.c -- deflate (de)compression routines - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -104,14 +104,9 @@ maximum_compressed_size(zip_uint64_t uncompressed_size) { static void * -allocate(bool compress, int compression_flags, zip_error_t *error, zip_uint16_t method) { +allocate(bool compress, zip_uint32_t compression_flags, zip_error_t *error, zip_uint16_t method) { struct ctx *ctx; - if (compression_flags < 0) { - zip_error_set(error, ZIP_ER_INVAL, 0); - return NULL; - } - if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; @@ -119,12 +114,16 @@ allocate(bool compress, int compression_flags, zip_error_t *error, zip_uint16_t ctx->error = error; ctx->compress = compress; - ctx->compression_flags = (zip_uint32_t)compression_flags; + if (compression_flags <= 9) { + ctx->compression_flags = compression_flags; + } else { + ctx->compression_flags = 6; /* default value */ + } ctx->compression_flags |= LZMA_PRESET_EXTREME; ctx->end_of_input = false; memset(ctx->header, 0, sizeof(ctx->header)); ctx->header_bytes_offset = 0; - if (ZIP_CM_LZMA) { + if (method == ZIP_CM_LZMA) { ctx->header_state = INCOMPLETE; } else { @@ -137,13 +136,13 @@ allocate(bool compress, int compression_flags, zip_error_t *error, zip_uint16_t static void * -compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +compress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { return allocate(true, compression_flags, error, method); } static void * -decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +decompress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { return allocate(false, compression_flags, error, method); } @@ -224,7 +223,7 @@ start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { zip_error_set(ctx->error, map_error(ret), 0); return false; } - + /* If general purpose bits 1 & 2 are both zero, write real uncompressed size in header. */ if ((attributes->valid & ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS) && (attributes->general_purpose_bit_mask & 0x6) == 0x6 && (attributes->general_purpose_bit_flags & 0x06) == 0 && (st->valid & ZIP_STAT_SIZE)) { ctx->uncompresssed_size = st->size; @@ -258,8 +257,8 @@ input(void *ud, zip_uint8_t *data, zip_uint64_t length) { /* For decompression of LZMA1: Have we read the full "lzma alone" header yet? */ if (ctx->method == ZIP_CM_LZMA && !ctx->compress && ctx->header_state == INCOMPLETE) { /* if not, get more of the data */ - zip_uint8_t got = ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, length); - memcpy(ctx->header + ctx->header_bytes_offset, data, got); + zip_uint8_t got = (zip_uint8_t)ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, length); + (void)memcpy_s(ctx->header + ctx->header_bytes_offset, sizeof(ctx->header) - ctx->header_bytes_offset, data, got); ctx->header_bytes_offset += got; length -= got; data += got; @@ -314,6 +313,7 @@ end_of_input(void *ud) { static zip_compression_status_t process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { struct ctx *ctx = (struct ctx *)ud; + uInt avail_out; lzma_ret ret; /* for compression of LZMA1 */ if (ctx->method == ZIP_CM_LZMA && ctx->compress) { @@ -335,8 +335,8 @@ process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { } if (ctx->header_state == OUTPUT) { /* write header */ - zip_uint8_t write_len = ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, *length); - memcpy(data, ctx->header + ctx->header_bytes_offset, write_len); + zip_uint8_t write_len = (zip_uint8_t)ZIP_MIN(HEADER_BYTES_ZIP - ctx->header_bytes_offset, *length); + (void)memcpy_s(data, *length, ctx->header + ctx->header_bytes_offset, write_len); ctx->header_bytes_offset += write_len; *length = write_len; if (ctx->header_bytes_offset == HEADER_BYTES_ZIP) { @@ -346,11 +346,12 @@ process(void *ud, zip_uint8_t *data, zip_uint64_t *length) { } } - ctx->zstr.avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + avail_out = (uInt)ZIP_MIN(UINT_MAX, *length); + ctx->zstr.avail_out = avail_out; ctx->zstr.next_out = (Bytef *)data; ret = lzma_code(&ctx->zstr, ctx->end_of_input ? LZMA_FINISH : LZMA_RUN); - *length = *length - ctx->zstr.avail_out; + *length = avail_out - ctx->zstr.avail_out; switch (ret) { case LZMA_OK: diff --git a/core/deps/libzip/lib/zip_algorithm_zstd.c b/core/deps/libzip/lib/zip_algorithm_zstd.c index c27e9fb39..d005da9d5 100644 --- a/core/deps/libzip/lib/zip_algorithm_zstd.c +++ b/core/deps/libzip/lib/zip_algorithm_zstd.c @@ -1,9 +1,9 @@ /* zip_algorithm_zstd.c -- zstd (de)compression routines - Copyright (C) 2020 Dieter Baron and Thomas Klausner + Copyright (C) 2020-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -33,7 +33,6 @@ #include "zipint.h" -#include #include #include #include @@ -56,21 +55,20 @@ maximum_compressed_size(zip_uint64_t uncompressed_size) { static void * -allocate(bool compress, int compression_flags, zip_error_t *error) { +allocate(bool compress, zip_uint32_t compression_flags, zip_error_t *error) { struct ctx *ctx; - /* 0: let zstd choose */ - if (compression_flags < 0 || compression_flags > 9) { - compression_flags = 0; - } - if ((ctx = (struct ctx *)malloc(sizeof(*ctx))) == NULL) { return NULL; } + ctx->compression_flags = (zip_int32_t)compression_flags; + if (ctx->compression_flags < ZSTD_minCLevel() || ctx->compression_flags > ZSTD_maxCLevel()) { + ctx->compression_flags = 0; /* let zstd choose */ + } + ctx->error = error; ctx->compress = compress; - ctx->compression_flags = compression_flags; ctx->end_of_input = false; ctx->zdstream = NULL; @@ -87,13 +85,15 @@ allocate(bool compress, int compression_flags, zip_error_t *error) { static void * -compress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +compress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(true, compression_flags, error); } static void * -decompress_allocate(zip_uint16_t method, int compression_flags, zip_error_t *error) { +decompress_allocate(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error) { + (void)method; return allocate(false, compression_flags, error); } @@ -107,7 +107,7 @@ deallocate(void *ud) { static zip_uint16_t general_purpose_bit_flags(void *ud) { - /* struct ctx *ctx = (struct ctx *)ud; */ + (void)ud; return 0; } @@ -139,6 +139,10 @@ map_error(size_t ret) { static bool start(void *ud, zip_stat_t *st, zip_file_attributes_t *attributes) { struct ctx *ctx = (struct ctx *)ud; + + (void)st; + (void)attributes; + ctx->in.src = NULL; ctx->in.pos = 0; ctx->in.size = 0; diff --git a/core/deps/libzip/lib/zip_buffer.c b/core/deps/libzip/lib/zip_buffer.c index 3bfcc82c1..e2103f04c 100644 --- a/core/deps/libzip/lib/zip_buffer.c +++ b/core/deps/libzip/lib/zip_buffer.c @@ -1,9 +1,9 @@ /* zip_buffer.c -- bounds checked access to memory buffer - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -132,13 +132,20 @@ _zip_buffer_left(zip_buffer_t *buffer) { zip_uint64_t _zip_buffer_read(zip_buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length) { + zip_uint64_t copied; + if (_zip_buffer_left(buffer) < length) { length = _zip_buffer_left(buffer); } - memcpy(data, _zip_buffer_get(buffer, length), length); + copied = 0; + while (copied < length) { + size_t n = ZIP_MIN(length - copied, SIZE_MAX); + (void)memcpy_s(data + copied, n, _zip_buffer_get(buffer, n), n); + copied += n; + } - return length; + return copied; } @@ -147,8 +154,14 @@ _zip_buffer_new(zip_uint8_t *data, zip_uint64_t size) { bool free_data = (data == NULL); zip_buffer_t *buffer; +#if ZIP_UINT64_MAX > SIZE_MAX + if (size > SIZE_MAX) { + return NULL; + } +#endif + if (data == NULL) { - if ((data = (zip_uint8_t *)malloc(size)) == NULL) { + if ((data = (zip_uint8_t *)malloc((size_t)size)) == NULL) { return NULL; } } @@ -221,7 +234,7 @@ _zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length) { return -1; } - memcpy(dst, src, length); + (void)memcpy_s(dst, length, src, length); return 0; } diff --git a/core/deps/libzip/lib/zip_close.c b/core/deps/libzip/lib/zip_close.c index 5bd327b2e..ddc2c2456 100644 --- a/core/deps/libzip/lib/zip_close.c +++ b/core/deps/libzip/lib/zip_close.c @@ -1,9 +1,9 @@ /* zip_close.c -- close zip archive and update changes - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -45,6 +45,7 @@ static int add_data(zip_t *, zip_source_t *, zip_dirent_t *, zip_uint32_t); static int copy_data(zip_t *, zip_uint64_t); static int copy_source(zip_t *, zip_source_t *, zip_int64_t); +static int torrentzip_compare_names(const void *a, const void *b); static int write_cdir(zip_t *, const zip_filelist_t *, zip_uint64_t); static int write_data_descriptor(zip_t *za, const zip_dirent_t *dirent, int is_zip64); @@ -61,12 +62,12 @@ zip_close(zip_t *za) { changed = _zip_changed(za, &survivors); - /* don't create zip files with no entries */ - if (survivors == 0) { + if (survivors == 0 && !(za->ch_flags & ZIP_AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE)) { + /* don't create zip files with no entries */ if ((za->open_flags & ZIP_TRUNCATE) || changed) { if (zip_source_remove(za->src) < 0) { if (!((zip_error_code_zip(zip_source_error(za->src)) == ZIP_ER_REMOVE) && (zip_error_code_system(zip_source_error(za->src)) == ENOENT))) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } } @@ -75,7 +76,8 @@ zip_close(zip_t *za) { return 0; } - if (!changed) { + /* Always write empty archive if we are told to keep it, otherwise it wouldn't be created if the file doesn't already exist. */ + if (!changed && survivors > 0) { zip_discard(za); return 0; } @@ -105,6 +107,7 @@ zip_close(zip_t *za) { } filelist[j].idx = i; + filelist[j].name = zip_get_name(za, i, 0); j++; } if (j < survivors) { @@ -113,7 +116,11 @@ zip_close(zip_t *za) { return -1; } - if ((zip_source_supports(za->src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE_CLONING)) == 0) { + if (ZIP_WANT_TORRENTZIP(za)) { + qsort(filelist, (size_t)survivors, sizeof(filelist[0]), torrentzip_compare_names); + } + + if (ZIP_WANT_TORRENTZIP(za) || (zip_source_supports(za->src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE_CLONING)) == 0) { unchanged_offset = 0; } else { @@ -146,7 +153,7 @@ zip_close(zip_t *za) { } if (unchanged_offset == 0) { if (zip_source_begin_write(za->src) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); free(filelist); return -1; } @@ -178,7 +185,7 @@ zip_close(zip_t *za) { continue; } - new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_ENCRYPTION_METHOD)); + new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD) || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_ENCRYPTION_METHOD)) || (ZIP_WANT_TORRENTZIP(za) && !ZIP_IS_TORRENTZIP(za)); /* create new local directory entry */ if (entry->changes == NULL) { @@ -195,8 +202,12 @@ zip_close(zip_t *za) { break; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_dirent_torrentzip_normalize(entry->changes); + } + if ((off = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); error = 1; break; } @@ -207,7 +218,7 @@ zip_close(zip_t *za) { zs = NULL; if (!ZIP_ENTRY_DATA_CHANGED(entry)) { - if ((zs = _zip_source_zip_new(za, za, i, ZIP_FL_UNCHANGED, 0, 0, NULL)) == NULL) { + if ((zs = zip_source_zip_file_create(za, i, ZIP_FL_UNCHANGED, 0, -1, NULL, &za->error)) == NULL) { error = 1; break; } @@ -240,7 +251,7 @@ zip_close(zip_t *za) { break; } if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); error = 1; break; } @@ -267,7 +278,7 @@ zip_close(zip_t *za) { if (!error) { if (zip_source_commit_write(za->src) != 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); error = 1; } _zip_progress_end(za->progress); @@ -296,7 +307,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { bool needs_recompress, needs_decompress, needs_crc, needs_compress, needs_reencrypt, needs_decrypt, needs_encrypt; if (zip_source_stat(src, &st) < 0) { - _zip_error_set_from_source(&za->error, src); + zip_error_set_from_source(&za->error, src); return -1; } @@ -324,6 +335,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { flags = ZIP_EF_LOCAL; if ((st.valid & ZIP_STAT_SIZE) == 0) { + /* TODO: not valid for torrentzip */ flags |= ZIP_FL_FORCE_ZIP64; data_length = -1; } @@ -350,6 +362,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { } if (max_compressed_size > 0xffffffffu) { + /* TODO: not valid for torrentzip */ flags |= ZIP_FL_FORCE_ZIP64; } } @@ -360,7 +373,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { } if ((offstart = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } @@ -370,7 +383,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { return -1; } - needs_recompress = st.comp_method != ZIP_CM_ACTUAL(de->comp_method); + needs_recompress = ZIP_WANT_TORRENTZIP(za) || st.comp_method != ZIP_CM_ACTUAL(de->comp_method); needs_decompress = needs_recompress && (st.comp_method != ZIP_CM_STORE); /* in these cases we can compute the CRC ourselves, so we do */ needs_crc = (st.comp_method == ZIP_CM_STORE) || needs_decompress; @@ -383,6 +396,11 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { src_final = src; zip_source_keep(src_final); + if (!needs_decrypt && st.encryption_method == ZIP_EM_TRAD_PKWARE && (de->changed & ZIP_DIRENT_LAST_MOD)) { + /* PKWare encryption uses the last modification time for password verification, therefore we can't change it without re-encrypting. Ignoring the requested modification time change seems more sensible than failing to close the archive. */ + de->changed &= ~ZIP_DIRENT_LAST_MOD; + } + if (needs_decrypt) { zip_encryption_implementation impl; @@ -397,7 +415,6 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { return -1; } - zip_source_free(src_final); src_final = src_tmp; } @@ -407,17 +424,15 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { return -1; } - zip_source_free(src_final); src_final = src_tmp; } if (needs_crc) { - if ((src_tmp = zip_source_crc(za, src_final, 0)) == NULL) { + if ((src_tmp = zip_source_crc_create(src_final, 0, &za->error)) == NULL) { zip_source_free(src_final); return -1; } - zip_source_free(src_final); src_final = src_tmp; } @@ -427,7 +442,6 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { return -1; } - zip_source_free(src_final); src_final = src_tmp; } @@ -448,34 +462,48 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { zip_source_free(src_final); return -1; } + + if (de->encryption_method == ZIP_EM_TRAD_PKWARE) { + de->bitflags |= ZIP_GPBF_DATA_DESCRIPTOR; + + /* PKWare encryption uses last_mod, make sure it gets the right value. */ + if (de->changed & ZIP_DIRENT_LAST_MOD) { + zip_stat_t st_mtime; + zip_stat_init(&st_mtime); + st_mtime.valid = ZIP_STAT_MTIME; + st_mtime.mtime = de->last_mod; + if ((src_tmp = _zip_source_window_new(src_final, 0, -1, &st_mtime, 0, NULL, NULL, 0, true, &za->error)) == NULL) { + zip_source_free(src_final); + return -1; + } + src_final = src_tmp; + } + } + if ((src_tmp = impl(za, src_final, de->encryption_method, ZIP_CODEC_ENCODE, password)) == NULL) { /* error set by impl */ zip_source_free(src_final); return -1; } - if (de->encryption_method == ZIP_EM_TRAD_PKWARE) { - de->bitflags |= ZIP_GPBF_DATA_DESCRIPTOR; - } - zip_source_free(src_final); src_final = src_tmp; } if ((offdata = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } ret = copy_source(za, src_final, data_length); if (zip_source_stat(src_final, &st) < 0) { - _zip_error_set_from_source(&za->error, src_final); + zip_error_set_from_source(&za->error, src_final); ret = -1; } if (zip_source_get_file_attributes(src_final, &attributes) != 0) { - _zip_error_set_from_source(&za->error, src_final); + zip_error_set_from_source(&za->error, src_final); ret = -1; } @@ -486,12 +514,12 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { } if ((offend = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } if (zip_source_seek_write(za->src, offstart, SEEK_SET) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } @@ -512,6 +540,10 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { de->comp_size = (zip_uint64_t)(offend - offdata); _zip_dirent_apply_attributes(de, &attributes, (flags & ZIP_FL_FORCE_ZIP64) != 0, changed); + if (ZIP_WANT_TORRENTZIP(za)) { + zip_dirent_torrentzip_normalize(de); + } + if ((ret = _zip_dirent_write(za, de, flags)) < 0) return -1; @@ -522,7 +554,7 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { } if (zip_source_seek_write(za->src, offend, SEEK_SET) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } @@ -539,7 +571,6 @@ add_data(zip_t *za, zip_source_t *src, zip_dirent_t *de, zip_uint32_t changed) { static int copy_data(zip_t *za, zip_uint64_t len) { DEFINE_BYTE_ARRAY(buf, BUFSIZE); - size_t n; double total = (double)len; if (!byte_array_init(buf, BUFSIZE)) { @@ -548,7 +579,8 @@ copy_data(zip_t *za, zip_uint64_t len) { } while (len > 0) { - n = len > BUFSIZE ? BUFSIZE : len; + zip_uint64_t n = ZIP_MIN(len, BUFSIZE); + if (_zip_read(za->src, buf, n, &za->error) < 0) { byte_array_fini(buf); return -1; @@ -579,7 +611,7 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { int ret; if (zip_source_open(src) < 0) { - _zip_error_set_from_source(&za->error, src); + zip_error_set_from_source(&za->error, src); return -1; } @@ -606,7 +638,7 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { } if (n < 0) { - _zip_error_set_from_source(&za->error, src); + zip_error_set_from_source(&za->error, src); ret = -1; } @@ -619,17 +651,15 @@ copy_source(zip_t *za, zip_source_t *src, zip_int64_t data_length) { static int write_cdir(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivors) { - zip_int64_t cd_start, end, size; - - if ((cd_start = zip_source_tell_write(za->src)) < 0) { + if (zip_source_tell_write(za->src) < 0) { return -1; } - if ((size = _zip_cdir_write(za, filelist, survivors)) < 0) { + if (_zip_cdir_write(za, filelist, survivors) < 0) { return -1; } - if ((end = zip_source_tell_write(za->src)) < 0) { + if (zip_source_tell_write(za->src) < 0) { return -1; } @@ -645,7 +675,7 @@ _zip_changed(const zip_t *za, zip_uint64_t *survivorsp) { changed = 0; survivors = 0; - if (za->comment_changed || za->ch_flags != za->flags) { + if (za->comment_changed || (ZIP_WANT_TORRENTZIP(za) && !ZIP_IS_TORRENTZIP(za))) { changed = 1; } @@ -698,3 +728,18 @@ write_data_descriptor(zip_t *za, const zip_dirent_t *de, int is_zip64) { return ret; } + + +static int torrentzip_compare_names(const void *a, const void *b) { + const char *aname = ((const zip_filelist_t *)a)->name; + const char *bname = ((const zip_filelist_t *)b)->name; + + if (aname == NULL) { + return (bname != NULL) * -1; + } + else if (bname == NULL) { + return 1; + } + + return strcasecmp(aname, bname); +} \ No newline at end of file diff --git a/core/deps/libzip/lib/zip_crypto.h b/core/deps/libzip/lib/zip_crypto.h index c42bc7b04..0d74d1a41 100644 --- a/core/deps/libzip/lib/zip_crypto.h +++ b/core/deps/libzip/lib/zip_crypto.h @@ -1,9 +1,9 @@ /* zip_crypto.h -- crypto definitions - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_crypto_commoncrypto.c b/core/deps/libzip/lib/zip_crypto_commoncrypto.c index f4c37d96b..b198be563 100644 --- a/core/deps/libzip/lib/zip_crypto_commoncrypto.c +++ b/core/deps/libzip/lib/zip_crypto_commoncrypto.c @@ -1,9 +1,9 @@ /* zip_crypto_commoncrypto.c -- CommonCrypto wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_crypto_commoncrypto.h b/core/deps/libzip/lib/zip_crypto_commoncrypto.h index 1eae1b707..01828cc64 100644 --- a/core/deps/libzip/lib/zip_crypto_commoncrypto.h +++ b/core/deps/libzip/lib/zip_crypto_commoncrypto.h @@ -3,7 +3,7 @@ Copyright (C) 2018 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_crypto_gnutls.c b/core/deps/libzip/lib/zip_crypto_gnutls.c index a74bde8f6..1a25aa120 100644 --- a/core/deps/libzip/lib/zip_crypto_gnutls.c +++ b/core/deps/libzip/lib/zip_crypto_gnutls.c @@ -1,9 +1,9 @@ /* zip_crypto_gnutls.c -- GnuTLS wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -98,15 +98,14 @@ _zip_crypto_aes_free(_zip_crypto_aes_t *aes) { _zip_crypto_hmac_t * _zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error) { _zip_crypto_hmac_t *hmac; - int ret; if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - if ((ret = gnutls_hmac_init(hmac, GNUTLS_MAC_SHA1, secret, secret_length)) < 0) { - /* TODO: set error */ + if (gnutls_hmac_init(hmac, GNUTLS_MAC_SHA1, secret, secret_length) < 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); free(hmac); return NULL; } diff --git a/core/deps/libzip/lib/zip_crypto_gnutls.h b/core/deps/libzip/lib/zip_crypto_gnutls.h index 65cf62ecc..dc8b97a4d 100644 --- a/core/deps/libzip/lib/zip_crypto_gnutls.h +++ b/core/deps/libzip/lib/zip_crypto_gnutls.h @@ -1,9 +1,9 @@ /* zip_crypto_gnutls.h -- definitions for GnuTLS wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_crypto_mbedtls.c b/core/deps/libzip/lib/zip_crypto_mbedtls.c index 6aeb020c0..84544a821 100644 --- a/core/deps/libzip/lib/zip_crypto_mbedtls.c +++ b/core/deps/libzip/lib/zip_crypto_mbedtls.c @@ -1,9 +1,9 @@ /* zip_crypto_mbedtls.c -- mbed TLS wrapper - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -117,6 +117,8 @@ _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_ui mbedtls_md_context_t sha1_ctx; bool ok = true; +#if MBEDTLS_VERSION_NUMBER < 0x03030000 + mbedtls_md_init(&sha1_ctx); if (mbedtls_md_setup(&sha1_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), 1) != 0) { @@ -128,6 +130,13 @@ _zip_crypto_pbkdf2(const zip_uint8_t *key, zip_uint64_t key_length, const zip_ui } mbedtls_md_free(&sha1_ctx); + +#else + + ok = mbedtls_pkcs5_pbkdf2_hmac_ext(MBEDTLS_MD_SHA1, (const unsigned char *)key, (size_t)key_length, (const unsigned char *)salt, (size_t)salt_length, (unsigned int)iterations, (uint32_t)output_length, (unsigned char *)output) == 0; + +#endif // !defined(MBEDTLS_DEPRECATED_REMOVED) || MBEDTLS_VERSION_NUMBER < 0x03030000 + return ok; } diff --git a/core/deps/libzip/lib/zip_crypto_mbedtls.h b/core/deps/libzip/lib/zip_crypto_mbedtls.h index 0b06e99da..1151fff75 100644 --- a/core/deps/libzip/lib/zip_crypto_mbedtls.h +++ b/core/deps/libzip/lib/zip_crypto_mbedtls.h @@ -1,9 +1,9 @@ /* zip_crypto_mbedtls.h -- definitions for mbedtls wrapper - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_crypto_openssl.c b/core/deps/libzip/lib/zip_crypto_openssl.c index 5cbc5ce2c..7f1da10ed 100644 --- a/core/deps/libzip/lib/zip_crypto_openssl.c +++ b/core/deps/libzip/lib/zip_crypto_openssl.c @@ -3,7 +3,7 @@ Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,21 +40,70 @@ #include #include -#if OPENSSL_VERSION_NUMBER < 0x1010000fL || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x02070000fL) -#define USE_OPENSSL_1_0_API +#ifdef USE_OPENSSL_3_API +static _zip_crypto_hmac_t* hmac_new() { + _zip_crypto_hmac_t *hmac = (_zip_crypto_hmac_t*)malloc(sizeof(*hmac)); + if (hmac != NULL) { + hmac->mac = NULL; + hmac->ctx = NULL; + } + return hmac; +} +static void hmac_free(_zip_crypto_hmac_t* hmac) { + if (hmac != NULL) { + if (hmac->ctx != NULL) { + EVP_MAC_CTX_free(hmac->ctx); + } + if (hmac->mac != NULL) { + EVP_MAC_free(hmac->mac); + } + free(hmac); + } +} #endif - _zip_crypto_aes_t * _zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error) { _zip_crypto_aes_t *aes; + const EVP_CIPHER* cipher_type; + + switch (key_size) { + case 128: + cipher_type = EVP_aes_128_ecb(); + break; + case 192: + cipher_type = EVP_aes_192_ecb(); + break; + case 256: + cipher_type = EVP_aes_256_ecb(); + break; + default: + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } +#ifdef USE_OPENSSL_1_0_API if ((aes = (_zip_crypto_aes_t *)malloc(sizeof(*aes))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } + memset(aes, 0, sizeof(*aes)); +#else + if ((aes = EVP_CIPHER_CTX_new()) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } +#endif - AES_set_encrypt_key(key, key_size, aes); + if (EVP_EncryptInit_ex(aes, cipher_type, NULL, key, NULL) != 1) { +#ifdef USE_OPENSSL_1_0_API + free(aes); +#else + EVP_CIPHER_CTX_free(aes); +#endif + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; + } return aes; } @@ -65,8 +114,23 @@ _zip_crypto_aes_free(_zip_crypto_aes_t *aes) { return; } +#ifdef USE_OPENSSL_1_0_API + EVP_CIPHER_CTX_cleanup(aes); _zip_crypto_clear(aes, sizeof(*aes)); free(aes); +#else + EVP_CIPHER_CTX_free(aes); +#endif +} + + +bool +_zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out) { + int len; + if (EVP_EncryptUpdate(aes, out, &len, in, ZIP_CRYPTO_AES_BLOCK_LENGTH) != 1) { + return false; + } + return true; } @@ -79,13 +143,34 @@ _zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_ return NULL; } +#ifdef USE_OPENSSL_3_API + if ((hmac = hmac_new()) == NULL + || (hmac->mac = EVP_MAC_fetch(NULL, "HMAC", "provider=default")) == NULL + || (hmac->ctx = EVP_MAC_CTX_new(hmac->mac)) == NULL) { + hmac_free(hmac); + zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + { + OSSL_PARAM params[2]; + params[0] = OSSL_PARAM_construct_utf8_string("digest", "SHA1", 0); + params[1] = OSSL_PARAM_construct_end(); + + if (!EVP_MAC_init(hmac->ctx, (const unsigned char *)secret, secret_length, params)) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + hmac_free(hmac); + return NULL; + } + } +#else #ifdef USE_OPENSSL_1_0_API if ((hmac = (_zip_crypto_hmac_t *)malloc(sizeof(*hmac))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - HMAC_CTX_init(hmac); + HMAC_CTX_init(hmac); #else if ((hmac = HMAC_CTX_new()) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); @@ -102,6 +187,7 @@ _zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_ #endif return NULL; } +#endif return hmac; } @@ -113,7 +199,9 @@ _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { return; } -#ifdef USE_OPENSSL_1_0_API +#if defined(USE_OPENSSL_3_API) + hmac_free(hmac); +#elif defined(USE_OPENSSL_1_0_API) HMAC_CTX_cleanup(hmac); _zip_crypto_clear(hmac, sizeof(*hmac)); free(hmac); @@ -125,9 +213,13 @@ _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac) { bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data) { +#ifdef USE_OPENSSL_3_API + size_t length; + return EVP_MAC_final(hmac->ctx, data, &length, ZIP_CRYPTO_SHA1_LENGTH) == 1 && length == ZIP_CRYPTO_SHA1_LENGTH; +#else unsigned int length; - return HMAC_Final(hmac, data, &length) == 1; +#endif } diff --git a/core/deps/libzip/lib/zip_crypto_openssl.h b/core/deps/libzip/lib/zip_crypto_openssl.h index be0a8ca9f..198a90714 100644 --- a/core/deps/libzip/lib/zip_crypto_openssl.h +++ b/core/deps/libzip/lib/zip_crypto_openssl.h @@ -1,9 +1,9 @@ /* zip_crypto_openssl.h -- definitions for OpenSSL wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,17 +36,34 @@ #define HAVE_SECURE_RANDOM -#include +#include #include -#define _zip_crypto_aes_t AES_KEY +#if OPENSSL_VERSION_NUMBER < 0x1010000fL || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x02070000fL) +#define USE_OPENSSL_1_0_API +#elif OPENSSL_VERSION_NUMBER < 0x3000000fL +#define USE_OPENSSL_1_1_API +#else +#define USE_OPENSSL_3_API +#endif + +#define _zip_crypto_aes_t EVP_CIPHER_CTX +#ifdef USE_OPENSSL_3_API +struct _zip_crypto_hmac_t { + EVP_MAC *mac; + EVP_MAC_CTX *ctx; +}; +typedef struct _zip_crypto_hmac_t _zip_crypto_hmac_t; +#define _zip_crypto_hmac(hmac, data, length) (EVP_MAC_update((hmac->ctx), (data), (length)) == 1) +#else #define _zip_crypto_hmac_t HMAC_CTX +#define _zip_crypto_hmac(hmac, data, length) (HMAC_Update((hmac), (data), (length)) == 1) +#endif void _zip_crypto_aes_free(_zip_crypto_aes_t *aes); -#define _zip_crypto_aes_encrypt_block(aes, in, out) (AES_encrypt((in), (out), (aes)), true) +bool _zip_crypto_aes_encrypt_block(_zip_crypto_aes_t *aes, const zip_uint8_t *in, zip_uint8_t *out); _zip_crypto_aes_t *_zip_crypto_aes_new(const zip_uint8_t *key, zip_uint16_t key_size, zip_error_t *error); -#define _zip_crypto_hmac(hmac, data, length) (HMAC_Update((hmac), (data), (length)) == 1) void _zip_crypto_hmac_free(_zip_crypto_hmac_t *hmac); _zip_crypto_hmac_t *_zip_crypto_hmac_new(const zip_uint8_t *secret, zip_uint64_t secret_length, zip_error_t *error); bool _zip_crypto_hmac_output(_zip_crypto_hmac_t *hmac, zip_uint8_t *data); diff --git a/core/deps/libzip/lib/zip_crypto_win.c b/core/deps/libzip/lib/zip_crypto_win.c index 6f9a59630..ee3ccc30a 100644 --- a/core/deps/libzip/lib/zip_crypto_win.c +++ b/core/deps/libzip/lib/zip_crypto_win.c @@ -1,9 +1,9 @@ /* zip_crypto_win.c -- Windows Crypto API wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -254,7 +254,7 @@ pbkdf2(PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, DWORD c for (j = 0; j < cIterations; j++) { if (j == 0) { /* construct first input for PRF */ - memcpy(U, pbSalt, cbSalt); + (void)memcpy_s(U, cbSalt, pbSalt, cbSalt); U[cbSalt] = (BYTE)((i & 0xFF000000) >> 24); U[cbSalt + 1] = (BYTE)((i & 0x00FF0000) >> 16); U[cbSalt + 2] = (BYTE)((i & 0x0000FF00) >> 8); @@ -262,7 +262,7 @@ pbkdf2(PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, DWORD c dwULen = cbSalt + 4; } else { - memcpy(U, V, DIGEST_SIZE); + (void)memcpy_s(U, DIGEST_SIZE, V, DIGEST_SIZE); dwULen = DIGEST_SIZE; } @@ -274,11 +274,11 @@ pbkdf2(PUCHAR pbPassword, ULONG cbPassword, PUCHAR pbSalt, ULONG cbSalt, DWORD c } if (i != l) { - memcpy(&pbDerivedKey[(i - 1) * DIGEST_SIZE], Ti, DIGEST_SIZE); + (void)memcpy_s(&pbDerivedKey[(i - 1) * DIGEST_SIZE], cbDerivedKey - (i - 1) * DIGEST_SIZE, Ti, DIGEST_SIZE); } else { /* Take only the first r bytes */ - memcpy(&pbDerivedKey[(i - 1) * DIGEST_SIZE], Ti, r); + (void)memcpy_s(&pbDerivedKey[(i - 1) * DIGEST_SIZE], cbDerivedKey - (i - 1) * DIGEST_SIZE, Ti, r); } } diff --git a/core/deps/libzip/lib/zip_crypto_win.h b/core/deps/libzip/lib/zip_crypto_win.h index 9d3689152..a533fe2df 100644 --- a/core/deps/libzip/lib/zip_crypto_win.h +++ b/core/deps/libzip/lib/zip_crypto_win.h @@ -1,9 +1,9 @@ /* zip_crypto_win.h -- Windows Crypto API wrapper. - Copyright (C) 2018-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2018-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_delete.c b/core/deps/libzip/lib/zip_delete.c index 4ff4c1abe..676c16bf2 100644 --- a/core/deps/libzip/lib/zip_delete.c +++ b/core/deps/libzip/lib/zip_delete.c @@ -1,9 +1,9 @@ /* zip_delete.c -- delete file from zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_dir_add.c b/core/deps/libzip/lib/zip_dir_add.c index da1e4a422..c01081916 100644 --- a/core/deps/libzip/lib/zip_dir_add.c +++ b/core/deps/libzip/lib/zip_dir_add.c @@ -1,9 +1,9 @@ /* zip_dir_add.c -- add directory - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -61,11 +61,11 @@ zip_dir_add(zip_t *za, const char *name, zip_flags_t flags) { len = strlen(name); if (name[len - 1] != '/') { - if ((s = (char *)malloc(len + 2)) == NULL) { + if (len > SIZE_MAX - 2 || (s = (char *)malloc(len + 2)) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return -1; } - strcpy(s, name); + (void)strncpy_s(s, len + 2, name, len); s[len] = '/'; s[len + 1] = '\0'; } diff --git a/core/deps/libzip/lib/zip_dirent.c b/core/deps/libzip/lib/zip_dirent.c index 5226a6e1f..45a2a6a29 100644 --- a/core/deps/libzip/lib/zip_dirent.c +++ b/core/deps/libzip/lib/zip_dirent.c @@ -1,9 +1,9 @@ /* zip_dirent.c -- read directory entry (local or central), clean dirent - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,7 @@ #include #include #include +#include #include "zipint.h" @@ -127,15 +128,21 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor zip_uint64_t i; bool is_zip64; int ret; + zip_uint32_t cdir_crc; if ((off = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } offset = (zip_uint64_t)off; is_zip64 = false; + if (ZIP_WANT_TORRENTZIP(za)) { + cdir_crc = (zip_uint32_t)crc32(0, NULL, 0); + za->write_crc = &cdir_crc; + } + for (i = 0; i < survivors; i++) { zip_entry_t *entry = za->entry + filelist[i].idx; @@ -145,15 +152,17 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor is_zip64 = true; } + za->write_crc = NULL; + if ((off = zip_source_tell_write(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } size = (zip_uint64_t)off - offset; - if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX) + if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX) { is_zip64 = true; - + } if ((buffer = _zip_buffer_new(buf, sizeof(buf))) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); @@ -186,7 +195,13 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor comment = za->comment_changed ? za->comment_changes : za->comment_orig; - _zip_buffer_put_16(buffer, (zip_uint16_t)(comment ? comment->length : 0)); + if (ZIP_WANT_TORRENTZIP(za)) { + _zip_buffer_put_16(buffer, TORRENTZIP_SIGNATURE_LENGTH + TORRENTZIP_CRC_LENGTH); + } + else { + _zip_buffer_put_16(buffer, (zip_uint16_t)(comment ? comment->length : 0)); + } + if (!_zip_buffer_ok(buffer)) { zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); @@ -201,7 +216,15 @@ _zip_cdir_write(zip_t *za, const zip_filelist_t *filelist, zip_uint64_t survivor _zip_buffer_free(buffer); - if (comment) { + if (ZIP_WANT_TORRENTZIP(za)) { + char torrentzip_comment[TORRENTZIP_SIGNATURE_LENGTH + TORRENTZIP_CRC_LENGTH + 1]; + snprintf(torrentzip_comment, sizeof(torrentzip_comment), TORRENTZIP_SIGNATURE "%08X", cdir_crc); + + if (_zip_write(za, torrentzip_comment, strlen(torrentzip_comment)) < 0) { + return -1; + } + } + else if (comment != NULL) { if (_zip_write(za, comment->raw, comment->length) < 0) { return -1; } @@ -219,7 +242,7 @@ _zip_dirent_clone(const zip_dirent_t *sde) { return NULL; if (sde) - memcpy(tde, sde, sizeof(*sde)); + (void)memcpy_s(tde, sizeof(*tde), sde, sizeof(*sde)); else _zip_dirent_init(tde); @@ -421,7 +444,7 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo if (from_buffer) { if (_zip_buffer_left(buffer) < variable_size) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW); return -1; } } @@ -437,7 +460,7 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo zde->filename = _zip_read_string(buffer, src, filename_len, 1, error); if (!zde->filename) { if (zip_error_code_zip(error) == ZIP_ER_EOF) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW); } if (!from_buffer) { _zip_buffer_free(buffer); @@ -447,7 +470,7 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { if (_zip_guess_encoding(zde->filename, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_UTF8_IN_FILENAME); if (!from_buffer) { _zip_buffer_free(buffer); } @@ -487,7 +510,7 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo } if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { if (_zip_guess_encoding(zde->comment, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_UTF8_IN_COMMENT); if (!from_buffer) { _zip_buffer_free(buffer); } @@ -503,76 +526,18 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) { zip_uint16_t got_len; - zip_buffer_t *ef_buffer; const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error); - /* TODO: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */ - if (ef == NULL) { - if (!from_buffer) { - _zip_buffer_free(buffer); - } - return -1; - } - - if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) { - zip_error_set(error, ZIP_ER_MEMORY, 0); - if (!from_buffer) { - _zip_buffer_free(buffer); - } - return -1; - } - - if (zde->uncomp_size == ZIP_UINT32_MAX) { - zde->uncomp_size = _zip_buffer_get_64(ef_buffer); - } - else if (local) { - /* From appnote.txt: This entry in the Local header MUST - include BOTH original and compressed file size fields. */ - (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */ - } - if (zde->comp_size == ZIP_UINT32_MAX) { - zde->comp_size = _zip_buffer_get_64(ef_buffer); - } - if (!local) { - if (zde->offset == ZIP_UINT32_MAX) { - zde->offset = _zip_buffer_get_64(ef_buffer); - } - if (zde->disk_number == ZIP_UINT16_MAX) { - zde->disk_number = _zip_buffer_get_32(ef_buffer); - } - } - - if (!_zip_buffer_eof(ef_buffer)) { - /* accept additional fields if values match */ - bool ok = true; - switch (got_len) { - case 28: - _zip_buffer_set_offset(ef_buffer, 24); - if (zde->disk_number != _zip_buffer_get_32(ef_buffer)) { - ok = false; - } - /* fallthrough */ - case 24: - _zip_buffer_set_offset(ef_buffer, 0); - if ((zde->uncomp_size != _zip_buffer_get_64(ef_buffer)) || (zde->comp_size != _zip_buffer_get_64(ef_buffer)) || (zde->offset != _zip_buffer_get_64(ef_buffer))) { - ok = false; - } - break; - - default: - ok = false; - } - if (!ok) { - zip_error_set(error, ZIP_ER_INCONS, 0); - _zip_buffer_free(ef_buffer); + if (ef != NULL) { + if (!zip_dirent_process_ef_zip64(zde, ef, got_len, local, error)) { if (!from_buffer) { _zip_buffer_free(buffer); } return -1; } } - _zip_buffer_free(ef_buffer); } + if (!_zip_buffer_ok(buffer)) { zip_error_set(error, ZIP_ER_INTERNAL, 0); if (!from_buffer) { @@ -599,6 +564,65 @@ _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, boo return (zip_int64_t)size + (zip_int64_t)variable_size; } +bool zip_dirent_process_ef_zip64(zip_dirent_t* zde, const zip_uint8_t* ef, zip_uint64_t got_len, bool local, zip_error_t* error) { + zip_buffer_t *ef_buffer; + + if ((ef_buffer = _zip_buffer_new((zip_uint8_t *)ef, got_len)) == NULL) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if (zde->uncomp_size == ZIP_UINT32_MAX) { + zde->uncomp_size = _zip_buffer_get_64(ef_buffer); + } + else if (local) { + /* From appnote.txt: This entry in the Local header MUST + include BOTH original and compressed file size fields. */ + (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */ + } + if (zde->comp_size == ZIP_UINT32_MAX) { + zde->comp_size = _zip_buffer_get_64(ef_buffer); + } + if (!local) { + if (zde->offset == ZIP_UINT32_MAX) { + zde->offset = _zip_buffer_get_64(ef_buffer); + } + if (zde->disk_number == ZIP_UINT16_MAX) { + zde->disk_number = _zip_buffer_get_32(ef_buffer); + } + } + + if (!_zip_buffer_eof(ef_buffer)) { + /* accept additional fields if values match */ + bool ok = true; + switch (got_len) { + case 28: + _zip_buffer_set_offset(ef_buffer, 24); + if (zde->disk_number != _zip_buffer_get_32(ef_buffer)) { + ok = false; + } + /* fallthrough */ + case 24: + _zip_buffer_set_offset(ef_buffer, 0); + if ((zde->uncomp_size != _zip_buffer_get_64(ef_buffer)) || (zde->comp_size != _zip_buffer_get_64(ef_buffer)) || (zde->offset != _zip_buffer_get_64(ef_buffer))) { + ok = false; + } + break; + + default: + ok = false; + } + if (!ok) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_ZIP64_EF); + _zip_buffer_free(ef_buffer); + return false; + } + } + _zip_buffer_free(ef_buffer); + + return true; +} + static zip_string_t * _zip_dirent_process_ef_utf_8(const zip_dirent_t *de, zip_uint16_t id, zip_string_t *str) { @@ -651,7 +675,7 @@ _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error) { ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, ZIP_EF_WINZIP_AES, 0, ZIP_EF_BOTH, NULL); if (ef == NULL || ef_len < 7) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_WINZIPAES_EF); return false; } @@ -664,19 +688,18 @@ _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error) { crc_valid = true; switch (_zip_buffer_get_16(buffer)) { - case 1: - break; + case 1: + break; - case 2: - if (de->uncomp_size < 20 /* TODO: constant */) { + case 2: crc_valid = false; - } - break; - - default: - zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); - _zip_buffer_free(buffer); - return false; + /* TODO: When checking consistency, check that crc is 0. */ + break; + + default: + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); + _zip_buffer_free(buffer); + return false; } /* vendor */ @@ -704,7 +727,7 @@ _zip_dirent_process_winzip_aes(zip_dirent_t *de, zip_error_t *error) { } if (ef_len != 7) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_WINZIPAES_EF); _zip_buffer_free(buffer); return false; } @@ -729,7 +752,7 @@ _zip_dirent_size(zip_source_t *src, zip_uint16_t flags, zip_error_t *error) { size = local ? LENTRYSIZE : CDENTRYSIZE; if (zip_source_seek(src, local ? 26 : 28, SEEK_CUR) < 0) { - _zip_error_set_from_source(error, src); + zip_error_set_from_source(error, src); return -1; } @@ -902,7 +925,13 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags) { _zip_buffer_put_16(buffer, (zip_uint16_t)de->comp_method); } - _zip_u2d_time(de->last_mod, &dostime, &dosdate); + if (ZIP_WANT_TORRENTZIP(za)) { + dostime = 0xbc00; + dosdate = 0x2198; + } + else { + _zip_u2d_time(de->last_mod, &dostime, &dosdate); + } _zip_buffer_put_16(buffer, dostime); _zip_buffer_put_16(buffer, dosdate); @@ -938,12 +967,15 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags) { } _zip_buffer_put_16(buffer, _zip_string_length(de->filename)); - /* TODO: check for overflow */ - ef_total_size = (zip_uint32_t)_zip_ef_size(de->extra_fields, flags) + (zip_uint32_t)_zip_ef_size(ef, ZIP_EF_BOTH); + ef_total_size = (zip_uint32_t)_zip_ef_size(ef, ZIP_EF_BOTH); + if (!ZIP_WANT_TORRENTZIP(za)) { + /* TODO: check for overflow */ + ef_total_size += (zip_uint32_t)_zip_ef_size(de->extra_fields, flags); + } _zip_buffer_put_16(buffer, (zip_uint16_t)ef_total_size); if ((flags & ZIP_FL_LOCAL) == 0) { - _zip_buffer_put_16(buffer, _zip_string_length(de->comment)); + _zip_buffer_put_16(buffer, ZIP_WANT_TORRENTZIP(za) ? 0 : _zip_string_length(de->comment)); _zip_buffer_put_16(buffer, (zip_uint16_t)de->disk_number); _zip_buffer_put_16(buffer, de->int_attrib); _zip_buffer_put_32(buffer, de->ext_attrib); @@ -982,13 +1014,13 @@ _zip_dirent_write(zip_t *za, zip_dirent_t *de, zip_flags_t flags) { } } _zip_ef_free(ef); - if (de->extra_fields) { + if (de->extra_fields && !ZIP_WANT_TORRENTZIP(za)) { if (_zip_ef_write(za, de->extra_fields, flags) < 0) { return -1; } } - if ((flags & ZIP_FL_LOCAL) == 0) { + if ((flags & ZIP_FL_LOCAL) == 0 && !ZIP_WANT_TORRENTZIP(za)) { if (de->comment) { if (_zip_string_write(za, de->comment) < 0) { return -1; @@ -1090,15 +1122,10 @@ _zip_get_dirent(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_t *err void _zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate) { struct tm *tpm; - -#ifdef HAVE_LOCALTIME_R struct tm tm; - tpm = localtime_r(&intime, &tm); -#else - tpm = localtime(&intime); -#endif + tpm = zip_localtime(&intime, &tm); if (tpm == NULL) { - /* if localtime() fails, return an arbitrary date (1980-01-01 00:00:00) */ + /* if localtime fails, return an arbitrary date (1980-01-01 00:00:00) */ *ddate = (1 << 5) + 1; *dtime = 0; return; @@ -1109,8 +1136,6 @@ _zip_u2d_time(time_t intime, zip_uint16_t *dtime, zip_uint16_t *ddate) { *ddate = (zip_uint16_t)(((tpm->tm_year + 1900 - 1980) << 9) + ((tpm->tm_mon + 1) << 5) + tpm->tm_mday); *dtime = (zip_uint16_t)(((tpm->tm_hour) << 11) + ((tpm->tm_min) << 5) + ((tpm->tm_sec) >> 1)); - - return; } @@ -1161,3 +1186,22 @@ _zip_dirent_apply_attributes(zip_dirent_t *de, zip_file_attributes_t *attributes de->version_madeby = (de->version_madeby & 0xff) | (zip_uint16_t)(attributes->host_system << 8); } } + + +/* _zip_dirent_torrent_normalize(de); + Set values suitable for torrentzip. +*/ + +void zip_dirent_torrentzip_normalize(zip_dirent_t *de) { + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 2; /* maximum compression */ + de->comp_method = ZIP_CM_DEFLATE; + de->compression_level = TORRENTZIP_COMPRESSION_FLAGS; + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + + /* last_mod, extra_fields, and comment are normalized in zip_dirent_write() directly */ + +} diff --git a/core/deps/libzip/lib/zip_discard.c b/core/deps/libzip/lib/zip_discard.c index a29a2884b..d1dc4f8b0 100644 --- a/core/deps/libzip/lib/zip_discard.c +++ b/core/deps/libzip/lib/zip_discard.c @@ -1,9 +1,9 @@ /* zip_discard.c -- discard and free struct zip - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_entry.c b/core/deps/libzip/lib/zip_entry.c index 837b59c13..35a36e4a1 100644 --- a/core/deps/libzip/lib/zip_entry.c +++ b/core/deps/libzip/lib/zip_entry.c @@ -1,9 +1,9 @@ /* zip_entry.c -- struct zip_entry helper functions - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_err_str.c b/core/deps/libzip/lib/zip_err_str.c deleted file mode 100644 index de141ffe7..000000000 --- a/core/deps/libzip/lib/zip_err_str.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file was generated automatically by CMake - from zip.h; make changes there. -*/ - -#include "zipint.h" - -const char * const _zip_err_str[] = { - "No error", - "Multi-disk zip archives not supported", - "Renaming temporary file failed", - "Closing zip archive failed", - "Seek error", - "Read error", - "Write error", - "CRC error", - "Containing zip archive was closed", - "No such file", - "File already exists", - "Can't open file", - "Failure to create temporary file", - "Zlib error", - "Malloc failure", - "Entry has been changed", - "Compression method not supported", - "Premature end of file", - "Invalid argument", - "Not a zip archive", - "Internal error", - "Zip archive inconsistent", - "Can't remove file", - "Entry has been deleted", - "Encryption method not supported", - "Read-only archive", - "No password provided", - "Wrong password provided", - "Operation not supported", - "Resource still in use", - "Tell error", - "Compressed data invalid", - "Operation cancelled", -}; - -const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); - -#define N ZIP_ET_NONE -#define S ZIP_ET_SYS -#define Z ZIP_ET_ZLIB - -const int _zip_err_type[] = { - N, - N, - S, - S, - S, - S, - S, - N, - N, - N, - N, - S, - S, - Z, - N, - N, - N, - N, - N, - N, - N, - N, - S, - N, - N, - N, - N, - N, - N, - N, - S, - N, - N, -}; diff --git a/core/deps/libzip/lib/zip_error.c b/core/deps/libzip/lib/zip_error.c index 9381d5bf8..c498e0860 100644 --- a/core/deps/libzip/lib/zip_error.c +++ b/core/deps/libzip/lib/zip_error.c @@ -1,9 +1,9 @@ /* zip_error.c -- zip_error_t helper functions - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -67,23 +67,24 @@ zip_error_init_with_code(zip_error_t *error, int ze) { zip_error_init(error); error->zip_err = ze; switch (zip_error_system_type(error)) { - case ZIP_ET_SYS: - error->sys_err = errno; - break; - - default: - error->sys_err = 0; - break; + case ZIP_ET_SYS: + case ZIP_ET_LIBZIP: + error->sys_err = errno; + break; + + default: + error->sys_err = 0; + break; } } ZIP_EXTERN int zip_error_system_type(const zip_error_t *error) { - if (error->zip_err < 0 || error->zip_err >= _zip_nerr_str) + if (error->zip_err < 0 || error->zip_err >= _zip_err_str_count) return ZIP_ET_NONE; - return _zip_err_type[error->zip_err]; + return _zip_err_str[error->zip_err].type; } @@ -131,7 +132,12 @@ zip_error_set(zip_error_t *err, int ze, int se) { void -_zip_error_set_from_source(zip_error_t *err, zip_source_t *src) { +zip_error_set_from_source(zip_error_t *err, zip_source_t *src) { + if (src == NULL) { + zip_error_set(err, ZIP_ER_INVAL, 0); + return; + } + _zip_error_copy(err, zip_source_error(src)); } diff --git a/core/deps/libzip/lib/zip_error_clear.c b/core/deps/libzip/lib/zip_error_clear.c index 9bcd506ec..94ff5062d 100644 --- a/core/deps/libzip/lib/zip_error_clear.c +++ b/core/deps/libzip/lib/zip_error_clear.c @@ -1,9 +1,9 @@ /* zip_error_clear.c -- clear zip error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_error_get.c b/core/deps/libzip/lib/zip_error_get.c index 9d0ec03ff..c0418f0d0 100644 --- a/core/deps/libzip/lib/zip_error_get.c +++ b/core/deps/libzip/lib/zip_error_get.c @@ -1,9 +1,9 @@ /* zip_error_get.c -- get zip error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_error_get_sys_type.c b/core/deps/libzip/lib/zip_error_get_sys_type.c index 3c9998c57..a22ffb036 100644 --- a/core/deps/libzip/lib/zip_error_get_sys_type.c +++ b/core/deps/libzip/lib/zip_error_get_sys_type.c @@ -1,9 +1,9 @@ /* zip_error_get_sys_type.c -- return type of system error code - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,8 +37,9 @@ ZIP_EXTERN int zip_error_get_sys_type(int ze) { - if (ze < 0 || ze >= _zip_nerr_str) + if (ze < 0 || ze >= _zip_err_str_count) { return 0; + } - return _zip_err_type[ze]; + return _zip_err_str[ze].type; } diff --git a/core/deps/libzip/lib/zip_error_strerror.c b/core/deps/libzip/lib/zip_error_strerror.c index d20b3b2fa..fe04cbb4f 100644 --- a/core/deps/libzip/lib/zip_error_strerror.c +++ b/core/deps/libzip/lib/zip_error_strerror.c @@ -1,9 +1,9 @@ /* zip_error_sterror.c -- get string representation of struct zip_error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,45 +39,90 @@ #include "zipint.h" - ZIP_EXTERN const char * zip_error_strerror(zip_error_t *err) { - const char *zs, *ss; - char buf[128], *s; + const char *zip_error_string, *system_error_string; + char *s; + char *system_error_buffer = NULL; zip_error_fini(err); - if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { - sprintf(buf, "Unknown error %d", err->zip_err); - zs = NULL; - ss = buf; + if (err->zip_err < 0 || err->zip_err >= _zip_err_str_count) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "Unknown error %d", err->zip_err); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + zip_error_string = NULL; + system_error_string = system_error_buffer; } else { - zs = _zip_err_str[err->zip_err]; - - switch (_zip_err_type[err->zip_err]) { - case ZIP_ET_SYS: - ss = strerror(err->sys_err); - break; - - case ZIP_ET_ZLIB: - ss = zError(err->sys_err); - break; - - default: - ss = NULL; + zip_error_string = _zip_err_str[err->zip_err].description; + + switch (_zip_err_str[err->zip_err].type) { + case ZIP_ET_SYS: { + size_t len = strerrorlen_s(err->sys_err) + 1; + system_error_buffer = malloc(len); + strerror_s(system_error_buffer, len, err->sys_err); + system_error_string = system_error_buffer; + break; + } + + case ZIP_ET_ZLIB: + system_error_string = zError(err->sys_err); + break; + + case ZIP_ET_LIBZIP: { + zip_uint8_t error = GET_ERROR_FROM_DETAIL(err->sys_err); + int index = GET_INDEX_FROM_DETAIL(err->sys_err); + + if (error == 0) { + system_error_string = NULL; + } + else if (error >= _zip_err_details_count) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "invalid detail error %u", error); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = system_error_buffer; + } + else if (_zip_err_details[error].type == ZIP_DETAIL_ET_ENTRY && index < MAX_DETAIL_INDEX) { + system_error_buffer = (char *)malloc(128); + snprintf_s(system_error_buffer, 128, "entry %d: %s", index, _zip_err_details[error].description); + system_error_buffer[128 - 1] = '\0'; /* make sure string is NUL-terminated */ + system_error_string = system_error_buffer; + } + else { + system_error_string = _zip_err_details[error].description; + } + break; + } + + default: + system_error_string = NULL; } } - if (ss == NULL) - return zs; + if (system_error_string == NULL) { + free(system_error_buffer); + return zip_error_string; + } else { - if ((s = (char *)malloc(strlen(ss) + (zs ? strlen(zs) + 2 : 0) + 1)) == NULL) - return _zip_err_str[ZIP_ER_MEMORY]; + size_t length = strlen(system_error_string); + if (zip_error_string) { + size_t length_error = strlen(zip_error_string); + if (length + length_error + 2 < length) { + free(system_error_buffer); + return _zip_err_str[ZIP_ER_MEMORY].description; + } + length += length_error + 2; + } + if (length == SIZE_MAX || (s = (char *)malloc(length + 1)) == NULL) { + free(system_error_buffer); + return _zip_err_str[ZIP_ER_MEMORY].description; + } - sprintf(s, "%s%s%s", (zs ? zs : ""), (zs ? ": " : ""), ss); + snprintf_s(s, length + 1, "%s%s%s", (zip_error_string ? zip_error_string : ""), (zip_error_string ? ": " : ""), system_error_string); err->str = s; + free(system_error_buffer); return s; } } diff --git a/core/deps/libzip/lib/zip_error_to_str.c b/core/deps/libzip/lib/zip_error_to_str.c index d315b1901..b60b78813 100644 --- a/core/deps/libzip/lib/zip_error_to_str.c +++ b/core/deps/libzip/lib/zip_error_to_str.c @@ -1,9 +1,9 @@ /* zip_error_to_str.c -- get string representation of zip error code - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -34,7 +34,6 @@ #include #include -#include #define _ZIP_COMPILING_DEPRECATED #include "zipint.h" @@ -42,25 +41,18 @@ ZIP_EXTERN int zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { - const char *zs, *ss; + zip_error_t error; + const char *error_string; + int ret; - if (ze < 0 || ze >= _zip_nerr_str) - return snprintf(buf, len, "Unknown error %d", ze); + zip_error_init(&error); + zip_error_set(&error, ze, se); - zs = _zip_err_str[ze]; + error_string = zip_error_strerror(&error); - switch (_zip_err_type[ze]) { - case ZIP_ET_SYS: - ss = strerror(se); - break; + ret = snprintf_s(buf, ZIP_MIN(len, SIZE_MAX), error_string, strlen(error_string)); - case ZIP_ET_ZLIB: - ss = zError(se); - break; + zip_error_fini(&error); - default: - ss = NULL; - } - - return snprintf(buf, len, "%s%s%s", zs, (ss ? ": " : ""), (ss ? ss : "")); + return ret; } diff --git a/core/deps/libzip/lib/zip_extra_field.c b/core/deps/libzip/lib/zip_extra_field.c index 7424d8831..7aed12adb 100644 --- a/core/deps/libzip/lib/zip_extra_field.c +++ b/core/deps/libzip/lib/zip_extra_field.c @@ -1,9 +1,9 @@ /* zip_extra_field.c -- manipulate extra fields - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -219,7 +219,7 @@ _zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_ ef_data = _zip_buffer_get(buffer, flen); if (ef_data == NULL) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_INVALID_EF_LENGTH); _zip_buffer_free(buffer); _zip_ef_free(ef_head); return false; @@ -243,11 +243,12 @@ _zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_ if (!_zip_buffer_eof(buffer)) { /* Android APK files align stored file data with padding in extra fields; ignore. */ /* see https://android.googlesource.com/platform/build/+/master/tools/zipalign/ZipAlign.cpp */ + /* buffer is at most 64k long, so this can't overflow. */ size_t glen = _zip_buffer_left(buffer); zip_uint8_t *garbage; garbage = _zip_buffer_get(buffer, glen); - if (glen >= 4 || garbage == NULL || memcmp(garbage, "\0\0\0", glen) != 0) { - zip_error_set(error, ZIP_ER_INCONS, 0); + if (glen >= 4 || garbage == NULL || memcmp(garbage, "\0\0\0", (size_t)glen) != 0) { + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EF_TRAILING_GARBAGE); _zip_buffer_free(buffer); _zip_ef_free(ef_head); return false; @@ -370,7 +371,7 @@ _zip_read_local_ef(zip_t *za, zip_uint64_t idx) { } if (zip_source_seek(za->src, (zip_int64_t)(e->orig->offset + 26), SEEK_SET) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } diff --git a/core/deps/libzip/lib/zip_extra_field_api.c b/core/deps/libzip/lib/zip_extra_field_api.c index cf2b0e7f1..560c71bb2 100644 --- a/core/deps/libzip/lib/zip_extra_field_api.c +++ b/core/deps/libzip/lib/zip_extra_field_api.c @@ -1,9 +1,9 @@ /* zip_extra_field_api.c -- public extra fields API functions - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -56,6 +56,10 @@ zip_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zi zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) return -1; @@ -88,6 +92,10 @@ zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_i zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) return -1; @@ -236,6 +244,10 @@ zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_ui zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (ZIP_EF_IS_INTERNAL(ef_id)) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); diff --git a/core/deps/libzip/lib/zip_fclose.c b/core/deps/libzip/lib/zip_fclose.c index 4d6fc59ce..b820d98bd 100644 --- a/core/deps/libzip/lib/zip_fclose.c +++ b/core/deps/libzip/lib/zip_fclose.c @@ -1,9 +1,9 @@ /* zip_fclose.c -- close file in zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_fdopen.c b/core/deps/libzip/lib/zip_fdopen.c index 14f243fbb..e72c55dca 100644 --- a/core/deps/libzip/lib/zip_fdopen.c +++ b/core/deps/libzip/lib/zip_fdopen.c @@ -1,9 +1,9 @@ /* zip_fdopen.c -- open read-only archive from file descriptor - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -51,6 +51,10 @@ zip_fdopen(int fd_orig, int _flags, int *zep) { return NULL; } +#ifndef ENABLE_FDOPEN + _zip_set_open_error(zep, NULL, ZIP_ER_OPNOTSUPP); + return NULL; +#else /* We dup() here to avoid messing with the passed in fd. We could not restore it to the original state in case of error. */ @@ -83,4 +87,5 @@ zip_fdopen(int fd_orig, int _flags, int *zep) { zip_error_fini(&error); close(fd_orig); return za; +#endif } diff --git a/core/deps/libzip/lib/zip_file_add.c b/core/deps/libzip/lib/zip_file_add.c index 40386c095..c2c41e156 100644 --- a/core/deps/libzip/lib/zip_file_add.c +++ b/core/deps/libzip/lib/zip_file_add.c @@ -1,9 +1,9 @@ /* zip_file_add.c -- add file via callback function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_error_clear.c b/core/deps/libzip/lib/zip_file_error_clear.c index 863dae762..a10bff80c 100644 --- a/core/deps/libzip/lib/zip_file_error_clear.c +++ b/core/deps/libzip/lib/zip_file_error_clear.c @@ -1,9 +1,9 @@ /* zip_file_error_clear.c -- clear zip file error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_error_get.c b/core/deps/libzip/lib/zip_file_error_get.c index a47797646..b93117bb9 100644 --- a/core/deps/libzip/lib/zip_file_error_get.c +++ b/core/deps/libzip/lib/zip_file_error_get.c @@ -1,9 +1,9 @@ /* zip_file_error_get.c -- get zip file error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_get_comment.c b/core/deps/libzip/lib/zip_file_get_comment.c index 746186a71..fa998f02e 100644 --- a/core/deps/libzip/lib/zip_file_get_comment.c +++ b/core/deps/libzip/lib/zip_file_get_comment.c @@ -1,9 +1,9 @@ /* zip_file_get_comment.c -- get file comment - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_get_external_attributes.c b/core/deps/libzip/lib/zip_file_get_external_attributes.c index 6d4e0e490..a79bb3ed2 100644 --- a/core/deps/libzip/lib/zip_file_get_external_attributes.c +++ b/core/deps/libzip/lib/zip_file_get_external_attributes.c @@ -1,9 +1,9 @@ /* zip_file_get_external_attributes.c -- get opsys/external attributes - Copyright (C) 2013-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2013-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_get_offset.c b/core/deps/libzip/lib/zip_file_get_offset.c index eb9b0178c..72f4880e7 100644 --- a/core/deps/libzip/lib/zip_file_get_offset.c +++ b/core/deps/libzip/lib/zip_file_get_offset.c @@ -1,9 +1,9 @@ /* zip_file_get_offset.c -- get offset of file data in archive. - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -57,7 +57,7 @@ _zip_file_get_offset(const zip_t *za, zip_uint64_t idx, zip_error_t *error) { offset = za->entry[idx].orig->offset; if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); return 0; } @@ -93,11 +93,11 @@ _zip_file_get_end(const zip_t *za, zip_uint64_t index, zip_error_t *error) { if (entry->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { zip_uint8_t buf[4]; if (zip_source_seek(za->src, (zip_int64_t)offset, SEEK_SET) < 0) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); return 0; } if (zip_source_read(za->src, buf, 4) != 4) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); return 0; } if (memcmp(buf, DATADES_MAGIC, 4) == 0) { diff --git a/core/deps/libzip/lib/zip_file_rename.c b/core/deps/libzip/lib/zip_file_rename.c index a830b6aa8..9ac25814a 100644 --- a/core/deps/libzip/lib/zip_file_rename.c +++ b/core/deps/libzip/lib/zip_file_rename.c @@ -1,9 +1,9 @@ /* zip_file_rename.c -- rename file in zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_replace.c b/core/deps/libzip/lib/zip_file_replace.c index c824d7fba..4262d453e 100644 --- a/core/deps/libzip/lib/zip_file_replace.c +++ b/core/deps/libzip/lib/zip_file_replace.c @@ -1,9 +1,9 @@ /* zip_file_replace.c -- replace file via callback function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_file_set_comment.c b/core/deps/libzip/lib/zip_file_set_comment.c index 8c76f25ac..570f8e821 100644 --- a/core/deps/libzip/lib/zip_file_set_comment.c +++ b/core/deps/libzip/lib/zip_file_set_comment.c @@ -1,9 +1,9 @@ /* zip_file_set_comment.c -- set comment for file in archive - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -50,6 +50,10 @@ zip_file_set_comment(zip_t *za, zip_uint64_t idx, const char *comment, zip_uint1 zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (len > 0 && comment == NULL) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); diff --git a/core/deps/libzip/lib/zip_file_set_encryption.c b/core/deps/libzip/lib/zip_file_set_encryption.c index 6025e4a82..1cdcd4ab6 100644 --- a/core/deps/libzip/lib/zip_file_set_encryption.c +++ b/core/deps/libzip/lib/zip_file_set_encryption.c @@ -1,9 +1,9 @@ /* zip_file_set_encryption.c -- set encryption for file in archive - Copyright (C) 2016-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -51,6 +51,10 @@ zip_file_set_encryption(zip_t *za, zip_uint64_t idx, zip_uint16_t method, const zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (method != ZIP_EM_NONE && _zip_get_encryption_implementation(method, ZIP_CODEC_ENCODE) == NULL) { zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); diff --git a/core/deps/libzip/lib/zip_file_set_external_attributes.c b/core/deps/libzip/lib/zip_file_set_external_attributes.c index 0662f60d2..2e0429b8c 100644 --- a/core/deps/libzip/lib/zip_file_set_external_attributes.c +++ b/core/deps/libzip/lib/zip_file_set_external_attributes.c @@ -1,9 +1,9 @@ /* zip_file_set_external_attributes.c -- set external attributes for entry - Copyright (C) 2013-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2013-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -47,6 +47,10 @@ zip_file_set_external_attributes(zip_t *za, zip_uint64_t idx, zip_flags_t flags, zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } e = za->entry + idx; diff --git a/core/deps/libzip/lib/zip_file_set_mtime.c b/core/deps/libzip/lib/zip_file_set_mtime.c index 2753d595e..4126f5a16 100644 --- a/core/deps/libzip/lib/zip_file_set_mtime.c +++ b/core/deps/libzip/lib/zip_file_set_mtime.c @@ -1,9 +1,9 @@ /* zip_file_set_mtime.c -- set modification time of entry. - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -51,9 +51,18 @@ zip_file_set_mtime(zip_t *za, zip_uint64_t idx, time_t mtime, zip_flags_t flags) zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } e = za->entry + idx; + if (e->orig != NULL && e->orig->encryption_method == ZIP_EM_TRAD_PKWARE && !ZIP_ENTRY_CHANGED(e, ZIP_DIRENT_ENCRYPTION_METHOD) && !ZIP_ENTRY_DATA_CHANGED(e)) { + zip_error_set(&za->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (e->changes == NULL) { if ((e->changes = _zip_dirent_clone(e->orig)) == NULL) { zip_error_set(&za->error, ZIP_ER_MEMORY, 0); diff --git a/core/deps/libzip/lib/zip_file_strerror.c b/core/deps/libzip/lib/zip_file_strerror.c index 2dcdba72b..5b5a00924 100644 --- a/core/deps/libzip/lib/zip_file_strerror.c +++ b/core/deps/libzip/lib/zip_file_strerror.c @@ -1,9 +1,9 @@ /* zip_file_sterror.c -- get string representation of zip file error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_fopen.c b/core/deps/libzip/lib/zip_fopen.c index 2da0cc5f0..e3cde9be0 100644 --- a/core/deps/libzip/lib/zip_fopen.c +++ b/core/deps/libzip/lib/zip_fopen.c @@ -1,9 +1,9 @@ /* zip_fopen.c -- open file in zip archive for reading - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_fopen_encrypted.c b/core/deps/libzip/lib/zip_fopen_encrypted.c index 80160152a..d5880dcb9 100644 --- a/core/deps/libzip/lib/zip_fopen_encrypted.c +++ b/core/deps/libzip/lib/zip_fopen_encrypted.c @@ -1,9 +1,9 @@ /* zip_fopen_encrypted.c -- open file for reading with password - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_fopen_index.c b/core/deps/libzip/lib/zip_fopen_index.c index 5fd5f1a61..a449b83a0 100644 --- a/core/deps/libzip/lib/zip_fopen_index.c +++ b/core/deps/libzip/lib/zip_fopen_index.c @@ -1,9 +1,9 @@ /* zip_fopen_index.c -- open file in zip archive for reading by index - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_fopen_index_encrypted.c b/core/deps/libzip/lib/zip_fopen_index_encrypted.c index 280a5bd0c..40483709e 100644 --- a/core/deps/libzip/lib/zip_fopen_index_encrypted.c +++ b/core/deps/libzip/lib/zip_fopen_index_encrypted.c @@ -1,9 +1,9 @@ /* zip_fopen_index_encrypted.c -- open file for reading by index w/ password - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -49,11 +49,11 @@ zip_fopen_index_encrypted(zip_t *za, zip_uint64_t index, zip_flags_t flags, cons password = NULL; } - if ((src = _zip_source_zip_new(za, za, index, flags, 0, 0, password)) == NULL) + if ((src = zip_source_zip_file_create(za, index, flags, 0, -1, password, &za->error)) == NULL) return NULL; if (zip_source_open(src) < 0) { - _zip_error_set_from_source(&za->error, src); + zip_error_set_from_source(&za->error, src); zip_source_free(src); return NULL; } @@ -78,9 +78,7 @@ _zip_file_new(zip_t *za) { return NULL; } - zf->za = za; zip_error_init(&zf->error); - zf->eof = 0; zf->src = NULL; return zf; diff --git a/core/deps/libzip/lib/zip_fread.c b/core/deps/libzip/lib/zip_fread.c index ecf0c3b00..5b7da46ae 100644 --- a/core/deps/libzip/lib/zip_fread.c +++ b/core/deps/libzip/lib/zip_fread.c @@ -1,9 +1,9 @@ /* zip_fread.c -- read from file - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -50,11 +50,12 @@ zip_fread(zip_file_t *zf, void *outbuf, zip_uint64_t toread) { return -1; } - if ((zf->eof) || (toread == 0)) + if (toread == 0) { return 0; + } if ((n = zip_source_read(zf->src, outbuf, toread)) < 0) { - _zip_error_set_from_source(&zf->error, zf->src); + zip_error_set_from_source(&zf->error, zf->src); return -1; } diff --git a/core/deps/libzip/lib/zip_fseek.c b/core/deps/libzip/lib/zip_fseek.c index 21f344a6e..e68ffd367 100644 --- a/core/deps/libzip/lib/zip_fseek.c +++ b/core/deps/libzip/lib/zip_fseek.c @@ -1,9 +1,9 @@ /* zip_fseek.c -- seek in file - Copyright (C) 2016-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -43,9 +43,19 @@ zip_fseek(zip_file_t *zf, zip_int64_t offset, int whence) { return -1; if (zip_source_seek(zf->src, offset, whence) < 0) { - _zip_error_set_from_source(&zf->error, zf->src); + zip_error_set_from_source(&zf->error, zf->src); return -1; } return 0; } + + +ZIP_EXTERN int +zip_file_is_seekable(zip_file_t *zfile) { + if (!zfile) { + return -1; + } + + return zip_source_is_seekable(zfile->src); +} diff --git a/core/deps/libzip/lib/zip_ftell.c b/core/deps/libzip/lib/zip_ftell.c index 2b36770af..bf3b03d34 100644 --- a/core/deps/libzip/lib/zip_ftell.c +++ b/core/deps/libzip/lib/zip_ftell.c @@ -1,9 +1,9 @@ /* zip_ftell.c -- tell position in file - Copyright (C) 2016-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -46,7 +46,7 @@ zip_ftell(zip_file_t *zf) { res = zip_source_tell(zf->src); if (res < 0) { - _zip_error_set_from_source(&zf->error, zf->src); + zip_error_set_from_source(&zf->error, zf->src); return -1; } diff --git a/core/deps/libzip/lib/zip_get_archive_comment.c b/core/deps/libzip/lib/zip_get_archive_comment.c index 18a4b6106..ea9a00ab5 100644 --- a/core/deps/libzip/lib/zip_get_archive_comment.c +++ b/core/deps/libzip/lib/zip_get_archive_comment.c @@ -1,9 +1,9 @@ /* zip_get_archive_comment.c -- get archive comment - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_archive_flag.c b/core/deps/libzip/lib/zip_get_archive_flag.c index 3185ac53a..fc200bdc4 100644 --- a/core/deps/libzip/lib/zip_get_archive_flag.c +++ b/core/deps/libzip/lib/zip_get_archive_flag.c @@ -1,9 +1,9 @@ /* zip_get_archive_flag.c -- get archive global flag - Copyright (C) 2008-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2008-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_encryption_implementation.c b/core/deps/libzip/lib/zip_get_encryption_implementation.c index c1643dafe..72e48fe87 100644 --- a/core/deps/libzip/lib/zip_get_encryption_implementation.c +++ b/core/deps/libzip/lib/zip_get_encryption_implementation.c @@ -1,9 +1,9 @@ /* zip_get_encryption_implementation.c -- get encryption implementation - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_file_comment.c b/core/deps/libzip/lib/zip_get_file_comment.c index 28429bc87..d58e22ba6 100644 --- a/core/deps/libzip/lib/zip_get_file_comment.c +++ b/core/deps/libzip/lib/zip_get_file_comment.c @@ -1,9 +1,9 @@ /* zip_get_file_comment.c -- get file comment - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_name.c b/core/deps/libzip/lib/zip_get_name.c index 1a4bab8f3..4828d7810 100644 --- a/core/deps/libzip/lib/zip_get_name.c +++ b/core/deps/libzip/lib/zip_get_name.c @@ -1,9 +1,9 @@ /* zip_get_name.c -- get filename for a file in zip file - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_num_entries.c b/core/deps/libzip/lib/zip_get_num_entries.c index 3b18c7479..667dc5117 100644 --- a/core/deps/libzip/lib/zip_get_num_entries.c +++ b/core/deps/libzip/lib/zip_get_num_entries.c @@ -1,9 +1,9 @@ /* zip_get_num_entries.c -- get number of entries in archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_get_num_files.c b/core/deps/libzip/lib/zip_get_num_files.c index 23d7c9c96..140e34f90 100644 --- a/core/deps/libzip/lib/zip_get_num_files.c +++ b/core/deps/libzip/lib/zip_get_num_files.c @@ -1,9 +1,9 @@ /* zip_get_num_files.c -- get number of files in archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_hash.c b/core/deps/libzip/lib/zip_hash.c index 56e8d78ca..d3a954ec5 100644 --- a/core/deps/libzip/lib/zip_hash.c +++ b/core/deps/libzip/lib/zip_hash.c @@ -1,9 +1,9 @@ /* zip_hash.c -- hash table string -> uint64 - Copyright (C) 2015-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2015-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_io_util.c b/core/deps/libzip/lib/zip_io_util.c index 3678dd59d..9fcd10b4b 100644 --- a/core/deps/libzip/lib/zip_io_util.c +++ b/core/deps/libzip/lib/zip_io_util.c @@ -1,9 +1,9 @@ /* zip_io_util.c -- I/O helper functions - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -31,8 +31,10 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include +#include #include "zipint.h" @@ -46,7 +48,7 @@ _zip_read(zip_source_t *src, zip_uint8_t *b, zip_uint64_t length, zip_error_t *e } if ((n = zip_source_read(src, b, length)) < 0) { - _zip_error_set_from_source(error, src); + zip_error_set_from_source(error, src); return -1; } @@ -81,7 +83,7 @@ _zip_read_data(zip_buffer_t *buffer, zip_source_t *src, size_t length, bool nulp free(r); return NULL; } - memcpy(r, data, length); + (void)memcpy_s(r, length, data, length); } else { if (_zip_read(src, r, length, error) < 0) { @@ -122,7 +124,7 @@ _zip_write(zip_t *za, const void *data, zip_uint64_t length) { zip_int64_t n; if ((n = zip_source_write(za->src, data, length)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return -1; } if ((zip_uint64_t)n != length) { @@ -130,5 +132,15 @@ _zip_write(zip_t *za, const void *data, zip_uint64_t length) { return -1; } + if (za->write_crc != NULL) { + zip_uint64_t position = 0; + while (position < length) { + zip_uint64_t nn = ZIP_MIN(UINT_MAX, length - position); + + *za->write_crc = (zip_uint32_t)crc32(*za->write_crc, (const Bytef *)data + position, (uInt)nn); + position += nn; + } + } + return 0; } diff --git a/core/deps/libzip/lib/zip_libzip_version.c b/core/deps/libzip/lib/zip_libzip_version.c index df1e55b9c..4200727fc 100644 --- a/core/deps/libzip/lib/zip_libzip_version.c +++ b/core/deps/libzip/lib/zip_libzip_version.c @@ -1,9 +1,9 @@ /* zip_libzip_version.c -- return run-time version of library - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_memdup.c b/core/deps/libzip/lib/zip_memdup.c index 169186087..75d72c616 100644 --- a/core/deps/libzip/lib/zip_memdup.c +++ b/core/deps/libzip/lib/zip_memdup.c @@ -1,9 +1,9 @@ /* zip_memdup.c -- internal zip function, "strdup" with len - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -50,7 +50,7 @@ _zip_memdup(const void *mem, size_t len, zip_error_t *error) { return NULL; } - memcpy(ret, mem, len); + (void)memcpy_s(ret, len, mem, len); return ret; } diff --git a/core/deps/libzip/lib/zip_name_locate.c b/core/deps/libzip/lib/zip_name_locate.c index 308d843c2..4248dc2d3 100644 --- a/core/deps/libzip/lib/zip_name_locate.c +++ b/core/deps/libzip/lib/zip_name_locate.c @@ -1,9 +1,9 @@ /* zip_name_locate.c -- get index by name - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -49,18 +49,38 @@ zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags) { zip_int64_t _zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *error) { int (*cmp)(const char *, const char *); + size_t fname_length; + zip_string_t *str = NULL; const char *fn, *p; zip_uint64_t i; - if (za == NULL) + if (za == NULL) { return -1; + } if (fname == NULL) { zip_error_set(error, ZIP_ER_INVAL, 0); return -1; } - if (flags & (ZIP_FL_NOCASE | ZIP_FL_NODIR | ZIP_FL_ENC_CP437)) { + fname_length = strlen(fname); + + if (fname_length > ZIP_UINT16_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((flags & (ZIP_FL_ENC_UTF_8 | ZIP_FL_ENC_RAW)) == 0 && fname[0] != '\0') { + if ((str = _zip_string_new((const zip_uint8_t *)fname, (zip_uint16_t)strlen(fname), flags, error)) == NULL) { + return -1; + } + if ((fname = (const char *)_zip_string_get(str, NULL, 0, error)) == NULL) { + _zip_string_free(str); + return -1; + } + } + + if (flags & (ZIP_FL_NOCASE | ZIP_FL_NODIR | ZIP_FL_ENC_RAW | ZIP_FL_ENC_STRICT)) { /* can't use hash table */ cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; @@ -79,14 +99,18 @@ _zip_name_locate(zip_t *za, const char *fname, zip_flags_t flags, zip_error_t *e if (cmp(fname, fn) == 0) { _zip_error_clear(error); + _zip_string_free(str); return (zip_int64_t)i; } } zip_error_set(error, ZIP_ER_NOENT, 0); + _zip_string_free(str); return -1; } else { - return _zip_hash_lookup(za->names, (const zip_uint8_t *)fname, flags, error); + zip_int64_t ret = _zip_hash_lookup(za->names, (const zip_uint8_t *)fname, flags, error); + _zip_string_free(str); + return ret; } } diff --git a/core/deps/libzip/lib/zip_new.c b/core/deps/libzip/lib/zip_new.c index d2a5fa14d..4f69c8a2f 100644 --- a/core/deps/libzip/lib/zip_new.c +++ b/core/deps/libzip/lib/zip_new.c @@ -1,9 +1,9 @@ /* zip_new.c -- create and init struct zip - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_open.c b/core/deps/libzip/lib/zip_open.c index 292bfc84d..ee7e9decb 100644 --- a/core/deps/libzip/lib/zip_open.c +++ b/core/deps/libzip/lib/zip_open.c @@ -1,9 +1,9 @@ /* zip_open.c -- open zip archive by name - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -32,6 +32,7 @@ */ +#include #include #include #include @@ -41,10 +42,11 @@ typedef enum { EXISTS_ERROR = -1, EXISTS_NOT = 0, EXISTS_OK } exists_t; static zip_t *_zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error); static zip_int64_t _zip_checkcons(zip_t *za, zip_cdir_t *cdir, zip_error_t *error); +static void zip_check_torrentzip(zip_t *za, const zip_cdir_t *cdir); static zip_cdir_t *_zip_find_central_dir(zip_t *za, zip_uint64_t len); static exists_t _zip_file_exists(zip_source_t *src, zip_error_t *error); static int _zip_headercomp(const zip_dirent_t *, const zip_dirent_t *); -static unsigned char *_zip_memmem(const unsigned char *, size_t, const unsigned char *, size_t); +static const unsigned char *_zip_memmem(const unsigned char *, size_t, const unsigned char *, size_t); static zip_cdir_t *_zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_error_t *error); static zip_cdir_t *_zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error); static zip_cdir_t *_zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags, zip_error_t *error); @@ -77,9 +79,6 @@ zip_open(const char *fn, int _flags, int *zep) { ZIP_EXTERN zip_t * zip_open_from_source(zip_source_t *src, int _flags, zip_error_t *error) { - static zip_int64_t needed_support_read = -1; - static zip_int64_t needed_support_write = -1; - unsigned int flags; zip_int64_t supported; exists_t exists; @@ -91,15 +90,11 @@ zip_open_from_source(zip_source_t *src, int _flags, zip_error_t *error) { flags = (unsigned int)_flags; supported = zip_source_supports(src); - if (needed_support_read == -1) { - needed_support_read = zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_STAT, -1); - needed_support_write = zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_REMOVE, -1); - } - if ((supported & needed_support_read) != needed_support_read) { + if ((supported & ZIP_SOURCE_SUPPORTS_SEEKABLE) != ZIP_SOURCE_SUPPORTS_SEEKABLE) { zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); return NULL; } - if ((supported & needed_support_write) != needed_support_write) { + if ((supported & ZIP_SOURCE_SUPPORTS_WRITABLE) != ZIP_SOURCE_SUPPORTS_WRITABLE) { flags |= ZIP_RDONLY; } @@ -127,7 +122,7 @@ zip_open_from_source(zip_source_t *src, int _flags, zip_error_t *error) { return NULL; } if (zip_source_open(src) < 0) { - _zip_error_set_from_source(error, src); + zip_error_set_from_source(error, src); return NULL; } @@ -158,7 +153,7 @@ _zip_open(zip_source_t *src, unsigned int flags, zip_error_t *error) { zip_stat_init(&st); if (zip_source_stat(src, &st) < 0) { - _zip_error_set_from_source(error, src); + zip_error_set_from_source(error, src); return NULL; } if ((st.valid & ZIP_STAT_SIZE) == 0) { @@ -188,7 +183,16 @@ _zip_open(zip_source_t *src, unsigned int flags, zip_error_t *error) { za->entry = cdir->entry; za->nentry = cdir->nentry; za->nentry_alloc = cdir->nentry_alloc; - za->comment_orig = cdir->comment; + + zip_check_torrentzip(za, cdir); + + if (ZIP_IS_TORRENTZIP(za)) { + /* Torrentzip uses the archive comment to detect changes by tools that are not torrentzip aware. */ + _zip_string_free(cdir->comment); + } + else { + za->comment_orig = cdir->comment; + } free(cdir); @@ -224,8 +228,14 @@ void _zip_set_open_error(int *zep, const zip_error_t *err, int ze) { if (err) { ze = zip_error_code_zip(err); - if (zip_error_system_type(err) == ZIP_ET_SYS) { - errno = zip_error_code_system(err); + switch (zip_error_system_type(err)) { + case ZIP_ET_SYS: + case ZIP_ET_LIBZIP: + errno = zip_error_code_system(err); + break; + + default: + break; } } @@ -277,7 +287,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err if (cd->offset + cd->size > buf_offset + eocd_offset) { /* cdir spans past EOCD record */ - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); _zip_cdir_free(cd); return NULL; } @@ -289,7 +299,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err tail_len = _zip_buffer_left(buffer); if (tail_len < comment_len || ((za->open_flags & ZIP_CHECKCONS) && tail_len != comment_len)) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_COMMENT_LENGTH_INVALID); _zip_cdir_free(cd); return NULL; } @@ -308,7 +318,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err _zip_buffer_set_offset(buffer, cd->offset - buf_offset); if ((data = _zip_buffer_get(buffer, cd->size)) == NULL) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); _zip_cdir_free(cd); return NULL; } @@ -322,7 +332,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err cd_buffer = NULL; if (zip_source_seek(za->src, (zip_int64_t)cd->offset, SEEK_SET) < 0) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); _zip_cdir_free(cd); return NULL; } @@ -358,8 +368,11 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err } if ((cd->entry[i].orig = _zip_dirent_new()) == NULL || (entry_size = _zip_dirent_read(cd->entry[i].orig, za->src, cd_buffer, false, error)) < 0) { - if (grown && zip_error_code_zip(error) == ZIP_ER_NOZIP) { - zip_error_set(error, ZIP_ER_INCONS, 0); + if (zip_error_code_zip(error) == ZIP_ER_INCONS) { + zip_error_set(error, ZIP_ER_INCONS, ADD_INDEX_TO_DETAIL(zip_error_code_system(error), i)); + } + else if (grown && zip_error_code_zip(error) == ZIP_ER_NOZIP) { + zip_error_set(error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_CDIR_ENTRY_INVALID, i)); } _zip_cdir_free(cd); _zip_buffer_free(cd_buffer); @@ -370,7 +383,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err } if (i != cd->nentry || left > 0) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_WRONG_ENTRIES_COUNT); _zip_buffer_free(cd_buffer); _zip_cdir_free(cd); return NULL; @@ -386,7 +399,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err zip_int64_t offset = zip_source_tell(za->src); if (offset < 0) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); _zip_cdir_free(cd); return NULL; } @@ -394,7 +407,7 @@ _zip_read_cdir(zip_t *za, zip_buffer_t *buffer, zip_uint64_t buf_offset, zip_err } if (!ok) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); _zip_buffer_free(cd_buffer); _zip_cdir_free(cd); return NULL; @@ -443,17 +456,20 @@ _zip_checkcons(zip_t *za, zip_cdir_t *cd, zip_error_t *error) { } if (zip_source_seek(za->src, (zip_int64_t)cd->entry[i].orig->offset, SEEK_SET) < 0) { - _zip_error_set_from_source(error, za->src); + zip_error_set_from_source(error, za->src); return -1; } if (_zip_dirent_read(&temp, za->src, NULL, true, error) == -1) { + if (zip_error_code_zip(error) == ZIP_ER_INCONS) { + zip_error_set(error, ZIP_ER_INCONS, ADD_INDEX_TO_DETAIL(zip_error_code_system(error), i)); + } _zip_dirent_finalize(&temp); return -1; } if (_zip_headercomp(cd->entry[i].orig, &temp) != 0) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_ENTRY_HEADER_MISMATCH, i)); _zip_dirent_finalize(&temp); return -1; } @@ -486,9 +502,20 @@ _zip_headercomp(const zip_dirent_t *central, const zip_dirent_t *local) { if ((central->crc != local->crc) || (central->comp_size != local->comp_size) || (central->uncomp_size != local->uncomp_size)) { /* InfoZip stores valid values in local header even when data descriptor is used. - This is in violation of the appnote. */ - if (((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local->crc != 0 || local->comp_size != 0 || local->uncomp_size != 0)) + This is in violation of the appnote. + macOS Archive sets the compressed size even when data descriptor is used ( but not the others), + also in violation of the appnote. + */ + /* if data descriptor is not used, the values must match */ + if ((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0) { return -1; + } + /* when using a data descriptor, the local header value must be zero or match */ + if ((local->crc != 0 && central->crc != local->crc) || + (local->comp_size != 0 && central->comp_size != local->comp_size) || + (local->uncomp_size != 0 && central->uncomp_size != local->uncomp_size)) { + return -1; + } } return 0; @@ -505,10 +532,15 @@ _zip_allocate_new(zip_source_t *src, unsigned int flags, zip_error_t *error) { za->src = src; za->open_flags = flags; + za->flags = 0; + za->ch_flags = 0; + za->write_crc = NULL; + if (flags & ZIP_RDONLY) { za->flags |= ZIP_AFL_RDONLY; za->ch_flags |= ZIP_AFL_RDONLY; } + return za; } @@ -537,7 +569,7 @@ _zip_file_exists(zip_source_t *src, zip_error_t *error) { static zip_cdir_t * _zip_find_central_dir(zip_t *za, zip_uint64_t len) { zip_cdir_t *cdir, *cdirnew; - zip_uint8_t *match; + const zip_uint8_t *match; zip_int64_t buf_offset; zip_uint64_t buflen; zip_int64_t a; @@ -560,7 +592,7 @@ _zip_find_central_dir(zip_t *za, zip_uint64_t len) { } } if ((buf_offset = zip_source_tell(za->src)) < 0) { - _zip_error_set_from_source(&za->error, za->src); + zip_error_set_from_source(&za->error, za->src); return NULL; } @@ -577,7 +609,8 @@ _zip_find_central_dir(zip_t *za, zip_uint64_t len) { zip_error_set(&error, ZIP_ER_NOZIP, 0); match = _zip_buffer_get(buffer, 0); - while ((match = _zip_memmem(match, _zip_buffer_left(buffer) - (EOCDLEN - 4), (const unsigned char *)EOCD_MAGIC, 4)) != NULL) { + /* The size of buffer never greater than CDBUFSIZE. */ + while (_zip_buffer_left(buffer) >= EOCDLEN && (match = _zip_memmem(match, (size_t)_zip_buffer_left(buffer) - (EOCDLEN - 4), (const unsigned char *)EOCD_MAGIC, 4)) != NULL) { _zip_buffer_set_offset(buffer, (zip_uint64_t)(match - _zip_buffer_data(buffer))); if ((cdirnew = _zip_read_cdir(za, buffer, (zip_uint64_t)buf_offset, &error)) != NULL) { if (cdir) { @@ -622,19 +655,28 @@ _zip_find_central_dir(zip_t *za, zip_uint64_t len) { } -static unsigned char * -_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { +static const unsigned char *_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { const unsigned char *p; - if ((biglen < littlelen) || (littlelen == 0)) + if (littlelen == 0) { + return big; + } + + if (biglen < littlelen) { return NULL; - p = big - 1; - while ((p = (const unsigned char *)memchr(p + 1, little[0], (size_t)(big - (p + 1)) + (size_t)(biglen - littlelen) + 1)) != NULL) { - if (memcmp(p + 1, little + 1, littlelen - 1) == 0) - return (unsigned char *)p; } - return NULL; + p = big; + while (true) { + p = (const unsigned char *)memchr(p, little[0], biglen - (littlelen - 1) - (size_t)(p - big)); + if (p == NULL) { + return NULL; + } + if (memcmp(p + 1, little + 1, littlelen - 1) == 0) { + return p; + } + p += 1; + } } @@ -644,7 +686,7 @@ _zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags zip_uint64_t i, nentry, size, offset, eocd_offset; if (_zip_buffer_left(buffer) < EOCDLEN) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD_LENGTH_INVALID); return NULL; } @@ -677,12 +719,12 @@ _zip_read_eocd(zip_buffer_t *buffer, zip_uint64_t buf_offset, unsigned int flags if (offset + size > buf_offset + eocd_offset) { /* cdir spans past EOCD record */ - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); return NULL; } if ((flags & ZIP_CHECKCONS) && offset + size != buf_offset + eocd_offset) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_LENGTH_INVALID); return NULL; } @@ -723,7 +765,7 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse /* does EOCD fit before EOCD locator? */ if (eocd_offset + EOCD64LEN > eocdloc_offset + buf_offset) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD); return NULL; } @@ -734,7 +776,7 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse } else { if (zip_source_seek(src, (zip_int64_t)eocd_offset, SEEK_SET) < 0) { - _zip_error_set_from_source(error, src); + zip_error_set_from_source(error, src); return NULL; } if ((buffer = _zip_buffer_new_from_source(src, EOCD64LEN, eocd, error)) == NULL) { @@ -744,7 +786,7 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse } if (memcmp(_zip_buffer_get(buffer, 4), EOCD64_MAGIC, 4) != 0) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_WRONG_MAGIC); if (free_buffer) { _zip_buffer_free(buffer); } @@ -756,7 +798,7 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse /* is there a hole between EOCD and EOCD locator, or do they overlap? */ if ((flags & ZIP_CHECKCONS) && size + eocd_offset + 12 != buf_offset + eocdloc_offset) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD); if (free_buffer) { _zip_buffer_free(buffer); } @@ -778,7 +820,7 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse eocd_disk = eocd_disk64; } if ((flags & ZIP_CHECKCONS) && (eocd_disk != eocd_disk64 || num_disks != num_disks64)) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_EOCD64_MISMATCH); if (free_buffer) { _zip_buffer_free(buffer); } @@ -825,16 +867,16 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse } if (offset + size > buf_offset + eocd_offset) { /* cdir spans past EOCD record */ - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); return NULL; } if ((flags & ZIP_CHECKCONS) && offset + size != buf_offset + eocd_offset) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD); return NULL; } if (nentry > size / CDENTRYSIZE) { - zip_error_set(error, ZIP_ER_INCONS, 0); + zip_error_set(error, ZIP_ER_INCONS, ZIP_ER_DETAIL_CDIR_INVALID); return NULL; } @@ -847,3 +889,79 @@ _zip_read_eocd64(zip_source_t *src, zip_buffer_t *buffer, zip_uint64_t buf_offse return cd; } + + +static int decode_hex(char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } + else if (c >= 'A' && c <= 'F') { + return c - 'A' + 10; + } + else { + return -1; + } +} + +/* _zip_check_torrentzip: + check whether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + +static void zip_check_torrentzip(zip_t *za, const zip_cdir_t *cdir) { + zip_uint32_t crc_should; + char buf[8+1]; + size_t i; + + if (cdir == NULL) { + return; + } + + if (_zip_string_length(cdir->comment) != TORRENTZIP_SIGNATURE_LENGTH + TORRENTZIP_CRC_LENGTH + || strncmp((const char *)cdir->comment->raw, TORRENTZIP_SIGNATURE, TORRENTZIP_SIGNATURE_LENGTH) != 0) + return; + + memcpy(buf, cdir->comment->raw + TORRENTZIP_SIGNATURE_LENGTH, TORRENTZIP_CRC_LENGTH); + buf[TORRENTZIP_CRC_LENGTH] = '\0'; + crc_should = 0; + for (i = 0; i < TORRENTZIP_CRC_LENGTH; i += 2) { + int low, high; + high = decode_hex((buf[i])); + low = decode_hex(buf[i + 1]); + if (high < 0 || low < 0) { + return; + } + crc_should = (crc_should << 8) + (high << 4) + low; + } + + { + zip_stat_t st; + zip_source_t* src_window; + zip_source_t* src_crc; + zip_uint8_t buffer[512]; + zip_int64_t ret; + + zip_stat_init(&st); + st.valid |= ZIP_STAT_SIZE | ZIP_STAT_CRC; + st.size = cdir->size; + st.crc = crc_should; + if ((src_window = _zip_source_window_new(za->src, cdir->offset, cdir->size, &st, 0, NULL, NULL, 0, false, NULL)) == NULL) { + return; + } + if ((src_crc = zip_source_crc_create(src_window, 1, NULL)) == NULL) { + zip_source_free(src_window); + return; + } + if (zip_source_open(src_crc) != 0) { + zip_source_free(src_crc); + return; + } + while ((ret = zip_source_read(src_crc, buffer, sizeof(buffer))) > 0) { + } + zip_source_free(src_crc); + if (ret < 0) { + return; + } + } + + /* TODO: if check consistency, check cdir entries for valid values */ + za->flags |= ZIP_AFL_IS_TORRENTZIP; +} diff --git a/core/deps/libzip/lib/zip_pkware.c b/core/deps/libzip/lib/zip_pkware.c index 1b1b461a0..6a8c9fcde 100644 --- a/core/deps/libzip/lib/zip_pkware.c +++ b/core/deps/libzip/lib/zip_pkware.c @@ -3,7 +3,7 @@ Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_progress.c b/core/deps/libzip/lib/zip_progress.c index a881df476..e080514b1 100644 --- a/core/deps/libzip/lib/zip_progress.c +++ b/core/deps/libzip/lib/zip_progress.c @@ -3,7 +3,7 @@ Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_random_unix.c b/core/deps/libzip/lib/zip_random_unix.c index 4aa9cc26e..867df7900 100644 --- a/core/deps/libzip/lib/zip_random_unix.c +++ b/core/deps/libzip/lib/zip_random_unix.c @@ -1,9 +1,9 @@ /* zip_random_unix.c -- fill the user's buffer with random stuff (Unix version) - Copyright (C) 2016-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -83,6 +83,11 @@ zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { #ifndef HAVE_RANDOM_UINT32 #include +#ifndef HAVE_RANDOM +#define srandom srand +#define random rand +#endif + zip_uint32_t zip_random_uint32(void) { static bool seeded = false; @@ -95,6 +100,7 @@ zip_random_uint32(void) { if (!seeded) { srandom((unsigned int)time(NULL)); + seeded = true; } return (zip_uint32_t)random(); diff --git a/core/deps/libzip/lib/zip_random_uwp.c b/core/deps/libzip/lib/zip_random_uwp.c index 7cff98e98..0883ce454 100644 --- a/core/deps/libzip/lib/zip_random_uwp.c +++ b/core/deps/libzip/lib/zip_random_uwp.c @@ -1,9 +1,9 @@ /* zip_random_uwp.c -- fill the user's buffer with random stuff (UWP version) - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -41,18 +41,17 @@ #include #include -#include ZIP_EXTERN bool zip_secure_random(zip_uint8_t *buffer, zip_uint16_t length) { BCRYPT_ALG_HANDLE hAlg = NULL; NTSTATUS hr = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); - if (hr != STATUS_SUCCESS || hAlg == NULL) { + if (!BCRYPT_SUCCESS(hr) || hAlg == NULL) { return false; } hr = BCryptGenRandom(&hAlg, buffer, length, 0); BCryptCloseAlgorithmProvider(&hAlg, 0); - if (hr != STATUS_SUCCESS) { + if (!BCRYPT_SUCCESS(hr)) { return false; } return true; @@ -75,6 +74,7 @@ zip_random_uint32(void) { if (!seeded) { srand((unsigned int)time(NULL)); + seeded = true; } return (zip_uint32_t)rand(); diff --git a/core/deps/libzip/lib/zip_random_win32.c b/core/deps/libzip/lib/zip_random_win32.c index 251735778..789b9c205 100644 --- a/core/deps/libzip/lib/zip_random_win32.c +++ b/core/deps/libzip/lib/zip_random_win32.c @@ -1,9 +1,9 @@ /* zip_random_win32.c -- fill the user's buffer with random stuff (Windows version) - Copyright (C) 2016-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2016-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -74,6 +74,7 @@ zip_random_uint32(void) { if (!seeded) { srand((unsigned int)time(NULL)); + seeded = true; } return (zip_uint32_t)rand(); diff --git a/core/deps/libzip/lib/zip_rename.c b/core/deps/libzip/lib/zip_rename.c index eb1b3956b..c89b06c9e 100644 --- a/core/deps/libzip/lib/zip_rename.c +++ b/core/deps/libzip/lib/zip_rename.c @@ -1,9 +1,9 @@ /* zip_rename.c -- rename file in zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_replace.c b/core/deps/libzip/lib/zip_replace.c index 2140223ac..96c083c3d 100644 --- a/core/deps/libzip/lib/zip_replace.c +++ b/core/deps/libzip/lib/zip_replace.c @@ -1,9 +1,9 @@ /* zip_replace.c -- replace file via callback function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_set_archive_comment.c b/core/deps/libzip/lib/zip_set_archive_comment.c index ce0c5d38a..7d06688e3 100644 --- a/core/deps/libzip/lib/zip_set_archive_comment.c +++ b/core/deps/libzip/lib/zip_set_archive_comment.c @@ -1,9 +1,9 @@ /* zip_set_archive_comment.c -- set archive comment - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -45,6 +45,10 @@ zip_set_archive_comment(zip_t *za, const char *comment, zip_uint16_t len) { zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (len > 0 && comment == NULL) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); diff --git a/core/deps/libzip/lib/zip_set_archive_flag.c b/core/deps/libzip/lib/zip_set_archive_flag.c index fe9f62ff0..834ef5bac 100644 --- a/core/deps/libzip/lib/zip_set_archive_flag.c +++ b/core/deps/libzip/lib/zip_set_archive_flag.c @@ -1,9 +1,9 @@ /* zip_get_archive_flag.c -- set archive global flag - Copyright (C) 2008-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2008-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,15 +39,26 @@ ZIP_EXTERN int zip_set_archive_flag(zip_t *za, zip_flags_t flag, int value) { unsigned int new_flags; - if (value) + if (flag == ZIP_AFL_IS_TORRENTZIP) { + zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + /* TODO: when setting ZIP_AFL_WANT_TORRENTZIP, we should error out if any changes have been made that are not allowed for torrentzip. */ + + if (value) { new_flags = za->ch_flags | flag; - else + } + else { new_flags = za->ch_flags & ~flag; + } - if (new_flags == za->ch_flags) + if (new_flags == za->ch_flags) { return 0; + } - if (ZIP_IS_RDONLY(za)) { + /* Allow removing ZIP_AFL_RDONLY if manually set, not if archive was opened read-only. */ + if (za->flags & ZIP_AFL_RDONLY) { zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } diff --git a/core/deps/libzip/lib/zip_set_default_password.c b/core/deps/libzip/lib/zip_set_default_password.c index d89394927..4bab513f4 100644 --- a/core/deps/libzip/lib/zip_set_default_password.c +++ b/core/deps/libzip/lib/zip_set_default_password.c @@ -1,9 +1,9 @@ /* zip_set_default_password.c -- set default password for decryption - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_set_file_comment.c b/core/deps/libzip/lib/zip_set_file_comment.c index d19121fa1..5d2b0b8a0 100644 --- a/core/deps/libzip/lib/zip_set_file_comment.c +++ b/core/deps/libzip/lib/zip_set_file_comment.c @@ -1,9 +1,9 @@ /* zip_set_file_comment.c -- set comment for file in archive - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_set_file_compression.c b/core/deps/libzip/lib/zip_set_file_compression.c index 511c7d515..a193bb77f 100644 --- a/core/deps/libzip/lib/zip_set_file_compression.c +++ b/core/deps/libzip/lib/zip_set_file_compression.c @@ -1,9 +1,9 @@ /* zip_set_file_compression.c -- set compression for file in archive - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,7 +40,7 @@ zip_set_file_compression(zip_t *za, zip_uint64_t idx, zip_int32_t method, zip_ui zip_entry_t *e; zip_int32_t old_method; - if (idx >= za->nentry || flags > 9) { + if (idx >= za->nentry) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -49,6 +49,10 @@ zip_set_file_compression(zip_t *za, zip_uint64_t idx, zip_int32_t method, zip_ui zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } + if (ZIP_WANT_TORRENTZIP(za)) { + zip_error_set(&za->error, ZIP_ER_NOT_ALLOWED, 0); + return -1; + } if (!zip_compression_method_supported(method, true)) { zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); diff --git a/core/deps/libzip/lib/zip_set_name.c b/core/deps/libzip/lib/zip_set_name.c index 52676857e..f1bf703e4 100644 --- a/core/deps/libzip/lib/zip_set_name.c +++ b/core/deps/libzip/lib/zip_set_name.c @@ -1,9 +1,9 @@ /* zip_set_name.c -- rename helper function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_accept_empty.c b/core/deps/libzip/lib/zip_source_accept_empty.c index 754b80b76..e772aeea9 100644 --- a/core/deps/libzip/lib/zip_source_accept_empty.c +++ b/core/deps/libzip/lib/zip_source_accept_empty.c @@ -1,9 +1,9 @@ /* zip_source_accept_empty.c -- if empty source is a valid archive - Copyright (C) 2019-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2019-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,7 +37,7 @@ bool zip_source_accept_empty(zip_source_t *src) { - int ret; + zip_int64_t ret; if ((zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ACCEPT_EMPTY)) == 0) { if (ZIP_SOURCE_IS_LAYERED(src)) { @@ -46,7 +46,7 @@ zip_source_accept_empty(zip_source_t *src) { return true; } - ret = (int)_zip_source_call(src, NULL, 0, ZIP_SOURCE_ACCEPT_EMPTY); + ret = _zip_source_call(src, NULL, 0, ZIP_SOURCE_ACCEPT_EMPTY); return ret != 0; } diff --git a/core/deps/libzip/lib/zip_source_begin_write.c b/core/deps/libzip/lib/zip_source_begin_write.c index 3981dc1f9..4a9d5d5d6 100644 --- a/core/deps/libzip/lib/zip_source_begin_write.c +++ b/core/deps/libzip/lib/zip_source_begin_write.c @@ -1,9 +1,9 @@ /* zip_source_begin_write.c -- start a new file for writing - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,11 @@ ZIP_EXTERN int zip_source_begin_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (ZIP_SOURCE_IS_OPEN_WRITING(src)) { zip_error_set(&src->error, ZIP_ER_INVAL, 0); return -1; diff --git a/core/deps/libzip/lib/zip_source_begin_write_cloning.c b/core/deps/libzip/lib/zip_source_begin_write_cloning.c index bfc63c8a6..df195fcd4 100644 --- a/core/deps/libzip/lib/zip_source_begin_write_cloning.c +++ b/core/deps/libzip/lib/zip_source_begin_write_cloning.c @@ -1,9 +1,9 @@ /* zip_source_begin_write_cloning.c -- clone part of file for writing - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,11 @@ ZIP_EXTERN int zip_source_begin_write_cloning(zip_source_t *src, zip_uint64_t offset) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (ZIP_SOURCE_IS_OPEN_WRITING(src)) { zip_error_set(&src->error, ZIP_ER_INVAL, 0); return -1; diff --git a/core/deps/libzip/lib/zip_source_buffer.c b/core/deps/libzip/lib/zip_source_buffer.c index a54c4fc84..566729325 100644 --- a/core/deps/libzip/lib/zip_source_buffer.c +++ b/core/deps/libzip/lib/zip_source_buffer.c @@ -1,9 +1,9 @@ /* zip_source_buffer.c -- create zip data source from buffer - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -50,8 +50,8 @@ struct buffer { zip_uint64_t shared_fragments; /* number of shared fragments */ struct buffer *shared_buffer; /* buffer fragments are shared with */ - zip_uint64_t size; /* size of buffer */ + zip_uint64_t size; /* size of buffer */ zip_uint64_t offset; /* current offset in buffer */ zip_uint64_t current_fragment; /* fragment current offset is in */ }; @@ -159,7 +159,7 @@ zip_source_buffer_fragment_with_attributes_create(const zip_buffer_fragment_t *f ctx->out = NULL; ctx->mtime = time(NULL); if (attributes) { - memcpy(&ctx->attributes, attributes, sizeof(ctx->attributes)); + (void)memcpy_s(&ctx->attributes, sizeof(ctx->attributes), attributes, sizeof(ctx->attributes)); } else { zip_file_attributes_init(&ctx->attributes); @@ -226,7 +226,7 @@ read_data(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { return -1; } - memcpy(data, &ctx->attributes, sizeof(ctx->attributes)); + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); return sizeof(ctx->attributes); } @@ -287,7 +287,7 @@ read_data(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { } case ZIP_SOURCE_SUPPORTS: - return zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_BEGIN_WRITE_CLONING, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, -1); + return zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SEEK, ZIP_SOURCE_TELL, ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_BEGIN_WRITE_CLONING, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_WRITE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); case ZIP_SOURCE_TELL: if (ctx->in->offset > ZIP_INT64_MAX) { @@ -344,6 +344,7 @@ buffer_clone(buffer_t *buffer, zip_uint64_t offset, zip_error_t *error) { fragment_offset = buffer->fragments[fragment].length; } + /* TODO: This should also consider the length of the fully shared fragments */ waste = buffer->fragments[fragment].length - fragment_offset; if (waste > offset) { zip_error_set(error, ZIP_ER_OPNOTSUPP, 0); @@ -356,18 +357,18 @@ buffer_clone(buffer_t *buffer, zip_uint64_t offset, zip_error_t *error) { #ifndef __clang_analyzer__ /* clone->fragments can't be null, since it was created with at least one fragment */ - clone->fragments[clone->nfragments - 1].length = fragment_offset; + clone->fragments[fragment].length = fragment_offset; #endif clone->fragment_offsets[clone->nfragments] = offset; clone->size = offset; - clone->first_owned_fragment = ZIP_MIN(buffer->first_owned_fragment, clone->nfragments - 1); + clone->first_owned_fragment = ZIP_MIN(buffer->first_owned_fragment, clone->nfragments); buffer->shared_buffer = clone; clone->shared_buffer = buffer; - buffer->shared_fragments = clone->nfragments; + buffer->shared_fragments = fragment + 1; clone->shared_fragments = fragment + 1; - + return clone; } @@ -376,6 +377,10 @@ static zip_uint64_t buffer_find_fragment(const buffer_t *buffer, zip_uint64_t offset) { zip_uint64_t low, high, mid; + if (buffer->nfragments == 0) { + return 0; + } + low = 0; high = buffer->nfragments - 1; @@ -429,12 +434,20 @@ buffer_grow_fragments(buffer_t *buffer, zip_uint64_t capacity, zip_error_t *erro return true; } - if ((fragments = realloc(buffer->fragments, sizeof(buffer->fragments[0]) * capacity)) == NULL) { + zip_uint64_t fragments_size = sizeof(buffer->fragments[0]) * capacity; + zip_uint64_t offsets_size = sizeof(buffer->fragment_offsets[0]) * (capacity + 1); + + if (capacity == ZIP_UINT64_MAX || fragments_size < capacity || fragments_size > SIZE_MAX|| offsets_size < capacity || offsets_size > SIZE_MAX) { + zip_error_set(error, ZIP_ER_MEMORY, 0); + return false; + } + + if ((fragments = realloc(buffer->fragments, (size_t)fragments_size)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return false; } buffer->fragments = fragments; - if ((offsets = realloc(buffer->fragment_offsets, sizeof(buffer->fragment_offsets[0]) * (capacity + 1))) == NULL) { + if ((offsets = realloc(buffer->fragment_offsets, (size_t)offsets_size)) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); return false; } @@ -493,6 +506,7 @@ buffer_new(const zip_buffer_fragment_t *fragments, zip_uint64_t nfragments, int buffer->fragments[j].data = fragments[i].data; buffer->fragments[j].length = fragments[i].length; buffer->fragment_offsets[i] = offset; + /* TODO: overflow */ offset += fragments[i].length; j++; } @@ -523,8 +537,11 @@ buffer_read(buffer_t *buffer, zip_uint8_t *data, zip_uint64_t length) { n = 0; while (n < length) { zip_uint64_t left = ZIP_MIN(length - n, buffer->fragments[i].length - fragment_offset); +#if ZIP_UINT64_MAX > SIZE_MAX + left = ZIP_MIN(left, SIZE_MAX); +#endif - memcpy(data + n, buffer->fragments[i].data + fragment_offset, left); + (void)memcpy_s(data + n, (size_t)left, buffer->fragments[i].data + fragment_offset, (size_t)left); if (left == buffer->fragments[i].length - fragment_offset) { i++; @@ -555,7 +572,7 @@ buffer_seek(buffer_t *buffer, void *data, zip_uint64_t len, zip_error_t *error) static zip_int64_t buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip_error_t *error) { - zip_uint64_t n, i, fragment_offset, capacity; + zip_uint64_t copied, i, fragment_offset, capacity; if (buffer->offset + length + WRITE_FRAGMENT_SIZE - 1 < length) { zip_error_set(error, ZIP_ER_INVAL, 0); @@ -597,24 +614,30 @@ buffer_write(buffer_t *buffer, const zip_uint8_t *data, zip_uint64_t length, zip i = buffer->current_fragment; fragment_offset = buffer->offset - buffer->fragment_offsets[i]; - n = 0; - while (n < length) { - zip_uint64_t left = ZIP_MIN(length - n, buffer->fragments[i].length - fragment_offset); + copied = 0; + while (copied < length) { + zip_uint64_t n = ZIP_MIN(ZIP_MIN(length - copied, buffer->fragments[i].length - fragment_offset), SIZE_MAX); +#if ZIP_UINT64_MAX > SIZE_MAX + n = ZIP_MIN(n, SIZE_MAX); +#endif - memcpy(buffer->fragments[i].data + fragment_offset, data + n, left); + (void)memcpy_s(buffer->fragments[i].data + fragment_offset, (size_t)n, data + copied, (size_t)n); - if (left == buffer->fragments[i].length - fragment_offset) { + if (n == buffer->fragments[i].length - fragment_offset) { i++; + fragment_offset = 0; } - n += left; - fragment_offset = 0; + else { + fragment_offset += n; + } + copied += n; } - buffer->offset += n; + buffer->offset += copied; buffer->current_fragment = i; if (buffer->offset > buffer->size) { buffer->size = buffer->offset; } - return (zip_int64_t)n; + return (zip_int64_t)copied; } diff --git a/core/deps/libzip/lib/zip_source_call.c b/core/deps/libzip/lib/zip_source_call.c index 66b13d6e4..8c98fc2ef 100644 --- a/core/deps/libzip/lib/zip_source_call.c +++ b/core/deps/libzip/lib/zip_source_call.c @@ -1,9 +1,9 @@ /* zip_source_call.c -- invoke callback command on zip_source - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_close.c b/core/deps/libzip/lib/zip_source_close.c index 264e4b0d3..f4f3ff2b3 100644 --- a/core/deps/libzip/lib/zip_source_close.c +++ b/core/deps/libzip/lib/zip_source_close.c @@ -1,9 +1,9 @@ /* zip_source_close.c -- close zip_source (stop reading) - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_commit_write.c b/core/deps/libzip/lib/zip_source_commit_write.c index ec8cd8bc3..d7f567b80 100644 --- a/core/deps/libzip/lib/zip_source_commit_write.c +++ b/core/deps/libzip/lib/zip_source_commit_write.c @@ -1,9 +1,9 @@ /* zip_source_commit_write.c -- commit changes to file - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,11 @@ ZIP_EXTERN int zip_source_commit_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) { zip_error_set(&src->error, ZIP_ER_INVAL, 0); return -1; diff --git a/core/deps/libzip/lib/zip_source_compress.c b/core/deps/libzip/lib/zip_source_compress.c index 35a022cc2..3cf709ffa 100644 --- a/core/deps/libzip/lib/zip_source_compress.c +++ b/core/deps/libzip/lib/zip_source_compress.c @@ -1,9 +1,9 @@ /* zip_source_compress.c -- (de)compression routines - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -83,10 +83,10 @@ static struct implementation implementations[] = { static size_t implementations_size = sizeof(implementations) / sizeof(implementations[0]); -static zip_source_t *compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, int compression_flags); +static zip_source_t *compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, zip_uint32_t compression_flags); static zip_int64_t compress_callback(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); static void context_free(struct context *ctx); -static struct context *context_new(zip_int32_t method, bool compress, int compression_flags, zip_compression_algorithm_t *algorithm); +static struct context *context_new(zip_int32_t method, bool compress, zip_uint32_t compression_flags, zip_compression_algorithm_t *algorithm); static zip_int64_t compress_read(zip_source_t *, struct context *, void *, zip_uint64_t); zip_compression_algorithm_t * @@ -117,7 +117,7 @@ zip_compression_method_supported(zip_int32_t method, int compress) { } zip_source_t * -zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t method, int compression_flags) { +zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t method, zip_uint32_t compression_flags) { return compression_source_new(za, src, method, true, compression_flags); } @@ -128,7 +128,7 @@ zip_source_decompress(zip_t *za, zip_source_t *src, zip_int32_t method) { static zip_source_t * -compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, int compression_flags) { +compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool compress, zip_uint32_t compression_flags) { struct context *ctx; zip_source_t *s2; zip_compression_algorithm_t *algorithm = NULL; @@ -158,7 +158,7 @@ compression_source_new(zip_t *za, zip_source_t *src, zip_int32_t method, bool co static struct context * -context_new(zip_int32_t method, bool compress, int compression_flags, zip_compression_algorithm_t *algorithm) { +context_new(zip_int32_t method, bool compress, zip_uint32_t compression_flags, zip_compression_algorithm_t *algorithm) { struct context *ctx; if ((ctx = (struct context *)malloc(sizeof(*ctx))) == NULL) { @@ -240,7 +240,7 @@ compress_read(zip_source_t *src, struct context *ctx, void *data, zip_uint64_t l if (ctx->can_store && (zip_uint64_t)ctx->first_read <= out_offset) { ctx->is_stored = true; ctx->size = (zip_uint64_t)ctx->first_read; - memcpy(data, ctx->buffer, ctx->size); + (void)memcpy_s(data, ctx->size, ctx->buffer, ctx->size); return (zip_int64_t)ctx->size; } end = true; @@ -257,7 +257,7 @@ compress_read(zip_source_t *src, struct context *ctx, void *data, zip_uint64_t l } if ((n = zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); end = true; break; } @@ -319,7 +319,7 @@ compress_callback(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip ctx->first_read = -1; if (zip_source_stat(src, &st) < 0 || zip_source_get_file_attributes(src, &attributes) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -357,6 +357,7 @@ compress_callback(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip else { st->comp_method = ZIP_CM_STORE; st->valid |= ZIP_STAT_COMP_METHOD; + st->valid &= ~ZIP_STAT_COMP_SIZE; if (ctx->end_of_stream) { st->size = ctx->size; st->valid |= ZIP_STAT_SIZE; @@ -389,10 +390,9 @@ compress_callback(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip } case ZIP_SOURCE_SUPPORTS: - return ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + return ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_SUPPORTS_REOPEN, -1); default: - zip_error_set(&ctx->error, ZIP_ER_INTERNAL, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, len, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_crc.c b/core/deps/libzip/lib/zip_source_crc.c index cae73635a..435a084b7 100644 --- a/core/deps/libzip/lib/zip_source_crc.c +++ b/core/deps/libzip/lib/zip_source_crc.c @@ -1,9 +1,9 @@ /* zip_source_crc.c -- pass-through source that calculates CRC32 and size - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -52,16 +52,16 @@ static zip_int64_t crc_read(zip_source_t *, void *, void *, zip_uint64_t, zip_so zip_source_t * -zip_source_crc(zip_t *za, zip_source_t *src, int validate) { +zip_source_crc_create(zip_source_t *src, int validate, zip_error_t *error) { struct crc_context *ctx; if (src == NULL) { - zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } if ((ctx = (struct crc_context *)malloc(sizeof(*ctx))) == NULL) { - zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } @@ -72,7 +72,7 @@ zip_source_crc(zip_t *za, zip_source_t *src, int validate) { ctx->crc = (zip_uint32_t)crc32(0, NULL, 0); ctx->size = 0; - return zip_source_layered(za, src, crc_read, ctx); + return zip_source_layered_create(src, crc_read, ctx, error); } @@ -90,7 +90,7 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source case ZIP_SOURCE_READ: if ((n = zip_source_read(src, data, len)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -103,7 +103,7 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source struct zip_stat st; if (zip_source_stat(src, &st) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -112,7 +112,8 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source return -1; } if ((st.valid & ZIP_STAT_SIZE) && st.size != ctx->size) { - zip_error_set(&ctx->error, ZIP_ER_INCONS, 0); + /* We don't have the index here, but the caller should know which file they are reading from. */ + zip_error_set(&ctx->error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_INVALID_FILE_LENGTH, MAX_DETAIL_INDEX)); return -1; } } @@ -140,6 +141,10 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source st = (zip_stat_t *)data; if (ctx->crc_complete) { + if ((st->valid & ZIP_STAT_SIZE) && st->size != ctx->size) { + zip_error_set(&ctx->error, ZIP_ER_DATA_LENGTH, 0); + return -1; + } /* TODO: Set comp_size, comp_method, encryption_method? After all, this only works for uncompressed data. */ st->size = ctx->size; @@ -163,11 +168,13 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source zip_int64_t mask = zip_source_supports(src); if (mask < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } - return mask & ~zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + mask &= ~zip_source_make_command_bitmap(ZIP_SOURCE_BEGIN_WRITE, ZIP_SOURCE_COMMIT_WRITE, ZIP_SOURCE_ROLLBACK_WRITE, ZIP_SOURCE_SEEK_WRITE, ZIP_SOURCE_TELL_WRITE, ZIP_SOURCE_REMOVE, ZIP_SOURCE_GET_FILE_ATTRIBUTES, -1); + mask |= zip_source_make_command_bitmap(ZIP_SOURCE_FREE, -1); + return mask; } case ZIP_SOURCE_SEEK: { @@ -178,7 +185,7 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source return -1; } if (zip_source_seek(src, args->offset, args->whence) < 0 || (new_position = zip_source_tell(src)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -191,7 +198,6 @@ crc_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_source return (zip_int64_t)ctx->position; default: - zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, len, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_error.c b/core/deps/libzip/lib/zip_source_error.c index 00998e839..dc7fa20cb 100644 --- a/core/deps/libzip/lib/zip_source_error.c +++ b/core/deps/libzip/lib/zip_source_error.c @@ -1,9 +1,9 @@ /* zip_source_error.c -- get last error from zip_source - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_file.h b/core/deps/libzip/lib/zip_source_file.h index 43a464533..cca9fd2b5 100644 --- a/core/deps/libzip/lib/zip_source_file.h +++ b/core/deps/libzip/lib/zip_source_file.h @@ -1,9 +1,9 @@ /* zip_source_file.h -- header for common file operations - Copyright (C) 2020 Dieter Baron and Thomas Klausner + Copyright (C) 2020-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -34,7 +34,7 @@ struct zip_source_file_stat { zip_uint64_t size; /* must be valid for regular files */ time_t mtime; /* must always be valid, is initialized to current time */ - bool exists; /* must always be vaild */ + bool exists; /* must always be valid */ bool regular_file; /* must always be valid */ }; diff --git a/core/deps/libzip/lib/zip_source_file_common.c b/core/deps/libzip/lib/zip_source_file_common.c index 32414361b..6c58320f1 100644 --- a/core/deps/libzip/lib/zip_source_file_common.c +++ b/core/deps/libzip/lib/zip_source_file_common.c @@ -1,9 +1,9 @@ /* zip_source_file_common.c -- create data source from file - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -54,6 +54,7 @@ zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zi zip_source_file_context_t *ctx; zip_source_t *zs; zip_source_file_stat_t sb; + zip_uint64_t length; if (ops == NULL) { zip_error_set(error, ZIP_ER_INVAL, 0); @@ -82,10 +83,17 @@ zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zi } if (len < 0) { - len = 0; + if (len == -1) { + len = ZIP_LENGTH_TO_END; + } + // TODO: return ZIP_ER_INVAL if len != ZIP_LENGTH_UNCHECKED? + length = 0; + } + else { + length = (zip_uint64_t)len; } - if (start > ZIP_INT64_MAX || start + (zip_uint64_t)len < start) { + if (start > ZIP_INT64_MAX || start + length < start) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -107,9 +115,9 @@ zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zi } ctx->f = file; ctx->start = start; - ctx->len = (zip_uint64_t)len; + ctx->len = length; if (st) { - memcpy(&ctx->st, st, sizeof(ctx->st)); + (void)memcpy_s(&ctx->st, sizeof(ctx->st), st, sizeof(*st)); ctx->st.name = NULL; ctx->st.valid &= ~ZIP_STAT_NAME; } @@ -130,7 +138,7 @@ zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zi zip_error_init(&ctx->error); zip_file_attributes_init(&ctx->attributes); - ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1); + ctx->supports = ZIP_SOURCE_SUPPORTS_READABLE | zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, ZIP_SOURCE_SUPPORTS_REOPEN, -1); zip_source_file_stat_init(&sb); if (!ops->stat(ctx, &sb)) { @@ -169,9 +177,11 @@ zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zi } if (ctx->len == 0) { - ctx->len = sb.size - ctx->start; - ctx->st.size = ctx->len; - ctx->st.valid |= ZIP_STAT_SIZE; + if (len != ZIP_LENGTH_UNCHECKED) { + ctx->len = sb.size - ctx->start; + ctx->st.size = ctx->len; + ctx->st.valid |= ZIP_STAT_SIZE; + } /* when using a partial file, don't allow writing */ if (ctx->fname && start == 0 && ops->write != NULL) { @@ -262,7 +272,7 @@ read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); return -1; } - memcpy(data, &ctx->attributes, sizeof(ctx->attributes)); + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); return sizeof(ctx->attributes); case ZIP_SOURCE_OPEN: @@ -272,7 +282,7 @@ read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { } } - if (ctx->start > 0) { // TODO: rewind on re-open + if (ctx->start > 0) { /* TODO: rewind on re-open */ if (ctx->ops->seek(ctx, ctx->f, (zip_int64_t)ctx->start, SEEK_SET) == false) { /* TODO: skip by reading */ return -1; @@ -355,7 +365,7 @@ read_file(void *state, void *data, zip_uint64_t len, zip_source_cmd_t cmd) { return -1; } - memcpy(data, &ctx->st, sizeof(ctx->st)); + (void)memcpy_s(data, sizeof(ctx->st), &ctx->st, sizeof(ctx->st)); return sizeof(ctx->st); } diff --git a/core/deps/libzip/lib/zip_source_file_stdio.c b/core/deps/libzip/lib/zip_source_file_stdio.c index 15817716c..6dcc56399 100644 --- a/core/deps/libzip/lib/zip_source_file_stdio.c +++ b/core/deps/libzip/lib/zip_source_file_stdio.c @@ -3,7 +3,7 @@ Copyright (C) 2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -78,7 +78,7 @@ zip_source_filep(zip_t *za, FILE *file, zip_uint64_t start, zip_int64_t len) { ZIP_EXTERN zip_source_t * zip_source_filep_create(FILE *file, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { - if (file == NULL || length < -1) { + if (file == NULL || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -176,33 +176,3 @@ _zip_stdio_op_tell(zip_source_file_context_t *ctx, void *f) { return offset; } - - -/* - * fopen replacement that sets the close-on-exec flag - * some implementations support an fopen 'e' flag for that, - * but e.g. macOS doesn't. - */ -FILE * -_zip_fopen_close_on_exec(const char *name, bool writeable) { - int fd; - int flags; - FILE *fp; - - flags = O_CLOEXEC; - if (writeable) { - flags |= O_RDWR; - } - else { - flags |= O_RDONLY; - } - - /* mode argument needed on Windows */ - if ((fd = open(name, flags, 0666)) < 0) { - return NULL; - } - if ((fp = fdopen(fd, writeable ? "r+b" : "rb")) == NULL) { - return NULL; - } - return fp; -} diff --git a/core/deps/libzip/lib/zip_source_file_stdio.h b/core/deps/libzip/lib/zip_source_file_stdio.h index 1bf698ce2..802e6071f 100644 --- a/core/deps/libzip/lib/zip_source_file_stdio.h +++ b/core/deps/libzip/lib/zip_source_file_stdio.h @@ -6,7 +6,7 @@ Copyright (C) 2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -42,6 +42,4 @@ bool _zip_stdio_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t off bool _zip_stdio_op_stat(zip_source_file_context_t *ctx, zip_source_file_stat_t *st); zip_int64_t _zip_stdio_op_tell(zip_source_file_context_t *ctx, void *f); -FILE *_zip_fopen_close_on_exec(const char *name, bool writeable); - #endif /* _HAD_ZIP_SOURCE_FILE_STDIO_H */ diff --git a/core/deps/libzip/lib/zip_source_file_stdio_named.c b/core/deps/libzip/lib/zip_source_file_stdio_named.c index 5387c7663..1495d7dde 100644 --- a/core/deps/libzip/lib/zip_source_file_stdio_named.c +++ b/core/deps/libzip/lib/zip_source_file_stdio_named.c @@ -1,9 +1,9 @@ /* zip_source_file_stdio_named.c -- source for stdio file opened by name - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,6 +36,7 @@ #include "zip_source_file.h" #include "zip_source_file_stdio.h" +#include #include #include #ifdef HAVE_UNISTD_H @@ -53,6 +54,8 @@ #define CAN_CLONE #endif +static int create_temp_file(zip_source_file_context_t *ctx, bool create_file); + static zip_int64_t _zip_stdio_op_commit_write(zip_source_file_context_t *ctx); static zip_int64_t _zip_stdio_op_create_temp_output(zip_source_file_context_t *ctx); #ifdef CAN_CLONE @@ -63,6 +66,7 @@ static zip_int64_t _zip_stdio_op_remove(zip_source_file_context_t *ctx); static void _zip_stdio_op_rollback_write(zip_source_file_context_t *ctx); static char *_zip_stdio_op_strdup(zip_source_file_context_t *ctx, const char *string); static zip_int64_t _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len); +static FILE *_zip_fopen_close_on_exec(const char *name, bool writeable); /* clang-format off */ static zip_source_file_operations_t ops_stdio_named = { @@ -97,7 +101,7 @@ zip_source_file(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t le ZIP_EXTERN zip_source_t * zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { - if (fname == NULL || length < -1) { + if (fname == NULL || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -123,82 +127,51 @@ _zip_stdio_op_commit_write(zip_source_file_context_t *ctx) { static zip_int64_t _zip_stdio_op_create_temp_output(zip_source_file_context_t *ctx) { - char *temp; - int tfd; - int mode; - FILE *tfp; - struct stat st; - - if ((temp = (char *)malloc(strlen(ctx->fname) + 8)) == NULL) { - zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); - return -1; - } - - if (stat(ctx->fname, &st) == 0) { - mode = st.st_mode; - } - else { - mode = -1; - } - - sprintf(temp, "%s.XXXXXX", ctx->fname); - - if ((tfd = _zip_mkstempm(temp, mode)) == -1) { - zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - free(temp); + int fd = create_temp_file(ctx, true); + + if (fd < 0) { return -1; } - - if ((tfp = fdopen(tfd, "r+b")) == NULL) { + + if ((ctx->fout = fdopen(fd, "r+b")) == NULL) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - close(tfd); - (void)remove(temp); - free(temp); + close(fd); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } - ctx->fout = tfp; - ctx->tmpname = temp; - return 0; } #ifdef CAN_CLONE static zip_int64_t _zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uint64_t offset) { - char *temp; FILE *tfp; - + if (offset > ZIP_OFF_MAX) { zip_error_set(&ctx->error, ZIP_ER_SEEK, E2BIG); return -1; } - - if ((temp = (char *)malloc(strlen(ctx->fname) + 8)) == NULL) { - zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); - return -1; - } - sprintf(temp, "%s.XXXXXX", ctx->fname); - + #ifdef HAVE_CLONEFILE -#ifndef __clang_analyzer__ - /* we can't use mkstemp, since clonefile insists on creating the file */ - if (mktemp(temp) == NULL) { - zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - free(temp); + /* clonefile insists on creating the file, so just create a name */ + if (create_temp_file(ctx, false) < 0) { return -1; } -#endif - - if (clonefile(ctx->fname, temp, 0) < 0) { + + if (clonefile(ctx->fname, ctx->tmpname, 0) < 0) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - free(temp); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } - if ((tfp = _zip_fopen_close_on_exec(temp, true)) == NULL) { + if ((tfp = _zip_fopen_close_on_exec(ctx->tmpname, true)) == NULL) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - (void)remove(temp); - free(temp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } #else @@ -206,19 +179,16 @@ _zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uin int fd; struct file_clone_range range; struct stat st; - + if (fstat(fileno(ctx->f), &st) < 0) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - free(temp); return -1; } - - if ((fd = mkstemp(temp)) < 0) { - zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); - free(temp); + + if ((fd = create_temp_file(ctx, true)) < 0) { return -1; } - + range.src_fd = fileno(ctx->f); range.src_offset = 0; range.src_length = ((offset + st.st_blksize - 1) / st.st_blksize) * st.st_blksize; @@ -229,16 +199,18 @@ _zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uin if (ioctl(fd, FICLONERANGE, &range) < 0) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); (void)close(fd); - (void)remove(temp); - free(temp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } if ((tfp = fdopen(fd, "r+b")) == NULL) { zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); (void)close(fd); - (void)remove(temp); - free(temp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } } @@ -246,19 +218,21 @@ _zip_stdio_op_create_temp_output_cloning(zip_source_file_context_t *ctx, zip_uin if (ftruncate(fileno(tfp), (off_t)offset) < 0) { (void)fclose(tfp); - (void)remove(temp); - free(temp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; return -1; } if (fseeko(tfp, (off_t)offset, SEEK_SET) < 0) { - (void)fclose(tfp); - (void)remove(temp); - free(temp); zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + (void)fclose(tfp); + (void)remove(ctx->tmpname); + free(ctx->tmpname); + ctx->tmpname = NULL; + return -1; } ctx->fout = tfp; - ctx->tmpname = temp; return 0; } @@ -311,3 +285,108 @@ _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64 return (zip_int64_t)ret; } + + +static int create_temp_file(zip_source_file_context_t *ctx, bool create_file) { + char *temp; + int mode; + struct stat st; + int fd = 0; + char *start, *end; + + if (stat(ctx->fname, &st) == 0) { + mode = st.st_mode; + } + else { + mode = -1; + } + + size_t temp_size = strlen(ctx->fname) + 13; + if ((temp = (char *)malloc(temp_size)) == NULL) { + zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); + return -1; + } + snprintf_s(temp, temp_size, "%s.XXXXXX.part", ctx->fname); + end = temp + strlen(temp) - 5; + start = end - 6; + + for (;;) { + zip_uint32_t value = zip_random_uint32(); + char *xs = start; + + while (xs < end) { + char digit = value % 36; + if (digit < 10) { + *(xs++) = digit + '0'; + } + else { + *(xs++) = digit - 10 + 'a'; + } + value /= 36; + } + + if (create_file) { + if ((fd = open(temp, O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC, mode == -1 ? 0666 : (mode_t)mode)) >= 0) { + if (mode != -1) { + /* open() honors umask(), which we don't want in this case */ +#ifdef HAVE_FCHMOD + (void)fchmod(fd, (mode_t)mode); +#else + (void)chmod(temp, (mode_t)mode); +#endif + } + break; + } + if (errno != EEXIST) { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + } + else { + if (stat(temp, &st) < 0) { + if (errno == ENOENT) { + break; + } + else { + zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return -1; + } + } + } + } + + ctx->tmpname = temp; + + return fd; /* initialized to 0 if !create_file */ +} + + +/* + * fopen replacement that sets the close-on-exec flag + * some implementations support an fopen 'e' flag for that, + * but e.g. macOS doesn't. + */ +static FILE *_zip_fopen_close_on_exec(const char *name, bool writeable) { + int fd; + int flags; + FILE *fp; + + flags = O_CLOEXEC; + if (writeable) { + flags |= O_RDWR; + } + else { + flags |= O_RDONLY; + } + + /* mode argument needed on Windows */ + if ((fd = open(name, flags, 0666)) < 0) { + return NULL; + } + if ((fp = fdopen(fd, writeable ? "r+b" : "rb")) == NULL) { + return NULL; + } + return fp; +} diff --git a/core/deps/libzip/lib/zip_source_file_win32.c b/core/deps/libzip/lib/zip_source_file_win32.c index 6547fc20e..624860b1c 100644 --- a/core/deps/libzip/lib/zip_source_file_win32.c +++ b/core/deps/libzip/lib/zip_source_file_win32.c @@ -1,9 +1,9 @@ /* zip_source_file_win32.c -- read-only Windows file source implementation - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -69,7 +69,7 @@ zip_source_win32handle(zip_t *za, HANDLE h, zip_uint64_t start, zip_int64_t len) ZIP_EXTERN zip_source_t * zip_source_win32handle_create(HANDLE h, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { - if (h == INVALID_HANDLE_VALUE || length < -1) { + if (h == INVALID_HANDLE_VALUE || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -115,7 +115,7 @@ _zip_win32_op_seek(zip_source_file_context_t *ctx, void *f, zip_int64_t offset, break; default: zip_error_set(&ctx->error, ZIP_ER_SEEK, EINVAL); - return -1; + return false; } li.QuadPart = (LONGLONG)offset; @@ -184,7 +184,7 @@ _zip_stat_win32(zip_source_file_context_t *ctx, zip_source_file_stat_t *st, HAND zip_error_set(&ctx->error, ZIP_ER_READ, _zip_win32_error_to_errno(GetLastError())); return false; } - if (_zip_filetime_to_time_t(mtimeft, &mtime) < 0) { + if (!_zip_filetime_to_time_t(mtimeft, &mtime)) { zip_error_set(&ctx->error, ZIP_ER_READ, ERANGE); return false; } diff --git a/core/deps/libzip/lib/zip_source_file_win32.h b/core/deps/libzip/lib/zip_source_file_win32.h index 88e45b1f9..86ef2651c 100644 --- a/core/deps/libzip/lib/zip_source_file_win32.h +++ b/core/deps/libzip/lib/zip_source_file_win32.h @@ -6,7 +6,7 @@ Copyright (C) 2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -73,4 +73,15 @@ zip_int64_t _zip_win32_op_tell(zip_source_file_context_t *ctx, void *f); bool _zip_filetime_to_time_t(FILETIME ft, time_t *t); int _zip_win32_error_to_errno(DWORD win32err); +#ifdef __clang__ +#define DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wincompatible-function-pointer-types\"") +#define DONT_WARN_INCOMPATIBLE_FN_PTR_END _Pragma("GCC diagnostic pop") +#elif defined(__GNUC__) && __GNUC__ > 13 +#define DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"") +#define DONT_WARN_INCOMPATIBLE_FN_PTR_END _Pragma("GCC diagnostic pop") +#else +#define DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN +#define DONT_WARN_INCOMPATIBLE_FN_PTR_END +#endif + #endif /* _HAD_ZIP_SOURCE_FILE_WIN32_H */ diff --git a/core/deps/libzip/lib/zip_source_file_win32_ansi.c b/core/deps/libzip/lib/zip_source_file_win32_ansi.c index f299692b8..58034cc2a 100644 --- a/core/deps/libzip/lib/zip_source_file_win32_ansi.c +++ b/core/deps/libzip/lib/zip_source_file_win32_ansi.c @@ -3,7 +3,7 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,7 @@ static char *ansi_allocate_tempname(const char *name, size_t extra_chars, size_t static void ansi_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i); /* clang-format off */ +DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN zip_win32_file_operations_t ops_ansi = { ansi_allocate_tempname, @@ -50,6 +51,7 @@ zip_win32_file_operations_t ops_ansi = { strdup }; +DONT_WARN_INCOMPATIBLE_FN_PTR_END /* clang-format on */ ZIP_EXTERN zip_source_t * @@ -63,7 +65,7 @@ zip_source_win32a(zip_t *za, const char *fname, zip_uint64_t start, zip_int64_t ZIP_EXTERN zip_source_t * zip_source_win32a_create(const char *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { - if (fname == NULL || length < -1) { + if (fname == NULL || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -81,5 +83,5 @@ ansi_allocate_tempname(const char *name, size_t extra_chars, size_t *lengthp) { static void ansi_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i) { - snprintf(buf, len, "%s.%08x", name, i); + snprintf_s(buf, len, "%s.%08x", name, i); } diff --git a/core/deps/libzip/lib/zip_source_file_win32_named.c b/core/deps/libzip/lib/zip_source_file_win32_named.c index 1fe559180..855e605a9 100644 --- a/core/deps/libzip/lib/zip_source_file_win32_named.c +++ b/core/deps/libzip/lib/zip_source_file_win32_named.c @@ -3,7 +3,7 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -99,7 +99,6 @@ _zip_win32_named_op_create_temp_output(zip_source_file_context_t *ctx) { zip_uint32_t value, i; HANDLE th = INVALID_HANDLE_VALUE; - void *temp = NULL; PSECURITY_DESCRIPTOR psd = NULL; PSECURITY_ATTRIBUTES psa = NULL; SECURITY_ATTRIBUTES sa; diff --git a/core/deps/libzip/lib/zip_source_file_win32_utf16.c b/core/deps/libzip/lib/zip_source_file_win32_utf16.c index 6aef2bb49..8f07d0210 100644 --- a/core/deps/libzip/lib/zip_source_file_win32_utf16.c +++ b/core/deps/libzip/lib/zip_source_file_win32_utf16.c @@ -3,7 +3,7 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,6 +39,7 @@ static void utf16_make_tempname(char *buf, size_t len, const char *name, zip_uin static char *utf16_strdup(const char *string); /* clang-format off */ +DONT_WARN_INCOMPATIBLE_FN_PTR_BEGIN zip_win32_file_operations_t ops_utf16 = { utf16_allocate_tempname, @@ -52,6 +53,7 @@ zip_win32_file_operations_t ops_utf16 = { utf16_strdup }; +DONT_WARN_INCOMPATIBLE_FN_PTR_END /* clang-format on */ ZIP_EXTERN zip_source_t * @@ -65,7 +67,7 @@ zip_source_win32w(zip_t *za, const wchar_t *fname, zip_uint64_t start, zip_int64 ZIP_EXTERN zip_source_t * zip_source_win32w_create(const wchar_t *fname, zip_uint64_t start, zip_int64_t length, zip_error_t *error) { - if (fname == NULL || length < -1) { + if (fname == NULL || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } @@ -101,7 +103,7 @@ static HANDLE __stdcall utf16_create_file(const char *name, DWORD access, DWORD static void utf16_make_tempname(char *buf, size_t len, const char *name, zip_uint32_t i) { - _snwprintf((wchar_t *)buf, len, L"%s.%08x", (const wchar_t *)name, i); + _snwprintf_s((wchar_t *)buf, len, len, L"%s.%08x", (const wchar_t *)name, i); } diff --git a/core/deps/libzip/lib/zip_source_file_win32_utf8.c b/core/deps/libzip/lib/zip_source_file_win32_utf8.c index d6728e34f..d154f97ae 100644 --- a/core/deps/libzip/lib/zip_source_file_win32_utf8.c +++ b/core/deps/libzip/lib/zip_source_file_win32_utf8.c @@ -3,7 +3,7 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -49,7 +49,7 @@ zip_source_file_create(const char *fname, zip_uint64_t start, zip_int64_t length wchar_t *wfname; zip_source_t *source; - if (fname == NULL || length < -1) { + if (fname == NULL || length < ZIP_LENGTH_UNCHECKED) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } diff --git a/core/deps/libzip/lib/zip_source_free.c b/core/deps/libzip/lib/zip_source_free.c index 26504931e..1a800405c 100644 --- a/core/deps/libzip/lib/zip_source_free.c +++ b/core/deps/libzip/lib/zip_source_free.c @@ -1,9 +1,9 @@ /* zip_source_free.c -- free zip data source - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_function.c b/core/deps/libzip/lib/zip_source_function.c index 5602f1d19..1fe6396e1 100644 --- a/core/deps/libzip/lib/zip_source_function.c +++ b/core/deps/libzip/lib/zip_source_function.c @@ -1,9 +1,9 @@ /* zip_source_function.c -- create zip data source from callback function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -61,6 +61,7 @@ zip_source_function_create(zip_source_callback zcb, void *ud, zip_error_t *error if (zs->supports < 0) { zs->supports = ZIP_SOURCE_SUPPORTS_READABLE; } + zs->supports |= zip_source_make_command_bitmap(ZIP_SOURCE_SUPPORTS, -1); return zs; } diff --git a/core/deps/libzip/lib/zip_source_get_file_attributes.c b/core/deps/libzip/lib/zip_source_get_file_attributes.c index 734767a0e..4771dc16b 100644 --- a/core/deps/libzip/lib/zip_source_get_file_attributes.c +++ b/core/deps/libzip/lib/zip_source_get_file_attributes.c @@ -3,7 +3,7 @@ Copyright (C) 2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -60,8 +60,10 @@ zip_source_get_file_attributes(zip_source_t *src, zip_file_attributes_t *attribu if (ZIP_SOURCE_IS_LAYERED(src)) { zip_file_attributes_t lower_attributes; + zip_file_attributes_init(&lower_attributes); + if (zip_source_get_file_attributes(src->src, &lower_attributes) < 0) { - _zip_error_set_from_source(&src->error, src->src); + zip_error_set_from_source(&src->error, src->src); return -1; } diff --git a/core/deps/libzip/lib/zip_source_is_deleted.c b/core/deps/libzip/lib/zip_source_is_deleted.c index 27c931fd4..838aa9096 100644 --- a/core/deps/libzip/lib/zip_source_is_deleted.c +++ b/core/deps/libzip/lib/zip_source_is_deleted.c @@ -1,9 +1,9 @@ /* zip_source_is_deleted.c -- was archive was removed? - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_layered.c b/core/deps/libzip/lib/zip_source_layered.c index a02986929..62b78e68e 100644 --- a/core/deps/libzip/lib/zip_source_layered.c +++ b/core/deps/libzip/lib/zip_source_layered.c @@ -1,9 +1,9 @@ /* zip_source_layered.c -- create layered source - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -49,19 +49,27 @@ zip_source_layered(zip_t *za, zip_source_t *src, zip_source_layered_callback cb, zip_source_t * zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error) { zip_source_t *zs; + zip_int64_t lower_supports, supports; - if ((zs = _zip_source_new(error)) == NULL) + lower_supports = zip_source_supports(src); + supports = cb(src, ud, &lower_supports, sizeof(lower_supports), ZIP_SOURCE_SUPPORTS); + if (supports < 0) { + zip_error_set(error,ZIP_ER_INVAL, 0); /* Initialize in case cb doesn't return valid error. */ + cb(src, ud, error, sizeof(*error), ZIP_SOURCE_ERROR); return NULL; + } + + if ((zs = _zip_source_new(error)) == NULL) { + return NULL; + } - zip_source_keep(src); zs->src = src; zs->cb.l = cb; zs->ud = ud; + zs->supports = supports; - zs->supports = cb(src, ud, NULL, 0, ZIP_SOURCE_SUPPORTS); - if (zs->supports < 0) { - zs->supports = ZIP_SOURCE_SUPPORTS_READABLE; - } + /* Layered sources can't support writing, since we currently have no use case. If we want to revisit this, we have to define how the two sources interact. */ + zs->supports &= ~(ZIP_SOURCE_SUPPORTS_WRITABLE & ~ZIP_SOURCE_SUPPORTS_SEEKABLE); return zs; } diff --git a/core/deps/libzip/lib/zip_source_open.c b/core/deps/libzip/lib/zip_source_open.c index 442f1894f..b34fa2c6c 100644 --- a/core/deps/libzip/lib/zip_source_open.c +++ b/core/deps/libzip/lib/zip_source_open.c @@ -1,9 +1,9 @@ /* zip_source_open.c -- open zip_source (prepare for reading) - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -53,7 +53,7 @@ zip_source_open(zip_source_t *src) { else { if (ZIP_SOURCE_IS_LAYERED(src)) { if (zip_source_open(src->src) < 0) { - _zip_error_set_from_source(&src->error, src->src); + zip_error_set_from_source(&src->error, src->src); return -1; } } diff --git a/core/deps/libzip/lib/zip_mkstempm.c b/core/deps/libzip/lib/zip_source_pass_to_lower_layer.c similarity index 53% rename from core/deps/libzip/lib/zip_mkstempm.c rename to core/deps/libzip/lib/zip_source_pass_to_lower_layer.c index 41516d2ff..4a98222ec 100644 --- a/core/deps/libzip/lib/zip_mkstempm.c +++ b/core/deps/libzip/lib/zip_source_pass_to_lower_layer.c @@ -1,9 +1,9 @@ /* - zip_mkstempm.c -- mkstemp replacement that accepts a mode argument - Copyright (C) 2019-2020 Dieter Baron and Thomas Klausner + zip_source_pass_to_lower_layer.c -- pass command to lower layer + Copyright (C) 2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -31,63 +31,48 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include -#include - #include "zipint.h" -/* - * create temporary file with same permissions as previous one; - * or default permissions if there is no previous file - */ -int -_zip_mkstempm(char *path, int mode) { - int fd; - char *start, *end, *xs; - - int xcnt = 0; +zip_int64_t zip_source_pass_to_lower_layer(zip_source_t *src, void *data, zip_uint64_t length, zip_source_cmd_t command) { + switch (command) { + case ZIP_SOURCE_OPEN: + case ZIP_SOURCE_CLOSE: + case ZIP_SOURCE_FREE: + case ZIP_SOURCE_GET_FILE_ATTRIBUTES: + case ZIP_SOURCE_SUPPORTS_REOPEN: + return 0; - end = path + strlen(path); - start = end - 1; - while (start >= path && *start == 'X') { - xcnt++; - start--; - } - - if (xcnt == 0) { - errno = EINVAL; - return -1; - } + case ZIP_SOURCE_STAT: + return sizeof(zip_stat_t); - start++; + case ZIP_SOURCE_ACCEPT_EMPTY: + case ZIP_SOURCE_ERROR: + case ZIP_SOURCE_READ: + case ZIP_SOURCE_SEEK: + case ZIP_SOURCE_TELL: + return _zip_source_call(src, data, length, command); - for (;;) { - zip_uint32_t value = zip_random_uint32(); - xs = start; - - while (xs < end) { - char digit = value % 36; - if (digit < 10) { - *(xs++) = digit + '0'; - } - else { - *(xs++) = digit - 10 + 'a'; - } - value /= 36; - } + case ZIP_SOURCE_BEGIN_WRITE: + case ZIP_SOURCE_BEGIN_WRITE_CLONING: + case ZIP_SOURCE_COMMIT_WRITE: + case ZIP_SOURCE_REMOVE: + case ZIP_SOURCE_ROLLBACK_WRITE: + case ZIP_SOURCE_SEEK_WRITE: + case ZIP_SOURCE_TELL_WRITE: + case ZIP_SOURCE_WRITE: + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; - if ((fd = open(path, O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC, mode == -1 ? 0666 : (mode_t)mode)) >= 0) { - if (mode != -1) { - /* open() honors umask(), which we don't want in this case */ - (void)chmod(path, (mode_t)mode); - } - return fd; - } - if (errno != EEXIST) { + case ZIP_SOURCE_SUPPORTS: + if (length < sizeof(zip_int64_t)) { + zip_error_set(&src->error, ZIP_ER_INTERNAL, 0); return -1; } + return *(zip_int64_t *)data; + + default: + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; } -} +} \ No newline at end of file diff --git a/core/deps/libzip/lib/zip_source_pkware_decode.c b/core/deps/libzip/lib/zip_source_pkware_decode.c index a1c9e3a9b..b4c482b31 100644 --- a/core/deps/libzip/lib/zip_source_pkware_decode.c +++ b/core/deps/libzip/lib/zip_source_pkware_decode.c @@ -3,7 +3,7 @@ Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -85,7 +85,7 @@ decrypt_header(zip_source_t *src, struct trad_pkware *ctx) { bool ok = false; if ((n = zip_source_read(src, header, ZIP_CRYPTO_PKWARE_HEADERLEN)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -147,7 +147,7 @@ pkware_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_so case ZIP_SOURCE_READ: if ((n = zip_source_read(src, data, len)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -172,7 +172,7 @@ pkware_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_so } case ZIP_SOURCE_SUPPORTS: - return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, -1); + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); case ZIP_SOURCE_ERROR: return zip_error_to_data(&ctx->error, data, len); @@ -182,8 +182,7 @@ pkware_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zip_so return 0; default: - zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, len, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_pkware_encode.c b/core/deps/libzip/lib/zip_source_pkware_encode.c index 7c77e1e86..d89b9f4e8 100644 --- a/core/deps/libzip/lib/zip_source_pkware_encode.c +++ b/core/deps/libzip/lib/zip_source_pkware_encode.c @@ -3,7 +3,7 @@ Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -42,6 +42,8 @@ struct trad_pkware { zip_pkware_keys_t keys; zip_buffer_t *buffer; bool eof; + bool mtime_set; + time_t mtime; zip_error_t error; }; @@ -50,7 +52,7 @@ static int encrypt_header(zip_source_t *, struct trad_pkware *); static zip_int64_t pkware_encrypt(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); static void trad_pkware_free(struct trad_pkware *); static struct trad_pkware *trad_pkware_new(const char *password, zip_error_t *error); - +static void set_mtime(struct trad_pkware* ctx, zip_stat_t* st); zip_source_t * zip_source_pkware_encode(zip_t *za, zip_source_t *src, zip_uint16_t em, int flags, const char *password) { @@ -81,16 +83,19 @@ zip_source_pkware_encode(zip_t *za, zip_source_t *src, zip_uint16_t em, int flag static int encrypt_header(zip_source_t *src, struct trad_pkware *ctx) { - struct zip_stat st; unsigned short dostime, dosdate; zip_uint8_t *header; - if (zip_source_stat(src, &st) != 0) { - _zip_error_set_from_source(&ctx->error, src); - return -1; + if (!ctx->mtime_set) { + struct zip_stat st; + if (zip_source_stat(src, &st) != 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + set_mtime(ctx, &st); } - _zip_u2d_time(st.mtime, &dostime, &dosdate); + _zip_u2d_time(ctx->mtime, &dostime, &dosdate); if ((ctx->buffer = _zip_buffer_new(NULL, ZIP_CRYPTO_PKWARE_HEADERLEN)) == NULL) { zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0); @@ -156,7 +161,7 @@ pkware_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, zip } if ((n = zip_source_read(src, data, length)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -182,6 +187,9 @@ pkware_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, zip if (st->valid & ZIP_STAT_COMP_SIZE) { st->comp_size += ZIP_CRYPTO_PKWARE_HEADERLEN; } + set_mtime(ctx, st); + st->mtime = ctx->mtime; + st->valid |= ZIP_STAT_MTIME; return 0; } @@ -209,8 +217,7 @@ pkware_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, zip return 0; default: - zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, length, cmd); } } @@ -230,6 +237,8 @@ trad_pkware_new(const char *password, zip_error_t *error) { return NULL; } ctx->buffer = NULL; + ctx->mtime_set = false; + ctx->mtime = 0; zip_error_init(&ctx->error); return ctx; @@ -247,3 +256,16 @@ trad_pkware_free(struct trad_pkware *ctx) { zip_error_fini(&ctx->error); free(ctx); } + + +static void set_mtime(struct trad_pkware* ctx, zip_stat_t* st) { + if (!ctx->mtime_set) { + if (st->valid & ZIP_STAT_MTIME) { + ctx->mtime = st->mtime; + } + else { + time(&ctx->mtime); + } + ctx->mtime_set = true; + } +} diff --git a/core/deps/libzip/lib/zip_source_read.c b/core/deps/libzip/lib/zip_source_read.c index f146ab065..0938fcb08 100644 --- a/core/deps/libzip/lib/zip_source_read.c +++ b/core/deps/libzip/lib/zip_source_read.c @@ -1,9 +1,9 @@ /* zip_source_read.c -- read data from zip_source - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_remove.c b/core/deps/libzip/lib/zip_source_remove.c index a6ccd7eda..c1d73ab92 100644 --- a/core/deps/libzip/lib/zip_source_remove.c +++ b/core/deps/libzip/lib/zip_source_remove.c @@ -1,9 +1,9 @@ /* zip_source_remove.c -- remove empty archive - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,11 @@ int zip_source_remove(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) { return 0; } diff --git a/core/deps/libzip/lib/zip_source_rollback_write.c b/core/deps/libzip/lib/zip_source_rollback_write.c index d21b1ffe2..ea1a15107 100644 --- a/core/deps/libzip/lib/zip_source_rollback_write.c +++ b/core/deps/libzip/lib/zip_source_rollback_write.c @@ -1,9 +1,9 @@ /* zip_source_rollback_write.c -- discard changes - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,10 @@ ZIP_EXTERN void zip_source_rollback_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + return; + } + if (src->write_state != ZIP_SOURCE_WRITE_OPEN && src->write_state != ZIP_SOURCE_WRITE_FAILED) { return; } diff --git a/core/deps/libzip/lib/zip_source_seek.c b/core/deps/libzip/lib/zip_source_seek.c index 29d1e968e..e3baad5ab 100644 --- a/core/deps/libzip/lib/zip_source_seek.c +++ b/core/deps/libzip/lib/zip_source_seek.c @@ -1,9 +1,9 @@ /* zip_source_seek.c -- seek to offset - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_seek_write.c b/core/deps/libzip/lib/zip_source_seek_write.c index 5fa2a8129..34ae2f5af 100644 --- a/core/deps/libzip/lib/zip_source_seek_write.c +++ b/core/deps/libzip/lib/zip_source_seek_write.c @@ -1,9 +1,9 @@ /* zip_source_seek_write.c -- seek to offset for writing - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,6 +39,11 @@ ZIP_EXTERN int zip_source_seek_write(zip_source_t *src, zip_int64_t offset, int whence) { zip_source_args_seek_t args; + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_WRITING(src) || (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END)) { zip_error_set(&src->error, ZIP_ER_INVAL, 0); return -1; diff --git a/core/deps/libzip/lib/zip_source_stat.c b/core/deps/libzip/lib/zip_source_stat.c index 46eb92db5..05dcb84d7 100644 --- a/core/deps/libzip/lib/zip_source_stat.c +++ b/core/deps/libzip/lib/zip_source_stat.c @@ -1,9 +1,9 @@ /* zip_source_stat.c -- get meta information from zip_source - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -45,11 +45,15 @@ zip_source_stat(zip_source_t *src, zip_stat_t *st) { return -1; } + if (src->write_state == ZIP_SOURCE_WRITE_REMOVED) { + zip_error_set(&src->error, ZIP_ER_READ, ENOENT); + } + zip_stat_init(st); if (ZIP_SOURCE_IS_LAYERED(src)) { if (zip_source_stat(src->src, st) < 0) { - _zip_error_set_from_source(&src->error, src->src); + zip_error_set_from_source(&src->error, src->src); return -1; } } diff --git a/core/deps/libzip/lib/zip_source_supports.c b/core/deps/libzip/lib/zip_source_supports.c index b4575a74b..8fea2ae91 100644 --- a/core/deps/libzip/lib/zip_source_supports.c +++ b/core/deps/libzip/lib/zip_source_supports.c @@ -1,9 +1,9 @@ /* zip_source_supports.c -- check for supported functions - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -42,6 +42,10 @@ zip_source_supports(zip_source_t *src) { return src->supports; } +bool +zip_source_supports_reopen(zip_source_t *src) { + return (zip_source_supports(src) & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS_REOPEN)) != 0; +} ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t cmd0, ...) { @@ -63,3 +67,8 @@ zip_source_make_command_bitmap(zip_source_cmd_t cmd0, ...) { return bitmap; } + + +ZIP_EXTERN int zip_source_is_seekable(zip_source_t *src) { + return ZIP_SOURCE_CHECK_SUPPORTED(zip_source_supports(src->src), ZIP_SOURCE_SEEK); +} diff --git a/core/deps/libzip/lib/zip_source_tell.c b/core/deps/libzip/lib/zip_source_tell.c index b17412be7..49057ce56 100644 --- a/core/deps/libzip/lib/zip_source_tell.c +++ b/core/deps/libzip/lib/zip_source_tell.c @@ -1,9 +1,9 @@ /* zip_source_tell.c -- report current offset - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_tell_write.c b/core/deps/libzip/lib/zip_source_tell_write.c index c09a79fcb..a5b0e5311 100644 --- a/core/deps/libzip/lib/zip_source_tell_write.c +++ b/core/deps/libzip/lib/zip_source_tell_write.c @@ -1,9 +1,9 @@ /* zip_source_tell_write.c -- report current offset for writing - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,6 +37,11 @@ ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *src) { + if (ZIP_SOURCE_IS_LAYERED(src)) { + zip_error_set(&src->error, ZIP_ER_OPNOTSUPP, 0); + return -1; + } + if (!ZIP_SOURCE_IS_OPEN_WRITING(src)) { zip_error_set(&src->error, ZIP_ER_INVAL, 0); return -1; diff --git a/core/deps/libzip/lib/zip_source_window.c b/core/deps/libzip/lib/zip_source_window.c index b63ba1df4..524e27c83 100644 --- a/core/deps/libzip/lib/zip_source_window.c +++ b/core/deps/libzip/lib/zip_source_window.c @@ -1,9 +1,9 @@ /* zip_source_window.c -- return part of lower source - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,6 +40,7 @@ struct window { zip_uint64_t start; /* where in file we start reading */ zip_uint64_t end; /* where in file we stop reading */ + bool end_valid; /* whether end is set, otherwise read until EOF */ /* if not NULL, read file data for this file */ zip_t *source_archive; @@ -48,6 +49,7 @@ struct window { zip_uint64_t offset; /* offset in src for next read */ zip_stat_t stat; + zip_uint64_t stat_invalid; zip_file_attributes_t attributes; zip_error_t error; zip_int64_t supports; @@ -57,20 +59,28 @@ struct window { static zip_int64_t window_read(zip_source_t *, void *, void *, zip_uint64_t, zip_source_cmd_t); -zip_source_t * -zip_source_window(zip_t *za, zip_source_t *src, zip_uint64_t start, zip_uint64_t len) { - return _zip_source_window_new(src, start, len, NULL, 0, NULL, 0, &za->error); +ZIP_EXTERN zip_source_t * +zip_source_window_create(zip_source_t *src, zip_uint64_t start, zip_int64_t len, zip_error_t *error) { + return _zip_source_window_new(src, start, len, NULL, 0, NULL, NULL, 0, false, error); } zip_source_t * -_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t length, zip_stat_t *st, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, zip_error_t *error) { +_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_int64_t length, zip_stat_t *st, zip_uint64_t st_invalid, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, bool take_ownership, zip_error_t *error) { + zip_source_t* window_source; struct window *ctx; - if (src == NULL || start + length < start || (source_archive == NULL && source_index != 0)) { + if (src == NULL || length < -1 || (source_archive == NULL && source_index != 0)) { zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } + + if (length >= 0) { + if (start + (zip_uint64_t)length < start) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + } if ((ctx = (struct window *)malloc(sizeof(*ctx))) == NULL) { zip_error_set(error, ZIP_ER_MEMORY, 0); @@ -78,10 +88,17 @@ _zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t lengt } ctx->start = start; - ctx->end = start + length; + if (length == -1) { + ctx->end_valid = false; + } + else { + ctx->end = start + (zip_uint64_t)length; + ctx->end_valid = true; + } zip_stat_init(&ctx->stat); + ctx->stat_invalid = st_invalid; if (attributes != NULL) { - memcpy(&ctx->attributes, attributes, sizeof(ctx->attributes)); + (void)memcpy_s(&ctx->attributes, sizeof(ctx->attributes), attributes, sizeof(ctx->attributes)); } else { zip_file_attributes_init(&ctx->attributes); @@ -89,7 +106,7 @@ _zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t lengt ctx->source_archive = source_archive; ctx->source_index = source_index; zip_error_init(&ctx->error); - ctx->supports = (zip_source_supports(src) & ZIP_SOURCE_SUPPORTS_SEEKABLE) | (zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, -1)); + ctx->supports = (zip_source_supports(src) & (ZIP_SOURCE_SUPPORTS_SEEKABLE | ZIP_SOURCE_SUPPORTS_REOPEN)) | (zip_source_make_command_bitmap(ZIP_SOURCE_GET_FILE_ATTRIBUTES, ZIP_SOURCE_SUPPORTS, ZIP_SOURCE_TELL, ZIP_SOURCE_FREE, -1)); ctx->needs_seek = (ctx->supports & ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK)) ? true : false; if (st) { @@ -98,8 +115,12 @@ _zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t lengt return NULL; } } - - return zip_source_layered_create(src, window_read, ctx, error); + + window_source = zip_source_layered_create(src, window_read, ctx, error); + if (window_source != NULL && !take_ownership) { + zip_source_keep(src); + } + return window_source; } @@ -149,7 +170,7 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou } if (ctx->end + offset < ctx->end) { /* zip archive data claims end of data past zip64 limits */ - zip_error_set(&ctx->error, ZIP_ER_INCONS, 0); + zip_error_set(&ctx->error, ZIP_ER_INCONS, MAKE_DETAIL_WITH_INDEX(ZIP_ER_DETAIL_CDIR_ENTRY_INVALID, ctx->source_index)); return -1; } ctx->start += offset; @@ -168,7 +189,7 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou for (n = 0; n < ctx->start; n += (zip_uint64_t)ret) { i = (ctx->start - n > BUFSIZE ? BUFSIZE : ctx->start - n); if ((ret = zip_source_read(src, b, i)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); byte_array_fini(b); return -1; } @@ -186,15 +207,17 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou return 0; case ZIP_SOURCE_READ: - if (len > ctx->end - ctx->offset) + if (ctx->end_valid && len > ctx->end - ctx->offset) { len = ctx->end - ctx->offset; + } - if (len == 0) + if (len == 0) { return 0; + } if (ctx->needs_seek) { if (zip_source_seek(src, (zip_int64_t)ctx->offset, SEEK_SET) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } } @@ -207,7 +230,7 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou ctx->offset += (zip_uint64_t)ret; if (ret == 0) { - if (ctx->offset < ctx->end) { + if (ctx->end_valid && ctx->offset < ctx->end) { zip_error_set(&ctx->error, ZIP_ER_EOF, 0); return -1; } @@ -215,12 +238,40 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou return ret; case ZIP_SOURCE_SEEK: { - zip_int64_t new_offset = zip_source_seek_compute_offset(ctx->offset - ctx->start, ctx->end - ctx->start, data, len, &ctx->error); + zip_int64_t new_offset; + + if (!ctx->end_valid) { + zip_source_args_seek_t *args = ZIP_SOURCE_GET_ARGS(zip_source_args_seek_t, data, len, &ctx->error); + + if (args == NULL) { + return -1; + } + if (args->whence == SEEK_END) { + if (zip_source_seek(src, args->offset, args->whence) < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + new_offset = zip_source_tell(src); + if (new_offset < 0) { + zip_error_set_from_source(&ctx->error, src); + return -1; + } + if ((zip_uint64_t)new_offset < ctx->start) { + zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); + (void)zip_source_seek(src, (zip_int64_t)ctx->offset, SEEK_SET); + return -1; + } + ctx->offset = (zip_uint64_t)new_offset; + return 0; + } + } + new_offset = zip_source_seek_compute_offset(ctx->offset - ctx->start, ctx->end - ctx->start, data, len, &ctx->error); + if (new_offset < 0) { return -1; } - + ctx->offset = (zip_uint64_t)new_offset + ctx->start; return 0; } @@ -233,6 +284,19 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou if (_zip_stat_merge(st, &ctx->stat, &ctx->error) < 0) { return -1; } + + if (!(ctx->stat.valid & ZIP_STAT_SIZE)) { + if (ctx->end_valid) { + st->valid |= ZIP_STAT_SIZE; + st->size = ctx->end - ctx->start; + } + else if (st->valid & ZIP_STAT_SIZE) { + st->size -= ctx->start; + } + } + + st->valid &= ~ctx->stat_invalid; + return 0; } @@ -242,7 +306,7 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou return -1; } - memcpy(data, &ctx->attributes, sizeof(ctx->attributes)); + (void)memcpy_s(data, sizeof(ctx->attributes), &ctx->attributes, sizeof(ctx->attributes)); return sizeof(ctx->attributes); case ZIP_SOURCE_SUPPORTS: @@ -252,8 +316,7 @@ window_read(zip_source_t *src, void *_ctx, void *data, zip_uint64_t len, zip_sou return (zip_int64_t)(ctx->offset - ctx->start); default: - zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, len, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_winzip_aes_decode.c b/core/deps/libzip/lib/zip_source_winzip_aes_decode.c index b2bb3cbb7..ee53fb419 100644 --- a/core/deps/libzip/lib/zip_source_winzip_aes_decode.c +++ b/core/deps/libzip/lib/zip_source_winzip_aes_decode.c @@ -1,9 +1,9 @@ /* zip_source_winzip_aes_decode.c -- Winzip AES decryption routines - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,6 +36,7 @@ #include #include "zipint.h" +#include "zip_crypto.h" struct winzip_aes { char *password; @@ -72,7 +73,7 @@ zip_source_winzip_aes_decode(zip_t *za, zip_source_t *src, zip_uint16_t encrypti } if (zip_source_stat(src, &st) != 0) { - _zip_error_set_from_source(&za->error, src); + zip_error_set_from_source(&za->error, src); return NULL; } @@ -107,7 +108,7 @@ decrypt_header(zip_source_t *src, struct winzip_aes *ctx) { headerlen = WINZIP_AES_PASSWORD_VERIFY_LENGTH + SALT_LENGTH(ctx->encryption_method); if ((n = zip_source_read(src, header, headerlen)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -131,9 +132,9 @@ decrypt_header(zip_source_t *src, struct winzip_aes *ctx) { static bool verify_hmac(zip_source_t *src, struct winzip_aes *ctx) { - unsigned char computed[SHA1_LENGTH], from_file[HMAC_LENGTH]; + unsigned char computed[ZIP_CRYPTO_SHA1_LENGTH], from_file[HMAC_LENGTH]; if (zip_source_read(src, from_file, HMAC_LENGTH) < HMAC_LENGTH) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return false; } @@ -181,7 +182,7 @@ winzip_aes_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zi } if ((n = zip_source_read(src, data, len)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } ctx->current_position += (zip_uint64_t)n; @@ -211,7 +212,7 @@ winzip_aes_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zi } case ZIP_SOURCE_SUPPORTS: - return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, -1); + return zip_source_make_command_bitmap(ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_CLOSE, ZIP_SOURCE_STAT, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_SUPPORTS_REOPEN, -1); case ZIP_SOURCE_ERROR: return zip_error_to_data(&ctx->error, data, len); @@ -221,8 +222,7 @@ winzip_aes_decrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t len, zi return 0; default: - zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, len, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_winzip_aes_encode.c b/core/deps/libzip/lib/zip_source_winzip_aes_encode.c index 19d5cf026..87e2865a0 100644 --- a/core/deps/libzip/lib/zip_source_winzip_aes_encode.c +++ b/core/deps/libzip/lib/zip_source_winzip_aes_encode.c @@ -1,9 +1,9 @@ /* zip_source_winzip_aes_encode.c -- Winzip AES encryption routines - Copyright (C) 2009-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -36,13 +36,13 @@ #include #include "zipint.h" - +#include "zip_crypto.h" struct winzip_aes { char *password; zip_uint16_t encryption_method; - zip_uint8_t data[ZIP_MAX(WINZIP_AES_MAX_HEADER_LENGTH, SHA1_LENGTH)]; + zip_uint8_t data[ZIP_MAX(WINZIP_AES_MAX_HEADER_LENGTH, ZIP_CRYPTO_SHA1_LENGTH)]; zip_buffer_t *buffer; zip_winzip_aes_t *aes_ctx; @@ -139,7 +139,7 @@ winzip_aes_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, } if ((ret = zip_source_read(src, data, length)) < 0) { - _zip_error_set_from_source(&ctx->error, src); + zip_error_set_from_source(&ctx->error, src); return -1; } @@ -207,8 +207,7 @@ winzip_aes_encrypt(zip_source_t *src, void *ud, void *data, zip_uint64_t length, return 0; default: - zip_error_set(&ctx->error, ZIP_ER_INVAL, 0); - return -1; + return zip_source_pass_to_lower_layer(src, data, length, cmd); } } diff --git a/core/deps/libzip/lib/zip_source_write.c b/core/deps/libzip/lib/zip_source_write.c index 33bf9c944..24dde9b24 100644 --- a/core/deps/libzip/lib/zip_source_write.c +++ b/core/deps/libzip/lib/zip_source_write.c @@ -1,9 +1,9 @@ /* zip_source_write.c -- start a new file for writing - Copyright (C) 2014-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2014-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_source_zip.c b/core/deps/libzip/lib/zip_source_zip.c index cb62540d5..faabf0d29 100644 --- a/core/deps/libzip/lib/zip_source_zip.c +++ b/core/deps/libzip/lib/zip_source_zip.c @@ -1,9 +1,9 @@ /* zip_source_zip.c -- create data source from zip file - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -34,23 +34,30 @@ #include +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" - -ZIP_EXTERN zip_source_t * -zip_source_zip(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len) { +ZIP_EXTERN zip_source_t *zip_source_zip_create(zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len, zip_error_t *error) { if (len < -1) { - zip_error_set(&za->error, ZIP_ER_INVAL, 0); + zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } - - if (len == -1) - len = 0; - - if (start == 0 && len == 0) + + if (len == 0) { + len = -1; + } + + if (start == 0 && len == -1) { flags |= ZIP_FL_COMPRESSED; - else + } + else { flags &= ~ZIP_FL_COMPRESSED; + } + + return zip_source_zip_file_create(srcza, srcidx, flags, start, len, NULL, error); +} + - return _zip_source_zip_new(za, srcza, srcidx, flags, start, (zip_uint64_t)len, NULL); +ZIP_EXTERN zip_source_t *zip_source_zip(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len) { + return zip_source_zip_create(srcza, srcidx, flags, start, len, &za->error); } diff --git a/core/deps/libzip/lib/zip_source_zip_new.c b/core/deps/libzip/lib/zip_source_zip_new.c index ffb2bdf4b..ecccdd68f 100644 --- a/core/deps/libzip/lib/zip_source_zip_new.c +++ b/core/deps/libzip/lib/zip_source_zip_new.c @@ -1,9 +1,9 @@ /* zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -38,96 +38,210 @@ static void _zip_file_attributes_from_dirent(zip_file_attributes_t *attributes, zip_dirent_t *de); -zip_source_t * -_zip_source_zip_new(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_uint64_t len, const char *password) { +ZIP_EXTERN zip_source_t *zip_source_zip_file(zip_t* za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len, const char *password) { + return zip_source_zip_file_create(srcza, srcidx, flags, start, len, password, &za->error); +} + + +ZIP_EXTERN zip_source_t *zip_source_zip_file_create(zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_int64_t len, const char *password, zip_error_t *error) { + /* TODO: We need to make sure that the returned source is invalidated when srcza is closed. */ zip_source_t *src, *s2; zip_stat_t st; zip_file_attributes_t attributes; zip_dirent_t *de; - bool partial_data, needs_crc, needs_decrypt, needs_decompress; + bool partial_data, needs_crc, encrypted, needs_decrypt, compressed, needs_decompress, changed_data, have_size, have_comp_size; + zip_flags_t stat_flags; + zip_int64_t data_len; + bool take_ownership = false; + bool empty_data = false; - if (za == NULL) { + if (srcza == NULL || srcidx >= srcza->nentry || len < -1) { + zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } - if (srcza == NULL || srcidx >= srcza->nentry) { - zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; + if (flags & ZIP_FL_ENCRYPTED) { + flags |= ZIP_FL_COMPRESSED; } - if ((flags & ZIP_FL_UNCHANGED) == 0 && (ZIP_ENTRY_DATA_CHANGED(srcza->entry + srcidx) || srcza->entry[srcidx].deleted)) { - zip_error_set(&za->error, ZIP_ER_CHANGED, 0); - return NULL; + changed_data = false; + if ((flags & ZIP_FL_UNCHANGED) == 0) { + zip_entry_t *entry = srcza->entry + srcidx; + if (ZIP_ENTRY_DATA_CHANGED(entry)) { + if ((flags & ZIP_FL_COMPRESSED) || !zip_source_supports_reopen(entry->source)) { + zip_error_set(error, ZIP_ER_CHANGED, 0); + return NULL; + } + + changed_data = true; + } + else if (entry->deleted) { + zip_error_set(error, ZIP_ER_CHANGED, 0); + return NULL; + } } - if (zip_stat_index(srcza, srcidx, flags | ZIP_FL_UNCHANGED, &st) < 0) { - zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); - return NULL; + stat_flags = flags; + if (!changed_data) { + stat_flags |= ZIP_FL_UNCHANGED; } - if (flags & ZIP_FL_ENCRYPTED) { - flags |= ZIP_FL_COMPRESSED; + if (zip_stat_index(srcza, srcidx, stat_flags, &st) < 0) { + zip_error_set(error, ZIP_ER_INTERNAL, 0); + return NULL; } - if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) { - zip_error_set(&za->error, ZIP_ER_INVAL, 0); + if ((start > 0 || len >= 0) && (flags & ZIP_FL_COMPRESSED)) { + zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } + have_size = (st.valid & ZIP_STAT_SIZE) != 0; /* overflow or past end of file */ - if ((start > 0 || len > 0) && (start + len < start || start + len > st.size)) { - zip_error_set(&za->error, ZIP_ER_INVAL, 0); + if (len >= 0 && ((start > 0 && start + len < start) || (have_size && start + len > st.size))) { + zip_error_set(error, ZIP_ER_INVAL, 0); return NULL; } - if (len == 0) { - len = st.size - start; + if (len == -1) { + if (have_size) { + if (st.size - start > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + data_len = (zip_int64_t)(st.size - start); + } + else { + data_len = -1; + } + } + else { + data_len = len; } - partial_data = len < st.size; - needs_decrypt = ((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE); - needs_decompress = ((flags & ZIP_FL_COMPRESSED) == 0) && (st.comp_method != ZIP_CM_STORE); + if (have_size) { + partial_data = (zip_uint64_t)(data_len) < st.size; + } + else { + partial_data = true; + } + encrypted = (st.valid & ZIP_STAT_ENCRYPTION_METHOD) && (st.encryption_method != ZIP_EM_NONE); + needs_decrypt = ((flags & ZIP_FL_ENCRYPTED) == 0) && encrypted; + compressed = (st.valid & ZIP_STAT_COMP_METHOD) && (st.comp_method != ZIP_CM_STORE); + needs_decompress = ((flags & ZIP_FL_COMPRESSED) == 0) && compressed; /* when reading the whole file, check for CRC errors */ - needs_crc = ((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) && !partial_data; + needs_crc = ((flags & ZIP_FL_COMPRESSED) == 0 || !compressed) && !partial_data && (st.valid & ZIP_STAT_CRC) != 0; if (needs_decrypt) { if (password == NULL) { - password = za->default_password; + password = srcza->default_password; } if (password == NULL) { - zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0); + zip_error_set(error, ZIP_ER_NOPASSWD, 0); return NULL; } } - if ((de = _zip_get_dirent(srcza, srcidx, flags, &za->error)) == NULL) { + if ((de = _zip_get_dirent(srcza, srcidx, flags, error)) == NULL) { return NULL; } _zip_file_attributes_from_dirent(&attributes, de); - if (st.comp_size == 0) { - return zip_source_buffer_with_attributes(za, NULL, 0, 0, &attributes); + have_comp_size = (st.valid & ZIP_STAT_COMP_SIZE) != 0; + if (needs_decrypt || needs_decompress) { + empty_data = (have_comp_size && st.comp_size == 0); + } + else { + empty_data = (have_size && st.size == 0); + } + if (empty_data) { + src = zip_source_buffer_with_attributes_create(NULL, 0, 0, &attributes, error); + } + else { + src = NULL; } + + /* If we created source buffer above, we want the window source to take ownership of it. */ + take_ownership = src != NULL; + /* if we created a buffer source above, then treat it as if + reading the changed data - that way we don't need add another + special case to the code below that wraps it in the window + source */ + changed_data = changed_data || (src != NULL); + if (partial_data && !needs_decrypt && !needs_decompress) { struct zip_stat st2; + zip_t *source_archive; + zip_uint64_t source_index; + + if (changed_data) { + if (src == NULL) { + src = srcza->entry[srcidx].source; + } + source_archive = NULL; + source_index = 0; + } + else { + src = srcza->src; + source_archive = srcza; + source_index = srcidx; + } - st2.size = len; - st2.comp_size = len; st2.comp_method = ZIP_CM_STORE; - st2.mtime = st.mtime; - st2.valid = ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_MTIME; + st2.valid = ZIP_STAT_COMP_METHOD; + if (data_len >= 0) { + st2.size = (zip_uint64_t)data_len; + st2.comp_size = (zip_uint64_t)data_len; + st2.valid |= ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE; + } + if (st.valid & ZIP_STAT_MTIME) { + st2.mtime = st.mtime; + st2.valid |= ZIP_STAT_MTIME; + } - if ((src = _zip_source_window_new(srcza->src, start, len, &st2, &attributes, srcza, srcidx, &za->error)) == NULL) { + if ((src = _zip_source_window_new(src, start, data_len, &st2, ZIP_STAT_NAME, &attributes, source_archive, source_index, take_ownership, error)) == NULL) { + return NULL; + } + } + /* here we restrict src to file data, so no point in doing it for + source that already represents only the file data */ + else if (!changed_data) { + /* this branch is executed only for archive sources; we know + that stat data come from the archive too, so it's safe to + assume that st has a comp_size specified */ + if (st.comp_size > ZIP_INT64_MAX) { + zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + /* despite the fact that we want the whole data file, we still + wrap the source into a window source to add st and + attributes and to have a source that positions the read + offset properly before each read for multiple zip_file_t + referring to the same underlying source */ + if ((src = _zip_source_window_new(srcza->src, 0, (zip_int64_t)st.comp_size, &st, ZIP_STAT_NAME, &attributes, srcza, srcidx, take_ownership, error)) == NULL) { return NULL; } } else { - if ((src = _zip_source_window_new(srcza->src, 0, st.comp_size, &st, &attributes, srcza, srcidx, &za->error)) == NULL) { + /* this branch gets executed when reading the whole changed + data file or when "reading" from a zero-sized source buffer + that we created above */ + if (src == NULL) { + src = srcza->entry[srcidx].source; + } + /* despite the fact that we want the whole data file, we still + wrap the source into a window source to add st and + attributes and to have a source that positions the read + offset properly before each read for multiple zip_file_t + referring to the same underlying source */ + if ((src = _zip_source_window_new(src, 0, data_len, &st, ZIP_STAT_NAME, &attributes, NULL, 0, take_ownership, error)) == NULL) { return NULL; } } + /* In all cases, src is a window source and therefore is owned by this function. */ + if (_zip_source_set_source_archive(src, srcza) < 0) { zip_source_free(src); return NULL; @@ -139,38 +253,45 @@ _zip_source_zip_new(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t fl zip_encryption_implementation enc_impl; if ((enc_impl = _zip_get_encryption_implementation(st.encryption_method, ZIP_CODEC_DECODE)) == NULL) { - zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + zip_error_set(error, ZIP_ER_ENCRNOTSUPP, 0); return NULL; } - s2 = enc_impl(za, src, st.encryption_method, 0, password); - zip_source_free(src); + s2 = enc_impl(srcza, src, st.encryption_method, 0, password); if (s2 == NULL) { + zip_source_free(src); return NULL; } + src = s2; } if (needs_decompress) { - s2 = zip_source_decompress(za, src, st.comp_method); - zip_source_free(src); + s2 = zip_source_decompress(srcza, src, st.comp_method); if (s2 == NULL) { + zip_source_free(src); return NULL; } src = s2; } if (needs_crc) { - s2 = zip_source_crc(za, src, 1); - zip_source_free(src); + s2 = zip_source_crc_create(src, 1, error); if (s2 == NULL) { + zip_source_free(src); return NULL; } src = s2; } if (partial_data && (needs_decrypt || needs_decompress)) { - s2 = zip_source_window(za, src, start, len); - zip_source_free(src); + zip_stat_t st2; + zip_stat_init(&st2); + if (data_len >= 0) { + st2.valid = ZIP_STAT_SIZE; + st2.size = (zip_uint64_t)data_len; + } + s2 = _zip_source_window_new(src, start, data_len, &st2, ZIP_STAT_NAME, NULL, NULL, 0, true, error); if (s2 == NULL) { + zip_source_free(src); return NULL; } src = s2; diff --git a/core/deps/libzip/lib/zip_stat.c b/core/deps/libzip/lib/zip_stat.c index c328dcfb4..51d8026dd 100644 --- a/core/deps/libzip/lib/zip_stat.c +++ b/core/deps/libzip/lib/zip_stat.c @@ -1,9 +1,9 @@ /* zip_stat.c -- get information about file by name - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_stat_index.c b/core/deps/libzip/lib/zip_stat_index.c index 62dc0455e..da33c09eb 100644 --- a/core/deps/libzip/lib/zip_stat_index.c +++ b/core/deps/libzip/lib/zip_stat_index.c @@ -3,7 +3,7 @@ Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,22 +39,43 @@ ZIP_EXTERN int zip_stat_index(zip_t *za, zip_uint64_t index, zip_flags_t flags, zip_stat_t *st) { const char *name; zip_dirent_t *de; + zip_entry_t *entry; - if ((de = _zip_get_dirent(za, index, flags, NULL)) == NULL) + if ((de = _zip_get_dirent(za, index, flags, NULL)) == NULL) { return -1; + } - if ((name = zip_get_name(za, index, flags)) == NULL) + if ((name = zip_get_name(za, index, flags)) == NULL) { return -1; + } + entry = za->entry + index; if ((flags & ZIP_FL_UNCHANGED) == 0 && ZIP_ENTRY_DATA_CHANGED(za->entry + index)) { - zip_entry_t *entry = za->entry + index; if (zip_source_stat(entry->source, st) < 0) { zip_error_set(&za->error, ZIP_ER_CHANGED, 0); return -1; } + if (ZIP_CM_IS_DEFAULT(de->comp_method)) { + if (!(st->valid & ZIP_STAT_COMP_METHOD) || st->comp_method == ZIP_CM_STORE) { + st->valid &= ~(ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD); + } + } + else { + if ((st->valid & ZIP_STAT_COMP_METHOD) && st->comp_method != de->comp_method) { + st->valid &= ~ZIP_STAT_COMP_SIZE; + } + st->valid |= ZIP_STAT_COMP_METHOD; + st->comp_method = de->comp_method; + } + + if (((st->valid & (ZIP_STAT_COMP_METHOD|ZIP_STAT_SIZE)) == (ZIP_STAT_COMP_METHOD|ZIP_STAT_SIZE)) && st->comp_method == ZIP_CM_STORE) { + st->valid |= ZIP_STAT_COMP_SIZE; + st->comp_size = st->size; + } + if (entry->changes != NULL && entry->changes->changed & ZIP_DIRENT_LAST_MOD) { st->mtime = de->last_mod; st->valid |= ZIP_STAT_MTIME; @@ -70,6 +91,16 @@ zip_stat_index(zip_t *za, zip_uint64_t index, zip_flags_t flags, zip_stat_t *st) st->comp_method = (zip_uint16_t)de->comp_method; st->encryption_method = de->encryption_method; st->valid = (de->crc_valid ? ZIP_STAT_CRC : 0) | ZIP_STAT_SIZE | ZIP_STAT_MTIME | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_ENCRYPTION_METHOD; + if (entry->changes != NULL && entry->changes->changed & ZIP_DIRENT_COMP_METHOD) { + st->valid &= ~ZIP_STAT_COMP_SIZE; + } + } + + if ((za->ch_flags & ZIP_AFL_WANT_TORRENTZIP) && (flags & ZIP_FL_UNCHANGED) == 0) { + st->comp_method = ZIP_CM_DEFLATE; + st->mtime = _zip_d2u_time(0xbc00, 0x2198); + st->valid |= ZIP_STAT_MTIME | ZIP_STAT_COMP_METHOD; + st->valid &= ~ZIP_STAT_COMP_SIZE; } st->index = index; diff --git a/core/deps/libzip/lib/zip_stat_init.c b/core/deps/libzip/lib/zip_stat_init.c index 0cf51efad..9c6088a79 100644 --- a/core/deps/libzip/lib/zip_stat_init.c +++ b/core/deps/libzip/lib/zip_stat_init.c @@ -1,9 +1,9 @@ /* zip_stat_init.c -- initialize struct zip_stat. - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_strerror.c b/core/deps/libzip/lib/zip_strerror.c index 6adec16cd..7d8279318 100644 --- a/core/deps/libzip/lib/zip_strerror.c +++ b/core/deps/libzip/lib/zip_strerror.c @@ -1,9 +1,9 @@ /* zip_sterror.c -- get string representation of zip error - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_string.c b/core/deps/libzip/lib/zip_string.c index 2c6f42826..1c964491c 100644 --- a/core/deps/libzip/lib/zip_string.c +++ b/core/deps/libzip/lib/zip_string.c @@ -1,9 +1,9 @@ /* zip_string.c -- string handling (with encoding) - Copyright (C) 2012-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2012-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -150,7 +150,7 @@ _zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, return NULL; } - memcpy(s->raw, raw, length); + (void)memcpy_s(s->raw, length + 1, raw, length); s->raw[length] = '\0'; s->length = length; s->encoding = ZIP_ENCODING_UNKNOWN; diff --git a/core/deps/libzip/lib/zip_unchange.c b/core/deps/libzip/lib/zip_unchange.c index 17e250099..d69a3dfe1 100644 --- a/core/deps/libzip/lib/zip_unchange.c +++ b/core/deps/libzip/lib/zip_unchange.c @@ -1,9 +1,9 @@ /* zip_unchange.c -- undo changes to file in zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -46,14 +46,18 @@ zip_unchange(zip_t *za, zip_uint64_t idx) { int _zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates) { zip_int64_t i; - const char *orig_name, *changed_name; + bool renamed; if (idx >= za->nentry) { zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) { + renamed = za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME); + if (!allow_duplicates && (renamed || za->entry[idx].deleted)) { + const char *orig_name = NULL; + const char *changed_name = NULL; + if (za->entry[idx].orig != NULL) { if ((orig_name = _zip_get_name(za, idx, ZIP_FL_UNCHANGED, &za->error)) == NULL) { return -1; @@ -65,12 +69,11 @@ _zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates) { return -1; } } - else { - orig_name = NULL; - } - if ((changed_name = _zip_get_name(za, idx, 0, &za->error)) == NULL) { - return -1; + if (renamed) { + if ((changed_name = _zip_get_name(za, idx, 0, &za->error)) == NULL) { + return -1; + } } if (orig_name) { @@ -78,9 +81,11 @@ _zip_unchange(zip_t *za, zip_uint64_t idx, int allow_duplicates) { return -1; } } - if (_zip_hash_delete(za->names, (const zip_uint8_t *)changed_name, &za->error) == false) { - _zip_hash_delete(za->names, (const zip_uint8_t *)orig_name, NULL); - return -1; + if (changed_name) { + if (_zip_hash_delete(za->names, (const zip_uint8_t *)changed_name, &za->error) == false) { + _zip_hash_delete(za->names, (const zip_uint8_t *)orig_name, NULL); + return -1; + } } } diff --git a/core/deps/libzip/lib/zip_unchange_all.c b/core/deps/libzip/lib/zip_unchange_all.c index b8bfd70e9..34f3702e0 100644 --- a/core/deps/libzip/lib/zip_unchange_all.c +++ b/core/deps/libzip/lib/zip_unchange_all.c @@ -1,9 +1,9 @@ /* zip_unchange.c -- undo changes to all files in zip archive - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_unchange_archive.c b/core/deps/libzip/lib/zip_unchange_archive.c index ebf2bd58a..56a8e31f6 100644 --- a/core/deps/libzip/lib/zip_unchange_archive.c +++ b/core/deps/libzip/lib/zip_unchange_archive.c @@ -1,9 +1,9 @@ /* zip_unchange_archive.c -- undo global changes to ZIP archive - Copyright (C) 2006-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_unchange_data.c b/core/deps/libzip/lib/zip_unchange_data.c index 2a393add8..6bdecd187 100644 --- a/core/deps/libzip/lib/zip_unchange_data.c +++ b/core/deps/libzip/lib/zip_unchange_data.c @@ -1,9 +1,9 @@ /* zip_unchange_data.c -- undo helper function - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_utf-8.c b/core/deps/libzip/lib/zip_utf-8.c index 51a47221e..678912f6b 100644 --- a/core/deps/libzip/lib/zip_utf-8.c +++ b/core/deps/libzip/lib/zip_utf-8.c @@ -1,9 +1,9 @@ /* zip_utf-8.c -- UTF-8 support functions for libzip - Copyright (C) 2011-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2011-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/lib/zip_winzip_aes.c b/core/deps/libzip/lib/zip_winzip_aes.c index 75b279a96..ce269036c 100644 --- a/core/deps/libzip/lib/zip_winzip_aes.c +++ b/core/deps/libzip/lib/zip_winzip_aes.c @@ -1,9 +1,9 @@ /* zip_winzip_aes.c -- Winzip AES de/encryption backend routines - Copyright (C) 2017-2020 Dieter Baron and Thomas Klausner + Copyright (C) 2017-2021 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -125,7 +125,7 @@ _zip_winzip_aes_new(const zip_uint8_t *password, zip_uint64_t password_length, c } if (password_verify) { - memcpy(password_verify, buffer + (2 * key_size / 8), WINZIP_AES_PASSWORD_VERIFY_LENGTH); + (void)memcpy_s(password_verify, WINZIP_AES_PASSWORD_VERIFY_LENGTH, buffer + (2 * key_size / 8), WINZIP_AES_PASSWORD_VERIFY_LENGTH); } return ctx; diff --git a/core/deps/libzip/lib/zipint.h b/core/deps/libzip/lib/zipint.h index 6036d2e42..4887b6c5c 100644 --- a/core/deps/libzip/lib/zipint.h +++ b/core/deps/libzip/lib/zipint.h @@ -3,10 +3,10 @@ /* zipint.h -- internal declarations. - Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2022 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -42,7 +42,9 @@ #include #endif -#ifndef _ZIP_COMPILING_DEPRECATED +#ifdef _ZIP_COMPILING_DEPRECATED +#define ZIP_DEPRECATED(x) +#else #define ZIP_DISABLE_DEPRECATED #endif @@ -67,6 +69,12 @@ #define EF_WINZIP_AES_SIZE 7 #define MAX_DATA_DESCRIPTOR_LENGTH 24 +#define TORRENTZIP_SIGNATURE "TORRENTZIPPED-" +#define TORRENTZIP_SIGNATURE_LENGTH 14 +#define TORRENTZIP_CRC_LENGTH 8 +#define TORRENTZIP_MEM_LEVEL 8 +#define TORRENTZIP_COMPRESSION_FLAGS ZIP_UINT16_MAX + #define ZIP_CRYPTO_PKWARE_HEADERLEN 12 #define ZIP_CM_REPLACED_DEFAULT (-2) @@ -76,7 +84,6 @@ #define WINZIP_AES_MAX_HEADER_LENGTH (16 + WINZIP_AES_PASSWORD_VERIFY_LENGTH) #define AES_BLOCK_SIZE 16 #define HMAC_LENGTH 10 -#define SHA1_LENGTH 20 #define SALT_LENGTH(method) ((method) == ZIP_EM_AES_128 ? 8 : ((method) == ZIP_EM_AES_192 ? 12 : 16)) #define ZIP_CM_IS_DEFAULT(x) ((x) == ZIP_CM_DEFAULT || (x) == ZIP_CM_REPLACED_DEFAULT) @@ -122,11 +129,11 @@ enum zip_compression_status { typedef enum zip_compression_status zip_compression_status_t; struct zip_compression_algorithm { - /* Return maxiumum compressed size for uncompressed data of given size. */ + /* Return maximum compressed size for uncompressed data of given size. */ zip_uint64_t (*maximum_compressed_size)(zip_uint64_t uncompressed_size); /* called once to create new context */ - void *(*allocate)(zip_uint16_t method, int compression_flags, zip_error_t *error); + void *(*allocate)(zip_uint16_t method, zip_uint32_t compression_flags, zip_error_t *error); /* called once to free context */ void (*deallocate)(void *ctx); @@ -170,25 +177,65 @@ const zip_uint8_t *zip_get_extra_field_by_id(zip_t *, int, int, zip_uint16_t, in user-supplied compression/encryption implementation is finished. Thus we will keep it private for now. */ -typedef zip_int64_t (*zip_source_layered_callback)(zip_source_t *, void *, void *, zip_uint64_t, enum zip_source_cmd); -zip_source_t *zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t cm, int compression_flags); -zip_source_t *zip_source_crc(zip_t *, zip_source_t *, int); +zip_source_t *zip_source_compress(zip_t *za, zip_source_t *src, zip_int32_t cm, zip_uint32_t compression_flags); +zip_source_t *zip_source_crc_create(zip_source_t *, int, zip_error_t *error); zip_source_t *zip_source_decompress(zip_t *za, zip_source_t *src, zip_int32_t cm); -zip_source_t *zip_source_layered(zip_t *, zip_source_t *, zip_source_layered_callback, void *); -zip_source_t *zip_source_layered_create(zip_source_t *src, zip_source_layered_callback cb, void *ud, zip_error_t *error); zip_source_t *zip_source_pkware_decode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); zip_source_t *zip_source_pkware_encode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); int zip_source_remove(zip_source_t *); zip_int64_t zip_source_supports(zip_source_t *src); -zip_source_t *zip_source_window(zip_t *, zip_source_t *, zip_uint64_t, zip_uint64_t); +bool zip_source_supports_reopen(zip_source_t *src); zip_source_t *zip_source_winzip_aes_decode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); zip_source_t *zip_source_winzip_aes_encode(zip_t *, zip_source_t *, zip_uint16_t, int, const char *); zip_source_t *zip_source_buffer_with_attributes(zip_t *za, const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes); +zip_source_t *zip_source_buffer_with_attributes_create(const void *data, zip_uint64_t len, int freep, zip_file_attributes_t *attributes, zip_error_t *error); /* error source for layered sources */ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; +#define ZIP_DETAIL_ET_GLOBAL 0 +#define ZIP_DETAIL_ET_ENTRY 1 + +struct _zip_err_info { + int type; + const char *description; +}; + +extern const struct _zip_err_info _zip_err_str[]; +extern const int _zip_err_str_count; +extern const struct _zip_err_info _zip_err_details[]; +extern const int _zip_err_details_count; + +/* macros for libzip-internal errors */ +#define MAX_DETAIL_INDEX 0x7fffff +#define MAKE_DETAIL_WITH_INDEX(error, index) ((((index) > MAX_DETAIL_INDEX) ? MAX_DETAIL_INDEX : (int)(index)) << 8 | (error)) +#define GET_INDEX_FROM_DETAIL(error) (((error) >> 8) & MAX_DETAIL_INDEX) +#define GET_ERROR_FROM_DETAIL(error) ((error) & 0xff) +#define ADD_INDEX_TO_DETAIL(error, index) MAKE_DETAIL_WITH_INDEX(GET_ERROR_FROM_DETAIL(error), (index)) + +/* error code for libzip-internal errors */ +#define ZIP_ER_DETAIL_NO_DETAIL 0 /* G no detail */ +#define ZIP_ER_DETAIL_CDIR_OVERLAPS_EOCD 1 /* G central directory overlaps EOCD, or there is space between them */ +#define ZIP_ER_DETAIL_COMMENT_LENGTH_INVALID 2 /* G archive comment length incorrect */ +#define ZIP_ER_DETAIL_CDIR_LENGTH_INVALID 3 /* G central directory length invalid */ +#define ZIP_ER_DETAIL_CDIR_ENTRY_INVALID 4 /* E central header invalid */ +#define ZIP_ER_DETAIL_CDIR_WRONG_ENTRIES_COUNT 5 /* G central directory count of entries is incorrect */ +#define ZIP_ER_DETAIL_ENTRY_HEADER_MISMATCH 6 /* E local and central headers do not match */ +#define ZIP_ER_DETAIL_EOCD_LENGTH_INVALID 7 /* G wrong EOCD length */ +#define ZIP_ER_DETAIL_EOCD64_OVERLAPS_EOCD 8 /* G EOCD64 overlaps EOCD, or there is space between them */ +#define ZIP_ER_DETAIL_EOCD64_WRONG_MAGIC 9 /* G EOCD64 magic incorrect */ +#define ZIP_ER_DETAIL_EOCD64_MISMATCH 10 /* G EOCD64 and EOCD do not match */ +#define ZIP_ER_DETAIL_CDIR_INVALID 11 /* G invalid value in central directory */ +#define ZIP_ER_DETAIL_VARIABLE_SIZE_OVERFLOW 12 /* E variable size fields overflow header */ +#define ZIP_ER_DETAIL_INVALID_UTF8_IN_FILENAME 13 /* E invalid UTF-8 in filename */ +#define ZIP_ER_DETAIL_INVALID_UTF8_IN_COMMENT 13 /* E invalid UTF-8 in comment */ +#define ZIP_ER_DETAIL_INVALID_ZIP64_EF 14 /* E invalid Zip64 extra field */ +#define ZIP_ER_DETAIL_INVALID_WINZIPAES_EF 14 /* E invalid WinZip AES extra field */ +#define ZIP_ER_DETAIL_EF_TRAILING_GARBAGE 15 /* E garbage at end of extra fields */ +#define ZIP_ER_DETAIL_INVALID_EF_LENGTH 16 /* E extra field length is invalid */ +#define ZIP_ER_DETAIL_INVALID_FILE_LENGTH 17 /* E file length in header doesn't match actual file length */ + /* directory entry: general purpose bit flags */ #define ZIP_GPBF_ENCRYPTED 0x0001u /* is encrypted */ @@ -258,14 +305,14 @@ struct zip { zip_hash_t *names; /* hash table for name lookup */ zip_progress_t *progress; /* progress callback for zip_close() */ + + zip_uint32_t* write_crc; /* have _zip_write() compute CRC */ }; /* file in zip archive, part of API */ struct zip_file { - zip_t *za; /* zip archive containing this file */ zip_error_t error; /* error information */ - bool eof; zip_source_t *src; /* data source */ }; @@ -304,7 +351,7 @@ struct zip_dirent { zip_uint32_t ext_attrib; /* (c) external file attributes */ zip_uint64_t offset; /* (c) offset of local header */ - zip_uint16_t compression_level; /* level of compression to use (never valid in orig) */ + zip_uint32_t compression_level; /* level of compression to use (never valid in orig) */ zip_uint16_t encryption_method; /* encryption method, computed from other fields */ char *password; /* file specific encryption password */ }; @@ -414,7 +461,7 @@ struct zip_buffer { struct zip_filelist { zip_uint64_t idx; - /* TODO const char *name; */ + const char *name; }; typedef struct zip_filelist zip_filelist_t; @@ -427,10 +474,6 @@ struct _zip_pkware_keys { }; typedef struct _zip_pkware_keys zip_pkware_keys_t; -extern const char *const _zip_err_str[]; -extern const int _zip_nerr_str; -extern const int _zip_err_type[]; - #define ZIP_MAX(a, b) ((a) > (b) ? (a) : (b)) #define ZIP_MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -439,6 +482,8 @@ extern const int _zip_err_type[]; #define ZIP_ENTRY_HAS_CHANGES(e) (ZIP_ENTRY_DATA_CHANGED(e) || (e)->deleted || ZIP_ENTRY_CHANGED((e), ZIP_DIRENT_ALL)) #define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY) +#define ZIP_IS_TORRENTZIP(za) ((za)->flags & ZIP_AFL_IS_TORRENTZIP) +#define ZIP_WANT_TORRENTZIP(za) ((za)->ch_flags & ZIP_AFL_WANT_TORRENTZIP) #ifdef HAVE_EXPLICIT_MEMSET @@ -493,8 +538,11 @@ void _zip_dirent_finalize(zip_dirent_t *); void _zip_dirent_init(zip_dirent_t *); bool _zip_dirent_needs_zip64(const zip_dirent_t *, zip_flags_t); zip_dirent_t *_zip_dirent_new(void); +bool zip_dirent_process_ef_zip64(zip_dirent_t * zde, const zip_uint8_t * ef, zip_uint64_t got_len, bool local, zip_error_t * error); zip_int64_t _zip_dirent_read(zip_dirent_t *zde, zip_source_t *src, zip_buffer_t *buffer, bool local, zip_error_t *error); void _zip_dirent_set_version_needed(zip_dirent_t *de, bool force_zip64); +void zip_dirent_torrentzip_normalize(zip_dirent_t *de); + zip_int32_t _zip_dirent_size(zip_source_t *src, zip_uint16_t, zip_error_t *); int _zip_dirent_write(zip_t *za, zip_dirent_t *dirent, zip_flags_t flags); @@ -516,7 +564,6 @@ void _zip_error_clear(zip_error_t *); void _zip_error_get(const zip_error_t *, int *, int *); void _zip_error_copy(zip_error_t *dst, const zip_error_t *src); -void _zip_error_set_from_source(zip_error_t *, zip_source_t *); const zip_uint8_t *_zip_extract_extra_field_by_id(zip_error_t *, zip_uint16_t, int, const zip_uint8_t *, zip_uint16_t, zip_uint16_t *); @@ -538,7 +585,7 @@ zip_hash_t *_zip_hash_new(zip_error_t *error); bool _zip_hash_reserve_capacity(zip_hash_t *hash, zip_uint64_t capacity, zip_error_t *error); bool _zip_hash_revert(zip_hash_t *hash, zip_error_t *error); -int _zip_mkstempm(char *path, int mode); +int _zip_mkstempm(char *path, int mode, bool create_file); zip_t *_zip_open(zip_source_t *, unsigned int, zip_error_t *); @@ -569,16 +616,15 @@ bool _zip_source_had_error(zip_source_t *); void _zip_source_invalidate(zip_source_t *src); zip_source_t *_zip_source_new(zip_error_t *error); int _zip_source_set_source_archive(zip_source_t *, zip_t *); -zip_source_t *_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_uint64_t length, zip_stat_t *st, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, zip_error_t *error); -zip_source_t *_zip_source_zip_new(zip_t *, zip_t *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_uint64_t, const char *); +zip_source_t *_zip_source_window_new(zip_source_t *src, zip_uint64_t start, zip_int64_t length, zip_stat_t *st, zip_uint64_t st_invalid, zip_file_attributes_t *attributes, zip_t *source_archive, zip_uint64_t source_index, bool take_ownership, zip_error_t *error); int _zip_stat_merge(zip_stat_t *dst, const zip_stat_t *src, zip_error_t *error); -int _zip_string_equal(const zip_string_t *, const zip_string_t *); -void _zip_string_free(zip_string_t *); -zip_uint32_t _zip_string_crc32(const zip_string_t *); -const zip_uint8_t *_zip_string_get(zip_string_t *, zip_uint32_t *, zip_flags_t, zip_error_t *); -zip_uint16_t _zip_string_length(const zip_string_t *); -zip_string_t *_zip_string_new(const zip_uint8_t *, zip_uint16_t, zip_flags_t, zip_error_t *); +int _zip_string_equal(const zip_string_t *a, const zip_string_t *b); +void _zip_string_free(zip_string_t *string); +zip_uint32_t _zip_string_crc32(const zip_string_t *string); +const zip_uint8_t *_zip_string_get(zip_string_t *string, zip_uint32_t *lenp, zip_flags_t flags, zip_error_t *error); +zip_uint16_t _zip_string_length(const zip_string_t *string); +zip_string_t *_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, zip_error_t *error); int _zip_string_write(zip_t *za, const zip_string_t *string); bool _zip_winzip_aes_decrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length); bool _zip_winzip_aes_encrypt(zip_winzip_aes_t *ctx, zip_uint8_t *data, zip_uint64_t length); diff --git a/core/deps/libzip/libzip-config.cmake.in b/core/deps/libzip/libzip-config.cmake.in index 5b9aa5580..806153036 100644 --- a/core/deps/libzip/libzip-config.cmake.in +++ b/core/deps/libzip/libzip-config.cmake.in @@ -1,9 +1,43 @@ @PACKAGE_INIT@ -# only needed for static library, and doesn't work as-is -#include(CMakeFindDependencyMacro) -#find_dependency(ZLIB::ZLIB) -# how to handle the optional dependencies? +# We need to supply transitive dependencies if this config is for a static library +set(IS_SHARED @BUILD_SHARED_LIBS@) +if (NOT IS_SHARED) + include(CMakeFindDependencyMacro) + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/modules") + + set(ENABLE_BZIP2 @BZIP2_FOUND@) + set(ENABLE_LZMA @LIBLZMA_FOUND@) + set(ENABLE_ZSTD @ZSTD_FOUND@) + set(ENABLE_GNUTLS @GNUTLS_FOUND@) + set(ENABLE_MBEDTLS @MBEDTLS_FOUND@) + set(ENABLE_OPENSSL @OPENSSL_FOUND@) + + find_dependency(ZLIB 1.1.2) + if(ENABLE_BZIP2) + find_dependency(BZip2) + endif() + + if(ENABLE_LZMA) + find_dependency(LibLZMA 5.2) + endif() + + if(ENABLE_ZSTD) + find_dependency(zstd 1.3.6) + endif() + + if(ENABLE_GNUTLS) + find_dependency(Nettle 3.0) + find_dependency(GnuTLS) + endif() + if(ENABLE_MBEDTLS) + find_dependency(MbedTLS 1.0) + endif() + if(ENABLE_OPENSSL) + find_dependency(OpenSSL) + endif() +endif() + # Provide all our library targets to users. include("${CMAKE_CURRENT_LIST_DIR}/libzip-targets.cmake") diff --git a/core/deps/libzip/libzip.pc.in b/core/deps/libzip/libzip.pc.in index 58b3dca7c..d51b0ab63 100644 --- a/core/deps/libzip/libzip.pc.in +++ b/core/deps/libzip/libzip.pc.in @@ -1,10 +1,10 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} bindir=@bindir@ libdir=@libdir@ includedir=@includedir@ -zipcmp=@bindir@/zipcmp +zipcmp=${bindir}/zipcmp Name: libzip Description: library for handling zip archives @@ -12,4 +12,3 @@ Version: @PROJECT_VERSION@ Libs: @PKG_CONFIG_RPATH@ -L${libdir} -lzip Libs.private: @LIBS@ Cflags: -I${includedir} - diff --git a/core/deps/libzip/man/CMakeLists.txt b/core/deps/libzip/man/CMakeLists.txt index 90d462a51..fe3f091f7 100644 --- a/core/deps/libzip/man/CMakeLists.txt +++ b/core/deps/libzip/man/CMakeLists.txt @@ -54,6 +54,7 @@ set(MAN_PAGES zip_libzip_version.3 zip_name_locate.3 zip_open.3 + zip_register_cancel_callback_with_state.3 zip_register_progress_callback.3 zip_register_progress_callback_with_state.3 zip_rename.3 @@ -74,6 +75,8 @@ set(MAN_PAGES zip_source_free.3 zip_source_function.3 zip_source_is_deleted.3 + zip_source_is_seekable.3 + zip_source_layered.3 zip_source_keep.3 zip_source_make_command_bitmap.3 zip_source_open.3 @@ -88,8 +91,10 @@ set(MAN_PAGES zip_source_win32a.3 zip_source_win32handle.3 zip_source_win32w.3 + zip_source_window_create.3 zip_source_write.3 zip_source_zip.3 + zip_source_zip_file.3 zip_stat.3 zip_stat_init.3 zip_unchange.3 @@ -114,7 +119,7 @@ foreach(MAN_PAGE ${MAN_PAGES}) #configure_file(${SOURCE_FILE} ${MAN_PAGE} COPYONLY) add_custom_command(OUTPUT ${MAN_PAGE} DEPENDS ${SOURCE_FILE} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/man/${SOURCE_FILE} ${PROJECT_BINARY_DIR}/man/${MAN_PAGE} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${MAN_PAGE} COMMENT "Preparing ${MAN_PAGE}" ) @@ -123,18 +128,20 @@ foreach(MAN_PAGE ${MAN_PAGES}) string(REGEX REPLACE "[1-9]$" "mdoc" MDOC_FILE ${MAN_PAGE}) # html re-generation - add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/man/${HTML_FILE} + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} DEPENDS ${MDOC_FILE} - COMMAND ${CMAKE_COMMAND} -DIN=${MDOC_FILE} -DOUT=${HTML_FILE} -DDIR=${PROJECT_SOURCE_DIR}/man -P ${PROJECT_SOURCE_DIR}/man/update-html.cmake + COMMAND ${CMAKE_COMMAND} -DIN=${CMAKE_CURRENT_SOURCE_DIR}/${MDOC_FILE} -DOUT=${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} -P ${CMAKE_CURRENT_SOURCE_DIR}/update-html.cmake + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${HTML_FILE} ) - list(APPEND UPDATEHTML ${PROJECT_SOURCE_DIR}/man/${HTML_FILE}) + list(APPEND UPDATEHTML ${CMAKE_CURRENT_BINARY_DIR}/${HTML_FILE}) # man re-generation - add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/man/${MAN_FILE} + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} DEPENDS ${MDOC_FILE} - COMMAND ${CMAKE_COMMAND} -DIN=${MDOC_FILE} -DOUT=${MAN_FILE} -DDIR=${PROJECT_SOURCE_DIR}/man -P ${PROJECT_SOURCE_DIR}/man/update-man.cmake + COMMAND ${CMAKE_COMMAND} -DIN=${CMAKE_CURRENT_SOURCE_DIR}/${MDOC_FILE} -DOUT=${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} -P ${CMAKE_CURRENT_SOURCE_DIR}/update-man.cmake + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${MAN_FILE} ) - list(APPEND UPDATEMAN ${PROJECT_SOURCE_DIR}/man/${MAN_FILE}) + list(APPEND UPDATEMAN ${CMAKE_CURRENT_BINARY_DIR}/${MAN_FILE}) endforeach() add_custom_target(man ALL DEPENDS ${MAN_PAGES}) add_custom_target(update-man DEPENDS ${UPDATEMAN}) diff --git a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html index bea0f3c6f..cae3b3f48 100644 --- a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html +++ b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.html @@ -5,7 +5,7 @@ Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man index 0e23ebd2a..cd49d5fde 100644 --- a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man +++ b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc index 2735964e1..3f8fb40ea 100644 --- a/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc +++ b/core/deps/libzip/man/ZIP_SOURCE_GET_ARGS.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/fix-man-links.sh b/core/deps/libzip/man/fix-man-links.sh deleted file mode 100644 index 53b7b0766..000000000 --- a/core/deps/libzip/man/fix-man-links.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -# -LINKBASE='http://pubs.opengroup.org/onlinepubs/9699919799/functions/' - -sed -E -e 's,(),\1'"$LINKBASE"'\2\3,g' -e "s,$LINKBASE"'(libzip|zip),\1,g' diff --git a/core/deps/libzip/man/libzip.html b/core/deps/libzip/man/libzip.html index bda14619d..693b04fd3 100644 --- a/core/deps/libzip/man/libzip.html +++ b/core/deps/libzip/man/libzip.html @@ -2,10 +2,10 @@ + + + + ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3) + + + + + + + + +
ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)Library Functions ManualZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE(3)
+
+
+

+zip_register_cancel_callback_with_state — +
allow cancelling during zip_close
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

typedef int (*zip_cancel_callback)(zip_t *, void + *);

+

void +
+ zip_register_cancel_callback_with_state(zip_t + *archive, + zip_cancel_callback + callback, void + (*ud_free)(void *), void + *ud);

+
+
+

+This function can be used to cancel writing of a zip archive during + zip_close(3). +

The + zip_register_cancel_callback_with_state() function + registers a callback function callback for the zip + archive archive. The ud_free + function is called during cleanup for deleting the userdata supplied in + ud.

+

The callback function is called during + zip_close(3) in regular intervals + (after every zip archive entry that's completely written to disk, and while + writing data for entries) with zip archive archive and + the user-provided user-data ud as arguments. When the + callback function returns a non-zero value, writing is cancelled and + zip_close(3) returns an error.

+

The callback function should be fast, since it will be called + often.

+
+
+

+libzip(3), + zip_close(3), + zip_register_progress_callback_with_state(3) +
+
+

+zip_register_cancel_callback_with_state() was added in + libzip 1.6.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
June 18, 2022NiH
+ + diff --git a/core/deps/libzip/man/zip_register_cancel_callback_with_state.man b/core/deps/libzip/man/zip_register_cancel_callback_with_state.man new file mode 100644 index 000000000..28a46a45c --- /dev/null +++ b/core/deps/libzip/man/zip_register_cancel_callback_with_state.man @@ -0,0 +1,90 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close +.\" Copyright (C) 2021-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE" "3" "June 18, 2022" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_register_cancel_callback_with_state\fR +\- allow cancelling during zip_close +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fItypedef int (*zip_cancel_callback)(zip_t *, void *);\fR +.sp +\fIvoid\fR +.br +.PD 0 +.HP 4n +\fBzip_register_cancel_callback_with_state\fR(\fIzip_t\ *archive\fR, \fIzip_cancel_callback\ callback\fR, \fIvoid\ (*ud_free)(void\ *)\fR, \fIvoid\ *ud\fR); +.PD +.SH "DESCRIPTION" +This function can be used to cancel writing of a zip archive during +zip_close(3). +.PP +The +\fBzip_register_cancel_callback_with_state\fR() +function registers a callback function +\fIcallback\fR +for the zip archive +\fIarchive\fR. +The +\fIud_free\fR +function is called during cleanup for deleting the userdata supplied in +\fIud\fR. +.PP +The callback function is called during +zip_close(3) +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +\fIarchive\fR +and the user-provided user-data +\fIud\fR +as arguments. +When the callback function returns a non-zero value, writing is cancelled and +zip_close(3) +returns an error. +.PP +The callback function should be fast, since it will be called often. +.SH "SEE ALSO" +libzip(3), +zip_close(3), +zip_register_progress_callback_with_state(3) +.SH "HISTORY" +\fBzip_register_cancel_callback_with_state\fR() +was added in libzip 1.6.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/core/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc b/core/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc new file mode 100644 index 000000000..b0712cbbb --- /dev/null +++ b/core/deps/libzip/man/zip_register_cancel_callback_with_state.mdoc @@ -0,0 +1,84 @@ +.\" zip_register_cancel_callback_with_state.mdoc -- allow cancelling during zip_close +.\" Copyright (C) 2021-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd June 18, 2022 +.Dt ZIP_REGISTER_CANCEL_CALLBACK_WITH_STATE 3 +.Os +.Sh NAME +.Nm zip_register_cancel_callback_with_state +.Nd allow cancelling during zip_close +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Vt typedef int (*zip_cancel_callback)(zip_t *, void *); +.Ft void +.Fn zip_register_cancel_callback_with_state "zip_t *archive" "zip_cancel_callback callback" "void (*ud_free)(void *)" "void *ud" +.Sh DESCRIPTION +This function can be used to cancel writing of a zip archive during +.Xr zip_close 3 . +.Pp +The +.Fn zip_register_cancel_callback_with_state +function registers a callback function +.Ar callback +for the zip archive +.Ar archive . +The +.Ar ud_free +function is called during cleanup for deleting the userdata supplied in +.Ar ud . +.Pp +The callback function is called during +.Xr zip_close 3 +in regular intervals (after every zip archive entry that's completely +written to disk, and while writing data for entries) with zip archive +.Ar archive +and the user-provided user-data +.Ar ud +as arguments. +When the callback function returns a non-zero value, writing is cancelled and +.Xr zip_close 3 +returns an error. +.Pp +The callback function should be fast, since it will be called often. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_close 3 , +.Xr zip_register_progress_callback_with_state 3 +.Sh HISTORY +.Fn zip_register_cancel_callback_with_state +was added in libzip 1.6.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_register_progress_callback.html b/core/deps/libzip/man/zip_register_progress_callback.html index e61b7ceb9..5ba547b0b 100644 --- a/core/deps/libzip/man/zip_register_progress_callback.html +++ b/core/deps/libzip/man/zip_register_progress_callback.html @@ -5,7 +5,7 @@ Copyright (C) 2016-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_register_progress_callback.man b/core/deps/libzip/man/zip_register_progress_callback.man index 3d0e5b94d..2a1ed23d9 100644 --- a/core/deps/libzip/man/zip_register_progress_callback.man +++ b/core/deps/libzip/man/zip_register_progress_callback.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2016-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_register_progress_callback.mdoc b/core/deps/libzip/man/zip_register_progress_callback.mdoc index 9fd0cd0d7..f512bb0b8 100644 --- a/core/deps/libzip/man/zip_register_progress_callback.mdoc +++ b/core/deps/libzip/man/zip_register_progress_callback.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2016-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_register_progress_callback_with_state.html b/core/deps/libzip/man/zip_register_progress_callback_with_state.html index 4faf331d5..086a16e0c 100644 --- a/core/deps/libzip/man/zip_register_progress_callback_with_state.html +++ b/core/deps/libzip/man/zip_register_progress_callback_with_state.html @@ -2,10 +2,10 @@ + + + + ZIP_SOURCE_IS_SEEKABLE(3) + + + + + + + + +
ZIP_SOURCE_IS_SEEKABLE(3)Library Functions ManualZIP_SOURCE_IS_SEEKABLE(3)
+
+
+

+zip_source_is_seekable — +
check if a source supports seeking
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

int +
+ zip_source_is_seekable(zip_source_t + *source);

+
+
+

+The function zip_source_is_seekable() checks if + source supports seeking via + zip_source_seek(3). +
+
+

+If the source supports seeking, 1 is returned. Otherwise, 0 is returned. +
+
+

+libzip(3), + zip_source(3), + zip_source_seek(3) +
+
+

+zip_source_is_seekable() was added in libzip 1.10.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
March 10, 2023NiH
+ + diff --git a/core/deps/libzip/man/zip_source_is_seekable.man b/core/deps/libzip/man/zip_source_is_seekable.man new file mode 100644 index 000000000..bd31d0fa4 --- /dev/null +++ b/core/deps/libzip/man/zip_source_is_seekable.man @@ -0,0 +1,70 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_seek.mdoc -- set read offset in source +.\" Copyright (C) 2023 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_IS_SEEKABLE" "3" "March 10, 2023" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_is_seekable\fR +\- check if a source supports seeking +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIint\fR +.br +.PD 0 +.HP 4n +\fBzip_source_is_seekable\fR(\fIzip_source_t\ *source\fR); +.PD +.SH "DESCRIPTION" +The function +\fBzip_source_is_seekable\fR() +checks if +\fIsource\fR +supports seeking via +zip_source_seek(3). +.SH "RETURN VALUES" +If the source supports seeking, 1 is returned. +Otherwise, 0 is returned. +.SH "SEE ALSO" +libzip(3), +zip_source(3), +zip_source_seek(3) +.SH "HISTORY" +\fBzip_source_is_seekable\fR() +was added in libzip 1.10.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/core/deps/libzip/man/zip_source_is_seekable.mdoc b/core/deps/libzip/man/zip_source_is_seekable.mdoc new file mode 100644 index 000000000..ad90bc755 --- /dev/null +++ b/core/deps/libzip/man/zip_source_is_seekable.mdoc @@ -0,0 +1,65 @@ +.\" zip_source_seek.mdoc -- set read offset in source +.\" Copyright (C) 2023 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 10, 2023 +.Dt ZIP_SOURCE_IS_SEEKABLE 3 +.Os +.Sh NAME +.Nm zip_source_is_seekable +.Nd check if a source supports seeking +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft int +.Fn zip_source_is_seekable "zip_source_t *source" +.Sh DESCRIPTION +The function +.Fn zip_source_is_seekable +checks if +.Fa source +supports seeking via +.Xr zip_source_seek 3 . +.Sh RETURN VALUES +If the source supports seeking, 1 is returned. +Otherwise, 0 is returned. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_seek 3 +.Sh HISTORY +.Fn zip_source_is_seekable +was added in libzip 1.10.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_source_keep.html b/core/deps/libzip/man/zip_source_keep.html index fc7d1d16f..0219d64a0 100644 --- a/core/deps/libzip/man/zip_source_keep.html +++ b/core/deps/libzip/man/zip_source_keep.html @@ -5,7 +5,7 @@ Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_keep.man b/core/deps/libzip/man/zip_source_keep.man index 488673cbe..78a2d3958 100644 --- a/core/deps/libzip/man/zip_source_keep.man +++ b/core/deps/libzip/man/zip_source_keep.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_keep.mdoc b/core/deps/libzip/man/zip_source_keep.mdoc index 122c4f84a..0984d6c52 100644 --- a/core/deps/libzip/man/zip_source_keep.mdoc +++ b/core/deps/libzip/man/zip_source_keep.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_layered.html b/core/deps/libzip/man/zip_source_layered.html new file mode 100644 index 000000000..c53905360 --- /dev/null +++ b/core/deps/libzip/man/zip_source_layered.html @@ -0,0 +1,215 @@ + + + + + + + ZIP_SOURCE_LAYERED(3) + + + + + + + + +
ZIP_SOURCE_LAYERED(3)Library Functions ManualZIP_SOURCE_LAYERED(3)
+
+
+

+zip_source_layered, + zip_source_layered_create — +
create layered data source from function
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_layered(zip_t + *archive, zip_source_t + *source, + zip_source_layered_callback + fn, void + *userdata);

+

zip_source_t * +
+ zip_source_layered_create(zip_source_t + *source, + zip_source_layered_callback + fn, void *userdata, + zip_error_t *error);

+
+
+

+The functions zip_source_layered() and + zip_source_layered_create() create a layered zip + source from the user-provided function fn, which must be + of the following type: +

typedef zip_int64_t + (*p_source_layered_callback)(zip_source_t + *source, void *userdata, void + *data, zip_uint64_t length, + zip_source_cmd_t cmd);

+

archive or error are + used for reporting errors and can be NULL.

+

When called by the library, the first argument is the + source of the lower layer, the second argument is the + userdata argument supplied to the function. The next + two arguments are a buffer data of size + length when data is passed in or expected to be + returned, or else NULL and 0. The last argument, + cmd, specifies which action the function should + perform.

+

See + zip_source_function(3) for + a description of the commands.

+

A layered source transforms the data or metadata of the source + below in some way. Layered sources can't support writing and are not + sufficient to cleanly add support for additional compression or encryption + methods. This may be revised in a later release of libzip.

+

On success, the layered source takes ownership of + source. The caller should not free it.

+

The interaction with the lower layer depends on the command:

+
+

ZIP_SOURCE_ACCEPT_EMPTY

+If the layered source supports this command, the lower layer is not called + automatically. Otherwise, the return value of the lower source is used. +
+
+

ZIP_SOURCE_CLOSE

+The lower layer is closed after the callback returns. +
+
+

ZIP_SOURCE_ERROR

+The lower layer is not called automatically. If you need to retrieve error + information from the lower layer, use + zip_error_set_from_source(3) + or + zip_source_pass_to_lower_layer(3). +
+
+

ZIP_SOURCE_FREE

+The lower layer is freed after the callback returns. +
+
+

ZIP_SOURCE_GET_FILE_ATTRIBUTES

+The attributes of the lower layer are merged with the attributes returned by the + callback: information set by the callback wins over the lower layer, with the + following exceptions: the higher version_needed is used, + and general_purpose_bit_flags are only overwritten if + the corresponding bit is set in + general_purpose_bit_mask. +
+
+

ZIP_SOURCE_OPEN

+The lower layer is opened before the callback is called. +
+
+

ZIP_SOURCE_READ

+The lower layer is not called automatically. +
+
+

ZIP_SOURCE_SEEK

+The lower layer is not called automatically. +
+
+

ZIP_SOURCE_STAT

+data contains the stat information from the lower layer + when the callback is called. +
+
+

ZIP_SOURCE_SUPPORTS

+data contains the bitmap of commands supported by the + lower layer when the callback is called. Since layered sources can't support + writing, all commands related to writing are stripped from the returned + support bitmap. +
+
+

ZIP_SOURCE_TELL

+The lower layer is not called automatically. +
+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error (unless it is NULL). +
+
+

+zip_source_layered() fails if: +
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_file_add(3), + zip_file_attributes_init(3), + zip_file_replace(3), + zip_source(3), + zip_source_function(3), + zip_source_pass_to_lower_layer(3) +
+
+

+zip_source_layered() and + zip_source_layered_create() were added in libzip 1.10. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
January 20, 2023NiH
+ + diff --git a/core/deps/libzip/man/zip_source_layered.man b/core/deps/libzip/man/zip_source_layered.man new file mode 100644 index 000000000..eaa4690b1 --- /dev/null +++ b/core/deps/libzip/man/zip_source_layered.man @@ -0,0 +1,173 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_layered.mdoc -- create layered source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_LAYERED" "3" "January 20, 2023" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_layered\fR, +\fBzip_source_layered_create\fR +\- create layered data source from function +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_layered\fR(\fIzip_t\ *archive\fR, \fIzip_source_t\ *source\fR, \fIzip_source_layered_callback\ fn\fR, \fIvoid\ *userdata\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_layered_create\fR(\fIzip_source_t\ *source\fR, \fIzip_source_layered_callback\ fn\fR, \fIvoid\ *userdata\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_layered\fR() +and +\fBzip_source_layered_create\fR() +create a layered zip source from the user-provided function +\fIfn\fR, +which must be of the following type: +.PP +\fItypedef zip_int64_t\fR +\fB\fR(*\zip_source_layered_callback\fR)\fP\fR(\fIzip_source_t\ *source\fR, \fIvoid\ *userdata\fR, \fIvoid\ *data\fR, \fIzip_uint64_t\ length\fR, \fIzip_source_cmd_t\ cmd\fR) +.PP +\fIarchive\fR +or +\fIerror\fR +are used for reporting errors and can be +\fRNULL\fR. +.PP +When called by the library, the first argument is the +\fIsource\fR +of the lower layer, the second argument is the +\fIuserdata\fR +argument supplied to the function. +The next two arguments are a buffer +\fIdata\fR +of size +\fIlength\fR +when data is passed in or expected to be returned, or else +\fRNULL\fR +and 0. +The last argument, +\fIcmd\fR, +specifies which action the function should perform. +.PP +See +zip_source_function(3) +for a description of the commands. +.PP +A layered source transforms the data or metadata of the source below in some way. +Layered sources can't support writing and are not sufficient to cleanly add support for additional compression or encryption methods. +This may be revised in a later release of libzip. +.PP +On success, the layered source takes ownership of +\fIsource\fR. +The caller should not free it. +.PP +The interaction with the lower layer depends on the command: +.SS "\fRZIP_SOURCE_ACCEPT_EMPTY\fR" +If the layered source supports this command, the lower layer is not called automatically. +Otherwise, the return value of the lower source is used. +.SS "\fRZIP_SOURCE_CLOSE\fR" +The lower layer is closed after the callback returns. +.SS "\fRZIP_SOURCE_ERROR\fR" +The lower layer is not called automatically. +If you need to retrieve error information from the lower layer, use +zip_error_set_from_source(3) +or +zip_source_pass_to_lower_layer(3). +.SS "\fRZIP_SOURCE_FREE\fR" +The lower layer is freed after the callback returns. +.SS "\fRZIP_SOURCE_GET_FILE_ATTRIBUTES\fR" +The attributes of the lower layer are merged with the attributes returned by the callback: information set by the callback wins over the lower layer, with the following exceptions: the higher +\fIversion_needed\fR +is used, and +\fIgeneral_purpose_bit_flags\fR +are only overwritten if the corresponding bit is set in +\fIgeneral_purpose_bit_mask\fR. +.SS "\fRZIP_SOURCE_OPEN\fR" +The lower layer is opened before the callback is called. +.SS "\fRZIP_SOURCE_READ\fR" +The lower layer is not called automatically. +.SS "\fRZIP_SOURCE_SEEK\fR" +The lower layer is not called automatically. +.SS "\fRZIP_SOURCE_STAT\fR" +\fIdata\fR +contains the stat information from the lower layer when the callback is called. +.SS "\fRZIP_SOURCE_SUPPORTS\fR" +\fIdata\fR +contains the bitmap of commands supported by the lower layer when the callback is called. +Since layered sources can't support writing, all commands related to writing are stripped from the returned support bitmap. +.SS "\fRZIP_SOURCE_TELL\fR" +The lower layer is not called automatically. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error (unless +it is +\fRNULL\fR). +.SH "ERRORS" +\fBzip_source_layered\fR() +fails if: +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_attributes_init(3), +zip_file_replace(3), +zip_source(3), +zip_source_function(3), +zip_source_pass_to_lower_layer(3) +.SH "HISTORY" +\fBzip_source_layered\fR() +and +\fBzip_source_layered_create\fR() +were added in libzip 1.10. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/core/deps/libzip/man/zip_source_layered.mdoc b/core/deps/libzip/man/zip_source_layered.mdoc new file mode 100644 index 000000000..aba25a5d7 --- /dev/null +++ b/core/deps/libzip/man/zip_source_layered.mdoc @@ -0,0 +1,167 @@ +.\" zip_source_layered.mdoc -- create layered source from function +.\" Copyright (C) 2004-2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd January 20, 2023 +.Dt ZIP_SOURCE_LAYERED 3 +.Os +.Sh NAME +.Nm zip_source_layered , +.Nm zip_source_layered_create +.Nd create layered data source from function +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_layered "zip_t *archive" "zip_source_t *source" "zip_source_layered_callback fn" "void *userdata" +.Ft zip_source_t * +.Fn zip_source_layered_create "zip_source_t *source" "zip_source_layered_callback fn" "void *userdata" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_layered +and +.Fn zip_source_layered_create +create a layered zip source from the user-provided function +.Ar fn , +which must be of the following type: +.Pp +.Ft typedef zip_int64_t +.Fo \fR(*\zip_source_layered_callback\fR)\fP +.Fa "zip_source_t *source" "void *userdata" "void *data" "zip_uint64_t length" "zip_source_cmd_t cmd" +.Fc +.Pp +.Ar archive +or +.Ar error +are used for reporting errors and can be +.Dv NULL . +.Pp +When called by the library, the first argument is the +.Ar source +of the lower layer, the second argument is the +.Ar userdata +argument supplied to the function. +The next two arguments are a buffer +.Ar data +of size +.Ar length +when data is passed in or expected to be returned, or else +.Dv NULL +and 0. +The last argument, +.Ar cmd , +specifies which action the function should perform. +.Pp +See +.Xr zip_source_function 3 +for a description of the commands. +.Pp +A layered source transforms the data or metadata of the source below in some way. +Layered sources can't support writing and are not sufficient to cleanly add support for additional compression or encryption methods. +This may be revised in a later release of libzip. +.Pp +On success, the layered source takes ownership of +.Ar source . +The caller should not free it. +.Pp +The interaction with the lower layer depends on the command: +.El +.Ss Dv ZIP_SOURCE_ACCEPT_EMPTY +If the layered source supports this command, the lower layer is not called automatically. +Otherwise, the return value of the lower source is used. +.Ss Dv ZIP_SOURCE_CLOSE +The lower layer is closed after the callback returns. +.Ss Dv ZIP_SOURCE_ERROR +The lower layer is not called automatically. +If you need to retrieve error information from the lower layer, use +.Xr zip_error_set_from_source 3 +or +.Xr zip_source_pass_to_lower_layer 3 . +.Ss Dv ZIP_SOURCE_FREE +The lower layer is freed after the callback returns. +.Ss Dv ZIP_SOURCE_GET_FILE_ATTRIBUTES +The attributes of the lower layer are merged with the attributes returned by the callback: information set by the callback wins over the lower layer, with the following exceptions: the higher +.Ar version_needed +is used, and +.Ar general_purpose_bit_flags +are only overwritten if the corresponding bit is set in +.Ar general_purpose_bit_mask . +.Ss Dv ZIP_SOURCE_OPEN +The lower layer is opened before the callback is called. +.Ss Dv ZIP_SOURCE_READ +The lower layer is not called automatically. +.Ss Dv ZIP_SOURCE_SEEK +The lower layer is not called automatically. +.Ss Dv ZIP_SOURCE_STAT +.Ar data +contains the stat information from the lower layer when the callback is called. +.Ss Dv ZIP_SOURCE_SUPPORTS +.Ar data +contains the bitmap of commands supported by the lower layer when the callback is called. +Since layered sources can't support writing, all commands related to writing are stripped from the returned support bitmap. +.Ss Dv ZIP_SOURCE_TELL +The lower layer is not called automatically. +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error (unless +it is +.Dv NULL ) . +.Sh ERRORS +.Fn zip_source_layered +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_attributes_init 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 , +.Xr zip_source_function 3 , +.Xr zip_source_pass_to_lower_layer 3 +.Sh HISTORY +.Fn zip_source_layered +and +.Fn zip_source_layered_create +were added in libzip 1.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_source_make_command_bitmap.html b/core/deps/libzip/man/zip_source_make_command_bitmap.html index d6ce945eb..28c3ad825 100644 --- a/core/deps/libzip/man/zip_source_make_command_bitmap.html +++ b/core/deps/libzip/man/zip_source_make_command_bitmap.html @@ -5,7 +5,7 @@ Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_make_command_bitmap.man b/core/deps/libzip/man/zip_source_make_command_bitmap.man index 3dc3ed5d0..6cba12f42 100644 --- a/core/deps/libzip/man/zip_source_make_command_bitmap.man +++ b/core/deps/libzip/man/zip_source_make_command_bitmap.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_make_command_bitmap.mdoc b/core/deps/libzip/man/zip_source_make_command_bitmap.mdoc index 28d296f2f..2b327e14d 100644 --- a/core/deps/libzip/man/zip_source_make_command_bitmap.mdoc +++ b/core/deps/libzip/man/zip_source_make_command_bitmap.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_open.html b/core/deps/libzip/man/zip_source_open.html index 9dc5a579a..443d9fb59 100644 --- a/core/deps/libzip/man/zip_source_open.html +++ b/core/deps/libzip/man/zip_source_open.html @@ -5,7 +5,7 @@ Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_open.man b/core/deps/libzip/man/zip_source_open.man index dc337baf6..2bf19207d 100644 --- a/core/deps/libzip/man/zip_source_open.man +++ b/core/deps/libzip/man/zip_source_open.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_open.mdoc b/core/deps/libzip/man/zip_source_open.mdoc index 00371f64f..521ba8808 100644 --- a/core/deps/libzip/man/zip_source_open.mdoc +++ b/core/deps/libzip/man/zip_source_open.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc b/core/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc new file mode 100644 index 000000000..aaafc236f --- /dev/null +++ b/core/deps/libzip/man/zip_source_pass_to_lower_layer.mdoc @@ -0,0 +1,64 @@ +.\" zip_source_pass_to_lower_layer.mdoc -- pass command to lower layer +.\" Copyright (C) 2022 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd December 5, 2022 +.Dt ZIP_SOURCE_PASS_TO_LOWER_LAYER 3 +.Os +.Sh NAME +.Nm zip_source_pass_to_lower_layer +.Nd pass command to lower layer +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_int64_t +.Fn zip_source_pass_to_lower_layer "zip_source_t *source" "void *data" "zip_uint64_t length" "zip_source_cmd_t command" +.Sh DESCRIPTION +The functions +.Fn zip_source_pass_to_lower_layer +is used in a layered source callback to pass commands for which you don't want to change the result to the lower layer. +You can use it in the +.Dv default +case of the callback. +.Sh RETURN VALUES +The return value is meant to be returned by the callback. +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 , +.Xr zip_source_layered 3 +.Sh HISTORY +.Fn zip_source_pass_to_lower_layer +was added in libzip 1.10. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_source_read.html b/core/deps/libzip/man/zip_source_read.html index 1269a42e6..0fbde0ad1 100644 --- a/core/deps/libzip/man/zip_source_read.html +++ b/core/deps/libzip/man/zip_source_read.html @@ -2,10 +2,10 @@ + + + + ZIP_SOURCE_WINDOW_CREATE(3) + + + + + + + + +
ZIP_SOURCE_WINDOW_CREATE(3)Library Functions ManualZIP_SOURCE_WINDOW_CREATE(3)
+
+
+

+zip_source_window_create — +
create zip data source overlay
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_window_create(zip_source_t + *source, zip_uint64_t + start, zip_int64_t + len, zip_error_t + *error);

+
+
+

+The zip_source_window_create() function create a zip + source from an underlying zip source, restricting access to a particular + window starting at byte start and having size + len. If len is -1, the window + spans to the end of the underlying source. +

zip_source_window() and + zip_source_window_create() don't take ownership of + source. The caller is responsible for freeing it. + (This is different to other layered sources.)

+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + error is set to indicate the error. +
+
+

+zip_source_window_create() fails if: +
+
[]
+
src is NULL; there is an + integer overflow adding start and + len; or len is less than + -1.
+
[]
+
Required memory could not be allocated.
+
+
+
+

+libzip(3), + zip_source(3) + zip_source(3) +
+
+

+zip_source_window_create() was added in libzip 1.8.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
April 29, 2021NiH
+ + diff --git a/core/deps/libzip/man/zip_source_window_create.man b/core/deps/libzip/man/zip_source_window_create.man new file mode 100644 index 000000000..78d35313b --- /dev/null +++ b/core/deps/libzip/man/zip_source_window_create.man @@ -0,0 +1,104 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_window_create.mdoc -- create zip data source overlay +.\" Copyright (C) 2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_WINDOW_CREATE" "3" "April 29, 2021" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_window_create\fR +\- create zip data source overlay +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_window_create\fR(\fIzip_source_t\ *source\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ len\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The +\fBzip_source_window_create\fR() +function create a zip source from an underlying zip source, +restricting access to a particular window starting at byte +\fIstart\fR +and having size +\fIlen\fR. +If +\fIlen\fR +is \-1, the window spans to the end of the underlying source. +.PP +\fBzip_source_window\fR() +and +\fBzip_source_window_create\fR() +don't take ownership of +\fIsource\fR. +The caller is responsible for freeing it. +(This is different to other layered sources.) +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_window_create\fR() +fails if: +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIsrc\fR +is +\fRNULL\fR; +there is an integer overflow adding +\fIstart\fR +and +\fIlen\fR; +or +\fIlen\fR +is less than \-1. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.SH "SEE ALSO" +libzip(3), +zip_source(3) +zip_source(3) +.SH "HISTORY" +\fBzip_source_window_create\fR() +was added in libzip 1.8.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/core/deps/libzip/man/zip_source_window_create.mdoc b/core/deps/libzip/man/zip_source_window_create.mdoc new file mode 100644 index 000000000..2d4f1d17e --- /dev/null +++ b/core/deps/libzip/man/zip_source_window_create.mdoc @@ -0,0 +1,99 @@ +.\" zip_source_window_create.mdoc -- create zip data source overlay +.\" Copyright (C) 2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 29, 2021 +.Dt ZIP_SOURCE_WINDOW_CREATE 3 +.Os +.Sh NAME +.Nm zip_source_window_create +.Nd create zip data source overlay +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_window_create "zip_source_t *source" "zip_uint64_t start" "zip_int64_t len" "zip_error_t *error" +.Sh DESCRIPTION +The +.Fn zip_source_window_create +function create a zip source from an underlying zip source, +restricting access to a particular window starting at byte +.Ar start +and having size +.Ar len . +If +.Ar len +is \-1, the window spans to the end of the underlying source. +.Pp +.Fn zip_source_window +and +.Fn zip_source_window_create +don't take ownership of +.Ar source . +The caller is responsible for freeing it. +(This is different to other layered sources.) +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_window_create +fails if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_INVAL +.Ar src +is +.Dv NULL ; +there is an integer overflow adding +.Ar start +and +.Ar len ; +or +.Ar len +is less than \-1. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_source 3 +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_window_create +was added in libzip 1.8.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_source_write.html b/core/deps/libzip/man/zip_source_write.html index 88749bce8..94052b8be 100644 --- a/core/deps/libzip/man/zip_source_write.html +++ b/core/deps/libzip/man/zip_source_write.html @@ -5,7 +5,7 @@ Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_write.man b/core/deps/libzip/man/zip_source_write.man index 58d808ee2..4fb5cdb5d 100644 --- a/core/deps/libzip/man/zip_source_write.man +++ b/core/deps/libzip/man/zip_source_write.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_write.mdoc b/core/deps/libzip/man/zip_source_write.mdoc index 00836b034..fd033a85f 100644 --- a/core/deps/libzip/man/zip_source_write.mdoc +++ b/core/deps/libzip/man/zip_source_write.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2014-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_source_zip.html b/core/deps/libzip/man/zip_source_zip.html index ec8dd752e..8708e6d5e 100644 --- a/core/deps/libzip/man/zip_source_zip.html +++ b/core/deps/libzip/man/zip_source_zip.html @@ -2,10 +2,10 @@ + + + + ZIP_SOURCE_ZIP_FILE(3) + + + + + + + + +
ZIP_SOURCE_ZIP_FILE(3)Library Functions ManualZIP_SOURCE_ZIP_FILE(3)
+
+
+

+zip_source_zip_file, + zip_source_zip_file_create — +
create data source from zip file
+
+
+

+libzip (-lzip) +
+
+

+#include <zip.h> +

zip_source_t * +
+ zip_source_zip_file(zip_t + *archive, zip_t + *srcarchive, zip_uint64_t + srcidx, zip_flags_t + flags, zip_uint64_t + start, zip_int64_t + length, const char + *password);

+

zip_source_t * +
+ zip_source_zip_file_create(zip_t + *srcarchive, zip_uint64_t + srcidx, zip_flags_t + flags, zip_uint64_t + start, zip_int64_t + length, const char + *password, zip_error_t + *error);

+
+
+

+The functions zip_source_zip_file() and + zip_source_zip_file_create() create a zip source from + a file in a zip archive. The srcarchive argument is the + (open) zip archive containing the source zip file at index + srcidx. length bytes from offset + start will be used in the zip_source. If + length is -1, the rest of the file, starting from + start, is used. +

If you intend to copy a file from one archive to another, using + the flag ZIP_FL_COMPRESSED is more efficient, as it + avoids recompressing the file data.

+

Supported flags are:

+
+
+
Get the compressed data. This is only supported if the complete file data + is requested (start == 0 and + length == -1). This is not supported for changed + data. Default is uncompressed.
+
+
Get the encrypted data. (This flag implies + ZIP_FL_COMPRESSED.) This is only supported if the + complete file data is requested (start == 0 and + length == -1). Default is decrypted.
+
+
Try to get the original data without any changes that may have been made + to srcarchive after opening it.
+
+
+
+

+Upon successful completion, the created source is returned. Otherwise, + NULL is returned and the error code in + archive or error is set to + indicate the error. +
+
+

+zip_source_zip_file() and + zip_source_zip_file_create() fail if: +
+
[]
+
Unchanged data was requested, but it is not available.
+
[]
+
srcarchive, srcidx, + start, or length are + invalid.
+
[]
+
Required memory could not be allocated.
+
+Additionally, it can return all error codes from + zip_stat_index() and + zip_fopen_index(). +
+
+

+libzip(3), + zip_file_add(3), + zip_file_replace(3), + zip_source(3) +
+
+

+zip_source_zip_file() and + zip_source_zip_file_create() were added in libzip + 1.10.0. +
+
+

+Dieter Baron + <dillo@nih.at> and + Thomas Klausner + <tk@giga.or.at> +
+
+ + + + + +
March 10, 2023NiH
+ + diff --git a/core/deps/libzip/man/zip_source_zip_file.man b/core/deps/libzip/man/zip_source_zip_file.man new file mode 100644 index 000000000..ae7f16a19 --- /dev/null +++ b/core/deps/libzip/man/zip_source_zip_file.man @@ -0,0 +1,159 @@ +.\" Automatically generated from an mdoc input file. Do not edit. +.\" zip_source_zip_file.mdoc -- create data source from zip file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.TH "ZIP_SOURCE_ZIP_FILE" "3" "March 10, 2023" "NiH" "Library Functions Manual" +.nh +.if n .ad l +.SH "NAME" +\fBzip_source_zip_file\fR, +\fBzip_source_zip_file_create\fR +\- create data source from zip file +.SH "LIBRARY" +libzip (-lzip) +.SH "SYNOPSIS" +\fB#include \fR +.sp +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_zip_file\fR(\fIzip_t\ *archive\fR, \fIzip_t\ *srcarchive\fR, \fIzip_uint64_t\ srcidx\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ length\fR, \fIconst\ char\ *password\fR); +.PD +.PP +\fIzip_source_t *\fR +.br +.PD 0 +.HP 4n +\fBzip_source_zip_file_create\fR(\fIzip_t\ *srcarchive\fR, \fIzip_uint64_t\ srcidx\fR, \fIzip_flags_t\ flags\fR, \fIzip_uint64_t\ start\fR, \fIzip_int64_t\ length\fR, \fIconst\ char\ *password\fR, \fIzip_error_t\ *error\fR); +.PD +.SH "DESCRIPTION" +The functions +\fBzip_source_zip_file\fR() +and +\fBzip_source_zip_file_create\fR() +create a zip source from a file in a zip archive. +The +\fIsrcarchive\fR +argument is the (open) zip archive containing the source zip file +at index +\fIsrcidx\fR. +\fIlength\fR +bytes from offset +\fIstart\fR +will be used in the zip_source. +If +\fIlength\fR +is \-1, the rest of the file, starting from +\fIstart\fR, +is used. +.PP +If you intend to copy a file from one archive to another, using the flag +\fRZIP_FL_COMPRESSED\fR +is more efficient, as it avoids recompressing the file data. +.PP +Supported flags are: +.TP 22n +\fRZIP_FL_COMPRESSED\fR +Get the compressed data. +This is only supported if the complete file data is requested +(\fIstart\fR +== 0 and +\fIlength\fR +== \-1). +This is not supported for changed data. +Default is uncompressed. +.TP 22n +\fRZIP_FL_ENCRYPTED\fR +Get the encrypted data. +(This flag implies +\fRZIP_FL_COMPRESSED\fR.) +This is only supported if the complete file data is requested +(\fIstart\fR +== 0 and +\fIlength\fR +== \-1). +Default is decrypted. +.TP 22n +\fRZIP_FL_UNCHANGED\fR +Try to get the original data without any changes that may have been +made to +\fIsrcarchive\fR +after opening it. +.SH "RETURN VALUES" +Upon successful completion, the created source is returned. +Otherwise, +\fRNULL\fR +is returned and the error code in +\fIarchive\fR +or +\fIerror\fR +is set to indicate the error. +.SH "ERRORS" +\fBzip_source_zip_file\fR() +and +\fBzip_source_zip_file_create\fR() +fail if: +.TP 19n +[\fRZIP_ER_CHANGED\fR] +Unchanged data was requested, but it is not available. +.TP 19n +[\fRZIP_ER_INVAL\fR] +\fIsrcarchive\fR, +\fIsrcidx\fR, +\fIstart\fR, +or +\fIlength\fR +are invalid. +.TP 19n +[\fRZIP_ER_MEMORY\fR] +Required memory could not be allocated. +.PD 0 +.PP +Additionally, it can return all error codes from +\fBzip_stat_index\fR() +and +\fBzip_fopen_index\fR(). +.PD +.SH "SEE ALSO" +libzip(3), +zip_file_add(3), +zip_file_replace(3), +zip_source(3) +.SH "HISTORY" +\fBzip_source_zip_file\fR() +and +\fBzip_source_zip_file_create\fR() +were added in libzip 1.10.0. +.SH "AUTHORS" +Dieter Baron <\fIdillo@nih.at\fR> +and +Thomas Klausner <\fItk@giga.or.at\fR> diff --git a/core/deps/libzip/man/zip_source_zip_file.mdoc b/core/deps/libzip/man/zip_source_zip_file.mdoc new file mode 100644 index 000000000..a0842b749 --- /dev/null +++ b/core/deps/libzip/man/zip_source_zip_file.mdoc @@ -0,0 +1,144 @@ +.\" zip_source_zip_file.mdoc -- create data source from zip file +.\" Copyright (C) 2004-2021 Dieter Baron and Thomas Klausner +.\" +.\" This file is part of libzip, a library to manipulate ZIP archives. +.\" The authors can be contacted at +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" 3. The names of the authors may not be used to endorse or promote +.\" products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +.\" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +.\" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +.\" IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd March 10, 2023 +.Dt ZIP_SOURCE_ZIP_FILE 3 +.Os +.Sh NAME +.Nm zip_source_zip_file , +.Nm zip_source_zip_file_create +.Nd create data source from zip file +.Sh LIBRARY +libzip (-lzip) +.Sh SYNOPSIS +.In zip.h +.Ft zip_source_t * +.Fn zip_source_zip_file "zip_t *archive" "zip_t *srcarchive" "zip_uint64_t srcidx" "zip_flags_t flags" "zip_uint64_t start" "zip_int64_t length" "const char *password" +.Ft zip_source_t * +.Fn zip_source_zip_file_create "zip_t *srcarchive" "zip_uint64_t srcidx" "zip_flags_t flags" "zip_uint64_t start" "zip_int64_t length" "const char *password" "zip_error_t *error" +.Sh DESCRIPTION +The functions +.Fn zip_source_zip_file +and +.Fn zip_source_zip_file_create +create a zip source from a file in a zip archive. +The +.Ar srcarchive +argument is the (open) zip archive containing the source zip file +at index +.Ar srcidx . +.Ar length +bytes from offset +.Ar start +will be used in the zip_source. +If +.Ar length +is \-1, the rest of the file, starting from +.Ar start , +is used. +.Pp +If you intend to copy a file from one archive to another, using the flag +.Dv ZIP_FL_COMPRESSED +is more efficient, as it avoids recompressing the file data. +.Pp +Supported flags are: +.Bl -tag -width 20n +.It Dv ZIP_FL_COMPRESSED +Get the compressed data. +This is only supported if the complete file data is requested +.Ar ( start +== 0 and +.Ar length +== \-1). +This is not supported for changed data. +Default is uncompressed. +.It Dv ZIP_FL_ENCRYPTED +Get the encrypted data. +(This flag implies +.Dv ZIP_FL_COMPRESSED . ) +This is only supported if the complete file data is requested +.Ar ( start +== 0 and +.Ar length +== \-1). +Default is decrypted. +.It Dv ZIP_FL_UNCHANGED +Try to get the original data without any changes that may have been +made to +.Ar srcarchive +after opening it. +.El +.Sh RETURN VALUES +Upon successful completion, the created source is returned. +Otherwise, +.Dv NULL +is returned and the error code in +.Ar archive +or +.Ar error +is set to indicate the error. +.Sh ERRORS +.Fn zip_source_zip_file +and +.Fn zip_source_zip_file_create +fail if: +.Bl -tag -width Er +.It Bq Er ZIP_ER_CHANGED +Unchanged data was requested, but it is not available. +.It Bq Er ZIP_ER_INVAL +.Ar srcarchive , +.Ar srcidx , +.Ar start , +or +.Ar length +are invalid. +.It Bq Er ZIP_ER_MEMORY +Required memory could not be allocated. +.El +Additionally, it can return all error codes from +.Fn zip_stat_index +and +.Fn zip_fopen_index . +.Sh SEE ALSO +.Xr libzip 3 , +.Xr zip_file_add 3 , +.Xr zip_file_replace 3 , +.Xr zip_source 3 +.Sh HISTORY +.Fn zip_source_zip_file +and +.Fn zip_source_zip_file_create +were added in libzip 1.10.0. +.Sh AUTHORS +.An -nosplit +.An Dieter Baron Aq Mt dillo@nih.at +and +.An Thomas Klausner Aq Mt tk@giga.or.at diff --git a/core/deps/libzip/man/zip_stat.html b/core/deps/libzip/man/zip_stat.html index 699c78f64..8cf0086ad 100644 --- a/core/deps/libzip/man/zip_stat.html +++ b/core/deps/libzip/man/zip_stat.html @@ -5,7 +5,7 @@ Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_stat.man b/core/deps/libzip/man/zip_stat.man index 93b6fdd5c..d7d4338f2 100644 --- a/core/deps/libzip/man/zip_stat.man +++ b/core/deps/libzip/man/zip_stat.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_stat.mdoc b/core/deps/libzip/man/zip_stat.mdoc index 4d5661ef4..9871770a3 100644 --- a/core/deps/libzip/man/zip_stat.mdoc +++ b/core/deps/libzip/man/zip_stat.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_stat_init.html b/core/deps/libzip/man/zip_stat_init.html index 99b36dee2..fd9c0f5a5 100644 --- a/core/deps/libzip/man/zip_stat_init.html +++ b/core/deps/libzip/man/zip_stat_init.html @@ -5,7 +5,7 @@ Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_stat_init.man b/core/deps/libzip/man/zip_stat_init.man index 75f3ea9b4..2ba5857f5 100644 --- a/core/deps/libzip/man/zip_stat_init.man +++ b/core/deps/libzip/man/zip_stat_init.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_stat_init.mdoc b/core/deps/libzip/man/zip_stat_init.mdoc index 0d464a614..bb5a0ffbe 100644 --- a/core/deps/libzip/man/zip_stat_init.mdoc +++ b/core/deps/libzip/man/zip_stat_init.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange.html b/core/deps/libzip/man/zip_unchange.html index 671abede5..ebf1113af 100644 --- a/core/deps/libzip/man/zip_unchange.html +++ b/core/deps/libzip/man/zip_unchange.html @@ -5,7 +5,7 @@ Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange.man b/core/deps/libzip/man/zip_unchange.man index c7ec25f55..30db8a9d9 100644 --- a/core/deps/libzip/man/zip_unchange.man +++ b/core/deps/libzip/man/zip_unchange.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange.mdoc b/core/deps/libzip/man/zip_unchange.mdoc index 6bde36bb5..3a2215588 100644 --- a/core/deps/libzip/man/zip_unchange.mdoc +++ b/core/deps/libzip/man/zip_unchange.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_all.html b/core/deps/libzip/man/zip_unchange_all.html index ab94a0038..1c11f0baf 100644 --- a/core/deps/libzip/man/zip_unchange_all.html +++ b/core/deps/libzip/man/zip_unchange_all.html @@ -5,7 +5,7 @@ Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_all.man b/core/deps/libzip/man/zip_unchange_all.man index 4fcbee320..f3aecea6f 100644 --- a/core/deps/libzip/man/zip_unchange_all.man +++ b/core/deps/libzip/man/zip_unchange_all.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_all.mdoc b/core/deps/libzip/man/zip_unchange_all.mdoc index b676eb557..01806ecb0 100644 --- a/core/deps/libzip/man/zip_unchange_all.mdoc +++ b/core/deps/libzip/man/zip_unchange_all.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2003-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_archive.html b/core/deps/libzip/man/zip_unchange_archive.html index f40ea4edc..35b842c34 100644 --- a/core/deps/libzip/man/zip_unchange_archive.html +++ b/core/deps/libzip/man/zip_unchange_archive.html @@ -5,7 +5,7 @@ Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. - The authors can be contacted at + The authors can be contacted at Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_archive.man b/core/deps/libzip/man/zip_unchange_archive.man index 430eafc00..3f42fdc88 100644 --- a/core/deps/libzip/man/zip_unchange_archive.man +++ b/core/deps/libzip/man/zip_unchange_archive.man @@ -3,7 +3,7 @@ .\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zip_unchange_archive.mdoc b/core/deps/libzip/man/zip_unchange_archive.mdoc index b3b3d3f1a..4ec381154 100644 --- a/core/deps/libzip/man/zip_unchange_archive.mdoc +++ b/core/deps/libzip/man/zip_unchange_archive.mdoc @@ -2,7 +2,7 @@ .\" Copyright (C) 2006-2017 Dieter Baron and Thomas Klausner .\" .\" This file is part of libzip, a library to manipulate ZIP archives. -.\" The authors can be contacted at +.\" The authors can be contacted at .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions diff --git a/core/deps/libzip/man/zipcmp.html b/core/deps/libzip/man/zipcmp.html index ddb397e3d..93654497d 100644 --- a/core/deps/libzip/man/zipcmp.html +++ b/core/deps/libzip/man/zipcmp.html @@ -2,10 +2,10 @@ (4/2 = 2) - 1 = 1) --> 2 x Complex Number (2x2 components: r+i) for (int e = 0; e <= (elements / 2) - 1; e++) { + // Index == -1 indicates a vector/vector rather than vector/indexed-element + // operation. + int f = (index < 0) ? e : index; + switch (rot) { case 0: - element1 = src2.Float(index * 2); + element1 = src2.Float(f * 2); element2 = src1.Float(e * 2); - element3 = src2.Float(index * 2 + 1); + element3 = src2.Float(f * 2 + 1); element4 = src1.Float(e * 2); break; case 90: - element1 = FPNeg(src2.Float(index * 2 + 1)); + element1 = FPNeg(src2.Float(f * 2 + 1)); element2 = src1.Float(e * 2 + 1); - element3 = src2.Float(index * 2); + element3 = src2.Float(f * 2); element4 = src1.Float(e * 2 + 1); break; case 180: - element1 = FPNeg(src2.Float(index * 2)); + element1 = FPNeg(src2.Float(f * 2)); element2 = src1.Float(e * 2); - element3 = FPNeg(src2.Float(index * 2 + 1)); + element3 = FPNeg(src2.Float(f * 2 + 1)); element4 = src1.Float(e * 2); break; case 270: - element1 = src2.Float(index * 2 + 1); + element1 = src2.Float(f * 2 + 1); element2 = src1.Float(e * 2 + 1); - element3 = FPNeg(src2.Float(index * 2)); + element3 = FPNeg(src2.Float(f * 2)); element4 = src1.Float(e * 2 + 1); break; default: @@ -2331,63 +2673,28 @@ LogicVRegister Simulator::fcmla(VectorFormat vform, return dst; // prevents "element(n) may be unintialized" errors } dst.ClearForWrite(vform); - dst.SetFloat(e * 2, FPMulAdd(dst.Float(e * 2), element2, element1)); - dst.SetFloat(e * 2 + 1, - FPMulAdd(dst.Float(e * 2 + 1), element4, element3)); + dst.SetFloat(vform, + e * 2, + FPMulAdd(acc.Float(e * 2), element2, element1)); + dst.SetFloat(vform, + e * 2 + 1, + FPMulAdd(acc.Float(e * 2 + 1), element4, element3)); } return dst; } - -template LogicVRegister Simulator::fcmla(VectorFormat vform, - LogicVRegister dst, // d - const LogicVRegister& src1, // n - const LogicVRegister& src2, // m + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + const LogicVRegister& acc, int rot) { - int elements = LaneCountFromFormat(vform); - - T element1, element2, element3, element4; - rot *= 90; - - // Loop example: - // 2S --> (2/2 = 1 - 1 = 0) --> 1 x Complex Number (2x components: r+i) - // 4S --> (4/2 = 2) - 1 = 1) --> 2 x Complex Number (2x2 components: r+i) - - for (int e = 0; e <= (elements / 2) - 1; e++) { - switch (rot) { - case 0: - element1 = src2.Float(e * 2); - element2 = src1.Float(e * 2); - element3 = src2.Float(e * 2 + 1); - element4 = src1.Float(e * 2); - break; - case 90: - element1 = FPNeg(src2.Float(e * 2 + 1)); - element2 = src1.Float(e * 2 + 1); - element3 = src2.Float(e * 2); - element4 = src1.Float(e * 2 + 1); - break; - case 180: - element1 = FPNeg(src2.Float(e * 2)); - element2 = src1.Float(e * 2); - element3 = FPNeg(src2.Float(e * 2 + 1)); - element4 = src1.Float(e * 2); - break; - case 270: - element1 = src2.Float(e * 2 + 1); - element2 = src1.Float(e * 2 + 1); - element3 = FPNeg(src2.Float(e * 2)); - element4 = src1.Float(e * 2 + 1); - break; - default: - VIXL_UNREACHABLE(); - return dst; // prevents "element(n) may be unintialized" errors - } - dst.ClearForWrite(vform); - dst.SetFloat(e * 2, FPMulAdd(dst.Float(e * 2), element2, element1)); - dst.SetFloat(e * 2 + 1, - FPMulAdd(dst.Float(e * 2 + 1), element4, element3)); + if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { + fcmla(vform, dst, src1, src2, acc, -1, rot); + } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { + fcmla(vform, dst, src1, src2, acc, -1, rot); + } else { + fcmla(vform, dst, src1, src2, acc, -1, rot); } return dst; } @@ -2397,56 +2704,263 @@ LogicVRegister Simulator::fcmla(VectorFormat vform, LogicVRegister dst, // d const LogicVRegister& src1, // n const LogicVRegister& src2, // m + int index, int rot) { if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { VIXL_UNIMPLEMENTED(); } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - fcmla(vform, dst, src1, src2, rot); + fcmla(vform, dst, src1, src2, dst, index, rot); } else { - fcmla(vform, dst, src1, src2, rot); + fcmla(vform, dst, src1, src2, dst, index, rot); } return dst; } +LogicVRegister Simulator::cadd(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot, + bool saturate) { + SimVRegister src1_r, src1_i; + SimVRegister src2_r, src2_i; + SimVRegister zero; + zero.Clear(); + uzp1(vform, src1_r, src1, zero); + uzp2(vform, src1_i, src1, zero); + uzp1(vform, src2_r, src2, zero); + uzp2(vform, src2_i, src2, zero); + + if (rot == 90) { + if (saturate) { + sub(vform, src1_r, src1_r, src2_i).SignedSaturate(vform); + add(vform, src1_i, src1_i, src2_r).SignedSaturate(vform); + } else { + sub(vform, src1_r, src1_r, src2_i); + add(vform, src1_i, src1_i, src2_r); + } + } else { + VIXL_ASSERT(rot == 270); + if (saturate) { + add(vform, src1_r, src1_r, src2_i).SignedSaturate(vform); + sub(vform, src1_i, src1_i, src2_r).SignedSaturate(vform); + } else { + add(vform, src1_r, src1_r, src2_i); + sub(vform, src1_i, src1_i, src2_r); + } + } -LogicVRegister Simulator::fcmla(VectorFormat vform, - LogicVRegister dst, // d - const LogicVRegister& src1, // n - const LogicVRegister& src2, // m - int index, - int rot) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - VIXL_UNIMPLEMENTED(); - } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - fcmla(vform, dst, src1, src2, index, rot); + zip1(vform, dst, src1_r, src1_i); + return dst; +} + +LogicVRegister Simulator::cmla(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot) { + SimVRegister src1_a; + SimVRegister src2_a, src2_b; + SimVRegister srca_i, srca_r; + SimVRegister zero, temp; + zero.Clear(); + + if ((rot == 0) || (rot == 180)) { + uzp1(vform, src1_a, src1, zero); + uzp1(vform, src2_a, src2, zero); + uzp2(vform, src2_b, src2, zero); + } else { + uzp2(vform, src1_a, src1, zero); + uzp2(vform, src2_a, src2, zero); + uzp1(vform, src2_b, src2, zero); + } + + uzp1(vform, srca_r, srca, zero); + uzp2(vform, srca_i, srca, zero); + + bool sub_r = (rot == 90) || (rot == 180); + bool sub_i = (rot == 180) || (rot == 270); + + mul(vform, temp, src1_a, src2_a); + if (sub_r) { + sub(vform, srca_r, srca_r, temp); + } else { + add(vform, srca_r, srca_r, temp); + } + + mul(vform, temp, src1_a, src2_b); + if (sub_i) { + sub(vform, srca_i, srca_i, temp); } else { - fcmla(vform, dst, src1, src2, index, rot); + add(vform, srca_i, srca_i, temp); + } + + zip1(vform, dst, srca_r, srca_i); + return dst; +} + +LogicVRegister Simulator::cmla(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index, + int rot) { + SimVRegister temp; + dup_elements_to_segments(VectorFormatDoubleWidth(vform), temp, src2, index); + return cmla(vform, dst, srca, src1, temp, rot); +} + +LogicVRegister Simulator::bgrp(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool do_bext) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t value = src1.Uint(vform, i); + uint64_t mask = src2.Uint(vform, i); + int high_pos = 0; + int low_pos = 0; + uint64_t result_high = 0; + uint64_t result_low = 0; + for (unsigned j = 0; j < LaneSizeInBitsFromFormat(vform); j++) { + if ((mask & 1) == 0) { + result_high |= (value & 1) << high_pos; + high_pos++; + } else { + result_low |= (value & 1) << low_pos; + low_pos++; + } + mask >>= 1; + value >>= 1; + } + + if (!do_bext) { + result_low |= result_high << low_pos; + } + + dst.SetUint(vform, i, result_low); + } + return dst; +} + +LogicVRegister Simulator::bdep(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t value = src1.Uint(vform, i); + uint64_t mask = src2.Uint(vform, i); + uint64_t result = 0; + for (unsigned j = 0; j < LaneSizeInBitsFromFormat(vform); j++) { + if ((mask & 1) == 1) { + result |= (value & 1) << j; + value >>= 1; + } + mask >>= 1; + } + dst.SetUint(vform, i, result); } return dst; } +LogicVRegister Simulator::histogram(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool do_segmented) { + int elements_per_segment = kQRegSize / LaneSizeInBitsFromFormat(vform); + uint64_t result[kZRegMaxSizeInBytes]; + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t count = 0; + uint64_t value = src1.Uint(vform, i); + + int segment = do_segmented ? (i / elements_per_segment) : 0; + int segment_offset = segment * elements_per_segment; + int hist_limit = do_segmented ? elements_per_segment : (i + 1); + for (int j = 0; j < hist_limit; j++) { + if (pg.IsActive(vform, j) && + (value == src2.Uint(vform, j + segment_offset))) { + count++; + } + } + result[i] = count; + } + dst.SetUintArray(vform, result); + return dst; +} LogicVRegister Simulator::dup_element(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, int src_index) { - int laneCount = LaneCountFromFormat(vform); - uint64_t value = src.Uint(vform, src_index); + if ((vform == kFormatVnQ) || (vform == kFormatVnO)) { + // When duplicating an element larger than 64 bits, split the element into + // 64-bit parts, and duplicate the parts across the destination. + uint64_t d[4]; + int count = (vform == kFormatVnQ) ? 2 : 4; + for (int i = 0; i < count; i++) { + d[i] = src.Uint(kFormatVnD, (src_index * count) + i); + } + dst.Clear(); + for (int i = 0; i < LaneCountFromFormat(vform) * count; i++) { + dst.SetUint(kFormatVnD, i, d[i % count]); + } + } else { + int lane_count = LaneCountFromFormat(vform); + uint64_t value = src.Uint(vform, src_index); + dst.ClearForWrite(vform); + for (int i = 0; i < lane_count; ++i) { + dst.SetUint(vform, i, value); + } + } + return dst; +} + +LogicVRegister Simulator::dup_elements_to_segments(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int src_index) { + // In SVE, a segment is a 128-bit portion of a vector, like a Q register, + // whereas in NEON, the size of segment is equal to the size of register + // itself. + int segment_size = std::min(kQRegSize, RegisterSizeInBitsFromFormat(vform)); + VIXL_ASSERT(IsMultiple(segment_size, LaneSizeInBitsFromFormat(vform))); + int lanes_per_segment = segment_size / LaneSizeInBitsFromFormat(vform); + + VIXL_ASSERT(src_index >= 0); + VIXL_ASSERT(src_index < lanes_per_segment); + dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { - dst.SetUint(vform, i, value); + for (int j = 0; j < LaneCountFromFormat(vform); j += lanes_per_segment) { + uint64_t value = src.Uint(vform, j + src_index); + for (int i = 0; i < lanes_per_segment; i++) { + dst.SetUint(vform, j + i, value); + } } return dst; } +LogicVRegister Simulator::dup_elements_to_segments( + VectorFormat vform, + LogicVRegister dst, + const std::pair& src_and_index) { + return dup_elements_to_segments(vform, + dst, + ReadVRegister(src_and_index.first), + src_and_index.second); +} LogicVRegister Simulator::dup_immediate(VectorFormat vform, LogicVRegister dst, uint64_t imm) { - int laneCount = LaneCountFromFormat(vform); + int lane_count = LaneCountFromFormat(vform); uint64_t value = imm & MaxUintFromFormat(vform); dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, value); } return dst; @@ -2473,12 +2987,100 @@ LogicVRegister Simulator::ins_immediate(VectorFormat vform, } +LogicVRegister Simulator::index(VectorFormat vform, + LogicVRegister dst, + uint64_t start, + uint64_t step) { + VIXL_ASSERT(IsSVEFormat(vform)); + uint64_t value = start; + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + dst.SetUint(vform, i, value); + value += step; + } + return dst; +} + + +LogicVRegister Simulator::insr(VectorFormat vform, + LogicVRegister dst, + uint64_t imm) { + VIXL_ASSERT(IsSVEFormat(vform)); + for (int i = LaneCountFromFormat(vform) - 1; i > 0; i--) { + dst.SetUint(vform, i, dst.Uint(vform, i - 1)); + } + dst.SetUint(vform, 0, imm); + return dst; +} + + +LogicVRegister Simulator::mov(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + dst.ClearForWrite(vform); + for (int lane = 0; lane < LaneCountFromFormat(vform); lane++) { + dst.SetUint(vform, lane, src.Uint(vform, lane)); + } + return dst; +} + + +LogicPRegister Simulator::mov(LogicPRegister dst, const LogicPRegister& src) { + // Avoid a copy if the registers already alias. + if (dst.Aliases(src)) return dst; + + for (int i = 0; i < dst.GetChunkCount(); i++) { + dst.SetChunk(i, src.GetChunk(i)); + } + return dst; +} + + +LogicVRegister Simulator::mov_merging(VectorFormat vform, + LogicVRegister dst, + const SimPRegister& pg, + const LogicVRegister& src) { + return sel(vform, dst, pg, src, dst); +} + +LogicVRegister Simulator::mov_zeroing(VectorFormat vform, + LogicVRegister dst, + const SimPRegister& pg, + const LogicVRegister& src) { + SimVRegister zero; + dup_immediate(vform, zero, 0); + return sel(vform, dst, pg, src, zero); +} + +LogicVRegister Simulator::mov_alternating(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int start_at) { + VIXL_ASSERT((start_at == 0) || (start_at == 1)); + for (int i = start_at; i < LaneCountFromFormat(vform); i += 2) { + dst.SetUint(vform, i, src.Uint(vform, i)); + } + return dst; +} + +LogicPRegister Simulator::mov_merging(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src) { + return sel(dst, pg, src, dst); +} + +LogicPRegister Simulator::mov_zeroing(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src) { + SimPRegister all_false; + return sel(dst, pg, src, pfalse(all_false)); +} + LogicVRegister Simulator::movi(VectorFormat vform, LogicVRegister dst, uint64_t imm) { - int laneCount = LaneCountFromFormat(vform); + int lane_count = LaneCountFromFormat(vform); dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, imm); } return dst; @@ -2488,9 +3090,9 @@ LogicVRegister Simulator::movi(VectorFormat vform, LogicVRegister Simulator::mvni(VectorFormat vform, LogicVRegister dst, uint64_t imm) { - int laneCount = LaneCountFromFormat(vform); + int lane_count = LaneCountFromFormat(vform); dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, ~imm); } return dst; @@ -2502,12 +3104,12 @@ LogicVRegister Simulator::orr(VectorFormat vform, const LogicVRegister& src, uint64_t imm) { uint64_t result[16]; - int laneCount = LaneCountFromFormat(vform); - for (int i = 0; i < laneCount; ++i) { + int lane_count = LaneCountFromFormat(vform); + for (int i = 0; i < lane_count; ++i) { result[i] = src.Uint(vform, i) | imm; } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[i]); } return dst; @@ -2516,12 +3118,15 @@ LogicVRegister Simulator::orr(VectorFormat vform, LogicVRegister Simulator::uxtl(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src) { + const LogicVRegister& src, + bool is_2) { VectorFormat vform_half = VectorFormatHalfWidth(vform); + int lane_count = LaneCountFromFormat(vform); + int src_offset = is_2 ? lane_count : 0; dst.ClearForWrite(vform); - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - dst.SetUint(vform, i, src.Uint(vform_half, i)); + for (int i = 0; i < lane_count; i++) { + dst.SetUint(vform, i, src.Uint(vform_half, src_offset + i)); } return dst; } @@ -2529,12 +3134,15 @@ LogicVRegister Simulator::uxtl(VectorFormat vform, LogicVRegister Simulator::sxtl(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src) { + const LogicVRegister& src, + bool is_2) { VectorFormat vform_half = VectorFormatHalfWidth(vform); + int lane_count = LaneCountFromFormat(vform); + int src_offset = is_2 ? lane_count : 0; dst.ClearForWrite(vform); for (int i = 0; i < LaneCountFromFormat(vform); i++) { - dst.SetInt(vform, i, src.Int(vform_half, i)); + dst.SetInt(vform, i, src.Int(vform_half, src_offset + i)); } return dst; } @@ -2543,26 +3151,43 @@ LogicVRegister Simulator::sxtl(VectorFormat vform, LogicVRegister Simulator::uxtl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { - VectorFormat vform_half = VectorFormatHalfWidth(vform); + return uxtl(vform, dst, src, /* is_2 = */ true); +} + + +LogicVRegister Simulator::sxtl2(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + return sxtl(vform, dst, src, /* is_2 = */ true); +} + + +LogicVRegister Simulator::uxt(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + unsigned from_size_in_bits) { int lane_count = LaneCountFromFormat(vform); + uint64_t mask = GetUintMask(from_size_in_bits); dst.ClearForWrite(vform); for (int i = 0; i < lane_count; i++) { - dst.SetUint(vform, i, src.Uint(vform_half, lane_count + i)); + dst.SetInt(vform, i, src.Uint(vform, i) & mask); } return dst; } -LogicVRegister Simulator::sxtl2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src) { - VectorFormat vform_half = VectorFormatHalfWidth(vform); +LogicVRegister Simulator::sxt(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + unsigned from_size_in_bits) { int lane_count = LaneCountFromFormat(vform); dst.ClearForWrite(vform); for (int i = 0; i < lane_count; i++) { - dst.SetInt(vform, i, src.Int(vform_half, lane_count + i)); + uint64_t value = + ExtractSignedBitfield64(from_size_in_bits - 1, 0, src.Uint(vform, i)); + dst.SetInt(vform, i, value); } return dst; } @@ -2615,7 +3240,6 @@ LogicVRegister Simulator::rshrn2(VectorFormat vform, return extractnarrow(vformdst, dst, false, shifted_src, false); } - LogicVRegister Simulator::Table(VectorFormat vform, LogicVRegister dst, const LogicVRegister& ind, @@ -2625,24 +3249,30 @@ LogicVRegister Simulator::Table(VectorFormat vform, const LogicVRegister* tab3, const LogicVRegister* tab4) { VIXL_ASSERT(tab1 != NULL); - const LogicVRegister* tab[4] = {tab1, tab2, tab3, tab4}; - uint64_t result[kMaxLanesPerVector]; - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - result[i] = zero_out_of_bounds ? 0 : dst.Uint(kFormat16B, i); - } - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - uint64_t j = ind.Uint(vform, i); - int tab_idx = static_cast(j >> 4); - int j_idx = static_cast(j & 15); - if ((tab_idx < 4) && (tab[tab_idx] != NULL)) { - result[i] = tab[tab_idx]->Uint(kFormat16B, j_idx); - } + int lane_count = LaneCountFromFormat(vform); + VIXL_ASSERT((tab3 == NULL) || (lane_count <= 16)); + uint64_t table[kZRegMaxSizeInBytes * 2]; + uint64_t result[kZRegMaxSizeInBytes]; + + // For Neon, the table source registers are always 16B, and Neon allows only + // 8B or 16B vform for the destination, so infer the table format from the + // destination. + VectorFormat vform_tab = (vform == kFormat8B) ? kFormat16B : vform; + + uint64_t tab_size = tab1->UintArray(vform_tab, &table[0]); + if (tab2 != NULL) tab_size += tab2->UintArray(vform_tab, &table[tab_size]); + if (tab3 != NULL) tab_size += tab3->UintArray(vform_tab, &table[tab_size]); + if (tab4 != NULL) tab_size += tab4->UintArray(vform_tab, &table[tab_size]); + + for (int i = 0; i < lane_count; i++) { + uint64_t index = ind.Uint(vform, i); + result[i] = zero_out_of_bounds ? 0 : dst.Uint(vform, i); + if (index < tab_size) result[i] = table[index]; } dst.SetUintArray(vform, result); return dst; } - LogicVRegister Simulator::tbl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& tab, @@ -3130,10 +3760,11 @@ LogicVRegister Simulator::sabdl2(VectorFormat vform, LogicVRegister Simulator::umull(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - uxtl(vform, temp1, src1); - uxtl(vform, temp2, src2); + uxtl(vform, temp1, src1, is_2); + uxtl(vform, temp2, src2, is_2); mul(vform, dst, temp1, temp2); return dst; } @@ -3143,21 +3774,18 @@ LogicVRegister Simulator::umull2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - uxtl2(vform, temp1, src1); - uxtl2(vform, temp2, src2); - mul(vform, dst, temp1, temp2); - return dst; + return umull(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::smull(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - sxtl(vform, temp1, src1); - sxtl(vform, temp2, src2); + sxtl(vform, temp1, src1, is_2); + sxtl(vform, temp2, src2, is_2); mul(vform, dst, temp1, temp2); return dst; } @@ -3167,22 +3795,19 @@ LogicVRegister Simulator::smull2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - sxtl2(vform, temp1, src1); - sxtl2(vform, temp2, src2); - mul(vform, dst, temp1, temp2); - return dst; + return smull(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::umlsl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - uxtl(vform, temp1, src1); - uxtl(vform, temp2, src2); - mls(vform, dst, temp1, temp2); + uxtl(vform, temp1, src1, is_2); + uxtl(vform, temp2, src2, is_2); + mls(vform, dst, dst, temp1, temp2); return dst; } @@ -3191,22 +3816,19 @@ LogicVRegister Simulator::umlsl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - uxtl2(vform, temp1, src1); - uxtl2(vform, temp2, src2); - mls(vform, dst, temp1, temp2); - return dst; + return umlsl(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::smlsl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - sxtl(vform, temp1, src1); - sxtl(vform, temp2, src2); - mls(vform, dst, temp1, temp2); + sxtl(vform, temp1, src1, is_2); + sxtl(vform, temp2, src2, is_2); + mls(vform, dst, dst, temp1, temp2); return dst; } @@ -3215,22 +3837,19 @@ LogicVRegister Simulator::smlsl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - sxtl2(vform, temp1, src1); - sxtl2(vform, temp2, src2); - mls(vform, dst, temp1, temp2); - return dst; + return smlsl(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::umlal(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - uxtl(vform, temp1, src1); - uxtl(vform, temp2, src2); - mla(vform, dst, temp1, temp2); + uxtl(vform, temp1, src1, is_2); + uxtl(vform, temp2, src2, is_2); + mla(vform, dst, dst, temp1, temp2); return dst; } @@ -3239,22 +3858,19 @@ LogicVRegister Simulator::umlal2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - uxtl2(vform, temp1, src1); - uxtl2(vform, temp2, src2); - mla(vform, dst, temp1, temp2); - return dst; + return umlal(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::smlal(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp1, temp2; - sxtl(vform, temp1, src1); - sxtl(vform, temp2, src2); - mla(vform, dst, temp1, temp2); + sxtl(vform, temp1, src1, is_2); + sxtl(vform, temp2, src2, is_2); + mla(vform, dst, dst, temp1, temp2); return dst; } @@ -3263,20 +3879,17 @@ LogicVRegister Simulator::smlal2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp1, temp2; - sxtl2(vform, temp1, src1); - sxtl2(vform, temp2, src2); - mla(vform, dst, temp1, temp2); - return dst; + return smlal(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::sqdmlal(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp; - LogicVRegister product = sqdmull(vform, temp, src1, src2); + LogicVRegister product = sqdmull(vform, temp, src1, src2, is_2); return add(vform, dst, dst, product).SignedSaturate(vform); } @@ -3285,18 +3898,17 @@ LogicVRegister Simulator::sqdmlal2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp; - LogicVRegister product = sqdmull2(vform, temp, src1, src2); - return add(vform, dst, dst, product).SignedSaturate(vform); + return sqdmlal(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::sqdmlsl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp; - LogicVRegister product = sqdmull(vform, temp, src1, src2); + LogicVRegister product = sqdmull(vform, temp, src1, src2, is_2); return sub(vform, dst, dst, product).SignedSaturate(vform); } @@ -3305,18 +3917,17 @@ LogicVRegister Simulator::sqdmlsl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp; - LogicVRegister product = sqdmull2(vform, temp, src1, src2); - return sub(vform, dst, dst, product).SignedSaturate(vform); + return sqdmlsl(vform, dst, src1, src2, /* is_2 = */ true); } LogicVRegister Simulator::sqdmull(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2) { + const LogicVRegister& src2, + bool is_2) { SimVRegister temp; - LogicVRegister product = smull(vform, temp, src1, src2); + LogicVRegister product = smull(vform, temp, src1, src2, is_2); return add(vform, dst, product, product).SignedSaturate(vform); } @@ -3325,38 +3936,49 @@ LogicVRegister Simulator::sqdmull2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - SimVRegister temp; - LogicVRegister product = smull2(vform, temp, src1, src2); - return add(vform, dst, product, product).SignedSaturate(vform); + return sqdmull(vform, dst, src1, src2, /* is_2 = */ true); } - LogicVRegister Simulator::sqrdmulh(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, bool round) { - // 2 * INT_32_MIN * INT_32_MIN causes int64_t to overflow. - // To avoid this, we use (src1 * src2 + 1 << (esize - 2)) >> (esize - 1) - // which is same as (2 * src1 * src2 + 1 << (esize - 1)) >> esize. - int esize = LaneSizeInBitsFromFormat(vform); - int round_const = round ? (1 << (esize - 2)) : 0; - int64_t product; + SimVRegister temp_lo, temp_hi; + + // Compute low and high multiplication results. + mul(vform, temp_lo, src1, src2); + smulh(vform, temp_hi, src1, src2); + + // Double by shifting high half, and adding in most-significant bit of low + // half. + shl(vform, temp_hi, temp_hi, 1); + usra(vform, temp_hi, temp_lo, esize - 1); + + if (round) { + // Add the second (due to doubling) most-significant bit of the low half + // into the result. + shl(vform, temp_lo, temp_lo, 1); + usra(vform, temp_hi, temp_lo, esize - 1); + } + + SimPRegister not_sat; + LogicPRegister ptemp(not_sat); dst.ClearForWrite(vform); for (int i = 0; i < LaneCountFromFormat(vform); i++) { - product = src1.Int(vform, i) * src2.Int(vform, i); - product += round_const; - product = product >> (esize - 1); - - if (product > MaxIntFromFormat(vform)) { - product = MaxIntFromFormat(vform); - } else if (product < MinIntFromFormat(vform)) { - product = MinIntFromFormat(vform); + // Saturation only occurs when src1 = src2 = minimum representable value. + // Check this as a special case. + ptemp.SetActive(vform, i, true); + if ((src1.Int(vform, i) == MinIntFromFormat(vform)) && + (src2.Int(vform, i) == MinIntFromFormat(vform))) { + ptemp.SetActive(vform, i, false); } - dst.SetInt(vform, i, product); + dst.SetInt(vform, i, MaxIntFromFormat(vform)); } + + mov_merging(vform, dst, not_sat, temp_hi); return dst; } @@ -3365,28 +3987,30 @@ LogicVRegister Simulator::dot(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, - bool is_signed) { + bool is_src1_signed, + bool is_src2_signed) { VectorFormat quarter_vform = VectorFormatHalfWidthDoubleLanes(VectorFormatHalfWidthDoubleLanes(vform)); dst.ClearForWrite(vform); for (int e = 0; e < LaneCountFromFormat(vform); e++) { - int64_t result = 0; + uint64_t result = 0; int64_t element1, element2; for (int i = 0; i < 4; i++) { int index = 4 * e + i; - if (is_signed) { + if (is_src1_signed) { element1 = src1.Int(quarter_vform, index); - element2 = src2.Int(quarter_vform, index); } else { element1 = src1.Uint(quarter_vform, index); + } + if (is_src2_signed) { + element2 = src2.Int(quarter_vform, index); + } else { element2 = src2.Uint(quarter_vform, index); } result += element1 * element2; } - - result += dst.Int(vform, e); - dst.SetInt(vform, e, result); + dst.SetUint(vform, e, result + dst.Uint(vform, e)); } return dst; } @@ -3396,7 +4020,7 @@ LogicVRegister Simulator::sdot(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - return dot(vform, dst, src1, src2, true); + return dot(vform, dst, src1, src2, true, true); } @@ -3404,9 +4028,148 @@ LogicVRegister Simulator::udot(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - return dot(vform, dst, src1, src2, false); + return dot(vform, dst, src1, src2, false, false); +} + +LogicVRegister Simulator::usdot(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + return dot(vform, dst, src1, src2, false, true); +} + +LogicVRegister Simulator::cdot(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& acc, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot) { + VIXL_ASSERT((rot == 0) || (rot == 90) || (rot == 180) || (rot == 270)); + VectorFormat quarter_vform = + VectorFormatHalfWidthDoubleLanes(VectorFormatHalfWidthDoubleLanes(vform)); + + int sel_a = ((rot == 0) || (rot == 180)) ? 0 : 1; + int sel_b = 1 - sel_a; + int sub_i = ((rot == 90) || (rot == 180)) ? 1 : -1; + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + int64_t result = acc.Int(vform, i); + for (int j = 0; j < 2; j++) { + int64_t r1 = src1.Int(quarter_vform, (4 * i) + (2 * j) + 0); + int64_t i1 = src1.Int(quarter_vform, (4 * i) + (2 * j) + 1); + int64_t r2 = src2.Int(quarter_vform, (4 * i) + (2 * j) + sel_a); + int64_t i2 = src2.Int(quarter_vform, (4 * i) + (2 * j) + sel_b); + result += (r1 * r2) + (sub_i * i1 * i2); + } + dst.SetInt(vform, i, result); + } + return dst; +} + +LogicVRegister Simulator::sqrdcmlah(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot) { + SimVRegister src1_a, src1_b; + SimVRegister src2_a, src2_b; + SimVRegister srca_i, srca_r; + SimVRegister zero, temp; + zero.Clear(); + + if ((rot == 0) || (rot == 180)) { + uzp1(vform, src1_a, src1, zero); + uzp1(vform, src2_a, src2, zero); + uzp2(vform, src2_b, src2, zero); + } else { + uzp2(vform, src1_a, src1, zero); + uzp2(vform, src2_a, src2, zero); + uzp1(vform, src2_b, src2, zero); + } + + uzp1(vform, srca_r, srca, zero); + uzp2(vform, srca_i, srca, zero); + + bool sub_r = (rot == 90) || (rot == 180); + bool sub_i = (rot == 180) || (rot == 270); + + const bool round = true; + sqrdmlash(vform, srca_r, src1_a, src2_a, round, sub_r); + sqrdmlash(vform, srca_i, src1_a, src2_b, round, sub_i); + zip1(vform, dst, srca_r, srca_i); + return dst; +} + +LogicVRegister Simulator::sqrdcmlah(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index, + int rot) { + SimVRegister temp; + dup_elements_to_segments(VectorFormatDoubleWidth(vform), temp, src2, index); + return sqrdcmlah(vform, dst, srca, src1, temp, rot); } +LogicVRegister Simulator::sqrdmlash_d(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool round, + bool sub_op) { + // 2 * INT_64_MIN * INT_64_MIN causes INT_128 to overflow. + // To avoid this, we use: + // (dst << (esize - 1) + src1 * src2 + 1 << (esize - 2)) >> (esize - 1) + // which is same as: + // (dst << esize + 2 * src1 * src2 + 1 << (esize - 1)) >> esize. + + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); + int esize = kDRegSize; + vixl_uint128_t round_const, accum; + round_const.first = 0; + if (round) { + round_const.second = UINT64_C(1) << (esize - 2); + } else { + round_const.second = 0; + } + + dst.ClearForWrite(vform); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + // Shift the whole value left by `esize - 1` bits. + accum.first = dst.Int(vform, i) >> 1; + accum.second = dst.Int(vform, i) << (esize - 1); + + vixl_uint128_t product = Mul64(src1.Int(vform, i), src2.Int(vform, i)); + + if (sub_op) { + product = Neg128(product); + } + accum = Add128(accum, product); + + // Perform rounding. + accum = Add128(accum, round_const); + + // Arithmetic shift the whole value right by `esize - 1` bits. + accum.second = (accum.first << 1) | (accum.second >> (esize - 1)); + accum.first = -(accum.first >> (esize - 1)); + + // Perform saturation. + bool is_pos = (accum.first == 0) ? true : false; + if (is_pos && + (accum.second > static_cast(MaxIntFromFormat(vform)))) { + accum.second = MaxIntFromFormat(vform); + } else if (!is_pos && (accum.second < + static_cast(MinIntFromFormat(vform)))) { + accum.second = MinIntFromFormat(vform); + } + + dst.SetInt(vform, i, accum.second); + } + + return dst; +} LogicVRegister Simulator::sqrdmlash(VectorFormat vform, LogicVRegister dst, @@ -3420,6 +4183,10 @@ LogicVRegister Simulator::sqrdmlash(VectorFormat vform, // which is same as: // (dst << esize + 2 * src1 * src2 + 1 << (esize - 1)) >> esize. + if (vform == kFormatVnD) { + return sqrdmlash_d(vform, dst, src1, src2, round, sub_op); + } + int esize = LaneSizeInBitsFromFormat(vform); int round_const = round ? (1 << (esize - 2)) : 0; int64_t accum; @@ -3564,16 +4331,16 @@ LogicVRegister Simulator::trn1(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[16]; - int laneCount = LaneCountFromFormat(vform); - int pairs = laneCount / 2; + uint64_t result[kZRegMaxSizeInBytes] = {}; + int lane_count = LaneCountFromFormat(vform); + int pairs = lane_count / 2; for (int i = 0; i < pairs; ++i) { result[2 * i] = src1.Uint(vform, 2 * i); result[(2 * i) + 1] = src2.Uint(vform, 2 * i); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[i]); } return dst; @@ -3584,16 +4351,16 @@ LogicVRegister Simulator::trn2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[16]; - int laneCount = LaneCountFromFormat(vform); - int pairs = laneCount / 2; + uint64_t result[kZRegMaxSizeInBytes] = {}; + int lane_count = LaneCountFromFormat(vform); + int pairs = lane_count / 2; for (int i = 0; i < pairs; ++i) { result[2 * i] = src1.Uint(vform, (2 * i) + 1); result[(2 * i) + 1] = src2.Uint(vform, (2 * i) + 1); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[i]); } return dst; @@ -3604,16 +4371,16 @@ LogicVRegister Simulator::zip1(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[16]; - int laneCount = LaneCountFromFormat(vform); - int pairs = laneCount / 2; + uint64_t result[kZRegMaxSizeInBytes] = {}; + int lane_count = LaneCountFromFormat(vform); + int pairs = lane_count / 2; for (int i = 0; i < pairs; ++i) { result[2 * i] = src1.Uint(vform, i); result[(2 * i) + 1] = src2.Uint(vform, i); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[i]); } return dst; @@ -3624,16 +4391,16 @@ LogicVRegister Simulator::zip2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[16]; - int laneCount = LaneCountFromFormat(vform); - int pairs = laneCount / 2; + uint64_t result[kZRegMaxSizeInBytes] = {}; + int lane_count = LaneCountFromFormat(vform); + int pairs = lane_count / 2; for (int i = 0; i < pairs; ++i) { result[2 * i] = src1.Uint(vform, pairs + i); result[(2 * i) + 1] = src2.Uint(vform, pairs + i); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[i]); } return dst; @@ -3644,15 +4411,15 @@ LogicVRegister Simulator::uzp1(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[32]; - int laneCount = LaneCountFromFormat(vform); - for (int i = 0; i < laneCount; ++i) { + uint64_t result[kZRegMaxSizeInBytes * 2]; + int lane_count = LaneCountFromFormat(vform); + for (int i = 0; i < lane_count; ++i) { result[i] = src1.Uint(vform, i); - result[laneCount + i] = src2.Uint(vform, i); + result[lane_count + i] = src2.Uint(vform, i); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[2 * i]); } return dst; @@ -3663,20 +4430,41 @@ LogicVRegister Simulator::uzp2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2) { - uint64_t result[32]; - int laneCount = LaneCountFromFormat(vform); - for (int i = 0; i < laneCount; ++i) { + uint64_t result[kZRegMaxSizeInBytes * 2]; + int lane_count = LaneCountFromFormat(vform); + for (int i = 0; i < lane_count; ++i) { result[i] = src1.Uint(vform, i); - result[laneCount + i] = src2.Uint(vform, i); + result[lane_count + i] = src2.Uint(vform, i); } dst.ClearForWrite(vform); - for (int i = 0; i < laneCount; ++i) { + for (int i = 0; i < lane_count; ++i) { dst.SetUint(vform, i, result[(2 * i) + 1]); } return dst; } +LogicVRegister Simulator::interleave_top_bottom(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + // Interleave the top and bottom half of a vector, ie. for a vector: + // + // [ ... | F | D | B | ... | E | C | A ] + // + // where B is the first element in the top half of the vector, produce a + // result vector: + // + // [ ... | ... | F | E | D | C | B | A ] + + uint64_t result[kZRegMaxSizeInBytes] = {}; + int lane_count = LaneCountFromFormat(vform); + for (int i = 0; i < lane_count; i += 2) { + result[i] = src.Uint(vform, i / 2); + result[i + 1] = src.Uint(vform, (lane_count / 2) + (i / 2)); + } + dst.SetUintArray(vform, result); + return dst; +} template T Simulator::FPNeg(T op) { @@ -3716,6 +4504,11 @@ T Simulator::FPSub(T op1, T op2) { } } +template +T Simulator::FPMulNaNs(T op1, T op2) { + T result = FPProcessNaNs(op1, op2); + return IsNaN(result) ? result : FPMul(op1, op2); +} template T Simulator::FPMul(T op1, T op2) { @@ -4006,14 +4799,10 @@ int32_t Simulator::FPToFixedJS(double value) { return result; } - -double Simulator::FPRoundInt(double value, FPRounding round_mode) { - if ((value == 0.0) || (value == kFP64PositiveInfinity) || - (value == kFP64NegativeInfinity)) { - return value; - } else if (IsNaN(value)) { - return FPProcessNaN(value); - } +double Simulator::FPRoundIntCommon(double value, FPRounding round_mode) { + VIXL_ASSERT((value != kFP64PositiveInfinity) && + (value != kFP64NegativeInfinity)); + VIXL_ASSERT(!IsNaN(value)); double int_result = std::floor(value); double error = value - int_result; @@ -4075,6 +4864,59 @@ double Simulator::FPRoundInt(double value, FPRounding round_mode) { return int_result; } +double Simulator::FPRoundInt(double value, FPRounding round_mode) { + if ((value == 0.0) || (value == kFP64PositiveInfinity) || + (value == kFP64NegativeInfinity)) { + return value; + } else if (IsNaN(value)) { + return FPProcessNaN(value); + } + return FPRoundIntCommon(value, round_mode); +} + +double Simulator::FPRoundInt(double value, + FPRounding round_mode, + FrintMode frint_mode) { + if (frint_mode == kFrintToInteger) { + return FPRoundInt(value, round_mode); + } + + VIXL_ASSERT((frint_mode == kFrintToInt32) || (frint_mode == kFrintToInt64)); + + if (value == 0.0) { + return value; + } + + if ((value == kFP64PositiveInfinity) || (value == kFP64NegativeInfinity) || + IsNaN(value)) { + if (frint_mode == kFrintToInt32) { + return INT32_MIN; + } else { + return INT64_MIN; + } + } + + double result = FPRoundIntCommon(value, round_mode); + + // We want to compare `result > INT64_MAX` below, but INT64_MAX isn't exactly + // representable as a double, and is rounded to (INT64_MAX + 1) when + // converted. To avoid this, we compare `result >= int64_max_plus_one` + // instead; this is safe because `result` is known to be integral, and + // `int64_max_plus_one` is exactly representable as a double. + constexpr uint64_t int64_max_plus_one = static_cast(INT64_MAX) + 1; + VIXL_STATIC_ASSERT(static_cast(static_cast( + int64_max_plus_one)) == int64_max_plus_one); + + if (frint_mode == kFrintToInt32) { + if ((result > INT32_MAX) || (result < INT32_MIN)) { + return INT32_MIN; + } + } else if ((result >= int64_max_plus_one) || (result < INT64_MIN)) { + return INT64_MIN; + } + + return result; +} int16_t Simulator::FPToInt16(double value, FPRounding rmode) { value = FPRoundInt(value, rmode); @@ -4100,7 +4942,9 @@ int32_t Simulator::FPToInt32(double value, FPRounding rmode) { int64_t Simulator::FPToInt64(double value, FPRounding rmode) { value = FPRoundInt(value, rmode); - if (value >= kXMaxInt) { + // This is equivalent to "if (value >= kXMaxInt)" but avoids rounding issues + // as a result of kMaxInt not being representable as a double. + if (value >= 9223372036854775808.) { return kXMaxInt; } else if (value < kXMinInt) { return kXMinInt; @@ -4133,7 +4977,9 @@ uint32_t Simulator::FPToUInt32(double value, FPRounding rmode) { uint64_t Simulator::FPToUInt64(double value, FPRounding rmode) { value = FPRoundInt(value, rmode); - if (value >= kXMaxUInt) { + // This is equivalent to "if (value >= kXMaxUInt)" but avoids rounding issues + // as a result of kMaxUInt not being representable as a double. + if (value >= 18446744073709551616.) { return kXMaxUInt; } else if (value < 0.0) { return 0; @@ -4161,7 +5007,7 @@ uint64_t Simulator::FPToUInt64(double value, FPRounding rmode) { } else { \ result = OP(op1, op2); \ } \ - dst.SetFloat(i, result); \ + dst.SetFloat(vform, i, result); \ } \ return dst; \ } \ @@ -4204,7 +5050,7 @@ LogicVRegister Simulator::frecps(VectorFormat vform, T op1 = -src1.Float(i); T op2 = src2.Float(i); T result = FPProcessNaNs(op1, op2); - dst.SetFloat(i, IsNaN(result) ? result : FPRecipStepFused(op1, op2)); + dst.SetFloat(vform, i, IsNaN(result) ? result : FPRecipStepFused(op1, op2)); } return dst; } @@ -4236,7 +5082,7 @@ LogicVRegister Simulator::frsqrts(VectorFormat vform, T op1 = -src1.Float(i); T op2 = src2.Float(i); T result = FPProcessNaNs(op1, op2); - dst.SetFloat(i, IsNaN(result) ? result : FPRSqrtStepFused(op1, op2)); + dst.SetFloat(vform, i, IsNaN(result) ? result : FPRSqrtStepFused(op1, op2)); } return dst; } @@ -4269,29 +5115,41 @@ LogicVRegister Simulator::fcmp(VectorFormat vform, bool result = false; T op1 = src1.Float(i); T op2 = src2.Float(i); - T nan_result = FPProcessNaNs(op1, op2); - if (!IsNaN(nan_result)) { - switch (cond) { - case eq: - result = (op1 == op2); - break; - case ge: - result = (op1 >= op2); - break; - case gt: - result = (op1 > op2); - break; - case le: - result = (op1 <= op2); - break; - case lt: - result = (op1 < op2); - break; - default: - VIXL_UNREACHABLE(); - break; - } + bool unordered = IsNaN(FPProcessNaNs(op1, op2)); + + switch (cond) { + case eq: + result = (op1 == op2); + break; + case ge: + result = (op1 >= op2); + break; + case gt: + result = (op1 > op2); + break; + case le: + result = (op1 <= op2); + break; + case lt: + result = (op1 < op2); + break; + case ne: + result = (op1 != op2); + break; + case uo: + result = unordered; + break; + default: + // Other conditions are defined in terms of those above. + VIXL_UNREACHABLE(); + break; + } + + if (result && unordered) { + // Only `uo` and `ne` can be true for unordered comparisons. + VIXL_ASSERT((cond == uo) || (cond == ne)); } + dst.SetUint(vform, i, result ? MaxUintFromFormat(vform) : 0); } return dst; @@ -4363,15 +5221,16 @@ LogicVRegister Simulator::fabscmp(VectorFormat vform, template LogicVRegister Simulator::fmla(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2) { dst.ClearForWrite(vform); for (int i = 0; i < LaneCountFromFormat(vform); i++) { T op1 = src1.Float(i); T op2 = src2.Float(i); - T acc = dst.Float(i); + T acc = srca.Float(i); T result = FPMulAdd(acc, op1, op2); - dst.SetFloat(i, result); + dst.SetFloat(vform, i, result); } return dst; } @@ -4379,15 +5238,16 @@ LogicVRegister Simulator::fmla(VectorFormat vform, LogicVRegister Simulator::fmla(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2) { if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - fmla(vform, dst, src1, src2); + fmla(vform, dst, srca, src1, src2); } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - fmla(vform, dst, src1, src2); + fmla(vform, dst, srca, src1, src2); } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - fmla(vform, dst, src1, src2); + fmla(vform, dst, srca, src1, src2); } return dst; } @@ -4396,13 +5256,14 @@ LogicVRegister Simulator::fmla(VectorFormat vform, template LogicVRegister Simulator::fmls(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2) { dst.ClearForWrite(vform); for (int i = 0; i < LaneCountFromFormat(vform); i++) { T op1 = -src1.Float(i); T op2 = src2.Float(i); - T acc = dst.Float(i); + T acc = srca.Float(i); T result = FPMulAdd(acc, op1, op2); dst.SetFloat(i, result); } @@ -4412,15 +5273,16 @@ LogicVRegister Simulator::fmls(VectorFormat vform, LogicVRegister Simulator::fmls(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2) { if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - fmls(vform, dst, src1, src2); + fmls(vform, dst, srca, src1, src2); } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - fmls(vform, dst, src1, src2); + fmls(vform, dst, srca, src1, src2); } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - fmls(vform, dst, src1, src2); + fmls(vform, dst, srca, src1, src2); } return dst; } @@ -4675,6 +5537,9 @@ LogicVRegister Simulator::fsqrt(VectorFormat vform, uzp1(vform, temp1, src1, src2); \ uzp2(vform, temp2, src1, src2); \ FN(vform, dst, temp1, temp2); \ + if (IsSVEFormat(vform)) { \ + interleave_top_bottom(vform, dst, dst); \ + } \ return dst; \ } \ \ @@ -4700,75 +5565,131 @@ NEON_FPPAIRWISE_LIST(DEFINE_NEON_FP_PAIR_OP) #undef DEFINE_NEON_FP_PAIR_OP template -LogicVRegister Simulator::fminmaxv(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src, - typename TFPMinMaxOp::type Op) { - VIXL_ASSERT((vform == kFormat4H) || (vform == kFormat8H) || - (vform == kFormat4S)); - USE(vform); - T result1 = (this->*Op)(src.Float(0), src.Float(1)); - T result2 = (this->*Op)(src.Float(2), src.Float(3)); - if (vform == kFormat8H) { - T result3 = (this->*Op)(src.Float(4), src.Float(5)); - T result4 = (this->*Op)(src.Float(6), src.Float(7)); - result1 = (this->*Op)(result1, result3); - result2 = (this->*Op)(result2, result4); - } - T result = (this->*Op)(result1, result2); +LogicVRegister Simulator::FPPairedAcrossHelper(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + typename TFPPairOp::type fn, + uint64_t inactive_value) { + int lane_count = LaneCountFromFormat(vform); + T result[kZRegMaxSizeInBytes / sizeof(T)]; + // Copy the source vector into a working array. Initialise the unused elements + // at the end of the array to the same value that a false predicate would set. + for (int i = 0; i < static_cast(ArrayLength(result)); i++) { + result[i] = (i < lane_count) + ? src.Float(i) + : RawbitsWithSizeToFP(sizeof(T) * 8, inactive_value); + } + + // Pairwise reduce the elements to a single value, using the pair op function + // argument. + for (int step = 1; step < lane_count; step *= 2) { + for (int i = 0; i < lane_count; i += step * 2) { + result[i] = (this->*fn)(result[i], result[i + step]); + } + } dst.ClearForWrite(ScalarFormatFromFormat(vform)); - dst.SetFloat(0, result); - return dst; + dst.SetFloat(0, result[0]); + return dst; +} + +LogicVRegister Simulator::FPPairedAcrossHelper( + VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + typename TFPPairOp::type fn16, + typename TFPPairOp::type fn32, + typename TFPPairOp::type fn64, + uint64_t inactive_value) { + switch (LaneSizeInBitsFromFormat(vform)) { + case kHRegSize: + return FPPairedAcrossHelper(vform, + dst, + src, + fn16, + inactive_value); + case kSRegSize: + return FPPairedAcrossHelper(vform, dst, src, fn32, inactive_value); + default: + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); + return FPPairedAcrossHelper(vform, + dst, + src, + fn64, + inactive_value); + } } +LogicVRegister Simulator::faddv(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + return FPPairedAcrossHelper(vform, + dst, + src, + &Simulator::FPAdd, + &Simulator::FPAdd, + &Simulator::FPAdd, + 0); +} LogicVRegister Simulator::fmaxv(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - return fminmaxv(vform, dst, src, &Simulator::FPMax); - } else { - return fminmaxv(vform, dst, src, &Simulator::FPMax); - } + int lane_size = LaneSizeInBitsFromFormat(vform); + uint64_t inactive_value = + FPToRawbitsWithSize(lane_size, kFP64NegativeInfinity); + return FPPairedAcrossHelper(vform, + dst, + src, + &Simulator::FPMax, + &Simulator::FPMax, + &Simulator::FPMax, + inactive_value); } LogicVRegister Simulator::fminv(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - return fminmaxv(vform, dst, src, &Simulator::FPMin); - } else { - return fminmaxv(vform, dst, src, &Simulator::FPMin); - } + int lane_size = LaneSizeInBitsFromFormat(vform); + uint64_t inactive_value = + FPToRawbitsWithSize(lane_size, kFP64PositiveInfinity); + return FPPairedAcrossHelper(vform, + dst, + src, + &Simulator::FPMin, + &Simulator::FPMin, + &Simulator::FPMin, + inactive_value); } LogicVRegister Simulator::fmaxnmv(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - return fminmaxv(vform, - dst, - src, - &Simulator::FPMaxNM); - } else { - return fminmaxv(vform, dst, src, &Simulator::FPMaxNM); - } + int lane_size = LaneSizeInBitsFromFormat(vform); + uint64_t inactive_value = FPToRawbitsWithSize(lane_size, kFP64DefaultNaN); + return FPPairedAcrossHelper(vform, + dst, + src, + &Simulator::FPMaxNM, + &Simulator::FPMaxNM, + &Simulator::FPMaxNM, + inactive_value); } LogicVRegister Simulator::fminnmv(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - return fminmaxv(vform, - dst, - src, - &Simulator::FPMinNM); - } else { - return fminmaxv(vform, dst, src, &Simulator::FPMinNM); - } + int lane_size = LaneSizeInBitsFromFormat(vform); + uint64_t inactive_value = FPToRawbitsWithSize(lane_size, kFP64DefaultNaN); + return FPPairedAcrossHelper(vform, + dst, + src, + &Simulator::FPMinNM, + &Simulator::FPMinNM, + &Simulator::FPMinNM, + inactive_value); } @@ -4803,14 +5724,14 @@ LogicVRegister Simulator::fmla(VectorFormat vform, SimVRegister temp; if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { LogicVRegister index_reg = dup_element(kFormat8H, temp, src2, index); - fmla(vform, dst, src1, index_reg); + fmla(vform, dst, dst, src1, index_reg); } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { LogicVRegister index_reg = dup_element(kFormat4S, temp, src2, index); - fmla(vform, dst, src1, index_reg); + fmla(vform, dst, dst, src1, index_reg); } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); LogicVRegister index_reg = dup_element(kFormat2D, temp, src2, index); - fmla(vform, dst, src1, index_reg); + fmla(vform, dst, dst, src1, index_reg); } return dst; } @@ -4825,14 +5746,14 @@ LogicVRegister Simulator::fmls(VectorFormat vform, SimVRegister temp; if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { LogicVRegister index_reg = dup_element(kFormat8H, temp, src2, index); - fmls(vform, dst, src1, index_reg); + fmls(vform, dst, dst, src1, index_reg); } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { LogicVRegister index_reg = dup_element(kFormat4S, temp, src2, index); - fmls(vform, dst, src1, index_reg); + fmls(vform, dst, dst, src1, index_reg); } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); LogicVRegister index_reg = dup_element(kFormat2D, temp, src2, index); - fmls(vform, dst, src1, index_reg); + fmls(vform, dst, dst, src1, index_reg); } return dst; } @@ -4864,9 +5785,11 @@ LogicVRegister Simulator::frint(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, FPRounding rounding_mode, - bool inexact_exception) { + bool inexact_exception, + FrintMode frint_mode) { dst.ClearForWrite(vform); if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { + VIXL_ASSERT(frint_mode == kFrintToInteger); for (int i = 0; i < LaneCountFromFormat(vform); i++) { SimFloat16 input = src.Float(i); SimFloat16 rounded = FPRoundInt(input, rounding_mode); @@ -4878,7 +5801,8 @@ LogicVRegister Simulator::frint(VectorFormat vform, } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { float input = src.Float(i); - float rounded = FPRoundInt(input, rounding_mode); + float rounded = FPRoundInt(input, rounding_mode, frint_mode); + if (inexact_exception && !IsNaN(input) && (input != rounded)) { FPProcessException(); } @@ -4888,7 +5812,7 @@ LogicVRegister Simulator::frint(VectorFormat vform, VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); for (int i = 0; i < LaneCountFromFormat(vform); i++) { double input = src.Float(i); - double rounded = FPRoundInt(input, rounding_mode); + double rounded = FPRoundInt(input, rounding_mode, frint_mode); if (inexact_exception && !IsNaN(input) && (input != rounded)) { FPProcessException(); } @@ -4898,62 +5822,143 @@ LogicVRegister Simulator::frint(VectorFormat vform, return dst; } +LogicVRegister Simulator::fcvt(VectorFormat dst_vform, + VectorFormat src_vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src) { + unsigned dst_data_size_in_bits = LaneSizeInBitsFromFormat(dst_vform); + unsigned src_data_size_in_bits = LaneSizeInBitsFromFormat(src_vform); + VectorFormat vform = SVEFormatFromLaneSizeInBits( + std::max(dst_data_size_in_bits, src_data_size_in_bits)); -LogicVRegister Simulator::fcvts(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src, - FPRounding rounding_mode, - int fbits) { - dst.ClearForWrite(vform); - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - SimFloat16 op = - static_cast(src.Float(i)) * std::pow(2.0, fbits); - dst.SetInt(vform, i, FPToInt16(op, rounding_mode)); - } - } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - float op = src.Float(i) * std::pow(2.0f, fbits); - dst.SetInt(vform, i, FPToInt32(op, rounding_mode)); - } - } else { - VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - double op = src.Float(i) * std::pow(2.0, fbits); - dst.SetInt(vform, i, FPToInt64(op, rounding_mode)); - } + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (!pg.IsActive(vform, i)) continue; + + uint64_t src_raw_bits = ExtractUnsignedBitfield64(src_data_size_in_bits - 1, + 0, + src.Uint(vform, i)); + double dst_value = + RawbitsWithSizeToFP(src_data_size_in_bits, src_raw_bits); + + uint64_t dst_raw_bits = + FPToRawbitsWithSize(dst_data_size_in_bits, dst_value); + + dst.SetUint(vform, i, dst_raw_bits); } + return dst; } - -LogicVRegister Simulator::fcvtu(VectorFormat vform, +LogicVRegister Simulator::fcvts(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, LogicVRegister dst, + const LogicPRegister& pg, const LogicVRegister& src, - FPRounding rounding_mode, + FPRounding round, int fbits) { - dst.ClearForWrite(vform); - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - SimFloat16 op = - static_cast(src.Float(i)) * std::pow(2.0, fbits); - dst.SetUint(vform, i, FPToUInt16(op, rounding_mode)); - } - } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - float op = src.Float(i) * std::pow(2.0f, fbits); - dst.SetUint(vform, i, FPToUInt32(op, rounding_mode)); + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= dst_data_size_in_bits); + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= src_data_size_in_bits); + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (!pg.IsActive(vform, i)) continue; + + uint64_t value = ExtractUnsignedBitfield64(src_data_size_in_bits - 1, + 0, + src.Uint(vform, i)); + double result = RawbitsWithSizeToFP(src_data_size_in_bits, value) * + std::pow(2.0, fbits); + + switch (dst_data_size_in_bits) { + case kHRegSize: + dst.SetInt(vform, i, FPToInt16(result, round)); + break; + case kSRegSize: + dst.SetInt(vform, i, FPToInt32(result, round)); + break; + case kDRegSize: + dst.SetInt(vform, i, FPToInt64(result, round)); + break; + default: + VIXL_UNIMPLEMENTED(); + break; } - } else { - VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - double op = src.Float(i) * std::pow(2.0, fbits); - dst.SetUint(vform, i, FPToUInt64(op, rounding_mode)); + } + + return dst; +} + +LogicVRegister Simulator::fcvts(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + FPRounding round, + int fbits) { + dst.ClearForWrite(vform); + return fcvts(vform, + LaneSizeInBitsFromFormat(vform), + LaneSizeInBitsFromFormat(vform), + dst, + GetPTrue(), + src, + round, + fbits); +} + +LogicVRegister Simulator::fcvtu(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits) { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= dst_data_size_in_bits); + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= src_data_size_in_bits); + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (!pg.IsActive(vform, i)) continue; + + uint64_t value = ExtractUnsignedBitfield64(src_data_size_in_bits - 1, + 0, + src.Uint(vform, i)); + double result = RawbitsWithSizeToFP(src_data_size_in_bits, value) * + std::pow(2.0, fbits); + + switch (dst_data_size_in_bits) { + case kHRegSize: + dst.SetUint(vform, i, FPToUInt16(result, round)); + break; + case kSRegSize: + dst.SetUint(vform, i, FPToUInt32(result, round)); + break; + case kDRegSize: + dst.SetUint(vform, i, FPToUInt64(result, round)); + break; + default: + VIXL_UNIMPLEMENTED(); + break; } } + return dst; } +LogicVRegister Simulator::fcvtu(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + FPRounding round, + int fbits) { + dst.ClearForWrite(vform); + return fcvtu(vform, + LaneSizeInBitsFromFormat(vform), + LaneSizeInBitsFromFormat(vform), + dst, + GetPTrue(), + src, + round, + fbits); +} LogicVRegister Simulator::fcvtl(VectorFormat vform, LogicVRegister dst, @@ -5000,16 +6005,20 @@ LogicVRegister Simulator::fcvtl2(VectorFormat vform, LogicVRegister Simulator::fcvtn(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { + SimVRegister tmp; + LogicVRegister srctmp = mov(kFormat2D, tmp, src); + dst.ClearForWrite(vform); if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { dst.SetFloat(i, - Float16ToRawbits( - FPToFloat16(src.Float(i), FPTieEven, ReadDN()))); + Float16ToRawbits(FPToFloat16(srctmp.Float(i), + FPTieEven, + ReadDN()))); } } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kSRegSize); for (int i = 0; i < LaneCountFromFormat(vform); i++) { - dst.SetFloat(i, FPToFloat(src.Float(i), FPTieEven, ReadDN())); + dst.SetFloat(i, FPToFloat(srctmp.Float(i), FPTieEven, ReadDN())); } } return dst; @@ -5040,10 +6049,19 @@ LogicVRegister Simulator::fcvtn2(VectorFormat vform, LogicVRegister Simulator::fcvtxn(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src) { + SimVRegister tmp; + LogicVRegister srctmp = mov(kFormat2D, tmp, src); + int input_lane_count = LaneCountFromFormat(vform); + if (IsSVEFormat(vform)) { + mov(kFormatVnB, tmp, src); + input_lane_count /= 2; + } + dst.ClearForWrite(vform); VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kSRegSize); - for (int i = 0; i < LaneCountFromFormat(vform); i++) { - dst.SetFloat(i, FPToFloat(src.Float(i), FPRoundOdd, ReadDN())); + + for (int i = 0; i < input_lane_count; i++) { + dst.SetFloat(i, FPToFloat(srctmp.Float(i), FPRoundOdd, ReadDN())); } return dst; } @@ -5064,14 +6082,14 @@ LogicVRegister Simulator::fcvtxn2(VectorFormat vform, // Based on reference C function recip_sqrt_estimate from ARM ARM. double Simulator::recip_sqrt_estimate(double a) { - int q0, q1, s; + int quot0, quot1, s; double r; if (a < 0.5) { - q0 = static_cast(a * 512.0); - r = 1.0 / sqrt((static_cast(q0) + 0.5) / 512.0); + quot0 = static_cast(a * 512.0); + r = 1.0 / sqrt((static_cast(quot0) + 0.5) / 512.0); } else { - q1 = static_cast(a * 256.0); - r = 1.0 / sqrt((static_cast(q1) + 0.5) / 256.0); + quot1 = static_cast(a * 256.0); + r = 1.0 / sqrt((static_cast(quot1) + 0.5) / 256.0); } s = static_cast(256.0 * r + 0.5); return static_cast(s) / 256.0; @@ -5165,18 +6183,18 @@ LogicVRegister Simulator::frsqrte(VectorFormat vform, if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { SimFloat16 input = src.Float(i); - dst.SetFloat(i, FPRecipSqrtEstimate(input)); + dst.SetFloat(vform, i, FPRecipSqrtEstimate(input)); } } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { float input = src.Float(i); - dst.SetFloat(i, FPRecipSqrtEstimate(input)); + dst.SetFloat(vform, i, FPRecipSqrtEstimate(input)); } } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); for (int i = 0; i < LaneCountFromFormat(vform); i++) { double input = src.Float(i); - dst.SetFloat(i, FPRecipSqrtEstimate(input)); + dst.SetFloat(vform, i, FPRecipSqrtEstimate(input)); } } return dst; @@ -5239,7 +6257,6 @@ T Simulator::FPRecipEstimate(T op, FPRounding rounding) { } else { uint64_t fraction; int exp, result_exp; - uint32_t sign; if (IsFloat16()) { sign = Float16Sign(op); @@ -5311,18 +6328,18 @@ LogicVRegister Simulator::frecpe(VectorFormat vform, if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { SimFloat16 input = src.Float(i); - dst.SetFloat(i, FPRecipEstimate(input, round)); + dst.SetFloat(vform, i, FPRecipEstimate(input, round)); } } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { for (int i = 0; i < LaneCountFromFormat(vform); i++) { float input = src.Float(i); - dst.SetFloat(i, FPRecipEstimate(input, round)); + dst.SetFloat(vform, i, FPRecipEstimate(input, round)); } } else { VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); for (int i = 0; i < LaneCountFromFormat(vform); i++) { double input = src.Float(i); - dst.SetFloat(i, FPRecipEstimate(input, round)); + dst.SetFloat(vform, i, FPRecipEstimate(input, round)); } } return dst; @@ -5383,6 +6400,47 @@ LogicVRegister Simulator::urecpe(VectorFormat vform, return dst; } +LogicPRegister Simulator::pfalse(LogicPRegister dst) { + dst.Clear(); + return dst; +} + +LogicPRegister Simulator::pfirst(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src) { + int first_pg = GetFirstActive(kFormatVnB, pg); + VIXL_ASSERT(first_pg < LaneCountFromFormat(kFormatVnB)); + mov(dst, src); + if (first_pg >= 0) dst.SetActive(kFormatVnB, first_pg, true); + return dst; +} + +LogicPRegister Simulator::ptrue(VectorFormat vform, + LogicPRegister dst, + int pattern) { + int count = GetPredicateConstraintLaneCount(vform, pattern); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + dst.SetActive(vform, i, i < count); + } + return dst; +} + +LogicPRegister Simulator::pnext(VectorFormat vform, + LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src) { + int next = GetLastActive(vform, src) + 1; + while (next < LaneCountFromFormat(vform)) { + if (pg.IsActive(vform, next)) break; + next++; + } + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + dst.SetActive(vform, i, (i == next)); + } + return dst; +} + template LogicVRegister Simulator::frecpx(VectorFormat vform, LogicVRegister dst, @@ -5434,49 +6492,1361 @@ LogicVRegister Simulator::frecpx(VectorFormat vform, return dst; } +LogicVRegister Simulator::flogb(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + double op = 0.0; + switch (vform) { + case kFormatVnH: + op = FPToDouble(src.Float(i), kIgnoreDefaultNaN); + break; + case kFormatVnS: + op = src.Float(i); + break; + case kFormatVnD: + op = src.Float(i); + break; + default: + VIXL_UNREACHABLE(); + } + + switch (std::fpclassify(op)) { + case FP_INFINITE: + dst.SetInt(vform, i, MaxIntFromFormat(vform)); + break; + case FP_NAN: + case FP_ZERO: + dst.SetInt(vform, i, MinIntFromFormat(vform)); + break; + case FP_SUBNORMAL: { + // DoubleMantissa returns the mantissa of its input, leaving 12 zero + // bits where the sign and exponent would be. We subtract 12 to + // find the number of leading zero bits in the mantissa itself. + int64_t mant_zero_count = CountLeadingZeros(DoubleMantissa(op)) - 12; + // Log2 of a subnormal is the lowest exponent a normal number can + // represent, together with the zeros in the mantissa. + dst.SetInt(vform, i, -1023 - mant_zero_count); + break; + } + case FP_NORMAL: + // Log2 of a normal number is the exponent minus the bias. + dst.SetInt(vform, i, static_cast(DoubleExp(op)) - 1023); + break; + } + } + return dst; +} + +LogicVRegister Simulator::ftsmul(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + SimVRegister maybe_neg_src1; + + // The bottom bit of src2 controls the sign of the result. Use it to + // conditionally invert the sign of one `fmul` operand. + shl(vform, maybe_neg_src1, src2, LaneSizeInBitsFromFormat(vform) - 1); + eor(vform, maybe_neg_src1, maybe_neg_src1, src1); + + // Multiply src1 by the modified neg_src1, which is potentially its negation. + // In the case of NaNs, NaN * -NaN will return the first NaN intact, so src1, + // rather than neg_src1, must be the first source argument. + fmul(vform, dst, src1, maybe_neg_src1); + + return dst; +} + +LogicVRegister Simulator::ftssel(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + unsigned lane_bits = LaneSizeInBitsFromFormat(vform); + uint64_t sign_bit = UINT64_C(1) << (lane_bits - 1); + uint64_t one; + + if (lane_bits == kHRegSize) { + one = Float16ToRawbits(Float16(1.0)); + } else if (lane_bits == kSRegSize) { + one = FloatToRawbits(1.0); + } else { + VIXL_ASSERT(lane_bits == kDRegSize); + one = DoubleToRawbits(1.0); + } + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + // Use integer accessors for this operation, as this is a data manipulation + // task requiring no calculation. + uint64_t op = src1.Uint(vform, i); + + // Only the bottom two bits of the src2 register are significant, indicating + // the quadrant. Bit 0 controls whether src1 or 1.0 is written to dst. Bit 1 + // determines the sign of the value written to dst. + uint64_t q = src2.Uint(vform, i); + if ((q & 1) == 1) op = one; + if ((q & 2) == 2) op ^= sign_bit; + + dst.SetUint(vform, i, op); + } + + return dst; +} + +template +LogicVRegister Simulator::FTMaddHelper(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + uint64_t coeff_pos, + uint64_t coeff_neg) { + SimVRegister zero; + dup_immediate(kFormatVnB, zero, 0); + + SimVRegister cf; + SimVRegister cfn; + dup_immediate(vform, cf, coeff_pos); + dup_immediate(vform, cfn, coeff_neg); + + // The specification requires testing the top bit of the raw value, rather + // than the sign of the floating point number, so use an integer comparison + // here. + SimPRegister is_neg; + SVEIntCompareVectorsHelper(lt, + vform, + is_neg, + GetPTrue(), + src2, + zero, + false, + LeaveFlags); + mov_merging(vform, cf, is_neg, cfn); + + SimVRegister temp; + fabs_(vform, temp, src2); + fmla(vform, cf, cf, src1, temp); + mov(vform, dst, cf); + return dst; +} + + +LogicVRegister Simulator::ftmad(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + unsigned index) { + static const uint64_t ftmad_coeff16[] = {0x3c00, + 0xb155, + 0x2030, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x3c00, + 0xb800, + 0x293a, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000}; + + static const uint64_t ftmad_coeff32[] = {0x3f800000, + 0xbe2aaaab, + 0x3c088886, + 0xb95008b9, + 0x36369d6d, + 0x00000000, + 0x00000000, + 0x00000000, + 0x3f800000, + 0xbf000000, + 0x3d2aaaa6, + 0xbab60705, + 0x37cd37cc, + 0x00000000, + 0x00000000, + 0x00000000}; + + static const uint64_t ftmad_coeff64[] = {0x3ff0000000000000, + 0xbfc5555555555543, + 0x3f8111111110f30c, + 0xbf2a01a019b92fc6, + 0x3ec71de351f3d22b, + 0xbe5ae5e2b60f7b91, + 0x3de5d8408868552f, + 0x0000000000000000, + 0x3ff0000000000000, + 0xbfe0000000000000, + 0x3fa5555555555536, + 0xbf56c16c16c13a0b, + 0x3efa01a019b1e8d8, + 0xbe927e4f7282f468, + 0x3e21ee96d2641b13, + 0xbda8f76380fbb401}; + VIXL_ASSERT((index + 8) < ArrayLength(ftmad_coeff64)); + VIXL_ASSERT(ArrayLength(ftmad_coeff16) == ArrayLength(ftmad_coeff64)); + VIXL_ASSERT(ArrayLength(ftmad_coeff32) == ArrayLength(ftmad_coeff64)); + + if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { + FTMaddHelper(vform, + dst, + src1, + src2, + ftmad_coeff16[index], + ftmad_coeff16[index + 8]); + } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { + FTMaddHelper(vform, + dst, + src1, + src2, + ftmad_coeff32[index], + ftmad_coeff32[index + 8]); + } else { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); + FTMaddHelper(vform, + dst, + src1, + src2, + ftmad_coeff64[index], + ftmad_coeff64[index + 8]); + } + return dst; +} + +LogicVRegister Simulator::fexpa(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + static const uint64_t fexpa_coeff16[] = {0x0000, 0x0016, 0x002d, 0x0045, + 0x005d, 0x0075, 0x008e, 0x00a8, + 0x00c2, 0x00dc, 0x00f8, 0x0114, + 0x0130, 0x014d, 0x016b, 0x0189, + 0x01a8, 0x01c8, 0x01e8, 0x0209, + 0x022b, 0x024e, 0x0271, 0x0295, + 0x02ba, 0x02e0, 0x0306, 0x032e, + 0x0356, 0x037f, 0x03a9, 0x03d4}; + + static const uint64_t fexpa_coeff32[] = + {0x000000, 0x0164d2, 0x02cd87, 0x043a29, 0x05aac3, 0x071f62, 0x08980f, + 0x0a14d5, 0x0b95c2, 0x0d1adf, 0x0ea43a, 0x1031dc, 0x11c3d3, 0x135a2b, + 0x14f4f0, 0x16942d, 0x1837f0, 0x19e046, 0x1b8d3a, 0x1d3eda, 0x1ef532, + 0x20b051, 0x227043, 0x243516, 0x25fed7, 0x27cd94, 0x29a15b, 0x2b7a3a, + 0x2d583f, 0x2f3b79, 0x3123f6, 0x3311c4, 0x3504f3, 0x36fd92, 0x38fbaf, + 0x3aff5b, 0x3d08a4, 0x3f179a, 0x412c4d, 0x4346cd, 0x45672a, 0x478d75, + 0x49b9be, 0x4bec15, 0x4e248c, 0x506334, 0x52a81e, 0x54f35b, 0x5744fd, + 0x599d16, 0x5bfbb8, 0x5e60f5, 0x60ccdf, 0x633f89, 0x65b907, 0x68396a, + 0x6ac0c7, 0x6d4f30, 0x6fe4ba, 0x728177, 0x75257d, 0x77d0df, 0x7a83b3, + 0x7d3e0c}; + + static const uint64_t fexpa_coeff64[] = + {0X0000000000000, 0X02c9a3e778061, 0X059b0d3158574, 0X0874518759bc8, + 0X0b5586cf9890f, 0X0e3ec32d3d1a2, 0X11301d0125b51, 0X1429aaea92de0, + 0X172b83c7d517b, 0X1a35beb6fcb75, 0X1d4873168b9aa, 0X2063b88628cd6, + 0X2387a6e756238, 0X26b4565e27cdd, 0X29e9df51fdee1, 0X2d285a6e4030b, + 0X306fe0a31b715, 0X33c08b26416ff, 0X371a7373aa9cb, 0X3a7db34e59ff7, + 0X3dea64c123422, 0X4160a21f72e2a, 0X44e086061892d, 0X486a2b5c13cd0, + 0X4bfdad5362a27, 0X4f9b2769d2ca7, 0X5342b569d4f82, 0X56f4736b527da, + 0X5ab07dd485429, 0X5e76f15ad2148, 0X6247eb03a5585, 0X6623882552225, + 0X6a09e667f3bcd, 0X6dfb23c651a2f, 0X71f75e8ec5f74, 0X75feb564267c9, + 0X7a11473eb0187, 0X7e2f336cf4e62, 0X82589994cce13, 0X868d99b4492ed, + 0X8ace5422aa0db, 0X8f1ae99157736, 0X93737b0cdc5e5, 0X97d829fde4e50, + 0X9c49182a3f090, 0Xa0c667b5de565, 0Xa5503b23e255d, 0Xa9e6b5579fdbf, + 0Xae89f995ad3ad, 0Xb33a2b84f15fb, 0Xb7f76f2fb5e47, 0Xbcc1e904bc1d2, + 0Xc199bdd85529c, 0Xc67f12e57d14b, 0Xcb720dcef9069, 0Xd072d4a07897c, + 0Xd5818dcfba487, 0Xda9e603db3285, 0Xdfc97337b9b5f, 0Xe502ee78b3ff6, + 0Xea4afa2a490da, 0Xefa1bee615a27, 0Xf50765b6e4540, 0Xfa7c1819e90d8}; + + unsigned lane_size = LaneSizeInBitsFromFormat(vform); + int index_highbit = 5; + int op_highbit, op_shift; + const uint64_t* fexpa_coeff; + + if (lane_size == kHRegSize) { + index_highbit = 4; + VIXL_ASSERT(ArrayLength(fexpa_coeff16) == (1U << (index_highbit + 1))); + fexpa_coeff = fexpa_coeff16; + op_highbit = 9; + op_shift = 10; + } else if (lane_size == kSRegSize) { + VIXL_ASSERT(ArrayLength(fexpa_coeff32) == (1U << (index_highbit + 1))); + fexpa_coeff = fexpa_coeff32; + op_highbit = 13; + op_shift = 23; + } else { + VIXL_ASSERT(lane_size == kDRegSize); + VIXL_ASSERT(ArrayLength(fexpa_coeff64) == (1U << (index_highbit + 1))); + fexpa_coeff = fexpa_coeff64; + op_highbit = 16; + op_shift = 52; + } + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t op = src.Uint(vform, i); + uint64_t result = fexpa_coeff[Bits(op, index_highbit, 0)]; + result |= (Bits(op, op_highbit, index_highbit + 1) << op_shift); + dst.SetUint(vform, i, result); + } + return dst; +} + +template +LogicVRegister Simulator::fscale(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + T two = T(2.0); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + T src1_val = src1.Float(i); + if (!IsNaN(src1_val)) { + int64_t scale = src2.Int(vform, i); + // TODO: this is a low-performance implementation, but it's simple and + // less likely to be buggy. Consider replacing it with something faster. + + // Scales outside of these bounds become infinity or zero, so there's no + // point iterating further. + scale = std::min(std::max(scale, -2048), 2048); + + // Compute src1_val * 2 ^ scale. If scale is positive, multiply by two and + // decrement scale until it's zero. + while (scale-- > 0) { + src1_val = FPMul(src1_val, two); + } + + // If scale is negative, divide by two and increment scale until it's + // zero. Initially, scale is (src2 - 1), so we pre-increment. + while (++scale < 0) { + src1_val = FPDiv(src1_val, two); + } + } + dst.SetFloat(i, src1_val); + } + return dst; +} + +LogicVRegister Simulator::fscale(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { + fscale(vform, dst, src1, src2); + } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { + fscale(vform, dst, src1, src2); + } else { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); + fscale(vform, dst, src1, src2); + } + return dst; +} + +LogicVRegister Simulator::scvtf(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits) { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= dst_data_size_in_bits); + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= src_data_size_in_bits); + dst.ClearForWrite(vform); + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (!pg.IsActive(vform, i)) continue; + + int64_t value = ExtractSignedBitfield64(src_data_size_in_bits - 1, + 0, + src.Uint(vform, i)); + + switch (dst_data_size_in_bits) { + case kHRegSize: { + SimFloat16 result = FixedToFloat16(value, fbits, round); + dst.SetUint(vform, i, Float16ToRawbits(result)); + break; + } + case kSRegSize: { + float result = FixedToFloat(value, fbits, round); + dst.SetUint(vform, i, FloatToRawbits(result)); + break; + } + case kDRegSize: { + double result = FixedToDouble(value, fbits, round); + dst.SetUint(vform, i, DoubleToRawbits(result)); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } + } + + return dst; +} + LogicVRegister Simulator::scvtf(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, int fbits, FPRounding round) { + return scvtf(vform, + LaneSizeInBitsFromFormat(vform), + LaneSizeInBitsFromFormat(vform), + dst, + GetPTrue(), + src, + round, + fbits); +} + +LogicVRegister Simulator::ucvtf(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits) { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= dst_data_size_in_bits); + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) >= src_data_size_in_bits); + dst.ClearForWrite(vform); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - SimFloat16 result = FixedToFloat16(src.Int(kFormatH, i), fbits, round); - dst.SetFloat(i, result); - } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - float result = FixedToFloat(src.Int(kFormatS, i), fbits, round); - dst.SetFloat(i, result); - } else { - VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - double result = FixedToDouble(src.Int(kFormatD, i), fbits, round); - dst.SetFloat(i, result); + if (!pg.IsActive(vform, i)) continue; + + uint64_t value = ExtractUnsignedBitfield64(src_data_size_in_bits - 1, + 0, + src.Uint(vform, i)); + + switch (dst_data_size_in_bits) { + case kHRegSize: { + SimFloat16 result = UFixedToFloat16(value, fbits, round); + dst.SetUint(vform, i, Float16ToRawbits(result)); + break; + } + case kSRegSize: { + float result = UFixedToFloat(value, fbits, round); + dst.SetUint(vform, i, FloatToRawbits(result)); + break; + } + case kDRegSize: { + double result = UFixedToDouble(value, fbits, round); + dst.SetUint(vform, i, DoubleToRawbits(result)); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; } } + return dst; } - LogicVRegister Simulator::ucvtf(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, int fbits, FPRounding round) { + return ucvtf(vform, + LaneSizeInBitsFromFormat(vform), + LaneSizeInBitsFromFormat(vform), + dst, + GetPTrue(), + src, + round, + fbits); +} + +LogicVRegister Simulator::unpk(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + UnpackType unpack_type, + ExtendType extend_type) { + VectorFormat vform_half = VectorFormatHalfWidth(vform); + const int lane_count = LaneCountFromFormat(vform); + const int src_start_lane = (unpack_type == kLoHalf) ? 0 : lane_count; + + switch (extend_type) { + case kSignedExtend: { + int64_t result[kZRegMaxSizeInBytes]; + for (int i = 0; i < lane_count; ++i) { + result[i] = src.Int(vform_half, i + src_start_lane); + } + for (int i = 0; i < lane_count; ++i) { + dst.SetInt(vform, i, result[i]); + } + break; + } + case kUnsignedExtend: { + uint64_t result[kZRegMaxSizeInBytes]; + for (int i = 0; i < lane_count; ++i) { + result[i] = src.Uint(vform_half, i + src_start_lane); + } + for (int i = 0; i < lane_count; ++i) { + dst.SetUint(vform, i, result[i]); + } + break; + } + default: + VIXL_UNREACHABLE(); + } + return dst; +} + +LogicPRegister Simulator::SVEIntCompareVectorsHelper(Condition cond, + VectorFormat vform, + LogicPRegister dst, + const LogicPRegister& mask, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool is_wide_elements, + FlagsUpdate flags) { + for (int lane = 0; lane < LaneCountFromFormat(vform); lane++) { + bool result = false; + if (mask.IsActive(vform, lane)) { + int64_t op1 = 0xbadbeef; + int64_t op2 = 0xbadbeef; + int d_lane = (lane * LaneSizeInBitsFromFormat(vform)) / kDRegSize; + switch (cond) { + case eq: + case ge: + case gt: + case lt: + case le: + case ne: + op1 = src1.Int(vform, lane); + op2 = is_wide_elements ? src2.Int(kFormatVnD, d_lane) + : src2.Int(vform, lane); + break; + case hi: + case hs: + case ls: + case lo: + op1 = src1.Uint(vform, lane); + op2 = is_wide_elements ? src2.Uint(kFormatVnD, d_lane) + : src2.Uint(vform, lane); + break; + default: + VIXL_UNREACHABLE(); + } + + switch (cond) { + case eq: + result = (op1 == op2); + break; + case ne: + result = (op1 != op2); + break; + case ge: + result = (op1 >= op2); + break; + case gt: + result = (op1 > op2); + break; + case le: + result = (op1 <= op2); + break; + case lt: + result = (op1 < op2); + break; + case hs: + result = (static_cast(op1) >= static_cast(op2)); + break; + case hi: + result = (static_cast(op1) > static_cast(op2)); + break; + case ls: + result = (static_cast(op1) <= static_cast(op2)); + break; + case lo: + result = (static_cast(op1) < static_cast(op2)); + break; + default: + VIXL_UNREACHABLE(); + } + } + dst.SetActive(vform, lane, result); + } + + if (flags == SetFlags) PredTest(vform, mask, dst); + + return dst; +} + +LogicVRegister Simulator::SVEBitwiseShiftHelper(Shift shift_op, + VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool is_wide_elements) { + unsigned lane_size = LaneSizeInBitsFromFormat(vform); + VectorFormat shift_vform = is_wide_elements ? kFormatVnD : vform; + + for (int lane = 0; lane < LaneCountFromFormat(vform); lane++) { + int shift_src_lane = lane; + if (is_wide_elements) { + // If the shift amount comes from wide elements, select the D-sized lane + // which occupies the corresponding lanes of the value to be shifted. + shift_src_lane = (lane * lane_size) / kDRegSize; + } + uint64_t shift_amount = src2.Uint(shift_vform, shift_src_lane); + + // Saturate shift_amount to the size of the lane that will be shifted. + if (shift_amount > lane_size) shift_amount = lane_size; + + uint64_t value = src1.Uint(vform, lane); + int64_t result = ShiftOperand(lane_size, + value, + shift_op, + static_cast(shift_amount)); + dst.SetUint(vform, lane, result); + } + + return dst; +} + +LogicVRegister Simulator::asrd(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + int shift) { + VIXL_ASSERT((shift > 0) && (static_cast(shift) <= + LaneSizeInBitsFromFormat(vform))); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { - if (LaneSizeInBitsFromFormat(vform) == kHRegSize) { - SimFloat16 result = UFixedToFloat16(src.Uint(kFormatH, i), fbits, round); - dst.SetFloat(i, result); - } else if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { - float result = UFixedToFloat(src.Uint(kFormatS, i), fbits, round); - dst.SetFloat(i, result); + int64_t value = src1.Int(vform, i); + if (shift <= 63) { + if (value < 0) { + // The max possible mask is 0x7fff'ffff'ffff'ffff, which can be safely + // cast to int64_t, and cannot cause signed overflow in the result. + value = value + GetUintMask(shift); + } + value = ShiftOperand(kDRegSize, value, ASR, shift); } else { - VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); - double result = UFixedToDouble(src.Uint(kFormatD, i), fbits, round); - dst.SetFloat(i, result); + value = 0; } + dst.SetInt(vform, i, value); } return dst; } +LogicVRegister Simulator::SVEBitwiseLogicalUnpredicatedHelper( + LogicalOp logical_op, + VectorFormat vform, + LogicVRegister zd, + const LogicVRegister& zn, + const LogicVRegister& zm) { + VIXL_ASSERT(IsSVEFormat(vform)); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t op1 = zn.Uint(vform, i); + uint64_t op2 = zm.Uint(vform, i); + uint64_t result = 0; + switch (logical_op) { + case AND: + result = op1 & op2; + break; + case BIC: + result = op1 & ~op2; + break; + case EOR: + result = op1 ^ op2; + break; + case ORR: + result = op1 | op2; + break; + default: + VIXL_UNIMPLEMENTED(); + } + zd.SetUint(vform, i, result); + } + + return zd; +} + +LogicPRegister Simulator::SVEPredicateLogicalHelper(SVEPredicateLogicalOp op, + LogicPRegister pd, + const LogicPRegister& pn, + const LogicPRegister& pm) { + for (int i = 0; i < pn.GetChunkCount(); i++) { + LogicPRegister::ChunkType op1 = pn.GetChunk(i); + LogicPRegister::ChunkType op2 = pm.GetChunk(i); + LogicPRegister::ChunkType result = 0; + switch (op) { + case ANDS_p_p_pp_z: + case AND_p_p_pp_z: + result = op1 & op2; + break; + case BICS_p_p_pp_z: + case BIC_p_p_pp_z: + result = op1 & ~op2; + break; + case EORS_p_p_pp_z: + case EOR_p_p_pp_z: + result = op1 ^ op2; + break; + case NANDS_p_p_pp_z: + case NAND_p_p_pp_z: + result = ~(op1 & op2); + break; + case NORS_p_p_pp_z: + case NOR_p_p_pp_z: + result = ~(op1 | op2); + break; + case ORNS_p_p_pp_z: + case ORN_p_p_pp_z: + result = op1 | ~op2; + break; + case ORRS_p_p_pp_z: + case ORR_p_p_pp_z: + result = op1 | op2; + break; + default: + VIXL_UNIMPLEMENTED(); + } + pd.SetChunk(i, result); + } + return pd; +} + +LogicVRegister Simulator::SVEBitwiseImmHelper( + SVEBitwiseLogicalWithImm_UnpredicatedOp op, + VectorFormat vform, + LogicVRegister zd, + uint64_t imm) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t op1 = zd.Uint(vform, i); + uint64_t result = 0; + switch (op) { + case AND_z_zi: + result = op1 & imm; + break; + case EOR_z_zi: + result = op1 ^ imm; + break; + case ORR_z_zi: + result = op1 | imm; + break; + default: + VIXL_UNIMPLEMENTED(); + } + zd.SetUint(vform, i, result); + } + + return zd; +} + +void Simulator::SVEStructuredStoreHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr) { + VIXL_ASSERT(zt_code < kNumberOfZRegisters); + + int esize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + int msize_in_bytes_log2 = addr.GetMsizeInBytesLog2(); + int msize_in_bytes = addr.GetMsizeInBytes(); + int reg_count = addr.GetRegCount(); + + VIXL_ASSERT(esize_in_bytes_log2 >= msize_in_bytes_log2); + VIXL_ASSERT((reg_count >= 1) && (reg_count <= 4)); + + unsigned zt_codes[4] = {zt_code, + (zt_code + 1) % kNumberOfZRegisters, + (zt_code + 2) % kNumberOfZRegisters, + (zt_code + 3) % kNumberOfZRegisters}; + + LogicVRegister zt[4] = { + ReadVRegister(zt_codes[0]), + ReadVRegister(zt_codes[1]), + ReadVRegister(zt_codes[2]), + ReadVRegister(zt_codes[3]), + }; + + // For unpacked forms (e.g. `st1b { z0.h }, ...`, the upper parts of the lanes + // are ignored, so read the source register using the VectorFormat that + // corresponds with the storage format, and multiply the index accordingly. + VectorFormat unpack_vform = + SVEFormatFromLaneSizeInBytesLog2(msize_in_bytes_log2); + int unpack_shift = esize_in_bytes_log2 - msize_in_bytes_log2; + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (!pg.IsActive(vform, i)) continue; + + for (int r = 0; r < reg_count; r++) { + uint64_t element_address = addr.GetElementAddress(i, r); + StoreLane(zt[r], unpack_vform, i << unpack_shift, element_address); + } + } + + if (ShouldTraceWrites()) { + PrintRegisterFormat format = GetPrintRegisterFormat(vform); + if (esize_in_bytes_log2 == msize_in_bytes_log2) { + // Use an FP format where it's likely that we're accessing FP data. + format = GetPrintRegisterFormatTryFP(format); + } + // Stores don't represent a change to the source register's value, so only + // print the relevant part of the value. + format = GetPrintRegPartial(format); + + PrintZStructAccess(zt_code, + reg_count, + pg, + format, + msize_in_bytes, + "->", + addr); + } +} + +void Simulator::SVEStructuredLoadHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr, + bool is_signed) { + int esize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + int msize_in_bytes_log2 = addr.GetMsizeInBytesLog2(); + int msize_in_bytes = addr.GetMsizeInBytes(); + int reg_count = addr.GetRegCount(); + + VIXL_ASSERT(zt_code < kNumberOfZRegisters); + VIXL_ASSERT(esize_in_bytes_log2 >= msize_in_bytes_log2); + VIXL_ASSERT((reg_count >= 1) && (reg_count <= 4)); + + unsigned zt_codes[4] = {zt_code, + (zt_code + 1) % kNumberOfZRegisters, + (zt_code + 2) % kNumberOfZRegisters, + (zt_code + 3) % kNumberOfZRegisters}; + LogicVRegister zt[4] = { + ReadVRegister(zt_codes[0]), + ReadVRegister(zt_codes[1]), + ReadVRegister(zt_codes[2]), + ReadVRegister(zt_codes[3]), + }; + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + for (int r = 0; r < reg_count; r++) { + uint64_t element_address = addr.GetElementAddress(i, r); + + if (!pg.IsActive(vform, i)) { + zt[r].SetUint(vform, i, 0); + continue; + } + + if (is_signed) { + LoadIntToLane(zt[r], vform, msize_in_bytes, i, element_address); + } else { + LoadUintToLane(zt[r], vform, msize_in_bytes, i, element_address); + } + } + } + + if (ShouldTraceVRegs()) { + PrintRegisterFormat format = GetPrintRegisterFormat(vform); + if ((esize_in_bytes_log2 == msize_in_bytes_log2) && !is_signed) { + // Use an FP format where it's likely that we're accessing FP data. + format = GetPrintRegisterFormatTryFP(format); + } + PrintZStructAccess(zt_code, + reg_count, + pg, + format, + msize_in_bytes, + "<-", + addr); + } +} + +LogicPRegister Simulator::brka(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn) { + bool break_ = false; + for (int i = 0; i < LaneCountFromFormat(kFormatVnB); i++) { + if (pg.IsActive(kFormatVnB, i)) { + pd.SetActive(kFormatVnB, i, !break_); + break_ |= pn.IsActive(kFormatVnB, i); + } + } + + return pd; +} + +LogicPRegister Simulator::brkb(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn) { + bool break_ = false; + for (int i = 0; i < LaneCountFromFormat(kFormatVnB); i++) { + if (pg.IsActive(kFormatVnB, i)) { + break_ |= pn.IsActive(kFormatVnB, i); + pd.SetActive(kFormatVnB, i, !break_); + } + } + + return pd; +} + +LogicPRegister Simulator::brkn(LogicPRegister pdm, + const LogicPRegister& pg, + const LogicPRegister& pn) { + if (!IsLastActive(kFormatVnB, pg, pn)) { + pfalse(pdm); + } + return pdm; +} + +LogicPRegister Simulator::brkpa(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn, + const LogicPRegister& pm) { + bool last_active = IsLastActive(kFormatVnB, pg, pn); + + for (int i = 0; i < LaneCountFromFormat(kFormatVnB); i++) { + bool active = false; + if (pg.IsActive(kFormatVnB, i)) { + active = last_active; + last_active = last_active && !pm.IsActive(kFormatVnB, i); + } + pd.SetActive(kFormatVnB, i, active); + } + + return pd; +} + +LogicPRegister Simulator::brkpb(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn, + const LogicPRegister& pm) { + bool last_active = IsLastActive(kFormatVnB, pg, pn); + + for (int i = 0; i < LaneCountFromFormat(kFormatVnB); i++) { + bool active = false; + if (pg.IsActive(kFormatVnB, i)) { + last_active = last_active && !pm.IsActive(kFormatVnB, i); + active = last_active; + } + pd.SetActive(kFormatVnB, i, active); + } + + return pd; +} + +void Simulator::SVEFaultTolerantLoadHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr, + SVEFaultTolerantLoadType type, + bool is_signed) { + int esize_in_bytes = LaneSizeInBytesFromFormat(vform); + int msize_in_bits = addr.GetMsizeInBits(); + int msize_in_bytes = addr.GetMsizeInBytes(); + + VIXL_ASSERT(zt_code < kNumberOfZRegisters); + VIXL_ASSERT(esize_in_bytes >= msize_in_bytes); + VIXL_ASSERT(addr.GetRegCount() == 1); + + LogicVRegister zt = ReadVRegister(zt_code); + LogicPRegister ffr = ReadFFR(); + + // Non-faulting loads are allowed to fail arbitrarily. To stress user + // code, fail a random element in roughly one in eight full-vector loads. + uint32_t rnd = static_cast(jrand48(rand_state_)); + int fake_fault_at_lane = rnd % (LaneCountFromFormat(vform) * 8); + + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + uint64_t value = 0; + + if (pg.IsActive(vform, i)) { + uint64_t element_address = addr.GetElementAddress(i, 0); + + if (type == kSVEFirstFaultLoad) { + // First-faulting loads always load the first active element, regardless + // of FFR. The result will be discarded if its FFR lane is inactive, but + // it could still generate a fault. + value = MemReadUint(msize_in_bytes, element_address); + // All subsequent elements have non-fault semantics. + type = kSVENonFaultLoad; + + } else if (ffr.IsActive(vform, i)) { + // Simulation of fault-tolerant loads relies on system calls, and is + // likely to be relatively slow, so we only actually perform the load if + // its FFR lane is active. + + bool can_read = (i < fake_fault_at_lane) && + CanReadMemory(element_address, msize_in_bytes); + if (can_read) { + value = MemReadUint(msize_in_bytes, element_address); + } else { + // Propagate the fault to the end of FFR. + for (int j = i; j < LaneCountFromFormat(vform); j++) { + ffr.SetActive(vform, j, false); + } + } + } + } + + // The architecture permits a few possible results for inactive FFR lanes + // (including those caused by a fault in this instruction). We choose to + // leave the register value unchanged (like merging predication) because + // no other input to this instruction can have the same behaviour. + // + // Note that this behaviour takes precedence over pg's zeroing predication. + + if (ffr.IsActive(vform, i)) { + int msb = msize_in_bits - 1; + if (is_signed) { + zt.SetInt(vform, i, ExtractSignedBitfield64(msb, 0, value)); + } else { + zt.SetUint(vform, i, ExtractUnsignedBitfield64(msb, 0, value)); + } + } + } + + if (ShouldTraceVRegs()) { + PrintRegisterFormat format = GetPrintRegisterFormat(vform); + if ((esize_in_bytes == msize_in_bytes) && !is_signed) { + // Use an FP format where it's likely that we're accessing FP data. + format = GetPrintRegisterFormatTryFP(format); + } + // Log accessed lanes that are active in both pg and ffr. PrintZStructAccess + // expects a single mask, so combine the two predicates. + SimPRegister mask; + SVEPredicateLogicalHelper(AND_p_p_pp_z, mask, pg, ffr); + PrintZStructAccess(zt_code, 1, mask, format, msize_in_bytes, "<-", addr); + } +} + +void Simulator::SVEGatherLoadScalarPlusVectorHelper(const Instruction* instr, + VectorFormat vform, + SVEOffsetModifier mod) { + bool is_signed = instr->ExtractBit(14) == 0; + bool is_ff = instr->ExtractBit(13) == 1; + // Note that these instructions don't use the Dtype encoding. + int msize_in_bytes_log2 = instr->ExtractBits(24, 23); + int scale = instr->ExtractBit(21) * msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + vform, + mod, + scale); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + if (is_ff) { + SVEFaultTolerantLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + kSVEFirstFaultLoad, + is_signed); + } else { + SVEStructuredLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + is_signed); + } +} + +int Simulator::GetFirstActive(VectorFormat vform, + const LogicPRegister& pg) const { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (pg.IsActive(vform, i)) return i; + } + return -1; +} + +int Simulator::GetLastActive(VectorFormat vform, + const LogicPRegister& pg) const { + for (int i = LaneCountFromFormat(vform) - 1; i >= 0; i--) { + if (pg.IsActive(vform, i)) return i; + } + return -1; +} + +int Simulator::CountActiveLanes(VectorFormat vform, + const LogicPRegister& pg) const { + int count = 0; + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + count += pg.IsActive(vform, i) ? 1 : 0; + } + return count; +} + +int Simulator::CountActiveAndTrueLanes(VectorFormat vform, + const LogicPRegister& pg, + const LogicPRegister& pn) const { + int count = 0; + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + count += (pg.IsActive(vform, i) && pn.IsActive(vform, i)) ? 1 : 0; + } + return count; +} + +int Simulator::GetPredicateConstraintLaneCount(VectorFormat vform, + int pattern) const { + VIXL_ASSERT(IsSVEFormat(vform)); + int all = LaneCountFromFormat(vform); + VIXL_ASSERT(all > 0); + + switch (pattern) { + case SVE_VL1: + case SVE_VL2: + case SVE_VL3: + case SVE_VL4: + case SVE_VL5: + case SVE_VL6: + case SVE_VL7: + case SVE_VL8: + // VL1-VL8 are encoded directly. + VIXL_STATIC_ASSERT(SVE_VL1 == 1); + VIXL_STATIC_ASSERT(SVE_VL8 == 8); + return (pattern <= all) ? pattern : 0; + case SVE_VL16: + case SVE_VL32: + case SVE_VL64: + case SVE_VL128: + case SVE_VL256: { + // VL16-VL256 are encoded as log2(N) + c. + int min = 16 << (pattern - SVE_VL16); + return (min <= all) ? min : 0; + } + // Special cases. + case SVE_POW2: + return 1 << HighestSetBitPosition(all); + case SVE_MUL4: + return all - (all % 4); + case SVE_MUL3: + return all - (all % 3); + case SVE_ALL: + return all; + } + // Unnamed cases architecturally return 0. + return 0; +} + +LogicPRegister Simulator::match(VectorFormat vform, + LogicPRegister dst, + const LogicVRegister& haystack, + const LogicVRegister& needles, + bool negate_match) { + SimVRegister ztemp; + SimPRegister ptemp; + + pfalse(dst); + int lanes_per_segment = kQRegSize / LaneSizeInBitsFromFormat(vform); + for (int i = 0; i < lanes_per_segment; i++) { + dup_elements_to_segments(vform, ztemp, needles, i); + SVEIntCompareVectorsHelper(eq, + vform, + ptemp, + GetPTrue(), + haystack, + ztemp, + false, + LeaveFlags); + SVEPredicateLogicalHelper(ORR_p_p_pp_z, dst, dst, ptemp); + } + if (negate_match) { + ptrue(vform, ptemp, SVE_ALL); + SVEPredicateLogicalHelper(EOR_p_p_pp_z, dst, dst, ptemp); + } + return dst; +} + +uint64_t LogicSVEAddressVector::GetStructAddress(int lane) const { + if (IsContiguous()) { + return base_ + (lane * GetRegCount()) * GetMsizeInBytes(); + } + + VIXL_ASSERT(IsScatterGather()); + VIXL_ASSERT(vector_ != NULL); + + // For scatter-gather accesses, we need to extract the offset from vector_, + // and apply modifiers. + + uint64_t offset = 0; + switch (vector_form_) { + case kFormatVnS: + offset = vector_->GetLane(lane); + break; + case kFormatVnD: + offset = vector_->GetLane(lane); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + switch (vector_mod_) { + case SVE_MUL_VL: + VIXL_UNIMPLEMENTED(); + break; + case SVE_LSL: + // We apply the shift below. There's nothing to do here. + break; + case NO_SVE_OFFSET_MODIFIER: + VIXL_ASSERT(vector_shift_ == 0); + break; + case SVE_UXTW: + offset = ExtractUnsignedBitfield64(kWRegSize - 1, 0, offset); + break; + case SVE_SXTW: + offset = ExtractSignedBitfield64(kWRegSize - 1, 0, offset); + break; + } + + return base_ + (offset << vector_shift_); +} + +LogicVRegister Simulator::pack_odd_elements(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + SimVRegister zero; + zero.Clear(); + return uzp2(vform, dst, src, zero); +} + +LogicVRegister Simulator::pack_even_elements(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src) { + SimVRegister zero; + zero.Clear(); + return uzp1(vform, dst, src, zero); +} + +LogicVRegister Simulator::adcl(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool top) { + unsigned reg_size = LaneSizeInBitsFromFormat(vform); + VIXL_ASSERT((reg_size == kSRegSize) || (reg_size == kDRegSize)); + + for (int i = 0; i < LaneCountFromFormat(vform); i += 2) { + uint64_t left = src1.Uint(vform, i + (top ? 1 : 0)); + uint64_t right = dst.Uint(vform, i); + unsigned carry_in = src2.Uint(vform, i + 1) & 1; + std::pair val_and_flags = + AddWithCarry(reg_size, left, right, carry_in); + + // Set even lanes to the result of the addition. + dst.SetUint(vform, i, val_and_flags.first); + + // Set odd lanes to the carry flag from the addition. + uint64_t carry_out = (val_and_flags.second >> 1) & 1; + dst.SetUint(vform, i + 1, carry_out); + } + return dst; +} + +// Multiply the 2x8 8-bit matrix in src1 by the 8x2 8-bit matrix in src2, add +// the 2x2 32-bit result to the matrix in srcdst, and write back to srcdst. +// +// Matrices of the form: +// +// src1 = ( a b c d e f g h ) src2 = ( A B ) +// ( i j k l m n o p ) ( C D ) +// ( E F ) +// ( G H ) +// ( I J ) +// ( K L ) +// ( M N ) +// ( O P ) +// +// Are stored in the input vector registers as: +// +// 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +// src1 = [ p | o | n | m | l | k | j | i | h | g | f | e | d | c | b | a ] +// src2 = [ P | N | L | J | H | F | D | B | O | M | K | I | G | E | C | A ] +// +LogicVRegister Simulator::matmul(VectorFormat vform_dst, + LogicVRegister srcdst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool src1_signed, + bool src2_signed) { + // Two destination forms are supported: Q register containing four S-sized + // elements (4S) and Z register containing n S-sized elements (VnS). + VIXL_ASSERT((vform_dst == kFormat4S) || (vform_dst == kFormatVnS)); + VectorFormat vform_src = kFormatVnB; + int b_per_segment = kQRegSize / kBRegSize; + int s_per_segment = kQRegSize / kSRegSize; + int64_t result[kZRegMaxSizeInBytes / kSRegSizeInBytes] = {}; + int segment_count = LaneCountFromFormat(vform_dst) / 4; + for (int seg = 0; seg < segment_count; seg++) { + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + int dstidx = (2 * i) + j + (seg * s_per_segment); + int64_t sum = srcdst.Int(vform_dst, dstidx); + for (int k = 0; k < 8; k++) { + int idx1 = (8 * i) + k + (seg * b_per_segment); + int idx2 = (8 * j) + k + (seg * b_per_segment); + int64_t e1 = src1_signed ? src1.Int(vform_src, idx1) + : src1.Uint(vform_src, idx1); + int64_t e2 = src2_signed ? src2.Int(vform_src, idx2) + : src2.Uint(vform_src, idx2); + sum += e1 * e2; + } + result[dstidx] = sum; + } + } + } + srcdst.SetIntArray(vform_dst, result); + return srcdst; +} + +// Multiply the 2x2 FP matrix in src1 by the 2x2 FP matrix in src2, add the 2x2 +// result to the matrix in srcdst, and write back to srcdst. +// +// Matrices of the form: +// +// src1 = ( a b ) src2 = ( A B ) +// ( c d ) ( C D ) +// +// Are stored in the input vector registers as: +// +// 3 2 1 0 +// src1 = [ d | c | b | a ] +// src2 = [ D | B | C | A ] +// +template +LogicVRegister Simulator::fmatmul(VectorFormat vform, + LogicVRegister srcdst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + T result[kZRegMaxSizeInBytes / sizeof(T)]; + int T_per_segment = 4; + int segment_count = GetVectorLengthInBytes() / (T_per_segment * sizeof(T)); + for (int seg = 0; seg < segment_count; seg++) { + int segoff = seg * T_per_segment; + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + T prod0 = FPMulNaNs(src1.Float(2 * i + 0 + segoff), + src2.Float(2 * j + 0 + segoff)); + T prod1 = FPMulNaNs(src1.Float(2 * i + 1 + segoff), + src2.Float(2 * j + 1 + segoff)); + T sum = FPAdd(srcdst.Float(2 * i + j + segoff), prod0); + result[2 * i + j + segoff] = FPAdd(sum, prod1); + } + } + } + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + // Elements outside a multiple of 4T are set to zero. This happens only + // for double precision operations, when the VL is a multiple of 128 bits, + // but not a multiple of 256 bits. + T value = (i < (T_per_segment * segment_count)) ? result[i] : 0; + srcdst.SetFloat(vform, i, value); + } + return srcdst; +} + +LogicVRegister Simulator::fmatmul(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2) { + if (LaneSizeInBitsFromFormat(vform) == kSRegSize) { + fmatmul(vform, dst, src1, src2); + } else { + VIXL_ASSERT(LaneSizeInBitsFromFormat(vform) == kDRegSize); + fmatmul(vform, dst, src1, src2); + } + return dst; +} } // namespace aarch64 } // namespace vixl diff --git a/core/deps/vixl/aarch64/macro-assembler-aarch64.cc b/core/deps/vixl/aarch64/macro-assembler-aarch64.cc index 0499eb20d..64ec5b762 100644 --- a/core/deps/vixl/aarch64/macro-assembler-aarch64.cc +++ b/core/deps/vixl/aarch64/macro-assembler-aarch64.cc @@ -53,7 +53,7 @@ LiteralPool::LiteralPool(MacroAssembler* masm) recommended_checkpoint_(kNoCheckpointRequired) {} -LiteralPool::~LiteralPool() { +LiteralPool::~LiteralPool() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION { VIXL_ASSERT(IsEmpty()); VIXL_ASSERT(!IsBlocked()); for (std::vector::iterator it = deleted_on_destruction_.begin(); @@ -65,7 +65,7 @@ LiteralPool::~LiteralPool() { void LiteralPool::Reset() { - std::vector::iterator it, end; + std::vector::iterator it, end; for (it = entries_.begin(), end = entries_.end(); it != end; ++it) { RawLiteral* literal = *it; if (literal->deletion_policy_ == RawLiteral::kDeletedOnPlacementByPool) { @@ -133,19 +133,19 @@ void LiteralPool::Emit(EmitOption option) { masm_->SetAllowMacroInstructions(false); #endif if (option == kBranchRequired) { - ExactAssemblyScopeWithoutPoolsCheck guard(masm_, kInstructionSize); + ExactAssemblyScopeWithoutPoolsCheck eas_guard(masm_, kInstructionSize); masm_->b(&end_of_pool); } { // Marker indicating the size of the literal pool in 32-bit words. VIXL_ASSERT((pool_size % kWRegSizeInBytes) == 0); - ExactAssemblyScopeWithoutPoolsCheck guard(masm_, kInstructionSize); + ExactAssemblyScopeWithoutPoolsCheck eas_guard(masm_, kInstructionSize); masm_->ldr(xzr, static_cast(pool_size / kWRegSizeInBytes)); } // Now populate the literal pool. - std::vector::iterator it, end; + std::vector::iterator it, end; for (it = entries_.begin(), end = entries_.end(); it != end; ++it) { VIXL_ASSERT((*it)->IsUsed()); masm_->place(*it); @@ -321,11 +321,13 @@ MacroAssembler::MacroAssembler(PositionIndependentCodeOption pic) generate_simulator_code_(VIXL_AARCH64_GENERATE_SIMULATOR_CODE), sp_(sp), tmp_list_(ip0, ip1), - fptmp_list_(d31), + v_tmp_list_(d31), + p_tmp_list_(CPURegList::Empty(CPURegister::kPRegister)), current_scratch_scope_(NULL), literal_pool_(this), veneer_pool_(this), - recommended_checkpoint_(Pool::kNoCheckpointRequired) { + recommended_checkpoint_(Pool::kNoCheckpointRequired), + fp_nan_propagation_(NoFPMacroNaNPropagationSelected) { checkpoint_ = GetNextCheckPoint(); #ifndef VIXL_DEBUG USE(allow_macro_instructions_); @@ -342,11 +344,13 @@ MacroAssembler::MacroAssembler(size_t capacity, generate_simulator_code_(VIXL_AARCH64_GENERATE_SIMULATOR_CODE), sp_(sp), tmp_list_(ip0, ip1), - fptmp_list_(d31), + v_tmp_list_(d31), + p_tmp_list_(CPURegList::Empty(CPURegister::kPRegister)), current_scratch_scope_(NULL), literal_pool_(this), veneer_pool_(this), - recommended_checkpoint_(Pool::kNoCheckpointRequired) { + recommended_checkpoint_(Pool::kNoCheckpointRequired), + fp_nan_propagation_(NoFPMacroNaNPropagationSelected) { checkpoint_ = GetNextCheckPoint(); } @@ -361,11 +365,13 @@ MacroAssembler::MacroAssembler(byte* buffer, generate_simulator_code_(VIXL_AARCH64_GENERATE_SIMULATOR_CODE), sp_(sp), tmp_list_(ip0, ip1), - fptmp_list_(d31), + v_tmp_list_(d31), + p_tmp_list_(CPURegList::Empty(CPURegister::kPRegister)), current_scratch_scope_(NULL), literal_pool_(this), veneer_pool_(this), - recommended_checkpoint_(Pool::kNoCheckpointRequired) { + recommended_checkpoint_(Pool::kNoCheckpointRequired), + fp_nan_propagation_(NoFPMacroNaNPropagationSelected) { checkpoint_ = GetNextCheckPoint(); } @@ -504,44 +510,6 @@ int MacroAssembler::MoveImmediateHelper(MacroAssembler* masm, } -bool MacroAssembler::OneInstrMoveImmediateHelper(MacroAssembler* masm, - const Register& dst, - int64_t imm) { - bool emit_code = masm != NULL; - unsigned n, imm_s, imm_r; - int reg_size = dst.GetSizeInBits(); - - if (IsImmMovz(imm, reg_size) && !dst.IsSP()) { - // Immediate can be represented in a move zero instruction. Movz can't write - // to the stack pointer. - if (emit_code) { - masm->movz(dst, imm); - } - return true; - } else if (IsImmMovn(imm, reg_size) && !dst.IsSP()) { - // Immediate can be represented in a move negative instruction. Movn can't - // write to the stack pointer. - if (emit_code) { - masm->movn(dst, dst.Is64Bits() ? ~imm : (~imm & kWRegMask)); - } - return true; - } else if (IsImmLogical(imm, reg_size, &n, &imm_s, &imm_r)) { - // Immediate can be represented in a logical orr instruction. - VIXL_ASSERT(!dst.IsZero()); - if (emit_code) { - masm->LogicalImmediate(dst, - AppropriateZeroRegFor(dst), - n, - imm_s, - imm_r, - ORR); - } - return true; - } - return false; -} - - void MacroAssembler::B(Label* label, BranchType type, Register reg, int bit) { VIXL_ASSERT((reg.Is(NoReg) || (type >= kBranchTypeFirstUsingReg)) && ((bit == -1) || (type >= kBranchTypeFirstUsingBit))); @@ -819,6 +787,12 @@ void MacroAssembler::LogicalMacro(const Register& rd, // * 1 instruction to move to sp MacroEmissionCheckScope guard(this); UseScratchRegisterScope temps(this); + // Use `rd` as a temp, if we can. + temps.Include(rd); + // We read `rn` after evaluating `operand`. + temps.Exclude(rn); + // It doesn't matter if `operand` is in `temps` (e.g. because it alises `rd`) + // because we don't need it after it is evaluated. if (operand.IsImmediate()) { uint64_t immediate = operand.GetImmediate(); @@ -886,17 +860,18 @@ void MacroAssembler::LogicalMacro(const Register& rd, } else { // Immediate can't be encoded: synthesize using move immediate. Register temp = temps.AcquireSameSizeAs(rn); + VIXL_ASSERT(!temp.Aliases(rn)); // If the left-hand input is the stack pointer, we can't pre-shift the // immediate, as the encoding won't allow the subsequent post shift. PreShiftImmMode mode = rn.IsSP() ? kNoShift : kAnyShift; Operand imm_operand = MoveImmediateForShiftedOp(temp, immediate, mode); - if (rd.Is(sp)) { + if (rd.Is(sp) || rd.Is(wsp)) { // If rd is the stack pointer we cannot use it as the destination // register so we use the temp register as an intermediate again. Logical(temp, rn, imm_operand, op); - Mov(sp, temp); + Mov(rd, temp); } else { Logical(rd, rn, imm_operand, op); } @@ -910,8 +885,8 @@ void MacroAssembler::LogicalMacro(const Register& rd, operand.GetRegister().Is64Bits() || ((operand.GetExtend() != UXTX) && (operand.GetExtend() != SXTX))); - temps.Exclude(operand.GetRegister()); Register temp = temps.AcquireSameSizeAs(rn); + VIXL_ASSERT(!temp.Aliases(rn)); EmitExtendShift(temp, operand.GetRegister(), operand.GetExtend(), @@ -1086,7 +1061,7 @@ void MacroAssembler::Movi64bitHelper(const VRegister& vd, uint64_t imm) { Register temp = temps.AcquireX(); Mov(temp, imm); if (vd.Is1D()) { - mov(vd.D(), 0, temp); + fmov(vd.D(), temp); } else { dup(vd.V2D(), temp); } @@ -1122,11 +1097,21 @@ void MacroAssembler::Movi(const VRegister& vd, void MacroAssembler::Movi(const VRegister& vd, uint64_t hi, uint64_t lo) { // TODO: Move 128-bit values in a more efficient way. VIXL_ASSERT(vd.Is128Bits()); - UseScratchRegisterScope temps(this); - Movi(vd.V2D(), lo); - Register temp = temps.AcquireX(); - Mov(temp, hi); - Ins(vd.V2D(), 1, temp); + if (hi == lo) { + Movi(vd.V2D(), lo); + return; + } + + Movi(vd.V1D(), lo); + + if (hi != 0) { + UseScratchRegisterScope temps(this); + // TODO: Figure out if using a temporary V register to materialise the + // immediate is better. + Register temp = temps.AcquireX(); + Mov(temp, hi); + Ins(vd.V2D(), 1, temp); + } } @@ -1139,17 +1124,13 @@ void MacroAssembler::Mvn(const Register& rd, const Operand& operand) { // Call the macro assembler for generic immediates. Mvn(rd, operand.GetImmediate()); } else if (operand.IsExtendedRegister()) { - UseScratchRegisterScope temps(this); - temps.Exclude(operand.GetRegister()); - // Emit two instructions for the extend case. This differs from Mov, as // the extend and invert can't be achieved in one instruction. - Register temp = temps.AcquireSameSizeAs(rd); - EmitExtendShift(temp, + EmitExtendShift(rd, operand.GetRegister(), operand.GetExtend(), operand.GetShiftAmount()); - mvn(rd, Operand(temp)); + mvn(rd, rd); } else { // Otherwise, register and shifted register cases can be handled by the // assembler directly, using orn. @@ -1418,12 +1399,15 @@ void MacroAssembler::Add(const Register& rd, const Operand& operand, FlagsUpdate S) { VIXL_ASSERT(allow_macro_instructions_); - if (operand.IsImmediate() && (operand.GetImmediate() < 0) && - IsImmAddSub(-operand.GetImmediate())) { - AddSubMacro(rd, rn, -operand.GetImmediate(), S, SUB); - } else { - AddSubMacro(rd, rn, operand, S, ADD); + if (operand.IsImmediate()) { + int64_t imm = operand.GetImmediate(); + if ((imm < 0) && (imm != std::numeric_limits::min()) && + IsImmAddSub(-imm)) { + AddSubMacro(rd, rn, -imm, S, SUB); + return; + } } + AddSubMacro(rd, rn, operand, S, ADD); } @@ -1433,18 +1417,85 @@ void MacroAssembler::Adds(const Register& rd, Add(rd, rn, operand, SetFlags); } +#define MINMAX(V) \ + V(Smax, smax, IsInt8) \ + V(Smin, smin, IsInt8) \ + V(Umax, umax, IsUint8) \ + V(Umin, umin, IsUint8) + +#define VIXL_DEFINE_MASM_FUNC(MASM, ASM, RANGE) \ + void MacroAssembler::MASM(const Register& rd, \ + const Register& rn, \ + const Operand& op) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + if (op.IsImmediate()) { \ + int64_t imm = op.GetImmediate(); \ + if (!RANGE(imm)) { \ + UseScratchRegisterScope temps(this); \ + Register temp = temps.AcquireSameSizeAs(rd); \ + Mov(temp, imm); \ + MASM(rd, rn, temp); \ + return; \ + } \ + } \ + SingleEmissionCheckScope guard(this); \ + ASM(rd, rn, op); \ + } +MINMAX(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +void MacroAssembler::St2g(const Register& rt, const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st2g(rt, addr); +} + +void MacroAssembler::Stg(const Register& rt, const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + stg(rt, addr); +} + +void MacroAssembler::Stgp(const Register& rt1, + const Register& rt2, + const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + stgp(rt1, rt2, addr); +} + +void MacroAssembler::Stz2g(const Register& rt, const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + stz2g(rt, addr); +} + +void MacroAssembler::Stzg(const Register& rt, const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + stzg(rt, addr); +} + +void MacroAssembler::Ldg(const Register& rt, const MemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldg(rt, addr); +} void MacroAssembler::Sub(const Register& rd, const Register& rn, const Operand& operand, FlagsUpdate S) { VIXL_ASSERT(allow_macro_instructions_); - if (operand.IsImmediate() && (operand.GetImmediate() < 0) && - IsImmAddSub(-operand.GetImmediate())) { - AddSubMacro(rd, rn, -operand.GetImmediate(), S, ADD); - } else { - AddSubMacro(rd, rn, operand, S, SUB); + if (operand.IsImmediate()) { + int64_t imm = operand.GetImmediate(); + if ((imm < 0) && (imm != std::numeric_limits::min()) && + IsImmAddSub(-imm)) { + AddSubMacro(rd, rn, -imm, S, ADD); + return; + } } + AddSubMacro(rd, rn, operand, S, SUB); } @@ -1467,9 +1518,7 @@ void MacroAssembler::Cmp(const Register& rn, const Operand& operand) { } -void MacroAssembler::Fcmp(const FPRegister& fn, - double value, - FPTrapFlags trap) { +void MacroAssembler::Fcmp(const VRegister& fn, double value, FPTrapFlags trap) { VIXL_ASSERT(allow_macro_instructions_); // The worst case for size is: // * 1 to materialise the constant, using literal pool if necessary @@ -1477,7 +1526,7 @@ void MacroAssembler::Fcmp(const FPRegister& fn, MacroEmissionCheckScope guard(this); if (value != 0.0) { UseScratchRegisterScope temps(this); - FPRegister tmp = temps.AcquireSameSizeAs(fn); + VRegister tmp = temps.AcquireSameSizeAs(fn); Fmov(tmp, value); FPCompareMacro(fn, tmp, trap); } else { @@ -1486,7 +1535,7 @@ void MacroAssembler::Fcmp(const FPRegister& fn, } -void MacroAssembler::Fcmpe(const FPRegister& fn, double value) { +void MacroAssembler::Fcmpe(const VRegister& fn, double value) { Fcmp(fn, value, EnableTrap); } @@ -1495,6 +1544,12 @@ void MacroAssembler::Fmov(VRegister vd, double imm) { VIXL_ASSERT(allow_macro_instructions_); // Floating point immediates are loaded through the literal pool. MacroEmissionCheckScope guard(this); + uint64_t rawbits = DoubleToRawbits(imm); + + if (rawbits == 0) { + fmov(vd.D(), xzr); + return; + } if (vd.Is1H() || vd.Is4H() || vd.Is8H()) { Fmov(vd, Float16(imm)); @@ -1507,23 +1562,16 @@ void MacroAssembler::Fmov(VRegister vd, double imm) { } VIXL_ASSERT(vd.Is1D() || vd.Is2D()); - if (IsImmFP64(imm)) { + if (IsImmFP64(rawbits)) { fmov(vd, imm); + } else if (vd.IsScalar()) { + ldr(vd, + new Literal(imm, + &literal_pool_, + RawLiteral::kDeletedOnPlacementByPool)); } else { - uint64_t rawbits = DoubleToRawbits(imm); - if (vd.IsScalar()) { - if (rawbits == 0) { - fmov(vd, xzr); - } else { - ldr(vd, - new Literal(imm, - &literal_pool_, - RawLiteral::kDeletedOnPlacementByPool)); - } - } else { - // TODO: consider NEON support for load literal. - Movi(vd, rawbits); - } + // TODO: consider NEON support for load literal. + Movi(vd, rawbits); } } @@ -1532,6 +1580,12 @@ void MacroAssembler::Fmov(VRegister vd, float imm) { VIXL_ASSERT(allow_macro_instructions_); // Floating point immediates are loaded through the literal pool. MacroEmissionCheckScope guard(this); + uint32_t rawbits = FloatToRawbits(imm); + + if (rawbits == 0) { + fmov(vd.S(), wzr); + return; + } if (vd.Is1H() || vd.Is4H() || vd.Is8H()) { Fmov(vd, Float16(imm)); @@ -1544,23 +1598,16 @@ void MacroAssembler::Fmov(VRegister vd, float imm) { } VIXL_ASSERT(vd.Is1S() || vd.Is2S() || vd.Is4S()); - if (IsImmFP32(imm)) { + if (IsImmFP32(rawbits)) { fmov(vd, imm); + } else if (vd.IsScalar()) { + ldr(vd, + new Literal(imm, + &literal_pool_, + RawLiteral::kDeletedOnPlacementByPool)); } else { - uint32_t rawbits = FloatToRawbits(imm); - if (vd.IsScalar()) { - if (rawbits == 0) { - fmov(vd, wzr); - } else { - ldr(vd, - new Literal(imm, - &literal_pool_, - RawLiteral::kDeletedOnPlacementByPool)); - } - } else { - // TODO: consider NEON support for load literal. - Movi(vd, rawbits); - } + // TODO: consider NEON support for load literal. + Movi(vd, rawbits); } } @@ -1619,13 +1666,13 @@ void MacroAssembler::Negs(const Register& rd, const Operand& operand) { bool MacroAssembler::TryOneInstrMoveImmediate(const Register& dst, - int64_t imm) { + uint64_t imm) { return OneInstrMoveImmediateHelper(this, dst, imm); } Operand MacroAssembler::MoveImmediateForShiftedOp(const Register& dst, - int64_t imm, + uint64_t imm, PreShiftImmMode mode) { int reg_size = dst.GetSizeInBits(); @@ -1642,12 +1689,17 @@ Operand MacroAssembler::MoveImmediateForShiftedOp(const Register& dst, // immediate is tested. shift_low = std::min(shift_low, 4); } - int64_t imm_low = imm >> shift_low; + // TryOneInstrMoveImmediate handles `imm` with a value of zero, so shift_low + // must lie in the range [0, 63], and the shifts below are well-defined. + VIXL_ASSERT((shift_low >= 0) && (shift_low < 64)); + // imm_low = imm >> shift_low (with sign extension) + uint64_t imm_low = ExtractSignedBitfield64(63, shift_low, imm); // Pre-shift the immediate to the most-significant bits of the register, // inserting set bits in the least-significant bits. int shift_high = CountLeadingZeros(imm, reg_size); - int64_t imm_high = (imm << shift_high) | ((INT64_C(1) << shift_high) - 1); + VIXL_ASSERT((shift_high >= 0) && (shift_high < 64)); + uint64_t imm_high = (imm << shift_high) | GetUintMask(shift_high); if ((mode != kNoShift) && TryOneInstrMoveImmediate(dst, imm_low)) { // The new immediate has been moved into the destination's low bits: @@ -1754,6 +1806,12 @@ void MacroAssembler::AddSubMacro(const Register& rd, (rn.IsZero() && !operand.IsShiftedRegister()) || (operand.IsShiftedRegister() && (operand.GetShift() == ROR))) { UseScratchRegisterScope temps(this); + // Use `rd` as a temp, if we can. + temps.Include(rd); + // We read `rn` after evaluating `operand`. + temps.Exclude(rn); + // It doesn't matter if `operand` is in `temps` (e.g. because it alises + // `rd`) because we don't need it after it is evaluated. Register temp = temps.AcquireSameSizeAs(rn); if (operand.IsImmediate()) { PreShiftImmMode mode = kAnyShift; @@ -1839,6 +1897,12 @@ void MacroAssembler::AddSubWithCarryMacro(const Register& rd, // * 1 instruction for add/sub MacroEmissionCheckScope guard(this); UseScratchRegisterScope temps(this); + // Use `rd` as a temp, if we can. + temps.Include(rd); + // We read `rn` after evaluating `operand`. + temps.Exclude(rn); + // It doesn't matter if `operand` is in `temps` (e.g. because it alises `rd`) + // because we don't need it after it is evaluated. if (operand.IsImmediate() || (operand.IsShiftedRegister() && (operand.GetShift() == ROR))) { @@ -1853,7 +1917,6 @@ void MacroAssembler::AddSubWithCarryMacro(const Register& rd, VIXL_ASSERT( IsUintN(rd.GetSizeInBits() == kXRegSize ? kXRegSizeLog2 : kWRegSizeLog2, operand.GetShiftAmount())); - temps.Exclude(operand.GetRegister()); Register temp = temps.AcquireSameSizeAs(rn); EmitShift(temp, operand.GetRegister(), @@ -1869,7 +1932,6 @@ void MacroAssembler::AddSubWithCarryMacro(const Register& rd, VIXL_ASSERT( operand.GetRegister().Is64Bits() || ((operand.GetExtend() != UXTX) && (operand.GetExtend() != SXTX))); - temps.Exclude(operand.GetRegister()); Register temp = temps.AcquireSameSizeAs(rn); EmitExtendShift(temp, operand.GetRegister(), @@ -1918,6 +1980,9 @@ LS_MACRO_LIST(DEFINE_FUNCTION) void MacroAssembler::LoadStoreMacro(const CPURegister& rt, const MemOperand& addr, LoadStoreOp op) { + VIXL_ASSERT(addr.IsImmediateOffset() || addr.IsImmediatePostIndex() || + addr.IsImmediatePreIndex() || addr.IsRegisterOffset()); + // Worst case is ldr/str pre/post index: // * 1 instruction for ldr/str // * up to 4 instructions to materialise the constant @@ -1938,11 +2003,11 @@ void MacroAssembler::LoadStoreMacro(const CPURegister& rt, Register temp = temps.AcquireSameSizeAs(addr.GetBaseRegister()); Mov(temp, addr.GetOffset()); LoadStore(rt, MemOperand(addr.GetBaseRegister(), temp), op); - } else if (addr.IsPostIndex() && !IsImmLSUnscaled(offset)) { + } else if (addr.IsImmediatePostIndex() && !IsImmLSUnscaled(offset)) { // Post-index beyond unscaled addressing range. LoadStore(rt, MemOperand(addr.GetBaseRegister()), op); Add(addr.GetBaseRegister(), addr.GetBaseRegister(), Operand(offset)); - } else if (addr.IsPreIndex() && !IsImmLSUnscaled(offset)) { + } else if (addr.IsImmediatePreIndex() && !IsImmLSUnscaled(offset)) { // Pre-index beyond unscaled addressing range. Add(addr.GetBaseRegister(), addr.GetBaseRegister(), Operand(offset)); LoadStore(rt, MemOperand(addr.GetBaseRegister()), op); @@ -1990,11 +2055,11 @@ void MacroAssembler::LoadStorePairMacro(const CPURegister& rt, Register temp = temps.AcquireSameSizeAs(base); Add(temp, base, offset); LoadStorePair(rt, rt2, MemOperand(temp), op); - } else if (addr.IsPostIndex()) { + } else if (addr.IsImmediatePostIndex()) { LoadStorePair(rt, rt2, MemOperand(base), op); Add(base, base, offset); } else { - VIXL_ASSERT(addr.IsPreIndex()); + VIXL_ASSERT(addr.IsImmediatePreIndex()); Add(base, base, offset); LoadStorePair(rt, rt2, MemOperand(base), op); } @@ -2066,7 +2131,7 @@ void MacroAssembler::Pop(const CPURegister& dst0, void MacroAssembler::PushCPURegList(CPURegList registers) { VIXL_ASSERT(!registers.Overlaps(*GetScratchRegisterList())); - VIXL_ASSERT(!registers.Overlaps(*GetScratchFPRegisterList())); + VIXL_ASSERT(!registers.Overlaps(*GetScratchVRegisterList())); VIXL_ASSERT(allow_macro_instructions_); int reg_size = registers.GetRegisterSizeInBytes(); @@ -2098,7 +2163,7 @@ void MacroAssembler::PushCPURegList(CPURegList registers) { void MacroAssembler::PopCPURegList(CPURegList registers) { VIXL_ASSERT(!registers.Overlaps(*GetScratchRegisterList())); - VIXL_ASSERT(!registers.Overlaps(*GetScratchFPRegisterList())); + VIXL_ASSERT(!registers.Overlaps(*GetScratchVRegisterList())); VIXL_ASSERT(allow_macro_instructions_); int reg_size = registers.GetRegisterSizeInBytes(); @@ -2394,7 +2459,8 @@ void MacroAssembler::LoadStoreCPURegListHelper(LoadStoreCPURegListAction op, // We do not handle pre-indexing or post-indexing. VIXL_ASSERT(!(mem.IsPreIndex() || mem.IsPostIndex())); VIXL_ASSERT(!registers.Overlaps(tmp_list_)); - VIXL_ASSERT(!registers.Overlaps(fptmp_list_)); + VIXL_ASSERT(!registers.Overlaps(v_tmp_list_)); + VIXL_ASSERT(!registers.Overlaps(p_tmp_list_)); VIXL_ASSERT(!registers.IncludesAliasOf(sp)); UseScratchRegisterScope temps(this); @@ -2478,8 +2544,7 @@ void MacroAssembler::BumpSystemStackPointer(const Operand& space) { } -// TODO(all): Fix printf for NEON registers, and resolve whether we should be -// using FPRegister or VRegister here. +// TODO(all): Fix printf for NEON and SVE registers. // This is the main Printf implementation. All callee-saved registers are // preserved, but NZCV and the caller-saved registers may be clobbered. @@ -2502,7 +2567,7 @@ void MacroAssembler::PrintfNoPreserve(const char* format, // format string. static const CPURegList kPCSVarargs = CPURegList(CPURegister::kRegister, kXRegSize, 1, arg_count); - static const CPURegList kPCSVarargsFP = + static const CPURegList kPCSVarargsV = CPURegList(CPURegister::kVRegister, kDRegSize, 0, arg_count - 1); // We can use caller-saved registers as scratch values, except for the @@ -2511,12 +2576,12 @@ void MacroAssembler::PrintfNoPreserve(const char* format, temps.Include(kCallerSaved); temps.Include(kCallerSavedV); temps.Exclude(kPCSVarargs); - temps.Exclude(kPCSVarargsFP); + temps.Exclude(kPCSVarargsV); temps.Exclude(arg0, arg1, arg2, arg3); // Copies of the arg lists that we can iterate through. CPURegList pcs_varargs = kPCSVarargs; - CPURegList pcs_varargs_fp = kPCSVarargsFP; + CPURegList pcs_varargs_fp = kPCSVarargsV; // Place the arguments. There are lots of clever tricks and optimizations we // could use here, but Printf is a debug tool so instead we just try to keep @@ -2544,15 +2609,15 @@ void MacroAssembler::PrintfNoPreserve(const char* format, // Otherwise, if the argument is in a PCS argument register, allocate an // appropriate scratch register and then move it out of the way. if (kPCSVarargs.IncludesAliasOf(args[i]) || - kPCSVarargsFP.IncludesAliasOf(args[i])) { + kPCSVarargsV.IncludesAliasOf(args[i])) { if (args[i].IsRegister()) { Register old_arg = Register(args[i]); Register new_arg = temps.AcquireSameSizeAs(old_arg); Mov(new_arg, old_arg); args[i] = new_arg; } else { - FPRegister old_arg = FPRegister(args[i]); - FPRegister new_arg = temps.AcquireSameSizeAs(old_arg); + VRegister old_arg(args[i]); + VRegister new_arg = temps.AcquireSameSizeAs(old_arg); Fmov(new_arg, old_arg); args[i] = new_arg; } @@ -2568,9 +2633,9 @@ void MacroAssembler::PrintfNoPreserve(const char* format, } else { VIXL_ASSERT(pcs[i].IsVRegister()); if (pcs[i].GetSizeInBits() == args[i].GetSizeInBits()) { - Fmov(FPRegister(pcs[i]), FPRegister(args[i])); + Fmov(VRegister(pcs[i]), VRegister(args[i])); } else { - Fcvt(FPRegister(pcs[i]), FPRegister(args[i])); + Fcvt(VRegister(pcs[i]), VRegister(args[i])); } } } @@ -2763,32 +2828,6 @@ void MacroAssembler::Log(TraceParameters parameters) { } -void MacroAssembler::EnableInstrumentation() { - VIXL_ASSERT(!isprint(InstrumentStateEnable)); - ExactAssemblyScope scope(this, kInstructionSize); - movn(xzr, InstrumentStateEnable); -} - - -void MacroAssembler::DisableInstrumentation() { - VIXL_ASSERT(!isprint(InstrumentStateDisable)); - ExactAssemblyScope scope(this, kInstructionSize); - movn(xzr, InstrumentStateDisable); -} - - -void MacroAssembler::AnnotateInstrumentation(const char* marker_name) { - VIXL_ASSERT(strlen(marker_name) == 2); - - // We allow only printable characters in the marker names. Unprintable - // characters are reserved for controlling features of the instrumentation. - VIXL_ASSERT(isprint(marker_name[0]) && isprint(marker_name[1])); - - ExactAssemblyScope scope(this, kInstructionSize); - movn(xzr, (marker_name[1] << 8) | marker_name[0]); -} - - void MacroAssembler::SetSimulatorCPUFeatures(const CPUFeatures& features) { ConfigureSimulatorCPUFeaturesHelper(features, kSetCPUFeaturesOpcode); } @@ -2868,11 +2907,14 @@ void UseScratchRegisterScope::Open(MacroAssembler* masm) { masm_ = masm; CPURegList* available = masm->GetScratchRegisterList(); - CPURegList* available_fp = masm->GetScratchFPRegisterList(); + CPURegList* available_v = masm->GetScratchVRegisterList(); + CPURegList* available_p = masm->GetScratchPRegisterList(); old_available_ = available->GetList(); - old_availablefp_ = available_fp->GetList(); + old_available_v_ = available_v->GetList(); + old_available_p_ = available_p->GetList(); VIXL_ASSERT(available->GetType() == CPURegister::kRegister); - VIXL_ASSERT(available_fp->GetType() == CPURegister::kVRegister); + VIXL_ASSERT(available_v->GetType() == CPURegister::kVRegister); + VIXL_ASSERT(available_p->GetType() == CPURegister::kPRegister); parent_ = masm->GetCurrentScratchRegisterScope(); masm->SetCurrentScratchRegisterScope(this); @@ -2889,7 +2931,8 @@ void UseScratchRegisterScope::Close() { masm_->SetCurrentScratchRegisterScope(parent_); masm_->GetScratchRegisterList()->SetList(old_available_); - masm_->GetScratchFPRegisterList()->SetList(old_availablefp_); + masm_->GetScratchVRegisterList()->SetList(old_available_v_); + masm_->GetScratchPRegisterList()->SetList(old_available_p_); masm_ = NULL; } @@ -2898,44 +2941,46 @@ void UseScratchRegisterScope::Close() { bool UseScratchRegisterScope::IsAvailable(const CPURegister& reg) const { return masm_->GetScratchRegisterList()->IncludesAliasOf(reg) || - masm_->GetScratchFPRegisterList()->IncludesAliasOf(reg); + masm_->GetScratchVRegisterList()->IncludesAliasOf(reg) || + masm_->GetScratchPRegisterList()->IncludesAliasOf(reg); } - Register UseScratchRegisterScope::AcquireRegisterOfSize(int size_in_bits) { - int code = AcquireNextAvailable(masm_->GetScratchRegisterList()).GetCode(); + int code = AcquireFrom(masm_->GetScratchRegisterList()).GetCode(); return Register(code, size_in_bits); } -FPRegister UseScratchRegisterScope::AcquireVRegisterOfSize(int size_in_bits) { - int code = AcquireNextAvailable(masm_->GetScratchFPRegisterList()).GetCode(); - return FPRegister(code, size_in_bits); +VRegister UseScratchRegisterScope::AcquireVRegisterOfSize(int size_in_bits) { + int code = AcquireFrom(masm_->GetScratchVRegisterList()).GetCode(); + return VRegister(code, size_in_bits); } void UseScratchRegisterScope::Release(const CPURegister& reg) { VIXL_ASSERT(masm_ != NULL); - if (reg.IsRegister()) { - ReleaseByCode(masm_->GetScratchRegisterList(), reg.GetCode()); - } else if (reg.IsVRegister()) { - ReleaseByCode(masm_->GetScratchFPRegisterList(), reg.GetCode()); - } else { - VIXL_ASSERT(reg.IsNone()); - } + + // Release(NoReg) has no effect. + if (reg.IsNone()) return; + + ReleaseByCode(GetAvailableListFor(reg.GetBank()), reg.GetCode()); } void UseScratchRegisterScope::Include(const CPURegList& list) { VIXL_ASSERT(masm_ != NULL); + + // Including an empty list has no effect. + if (list.IsEmpty()) return; + VIXL_ASSERT(list.GetType() != CPURegister::kNoRegister); + + RegList reg_list = list.GetList(); if (list.GetType() == CPURegister::kRegister) { // Make sure that neither sp nor xzr are included the list. - IncludeByRegList(masm_->GetScratchRegisterList(), - list.GetList() & ~(xzr.GetBit() | sp.GetBit())); - } else { - VIXL_ASSERT(list.GetType() == CPURegister::kVRegister); - IncludeByRegList(masm_->GetScratchFPRegisterList(), list.GetList()); + reg_list &= ~(xzr.GetBit() | sp.GetBit()); } + + IncludeByRegList(GetAvailableListFor(list.GetBank()), reg_list); } @@ -2953,23 +2998,53 @@ void UseScratchRegisterScope::Include(const Register& reg1, } -void UseScratchRegisterScope::Include(const FPRegister& reg1, - const FPRegister& reg2, - const FPRegister& reg3, - const FPRegister& reg4) { +void UseScratchRegisterScope::Include(const VRegister& reg1, + const VRegister& reg2, + const VRegister& reg3, + const VRegister& reg4) { RegList include = reg1.GetBit() | reg2.GetBit() | reg3.GetBit() | reg4.GetBit(); - IncludeByRegList(masm_->GetScratchFPRegisterList(), include); + IncludeByRegList(masm_->GetScratchVRegisterList(), include); } -void UseScratchRegisterScope::Exclude(const CPURegList& list) { - if (list.GetType() == CPURegister::kRegister) { - ExcludeByRegList(masm_->GetScratchRegisterList(), list.GetList()); - } else { - VIXL_ASSERT(list.GetType() == CPURegister::kVRegister); - ExcludeByRegList(masm_->GetScratchFPRegisterList(), list.GetList()); +void UseScratchRegisterScope::Include(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4) { + RegList include = 0; + RegList include_v = 0; + RegList include_p = 0; + + const CPURegister regs[] = {reg1, reg2, reg3, reg4}; + + for (size_t i = 0; i < ArrayLength(regs); i++) { + RegList bit = regs[i].GetBit(); + switch (regs[i].GetBank()) { + case CPURegister::kNoRegisterBank: + // Include(NoReg) has no effect. + VIXL_ASSERT(regs[i].IsNone()); + break; + case CPURegister::kRRegisterBank: + include |= bit; + break; + case CPURegister::kVRegisterBank: + include_v |= bit; + break; + case CPURegister::kPRegisterBank: + include_p |= bit; + break; + } } + + IncludeByRegList(masm_->GetScratchRegisterList(), include); + IncludeByRegList(masm_->GetScratchVRegisterList(), include_v); + IncludeByRegList(masm_->GetScratchPRegisterList(), include_p); +} + + +void UseScratchRegisterScope::Exclude(const CPURegList& list) { + ExcludeByRegList(GetAvailableListFor(list.GetBank()), list.GetList()); } @@ -2983,13 +3058,13 @@ void UseScratchRegisterScope::Exclude(const Register& reg1, } -void UseScratchRegisterScope::Exclude(const FPRegister& reg1, - const FPRegister& reg2, - const FPRegister& reg3, - const FPRegister& reg4) { - RegList excludefp = +void UseScratchRegisterScope::Exclude(const VRegister& reg1, + const VRegister& reg2, + const VRegister& reg3, + const VRegister& reg4) { + RegList exclude_v = reg1.GetBit() | reg2.GetBit() | reg3.GetBit() | reg4.GetBit(); - ExcludeByRegList(masm_->GetScratchFPRegisterList(), excludefp); + ExcludeByRegList(masm_->GetScratchVRegisterList(), exclude_v); } @@ -2998,37 +3073,50 @@ void UseScratchRegisterScope::Exclude(const CPURegister& reg1, const CPURegister& reg3, const CPURegister& reg4) { RegList exclude = 0; - RegList excludefp = 0; + RegList exclude_v = 0; + RegList exclude_p = 0; const CPURegister regs[] = {reg1, reg2, reg3, reg4}; for (size_t i = 0; i < ArrayLength(regs); i++) { - if (regs[i].IsRegister()) { - exclude |= regs[i].GetBit(); - } else if (regs[i].IsFPRegister()) { - excludefp |= regs[i].GetBit(); - } else { - VIXL_ASSERT(regs[i].IsNone()); + RegList bit = regs[i].GetBit(); + switch (regs[i].GetBank()) { + case CPURegister::kNoRegisterBank: + // Exclude(NoReg) has no effect. + VIXL_ASSERT(regs[i].IsNone()); + break; + case CPURegister::kRRegisterBank: + exclude |= bit; + break; + case CPURegister::kVRegisterBank: + exclude_v |= bit; + break; + case CPURegister::kPRegisterBank: + exclude_p |= bit; + break; } } ExcludeByRegList(masm_->GetScratchRegisterList(), exclude); - ExcludeByRegList(masm_->GetScratchFPRegisterList(), excludefp); + ExcludeByRegList(masm_->GetScratchVRegisterList(), exclude_v); + ExcludeByRegList(masm_->GetScratchPRegisterList(), exclude_p); } void UseScratchRegisterScope::ExcludeAll() { ExcludeByRegList(masm_->GetScratchRegisterList(), masm_->GetScratchRegisterList()->GetList()); - ExcludeByRegList(masm_->GetScratchFPRegisterList(), - masm_->GetScratchFPRegisterList()->GetList()); + ExcludeByRegList(masm_->GetScratchVRegisterList(), + masm_->GetScratchVRegisterList()->GetList()); + ExcludeByRegList(masm_->GetScratchPRegisterList(), + masm_->GetScratchPRegisterList()->GetList()); } -CPURegister UseScratchRegisterScope::AcquireNextAvailable( - CPURegList* available) { - VIXL_CHECK(!available->IsEmpty()); - CPURegister result = available->PopLowestIndex(); +CPURegister UseScratchRegisterScope::AcquireFrom(CPURegList* available, + RegList mask) { + VIXL_CHECK((available->GetList() & mask) != 0); + CPURegister result = available->PopLowestIndex(mask); VIXL_ASSERT(!AreAliased(result, xzr, sp)); return result; } @@ -3056,5 +3144,21 @@ void UseScratchRegisterScope::ExcludeByRegList(CPURegList* available, available->SetList(available->GetList() & ~exclude); } +CPURegList* UseScratchRegisterScope::GetAvailableListFor( + CPURegister::RegisterBank bank) { + switch (bank) { + case CPURegister::kNoRegisterBank: + return NULL; + case CPURegister::kRRegisterBank: + return masm_->GetScratchRegisterList(); + case CPURegister::kVRegisterBank: + return masm_->GetScratchVRegisterList(); + case CPURegister::kPRegisterBank: + return masm_->GetScratchPRegisterList(); + } + VIXL_UNREACHABLE(); + return NULL; +} + } // namespace aarch64 } // namespace vixl diff --git a/core/deps/vixl/aarch64/macro-assembler-aarch64.h b/core/deps/vixl/aarch64/macro-assembler-aarch64.h index bdd854949..78c9e9a43 100644 --- a/core/deps/vixl/aarch64/macro-assembler-aarch64.h +++ b/core/deps/vixl/aarch64/macro-assembler-aarch64.h @@ -35,7 +35,6 @@ #include "../macro-assembler-interface.h" #include "assembler-aarch64.h" -#include "instrument-aarch64.h" // Required for runtime call support. // TODO: Break this dependency. We should be able to separate out the necessary // parts so that we don't need to include the whole simulator header. @@ -61,7 +60,7 @@ #define LSPAIR_MACRO_LIST(V) \ V(Ldp, CPURegister&, rt, rt2, LoadPairOpFor(rt, rt2)) \ V(Stp, CPURegister&, rt, rt2, StorePairOpFor(rt, rt2)) \ - V(Ldpsw, CPURegister&, rt, rt2, LDPSW_x) + V(Ldpsw, Register&, rt, rt2, LDPSW_x) namespace vixl { namespace aarch64 { @@ -109,7 +108,7 @@ class Pool { class LiteralPool : public Pool { public: explicit LiteralPool(MacroAssembler* masm); - ~LiteralPool(); + ~LiteralPool() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION; void Reset(); void AddEntry(RawLiteral* literal); @@ -528,6 +527,57 @@ class MacroEmissionCheckScope : public EmissionCheckScope { }; +// This scope simplifies the handling of the SVE `movprfx` instruction. +// +// If dst.Aliases(src): +// - Start an ExactAssemblyScope(masm, kInstructionSize). +// Otherwise: +// - Start an ExactAssemblyScope(masm, 2 * kInstructionSize). +// - Generate a suitable `movprfx` instruction. +// +// In both cases, the ExactAssemblyScope is left with enough remaining space for +// exactly one destructive instruction. +class MovprfxHelperScope : public ExactAssemblyScope { + public: + inline MovprfxHelperScope(MacroAssembler* masm, + const ZRegister& dst, + const ZRegister& src); + + inline MovprfxHelperScope(MacroAssembler* masm, + const ZRegister& dst, + const PRegister& pg, + const ZRegister& src); + + // TODO: Implement constructors that examine _all_ sources. If `dst` aliases + // any other source register, we can't use `movprfx`. This isn't obviously + // useful, but the MacroAssembler should not generate invalid code for it. + // Valid behaviour can be implemented using `mov`. + // + // The best way to handle this in an instruction-agnostic way is probably to + // use variadic templates. + + private: + inline bool ShouldGenerateMovprfx(const ZRegister& dst, + const ZRegister& src) { + VIXL_ASSERT(AreSameLaneSize(dst, src)); + return !dst.Aliases(src); + } + + inline bool ShouldGenerateMovprfx(const ZRegister& dst, + const PRegister& pg, + const ZRegister& src) { + VIXL_ASSERT(pg.IsMerging() || pg.IsZeroing()); + // We need to emit movprfx in two cases: + // 1. To give a predicated merging unary instruction zeroing predication. + // 2. To make destructive instructions constructive. + // + // There are no predicated zeroing instructions that can take movprfx, so we + // will never generate an unnecessary movprfx with this logic. + return pg.IsZeroing() || ShouldGenerateMovprfx(dst, src); + } +}; + + enum BranchType { // Copies of architectural conditions. // The associated conditions can be used in place of those, the code will @@ -566,7 +616,19 @@ enum BranchType { kBranchTypeFirstCondition = eq, kBranchTypeLastCondition = nv, kBranchTypeFirstUsingReg = reg_zero, - kBranchTypeFirstUsingBit = reg_bit_clear + kBranchTypeFirstUsingBit = reg_bit_clear, + + // SVE branch conditions. + integer_none = eq, + integer_any = ne, + integer_nlast = cs, + integer_last = cc, + integer_first = mi, + integer_nfrst = pl, + integer_pmore = hi, + integer_plast = ls, + integer_tcont = ge, + integer_tstop = lt }; @@ -587,6 +649,18 @@ enum PreShiftImmMode { kAnyShift // Allow any pre-shift. }; +enum FPMacroNaNPropagationOption { + // The default option. This generates a run-time error in macros that respect + // this option. + NoFPMacroNaNPropagationSelected, + // For example, Fmin(result, NaN(a), NaN(b)) always selects NaN(a) if both + // NaN(a) and NaN(b) are both quiet, or both are signalling, at the + // cost of extra code generation in some cases. + StrictNaNPropagation, + // For example, Fmin(result, NaN(a), NaN(b)) selects either NaN, but using the + // fewest instructions. + FastNaNPropagation +}; class MacroAssembler : public Assembler, public MacroAssemblerInterface { public: @@ -642,9 +716,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { static int MoveImmediateHelper(MacroAssembler* masm, const Register& rd, uint64_t imm); - static bool OneInstrMoveImmediateHelper(MacroAssembler* masm, - const Register& dst, - int64_t imm); // Logical macros. @@ -714,7 +785,7 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { // Try to move an immediate into the destination register in a single // instruction. Returns true for success, and updates the contents of dst. // Returns false, otherwise. - bool TryOneInstrMoveImmediate(const Register& dst, int64_t imm); + bool TryOneInstrMoveImmediate(const Register& dst, uint64_t imm); // Move an immediate into register dst, and return an Operand object for // use with a subsequent instruction that accepts a shift. The value moved @@ -722,7 +793,7 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { // operation applied to it that will be subsequently undone by the shift // applied in the Operand. Operand MoveImmediateForShiftedOp(const Register& dst, - int64_t imm, + uint64_t imm, PreShiftImmMode mode); void Move(const GenericOperand& dst, const GenericOperand& src); @@ -946,6 +1017,20 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { void Claim(const Operand& size); void Drop(const Operand& size); + // As above, but for multiples of the SVE vector length. + void ClaimVL(int64_t multiplier) { + // We never need to worry about sp alignment because the VL is always a + // multiple of 16. + VIXL_STATIC_ASSERT((kZRegMinSizeInBytes % 16) == 0); + VIXL_ASSERT(multiplier >= 0); + Addvl(sp, sp, -multiplier); + } + void DropVL(int64_t multiplier) { + VIXL_STATIC_ASSERT((kZRegMinSizeInBytes % 16) == 0); + VIXL_ASSERT(multiplier >= 0); + Addvl(sp, sp, multiplier); + } + // Preserve the callee-saved registers (as defined by AAPCS64). // // Higher-numbered registers are pushed before lower-numbered registers, and @@ -1273,8 +1358,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { Condition cond) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(!rd.IsZero()); - VIXL_ASSERT(!rn.IsZero()); - VIXL_ASSERT(!rm.IsZero()); VIXL_ASSERT((cond != al) && (cond != nv)); SingleEmissionCheckScope guard(this); csinc(rd, rn, rm, cond); @@ -1285,8 +1368,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { Condition cond) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(!rd.IsZero()); - VIXL_ASSERT(!rn.IsZero()); - VIXL_ASSERT(!rm.IsZero()); VIXL_ASSERT((cond != al) && (cond != nv)); SingleEmissionCheckScope guard(this); csinv(rd, rn, rm, cond); @@ -1297,8 +1378,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { Condition cond) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(!rd.IsZero()); - VIXL_ASSERT(!rn.IsZero()); - VIXL_ASSERT(!rm.IsZero()); VIXL_ASSERT((cond != al) && (cond != nv)); SingleEmissionCheckScope guard(this); csneg(rd, rn, rm, cond); @@ -1495,13 +1574,8 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { void Fmov(const VRegister& vd, const VRegister& vn) { VIXL_ASSERT(allow_macro_instructions_); SingleEmissionCheckScope guard(this); - // Only emit an instruction if vd and vn are different, and they are both D - // registers. fmov(s0, s0) is not a no-op because it clears the top word of - // d0. Technically, fmov(d0, d0) is not a no-op either because it clears - // the top of q0, but VRegister does not currently support Q registers. - if (!vd.Is(vn) || !vd.Is64Bits()) { - fmov(vd, vn); - } + // TODO: Use DiscardMoveMode to allow this move to be elided if vd.Is(vn). + fmov(vd, vn); } void Fmov(const VRegister& vd, const Register& rn) { VIXL_ASSERT(allow_macro_instructions_); @@ -1509,21 +1583,23 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { SingleEmissionCheckScope guard(this); fmov(vd, rn); } - void Fmov(const VRegister& vd, const XRegister& xn) { - Fmov(vd, Register(xn)); - } - void Fmov(const VRegister& vd, const WRegister& wn) { - Fmov(vd, Register(wn)); - } void Fmov(const VRegister& vd, int index, const Register& rn) { VIXL_ASSERT(allow_macro_instructions_); SingleEmissionCheckScope guard(this); - fmov(vd, index, rn); + if (vd.Is1D() && (index == 0)) { + mov(vd, index, rn); + } else { + fmov(vd, index, rn); + } } void Fmov(const Register& rd, const VRegister& vn, int index) { VIXL_ASSERT(allow_macro_instructions_); SingleEmissionCheckScope guard(this); - fmov(rd, vn, index); + if (vn.Is1D() && (index == 0)) { + mov(rd, vn, index); + } else { + fmov(rd, vn, index); + } } // Provide explicit double and float interfaces for FP immediate moves, rather @@ -2577,9 +2653,9 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { if (generate_simulator_code_) { hlt(kUnreachableOpcode); } else { - // Branch to 0 to generate a segfault. - // lr - kInstructionSize is the address of the offending instruction. - blr(xzr); + // Use the architecturally-defined UDF instruction to abort on hardware, + // because using HLT and BRK tends to make the process difficult to debug. + udf(kUnreachableOpcode); } } void Uxtb(const Register& rd, const Register& rn) { @@ -2604,6 +2680,44 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { uxtw(rd, rn); } + void Addg(const Register& xd, + const Register& xn, + int offset, + int tag_offset) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + addg(xd, xn, offset, tag_offset); + } + void Gmi(const Register& xd, const Register& xn, const Register& xm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + gmi(xd, xn, xm); + } + void Irg(const Register& xd, const Register& xn, const Register& xm = xzr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + irg(xd, xn, xm); + } + void Subg(const Register& xd, + const Register& xn, + int offset, + int tag_offset) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + subg(xd, xn, offset, tag_offset); + } + void Subp(const Register& xd, const Register& xn, const Register& xm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + subp(xd, xn, xm); + } + void Subps(const Register& xd, const Register& xn, const Register& xm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + subps(xd, xn, xm); + } + void Cmpp(const Register& xn, const Register& xm) { Subps(xzr, xn, xm); } + // NEON 3 vector register instructions. #define NEON_3VREG_MACRO_LIST(V) \ V(add, Add) \ @@ -2740,7 +2854,11 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { V(uzp1, Uzp1) \ V(uzp2, Uzp2) \ V(zip1, Zip1) \ - V(zip2, Zip2) + V(zip2, Zip2) \ + V(smmla, Smmla) \ + V(ummla, Ummla) \ + V(usmmla, Usmmla) \ + V(usdot, Usdot) #define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \ void MASM(const VRegister& vd, const VRegister& vn, const VRegister& vm) { \ @@ -2780,6 +2898,10 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { V(fneg, Fneg) \ V(frecpe, Frecpe) \ V(frecpx, Frecpx) \ + V(frint32x, Frint32x) \ + V(frint32z, Frint32z) \ + V(frint64x, Frint64x) \ + V(frint64z, Frint64z) \ V(frinta, Frinta) \ V(frinti, Frinti) \ V(frintm, Frintm) \ @@ -2888,7 +3010,10 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { V(umlal, Umlal) \ V(umlal2, Umlal2) \ V(umlsl, Umlsl) \ - V(umlsl2, Umlsl2) + V(umlsl2, Umlsl2) \ + V(sudot, Sudot) \ + V(usdot, Usdot) + #define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \ void MASM(const VRegister& vd, \ @@ -2924,8 +3049,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { V(sri, Sri) \ V(srshr, Srshr) \ V(srsra, Srsra) \ - V(sshll, Sshll) \ - V(sshll2, Sshll2) \ V(sshr, Sshr) \ V(ssra, Ssra) \ V(uqrshrn, Uqrshrn) \ @@ -2935,8 +3058,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { V(uqshrn2, Uqshrn2) \ V(urshr, Urshr) \ V(ursra, Ursra) \ - V(ushll, Ushll) \ - V(ushll2, Ushll2) \ V(ushr, Ushr) \ V(usra, Usra) @@ -2949,6 +3070,67 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { NEON_2VREG_SHIFT_MACRO_LIST(DEFINE_MACRO_ASM_FUNC) #undef DEFINE_MACRO_ASM_FUNC +#define NEON_2VREG_SHIFT_LONG_MACRO_LIST(V) \ + V(shll, sshll, Sshll) \ + V(shll, ushll, Ushll) \ + V(shll2, sshll2, Sshll2) \ + V(shll2, ushll2, Ushll2) + +#define DEFINE_MACRO_ASM_FUNC(ASM1, ASM2, MASM) \ + void MASM(const VRegister& vd, const VRegister& vn, int shift) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + SingleEmissionCheckScope guard(this); \ + if (vn.GetLaneSizeInBits() == static_cast(shift)) { \ + ASM1(vd, vn, shift); \ + } else { \ + ASM2(vd, vn, shift); \ + } \ + } + NEON_2VREG_SHIFT_LONG_MACRO_LIST(DEFINE_MACRO_ASM_FUNC) +#undef DEFINE_MACRO_ASM_FUNC + +// SVE 3 vector register instructions. +#define SVE_3VREG_COMMUTATIVE_MACRO_LIST(V) \ + V(add, Add) \ + V(and_, And) \ + V(eor, Eor) \ + V(mul, Mul) \ + V(orr, Orr) \ + V(sabd, Sabd) \ + V(shadd, Shadd) \ + V(smax, Smax) \ + V(smin, Smin) \ + V(smulh, Smulh) \ + V(sqadd, Sqadd) \ + V(srhadd, Srhadd) \ + V(uabd, Uabd) \ + V(uhadd, Uhadd) \ + V(umax, Umax) \ + V(umin, Umin) \ + V(umulh, Umulh) \ + V(uqadd, Uqadd) \ + V(urhadd, Urhadd) + +#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \ + void MASM(const ZRegister& zd, \ + const PRegisterM& pg, \ + const ZRegister& zn, \ + const ZRegister& zm) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + if (zd.Aliases(zn)) { \ + SingleEmissionCheckScope guard(this); \ + ASM(zd, pg, zd, zm); \ + } else if (zd.Aliases(zm)) { \ + SingleEmissionCheckScope guard(this); \ + ASM(zd, pg, zd, zn); \ + } else { \ + MovprfxHelperScope guard(this, zd, pg, zn); \ + ASM(zd, pg, zd, zm); \ + } \ + } + SVE_3VREG_COMMUTATIVE_MACRO_LIST(DEFINE_MACRO_ASM_FUNC) +#undef DEFINE_MACRO_ASM_FUNC + void Bic(const VRegister& vd, const int imm8, const int left_shift = 0) { VIXL_ASSERT(allow_macro_instructions_); SingleEmissionCheckScope guard(this); @@ -3336,168 +3518,4452 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { crc32cx(rd, rn, rm); } - template - Literal* CreateLiteralDestroyedWithPool(T value) { - return new Literal(value, - &literal_pool_, - RawLiteral::kDeletedOnPoolDestruction); + // Scalable Vector Extensions. + void Abs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + abs(zd, pg, zn); } - - template - Literal* CreateLiteralDestroyedWithPool(T high64, T low64) { - return new Literal(high64, - low64, - &literal_pool_, - RawLiteral::kDeletedOnPoolDestruction); + void Add(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + add(zd, zn, zm); } - - // Push the system stack pointer (sp) down to allow the same to be done to - // the current stack pointer (according to StackPointer()). This must be - // called _before_ accessing the memory. - // - // This is necessary when pushing or otherwise adding things to the stack, to - // satisfy the AAPCS64 constraint that the memory below the system stack - // pointer is not accessed. - // - // This method asserts that StackPointer() is not sp, since the call does - // not make sense in that context. - // - // TODO: This method can only accept values of 'space' that can be encoded in - // one instruction. Refer to the implementation for details. - void BumpSystemStackPointer(const Operand& space); - - virtual bool AllowMacroInstructions() const VIXL_OVERRIDE { - return allow_macro_instructions_; + void Add(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + AddSubHelper(kAddImmediate, zd, zn, imm); } - - virtual bool ArePoolsBlocked() const VIXL_OVERRIDE { - return IsLiteralPoolBlocked() && IsVeneerPoolBlocked(); + void Addpl(const Register& xd, const Register& xn, int64_t multiplier); + void Addvl(const Register& xd, const Register& xn, int64_t multiplier); + // Note that unlike the core ISA, SVE's `adr` is not PC-relative. + void Adr(const ZRegister& zd, const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + adr(zd, addr); } - - void SetGenerateSimulatorCode(bool value) { - generate_simulator_code_ = value; + void And(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + and_(pd, pg, pn, pm); } - - bool GenerateSimulatorCode() const { return generate_simulator_code_; } - - size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); } - VIXL_DEPRECATED("GetLiteralPoolSize", size_t LiteralPoolSize() const) { - return GetLiteralPoolSize(); + void And(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + and_(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); + } } - - size_t GetLiteralPoolMaxSize() const { return literal_pool_.GetMaxSize(); } - VIXL_DEPRECATED("GetLiteralPoolMaxSize", size_t LiteralPoolMaxSize() const) { - return GetLiteralPoolMaxSize(); + void And(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameLaneSize(zd, zn, zm)); + SingleEmissionCheckScope guard(this); + and_(zd.VnD(), zn.VnD(), zm.VnD()); } - - size_t GetVeneerPoolMaxSize() const { return veneer_pool_.GetMaxSize(); } - VIXL_DEPRECATED("GetVeneerPoolMaxSize", size_t VeneerPoolMaxSize() const) { - return GetVeneerPoolMaxSize(); + void Ands(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ands(pd, pg, pn, pm); } - - // The number of unresolved branches that may require a veneer. - int GetNumberOfPotentialVeneers() const { - return veneer_pool_.GetNumberOfPotentialVeneers(); + void Andv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + andv(vd, pg, zn); } - VIXL_DEPRECATED("GetNumberOfPotentialVeneers", - int NumberOfPotentialVeneers() const) { - return GetNumberOfPotentialVeneers(); + void Asr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + asr(zd, pg, zd, shift); } - - ptrdiff_t GetNextCheckPoint() const { - ptrdiff_t next_checkpoint_for_pools = - std::min(literal_pool_.GetCheckpoint(), veneer_pool_.GetCheckpoint()); - return std::min(next_checkpoint_for_pools, - static_cast(GetBuffer().GetCapacity())); + void Asr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Asr(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + asr(zd, zn, shift); } - VIXL_DEPRECATED("GetNextCheckPoint", ptrdiff_t NextCheckPoint()) { - return GetNextCheckPoint(); + void Asr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + asr(zd, zn, zm); } - - void EmitLiteralPool(LiteralPool::EmitOption option) { - if (!literal_pool_.IsEmpty()) literal_pool_.Emit(option); - - checkpoint_ = GetNextCheckPoint(); - recommended_checkpoint_ = literal_pool_.GetNextRecommendedCheckpoint(); + void Asrd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + asrd(zd, pg, zd, shift); } - - void CheckEmitFor(size_t amount); - void EnsureEmitFor(size_t amount) { - ptrdiff_t offset = amount; - ptrdiff_t max_pools_size = - literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize(); - ptrdiff_t cursor = GetCursorOffset(); - if ((cursor >= recommended_checkpoint_) || - ((cursor + offset + max_pools_size) >= checkpoint_)) { - CheckEmitFor(amount); + void Bic(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Bic(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + bic(pd, pg, pn, pm); + } + void Bic(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameLaneSize(zd, zn, zm)); + SingleEmissionCheckScope guard(this); + bic(zd.VnD(), zn.VnD(), zm.VnD()); + } + void Bic(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + bic(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); } } - - void CheckEmitPoolsFor(size_t amount); - virtual void EnsureEmitPoolsFor(size_t amount) VIXL_OVERRIDE { - ptrdiff_t offset = amount; - ptrdiff_t max_pools_size = - literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize(); - ptrdiff_t cursor = GetCursorOffset(); - if ((cursor >= recommended_checkpoint_) || - ((cursor + offset + max_pools_size) >= checkpoint_)) { - CheckEmitPoolsFor(amount); + void Bics(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + bics(pd, pg, pn, pm); + } + void Brka(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brka(pd, pg, pn); + } + void Brkas(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkas(pd, pg, pn); + } + void Brkb(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkb(pd, pg, pn); + } + void Brkbs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkbs(pd, pg, pn); + } + void Brkn(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + if (!pd.Aliases(pm)) { + Mov(pd, pm); } + SingleEmissionCheckScope guard(this); + brkn(pd, pg, pn, pd); } - - // Set the current stack pointer, but don't generate any code. - void SetStackPointer(const Register& stack_pointer) { - VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(stack_pointer)); - sp_ = stack_pointer; + void Brkns(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + if (!pd.Aliases(pm)) { + Mov(pd, pm); + } + SingleEmissionCheckScope guard(this); + brkns(pd, pg, pn, pd); } - - // Return the current stack pointer, as set by SetStackPointer. - const Register& StackPointer() const { return sp_; } - - CPURegList* GetScratchRegisterList() { return &tmp_list_; } - VIXL_DEPRECATED("GetScratchRegisterList", CPURegList* TmpList()) { - return GetScratchRegisterList(); + void Brkpa(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkpa(pd, pg, pn, pm); } - - CPURegList* GetScratchFPRegisterList() { return &fptmp_list_; } - VIXL_DEPRECATED("GetScratchFPRegisterList", CPURegList* FPTmpList()) { - return GetScratchFPRegisterList(); + void Brkpas(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkpas(pd, pg, pn, pm); } - - // Get or set the current (most-deeply-nested) UseScratchRegisterScope. - void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) { - current_scratch_scope_ = scope; + void Brkpb(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkpb(pd, pg, pn, pm); } - UseScratchRegisterScope* GetCurrentScratchRegisterScope() { - return current_scratch_scope_; + void Brkpbs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + brkpbs(pd, pg, pn, pm); } - - // Like printf, but print at run-time from generated code. - // - // The caller must ensure that arguments for floating-point placeholders - // (such as %e, %f or %g) are VRegisters in format 1S or 1D, and that - // arguments for integer placeholders are Registers. - // - // At the moment it is only possible to print the value of sp if it is the - // current stack pointer. Otherwise, the MacroAssembler will automatically - // update sp on every push (using BumpSystemStackPointer), so determining its - // value is difficult. - // - // Format placeholders that refer to more than one argument, or to a specific - // argument, are not supported. This includes formats like "%1$d" or "%.*d". - // - // This function automatically preserves caller-saved registers so that - // calling code can use Printf at any point without having to worry about - // corruption. The preservation mechanism generates a lot of code. If this is - // a problem, preserve the important registers manually and then call - // PrintfNoPreserve. Callee-saved registers are not used by Printf, and are - // implicitly preserved. - void Printf(const char* format, - CPURegister arg0 = NoCPUReg, - CPURegister arg1 = NoCPUReg, - CPURegister arg2 = NoCPUReg, - CPURegister arg3 = NoCPUReg); - + void Clasta(const Register& rd, + const PRegister& pg, + const Register& rn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + clasta(rd, pg, rn, zm); + } + void Clasta(const VRegister& vd, + const PRegister& pg, + const VRegister& vn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + clasta(vd, pg, vn, zm); + } + void Clasta(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm); + void Clastb(const Register& rd, + const PRegister& pg, + const Register& rn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + clastb(rd, pg, rn, zm); + } + void Clastb(const VRegister& vd, + const PRegister& pg, + const VRegister& vn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + clastb(vd, pg, vn, zm); + } + void Clastb(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm); + void Cls(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cls(zd, pg, zn); + } + void Clz(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + clz(zd, pg, zn); + } + void Cmpeq(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmpeq(pd, pg, zn, zm); + } + void Cmpeq(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmpeq(pd, pg, zn, imm5); + } else { + CompareHelper(eq, pd, pg, zn, imm); + } + } + void Cmpge(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmpge(pd, pg, zn, zm); + } + void Cmpge(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmpge(pd, pg, zn, imm5); + } else { + CompareHelper(ge, pd, pg, zn, imm); + } + } + void Cmpgt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmpgt(pd, pg, zn, zm); + } + void Cmpgt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmpgt(pd, pg, zn, imm5); + } else { + CompareHelper(gt, pd, pg, zn, imm); + } + } + void Cmphi(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmphi(pd, pg, zn, zm); + } + void Cmphi(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + if (imm.IsUintN(7)) { + SingleEmissionCheckScope guard(this); + cmphi(pd, pg, zn, static_cast(imm.AsUintN(7))); + } else { + CompareHelper(hi, pd, pg, zn, imm); + } + } + void Cmphs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmphs(pd, pg, zn, zm); + } + void Cmphs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + if (imm.IsUintN(7)) { + SingleEmissionCheckScope guard(this); + cmphs(pd, pg, zn, static_cast(imm.AsUintN(7))); + } else { + CompareHelper(hs, pd, pg, zn, imm); + } + } + void Cmple(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmple(pd, pg, zn, zm); + } + void Cmple(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmple(pd, pg, zn, imm5); + } else { + CompareHelper(le, pd, pg, zn, imm); + } + } + void Cmplo(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmplo(pd, pg, zn, zm); + } + void Cmplo(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + if (imm.IsUintN(7)) { + SingleEmissionCheckScope guard(this); + cmplo(pd, pg, zn, static_cast(imm.AsUintN(7))); + } else { + CompareHelper(lo, pd, pg, zn, imm); + } + } + void Cmpls(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmpls(pd, pg, zn, zm); + } + void Cmpls(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + if (imm.IsUintN(7)) { + SingleEmissionCheckScope guard(this); + cmpls(pd, pg, zn, static_cast(imm.AsUintN(7))); + } else { + CompareHelper(ls, pd, pg, zn, imm); + } + } + void Cmplt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmplt(pd, pg, zn, zm); + } + void Cmplt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmplt(pd, pg, zn, imm5); + } else { + CompareHelper(lt, pd, pg, zn, imm); + } + } + void Cmpne(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cmpne(pd, pg, zn, zm); + } + void Cmpne(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + int imm5; + if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) { + SingleEmissionCheckScope guard(this); + cmpne(pd, pg, zn, imm5); + } else { + CompareHelper(ne, pd, pg, zn, imm); + } + } + void Cnot(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cnot(zd, pg, zn); + } + void Cnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cnt(zd, pg, zn); + } + void Cntb(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cntb(rd, pattern, multiplier); + } + void Cntd(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cntd(rd, pattern, multiplier); + } + void Cnth(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cnth(rd, pattern, multiplier); + } + void Cntp(const Register& rd, + const PRegister& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + // The `cntp` instruction architecturally takes an X register, but the + // result will always be in the range [0, kPRegMaxSize] (and therefore + // always fits in a W register), so we can accept a W-sized rd here. + cntp(rd.X(), pg, pn); + } + void Cntw(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cntw(rd, pattern, multiplier); + } + void Compact(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + compact(zd, pg, zn); + } + void Cpy(const ZRegister& zd, const PRegister& pg, IntegerOperand imm); + void Cpy(const ZRegister& zd, const PRegisterM& pg, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpy(zd, pg, rn); + } + void Cpy(const ZRegister& zd, const PRegisterM& pg, const VRegister& vn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpy(zd, pg, vn); + } + void Ctermeq(const Register& rn, const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ctermeq(rn, rm); + } + void Ctermne(const Register& rn, const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ctermne(rn, rm); + } + void Decb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decb(rdn, pattern, multiplier); + } + void Decd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decd(rdn, pattern, multiplier); + } + void Decd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decd(zdn, pattern, multiplier); + } + void Dech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + dech(rdn, pattern, multiplier); + } + void Dech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + dech(zdn, pattern, multiplier); + } + void Decp(const Register& rdn, const PRegisterWithLaneSize& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decp(rdn, pg); + } + void Decp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `decp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + decp(zd, pg); + } + void Decp(const ZRegister& zdn, const PRegister& pg) { Decp(zdn, pg, zdn); } + void Decw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decw(rdn, pattern, multiplier); + } + void Decw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + decw(zdn, pattern, multiplier); + } + void Dup(const ZRegister& zd, const Register& xn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + dup(zd, xn); + } + void Dup(const ZRegister& zd, const ZRegister& zn, int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + dup(zd, zn, index); + } + void Dup(const ZRegister& zd, IntegerOperand imm); + void Eon(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + eon(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); + } + } + void Eor(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + eor(pd, pg, pn, pm); + } + void Eor(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + eor(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); + } + } + void Eor(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameLaneSize(zd, zn, zm)); + SingleEmissionCheckScope guard(this); + eor(zd.VnD(), zn.VnD(), zm.VnD()); + } + void Eors(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + eors(pd, pg, pn, pm); + } + void Eorv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + eorv(vd, pg, zn); + } + void Ext(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + unsigned offset) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ext(zd, zn, zm, offset); + } + void Fabd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fabs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fabs(zd, pg, zn); + } + void Facge(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + facge(pd, pg, zn, zm); + } + void Facgt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + facgt(pd, pg, zn, zm); + } + void Facle(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + facge(pd, pg, zm, zn); + } + void Faclt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + facgt(pd, pg, zm, zn); + } + void Fadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fadd(zd, pg, zd, imm); + } + void Fadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fadd(zd, zn, zm); + } + void Fadda(const VRegister& vd, + const PRegister& pg, + const VRegister& vn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fadda(vd, pg, vn, zm); + } + void Faddv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + faddv(vd, pg, zn); + } + void Fcadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Fcmeq(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmeq(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmeq(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmeq(pd, pg, zn, zm); + } + void Fcmge(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmge(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmge(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmge(pd, pg, zn, zm); + } + void Fcmgt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmgt(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmgt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmgt(pd, pg, zn, zm); + } + void Fcmla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Fcmla(const ZRegister& zda, + const ZRegister& zn, + const ZRegister& zm, + int index, + int rot) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmla(zda, zn, zm, index, rot); + } + void Fcmle(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmle(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmle(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmge(pd, pg, zm, zn); + } + void Fcmlt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmlt(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmlt(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmgt(pd, pg, zm, zn); + } + void Fcmne(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + double zero) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (zero == 0.0) { + fcmne(pd, pg, zn, zero); + } else { + // TODO: Synthesise other immediates. + VIXL_UNIMPLEMENTED(); + } + } + void Fcmne(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmne(pd, pg, zn, zm); + } + void Fcmuo(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcmuo(pd, pg, zn, zm); + } + void Fcpy(const ZRegister& zd, const PRegisterM& pg, double imm); + void Fcpy(const ZRegister& zd, const PRegisterM& pg, float imm); + void Fcpy(const ZRegister& zd, const PRegisterM& pg, Float16 imm); + void Fcvt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvt(zd, pg, zn); + } + void Fcvt(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + // The element type in this predicated movprfx is determined by the larger + // type between the source and destination. + int lane_size = std::max(zd.GetLaneSizeInBits(), zn.GetLaneSizeInBits()); + MovprfxHelperScope guard(this, + zd.WithLaneSize(lane_size), + pg, + zn.WithLaneSize(lane_size)); + fcvt(zd, pg.Merging(), zn); + } + void Fcvtzs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvtzs(zd, pg, zn); + } + void Fcvtzu(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvtzu(zd, pg, zn); + } + void Fdiv(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fdup(const ZRegister& zd, double imm); + void Fdup(const ZRegister& zd, float imm); + void Fdup(const ZRegister& zd, Float16 imm); + void Fexpa(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fexpa(zd, zn); + } + void Fmad(const ZRegister& zdn, + const PRegisterM& pg, + const ZRegister& zm, + const ZRegister& za) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmad(zdn, pg, zm, za); + } + void Fmax(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fmax(zd, pg, zd, imm); + } + void Fmax( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Fmaxnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fmaxnm(zd, pg, zd, imm); + } + void Fmaxnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fmaxnmv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmaxnmv(vd, pg, zn); + } + void Fmaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmaxv(vd, pg, zn); + } + void Fmin(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fmin(zd, pg, zd, imm); + } + void Fmin( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Fminnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fminnm(zd, pg, zd, imm); + } + void Fminnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fminnmv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fminnmv(vd, pg, zn); + } + void Fminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fminv(vd, pg, zn); + } + // zd = za + (zn * zm) + void Fmla( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Fmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + // zd = za - (zn * zm) + void Fmls( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Fmls(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Fmov(const ZRegister& zd, double imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fdup(zd, imm); + } + void Fmov(const ZRegister& zd, float imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fdup(zd, imm); + } + void Fmov(const ZRegister& zd, Float16 imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fdup(zd, imm); + } + void Fmov(const ZRegister& zd, const PRegisterM& pg, double imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fcpy(zd, pg, imm); + } + void Fmov(const ZRegister& zd, const PRegisterM& pg, float imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fcpy(zd, pg, imm); + } + void Fmov(const ZRegister& zd, const PRegisterM& pg, Float16 imm) { + VIXL_ASSERT(allow_macro_instructions_); + Fcpy(zd, pg, imm); + } + void Fmsb(const ZRegister& zdn, + const PRegisterM& pg, + const ZRegister& zm, + const ZRegister& za) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmsb(zdn, pg, zm, za); + } + void Fmul(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fmul(zd, pg, zd, imm); + } + void Fmul(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fmul(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + unsigned index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmul(zd, zn, zm, index); + } + void Fmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fmul(zd, zn, zm); + } + void Fmulx(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option); + void Fneg(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fneg(zd, pg, zn); + } + void Fnmla( + const ZRegister& zda, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Fnmls( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected); + void Frecpe(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frecpe(zd, zn); + } + void Frecps(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frecps(zd, zn, zm); + } + void Frecpx(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frecpx(zd, pg, zn); + } + void Frecpx(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frecpx(zd, pg.Merging(), zn); + } + void Frinta(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frinta(zd, pg, zn); + } + void Frinta(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frinta(zd, pg.Merging(), zn); + } + void Frinti(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frinti(zd, pg, zn); + } + void Frinti(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frinti(zd, pg.Merging(), zn); + } + void Frintm(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frintm(zd, pg, zn); + } + void Frintm(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frintm(zd, pg.Merging(), zn); + } + void Frintn(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frintn(zd, pg, zn); + } + void Frintn(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frintn(zd, pg.Merging(), zn); + } + void Frintp(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frintp(zd, pg, zn); + } + void Frintp(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frintp(zd, pg.Merging(), zn); + } + void Frintx(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frintx(zd, pg, zn); + } + void Frintx(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frintx(zd, pg.Merging(), zn); + } + void Frintz(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frintz(zd, pg, zn); + } + void Frintz(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + frintz(zd, pg.Merging(), zn); + } + void Frsqrte(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frsqrte(zd, zn); + } + void Frsqrts(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + frsqrts(zd, zn, zm); + } + void Fscale(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fsqrt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fsqrt(zd, pg, zn); + } + void Fsqrt(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fsqrt(zd, pg.Merging(), zn); + } + void Fsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fsub(zd, pg, zd, imm); + } + void Fsub(const ZRegister& zd, + const PRegisterM& pg, + double imm, + const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + fsubr(zd, pg, zd, imm); + } + void Fsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fsub(zd, zn, zm); + } + void Ftmad(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int imm3); + void Ftsmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ftsmul(zd, zn, zm); + } + void Ftssel(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ftssel(zd, zn, zm); + } + void Incb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incb(rdn, pattern, multiplier); + } + void Incd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incd(rdn, pattern, multiplier); + } + void Incd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incd(zdn, pattern, multiplier); + } + void Inch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + inch(rdn, pattern, multiplier); + } + void Inch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + inch(zdn, pattern, multiplier); + } + void Incp(const Register& rdn, const PRegisterWithLaneSize& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incp(rdn, pg); + } + void Incp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `incp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + incp(zd, pg); + } + void Incp(const ZRegister& zdn, const PRegister& pg) { Incp(zdn, pg, zdn); } + void Incw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incw(rdn, pattern, multiplier); + } + void Incw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + incw(zdn, pattern, multiplier); + } + void Index(const ZRegister& zd, const Operand& start, const Operand& step); + void Insr(const ZRegister& zdn, const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + insr(zdn, rm); + } + void Insr(const ZRegister& zdn, const VRegister& vm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + insr(zdn, vm); + } + void Insr(const ZRegister& zdn, IntegerOperand imm); + void Lasta(const Register& rd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lasta(rd, pg, zn); + } + void Lasta(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lasta(vd, pg, zn); + } + void Lastb(const Register& rd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lastb(rd, pg, zn); + } + void Lastb(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lastb(vd, pg, zn); + } + void Ld1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rb, + kBRegSizeInBytes); + } + void Ld1rh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rh, + kHRegSizeInBytes); + } + void Ld1rw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rw, + kSRegSizeInBytes); + } + void Ld1rd(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rd, + kDRegSizeInBytes); + } + void Ld1rqb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rqd(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rqh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rqw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rob(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rod(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1roh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1row(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1rsb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rsb, + kBRegSizeInBytes); + } + void Ld1rsh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rsh, + kHRegSizeInBytes); + } + void Ld1rsw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadBroadcastImmHelper(zt, + pg, + addr, + &MacroAssembler::ld1rsw, + kSRegSizeInBytes); + } + void Ld1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ld2b(const ZRegister& zt1, + const ZRegister& zt2, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld2b(zt1, zt2, pg, addr); + } + void Ld2h(const ZRegister& zt1, + const ZRegister& zt2, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld2h(zt1, zt2, pg, addr); + } + void Ld2w(const ZRegister& zt1, + const ZRegister& zt2, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld2w(zt1, zt2, pg, addr); + } + void Ld2d(const ZRegister& zt1, + const ZRegister& zt2, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld2d(zt1, zt2, pg, addr); + } + void Ld3b(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld3b(zt1, zt2, zt3, pg, addr); + } + void Ld3h(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld3h(zt1, zt2, zt3, pg, addr); + } + void Ld3w(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld3w(zt1, zt2, zt3, pg, addr); + } + void Ld3d(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld3d(zt1, zt2, zt3, pg, addr); + } + void Ld4b(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld4b(zt1, zt2, zt3, zt4, pg, addr); + } + void Ld4h(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld4h(zt1, zt2, zt3, zt4, pg, addr); + } + void Ld4w(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld4w(zt1, zt2, zt3, zt4, pg, addr); + } + void Ld4d(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ld4d(zt1, zt2, zt3, zt4, pg, addr); + } + void Ldff1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldff1b(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1b(zt, pg, xn, zm); + } + void Ldff1b(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1b(zt, pg, zn, imm5); + } + void Ldff1d(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1d(zt, pg, xn, zm); + } + void Ldff1d(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1d(zt, pg, zn, imm5); + } + void Ldff1h(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1h(zt, pg, xn, zm); + } + void Ldff1h(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1h(zt, pg, zn, imm5); + } + void Ldff1sb(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sb(zt, pg, xn, zm); + } + void Ldff1sb(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sb(zt, pg, zn, imm5); + } + void Ldff1sh(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sh(zt, pg, xn, zm); + } + void Ldff1sh(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sh(zt, pg, zn, imm5); + } + void Ldff1sw(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sw(zt, pg, xn, zm); + } + void Ldff1sw(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1sw(zt, pg, zn, imm5); + } + void Ldff1w(const ZRegister& zt, + const PRegisterZ& pg, + const Register& xn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1w(zt, pg, xn, zm); + } + void Ldff1w(const ZRegister& zt, + const PRegisterZ& pg, + const ZRegister& zn, + int imm5) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldff1w(zt, pg, zn, imm5); + } + void Ldnf1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1b(zt, pg, addr); + } + void Ldnf1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1d(zt, pg, addr); + } + void Ldnf1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1h(zt, pg, addr); + } + void Ldnf1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1sb(zt, pg, addr); + } + void Ldnf1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1sh(zt, pg, addr); + } + void Ldnf1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1sw(zt, pg, addr); + } + void Ldnf1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnf1w(zt, pg, addr); + } + void Ldnt1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldnt1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldnt1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldnt1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + void Ldr(const CPURegister& rt, const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStoreScalarImmHelper(rt, addr, &MacroAssembler::ldr); + } + void Lsl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + lsl(zd, pg, zd, shift); + } + void Lsl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Lsl(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lsl(zd, zn, shift); + } + void Lsl(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lsl(zd, zn, zm); + } + void Lsr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + lsr(zd, pg, zd, shift); + } + void Lsr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Lsr(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lsr(zd, zn, shift); + } + void Lsr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + lsr(zd, zn, zm); + } + void Mov(const PRegister& pd, const PRegister& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(pd.VnB(), pn.VnB()); + } + void Mov(const PRegisterWithLaneSize& pd, + const PRegisterM& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(pd, pg, pn); + } + void Mov(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(pd, pg, pn); + } + void Mov(const ZRegister& zd, const Register& xn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, xn); + } + + void Mov(const ZRegister& zd, const VRegister& vn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, vn); + } + + void Mov(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, zn); + } + void Mov(const ZRegister& zd, const ZRegister& zn, unsigned index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, zn, index); + } + void Mov(const ZRegister& zd, const PRegister& pg, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + Cpy(zd, pg, imm); + } + // TODO: support zeroing predicated moves using movprfx. + void Mov(const ZRegister& zd, const PRegisterM& pg, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, pg, rn); + } + void Mov(const ZRegister& zd, const PRegisterM& pg, const VRegister& vn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, pg, vn); + } + void Mov(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mov(zd, pg, zn); + } + void Mov(const ZRegister& zd, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + Dup(zd, imm); + } + void Movs(const PRegister& pd, const PRegister& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + movs(pd, pn); + } + void Movs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + movs(pd, pg, pn); + } + // zd = za + (zn * zm) + void Mla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + // zd = za - (zn * zm) + void Mls(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Mul(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm); + void Nand(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nand(pd, pg, pn, pm); + } + void Nands(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nands(pd, pg, pn, pm); + } + // There is no instruction with this form, but we can implement it using + // `subr`. + void Neg(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, zn); + subr(zd, zd, 0); + } + void Neg(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + neg(zd, pg, zn); + } + void Nor(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nor(pd, pg, pn, pm); + } + void Nors(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nors(pd, pg, pn, pm); + } + void Not(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + not_(pd, pg, pn); + } + void Not(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + not_(zd, pg, zn); + } + void Nots(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nots(pd, pg, pn); + } + void Orn(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + orn(pd, pg, pn, pm); + } + void Orn(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + orn(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); + } + } + void Orns(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + orns(pd, pg, pn, pm); + } + void Orr(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + orr(pd, pg, pn, pm); + } + void Orr(const ZRegister& zd, const ZRegister& zn, uint64_t imm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + if (IsImmLogical(imm, zd.GetLaneSizeInBits())) { + orr(zd, zn, imm); + } else { + // TODO: Synthesise the immediate once 'Mov' is implemented. + VIXL_UNIMPLEMENTED(); + } + } + void Orr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameLaneSize(zd, zn, zm)); + SingleEmissionCheckScope guard(this); + orr(zd.VnD(), zn.VnD(), zm.VnD()); + } + void Orrs(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + orrs(pd, pg, pn, pm); + } + void Orv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + orv(vd, pg, zn); + } + void Pfalse(const PRegister& pd) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(pd.IsUnqualified()); + SingleEmissionCheckScope guard(this); + // No matter what the lane size is, overall this operation just writes zeros + // throughout the register. + pfalse(pd.VnB()); + } + void Pfirst(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn); + void Pnext(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn); + void Prfb(PrefetchOperation prfop, + const PRegister& pg, + const SVEMemOperand addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + prfb(prfop, pg, addr); + } + void Prfh(PrefetchOperation prfop, + const PRegister& pg, + const SVEMemOperand addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + prfh(prfop, pg, addr); + } + void Prfw(PrefetchOperation prfop, + const PRegister& pg, + const SVEMemOperand addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + prfw(prfop, pg, addr); + } + void Prfd(PrefetchOperation prfop, + const PRegister& pg, + const SVEMemOperand addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + prfd(prfop, pg, addr); + } + void Ptest(const PRegister& pg, const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ptest(pg, pn); + } + void Ptrue(const PRegisterWithLaneSize& pd, + SVEPredicateConstraint pattern, + FlagsUpdate s); + void Ptrue(const PRegisterWithLaneSize& pd, + SVEPredicateConstraint pattern = SVE_ALL) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ptrue(pd, pattern); + } + void Ptrues(const PRegisterWithLaneSize& pd, + SVEPredicateConstraint pattern = SVE_ALL) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ptrues(pd, pattern); + } + void Punpkhi(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + punpkhi(pd, pn); + } + void Punpklo(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + punpklo(pd, pn); + } + void Rbit(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rbit(zd, pg, zn); + } + void Rdffr(const PRegister& pd) { + VIXL_ASSERT(allow_macro_instructions_); + // Although this is essentially just a move, it writes every bit and so can + // only support b-sized lane because other lane sizes would simplicity clear + // bits in `pd`. + VIXL_ASSERT(!pd.HasLaneSize() || pd.IsLaneSizeB()); + VIXL_ASSERT(pd.IsUnqualified()); + SingleEmissionCheckScope guard(this); + rdffr(pd.VnB()); + } + void Rdffr(const PRegisterWithLaneSize& pd, const PRegisterZ& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rdffr(pd, pg); + } + void Rdffrs(const PRegisterWithLaneSize& pd, const PRegisterZ& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rdffrs(pd, pg); + } + // Note that there is no `rdpl` instruction, but this macro emulates it (for + // symmetry with `Rdvl`). + void Rdpl(const Register& xd, int64_t multiplier) { + VIXL_ASSERT(allow_macro_instructions_); + Addpl(xd, xzr, multiplier); + } + void Rdvl(const Register& xd, int64_t multiplier) { + VIXL_ASSERT(allow_macro_instructions_); + Addvl(xd, xzr, multiplier); + } + void Rev(const PRegisterWithLaneSize& pd, const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rev(pd, pn); + } + void Rev(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rev(zd, zn); + } + void Revb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + revb(zd, pg, zn); + } + void Revh(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + revh(zd, pg, zn); + } + void Revw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + revw(zd, pg, zn); + } + void Saddv(const VRegister& dd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddv(dd, pg, zn); + } + void Scvtf(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + scvtf(zd, pg, zn); + } + void Sdiv(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sel(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sel(pd, pg, pn, pm); + } + void Sel(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sel(zd, pg, zn, zm); + } + void Setffr() { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setffr(); + } + void Smax(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm); + void Smaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smaxv(vd, pg, zn); + } + void Smin(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm); + void Sminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sminv(vd, pg, zn); + } + void Splice(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sqadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqadd(zd, zn, zm); + } + void Sqadd(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.IsUint8() || + (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0))); + MovprfxHelperScope guard(this, zd, zn); + sqadd(zd, zd, imm.AsUint16()); + } + void Sqdecb(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecb(xd, wn, pattern, multiplier); + } + void Sqdecb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecb(rdn, pattern, multiplier); + } + void Sqdecd(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecd(xd, wn, pattern, multiplier); + } + void Sqdecd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecd(rdn, pattern, multiplier); + } + void Sqdecd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecd(zdn, pattern, multiplier); + } + void Sqdech(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdech(xd, wn, pattern, multiplier); + } + void Sqdech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdech(rdn, pattern, multiplier); + } + void Sqdech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdech(zdn, pattern, multiplier); + } + void Sqdecp(const Register& xdn, + const PRegisterWithLaneSize& pg, + const Register& wdn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecp(xdn, pg, wdn); + } + void Sqdecp(const Register& xdn, const PRegisterWithLaneSize& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecp(xdn, pg); + } + void Sqdecp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `sqdecp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + sqdecp(zd, pg); + } + void Sqdecp(const ZRegister& zdn, const PRegister& pg) { + Sqdecp(zdn, pg, zdn); + } + void Sqdecw(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecw(xd, wn, pattern, multiplier); + } + void Sqdecw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecw(rdn, pattern, multiplier); + } + void Sqdecw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdecw(zdn, pattern, multiplier); + } + void Sqincb(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincb(xd, wn, pattern, multiplier); + } + void Sqincb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincb(rdn, pattern, multiplier); + } + void Sqincd(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincd(xd, wn, pattern, multiplier); + } + void Sqincd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincd(rdn, pattern, multiplier); + } + void Sqincd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincd(zdn, pattern, multiplier); + } + void Sqinch(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqinch(xd, wn, pattern, multiplier); + } + void Sqinch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqinch(rdn, pattern, multiplier); + } + void Sqinch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqinch(zdn, pattern, multiplier); + } + void Sqincp(const Register& xdn, + const PRegisterWithLaneSize& pg, + const Register& wdn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincp(xdn, pg, wdn); + } + void Sqincp(const Register& xdn, const PRegisterWithLaneSize& pg) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincp(xdn, pg); + } + void Sqincp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `sqincp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + sqincp(zd, pg); + } + void Sqincp(const ZRegister& zdn, const PRegister& pg) { + Sqincp(zdn, pg, zdn); + } + void Sqincw(const Register& xd, + const Register& wn, + int pattern = SVE_ALL, + int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincw(xd, wn, pattern, multiplier); + } + void Sqincw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincw(rdn, pattern, multiplier); + } + void Sqincw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqincw(zdn, pattern, multiplier); + } + void Sqsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqsub(zd, zn, zm); + } + void Sqsub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.IsUint8() || + (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0))); + MovprfxHelperScope guard(this, zd, zn); + sqsub(zd, zd, imm.AsUint16()); + } + void St1b(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void St1h(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void St1w(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void St1d(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void St2b(const ZRegister& zt1, + const ZRegister& zt2, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st2b(zt1, zt2, pg, addr); + } + void St2h(const ZRegister& zt1, + const ZRegister& zt2, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st2h(zt1, zt2, pg, addr); + } + void St2w(const ZRegister& zt1, + const ZRegister& zt2, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st2w(zt1, zt2, pg, addr); + } + void St2d(const ZRegister& zt1, + const ZRegister& zt2, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st2d(zt1, zt2, pg, addr); + } + void St3b(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st3b(zt1, zt2, zt3, pg, addr); + } + void St3h(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st3h(zt1, zt2, zt3, pg, addr); + } + void St3w(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st3w(zt1, zt2, zt3, pg, addr); + } + void St3d(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st3d(zt1, zt2, zt3, pg, addr); + } + void St4b(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st4b(zt1, zt2, zt3, zt4, pg, addr); + } + void St4h(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st4h(zt1, zt2, zt3, zt4, pg, addr); + } + void St4w(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st4w(zt1, zt2, zt3, zt4, pg, addr); + } + void St4d(const ZRegister& zt1, + const ZRegister& zt2, + const ZRegister& zt3, + const ZRegister& zt4, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + st4d(zt1, zt2, zt3, zt4, pg, addr); + } + void Stnt1b(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void Stnt1d(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void Stnt1h(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void Stnt1w(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + void Str(const CPURegister& rt, const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStoreScalarImmHelper(rt, addr, &MacroAssembler::str); + } + void Sub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sub(zd, zn, zm); + } + void Sub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + AddSubHelper(kSubImmediate, zd, zn, imm); + } + void Sub(const ZRegister& zd, IntegerOperand imm, const ZRegister& zm); + void Sunpkhi(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sunpkhi(zd, zn); + } + void Sunpklo(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sunpklo(zd, zn); + } + void Sxtb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sxtb(zd, pg, zn); + } + void Sxth(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sxth(zd, pg, zn); + } + void Sxtw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sxtw(zd, pg, zn); + } + void Tbl(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + tbl(zd, zn, zm); + } + void Trn1(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + trn1(pd, pn, pm); + } + void Trn1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + trn1(zd, zn, zm); + } + void Trn2(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + trn2(pd, pn, pm); + } + void Trn2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + trn2(zd, zn, zm); + } + void Uaddv(const VRegister& dd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uaddv(dd, pg, zn); + } + void Ucvtf(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ucvtf(zd, pg, zn); + } + void Udiv(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Udot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Udot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Umax(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm); + void Umaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umaxv(vd, pg, zn); + } + void Umin(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm); + void Uminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uminv(vd, pg, zn); + } + void Uqadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqadd(zd, zn, zm); + } + void Uqadd(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.IsUint8() || + (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0))); + MovprfxHelperScope guard(this, zd, zn); + uqadd(zd, zd, imm.AsUint16()); + } + void Uqdecb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdecb(rdn, pattern, multiplier); + } + void Uqdecd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdecd(rdn, pattern, multiplier); + } + void Uqdecd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdecd(zdn, pattern, multiplier); + } + void Uqdech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdech(rdn, pattern, multiplier); + } + void Uqdech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdech(zdn, pattern, multiplier); + } + // The saturation is based on the size of `rn`. The result is zero-extended + // into `rd`, which must be at least as big. + void Uqdecp(const Register& rd, + const PRegisterWithLaneSize& pg, + const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(rd.Aliases(rn)); + VIXL_ASSERT(rd.GetSizeInBytes() >= rn.GetSizeInBytes()); + SingleEmissionCheckScope guard(this); + if (rn.Is64Bits()) { + uqdecp(rd, pg); + } else { + // Convert into , to make this more consistent with Sqdecp. + uqdecp(rd.W(), pg); + } + } + void Uqdecp(const Register& rdn, const PRegisterWithLaneSize& pg) { + Uqdecp(rdn, pg, rdn); + } + void Uqdecp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `sqdecp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + uqdecp(zd, pg); + } + void Uqdecp(const ZRegister& zdn, const PRegister& pg) { + Uqdecp(zdn, pg, zdn); + } + void Uqdecw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdecw(rdn, pattern, multiplier); + } + void Uqdecw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqdecw(zdn, pattern, multiplier); + } + void Uqincb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqincb(rdn, pattern, multiplier); + } + void Uqincd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqincd(rdn, pattern, multiplier); + } + void Uqincd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqincd(zdn, pattern, multiplier); + } + void Uqinch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqinch(rdn, pattern, multiplier); + } + void Uqinch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqinch(zdn, pattern, multiplier); + } + // The saturation is based on the size of `rn`. The result is zero-extended + // into `rd`, which must be at least as big. + void Uqincp(const Register& rd, + const PRegisterWithLaneSize& pg, + const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(rd.Aliases(rn)); + VIXL_ASSERT(rd.GetSizeInBytes() >= rn.GetSizeInBytes()); + SingleEmissionCheckScope guard(this); + if (rn.Is64Bits()) { + uqincp(rd, pg); + } else { + // Convert into , to make this more consistent with Sqincp. + uqincp(rd.W(), pg); + } + } + void Uqincp(const Register& rdn, const PRegisterWithLaneSize& pg) { + Uqincp(rdn, pg, rdn); + } + void Uqincp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(zd, zn)); + // `sqincp` writes every lane, so use an unpredicated movprfx. + MovprfxHelperScope guard(this, zd, zn); + uqincp(zd, pg); + } + void Uqincp(const ZRegister& zdn, const PRegister& pg) { + Uqincp(zdn, pg, zdn); + } + void Uqincw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqincw(rdn, pattern, multiplier); + } + void Uqincw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqincw(zdn, pattern, multiplier); + } + void Uqsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqsub(zd, zn, zm); + } + void Uqsub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.IsUint8() || + (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0))); + MovprfxHelperScope guard(this, zd, zn); + uqsub(zd, zd, imm.AsUint16()); + } + void Uunpkhi(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uunpkhi(zd, zn); + } + void Uunpklo(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uunpklo(zd, zn); + } + void Uxtb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uxtb(zd, pg, zn); + } + void Uxth(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uxth(zd, pg, zn); + } + void Uxtw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uxtw(zd, pg, zn); + } + void Uzp1(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uzp1(pd, pn, pm); + } + void Uzp1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uzp1(zd, zn, zm); + } + void Uzp2(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uzp2(pd, pn, pm); + } + void Uzp2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uzp2(zd, zn, zm); + } + void Whilele(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilele(pd, rn, rm); + } + void Whilelo(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilelo(pd, rn, rm); + } + void Whilels(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilels(pd, rn, rm); + } + void Whilelt(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilelt(pd, rn, rm); + } + void Wrffr(const PRegister& pn) { + VIXL_ASSERT(allow_macro_instructions_); + // Although this is essentially just a move, it writes every bit and so can + // only support b-sized lane because other lane sizes would implicitly clear + // bits in `ffr`. + VIXL_ASSERT(!pn.HasLaneSize() || pn.IsLaneSizeB()); + VIXL_ASSERT(pn.IsUnqualified()); + SingleEmissionCheckScope guard(this); + wrffr(pn.VnB()); + } + void Zip1(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + zip1(pd, pn, pm); + } + void Zip1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + zip1(zd, zn, zm); + } + void Zip2(const PRegisterWithLaneSize& pd, + const PRegisterWithLaneSize& pn, + const PRegisterWithLaneSize& pm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + zip2(pd, pn, pm); + } + void Zip2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + zip2(zd, zn, zm); + } + + // SVE2 + void Adclb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Adclt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Addhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + addhnb(zd, zn, zm); + } + void Addhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + addhnt(zd, zn, zm); + } + void Addp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Bcax(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Bdep(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + bdep(zd, zn, zm); + } + void Bext(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + bext(zd, zn, zm); + } + void Bgrp(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + bgrp(zd, zn, zm); + } + void Bsl(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Bsl1n(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Bsl2n(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Cadd(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Cdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index, + int rot); + void Cdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Cmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index, + int rot); + void Cmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Eor3(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Eorbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + eorbt(zd, zn, zm); + } + void Eortb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + eortb(zd, zn, zm); + } + void Faddp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fcvtlt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvtlt(zd, pg, zn); + } + void Fcvtnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvtnt(zd, pg, zn); + } + void Fcvtx(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(zn.IsLaneSizeD()); + MovprfxHelperScope guard(this, zd.VnD(), pg, zd.VnD()); + fcvtx(zd, pg.Merging(), zn); + } + void Fcvtxnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + fcvtxnt(zd, pg, zn); + } + void Flogb(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zd); + flogb(zd, pg.Merging(), zn); + } + void Fmaxnmp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fmaxp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fminnmp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fminp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Fmlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Fmlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Fmlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Fmlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Fmlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Fmlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Fmlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Fmlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Histcnt(const ZRegister& zd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + histcnt(zd, pg, zn, zm); + } + void Histseg(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + histseg(zd, zn, zm); + } + void Ldnt1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnt1sb(zt, pg, addr); + } + void Ldnt1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnt1sh(zt, pg, addr); + } + void Ldnt1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ldnt1sw(zt, pg, addr); + } + void Match(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + match(pd, pg, zn, zm); + } + void Mla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Mls(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Mul(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mul(zd, zn, zm, index); + } + void Mul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + mul(zd, zn, zm); + } + void Nbsl(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + const ZRegister& zk); + void Nmatch(const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + nmatch(pd, pg, zn, zm); + } + void Pmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + pmul(zd, zn, zm); + } + void Pmullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + pmullb(zd, zn, zm); + } + void Pmullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + pmullt(zd, zn, zm); + } + void Raddhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + raddhnb(zd, zn, zm); + } + void Raddhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + raddhnt(zd, zn, zm); + } + void Rshrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rshrnb(zd, zn, shift); + } + void Rshrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rshrnt(zd, zn, shift); + } + void Rsubhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rsubhnb(zd, zn, zm); + } + void Rsubhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + rsubhnt(zd, zn, zm); + } + void Saba(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sabalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sabalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sabdlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sabdlb(zd, zn, zm); + } + void Sabdlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sabdlt(zd, zn, zm); + } + void Sadalp(const ZRegister& zda, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sadalp(zda, pg, zn); + } + void Saddlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddlb(zd, zn, zm); + } + void Saddlbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddlbt(zd, zn, zm); + } + void Saddlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddlt(zd, zn, zm); + } + void Saddwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddwb(zd, zn, zm); + } + void Saddwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + saddwt(zd, zn, zm); + } + void Sbclb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sbclt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Shrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + shrnb(zd, zn, shift); + } + void Shrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + shrnt(zd, zn, shift); + } + void Shsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sli(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sli(zd, zn, shift); + } + void Smaxp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sminp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Smlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Smlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Smlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Smlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Smlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Smlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Smlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Smlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Smulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smulh(zd, zn, zm); + } + void Smullb(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smullb(zd, zn, zm, index); + } + void Smullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smullb(zd, zn, zm); + } + void Smullt(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smullt(zd, zn, zm, index); + } + void Smullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + smullt(zd, zn, zm); + } + void Sqabs(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zd); + sqabs(zd, pg.Merging(), zn); + } + void Sqcadd(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Sqdmlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqdmlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmlalbt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqdmlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqdmlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmlslbt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqdmlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqdmulh(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmulh(zd, zn, zm, index); + } + void Sqdmulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmulh(zd, zn, zm); + } + void Sqdmullb(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmullb(zd, zn, zm, index); + } + void Sqdmullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmullb(zd, zn, zm); + } + void Sqdmullt(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmullt(zd, zn, zm, index); + } + void Sqdmullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqdmullt(zd, zn, zm); + } + void Sqneg(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zd); + sqneg(zd, pg.Merging(), zn); + } + void Sqrdcmlah(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index, + int rot); + void Sqrdcmlah(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot); + void Sqrdmlah(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqrdmlah(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqrdmlsh(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Sqrdmlsh(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sqrdmulh(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrdmulh(zd, zn, zm, index); + } + void Sqrdmulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrdmulh(zd, zn, zm); + } + void Sqrshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sqrshrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrshrnb(zd, zn, shift); + } + void Sqrshrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrshrnt(zd, zn, shift); + } + void Sqrshrunb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrshrunb(zd, zn, shift); + } + void Sqrshrunt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqrshrunt(zd, zn, shift); + } + void Sqshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + sqshl(zd, pg, zd, shift); + } + void Sqshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sqshlu(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + sqshlu(zd, pg, zd, shift); + } + void Sqshrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqshrnb(zd, zn, shift); + } + void Sqshrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqshrnt(zd, zn, shift); + } + void Sqshrunb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqshrunb(zd, zn, shift); + } + void Sqshrunt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqshrunt(zd, zn, shift); + } + void Sqsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Sqxtnb(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqxtnb(zd, zn); + } + void Sqxtnt(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqxtnt(zd, zn); + } + void Sqxtunb(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqxtunb(zd, zn); + } + void Sqxtunt(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sqxtunt(zd, zn); + } + void Sri(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sri(zd, zn, shift); + } + void Srshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Srshr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + srshr(zd, pg, zd, shift); + } + void Srsra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift); + void Sshllb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sshllb(zd, zn, shift); + } + void Sshllt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sshllt(zd, zn, shift); + } + void Ssra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift); + void Ssublb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssublb(zd, zn, zm); + } + void Ssublbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssublbt(zd, zn, zm); + } + void Ssublt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssublt(zd, zn, zm); + } + void Ssubltb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssubltb(zd, zn, zm); + } + void Ssubwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssubwb(zd, zn, zm); + } + void Ssubwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ssubwt(zd, zn, zm); + } + void Subhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + subhnb(zd, zn, zm); + } + void Subhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + subhnt(zd, zn, zm); + } + void Suqadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Tbl(const ZRegister& zd, + const ZRegister& zn1, + const ZRegister& zn2, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + tbl(zd, zn1, zn2, zm); + } + void Tbx(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + tbx(zd, zn, zm); + } + void Uaba(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Uabalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Uabalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Uabdlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uabdlb(zd, zn, zm); + } + void Uabdlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uabdlt(zd, zn, zm); + } + void Uadalp(const ZRegister& zda, const PRegisterM& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uadalp(zda, pg, zn); + } + void Uaddlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uaddlb(zd, zn, zm); + } + void Uaddlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uaddlt(zd, zn, zm); + } + void Uaddwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uaddwb(zd, zn, zm); + } + void Uaddwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uaddwt(zd, zn, zm); + } + void Uhsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Umaxp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Uminp(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Umlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Umlalb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Umlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Umlalt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Umlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Umlslb(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Umlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Umlslt(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Umulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umulh(zd, zn, zm); + } + void Umullb(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umullb(zd, zn, zm, index); + } + void Umullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umullb(zd, zn, zm); + } + void Umullt(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umullt(zd, zn, zm, index); + } + void Umullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + umullt(zd, zn, zm); + } + void Uqrshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Uqrshrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqrshrnb(zd, zn, shift); + } + void Uqrshrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqrshrnt(zd, zn, shift); + } + void Uqshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + uqshl(zd, pg, zd, shift); + } + void Uqshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Uqshrnb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqshrnb(zd, zn, shift); + } + void Uqshrnt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqshrnt(zd, zn, shift); + } + void Uqsub(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Uqxtnb(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqxtnb(zd, zn); + } + void Uqxtnt(const ZRegister& zd, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + uqxtnt(zd, zn); + } + void Urecpe(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zd); + urecpe(zd, pg.Merging(), zn); + } + void Urshl(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Urshr(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zn); + urshr(zd, pg, zd, shift); + } + void Ursqrte(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) { + VIXL_ASSERT(allow_macro_instructions_); + MovprfxHelperScope guard(this, zd, pg, zd); + ursqrte(zd, pg.Merging(), zn); + } + void Ursra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift); + void Ushllb(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ushllb(zd, zn, shift); + } + void Ushllt(const ZRegister& zd, const ZRegister& zn, int shift) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ushllt(zd, zn, shift); + } + void Usqadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + void Usra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift); + void Usublb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + usublb(zd, zn, zm); + } + void Usublt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + usublt(zd, zn, zm); + } + void Usubwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + usubwb(zd, zn, zm); + } + void Usubwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + usubwt(zd, zn, zm); + } + void Whilege(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilege(pd, rn, rm); + } + void Whilegt(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilegt(pd, rn, rm); + } + void Whilehi(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilehi(pd, rn, rm); + } + void Whilehs(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilehs(pd, rn, rm); + } + void Whilerw(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilerw(pd, rn, rm); + } + void Whilewr(const PRegisterWithLaneSize& pd, + const Register& rn, + const Register& rm) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + whilewr(pd, rn, rm); + } + void Xar(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(zm)) { + SingleEmissionCheckScope guard(this); + xar(zd, zm, zn, shift); + } else { + MovprfxHelperScope guard(this, zd, zn); + xar(zd, zd, zm, shift); + } + } + void Fmmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Smmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Ummla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Usmmla(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Usdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + void Usdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + void Sudot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + + // MTE + void St2g(const Register& rt, const MemOperand& addr); + void Stg(const Register& rt, const MemOperand& addr); + void Stgp(const Register& rt1, const Register& rt2, const MemOperand& addr); + void Stz2g(const Register& rt, const MemOperand& addr); + void Stzg(const Register& rt, const MemOperand& addr); + void Ldg(const Register& rt, const MemOperand& addr); + + void Cpye(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpye(rd, rs, rn); + } + + void Cpyen(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyen(rd, rs, rn); + } + + void Cpyern(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyern(rd, rs, rn); + } + + void Cpyewn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyewn(rd, rs, rn); + } + + void Cpyfe(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfe(rd, rs, rn); + } + + void Cpyfen(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfen(rd, rs, rn); + } + + void Cpyfern(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfern(rd, rs, rn); + } + + void Cpyfewn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfewn(rd, rs, rn); + } + + void Cpyfm(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfm(rd, rs, rn); + } + + void Cpyfmn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfmn(rd, rs, rn); + } + + void Cpyfmrn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfmrn(rd, rs, rn); + } + + void Cpyfmwn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfmwn(rd, rs, rn); + } + + void Cpyfp(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfp(rd, rs, rn); + } + + void Cpyfpn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfpn(rd, rs, rn); + } + + void Cpyfprn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfprn(rd, rs, rn); + } + + void Cpyfpwn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyfpwn(rd, rs, rn); + } + + void Cpym(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpym(rd, rs, rn); + } + + void Cpymn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpymn(rd, rs, rn); + } + + void Cpymrn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpymrn(rd, rs, rn); + } + + void Cpymwn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpymwn(rd, rs, rn); + } + + void Cpyp(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyp(rd, rs, rn); + } + + void Cpypn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpypn(rd, rs, rn); + } + + void Cpyprn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpyprn(rd, rs, rn); + } + + void Cpypwn(const Register& rd, const Register& rs, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cpypwn(rd, rs, rn); + } + + void Sete(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + sete(rd, rn, rs); + } + + void Seten(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + seten(rd, rn, rs); + } + + void Setge(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setge(rd, rn, rs); + } + + void Setgen(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setgen(rd, rn, rs); + } + + void Setgm(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setgm(rd, rn, rs); + } + + void Setgmn(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setgmn(rd, rn, rs); + } + + void Setgp(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setgp(rd, rn, rs); + } + + void Setgpn(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setgpn(rd, rn, rs); + } + + void Setm(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setm(rd, rn, rs); + } + + void Setmn(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setmn(rd, rn, rs); + } + + void Setp(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setp(rd, rn, rs); + } + + void Setpn(const Register& rd, const Register& rn, const Register& rs) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + setpn(rd, rn, rs); + } + +// Macro assembler wrappers that package the MOPS instructions into a single +// call. +#define MOPS_LIST(V) \ + V(Set, set, ) \ + V(Setn, set, n) \ + V(Setg, setg, ) \ + V(Setgn, setg, n) \ + V(Cpy, cpy, ) \ + V(Cpyn, cpy, n) \ + V(Cpyrn, cpy, rn) \ + V(Cpywn, cpy, wn) \ + V(Cpyf, cpyf, ) \ + V(Cpyfn, cpyf, n) \ + V(Cpyfrn, cpyf, rn) \ + V(Cpyfwn, cpyf, wn) + +#define DEFINE_MACRO_ASM_FUNC(MASM, ASMPREFIX, ASMSUFFIX) \ + void MASM(const Register& ra, const Register& rb, const Register& rc) { \ + ExactAssemblyScope scope(this, 3 * kInstructionSize); \ + ASMPREFIX##p##ASMSUFFIX(ra, rb, rc); \ + ASMPREFIX##m##ASMSUFFIX(ra, rb, rc); \ + ASMPREFIX##e##ASMSUFFIX(ra, rb, rc); \ + } + MOPS_LIST(DEFINE_MACRO_ASM_FUNC) +#undef DEFINE_MACRO_ASM_FUNC + + void Abs(const Register& rd, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + abs(rd, rn); + } + + void Cnt(const Register& rd, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + cnt(rd, rn); + } + + void Ctz(const Register& rd, const Register& rn) { + VIXL_ASSERT(allow_macro_instructions_); + SingleEmissionCheckScope guard(this); + ctz(rd, rn); + } + + void Smax(const Register& rd, const Register& rn, const Operand& op); + void Smin(const Register& rd, const Register& rn, const Operand& op); + void Umax(const Register& rd, const Register& rn, const Operand& op); + void Umin(const Register& rd, const Register& rn, const Operand& op); + + template + Literal* CreateLiteralDestroyedWithPool(T value) { + return new Literal(value, + &literal_pool_, + RawLiteral::kDeletedOnPoolDestruction); + } + + template + Literal* CreateLiteralDestroyedWithPool(T high64, T low64) { + return new Literal(high64, + low64, + &literal_pool_, + RawLiteral::kDeletedOnPoolDestruction); + } + + // Push the system stack pointer (sp) down to allow the same to be done to + // the current stack pointer (according to StackPointer()). This must be + // called _before_ accessing the memory. + // + // This is necessary when pushing or otherwise adding things to the stack, to + // satisfy the AAPCS64 constraint that the memory below the system stack + // pointer is not accessed. + // + // This method asserts that StackPointer() is not sp, since the call does + // not make sense in that context. + // + // TODO: This method can only accept values of 'space' that can be encoded in + // one instruction. Refer to the implementation for details. + void BumpSystemStackPointer(const Operand& space); + + virtual bool AllowMacroInstructions() const VIXL_OVERRIDE { + return allow_macro_instructions_; + } + + virtual bool ArePoolsBlocked() const VIXL_OVERRIDE { + return IsLiteralPoolBlocked() && IsVeneerPoolBlocked(); + } + + void SetGenerateSimulatorCode(bool value) { + generate_simulator_code_ = value; + } + + bool GenerateSimulatorCode() const { return generate_simulator_code_; } + + size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); } + VIXL_DEPRECATED("GetLiteralPoolSize", size_t LiteralPoolSize() const) { + return GetLiteralPoolSize(); + } + + size_t GetLiteralPoolMaxSize() const { return literal_pool_.GetMaxSize(); } + VIXL_DEPRECATED("GetLiteralPoolMaxSize", size_t LiteralPoolMaxSize() const) { + return GetLiteralPoolMaxSize(); + } + + size_t GetVeneerPoolMaxSize() const { return veneer_pool_.GetMaxSize(); } + VIXL_DEPRECATED("GetVeneerPoolMaxSize", size_t VeneerPoolMaxSize() const) { + return GetVeneerPoolMaxSize(); + } + + // The number of unresolved branches that may require a veneer. + int GetNumberOfPotentialVeneers() const { + return veneer_pool_.GetNumberOfPotentialVeneers(); + } + VIXL_DEPRECATED("GetNumberOfPotentialVeneers", + int NumberOfPotentialVeneers() const) { + return GetNumberOfPotentialVeneers(); + } + + ptrdiff_t GetNextCheckPoint() const { + ptrdiff_t next_checkpoint_for_pools = + std::min(literal_pool_.GetCheckpoint(), veneer_pool_.GetCheckpoint()); + return std::min(next_checkpoint_for_pools, + static_cast(GetBuffer().GetCapacity())); + } + VIXL_DEPRECATED("GetNextCheckPoint", ptrdiff_t NextCheckPoint()) { + return GetNextCheckPoint(); + } + + void EmitLiteralPool(LiteralPool::EmitOption option) { + if (!literal_pool_.IsEmpty()) literal_pool_.Emit(option); + + checkpoint_ = GetNextCheckPoint(); + recommended_checkpoint_ = literal_pool_.GetNextRecommendedCheckpoint(); + } + + void CheckEmitFor(size_t amount); + void EnsureEmitFor(size_t amount) { + ptrdiff_t offset = amount; + ptrdiff_t max_pools_size = + literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize(); + ptrdiff_t cursor = GetCursorOffset(); + if ((cursor >= recommended_checkpoint_) || + ((cursor + offset + max_pools_size) >= checkpoint_)) { + CheckEmitFor(amount); + } + } + + void CheckEmitPoolsFor(size_t amount); + virtual void EnsureEmitPoolsFor(size_t amount) VIXL_OVERRIDE { + ptrdiff_t offset = amount; + ptrdiff_t max_pools_size = + literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize(); + ptrdiff_t cursor = GetCursorOffset(); + if ((cursor >= recommended_checkpoint_) || + ((cursor + offset + max_pools_size) >= checkpoint_)) { + CheckEmitPoolsFor(amount); + } + } + + // Set the current stack pointer, but don't generate any code. + void SetStackPointer(const Register& stack_pointer) { + VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(stack_pointer)); + sp_ = stack_pointer; + } + + // Return the current stack pointer, as set by SetStackPointer. + const Register& StackPointer() const { return sp_; } + + CPURegList* GetScratchRegisterList() { return &tmp_list_; } + VIXL_DEPRECATED("GetScratchRegisterList", CPURegList* TmpList()) { + return GetScratchRegisterList(); + } + + CPURegList* GetScratchVRegisterList() { return &v_tmp_list_; } + VIXL_DEPRECATED("GetScratchVRegisterList", CPURegList* FPTmpList()) { + return GetScratchVRegisterList(); + } + + CPURegList* GetScratchPRegisterList() { return &p_tmp_list_; } + + // Get or set the current (most-deeply-nested) UseScratchRegisterScope. + void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) { + current_scratch_scope_ = scope; + } + UseScratchRegisterScope* GetCurrentScratchRegisterScope() { + return current_scratch_scope_; + } + + // Like printf, but print at run-time from generated code. + // + // The caller must ensure that arguments for floating-point placeholders + // (such as %e, %f or %g) are VRegisters in format 1S or 1D, and that + // arguments for integer placeholders are Registers. + // + // At the moment it is only possible to print the value of sp if it is the + // current stack pointer. Otherwise, the MacroAssembler will automatically + // update sp on every push (using BumpSystemStackPointer), so determining its + // value is difficult. + // + // Format placeholders that refer to more than one argument, or to a specific + // argument, are not supported. This includes formats like "%1$d" or "%.*d". + // + // This function automatically preserves caller-saved registers so that + // calling code can use Printf at any point without having to worry about + // corruption. The preservation mechanism generates a lot of code. If this is + // a problem, preserve the important registers manually and then call + // PrintfNoPreserve. Callee-saved registers are not used by Printf, and are + // implicitly preserved. + void Printf(const char* format, + CPURegister arg0 = NoCPUReg, + CPURegister arg1 = NoCPUReg, + CPURegister arg2 = NoCPUReg, + CPURegister arg3 = NoCPUReg); + // Like Printf, but don't preserve any caller-saved registers, not even 'lr'. // // The return code from the system printf call will be returned in x0. @@ -3527,16 +7993,6 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { // Will output the flags. void Log(TraceParameters parameters); - // Enable or disable instrumentation when an Instrument visitor is attached to - // the simulator. - void EnableInstrumentation(); - void DisableInstrumentation(); - - // Add a marker to the instrumentation data produced by an Instrument visitor. - // The name is a two character string that will be attached to the marker in - // the output data. - void AnnotateInstrumentation(const char* marker_name); - // Enable or disable CPU features dynamically. This mechanism allows users to // strictly check the use of CPU features in different regions of code. void SetSimulatorCPUFeatures(const CPUFeatures& features); @@ -3640,6 +8096,36 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { Condition cond, bool* should_synthesise_left); + // Generate code to calculate the address represented by `addr` and write it + // into `xd`. This is used as a common fall-back for out-of-range load and + // store operands. + // + // The vl_divisor_log2 argument is used to scale the VL, for use with + // SVE_MUL_VL. + void CalculateSVEAddress(const Register& xd, + const SVEMemOperand& addr, + int vl_divisor_log2 = 0); + + void CalculateSVEAddress(const Register& xd, + const SVEMemOperand& addr, + const CPURegister& rt) { + VIXL_ASSERT(rt.IsPRegister() || rt.IsZRegister()); + int vl_divisor_log2 = rt.IsPRegister() ? kZRegBitsPerPRegBitLog2 : 0; + CalculateSVEAddress(xd, addr, vl_divisor_log2); + } + + void SetFPNaNPropagationOption(FPMacroNaNPropagationOption nan_option) { + fp_nan_propagation_ = nan_option; + } + + void ResolveFPNaNPropagationOption(FPMacroNaNPropagationOption* nan_option) { + // The input option has priority over the option that has set. + if (*nan_option == NoFPMacroNaNPropagationSelected) { + *nan_option = fp_nan_propagation_; + } + VIXL_ASSERT(*nan_option != NoFPMacroNaNPropagationSelected); + } + private: // The actual Push and Pop implementations. These don't generate any code // other than that required for the push or pop. This allows @@ -3693,6 +8179,212 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { void ConfigureSimulatorCPUFeaturesHelper(const CPUFeatures& features, DebugHltOpcode action); + void CompareHelper(Condition cond, + const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm); + + // E.g. Ld1rb. + typedef void (Assembler::*SVELoadBroadcastFn)(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + + void SVELoadBroadcastImmHelper(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr, + SVELoadBroadcastFn fn, + int divisor); + + // E.g. ldr/str + typedef void (Assembler::*SVELoadStoreFn)(const CPURegister& rt, + const SVEMemOperand& addr); + + void SVELoadStoreScalarImmHelper(const CPURegister& rt, + const SVEMemOperand& addr, + SVELoadStoreFn fn); + + typedef void (Assembler::*SVELoad1Fn)(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr); + typedef void (Assembler::*SVEStore1Fn)(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr); + + // Helper for predicated Z register loads with addressing modes not directly + // encodable in the instruction. The supported_modifier parameter indicates + // which offset modifier the calling instruction encoder supports (eg. + // SVE_MUL_VL). The ratio log2 of VL to memory access size is passed as + // vl_divisor_log2; pass -1 to indicate no dependency. + template + void SVELoadStoreNTBroadcastQOHelper( + const ZRegister& zt, + const Tg& pg, + const SVEMemOperand& addr, + Tf fn, + int imm_bits, + int shift_amount, + SVEOffsetModifier supported_modifier = NO_SVE_OFFSET_MODIFIER, + int vl_divisor_log2 = 0); + + template + void SVELoadStore1Helper(int msize_in_bytes_log2, + const ZRegister& zt, + const Tg& pg, + const SVEMemOperand& addr, + Tf fn); + + template + void SVELoadFFHelper(int msize_in_bytes_log2, + const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr, + Tf fn); + + typedef void (MacroAssembler::*IntWideImmMacroFn)(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm); + + typedef void (Assembler::*IntWideImmShiftFn)(const ZRegister& zd, + const ZRegister& zn, + int imm, + int shift); + + typedef void (Assembler::*Int3ArithFn)(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm); + + typedef void (Assembler::*Int4ArithFn)(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + + typedef void (Assembler::*IntArithImmFn)(const ZRegister& zd, + const ZRegister& zn, + int imm); + + typedef void (Assembler::*ZZZImmFn)(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int imm); + + typedef void (MacroAssembler::*SVEArithPredicatedFn)(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + + void IntWideImmHelper(IntArithImmFn imm_fn, + SVEArithPredicatedFn reg_fn, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm, + bool is_signed_imm); + + enum AddSubHelperOption { kAddImmediate, kSubImmediate }; + + void AddSubHelper(AddSubHelperOption option, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm); + + // Try to emit an add- or sub-like instruction (imm_fn) with `imm`, or the + // corresponding sub- or add-like instruction (n_imm_fn) with a negated `imm`. + // A `movprfx` is automatically generated if one is required. If successful, + // return true. Otherwise, return false. + // + // This helper uses two's complement equivalences, for example treating 0xffff + // as -1 for H-sized lanes. + bool TrySingleAddSub(AddSubHelperOption option, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm); + + void AbsoluteDifferenceAccumulate(Int3ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + + void FourRegDestructiveHelper(Int3ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + + void FourRegDestructiveHelper(Int4ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm); + + void SVEDotIndexHelper(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index); + + // For noncommutative arithmetic operations. + void NoncommutativeArithmeticHelper(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + SVEArithPredicatedFn fn, + SVEArithPredicatedFn rev_fn); + + void FPCommutativeArithmeticHelper(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + SVEArithPredicatedFn fn, + FPMacroNaNPropagationOption nan_option); + + // Floating-point fused multiply-add vectors (predicated), writing addend. + typedef void (Assembler::*SVEMulAddPredicatedZdaFn)(const ZRegister& zda, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + + // Floating-point fused multiply-add vectors (predicated), writing + // multiplicand. + typedef void (Assembler::*SVEMulAddPredicatedZdnFn)(const ZRegister& zdn, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm); + + void FPMulAddHelper(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + SVEMulAddPredicatedZdaFn fn_zda, + SVEMulAddPredicatedZdnFn fn_zdn, + FPMacroNaNPropagationOption nan_option); + + typedef void (Assembler::*SVEMulAddIndexFn)(const ZRegister& zda, + const ZRegister& zn, + const ZRegister& zm, + int index); + + void FourRegOneImmDestructiveHelper(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int imm); + + void ShiftRightAccumulate(IntArithImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int imm); + + void ComplexAddition(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot); + // Tell whether any of the macro instruction can be used. When false the // MacroAssembler will assert if a method which can emit a variable number // of instructions is called. @@ -3706,7 +8398,8 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { // Scratch registers available for use by the MacroAssembler. CPURegList tmp_list_; - CPURegList fptmp_list_; + CPURegList v_tmp_list_; + CPURegList p_tmp_list_; UseScratchRegisterScope* current_scratch_scope_; @@ -3716,6 +8409,8 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface { ptrdiff_t checkpoint_; ptrdiff_t recommended_checkpoint_; + FPMacroNaNPropagationOption fp_nan_propagation_; + friend class Pool; friend class LiteralPool; }; @@ -3784,11 +8479,35 @@ class BlockPoolsScope { MacroAssembler* masm_; }; +MovprfxHelperScope::MovprfxHelperScope(MacroAssembler* masm, + const ZRegister& dst, + const ZRegister& src) + : ExactAssemblyScope(masm, + ShouldGenerateMovprfx(dst, src) + ? (2 * kInstructionSize) + : kInstructionSize) { + if (ShouldGenerateMovprfx(dst, src)) { + masm->movprfx(dst, src); + } +} + +MovprfxHelperScope::MovprfxHelperScope(MacroAssembler* masm, + const ZRegister& dst, + const PRegister& pg, + const ZRegister& src) + : ExactAssemblyScope(masm, + ShouldGenerateMovprfx(dst, pg, src) + ? (2 * kInstructionSize) + : kInstructionSize) { + if (ShouldGenerateMovprfx(dst, pg, src)) { + masm->movprfx(dst, pg, src); + } +} // This scope utility allows scratch registers to be managed safely. The -// MacroAssembler's GetScratchRegisterList() (and GetScratchFPRegisterList()) is -// used as a pool of scratch registers. These registers can be allocated on -// demand, and will be returned at the end of the scope. +// MacroAssembler's GetScratch*RegisterList() are used as a pool of scratch +// registers. These registers can be allocated on demand, and will be returned +// at the end of the scope. // // When the scope ends, the MacroAssembler's lists will be restored to their // original state, even if the lists were modified by some other means. @@ -3798,14 +8517,22 @@ class UseScratchRegisterScope { // must not be `NULL`), so it is ready to use immediately after it has been // constructed. explicit UseScratchRegisterScope(MacroAssembler* masm) - : masm_(NULL), parent_(NULL), old_available_(0), old_availablefp_(0) { + : masm_(NULL), + parent_(NULL), + old_available_(0), + old_available_v_(0), + old_available_p_(0) { Open(masm); } // This constructor does not implicitly initialise the scope. Instead, the // user is required to explicitly call the `Open` function before using the // scope. UseScratchRegisterScope() - : masm_(NULL), parent_(NULL), old_available_(0), old_availablefp_(0) {} + : masm_(NULL), + parent_(NULL), + old_available_(0), + old_available_v_(0), + old_available_p_(0) {} // This function performs the actual initialisation work. void Open(MacroAssembler* masm); @@ -3820,25 +8547,42 @@ class UseScratchRegisterScope { bool IsAvailable(const CPURegister& reg) const; - // Take a register from the appropriate temps list. It will be returned // automatically when the scope ends. Register AcquireW() { - return AcquireNextAvailable(masm_->GetScratchRegisterList()).W(); + return AcquireFrom(masm_->GetScratchRegisterList()).W(); } Register AcquireX() { - return AcquireNextAvailable(masm_->GetScratchRegisterList()).X(); + return AcquireFrom(masm_->GetScratchRegisterList()).X(); } VRegister AcquireH() { - return AcquireNextAvailable(masm_->GetScratchFPRegisterList()).H(); + return AcquireFrom(masm_->GetScratchVRegisterList()).H(); } VRegister AcquireS() { - return AcquireNextAvailable(masm_->GetScratchFPRegisterList()).S(); + return AcquireFrom(masm_->GetScratchVRegisterList()).S(); } VRegister AcquireD() { - return AcquireNextAvailable(masm_->GetScratchFPRegisterList()).D(); + return AcquireFrom(masm_->GetScratchVRegisterList()).D(); + } + ZRegister AcquireZ() { + return AcquireFrom(masm_->GetScratchVRegisterList()).Z(); + } + PRegister AcquireP() { + // Prefer to allocate p8-p15 if we can, to leave p0-p7 available for use as + // governing predicates. + CPURegList* available = masm_->GetScratchPRegisterList(); + RegList preferred = ~kGoverningPRegisterMask; + if ((available->GetList() & preferred) != 0) { + return AcquireFrom(available, preferred).P(); + } + return AcquireFrom(available).P(); + } + // Acquire a P register suitable for use as a governing predicate in + // instructions which only accept p0-p7 for that purpose. + PRegister AcquireGoverningP() { + CPURegList* available = masm_->GetScratchPRegisterList(); + return AcquireFrom(available, kGoverningPRegisterMask).P(); } - Register AcquireRegisterOfSize(int size_in_bits); Register AcquireSameSizeAs(const Register& reg) { @@ -3854,6 +8598,12 @@ class UseScratchRegisterScope { : CPURegister(AcquireRegisterOfSize(size_in_bits)); } + // Acquire a register big enough to represent one lane of `vector`. + Register AcquireRegisterToHoldLane(const CPURegister& vector) { + VIXL_ASSERT(vector.GetLaneSizeInBits() <= kXRegSize); + return (vector.GetLaneSizeInBits() > kWRegSize) ? AcquireX() : AcquireW(); + } + // Explicitly release an acquired (or excluded) register, putting it back in // the appropriate temps list. @@ -3871,6 +8621,10 @@ class UseScratchRegisterScope { const VRegister& reg2 = NoVReg, const VRegister& reg3 = NoVReg, const VRegister& reg4 = NoVReg); + void Include(const CPURegister& reg1, + const CPURegister& reg2 = NoCPUReg, + const CPURegister& reg3 = NoCPUReg, + const CPURegister& reg4 = NoCPUReg); // Make sure that the specified registers are not available in this scope. @@ -3890,21 +8644,40 @@ class UseScratchRegisterScope { const CPURegister& reg3 = NoCPUReg, const CPURegister& reg4 = NoCPUReg); + // Convenience for excluding registers that are part of Operands. This is + // useful for sequences like this: + // + // // Use 'rd' as a scratch, but only if it's not aliased by an input. + // temps.Include(rd); + // temps.Exclude(rn); + // temps.Exclude(operand); + // + // Otherwise, a conditional check is needed on the last 'Exclude'. + void Exclude(const Operand& operand) { + if (operand.IsShiftedRegister() || operand.IsExtendedRegister()) { + Exclude(operand.GetRegister()); + } else { + VIXL_ASSERT(operand.IsImmediate()); + } + } // Prevent any scratch registers from being used in this scope. void ExcludeAll(); private: - static CPURegister AcquireNextAvailable(CPURegList* available); + static CPURegister AcquireFrom(CPURegList* available, + RegList mask = ~static_cast(0)); static void ReleaseByCode(CPURegList* available, int code); - static void ReleaseByRegList(CPURegList* available, RegList regs); - static void IncludeByRegList(CPURegList* available, RegList exclude); - static void ExcludeByRegList(CPURegList* available, RegList exclude); + CPURegList* GetAvailableListFor(CPURegister::RegisterBank bank); + + static const RegList kGoverningPRegisterMask = + (static_cast(1) << kNumberOfGoverningPRegisters) - 1; + // The MacroAssembler maintains a list of available scratch registers, and // also keeps track of the most recently-opened scope so that on destruction // we can check that scopes do not outlive their parents. @@ -3913,13 +8686,15 @@ class UseScratchRegisterScope { // The state of the available lists at the start of this scope. RegList old_available_; // kRegister - RegList old_availablefp_; // kVRegister + RegList old_available_v_; // kVRegister / kZRegister + RegList old_available_p_; // kPRegister // Disallow copy constructor and operator=. - VIXL_DEBUG_NO_RETURN UseScratchRegisterScope(const UseScratchRegisterScope&) { + VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope( + const UseScratchRegisterScope&) { VIXL_UNREACHABLE(); } - VIXL_DEBUG_NO_RETURN void operator=(const UseScratchRegisterScope&) { + VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) { VIXL_UNREACHABLE(); } }; @@ -3933,23 +8708,11 @@ class UseScratchRegisterScope { // features needs a corresponding macro instruction. class SimulationCPUFeaturesScope { public: - explicit SimulationCPUFeaturesScope( - MacroAssembler* masm, - CPUFeatures::Feature feature0 = CPUFeatures::kNone, - CPUFeatures::Feature feature1 = CPUFeatures::kNone, - CPUFeatures::Feature feature2 = CPUFeatures::kNone, - CPUFeatures::Feature feature3 = CPUFeatures::kNone) - : masm_(masm), - cpu_features_scope_(masm, feature0, feature1, feature2, feature3) { - masm_->SaveSimulatorCPUFeatures(); - masm_->EnableSimulatorCPUFeatures( - CPUFeatures(feature0, feature1, feature2, feature3)); - } - - SimulationCPUFeaturesScope(MacroAssembler* masm, const CPUFeatures& other) - : masm_(masm), cpu_features_scope_(masm, other) { + template + explicit SimulationCPUFeaturesScope(MacroAssembler* masm, T... features) + : masm_(masm), cpu_features_scope_(masm, features...) { masm_->SaveSimulatorCPUFeatures(); - masm_->EnableSimulatorCPUFeatures(other); + masm_->EnableSimulatorCPUFeatures(CPUFeatures(features...)); } ~SimulationCPUFeaturesScope() { masm_->RestoreSimulatorCPUFeatures(); } diff --git a/core/deps/vixl/aarch64/macro-assembler-sve-aarch64.cc b/core/deps/vixl/aarch64/macro-assembler-sve-aarch64.cc new file mode 100644 index 000000000..56a504cfd --- /dev/null +++ b/core/deps/vixl/aarch64/macro-assembler-sve-aarch64.cc @@ -0,0 +1,2288 @@ +// Copyright 2019, VIXL authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of ARM Limited nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "macro-assembler-aarch64.h" + +namespace vixl { +namespace aarch64 { + +void MacroAssembler::AddSubHelper(AddSubHelperOption option, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(imm.FitsInLane(zd)); + + // Simple, encodable cases. + if (TrySingleAddSub(option, zd, zn, imm)) return; + + VIXL_ASSERT((option == kAddImmediate) || (option == kSubImmediate)); + bool add_imm = (option == kAddImmediate); + + // Try to translate Add(..., -imm) to Sub(..., imm) if we can encode it in one + // instruction. Also interpret the immediate as signed, so we can convert + // Add(zd.VnH(), zn.VnH(), 0xffff...) to Sub(..., 1), etc. + IntegerOperand signed_imm(imm.AsIntN(zd.GetLaneSizeInBits())); + if (signed_imm.IsNegative()) { + AddSubHelperOption n_option = add_imm ? kSubImmediate : kAddImmediate; + IntegerOperand n_imm(signed_imm.GetMagnitude()); + // IntegerOperand can represent -INT_MIN, so this is always safe. + VIXL_ASSERT(n_imm.IsPositiveOrZero()); + if (TrySingleAddSub(n_option, zd, zn, n_imm)) return; + } + + // Otherwise, fall back to dup + ADD_z_z/SUB_z_z. + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithLaneSize(zn.GetLaneSizeInBits()); + Dup(scratch, imm); + + SingleEmissionCheckScope guard(this); + if (add_imm) { + add(zd, zn, scratch); + } else { + sub(zd, zn, scratch); + } +} + +bool MacroAssembler::TrySingleAddSub(AddSubHelperOption option, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(imm.FitsInLane(zd)); + + int imm8; + int shift = -1; + if (imm.TryEncodeAsShiftedUintNForLane<8, 0>(zd, &imm8, &shift) || + imm.TryEncodeAsShiftedUintNForLane<8, 8>(zd, &imm8, &shift)) { + MovprfxHelperScope guard(this, zd, zn); + switch (option) { + case kAddImmediate: + add(zd, zd, imm8, shift); + return true; + case kSubImmediate: + sub(zd, zd, imm8, shift); + return true; + } + } + return false; +} + +void MacroAssembler::IntWideImmHelper(IntArithImmFn imm_fn, + SVEArithPredicatedFn reg_macro, + const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm, + bool is_signed) { + if (is_signed) { + // E.g. MUL_z_zi, SMIN_z_zi, SMAX_z_zi + if (imm.IsInt8()) { + MovprfxHelperScope guard(this, zd, zn); + (this->*imm_fn)(zd, zd, imm.AsInt8()); + return; + } + } else { + // E.g. UMIN_z_zi, UMAX_z_zi + if (imm.IsUint8()) { + MovprfxHelperScope guard(this, zd, zn); + (this->*imm_fn)(zd, zd, imm.AsUint8()); + return; + } + } + + UseScratchRegisterScope temps(this); + PRegister pg = temps.AcquireGoverningP(); + Ptrue(pg.WithSameLaneSizeAs(zd)); + + // Try to re-use zd if we can, so we can avoid a movprfx. + ZRegister scratch = + zd.Aliases(zn) ? temps.AcquireZ().WithLaneSize(zn.GetLaneSizeInBits()) + : zd; + Dup(scratch, imm); + + // The vector-form macro for commutative operations will swap the arguments to + // avoid movprfx, if necessary. + (this->*reg_macro)(zd, pg.Merging(), zn, scratch); +} + +void MacroAssembler::Mul(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + IntArithImmFn imm_fn = &Assembler::mul; + SVEArithPredicatedFn reg_fn = &MacroAssembler::Mul; + IntWideImmHelper(imm_fn, reg_fn, zd, zn, imm, true); +} + +void MacroAssembler::Smin(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInSignedLane(zd)); + IntArithImmFn imm_fn = &Assembler::smin; + SVEArithPredicatedFn reg_fn = &MacroAssembler::Smin; + IntWideImmHelper(imm_fn, reg_fn, zd, zn, imm, true); +} + +void MacroAssembler::Smax(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInSignedLane(zd)); + IntArithImmFn imm_fn = &Assembler::smax; + SVEArithPredicatedFn reg_fn = &MacroAssembler::Smax; + IntWideImmHelper(imm_fn, reg_fn, zd, zn, imm, true); +} + +void MacroAssembler::Umax(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInUnsignedLane(zd)); + IntArithImmFn imm_fn = &Assembler::umax; + SVEArithPredicatedFn reg_fn = &MacroAssembler::Umax; + IntWideImmHelper(imm_fn, reg_fn, zd, zn, imm, false); +} + +void MacroAssembler::Umin(const ZRegister& zd, + const ZRegister& zn, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInUnsignedLane(zd)); + IntArithImmFn imm_fn = &Assembler::umin; + SVEArithPredicatedFn reg_fn = &MacroAssembler::Umin; + IntWideImmHelper(imm_fn, reg_fn, zd, zn, imm, false); +} + +void MacroAssembler::Addpl(const Register& xd, + const Register& xn, + int64_t multiplier) { + VIXL_ASSERT(allow_macro_instructions_); + + // This macro relies on `Rdvl` to handle some out-of-range cases. Check that + // `VL * multiplier` cannot overflow, for any possible value of VL. + VIXL_ASSERT(multiplier <= (INT64_MAX / kZRegMaxSizeInBytes)); + VIXL_ASSERT(multiplier >= (INT64_MIN / kZRegMaxSizeInBytes)); + + if (xd.IsZero()) return; + if (xn.IsZero() && xd.IsSP()) { + // TODO: This operation doesn't make much sense, but we could support it + // with a scratch register if necessary. + VIXL_UNIMPLEMENTED(); + } + + // Handling xzr requires an extra move, so defer it until later so we can try + // to use `rdvl` instead (via `Addvl`). + if (IsInt6(multiplier) && !xn.IsZero()) { + SingleEmissionCheckScope guard(this); + addpl(xd, xn, static_cast(multiplier)); + return; + } + + // If `multiplier` is a multiple of 8, we can use `Addvl` instead. + if ((multiplier % kZRegBitsPerPRegBit) == 0) { + Addvl(xd, xn, multiplier / kZRegBitsPerPRegBit); + return; + } + + if (IsInt6(multiplier)) { + VIXL_ASSERT(xn.IsZero()); // Other cases were handled with `addpl`. + // There is no simple `rdpl` instruction, and `addpl` cannot accept xzr, so + // materialise a zero. + MacroEmissionCheckScope guard(this); + movz(xd, 0); + addpl(xd, xd, static_cast(multiplier)); + return; + } + + // TODO: Some probable cases result in rather long sequences. For example, + // `Addpl(sp, sp, 33)` requires five instructions, even though it's only just + // outside the encodable range. We should look for ways to cover such cases + // without drastically increasing the complexity of this logic. + + // For other cases, calculate xn + (PL * multiplier) using discrete + // instructions. This requires two scratch registers in the general case, so + // try to re-use the destination as a scratch register. + UseScratchRegisterScope temps(this); + temps.Include(xd); + temps.Exclude(xn); + + Register scratch = temps.AcquireX(); + // Because there is no `rdpl`, so we have to calculate PL from VL. We can't + // scale the multiplier because (we already know) it isn't a multiple of 8. + Rdvl(scratch, multiplier); + + MacroEmissionCheckScope guard(this); + if (xn.IsZero()) { + asr(xd, scratch, kZRegBitsPerPRegBitLog2); + } else if (xd.IsSP() || xn.IsSP()) { + // TODO: MacroAssembler::Add should be able to handle this. + asr(scratch, scratch, kZRegBitsPerPRegBitLog2); + add(xd, xn, scratch); + } else { + add(xd, xn, Operand(scratch, ASR, kZRegBitsPerPRegBitLog2)); + } +} + +void MacroAssembler::Addvl(const Register& xd, + const Register& xn, + int64_t multiplier) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(xd.IsX()); + VIXL_ASSERT(xn.IsX()); + + // Check that `VL * multiplier` cannot overflow, for any possible value of VL. + VIXL_ASSERT(multiplier <= (INT64_MAX / kZRegMaxSizeInBytes)); + VIXL_ASSERT(multiplier >= (INT64_MIN / kZRegMaxSizeInBytes)); + + if (xd.IsZero()) return; + if (xn.IsZero() && xd.IsSP()) { + // TODO: This operation doesn't make much sense, but we could support it + // with a scratch register if necessary. `rdvl` cannot write into `sp`. + VIXL_UNIMPLEMENTED(); + } + + if (IsInt6(multiplier)) { + SingleEmissionCheckScope guard(this); + if (xn.IsZero()) { + rdvl(xd, static_cast(multiplier)); + } else { + addvl(xd, xn, static_cast(multiplier)); + } + return; + } + + // TODO: Some probable cases result in rather long sequences. For example, + // `Addvl(sp, sp, 42)` requires four instructions, even though it's only just + // outside the encodable range. We should look for ways to cover such cases + // without drastically increasing the complexity of this logic. + + // For other cases, calculate xn + (VL * multiplier) using discrete + // instructions. This requires two scratch registers in the general case, so + // we try to re-use the destination as a scratch register. + UseScratchRegisterScope temps(this); + temps.Include(xd); + temps.Exclude(xn); + + Register a = temps.AcquireX(); + Mov(a, multiplier); + + MacroEmissionCheckScope guard(this); + Register b = temps.AcquireX(); + rdvl(b, 1); + if (xn.IsZero()) { + mul(xd, a, b); + } else if (xd.IsSP() || xn.IsSP()) { + mul(a, a, b); + add(xd, xn, a); + } else { + madd(xd, a, b, xn); + } +} + +void MacroAssembler::CalculateSVEAddress(const Register& xd, + const SVEMemOperand& addr, + int vl_divisor_log2) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(!addr.IsScatterGather()); + VIXL_ASSERT(xd.IsX()); + + // The lower bound is where a whole Z register is accessed. + VIXL_ASSERT(!addr.IsMulVl() || (vl_divisor_log2 >= 0)); + // The upper bound is for P register accesses, and for instructions like + // "st1b { z0.d } [...]", where one byte is accessed for every D-sized lane. + VIXL_ASSERT(vl_divisor_log2 <= static_cast(kZRegBitsPerPRegBitLog2)); + + SVEOffsetModifier mod = addr.GetOffsetModifier(); + Register base = addr.GetScalarBase(); + + if (addr.IsEquivalentToScalar()) { + // For example: + // [x0] + // [x0, #0] + // [x0, xzr, LSL 2] + Mov(xd, base); + } else if (addr.IsScalarPlusImmediate()) { + // For example: + // [x0, #42] + // [x0, #42, MUL VL] + int64_t offset = addr.GetImmediateOffset(); + VIXL_ASSERT(offset != 0); // Handled by IsEquivalentToScalar. + if (addr.IsMulVl()) { + int vl_divisor = 1 << vl_divisor_log2; + // For all possible values of vl_divisor, we can simply use `Addpl`. This + // will select `addvl` if necessary. + VIXL_ASSERT((kZRegBitsPerPRegBit % vl_divisor) == 0); + Addpl(xd, base, offset * (kZRegBitsPerPRegBit / vl_divisor)); + } else { + // IsScalarPlusImmediate() ensures that no other modifiers can occur. + VIXL_ASSERT(mod == NO_SVE_OFFSET_MODIFIER); + Add(xd, base, offset); + } + } else if (addr.IsScalarPlusScalar()) { + // For example: + // [x0, x1] + // [x0, x1, LSL #4] + Register offset = addr.GetScalarOffset(); + VIXL_ASSERT(!offset.IsZero()); // Handled by IsEquivalentToScalar. + if (mod == SVE_LSL) { + Add(xd, base, Operand(offset, LSL, addr.GetShiftAmount())); + } else { + // IsScalarPlusScalar() ensures that no other modifiers can occur. + VIXL_ASSERT(mod == NO_SVE_OFFSET_MODIFIER); + Add(xd, base, offset); + } + } else { + // All other forms are scatter-gather addresses, which cannot be evaluated + // into an X register. + VIXL_UNREACHABLE(); + } +} + +void MacroAssembler::Cpy(const ZRegister& zd, + const PRegister& pg, + IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInLane(zd)); + int imm8; + int shift; + if (imm.TryEncodeAsShiftedIntNForLane<8, 0>(zd, &imm8, &shift) || + imm.TryEncodeAsShiftedIntNForLane<8, 8>(zd, &imm8, &shift)) { + SingleEmissionCheckScope guard(this); + cpy(zd, pg, imm8, shift); + return; + } + + // The fallbacks rely on `cpy` variants that only support merging predication. + // If zeroing predication was requested, zero the destination first. + if (pg.IsZeroing()) { + SingleEmissionCheckScope guard(this); + dup(zd, 0); + } + PRegisterM pg_m = pg.Merging(); + + // Try to encode the immediate using fcpy. + VIXL_ASSERT(imm.FitsInLane(zd)); + if (zd.GetLaneSizeInBits() >= kHRegSize) { + double fp_imm = 0.0; + switch (zd.GetLaneSizeInBits()) { + case kHRegSize: + fp_imm = + FPToDouble(RawbitsToFloat16(imm.AsUint16()), kIgnoreDefaultNaN); + break; + case kSRegSize: + fp_imm = RawbitsToFloat(imm.AsUint32()); + break; + case kDRegSize: + fp_imm = RawbitsToDouble(imm.AsUint64()); + break; + default: + VIXL_UNREACHABLE(); + break; + } + // IsImmFP64 is equivalent to IsImmFP for the same arithmetic value, so + // we can use IsImmFP64 for all lane sizes. + if (IsImmFP64(fp_imm)) { + SingleEmissionCheckScope guard(this); + fcpy(zd, pg_m, fp_imm); + return; + } + } + + // Fall back to using a scratch register. + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireRegisterToHoldLane(zd); + Mov(scratch, imm); + + SingleEmissionCheckScope guard(this); + cpy(zd, pg_m, scratch); +} + +// TODO: We implement Fcpy (amongst other things) for all FP types because it +// allows us to preserve user-specified NaNs. We should come up with some +// FPImmediate type to abstract this, and avoid all the duplication below (and +// elsewhere). + +void MacroAssembler::Fcpy(const ZRegister& zd, + const PRegisterM& pg, + double imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(pg.IsMerging()); + + if (IsImmFP64(imm)) { + SingleEmissionCheckScope guard(this); + fcpy(zd, pg, imm); + return; + } + + // As a fall-back, cast the immediate to the required lane size, and try to + // encode the bit pattern using `Cpy`. + Cpy(zd, pg, FPToRawbitsWithSize(zd.GetLaneSizeInBits(), imm)); +} + +void MacroAssembler::Fcpy(const ZRegister& zd, + const PRegisterM& pg, + float imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(pg.IsMerging()); + + if (IsImmFP32(imm)) { + SingleEmissionCheckScope guard(this); + fcpy(zd, pg, imm); + return; + } + + // As a fall-back, cast the immediate to the required lane size, and try to + // encode the bit pattern using `Cpy`. + Cpy(zd, pg, FPToRawbitsWithSize(zd.GetLaneSizeInBits(), imm)); +} + +void MacroAssembler::Fcpy(const ZRegister& zd, + const PRegisterM& pg, + Float16 imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(pg.IsMerging()); + + if (IsImmFP16(imm)) { + SingleEmissionCheckScope guard(this); + fcpy(zd, pg, imm); + return; + } + + // As a fall-back, cast the immediate to the required lane size, and try to + // encode the bit pattern using `Cpy`. + Cpy(zd, pg, FPToRawbitsWithSize(zd.GetLaneSizeInBits(), imm)); +} + +void MacroAssembler::Dup(const ZRegister& zd, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInLane(zd)); + unsigned lane_size = zd.GetLaneSizeInBits(); + int imm8; + int shift; + if (imm.TryEncodeAsShiftedIntNForLane<8, 0>(zd, &imm8, &shift) || + imm.TryEncodeAsShiftedIntNForLane<8, 8>(zd, &imm8, &shift)) { + SingleEmissionCheckScope guard(this); + dup(zd, imm8, shift); + } else if (IsImmLogical(imm.AsUintN(lane_size), lane_size)) { + SingleEmissionCheckScope guard(this); + dupm(zd, imm.AsUintN(lane_size)); + } else { + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireRegisterToHoldLane(zd); + Mov(scratch, imm); + + SingleEmissionCheckScope guard(this); + dup(zd, scratch); + } +} + +void MacroAssembler::NoncommutativeArithmeticHelper( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + SVEArithPredicatedFn fn, + SVEArithPredicatedFn rev_fn) { + if (zd.Aliases(zn)) { + // E.g. zd = zd / zm + SingleEmissionCheckScope guard(this); + (this->*fn)(zd, pg, zn, zm); + } else if (zd.Aliases(zm)) { + // E.g. zd = zn / zd + SingleEmissionCheckScope guard(this); + (this->*rev_fn)(zd, pg, zm, zn); + } else { + // E.g. zd = zn / zm + MovprfxHelperScope guard(this, zd, pg, zn); + (this->*fn)(zd, pg, zd, zm); + } +} + +void MacroAssembler::FPCommutativeArithmeticHelper( + const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + SVEArithPredicatedFn fn, + FPMacroNaNPropagationOption nan_option) { + ResolveFPNaNPropagationOption(&nan_option); + + if (zd.Aliases(zn)) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zd, pg, zd, zm); + } else if (zd.Aliases(zm)) { + switch (nan_option) { + case FastNaNPropagation: { + // Swap the arguments. + SingleEmissionCheckScope guard(this); + (this->*fn)(zd, pg, zd, zn); + return; + } + case StrictNaNPropagation: { + UseScratchRegisterScope temps(this); + // Use a scratch register to keep the argument order exactly as + // specified. + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zn); + { + MovprfxHelperScope guard(this, scratch, pg, zn); + (this->*fn)(scratch, pg, scratch, zm); + } + Mov(zd, scratch); + return; + } + case NoFPMacroNaNPropagationSelected: + VIXL_UNREACHABLE(); + return; + } + } else { + MovprfxHelperScope guard(this, zd, pg, zn); + (this->*fn)(zd, pg, zd, zm); + } +} + +// Instructions of the form "inst zda, zn, zm, #num", where they are +// non-commutative and no reversed form is provided. +#define VIXL_SVE_NONCOMM_ARITH_ZZZZI_LIST(V) \ + V(Cmla, cmla) \ + V(Sqrdcmlah, sqrdcmlah) + +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const ZRegister& za, \ + const ZRegister& zn, \ + const ZRegister& zm, \ + int imm) { \ + if ((zd.Aliases(zn) || zd.Aliases(zm)) && !zd.Aliases(za)) { \ + UseScratchRegisterScope temps(this); \ + VIXL_ASSERT(AreSameLaneSize(zn, zm)); \ + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zn); \ + Mov(ztmp, zd.Aliases(zn) ? zn : zm); \ + MovprfxHelperScope guard(this, zd, za); \ + ASMFN(zd, \ + (zd.Aliases(zn) ? ztmp : zn), \ + (zd.Aliases(zm) ? ztmp : zm), \ + imm); \ + } else { \ + MovprfxHelperScope guard(this, zd, za); \ + ASMFN(zd, zn, zm, imm); \ + } \ + } +VIXL_SVE_NONCOMM_ARITH_ZZZZI_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +// Instructions of the form "inst zda, zn, zm, #num, #num", where they are +// non-commutative and no reversed form is provided. +#define VIXL_SVE_NONCOMM_ARITH_ZZZZII_LIST(V) \ + V(Cmla, cmla) \ + V(Sqrdcmlah, sqrdcmlah) + +// This doesn't handle zm when it's out of the range that can be encoded in +// instruction. The range depends on element size: z0-z7 for H, z0-15 for S. +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const ZRegister& za, \ + const ZRegister& zn, \ + const ZRegister& zm, \ + int index, \ + int rot) { \ + if ((zd.Aliases(zn) || zd.Aliases(zm)) && !zd.Aliases(za)) { \ + UseScratchRegisterScope temps(this); \ + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zd); \ + { \ + MovprfxHelperScope guard(this, ztmp, za); \ + ASMFN(ztmp, zn, zm, index, rot); \ + } \ + Mov(zd, ztmp); \ + } else { \ + MovprfxHelperScope guard(this, zd, za); \ + ASMFN(zd, zn, zm, index, rot); \ + } \ + } +VIXL_SVE_NONCOMM_ARITH_ZZZZII_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +// Instructions of the form "inst zda, pg, zda, zn", where they are +// non-commutative and no reversed form is provided. +#define VIXL_SVE_NONCOMM_ARITH_ZPZZ_LIST(V) \ + V(Addp, addp) \ + V(Bic, bic) \ + V(Faddp, faddp) \ + V(Fmaxnmp, fmaxnmp) \ + V(Fminnmp, fminnmp) \ + V(Fmaxp, fmaxp) \ + V(Fminp, fminp) \ + V(Fscale, fscale) \ + V(Smaxp, smaxp) \ + V(Sminp, sminp) \ + V(Suqadd, suqadd) \ + V(Umaxp, umaxp) \ + V(Uminp, uminp) \ + V(Usqadd, usqadd) + +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const PRegisterM& pg, \ + const ZRegister& zn, \ + const ZRegister& zm) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + if (zd.Aliases(zm) && !zd.Aliases(zn)) { \ + UseScratchRegisterScope temps(this); \ + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zm); \ + Mov(scratch, zm); \ + MovprfxHelperScope guard(this, zd, pg, zn); \ + ASMFN(zd, pg, zd, scratch); \ + } else { \ + MovprfxHelperScope guard(this, zd, pg, zn); \ + ASMFN(zd, pg, zd, zm); \ + } \ + } +VIXL_SVE_NONCOMM_ARITH_ZPZZ_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +// Instructions of the form "inst zda, pg, zda, zn", where they are +// non-commutative and a reversed form is provided. +#define VIXL_SVE_NONCOMM_ARITH_REVERSE_ZPZZ_LIST(V) \ + V(Asr, asr) \ + V(Fdiv, fdiv) \ + V(Fsub, fsub) \ + V(Lsl, lsl) \ + V(Lsr, lsr) \ + V(Sdiv, sdiv) \ + V(Shsub, shsub) \ + V(Sqrshl, sqrshl) \ + V(Sqshl, sqshl) \ + V(Sqsub, sqsub) \ + V(Srshl, srshl) \ + V(Sub, sub) \ + V(Udiv, udiv) \ + V(Uhsub, uhsub) \ + V(Uqrshl, uqrshl) \ + V(Uqshl, uqshl) \ + V(Uqsub, uqsub) \ + V(Urshl, urshl) + +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const PRegisterM& pg, \ + const ZRegister& zn, \ + const ZRegister& zm) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + NoncommutativeArithmeticHelper(zd, \ + pg, \ + zn, \ + zm, \ + static_cast( \ + &Assembler::ASMFN), \ + static_cast( \ + &Assembler::ASMFN##r)); \ + } +VIXL_SVE_NONCOMM_ARITH_REVERSE_ZPZZ_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +void MacroAssembler::Fadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fadd), + nan_option); +} + +void MacroAssembler::Fabd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fabd), + nan_option); +} + +void MacroAssembler::Fmul(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fmul), + nan_option); +} + +void MacroAssembler::Fmulx(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fmulx), + nan_option); +} + +void MacroAssembler::Fmax(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fmax), + nan_option); +} + +void MacroAssembler::Fmin(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fmin), + nan_option); +} + +void MacroAssembler::Fmaxnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fmaxnm), + nan_option); +} + +void MacroAssembler::Fminnm(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPCommutativeArithmeticHelper(zd, + pg, + zn, + zm, + static_cast( + &Assembler::fminnm), + nan_option); +} + +void MacroAssembler::Fdup(const ZRegister& zd, double imm) { + VIXL_ASSERT(allow_macro_instructions_); + + switch (zd.GetLaneSizeInBits()) { + case kHRegSize: + Fdup(zd, Float16(imm)); + break; + case kSRegSize: + Fdup(zd, static_cast(imm)); + break; + case kDRegSize: + uint64_t bits = DoubleToRawbits(imm); + if (IsImmFP64(bits)) { + SingleEmissionCheckScope guard(this); + fdup(zd, imm); + } else { + Dup(zd, bits); + } + break; + } +} + +void MacroAssembler::Fdup(const ZRegister& zd, float imm) { + VIXL_ASSERT(allow_macro_instructions_); + + switch (zd.GetLaneSizeInBits()) { + case kHRegSize: + Fdup(zd, Float16(imm)); + break; + case kSRegSize: + if (IsImmFP32(imm)) { + SingleEmissionCheckScope guard(this); + fdup(zd, imm); + } else { + Dup(zd, FloatToRawbits(imm)); + } + break; + case kDRegSize: + Fdup(zd, static_cast(imm)); + break; + } +} + +void MacroAssembler::Fdup(const ZRegister& zd, Float16 imm) { + VIXL_ASSERT(allow_macro_instructions_); + + switch (zd.GetLaneSizeInBits()) { + case kHRegSize: + if (IsImmFP16(imm)) { + SingleEmissionCheckScope guard(this); + fdup(zd, imm); + } else { + Dup(zd, Float16ToRawbits(imm)); + } + break; + case kSRegSize: + Fdup(zd, FPToFloat(imm, kIgnoreDefaultNaN)); + break; + case kDRegSize: + Fdup(zd, FPToDouble(imm, kIgnoreDefaultNaN)); + break; + } +} + +void MacroAssembler::Index(const ZRegister& zd, + const Operand& start, + const Operand& step) { + class IndexOperand : public Operand { + public: + static IndexOperand Prepare(MacroAssembler* masm, + UseScratchRegisterScope* temps, + const Operand& op, + const ZRegister& zd_inner) { + // Look for encodable immediates. + int imm; + if (op.IsImmediate()) { + if (IntegerOperand(op).TryEncodeAsIntNForLane<5>(zd_inner, &imm)) { + return IndexOperand(imm); + } + Register scratch = temps->AcquireRegisterToHoldLane(zd_inner); + masm->Mov(scratch, op); + return IndexOperand(scratch); + } else { + // Plain registers can be encoded directly. + VIXL_ASSERT(op.IsPlainRegister()); + return IndexOperand(op.GetRegister()); + } + } + + int GetImm5() const { + int64_t imm = GetImmediate(); + VIXL_ASSERT(IsInt5(imm)); + return static_cast(imm); + } + + private: + explicit IndexOperand(const Register& reg) : Operand(reg) {} + explicit IndexOperand(int64_t imm) : Operand(imm) {} + }; + + UseScratchRegisterScope temps(this); + IndexOperand start_enc = IndexOperand::Prepare(this, &temps, start, zd); + IndexOperand step_enc = IndexOperand::Prepare(this, &temps, step, zd); + + SingleEmissionCheckScope guard(this); + if (start_enc.IsImmediate()) { + if (step_enc.IsImmediate()) { + index(zd, start_enc.GetImm5(), step_enc.GetImm5()); + } else { + index(zd, start_enc.GetImm5(), step_enc.GetRegister()); + } + } else { + if (step_enc.IsImmediate()) { + index(zd, start_enc.GetRegister(), step_enc.GetImm5()); + } else { + index(zd, start_enc.GetRegister(), step_enc.GetRegister()); + } + } +} + +void MacroAssembler::Insr(const ZRegister& zdn, IntegerOperand imm) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(imm.FitsInLane(zdn)); + + if (imm.IsZero()) { + SingleEmissionCheckScope guard(this); + insr(zdn, xzr); + return; + } + + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireRegisterToHoldLane(zdn); + + // TODO: There are many cases where we could optimise immediates, such as by + // detecting repeating patterns or FP immediates. We should optimise and + // abstract this for use in other SVE mov-immediate-like macros. + Mov(scratch, imm); + + SingleEmissionCheckScope guard(this); + insr(zdn, scratch); +} + +void MacroAssembler::Mla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(za)) { + // zda = zda + (zn * zm) + SingleEmissionCheckScope guard(this); + mla(zd, pg, zn, zm); + } else if (zd.Aliases(zn)) { + // zdn = za + (zdn * zm) + SingleEmissionCheckScope guard(this); + mad(zd, pg, zm, za); + } else if (zd.Aliases(zm)) { + // Multiplication is commutative, so we can swap zn and zm. + // zdm = za + (zdm * zn) + SingleEmissionCheckScope guard(this); + mad(zd, pg, zn, za); + } else { + // zd = za + (zn * zm) + ExactAssemblyScope guard(this, 2 * kInstructionSize); + movprfx(zd, pg, za); + mla(zd, pg, zn, zm); + } +} + +void MacroAssembler::Mls(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(za)) { + // zda = zda - (zn * zm) + SingleEmissionCheckScope guard(this); + mls(zd, pg, zn, zm); + } else if (zd.Aliases(zn)) { + // zdn = za - (zdn * zm) + SingleEmissionCheckScope guard(this); + msb(zd, pg, zm, za); + } else if (zd.Aliases(zm)) { + // Multiplication is commutative, so we can swap zn and zm. + // zdm = za - (zdm * zn) + SingleEmissionCheckScope guard(this); + msb(zd, pg, zn, za); + } else { + // zd = za - (zn * zm) + ExactAssemblyScope guard(this, 2 * kInstructionSize); + movprfx(zd, pg, za); + mls(zd, pg, zn, zm); + } +} + +void MacroAssembler::CompareHelper(Condition cond, + const PRegisterWithLaneSize& pd, + const PRegisterZ& pg, + const ZRegister& zn, + IntegerOperand imm) { + UseScratchRegisterScope temps(this); + ZRegister zm = temps.AcquireZ().WithLaneSize(zn.GetLaneSizeInBits()); + Dup(zm, imm); + SingleEmissionCheckScope guard(this); + cmp(cond, pd, pg, zn, zm); +} + +void MacroAssembler::Pfirst(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(pd.IsLaneSizeB()); + VIXL_ASSERT(pn.IsLaneSizeB()); + if (pd.Is(pn)) { + SingleEmissionCheckScope guard(this); + pfirst(pd, pg, pn); + } else { + UseScratchRegisterScope temps(this); + PRegister temp_pg = pg; + if (pd.Aliases(pg)) { + temp_pg = temps.AcquireP(); + Mov(temp_pg.VnB(), pg.VnB()); + } + Mov(pd, pn); + SingleEmissionCheckScope guard(this); + pfirst(pd, temp_pg, pd); + } +} + +void MacroAssembler::Pnext(const PRegisterWithLaneSize& pd, + const PRegister& pg, + const PRegisterWithLaneSize& pn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(AreSameFormat(pd, pn)); + if (pd.Is(pn)) { + SingleEmissionCheckScope guard(this); + pnext(pd, pg, pn); + } else { + UseScratchRegisterScope temps(this); + PRegister temp_pg = pg; + if (pd.Aliases(pg)) { + temp_pg = temps.AcquireP(); + Mov(temp_pg.VnB(), pg.VnB()); + } + Mov(pd.VnB(), pn.VnB()); + SingleEmissionCheckScope guard(this); + pnext(pd, temp_pg, pd); + } +} + +void MacroAssembler::Ptrue(const PRegisterWithLaneSize& pd, + SVEPredicateConstraint pattern, + FlagsUpdate s) { + VIXL_ASSERT(allow_macro_instructions_); + switch (s) { + case LeaveFlags: + Ptrue(pd, pattern); + return; + case SetFlags: + Ptrues(pd, pattern); + return; + } + VIXL_UNREACHABLE(); +} + +void MacroAssembler::Sub(const ZRegister& zd, + IntegerOperand imm, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + + int imm8; + int shift = -1; + if (imm.TryEncodeAsShiftedUintNForLane<8, 0>(zd, &imm8, &shift) || + imm.TryEncodeAsShiftedUintNForLane<8, 8>(zd, &imm8, &shift)) { + MovprfxHelperScope guard(this, zd, zm); + subr(zd, zd, imm8, shift); + } else { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithLaneSize(zm.GetLaneSizeInBits()); + Dup(scratch, imm); + + SingleEmissionCheckScope guard(this); + sub(zd, scratch, zm); + } +} + +void MacroAssembler::SVELoadBroadcastImmHelper(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr, + SVELoadBroadcastFn fn, + int divisor) { + VIXL_ASSERT(addr.IsScalarPlusImmediate()); + int64_t imm = addr.GetImmediateOffset(); + if ((imm % divisor == 0) && IsUint6(imm / divisor)) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + } else { + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireX(); + CalculateSVEAddress(scratch, addr, zt); + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, SVEMemOperand(scratch)); + } +} + +void MacroAssembler::SVELoadStoreScalarImmHelper(const CPURegister& rt, + const SVEMemOperand& addr, + SVELoadStoreFn fn) { + VIXL_ASSERT(allow_macro_instructions_); + VIXL_ASSERT(rt.IsZRegister() || rt.IsPRegister()); + + if (addr.IsPlainScalar() || + (addr.IsScalarPlusImmediate() && IsInt9(addr.GetImmediateOffset()) && + addr.IsMulVl())) { + SingleEmissionCheckScope guard(this); + (this->*fn)(rt, addr); + return; + } + + if (addr.IsEquivalentToScalar()) { + SingleEmissionCheckScope guard(this); + (this->*fn)(rt, SVEMemOperand(addr.GetScalarBase())); + return; + } + + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireX(); + CalculateSVEAddress(scratch, addr, rt); + SingleEmissionCheckScope guard(this); + (this->*fn)(rt, SVEMemOperand(scratch)); +} + +template +void MacroAssembler::SVELoadStoreNTBroadcastQOHelper( + const ZRegister& zt, + const Tg& pg, + const SVEMemOperand& addr, + Tf fn, + int imm_bits, + int shift_amount, + SVEOffsetModifier supported_modifier, + int vl_divisor_log2) { + VIXL_ASSERT(allow_macro_instructions_); + int imm_divisor = 1 << shift_amount; + + if (addr.IsPlainScalar() || + (addr.IsScalarPlusImmediate() && + IsIntN(imm_bits, addr.GetImmediateOffset() / imm_divisor) && + ((addr.GetImmediateOffset() % imm_divisor) == 0) && + (addr.GetOffsetModifier() == supported_modifier))) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + + if (addr.IsScalarPlusScalar() && !addr.GetScalarOffset().IsZero() && + addr.IsEquivalentToLSL(zt.GetLaneSizeInBytesLog2())) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + + if (addr.IsEquivalentToScalar()) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, SVEMemOperand(addr.GetScalarBase())); + return; + } + + if (addr.IsMulVl() && (supported_modifier != SVE_MUL_VL) && + (vl_divisor_log2 == -1)) { + // We don't handle [x0, #imm, MUL VL] if the in-memory access size is not VL + // dependent. + VIXL_UNIMPLEMENTED(); + } + + UseScratchRegisterScope temps(this); + Register scratch = temps.AcquireX(); + CalculateSVEAddress(scratch, addr, vl_divisor_log2); + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, SVEMemOperand(scratch)); +} + +template +void MacroAssembler::SVELoadStore1Helper(int msize_in_bytes_log2, + const ZRegister& zt, + const Tg& pg, + const SVEMemOperand& addr, + Tf fn) { + if (addr.IsPlainScalar() || + (addr.IsScalarPlusScalar() && !addr.GetScalarOffset().IsZero() && + addr.IsEquivalentToLSL(msize_in_bytes_log2)) || + (addr.IsScalarPlusImmediate() && IsInt4(addr.GetImmediateOffset()) && + addr.IsMulVl())) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + + if (addr.IsEquivalentToScalar()) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, SVEMemOperand(addr.GetScalarBase())); + return; + } + + if (addr.IsVectorPlusImmediate()) { + uint64_t offset = addr.GetImmediateOffset(); + if (IsMultiple(offset, (1 << msize_in_bytes_log2)) && + IsUint5(offset >> msize_in_bytes_log2)) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + } + + if (addr.IsScalarPlusVector()) { + VIXL_ASSERT(addr.IsScatterGather()); + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + + UseScratchRegisterScope temps(this); + if (addr.IsScatterGather()) { + // In scatter-gather modes, zt and zn/zm have the same lane size. However, + // for 32-bit accesses, the result of each lane's address calculation still + // requires 64 bits; we can't naively use `Adr` for the address calculation + // because it would truncate each address to 32 bits. + + if (addr.IsVectorPlusImmediate()) { + // Synthesise the immediate in an X register, then use a + // scalar-plus-vector access with the original vector. + Register scratch = temps.AcquireX(); + Mov(scratch, addr.GetImmediateOffset()); + SingleEmissionCheckScope guard(this); + SVEOffsetModifier om = + zt.IsLaneSizeS() ? SVE_UXTW : NO_SVE_OFFSET_MODIFIER; + (this->*fn)(zt, pg, SVEMemOperand(scratch, addr.GetVectorBase(), om)); + return; + } + + VIXL_UNIMPLEMENTED(); + } else { + Register scratch = temps.AcquireX(); + // TODO: If we have an immediate offset that is a multiple of + // msize_in_bytes, we can use Rdvl/Rdpl and a scalar-plus-scalar form to + // save an instruction. + int vl_divisor_log2 = zt.GetLaneSizeInBytesLog2() - msize_in_bytes_log2; + CalculateSVEAddress(scratch, addr, vl_divisor_log2); + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, SVEMemOperand(scratch)); + } +} + +template +void MacroAssembler::SVELoadFFHelper(int msize_in_bytes_log2, + const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr, + Tf fn) { + if (addr.IsScatterGather()) { + // Scatter-gather first-fault loads share encodings with normal loads. + SVELoadStore1Helper(msize_in_bytes_log2, zt, pg, addr, fn); + return; + } + + // Contiguous first-faulting loads have no scalar-plus-immediate form at all, + // so we don't do immediate synthesis. + + // We cannot currently distinguish "[x0]" from "[x0, #0]", and this + // is not "scalar-plus-scalar", so we have to permit `IsPlainScalar()` here. + if (addr.IsPlainScalar() || (addr.IsScalarPlusScalar() && + addr.IsEquivalentToLSL(msize_in_bytes_log2))) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zt, pg, addr); + return; + } + + VIXL_UNIMPLEMENTED(); +} + +void MacroAssembler::Ld1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kBRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1b)); +} + +void MacroAssembler::Ld1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kHRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1h)); +} + +void MacroAssembler::Ld1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kWRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1w)); +} + +void MacroAssembler::Ld1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kDRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1d)); +} + +void MacroAssembler::Ld1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kBRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1sb)); +} + +void MacroAssembler::Ld1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kHRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1sh)); +} + +void MacroAssembler::Ld1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kSRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ld1sw)); +} + +void MacroAssembler::St1b(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kBRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::st1b)); +} + +void MacroAssembler::St1h(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kHRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::st1h)); +} + +void MacroAssembler::St1w(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kSRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::st1w)); +} + +void MacroAssembler::St1d(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadStore1Helper(kDRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::st1d)); +} + +void MacroAssembler::Ldff1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kBRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1b)); +} + +void MacroAssembler::Ldff1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kHRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1h)); +} + +void MacroAssembler::Ldff1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kSRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1w)); +} + +void MacroAssembler::Ldff1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kDRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1d)); +} + +void MacroAssembler::Ldff1sb(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kBRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1sb)); +} + +void MacroAssembler::Ldff1sh(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kHRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1sh)); +} + +void MacroAssembler::Ldff1sw(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + SVELoadFFHelper(kSRegSizeInBytesLog2, + zt, + pg, + addr, + static_cast(&Assembler::ldff1sw)); +} + +#define VIXL_SVE_LD1R_LIST(V) \ + V(qb, 4) V(qh, 4) V(qw, 4) V(qd, 4) V(ob, 5) V(oh, 5) V(ow, 5) V(od, 5) + +#define VIXL_DEFINE_MASM_FUNC(SZ, SH) \ + void MacroAssembler::Ld1r##SZ(const ZRegister& zt, \ + const PRegisterZ& pg, \ + const SVEMemOperand& addr) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + SVELoadStoreNTBroadcastQOHelper(zt, \ + pg, \ + addr, \ + &MacroAssembler::ld1r##SZ, \ + 4, \ + SH, \ + NO_SVE_OFFSET_MODIFIER, \ + -1); \ + } + +VIXL_SVE_LD1R_LIST(VIXL_DEFINE_MASM_FUNC) + +#undef VIXL_DEFINE_MASM_FUNC +#undef VIXL_SVE_LD1R_LIST + +void MacroAssembler::Ldnt1b(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + ldnt1b(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::ldnt1b, + 4, + 0, + SVE_MUL_VL); + } +} + +void MacroAssembler::Ldnt1d(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + ldnt1d(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::ldnt1d, + 4, + 0, + SVE_MUL_VL); + } +} + +void MacroAssembler::Ldnt1h(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + ldnt1h(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::ldnt1h, + 4, + 0, + SVE_MUL_VL); + } +} + +void MacroAssembler::Ldnt1w(const ZRegister& zt, + const PRegisterZ& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + ldnt1w(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::ldnt1w, + 4, + 0, + SVE_MUL_VL); + } +} + +void MacroAssembler::Stnt1b(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + stnt1b(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::stnt1b, + 4, + 0, + SVE_MUL_VL); + } +} +void MacroAssembler::Stnt1d(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + stnt1d(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::stnt1d, + 4, + 0, + SVE_MUL_VL); + } +} +void MacroAssembler::Stnt1h(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + stnt1h(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::stnt1h, + 4, + 0, + SVE_MUL_VL); + } +} +void MacroAssembler::Stnt1w(const ZRegister& zt, + const PRegister& pg, + const SVEMemOperand& addr) { + VIXL_ASSERT(allow_macro_instructions_); + if (addr.IsVectorPlusScalar()) { + SingleEmissionCheckScope guard(this); + stnt1w(zt, pg, addr); + } else { + SVELoadStoreNTBroadcastQOHelper(zt, + pg, + addr, + &MacroAssembler::stnt1w, + 4, + 0, + SVE_MUL_VL); + } +} + +void MacroAssembler::SVEDotIndexHelper(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index) { + if (zd.Aliases(za)) { + // zda = zda + (zn . zm) + SingleEmissionCheckScope guard(this); + (this->*fn)(zd, zn, zm, index); + + } else if (zd.Aliases(zn) || zd.Aliases(zm)) { + // zdn = za + (zdn . zm[index]) + // zdm = za + (zn . zdm[index]) + // zdnm = za + (zdnm . zdnm[index]) + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, za); + (this->*fn)(scratch, zn, zm, index); + } + + Mov(zd, scratch); + } else { + // zd = za + (zn . zm) + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, zm, index); + } +} + +void MacroAssembler::FourRegDestructiveHelper(Int3ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm) { + if (!zd.Aliases(za) && (zd.Aliases(zn) || zd.Aliases(zm))) { + // zd = za . zd . zm + // zd = za . zn . zd + // zd = za . zd . zd + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, za); + (this->*fn)(scratch, zn, zm); + } + + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, zm); + } +} + +void MacroAssembler::FourRegDestructiveHelper(Int4ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm) { + if (!zd.Aliases(za) && (zd.Aliases(zn) || zd.Aliases(zm))) { + // zd = za . zd . zm + // zd = za . zn . zd + // zd = za . zd . zd + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, za); + (this->*fn)(scratch, scratch, zn, zm); + } + + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zd, zn, zm); + } +} + +void MacroAssembler::FourRegOneImmDestructiveHelper(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int imm) { + if (!zd.Aliases(za) && (zd.Aliases(zn) || zd.Aliases(zm))) { + // zd = za . zd . zm[i] + // zd = za . zn . zd[i] + // zd = za . zd . zd[i] + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, za); + (this->*fn)(scratch, zn, zm, imm); + } + + Mov(zd, scratch); + } else { + // zd = za . zn . zm[i] + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, zm, imm); + } +} + +void MacroAssembler::AbsoluteDifferenceAccumulate(Int3ArithFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm) { + if (zn.Aliases(zm)) { + // If zn == zm, the difference is zero. + if (!zd.Aliases(za)) { + Mov(zd, za); + } + } else if (zd.Aliases(za)) { + SingleEmissionCheckScope guard(this); + (this->*fn)(zd, zn, zm); + } else if (zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithLaneSize(zn.GetLaneSizeInBits()); + Mov(ztmp, zn); + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, ztmp, zm); + } else if (zd.Aliases(zm)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithLaneSize(zn.GetLaneSizeInBits()); + Mov(ztmp, zm); + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, ztmp); + } else { + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, zm); + } +} + +#define VIXL_SVE_4REG_LIST(V) \ + V(Saba, saba, AbsoluteDifferenceAccumulate) \ + V(Uaba, uaba, AbsoluteDifferenceAccumulate) \ + V(Sabalb, sabalb, AbsoluteDifferenceAccumulate) \ + V(Sabalt, sabalt, AbsoluteDifferenceAccumulate) \ + V(Uabalb, uabalb, AbsoluteDifferenceAccumulate) \ + V(Uabalt, uabalt, AbsoluteDifferenceAccumulate) \ + V(Sdot, sdot, FourRegDestructiveHelper) \ + V(Udot, udot, FourRegDestructiveHelper) \ + V(Adclb, adclb, FourRegDestructiveHelper) \ + V(Adclt, adclt, FourRegDestructiveHelper) \ + V(Sbclb, sbclb, FourRegDestructiveHelper) \ + V(Sbclt, sbclt, FourRegDestructiveHelper) \ + V(Smlalb, smlalb, FourRegDestructiveHelper) \ + V(Smlalt, smlalt, FourRegDestructiveHelper) \ + V(Smlslb, smlslb, FourRegDestructiveHelper) \ + V(Smlslt, smlslt, FourRegDestructiveHelper) \ + V(Umlalb, umlalb, FourRegDestructiveHelper) \ + V(Umlalt, umlalt, FourRegDestructiveHelper) \ + V(Umlslb, umlslb, FourRegDestructiveHelper) \ + V(Umlslt, umlslt, FourRegDestructiveHelper) \ + V(Bcax, bcax, FourRegDestructiveHelper) \ + V(Bsl, bsl, FourRegDestructiveHelper) \ + V(Bsl1n, bsl1n, FourRegDestructiveHelper) \ + V(Bsl2n, bsl2n, FourRegDestructiveHelper) \ + V(Eor3, eor3, FourRegDestructiveHelper) \ + V(Nbsl, nbsl, FourRegDestructiveHelper) \ + V(Fmlalb, fmlalb, FourRegDestructiveHelper) \ + V(Fmlalt, fmlalt, FourRegDestructiveHelper) \ + V(Fmlslb, fmlslb, FourRegDestructiveHelper) \ + V(Fmlslt, fmlslt, FourRegDestructiveHelper) \ + V(Sqdmlalb, sqdmlalb, FourRegDestructiveHelper) \ + V(Sqdmlalbt, sqdmlalbt, FourRegDestructiveHelper) \ + V(Sqdmlalt, sqdmlalt, FourRegDestructiveHelper) \ + V(Sqdmlslb, sqdmlslb, FourRegDestructiveHelper) \ + V(Sqdmlslbt, sqdmlslbt, FourRegDestructiveHelper) \ + V(Sqdmlslt, sqdmlslt, FourRegDestructiveHelper) \ + V(Sqrdmlah, sqrdmlah, FourRegDestructiveHelper) \ + V(Sqrdmlsh, sqrdmlsh, FourRegDestructiveHelper) \ + V(Fmmla, fmmla, FourRegDestructiveHelper) \ + V(Smmla, smmla, FourRegDestructiveHelper) \ + V(Ummla, ummla, FourRegDestructiveHelper) \ + V(Usmmla, usmmla, FourRegDestructiveHelper) \ + V(Usdot, usdot, FourRegDestructiveHelper) + +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN, HELPER) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const ZRegister& za, \ + const ZRegister& zn, \ + const ZRegister& zm) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + HELPER(&Assembler::ASMFN, zd, za, zn, zm); \ + } +VIXL_SVE_4REG_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +#define VIXL_SVE_4REG_1IMM_LIST(V) \ + V(Fmla, fmla, FourRegOneImmDestructiveHelper) \ + V(Fmls, fmls, FourRegOneImmDestructiveHelper) \ + V(Fmlalb, fmlalb, FourRegOneImmDestructiveHelper) \ + V(Fmlalt, fmlalt, FourRegOneImmDestructiveHelper) \ + V(Fmlslb, fmlslb, FourRegOneImmDestructiveHelper) \ + V(Fmlslt, fmlslt, FourRegOneImmDestructiveHelper) \ + V(Mla, mla, FourRegOneImmDestructiveHelper) \ + V(Mls, mls, FourRegOneImmDestructiveHelper) \ + V(Smlalb, smlalb, FourRegOneImmDestructiveHelper) \ + V(Smlalt, smlalt, FourRegOneImmDestructiveHelper) \ + V(Smlslb, smlslb, FourRegOneImmDestructiveHelper) \ + V(Smlslt, smlslt, FourRegOneImmDestructiveHelper) \ + V(Sqdmlalb, sqdmlalb, FourRegOneImmDestructiveHelper) \ + V(Sqdmlalt, sqdmlalt, FourRegOneImmDestructiveHelper) \ + V(Sqdmlslb, sqdmlslb, FourRegOneImmDestructiveHelper) \ + V(Sqdmlslt, sqdmlslt, FourRegOneImmDestructiveHelper) \ + V(Sqrdmlah, sqrdmlah, FourRegOneImmDestructiveHelper) \ + V(Sqrdmlsh, sqrdmlsh, FourRegOneImmDestructiveHelper) \ + V(Umlalb, umlalb, FourRegOneImmDestructiveHelper) \ + V(Umlalt, umlalt, FourRegOneImmDestructiveHelper) \ + V(Umlslb, umlslb, FourRegOneImmDestructiveHelper) \ + V(Umlslt, umlslt, FourRegOneImmDestructiveHelper) + +#define VIXL_DEFINE_MASM_FUNC(MASMFN, ASMFN, HELPER) \ + void MacroAssembler::MASMFN(const ZRegister& zd, \ + const ZRegister& za, \ + const ZRegister& zn, \ + const ZRegister& zm, \ + int imm) { \ + VIXL_ASSERT(allow_macro_instructions_); \ + HELPER(&Assembler::ASMFN, zd, za, zn, zm, imm); \ + } +VIXL_SVE_4REG_1IMM_LIST(VIXL_DEFINE_MASM_FUNC) +#undef VIXL_DEFINE_MASM_FUNC + +void MacroAssembler::Sdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SVEDotIndexHelper(&Assembler::sdot, zd, za, zn, zm, index); +} + +void MacroAssembler::Udot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SVEDotIndexHelper(&Assembler::udot, zd, za, zn, zm, index); +} + +void MacroAssembler::Sudot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SVEDotIndexHelper(&Assembler::sudot, zd, za, zn, zm, index); +} + +void MacroAssembler::Usdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index) { + VIXL_ASSERT(allow_macro_instructions_); + SVEDotIndexHelper(&Assembler::usdot, zd, za, zn, zm, index); +} + +void MacroAssembler::Cdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int index, + int rot) { + // This doesn't handle zm when it's out of the range that can be encoded in + // instruction. The range depends on element size: z0-z7 for B, z0-15 for H. + if ((zd.Aliases(zn) || zd.Aliases(zm)) && !zd.Aliases(za)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, ztmp, za); + cdot(ztmp, zn, zm, index, rot); + } + Mov(zd, ztmp); + } else { + MovprfxHelperScope guard(this, zd, za); + cdot(zd, zn, zm, index, rot); + } +} + +void MacroAssembler::Cdot(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + if ((zd.Aliases(zn) || zd.Aliases(zm)) && !zd.Aliases(za)) { + UseScratchRegisterScope temps(this); + VIXL_ASSERT(AreSameLaneSize(zn, zm)); + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zn); + Mov(ztmp, zd.Aliases(zn) ? zn : zm); + MovprfxHelperScope guard(this, zd, za); + cdot(zd, (zd.Aliases(zn) ? ztmp : zn), (zd.Aliases(zm) ? ztmp : zm), rot); + } else { + MovprfxHelperScope guard(this, zd, za); + cdot(zd, zn, zm, rot); + } +} + +void MacroAssembler::FPMulAddHelper(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + SVEMulAddPredicatedZdaFn fn_zda, + SVEMulAddPredicatedZdnFn fn_zdn, + FPMacroNaNPropagationOption nan_option) { + ResolveFPNaNPropagationOption(&nan_option); + + if (zd.Aliases(za)) { + // zda = (-)zda + ((-)zn * zm) for fmla, fmls, fnmla and fnmls. + SingleEmissionCheckScope guard(this); + (this->*fn_zda)(zd, pg, zn, zm); + } else if (zd.Aliases(zn)) { + // zdn = (-)za + ((-)zdn * zm) for fmad, fmsb, fnmad and fnmsb. + SingleEmissionCheckScope guard(this); + (this->*fn_zdn)(zd, pg, zm, za); + } else if (zd.Aliases(zm)) { + switch (nan_option) { + case FastNaNPropagation: { + // We treat multiplication as commutative in the fast mode, so we can + // swap zn and zm. + // zdm = (-)za + ((-)zdm * zn) for fmad, fmsb, fnmad and fnmsb. + SingleEmissionCheckScope guard(this); + (this->*fn_zdn)(zd, pg, zn, za); + return; + } + case StrictNaNPropagation: { + UseScratchRegisterScope temps(this); + // Use a scratch register to keep the argument order exactly as + // specified. + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zn); + { + MovprfxHelperScope guard(this, scratch, pg, za); + // scratch = (-)za + ((-)zn * zm) + (this->*fn_zda)(scratch, pg, zn, zm); + } + Mov(zd, scratch); + return; + } + case NoFPMacroNaNPropagationSelected: + VIXL_UNREACHABLE(); + return; + } + } else { + // zd = (-)za + ((-)zn * zm) for fmla, fmls, fnmla and fnmls. + MovprfxHelperScope guard(this, zd, pg, za); + (this->*fn_zda)(zd, pg, zn, zm); + } +} + +void MacroAssembler::Fmla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPMulAddHelper(zd, + pg, + za, + zn, + zm, + &Assembler::fmla, + &Assembler::fmad, + nan_option); +} + +void MacroAssembler::Fmls(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPMulAddHelper(zd, + pg, + za, + zn, + zm, + &Assembler::fmls, + &Assembler::fmsb, + nan_option); +} + +void MacroAssembler::Fnmla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPMulAddHelper(zd, + pg, + za, + zn, + zm, + &Assembler::fnmla, + &Assembler::fnmad, + nan_option); +} + +void MacroAssembler::Fnmls(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + FPMacroNaNPropagationOption nan_option) { + VIXL_ASSERT(allow_macro_instructions_); + FPMulAddHelper(zd, + pg, + za, + zn, + zm, + &Assembler::fnmls, + &Assembler::fnmsb, + nan_option); +} + +void MacroAssembler::Ftmad(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int imm3) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(zm) && !zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zm); + Mov(scratch, zm); + MovprfxHelperScope guard(this, zd, zn); + ftmad(zd, zd, scratch, imm3); + } else { + MovprfxHelperScope guard(this, zd, zn); + ftmad(zd, zd, zm, imm3); + } +} + +void MacroAssembler::Fcadd(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(zm) && !zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, pg, zn); + fcadd(scratch, pg, scratch, zm, rot); + } + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, pg, zn); + fcadd(zd, pg, zd, zm, rot); + } +} + +void MacroAssembler::Fcmla(const ZRegister& zd, + const PRegisterM& pg, + const ZRegister& za, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + VIXL_ASSERT(allow_macro_instructions_); + if ((zd.Aliases(zn) || zd.Aliases(zm)) && !zd.Aliases(za)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, ztmp, za); + fcmla(ztmp, pg, zn, zm, rot); + } + Mov(zd, pg, ztmp); + } else { + MovprfxHelperScope guard(this, zd, pg, za); + fcmla(zd, pg, zn, zm, rot); + } +} + +void MacroAssembler::Splice(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + if (CPUHas(CPUFeatures::kSVE2) && AreConsecutive(zn, zm) && !zd.Aliases(zn)) { + SingleEmissionCheckScope guard(this); + splice(zd, pg, zn, zm); + } else if (zd.Aliases(zm) && !zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, zn); + splice(scratch, pg, scratch, zm); + } + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, zn); + splice(zd, pg, zd, zm); + } +} + +void MacroAssembler::Clasta(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(zm) && !zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, zn); + clasta(scratch, pg, scratch, zm); + } + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, zn); + clasta(zd, pg, zd, zm); + } +} + +void MacroAssembler::Clastb(const ZRegister& zd, + const PRegister& pg, + const ZRegister& zn, + const ZRegister& zm) { + VIXL_ASSERT(allow_macro_instructions_); + if (zd.Aliases(zm) && !zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister scratch = temps.AcquireZ().WithSameLaneSizeAs(zd); + { + MovprfxHelperScope guard(this, scratch, zn); + clastb(scratch, pg, scratch, zm); + } + Mov(zd, scratch); + } else { + MovprfxHelperScope guard(this, zd, zn); + clastb(zd, pg, zd, zm); + } +} + +void MacroAssembler::ShiftRightAccumulate(IntArithImmFn fn, + const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift) { + VIXL_ASSERT(allow_macro_instructions_); + if (!zd.Aliases(za) && zd.Aliases(zn)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zn); + Mov(ztmp, zn); + { + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, ztmp, shift); + } + } else { + MovprfxHelperScope guard(this, zd, za); + (this->*fn)(zd, zn, shift); + } +} + +void MacroAssembler::Srsra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift) { + ShiftRightAccumulate(&Assembler::srsra, zd, za, zn, shift); +} + +void MacroAssembler::Ssra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift) { + ShiftRightAccumulate(&Assembler::ssra, zd, za, zn, shift); +} + +void MacroAssembler::Ursra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift) { + ShiftRightAccumulate(&Assembler::ursra, zd, za, zn, shift); +} + +void MacroAssembler::Usra(const ZRegister& zd, + const ZRegister& za, + const ZRegister& zn, + int shift) { + ShiftRightAccumulate(&Assembler::usra, zd, za, zn, shift); +} + +void MacroAssembler::ComplexAddition(ZZZImmFn fn, + const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + VIXL_ASSERT(allow_macro_instructions_); + if (!zd.Aliases(zn) && zd.Aliases(zm)) { + UseScratchRegisterScope temps(this); + ZRegister ztmp = temps.AcquireZ().WithSameLaneSizeAs(zm); + Mov(ztmp, zm); + { + MovprfxHelperScope guard(this, zd, zn); + (this->*fn)(zd, zd, ztmp, rot); + } + } else { + MovprfxHelperScope guard(this, zd, zn); + (this->*fn)(zd, zd, zm, rot); + } +} + +void MacroAssembler::Cadd(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + ComplexAddition(&Assembler::cadd, zd, zn, zm, rot); +} + +void MacroAssembler::Sqcadd(const ZRegister& zd, + const ZRegister& zn, + const ZRegister& zm, + int rot) { + ComplexAddition(&Assembler::sqcadd, zd, zn, zm, rot); +} + +} // namespace aarch64 +} // namespace vixl diff --git a/core/deps/vixl/aarch64/operands-aarch64.cc b/core/deps/vixl/aarch64/operands-aarch64.cc index 20364616a..e01d19074 100644 --- a/core/deps/vixl/aarch64/operands-aarch64.cc +++ b/core/deps/vixl/aarch64/operands-aarch64.cc @@ -30,32 +30,32 @@ namespace vixl { namespace aarch64 { // CPURegList utilities. -CPURegister CPURegList::PopLowestIndex() { - if (IsEmpty()) { - return NoCPUReg; - } - int index = CountTrailingZeros(list_); - VIXL_ASSERT((1 << index) & list_); +CPURegister CPURegList::PopLowestIndex(RegList mask) { + RegList list = list_ & mask; + if (list == 0) return NoCPUReg; + int index = CountTrailingZeros(list); + VIXL_ASSERT(((static_cast(1) << index) & list) != 0); Remove(index); return CPURegister(index, size_, type_); } -CPURegister CPURegList::PopHighestIndex() { - VIXL_ASSERT(IsValid()); - if (IsEmpty()) { - return NoCPUReg; - } - int index = CountLeadingZeros(list_); +CPURegister CPURegList::PopHighestIndex(RegList mask) { + RegList list = list_ & mask; + if (list == 0) return NoCPUReg; + int index = CountLeadingZeros(list); index = kRegListSizeInBits - 1 - index; - VIXL_ASSERT((1 << index) & list_); + VIXL_ASSERT(((static_cast(1) << index) & list) != 0); Remove(index); return CPURegister(index, size_, type_); } bool CPURegList::IsValid() const { - if ((type_ == CPURegister::kRegister) || (type_ == CPURegister::kVRegister)) { + if (type_ == CPURegister::kNoRegister) { + // We can't use IsEmpty here because that asserts IsValid(). + return list_ == 0; + } else { bool is_valid = true; // Try to create a CPURegister for each element in the list. for (int i = 0; i < kRegListSizeInBits; i++) { @@ -64,11 +64,6 @@ bool CPURegList::IsValid() const { } } return is_valid; - } else if (type_ == CPURegister::kNoRegister) { - // We can't use IsEmpty here because that asserts IsValid(). - return list_ == 0; - } else { - return false; } } @@ -149,145 +144,6 @@ const CPURegList kCalleeSavedV = CPURegList::GetCalleeSavedV(); const CPURegList kCallerSaved = CPURegList::GetCallerSaved(); const CPURegList kCallerSavedV = CPURegList::GetCallerSavedV(); - -// Registers. -#define WREG(n) w##n, -const Register Register::wregisters[] = {AARCH64_REGISTER_CODE_LIST(WREG)}; -#undef WREG - -#define XREG(n) x##n, -const Register Register::xregisters[] = {AARCH64_REGISTER_CODE_LIST(XREG)}; -#undef XREG - -#define BREG(n) b##n, -const VRegister VRegister::bregisters[] = {AARCH64_REGISTER_CODE_LIST(BREG)}; -#undef BREG - -#define HREG(n) h##n, -const VRegister VRegister::hregisters[] = {AARCH64_REGISTER_CODE_LIST(HREG)}; -#undef HREG - -#define SREG(n) s##n, -const VRegister VRegister::sregisters[] = {AARCH64_REGISTER_CODE_LIST(SREG)}; -#undef SREG - -#define DREG(n) d##n, -const VRegister VRegister::dregisters[] = {AARCH64_REGISTER_CODE_LIST(DREG)}; -#undef DREG - -#define QREG(n) q##n, -const VRegister VRegister::qregisters[] = {AARCH64_REGISTER_CODE_LIST(QREG)}; -#undef QREG - -#define VREG(n) v##n, -const VRegister VRegister::vregisters[] = {AARCH64_REGISTER_CODE_LIST(VREG)}; -#undef VREG - - -const Register& Register::GetWRegFromCode(unsigned code) { - if (code == kSPRegInternalCode) { - return wsp; - } else { - VIXL_ASSERT(code < kNumberOfRegisters); - return wregisters[code]; - } -} - - -const Register& Register::GetXRegFromCode(unsigned code) { - if (code == kSPRegInternalCode) { - return sp; - } else { - VIXL_ASSERT(code < kNumberOfRegisters); - return xregisters[code]; - } -} - - -const VRegister& VRegister::GetBRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return bregisters[code]; -} - - -const VRegister& VRegister::GetHRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return hregisters[code]; -} - - -const VRegister& VRegister::GetSRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return sregisters[code]; -} - - -const VRegister& VRegister::GetDRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return dregisters[code]; -} - - -const VRegister& VRegister::GetQRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return qregisters[code]; -} - - -const VRegister& VRegister::GetVRegFromCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfVRegisters); - return vregisters[code]; -} - - -const Register& CPURegister::W() const { - VIXL_ASSERT(IsValidRegister()); - return Register::GetWRegFromCode(code_); -} - - -const Register& CPURegister::X() const { - VIXL_ASSERT(IsValidRegister()); - return Register::GetXRegFromCode(code_); -} - - -const VRegister& CPURegister::B() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetBRegFromCode(code_); -} - - -const VRegister& CPURegister::H() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetHRegFromCode(code_); -} - - -const VRegister& CPURegister::S() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetSRegFromCode(code_); -} - - -const VRegister& CPURegister::D() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetDRegFromCode(code_); -} - - -const VRegister& CPURegister::Q() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetQRegFromCode(code_); -} - - -const VRegister& CPURegister::V() const { - VIXL_ASSERT(IsValidVRegister()); - return VRegister::GetVRegFromCode(code_); -} - - // Operand. Operand::Operand(int64_t immediate) : immediate_(immediate), @@ -296,6 +152,12 @@ Operand::Operand(int64_t immediate) extend_(NO_EXTEND), shift_amount_(0) {} +Operand::Operand(IntegerOperand immediate) + : immediate_(immediate.AsIntN(64)), + reg_(NoReg), + shift_(NO_SHIFT), + extend_(NO_EXTEND), + shift_amount_(0) {} Operand::Operand(Register reg, Shift shift, unsigned shift_amount) : reg_(reg), @@ -471,6 +333,24 @@ MemOperand::MemOperand(Register base, const Operand& offset, AddrMode addrmode) } +bool MemOperand::IsPlainRegister() const { + return IsImmediateOffset() && (GetOffset() == 0); +} + + +bool MemOperand::IsEquivalentToPlainRegister() const { + if (regoffset_.Is(NoReg)) { + // Immediate offset, pre-index or post-index. + return GetOffset() == 0; + } else if (GetRegisterOffset().IsZero()) { + // Zero register offset, pre-index or post-index. + // We can ignore shift and extend options because they all result in zero. + return true; + } + return false; +} + + bool MemOperand::IsImmediateOffset() const { return (addrmode_ == Offset) && regoffset_.Is(NoReg); } @@ -480,12 +360,16 @@ bool MemOperand::IsRegisterOffset() const { return (addrmode_ == Offset) && !regoffset_.Is(NoReg); } - bool MemOperand::IsPreIndex() const { return addrmode_ == PreIndex; } - - bool MemOperand::IsPostIndex() const { return addrmode_ == PostIndex; } +bool MemOperand::IsImmediatePreIndex() const { + return IsPreIndex() && regoffset_.Is(NoReg); +} + +bool MemOperand::IsImmediatePostIndex() const { + return IsPostIndex() && regoffset_.Is(NoReg); +} void MemOperand::AddOffset(int64_t offset) { VIXL_ASSERT(IsImmediateOffset()); @@ -493,6 +377,63 @@ void MemOperand::AddOffset(int64_t offset) { } +bool SVEMemOperand::IsValid() const { +#ifdef VIXL_DEBUG + { + // It should not be possible for an SVEMemOperand to match multiple types. + int count = 0; + if (IsScalarPlusImmediate()) count++; + if (IsScalarPlusScalar()) count++; + if (IsScalarPlusVector()) count++; + if (IsVectorPlusImmediate()) count++; + if (IsVectorPlusScalar()) count++; + if (IsVectorPlusVector()) count++; + VIXL_ASSERT(count <= 1); + } +#endif + + // We can't have a register _and_ an immediate offset. + if ((offset_ != 0) && (!regoffset_.IsNone())) return false; + + if (shift_amount_ != 0) { + // Only shift and extend modifiers can take a shift amount. + switch (mod_) { + case NO_SVE_OFFSET_MODIFIER: + case SVE_MUL_VL: + return false; + case SVE_LSL: + case SVE_UXTW: + case SVE_SXTW: + // Fall through. + break; + } + } + + return IsScalarPlusImmediate() || IsScalarPlusScalar() || + IsScalarPlusVector() || IsVectorPlusImmediate() || + IsVectorPlusScalar() || IsVectorPlusVector(); +} + + +bool SVEMemOperand::IsEquivalentToScalar() const { + if (IsScalarPlusImmediate()) { + return GetImmediateOffset() == 0; + } + if (IsScalarPlusScalar()) { + // We can ignore the shift because it will still result in zero. + return GetScalarOffset().IsZero(); + } + // Forms involving vectors are never equivalent to a single scalar. + return false; +} + +bool SVEMemOperand::IsPlainRegister() const { + if (IsScalarPlusImmediate()) { + return GetImmediateOffset() == 0; + } + return false; +} + GenericOperand::GenericOperand(const CPURegister& reg) : cpu_register_(reg), mem_op_size_(0) { if (reg.IsQ()) { diff --git a/core/deps/vixl/aarch64/operands-aarch64.h b/core/deps/vixl/aarch64/operands-aarch64.h index e3dbfa3ec..ba3df1813 100644 --- a/core/deps/vixl/aarch64/operands-aarch64.h +++ b/core/deps/vixl/aarch64/operands-aarch64.h @@ -27,525 +27,15 @@ #ifndef VIXL_AARCH64_OPERANDS_AARCH64_H_ #define VIXL_AARCH64_OPERANDS_AARCH64_H_ +#include +#include + #include "instructions-aarch64.h" +#include "registers-aarch64.h" namespace vixl { namespace aarch64 { -typedef uint64_t RegList; -static const int kRegListSizeInBits = sizeof(RegList) * 8; - - -// Registers. - -// Some CPURegister methods can return Register or VRegister types, so we need -// to declare them in advance. -class Register; -class VRegister; - -class CPURegister { - public: - enum RegisterType { - // The kInvalid value is used to detect uninitialized static instances, - // which are always zero-initialized before any constructors are called. - kInvalid = 0, - kRegister, - kVRegister, - kFPRegister = kVRegister, - kNoRegister - }; - - CPURegister() : code_(0), size_(0), type_(kNoRegister) { - VIXL_ASSERT(!IsValid()); - VIXL_ASSERT(IsNone()); - } - - CPURegister(unsigned code, unsigned size, RegisterType type) - : code_(code), size_(size), type_(type) { - VIXL_ASSERT(IsValidOrNone()); - } - - unsigned GetCode() const { - VIXL_ASSERT(IsValid()); - return code_; - } - VIXL_DEPRECATED("GetCode", unsigned code() const) { return GetCode(); } - - RegisterType GetType() const { - VIXL_ASSERT(IsValidOrNone()); - return type_; - } - VIXL_DEPRECATED("GetType", RegisterType type() const) { return GetType(); } - - RegList GetBit() const { - VIXL_ASSERT(code_ < (sizeof(RegList) * 8)); - return IsValid() ? (static_cast(1) << code_) : 0; - } - VIXL_DEPRECATED("GetBit", RegList Bit() const) { return GetBit(); } - - int GetSizeInBytes() const { - VIXL_ASSERT(IsValid()); - VIXL_ASSERT(size_ % 8 == 0); - return size_ / 8; - } - VIXL_DEPRECATED("GetSizeInBytes", int SizeInBytes() const) { - return GetSizeInBytes(); - } - - int GetSizeInBits() const { - VIXL_ASSERT(IsValid()); - return size_; - } - VIXL_DEPRECATED("GetSizeInBits", unsigned size() const) { - return GetSizeInBits(); - } - VIXL_DEPRECATED("GetSizeInBits", int SizeInBits() const) { - return GetSizeInBits(); - } - - bool Is8Bits() const { - VIXL_ASSERT(IsValid()); - return size_ == 8; - } - - bool Is16Bits() const { - VIXL_ASSERT(IsValid()); - return size_ == 16; - } - - bool Is32Bits() const { - VIXL_ASSERT(IsValid()); - return size_ == 32; - } - - bool Is64Bits() const { - VIXL_ASSERT(IsValid()); - return size_ == 64; - } - - bool Is128Bits() const { - VIXL_ASSERT(IsValid()); - return size_ == 128; - } - - bool IsValid() const { - if (IsValidRegister() || IsValidVRegister()) { - VIXL_ASSERT(!IsNone()); - return true; - } else { - // This assert is hit when the register has not been properly initialized. - // One cause for this can be an initialisation order fiasco. See - // https://isocpp.org/wiki/faq/ctors#static-init-order for some details. - VIXL_ASSERT(IsNone()); - return false; - } - } - - bool IsValidRegister() const { - return IsRegister() && ((size_ == kWRegSize) || (size_ == kXRegSize)) && - ((code_ < kNumberOfRegisters) || (code_ == kSPRegInternalCode)); - } - - bool IsValidVRegister() const { - return IsVRegister() && ((size_ == kBRegSize) || (size_ == kHRegSize) || - (size_ == kSRegSize) || (size_ == kDRegSize) || - (size_ == kQRegSize)) && - (code_ < kNumberOfVRegisters); - } - - bool IsValidFPRegister() const { - return IsFPRegister() && (code_ < kNumberOfVRegisters); - } - - bool IsNone() const { - // kNoRegister types should always have size 0 and code 0. - VIXL_ASSERT((type_ != kNoRegister) || (code_ == 0)); - VIXL_ASSERT((type_ != kNoRegister) || (size_ == 0)); - - return type_ == kNoRegister; - } - - bool Aliases(const CPURegister& other) const { - VIXL_ASSERT(IsValidOrNone() && other.IsValidOrNone()); - return (code_ == other.code_) && (type_ == other.type_); - } - - bool Is(const CPURegister& other) const { - VIXL_ASSERT(IsValidOrNone() && other.IsValidOrNone()); - return Aliases(other) && (size_ == other.size_); - } - - bool IsZero() const { - VIXL_ASSERT(IsValid()); - return IsRegister() && (code_ == kZeroRegCode); - } - - bool IsSP() const { - VIXL_ASSERT(IsValid()); - return IsRegister() && (code_ == kSPRegInternalCode); - } - - bool IsRegister() const { return type_ == kRegister; } - - bool IsVRegister() const { return type_ == kVRegister; } - - bool IsFPRegister() const { return IsS() || IsD(); } - - bool IsW() const { return IsValidRegister() && Is32Bits(); } - bool IsX() const { return IsValidRegister() && Is64Bits(); } - - // These assertions ensure that the size and type of the register are as - // described. They do not consider the number of lanes that make up a vector. - // So, for example, Is8B() implies IsD(), and Is1D() implies IsD, but IsD() - // does not imply Is1D() or Is8B(). - // Check the number of lanes, ie. the format of the vector, using methods such - // as Is8B(), Is1D(), etc. in the VRegister class. - bool IsV() const { return IsVRegister(); } - bool IsB() const { return IsV() && Is8Bits(); } - bool IsH() const { return IsV() && Is16Bits(); } - bool IsS() const { return IsV() && Is32Bits(); } - bool IsD() const { return IsV() && Is64Bits(); } - bool IsQ() const { return IsV() && Is128Bits(); } - - // Semantic type for sdot and udot instructions. - bool IsS4B() const { return IsS(); } - const VRegister& S4B() const { return S(); } - - const Register& W() const; - const Register& X() const; - const VRegister& V() const; - const VRegister& B() const; - const VRegister& H() const; - const VRegister& S() const; - const VRegister& D() const; - const VRegister& Q() const; - - bool IsSameType(const CPURegister& other) const { - return type_ == other.type_; - } - - bool IsSameSizeAndType(const CPURegister& other) const { - return (size_ == other.size_) && IsSameType(other); - } - - protected: - unsigned code_; - int size_; - RegisterType type_; - - private: - bool IsValidOrNone() const { return IsValid() || IsNone(); } -}; - - -class Register : public CPURegister { - public: - Register() : CPURegister() {} - explicit Register(const CPURegister& other) - : CPURegister(other.GetCode(), other.GetSizeInBits(), other.GetType()) { - VIXL_ASSERT(IsValidRegister()); - } - Register(unsigned code, unsigned size) : CPURegister(code, size, kRegister) {} - - bool IsValid() const { - VIXL_ASSERT(IsRegister() || IsNone()); - return IsValidRegister(); - } - - static const Register& GetWRegFromCode(unsigned code); - VIXL_DEPRECATED("GetWRegFromCode", - static const Register& WRegFromCode(unsigned code)) { - return GetWRegFromCode(code); - } - - static const Register& GetXRegFromCode(unsigned code); - VIXL_DEPRECATED("GetXRegFromCode", - static const Register& XRegFromCode(unsigned code)) { - return GetXRegFromCode(code); - } - - private: - static const Register wregisters[]; - static const Register xregisters[]; -}; - - -namespace internal { - -template -class FixedSizeRegister : public Register { - public: - FixedSizeRegister() : Register() {} - explicit FixedSizeRegister(unsigned code) : Register(code, size_in_bits) { - VIXL_ASSERT(IsValidRegister()); - } - explicit FixedSizeRegister(const Register& other) - : Register(other.GetCode(), size_in_bits) { - VIXL_ASSERT(other.GetSizeInBits() == size_in_bits); - VIXL_ASSERT(IsValidRegister()); - } - explicit FixedSizeRegister(const CPURegister& other) - : Register(other.GetCode(), other.GetSizeInBits()) { - VIXL_ASSERT(other.GetType() == kRegister); - VIXL_ASSERT(other.GetSizeInBits() == size_in_bits); - VIXL_ASSERT(IsValidRegister()); - } - - bool IsValid() const { - return Register::IsValid() && (GetSizeInBits() == size_in_bits); - } -}; - -} // namespace internal - -typedef internal::FixedSizeRegister XRegister; -typedef internal::FixedSizeRegister WRegister; - - -class VRegister : public CPURegister { - public: - VRegister() : CPURegister(), lanes_(1) {} - explicit VRegister(const CPURegister& other) - : CPURegister(other.GetCode(), other.GetSizeInBits(), other.GetType()), - lanes_(1) { - VIXL_ASSERT(IsValidVRegister()); - VIXL_ASSERT(IsPowerOf2(lanes_) && (lanes_ <= 16)); - } - VRegister(unsigned code, unsigned size, unsigned lanes = 1) - : CPURegister(code, size, kVRegister), lanes_(lanes) { - VIXL_ASSERT(IsPowerOf2(lanes_) && (lanes_ <= 16)); - } - VRegister(unsigned code, VectorFormat format) - : CPURegister(code, RegisterSizeInBitsFromFormat(format), kVRegister), - lanes_(IsVectorFormat(format) ? LaneCountFromFormat(format) : 1) { - VIXL_ASSERT(IsPowerOf2(lanes_) && (lanes_ <= 16)); - } - - bool IsValid() const { - VIXL_ASSERT(IsVRegister() || IsNone()); - return IsValidVRegister(); - } - - static const VRegister& GetBRegFromCode(unsigned code); - VIXL_DEPRECATED("GetBRegFromCode", - static const VRegister& BRegFromCode(unsigned code)) { - return GetBRegFromCode(code); - } - - static const VRegister& GetHRegFromCode(unsigned code); - VIXL_DEPRECATED("GetHRegFromCode", - static const VRegister& HRegFromCode(unsigned code)) { - return GetHRegFromCode(code); - } - - static const VRegister& GetSRegFromCode(unsigned code); - VIXL_DEPRECATED("GetSRegFromCode", - static const VRegister& SRegFromCode(unsigned code)) { - return GetSRegFromCode(code); - } - - static const VRegister& GetDRegFromCode(unsigned code); - VIXL_DEPRECATED("GetDRegFromCode", - static const VRegister& DRegFromCode(unsigned code)) { - return GetDRegFromCode(code); - } - - static const VRegister& GetQRegFromCode(unsigned code); - VIXL_DEPRECATED("GetQRegFromCode", - static const VRegister& QRegFromCode(unsigned code)) { - return GetQRegFromCode(code); - } - - static const VRegister& GetVRegFromCode(unsigned code); - VIXL_DEPRECATED("GetVRegFromCode", - static const VRegister& VRegFromCode(unsigned code)) { - return GetVRegFromCode(code); - } - - VRegister V8B() const { return VRegister(code_, kDRegSize, 8); } - VRegister V16B() const { return VRegister(code_, kQRegSize, 16); } - VRegister V2H() const { return VRegister(code_, kSRegSize, 2); } - VRegister V4H() const { return VRegister(code_, kDRegSize, 4); } - VRegister V8H() const { return VRegister(code_, kQRegSize, 8); } - VRegister V2S() const { return VRegister(code_, kDRegSize, 2); } - VRegister V4S() const { return VRegister(code_, kQRegSize, 4); } - VRegister V2D() const { return VRegister(code_, kQRegSize, 2); } - VRegister V1D() const { return VRegister(code_, kDRegSize, 1); } - - bool Is8B() const { return (Is64Bits() && (lanes_ == 8)); } - bool Is16B() const { return (Is128Bits() && (lanes_ == 16)); } - bool Is2H() const { return (Is32Bits() && (lanes_ == 2)); } - bool Is4H() const { return (Is64Bits() && (lanes_ == 4)); } - bool Is8H() const { return (Is128Bits() && (lanes_ == 8)); } - bool Is2S() const { return (Is64Bits() && (lanes_ == 2)); } - bool Is4S() const { return (Is128Bits() && (lanes_ == 4)); } - bool Is1D() const { return (Is64Bits() && (lanes_ == 1)); } - bool Is2D() const { return (Is128Bits() && (lanes_ == 2)); } - - // For consistency, we assert the number of lanes of these scalar registers, - // even though there are no vectors of equivalent total size with which they - // could alias. - bool Is1B() const { - VIXL_ASSERT(!(Is8Bits() && IsVector())); - return Is8Bits(); - } - bool Is1H() const { - VIXL_ASSERT(!(Is16Bits() && IsVector())); - return Is16Bits(); - } - bool Is1S() const { - VIXL_ASSERT(!(Is32Bits() && IsVector())); - return Is32Bits(); - } - - // Semantic type for sdot and udot instructions. - bool Is1S4B() const { return Is1S(); } - - - bool IsLaneSizeB() const { return GetLaneSizeInBits() == kBRegSize; } - bool IsLaneSizeH() const { return GetLaneSizeInBits() == kHRegSize; } - bool IsLaneSizeS() const { return GetLaneSizeInBits() == kSRegSize; } - bool IsLaneSizeD() const { return GetLaneSizeInBits() == kDRegSize; } - - int GetLanes() const { return lanes_; } - VIXL_DEPRECATED("GetLanes", int lanes() const) { return GetLanes(); } - - bool IsScalar() const { return lanes_ == 1; } - - bool IsVector() const { return lanes_ > 1; } - - bool IsSameFormat(const VRegister& other) const { - return (size_ == other.size_) && (lanes_ == other.lanes_); - } - - unsigned GetLaneSizeInBytes() const { return GetSizeInBytes() / lanes_; } - VIXL_DEPRECATED("GetLaneSizeInBytes", unsigned LaneSizeInBytes() const) { - return GetLaneSizeInBytes(); - } - - unsigned GetLaneSizeInBits() const { return GetLaneSizeInBytes() * 8; } - VIXL_DEPRECATED("GetLaneSizeInBits", unsigned LaneSizeInBits() const) { - return GetLaneSizeInBits(); - } - - private: - static const VRegister bregisters[]; - static const VRegister hregisters[]; - static const VRegister sregisters[]; - static const VRegister dregisters[]; - static const VRegister qregisters[]; - static const VRegister vregisters[]; - int lanes_; -}; - - -// Backward compatibility for FPRegisters. -typedef VRegister FPRegister; - -// No*Reg is used to indicate an unused argument, or an error case. Note that -// these all compare equal (using the Is() method). The Register and VRegister -// variants are provided for convenience. -const Register NoReg; -const VRegister NoVReg; -const FPRegister NoFPReg; // For backward compatibility. -const CPURegister NoCPUReg; - - -#define DEFINE_REGISTERS(N) \ - const WRegister w##N(N); \ - const XRegister x##N(N); -AARCH64_REGISTER_CODE_LIST(DEFINE_REGISTERS) -#undef DEFINE_REGISTERS -const WRegister wsp(kSPRegInternalCode); -const XRegister sp(kSPRegInternalCode); - - -#define DEFINE_VREGISTERS(N) \ - const VRegister b##N(N, kBRegSize); \ - const VRegister h##N(N, kHRegSize); \ - const VRegister s##N(N, kSRegSize); \ - const VRegister d##N(N, kDRegSize); \ - const VRegister q##N(N, kQRegSize); \ - const VRegister v##N(N, kQRegSize); -AARCH64_REGISTER_CODE_LIST(DEFINE_VREGISTERS) -#undef DEFINE_VREGISTERS - - -// Register aliases. -const XRegister ip0 = x16; -const XRegister ip1 = x17; -const XRegister lr = x30; -const XRegister xzr = x31; -const WRegister wzr = w31; - - -// AreAliased returns true if any of the named registers overlap. Arguments -// set to NoReg are ignored. The system stack pointer may be specified. -bool AreAliased(const CPURegister& reg1, - const CPURegister& reg2, - const CPURegister& reg3 = NoReg, - const CPURegister& reg4 = NoReg, - const CPURegister& reg5 = NoReg, - const CPURegister& reg6 = NoReg, - const CPURegister& reg7 = NoReg, - const CPURegister& reg8 = NoReg); - - -// AreSameSizeAndType returns true if all of the specified registers have the -// same size, and are of the same type. The system stack pointer may be -// specified. Arguments set to NoReg are ignored, as are any subsequent -// arguments. At least one argument (reg1) must be valid (not NoCPUReg). -bool AreSameSizeAndType(const CPURegister& reg1, - const CPURegister& reg2, - const CPURegister& reg3 = NoCPUReg, - const CPURegister& reg4 = NoCPUReg, - const CPURegister& reg5 = NoCPUReg, - const CPURegister& reg6 = NoCPUReg, - const CPURegister& reg7 = NoCPUReg, - const CPURegister& reg8 = NoCPUReg); - -// AreEven returns true if all of the specified registers have even register -// indices. Arguments set to NoReg are ignored, as are any subsequent -// arguments. At least one argument (reg1) must be valid (not NoCPUReg). -bool AreEven(const CPURegister& reg1, - const CPURegister& reg2, - const CPURegister& reg3 = NoReg, - const CPURegister& reg4 = NoReg, - const CPURegister& reg5 = NoReg, - const CPURegister& reg6 = NoReg, - const CPURegister& reg7 = NoReg, - const CPURegister& reg8 = NoReg); - - -// AreConsecutive returns true if all of the specified registers are -// consecutive in the register file. Arguments set to NoReg are ignored, as are -// any subsequent arguments. At least one argument (reg1) must be valid -// (not NoCPUReg). -bool AreConsecutive(const CPURegister& reg1, - const CPURegister& reg2, - const CPURegister& reg3 = NoCPUReg, - const CPURegister& reg4 = NoCPUReg); - - -// AreSameFormat returns true if all of the specified VRegisters have the same -// vector format. Arguments set to NoReg are ignored, as are any subsequent -// arguments. At least one argument (reg1) must be valid (not NoVReg). -bool AreSameFormat(const VRegister& reg1, - const VRegister& reg2, - const VRegister& reg3 = NoVReg, - const VRegister& reg4 = NoVReg); - - -// AreConsecutive returns true if all of the specified VRegisters are -// consecutive in the register file. Arguments set to NoReg are ignored, as are -// any subsequent arguments. At least one argument (reg1) must be valid -// (not NoVReg). -bool AreConsecutive(const VRegister& reg1, - const VRegister& reg2, - const VRegister& reg3 = NoVReg, - const VRegister& reg4 = NoVReg); - - // Lists of registers. class CPURegList { public: @@ -580,6 +70,28 @@ class CPURegList { VIXL_ASSERT(IsValid()); } + // Construct an empty CPURegList with the specified size and type. If `size` + // is CPURegister::kUnknownSize and the register type requires a size, a valid + // but unspecified default will be picked. + static CPURegList Empty(CPURegister::RegisterType type, + unsigned size = CPURegister::kUnknownSize) { + return CPURegList(type, GetDefaultSizeFor(type, size), 0); + } + + // Construct a CPURegList with all possible registers with the specified size + // and type. If `size` is CPURegister::kUnknownSize and the register type + // requires a size, a valid but unspecified default will be picked. + static CPURegList All(CPURegister::RegisterType type, + unsigned size = CPURegister::kUnknownSize) { + unsigned number_of_registers = (CPURegister::GetMaxCodeFor(type) + 1); + RegList list = (static_cast(1) << number_of_registers) - 1; + if (type == CPURegister::kRegister) { + // GetMaxCodeFor(kRegister) ignores SP, so explicitly include it. + list |= (static_cast(1) << kSPRegInternalCode); + } + return CPURegList(type, GetDefaultSizeFor(type, size), list); + } + CPURegister::RegisterType GetType() const { VIXL_ASSERT(IsValid()); return type_; @@ -588,6 +100,10 @@ class CPURegList { return GetType(); } + CPURegister::RegisterBank GetBank() const { + return CPURegister::GetBankFor(GetType()); + } + // Combine another CPURegList into this one. Registers that already exist in // this list are left unchanged. The type and size of the registers in the // 'other' list must match those in this list. @@ -684,8 +200,11 @@ class CPURegList { // preparing registers for an AAPCS64 function call, for example. void RemoveCalleeSaved(); - CPURegister PopLowestIndex(); - CPURegister PopHighestIndex(); + // Find the register in this list that appears in `mask` with the lowest or + // highest code, remove it from the list and return it as a CPURegister. If + // the list is empty, leave it unchanged and return NoCPUReg. + CPURegister PopLowestIndex(RegList mask = ~static_cast(0)); + CPURegister PopHighestIndex(RegList mask = ~static_cast(0)); // AAPCS64 callee-saved registers. static CPURegList GetCalleeSaved(unsigned size = kXRegSize); @@ -704,12 +223,12 @@ class CPURegList { bool IncludesAliasOf(const CPURegister& other) const { VIXL_ASSERT(IsValid()); - return (type_ == other.GetType()) && ((other.GetBit() & list_) != 0); + return (GetBank() == other.GetBank()) && IncludesAliasOf(other.GetCode()); } bool IncludesAliasOf(int code) const { VIXL_ASSERT(IsValid()); - return ((code & list_) != 0); + return (((static_cast(1) << code) & list_) != 0); } int GetCount() const { @@ -744,6 +263,21 @@ class CPURegList { } private: + // If `size` is CPURegister::kUnknownSize and the type requires a known size, + // then return an arbitrary-but-valid size. + // + // Otherwise, the size is checked for validity and returned unchanged. + static unsigned GetDefaultSizeFor(CPURegister::RegisterType type, + unsigned size) { + if (size == CPURegister::kUnknownSize) { + if (type == CPURegister::kRegister) size = kXRegSize; + if (type == CPURegister::kVRegister) size = kQRegSize; + // All other types require kUnknownSize. + } + VIXL_ASSERT(CPURegister(0, size, type).IsValid()); + return size; + } + RegList list_; int size_; CPURegister::RegisterType type_; @@ -761,6 +295,7 @@ extern const CPURegList kCalleeSavedV; extern const CPURegList kCallerSaved; extern const CPURegList kCallerSavedV; +class IntegerOperand; // Operand. class Operand { @@ -769,7 +304,9 @@ class Operand { // where is int64_t. // This is allowed to be an implicit constructor because Operand is // a wrapper class that doesn't normally perform any type conversion. - Operand(int64_t immediate = 0); // NOLINT(runtime/explicit) + Operand(int64_t immediate); // NOLINT(runtime/explicit) + + Operand(IntegerOperand immediate); // NOLINT(runtime/explicit) // rm, { #} // where is one of {LSL, LSR, ASR, ROR}. @@ -844,6 +381,8 @@ class Operand { // MemOperand represents the addressing mode of a load or store instruction. +// In assembly syntax, MemOperands are normally denoted by one or more elements +// inside or around square brackets. class MemOperand { public: // Creates an invalid `MemOperand`. @@ -862,38 +401,47 @@ class MemOperand { MemOperand(Register base, const Operand& offset, AddrMode addrmode = Offset); const Register& GetBaseRegister() const { return base_; } - VIXL_DEPRECATED("GetBaseRegister", const Register& base() const) { - return GetBaseRegister(); - } + // If the MemOperand has a register offset, return it. (This also applies to + // pre- and post-index modes.) Otherwise, return NoReg. const Register& GetRegisterOffset() const { return regoffset_; } - VIXL_DEPRECATED("GetRegisterOffset", const Register& regoffset() const) { - return GetRegisterOffset(); - } + // If the MemOperand has an immediate offset, return it. (This also applies to + // pre- and post-index modes.) Otherwise, return 0. int64_t GetOffset() const { return offset_; } - VIXL_DEPRECATED("GetOffset", int64_t offset() const) { return GetOffset(); } AddrMode GetAddrMode() const { return addrmode_; } - VIXL_DEPRECATED("GetAddrMode", AddrMode addrmode() const) { - return GetAddrMode(); - } - Shift GetShift() const { return shift_; } - VIXL_DEPRECATED("GetShift", Shift shift() const) { return GetShift(); } - Extend GetExtend() const { return extend_; } - VIXL_DEPRECATED("GetExtend", Extend extend() const) { return GetExtend(); } - unsigned GetShiftAmount() const { return shift_amount_; } - VIXL_DEPRECATED("GetShiftAmount", unsigned shift_amount() const) { - return GetShiftAmount(); + unsigned GetShiftAmount() const { + // Extend modes can also encode a shift for some instructions. + VIXL_ASSERT((GetShift() != NO_SHIFT) || (GetExtend() != NO_EXTEND)); + return shift_amount_; } + // True for MemOperands which represent something like [x0]. + // Currently, this will also return true for [x0, #0], because MemOperand has + // no way to distinguish the two. + bool IsPlainRegister() const; + + // True for MemOperands which represent something like [x0], or for compound + // MemOperands which are functionally equivalent, such as [x0, #0], [x0, xzr] + // or [x0, wzr, UXTW #3]. + bool IsEquivalentToPlainRegister() const; + + // True for immediate-offset (but not indexed) MemOperands. bool IsImmediateOffset() const; + // True for register-offset (but not indexed) MemOperands. bool IsRegisterOffset() const; + // True for immediate or register pre-indexed MemOperands. bool IsPreIndex() const; + // True for immediate or register post-indexed MemOperands. bool IsPostIndex() const; + // True for immediate pre-indexed MemOperands, [reg, #imm]! + bool IsImmediatePreIndex() const; + // True for immediate post-indexed MemOperands, [reg], #imm + bool IsImmediatePostIndex() const; void AddOffset(int64_t offset); @@ -922,6 +470,464 @@ class MemOperand { unsigned shift_amount_; }; +// SVE supports memory operands which don't make sense to the core ISA, such as +// scatter-gather forms, in which either the base or offset registers are +// vectors. This class exists to avoid complicating core-ISA code with +// SVE-specific behaviour. +// +// Note that SVE does not support any pre- or post-index modes. +class SVEMemOperand { + public: + // "vector-plus-immediate", like [z0.s, #21] + explicit SVEMemOperand(ZRegister base, uint64_t offset = 0) + : base_(base), + regoffset_(NoReg), + offset_(RawbitsToInt64(offset)), + mod_(NO_SVE_OFFSET_MODIFIER), + shift_amount_(0) { + VIXL_ASSERT(IsVectorPlusImmediate()); + VIXL_ASSERT(IsValid()); + } + + // "scalar-plus-immediate", like [x0], [x0, #42] or [x0, #42, MUL_VL] + // The only supported modifiers are NO_SVE_OFFSET_MODIFIER or SVE_MUL_VL. + // + // Note that VIXL cannot currently distinguish between `SVEMemOperand(x0)` and + // `SVEMemOperand(x0, 0)`. This is only significant in scalar-plus-scalar + // instructions where xm defaults to xzr. However, users should not rely on + // `SVEMemOperand(x0, 0)` being accepted in such cases. + explicit SVEMemOperand(Register base, + uint64_t offset = 0, + SVEOffsetModifier mod = NO_SVE_OFFSET_MODIFIER) + : base_(base), + regoffset_(NoReg), + offset_(RawbitsToInt64(offset)), + mod_(mod), + shift_amount_(0) { + VIXL_ASSERT(IsScalarPlusImmediate()); + VIXL_ASSERT(IsValid()); + } + + // "scalar-plus-scalar", like [x0, x1] + // "scalar-plus-vector", like [x0, z1.d] + SVEMemOperand(Register base, CPURegister offset) + : base_(base), + regoffset_(offset), + offset_(0), + mod_(NO_SVE_OFFSET_MODIFIER), + shift_amount_(0) { + VIXL_ASSERT(IsScalarPlusScalar() || IsScalarPlusVector()); + if (offset.IsZero()) VIXL_ASSERT(IsEquivalentToScalar()); + VIXL_ASSERT(IsValid()); + } + + // "scalar-plus-vector", like [x0, z1.d, UXTW] + // The type of `mod` can be any `SVEOffsetModifier` (other than LSL), or a + // corresponding `Extend` value. + template + SVEMemOperand(Register base, ZRegister offset, M mod) + : base_(base), + regoffset_(offset), + offset_(0), + mod_(GetSVEOffsetModifierFor(mod)), + shift_amount_(0) { + VIXL_ASSERT(mod_ != SVE_LSL); // LSL requires an explicit shift amount. + VIXL_ASSERT(IsScalarPlusVector()); + VIXL_ASSERT(IsValid()); + } + + // "scalar-plus-scalar", like [x0, x1, LSL #1] + // "scalar-plus-vector", like [x0, z1.d, LSL #2] + // The type of `mod` can be any `SVEOffsetModifier`, or a corresponding + // `Shift` or `Extend` value. + template + SVEMemOperand(Register base, CPURegister offset, M mod, unsigned shift_amount) + : base_(base), + regoffset_(offset), + offset_(0), + mod_(GetSVEOffsetModifierFor(mod)), + shift_amount_(shift_amount) { + VIXL_ASSERT(IsValid()); + } + + // "vector-plus-scalar", like [z0.d, x0] + SVEMemOperand(ZRegister base, Register offset) + : base_(base), + regoffset_(offset), + offset_(0), + mod_(NO_SVE_OFFSET_MODIFIER), + shift_amount_(0) { + VIXL_ASSERT(IsValid()); + VIXL_ASSERT(IsVectorPlusScalar()); + } + + // "vector-plus-vector", like [z0.d, z1.d, UXTW] + template + SVEMemOperand(ZRegister base, + ZRegister offset, + M mod = NO_SVE_OFFSET_MODIFIER, + unsigned shift_amount = 0) + : base_(base), + regoffset_(offset), + offset_(0), + mod_(GetSVEOffsetModifierFor(mod)), + shift_amount_(shift_amount) { + VIXL_ASSERT(IsValid()); + VIXL_ASSERT(IsVectorPlusVector()); + } + + // True for SVEMemOperands which represent something like [x0]. + // This will also return true for [x0, #0], because there is no way + // to distinguish the two. + bool IsPlainScalar() const { + return IsScalarPlusImmediate() && (offset_ == 0); + } + + // True for SVEMemOperands which represent something like [x0], or for + // compound SVEMemOperands which are functionally equivalent, such as + // [x0, #0], [x0, xzr] or [x0, wzr, UXTW #3]. + bool IsEquivalentToScalar() const; + + // True for SVEMemOperands like [x0], [x0, #0], false for [x0, xzr] and + // similar. + bool IsPlainRegister() const; + + bool IsScalarPlusImmediate() const { + return base_.IsX() && regoffset_.IsNone() && + ((mod_ == NO_SVE_OFFSET_MODIFIER) || IsMulVl()); + } + + bool IsScalarPlusScalar() const { + // SVE offers no extend modes for scalar-plus-scalar, so both registers must + // be X registers. + return base_.IsX() && regoffset_.IsX() && + ((mod_ == NO_SVE_OFFSET_MODIFIER) || (mod_ == SVE_LSL)); + } + + bool IsScalarPlusVector() const { + // The modifier can be LSL or an an extend mode (UXTW or SXTW) here. Unlike + // in the core ISA, these extend modes do not imply an S-sized lane, so the + // modifier is independent from the lane size. The architecture describes + // [US]XTW with a D-sized lane as an "unpacked" offset. + return base_.IsX() && regoffset_.IsZRegister() && + (regoffset_.IsLaneSizeS() || regoffset_.IsLaneSizeD()) && !IsMulVl(); + } + + bool IsVectorPlusImmediate() const { + return base_.IsZRegister() && + (base_.IsLaneSizeS() || base_.IsLaneSizeD()) && + regoffset_.IsNone() && (mod_ == NO_SVE_OFFSET_MODIFIER); + } + + bool IsVectorPlusScalar() const { + return base_.IsZRegister() && regoffset_.IsX() && + (base_.IsLaneSizeS() || base_.IsLaneSizeD()); + } + + bool IsVectorPlusVector() const { + return base_.IsZRegister() && regoffset_.IsZRegister() && (offset_ == 0) && + AreSameFormat(base_, regoffset_) && + (base_.IsLaneSizeS() || base_.IsLaneSizeD()); + } + + bool IsContiguous() const { return !IsScatterGather(); } + bool IsScatterGather() const { + return base_.IsZRegister() || regoffset_.IsZRegister(); + } + + // TODO: If necessary, add helpers like `HasScalarBase()`. + + Register GetScalarBase() const { + VIXL_ASSERT(base_.IsX()); + return Register(base_); + } + + ZRegister GetVectorBase() const { + VIXL_ASSERT(base_.IsZRegister()); + VIXL_ASSERT(base_.HasLaneSize()); + return ZRegister(base_); + } + + Register GetScalarOffset() const { + VIXL_ASSERT(regoffset_.IsRegister()); + return Register(regoffset_); + } + + ZRegister GetVectorOffset() const { + VIXL_ASSERT(regoffset_.IsZRegister()); + VIXL_ASSERT(regoffset_.HasLaneSize()); + return ZRegister(regoffset_); + } + + int64_t GetImmediateOffset() const { + VIXL_ASSERT(regoffset_.IsNone()); + return offset_; + } + + SVEOffsetModifier GetOffsetModifier() const { return mod_; } + unsigned GetShiftAmount() const { return shift_amount_; } + + bool IsEquivalentToLSL(unsigned amount) const { + if (shift_amount_ != amount) return false; + if (amount == 0) { + // No-shift is equivalent to "LSL #0". + return ((mod_ == SVE_LSL) || (mod_ == NO_SVE_OFFSET_MODIFIER)); + } + return mod_ == SVE_LSL; + } + + bool IsMulVl() const { return mod_ == SVE_MUL_VL; } + + bool IsValid() const; + + private: + // Allow standard `Shift` and `Extend` arguments to be used. + SVEOffsetModifier GetSVEOffsetModifierFor(Shift shift) { + if (shift == LSL) return SVE_LSL; + if (shift == NO_SHIFT) return NO_SVE_OFFSET_MODIFIER; + // SVE does not accept any other shift. + VIXL_UNIMPLEMENTED(); + return NO_SVE_OFFSET_MODIFIER; + } + + SVEOffsetModifier GetSVEOffsetModifierFor(Extend extend = NO_EXTEND) { + if (extend == UXTW) return SVE_UXTW; + if (extend == SXTW) return SVE_SXTW; + if (extend == NO_EXTEND) return NO_SVE_OFFSET_MODIFIER; + // SVE does not accept any other extend mode. + VIXL_UNIMPLEMENTED(); + return NO_SVE_OFFSET_MODIFIER; + } + + SVEOffsetModifier GetSVEOffsetModifierFor(SVEOffsetModifier mod) { + return mod; + } + + CPURegister base_; + CPURegister regoffset_; + int64_t offset_; + SVEOffsetModifier mod_; + unsigned shift_amount_; +}; + +// Represent a signed or unsigned integer operand. +// +// This is designed to make instructions which naturally accept a _signed_ +// immediate easier to implement and use, when we also want users to be able to +// specify raw-bits values (such as with hexadecimal constants). The advantage +// of this class over a simple uint64_t (with implicit C++ sign-extension) is +// that this class can strictly check the range of allowed values. With a simple +// uint64_t, it is impossible to distinguish -1 from UINT64_MAX. +// +// For example, these instructions are equivalent: +// +// __ Insr(z0.VnB(), -1); +// __ Insr(z0.VnB(), 0xff); +// +// ... as are these: +// +// __ Insr(z0.VnD(), -1); +// __ Insr(z0.VnD(), 0xffffffffffffffff); +// +// ... but this is invalid: +// +// __ Insr(z0.VnB(), 0xffffffffffffffff); // Too big for B-sized lanes. +class IntegerOperand { + public: +#define VIXL_INT_TYPES(V) \ + V(char) V(short) V(int) V(long) V(long long) // NOLINT(runtime/int) +#define VIXL_DECL_INT_OVERLOADS(T) \ + /* These are allowed to be implicit constructors because this is a */ \ + /* wrapper class that doesn't normally perform any type conversion. */ \ + IntegerOperand(signed T immediate) /* NOLINT(runtime/explicit) */ \ + : raw_bits_(immediate), /* Allow implicit sign-extension. */ \ + is_negative_(immediate < 0) {} \ + IntegerOperand(unsigned T immediate) /* NOLINT(runtime/explicit) */ \ + : raw_bits_(immediate), is_negative_(false) {} + VIXL_INT_TYPES(VIXL_DECL_INT_OVERLOADS) +#undef VIXL_DECL_INT_OVERLOADS +#undef VIXL_INT_TYPES + + // TODO: `Operand` can currently only hold an int64_t, so some large, unsigned + // values will be misrepresented here. + explicit IntegerOperand(const Operand& operand) + : raw_bits_(operand.GetEquivalentImmediate()), + is_negative_(operand.GetEquivalentImmediate() < 0) {} + + bool IsIntN(unsigned n) const { + return is_negative_ ? vixl::IsIntN(n, RawbitsToInt64(raw_bits_)) + : vixl::IsIntN(n, raw_bits_); + } + bool IsUintN(unsigned n) const { + return !is_negative_ && vixl::IsUintN(n, raw_bits_); + } + + bool IsUint8() const { return IsUintN(8); } + bool IsUint16() const { return IsUintN(16); } + bool IsUint32() const { return IsUintN(32); } + bool IsUint64() const { return IsUintN(64); } + + bool IsInt8() const { return IsIntN(8); } + bool IsInt16() const { return IsIntN(16); } + bool IsInt32() const { return IsIntN(32); } + bool IsInt64() const { return IsIntN(64); } + + bool FitsInBits(unsigned n) const { + return is_negative_ ? IsIntN(n) : IsUintN(n); + } + bool FitsInLane(const CPURegister& zd) const { + return FitsInBits(zd.GetLaneSizeInBits()); + } + bool FitsInSignedLane(const CPURegister& zd) const { + return IsIntN(zd.GetLaneSizeInBits()); + } + bool FitsInUnsignedLane(const CPURegister& zd) const { + return IsUintN(zd.GetLaneSizeInBits()); + } + + // Cast a value in the range [INT_MIN, UINT_MAX] to an unsigned integer + // in the range [0, UINT_MAX] (using two's complement mapping). + uint64_t AsUintN(unsigned n) const { + VIXL_ASSERT(FitsInBits(n)); + return raw_bits_ & GetUintMask(n); + } + + uint8_t AsUint8() const { return static_cast(AsUintN(8)); } + uint16_t AsUint16() const { return static_cast(AsUintN(16)); } + uint32_t AsUint32() const { return static_cast(AsUintN(32)); } + uint64_t AsUint64() const { return AsUintN(64); } + + // Cast a value in the range [INT_MIN, UINT_MAX] to a signed integer in + // the range [INT_MIN, INT_MAX] (using two's complement mapping). + int64_t AsIntN(unsigned n) const { + VIXL_ASSERT(FitsInBits(n)); + return ExtractSignedBitfield64(n - 1, 0, raw_bits_); + } + + int8_t AsInt8() const { return static_cast(AsIntN(8)); } + int16_t AsInt16() const { return static_cast(AsIntN(16)); } + int32_t AsInt32() const { return static_cast(AsIntN(32)); } + int64_t AsInt64() const { return AsIntN(64); } + + // Several instructions encode a signed int_t, which is then (optionally) + // left-shifted and sign-extended to a Z register lane with a size which may + // be larger than N. This helper tries to find an int_t such that the + // IntegerOperand's arithmetic value is reproduced in each lane. + // + // This is the mechanism that allows `Insr(z0.VnB(), 0xff)` to be treated as + // `Insr(z0.VnB(), -1)`. + template + bool TryEncodeAsShiftedIntNForLane(const CPURegister& zd, T* imm) const { + VIXL_STATIC_ASSERT(std::numeric_limits::digits > N); + VIXL_ASSERT(FitsInLane(zd)); + if ((raw_bits_ & GetUintMask(kShift)) != 0) return false; + + // Reverse the specified left-shift. + IntegerOperand unshifted(*this); + unshifted.ArithmeticShiftRight(kShift); + + if (unshifted.IsIntN(N)) { + // This is trivial, since sign-extension produces the same arithmetic + // value irrespective of the destination size. + *imm = static_cast(unshifted.AsIntN(N)); + return true; + } + + // Otherwise, we might be able to use the sign-extension to produce the + // desired bit pattern. We can only do this for values in the range + // [INT_MAX + 1, UINT_MAX], where the highest set bit is the sign bit. + // + // The lane size has to be adjusted to compensate for `kShift`, since the + // high bits will be dropped when the encoded value is left-shifted. + if (unshifted.IsUintN(zd.GetLaneSizeInBits() - kShift)) { + int64_t encoded = unshifted.AsIntN(zd.GetLaneSizeInBits() - kShift); + if (vixl::IsIntN(N, encoded)) { + *imm = static_cast(encoded); + return true; + } + } + return false; + } + + // As above, but `kShift` is written to the `*shift` parameter on success, so + // that it is easy to chain calls like this: + // + // if (imm.TryEncodeAsShiftedIntNForLane<8, 0>(zd, &imm8, &shift) || + // imm.TryEncodeAsShiftedIntNForLane<8, 8>(zd, &imm8, &shift)) { + // insn(zd, imm8, shift) + // } + template + bool TryEncodeAsShiftedIntNForLane(const CPURegister& zd, + T* imm, + S* shift) const { + if (TryEncodeAsShiftedIntNForLane(zd, imm)) { + *shift = kShift; + return true; + } + return false; + } + + // As above, but assume that `kShift` is 0. + template + bool TryEncodeAsIntNForLane(const CPURegister& zd, T* imm) const { + return TryEncodeAsShiftedIntNForLane(zd, imm); + } + + // As above, but for unsigned fields. This is usually a simple operation, but + // is provided for symmetry. + template + bool TryEncodeAsShiftedUintNForLane(const CPURegister& zd, T* imm) const { + VIXL_STATIC_ASSERT(std::numeric_limits::digits > N); + VIXL_ASSERT(FitsInLane(zd)); + + // TODO: Should we convert -1 to 0xff here? + if (is_negative_) return false; + USE(zd); + + if ((raw_bits_ & GetUintMask(kShift)) != 0) return false; + + if (vixl::IsUintN(N, raw_bits_ >> kShift)) { + *imm = static_cast(raw_bits_ >> kShift); + return true; + } + return false; + } + + template + bool TryEncodeAsShiftedUintNForLane(const CPURegister& zd, + T* imm, + S* shift) const { + if (TryEncodeAsShiftedUintNForLane(zd, imm)) { + *shift = kShift; + return true; + } + return false; + } + + bool IsZero() const { return raw_bits_ == 0; } + bool IsNegative() const { return is_negative_; } + bool IsPositiveOrZero() const { return !is_negative_; } + + uint64_t GetMagnitude() const { + return is_negative_ ? UnsignedNegate(raw_bits_) : raw_bits_; + } + + private: + // Shift the arithmetic value right, with sign extension if is_negative_. + void ArithmeticShiftRight(int shift) { + VIXL_ASSERT((shift >= 0) && (shift < 64)); + if (shift == 0) return; + if (is_negative_) { + raw_bits_ = ExtractSignedBitfield64(63, shift, raw_bits_); + } else { + raw_bits_ >>= shift; + } + } + + uint64_t raw_bits_; + bool is_negative_; +}; + // This an abstraction that can represent a register or memory location. The // `MacroAssembler` provides helpers to move data between generic operands. class GenericOperand { diff --git a/core/deps/vixl/aarch64/registers-aarch64.cc b/core/deps/vixl/aarch64/registers-aarch64.cc new file mode 100644 index 000000000..90201a603 --- /dev/null +++ b/core/deps/vixl/aarch64/registers-aarch64.cc @@ -0,0 +1,321 @@ +// Copyright 2019, VIXL authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of ARM Limited nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include + +#include "registers-aarch64.h" + +namespace vixl { +namespace aarch64 { + +std::string CPURegister::GetArchitecturalName() const { + std::ostringstream name; + if (IsZRegister()) { + name << 'z' << GetCode(); + if (HasLaneSize()) { + name << '.' << GetLaneSizeSymbol(); + } + } else if (IsPRegister()) { + name << 'p' << GetCode(); + if (HasLaneSize()) { + name << '.' << GetLaneSizeSymbol(); + } + switch (qualifiers_) { + case kNoQualifiers: + break; + case kMerging: + name << "/m"; + break; + case kZeroing: + name << "/z"; + break; + } + } else { + VIXL_UNIMPLEMENTED(); + } + return name.str(); +} + +unsigned CPURegister::GetMaxCodeFor(CPURegister::RegisterBank bank) { + switch (bank) { + case kNoRegisterBank: + return 0; + case kRRegisterBank: + return Register::GetMaxCode(); + case kVRegisterBank: +#ifdef VIXL_HAS_CONSTEXPR + VIXL_STATIC_ASSERT(VRegister::GetMaxCode() == ZRegister::GetMaxCode()); +#else + VIXL_ASSERT(VRegister::GetMaxCode() == ZRegister::GetMaxCode()); +#endif + return VRegister::GetMaxCode(); + case kPRegisterBank: + return PRegister::GetMaxCode(); + } + VIXL_UNREACHABLE(); + return 0; +} + +bool CPURegister::IsValidRegister() const { + return ((code_ < kNumberOfRegisters) || (code_ == kSPRegInternalCode)) && + (bank_ == kRRegisterBank) && + ((size_ == kEncodedWRegSize) || (size_ == kEncodedXRegSize)) && + (qualifiers_ == kNoQualifiers) && (lane_size_ == size_); +} + +bool CPURegister::IsValidVRegister() const { + VIXL_STATIC_ASSERT(kEncodedBRegSize < kEncodedQRegSize); + return (code_ < kNumberOfVRegisters) && (bank_ == kVRegisterBank) && + ((size_ >= kEncodedBRegSize) && (size_ <= kEncodedQRegSize)) && + (qualifiers_ == kNoQualifiers) && + (lane_size_ != kEncodedUnknownSize) && (lane_size_ <= size_); +} + +bool CPURegister::IsValidFPRegister() const { + return IsValidVRegister() && IsFPRegister(); +} + +bool CPURegister::IsValidZRegister() const { + VIXL_STATIC_ASSERT(kEncodedBRegSize < kEncodedQRegSize); + // Z registers are valid with or without a lane size, so we don't need to + // check lane_size_. + return (code_ < kNumberOfZRegisters) && (bank_ == kVRegisterBank) && + (size_ == kEncodedUnknownSize) && (qualifiers_ == kNoQualifiers); +} + +bool CPURegister::IsValidPRegister() const { + VIXL_STATIC_ASSERT(kEncodedBRegSize < kEncodedQRegSize); + // P registers are valid with or without a lane size, so we don't need to + // check lane_size_. + return (code_ < kNumberOfPRegisters) && (bank_ == kPRegisterBank) && + (size_ == kEncodedUnknownSize) && + ((qualifiers_ == kNoQualifiers) || (qualifiers_ == kMerging) || + (qualifiers_ == kZeroing)); +} + +bool CPURegister::IsValid() const { + return IsValidRegister() || IsValidVRegister() || IsValidZRegister() || + IsValidPRegister(); +} + +// Most coercions simply invoke the necessary constructor. +#define VIXL_CPUREG_COERCION_LIST(U) \ + U(Register, W, R) \ + U(Register, X, R) \ + U(VRegister, B, V) \ + U(VRegister, H, V) \ + U(VRegister, S, V) \ + U(VRegister, D, V) \ + U(VRegister, Q, V) \ + U(VRegister, V, V) \ + U(ZRegister, Z, V) \ + U(PRegister, P, P) +#define VIXL_DEFINE_CPUREG_COERCION(RET_TYPE, CTOR_TYPE, BANK) \ + RET_TYPE CPURegister::CTOR_TYPE() const { \ + VIXL_ASSERT(GetBank() == k##BANK##RegisterBank); \ + return CTOR_TYPE##Register(GetCode()); \ + } +VIXL_CPUREG_COERCION_LIST(VIXL_DEFINE_CPUREG_COERCION) +#undef VIXL_CPUREG_COERCION_LIST +#undef VIXL_DEFINE_CPUREG_COERCION + +// NEON lane-format coercions always return VRegisters. +#define VIXL_CPUREG_NEON_COERCION_LIST(V) \ + V(8, B) \ + V(16, B) \ + V(2, H) \ + V(4, H) \ + V(8, H) \ + V(2, S) \ + V(4, S) \ + V(1, D) \ + V(2, D) +#define VIXL_DEFINE_CPUREG_NEON_COERCION(LANES, LANE_TYPE) \ + VRegister VRegister::V##LANES##LANE_TYPE() const { \ + VIXL_ASSERT(IsVRegister()); \ + return VRegister(GetCode(), LANES * k##LANE_TYPE##RegSize, LANES); \ + } +VIXL_CPUREG_NEON_COERCION_LIST(VIXL_DEFINE_CPUREG_NEON_COERCION) +#undef VIXL_CPUREG_NEON_COERCION_LIST +#undef VIXL_DEFINE_CPUREG_NEON_COERCION + +// Semantic type coercion for sdot and udot. +// TODO: Use the qualifiers_ field to distinguish this from ::S(). +VRegister VRegister::S4B() const { + VIXL_ASSERT(IsVRegister()); + return SRegister(GetCode()); +} + +bool AreAliased(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4, + const CPURegister& reg5, + const CPURegister& reg6, + const CPURegister& reg7, + const CPURegister& reg8) { + int number_of_valid_regs = 0; + int number_of_valid_vregs = 0; + int number_of_valid_pregs = 0; + + RegList unique_regs = 0; + RegList unique_vregs = 0; + RegList unique_pregs = 0; + + const CPURegister regs[] = {reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8}; + + for (size_t i = 0; i < ArrayLength(regs); i++) { + switch (regs[i].GetBank()) { + case CPURegister::kRRegisterBank: + number_of_valid_regs++; + unique_regs |= regs[i].GetBit(); + break; + case CPURegister::kVRegisterBank: + number_of_valid_vregs++; + unique_vregs |= regs[i].GetBit(); + break; + case CPURegister::kPRegisterBank: + number_of_valid_pregs++; + unique_pregs |= regs[i].GetBit(); + break; + case CPURegister::kNoRegisterBank: + VIXL_ASSERT(regs[i].IsNone()); + break; + } + } + + int number_of_unique_regs = CountSetBits(unique_regs); + int number_of_unique_vregs = CountSetBits(unique_vregs); + int number_of_unique_pregs = CountSetBits(unique_pregs); + + VIXL_ASSERT(number_of_valid_regs >= number_of_unique_regs); + VIXL_ASSERT(number_of_valid_vregs >= number_of_unique_vregs); + VIXL_ASSERT(number_of_valid_pregs >= number_of_unique_pregs); + + return (number_of_valid_regs != number_of_unique_regs) || + (number_of_valid_vregs != number_of_unique_vregs) || + (number_of_valid_pregs != number_of_unique_pregs); +} + +bool AreSameSizeAndType(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4, + const CPURegister& reg5, + const CPURegister& reg6, + const CPURegister& reg7, + const CPURegister& reg8) { + VIXL_ASSERT(reg1.IsValid()); + bool match = true; + match &= !reg2.IsValid() || reg2.IsSameSizeAndType(reg1); + match &= !reg3.IsValid() || reg3.IsSameSizeAndType(reg1); + match &= !reg4.IsValid() || reg4.IsSameSizeAndType(reg1); + match &= !reg5.IsValid() || reg5.IsSameSizeAndType(reg1); + match &= !reg6.IsValid() || reg6.IsSameSizeAndType(reg1); + match &= !reg7.IsValid() || reg7.IsSameSizeAndType(reg1); + match &= !reg8.IsValid() || reg8.IsSameSizeAndType(reg1); + return match; +} + +bool AreEven(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4, + const CPURegister& reg5, + const CPURegister& reg6, + const CPURegister& reg7, + const CPURegister& reg8) { + VIXL_ASSERT(reg1.IsValid()); + bool even = (reg1.GetCode() % 2) == 0; + even &= !reg2.IsValid() || ((reg2.GetCode() % 2) == 0); + even &= !reg3.IsValid() || ((reg3.GetCode() % 2) == 0); + even &= !reg4.IsValid() || ((reg4.GetCode() % 2) == 0); + even &= !reg5.IsValid() || ((reg5.GetCode() % 2) == 0); + even &= !reg6.IsValid() || ((reg6.GetCode() % 2) == 0); + even &= !reg7.IsValid() || ((reg7.GetCode() % 2) == 0); + even &= !reg8.IsValid() || ((reg8.GetCode() % 2) == 0); + return even; +} + +bool AreConsecutive(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4) { + VIXL_ASSERT(reg1.IsValid()); + + if (!reg2.IsValid()) { + return true; + } else if (reg2.GetCode() != + ((reg1.GetCode() + 1) % (reg1.GetMaxCode() + 1))) { + return false; + } + + if (!reg3.IsValid()) { + return true; + } else if (reg3.GetCode() != + ((reg2.GetCode() + 1) % (reg1.GetMaxCode() + 1))) { + return false; + } + + if (!reg4.IsValid()) { + return true; + } else if (reg4.GetCode() != + ((reg3.GetCode() + 1) % (reg1.GetMaxCode() + 1))) { + return false; + } + + return true; +} + +bool AreSameFormat(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4) { + VIXL_ASSERT(reg1.IsValid()); + bool match = true; + match &= !reg2.IsValid() || reg2.IsSameFormat(reg1); + match &= !reg3.IsValid() || reg3.IsSameFormat(reg1); + match &= !reg4.IsValid() || reg4.IsSameFormat(reg1); + return match; +} + +bool AreSameLaneSize(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3, + const CPURegister& reg4) { + VIXL_ASSERT(reg1.IsValid()); + bool match = true; + match &= + !reg2.IsValid() || (reg2.GetLaneSizeInBits() == reg1.GetLaneSizeInBits()); + match &= + !reg3.IsValid() || (reg3.GetLaneSizeInBits() == reg1.GetLaneSizeInBits()); + match &= + !reg4.IsValid() || (reg4.GetLaneSizeInBits() == reg1.GetLaneSizeInBits()); + return match; +} +} +} // namespace vixl::aarch64 diff --git a/core/deps/vixl/aarch64/registers-aarch64.h b/core/deps/vixl/aarch64/registers-aarch64.h new file mode 100644 index 000000000..f9a6d897f --- /dev/null +++ b/core/deps/vixl/aarch64/registers-aarch64.h @@ -0,0 +1,901 @@ +// Copyright 2019, VIXL authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of ARM Limited nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef VIXL_AARCH64_REGISTERS_AARCH64_H_ +#define VIXL_AARCH64_REGISTERS_AARCH64_H_ + +#include + +#include "instructions-aarch64.h" + +namespace vixl { +namespace aarch64 { + +// An integer type capable of representing a homogeneous, non-overlapping set of +// registers as a bitmask of their codes. +typedef uint64_t RegList; +static const int kRegListSizeInBits = sizeof(RegList) * 8; + +class Register; +class WRegister; +class XRegister; + +class VRegister; +class BRegister; +class HRegister; +class SRegister; +class DRegister; +class QRegister; + +class ZRegister; + +class PRegister; +class PRegisterWithLaneSize; +class PRegisterM; +class PRegisterZ; + +// A container for any single register supported by the processor. Selected +// qualifications are also supported. Basic registers can be constructed +// directly as CPURegister objects. Other variants should be constructed as one +// of the derived classes. +// +// CPURegister aims to support any getter that would also be available to more +// specialised register types. However, using the equivalent functions on the +// specialised register types can avoid run-time checks, and should therefore be +// preferred where run-time polymorphism isn't required. +// +// Type-specific modifiers are typically implemented only on the derived +// classes. +// +// The encoding is such that CPURegister objects are cheap to pass by value. +class CPURegister { + public: + enum RegisterBank : uint8_t { + kNoRegisterBank = 0, + kRRegisterBank, + kVRegisterBank, + kPRegisterBank + }; + enum RegisterType { + kNoRegister, + kRegister, + kVRegister, + kZRegister, + kPRegister + }; + + static const unsigned kUnknownSize = 0; + + VIXL_CONSTEXPR CPURegister() + : code_(0), + bank_(kNoRegisterBank), + size_(kEncodedUnknownSize), + qualifiers_(kNoQualifiers), + lane_size_(kEncodedUnknownSize) {} + + CPURegister(int code, int size_in_bits, RegisterType type) + : code_(code), + bank_(GetBankFor(type)), + size_(EncodeSizeInBits(size_in_bits)), + qualifiers_(kNoQualifiers), + lane_size_(EncodeSizeInBits(size_in_bits)) { + VIXL_ASSERT(IsValid()); + } + + // Basic accessors. + + // TODO: Make this return 'int'. + unsigned GetCode() const { return code_; } + + RegisterBank GetBank() const { return bank_; } + + // For scalar registers, the lane size matches the register size, and is + // always known. + bool HasSize() const { return size_ != kEncodedUnknownSize; } + bool HasLaneSize() const { return lane_size_ != kEncodedUnknownSize; } + + RegList GetBit() const { + if (IsNone()) return 0; + VIXL_ASSERT(code_ < kRegListSizeInBits); + return static_cast(1) << code_; + } + + // Return the architectural name for this register. + // TODO: This is temporary. Ultimately, we should move the + // Simulator::*RegNameForCode helpers out of the simulator, and provide an + // independent way to obtain the name of a register. + std::string GetArchitecturalName() const; + + // Return the highest valid register code for this type, to allow generic + // loops to be written. This excludes kSPRegInternalCode, since it is not + // contiguous, and sp usually requires special handling anyway. + unsigned GetMaxCode() const { return GetMaxCodeFor(GetBank()); } + + // Registers without a known size report kUnknownSize. + int GetSizeInBits() const { return DecodeSizeInBits(size_); } + int GetSizeInBytes() const { return DecodeSizeInBytes(size_); } + // TODO: Make these return 'int'. + unsigned GetLaneSizeInBits() const { return DecodeSizeInBits(lane_size_); } + unsigned GetLaneSizeInBytes() const { return DecodeSizeInBytes(lane_size_); } + unsigned GetLaneSizeInBytesLog2() const { + VIXL_ASSERT(HasLaneSize()); + return DecodeSizeInBytesLog2(lane_size_); + } + + int GetLanes() const { + if (HasSize() && HasLaneSize()) { + // Take advantage of the size encoding to calculate this efficiently. + VIXL_STATIC_ASSERT(kEncodedHRegSize == (kEncodedBRegSize + 1)); + VIXL_STATIC_ASSERT(kEncodedSRegSize == (kEncodedHRegSize + 1)); + VIXL_STATIC_ASSERT(kEncodedDRegSize == (kEncodedSRegSize + 1)); + VIXL_STATIC_ASSERT(kEncodedQRegSize == (kEncodedDRegSize + 1)); + int log2_delta = static_cast(size_) - static_cast(lane_size_); + VIXL_ASSERT(log2_delta >= 0); + return 1 << log2_delta; + } + return kUnknownSize; + } + + bool Is8Bits() const { return size_ == kEncodedBRegSize; } + bool Is16Bits() const { return size_ == kEncodedHRegSize; } + bool Is32Bits() const { return size_ == kEncodedSRegSize; } + bool Is64Bits() const { return size_ == kEncodedDRegSize; } + bool Is128Bits() const { return size_ == kEncodedQRegSize; } + + bool IsLaneSizeB() const { return lane_size_ == kEncodedBRegSize; } + bool IsLaneSizeH() const { return lane_size_ == kEncodedHRegSize; } + bool IsLaneSizeS() const { return lane_size_ == kEncodedSRegSize; } + bool IsLaneSizeD() const { return lane_size_ == kEncodedDRegSize; } + bool IsLaneSizeQ() const { return lane_size_ == kEncodedQRegSize; } + + // If IsRegister(), then it is valid to convert the CPURegister to some + // Register type. + // + // If... ... then it is safe to construct ... + // r.IsRegister() -> Register(r) + // r.IsVRegister() -> VRegister(r) + // r.IsZRegister() -> ZRegister(r) + // r.IsPRegister() -> PRegister(r) + // + // r.IsPRegister() && HasLaneSize() -> PRegisterWithLaneSize(r) + // r.IsPRegister() && IsMerging() -> PRegisterM(r) + // r.IsPRegister() && IsZeroing() -> PRegisterZ(r) + bool IsRegister() const { return GetType() == kRegister; } + bool IsVRegister() const { return GetType() == kVRegister; } + bool IsZRegister() const { return GetType() == kZRegister; } + bool IsPRegister() const { return GetType() == kPRegister; } + + bool IsNone() const { return GetType() == kNoRegister; } + + // `GetType() == kNoRegister` implies IsNone(), and vice-versa. + // `GetType() == kRegister` implies IsRegister(), and vice-versa. + RegisterType GetType() const { + switch (bank_) { + case kNoRegisterBank: + return kNoRegister; + case kRRegisterBank: + return kRegister; + case kVRegisterBank: + return HasSize() ? kVRegister : kZRegister; + case kPRegisterBank: + return kPRegister; + } + VIXL_UNREACHABLE(); + return kNoRegister; + } + + // IsFPRegister() is true for scalar FP types (and therefore implies + // IsVRegister()). There is no corresponding FPRegister type. + bool IsFPRegister() const { return Is1H() || Is1S() || Is1D(); } + + // TODO: These are stricter forms of the helpers above. We should make the + // basic helpers strict, and remove these. + bool IsValidRegister() const; + bool IsValidVRegister() const; + bool IsValidFPRegister() const; + bool IsValidZRegister() const; + bool IsValidPRegister() const; + + bool IsValid() const; + bool IsValidOrNone() const { return IsNone() || IsValid(); } + + bool IsVector() const { return HasLaneSize() && (size_ != lane_size_); } + bool IsScalar() const { return HasLaneSize() && (size_ == lane_size_); } + + bool IsSameType(const CPURegister& other) const { + return GetType() == other.GetType(); + } + + bool IsSameBank(const CPURegister& other) const { + return GetBank() == other.GetBank(); + } + + // Two registers with unknown size are considered to have the same size if + // they also have the same type. For example, all Z registers have the same + // size, even though we don't know what that is. + bool IsSameSizeAndType(const CPURegister& other) const { + return IsSameType(other) && (size_ == other.size_); + } + + bool IsSameFormat(const CPURegister& other) const { + return IsSameSizeAndType(other) && (lane_size_ == other.lane_size_); + } + + // Note that NoReg aliases itself, so that 'Is' implies 'Aliases'. + bool Aliases(const CPURegister& other) const { + return IsSameBank(other) && (code_ == other.code_); + } + + bool Is(const CPURegister& other) const { + if (IsRegister() || IsVRegister()) { + // For core (W, X) and FP/NEON registers, we only consider the code, size + // and type. This is legacy behaviour. + // TODO: We should probably check every field for all registers. + return Aliases(other) && (size_ == other.size_); + } else { + // For Z and P registers, we require all fields to match exactly. + VIXL_ASSERT(IsNone() || IsZRegister() || IsPRegister()); + return (code_ == other.code_) && (bank_ == other.bank_) && + (size_ == other.size_) && (qualifiers_ == other.qualifiers_) && + (lane_size_ == other.lane_size_); + } + } + + // Conversions to specific register types. The result is a register that + // aliases the original CPURegister. That is, the original register bank + // (`GetBank()`) is checked and the code (`GetCode()`) preserved, but all + // other properties are ignored. + // + // Typical usage: + // + // if (reg.GetBank() == kVRegisterBank) { + // DRegister d = reg.D(); + // ... + // } + // + // These could all return types with compile-time guarantees (like XRegister), + // but this breaks backwards-compatibility quite severely, particularly with + // code like `cond ? reg.W() : reg.X()`, which would have indeterminate type. + + // Core registers, like "w0". + Register W() const; + Register X() const; + // FP/NEON registers, like "b0". + VRegister B() const; + VRegister H() const; + VRegister S() const; + VRegister D() const; + VRegister Q() const; + VRegister V() const; + // SVE registers, like "z0". + ZRegister Z() const; + PRegister P() const; + + // Utilities for kRegister types. + + bool IsZero() const { return IsRegister() && (code_ == kZeroRegCode); } + bool IsSP() const { return IsRegister() && (code_ == kSPRegInternalCode); } + bool IsW() const { return IsRegister() && Is32Bits(); } + bool IsX() const { return IsRegister() && Is64Bits(); } + + // Utilities for FP/NEON kVRegister types. + + // These helpers ensure that the size and type of the register are as + // described. They do not consider the number of lanes that make up a vector. + // So, for example, Is8B() implies IsD(), and Is1D() implies IsD, but IsD() + // does not imply Is1D() or Is8B(). + // Check the number of lanes, ie. the format of the vector, using methods such + // as Is8B(), Is1D(), etc. + bool IsB() const { return IsVRegister() && Is8Bits(); } + bool IsH() const { return IsVRegister() && Is16Bits(); } + bool IsS() const { return IsVRegister() && Is32Bits(); } + bool IsD() const { return IsVRegister() && Is64Bits(); } + bool IsQ() const { return IsVRegister() && Is128Bits(); } + + // As above, but also check that the register has exactly one lane. For + // example, reg.Is1D() implies DRegister(reg).IsValid(), but reg.IsD() does + // not. + bool Is1B() const { return IsB() && IsScalar(); } + bool Is1H() const { return IsH() && IsScalar(); } + bool Is1S() const { return IsS() && IsScalar(); } + bool Is1D() const { return IsD() && IsScalar(); } + bool Is1Q() const { return IsQ() && IsScalar(); } + + // Check the specific NEON format. + bool Is8B() const { return IsD() && IsLaneSizeB(); } + bool Is16B() const { return IsQ() && IsLaneSizeB(); } + bool Is2H() const { return IsS() && IsLaneSizeH(); } + bool Is4H() const { return IsD() && IsLaneSizeH(); } + bool Is8H() const { return IsQ() && IsLaneSizeH(); } + bool Is2S() const { return IsD() && IsLaneSizeS(); } + bool Is4S() const { return IsQ() && IsLaneSizeS(); } + bool Is2D() const { return IsQ() && IsLaneSizeD(); } + + // A semantic alias for sdot and udot (indexed and by element) instructions. + // The current CPURegister implementation cannot not tell this from Is1S(), + // but it might do later. + // TODO: Do this with the qualifiers_ field. + bool Is1S4B() const { return Is1S(); } + + // Utilities for SVE registers. + + bool IsUnqualified() const { return qualifiers_ == kNoQualifiers; } + bool IsMerging() const { return IsPRegister() && (qualifiers_ == kMerging); } + bool IsZeroing() const { return IsPRegister() && (qualifiers_ == kZeroing); } + + // SVE types have unknown sizes, but within known bounds. + + int GetMaxSizeInBytes() const { + switch (GetType()) { + case kZRegister: + return kZRegMaxSizeInBytes; + case kPRegister: + return kPRegMaxSizeInBytes; + default: + VIXL_ASSERT(HasSize()); + return GetSizeInBits(); + } + } + + int GetMinSizeInBytes() const { + switch (GetType()) { + case kZRegister: + return kZRegMinSizeInBytes; + case kPRegister: + return kPRegMinSizeInBytes; + default: + VIXL_ASSERT(HasSize()); + return GetSizeInBits(); + } + } + + int GetMaxSizeInBits() const { return GetMaxSizeInBytes() * kBitsPerByte; } + int GetMinSizeInBits() const { return GetMinSizeInBytes() * kBitsPerByte; } + + static RegisterBank GetBankFor(RegisterType type) { + switch (type) { + case kNoRegister: + return kNoRegisterBank; + case kRegister: + return kRRegisterBank; + case kVRegister: + case kZRegister: + return kVRegisterBank; + case kPRegister: + return kPRegisterBank; + } + VIXL_UNREACHABLE(); + return kNoRegisterBank; + } + + static unsigned GetMaxCodeFor(CPURegister::RegisterType type) { + return GetMaxCodeFor(GetBankFor(type)); + } + + protected: + enum EncodedSize : uint8_t { + // Ensure that kUnknownSize (and therefore kNoRegister) is encoded as zero. + kEncodedUnknownSize = 0, + + // The implementation assumes that the remaining sizes are encoded as + // `log2(size) + c`, so the following names must remain in sequence. + kEncodedBRegSize, + kEncodedHRegSize, + kEncodedSRegSize, + kEncodedDRegSize, + kEncodedQRegSize, + + kEncodedWRegSize = kEncodedSRegSize, + kEncodedXRegSize = kEncodedDRegSize + }; + VIXL_STATIC_ASSERT(kSRegSize == kWRegSize); + VIXL_STATIC_ASSERT(kDRegSize == kXRegSize); + + char GetLaneSizeSymbol() const { + switch (lane_size_) { + case kEncodedBRegSize: + return 'B'; + case kEncodedHRegSize: + return 'H'; + case kEncodedSRegSize: + return 'S'; + case kEncodedDRegSize: + return 'D'; + case kEncodedQRegSize: + return 'Q'; + case kEncodedUnknownSize: + break; + } + VIXL_UNREACHABLE(); + return '?'; + } + + static EncodedSize EncodeSizeInBits(int size_in_bits) { + switch (size_in_bits) { + case kUnknownSize: + return kEncodedUnknownSize; + case kBRegSize: + return kEncodedBRegSize; + case kHRegSize: + return kEncodedHRegSize; + case kSRegSize: + return kEncodedSRegSize; + case kDRegSize: + return kEncodedDRegSize; + case kQRegSize: + return kEncodedQRegSize; + } + VIXL_UNREACHABLE(); + return kEncodedUnknownSize; + } + + static int DecodeSizeInBytesLog2(EncodedSize encoded_size) { + switch (encoded_size) { + case kEncodedUnknownSize: + // Log2 of B-sized lane in bytes is 0, so we can't just return 0 here. + VIXL_UNREACHABLE(); + return -1; + case kEncodedBRegSize: + return kBRegSizeInBytesLog2; + case kEncodedHRegSize: + return kHRegSizeInBytesLog2; + case kEncodedSRegSize: + return kSRegSizeInBytesLog2; + case kEncodedDRegSize: + return kDRegSizeInBytesLog2; + case kEncodedQRegSize: + return kQRegSizeInBytesLog2; + } + VIXL_UNREACHABLE(); + return kUnknownSize; + } + + static int DecodeSizeInBytes(EncodedSize encoded_size) { + if (encoded_size == kEncodedUnknownSize) { + return kUnknownSize; + } + return 1 << DecodeSizeInBytesLog2(encoded_size); + } + + static int DecodeSizeInBits(EncodedSize encoded_size) { + VIXL_STATIC_ASSERT(kUnknownSize == 0); + return DecodeSizeInBytes(encoded_size) * kBitsPerByte; + } + + static unsigned GetMaxCodeFor(CPURegister::RegisterBank bank); + + enum Qualifiers : uint8_t { + kNoQualifiers = 0, + // Used by P registers. + kMerging, + kZeroing + }; + + // An unchecked constructor, for use by derived classes. + CPURegister(int code, + EncodedSize size, + RegisterBank bank, + EncodedSize lane_size, + Qualifiers qualifiers = kNoQualifiers) + : code_(code), + bank_(bank), + size_(size), + qualifiers_(qualifiers), + lane_size_(lane_size) {} + + // TODO: Check that access to these fields is reasonably efficient. + uint8_t code_; + RegisterBank bank_; + EncodedSize size_; + Qualifiers qualifiers_; + EncodedSize lane_size_; +}; +// Ensure that CPURegisters can fit in a single (64-bit) register. This is a +// proxy for being "cheap to pass by value", which is hard to check directly. +VIXL_STATIC_ASSERT(sizeof(CPURegister) <= sizeof(uint64_t)); + +// TODO: Add constexpr constructors. +#define VIXL_DECLARE_REGISTER_COMMON(NAME, REGISTER_TYPE, PARENT_TYPE) \ + VIXL_CONSTEXPR NAME() : PARENT_TYPE() {} \ + \ + explicit NAME(CPURegister other) : PARENT_TYPE(other) { \ + VIXL_ASSERT(IsValid()); \ + } \ + \ + VIXL_CONSTEXPR static unsigned GetMaxCode() { \ + return kNumberOf##REGISTER_TYPE##s - 1; \ + } + +// Any W or X register, including the zero register and the stack pointer. +class Register : public CPURegister { + public: + VIXL_DECLARE_REGISTER_COMMON(Register, Register, CPURegister) + + Register(int code, int size_in_bits) + : CPURegister(code, size_in_bits, kRegister) { + VIXL_ASSERT(IsValidRegister()); + } + + bool IsValid() const { return IsValidRegister(); } +}; + +// Any FP or NEON V register, including vector (V.) and scalar forms +// (B, H, S, D, Q). +class VRegister : public CPURegister { + public: + VIXL_DECLARE_REGISTER_COMMON(VRegister, VRegister, CPURegister) + + // For historical reasons, VRegister(0) returns v0.1Q (or equivalently, q0). + explicit VRegister(int code, int size_in_bits = kQRegSize, int lanes = 1) + : CPURegister(code, + EncodeSizeInBits(size_in_bits), + kVRegisterBank, + EncodeLaneSizeInBits(size_in_bits, lanes)) { + VIXL_ASSERT(IsValidVRegister()); + } + + VRegister(int code, VectorFormat format) + : CPURegister(code, + EncodeSizeInBits(RegisterSizeInBitsFromFormat(format)), + kVRegisterBank, + EncodeSizeInBits(LaneSizeInBitsFromFormat(format)), + kNoQualifiers) { + VIXL_ASSERT(IsValid()); + } + + VRegister V8B() const; + VRegister V16B() const; + VRegister V2H() const; + VRegister V4H() const; + VRegister V8H() const; + VRegister V2S() const; + VRegister V4S() const; + VRegister V1D() const; + VRegister V2D() const; + VRegister S4B() const; + + bool IsValid() const { return IsValidVRegister(); } + + protected: + static EncodedSize EncodeLaneSizeInBits(int size_in_bits, int lanes) { + VIXL_ASSERT(lanes >= 1); + VIXL_ASSERT((size_in_bits % lanes) == 0); + return EncodeSizeInBits(size_in_bits / lanes); + } +}; + +// Any SVE Z register, with or without a lane size specifier. +class ZRegister : public CPURegister { + public: + VIXL_DECLARE_REGISTER_COMMON(ZRegister, ZRegister, CPURegister) + + explicit ZRegister(int code, int lane_size_in_bits = kUnknownSize) + : CPURegister(code, + kEncodedUnknownSize, + kVRegisterBank, + EncodeSizeInBits(lane_size_in_bits)) { + VIXL_ASSERT(IsValid()); + } + + ZRegister(int code, VectorFormat format) + : CPURegister(code, + kEncodedUnknownSize, + kVRegisterBank, + EncodeSizeInBits(LaneSizeInBitsFromFormat(format)), + kNoQualifiers) { + VIXL_ASSERT(IsValid()); + } + + // Return a Z register with a known lane size (like "z0.B"). + ZRegister VnB() const { return ZRegister(GetCode(), kBRegSize); } + ZRegister VnH() const { return ZRegister(GetCode(), kHRegSize); } + ZRegister VnS() const { return ZRegister(GetCode(), kSRegSize); } + ZRegister VnD() const { return ZRegister(GetCode(), kDRegSize); } + ZRegister VnQ() const { return ZRegister(GetCode(), kQRegSize); } + + template + ZRegister WithLaneSize(T format) const { + return ZRegister(GetCode(), format); + } + + ZRegister WithSameLaneSizeAs(const CPURegister& other) const { + VIXL_ASSERT(other.HasLaneSize()); + return this->WithLaneSize(other.GetLaneSizeInBits()); + } + + bool IsValid() const { return IsValidZRegister(); } +}; + +// Any SVE P register, with or without a qualifier or lane size specifier. +class PRegister : public CPURegister { + public: + VIXL_DECLARE_REGISTER_COMMON(PRegister, PRegister, CPURegister) + + explicit PRegister(int code) : CPURegister(code, kUnknownSize, kPRegister) { + VIXL_ASSERT(IsValid()); + } + + bool IsValid() const { + return IsValidPRegister() && !HasLaneSize() && IsUnqualified(); + } + + // Return a P register with a known lane size (like "p0.B"). + PRegisterWithLaneSize VnB() const; + PRegisterWithLaneSize VnH() const; + PRegisterWithLaneSize VnS() const; + PRegisterWithLaneSize VnD() const; + + template + PRegisterWithLaneSize WithLaneSize(T format) const; + + PRegisterWithLaneSize WithSameLaneSizeAs(const CPURegister& other) const; + + // SVE predicates are specified (in normal assembly) with a "/z" (zeroing) or + // "/m" (merging) suffix. These methods are VIXL's equivalents. + PRegisterZ Zeroing() const; + PRegisterM Merging() const; + + protected: + // Unchecked constructors, for use by derived classes. + PRegister(int code, EncodedSize encoded_lane_size) + : CPURegister(code, + kEncodedUnknownSize, + kPRegisterBank, + encoded_lane_size, + kNoQualifiers) {} + + PRegister(int code, Qualifiers qualifiers) + : CPURegister(code, + kEncodedUnknownSize, + kPRegisterBank, + kEncodedUnknownSize, + qualifiers) {} +}; + +// Any SVE P register with a known lane size (like "p0.B"). +class PRegisterWithLaneSize : public PRegister { + public: + VIXL_DECLARE_REGISTER_COMMON(PRegisterWithLaneSize, PRegister, PRegister) + + PRegisterWithLaneSize(int code, int lane_size_in_bits) + : PRegister(code, EncodeSizeInBits(lane_size_in_bits)) { + VIXL_ASSERT(IsValid()); + } + + PRegisterWithLaneSize(int code, VectorFormat format) + : PRegister(code, EncodeSizeInBits(LaneSizeInBitsFromFormat(format))) { + VIXL_ASSERT(IsValid()); + } + + bool IsValid() const { + return IsValidPRegister() && HasLaneSize() && IsUnqualified(); + } + + // Overload lane size accessors so we can assert `HasLaneSize()`. This allows + // tools such as clang-tidy to prove that the result of GetLaneSize* is + // non-zero. + + // TODO: Make these return 'int'. + unsigned GetLaneSizeInBits() const { + VIXL_ASSERT(HasLaneSize()); + return PRegister::GetLaneSizeInBits(); + } + + unsigned GetLaneSizeInBytes() const { + VIXL_ASSERT(HasLaneSize()); + return PRegister::GetLaneSizeInBytes(); + } +}; + +// Any SVE P register with the zeroing qualifier (like "p0/z"). +class PRegisterZ : public PRegister { + public: + VIXL_DECLARE_REGISTER_COMMON(PRegisterZ, PRegister, PRegister) + + explicit PRegisterZ(int code) : PRegister(code, kZeroing) { + VIXL_ASSERT(IsValid()); + } + + bool IsValid() const { + return IsValidPRegister() && !HasLaneSize() && IsZeroing(); + } +}; + +// Any SVE P register with the merging qualifier (like "p0/m"). +class PRegisterM : public PRegister { + public: + VIXL_DECLARE_REGISTER_COMMON(PRegisterM, PRegister, PRegister) + + explicit PRegisterM(int code) : PRegister(code, kMerging) { + VIXL_ASSERT(IsValid()); + } + + bool IsValid() const { + return IsValidPRegister() && !HasLaneSize() && IsMerging(); + } +}; + +inline PRegisterWithLaneSize PRegister::VnB() const { + return PRegisterWithLaneSize(GetCode(), kBRegSize); +} +inline PRegisterWithLaneSize PRegister::VnH() const { + return PRegisterWithLaneSize(GetCode(), kHRegSize); +} +inline PRegisterWithLaneSize PRegister::VnS() const { + return PRegisterWithLaneSize(GetCode(), kSRegSize); +} +inline PRegisterWithLaneSize PRegister::VnD() const { + return PRegisterWithLaneSize(GetCode(), kDRegSize); +} + +template +inline PRegisterWithLaneSize PRegister::WithLaneSize(T format) const { + return PRegisterWithLaneSize(GetCode(), format); +} + +inline PRegisterWithLaneSize PRegister::WithSameLaneSizeAs( + const CPURegister& other) const { + VIXL_ASSERT(other.HasLaneSize()); + return this->WithLaneSize(other.GetLaneSizeInBits()); +} + +inline PRegisterZ PRegister::Zeroing() const { return PRegisterZ(GetCode()); } +inline PRegisterM PRegister::Merging() const { return PRegisterM(GetCode()); } + +#define VIXL_REGISTER_WITH_SIZE_LIST(V) \ + V(WRegister, kWRegSize, Register) \ + V(XRegister, kXRegSize, Register) \ + V(QRegister, kQRegSize, VRegister) \ + V(DRegister, kDRegSize, VRegister) \ + V(SRegister, kSRegSize, VRegister) \ + V(HRegister, kHRegSize, VRegister) \ + V(BRegister, kBRegSize, VRegister) + +#define VIXL_DEFINE_REGISTER_WITH_SIZE(NAME, SIZE, PARENT) \ + class NAME : public PARENT { \ + public: \ + VIXL_CONSTEXPR NAME() : PARENT() {} \ + explicit NAME(int code) : PARENT(code, SIZE) {} \ + \ + explicit NAME(PARENT other) : PARENT(other) { \ + VIXL_ASSERT(GetSizeInBits() == SIZE); \ + } \ + \ + PARENT As##PARENT() const { return *this; } \ + \ + VIXL_CONSTEXPR int GetSizeInBits() const { return SIZE; } \ + \ + bool IsValid() const { \ + return PARENT::IsValid() && (PARENT::GetSizeInBits() == SIZE); \ + } \ + }; + +VIXL_REGISTER_WITH_SIZE_LIST(VIXL_DEFINE_REGISTER_WITH_SIZE) + +// No*Reg is used to provide default values for unused arguments, error cases +// and so on. Note that these (and the default constructors) all compare equal +// (using the Is() method). +const Register NoReg; +const VRegister NoVReg; +const CPURegister NoCPUReg; +const ZRegister NoZReg; + +// TODO: Ideally, these would use specialised register types (like XRegister and +// so on). However, doing so throws up template overloading problems elsewhere. +#define VIXL_DEFINE_REGISTERS(N) \ + const Register w##N = WRegister(N); \ + const Register x##N = XRegister(N); \ + const VRegister b##N = BRegister(N); \ + const VRegister h##N = HRegister(N); \ + const VRegister s##N = SRegister(N); \ + const VRegister d##N = DRegister(N); \ + const VRegister q##N = QRegister(N); \ + const VRegister v##N(N); \ + const ZRegister z##N(N); +AARCH64_REGISTER_CODE_LIST(VIXL_DEFINE_REGISTERS) +#undef VIXL_DEFINE_REGISTERS + +#define VIXL_DEFINE_P_REGISTERS(N) const PRegister p##N(N); +AARCH64_P_REGISTER_CODE_LIST(VIXL_DEFINE_P_REGISTERS) +#undef VIXL_DEFINE_P_REGISTERS + +// VIXL represents 'sp' with a unique code, to tell it apart from 'xzr'. +const Register wsp = WRegister(kSPRegInternalCode); +const Register sp = XRegister(kSPRegInternalCode); + +// Standard aliases. +const Register ip0 = x16; +const Register ip1 = x17; +const Register lr = x30; +const Register xzr = x31; +const Register wzr = w31; + +// AreAliased returns true if any of the named registers overlap. Arguments +// set to NoReg are ignored. The system stack pointer may be specified. +bool AreAliased(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoReg, + const CPURegister& reg4 = NoReg, + const CPURegister& reg5 = NoReg, + const CPURegister& reg6 = NoReg, + const CPURegister& reg7 = NoReg, + const CPURegister& reg8 = NoReg); + +// AreSameSizeAndType returns true if all of the specified registers have the +// same size, and are of the same type. The system stack pointer may be +// specified. Arguments set to NoReg are ignored, as are any subsequent +// arguments. At least one argument (reg1) must be valid (not NoCPUReg). +bool AreSameSizeAndType(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoCPUReg, + const CPURegister& reg4 = NoCPUReg, + const CPURegister& reg5 = NoCPUReg, + const CPURegister& reg6 = NoCPUReg, + const CPURegister& reg7 = NoCPUReg, + const CPURegister& reg8 = NoCPUReg); + +// AreEven returns true if all of the specified registers have even register +// indices. Arguments set to NoReg are ignored, as are any subsequent +// arguments. At least one argument (reg1) must be valid (not NoCPUReg). +bool AreEven(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoReg, + const CPURegister& reg4 = NoReg, + const CPURegister& reg5 = NoReg, + const CPURegister& reg6 = NoReg, + const CPURegister& reg7 = NoReg, + const CPURegister& reg8 = NoReg); + +// AreConsecutive returns true if all of the specified registers are +// consecutive in the register file. Arguments set to NoReg are ignored, as are +// any subsequent arguments. At least one argument (reg1) must be valid +// (not NoCPUReg). +bool AreConsecutive(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoCPUReg, + const CPURegister& reg4 = NoCPUReg); + +// AreSameFormat returns true if all of the specified registers have the same +// vector format. Arguments set to NoReg are ignored, as are any subsequent +// arguments. At least one argument (reg1) must be valid (not NoVReg). +bool AreSameFormat(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoCPUReg, + const CPURegister& reg4 = NoCPUReg); + +// AreSameLaneSize returns true if all of the specified registers have the same +// element lane size, B, H, S or D. It doesn't compare the type of registers. +// Arguments set to NoReg are ignored, as are any subsequent arguments. +// At least one argument (reg1) must be valid (not NoVReg). +// TODO: Remove this, and replace its uses with AreSameFormat. +bool AreSameLaneSize(const CPURegister& reg1, + const CPURegister& reg2, + const CPURegister& reg3 = NoCPUReg, + const CPURegister& reg4 = NoCPUReg); +} +} // namespace vixl::aarch64 + +#endif // VIXL_AARCH64_REGISTERS_AARCH64_H_ diff --git a/core/deps/vixl/aarch64/simulator-aarch64.cc b/core/deps/vixl/aarch64/simulator-aarch64.cc index b682d07c8..7c7dc1ca3 100644 --- a/core/deps/vixl/aarch64/simulator-aarch64.cc +++ b/core/deps/vixl/aarch64/simulator-aarch64.cc @@ -26,6 +26,11 @@ #ifdef VIXL_INCLUDE_SIMULATOR_AARCH64 +#include + +#include +#include + #include #include #include @@ -39,6 +44,8 @@ using vixl::internal::SimFloat16; const Instruction* Simulator::kEndOfSimAddress = NULL; +bool MetaDataDepot::MetaDataMTE::is_active = false; + void SimSystemRegister::SetBits(int msb, int lsb, uint32_t bits) { int width = msb - lsb + 1; VIXL_ASSERT(IsUintN(width, bits) || IsIntN(width, bits)); @@ -63,14 +70,440 @@ SimSystemRegister SimSystemRegister::DefaultValueFor(SystemRegister id) { } } +const Simulator::FormToVisitorFnMap* Simulator::GetFormToVisitorFnMap() { + static const FormToVisitorFnMap form_to_visitor = { + DEFAULT_FORM_TO_VISITOR_MAP(Simulator), + SIM_AUD_VISITOR_MAP(Simulator), + {"smlal_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"smlsl_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"smull_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"sqdmlal_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"sqdmlsl_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"sqdmull_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"umlal_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"umlsl_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"umull_asimdelem_l"_h, &Simulator::SimulateNEONMulByElementLong}, + {"fcmla_asimdelem_c_h"_h, &Simulator::SimulateNEONComplexMulByElement}, + {"fcmla_asimdelem_c_s"_h, &Simulator::SimulateNEONComplexMulByElement}, + {"fmlal2_asimdelem_lh"_h, &Simulator::SimulateNEONFPMulByElementLong}, + {"fmlal_asimdelem_lh"_h, &Simulator::SimulateNEONFPMulByElementLong}, + {"fmlsl2_asimdelem_lh"_h, &Simulator::SimulateNEONFPMulByElementLong}, + {"fmlsl_asimdelem_lh"_h, &Simulator::SimulateNEONFPMulByElementLong}, + {"fmla_asimdelem_rh_h"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmls_asimdelem_rh_h"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmulx_asimdelem_rh_h"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmul_asimdelem_rh_h"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmla_asimdelem_r_sd"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmls_asimdelem_r_sd"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmulx_asimdelem_r_sd"_h, &Simulator::SimulateNEONFPMulByElement}, + {"fmul_asimdelem_r_sd"_h, &Simulator::SimulateNEONFPMulByElement}, + {"sdot_asimdelem_d"_h, &Simulator::SimulateNEONDotProdByElement}, + {"udot_asimdelem_d"_h, &Simulator::SimulateNEONDotProdByElement}, + {"adclb_z_zzz"_h, &Simulator::SimulateSVEAddSubCarry}, + {"adclt_z_zzz"_h, &Simulator::SimulateSVEAddSubCarry}, + {"addhnb_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"addhnt_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"addp_z_p_zz"_h, &Simulator::SimulateSVEIntArithPair}, + {"bcax_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"bdep_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"bext_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"bgrp_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"bsl1n_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"bsl2n_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"bsl_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"cadd_z_zz"_h, &Simulator::Simulate_ZdnT_ZdnT_ZmT_const}, + {"cdot_z_zzz"_h, &Simulator::SimulateSVEComplexDotProduct}, + {"cdot_z_zzzi_d"_h, &Simulator::SimulateSVEComplexDotProduct}, + {"cdot_z_zzzi_s"_h, &Simulator::SimulateSVEComplexDotProduct}, + {"cmla_z_zzz"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"cmla_z_zzzi_h"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"cmla_z_zzzi_s"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"eor3_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"eorbt_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"eortb_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"ext_z_zi_con"_h, &Simulator::Simulate_ZdB_Zn1B_Zn2B_imm}, + {"faddp_z_p_zz"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT}, + {"fcvtlt_z_p_z_h2s"_h, &Simulator::SimulateSVEFPConvertLong}, + {"fcvtlt_z_p_z_s2d"_h, &Simulator::SimulateSVEFPConvertLong}, + {"fcvtnt_z_p_z_d2s"_h, &Simulator::Simulate_ZdS_PgM_ZnD}, + {"fcvtnt_z_p_z_s2h"_h, &Simulator::Simulate_ZdH_PgM_ZnS}, + {"fcvtx_z_p_z_d2s"_h, &Simulator::Simulate_ZdS_PgM_ZnD}, + {"fcvtxnt_z_p_z_d2s"_h, &Simulator::Simulate_ZdS_PgM_ZnD}, + {"flogb_z_p_z"_h, &Simulator::Simulate_ZdT_PgM_ZnT}, + {"fmaxnmp_z_p_zz"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT}, + {"fmaxp_z_p_zz"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT}, + {"fminnmp_z_p_zz"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT}, + {"fminp_z_p_zz"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT}, + {"fmlalb_z_zzz"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH}, + {"fmlalb_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"fmlalt_z_zzz"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH}, + {"fmlalt_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"fmlslb_z_zzz"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH}, + {"fmlslb_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"fmlslt_z_zzz"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH}, + {"fmlslt_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"histcnt_z_p_zz"_h, &Simulator::Simulate_ZdT_PgZ_ZnT_ZmT}, + {"histseg_z_zz"_h, &Simulator::Simulate_ZdB_ZnB_ZmB}, + {"ldnt1b_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1b_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_PgZ_ZnS_Xm}, + {"ldnt1d_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1h_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1h_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_PgZ_ZnS_Xm}, + {"ldnt1sb_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1sb_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_PgZ_ZnS_Xm}, + {"ldnt1sh_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1sh_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_PgZ_ZnS_Xm}, + {"ldnt1sw_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1w_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_PgZ_ZnD_Xm}, + {"ldnt1w_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_PgZ_ZnS_Xm}, + {"match_p_p_zz"_h, &Simulator::Simulate_PdT_PgZ_ZnT_ZmT}, + {"mla_z_zzzi_d"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mla_z_zzzi_h"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mla_z_zzzi_s"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mls_z_zzzi_d"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mls_z_zzzi_h"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mls_z_zzzi_s"_h, &Simulator::SimulateSVEMlaMlsIndex}, + {"mul_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"mul_z_zzi_d"_h, &Simulator::SimulateSVEMulIndex}, + {"mul_z_zzi_h"_h, &Simulator::SimulateSVEMulIndex}, + {"mul_z_zzi_s"_h, &Simulator::SimulateSVEMulIndex}, + {"nbsl_z_zzz"_h, &Simulator::SimulateSVEBitwiseTernary}, + {"nmatch_p_p_zz"_h, &Simulator::Simulate_PdT_PgZ_ZnT_ZmT}, + {"pmul_z_zz"_h, &Simulator::Simulate_ZdB_ZnB_ZmB}, + {"pmullb_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"pmullt_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"raddhnb_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"raddhnt_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"rshrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"rshrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"rsubhnb_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"rsubhnt_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"saba_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnT_ZmT}, + {"sabalb_z_zzz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"sabalt_z_zzz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"sabdlb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"sabdlt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"sadalp_z_p_z"_h, &Simulator::Simulate_ZdaT_PgM_ZnTb}, + {"saddlb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"saddlbt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"saddlt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"saddwb_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"saddwt_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"sbclb_z_zzz"_h, &Simulator::SimulateSVEAddSubCarry}, + {"sbclt_z_zzz"_h, &Simulator::SimulateSVEAddSubCarry}, + {"shadd_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"shrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"shrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"shsub_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"shsubr_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"sli_z_zzi"_h, &Simulator::Simulate_ZdT_ZnT_const}, + {"smaxp_z_p_zz"_h, &Simulator::SimulateSVEIntArithPair}, + {"sminp_z_p_zz"_h, &Simulator::SimulateSVEIntArithPair}, + {"smlalb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"smlalb_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlalb_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlalt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"smlalt_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlalt_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlslb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"smlslb_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlslb_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlslt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"smlslt_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smlslt_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smulh_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"smullb_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"smullb_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smullb_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smullt_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"smullt_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"smullt_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"splice_z_p_zz_con"_h, &Simulator::VisitSVEVectorSplice}, + {"sqabs_z_p_z"_h, &Simulator::Simulate_ZdT_PgM_ZnT}, + {"sqadd_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"sqcadd_z_zz"_h, &Simulator::Simulate_ZdnT_ZdnT_ZmT_const}, + {"sqdmlalb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlalb_z_zzzi_d"_h, &Simulator::Simulate_ZdaD_ZnS_ZmS_imm}, + {"sqdmlalb_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"sqdmlalbt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlalt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlalt_z_zzzi_d"_h, &Simulator::Simulate_ZdaD_ZnS_ZmS_imm}, + {"sqdmlalt_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"sqdmlslb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlslb_z_zzzi_d"_h, &Simulator::Simulate_ZdaD_ZnS_ZmS_imm}, + {"sqdmlslb_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"sqdmlslbt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlslt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"sqdmlslt_z_zzzi_d"_h, &Simulator::Simulate_ZdaD_ZnS_ZmS_imm}, + {"sqdmlslt_z_zzzi_s"_h, &Simulator::Simulate_ZdaS_ZnH_ZmH_imm}, + {"sqdmulh_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"sqdmulh_z_zzi_d"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqdmulh_z_zzi_h"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqdmulh_z_zzi_s"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqdmullb_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"sqdmullb_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"sqdmullb_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"sqdmullt_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"sqdmullt_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"sqdmullt_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"sqneg_z_p_z"_h, &Simulator::Simulate_ZdT_PgM_ZnT}, + {"sqrdcmlah_z_zzz"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"sqrdcmlah_z_zzzi_h"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"sqrdcmlah_z_zzzi_s"_h, &Simulator::SimulateSVEComplexIntMulAdd}, + {"sqrdmlah_z_zzz"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlah_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlah_z_zzzi_h"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlah_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlsh_z_zzz"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlsh_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlsh_z_zzzi_h"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmlsh_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingMulAddHigh}, + {"sqrdmulh_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"sqrdmulh_z_zzi_d"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqrdmulh_z_zzi_h"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqrdmulh_z_zzi_s"_h, &Simulator::SimulateSVESaturatingMulHighIndex}, + {"sqrshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"sqrshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"sqrshrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqrshrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqrshrunb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqrshrunt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqshl_z_p_zi"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_const}, + {"sqshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"sqshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"sqshlu_z_p_zi"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_const}, + {"sqshrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqshrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqshrunb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqshrunt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"sqsub_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"sqsubr_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"sqxtnb_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"sqxtnt_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"sqxtunb_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"sqxtunt_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"srhadd_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"sri_z_zzi"_h, &Simulator::Simulate_ZdT_ZnT_const}, + {"srshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"srshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"srshr_z_p_zi"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_const}, + {"srsra_z_zi"_h, &Simulator::Simulate_ZdaT_ZnT_const}, + {"sshllb_z_zi"_h, &Simulator::SimulateSVEShiftLeftImm}, + {"sshllt_z_zi"_h, &Simulator::SimulateSVEShiftLeftImm}, + {"ssra_z_zi"_h, &Simulator::Simulate_ZdaT_ZnT_const}, + {"ssublb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"ssublbt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"ssublt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"ssubltb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"ssubwb_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"ssubwt_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"stnt1b_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_Pg_ZnD_Xm}, + {"stnt1b_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_Pg_ZnS_Xm}, + {"stnt1d_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_Pg_ZnD_Xm}, + {"stnt1h_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_Pg_ZnD_Xm}, + {"stnt1h_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_Pg_ZnS_Xm}, + {"stnt1w_z_p_ar_d_64_unscaled"_h, &Simulator::Simulate_ZtD_Pg_ZnD_Xm}, + {"stnt1w_z_p_ar_s_x32_unscaled"_h, &Simulator::Simulate_ZtS_Pg_ZnS_Xm}, + {"subhnb_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"subhnt_z_zz"_h, &Simulator::SimulateSVEAddSubHigh}, + {"suqadd_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"tbl_z_zz_2"_h, &Simulator::VisitSVETableLookup}, + {"tbx_z_zz"_h, &Simulator::VisitSVETableLookup}, + {"uaba_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnT_ZmT}, + {"uabalb_z_zzz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uabalt_z_zzz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uabdlb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uabdlt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uadalp_z_p_z"_h, &Simulator::Simulate_ZdaT_PgM_ZnTb}, + {"uaddlb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uaddlt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"uaddwb_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"uaddwt_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"uhadd_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"uhsub_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"uhsubr_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"umaxp_z_p_zz"_h, &Simulator::SimulateSVEIntArithPair}, + {"uminp_z_p_zz"_h, &Simulator::SimulateSVEIntArithPair}, + {"umlalb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"umlalb_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlalb_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlalt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"umlalt_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlalt_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlslb_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"umlslb_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlslb_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlslt_z_zzz"_h, &Simulator::Simulate_ZdaT_ZnTb_ZmTb}, + {"umlslt_z_zzzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umlslt_z_zzzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umulh_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmT}, + {"umullb_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"umullb_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umullb_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umullt_z_zz"_h, &Simulator::SimulateSVEIntMulLongVec}, + {"umullt_z_zzi_d"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"umullt_z_zzi_s"_h, &Simulator::SimulateSVESaturatingIntMulLongIdx}, + {"uqadd_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"uqrshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"uqrshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"uqrshrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"uqrshrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"uqshl_z_p_zi"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_const}, + {"uqshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"uqshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"uqshrnb_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"uqshrnt_z_zi"_h, &Simulator::SimulateSVENarrow}, + {"uqsub_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"uqsubr_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"uqxtnb_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"uqxtnt_z_zz"_h, &Simulator::SimulateSVENarrow}, + {"urecpe_z_p_z"_h, &Simulator::Simulate_ZdS_PgM_ZnS}, + {"urhadd_z_p_zz"_h, &Simulator::SimulateSVEHalvingAddSub}, + {"urshl_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"urshlr_z_p_zz"_h, &Simulator::VisitSVEBitwiseShiftByVector_Predicated}, + {"urshr_z_p_zi"_h, &Simulator::Simulate_ZdnT_PgM_ZdnT_const}, + {"ursqrte_z_p_z"_h, &Simulator::Simulate_ZdS_PgM_ZnS}, + {"ursra_z_zi"_h, &Simulator::Simulate_ZdaT_ZnT_const}, + {"ushllb_z_zi"_h, &Simulator::SimulateSVEShiftLeftImm}, + {"ushllt_z_zi"_h, &Simulator::SimulateSVEShiftLeftImm}, + {"usqadd_z_p_zz"_h, &Simulator::SimulateSVESaturatingArithmetic}, + {"usra_z_zi"_h, &Simulator::Simulate_ZdaT_ZnT_const}, + {"usublb_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"usublt_z_zz"_h, &Simulator::SimulateSVEInterleavedArithLong}, + {"usubwb_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"usubwt_z_zz"_h, &Simulator::Simulate_ZdT_ZnT_ZmTb}, + {"whilege_p_p_rr"_h, &Simulator::VisitSVEIntCompareScalarCountAndLimit}, + {"whilegt_p_p_rr"_h, &Simulator::VisitSVEIntCompareScalarCountAndLimit}, + {"whilehi_p_p_rr"_h, &Simulator::VisitSVEIntCompareScalarCountAndLimit}, + {"whilehs_p_p_rr"_h, &Simulator::VisitSVEIntCompareScalarCountAndLimit}, + {"whilerw_p_rr"_h, &Simulator::Simulate_PdT_Xn_Xm}, + {"whilewr_p_rr"_h, &Simulator::Simulate_PdT_Xn_Xm}, + {"xar_z_zzi"_h, &Simulator::SimulateSVEExclusiveOrRotate}, + {"smmla_z_zzz"_h, &Simulator::SimulateMatrixMul}, + {"ummla_z_zzz"_h, &Simulator::SimulateMatrixMul}, + {"usmmla_z_zzz"_h, &Simulator::SimulateMatrixMul}, + {"smmla_asimdsame2_g"_h, &Simulator::SimulateMatrixMul}, + {"ummla_asimdsame2_g"_h, &Simulator::SimulateMatrixMul}, + {"usmmla_asimdsame2_g"_h, &Simulator::SimulateMatrixMul}, + {"fmmla_z_zzz_s"_h, &Simulator::SimulateSVEFPMatrixMul}, + {"fmmla_z_zzz_d"_h, &Simulator::SimulateSVEFPMatrixMul}, + {"ld1row_z_p_bi_u32"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusImm}, + {"ld1row_z_p_br_contiguous"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusScalar}, + {"ld1rod_z_p_bi_u64"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusImm}, + {"ld1rod_z_p_br_contiguous"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusScalar}, + {"ld1rob_z_p_bi_u8"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusImm}, + {"ld1rob_z_p_br_contiguous"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusScalar}, + {"ld1roh_z_p_bi_u16"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusImm}, + {"ld1roh_z_p_br_contiguous"_h, + &Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusScalar}, + {"usdot_z_zzz_s"_h, &Simulator::VisitSVEIntMulAddUnpredicated}, + {"sudot_z_zzzi_s"_h, &Simulator::VisitSVEMulIndex}, + {"usdot_z_zzzi_s"_h, &Simulator::VisitSVEMulIndex}, + {"usdot_asimdsame2_d"_h, &Simulator::VisitNEON3SameExtra}, + {"sudot_asimdelem_d"_h, &Simulator::SimulateNEONDotProdByElement}, + {"usdot_asimdelem_d"_h, &Simulator::SimulateNEONDotProdByElement}, + {"addg_64_addsub_immtags"_h, &Simulator::SimulateMTEAddSubTag}, + {"gmi_64g_dp_2src"_h, &Simulator::SimulateMTETagMaskInsert}, + {"irg_64i_dp_2src"_h, &Simulator::Simulate_XdSP_XnSP_Xm}, + {"ldg_64loffset_ldsttags"_h, &Simulator::SimulateMTELoadTag}, + {"st2g_64soffset_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"st2g_64spost_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"st2g_64spre_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stgp_64_ldstpair_off"_h, &Simulator::SimulateMTEStoreTagPair}, + {"stgp_64_ldstpair_post"_h, &Simulator::SimulateMTEStoreTagPair}, + {"stgp_64_ldstpair_pre"_h, &Simulator::SimulateMTEStoreTagPair}, + {"stg_64soffset_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stg_64spost_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stg_64spre_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stz2g_64soffset_ldsttags"_h, + &Simulator::Simulator::SimulateMTEStoreTag}, + {"stz2g_64spost_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stz2g_64spre_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stzg_64soffset_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stzg_64spost_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"stzg_64spre_ldsttags"_h, &Simulator::Simulator::SimulateMTEStoreTag}, + {"subg_64_addsub_immtags"_h, &Simulator::SimulateMTEAddSubTag}, + {"subps_64s_dp_2src"_h, &Simulator::SimulateMTESubPointer}, + {"subp_64s_dp_2src"_h, &Simulator::SimulateMTESubPointer}, + {"cpyen_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyern_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyewn_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpye_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyfen_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyfern_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyfewn_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyfe_cpy_memcms"_h, &Simulator::SimulateCpyE}, + {"cpyfmn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpyfmrn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpyfmwn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpyfm_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpyfpn_cpy_memcms"_h, &Simulator::SimulateCpyFP}, + {"cpyfprn_cpy_memcms"_h, &Simulator::SimulateCpyFP}, + {"cpyfpwn_cpy_memcms"_h, &Simulator::SimulateCpyFP}, + {"cpyfp_cpy_memcms"_h, &Simulator::SimulateCpyFP}, + {"cpymn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpymrn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpymwn_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpym_cpy_memcms"_h, &Simulator::SimulateCpyM}, + {"cpypn_cpy_memcms"_h, &Simulator::SimulateCpyP}, + {"cpyprn_cpy_memcms"_h, &Simulator::SimulateCpyP}, + {"cpypwn_cpy_memcms"_h, &Simulator::SimulateCpyP}, + {"cpyp_cpy_memcms"_h, &Simulator::SimulateCpyP}, + {"setp_set_memcms"_h, &Simulator::SimulateSetP}, + {"setpn_set_memcms"_h, &Simulator::SimulateSetP}, + {"setgp_set_memcms"_h, &Simulator::SimulateSetGP}, + {"setgpn_set_memcms"_h, &Simulator::SimulateSetGP}, + {"setm_set_memcms"_h, &Simulator::SimulateSetM}, + {"setmn_set_memcms"_h, &Simulator::SimulateSetM}, + {"setgm_set_memcms"_h, &Simulator::SimulateSetGM}, + {"setgmn_set_memcms"_h, &Simulator::SimulateSetGM}, + {"sete_set_memcms"_h, &Simulator::SimulateSetE}, + {"seten_set_memcms"_h, &Simulator::SimulateSetE}, + {"setge_set_memcms"_h, &Simulator::SimulateSetE}, + {"setgen_set_memcms"_h, &Simulator::SimulateSetE}, + {"abs_32_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"abs_64_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"cnt_32_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"cnt_64_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"ctz_32_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"ctz_64_dp_1src"_h, &Simulator::VisitDataProcessing1Source}, + {"smax_32_dp_2src"_h, &Simulator::SimulateSignedMinMax}, + {"smax_64_dp_2src"_h, &Simulator::SimulateSignedMinMax}, + {"smin_32_dp_2src"_h, &Simulator::SimulateSignedMinMax}, + {"smin_64_dp_2src"_h, &Simulator::SimulateSignedMinMax}, + {"smax_32_minmax_imm"_h, &Simulator::SimulateSignedMinMax}, + {"smax_64_minmax_imm"_h, &Simulator::SimulateSignedMinMax}, + {"smin_32_minmax_imm"_h, &Simulator::SimulateSignedMinMax}, + {"smin_64_minmax_imm"_h, &Simulator::SimulateSignedMinMax}, + {"umax_32_dp_2src"_h, &Simulator::SimulateUnsignedMinMax}, + {"umax_64_dp_2src"_h, &Simulator::SimulateUnsignedMinMax}, + {"umin_32_dp_2src"_h, &Simulator::SimulateUnsignedMinMax}, + {"umin_64_dp_2src"_h, &Simulator::SimulateUnsignedMinMax}, + {"umax_32u_minmax_imm"_h, &Simulator::SimulateUnsignedMinMax}, + {"umax_64u_minmax_imm"_h, &Simulator::SimulateUnsignedMinMax}, + {"umin_32u_minmax_imm"_h, &Simulator::SimulateUnsignedMinMax}, + {"umin_64u_minmax_imm"_h, &Simulator::SimulateUnsignedMinMax}, + }; + return &form_to_visitor; +} -Simulator::Simulator(Decoder* decoder, FILE* stream) - : cpu_features_auditor_(decoder, CPUFeatures::All()) { +Simulator::Simulator(Decoder* decoder, FILE* stream, SimStack::Allocated stack) + : memory_(std::move(stack)), + last_instr_(NULL), + cpu_features_auditor_(decoder, CPUFeatures::All()) { // Ensure that shift operations act as the simulator expects. VIXL_ASSERT((static_cast(-1) >> 1) == -1); VIXL_ASSERT((static_cast(-1) >> 1) == 0x7fffffff); - instruction_stats_ = false; + // Set up a placeholder pipe for CanReadMemory. + VIXL_CHECK(pipe(placeholder_pipe_fd_) == 0); // Set up the decoder. decoder_ = decoder; @@ -79,6 +512,9 @@ Simulator::Simulator(Decoder* decoder, FILE* stream) stream_ = stream; print_disasm_ = new PrintDisassembler(stream_); + + memory_.AppendMetaData(&meta_data_); + // The Simulator and Disassembler share the same available list, held by the // auditor. The Disassembler only annotates instructions with features that // are _not_ available, so registering the auditor should have no effect @@ -91,21 +527,11 @@ Simulator::Simulator(Decoder* decoder, FILE* stream) SetColouredTrace(false); trace_parameters_ = LOG_NONE; - ResetState(); - - // Allocate and set up the simulator stack. - stack_ = new byte[stack_size_]; - stack_limit_ = stack_ + stack_protection_size_; - // Configure the starting stack pointer. - // - Find the top of the stack. - byte* tos = stack_ + stack_size_; - // - There's a protection region at both ends of the stack. - tos -= stack_protection_size_; - // - The stack pointer must be 16-byte aligned. - tos = AlignDown(tos, 16); - WriteSp(tos); + // We have to configure the SVE vector register length before calling + // ResetState(). + SetVectorLengthInBits(kZRegMinSize); - instrumentation_ = NULL; + ResetState(); // Print a warning about exclusive-access instructions, but only the first // time they are encountered. This warning can be silenced using @@ -113,50 +539,115 @@ Simulator::Simulator(Decoder* decoder, FILE* stream) print_exclusive_access_warning_ = true; guard_pages_ = false; -} + // Initialize the common state of RNDR and RNDRRS. + uint16_t seed[3] = {11, 22, 33}; + VIXL_STATIC_ASSERT(sizeof(seed) == sizeof(rand_state_)); + memcpy(rand_state_, seed, sizeof(rand_state_)); -void Simulator::ResetState() { + // Initialize all bits of pseudo predicate register to true. + LogicPRegister ones(pregister_all_true_); + ones.SetAllBits(); +} + +void Simulator::ResetSystemRegisters() { // Reset the system registers. nzcv_ = SimSystemRegister::DefaultValueFor(NZCV); fpcr_ = SimSystemRegister::DefaultValueFor(FPCR); + ResetFFR(); +} - // Reset registers to 0. - pc_ = NULL; - pc_modified_ = false; +void Simulator::ResetRegisters() { for (unsigned i = 0; i < kNumberOfRegisters; i++) { WriteXRegister(i, 0xbadbeef); } - // Set FP registers to a value that is a NaN in both 32-bit and 64-bit FP. - uint64_t nan_bits[] = { - UINT64_C(0x7ff00cab7f8ba9e1), UINT64_C(0x7ff0dead7f8beef1), - }; - VIXL_ASSERT(IsSignallingNaN(RawbitsToDouble(nan_bits[0] & kDRegMask))); - VIXL_ASSERT(IsSignallingNaN(RawbitsToFloat(nan_bits[0] & kSRegMask))); + // Returning to address 0 exits the Simulator. + WriteLr(kEndOfSimAddress); +} - qreg_t q_bits; - VIXL_ASSERT(sizeof(q_bits) == sizeof(nan_bits)); - memcpy(&q_bits, nan_bits, sizeof(nan_bits)); +void Simulator::ResetVRegisters() { + // Set SVE/FP registers to a value that is a NaN in both 32-bit and 64-bit FP. + VIXL_ASSERT((GetVectorLengthInBytes() % kDRegSizeInBytes) == 0); + int lane_count = GetVectorLengthInBytes() / kDRegSizeInBytes; + for (unsigned i = 0; i < kNumberOfZRegisters; i++) { + VIXL_ASSERT(vregisters_[i].GetSizeInBytes() == GetVectorLengthInBytes()); + vregisters_[i].NotifyAccessAsZ(); + for (int lane = 0; lane < lane_count; lane++) { + // Encode the register number and (D-sized) lane into each NaN, to + // make them easier to trace. + uint64_t nan_bits = 0x7ff0f0007f80f000 | (0x0000000100000000 * i) | + (0x0000000000000001 * lane); + VIXL_ASSERT(IsSignallingNaN(RawbitsToDouble(nan_bits & kDRegMask))); + VIXL_ASSERT(IsSignallingNaN(RawbitsToFloat(nan_bits & kSRegMask))); + vregisters_[i].Insert(lane, nan_bits); + } + } +} - for (unsigned i = 0; i < kNumberOfVRegisters; i++) { - WriteQRegister(i, q_bits); +void Simulator::ResetPRegisters() { + VIXL_ASSERT((GetPredicateLengthInBytes() % kHRegSizeInBytes) == 0); + int lane_count = GetPredicateLengthInBytes() / kHRegSizeInBytes; + // Ensure the register configuration fits in this bit encoding. + VIXL_STATIC_ASSERT(kNumberOfPRegisters <= UINT8_MAX); + VIXL_ASSERT(lane_count <= UINT8_MAX); + for (unsigned i = 0; i < kNumberOfPRegisters; i++) { + VIXL_ASSERT(pregisters_[i].GetSizeInBytes() == GetPredicateLengthInBytes()); + for (int lane = 0; lane < lane_count; lane++) { + // Encode the register number and (H-sized) lane into each lane slot. + uint16_t bits = (0x0100 * lane) | i; + pregisters_[i].Insert(lane, bits); + } } - // Returning to address 0 exits the Simulator. - WriteLr(kEndOfSimAddress); +} + +void Simulator::ResetFFR() { + VIXL_ASSERT((GetPredicateLengthInBytes() % kHRegSizeInBytes) == 0); + int default_active_lanes = GetPredicateLengthInBytes() / kHRegSizeInBytes; + ffr_register_.Write(static_cast(GetUintMask(default_active_lanes))); +} + +void Simulator::ResetState() { + ResetSystemRegisters(); + ResetRegisters(); + ResetVRegisters(); + ResetPRegisters(); + + WriteSp(memory_.GetStack().GetBase()); + + pc_ = NULL; + pc_modified_ = false; + // BTI state. btype_ = DefaultBType; next_btype_ = DefaultBType; } +void Simulator::SetVectorLengthInBits(unsigned vector_length) { + VIXL_ASSERT((vector_length >= kZRegMinSize) && + (vector_length <= kZRegMaxSize)); + VIXL_ASSERT((vector_length % kZRegMinSize) == 0); + vector_length_ = vector_length; + + for (unsigned i = 0; i < kNumberOfZRegisters; i++) { + vregisters_[i].SetSizeInBytes(GetVectorLengthInBytes()); + } + for (unsigned i = 0; i < kNumberOfPRegisters; i++) { + pregisters_[i].SetSizeInBytes(GetPredicateLengthInBytes()); + } + + ffr_register_.SetSizeInBytes(GetPredicateLengthInBytes()); + + ResetVRegisters(); + ResetPRegisters(); + ResetFFR(); +} Simulator::~Simulator() { - delete[] stack_; // The decoder may outlive the simulator. decoder_->RemoveVisitor(print_disasm_); delete print_disasm_; - - decoder_->RemoveVisitor(instrumentation_); - delete instrumentation_; + close(placeholder_pipe_fd_[0]); + close(placeholder_pipe_fd_[1]); } @@ -177,6 +668,7 @@ void Simulator::RunFrom(const Instruction* first) { } +// clang-format off const char* Simulator::xreg_names[] = {"x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", @@ -191,6 +683,13 @@ const char* Simulator::wreg_names[] = {"w0", "w1", "w2", "w3", "w4", "w5", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wzr", "wsp"}; +const char* Simulator::breg_names[] = {"b0", "b1", "b2", "b3", "b4", "b5", + "b6", "b7", "b8", "b9", "b10", "b11", + "b12", "b13", "b14", "b15", "b16", "b17", + "b18", "b19", "b20", "b21", "b22", "b23", + "b24", "b25", "b26", "b27", "b28", "b29", + "b30", "b31"}; + const char* Simulator::hreg_names[] = {"h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15", "h16", "h17", @@ -219,41 +718,61 @@ const char* Simulator::vreg_names[] = {"v0", "v1", "v2", "v3", "v4", "v5", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"}; +const char* Simulator::zreg_names[] = {"z0", "z1", "z2", "z3", "z4", "z5", + "z6", "z7", "z8", "z9", "z10", "z11", + "z12", "z13", "z14", "z15", "z16", "z17", + "z18", "z19", "z20", "z21", "z22", "z23", + "z24", "z25", "z26", "z27", "z28", "z29", + "z30", "z31"}; + +const char* Simulator::preg_names[] = {"p0", "p1", "p2", "p3", "p4", "p5", + "p6", "p7", "p8", "p9", "p10", "p11", + "p12", "p13", "p14", "p15"}; +// clang-format on + const char* Simulator::WRegNameForCode(unsigned code, Reg31Mode mode) { - VIXL_ASSERT(code < kNumberOfRegisters); // If the code represents the stack pointer, index the name after zr. - if ((code == kZeroRegCode) && (mode == Reg31IsStackPointer)) { + if ((code == kSPRegInternalCode) || + ((code == kZeroRegCode) && (mode == Reg31IsStackPointer))) { code = kZeroRegCode + 1; } + VIXL_ASSERT(code < ArrayLength(wreg_names)); return wreg_names[code]; } const char* Simulator::XRegNameForCode(unsigned code, Reg31Mode mode) { - VIXL_ASSERT(code < kNumberOfRegisters); // If the code represents the stack pointer, index the name after zr. - if ((code == kZeroRegCode) && (mode == Reg31IsStackPointer)) { + if ((code == kSPRegInternalCode) || + ((code == kZeroRegCode) && (mode == Reg31IsStackPointer))) { code = kZeroRegCode + 1; } + VIXL_ASSERT(code < ArrayLength(xreg_names)); return xreg_names[code]; } +const char* Simulator::BRegNameForCode(unsigned code) { + VIXL_ASSERT(code < kNumberOfVRegisters); + return breg_names[code]; +} + + const char* Simulator::HRegNameForCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfFPRegisters); + VIXL_ASSERT(code < kNumberOfVRegisters); return hreg_names[code]; } const char* Simulator::SRegNameForCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfFPRegisters); + VIXL_ASSERT(code < kNumberOfVRegisters); return sreg_names[code]; } const char* Simulator::DRegNameForCode(unsigned code) { - VIXL_ASSERT(code < kNumberOfFPRegisters); + VIXL_ASSERT(code < kNumberOfVRegisters); return dreg_names[code]; } @@ -264,6 +783,39 @@ const char* Simulator::VRegNameForCode(unsigned code) { } +const char* Simulator::ZRegNameForCode(unsigned code) { + VIXL_ASSERT(code < kNumberOfZRegisters); + return zreg_names[code]; +} + + +const char* Simulator::PRegNameForCode(unsigned code) { + VIXL_ASSERT(code < kNumberOfPRegisters); + return preg_names[code]; +} + +SimVRegister Simulator::ExpandToSimVRegister(const SimPRegister& pg) { + SimVRegister ones, result; + dup_immediate(kFormatVnB, ones, 0xff); + mov_zeroing(kFormatVnB, result, pg, ones); + return result; +} + +void Simulator::ExtractFromSimVRegister(VectorFormat vform, + SimPRegister& pd, + SimVRegister vreg) { + SimVRegister zero; + dup_immediate(kFormatVnB, zero, 0); + SVEIntCompareVectorsHelper(ne, + vform, + pd, + GetPTrue(), + vreg, + zero, + false, + LeaveFlags); +} + #define COLOUR(colour_code) "\033[0;" colour_code "m" #define COLOUR_BOLD(colour_code) "\033[1;" colour_code "m" #define COLOUR_HIGHLIGHT "\033[43m" @@ -286,6 +838,8 @@ void Simulator::SetColouredTrace(bool value) { clr_reg_value = value ? COLOUR(CYAN) : ""; clr_vreg_name = value ? COLOUR_BOLD(MAGENTA) : ""; clr_vreg_value = value ? COLOUR(MAGENTA) : ""; + clr_preg_name = value ? COLOUR_BOLD(GREEN) : ""; + clr_preg_value = value ? COLOUR(GREEN) : ""; clr_memory_address = value ? COLOUR_BOLD(BLUE) : ""; clr_warning = value ? COLOUR_BOLD(YELLOW) : ""; clr_warning_message = value ? COLOUR(YELLOW) : ""; @@ -316,29 +870,29 @@ void Simulator::SetTraceParameters(int parameters) { } } - -void Simulator::SetInstructionStats(bool value) { - if (value != instruction_stats_) { - if (value) { - if (instrumentation_ == NULL) { - // Set the sample period to 10, as the VIXL examples and tests are - // short. - instrumentation_ = new Instrument("vixl_stats.csv", 10); - } - decoder_->AppendVisitor(instrumentation_); - } else if (instrumentation_ != NULL) { - decoder_->RemoveVisitor(instrumentation_); - } - instruction_stats_ = value; - } -} - // Helpers --------------------------------------------------------------------- uint64_t Simulator::AddWithCarry(unsigned reg_size, bool set_flags, uint64_t left, uint64_t right, int carry_in) { + std::pair result_and_flags = + AddWithCarry(reg_size, left, right, carry_in); + if (set_flags) { + uint8_t flags = result_and_flags.second; + ReadNzcv().SetN((flags >> 3) & 1); + ReadNzcv().SetZ((flags >> 2) & 1); + ReadNzcv().SetC((flags >> 1) & 1); + ReadNzcv().SetV((flags >> 0) & 1); + LogSystemRegister(NZCV); + } + return result_and_flags.first; +} + +std::pair Simulator::AddWithCarry(unsigned reg_size, + uint64_t left, + uint64_t right, + int carry_in) { VIXL_ASSERT((carry_in == 0) || (carry_in == 1)); VIXL_ASSERT((reg_size == kXRegSize) || (reg_size == kWRegSize)); @@ -350,68 +904,120 @@ uint64_t Simulator::AddWithCarry(unsigned reg_size, right &= reg_mask; uint64_t result = (left + right + carry_in) & reg_mask; - if (set_flags) { - ReadNzcv().SetN(CalcNFlag(result, reg_size)); - ReadNzcv().SetZ(CalcZFlag(result)); + // NZCV bits, ordered N in bit 3 to V in bit 0. + uint8_t nzcv = CalcNFlag(result, reg_size) ? 8 : 0; + nzcv |= CalcZFlag(result) ? 4 : 0; - // Compute the C flag by comparing the result to the max unsigned integer. - uint64_t max_uint_2op = max_uint - carry_in; - bool C = (left > max_uint_2op) || ((max_uint_2op - left) < right); - ReadNzcv().SetC(C ? 1 : 0); + // Compute the C flag by comparing the result to the max unsigned integer. + uint64_t max_uint_2op = max_uint - carry_in; + bool C = (left > max_uint_2op) || ((max_uint_2op - left) < right); + nzcv |= C ? 2 : 0; - // Overflow iff the sign bit is the same for the two inputs and different - // for the result. - uint64_t left_sign = left & sign_mask; - uint64_t right_sign = right & sign_mask; - uint64_t result_sign = result & sign_mask; - bool V = (left_sign == right_sign) && (left_sign != result_sign); - ReadNzcv().SetV(V ? 1 : 0); + // Overflow iff the sign bit is the same for the two inputs and different + // for the result. + uint64_t left_sign = left & sign_mask; + uint64_t right_sign = right & sign_mask; + uint64_t result_sign = result & sign_mask; + bool V = (left_sign == right_sign) && (left_sign != result_sign); + nzcv |= V ? 1 : 0; - LogSystemRegister(NZCV); - } - return result; + return std::make_pair(result, nzcv); +} + +using vixl_uint128_t = std::pair; + +vixl_uint128_t Simulator::Add128(vixl_uint128_t x, vixl_uint128_t y) { + std::pair sum_lo = + AddWithCarry(kXRegSize, x.second, y.second, 0); + int carry_in = (sum_lo.second & 0x2) >> 1; // C flag in NZCV result. + std::pair sum_hi = + AddWithCarry(kXRegSize, x.first, y.first, carry_in); + return std::make_pair(sum_hi.first, sum_lo.first); +} + +vixl_uint128_t Simulator::Neg128(vixl_uint128_t x) { + // Negate the integer value. Throw an assertion when the input is INT128_MIN. + VIXL_ASSERT((x.first != GetSignMask(64)) || (x.second != 0)); + x.first = ~x.first; + x.second = ~x.second; + return Add128(x, {0, 1}); } +vixl_uint128_t Simulator::Mul64(uint64_t x, uint64_t y) { + bool neg_result = false; + if ((x >> 63) == 1) { + x = -x; + neg_result = !neg_result; + } + if ((y >> 63) == 1) { + y = -y; + neg_result = !neg_result; + } + + uint64_t x_lo = x & 0xffffffff; + uint64_t x_hi = x >> 32; + uint64_t y_lo = y & 0xffffffff; + uint64_t y_hi = y >> 32; + + uint64_t t1 = x_lo * y_hi; + uint64_t t2 = x_hi * y_lo; + vixl_uint128_t a = std::make_pair(0, x_lo * y_lo); + vixl_uint128_t b = std::make_pair(t1 >> 32, t1 << 32); + vixl_uint128_t c = std::make_pair(t2 >> 32, t2 << 32); + vixl_uint128_t d = std::make_pair(x_hi * y_hi, 0); + + vixl_uint128_t result = Add128(a, b); + result = Add128(result, c); + result = Add128(result, d); + return neg_result ? std::make_pair(-result.first - 1, -result.second) + : result; +} int64_t Simulator::ShiftOperand(unsigned reg_size, - int64_t value, + uint64_t uvalue, Shift shift_type, unsigned amount) const { - VIXL_ASSERT((reg_size == kWRegSize) || (reg_size == kXRegSize)); - if (amount == 0) { - return value; - } - uint64_t uvalue = static_cast(value); - uint64_t mask = kWRegMask; - bool is_negative = (uvalue & kWSignMask) != 0; - if (reg_size == kXRegSize) { - mask = kXRegMask; - is_negative = (uvalue & kXSignMask) != 0; - } - - switch (shift_type) { - case LSL: - uvalue <<= amount; - break; - case LSR: - uvalue >>= amount; - break; - case ASR: - uvalue >>= amount; - if (is_negative) { - // Simulate sign-extension to 64 bits. - uvalue |= ~UINT64_C(0) << (reg_size - amount); + VIXL_ASSERT((reg_size == kBRegSize) || (reg_size == kHRegSize) || + (reg_size == kSRegSize) || (reg_size == kDRegSize)); + if (amount > 0) { + uint64_t mask = GetUintMask(reg_size); + bool is_negative = (uvalue & GetSignMask(reg_size)) != 0; + // The behavior is undefined in c++ if the shift amount greater than or + // equal to the register lane size. Work out the shifted result based on + // architectural behavior before performing the c++ type shift operations. + switch (shift_type) { + case LSL: + if (amount >= reg_size) { + return UINT64_C(0); + } + uvalue <<= amount; + break; + case LSR: + if (amount >= reg_size) { + return UINT64_C(0); + } + uvalue >>= amount; + break; + case ASR: + if (amount >= reg_size) { + return is_negative ? ~UINT64_C(0) : UINT64_C(0); + } + uvalue >>= amount; + if (is_negative) { + // Simulate sign-extension to 64 bits. + uvalue |= ~UINT64_C(0) << (reg_size - amount); + } + break; + case ROR: { + uvalue = RotateRight(uvalue, amount, reg_size); + break; } - break; - case ROR: { - uvalue = RotateRight(uvalue, amount, reg_size); - break; + default: + VIXL_UNIMPLEMENTED(); + return 0; } - default: - VIXL_UNIMPLEMENTED(); - return 0; + uvalue &= mask; } - uvalue &= mask; int64_t result; memcpy(&result, &uvalue, sizeof(result)); @@ -587,6 +1193,15 @@ Simulator::PrintRegisterFormat Simulator::GetPrintRegisterFormat( return kPrintReg1S; case kFormatD: return kPrintReg1D; + + case kFormatVnB: + return kPrintRegVnB; + case kFormatVnH: + return kPrintRegVnH; + case kFormatVnS: + return kPrintRegVnS; + case kFormatVnD: + return kPrintRegVnD; } } @@ -618,301 +1233,445 @@ Simulator::PrintRegisterFormat Simulator::GetPrintRegisterFormatFP( } } - -void Simulator::PrintWrittenRegisters() { +void Simulator::PrintRegisters() { for (unsigned i = 0; i < kNumberOfRegisters; i++) { - if (registers_[i].WrittenSinceLastLog()) PrintRegister(i); + if (i == kSpRegCode) i = kSPRegInternalCode; + PrintRegister(i); } } - -void Simulator::PrintWrittenVRegisters() { +void Simulator::PrintVRegisters() { for (unsigned i = 0; i < kNumberOfVRegisters; i++) { - // At this point there is no type information, so print as a raw 1Q. - if (vregisters_[i].WrittenSinceLastLog()) PrintVRegister(i, kPrintReg1Q); + PrintVRegister(i); } } - -void Simulator::PrintSystemRegisters() { - PrintSystemRegister(NZCV); - PrintSystemRegister(FPCR); +void Simulator::PrintZRegisters() { + for (unsigned i = 0; i < kNumberOfZRegisters; i++) { + PrintZRegister(i); + } } - -void Simulator::PrintRegisters() { +void Simulator::PrintWrittenRegisters() { for (unsigned i = 0; i < kNumberOfRegisters; i++) { - PrintRegister(i); + if (registers_[i].WrittenSinceLastLog()) { + if (i == kSpRegCode) i = kSPRegInternalCode; + PrintRegister(i); + } } } - -void Simulator::PrintVRegisters() { +void Simulator::PrintWrittenVRegisters() { + bool has_sve = GetCPUFeatures()->Has(CPUFeatures::kSVE); for (unsigned i = 0; i < kNumberOfVRegisters; i++) { - // At this point there is no type information, so print as a raw 1Q. - PrintVRegister(i, kPrintReg1Q); + if (vregisters_[i].WrittenSinceLastLog()) { + // Z registers are initialised in the constructor before the user can + // configure the CPU features, so we must also check for SVE here. + if (vregisters_[i].AccessedAsZSinceLastLog() && has_sve) { + PrintZRegister(i); + } else { + PrintVRegister(i); + } + } } } - -// Print a register's name and raw value. -// -// Only the least-significant `size_in_bytes` bytes of the register are printed, -// but the value is aligned as if the whole register had been printed. -// -// For typical register updates, size_in_bytes should be set to kXRegSizeInBytes -// -- the default -- so that the whole register is printed. Other values of -// size_in_bytes are intended for use when the register hasn't actually been -// updated (such as in PrintWrite). -// -// No newline is printed. This allows the caller to print more details (such as -// a memory access annotation). -void Simulator::PrintRegisterRawHelper(unsigned code, - Reg31Mode r31mode, - int size_in_bytes) { - // The template for all supported sizes. - // "# x{code}: 0xffeeddccbbaa9988" - // "# w{code}: 0xbbaa9988" - // "# w{code}<15:0>: 0x9988" - // "# w{code}<7:0>: 0x88" - unsigned padding_chars = (kXRegSizeInBytes - size_in_bytes) * 2; - - const char* name = ""; - const char* suffix = ""; - switch (size_in_bytes) { - case kXRegSizeInBytes: - name = XRegNameForCode(code, r31mode); - break; - case kWRegSizeInBytes: - name = WRegNameForCode(code, r31mode); - break; - case 2: - name = WRegNameForCode(code, r31mode); - suffix = "<15:0>"; - padding_chars -= strlen(suffix); - break; - case 1: - name = WRegNameForCode(code, r31mode); - suffix = "<7:0>"; - padding_chars -= strlen(suffix); - break; - default: - VIXL_UNREACHABLE(); - } - fprintf(stream_, "# %s%5s%s: ", clr_reg_name, name, suffix); - - // Print leading padding spaces. - VIXL_ASSERT(padding_chars < (kXRegSizeInBytes * 2)); - for (unsigned i = 0; i < padding_chars; i++) { - putc(' ', stream_); +void Simulator::PrintWrittenPRegisters() { + // P registers are initialised in the constructor before the user can + // configure the CPU features, so we must check for SVE here. + if (!GetCPUFeatures()->Has(CPUFeatures::kSVE)) return; + for (unsigned i = 0; i < kNumberOfPRegisters; i++) { + if (pregisters_[i].WrittenSinceLastLog()) { + PrintPRegister(i); + } } - - // Print the specified bits in hexadecimal format. - uint64_t bits = ReadRegister(code, r31mode); - bits &= kXRegMask >> ((kXRegSizeInBytes - size_in_bytes) * 8); - VIXL_STATIC_ASSERT(sizeof(bits) == kXRegSizeInBytes); - - int chars = size_in_bytes * 2; - fprintf(stream_, - "%s0x%0*" PRIx64 "%s", - clr_reg_value, - chars, - bits, - clr_normal); + if (ReadFFR().WrittenSinceLastLog()) PrintFFR(); } - -void Simulator::PrintRegister(unsigned code, Reg31Mode r31mode) { - registers_[code].NotifyRegisterLogged(); - - // Don't print writes into xzr. - if ((code == kZeroRegCode) && (r31mode == Reg31IsZeroRegister)) { - return; - } - - // The template for all x and w registers: - // "# x{code}: 0x{value}" - // "# w{code}: 0x{value}" - - PrintRegisterRawHelper(code, r31mode); - fprintf(stream_, "\n"); +void Simulator::PrintSystemRegisters() { + PrintSystemRegister(NZCV); + PrintSystemRegister(FPCR); } - -// Print a register's name and raw value. -// -// The `bytes` and `lsb` arguments can be used to limit the bytes that are -// printed. These arguments are intended for use in cases where register hasn't -// actually been updated (such as in PrintVWrite). -// -// No newline is printed. This allows the caller to print more details (such as -// a floating-point interpretation or a memory access annotation). -void Simulator::PrintVRegisterRawHelper(unsigned code, int bytes, int lsb) { - // The template for vector types: - // "# v{code}: 0xffeeddccbbaa99887766554433221100". - // An example with bytes=4 and lsb=8: - // "# v{code}: 0xbbaa9988 ". - fprintf(stream_, - "# %s%5s: %s", - clr_vreg_name, - VRegNameForCode(code), - clr_vreg_value); - - int msb = lsb + bytes - 1; - int byte = kQRegSizeInBytes - 1; - - // Print leading padding spaces. (Two spaces per byte.) - while (byte > msb) { +void Simulator::PrintRegisterValue(const uint8_t* value, + int value_size, + PrintRegisterFormat format) { + int print_width = GetPrintRegSizeInBytes(format); + VIXL_ASSERT(print_width <= value_size); + for (int i = value_size - 1; i >= print_width; i--) { + // Pad with spaces so that values align vertically. fprintf(stream_, " "); - byte--; + // If we aren't explicitly printing a partial value, ensure that the + // unprinted bits are zero. + VIXL_ASSERT(((format & kPrintRegPartial) != 0) || (value[i] == 0)); } - - // Print the specified part of the value, byte by byte. - qreg_t rawbits = ReadQRegister(code); fprintf(stream_, "0x"); - while (byte >= lsb) { - fprintf(stream_, "%02x", rawbits.val[byte]); - byte--; + for (int i = print_width - 1; i >= 0; i--) { + fprintf(stream_, "%02x", value[i]); } +} - // Print trailing padding spaces. - while (byte >= 0) { - fprintf(stream_, " "); - byte--; +void Simulator::PrintRegisterValueFPAnnotations(const uint8_t* value, + uint16_t lane_mask, + PrintRegisterFormat format) { + VIXL_ASSERT((format & kPrintRegAsFP) != 0); + int lane_size = GetPrintRegLaneSizeInBytes(format); + fprintf(stream_, " ("); + bool last_inactive = false; + const char* sep = ""; + for (int i = GetPrintRegLaneCount(format) - 1; i >= 0; i--, sep = ", ") { + bool access = (lane_mask & (1 << (i * lane_size))) != 0; + if (access) { + // Read the lane as a double, so we can format all FP types in the same + // way. We squash NaNs, and a double can exactly represent any other value + // that the smaller types can represent, so this is lossless. + double element; + switch (lane_size) { + case kHRegSizeInBytes: { + Float16 element_fp16; + VIXL_STATIC_ASSERT(sizeof(element_fp16) == kHRegSizeInBytes); + memcpy(&element_fp16, &value[i * lane_size], sizeof(element_fp16)); + element = FPToDouble(element_fp16, kUseDefaultNaN); + break; + } + case kSRegSizeInBytes: { + float element_fp32; + memcpy(&element_fp32, &value[i * lane_size], sizeof(element_fp32)); + element = static_cast(element_fp32); + break; + } + case kDRegSizeInBytes: { + memcpy(&element, &value[i * lane_size], sizeof(element)); + break; + } + default: + VIXL_UNREACHABLE(); + fprintf(stream_, "{UnknownFPValue}"); + continue; + } + if (IsNaN(element)) { + // The fprintf behaviour for NaNs is implementation-defined. Always + // print "nan", so that traces are consistent. + fprintf(stream_, "%s%snan%s", sep, clr_vreg_value, clr_normal); + } else { + fprintf(stream_, + "%s%s%#.4g%s", + sep, + clr_vreg_value, + element, + clr_normal); + } + last_inactive = false; + } else if (!last_inactive) { + // Replace each contiguous sequence of inactive lanes with "...". + fprintf(stream_, "%s...", sep); + last_inactive = true; + } } - fprintf(stream_, "%s", clr_normal); + fprintf(stream_, ")"); } +void Simulator::PrintRegister(int code, + PrintRegisterFormat format, + const char* suffix) { + VIXL_ASSERT((static_cast(code) < kNumberOfRegisters) || + (static_cast(code) == kSPRegInternalCode)); + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsScalar); + VIXL_ASSERT((format & kPrintRegAsFP) == 0); -// Print each of the specified lanes of a register as a float or double value. -// -// The `lane_count` and `lslane` arguments can be used to limit the lanes that -// are printed. These arguments are intended for use in cases where register -// hasn't actually been updated (such as in PrintVWrite). -// -// No newline is printed. This allows the caller to print more details (such as -// a memory access annotation). -void Simulator::PrintVRegisterFPHelper(unsigned code, - unsigned lane_size_in_bytes, - int lane_count, - int rightmost_lane) { - VIXL_ASSERT((lane_size_in_bytes == kHRegSizeInBytes) || - (lane_size_in_bytes == kSRegSizeInBytes) || - (lane_size_in_bytes == kDRegSizeInBytes)); - - unsigned msb = ((lane_count + rightmost_lane) * lane_size_in_bytes); - VIXL_ASSERT(msb <= kQRegSizeInBytes); - - // For scalar types ((lane_count == 1) && (rightmost_lane == 0)), a register - // name is used: - // " (h{code}: {value})" - // " (s{code}: {value})" - // " (d{code}: {value})" - // For vector types, "..." is used to represent one or more omitted lanes. - // " (..., {value}, {value}, ...)" - if (lane_size_in_bytes == kHRegSizeInBytes) { - // TODO: Trace tests will fail until we regenerate them. - return; - } - if ((lane_count == 1) && (rightmost_lane == 0)) { - const char* name; - switch (lane_size_in_bytes) { - case kHRegSizeInBytes: - name = HRegNameForCode(code); - break; - case kSRegSizeInBytes: - name = SRegNameForCode(code); + SimRegister* reg; + SimRegister zero; + if (code == kZeroRegCode) { + reg = &zero; + } else { + // registers_[31] holds the SP. + VIXL_STATIC_ASSERT((kSPRegInternalCode % kNumberOfRegisters) == 31); + reg = ®isters_[code % kNumberOfRegisters]; + } + + // We trace register writes as whole register values, implying that any + // unprinted bits are all zero: + // "# x{code}: 0x{-----value----}" + // "# w{code}: 0x{-value}" + // Stores trace partial register values, implying nothing about the unprinted + // bits: + // "# x{code}<63:0>: 0x{-----value----}" + // "# x{code}<31:0>: 0x{-value}" + // "# x{code}<15:0>: 0x{--}" + // "# x{code}<7:0>: 0x{}" + + bool is_partial = (format & kPrintRegPartial) != 0; + unsigned print_reg_size = GetPrintRegSizeInBits(format); + std::stringstream name; + if (is_partial) { + name << XRegNameForCode(code) << GetPartialRegSuffix(format); + } else { + // Notify the register that it has been logged, but only if we're printing + // all of it. + reg->NotifyRegisterLogged(); + switch (print_reg_size) { + case kWRegSize: + name << WRegNameForCode(code); break; - case kDRegSizeInBytes: - name = DRegNameForCode(code); + case kXRegSize: + name << XRegNameForCode(code); break; default: - name = NULL; VIXL_UNREACHABLE(); - } - fprintf(stream_, " (%s%s: ", clr_vreg_name, name); - } else { - if (msb < (kQRegSizeInBytes - 1)) { - fprintf(stream_, " (..., "); - } else { - fprintf(stream_, " ("); + return; } } - // Print the list of values. - const char* separator = ""; - int leftmost_lane = rightmost_lane + lane_count - 1; - for (int lane = leftmost_lane; lane >= rightmost_lane; lane--) { - double value; - switch (lane_size_in_bytes) { - case kHRegSizeInBytes: - value = ReadVRegister(code).GetLane(lane); + fprintf(stream_, + "# %s%*s: %s", + clr_reg_name, + kPrintRegisterNameFieldWidth, + name.str().c_str(), + clr_reg_value); + PrintRegisterValue(*reg, format); + fprintf(stream_, "%s%s", clr_normal, suffix); +} + +void Simulator::PrintVRegister(int code, + PrintRegisterFormat format, + const char* suffix) { + VIXL_ASSERT(static_cast(code) < kNumberOfVRegisters); + VIXL_ASSERT(((format & kPrintRegAsVectorMask) == kPrintRegAsScalar) || + ((format & kPrintRegAsVectorMask) == kPrintRegAsDVector) || + ((format & kPrintRegAsVectorMask) == kPrintRegAsQVector)); + + // We trace register writes as whole register values, implying that any + // unprinted bits are all zero: + // "# v{code}: 0x{-------------value------------}" + // "# d{code}: 0x{-----value----}" + // "# s{code}: 0x{-value}" + // "# h{code}: 0x{--}" + // "# b{code}: 0x{}" + // Stores trace partial register values, implying nothing about the unprinted + // bits: + // "# v{code}<127:0>: 0x{-------------value------------}" + // "# v{code}<63:0>: 0x{-----value----}" + // "# v{code}<31:0>: 0x{-value}" + // "# v{code}<15:0>: 0x{--}" + // "# v{code}<7:0>: 0x{}" + + bool is_partial = ((format & kPrintRegPartial) != 0); + std::stringstream name; + unsigned print_reg_size = GetPrintRegSizeInBits(format); + if (is_partial) { + name << VRegNameForCode(code) << GetPartialRegSuffix(format); + } else { + // Notify the register that it has been logged, but only if we're printing + // all of it. + vregisters_[code].NotifyRegisterLogged(); + switch (print_reg_size) { + case kBRegSize: + name << BRegNameForCode(code); break; - case kSRegSizeInBytes: - value = ReadVRegister(code).GetLane(lane); + case kHRegSize: + name << HRegNameForCode(code); break; - case kDRegSizeInBytes: - value = ReadVRegister(code).GetLane(lane); + case kSRegSize: + name << SRegNameForCode(code); + break; + case kDRegSize: + name << DRegNameForCode(code); + break; + case kQRegSize: + name << VRegNameForCode(code); break; default: - value = 0.0; VIXL_UNREACHABLE(); + return; } - if (IsNaN(value)) { - // The output for NaNs is implementation defined. Always print `nan`, so - // that traces are coherent across different implementations. - fprintf(stream_, "%s%snan%s", separator, clr_vreg_value, clr_normal); - } else { - fprintf(stream_, - "%s%s%#g%s", - separator, - clr_vreg_value, - value, - clr_normal); - } - separator = ", "; } - if (rightmost_lane > 0) { - fprintf(stream_, ", ..."); + fprintf(stream_, + "# %s%*s: %s", + clr_vreg_name, + kPrintRegisterNameFieldWidth, + name.str().c_str(), + clr_vreg_value); + PrintRegisterValue(vregisters_[code], format); + fprintf(stream_, "%s", clr_normal); + if ((format & kPrintRegAsFP) != 0) { + PrintRegisterValueFPAnnotations(vregisters_[code], format); + } + fprintf(stream_, "%s", suffix); +} + +void Simulator::PrintVRegistersForStructuredAccess(int rt_code, + int reg_count, + uint16_t focus_mask, + PrintRegisterFormat format) { + bool print_fp = (format & kPrintRegAsFP) != 0; + // Suppress FP formatting, so we can specify the lanes we're interested in. + PrintRegisterFormat format_no_fp = + static_cast(format & ~kPrintRegAsFP); + + for (int r = 0; r < reg_count; r++) { + int code = (rt_code + r) % kNumberOfVRegisters; + PrintVRegister(code, format_no_fp, ""); + if (print_fp) { + PrintRegisterValueFPAnnotations(vregisters_[code], focus_mask, format); + } + fprintf(stream_, "\n"); } - fprintf(stream_, ")"); } +void Simulator::PrintZRegistersForStructuredAccess(int rt_code, + int q_index, + int reg_count, + uint16_t focus_mask, + PrintRegisterFormat format) { + bool print_fp = (format & kPrintRegAsFP) != 0; + // Suppress FP formatting, so we can specify the lanes we're interested in. + PrintRegisterFormat format_no_fp = + static_cast(format & ~kPrintRegAsFP); + + PrintRegisterFormat format_q = GetPrintRegAsQChunkOfSVE(format); + + const unsigned size = kQRegSizeInBytes; + unsigned byte_index = q_index * size; + const uint8_t* value = vregisters_[rt_code].GetBytes() + byte_index; + VIXL_ASSERT((byte_index + size) <= vregisters_[rt_code].GetSizeInBytes()); + + for (int r = 0; r < reg_count; r++) { + int code = (rt_code + r) % kNumberOfZRegisters; + PrintPartialZRegister(code, q_index, format_no_fp, ""); + if (print_fp) { + PrintRegisterValueFPAnnotations(value, focus_mask, format_q); + } + fprintf(stream_, "\n"); + } +} -void Simulator::PrintVRegister(unsigned code, PrintRegisterFormat format) { +void Simulator::PrintZRegister(int code, PrintRegisterFormat format) { + // We're going to print the register in parts, so force a partial format. + format = GetPrintRegPartial(format); + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + for (unsigned i = 0; i < (vl / kQRegSize); i++) { + PrintPartialZRegister(code, i, format); + } vregisters_[code].NotifyRegisterLogged(); +} - int lane_size_log2 = format & kPrintRegLaneSizeMask; +void Simulator::PrintPRegister(int code, PrintRegisterFormat format) { + // We're going to print the register in parts, so force a partial format. + format = GetPrintRegPartial(format); + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + for (unsigned i = 0; i < (vl / kQRegSize); i++) { + PrintPartialPRegister(code, i, format); + } + pregisters_[code].NotifyRegisterLogged(); +} - int reg_size_log2; - if (format & kPrintRegAsQVector) { - reg_size_log2 = kQRegSizeInBytesLog2; - } else if (format & kPrintRegAsDVector) { - reg_size_log2 = kDRegSizeInBytesLog2; - } else { - // Scalar types. - reg_size_log2 = lane_size_log2; +void Simulator::PrintFFR(PrintRegisterFormat format) { + // We're going to print the register in parts, so force a partial format. + format = GetPrintRegPartial(format); + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + SimPRegister& ffr = ReadFFR(); + for (unsigned i = 0; i < (vl / kQRegSize); i++) { + PrintPartialPRegister("FFR", ffr, i, format); } + ffr.NotifyRegisterLogged(); +} + +void Simulator::PrintPartialZRegister(int code, + int q_index, + PrintRegisterFormat format, + const char* suffix) { + VIXL_ASSERT(static_cast(code) < kNumberOfZRegisters); + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + VIXL_ASSERT((format & kPrintRegPartial) != 0); + VIXL_ASSERT((q_index * kQRegSize) < GetVectorLengthInBits()); + + // We _only_ trace partial Z register values in Q-sized chunks, because + // they're often too large to reasonably fit on a single line. Each line + // implies nothing about the unprinted bits. + // "# z{code}<127:0>: 0x{-------------value------------}" - int lane_count = 1 << (reg_size_log2 - lane_size_log2); - int lane_size = 1 << lane_size_log2; + format = GetPrintRegAsQChunkOfSVE(format); - // The template for vector types: - // "# v{code}: 0x{rawbits} (..., {value}, ...)". - // The template for scalar types: - // "# v{code}: 0x{rawbits} ({reg}:{value})". - // The values in parentheses after the bit representations are floating-point - // interpretations. They are displayed only if the kPrintVRegAsFP bit is set. + const unsigned size = kQRegSizeInBytes; + unsigned byte_index = q_index * size; + const uint8_t* value = vregisters_[code].GetBytes() + byte_index; + VIXL_ASSERT((byte_index + size) <= vregisters_[code].GetSizeInBytes()); - PrintVRegisterRawHelper(code); - if (format & kPrintRegAsFP) { - PrintVRegisterFPHelper(code, lane_size, lane_count); + int lsb = q_index * kQRegSize; + int msb = lsb + kQRegSize - 1; + std::stringstream name; + name << ZRegNameForCode(code) << '<' << msb << ':' << lsb << '>'; + + fprintf(stream_, + "# %s%*s: %s", + clr_vreg_name, + kPrintRegisterNameFieldWidth, + name.str().c_str(), + clr_vreg_value); + PrintRegisterValue(value, size, format); + fprintf(stream_, "%s", clr_normal); + if ((format & kPrintRegAsFP) != 0) { + PrintRegisterValueFPAnnotations(value, GetPrintRegLaneMask(format), format); } + fprintf(stream_, "%s", suffix); +} + +void Simulator::PrintPartialPRegister(const char* name, + const SimPRegister& reg, + int q_index, + PrintRegisterFormat format, + const char* suffix) { + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + VIXL_ASSERT((format & kPrintRegPartial) != 0); + VIXL_ASSERT((q_index * kQRegSize) < GetVectorLengthInBits()); + + // We don't currently use the format for anything here. + USE(format); + + // We _only_ trace partial P register values, because they're often too large + // to reasonably fit on a single line. Each line implies nothing about the + // unprinted bits. + // + // We print values in binary, with spaces between each bit, in order for the + // bits to align with the Z register bytes that they predicate. + // "# {name}<15:0>: 0b{-------------value------------}" - fprintf(stream_, "\n"); + int print_size_in_bits = kQRegSize / kZRegBitsPerPRegBit; + int lsb = q_index * print_size_in_bits; + int msb = lsb + print_size_in_bits - 1; + std::stringstream prefix; + prefix << name << '<' << msb << ':' << lsb << '>'; + + fprintf(stream_, + "# %s%*s: %s0b", + clr_preg_name, + kPrintRegisterNameFieldWidth, + prefix.str().c_str(), + clr_preg_value); + for (int i = msb; i >= lsb; i--) { + fprintf(stream_, " %c", reg.GetBit(i) ? '1' : '0'); + } + fprintf(stream_, "%s%s", clr_normal, suffix); } +void Simulator::PrintPartialPRegister(int code, + int q_index, + PrintRegisterFormat format, + const char* suffix) { + VIXL_ASSERT(static_cast(code) < kNumberOfPRegisters); + PrintPartialPRegister(PRegNameForCode(code), + pregisters_[code], + q_index, + format, + suffix); +} void Simulator::PrintSystemRegister(SystemRegister id) { switch (id) { @@ -949,90 +1708,373 @@ void Simulator::PrintSystemRegister(SystemRegister id) { } } - -void Simulator::PrintRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format) { - registers_[reg_code].NotifyRegisterLogged(); - - USE(format); - - // The template is "# {reg}: 0x{value} <- {address}". - PrintRegisterRawHelper(reg_code, Reg31IsZeroRegister); +uint16_t Simulator::PrintPartialAccess(uint16_t access_mask, + uint16_t future_access_mask, + int struct_element_count, + int lane_size_in_bytes, + const char* op, + uintptr_t address, + int reg_size_in_bytes) { + // We want to assume that we'll access at least one lane. + VIXL_ASSERT(access_mask != 0); + VIXL_ASSERT((reg_size_in_bytes == kXRegSizeInBytes) || + (reg_size_in_bytes == kQRegSizeInBytes)); + bool started_annotation = false; + // Indent to match the register field, the fixed formatting, and the value + // prefix ("0x"): "# {name}: 0x" + fprintf(stream_, "# %*s ", kPrintRegisterNameFieldWidth, ""); + // First, annotate the lanes (byte by byte). + for (int lane = reg_size_in_bytes - 1; lane >= 0; lane--) { + bool access = (access_mask & (1 << lane)) != 0; + bool future = (future_access_mask & (1 << lane)) != 0; + if (started_annotation) { + // If we've started an annotation, draw a horizontal line in addition to + // any other symbols. + if (access) { + fprintf(stream_, "─╨"); + } else if (future) { + fprintf(stream_, "─║"); + } else { + fprintf(stream_, "──"); + } + } else { + if (access) { + started_annotation = true; + fprintf(stream_, " ╙"); + } else if (future) { + fprintf(stream_, " ║"); + } else { + fprintf(stream_, " "); + } + } + } + VIXL_ASSERT(started_annotation); + fprintf(stream_, "─ 0x"); + int lane_size_in_nibbles = lane_size_in_bytes * 2; + // Print the most-significant struct element first. + const char* sep = ""; + for (int i = struct_element_count - 1; i >= 0; i--) { + int offset = lane_size_in_bytes * i; + uint64_t nibble = MemReadUint(lane_size_in_bytes, address + offset); + fprintf(stream_, "%s%0*" PRIx64, sep, lane_size_in_nibbles, nibble); + sep = "'"; + } fprintf(stream_, - " <- %s0x%016" PRIxPTR "%s\n", + " %s %s0x%016" PRIxPTR "%s\n", + op, clr_memory_address, address, clr_normal); + return future_access_mask & ~access_mask; } +void Simulator::PrintAccess(int code, + PrintRegisterFormat format, + const char* op, + uintptr_t address) { + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + if ((format & kPrintRegPartial) == 0) { + if (code != kZeroRegCode) { + registers_[code].NotifyRegisterLogged(); + } + } + // Scalar-format accesses use a simple format: + // "# {reg}: 0x{value} -> {address}" -void Simulator::PrintVRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format, - unsigned lane) { - vregisters_[reg_code].NotifyRegisterLogged(); - - // The template is "# v{code}: 0x{rawbits} <- address". - PrintVRegisterRawHelper(reg_code); - if (format & kPrintRegAsFP) { - PrintVRegisterFPHelper(reg_code, - GetPrintRegLaneSizeInBytes(format), - GetPrintRegLaneCount(format), - lane); - } + // Suppress the newline, so the access annotation goes on the same line. + PrintRegister(code, format, ""); fprintf(stream_, - " <- %s0x%016" PRIxPTR "%s\n", + " %s %s0x%016" PRIxPTR "%s\n", + op, clr_memory_address, address, clr_normal); } +void Simulator::PrintVAccess(int code, + PrintRegisterFormat format, + const char* op, + uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); -void Simulator::PrintWrite(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format) { - VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + // Scalar-format accesses use a simple format: + // "# v{code}: 0x{value} -> {address}" - // The template is "# v{code}: 0x{value} -> {address}". To keep the trace tidy - // and readable, the value is aligned with the values in the register trace. - PrintRegisterRawHelper(reg_code, - Reg31IsZeroRegister, - GetPrintRegSizeInBytes(format)); + // Suppress the newline, so the access annotation goes on the same line. + PrintVRegister(code, format, ""); fprintf(stream_, - " -> %s0x%016" PRIxPTR "%s\n", + " %s %s0x%016" PRIxPTR "%s\n", + op, clr_memory_address, address, clr_normal); } +void Simulator::PrintVStructAccess(int rt_code, + int reg_count, + PrintRegisterFormat format, + const char* op, + uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + + // For example: + // "# v{code}: 0x{value}" + // "# ...: 0x{value}" + // "# ║ ╙─ {struct_value} -> {lowest_address}" + // "# ╙───── {struct_value} -> {highest_address}" + + uint16_t lane_mask = GetPrintRegLaneMask(format); + PrintVRegistersForStructuredAccess(rt_code, reg_count, lane_mask, format); + + int reg_size_in_bytes = GetPrintRegSizeInBytes(format); + int lane_size_in_bytes = GetPrintRegLaneSizeInBytes(format); + for (int i = 0; i < reg_size_in_bytes; i += lane_size_in_bytes) { + uint16_t access_mask = 1 << i; + VIXL_ASSERT((lane_mask & access_mask) != 0); + lane_mask = PrintPartialAccess(access_mask, + lane_mask, + reg_count, + lane_size_in_bytes, + op, + address + (i * reg_count)); + } +} + +void Simulator::PrintVSingleStructAccess(int rt_code, + int reg_count, + int lane, + PrintRegisterFormat format, + const char* op, + uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + + // For example: + // "# v{code}: 0x{value}" + // "# ...: 0x{value}" + // "# ╙───── {struct_value} -> {address}" + + int lane_size_in_bytes = GetPrintRegLaneSizeInBytes(format); + uint16_t lane_mask = 1 << (lane * lane_size_in_bytes); + PrintVRegistersForStructuredAccess(rt_code, reg_count, lane_mask, format); + PrintPartialAccess(lane_mask, 0, reg_count, lane_size_in_bytes, op, address); +} + +void Simulator::PrintVReplicatingStructAccess(int rt_code, + int reg_count, + PrintRegisterFormat format, + const char* op, + uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + + // For example: + // "# v{code}: 0x{value}" + // "# ...: 0x{value}" + // "# ╙─╨─╨─╨─ {struct_value} -> {address}" + + int lane_size_in_bytes = GetPrintRegLaneSizeInBytes(format); + uint16_t lane_mask = GetPrintRegLaneMask(format); + PrintVRegistersForStructuredAccess(rt_code, reg_count, lane_mask, format); + PrintPartialAccess(lane_mask, 0, reg_count, lane_size_in_bytes, op, address); +} + +void Simulator::PrintZAccess(int rt_code, const char* op, uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + + // Scalar-format accesses are split into separate chunks, each of which uses a + // simple format: + // "# z{code}<127:0>: 0x{value} -> {address}" + // "# z{code}<255:128>: 0x{value} -> {address + 16}" + // "# z{code}<383:256>: 0x{value} -> {address + 32}" + // etc + + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + for (unsigned q_index = 0; q_index < (vl / kQRegSize); q_index++) { + // Suppress the newline, so the access annotation goes on the same line. + PrintPartialZRegister(rt_code, q_index, kPrintRegVnQPartial, ""); + fprintf(stream_, + " %s %s0x%016" PRIxPTR "%s\n", + op, + clr_memory_address, + address, + clr_normal); + address += kQRegSizeInBytes; + } +} + +void Simulator::PrintZStructAccess(int rt_code, + int reg_count, + const LogicPRegister& pg, + PrintRegisterFormat format, + int msize_in_bytes, + const char* op, + const LogicSVEAddressVector& addr) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); + + // For example: + // "# z{code}<255:128>: 0x{value}" + // "# ...<255:128>: 0x{value}" + // "# ║ ╙─ {struct_value} -> {first_address}" + // "# ╙───── {struct_value} -> {last_address}" + + // We're going to print the register in parts, so force a partial format. + bool skip_inactive_chunks = (format & kPrintRegPartial) != 0; + format = GetPrintRegPartial(format); + + int esize_in_bytes = GetPrintRegLaneSizeInBytes(format); + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + int lanes_per_q = kQRegSizeInBytes / esize_in_bytes; + for (unsigned q_index = 0; q_index < (vl / kQRegSize); q_index++) { + uint16_t pred = + pg.GetActiveMask(q_index) & GetPrintRegLaneMask(format); + if ((pred == 0) && skip_inactive_chunks) continue; + + PrintZRegistersForStructuredAccess(rt_code, + q_index, + reg_count, + pred, + format); + if (pred == 0) { + // This register chunk has no active lanes. The loop below would print + // nothing, so leave a blank line to keep structures grouped together. + fprintf(stream_, "#\n"); + continue; + } + for (int i = 0; i < lanes_per_q; i++) { + uint16_t access = 1 << (i * esize_in_bytes); + int lane = (q_index * lanes_per_q) + i; + // Skip inactive lanes. + if ((pred & access) == 0) continue; + pred = PrintPartialAccess(access, + pred, + reg_count, + msize_in_bytes, + op, + addr.GetStructAddress(lane)); + } + } + + // We print the whole register, even for stores. + for (int i = 0; i < reg_count; i++) { + vregisters_[(rt_code + i) % kNumberOfZRegisters].NotifyRegisterLogged(); + } +} + +void Simulator::PrintPAccess(int code, const char* op, uintptr_t address) { + VIXL_ASSERT((strcmp(op, "->") == 0) || (strcmp(op, "<-") == 0)); -void Simulator::PrintVWrite(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format, - unsigned lane) { - // The templates: - // "# v{code}: 0x{rawbits} -> {address}" - // "# v{code}: 0x{rawbits} (..., {value}, ...) -> {address}". - // "# v{code}: 0x{rawbits} ({reg}:{value}) -> {address}" - // Because this trace doesn't represent a change to the source register's - // value, only the relevant part of the value is printed. To keep the trace - // tidy and readable, the raw value is aligned with the other values in the - // register trace. - int lane_count = GetPrintRegLaneCount(format); - int lane_size = GetPrintRegLaneSizeInBytes(format); - int reg_size = GetPrintRegSizeInBytes(format); - PrintVRegisterRawHelper(reg_code, reg_size, lane_size * lane); - if (format & kPrintRegAsFP) { - PrintVRegisterFPHelper(reg_code, lane_size, lane_count, lane); + // Scalar-format accesses are split into separate chunks, each of which uses a + // simple format: + // "# p{code}<15:0>: 0b{value} -> {address}" + // "# p{code}<31:16>: 0b{value} -> {address + 2}" + // "# p{code}<47:32>: 0b{value} -> {address + 4}" + // etc + + int vl = GetVectorLengthInBits(); + VIXL_ASSERT((vl % kQRegSize) == 0); + for (unsigned q_index = 0; q_index < (vl / kQRegSize); q_index++) { + // Suppress the newline, so the access annotation goes on the same line. + PrintPartialPRegister(code, q_index, kPrintRegVnQPartial, ""); + fprintf(stream_, + " %s %s0x%016" PRIxPTR "%s\n", + op, + clr_memory_address, + address, + clr_normal); + address += kQRegSizeInBytes; } +} + +void Simulator::PrintMemTransfer(uintptr_t dst, uintptr_t src, uint8_t value) { fprintf(stream_, - " -> %s0x%016" PRIxPTR "%s\n", + "# %s: %s0x%016" PRIxPTR " %s<- %s0x%02x%s", + clr_reg_name, clr_memory_address, - address, + dst, + clr_normal, + clr_reg_value, + value, + clr_normal); + + fprintf(stream_, + " <- %s0x%016" PRIxPTR "%s\n", + clr_memory_address, + src, clr_normal); } +void Simulator::PrintRead(int rt_code, + PrintRegisterFormat format, + uintptr_t address) { + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + if (rt_code != kZeroRegCode) { + registers_[rt_code].NotifyRegisterLogged(); + } + PrintAccess(rt_code, format, "<-", address); +} + +void Simulator::PrintExtendingRead(int rt_code, + PrintRegisterFormat format, + int access_size_in_bytes, + uintptr_t address) { + int reg_size_in_bytes = GetPrintRegSizeInBytes(format); + if (access_size_in_bytes == reg_size_in_bytes) { + // There is no extension here, so print a simple load. + PrintRead(rt_code, format, address); + return; + } + VIXL_ASSERT(access_size_in_bytes < reg_size_in_bytes); + + // For sign- and zero-extension, make it clear that the resulting register + // value is different from what is loaded from memory. + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + if (rt_code != kZeroRegCode) { + registers_[rt_code].NotifyRegisterLogged(); + } + PrintRegister(rt_code, format); + PrintPartialAccess(1, + 0, + 1, + access_size_in_bytes, + "<-", + address, + kXRegSizeInBytes); +} + +void Simulator::PrintVRead(int rt_code, + PrintRegisterFormat format, + uintptr_t address) { + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + vregisters_[rt_code].NotifyRegisterLogged(); + PrintVAccess(rt_code, format, "<-", address); +} + +void Simulator::PrintWrite(int rt_code, + PrintRegisterFormat format, + uintptr_t address) { + // Because this trace doesn't represent a change to the source register's + // value, only print the relevant part of the value. + format = GetPrintRegPartial(format); + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + if (rt_code != kZeroRegCode) { + registers_[rt_code].NotifyRegisterLogged(); + } + PrintAccess(rt_code, format, "->", address); +} + +void Simulator::PrintVWrite(int rt_code, + PrintRegisterFormat format, + uintptr_t address) { + // Because this trace doesn't represent a change to the source register's + // value, only print the relevant part of the value. + format = GetPrintRegPartial(format); + // It only makes sense to write scalar values here. Vectors are handled by + // PrintVStructAccess. + VIXL_ASSERT(GetPrintRegLaneCount(format) == 1); + PrintVAccess(rt_code, format, "->", address); +} void Simulator::PrintTakenBranch(const Instruction* target) { fprintf(stream_, @@ -1042,3680 +2084,8775 @@ void Simulator::PrintTakenBranch(const Instruction* target) { reinterpret_cast(target)); } - // Visitors--------------------------------------------------------------------- -void Simulator::VisitUnimplemented(const Instruction* instr) { - printf("Unimplemented instruction at %p: 0x%08" PRIx32 "\n", - reinterpret_cast(instr), - instr->GetInstructionBits()); - VIXL_UNIMPLEMENTED(); -} - -void Simulator::VisitUnallocated(const Instruction* instr) { - printf("Unallocated instruction at %p: 0x%08" PRIx32 "\n", - reinterpret_cast(instr), - instr->GetInstructionBits()); - VIXL_UNIMPLEMENTED(); +void Simulator::Visit(Metadata* metadata, const Instruction* instr) { + VIXL_ASSERT(metadata->count("form") > 0); + std::string form = (*metadata)["form"]; + form_hash_ = Hash(form.c_str()); + const FormToVisitorFnMap* fv = Simulator::GetFormToVisitorFnMap(); + FormToVisitorFnMap::const_iterator it = fv->find(form_hash_); + if (it == fv->end()) { + VisitUnimplemented(instr); + } else { + (it->second)(this, instr); + } } +void Simulator::Simulate_PdT_PgZ_ZnT_ZmT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitPCRelAddressing(const Instruction* instr) { - VIXL_ASSERT((instr->Mask(PCRelAddressingMask) == ADR) || - (instr->Mask(PCRelAddressingMask) == ADRP)); - - WriteRegister(instr->GetRd(), instr->GetImmPCOffsetTarget()); + switch (form_hash_) { + case "match_p_p_zz"_h: + match(vform, pd, zn, zm, /* negate_match = */ false); + break; + case "nmatch_p_p_zz"_h: + match(vform, pd, zn, zm, /* negate_match = */ true); + break; + default: + VIXL_UNIMPLEMENTED(); + } + mov_zeroing(pd, pg, pd); + PredTest(vform, pg, pd); } +void Simulator::Simulate_PdT_Xn_Xm(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + uint64_t src1 = ReadXRegister(instr->GetRn()); + uint64_t src2 = ReadXRegister(instr->GetRm()); -void Simulator::VisitUnconditionalBranch(const Instruction* instr) { - switch (instr->Mask(UnconditionalBranchMask)) { - case BL: - WriteLr(instr->GetNextInstruction()); - VIXL_FALLTHROUGH(); - case B: - WritePc(instr->GetImmPCOffsetTarget()); + uint64_t absdiff = (src1 > src2) ? (src1 - src2) : (src2 - src1); + absdiff >>= LaneSizeInBytesLog2FromFormat(vform); + + bool no_conflict = false; + switch (form_hash_) { + case "whilerw_p_rr"_h: + no_conflict = (absdiff == 0); + break; + case "whilewr_p_rr"_h: + no_conflict = (absdiff == 0) || (src2 <= src1); break; default: - VIXL_UNREACHABLE(); + VIXL_UNIMPLEMENTED(); + } + + LogicPRegister dst(pd); + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + dst.SetActive(vform, + i, + no_conflict || (static_cast(i) < absdiff)); } + + PredTest(vform, GetPTrue(), pd); } +void Simulator::Simulate_ZdB_Zn1B_Zn2B_imm(const Instruction* instr) { + VIXL_ASSERT(form_hash_ == "ext_z_zi_con"_h); -void Simulator::VisitConditionalBranch(const Instruction* instr) { - VIXL_ASSERT(instr->Mask(ConditionalBranchMask) == B_cond); - if (ConditionPassed(instr->GetConditionBranch())) { - WritePc(instr->GetImmPCOffsetTarget()); - } + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zn2 = ReadVRegister((instr->GetRn() + 1) % kNumberOfZRegisters); + + int index = instr->GetSVEExtractImmediate(); + int vl = GetVectorLengthInBytes(); + index = (index >= vl) ? 0 : index; + + ext(kFormatVnB, zd, zn, zn2, index); } -BType Simulator::GetBTypeFromInstruction(const Instruction* instr) const { - switch (instr->Mask(UnconditionalBranchToRegisterMask)) { - case BLR: - case BLRAA: - case BLRAB: - case BLRAAZ: - case BLRABZ: - return BranchAndLink; - case BR: - case BRAA: - case BRAB: - case BRAAZ: - case BRABZ: - if ((instr->GetRn() == 16) || (instr->GetRn() == 17) || - !PcIsInGuardedPage()) { - return BranchFromUnguardedOrToIP; +void Simulator::Simulate_ZdB_ZnB_ZmB(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + + switch (form_hash_) { + case "histseg_z_zz"_h: + if (instr->GetSVEVectorFormat() == kFormatVnB) { + histogram(kFormatVnB, + zd, + GetPTrue(), + zn, + zm, + /* do_segmented = */ true); + } else { + VIXL_UNIMPLEMENTED(); } - return BranchFromGuardedNotToIP; + break; + case "pmul_z_zz"_h: + pmul(kFormatVnB, zd, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); } - return DefaultBType; } -void Simulator::VisitUnconditionalBranchToRegister(const Instruction* instr) { - bool authenticate = false; - bool link = false; - uint64_t addr = ReadXRegister(instr->GetRn()); - uint64_t context = 0; +void Simulator::SimulateSVEMulIndex(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); - switch (instr->Mask(UnconditionalBranchToRegisterMask)) { - case BLR: - link = true; - VIXL_FALLTHROUGH(); - case BR: - case RET: - break; + // The encoding for B and H-sized lanes are redefined to encode the most + // significant bit of index for H-sized lanes. B-sized lanes are not + // supported. + if (vform == kFormatVnB) vform = kFormatVnH; - case BLRAAZ: - case BLRABZ: - link = true; - VIXL_FALLTHROUGH(); - case BRAAZ: - case BRABZ: - authenticate = true; - break; + VIXL_ASSERT((form_hash_ == "mul_z_zzi_d"_h) || + (form_hash_ == "mul_z_zzi_h"_h) || + (form_hash_ == "mul_z_zzi_s"_h)); - case BLRAA: - case BLRAB: - link = true; - VIXL_FALLTHROUGH(); - case BRAA: - case BRAB: - authenticate = true; - context = ReadXRegister(instr->GetRd()); - break; + SimVRegister temp; + dup_elements_to_segments(vform, temp, instr->GetSVEMulZmAndIndex()); + mul(vform, zd, zn, temp); +} - case RETAA: - case RETAB: - authenticate = true; - addr = ReadXRegister(kLinkRegCode); - context = ReadXRegister(31, Reg31IsStackPointer); - break; - default: - VIXL_UNREACHABLE(); - } +void Simulator::SimulateSVEMlaMlsIndex(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); - if (link) { - WriteLr(instr->GetNextInstruction()); - } + // The encoding for B and H-sized lanes are redefined to encode the most + // significant bit of index for H-sized lanes. B-sized lanes are not + // supported. + if (vform == kFormatVnB) vform = kFormatVnH; - if (authenticate) { - PACKey key = (instr->ExtractBit(10) == 0) ? kPACKeyIA : kPACKeyIB; - addr = AuthPAC(addr, context, key, kInstructionPointer); + VIXL_ASSERT( + (form_hash_ == "mla_z_zzzi_d"_h) || (form_hash_ == "mla_z_zzzi_h"_h) || + (form_hash_ == "mla_z_zzzi_s"_h) || (form_hash_ == "mls_z_zzzi_d"_h) || + (form_hash_ == "mls_z_zzzi_h"_h) || (form_hash_ == "mls_z_zzzi_s"_h)); - int error_lsb = GetTopPACBit(addr, kInstructionPointer) - 2; - if (((addr >> error_lsb) & 0x3) != 0x0) { - VIXL_ABORT_WITH_MSG("Failed to authenticate pointer."); - } + SimVRegister temp; + dup_elements_to_segments(vform, temp, instr->GetSVEMulZmAndIndex()); + if (instr->ExtractBit(10) == 0) { + mla(vform, zda, zda, zn, temp); + } else { + mls(vform, zda, zda, zn, temp); } - - WritePc(Instruction::Cast(addr)); - WriteNextBType(GetBTypeFromInstruction(instr)); } +void Simulator::SimulateSVESaturatingMulHighIndex(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitTestBranch(const Instruction* instr) { - unsigned bit_pos = - (instr->GetImmTestBranchBit5() << 5) | instr->GetImmTestBranchBit40(); - bool bit_zero = ((ReadXRegister(instr->GetRt()) >> bit_pos) & 1) == 0; - bool take_branch = false; - switch (instr->Mask(TestBranchMask)) { - case TBZ: - take_branch = bit_zero; + // The encoding for B and H-sized lanes are redefined to encode the most + // significant bit of index for H-sized lanes. B-sized lanes are not + // supported. + if (vform == kFormatVnB) { + vform = kFormatVnH; + } + + SimVRegister temp; + dup_elements_to_segments(vform, temp, instr->GetSVEMulZmAndIndex()); + switch (form_hash_) { + case "sqdmulh_z_zzi_h"_h: + case "sqdmulh_z_zzi_s"_h: + case "sqdmulh_z_zzi_d"_h: + sqdmulh(vform, zd, zn, temp); break; - case TBNZ: - take_branch = !bit_zero; + case "sqrdmulh_z_zzi_h"_h: + case "sqrdmulh_z_zzi_s"_h: + case "sqrdmulh_z_zzi_d"_h: + sqrdmulh(vform, zd, zn, temp); break; default: VIXL_UNIMPLEMENTED(); } - if (take_branch) { - WritePc(instr->GetImmPCOffsetTarget()); - } } +void Simulator::SimulateSVESaturatingIntMulLongIdx(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitCompareBranch(const Instruction* instr) { - unsigned rt = instr->GetRt(); - bool take_branch = false; - switch (instr->Mask(CompareBranchMask)) { - case CBZ_w: - take_branch = (ReadWRegister(rt) == 0); + SimVRegister temp, zm_idx, zn_b, zn_t; + // Instead of calling the indexed form of the instruction logic, we call the + // vector form, which can reuse existing function logic without modification. + // Select the specified elements based on the index input and than pack them + // to the corresponding position. + VectorFormat vform_half = VectorFormatHalfWidth(vform); + dup_elements_to_segments(vform_half, temp, instr->GetSVEMulLongZmAndIndex()); + pack_even_elements(vform_half, zm_idx, temp); + + pack_even_elements(vform_half, zn_b, zn); + pack_odd_elements(vform_half, zn_t, zn); + + switch (form_hash_) { + case "smullb_z_zzi_s"_h: + case "smullb_z_zzi_d"_h: + smull(vform, zd, zn_b, zm_idx); break; - case CBZ_x: - take_branch = (ReadXRegister(rt) == 0); + case "smullt_z_zzi_s"_h: + case "smullt_z_zzi_d"_h: + smull(vform, zd, zn_t, zm_idx); break; - case CBNZ_w: - take_branch = (ReadWRegister(rt) != 0); + case "sqdmullb_z_zzi_d"_h: + sqdmull(vform, zd, zn_b, zm_idx); break; - case CBNZ_x: - take_branch = (ReadXRegister(rt) != 0); + case "sqdmullt_z_zzi_d"_h: + sqdmull(vform, zd, zn_t, zm_idx); + break; + case "umullb_z_zzi_s"_h: + case "umullb_z_zzi_d"_h: + umull(vform, zd, zn_b, zm_idx); + break; + case "umullt_z_zzi_s"_h: + case "umullt_z_zzi_d"_h: + umull(vform, zd, zn_t, zm_idx); + break; + case "sqdmullb_z_zzi_s"_h: + sqdmull(vform, zd, zn_b, zm_idx); + break; + case "sqdmullt_z_zzi_s"_h: + sqdmull(vform, zd, zn_t, zm_idx); + break; + case "smlalb_z_zzzi_s"_h: + case "smlalb_z_zzzi_d"_h: + smlal(vform, zd, zn_b, zm_idx); + break; + case "smlalt_z_zzzi_s"_h: + case "smlalt_z_zzzi_d"_h: + smlal(vform, zd, zn_t, zm_idx); + break; + case "smlslb_z_zzzi_s"_h: + case "smlslb_z_zzzi_d"_h: + smlsl(vform, zd, zn_b, zm_idx); + break; + case "smlslt_z_zzzi_s"_h: + case "smlslt_z_zzzi_d"_h: + smlsl(vform, zd, zn_t, zm_idx); + break; + case "umlalb_z_zzzi_s"_h: + case "umlalb_z_zzzi_d"_h: + umlal(vform, zd, zn_b, zm_idx); + break; + case "umlalt_z_zzzi_s"_h: + case "umlalt_z_zzzi_d"_h: + umlal(vform, zd, zn_t, zm_idx); + break; + case "umlslb_z_zzzi_s"_h: + case "umlslb_z_zzzi_d"_h: + umlsl(vform, zd, zn_b, zm_idx); + break; + case "umlslt_z_zzzi_s"_h: + case "umlslt_z_zzzi_d"_h: + umlsl(vform, zd, zn_t, zm_idx); break; default: VIXL_UNIMPLEMENTED(); } - if (take_branch) { - WritePc(instr->GetImmPCOffsetTarget()); - } } +void Simulator::Simulate_ZdH_PgM_ZnS(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result, zd_b; -void Simulator::AddSubHelper(const Instruction* instr, int64_t op2) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - bool set_flags = instr->GetFlagsUpdate(); - int64_t new_val = 0; - Instr operation = instr->Mask(AddSubOpMask); + pack_even_elements(kFormatVnH, zd_b, zd); - switch (operation) { - case ADD: - case ADDS: { - new_val = AddWithCarry(reg_size, - set_flags, - ReadRegister(reg_size, - instr->GetRn(), - instr->GetRnMode()), - op2); - break; - } - case SUB: - case SUBS: { - new_val = AddWithCarry(reg_size, - set_flags, - ReadRegister(reg_size, - instr->GetRn(), - instr->GetRnMode()), - ~op2, - 1); + switch (form_hash_) { + case "fcvtnt_z_p_z_s2h"_h: + fcvt(kFormatVnH, kFormatVnS, result, pg, zn); + pack_even_elements(kFormatVnH, result, result); + zip1(kFormatVnH, result, zd_b, result); break; - } default: - VIXL_UNREACHABLE(); + VIXL_UNIMPLEMENTED(); } - - WriteRegister(reg_size, - instr->GetRd(), - new_val, - LogRegWrites, - instr->GetRdMode()); + mov_merging(kFormatVnS, zd, pg, result); } +void Simulator::Simulate_ZdS_PgM_ZnD(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result, zero, zd_b; -void Simulator::VisitAddSubShifted(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t op2 = ShiftOperand(reg_size, - ReadRegister(reg_size, instr->GetRm()), - static_cast(instr->GetShiftDP()), - instr->GetImmDPShift()); - AddSubHelper(instr, op2); -} - + zero.Clear(); + pack_even_elements(kFormatVnS, zd_b, zd); -void Simulator::VisitAddSubImmediate(const Instruction* instr) { - int64_t op2 = instr->GetImmAddSub() - << ((instr->GetShiftAddSub() == 1) ? 12 : 0); - AddSubHelper(instr, op2); + switch (form_hash_) { + case "fcvtnt_z_p_z_d2s"_h: + fcvt(kFormatVnS, kFormatVnD, result, pg, zn); + pack_even_elements(kFormatVnS, result, result); + zip1(kFormatVnS, result, zd_b, result); + break; + case "fcvtx_z_p_z_d2s"_h: + fcvtxn(kFormatVnS, result, zn); + zip1(kFormatVnS, result, result, zero); + break; + case "fcvtxnt_z_p_z_d2s"_h: + fcvtxn(kFormatVnS, result, zn); + zip1(kFormatVnS, result, zd_b, result); + break; + default: + VIXL_UNIMPLEMENTED(); + } + mov_merging(kFormatVnD, zd, pg, result); } +void Simulator::SimulateSVEFPConvertLong(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitAddSubExtended(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t op2 = ExtendValue(reg_size, - ReadRegister(reg_size, instr->GetRm()), - static_cast(instr->GetExtendMode()), - instr->GetImmExtendShift()); - AddSubHelper(instr, op2); + switch (form_hash_) { + case "fcvtlt_z_p_z_h2s"_h: + ext(kFormatVnB, result, zn, zn, kHRegSizeInBytes); + fcvt(kFormatVnS, kFormatVnH, zd, pg, result); + break; + case "fcvtlt_z_p_z_s2d"_h: + ext(kFormatVnB, result, zn, zn, kSRegSizeInBytes); + fcvt(kFormatVnD, kFormatVnS, zd, pg, result); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::Simulate_ZdS_PgM_ZnS(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitAddSubWithCarry(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t op2 = ReadRegister(reg_size, instr->GetRm()); - int64_t new_val; - - if ((instr->Mask(AddSubOpMask) == SUB) || - (instr->Mask(AddSubOpMask) == SUBS)) { - op2 = ~op2; + if (vform != kFormatVnS) { + VIXL_UNIMPLEMENTED(); } - new_val = AddWithCarry(reg_size, - instr->GetFlagsUpdate(), - ReadRegister(reg_size, instr->GetRn()), - op2, - ReadC()); - - WriteRegister(reg_size, instr->GetRd(), new_val); + switch (form_hash_) { + case "urecpe_z_p_z"_h: + urecpe(vform, result, zn); + break; + case "ursqrte_z_p_z"_h: + ursqrte(vform, result, zn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + mov_merging(vform, zd, pg, result); } +void Simulator::Simulate_ZdT_PgM_ZnT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitRotateRightIntoFlags(const Instruction* instr) { - switch (instr->Mask(RotateRightIntoFlagsMask)) { - case RMIF: { - uint64_t value = ReadRegister(instr->GetRn()); - unsigned shift = instr->GetImmRMIFRotation(); - unsigned mask = instr->GetNzcv(); - uint64_t rotated = RotateRight(value, shift, kXRegSize); - - ReadNzcv().SetFlags((rotated & mask) | (ReadNzcv().GetFlags() & ~mask)); + switch (form_hash_) { + case "flogb_z_p_z"_h: + vform = instr->GetSVEVectorFormat(17); + flogb(vform, result, zn); break; - } + case "sqabs_z_p_z"_h: + abs(vform, result, zn).SignedSaturate(vform); + break; + case "sqneg_z_p_z"_h: + neg(vform, result, zn).SignedSaturate(vform); + break; + default: + VIXL_UNIMPLEMENTED(); } + mov_merging(vform, zd, pg, result); } +void Simulator::Simulate_ZdT_PgZ_ZnT_ZmT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitEvaluateIntoFlags(const Instruction* instr) { - uint32_t value = ReadRegister(instr->GetRn()); - unsigned msb = (instr->Mask(EvaluateIntoFlagsMask) == SETF16) ? 15 : 7; + VIXL_ASSERT(form_hash_ == "histcnt_z_p_zz"_h); + if ((vform == kFormatVnS) || (vform == kFormatVnD)) { + histogram(vform, result, pg, zn, zm); + mov_zeroing(vform, zd, pg, result); + } else { + VIXL_UNIMPLEMENTED(); + } +} - unsigned sign_bit = (value >> msb) & 1; - unsigned overflow_bit = (value >> (msb + 1)) & 1; - ReadNzcv().SetN(sign_bit); - ReadNzcv().SetZ((value << (31 - msb)) == 0); - ReadNzcv().SetV(sign_bit ^ overflow_bit); +void Simulator::Simulate_ZdT_ZnT_ZmT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; + bool do_bext = false; + + switch (form_hash_) { + case "bdep_z_zz"_h: + bdep(vform, zd, zn, zm); + break; + case "bext_z_zz"_h: + do_bext = true; + VIXL_FALLTHROUGH(); + case "bgrp_z_zz"_h: + bgrp(vform, zd, zn, zm, do_bext); + break; + case "eorbt_z_zz"_h: + rotate_elements_right(vform, result, zm, 1); + SVEBitwiseLogicalUnpredicatedHelper(EOR, kFormatVnD, result, zn, result); + mov_alternating(vform, zd, result, 0); + break; + case "eortb_z_zz"_h: + rotate_elements_right(vform, result, zm, -1); + SVEBitwiseLogicalUnpredicatedHelper(EOR, kFormatVnD, result, zn, result); + mov_alternating(vform, zd, result, 1); + break; + case "mul_z_zz"_h: + mul(vform, zd, zn, zm); + break; + case "smulh_z_zz"_h: + smulh(vform, zd, zn, zm); + break; + case "sqdmulh_z_zz"_h: + sqdmulh(vform, zd, zn, zm); + break; + case "sqrdmulh_z_zz"_h: + sqrdmulh(vform, zd, zn, zm); + break; + case "umulh_z_zz"_h: + umulh(vform, zd, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::Simulate_ZdT_ZnT_ZmTb(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitLogicalShifted(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - Shift shift_type = static_cast(instr->GetShiftDP()); - unsigned shift_amount = instr->GetImmDPShift(); - int64_t op2 = ShiftOperand(reg_size, - ReadRegister(reg_size, instr->GetRm()), - shift_type, - shift_amount); - if (instr->Mask(NOT) == NOT) { - op2 = ~op2; + SimVRegister zm_b, zm_t; + VectorFormat vform_half = VectorFormatHalfWidth(vform); + pack_even_elements(vform_half, zm_b, zm); + pack_odd_elements(vform_half, zm_t, zm); + + switch (form_hash_) { + case "saddwb_z_zz"_h: + saddw(vform, zd, zn, zm_b); + break; + case "saddwt_z_zz"_h: + saddw(vform, zd, zn, zm_t); + break; + case "ssubwb_z_zz"_h: + ssubw(vform, zd, zn, zm_b); + break; + case "ssubwt_z_zz"_h: + ssubw(vform, zd, zn, zm_t); + break; + case "uaddwb_z_zz"_h: + uaddw(vform, zd, zn, zm_b); + break; + case "uaddwt_z_zz"_h: + uaddw(vform, zd, zn, zm_t); + break; + case "usubwb_z_zz"_h: + usubw(vform, zd, zn, zm_b); + break; + case "usubwt_z_zz"_h: + usubw(vform, zd, zn, zm_t); + break; + default: + VIXL_UNIMPLEMENTED(); } - LogicalHelper(instr, op2); } +void Simulator::Simulate_ZdT_ZnT_const(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitLogicalImmediate(const Instruction* instr) { - LogicalHelper(instr, instr->GetImmLogical()); + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + int lane_size = shift_and_lane_size.second; + VIXL_ASSERT((lane_size >= 0) && + (static_cast(lane_size) <= kDRegSizeInBytesLog2)); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int shift_dist = shift_and_lane_size.first; + + switch (form_hash_) { + case "sli_z_zzi"_h: + // Shift distance is computed differently for left shifts. Convert the + // result. + shift_dist = (8 << lane_size) - shift_dist; + sli(vform, zd, zn, shift_dist); + break; + case "sri_z_zzi"_h: + sri(vform, zd, zn, shift_dist); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::SimulateSVENarrow(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::LogicalHelper(const Instruction* instr, int64_t op2) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t op1 = ReadRegister(reg_size, instr->GetRn()); - int64_t result = 0; - bool update_flags = false; + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + int lane_size = shift_and_lane_size.second; + VIXL_ASSERT((lane_size >= static_cast(kBRegSizeInBytesLog2)) && + (lane_size <= static_cast(kSRegSizeInBytesLog2))); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int right_shift_dist = shift_and_lane_size.first; + bool top = false; - // Switch on the logical operation, stripping out the NOT bit, as it has a - // different meaning for logical immediate instructions. - switch (instr->Mask(LogicalOpMask & ~NOT)) { - case ANDS: - update_flags = true; + switch (form_hash_) { + case "sqxtnt_z_zz"_h: + top = true; VIXL_FALLTHROUGH(); - case AND: - result = op1 & op2; + case "sqxtnb_z_zz"_h: + sqxtn(vform, result, zn); break; - case ORR: - result = op1 | op2; + case "sqxtunt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "sqxtunb_z_zz"_h: + sqxtun(vform, result, zn); break; - case EOR: - result = op1 ^ op2; + case "uqxtnt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "uqxtnb_z_zz"_h: + uqxtn(vform, result, zn); + break; + case "rshrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "rshrnb_z_zi"_h: + rshrn(vform, result, zn, right_shift_dist); + break; + case "shrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "shrnb_z_zi"_h: + shrn(vform, result, zn, right_shift_dist); + break; + case "sqrshrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "sqrshrnb_z_zi"_h: + sqrshrn(vform, result, zn, right_shift_dist); + break; + case "sqrshrunt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "sqrshrunb_z_zi"_h: + sqrshrun(vform, result, zn, right_shift_dist); + break; + case "sqshrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "sqshrnb_z_zi"_h: + sqshrn(vform, result, zn, right_shift_dist); + break; + case "sqshrunt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "sqshrunb_z_zi"_h: + sqshrun(vform, result, zn, right_shift_dist); + break; + case "uqrshrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "uqrshrnb_z_zi"_h: + uqrshrn(vform, result, zn, right_shift_dist); + break; + case "uqshrnt_z_zi"_h: + top = true; + VIXL_FALLTHROUGH(); + case "uqshrnb_z_zi"_h: + uqshrn(vform, result, zn, right_shift_dist); break; default: VIXL_UNIMPLEMENTED(); } - if (update_flags) { - ReadNzcv().SetN(CalcNFlag(result, reg_size)); - ReadNzcv().SetZ(CalcZFlag(result)); - ReadNzcv().SetC(0); - ReadNzcv().SetV(0); - LogSystemRegister(NZCV); + if (top) { + // Keep even elements, replace odd elements with the results. + xtn(vform, zd, zd); + zip1(vform, zd, zd, result); + } else { + // Zero odd elements, replace even elements with the results. + SimVRegister zero; + zero.Clear(); + zip1(vform, zd, result, zero); } - - WriteRegister(reg_size, - instr->GetRd(), - result, - LogRegWrites, - instr->GetRdMode()); } +void Simulator::SimulateSVEInterleavedArithLong(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister temp, zn_b, zm_b, zn_t, zm_t; -void Simulator::VisitConditionalCompareRegister(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - ConditionalCompareHelper(instr, ReadRegister(reg_size, instr->GetRm())); + // Construct temporary registers containing the even (bottom) and odd (top) + // elements. + VectorFormat vform_half = VectorFormatHalfWidth(vform); + pack_even_elements(vform_half, zn_b, zn); + pack_even_elements(vform_half, zm_b, zm); + pack_odd_elements(vform_half, zn_t, zn); + pack_odd_elements(vform_half, zm_t, zm); + + switch (form_hash_) { + case "sabdlb_z_zz"_h: + sabdl(vform, zd, zn_b, zm_b); + break; + case "sabdlt_z_zz"_h: + sabdl(vform, zd, zn_t, zm_t); + break; + case "saddlb_z_zz"_h: + saddl(vform, zd, zn_b, zm_b); + break; + case "saddlbt_z_zz"_h: + saddl(vform, zd, zn_b, zm_t); + break; + case "saddlt_z_zz"_h: + saddl(vform, zd, zn_t, zm_t); + break; + case "ssublb_z_zz"_h: + ssubl(vform, zd, zn_b, zm_b); + break; + case "ssublbt_z_zz"_h: + ssubl(vform, zd, zn_b, zm_t); + break; + case "ssublt_z_zz"_h: + ssubl(vform, zd, zn_t, zm_t); + break; + case "ssubltb_z_zz"_h: + ssubl(vform, zd, zn_t, zm_b); + break; + case "uabdlb_z_zz"_h: + uabdl(vform, zd, zn_b, zm_b); + break; + case "uabdlt_z_zz"_h: + uabdl(vform, zd, zn_t, zm_t); + break; + case "uaddlb_z_zz"_h: + uaddl(vform, zd, zn_b, zm_b); + break; + case "uaddlt_z_zz"_h: + uaddl(vform, zd, zn_t, zm_t); + break; + case "usublb_z_zz"_h: + usubl(vform, zd, zn_b, zm_b); + break; + case "usublt_z_zz"_h: + usubl(vform, zd, zn_t, zm_t); + break; + case "sabalb_z_zzz"_h: + sabal(vform, zd, zn_b, zm_b); + break; + case "sabalt_z_zzz"_h: + sabal(vform, zd, zn_t, zm_t); + break; + case "uabalb_z_zzz"_h: + uabal(vform, zd, zn_b, zm_b); + break; + case "uabalt_z_zzz"_h: + uabal(vform, zd, zn_t, zm_t); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::SimulateSVEIntMulLongVec(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister temp, zn_b, zm_b, zn_t, zm_t; + VectorFormat vform_half = VectorFormatHalfWidth(vform); + pack_even_elements(vform_half, zn_b, zn); + pack_even_elements(vform_half, zm_b, zm); + pack_odd_elements(vform_half, zn_t, zn); + pack_odd_elements(vform_half, zm_t, zm); -void Simulator::VisitConditionalCompareImmediate(const Instruction* instr) { - ConditionalCompareHelper(instr, instr->GetImmCondCmp()); + switch (form_hash_) { + case "pmullb_z_zz"_h: + // '00' is reserved for Q-sized lane. + if (vform == kFormatVnB) { + VIXL_UNIMPLEMENTED(); + } + pmull(vform, zd, zn_b, zm_b); + break; + case "pmullt_z_zz"_h: + // '00' is reserved for Q-sized lane. + if (vform == kFormatVnB) { + VIXL_UNIMPLEMENTED(); + } + pmull(vform, zd, zn_t, zm_t); + break; + case "smullb_z_zz"_h: + smull(vform, zd, zn_b, zm_b); + break; + case "smullt_z_zz"_h: + smull(vform, zd, zn_t, zm_t); + break; + case "sqdmullb_z_zz"_h: + sqdmull(vform, zd, zn_b, zm_b); + break; + case "sqdmullt_z_zz"_h: + sqdmull(vform, zd, zn_t, zm_t); + break; + case "umullb_z_zz"_h: + umull(vform, zd, zn_b, zm_b); + break; + case "umullt_z_zz"_h: + umull(vform, zd, zn_t, zm_t); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::SimulateSVEAddSubHigh(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; + bool top = false; -void Simulator::ConditionalCompareHelper(const Instruction* instr, - int64_t op2) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t op1 = ReadRegister(reg_size, instr->GetRn()); + VectorFormat vform_src = instr->GetSVEVectorFormat(); + if (vform_src == kFormatVnB) { + VIXL_UNIMPLEMENTED(); + } + VectorFormat vform = VectorFormatHalfWidth(vform_src); - if (ConditionPassed(instr->GetCondition())) { - // If the condition passes, set the status flags to the result of comparing - // the operands. - if (instr->Mask(ConditionalCompareMask) == CCMP) { - AddWithCarry(reg_size, true, op1, ~op2, 1); - } else { - VIXL_ASSERT(instr->Mask(ConditionalCompareMask) == CCMN); - AddWithCarry(reg_size, true, op1, op2, 0); - } + switch (form_hash_) { + case "addhnt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "addhnb_z_zz"_h: + addhn(vform, result, zn, zm); + break; + case "raddhnt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "raddhnb_z_zz"_h: + raddhn(vform, result, zn, zm); + break; + case "rsubhnt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "rsubhnb_z_zz"_h: + rsubhn(vform, result, zn, zm); + break; + case "subhnt_z_zz"_h: + top = true; + VIXL_FALLTHROUGH(); + case "subhnb_z_zz"_h: + subhn(vform, result, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + } + + if (top) { + // Keep even elements, replace odd elements with the results. + xtn(vform, zd, zd); + zip1(vform, zd, zd, result); } else { - // If the condition fails, set the status flags to the nzcv immediate. - ReadNzcv().SetFlags(instr->GetNzcv()); - LogSystemRegister(NZCV); + // Zero odd elements, replace even elements with the results. + SimVRegister zero; + zero.Clear(); + zip1(vform, zd, result, zero); } } +void Simulator::SimulateSVEShiftLeftImm(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister zn_b, zn_t; -void Simulator::VisitLoadStoreUnsignedOffset(const Instruction* instr) { - int offset = instr->GetImmLSUnsigned() << instr->GetSizeLS(); - LoadStoreHelper(instr, offset, Offset); -} + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + int lane_size = shift_and_lane_size.second; + VIXL_ASSERT((lane_size >= 0) && + (static_cast(lane_size) <= kDRegSizeInBytesLog2)); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size + 1); + int right_shift_dist = shift_and_lane_size.first; + int left_shift_dist = (8 << lane_size) - right_shift_dist; + // Construct temporary registers containing the even (bottom) and odd (top) + // elements. + VectorFormat vform_half = VectorFormatHalfWidth(vform); + pack_even_elements(vform_half, zn_b, zn); + pack_odd_elements(vform_half, zn_t, zn); -void Simulator::VisitLoadStoreUnscaledOffset(const Instruction* instr) { - LoadStoreHelper(instr, instr->GetImmLS(), Offset); + switch (form_hash_) { + case "sshllb_z_zi"_h: + sshll(vform, zd, zn_b, left_shift_dist); + break; + case "sshllt_z_zi"_h: + sshll(vform, zd, zn_t, left_shift_dist); + break; + case "ushllb_z_zi"_h: + ushll(vform, zd, zn_b, left_shift_dist); + break; + case "ushllt_z_zi"_h: + ushll(vform, zd, zn_t, left_shift_dist); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::SimulateSVESaturatingMulAddHigh(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + unsigned zm_code = instr->GetRm(); + int index = -1; + bool is_mla = false; -void Simulator::VisitLoadStorePreIndex(const Instruction* instr) { - LoadStoreHelper(instr, instr->GetImmLS(), PreIndex); -} - - -void Simulator::VisitLoadStorePostIndex(const Instruction* instr) { - LoadStoreHelper(instr, instr->GetImmLS(), PostIndex); -} - - -template -void Simulator::LoadAcquireRCpcUnscaledOffsetHelper(const Instruction* instr) { - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - - unsigned element_size = sizeof(T2); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - int offset = instr->GetImmLS(); - address += offset; - - // Verify that the address is available to the host. - VIXL_ASSERT(address == static_cast(address)); - - // Check the alignment of `address`. - if (AlignDown(address, 16) != AlignDown(address + element_size - 1, 16)) { - VIXL_ALIGNMENT_EXCEPTION(); + switch (form_hash_) { + case "sqrdmlah_z_zzz"_h: + is_mla = true; + VIXL_FALLTHROUGH(); + case "sqrdmlsh_z_zzz"_h: + // Nothing to do. + break; + case "sqrdmlah_z_zzzi_h"_h: + is_mla = true; + VIXL_FALLTHROUGH(); + case "sqrdmlsh_z_zzzi_h"_h: + vform = kFormatVnH; + index = (instr->ExtractBit(22) << 2) | instr->ExtractBits(20, 19); + zm_code = instr->ExtractBits(18, 16); + break; + case "sqrdmlah_z_zzzi_s"_h: + is_mla = true; + VIXL_FALLTHROUGH(); + case "sqrdmlsh_z_zzzi_s"_h: + vform = kFormatVnS; + index = instr->ExtractBits(20, 19); + zm_code = instr->ExtractBits(18, 16); + break; + case "sqrdmlah_z_zzzi_d"_h: + is_mla = true; + VIXL_FALLTHROUGH(); + case "sqrdmlsh_z_zzzi_d"_h: + vform = kFormatVnD; + index = instr->ExtractBit(20); + zm_code = instr->ExtractBits(19, 16); + break; + default: + VIXL_UNIMPLEMENTED(); } - WriteRegister(rt, static_cast(Memory::Read(address))); - - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); + SimVRegister& zm = ReadVRegister(zm_code); + SimVRegister zm_idx; + if (index >= 0) { + dup_elements_to_segments(vform, zm_idx, zm, index); + } - LogRead(address, rt, GetPrintRegisterFormat(element_size)); + if (is_mla) { + sqrdmlah(vform, zda, zn, (index >= 0) ? zm_idx : zm); + } else { + sqrdmlsh(vform, zda, zn, (index >= 0) ? zm_idx : zm); + } } +void Simulator::Simulate_ZdaD_ZnS_ZmS_imm(const Instruction* instr) { + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->ExtractBits(19, 16)); -template -void Simulator::StoreReleaseUnscaledOffsetHelper(const Instruction* instr) { - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - int offset = instr->GetImmLS(); - address += offset; - - // Verify that the address is available to the host. - VIXL_ASSERT(address == static_cast(address)); + SimVRegister temp, zm_idx, zn_b, zn_t; + Instr index = (instr->ExtractBit(20) << 1) | instr->ExtractBit(11); + dup_elements_to_segments(kFormatVnS, temp, zm, index); + pack_even_elements(kFormatVnS, zm_idx, temp); + pack_even_elements(kFormatVnS, zn_b, zn); + pack_odd_elements(kFormatVnS, zn_t, zn); - // Check the alignment of `address`. - if (AlignDown(address, 16) != AlignDown(address + element_size - 1, 16)) { - VIXL_ALIGNMENT_EXCEPTION(); + switch (form_hash_) { + case "sqdmlalb_z_zzzi_d"_h: + sqdmlal(kFormatVnD, zda, zn_b, zm_idx); + break; + case "sqdmlalt_z_zzzi_d"_h: + sqdmlal(kFormatVnD, zda, zn_t, zm_idx); + break; + case "sqdmlslb_z_zzzi_d"_h: + sqdmlsl(kFormatVnD, zda, zn_b, zm_idx); + break; + case "sqdmlslt_z_zzzi_d"_h: + sqdmlsl(kFormatVnD, zda, zn_t, zm_idx); + break; + default: + VIXL_UNIMPLEMENTED(); } - - // Approximate store-release by issuing a full barrier after the load. - __sync_synchronize(); - - Memory::Write(address, ReadRegister(rt)); - - LogWrite(address, rt, GetPrintRegisterFormat(element_size)); } +void Simulator::Simulate_ZdaS_ZnH_ZmH(const Instruction* instr) { + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitLoadStoreRCpcUnscaledOffset(const Instruction* instr) { - switch (instr->Mask(LoadStoreRCpcUnscaledOffsetMask)) { - case LDAPURB: - LoadAcquireRCpcUnscaledOffsetHelper(instr); - break; - case LDAPURH: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + SimVRegister temp, zn_b, zm_b, zn_t, zm_t; + pack_even_elements(kFormatVnH, zn_b, zn); + pack_even_elements(kFormatVnH, zm_b, zm); + pack_odd_elements(kFormatVnH, zn_t, zn); + pack_odd_elements(kFormatVnH, zm_t, zm); + + switch (form_hash_) { + case "fmlalb_z_zzz"_h: + fmlal(kFormatVnS, zda, zn_b, zm_b); break; - case LDAPUR_w: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlalt_z_zzz"_h: + fmlal(kFormatVnS, zda, zn_t, zm_t); break; - case LDAPUR_x: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlslb_z_zzz"_h: + fmlsl(kFormatVnS, zda, zn_b, zm_b); break; - case LDAPURSB_w: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlslt_z_zzz"_h: + fmlsl(kFormatVnS, zda, zn_t, zm_t); break; - case LDAPURSB_x: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::Simulate_ZdaS_ZnH_ZmH_imm(const Instruction* instr) { + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->ExtractBits(18, 16)); + + SimVRegister temp, zm_idx, zn_b, zn_t; + Instr index = (instr->ExtractBits(20, 19) << 1) | instr->ExtractBit(11); + dup_elements_to_segments(kFormatVnH, temp, zm, index); + pack_even_elements(kFormatVnH, zm_idx, temp); + pack_even_elements(kFormatVnH, zn_b, zn); + pack_odd_elements(kFormatVnH, zn_t, zn); + + switch (form_hash_) { + case "fmlalb_z_zzzi_s"_h: + fmlal(kFormatVnS, zda, zn_b, zm_idx); break; - case LDAPURSH_w: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlalt_z_zzzi_s"_h: + fmlal(kFormatVnS, zda, zn_t, zm_idx); break; - case LDAPURSH_x: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlslb_z_zzzi_s"_h: + fmlsl(kFormatVnS, zda, zn_b, zm_idx); break; - case LDAPURSW: - LoadAcquireRCpcUnscaledOffsetHelper(instr); + case "fmlslt_z_zzzi_s"_h: + fmlsl(kFormatVnS, zda, zn_t, zm_idx); break; - case STLURB: - StoreReleaseUnscaledOffsetHelper(instr); + case "sqdmlalb_z_zzzi_s"_h: + sqdmlal(kFormatVnS, zda, zn_b, zm_idx); break; - case STLURH: - StoreReleaseUnscaledOffsetHelper(instr); + case "sqdmlalt_z_zzzi_s"_h: + sqdmlal(kFormatVnS, zda, zn_t, zm_idx); break; - case STLUR_w: - StoreReleaseUnscaledOffsetHelper(instr); + case "sqdmlslb_z_zzzi_s"_h: + sqdmlsl(kFormatVnS, zda, zn_b, zm_idx); break; - case STLUR_x: - StoreReleaseUnscaledOffsetHelper(instr); + case "sqdmlslt_z_zzzi_s"_h: + sqdmlsl(kFormatVnS, zda, zn_t, zm_idx); break; + default: + VIXL_UNIMPLEMENTED(); } } +void Simulator::Simulate_ZdaT_PgM_ZnTb(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitLoadStorePAC(const Instruction* instr) { - unsigned dst = instr->GetRt(); - unsigned addr_reg = instr->GetRn(); - - uint64_t address = ReadXRegister(addr_reg, Reg31IsStackPointer); - - PACKey key = (instr->ExtractBit(23) == 0) ? kPACKeyDA : kPACKeyDB; - address = AuthPAC(address, 0, key, kDataPointer); - - int error_lsb = GetTopPACBit(address, kInstructionPointer) - 2; - if (((address >> error_lsb) & 0x3) != 0x0) { - VIXL_ABORT_WITH_MSG("Failed to authenticate pointer."); + switch (form_hash_) { + case "sadalp_z_p_z"_h: + sadalp(vform, result, zn); + break; + case "uadalp_z_p_z"_h: + uadalp(vform, result, zn); + break; + default: + VIXL_UNIMPLEMENTED(); } + mov_merging(vform, zda, pg, result); +} +void Simulator::SimulateSVEAddSubCarry(const Instruction* instr) { + VectorFormat vform = (instr->ExtractBit(22) == 0) ? kFormatVnS : kFormatVnD; + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); - if ((addr_reg == 31) && ((address % 16) != 0)) { - // When the base register is SP the stack pointer is required to be - // quadword aligned prior to the address calculation and write-backs. - // Misalignment will cause a stack alignment fault. - VIXL_ALIGNMENT_EXCEPTION(); + SimVRegister not_zn; + not_(vform, not_zn, zn); + + switch (form_hash_) { + case "adclb_z_zzz"_h: + adcl(vform, zda, zn, zm, /* top = */ false); + break; + case "adclt_z_zzz"_h: + adcl(vform, zda, zn, zm, /* top = */ true); + break; + case "sbclb_z_zzz"_h: + adcl(vform, zda, not_zn, zm, /* top = */ false); + break; + case "sbclt_z_zzz"_h: + adcl(vform, zda, not_zn, zm, /* top = */ true); + break; + default: + VIXL_UNIMPLEMENTED(); } +} - int64_t offset = instr->GetImmLSPAC(); - address += offset; +void Simulator::Simulate_ZdaT_ZnT_ZmT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); - if (instr->Mask(LoadStorePACPreBit) == LoadStorePACPreBit) { - // Pre-index mode. - VIXL_ASSERT(offset != 0); - WriteXRegister(addr_reg, address, LogRegWrites, Reg31IsStackPointer); + switch (form_hash_) { + case "saba_z_zzz"_h: + saba(vform, zda, zn, zm); + break; + case "uaba_z_zzz"_h: + uaba(vform, zda, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); } +} - uintptr_t addr_ptr = static_cast(address); +void Simulator::SimulateSVEComplexIntMulAdd(const Instruction* instr) { + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + int rot = instr->ExtractBits(11, 10) * 90; + // vform and zm are only valid for the vector form of instruction. + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zm = ReadVRegister(instr->GetRm()); - // Verify that the calculated address is available to the host. - VIXL_ASSERT(address == addr_ptr); + // Inputs for indexed form of instruction. + SimVRegister& zm_h = ReadVRegister(instr->ExtractBits(18, 16)); + SimVRegister& zm_s = ReadVRegister(instr->ExtractBits(19, 16)); + int idx_h = instr->ExtractBits(20, 19); + int idx_s = instr->ExtractBit(20); - WriteXRegister(dst, Memory::Read(addr_ptr), NoRegLog); - unsigned access_size = 1 << 3; - LogRead(addr_ptr, dst, GetPrintRegisterFormatForSize(access_size)); + switch (form_hash_) { + case "cmla_z_zzz"_h: + cmla(vform, zda, zda, zn, zm, rot); + break; + case "cmla_z_zzzi_h"_h: + cmla(kFormatVnH, zda, zda, zn, zm_h, idx_h, rot); + break; + case "cmla_z_zzzi_s"_h: + cmla(kFormatVnS, zda, zda, zn, zm_s, idx_s, rot); + break; + case "sqrdcmlah_z_zzz"_h: + sqrdcmlah(vform, zda, zda, zn, zm, rot); + break; + case "sqrdcmlah_z_zzzi_h"_h: + sqrdcmlah(kFormatVnH, zda, zda, zn, zm_h, idx_h, rot); + break; + case "sqrdcmlah_z_zzzi_s"_h: + sqrdcmlah(kFormatVnS, zda, zda, zn, zm_s, idx_s, rot); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::Simulate_ZdaT_ZnT_const(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitLoadStoreRegisterOffset(const Instruction* instr) { - Extend ext = static_cast(instr->GetExtendMode()); - VIXL_ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX)); - unsigned shift_amount = instr->GetImmShiftLS() * instr->GetSizeLS(); + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + int lane_size = shift_and_lane_size.second; + VIXL_ASSERT((lane_size >= 0) && + (static_cast(lane_size) <= kDRegSizeInBytesLog2)); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int shift_dist = shift_and_lane_size.first; - int64_t offset = - ExtendValue(kXRegSize, ReadXRegister(instr->GetRm()), ext, shift_amount); - LoadStoreHelper(instr, offset, Offset); + switch (form_hash_) { + case "srsra_z_zi"_h: + srsra(vform, zd, zn, shift_dist); + break; + case "ssra_z_zi"_h: + ssra(vform, zd, zn, shift_dist); + break; + case "ursra_z_zi"_h: + ursra(vform, zd, zn, shift_dist); + break; + case "usra_z_zi"_h: + usra(vform, zd, zn, shift_dist); + break; + default: + VIXL_UNIMPLEMENTED(); + } } +void Simulator::Simulate_ZdaT_ZnTb_ZmTb(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::LoadStoreHelper(const Instruction* instr, - int64_t offset, - AddrMode addrmode) { - unsigned srcdst = instr->GetRt(); - uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addrmode); + SimVRegister zero, zn_b, zm_b, zn_t, zm_t; + zero.Clear(); - LoadStoreOp op = static_cast(instr->Mask(LoadStoreMask)); - switch (op) { - case LDRB_w: - WriteWRegister(srcdst, Memory::Read(address), NoRegLog); + VectorFormat vform_half = VectorFormatHalfWidth(vform); + uzp1(vform_half, zn_b, zn, zero); + uzp1(vform_half, zm_b, zm, zero); + uzp2(vform_half, zn_t, zn, zero); + uzp2(vform_half, zm_t, zm, zero); + + switch (form_hash_) { + case "smlalb_z_zzz"_h: + smlal(vform, zda, zn_b, zm_b); break; - case LDRH_w: - WriteWRegister(srcdst, Memory::Read(address), NoRegLog); + case "smlalt_z_zzz"_h: + smlal(vform, zda, zn_t, zm_t); break; - case LDR_w: - WriteWRegister(srcdst, Memory::Read(address), NoRegLog); + case "smlslb_z_zzz"_h: + smlsl(vform, zda, zn_b, zm_b); break; - case LDR_x: - WriteXRegister(srcdst, Memory::Read(address), NoRegLog); + case "smlslt_z_zzz"_h: + smlsl(vform, zda, zn_t, zm_t); break; - case LDRSB_w: - WriteWRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlalb_z_zzz"_h: + sqdmlal(vform, zda, zn_b, zm_b); break; - case LDRSH_w: - WriteWRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlalbt_z_zzz"_h: + sqdmlal(vform, zda, zn_b, zm_t); break; - case LDRSB_x: - WriteXRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlalt_z_zzz"_h: + sqdmlal(vform, zda, zn_t, zm_t); break; - case LDRSH_x: - WriteXRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlslb_z_zzz"_h: + sqdmlsl(vform, zda, zn_b, zm_b); break; - case LDRSW_x: - WriteXRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlslbt_z_zzz"_h: + sqdmlsl(vform, zda, zn_b, zm_t); break; - case LDR_b: - WriteBRegister(srcdst, Memory::Read(address), NoRegLog); + case "sqdmlslt_z_zzz"_h: + sqdmlsl(vform, zda, zn_t, zm_t); break; - case LDR_h: - WriteHRegister(srcdst, Memory::Read(address), NoRegLog); + case "umlalb_z_zzz"_h: + umlal(vform, zda, zn_b, zm_b); break; - case LDR_s: - WriteSRegister(srcdst, Memory::Read(address), NoRegLog); + case "umlalt_z_zzz"_h: + umlal(vform, zda, zn_t, zm_t); break; - case LDR_d: - WriteDRegister(srcdst, Memory::Read(address), NoRegLog); + case "umlslb_z_zzz"_h: + umlsl(vform, zda, zn_b, zm_b); break; - case LDR_q: - WriteQRegister(srcdst, Memory::Read(address), NoRegLog); + case "umlslt_z_zzz"_h: + umlsl(vform, zda, zn_t, zm_t); break; + default: + VIXL_UNIMPLEMENTED(); + } +} - case STRB_w: - Memory::Write(address, ReadWRegister(srcdst)); +void Simulator::SimulateSVEComplexDotProduct(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + int rot = instr->ExtractBits(11, 10) * 90; + unsigned zm_code = instr->GetRm(); + int index = -1; + + switch (form_hash_) { + case "cdot_z_zzz"_h: + // Nothing to do. break; - case STRH_w: - Memory::Write(address, ReadWRegister(srcdst)); + case "cdot_z_zzzi_s"_h: + index = zm_code >> 3; + zm_code &= 0x7; break; - case STR_w: - Memory::Write(address, ReadWRegister(srcdst)); + case "cdot_z_zzzi_d"_h: + index = zm_code >> 4; + zm_code &= 0xf; break; - case STR_x: - Memory::Write(address, ReadXRegister(srcdst)); + default: + VIXL_UNIMPLEMENTED(); + } + + SimVRegister temp; + SimVRegister& zm = ReadVRegister(zm_code); + if (index >= 0) dup_elements_to_segments(vform, temp, zm, index); + cdot(vform, zda, zda, zn, (index >= 0) ? temp : zm, rot); +} + +void Simulator::SimulateSVEBitwiseTernary(const Instruction* instr) { + VectorFormat vform = kFormatVnD; + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zk = ReadVRegister(instr->GetRn()); + SimVRegister temp; + + switch (form_hash_) { + case "bcax_z_zzz"_h: + bic(vform, temp, zm, zk); + eor(vform, zdn, temp, zdn); break; - case STR_b: - Memory::Write(address, ReadBRegister(srcdst)); + case "bsl1n_z_zzz"_h: + not_(vform, temp, zdn); + bsl(vform, zdn, zk, temp, zm); break; - case STR_h: - Memory::Write(address, ReadHRegisterBits(srcdst)); + case "bsl2n_z_zzz"_h: + not_(vform, temp, zm); + bsl(vform, zdn, zk, zdn, temp); break; - case STR_s: - Memory::Write(address, ReadSRegister(srcdst)); + case "bsl_z_zzz"_h: + bsl(vform, zdn, zk, zdn, zm); break; - case STR_d: - Memory::Write(address, ReadDRegister(srcdst)); + case "eor3_z_zzz"_h: + eor(vform, temp, zdn, zm); + eor(vform, zdn, temp, zk); break; - case STR_q: - Memory::Write(address, ReadQRegister(srcdst)); + case "nbsl_z_zzz"_h: + bsl(vform, zdn, zk, zdn, zm); + not_(vform, zdn, zdn); break; + default: + VIXL_UNIMPLEMENTED(); + } +} - // Ignore prfm hint instructions. - case PRFM: - break; +void Simulator::SimulateSVEHalvingAddSub(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimVRegister result; + switch (form_hash_) { + case "shadd_z_p_zz"_h: + add(vform, result, zdn, zm).Halve(vform); + break; + case "shsub_z_p_zz"_h: + sub(vform, result, zdn, zm).Halve(vform); + break; + case "shsubr_z_p_zz"_h: + sub(vform, result, zm, zdn).Halve(vform); + break; + case "srhadd_z_p_zz"_h: + add(vform, result, zdn, zm).Halve(vform).Round(vform); + break; + case "uhadd_z_p_zz"_h: + add(vform, result, zdn, zm).Uhalve(vform); + break; + case "uhsub_z_p_zz"_h: + sub(vform, result, zdn, zm).Uhalve(vform); + break; + case "uhsubr_z_p_zz"_h: + sub(vform, result, zm, zdn).Uhalve(vform); + break; + case "urhadd_z_p_zz"_h: + add(vform, result, zdn, zm).Uhalve(vform).Round(vform); + break; default: VIXL_UNIMPLEMENTED(); + break; } + mov_merging(vform, zdn, pg, result); +} - unsigned access_size = 1 << instr->GetSizeLS(); - if (instr->IsLoad()) { - if ((op == LDR_s) || (op == LDR_d)) { - LogVRead(address, srcdst, GetPrintRegisterFormatForSizeFP(access_size)); - } else if ((op == LDR_b) || (op == LDR_h) || (op == LDR_q)) { - LogVRead(address, srcdst, GetPrintRegisterFormatForSize(access_size)); - } else { - LogRead(address, srcdst, GetPrintRegisterFormatForSize(access_size)); - } - } else if (instr->IsStore()) { - if ((op == STR_s) || (op == STR_d)) { - LogVWrite(address, srcdst, GetPrintRegisterFormatForSizeFP(access_size)); - } else if ((op == STR_b) || (op == STR_h) || (op == STR_q)) { - LogVWrite(address, srcdst, GetPrintRegisterFormatForSize(access_size)); - } else { - LogWrite(address, srcdst, GetPrintRegisterFormatForSize(access_size)); - } - } else { - VIXL_ASSERT(op == PRFM); - } +void Simulator::SimulateSVESaturatingArithmetic(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; - local_monitor_.MaybeClear(); + switch (form_hash_) { + case "sqadd_z_p_zz"_h: + add(vform, result, zdn, zm).SignedSaturate(vform); + break; + case "sqsub_z_p_zz"_h: + sub(vform, result, zdn, zm).SignedSaturate(vform); + break; + case "sqsubr_z_p_zz"_h: + sub(vform, result, zm, zdn).SignedSaturate(vform); + break; + case "suqadd_z_p_zz"_h: + suqadd(vform, result, zdn, zm); + break; + case "uqadd_z_p_zz"_h: + add(vform, result, zdn, zm).UnsignedSaturate(vform); + break; + case "uqsub_z_p_zz"_h: + sub(vform, result, zdn, zm).UnsignedSaturate(vform); + break; + case "uqsubr_z_p_zz"_h: + sub(vform, result, zm, zdn).UnsignedSaturate(vform); + break; + case "usqadd_z_p_zz"_h: + usqadd(vform, result, zdn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); } +void Simulator::SimulateSVEIntArithPair(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitLoadStorePairOffset(const Instruction* instr) { - LoadStorePairHelper(instr, Offset); + switch (form_hash_) { + case "addp_z_p_zz"_h: + addp(vform, result, zdn, zm); + break; + case "smaxp_z_p_zz"_h: + smaxp(vform, result, zdn, zm); + break; + case "sminp_z_p_zz"_h: + sminp(vform, result, zdn, zm); + break; + case "umaxp_z_p_zz"_h: + umaxp(vform, result, zdn, zm); + break; + case "uminp_z_p_zz"_h: + uminp(vform, result, zdn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); } +void Simulator::Simulate_ZdnT_PgM_ZdnT_ZmT(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimVRegister result; -void Simulator::VisitLoadStorePairPreIndex(const Instruction* instr) { - LoadStorePairHelper(instr, PreIndex); + switch (form_hash_) { + case "faddp_z_p_zz"_h: + faddp(vform, result, zdn, zm); + break; + case "fmaxnmp_z_p_zz"_h: + fmaxnmp(vform, result, zdn, zm); + break; + case "fmaxp_z_p_zz"_h: + fmaxp(vform, result, zdn, zm); + break; + case "fminnmp_z_p_zz"_h: + fminnmp(vform, result, zdn, zm); + break; + case "fminp_z_p_zz"_h: + fminp(vform, result, zdn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + } + mov_merging(vform, zdn, pg, result); } +void Simulator::Simulate_ZdnT_PgM_ZdnT_const(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); -void Simulator::VisitLoadStorePairPostIndex(const Instruction* instr) { - LoadStorePairHelper(instr, PostIndex); -} - + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ true); + unsigned lane_size = shift_and_lane_size.second; + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int right_shift_dist = shift_and_lane_size.first; + int left_shift_dist = (8 << lane_size) - right_shift_dist; + SimVRegister result; -void Simulator::VisitLoadStorePairNonTemporal(const Instruction* instr) { - LoadStorePairHelper(instr, Offset); + switch (form_hash_) { + case "sqshl_z_p_zi"_h: + sqshl(vform, result, zdn, left_shift_dist); + break; + case "sqshlu_z_p_zi"_h: + sqshlu(vform, result, zdn, left_shift_dist); + break; + case "srshr_z_p_zi"_h: + sshr(vform, result, zdn, right_shift_dist).Round(vform); + break; + case "uqshl_z_p_zi"_h: + uqshl(vform, result, zdn, left_shift_dist); + break; + case "urshr_z_p_zi"_h: + ushr(vform, result, zdn, right_shift_dist).Round(vform); + break; + default: + VIXL_UNIMPLEMENTED(); + } + mov_merging(vform, zdn, pg, result); } +void Simulator::SimulateSVEExclusiveOrRotate(const Instruction* instr) { + VIXL_ASSERT(form_hash_ == "xar_z_zzi"_h); -void Simulator::LoadStorePairHelper(const Instruction* instr, - AddrMode addrmode) { - unsigned rt = instr->GetRt(); - unsigned rt2 = instr->GetRt2(); - int element_size = 1 << instr->GetSizeLSPair(); - int64_t offset = instr->GetImmLSPair() * element_size; - uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addrmode); - uintptr_t address2 = address + element_size; + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); - LoadStorePairOp op = - static_cast(instr->Mask(LoadStorePairMask)); + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + unsigned lane_size = shift_and_lane_size.second; + VIXL_ASSERT(lane_size <= kDRegSizeInBytesLog2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int shift_dist = shift_and_lane_size.first; + eor(vform, zdn, zdn, zm); + ror(vform, zdn, zdn, shift_dist); +} - // 'rt' and 'rt2' can only be aliased for stores. - VIXL_ASSERT(((op & LoadStorePairLBit) == 0) || (rt != rt2)); +void Simulator::Simulate_ZdnT_ZdnT_ZmT_const(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + int rot = (instr->ExtractBit(10) == 0) ? 90 : 270; - switch (op) { - // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_FP_REGS). We - // will print a more detailed log. - case LDP_w: { - WriteWRegister(rt, Memory::Read(address), NoRegLog); - WriteWRegister(rt2, Memory::Read(address2), NoRegLog); - break; - } - case LDP_s: { - WriteSRegister(rt, Memory::Read(address), NoRegLog); - WriteSRegister(rt2, Memory::Read(address2), NoRegLog); - break; - } - case LDP_x: { - WriteXRegister(rt, Memory::Read(address), NoRegLog); - WriteXRegister(rt2, Memory::Read(address2), NoRegLog); + switch (form_hash_) { + case "cadd_z_zz"_h: + cadd(vform, zdn, zdn, zm, rot); break; - } - case LDP_d: { - WriteDRegister(rt, Memory::Read(address), NoRegLog); - WriteDRegister(rt2, Memory::Read(address2), NoRegLog); + case "sqcadd_z_zz"_h: + cadd(vform, zdn, zdn, zm, rot, /* saturate = */ true); break; - } - case LDP_q: { - WriteQRegister(rt, Memory::Read(address), NoRegLog); - WriteQRegister(rt2, Memory::Read(address2), NoRegLog); + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::Simulate_ZtD_PgZ_ZnD_Xm(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + uint64_t xm = ReadXRegister(instr->GetRm()); + + LogicSVEAddressVector addr(xm, &zn, kFormatVnD); + int msize = -1; + bool is_signed = false; + + switch (form_hash_) { + case "ldnt1b_z_p_ar_d_64_unscaled"_h: + msize = 0; break; - } - case LDPSW_x: { - WriteXRegister(rt, Memory::Read(address), NoRegLog); - WriteXRegister(rt2, Memory::Read(address2), NoRegLog); + case "ldnt1d_z_p_ar_d_64_unscaled"_h: + msize = 3; break; - } - case STP_w: { - Memory::Write(address, ReadWRegister(rt)); - Memory::Write(address2, ReadWRegister(rt2)); + case "ldnt1h_z_p_ar_d_64_unscaled"_h: + msize = 1; break; - } - case STP_s: { - Memory::Write(address, ReadSRegister(rt)); - Memory::Write(address2, ReadSRegister(rt2)); + case "ldnt1sb_z_p_ar_d_64_unscaled"_h: + msize = 0; + is_signed = true; break; - } - case STP_x: { - Memory::Write(address, ReadXRegister(rt)); - Memory::Write(address2, ReadXRegister(rt2)); + case "ldnt1sh_z_p_ar_d_64_unscaled"_h: + msize = 1; + is_signed = true; break; - } - case STP_d: { - Memory::Write(address, ReadDRegister(rt)); - Memory::Write(address2, ReadDRegister(rt2)); + case "ldnt1sw_z_p_ar_d_64_unscaled"_h: + msize = 2; + is_signed = true; break; - } - case STP_q: { - Memory::Write(address, ReadQRegister(rt)); - Memory::Write(address2, ReadQRegister(rt2)); + case "ldnt1w_z_p_ar_d_64_unscaled"_h: + msize = 2; break; - } default: - VIXL_UNREACHABLE(); - } - - // Print a detailed trace (including the memory address) instead of the basic - // register:value trace generated by set_*reg(). - if (instr->IsLoad()) { - if ((op == LDP_s) || (op == LDP_d)) { - LogVRead(address, rt, GetPrintRegisterFormatForSizeFP(element_size)); - LogVRead(address2, rt2, GetPrintRegisterFormatForSizeFP(element_size)); - } else if (op == LDP_q) { - LogVRead(address, rt, GetPrintRegisterFormatForSize(element_size)); - LogVRead(address2, rt2, GetPrintRegisterFormatForSize(element_size)); - } else { - LogRead(address, rt, GetPrintRegisterFormatForSize(element_size)); - LogRead(address2, rt2, GetPrintRegisterFormatForSize(element_size)); - } - } else { - if ((op == STP_s) || (op == STP_d)) { - LogVWrite(address, rt, GetPrintRegisterFormatForSizeFP(element_size)); - LogVWrite(address2, rt2, GetPrintRegisterFormatForSizeFP(element_size)); - } else if (op == STP_q) { - LogVWrite(address, rt, GetPrintRegisterFormatForSize(element_size)); - LogVWrite(address2, rt2, GetPrintRegisterFormatForSize(element_size)); - } else { - LogWrite(address, rt, GetPrintRegisterFormatForSize(element_size)); - LogWrite(address2, rt2, GetPrintRegisterFormatForSize(element_size)); - } + VIXL_UNIMPLEMENTED(); } - - local_monitor_.MaybeClear(); + addr.SetMsizeInBytesLog2(msize); + SVEStructuredLoadHelper(kFormatVnD, pg, instr->GetRt(), addr, is_signed); } +void Simulator::Simulate_ZtD_Pg_ZnD_Xm(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + uint64_t xm = ReadXRegister(instr->GetRm()); -template -void Simulator::CompareAndSwapHelper(const Instruction* instr) { - unsigned rs = instr->GetRs(); - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - - CheckIsValidUnalignedAtomicAccess(rn, address, element_size); - - bool is_acquire = instr->ExtractBit(22) == 1; - bool is_release = instr->ExtractBit(15) == 1; + LogicSVEAddressVector addr(xm, &zn, kFormatVnD); + VIXL_ASSERT((form_hash_ == "stnt1b_z_p_ar_d_64_unscaled"_h) || + (form_hash_ == "stnt1d_z_p_ar_d_64_unscaled"_h) || + (form_hash_ == "stnt1h_z_p_ar_d_64_unscaled"_h) || + (form_hash_ == "stnt1w_z_p_ar_d_64_unscaled"_h)); - T comparevalue = ReadRegister(rs); - T newvalue = ReadRegister(rt); + addr.SetMsizeInBytesLog2( + instr->GetSVEMsizeFromDtype(/* is_signed = */ false)); + SVEStructuredStoreHelper(kFormatVnD, pg, instr->GetRt(), addr); +} - // The architecture permits that the data read clears any exclusive monitors - // associated with that location, even if the compare subsequently fails. - local_monitor_.Clear(); +void Simulator::Simulate_ZtS_PgZ_ZnS_Xm(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + uint64_t xm = ReadXRegister(instr->GetRm()); - T data = Memory::Read(address); - if (is_acquire) { - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - } + LogicSVEAddressVector addr(xm, &zn, kFormatVnS); + int msize = -1; + bool is_signed = false; - if (data == comparevalue) { - if (is_release) { - // Approximate store-release by issuing a full barrier before the store. - __sync_synchronize(); - } - Memory::Write(address, newvalue); - LogWrite(address, rt, GetPrintRegisterFormatForSize(element_size)); + switch (form_hash_) { + case "ldnt1b_z_p_ar_s_x32_unscaled"_h: + msize = 0; + break; + case "ldnt1h_z_p_ar_s_x32_unscaled"_h: + msize = 1; + break; + case "ldnt1sb_z_p_ar_s_x32_unscaled"_h: + msize = 0; + is_signed = true; + break; + case "ldnt1sh_z_p_ar_s_x32_unscaled"_h: + msize = 1; + is_signed = true; + break; + case "ldnt1w_z_p_ar_s_x32_unscaled"_h: + msize = 2; + break; + default: + VIXL_UNIMPLEMENTED(); } - WriteRegister(rs, data); - LogRead(address, rs, GetPrintRegisterFormatForSize(element_size)); + addr.SetMsizeInBytesLog2(msize); + SVEStructuredLoadHelper(kFormatVnS, pg, instr->GetRt(), addr, is_signed); } +void Simulator::Simulate_ZtS_Pg_ZnS_Xm(const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + uint64_t xm = ReadXRegister(instr->GetRm()); -template -void Simulator::CompareAndSwapPairHelper(const Instruction* instr) { - VIXL_ASSERT((sizeof(T) == 4) || (sizeof(T) == 8)); - unsigned rs = instr->GetRs(); - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); + LogicSVEAddressVector addr(xm, &zn, kFormatVnS); + VIXL_ASSERT((form_hash_ == "stnt1b_z_p_ar_s_x32_unscaled"_h) || + (form_hash_ == "stnt1h_z_p_ar_s_x32_unscaled"_h) || + (form_hash_ == "stnt1w_z_p_ar_s_x32_unscaled"_h)); - VIXL_ASSERT((rs % 2 == 0) && (rs % 2 == 0)); + addr.SetMsizeInBytesLog2( + instr->GetSVEMsizeFromDtype(/* is_signed = */ false)); + SVEStructuredStoreHelper(kFormatVnS, pg, instr->GetRt(), addr); +} - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); +void Simulator::VisitReserved(const Instruction* instr) { + // UDF is the only instruction in this group, and the Decoder is precise here. + VIXL_ASSERT(instr->Mask(ReservedMask) == UDF); - CheckIsValidUnalignedAtomicAccess(rn, address, element_size * 2); + printf("UDF (permanently undefined) instruction at %p: 0x%08" PRIx32 "\n", + reinterpret_cast(instr), + instr->GetInstructionBits()); + VIXL_ABORT_WITH_MSG("UNDEFINED (UDF)\n"); +} - uint64_t address2 = address + element_size; - bool is_acquire = instr->ExtractBit(22) == 1; - bool is_release = instr->ExtractBit(15) == 1; +void Simulator::VisitUnimplemented(const Instruction* instr) { + printf("Unimplemented instruction at %p: 0x%08" PRIx32 "\n", + reinterpret_cast(instr), + instr->GetInstructionBits()); + VIXL_UNIMPLEMENTED(); +} - T comparevalue_high = ReadRegister(rs + 1); - T comparevalue_low = ReadRegister(rs); - T newvalue_high = ReadRegister(rt + 1); - T newvalue_low = ReadRegister(rt); - // The architecture permits that the data read clears any exclusive monitors - // associated with that location, even if the compare subsequently fails. - local_monitor_.Clear(); +void Simulator::VisitUnallocated(const Instruction* instr) { + printf("Unallocated instruction at %p: 0x%08" PRIx32 "\n", + reinterpret_cast(instr), + instr->GetInstructionBits()); + VIXL_UNIMPLEMENTED(); +} - T data_high = Memory::Read(address); - T data_low = Memory::Read(address2); - if (is_acquire) { - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - } +void Simulator::VisitPCRelAddressing(const Instruction* instr) { + VIXL_ASSERT((instr->Mask(PCRelAddressingMask) == ADR) || + (instr->Mask(PCRelAddressingMask) == ADRP)); - bool same = - (data_high == comparevalue_high) && (data_low == comparevalue_low); - if (same) { - if (is_release) { - // Approximate store-release by issuing a full barrier before the store. - __sync_synchronize(); - } + WriteRegister(instr->GetRd(), instr->GetImmPCOffsetTarget()); +} - Memory::Write(address, newvalue_high); - Memory::Write(address2, newvalue_low); - } - WriteRegister(rs + 1, data_high); - WriteRegister(rs, data_low); +void Simulator::VisitUnconditionalBranch(const Instruction* instr) { + switch (instr->Mask(UnconditionalBranchMask)) { + case BL: + WriteLr(instr->GetNextInstruction()); + VIXL_FALLTHROUGH(); + case B: + WritePc(instr->GetImmPCOffsetTarget()); + break; + default: + VIXL_UNREACHABLE(); + } +} - LogRead(address, rs + 1, GetPrintRegisterFormatForSize(element_size)); - LogRead(address2, rs, GetPrintRegisterFormatForSize(element_size)); - if (same) { - LogWrite(address, rt + 1, GetPrintRegisterFormatForSize(element_size)); - LogWrite(address2, rt, GetPrintRegisterFormatForSize(element_size)); +void Simulator::VisitConditionalBranch(const Instruction* instr) { + VIXL_ASSERT(instr->Mask(ConditionalBranchMask) == B_cond); + if (ConditionPassed(instr->GetConditionBranch())) { + WritePc(instr->GetImmPCOffsetTarget()); } } - -void Simulator::PrintExclusiveAccessWarning() { - if (print_exclusive_access_warning_) { - fprintf(stderr, - "%sWARNING:%s VIXL simulator support for " - "load-/store-/clear-exclusive " - "instructions is limited. Refer to the README for details.%s\n", - clr_warning, - clr_warning_message, - clr_normal); - print_exclusive_access_warning_ = false; +BType Simulator::GetBTypeFromInstruction(const Instruction* instr) const { + switch (instr->Mask(UnconditionalBranchToRegisterMask)) { + case BLR: + case BLRAA: + case BLRAB: + case BLRAAZ: + case BLRABZ: + return BranchAndLink; + case BR: + case BRAA: + case BRAB: + case BRAAZ: + case BRABZ: + if ((instr->GetRn() == 16) || (instr->GetRn() == 17) || + !PcIsInGuardedPage()) { + return BranchFromUnguardedOrToIP; + } + return BranchFromGuardedNotToIP; } + return DefaultBType; } +void Simulator::VisitUnconditionalBranchToRegister(const Instruction* instr) { + bool authenticate = false; + bool link = false; + uint64_t addr = ReadXRegister(instr->GetRn()); + uint64_t context = 0; -void Simulator::VisitLoadStoreExclusive(const Instruction* instr) { - LoadStoreExclusive op = - static_cast(instr->Mask(LoadStoreExclusiveMask)); + switch (instr->Mask(UnconditionalBranchToRegisterMask)) { + case BLR: + link = true; + VIXL_FALLTHROUGH(); + case BR: + case RET: + break; - switch (op) { - case CAS_w: - case CASA_w: - case CASL_w: - case CASAL_w: - CompareAndSwapHelper(instr); + case BLRAAZ: + case BLRABZ: + link = true; + VIXL_FALLTHROUGH(); + case BRAAZ: + case BRABZ: + authenticate = true; break; - case CAS_x: - case CASA_x: - case CASL_x: - case CASAL_x: - CompareAndSwapHelper(instr); - break; - case CASB: - case CASAB: - case CASLB: - case CASALB: - CompareAndSwapHelper(instr); - break; - case CASH: - case CASAH: - case CASLH: - case CASALH: - CompareAndSwapHelper(instr); - break; - case CASP_w: - case CASPA_w: - case CASPL_w: - case CASPAL_w: - CompareAndSwapPairHelper(instr); + + case BLRAA: + case BLRAB: + link = true; + VIXL_FALLTHROUGH(); + case BRAA: + case BRAB: + authenticate = true; + context = ReadXRegister(instr->GetRd()); break; - case CASP_x: - case CASPA_x: - case CASPL_x: - case CASPAL_x: - CompareAndSwapPairHelper(instr); + + case RETAA: + case RETAB: + authenticate = true; + addr = ReadXRegister(kLinkRegCode); + context = ReadXRegister(31, Reg31IsStackPointer); break; default: - PrintExclusiveAccessWarning(); - - unsigned rs = instr->GetRs(); - unsigned rt = instr->GetRt(); - unsigned rt2 = instr->GetRt2(); - unsigned rn = instr->GetRn(); - - bool is_exclusive = !instr->GetLdStXNotExclusive(); - bool is_acquire_release = - !is_exclusive || instr->GetLdStXAcquireRelease(); - bool is_load = instr->GetLdStXLoad(); - bool is_pair = instr->GetLdStXPair(); - - unsigned element_size = 1 << instr->GetLdStXSizeLog2(); - unsigned access_size = is_pair ? element_size * 2 : element_size; - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - - CheckIsValidUnalignedAtomicAccess(rn, address, access_size); - - if (is_load) { - if (is_exclusive) { - local_monitor_.MarkExclusive(address, access_size); - } else { - // Any non-exclusive load can clear the local monitor as a side - // effect. We don't need to do this, but it is useful to stress the - // simulated code. - local_monitor_.Clear(); - } - - // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_FP_REGS). - // We will print a more detailed log. - switch (op) { - case LDXRB_w: - case LDAXRB_w: - case LDARB_w: - case LDLARB: - WriteWRegister(rt, Memory::Read(address), NoRegLog); - break; - case LDXRH_w: - case LDAXRH_w: - case LDARH_w: - case LDLARH: - WriteWRegister(rt, Memory::Read(address), NoRegLog); - break; - case LDXR_w: - case LDAXR_w: - case LDAR_w: - case LDLAR_w: - WriteWRegister(rt, Memory::Read(address), NoRegLog); - break; - case LDXR_x: - case LDAXR_x: - case LDAR_x: - case LDLAR_x: - WriteXRegister(rt, Memory::Read(address), NoRegLog); - break; - case LDXP_w: - case LDAXP_w: - WriteWRegister(rt, Memory::Read(address), NoRegLog); - WriteWRegister(rt2, - Memory::Read(address + element_size), - NoRegLog); - break; - case LDXP_x: - case LDAXP_x: - WriteXRegister(rt, Memory::Read(address), NoRegLog); - WriteXRegister(rt2, - Memory::Read(address + element_size), - NoRegLog); - break; - default: - VIXL_UNREACHABLE(); - } + VIXL_UNREACHABLE(); + } - if (is_acquire_release) { - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - } + if (link) { + WriteLr(instr->GetNextInstruction()); + } - LogRead(address, rt, GetPrintRegisterFormatForSize(element_size)); - if (is_pair) { - LogRead(address + element_size, - rt2, - GetPrintRegisterFormatForSize(element_size)); - } - } else { - if (is_acquire_release) { - // Approximate store-release by issuing a full barrier before the - // store. - __sync_synchronize(); - } + if (authenticate) { + PACKey key = (instr->ExtractBit(10) == 0) ? kPACKeyIA : kPACKeyIB; + addr = AuthPAC(addr, context, key, kInstructionPointer); - bool do_store = true; - if (is_exclusive) { - do_store = local_monitor_.IsExclusive(address, access_size) && - global_monitor_.IsExclusive(address, access_size); - WriteWRegister(rs, do_store ? 0 : 1); + int error_lsb = GetTopPACBit(addr, kInstructionPointer) - 2; + if (((addr >> error_lsb) & 0x3) != 0x0) { + VIXL_ABORT_WITH_MSG("Failed to authenticate pointer."); + } + } - // - All exclusive stores explicitly clear the local monitor. - local_monitor_.Clear(); - } else { - // - Any other store can clear the local monitor as a side effect. - local_monitor_.MaybeClear(); - } + WriteNextBType(GetBTypeFromInstruction(instr)); + WritePc(Instruction::Cast(addr)); +} - if (do_store) { - switch (op) { - case STXRB_w: - case STLXRB_w: - case STLRB_w: - case STLLRB: - Memory::Write(address, ReadWRegister(rt)); - break; - case STXRH_w: - case STLXRH_w: - case STLRH_w: - case STLLRH: - Memory::Write(address, ReadWRegister(rt)); - break; - case STXR_w: - case STLXR_w: - case STLR_w: - case STLLR_w: - Memory::Write(address, ReadWRegister(rt)); - break; - case STXR_x: - case STLXR_x: - case STLR_x: - case STLLR_x: - Memory::Write(address, ReadXRegister(rt)); - break; - case STXP_w: - case STLXP_w: - Memory::Write(address, ReadWRegister(rt)); - Memory::Write(address + element_size, - ReadWRegister(rt2)); - break; - case STXP_x: - case STLXP_x: - Memory::Write(address, ReadXRegister(rt)); - Memory::Write(address + element_size, - ReadXRegister(rt2)); - break; - default: - VIXL_UNREACHABLE(); - } - LogWrite(address, rt, GetPrintRegisterFormatForSize(element_size)); - if (is_pair) { - LogWrite(address + element_size, - rt2, - GetPrintRegisterFormatForSize(element_size)); - } - } - } +void Simulator::VisitTestBranch(const Instruction* instr) { + unsigned bit_pos = + (instr->GetImmTestBranchBit5() << 5) | instr->GetImmTestBranchBit40(); + bool bit_zero = ((ReadXRegister(instr->GetRt()) >> bit_pos) & 1) == 0; + bool take_branch = false; + switch (instr->Mask(TestBranchMask)) { + case TBZ: + take_branch = bit_zero; + break; + case TBNZ: + take_branch = !bit_zero; + break; + default: + VIXL_UNIMPLEMENTED(); + } + if (take_branch) { + WritePc(instr->GetImmPCOffsetTarget()); } } -template -void Simulator::AtomicMemorySimpleHelper(const Instruction* instr) { - unsigned rs = instr->GetRs(); - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - - bool is_acquire = (instr->ExtractBit(23) == 1) && (rt != kZeroRegCode); - bool is_release = instr->ExtractBit(22) == 1; - - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - - CheckIsValidUnalignedAtomicAccess(rn, address, element_size); - - T value = ReadRegister(rs); - - T data = Memory::Read(address); - - if (is_acquire) { - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - } - T result = 0; - switch (instr->Mask(AtomicMemorySimpleOpMask)) { - case LDADDOp: - result = data + value; - break; - case LDCLROp: - VIXL_ASSERT(!std::numeric_limits::is_signed); - result = data & ~value; - break; - case LDEOROp: - VIXL_ASSERT(!std::numeric_limits::is_signed); - result = data ^ value; +void Simulator::VisitCompareBranch(const Instruction* instr) { + unsigned rt = instr->GetRt(); + bool take_branch = false; + switch (instr->Mask(CompareBranchMask)) { + case CBZ_w: + take_branch = (ReadWRegister(rt) == 0); break; - case LDSETOp: - VIXL_ASSERT(!std::numeric_limits::is_signed); - result = data | value; + case CBZ_x: + take_branch = (ReadXRegister(rt) == 0); break; - - // Signed/Unsigned difference is done via the templated type T. - case LDSMAXOp: - case LDUMAXOp: - result = (data > value) ? data : value; + case CBNZ_w: + take_branch = (ReadWRegister(rt) != 0); break; - case LDSMINOp: - case LDUMINOp: - result = (data > value) ? value : data; + case CBNZ_x: + take_branch = (ReadXRegister(rt) != 0); break; + default: + VIXL_UNIMPLEMENTED(); } - - if (is_release) { - // Approximate store-release by issuing a full barrier before the store. - __sync_synchronize(); + if (take_branch) { + WritePc(instr->GetImmPCOffsetTarget()); } - - Memory::Write(address, result); - WriteRegister(rt, data, NoRegLog); - - LogRead(address, rt, GetPrintRegisterFormatForSize(element_size)); - LogWrite(address, rs, GetPrintRegisterFormatForSize(element_size)); } -template -void Simulator::AtomicMemorySwapHelper(const Instruction* instr) { - unsigned rs = instr->GetRs(); - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - - bool is_acquire = (instr->ExtractBit(23) == 1) && (rt != kZeroRegCode); - bool is_release = instr->ExtractBit(22) == 1; - - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - - CheckIsValidUnalignedAtomicAccess(rn, address, element_size); - T data = Memory::Read(address); - if (is_acquire) { - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - } +void Simulator::AddSubHelper(const Instruction* instr, int64_t op2) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + bool set_flags = instr->GetFlagsUpdate(); + int64_t new_val = 0; + Instr operation = instr->Mask(AddSubOpMask); - if (is_release) { - // Approximate store-release by issuing a full barrier before the store. - __sync_synchronize(); + switch (operation) { + case ADD: + case ADDS: { + new_val = AddWithCarry(reg_size, + set_flags, + ReadRegister(reg_size, + instr->GetRn(), + instr->GetRnMode()), + op2); + break; + } + case SUB: + case SUBS: { + new_val = AddWithCarry(reg_size, + set_flags, + ReadRegister(reg_size, + instr->GetRn(), + instr->GetRnMode()), + ~op2, + 1); + break; + } + default: + VIXL_UNREACHABLE(); } - Memory::Write(address, ReadRegister(rs)); - - WriteRegister(rt, data); - LogRead(address, rt, GetPrintRegisterFormat(element_size)); - LogWrite(address, rs, GetPrintRegisterFormat(element_size)); + WriteRegister(reg_size, + instr->GetRd(), + new_val, + LogRegWrites, + instr->GetRdMode()); } -template -void Simulator::LoadAcquireRCpcHelper(const Instruction* instr) { - unsigned rt = instr->GetRt(); - unsigned rn = instr->GetRn(); - unsigned element_size = sizeof(T); - uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - - CheckIsValidUnalignedAtomicAccess(rn, address, element_size); +void Simulator::VisitAddSubShifted(const Instruction* instr) { + // Add/sub/adds/subs don't allow ROR as a shift mode. + VIXL_ASSERT(instr->GetShiftDP() != ROR); - WriteRegister(rt, Memory::Read(address)); + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t op2 = ShiftOperand(reg_size, + ReadRegister(reg_size, instr->GetRm()), + static_cast(instr->GetShiftDP()), + instr->GetImmDPShift()); + AddSubHelper(instr, op2); +} - // Approximate load-acquire by issuing a full barrier after the load. - __sync_synchronize(); - LogRead(address, rt, GetPrintRegisterFormat(element_size)); +void Simulator::VisitAddSubImmediate(const Instruction* instr) { + int64_t op2 = instr->GetImmAddSub() + << ((instr->GetImmAddSubShift() == 1) ? 12 : 0); + AddSubHelper(instr, op2); } -#define ATOMIC_MEMORY_SIMPLE_UINT_LIST(V) \ - V(LDADD) \ - V(LDCLR) \ - V(LDEOR) \ - V(LDSET) \ - V(LDUMAX) \ - V(LDUMIN) -#define ATOMIC_MEMORY_SIMPLE_INT_LIST(V) \ - V(LDSMAX) \ - V(LDSMIN) +void Simulator::VisitAddSubExtended(const Instruction* instr) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t op2 = ExtendValue(reg_size, + ReadRegister(reg_size, instr->GetRm()), + static_cast(instr->GetExtendMode()), + instr->GetImmExtendShift()); + AddSubHelper(instr, op2); +} -void Simulator::VisitAtomicMemory(const Instruction* instr) { - switch (instr->Mask(AtomicMemoryMask)) { -// clang-format off -#define SIM_FUNC_B(A) \ - case A##B: \ - case A##AB: \ - case A##LB: \ - case A##ALB: -#define SIM_FUNC_H(A) \ - case A##H: \ - case A##AH: \ - case A##LH: \ - case A##ALH: -#define SIM_FUNC_w(A) \ - case A##_w: \ - case A##A_w: \ - case A##L_w: \ - case A##AL_w: -#define SIM_FUNC_x(A) \ - case A##_x: \ - case A##A_x: \ - case A##L_x: \ - case A##AL_x: - ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_B) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_B) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_H) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_H) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_w) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_w) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_x) - AtomicMemorySimpleHelper(instr); - break; - ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_x) - AtomicMemorySimpleHelper(instr); - break; - // clang-format on +void Simulator::VisitAddSubWithCarry(const Instruction* instr) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t op2 = ReadRegister(reg_size, instr->GetRm()); + int64_t new_val; - case SWPB: - case SWPAB: - case SWPLB: - case SWPALB: - AtomicMemorySwapHelper(instr); - break; - case SWPH: - case SWPAH: - case SWPLH: - case SWPALH: - AtomicMemorySwapHelper(instr); - break; - case SWP_w: - case SWPA_w: - case SWPL_w: - case SWPAL_w: - AtomicMemorySwapHelper(instr); - break; - case SWP_x: - case SWPA_x: - case SWPL_x: - case SWPAL_x: - AtomicMemorySwapHelper(instr); - break; - case LDAPRB: - LoadAcquireRCpcHelper(instr); - break; - case LDAPRH: - LoadAcquireRCpcHelper(instr); - break; - case LDAPR_w: - LoadAcquireRCpcHelper(instr); - break; - case LDAPR_x: - LoadAcquireRCpcHelper(instr); - break; + if ((instr->Mask(AddSubOpMask) == SUB) || + (instr->Mask(AddSubOpMask) == SUBS)) { + op2 = ~op2; } -} + new_val = AddWithCarry(reg_size, + instr->GetFlagsUpdate(), + ReadRegister(reg_size, instr->GetRn()), + op2, + ReadC()); -void Simulator::VisitLoadLiteral(const Instruction* instr) { - unsigned rt = instr->GetRt(); - uint64_t address = instr->GetLiteralAddress(); + WriteRegister(reg_size, instr->GetRd(), new_val); +} - // Verify that the calculated address is available to the host. - VIXL_ASSERT(address == static_cast(address)); - switch (instr->Mask(LoadLiteralMask)) { - // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_VREGS), then - // print a more detailed log. - case LDR_w_lit: - WriteWRegister(rt, Memory::Read(address), NoRegLog); - LogRead(address, rt, kPrintWReg); - break; - case LDR_x_lit: - WriteXRegister(rt, Memory::Read(address), NoRegLog); - LogRead(address, rt, kPrintXReg); - break; - case LDR_s_lit: - WriteSRegister(rt, Memory::Read(address), NoRegLog); - LogVRead(address, rt, kPrintSReg); - break; - case LDR_d_lit: - WriteDRegister(rt, Memory::Read(address), NoRegLog); - LogVRead(address, rt, kPrintDReg); - break; - case LDR_q_lit: - WriteQRegister(rt, Memory::Read(address), NoRegLog); - LogVRead(address, rt, kPrintReg1Q); - break; - case LDRSW_x_lit: - WriteXRegister(rt, Memory::Read(address), NoRegLog); - LogRead(address, rt, kPrintWReg); - break; +void Simulator::VisitRotateRightIntoFlags(const Instruction* instr) { + switch (instr->Mask(RotateRightIntoFlagsMask)) { + case RMIF: { + uint64_t value = ReadRegister(instr->GetRn()); + unsigned shift = instr->GetImmRMIFRotation(); + unsigned mask = instr->GetNzcv(); + uint64_t rotated = RotateRight(value, shift, kXRegSize); - // Ignore prfm hint instructions. - case PRFM_lit: + ReadNzcv().SetFlags((rotated & mask) | (ReadNzcv().GetFlags() & ~mask)); break; - - default: - VIXL_UNREACHABLE(); + } } - - local_monitor_.MaybeClear(); } -uintptr_t Simulator::AddressModeHelper(unsigned addr_reg, - int64_t offset, - AddrMode addrmode) { - uint64_t address = ReadXRegister(addr_reg, Reg31IsStackPointer); - - if ((addr_reg == 31) && ((address % 16) != 0)) { - // When the base register is SP the stack pointer is required to be - // quadword aligned prior to the address calculation and write-backs. - // Misalignment will cause a stack alignment fault. - VIXL_ALIGNMENT_EXCEPTION(); - } +void Simulator::VisitEvaluateIntoFlags(const Instruction* instr) { + uint32_t value = ReadRegister(instr->GetRn()); + unsigned msb = (instr->Mask(EvaluateIntoFlagsMask) == SETF16) ? 15 : 7; - if ((addrmode == PreIndex) || (addrmode == PostIndex)) { - VIXL_ASSERT(offset != 0); - // Only preindex should log the register update here. For Postindex, the - // update will be printed automatically by LogWrittenRegisters _after_ the - // memory access itself is logged. - RegLogMode log_mode = (addrmode == PreIndex) ? LogRegWrites : NoRegLog; - WriteXRegister(addr_reg, address + offset, log_mode, Reg31IsStackPointer); - } - - if ((addrmode == Offset) || (addrmode == PreIndex)) { - address += offset; - } + unsigned sign_bit = (value >> msb) & 1; + unsigned overflow_bit = (value >> (msb + 1)) & 1; + ReadNzcv().SetN(sign_bit); + ReadNzcv().SetZ((value << (31 - msb)) == 0); + ReadNzcv().SetV(sign_bit ^ overflow_bit); +} - // Verify that the calculated address is available to the host. - VIXL_ASSERT(address == static_cast(address)); - return static_cast(address); +void Simulator::VisitLogicalShifted(const Instruction* instr) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + Shift shift_type = static_cast(instr->GetShiftDP()); + unsigned shift_amount = instr->GetImmDPShift(); + int64_t op2 = ShiftOperand(reg_size, + ReadRegister(reg_size, instr->GetRm()), + shift_type, + shift_amount); + if (instr->Mask(NOT) == NOT) { + op2 = ~op2; + } + LogicalHelper(instr, op2); } -void Simulator::VisitMoveWideImmediate(const Instruction* instr) { - MoveWideImmediateOp mov_op = - static_cast(instr->Mask(MoveWideImmediateMask)); - int64_t new_xn_val = 0; +void Simulator::VisitLogicalImmediate(const Instruction* instr) { + if (instr->GetImmLogical() == 0) { + VIXL_UNIMPLEMENTED(); + } else { + LogicalHelper(instr, instr->GetImmLogical()); + } +} - bool is_64_bits = instr->GetSixtyFourBits() == 1; - // Shift is limited for W operations. - VIXL_ASSERT(is_64_bits || (instr->GetShiftMoveWide() < 2)); - // Get the shifted immediate. - int64_t shift = instr->GetShiftMoveWide() * 16; - int64_t shifted_imm16 = static_cast(instr->GetImmMoveWide()) - << shift; +void Simulator::LogicalHelper(const Instruction* instr, int64_t op2) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t op1 = ReadRegister(reg_size, instr->GetRn()); + int64_t result = 0; + bool update_flags = false; - // Compute the new value. - switch (mov_op) { - case MOVN_w: - case MOVN_x: { - new_xn_val = ~shifted_imm16; - if (!is_64_bits) new_xn_val &= kWRegMask; + // Switch on the logical operation, stripping out the NOT bit, as it has a + // different meaning for logical immediate instructions. + switch (instr->Mask(LogicalOpMask & ~NOT)) { + case ANDS: + update_flags = true; + VIXL_FALLTHROUGH(); + case AND: + result = op1 & op2; break; - } - case MOVK_w: - case MOVK_x: { - unsigned reg_code = instr->GetRd(); - int64_t prev_xn_val = - is_64_bits ? ReadXRegister(reg_code) : ReadWRegister(reg_code); - new_xn_val = (prev_xn_val & ~(INT64_C(0xffff) << shift)) | shifted_imm16; + case ORR: + result = op1 | op2; break; - } - case MOVZ_w: - case MOVZ_x: { - new_xn_val = shifted_imm16; + case EOR: + result = op1 ^ op2; break; - } default: - VIXL_UNREACHABLE(); + VIXL_UNIMPLEMENTED(); } - // Update the destination register. - WriteXRegister(instr->GetRd(), new_xn_val); -} + if (update_flags) { + ReadNzcv().SetN(CalcNFlag(result, reg_size)); + ReadNzcv().SetZ(CalcZFlag(result)); + ReadNzcv().SetC(0); + ReadNzcv().SetV(0); + LogSystemRegister(NZCV); + } + WriteRegister(reg_size, + instr->GetRd(), + result, + LogRegWrites, + instr->GetRdMode()); +} -void Simulator::VisitConditionalSelect(const Instruction* instr) { - uint64_t new_val = ReadXRegister(instr->GetRn()); - if (ConditionFailed(static_cast(instr->GetCondition()))) { - new_val = ReadXRegister(instr->GetRm()); - switch (instr->Mask(ConditionalSelectMask)) { - case CSEL_w: - case CSEL_x: - break; - case CSINC_w: - case CSINC_x: - new_val++; - break; - case CSINV_w: - case CSINV_x: - new_val = ~new_val; - break; - case CSNEG_w: - case CSNEG_x: - new_val = -new_val; - break; - default: - VIXL_UNIMPLEMENTED(); - } - } +void Simulator::VisitConditionalCompareRegister(const Instruction* instr) { unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - WriteRegister(reg_size, instr->GetRd(), new_val); + ConditionalCompareHelper(instr, ReadRegister(reg_size, instr->GetRm())); } -// clang-format off -#define PAUTH_MODES(V) \ - V(IA, ReadXRegister(src), kPACKeyIA, kInstructionPointer) \ - V(IB, ReadXRegister(src), kPACKeyIB, kInstructionPointer) \ - V(IZA, 0x00000000, kPACKeyIA, kInstructionPointer) \ - V(IZB, 0x00000000, kPACKeyIB, kInstructionPointer) \ - V(DA, ReadXRegister(src), kPACKeyDA, kDataPointer) \ - V(DB, ReadXRegister(src), kPACKeyDB, kDataPointer) \ - V(DZA, 0x00000000, kPACKeyDA, kDataPointer) \ - V(DZB, 0x00000000, kPACKeyDB, kDataPointer) -// clang-format on +void Simulator::VisitConditionalCompareImmediate(const Instruction* instr) { + ConditionalCompareHelper(instr, instr->GetImmCondCmp()); +} -void Simulator::VisitDataProcessing1Source(const Instruction* instr) { - unsigned dst = instr->GetRd(); - unsigned src = instr->GetRn(); - switch (instr->Mask(DataProcessing1SourceMask)) { -#define DEFINE_PAUTH_FUNCS(SUFFIX, MOD, KEY, D) \ - case PAC##SUFFIX: { \ - uint64_t ptr = ReadXRegister(dst); \ - WriteXRegister(dst, AddPAC(ptr, MOD, KEY, D)); \ - break; \ - } \ - case AUT##SUFFIX: { \ - uint64_t ptr = ReadXRegister(dst); \ - WriteXRegister(dst, AuthPAC(ptr, MOD, KEY, D)); \ - break; \ +void Simulator::ConditionalCompareHelper(const Instruction* instr, + int64_t op2) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t op1 = ReadRegister(reg_size, instr->GetRn()); + + if (ConditionPassed(instr->GetCondition())) { + // If the condition passes, set the status flags to the result of comparing + // the operands. + if (instr->Mask(ConditionalCompareMask) == CCMP) { + AddWithCarry(reg_size, true, op1, ~op2, 1); + } else { + VIXL_ASSERT(instr->Mask(ConditionalCompareMask) == CCMN); + AddWithCarry(reg_size, true, op1, op2, 0); + } + } else { + // If the condition fails, set the status flags to the nzcv immediate. + ReadNzcv().SetFlags(instr->GetNzcv()); + LogSystemRegister(NZCV); } +} - PAUTH_MODES(DEFINE_PAUTH_FUNCS) -#undef DEFINE_PAUTH_FUNCS - case XPACI: - WriteXRegister(dst, StripPAC(ReadXRegister(dst), kInstructionPointer)); - break; - case XPACD: - WriteXRegister(dst, StripPAC(ReadXRegister(dst), kDataPointer)); - break; - case RBIT_w: - WriteWRegister(dst, ReverseBits(ReadWRegister(src))); - break; - case RBIT_x: - WriteXRegister(dst, ReverseBits(ReadXRegister(src))); - break; - case REV16_w: - WriteWRegister(dst, ReverseBytes(ReadWRegister(src), 1)); - break; - case REV16_x: - WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 1)); - break; - case REV_w: - WriteWRegister(dst, ReverseBytes(ReadWRegister(src), 2)); - break; - case REV32_x: - WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 2)); - break; - case REV_x: - WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 3)); - break; - case CLZ_w: - WriteWRegister(dst, CountLeadingZeros(ReadWRegister(src))); - break; - case CLZ_x: - WriteXRegister(dst, CountLeadingZeros(ReadXRegister(src))); - break; - case CLS_w: - WriteWRegister(dst, CountLeadingSignBits(ReadWRegister(src))); - break; - case CLS_x: - WriteXRegister(dst, CountLeadingSignBits(ReadXRegister(src))); - break; - default: - VIXL_UNIMPLEMENTED(); - } +void Simulator::VisitLoadStoreUnsignedOffset(const Instruction* instr) { + int offset = instr->GetImmLSUnsigned() << instr->GetSizeLS(); + LoadStoreHelper(instr, offset, Offset); } -uint32_t Simulator::Poly32Mod2(unsigned n, uint64_t data, uint32_t poly) { - VIXL_ASSERT((n > 32) && (n <= 64)); - for (unsigned i = (n - 1); i >= 32; i--) { - if (((data >> i) & 1) != 0) { - uint64_t polysh32 = (uint64_t)poly << (i - 32); - uint64_t mask = (UINT64_C(1) << i) - 1; - data = ((data & mask) ^ polysh32); - } - } - return data & 0xffffffff; +void Simulator::VisitLoadStoreUnscaledOffset(const Instruction* instr) { + LoadStoreHelper(instr, instr->GetImmLS(), Offset); } -template -uint32_t Simulator::Crc32Checksum(uint32_t acc, T val, uint32_t poly) { - unsigned size = sizeof(val) * 8; // Number of bits in type T. - VIXL_ASSERT((size == 8) || (size == 16) || (size == 32)); - uint64_t tempacc = static_cast(ReverseBits(acc)) << size; - uint64_t tempval = static_cast(ReverseBits(val)) << 32; - return ReverseBits(Poly32Mod2(32 + size, tempacc ^ tempval, poly)); +void Simulator::VisitLoadStorePreIndex(const Instruction* instr) { + LoadStoreHelper(instr, instr->GetImmLS(), PreIndex); } -uint32_t Simulator::Crc32Checksum(uint32_t acc, uint64_t val, uint32_t poly) { - // Poly32Mod2 cannot handle inputs with more than 32 bits, so compute - // the CRC of each 32-bit word sequentially. - acc = Crc32Checksum(acc, (uint32_t)(val & 0xffffffff), poly); - return Crc32Checksum(acc, (uint32_t)(val >> 32), poly); +void Simulator::VisitLoadStorePostIndex(const Instruction* instr) { + LoadStoreHelper(instr, instr->GetImmLS(), PostIndex); } -void Simulator::VisitDataProcessing2Source(const Instruction* instr) { - Shift shift_op = NO_SHIFT; - int64_t result = 0; - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; +template +void Simulator::LoadAcquireRCpcUnscaledOffsetHelper(const Instruction* instr) { + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); - switch (instr->Mask(DataProcessing2SourceMask)) { - case SDIV_w: { - int32_t rn = ReadWRegister(instr->GetRn()); - int32_t rm = ReadWRegister(instr->GetRm()); - if ((rn == kWMinInt) && (rm == -1)) { - result = kWMinInt; - } else if (rm == 0) { - // Division by zero can be trapped, but not on A-class processors. - result = 0; - } else { - result = rn / rm; - } - break; - } - case SDIV_x: { - int64_t rn = ReadXRegister(instr->GetRn()); - int64_t rm = ReadXRegister(instr->GetRm()); - if ((rn == kXMinInt) && (rm == -1)) { - result = kXMinInt; - } else if (rm == 0) { - // Division by zero can be trapped, but not on A-class processors. - result = 0; - } else { - result = rn / rm; - } - break; - } - case UDIV_w: { - uint32_t rn = static_cast(ReadWRegister(instr->GetRn())); - uint32_t rm = static_cast(ReadWRegister(instr->GetRm())); - if (rm == 0) { - // Division by zero can be trapped, but not on A-class processors. - result = 0; - } else { - result = rn / rm; - } - break; - } - case UDIV_x: { - uint64_t rn = static_cast(ReadXRegister(instr->GetRn())); - uint64_t rm = static_cast(ReadXRegister(instr->GetRm())); - if (rm == 0) { - // Division by zero can be trapped, but not on A-class processors. - result = 0; - } else { - result = rn / rm; - } - break; - } - case LSLV_w: - case LSLV_x: - shift_op = LSL; + unsigned element_size = sizeof(T2); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); + int offset = instr->GetImmLS(); + address += offset; + + // Verify that the address is available to the host. + VIXL_ASSERT(address == static_cast(address)); + + // Check the alignment of `address`. + if (AlignDown(address, 16) != AlignDown(address + element_size - 1, 16)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + + WriteRegister(rt, static_cast(MemRead(address))); + + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); + + LogRead(rt, GetPrintRegisterFormat(element_size), address); +} + + +template +void Simulator::StoreReleaseUnscaledOffsetHelper(const Instruction* instr) { + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); + + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); + int offset = instr->GetImmLS(); + address += offset; + + // Verify that the address is available to the host. + VIXL_ASSERT(address == static_cast(address)); + + // Check the alignment of `address`. + if (AlignDown(address, 16) != AlignDown(address + element_size - 1, 16)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + + // Approximate store-release by issuing a full barrier after the load. + __sync_synchronize(); + + MemWrite(address, ReadRegister(rt)); + + LogWrite(rt, GetPrintRegisterFormat(element_size), address); +} + + +void Simulator::VisitLoadStoreRCpcUnscaledOffset(const Instruction* instr) { + switch (instr->Mask(LoadStoreRCpcUnscaledOffsetMask)) { + case LDAPURB: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - case LSRV_w: - case LSRV_x: - shift_op = LSR; + case LDAPURH: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - case ASRV_w: - case ASRV_x: - shift_op = ASR; + case LDAPUR_w: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - case RORV_w: - case RORV_x: - shift_op = ROR; + case LDAPUR_x: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - case PACGA: { - uint64_t dst = static_cast(ReadXRegister(instr->GetRn())); - uint64_t src = static_cast( - ReadXRegister(instr->GetRm(), Reg31IsStackPointer)); - uint64_t code = ComputePAC(dst, src, kPACKeyGA); - result = code & 0xffffffff00000000; + case LDAPURSB_w: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - } - case CRC32B: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint8_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32_POLY); + case LDAPURSB_x: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - } - case CRC32H: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint16_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32_POLY); + case LDAPURSH_w: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - } - case CRC32W: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint32_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32_POLY); + case LDAPURSH_x: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - } - case CRC32X: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint64_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32_POLY); - reg_size = kWRegSize; + case LDAPURSW: + LoadAcquireRCpcUnscaledOffsetHelper(instr); break; - } - case CRC32CB: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint8_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32C_POLY); + case STLURB: + StoreReleaseUnscaledOffsetHelper(instr); break; - } - case CRC32CH: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint16_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32C_POLY); + case STLURH: + StoreReleaseUnscaledOffsetHelper(instr); break; - } - case CRC32CW: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint32_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32C_POLY); + case STLUR_w: + StoreReleaseUnscaledOffsetHelper(instr); break; - } - case CRC32CX: { - uint32_t acc = ReadRegister(instr->GetRn()); - uint64_t val = ReadRegister(instr->GetRm()); - result = Crc32Checksum(acc, val, CRC32C_POLY); - reg_size = kWRegSize; + case STLUR_x: + StoreReleaseUnscaledOffsetHelper(instr); break; - } - default: - VIXL_UNIMPLEMENTED(); } +} - if (shift_op != NO_SHIFT) { - // Shift distance encoded in the least-significant five/six bits of the - // register. - int mask = (instr->GetSixtyFourBits() == 1) ? 0x3f : 0x1f; - unsigned shift = ReadWRegister(instr->GetRm()) & mask; - result = ShiftOperand(reg_size, - ReadRegister(reg_size, instr->GetRn()), - shift_op, - shift); + +void Simulator::VisitLoadStorePAC(const Instruction* instr) { + unsigned dst = instr->GetRt(); + unsigned addr_reg = instr->GetRn(); + + uint64_t address = ReadXRegister(addr_reg, Reg31IsStackPointer); + + PACKey key = (instr->ExtractBit(23) == 0) ? kPACKeyDA : kPACKeyDB; + address = AuthPAC(address, 0, key, kDataPointer); + + int error_lsb = GetTopPACBit(address, kInstructionPointer) - 2; + if (((address >> error_lsb) & 0x3) != 0x0) { + VIXL_ABORT_WITH_MSG("Failed to authenticate pointer."); } - WriteRegister(reg_size, instr->GetRd(), result); -} -// The algorithm used is adapted from the one described in section 8.2 of -// Hacker's Delight, by Henry S. Warren, Jr. -template -static int64_t MultiplyHigh(T u, T v) { - uint64_t u0, v0, w0, u1, v1, w1, w2, t; - uint64_t sign_mask = UINT64_C(0x8000000000000000); - uint64_t sign_ext = 0; - if (std::numeric_limits::is_signed) { - sign_ext = UINT64_C(0xffffffff00000000); + if ((addr_reg == 31) && ((address % 16) != 0)) { + // When the base register is SP the stack pointer is required to be + // quadword aligned prior to the address calculation and write-backs. + // Misalignment will cause a stack alignment fault. + VIXL_ALIGNMENT_EXCEPTION(); + } + + int64_t offset = instr->GetImmLSPAC(); + address += offset; + + if (instr->Mask(LoadStorePACPreBit) == LoadStorePACPreBit) { + // Pre-index mode. + VIXL_ASSERT(offset != 0); + WriteXRegister(addr_reg, address, LogRegWrites, Reg31IsStackPointer); } - VIXL_ASSERT(sizeof(u) == sizeof(uint64_t)); - VIXL_ASSERT(sizeof(u) == sizeof(u0)); + uintptr_t addr_ptr = static_cast(address); + + // Verify that the calculated address is available to the host. + VIXL_ASSERT(address == addr_ptr); - u0 = u & 0xffffffff; - u1 = u >> 32 | (((u & sign_mask) != 0) ? sign_ext : 0); - v0 = v & 0xffffffff; - v1 = v >> 32 | (((v & sign_mask) != 0) ? sign_ext : 0); + WriteXRegister(dst, MemRead(addr_ptr), NoRegLog); + unsigned access_size = 1 << 3; + LogRead(dst, GetPrintRegisterFormatForSize(access_size), addr_ptr); +} - w0 = u0 * v0; - t = u1 * v0 + (w0 >> 32); - w1 = t & 0xffffffff; - w2 = t >> 32 | (((t & sign_mask) != 0) ? sign_ext : 0); - w1 = u0 * v1 + w1; - w1 = w1 >> 32 | (((w1 & sign_mask) != 0) ? sign_ext : 0); +void Simulator::VisitLoadStoreRegisterOffset(const Instruction* instr) { + Extend ext = static_cast(instr->GetExtendMode()); + VIXL_ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX)); + unsigned shift_amount = instr->GetImmShiftLS() * instr->GetSizeLS(); - uint64_t value = u1 * v1 + w2 + w1; - int64_t result; - memcpy(&result, &value, sizeof(result)); - return result; + int64_t offset = + ExtendValue(kXRegSize, ReadXRegister(instr->GetRm()), ext, shift_amount); + LoadStoreHelper(instr, offset, Offset); } -void Simulator::VisitDataProcessing3Source(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; +void Simulator::LoadStoreHelper(const Instruction* instr, + int64_t offset, + AddrMode addrmode) { + unsigned srcdst = instr->GetRt(); + uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addrmode); - uint64_t result = 0; - // Extract and sign- or zero-extend 32-bit arguments for widening operations. - uint64_t rn_u32 = ReadRegister(instr->GetRn()); - uint64_t rm_u32 = ReadRegister(instr->GetRm()); - int64_t rn_s32 = ReadRegister(instr->GetRn()); - int64_t rm_s32 = ReadRegister(instr->GetRm()); - uint64_t rn_u64 = ReadXRegister(instr->GetRn()); - uint64_t rm_u64 = ReadXRegister(instr->GetRm()); - switch (instr->Mask(DataProcessing3SourceMask)) { - case MADD_w: - case MADD_x: - result = ReadXRegister(instr->GetRa()) + (rn_u64 * rm_u64); + bool rt_is_vreg = false; + int extend_to_size = 0; + LoadStoreOp op = static_cast(instr->Mask(LoadStoreMask)); + switch (op) { + case LDRB_w: + WriteWRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kWRegSizeInBytes; break; - case MSUB_w: - case MSUB_x: - result = ReadXRegister(instr->GetRa()) - (rn_u64 * rm_u64); + case LDRH_w: + WriteWRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kWRegSizeInBytes; break; - case SMADDL_x: - result = ReadXRegister(instr->GetRa()) + - static_cast(rn_s32 * rm_s32); + case LDR_w: + WriteWRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kWRegSizeInBytes; break; - case SMSUBL_x: - result = ReadXRegister(instr->GetRa()) - - static_cast(rn_s32 * rm_s32); + case LDR_x: + WriteXRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kXRegSizeInBytes; break; - case UMADDL_x: - result = ReadXRegister(instr->GetRa()) + (rn_u32 * rm_u32); + case LDRSB_w: + WriteWRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kWRegSizeInBytes; break; - case UMSUBL_x: - result = ReadXRegister(instr->GetRa()) - (rn_u32 * rm_u32); + case LDRSH_w: + WriteWRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kWRegSizeInBytes; break; - case UMULH_x: - result = MultiplyHigh(ReadRegister(instr->GetRn()), - ReadRegister(instr->GetRm())); + case LDRSB_x: + WriteXRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kXRegSizeInBytes; break; - case SMULH_x: - result = MultiplyHigh(ReadXRegister(instr->GetRn()), - ReadXRegister(instr->GetRm())); + case LDRSH_x: + WriteXRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kXRegSizeInBytes; + break; + case LDRSW_x: + WriteXRegister(srcdst, MemRead(address), NoRegLog); + extend_to_size = kXRegSizeInBytes; + break; + case LDR_b: + WriteBRegister(srcdst, MemRead(address), NoRegLog); + rt_is_vreg = true; + break; + case LDR_h: + WriteHRegister(srcdst, MemRead(address), NoRegLog); + rt_is_vreg = true; + break; + case LDR_s: + WriteSRegister(srcdst, MemRead(address), NoRegLog); + rt_is_vreg = true; + break; + case LDR_d: + WriteDRegister(srcdst, MemRead(address), NoRegLog); + rt_is_vreg = true; + break; + case LDR_q: + WriteQRegister(srcdst, MemRead(address), NoRegLog); + rt_is_vreg = true; break; - default: - VIXL_UNIMPLEMENTED(); - } - WriteRegister(reg_size, instr->GetRd(), result); -} - - -void Simulator::VisitBitfield(const Instruction* instr) { - unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; - int64_t reg_mask = instr->GetSixtyFourBits() ? kXRegMask : kWRegMask; - int R = instr->GetImmR(); - int S = instr->GetImmS(); - int diff = S - R; - uint64_t mask; - if (diff >= 0) { - mask = ~UINT64_C(0) >> (64 - (diff + 1)); - mask = (static_cast(diff) < (reg_size - 1)) ? mask : reg_mask; - } else { - mask = ~UINT64_C(0) >> (64 - (S + 1)); - mask = RotateRight(mask, R, reg_size); - diff += reg_size; - } - // inzero indicates if the extracted bitfield is inserted into the - // destination register value or in zero. - // If extend is true, extend the sign of the extracted bitfield. - bool inzero = false; - bool extend = false; - switch (instr->Mask(BitfieldMask)) { - case BFM_x: - case BFM_w: + case STRB_w: + MemWrite(address, ReadWRegister(srcdst)); break; - case SBFM_x: - case SBFM_w: - inzero = true; - extend = true; + case STRH_w: + MemWrite(address, ReadWRegister(srcdst)); break; - case UBFM_x: - case UBFM_w: - inzero = true; + case STR_w: + MemWrite(address, ReadWRegister(srcdst)); + break; + case STR_x: + MemWrite(address, ReadXRegister(srcdst)); + break; + case STR_b: + MemWrite(address, ReadBRegister(srcdst)); + rt_is_vreg = true; + break; + case STR_h: + MemWrite(address, ReadHRegisterBits(srcdst)); + rt_is_vreg = true; + break; + case STR_s: + MemWrite(address, ReadSRegister(srcdst)); + rt_is_vreg = true; + break; + case STR_d: + MemWrite(address, ReadDRegister(srcdst)); + rt_is_vreg = true; + break; + case STR_q: + MemWrite(address, ReadQRegister(srcdst)); + rt_is_vreg = true; + break; + + // Ignore prfm hint instructions. + case PRFM: break; + default: VIXL_UNIMPLEMENTED(); } - uint64_t dst = inzero ? 0 : ReadRegister(reg_size, instr->GetRd()); - uint64_t src = ReadRegister(reg_size, instr->GetRn()); - // Rotate source bitfield into place. - uint64_t result = RotateRight(src, R, reg_size); - // Determine the sign extension. - uint64_t topbits = (diff == 63) ? 0 : (~UINT64_C(0) << (diff + 1)); - uint64_t signbits = extend && ((src >> S) & 1) ? topbits : 0; + // Print a detailed trace (including the memory address). + bool extend = (extend_to_size != 0); + unsigned access_size = 1 << instr->GetSizeLS(); + unsigned result_size = extend ? extend_to_size : access_size; + PrintRegisterFormat print_format = + rt_is_vreg ? GetPrintRegisterFormatForSizeTryFP(result_size) + : GetPrintRegisterFormatForSize(result_size); - // Merge sign extension, dest/zero and bitfield. - result = signbits | (result & mask) | (dst & ~mask); + if (instr->IsLoad()) { + if (rt_is_vreg) { + LogVRead(srcdst, print_format, address); + } else { + LogExtendingRead(srcdst, print_format, access_size, address); + } + } else if (instr->IsStore()) { + if (rt_is_vreg) { + LogVWrite(srcdst, print_format, address); + } else { + LogWrite(srcdst, GetPrintRegisterFormatForSize(result_size), address); + } + } else { + VIXL_ASSERT(op == PRFM); + } - WriteRegister(reg_size, instr->GetRd(), result); + local_monitor_.MaybeClear(); } -void Simulator::VisitExtract(const Instruction* instr) { - unsigned lsb = instr->GetImmS(); - unsigned reg_size = (instr->GetSixtyFourBits() == 1) ? kXRegSize : kWRegSize; - uint64_t low_res = - static_cast(ReadRegister(reg_size, instr->GetRm())) >> lsb; - uint64_t high_res = - (lsb == 0) ? 0 : ReadRegister(reg_size, instr->GetRn()) - << (reg_size - lsb); - WriteRegister(reg_size, instr->GetRd(), low_res | high_res); +void Simulator::VisitLoadStorePairOffset(const Instruction* instr) { + LoadStorePairHelper(instr, Offset); } -void Simulator::VisitFPImmediate(const Instruction* instr) { - AssertSupportedFPCR(); - unsigned dest = instr->GetRd(); - switch (instr->Mask(FPImmediateMask)) { - case FMOV_h_imm: - WriteHRegister(dest, Float16ToRawbits(instr->GetImmFP16())); - break; - case FMOV_s_imm: - WriteSRegister(dest, instr->GetImmFP32()); - break; - case FMOV_d_imm: - WriteDRegister(dest, instr->GetImmFP64()); - break; - default: - VIXL_UNREACHABLE(); - } +void Simulator::VisitLoadStorePairPreIndex(const Instruction* instr) { + LoadStorePairHelper(instr, PreIndex); } -void Simulator::VisitFPIntegerConvert(const Instruction* instr) { - AssertSupportedFPCR(); +void Simulator::VisitLoadStorePairPostIndex(const Instruction* instr) { + LoadStorePairHelper(instr, PostIndex); +} - unsigned dst = instr->GetRd(); - unsigned src = instr->GetRn(); - FPRounding round = ReadRMode(); +void Simulator::VisitLoadStorePairNonTemporal(const Instruction* instr) { + LoadStorePairHelper(instr, Offset); +} - switch (instr->Mask(FPIntegerConvertMask)) { - case FCVTAS_wh: - WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPTieAway)); - break; - case FCVTAS_xh: - WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPTieAway)); - break; - case FCVTAS_ws: - WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPTieAway)); - break; - case FCVTAS_xs: - WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPTieAway)); - break; - case FCVTAS_wd: - WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPTieAway)); - break; - case FCVTAS_xd: - WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPTieAway)); - break; - case FCVTAU_wh: - WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPTieAway)); - break; - case FCVTAU_xh: - WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPTieAway)); - break; - case FCVTAU_ws: - WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPTieAway)); - break; - case FCVTAU_xs: - WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPTieAway)); - break; - case FCVTAU_wd: - WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPTieAway)); - break; - case FCVTAU_xd: - WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPTieAway)); - break; - case FCVTMS_wh: - WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPNegativeInfinity)); - break; - case FCVTMS_xh: - WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPNegativeInfinity)); - break; - case FCVTMS_ws: - WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPNegativeInfinity)); - break; - case FCVTMS_xs: - WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPNegativeInfinity)); - break; - case FCVTMS_wd: - WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPNegativeInfinity)); - break; - case FCVTMS_xd: - WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPNegativeInfinity)); - break; - case FCVTMU_wh: - WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPNegativeInfinity)); - break; - case FCVTMU_xh: - WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPNegativeInfinity)); - break; - case FCVTMU_ws: - WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPNegativeInfinity)); - break; - case FCVTMU_xs: - WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPNegativeInfinity)); - break; - case FCVTMU_wd: - WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPNegativeInfinity)); + +void Simulator::LoadStorePairHelper(const Instruction* instr, + AddrMode addrmode) { + unsigned rt = instr->GetRt(); + unsigned rt2 = instr->GetRt2(); + int element_size = 1 << instr->GetSizeLSPair(); + int64_t offset = instr->GetImmLSPair() * element_size; + uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addrmode); + uintptr_t address2 = address + element_size; + + LoadStorePairOp op = + static_cast(instr->Mask(LoadStorePairMask)); + + // 'rt' and 'rt2' can only be aliased for stores. + VIXL_ASSERT(((op & LoadStorePairLBit) == 0) || (rt != rt2)); + + bool rt_is_vreg = false; + bool sign_extend = false; + switch (op) { + // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_FP_REGS). We + // will print a more detailed log. + case LDP_w: { + WriteWRegister(rt, MemRead(address), NoRegLog); + WriteWRegister(rt2, MemRead(address2), NoRegLog); break; - case FCVTMU_xd: - WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPNegativeInfinity)); + } + case LDP_s: { + WriteSRegister(rt, MemRead(address), NoRegLog); + WriteSRegister(rt2, MemRead(address2), NoRegLog); + rt_is_vreg = true; break; - case FCVTPS_wh: - WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPPositiveInfinity)); + } + case LDP_x: { + WriteXRegister(rt, MemRead(address), NoRegLog); + WriteXRegister(rt2, MemRead(address2), NoRegLog); break; - case FCVTPS_xh: - WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPPositiveInfinity)); + } + case LDP_d: { + WriteDRegister(rt, MemRead(address), NoRegLog); + WriteDRegister(rt2, MemRead(address2), NoRegLog); + rt_is_vreg = true; break; - case FCVTPS_ws: - WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPPositiveInfinity)); + } + case LDP_q: { + WriteQRegister(rt, MemRead(address), NoRegLog); + WriteQRegister(rt2, MemRead(address2), NoRegLog); + rt_is_vreg = true; break; - case FCVTPS_xs: - WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPPositiveInfinity)); + } + case LDPSW_x: { + WriteXRegister(rt, MemRead(address), NoRegLog); + WriteXRegister(rt2, MemRead(address2), NoRegLog); + sign_extend = true; break; - case FCVTPS_wd: - WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPPositiveInfinity)); + } + case STP_w: { + MemWrite(address, ReadWRegister(rt)); + MemWrite(address2, ReadWRegister(rt2)); break; - case FCVTPS_xd: - WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPPositiveInfinity)); + } + case STP_s: { + MemWrite(address, ReadSRegister(rt)); + MemWrite(address2, ReadSRegister(rt2)); + rt_is_vreg = true; break; - case FCVTPU_wh: - WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPPositiveInfinity)); + } + case STP_x: { + MemWrite(address, ReadXRegister(rt)); + MemWrite(address2, ReadXRegister(rt2)); break; - case FCVTPU_xh: - WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPPositiveInfinity)); + } + case STP_d: { + MemWrite(address, ReadDRegister(rt)); + MemWrite(address2, ReadDRegister(rt2)); + rt_is_vreg = true; break; - case FCVTPU_ws: - WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPPositiveInfinity)); - break; - case FCVTPU_xs: - WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPPositiveInfinity)); - break; - case FCVTPU_wd: - WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPPositiveInfinity)); - break; - case FCVTPU_xd: - WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPPositiveInfinity)); - break; - case FCVTNS_wh: - WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPTieEven)); - break; - case FCVTNS_xh: - WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPTieEven)); - break; - case FCVTNS_ws: - WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPTieEven)); - break; - case FCVTNS_xs: - WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPTieEven)); - break; - case FCVTNS_wd: - WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPTieEven)); - break; - case FCVTNS_xd: - WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPTieEven)); - break; - case FCVTNU_wh: - WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPTieEven)); - break; - case FCVTNU_xh: - WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPTieEven)); - break; - case FCVTNU_ws: - WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPTieEven)); - break; - case FCVTNU_xs: - WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPTieEven)); - break; - case FCVTNU_wd: - WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPTieEven)); - break; - case FCVTNU_xd: - WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPTieEven)); - break; - case FCVTZS_wh: - WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPZero)); - break; - case FCVTZS_xh: - WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPZero)); - break; - case FCVTZS_ws: - WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPZero)); - break; - case FCVTZS_xs: - WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPZero)); - break; - case FCVTZS_wd: - WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPZero)); - break; - case FCVTZS_xd: - WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPZero)); - break; - case FCVTZU_wh: - WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPZero)); - break; - case FCVTZU_xh: - WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPZero)); - break; - case FCVTZU_ws: - WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPZero)); - break; - case FCVTZU_xs: - WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPZero)); - break; - case FCVTZU_wd: - WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPZero)); - break; - case FCVTZU_xd: - WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPZero)); - break; - case FJCVTZS: - WriteWRegister(dst, FPToFixedJS(ReadDRegister(src))); - break; - case FMOV_hw: - WriteHRegister(dst, ReadWRegister(src) & kHRegMask); - break; - case FMOV_wh: - WriteWRegister(dst, ReadHRegisterBits(src)); - break; - case FMOV_xh: - WriteXRegister(dst, ReadHRegisterBits(src)); - break; - case FMOV_hx: - WriteHRegister(dst, ReadXRegister(src) & kHRegMask); - break; - case FMOV_ws: - WriteWRegister(dst, ReadSRegisterBits(src)); - break; - case FMOV_xd: - WriteXRegister(dst, ReadDRegisterBits(src)); - break; - case FMOV_sw: - WriteSRegisterBits(dst, ReadWRegister(src)); - break; - case FMOV_dx: - WriteDRegisterBits(dst, ReadXRegister(src)); - break; - case FMOV_d1_x: - LogicVRegister(ReadVRegister(dst)) - .SetUint(kFormatD, 1, ReadXRegister(src)); - break; - case FMOV_x_d1: - WriteXRegister(dst, LogicVRegister(ReadVRegister(src)).Uint(kFormatD, 1)); - break; - - // A 32-bit input can be handled in the same way as a 64-bit input, since - // the sign- or zero-extension will not affect the conversion. - case SCVTF_dx: - WriteDRegister(dst, FixedToDouble(ReadXRegister(src), 0, round)); - break; - case SCVTF_dw: - WriteDRegister(dst, FixedToDouble(ReadWRegister(src), 0, round)); - break; - case UCVTF_dx: - WriteDRegister(dst, UFixedToDouble(ReadXRegister(src), 0, round)); - break; - case UCVTF_dw: { - WriteDRegister(dst, - UFixedToDouble(ReadRegister(src), 0, round)); - break; - } - case SCVTF_sx: - WriteSRegister(dst, FixedToFloat(ReadXRegister(src), 0, round)); - break; - case SCVTF_sw: - WriteSRegister(dst, FixedToFloat(ReadWRegister(src), 0, round)); - break; - case UCVTF_sx: - WriteSRegister(dst, UFixedToFloat(ReadXRegister(src), 0, round)); - break; - case UCVTF_sw: { - WriteSRegister(dst, UFixedToFloat(ReadRegister(src), 0, round)); - break; - } - case SCVTF_hx: - WriteHRegister(dst, FixedToFloat16(ReadXRegister(src), 0, round)); - break; - case SCVTF_hw: - WriteHRegister(dst, FixedToFloat16(ReadWRegister(src), 0, round)); - break; - case UCVTF_hx: - WriteHRegister(dst, UFixedToFloat16(ReadXRegister(src), 0, round)); - break; - case UCVTF_hw: { - WriteHRegister(dst, - UFixedToFloat16(ReadRegister(src), 0, round)); + } + case STP_q: { + MemWrite(address, ReadQRegister(rt)); + MemWrite(address2, ReadQRegister(rt2)); + rt_is_vreg = true; break; } - default: VIXL_UNREACHABLE(); } + + // Print a detailed trace (including the memory address). + unsigned result_size = sign_extend ? kXRegSizeInBytes : element_size; + PrintRegisterFormat print_format = + rt_is_vreg ? GetPrintRegisterFormatForSizeTryFP(result_size) + : GetPrintRegisterFormatForSize(result_size); + + if (instr->IsLoad()) { + if (rt_is_vreg) { + LogVRead(rt, print_format, address); + LogVRead(rt2, print_format, address2); + } else if (sign_extend) { + LogExtendingRead(rt, print_format, element_size, address); + LogExtendingRead(rt2, print_format, element_size, address2); + } else { + LogRead(rt, print_format, address); + LogRead(rt2, print_format, address2); + } + } else { + if (rt_is_vreg) { + LogVWrite(rt, print_format, address); + LogVWrite(rt2, print_format, address2); + } else { + LogWrite(rt, print_format, address); + LogWrite(rt2, print_format, address2); + } + } + + local_monitor_.MaybeClear(); } -void Simulator::VisitFPFixedPointConvert(const Instruction* instr) { - AssertSupportedFPCR(); +template +void Simulator::CompareAndSwapHelper(const Instruction* instr) { + unsigned rs = instr->GetRs(); + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); - unsigned dst = instr->GetRd(); - unsigned src = instr->GetRn(); - int fbits = 64 - instr->GetFPScale(); + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - FPRounding round = ReadRMode(); + CheckIsValidUnalignedAtomicAccess(rn, address, element_size); - switch (instr->Mask(FPFixedPointConvertMask)) { - // A 32-bit input can be handled in the same way as a 64-bit input, since - // the sign- or zero-extension will not affect the conversion. - case SCVTF_dx_fixed: - WriteDRegister(dst, FixedToDouble(ReadXRegister(src), fbits, round)); - break; - case SCVTF_dw_fixed: - WriteDRegister(dst, FixedToDouble(ReadWRegister(src), fbits, round)); - break; - case UCVTF_dx_fixed: - WriteDRegister(dst, UFixedToDouble(ReadXRegister(src), fbits, round)); - break; - case UCVTF_dw_fixed: { - WriteDRegister(dst, - UFixedToDouble(ReadRegister(src), fbits, round)); - break; - } - case SCVTF_sx_fixed: - WriteSRegister(dst, FixedToFloat(ReadXRegister(src), fbits, round)); - break; - case SCVTF_sw_fixed: - WriteSRegister(dst, FixedToFloat(ReadWRegister(src), fbits, round)); - break; - case UCVTF_sx_fixed: - WriteSRegister(dst, UFixedToFloat(ReadXRegister(src), fbits, round)); - break; - case UCVTF_sw_fixed: { - WriteSRegister(dst, - UFixedToFloat(ReadRegister(src), fbits, round)); - break; - } - case SCVTF_hx_fixed: - WriteHRegister(dst, FixedToFloat16(ReadXRegister(src), fbits, round)); - break; - case SCVTF_hw_fixed: - WriteHRegister(dst, FixedToFloat16(ReadWRegister(src), fbits, round)); - break; - case UCVTF_hx_fixed: - WriteHRegister(dst, UFixedToFloat16(ReadXRegister(src), fbits, round)); - break; - case UCVTF_hw_fixed: { - WriteHRegister(dst, - UFixedToFloat16(ReadRegister(src), - fbits, - round)); - break; + bool is_acquire = instr->ExtractBit(22) == 1; + bool is_release = instr->ExtractBit(15) == 1; + + T comparevalue = ReadRegister(rs); + T newvalue = ReadRegister(rt); + + // The architecture permits that the data read clears any exclusive monitors + // associated with that location, even if the compare subsequently fails. + local_monitor_.Clear(); + + T data = MemRead(address); + if (is_acquire) { + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); + } + + if (data == comparevalue) { + if (is_release) { + // Approximate store-release by issuing a full barrier before the store. + __sync_synchronize(); } - case FCVTZS_xd_fixed: - WriteXRegister(dst, - FPToInt64(ReadDRegister(src) * std::pow(2.0, fbits), - FPZero)); - break; - case FCVTZS_wd_fixed: - WriteWRegister(dst, - FPToInt32(ReadDRegister(src) * std::pow(2.0, fbits), - FPZero)); - break; - case FCVTZU_xd_fixed: - WriteXRegister(dst, - FPToUInt64(ReadDRegister(src) * std::pow(2.0, fbits), - FPZero)); - break; - case FCVTZU_wd_fixed: - WriteWRegister(dst, - FPToUInt32(ReadDRegister(src) * std::pow(2.0, fbits), - FPZero)); - break; - case FCVTZS_xs_fixed: - WriteXRegister(dst, - FPToInt64(ReadSRegister(src) * std::pow(2.0f, fbits), - FPZero)); - break; - case FCVTZS_ws_fixed: - WriteWRegister(dst, - FPToInt32(ReadSRegister(src) * std::pow(2.0f, fbits), - FPZero)); - break; - case FCVTZU_xs_fixed: - WriteXRegister(dst, - FPToUInt64(ReadSRegister(src) * std::pow(2.0f, fbits), - FPZero)); - break; - case FCVTZU_ws_fixed: - WriteWRegister(dst, - FPToUInt32(ReadSRegister(src) * std::pow(2.0f, fbits), - FPZero)); - break; - case FCVTZS_xh_fixed: { - double output = - static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); - WriteXRegister(dst, FPToInt64(output, FPZero)); - break; - } - case FCVTZS_wh_fixed: { - double output = - static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); - WriteWRegister(dst, FPToInt32(output, FPZero)); - break; - } - case FCVTZU_xh_fixed: { - double output = - static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); - WriteXRegister(dst, FPToUInt64(output, FPZero)); - break; - } - case FCVTZU_wh_fixed: { - double output = - static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); - WriteWRegister(dst, FPToUInt32(output, FPZero)); - break; - } - default: - VIXL_UNREACHABLE(); + MemWrite(address, newvalue); + LogWrite(rt, GetPrintRegisterFormatForSize(element_size), address); } + WriteRegister(rs, data, NoRegLog); + LogRead(rs, GetPrintRegisterFormatForSize(element_size), address); } -void Simulator::VisitFPCompare(const Instruction* instr) { - AssertSupportedFPCR(); +template +void Simulator::CompareAndSwapPairHelper(const Instruction* instr) { + VIXL_ASSERT((sizeof(T) == 4) || (sizeof(T) == 8)); + unsigned rs = instr->GetRs(); + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); - FPTrapFlags trap = DisableTrap; - switch (instr->Mask(FPCompareMask)) { - case FCMPE_h: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_h: - FPCompare(ReadHRegister(instr->GetRn()), - ReadHRegister(instr->GetRm()), - trap); - break; - case FCMPE_s: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_s: - FPCompare(ReadSRegister(instr->GetRn()), - ReadSRegister(instr->GetRm()), - trap); - break; - case FCMPE_d: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_d: - FPCompare(ReadDRegister(instr->GetRn()), - ReadDRegister(instr->GetRm()), - trap); - break; - case FCMPE_h_zero: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_h_zero: - FPCompare(ReadHRegister(instr->GetRn()), SimFloat16(0.0), trap); - break; - case FCMPE_s_zero: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_s_zero: - FPCompare(ReadSRegister(instr->GetRn()), 0.0f, trap); - break; - case FCMPE_d_zero: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCMP_d_zero: - FPCompare(ReadDRegister(instr->GetRn()), 0.0, trap); - break; - default: - VIXL_UNIMPLEMENTED(); - } -} + VIXL_ASSERT((rs % 2 == 0) && (rt % 2 == 0)); + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); -void Simulator::VisitFPConditionalCompare(const Instruction* instr) { - AssertSupportedFPCR(); + CheckIsValidUnalignedAtomicAccess(rn, address, element_size * 2); - FPTrapFlags trap = DisableTrap; - switch (instr->Mask(FPConditionalCompareMask)) { - case FCCMPE_h: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCCMP_h: - if (ConditionPassed(instr->GetCondition())) { - FPCompare(ReadHRegister(instr->GetRn()), - ReadHRegister(instr->GetRm()), - trap); - } else { - ReadNzcv().SetFlags(instr->GetNzcv()); - LogSystemRegister(NZCV); - } - break; - case FCCMPE_s: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCCMP_s: - if (ConditionPassed(instr->GetCondition())) { - FPCompare(ReadSRegister(instr->GetRn()), - ReadSRegister(instr->GetRm()), - trap); - } else { - ReadNzcv().SetFlags(instr->GetNzcv()); - LogSystemRegister(NZCV); - } - break; - case FCCMPE_d: - trap = EnableTrap; - VIXL_FALLTHROUGH(); - case FCCMP_d: - if (ConditionPassed(instr->GetCondition())) { - FPCompare(ReadDRegister(instr->GetRn()), - ReadDRegister(instr->GetRm()), - trap); - } else { - ReadNzcv().SetFlags(instr->GetNzcv()); - LogSystemRegister(NZCV); - } - break; - default: - VIXL_UNIMPLEMENTED(); - } -} + uint64_t address2 = address + element_size; + bool is_acquire = instr->ExtractBit(22) == 1; + bool is_release = instr->ExtractBit(15) == 1; -void Simulator::VisitFPConditionalSelect(const Instruction* instr) { - AssertSupportedFPCR(); + T comparevalue_high = ReadRegister(rs + 1); + T comparevalue_low = ReadRegister(rs); + T newvalue_high = ReadRegister(rt + 1); + T newvalue_low = ReadRegister(rt); - Instr selected; - if (ConditionPassed(instr->GetCondition())) { - selected = instr->GetRn(); - } else { - selected = instr->GetRm(); + // The architecture permits that the data read clears any exclusive monitors + // associated with that location, even if the compare subsequently fails. + local_monitor_.Clear(); + + T data_low = MemRead(address); + T data_high = MemRead(address2); + + if (is_acquire) { + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); } - switch (instr->Mask(FPConditionalSelectMask)) { - case FCSEL_h: - WriteHRegister(instr->GetRd(), ReadHRegister(selected)); - break; - case FCSEL_s: - WriteSRegister(instr->GetRd(), ReadSRegister(selected)); - break; - case FCSEL_d: - WriteDRegister(instr->GetRd(), ReadDRegister(selected)); - break; - default: - VIXL_UNIMPLEMENTED(); + bool same = + (data_high == comparevalue_high) && (data_low == comparevalue_low); + if (same) { + if (is_release) { + // Approximate store-release by issuing a full barrier before the store. + __sync_synchronize(); + } + + MemWrite(address, newvalue_low); + MemWrite(address2, newvalue_high); } -} + WriteRegister(rs + 1, data_high, NoRegLog); + WriteRegister(rs, data_low, NoRegLog); -void Simulator::VisitFPDataProcessing1Source(const Instruction* instr) { - AssertSupportedFPCR(); + PrintRegisterFormat format = GetPrintRegisterFormatForSize(element_size); + LogRead(rs, format, address); + LogRead(rs + 1, format, address2); - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); - VectorFormat vform; - switch (instr->Mask(FPTypeMask)) { - default: - VIXL_UNREACHABLE_OR_FALLTHROUGH(); - case FP64: - vform = kFormatD; - break; - case FP32: - vform = kFormatS; - break; - case FP16: - vform = kFormatH; - break; + if (same) { + LogWrite(rt, format, address); + LogWrite(rt + 1, format, address2); + } +} + +bool Simulator::CanReadMemory(uintptr_t address, size_t size) { + // To simulate fault-tolerant loads, we need to know what host addresses we + // can access without generating a real fault. One way to do that is to + // attempt to `write()` the memory to a placeholder pipe[1]. This is more + // portable and less intrusive than using (global) signal handlers. + // + // [1]: https://stackoverflow.com/questions/7134590 + + size_t written = 0; + bool can_read = true; + // `write` will normally return after one invocation, but it is allowed to + // handle only part of the operation, so wrap it in a loop. + while (can_read && (written < size)) { + ssize_t result = write(placeholder_pipe_fd_[1], + reinterpret_cast(address + written), + size - written); + if (result > 0) { + written += result; + } else { + switch (result) { + case -EPERM: + case -EFAULT: + // The address range is not accessible. + // `write` is supposed to return -EFAULT in this case, but in practice + // it seems to return -EPERM, so we accept that too. + can_read = false; + break; + case -EINTR: + // The call was interrupted by a signal. Just try again. + break; + default: + // Any other error is fatal. + VIXL_ABORT(); + } + } + } + // Drain the read side of the pipe. If we don't do this, we'll leak memory as + // the placeholder data is buffered. As before, we expect to drain the whole + // write in one invocation, but cannot guarantee that, so we wrap it in a + // loop. This function is primarily intended to implement SVE fault-tolerant + // loads, so the maximum Z register size is a good default buffer size. + char buffer[kZRegMaxSizeInBytes]; + while (written > 0) { + ssize_t result = read(placeholder_pipe_fd_[0], + reinterpret_cast(buffer), + sizeof(buffer)); + // `read` blocks, and returns 0 only at EOF. We should not hit EOF until + // we've read everything that was written, so treat 0 as an error. + if (result > 0) { + VIXL_ASSERT(static_cast(result) <= written); + written -= result; + } else { + // For -EINTR, just try again. We can't handle any other error. + VIXL_CHECK(result == -EINTR); + } } - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - bool inexact_exception = false; + return can_read; +} - unsigned fd = instr->GetRd(); - unsigned fn = instr->GetRn(); +void Simulator::PrintExclusiveAccessWarning() { + if (print_exclusive_access_warning_) { + fprintf(stderr, + "%sWARNING:%s VIXL simulator support for " + "load-/store-/clear-exclusive " + "instructions is limited. Refer to the README for details.%s\n", + clr_warning, + clr_warning_message, + clr_normal); + print_exclusive_access_warning_ = false; + } +} - switch (instr->Mask(FPDataProcessing1SourceMask)) { - case FMOV_h: - WriteHRegister(fd, ReadHRegister(fn)); - return; - case FMOV_s: - WriteSRegister(fd, ReadSRegister(fn)); - return; - case FMOV_d: - WriteDRegister(fd, ReadDRegister(fn)); - return; - case FABS_h: - case FABS_s: - case FABS_d: - fabs_(vform, ReadVRegister(fd), ReadVRegister(fn)); - // Explicitly log the register update whilst we have type information. - LogVRegister(fd, GetPrintRegisterFormatFP(vform)); - return; - case FNEG_h: - case FNEG_s: - case FNEG_d: - fneg(vform, ReadVRegister(fd), ReadVRegister(fn)); - // Explicitly log the register update whilst we have type information. - LogVRegister(fd, GetPrintRegisterFormatFP(vform)); - return; - case FCVT_ds: - WriteDRegister(fd, FPToDouble(ReadSRegister(fn), ReadDN())); - return; - case FCVT_sd: - WriteSRegister(fd, FPToFloat(ReadDRegister(fn), FPTieEven, ReadDN())); - return; - case FCVT_hs: - WriteHRegister(fd, - Float16ToRawbits( - FPToFloat16(ReadSRegister(fn), FPTieEven, ReadDN()))); - return; - case FCVT_sh: - WriteSRegister(fd, FPToFloat(ReadHRegister(fn), ReadDN())); - return; - case FCVT_dh: - WriteDRegister(fd, FPToDouble(ReadHRegister(fn), ReadDN())); - return; - case FCVT_hd: - WriteHRegister(fd, - Float16ToRawbits( - FPToFloat16(ReadDRegister(fn), FPTieEven, ReadDN()))); - return; - case FSQRT_h: - case FSQRT_s: - case FSQRT_d: - fsqrt(vform, rd, rn); - // Explicitly log the register update whilst we have type information. - LogVRegister(fd, GetPrintRegisterFormatFP(vform)); - return; - case FRINTI_h: - case FRINTI_s: - case FRINTI_d: - break; // Use FPCR rounding mode. - case FRINTX_h: - case FRINTX_s: - case FRINTX_d: - inexact_exception = true; +void Simulator::VisitLoadStoreExclusive(const Instruction* instr) { + LoadStoreExclusive op = + static_cast(instr->Mask(LoadStoreExclusiveMask)); + + switch (op) { + case CAS_w: + case CASA_w: + case CASL_w: + case CASAL_w: + CompareAndSwapHelper(instr); break; - case FRINTA_h: - case FRINTA_s: - case FRINTA_d: - fpcr_rounding = FPTieAway; + case CAS_x: + case CASA_x: + case CASL_x: + case CASAL_x: + CompareAndSwapHelper(instr); break; - case FRINTM_h: - case FRINTM_s: - case FRINTM_d: - fpcr_rounding = FPNegativeInfinity; + case CASB: + case CASAB: + case CASLB: + case CASALB: + CompareAndSwapHelper(instr); break; - case FRINTN_h: - case FRINTN_s: - case FRINTN_d: - fpcr_rounding = FPTieEven; + case CASH: + case CASAH: + case CASLH: + case CASALH: + CompareAndSwapHelper(instr); break; - case FRINTP_h: - case FRINTP_s: - case FRINTP_d: - fpcr_rounding = FPPositiveInfinity; + case CASP_w: + case CASPA_w: + case CASPL_w: + case CASPAL_w: + CompareAndSwapPairHelper(instr); break; - case FRINTZ_h: - case FRINTZ_s: - case FRINTZ_d: - fpcr_rounding = FPZero; + case CASP_x: + case CASPA_x: + case CASPL_x: + case CASPAL_x: + CompareAndSwapPairHelper(instr); break; default: - VIXL_UNIMPLEMENTED(); - } + PrintExclusiveAccessWarning(); - // Only FRINT* instructions fall through the switch above. - frint(vform, rd, rn, fpcr_rounding, inexact_exception); - // Explicitly log the register update whilst we have type information. - LogVRegister(fd, GetPrintRegisterFormatFP(vform)); -} + unsigned rs = instr->GetRs(); + unsigned rt = instr->GetRt(); + unsigned rt2 = instr->GetRt2(); + unsigned rn = instr->GetRn(); + bool is_exclusive = !instr->GetLdStXNotExclusive(); + bool is_acquire_release = + !is_exclusive || instr->GetLdStXAcquireRelease(); + bool is_load = instr->GetLdStXLoad(); + bool is_pair = instr->GetLdStXPair(); -void Simulator::VisitFPDataProcessing2Source(const Instruction* instr) { - AssertSupportedFPCR(); + unsigned element_size = 1 << instr->GetLdStXSizeLog2(); + unsigned access_size = is_pair ? element_size * 2 : element_size; + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); - VectorFormat vform; - switch (instr->Mask(FPTypeMask)) { - default: - VIXL_UNREACHABLE_OR_FALLTHROUGH(); - case FP64: - vform = kFormatD; - break; - case FP32: - vform = kFormatS; - break; - case FP16: - vform = kFormatH; - break; - } - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + CheckIsValidUnalignedAtomicAccess(rn, address, access_size); - switch (instr->Mask(FPDataProcessing2SourceMask)) { - case FADD_h: - case FADD_s: - case FADD_d: - fadd(vform, rd, rn, rm); - break; - case FSUB_h: - case FSUB_s: - case FSUB_d: - fsub(vform, rd, rn, rm); - break; - case FMUL_h: - case FMUL_s: - case FMUL_d: - fmul(vform, rd, rn, rm); - break; - case FNMUL_h: - case FNMUL_s: - case FNMUL_d: - fnmul(vform, rd, rn, rm); - break; - case FDIV_h: - case FDIV_s: - case FDIV_d: - fdiv(vform, rd, rn, rm); - break; - case FMAX_h: - case FMAX_s: - case FMAX_d: - fmax(vform, rd, rn, rm); - break; - case FMIN_h: - case FMIN_s: - case FMIN_d: - fmin(vform, rd, rn, rm); - break; - case FMAXNM_h: - case FMAXNM_s: - case FMAXNM_d: - fmaxnm(vform, rd, rn, rm); - break; - case FMINNM_h: - case FMINNM_s: - case FMINNM_d: - fminnm(vform, rd, rn, rm); - break; - default: - VIXL_UNREACHABLE(); - } - // Explicitly log the register update whilst we have type information. - LogVRegister(instr->GetRd(), GetPrintRegisterFormatFP(vform)); -} + if (is_load) { + if (is_exclusive) { + local_monitor_.MarkExclusive(address, access_size); + } else { + // Any non-exclusive load can clear the local monitor as a side + // effect. We don't need to do this, but it is useful to stress the + // simulated code. + local_monitor_.Clear(); + } + // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_FP_REGS). + // We will print a more detailed log. + unsigned reg_size = 0; + switch (op) { + case LDXRB_w: + case LDAXRB_w: + case LDARB_w: + case LDLARB: + WriteWRegister(rt, MemRead(address), NoRegLog); + reg_size = kWRegSizeInBytes; + break; + case LDXRH_w: + case LDAXRH_w: + case LDARH_w: + case LDLARH: + WriteWRegister(rt, MemRead(address), NoRegLog); + reg_size = kWRegSizeInBytes; + break; + case LDXR_w: + case LDAXR_w: + case LDAR_w: + case LDLAR_w: + WriteWRegister(rt, MemRead(address), NoRegLog); + reg_size = kWRegSizeInBytes; + break; + case LDXR_x: + case LDAXR_x: + case LDAR_x: + case LDLAR_x: + WriteXRegister(rt, MemRead(address), NoRegLog); + reg_size = kXRegSizeInBytes; + break; + case LDXP_w: + case LDAXP_w: + WriteWRegister(rt, MemRead(address), NoRegLog); + WriteWRegister(rt2, + MemRead(address + element_size), + NoRegLog); + reg_size = kWRegSizeInBytes; + break; + case LDXP_x: + case LDAXP_x: + WriteXRegister(rt, MemRead(address), NoRegLog); + WriteXRegister(rt2, + MemRead(address + element_size), + NoRegLog); + reg_size = kXRegSizeInBytes; + break; + default: + VIXL_UNREACHABLE(); + } -void Simulator::VisitFPDataProcessing3Source(const Instruction* instr) { - AssertSupportedFPCR(); + if (is_acquire_release) { + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); + } - unsigned fd = instr->GetRd(); - unsigned fn = instr->GetRn(); - unsigned fm = instr->GetRm(); - unsigned fa = instr->GetRa(); + PrintRegisterFormat format = GetPrintRegisterFormatForSize(reg_size); + LogExtendingRead(rt, format, element_size, address); + if (is_pair) { + LogExtendingRead(rt2, format, element_size, address + element_size); + } + } else { + if (is_acquire_release) { + // Approximate store-release by issuing a full barrier before the + // store. + __sync_synchronize(); + } - switch (instr->Mask(FPDataProcessing3SourceMask)) { - // fd = fa +/- (fn * fm) - case FMADD_h: - WriteHRegister(fd, - FPMulAdd(ReadHRegister(fa), - ReadHRegister(fn), - ReadHRegister(fm))); - break; - case FMSUB_h: - WriteHRegister(fd, - FPMulAdd(ReadHRegister(fa), - -ReadHRegister(fn), - ReadHRegister(fm))); - break; - case FMADD_s: - WriteSRegister(fd, - FPMulAdd(ReadSRegister(fa), - ReadSRegister(fn), - ReadSRegister(fm))); - break; - case FMSUB_s: - WriteSRegister(fd, - FPMulAdd(ReadSRegister(fa), - -ReadSRegister(fn), - ReadSRegister(fm))); - break; - case FMADD_d: - WriteDRegister(fd, - FPMulAdd(ReadDRegister(fa), - ReadDRegister(fn), - ReadDRegister(fm))); - break; - case FMSUB_d: - WriteDRegister(fd, - FPMulAdd(ReadDRegister(fa), - -ReadDRegister(fn), - ReadDRegister(fm))); - break; - // Negated variants of the above. - case FNMADD_h: - WriteHRegister(fd, - FPMulAdd(-ReadHRegister(fa), - -ReadHRegister(fn), - ReadHRegister(fm))); + bool do_store = true; + if (is_exclusive) { + do_store = local_monitor_.IsExclusive(address, access_size) && + global_monitor_.IsExclusive(address, access_size); + WriteWRegister(rs, do_store ? 0 : 1); + + // - All exclusive stores explicitly clear the local monitor. + local_monitor_.Clear(); + } else { + // - Any other store can clear the local monitor as a side effect. + local_monitor_.MaybeClear(); + } + + if (do_store) { + switch (op) { + case STXRB_w: + case STLXRB_w: + case STLRB_w: + case STLLRB: + MemWrite(address, ReadWRegister(rt)); + break; + case STXRH_w: + case STLXRH_w: + case STLRH_w: + case STLLRH: + MemWrite(address, ReadWRegister(rt)); + break; + case STXR_w: + case STLXR_w: + case STLR_w: + case STLLR_w: + MemWrite(address, ReadWRegister(rt)); + break; + case STXR_x: + case STLXR_x: + case STLR_x: + case STLLR_x: + MemWrite(address, ReadXRegister(rt)); + break; + case STXP_w: + case STLXP_w: + MemWrite(address, ReadWRegister(rt)); + MemWrite(address + element_size, ReadWRegister(rt2)); + break; + case STXP_x: + case STLXP_x: + MemWrite(address, ReadXRegister(rt)); + MemWrite(address + element_size, ReadXRegister(rt2)); + break; + default: + VIXL_UNREACHABLE(); + } + + PrintRegisterFormat format = + GetPrintRegisterFormatForSize(element_size); + LogWrite(rt, format, address); + if (is_pair) { + LogWrite(rt2, format, address + element_size); + } + } + } + } +} + +template +void Simulator::AtomicMemorySimpleHelper(const Instruction* instr) { + unsigned rs = instr->GetRs(); + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); + + bool is_acquire = (instr->ExtractBit(23) == 1) && (rt != kZeroRegCode); + bool is_release = instr->ExtractBit(22) == 1; + + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); + + CheckIsValidUnalignedAtomicAccess(rn, address, element_size); + + T value = ReadRegister(rs); + + T data = MemRead(address); + + if (is_acquire) { + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); + } + + T result = 0; + switch (instr->Mask(AtomicMemorySimpleOpMask)) { + case LDADDOp: + result = data + value; break; - case FNMSUB_h: - WriteHRegister(fd, - FPMulAdd(-ReadHRegister(fa), - ReadHRegister(fn), - ReadHRegister(fm))); + case LDCLROp: + VIXL_ASSERT(!std::numeric_limits::is_signed); + result = data & ~value; break; - case FNMADD_s: - WriteSRegister(fd, - FPMulAdd(-ReadSRegister(fa), - -ReadSRegister(fn), - ReadSRegister(fm))); + case LDEOROp: + VIXL_ASSERT(!std::numeric_limits::is_signed); + result = data ^ value; break; - case FNMSUB_s: - WriteSRegister(fd, - FPMulAdd(-ReadSRegister(fa), - ReadSRegister(fn), - ReadSRegister(fm))); + case LDSETOp: + VIXL_ASSERT(!std::numeric_limits::is_signed); + result = data | value; break; - case FNMADD_d: - WriteDRegister(fd, - FPMulAdd(-ReadDRegister(fa), - -ReadDRegister(fn), - ReadDRegister(fm))); + + // Signed/Unsigned difference is done via the templated type T. + case LDSMAXOp: + case LDUMAXOp: + result = (data > value) ? data : value; break; - case FNMSUB_d: - WriteDRegister(fd, - FPMulAdd(-ReadDRegister(fa), - ReadDRegister(fn), - ReadDRegister(fm))); + case LDSMINOp: + case LDUMINOp: + result = (data > value) ? value : data; break; - default: - VIXL_UNIMPLEMENTED(); } -} + if (is_release) { + // Approximate store-release by issuing a full barrier before the store. + __sync_synchronize(); + } -bool Simulator::FPProcessNaNs(const Instruction* instr) { - unsigned fd = instr->GetRd(); - unsigned fn = instr->GetRn(); - unsigned fm = instr->GetRm(); - bool done = false; + WriteRegister(rt, data, NoRegLog); - if (instr->Mask(FP64) == FP64) { - double result = FPProcessNaNs(ReadDRegister(fn), ReadDRegister(fm)); - if (IsNaN(result)) { - WriteDRegister(fd, result); - done = true; - } - } else if (instr->Mask(FP32) == FP32) { - float result = FPProcessNaNs(ReadSRegister(fn), ReadSRegister(fm)); - if (IsNaN(result)) { - WriteSRegister(fd, result); - done = true; - } - } else { - VIXL_ASSERT(instr->Mask(FP16) == FP16); - VIXL_UNIMPLEMENTED(); + unsigned register_size = element_size; + if (element_size < kXRegSizeInBytes) { + register_size = kWRegSizeInBytes; } + PrintRegisterFormat format = GetPrintRegisterFormatForSize(register_size); + LogExtendingRead(rt, format, element_size, address); - return done; + MemWrite(address, result); + format = GetPrintRegisterFormatForSize(element_size); + LogWrite(rs, format, address); } +template +void Simulator::AtomicMemorySwapHelper(const Instruction* instr) { + unsigned rs = instr->GetRs(); + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); -void Simulator::SysOp_W(int op, int64_t val) { - switch (op) { - case IVAU: - case CVAC: - case CVAU: - case CVAP: - case CIVAC: { - // Perform a dummy memory access to ensure that we have read access - // to the specified address. - volatile uint8_t y = Memory::Read(val); - USE(y); - // TODO: Implement "case ZVA:". - break; - } - default: - VIXL_UNIMPLEMENTED(); - } -} + bool is_acquire = (instr->ExtractBit(23) == 1) && (rt != kZeroRegCode); + bool is_release = instr->ExtractBit(22) == 1; + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); -// clang-format off -#define PAUTH_SYSTEM_MODES(V) \ - V(A1716, 17, ReadXRegister(16), kPACKeyIA) \ - V(B1716, 17, ReadXRegister(16), kPACKeyIB) \ - V(AZ, 30, 0x00000000, kPACKeyIA) \ - V(BZ, 30, 0x00000000, kPACKeyIB) \ - V(ASP, 30, ReadXRegister(31, Reg31IsStackPointer), kPACKeyIA) \ - V(BSP, 30, ReadXRegister(31, Reg31IsStackPointer), kPACKeyIB) -// clang-format on + CheckIsValidUnalignedAtomicAccess(rn, address, element_size); + T data = MemRead(address); + if (is_acquire) { + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); + } -void Simulator::VisitSystem(const Instruction* instr) { - // Some system instructions hijack their Op and Cp fields to represent a - // range of immediates instead of indicating a different instruction. This - // makes the decoding tricky. - if (instr->GetInstructionBits() == XPACLRI) { - WriteXRegister(30, StripPAC(ReadXRegister(30), kInstructionPointer)); - } else if (instr->Mask(SystemPStateFMask) == SystemPStateFixed) { - switch (instr->Mask(SystemPStateMask)) { - case CFINV: - ReadNzcv().SetC(!ReadC()); - break; - case AXFLAG: - ReadNzcv().SetN(0); - ReadNzcv().SetZ(ReadNzcv().GetZ() | ReadNzcv().GetV()); - ReadNzcv().SetC(ReadNzcv().GetC() & ~ReadNzcv().GetV()); - ReadNzcv().SetV(0); - break; - case XAFLAG: { - // Can't set the flags in place due to the logical dependencies. - uint32_t n = (~ReadNzcv().GetC() & ~ReadNzcv().GetZ()) & 1; - uint32_t z = ReadNzcv().GetZ() & ReadNzcv().GetC(); - uint32_t c = ReadNzcv().GetC() | ReadNzcv().GetZ(); - uint32_t v = ~ReadNzcv().GetC() & ReadNzcv().GetZ(); - ReadNzcv().SetN(n); - ReadNzcv().SetZ(z); - ReadNzcv().SetC(c); - ReadNzcv().SetV(v); - break; - } - } - } else if (instr->Mask(SystemPAuthFMask) == SystemPAuthFixed) { - // Check BType allows PACI[AB]SP instructions. - if (PcIsInGuardedPage()) { - Instr i = instr->Mask(SystemPAuthMask); - if ((i == PACIASP) || (i == PACIBSP)) { - switch (ReadBType()) { - case DefaultBType: - VIXL_ABORT_WITH_MSG("Executing PACIXSP with wrong BType."); - break; - case BranchFromGuardedNotToIP: - // TODO: This case depends on the value of SCTLR_EL1.BT0, which we - // assume here to be zero. This allows execution of PACI[AB]SP when - // BTYPE is BranchFromGuardedNotToIP (0b11). - case BranchFromUnguardedOrToIP: - case BranchAndLink: - break; - } - } - } + if (is_release) { + // Approximate store-release by issuing a full barrier before the store. + __sync_synchronize(); + } + MemWrite(address, ReadRegister(rs)); - switch (instr->Mask(SystemPAuthMask)) { -#define DEFINE_PAUTH_FUNCS(SUFFIX, DST, MOD, KEY) \ - case PACI##SUFFIX: \ - WriteXRegister(DST, \ - AddPAC(ReadXRegister(DST), MOD, KEY, kInstructionPointer)); \ - break; \ - case AUTI##SUFFIX: \ - WriteXRegister(DST, \ - AuthPAC(ReadXRegister(DST), \ - MOD, \ - KEY, \ - kInstructionPointer)); \ - break; + WriteRegister(rt, data); - PAUTH_SYSTEM_MODES(DEFINE_PAUTH_FUNCS) -#undef DEFINE_PAUTH_FUNCS - } - } else if (instr->Mask(SystemExclusiveMonitorFMask) == - SystemExclusiveMonitorFixed) { - VIXL_ASSERT(instr->Mask(SystemExclusiveMonitorMask) == CLREX); - switch (instr->Mask(SystemExclusiveMonitorMask)) { - case CLREX: { - PrintExclusiveAccessWarning(); - ClearLocalMonitor(); - break; - } - } - } else if (instr->Mask(SystemSysRegFMask) == SystemSysRegFixed) { - switch (instr->Mask(SystemSysRegMask)) { - case MRS: { - switch (instr->GetImmSystemRegister()) { - case NZCV: - WriteXRegister(instr->GetRt(), ReadNzcv().GetRawValue()); - break; - case FPCR: - WriteXRegister(instr->GetRt(), ReadFpcr().GetRawValue()); - break; - default: - VIXL_UNIMPLEMENTED(); - } - break; - } - case MSR: { - switch (instr->GetImmSystemRegister()) { - case NZCV: - ReadNzcv().SetRawValue(ReadWRegister(instr->GetRt())); - LogSystemRegister(NZCV); - break; - case FPCR: - ReadFpcr().SetRawValue(ReadWRegister(instr->GetRt())); - LogSystemRegister(FPCR); - break; - default: - VIXL_UNIMPLEMENTED(); - } - break; - } - } - } else if (instr->Mask(SystemHintFMask) == SystemHintFixed) { - VIXL_ASSERT(instr->Mask(SystemHintMask) == HINT); - switch (instr->GetImmHint()) { - case NOP: - case ESB: - case CSDB: - case BTI_jc: - break; - case BTI: - if (PcIsInGuardedPage() && (ReadBType() != DefaultBType)) { - VIXL_ABORT_WITH_MSG("Executing BTI with wrong BType."); - } - break; - case BTI_c: - if (PcIsInGuardedPage() && (ReadBType() == BranchFromGuardedNotToIP)) { - VIXL_ABORT_WITH_MSG("Executing BTI c with wrong BType."); - } - break; - case BTI_j: - if (PcIsInGuardedPage() && (ReadBType() == BranchAndLink)) { - VIXL_ABORT_WITH_MSG("Executing BTI j with wrong BType."); - } - break; - default: - VIXL_UNIMPLEMENTED(); - } - } else if (instr->Mask(MemBarrierFMask) == MemBarrierFixed) { - __sync_synchronize(); - } else if ((instr->Mask(SystemSysFMask) == SystemSysFixed)) { - switch (instr->Mask(SystemSysMask)) { - case SYS: - SysOp_W(instr->GetSysOp(), ReadXRegister(instr->GetRt())); - break; - default: - VIXL_UNIMPLEMENTED(); - } - } else { - VIXL_UNIMPLEMENTED(); - } + PrintRegisterFormat format = GetPrintRegisterFormatForSize(element_size); + LogRead(rt, format, address); + LogWrite(rs, format, address); } +template +void Simulator::LoadAcquireRCpcHelper(const Instruction* instr) { + unsigned rt = instr->GetRt(); + unsigned rn = instr->GetRn(); -void Simulator::VisitException(const Instruction* instr) { - switch (instr->Mask(ExceptionMask)) { - case HLT: - switch (instr->GetImmException()) { - case kUnreachableOpcode: - DoUnreachable(instr); - return; - case kTraceOpcode: - DoTrace(instr); - return; - case kLogOpcode: - DoLog(instr); - return; - case kPrintfOpcode: - DoPrintf(instr); - return; - case kRuntimeCallOpcode: - DoRuntimeCall(instr); - return; - case kSetCPUFeaturesOpcode: - case kEnableCPUFeaturesOpcode: - case kDisableCPUFeaturesOpcode: - DoConfigureCPUFeatures(instr); - return; - case kSaveCPUFeaturesOpcode: - DoSaveCPUFeatures(instr); - return; - case kRestoreCPUFeaturesOpcode: - DoRestoreCPUFeatures(instr); - return; - default: - HostBreakpoint(); - return; - } - case BRK: - HostBreakpoint(); - return; - default: - VIXL_UNIMPLEMENTED(); - } -} + unsigned element_size = sizeof(T); + uint64_t address = ReadRegister(rn, Reg31IsStackPointer); + CheckIsValidUnalignedAtomicAccess(rn, address, element_size); -void Simulator::VisitCrypto2RegSHA(const Instruction* instr) { - VisitUnimplemented(instr); -} + WriteRegister(rt, MemRead(address)); + // Approximate load-acquire by issuing a full barrier after the load. + __sync_synchronize(); -void Simulator::VisitCrypto3RegSHA(const Instruction* instr) { - VisitUnimplemented(instr); + LogRead(rt, GetPrintRegisterFormatForSize(element_size), address); } +#define ATOMIC_MEMORY_SIMPLE_UINT_LIST(V) \ + V(LDADD) \ + V(LDCLR) \ + V(LDEOR) \ + V(LDSET) \ + V(LDUMAX) \ + V(LDUMIN) + +#define ATOMIC_MEMORY_SIMPLE_INT_LIST(V) \ + V(LDSMAX) \ + V(LDSMIN) -void Simulator::VisitCryptoAES(const Instruction* instr) { - VisitUnimplemented(instr); +void Simulator::VisitAtomicMemory(const Instruction* instr) { + switch (instr->Mask(AtomicMemoryMask)) { +// clang-format off +#define SIM_FUNC_B(A) \ + case A##B: \ + case A##AB: \ + case A##LB: \ + case A##ALB: +#define SIM_FUNC_H(A) \ + case A##H: \ + case A##AH: \ + case A##LH: \ + case A##ALH: +#define SIM_FUNC_w(A) \ + case A##_w: \ + case A##A_w: \ + case A##L_w: \ + case A##AL_w: +#define SIM_FUNC_x(A) \ + case A##_x: \ + case A##A_x: \ + case A##L_x: \ + case A##AL_x: + + ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_B) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_B) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_H) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_H) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_w) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_w) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_UINT_LIST(SIM_FUNC_x) + AtomicMemorySimpleHelper(instr); + break; + ATOMIC_MEMORY_SIMPLE_INT_LIST(SIM_FUNC_x) + AtomicMemorySimpleHelper(instr); + break; + // clang-format on + + case SWPB: + case SWPAB: + case SWPLB: + case SWPALB: + AtomicMemorySwapHelper(instr); + break; + case SWPH: + case SWPAH: + case SWPLH: + case SWPALH: + AtomicMemorySwapHelper(instr); + break; + case SWP_w: + case SWPA_w: + case SWPL_w: + case SWPAL_w: + AtomicMemorySwapHelper(instr); + break; + case SWP_x: + case SWPA_x: + case SWPL_x: + case SWPAL_x: + AtomicMemorySwapHelper(instr); + break; + case LDAPRB: + LoadAcquireRCpcHelper(instr); + break; + case LDAPRH: + LoadAcquireRCpcHelper(instr); + break; + case LDAPR_w: + LoadAcquireRCpcHelper(instr); + break; + case LDAPR_x: + LoadAcquireRCpcHelper(instr); + break; + } } -void Simulator::VisitNEON2RegMisc(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - VectorFormat vf = nfd.GetVectorFormat(); +void Simulator::VisitLoadLiteral(const Instruction* instr) { + unsigned rt = instr->GetRt(); + uint64_t address = instr->GetLiteralAddress(); - static const NEONFormatMap map_lp = - {{23, 22, 30}, {NF_4H, NF_8H, NF_2S, NF_4S, NF_1D, NF_2D}}; - VectorFormat vf_lp = nfd.GetVectorFormat(&map_lp); + // Verify that the calculated address is available to the host. + VIXL_ASSERT(address == static_cast(address)); - static const NEONFormatMap map_fcvtl = {{22}, {NF_4S, NF_2D}}; - VectorFormat vf_fcvtl = nfd.GetVectorFormat(&map_fcvtl); + switch (instr->Mask(LoadLiteralMask)) { + // Use NoRegLog to suppress the register trace (LOG_REGS, LOG_VREGS), then + // print a more detailed log. + case LDR_w_lit: + WriteWRegister(rt, MemRead(address), NoRegLog); + LogRead(rt, kPrintWReg, address); + break; + case LDR_x_lit: + WriteXRegister(rt, MemRead(address), NoRegLog); + LogRead(rt, kPrintXReg, address); + break; + case LDR_s_lit: + WriteSRegister(rt, MemRead(address), NoRegLog); + LogVRead(rt, kPrintSRegFP, address); + break; + case LDR_d_lit: + WriteDRegister(rt, MemRead(address), NoRegLog); + LogVRead(rt, kPrintDRegFP, address); + break; + case LDR_q_lit: + WriteQRegister(rt, MemRead(address), NoRegLog); + LogVRead(rt, kPrintReg1Q, address); + break; + case LDRSW_x_lit: + WriteXRegister(rt, MemRead(address), NoRegLog); + LogExtendingRead(rt, kPrintXReg, kWRegSizeInBytes, address); + break; - static const NEONFormatMap map_fcvtn = {{22, 30}, - {NF_4H, NF_8H, NF_2S, NF_4S}}; - VectorFormat vf_fcvtn = nfd.GetVectorFormat(&map_fcvtn); + // Ignore prfm hint instructions. + case PRFM_lit: + break; - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); + default: + VIXL_UNREACHABLE(); + } - if (instr->Mask(NEON2RegMiscOpcode) <= NEON_NEG_opcode) { - // These instructions all use a two bit size field, except NOT and RBIT, - // which use the field to encode the operation. - switch (instr->Mask(NEON2RegMiscMask)) { - case NEON_REV64: - rev64(vf, rd, rn); - break; - case NEON_REV32: - rev32(vf, rd, rn); - break; - case NEON_REV16: - rev16(vf, rd, rn); - break; - case NEON_SUQADD: - suqadd(vf, rd, rn); - break; - case NEON_USQADD: - usqadd(vf, rd, rn); - break; - case NEON_CLS: - cls(vf, rd, rn); - break; - case NEON_CLZ: - clz(vf, rd, rn); - break; - case NEON_CNT: - cnt(vf, rd, rn); - break; - case NEON_SQABS: - abs(vf, rd, rn).SignedSaturate(vf); - break; - case NEON_SQNEG: - neg(vf, rd, rn).SignedSaturate(vf); - break; - case NEON_CMGT_zero: - cmp(vf, rd, rn, 0, gt); - break; - case NEON_CMGE_zero: - cmp(vf, rd, rn, 0, ge); - break; - case NEON_CMEQ_zero: - cmp(vf, rd, rn, 0, eq); - break; - case NEON_CMLE_zero: - cmp(vf, rd, rn, 0, le); - break; - case NEON_CMLT_zero: - cmp(vf, rd, rn, 0, lt); - break; - case NEON_ABS: - abs(vf, rd, rn); - break; - case NEON_NEG: - neg(vf, rd, rn); - break; - case NEON_SADDLP: - saddlp(vf_lp, rd, rn); - break; - case NEON_UADDLP: - uaddlp(vf_lp, rd, rn); - break; - case NEON_SADALP: - sadalp(vf_lp, rd, rn); - break; - case NEON_UADALP: - uadalp(vf_lp, rd, rn); - break; - case NEON_RBIT_NOT: - vf = nfd.GetVectorFormat(nfd.LogicalFormatMap()); - switch (instr->GetFPType()) { - case 0: - not_(vf, rd, rn); - break; - case 1: - rbit(vf, rd, rn); - break; - default: - VIXL_UNIMPLEMENTED(); - } - break; - } - } else { - VectorFormat fpf = nfd.GetVectorFormat(nfd.FPFormatMap()); - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); - bool inexact_exception = false; + local_monitor_.MaybeClear(); +} - // These instructions all use a one bit size field, except XTN, SQXTUN, - // SHLL, SQXTN and UQXTN, which use a two bit size field. - switch (instr->Mask(NEON2RegMiscFPMask)) { - case NEON_FABS: - fabs_(fpf, rd, rn); - return; - case NEON_FNEG: - fneg(fpf, rd, rn); - return; - case NEON_FSQRT: - fsqrt(fpf, rd, rn); - return; - case NEON_FCVTL: - if (instr->Mask(NEON_Q)) { - fcvtl2(vf_fcvtl, rd, rn); - } else { - fcvtl(vf_fcvtl, rd, rn); - } - return; - case NEON_FCVTN: - if (instr->Mask(NEON_Q)) { - fcvtn2(vf_fcvtn, rd, rn); - } else { - fcvtn(vf_fcvtn, rd, rn); - } - return; - case NEON_FCVTXN: - if (instr->Mask(NEON_Q)) { - fcvtxn2(vf_fcvtn, rd, rn); - } else { - fcvtxn(vf_fcvtn, rd, rn); - } - return; - // The following instructions break from the switch statement, rather - // than return. - case NEON_FRINTI: - break; // Use FPCR rounding mode. - case NEON_FRINTX: - inexact_exception = true; - break; - case NEON_FRINTA: - fpcr_rounding = FPTieAway; - break; - case NEON_FRINTM: - fpcr_rounding = FPNegativeInfinity; - break; - case NEON_FRINTN: - fpcr_rounding = FPTieEven; - break; - case NEON_FRINTP: - fpcr_rounding = FPPositiveInfinity; - break; - case NEON_FRINTZ: - fpcr_rounding = FPZero; - break; +uintptr_t Simulator::AddressModeHelper(unsigned addr_reg, + int64_t offset, + AddrMode addrmode) { + uint64_t address = ReadXRegister(addr_reg, Reg31IsStackPointer); - case NEON_FCVTNS: - fcvts(fpf, rd, rn, FPTieEven); - return; - case NEON_FCVTNU: - fcvtu(fpf, rd, rn, FPTieEven); - return; - case NEON_FCVTPS: - fcvts(fpf, rd, rn, FPPositiveInfinity); - return; - case NEON_FCVTPU: - fcvtu(fpf, rd, rn, FPPositiveInfinity); - return; - case NEON_FCVTMS: - fcvts(fpf, rd, rn, FPNegativeInfinity); - return; - case NEON_FCVTMU: - fcvtu(fpf, rd, rn, FPNegativeInfinity); - return; - case NEON_FCVTZS: - fcvts(fpf, rd, rn, FPZero); - return; - case NEON_FCVTZU: - fcvtu(fpf, rd, rn, FPZero); - return; - case NEON_FCVTAS: - fcvts(fpf, rd, rn, FPTieAway); - return; - case NEON_FCVTAU: - fcvtu(fpf, rd, rn, FPTieAway); - return; - case NEON_SCVTF: - scvtf(fpf, rd, rn, 0, fpcr_rounding); - return; - case NEON_UCVTF: - ucvtf(fpf, rd, rn, 0, fpcr_rounding); - return; - case NEON_URSQRTE: - ursqrte(fpf, rd, rn); - return; - case NEON_URECPE: - urecpe(fpf, rd, rn); - return; - case NEON_FRSQRTE: - frsqrte(fpf, rd, rn); - return; - case NEON_FRECPE: - frecpe(fpf, rd, rn, fpcr_rounding); - return; - case NEON_FCMGT_zero: - fcmp_zero(fpf, rd, rn, gt); - return; - case NEON_FCMGE_zero: - fcmp_zero(fpf, rd, rn, ge); - return; - case NEON_FCMEQ_zero: - fcmp_zero(fpf, rd, rn, eq); - return; - case NEON_FCMLE_zero: - fcmp_zero(fpf, rd, rn, le); - return; - case NEON_FCMLT_zero: - fcmp_zero(fpf, rd, rn, lt); - return; - default: - if ((NEON_XTN_opcode <= instr->Mask(NEON2RegMiscOpcode)) && - (instr->Mask(NEON2RegMiscOpcode) <= NEON_UQXTN_opcode)) { - switch (instr->Mask(NEON2RegMiscMask)) { - case NEON_XTN: - xtn(vf, rd, rn); - return; - case NEON_SQXTN: - sqxtn(vf, rd, rn); - return; - case NEON_UQXTN: - uqxtn(vf, rd, rn); - return; - case NEON_SQXTUN: - sqxtun(vf, rd, rn); - return; - case NEON_SHLL: - vf = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); - if (instr->Mask(NEON_Q)) { - shll2(vf, rd, rn); - } else { - shll(vf, rd, rn); - } - return; - default: - VIXL_UNIMPLEMENTED(); - } - } else { - VIXL_UNIMPLEMENTED(); - } - } + if ((addr_reg == 31) && ((address % 16) != 0)) { + // When the base register is SP the stack pointer is required to be + // quadword aligned prior to the address calculation and write-backs. + // Misalignment will cause a stack alignment fault. + VIXL_ALIGNMENT_EXCEPTION(); + } - // Only FRINT* instructions fall through the switch above. - frint(fpf, rd, rn, fpcr_rounding, inexact_exception); + if ((addrmode == PreIndex) || (addrmode == PostIndex)) { + VIXL_ASSERT(offset != 0); + // Only preindex should log the register update here. For Postindex, the + // update will be printed automatically by LogWrittenRegisters _after_ the + // memory access itself is logged. + RegLogMode log_mode = (addrmode == PreIndex) ? LogRegWrites : NoRegLog; + WriteXRegister(addr_reg, address + offset, log_mode, Reg31IsStackPointer); + } + + if ((addrmode == Offset) || (addrmode == PreIndex)) { + address += offset; } + + // Verify that the calculated address is available to the host. + VIXL_ASSERT(address == static_cast(address)); + + return static_cast(address); } -void Simulator::VisitNEON2RegMiscFP16(const Instruction* instr) { - static const NEONFormatMap map_half = {{30}, {NF_4H, NF_8H}}; - NEONFormatDecoder nfd(instr); - VectorFormat fpf = nfd.GetVectorFormat(&map_half); +void Simulator::VisitMoveWideImmediate(const Instruction* instr) { + MoveWideImmediateOp mov_op = + static_cast(instr->Mask(MoveWideImmediateMask)); + int64_t new_xn_val = 0; - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + bool is_64_bits = instr->GetSixtyFourBits() == 1; + // Shift is limited for W operations. + VIXL_ASSERT(is_64_bits || (instr->GetShiftMoveWide() < 2)); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); + // Get the shifted immediate. + int64_t shift = instr->GetShiftMoveWide() * 16; + int64_t shifted_imm16 = static_cast(instr->GetImmMoveWide()) + << shift; - switch (instr->Mask(NEON2RegMiscFP16Mask)) { - case NEON_SCVTF_H: - scvtf(fpf, rd, rn, 0, fpcr_rounding); - return; - case NEON_UCVTF_H: - ucvtf(fpf, rd, rn, 0, fpcr_rounding); - return; - case NEON_FCVTNS_H: - fcvts(fpf, rd, rn, FPTieEven); - return; - case NEON_FCVTNU_H: - fcvtu(fpf, rd, rn, FPTieEven); - return; - case NEON_FCVTPS_H: - fcvts(fpf, rd, rn, FPPositiveInfinity); - return; - case NEON_FCVTPU_H: - fcvtu(fpf, rd, rn, FPPositiveInfinity); - return; - case NEON_FCVTMS_H: - fcvts(fpf, rd, rn, FPNegativeInfinity); - return; - case NEON_FCVTMU_H: - fcvtu(fpf, rd, rn, FPNegativeInfinity); - return; - case NEON_FCVTZS_H: - fcvts(fpf, rd, rn, FPZero); - return; - case NEON_FCVTZU_H: - fcvtu(fpf, rd, rn, FPZero); - return; - case NEON_FCVTAS_H: - fcvts(fpf, rd, rn, FPTieAway); - return; - case NEON_FCVTAU_H: - fcvtu(fpf, rd, rn, FPTieAway); - return; - case NEON_FRINTI_H: - frint(fpf, rd, rn, fpcr_rounding, false); - return; - case NEON_FRINTX_H: - frint(fpf, rd, rn, fpcr_rounding, true); - return; - case NEON_FRINTA_H: - frint(fpf, rd, rn, FPTieAway, false); - return; - case NEON_FRINTM_H: - frint(fpf, rd, rn, FPNegativeInfinity, false); - return; - case NEON_FRINTN_H: - frint(fpf, rd, rn, FPTieEven, false); - return; - case NEON_FRINTP_H: - frint(fpf, rd, rn, FPPositiveInfinity, false); - return; - case NEON_FRINTZ_H: - frint(fpf, rd, rn, FPZero, false); - return; - case NEON_FABS_H: - fabs_(fpf, rd, rn); - return; - case NEON_FNEG_H: - fneg(fpf, rd, rn); - return; - case NEON_FSQRT_H: - fsqrt(fpf, rd, rn); - return; - case NEON_FRSQRTE_H: - frsqrte(fpf, rd, rn); - return; - case NEON_FRECPE_H: - frecpe(fpf, rd, rn, fpcr_rounding); - return; - case NEON_FCMGT_H_zero: - fcmp_zero(fpf, rd, rn, gt); - return; - case NEON_FCMGE_H_zero: - fcmp_zero(fpf, rd, rn, ge); - return; - case NEON_FCMEQ_H_zero: - fcmp_zero(fpf, rd, rn, eq); - return; - case NEON_FCMLE_H_zero: - fcmp_zero(fpf, rd, rn, le); - return; - case NEON_FCMLT_H_zero: - fcmp_zero(fpf, rd, rn, lt); - return; + // Compute the new value. + switch (mov_op) { + case MOVN_w: + case MOVN_x: { + new_xn_val = ~shifted_imm16; + if (!is_64_bits) new_xn_val &= kWRegMask; + break; + } + case MOVK_w: + case MOVK_x: { + unsigned reg_code = instr->GetRd(); + int64_t prev_xn_val = + is_64_bits ? ReadXRegister(reg_code) : ReadWRegister(reg_code); + new_xn_val = (prev_xn_val & ~(INT64_C(0xffff) << shift)) | shifted_imm16; + break; + } + case MOVZ_w: + case MOVZ_x: { + new_xn_val = shifted_imm16; + break; + } default: - VIXL_UNIMPLEMENTED(); - return; + VIXL_UNREACHABLE(); } + + // Update the destination register. + WriteXRegister(instr->GetRd(), new_xn_val); } -void Simulator::VisitNEON3Same(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); +void Simulator::VisitConditionalSelect(const Instruction* instr) { + uint64_t new_val = ReadXRegister(instr->GetRn()); - if (instr->Mask(NEON3SameLogicalFMask) == NEON3SameLogicalFixed) { - VectorFormat vf = nfd.GetVectorFormat(nfd.LogicalFormatMap()); - switch (instr->Mask(NEON3SameLogicalMask)) { - case NEON_AND: - and_(vf, rd, rn, rm); - break; - case NEON_ORR: - orr(vf, rd, rn, rm); - break; - case NEON_ORN: - orn(vf, rd, rn, rm); - break; - case NEON_EOR: - eor(vf, rd, rn, rm); - break; - case NEON_BIC: - bic(vf, rd, rn, rm); + if (ConditionFailed(static_cast(instr->GetCondition()))) { + new_val = ReadXRegister(instr->GetRm()); + switch (instr->Mask(ConditionalSelectMask)) { + case CSEL_w: + case CSEL_x: break; - case NEON_BIF: - bif(vf, rd, rn, rm); + case CSINC_w: + case CSINC_x: + new_val++; break; - case NEON_BIT: - bit(vf, rd, rn, rm); + case CSINV_w: + case CSINV_x: + new_val = ~new_val; break; - case NEON_BSL: - bsl(vf, rd, rn, rm); + case CSNEG_w: + case CSNEG_x: + new_val = -new_val; break; default: VIXL_UNIMPLEMENTED(); } - } else if (instr->Mask(NEON3SameFPFMask) == NEON3SameFPFixed) { - VectorFormat vf = nfd.GetVectorFormat(nfd.FPFormatMap()); - switch (instr->Mask(NEON3SameFPMask)) { - case NEON_FADD: - fadd(vf, rd, rn, rm); - break; - case NEON_FSUB: - fsub(vf, rd, rn, rm); - break; - case NEON_FMUL: - fmul(vf, rd, rn, rm); - break; - case NEON_FDIV: - fdiv(vf, rd, rn, rm); - break; - case NEON_FMAX: - fmax(vf, rd, rn, rm); - break; - case NEON_FMIN: - fmin(vf, rd, rn, rm); - break; - case NEON_FMAXNM: - fmaxnm(vf, rd, rn, rm); - break; - case NEON_FMINNM: - fminnm(vf, rd, rn, rm); - break; - case NEON_FMLA: - fmla(vf, rd, rn, rm); - break; - case NEON_FMLS: - fmls(vf, rd, rn, rm); - break; - case NEON_FMULX: - fmulx(vf, rd, rn, rm); - break; - case NEON_FACGE: - fabscmp(vf, rd, rn, rm, ge); - break; - case NEON_FACGT: - fabscmp(vf, rd, rn, rm, gt); - break; - case NEON_FCMEQ: - fcmp(vf, rd, rn, rm, eq); - break; - case NEON_FCMGE: - fcmp(vf, rd, rn, rm, ge); - break; - case NEON_FCMGT: - fcmp(vf, rd, rn, rm, gt); - break; - case NEON_FRECPS: - frecps(vf, rd, rn, rm); - break; - case NEON_FRSQRTS: - frsqrts(vf, rd, rn, rm); - break; - case NEON_FABD: - fabd(vf, rd, rn, rm); - break; - case NEON_FADDP: - faddp(vf, rd, rn, rm); - break; - case NEON_FMAXP: - fmaxp(vf, rd, rn, rm); - break; - case NEON_FMAXNMP: - fmaxnmp(vf, rd, rn, rm); - break; - case NEON_FMINP: - fminp(vf, rd, rn, rm); - break; - case NEON_FMINNMP: - fminnmp(vf, rd, rn, rm); - break; - default: - // FMLAL{2} and FMLSL{2} have special-case encodings. - switch (instr->Mask(NEON3SameFHMMask)) { - case NEON_FMLAL: - fmlal(vf, rd, rn, rm); - break; - case NEON_FMLAL2: - fmlal2(vf, rd, rn, rm); - break; - case NEON_FMLSL: - fmlsl(vf, rd, rn, rm); - break; - case NEON_FMLSL2: - fmlsl2(vf, rd, rn, rm); - break; - default: - VIXL_UNIMPLEMENTED(); - } - } - } else { - VectorFormat vf = nfd.GetVectorFormat(); - switch (instr->Mask(NEON3SameMask)) { - case NEON_ADD: - add(vf, rd, rn, rm); - break; - case NEON_ADDP: - addp(vf, rd, rn, rm); - break; + } + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + WriteRegister(reg_size, instr->GetRd(), new_val); +} + + +#define PAUTH_MODES_REGISTER_CONTEXT(V) \ + V(i, a, kPACKeyIA, kInstructionPointer) \ + V(i, b, kPACKeyIB, kInstructionPointer) \ + V(d, a, kPACKeyDA, kDataPointer) \ + V(d, b, kPACKeyDB, kDataPointer) + +void Simulator::VisitDataProcessing1Source(const Instruction* instr) { + unsigned dst = instr->GetRd(); + unsigned src = instr->GetRn(); + Reg31Mode r31_pac = Reg31IsStackPointer; + + switch (form_hash_) { +#define DEFINE_PAUTH_FUNCS(SUF0, SUF1, KEY, D) \ + case "pac" #SUF0 "z" #SUF1 "_64z_dp_1src"_h: \ + VIXL_ASSERT(src == kZeroRegCode); \ + r31_pac = Reg31IsZeroRegister; \ + VIXL_FALLTHROUGH(); \ + case "pac" #SUF0 #SUF1 "_64p_dp_1src"_h: { \ + uint64_t mod = ReadXRegister(src, r31_pac); \ + uint64_t ptr = ReadXRegister(dst); \ + WriteXRegister(dst, AddPAC(ptr, mod, KEY, D)); \ + break; \ + } \ + case "aut" #SUF0 "z" #SUF1 "_64z_dp_1src"_h: \ + VIXL_ASSERT(src == kZeroRegCode); \ + r31_pac = Reg31IsZeroRegister; \ + VIXL_FALLTHROUGH(); \ + case "aut" #SUF0 #SUF1 "_64p_dp_1src"_h: { \ + uint64_t mod = ReadXRegister(src, r31_pac); \ + uint64_t ptr = ReadXRegister(dst); \ + WriteXRegister(dst, AuthPAC(ptr, mod, KEY, D)); \ + break; \ + } + PAUTH_MODES_REGISTER_CONTEXT(DEFINE_PAUTH_FUNCS) +#undef DEFINE_PAUTH_FUNCS + + case "xpaci_64z_dp_1src"_h: + WriteXRegister(dst, StripPAC(ReadXRegister(dst), kInstructionPointer)); + break; + case "xpacd_64z_dp_1src"_h: + WriteXRegister(dst, StripPAC(ReadXRegister(dst), kDataPointer)); + break; + case "rbit_32_dp_1src"_h: + WriteWRegister(dst, ReverseBits(ReadWRegister(src))); + break; + case "rbit_64_dp_1src"_h: + WriteXRegister(dst, ReverseBits(ReadXRegister(src))); + break; + case "rev16_32_dp_1src"_h: + WriteWRegister(dst, ReverseBytes(ReadWRegister(src), 1)); + break; + case "rev16_64_dp_1src"_h: + WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 1)); + break; + case "rev_32_dp_1src"_h: + WriteWRegister(dst, ReverseBytes(ReadWRegister(src), 2)); + break; + case "rev32_64_dp_1src"_h: + WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 2)); + break; + case "rev_64_dp_1src"_h: + WriteXRegister(dst, ReverseBytes(ReadXRegister(src), 3)); + break; + case "clz_32_dp_1src"_h: + WriteWRegister(dst, CountLeadingZeros(ReadWRegister(src))); + break; + case "clz_64_dp_1src"_h: + WriteXRegister(dst, CountLeadingZeros(ReadXRegister(src))); + break; + case "cls_32_dp_1src"_h: + WriteWRegister(dst, CountLeadingSignBits(ReadWRegister(src))); + break; + case "cls_64_dp_1src"_h: + WriteXRegister(dst, CountLeadingSignBits(ReadXRegister(src))); + break; + case "abs_32_dp_1src"_h: + WriteWRegister(dst, Abs(ReadWRegister(src))); + break; + case "abs_64_dp_1src"_h: + WriteXRegister(dst, Abs(ReadXRegister(src))); + break; + case "cnt_32_dp_1src"_h: + WriteWRegister(dst, CountSetBits(ReadWRegister(src))); + break; + case "cnt_64_dp_1src"_h: + WriteXRegister(dst, CountSetBits(ReadXRegister(src))); + break; + case "ctz_32_dp_1src"_h: + WriteWRegister(dst, CountTrailingZeros(ReadWRegister(src))); + break; + case "ctz_64_dp_1src"_h: + WriteXRegister(dst, CountTrailingZeros(ReadXRegister(src))); + break; + } +} + +uint32_t Simulator::Poly32Mod2(unsigned n, uint64_t data, uint32_t poly) { + VIXL_ASSERT((n > 32) && (n <= 64)); + for (unsigned i = (n - 1); i >= 32; i--) { + if (((data >> i) & 1) != 0) { + uint64_t polysh32 = (uint64_t)poly << (i - 32); + uint64_t mask = (UINT64_C(1) << i) - 1; + data = ((data & mask) ^ polysh32); + } + } + return data & 0xffffffff; +} + + +template +uint32_t Simulator::Crc32Checksum(uint32_t acc, T val, uint32_t poly) { + unsigned size = sizeof(val) * 8; // Number of bits in type T. + VIXL_ASSERT((size == 8) || (size == 16) || (size == 32)); + uint64_t tempacc = static_cast(ReverseBits(acc)) << size; + uint64_t tempval = static_cast(ReverseBits(val)) << 32; + return ReverseBits(Poly32Mod2(32 + size, tempacc ^ tempval, poly)); +} + + +uint32_t Simulator::Crc32Checksum(uint32_t acc, uint64_t val, uint32_t poly) { + // Poly32Mod2 cannot handle inputs with more than 32 bits, so compute + // the CRC of each 32-bit word sequentially. + acc = Crc32Checksum(acc, (uint32_t)(val & 0xffffffff), poly); + return Crc32Checksum(acc, (uint32_t)(val >> 32), poly); +} + + +void Simulator::VisitDataProcessing2Source(const Instruction* instr) { + Shift shift_op = NO_SHIFT; + int64_t result = 0; + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + + switch (instr->Mask(DataProcessing2SourceMask)) { + case SDIV_w: { + int32_t rn = ReadWRegister(instr->GetRn()); + int32_t rm = ReadWRegister(instr->GetRm()); + if ((rn == kWMinInt) && (rm == -1)) { + result = kWMinInt; + } else if (rm == 0) { + // Division by zero can be trapped, but not on A-class processors. + result = 0; + } else { + result = rn / rm; + } + break; + } + case SDIV_x: { + int64_t rn = ReadXRegister(instr->GetRn()); + int64_t rm = ReadXRegister(instr->GetRm()); + if ((rn == kXMinInt) && (rm == -1)) { + result = kXMinInt; + } else if (rm == 0) { + // Division by zero can be trapped, but not on A-class processors. + result = 0; + } else { + result = rn / rm; + } + break; + } + case UDIV_w: { + uint32_t rn = static_cast(ReadWRegister(instr->GetRn())); + uint32_t rm = static_cast(ReadWRegister(instr->GetRm())); + if (rm == 0) { + // Division by zero can be trapped, but not on A-class processors. + result = 0; + } else { + result = rn / rm; + } + break; + } + case UDIV_x: { + uint64_t rn = static_cast(ReadXRegister(instr->GetRn())); + uint64_t rm = static_cast(ReadXRegister(instr->GetRm())); + if (rm == 0) { + // Division by zero can be trapped, but not on A-class processors. + result = 0; + } else { + result = rn / rm; + } + break; + } + case LSLV_w: + case LSLV_x: + shift_op = LSL; + break; + case LSRV_w: + case LSRV_x: + shift_op = LSR; + break; + case ASRV_w: + case ASRV_x: + shift_op = ASR; + break; + case RORV_w: + case RORV_x: + shift_op = ROR; + break; + case PACGA: { + uint64_t dst = static_cast(ReadXRegister(instr->GetRn())); + uint64_t src = static_cast( + ReadXRegister(instr->GetRm(), Reg31IsStackPointer)); + uint64_t code = ComputePAC(dst, src, kPACKeyGA); + result = code & 0xffffffff00000000; + break; + } + case CRC32B: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint8_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32_POLY); + break; + } + case CRC32H: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint16_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32_POLY); + break; + } + case CRC32W: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint32_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32_POLY); + break; + } + case CRC32X: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint64_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32_POLY); + reg_size = kWRegSize; + break; + } + case CRC32CB: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint8_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32C_POLY); + break; + } + case CRC32CH: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint16_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32C_POLY); + break; + } + case CRC32CW: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint32_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32C_POLY); + break; + } + case CRC32CX: { + uint32_t acc = ReadRegister(instr->GetRn()); + uint64_t val = ReadRegister(instr->GetRm()); + result = Crc32Checksum(acc, val, CRC32C_POLY); + reg_size = kWRegSize; + break; + } + default: + VIXL_UNIMPLEMENTED(); + } + + if (shift_op != NO_SHIFT) { + // Shift distance encoded in the least-significant five/six bits of the + // register. + int mask = (instr->GetSixtyFourBits() == 1) ? 0x3f : 0x1f; + unsigned shift = ReadWRegister(instr->GetRm()) & mask; + result = ShiftOperand(reg_size, + ReadRegister(reg_size, instr->GetRn()), + shift_op, + shift); + } + WriteRegister(reg_size, instr->GetRd(), result); +} + +void Simulator::SimulateSignedMinMax(const Instruction* instr) { + int32_t wn = ReadWRegister(instr->GetRn()); + int32_t wm = ReadWRegister(instr->GetRm()); + int64_t xn = ReadXRegister(instr->GetRn()); + int64_t xm = ReadXRegister(instr->GetRm()); + int32_t imm = instr->ExtractSignedBits(17, 10); + int dst = instr->GetRd(); + + switch (form_hash_) { + case "smax_64_minmax_imm"_h: + case "smin_64_minmax_imm"_h: + xm = imm; + break; + case "smax_32_minmax_imm"_h: + case "smin_32_minmax_imm"_h: + wm = imm; + break; + } + + switch (form_hash_) { + case "smax_32_minmax_imm"_h: + case "smax_32_dp_2src"_h: + WriteWRegister(dst, std::max(wn, wm)); + break; + case "smax_64_minmax_imm"_h: + case "smax_64_dp_2src"_h: + WriteXRegister(dst, std::max(xn, xm)); + break; + case "smin_32_minmax_imm"_h: + case "smin_32_dp_2src"_h: + WriteWRegister(dst, std::min(wn, wm)); + break; + case "smin_64_minmax_imm"_h: + case "smin_64_dp_2src"_h: + WriteXRegister(dst, std::min(xn, xm)); + break; + } +} + +void Simulator::SimulateUnsignedMinMax(const Instruction* instr) { + uint64_t xn = ReadXRegister(instr->GetRn()); + uint64_t xm = ReadXRegister(instr->GetRm()); + uint32_t imm = instr->ExtractBits(17, 10); + int dst = instr->GetRd(); + + switch (form_hash_) { + case "umax_64u_minmax_imm"_h: + case "umax_32u_minmax_imm"_h: + case "umin_64u_minmax_imm"_h: + case "umin_32u_minmax_imm"_h: + xm = imm; + break; + } + + switch (form_hash_) { + case "umax_32u_minmax_imm"_h: + case "umax_32_dp_2src"_h: + xn &= 0xffff'ffff; + xm &= 0xffff'ffff; + VIXL_FALLTHROUGH(); + case "umax_64u_minmax_imm"_h: + case "umax_64_dp_2src"_h: + WriteXRegister(dst, std::max(xn, xm)); + break; + case "umin_32u_minmax_imm"_h: + case "umin_32_dp_2src"_h: + xn &= 0xffff'ffff; + xm &= 0xffff'ffff; + VIXL_FALLTHROUGH(); + case "umin_64u_minmax_imm"_h: + case "umin_64_dp_2src"_h: + WriteXRegister(dst, std::min(xn, xm)); + break; + } +} + +void Simulator::VisitDataProcessing3Source(const Instruction* instr) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + + uint64_t result = 0; + // Extract and sign- or zero-extend 32-bit arguments for widening operations. + uint64_t rn_u32 = ReadRegister(instr->GetRn()); + uint64_t rm_u32 = ReadRegister(instr->GetRm()); + int64_t rn_s32 = ReadRegister(instr->GetRn()); + int64_t rm_s32 = ReadRegister(instr->GetRm()); + uint64_t rn_u64 = ReadXRegister(instr->GetRn()); + uint64_t rm_u64 = ReadXRegister(instr->GetRm()); + switch (instr->Mask(DataProcessing3SourceMask)) { + case MADD_w: + case MADD_x: + result = ReadXRegister(instr->GetRa()) + (rn_u64 * rm_u64); + break; + case MSUB_w: + case MSUB_x: + result = ReadXRegister(instr->GetRa()) - (rn_u64 * rm_u64); + break; + case SMADDL_x: + result = ReadXRegister(instr->GetRa()) + + static_cast(rn_s32 * rm_s32); + break; + case SMSUBL_x: + result = ReadXRegister(instr->GetRa()) - + static_cast(rn_s32 * rm_s32); + break; + case UMADDL_x: + result = ReadXRegister(instr->GetRa()) + (rn_u32 * rm_u32); + break; + case UMSUBL_x: + result = ReadXRegister(instr->GetRa()) - (rn_u32 * rm_u32); + break; + case UMULH_x: + result = + internal::MultiplyHigh<64>(ReadRegister(instr->GetRn()), + ReadRegister(instr->GetRm())); + break; + case SMULH_x: + result = internal::MultiplyHigh<64>(ReadXRegister(instr->GetRn()), + ReadXRegister(instr->GetRm())); + break; + default: + VIXL_UNIMPLEMENTED(); + } + WriteRegister(reg_size, instr->GetRd(), result); +} + + +void Simulator::VisitBitfield(const Instruction* instr) { + unsigned reg_size = instr->GetSixtyFourBits() ? kXRegSize : kWRegSize; + int64_t reg_mask = instr->GetSixtyFourBits() ? kXRegMask : kWRegMask; + int R = instr->GetImmR(); + int S = instr->GetImmS(); + + if (instr->GetSixtyFourBits() != instr->GetBitN()) { + VisitUnallocated(instr); + } + + if ((instr->GetSixtyFourBits() == 0) && ((S > 31) || (R > 31))) { + VisitUnallocated(instr); + } + + int diff = S - R; + uint64_t mask; + if (diff >= 0) { + mask = ~UINT64_C(0) >> (64 - (diff + 1)); + mask = (static_cast(diff) < (reg_size - 1)) ? mask : reg_mask; + } else { + mask = ~UINT64_C(0) >> (64 - (S + 1)); + mask = RotateRight(mask, R, reg_size); + diff += reg_size; + } + + // inzero indicates if the extracted bitfield is inserted into the + // destination register value or in zero. + // If extend is true, extend the sign of the extracted bitfield. + bool inzero = false; + bool extend = false; + switch (instr->Mask(BitfieldMask)) { + case BFM_x: + case BFM_w: + break; + case SBFM_x: + case SBFM_w: + inzero = true; + extend = true; + break; + case UBFM_x: + case UBFM_w: + inzero = true; + break; + default: + VIXL_UNIMPLEMENTED(); + } + + uint64_t dst = inzero ? 0 : ReadRegister(reg_size, instr->GetRd()); + uint64_t src = ReadRegister(reg_size, instr->GetRn()); + // Rotate source bitfield into place. + uint64_t result = RotateRight(src, R, reg_size); + // Determine the sign extension. + uint64_t topbits = (diff == 63) ? 0 : (~UINT64_C(0) << (diff + 1)); + uint64_t signbits = extend && ((src >> S) & 1) ? topbits : 0; + + // Merge sign extension, dest/zero and bitfield. + result = signbits | (result & mask) | (dst & ~mask); + + WriteRegister(reg_size, instr->GetRd(), result); +} + + +void Simulator::VisitExtract(const Instruction* instr) { + unsigned lsb = instr->GetImmS(); + unsigned reg_size = (instr->GetSixtyFourBits() == 1) ? kXRegSize : kWRegSize; + uint64_t low_res = + static_cast(ReadRegister(reg_size, instr->GetRm())) >> lsb; + uint64_t high_res = (lsb == 0) + ? 0 + : ReadRegister(reg_size, instr->GetRn()) + << (reg_size - lsb); + WriteRegister(reg_size, instr->GetRd(), low_res | high_res); +} + + +void Simulator::VisitFPImmediate(const Instruction* instr) { + AssertSupportedFPCR(); + unsigned dest = instr->GetRd(); + switch (instr->Mask(FPImmediateMask)) { + case FMOV_h_imm: + WriteHRegister(dest, Float16ToRawbits(instr->GetImmFP16())); + break; + case FMOV_s_imm: + WriteSRegister(dest, instr->GetImmFP32()); + break; + case FMOV_d_imm: + WriteDRegister(dest, instr->GetImmFP64()); + break; + default: + VIXL_UNREACHABLE(); + } +} + + +void Simulator::VisitFPIntegerConvert(const Instruction* instr) { + AssertSupportedFPCR(); + + unsigned dst = instr->GetRd(); + unsigned src = instr->GetRn(); + + FPRounding round = ReadRMode(); + + switch (instr->Mask(FPIntegerConvertMask)) { + case FCVTAS_wh: + WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPTieAway)); + break; + case FCVTAS_xh: + WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPTieAway)); + break; + case FCVTAS_ws: + WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPTieAway)); + break; + case FCVTAS_xs: + WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPTieAway)); + break; + case FCVTAS_wd: + WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPTieAway)); + break; + case FCVTAS_xd: + WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPTieAway)); + break; + case FCVTAU_wh: + WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPTieAway)); + break; + case FCVTAU_xh: + WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPTieAway)); + break; + case FCVTAU_ws: + WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPTieAway)); + break; + case FCVTAU_xs: + WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPTieAway)); + break; + case FCVTAU_wd: + WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPTieAway)); + break; + case FCVTAU_xd: + WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPTieAway)); + break; + case FCVTMS_wh: + WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPNegativeInfinity)); + break; + case FCVTMS_xh: + WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPNegativeInfinity)); + break; + case FCVTMS_ws: + WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPNegativeInfinity)); + break; + case FCVTMS_xs: + WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPNegativeInfinity)); + break; + case FCVTMS_wd: + WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPNegativeInfinity)); + break; + case FCVTMS_xd: + WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_wh: + WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_xh: + WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_ws: + WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_xs: + WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_wd: + WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPNegativeInfinity)); + break; + case FCVTMU_xd: + WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPNegativeInfinity)); + break; + case FCVTPS_wh: + WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPPositiveInfinity)); + break; + case FCVTPS_xh: + WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPPositiveInfinity)); + break; + case FCVTPS_ws: + WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPPositiveInfinity)); + break; + case FCVTPS_xs: + WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPPositiveInfinity)); + break; + case FCVTPS_wd: + WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPPositiveInfinity)); + break; + case FCVTPS_xd: + WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_wh: + WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_xh: + WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_ws: + WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_xs: + WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_wd: + WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPPositiveInfinity)); + break; + case FCVTPU_xd: + WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPPositiveInfinity)); + break; + case FCVTNS_wh: + WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPTieEven)); + break; + case FCVTNS_xh: + WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPTieEven)); + break; + case FCVTNS_ws: + WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPTieEven)); + break; + case FCVTNS_xs: + WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPTieEven)); + break; + case FCVTNS_wd: + WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPTieEven)); + break; + case FCVTNS_xd: + WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPTieEven)); + break; + case FCVTNU_wh: + WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPTieEven)); + break; + case FCVTNU_xh: + WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPTieEven)); + break; + case FCVTNU_ws: + WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPTieEven)); + break; + case FCVTNU_xs: + WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPTieEven)); + break; + case FCVTNU_wd: + WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPTieEven)); + break; + case FCVTNU_xd: + WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPTieEven)); + break; + case FCVTZS_wh: + WriteWRegister(dst, FPToInt32(ReadHRegister(src), FPZero)); + break; + case FCVTZS_xh: + WriteXRegister(dst, FPToInt64(ReadHRegister(src), FPZero)); + break; + case FCVTZS_ws: + WriteWRegister(dst, FPToInt32(ReadSRegister(src), FPZero)); + break; + case FCVTZS_xs: + WriteXRegister(dst, FPToInt64(ReadSRegister(src), FPZero)); + break; + case FCVTZS_wd: + WriteWRegister(dst, FPToInt32(ReadDRegister(src), FPZero)); + break; + case FCVTZS_xd: + WriteXRegister(dst, FPToInt64(ReadDRegister(src), FPZero)); + break; + case FCVTZU_wh: + WriteWRegister(dst, FPToUInt32(ReadHRegister(src), FPZero)); + break; + case FCVTZU_xh: + WriteXRegister(dst, FPToUInt64(ReadHRegister(src), FPZero)); + break; + case FCVTZU_ws: + WriteWRegister(dst, FPToUInt32(ReadSRegister(src), FPZero)); + break; + case FCVTZU_xs: + WriteXRegister(dst, FPToUInt64(ReadSRegister(src), FPZero)); + break; + case FCVTZU_wd: + WriteWRegister(dst, FPToUInt32(ReadDRegister(src), FPZero)); + break; + case FCVTZU_xd: + WriteXRegister(dst, FPToUInt64(ReadDRegister(src), FPZero)); + break; + case FJCVTZS: + WriteWRegister(dst, FPToFixedJS(ReadDRegister(src))); + break; + case FMOV_hw: + WriteHRegister(dst, ReadWRegister(src) & kHRegMask); + break; + case FMOV_wh: + WriteWRegister(dst, ReadHRegisterBits(src)); + break; + case FMOV_xh: + WriteXRegister(dst, ReadHRegisterBits(src)); + break; + case FMOV_hx: + WriteHRegister(dst, ReadXRegister(src) & kHRegMask); + break; + case FMOV_ws: + WriteWRegister(dst, ReadSRegisterBits(src)); + break; + case FMOV_xd: + WriteXRegister(dst, ReadDRegisterBits(src)); + break; + case FMOV_sw: + WriteSRegisterBits(dst, ReadWRegister(src)); + break; + case FMOV_dx: + WriteDRegisterBits(dst, ReadXRegister(src)); + break; + case FMOV_d1_x: + LogicVRegister(ReadVRegister(dst)) + .SetUint(kFormatD, 1, ReadXRegister(src)); + break; + case FMOV_x_d1: + WriteXRegister(dst, LogicVRegister(ReadVRegister(src)).Uint(kFormatD, 1)); + break; + + // A 32-bit input can be handled in the same way as a 64-bit input, since + // the sign- or zero-extension will not affect the conversion. + case SCVTF_dx: + WriteDRegister(dst, FixedToDouble(ReadXRegister(src), 0, round)); + break; + case SCVTF_dw: + WriteDRegister(dst, FixedToDouble(ReadWRegister(src), 0, round)); + break; + case UCVTF_dx: + WriteDRegister(dst, UFixedToDouble(ReadXRegister(src), 0, round)); + break; + case UCVTF_dw: { + WriteDRegister(dst, + UFixedToDouble(ReadRegister(src), 0, round)); + break; + } + case SCVTF_sx: + WriteSRegister(dst, FixedToFloat(ReadXRegister(src), 0, round)); + break; + case SCVTF_sw: + WriteSRegister(dst, FixedToFloat(ReadWRegister(src), 0, round)); + break; + case UCVTF_sx: + WriteSRegister(dst, UFixedToFloat(ReadXRegister(src), 0, round)); + break; + case UCVTF_sw: { + WriteSRegister(dst, UFixedToFloat(ReadRegister(src), 0, round)); + break; + } + case SCVTF_hx: + WriteHRegister(dst, FixedToFloat16(ReadXRegister(src), 0, round)); + break; + case SCVTF_hw: + WriteHRegister(dst, FixedToFloat16(ReadWRegister(src), 0, round)); + break; + case UCVTF_hx: + WriteHRegister(dst, UFixedToFloat16(ReadXRegister(src), 0, round)); + break; + case UCVTF_hw: { + WriteHRegister(dst, + UFixedToFloat16(ReadRegister(src), 0, round)); + break; + } + + default: + VIXL_UNREACHABLE(); + } +} + + +void Simulator::VisitFPFixedPointConvert(const Instruction* instr) { + AssertSupportedFPCR(); + + unsigned dst = instr->GetRd(); + unsigned src = instr->GetRn(); + int fbits = 64 - instr->GetFPScale(); + + FPRounding round = ReadRMode(); + + switch (instr->Mask(FPFixedPointConvertMask)) { + // A 32-bit input can be handled in the same way as a 64-bit input, since + // the sign- or zero-extension will not affect the conversion. + case SCVTF_dx_fixed: + WriteDRegister(dst, FixedToDouble(ReadXRegister(src), fbits, round)); + break; + case SCVTF_dw_fixed: + WriteDRegister(dst, FixedToDouble(ReadWRegister(src), fbits, round)); + break; + case UCVTF_dx_fixed: + WriteDRegister(dst, UFixedToDouble(ReadXRegister(src), fbits, round)); + break; + case UCVTF_dw_fixed: { + WriteDRegister(dst, + UFixedToDouble(ReadRegister(src), fbits, round)); + break; + } + case SCVTF_sx_fixed: + WriteSRegister(dst, FixedToFloat(ReadXRegister(src), fbits, round)); + break; + case SCVTF_sw_fixed: + WriteSRegister(dst, FixedToFloat(ReadWRegister(src), fbits, round)); + break; + case UCVTF_sx_fixed: + WriteSRegister(dst, UFixedToFloat(ReadXRegister(src), fbits, round)); + break; + case UCVTF_sw_fixed: { + WriteSRegister(dst, + UFixedToFloat(ReadRegister(src), fbits, round)); + break; + } + case SCVTF_hx_fixed: + WriteHRegister(dst, FixedToFloat16(ReadXRegister(src), fbits, round)); + break; + case SCVTF_hw_fixed: + WriteHRegister(dst, FixedToFloat16(ReadWRegister(src), fbits, round)); + break; + case UCVTF_hx_fixed: + WriteHRegister(dst, UFixedToFloat16(ReadXRegister(src), fbits, round)); + break; + case UCVTF_hw_fixed: { + WriteHRegister(dst, + UFixedToFloat16(ReadRegister(src), + fbits, + round)); + break; + } + case FCVTZS_xd_fixed: + WriteXRegister(dst, + FPToInt64(ReadDRegister(src) * std::pow(2.0, fbits), + FPZero)); + break; + case FCVTZS_wd_fixed: + WriteWRegister(dst, + FPToInt32(ReadDRegister(src) * std::pow(2.0, fbits), + FPZero)); + break; + case FCVTZU_xd_fixed: + WriteXRegister(dst, + FPToUInt64(ReadDRegister(src) * std::pow(2.0, fbits), + FPZero)); + break; + case FCVTZU_wd_fixed: + WriteWRegister(dst, + FPToUInt32(ReadDRegister(src) * std::pow(2.0, fbits), + FPZero)); + break; + case FCVTZS_xs_fixed: + WriteXRegister(dst, + FPToInt64(ReadSRegister(src) * std::pow(2.0f, fbits), + FPZero)); + break; + case FCVTZS_ws_fixed: + WriteWRegister(dst, + FPToInt32(ReadSRegister(src) * std::pow(2.0f, fbits), + FPZero)); + break; + case FCVTZU_xs_fixed: + WriteXRegister(dst, + FPToUInt64(ReadSRegister(src) * std::pow(2.0f, fbits), + FPZero)); + break; + case FCVTZU_ws_fixed: + WriteWRegister(dst, + FPToUInt32(ReadSRegister(src) * std::pow(2.0f, fbits), + FPZero)); + break; + case FCVTZS_xh_fixed: { + double output = + static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); + WriteXRegister(dst, FPToInt64(output, FPZero)); + break; + } + case FCVTZS_wh_fixed: { + double output = + static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); + WriteWRegister(dst, FPToInt32(output, FPZero)); + break; + } + case FCVTZU_xh_fixed: { + double output = + static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); + WriteXRegister(dst, FPToUInt64(output, FPZero)); + break; + } + case FCVTZU_wh_fixed: { + double output = + static_cast(ReadHRegister(src)) * std::pow(2.0, fbits); + WriteWRegister(dst, FPToUInt32(output, FPZero)); + break; + } + default: + VIXL_UNREACHABLE(); + } +} + + +void Simulator::VisitFPCompare(const Instruction* instr) { + AssertSupportedFPCR(); + + FPTrapFlags trap = DisableTrap; + switch (instr->Mask(FPCompareMask)) { + case FCMPE_h: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_h: + FPCompare(ReadHRegister(instr->GetRn()), + ReadHRegister(instr->GetRm()), + trap); + break; + case FCMPE_s: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_s: + FPCompare(ReadSRegister(instr->GetRn()), + ReadSRegister(instr->GetRm()), + trap); + break; + case FCMPE_d: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_d: + FPCompare(ReadDRegister(instr->GetRn()), + ReadDRegister(instr->GetRm()), + trap); + break; + case FCMPE_h_zero: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_h_zero: + FPCompare(ReadHRegister(instr->GetRn()), SimFloat16(0.0), trap); + break; + case FCMPE_s_zero: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_s_zero: + FPCompare(ReadSRegister(instr->GetRn()), 0.0f, trap); + break; + case FCMPE_d_zero: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCMP_d_zero: + FPCompare(ReadDRegister(instr->GetRn()), 0.0, trap); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitFPConditionalCompare(const Instruction* instr) { + AssertSupportedFPCR(); + + FPTrapFlags trap = DisableTrap; + switch (instr->Mask(FPConditionalCompareMask)) { + case FCCMPE_h: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCCMP_h: + if (ConditionPassed(instr->GetCondition())) { + FPCompare(ReadHRegister(instr->GetRn()), + ReadHRegister(instr->GetRm()), + trap); + } else { + ReadNzcv().SetFlags(instr->GetNzcv()); + LogSystemRegister(NZCV); + } + break; + case FCCMPE_s: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCCMP_s: + if (ConditionPassed(instr->GetCondition())) { + FPCompare(ReadSRegister(instr->GetRn()), + ReadSRegister(instr->GetRm()), + trap); + } else { + ReadNzcv().SetFlags(instr->GetNzcv()); + LogSystemRegister(NZCV); + } + break; + case FCCMPE_d: + trap = EnableTrap; + VIXL_FALLTHROUGH(); + case FCCMP_d: + if (ConditionPassed(instr->GetCondition())) { + FPCompare(ReadDRegister(instr->GetRn()), + ReadDRegister(instr->GetRm()), + trap); + } else { + ReadNzcv().SetFlags(instr->GetNzcv()); + LogSystemRegister(NZCV); + } + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitFPConditionalSelect(const Instruction* instr) { + AssertSupportedFPCR(); + + Instr selected; + if (ConditionPassed(instr->GetCondition())) { + selected = instr->GetRn(); + } else { + selected = instr->GetRm(); + } + + switch (instr->Mask(FPConditionalSelectMask)) { + case FCSEL_h: + WriteHRegister(instr->GetRd(), ReadHRegister(selected)); + break; + case FCSEL_s: + WriteSRegister(instr->GetRd(), ReadSRegister(selected)); + break; + case FCSEL_d: + WriteDRegister(instr->GetRd(), ReadDRegister(selected)); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitFPDataProcessing1Source(const Instruction* instr) { + AssertSupportedFPCR(); + + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + VectorFormat vform; + switch (instr->Mask(FPTypeMask)) { + default: + VIXL_UNREACHABLE_OR_FALLTHROUGH(); + case FP64: + vform = kFormatD; + break; + case FP32: + vform = kFormatS; + break; + case FP16: + vform = kFormatH; + break; + } + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + bool inexact_exception = false; + FrintMode frint_mode = kFrintToInteger; + + unsigned fd = instr->GetRd(); + unsigned fn = instr->GetRn(); + + switch (instr->Mask(FPDataProcessing1SourceMask)) { + case FMOV_h: + WriteHRegister(fd, ReadHRegister(fn)); + return; + case FMOV_s: + WriteSRegister(fd, ReadSRegister(fn)); + return; + case FMOV_d: + WriteDRegister(fd, ReadDRegister(fn)); + return; + case FABS_h: + case FABS_s: + case FABS_d: + fabs_(vform, ReadVRegister(fd), ReadVRegister(fn)); + // Explicitly log the register update whilst we have type information. + LogVRegister(fd, GetPrintRegisterFormatFP(vform)); + return; + case FNEG_h: + case FNEG_s: + case FNEG_d: + fneg(vform, ReadVRegister(fd), ReadVRegister(fn)); + // Explicitly log the register update whilst we have type information. + LogVRegister(fd, GetPrintRegisterFormatFP(vform)); + return; + case FCVT_ds: + WriteDRegister(fd, FPToDouble(ReadSRegister(fn), ReadDN())); + return; + case FCVT_sd: + WriteSRegister(fd, FPToFloat(ReadDRegister(fn), FPTieEven, ReadDN())); + return; + case FCVT_hs: + WriteHRegister(fd, + Float16ToRawbits( + FPToFloat16(ReadSRegister(fn), FPTieEven, ReadDN()))); + return; + case FCVT_sh: + WriteSRegister(fd, FPToFloat(ReadHRegister(fn), ReadDN())); + return; + case FCVT_dh: + WriteDRegister(fd, FPToDouble(ReadHRegister(fn), ReadDN())); + return; + case FCVT_hd: + WriteHRegister(fd, + Float16ToRawbits( + FPToFloat16(ReadDRegister(fn), FPTieEven, ReadDN()))); + return; + case FSQRT_h: + case FSQRT_s: + case FSQRT_d: + fsqrt(vform, rd, rn); + // Explicitly log the register update whilst we have type information. + LogVRegister(fd, GetPrintRegisterFormatFP(vform)); + return; + case FRINT32X_s: + case FRINT32X_d: + inexact_exception = true; + frint_mode = kFrintToInt32; + break; // Use FPCR rounding mode. + case FRINT64X_s: + case FRINT64X_d: + inexact_exception = true; + frint_mode = kFrintToInt64; + break; // Use FPCR rounding mode. + case FRINT32Z_s: + case FRINT32Z_d: + inexact_exception = true; + frint_mode = kFrintToInt32; + fpcr_rounding = FPZero; + break; + case FRINT64Z_s: + case FRINT64Z_d: + inexact_exception = true; + frint_mode = kFrintToInt64; + fpcr_rounding = FPZero; + break; + case FRINTI_h: + case FRINTI_s: + case FRINTI_d: + break; // Use FPCR rounding mode. + case FRINTX_h: + case FRINTX_s: + case FRINTX_d: + inexact_exception = true; + break; + case FRINTA_h: + case FRINTA_s: + case FRINTA_d: + fpcr_rounding = FPTieAway; + break; + case FRINTM_h: + case FRINTM_s: + case FRINTM_d: + fpcr_rounding = FPNegativeInfinity; + break; + case FRINTN_h: + case FRINTN_s: + case FRINTN_d: + fpcr_rounding = FPTieEven; + break; + case FRINTP_h: + case FRINTP_s: + case FRINTP_d: + fpcr_rounding = FPPositiveInfinity; + break; + case FRINTZ_h: + case FRINTZ_s: + case FRINTZ_d: + fpcr_rounding = FPZero; + break; + default: + VIXL_UNIMPLEMENTED(); + } + + // Only FRINT* instructions fall through the switch above. + frint(vform, rd, rn, fpcr_rounding, inexact_exception, frint_mode); + // Explicitly log the register update whilst we have type information. + LogVRegister(fd, GetPrintRegisterFormatFP(vform)); +} + + +void Simulator::VisitFPDataProcessing2Source(const Instruction* instr) { + AssertSupportedFPCR(); + + VectorFormat vform; + switch (instr->Mask(FPTypeMask)) { + default: + VIXL_UNREACHABLE_OR_FALLTHROUGH(); + case FP64: + vform = kFormatD; + break; + case FP32: + vform = kFormatS; + break; + case FP16: + vform = kFormatH; + break; + } + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(FPDataProcessing2SourceMask)) { + case FADD_h: + case FADD_s: + case FADD_d: + fadd(vform, rd, rn, rm); + break; + case FSUB_h: + case FSUB_s: + case FSUB_d: + fsub(vform, rd, rn, rm); + break; + case FMUL_h: + case FMUL_s: + case FMUL_d: + fmul(vform, rd, rn, rm); + break; + case FNMUL_h: + case FNMUL_s: + case FNMUL_d: + fnmul(vform, rd, rn, rm); + break; + case FDIV_h: + case FDIV_s: + case FDIV_d: + fdiv(vform, rd, rn, rm); + break; + case FMAX_h: + case FMAX_s: + case FMAX_d: + fmax(vform, rd, rn, rm); + break; + case FMIN_h: + case FMIN_s: + case FMIN_d: + fmin(vform, rd, rn, rm); + break; + case FMAXNM_h: + case FMAXNM_s: + case FMAXNM_d: + fmaxnm(vform, rd, rn, rm); + break; + case FMINNM_h: + case FMINNM_s: + case FMINNM_d: + fminnm(vform, rd, rn, rm); + break; + default: + VIXL_UNREACHABLE(); + } + // Explicitly log the register update whilst we have type information. + LogVRegister(instr->GetRd(), GetPrintRegisterFormatFP(vform)); +} + + +void Simulator::VisitFPDataProcessing3Source(const Instruction* instr) { + AssertSupportedFPCR(); + + unsigned fd = instr->GetRd(); + unsigned fn = instr->GetRn(); + unsigned fm = instr->GetRm(); + unsigned fa = instr->GetRa(); + + switch (instr->Mask(FPDataProcessing3SourceMask)) { + // fd = fa +/- (fn * fm) + case FMADD_h: + WriteHRegister(fd, + FPMulAdd(ReadHRegister(fa), + ReadHRegister(fn), + ReadHRegister(fm))); + break; + case FMSUB_h: + WriteHRegister(fd, + FPMulAdd(ReadHRegister(fa), + -ReadHRegister(fn), + ReadHRegister(fm))); + break; + case FMADD_s: + WriteSRegister(fd, + FPMulAdd(ReadSRegister(fa), + ReadSRegister(fn), + ReadSRegister(fm))); + break; + case FMSUB_s: + WriteSRegister(fd, + FPMulAdd(ReadSRegister(fa), + -ReadSRegister(fn), + ReadSRegister(fm))); + break; + case FMADD_d: + WriteDRegister(fd, + FPMulAdd(ReadDRegister(fa), + ReadDRegister(fn), + ReadDRegister(fm))); + break; + case FMSUB_d: + WriteDRegister(fd, + FPMulAdd(ReadDRegister(fa), + -ReadDRegister(fn), + ReadDRegister(fm))); + break; + // Negated variants of the above. + case FNMADD_h: + WriteHRegister(fd, + FPMulAdd(-ReadHRegister(fa), + -ReadHRegister(fn), + ReadHRegister(fm))); + break; + case FNMSUB_h: + WriteHRegister(fd, + FPMulAdd(-ReadHRegister(fa), + ReadHRegister(fn), + ReadHRegister(fm))); + break; + case FNMADD_s: + WriteSRegister(fd, + FPMulAdd(-ReadSRegister(fa), + -ReadSRegister(fn), + ReadSRegister(fm))); + break; + case FNMSUB_s: + WriteSRegister(fd, + FPMulAdd(-ReadSRegister(fa), + ReadSRegister(fn), + ReadSRegister(fm))); + break; + case FNMADD_d: + WriteDRegister(fd, + FPMulAdd(-ReadDRegister(fa), + -ReadDRegister(fn), + ReadDRegister(fm))); + break; + case FNMSUB_d: + WriteDRegister(fd, + FPMulAdd(-ReadDRegister(fa), + ReadDRegister(fn), + ReadDRegister(fm))); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +bool Simulator::FPProcessNaNs(const Instruction* instr) { + unsigned fd = instr->GetRd(); + unsigned fn = instr->GetRn(); + unsigned fm = instr->GetRm(); + bool done = false; + + if (instr->Mask(FP64) == FP64) { + double result = FPProcessNaNs(ReadDRegister(fn), ReadDRegister(fm)); + if (IsNaN(result)) { + WriteDRegister(fd, result); + done = true; + } + } else if (instr->Mask(FP32) == FP32) { + float result = FPProcessNaNs(ReadSRegister(fn), ReadSRegister(fm)); + if (IsNaN(result)) { + WriteSRegister(fd, result); + done = true; + } + } else { + VIXL_ASSERT(instr->Mask(FP16) == FP16); + VIXL_UNIMPLEMENTED(); + } + + return done; +} + + +void Simulator::SysOp_W(int op, int64_t val) { + switch (op) { + case IVAU: + case CVAC: + case CVAU: + case CVAP: + case CVADP: + case CIVAC: + case CGVAC: + case CGDVAC: + case CGVAP: + case CGDVAP: + case CIGVAC: + case CIGDVAC: { + // Perform a placeholder memory access to ensure that we have read access + // to the specified address. The read access does not require a tag match, + // so temporarily disable MTE. + bool mte_enabled = MetaDataDepot::MetaDataMTE::IsActive(); + MetaDataDepot::MetaDataMTE::SetActive(false); + volatile uint8_t y = MemRead(val); + MetaDataDepot::MetaDataMTE::SetActive(mte_enabled); + USE(y); + // TODO: Implement ZVA, GVA, GZVA. + break; + } + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::PACHelper(int dst, + int src, + PACKey key, + decltype(&Simulator::AddPAC) pac_fn) { + VIXL_ASSERT((dst == 17) || (dst == 30)); + VIXL_ASSERT((src == -1) || (src == 16) || (src == 31)); + + uint64_t modifier = (src == -1) ? 0 : ReadXRegister(src, Reg31IsStackPointer); + uint64_t result = + (this->*pac_fn)(ReadXRegister(dst), modifier, key, kInstructionPointer); + WriteXRegister(dst, result); +} + +void Simulator::VisitSystem(const Instruction* instr) { + PACKey pac_key = kPACKeyIA; // Default key for PAC/AUTH handling. + + switch (form_hash_) { + case "cfinv_m_pstate"_h: + ReadNzcv().SetC(!ReadC()); + break; + case "axflag_m_pstate"_h: + ReadNzcv().SetN(0); + ReadNzcv().SetZ(ReadNzcv().GetZ() | ReadNzcv().GetV()); + ReadNzcv().SetC(ReadNzcv().GetC() & ~ReadNzcv().GetV()); + ReadNzcv().SetV(0); + break; + case "xaflag_m_pstate"_h: { + // Can't set the flags in place due to the logical dependencies. + uint32_t n = (~ReadNzcv().GetC() & ~ReadNzcv().GetZ()) & 1; + uint32_t z = ReadNzcv().GetZ() & ReadNzcv().GetC(); + uint32_t c = ReadNzcv().GetC() | ReadNzcv().GetZ(); + uint32_t v = ~ReadNzcv().GetC() & ReadNzcv().GetZ(); + ReadNzcv().SetN(n); + ReadNzcv().SetZ(z); + ReadNzcv().SetC(c); + ReadNzcv().SetV(v); + break; + } + case "xpaclri_hi_hints"_h: + WriteXRegister(30, StripPAC(ReadXRegister(30), kInstructionPointer)); + break; + case "clrex_bn_barriers"_h: + PrintExclusiveAccessWarning(); + ClearLocalMonitor(); + break; + case "msr_sr_systemmove"_h: + switch (instr->GetImmSystemRegister()) { + case NZCV: + ReadNzcv().SetRawValue(ReadWRegister(instr->GetRt())); + LogSystemRegister(NZCV); + break; + case FPCR: + ReadFpcr().SetRawValue(ReadWRegister(instr->GetRt())); + LogSystemRegister(FPCR); + break; + default: + VIXL_UNIMPLEMENTED(); + } + break; + case "mrs_rs_systemmove"_h: + switch (instr->GetImmSystemRegister()) { + case NZCV: + WriteXRegister(instr->GetRt(), ReadNzcv().GetRawValue()); + break; + case FPCR: + WriteXRegister(instr->GetRt(), ReadFpcr().GetRawValue()); + break; + case RNDR: + case RNDRRS: { + uint64_t high = jrand48(rand_state_); + uint64_t low = jrand48(rand_state_); + uint64_t rand_num = (high << 32) | (low & 0xffffffff); + WriteXRegister(instr->GetRt(), rand_num); + // Simulate successful random number generation. + // TODO: Return failure occasionally as a random number cannot be + // returned in a period of time. + ReadNzcv().SetRawValue(NoFlag); + LogSystemRegister(NZCV); + break; + } + default: + VIXL_UNIMPLEMENTED(); + } + break; + case "nop_hi_hints"_h: + case "esb_hi_hints"_h: + case "csdb_hi_hints"_h: + break; + case "bti_hb_hints"_h: + switch (instr->GetImmHint()) { + case BTI_jc: + break; + case BTI: + if (PcIsInGuardedPage() && (ReadBType() != DefaultBType)) { + VIXL_ABORT_WITH_MSG("Executing BTI with wrong BType."); + } + break; + case BTI_c: + if (PcIsInGuardedPage() && + (ReadBType() == BranchFromGuardedNotToIP)) { + VIXL_ABORT_WITH_MSG("Executing BTI c with wrong BType."); + } + break; + case BTI_j: + if (PcIsInGuardedPage() && (ReadBType() == BranchAndLink)) { + VIXL_ABORT_WITH_MSG("Executing BTI j with wrong BType."); + } + break; + default: + VIXL_UNREACHABLE(); + } + return; + case "pacib1716_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "pacia1716_hi_hints"_h: + PACHelper(17, 16, pac_key, &Simulator::AddPAC); + break; + case "pacibsp_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "paciasp_hi_hints"_h: + PACHelper(30, 31, pac_key, &Simulator::AddPAC); + + // Check BType allows PACI[AB]SP instructions. + if (PcIsInGuardedPage()) { + switch (ReadBType()) { + case BranchFromGuardedNotToIP: + // TODO: This case depends on the value of SCTLR_EL1.BT0, which we + // assume here to be zero. This allows execution of PACI[AB]SP when + // BTYPE is BranchFromGuardedNotToIP (0b11). + case DefaultBType: + case BranchFromUnguardedOrToIP: + case BranchAndLink: + break; + } + } + break; + case "pacibz_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "paciaz_hi_hints"_h: + PACHelper(30, -1, pac_key, &Simulator::AddPAC); + break; + case "autib1716_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "autia1716_hi_hints"_h: + PACHelper(17, 16, pac_key, &Simulator::AuthPAC); + break; + case "autibsp_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "autiasp_hi_hints"_h: + PACHelper(30, 31, pac_key, &Simulator::AuthPAC); + break; + case "autibz_hi_hints"_h: + pac_key = kPACKeyIB; + VIXL_FALLTHROUGH(); + case "autiaz_hi_hints"_h: + PACHelper(30, -1, pac_key, &Simulator::AuthPAC); + break; + case "dsb_bo_barriers"_h: + case "dmb_bo_barriers"_h: + case "isb_bi_barriers"_h: + __sync_synchronize(); + break; + case "sys_cr_systeminstrs"_h: + SysOp_W(instr->GetSysOp(), ReadXRegister(instr->GetRt())); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitException(const Instruction* instr) { + switch (instr->Mask(ExceptionMask)) { + case HLT: + switch (instr->GetImmException()) { + case kUnreachableOpcode: + DoUnreachable(instr); + return; + case kTraceOpcode: + DoTrace(instr); + return; + case kLogOpcode: + DoLog(instr); + return; + case kPrintfOpcode: + DoPrintf(instr); + return; + case kRuntimeCallOpcode: + DoRuntimeCall(instr); + return; + case kSetCPUFeaturesOpcode: + case kEnableCPUFeaturesOpcode: + case kDisableCPUFeaturesOpcode: + DoConfigureCPUFeatures(instr); + return; + case kSaveCPUFeaturesOpcode: + DoSaveCPUFeatures(instr); + return; + case kRestoreCPUFeaturesOpcode: + DoRestoreCPUFeatures(instr); + return; + case kMTEActive: + MetaDataDepot::MetaDataMTE::SetActive(true); + return; + case kMTEInactive: + MetaDataDepot::MetaDataMTE::SetActive(false); + return; + default: + HostBreakpoint(); + return; + } + case BRK: + HostBreakpoint(); + return; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitCrypto2RegSHA(const Instruction* instr) { + VisitUnimplemented(instr); +} + + +void Simulator::VisitCrypto3RegSHA(const Instruction* instr) { + VisitUnimplemented(instr); +} + + +void Simulator::VisitCryptoAES(const Instruction* instr) { + VisitUnimplemented(instr); +} + + +void Simulator::VisitNEON2RegMisc(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + VectorFormat vf = nfd.GetVectorFormat(); + + static const NEONFormatMap map_lp = + {{23, 22, 30}, {NF_4H, NF_8H, NF_2S, NF_4S, NF_1D, NF_2D}}; + VectorFormat vf_lp = nfd.GetVectorFormat(&map_lp); + + static const NEONFormatMap map_fcvtl = {{22}, {NF_4S, NF_2D}}; + VectorFormat vf_fcvtl = nfd.GetVectorFormat(&map_fcvtl); + + static const NEONFormatMap map_fcvtn = {{22, 30}, + {NF_4H, NF_8H, NF_2S, NF_4S}}; + VectorFormat vf_fcvtn = nfd.GetVectorFormat(&map_fcvtn); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + if (instr->Mask(NEON2RegMiscOpcode) <= NEON_NEG_opcode) { + // These instructions all use a two bit size field, except NOT and RBIT, + // which use the field to encode the operation. + switch (instr->Mask(NEON2RegMiscMask)) { + case NEON_REV64: + rev64(vf, rd, rn); + break; + case NEON_REV32: + rev32(vf, rd, rn); + break; + case NEON_REV16: + rev16(vf, rd, rn); + break; + case NEON_SUQADD: + suqadd(vf, rd, rd, rn); + break; + case NEON_USQADD: + usqadd(vf, rd, rd, rn); + break; + case NEON_CLS: + cls(vf, rd, rn); + break; + case NEON_CLZ: + clz(vf, rd, rn); + break; + case NEON_CNT: + cnt(vf, rd, rn); + break; + case NEON_SQABS: + abs(vf, rd, rn).SignedSaturate(vf); + break; + case NEON_SQNEG: + neg(vf, rd, rn).SignedSaturate(vf); + break; + case NEON_CMGT_zero: + cmp(vf, rd, rn, 0, gt); + break; + case NEON_CMGE_zero: + cmp(vf, rd, rn, 0, ge); + break; + case NEON_CMEQ_zero: + cmp(vf, rd, rn, 0, eq); + break; + case NEON_CMLE_zero: + cmp(vf, rd, rn, 0, le); + break; + case NEON_CMLT_zero: + cmp(vf, rd, rn, 0, lt); + break; + case NEON_ABS: + abs(vf, rd, rn); + break; + case NEON_NEG: + neg(vf, rd, rn); + break; + case NEON_SADDLP: + saddlp(vf_lp, rd, rn); + break; + case NEON_UADDLP: + uaddlp(vf_lp, rd, rn); + break; + case NEON_SADALP: + sadalp(vf_lp, rd, rn); + break; + case NEON_UADALP: + uadalp(vf_lp, rd, rn); + break; + case NEON_RBIT_NOT: + vf = nfd.GetVectorFormat(nfd.LogicalFormatMap()); + switch (instr->GetFPType()) { + case 0: + not_(vf, rd, rn); + break; + case 1: + rbit(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + break; + } + } else { + VectorFormat fpf = nfd.GetVectorFormat(nfd.FPFormatMap()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + bool inexact_exception = false; + FrintMode frint_mode = kFrintToInteger; + + // These instructions all use a one bit size field, except XTN, SQXTUN, + // SHLL, SQXTN and UQXTN, which use a two bit size field. + switch (instr->Mask(NEON2RegMiscFPMask)) { + case NEON_FABS: + fabs_(fpf, rd, rn); + return; + case NEON_FNEG: + fneg(fpf, rd, rn); + return; + case NEON_FSQRT: + fsqrt(fpf, rd, rn); + return; + case NEON_FCVTL: + if (instr->Mask(NEON_Q)) { + fcvtl2(vf_fcvtl, rd, rn); + } else { + fcvtl(vf_fcvtl, rd, rn); + } + return; + case NEON_FCVTN: + if (instr->Mask(NEON_Q)) { + fcvtn2(vf_fcvtn, rd, rn); + } else { + fcvtn(vf_fcvtn, rd, rn); + } + return; + case NEON_FCVTXN: + if (instr->Mask(NEON_Q)) { + fcvtxn2(vf_fcvtn, rd, rn); + } else { + fcvtxn(vf_fcvtn, rd, rn); + } + return; + + // The following instructions break from the switch statement, rather + // than return. + case NEON_FRINT32X: + inexact_exception = true; + frint_mode = kFrintToInt32; + break; // Use FPCR rounding mode. + case NEON_FRINT32Z: + inexact_exception = true; + frint_mode = kFrintToInt32; + fpcr_rounding = FPZero; + break; + case NEON_FRINT64X: + inexact_exception = true; + frint_mode = kFrintToInt64; + break; // Use FPCR rounding mode. + case NEON_FRINT64Z: + inexact_exception = true; + frint_mode = kFrintToInt64; + fpcr_rounding = FPZero; + break; + case NEON_FRINTI: + break; // Use FPCR rounding mode. + case NEON_FRINTX: + inexact_exception = true; + break; + case NEON_FRINTA: + fpcr_rounding = FPTieAway; + break; + case NEON_FRINTM: + fpcr_rounding = FPNegativeInfinity; + break; + case NEON_FRINTN: + fpcr_rounding = FPTieEven; + break; + case NEON_FRINTP: + fpcr_rounding = FPPositiveInfinity; + break; + case NEON_FRINTZ: + fpcr_rounding = FPZero; + break; + + case NEON_FCVTNS: + fcvts(fpf, rd, rn, FPTieEven); + return; + case NEON_FCVTNU: + fcvtu(fpf, rd, rn, FPTieEven); + return; + case NEON_FCVTPS: + fcvts(fpf, rd, rn, FPPositiveInfinity); + return; + case NEON_FCVTPU: + fcvtu(fpf, rd, rn, FPPositiveInfinity); + return; + case NEON_FCVTMS: + fcvts(fpf, rd, rn, FPNegativeInfinity); + return; + case NEON_FCVTMU: + fcvtu(fpf, rd, rn, FPNegativeInfinity); + return; + case NEON_FCVTZS: + fcvts(fpf, rd, rn, FPZero); + return; + case NEON_FCVTZU: + fcvtu(fpf, rd, rn, FPZero); + return; + case NEON_FCVTAS: + fcvts(fpf, rd, rn, FPTieAway); + return; + case NEON_FCVTAU: + fcvtu(fpf, rd, rn, FPTieAway); + return; + case NEON_SCVTF: + scvtf(fpf, rd, rn, 0, fpcr_rounding); + return; + case NEON_UCVTF: + ucvtf(fpf, rd, rn, 0, fpcr_rounding); + return; + case NEON_URSQRTE: + ursqrte(fpf, rd, rn); + return; + case NEON_URECPE: + urecpe(fpf, rd, rn); + return; + case NEON_FRSQRTE: + frsqrte(fpf, rd, rn); + return; + case NEON_FRECPE: + frecpe(fpf, rd, rn, fpcr_rounding); + return; + case NEON_FCMGT_zero: + fcmp_zero(fpf, rd, rn, gt); + return; + case NEON_FCMGE_zero: + fcmp_zero(fpf, rd, rn, ge); + return; + case NEON_FCMEQ_zero: + fcmp_zero(fpf, rd, rn, eq); + return; + case NEON_FCMLE_zero: + fcmp_zero(fpf, rd, rn, le); + return; + case NEON_FCMLT_zero: + fcmp_zero(fpf, rd, rn, lt); + return; + default: + if ((NEON_XTN_opcode <= instr->Mask(NEON2RegMiscOpcode)) && + (instr->Mask(NEON2RegMiscOpcode) <= NEON_UQXTN_opcode)) { + switch (instr->Mask(NEON2RegMiscMask)) { + case NEON_XTN: + xtn(vf, rd, rn); + return; + case NEON_SQXTN: + sqxtn(vf, rd, rn); + return; + case NEON_UQXTN: + uqxtn(vf, rd, rn); + return; + case NEON_SQXTUN: + sqxtun(vf, rd, rn); + return; + case NEON_SHLL: + vf = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); + if (instr->Mask(NEON_Q)) { + shll2(vf, rd, rn); + } else { + shll(vf, rd, rn); + } + return; + default: + VIXL_UNIMPLEMENTED(); + } + } else { + VIXL_UNIMPLEMENTED(); + } + } + + // Only FRINT* instructions fall through the switch above. + frint(fpf, rd, rn, fpcr_rounding, inexact_exception, frint_mode); + } +} + + +void Simulator::VisitNEON2RegMiscFP16(const Instruction* instr) { + static const NEONFormatMap map_half = {{30}, {NF_4H, NF_8H}}; + NEONFormatDecoder nfd(instr); + VectorFormat fpf = nfd.GetVectorFormat(&map_half); + + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + switch (instr->Mask(NEON2RegMiscFP16Mask)) { + case NEON_SCVTF_H: + scvtf(fpf, rd, rn, 0, fpcr_rounding); + return; + case NEON_UCVTF_H: + ucvtf(fpf, rd, rn, 0, fpcr_rounding); + return; + case NEON_FCVTNS_H: + fcvts(fpf, rd, rn, FPTieEven); + return; + case NEON_FCVTNU_H: + fcvtu(fpf, rd, rn, FPTieEven); + return; + case NEON_FCVTPS_H: + fcvts(fpf, rd, rn, FPPositiveInfinity); + return; + case NEON_FCVTPU_H: + fcvtu(fpf, rd, rn, FPPositiveInfinity); + return; + case NEON_FCVTMS_H: + fcvts(fpf, rd, rn, FPNegativeInfinity); + return; + case NEON_FCVTMU_H: + fcvtu(fpf, rd, rn, FPNegativeInfinity); + return; + case NEON_FCVTZS_H: + fcvts(fpf, rd, rn, FPZero); + return; + case NEON_FCVTZU_H: + fcvtu(fpf, rd, rn, FPZero); + return; + case NEON_FCVTAS_H: + fcvts(fpf, rd, rn, FPTieAway); + return; + case NEON_FCVTAU_H: + fcvtu(fpf, rd, rn, FPTieAway); + return; + case NEON_FRINTI_H: + frint(fpf, rd, rn, fpcr_rounding, false); + return; + case NEON_FRINTX_H: + frint(fpf, rd, rn, fpcr_rounding, true); + return; + case NEON_FRINTA_H: + frint(fpf, rd, rn, FPTieAway, false); + return; + case NEON_FRINTM_H: + frint(fpf, rd, rn, FPNegativeInfinity, false); + return; + case NEON_FRINTN_H: + frint(fpf, rd, rn, FPTieEven, false); + return; + case NEON_FRINTP_H: + frint(fpf, rd, rn, FPPositiveInfinity, false); + return; + case NEON_FRINTZ_H: + frint(fpf, rd, rn, FPZero, false); + return; + case NEON_FABS_H: + fabs_(fpf, rd, rn); + return; + case NEON_FNEG_H: + fneg(fpf, rd, rn); + return; + case NEON_FSQRT_H: + fsqrt(fpf, rd, rn); + return; + case NEON_FRSQRTE_H: + frsqrte(fpf, rd, rn); + return; + case NEON_FRECPE_H: + frecpe(fpf, rd, rn, fpcr_rounding); + return; + case NEON_FCMGT_H_zero: + fcmp_zero(fpf, rd, rn, gt); + return; + case NEON_FCMGE_H_zero: + fcmp_zero(fpf, rd, rn, ge); + return; + case NEON_FCMEQ_H_zero: + fcmp_zero(fpf, rd, rn, eq); + return; + case NEON_FCMLE_H_zero: + fcmp_zero(fpf, rd, rn, le); + return; + case NEON_FCMLT_H_zero: + fcmp_zero(fpf, rd, rn, lt); + return; + default: + VIXL_UNIMPLEMENTED(); + return; + } +} + + +void Simulator::VisitNEON3Same(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + if (instr->Mask(NEON3SameLogicalFMask) == NEON3SameLogicalFixed) { + VectorFormat vf = nfd.GetVectorFormat(nfd.LogicalFormatMap()); + switch (instr->Mask(NEON3SameLogicalMask)) { + case NEON_AND: + and_(vf, rd, rn, rm); + break; + case NEON_ORR: + orr(vf, rd, rn, rm); + break; + case NEON_ORN: + orn(vf, rd, rn, rm); + break; + case NEON_EOR: + eor(vf, rd, rn, rm); + break; + case NEON_BIC: + bic(vf, rd, rn, rm); + break; + case NEON_BIF: + bif(vf, rd, rn, rm); + break; + case NEON_BIT: + bit(vf, rd, rn, rm); + break; + case NEON_BSL: + bsl(vf, rd, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } else if (instr->Mask(NEON3SameFPFMask) == NEON3SameFPFixed) { + VectorFormat vf = nfd.GetVectorFormat(nfd.FPFormatMap()); + switch (instr->Mask(NEON3SameFPMask)) { + case NEON_FADD: + fadd(vf, rd, rn, rm); + break; + case NEON_FSUB: + fsub(vf, rd, rn, rm); + break; + case NEON_FMUL: + fmul(vf, rd, rn, rm); + break; + case NEON_FDIV: + fdiv(vf, rd, rn, rm); + break; + case NEON_FMAX: + fmax(vf, rd, rn, rm); + break; + case NEON_FMIN: + fmin(vf, rd, rn, rm); + break; + case NEON_FMAXNM: + fmaxnm(vf, rd, rn, rm); + break; + case NEON_FMINNM: + fminnm(vf, rd, rn, rm); + break; + case NEON_FMLA: + fmla(vf, rd, rd, rn, rm); + break; + case NEON_FMLS: + fmls(vf, rd, rd, rn, rm); + break; + case NEON_FMULX: + fmulx(vf, rd, rn, rm); + break; + case NEON_FACGE: + fabscmp(vf, rd, rn, rm, ge); + break; + case NEON_FACGT: + fabscmp(vf, rd, rn, rm, gt); + break; + case NEON_FCMEQ: + fcmp(vf, rd, rn, rm, eq); + break; + case NEON_FCMGE: + fcmp(vf, rd, rn, rm, ge); + break; + case NEON_FCMGT: + fcmp(vf, rd, rn, rm, gt); + break; + case NEON_FRECPS: + frecps(vf, rd, rn, rm); + break; + case NEON_FRSQRTS: + frsqrts(vf, rd, rn, rm); + break; + case NEON_FABD: + fabd(vf, rd, rn, rm); + break; + case NEON_FADDP: + faddp(vf, rd, rn, rm); + break; + case NEON_FMAXP: + fmaxp(vf, rd, rn, rm); + break; + case NEON_FMAXNMP: + fmaxnmp(vf, rd, rn, rm); + break; + case NEON_FMINP: + fminp(vf, rd, rn, rm); + break; + case NEON_FMINNMP: + fminnmp(vf, rd, rn, rm); + break; + default: + // FMLAL{2} and FMLSL{2} have special-case encodings. + switch (instr->Mask(NEON3SameFHMMask)) { + case NEON_FMLAL: + fmlal(vf, rd, rn, rm); + break; + case NEON_FMLAL2: + fmlal2(vf, rd, rn, rm); + break; + case NEON_FMLSL: + fmlsl(vf, rd, rn, rm); + break; + case NEON_FMLSL2: + fmlsl2(vf, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } + } else { + VectorFormat vf = nfd.GetVectorFormat(); + switch (instr->Mask(NEON3SameMask)) { + case NEON_ADD: + add(vf, rd, rn, rm); + break; + case NEON_ADDP: + addp(vf, rd, rn, rm); + break; case NEON_CMEQ: cmp(vf, rd, rn, rm, eq); break; - case NEON_CMGE: - cmp(vf, rd, rn, rm, ge); + case NEON_CMGE: + cmp(vf, rd, rn, rm, ge); + break; + case NEON_CMGT: + cmp(vf, rd, rn, rm, gt); + break; + case NEON_CMHI: + cmp(vf, rd, rn, rm, hi); + break; + case NEON_CMHS: + cmp(vf, rd, rn, rm, hs); + break; + case NEON_CMTST: + cmptst(vf, rd, rn, rm); + break; + case NEON_MLS: + mls(vf, rd, rd, rn, rm); + break; + case NEON_MLA: + mla(vf, rd, rd, rn, rm); + break; + case NEON_MUL: + mul(vf, rd, rn, rm); + break; + case NEON_PMUL: + pmul(vf, rd, rn, rm); + break; + case NEON_SMAX: + smax(vf, rd, rn, rm); + break; + case NEON_SMAXP: + smaxp(vf, rd, rn, rm); + break; + case NEON_SMIN: + smin(vf, rd, rn, rm); + break; + case NEON_SMINP: + sminp(vf, rd, rn, rm); + break; + case NEON_SUB: + sub(vf, rd, rn, rm); + break; + case NEON_UMAX: + umax(vf, rd, rn, rm); + break; + case NEON_UMAXP: + umaxp(vf, rd, rn, rm); + break; + case NEON_UMIN: + umin(vf, rd, rn, rm); + break; + case NEON_UMINP: + uminp(vf, rd, rn, rm); + break; + case NEON_SSHL: + sshl(vf, rd, rn, rm); + break; + case NEON_USHL: + ushl(vf, rd, rn, rm); + break; + case NEON_SABD: + absdiff(vf, rd, rn, rm, true); + break; + case NEON_UABD: + absdiff(vf, rd, rn, rm, false); + break; + case NEON_SABA: + saba(vf, rd, rn, rm); + break; + case NEON_UABA: + uaba(vf, rd, rn, rm); + break; + case NEON_UQADD: + add(vf, rd, rn, rm).UnsignedSaturate(vf); + break; + case NEON_SQADD: + add(vf, rd, rn, rm).SignedSaturate(vf); + break; + case NEON_UQSUB: + sub(vf, rd, rn, rm).UnsignedSaturate(vf); + break; + case NEON_SQSUB: + sub(vf, rd, rn, rm).SignedSaturate(vf); + break; + case NEON_SQDMULH: + sqdmulh(vf, rd, rn, rm); + break; + case NEON_SQRDMULH: + sqrdmulh(vf, rd, rn, rm); + break; + case NEON_UQSHL: + ushl(vf, rd, rn, rm).UnsignedSaturate(vf); + break; + case NEON_SQSHL: + sshl(vf, rd, rn, rm).SignedSaturate(vf); + break; + case NEON_URSHL: + ushl(vf, rd, rn, rm).Round(vf); + break; + case NEON_SRSHL: + sshl(vf, rd, rn, rm).Round(vf); + break; + case NEON_UQRSHL: + ushl(vf, rd, rn, rm).Round(vf).UnsignedSaturate(vf); + break; + case NEON_SQRSHL: + sshl(vf, rd, rn, rm).Round(vf).SignedSaturate(vf); + break; + case NEON_UHADD: + add(vf, rd, rn, rm).Uhalve(vf); + break; + case NEON_URHADD: + add(vf, rd, rn, rm).Uhalve(vf).Round(vf); + break; + case NEON_SHADD: + add(vf, rd, rn, rm).Halve(vf); + break; + case NEON_SRHADD: + add(vf, rd, rn, rm).Halve(vf).Round(vf); + break; + case NEON_UHSUB: + sub(vf, rd, rn, rm).Uhalve(vf); + break; + case NEON_SHSUB: + sub(vf, rd, rn, rm).Halve(vf); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } +} + + +void Simulator::VisitNEON3SameFP16(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + VectorFormat vf = nfd.GetVectorFormat(nfd.FP16FormatMap()); + switch (instr->Mask(NEON3SameFP16Mask)) { +#define SIM_FUNC(A, B) \ + case NEON_##A##_H: \ + B(vf, rd, rn, rm); \ + break; + SIM_FUNC(FMAXNM, fmaxnm); + SIM_FUNC(FADD, fadd); + SIM_FUNC(FMULX, fmulx); + SIM_FUNC(FMAX, fmax); + SIM_FUNC(FRECPS, frecps); + SIM_FUNC(FMINNM, fminnm); + SIM_FUNC(FSUB, fsub); + SIM_FUNC(FMIN, fmin); + SIM_FUNC(FRSQRTS, frsqrts); + SIM_FUNC(FMAXNMP, fmaxnmp); + SIM_FUNC(FADDP, faddp); + SIM_FUNC(FMUL, fmul); + SIM_FUNC(FMAXP, fmaxp); + SIM_FUNC(FDIV, fdiv); + SIM_FUNC(FMINNMP, fminnmp); + SIM_FUNC(FABD, fabd); + SIM_FUNC(FMINP, fminp); +#undef SIM_FUNC + case NEON_FMLA_H: + fmla(vf, rd, rd, rn, rm); + break; + case NEON_FMLS_H: + fmls(vf, rd, rd, rn, rm); + break; + case NEON_FCMEQ_H: + fcmp(vf, rd, rn, rm, eq); + break; + case NEON_FCMGE_H: + fcmp(vf, rd, rn, rm, ge); + break; + case NEON_FACGE_H: + fabscmp(vf, rd, rn, rm, ge); + break; + case NEON_FCMGT_H: + fcmp(vf, rd, rn, rm, gt); + break; + case NEON_FACGT_H: + fabscmp(vf, rd, rn, rm, gt); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitNEON3SameExtra(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + int rot = 0; + VectorFormat vf = nfd.GetVectorFormat(); + + switch (form_hash_) { + case "fcmla_asimdsame2_c"_h: + rot = instr->GetImmRotFcmlaVec(); + fcmla(vf, rd, rn, rm, rd, rot); + break; + case "fcadd_asimdsame2_c"_h: + rot = instr->GetImmRotFcadd(); + fcadd(vf, rd, rn, rm, rot); + break; + case "sdot_asimdsame2_d"_h: + sdot(vf, rd, rn, rm); + break; + case "udot_asimdsame2_d"_h: + udot(vf, rd, rn, rm); + break; + case "usdot_asimdsame2_d"_h: + usdot(vf, rd, rn, rm); + break; + case "sqrdmlah_asimdsame2_only"_h: + sqrdmlah(vf, rd, rn, rm); + break; + case "sqrdmlsh_asimdsame2_only"_h: + sqrdmlsh(vf, rd, rn, rm); + break; + } +} + + +void Simulator::VisitNEON3Different(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + VectorFormat vf = nfd.GetVectorFormat(); + VectorFormat vf_l = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(NEON3DifferentMask)) { + case NEON_PMULL: + pmull(vf_l, rd, rn, rm); + break; + case NEON_PMULL2: + pmull2(vf_l, rd, rn, rm); + break; + case NEON_UADDL: + uaddl(vf_l, rd, rn, rm); + break; + case NEON_UADDL2: + uaddl2(vf_l, rd, rn, rm); + break; + case NEON_SADDL: + saddl(vf_l, rd, rn, rm); + break; + case NEON_SADDL2: + saddl2(vf_l, rd, rn, rm); + break; + case NEON_USUBL: + usubl(vf_l, rd, rn, rm); + break; + case NEON_USUBL2: + usubl2(vf_l, rd, rn, rm); + break; + case NEON_SSUBL: + ssubl(vf_l, rd, rn, rm); + break; + case NEON_SSUBL2: + ssubl2(vf_l, rd, rn, rm); + break; + case NEON_SABAL: + sabal(vf_l, rd, rn, rm); + break; + case NEON_SABAL2: + sabal2(vf_l, rd, rn, rm); + break; + case NEON_UABAL: + uabal(vf_l, rd, rn, rm); + break; + case NEON_UABAL2: + uabal2(vf_l, rd, rn, rm); + break; + case NEON_SABDL: + sabdl(vf_l, rd, rn, rm); + break; + case NEON_SABDL2: + sabdl2(vf_l, rd, rn, rm); + break; + case NEON_UABDL: + uabdl(vf_l, rd, rn, rm); + break; + case NEON_UABDL2: + uabdl2(vf_l, rd, rn, rm); + break; + case NEON_SMLAL: + smlal(vf_l, rd, rn, rm); + break; + case NEON_SMLAL2: + smlal2(vf_l, rd, rn, rm); + break; + case NEON_UMLAL: + umlal(vf_l, rd, rn, rm); + break; + case NEON_UMLAL2: + umlal2(vf_l, rd, rn, rm); + break; + case NEON_SMLSL: + smlsl(vf_l, rd, rn, rm); + break; + case NEON_SMLSL2: + smlsl2(vf_l, rd, rn, rm); + break; + case NEON_UMLSL: + umlsl(vf_l, rd, rn, rm); + break; + case NEON_UMLSL2: + umlsl2(vf_l, rd, rn, rm); + break; + case NEON_SMULL: + smull(vf_l, rd, rn, rm); + break; + case NEON_SMULL2: + smull2(vf_l, rd, rn, rm); + break; + case NEON_UMULL: + umull(vf_l, rd, rn, rm); + break; + case NEON_UMULL2: + umull2(vf_l, rd, rn, rm); + break; + case NEON_SQDMLAL: + sqdmlal(vf_l, rd, rn, rm); + break; + case NEON_SQDMLAL2: + sqdmlal2(vf_l, rd, rn, rm); + break; + case NEON_SQDMLSL: + sqdmlsl(vf_l, rd, rn, rm); + break; + case NEON_SQDMLSL2: + sqdmlsl2(vf_l, rd, rn, rm); + break; + case NEON_SQDMULL: + sqdmull(vf_l, rd, rn, rm); + break; + case NEON_SQDMULL2: + sqdmull2(vf_l, rd, rn, rm); + break; + case NEON_UADDW: + uaddw(vf_l, rd, rn, rm); + break; + case NEON_UADDW2: + uaddw2(vf_l, rd, rn, rm); + break; + case NEON_SADDW: + saddw(vf_l, rd, rn, rm); + break; + case NEON_SADDW2: + saddw2(vf_l, rd, rn, rm); + break; + case NEON_USUBW: + usubw(vf_l, rd, rn, rm); + break; + case NEON_USUBW2: + usubw2(vf_l, rd, rn, rm); + break; + case NEON_SSUBW: + ssubw(vf_l, rd, rn, rm); + break; + case NEON_SSUBW2: + ssubw2(vf_l, rd, rn, rm); + break; + case NEON_ADDHN: + addhn(vf, rd, rn, rm); + break; + case NEON_ADDHN2: + addhn2(vf, rd, rn, rm); + break; + case NEON_RADDHN: + raddhn(vf, rd, rn, rm); + break; + case NEON_RADDHN2: + raddhn2(vf, rd, rn, rm); + break; + case NEON_SUBHN: + subhn(vf, rd, rn, rm); + break; + case NEON_SUBHN2: + subhn2(vf, rd, rn, rm); + break; + case NEON_RSUBHN: + rsubhn(vf, rd, rn, rm); + break; + case NEON_RSUBHN2: + rsubhn2(vf, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONAcrossLanes(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + + static const NEONFormatMap map_half = {{30}, {NF_4H, NF_8H}}; + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + if (instr->Mask(NEONAcrossLanesFP16FMask) == NEONAcrossLanesFP16Fixed) { + VectorFormat vf = nfd.GetVectorFormat(&map_half); + switch (instr->Mask(NEONAcrossLanesFP16Mask)) { + case NEON_FMAXV_H: + fmaxv(vf, rd, rn); + break; + case NEON_FMINV_H: + fminv(vf, rd, rn); + break; + case NEON_FMAXNMV_H: + fmaxnmv(vf, rd, rn); + break; + case NEON_FMINNMV_H: + fminnmv(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } else if (instr->Mask(NEONAcrossLanesFPFMask) == NEONAcrossLanesFPFixed) { + // The input operand's VectorFormat is passed for these instructions. + VectorFormat vf = nfd.GetVectorFormat(nfd.FPFormatMap()); + + switch (instr->Mask(NEONAcrossLanesFPMask)) { + case NEON_FMAXV: + fmaxv(vf, rd, rn); + break; + case NEON_FMINV: + fminv(vf, rd, rn); + break; + case NEON_FMAXNMV: + fmaxnmv(vf, rd, rn); + break; + case NEON_FMINNMV: + fminnmv(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } else { + VectorFormat vf = nfd.GetVectorFormat(); + + switch (instr->Mask(NEONAcrossLanesMask)) { + case NEON_ADDV: + addv(vf, rd, rn); + break; + case NEON_SMAXV: + smaxv(vf, rd, rn); + break; + case NEON_SMINV: + sminv(vf, rd, rn); + break; + case NEON_UMAXV: + umaxv(vf, rd, rn); + break; + case NEON_UMINV: + uminv(vf, rd, rn); + break; + case NEON_SADDLV: + saddlv(vf, rd, rn); + break; + case NEON_UADDLV: + uaddlv(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } +} + +void Simulator::SimulateNEONMulByElementLong(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + VectorFormat vf = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + int rm_reg = instr->GetRm(); + int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); + if (instr->GetNEONSize() == 1) { + rm_reg = instr->GetRmLow16(); + index = (index << 1) | instr->GetNEONM(); + } + SimVRegister& rm = ReadVRegister(rm_reg); + + SimVRegister temp; + VectorFormat indexform = + VectorFormatHalfWidthDoubleLanes(VectorFormatFillQ(vf)); + dup_element(indexform, temp, rm, index); + + bool is_2 = instr->Mask(NEON_Q) ? true : false; + + switch (form_hash_) { + case "smull_asimdelem_l"_h: + smull(vf, rd, rn, temp, is_2); + break; + case "umull_asimdelem_l"_h: + umull(vf, rd, rn, temp, is_2); + break; + case "smlal_asimdelem_l"_h: + smlal(vf, rd, rn, temp, is_2); + break; + case "umlal_asimdelem_l"_h: + umlal(vf, rd, rn, temp, is_2); + break; + case "smlsl_asimdelem_l"_h: + smlsl(vf, rd, rn, temp, is_2); + break; + case "umlsl_asimdelem_l"_h: + umlsl(vf, rd, rn, temp, is_2); + break; + case "sqdmull_asimdelem_l"_h: + sqdmull(vf, rd, rn, temp, is_2); + break; + case "sqdmlal_asimdelem_l"_h: + sqdmlal(vf, rd, rn, temp, is_2); + break; + case "sqdmlsl_asimdelem_l"_h: + sqdmlsl(vf, rd, rn, temp, is_2); + break; + default: + VIXL_UNREACHABLE(); + } +} + +void Simulator::SimulateNEONFPMulByElementLong(const Instruction* instr) { + VectorFormat vform = instr->GetNEONQ() ? kFormat4S : kFormat2S; + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRmLow16()); + + int index = + (instr->GetNEONH() << 2) | (instr->GetNEONL() << 1) | instr->GetNEONM(); + + switch (form_hash_) { + case "fmlal_asimdelem_lh"_h: + fmlal(vform, rd, rn, rm, index); + break; + case "fmlal2_asimdelem_lh"_h: + fmlal2(vform, rd, rn, rm, index); + break; + case "fmlsl_asimdelem_lh"_h: + fmlsl(vform, rd, rn, rm, index); + break; + case "fmlsl2_asimdelem_lh"_h: + fmlsl2(vform, rd, rn, rm, index); + break; + default: + VIXL_UNREACHABLE(); + } +} + +void Simulator::SimulateNEONFPMulByElement(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + static const NEONFormatMap map = + {{23, 22, 30}, + {NF_4H, NF_8H, NF_UNDEF, NF_UNDEF, NF_2S, NF_4S, NF_UNDEF, NF_2D}}; + VectorFormat vform = nfd.GetVectorFormat(&map); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + int rm_reg = instr->GetRm(); + int index = + (instr->GetNEONH() << 2) | (instr->GetNEONL() << 1) | instr->GetNEONM(); + + if ((vform == kFormat4H) || (vform == kFormat8H)) { + rm_reg &= 0xf; + } else if ((vform == kFormat2S) || (vform == kFormat4S)) { + index >>= 1; + } else { + VIXL_ASSERT(vform == kFormat2D); + VIXL_ASSERT(instr->GetNEONL() == 0); + index >>= 2; + } + + SimVRegister& rm = ReadVRegister(rm_reg); + + switch (form_hash_) { + case "fmul_asimdelem_rh_h"_h: + case "fmul_asimdelem_r_sd"_h: + fmul(vform, rd, rn, rm, index); + break; + case "fmla_asimdelem_rh_h"_h: + case "fmla_asimdelem_r_sd"_h: + fmla(vform, rd, rn, rm, index); + break; + case "fmls_asimdelem_rh_h"_h: + case "fmls_asimdelem_r_sd"_h: + fmls(vform, rd, rn, rm, index); + break; + case "fmulx_asimdelem_rh_h"_h: + case "fmulx_asimdelem_r_sd"_h: + fmulx(vform, rd, rn, rm, index); + break; + default: + VIXL_UNREACHABLE(); + } +} + +void Simulator::SimulateNEONComplexMulByElement(const Instruction* instr) { + VectorFormat vform = instr->GetNEONQ() ? kFormat8H : kFormat4H; + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); + + switch (form_hash_) { + case "fcmla_asimdelem_c_s"_h: + vform = kFormat4S; + index >>= 1; + VIXL_FALLTHROUGH(); + case "fcmla_asimdelem_c_h"_h: + fcmla(vform, rd, rn, rm, index, instr->GetImmRotFcmlaSca()); + break; + default: + VIXL_UNREACHABLE(); + } +} + +void Simulator::SimulateNEONDotProdByElement(const Instruction* instr) { + VectorFormat vform = instr->GetNEONQ() ? kFormat4S : kFormat2S; + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); + + SimVRegister temp; + // NEON indexed `dot` allows the index value exceed the register size. + // Promote the format to Q-sized vector format before the duplication. + dup_elements_to_segments(VectorFormatFillQ(vform), temp, rm, index); + + switch (form_hash_) { + case "sdot_asimdelem_d"_h: + sdot(vform, rd, rn, temp); + break; + case "udot_asimdelem_d"_h: + udot(vform, rd, rn, temp); + break; + case "sudot_asimdelem_d"_h: + usdot(vform, rd, temp, rn); + break; + case "usdot_asimdelem_d"_h: + usdot(vform, rd, rn, temp); + break; + } +} + +void Simulator::VisitNEONByIndexedElement(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + VectorFormat vform = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + int rm_reg = instr->GetRm(); + int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); + + if ((vform == kFormat4H) || (vform == kFormat8H)) { + rm_reg &= 0xf; + index = (index << 1) | instr->GetNEONM(); + } + + SimVRegister& rm = ReadVRegister(rm_reg); + + switch (form_hash_) { + case "mul_asimdelem_r"_h: + mul(vform, rd, rn, rm, index); + break; + case "mla_asimdelem_r"_h: + mla(vform, rd, rn, rm, index); + break; + case "mls_asimdelem_r"_h: + mls(vform, rd, rn, rm, index); + break; + case "sqdmulh_asimdelem_r"_h: + sqdmulh(vform, rd, rn, rm, index); + break; + case "sqrdmulh_asimdelem_r"_h: + sqrdmulh(vform, rd, rn, rm, index); + break; + case "sqrdmlah_asimdelem_r"_h: + sqrdmlah(vform, rd, rn, rm, index); + break; + case "sqrdmlsh_asimdelem_r"_h: + sqrdmlsh(vform, rd, rn, rm, index); + break; + } +} + + +void Simulator::VisitNEONCopy(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::TriangularFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + int imm5 = instr->GetImmNEON5(); + int tz = CountTrailingZeros(imm5, 32); + int reg_index = ExtractSignedBitfield32(31, tz + 1, imm5); + + if (instr->Mask(NEONCopyInsElementMask) == NEON_INS_ELEMENT) { + int imm4 = instr->GetImmNEON4(); + int rn_index = ExtractSignedBitfield32(31, tz, imm4); + ins_element(vf, rd, reg_index, rn, rn_index); + } else if (instr->Mask(NEONCopyInsGeneralMask) == NEON_INS_GENERAL) { + ins_immediate(vf, rd, reg_index, ReadXRegister(instr->GetRn())); + } else if (instr->Mask(NEONCopyUmovMask) == NEON_UMOV) { + uint64_t value = LogicVRegister(rn).Uint(vf, reg_index); + value &= MaxUintFromFormat(vf); + WriteXRegister(instr->GetRd(), value); + } else if (instr->Mask(NEONCopyUmovMask) == NEON_SMOV) { + int64_t value = LogicVRegister(rn).Int(vf, reg_index); + if (instr->GetNEONQ()) { + WriteXRegister(instr->GetRd(), value); + } else { + WriteWRegister(instr->GetRd(), (int32_t)value); + } + } else if (instr->Mask(NEONCopyDupElementMask) == NEON_DUP_ELEMENT) { + dup_element(vf, rd, rn, reg_index); + } else if (instr->Mask(NEONCopyDupGeneralMask) == NEON_DUP_GENERAL) { + dup_immediate(vf, rd, ReadXRegister(instr->GetRn())); + } else { + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONExtract(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LogicalFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + if (instr->Mask(NEONExtractMask) == NEON_EXT) { + int index = instr->GetImmNEONExt(); + ext(vf, rd, rn, rm, index); + } else { + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::NEONLoadStoreMultiStructHelper(const Instruction* instr, + AddrMode addr_mode) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LoadStoreFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + uint64_t addr_base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + int reg_size = RegisterSizeInBytesFromFormat(vf); + + int reg[4]; + uint64_t addr[4]; + for (int i = 0; i < 4; i++) { + reg[i] = (instr->GetRt() + i) % kNumberOfVRegisters; + addr[i] = addr_base + (i * reg_size); + } + int struct_parts = 1; + int reg_count = 1; + bool log_read = true; + + // Bit 23 determines whether this is an offset or post-index addressing mode. + // In offset mode, bits 20 to 16 should be zero; these bits encode the + // register or immediate in post-index mode. + if ((instr->ExtractBit(23) == 0) && (instr->ExtractBits(20, 16) != 0)) { + VIXL_UNREACHABLE(); + } + + // We use the PostIndex mask here, as it works in this case for both Offset + // and PostIndex addressing. + switch (instr->Mask(NEONLoadStoreMultiStructPostIndexMask)) { + case NEON_LD1_4v: + case NEON_LD1_4v_post: + ld1(vf, ReadVRegister(reg[3]), addr[3]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_LD1_3v: + case NEON_LD1_3v_post: + ld1(vf, ReadVRegister(reg[2]), addr[2]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_LD1_2v: + case NEON_LD1_2v_post: + ld1(vf, ReadVRegister(reg[1]), addr[1]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_LD1_1v: + case NEON_LD1_1v_post: + ld1(vf, ReadVRegister(reg[0]), addr[0]); + break; + case NEON_ST1_4v: + case NEON_ST1_4v_post: + st1(vf, ReadVRegister(reg[3]), addr[3]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_ST1_3v: + case NEON_ST1_3v_post: + st1(vf, ReadVRegister(reg[2]), addr[2]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_ST1_2v: + case NEON_ST1_2v_post: + st1(vf, ReadVRegister(reg[1]), addr[1]); + reg_count++; + VIXL_FALLTHROUGH(); + case NEON_ST1_1v: + case NEON_ST1_1v_post: + st1(vf, ReadVRegister(reg[0]), addr[0]); + log_read = false; + break; + case NEON_LD2_post: + case NEON_LD2: + ld2(vf, ReadVRegister(reg[0]), ReadVRegister(reg[1]), addr[0]); + struct_parts = 2; + reg_count = 2; + break; + case NEON_ST2: + case NEON_ST2_post: + st2(vf, ReadVRegister(reg[0]), ReadVRegister(reg[1]), addr[0]); + struct_parts = 2; + reg_count = 2; + log_read = false; + break; + case NEON_LD3_post: + case NEON_LD3: + ld3(vf, + ReadVRegister(reg[0]), + ReadVRegister(reg[1]), + ReadVRegister(reg[2]), + addr[0]); + struct_parts = 3; + reg_count = 3; + break; + case NEON_ST3: + case NEON_ST3_post: + st3(vf, + ReadVRegister(reg[0]), + ReadVRegister(reg[1]), + ReadVRegister(reg[2]), + addr[0]); + struct_parts = 3; + reg_count = 3; + log_read = false; + break; + case NEON_ST4: + case NEON_ST4_post: + st4(vf, + ReadVRegister(reg[0]), + ReadVRegister(reg[1]), + ReadVRegister(reg[2]), + ReadVRegister(reg[3]), + addr[0]); + struct_parts = 4; + reg_count = 4; + log_read = false; + break; + case NEON_LD4_post: + case NEON_LD4: + ld4(vf, + ReadVRegister(reg[0]), + ReadVRegister(reg[1]), + ReadVRegister(reg[2]), + ReadVRegister(reg[3]), + addr[0]); + struct_parts = 4; + reg_count = 4; + break; + default: + VIXL_UNIMPLEMENTED(); + } + + bool do_trace = log_read ? ShouldTraceVRegs() : ShouldTraceWrites(); + if (do_trace) { + PrintRegisterFormat print_format = + GetPrintRegisterFormatTryFP(GetPrintRegisterFormat(vf)); + const char* op; + if (log_read) { + op = "<-"; + } else { + op = "->"; + // Stores don't represent a change to the source register's value, so only + // print the relevant part of the value. + print_format = GetPrintRegPartial(print_format); + } + + VIXL_ASSERT((struct_parts == reg_count) || (struct_parts == 1)); + for (int s = reg_count - struct_parts; s >= 0; s -= struct_parts) { + uintptr_t address = addr_base + (s * RegisterSizeInBytesFromFormat(vf)); + PrintVStructAccess(reg[s], struct_parts, print_format, op, address); + } + } + + if (addr_mode == PostIndex) { + int rm = instr->GetRm(); + // The immediate post index addressing mode is indicated by rm = 31. + // The immediate is implied by the number of vector registers used. + addr_base += (rm == 31) ? (RegisterSizeInBytesFromFormat(vf) * reg_count) + : ReadXRegister(rm); + WriteXRegister(instr->GetRn(), addr_base); + } else { + VIXL_ASSERT(addr_mode == Offset); + } +} + + +void Simulator::VisitNEONLoadStoreMultiStruct(const Instruction* instr) { + NEONLoadStoreMultiStructHelper(instr, Offset); +} + + +void Simulator::VisitNEONLoadStoreMultiStructPostIndex( + const Instruction* instr) { + NEONLoadStoreMultiStructHelper(instr, PostIndex); +} + + +void Simulator::NEONLoadStoreSingleStructHelper(const Instruction* instr, + AddrMode addr_mode) { + uint64_t addr = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + int rt = instr->GetRt(); + + // Bit 23 determines whether this is an offset or post-index addressing mode. + // In offset mode, bits 20 to 16 should be zero; these bits encode the + // register or immediate in post-index mode. + if ((instr->ExtractBit(23) == 0) && (instr->ExtractBits(20, 16) != 0)) { + VIXL_UNREACHABLE(); + } + + // We use the PostIndex mask here, as it works in this case for both Offset + // and PostIndex addressing. + bool do_load = false; + + bool replicating = false; + + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LoadStoreFormatMap()); + VectorFormat vf_t = nfd.GetVectorFormat(); + + VectorFormat vf = kFormat16B; + switch (instr->Mask(NEONLoadStoreSingleStructPostIndexMask)) { + case NEON_LD1_b: + case NEON_LD1_b_post: + case NEON_LD2_b: + case NEON_LD2_b_post: + case NEON_LD3_b: + case NEON_LD3_b_post: + case NEON_LD4_b: + case NEON_LD4_b_post: + do_load = true; + VIXL_FALLTHROUGH(); + case NEON_ST1_b: + case NEON_ST1_b_post: + case NEON_ST2_b: + case NEON_ST2_b_post: + case NEON_ST3_b: + case NEON_ST3_b_post: + case NEON_ST4_b: + case NEON_ST4_b_post: + break; + + case NEON_LD1_h: + case NEON_LD1_h_post: + case NEON_LD2_h: + case NEON_LD2_h_post: + case NEON_LD3_h: + case NEON_LD3_h_post: + case NEON_LD4_h: + case NEON_LD4_h_post: + do_load = true; + VIXL_FALLTHROUGH(); + case NEON_ST1_h: + case NEON_ST1_h_post: + case NEON_ST2_h: + case NEON_ST2_h_post: + case NEON_ST3_h: + case NEON_ST3_h_post: + case NEON_ST4_h: + case NEON_ST4_h_post: + vf = kFormat8H; + break; + case NEON_LD1_s: + case NEON_LD1_s_post: + case NEON_LD2_s: + case NEON_LD2_s_post: + case NEON_LD3_s: + case NEON_LD3_s_post: + case NEON_LD4_s: + case NEON_LD4_s_post: + do_load = true; + VIXL_FALLTHROUGH(); + case NEON_ST1_s: + case NEON_ST1_s_post: + case NEON_ST2_s: + case NEON_ST2_s_post: + case NEON_ST3_s: + case NEON_ST3_s_post: + case NEON_ST4_s: + case NEON_ST4_s_post: { + VIXL_STATIC_ASSERT((NEON_LD1_s | (1 << NEONLSSize_offset)) == NEON_LD1_d); + VIXL_STATIC_ASSERT((NEON_LD1_s_post | (1 << NEONLSSize_offset)) == + NEON_LD1_d_post); + VIXL_STATIC_ASSERT((NEON_ST1_s | (1 << NEONLSSize_offset)) == NEON_ST1_d); + VIXL_STATIC_ASSERT((NEON_ST1_s_post | (1 << NEONLSSize_offset)) == + NEON_ST1_d_post); + vf = ((instr->GetNEONLSSize() & 1) == 0) ? kFormat4S : kFormat2D; + break; + } + + case NEON_LD1R: + case NEON_LD1R_post: + case NEON_LD2R: + case NEON_LD2R_post: + case NEON_LD3R: + case NEON_LD3R_post: + case NEON_LD4R: + case NEON_LD4R_post: + vf = vf_t; + do_load = true; + replicating = true; + break; + + default: + VIXL_UNIMPLEMENTED(); + } + + int index_shift = LaneSizeInBytesLog2FromFormat(vf); + int lane = instr->GetNEONLSIndex(index_shift); + int reg_count = 0; + int rt2 = (rt + 1) % kNumberOfVRegisters; + int rt3 = (rt2 + 1) % kNumberOfVRegisters; + int rt4 = (rt3 + 1) % kNumberOfVRegisters; + switch (instr->Mask(NEONLoadStoreSingleLenMask)) { + case NEONLoadStoreSingle1: + reg_count = 1; + if (replicating) { + VIXL_ASSERT(do_load); + ld1r(vf, ReadVRegister(rt), addr); + } else if (do_load) { + ld1(vf, ReadVRegister(rt), lane, addr); + } else { + st1(vf, ReadVRegister(rt), lane, addr); + } + break; + case NEONLoadStoreSingle2: + reg_count = 2; + if (replicating) { + VIXL_ASSERT(do_load); + ld2r(vf, ReadVRegister(rt), ReadVRegister(rt2), addr); + } else if (do_load) { + ld2(vf, ReadVRegister(rt), ReadVRegister(rt2), lane, addr); + } else { + st2(vf, ReadVRegister(rt), ReadVRegister(rt2), lane, addr); + } + break; + case NEONLoadStoreSingle3: + reg_count = 3; + if (replicating) { + VIXL_ASSERT(do_load); + ld3r(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + addr); + } else if (do_load) { + ld3(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + lane, + addr); + } else { + st3(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + lane, + addr); + } + break; + case NEONLoadStoreSingle4: + reg_count = 4; + if (replicating) { + VIXL_ASSERT(do_load); + ld4r(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + ReadVRegister(rt4), + addr); + } else if (do_load) { + ld4(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + ReadVRegister(rt4), + lane, + addr); + } else { + st4(vf, + ReadVRegister(rt), + ReadVRegister(rt2), + ReadVRegister(rt3), + ReadVRegister(rt4), + lane, + addr); + } + break; + default: + VIXL_UNIMPLEMENTED(); + } + + // Trace registers and/or memory writes. + PrintRegisterFormat print_format = + GetPrintRegisterFormatTryFP(GetPrintRegisterFormat(vf)); + if (do_load) { + if (ShouldTraceVRegs()) { + if (replicating) { + PrintVReplicatingStructAccess(rt, reg_count, print_format, "<-", addr); + } else { + PrintVSingleStructAccess(rt, reg_count, lane, print_format, "<-", addr); + } + } + } else { + if (ShouldTraceWrites()) { + // Stores don't represent a change to the source register's value, so only + // print the relevant part of the value. + print_format = GetPrintRegPartial(print_format); + PrintVSingleStructAccess(rt, reg_count, lane, print_format, "->", addr); + } + } + + if (addr_mode == PostIndex) { + int rm = instr->GetRm(); + int lane_size = LaneSizeInBytesFromFormat(vf); + WriteXRegister(instr->GetRn(), + addr + ((rm == 31) ? (reg_count * lane_size) + : ReadXRegister(rm))); + } +} + + +void Simulator::VisitNEONLoadStoreSingleStruct(const Instruction* instr) { + NEONLoadStoreSingleStructHelper(instr, Offset); +} + + +void Simulator::VisitNEONLoadStoreSingleStructPostIndex( + const Instruction* instr) { + NEONLoadStoreSingleStructHelper(instr, PostIndex); +} + + +void Simulator::VisitNEONModifiedImmediate(const Instruction* instr) { + SimVRegister& rd = ReadVRegister(instr->GetRd()); + int cmode = instr->GetNEONCmode(); + int cmode_3_1 = (cmode >> 1) & 7; + int cmode_3 = (cmode >> 3) & 1; + int cmode_2 = (cmode >> 2) & 1; + int cmode_1 = (cmode >> 1) & 1; + int cmode_0 = cmode & 1; + int half_enc = instr->ExtractBit(11); + int q = instr->GetNEONQ(); + int op_bit = instr->GetNEONModImmOp(); + uint64_t imm8 = instr->GetImmNEONabcdefgh(); + // Find the format and immediate value + uint64_t imm = 0; + VectorFormat vform = kFormatUndefined; + switch (cmode_3_1) { + case 0x0: + case 0x1: + case 0x2: + case 0x3: + vform = (q == 1) ? kFormat4S : kFormat2S; + imm = imm8 << (8 * cmode_3_1); + break; + case 0x4: + case 0x5: + vform = (q == 1) ? kFormat8H : kFormat4H; + imm = imm8 << (8 * cmode_1); + break; + case 0x6: + vform = (q == 1) ? kFormat4S : kFormat2S; + if (cmode_0 == 0) { + imm = imm8 << 8 | 0x000000ff; + } else { + imm = imm8 << 16 | 0x0000ffff; + } + break; + case 0x7: + if (cmode_0 == 0 && op_bit == 0) { + vform = q ? kFormat16B : kFormat8B; + imm = imm8; + } else if (cmode_0 == 0 && op_bit == 1) { + vform = q ? kFormat2D : kFormat1D; + imm = 0; + for (int i = 0; i < 8; ++i) { + if (imm8 & (1 << i)) { + imm |= (UINT64_C(0xff) << (8 * i)); + } + } + } else { // cmode_0 == 1, cmode == 0xf. + if (half_enc == 1) { + vform = q ? kFormat8H : kFormat4H; + imm = Float16ToRawbits(instr->GetImmNEONFP16()); + } else if (op_bit == 0) { + vform = q ? kFormat4S : kFormat2S; + imm = FloatToRawbits(instr->GetImmNEONFP32()); + } else if (q == 1) { + vform = kFormat2D; + imm = DoubleToRawbits(instr->GetImmNEONFP64()); + } else { + VIXL_ASSERT((q == 0) && (op_bit == 1) && (cmode == 0xf)); + VisitUnallocated(instr); + } + } + break; + default: + VIXL_UNREACHABLE(); + break; + } + + // Find the operation + NEONModifiedImmediateOp op; + if (cmode_3 == 0) { + if (cmode_0 == 0) { + op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; + } else { // cmode<0> == '1' + op = op_bit ? NEONModifiedImmediate_BIC : NEONModifiedImmediate_ORR; + } + } else { // cmode<3> == '1' + if (cmode_2 == 0) { + if (cmode_0 == 0) { + op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; + } else { // cmode<0> == '1' + op = op_bit ? NEONModifiedImmediate_BIC : NEONModifiedImmediate_ORR; + } + } else { // cmode<2> == '1' + if (cmode_1 == 0) { + op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; + } else { // cmode<1> == '1' + if (cmode_0 == 0) { + op = NEONModifiedImmediate_MOVI; + } else { // cmode<0> == '1' + op = NEONModifiedImmediate_MOVI; + } + } + } + } + + // Call the logic function + if (op == NEONModifiedImmediate_ORR) { + orr(vform, rd, rd, imm); + } else if (op == NEONModifiedImmediate_BIC) { + bic(vform, rd, rd, imm); + } else if (op == NEONModifiedImmediate_MOVI) { + movi(vform, rd, imm); + } else if (op == NEONModifiedImmediate_MVNI) { + mvni(vform, rd, imm); + } else { + VisitUnimplemented(instr); + } +} + + +void Simulator::VisitNEONScalar2RegMisc(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + if (instr->Mask(NEON2RegMiscOpcode) <= NEON_NEG_scalar_opcode) { + // These instructions all use a two bit size field, except NOT and RBIT, + // which use the field to encode the operation. + switch (instr->Mask(NEONScalar2RegMiscMask)) { + case NEON_CMEQ_zero_scalar: + cmp(vf, rd, rn, 0, eq); + break; + case NEON_CMGE_zero_scalar: + cmp(vf, rd, rn, 0, ge); break; - case NEON_CMGT: - cmp(vf, rd, rn, rm, gt); + case NEON_CMGT_zero_scalar: + cmp(vf, rd, rn, 0, gt); break; - case NEON_CMHI: - cmp(vf, rd, rn, rm, hi); + case NEON_CMLT_zero_scalar: + cmp(vf, rd, rn, 0, lt); + break; + case NEON_CMLE_zero_scalar: + cmp(vf, rd, rn, 0, le); + break; + case NEON_ABS_scalar: + abs(vf, rd, rn); + break; + case NEON_SQABS_scalar: + abs(vf, rd, rn).SignedSaturate(vf); + break; + case NEON_NEG_scalar: + neg(vf, rd, rn); + break; + case NEON_SQNEG_scalar: + neg(vf, rd, rn).SignedSaturate(vf); + break; + case NEON_SUQADD_scalar: + suqadd(vf, rd, rd, rn); + break; + case NEON_USQADD_scalar: + usqadd(vf, rd, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + } else { + VectorFormat fpf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + // These instructions all use a one bit size field, except SQXTUN, SQXTN + // and UQXTN, which use a two bit size field. + switch (instr->Mask(NEONScalar2RegMiscFPMask)) { + case NEON_FRECPE_scalar: + frecpe(fpf, rd, rn, fpcr_rounding); + break; + case NEON_FRECPX_scalar: + frecpx(fpf, rd, rn); + break; + case NEON_FRSQRTE_scalar: + frsqrte(fpf, rd, rn); + break; + case NEON_FCMGT_zero_scalar: + fcmp_zero(fpf, rd, rn, gt); + break; + case NEON_FCMGE_zero_scalar: + fcmp_zero(fpf, rd, rn, ge); + break; + case NEON_FCMEQ_zero_scalar: + fcmp_zero(fpf, rd, rn, eq); + break; + case NEON_FCMLE_zero_scalar: + fcmp_zero(fpf, rd, rn, le); + break; + case NEON_FCMLT_zero_scalar: + fcmp_zero(fpf, rd, rn, lt); + break; + case NEON_SCVTF_scalar: + scvtf(fpf, rd, rn, 0, fpcr_rounding); + break; + case NEON_UCVTF_scalar: + ucvtf(fpf, rd, rn, 0, fpcr_rounding); + break; + case NEON_FCVTNS_scalar: + fcvts(fpf, rd, rn, FPTieEven); + break; + case NEON_FCVTNU_scalar: + fcvtu(fpf, rd, rn, FPTieEven); + break; + case NEON_FCVTPS_scalar: + fcvts(fpf, rd, rn, FPPositiveInfinity); + break; + case NEON_FCVTPU_scalar: + fcvtu(fpf, rd, rn, FPPositiveInfinity); + break; + case NEON_FCVTMS_scalar: + fcvts(fpf, rd, rn, FPNegativeInfinity); + break; + case NEON_FCVTMU_scalar: + fcvtu(fpf, rd, rn, FPNegativeInfinity); + break; + case NEON_FCVTZS_scalar: + fcvts(fpf, rd, rn, FPZero); + break; + case NEON_FCVTZU_scalar: + fcvtu(fpf, rd, rn, FPZero); + break; + case NEON_FCVTAS_scalar: + fcvts(fpf, rd, rn, FPTieAway); + break; + case NEON_FCVTAU_scalar: + fcvtu(fpf, rd, rn, FPTieAway); + break; + case NEON_FCVTXN_scalar: + // Unlike all of the other FP instructions above, fcvtxn encodes dest + // size S as size<0>=1. There's only one case, so we ignore the form. + VIXL_ASSERT(instr->ExtractBit(22) == 1); + fcvtxn(kFormatS, rd, rn); break; - case NEON_CMHS: - cmp(vf, rd, rn, rm, hs); + default: + switch (instr->Mask(NEONScalar2RegMiscMask)) { + case NEON_SQXTN_scalar: + sqxtn(vf, rd, rn); + break; + case NEON_UQXTN_scalar: + uqxtn(vf, rd, rn); + break; + case NEON_SQXTUN_scalar: + sqxtun(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } + } +} + + +void Simulator::VisitNEONScalar2RegMiscFP16(const Instruction* instr) { + VectorFormat fpf = kFormatH; + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + switch (instr->Mask(NEONScalar2RegMiscFP16Mask)) { + case NEON_FRECPE_H_scalar: + frecpe(fpf, rd, rn, fpcr_rounding); + break; + case NEON_FRECPX_H_scalar: + frecpx(fpf, rd, rn); + break; + case NEON_FRSQRTE_H_scalar: + frsqrte(fpf, rd, rn); + break; + case NEON_FCMGT_H_zero_scalar: + fcmp_zero(fpf, rd, rn, gt); + break; + case NEON_FCMGE_H_zero_scalar: + fcmp_zero(fpf, rd, rn, ge); + break; + case NEON_FCMEQ_H_zero_scalar: + fcmp_zero(fpf, rd, rn, eq); + break; + case NEON_FCMLE_H_zero_scalar: + fcmp_zero(fpf, rd, rn, le); + break; + case NEON_FCMLT_H_zero_scalar: + fcmp_zero(fpf, rd, rn, lt); + break; + case NEON_SCVTF_H_scalar: + scvtf(fpf, rd, rn, 0, fpcr_rounding); + break; + case NEON_UCVTF_H_scalar: + ucvtf(fpf, rd, rn, 0, fpcr_rounding); + break; + case NEON_FCVTNS_H_scalar: + fcvts(fpf, rd, rn, FPTieEven); + break; + case NEON_FCVTNU_H_scalar: + fcvtu(fpf, rd, rn, FPTieEven); + break; + case NEON_FCVTPS_H_scalar: + fcvts(fpf, rd, rn, FPPositiveInfinity); + break; + case NEON_FCVTPU_H_scalar: + fcvtu(fpf, rd, rn, FPPositiveInfinity); + break; + case NEON_FCVTMS_H_scalar: + fcvts(fpf, rd, rn, FPNegativeInfinity); + break; + case NEON_FCVTMU_H_scalar: + fcvtu(fpf, rd, rn, FPNegativeInfinity); + break; + case NEON_FCVTZS_H_scalar: + fcvts(fpf, rd, rn, FPZero); + break; + case NEON_FCVTZU_H_scalar: + fcvtu(fpf, rd, rn, FPZero); + break; + case NEON_FCVTAS_H_scalar: + fcvts(fpf, rd, rn, FPTieAway); + break; + case NEON_FCVTAU_H_scalar: + fcvtu(fpf, rd, rn, FPTieAway); + break; + } +} + + +void Simulator::VisitNEONScalar3Diff(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LongScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + switch (instr->Mask(NEONScalar3DiffMask)) { + case NEON_SQDMLAL_scalar: + sqdmlal(vf, rd, rn, rm); + break; + case NEON_SQDMLSL_scalar: + sqdmlsl(vf, rd, rn, rm); + break; + case NEON_SQDMULL_scalar: + sqdmull(vf, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONScalar3Same(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + if (instr->Mask(NEONScalar3SameFPFMask) == NEONScalar3SameFPFixed) { + vf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); + switch (instr->Mask(NEONScalar3SameFPMask)) { + case NEON_FMULX_scalar: + fmulx(vf, rd, rn, rm); break; - case NEON_CMTST: - cmptst(vf, rd, rn, rm); + case NEON_FACGE_scalar: + fabscmp(vf, rd, rn, rm, ge); break; - case NEON_MLS: - mls(vf, rd, rn, rm); + case NEON_FACGT_scalar: + fabscmp(vf, rd, rn, rm, gt); break; - case NEON_MLA: - mla(vf, rd, rn, rm); + case NEON_FCMEQ_scalar: + fcmp(vf, rd, rn, rm, eq); break; - case NEON_MUL: - mul(vf, rd, rn, rm); + case NEON_FCMGE_scalar: + fcmp(vf, rd, rn, rm, ge); break; - case NEON_PMUL: - pmul(vf, rd, rn, rm); + case NEON_FCMGT_scalar: + fcmp(vf, rd, rn, rm, gt); break; - case NEON_SMAX: - smax(vf, rd, rn, rm); + case NEON_FRECPS_scalar: + frecps(vf, rd, rn, rm); break; - case NEON_SMAXP: - smaxp(vf, rd, rn, rm); + case NEON_FRSQRTS_scalar: + frsqrts(vf, rd, rn, rm); break; - case NEON_SMIN: - smin(vf, rd, rn, rm); + case NEON_FABD_scalar: + fabd(vf, rd, rn, rm); break; - case NEON_SMINP: - sminp(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); + } + } else { + switch (instr->Mask(NEONScalar3SameMask)) { + case NEON_ADD_scalar: + add(vf, rd, rn, rm); break; - case NEON_SUB: + case NEON_SUB_scalar: sub(vf, rd, rn, rm); break; - case NEON_UMAX: - umax(vf, rd, rn, rm); + case NEON_CMEQ_scalar: + cmp(vf, rd, rn, rm, eq); break; - case NEON_UMAXP: - umaxp(vf, rd, rn, rm); + case NEON_CMGE_scalar: + cmp(vf, rd, rn, rm, ge); break; - case NEON_UMIN: - umin(vf, rd, rn, rm); + case NEON_CMGT_scalar: + cmp(vf, rd, rn, rm, gt); break; - case NEON_UMINP: - uminp(vf, rd, rn, rm); + case NEON_CMHI_scalar: + cmp(vf, rd, rn, rm, hi); break; - case NEON_SSHL: - sshl(vf, rd, rn, rm); + case NEON_CMHS_scalar: + cmp(vf, rd, rn, rm, hs); break; - case NEON_USHL: - ushl(vf, rd, rn, rm); + case NEON_CMTST_scalar: + cmptst(vf, rd, rn, rm); break; - case NEON_SABD: - absdiff(vf, rd, rn, rm, true); + case NEON_USHL_scalar: + ushl(vf, rd, rn, rm); break; - case NEON_UABD: - absdiff(vf, rd, rn, rm, false); + case NEON_SSHL_scalar: + sshl(vf, rd, rn, rm); break; - case NEON_SABA: - saba(vf, rd, rn, rm); + case NEON_SQDMULH_scalar: + sqdmulh(vf, rd, rn, rm); break; - case NEON_UABA: - uaba(vf, rd, rn, rm); + case NEON_SQRDMULH_scalar: + sqrdmulh(vf, rd, rn, rm); break; - case NEON_UQADD: + case NEON_UQADD_scalar: add(vf, rd, rn, rm).UnsignedSaturate(vf); break; - case NEON_SQADD: + case NEON_SQADD_scalar: add(vf, rd, rn, rm).SignedSaturate(vf); break; - case NEON_UQSUB: + case NEON_UQSUB_scalar: sub(vf, rd, rn, rm).UnsignedSaturate(vf); break; - case NEON_SQSUB: + case NEON_SQSUB_scalar: sub(vf, rd, rn, rm).SignedSaturate(vf); break; - case NEON_SQDMULH: - sqdmulh(vf, rd, rn, rm); - break; - case NEON_SQRDMULH: - sqrdmulh(vf, rd, rn, rm); - break; - case NEON_UQSHL: + case NEON_UQSHL_scalar: ushl(vf, rd, rn, rm).UnsignedSaturate(vf); break; - case NEON_SQSHL: + case NEON_SQSHL_scalar: sshl(vf, rd, rn, rm).SignedSaturate(vf); break; - case NEON_URSHL: + case NEON_URSHL_scalar: ushl(vf, rd, rn, rm).Round(vf); break; - case NEON_SRSHL: + case NEON_SRSHL_scalar: sshl(vf, rd, rn, rm).Round(vf); break; - case NEON_UQRSHL: - ushl(vf, rd, rn, rm).Round(vf).UnsignedSaturate(vf); + case NEON_UQRSHL_scalar: + ushl(vf, rd, rn, rm).Round(vf).UnsignedSaturate(vf); + break; + case NEON_SQRSHL_scalar: + sshl(vf, rd, rn, rm).Round(vf).SignedSaturate(vf); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } +} + +void Simulator::VisitNEONScalar3SameFP16(const Instruction* instr) { + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(NEONScalar3SameFP16Mask)) { + case NEON_FABD_H_scalar: + fabd(kFormatH, rd, rn, rm); + break; + case NEON_FMULX_H_scalar: + fmulx(kFormatH, rd, rn, rm); + break; + case NEON_FCMEQ_H_scalar: + fcmp(kFormatH, rd, rn, rm, eq); + break; + case NEON_FCMGE_H_scalar: + fcmp(kFormatH, rd, rn, rm, ge); + break; + case NEON_FCMGT_H_scalar: + fcmp(kFormatH, rd, rn, rm, gt); + break; + case NEON_FACGE_H_scalar: + fabscmp(kFormatH, rd, rn, rm, ge); + break; + case NEON_FACGT_H_scalar: + fabscmp(kFormatH, rd, rn, rm, gt); + break; + case NEON_FRECPS_H_scalar: + frecps(kFormatH, rd, rn, rm); + break; + case NEON_FRSQRTS_H_scalar: + frsqrts(kFormatH, rd, rn, rm); + break; + default: + VIXL_UNREACHABLE(); + } +} + + +void Simulator::VisitNEONScalar3SameExtra(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(NEONScalar3SameExtraMask)) { + case NEON_SQRDMLAH_scalar: + sqrdmlah(vf, rd, rn, rm); + break; + case NEON_SQRDMLSH_scalar: + sqrdmlsh(vf, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::VisitNEONScalarByIndexedElement(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LongScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + VectorFormat vf_r = nfd.GetVectorFormat(nfd.ScalarFormatMap()); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + ByElementOp Op = NULL; + + int rm_reg = instr->GetRm(); + int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); + if (instr->GetNEONSize() == 1) { + rm_reg &= 0xf; + index = (index << 1) | instr->GetNEONM(); + } + + switch (instr->Mask(NEONScalarByIndexedElementMask)) { + case NEON_SQDMULL_byelement_scalar: + Op = &Simulator::sqdmull; + break; + case NEON_SQDMLAL_byelement_scalar: + Op = &Simulator::sqdmlal; + break; + case NEON_SQDMLSL_byelement_scalar: + Op = &Simulator::sqdmlsl; + break; + case NEON_SQDMULH_byelement_scalar: + Op = &Simulator::sqdmulh; + vf = vf_r; + break; + case NEON_SQRDMULH_byelement_scalar: + Op = &Simulator::sqrdmulh; + vf = vf_r; + break; + case NEON_SQRDMLAH_byelement_scalar: + Op = &Simulator::sqrdmlah; + vf = vf_r; + break; + case NEON_SQRDMLSH_byelement_scalar: + Op = &Simulator::sqrdmlsh; + vf = vf_r; + break; + default: + vf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); + index = instr->GetNEONH(); + if (instr->GetFPType() == 0) { + index = (index << 2) | (instr->GetNEONL() << 1) | instr->GetNEONM(); + rm_reg &= 0xf; + vf = kFormatH; + } else if ((instr->GetFPType() & 1) == 0) { + index = (index << 1) | instr->GetNEONL(); + } + switch (instr->Mask(NEONScalarByIndexedElementFPMask)) { + case NEON_FMUL_H_byelement_scalar: + case NEON_FMUL_byelement_scalar: + Op = &Simulator::fmul; + break; + case NEON_FMLA_H_byelement_scalar: + case NEON_FMLA_byelement_scalar: + Op = &Simulator::fmla; + break; + case NEON_FMLS_H_byelement_scalar: + case NEON_FMLS_byelement_scalar: + Op = &Simulator::fmls; + break; + case NEON_FMULX_H_byelement_scalar: + case NEON_FMULX_byelement_scalar: + Op = &Simulator::fmulx; + break; + default: + VIXL_UNIMPLEMENTED(); + } + } + + (this->*Op)(vf, rd, rn, ReadVRegister(rm_reg), index); +} + + +void Simulator::VisitNEONScalarCopy(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::TriangularScalarFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + + if (instr->Mask(NEONScalarCopyMask) == NEON_DUP_ELEMENT_scalar) { + int imm5 = instr->GetImmNEON5(); + int tz = CountTrailingZeros(imm5, 32); + int rn_index = ExtractSignedBitfield32(31, tz + 1, imm5); + dup_element(vf, rd, rn, rn_index); + } else { + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONScalarPairwise(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::FPScalarPairwiseFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + switch (instr->Mask(NEONScalarPairwiseMask)) { + case NEON_ADDP_scalar: { + // All pairwise operations except ADDP use bit U to differentiate FP16 + // from FP32/FP64 variations. + NEONFormatDecoder nfd_addp(instr, NEONFormatDecoder::FPScalarFormatMap()); + addp(nfd_addp.GetVectorFormat(), rd, rn); + break; + } + case NEON_FADDP_h_scalar: + case NEON_FADDP_scalar: + faddp(vf, rd, rn); + break; + case NEON_FMAXP_h_scalar: + case NEON_FMAXP_scalar: + fmaxp(vf, rd, rn); + break; + case NEON_FMAXNMP_h_scalar: + case NEON_FMAXNMP_scalar: + fmaxnmp(vf, rd, rn); + break; + case NEON_FMINP_h_scalar: + case NEON_FMINP_scalar: + fminp(vf, rd, rn); + break; + case NEON_FMINNMP_h_scalar: + case NEON_FMINNMP_scalar: + fminnmp(vf, rd, rn); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONScalarShiftImmediate(const Instruction* instr) { + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + static const NEONFormatMap map = {{22, 21, 20, 19}, + {NF_UNDEF, + NF_B, + NF_H, + NF_H, + NF_S, + NF_S, + NF_S, + NF_S, + NF_D, + NF_D, + NF_D, + NF_D, + NF_D, + NF_D, + NF_D, + NF_D}}; + NEONFormatDecoder nfd(instr, &map); + VectorFormat vf = nfd.GetVectorFormat(); + + int highest_set_bit = HighestSetBitPosition(instr->GetImmNEONImmh()); + int immh_immb = instr->GetImmNEONImmhImmb(); + int right_shift = (16 << highest_set_bit) - immh_immb; + int left_shift = immh_immb - (8 << highest_set_bit); + switch (instr->Mask(NEONScalarShiftImmediateMask)) { + case NEON_SHL_scalar: + shl(vf, rd, rn, left_shift); + break; + case NEON_SLI_scalar: + sli(vf, rd, rn, left_shift); + break; + case NEON_SQSHL_imm_scalar: + sqshl(vf, rd, rn, left_shift); + break; + case NEON_UQSHL_imm_scalar: + uqshl(vf, rd, rn, left_shift); + break; + case NEON_SQSHLU_scalar: + sqshlu(vf, rd, rn, left_shift); + break; + case NEON_SRI_scalar: + sri(vf, rd, rn, right_shift); + break; + case NEON_SSHR_scalar: + sshr(vf, rd, rn, right_shift); + break; + case NEON_USHR_scalar: + ushr(vf, rd, rn, right_shift); + break; + case NEON_SRSHR_scalar: + sshr(vf, rd, rn, right_shift).Round(vf); + break; + case NEON_URSHR_scalar: + ushr(vf, rd, rn, right_shift).Round(vf); + break; + case NEON_SSRA_scalar: + ssra(vf, rd, rn, right_shift); + break; + case NEON_USRA_scalar: + usra(vf, rd, rn, right_shift); + break; + case NEON_SRSRA_scalar: + srsra(vf, rd, rn, right_shift); + break; + case NEON_URSRA_scalar: + ursra(vf, rd, rn, right_shift); + break; + case NEON_UQSHRN_scalar: + uqshrn(vf, rd, rn, right_shift); + break; + case NEON_UQRSHRN_scalar: + uqrshrn(vf, rd, rn, right_shift); + break; + case NEON_SQSHRN_scalar: + sqshrn(vf, rd, rn, right_shift); + break; + case NEON_SQRSHRN_scalar: + sqrshrn(vf, rd, rn, right_shift); + break; + case NEON_SQSHRUN_scalar: + sqshrun(vf, rd, rn, right_shift); + break; + case NEON_SQRSHRUN_scalar: + sqrshrun(vf, rd, rn, right_shift); + break; + case NEON_FCVTZS_imm_scalar: + fcvts(vf, rd, rn, FPZero, right_shift); + break; + case NEON_FCVTZU_imm_scalar: + fcvtu(vf, rd, rn, FPZero, right_shift); + break; + case NEON_SCVTF_imm_scalar: + scvtf(vf, rd, rn, right_shift, fpcr_rounding); + break; + case NEON_UCVTF_imm_scalar: + ucvtf(vf, rd, rn, right_shift, fpcr_rounding); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONShiftImmediate(const Instruction* instr) { + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + // 00010->8B, 00011->16B, 001x0->4H, 001x1->8H, + // 01xx0->2S, 01xx1->4S, 1xxx1->2D, all others undefined. + static const NEONFormatMap map = {{22, 21, 20, 19, 30}, + {NF_UNDEF, NF_UNDEF, NF_8B, NF_16B, + NF_4H, NF_8H, NF_4H, NF_8H, + NF_2S, NF_4S, NF_2S, NF_4S, + NF_2S, NF_4S, NF_2S, NF_4S, + NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, + NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, + NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, + NF_UNDEF, NF_2D, NF_UNDEF, NF_2D}}; + NEONFormatDecoder nfd(instr, &map); + VectorFormat vf = nfd.GetVectorFormat(); + + // 0001->8H, 001x->4S, 01xx->2D, all others undefined. + static const NEONFormatMap map_l = + {{22, 21, 20, 19}, + {NF_UNDEF, NF_8H, NF_4S, NF_4S, NF_2D, NF_2D, NF_2D, NF_2D}}; + VectorFormat vf_l = nfd.GetVectorFormat(&map_l); + + int highest_set_bit = HighestSetBitPosition(instr->GetImmNEONImmh()); + int immh_immb = instr->GetImmNEONImmhImmb(); + int right_shift = (16 << highest_set_bit) - immh_immb; + int left_shift = immh_immb - (8 << highest_set_bit); + + switch (instr->Mask(NEONShiftImmediateMask)) { + case NEON_SHL: + shl(vf, rd, rn, left_shift); + break; + case NEON_SLI: + sli(vf, rd, rn, left_shift); + break; + case NEON_SQSHLU: + sqshlu(vf, rd, rn, left_shift); + break; + case NEON_SRI: + sri(vf, rd, rn, right_shift); + break; + case NEON_SSHR: + sshr(vf, rd, rn, right_shift); + break; + case NEON_USHR: + ushr(vf, rd, rn, right_shift); + break; + case NEON_SRSHR: + sshr(vf, rd, rn, right_shift).Round(vf); + break; + case NEON_URSHR: + ushr(vf, rd, rn, right_shift).Round(vf); + break; + case NEON_SSRA: + ssra(vf, rd, rn, right_shift); + break; + case NEON_USRA: + usra(vf, rd, rn, right_shift); + break; + case NEON_SRSRA: + srsra(vf, rd, rn, right_shift); + break; + case NEON_URSRA: + ursra(vf, rd, rn, right_shift); + break; + case NEON_SQSHL_imm: + sqshl(vf, rd, rn, left_shift); + break; + case NEON_UQSHL_imm: + uqshl(vf, rd, rn, left_shift); + break; + case NEON_SCVTF_imm: + scvtf(vf, rd, rn, right_shift, fpcr_rounding); + break; + case NEON_UCVTF_imm: + ucvtf(vf, rd, rn, right_shift, fpcr_rounding); + break; + case NEON_FCVTZS_imm: + fcvts(vf, rd, rn, FPZero, right_shift); + break; + case NEON_FCVTZU_imm: + fcvtu(vf, rd, rn, FPZero, right_shift); + break; + case NEON_SSHLL: + vf = vf_l; + if (instr->Mask(NEON_Q)) { + sshll2(vf, rd, rn, left_shift); + } else { + sshll(vf, rd, rn, left_shift); + } + break; + case NEON_USHLL: + vf = vf_l; + if (instr->Mask(NEON_Q)) { + ushll2(vf, rd, rn, left_shift); + } else { + ushll(vf, rd, rn, left_shift); + } + break; + case NEON_SHRN: + if (instr->Mask(NEON_Q)) { + shrn2(vf, rd, rn, right_shift); + } else { + shrn(vf, rd, rn, right_shift); + } + break; + case NEON_RSHRN: + if (instr->Mask(NEON_Q)) { + rshrn2(vf, rd, rn, right_shift); + } else { + rshrn(vf, rd, rn, right_shift); + } + break; + case NEON_UQSHRN: + if (instr->Mask(NEON_Q)) { + uqshrn2(vf, rd, rn, right_shift); + } else { + uqshrn(vf, rd, rn, right_shift); + } + break; + case NEON_UQRSHRN: + if (instr->Mask(NEON_Q)) { + uqrshrn2(vf, rd, rn, right_shift); + } else { + uqrshrn(vf, rd, rn, right_shift); + } + break; + case NEON_SQSHRN: + if (instr->Mask(NEON_Q)) { + sqshrn2(vf, rd, rn, right_shift); + } else { + sqshrn(vf, rd, rn, right_shift); + } + break; + case NEON_SQRSHRN: + if (instr->Mask(NEON_Q)) { + sqrshrn2(vf, rd, rn, right_shift); + } else { + sqrshrn(vf, rd, rn, right_shift); + } + break; + case NEON_SQSHRUN: + if (instr->Mask(NEON_Q)) { + sqshrun2(vf, rd, rn, right_shift); + } else { + sqshrun(vf, rd, rn, right_shift); + } + break; + case NEON_SQRSHRUN: + if (instr->Mask(NEON_Q)) { + sqrshrun2(vf, rd, rn, right_shift); + } else { + sqrshrun(vf, rd, rn, right_shift); + } + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONTable(const Instruction* instr) { + NEONFormatDecoder nfd(instr, NEONFormatDecoder::LogicalFormatMap()); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rn2 = ReadVRegister((instr->GetRn() + 1) % kNumberOfVRegisters); + SimVRegister& rn3 = ReadVRegister((instr->GetRn() + 2) % kNumberOfVRegisters); + SimVRegister& rn4 = ReadVRegister((instr->GetRn() + 3) % kNumberOfVRegisters); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(NEONTableMask)) { + case NEON_TBL_1v: + tbl(vf, rd, rn, rm); + break; + case NEON_TBL_2v: + tbl(vf, rd, rn, rn2, rm); + break; + case NEON_TBL_3v: + tbl(vf, rd, rn, rn2, rn3, rm); + break; + case NEON_TBL_4v: + tbl(vf, rd, rn, rn2, rn3, rn4, rm); + break; + case NEON_TBX_1v: + tbx(vf, rd, rn, rm); + break; + case NEON_TBX_2v: + tbx(vf, rd, rn, rn2, rm); + break; + case NEON_TBX_3v: + tbx(vf, rd, rn, rn2, rn3, rm); + break; + case NEON_TBX_4v: + tbx(vf, rd, rn, rn2, rn3, rn4, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + + +void Simulator::VisitNEONPerm(const Instruction* instr) { + NEONFormatDecoder nfd(instr); + VectorFormat vf = nfd.GetVectorFormat(); + + SimVRegister& rd = ReadVRegister(instr->GetRd()); + SimVRegister& rn = ReadVRegister(instr->GetRn()); + SimVRegister& rm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(NEONPermMask)) { + case NEON_TRN1: + trn1(vf, rd, rn, rm); + break; + case NEON_TRN2: + trn2(vf, rd, rn, rm); + break; + case NEON_UZP1: + uzp1(vf, rd, rn, rm); + break; + case NEON_UZP2: + uzp2(vf, rd, rn, rm); + break; + case NEON_ZIP1: + zip1(vf, rd, rn, rm); + break; + case NEON_ZIP2: + zip2(vf, rd, rn, rm); + break; + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::VisitSVEAddressGeneration(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister temp; + + VectorFormat vform = kFormatVnD; + mov(vform, temp, zm); + + switch (instr->Mask(SVEAddressGenerationMask)) { + case ADR_z_az_d_s32_scaled: + sxt(vform, temp, temp, kSRegSize); + break; + case ADR_z_az_d_u32_scaled: + uxt(vform, temp, temp, kSRegSize); + break; + case ADR_z_az_s_same_scaled: + vform = kFormatVnS; + break; + case ADR_z_az_d_same_scaled: + // Nothing to do. + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + int shift_amount = instr->ExtractBits(11, 10); + shl(vform, temp, temp, shift_amount); + add(vform, zd, zn, temp); +} + +void Simulator::VisitSVEBitwiseLogicalWithImm_Unpredicated( + const Instruction* instr) { + Instr op = instr->Mask(SVEBitwiseLogicalWithImm_UnpredicatedMask); + switch (op) { + case AND_z_zi: + case EOR_z_zi: + case ORR_z_zi: { + int lane_size = instr->GetSVEBitwiseImmLaneSizeInBytesLog2(); + uint64_t imm = instr->GetSVEImmLogical(); + // Valid immediate is a non-zero bits + VIXL_ASSERT(imm != 0); + SVEBitwiseImmHelper(static_cast( + op), + SVEFormatFromLaneSizeInBytesLog2(lane_size), + ReadVRegister(instr->GetRd()), + imm); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEBroadcastBitmaskImm(const Instruction* instr) { + switch (instr->Mask(SVEBroadcastBitmaskImmMask)) { + case DUPM_z_i: { + /* DUPM uses the same lane size and immediate encoding as bitwise logical + * immediate instructions. */ + int lane_size = instr->GetSVEBitwiseImmLaneSizeInBytesLog2(); + uint64_t imm = instr->GetSVEImmLogical(); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + dup_immediate(vform, ReadVRegister(instr->GetRd()), imm); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEBitwiseLogicalUnpredicated(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + Instr op = instr->Mask(SVEBitwiseLogicalUnpredicatedMask); + + LogicalOp logical_op = LogicalOpMask; + switch (op) { + case AND_z_zz: + logical_op = AND; + break; + case BIC_z_zz: + logical_op = BIC; + break; + case EOR_z_zz: + logical_op = EOR; + break; + case ORR_z_zz: + logical_op = ORR; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + // Lane size of registers is irrelevant to the bitwise operations, so perform + // the operation on D-sized lanes. + SVEBitwiseLogicalUnpredicatedHelper(logical_op, kFormatVnD, zd, zn, zm); +} + +void Simulator::VisitSVEBitwiseShiftByImm_Predicated(const Instruction* instr) { + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + SimVRegister scratch; + SimVRegister result; + + bool for_division = false; + Shift shift_op = NO_SHIFT; + switch (instr->Mask(SVEBitwiseShiftByImm_PredicatedMask)) { + case ASRD_z_p_zi: + shift_op = ASR; + for_division = true; + break; + case ASR_z_p_zi: + shift_op = ASR; + break; + case LSL_z_p_zi: + shift_op = LSL; + break; + case LSR_z_p_zi: + shift_op = LSR; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ true); + unsigned lane_size = shift_and_lane_size.second; + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int shift_dist = shift_and_lane_size.first; + + if ((shift_op == ASR) && for_division) { + asrd(vform, result, zdn, shift_dist); + } else { + if (shift_op == LSL) { + // Shift distance is computed differently for LSL. Convert the result. + shift_dist = (8 << lane_size) - shift_dist; + } + dup_immediate(vform, scratch, shift_dist); + SVEBitwiseShiftHelper(shift_op, vform, result, zdn, scratch, false); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEBitwiseShiftByVector_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + // SVE uses the whole (saturated) lane for the shift amount. + bool shift_in_ls_byte = false; + + switch (form_hash_) { + case "asrr_z_p_zz"_h: + sshr(vform, result, zm, zdn); + break; + case "asr_z_p_zz"_h: + sshr(vform, result, zdn, zm); + break; + case "lslr_z_p_zz"_h: + sshl(vform, result, zm, zdn, shift_in_ls_byte); + break; + case "lsl_z_p_zz"_h: + sshl(vform, result, zdn, zm, shift_in_ls_byte); + break; + case "lsrr_z_p_zz"_h: + ushr(vform, result, zm, zdn); + break; + case "lsr_z_p_zz"_h: + ushr(vform, result, zdn, zm); + break; + case "sqrshl_z_p_zz"_h: + sshl(vform, result, zdn, zm, shift_in_ls_byte) + .Round(vform) + .SignedSaturate(vform); + break; + case "sqrshlr_z_p_zz"_h: + sshl(vform, result, zm, zdn, shift_in_ls_byte) + .Round(vform) + .SignedSaturate(vform); + break; + case "sqshl_z_p_zz"_h: + sshl(vform, result, zdn, zm, shift_in_ls_byte).SignedSaturate(vform); + break; + case "sqshlr_z_p_zz"_h: + sshl(vform, result, zm, zdn, shift_in_ls_byte).SignedSaturate(vform); + break; + case "srshl_z_p_zz"_h: + sshl(vform, result, zdn, zm, shift_in_ls_byte).Round(vform); + break; + case "srshlr_z_p_zz"_h: + sshl(vform, result, zm, zdn, shift_in_ls_byte).Round(vform); + break; + case "uqrshl_z_p_zz"_h: + ushl(vform, result, zdn, zm, shift_in_ls_byte) + .Round(vform) + .UnsignedSaturate(vform); + break; + case "uqrshlr_z_p_zz"_h: + ushl(vform, result, zm, zdn, shift_in_ls_byte) + .Round(vform) + .UnsignedSaturate(vform); + break; + case "uqshl_z_p_zz"_h: + ushl(vform, result, zdn, zm, shift_in_ls_byte).UnsignedSaturate(vform); + break; + case "uqshlr_z_p_zz"_h: + ushl(vform, result, zm, zdn, shift_in_ls_byte).UnsignedSaturate(vform); + break; + case "urshl_z_p_zz"_h: + ushl(vform, result, zdn, zm, shift_in_ls_byte).Round(vform); + break; + case "urshlr_z_p_zz"_h: + ushl(vform, result, zm, zdn, shift_in_ls_byte).Round(vform); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEBitwiseShiftByWideElements_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + SimVRegister result; + Shift shift_op = ASR; + + switch (instr->Mask(SVEBitwiseShiftByWideElements_PredicatedMask)) { + case ASR_z_p_zw: + break; + case LSL_z_p_zw: + shift_op = LSL; + break; + case LSR_z_p_zw: + shift_op = LSR; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + SVEBitwiseShiftHelper(shift_op, + vform, + result, + zdn, + zm, + /* is_wide_elements = */ true); + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEBitwiseShiftUnpredicated(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + + Shift shift_op = NO_SHIFT; + switch (instr->Mask(SVEBitwiseShiftUnpredicatedMask)) { + case ASR_z_zi: + case ASR_z_zw: + shift_op = ASR; + break; + case LSL_z_zi: + case LSL_z_zw: + shift_op = LSL; + break; + case LSR_z_zi: + case LSR_z_zw: + shift_op = LSR; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + switch (instr->Mask(SVEBitwiseShiftUnpredicatedMask)) { + case ASR_z_zi: + case LSL_z_zi: + case LSR_z_zi: { + SimVRegister scratch; + std::pair shift_and_lane_size = + instr->GetSVEImmShiftAndLaneSizeLog2(/* is_predicated = */ false); + unsigned lane_size = shift_and_lane_size.second; + VIXL_ASSERT(lane_size <= kDRegSizeInBytesLog2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(lane_size); + int shift_dist = shift_and_lane_size.first; + if (shift_op == LSL) { + // Shift distance is computed differently for LSL. Convert the result. + shift_dist = (8 << lane_size) - shift_dist; + } + dup_immediate(vform, scratch, shift_dist); + SVEBitwiseShiftHelper(shift_op, vform, zd, zn, scratch, false); + break; + } + case ASR_z_zw: + case LSL_z_zw: + case LSR_z_zw: + SVEBitwiseShiftHelper(shift_op, + instr->GetSVEVectorFormat(), + zd, + zn, + ReadVRegister(instr->GetRm()), + true); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEIncDecRegisterByElementCount(const Instruction* instr) { + // Although the instructions have a separate encoding class, the lane size is + // encoded in the same way as most other SVE instructions. + VectorFormat vform = instr->GetSVEVectorFormat(); + + int pattern = instr->GetImmSVEPredicateConstraint(); + int count = GetPredicateConstraintLaneCount(vform, pattern); + int multiplier = instr->ExtractBits(19, 16) + 1; + + switch (instr->Mask(SVEIncDecRegisterByElementCountMask)) { + case DECB_r_rs: + case DECD_r_rs: + case DECH_r_rs: + case DECW_r_rs: + count = -count; + break; + case INCB_r_rs: + case INCD_r_rs: + case INCH_r_rs: + case INCW_r_rs: + // Nothing to do. + break; + default: + VIXL_UNIMPLEMENTED(); + return; + } + + WriteXRegister(instr->GetRd(), + IncDecN(ReadXRegister(instr->GetRd()), + count * multiplier, + kXRegSize)); +} + +void Simulator::VisitSVEIncDecVectorByElementCount(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + if (LaneSizeInBitsFromFormat(vform) == kBRegSize) { + VIXL_UNIMPLEMENTED(); + } + + int pattern = instr->GetImmSVEPredicateConstraint(); + int count = GetPredicateConstraintLaneCount(vform, pattern); + int multiplier = instr->ExtractBits(19, 16) + 1; + + switch (instr->Mask(SVEIncDecVectorByElementCountMask)) { + case DECD_z_zs: + case DECH_z_zs: + case DECW_z_zs: + count = -count; + break; + case INCD_z_zs: + case INCH_z_zs: + case INCW_z_zs: + // Nothing to do. + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister scratch; + dup_immediate(vform, + scratch, + IncDecN(0, + count * multiplier, + LaneSizeInBitsFromFormat(vform))); + add(vform, zd, zd, scratch); +} + +void Simulator::VisitSVESaturatingIncDecRegisterByElementCount( + const Instruction* instr) { + // Although the instructions have a separate encoding class, the lane size is + // encoded in the same way as most other SVE instructions. + VectorFormat vform = instr->GetSVEVectorFormat(); + + int pattern = instr->GetImmSVEPredicateConstraint(); + int count = GetPredicateConstraintLaneCount(vform, pattern); + int multiplier = instr->ExtractBits(19, 16) + 1; + + unsigned width = kXRegSize; + bool is_signed = false; + + switch (instr->Mask(SVESaturatingIncDecRegisterByElementCountMask)) { + case SQDECB_r_rs_sx: + case SQDECD_r_rs_sx: + case SQDECH_r_rs_sx: + case SQDECW_r_rs_sx: + width = kWRegSize; + VIXL_FALLTHROUGH(); + case SQDECB_r_rs_x: + case SQDECD_r_rs_x: + case SQDECH_r_rs_x: + case SQDECW_r_rs_x: + is_signed = true; + count = -count; + break; + case SQINCB_r_rs_sx: + case SQINCD_r_rs_sx: + case SQINCH_r_rs_sx: + case SQINCW_r_rs_sx: + width = kWRegSize; + VIXL_FALLTHROUGH(); + case SQINCB_r_rs_x: + case SQINCD_r_rs_x: + case SQINCH_r_rs_x: + case SQINCW_r_rs_x: + is_signed = true; + break; + case UQDECB_r_rs_uw: + case UQDECD_r_rs_uw: + case UQDECH_r_rs_uw: + case UQDECW_r_rs_uw: + width = kWRegSize; + VIXL_FALLTHROUGH(); + case UQDECB_r_rs_x: + case UQDECD_r_rs_x: + case UQDECH_r_rs_x: + case UQDECW_r_rs_x: + count = -count; + break; + case UQINCB_r_rs_uw: + case UQINCD_r_rs_uw: + case UQINCH_r_rs_uw: + case UQINCW_r_rs_uw: + width = kWRegSize; + VIXL_FALLTHROUGH(); + case UQINCB_r_rs_x: + case UQINCD_r_rs_x: + case UQINCH_r_rs_x: + case UQINCW_r_rs_x: + // Nothing to do. + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + WriteXRegister(instr->GetRd(), + IncDecN(ReadXRegister(instr->GetRd()), + count * multiplier, + width, + true, + is_signed)); +} + +void Simulator::VisitSVESaturatingIncDecVectorByElementCount( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + if (LaneSizeInBitsFromFormat(vform) == kBRegSize) { + VIXL_UNIMPLEMENTED(); + } + + int pattern = instr->GetImmSVEPredicateConstraint(); + int count = GetPredicateConstraintLaneCount(vform, pattern); + int multiplier = instr->ExtractBits(19, 16) + 1; + + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister scratch; + dup_immediate(vform, + scratch, + IncDecN(0, + count * multiplier, + LaneSizeInBitsFromFormat(vform))); + + switch (instr->Mask(SVESaturatingIncDecVectorByElementCountMask)) { + case SQDECD_z_zs: + case SQDECH_z_zs: + case SQDECW_z_zs: + sub(vform, zd, zd, scratch).SignedSaturate(vform); + break; + case SQINCD_z_zs: + case SQINCH_z_zs: + case SQINCW_z_zs: + add(vform, zd, zd, scratch).SignedSaturate(vform); + break; + case UQDECD_z_zs: + case UQDECH_z_zs: + case UQDECW_z_zs: + sub(vform, zd, zd, scratch).UnsignedSaturate(vform); + break; + case UQINCD_z_zs: + case UQINCH_z_zs: + case UQINCW_z_zs: + add(vform, zd, zd, scratch).UnsignedSaturate(vform); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEElementCount(const Instruction* instr) { + switch (instr->Mask(SVEElementCountMask)) { + case CNTB_r_s: + case CNTD_r_s: + case CNTH_r_s: + case CNTW_r_s: + // All handled below. + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + // Although the instructions are separated, the lane size is encoded in the + // same way as most other SVE instructions. + VectorFormat vform = instr->GetSVEVectorFormat(); + + int pattern = instr->GetImmSVEPredicateConstraint(); + int count = GetPredicateConstraintLaneCount(vform, pattern); + int multiplier = instr->ExtractBits(19, 16) + 1; + WriteXRegister(instr->GetRd(), count * multiplier); +} + +void Simulator::VisitSVEFPAccumulatingReduction(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& vdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPAccumulatingReductionMask)) { + case FADDA_v_p_z: + fadda(vform, vdn, pg, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEFPArithmetic_Predicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + SimVRegister result; + switch (instr->Mask(SVEFPArithmetic_PredicatedMask)) { + case FABD_z_p_zz: + fabd(vform, result, zdn, zm); + break; + case FADD_z_p_zz: + fadd(vform, result, zdn, zm); + break; + case FDIVR_z_p_zz: + fdiv(vform, result, zm, zdn); + break; + case FDIV_z_p_zz: + fdiv(vform, result, zdn, zm); + break; + case FMAXNM_z_p_zz: + fmaxnm(vform, result, zdn, zm); + break; + case FMAX_z_p_zz: + fmax(vform, result, zdn, zm); + break; + case FMINNM_z_p_zz: + fminnm(vform, result, zdn, zm); + break; + case FMIN_z_p_zz: + fmin(vform, result, zdn, zm); + break; + case FMULX_z_p_zz: + fmulx(vform, result, zdn, zm); + break; + case FMUL_z_p_zz: + fmul(vform, result, zdn, zm); + break; + case FSCALE_z_p_zz: + fscale(vform, result, zdn, zm); + break; + case FSUBR_z_p_zz: + fsub(vform, result, zm, zdn); + break; + case FSUB_z_p_zz: + fsub(vform, result, zdn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEFPArithmeticWithImm_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + if (LaneSizeInBitsFromFormat(vform) == kBRegSize) { + VIXL_UNIMPLEMENTED(); + } + + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + int i1 = instr->ExtractBit(5); + SimVRegister add_sub_imm, min_max_imm, mul_imm; + uint64_t half = FPToRawbitsWithSize(LaneSizeInBitsFromFormat(vform), 0.5); + uint64_t one = FPToRawbitsWithSize(LaneSizeInBitsFromFormat(vform), 1.0); + uint64_t two = FPToRawbitsWithSize(LaneSizeInBitsFromFormat(vform), 2.0); + dup_immediate(vform, add_sub_imm, i1 ? one : half); + dup_immediate(vform, min_max_imm, i1 ? one : 0); + dup_immediate(vform, mul_imm, i1 ? two : half); + + switch (instr->Mask(SVEFPArithmeticWithImm_PredicatedMask)) { + case FADD_z_p_zs: + fadd(vform, result, zdn, add_sub_imm); + break; + case FMAXNM_z_p_zs: + fmaxnm(vform, result, zdn, min_max_imm); + break; + case FMAX_z_p_zs: + fmax(vform, result, zdn, min_max_imm); + break; + case FMINNM_z_p_zs: + fminnm(vform, result, zdn, min_max_imm); + break; + case FMIN_z_p_zs: + fmin(vform, result, zdn, min_max_imm); + break; + case FMUL_z_p_zs: + fmul(vform, result, zdn, mul_imm); + break; + case FSUBR_z_p_zs: + fsub(vform, result, add_sub_imm, zdn); + break; + case FSUB_z_p_zs: + fsub(vform, result, zdn, add_sub_imm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEFPTrigMulAddCoefficient(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPTrigMulAddCoefficientMask)) { + case FTMAD_z_zzi: + ftmad(vform, zd, zd, zm, instr->ExtractBits(18, 16)); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEFPArithmeticUnpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPArithmeticUnpredicatedMask)) { + case FADD_z_zz: + fadd(vform, zd, zn, zm); + break; + case FMUL_z_zz: + fmul(vform, zd, zn, zm); + break; + case FRECPS_z_zz: + frecps(vform, zd, zn, zm); + break; + case FRSQRTS_z_zz: + frsqrts(vform, zd, zn, zm); + break; + case FSUB_z_zz: + fsub(vform, zd, zn, zm); + break; + case FTSMUL_z_zz: + ftsmul(vform, zd, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEFPCompareVectors(const Instruction* instr) { + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister result; + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPCompareVectorsMask)) { + case FACGE_p_p_zz: + fabscmp(vform, result, zn, zm, ge); + break; + case FACGT_p_p_zz: + fabscmp(vform, result, zn, zm, gt); + break; + case FCMEQ_p_p_zz: + fcmp(vform, result, zn, zm, eq); + break; + case FCMGE_p_p_zz: + fcmp(vform, result, zn, zm, ge); + break; + case FCMGT_p_p_zz: + fcmp(vform, result, zn, zm, gt); + break; + case FCMNE_p_p_zz: + fcmp(vform, result, zn, zm, ne); + break; + case FCMUO_p_p_zz: + fcmp(vform, result, zn, zm, uo); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + ExtractFromSimVRegister(vform, pd, result); + mov_zeroing(pd, pg, pd); +} + +void Simulator::VisitSVEFPCompareWithZero(const Instruction* instr) { + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = instr->GetSVEVectorFormat(); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + SimVRegister result; + SimVRegister zeros; + dup_immediate(kFormatVnD, zeros, 0); + + switch (instr->Mask(SVEFPCompareWithZeroMask)) { + case FCMEQ_p_p_z0: + fcmp(vform, result, zn, zeros, eq); + break; + case FCMGE_p_p_z0: + fcmp(vform, result, zn, zeros, ge); + break; + case FCMGT_p_p_z0: + fcmp(vform, result, zn, zeros, gt); + break; + case FCMLE_p_p_z0: + fcmp(vform, result, zn, zeros, le); + break; + case FCMLT_p_p_z0: + fcmp(vform, result, zn, zeros, lt); + break; + case FCMNE_p_p_z0: + fcmp(vform, result, zn, zeros, ne); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + ExtractFromSimVRegister(vform, pd, result); + mov_zeroing(pd, pg, pd); +} + +void Simulator::VisitSVEFPComplexAddition(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + + if (LaneSizeInBitsFromFormat(vform) == kBRegSize) { + VIXL_UNIMPLEMENTED(); + } + + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + int rot = instr->ExtractBit(16); + + SimVRegister result; + + switch (instr->Mask(SVEFPComplexAdditionMask)) { + case FCADD_z_p_zz: + fcadd(vform, result, zdn, zm, rot); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEFPComplexMulAdd(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + + if (LaneSizeInBitsFromFormat(vform) == kBRegSize) { + VIXL_UNIMPLEMENTED(); + } + + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + int rot = instr->ExtractBits(14, 13); + + SimVRegister result; + + switch (instr->Mask(SVEFPComplexMulAddMask)) { + case FCMLA_z_p_zzz: + fcmla(vform, result, zn, zm, zda, rot); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zda, pg, result); +} + +void Simulator::VisitSVEFPComplexMulAddIndex(const Instruction* instr) { + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + int rot = instr->ExtractBits(11, 10); + unsigned zm_code = instr->GetRm(); + int index = -1; + VectorFormat vform, vform_dup; + + switch (instr->Mask(SVEFPComplexMulAddIndexMask)) { + case FCMLA_z_zzzi_h: + vform = kFormatVnH; + vform_dup = kFormatVnS; + index = zm_code >> 3; + zm_code &= 0x7; + break; + case FCMLA_z_zzzi_s: + vform = kFormatVnS; + vform_dup = kFormatVnD; + index = zm_code >> 4; + zm_code &= 0xf; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + if (index >= 0) { + SimVRegister temp; + dup_elements_to_segments(vform_dup, temp, ReadVRegister(zm_code), index); + fcmla(vform, zda, zn, temp, zda, rot); + } +} + +typedef LogicVRegister (Simulator::*FastReduceFn)(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + +void Simulator::VisitSVEFPFastReduction(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& vd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + int lane_size = LaneSizeInBitsFromFormat(vform); + + uint64_t inactive_value = 0; + FastReduceFn fn = nullptr; + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPFastReductionMask)) { + case FADDV_v_p_z: + fn = &Simulator::faddv; + break; + case FMAXNMV_v_p_z: + inactive_value = FPToRawbitsWithSize(lane_size, kFP64DefaultNaN); + fn = &Simulator::fmaxnmv; + break; + case FMAXV_v_p_z: + inactive_value = FPToRawbitsWithSize(lane_size, kFP64NegativeInfinity); + fn = &Simulator::fmaxv; + break; + case FMINNMV_v_p_z: + inactive_value = FPToRawbitsWithSize(lane_size, kFP64DefaultNaN); + fn = &Simulator::fminnmv; + break; + case FMINV_v_p_z: + inactive_value = FPToRawbitsWithSize(lane_size, kFP64PositiveInfinity); + fn = &Simulator::fminv; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SimVRegister scratch; + dup_immediate(vform, scratch, inactive_value); + mov_merging(vform, scratch, pg, zn); + if (fn != nullptr) (this->*fn)(vform, vd, scratch); +} + +void Simulator::VisitSVEFPMulIndex(const Instruction* instr) { + VectorFormat vform = kFormatUndefined; + + switch (instr->Mask(SVEFPMulIndexMask)) { + case FMUL_z_zzi_d: + vform = kFormatVnD; + break; + case FMUL_z_zzi_h_i3h: + case FMUL_z_zzi_h: + vform = kFormatVnH; + break; + case FMUL_z_zzi_s: + vform = kFormatVnS; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister temp; + + dup_elements_to_segments(vform, temp, instr->GetSVEMulZmAndIndex()); + fmul(vform, zd, zn, temp); +} + +void Simulator::VisitSVEFPMulAdd(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + if (instr->ExtractBit(15) == 0) { + // Floating-point multiply-accumulate writing addend. + SimVRegister& zm = ReadVRegister(instr->GetRm()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + + switch (instr->Mask(SVEFPMulAddMask)) { + // zda = zda + zn * zm + case FMLA_z_p_zzz: + fmla(vform, result, zd, zn, zm); + break; + // zda = -zda + -zn * zm + case FNMLA_z_p_zzz: + fneg(vform, result, zd); + fmls(vform, result, result, zn, zm); break; - case NEON_SQRSHL: - sshl(vf, rd, rn, rm).Round(vf).SignedSaturate(vf); + // zda = zda + -zn * zm + case FMLS_z_p_zzz: + fmls(vform, result, zd, zn, zm); break; - case NEON_UHADD: - add(vf, rd, rn, rm).Uhalve(vf); + // zda = -zda + zn * zm + case FNMLS_z_p_zzz: + fneg(vform, result, zd); + fmla(vform, result, result, zn, zm); break; - case NEON_URHADD: - add(vf, rd, rn, rm).Uhalve(vf).Round(vf); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SHADD: - add(vf, rd, rn, rm).Halve(vf); + } + } else { + // Floating-point multiply-accumulate writing multiplicand. + SimVRegister& za = ReadVRegister(instr->GetRm()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + + switch (instr->Mask(SVEFPMulAddMask)) { + // zdn = za + zdn * zm + case FMAD_z_p_zzz: + fmla(vform, result, za, zd, zm); break; - case NEON_SRHADD: - add(vf, rd, rn, rm).Halve(vf).Round(vf); + // zdn = -za + -zdn * zm + case FNMAD_z_p_zzz: + fneg(vform, result, za); + fmls(vform, result, result, zd, zm); break; - case NEON_UHSUB: - sub(vf, rd, rn, rm).Uhalve(vf); + // zdn = za + -zdn * zm + case FMSB_z_p_zzz: + fmls(vform, result, za, zd, zm); break; - case NEON_SHSUB: - sub(vf, rd, rn, rm).Halve(vf); + // zdn = -za + zdn * zm + case FNMSB_z_p_zzz: + fneg(vform, result, za); + fmla(vform, result, result, zd, zm); break; default: VIXL_UNIMPLEMENTED(); + break; } } + + mov_merging(vform, zd, pg, result); } +void Simulator::VisitSVEFPMulAddIndex(const Instruction* instr) { + VectorFormat vform = kFormatUndefined; -void Simulator::VisitNEON3SameFP16(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + switch (instr->Mask(SVEFPMulAddIndexMask)) { + case FMLA_z_zzzi_d: + case FMLS_z_zzzi_d: + vform = kFormatVnD; + break; + case FMLA_z_zzzi_s: + case FMLS_z_zzzi_s: + vform = kFormatVnS; + break; + case FMLA_z_zzzi_h: + case FMLS_z_zzzi_h: + case FMLA_z_zzzi_h_i3h: + case FMLS_z_zzzi_h_i3h: + vform = kFormatVnH; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } - VectorFormat vf = nfd.GetVectorFormat(nfd.FP16FormatMap()); - switch (instr->Mask(NEON3SameFP16Mask)) { -#define SIM_FUNC(A, B) \ - case NEON_##A##_H: \ - B(vf, rd, rn, rm); \ - break; - SIM_FUNC(FMAXNM, fmaxnm); - SIM_FUNC(FMLA, fmla); - SIM_FUNC(FADD, fadd); - SIM_FUNC(FMULX, fmulx); - SIM_FUNC(FMAX, fmax); - SIM_FUNC(FRECPS, frecps); - SIM_FUNC(FMINNM, fminnm); - SIM_FUNC(FMLS, fmls); - SIM_FUNC(FSUB, fsub); - SIM_FUNC(FMIN, fmin); - SIM_FUNC(FRSQRTS, frsqrts); - SIM_FUNC(FMAXNMP, fmaxnmp); - SIM_FUNC(FADDP, faddp); - SIM_FUNC(FMUL, fmul); - SIM_FUNC(FMAXP, fmaxp); - SIM_FUNC(FDIV, fdiv); - SIM_FUNC(FMINNMP, fminnmp); - SIM_FUNC(FABD, fabd); - SIM_FUNC(FMINP, fminp); -#undef SIM_FUNC - case NEON_FCMEQ_H: - fcmp(vf, rd, rn, rm, eq); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister temp; + + dup_elements_to_segments(vform, temp, instr->GetSVEMulZmAndIndex()); + if (instr->ExtractBit(10) == 1) { + fmls(vform, zd, zd, zn, temp); + } else { + fmla(vform, zd, zd, zn, temp); + } +} + +void Simulator::VisitSVEFPConvertToInt(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + int dst_data_size; + int src_data_size; + + switch (instr->Mask(SVEFPConvertToIntMask)) { + case FCVTZS_z_p_z_d2w: + case FCVTZU_z_p_z_d2w: + dst_data_size = kSRegSize; + src_data_size = kDRegSize; break; - case NEON_FCMGE_H: - fcmp(vf, rd, rn, rm, ge); + case FCVTZS_z_p_z_d2x: + case FCVTZU_z_p_z_d2x: + dst_data_size = kDRegSize; + src_data_size = kDRegSize; break; - case NEON_FACGE_H: - fabscmp(vf, rd, rn, rm, ge); + case FCVTZS_z_p_z_fp162h: + case FCVTZU_z_p_z_fp162h: + dst_data_size = kHRegSize; + src_data_size = kHRegSize; + break; + case FCVTZS_z_p_z_fp162w: + case FCVTZU_z_p_z_fp162w: + dst_data_size = kSRegSize; + src_data_size = kHRegSize; + break; + case FCVTZS_z_p_z_fp162x: + case FCVTZU_z_p_z_fp162x: + dst_data_size = kDRegSize; + src_data_size = kHRegSize; + break; + case FCVTZS_z_p_z_s2w: + case FCVTZU_z_p_z_s2w: + dst_data_size = kSRegSize; + src_data_size = kSRegSize; + break; + case FCVTZS_z_p_z_s2x: + case FCVTZU_z_p_z_s2x: + dst_data_size = kDRegSize; + src_data_size = kSRegSize; + break; + default: + VIXL_UNIMPLEMENTED(); + dst_data_size = 0; + src_data_size = 0; + break; + } + + VectorFormat vform = + SVEFormatFromLaneSizeInBits(std::max(dst_data_size, src_data_size)); + + if (instr->ExtractBit(16) == 0) { + fcvts(vform, dst_data_size, src_data_size, zd, pg, zn, FPZero); + } else { + fcvtu(vform, dst_data_size, src_data_size, zd, pg, zn, FPZero); + } +} + +void Simulator::VisitSVEFPConvertPrecision(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat dst_data_size = kFormatUndefined; + VectorFormat src_data_size = kFormatUndefined; + + switch (instr->Mask(SVEFPConvertPrecisionMask)) { + case FCVT_z_p_z_d2h: + dst_data_size = kFormatVnH; + src_data_size = kFormatVnD; + break; + case FCVT_z_p_z_d2s: + dst_data_size = kFormatVnS; + src_data_size = kFormatVnD; + break; + case FCVT_z_p_z_h2d: + dst_data_size = kFormatVnD; + src_data_size = kFormatVnH; + break; + case FCVT_z_p_z_h2s: + dst_data_size = kFormatVnS; + src_data_size = kFormatVnH; + break; + case FCVT_z_p_z_s2d: + dst_data_size = kFormatVnD; + src_data_size = kFormatVnS; + break; + case FCVT_z_p_z_s2h: + dst_data_size = kFormatVnH; + src_data_size = kFormatVnS; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + fcvt(dst_data_size, src_data_size, zd, pg, zn); +} + +void Simulator::VisitSVEFPUnaryOp(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister result; + + switch (instr->Mask(SVEFPUnaryOpMask)) { + case FRECPX_z_p_z: + frecpx(vform, result, zn); + break; + case FSQRT_z_p_z: + fsqrt(vform, result, zn); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + mov_merging(vform, zd, pg, result); +} + +void Simulator::VisitSVEFPRoundToIntegralValue(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = instr->GetSVEVectorFormat(); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + bool exact_exception = false; + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPRoundToIntegralValueMask)) { + case FRINTA_z_p_z: + fpcr_rounding = FPTieAway; + break; + case FRINTI_z_p_z: + break; // Use FPCR rounding mode. + case FRINTM_z_p_z: + fpcr_rounding = FPNegativeInfinity; + break; + case FRINTN_z_p_z: + fpcr_rounding = FPTieEven; + break; + case FRINTP_z_p_z: + fpcr_rounding = FPPositiveInfinity; + break; + case FRINTX_z_p_z: + exact_exception = true; + break; + case FRINTZ_z_p_z: + fpcr_rounding = FPZero; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SimVRegister result; + frint(vform, result, zn, fpcr_rounding, exact_exception, kFrintToInteger); + mov_merging(vform, zd, pg, result); +} + +void Simulator::VisitSVEIntConvertToFP(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + int dst_data_size; + int src_data_size; + + switch (instr->Mask(SVEIntConvertToFPMask)) { + case SCVTF_z_p_z_h2fp16: + case UCVTF_z_p_z_h2fp16: + dst_data_size = kHRegSize; + src_data_size = kHRegSize; + break; + case SCVTF_z_p_z_w2d: + case UCVTF_z_p_z_w2d: + dst_data_size = kDRegSize; + src_data_size = kSRegSize; + break; + case SCVTF_z_p_z_w2fp16: + case UCVTF_z_p_z_w2fp16: + dst_data_size = kHRegSize; + src_data_size = kSRegSize; + break; + case SCVTF_z_p_z_w2s: + case UCVTF_z_p_z_w2s: + dst_data_size = kSRegSize; + src_data_size = kSRegSize; + break; + case SCVTF_z_p_z_x2d: + case UCVTF_z_p_z_x2d: + dst_data_size = kDRegSize; + src_data_size = kDRegSize; + break; + case SCVTF_z_p_z_x2fp16: + case UCVTF_z_p_z_x2fp16: + dst_data_size = kHRegSize; + src_data_size = kDRegSize; + break; + case SCVTF_z_p_z_x2s: + case UCVTF_z_p_z_x2s: + dst_data_size = kSRegSize; + src_data_size = kDRegSize; + break; + default: + VIXL_UNIMPLEMENTED(); + dst_data_size = 0; + src_data_size = 0; break; - case NEON_FCMGT_H: - fcmp(vf, rd, rn, rm, gt); + } + + VectorFormat vform = + SVEFormatFromLaneSizeInBits(std::max(dst_data_size, src_data_size)); + + if (instr->ExtractBit(16) == 0) { + scvtf(vform, dst_data_size, src_data_size, zd, pg, zn, fpcr_rounding); + } else { + ucvtf(vform, dst_data_size, src_data_size, zd, pg, zn, fpcr_rounding); + } +} + +void Simulator::VisitSVEFPUnaryOpUnpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + switch (instr->Mask(SVEFPUnaryOpUnpredicatedMask)) { + case FRECPE_z_z: + frecpe(vform, zd, zn, fpcr_rounding); break; - case NEON_FACGT_H: - fabscmp(vf, rd, rn, rm, gt); + case FRSQRTE_z_z: + frsqrte(vform, zd, zn); break; default: VIXL_UNIMPLEMENTED(); @@ -4723,32 +10860,62 @@ void Simulator::VisitNEON3SameFP16(const Instruction* instr) { } } -void Simulator::VisitNEON3SameExtra(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); - int rot = 0; - VectorFormat vf = nfd.GetVectorFormat(); - if (instr->Mask(NEON3SameExtraFCMLAMask) == NEON_FCMLA) { - rot = instr->GetImmRotFcmlaVec(); - fcmla(vf, rd, rn, rm, rot); - } else if (instr->Mask(NEON3SameExtraFCADDMask) == NEON_FCADD) { - rot = instr->GetImmRotFcadd(); - fcadd(vf, rd, rn, rm, rot); - } else { - switch (instr->Mask(NEON3SameExtraMask)) { - case NEON_SDOT: - sdot(vf, rd, rn, rm); +void Simulator::VisitSVEIncDecByPredicateCount(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(8, 5)); + + int count = CountActiveLanes(vform, pg); + + if (instr->ExtractBit(11) == 0) { + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + switch (instr->Mask(SVEIncDecByPredicateCountMask)) { + case DECP_z_p_z: + sub_uint(vform, zdn, zdn, count); + break; + case INCP_z_p_z: + add_uint(vform, zdn, zdn, count); + break; + case SQDECP_z_p_z: + sub_uint(vform, zdn, zdn, count).SignedSaturate(vform); + break; + case SQINCP_z_p_z: + add_uint(vform, zdn, zdn, count).SignedSaturate(vform); break; - case NEON_SQRDMLAH: - sqrdmlah(vf, rd, rn, rm); + case UQDECP_z_p_z: + sub_uint(vform, zdn, zdn, count).UnsignedSaturate(vform); break; - case NEON_UDOT: - udot(vf, rd, rn, rm); + case UQINCP_z_p_z: + add_uint(vform, zdn, zdn, count).UnsignedSaturate(vform); break; - case NEON_SQRDMLSH: - sqrdmlsh(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); + break; + } + } else { + bool is_saturating = (instr->ExtractBit(18) == 0); + bool decrement = + is_saturating ? instr->ExtractBit(17) : instr->ExtractBit(16); + bool is_signed = (instr->ExtractBit(16) == 0); + bool sf = is_saturating ? (instr->ExtractBit(10) != 0) : true; + unsigned width = sf ? kXRegSize : kWRegSize; + + switch (instr->Mask(SVEIncDecByPredicateCountMask)) { + case DECP_r_p_r: + case INCP_r_p_r: + case SQDECP_r_p_r_sx: + case SQDECP_r_p_r_x: + case SQINCP_r_p_r_sx: + case SQINCP_r_p_r_x: + case UQDECP_r_p_r_uw: + case UQDECP_r_p_r_x: + case UQINCP_r_p_r_uw: + case UQINCP_r_p_r_x: + WriteXRegister(instr->GetRd(), + IncDecN(ReadXRegister(instr->GetRd()), + decrement ? -count : count, + width, + is_saturating, + is_signed)); break; default: VIXL_UNIMPLEMENTED(); @@ -4757,1919 +10924,3105 @@ void Simulator::VisitNEON3SameExtra(const Instruction* instr) { } } +uint64_t Simulator::IncDecN(uint64_t acc, + int64_t delta, + unsigned n, + bool is_saturating, + bool is_signed) { + VIXL_ASSERT(n <= 64); + VIXL_ASSERT(IsIntN(n, delta)); -void Simulator::VisitNEON3Different(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - VectorFormat vf = nfd.GetVectorFormat(); - VectorFormat vf_l = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); + uint64_t sign_mask = UINT64_C(1) << (n - 1); + uint64_t mask = GetUintMask(n); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + acc &= mask; // Ignore initial accumulator high bits. + uint64_t result = (acc + delta) & mask; - switch (instr->Mask(NEON3DifferentMask)) { - case NEON_PMULL: - pmull(vf_l, rd, rn, rm); - break; - case NEON_PMULL2: - pmull2(vf_l, rd, rn, rm); - break; - case NEON_UADDL: - uaddl(vf_l, rd, rn, rm); - break; - case NEON_UADDL2: - uaddl2(vf_l, rd, rn, rm); - break; - case NEON_SADDL: - saddl(vf_l, rd, rn, rm); - break; - case NEON_SADDL2: - saddl2(vf_l, rd, rn, rm); - break; - case NEON_USUBL: - usubl(vf_l, rd, rn, rm); - break; - case NEON_USUBL2: - usubl2(vf_l, rd, rn, rm); - break; - case NEON_SSUBL: - ssubl(vf_l, rd, rn, rm); - break; - case NEON_SSUBL2: - ssubl2(vf_l, rd, rn, rm); - break; - case NEON_SABAL: - sabal(vf_l, rd, rn, rm); - break; - case NEON_SABAL2: - sabal2(vf_l, rd, rn, rm); - break; - case NEON_UABAL: - uabal(vf_l, rd, rn, rm); + bool result_negative = ((result & sign_mask) != 0); + + if (is_saturating) { + if (is_signed) { + bool acc_negative = ((acc & sign_mask) != 0); + bool delta_negative = delta < 0; + + // If the signs of the operands are the same, but different from the + // result, there was an overflow. + if ((acc_negative == delta_negative) && + (acc_negative != result_negative)) { + if (result_negative) { + // Saturate to [..., INT_MAX]. + result_negative = false; + result = mask & ~sign_mask; // E.g. 0x000000007fffffff + } else { + // Saturate to [INT_MIN, ...]. + result_negative = true; + result = ~mask | sign_mask; // E.g. 0xffffffff80000000 + } + } + } else { + if ((delta < 0) && (result > acc)) { + // Saturate to [0, ...]. + result = 0; + } else if ((delta > 0) && (result < acc)) { + // Saturate to [..., UINT_MAX]. + result = mask; + } + } + } + + // Sign-extend if necessary. + if (result_negative && is_signed) result |= ~mask; + + return result; +} + +void Simulator::VisitSVEIndexGeneration(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + switch (instr->Mask(SVEIndexGenerationMask)) { + case INDEX_z_ii: + case INDEX_z_ir: + case INDEX_z_ri: + case INDEX_z_rr: { + uint64_t start = instr->ExtractBit(10) ? ReadXRegister(instr->GetRn()) + : instr->ExtractSignedBits(9, 5); + uint64_t step = instr->ExtractBit(11) ? ReadXRegister(instr->GetRm()) + : instr->ExtractSignedBits(20, 16); + index(vform, zd, start, step); break; - case NEON_UABAL2: - uabal2(vf_l, rd, rn, rm); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SABDL: - sabdl(vf_l, rd, rn, rm); + } +} + +void Simulator::VisitSVEIntArithmeticUnpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + switch (instr->Mask(SVEIntArithmeticUnpredicatedMask)) { + case ADD_z_zz: + add(vform, zd, zn, zm); break; - case NEON_SABDL2: - sabdl2(vf_l, rd, rn, rm); + case SQADD_z_zz: + add(vform, zd, zn, zm).SignedSaturate(vform); break; - case NEON_UABDL: - uabdl(vf_l, rd, rn, rm); + case SQSUB_z_zz: + sub(vform, zd, zn, zm).SignedSaturate(vform); break; - case NEON_UABDL2: - uabdl2(vf_l, rd, rn, rm); + case SUB_z_zz: + sub(vform, zd, zn, zm); break; - case NEON_SMLAL: - smlal(vf_l, rd, rn, rm); + case UQADD_z_zz: + add(vform, zd, zn, zm).UnsignedSaturate(vform); break; - case NEON_SMLAL2: - smlal2(vf_l, rd, rn, rm); + case UQSUB_z_zz: + sub(vform, zd, zn, zm).UnsignedSaturate(vform); break; - case NEON_UMLAL: - umlal(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UMLAL2: - umlal2(vf_l, rd, rn, rm); + } +} + +void Simulator::VisitSVEIntAddSubtractVectors_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + switch (instr->Mask(SVEIntAddSubtractVectors_PredicatedMask)) { + case ADD_z_p_zz: + add(vform, result, zdn, zm); break; - case NEON_SMLSL: - smlsl(vf_l, rd, rn, rm); + case SUBR_z_p_zz: + sub(vform, result, zm, zdn); break; - case NEON_SMLSL2: - smlsl2(vf_l, rd, rn, rm); + case SUB_z_p_zz: + sub(vform, result, zdn, zm); break; - case NEON_UMLSL: - umlsl(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UMLSL2: - umlsl2(vf_l, rd, rn, rm); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEBitwiseLogical_Predicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + switch (instr->Mask(SVEBitwiseLogical_PredicatedMask)) { + case AND_z_p_zz: + SVEBitwiseLogicalUnpredicatedHelper(AND, vform, result, zdn, zm); break; - case NEON_SMULL: - smull(vf_l, rd, rn, rm); + case BIC_z_p_zz: + SVEBitwiseLogicalUnpredicatedHelper(BIC, vform, result, zdn, zm); break; - case NEON_SMULL2: - smull2(vf_l, rd, rn, rm); + case EOR_z_p_zz: + SVEBitwiseLogicalUnpredicatedHelper(EOR, vform, result, zdn, zm); break; - case NEON_UMULL: - umull(vf_l, rd, rn, rm); + case ORR_z_p_zz: + SVEBitwiseLogicalUnpredicatedHelper(ORR, vform, result, zdn, zm); break; - case NEON_UMULL2: - umull2(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQDMLAL: - sqdmlal(vf_l, rd, rn, rm); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEIntMulVectors_Predicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + switch (instr->Mask(SVEIntMulVectors_PredicatedMask)) { + case MUL_z_p_zz: + mul(vform, result, zdn, zm); break; - case NEON_SQDMLAL2: - sqdmlal2(vf_l, rd, rn, rm); + case SMULH_z_p_zz: + smulh(vform, result, zdn, zm); break; - case NEON_SQDMLSL: - sqdmlsl(vf_l, rd, rn, rm); + case UMULH_z_p_zz: + umulh(vform, result, zdn, zm); break; - case NEON_SQDMLSL2: - sqdmlsl2(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQDMULL: - sqdmull(vf_l, rd, rn, rm); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEIntMinMaxDifference_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + switch (instr->Mask(SVEIntMinMaxDifference_PredicatedMask)) { + case SABD_z_p_zz: + absdiff(vform, result, zdn, zm, true); break; - case NEON_SQDMULL2: - sqdmull2(vf_l, rd, rn, rm); + case SMAX_z_p_zz: + smax(vform, result, zdn, zm); break; - case NEON_UADDW: - uaddw(vf_l, rd, rn, rm); + case SMIN_z_p_zz: + smin(vform, result, zdn, zm); break; - case NEON_UADDW2: - uaddw2(vf_l, rd, rn, rm); + case UABD_z_p_zz: + absdiff(vform, result, zdn, zm, false); break; - case NEON_SADDW: - saddw(vf_l, rd, rn, rm); + case UMAX_z_p_zz: + umax(vform, result, zdn, zm); break; - case NEON_SADDW2: - saddw2(vf_l, rd, rn, rm); + case UMIN_z_p_zz: + umin(vform, result, zdn, zm); break; - case NEON_USUBW: - usubw(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_USUBW2: - usubw2(vf_l, rd, rn, rm); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEIntMulImm_Unpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister scratch; + + switch (instr->Mask(SVEIntMulImm_UnpredicatedMask)) { + case MUL_z_zi: + dup_immediate(vform, scratch, instr->GetImmSVEIntWideSigned()); + mul(vform, zd, zd, scratch); break; - case NEON_SSUBW: - ssubw(vf_l, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SSUBW2: - ssubw2(vf_l, rd, rn, rm); + } +} + +void Simulator::VisitSVEIntDivideVectors_Predicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; + + VIXL_ASSERT((vform == kFormatVnS) || (vform == kFormatVnD)); + + switch (instr->Mask(SVEIntDivideVectors_PredicatedMask)) { + case SDIVR_z_p_zz: + sdiv(vform, result, zm, zdn); break; - case NEON_ADDHN: - addhn(vf, rd, rn, rm); + case SDIV_z_p_zz: + sdiv(vform, result, zdn, zm); break; - case NEON_ADDHN2: - addhn2(vf, rd, rn, rm); + case UDIVR_z_p_zz: + udiv(vform, result, zm, zdn); break; - case NEON_RADDHN: - raddhn(vf, rd, rn, rm); + case UDIV_z_p_zz: + udiv(vform, result, zdn, zm); break; - case NEON_RADDHN2: - raddhn2(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SUBHN: - subhn(vf, rd, rn, rm); + } + mov_merging(vform, zdn, pg, result); +} + +void Simulator::VisitSVEIntMinMaxImm_Unpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister scratch; + + uint64_t unsigned_imm = instr->GetImmSVEIntWideUnsigned(); + int64_t signed_imm = instr->GetImmSVEIntWideSigned(); + + switch (instr->Mask(SVEIntMinMaxImm_UnpredicatedMask)) { + case SMAX_z_zi: + dup_immediate(vform, scratch, signed_imm); + smax(vform, zd, zd, scratch); break; - case NEON_SUBHN2: - subhn2(vf, rd, rn, rm); + case SMIN_z_zi: + dup_immediate(vform, scratch, signed_imm); + smin(vform, zd, zd, scratch); break; - case NEON_RSUBHN: - rsubhn(vf, rd, rn, rm); + case UMAX_z_zi: + dup_immediate(vform, scratch, unsigned_imm); + umax(vform, zd, zd, scratch); break; - case NEON_RSUBHN2: - rsubhn2(vf, rd, rn, rm); + case UMIN_z_zi: + dup_immediate(vform, scratch, unsigned_imm); + umin(vform, zd, zd, scratch); break; default: VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVEIntCompareScalarCountAndLimit( + const Instruction* instr) { + unsigned rn_code = instr->GetRn(); + unsigned rm_code = instr->GetRm(); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + VectorFormat vform = instr->GetSVEVectorFormat(); -void Simulator::VisitNEONAcrossLanes(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - - static const NEONFormatMap map_half = {{30}, {NF_4H, NF_8H}}; - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - - if (instr->Mask(NEONAcrossLanesFP16FMask) == NEONAcrossLanesFP16Fixed) { - VectorFormat vf = nfd.GetVectorFormat(&map_half); - switch (instr->Mask(NEONAcrossLanesFP16Mask)) { - case NEON_FMAXV_H: - fmaxv(vf, rd, rn); - break; - case NEON_FMINV_H: - fminv(vf, rd, rn); - break; - case NEON_FMAXNMV_H: - fmaxnmv(vf, rd, rn); - break; - case NEON_FMINNMV_H: - fminnmv(vf, rd, rn); - break; - default: - VIXL_UNIMPLEMENTED(); - } - } else if (instr->Mask(NEONAcrossLanesFPFMask) == NEONAcrossLanesFPFixed) { - // The input operand's VectorFormat is passed for these instructions. - VectorFormat vf = nfd.GetVectorFormat(nfd.FPFormatMap()); - - switch (instr->Mask(NEONAcrossLanesFPMask)) { - case NEON_FMAXV: - fmaxv(vf, rd, rn); - break; - case NEON_FMINV: - fminv(vf, rd, rn); - break; - case NEON_FMAXNMV: - fmaxnmv(vf, rd, rn); - break; - case NEON_FMINNMV: - fminnmv(vf, rd, rn); - break; - default: - VIXL_UNIMPLEMENTED(); - } - } else { - VectorFormat vf = nfd.GetVectorFormat(); + bool is_64_bit = instr->ExtractBit(12) == 1; + int rsize = is_64_bit ? kXRegSize : kWRegSize; + uint64_t mask = is_64_bit ? kXRegMask : kWRegMask; - switch (instr->Mask(NEONAcrossLanesMask)) { - case NEON_ADDV: - addv(vf, rd, rn); + uint64_t usrc1 = ReadXRegister(rn_code); + int64_t ssrc2 = is_64_bit ? ReadXRegister(rm_code) : ReadWRegister(rm_code); + uint64_t usrc2 = ssrc2 & mask; + + bool reverse = (form_hash_ == "whilege_p_p_rr"_h) || + (form_hash_ == "whilegt_p_p_rr"_h) || + (form_hash_ == "whilehi_p_p_rr"_h) || + (form_hash_ == "whilehs_p_p_rr"_h); + + int lane_count = LaneCountFromFormat(vform); + bool last = true; + for (int i = 0; i < lane_count; i++) { + usrc1 &= mask; + int64_t ssrc1 = ExtractSignedBitfield64(rsize - 1, 0, usrc1); + + bool cond = false; + switch (form_hash_) { + case "whilele_p_p_rr"_h: + cond = ssrc1 <= ssrc2; break; - case NEON_SMAXV: - smaxv(vf, rd, rn); + case "whilelo_p_p_rr"_h: + cond = usrc1 < usrc2; break; - case NEON_SMINV: - sminv(vf, rd, rn); + case "whilels_p_p_rr"_h: + cond = usrc1 <= usrc2; break; - case NEON_UMAXV: - umaxv(vf, rd, rn); + case "whilelt_p_p_rr"_h: + cond = ssrc1 < ssrc2; break; - case NEON_UMINV: - uminv(vf, rd, rn); + case "whilege_p_p_rr"_h: + cond = ssrc1 >= ssrc2; break; - case NEON_SADDLV: - saddlv(vf, rd, rn); + case "whilegt_p_p_rr"_h: + cond = ssrc1 > ssrc2; break; - case NEON_UADDLV: - uaddlv(vf, rd, rn); + case "whilehi_p_p_rr"_h: + cond = usrc1 > usrc2; + break; + case "whilehs_p_p_rr"_h: + cond = usrc1 >= usrc2; break; default: VIXL_UNIMPLEMENTED(); + break; } + last = last && cond; + LogicPRegister dst(pd); + int lane = reverse ? ((lane_count - 1) - i) : i; + dst.SetActive(vform, lane, last); + usrc1 += reverse ? -1 : 1; } -} - - -void Simulator::VisitNEONByIndexedElement(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - static const NEONFormatMap map_half = {{30}, {NF_4H, NF_8H}}; - VectorFormat vf_r = nfd.GetVectorFormat(); - VectorFormat vf_half = nfd.GetVectorFormat(&map_half); - VectorFormat vf = nfd.GetVectorFormat(nfd.LongIntegerFormatMap()); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - ByElementOp Op = NULL; + PredTest(vform, GetPTrue(), pd); + LogSystemRegister(NZCV); +} - int rm_reg = instr->GetRm(); - int rm_low_reg = instr->GetRmLow16(); - int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); - int index_hlm = (index << 1) | instr->GetNEONM(); - - switch (instr->Mask(NEONByIndexedElementFPLongMask)) { - // These are oddballs and are best handled as special cases. - // - Rm is encoded with only 4 bits (and must be in the lower 16 registers). - // - The index is always H:L:M. - case NEON_FMLAL_H_byelement: - fmlal(vf_r, rd, rn, ReadVRegister(rm_low_reg), index_hlm); - return; - case NEON_FMLAL2_H_byelement: - fmlal2(vf_r, rd, rn, ReadVRegister(rm_low_reg), index_hlm); - return; - case NEON_FMLSL_H_byelement: - fmlsl(vf_r, rd, rn, ReadVRegister(rm_low_reg), index_hlm); - return; - case NEON_FMLSL2_H_byelement: - fmlsl2(vf_r, rd, rn, ReadVRegister(rm_low_reg), index_hlm); - return; +void Simulator::VisitSVEConditionallyTerminateScalars( + const Instruction* instr) { + unsigned rn_code = instr->GetRn(); + unsigned rm_code = instr->GetRm(); + bool is_64_bit = instr->ExtractBit(22) == 1; + uint64_t src1 = is_64_bit ? ReadXRegister(rn_code) : ReadWRegister(rn_code); + uint64_t src2 = is_64_bit ? ReadXRegister(rm_code) : ReadWRegister(rm_code); + bool term = false; + switch (instr->Mask(SVEConditionallyTerminateScalarsMask)) { + case CTERMEQ_rr: + term = src1 == src2; + break; + case CTERMNE_rr: + term = src1 != src2; + break; + default: + VIXL_UNIMPLEMENTED(); + break; } + ReadNzcv().SetN(term ? 1 : 0); + ReadNzcv().SetV(term ? 0 : !ReadC()); + LogSystemRegister(NZCV); +} - if (instr->GetNEONSize() == 1) { - rm_reg = rm_low_reg; - index = index_hlm; +void Simulator::VisitSVEIntCompareSignedImm(const Instruction* instr) { + bool commute_inputs = false; + Condition cond = al; + switch (instr->Mask(SVEIntCompareSignedImmMask)) { + case CMPEQ_p_p_zi: + cond = eq; + break; + case CMPGE_p_p_zi: + cond = ge; + break; + case CMPGT_p_p_zi: + cond = gt; + break; + case CMPLE_p_p_zi: + cond = ge; + commute_inputs = true; + break; + case CMPLT_p_p_zi: + cond = gt; + commute_inputs = true; + break; + case CMPNE_p_p_zi: + cond = ne; + break; + default: + VIXL_UNIMPLEMENTED(); + break; } - switch (instr->Mask(NEONByIndexedElementMask)) { - case NEON_MUL_byelement: - Op = &Simulator::mul; - vf = vf_r; + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister src2; + dup_immediate(vform, + src2, + ExtractSignedBitfield64(4, 0, instr->ExtractBits(20, 16))); + SVEIntCompareVectorsHelper(cond, + vform, + ReadPRegister(instr->GetPd()), + ReadPRegister(instr->GetPgLow8()), + commute_inputs ? src2 + : ReadVRegister(instr->GetRn()), + commute_inputs ? ReadVRegister(instr->GetRn()) + : src2); +} + +void Simulator::VisitSVEIntCompareUnsignedImm(const Instruction* instr) { + bool commute_inputs = false; + Condition cond = al; + switch (instr->Mask(SVEIntCompareUnsignedImmMask)) { + case CMPHI_p_p_zi: + cond = hi; break; - case NEON_MLA_byelement: - Op = &Simulator::mla; - vf = vf_r; + case CMPHS_p_p_zi: + cond = hs; break; - case NEON_MLS_byelement: - Op = &Simulator::mls; - vf = vf_r; + case CMPLO_p_p_zi: + cond = hi; + commute_inputs = true; break; - case NEON_SQDMULH_byelement: - Op = &Simulator::sqdmulh; - vf = vf_r; + case CMPLS_p_p_zi: + cond = hs; + commute_inputs = true; break; - case NEON_SQRDMULH_byelement: - Op = &Simulator::sqrdmulh; - vf = vf_r; + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SDOT_byelement: - Op = &Simulator::sdot; - vf = vf_r; + } + + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister src2; + dup_immediate(vform, src2, instr->ExtractBits(20, 14)); + SVEIntCompareVectorsHelper(cond, + vform, + ReadPRegister(instr->GetPd()), + ReadPRegister(instr->GetPgLow8()), + commute_inputs ? src2 + : ReadVRegister(instr->GetRn()), + commute_inputs ? ReadVRegister(instr->GetRn()) + : src2); +} + +void Simulator::VisitSVEIntCompareVectors(const Instruction* instr) { + Instr op = instr->Mask(SVEIntCompareVectorsMask); + bool is_wide_elements = false; + switch (op) { + case CMPEQ_p_p_zw: + case CMPGE_p_p_zw: + case CMPGT_p_p_zw: + case CMPHI_p_p_zw: + case CMPHS_p_p_zw: + case CMPLE_p_p_zw: + case CMPLO_p_p_zw: + case CMPLS_p_p_zw: + case CMPLT_p_p_zw: + case CMPNE_p_p_zw: + is_wide_elements = true; break; - case NEON_SQRDMLAH_byelement: - Op = &Simulator::sqrdmlah; - vf = vf_r; + } + + Condition cond; + switch (op) { + case CMPEQ_p_p_zw: + case CMPEQ_p_p_zz: + cond = eq; break; - case NEON_UDOT_byelement: - Op = &Simulator::udot; - vf = vf_r; + case CMPGE_p_p_zw: + case CMPGE_p_p_zz: + cond = ge; break; - case NEON_SQRDMLSH_byelement: - Op = &Simulator::sqrdmlsh; - vf = vf_r; + case CMPGT_p_p_zw: + case CMPGT_p_p_zz: + cond = gt; break; - case NEON_SMULL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::smull2; - } else { - Op = &Simulator::smull; - } + case CMPHI_p_p_zw: + case CMPHI_p_p_zz: + cond = hi; break; - case NEON_UMULL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::umull2; - } else { - Op = &Simulator::umull; - } + case CMPHS_p_p_zw: + case CMPHS_p_p_zz: + cond = hs; break; - case NEON_SMLAL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::smlal2; - } else { - Op = &Simulator::smlal; - } + case CMPNE_p_p_zw: + case CMPNE_p_p_zz: + cond = ne; break; - case NEON_UMLAL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::umlal2; - } else { - Op = &Simulator::umlal; - } + case CMPLE_p_p_zw: + cond = le; break; - case NEON_SMLSL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::smlsl2; - } else { - Op = &Simulator::smlsl; - } + case CMPLO_p_p_zw: + cond = lo; break; - case NEON_UMLSL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::umlsl2; - } else { - Op = &Simulator::umlsl; - } + case CMPLS_p_p_zw: + cond = ls; break; - case NEON_SQDMULL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::sqdmull2; - } else { - Op = &Simulator::sqdmull; - } + case CMPLT_p_p_zw: + cond = lt; break; - case NEON_SQDMLAL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::sqdmlal2; - } else { - Op = &Simulator::sqdmlal; - } + default: + VIXL_UNIMPLEMENTED(); + cond = al; break; - case NEON_SQDMLSL_byelement: - if (instr->Mask(NEON_Q)) { - Op = &Simulator::sqdmlsl2; - } else { - Op = &Simulator::sqdmlsl; - } + } + + SVEIntCompareVectorsHelper(cond, + instr->GetSVEVectorFormat(), + ReadPRegister(instr->GetPd()), + ReadPRegister(instr->GetPgLow8()), + ReadVRegister(instr->GetRn()), + ReadVRegister(instr->GetRm()), + is_wide_elements); +} + +void Simulator::VisitSVEFPExponentialAccelerator(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + + VIXL_ASSERT((vform == kFormatVnH) || (vform == kFormatVnS) || + (vform == kFormatVnD)); + + switch (instr->Mask(SVEFPExponentialAcceleratorMask)) { + case FEXPA_z_z: + fexpa(vform, zd, zn); break; default: - index = instr->GetNEONH(); - if (instr->GetFPType() == 0) { - rm_reg &= 0xf; - index = (index << 2) | (instr->GetNEONL() << 1) | instr->GetNEONM(); - } else if ((instr->GetFPType() & 1) == 0) { - index = (index << 1) | instr->GetNEONL(); - } + VIXL_UNIMPLEMENTED(); + break; + } +} - vf = nfd.GetVectorFormat(nfd.FPFormatMap()); +void Simulator::VisitSVEFPTrigSelectCoefficient(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); - switch (instr->Mask(NEONByIndexedElementFPMask)) { - case NEON_FMUL_H_byelement: - vf = vf_half; - VIXL_FALLTHROUGH(); - case NEON_FMUL_byelement: - Op = &Simulator::fmul; - break; - case NEON_FMLA_H_byelement: - vf = vf_half; - VIXL_FALLTHROUGH(); - case NEON_FMLA_byelement: - Op = &Simulator::fmla; - break; - case NEON_FMLS_H_byelement: - vf = vf_half; - VIXL_FALLTHROUGH(); - case NEON_FMLS_byelement: - Op = &Simulator::fmls; - break; - case NEON_FMULX_H_byelement: - vf = vf_half; - VIXL_FALLTHROUGH(); - case NEON_FMULX_byelement: - Op = &Simulator::fmulx; - break; - default: - if (instr->GetNEONSize() == 2) { - index = instr->GetNEONH(); - } else { - index = (instr->GetNEONH() << 1) | instr->GetNEONL(); - } - switch (instr->Mask(NEONByIndexedElementFPComplexMask)) { - case NEON_FCMLA_byelement: - vf = vf_r; - fcmla(vf, - rd, - rn, - ReadVRegister(instr->GetRm()), - index, - instr->GetImmRotFcmlaSca()); - return; - default: - VIXL_UNIMPLEMENTED(); - } - } - } + VIXL_ASSERT((vform == kFormatVnH) || (vform == kFormatVnS) || + (vform == kFormatVnD)); - (this->*Op)(vf, rd, rn, ReadVRegister(rm_reg), index); + switch (instr->Mask(SVEFPTrigSelectCoefficientMask)) { + case FTSSEL_z_zz: + ftssel(vform, zd, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } } +void Simulator::VisitSVEConstructivePrefix_Unpredicated( + const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); -void Simulator::VisitNEONCopy(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::TriangularFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + switch (instr->Mask(SVEConstructivePrefix_UnpredicatedMask)) { + case MOVPRFX_z_z: + mov(kFormatVnD, zd, zn); // The lane size is arbitrary. + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - int imm5 = instr->GetImmNEON5(); - int tz = CountTrailingZeros(imm5, 32); - int reg_index = imm5 >> (tz + 1); +void Simulator::VisitSVEIntMulAddPredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); - if (instr->Mask(NEONCopyInsElementMask) == NEON_INS_ELEMENT) { - int imm4 = instr->GetImmNEON4(); - int rn_index = imm4 >> tz; - ins_element(vf, rd, reg_index, rn, rn_index); - } else if (instr->Mask(NEONCopyInsGeneralMask) == NEON_INS_GENERAL) { - ins_immediate(vf, rd, reg_index, ReadXRegister(instr->GetRn())); - } else if (instr->Mask(NEONCopyUmovMask) == NEON_UMOV) { - uint64_t value = LogicVRegister(rn).Uint(vf, reg_index); - value &= MaxUintFromFormat(vf); - WriteXRegister(instr->GetRd(), value); - } else if (instr->Mask(NEONCopyUmovMask) == NEON_SMOV) { - int64_t value = LogicVRegister(rn).Int(vf, reg_index); - if (instr->GetNEONQ()) { - WriteXRegister(instr->GetRd(), value); - } else { - WriteWRegister(instr->GetRd(), (int32_t)value); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + SimVRegister result; + switch (instr->Mask(SVEIntMulAddPredicatedMask)) { + case MLA_z_p_zzz: + mla(vform, result, zd, ReadVRegister(instr->GetRn()), zm); + break; + case MLS_z_p_zzz: + mls(vform, result, zd, ReadVRegister(instr->GetRn()), zm); + break; + case MAD_z_p_zzz: + // 'za' is encoded in 'Rn'. + mla(vform, result, ReadVRegister(instr->GetRn()), zd, zm); + break; + case MSB_z_p_zzz: { + // 'za' is encoded in 'Rn'. + mls(vform, result, ReadVRegister(instr->GetRn()), zd, zm); + break; } - } else if (instr->Mask(NEONCopyDupElementMask) == NEON_DUP_ELEMENT) { - dup_element(vf, rd, rn, reg_index); - } else if (instr->Mask(NEONCopyDupGeneralMask) == NEON_DUP_GENERAL) { - dup_immediate(vf, rd, ReadXRegister(instr->GetRn())); - } else { - VIXL_UNIMPLEMENTED(); + default: + VIXL_UNIMPLEMENTED(); + break; } + mov_merging(vform, zd, ReadPRegister(instr->GetPgLow8()), result); } +void Simulator::VisitSVEIntMulAddUnpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); -void Simulator::VisitNEONExtract(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LogicalFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); - if (instr->Mask(NEONExtractMask) == NEON_EXT) { - int index = instr->GetImmNEONExt(); - ext(vf, rd, rn, rm, index); - } else { - VIXL_UNIMPLEMENTED(); + switch (form_hash_) { + case "sdot_z_zzz"_h: + sdot(vform, zda, zn, zm); + break; + case "udot_z_zzz"_h: + udot(vform, zda, zn, zm); + break; + case "usdot_z_zzz_s"_h: + usdot(vform, zda, zn, zm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVEMovprfx(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister& zd = ReadVRegister(instr->GetRd()); -void Simulator::NEONLoadStoreMultiStructHelper(const Instruction* instr, - AddrMode addr_mode) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LoadStoreFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + switch (instr->Mask(SVEMovprfxMask)) { + case MOVPRFX_z_p_z: + if (instr->ExtractBit(16)) { + mov_merging(vform, zd, pg, zn); + } else { + mov_zeroing(vform, zd, pg, zn); + } + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - uint64_t addr_base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); - int reg_size = RegisterSizeInBytesFromFormat(vf); +void Simulator::VisitSVEIntReduction(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& vd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); - int reg[4]; - uint64_t addr[4]; - for (int i = 0; i < 4; i++) { - reg[i] = (instr->GetRt() + i) % kNumberOfVRegisters; - addr[i] = addr_base + (i * reg_size); + if (instr->Mask(SVEIntReductionLogicalFMask) == SVEIntReductionLogicalFixed) { + switch (instr->Mask(SVEIntReductionLogicalMask)) { + case ANDV_r_p_z: + andv(vform, vd, pg, zn); + break; + case EORV_r_p_z: + eorv(vform, vd, pg, zn); + break; + case ORV_r_p_z: + orv(vform, vd, pg, zn); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + } else { + switch (instr->Mask(SVEIntReductionMask)) { + case SADDV_r_p_z: + saddv(vform, vd, pg, zn); + break; + case SMAXV_r_p_z: + smaxv(vform, vd, pg, zn); + break; + case SMINV_r_p_z: + sminv(vform, vd, pg, zn); + break; + case UADDV_r_p_z: + uaddv(vform, vd, pg, zn); + break; + case UMAXV_r_p_z: + umaxv(vform, vd, pg, zn); + break; + case UMINV_r_p_z: + uminv(vform, vd, pg, zn); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } } - int count = 1; - bool log_read = true; +} - // Bit 23 determines whether this is an offset or post-index addressing mode. - // In offset mode, bits 20 to 16 should be zero; these bits encode the - // register or immediate in post-index mode. - if ((instr->ExtractBit(23) == 0) && (instr->ExtractBits(20, 16) != 0)) { - VIXL_UNREACHABLE(); - } +void Simulator::VisitSVEIntUnaryArithmeticPredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zn = ReadVRegister(instr->GetRn()); - // We use the PostIndex mask here, as it works in this case for both Offset - // and PostIndex addressing. - switch (instr->Mask(NEONLoadStoreMultiStructPostIndexMask)) { - case NEON_LD1_4v: - case NEON_LD1_4v_post: - ld1(vf, ReadVRegister(reg[3]), addr[3]); - count++; - VIXL_FALLTHROUGH(); - case NEON_LD1_3v: - case NEON_LD1_3v_post: - ld1(vf, ReadVRegister(reg[2]), addr[2]); - count++; - VIXL_FALLTHROUGH(); - case NEON_LD1_2v: - case NEON_LD1_2v_post: - ld1(vf, ReadVRegister(reg[1]), addr[1]); - count++; - VIXL_FALLTHROUGH(); - case NEON_LD1_1v: - case NEON_LD1_1v_post: - ld1(vf, ReadVRegister(reg[0]), addr[0]); + SimVRegister result; + switch (instr->Mask(SVEIntUnaryArithmeticPredicatedMask)) { + case ABS_z_p_z: + abs(vform, result, zn); break; - case NEON_ST1_4v: - case NEON_ST1_4v_post: - st1(vf, ReadVRegister(reg[3]), addr[3]); - count++; - VIXL_FALLTHROUGH(); - case NEON_ST1_3v: - case NEON_ST1_3v_post: - st1(vf, ReadVRegister(reg[2]), addr[2]); - count++; - VIXL_FALLTHROUGH(); - case NEON_ST1_2v: - case NEON_ST1_2v_post: - st1(vf, ReadVRegister(reg[1]), addr[1]); - count++; - VIXL_FALLTHROUGH(); - case NEON_ST1_1v: - case NEON_ST1_1v_post: - st1(vf, ReadVRegister(reg[0]), addr[0]); - log_read = false; + case CLS_z_p_z: + cls(vform, result, zn); break; - case NEON_LD2_post: - case NEON_LD2: - ld2(vf, ReadVRegister(reg[0]), ReadVRegister(reg[1]), addr[0]); - count = 2; + case CLZ_z_p_z: + clz(vform, result, zn); break; - case NEON_ST2: - case NEON_ST2_post: - st2(vf, ReadVRegister(reg[0]), ReadVRegister(reg[1]), addr[0]); - count = 2; - log_read = false; + case CNOT_z_p_z: + cnot(vform, result, zn); break; - case NEON_LD3_post: - case NEON_LD3: - ld3(vf, - ReadVRegister(reg[0]), - ReadVRegister(reg[1]), - ReadVRegister(reg[2]), - addr[0]); - count = 3; + case CNT_z_p_z: + cnt(vform, result, zn); break; - case NEON_ST3: - case NEON_ST3_post: - st3(vf, - ReadVRegister(reg[0]), - ReadVRegister(reg[1]), - ReadVRegister(reg[2]), - addr[0]); - count = 3; - log_read = false; + case FABS_z_p_z: + fabs_(vform, result, zn); break; - case NEON_ST4: - case NEON_ST4_post: - st4(vf, - ReadVRegister(reg[0]), - ReadVRegister(reg[1]), - ReadVRegister(reg[2]), - ReadVRegister(reg[3]), - addr[0]); - count = 4; - log_read = false; + case FNEG_z_p_z: + fneg(vform, result, zn); break; - case NEON_LD4_post: - case NEON_LD4: - ld4(vf, - ReadVRegister(reg[0]), - ReadVRegister(reg[1]), - ReadVRegister(reg[2]), - ReadVRegister(reg[3]), - addr[0]); - count = 4; + case NEG_z_p_z: + neg(vform, result, zn); + break; + case NOT_z_p_z: + not_(vform, result, zn); + break; + case SXTB_z_p_z: + case SXTH_z_p_z: + case SXTW_z_p_z: + sxt(vform, result, zn, (kBitsPerByte << instr->ExtractBits(18, 17))); + break; + case UXTB_z_p_z: + case UXTH_z_p_z: + case UXTW_z_p_z: + uxt(vform, result, zn, (kBitsPerByte << instr->ExtractBits(18, 17))); break; default: VIXL_UNIMPLEMENTED(); + break; } - // Explicitly log the register update whilst we have type information. - for (int i = 0; i < count; i++) { - // For de-interleaving loads, only print the base address. - int lane_size = LaneSizeInBytesFromFormat(vf); - PrintRegisterFormat format = GetPrintRegisterFormatTryFP( - GetPrintRegisterFormatForSize(reg_size, lane_size)); - if (log_read) { - LogVRead(addr_base, reg[i], format); - } else { - LogVWrite(addr_base, reg[i], format); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + mov_merging(vform, zd, pg, result); +} + +void Simulator::VisitSVECopyFPImm_Predicated(const Instruction* instr) { + // There is only one instruction in this group. + VIXL_ASSERT(instr->Mask(SVECopyFPImm_PredicatedMask) == FCPY_z_p_i); + + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(19, 16)); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + + if (vform == kFormatVnB) VIXL_UNIMPLEMENTED(); + + SimVRegister result; + switch (instr->Mask(SVECopyFPImm_PredicatedMask)) { + case FCPY_z_p_i: { + int imm8 = instr->ExtractBits(12, 5); + uint64_t value = FPToRawbitsWithSize(LaneSizeInBitsFromFormat(vform), + Instruction::Imm8ToFP64(imm8)); + dup_immediate(vform, result, value); + break; } + default: + VIXL_UNIMPLEMENTED(); + break; } + mov_merging(vform, zd, pg, result); +} - if (addr_mode == PostIndex) { - int rm = instr->GetRm(); - // The immediate post index addressing mode is indicated by rm = 31. - // The immediate is implied by the number of vector registers used. - addr_base += (rm == 31) ? RegisterSizeInBytesFromFormat(vf) * count - : ReadXRegister(rm); - WriteXRegister(instr->GetRn(), addr_base); - } else { - VIXL_ASSERT(addr_mode == Offset); +void Simulator::VisitSVEIntAddSubtractImm_Unpredicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister scratch; + + uint64_t imm = instr->GetImmSVEIntWideUnsigned(); + imm <<= instr->ExtractBit(13) * 8; + + switch (instr->Mask(SVEIntAddSubtractImm_UnpredicatedMask)) { + case ADD_z_zi: + add_uint(vform, zd, zd, imm); + break; + case SQADD_z_zi: + add_uint(vform, zd, zd, imm).SignedSaturate(vform); + break; + case SQSUB_z_zi: + sub_uint(vform, zd, zd, imm).SignedSaturate(vform); + break; + case SUBR_z_zi: + dup_immediate(vform, scratch, imm); + sub(vform, zd, scratch, zd); + break; + case SUB_z_zi: + sub_uint(vform, zd, zd, imm); + break; + case UQADD_z_zi: + add_uint(vform, zd, zd, imm).UnsignedSaturate(vform); + break; + case UQSUB_z_zi: + sub_uint(vform, zd, zd, imm).UnsignedSaturate(vform); + break; + default: + break; } } +void Simulator::VisitSVEBroadcastIntImm_Unpredicated(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); -void Simulator::VisitNEONLoadStoreMultiStruct(const Instruction* instr) { - NEONLoadStoreMultiStructHelper(instr, Offset); + VectorFormat format = instr->GetSVEVectorFormat(); + int64_t imm = instr->GetImmSVEIntWideSigned(); + int shift = instr->ExtractBit(13) * 8; + imm *= 1 << shift; + + switch (instr->Mask(SVEBroadcastIntImm_UnpredicatedMask)) { + case DUP_z_i: + // The encoding of byte-sized lanes with lsl #8 is undefined. + if ((format == kFormatVnB) && (shift == 8)) { + VIXL_UNIMPLEMENTED(); + } else { + dup_immediate(format, zd, imm); + } + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } } +void Simulator::VisitSVEBroadcastFPImm_Unpredicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); -void Simulator::VisitNEONLoadStoreMultiStructPostIndex( - const Instruction* instr) { - NEONLoadStoreMultiStructHelper(instr, PostIndex); + switch (instr->Mask(SVEBroadcastFPImm_UnpredicatedMask)) { + case FDUP_z_i: + switch (vform) { + case kFormatVnH: + dup_immediate(vform, zd, Float16ToRawbits(instr->GetSVEImmFP16())); + break; + case kFormatVnS: + dup_immediate(vform, zd, FloatToRawbits(instr->GetSVEImmFP32())); + break; + case kFormatVnD: + dup_immediate(vform, zd, DoubleToRawbits(instr->GetSVEImmFP64())); + break; + default: + VIXL_UNIMPLEMENTED(); + } + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } } +void Simulator::VisitSVE32BitGatherLoadHalfwords_ScalarPlus32BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask( + SVE32BitGatherLoadHalfwords_ScalarPlus32BitScaledOffsetsMask)) { + case LD1H_z_p_bz_s_x32_scaled: + case LD1SH_z_p_bz_s_x32_scaled: + case LDFF1H_z_p_bz_s_x32_scaled: + case LDFF1SH_z_p_bz_s_x32_scaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } -void Simulator::NEONLoadStoreSingleStructHelper(const Instruction* instr, - AddrMode addr_mode) { - uint64_t addr = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); - int rt = instr->GetRt(); + SVEOffsetModifier mod = (instr->ExtractBit(22) == 1) ? SVE_SXTW : SVE_UXTW; + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnS, mod); +} - // Bit 23 determines whether this is an offset or post-index addressing mode. - // In offset mode, bits 20 to 16 should be zero; these bits encode the - // register or immediate in post-index mode. - if ((instr->ExtractBit(23) == 0) && (instr->ExtractBits(20, 16) != 0)) { - VIXL_UNREACHABLE(); +void Simulator::VisitSVE32BitGatherLoad_ScalarPlus32BitUnscaledOffsets( + const Instruction* instr) { + switch (instr->Mask(SVE32BitGatherLoad_ScalarPlus32BitUnscaledOffsetsMask)) { + case LD1B_z_p_bz_s_x32_unscaled: + case LD1H_z_p_bz_s_x32_unscaled: + case LD1SB_z_p_bz_s_x32_unscaled: + case LD1SH_z_p_bz_s_x32_unscaled: + case LD1W_z_p_bz_s_x32_unscaled: + case LDFF1B_z_p_bz_s_x32_unscaled: + case LDFF1H_z_p_bz_s_x32_unscaled: + case LDFF1SB_z_p_bz_s_x32_unscaled: + case LDFF1SH_z_p_bz_s_x32_unscaled: + case LDFF1W_z_p_bz_s_x32_unscaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; } - // We use the PostIndex mask here, as it works in this case for both Offset - // and PostIndex addressing. - bool do_load = false; - - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LoadStoreFormatMap()); - VectorFormat vf_t = nfd.GetVectorFormat(); + SVEOffsetModifier mod = (instr->ExtractBit(22) == 1) ? SVE_SXTW : SVE_UXTW; + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnS, mod); +} - VectorFormat vf = kFormat16B; - switch (instr->Mask(NEONLoadStoreSingleStructPostIndexMask)) { - case NEON_LD1_b: - case NEON_LD1_b_post: - case NEON_LD2_b: - case NEON_LD2_b_post: - case NEON_LD3_b: - case NEON_LD3_b_post: - case NEON_LD4_b: - case NEON_LD4_b_post: - do_load = true; - VIXL_FALLTHROUGH(); - case NEON_ST1_b: - case NEON_ST1_b_post: - case NEON_ST2_b: - case NEON_ST2_b_post: - case NEON_ST3_b: - case NEON_ST3_b_post: - case NEON_ST4_b: - case NEON_ST4_b_post: +void Simulator::VisitSVE32BitGatherLoad_VectorPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVE32BitGatherLoad_VectorPlusImmMask)) { + case LD1B_z_p_ai_s: + VIXL_UNIMPLEMENTED(); break; - - case NEON_LD1_h: - case NEON_LD1_h_post: - case NEON_LD2_h: - case NEON_LD2_h_post: - case NEON_LD3_h: - case NEON_LD3_h_post: - case NEON_LD4_h: - case NEON_LD4_h_post: - do_load = true; - VIXL_FALLTHROUGH(); - case NEON_ST1_h: - case NEON_ST1_h_post: - case NEON_ST2_h: - case NEON_ST2_h_post: - case NEON_ST3_h: - case NEON_ST3_h_post: - case NEON_ST4_h: - case NEON_ST4_h_post: - vf = kFormat8H; + case LD1H_z_p_ai_s: + VIXL_UNIMPLEMENTED(); break; - case NEON_LD1_s: - case NEON_LD1_s_post: - case NEON_LD2_s: - case NEON_LD2_s_post: - case NEON_LD3_s: - case NEON_LD3_s_post: - case NEON_LD4_s: - case NEON_LD4_s_post: - do_load = true; - VIXL_FALLTHROUGH(); - case NEON_ST1_s: - case NEON_ST1_s_post: - case NEON_ST2_s: - case NEON_ST2_s_post: - case NEON_ST3_s: - case NEON_ST3_s_post: - case NEON_ST4_s: - case NEON_ST4_s_post: { - VIXL_STATIC_ASSERT((NEON_LD1_s | (1 << NEONLSSize_offset)) == NEON_LD1_d); - VIXL_STATIC_ASSERT((NEON_LD1_s_post | (1 << NEONLSSize_offset)) == - NEON_LD1_d_post); - VIXL_STATIC_ASSERT((NEON_ST1_s | (1 << NEONLSSize_offset)) == NEON_ST1_d); - VIXL_STATIC_ASSERT((NEON_ST1_s_post | (1 << NEONLSSize_offset)) == - NEON_ST1_d_post); - vf = ((instr->GetNEONLSSize() & 1) == 0) ? kFormat4S : kFormat2D; + case LD1SB_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + case LD1SH_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + case LD1W_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + case LDFF1B_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + case LDFF1H_z_p_ai_s: + VIXL_UNIMPLEMENTED(); break; - } - - case NEON_LD1R: - case NEON_LD1R_post: { - vf = vf_t; - ld1r(vf, ReadVRegister(rt), addr); - do_load = true; + case LDFF1SB_z_p_ai_s: + VIXL_UNIMPLEMENTED(); break; - } + case LDFF1SH_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + case LDFF1W_z_p_ai_s: + VIXL_UNIMPLEMENTED(); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - case NEON_LD2R: - case NEON_LD2R_post: { - vf = vf_t; - int rt2 = (rt + 1) % kNumberOfVRegisters; - ld2r(vf, ReadVRegister(rt), ReadVRegister(rt2), addr); - do_load = true; +void Simulator::VisitSVE32BitGatherLoadWords_ScalarPlus32BitScaledOffsets( + const Instruction* instr) { + switch ( + instr->Mask(SVE32BitGatherLoadWords_ScalarPlus32BitScaledOffsetsMask)) { + case LD1W_z_p_bz_s_x32_scaled: + case LDFF1W_z_p_bz_s_x32_scaled: break; - } + default: + VIXL_UNIMPLEMENTED(); + break; + } - case NEON_LD3R: - case NEON_LD3R_post: { - vf = vf_t; - int rt2 = (rt + 1) % kNumberOfVRegisters; - int rt3 = (rt2 + 1) % kNumberOfVRegisters; - ld3r(vf, ReadVRegister(rt), ReadVRegister(rt2), ReadVRegister(rt3), addr); - do_load = true; + SVEOffsetModifier mod = (instr->ExtractBit(22) == 1) ? SVE_SXTW : SVE_UXTW; + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnS, mod); +} + +void Simulator::VisitSVE32BitGatherPrefetch_ScalarPlus32BitScaledOffsets( + const Instruction* instr) { + switch ( + instr->Mask(SVE32BitGatherPrefetch_ScalarPlus32BitScaledOffsetsMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_bz_s_x32_scaled: + case PRFD_i_p_bz_s_x32_scaled: + case PRFH_i_p_bz_s_x32_scaled: + case PRFW_i_p_bz_s_x32_scaled: break; - } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - case NEON_LD4R: - case NEON_LD4R_post: { - vf = vf_t; - int rt2 = (rt + 1) % kNumberOfVRegisters; - int rt3 = (rt2 + 1) % kNumberOfVRegisters; - int rt4 = (rt3 + 1) % kNumberOfVRegisters; - ld4r(vf, - ReadVRegister(rt), - ReadVRegister(rt2), - ReadVRegister(rt3), - ReadVRegister(rt4), - addr); - do_load = true; +void Simulator::VisitSVE32BitGatherPrefetch_VectorPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVE32BitGatherPrefetch_VectorPlusImmMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_ai_s: + case PRFD_i_p_ai_s: + case PRFH_i_p_ai_s: + case PRFW_i_p_ai_s: break; - } default: VIXL_UNIMPLEMENTED(); + break; } +} - PrintRegisterFormat print_format = - GetPrintRegisterFormatTryFP(GetPrintRegisterFormat(vf)); - // Make sure that the print_format only includes a single lane. - print_format = - static_cast(print_format & ~kPrintRegAsVectorMask); +void Simulator::VisitSVEContiguousPrefetch_ScalarPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVEContiguousPrefetch_ScalarPlusImmMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_bi_s: + case PRFD_i_p_bi_s: + case PRFH_i_p_bi_s: + case PRFW_i_p_bi_s: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - int esize = LaneSizeInBytesFromFormat(vf); - int index_shift = LaneSizeInBytesLog2FromFormat(vf); - int lane = instr->GetNEONLSIndex(index_shift); - int scale = 0; - int rt2 = (rt + 1) % kNumberOfVRegisters; - int rt3 = (rt2 + 1) % kNumberOfVRegisters; - int rt4 = (rt3 + 1) % kNumberOfVRegisters; - switch (instr->Mask(NEONLoadStoreSingleLenMask)) { - case NEONLoadStoreSingle1: - scale = 1; - if (do_load) { - ld1(vf, ReadVRegister(rt), lane, addr); - LogVRead(addr, rt, print_format, lane); - } else { - st1(vf, ReadVRegister(rt), lane, addr); - LogVWrite(addr, rt, print_format, lane); +void Simulator::VisitSVEContiguousPrefetch_ScalarPlusScalar( + const Instruction* instr) { + switch (instr->Mask(SVEContiguousPrefetch_ScalarPlusScalarMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_br_s: + case PRFD_i_p_br_s: + case PRFH_i_p_br_s: + case PRFW_i_p_br_s: + if (instr->GetRm() == kZeroRegCode) { + VIXL_UNIMPLEMENTED(); } break; - case NEONLoadStoreSingle2: - scale = 2; - if (do_load) { - ld2(vf, ReadVRegister(rt), ReadVRegister(rt2), lane, addr); - LogVRead(addr, rt, print_format, lane); - LogVRead(addr + esize, rt2, print_format, lane); - } else { - st2(vf, ReadVRegister(rt), ReadVRegister(rt2), lane, addr); - LogVWrite(addr, rt, print_format, lane); - LogVWrite(addr + esize, rt2, print_format, lane); - } + default: + VIXL_UNIMPLEMENTED(); break; - case NEONLoadStoreSingle3: - scale = 3; - if (do_load) { - ld3(vf, - ReadVRegister(rt), - ReadVRegister(rt2), - ReadVRegister(rt3), - lane, - addr); - LogVRead(addr, rt, print_format, lane); - LogVRead(addr + esize, rt2, print_format, lane); - LogVRead(addr + (2 * esize), rt3, print_format, lane); - } else { - st3(vf, - ReadVRegister(rt), - ReadVRegister(rt2), - ReadVRegister(rt3), - lane, - addr); - LogVWrite(addr, rt, print_format, lane); - LogVWrite(addr + esize, rt2, print_format, lane); - LogVWrite(addr + (2 * esize), rt3, print_format, lane); + } +} + +void Simulator::VisitSVELoadAndBroadcastElement(const Instruction* instr) { + bool is_signed; + switch (instr->Mask(SVELoadAndBroadcastElementMask)) { + case LD1RB_z_p_bi_u8: + case LD1RB_z_p_bi_u16: + case LD1RB_z_p_bi_u32: + case LD1RB_z_p_bi_u64: + case LD1RH_z_p_bi_u16: + case LD1RH_z_p_bi_u32: + case LD1RH_z_p_bi_u64: + case LD1RW_z_p_bi_u32: + case LD1RW_z_p_bi_u64: + case LD1RD_z_p_bi_u64: + is_signed = false; + break; + case LD1RSB_z_p_bi_s16: + case LD1RSB_z_p_bi_s32: + case LD1RSB_z_p_bi_s64: + case LD1RSH_z_p_bi_s32: + case LD1RSH_z_p_bi_s64: + case LD1RSW_z_p_bi_s64: + is_signed = true; + break; + default: + // This encoding group is complete, so no other values should be possible. + VIXL_UNREACHABLE(); + is_signed = false; + break; + } + + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(is_signed); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(is_signed, 13); + VIXL_ASSERT(msize_in_bytes_log2 <= esize_in_bytes_log2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + uint64_t offset = instr->ExtractBits(21, 16) << msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer) + offset; + VectorFormat unpack_vform = + SVEFormatFromLaneSizeInBytesLog2(msize_in_bytes_log2); + SimVRegister temp; + ld1r(vform, unpack_vform, temp, base, is_signed); + mov_zeroing(vform, + ReadVRegister(instr->GetRt()), + ReadPRegister(instr->GetPgLow8()), + temp); +} + +void Simulator::VisitSVELoadPredicateRegister(const Instruction* instr) { + switch (instr->Mask(SVELoadPredicateRegisterMask)) { + case LDR_p_bi: { + SimPRegister& pt = ReadPRegister(instr->GetPt()); + int pl = GetPredicateLengthInBytes(); + int imm9 = (instr->ExtractBits(21, 16) << 3) | instr->ExtractBits(12, 10); + uint64_t multiplier = ExtractSignedBitfield64(8, 0, imm9); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t address = base + multiplier * pl; + for (int i = 0; i < pl; i++) { + pt.Insert(i, MemRead(address + i)); } + LogPRead(instr->GetPt(), address); break; - case NEONLoadStoreSingle4: - scale = 4; - if (do_load) { - ld4(vf, - ReadVRegister(rt), - ReadVRegister(rt2), - ReadVRegister(rt3), - ReadVRegister(rt4), - lane, - addr); - LogVRead(addr, rt, print_format, lane); - LogVRead(addr + esize, rt2, print_format, lane); - LogVRead(addr + (2 * esize), rt3, print_format, lane); - LogVRead(addr + (3 * esize), rt4, print_format, lane); - } else { - st4(vf, - ReadVRegister(rt), - ReadVRegister(rt2), - ReadVRegister(rt3), - ReadVRegister(rt4), - lane, - addr); - LogVWrite(addr, rt, print_format, lane); - LogVWrite(addr + esize, rt2, print_format, lane); - LogVWrite(addr + (2 * esize), rt3, print_format, lane); - LogVWrite(addr + (3 * esize), rt4, print_format, lane); + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVELoadVectorRegister(const Instruction* instr) { + switch (instr->Mask(SVELoadVectorRegisterMask)) { + case LDR_z_bi: { + SimVRegister& zt = ReadVRegister(instr->GetRt()); + int vl = GetVectorLengthInBytes(); + int imm9 = (instr->ExtractBits(21, 16) << 3) | instr->ExtractBits(12, 10); + uint64_t multiplier = ExtractSignedBitfield64(8, 0, imm9); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t address = base + multiplier * vl; + for (int i = 0; i < vl; i++) { + zt.Insert(i, MemRead(address + i)); } + LogZRead(instr->GetRt(), address); break; + } default: VIXL_UNIMPLEMENTED(); + break; } +} - if (addr_mode == PostIndex) { - int rm = instr->GetRm(); - int lane_size = LaneSizeInBytesFromFormat(vf); - WriteXRegister(instr->GetRn(), - addr + - ((rm == 31) ? (scale * lane_size) : ReadXRegister(rm))); +void Simulator::VisitSVE64BitGatherLoad_ScalarPlus32BitUnpackedScaledOffsets( + const Instruction* instr) { + switch (instr->Mask( + SVE64BitGatherLoad_ScalarPlus32BitUnpackedScaledOffsetsMask)) { + case LD1D_z_p_bz_d_x32_scaled: + case LD1H_z_p_bz_d_x32_scaled: + case LD1SH_z_p_bz_d_x32_scaled: + case LD1SW_z_p_bz_d_x32_scaled: + case LD1W_z_p_bz_d_x32_scaled: + case LDFF1H_z_p_bz_d_x32_scaled: + case LDFF1W_z_p_bz_d_x32_scaled: + case LDFF1D_z_p_bz_d_x32_scaled: + case LDFF1SH_z_p_bz_d_x32_scaled: + case LDFF1SW_z_p_bz_d_x32_scaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; } + + SVEOffsetModifier mod = (instr->ExtractBit(22) == 1) ? SVE_SXTW : SVE_UXTW; + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnD, mod); } +void Simulator::VisitSVE64BitGatherLoad_ScalarPlus64BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask(SVE64BitGatherLoad_ScalarPlus64BitScaledOffsetsMask)) { + case LD1D_z_p_bz_d_64_scaled: + case LD1H_z_p_bz_d_64_scaled: + case LD1SH_z_p_bz_d_64_scaled: + case LD1SW_z_p_bz_d_64_scaled: + case LD1W_z_p_bz_d_64_scaled: + case LDFF1H_z_p_bz_d_64_scaled: + case LDFF1W_z_p_bz_d_64_scaled: + case LDFF1D_z_p_bz_d_64_scaled: + case LDFF1SH_z_p_bz_d_64_scaled: + case LDFF1SW_z_p_bz_d_64_scaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } -void Simulator::VisitNEONLoadStoreSingleStruct(const Instruction* instr) { - NEONLoadStoreSingleStructHelper(instr, Offset); + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnD, SVE_LSL); } +void Simulator::VisitSVE64BitGatherLoad_ScalarPlus64BitUnscaledOffsets( + const Instruction* instr) { + switch (instr->Mask(SVE64BitGatherLoad_ScalarPlus64BitUnscaledOffsetsMask)) { + case LD1B_z_p_bz_d_64_unscaled: + case LD1D_z_p_bz_d_64_unscaled: + case LD1H_z_p_bz_d_64_unscaled: + case LD1SB_z_p_bz_d_64_unscaled: + case LD1SH_z_p_bz_d_64_unscaled: + case LD1SW_z_p_bz_d_64_unscaled: + case LD1W_z_p_bz_d_64_unscaled: + case LDFF1B_z_p_bz_d_64_unscaled: + case LDFF1D_z_p_bz_d_64_unscaled: + case LDFF1H_z_p_bz_d_64_unscaled: + case LDFF1SB_z_p_bz_d_64_unscaled: + case LDFF1SH_z_p_bz_d_64_unscaled: + case LDFF1SW_z_p_bz_d_64_unscaled: + case LDFF1W_z_p_bz_d_64_unscaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SVEGatherLoadScalarPlusVectorHelper(instr, + kFormatVnD, + NO_SVE_OFFSET_MODIFIER); +} -void Simulator::VisitNEONLoadStoreSingleStructPostIndex( +void Simulator::VisitSVE64BitGatherLoad_ScalarPlusUnpacked32BitUnscaledOffsets( const Instruction* instr) { - NEONLoadStoreSingleStructHelper(instr, PostIndex); + switch (instr->Mask( + SVE64BitGatherLoad_ScalarPlusUnpacked32BitUnscaledOffsetsMask)) { + case LD1B_z_p_bz_d_x32_unscaled: + case LD1D_z_p_bz_d_x32_unscaled: + case LD1H_z_p_bz_d_x32_unscaled: + case LD1SB_z_p_bz_d_x32_unscaled: + case LD1SH_z_p_bz_d_x32_unscaled: + case LD1SW_z_p_bz_d_x32_unscaled: + case LD1W_z_p_bz_d_x32_unscaled: + case LDFF1B_z_p_bz_d_x32_unscaled: + case LDFF1H_z_p_bz_d_x32_unscaled: + case LDFF1W_z_p_bz_d_x32_unscaled: + case LDFF1D_z_p_bz_d_x32_unscaled: + case LDFF1SB_z_p_bz_d_x32_unscaled: + case LDFF1SH_z_p_bz_d_x32_unscaled: + case LDFF1SW_z_p_bz_d_x32_unscaled: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + SVEOffsetModifier mod = (instr->ExtractBit(22) == 1) ? SVE_SXTW : SVE_UXTW; + SVEGatherLoadScalarPlusVectorHelper(instr, kFormatVnD, mod); } +void Simulator::VisitSVE64BitGatherLoad_VectorPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVE64BitGatherLoad_VectorPlusImmMask)) { + case LD1B_z_p_ai_d: + case LD1D_z_p_ai_d: + case LD1H_z_p_ai_d: + case LD1SB_z_p_ai_d: + case LD1SH_z_p_ai_d: + case LD1SW_z_p_ai_d: + case LD1W_z_p_ai_d: + case LDFF1B_z_p_ai_d: + case LDFF1D_z_p_ai_d: + case LDFF1H_z_p_ai_d: + case LDFF1SB_z_p_ai_d: + case LDFF1SH_z_p_ai_d: + case LDFF1SW_z_p_ai_d: + case LDFF1W_z_p_ai_d: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + bool is_signed = instr->ExtractBit(14) == 0; + bool is_ff = instr->ExtractBit(13) == 1; + // Note that these instructions don't use the Dtype encoding. + int msize_in_bytes_log2 = instr->ExtractBits(24, 23); + uint64_t imm = instr->ExtractBits(20, 16) << msize_in_bytes_log2; + LogicSVEAddressVector addr(imm, &ReadVRegister(instr->GetRn()), kFormatVnD); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + if (is_ff) { + VIXL_UNIMPLEMENTED(); + } else { + SVEStructuredLoadHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + is_signed); + } +} -void Simulator::VisitNEONModifiedImmediate(const Instruction* instr) { - SimVRegister& rd = ReadVRegister(instr->GetRd()); - int cmode = instr->GetNEONCmode(); - int cmode_3_1 = (cmode >> 1) & 7; - int cmode_3 = (cmode >> 3) & 1; - int cmode_2 = (cmode >> 2) & 1; - int cmode_1 = (cmode >> 1) & 1; - int cmode_0 = cmode & 1; - int half_enc = instr->ExtractBit(11); - int q = instr->GetNEONQ(); - int op_bit = instr->GetNEONModImmOp(); - uint64_t imm8 = instr->GetImmNEONabcdefgh(); - // Find the format and immediate value - uint64_t imm = 0; - VectorFormat vform = kFormatUndefined; - switch (cmode_3_1) { - case 0x0: - case 0x1: - case 0x2: - case 0x3: - vform = (q == 1) ? kFormat4S : kFormat2S; - imm = imm8 << (8 * cmode_3_1); +void Simulator::VisitSVE64BitGatherPrefetch_ScalarPlus64BitScaledOffsets( + const Instruction* instr) { + switch ( + instr->Mask(SVE64BitGatherPrefetch_ScalarPlus64BitScaledOffsetsMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_bz_d_64_scaled: + case PRFD_i_p_bz_d_64_scaled: + case PRFH_i_p_bz_d_64_scaled: + case PRFW_i_p_bz_d_64_scaled: break; - case 0x4: - case 0x5: - vform = (q == 1) ? kFormat8H : kFormat4H; - imm = imm8 << (8 * cmode_1); + default: + VIXL_UNIMPLEMENTED(); break; - case 0x6: - vform = (q == 1) ? kFormat4S : kFormat2S; - if (cmode_0 == 0) { - imm = imm8 << 8 | 0x000000ff; - } else { - imm = imm8 << 16 | 0x0000ffff; - } + } +} + +void Simulator:: + VisitSVE64BitGatherPrefetch_ScalarPlusUnpacked32BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask( + SVE64BitGatherPrefetch_ScalarPlusUnpacked32BitScaledOffsetsMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_bz_d_x32_scaled: + case PRFD_i_p_bz_d_x32_scaled: + case PRFH_i_p_bz_d_x32_scaled: + case PRFW_i_p_bz_d_x32_scaled: break; - case 0x7: - if (cmode_0 == 0 && op_bit == 0) { - vform = q ? kFormat16B : kFormat8B; - imm = imm8; - } else if (cmode_0 == 0 && op_bit == 1) { - vform = q ? kFormat2D : kFormat1D; - imm = 0; - for (int i = 0; i < 8; ++i) { - if (imm8 & (1 << i)) { - imm |= (UINT64_C(0xff) << (8 * i)); - } - } - } else { // cmode_0 == 1, cmode == 0xf. - if (half_enc == 1) { - vform = q ? kFormat8H : kFormat4H; - imm = Float16ToRawbits(instr->GetImmNEONFP16()); - } else if (op_bit == 0) { - vform = q ? kFormat4S : kFormat2S; - imm = FloatToRawbits(instr->GetImmNEONFP32()); - } else if (q == 1) { - vform = kFormat2D; - imm = DoubleToRawbits(instr->GetImmNEONFP64()); - } else { - VIXL_ASSERT((q == 0) && (op_bit == 1) && (cmode == 0xf)); - VisitUnallocated(instr); - } - } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVE64BitGatherPrefetch_VectorPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVE64BitGatherPrefetch_VectorPlusImmMask)) { + // Ignore prefetch hint instructions. + case PRFB_i_p_ai_d: + case PRFD_i_p_ai_d: + case PRFH_i_p_ai_d: + case PRFW_i_p_ai_d: + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEContiguousFirstFaultLoad_ScalarPlusScalar( + const Instruction* instr) { + bool is_signed; + switch (instr->Mask(SVEContiguousLoad_ScalarPlusScalarMask)) { + case LDFF1B_z_p_br_u8: + case LDFF1B_z_p_br_u16: + case LDFF1B_z_p_br_u32: + case LDFF1B_z_p_br_u64: + case LDFF1H_z_p_br_u16: + case LDFF1H_z_p_br_u32: + case LDFF1H_z_p_br_u64: + case LDFF1W_z_p_br_u32: + case LDFF1W_z_p_br_u64: + case LDFF1D_z_p_br_u64: + is_signed = false; + break; + case LDFF1SB_z_p_br_s16: + case LDFF1SB_z_p_br_s32: + case LDFF1SB_z_p_br_s64: + case LDFF1SH_z_p_br_s32: + case LDFF1SH_z_p_br_s64: + case LDFF1SW_z_p_br_s64: + is_signed = true; + break; + default: + // This encoding group is complete, so no other values should be possible. + VIXL_UNREACHABLE(); + is_signed = false; + break; + } + + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(is_signed); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(is_signed); + VIXL_ASSERT(msize_in_bytes_log2 <= esize_in_bytes_log2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()); + offset <<= msize_in_bytes_log2; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEFaultTolerantLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + kSVEFirstFaultLoad, + is_signed); +} + +void Simulator::VisitSVEContiguousNonFaultLoad_ScalarPlusImm( + const Instruction* instr) { + bool is_signed = false; + switch (instr->Mask(SVEContiguousNonFaultLoad_ScalarPlusImmMask)) { + case LDNF1B_z_p_bi_u16: + case LDNF1B_z_p_bi_u32: + case LDNF1B_z_p_bi_u64: + case LDNF1B_z_p_bi_u8: + case LDNF1D_z_p_bi_u64: + case LDNF1H_z_p_bi_u16: + case LDNF1H_z_p_bi_u32: + case LDNF1H_z_p_bi_u64: + case LDNF1W_z_p_bi_u32: + case LDNF1W_z_p_bi_u64: + break; + case LDNF1SB_z_p_bi_s16: + case LDNF1SB_z_p_bi_s32: + case LDNF1SB_z_p_bi_s64: + case LDNF1SH_z_p_bi_s32: + case LDNF1SH_z_p_bi_s64: + case LDNF1SW_z_p_bi_s64: + is_signed = true; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(is_signed); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(is_signed); + VIXL_ASSERT(msize_in_bytes_log2 <= esize_in_bytes_log2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + int vl = GetVectorLengthInBytes(); + int vl_divisor_log2 = esize_in_bytes_log2 - msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = + (instr->ExtractSignedBits(19, 16) * vl) / (1 << vl_divisor_log2); + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEFaultTolerantLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + kSVENonFaultLoad, + is_signed); +} + +void Simulator::VisitSVEContiguousNonTemporalLoad_ScalarPlusImm( + const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = kFormatUndefined; + + switch (instr->Mask(SVEContiguousNonTemporalLoad_ScalarPlusImmMask)) { + case LDNT1B_z_p_bi_contiguous: + vform = kFormatVnB; + break; + case LDNT1D_z_p_bi_contiguous: + vform = kFormatVnD; + break; + case LDNT1H_z_p_bi_contiguous: + vform = kFormatVnH; + break; + case LDNT1W_z_p_bi_contiguous: + vform = kFormatVnS; break; default: - VIXL_UNREACHABLE(); + VIXL_UNIMPLEMENTED(); break; } + int msize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + int vl = GetVectorLengthInBytes(); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = instr->ExtractSignedBits(19, 16) * vl; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredLoadHelper(vform, + pg, + instr->GetRt(), + addr, + /* is_signed = */ false); +} - // Find the operation - NEONModifiedImmediateOp op; - if (cmode_3 == 0) { - if (cmode_0 == 0) { - op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; - } else { // cmode<0> == '1' - op = op_bit ? NEONModifiedImmediate_BIC : NEONModifiedImmediate_ORR; - } - } else { // cmode<3> == '1' - if (cmode_2 == 0) { - if (cmode_0 == 0) { - op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; - } else { // cmode<0> == '1' - op = op_bit ? NEONModifiedImmediate_BIC : NEONModifiedImmediate_ORR; - } - } else { // cmode<2> == '1' - if (cmode_1 == 0) { - op = op_bit ? NEONModifiedImmediate_MVNI : NEONModifiedImmediate_MOVI; - } else { // cmode<1> == '1' - if (cmode_0 == 0) { - op = NEONModifiedImmediate_MOVI; - } else { // cmode<0> == '1' - op = NEONModifiedImmediate_MOVI; - } - } - } +void Simulator::VisitSVEContiguousNonTemporalLoad_ScalarPlusScalar( + const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = kFormatUndefined; + + switch (instr->Mask(SVEContiguousNonTemporalLoad_ScalarPlusScalarMask)) { + case LDNT1B_z_p_br_contiguous: + vform = kFormatVnB; + break; + case LDNT1D_z_p_br_contiguous: + vform = kFormatVnD; + break; + case LDNT1H_z_p_br_contiguous: + vform = kFormatVnH; + break; + case LDNT1W_z_p_br_contiguous: + vform = kFormatVnS; + break; + default: + VIXL_UNIMPLEMENTED(); + break; } + int msize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()) << msize_in_bytes_log2; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredLoadHelper(vform, + pg, + instr->GetRt(), + addr, + /* is_signed = */ false); +} - // Call the logic function - if (op == NEONModifiedImmediate_ORR) { - orr(vform, rd, rd, imm); - } else if (op == NEONModifiedImmediate_BIC) { - bic(vform, rd, rd, imm); - } else if (op == NEONModifiedImmediate_MOVI) { - movi(vform, rd, imm); - } else if (op == NEONModifiedImmediate_MVNI) { - mvni(vform, rd, imm); - } else { - VisitUnimplemented(instr); +void Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusImm( + const Instruction* instr) { + SimVRegister& zt = ReadVRegister(instr->GetRt()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + uint64_t dwords = 2; + VectorFormat vform_dst = kFormatVnQ; + if ((form_hash_ == "ld1rob_z_p_bi_u8"_h) || + (form_hash_ == "ld1roh_z_p_bi_u16"_h) || + (form_hash_ == "ld1row_z_p_bi_u32"_h) || + (form_hash_ == "ld1rod_z_p_bi_u64"_h)) { + dwords = 4; + vform_dst = kFormatVnO; + } + + uint64_t addr = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = + instr->ExtractSignedBits(19, 16) * dwords * kDRegSizeInBytes; + int msz = instr->ExtractBits(24, 23); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(msz); + + for (unsigned i = 0; i < dwords; i++) { + ld1(kFormatVnD, zt, i, addr + offset + (i * kDRegSizeInBytes)); } + mov_zeroing(vform, zt, pg, zt); + dup_element(vform_dst, zt, zt, 0); } +void Simulator::VisitSVELoadAndBroadcastQOWord_ScalarPlusScalar( + const Instruction* instr) { + SimVRegister& zt = ReadVRegister(instr->GetRt()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); -void Simulator::VisitNEONScalar2RegMisc(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + uint64_t bytes = 16; + VectorFormat vform_dst = kFormatVnQ; + if ((form_hash_ == "ld1rob_z_p_br_contiguous"_h) || + (form_hash_ == "ld1roh_z_p_br_contiguous"_h) || + (form_hash_ == "ld1row_z_p_br_contiguous"_h) || + (form_hash_ == "ld1rod_z_p_br_contiguous"_h)) { + bytes = 32; + vform_dst = kFormatVnO; + } - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); + uint64_t addr = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()); + int msz = instr->ExtractBits(24, 23); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(msz); + offset <<= msz; + for (unsigned i = 0; i < bytes; i++) { + ld1(kFormatVnB, zt, i, addr + offset + i); + } + mov_zeroing(vform, zt, pg, zt); + dup_element(vform_dst, zt, zt, 0); +} - if (instr->Mask(NEON2RegMiscOpcode) <= NEON_NEG_scalar_opcode) { - // These instructions all use a two bit size field, except NOT and RBIT, - // which use the field to encode the operation. - switch (instr->Mask(NEONScalar2RegMiscMask)) { - case NEON_CMEQ_zero_scalar: - cmp(vf, rd, rn, 0, eq); - break; - case NEON_CMGE_zero_scalar: - cmp(vf, rd, rn, 0, ge); - break; - case NEON_CMGT_zero_scalar: - cmp(vf, rd, rn, 0, gt); - break; - case NEON_CMLT_zero_scalar: - cmp(vf, rd, rn, 0, lt); - break; - case NEON_CMLE_zero_scalar: - cmp(vf, rd, rn, 0, le); - break; - case NEON_ABS_scalar: - abs(vf, rd, rn); - break; - case NEON_SQABS_scalar: - abs(vf, rd, rn).SignedSaturate(vf); - break; - case NEON_NEG_scalar: - neg(vf, rd, rn); - break; - case NEON_SQNEG_scalar: - neg(vf, rd, rn).SignedSaturate(vf); - break; - case NEON_SUQADD_scalar: - suqadd(vf, rd, rn); - break; - case NEON_USQADD_scalar: - usqadd(vf, rd, rn); - break; - default: - VIXL_UNIMPLEMENTED(); - break; +void Simulator::VisitSVELoadMultipleStructures_ScalarPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVELoadMultipleStructures_ScalarPlusImmMask)) { + case LD2B_z_p_bi_contiguous: + case LD2D_z_p_bi_contiguous: + case LD2H_z_p_bi_contiguous: + case LD2W_z_p_bi_contiguous: + case LD3B_z_p_bi_contiguous: + case LD3D_z_p_bi_contiguous: + case LD3H_z_p_bi_contiguous: + case LD3W_z_p_bi_contiguous: + case LD4B_z_p_bi_contiguous: + case LD4D_z_p_bi_contiguous: + case LD4H_z_p_bi_contiguous: + case LD4W_z_p_bi_contiguous: { + int vl = GetVectorLengthInBytes(); + int msz = instr->ExtractBits(24, 23); + int reg_count = instr->ExtractBits(22, 21) + 1; + uint64_t offset = instr->ExtractSignedBits(19, 16) * vl * reg_count; + LogicSVEAddressVector addr( + ReadXRegister(instr->GetRn(), Reg31IsStackPointer) + offset); + addr.SetMsizeInBytesLog2(msz); + addr.SetRegCount(reg_count); + SVEStructuredLoadHelper(SVEFormatFromLaneSizeInBytesLog2(msz), + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; } - } else { - VectorFormat fpf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - // These instructions all use a one bit size field, except SQXTUN, SQXTN - // and UQXTN, which use a two bit size field. - switch (instr->Mask(NEONScalar2RegMiscFPMask)) { - case NEON_FRECPE_scalar: - frecpe(fpf, rd, rn, fpcr_rounding); - break; - case NEON_FRECPX_scalar: - frecpx(fpf, rd, rn); - break; - case NEON_FRSQRTE_scalar: - frsqrte(fpf, rd, rn); - break; - case NEON_FCMGT_zero_scalar: - fcmp_zero(fpf, rd, rn, gt); - break; - case NEON_FCMGE_zero_scalar: - fcmp_zero(fpf, rd, rn, ge); - break; - case NEON_FCMEQ_zero_scalar: - fcmp_zero(fpf, rd, rn, eq); - break; - case NEON_FCMLE_zero_scalar: - fcmp_zero(fpf, rd, rn, le); - break; - case NEON_FCMLT_zero_scalar: - fcmp_zero(fpf, rd, rn, lt); - break; - case NEON_SCVTF_scalar: - scvtf(fpf, rd, rn, 0, fpcr_rounding); - break; - case NEON_UCVTF_scalar: - ucvtf(fpf, rd, rn, 0, fpcr_rounding); - break; - case NEON_FCVTNS_scalar: - fcvts(fpf, rd, rn, FPTieEven); - break; - case NEON_FCVTNU_scalar: - fcvtu(fpf, rd, rn, FPTieEven); - break; - case NEON_FCVTPS_scalar: - fcvts(fpf, rd, rn, FPPositiveInfinity); - break; - case NEON_FCVTPU_scalar: - fcvtu(fpf, rd, rn, FPPositiveInfinity); - break; - case NEON_FCVTMS_scalar: - fcvts(fpf, rd, rn, FPNegativeInfinity); - break; - case NEON_FCVTMU_scalar: - fcvtu(fpf, rd, rn, FPNegativeInfinity); - break; - case NEON_FCVTZS_scalar: - fcvts(fpf, rd, rn, FPZero); - break; - case NEON_FCVTZU_scalar: - fcvtu(fpf, rd, rn, FPZero); - break; - case NEON_FCVTAS_scalar: - fcvts(fpf, rd, rn, FPTieAway); - break; - case NEON_FCVTAU_scalar: - fcvtu(fpf, rd, rn, FPTieAway); - break; - case NEON_FCVTXN_scalar: - // Unlike all of the other FP instructions above, fcvtxn encodes dest - // size S as size<0>=1. There's only one case, so we ignore the form. - VIXL_ASSERT(instr->ExtractBit(22) == 1); - fcvtxn(kFormatS, rd, rn); - break; - default: - switch (instr->Mask(NEONScalar2RegMiscMask)) { - case NEON_SQXTN_scalar: - sqxtn(vf, rd, rn); - break; - case NEON_UQXTN_scalar: - uqxtn(vf, rd, rn); - break; - case NEON_SQXTUN_scalar: - sqxtun(vf, rd, rn); - break; - default: - VIXL_UNIMPLEMENTED(); - } +void Simulator::VisitSVELoadMultipleStructures_ScalarPlusScalar( + const Instruction* instr) { + switch (instr->Mask(SVELoadMultipleStructures_ScalarPlusScalarMask)) { + case LD2B_z_p_br_contiguous: + case LD2D_z_p_br_contiguous: + case LD2H_z_p_br_contiguous: + case LD2W_z_p_br_contiguous: + case LD3B_z_p_br_contiguous: + case LD3D_z_p_br_contiguous: + case LD3H_z_p_br_contiguous: + case LD3W_z_p_br_contiguous: + case LD4B_z_p_br_contiguous: + case LD4D_z_p_br_contiguous: + case LD4H_z_p_br_contiguous: + case LD4W_z_p_br_contiguous: { + int msz = instr->ExtractBits(24, 23); + uint64_t offset = ReadXRegister(instr->GetRm()) * (1 << msz); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(msz); + LogicSVEAddressVector addr( + ReadXRegister(instr->GetRn(), Reg31IsStackPointer) + offset); + addr.SetMsizeInBytesLog2(msz); + addr.SetRegCount(instr->ExtractBits(22, 21) + 1); + SVEStructuredLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + false); + break; } + default: + VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVE32BitScatterStore_ScalarPlus32BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask(SVE32BitScatterStore_ScalarPlus32BitScaledOffsetsMask)) { + case ST1H_z_p_bz_s_x32_scaled: + case ST1W_z_p_bz_s_x32_scaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + int scale = instr->ExtractBit(21) * msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + SVEOffsetModifier mod = + (instr->ExtractBit(14) == 1) ? SVE_SXTW : SVE_UXTW; + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnS, + mod, + scale); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnS, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} -void Simulator::VisitNEONScalar2RegMiscFP16(const Instruction* instr) { - VectorFormat fpf = kFormatH; - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); +void Simulator::VisitSVE32BitScatterStore_ScalarPlus32BitUnscaledOffsets( + const Instruction* instr) { + switch ( + instr->Mask(SVE32BitScatterStore_ScalarPlus32BitUnscaledOffsetsMask)) { + case ST1B_z_p_bz_s_x32_unscaled: + case ST1H_z_p_bz_s_x32_unscaled: + case ST1W_z_p_bz_s_x32_unscaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + SVEOffsetModifier mod = + (instr->ExtractBit(14) == 1) ? SVE_SXTW : SVE_UXTW; + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnS, + mod); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnS, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} - switch (instr->Mask(NEONScalar2RegMiscFP16Mask)) { - case NEON_FRECPE_H_scalar: - frecpe(fpf, rd, rn, fpcr_rounding); +void Simulator::VisitSVE32BitScatterStore_VectorPlusImm( + const Instruction* instr) { + int msz = 0; + switch (instr->Mask(SVE32BitScatterStore_VectorPlusImmMask)) { + case ST1B_z_p_ai_s: + msz = 0; break; - case NEON_FRECPX_H_scalar: - frecpx(fpf, rd, rn); + case ST1H_z_p_ai_s: + msz = 1; break; - case NEON_FRSQRTE_H_scalar: - frsqrte(fpf, rd, rn); + case ST1W_z_p_ai_s: + msz = 2; break; - case NEON_FCMGT_H_zero_scalar: - fcmp_zero(fpf, rd, rn, gt); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCMGE_H_zero_scalar: - fcmp_zero(fpf, rd, rn, ge); + } + uint64_t imm = instr->ExtractBits(20, 16) << msz; + LogicSVEAddressVector addr(imm, &ReadVRegister(instr->GetRn()), kFormatVnS); + addr.SetMsizeInBytesLog2(msz); + SVEStructuredStoreHelper(kFormatVnS, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); +} + +void Simulator::VisitSVE64BitScatterStore_ScalarPlus64BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask(SVE64BitScatterStore_ScalarPlus64BitScaledOffsetsMask)) { + case ST1D_z_p_bz_d_64_scaled: + case ST1H_z_p_bz_d_64_scaled: + case ST1W_z_p_bz_d_64_scaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + int scale = instr->ExtractBit(21) * msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnD, + SVE_LSL, + scale); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCMEQ_H_zero_scalar: - fcmp_zero(fpf, rd, rn, eq); + } +} + +void Simulator::VisitSVE64BitScatterStore_ScalarPlus64BitUnscaledOffsets( + const Instruction* instr) { + switch ( + instr->Mask(SVE64BitScatterStore_ScalarPlus64BitUnscaledOffsetsMask)) { + case ST1B_z_p_bz_d_64_unscaled: + case ST1D_z_p_bz_d_64_unscaled: + case ST1H_z_p_bz_d_64_unscaled: + case ST1W_z_p_bz_d_64_unscaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnD, + NO_SVE_OFFSET_MODIFIER); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); break; - case NEON_FCMLE_H_zero_scalar: - fcmp_zero(fpf, rd, rn, le); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCMLT_H_zero_scalar: - fcmp_zero(fpf, rd, rn, lt); + } +} + +void Simulator::VisitSVE64BitScatterStore_ScalarPlusUnpacked32BitScaledOffsets( + const Instruction* instr) { + switch (instr->Mask( + SVE64BitScatterStore_ScalarPlusUnpacked32BitScaledOffsetsMask)) { + case ST1D_z_p_bz_d_x32_scaled: + case ST1H_z_p_bz_d_x32_scaled: + case ST1W_z_p_bz_d_x32_scaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + int scale = instr->ExtractBit(21) * msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + SVEOffsetModifier mod = + (instr->ExtractBit(14) == 1) ? SVE_SXTW : SVE_UXTW; + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnD, + mod, + scale); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); break; - case NEON_SCVTF_H_scalar: - scvtf(fpf, rd, rn, 0, fpcr_rounding); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UCVTF_H_scalar: - ucvtf(fpf, rd, rn, 0, fpcr_rounding); + } +} + +void Simulator:: + VisitSVE64BitScatterStore_ScalarPlusUnpacked32BitUnscaledOffsets( + const Instruction* instr) { + switch (instr->Mask( + SVE64BitScatterStore_ScalarPlusUnpacked32BitUnscaledOffsetsMask)) { + case ST1B_z_p_bz_d_x32_unscaled: + case ST1D_z_p_bz_d_x32_unscaled: + case ST1H_z_p_bz_d_x32_unscaled: + case ST1W_z_p_bz_d_x32_unscaled: { + unsigned msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + VIXL_ASSERT(kDRegSizeInBytesLog2 >= msize_in_bytes_log2); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + SVEOffsetModifier mod = + (instr->ExtractBit(14) == 1) ? SVE_SXTW : SVE_UXTW; + LogicSVEAddressVector addr(base, + &ReadVRegister(instr->GetRm()), + kFormatVnD, + mod); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); break; - case NEON_FCVTNS_H_scalar: - fcvts(fpf, rd, rn, FPTieEven); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCVTNU_H_scalar: - fcvtu(fpf, rd, rn, FPTieEven); + } +} + +void Simulator::VisitSVE64BitScatterStore_VectorPlusImm( + const Instruction* instr) { + int msz = 0; + switch (instr->Mask(SVE64BitScatterStore_VectorPlusImmMask)) { + case ST1B_z_p_ai_d: + msz = 0; break; - case NEON_FCVTPS_H_scalar: - fcvts(fpf, rd, rn, FPPositiveInfinity); + case ST1D_z_p_ai_d: + msz = 3; break; - case NEON_FCVTPU_H_scalar: - fcvtu(fpf, rd, rn, FPPositiveInfinity); + case ST1H_z_p_ai_d: + msz = 1; break; - case NEON_FCVTMS_H_scalar: - fcvts(fpf, rd, rn, FPNegativeInfinity); + case ST1W_z_p_ai_d: + msz = 2; break; - case NEON_FCVTMU_H_scalar: - fcvtu(fpf, rd, rn, FPNegativeInfinity); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCVTZS_H_scalar: - fcvts(fpf, rd, rn, FPZero); + } + uint64_t imm = instr->ExtractBits(20, 16) << msz; + LogicSVEAddressVector addr(imm, &ReadVRegister(instr->GetRn()), kFormatVnD); + addr.SetMsizeInBytesLog2(msz); + SVEStructuredStoreHelper(kFormatVnD, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); +} + +void Simulator::VisitSVEContiguousNonTemporalStore_ScalarPlusImm( + const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = kFormatUndefined; + + switch (instr->Mask(SVEContiguousNonTemporalStore_ScalarPlusImmMask)) { + case STNT1B_z_p_bi_contiguous: + vform = kFormatVnB; break; - case NEON_FCVTZU_H_scalar: - fcvtu(fpf, rd, rn, FPZero); + case STNT1D_z_p_bi_contiguous: + vform = kFormatVnD; break; - case NEON_FCVTAS_H_scalar: - fcvts(fpf, rd, rn, FPTieAway); + case STNT1H_z_p_bi_contiguous: + vform = kFormatVnH; break; - case NEON_FCVTAU_H_scalar: - fcvtu(fpf, rd, rn, FPTieAway); + case STNT1W_z_p_bi_contiguous: + vform = kFormatVnS; + break; + default: + VIXL_UNIMPLEMENTED(); break; } + int msize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + int vl = GetVectorLengthInBytes(); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = instr->ExtractSignedBits(19, 16) * vl; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(vform, pg, instr->GetRt(), addr); } +void Simulator::VisitSVEContiguousNonTemporalStore_ScalarPlusScalar( + const Instruction* instr) { + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + VectorFormat vform = kFormatUndefined; -void Simulator::VisitNEONScalar3Diff(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LongScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); - switch (instr->Mask(NEONScalar3DiffMask)) { - case NEON_SQDMLAL_scalar: - sqdmlal(vf, rd, rn, rm); + switch (instr->Mask(SVEContiguousNonTemporalStore_ScalarPlusScalarMask)) { + case STNT1B_z_p_br_contiguous: + vform = kFormatVnB; break; - case NEON_SQDMLSL_scalar: - sqdmlsl(vf, rd, rn, rm); + case STNT1D_z_p_br_contiguous: + vform = kFormatVnD; break; - case NEON_SQDMULL_scalar: - sqdmull(vf, rd, rn, rm); + case STNT1H_z_p_br_contiguous: + vform = kFormatVnH; + break; + case STNT1W_z_p_br_contiguous: + vform = kFormatVnS; break; default: VIXL_UNIMPLEMENTED(); + break; } + int msize_in_bytes_log2 = LaneSizeInBytesLog2FromFormat(vform); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()) << msize_in_bytes_log2; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(vform, pg, instr->GetRt(), addr); } - -void Simulator::VisitNEONScalar3Same(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); - - if (instr->Mask(NEONScalar3SameFPFMask) == NEONScalar3SameFPFixed) { - vf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); - switch (instr->Mask(NEONScalar3SameFPMask)) { - case NEON_FMULX_scalar: - fmulx(vf, rd, rn, rm); - break; - case NEON_FACGE_scalar: - fabscmp(vf, rd, rn, rm, ge); - break; - case NEON_FACGT_scalar: - fabscmp(vf, rd, rn, rm, gt); - break; - case NEON_FCMEQ_scalar: - fcmp(vf, rd, rn, rm, eq); - break; - case NEON_FCMGE_scalar: - fcmp(vf, rd, rn, rm, ge); - break; - case NEON_FCMGT_scalar: - fcmp(vf, rd, rn, rm, gt); - break; - case NEON_FRECPS_scalar: - frecps(vf, rd, rn, rm); - break; - case NEON_FRSQRTS_scalar: - frsqrts(vf, rd, rn, rm); - break; - case NEON_FABD_scalar: - fabd(vf, rd, rn, rm); - break; - default: - VIXL_UNIMPLEMENTED(); +void Simulator::VisitSVEContiguousStore_ScalarPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVEContiguousStore_ScalarPlusImmMask)) { + case ST1B_z_p_bi: + case ST1D_z_p_bi: + case ST1H_z_p_bi: + case ST1W_z_p_bi: { + int vl = GetVectorLengthInBytes(); + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(false); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(false); + VIXL_ASSERT(esize_in_bytes_log2 >= msize_in_bytes_log2); + int vl_divisor_log2 = esize_in_bytes_log2 - msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = + (instr->ExtractSignedBits(19, 16) * vl) / (1 << vl_divisor_log2); + VectorFormat vform = + SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredStoreHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; } - } else { - switch (instr->Mask(NEONScalar3SameMask)) { - case NEON_ADD_scalar: - add(vf, rd, rn, rm); - break; - case NEON_SUB_scalar: - sub(vf, rd, rn, rm); - break; - case NEON_CMEQ_scalar: - cmp(vf, rd, rn, rm, eq); - break; - case NEON_CMGE_scalar: - cmp(vf, rd, rn, rm, ge); - break; - case NEON_CMGT_scalar: - cmp(vf, rd, rn, rm, gt); - break; - case NEON_CMHI_scalar: - cmp(vf, rd, rn, rm, hi); - break; - case NEON_CMHS_scalar: - cmp(vf, rd, rn, rm, hs); - break; - case NEON_CMTST_scalar: - cmptst(vf, rd, rn, rm); - break; - case NEON_USHL_scalar: - ushl(vf, rd, rn, rm); - break; - case NEON_SSHL_scalar: - sshl(vf, rd, rn, rm); - break; - case NEON_SQDMULH_scalar: - sqdmulh(vf, rd, rn, rm); - break; - case NEON_SQRDMULH_scalar: - sqrdmulh(vf, rd, rn, rm); - break; - case NEON_UQADD_scalar: - add(vf, rd, rn, rm).UnsignedSaturate(vf); - break; - case NEON_SQADD_scalar: - add(vf, rd, rn, rm).SignedSaturate(vf); - break; - case NEON_UQSUB_scalar: - sub(vf, rd, rn, rm).UnsignedSaturate(vf); - break; - case NEON_SQSUB_scalar: - sub(vf, rd, rn, rm).SignedSaturate(vf); - break; - case NEON_UQSHL_scalar: - ushl(vf, rd, rn, rm).UnsignedSaturate(vf); - break; - case NEON_SQSHL_scalar: - sshl(vf, rd, rn, rm).SignedSaturate(vf); - break; - case NEON_URSHL_scalar: - ushl(vf, rd, rn, rm).Round(vf); - break; - case NEON_SRSHL_scalar: - sshl(vf, rd, rn, rm).Round(vf); - break; - case NEON_UQRSHL_scalar: - ushl(vf, rd, rn, rm).Round(vf).UnsignedSaturate(vf); - break; - case NEON_SQRSHL_scalar: - sshl(vf, rd, rn, rm).Round(vf).SignedSaturate(vf); - break; - default: - VIXL_UNIMPLEMENTED(); + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEContiguousStore_ScalarPlusScalar( + const Instruction* instr) { + switch (instr->Mask(SVEContiguousStore_ScalarPlusScalarMask)) { + case ST1B_z_p_br: + case ST1D_z_p_br: + case ST1H_z_p_br: + case ST1W_z_p_br: { + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()); + offset <<= instr->ExtractBits(24, 23); + VectorFormat vform = + SVEFormatFromLaneSizeInBytesLog2(instr->ExtractBits(22, 21)); + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(instr->ExtractBits(24, 23)); + SVEStructuredStoreHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); + break; } + default: + VIXL_UNIMPLEMENTED(); + break; } } -void Simulator::VisitNEONScalar3SameFP16(const Instruction* instr) { - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); +void Simulator::VisitSVECopySIMDFPScalarRegisterToVector_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister z_result; - switch (instr->Mask(NEONScalar3SameFP16Mask)) { - case NEON_FABD_H_scalar: - fabd(kFormatH, rd, rn, rm); + switch (instr->Mask(SVECopySIMDFPScalarRegisterToVector_PredicatedMask)) { + case CPY_z_p_v: + dup_element(vform, z_result, ReadVRegister(instr->GetRn()), 0); + mov_merging(vform, ReadVRegister(instr->GetRd()), pg, z_result); break; - case NEON_FMULX_H_scalar: - fmulx(kFormatH, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCMEQ_H_scalar: - fcmp(kFormatH, rd, rn, rm, eq); + } +} + +void Simulator::VisitSVEStoreMultipleStructures_ScalarPlusImm( + const Instruction* instr) { + switch (instr->Mask(SVEStoreMultipleStructures_ScalarPlusImmMask)) { + case ST2B_z_p_bi_contiguous: + case ST2D_z_p_bi_contiguous: + case ST2H_z_p_bi_contiguous: + case ST2W_z_p_bi_contiguous: + case ST3B_z_p_bi_contiguous: + case ST3D_z_p_bi_contiguous: + case ST3H_z_p_bi_contiguous: + case ST3W_z_p_bi_contiguous: + case ST4B_z_p_bi_contiguous: + case ST4D_z_p_bi_contiguous: + case ST4H_z_p_bi_contiguous: + case ST4W_z_p_bi_contiguous: { + int vl = GetVectorLengthInBytes(); + int msz = instr->ExtractBits(24, 23); + int reg_count = instr->ExtractBits(22, 21) + 1; + uint64_t offset = instr->ExtractSignedBits(19, 16) * vl * reg_count; + LogicSVEAddressVector addr( + ReadXRegister(instr->GetRn(), Reg31IsStackPointer) + offset); + addr.SetMsizeInBytesLog2(msz); + addr.SetRegCount(reg_count); + SVEStructuredStoreHelper(SVEFormatFromLaneSizeInBytesLog2(msz), + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); break; - case NEON_FCMGE_H_scalar: - fcmp(kFormatH, rd, rn, rm, ge); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCMGT_H_scalar: - fcmp(kFormatH, rd, rn, rm, gt); + } +} + +void Simulator::VisitSVEStoreMultipleStructures_ScalarPlusScalar( + const Instruction* instr) { + switch (instr->Mask(SVEStoreMultipleStructures_ScalarPlusScalarMask)) { + case ST2B_z_p_br_contiguous: + case ST2D_z_p_br_contiguous: + case ST2H_z_p_br_contiguous: + case ST2W_z_p_br_contiguous: + case ST3B_z_p_br_contiguous: + case ST3D_z_p_br_contiguous: + case ST3H_z_p_br_contiguous: + case ST3W_z_p_br_contiguous: + case ST4B_z_p_br_contiguous: + case ST4D_z_p_br_contiguous: + case ST4H_z_p_br_contiguous: + case ST4W_z_p_br_contiguous: { + int msz = instr->ExtractBits(24, 23); + uint64_t offset = ReadXRegister(instr->GetRm()) * (1 << msz); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(msz); + LogicSVEAddressVector addr( + ReadXRegister(instr->GetRn(), Reg31IsStackPointer) + offset); + addr.SetMsizeInBytesLog2(msz); + addr.SetRegCount(instr->ExtractBits(22, 21) + 1); + SVEStructuredStoreHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr); break; - case NEON_FACGE_H_scalar: - fabscmp(kFormatH, rd, rn, rm, ge); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FACGT_H_scalar: - fabscmp(kFormatH, rd, rn, rm, gt); + } +} + +void Simulator::VisitSVEStorePredicateRegister(const Instruction* instr) { + switch (instr->Mask(SVEStorePredicateRegisterMask)) { + case STR_p_bi: { + SimPRegister& pt = ReadPRegister(instr->GetPt()); + int pl = GetPredicateLengthInBytes(); + int imm9 = (instr->ExtractBits(21, 16) << 3) | instr->ExtractBits(12, 10); + uint64_t multiplier = ExtractSignedBitfield64(8, 0, imm9); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t address = base + multiplier * pl; + for (int i = 0; i < pl; i++) { + MemWrite(address + i, pt.GetLane(i)); + } + LogPWrite(instr->GetPt(), address); break; - case NEON_FRECPS_H_scalar: - frecps(kFormatH, rd, rn, rm); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FRSQRTS_H_scalar: - frsqrts(kFormatH, rd, rn, rm); + } +} + +void Simulator::VisitSVEStoreVectorRegister(const Instruction* instr) { + switch (instr->Mask(SVEStoreVectorRegisterMask)) { + case STR_z_bi: { + SimVRegister& zt = ReadVRegister(instr->GetRt()); + int vl = GetVectorLengthInBytes(); + int imm9 = (instr->ExtractBits(21, 16) << 3) | instr->ExtractBits(12, 10); + uint64_t multiplier = ExtractSignedBitfield64(8, 0, imm9); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t address = base + multiplier * vl; + for (int i = 0; i < vl; i++) { + MemWrite(address + i, zt.GetLane(i)); + } + LogZWrite(instr->GetRt(), address); break; + } default: - VIXL_UNREACHABLE(); + VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVEMulIndex(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zda = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + std::pair zm_and_index = instr->GetSVEMulZmAndIndex(); + SimVRegister zm = ReadVRegister(zm_and_index.first); + int index = zm_and_index.second; -void Simulator::VisitNEONScalar3SameExtra(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::ScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + SimVRegister temp; + dup_elements_to_segments(vform, temp, zm, index); - switch (instr->Mask(NEONScalar3SameExtraMask)) { - case NEON_SQRDMLAH_scalar: - sqrdmlah(vf, rd, rn, rm); + switch (form_hash_) { + case "sdot_z_zzzi_d"_h: + case "sdot_z_zzzi_s"_h: + sdot(vform, zda, zn, temp); break; - case NEON_SQRDMLSH_scalar: - sqrdmlsh(vf, rd, rn, rm); + case "udot_z_zzzi_d"_h: + case "udot_z_zzzi_s"_h: + udot(vform, zda, zn, temp); + break; + case "sudot_z_zzzi_s"_h: + usdot(vform, zda, temp, zn); + break; + case "usdot_z_zzzi_s"_h: + usdot(vform, zda, zn, temp); break; default: VIXL_UNIMPLEMENTED(); + break; } } -void Simulator::VisitNEONScalarByIndexedElement(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LongScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); - VectorFormat vf_r = nfd.GetVectorFormat(nfd.ScalarFormatMap()); - - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - ByElementOp Op = NULL; - - int rm_reg = instr->GetRm(); - int index = (instr->GetNEONH() << 1) | instr->GetNEONL(); - if (instr->GetNEONSize() == 1) { - rm_reg &= 0xf; - index = (index << 1) | instr->GetNEONM(); - } +void Simulator::SimulateMatrixMul(const Instruction* instr) { + VectorFormat vform = kFormatVnS; + SimVRegister& dn = ReadVRegister(instr->GetRd()); + SimVRegister& n = ReadVRegister(instr->GetRn()); + SimVRegister& m = ReadVRegister(instr->GetRm()); - switch (instr->Mask(NEONScalarByIndexedElementMask)) { - case NEON_SQDMULL_byelement_scalar: - Op = &Simulator::sqdmull; + bool n_signed = false; + bool m_signed = false; + switch (form_hash_) { + case "smmla_asimdsame2_g"_h: + vform = kFormat4S; + VIXL_FALLTHROUGH(); + case "smmla_z_zzz"_h: + n_signed = m_signed = true; break; - case NEON_SQDMLAL_byelement_scalar: - Op = &Simulator::sqdmlal; + case "ummla_asimdsame2_g"_h: + vform = kFormat4S; + VIXL_FALLTHROUGH(); + case "ummla_z_zzz"_h: + // Nothing to do. break; - case NEON_SQDMLSL_byelement_scalar: - Op = &Simulator::sqdmlsl; + case "usmmla_asimdsame2_g"_h: + vform = kFormat4S; + VIXL_FALLTHROUGH(); + case "usmmla_z_zzz"_h: + m_signed = true; break; - case NEON_SQDMULH_byelement_scalar: - Op = &Simulator::sqdmulh; - vf = vf_r; + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQRDMULH_byelement_scalar: - Op = &Simulator::sqrdmulh; - vf = vf_r; + } + matmul(vform, dn, n, m, n_signed, m_signed); +} + +void Simulator::SimulateSVEFPMatrixMul(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + switch (form_hash_) { + case "fmmla_z_zzz_s"_h: + case "fmmla_z_zzz_d"_h: + fmatmul(vform, zdn, zn, zm); break; - case NEON_SQRDMLAH_byelement_scalar: - Op = &Simulator::sqrdmlah; - vf = vf_r; + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQRDMLSH_byelement_scalar: - Op = &Simulator::sqrdmlsh; - vf = vf_r; + } +} + +void Simulator::VisitSVEPartitionBreakCondition(const Instruction* instr) { + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + SimPRegister result; + + switch (instr->Mask(SVEPartitionBreakConditionMask)) { + case BRKAS_p_p_p_z: + case BRKA_p_p_p: + brka(result, pg, pn); + break; + case BRKBS_p_p_p_z: + case BRKB_p_p_p: + brkb(result, pg, pn); break; default: - vf = nfd.GetVectorFormat(nfd.FPScalarFormatMap()); - index = instr->GetNEONH(); - if (instr->GetFPType() == 0) { - index = (index << 2) | (instr->GetNEONL() << 1) | instr->GetNEONM(); - rm_reg &= 0xf; - vf = kFormatH; - } else if ((instr->GetFPType() & 1) == 0) { - index = (index << 1) | instr->GetNEONL(); - } - switch (instr->Mask(NEONScalarByIndexedElementFPMask)) { - case NEON_FMUL_H_byelement_scalar: - case NEON_FMUL_byelement_scalar: - Op = &Simulator::fmul; - break; - case NEON_FMLA_H_byelement_scalar: - case NEON_FMLA_byelement_scalar: - Op = &Simulator::fmla; - break; - case NEON_FMLS_H_byelement_scalar: - case NEON_FMLS_byelement_scalar: - Op = &Simulator::fmls; - break; - case NEON_FMULX_H_byelement_scalar: - case NEON_FMULX_byelement_scalar: - Op = &Simulator::fmulx; - break; - default: - VIXL_UNIMPLEMENTED(); - } + VIXL_UNIMPLEMENTED(); + break; } - (this->*Op)(vf, rd, rn, ReadVRegister(rm_reg), index); + if (instr->ExtractBit(4) == 1) { + mov_merging(pd, pg, result); + } else { + mov_zeroing(pd, pg, result); + } + + // Set flag if needed. + if (instr->ExtractBit(22) == 1) { + PredTest(kFormatVnB, pg, pd); + } } +void Simulator::VisitSVEPropagateBreakToNextPartition( + const Instruction* instr) { + SimPRegister& pdm = ReadPRegister(instr->GetPd()); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimPRegister& pn = ReadPRegister(instr->GetPn()); -void Simulator::VisitNEONScalarCopy(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::TriangularScalarFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + switch (instr->Mask(SVEPropagateBreakToNextPartitionMask)) { + case BRKNS_p_p_pp: + case BRKN_p_p_pp: + brkn(pdm, pg, pn); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); + // Set flag if needed. + if (instr->ExtractBit(22) == 1) { + // Note that this ignores `pg`. + PredTest(kFormatVnB, GetPTrue(), pdm); + } +} - if (instr->Mask(NEONScalarCopyMask) == NEON_DUP_ELEMENT_scalar) { - int imm5 = instr->GetImmNEON5(); - int tz = CountTrailingZeros(imm5, 32); - int rn_index = imm5 >> (tz + 1); - dup_element(vf, rd, rn, rn_index); - } else { - VIXL_UNIMPLEMENTED(); +void Simulator::VisitSVEUnpackPredicateElements(const Instruction* instr) { + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + + SimVRegister temp = Simulator::ExpandToSimVRegister(pn); + SimVRegister zero; + dup_immediate(kFormatVnB, zero, 0); + + switch (instr->Mask(SVEUnpackPredicateElementsMask)) { + case PUNPKHI_p_p: + zip2(kFormatVnB, temp, temp, zero); + break; + case PUNPKLO_p_p: + zip1(kFormatVnB, temp, temp, zero); + break; + default: + VIXL_UNIMPLEMENTED(); + break; } + Simulator::ExtractFromSimVRegister(kFormatVnB, pd, temp); } +void Simulator::VisitSVEPermutePredicateElements(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + SimPRegister& pm = ReadPRegister(instr->GetPm()); -void Simulator::VisitNEONScalarPairwise(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::FPScalarPairwiseFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + SimVRegister temp0 = Simulator::ExpandToSimVRegister(pn); + SimVRegister temp1 = Simulator::ExpandToSimVRegister(pm); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - switch (instr->Mask(NEONScalarPairwiseMask)) { - case NEON_ADDP_scalar: { - // All pairwise operations except ADDP use bit U to differentiate FP16 - // from FP32/FP64 variations. - NEONFormatDecoder nfd_addp(instr, NEONFormatDecoder::FPScalarFormatMap()); - addp(nfd_addp.GetVectorFormat(), rd, rn); + switch (instr->Mask(SVEPermutePredicateElementsMask)) { + case TRN1_p_pp: + trn1(vform, temp0, temp0, temp1); break; - } - case NEON_FADDP_h_scalar: - case NEON_FADDP_scalar: - faddp(vf, rd, rn); + case TRN2_p_pp: + trn2(vform, temp0, temp0, temp1); break; - case NEON_FMAXP_h_scalar: - case NEON_FMAXP_scalar: - fmaxp(vf, rd, rn); + case UZP1_p_pp: + uzp1(vform, temp0, temp0, temp1); break; - case NEON_FMAXNMP_h_scalar: - case NEON_FMAXNMP_scalar: - fmaxnmp(vf, rd, rn); + case UZP2_p_pp: + uzp2(vform, temp0, temp0, temp1); break; - case NEON_FMINP_h_scalar: - case NEON_FMINP_scalar: - fminp(vf, rd, rn); + case ZIP1_p_pp: + zip1(vform, temp0, temp0, temp1); break; - case NEON_FMINNMP_h_scalar: - case NEON_FMINNMP_scalar: - fminnmp(vf, rd, rn); + case ZIP2_p_pp: + zip2(vform, temp0, temp0, temp1); break; default: VIXL_UNIMPLEMENTED(); + break; } + Simulator::ExtractFromSimVRegister(kFormatVnB, pd, temp0); } +void Simulator::VisitSVEReversePredicateElements(const Instruction* instr) { + switch (instr->Mask(SVEReversePredicateElementsMask)) { + case REV_p_p: { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimVRegister temp = Simulator::ExpandToSimVRegister(pn); + rev(vform, temp, temp); + Simulator::ExtractFromSimVRegister(kFormatVnB, pd, temp); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} -void Simulator::VisitNEONScalarShiftImmediate(const Instruction* instr) { - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); +void Simulator::VisitSVEPermuteVectorExtract(const Instruction* instr) { + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + // Second source register "Zm" is encoded where "Zn" would usually be. + SimVRegister& zm = ReadVRegister(instr->GetRn()); - static const NEONFormatMap map = {{22, 21, 20, 19}, - {NF_UNDEF, - NF_B, - NF_H, - NF_H, - NF_S, - NF_S, - NF_S, - NF_S, - NF_D, - NF_D, - NF_D, - NF_D, - NF_D, - NF_D, - NF_D, - NF_D}}; - NEONFormatDecoder nfd(instr, &map); - VectorFormat vf = nfd.GetVectorFormat(); + int index = instr->GetSVEExtractImmediate(); + int vl = GetVectorLengthInBytes(); + index = (index >= vl) ? 0 : index; - int highestSetBit = HighestSetBitPosition(instr->GetImmNEONImmh()); - int immhimmb = instr->GetImmNEONImmhImmb(); - int right_shift = (16 << highestSetBit) - immhimmb; - int left_shift = immhimmb - (8 << highestSetBit); - switch (instr->Mask(NEONScalarShiftImmediateMask)) { - case NEON_SHL_scalar: - shl(vf, rd, rn, left_shift); + switch (instr->Mask(SVEPermuteVectorExtractMask)) { + case EXT_z_zi_des: + ext(kFormatVnB, zdn, zdn, zm, index); break; - case NEON_SLI_scalar: - sli(vf, rd, rn, left_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQSHL_imm_scalar: - sqshl(vf, rd, rn, left_shift); + } +} + +void Simulator::VisitSVEPermuteVectorInterleaving(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + switch (instr->Mask(SVEPermuteVectorInterleavingMask)) { + case TRN1_z_zz: + trn1(vform, zd, zn, zm); break; - case NEON_UQSHL_imm_scalar: - uqshl(vf, rd, rn, left_shift); + case TRN2_z_zz: + trn2(vform, zd, zn, zm); break; - case NEON_SQSHLU_scalar: - sqshlu(vf, rd, rn, left_shift); + case UZP1_z_zz: + uzp1(vform, zd, zn, zm); break; - case NEON_SRI_scalar: - sri(vf, rd, rn, right_shift); + case UZP2_z_zz: + uzp2(vform, zd, zn, zm); break; - case NEON_SSHR_scalar: - sshr(vf, rd, rn, right_shift); + case ZIP1_z_zz: + zip1(vform, zd, zn, zm); break; - case NEON_USHR_scalar: - ushr(vf, rd, rn, right_shift); + case ZIP2_z_zz: + zip2(vform, zd, zn, zm); break; - case NEON_SRSHR_scalar: - sshr(vf, rd, rn, right_shift).Round(vf); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_URSHR_scalar: - ushr(vf, rd, rn, right_shift).Round(vf); + } +} + +void Simulator::VisitSVEConditionallyBroadcastElementToVector( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + int active_offset = -1; + switch (instr->Mask(SVEConditionallyBroadcastElementToVectorMask)) { + case CLASTA_z_p_zz: + active_offset = 1; break; - case NEON_SSRA_scalar: - ssra(vf, rd, rn, right_shift); + case CLASTB_z_p_zz: + active_offset = 0; break; - case NEON_USRA_scalar: - usra(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SRSRA_scalar: - srsra(vf, rd, rn, right_shift); + } + + if (active_offset >= 0) { + std::pair value = clast(vform, pg, zm, active_offset); + if (value.first) { + dup_immediate(vform, zdn, value.second); + } else { + // Trigger a line of trace for the operation, even though it doesn't + // change the register value. + mov(vform, zdn, zdn); + } + } +} + +void Simulator::VisitSVEConditionallyExtractElementToSIMDFPScalar( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& vdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + int active_offset = -1; + switch (instr->Mask(SVEConditionallyExtractElementToSIMDFPScalarMask)) { + case CLASTA_v_p_z: + active_offset = 1; break; - case NEON_URSRA_scalar: - ursra(vf, rd, rn, right_shift); + case CLASTB_v_p_z: + active_offset = 0; + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + if (active_offset >= 0) { + LogicVRegister dst(vdn); + uint64_t src1_value = dst.Uint(vform, 0); + std::pair src2_value = clast(vform, pg, zm, active_offset); + dup_immediate(vform, vdn, 0); + dst.SetUint(vform, 0, src2_value.first ? src2_value.second : src1_value); + } +} + +void Simulator::VisitSVEConditionallyExtractElementToGeneralRegister( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + int active_offset = -1; + switch (instr->Mask(SVEConditionallyExtractElementToGeneralRegisterMask)) { + case CLASTA_r_p_z: + active_offset = 1; + break; + case CLASTB_r_p_z: + active_offset = 0; break; - case NEON_UQSHRN_scalar: - uqshrn(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UQRSHRN_scalar: - uqrshrn(vf, rd, rn, right_shift); + } + + if (active_offset >= 0) { + std::pair value = clast(vform, pg, zm, active_offset); + uint64_t masked_src = ReadXRegister(instr->GetRd()) & + GetUintMask(LaneSizeInBitsFromFormat(vform)); + WriteXRegister(instr->GetRd(), value.first ? value.second : masked_src); + } +} + +void Simulator::VisitSVEExtractElementToSIMDFPScalarRegister( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& vdn = ReadVRegister(instr->GetRd()); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + int active_offset = -1; + switch (instr->Mask(SVEExtractElementToSIMDFPScalarRegisterMask)) { + case LASTA_v_p_z: + active_offset = 1; break; - case NEON_SQSHRN_scalar: - sqshrn(vf, rd, rn, right_shift); + case LASTB_v_p_z: + active_offset = 0; break; - case NEON_SQRSHRN_scalar: - sqrshrn(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQSHRUN_scalar: - sqshrun(vf, rd, rn, right_shift); + } + + if (active_offset >= 0) { + LogicVRegister dst(vdn); + std::pair value = clast(vform, pg, zm, active_offset); + dup_immediate(vform, vdn, 0); + dst.SetUint(vform, 0, value.second); + } +} + +void Simulator::VisitSVEExtractElementToGeneralRegister( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zm = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + int active_offset = -1; + switch (instr->Mask(SVEExtractElementToGeneralRegisterMask)) { + case LASTA_r_p_z: + active_offset = 1; break; - case NEON_SQRSHRUN_scalar: - sqrshrun(vf, rd, rn, right_shift); + case LASTB_r_p_z: + active_offset = 0; break; - case NEON_FCVTZS_imm_scalar: - fcvts(vf, rd, rn, FPZero, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCVTZU_imm_scalar: - fcvtu(vf, rd, rn, FPZero, right_shift); + } + + if (active_offset >= 0) { + std::pair value = clast(vform, pg, zm, active_offset); + WriteXRegister(instr->GetRd(), value.second); + } +} + +void Simulator::VisitSVECompressActiveElements(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + switch (instr->Mask(SVECompressActiveElementsMask)) { + case COMPACT_z_p_z: + compact(vform, zd, pg, zn); break; - case NEON_SCVTF_imm_scalar: - scvtf(vf, rd, rn, right_shift, fpcr_rounding); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UCVTF_imm_scalar: - ucvtf(vf, rd, rn, right_shift, fpcr_rounding); + } +} + +void Simulator::VisitSVECopyGeneralRegisterToVector_Predicated( + const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister z_result; + + switch (instr->Mask(SVECopyGeneralRegisterToVector_PredicatedMask)) { + case CPY_z_p_r: + dup_immediate(vform, + z_result, + ReadXRegister(instr->GetRn(), Reg31IsStackPointer)); + mov_merging(vform, ReadVRegister(instr->GetRd()), pg, z_result); break; default: VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVECopyIntImm_Predicated(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(19, 16)); + SimVRegister& zd = ReadVRegister(instr->GetRd()); -void Simulator::VisitNEONShiftImmediate(const Instruction* instr) { - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - FPRounding fpcr_rounding = static_cast(ReadFpcr().GetRMode()); + SimVRegister result; + switch (instr->Mask(SVECopyIntImm_PredicatedMask)) { + case CPY_z_p_i: { + // Use unsigned arithmetic to avoid undefined behaviour during the shift. + uint64_t imm8 = instr->GetImmSVEIntWideSigned(); + dup_immediate(vform, result, imm8 << (instr->ExtractBit(13) * 8)); + break; + } + default: + VIXL_UNIMPLEMENTED(); + break; + } - // 00010->8B, 00011->16B, 001x0->4H, 001x1->8H, - // 01xx0->2S, 01xx1->4S, 1xxx1->2D, all others undefined. - static const NEONFormatMap map = {{22, 21, 20, 19, 30}, - {NF_UNDEF, NF_UNDEF, NF_8B, NF_16B, - NF_4H, NF_8H, NF_4H, NF_8H, - NF_2S, NF_4S, NF_2S, NF_4S, - NF_2S, NF_4S, NF_2S, NF_4S, - NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, - NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, - NF_UNDEF, NF_2D, NF_UNDEF, NF_2D, - NF_UNDEF, NF_2D, NF_UNDEF, NF_2D}}; - NEONFormatDecoder nfd(instr, &map); - VectorFormat vf = nfd.GetVectorFormat(); + if (instr->ExtractBit(14) != 0) { + mov_merging(vform, zd, pg, result); + } else { + mov_zeroing(vform, zd, pg, result); + } +} - // 0001->8H, 001x->4S, 01xx->2D, all others undefined. - static const NEONFormatMap map_l = - {{22, 21, 20, 19}, - {NF_UNDEF, NF_8H, NF_4S, NF_4S, NF_2D, NF_2D, NF_2D, NF_2D}}; - VectorFormat vf_l = nfd.GetVectorFormat(&map_l); +void Simulator::VisitSVEReverseWithinElements(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + SimVRegister result; - int highestSetBit = HighestSetBitPosition(instr->GetImmNEONImmh()); - int immhimmb = instr->GetImmNEONImmhImmb(); - int right_shift = (16 << highestSetBit) - immhimmb; - int left_shift = immhimmb - (8 << highestSetBit); + // In NEON, the chunk size in which elements are REVersed is in the + // instruction mnemonic, and the element size attached to the register. + // SVE reverses the semantics; the mapping to logic functions below is to + // account for this. + VectorFormat chunk_form = instr->GetSVEVectorFormat(); + VectorFormat element_form = kFormatUndefined; - switch (instr->Mask(NEONShiftImmediateMask)) { - case NEON_SHL: - shl(vf, rd, rn, left_shift); + switch (instr->Mask(SVEReverseWithinElementsMask)) { + case RBIT_z_p_z: + rbit(chunk_form, result, zn); break; - case NEON_SLI: - sli(vf, rd, rn, left_shift); + case REVB_z_z: + VIXL_ASSERT((chunk_form == kFormatVnH) || (chunk_form == kFormatVnS) || + (chunk_form == kFormatVnD)); + element_form = kFormatVnB; break; - case NEON_SQSHLU: - sqshlu(vf, rd, rn, left_shift); + case REVH_z_z: + VIXL_ASSERT((chunk_form == kFormatVnS) || (chunk_form == kFormatVnD)); + element_form = kFormatVnH; break; - case NEON_SRI: - sri(vf, rd, rn, right_shift); + case REVW_z_z: + VIXL_ASSERT(chunk_form == kFormatVnD); + element_form = kFormatVnS; break; - case NEON_SSHR: - sshr(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_USHR: - ushr(vf, rd, rn, right_shift); + } + + if (instr->Mask(SVEReverseWithinElementsMask) != RBIT_z_p_z) { + VIXL_ASSERT(element_form != kFormatUndefined); + switch (chunk_form) { + case kFormatVnH: + rev16(element_form, result, zn); + break; + case kFormatVnS: + rev32(element_form, result, zn); + break; + case kFormatVnD: + rev64(element_form, result, zn); + break; + default: + VIXL_UNIMPLEMENTED(); + } + } + + mov_merging(chunk_form, zd, pg, result); +} + +void Simulator::VisitSVEVectorSplice(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zn2 = ReadVRegister((instr->GetRn() + 1) % kNumberOfZRegisters); + SimPRegister& pg = ReadPRegister(instr->GetPgLow8()); + + switch (form_hash_) { + case "splice_z_p_zz_des"_h: + splice(vform, zd, pg, zd, zn); break; - case NEON_SRSHR: - sshr(vf, rd, rn, right_shift).Round(vf); + case "splice_z_p_zz_con"_h: + splice(vform, zd, pg, zn, zn2); break; - case NEON_URSHR: - ushr(vf, rd, rn, right_shift).Round(vf); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SSRA: - ssra(vf, rd, rn, right_shift); + } +} + +void Simulator::VisitSVEBroadcastGeneralRegister(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + switch (instr->Mask(SVEBroadcastGeneralRegisterMask)) { + case DUP_z_r: + dup_immediate(instr->GetSVEVectorFormat(), + zd, + ReadXRegister(instr->GetRn(), Reg31IsStackPointer)); break; - case NEON_USRA: - usra(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SRSRA: - srsra(vf, rd, rn, right_shift); + } +} + +void Simulator::VisitSVEInsertSIMDFPScalarRegister(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + VectorFormat vform = instr->GetSVEVectorFormat(); + switch (instr->Mask(SVEInsertSIMDFPScalarRegisterMask)) { + case INSR_z_v: + insr(vform, zd, ReadDRegisterBits(instr->GetRn())); break; - case NEON_URSRA: - ursra(vf, rd, rn, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQSHL_imm: - sqshl(vf, rd, rn, left_shift); + } +} + +void Simulator::VisitSVEInsertGeneralRegister(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + VectorFormat vform = instr->GetSVEVectorFormat(); + switch (instr->Mask(SVEInsertGeneralRegisterMask)) { + case INSR_z_r: + insr(vform, zd, ReadXRegister(instr->GetRn())); break; - case NEON_UQSHL_imm: - uqshl(vf, rd, rn, left_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SCVTF_imm: - scvtf(vf, rd, rn, right_shift, fpcr_rounding); + } +} + +void Simulator::VisitSVEBroadcastIndexElement(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + switch (instr->Mask(SVEBroadcastIndexElementMask)) { + case DUP_z_zi: { + std::pair index_and_lane_size = + instr->GetSVEPermuteIndexAndLaneSizeLog2(); + int index = index_and_lane_size.first; + int lane_size_in_bytes_log_2 = index_and_lane_size.second; + VectorFormat vform = + SVEFormatFromLaneSizeInBytesLog2(lane_size_in_bytes_log_2); + if ((index < 0) || (index >= LaneCountFromFormat(vform))) { + // Out of bounds, set the destination register to zero. + dup_immediate(kFormatVnD, zd, 0); + } else { + dup_element(vform, zd, ReadVRegister(instr->GetRn()), index); + } + return; + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UCVTF_imm: - ucvtf(vf, rd, rn, right_shift, fpcr_rounding); + } +} + +void Simulator::VisitSVEReverseVectorElements(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + VectorFormat vform = instr->GetSVEVectorFormat(); + switch (instr->Mask(SVEReverseVectorElementsMask)) { + case REV_z_z: + rev(vform, zd, ReadVRegister(instr->GetRn())); break; - case NEON_FCVTZS_imm: - fcvts(vf, rd, rn, FPZero, right_shift); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_FCVTZU_imm: - fcvtu(vf, rd, rn, FPZero, right_shift); + } +} + +void Simulator::VisitSVEUnpackVectorElements(const Instruction* instr) { + SimVRegister& zd = ReadVRegister(instr->GetRd()); + VectorFormat vform = instr->GetSVEVectorFormat(); + switch (instr->Mask(SVEUnpackVectorElementsMask)) { + case SUNPKHI_z_z: + unpk(vform, zd, ReadVRegister(instr->GetRn()), kHiHalf, kSignedExtend); break; - case NEON_SSHLL: - vf = vf_l; - if (instr->Mask(NEON_Q)) { - sshll2(vf, rd, rn, left_shift); - } else { - sshll(vf, rd, rn, left_shift); - } + case SUNPKLO_z_z: + unpk(vform, zd, ReadVRegister(instr->GetRn()), kLoHalf, kSignedExtend); break; - case NEON_USHLL: - vf = vf_l; - if (instr->Mask(NEON_Q)) { - ushll2(vf, rd, rn, left_shift); - } else { - ushll(vf, rd, rn, left_shift); - } + case UUNPKHI_z_z: + unpk(vform, zd, ReadVRegister(instr->GetRn()), kHiHalf, kUnsignedExtend); break; - case NEON_SHRN: - if (instr->Mask(NEON_Q)) { - shrn2(vf, rd, rn, right_shift); - } else { - shrn(vf, rd, rn, right_shift); - } + case UUNPKLO_z_z: + unpk(vform, zd, ReadVRegister(instr->GetRn()), kLoHalf, kUnsignedExtend); break; - case NEON_RSHRN: - if (instr->Mask(NEON_Q)) { - rshrn2(vf, rd, rn, right_shift); - } else { - rshrn(vf, rd, rn, right_shift); - } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_UQSHRN: - if (instr->Mask(NEON_Q)) { - uqshrn2(vf, rd, rn, right_shift); - } else { - uqshrn(vf, rd, rn, right_shift); - } + } +} + +void Simulator::VisitSVETableLookup(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zn2 = ReadVRegister((instr->GetRn() + 1) % kNumberOfZRegisters); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + switch (form_hash_) { + case "tbl_z_zz_1"_h: + tbl(vform, zd, zn, zm); break; - case NEON_UQRSHRN: - if (instr->Mask(NEON_Q)) { - uqrshrn2(vf, rd, rn, right_shift); - } else { - uqrshrn(vf, rd, rn, right_shift); - } + case "tbl_z_zz_2"_h: + tbl(vform, zd, zn, zn2, zm); break; - case NEON_SQSHRN: - if (instr->Mask(NEON_Q)) { - sqshrn2(vf, rd, rn, right_shift); - } else { - sqshrn(vf, rd, rn, right_shift); - } + case "tbx_z_zz"_h: + tbx(vform, zd, zn, zm); break; - case NEON_SQRSHRN: - if (instr->Mask(NEON_Q)) { - sqrshrn2(vf, rd, rn, right_shift); - } else { - sqrshrn(vf, rd, rn, right_shift); - } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_SQSHRUN: - if (instr->Mask(NEON_Q)) { - sqshrun2(vf, rd, rn, right_shift); - } else { - sqshrun(vf, rd, rn, right_shift); - } + } +} + +void Simulator::VisitSVEPredicateCount(const Instruction* instr) { + VectorFormat vform = instr->GetSVEVectorFormat(); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + + switch (instr->Mask(SVEPredicateCountMask)) { + case CNTP_r_p_p: { + WriteXRegister(instr->GetRd(), CountActiveAndTrueLanes(vform, pg, pn)); break; - case NEON_SQRSHRUN: - if (instr->Mask(NEON_Q)) { - sqrshrun2(vf, rd, rn, right_shift); - } else { - sqrshrun(vf, rd, rn, right_shift); - } + } + default: + VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEPredicateLogical(const Instruction* instr) { + Instr op = instr->Mask(SVEPredicateLogicalMask); + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + SimPRegister& pm = ReadPRegister(instr->GetPm()); + SimPRegister result; + switch (op) { + case ANDS_p_p_pp_z: + case AND_p_p_pp_z: + case BICS_p_p_pp_z: + case BIC_p_p_pp_z: + case EORS_p_p_pp_z: + case EOR_p_p_pp_z: + case NANDS_p_p_pp_z: + case NAND_p_p_pp_z: + case NORS_p_p_pp_z: + case NOR_p_p_pp_z: + case ORNS_p_p_pp_z: + case ORN_p_p_pp_z: + case ORRS_p_p_pp_z: + case ORR_p_p_pp_z: + SVEPredicateLogicalHelper(static_cast(op), + result, + pn, + pm); + break; + case SEL_p_p_pp: + sel(pd, pg, pn, pm); + return; + default: + VIXL_UNIMPLEMENTED(); + break; + } + + mov_zeroing(pd, pg, result); + if (instr->Mask(SVEPredicateLogicalSetFlagsBit) != 0) { + PredTest(kFormatVnB, pg, pd); + } +} + +void Simulator::VisitSVEPredicateFirstActive(const Instruction* instr) { + LogicPRegister pg = ReadPRegister(instr->ExtractBits(8, 5)); + LogicPRegister pdn = ReadPRegister(instr->GetPd()); + switch (instr->Mask(SVEPredicateFirstActiveMask)) { + case PFIRST_p_p_p: + pfirst(pdn, pg, pdn); + // TODO: Is this broken when pg == pdn? + PredTest(kFormatVnB, pg, pdn); break; default: VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVEPredicateInitialize(const Instruction* instr) { + // This group only contains PTRUE{S}, and there are no unallocated encodings. + VIXL_STATIC_ASSERT( + SVEPredicateInitializeMask == + (SVEPredicateInitializeFMask | SVEPredicateInitializeSetFlagsBit)); + VIXL_ASSERT((instr->Mask(SVEPredicateInitializeMask) == PTRUE_p_s) || + (instr->Mask(SVEPredicateInitializeMask) == PTRUES_p_s)); -void Simulator::VisitNEONTable(const Instruction* instr) { - NEONFormatDecoder nfd(instr, NEONFormatDecoder::LogicalFormatMap()); - VectorFormat vf = nfd.GetVectorFormat(); + LogicPRegister pdn = ReadPRegister(instr->GetPd()); + VectorFormat vform = instr->GetSVEVectorFormat(); - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rn2 = ReadVRegister((instr->GetRn() + 1) % kNumberOfVRegisters); - SimVRegister& rn3 = ReadVRegister((instr->GetRn() + 2) % kNumberOfVRegisters); - SimVRegister& rn4 = ReadVRegister((instr->GetRn() + 3) % kNumberOfVRegisters); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + ptrue(vform, pdn, instr->GetImmSVEPredicateConstraint()); + if (instr->ExtractBit(16)) PredTest(vform, pdn, pdn); +} - switch (instr->Mask(NEONTableMask)) { - case NEON_TBL_1v: - tbl(vf, rd, rn, rm); +void Simulator::VisitSVEPredicateNextActive(const Instruction* instr) { + // This group only contains PNEXT, and there are no unallocated encodings. + VIXL_STATIC_ASSERT(SVEPredicateNextActiveFMask == SVEPredicateNextActiveMask); + VIXL_ASSERT(instr->Mask(SVEPredicateNextActiveMask) == PNEXT_p_p_p); + + LogicPRegister pg = ReadPRegister(instr->ExtractBits(8, 5)); + LogicPRegister pdn = ReadPRegister(instr->GetPd()); + VectorFormat vform = instr->GetSVEVectorFormat(); + + pnext(vform, pdn, pg, pdn); + // TODO: Is this broken when pg == pdn? + PredTest(vform, pg, pdn); +} + +void Simulator::VisitSVEPredicateReadFromFFR_Predicated( + const Instruction* instr) { + LogicPRegister pd(ReadPRegister(instr->GetPd())); + LogicPRegister pg(ReadPRegister(instr->GetPn())); + FlagsUpdate flags = LeaveFlags; + switch (instr->Mask(SVEPredicateReadFromFFR_PredicatedMask)) { + case RDFFR_p_p_f: + // Do nothing. break; - case NEON_TBL_2v: - tbl(vf, rd, rn, rn2, rm); + case RDFFRS_p_p_f: + flags = SetFlags; break; - case NEON_TBL_3v: - tbl(vf, rd, rn, rn2, rn3, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_TBL_4v: - tbl(vf, rd, rn, rn2, rn3, rn4, rm); + } + + LogicPRegister ffr(ReadFFR()); + mov_zeroing(pd, pg, ffr); + + if (flags == SetFlags) { + PredTest(kFormatVnB, pg, pd); + } +} + +void Simulator::VisitSVEPredicateReadFromFFR_Unpredicated( + const Instruction* instr) { + LogicPRegister pd(ReadPRegister(instr->GetPd())); + LogicPRegister ffr(ReadFFR()); + switch (instr->Mask(SVEPredicateReadFromFFR_UnpredicatedMask)) { + case RDFFR_p_f: + mov(pd, ffr); break; - case NEON_TBX_1v: - tbx(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_TBX_2v: - tbx(vf, rd, rn, rn2, rm); + } +} + +void Simulator::VisitSVEPredicateTest(const Instruction* instr) { + switch (instr->Mask(SVEPredicateTestMask)) { + case PTEST_p_p: + PredTest(kFormatVnB, + ReadPRegister(instr->ExtractBits(13, 10)), + ReadPRegister(instr->GetPn())); break; - case NEON_TBX_3v: - tbx(vf, rd, rn, rn2, rn3, rm); + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_TBX_4v: - tbx(vf, rd, rn, rn2, rn3, rn4, rm); + } +} + +void Simulator::VisitSVEPredicateZero(const Instruction* instr) { + switch (instr->Mask(SVEPredicateZeroMask)) { + case PFALSE_p: + pfalse(ReadPRegister(instr->GetPd())); break; default: VIXL_UNIMPLEMENTED(); + break; } } +void Simulator::VisitSVEPropagateBreak(const Instruction* instr) { + SimPRegister& pd = ReadPRegister(instr->GetPd()); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimPRegister& pn = ReadPRegister(instr->GetPn()); + SimPRegister& pm = ReadPRegister(instr->GetPm()); -void Simulator::VisitNEONPerm(const Instruction* instr) { - NEONFormatDecoder nfd(instr); - VectorFormat vf = nfd.GetVectorFormat(); + bool set_flags = false; + switch (instr->Mask(SVEPropagateBreakMask)) { + case BRKPAS_p_p_pp: + set_flags = true; + VIXL_FALLTHROUGH(); + case BRKPA_p_p_pp: + brkpa(pd, pg, pn, pm); + break; + case BRKPBS_p_p_pp: + set_flags = true; + VIXL_FALLTHROUGH(); + case BRKPB_p_p_pp: + brkpb(pd, pg, pn, pm); + break; + default: + VIXL_UNIMPLEMENTED(); + break; + } - SimVRegister& rd = ReadVRegister(instr->GetRd()); - SimVRegister& rn = ReadVRegister(instr->GetRn()); - SimVRegister& rm = ReadVRegister(instr->GetRm()); + if (set_flags) { + PredTest(kFormatVnB, pg, pd); + } +} - switch (instr->Mask(NEONPermMask)) { - case NEON_TRN1: - trn1(vf, rd, rn, rm); +void Simulator::VisitSVEStackFrameAdjustment(const Instruction* instr) { + uint64_t length = 0; + switch (instr->Mask(SVEStackFrameAdjustmentMask)) { + case ADDPL_r_ri: + length = GetPredicateLengthInBytes(); break; - case NEON_TRN2: - trn2(vf, rd, rn, rm); + case ADDVL_r_ri: + length = GetVectorLengthInBytes(); break; - case NEON_UZP1: - uzp1(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); + } + uint64_t base = ReadXRegister(instr->GetRm(), Reg31IsStackPointer); + WriteXRegister(instr->GetRd(), + base + (length * instr->GetImmSVEVLScale()), + LogRegWrites, + Reg31IsStackPointer); +} + +void Simulator::VisitSVEStackFrameSize(const Instruction* instr) { + int64_t scale = instr->GetImmSVEVLScale(); + + switch (instr->Mask(SVEStackFrameSizeMask)) { + case RDVL_r_i: + WriteXRegister(instr->GetRd(), GetVectorLengthInBytes() * scale); break; - case NEON_UZP2: - uzp2(vf, rd, rn, rm); + default: + VIXL_UNIMPLEMENTED(); + } +} + +void Simulator::VisitSVEVectorSelect(const Instruction* instr) { + // The only instruction in this group is `sel`, and there are no unused + // encodings. + VIXL_ASSERT(instr->Mask(SVEVectorSelectMask) == SEL_z_p_zz); + + VectorFormat vform = instr->GetSVEVectorFormat(); + SimVRegister& zd = ReadVRegister(instr->GetRd()); + SimPRegister& pg = ReadPRegister(instr->ExtractBits(13, 10)); + SimVRegister& zn = ReadVRegister(instr->GetRn()); + SimVRegister& zm = ReadVRegister(instr->GetRm()); + + sel(vform, zd, pg, zn, zm); +} + +void Simulator::VisitSVEFFRInitialise(const Instruction* instr) { + switch (instr->Mask(SVEFFRInitialiseMask)) { + case SETFFR_f: { + LogicPRegister ffr(ReadFFR()); + ffr.SetAllBits(); break; - case NEON_ZIP1: - zip1(vf, rd, rn, rm); + } + default: + VIXL_UNIMPLEMENTED(); break; - case NEON_ZIP2: - zip2(vf, rd, rn, rm); + } +} + +void Simulator::VisitSVEFFRWriteFromPredicate(const Instruction* instr) { + switch (instr->Mask(SVEFFRWriteFromPredicateMask)) { + case WRFFR_f_p: { + SimPRegister pn(ReadPRegister(instr->GetPn())); + bool last_active = true; + for (unsigned i = 0; i < pn.GetSizeInBits(); i++) { + bool active = pn.GetBit(i); + if (active && !last_active) { + // `pn` is non-monotonic. This is UNPREDICTABLE. + VIXL_ABORT(); + } + last_active = active; + } + mov(ReadFFR(), pn); break; + } default: VIXL_UNIMPLEMENTED(); + break; + } +} + +void Simulator::VisitSVEContiguousLoad_ScalarPlusImm(const Instruction* instr) { + bool is_signed; + switch (instr->Mask(SVEContiguousLoad_ScalarPlusImmMask)) { + case LD1B_z_p_bi_u8: + case LD1B_z_p_bi_u16: + case LD1B_z_p_bi_u32: + case LD1B_z_p_bi_u64: + case LD1H_z_p_bi_u16: + case LD1H_z_p_bi_u32: + case LD1H_z_p_bi_u64: + case LD1W_z_p_bi_u32: + case LD1W_z_p_bi_u64: + case LD1D_z_p_bi_u64: + is_signed = false; + break; + case LD1SB_z_p_bi_s16: + case LD1SB_z_p_bi_s32: + case LD1SB_z_p_bi_s64: + case LD1SH_z_p_bi_s32: + case LD1SH_z_p_bi_s64: + case LD1SW_z_p_bi_s64: + is_signed = true; + break; + default: + // This encoding group is complete, so no other values should be possible. + VIXL_UNREACHABLE(); + is_signed = false; + break; } + + int vl = GetVectorLengthInBytes(); + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(is_signed); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(is_signed); + VIXL_ASSERT(esize_in_bytes_log2 >= msize_in_bytes_log2); + int vl_divisor_log2 = esize_in_bytes_log2 - msize_in_bytes_log2; + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = + (instr->ExtractSignedBits(19, 16) * vl) / (1 << vl_divisor_log2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + is_signed); } +void Simulator::VisitSVEContiguousLoad_ScalarPlusScalar( + const Instruction* instr) { + bool is_signed; + switch (instr->Mask(SVEContiguousLoad_ScalarPlusScalarMask)) { + case LD1B_z_p_br_u8: + case LD1B_z_p_br_u16: + case LD1B_z_p_br_u32: + case LD1B_z_p_br_u64: + case LD1H_z_p_br_u16: + case LD1H_z_p_br_u32: + case LD1H_z_p_br_u64: + case LD1W_z_p_br_u32: + case LD1W_z_p_br_u64: + case LD1D_z_p_br_u64: + is_signed = false; + break; + case LD1SB_z_p_br_s16: + case LD1SB_z_p_br_s32: + case LD1SB_z_p_br_s64: + case LD1SH_z_p_br_s32: + case LD1SH_z_p_br_s64: + case LD1SW_z_p_br_s64: + is_signed = true; + break; + default: + // This encoding group is complete, so no other values should be possible. + VIXL_UNREACHABLE(); + is_signed = false; + break; + } + + int msize_in_bytes_log2 = instr->GetSVEMsizeFromDtype(is_signed); + int esize_in_bytes_log2 = instr->GetSVEEsizeFromDtype(is_signed); + VIXL_ASSERT(msize_in_bytes_log2 <= esize_in_bytes_log2); + VectorFormat vform = SVEFormatFromLaneSizeInBytesLog2(esize_in_bytes_log2); + uint64_t base = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t offset = ReadXRegister(instr->GetRm()); + offset <<= msize_in_bytes_log2; + LogicSVEAddressVector addr(base + offset); + addr.SetMsizeInBytesLog2(msize_in_bytes_log2); + SVEStructuredLoadHelper(vform, + ReadPRegister(instr->GetPgLow8()), + instr->GetRt(), + addr, + is_signed); +} void Simulator::DoUnreachable(const Instruction* instr) { VIXL_ASSERT((instr->Mask(ExceptionMask) == HLT) && @@ -6681,6 +14034,332 @@ void Simulator::DoUnreachable(const Instruction* instr) { abort(); } +void Simulator::Simulate_XdSP_XnSP_Xm(const Instruction* instr) { + VIXL_ASSERT(form_hash_ == Hash("irg_64i_dp_2src")); + uint64_t rn = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t rm = ReadXRegister(instr->GetRm()); + uint64_t tag = GenerateRandomTag(rm & 0xffff); + uint64_t new_val = GetAddressWithAllocationTag(rn, tag); + WriteXRegister(instr->GetRd(), new_val, LogRegWrites, Reg31IsStackPointer); +} + +void Simulator::SimulateMTEAddSubTag(const Instruction* instr) { + uint64_t rn = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t rn_tag = GetAllocationTagFromAddress(rn); + uint64_t tag_offset = instr->ExtractBits(13, 10); + // TODO: implement GCR_EL1.Exclude to provide a tag exclusion list. + uint64_t new_tag = ChooseNonExcludedTag(rn_tag, tag_offset); + + uint64_t offset = instr->ExtractBits(21, 16) * kMTETagGranuleInBytes; + int carry = 0; + if (form_hash_ == Hash("subg_64_addsub_immtags")) { + offset = ~offset; + carry = 1; + } else { + VIXL_ASSERT(form_hash_ == Hash("addg_64_addsub_immtags")); + } + uint64_t new_val = + AddWithCarry(kXRegSize, /* set_flags = */ false, rn, offset, carry); + new_val = GetAddressWithAllocationTag(new_val, new_tag); + WriteXRegister(instr->GetRd(), new_val, LogRegWrites, Reg31IsStackPointer); +} + +void Simulator::SimulateMTETagMaskInsert(const Instruction* instr) { + VIXL_ASSERT(form_hash_ == Hash("gmi_64g_dp_2src")); + uint64_t mask = ReadXRegister(instr->GetRm()); + uint64_t tag = GetAllocationTagFromAddress( + ReadXRegister(instr->GetRn(), Reg31IsStackPointer)); + uint64_t mask_bit = 1 << tag; + WriteXRegister(instr->GetRd(), mask | mask_bit); +} + +void Simulator::SimulateMTESubPointer(const Instruction* instr) { + uint64_t rn = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t rm = ReadXRegister(instr->GetRm(), Reg31IsStackPointer); + + VIXL_ASSERT((form_hash_ == Hash("subps_64s_dp_2src")) || + (form_hash_ == Hash("subp_64s_dp_2src"))); + bool set_flags = (form_hash_ == Hash("subps_64s_dp_2src")); + + rn = ExtractSignedBitfield64(55, 0, rn); + rm = ExtractSignedBitfield64(55, 0, rm); + uint64_t new_val = AddWithCarry(kXRegSize, set_flags, rn, ~rm, 1); + WriteXRegister(instr->GetRd(), new_val); +} + +void Simulator::SimulateMTEStoreTagPair(const Instruction* instr) { + uint64_t rn = ReadXRegister(instr->GetRn(), Reg31IsStackPointer); + uint64_t rt = ReadXRegister(instr->GetRt()); + uint64_t rt2 = ReadXRegister(instr->GetRt2()); + int offset = instr->GetImmLSPair() * static_cast(kMTETagGranuleInBytes); + + AddrMode addr_mode = Offset; + switch (form_hash_) { + case Hash("stgp_64_ldstpair_off"): + // Default is the offset mode. + break; + case Hash("stgp_64_ldstpair_post"): + addr_mode = PostIndex; + break; + case Hash("stgp_64_ldstpair_pre"): + addr_mode = PreIndex; + break; + default: + VIXL_UNIMPLEMENTED(); + } + + uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addr_mode); + if (!IsAligned(address, kMTETagGranuleInBytes)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + + int tag = GetAllocationTagFromAddress(rn); + meta_data_.SetMTETag(address, tag); + + MemWrite(address, rt); + MemWrite(address + kXRegSizeInBytes, rt2); +} + +void Simulator::SimulateMTEStoreTag(const Instruction* instr) { + uint64_t rt = ReadXRegister(instr->GetRt(), Reg31IsStackPointer); + int offset = instr->GetImmLS() * static_cast(kMTETagGranuleInBytes); + + AddrMode addr_mode = Offset; + switch (form_hash_) { + case Hash("st2g_64soffset_ldsttags"): + case Hash("stg_64soffset_ldsttags"): + case Hash("stz2g_64soffset_ldsttags"): + case Hash("stzg_64soffset_ldsttags"): + // Default is the offset mode. + break; + case Hash("st2g_64spost_ldsttags"): + case Hash("stg_64spost_ldsttags"): + case Hash("stz2g_64spost_ldsttags"): + case Hash("stzg_64spost_ldsttags"): + addr_mode = PostIndex; + break; + case Hash("st2g_64spre_ldsttags"): + case Hash("stg_64spre_ldsttags"): + case Hash("stz2g_64spre_ldsttags"): + case Hash("stzg_64spre_ldsttags"): + addr_mode = PreIndex; + break; + default: + VIXL_UNIMPLEMENTED(); + } + + bool is_pair = false; + switch (form_hash_) { + case Hash("st2g_64soffset_ldsttags"): + case Hash("st2g_64spost_ldsttags"): + case Hash("st2g_64spre_ldsttags"): + case Hash("stz2g_64soffset_ldsttags"): + case Hash("stz2g_64spost_ldsttags"): + case Hash("stz2g_64spre_ldsttags"): + is_pair = true; + break; + default: + break; + } + + bool is_zeroing = false; + switch (form_hash_) { + case Hash("stz2g_64soffset_ldsttags"): + case Hash("stz2g_64spost_ldsttags"): + case Hash("stz2g_64spre_ldsttags"): + case Hash("stzg_64soffset_ldsttags"): + case Hash("stzg_64spost_ldsttags"): + case Hash("stzg_64spre_ldsttags"): + is_zeroing = true; + break; + default: + break; + } + + uintptr_t address = AddressModeHelper(instr->GetRn(), offset, addr_mode); + + if (is_zeroing) { + if (!IsAligned(reinterpret_cast(address), + kMTETagGranuleInBytes)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + VIXL_STATIC_ASSERT(kMTETagGranuleInBytes >= sizeof(uint64_t)); + VIXL_STATIC_ASSERT(kMTETagGranuleInBytes % sizeof(uint64_t) == 0); + + size_t fill_size = kMTETagGranuleInBytes; + if (is_pair) { + fill_size += kMTETagGranuleInBytes; + } + + size_t fill_offset = 0; + while (fill_offset < fill_size) { + MemWrite(address + fill_offset, 0); + fill_offset += sizeof(uint64_t); + } + } + + int tag = GetAllocationTagFromAddress(rt); + meta_data_.SetMTETag(address, tag, instr); + if (is_pair) { + meta_data_.SetMTETag(address + kMTETagGranuleInBytes, tag, instr); + } +} + +void Simulator::SimulateMTELoadTag(const Instruction* instr) { + uint64_t rt = ReadXRegister(instr->GetRt()); + int offset = instr->GetImmLS() * static_cast(kMTETagGranuleInBytes); + + switch (form_hash_) { + case Hash("ldg_64loffset_ldsttags"): + break; + default: + VIXL_UNIMPLEMENTED(); + } + + uintptr_t address = AddressModeHelper(instr->GetRn(), offset, Offset); + address = AlignDown(address, kMTETagGranuleInBytes); + uint64_t tag = meta_data_.GetMTETag(address, instr); + WriteXRegister(instr->GetRt(), GetAddressWithAllocationTag(rt, tag)); +} + +void Simulator::SimulateCpyFP(const Instruction* instr) { + MOPSPHelper<"cpy"_h>(instr); + LogSystemRegister(NZCV); +} + +void Simulator::SimulateCpyP(const Instruction* instr) { + MOPSPHelper<"cpy"_h>(instr); + + int d = instr->GetRd(); + int n = instr->GetRn(); + int s = instr->GetRs(); + + // Determine copy direction. For cases in which direction is implementation + // defined, use forward. + bool is_backwards = false; + uint64_t xs = ReadXRegister(s); + uint64_t xd = ReadXRegister(d); + uint64_t xn = ReadXRegister(n); + + // Ignore the top byte of addresses for comparisons. We can use xn as is, + // as it should have zero in bits 63:55. + uint64_t xs_tbi = ExtractUnsignedBitfield64(55, 0, xs); + uint64_t xd_tbi = ExtractUnsignedBitfield64(55, 0, xd); + VIXL_ASSERT(ExtractUnsignedBitfield64(63, 55, xn) == 0); + if ((xs_tbi < xd_tbi) && ((xs_tbi + xn) > xd_tbi)) { + is_backwards = true; + WriteXRegister(s, xs + xn); + WriteXRegister(d, xd + xn); + } + + ReadNzcv().SetN(is_backwards ? 1 : 0); + LogSystemRegister(NZCV); +} + +void Simulator::SimulateCpyM(const Instruction* instr) { + VIXL_ASSERT(instr->IsConsistentMOPSTriplet<"cpy"_h>()); + VIXL_ASSERT(instr->IsMOPSMainOf(GetLastExecutedInstruction(), "cpy"_h)); + + int d = instr->GetRd(); + int n = instr->GetRn(); + int s = instr->GetRs(); + + uint64_t xd = ReadXRegister(d); + uint64_t xn = ReadXRegister(n); + uint64_t xs = ReadXRegister(s); + bool is_backwards = ReadN(); + + int step = 1; + if (is_backwards) { + step = -1; + xs--; + xd--; + } + + while (xn--) { + uint8_t temp = MemRead(xs); + MemWrite(xd, temp); + LogMemTransfer(xd, xs, temp); + xs += step; + xd += step; + } + + if (is_backwards) { + xs++; + xd++; + } + + WriteXRegister(d, xd); + WriteXRegister(n, 0); + WriteXRegister(s, xs); +} + +void Simulator::SimulateCpyE(const Instruction* instr) { + USE(instr); + VIXL_ASSERT(instr->IsConsistentMOPSTriplet<"cpy"_h>()); + VIXL_ASSERT(instr->IsMOPSEpilogueOf(GetLastExecutedInstruction(), "cpy"_h)); + // This implementation does nothing in the epilogue; all copying is completed + // in the "main" part. +} + +void Simulator::SimulateSetP(const Instruction* instr) { + MOPSPHelper<"set"_h>(instr); + LogSystemRegister(NZCV); +} + +void Simulator::SimulateSetM(const Instruction* instr) { + VIXL_ASSERT(instr->IsConsistentMOPSTriplet<"set"_h>()); + VIXL_ASSERT(instr->IsMOPSMainOf(GetLastExecutedInstruction(), "set"_h)); + + uint64_t xd = ReadXRegister(instr->GetRd()); + uint64_t xn = ReadXRegister(instr->GetRn()); + uint64_t xs = ReadXRegister(instr->GetRs()); + + while (xn--) { + LogWrite(instr->GetRs(), GetPrintRegPartial(kPrintRegLaneSizeB), xd); + MemWrite(xd++, xs); + } + WriteXRegister(instr->GetRd(), xd); + WriteXRegister(instr->GetRn(), 0); +} + +void Simulator::SimulateSetE(const Instruction* instr) { + USE(instr); + VIXL_ASSERT(instr->IsConsistentMOPSTriplet<"set"_h>()); + VIXL_ASSERT(instr->IsMOPSEpilogueOf(GetLastExecutedInstruction(), "set"_h)); + // This implementation does nothing in the epilogue; all setting is completed + // in the "main" part. +} + +void Simulator::SimulateSetGP(const Instruction* instr) { + MOPSPHelper<"setg"_h>(instr); + + uint64_t xd = ReadXRegister(instr->GetRd()); + uint64_t xn = ReadXRegister(instr->GetRn()); + + if ((xn > 0) && !IsAligned(xd, kMTETagGranuleInBytes)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + + if (!IsAligned(xn, kMTETagGranuleInBytes)) { + VIXL_ALIGNMENT_EXCEPTION(); + } + + LogSystemRegister(NZCV); +} + +void Simulator::SimulateSetGM(const Instruction* instr) { + uint64_t xd = ReadXRegister(instr->GetRd()); + uint64_t xn = ReadXRegister(instr->GetRn()); + + int tag = GetAllocationTagFromAddress(xd); + while (xn) { + meta_data_.SetMTETag(xd, tag); + xd += 16; + xn -= 16; + } + SimulateSetM(instr); +} void Simulator::DoTrace(const Instruction* instr) { VIXL_ASSERT((instr->Mask(ExceptionMask) == HLT) && @@ -6851,11 +14530,11 @@ void Simulator::DoRuntimeCall(const Instruction* instr) { // The appropriate `Simulator::SimulateRuntimeCall()` wrapper and the function // to call are passed inlined in the assembly. uintptr_t call_wrapper_address = - Memory::Read(instr + kRuntimeCallWrapperOffset); + MemRead(instr + kRuntimeCallWrapperOffset); uintptr_t function_address = - Memory::Read(instr + kRuntimeCallFunctionOffset); + MemRead(instr + kRuntimeCallFunctionOffset); RuntimeCallType call_type = static_cast( - Memory::Read(instr + kRuntimeCallTypeOffset)); + MemRead(instr + kRuntimeCallTypeOffset)); auto runtime_call_wrapper = reinterpret_cast(call_wrapper_address); @@ -6890,7 +14569,7 @@ void Simulator::DoConfigureCPUFeatures(const Instruction* instr) { // Read the kNone-terminated list of features. CPUFeatures parameters; while (true) { - ElementType feature = Memory::Read(instr + offset); + ElementType feature = MemRead(instr + offset); offset += element_size; if (feature == static_cast(CPUFeatures::kNone)) break; parameters.Combine(static_cast(feature)); @@ -6933,6 +14612,39 @@ void Simulator::DoRestoreCPUFeatures(const Instruction* instr) { saved_cpu_features_.pop_back(); } +void* Simulator::Mmap( + void* address, size_t length, int prot, int flags, int fd, off_t offset) { + // The underlying system `mmap` in the simulated environment doesn't recognize + // PROT_BTI and PROT_MTE. Although the kernel probably just ignores the bits + // it doesn't know, mask those protections out before calling is safer. + int intenal_prot = prot; + prot &= ~(PROT_BTI | PROT_MTE); + + uint64_t address2 = reinterpret_cast( + mmap(address, length, prot, flags, fd, offset)); + + if (intenal_prot & PROT_MTE) { + // The returning address of `mmap` isn't tagged. + int tag = static_cast(GenerateRandomTag()); + SetGranuleTag(address2, tag, length); + address2 = GetAddressWithAllocationTag(address2, tag); + } + + return reinterpret_cast(address2); +} + + +int Simulator::Munmap(void* address, size_t length, int prot) { + if (prot & PROT_MTE) { + // Untag the address since `munmap` doesn't recognize the memory tagging + // managed by the Simulator. + address = AddressUntag(address); + CleanGranuleTag(reinterpret_cast(address), length); + } + + return munmap(address, length); +} + } // namespace aarch64 } // namespace vixl diff --git a/core/deps/vixl/aarch64/simulator-aarch64.h b/core/deps/vixl/aarch64/simulator-aarch64.h index 075a60614..c5cc894b6 100644 --- a/core/deps/vixl/aarch64/simulator-aarch64.h +++ b/core/deps/vixl/aarch64/simulator-aarch64.h @@ -27,6 +27,8 @@ #ifndef VIXL_AARCH64_SIMULATOR_AARCH64_H_ #define VIXL_AARCH64_SIMULATOR_AARCH64_H_ +#include +#include #include #include "../globals-vixl.h" @@ -37,7 +39,6 @@ #include "cpu-features-auditor-aarch64.h" #include "disasm-aarch64.h" #include "instructions-aarch64.h" -#include "instrument-aarch64.h" #include "simulator-constants-aarch64.h" #ifdef VIXL_INCLUDE_SIMULATOR_AARCH64 @@ -52,54 +53,358 @@ #endif #endif +// The hosts that Simulator running on may not have these flags defined. +#ifndef PROT_BTI +#define PROT_BTI 0x10 +#endif +#ifndef PROT_MTE +#define PROT_MTE 0x20 +#endif + namespace vixl { namespace aarch64 { -// Representation of memory, with typed getters and setters for access. -class Memory { +class SimStack { + public: + SimStack() {} + explicit SimStack(size_t size) : usable_size_(size) {} + + // Guard against accesses above the stack base. This could occur, for example, + // if the first simulated function tries to read stack arguments that haven't + // been properly initialised in the Simulator's stack. + void SetBaseGuardSize(size_t size) { base_guard_size_ = size; } + + // Guard against stack overflows. The size should be large enough to detect + // the largest stride made (by `MacroAssembler::Claim()` or equivalent) whilst + // initialising stack objects. + void SetLimitGuardSize(size_t size) { limit_guard_size_ = size; } + + // The minimum usable size of the stack. + // Equal to "stack base" - "stack limit", in AAPCS64 terminology. + void SetUsableSize(size_t size) { usable_size_ = size; } + + // Set the minimum alignment for the stack parameters. + void AlignToBytesLog2(int align_log2) { align_log2_ = align_log2; } + + class Allocated { + public: + // Using AAPCS64 terminology, highest addresses at the top: + // + // data_.get() + alloc_size -> + // | + // | Base guard + // GetBase() -> | | + // | | + // | | AAPCS64-legal + // | Usable stack | values of 'sp'. + // | | + // | | + // GetLimit() -> | + // | Limit guard + // data_.get() -> | + // + // The Simulator detects (and forbids) accesses to either guard region. + + char* GetBase() const { return base_; } + char* GetLimit() const { return limit_; } + + template + bool IsAccessInGuardRegion(const T* base, size_t size) const { + VIXL_ASSERT(size > 0); + // Inclusive bounds. + const char* start = reinterpret_cast(base); + const char* end = start + size - 1; + const char* data_start = data_.get(); + const char* data_end = data_start + alloc_size_ - 1; + bool in_base_guard = (start <= data_end) && (end >= base_); + bool in_limit_guard = (start <= limit_) && (end >= data_start); + return in_base_guard || in_limit_guard; + } + + private: + std::unique_ptr data_; + char* limit_; + char* base_; + size_t alloc_size_; + + friend class SimStack; + }; + + // Allocate the stack, locking the parameters. + Allocated Allocate() { + size_t align_to = 1 << align_log2_; + size_t l = AlignUp(limit_guard_size_, align_to); + size_t u = AlignUp(usable_size_, align_to); + size_t b = AlignUp(base_guard_size_, align_to); + size_t size = l + u + b; + + Allocated a; + size_t alloc_size = (align_to - 1) + size; + a.data_ = std::make_unique(alloc_size); + void* data = a.data_.get(); + auto data_aligned = + reinterpret_cast(std::align(align_to, size, data, alloc_size)); + a.limit_ = data_aligned + l - 1; + a.base_ = data_aligned + l + u; + a.alloc_size_ = alloc_size; + return a; + } + + private: + size_t base_guard_size_ = 256; + size_t limit_guard_size_ = 4 * 1024; + size_t usable_size_ = 8 * 1024; + size_t align_log2_ = 4; + + static const size_t kDefaultBaseGuardSize = 256; + static const size_t kDefaultLimitGuardSize = 4 * 1024; + static const size_t kDefaultUsableSize = 8 * 1024; +}; + +// Armv8.5 MTE helpers. +inline int GetAllocationTagFromAddress(uint64_t address) { + return static_cast(ExtractUnsignedBitfield64(59, 56, address)); +} + +template +T AddressUntag(T address) { + // Cast the address using a C-style cast. A reinterpret_cast would be + // appropriate, but it can't cast one integral type to another. + uint64_t bits = (uint64_t)address; + return (T)(bits & ~kAddressTagMask); +} + +class MetaDataDepot { public: + class MetaDataMTE { + public: + explicit MetaDataMTE(int tag) : tag_(tag) {} + + int GetTag() const { return tag_; } + void SetTag(int tag) { + VIXL_ASSERT(IsUint4(tag)); + tag_ = tag; + } + + static bool IsActive() { return is_active; } + static void SetActive(bool value) { is_active = value; } + + private: + static bool is_active; + int16_t tag_; + + friend class MetaDataDepot; + }; + + // Generate a key for metadata recording from a untagged address. template - static T AddressUntag(T address) { + uint64_t GenerateMTEkey(T address) const { // Cast the address using a C-style cast. A reinterpret_cast would be // appropriate, but it can't cast one integral type to another. - uint64_t bits = (uint64_t)address; - return (T)(bits & ~kAddressTagMask); + return (uint64_t)(AddressUntag(address)) >> kMTETagGranuleInBytesLog2; + } + + template + R GetAttribute(T map, uint64_t key) { + auto pair = map->find(key); + R value = (pair == map->end()) ? nullptr : &pair->second; + return value; + } + + template + int GetMTETag(T address, Instruction const* pc = nullptr) { + uint64_t key = GenerateMTEkey(address); + MetaDataMTE* m = GetAttribute(&metadata_mte_, key); + + if (!m) { + std::stringstream sstream; + sstream << std::hex << "MTE ERROR : instruction at 0x" + << reinterpret_cast(pc) + << " touched a unallocated memory location 0x" + << (uint64_t)(address) << ".\n"; + VIXL_ABORT_WITH_MSG(sstream.str().c_str()); + } + + return m->GetTag(); + } + + template + void SetMTETag(T address, int tag, Instruction const* pc = nullptr) { + VIXL_ASSERT(IsAligned((uintptr_t)address, kMTETagGranuleInBytes)); + uint64_t key = GenerateMTEkey(address); + MetaDataMTE* m = GetAttribute(&metadata_mte_, key); + + if (!m) { + metadata_mte_.insert({key, MetaDataMTE(tag)}); + } else { + // Overwrite + if (m->GetTag() == tag) { + std::stringstream sstream; + sstream << std::hex << "MTE WARNING : instruction at 0x" + << reinterpret_cast(pc) + << ", the same tag is assigned to the address 0x" + << (uint64_t)(address) << ".\n"; + VIXL_WARNING(sstream.str().c_str()); + } + m->SetTag(tag); + } + } + + template + size_t CleanMTETag(T address) { + VIXL_ASSERT( + IsAligned(reinterpret_cast(address), kMTETagGranuleInBytes)); + uint64_t key = GenerateMTEkey(address); + return metadata_mte_.erase(key); + } + + size_t GetTotalCountMTE() { return metadata_mte_.size(); } + + private: + // Tag recording of each allocated memory in the tag-granule. + std::unordered_map metadata_mte_; +}; + + +// Representation of memory, with typed getters and setters for access. +class Memory { + public: + explicit Memory(SimStack::Allocated stack) : stack_(std::move(stack)) { + metadata_depot_ = nullptr; + } + + const SimStack::Allocated& GetStack() { return stack_; } + + template + bool IsMTETagsMatched(A address, Instruction const* pc = nullptr) const { + if (MetaDataDepot::MetaDataMTE::IsActive()) { + // Cast the address using a C-style cast. A reinterpret_cast would be + // appropriate, but it can't cast one integral type to another. + uint64_t addr = (uint64_t)address; + int pointer_tag = GetAllocationTagFromAddress(addr); + int memory_tag = metadata_depot_->GetMTETag(AddressUntag(addr), pc); + return pointer_tag == memory_tag; + } + return true; } template - static T Read(A address) { + T Read(A address, Instruction const* pc = nullptr) const { T value; - address = AddressUntag(address); - VIXL_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) || - (sizeof(value) == 4) || (sizeof(value) == 8) || - (sizeof(value) == 16)); - memcpy(&value, reinterpret_cast(address), sizeof(value)); + VIXL_STATIC_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) || + (sizeof(value) == 4) || (sizeof(value) == 8) || + (sizeof(value) == 16)); + auto base = reinterpret_cast(AddressUntag(address)); + if (stack_.IsAccessInGuardRegion(base, sizeof(value))) { + VIXL_ABORT_WITH_MSG("Attempt to read from stack guard region"); + } + if (!IsMTETagsMatched(address, pc)) { + VIXL_ABORT_WITH_MSG("Tag mismatch."); + } + memcpy(&value, base, sizeof(value)); return value; } template - static void Write(A address, T value) { - address = AddressUntag(address); - VIXL_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) || - (sizeof(value) == 4) || (sizeof(value) == 8) || - (sizeof(value) == 16)); - memcpy(reinterpret_cast(address), &value, sizeof(value)); + void Write(A address, T value, Instruction const* pc = nullptr) const { + VIXL_STATIC_ASSERT((sizeof(value) == 1) || (sizeof(value) == 2) || + (sizeof(value) == 4) || (sizeof(value) == 8) || + (sizeof(value) == 16)); + auto base = reinterpret_cast(AddressUntag(address)); + if (stack_.IsAccessInGuardRegion(base, sizeof(value))) { + VIXL_ABORT_WITH_MSG("Attempt to write to stack guard region"); + } + if (!IsMTETagsMatched(address, pc)) { + VIXL_ABORT_WITH_MSG("Tag mismatch."); + } + memcpy(base, &value, sizeof(value)); + } + + template + uint64_t ReadUint(int size_in_bytes, A address) const { + switch (size_in_bytes) { + case 1: + return Read(address); + case 2: + return Read(address); + case 4: + return Read(address); + case 8: + return Read(address); + } + VIXL_UNREACHABLE(); + return 0; + } + + template + int64_t ReadInt(int size_in_bytes, A address) const { + switch (size_in_bytes) { + case 1: + return Read(address); + case 2: + return Read(address); + case 4: + return Read(address); + case 8: + return Read(address); + } + VIXL_UNREACHABLE(); + return 0; + } + + template + void Write(int size_in_bytes, A address, uint64_t value) const { + switch (size_in_bytes) { + case 1: + return Write(address, static_cast(value)); + case 2: + return Write(address, static_cast(value)); + case 4: + return Write(address, static_cast(value)); + case 8: + return Write(address, value); + } + VIXL_UNREACHABLE(); } + + void AppendMetaData(MetaDataDepot* metadata_depot) { + VIXL_ASSERT(metadata_depot != nullptr); + VIXL_ASSERT(metadata_depot_ == nullptr); + metadata_depot_ = metadata_depot; + } + + private: + SimStack::Allocated stack_; + MetaDataDepot* metadata_depot_; }; -// Represent a register (r0-r31, v0-v31). -template +// Represent a register (r0-r31, v0-v31, z0-z31, p0-p15). +template class SimRegisterBase { public: - SimRegisterBase() : written_since_last_log_(false) {} + static const unsigned kMaxSizeInBytes = kMaxSizeInBits / kBitsPerByte; + VIXL_STATIC_ASSERT((kMaxSizeInBytes * kBitsPerByte) == kMaxSizeInBits); + + SimRegisterBase() : size_in_bytes_(kMaxSizeInBytes) { Clear(); } + + unsigned GetSizeInBits() const { return size_in_bytes_ * kBitsPerByte; } + unsigned GetSizeInBytes() const { return size_in_bytes_; } + + void SetSizeInBytes(unsigned size_in_bytes) { + VIXL_ASSERT(size_in_bytes <= kMaxSizeInBytes); + size_in_bytes_ = size_in_bytes; + } + void SetSizeInBits(unsigned size_in_bits) { + VIXL_ASSERT(size_in_bits <= kMaxSizeInBits); + VIXL_ASSERT((size_in_bits % kBitsPerByte) == 0); + SetSizeInBytes(size_in_bits / kBitsPerByte); + } // Write the specified value. The value is zero-extended if necessary. template void Write(T new_value) { - if (sizeof(new_value) < kSizeInBytes) { - // All AArch64 registers are zero-extending. - memset(value_ + sizeof(new_value), 0, kSizeInBytes - sizeof(new_value)); - } + // All AArch64 registers are zero-extending. + if (sizeof(new_value) < GetSizeInBytes()) Clear(); WriteLane(new_value, 0); NotifyRegisterWrite(); } @@ -108,6 +413,11 @@ class SimRegisterBase { Write(new_value); } + void Clear() { + memset(value_, 0, kMaxSizeInBytes); + NotifyRegisterWrite(); + } + // Insert a typed value into a register, leaving the rest of the register // unchanged. The lane parameter indicates where in the register the value // should be inserted, in the range [ 0, sizeof(value_) / sizeof(T) ), where @@ -137,6 +447,17 @@ class SimRegisterBase { return GetLane(lane); } + // Get the value of a specific bit, indexed from the least-significant bit of + // lane 0. + bool GetBit(int bit) const { + int bit_in_byte = bit % (sizeof(value_[0]) * kBitsPerByte); + int byte = bit / (sizeof(value_[0]) * kBitsPerByte); + return ((value_[byte] >> bit_in_byte) & 1) != 0; + } + + // Return a pointer to the raw, underlying byte array. + const uint8_t* GetBytes() const { return value_; } + // TODO: Make this return a map of updated bytes, so that we can highlight // updated lanes for load-and-insert. (That never happens for scalar code, but // NEON has some instructions that can update individual lanes.) @@ -145,7 +466,9 @@ class SimRegisterBase { void NotifyRegisterLogged() { written_since_last_log_ = false; } protected: - uint8_t value_[kSizeInBytes]; + uint8_t value_[kMaxSizeInBytes]; + + unsigned size_in_bytes_; // Helpers to aid with register tracing. bool written_since_last_log_; @@ -156,38 +479,152 @@ class SimRegisterBase { template void ReadLane(T* dst, int lane) const { VIXL_ASSERT(lane >= 0); - VIXL_ASSERT((sizeof(*dst) + (lane * sizeof(*dst))) <= kSizeInBytes); + VIXL_ASSERT((sizeof(*dst) + (lane * sizeof(*dst))) <= GetSizeInBytes()); memcpy(dst, &value_[lane * sizeof(*dst)], sizeof(*dst)); } template void WriteLane(T src, int lane) { VIXL_ASSERT(lane >= 0); - VIXL_ASSERT((sizeof(src) + (lane * sizeof(src))) <= kSizeInBytes); + VIXL_ASSERT((sizeof(src) + (lane * sizeof(src))) <= GetSizeInBytes()); memcpy(&value_[lane * sizeof(src)], &src, sizeof(src)); } + + // The default ReadLane and WriteLane methods assume what we are copying is + // "trivially copyable" by using memcpy. We have to provide alternative + // implementations for SimFloat16 which cannot be copied this way. + + void ReadLane(vixl::internal::SimFloat16* dst, int lane) const { + uint16_t rawbits; + ReadLane(&rawbits, lane); + *dst = RawbitsToFloat16(rawbits); + } + + void WriteLane(vixl::internal::SimFloat16 src, int lane) { + WriteLane(Float16ToRawbits(src), lane); + } }; -typedef SimRegisterBase SimRegister; // r0-r31 -typedef SimRegisterBase SimVRegister; // v0-v31 - -// The default ReadLane and WriteLane methods assume what we are copying is -// "trivially copyable" by using memcpy. We have to provide alternative -// implementations for SimFloat16 which cannot be copied this way. - -template <> -template <> -inline void SimVRegister::ReadLane(vixl::internal::SimFloat16* dst, - int lane) const { - uint16_t rawbits; - ReadLane(&rawbits, lane); - *dst = RawbitsToFloat16(rawbits); -} -template <> -template <> -inline void SimVRegister::WriteLane(vixl::internal::SimFloat16 src, int lane) { - WriteLane(Float16ToRawbits(src), lane); -} +typedef SimRegisterBase SimRegister; // r0-r31 +typedef SimRegisterBase SimPRegister; // p0-p15 +// FFR has the same format as a predicate register. +typedef SimPRegister SimFFRRegister; + +// v0-v31 and z0-z31 +class SimVRegister : public SimRegisterBase { + public: + SimVRegister() : SimRegisterBase(), accessed_as_z_(false) {} + + void NotifyAccessAsZ() { accessed_as_z_ = true; } + + void NotifyRegisterLogged() { + SimRegisterBase::NotifyRegisterLogged(); + accessed_as_z_ = false; + } + + bool AccessedAsZSinceLastLog() const { return accessed_as_z_; } + + private: + bool accessed_as_z_; +}; + +// Representation of a SVE predicate register. +class LogicPRegister { + public: + inline LogicPRegister( + SimPRegister& other) // NOLINT(runtime/references)(runtime/explicit) + : register_(other) {} + + // Set a conveniently-sized block to 16 bits as the minimum predicate length + // is 16 bits and allow to be increased to multiples of 16 bits. + typedef uint16_t ChunkType; + + // Assign a bit into the end positon of the specified lane. + // The bit is zero-extended if necessary. + void SetActive(VectorFormat vform, int lane_index, bool value) { + int psize = LaneSizeInBytesFromFormat(vform); + int bit_index = lane_index * psize; + int byte_index = bit_index / kBitsPerByte; + int bit_offset = bit_index % kBitsPerByte; + uint8_t byte = register_.GetLane(byte_index); + register_.Insert(byte_index, ZeroExtend(byte, bit_offset, psize, value)); + } + + bool IsActive(VectorFormat vform, int lane_index) const { + int psize = LaneSizeInBytesFromFormat(vform); + int bit_index = lane_index * psize; + int byte_index = bit_index / kBitsPerByte; + int bit_offset = bit_index % kBitsPerByte; + uint8_t byte = register_.GetLane(byte_index); + return ExtractBit(byte, bit_offset); + } + + // The accessors for bulk processing. + int GetChunkCount() const { + VIXL_ASSERT((register_.GetSizeInBytes() % sizeof(ChunkType)) == 0); + return register_.GetSizeInBytes() / sizeof(ChunkType); + } + + ChunkType GetChunk(int lane) const { return GetActiveMask(lane); } + + void SetChunk(int lane, ChunkType new_value) { + SetActiveMask(lane, new_value); + } + + void SetAllBits() { + int chunk_size = sizeof(ChunkType) * kBitsPerByte; + ChunkType bits = GetUintMask(chunk_size); + for (int lane = 0; + lane < (static_cast(register_.GetSizeInBits() / chunk_size)); + lane++) { + SetChunk(lane, bits); + } + } + + template + T GetActiveMask(int lane) const { + return register_.GetLane(lane); + } + + template + void SetActiveMask(int lane, T new_value) { + register_.Insert(lane, new_value); + } + + void Clear() { register_.Clear(); } + + bool Aliases(const LogicPRegister& other) const { + return ®ister_ == &other.register_; + } + + private: + // The bit assignment is zero-extended to fill the size of predicate element. + uint8_t ZeroExtend(uint8_t byte, int index, int psize, bool value) { + VIXL_ASSERT(index >= 0); + VIXL_ASSERT(index + psize <= kBitsPerByte); + int bits = value ? 1 : 0; + switch (psize) { + case 1: + AssignBit(byte, index, bits); + break; + case 2: + AssignBits(byte, index, 0x03, bits); + break; + case 4: + AssignBits(byte, index, 0x0f, bits); + break; + case 8: + AssignBits(byte, index, 0xff, bits); + break; + default: + VIXL_UNREACHABLE(); + return 0; + } + return byte; + } + + SimPRegister& register_; +}; // Representation of a vector register, with typed getters and setters for lanes // and additional information to represent lane state. @@ -205,6 +642,7 @@ class LogicVRegister { } int64_t Int(VectorFormat vform, int index) const { + if (IsSVEFormat(vform)) register_.NotifyAccessAsZ(); int64_t element; switch (LaneSizeInBitsFromFormat(vform)) { case 8: @@ -227,6 +665,7 @@ class LogicVRegister { } uint64_t Uint(VectorFormat vform, int index) const { + if (IsSVEFormat(vform)) register_.NotifyAccessAsZ(); uint64_t element; switch (LaneSizeInBitsFromFormat(vform)) { case 8: @@ -248,6 +687,13 @@ class LogicVRegister { return element; } + int UintArray(VectorFormat vform, uint64_t* dst) const { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + dst[i] = Uint(vform, i); + } + return LaneCountFromFormat(vform); + } + uint64_t UintLeftJustified(VectorFormat vform, int index) const { return Uint(vform, index) << (64 - LaneSizeInBitsFromFormat(vform)); } @@ -260,6 +706,7 @@ class LogicVRegister { } void SetInt(VectorFormat vform, int index, int64_t value) const { + if (IsSVEFormat(vform)) register_.NotifyAccessAsZ(); switch (LaneSizeInBitsFromFormat(vform)) { case 8: register_.Insert(index, static_cast(value)); @@ -287,6 +734,7 @@ class LogicVRegister { } void SetUint(VectorFormat vform, int index, uint64_t value) const { + if (IsSVEFormat(vform)) register_.NotifyAccessAsZ(); switch (LaneSizeInBitsFromFormat(vform)) { case 8: register_.Insert(index, static_cast(value)); @@ -313,44 +761,6 @@ class LogicVRegister { } } - void ReadUintFromMem(VectorFormat vform, int index, uint64_t addr) const { - switch (LaneSizeInBitsFromFormat(vform)) { - case 8: - register_.Insert(index, Memory::Read(addr)); - break; - case 16: - register_.Insert(index, Memory::Read(addr)); - break; - case 32: - register_.Insert(index, Memory::Read(addr)); - break; - case 64: - register_.Insert(index, Memory::Read(addr)); - break; - default: - VIXL_UNREACHABLE(); - return; - } - } - - void WriteUintToMem(VectorFormat vform, int index, uint64_t addr) const { - uint64_t value = Uint(vform, index); - switch (LaneSizeInBitsFromFormat(vform)) { - case 8: - Memory::Write(addr, static_cast(value)); - break; - case 16: - Memory::Write(addr, static_cast(value)); - break; - case 32: - Memory::Write(addr, static_cast(value)); - break; - case 64: - Memory::Write(addr, value); - break; - } - } - template T Float(int index) const { return register_.GetLane(index); @@ -361,11 +771,22 @@ class LogicVRegister { register_.Insert(index, value); } - // When setting a result in a register of size less than Q, the top bits of - // the Q register must be cleared. + template + void SetFloat(VectorFormat vform, int index, T value) const { + if (IsSVEFormat(vform)) register_.NotifyAccessAsZ(); + register_.Insert(index, value); + } + + void Clear() { register_.Clear(); } + + // When setting a result in a register larger than the result itself, the top + // bits of the register must be cleared. void ClearForWrite(VectorFormat vform) const { + // SVE destinations write whole registers, so we have nothing to clear. + if (IsSVEFormat(vform)) return; + unsigned size = RegisterSizeInBytesFromFormat(vform); - for (unsigned i = size; i < kQRegSizeInBytes; i++) { + for (unsigned i = size; i < register_.GetSizeInBytes(); i++) { SetUint(kFormat16B, i, 0); } } @@ -470,26 +891,142 @@ class LogicVRegister { for (int i = 0; i < LaneCountFromFormat(vform); i++) { int64_t val = Int(vform, i); SetRounding(i, (val & 1) == 1); - val >>= 1; - if (GetSignedSaturation(i) != kNotSaturated) { + val = ExtractSignedBitfield64(63, 1, val); // >>= 1 + if (GetSignedSaturation(i) == kNotSaturated) { + SetInt(vform, i, val); + } else { // If the operation causes signed saturation, the sign bit must be // inverted. - val ^= (MaxUintFromFormat(vform) >> 1) + 1; + uint64_t uval = static_cast(val); + SetUint(vform, i, uval ^ ((MaxUintFromFormat(vform) >> 1) + 1)); } - SetInt(vform, i, val); } return *this; } + int LaneCountFromFormat(VectorFormat vform) const { + if (IsSVEFormat(vform)) { + return register_.GetSizeInBits() / LaneSizeInBitsFromFormat(vform); + } else { + return vixl::aarch64::LaneCountFromFormat(vform); + } + } + private: SimVRegister& register_; // Allocate one saturation state entry per lane; largest register is type Q, // and lanes can be a minimum of one byte wide. - Saturation saturated_[kQRegSizeInBytes]; + Saturation saturated_[kZRegMaxSizeInBytes]; // Allocate one rounding state entry per lane. - bool round_[kQRegSizeInBytes]; + bool round_[kZRegMaxSizeInBytes]; +}; + +// Represent an SVE addressing mode and abstract per-lane address generation to +// make iteration easy. +// +// Contiguous accesses are described with a simple base address, the memory +// occupied by each lane (`SetMsizeInBytesLog2()`) and the number of elements in +// each struct (`SetRegCount()`). +// +// Scatter-gather accesses also require a SimVRegister and information about how +// to extract lanes from it. +class LogicSVEAddressVector { + public: + // scalar-plus-scalar + // scalar-plus-immediate + explicit LogicSVEAddressVector(uint64_t base) + : base_(base), + msize_in_bytes_log2_(kUnknownMsizeInBytesLog2), + reg_count_(1), + vector_(NULL), + vector_form_(kFormatUndefined), + vector_mod_(NO_SVE_OFFSET_MODIFIER), + vector_shift_(0) {} + + // scalar-plus-vector + // vector-plus-immediate + // `base` should be the constant used for each element. That is, the value + // of `xn`, or `#`. + // `vector` should be the SimVRegister with offsets for each element. The + // vector format must be specified; SVE scatter/gather accesses typically + // support both 32-bit and 64-bit addressing. + // + // `mod` and `shift` correspond to the modifiers applied to each element in + // scalar-plus-vector forms, such as those used for unpacking and + // sign-extension. They are not used for vector-plus-immediate. + LogicSVEAddressVector(uint64_t base, + const SimVRegister* vector, + VectorFormat vform, + SVEOffsetModifier mod = NO_SVE_OFFSET_MODIFIER, + int shift = 0) + : base_(base), + msize_in_bytes_log2_(kUnknownMsizeInBytesLog2), + reg_count_(1), + vector_(vector), + vector_form_(vform), + vector_mod_(mod), + vector_shift_(shift) {} + + // Set `msize` -- the memory occupied by each lane -- for address + // calculations. + void SetMsizeInBytesLog2(int msize_in_bytes_log2) { + VIXL_ASSERT(msize_in_bytes_log2 >= static_cast(kBRegSizeInBytesLog2)); + VIXL_ASSERT(msize_in_bytes_log2 <= static_cast(kDRegSizeInBytesLog2)); + msize_in_bytes_log2_ = msize_in_bytes_log2; + } + + bool HasMsize() const { + return msize_in_bytes_log2_ != kUnknownMsizeInBytesLog2; + } + + int GetMsizeInBytesLog2() const { + VIXL_ASSERT(HasMsize()); + return msize_in_bytes_log2_; + } + int GetMsizeInBitsLog2() const { + return GetMsizeInBytesLog2() + kBitsPerByteLog2; + } + + int GetMsizeInBytes() const { return 1 << GetMsizeInBytesLog2(); } + int GetMsizeInBits() const { return 1 << GetMsizeInBitsLog2(); } + + void SetRegCount(int reg_count) { + VIXL_ASSERT(reg_count >= 1); // E.g. ld1/st1 + VIXL_ASSERT(reg_count <= 4); // E.g. ld4/st4 + reg_count_ = reg_count; + } + + int GetRegCount() const { return reg_count_; } + + // Full per-element address calculation for structured accesses. + // + // Note that the register number argument (`reg`) is zero-based. + uint64_t GetElementAddress(int lane, int reg) const { + VIXL_ASSERT(reg < GetRegCount()); + // Individual structures are always contiguous in memory, so this + // implementation works for both contiguous and scatter-gather addressing. + return GetStructAddress(lane) + (reg * GetMsizeInBytes()); + } + + // Full per-struct address calculation for structured accesses. + uint64_t GetStructAddress(int lane) const; + + bool IsContiguous() const { return vector_ == NULL; } + bool IsScatterGather() const { return !IsContiguous(); } + + private: + uint64_t base_; + int msize_in_bytes_log2_; + int reg_count_; + + const SimVRegister* vector_; + VectorFormat vector_form_; + SVEOffsetModifier vector_mod_; + int vector_shift_; + + static const int kUnknownMsizeInBytesLog2 = -1; }; // The proper way to initialize a simulated system register (such as NZCV) is as @@ -620,10 +1157,11 @@ class SimExclusiveGlobalMonitor { uint32_t seed_; }; - class Simulator : public DecoderVisitor { public: - explicit Simulator(Decoder* decoder, FILE* stream = stdout); + explicit Simulator(Decoder* decoder, + FILE* stream = stdout, + SimStack::Allocated stack = SimStack().Allocate()); ~Simulator(); void ResetState(); @@ -701,7 +1239,7 @@ class Simulator : public DecoderVisitor { void WritePc(const Instruction* new_pc, BranchLogMode log_mode = LogBranches) { if (log_mode == LogBranches) LogTakenBranch(new_pc); - pc_ = Memory::AddressUntag(new_pc); + pc_ = AddressUntag(new_pc); pc_modified_ = true; } VIXL_DEPRECATED("WritePc", void set_pc(const Instruction* new_pc)) { @@ -728,6 +1266,8 @@ class Simulator : public DecoderVisitor { bool PcIsInGuardedPage() const { return guard_pages_; } void SetGuardedPages(bool guard_pages) { guard_pages_ = guard_pages; } + const Instruction* GetLastExecutedInstruction() const { return last_instr_; } + void ExecuteInstruction() { // The program counter should always be aligned. VIXL_ASSERT(IsWordAligned(pc_)); @@ -747,6 +1287,9 @@ class Simulator : public DecoderVisitor { } } + bool last_instr_was_movprfx = + (form_hash_ == "movprfx_z_z"_h) || (form_hash_ == "movprfx_z_p_z"_h); + // decoder_->Decode(...) triggers at least the following visitors: // 1. The CPUFeaturesAuditor (`cpu_features_auditor_`). // 2. The PrintDisassembler (`print_disasm_`), if enabled. @@ -754,6 +1297,13 @@ class Simulator : public DecoderVisitor { // User can add additional visitors at any point, but the Simulator requires // that the ordering above is preserved. decoder_->Decode(pc_); + + if (last_instr_was_movprfx) { + VIXL_ASSERT(last_instr_ != NULL); + VIXL_CHECK(pc_->CanTakeSVEMovprfx(form_hash_, last_instr_)); + } + + last_instr_ = ReadPc(); IncrementPc(); LogAllWrittenRegisters(); UpdateBType(); @@ -761,18 +1311,95 @@ class Simulator : public DecoderVisitor { VIXL_CHECK(cpu_features_auditor_.InstructionIsAvailable()); } -// Declare all Visitor functions. -#define DECLARE(A) \ - virtual void Visit##A(const Instruction* instr) VIXL_OVERRIDE; + virtual void Visit(Metadata* metadata, + const Instruction* instr) VIXL_OVERRIDE; + +#define DECLARE(A) virtual void Visit##A(const Instruction* instr); VISITOR_LIST_THAT_RETURN(DECLARE) #undef DECLARE - -#define DECLARE(A) \ - VIXL_DEBUG_NO_RETURN virtual void Visit##A(const Instruction* instr) \ - VIXL_OVERRIDE; +#define DECLARE(A) \ + VIXL_NO_RETURN virtual void Visit##A(const Instruction* instr); VISITOR_LIST_THAT_DONT_RETURN(DECLARE) #undef DECLARE + void Simulate_PdT_PgZ_ZnT_ZmT(const Instruction* instr); + void Simulate_PdT_Xn_Xm(const Instruction* instr); + void Simulate_ZdB_Zn1B_Zn2B_imm(const Instruction* instr); + void Simulate_ZdB_ZnB_ZmB(const Instruction* instr); + void Simulate_ZdD_ZnD_ZmD_imm(const Instruction* instr); + void Simulate_ZdH_PgM_ZnS(const Instruction* instr); + void Simulate_ZdH_ZnH_ZmH_imm(const Instruction* instr); + void Simulate_ZdS_PgM_ZnD(const Instruction* instr); + void Simulate_ZdS_PgM_ZnS(const Instruction* instr); + void Simulate_ZdS_ZnS_ZmS_imm(const Instruction* instr); + void Simulate_ZdT_PgM_ZnT(const Instruction* instr); + void Simulate_ZdT_PgZ_ZnT_ZmT(const Instruction* instr); + void Simulate_ZdT_ZnT_ZmT(const Instruction* instr); + void Simulate_ZdT_ZnT_ZmTb(const Instruction* instr); + void Simulate_ZdT_ZnT_const(const Instruction* instr); + void Simulate_ZdaD_ZnS_ZmS_imm(const Instruction* instr); + void Simulate_ZdaH_ZnH_ZmH_imm_const(const Instruction* instr); + void Simulate_ZdaS_ZnH_ZmH(const Instruction* instr); + void Simulate_ZdaS_ZnH_ZmH_imm(const Instruction* instr); + void Simulate_ZdaS_ZnS_ZmS_imm_const(const Instruction* instr); + void Simulate_ZdaT_PgM_ZnTb(const Instruction* instr); + void Simulate_ZdaT_ZnT_ZmT(const Instruction* instr); + void Simulate_ZdaT_ZnT_const(const Instruction* instr); + void Simulate_ZdaT_ZnTb_ZmTb(const Instruction* instr); + void Simulate_ZdnT_PgM_ZdnT_ZmT(const Instruction* instr); + void Simulate_ZdnT_PgM_ZdnT_const(const Instruction* instr); + void Simulate_ZdnT_ZdnT_ZmT_const(const Instruction* instr); + void Simulate_ZtD_PgZ_ZnD_Xm(const Instruction* instr); + void Simulate_ZtD_Pg_ZnD_Xm(const Instruction* instr); + void Simulate_ZtS_PgZ_ZnS_Xm(const Instruction* instr); + void Simulate_ZtS_Pg_ZnS_Xm(const Instruction* instr); + + void SimulateSVEHalvingAddSub(const Instruction* instr); + void SimulateSVESaturatingArithmetic(const Instruction* instr); + void SimulateSVEIntArithPair(const Instruction* instr); + void SimulateSVENarrow(const Instruction* instr); + void SimulateSVEInterleavedArithLong(const Instruction* instr); + void SimulateSVEShiftLeftImm(const Instruction* instr); + void SimulateSVEAddSubCarry(const Instruction* instr); + void SimulateSVEAddSubHigh(const Instruction* instr); + void SimulateSVEIntMulLongVec(const Instruction* instr); + void SimulateSVESaturatingIntMulLongIdx(const Instruction* instr); + void SimulateSVEExclusiveOrRotate(const Instruction* instr); + void SimulateSVEBitwiseTernary(const Instruction* instr); + void SimulateSVEComplexDotProduct(const Instruction* instr); + void SimulateSVEMulIndex(const Instruction* instr); + void SimulateSVEMlaMlsIndex(const Instruction* instr); + void SimulateSVEComplexIntMulAdd(const Instruction* instr); + void SimulateSVESaturatingMulAddHigh(const Instruction* instr); + void SimulateSVESaturatingMulHighIndex(const Instruction* instr); + void SimulateSVEFPConvertLong(const Instruction* instr); + void SimulateMatrixMul(const Instruction* instr); + void SimulateSVEFPMatrixMul(const Instruction* instr); + void SimulateNEONMulByElementLong(const Instruction* instr); + void SimulateNEONFPMulByElement(const Instruction* instr); + void SimulateNEONFPMulByElementLong(const Instruction* instr); + void SimulateNEONComplexMulByElement(const Instruction* instr); + void SimulateNEONDotProdByElement(const Instruction* instr); + void SimulateMTEAddSubTag(const Instruction* instr); + void SimulateMTETagMaskInsert(const Instruction* instr); + void SimulateMTESubPointer(const Instruction* instr); + void SimulateMTELoadTag(const Instruction* instr); + void SimulateMTEStoreTag(const Instruction* instr); + void SimulateMTEStoreTagPair(const Instruction* instr); + void Simulate_XdSP_XnSP_Xm(const Instruction* instr); + void SimulateCpy(const Instruction* instr); + void SimulateCpyFP(const Instruction* instr); + void SimulateCpyP(const Instruction* instr); + void SimulateCpyM(const Instruction* instr); + void SimulateCpyE(const Instruction* instr); + void SimulateSetP(const Instruction* instr); + void SimulateSetM(const Instruction* instr); + void SimulateSetE(const Instruction* instr); + void SimulateSetGP(const Instruction* instr); + void SimulateSetGM(const Instruction* instr); + void SimulateSignedMinMax(const Instruction* instr); + void SimulateUnsignedMinMax(const Instruction* instr); + // Integer register accessors. @@ -820,6 +1447,13 @@ class Simulator : public DecoderVisitor { return ReadXRegister(code, r31mode); } + SimPRegister& ReadPRegister(unsigned code) { + VIXL_ASSERT(code < kNumberOfPRegisters); + return pregisters_[code]; + } + + SimFFRRegister& ReadFFR() { return ffr_register_; } + // As above, with parameterized size and return type. The value is // either zero-extended or truncated to fit, as required. template @@ -870,6 +1504,10 @@ class Simulator : public DecoderVisitor { // Write 'value' into an integer register. The value is zero-extended. This // behaviour matches AArch64 register writes. + // + // SP may be specified in one of two ways: + // - (code == kSPRegInternalCode) && (r31mode == Reg31IsZeroRegister) + // - (code == 31) && (r31mode == Reg31IsStackPointer) template void WriteRegister(unsigned code, T value, @@ -889,20 +1527,25 @@ class Simulator : public DecoderVisitor { VIXL_ASSERT((sizeof(T) == kWRegSizeInBytes) || (sizeof(T) == kXRegSizeInBytes)); VIXL_ASSERT( - code < kNumberOfRegisters || + (code < kNumberOfRegisters) || ((r31mode == Reg31IsZeroRegister) && (code == kSPRegInternalCode))); - if ((code == 31) && (r31mode == Reg31IsZeroRegister)) { - return; - } - - if ((r31mode == Reg31IsZeroRegister) && (code == kSPRegInternalCode)) { - code = 31; + if (code == 31) { + if (r31mode == Reg31IsZeroRegister) { + // Discard writes to the zero register. + return; + } else { + code = kSPRegInternalCode; + } } - registers_[code].Write(value); + // registers_[31] is the stack pointer. + VIXL_STATIC_ASSERT((kSPRegInternalCode % kNumberOfRegisters) == 31); + registers_[code % kNumberOfRegisters].Write(value); - if (log_mode == LogRegWrites) LogRegister(code, r31mode); + if (log_mode == LogRegWrites) { + LogRegister(code, GetPrintRegisterFormatForSize(sizeof(T))); + } } template VIXL_DEPRECATED("WriteRegister", @@ -1008,6 +1651,11 @@ class Simulator : public DecoderVisitor { uint8_t val[kQRegSizeInBytes]; }; + // A structure for representing a SVE Z register. + struct zreg_t { + uint8_t val[kZRegMaxSizeInBytes]; + }; + // Basic accessor: read the register as the specified type. template T ReadVRegister(unsigned code) const { @@ -1123,7 +1771,8 @@ class Simulator : public DecoderVisitor { (sizeof(value) == kHRegSizeInBytes) || (sizeof(value) == kSRegSizeInBytes) || (sizeof(value) == kDRegSizeInBytes) || - (sizeof(value) == kQRegSizeInBytes)); + (sizeof(value) == kQRegSizeInBytes) || + (sizeof(value) == kZRegMaxSizeInBytes)); VIXL_ASSERT(code < kNumberOfVRegisters); vregisters_[code].Write(value); @@ -1230,6 +1879,12 @@ class Simulator : public DecoderVisitor { WriteQRegister(code, value, log_mode); } + void WriteZRegister(unsigned code, + zreg_t value, + RegLogMode log_mode = LogRegWrites) { + WriteVRegister(code, value, log_mode); + } + template T ReadRegister(Register reg) const { return ReadRegister(reg.GetCode(), Reg31IsZeroRegister); @@ -1274,6 +1929,65 @@ class Simulator : public DecoderVisitor { } } + template + T MemRead(A address) const { + Instruction const* pc = ReadPc(); + return memory_.Read(address, pc); + } + + template + void MemWrite(A address, T value) const { + Instruction const* pc = ReadPc(); + return memory_.Write(address, value, pc); + } + + template + uint64_t MemReadUint(int size_in_bytes, A address) const { + return memory_.ReadUint(size_in_bytes, address); + } + + template + int64_t MemReadInt(int size_in_bytes, A address) const { + return memory_.ReadInt(size_in_bytes, address); + } + + template + void MemWrite(int size_in_bytes, A address, uint64_t value) const { + return memory_.Write(size_in_bytes, address, value); + } + + void LoadLane(LogicVRegister dst, + VectorFormat vform, + int index, + uint64_t addr) const { + unsigned msize_in_bytes = LaneSizeInBytesFromFormat(vform); + LoadUintToLane(dst, vform, msize_in_bytes, index, addr); + } + + void LoadUintToLane(LogicVRegister dst, + VectorFormat vform, + unsigned msize_in_bytes, + int index, + uint64_t addr) const { + dst.SetUint(vform, index, MemReadUint(msize_in_bytes, addr)); + } + + void LoadIntToLane(LogicVRegister dst, + VectorFormat vform, + unsigned msize_in_bytes, + int index, + uint64_t addr) const { + dst.SetInt(vform, index, MemReadInt(msize_in_bytes, addr)); + } + + void StoreLane(const LogicVRegister& src, + VectorFormat vform, + int index, + uint64_t addr) const { + unsigned msize_in_bytes = LaneSizeInBytesFromFormat(vform); + MemWrite(msize_in_bytes, addr, src.Uint(vform, index)); + } + uint64_t ComputeMemOperandAddress(const MemOperand& mem_op) const; template @@ -1282,7 +1996,7 @@ class Simulator : public DecoderVisitor { return ReadCPURegister(operand.GetCPURegister()); } else { VIXL_ASSERT(operand.IsMemOperand()); - return Memory::Read(ComputeMemOperandAddress(operand.GetMemOperand())); + return MemRead(ComputeMemOperandAddress(operand.GetMemOperand())); } } @@ -1303,7 +2017,7 @@ class Simulator : public DecoderVisitor { WriteCPURegister(operand.GetCPURegister(), raw, log_mode); } else { VIXL_ASSERT(operand.IsMemOperand()); - Memory::Write(ComputeMemOperandAddress(operand.GetMemOperand()), value); + MemWrite(ComputeMemOperandAddress(operand.GetMemOperand()), value); } } @@ -1350,14 +2064,16 @@ class Simulator : public DecoderVisitor { kPrintRegLaneSizeD = 3 << 0, kPrintRegLaneSizeX = kPrintRegLaneSizeD, kPrintRegLaneSizeQ = 4 << 0, + kPrintRegLaneSizeUnknown = 5 << 0, kPrintRegLaneSizeOffset = 0, kPrintRegLaneSizeMask = 7 << 0, - // The lane count. + // The overall register size. kPrintRegAsScalar = 0, kPrintRegAsDVector = 1 << 3, kPrintRegAsQVector = 2 << 3, + kPrintRegAsSVEVector = 3 << 3, kPrintRegAsVectorMask = 3 << 3, @@ -1365,37 +2081,98 @@ class Simulator : public DecoderVisitor { // S-, H-, and D-sized lanes.) kPrintRegAsFP = 1 << 5, - // Supported combinations. - - kPrintXReg = kPrintRegLaneSizeX | kPrintRegAsScalar, - kPrintWReg = kPrintRegLaneSizeW | kPrintRegAsScalar, - kPrintHReg = kPrintRegLaneSizeH | kPrintRegAsScalar | kPrintRegAsFP, - kPrintSReg = kPrintRegLaneSizeS | kPrintRegAsScalar | kPrintRegAsFP, - kPrintDReg = kPrintRegLaneSizeD | kPrintRegAsScalar | kPrintRegAsFP, - - kPrintReg1B = kPrintRegLaneSizeB | kPrintRegAsScalar, - kPrintReg8B = kPrintRegLaneSizeB | kPrintRegAsDVector, - kPrintReg16B = kPrintRegLaneSizeB | kPrintRegAsQVector, - kPrintReg1H = kPrintRegLaneSizeH | kPrintRegAsScalar, - kPrintReg4H = kPrintRegLaneSizeH | kPrintRegAsDVector, - kPrintReg8H = kPrintRegLaneSizeH | kPrintRegAsQVector, - kPrintReg1S = kPrintRegLaneSizeS | kPrintRegAsScalar, - kPrintReg2S = kPrintRegLaneSizeS | kPrintRegAsDVector, - kPrintReg4S = kPrintRegLaneSizeS | kPrintRegAsQVector, - kPrintReg1HFP = kPrintRegLaneSizeH | kPrintRegAsScalar | kPrintRegAsFP, - kPrintReg4HFP = kPrintRegLaneSizeH | kPrintRegAsDVector | kPrintRegAsFP, - kPrintReg8HFP = kPrintRegLaneSizeH | kPrintRegAsQVector | kPrintRegAsFP, - kPrintReg1SFP = kPrintRegLaneSizeS | kPrintRegAsScalar | kPrintRegAsFP, - kPrintReg2SFP = kPrintRegLaneSizeS | kPrintRegAsDVector | kPrintRegAsFP, - kPrintReg4SFP = kPrintRegLaneSizeS | kPrintRegAsQVector | kPrintRegAsFP, - kPrintReg1D = kPrintRegLaneSizeD | kPrintRegAsScalar, - kPrintReg2D = kPrintRegLaneSizeD | kPrintRegAsQVector, - kPrintReg1DFP = kPrintRegLaneSizeD | kPrintRegAsScalar | kPrintRegAsFP, - kPrintReg2DFP = kPrintRegLaneSizeD | kPrintRegAsQVector | kPrintRegAsFP, - kPrintReg1Q = kPrintRegLaneSizeQ | kPrintRegAsScalar + // With this flag, print helpers won't check that the upper bits are zero. + // This also forces the register name to be printed with the `reg` + // format. + // + // The flag is supported with any PrintRegisterFormat other than those with + // kPrintRegAsSVEVector. + kPrintRegPartial = 1 << 6, + +// Supported combinations. +// These exist so that they can be referred to by name, but also because C++ +// does not allow enum types to hold values that aren't explicitly +// enumerated, and we want to be able to combine the above flags. + +// Scalar formats. +#define VIXL_DECL_PRINT_REG_SCALAR(size) \ + kPrint##size##Reg = kPrintRegLaneSize##size | kPrintRegAsScalar, \ + kPrint##size##RegPartial = kPrintRegLaneSize##size | kPrintRegPartial +#define VIXL_DECL_PRINT_REG_SCALAR_FP(size) \ + VIXL_DECL_PRINT_REG_SCALAR(size) \ + , kPrint##size##RegFP = kPrint##size##Reg | kPrintRegAsFP, \ + kPrint##size##RegPartialFP = kPrint##size##RegPartial | kPrintRegAsFP + VIXL_DECL_PRINT_REG_SCALAR(W), + VIXL_DECL_PRINT_REG_SCALAR(X), + VIXL_DECL_PRINT_REG_SCALAR_FP(H), + VIXL_DECL_PRINT_REG_SCALAR_FP(S), + VIXL_DECL_PRINT_REG_SCALAR_FP(D), + VIXL_DECL_PRINT_REG_SCALAR(Q), +#undef VIXL_DECL_PRINT_REG_SCALAR +#undef VIXL_DECL_PRINT_REG_SCALAR_FP + +#define VIXL_DECL_PRINT_REG_NEON(count, type, size) \ + kPrintReg##count##type = kPrintRegLaneSize##type | kPrintRegAs##size, \ + kPrintReg##count##type##Partial = kPrintReg##count##type | kPrintRegPartial +#define VIXL_DECL_PRINT_REG_NEON_FP(count, type, size) \ + VIXL_DECL_PRINT_REG_NEON(count, type, size) \ + , kPrintReg##count##type##FP = kPrintReg##count##type | kPrintRegAsFP, \ + kPrintReg##count##type##PartialFP = \ + kPrintReg##count##type##Partial | kPrintRegAsFP + VIXL_DECL_PRINT_REG_NEON(1, B, Scalar), + VIXL_DECL_PRINT_REG_NEON(8, B, DVector), + VIXL_DECL_PRINT_REG_NEON(16, B, QVector), + VIXL_DECL_PRINT_REG_NEON_FP(1, H, Scalar), + VIXL_DECL_PRINT_REG_NEON_FP(4, H, DVector), + VIXL_DECL_PRINT_REG_NEON_FP(8, H, QVector), + VIXL_DECL_PRINT_REG_NEON_FP(1, S, Scalar), + VIXL_DECL_PRINT_REG_NEON_FP(2, S, DVector), + VIXL_DECL_PRINT_REG_NEON_FP(4, S, QVector), + VIXL_DECL_PRINT_REG_NEON_FP(1, D, Scalar), + VIXL_DECL_PRINT_REG_NEON_FP(2, D, QVector), + VIXL_DECL_PRINT_REG_NEON(1, Q, Scalar), +#undef VIXL_DECL_PRINT_REG_NEON +#undef VIXL_DECL_PRINT_REG_NEON_FP + +#define VIXL_DECL_PRINT_REG_SVE(type) \ + kPrintRegVn##type = kPrintRegLaneSize##type | kPrintRegAsSVEVector, \ + kPrintRegVn##type##Partial = kPrintRegVn##type | kPrintRegPartial +#define VIXL_DECL_PRINT_REG_SVE_FP(type) \ + VIXL_DECL_PRINT_REG_SVE(type) \ + , kPrintRegVn##type##FP = kPrintRegVn##type | kPrintRegAsFP, \ + kPrintRegVn##type##PartialFP = kPrintRegVn##type##Partial | kPrintRegAsFP + VIXL_DECL_PRINT_REG_SVE(B), + VIXL_DECL_PRINT_REG_SVE_FP(H), + VIXL_DECL_PRINT_REG_SVE_FP(S), + VIXL_DECL_PRINT_REG_SVE_FP(D), + VIXL_DECL_PRINT_REG_SVE(Q) +#undef VIXL_DECL_PRINT_REG_SVE +#undef VIXL_DECL_PRINT_REG_SVE_FP }; + // Return `format` with the kPrintRegPartial flag set. + PrintRegisterFormat GetPrintRegPartial(PrintRegisterFormat format) { + // Every PrintRegisterFormat has a kPrintRegPartial counterpart, so the + // result of this cast will always be well-defined. + return static_cast(format | kPrintRegPartial); + } + + // For SVE formats, return the format of a Q register part of it. + PrintRegisterFormat GetPrintRegAsQChunkOfSVE(PrintRegisterFormat format) { + VIXL_ASSERT((format & kPrintRegAsVectorMask) == kPrintRegAsSVEVector); + // Keep the FP and lane size fields. + int q_format = format & (kPrintRegLaneSizeMask | kPrintRegAsFP); + // The resulting format must always be partial, because we're not formatting + // the whole Z register. + q_format |= (kPrintRegAsQVector | kPrintRegPartial); + + // This cast is always safe because NEON QVector formats support every + // combination of FP and lane size that SVE formats do. + return static_cast(q_format); + } + unsigned GetPrintRegLaneSizeInBytesLog2(PrintRegisterFormat format) { + VIXL_ASSERT((format & kPrintRegLaneSizeMask) != kPrintRegLaneSizeUnknown); return (format & kPrintRegLaneSizeMask) >> kPrintRegLaneSizeOffset; } @@ -1404,17 +2181,51 @@ class Simulator : public DecoderVisitor { } unsigned GetPrintRegSizeInBytesLog2(PrintRegisterFormat format) { - if (format & kPrintRegAsDVector) return kDRegSizeInBytesLog2; - if (format & kPrintRegAsQVector) return kQRegSizeInBytesLog2; - - // Scalar types. - return GetPrintRegLaneSizeInBytesLog2(format); + switch (format & kPrintRegAsVectorMask) { + case kPrintRegAsScalar: + return GetPrintRegLaneSizeInBytesLog2(format); + case kPrintRegAsDVector: + return kDRegSizeInBytesLog2; + case kPrintRegAsQVector: + return kQRegSizeInBytesLog2; + default: + case kPrintRegAsSVEVector: + // We print SVE vectors in Q-sized chunks. These need special handling, + // and it's probably an error to call this function in that case. + VIXL_UNREACHABLE(); + return kQRegSizeInBytesLog2; + } } unsigned GetPrintRegSizeInBytes(PrintRegisterFormat format) { return 1 << GetPrintRegSizeInBytesLog2(format); } + unsigned GetPrintRegSizeInBitsLog2(PrintRegisterFormat format) { + return GetPrintRegSizeInBytesLog2(format) + kBitsPerByteLog2; + } + + unsigned GetPrintRegSizeInBits(PrintRegisterFormat format) { + return 1 << GetPrintRegSizeInBitsLog2(format); + } + + const char* GetPartialRegSuffix(PrintRegisterFormat format) { + switch (GetPrintRegSizeInBitsLog2(format)) { + case kBRegSizeLog2: + return "<7:0>"; + case kHRegSizeLog2: + return "<15:0>"; + case kSRegSizeLog2: + return "<31:0>"; + case kDRegSizeLog2: + return "<63:0>"; + case kQRegSizeLog2: + return "<127:0>"; + } + VIXL_UNREACHABLE(); + return ""; + } + unsigned GetPrintRegLaneCount(PrintRegisterFormat format) { unsigned reg_size_log2 = GetPrintRegSizeInBytesLog2(format); unsigned lane_size_log2 = GetPrintRegLaneSizeInBytesLog2(format); @@ -1422,6 +2233,21 @@ class Simulator : public DecoderVisitor { return 1 << (reg_size_log2 - lane_size_log2); } + uint16_t GetPrintRegLaneMask(PrintRegisterFormat format) { + int print_as = format & kPrintRegAsVectorMask; + if (print_as == kPrintRegAsScalar) return 1; + + // Vector formats, including SVE formats printed in Q-sized chunks. + static const uint16_t masks[] = {0xffff, 0x5555, 0x1111, 0x0101, 0x0001}; + unsigned size_in_bytes_log2 = GetPrintRegLaneSizeInBytesLog2(format); + VIXL_ASSERT(size_in_bytes_log2 < ArrayLength(masks)); + uint16_t mask = masks[size_in_bytes_log2]; + + // Exclude lanes that aren't visible in D vectors. + if (print_as == kPrintRegAsDVector) mask &= 0x00ff; + return mask; + } + PrintRegisterFormat GetPrintRegisterFormatForSize(unsigned reg_size, unsigned lane_size); @@ -1452,6 +2278,10 @@ class Simulator : public DecoderVisitor { return format; } + PrintRegisterFormat GetPrintRegisterFormatForSizeTryFP(unsigned size) { + return GetPrintRegisterFormatTryFP(GetPrintRegisterFormatForSize(size)); + } + template PrintRegisterFormat GetPrintRegisterFormat(T value) { return GetPrintRegisterFormatForSize(sizeof(value)); @@ -1478,99 +2308,317 @@ class Simulator : public DecoderVisitor { // Print all registers of the specified types. void PrintRegisters(); void PrintVRegisters(); + void PrintZRegisters(); void PrintSystemRegisters(); // As above, but only print the registers that have been updated. void PrintWrittenRegisters(); void PrintWrittenVRegisters(); + void PrintWrittenPRegisters(); // As above, but respect LOG_REG and LOG_VREG. void LogWrittenRegisters() { - if (GetTraceParameters() & LOG_REGS) PrintWrittenRegisters(); + if (ShouldTraceRegs()) PrintWrittenRegisters(); } void LogWrittenVRegisters() { - if (GetTraceParameters() & LOG_VREGS) PrintWrittenVRegisters(); + if (ShouldTraceVRegs()) PrintWrittenVRegisters(); + } + void LogWrittenPRegisters() { + if (ShouldTraceVRegs()) PrintWrittenPRegisters(); } void LogAllWrittenRegisters() { LogWrittenRegisters(); LogWrittenVRegisters(); + LogWrittenPRegisters(); + } + + // The amount of space to leave for a register name. This is used to keep the + // values vertically aligned. The longest register name has the form + // "z31<2047:1920>". The total overall value indentation must also take into + // account the fixed formatting: "# {name}: 0x{value}". + static const int kPrintRegisterNameFieldWidth = 14; + + // Print whole, individual register values. + // - The format can be used to restrict how much of the register is printed, + // but such formats indicate that the unprinted high-order bits are zero and + // these helpers will assert that. + // - If the format includes the kPrintRegAsFP flag then human-friendly FP + // value annotations will be printed. + // - The suffix can be used to add annotations (such as memory access + // details), or to suppress the newline. + void PrintRegister(int code, + PrintRegisterFormat format = kPrintXReg, + const char* suffix = "\n"); + void PrintVRegister(int code, + PrintRegisterFormat format = kPrintReg1Q, + const char* suffix = "\n"); + // PrintZRegister and PrintPRegister print over several lines, so they cannot + // allow the suffix to be overridden. + void PrintZRegister(int code, PrintRegisterFormat format = kPrintRegVnQ); + void PrintPRegister(int code, PrintRegisterFormat format = kPrintRegVnQ); + void PrintFFR(PrintRegisterFormat format = kPrintRegVnQ); + // Print a single Q-sized part of a Z register, or the corresponding two-byte + // part of a P register. These print single lines, and therefore allow the + // suffix to be overridden. The format must include the kPrintRegPartial flag. + void PrintPartialZRegister(int code, + int q_index, + PrintRegisterFormat format = kPrintRegVnQ, + const char* suffix = "\n"); + void PrintPartialPRegister(int code, + int q_index, + PrintRegisterFormat format = kPrintRegVnQ, + const char* suffix = "\n"); + void PrintPartialPRegister(const char* name, + const SimPRegister& reg, + int q_index, + PrintRegisterFormat format = kPrintRegVnQ, + const char* suffix = "\n"); + + // Like Print*Register (above), but respect trace parameters. + void LogRegister(unsigned code, PrintRegisterFormat format) { + if (ShouldTraceRegs()) PrintRegister(code, format); + } + void LogVRegister(unsigned code, PrintRegisterFormat format) { + if (ShouldTraceVRegs()) PrintVRegister(code, format); + } + void LogZRegister(unsigned code, PrintRegisterFormat format) { + if (ShouldTraceVRegs()) PrintZRegister(code, format); + } + void LogPRegister(unsigned code, PrintRegisterFormat format) { + if (ShouldTraceVRegs()) PrintPRegister(code, format); + } + void LogFFR(PrintRegisterFormat format) { + if (ShouldTraceVRegs()) PrintFFR(format); } - // Print individual register values (after update). - void PrintRegister(unsigned code, Reg31Mode r31mode = Reg31IsStackPointer); - void PrintVRegister(unsigned code, PrintRegisterFormat format); + // Other state updates, including system registers. void PrintSystemRegister(SystemRegister id); void PrintTakenBranch(const Instruction* target); + void LogSystemRegister(SystemRegister id) { + if (ShouldTraceSysRegs()) PrintSystemRegister(id); + } + void LogTakenBranch(const Instruction* target) { + if (ShouldTraceBranches()) PrintTakenBranch(target); + } + + // Trace memory accesses. + + // Common, contiguous register accesses (such as for scalars). + // The *Write variants automatically set kPrintRegPartial on the format. + void PrintRead(int rt_code, PrintRegisterFormat format, uintptr_t address); + void PrintExtendingRead(int rt_code, + PrintRegisterFormat format, + int access_size_in_bytes, + uintptr_t address); + void PrintWrite(int rt_code, PrintRegisterFormat format, uintptr_t address); + void PrintVRead(int rt_code, PrintRegisterFormat format, uintptr_t address); + void PrintVWrite(int rt_code, PrintRegisterFormat format, uintptr_t address); + // Simple, unpredicated SVE accesses always access the whole vector, and never + // know the lane type, so there's no need to accept a `format`. + void PrintZRead(int rt_code, uintptr_t address) { + vregisters_[rt_code].NotifyRegisterLogged(); + PrintZAccess(rt_code, "<-", address); + } + void PrintZWrite(int rt_code, uintptr_t address) { + PrintZAccess(rt_code, "->", address); + } + void PrintPRead(int rt_code, uintptr_t address) { + pregisters_[rt_code].NotifyRegisterLogged(); + PrintPAccess(rt_code, "<-", address); + } + void PrintPWrite(int rt_code, uintptr_t address) { + PrintPAccess(rt_code, "->", address); + } // Like Print* (above), but respect GetTraceParameters(). - void LogRegister(unsigned code, Reg31Mode r31mode = Reg31IsStackPointer) { - if (GetTraceParameters() & LOG_REGS) PrintRegister(code, r31mode); + void LogRead(int rt_code, PrintRegisterFormat format, uintptr_t address) { + if (ShouldTraceRegs()) PrintRead(rt_code, format, address); + } + void LogExtendingRead(int rt_code, + PrintRegisterFormat format, + int access_size_in_bytes, + uintptr_t address) { + if (ShouldTraceRegs()) { + PrintExtendingRead(rt_code, format, access_size_in_bytes, address); + } } - void LogVRegister(unsigned code, PrintRegisterFormat format) { - if (GetTraceParameters() & LOG_VREGS) PrintVRegister(code, format); + void LogWrite(int rt_code, PrintRegisterFormat format, uintptr_t address) { + if (ShouldTraceWrites()) PrintWrite(rt_code, format, address); } - void LogSystemRegister(SystemRegister id) { - if (GetTraceParameters() & LOG_SYSREGS) PrintSystemRegister(id); + void LogVRead(int rt_code, PrintRegisterFormat format, uintptr_t address) { + if (ShouldTraceVRegs()) PrintVRead(rt_code, format, address); } - void LogTakenBranch(const Instruction* target) { - if (GetTraceParameters() & LOG_BRANCH) PrintTakenBranch(target); - } - - // Print memory accesses. - void PrintRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format); - void PrintWrite(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format); - void PrintVRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format, - unsigned lane); - void PrintVWrite(uintptr_t address, - unsigned reg_code, + void LogVWrite(int rt_code, PrintRegisterFormat format, uintptr_t address) { + if (ShouldTraceWrites()) PrintVWrite(rt_code, format, address); + } + void LogZRead(int rt_code, uintptr_t address) { + if (ShouldTraceVRegs()) PrintZRead(rt_code, address); + } + void LogZWrite(int rt_code, uintptr_t address) { + if (ShouldTraceWrites()) PrintZWrite(rt_code, address); + } + void LogPRead(int rt_code, uintptr_t address) { + if (ShouldTraceVRegs()) PrintPRead(rt_code, address); + } + void LogPWrite(int rt_code, uintptr_t address) { + if (ShouldTraceWrites()) PrintPWrite(rt_code, address); + } + void LogMemTransfer(uintptr_t dst, uintptr_t src, uint8_t value) { + if (ShouldTraceWrites()) PrintMemTransfer(dst, src, value); + } + // Helpers for the above, where the access operation is parameterised. + // - For loads, set op = "<-". + // - For stores, set op = "->". + void PrintAccess(int rt_code, PrintRegisterFormat format, - unsigned lane); + const char* op, + uintptr_t address); + void PrintVAccess(int rt_code, + PrintRegisterFormat format, + const char* op, + uintptr_t address); + void PrintMemTransfer(uintptr_t dst, uintptr_t src, uint8_t value); + // Simple, unpredicated SVE accesses always access the whole vector, and never + // know the lane type, so these don't accept a `format`. + void PrintZAccess(int rt_code, const char* op, uintptr_t address); + void PrintPAccess(int rt_code, const char* op, uintptr_t address); + + // Multiple-structure accesses. + void PrintVStructAccess(int rt_code, + int reg_count, + PrintRegisterFormat format, + const char* op, + uintptr_t address); + // Single-structure (single-lane) accesses. + void PrintVSingleStructAccess(int rt_code, + int reg_count, + int lane, + PrintRegisterFormat format, + const char* op, + uintptr_t address); + // Replicating accesses. + void PrintVReplicatingStructAccess(int rt_code, + int reg_count, + PrintRegisterFormat format, + const char* op, + uintptr_t address); + + // Multiple-structure accesses. + void PrintZStructAccess(int rt_code, + int reg_count, + const LogicPRegister& pg, + PrintRegisterFormat format, + int msize_in_bytes, + const char* op, + const LogicSVEAddressVector& addr); + + // Register-printing helper for all structured accessors. + // + // All lanes (according to `format`) are printed, but lanes indicated by + // `focus_mask` are of particular interest. Each bit corresponds to a byte in + // the printed register, in a manner similar to SVE's predicates. Currently, + // this is used to determine when to print human-readable FP annotations. + void PrintVRegistersForStructuredAccess(int rt_code, + int reg_count, + uint16_t focus_mask, + PrintRegisterFormat format); + + // As for the VRegister variant, but print partial Z register names. + void PrintZRegistersForStructuredAccess(int rt_code, + int q_index, + int reg_count, + uint16_t focus_mask, + PrintRegisterFormat format); + + // Print part of a memory access. This should be used for annotating + // non-trivial accesses, such as structured or sign-extending loads. Call + // Print*Register (or Print*RegistersForStructuredAccess), then + // PrintPartialAccess for each contiguous access that makes up the + // instruction. + // + // access_mask: + // The lanes to be printed. Each bit corresponds to a byte in the printed + // register, in a manner similar to SVE's predicates, except that the + // lane size is not respected when interpreting lane_mask: unaligned bits + // must be zeroed. + // + // This function asserts that this mask is non-zero. + // + // future_access_mask: + // The lanes to be printed by a future invocation. This must be specified + // because vertical lines are drawn for partial accesses that haven't yet + // been printed. The format is the same as for accessed_mask. + // + // If a lane is active in both `access_mask` and `future_access_mask`, + // `access_mask` takes precedence. + // + // struct_element_count: + // The number of elements in each structure. For non-structured accesses, + // set this to one. Along with lane_size_in_bytes, this is used determine + // the size of each access, and to format the accessed value. + // + // op: + // For stores, use "->". For loads, use "<-". + // + // address: + // The address of this partial access. (Not the base address of the whole + // instruction.) The traced value is read from this address (according to + // part_count and lane_size_in_bytes) so it must be accessible, and when + // tracing stores, the store must have been executed before this function + // is called. + // + // reg_size_in_bytes: + // The size of the register being accessed. This helper is usually used + // for V registers or Q-sized chunks of Z registers, so that is the + // default, but it is possible to use this to annotate X register + // accesses by specifying kXRegSizeInBytes. + // + // The return value is a future_access_mask suitable for the next iteration, + // so that it is possible to execute this in a loop, until the mask is zero. + // Note that accessed_mask must still be updated by the caller for each call. + uint16_t PrintPartialAccess(uint16_t access_mask, + uint16_t future_access_mask, + int struct_element_count, + int lane_size_in_bytes, + const char* op, + uintptr_t address, + int reg_size_in_bytes = kQRegSizeInBytes); + + // Print an abstract register value. This works for all register types, and + // can print parts of registers. This exists to ensure consistent formatting + // of values. + void PrintRegisterValue(const uint8_t* value, + int value_size, + PrintRegisterFormat format); + template + void PrintRegisterValue(const T& sim_register, PrintRegisterFormat format) { + PrintRegisterValue(sim_register.GetBytes(), + std::min(sim_register.GetSizeInBytes(), + kQRegSizeInBytes), + format); + } - // Like Print* (above), but respect GetTraceParameters(). - void LogRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format) { - if (GetTraceParameters() & LOG_REGS) PrintRead(address, reg_code, format); - } - void LogWrite(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format) { - if (GetTraceParameters() & LOG_WRITE) PrintWrite(address, reg_code, format); - } - void LogVRead(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format, - unsigned lane = 0) { - if (GetTraceParameters() & LOG_VREGS) { - PrintVRead(address, reg_code, format, lane); - } - } - void LogVWrite(uintptr_t address, - unsigned reg_code, - PrintRegisterFormat format, - unsigned lane = 0) { - if (GetTraceParameters() & LOG_WRITE) { - PrintVWrite(address, reg_code, format, lane); - } - } - - // Helper functions for register tracing. - void PrintRegisterRawHelper(unsigned code, - Reg31Mode r31mode, - int size_in_bytes = kXRegSizeInBytes); - void PrintVRegisterRawHelper(unsigned code, - int bytes = kQRegSizeInBytes, - int lsb = 0); - void PrintVRegisterFPHelper(unsigned code, - unsigned lane_size_in_bytes, - int lane_count = 1, - int rightmost_lane = 0); + // As above, but format as an SVE predicate value, using binary notation with + // spaces between each bit so that they align with the Z register bytes that + // they predicate. + void PrintPRegisterValue(uint16_t value); + + void PrintRegisterValueFPAnnotations(const uint8_t* value, + uint16_t lane_mask, + PrintRegisterFormat format); + template + void PrintRegisterValueFPAnnotations(const T& sim_register, + uint16_t lane_mask, + PrintRegisterFormat format) { + PrintRegisterValueFPAnnotations(sim_register.GetBytes(), lane_mask, format); + } + template + void PrintRegisterValueFPAnnotations(const T& sim_register, + PrintRegisterFormat format) { + PrintRegisterValueFPAnnotations(sim_register.GetBytes(), + GetPrintRegLaneMask(format), + format); + } VIXL_NO_RETURN void DoUnreachable(const Instruction* instr); void DoTrace(const Instruction* instr); @@ -1580,10 +2628,13 @@ class Simulator : public DecoderVisitor { Reg31Mode mode = Reg31IsZeroRegister); static const char* XRegNameForCode(unsigned code, Reg31Mode mode = Reg31IsZeroRegister); + static const char* BRegNameForCode(unsigned code); static const char* HRegNameForCode(unsigned code); static const char* SRegNameForCode(unsigned code); static const char* DRegNameForCode(unsigned code); static const char* VRegNameForCode(unsigned code); + static const char* ZRegNameForCode(unsigned code); + static const char* PRegNameForCode(unsigned code); bool IsColouredTrace() const { return coloured_trace_; } VIXL_DEPRECATED("IsColouredTrace", bool coloured_trace() const) { @@ -1602,18 +2653,28 @@ class Simulator : public DecoderVisitor { return GetTraceParameters(); } + bool ShouldTraceWrites() const { + return (GetTraceParameters() & LOG_WRITE) != 0; + } + bool ShouldTraceRegs() const { + return (GetTraceParameters() & LOG_REGS) != 0; + } + bool ShouldTraceVRegs() const { + return (GetTraceParameters() & LOG_VREGS) != 0; + } + bool ShouldTraceSysRegs() const { + return (GetTraceParameters() & LOG_SYSREGS) != 0; + } + bool ShouldTraceBranches() const { + return (GetTraceParameters() & LOG_BRANCH) != 0; + } + void SetTraceParameters(int parameters); VIXL_DEPRECATED("SetTraceParameters", void set_trace_parameters(int parameters)) { SetTraceParameters(parameters); } - void SetInstructionStats(bool value); - VIXL_DEPRECATED("SetInstructionStats", - void set_instruction_stats(bool value)) { - SetInstructionStats(value); - } - // Clear the simulated local monitor to force the next store-exclusive // instruction to fail. void ClearLocalMonitor() { local_monitor_.Clear(); } @@ -1684,6 +2745,48 @@ class Simulator : public DecoderVisitor { PointerType type); uint64_t AddPAC(uint64_t ptr, uint64_t context, PACKey key, PointerType type); uint64_t StripPAC(uint64_t ptr, PointerType type); + void PACHelper(int dst, + int src, + PACKey key, + decltype(&Simulator::AddPAC) pac_fn); + + // Armv8.5 MTE helpers. + uint64_t ChooseNonExcludedTag(uint64_t tag, + uint64_t offset, + uint64_t exclude = 0) { + VIXL_ASSERT(IsUint4(tag) && IsUint4(offset) && IsUint16(exclude)); + + if (exclude == 0xffff) { + return 0; + } + + if (offset == 0) { + while ((exclude & (1 << tag)) != 0) { + tag = (tag + 1) % 16; + } + } + + while (offset > 0) { + offset--; + tag = (tag + 1) % 16; + while ((exclude & (1 << tag)) != 0) { + tag = (tag + 1) % 16; + } + } + return tag; + } + + uint64_t GetAddressWithAllocationTag(uint64_t addr, uint64_t tag) { + VIXL_ASSERT(IsUint4(tag)); + return (addr & ~(UINT64_C(0xf) << 56)) | (tag << 56); + } + + // Create or remove a mapping with memory protection. Memory attributes such + // as MTE and BTI are represented by metadata in Simulator. + void* Mmap( + void* address, size_t length, int prot, int flags, int fd, off_t offset); + + int Munmap(void* address, size_t length, int prot); // The common CPUFeatures interface with the set of available features. @@ -1796,6 +2899,133 @@ class Simulator : public DecoderVisitor { }; #endif + // Configure the simulated value of 'VL', which is the size of a Z register. + // Because this cannot occur during a program's lifetime, this function also + // resets the SVE registers. + void SetVectorLengthInBits(unsigned vector_length); + + unsigned GetVectorLengthInBits() const { return vector_length_; } + unsigned GetVectorLengthInBytes() const { + VIXL_ASSERT((vector_length_ % kBitsPerByte) == 0); + return vector_length_ / kBitsPerByte; + } + unsigned GetPredicateLengthInBits() const { + VIXL_ASSERT((GetVectorLengthInBits() % kZRegBitsPerPRegBit) == 0); + return GetVectorLengthInBits() / kZRegBitsPerPRegBit; + } + unsigned GetPredicateLengthInBytes() const { + VIXL_ASSERT((GetVectorLengthInBytes() % kZRegBitsPerPRegBit) == 0); + return GetVectorLengthInBytes() / kZRegBitsPerPRegBit; + } + + unsigned RegisterSizeInBitsFromFormat(VectorFormat vform) const { + if (IsSVEFormat(vform)) { + return GetVectorLengthInBits(); + } else { + return vixl::aarch64::RegisterSizeInBitsFromFormat(vform); + } + } + + unsigned RegisterSizeInBytesFromFormat(VectorFormat vform) const { + unsigned size_in_bits = RegisterSizeInBitsFromFormat(vform); + VIXL_ASSERT((size_in_bits % kBitsPerByte) == 0); + return size_in_bits / kBitsPerByte; + } + + int LaneCountFromFormat(VectorFormat vform) const { + if (IsSVEFormat(vform)) { + return GetVectorLengthInBits() / LaneSizeInBitsFromFormat(vform); + } else { + return vixl::aarch64::LaneCountFromFormat(vform); + } + } + + bool IsFirstActive(VectorFormat vform, + const LogicPRegister& mask, + const LogicPRegister& bits) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (mask.IsActive(vform, i)) { + return bits.IsActive(vform, i); + } + } + return false; + } + + bool AreNoneActive(VectorFormat vform, + const LogicPRegister& mask, + const LogicPRegister& bits) { + for (int i = 0; i < LaneCountFromFormat(vform); i++) { + if (mask.IsActive(vform, i) && bits.IsActive(vform, i)) { + return false; + } + } + return true; + } + + bool IsLastActive(VectorFormat vform, + const LogicPRegister& mask, + const LogicPRegister& bits) { + for (int i = LaneCountFromFormat(vform) - 1; i >= 0; i--) { + if (mask.IsActive(vform, i)) { + return bits.IsActive(vform, i); + } + } + return false; + } + + void PredTest(VectorFormat vform, + const LogicPRegister& mask, + const LogicPRegister& bits) { + ReadNzcv().SetN(IsFirstActive(vform, mask, bits)); + ReadNzcv().SetZ(AreNoneActive(vform, mask, bits)); + ReadNzcv().SetC(!IsLastActive(vform, mask, bits)); + ReadNzcv().SetV(0); + LogSystemRegister(NZCV); + } + + SimPRegister& GetPTrue() { return pregister_all_true_; } + + template + size_t CleanGranuleTag(T address, size_t length = kMTETagGranuleInBytes) { + size_t count = 0; + for (size_t offset = 0; offset < length; offset += kMTETagGranuleInBytes) { + count += + meta_data_.CleanMTETag(reinterpret_cast(address) + offset); + } + size_t expected = + length / kMTETagGranuleInBytes + (length % kMTETagGranuleInBytes != 0); + + // Give a warning when the memory region that is being unmapped isn't all + // either MTE protected or not. + if (count != expected) { + std::stringstream sstream; + sstream << std::hex << "MTE WARNING : the memory region being unmapped " + "starting at address 0x" + << reinterpret_cast(address) + << "is not fully MTE protected.\n"; + VIXL_WARNING(sstream.str().c_str()); + } + return count; + } + + template + void SetGranuleTag(T address, + int tag, + size_t length = kMTETagGranuleInBytes) { + for (size_t offset = 0; offset < length; offset += kMTETagGranuleInBytes) { + meta_data_.SetMTETag((uintptr_t)(address) + offset, tag); + } + } + + template + int GetGranuleTag(T address) { + return meta_data_.GetMTETag(address); + } + + // Generate a random address tag, and any tags specified in the input are + // excluded from the selection. + uint64_t GenerateRandomTag(uint16_t exclude = 0); + protected: const char* clr_normal; const char* clr_flag_name; @@ -1804,6 +3034,8 @@ class Simulator : public DecoderVisitor { const char* clr_reg_value; const char* clr_vreg_name; const char* clr_vreg_value; + const char* clr_preg_name; + const char* clr_preg_value; const char* clr_memory_address; const char* clr_warning; const char* clr_warning_message; @@ -1811,6 +3043,13 @@ class Simulator : public DecoderVisitor { const char* clr_branch_marker; // Simulation helpers ------------------------------------ + + void ResetSystemRegisters(); + void ResetRegisters(); + void ResetVRegisters(); + void ResetPRegisters(); + void ResetFFR(); + bool ConditionPassed(Condition cond) { switch (cond) { case eq: @@ -1863,6 +3102,14 @@ class Simulator : public DecoderVisitor { uint64_t left, uint64_t right, int carry_in = 0); + std::pair AddWithCarry(unsigned reg_size, + uint64_t left, + uint64_t right, + int carry_in); + using vixl_uint128_t = std::pair; + vixl_uint128_t Add128(vixl_uint128_t x, vixl_uint128_t y); + vixl_uint128_t Mul64(uint64_t x, uint64_t y); + vixl_uint128_t Neg128(vixl_uint128_t x); void LogicalHelper(const Instruction* instr, int64_t op2); void ConditionalCompareHelper(const Instruction* instr, int64_t op2); void LoadStoreHelper(const Instruction* instr, @@ -1890,28 +3137,67 @@ class Simulator : public DecoderVisitor { AddrMode addr_mode); void NEONLoadStoreSingleStructHelper(const Instruction* instr, AddrMode addr_mode); + template + void MOPSPHelper(const Instruction* instr) { + VIXL_ASSERT(instr->IsConsistentMOPSTriplet()); - uint64_t AddressUntag(uint64_t address) { return address & ~kAddressTagMask; } + int d = instr->GetRd(); + int n = instr->GetRn(); + int s = instr->GetRs(); - template - T* AddressUntag(T* address) { - uintptr_t address_raw = reinterpret_cast(address); - return reinterpret_cast(AddressUntag(address_raw)); + // Aliased registers and xzr are disallowed for Xd and Xn. + if ((d == n) || (d == s) || (n == s) || (d == 31) || (n == 31)) { + VisitUnallocated(instr); + } + + // Additionally, Xs may not be xzr for cpy. + if ((mops_type == "cpy"_h) && (s == 31)) { + VisitUnallocated(instr); + } + + // Bits 31 and 30 must be zero. + if (instr->ExtractBits(31, 30) != 0) { + VisitUnallocated(instr); + } + + // Saturate copy count. + uint64_t xn = ReadXRegister(n); + int saturation_bits = (mops_type == "cpy"_h) ? 55 : 63; + if ((xn >> saturation_bits) != 0) { + xn = (UINT64_C(1) << saturation_bits) - 1; + if (mops_type == "setg"_h) { + // Align saturated value to granule. + xn &= ~UINT64_C(kMTETagGranuleInBytes - 1); + } + WriteXRegister(n, xn); + } + + ReadNzcv().SetN(0); + ReadNzcv().SetZ(0); + ReadNzcv().SetC(1); // Indicates "option B" implementation. + ReadNzcv().SetV(0); } int64_t ShiftOperand(unsigned reg_size, - int64_t value, + uint64_t value, Shift shift_type, unsigned amount) const; int64_t ExtendValue(unsigned reg_width, int64_t value, Extend extend_type, unsigned left_shift = 0) const; - uint16_t PolynomialMult(uint8_t op1, uint8_t op2) const; + uint64_t PolynomialMult(uint64_t op1, + uint64_t op2, + int lane_size_in_bits) const; void ld1(VectorFormat vform, LogicVRegister dst, uint64_t addr); void ld1(VectorFormat vform, LogicVRegister dst, int index, uint64_t addr); void ld1r(VectorFormat vform, LogicVRegister dst, uint64_t addr); + void ld1r(VectorFormat vform, + VectorFormat unpack_vform, + LogicVRegister dst, + uint64_t addr, + bool is_signed = false); void ld2(VectorFormat vform, LogicVRegister dst1, LogicVRegister dst2, @@ -2013,16 +3299,43 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + // Add `value` to each lane of `src1`, treating `value` as unsigned for the + // purposes of setting the saturation flags. + LogicVRegister add_uint(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + uint64_t value); LogicVRegister addp(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + LogicPRegister brka(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn); + LogicPRegister brkb(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn); + LogicPRegister brkn(LogicPRegister pdm, + const LogicPRegister& pg, + const LogicPRegister& pn); + LogicPRegister brkpa(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn, + const LogicPRegister& pm); + LogicPRegister brkpb(LogicPRegister pd, + const LogicPRegister& pg, + const LogicPRegister& pn, + const LogicPRegister& pm); + // dst = srca + src1 * src2 LogicVRegister mla(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); + // dst = srca - src1 * src2 LogicVRegister mls(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); LogicVRegister mul(VectorFormat vform, @@ -2048,142 +3361,83 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + LogicVRegister sdiv(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister udiv(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); typedef LogicVRegister (Simulator::*ByElementOp)(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, - int index); - LogicVRegister fmul(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmla(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmlal(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmlal2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmls(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmlsl(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmlsl2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister fmulx(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister smull(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister smull2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister umull(VectorFormat vform, + int index); + LogicVRegister fmul(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index); + LogicVRegister fmla(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index); + LogicVRegister fmlal(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister umull2(VectorFormat vform, + LogicVRegister fmlal2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister smlal(VectorFormat vform, + LogicVRegister fmls(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index); + LogicVRegister fmlsl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister smlal2(VectorFormat vform, + LogicVRegister fmlsl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister umlal(VectorFormat vform, + LogicVRegister fmulx(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister umlal2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister smlsl(VectorFormat vform, + LogicVRegister smulh(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister smlsl2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister umlsl(VectorFormat vform, + const LogicVRegister& src2); + LogicVRegister umulh(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2, - int index); - LogicVRegister umlsl2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); + const LogicVRegister& src2); LogicVRegister sqdmull(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister sqdmull2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); LogicVRegister sqdmlal(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister sqdmlal2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); LogicVRegister sqdmlsl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister sqdmlsl2(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); LogicVRegister sqdmulh(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2194,21 +3448,11 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister sdot(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); LogicVRegister sqrdmlah(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); - LogicVRegister udot(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int index); LogicVRegister sqrdmlsh(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2218,6 +3462,12 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + // Subtract `value` from each lane of `src1`, treating `value` as unsigned for + // the purposes of setting the saturation flags. + LogicVRegister sub_uint(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + uint64_t value); LogicVRegister and_(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2252,6 +3502,7 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src2); LogicVRegister bsl(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& src_mask, const LogicVRegister& src1, const LogicVRegister& src2); LogicVRegister cls(VectorFormat vform, @@ -2260,6 +3511,9 @@ class Simulator : public DecoderVisitor { LogicVRegister clz(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); + LogicVRegister cnot(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); LogicVRegister cnt(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); @@ -2271,8 +3525,11 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src); LogicVRegister rev(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src, - int revSize); + const LogicVRegister& src); + LogicVRegister rev_byte(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int rev_size); LogicVRegister rev16(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); @@ -2299,11 +3556,19 @@ class Simulator : public DecoderVisitor { LogicVRegister uadalp(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); + LogicVRegister ror(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int rotation); LogicVRegister ext(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, int index); + LogicVRegister rotate_elements_right(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int index); template LogicVRegister fcadd(VectorFormat vform, LogicVRegister dst, @@ -2320,6 +3585,7 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, + const LogicVRegister& acc, int index, int rot); LogicVRegister fcmla(VectorFormat vform, @@ -2328,17 +3594,59 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src2, int index, int rot); - template LogicVRegister fcmla(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, + const LogicVRegister& acc, int rot); - LogicVRegister fcmla(VectorFormat vform, + template + LogicVRegister fadda(VectorFormat vform, + LogicVRegister acc, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister fadda(VectorFormat vform, + LogicVRegister acc, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister cadd(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot, + bool saturate = false); + LogicVRegister cmla(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot); + LogicVRegister cmla(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index, + int rot); + LogicVRegister bgrp(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool do_bext = false); + LogicVRegister bdep(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister histogram(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool do_segmented = false); + LogicVRegister index(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src1, - const LogicVRegister& src2, - int rot); + uint64_t start, + uint64_t step); LogicVRegister ins_element(VectorFormat vform, LogicVRegister dst, int dst_index, @@ -2348,13 +3656,44 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, int dst_index, uint64_t imm); + LogicVRegister insr(VectorFormat vform, LogicVRegister dst, uint64_t imm); LogicVRegister dup_element(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, int src_index); + LogicVRegister dup_elements_to_segments(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int src_index); + LogicVRegister dup_elements_to_segments( + VectorFormat vform, + LogicVRegister dst, + const std::pair& src_and_index); LogicVRegister dup_immediate(VectorFormat vform, LogicVRegister dst, uint64_t imm); + LogicVRegister mov(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + LogicPRegister mov(LogicPRegister dst, const LogicPRegister& src); + LogicVRegister mov_merging(VectorFormat vform, + LogicVRegister dst, + const SimPRegister& pg, + const LogicVRegister& src); + LogicVRegister mov_zeroing(VectorFormat vform, + LogicVRegister dst, + const SimPRegister& pg, + const LogicVRegister& src); + LogicVRegister mov_alternating(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + int start_at); + LogicPRegister mov_merging(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src); + LogicPRegister mov_zeroing(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src); LogicVRegister movi(VectorFormat vform, LogicVRegister dst, uint64_t imm); LogicVRegister mvni(VectorFormat vform, LogicVRegister dst, uint64_t imm); LogicVRegister orr(VectorFormat vform, @@ -2364,11 +3703,52 @@ class Simulator : public DecoderVisitor { LogicVRegister sshl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, - const LogicVRegister& src2); + const LogicVRegister& src2, + bool shift_is_8bit = true); LogicVRegister ushl(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool shift_is_8bit = true); + LogicVRegister sshr(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister ushr(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + // Perform a "conditional last" operation. The first part of the pair is true + // if any predicate lane is active, false otherwise. The second part takes the + // value of the last active (plus offset) lane, or last (plus offset) lane if + // none active. + std::pair clast(VectorFormat vform, + const LogicPRegister& pg, + const LogicVRegister& src2, + int offset_from_last_active); + LogicPRegister match(VectorFormat vform, + LogicPRegister dst, + const LogicVRegister& haystack, + const LogicVRegister& needles, + bool negate_match); + LogicVRegister compact(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister splice(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister sel(VectorFormat vform, + LogicVRegister dst, + const SimPRegister& pg, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicPRegister sel(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src1, + const LogicPRegister& src2); LogicVRegister sminmax(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2409,6 +3789,7 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src); LogicVRegister sminmaxv(VectorFormat vform, LogicVRegister dst, + const LogicPRegister& pg, const LogicVRegister& src, bool max); LogicVRegister smaxv(VectorFormat vform, @@ -2419,16 +3800,26 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src); LogicVRegister uxtl(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src); + const LogicVRegister& src, + bool is_2 = false); LogicVRegister uxtl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); LogicVRegister sxtl(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src); + const LogicVRegister& src, + bool is_2 = false); LogicVRegister sxtl2(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); + LogicVRegister uxt(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + unsigned from_size_in_bits); + LogicVRegister sxt(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + unsigned from_size_in_bits); LogicVRegister tbl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& tab, @@ -2573,6 +3964,7 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src2); LogicVRegister uminmaxv(VectorFormat vform, LogicVRegister dst, + const LogicPRegister& pg, const LogicVRegister& src, bool max); LogicVRegister umaxv(VectorFormat vform, @@ -2609,11 +4001,27 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src, int shift); + LogicVRegister scvtf(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits = 0); LogicVRegister scvtf(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, int fbits, FPRounding rounding_mode); + LogicVRegister ucvtf(VectorFormat vform, + unsigned dst_data_size, + unsigned src_data_size, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits = 0); LogicVRegister ucvtf(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, @@ -2675,10 +4083,12 @@ class Simulator : public DecoderVisitor { int shift); LogicVRegister suqadd(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src); + const LogicVRegister& src1, + const LogicVRegister& src2); LogicVRegister usqadd(VectorFormat vform, LogicVRegister dst, - const LogicVRegister& src); + const LogicVRegister& src1, + const LogicVRegister& src2); LogicVRegister sqshl(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, @@ -2699,9 +4109,9 @@ class Simulator : public DecoderVisitor { const LogicVRegister& src); LogicVRegister extractnarrow(VectorFormat vform, LogicVRegister dst, - bool dstIsSigned, + bool dst_is_signed, const LogicVRegister& src, - bool srcIsSigned); + bool src_is_signed); LogicVRegister xtn(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); @@ -2718,7 +4128,7 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, - bool issigned); + bool is_signed); LogicVRegister saba(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2800,7 +4210,8 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, - bool is_signed); + bool is_src1_signed, + bool is_src2_signed); LogicVRegister sdot(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2809,12 +4220,41 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + LogicVRegister usdot(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister cdot(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& acc, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot); + LogicVRegister sqrdcmlah(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int rot); + LogicVRegister sqrdcmlah(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& srca, + const LogicVRegister& src1, + const LogicVRegister& src2, + int index, + int rot); LogicVRegister sqrdmlash(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2, bool round = true, bool sub_op = false); + LogicVRegister sqrdmlash_d(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool round = true, + bool sub_op = false); LogicVRegister sqrdmlah(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src1, @@ -2829,6 +4269,21 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src1, const LogicVRegister& src2); + LogicVRegister matmul(VectorFormat vform_dst, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool src1_signed, + bool src2_signed); + template + LogicVRegister fmatmul(VectorFormat vform, + LogicVRegister srcdst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister fmatmul(VectorFormat vform, + LogicVRegister srcdst, + const LogicVRegister& src1, + const LogicVRegister& src2); #define NEON_3VREG_LOGIC_LIST(V) \ V(addhn) \ V(addhn2) \ @@ -2848,23 +4303,14 @@ class Simulator : public DecoderVisitor { V(sabdl2) \ V(uabdl) \ V(uabdl2) \ - V(smull) \ V(smull2) \ - V(umull) \ V(umull2) \ - V(smlal) \ V(smlal2) \ - V(umlal) \ V(umlal2) \ - V(smlsl) \ V(smlsl2) \ - V(umlsl) \ V(umlsl2) \ - V(sqdmlal) \ V(sqdmlal2) \ - V(sqdmlsl) \ V(sqdmlsl2) \ - V(sqdmull) \ V(sqdmull2) #define DEFINE_LOGIC_FUNC(FXN) \ @@ -2875,6 +4321,26 @@ class Simulator : public DecoderVisitor { NEON_3VREG_LOGIC_LIST(DEFINE_LOGIC_FUNC) #undef DEFINE_LOGIC_FUNC +#define NEON_MULL_LIST(V) \ + V(smull) \ + V(umull) \ + V(smlal) \ + V(umlal) \ + V(smlsl) \ + V(umlsl) \ + V(sqdmlal) \ + V(sqdmlsl) \ + V(sqdmull) + +#define DECLARE_NEON_MULL_OP(FN) \ + LogicVRegister FN(VectorFormat vform, \ + LogicVRegister dst, \ + const LogicVRegister& src1, \ + const LogicVRegister& src2, \ + bool is_2 = false); + NEON_MULL_LIST(DECLARE_NEON_MULL_OP) +#undef DECLARE_NEON_MULL_OP + #define NEON_FP3SAME_LIST(V) \ V(fadd, FPAdd, false) \ V(fsub, FPSub, true) \ @@ -2917,6 +4383,12 @@ class Simulator : public DecoderVisitor { NEON_FPPAIRWISE_LIST(DECLARE_NEON_FP_PAIR_OP) #undef DECLARE_NEON_FP_PAIR_OP + enum FrintMode { + kFrintToInteger = 0, + kFrintToInt32 = 32, + kFrintToInt64 = 64 + }; + template LogicVRegister frecps(VectorFormat vform, LogicVRegister dst, @@ -2938,19 +4410,23 @@ class Simulator : public DecoderVisitor { template LogicVRegister fmla(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); LogicVRegister fmla(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); template LogicVRegister fmls(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); LogicVRegister fmls(VectorFormat vform, LogicVRegister dst, + const LogicVRegister& srca, const LogicVRegister& src1, const LogicVRegister& src2); LogicVRegister fnmul(VectorFormat vform, @@ -3010,6 +4486,34 @@ class Simulator : public DecoderVisitor { LogicVRegister frecpx(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); + LogicVRegister ftsmul(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister ftssel(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister ftmad(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + unsigned index); + LogicVRegister fexpa(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + LogicVRegister flogb(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + template + LogicVRegister fscale(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); + LogicVRegister fscale(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2); template LogicVRegister fabs_(VectorFormat vform, LogicVRegister dst, @@ -3025,12 +4529,34 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src, FPRounding rounding_mode, - bool inexact_exception = false); + bool inexact_exception = false, + FrintMode frint_mode = kFrintToInteger); + LogicVRegister fcvt(VectorFormat dst_vform, + VectorFormat src_vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister fcvts(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits = 0); LogicVRegister fcvts(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, FPRounding rounding_mode, int fbits = 0); + LogicVRegister fcvtu(VectorFormat vform, + unsigned dst_data_size_in_bits, + unsigned src_data_size_in_bits, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src, + FPRounding round, + int fbits = 0); LogicVRegister fcvtu(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src, @@ -3071,16 +4597,82 @@ class Simulator : public DecoderVisitor { LogicVRegister dst, const LogicVRegister& src); + LogicPRegister pfalse(LogicPRegister dst); + LogicPRegister pfirst(LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src); + LogicPRegister ptrue(VectorFormat vform, LogicPRegister dst, int pattern); + LogicPRegister pnext(VectorFormat vform, + LogicPRegister dst, + const LogicPRegister& pg, + const LogicPRegister& src); + + LogicVRegister asrd(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + int shift); + + LogicVRegister andv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister eorv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister orv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister saddv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister sminv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister smaxv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister uaddv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister uminv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + LogicVRegister umaxv(VectorFormat vform, + LogicVRegister dst, + const LogicPRegister& pg, + const LogicVRegister& src); + + LogicVRegister interleave_top_bottom(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + template - struct TFPMinMaxOp { + struct TFPPairOp { typedef T (Simulator::*type)(T a, T b); }; template - LogicVRegister fminmaxv(VectorFormat vform, - LogicVRegister dst, - const LogicVRegister& src, - typename TFPMinMaxOp::type Op); + LogicVRegister FPPairedAcrossHelper(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + typename TFPPairOp::type fn, + uint64_t inactive_value); + + LogicVRegister FPPairedAcrossHelper( + VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src, + typename TFPPairOp::type fn16, + typename TFPPairOp::type fn32, + typename TFPPairOp::type fn64, + uint64_t inactive_value); LogicVRegister fminv(VectorFormat vform, LogicVRegister dst, @@ -3094,6 +4686,9 @@ class Simulator : public DecoderVisitor { LogicVRegister fmaxnmv(VectorFormat vform, LogicVRegister dst, const LogicVRegister& src); + LogicVRegister faddv(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); static const uint32_t CRC32_POLY = 0x04C11DB7; static const uint32_t CRC32C_POLY = 0x1EDC6F41; @@ -3113,6 +4708,8 @@ class Simulator : public DecoderVisitor { void FPCompare(double val0, double val1, FPTrapFlags trap); double FPRoundInt(double value, FPRounding round_mode); + double FPRoundInt(double value, FPRounding round_mode, FrintMode frint_mode); + double FPRoundIntCommon(double value, FPRounding round_mode); double recip_sqrt_estimate(double a); double recip_estimate(double a); double FPRecipSqrtEstimate(double a); @@ -3156,6 +4753,9 @@ class Simulator : public DecoderVisitor { template T FPMinNM(T a, T b); + template + T FPMulNaNs(T op1, T op2); + template T FPMul(T op1, T op2); @@ -3192,10 +4792,151 @@ class Simulator : public DecoderVisitor { void DoSaveCPUFeatures(const Instruction* instr); void DoRestoreCPUFeatures(const Instruction* instr); -// Simulate a runtime call. -#ifndef VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT - VIXL_NO_RETURN_IN_DEBUG_MODE -#endif + // General arithmetic helpers ---------------------------- + + // Add `delta` to the accumulator (`acc`), optionally saturate, then zero- or + // sign-extend. Initial `acc` bits outside `n` are ignored, but the delta must + // be a valid int_t. + uint64_t IncDecN(uint64_t acc, + int64_t delta, + unsigned n, + bool is_saturating = false, + bool is_signed = false); + + // SVE helpers ------------------------------------------- + LogicVRegister SVEBitwiseLogicalUnpredicatedHelper(LogicalOp op, + VectorFormat vform, + LogicVRegister zd, + const LogicVRegister& zn, + const LogicVRegister& zm); + + LogicPRegister SVEPredicateLogicalHelper(SVEPredicateLogicalOp op, + LogicPRegister Pd, + const LogicPRegister& pn, + const LogicPRegister& pm); + + LogicVRegister SVEBitwiseImmHelper(SVEBitwiseLogicalWithImm_UnpredicatedOp op, + VectorFormat vform, + LogicVRegister zd, + uint64_t imm); + enum UnpackType { kHiHalf, kLoHalf }; + enum ExtendType { kSignedExtend, kUnsignedExtend }; + LogicVRegister unpk(VectorFormat vform, + LogicVRegister zd, + const LogicVRegister& zn, + UnpackType unpack_type, + ExtendType extend_type); + + LogicPRegister SVEIntCompareVectorsHelper(Condition cc, + VectorFormat vform, + LogicPRegister dst, + const LogicPRegister& mask, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool is_wide_elements = false, + FlagsUpdate flags = SetFlags); + + void SVEGatherLoadScalarPlusVectorHelper(const Instruction* instr, + VectorFormat vform, + SVEOffsetModifier mod); + + // Store each active zt[lane] to `addr.GetElementAddress(lane, ...)`. + // + // `zt_code` specifies the code of the first register (zt). Each additional + // register (up to `reg_count`) is `(zt_code + i) % 32`. + // + // This helper calls LogZWrite in the proper way, according to `addr`. + void SVEStructuredStoreHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr); + // Load each active zt[lane] from `addr.GetElementAddress(lane, ...)`. + void SVEStructuredLoadHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr, + bool is_signed = false); + + enum SVEFaultTolerantLoadType { + // - Elements active in both FFR and pg are accessed as usual. If the access + // fails, the corresponding lane and all subsequent lanes are filled with + // an unpredictable value, and made inactive in FFR. + // + // - Elements active in FFR but not pg are set to zero. + // + // - Elements that are not active in FFR are filled with an unpredictable + // value, regardless of pg. + kSVENonFaultLoad, + + // If type == kSVEFirstFaultLoad, the behaviour is the same, except that the + // first active element is always accessed, regardless of FFR, and will + // generate a real fault if it is inaccessible. If the lane is not active in + // FFR, the actual value loaded into the result is still unpredictable. + kSVEFirstFaultLoad + }; + + // Load with first-faulting or non-faulting load semantics, respecting and + // updating FFR. + void SVEFaultTolerantLoadHelper(VectorFormat vform, + const LogicPRegister& pg, + unsigned zt_code, + const LogicSVEAddressVector& addr, + SVEFaultTolerantLoadType type, + bool is_signed); + + LogicVRegister SVEBitwiseShiftHelper(Shift shift_op, + VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool is_wide_elements); + + // Pack all even- or odd-numbered elements of source vector side by side and + // place in elements of lower half the destination vector, and leave the upper + // half all zero. + // [...| H | G | F | E | D | C | B | A ] + // => [...................| G | E | C | A ] + LogicVRegister pack_even_elements(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + + // [...| H | G | F | E | D | C | B | A ] + // => [...................| H | F | D | B ] + LogicVRegister pack_odd_elements(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src); + + LogicVRegister adcl(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + bool top); + + template + LogicVRegister FTMaddHelper(VectorFormat vform, + LogicVRegister dst, + const LogicVRegister& src1, + const LogicVRegister& src2, + uint64_t coeff_pos, + uint64_t coeff_neg); + + // Return the first or last active lane, or -1 if none are active. + int GetFirstActive(VectorFormat vform, const LogicPRegister& pg) const; + int GetLastActive(VectorFormat vform, const LogicPRegister& pg) const; + + int CountActiveLanes(VectorFormat vform, const LogicPRegister& pg) const; + + // Count active and true lanes in `pn`. + int CountActiveAndTrueLanes(VectorFormat vform, + const LogicPRegister& pg, + const LogicPRegister& pn) const; + + // Count the number of lanes referred to by `pattern`, given the vector + // length. If `pattern` is not a recognised SVEPredicateConstraint, this + // returns zero. + int GetPredicateConstraintLaneCount(VectorFormat vform, int pattern) const; + + // Simulate a runtime call. void DoRuntimeCall(const Instruction* instr); // Processor state --------------------------------------- @@ -3208,15 +4949,21 @@ class Simulator : public DecoderVisitor { FILE* stream_; PrintDisassembler* print_disasm_; - // Instruction statistics instrumentation. - Instrument* instrumentation_; - // General purpose registers. Register 31 is the stack pointer. SimRegister registers_[kNumberOfRegisters]; // Vector registers SimVRegister vregisters_[kNumberOfVRegisters]; + // SVE predicate registers. + SimPRegister pregisters_[kNumberOfPRegisters]; + + // SVE first-fault register. + SimFFRRegister ffr_register_; + + // A pseudo SVE predicate register with all bits set to true. + SimPRegister pregister_all_true_; + // Program Status Register. // bits[31, 27]: Condition flags N, Z, C, and V. // (Negative, Zero, Carry, Overflow) @@ -3237,9 +4984,8 @@ class Simulator : public DecoderVisitor { VIXL_ASSERT(ReadFpcr().GetFZ() == 0); // Ties-to-even rounding only. VIXL_ASSERT(ReadFpcr().GetRMode() == FPTieEven); - - // The simulator does not support half-precision operations so - // GetFpcr().AHP() is irrelevant, and is not checked here. + // No alternative half-precision support. + VIXL_ASSERT(ReadFpcr().GetAHP() == 0); } static int CalcNFlag(uint64_t result, unsigned reg_size) { @@ -3250,12 +4996,11 @@ class Simulator : public DecoderVisitor { static const uint32_t kConditionFlagsMask = 0xf0000000; - // Stack - byte* stack_; - static const int stack_protection_size_ = 256; - // 2 KB stack. - static const int stack_size_ = 2 * 1024 + 2 * stack_protection_size_; - byte* stack_limit_; + Memory memory_; + + static const size_t kDefaultStackGuardStartSize = 0; + static const size_t kDefaultStackGuardEndSize = 4 * 1024; + static const size_t kDefaultStackUsableSize = 8 * 1024; Decoder* decoder_; // Indicates if the pc has been modified by the instruction and should not be @@ -3263,6 +5008,10 @@ class Simulator : public DecoderVisitor { bool pc_modified_; const Instruction* pc_; + // Pointer to the last simulated instruction, used for checking the validity + // of the current instruction with the previous instruction, such as movprfx. + Instruction const* last_instr_; + // Branch type register, used for branch target identification. BType btype_; @@ -3276,18 +5025,35 @@ class Simulator : public DecoderVisitor { static const char* xreg_names[]; static const char* wreg_names[]; + static const char* breg_names[]; static const char* hreg_names[]; static const char* sreg_names[]; static const char* dreg_names[]; static const char* vreg_names[]; + static const char* zreg_names[]; + static const char* preg_names[]; private: + using FormToVisitorFnMap = + std::unordered_map>; + static const FormToVisitorFnMap* GetFormToVisitorFnMap(); + + uint32_t form_hash_; + static const PACKey kPACKeyIA; static const PACKey kPACKeyIB; static const PACKey kPACKeyDA; static const PACKey kPACKeyDB; static const PACKey kPACKeyGA; + bool CanReadMemory(uintptr_t address, size_t size); + + // CanReadMemory needs placeholder file descriptors, so we use a pipe. We can + // save some system call overhead by opening them on construction, rather than + // on every call to CanReadMemory. + int placeholder_pipe_fd_[2]; + template static T FPDefaultNaN(); @@ -3340,20 +5106,43 @@ class Simulator : public DecoderVisitor { } } + // Construct a SimVRegister from a SimPRegister, where each byte-sized lane of + // the destination is set to all true (0xff) when the corresponding + // predicate flag is set, and false (0x00) otherwise. + SimVRegister ExpandToSimVRegister(const SimPRegister& preg); + + // Set each predicate flag in pd where the corresponding assigned-sized lane + // in vreg is non-zero. Clear the flag, otherwise. This is almost the opposite + // operation to ExpandToSimVRegister(), except that any non-zero lane is + // interpreted as true. + void ExtractFromSimVRegister(VectorFormat vform, + SimPRegister& pd, // NOLINT(runtime/references) + SimVRegister vreg); + bool coloured_trace_; // A set of TraceParameters flags. int trace_parameters_; - // Indicates whether the instruction instrumentation is active. - bool instruction_stats_; - // Indicates whether the exclusive-access warning has been printed. bool print_exclusive_access_warning_; void PrintExclusiveAccessWarning(); CPUFeaturesAuditor cpu_features_auditor_; std::vector saved_cpu_features_; + + // State for *rand48 functions, used to simulate randomness with repeatable + // behaviour (so that tests are deterministic). This is used to simulate RNDR + // and RNDRRS, as well as to simulate a source of entropy for architecturally + // undefined behaviour. + uint16_t rand_state_[3]; + + // A configurable size of SVE vector registers. + unsigned vector_length_; + + // Representation of memory attribute such as MTE tagging and BTI page + // protection. + MetaDataDepot meta_data_; }; #if defined(VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT) && __cplusplus < 201402L diff --git a/core/deps/vixl/aarch64/simulator-constants-aarch64.h b/core/deps/vixl/aarch64/simulator-constants-aarch64.h index 6631043d5..1aa4f851f 100644 --- a/core/deps/vixl/aarch64/simulator-constants-aarch64.h +++ b/core/deps/vixl/aarch64/simulator-constants-aarch64.h @@ -56,6 +56,8 @@ enum DebugHltOpcode { kDisableCPUFeaturesOpcode, kSaveCPUFeaturesOpcode, kRestoreCPUFeaturesOpcode, + kMTEActive, + kMTEInactive, // Aliases. kDebugHltFirstOpcode = kUnreachableOpcode, kDebugHltLastOpcode = kLogOpcode @@ -88,7 +90,7 @@ VIXL_DEPRECATED("DebugHltOpcode", typedef DebugHltOpcode DebugHltOpcodes); // call): // x0: The format string // x1-x7: Optional arguments, if type == CPURegister::kRegister -// d0-d7: Optional arguments, if type == CPURegister::kFPRegister +// d0-d7: Optional arguments, if type == CPURegister::kVRegister const unsigned kPrintfArgCountOffset = 1 * kInstructionSize; const unsigned kPrintfArgPatternListOffset = 2 * kInstructionSize; const unsigned kPrintfLength = 3 * kInstructionSize; @@ -121,7 +123,7 @@ const unsigned kTraceLength = 3 * kInstructionSize; enum TraceParameters { LOG_DISASM = 1 << 0, // Log disassembly. LOG_REGS = 1 << 1, // Log general purpose registers. - LOG_VREGS = 1 << 2, // Log NEON and floating-point registers. + LOG_VREGS = 1 << 2, // Log SVE, NEON and floating-point registers. LOG_SYSREGS = 1 << 3, // Log the flags and system registers. LOG_WRITE = 1 << 4, // Log writes to memory. LOG_BRANCH = 1 << 5, // Log taken branches. diff --git a/core/deps/vixl/assembler-base-vixl.h b/core/deps/vixl/assembler-base-vixl.h index ee54dcbc2..7bd6af29e 100644 --- a/core/deps/vixl/assembler-base-vixl.h +++ b/core/deps/vixl/assembler-base-vixl.h @@ -29,6 +29,12 @@ #include "code-buffer-vixl.h" +// Microsoft Visual C++ defines a `mvn` macro that conflicts with our own +// definition. +#if defined(_MSC_VER) && defined(mvn) +#undef mvn +#endif + namespace vixl { class CodeBufferCheckScope; diff --git a/core/deps/vixl/code-buffer-vixl.cc b/core/deps/vixl/code-buffer-vixl.cc index 0fdd373fe..2cfe8b71d 100644 --- a/core/deps/vixl/code-buffer-vixl.cc +++ b/core/deps/vixl/code-buffer-vixl.cc @@ -24,9 +24,11 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef VIXL_CODE_BUFFER_MMAP extern "C" { #include } +#endif #include "code-buffer-vixl.h" #include "utils-vixl.h" @@ -74,7 +76,7 @@ CodeBuffer::CodeBuffer(byte* buffer, size_t capacity) } -CodeBuffer::~CodeBuffer() { +CodeBuffer::~CodeBuffer() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION { VIXL_ASSERT(!IsDirty()); if (managed_) { #ifdef VIXL_CODE_BUFFER_MALLOC @@ -88,28 +90,37 @@ CodeBuffer::~CodeBuffer() { } -#ifdef VIXL_CODE_BUFFER_MMAP void CodeBuffer::SetExecutable() { +#ifdef VIXL_CODE_BUFFER_MMAP int ret = mprotect(buffer_, capacity_, PROT_READ | PROT_EXEC); VIXL_CHECK(ret == 0); -} +#else + // This requires page-aligned memory blocks, which we can only guarantee with + // mmap. + VIXL_UNIMPLEMENTED(); #endif +} -#ifdef VIXL_CODE_BUFFER_MMAP void CodeBuffer::SetWritable() { +#ifdef VIXL_CODE_BUFFER_MMAP int ret = mprotect(buffer_, capacity_, PROT_READ | PROT_WRITE); VIXL_CHECK(ret == 0); -} +#else + // This requires page-aligned memory blocks, which we can only guarantee with + // mmap. + VIXL_UNIMPLEMENTED(); #endif +} void CodeBuffer::EmitString(const char* string) { - VIXL_ASSERT(HasSpaceFor(strlen(string) + 1)); + const auto len = strlen(string) + 1; + VIXL_ASSERT(HasSpaceFor(len)); char* dst = reinterpret_cast(cursor_); dirty_ = true; - char* null_char = stpcpy(dst, string); - cursor_ = reinterpret_cast(null_char) + 1; + memcpy(dst, string, len); + cursor_ = reinterpret_cast(dst + len); } diff --git a/core/deps/vixl/code-buffer-vixl.h b/core/deps/vixl/code-buffer-vixl.h index fa7963479..30c911deb 100644 --- a/core/deps/vixl/code-buffer-vixl.h +++ b/core/deps/vixl/code-buffer-vixl.h @@ -40,19 +40,16 @@ class CodeBuffer { explicit CodeBuffer(size_t capacity = kDefaultCapacity); CodeBuffer(byte* buffer, size_t capacity); - ~CodeBuffer(); + ~CodeBuffer() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION; void Reset(); -#ifdef VIXL_CODE_BUFFER_MMAP + // Make the buffer executable or writable. These states are mutually + // exclusive. + // Note that these require page-aligned memory blocks, which we can only + // guarantee with VIXL_CODE_BUFFER_MMAP. void SetExecutable(); void SetWritable(); -#else - // These require page-aligned memory blocks, which we can only guarantee with - // mmap. - VIXL_NO_RETURN_IN_DEBUG_MODE void SetExecutable() { VIXL_UNIMPLEMENTED(); } - VIXL_NO_RETURN_IN_DEBUG_MODE void SetWritable() { VIXL_UNIMPLEMENTED(); } -#endif ptrdiff_t GetOffsetFrom(ptrdiff_t offset) const { ptrdiff_t cursor_offset = cursor_ - buffer_; @@ -127,8 +124,9 @@ class CodeBuffer { void Emit(T value) { VIXL_ASSERT(HasSpaceFor(sizeof(value))); dirty_ = true; - memcpy(cursor_, &value, sizeof(value)); - cursor_ += sizeof(value); + byte* c = cursor_; + memcpy(c, &value, sizeof(value)); + cursor_ = c + sizeof(value); } void UpdateData(size_t offset, const void* data, size_t size); @@ -167,8 +165,8 @@ class CodeBuffer { *has_grown = is_full; } void EnsureSpaceFor(size_t amount) { - bool dummy; - EnsureSpaceFor(amount, &dummy); + bool placeholder; + EnsureSpaceFor(amount, &placeholder); } private: diff --git a/core/deps/vixl/compiler-intrinsics-vixl.cc b/core/deps/vixl/compiler-intrinsics-vixl.cc index ae182c7d8..f6234fa6b 100644 --- a/core/deps/vixl/compiler-intrinsics-vixl.cc +++ b/core/deps/vixl/compiler-intrinsics-vixl.cc @@ -25,12 +25,14 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "compiler-intrinsics-vixl.h" +#include "utils-vixl.h" namespace vixl { int CountLeadingSignBitsFallBack(int64_t value, int width) { VIXL_ASSERT(IsPowerOf2(width) && (width <= 64)); + if (width < 64) VIXL_ASSERT(IsIntN(width, value)); if (value >= 0) { return CountLeadingZeros(value, width) - 1; } else { diff --git a/core/deps/vixl/compiler-intrinsics-vixl.h b/core/deps/vixl/compiler-intrinsics-vixl.h index b27f94ebf..50ed3579b 100644 --- a/core/deps/vixl/compiler-intrinsics-vixl.h +++ b/core/deps/vixl/compiler-intrinsics-vixl.h @@ -28,6 +28,7 @@ #ifndef VIXL_COMPILER_INTRINSICS_H #define VIXL_COMPILER_INTRINSICS_H +#include #include "globals-vixl.h" namespace vixl { @@ -104,16 +105,22 @@ int CountTrailingZerosFallBack(uint64_t value, int width); // TODO: The implementations could be improved for sizes different from 32bit // and 64bit: we could mask the values and call the appropriate builtin. +// Return the number of leading bits that match the topmost (sign) bit, +// excluding the topmost bit itself. template inline int CountLeadingSignBits(V value, int width = (sizeof(V) * 8)) { + VIXL_ASSERT(IsPowerOf2(width) && (width <= 64)); #if COMPILER_HAS_BUILTIN_CLRSB - if (width == 32) { - return __builtin_clrsb(value); - } else if (width == 64) { - return __builtin_clrsbll(value); - } -#endif + VIXL_ASSERT((LLONG_MIN <= value) && (value <= LLONG_MAX)); + int ll_width = sizeof(long long) * kBitsPerByte; // NOLINT(runtime/int) + int result = __builtin_clrsbll(value) - (ll_width - width); + // Check that the value fits in the specified width. + VIXL_ASSERT(result >= 0); + return result; +#else + VIXL_ASSERT((INT64_MIN <= value) && (value <= INT64_MAX)); return CountLeadingSignBitsFallBack(value, width); +#endif } diff --git a/core/deps/vixl/cpu-features.cc b/core/deps/vixl/cpu-features.cc index c3666700e..08db3f44b 100644 --- a/core/deps/vixl/cpu-features.cc +++ b/core/deps/vixl/cpu-features.cc @@ -30,113 +30,64 @@ #include "globals-vixl.h" #include "utils-vixl.h" -namespace vixl { +#if defined(__aarch64__) && defined(VIXL_INCLUDE_TARGET_AARCH64) +#include "aarch64/cpu-aarch64.h" +#define VIXL_USE_AARCH64_CPU_HELPERS +#endif -static uint64_t MakeFeatureMask(CPUFeatures::Feature feature) { - if (feature == CPUFeatures::kNone) { - return 0; - } else { - // Check that the shift is well-defined, and that the feature is valid. - VIXL_STATIC_ASSERT(CPUFeatures::kNumberOfFeatures <= - (sizeof(uint64_t) * 8)); - VIXL_ASSERT(feature < CPUFeatures::kNumberOfFeatures); - return UINT64_C(1) << feature; - } -} - -CPUFeatures::CPUFeatures(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) - : features_(0) { - Combine(feature0, feature1, feature2, feature3); -} +namespace vixl { CPUFeatures CPUFeatures::All() { CPUFeatures all; - // Check that the shift is well-defined. - VIXL_STATIC_ASSERT(CPUFeatures::kNumberOfFeatures < (sizeof(uint64_t) * 8)); - all.features_ = (UINT64_C(1) << kNumberOfFeatures) - 1; + all.features_.set(); return all; } -CPUFeatures CPUFeatures::InferFromOS() { - // TODO: Actually infer features from the OS. +CPUFeatures CPUFeatures::InferFromIDRegisters() { + // This function assumes that kIDRegisterEmulation is available. + CPUFeatures features(CPUFeatures::kIDRegisterEmulation); +#ifdef VIXL_USE_AARCH64_CPU_HELPERS + // Note that the Linux kernel filters these values during emulation, so the + // results may not exactly match the expected hardware support. + features.Combine(aarch64::CPU::InferCPUFeaturesFromIDRegisters()); +#endif + return features; +} + +CPUFeatures CPUFeatures::InferFromOS(QueryIDRegistersOption option) { +#ifdef VIXL_USE_AARCH64_CPU_HELPERS + return aarch64::CPU::InferCPUFeaturesFromOS(option); +#else + USE(option); return CPUFeatures(); +#endif } void CPUFeatures::Combine(const CPUFeatures& other) { features_ |= other.features_; } -void CPUFeatures::Combine(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) { - features_ |= MakeFeatureMask(feature0); - features_ |= MakeFeatureMask(feature1); - features_ |= MakeFeatureMask(feature2); - features_ |= MakeFeatureMask(feature3); +void CPUFeatures::Combine(Feature feature) { + if (feature != CPUFeatures::kNone) features_.set(feature); } void CPUFeatures::Remove(const CPUFeatures& other) { features_ &= ~other.features_; } -void CPUFeatures::Remove(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) { - features_ &= ~MakeFeatureMask(feature0); - features_ &= ~MakeFeatureMask(feature1); - features_ &= ~MakeFeatureMask(feature2); - features_ &= ~MakeFeatureMask(feature3); -} - -CPUFeatures CPUFeatures::With(const CPUFeatures& other) const { - CPUFeatures f(*this); - f.Combine(other); - return f; -} - -CPUFeatures CPUFeatures::With(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) const { - CPUFeatures f(*this); - f.Combine(feature0, feature1, feature2, feature3); - return f; -} - -CPUFeatures CPUFeatures::Without(const CPUFeatures& other) const { - CPUFeatures f(*this); - f.Remove(other); - return f; -} - -CPUFeatures CPUFeatures::Without(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) const { - CPUFeatures f(*this); - f.Remove(feature0, feature1, feature2, feature3); - return f; +void CPUFeatures::Remove(Feature feature) { + if (feature != CPUFeatures::kNone) features_.reset(feature); } bool CPUFeatures::Has(const CPUFeatures& other) const { return (features_ & other.features_) == other.features_; } -bool CPUFeatures::Has(Feature feature0, - Feature feature1, - Feature feature2, - Feature feature3) const { - uint64_t mask = MakeFeatureMask(feature0) | MakeFeatureMask(feature1) | - MakeFeatureMask(feature2) | MakeFeatureMask(feature3); - return (features_ & mask) == mask; +bool CPUFeatures::Has(Feature feature) const { + return (feature == CPUFeatures::kNone) || features_[feature]; } -size_t CPUFeatures::Count() const { return CountSetBits(features_); } +size_t CPUFeatures::Count() const { return features_.count(); } std::ostream& operator<<(std::ostream& os, CPUFeatures::Feature feature) { // clang-format off @@ -157,12 +108,9 @@ VIXL_CPU_FEATURE_LIST(VIXL_FORMAT_FEATURE) } CPUFeatures::const_iterator CPUFeatures::begin() const { - if (features_ == 0) return const_iterator(this, kNone); - - int feature_number = CountTrailingZeros(features_); - vixl::CPUFeatures::Feature feature = - static_cast(feature_number); - return const_iterator(this, feature); + // For iterators in general, it's undefined to increment `end()`, but here we + // control the implementation and it is safe to do this. + return ++end(); } CPUFeatures::const_iterator CPUFeatures::end() const { @@ -170,11 +118,11 @@ CPUFeatures::const_iterator CPUFeatures::end() const { } std::ostream& operator<<(std::ostream& os, const CPUFeatures& features) { - CPUFeatures::const_iterator it = features.begin(); - while (it != features.end()) { - os << *it; - ++it; - if (it != features.end()) os << ", "; + bool need_separator = false; + for (CPUFeatures::Feature feature : features) { + if (need_separator) os << ", "; + need_separator = true; + os << feature; } return os; } @@ -185,7 +133,7 @@ bool CPUFeaturesConstIterator::operator==( return (cpu_features_ == other.cpu_features_) && (feature_ == other.feature_); } -CPUFeatures::Feature CPUFeaturesConstIterator::operator++() { // Prefix +CPUFeaturesConstIterator& CPUFeaturesConstIterator::operator++() { // Prefix VIXL_ASSERT(IsValid()); do { // Find the next feature. The order is unspecified. @@ -199,11 +147,11 @@ CPUFeatures::Feature CPUFeaturesConstIterator::operator++() { // Prefix // cpu_features_->Has(kNone) is always true, so this will terminate even if // the features list is empty. } while (!cpu_features_->Has(feature_)); - return feature_; + return *this; } -CPUFeatures::Feature CPUFeaturesConstIterator::operator++(int) { // Postfix - CPUFeatures::Feature result = feature_; +CPUFeaturesConstIterator CPUFeaturesConstIterator::operator++(int) { // Postfix + CPUFeaturesConstIterator result = *this; ++(*this); return result; } diff --git a/core/deps/vixl/cpu-features.h b/core/deps/vixl/cpu-features.h index fffef44ff..97eb661a2 100644 --- a/core/deps/vixl/cpu-features.h +++ b/core/deps/vixl/cpu-features.h @@ -27,6 +27,7 @@ #ifndef VIXL_CPU_FEATURES_H #define VIXL_CPU_FEATURES_H +#include #include #include "globals-vixl.h" @@ -34,16 +35,65 @@ namespace vixl { +// VIXL aims to handle and detect all architectural features that are likely to +// influence code-generation decisions at EL0 (user-space). +// +// - There may be multiple VIXL feature flags for a given architectural +// extension. This occurs where the extension allow components to be +// implemented independently, or where kernel support is needed, and is likely +// to be fragmented. +// +// For example, Pointer Authentication (kPAuth*) has a separate feature flag +// for access to PACGA, and to indicate that the QARMA algorithm is +// implemented. +// +// - Conversely, some extensions have configuration options that do not affect +// EL0, so these are presented as a single VIXL feature. +// +// For example, the RAS extension (kRAS) has several variants, but the only +// feature relevant to VIXL is the addition of the ESB instruction so we only +// need a single flag. +// +// - VIXL offers separate flags for separate features even if they're +// architecturally linked. +// +// For example, the architecture requires kFPHalf and kNEONHalf to be equal, +// but they have separate hardware ID register fields so VIXL presents them as +// separate features. +// +// - VIXL can detect every feature for which it can generate code. +// +// - VIXL can detect some features for which it cannot generate code. +// +// The CPUFeatures::Feature enum — derived from the macro list below — is +// frequently extended. New features may be added to the list at any point, and +// no assumptions should be made about the numerical values assigned to each +// enum constant. The symbolic names can be considered to be stable. +// +// The debug descriptions are used only for debug output. The 'cpuinfo' strings +// are informative; VIXL does not use /proc/cpuinfo for feature detection. + // clang-format off #define VIXL_CPU_FEATURE_LIST(V) \ /* If set, the OS traps and emulates MRS accesses to relevant (EL1) ID_* */ \ /* registers, so that the detailed feature registers can be read */ \ /* directly. */ \ + \ + /* Constant name Debug description Linux 'cpuinfo' string. */ \ V(kIDRegisterEmulation, "ID register emulation", "cpuid") \ \ V(kFP, "FP", "fp") \ V(kNEON, "NEON", "asimd") \ V(kCRC32, "CRC32", "crc32") \ + V(kDGH, "DGH", "dgh") \ + /* Speculation control features. */ \ + V(kCSV2, "CSV2", NULL) \ + V(kSCXTNUM, "SCXTNUM", NULL) \ + V(kCSV3, "CSV3", NULL) \ + V(kSB, "SB", "sb") \ + V(kSPECRES, "SPECRES", NULL) \ + V(kSSBS, "SSBS", NULL) \ + V(kSSBSControl, "SSBS (PSTATE control)", "ssbs") \ /* Cryptographic support instructions. */ \ V(kAES, "AES", "aes") \ V(kSHA1, "SHA1", "sha1") \ @@ -58,26 +108,36 @@ namespace vixl { V(kRDM, "RDM", "asimdrdm") \ /* Scalable Vector Extension. */ \ V(kSVE, "SVE", "sve") \ + V(kSVEF64MM, "SVE F64MM", "svef64mm") \ + V(kSVEF32MM, "SVE F32MM", "svef32mm") \ + V(kSVEI8MM, "SVE I8MM", "svei8imm") \ + V(kSVEBF16, "SVE BFloat16", "svebf16") \ /* SDOT and UDOT support (in NEON). */ \ V(kDotProduct, "DotProduct", "asimddp") \ + /* Int8 matrix multiplication (in NEON). */ \ + V(kI8MM, "NEON I8MM", "i8mm") \ /* Half-precision (FP16) support for FP and NEON, respectively. */ \ V(kFPHalf, "FPHalf", "fphp") \ V(kNEONHalf, "NEONHalf", "asimdhp") \ + /* BFloat16 support (in both FP and NEON.) */ \ + V(kBF16, "FP/NEON BFloat 16", "bf16") \ /* The RAS extension, including the ESB instruction. */ \ V(kRAS, "RAS", NULL) \ /* Data cache clean to the point of persistence: DC CVAP. */ \ V(kDCPoP, "DCPoP", "dcpop") \ + /* Data cache clean to the point of deep persistence: DC CVADP. */ \ + V(kDCCVADP, "DCCVADP", "dcpodp") \ /* Cryptographic support instructions. */ \ V(kSHA3, "SHA3", "sha3") \ V(kSHA512, "SHA512", "sha512") \ V(kSM3, "SM3", "sm3") \ V(kSM4, "SM4", "sm4") \ /* Pointer authentication for addresses. */ \ - V(kPAuth, "PAuth", NULL) \ + V(kPAuth, "PAuth", "paca") \ /* Pointer authentication for addresses uses QARMA. */ \ V(kPAuthQARMA, "PAuthQARMA", NULL) \ /* Generic authentication (using the PACGA instruction). */ \ - V(kPAuthGeneric, "PAuthGeneric", NULL) \ + V(kPAuthGeneric, "PAuthGeneric", "pacg") \ /* Generic authentication uses QARMA. */ \ V(kPAuthGenericQARMA, "PAuthGenericQARMA", NULL) \ /* JavaScript-style FP -> integer conversion instruction: FJCVTZS. */ \ @@ -96,9 +156,52 @@ namespace vixl { /* Data-independent timing (for selected instructions). */ \ V(kDIT, "DIT", "dit") \ /* Branch target identification. */ \ - V(kBTI, "BTI", NULL) \ + V(kBTI, "BTI", "bti") \ /* Flag manipulation instructions: {AX,XA}FLAG */ \ - V(kAXFlag, "AXFlag", NULL) + V(kAXFlag, "AXFlag", "flagm2") \ + /* Random number generation extension, */ \ + V(kRNG, "RNG", "rng") \ + /* Floating-point round to {32,64}-bit integer. */ \ + V(kFrintToFixedSizedInt,"Frint (bounded)", "frint") \ + /* Memory Tagging Extension. */ \ + V(kMTEInstructions, "MTE (EL0 instructions)", NULL) \ + V(kMTE, "MTE", NULL) \ + V(kMTE3, "MTE (asymmetric)", "mte3") \ + /* PAuth extensions. */ \ + V(kPAuthEnhancedPAC, "PAuth EnhancedPAC", NULL) \ + V(kPAuthEnhancedPAC2, "PAuth EnhancedPAC2", NULL) \ + V(kPAuthFPAC, "PAuth FPAC", NULL) \ + V(kPAuthFPACCombined, "PAuth FPACCombined", NULL) \ + /* Scalable Vector Extension 2. */ \ + V(kSVE2, "SVE2", "sve2") \ + V(kSVESM4, "SVE SM4", "svesm4") \ + V(kSVESHA3, "SVE SHA3", "svesha3") \ + V(kSVEBitPerm, "SVE BitPerm", "svebitperm") \ + V(kSVEAES, "SVE AES", "sveaes") \ + V(kSVEPmull128, "SVE Pmull128", "svepmull") \ + /* Alternate floating-point behavior */ \ + V(kAFP, "AFP", "afp") \ + /* Enhanced Counter Virtualization */ \ + V(kECV, "ECV", "ecv") \ + /* Increased precision of Reciprocal Estimate and Square Root Estimate */ \ + V(kRPRES, "RPRES", "rpres") \ + /* Memory operation instructions, for memcpy, memset */ \ + V(kMOPS, "Memory ops", NULL) \ + /* Scalable Matrix Extension (SME) */ \ + V(kSME, "SME", "sme") \ + V(kSMEi16i64, "SME (i16i64)", "smei16i64") \ + V(kSMEf64f64, "SME (f64f64)", "smef64f64") \ + V(kSMEi8i32, "SME (i8i32)", "smei8i32") \ + V(kSMEf16f32, "SME (f16f32)", "smef16f32") \ + V(kSMEb16f32, "SME (b16f32)", "smeb16f32") \ + V(kSMEf32f32, "SME (f32f32)", "smef32f32") \ + V(kSMEfa64, "SME (fa64)", "smefa64") \ + /* WFET and WFIT instruction support */ \ + V(kWFXT, "WFXT", "wfxt") \ + /* Extended BFloat16 instructions */ \ + V(kEBF16, "EBF16", "ebf16") \ + V(kSVE_EBF16, "EBF16 (SVE)", "sveebf16") \ + V(kCSSC, "CSSC", "cssc") // clang-format on @@ -191,13 +294,13 @@ class CPUFeatures { // clang-format on // By default, construct with no features enabled. - CPUFeatures() : features_(0) {} + CPUFeatures() : features_{} {} // Construct with some features already enabled. - CPUFeatures(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone); + template + CPUFeatures(T first, U... others) : features_{} { + Combine(first, others...); + } // Construct with all features enabled. This can be used to disable feature // checking: `Has(...)` returns true regardless of the argument. @@ -213,51 +316,80 @@ class CPUFeatures { return CPUFeatures(kFP, kNEON, kCRC32); } + // Construct a new CPUFeatures object using ID registers. This assumes that + // kIDRegisterEmulation is present. + static CPUFeatures InferFromIDRegisters(); + + enum QueryIDRegistersOption { + kDontQueryIDRegisters, + kQueryIDRegistersIfAvailable + }; + // Construct a new CPUFeatures object based on what the OS reports. - static CPUFeatures InferFromOS(); + static CPUFeatures InferFromOS( + QueryIDRegistersOption option = kQueryIDRegistersIfAvailable); // Combine another CPUFeatures object into this one. Features that already // exist in this set are left unchanged. void Combine(const CPUFeatures& other); - // Combine specific features into this set. Features that already exist in - // this set are left unchanged. - void Combine(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone); + // Combine a specific feature into this set. If it already exists in the set, + // the set is left unchanged. + void Combine(Feature feature); + + // Combine multiple features (or feature sets) into this set. + template + void Combine(T first, U... others) { + Combine(first); + Combine(others...); + } // Remove features in another CPUFeatures object from this one. void Remove(const CPUFeatures& other); - // Remove specific features from this set. - void Remove(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone); - - // Chaining helpers for convenient construction. - CPUFeatures With(const CPUFeatures& other) const; - CPUFeatures With(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone) const; - CPUFeatures Without(const CPUFeatures& other) const; - CPUFeatures Without(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone) const; - - // Query features. - // Note that an empty query (like `Has(kNone)`) always returns true. + // Remove a specific feature from this set. This has no effect if the feature + // doesn't exist in the set. + void Remove(Feature feature0); + + // Remove multiple features (or feature sets) from this set. + template + void Remove(T first, U... others) { + Remove(first); + Remove(others...); + } + + // Chaining helpers for convenient construction by combining other CPUFeatures + // or individual Features. + template + CPUFeatures With(T... others) const { + CPUFeatures f(*this); + f.Combine(others...); + return f; + } + + template + CPUFeatures Without(T... others) const { + CPUFeatures f(*this); + f.Remove(others...); + return f; + } + + // Test whether the `other` feature set is equal to or a subset of this one. bool Has(const CPUFeatures& other) const; - bool Has(Feature feature0, - Feature feature1 = kNone, - Feature feature2 = kNone, - Feature feature3 = kNone) const; + + // Test whether a single feature exists in this set. + // Note that `Has(kNone)` always returns true. + bool Has(Feature feature) const; + + // Test whether all of the specified features exist in this set. + template + bool Has(T first, U... others) const { + return Has(first) && Has(others...); + } // Return the number of enabled features. size_t Count() const; + bool HasNoFeatures() const { return Count() == 0; } // Check for equivalence. bool operator==(const CPUFeatures& other) const { @@ -271,9 +403,8 @@ class CPUFeatures { const_iterator end() const; private: - // Each bit represents a feature. This field will be replaced as needed if - // features are added. - uint64_t features_; + // Each bit represents a feature. This set will be extended as needed. + std::bitset features_; friend std::ostream& operator<<(std::ostream& os, const vixl::CPUFeatures& features); @@ -296,8 +427,8 @@ class CPUFeaturesConstIterator { bool operator!=(const CPUFeaturesConstIterator& other) const { return !(*this == other); } - CPUFeatures::Feature operator++(); - CPUFeatures::Feature operator++(int); + CPUFeaturesConstIterator& operator++(); + CPUFeaturesConstIterator operator++(int); CPUFeatures::Feature operator*() const { VIXL_ASSERT(IsValid()); @@ -316,8 +447,10 @@ class CPUFeaturesConstIterator { CPUFeatures::Feature feature_; bool IsValid() const { - return ((cpu_features_ == NULL) && (feature_ == CPUFeatures::kNone)) || - cpu_features_->Has(feature_); + if (cpu_features_ == NULL) { + return feature_ == CPUFeatures::kNone; + } + return cpu_features_->Has(feature_); } }; @@ -340,21 +473,17 @@ class CPUFeaturesScope { // Start a CPUFeaturesScope on any object that implements // `CPUFeatures* GetCPUFeatures()`. template - explicit CPUFeaturesScope(T* cpu_features_wrapper, - CPUFeatures::Feature feature0 = CPUFeatures::kNone, - CPUFeatures::Feature feature1 = CPUFeatures::kNone, - CPUFeatures::Feature feature2 = CPUFeatures::kNone, - CPUFeatures::Feature feature3 = CPUFeatures::kNone) + explicit CPUFeaturesScope(T* cpu_features_wrapper) : cpu_features_(cpu_features_wrapper->GetCPUFeatures()), - old_features_(*cpu_features_) { - cpu_features_->Combine(feature0, feature1, feature2, feature3); - } + old_features_(*cpu_features_) {} - template - CPUFeaturesScope(T* cpu_features_wrapper, const CPUFeatures& other) + // Start a CPUFeaturesScope on any object that implements + // `CPUFeatures* GetCPUFeatures()`, with the specified features enabled. + template + CPUFeaturesScope(T* cpu_features_wrapper, U first, V... features) : cpu_features_(cpu_features_wrapper->GetCPUFeatures()), old_features_(*cpu_features_) { - cpu_features_->Combine(other); + cpu_features_->Combine(first, features...); } ~CPUFeaturesScope() { *cpu_features_ = old_features_; } diff --git a/core/deps/vixl/globals-vixl.h b/core/deps/vixl/globals-vixl.h index a92bd91fb..4548ba897 100644 --- a/core/deps/vixl/globals-vixl.h +++ b/core/deps/vixl/globals-vixl.h @@ -27,6 +27,10 @@ #ifndef VIXL_GLOBALS_H #define VIXL_GLOBALS_H +#if __cplusplus < 201402L +#error VIXL requires C++14 +#endif + // Get standard C99 macros for integer types. #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS @@ -66,7 +70,8 @@ typedef uint8_t byte; const int KBytes = 1024; const int MBytes = 1024 * KBytes; -const int kBitsPerByte = 8; +const int kBitsPerByteLog2 = 3; +const int kBitsPerByte = 1 << kBitsPerByteLog2; template struct Unsigned; @@ -153,7 +158,7 @@ struct Unsigned<64> { #endif // This is not as powerful as template based assertions, but it is simple. // It assumes that the descriptions are unique. If this starts being a problem, -// we can switch to a different implemention. +// we can switch to a different implementation. #define VIXL_CONCAT(a, b) a##b #if __cplusplus >= 201103L #define VIXL_STATIC_ASSERT_LINE(line_unused, condition, message) \ @@ -202,7 +207,7 @@ inline void USE(const T1&, const T2&, const T3&, const T4&) {} #if __has_warning("-Wimplicit-fallthrough") && __cplusplus >= 201103L #define VIXL_FALLTHROUGH() [[clang::fallthrough]] // Fallthrough annotation for GCC >= 7. -#elif __GNUC__ >= 7 +#elif defined(__GNUC__) && __GNUC__ >= 7 #define VIXL_FALLTHROUGH() __attribute__((fallthrough)) #else #define VIXL_FALLTHROUGH() \ @@ -223,17 +228,19 @@ inline void USE(const T1&, const T2&, const T3&, const T4&) {} #if __cplusplus >= 201103L #define VIXL_OVERRIDE override +#define VIXL_CONSTEXPR constexpr +#define VIXL_HAS_CONSTEXPR 1 #else #define VIXL_OVERRIDE +#define VIXL_CONSTEXPR #endif -// Some functions might only be marked as "noreturn" for the DEBUG build. This -// macro should be used for such cases (for more details see what -// VIXL_UNREACHABLE expands to). -#ifdef VIXL_DEBUG -#define VIXL_DEBUG_NO_RETURN VIXL_NO_RETURN +// With VIXL_NEGATIVE_TESTING on, VIXL_ASSERT and VIXL_CHECK will throw +// exceptions but C++11 marks destructors as noexcept(true) by default. +#if defined(VIXL_NEGATIVE_TESTING) && __cplusplus >= 201103L +#define VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION noexcept(false) #else -#define VIXL_DEBUG_NO_RETURN +#define VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION #endif #ifdef VIXL_INCLUDE_SIMULATOR_AARCH64 @@ -268,16 +275,24 @@ inline void USE(const T1&, const T2&, const T3&, const T4&) {} // Target Architecture/ISA #ifdef VIXL_INCLUDE_TARGET_A64 +#ifndef VIXL_INCLUDE_TARGET_AARCH64 #define VIXL_INCLUDE_TARGET_AARCH64 #endif +#endif #if defined(VIXL_INCLUDE_TARGET_A32) && defined(VIXL_INCLUDE_TARGET_T32) +#ifndef VIXL_INCLUDE_TARGET_AARCH32 #define VIXL_INCLUDE_TARGET_AARCH32 +#endif #elif defined(VIXL_INCLUDE_TARGET_A32) +#ifndef VIXL_INCLUDE_TARGET_A32_ONLY #define VIXL_INCLUDE_TARGET_A32_ONLY +#endif #else +#ifndef VIXL_INCLUDE_TARGET_T32_ONLY #define VIXL_INCLUDE_TARGET_T32_ONLY #endif +#endif #endif // VIXL_GLOBALS_H diff --git a/core/deps/vixl/invalset-vixl.h b/core/deps/vixl/invalset-vixl.h index 9f9425b34..671dc0d0d 100644 --- a/core/deps/vixl/invalset-vixl.h +++ b/core/deps/vixl/invalset-vixl.h @@ -91,7 +91,7 @@ template class InvalSet { public: InvalSet(); - ~InvalSet(); + ~InvalSet() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION; static const size_t kNPreallocatedElements = N_PREALLOCATED_ELEMENTS; static const KeyType kInvalidKey = INVALID_KEY; @@ -112,7 +112,7 @@ class InvalSet { size_t size() const; // Returns true if no elements are stored in the set. - // Note that this does not mean the the backing storage is empty: it can still + // Note that this does not mean the backing storage is empty: it can still // contain invalid elements. bool empty() const; @@ -323,7 +323,8 @@ InvalSet::InvalSet() template -InvalSet::~InvalSet() { +InvalSet::~InvalSet() + VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION { VIXL_ASSERT(monitor_ == 0); delete vector_; } @@ -841,9 +842,7 @@ InvalSetIterator::InvalSetIterator(const InvalSetIterator& other) #if __cplusplus >= 201103L template InvalSetIterator::InvalSetIterator(InvalSetIterator&& other) noexcept - : using_vector_(false), - index_(0), - inval_set_(NULL) { + : using_vector_(false), index_(0), inval_set_(NULL) { swap(*this, other); } #endif diff --git a/core/deps/vixl/macro-assembler-interface.h b/core/deps/vixl/macro-assembler-interface.h index a3194e308..3c0421f2c 100644 --- a/core/deps/vixl/macro-assembler-interface.h +++ b/core/deps/vixl/macro-assembler-interface.h @@ -35,7 +35,7 @@ class MacroAssemblerInterface { public: virtual internal::AssemblerBase* AsAssemblerBase() = 0; - virtual ~MacroAssemblerInterface() {} + virtual ~MacroAssemblerInterface() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION {} virtual bool AllowMacroInstructions() const = 0; virtual bool ArePoolsBlocked() const = 0; diff --git a/core/deps/vixl/pool-manager-impl.h b/core/deps/vixl/pool-manager-impl.h index c49b643fc..a1bcaaad8 100644 --- a/core/deps/vixl/pool-manager-impl.h +++ b/core/deps/vixl/pool-manager-impl.h @@ -264,14 +264,14 @@ bool PoolManager::MustEmit(T pc, if (checkpoint < temp.min_location_) return true; } - bool tempNotPlacedYet = true; + bool temp_not_placed_yet = true; for (int i = static_cast(objects_.size()) - 1; i >= 0; --i) { const PoolObject& current = objects_[i]; - if (tempNotPlacedYet && PoolObjectLessThan(current, temp)) { + if (temp_not_placed_yet && PoolObjectLessThan(current, temp)) { checkpoint = UpdateCheckpointForObject(checkpoint, &temp); if (checkpoint < temp.min_location_) return true; if (CheckFuturePC(pc, checkpoint)) return true; - tempNotPlacedYet = false; + temp_not_placed_yet = false; } if (current.label_base_ == label_base) continue; checkpoint = UpdateCheckpointForObject(checkpoint, ¤t); @@ -279,7 +279,7 @@ bool PoolManager::MustEmit(T pc, if (CheckFuturePC(pc, checkpoint)) return true; } // temp is the object with the smallest max_location_. - if (tempNotPlacedYet) { + if (temp_not_placed_yet) { checkpoint = UpdateCheckpointForObject(checkpoint, &temp); if (checkpoint < temp.min_location_) return true; } @@ -487,7 +487,7 @@ void PoolManager::Release(T pc) { } template -PoolManager::~PoolManager() { +PoolManager::~PoolManager() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION { #ifdef VIXL_DEBUG // Check for unbound objects. for (objects_iter iter = objects_.begin(); iter != objects_.end(); ++iter) { @@ -497,7 +497,7 @@ PoolManager::~PoolManager() { } #endif // Delete objects the pool manager owns. - for (typename std::vector *>::iterator + for (typename std::vector*>::iterator iter = delete_on_destruction_.begin(), end = delete_on_destruction_.end(); iter != end; diff --git a/core/deps/vixl/pool-manager.h b/core/deps/vixl/pool-manager.h index b5cb867be..27fa69ec2 100644 --- a/core/deps/vixl/pool-manager.h +++ b/core/deps/vixl/pool-manager.h @@ -142,7 +142,7 @@ class LocationBase { is_bound_(true), location_(location) {} - virtual ~LocationBase() {} + virtual ~LocationBase() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION {} // The PoolManager should assume ownership of some objects, and delete them // after they have been placed. This can happen for example for literals that @@ -369,8 +369,8 @@ class ForwardReference { // Specify the possible locations where the object could be stored. AArch32's // PC offset, and T32's PC alignment calculations should be applied by the - // Assembler, not here. The PoolManager deals only with simple locationes. - // Including min_object_adddress_ is necessary to handle AArch32 some + // Assembler, not here. The PoolManager deals only with simple locations. + // Including min_object_address_ is necessary to handle AArch32 some // instructions which have a minimum offset of 0, but also have the implicit // PC offset. // Note that this structure cannot handle sparse ranges, such as A32's ADR, @@ -397,7 +397,7 @@ class PoolManager { max_pool_size_(0), monitor_(0) {} - ~PoolManager(); + ~PoolManager() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION; // Check if we will need to emit the pool at location 'pc', when planning to // generate a certain number of bytes. This optionally takes a diff --git a/core/deps/vixl/utils-vixl.cc b/core/deps/vixl/utils-vixl.cc index 41b558686..639a4b195 100644 --- a/core/deps/vixl/utils-vixl.cc +++ b/core/deps/vixl/utils-vixl.cc @@ -24,10 +24,10 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#include - #include "utils-vixl.h" +#include + namespace vixl { // The default NaN values (for FPCR.DN=1). @@ -391,7 +391,7 @@ float FPToFloat(double value, } VIXL_UNREACHABLE(); - return value; + return static_cast(value); } // TODO: We should consider implementing a full FPToDouble(Float16) diff --git a/core/deps/vixl/utils-vixl.h b/core/deps/vixl/utils-vixl.h index 1c76fcb28..7af948392 100644 --- a/core/deps/vixl/utils-vixl.h +++ b/core/deps/vixl/utils-vixl.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "compiler-intrinsics-vixl.h" @@ -67,29 +68,40 @@ namespace vixl { #endif template -size_t ArrayLength(const T (&)[n]) { +constexpr size_t ArrayLength(const T (&)[n]) { return n; } +inline uint64_t GetUintMask(unsigned bits) { + VIXL_ASSERT(bits <= 64); + uint64_t base = (bits >= 64) ? 0 : (UINT64_C(1) << bits); + return base - 1; +} + +inline uint64_t GetSignMask(unsigned bits) { + VIXL_ASSERT(bits <= 64); + return UINT64_C(1) << (bits - 1); +} + // Check number width. // TODO: Refactor these using templates. inline bool IsIntN(unsigned n, uint32_t x) { - VIXL_ASSERT((0 < n) && (n < 32)); - uint32_t limit = UINT32_C(1) << (n - 1); - return x < limit; + VIXL_ASSERT((0 < n) && (n <= 32)); + return x <= static_cast(INT32_MAX >> (32 - n)); } inline bool IsIntN(unsigned n, int32_t x) { - VIXL_ASSERT((0 < n) && (n < 32)); + VIXL_ASSERT((0 < n) && (n <= 32)); + if (n == 32) return true; int32_t limit = INT32_C(1) << (n - 1); return (-limit <= x) && (x < limit); } inline bool IsIntN(unsigned n, uint64_t x) { - VIXL_ASSERT((0 < n) && (n < 64)); - uint64_t limit = UINT64_C(1) << (n - 1); - return x < limit; + VIXL_ASSERT((0 < n) && (n <= 64)); + return x <= static_cast(INT64_MAX >> (64 - n)); } inline bool IsIntN(unsigned n, int64_t x) { - VIXL_ASSERT((0 < n) && (n < 64)); + VIXL_ASSERT((0 < n) && (n <= 64)); + if (n == 64) return true; int64_t limit = INT64_C(1) << (n - 1); return (-limit <= x) && (x < limit); } @@ -98,7 +110,8 @@ VIXL_DEPRECATED("IsIntN", inline bool is_intn(unsigned n, int64_t x)) { } inline bool IsUintN(unsigned n, uint32_t x) { - VIXL_ASSERT((0 < n) && (n < 32)); + VIXL_ASSERT((0 < n) && (n <= 32)); + if (n >= 32) return true; return !(x >> n); } inline bool IsUintN(unsigned n, int32_t x) { @@ -107,7 +120,8 @@ inline bool IsUintN(unsigned n, int32_t x) { return !(static_cast(x) >> n); } inline bool IsUintN(unsigned n, uint64_t x) { - VIXL_ASSERT((0 < n) && (n < 64)); + VIXL_ASSERT((0 < n) && (n <= 64)); + if (n >= 64) return true; return !(x >> n); } inline bool IsUintN(unsigned n, int64_t x) { @@ -183,14 +197,14 @@ inline uint64_t ExtractUnsignedBitfield64(int msb, int lsb, uint64_t x) { } -inline uint32_t ExtractUnsignedBitfield32(int msb, int lsb, uint32_t x) { +inline uint32_t ExtractUnsignedBitfield32(int msb, int lsb, uint64_t x) { VIXL_ASSERT((static_cast(msb) < sizeof(x) * 8) && (lsb >= 0) && (msb >= lsb)); return TruncateToUint32(ExtractUnsignedBitfield64(msb, lsb, x)); } -inline int64_t ExtractSignedBitfield64(int msb, int lsb, int64_t x) { +inline int64_t ExtractSignedBitfield64(int msb, int lsb, uint64_t x) { VIXL_ASSERT((static_cast(msb) < sizeof(x) * 8) && (lsb >= 0) && (msb >= lsb)); uint64_t temp = ExtractUnsignedBitfield64(msb, lsb, x); @@ -203,8 +217,7 @@ inline int64_t ExtractSignedBitfield64(int msb, int lsb, int64_t x) { return result; } - -inline int32_t ExtractSignedBitfield32(int msb, int lsb, int32_t x) { +inline int32_t ExtractSignedBitfield32(int msb, int lsb, uint64_t x) { VIXL_ASSERT((static_cast(msb) < sizeof(x) * 8) && (lsb >= 0) && (msb >= lsb)); uint32_t temp = TruncateToUint32(ExtractSignedBitfield64(msb, lsb, x)); @@ -213,7 +226,6 @@ inline int32_t ExtractSignedBitfield32(int msb, int lsb, int32_t x) { return result; } - inline uint64_t RotateRight(uint64_t value, unsigned int rotate, unsigned int width) { @@ -271,6 +283,39 @@ VIXL_DEPRECATED("RawbitsToDouble", return RawbitsToDouble(bits); } +// Some compilers dislike negating unsigned integers, +// so we provide an equivalent. +template +T UnsignedNegate(T value) { + VIXL_STATIC_ASSERT(std::is_unsigned::value); + return ~value + 1; +} + +// An absolute operation for signed integers that is defined for results outside +// the representable range. Specifically, Abs(MIN_INT) is MIN_INT. +template +T Abs(T val) { + // TODO: this static assertion is for signed integer inputs, as that's the + // only type tested. However, the code should work for all numeric inputs. + // Remove the assertion and this comment when more tests are available. + VIXL_STATIC_ASSERT(std::is_signed::value && std::is_integral::value); + return ((val >= -std::numeric_limits::max()) && (val < 0)) ? -val : val; +} + +// Convert unsigned to signed numbers in a well-defined way (using two's +// complement representations). +inline int64_t RawbitsToInt64(uint64_t bits) { + return (bits >= UINT64_C(0x8000000000000000)) + ? (-static_cast(UnsignedNegate(bits) - 1) - 1) + : static_cast(bits); +} + +inline int32_t RawbitsToInt32(uint32_t bits) { + return (bits >= UINT64_C(0x80000000)) + ? (-static_cast(UnsignedNegate(bits) - 1) - 1) + : static_cast(bits); +} + namespace internal { // Internal simulation class used solely by the simulator to @@ -294,7 +339,7 @@ class SimFloat16 : public Float16 { bool operator>(SimFloat16 rhs) const; bool operator==(SimFloat16 rhs) const; bool operator!=(SimFloat16 rhs) const; - // This is necessary for conversions peformed in (macro asm) Fmov. + // This is necessary for conversions performed in (macro asm) Fmov. bool operator==(double rhs) const; operator double() const; }; @@ -365,6 +410,10 @@ VIXL_DEPRECATED("Float16Classify", inline int float16classify(uint16_t value)) { bool IsZero(Float16 value); +inline bool IsPositiveZero(double value) { + return (value == 0.0) && (copysign(1.0, value) > 0.0); +} + inline bool IsNaN(float value) { return std::isnan(value); } inline bool IsNaN(double value) { return std::isnan(value); } @@ -447,7 +496,9 @@ inline float FusedMultiplyAdd(float op1, float op2, float a) { } -inline uint64_t LowestSetBit(uint64_t value) { return value & -value; } +inline uint64_t LowestSetBit(uint64_t value) { + return value & UnsignedNegate(value); +} template @@ -484,11 +535,11 @@ T ReverseBits(T value) { template -inline T SignExtend(T val, int bitSize) { - VIXL_ASSERT(bitSize > 0); - T mask = (T(2) << (bitSize - 1)) - T(1); +inline T SignExtend(T val, int size_in_bits) { + VIXL_ASSERT(size_in_bits > 0); + T mask = (T(2) << (size_in_bits - 1)) - T(1); val &= mask; - T sign_bits = -((val >> (bitSize - 1)) << bitSize); + T sign_bits = -((val >> (size_in_bits - 1)) << size_in_bits); val |= sign_bits; return val; } @@ -570,7 +621,7 @@ T AlignUp(T pointer, // reinterpret_cast behaviour for other types. typename Unsigned::type pointer_raw = - (typename Unsigned::type)pointer; + (typename Unsigned::type) pointer; VIXL_STATIC_ASSERT(sizeof(pointer) <= sizeof(pointer_raw)); size_t mask = alignment - 1; @@ -590,7 +641,7 @@ T AlignDown(T pointer, // reinterpret_cast behaviour for other types. typename Unsigned::type pointer_raw = - (typename Unsigned::type)pointer; + (typename Unsigned::type) pointer; VIXL_STATIC_ASSERT(sizeof(pointer) <= sizeof(pointer_raw)); size_t mask = alignment - 1; @@ -801,7 +852,7 @@ class Uint32 { } int32_t GetSigned() const { return data_; } Uint32 operator~() const { return Uint32(~data_); } - Uint32 operator-() const { return Uint32(-data_); } + Uint32 operator-() const { return Uint32(UnsignedNegate(data_)); } bool operator==(Uint32 value) const { return data_ == value.data_; } bool operator!=(Uint32 value) const { return data_ != value.data_; } bool operator>(Uint32 value) const { return data_ > value.data_; } @@ -869,7 +920,7 @@ class Uint64 { Uint32 GetHigh32() const { return Uint32(data_ >> 32); } Uint32 GetLow32() const { return Uint32(data_ & 0xffffffff); } Uint64 operator~() const { return Uint64(~data_); } - Uint64 operator-() const { return Uint64(-data_); } + Uint64 operator-() const { return Uint64(UnsignedNegate(data_)); } bool operator==(Uint64 value) const { return data_ == value.data_; } bool operator!=(Uint64 value) const { return data_ != value.data_; } Uint64 operator+(Uint64 value) const { return Uint64(data_ + value.data_); } @@ -974,6 +1025,42 @@ Uint64::Uint64(Uint128 data) : data_(data.ToUint64().Get()) {} Int64 BitCount(Uint32 value); +// The algorithm used is adapted from the one described in section 8.2 of +// Hacker's Delight, by Henry S. Warren, Jr. +template +int64_t MultiplyHigh(T u, T v) { + uint64_t u0, v0, w0, u1, v1, w1, w2, t; + VIXL_STATIC_ASSERT((N == 8) || (N == 16) || (N == 32) || (N == 64)); + uint64_t sign_mask = UINT64_C(1) << (N - 1); + uint64_t sign_ext = 0; + unsigned half_bits = N / 2; + uint64_t half_mask = GetUintMask(half_bits); + if (std::numeric_limits::is_signed) { + sign_ext = UINT64_C(0xffffffffffffffff) << half_bits; + } + + VIXL_ASSERT(sizeof(u) == sizeof(uint64_t)); + VIXL_ASSERT(sizeof(u) == sizeof(u0)); + + u0 = u & half_mask; + u1 = u >> half_bits | (((u & sign_mask) != 0) ? sign_ext : 0); + v0 = v & half_mask; + v1 = v >> half_bits | (((v & sign_mask) != 0) ? sign_ext : 0); + + w0 = u0 * v0; + t = u1 * v0 + (w0 >> half_bits); + + w1 = t & half_mask; + w2 = t >> half_bits | (((t & sign_mask) != 0) ? sign_ext : 0); + w1 = u0 * v1 + w1; + w1 = w1 >> half_bits | (((w1 & sign_mask) != 0) ? sign_ext : 0); + + uint64_t value = u1 * v1 + w2 + w1; + int64_t result; + memcpy(&result, &value, sizeof(result)); + return result; +} + } // namespace internal // The default NaN values (for FPCR.DN=1). @@ -1139,7 +1226,7 @@ T FPRound(int64_t sign, // For subnormal outputs, the shift must be adjusted by the exponent. The +1 // is necessary because the exponent of a subnormal value (encoded as 0) is // the same as the exponent of the smallest normal value (encoded as 1). - shift += -exponent + 1; + shift += static_cast(-exponent + 1); // Handle inputs that would produce a zero output. // @@ -1238,9 +1325,8 @@ inline Float16 FPRoundToFloat16(int64_t sign, uint64_t mantissa, FPRounding round_mode) { return RawbitsToFloat16( - FPRound(sign, exponent, mantissa, round_mode)); + FPRound( + sign, exponent, mantissa, round_mode)); } @@ -1276,6 +1362,81 @@ Float16 FPToFloat16(double value, FPRounding round_mode, UseDefaultNaN DN, bool* exception = NULL); + +// Like static_cast(value), but with specialisations for the Float16 type. +template +T StaticCastFPTo(F value) { + return static_cast(value); +} + +template <> +inline float StaticCastFPTo(Float16 value) { + return FPToFloat(value, kIgnoreDefaultNaN); +} + +template <> +inline double StaticCastFPTo(Float16 value) { + return FPToDouble(value, kIgnoreDefaultNaN); +} + +template <> +inline Float16 StaticCastFPTo(float value) { + return FPToFloat16(value, FPTieEven, kIgnoreDefaultNaN); +} + +template <> +inline Float16 StaticCastFPTo(double value) { + return FPToFloat16(value, FPTieEven, kIgnoreDefaultNaN); +} + +template +uint64_t FPToRawbitsWithSize(unsigned size_in_bits, T value) { + switch (size_in_bits) { + case 16: + return Float16ToRawbits(StaticCastFPTo(value)); + case 32: + return FloatToRawbits(StaticCastFPTo(value)); + case 64: + return DoubleToRawbits(StaticCastFPTo(value)); + } + VIXL_UNREACHABLE(); + return 0; +} + +template +T RawbitsWithSizeToFP(unsigned size_in_bits, uint64_t value) { + VIXL_ASSERT(IsUintN(size_in_bits, value)); + switch (size_in_bits) { + case 16: + return StaticCastFPTo(RawbitsToFloat16(static_cast(value))); + case 32: + return StaticCastFPTo(RawbitsToFloat(static_cast(value))); + case 64: + return StaticCastFPTo(RawbitsToDouble(value)); + } + VIXL_UNREACHABLE(); + return 0; +} + +// Jenkins one-at-a-time hash, based on +// https://en.wikipedia.org/wiki/Jenkins_hash_function citing +// https://www.drdobbs.com/database/algorithm-alley/184410284. +constexpr uint32_t Hash(const char* str, uint32_t hash = 0) { + if (*str == '\0') { + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; + } else { + hash += *str; + hash += hash << 10; + hash ^= hash >> 6; + return Hash(str + 1, hash); + } +} + +constexpr uint32_t operator"" _h(const char* x, size_t) { return Hash(x); } + } // namespace vixl #endif // VIXL_UTILS_H diff --git a/core/emulator.cpp b/core/emulator.cpp index c813434e8..2364b9da5 100644 --- a/core/emulator.cpp +++ b/core/emulator.cpp @@ -30,40 +30,36 @@ #include "hw/sh4/sh4_sched.h" #include "hw/flashrom/nvmem.h" #include "cheats.h" -#include "oslib/audiostream.h" +#include "audio/audiostream.h" #include "debug/gdb_server.h" #include "hw/pvr/Renderer_if.h" #include "hw/arm7/arm7_rec.h" #include "network/ggpo.h" #include "hw/mem/mem_watch.h" #include "network/net_handshake.h" -#include "rend/gui.h" #include "network/naomi_network.h" #include "serialize.h" #include "hw/pvr/pvr.h" #include "profiler/fc_profiler.h" #include "oslib/storage.h" +#include "wsi/context.h" #include +#ifndef LIBRETRO +#include "ui/gui.h" +#endif +#include "hw/sh4/sh4_interpreter.h" +#include "hw/sh4/dyna/ngen.h" settings_t settings; -constexpr float WINCE_DEPTH_SCALE = 0.01f; +constexpr char const *BIOS_TITLE = "Dreamcast BIOS"; static void loadSpecialSettings() { std::string& prod_id = settings.content.gameId; NOTICE_LOG(BOOT, "Game ID is [%s]", prod_id.c_str()); - settings.input.lightgunGame = false; - if (settings.platform.isConsole()) { - if (ip_meta.isWindowsCE() || prod_id == "T26702N") // PBA Tour Bowling 2001 - { - INFO_LOG(BOOT, "Enabling Extra depth scaling for Windows CE game"); - config::ExtraDepthScale.override(WINCE_DEPTH_SCALE); - config::ForceWindowsCE.override(true); - } - // Tony Hawk's Pro Skater 2 if (prod_id == "T13008D 05" || prod_id == "T13006N" // Tony Hawk's Pro Skater 1 @@ -94,7 +90,9 @@ static void loadSpecialSettings() || prod_id == "HDR-0078" // JSR (EU) || prod_id == "MK-5105850" - // Worms World Party + // Worms World Party (US) + || prod_id == "T22904N" + // Worms World Party (EU) || prod_id == "T7016D 50" // Shenmue (US) || prod_id == "MK-51059" @@ -103,52 +101,97 @@ static void loadSpecialSettings() // Shenmue (JP) || prod_id == "HDR-0016" // Izumo - || prod_id == "T46902M") + || prod_id == "T46902M" + // Cardcaptor Sakura + || prod_id == "HDR-0115" + // Grandia II (US) + || prod_id == "T17716N" + // Grandia II (EU) + || prod_id == "T17715D" + // Grandia II (JP) + || prod_id == "T4503M" + // Canvas: Sepia Iro no Motif + || prod_id == "T20108M" + // Kimi ga Nozomu Eien + || prod_id == "T47101M" + // Pro Mahjong Kiwame D + || prod_id == "T16801M" + // Yoshia no Oka de Nekoronde... + || prod_id == "T18704M" + // Tamakyuu (a.k.a. Tama-cue) + || prod_id == "T20133M" + // Sakura Taisen 1 + || prod_id == "HDR-0072" + // Sakura Taisen 3 + || prod_id == "HDR-0152" + // Hundred Swords + || prod_id == "HDR-0124" + // Musapey's Choco Marker + || prod_id == "T23203M" + // Sister Princess Premium Edition + || prod_id == "T27802M" + // Sentimental Graffiti + || prod_id == "T20128M" + // Sentimental Graffiti 2 + || prod_id == "T20104M" + // Kanon + || prod_id == "T20105M" + // Aikagi + || prod_id == "T20130M" + // AIR + || prod_id == "T20112M" + // Cool Boarders Burrrn (JP) + || prod_id == "T36901M" + // Castle Fantasia - Seima Taisen (JP) + || prod_id == "T46901M" + // Silent Scope (US) + || prod_id == "T9507N" + // Silent Scope (EU) + || prod_id == "T9505D" + // Silent Scope (JP) + || prod_id == "T9513M" + // Pro Pinball - Trilogy (EU) + || prod_id == "T30701D 50") { INFO_LOG(BOOT, "Enabling RTT Copy to VRAM for game %s", prod_id.c_str()); config::RenderToTextureBuffer.override(true); } + // Cosmic Smash if (prod_id == "HDR-0176" || prod_id == "RDC-0057") { INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", prod_id.c_str()); - // Cosmic Smash config::TranslucentPolygonDepthMask.override(true); } - // NHL 2K2 - if (prod_id == "MK-51182") + // Extra Depth Scaling + if (prod_id == "MK-51182") // NHL 2K2 { INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); - config::ExtraDepthScale.override(1000000.f); // Mali needs 1M, 10K is enough for others + config::ExtraDepthScale.override(1e8f); } - // Re-Volt (US, EU) - else if (prod_id == "T-8109N" || prod_id == "T8107D 50") + else if (prod_id == "T-8109N" // Re-Volt (US, EU, JP) + || prod_id == "T8107D 50" + || prod_id == "T-8101M" + || prod_id == "DR001") // Sturmwind { INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); config::ExtraDepthScale.override(100.f); } - // Samurai Shodown 6 dc port - else if (prod_id == "T0002M") - { - INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); - config::ExtraDepthScale.override(1e26f); - } - // Test Drive V-Rally - else if (prod_id == "T15110N" || prod_id == "T15105D 50") + else if (prod_id == "T15110N" // Test Drive V-Rally + || prod_id == "T15105D 50") { INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); config::ExtraDepthScale.override(0.1f); } - // South Park Rally - else if (prod_id == "T-8116N" || prod_id == "T-8112D-50") + else if (prod_id == "T-8116N" // South Park Rally + || prod_id == "T-8112D-50") { INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); config::ExtraDepthScale.override(1000.f); } - // Re-Volt (JP) - else if (prod_id == "T-8101M") + else if (prod_id == "T1247M") // Capcom vs. SNK - Millennium Fight 2000 Pro { INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); - config::ExtraDepthScale.override(100.f); + config::ExtraDepthScale.override(10000.f); } std::string areas(ip_meta.area_symbols, sizeof(ip_meta.area_symbols)); @@ -226,22 +269,39 @@ static void loadSpecialSettings() NOTICE_LOG(BOOT, "Forcing real BIOS"); config::UseReios.override(false); } + else if (prod_id == "T17708N" // Stupid Invaders (US) + || prod_id == "T17711D" // Stupid Invaders (EU) + || prod_id == "T46509M" // Suika (JP) + || prod_id == "T36901M") // Cool Boarders Burrrn (JP) + { + NOTICE_LOG(BOOT, "Forcing HLE BIOS"); + config::UseReios.override(true); + } if (prod_id == "T-9707N" // San Francisco Rush 2049 (US) || prod_id == "MK-51146" // Sega Smash Pack - Volume 1 || prod_id == "T-9702D-50" // Hydro Thunder (PAL) - || prod_id == "T41601N") // Elemental Gimmick Gear (US) + || prod_id == "T41601N" // Elemental Gimmick Gear (US) + || prod_id == "T-8116N" // South Park Rally (US) + || prod_id == "T1206N") // JoJo's Bizarre Adventure (US) { NOTICE_LOG(BOOT, "Forcing NTSC broadcasting"); config::Broadcast.override(0); } - else if (prod_id == "T-9709D-50") // San Francisco Rush 2049 (EU) + else if (prod_id == "T-9709D-50" // San Francisco Rush 2049 (EU) + || prod_id == "T-8112D-50" // South Park Rally (EU) + || prod_id == "T7014D 50" // Super Runabout (EU) + || prod_id == "T10001D 50" // MTV Sport - Skateboarding (PAL) + || prod_id == "MK-5101050") // Snow Surfers { NOTICE_LOG(BOOT, "Forcing PAL broadcasting"); config::Broadcast.override(1); } if (prod_id == "T1102M" // Densha de Go! 2 || prod_id == "T00000A" // The Ring of the Nibelungen (demo, hack) - || prod_id == "T15124N 00") // Worms Pinball (prototype) + || prod_id == "T15124N 00" // Worms Pinball (prototype) + || prod_id == "T9503M" // Eisei Meijin III + || prod_id == "T5202M" // Marionette Company + || prod_id == "T5301M") // World Neverland Plus { NOTICE_LOG(BOOT, "Forcing Full Framebuffer Emulation"); config::EmulateFramebuffer.override(true); @@ -251,20 +311,81 @@ static void loadSpecialSettings() NOTICE_LOG(BOOT, "Forcing English Language"); config::Language.override(1); } + if (prod_id == "T-9701N" // Mortal Kombat (US) + || prod_id == "T9701D") // Mortal Kombat (EU) + { + NOTICE_LOG(BOOT, "Disabling Native Depth Interpolation"); + config::NativeDepthInterpolation.override(false); + } + // Per-pixel transparent layers + int layers = 0; + if (prod_id == "MK-51011" // Time Stalkers (US) + || prod_id == "MK-5101153") // Time Stalkers (EU) + layers = 72; + else if (prod_id == "T13001N" // Blue Stinger (US) + || prod_id == "HDR-0003" // Blue Stinger (JP) + || prod_id == "T13001D-05" // Blue Stinger (EU) + || prod_id == "T13001D 18") // Blue Stinger (DE) + layers = 80; + else if (prod_id == "T2102M" // Panzer Front + || prod_id == "T-8118N" // Spirit of Speed (US) + || prod_id == "T-8117D-50" // Spirit of Speed (EU) + || prod_id == "T13002N" // Vigilante 8 (US) + || prod_id == "T13002D") // Vigilante 8 (EU) + layers = 64; + else if (prod_id == "T2106M") // L.O.L. Lack of Love + layers = 48; + else if (prod_id == "T1212M") // Gaiamaster - Kessen! Seikioh Densetsu + layers = 96; + else if (prod_id == "T-9707N" // San Francisco Rush 2049 (US) + || prod_id == "T-9709D-50" // San Francisco Rush 2049 (EU) + || prod_id == "T17721N" // Conflict Zone (US) + || prod_id == "T46604D") // Conflict Zone (EU) + layers = 152; + else if (prod_id == "MK-51033" // ECCO the Dolphin (US) + || prod_id == "MK-5103350" // ECCO the Dolphin (EU) + || prod_id == "HDR-0103") // ECCO the Dolphin (JP) + layers = 96; + else if (prod_id == "T40203N") // Draconus: Cult of the Wyrm + layers = 80; + else if (prod_id == "T40212N" // Soldier of Fortune (US) + || prod_id == "T17726D 50") // Soldier of Fortune (EU) + layers = 86; + else if (prod_id == "T44102N") // BANG! Gunship Elite + layers = 100; + else if (prod_id == "T12502N" // MDK 2 (US) + || prod_id == "T12501D 50") // MDK 2 (EU) + layers = 200; + else if (prod_id == "T9708D 50") // Army Men + layers = 173; + else if (prod_id == "MK-51038" // Zombie Revenge (US) + || prod_id == "MK-5103850" // Zombie Revenge (EU) + || prod_id == "HDR-0026" // Zombie Revenge (JP) + || prod_id == "36801N" // Fighting Force 2 (US) + || prod_id == "36802D 80" // Fighting Force 2 (PAL, en-fr) + || prod_id == "36802D 18") // Fighting Force 2 (PAL, de) + layers = 116; + else if (prod_id == "T15112N") // Demolition Racer (US) + layers = 44; + else if (prod_id == "T1208N" // Tech Romancer (US) + || prod_id == "T7009D50") // Tech Romancer (EU) + layers = 56; + if (layers != 0) { + NOTICE_LOG(BOOT, "Forcing %d transparent layers", layers); + config::PerPixelLayers.override(layers); + } } else if (settings.platform.isArcade()) { - if (prod_id == "SAMURAI SPIRITS 6") - { - INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); - config::ExtraDepthScale.override(1e26f); - } if (prod_id == "COSMIC SMASH IN JAPAN") { INFO_LOG(BOOT, "Enabling translucent depth multipass for game %s", prod_id.c_str()); config::TranslucentPolygonDepthMask.override(true); } - if (prod_id == "BEACH SPIKERS JAPAN") + if (prod_id == "BEACH SPIKERS JAPAN" + || prod_id == "CHOCO MARKER" + || prod_id == "LOVE AND BERRY USA VER1.003" // lovebero + || prod_id == "LOVE AND BERRY USA VER2.000") // lovebery { INFO_LOG(BOOT, "Enabling RTT Copy to VRAM for game %s", prod_id.c_str()); config::RenderToTextureBuffer.override(true); @@ -274,130 +395,19 @@ static void loadSpecialSettings() INFO_LOG(BOOT, "Disabling Free Play for game %s", prod_id.c_str()); config::ForceFreePlay.override(false); } - // Input configuration - settings.input.JammaSetup = JVS::Default; - if (prod_id == "DYNAMIC GOLF" - || prod_id == "SHOOTOUT POOL" - || prod_id == "SHOOTOUT POOL MEDAL" - || prod_id == "CRACKIN'DJ ver JAPAN" - || prod_id == "CRACKIN'DJ PART2 ver JAPAN" - || prod_id == "KICK '4' CASH" - || prod_id == "DRIVE") // Waiwai drive - { - INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::RotaryEncoders; - } - else if (prod_id == "POWER STONE 2 JAPAN" // Naomi - || prod_id == "GUILTY GEAR isuka" // AW - || prod_id == "Dirty Pigskin Football") // AW - { - INFO_LOG(BOOT, "Enabling 4-player setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::FourPlayers; - } - else if (prod_id == "SEGA MARINE FISHING JAPAN" - || prod_id == "BASS FISHING SIMULATOR VER.A") // AW - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::SegaMarineFishing; - } - else if (prod_id == "RINGOUT 4X4 JAPAN" - || prod_id == "VIRTUA ATHLETE" - || prod_id == "ROYAL RUMBLE" - || prod_id == "BEACH SPIKERS JAPAN" - || prod_id == "MJ JAPAN") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::DualIOBoards4P; - } - else if (prod_id == "NINJA ASSAULT" - || prod_id == "Sports Shooting USA" // AW - || prod_id == "SEGA CLAY CHALLENGE" // AW - || prod_id == "RANGER MISSION" // AW - || prod_id == "EXTREME HUNTING" // AW - || prod_id == "Fixed BOOT strapper")// Extreme hunting 2 (AW) - { - INFO_LOG(BOOT, "Enabling lightgun setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::LightGun; - settings.input.lightgunGame = true; - } - else if (prod_id == "MAZAN") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::Mazan; - settings.input.lightgunGame = true; - } - else if (prod_id == " BIOHAZARD GUN SURVIVOR2") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::GunSurvivor; - } - else if (prod_id == "WORLD KICKS") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::WorldKicks; - } - else if (prod_id == "WORLD KICKS PCB") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::WorldKicksPCB; - } - else if (prod_id == "THE TYPING OF THE DEAD" - || prod_id == " LUPIN THE THIRD -THE TYPING-" - || prod_id == "------La Keyboardxyu------") - { - INFO_LOG(BOOT, "Enabling keyboard for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::Keyboard; - } - else if (prod_id == "OUTTRIGGER JAPAN") - { - INFO_LOG(BOOT, "Enabling JVS rotary encoders for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::OutTrigger; - } - else if (prod_id == "THE MAZE OF THE KINGS" - || prod_id == " CONFIDENTIAL MISSION ---------" - || prod_id == "DEATH CRIMSON OX" - || prod_id.substr(0, 5) == "hotd2" // House of the Dead 2 - || prod_id == "LUPIN THE THIRD -THE SHOOTING-") - { - INFO_LOG(BOOT, "Enabling lightgun as analog setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::LightGunAsAnalog; - settings.input.lightgunGame = true; - } - else if (prod_id == "WAVE RUNNER GP") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::WaveRunnerGP; - } - else if (prod_id == " 18WHEELER") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::_18Wheeler; - } - else if (prod_id == "F355 CHALLENGE JAPAN") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::F355; - } - else if (prod_id == "INU NO OSANPO") // Dog Walking - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::DogWalking; - } - else if (prod_id == " TOUCH DE UNOH -------------" || prod_id == " TOUCH DE UNOH 2 -----------") - { - INFO_LOG(BOOT, "Enabling specific JVS setup for game %s", prod_id.c_str()); - settings.input.JammaSetup = JVS::TouchDeUno; - settings.input.lightgunGame = true; + if (prod_id == "VIRTUAL-ON ORATORIO TANGRAM") { + INFO_LOG(BOOT, "Forcing Japan region for game %s", prod_id.c_str()); + config::Region.override(0); } - else if (prod_id == "POKASUKA GHOST (JAPANESE)" // Manic Panic Ghosts - || prod_id == "TOUCH DE ZUNO (JAPAN)") + if (prod_id == "CAPCOM VS SNK PRO JAPAN") { - settings.input.lightgunGame = true; + INFO_LOG(BOOT, "Enabling Extra depth scaling for game %s", prod_id.c_str()); + config::ExtraDepthScale.override(10000.f); } } } -void dc_reset(bool hard) +void Emulator::dc_reset(bool hard) { if (hard) { @@ -408,7 +418,7 @@ void dc_reset(bool hard) sh4_sched_reset(hard); pvr::reset(hard); aica::reset(hard); - sh4_cpu.Reset(true); + getSh4Executor()->Reset(true); mem_Reset(hard); } @@ -420,33 +430,40 @@ static void setPlatform(int platform) switch (platform) { case DC_PLATFORM_DREAMCAST: - settings.platform.ram_size = 16 * 1024 * 1024; - settings.platform.vram_size = 8 * 1024 * 1024; - settings.platform.aram_size = 2 * 1024 * 1024; - settings.platform.bios_size = 2 * 1024 * 1024; - settings.platform.flash_size = 128 * 1024; + settings.platform.ram_size = config::RamMod32MB ? 32_MB : 16_MB; + settings.platform.vram_size = 8_MB; + settings.platform.aram_size = 2_MB; + settings.platform.bios_size = 2_MB; + settings.platform.flash_size = 128_KB; break; case DC_PLATFORM_NAOMI: - settings.platform.ram_size = 32 * 1024 * 1024; - settings.platform.vram_size = 16 * 1024 * 1024; - settings.platform.aram_size = 8 * 1024 * 1024; - settings.platform.bios_size = 2 * 1024 * 1024; - settings.platform.flash_size = 32 * 1024; // battery-backed ram + settings.platform.ram_size = 32_MB; + settings.platform.vram_size = 16_MB; + settings.platform.aram_size = 8_MB; + settings.platform.bios_size = 2_MB; + settings.platform.flash_size = 32_KB; // battery-backed ram break; case DC_PLATFORM_NAOMI2: - settings.platform.ram_size = 32 * 1024 * 1024; - settings.platform.vram_size = 16 * 1024 * 1024; // 2x16 MB VRAM, only 16 emulated - settings.platform.aram_size = 8 * 1024 * 1024; - settings.platform.bios_size = 2 * 1024 * 1024; - settings.platform.flash_size = 32 * 1024; // battery-backed ram - elan::ERAM_SIZE = 32 * 1024 * 1024; + settings.platform.ram_size = 32_MB; + settings.platform.vram_size = 16_MB; // 2x16 MB VRAM, only 16 emulated + settings.platform.aram_size = 8_MB; + settings.platform.bios_size = 2_MB; + settings.platform.flash_size = 32_KB; // battery-backed ram + elan::ERAM_SIZE = 32_MB; break; case DC_PLATFORM_ATOMISWAVE: - settings.platform.ram_size = 16 * 1024 * 1024; - settings.platform.vram_size = 8 * 1024 * 1024; - settings.platform.aram_size = 2 * 1024 * 1024; - settings.platform.bios_size = 128 * 1024; - settings.platform.flash_size = 128 * 1024; // sram + settings.platform.ram_size = 16_MB; + settings.platform.vram_size = 8_MB; + settings.platform.aram_size = 2_MB; + settings.platform.bios_size = 128_KB; + settings.platform.flash_size = 128_KB; // sram + break; + case DC_PLATFORM_SYSTEMSP: + settings.platform.ram_size = 32_MB; + settings.platform.vram_size = 16_MB; + settings.platform.aram_size = 8_MB; + settings.platform.bios_size = 2_MB; + settings.platform.flash_size = 128_KB; // sram break; default: die("Unsupported platform"); @@ -469,6 +486,7 @@ void Emulator::init() // Default platform setPlatform(DC_PLATFORM_DREAMCAST); + libGDR_init(); pvr::init(); aica::init(); mem_Init(); @@ -476,22 +494,28 @@ void Emulator::init() // the recompiler may start generating code at this point and needs a fully configured machine #if FEAT_SHREC != DYNAREC_NONE - Get_Sh4Recompiler(&sh4_cpu); - sh4_cpu.Init(); // Also initialize the interpreter + recompiler = Get_Sh4Recompiler(); + recompiler->Init(); if(config::DynarecEnabled) - { INFO_LOG(DYNAREC, "Using Recompiler"); - } else #endif - { - Get_Sh4Interpreter(&sh4_cpu); - sh4_cpu.Init(); INFO_LOG(INTERPRETER, "Using Interpreter"); - } + interpreter = Get_Sh4Interpreter(); + interpreter->Init(); state = Init; } +Sh4Executor *Emulator::getSh4Executor() +{ +#if FEAT_SHREC != DYNAREC_NONE + if(config::DynarecEnabled) + return recompiler; + else +#endif + return interpreter; +} + int getGamePlatform(const std::string& filename) { if (settings.naomi.slave) @@ -529,6 +553,8 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) { hostfs::FileInfo info = hostfs::storage().getFileInfo(settings.content.path); settings.content.fileName = info.name; + if (settings.content.title.empty()) + settings.content.title = get_file_basename(info.name); } } else @@ -552,14 +578,14 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) // Boot BIOS if (!nvmem::loadFiles()) throw FlycastException("No BIOS file found in " + hostfs::getFlashSavePath("", "")); - InitDrive(""); + gdr::initDrive(""); } else { std::string extension = get_file_extension(settings.content.path); if (extension != "elf") { - if (InitDrive(settings.content.path)) + if (gdr::initDrive(settings.content.path)) { loadGameSpecificSettings(); if (config::UseReios || !nvmem::loadFiles()) @@ -567,7 +593,7 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) nvmem::loadHle(); NOTICE_LOG(BOOT, "Did not load BIOS, using reios"); if (!config::UseReios && config::UseReios.isReadOnly()) - gui_display_notification("This game requires a real BIOS", 15000); + os_notify("This game requires a real BIOS", 15000); } } else @@ -576,15 +602,18 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) settings.content.path.clear(); if (!nvmem::loadFiles()) throw FlycastException("This media cannot be loaded"); - InitDrive(""); + gdr::initDrive(""); } } else { // Elf only supported with HLE BIOS nvmem::loadHle(); + gdr::initDrive(""); } } + if (settings.content.path.empty()) + settings.content.title = BIOS_TITLE; if (progress) progress->progress = 1.0f; @@ -605,10 +634,18 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) // Must be done after the maple devices are created and EEPROM is accessible naomi_cart_ConfigureEEPROM(); } +#ifdef USE_RACHIEVEMENTS + // RA probably isn't expecting to travel back in the past so disable it + if (config::GGPOEnable) + config::EnableAchievements.override(false); + // Hardcore mode disables all cheats, under/overclocking, load state, lua and forces dynarec on + settings.raHardcoreMode = config::EnableAchievements && config::AchievementsHardcoreMode + && !NaomiNetworkSupported(); +#endif cheatManager.reset(settings.content.gameId); if (cheatManager.isWidescreen()) { - gui_display_notification("Widescreen cheat activated", 1000); + os_notify("Widescreen cheat activated", 2000); config::ScreenStretching.override(134); // 4:3 -> 16:9 } // reload settings so that all settings can be overridden @@ -617,10 +654,12 @@ void Emulator::loadGame(const char *path, LoadProgress *progress) settings.input.fastForwardMode = false; if (!settings.content.path.empty()) { +#ifndef LIBRETRO if (config::GGPOEnable) dc_loadstate(-1); else if (config::AutoLoadState && !NaomiNetworkSupported() && !settings.naomi.multiboard) dc_loadstate(config::SavestateSlot); +#endif } EventManager::event(Event::Start); @@ -645,13 +684,13 @@ void Emulator::runInternal() { if (singleStep) { - sh4_cpu.Step(); + getSh4Executor()->Step(); singleStep = false; } else if(stepRangeTo != 0) { while (Sh4cntx.pc >= stepRangeFrom && Sh4cntx.pc <= stepRangeTo) - sh4_cpu.Step(); + getSh4Executor()->Step(); stepRangeFrom = 0; stepRangeTo = 0; @@ -661,12 +700,14 @@ void Emulator::runInternal() do { resetRequested = false; - sh4_cpu.Run(); + getSh4Executor()->Run(); if (resetRequested) { nvmem::saveFiles(); dc_reset(false); + if (!restartCpu()) + resetRequested = false; } } while (resetRequested); } @@ -679,8 +720,11 @@ void Emulator::unloadGame() } catch (...) { } if (state == Loaded || state == Error) { - if (state == Loaded && config::AutoSaveState && !settings.content.path.empty() && !settings.naomi.multiboard) - dc_savestate(config::SavestateSlot); +#ifndef LIBRETRO + if (state == Loaded && config::AutoSaveState && !settings.content.path.empty() + && !settings.naomi.multiboard && !config::GGPOEnable && !NaomiNetworkSupported()) + gui_saveState(false); +#endif try { dc_reset(true); } catch (const FlycastException& e) { @@ -692,6 +736,8 @@ void Emulator::unloadGame() settings.content.path.clear(); settings.content.gameId.clear(); settings.content.fileName.clear(); + settings.content.title.clear(); + settings.platform.system = DC_PLATFORM_DREAMCAST; state = Init; EventManager::event(Event::Terminate); } @@ -703,16 +749,28 @@ void Emulator::term() if (state == Init) { debugger::term(); - sh4_cpu.Term(); + if (interpreter != nullptr) + { + interpreter->Term(); + delete interpreter; + interpreter = nullptr; + } + if (recompiler != nullptr) + { + recompiler->Term(); + delete recompiler; + recompiler = nullptr; + } custom_texture.Terminate(); // lr: avoid deadlock on exit (win32) reios_term(); aica::term(); pvr::term(); mem_Term(); + libGDR_term(); - addrspace::release(); state = Terminated; } + addrspace::release(); } void Emulator::stop() @@ -722,9 +780,12 @@ void Emulator::stop() // Avoid race condition with GGPO restarting the sh4 for a new frame if (config::GGPOEnable) NetworkHandshake::term(); - // must be updated after GGPO is stopped since it may run some rollback frames - state = Loaded; - sh4_cpu.Stop(); + { + const std::lock_guard _(mutex); + // must be updated after GGPO is stopped since it may run some rollback frames + state = Loaded; + getSh4Executor()->Stop(); + } if (config::ThreadedRendering) { rend_cancel_emu_wait(); @@ -757,7 +818,7 @@ void Emulator::requestReset() resetRequested = true; if (config::GGPOEnable) NetworkHandshake::term(); - sh4_cpu.Stop(); + getSh4Executor()->Stop(); } void loadGameSpecificSettings() @@ -779,8 +840,13 @@ void loadGameSpecificSettings() // Reload per-game settings config::Settings::instance().load(true); - if (config::ForceWindowsCE) - config::ExtraDepthScale.override(WINCE_DEPTH_SCALE); + if (config::GGPOEnable || settings.raHardcoreMode) + config::Sh4Clock.override(200); + if (settings.raHardcoreMode) + { + config::WidescreenGameHacks.override(false); + config::DynarecEnabled.override(true); + } } void Emulator::step() @@ -799,7 +865,7 @@ void Emulator::stepRange(u32 from, u32 to) stop(); } -void dc_loadstate(Deserializer& deser) +void Emulator::loadstate(Deserializer& deser) { custom_texture.Terminate(); #if FEAT_AREC == DYNAREC_JIT @@ -815,50 +881,46 @@ void dc_loadstate(Deserializer& deser) dc_deserialize(deser); mmu_set_state(); - sh4_cpu.ResetCache(); - KillTex = true; + getSh4Executor()->ResetCache(); + EventManager::event(Event::LoadState); } void Emulator::setNetworkState(bool online) { if (settings.network.online != online) + { + settings.network.online = online; DEBUG_LOG(NETWORK, "Network state %d", online); - settings.network.online = online; + if (online && settings.platform.isConsole() + && config::Sh4Clock != 200) + { + config::Sh4Clock.override(200); + getSh4Executor()->ResetCache(); + } + EventManager::event(Event::Network); + } settings.input.fastForwardMode &= !online; } -EventManager EventManager::Instance; - void EventManager::registerEvent(Event event, Callback callback, void *param) { unregisterEvent(event, callback, param); - auto it = callbacks.find(event); - if (it != callbacks.end()) - it->second.push_back(std::make_pair(callback, param)); - else - callbacks.insert({ event, { std::make_pair(callback, param) } }); + auto& vector = callbacks[static_cast(event)]; + vector.push_back(std::make_pair(callback, param)); } void EventManager::unregisterEvent(Event event, Callback callback, void *param) { - auto it = callbacks.find(event); - if (it == callbacks.end()) - return; - - auto it2 = std::find(it->second.begin(), it->second.end(), std::make_pair(callback, param)); - if (it2 == it->second.end()) - return; - - it->second.erase(it2); + auto& vector = callbacks[static_cast(event)]; + auto it = std::find(vector.begin(), vector.end(), std::make_pair(callback, param)); + if (it != vector.end()) + vector.erase(it); } void EventManager::broadcastEvent(Event event) { - auto it = callbacks.find(event); - if (it == callbacks.end()) - return; - - for (auto& pair : it->second) + auto& vector = callbacks[static_cast(event)]; + for (auto& pair : vector) pair.first(event, pair.second); } @@ -867,6 +929,8 @@ void Emulator::run() verify(state == Running); startTime = sh4_sched_now64(); renderTimeout = false; + if (!singleStep && stepRangeTo == 0) + getSh4Executor()->Start(); try { runInternal(); if (ggpo::active()) @@ -874,7 +938,7 @@ void Emulator::run() } catch (...) { setNetworkState(false); state = Error; - sh4_cpu.Stop(); + getSh4Executor()->Stop(); EventManager::event(Event::Pause); throw; } @@ -890,25 +954,16 @@ void Emulator::start() if (config::GGPOEnable && config::ThreadedRendering) // Not supported with GGPO config::EmulateFramebuffer.override(false); -#if FEAT_SHREC != DYNAREC_NONE - if (config::DynarecEnabled) - { - Get_Sh4Recompiler(&sh4_cpu); - INFO_LOG(DYNAREC, "Using Recompiler"); - } - else -#endif - { - Get_Sh4Interpreter(&sh4_cpu); - INFO_LOG(DYNAREC, "Using Interpreter"); - } + setupPtyPipe(); memwatch::protect(); if (config::ThreadedRendering) { const std::lock_guard lock(mutex); + getSh4Executor()->Start(); threadResult = std::async(std::launch::async, [this] { + ThreadName _("Flycast-emu"); InitAudio(); try { @@ -923,7 +978,7 @@ void Emulator::start() TermAudio(); } catch (...) { setNetworkState(false); - sh4_cpu.Stop(); + getSh4Executor()->Stop(); TermAudio(); throw; } @@ -941,16 +996,20 @@ void Emulator::start() bool Emulator::checkStatus(bool wait) { try { - const std::lock_guard lock(mutex); + std::unique_lock lock(mutex); if (threadResult.valid()) { - if (!wait) - { - auto result = threadResult.wait_for(std::chrono::seconds(0)); + auto localResult = threadResult; + lock.unlock(); + if (wait) { + localResult.wait(); + } + else { + auto result = localResult.wait_for(std::chrono::seconds(0)); if (result == std::future_status::timeout) return true; } - threadResult.get(); + localResult.get(); } return false; } catch (...) { @@ -966,16 +1025,17 @@ bool Emulator::render() if (!config::ThreadedRendering) { - if (state != Running) - return false; - run(); if (stopRequested) { stopRequested = false; TermAudio(); nvmem::saveFiles(); EventManager::event(Event::Pause); + return false; } + if (state != Running) + return false; + run(); // TODO if stopping due to a user request, no frame has been rendered return !renderTimeout; } @@ -996,7 +1056,55 @@ void Emulator::vblank() if (ggpo::active()) ggpo::endOfFrame(); else if (!config::ThreadedRendering) - sh4_cpu.Stop(); + getSh4Executor()->Stop(); +} + +bool Emulator::restartCpu() +{ + const std::lock_guard _(mutex); + if (state != Running) + return false; + getSh4Executor()->Start(); + return true; +} + +void Emulator::insertGdrom(const std::string& path) +{ + if (settings.platform.isArcade()) + return; + gdr::insertDisk(path); + diskChange(); +} + +void Emulator::openGdrom() +{ + if (settings.platform.isArcade()) + return; + gdr::openLid(); + diskChange(); +} + +void Emulator::diskChange() +{ + config::Settings::instance().reset(); + config::Settings::instance().load(false); + if (!settings.content.path.empty()) + { + hostfs::FileInfo info = hostfs::storage().getFileInfo(settings.content.path); + settings.content.fileName = info.name; + loadGameSpecificSettings(); + } + else + { + settings.content.fileName.clear(); + settings.content.gameId.clear(); + settings.content.title = BIOS_TITLE; + } + cheatManager.reset(settings.content.gameId); + if (cheatManager.isWidescreen()) + config::ScreenStretching.override(134); // 4:3 -> 16:9 + custom_texture.Terminate(); + EventManager::event(Event::DiskChange); } Emulator emu; diff --git a/core/emulator.h b/core/emulator.h index 09800e2a0..4afd195a0 100644 --- a/core/emulator.h +++ b/core/emulator.h @@ -23,21 +23,22 @@ #include #include -#include +#include #include #include #include +#include void loadGameSpecificSettings(); void SaveSettings(); int flycast_init(int argc, char* argv[]); -void dc_reset(bool hard); // for tests only void flycast_term(); void dc_exit(); -void dc_savestate(int index = 0); +void dc_savestate(int index = 0, const u8 *pngData = nullptr, u32 pngSize = 0); void dc_loadstate(int index = 0); -void dc_loadstate(Deserializer& deser); +time_t dc_getStateCreationDate(int index); +void dc_getStateScreenshot(int index, std::vector& pngData); enum class Event { Start, @@ -46,6 +47,9 @@ enum class Event { Terminate, LoadState, VBlank, + Network, + DiskChange, + max = DiskChange }; class EventManager @@ -54,26 +58,29 @@ class EventManager using Callback = void (*)(Event, void *); static void listen(Event event, Callback callback, void *param = nullptr) { - Instance.registerEvent(event, callback, param); + instance().registerEvent(event, callback, param); } static void unlisten(Event event, Callback callback, void *param = nullptr) { - Instance.unregisterEvent(event, callback, param); + instance().unregisterEvent(event, callback, param); } static void event(Event event) { - Instance.broadcastEvent(event); + instance().broadcastEvent(event); } private: EventManager() = default; + static EventManager& instance() { + static EventManager _instance; + return _instance; + } void registerEvent(Event event, Callback callback, void *param); void unregisterEvent(Event event, Callback callback, void *param); void broadcastEvent(Event event); - static EventManager Instance; - std::map>> callbacks; + std::array>, static_cast(Event::max) + 1> callbacks; }; struct LoadProgress @@ -89,6 +96,8 @@ struct LoadProgress std::atomic progress; }; +class Sh4Executor; + class Emulator { public: @@ -156,10 +165,32 @@ class Emulator * Called internally on vblank. */ void vblank(); + /** + * Restart the cpu iff the emu is still running + * Returns true if the cpu was started + */ + bool restartCpu(); + /* + * Load the machine state from the passed deserializer + */ + void loadstate(Deserializer& deser); + /** + * Insert a new media in the GD-ROM drive. + */ + void insertGdrom(const std::string& path); + /** + * Open the GD-ROM drive lid. + */ + void openGdrom(); + + Sh4Executor *getSh4Executor(); + + void dc_reset(bool hard); // for tests only private: bool checkStatus(bool wait = false); void runInternal(); + void diskChange(); enum State { Uninitialized = 0, @@ -170,7 +201,7 @@ class Emulator Terminated, }; State state = Uninitialized; - std::future threadResult; + std::shared_future threadResult; bool resetRequested = false; bool singleStep = false; u64 startTime = 0; @@ -179,6 +210,8 @@ class Emulator u32 stepRangeTo = 0; bool stopRequested = false; std::mutex mutex; + Sh4Executor *interpreter = nullptr; + Sh4Executor *recompiler = nullptr; }; extern Emulator emu; diff --git a/core/hw/aica/aica.cpp b/core/hw/aica/aica.cpp index 259cccd3b..18b440f3b 100644 --- a/core/hw/aica/aica.cpp +++ b/core/hw/aica/aica.cpp @@ -13,14 +13,6 @@ namespace aica #define SH4_IRQ_BIT (1 << (holly_SPU_IRQ & 31)) -CommonData_struct* CommonData; -DSPData_struct* DSPData; -InterruptInfo* MCIEB; -InterruptInfo* MCIPD; -InterruptInfo* MCIRE; -InterruptInfo* SCIEB; -InterruptInfo* SCIPD; -InterruptInfo* SCIRE; std::deque midiSendBuffer; //Interrupts @@ -76,27 +68,25 @@ static bool UpdateSh4Ints() if (p_ints) { if ((SB_ISTEXT & SH4_IRQ_BIT) == 0) - { // if no interrupt is already pending then raise one asic_RaiseInterrupt(holly_SPU_IRQ); - return true; - } + return true; } else { if ((SB_ISTEXT & SH4_IRQ_BIT) != 0) asic_CancelInterrupt(holly_SPU_IRQ); + return false; } - return false; } AicaTimer timers[3]; int aica_schid = -1; -const int AICA_TICK = 145125; // 44.1 KHz / 32 +constexpr int AICA_TICK = 4535; // 44.1 KHz -static int AicaUpdate(int tag, int c, int j) +static int AicaUpdate(int tag, int cycles, int jitter, void *arg) { - arm::run(32); + arm::run(1); return AICA_TICK; } @@ -105,8 +95,8 @@ static int AicaUpdate(int tag, int c, int j) void timeStep() { - for (std::size_t i = 0; i < std::size(timers); i++) - timers[i].StepTimer(1); + for (auto& timer : timers) + timer.StepTimer(1); SCIPD->SAMPLE_DONE = 1; MCIPD->SAMPLE_DONE = 1; @@ -260,21 +250,6 @@ void init() initMem(); initRtc(); - static_assert(sizeof(*CommonData) == 0x508, "Invalid CommonData size"); - static_assert(sizeof(*DSPData) == 0x15C8, "Invalid DSPData size"); - - CommonData=(CommonData_struct*)&aica_reg[0x2800]; - DSPData=(DSPData_struct*)&aica_reg[0x3000]; - //slave cpu (arm7) - - SCIEB=(InterruptInfo*)&aica_reg[0x289C]; - SCIPD=(InterruptInfo*)&aica_reg[0x289C+4]; - SCIRE=(InterruptInfo*)&aica_reg[0x289C+8]; - //Main cpu (sh4) - MCIEB=(InterruptInfo*)&aica_reg[0x28B4]; - MCIPD=(InterruptInfo*)&aica_reg[0x28B4+4]; - MCIRE=(InterruptInfo*)&aica_reg[0x28B4+8]; - sgc::init(); if (aica_schid == -1) aica_schid = sh4_sched_register(0, &AicaUpdate); diff --git a/core/hw/aica/aica.h b/core/hw/aica/aica.h index 2ec85b598..2babe5a92 100644 --- a/core/hw/aica/aica.h +++ b/core/hw/aica/aica.h @@ -30,13 +30,13 @@ struct CommonData_struct u32 VER:4; u32 DAC18B:1; u32 MEM8MB:1; - u32 pad0_0:5; + u32 :5; u32 Mono:1; u32 :16; //+4 u32 RBP:12; - u32 pad1_0:1; + u32 :1; u32 RBL:2; u32 TESTB0:1; @@ -48,14 +48,14 @@ struct CommonData_struct u32 MIOVF :1; u32 MOEMP :1; u32 MOFUL :1; - u32 pad3_0:3; + u32 :3; u32 :16; //+C u32 MOBUF:8; u32 MSLC:6; u32 AFSEL:1; - u32 padC_0:1; + u32 :1; u32 :16; //+10 @@ -76,24 +76,24 @@ struct CommonData_struct u32 MRWINH:4; u32 $T:1; u32 $TSCD:3; - u32 pad80_0:1; + u32 :1; u32 DMEA_hi:7; u32 :16; //+84 - u32 pad84_0:2; + u32 :2; u32 DMEA_lo:14; u32 :16; //+88 - u32 pad88_0:2; + u32 :2; u32 DRGA:13; u32 DGATE:1; u32 :16; //+8C u32 DEXE:1; - u32 pad8C_0:1; + u32 :1; u32 DLG:13; u32 DDIR:1; @@ -101,73 +101,73 @@ struct CommonData_struct //+90 u32 TIMA:8; u32 TACTL:3; - u32 pad90_0:5; + u32 :5; u32 :16; //+94 u32 TIMB:8; u32 TBCTL:3; - u32 pad94_0:5; + u32 :5; u32 :16; //+98 u32 TIMC:8; u32 TCCTL:3; - u32 pad98_0:5; + u32 :5; u32 :16; //+9C u32 SCIEB:11; - u32 pad9C_0:5; + u32 :5; u32 :16; //+A0 u32 SCIPD:11; - u32 padA0_0:5; + u32 :5; u32 :16; //+A4 u32 SCIRE:11; - u32 padA4_0:5; + u32 :5; u32 :16; //+A8 u32 SCILV0:8; - u32 padA8_0:8; + u32 :8; u32 :16; //+AC u32 SCILV1:8; - u32 padAC_0:8; + u32 :8; u32 :16; //+B0 u32 SCILV2:8; - u32 padB0_0:8; + u32 :8; u32 :16; //+B4 u32 MCIEB:11; - u32 padB4_0:5; + u32 :5; u32 :16; //+B8 u32 MCIPD:11; - u32 padB8_0:5; + u32 :5; u32 :16; //+BC u32 MCIRE:11; - u32 padBC_0:5; + u32 :5; u32 :16; @@ -176,9 +176,9 @@ struct CommonData_struct //+400 , hopefully :p u32 AR:1; - u32 pad400_0:7; + u32 :7; u32 VREG:2; - u32 pad400_1:6; + u32 :6; u32 :16; @@ -195,7 +195,7 @@ struct CommonData_struct u32 L6_r:1; u32 L7_r:1; - u32 pad500_0:8; + u32 :8; u32 :16; @@ -211,10 +211,11 @@ struct CommonData_struct u32 M7_r:1; u32 RP:1; - u32 pad504_0:7; + u32 :7; u32 :16; }; +static_assert(sizeof(CommonData_struct) == 0x508, "Wrong CommonData size"); struct DSPData_struct { @@ -272,9 +273,9 @@ union InterruptInfo //Bit 0 (R): Requests interrupt to external interrupt input pin "INTON". (SCSI) u32 INTON:1; //Bit 1 (R): Reserved. - u32 res_1:1; + u32 :1; //Bit 2 (R): Reserved. - u32 res_3:1; + u32 :1; //Bit 3 (R): MIDI input interrupt. //(Interrupt request generated when input FIFO has fetched valid data. Hence, if the CPU reads FIFO data, it must read the lot once and leave the FIFO empty. When the FIFO has changed to empty status, the interrupt request is canceled automatically.) u32 MIDI_IN:1; @@ -297,16 +298,31 @@ union InterruptInfo }; u32 full; }; -extern InterruptInfo* MCIEB; -extern InterruptInfo* MCIPD; -extern InterruptInfo* MCIRE; -extern InterruptInfo* SCIEB; -extern InterruptInfo* SCIPD; -extern InterruptInfo* SCIRE; + +struct DSP_OUT_VOL_REG +{ + //-- EFSDL[3:0] -- EFPAN[4:0] + + u32 EFPAN:5; + u32 :3; + + u32 EFSDL:4; + u32 :4; + + u32 :16; +}; + +extern InterruptInfo * const MCIEB; +extern InterruptInfo * const MCIPD; +extern InterruptInfo * const MCIRE; +extern InterruptInfo * const SCIEB; +extern InterruptInfo * const SCIPD; +extern InterruptInfo * const SCIRE; extern std::deque midiSendBuffer; -extern CommonData_struct* CommonData; -extern DSPData_struct* DSPData; +extern CommonData_struct * const CommonData; +extern DSPData_struct * const DSPData; +extern const DSP_OUT_VOL_REG * const dsp_out_vol; template void writeTimerAndIntReg(u32 reg, T data); @@ -321,8 +337,7 @@ class AicaTimer { u32 count:8; u32 md:3; - u32 nil:5; - u32 pad:16; + u32 :21; }; u32 data; }; diff --git a/core/hw/aica/aica_if.cpp b/core/hw/aica/aica_if.cpp index acdda9c30..92bfa83f5 100644 --- a/core/hw/aica/aica_if.cpp +++ b/core/hw/aica/aica_if.cpp @@ -17,7 +17,6 @@ #include "serialize.h" #include "hw/arm7/arm_mem.h" -#include "hw/arm7/arm7.h" #include "dsp.h" #include "sgc_if.h" #include "aica.h" @@ -182,7 +181,7 @@ template void writeAicaReg<>(u32 addr, u8 data); template void writeAicaReg<>(u32 addr, u16 data); template void writeAicaReg<>(u32 addr, u32 data); -static int DreamcastSecond(int tag, int c, int j) +static int DreamcastSecond(int tag, int cycles, int jitter, void *arg) { RealTimeClock++; @@ -220,7 +219,7 @@ void termRtc() rtc_schid = -1; } -static int dma_end_sched(int tag, int cycl, int jitt) +static int dma_end_sched(int tag, int cycles, int jitter, void *arg) { u32 len = SB_ADLEN & 0x7FFFFFFF; @@ -405,7 +404,7 @@ static void Write_SB_ADST(u32 addr, u32 data) // Schedule the end of DMA transfer interrupt int cycles = len * (SH4_MAIN_CLOCK / 2 / G2_BUS_CLOCK); // 16 bits @ 25 MHz if (cycles <= 512) - dma_end_sched(0, 0, 0); + dma_end_sched(0, 0, 0, nullptr); else sh4_sched_request(dma_sched_id, cycles); } @@ -529,10 +528,10 @@ void serialize(Serializer& ser) dsp::state.serialize(ser); - for (int i = 0 ; i < 3 ; i++) + for (const auto& timer : timers) { - ser << timers[i].c_step; - ser << timers[i].m_step; + ser << timer.c_step; + ser << timer.m_step; } if (!ser.rollback()) @@ -577,13 +576,12 @@ void deserialize(Deserializer& deser) { aica_ram.deserialize(deser); if (settings.platform.isAtomiswave()) - deser.skip(6 * 1024 * 1024, Deserializer::V30); + deser.skip(6_MB, Deserializer::V30); } deser >> VREG; deser >> ARMRST; deser >> rtc_EN; - if (deser.version() >= Deserializer::V9) - deser >> RealTimeClock; + deser >> RealTimeClock; deser >> aica_reg; diff --git a/core/hw/aica/aica_mem.cpp b/core/hw/aica/aica_mem.cpp index 907ef7b64..0f25ab91c 100644 --- a/core/hw/aica/aica_mem.cpp +++ b/core/hw/aica/aica_mem.cpp @@ -10,6 +10,18 @@ namespace aica alignas(4) u8 aica_reg[0x8000]; +CommonData_struct * const CommonData = (CommonData_struct *)&aica_reg[0x2800]; +DSPData_struct * const DSPData = (DSPData_struct *)&aica_reg[0x3000]; +//slave cpu (arm7) +InterruptInfo * const SCIEB = (InterruptInfo *)&aica_reg[SCIEB_addr]; +InterruptInfo * const SCIPD = (InterruptInfo *)&aica_reg[SCIPD_addr]; +InterruptInfo * const SCIRE = (InterruptInfo *)&aica_reg[SCIRE_addr]; +//Main cpu (sh4) +InterruptInfo * const MCIEB = (InterruptInfo *)&aica_reg[MCIEB_addr]; +InterruptInfo * const MCIPD = (InterruptInfo *)&aica_reg[MCIPD_addr]; +InterruptInfo * const MCIRE = (InterruptInfo *)&aica_reg[MCIRE_addr]; +DSP_OUT_VOL_REG const * const dsp_out_vol = (DSP_OUT_VOL_REG *)&aica_reg[0x2000]; + static void (*midiReceiver)(u8 data); //Aica read/write (both sh4 & arm) diff --git a/core/hw/aica/dsp.cpp b/core/hw/aica/dsp.cpp index 66e7bc298..7cbbfc393 100644 --- a/core/hw/aica/dsp.cpp +++ b/core/hw/aica/dsp.cpp @@ -16,10 +16,7 @@ Initial code by skmp, now part of the reicast project. See LICENSE & COPYRIGHT files further details */ -namespace aica -{ - -namespace dsp +namespace aica::dsp { DSPState state; @@ -152,5 +149,4 @@ void step() runStep(); } -} // namespace dsp -} // namespace aica +} // namespace aica::dsp diff --git a/core/hw/aica/dsp.h b/core/hw/aica/dsp.h index a37a48523..0cc869aaf 100644 --- a/core/hw/aica/dsp.h +++ b/core/hw/aica/dsp.h @@ -2,10 +2,7 @@ #include "types.h" #include "serialize.h" -namespace aica -{ - -namespace dsp +namespace aica::dsp { struct DSPState @@ -54,6 +51,8 @@ struct DSPState deser >> MDEC_CT; deser.skip(33596 - 4096 * 8 - sizeof(TEMP) - sizeof(MEMS) - sizeof(MIXS) - 4 * 3 - 44, Deserializer::V18); // other dsp stuff + if (!deser.rollback()) + dirty = true; } }; @@ -104,5 +103,4 @@ void DecodeInst(const u32 *IPtr, Instruction *i); u16 DYNACALL PACK(s32 val); s32 DYNACALL UNPACK(u16 val); -} // namespace dsp -} // namespace aica +} // namespace aica::dsp diff --git a/core/hw/aica/dsp_arm32.cpp b/core/hw/aica/dsp_arm32.cpp index 05e782fbd..1597aa9a5 100644 --- a/core/hw/aica/dsp_arm32.cpp +++ b/core/hw/aica/dsp_arm32.cpp @@ -24,9 +24,22 @@ #include "aica.h" #include "aica_if.h" #include "oslib/virtmem.h" + +#ifdef _M_ARM +#pragma push_macro("MemoryBarrier") +#pragma push_macro("Yield") +#undef MemoryBarrier +#undef Yield +#endif + #include using namespace vixl::aarch32; +#ifdef _M_ARM +#pragma pop_macro("MemoryBarrier") +#pragma pop_macro("Yield") +#endif + namespace aica { @@ -37,6 +50,8 @@ constexpr size_t CodeSize = 4096 * 8; //32 kb, 8 pages #if defined(__unix__) alignas(4096) static u8 DynCode[CodeSize] __attribute__((section(".text"))); +#elif defined(_M_ARM) +static u8 *DynCode; #else #error "Unsupported platform for arm32 DSP dynarec" #endif @@ -383,9 +398,9 @@ class DSPAssembler : public MacroAssembler // RBP is constant for this program Add(ADDR, ADDR, DSP->RBP); // ADDR & ARAM_MASK - if (ARAM_SIZE == 2*1024*1024) + if (ARAM_SIZE == 2_MB) Bfc(ADDR, 21, 11); - else if (ARAM_SIZE == 8*1024*1024) + else if (ARAM_SIZE == 8_MB) Bfc(ADDR, 23, 9); else die("Unsupported ARAM_SIZE"); diff --git a/core/hw/aica/dsp_arm64.cpp b/core/hw/aica/dsp_arm64.cpp index 2d42f9b68..13cdc351e 100644 --- a/core/hw/aica/dsp_arm64.cpp +++ b/core/hw/aica/dsp_arm64.cpp @@ -36,7 +36,9 @@ namespace dsp constexpr size_t CodeSize = 4096 * 8; //32 kb, 8 pages -#if defined(__unix__) || defined(__SWITCH__) +#if defined(_M_ARM64) +static u8 *DynCode; +#elif defined(__unix__) || defined(__SWITCH__) alignas(4096) static u8 DynCode[CodeSize] __attribute__((section(".text"))); #elif defined(__APPLE__) #if defined(TARGET_IPHONE) || defined(TARGET_ARM_MAC) @@ -244,8 +246,8 @@ class DSPAssembler : public MacroAssembler // ACCUM //ACC = (((s64)X * (s64)Y) >> 12) + B; - const Register& X64 = Register::GetXRegFromCode(X_alias->GetCode()); - const Register& Y64 = Register::GetXRegFromCode(Y.GetCode()); + const Register& X64 = XRegister(X_alias->GetCode()); + const Register& Y64 = XRegister(Y.GetCode()); Sxtw(X64, *X_alias); Sxtw(Y64, Y); Mul(x0, X64, Y64); @@ -284,7 +286,7 @@ class DSPAssembler : public MacroAssembler //MEMVAL[(step + 2) & 3] = UNPACK(*(u16 *)&aica_ram[ADDR & ARAM_MASK]); CalculateADDR(ADDR, op, ADRS_REG, MDEC_CT); Ldr(x1, GetAicaRam()); - MemOperand aram_op(x1, Register::GetXRegFromCode(ADDR.GetCode())); + MemOperand aram_op(x1, XRegister(ADDR.GetCode())); Ldrh(w0, aram_op); GenCallRuntime(UNPACK); Mov(w2, w0); @@ -299,7 +301,7 @@ class DSPAssembler : public MacroAssembler CalculateADDR(ADDR, op, ADRS_REG, MDEC_CT); Ldr(x1, GetAicaRam()); - MemOperand aram_op(x1, Register::GetXRegFromCode(ADDR.GetCode())); + MemOperand aram_op(x1, XRegister(ADDR.GetCode())); Strh(w2, aram_op); } } @@ -424,9 +426,9 @@ class DSPAssembler : public MacroAssembler // RBP is constant for this program Add(ADDR, ADDR, DSP->RBP); // ADDR & ARAM_MASK - if (ARAM_SIZE == 2*1024*1024) + if (ARAM_SIZE == 2_MB) Bfc(ADDR, 21, 11); - else if (ARAM_SIZE == 8*1024*1024) + else if (ARAM_SIZE == 8_MB) Bfc(ADDR, 23, 9); else die("Unsupported ARAM_SIZE"); diff --git a/core/hw/aica/dsp_x64.cpp b/core/hw/aica/dsp_x64.cpp index ca397210e..b65d7ddf1 100644 --- a/core/hw/aica/dsp_x64.cpp +++ b/core/hw/aica/dsp_x64.cpp @@ -27,13 +27,10 @@ #include "aica_if.h" #include "oslib/virtmem.h" -namespace aica +namespace aica::dsp { -namespace dsp -{ - -constexpr size_t CodeBufferSize = 32 * 1024; +constexpr size_t CodeBufferSize = 32_KB; #if defined(_WIN32) static u8 *CodeBuffer; #else @@ -450,6 +447,5 @@ void runStep() ((void (*)())&pCodeBuffer[0])(); } -} // namespace dsp -} // namespace aica +} // namespace aica::dsp #endif diff --git a/core/hw/aica/dsp_x86.cpp b/core/hw/aica/dsp_x86.cpp index 4fd46140e..b0f1e4062 100644 --- a/core/hw/aica/dsp_x86.cpp +++ b/core/hw/aica/dsp_x86.cpp @@ -33,7 +33,7 @@ namespace aica namespace dsp { -alignas(4096) static u8 CodeBuffer[32 * 1024] +alignas(4096) static u8 CodeBuffer[32_KB] #if defined(_WIN32) ; #elif defined(__unix__) diff --git a/core/hw/aica/sgc_if.cpp b/core/hw/aica/sgc_if.cpp index 3e4d03882..1a609e008 100755 --- a/core/hw/aica/sgc_if.cpp +++ b/core/hw/aica/sgc_if.cpp @@ -15,7 +15,7 @@ along with reicast. If not, see . Some PLFO and FEG code from Highly_Theoretical lib by Neill Corlett - (https://github.com/kode54/Highly_Theoretical) + (https://gitlab.com/kode54/highly_theoretical) */ #include "sgc_if.h" @@ -23,7 +23,7 @@ #include "aica_if.h" #include "aica_mem.h" #include "dsp.h" -#include "oslib/audiostream.h" +#include "audio/audiostream.h" #include "hw/gdrom/gdrom_if.h" #include "cfg/option.h" #include "serialize.h" @@ -45,10 +45,7 @@ #define clip_verify(x) #endif -namespace aica -{ - -namespace sgc +namespace aica::sgc { //Sound generation, mixin, and channel regs emulation //x.15 @@ -77,19 +74,7 @@ static const double AEG_DSR_Time[64] = 920.0,790.0,690.0,550.0,460.0,390.0,340.0,270.0,230.0,200.0,170.0,140.0,110.0,98.0,85.0,68.0,57.0,49.0,43.0,34.0, 28.0,25.0,22.0,18.0,14.0,12.0,11.0,8.5,7.1,6.1,5.4,4.3,3.6,3.1 }; -// These times come from the documentation but don't sound correct. -// HT uses the AEG decay times instead and it sounds better. -//static const double FEG_Time[] = -//{ -// -1, -1, 472800.0, 405200.0, 354400.0, 283600.0, 236400.0, 202800.0, -// 177200.0, 142000.0, 118400.0, 101200.0, 88800.0, 70800.0, 59200.0, 50800.0, -// 44400.0, 35600.0, 29600.0, 25200.0, 22000.0, 17600.0, 14800.0, 12800.0, -// 11200.0, 8800.0, 7200.0, 6400.0, 5600.0, 4400.0, 3680.0, 3160.0, -// 2760.0, 2220.0, 1840.0, 1560.0, 1360.0, 1080.0, 920.0, 800.0, -// 680.0, 560.0, 440.0, 392.0, 340.0, 272.0, 228.0, 196.0, -// 172.0, 158.0, 136.0, 100.0, 88.0, 72.0, 56.0, 48.0, -// 44.0, 34.0, 28.0, 24.0, 22.0, 17.0, 14.0, 12.0 -//}; + static const float PLFOS_Scale[8] = { 0.f, 3.61f, 7.22f, 14.44f, 28.88f, 57.75f, 115.5f, 231.f }; static int PLFO_Scales[8][256]; @@ -159,11 +144,95 @@ static void VolumePan(SampleType value, u32 vol, u32 pan, SampleType& outl, Samp } } -const DSP_OUT_VOL_REG *dsp_out_vol = (DSP_OUT_VOL_REG *)&aica_reg[0x2000]; -static int beepOn; -static int beepPeriod; -static int beepCounter; -static SampleType beepValue; +class VmuBeep +{ +public: + void init() + { + active = false; + att = 256; + waveIdx.full = 0; + waveStep = 0; + } + + void update(int period, int on) + { + if (on == 0 || period == 0 || on >= period) { + active = false; + } + else + { + // on (duty cycle) is ignored + active = true; + // 6 MHz clock + int freq = 6000000 / 6 / period; + waveStep = freq * 1024 / 2698; + } + } + + SampleType getSample() + { + if (!active && att >= 256) + return 0; + + waveIdx.full += waveStep; + waveIdx.ip %= std::size(wave); + int nextIdx = (waveIdx.ip + 1) % std::size(wave); + SampleType s = (FPMul(wave[waveIdx.ip], (int)(1024 - waveIdx.fp), 10) + FPMul(wave[nextIdx], (int)waveIdx.fp, 10)) * 2; + + s = FPMul(s, tl_lut[att], 15); + if (active) + att = std::max(att - 2, 0); + else + att = std::min(att + 2, 256); + return s; + } + + void serialize(Serializer& ser) + { + ser << active; + ser << att; + ser << waveIdx; + ser << waveStep; + } + + void deserialize(Deserializer& deser) + { + if (deser.version() < Deserializer::V49) + { + if (deser.version() >= Deserializer::V22) + { + deser.skip(); // beepOn + deser.skip(); // beepPeriod + deser.skip(); // beepCounter + } + init(); + } + else + { + deser >> active; + deser >> att; + deser >> waveIdx; + deser >> waveStep; + } + } + +private: + bool active = false; + int att = 256; + fp_22_10 waveIdx {}; + int waveStep = 0; + + // 2698 Hz + static constexpr SampleType wave[] = { 503, -3519, + -7540, -8214, -8209, -8214, -8209, -5199, -1172, 2843, + 6873, 8207, 8214, 8209, 8212, 5866, 1840, -2175, + -6203, -8210, -8215, -8209, -8214, -6533, -2516, 1507, + 5526, 8212, 8210, 8212, 8210, 7206, 3187, -841, + -4856, -8215, -8209, -8214, -8208, -7882, -3850, 162, + 4187, 8213, 8208, 8213, 8209, 8211, 4525 }; +}; +static VmuBeep beep; #pragma pack(push, 1) //All regs are 16b , aligned to 32b (upper bits 0?) @@ -175,52 +244,52 @@ struct ChannelCommonData u32 PCMS:2; u32 LPCTL:1; u32 SSCTL:1; - u32 res_1:3; + u32 :3; u32 KYONB:1; u32 KYONEX:1; - u32 pad_2:16; + u32 :16; //+04 [1] //SA (defined above) u32 SA_low:16; - u32 pad_3:16; + u32 :16; //+08 [2] u32 LSA:16; - u32 pad_4:16; + u32 :16; //+0C [3] u32 LEA:16; - u32 pad_5:16; + u32 :16; //+10 [4] u32 AR:5; - u32 res_2:1; + u32 :1; u32 D1R:5; u32 D2R:5; - u32 pad_7:16; + u32 :16; //+14 [5] u32 RR:5; u32 DL:5; u32 KRS:4; u32 LPSLNK:1; - u32 res_3:1; + u32 :1; - u32 pad_8:16; + u32 :16; //+18[6] u32 FNS:10; - u32 rez_8_1:1; + u32 :1; u32 OCT:4; - u32 rez_8_2:1; + u32 :1; - u32 pad_9:16; + u32 :16; //+1C RE LFOF[4:0] PLFOWS PLFOS[2:0] ALFOWS ALFOS[2:0] u32 ALFOS:3; @@ -232,80 +301,80 @@ struct ChannelCommonData u32 LFOF:5; u32 LFORE:1; - u32 pad_10:16; + u32 :16; //+20 -- IMXL[3:0] ISEL[3:0] u32 ISEL:4; u32 IMXL:4; - u32 rez_20_0:8; + u32 :8; - u32 pad_11:16; + u32 :16; //+24 -- DISDL[3:0] -- DIPAN[4:0] u32 DIPAN:5; - u32 rez_24_0:3; + u32 :3; u32 DISDL:4; - u32 rez_24_1:4; + u32 :4; - u32 pad_12:16; + u32 :16; //+28 TL[7:0] -- Q[4:0] u32 Q:5; u32 LPOFF:1; // confirmed but not documented: 0: LPF enabled, 1: LPF disabled u32 VOFF:1; // unconfirmed: 0: attenuation enabled, 1: attenuation disabled (TL, AEG, ALFO) - u32 rez_28_0:1; + u32 :1; u32 TL:8; - u32 pad_13:16; + u32 :16; //+2C -- FLV0[12:0] u32 FLV0:13; - u32 rez_2C_0:3; + u32 :3; - u32 pad_14:16; + u32 :16; //+30 -- FLV1[12:0] u32 FLV1:13; - u32 rez_30_0:3; + u32 :3; - u32 pad_15:16; + u32 :16; //+34 -- FLV2[12:0] u32 FLV2:13; - u32 rez_34_0:3; + u32 :3; - u32 pad_16:16; + u32 :16; //+38 -- FLV3[12:0] u32 FLV3:13; - u32 rez_38_0:3; + u32 :3; - u32 pad_17:16; + u32 :16; //+3C -- FLV4[12:0] u32 FLV4:13; - u32 rez_3C_0:3; + u32 :3; - u32 pad_18:16; + u32 :16; //+40 -- FAR[4:0] -- FD1R[4:0] u32 FD1R:5; - u32 rez_40_0:3; + u32 :3; u32 FAR:5; - u32 rez_40_1:3; + u32 :3; - u32 pad_19:16; + u32 :16; //+44 -- FD2R[4:0] -- FRR[4:0] u32 FRR:5; - u32 rez_44_0:3; + u32 :3; u32 FD2R:5; - u32 rez_44_1:3; + u32 :3; - u32 pad_20:16; + u32 :16; }; #pragma pack(pop) @@ -459,6 +528,7 @@ struct ChannelEx enabled=false; SetAegState(EG_Release); AEG.SetValue(0x3FF); + CA = 0; } void enable() @@ -491,11 +561,16 @@ struct ChannelEx if (FEG.active) { u32 fv = FEG.GetValue(); - s32 f = (((fv & 0xFF) | 0x100) << 4) >> ((fv >> 8) ^ 0x1F); - f = std::max(1, f); - sample = f * sample + (0x2000 - f + FEG.q) * FEG.prev1 - FEG.q * FEG.prev2; - sample >>= 13; - sample = std::clamp(sample, -32768, 32767); + s32 f = (((fv & 0x1FF) | 0x200) << 3) >> ((fv >> 9) ^ 0xF); + if (f == 0) { + sample = 0; + } + else + { + sample = f * sample + (0x2000 - f + FEG.q) * FEG.prev1 - FEG.q * FEG.prev2; + sample >>= 13; + sample = std::clamp(sample, -32768, 32767); + } FEG.prev2 = FEG.prev1; FEG.prev1 = sample; } @@ -537,9 +612,12 @@ struct ChannelEx clip_verify((s64)sample*oDsp>=0); StepAEG(this); - StepFEG(this); - StepStream(this); - lfo.Step(this); + if (enabled) + { + StepFEG(this); + StepStream(this); + lfo.Step(this); + } return true; } } @@ -589,32 +667,32 @@ struct ChannelEx if (AEG.state != EG_Release) return; - //if it was off then turn it on ! enable(); // reset AEG SetAegState(EG_Attack); AEG.SetValue(0x280); // start value taken from HT - //reset FEG + // reset FEG SetFegState(EG_Attack); - //set values and crap + // reset sampling state + CA = 0; + step.full = 0; - //Reset sampling state - CA=0; - step.full=0; - - loop.looped=false; + loop.looped = false; + if (loop.LEA <= loop.LSA && ccd->LPCTL == 1) + // Legacy of Kain + loop.LEA = 0xffff; adpcm.Reset(this); StepStreamInitial(this); - key_printf("[%d] KEY_ON %s @ %f Hz, loop %d - AEG AR %d DC1R %d DC2V %d DC2R %d RR %d - KRS %d OCT %d FNS %d - PFLOS %d PFLOWS %d", + key_printf("[%d] KEY_ON %s @ %f Hz, loop %d - AEG AR %d DC1R %d DC2V %d DC2R %d RR %d - KRS %d OCT %d FNS %d - PFLOS %d PFLOWS %d - SA %x LSA %x LEA %x", ChannelNumber, stream_names[ccd->PCMS], (44100.0 * update_rate) / 1024, ccd->LPCTL, ccd->AR, ccd->D1R, ccd->DL << 5, ccd->D2R, ccd->RR, - ccd->KRS, ccd->OCT, ccd->FNS >> 9, - ccd->PLFOS, ccd->PLFOWS); + ccd->KRS, ccd->OCT, ccd->FNS, + ccd->PLFOS, ccd->PLFOWS, (int)(SA - &aica_ram[0]), ccd->LSA, ccd->LEA); } void KEY_OFF() @@ -648,8 +726,8 @@ struct ChannelEx //LSA,LEA void UpdateLoop() { - loop.LSA=ccd->LSA; - loop.LEA=ccd->LEA; + loop.LSA = ccd->LSA; + loop.LEA = ccd->LEA; } s32 EG_BaseRate() @@ -780,8 +858,8 @@ struct ChannelEx { switch (offset) { - case 0x00: - case 0x01: + case 0x00: // PCMS, SA + case 0x01: // KYONEX, KYONB, SSCTL, LPCTL, PCMS UpdateStreamStep(); if (offset == 0 || size == 2) UpdateSA(); @@ -798,8 +876,8 @@ struct ChannelEx } break; - case 0x04: - case 0x05: + case 0x04: // SA + case 0x05: // SA UpdateSA(); break; @@ -825,6 +903,7 @@ struct ChannelEx case 0x19://FNS,OCT UpdatePitch(); UpdateAEG(); + UpdateFEG(); break; case 0x1C://ALFOS,ALFOWS,PLFOS @@ -870,6 +949,11 @@ struct ChannelEx } } + + static void initAll() { + for (std::size_t i = 0; i < std::size(Chans); i++) + Chans[i].Init(i, aica_reg); + } }; static SampleType DecodeADPCM(u32 sample,s32 prev,s32& quant) @@ -1139,8 +1223,7 @@ void AegStep(ChannelEx* ch) if (ch->AEG.GetValue() >= 0x3FF) { aeg_printf("[%d]AEG_step : EG_Release End @ %x", ch->ChannelNumber, ch->AEG.GetValue()); - ch->AEG.SetValue(0x3FF); // TODO: mnn, should we do anything about it running wild ? - ch->disable(); // TODO: Is this ok here? It's a speed optimisation (since the channel is muted) + ch->disable(); } break; } @@ -1193,6 +1276,34 @@ void FegStep(ChannelEx* ch) } } +static u32 CalcEgSteps(float t) +{ + const double eg_allsteps = 1024 * (1 << EG_STEP_BITS) - 1; + + if (t < 0) + return 0; + if (t == 0) + return (u32)eg_allsteps; + + //44.1*ms = samples + double scnt = 44.1 * t; + double steps = eg_allsteps / scnt; + return (u32)lround(steps); +} +static u32 CalcAttackEgSteps(float t) +{ + if (t < 0) + return 0; + if (t == 0) + return 1 << AEG_ATTACK_SHIFT; + + //44.1*ms = samples + double scnt = 44.1 * t; + double factor = (1.0 / (1.0 - 1.0 / pow(0x280, 1.0 / scnt))) * (1 << AEG_ATTACK_SHIFT); + + return (u32)lround(factor); +} + static void staticinitialise() { STREAM_STEP_LUT[0][0][0]=&StreamStep<0,0,0>; @@ -1244,67 +1355,24 @@ static void staticinitialise() PLFOWS_CALC[(int)LFOType::Square] = &CalcPlfo; PLFOWS_CALC[(int)LFOType::Triangle] = &CalcPlfo; PLFOWS_CALC[(int)LFOType::Random] = &CalcPlfo; -} - -ChannelEx ChannelEx::Chans[64]; - -#define Chans ChannelEx::Chans - -static u32 CalcEgSteps(float t) -{ - const double eg_allsteps = 1024 * (1 << EG_STEP_BITS) - 1; - - if (t < 0) - return 0; - if (t == 0) - return (u32)eg_allsteps; - - //44.1*ms = samples - double scnt = 44.1 * t; - double steps = eg_allsteps / scnt; - return (u32)lround(steps); -} -static u32 CalcAttackEgSteps(float t) -{ - if (t < 0) - return 0; - if (t == 0) - return 1 << AEG_ATTACK_SHIFT; - - //44.1*ms = samples - double scnt = 44.1 * t; - double factor = (1.0 / (1.0 - 1.0 / pow(0x280, 1.0 / scnt))) * (1 << AEG_ATTACK_SHIFT); - - return (u32)lround(factor); -} -void init() -{ - staticinitialise(); - - for (std::size_t i = 0; i < std::size(volume_lut); i++) - { - volume_lut[i]=(s32)((1<<15)/pow(2.0,(15-i)/2.0)); - if (i==0) - volume_lut[i]=0; - } + for (std::size_t i = 1; i < std::size(volume_lut); i++) + volume_lut[i] = (s32)((1 << 15) / pow(2.0, (15 - i) / 2.0)); for (int i = 0; i < 256; i++) - tl_lut[i]=(s32)((1<<15)/pow(2.0,i/16.0)); - + tl_lut[i] = (s32)((1 << 15) / pow(2.0, i / 16.0)); //tl entries 256 to 1023 are 0 - for (int i=256;i<1024;i++) - tl_lut[i]=0; - for (int i=0;i<64;i++) + for (int i = 0; i < 64; i++) { AEG_ATT_SPS[i] = CalcAttackEgSteps(AEG_Attack_Time[i]); - AEG_DSR_SPS[i]=CalcEgSteps(AEG_DSR_Time[i]); - FEG_SPS[i] = CalcEgSteps(AEG_DSR_Time[i]); - //FEG_SPS[i] = CalcEgSteps(FEG_Time[i]); + AEG_DSR_SPS[i] = CalcEgSteps(AEG_DSR_Time[i]); + // The AEG range is 1024, while the FEG range is 8912. + // So decay times are x8 greater for FEG than AEG + // instead of x4 as mentioned in the doc. + // However it sounds better this way. + FEG_SPS[i] = AEG_DSR_SPS[i]; } - for (std::size_t i = 0; i < std::size(Chans); i++) - Chans[i].Init(i,aica_reg); for (int s = 0; s < 8; s++) { @@ -1312,11 +1380,17 @@ void init() for (int i = -128; i < 128; i++) PLFO_Scales[s][i + 128] = (u32)((1 << 10) * powf(2.0f, limit * i / 128.0f / 1200.0f)); } - beepOn = 0; - beepPeriod = 0; - beepCounter = 0; - beepValue = 0; +} +static OnLoad staticInit(staticinitialise); + +ChannelEx ChannelEx::Chans[64]; +#define Chans ChannelEx::Chans + +void init() +{ + ChannelEx::initAll(); + beep.init(); dsp::init(); } @@ -1370,8 +1444,8 @@ void ReadCommonReg(u32 reg,bool byte) CommonData->EG = aeg; //AEG is only 10 bits, FEG is 13 bits CommonData->SGC=Chans[chan].AEG.state; - if (! (byte && reg==0x2810)) - Chans[chan].loop.looped=0; + if (!byte || reg == 0x2811) + Chans[chan].loop.looped = 0; } break; case 0x2814: //CA @@ -1387,42 +1461,7 @@ void ReadCommonReg(u32 reg,bool byte) void vmuBeep(int on, int period) { - if (on == 0 || period == 0 || on < period) - { - beepOn = 0; - beepPeriod = 0; - } - else - { - // The maple doc may be wrong on this. It looks like the raw values of T1LR and T1LC are set. - // So the period is (256 - T1LR) / (32768 / 6) - // and the duty cycle is (256 - T1LC) / (32768 / 6) - beepOn = (256 - on) * 8; - beepPeriod = (256 - period) * 8; - beepCounter = 0; - } -} - -static SampleType vmuBeepSample() -{ - constexpr int Slope = 500; - if (beepPeriod == 0) - { - if (beepValue > 0) - beepValue = std::max(0, beepValue - Slope); - else if (beepValue < 0) - beepValue = std::min(0, beepValue + Slope); - } - else - { - if (beepCounter <= beepOn) - beepValue = std::min(16383, beepValue + Slope); - else - beepValue = std::max(-16384, beepValue - Slope); - beepCounter = (beepCounter + 1) % beepPeriod; - } - - return beepValue; + beep.update(on, period); } constexpr int CDDA_SIZE = 2352 / 2; @@ -1473,18 +1512,14 @@ void AICA_Sample() if (config::VmuSound) { - SampleType beep = vmuBeepSample(); - mixl += beep; - mixr += beep; + SampleType b = beep.getSample(); + mixl += b; + mixr += b; } - //Mono ! + // Mono if (CommonData->Mono) - { - //Yay for mono =P - mixl+=mixr; - mixr=mixl; - } + mixl = mixr = FPs(mixl + mixr, 1); //MVOL ! //we want to make sure mix* is *At least* 23 bits wide here, so 64 bit mul ! @@ -1542,9 +1577,7 @@ void serialize(Serializer& ser) ser << channel.lfo.state; ser << channel.enabled; } - ser << beepOn; - ser << beepPeriod; - ser << beepCounter; + beep.serialize(ser); ser << cdda_sector; ser << cdda_index; ser << (u32)midiSendBuffer.size(); @@ -1594,18 +1627,7 @@ void deserialize(Deserializer& deser) deser >> channel.enabled; channel.quiet = false; } - if (deser.version() >= Deserializer::V22) - { - deser >> beepOn; - deser >> beepPeriod; - deser >> beepCounter; - } - else - { - beepOn = 0; - beepPeriod = 0; - beepCounter = 0; - } + beep.deserialize(deser); deser >> cdda_sector; deser >> cdda_index; midiSendBuffer.clear(); @@ -1622,5 +1644,4 @@ void deserialize(Deserializer& deser) } } -} // namespace sgc -} // namespace aica +} // namespace aica::sgc diff --git a/core/hw/aica/sgc_if.h b/core/hw/aica/sgc_if.h index 83a1a633c..4414144bb 100644 --- a/core/hw/aica/sgc_if.h +++ b/core/hw/aica/sgc_if.h @@ -1,10 +1,7 @@ #pragma once #include "types.h" -namespace aica -{ - -namespace sgc +namespace aica::sgc { void AICA_Sample(); @@ -42,19 +39,6 @@ union fp_20_12 u32 full; }; -struct DSP_OUT_VOL_REG -{ - //-- EFSDL[3:0] -- EFPAN[4:0] - - u32 EFPAN:5; - u32 res_1:3; - - u32 EFSDL:4; - u32 res_2:4; - - u32 pad:16; -}; - typedef s32 SampleType; void ReadCommonReg(u32 reg, bool byte); @@ -62,5 +46,4 @@ void serialize(Serializer& ctx); void deserialize(Deserializer& ctx); void vmuBeep(int on, int period); -} // namespace sgc -} // namespace aica +} // namespace aica::sgc diff --git a/core/hw/arm7/arm7.cpp b/core/hw/arm7/arm7.cpp index 8c874d29e..7571036b0 100644 --- a/core/hw/arm7/arm7.cpp +++ b/core/hw/arm7/arm7.cpp @@ -2,10 +2,7 @@ #include "arm_mem.h" #include "arm7_rec.h" -namespace aica -{ - -namespace arm +namespace aica::arm { #define CPUReadMemoryQuick(addr) (*(u32*)&aica_ram[(addr) & ARAM_MASK]) @@ -45,7 +42,7 @@ int armMode; bool Arm7Enabled = false; -static u8 cpuBitsSet[256]; +u8 cpuBitsSet[256]; static void CPUSwitchMode(int mode, bool saveState); static void CPUUpdateFlags(); @@ -92,13 +89,8 @@ void run(u32 samples) } #endif -void init() +void staticInit() { -#if FEAT_AREC != DYNAREC_NONE - recompiler::init(); -#endif - reset(); - for (std::size_t i = 0; i < std::size(cpuBitsSet); i++) { int count = 0; @@ -109,6 +101,15 @@ void init() cpuBitsSet[i] = count; } } +OnLoad _staticInit(staticInit); + +void init() +{ +#if FEAT_AREC != DYNAREC_NONE + recompiler::init(); +#endif + reset(); +} void term() { @@ -409,5 +410,4 @@ template void DYNACALL MSR_do<1>(u32 v); } // namespace recompiler #endif // FEAT_AREC != DYNAREC_NONE -} // namespace arm -} // namespace aica +} // namespace aica::arm diff --git a/core/hw/arm7/arm7.h b/core/hw/arm7/arm7.h index 3fcba34f6..865f0ea1f 100644 --- a/core/hw/arm7/arm7.h +++ b/core/hw/arm7/arm7.h @@ -1,10 +1,7 @@ #pragma once #include "types.h" -namespace aica -{ - -namespace arm +namespace aica::arm { void init(); @@ -73,7 +70,7 @@ typedef union { struct { - u32 _pad0 : 28; + u32 : 28; u32 V : 1; //Bit 28 u32 C : 1; //Bit 29 u32 Z : 1; //Bit 30 @@ -82,7 +79,7 @@ typedef union struct { - u32 _pad1 : 28; + u32 : 28; u32 NZCV : 4; //Bits [31:28] }; } FLG; @@ -90,10 +87,10 @@ typedef union struct { u32 M : 5; //mode, PSR[4:0] - u32 _pad0 : 1; //not used / zero + u32 : 1; u32 F : 1; //FIQ disable, PSR[6] u32 I : 1; //IRQ disable, PSR[7] - u32 _pad1 : 20; //not used / zero + u32 : 20; u32 NZCV : 4; //Bits [31:28] } PSR; @@ -114,5 +111,4 @@ extern bool Arm7Enabled; void CPUFiq(); void CPUUpdateCPSR(); -} // namespace arm -} // namespace aica +} // namespace aica::arm diff --git a/core/hw/arm7/arm7_rec.cpp b/core/hw/arm7/arm7_rec.cpp index 508a4e306..4441bbf42 100644 --- a/core/hw/arm7/arm7_rec.cpp +++ b/core/hw/arm7/arm7_rec.cpp @@ -34,16 +34,14 @@ #include #endif -namespace aica -{ - -namespace arm +namespace aica::arm { #define arm_printf(...) DEBUG_LOG(AICA_ARM, __VA_ARGS__) void (*arm_compilecode)(); arm_mainloop_t arm_mainloop; +extern u8 cpuBitsSet[256]; namespace recompiler { @@ -122,7 +120,6 @@ union ArmOpBits static_assert(sizeof(ArmOpBits) == sizeof(u32), "sizeof(ArmOpBits) == sizeof(u32)"); static std::vector block_ops; -static u8 cpuBitsSet[256]; //findfirstset -- used in LDM/STM handling #ifdef _MSC_VER @@ -683,15 +680,6 @@ void init() #endif verify(rc); - for (std::size_t i = 0; i < std::size(cpuBitsSet); i++) - { - int count = 0; - for (int j = 0; j < 8; j++) - if (i & (1 << j)) - count++; - - cpuBitsSet[i] = count; - } flush(); } @@ -770,6 +758,5 @@ void avoidRaceCondition() arm_Reg[CYCL_CNT].I = std::max((int)arm_Reg[CYCL_CNT].I, 50); } -} // namespace arm -} // namespace aica +} // namespace aica::arm #endif // FEAT_AREC != DYNAREC_NONE diff --git a/core/hw/arm7/arm7_rec.h b/core/hw/arm7/arm7_rec.h index 7c5e5afa4..6bc147459 100644 --- a/core/hw/arm7/arm7_rec.h +++ b/core/hw/arm7/arm7_rec.h @@ -23,10 +23,7 @@ #include #include -namespace aica -{ - -namespace arm +namespace aica::arm { struct ArmOp @@ -436,7 +433,7 @@ void DYNACALL interpret(u32 opcode); extern u8* icPtr; extern u8* ICache; -const u32 ICacheSize = 1024 * 1024 * 4; +const u32 ICacheSize = 4_MB; static inline void *currentCode() { return icPtr; @@ -468,5 +465,4 @@ extern void (*arm_compilecode)(); using arm_mainloop_t = void (*)(reg_pair *arm_regs, void (*entrypoints[])()); extern arm_mainloop_t arm_mainloop; -} // namespace arm -} // namespace aica +} // namespace aica::arm diff --git a/core/hw/arm7/arm7_rec_arm32.cpp b/core/hw/arm7/arm7_rec_arm32.cpp index 1799bad22..8cac3e785 100644 --- a/core/hw/arm7/arm7_rec_arm32.cpp +++ b/core/hw/arm7/arm7_rec_arm32.cpp @@ -24,9 +24,21 @@ #include "rec-ARM/arm_unwind.h" #include "oslib/virtmem.h" +#ifdef _M_ARM +#pragma push_macro("MemoryBarrier") +#pragma push_macro("Yield") +#undef MemoryBarrier +#undef Yield +#endif + #include using namespace vixl::aarch32; +#ifdef _M_ARM +#pragma pop_macro("MemoryBarrier") +#pragma pop_macro("Yield") +#endif + static ArmUnwindInfo unwinder; namespace aica diff --git a/core/hw/arm7/arm7_rec_arm64.cpp b/core/hw/arm7/arm7_rec_arm64.cpp index e65dfd734..3f421deea 100644 --- a/core/hw/arm7/arm7_rec_arm64.cpp +++ b/core/hw/arm7/arm7_rec_arm64.cpp @@ -63,7 +63,8 @@ class AArch64ArmRegAlloc : public ArmRegAlloc static const WRegister& getReg(int i) { static const WRegister regs[] = { - w19, w20, w21, w22, w23, w24, w25, w27 + (WRegister)w19, (WRegister)w20, (WRegister)w21, (WRegister)w22, + (WRegister)w23, (WRegister)w24, (WRegister)w25, (WRegister)w27 }; static_assert(MAX_REGS == std::size(regs), "MAX_REGS == std::size(regs)"); verify(i >= 0 && (u32)i < std::size(regs)); @@ -141,7 +142,7 @@ class Arm7Compiler : public MacroAssembler { Register rm; if (arg.isNone()) - return Operand(); + return Operand(0); else if (arg.isImmediate()) { if (!arg.isShifted()) @@ -154,7 +155,7 @@ class Arm7Compiler : public MacroAssembler { rm = regalloc->map(arg.getReg().armreg); } - Operand rv; + Operand rv = Operand(0); if (!arg.shift_imm) { // Shift by register @@ -322,7 +323,7 @@ class Arm7Compiler : public MacroAssembler { Operand arg0 = getOperand(op.arg[0], w1); Register rn; - Operand op2; + Operand op2 = Operand(0); if (op.op_type != ArmOp::MOV && op.op_type != ArmOp::MVN) { rn = getRegister(w1, arg0); diff --git a/core/hw/arm7/arm7_rec_x64.cpp b/core/hw/arm7/arm7_rec_x64.cpp index 4064ab2b4..d7920af00 100644 --- a/core/hw/arm7/arm7_rec_x64.cpp +++ b/core/hw/arm7/arm7_rec_x64.cpp @@ -26,12 +26,10 @@ using namespace Xbyak::util; #include "arm7_rec.h" -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" #include "oslib/virtmem.h" -namespace aica -{ -namespace arm +namespace aica::arm { static void (*arm_dispatch)(); @@ -1022,6 +1020,5 @@ void arm7backend_flush() virtmem::jit_set_exec(protStart, protSize, true); } -} // namespace arm -} // namespace aica +} // namespace aica::arm #endif // X64 && DYNAREC_JIT diff --git a/core/hw/arm7/arm_mem.cpp b/core/hw/arm7/arm_mem.cpp index 423d1231e..180d53385 100644 --- a/core/hw/arm7/arm_mem.cpp +++ b/core/hw/arm7/arm_mem.cpp @@ -1,10 +1,7 @@ #include "arm_mem.h" #include "hw/aica/aica_mem.h" -namespace aica -{ - -namespace arm +namespace aica::arm { #define REG_L (0x2D00) @@ -97,5 +94,4 @@ template void writeReg<>(u32 adr, u8 data); template void writeReg<>(u32 adr, u16 data); template void writeReg<>(u32 adr, u32 data); -} // namespace arm -} // namespace aica +} // namespace aica::arm diff --git a/core/hw/arm7/arm_mem.h b/core/hw/arm7/arm_mem.h index 8936828c8..366b9b82b 100644 --- a/core/hw/arm7/arm_mem.h +++ b/core/hw/arm7/arm_mem.h @@ -2,10 +2,7 @@ #include "types.h" #include "hw/aica/aica_if.h" -namespace aica -{ - -namespace arm +namespace aica::arm { template T readReg(u32 addr); @@ -56,5 +53,4 @@ extern u32 e68k_reg_M; void update_armintc(); void interruptChange(u32 bits, u32 L); -} // namespace arm -} // namespace aica +} // namespace aica::arm diff --git a/core/hw/bba/rtl8139c.cpp b/core/hw/bba/rtl8139c.cpp index e39f09f63..6a509387b 100644 --- a/core/hw/bba/rtl8139c.cpp +++ b/core/hw/bba/rtl8139c.cpp @@ -51,6 +51,7 @@ #include #include "rtl8139c.h" #include "serialize.h" +#include "hw/sh4/sh4_sched.h" /* debug RTL8139 card */ //#define DEBUG_RTL8139 1 @@ -444,6 +445,8 @@ struct RTL8139State { MemoryRegion bar_io; MemoryRegion bar_mem; + + int schedId; }; static void rtl8139_set_next_tctr_time(RTL8139State *s); @@ -899,6 +902,8 @@ static void rtl8139_reset_phy(RTL8139State *s) s->NWayExpansion = 0x0001; /* autonegotiation supported */ s->CSCR = CSCR_F_LINK_100 | CSCR_HEART_BIT | CSCR_LD; + + sh4_sched_request(s->schedId, 2000000); /* 10 ms */ } void rtl8139_reset(RTL8139State *s) @@ -2263,6 +2268,15 @@ static void rtl8139_timer(void *opaque) } #endif +static int rtl8139_sched_callback(int tag, int cycles, int jitter, void *arg) +{ + RTL8139State *state = (RTL8139State *)arg; + state->IntrStatus |= RxUnderrun; // Link change + rtl8139_update_irq(state); + + return 0; +} + static void pci_rtl8139_uninit(PCIDevice *dev) { #ifdef RTL8139_TIMER @@ -2315,6 +2329,7 @@ RTL8139State *rtl8139_init(NICConf *conf) state->parent_obj.config = (uint8_t *)calloc(256, 1); state->parent_obj.wmask = (uint8_t *)calloc(256, 1); state->parent_obj.cmask = (uint8_t *)calloc(256, 1); + state->schedId = sh4_sched_register(0, rtl8139_sched_callback, state); return state; } @@ -2322,6 +2337,7 @@ RTL8139State *rtl8139_init(NICConf *conf) void rtl8139_destroy(RTL8139State *state) { pci_rtl8139_uninit(PCI_DEVICE(state)); + sh4_sched_unregister(state->schedId); free(state->parent_obj.config); free(state->parent_obj.wmask); free(state->parent_obj.cmask); @@ -2390,6 +2406,8 @@ void rtl8139_serialize(RTL8139State *s, Serializer& ser) ser << s->TCTR; ser << s->TimerInt; ser << s->TCTR_base; + + sh4_sched_serialize(ser, s->schedId); } bool rtl8139_deserialize(RTL8139State *s, Deserializer& deser) @@ -2455,5 +2473,8 @@ bool rtl8139_deserialize(RTL8139State *s, Deserializer& deser) deser >> s->TimerInt; deser >> s->TCTR_base; + if (deser.version() >= Deserializer::V38) + sh4_sched_deserialize(deser, s->schedId); + return s->bChipCmdState & CmdRxEnb; } diff --git a/core/hw/flashrom/at93cxx.cpp b/core/hw/flashrom/at93cxx.cpp new file mode 100644 index 000000000..442b23d31 --- /dev/null +++ b/core/hw/flashrom/at93cxx.cpp @@ -0,0 +1,152 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#include "at93cxx.h" + +//#define DEBUG_EEPROM 1 + +#ifdef DEBUG_EEPROM +#define EEPROM_LOG(...) DEBUG_LOG(FLASHROM, __VA_ARGS__) +#else +#define EEPROM_LOG(...) +#endif + +void AT93CxxSerialEeprom::writeCLK(bool state) +{ + // CS asserted and CLK rising + if (!clk && state && cs) + { + if (dataOutBits > 0) + dataOutBits--; + if (dataOutBits == 0) + { + if (command.empty() && !di) + INFO_LOG(NAOMI, "serial eeprom: Ignoring bit 0 (start bit must be 1)"); + else + { + command.push_back(di); + if (command.size() == 9) + { + int opCode = (int)command[1] * 2 + (int)command[2]; + switch (opCode) + { + case 0: // write enable/disable, erase all, write all + { + int subCode = (int)command[3] * 2 + (int)command[4]; + switch (subCode) + { + case 0: // disable write + EEPROM_LOG("serial eeprom: EWDS"); + writeEnable = false; + command.clear(); + break; + case 1: // write all + expected = 3 + 6 + 16; // 6 bits of address, 16 bits of data + break; + case 2: // erase all + EEPROM_LOG("serial eeprom: ERAL"); + if (writeEnable) + memset(data, 0xff, size); + command.clear(); + break; + case 3: // enable write + EEPROM_LOG("serial eeprom: EWEN"); + writeEnable = true; + command.clear(); + break; + } + } + break; + case 1: // write + expected = 3 + 6 + 16; // 6 bits of address, 16 bits of data + break; + case 2: // read + dataOut = Read(getCommandAddress() * 2, 2); + dataOutBits = 17; // actually 16 but 0 means no data + EEPROM_LOG("serial eeprom: READ %x: %x", getCommandAddress(), dataOut); + command.clear(); + break; + case 3: // erase + EEPROM_LOG("serial eeprom: ERASE %x", getCommandAddress()); + if (writeEnable) + *(u16 *)&data[(getCommandAddress() * 2) & mask] = 0xffff; + command.clear(); + break; + } + } + else if (expected > 0 && (int)command.size() == expected) + { + int opCode = (int)command[1] * 2 + (int)command[2]; + switch (opCode) + { + case 0: // write all + { + u16 v = getCommandData(); + EEPROM_LOG("serial eeprom: WRAL = %x", v); + if (writeEnable) + for (u32 i = 0; i < size; i += 2) + *(u16 *)&data[i & mask] = v; + } + break; + case 1: // write + EEPROM_LOG("serial eeprom: WRITE %x = %x", getCommandAddress(), getCommandData()); + if (writeEnable) + *(u16 *)&data[(getCommandAddress() * 2) & mask] = getCommandData(); + break; + } + command.clear(); + expected = 0; + } + } + } + } + clk = state; +} + +void AT93CxxSerialEeprom::Serialize(Serializer& ser) const +{ + ser << cs; + ser << clk; + ser << di; + ser << (u32)command.size(); + for (bool b : command) + ser << b; + ser << expected; + ser << writeEnable; + ser << dataOut; + ser << dataOutBits; +} + +void AT93CxxSerialEeprom::Deserialize(Deserializer& deser) +{ + deser >> cs; + deser >> clk; + deser >> di; + u32 size; + deser >> size; + command.resize(size); + for (u32 i = 0; i < size; i++) { + bool b; + deser >> b; + command[i] = b; + } + deser >> expected; + deser >> writeEnable; + deser >> dataOut; + deser >> dataOutBits; +} diff --git a/core/hw/flashrom/at93cxx.h b/core/hw/flashrom/at93cxx.h new file mode 100644 index 000000000..803345ed7 --- /dev/null +++ b/core/hw/flashrom/at93cxx.h @@ -0,0 +1,106 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once +#include "flashrom.h" +#include + +// +// Three-wire Serial EEPROM +// +class AT93CxxSerialEeprom : public WritableChip +{ +public: + AT93CxxSerialEeprom(u32 size) : WritableChip(size) { + memset(data, 0xff, size); + } + + // combined DO + READY/BUSY + bool readDO() + { + if (dataOutBits > 0) + // DO + return (dataOut >> (dataOutBits - 1)) & 1; + else + // Ready + return true; + } + + // chip select (active high) + void writeCS(bool state) { + cs = state; + } + + // clock + void writeCLK(bool state); + + // data in + void writeDI(bool state) { + di = state; + } + + void Write(u32 addr, u32 data, u32 size) override { + die("Unsupported"); + } + + void Serialize(Serializer& ser) const override; + void Deserialize(Deserializer& deser) override; + +private: + u8 getCommandAddress() const + { + verify(command.size() >= 9); + u8 addr = 0; + for (int i = 3; i < 9; i++) { + addr <<= 1; + addr |= command[i]; + } + return addr; + } + + u16 getCommandData() const + { + verify(command.size() >= 25); + u16 v = 0; + for (int i = 9; i < 25; i++) { + v <<= 1; + v |= command[i]; + } + return v; + } + + bool cs = false; + bool clk = false; + bool di = false; + std::vector command; + int expected = 0; + bool writeEnable = false; + u16 dataOut = 0; + u8 dataOutBits = 0; +}; + +// +// Three-wire Serial EEPROM +// 1 Kb (128 x 8) +// +class AT93C46SerialEeprom : public AT93CxxSerialEeprom +{ +public: + AT93C46SerialEeprom() : AT93CxxSerialEeprom(128) {} +}; + diff --git a/core/hw/flashrom/flashrom.cpp b/core/hw/flashrom/flashrom.cpp index f848af3de..3c501b44e 100644 --- a/core/hw/flashrom/flashrom.cpp +++ b/core/hw/flashrom/flashrom.cpp @@ -17,10 +17,11 @@ #include "flashrom.h" #include "oslib/oslib.h" #include "stdclass.h" +#include "oslib/storage.h" bool MemChip::Load(const std::string& file) { - FILE *f = nowide::fopen(file.c_str(), "rb"); + FILE *f = hostfs::storage().openFile(file, "rb"); if (f) { bool rv = std::fread(data + write_protect_size, 1, size - write_protect_size, f) == size - write_protect_size; diff --git a/core/hw/flashrom/flashrom.h b/core/hw/flashrom/flashrom.h index 1fd7d7c90..f42dc5cb0 100644 --- a/core/hw/flashrom/flashrom.h +++ b/core/hw/flashrom/flashrom.h @@ -269,23 +269,23 @@ struct DCFlashChip : WritableChip { case FLASH_PT_FACTORY: *offset = 0x1a000; - *size = 8 * 1024; + *size = 8_KB; break; case FLASH_PT_RESERVED: *offset = 0x18000; - *size = 8 * 1024; + *size = 8_KB; break; case FLASH_PT_USER: *offset = 0x1c000; - *size = 16 * 1024; + *size = 16_KB; break; case FLASH_PT_GAME: *offset = 0x10000; - *size = 32 * 1024; + *size = 32_KB; break; case FLASH_PT_UNKNOWN: *offset = 0x00000; - *size = 64 * 1024; + *size = 64_KB; break; default: *offset = 0; diff --git a/core/hw/flashrom/nvmem.cpp b/core/hw/flashrom/nvmem.cpp index 8aa99a78b..e6cfa0d50 100644 --- a/core/hw/flashrom/nvmem.cpp +++ b/core/hw/flashrom/nvmem.cpp @@ -22,9 +22,7 @@ #include "hw/aica/aica_if.h" #include "reios/reios.h" #include "oslib/oslib.h" -#include "archive/ZipArchive.h" -#include -CMRC_DECLARE(flycast); +#include "oslib/resources.h" extern bool bios_loaded; @@ -47,7 +45,6 @@ static std::string getRomPrefix() case DC_PLATFORM_ATOMISWAVE: return "aw_"; default: - die("Unsupported platform"); return ""; } } @@ -79,8 +76,7 @@ static void add_isp_to_nvmem(DCFlashChip *flash) for (u32 i = FLASH_USER_INET + 5; i <= 0xbf; i++) flash->WriteBlock(FLASH_PT_USER, i, block); - flash_isp1_block isp1; - memset(&isp1, 0, sizeof(isp1)); + flash_isp1_block isp1{}; isp1._unknown[3] = 1; memcpy(isp1.sega, "SEGA", 4); strcpy(isp1.username, "flycast1"); @@ -92,13 +88,14 @@ static void add_isp_to_nvmem(DCFlashChip *flash) memset(block, 0, sizeof(block)); flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 1, block); flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 2, block); + strcpy((char *)block + 2, "flycast@gmail.com"); flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 3, block); + memset(block, 0, sizeof(block)); flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 4, block); block[60] = 1; flash->WriteBlock(FLASH_PT_USER, FLASH_USER_ISP1 + 5, block); - flash_isp2_block isp2; - memset(&isp2, 0, sizeof(isp2)); + flash_isp2_block isp2{}; memcpy(isp2.sega, "SEGA", 4); strcpy(isp2.username, "flycast2"); strcpy(isp2.password, "password"); @@ -191,47 +188,15 @@ static void fixUpDCFlash() console_id[-1] = console_id[0xA0 - 1] = sum; console_id[-2] = console_id[0xA0 - 2] = ~sum; } - // must be != 0xff + // machine_version: ff - VA0, fe - VA1, fd - VA2 + // must be != 0xff console_id[7] = console_id[0xA0 + 7] = 0xfe; } } static std::unique_ptr loadFlashResource(const std::string& name, size_t& size) { - try { - cmrc::embedded_filesystem fs = cmrc::flycast::get_filesystem(); - std::string fname = "flash/" + name + ".zip"; - if (fs.exists(fname)) - { - cmrc::file zipFile = fs.open(fname); - ZipArchive zip; - if (zip.Open(zipFile.cbegin(), zipFile.size())) - { - std::unique_ptr flashFile; - flashFile.reset(zip.OpenFirstFile()); - if (flashFile != nullptr) - { - std::unique_ptr buffer = std::make_unique(size); - size = flashFile->Read(buffer.get(), size); - - return buffer; - } - } - } - else - { - cmrc::file flashFile = fs.open("flash/" + name); - size = flashFile.size(); - std::unique_ptr buffer = std::make_unique(size); - - return buffer; - } - DEBUG_LOG(FLASHROM, "Default flash not found"); - } catch (const std::system_error& e) { - DEBUG_LOG(FLASHROM, "Default flash not found: %s", e.what()); - } - size = 0; - return nullptr; + return resource::load("flash/" + name, size); } static void loadDefaultAWBiosFlash() @@ -377,6 +342,10 @@ void init() sys_rom = new DCFlashChip(settings.platform.bios_size, settings.platform.bios_size / 2); sys_nvmem = new SRamChip(settings.platform.flash_size); break; + case DC_PLATFORM_SYSTEMSP: + sys_rom = new RomChip(settings.platform.bios_size); + sys_nvmem = new SRamChip(settings.platform.flash_size); + break; } } @@ -402,36 +371,8 @@ void serialize(Serializer& ser) void deserialize(Deserializer& deser) { - if (deser.version() <= Deserializer::VLAST_LIBRETRO) - { - deser.skip(); // size - deser.skip(); // mask - - // Legacy libretro savestate - if (settings.platform.isArcade()) - sys_nvmem->Deserialize(deser); - - deser.skip(); // sys_nvmem/sys_rom->size - deser.skip(); // sys_nvmem/sys_rom->mask - if (settings.platform.isConsole()) - { - sys_nvmem->Deserialize(deser); - } - else if (settings.platform.isAtomiswave()) - { - deser >> static_cast(sys_rom)->state; - deser.deserialize(sys_rom->data, sys_rom->size); - } - else - { - deser.skip(); - } - } - else - { - sys_rom->Deserialize(deser); - sys_nvmem->Deserialize(deser); - } + sys_rom->Deserialize(deser); + sys_nvmem->Deserialize(deser); } } diff --git a/core/hw/flashrom/x76f100.cpp b/core/hw/flashrom/x76f100.cpp new file mode 100644 index 000000000..d5edda833 --- /dev/null +++ b/core/hw/flashrom/x76f100.cpp @@ -0,0 +1,282 @@ +// Derived from mame src/devices/machine/x76f100.{h,cpp} +// license:BSD-3-Clause +// copyright-holders:smf +#include "x76f100.h" +#include "serialize.h" + +void X76F100SerialFlash::writeSCL(bool v) +{ + if (!lastCS) + { + switch (state) + { + case State::STOP: + break; + + case State::RESPONSE_TO_RESET: + if (lastSCL && !v) + { + if (bit == 0) + shift = responseToReset[byteOffset]; + + sda = shift & 1; + shift >>= 1; + bit++; + + if (bit == 8) + { + bit = 0; + byteOffset++; + if (byteOffset == sizeof(responseToReset)) + byteOffset = 0; + } + } + break; + + case State::LOAD_COMMAND: + case State::LOAD_PASSWORD: + case State::VERIFY_PASSWORD: + case State::WRITE_DATA: + if (!lastSCL && v) + { + if (bit < 8) + { + shift <<= 1; + + if (lastSDA) + shift |= 1; + bit++; + } + else + { + sda = false; + + switch (state) + { + case State::LOAD_COMMAND: + command = shift; + DEBUG_LOG(FLASHROM, "-> command: %02x", command); + state = State::LOAD_PASSWORD; + break; + + case State::LOAD_PASSWORD: + DEBUG_LOG(FLASHROM, "-> password: %02x", shift); + writeBuffer[byteOffset++] = shift; + + if (byteOffset == sizeof(writeBuffer)) + { + state = State::VERIFY_PASSWORD; + + // We don't check the password + u8 *password; + if ((command & 0xe1) == (int)Command::READ) + password = readPassword; + else + password = writePassword; + DEBUG_LOG(FLASHROM, "Password accepted: %d", memcmp(password, writeBuffer, sizeof(writeBuffer)) == 0); + } + break; + + case State::VERIFY_PASSWORD: + DEBUG_LOG(FLASHROM, "-> verify password: %02x", shift); + + if (shift == (int)Command::ACK_PASSWORD) + { + if (true) // password accepted + { + if ((command & 0x81) == (int)Command::READ) + state = State::READ_DATA; + else if ((command & 0x81) == (int)Command::WRITE) + state = State::WRITE_DATA; + } + else + sda = true; + } + break; + + case State::WRITE_DATA: + DEBUG_LOG(FLASHROM, "-> data: %02x", shift ); + writeBuffer[byteOffset++] = shift; + + if (byteOffset == sizeof(writeBuffer)) + { + if (command == (int)Command::CHANGE_WRITE_PASSWORD) + { + memcpy(writeBuffer, writePassword, sizeof(writePassword)); + } + else if (command == (int)Command::CHANGE_READ_PASSWORD) + { + memcpy(writeBuffer, readPassword, sizeof(readPassword)); + } + else + { + for (byteOffset = 0; byteOffset < sizeof(writeBuffer); byteOffset++) + { + int offset = dataOffset(); + + if (offset != -1) + data[offset] = writeBuffer[byteOffset]; + else + break; + } + } + byteOffset = 0; + } + break; + + default: + break; + } + + bit = 0; + shift = 0; + } + } + break; + + case State::READ_DATA: + if (!lastSCL && v) + { + if (bit < 8) + { + if (bit == 0) + { + int offset = dataOffset(); + + if (offset != -1) + shift = data[offset]; + else + shift = 0; + } + + sda = (shift >> 7) & 1; + shift <<= 1; + bit++; + } + else + { + bit = 0; + sda = false; + + if (!lastSDA) + { + DEBUG_LOG(FLASHROM, "ack <-"); + byteOffset++; + } + else + { + DEBUG_LOG(FLASHROM, "nak <-"); + } + } + } + break; + } + } + + SCLChanged = (lastSCL != v); + lastSCL = v; +} + +void X76F100SerialFlash::writeSDA(bool v) +{ + if (lastSCL && !SCLChanged && !lastCS) + { + if (!lastSDA && v) + { + DEBUG_LOG(FLASHROM, "goto stop"); + state = State::STOP; + sda = false; + } + + if (lastSDA && !v) + { + switch (state) + { + case State::STOP: + DEBUG_LOG(FLASHROM, "goto start"); + state = State::LOAD_COMMAND; + break; + + case State::LOAD_PASSWORD: + DEBUG_LOG(FLASHROM, "goto start"); + break; + + case State::READ_DATA: + DEBUG_LOG(FLASHROM, "reading"); + break; + + default: + DEBUG_LOG(FLASHROM, "skipped start (default)"); + break; + } + + bit = 0; + byteOffset = 0; + shift = 0; + sda = false; + } + } + lastSDA = v; +} + +void X76F100SerialFlash::reset() +{ + lastSCL = false; + SCLChanged = false; + lastSDA = false; + sda = false; + lastRST = false; + lastCS = false; + state = State::STOP; + bit = 0; + byteOffset = 0; + command = 0; + shift = 0; + memset(writeBuffer, 0, sizeof(writeBuffer)); +} + +int X76F100SerialFlash::dataOffset() +{ + int block_offset = (command >> 1) & 0x0f; + int offset = (block_offset * 8) + byteOffset; + + // Technically there are 4 bits assigned to sector values but since the data array is only 112 bytes, + // it will try reading out of bounds when the sector is 14 (= starts at 112) or 15 (= starts at 120). + if (offset >= (int)sizeof(data)) + return -1; + + return offset; +} + +void X76F100SerialFlash::serialize(Serializer& ser) const +{ + ser << writeBuffer; + ser << lastSCL; + ser << SCLChanged; + ser << lastSDA; + ser << sda; + ser << lastRST; + ser << lastCS; + ser << state; + ser << command; + ser << byteOffset; + ser << bit; + ser << shift; +} + +void X76F100SerialFlash::deserialize(Deserializer& deser) +{ + deser >> writeBuffer; + deser >> lastSCL; + deser >> SCLChanged; + deser >> lastSDA; + deser >> sda; + deser >> lastRST; + deser >> lastCS; + deser >> state; + deser >> command; + deser >> byteOffset; + deser >> bit; + deser >> shift; +} + diff --git a/core/hw/flashrom/x76f100.h b/core/hw/flashrom/x76f100.h new file mode 100644 index 000000000..b27d5ae13 --- /dev/null +++ b/core/hw/flashrom/x76f100.h @@ -0,0 +1,112 @@ +// Derived from mame src/devices/machine/x76f100.{h,cpp} +// license:BSD-3-Clause +// copyright-holders:smf +/* + * The X76F100 is a Password Access Security Supervisor, containing one 896-bit Secure SerialFlash array. + * Access to the memory array can be controlled by two 64-bit passwords. These passwords protect read and + * write operations of the memory array. + */ +#pragma once +#include "types.h" +#include + +class X76F100SerialFlash +{ +public: + void reset(); + + // Clock + void writeSCL(bool v); + + // Data I/O + void writeSDA(bool v); + + bool readSDA() { + return lastCS ? 1 : sda; + } + + // Chip select + void writeCS(bool v) + { + if (lastCS && !v) + state = State::STOP; + else if (!lastCS && v) { + state = State::STOP; + sda = false; + } + lastCS = v; + } + + // Reset + void writeRST(bool v) + { + if (v && !lastRST && !lastCS) + { + DEBUG_LOG(FLASHROM, "reset"); + state = State::RESPONSE_TO_RESET; + bit = 0; + byteOffset = 0; + } + lastRST = v; + } + + void setData(const u8 *data) + { + size_t index = 0; + memcpy(responseToReset, &data[index], sizeof(responseToReset)); + index += sizeof(responseToReset); + memcpy(writePassword, &data[index], sizeof(writePassword)); + index += sizeof(writePassword); + memcpy(readPassword, &data[index], sizeof(readPassword)); + index += sizeof(readPassword); + memcpy(this->data, &data[index], sizeof(this->data)); + } + + const u8 *getProtectedData() const + { + return data; + } + + void serialize(Serializer& ser) const; + void deserialize(Deserializer& deser); + +private: + enum class Command + { + WRITE = 0x80, + READ = 0x81, + CHANGE_WRITE_PASSWORD = 0xfc, + CHANGE_READ_PASSWORD = 0xfe, + ACK_PASSWORD = 0x55 + }; + + enum class State + { + STOP, + RESPONSE_TO_RESET, + LOAD_COMMAND, + LOAD_PASSWORD, + VERIFY_PASSWORD, + READ_DATA, + WRITE_DATA + }; + + int dataOffset(); + + u8 data[112] {}; + u8 readPassword[8] {}; + u8 writePassword[8] {}; + u8 responseToReset[4] { 0x19, 0x00, 0xaa, 0x55 }; + u8 writeBuffer[8] {}; + bool lastSCL = false; + bool lastSDA = false; + bool sda = false; + bool lastRST = false; + bool lastCS = false; + bool SCLChanged = false; + State state = State::STOP; + u8 command = 0; + u8 byteOffset = 0; + u8 bit = 0; + u8 shift = 0; +}; diff --git a/core/hw/gdrom/gdrom_if.h b/core/hw/gdrom/gdrom_if.h index b71180429..213084c77 100644 --- a/core/hw/gdrom/gdrom_if.h +++ b/core/hw/gdrom/gdrom_if.h @@ -8,7 +8,6 @@ void gdrom_reg_Reset(bool hard); u32 ReadMem_gdrom(u32 Addr, u32 sz); void WriteMem_gdrom(u32 Addr, u32 data, u32 sz); void libCore_CDDA_Sector(s16* sector); -void libCore_gdrom_disc_change(); u32 gd_get_subcode(u32 format, u32 fad, u8 *subc_info); void gd_setdisc(); diff --git a/core/hw/gdrom/gdromv3.cpp b/core/hw/gdrom/gdromv3.cpp index f231adbe8..494f8adec 100644 --- a/core/hw/gdrom/gdromv3.cpp +++ b/core/hw/gdrom/gdromv3.cpp @@ -9,7 +9,6 @@ #include "hw/holly/holly_intc.h" #include "hw/holly/sb.h" #include "hw/sh4/modules/dmac.h" -#include "hw/sh4/sh4_interpreter.h" #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_mmr.h" #include "hw/sh4/sh4_sched.h" @@ -23,37 +22,37 @@ int sns_asc; int sns_ascq; int sns_key; -u32 set_mode_offset; -read_params_t read_params ; -packet_cmd_t packet_cmd ; -read_buff_t read_buff ; -pio_buff_t pio_buff ; -ata_cmd_t ata_cmd ; -cdda_t cdda ; +static u32 set_mode_offset; +static read_params_t read_params; +static packet_cmd_t packet_cmd; +static DmaBuffer dma_buff; +static PioBuffer pio_buff; +static u8 ata_command; +cdda_t cdda; -gd_states gd_state; -DiscType gd_disk_type; +static gd_states gd_state; +static DiscType gd_disk_type; /* GD rom reset -> GDS_WAITCMD - GDS_WAITCMD -> ATA/SPI command [Command code is on ata_cmd] + GDS_WAITCMD -> ATA/SPI command [Command code is on ata_command] SPI Command -> GDS_WAITPACKET -> GDS_SPI_* , depending on input GDS_SPI_READSECTOR -> Depending on features , it can do quite a few things */ -u32 data_write_mode=0; +static u32 data_write_mode=0; //Registers - u32 DriveSel; - GD_ErrRegT Error; - GD_InterruptReasonT IntReason; - GD_FeaturesT Features; - GD_SecCountT SecCount; - GD_SecNumbT SecNumber; +static u32 DriveSel; +static GD_ErrRegT Error; +static GD_InterruptReasonT IntReason; +static GD_FeaturesT Features; +static GD_SecCountT SecCount; +GD_SecNumbT SecNumber; - GD_StatusT GDStatus; +static GD_StatusT GDStatus; - ByteCount_t ByteCount; +static ByteCount_t ByteCount; //end GD_HardwareInfo_t GD_HardwareInfo; @@ -66,55 +65,112 @@ GD_HardwareInfo_t GD_HardwareInfo; void libCore_CDDA_Sector(s16* sector) { - //silence ! :p if (cdda.status == cdda_t::Playing) { - libGDR_ReadSector((u8*)sector,cdda.CurrAddr.FAD,1,2352); - cdda.CurrAddr.FAD++; - if (cdda.CurrAddr.FAD >= cdda.EndAddr.FAD) + if (libGDR_ReadSector((u8*)sector, cdda.CurrAddr.FAD, 1, 2352, true) == 0) { - if (cdda.repeats==0) - { - //stop - cdda.status = cdda_t::Terminated; - SecNumber.Status = GD_PAUSE; - } - else + // Stop + cdda.CurrAddr.FAD--; // should stay on the last sector read (reported by subcode with cdda status=terminated) + cdda.status = cdda_t::Terminated; + SecNumber.Status = GD_PAUSE; + memset(sector, 0, 2352); + } + else + { + cdda.CurrAddr.FAD++; + if (cdda.CurrAddr.FAD >= cdda.EndAddr.FAD) { - //Repeat ;) - if (cdda.repeats!=0xf) - cdda.repeats--; - - cdda.CurrAddr.FAD=cdda.StartAddr.FAD; + if (cdda.repeats == 0) + { + // Stop + cdda.status = cdda_t::Terminated; + SecNumber.Status = GD_PAUSE; + } + else + { + // Repeat + if (cdda.repeats != 15) + cdda.repeats--; + cdda.CurrAddr.FAD = cdda.StartAddr.FAD; + } } } } - else - { - memset(sector,0,2352); + else { + memset(sector, 0, 2352); } } -void gd_spi_pio_end(const u8* buffer, u32 len, gd_states next_state = gds_pio_end); -void gd_process_spi_cmd(); -void gd_process_ata_cmd(); -static void FillReadBuffer() +static void gd_spi_pio_end(const u8* buffer, u32 len, gd_states next_state = gds_pio_end); +static void gd_process_spi_cmd(); +static void gd_process_ata_cmd(); + +void DmaBuffer::fill(read_params_t& params) { - read_buff.cache_index=0; - u32 count = read_params.remaining_sectors; + if (!isEmpty()) + return; + index = 0; + verify(params.remaining_sectors > 0); + u32 count = std::min(params.remaining_sectors, NSECT); + size = count * params.sector_type; + + libGDR_ReadSector(cache, params.start_sector, count, params.sector_type); + params.start_sector += count; + params.remaining_sectors -= count; +} - if (count > 32) - count = 32; +const u8 *DmaBuffer::read(u32 len) +{ + verify(len <= size); + const u8 *p = &cache[index]; + index += len; + size -= len; + return p; +} - read_buff.cache_size=count*read_params.sector_type; +void DmaBuffer::serialize(Serializer& ser) const +{ + ser << size; + ser.serialize(&cache[index], size); +} - libGDR_ReadSector(read_buff.cache,read_params.start_sector,count,read_params.sector_type); - read_params.start_sector+=count; - read_params.remaining_sectors-=count; +void DmaBuffer::deserialize(Deserializer& deser) +{ + if (deser.version() < Deserializer::V54) + { + deser >> index; + deser >> size; + deser >> cache; + deser.skip(2352 * 16); + } + else + { + index = 0; + deser >> size; + deser.deserialize(&cache[0], size); + } } +void PioBuffer::serialize(Serializer& ser) const +{ + ser << next_state; + ser << index; + ser << size; + ser.serialize(&_data[0], size); +} -void gd_set_state(gd_states state) +void PioBuffer::deserialize(Deserializer& deser) +{ + deser >> next_state; + deser >> index; + deser >> size; + if (deser.version() < Deserializer::V54) + deser >> _data; + else + deser.deserialize(&_data[0], size); +} + +static void gd_set_state(gd_states state) { gd_states prev=gd_state; gd_state=state; @@ -163,7 +219,7 @@ void gd_set_state(gd_states state) case gds_pio_send_data: // When preparations are complete, the following steps are carried out at the device. //(1) Number of bytes to be read is set in "Byte Count" register. - ByteCount.full =(u16)(pio_buff.size<<1); + ByteCount.full = (u16)pio_buff.getSize(); //(2) IO bit is set and CoD bit is cleared. IntReason.IO=1; IntReason.CoD=0; @@ -189,22 +245,24 @@ void gd_set_state(gd_states state) u32 sector_count = read_params.remaining_sectors; gd_states next_state=gds_pio_end; - if (sector_count > 27) - { - sector_count = 27; + const u32 maxSectors = (PioBuffer::Capacity - 1) / read_params.sector_type; + if (sector_count > maxSectors) { + sector_count = maxSectors; next_state = gds_readsector_pio; } - libGDR_ReadSector((u8*)&pio_buff.data[0],read_params.start_sector,sector_count, read_params.sector_type); - read_params.start_sector+=sector_count; - read_params.remaining_sectors-=sector_count; + u16 *buffer = pio_buff.fill(sector_count * read_params.sector_type); + libGDR_ReadSector((u8*)buffer, read_params.start_sector, sector_count, read_params.sector_type); + read_params.start_sector += sector_count; + read_params.remaining_sectors -= sector_count; - gd_spi_pio_end(0,sector_count*read_params.sector_type,next_state); + gd_spi_pio_end(nullptr, 0, next_state); } break; case gds_readsector_dma: - FillReadBuffer(); + dma_buff.clear(); + dma_buff.fill(read_params); break; case gds_pio_end: @@ -236,7 +294,7 @@ void gd_set_state(gd_states state) break; case gds_process_set_mode: - memcpy((u8 *)&GD_HardwareInfo + set_mode_offset, pio_buff.data, pio_buff.size << 1); + memcpy((u8 *)&GD_HardwareInfo + set_mode_offset, pio_buff.data(), pio_buff.getSize()); //end pio transfer ;) gd_set_state(gds_pio_end); break; @@ -282,7 +340,7 @@ void gd_setdisc() SecNumber.DiscFormat = gd_disk_type >> 4; } -void gd_reset() +static void gd_reset() { //Reset the drive gd_setdisc(); @@ -298,47 +356,43 @@ static u32 GetFAD(u8* data, bool msf) } //disk changes etc -void libCore_gdrom_disc_change() +static void gd_disc_change() { gd_setdisc(); read_params = { 0 }; set_mode_offset = 0; packet_cmd = { 0 }; - memset(&read_buff, 0, sizeof(read_buff)); - pio_buff = { gds_waitcmd, 0 }; - ata_cmd = { 0 }; + dma_buff.clear(); + pio_buff.clear(); + ata_command = 0; cdda = { cdda_t::NoInfo, 0 }; } //This handles the work of setting up the pio regs/state :) -void gd_spi_pio_end(const u8* buffer, u32 len, gd_states next_state) +static void gd_spi_pio_end(const u8* buffer, u32 len, gd_states next_state) { - verify(len<0xFFFF); - pio_buff.index=0; - pio_buff.size=len>>1; - pio_buff.next_state=next_state; - - if (buffer!=0) - memcpy(pio_buff.data,buffer,len); - - if (len==0) + if (buffer != nullptr) { + verify(len < 0xFFFF); // TODO shouldn't this be <= 0xFFFF ? + memcpy(pio_buff.fill(len), buffer, len); + } + pio_buff.next_state = next_state; + if (pio_buff.isEmpty()) gd_set_state(next_state); else gd_set_state(gds_pio_send_data); } -void gd_spi_pio_read_end(u32 len, gd_states next_state) +static void gd_spi_pio_read_end(u32 len, gd_states next_state) { - verify(len<0xFFFF); - pio_buff.index=0; - pio_buff.size=len>>1; - pio_buff.next_state=next_state; + verify(len < 0xFFFF); // TODO see above + pio_buff.resetSize(len); + pio_buff.next_state = next_state; - if (len==0) + if (len == 0) gd_set_state(next_state); else gd_set_state(gds_pio_get_data); } -void gd_process_ata_cmd() +static void gd_process_ata_cmd() { //Any ATA command clears these bits, unless aborted/error :p Error.ABRT=0; @@ -350,7 +404,7 @@ void gd_process_ata_cmd() else GDStatus.CHECK=1; - switch(ata_cmd.command) + switch (ata_command) { case ATA_NOP: printf_ata("ATA_NOP"); @@ -365,6 +419,7 @@ void gd_process_ata_cmd() Error.Sense = sns_key; GDStatus.BSY = 0; GDStatus.CHECK = 1; + GDStatus.DRQ = 0; asic_RaiseInterrupt(holly_GDROM_CMD); gd_set_state(gds_waitcmd); @@ -446,7 +501,7 @@ void gd_process_ata_cmd() break; default: - WARN_LOG(GDROM, "Unknown ATA command %x", ata_cmd.command); + WARN_LOG(GDROM, "Unknown ATA command %x", ata_command); Error.ABRT = 1; Error.Sense = 5; // illegal request GDStatus.BSY = 0; @@ -643,7 +698,7 @@ u32 gd_get_subcode(u32 format, u32 fad, u8 *subc_info) return subc_info[3]; } -void gd_process_spi_cmd() +static void gd_process_spi_cmd() { printf_spi("Sense: %02x %02x %02x", sns_asc, sns_ascq, sns_key); @@ -663,9 +718,8 @@ void gd_process_spi_cmd() { case SPI_TEST_UNIT: printf_spicmd("SPI_TEST_UNIT"); - - GDStatus.CHECK=SecNumber.Status==GD_BUSY; // Drive is ready ;) - + // needed by Alone in the Dark and Resident Evil: Code Veronica disk swapping + GDStatus.CHECK = SecNumber.Status == GD_BUSY; gd_set_state(gds_procpacketdone); break; @@ -689,11 +743,14 @@ void gd_process_spi_cmd() #define readcmd packet_cmd.GDReadBlock cdda.status = cdda_t::NoInfo; - u32 sector_type=2048; - if (readcmd.head ==1 && readcmd.subh==1 && readcmd.data==1 && readcmd.expdtype==3 && readcmd.other==0) - sector_type=2340; - else if(readcmd.head ||readcmd.subh || readcmd.other || (!readcmd.data)) // assert - WARN_LOG(GDROM, "GDROM: *FIXME* ADD MORE CD READ SETTINGS %d %d %d %d 0x%01X",readcmd.head,readcmd.subh,readcmd.other,readcmd.data,readcmd.expdtype); + u32 sector_type = 2048; + if (readcmd.head == 1 && readcmd.subh == 1 && readcmd.data == 1 && readcmd.expdtype == 3 && readcmd.other == 0) + sector_type = 2340; + else if (readcmd.other == 1 || readcmd.expdtype == 1) // Expected Data Type: CD-DA + sector_type = 2352; + else if (readcmd.head == 1 || readcmd.subh == 1 || readcmd.other == 1 || readcmd.data == 0) + WARN_LOG(GDROM, "GDROM: *FIXME* ADD MORE CD READ SETTINGS head %d subh %d other %d data %d type %d", + readcmd.head, readcmd.subh, readcmd.other, readcmd.data, readcmd.expdtype); read_params.start_sector = GetFAD(&readcmd.b[2], readcmd.prmtype); if (packet_cmd.data_8[0] == SPI_CD_READ) @@ -703,12 +760,12 @@ void gd_process_spi_cmd() read_params.sector_type = sector_type;//yeah i know , not really many types supported... printf_spicmd("SPI_CD_READ - Sector=%d Size=%d/%d DMA=%d",read_params.start_sector,read_params.remaining_sectors,read_params.sector_type,Features.CDRead.DMA); - if (Features.CDRead.DMA == 1) - { + if (Features.CDRead.DMA == 1) { + pio_buff.clear(); gd_set_state(gds_readsector_dma); } - else - { + else { + dma_buff.clear(); gd_set_state(gds_readsector_pio); } } @@ -772,8 +829,8 @@ void gd_process_spi_cmd() case SPI_REQ_STAT: { - printf_spicmd("SPI_REQ_STAT"); u32 curFad = cdda.status == cdda_t::Playing || cdda.status == cdda_t::Paused ? cdda.CurrAddr.FAD : read_params.start_sector - 1; + printf_spicmd("SPI_REQ_STAT: status %d fmt %d fad %d", SecNumber.Status, SecNumber.DiscFormat, curFad); u32 elapsed; u32 tracknum = libGDR_GetTrackNumber(curFad, elapsed); u8 stat[10]; @@ -829,7 +886,7 @@ void gd_process_spi_cmd() case SPI_REQ_SES: { - printf_spicmd("SPI_REQ_SES"); + printf_spicmd("SPI_REQ_SES: status %d", SecNumber.Status); u8 ses_inf[6]; libGDR_GetSessionInfo(ses_inf,packet_cmd.data_8[2]); @@ -1005,16 +1062,15 @@ u32 ReadMem_gdrom(u32 Addr, u32 sz) //if (gd_state == gds_pio_send_data) //{ - if (pio_buff.index == pio_buff.size) + if (pio_buff.atEnd()) { INFO_LOG(GDROM, "GDROM: Illegal Read From DATA (underflow)"); } else { - u32 rv= pio_buff.data[pio_buff.index]; - pio_buff.index+=1; - ByteCount.full-=2; - if (pio_buff.index==pio_buff.size) + u32 rv = pio_buff.read(); + ByteCount.full -= sizeof(u16); + if (pio_buff.atEnd()) { verify(pio_buff.next_state != gds_pio_send_data); //end of pio transfer ! @@ -1082,11 +1138,10 @@ void WriteMem_gdrom(u32 Addr, u32 data, u32 sz) } else if (gd_state == gds_pio_get_data) { - pio_buff.data[pio_buff.index]=(u16)data; - pio_buff.index+=1; - if (pio_buff.size==pio_buff.index) + pio_buff.write((u16)data); + if (pio_buff.atEnd()) { - verify(pio_buff.next_state!=gds_pio_get_data); + verify(pio_buff.next_state != gds_pio_get_data); gd_set_state(pio_buff.next_state); } } @@ -1133,7 +1188,7 @@ void WriteMem_gdrom(u32 Addr, u32 data, u32 sz) { if (data != ATA_NOP && data != ATA_SOFT_RESET) verify(gd_state == gds_waitcmd); - ata_cmd.command = (u8)data; + ata_command = (u8)data; gd_set_state(gds_procata); } else @@ -1154,7 +1209,7 @@ static int getGDROMTicks() return 512; u32 len = SB_GDLEN == 0 ? 0x02000000 : SB_GDLEN; if (len - SB_GDLEND > 10240) - return 1000000; // Large transfers: GD-ROM transfer rate 1.8 MB/s + return 1100000; // Large transfers: GD-ROM transfer rate 1.8 MB/s else return std::min((u32)10240, len - SB_GDLEND) * 2; // Small transfers: Max G1 bus rate: 50 MHz x 16 bits } @@ -1163,7 +1218,7 @@ static int getGDROMTicks() } //is this needed ? -static int GDRomschd(int i, int c, int j) +static int GDRomschd(int tag, int cycles, int jitter, void *arg) { if (SecNumber.Status == GD_SEEK) { @@ -1175,7 +1230,7 @@ static int GDRomschd(int i, int c, int j) SecNumber.Status = GD_STANDBY; GDStatus.DSC = 1; } - if(!(SB_GDST&1) || !(SB_GDEN &1) || (read_buff.cache_size==0 && read_params.remaining_sectors==0)) + if (!(SB_GDST & 1) || !(SB_GDEN & 1) || (dma_buff.isEmpty() && read_params.remaining_sectors == 0)) return 0; u32 src = SB_GDSTARD; @@ -1190,7 +1245,7 @@ static int GDRomschd(int i, int c, int j) //if we don't have any more sectors to read if (read_params.remaining_sectors == 0) //make sure we don't underrun the cache :) - len = std::min(len, read_buff.cache_size); + len = std::min(len, dma_buff.getSize()); len = std::min(len, (u32)10240); // do we need to do this for GDROM DMA? @@ -1208,25 +1263,15 @@ static int GDRomschd(int i, int c, int j) u32 len_backup = len; if(1 == SB_GDDIR) { - while(len) + while (len) { - u32 buff_size =read_buff.cache_size; - if (buff_size==0) - { - verify(read_params.remaining_sectors>0); - //buffer is empty , fill it :) - FillReadBuffer(); - continue; - } + dma_buff.fill(read_params); + // transfer up to len bytes + const u32 buff_size = std::min(dma_buff.getSize(), len); - //transfer up to len bytes - if (buff_size>len) - buff_size=len; - WriteMemBlock_nommu_ptr(src,(u32*)&read_buff.cache[read_buff.cache_index], buff_size); - read_buff.cache_index+=buff_size; - read_buff.cache_size-=buff_size; - src+=buff_size; - len-=buff_size; + WriteMemBlock_nommu_ptr(src, (const u32 *)dma_buff.read(buff_size), buff_size); + src += buff_size; + len -= buff_size; } } else @@ -1242,16 +1287,10 @@ static int GDRomschd(int i, int c, int j) SB_GDST = 0; asic_RaiseInterrupt(holly_GDROM_DMA); } - //Read ALL sectors - if (read_params.remaining_sectors==0) - { - //And all buffer :p - if (read_buff.cache_size==0) - { - //verify(!SB_GDST&1) -> dc can do multi read dma - gd_set_state(gds_procpacketdone); - } - } + // Read ALL sectors and all buffer + if (read_params.remaining_sectors == 0 && dma_buff.isEmpty()) + //verify(!SB_GDST&1) -> dc can do multi read dma + gd_set_state(gds_procpacketdone); return getGDROMTicks(); } @@ -1275,7 +1314,7 @@ static void GDROM_DmaStart(u32 addr, u32 data) int ticks = getGDROMTicks(); if (ticks < SH4_TIMESLICE) { - ticks = GDRomschd(0,0,0); + ticks = GDRomschd(0, 0, 0, nullptr); } if (ticks) @@ -1297,7 +1336,7 @@ static void GDROM_DmaEnable(u32 addr, u32 data) void gdrom_reg_Init() { gdrom_schid = sh4_sched_register(0, &GDRomschd); - libCore_gdrom_disc_change(); + gd_disc_change(); } void gdrom_reg_Term() @@ -1323,6 +1362,7 @@ void gdrom_reg_Reset(bool hard) memcpy(GD_HardwareInfo.drive_info, "SE ", sizeof(GD_HardwareInfo.drive_info)); memcpy(GD_HardwareInfo.system_version, "Rev 6.43", sizeof(GD_HardwareInfo.system_version)); memcpy(GD_HardwareInfo.system_date, "990408", sizeof(GD_HardwareInfo.system_date)); + gdr::termDrive(); } SB_GDST = 0; SB_GDEN = 0; @@ -1334,9 +1374,9 @@ void gdrom_reg_Reset(bool hard) set_mode_offset = 0; read_params = {}; packet_cmd = {}; - read_buff = {}; - pio_buff = {}; - ata_cmd = {}; + dma_buff.clear(); + pio_buff.clear(); + ata_command = 0; cdda = {}; gd_disk_type = NoDisk; @@ -1350,7 +1390,7 @@ void gdrom_reg_Reset(bool hard) GDStatus = {}; ByteCount = {}; - libCore_gdrom_disc_change(); + gd_disc_change(); } namespace gdrom @@ -1367,10 +1407,9 @@ void serialize(Serializer& ser) ser << packet_cmd; ser << set_mode_offset; ser << read_params; - ser << read_buff; - ser << pio_buff; - ser << set_mode_offset; - ser << ata_cmd; + dma_buff.serialize(ser); + pio_buff.serialize(ser); + ser << ata_command; ser << cdda; ser << gd_state; ser << gd_disk_type; @@ -1397,19 +1436,17 @@ void deserialize(Deserializer& deser) deser >> packet_cmd; deser >> set_mode_offset; deser >> read_params; - if (deser.version() >= Deserializer::V17) - deser >> read_buff; - else - { + if (deser.version() >= Deserializer::V17) { + dma_buff.deserialize(deser); + } + else { deser >> packet_cmd; - read_buff.cache_size = 0; + dma_buff.clear(); } - deser >> pio_buff; - deser >> set_mode_offset; - deser >> ata_cmd; + pio_buff.deserialize(deser); + deser.skip(Deserializer::V44); // set_mode_offset (repeat) + deser >> ata_command; deser >> cdda; - if (deser.version() < Deserializer::V10) - cdda.status = (bool)cdda.status ? cdda_t::Playing : cdda_t::NoInfo; deser >> gd_state; deser >> gd_disk_type; deser >> data_write_mode; @@ -1422,8 +1459,6 @@ void deserialize(Deserializer& deser) deser >> SecNumber; deser >> GDStatus; deser >> ByteCount; - if (deser.version() <= Deserializer::VLAST_LIBRETRO) - deser.skip(); // GDROM_TICK } } diff --git a/core/hw/gdrom/gdromv3.h b/core/hw/gdrom/gdromv3.h index 98cf682b3..164c3c9e8 100644 --- a/core/hw/gdrom/gdromv3.h +++ b/core/hw/gdrom/gdromv3.h @@ -37,7 +37,7 @@ struct GD_StatusT struct { u32 CHECK:1; //Bit 0 (CHECK) : Becomes "1" when an error has occurred during execution of the command the previous time. - u32 res :1; //Bit 1 : Reserved + u32 :1; //Bit 1 : Reserved u32 CORR:1; //Bit 2 (CORR) : Indicates that a correctable error has occurred. u32 DRQ:1; //Bit 3 (DRQ) : Becomes "1" when preparations for data transfer between drive and host are completed. Information held in the Interrupt Reason Register becomes valid in the packet command when DRQ is set. u32 DSC:1; //Bit 4 (DSC) : Becomes "1" when seek processing is completed. @@ -73,13 +73,13 @@ struct GD_FeaturesT struct { u32 DMA:1;//Bit 0 (DMA): Send data for command in DMA mode. - u32 res :7;//not used - }CDRead; + u32 :7; + } CDRead; struct { u32 FeatureNumber:7;//Bit 6 - 0 (Feature Number): Set transfer mode by setting to 3. u32 Value :1;//not used - }SetFeature; + } SetFeature; u8 full; }; @@ -93,7 +93,7 @@ struct GD_InterruptReasonT { u32 CoD:1; //Bit 0 (CoD) : "0" indicates data and "1" indicates a command. u32 IO:1; //Bit 1 (IO) : "1" indicates transfer from device to host, and "0" from host to device. - u32 res :6;//not used + u32 :6; }; u8 full; }; @@ -164,26 +164,89 @@ struct packet_cmd_t }; }; -//Buffer for sector reads [dma] -struct read_buff_t +class DmaBuffer { - u32 cache_index; - u32 cache_size; - u8 cache[2352 * 32]; +public: + DmaBuffer() { + clear(); + } + bool isEmpty() const { + return size == 0; + } + u32 getSize() const { + return size; + } + void clear() { + size = 0; + index = 0; + } + + // Fill the cache with up to NSECT sectors if empty, using the passed read parameters + void fill(read_params_t& params); + // Return a pointer to the cache and advance the index by len bytes. len *must* be <= getSize() + const u8 *read(u32 len); + void serialize(Serializer& ser) const; + void deserialize(Deserializer& deser); + +private: + static constexpr u32 NSECT = 16; + u32 index; + u32 size; + u8 cache[2352 * NSECT] {}; }; -//pio buffer -struct pio_buff_t +class PioBuffer { +public: + PioBuffer() { + clear(); + } + bool isEmpty() const { + return size == 0; + } + // Returns true if the buffer has reached its capacity and can't be read from or written to + bool atEnd() const { + return index == size; + } + // in bytes + u32 getSize() const { + return size * sizeof(u16); + } + void clear() + { + next_state = gds_waitcmd; + size = 0; + index = 0; + } + u16 read() { + return _data[index++]; + } + const u16 *data() const { + return _data; + } + void write(u16 v) { + _data[index++] = v; + } + // Returns a pointer to fill the buffer and sets its size. Index is reset. + u16 *fill(u32 size) { + resetSize(size); + return &_data[0]; + } + // Sets the buffer capacity and resets the index. + void resetSize(u32 size) { + this->index = 0; + this->size = size / sizeof(u16); + } + void serialize(Serializer& ser) const; + void deserialize(Deserializer& deser); + gd_states next_state; + static constexpr u32 Capacity = 64_KB; + +private: u32 index; u32 size; - u16 data[0x10000>>1]; //64 kb -}; - -struct ata_cmd_t -{ - u8 command; + u16 _data[Capacity / 2] {}; }; struct cdda_t diff --git a/core/hw/holly/holly_intc.h b/core/hw/holly/holly_intc.h index 7589cca38..f05af4c3b 100644 --- a/core/hw/holly/holly_intc.h +++ b/core/hw/holly/holly_intc.h @@ -1,5 +1,81 @@ #pragma once -#include "types.h" + +enum HollyInterruptType +{ + holly_nrm = 0x0000, + holly_ext = 0x0100, + holly_err = 0x0200, +}; + +enum HollyInterruptID +{ + // asic9a /sh4 external holly normal [internal] + holly_RENDER_DONE_vd = holly_nrm | 0, //bit 0 = End of Render interrupt : Video + holly_RENDER_DONE_isp = holly_nrm | 1, //bit 1 = End of Render interrupt : ISP + holly_RENDER_DONE = holly_nrm | 2, //bit 2 = End of Render interrupt : TSP + + holly_SCANINT1 = holly_nrm | 3, //bit 3 = V Blank-in interrupt + holly_SCANINT2 = holly_nrm | 4, //bit 4 = V Blank-out interrupt + holly_HBLank = holly_nrm | 5, //bit 5 = H Blank-in interrupt + + holly_YUV_DMA = holly_nrm | 6, //bit 6 = End of Transferring interrupt : YUV + holly_OPAQUE = holly_nrm | 7, //bit 7 = End of Transferring interrupt : Opaque List + holly_OPAQUEMOD = holly_nrm | 8, //bit 8 = End of Transferring interrupt : Opaque Modifier Volume List + + holly_TRANS = holly_nrm | 9, //bit 9 = End of Transferring interrupt : Translucent List + holly_TRANSMOD = holly_nrm | 10, //bit 10 = End of Transferring interrupt : Translucent Modifier Volume List + holly_PVR_DMA = holly_nrm | 11, //bit 11 = End of DMA interrupt : PVR-DMA + holly_MAPLE_DMA = holly_nrm | 12, //bit 12 = End of DMA interrupt : Maple-DMA + + holly_MAPLE_VBOI = holly_nrm | 13, //bit 13 = Maple V blank over interrupt + holly_GDROM_DMA = holly_nrm | 14, //bit 14 = End of DMA interrupt : GD-DMA + holly_SPU_DMA = holly_nrm | 15, //bit 15 = End of DMA interrupt : AICA-DMA + + holly_EXT_DMA1 = holly_nrm | 16, //bit 16 = End of DMA interrupt : Ext-DMA1(External 1) + holly_EXT_DMA2 = holly_nrm | 17, //bit 17 = End of DMA interrupt : Ext-DMA2(External 2) + holly_DEV_DMA = holly_nrm | 18, //bit 18 = End of DMA interrupt : Dev-DMA(Development tool DMA) + + holly_CH2_DMA = holly_nrm | 19, //bit 19 = End of DMA interrupt : ch2-DMA + holly_PVR_SortDMA = holly_nrm | 20, //bit 20 = End of DMA interrupt : Sort-DMA (Transferring for alpha sorting) + holly_PUNCHTHRU = holly_nrm | 21, //bit 21 = End of Transferring interrupt : Punch Through List + + // asic9c/sh4 external holly external [EXTERNAL] + holly_GDROM_CMD = holly_ext | 0x00, //bit 0 = GD-ROM interrupt + holly_SPU_IRQ = holly_ext | 0x01, //bit 1 = AICA interrupt + holly_EXP_8BIT = holly_ext | 0x02, //bit 2 = Modem interrupt + holly_EXP_PCI = holly_ext | 0x03, //bit 3 = External Device interrupt + + // asic9b/sh4 external holly err only error [error] + //missing quite a few ehh ? + //bit 0 = RENDER : ISP out of Cache(Buffer over flow) + //bit 1 = RENDER : Hazard Processing of Strip Buffer + holly_PRIM_NOMEM = holly_err | 0x02, //bit 2 = TA : ISP/TSP Parameter Overflow + holly_MATR_NOMEM = holly_err | 0x03, //bit 3 = TA : Object List Pointer Overflow + //bit 4 = TA : Illegal Parameter + //bit 5 = TA : FIFO Overflow + //bit 6 = PVRIF : Illegal Address set + //bit 7 = PVRIF : DMA over run + holly_MAPLE_ILLADDR = holly_err | 0x08, //bit 8 = MAPLE : Illegal Address set + holly_MAPLE_OVERRUN = holly_err | 0x09, //bit 9 = MAPLE : DMA over run + holly_MAPLE_FIFO = holly_err | 0x0a, //bit 10 = MAPLE : Write FIFO overflow + holly_MAPLE_ILLCMD = holly_err | 0x0b, //bit 11 = MAPLE : Illegal command + //bit 12 = G1 : Illegal Address set + //bit 13 = G1 : GD-DMA over run + //bit 14 = G1 : ROM/FLASH access at GD-DMA + holly_AICA_ILLADDR = holly_err | 0x0f, //bit 15 = G2 : AICA-DMA Illegal Address set + holly_EXT1_ILLADDR = holly_err | 0x10, //bit 16 = G2 : Ext-DMA1 Illegal Address set + holly_EXT2_ILLADDR = holly_err | 0x11, //bit 17 = G2 : Ext-DMA2 Illegal Address set + holly_DEV_ILLADDR = holly_err | 0x12, //bit 18 = G2 : Dev-DMA Illegal Address set + holly_AICA_OVERRUN = holly_err | 0x13, //bit 19 = G2 : AICA-DMA over run + holly_EXT1_OVERRUN = holly_err | 0x14, //bit 20 = G2 : Ext-DMA1 over run + holly_EXT2_OVERRUN = holly_err | 0x15, //bit 21 = G2 : Ext-DMA2 over run + holly_DEV_OVERRUN = holly_err | 0x16, //bit 22 = G2 : Dev-DMA over run + //bit 23 = G2 : AICA-DMA Time out + //bit 24 = G2 : Ext-DMA1 Time out + //bit 25 = G2 : Ext-DMA2 Time out + //bit 26 = G2 : Dev-DMA Time out + //bit 27 = G2 : Time out in CPU accessing +}; void asic_RaiseInterrupt(HollyInterruptID inter); void asic_CancelInterrupt(HollyInterruptID inter); @@ -8,4 +84,4 @@ void asic_RaiseInterruptBothCLX(HollyInterruptID inter); //Init/Res/Term for regs void asic_reg_Init(); void asic_reg_Term(); -void asic_reg_Reset(bool Manual); +void asic_reg_Reset(bool hard); diff --git a/core/hw/holly/sb.cpp b/core/hw/holly/sb.cpp index 12e4c5a8c..5966141d4 100644 --- a/core/hw/holly/sb.cpp +++ b/core/hw/holly/sb.cpp @@ -14,6 +14,7 @@ #include "emulator.h" #include "hw/bba/bba.h" #include "serialize.h" +#include u32 sb_regs[0x540]; HollyRegisters hollyRegs; @@ -704,18 +705,7 @@ void sb_serialize(Serializer& ser) void sb_deserialize(Deserializer& deser) { - if (deser.version() <= Deserializer::VLAST_LIBRETRO) - { - for (u32& reg : sb_regs) - { - deser.skip(); // regs.data[i].flags - deser >> reg; - } - } - else - { - deser >> sb_regs; - } + deser >> sb_regs; if (deser.version() < Deserializer::V33) deser >> SB_ISTNRM; if (deser.version() >= Deserializer::V24) @@ -729,9 +719,6 @@ void sb_deserialize(Deserializer& deser) deser.skip(); // SB_FFST_rc; deser.skip(); // SB_FFST; } - if (deser.version() >= Deserializer::V15) - deser >> SB_ADST; - else - SB_ADST = 0; + deser >> SB_ADST; } } diff --git a/core/hw/holly/sb.h b/core/hw/holly/sb.h index a45899b31..1eec402ea 100644 --- a/core/hw/holly/sb.h +++ b/core/hw/holly/sb.h @@ -5,7 +5,6 @@ #pragma once #include "types.h" #include "hw/hwreg.h" -#include u32 sb_ReadMem(u32 addr); void sb_WriteMem(u32 addr, u32 data); diff --git a/core/hw/holly/sb_mem.cpp b/core/hw/holly/sb_mem.cpp index fc2a52f44..1bfc6880c 100644 --- a/core/hw/holly/sb_mem.cpp +++ b/core/hw/holly/sb_mem.cpp @@ -11,6 +11,7 @@ #include "hw/gdrom/gdrom_if.h" #include "hw/modem/modem.h" #include "hw/naomi/naomi.h" +#include "hw/naomi/systemsp.h" #include "hw/pvr/pvr_mem.h" #include "hw/mem/addrspace.h" #include "hw/bba/bba.h" @@ -62,21 +63,22 @@ T DYNACALL ReadMem_area0(u32 paddr) break; case 1: // Flash memory - if (addr < 0x00200000 + settings.platform.flash_size) - { - if constexpr (Mirror) + if constexpr (System != DC_PLATFORM_SYSTEMSP) + if (addr < 0x00200000 + settings.platform.flash_size) { - INFO_LOG(MEMORY, "Read from area0 Flash mirror [Unassigned], addr=%x", addr); - return 0; + if constexpr (Mirror) + { + INFO_LOG(MEMORY, "Read from area0 Flash mirror [Unassigned], addr=%x", addr); + return 0; + } + return nvmem::readFlash(addr, sz); } - return nvmem::readFlash(addr, sz); - } break; case 2: // GD-ROM / Naomi/AW cart if (addr >= 0x005F7000 && addr <= 0x005F70FF) { - if (System == DC_PLATFORM_DREAMCAST) + if constexpr (System == DC_PLATFORM_DREAMCAST) return (T)ReadMem_gdrom(addr, sz); else return (T)ReadMem_naomi(addr, sz); @@ -97,15 +99,14 @@ T DYNACALL ReadMem_area0(u32 paddr) // MODEM if (addr <= 0x006007FF) { - if (System == DC_PLATFORM_DREAMCAST) + if constexpr (System == DC_PLATFORM_DREAMCAST) { if (!config::EmulateBBA) return (T)ModemReadMem_A0_006(addr, sz); else return (T)0; } - else - { + else if constexpr (System == DC_PLATFORM_ATOMISWAVE) { return (T)libExtDevice_ReadMem_A0_006(addr, sz); } } @@ -126,12 +127,17 @@ T DYNACALL ReadMem_area0(u32 paddr) default: // G2 Ext area - if (System == DC_PLATFORM_NAOMI || System == DC_PLATFORM_NAOMI2) + if constexpr (System == DC_PLATFORM_NAOMI || System == DC_PLATFORM_NAOMI2) return (T)g2ext_readMem(addr, sz); - else if (config::EmulateBBA) - return (T)bba_ReadMem(addr, sz); + else if constexpr (System == DC_PLATFORM_SYSTEMSP) + return systemsp::readMemArea0(addr); else - return (T)0; + { + if (config::EmulateBBA) + return (T)bba_ReadMem(addr, sz); + else + return (T)0; + } } INFO_LOG(MEMORY, "Read from area0<%d> not implemented [Unassigned], addr=%x", sz, addr); return 0; @@ -151,7 +157,7 @@ void DYNACALL WriteMem_area0(u32 paddr, T data) // System/Boot ROM if constexpr (!Mirror) { - if (System == DC_PLATFORM_ATOMISWAVE) + if constexpr (System == DC_PLATFORM_ATOMISWAVE) { if (addr < 0x20000) { @@ -206,16 +212,16 @@ void DYNACALL WriteMem_area0(u32 paddr, T data) // MODEM if (/* addr >= 0x00600000) && */ addr <= 0x006007FF) { - if (System == DC_PLATFORM_DREAMCAST) + if constexpr (System == DC_PLATFORM_DREAMCAST) { if (!config::EmulateBBA) ModemWriteMem_A0_006(addr, data, sz); + return; } - else - { + else if constexpr (System == DC_PLATFORM_ATOMISWAVE) { libExtDevice_WriteMem_A0_006(addr, data, sz); + return; } - return; } // AICA sound registers if (addr >= 0x00700000 && addr <= 0x00707FFF) @@ -240,10 +246,15 @@ void DYNACALL WriteMem_area0(u32 paddr, T data) default: // G2 Ext area - if (System == DC_PLATFORM_NAOMI || System == DC_PLATFORM_NAOMI2) + if constexpr (System == DC_PLATFORM_NAOMI || System == DC_PLATFORM_NAOMI2) g2ext_writeMem(addr, data, sz); - else if (config::EmulateBBA) - bba_WriteMem(addr, data, sz); + else if constexpr (System == DC_PLATFORM_SYSTEMSP) + systemsp::writeMemArea0(addr, data); + else + { + if (config::EmulateBBA) + bba_WriteMem(addr, data, sz); + } return; } INFO_LOG(MEMORY, "Write to area0_32 not implemented [Unassigned], addr=%x,data=%x,size=%d", addr, data, sz); @@ -306,13 +317,15 @@ void map_area0_init() area0_handler = registerHandler(DC_PLATFORM_ATOMISWAVE, false); area0_mirror_handler = registerHandler(DC_PLATFORM_ATOMISWAVE, true); break; + case DC_PLATFORM_SYSTEMSP: + area0_handler = registerHandler(DC_PLATFORM_SYSTEMSP, false); + area0_mirror_handler = registerHandler(DC_PLATFORM_SYSTEMSP, true); + break; } #undef registerHandler } void map_area0(u32 base) { - verify(base<0xE0); - addrspace::mapHandler(area0_handler, 0x00 | base, 0x01 | base); addrspace::mapHandler(area0_mirror_handler, 0x02 | base, 0x03 | base); diff --git a/core/hw/hwreg.h b/core/hw/hwreg.h index 3995f4692..902bdf5b6 100644 --- a/core/hw/hwreg.h +++ b/core/hw/hwreg.h @@ -291,3 +291,29 @@ void WriteMemArr(u8 *array, u32 addr, T data) { *(T *)&array[addr] = data; } + +class SerialPort +{ +public: + class Pipe + { + public: + // Serial TX + virtual void write(u8 data) { } + virtual void sendBreak() { } + // RX buffer Size + virtual int available() { return 0; } + // Serial RX + virtual u8 read() { return 0; } + + virtual ~Pipe() = default; + }; + + virtual void setPipe(Pipe *pipe) = 0; + virtual void updateStatus() = 0; + virtual void receiveBreak() { + die("unsupported"); + } + + virtual ~SerialPort() = default; +}; diff --git a/core/hw/maple/maple_cfg.cpp b/core/hw/maple/maple_cfg.cpp index 6195efe36..72245b9ec 100644 --- a/core/hw/maple/maple_cfg.cpp +++ b/core/hw/maple/maple_cfg.cpp @@ -2,6 +2,7 @@ #include "maple_helper.h" #include "maple_if.h" #include "hw/naomi/naomi_cart.h" +#include "hw/naomi/card_reader.h" #include "cfg/option.h" #include "stdclass.h" #include "serialize.h" @@ -9,12 +10,13 @@ MapleInputState mapleInputState[4]; extern bool maple_ddt_pending_reset; extern std::vector>> mapleDmaOut; +extern bool SDCKBOccupied; void (*MapleConfigMap::UpdateVibration)(u32 port, float power, float inclination, u32 duration_ms); -static u8 GetBtFromSgn(s8 val) +static u8 GetBtFromSgn(s16 val) { - return val+128; + return (val + 32768) >> 8; } u32 awave_button_mapping[32] = { @@ -80,17 +82,17 @@ void MapleConfigMap::GetInput(PlainJoystickState* pjs) pjs->joy[PJAI_Y2] = GetBtFromSgn(inputState.fullAxes[PJAI_Y2]); pjs->joy[PJAI_X3] = GetBtFromSgn(inputState.fullAxes[PJAI_X3]); pjs->joy[PJAI_Y3] = GetBtFromSgn(inputState.fullAxes[PJAI_Y3]); - pjs->trigger[PJTI_R] = inputState.halfAxes[PJTI_R]; - pjs->trigger[PJTI_L] = inputState.halfAxes[PJTI_L]; - pjs->trigger[PJTI_L2] = inputState.halfAxes[PJTI_L2]; - pjs->trigger[PJTI_R2] = inputState.halfAxes[PJTI_R2]; + pjs->trigger[PJTI_R] = inputState.halfAxes[PJTI_R] >> 8; + pjs->trigger[PJTI_L] = inputState.halfAxes[PJTI_L] >> 8; + pjs->trigger[PJTI_L2] = inputState.halfAxes[PJTI_L2] >> 8; + pjs->trigger[PJTI_R2] = inputState.halfAxes[PJTI_R2] >> 8; } else if (settings.platform.isAtomiswave()) { #ifdef LIBRETRO pjs->kcode = inputState.kcode; #else - const u32* mapping = settings.input.JammaSetup == JVS::LightGun ? awavelg_button_mapping : awave_button_mapping; + const u32* mapping = settings.input.lightgunGame ? awavelg_button_mapping : awave_button_mapping; pjs->kcode = ~0; for (u32 i = 0; i < std::size(awave_button_mapping); i++) { @@ -130,10 +132,16 @@ void MapleConfigMap::GetInput(PlainJoystickState* pjs) switch (NaomiGameInputs->axes[axis].axis) { case 4: - pjs->joy[axis] = inputState.halfAxes[PJTI_R]; + pjs->joy[axis] = inputState.halfAxes[PJTI_R] >> 8; break; case 5: - pjs->joy[axis] = inputState.halfAxes[PJTI_L]; + pjs->joy[axis] = inputState.halfAxes[PJTI_L] >> 8; + break; + case 6: + pjs->joy[axis] = inputState.halfAxes[PJTI_R2] >> 8; + break; + case 7: + pjs->joy[axis] = inputState.halfAxes[PJTI_L2] >> 8; break; default: pjs->joy[axis] = 0; @@ -153,8 +161,8 @@ void MapleConfigMap::GetInput(PlainJoystickState* pjs) { pjs->joy[PJAI_X1] = GetBtFromSgn(inputState.fullAxes[PJAI_X1]); pjs->joy[PJAI_Y1] = GetBtFromSgn(inputState.fullAxes[PJAI_Y1]); - pjs->joy[PJAI_X2] = inputState.halfAxes[PJTI_R]; - pjs->joy[PJAI_Y2] = inputState.halfAxes[PJTI_L]; + pjs->joy[PJAI_X2] = inputState.halfAxes[PJTI_R] >> 8; + pjs->joy[PJAI_Y2] = inputState.halfAxes[PJTI_L] >> 8; } } } @@ -207,27 +215,33 @@ static void mcfg_Create(MapleDeviceType type, u32 bus, u32 port, s32 player_num { delete MapleDevices[bus][port]; maple_device* dev = maple_Create(type); - dev->Setup(maple_GetAddress(bus, port), player_num); - dev->config = new MapleConfigMap(dev); - dev->OnSetup(); - MapleDevices[bus][port] = dev; + dev->Setup(bus, port, player_num); } static void createNaomiDevices() { + const std::string& gameId = settings.content.gameId; mcfg_Create(MDT_NaomiJamma, 0, 5); - if (settings.input.JammaSetup == JVS::Keyboard) + if (gameId == "THE TYPING OF THE DEAD" + || gameId == " LUPIN THE THIRD -THE TYPING-" + || gameId == "------La Keyboardxyu------") { + INFO_LOG(MAPLE, "Enabling keyboard for game %s", gameId.c_str()); mcfg_Create(MDT_Keyboard, 1, 5, 0); mcfg_Create(MDT_Keyboard, 2, 5, 1); + settings.input.keyboardGame = true; } - else if (settings.content.gameId.substr(0, 8) == "MKG TKOB" - || settings.content.gameId == "VIRTUA FIGHTER 4 JAPAN" - || settings.content.gameId == "VF4 EVOLUTION JAPAN" - || settings.content.gameId == "VF4 FINAL TUNED JAPAN") + else if (gameId.substr(0, 8) == "MKG TKOB" + || gameId == "VIRTUA FIGHTER 4 JAPAN" + || gameId == "VF4 EVOLUTION JAPAN" + || gameId == "VF4 FINAL TUNED JAPAN") { mcfg_Create(MDT_RFIDReaderWriter, 1, 5, 0); mcfg_Create(MDT_RFIDReaderWriter, 2, 5, 1); + if (gameId.substr(0, 8) == "MKG TKOB") { + insertRfidCard(0); + insertRfidCard(1); + } } else { @@ -238,10 +252,15 @@ static void createNaomiDevices() mcfg_Create(MDT_SegaController, 2, 5); mcfg_Create(MDT_SegaVMU, 2, 0); } + if (gameId == " DERBY OWNERS CLUB WE ---------" + || gameId == " DERBY OWNERS CLUB ------------" + || gameId == " DERBY OWNERS CLUB II-----------") + card_reader::derbyInit(); } static void createAtomiswaveDevices() { + const std::string& gameId = settings.content.gameId; // Looks like two controllers needs to be on bus 0 and 1 for digital inputs // Then other devices on port 2 and 3 for analog axes, light guns, ... mcfg_Create(MDT_SegaController, 0, 5); @@ -254,30 +273,39 @@ static void createAtomiswaveDevices() // Faster Than Speed needs 1 std controller on port 0 (digital inputs) and one on port 2 (analog axes) // Maximum Speed same } - else if (settings.input.JammaSetup == JVS::FourPlayers) + else if (gameId == "GUILTY GEAR isuka" + || gameId == "Dirty Pigskin Football") { // 4 players + INFO_LOG(MAPLE, "Enabling 4-player setup for game %s", gameId.c_str()); mcfg_Create(MDT_SegaController, 2, 5); mcfg_Create(MDT_SegaController, 3, 5); + settings.input.fourPlayerGames = true; } - else if (settings.input.JammaSetup == JVS::LightGun) + else if (gameId == "Sports Shooting USA" + || gameId == "SEGA CLAY CHALLENGE" + || gameId == "RANGER MISSION" + || gameId == "EXTREME HUNTING" + || gameId == "Fixed BOOT strapper") // Extreme hunting 2 { - // Clay Challenge needs 2 std controllers on port 0 & 1 (digital in) and light guns on port 2 & 3 - // Sports Shooting same + // needs 2 std controllers on port 0 & 1 (digital in) and light guns on port 2 & 3 + INFO_LOG(MAPLE, "Enabling lightgun setup for game %s", gameId.c_str()); mcfg_Create(MDT_LightGun, 2, 5, 0); mcfg_Create(MDT_LightGun, 3, 5, 1); + settings.input.lightgunGame = true; } - else if (settings.input.JammaSetup == JVS::SegaMarineFishing || settings.input.JammaSetup == JVS::RotaryEncoders) + else if (gameId == "BASS FISHING SIMULATOR VER.A" || gameId == "DRIVE") { // Sega Bass Fishing Challenge needs a mouse (track-ball) on port 2 // Waiwai drive needs two track-balls mcfg_Create(MDT_Mouse, 2, 5, 0); mcfg_Create(MDT_Mouse, 3, 5, 1); - if (settings.content.gameId == "DRIVE") + if (gameId == "DRIVE") { MapleDevices[2][5]->config->invertMouseY = true; MapleDevices[3][5]->config->invertMouseY = true; } + settings.input.mouseGame = true; } } @@ -288,7 +316,8 @@ static void createDreamcastDevices() switch (config::MapleMainDevices[bus]) { case MDT_SegaController: - mcfg_Create(MDT_SegaController, bus, 5); + case MDT_SegaControllerXL: + mcfg_Create(config::MapleMainDevices[bus], bus, 5); if (config::MapleExpansionDevices[bus][0] != MDT_None) mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0); if (config::MapleExpansionDevices[bus][1] != MDT_None) @@ -300,7 +329,6 @@ static void createDreamcastDevices() case MDT_MaracasController: case MDT_FishingController: case MDT_PopnMusicController: - case MDT_RacingController: case MDT_DenshaDeGoController: case MDT_Dreameye: mcfg_Create(config::MapleMainDevices[bus], bus, 5); @@ -312,6 +340,7 @@ static void createDreamcastDevices() case MDT_LightGun: case MDT_TwinStick: case MDT_AsciiStick: + case MDT_RacingController: mcfg_Create(config::MapleMainDevices[bus], bus, 5); if (config::MapleExpansionDevices[bus][0] != MDT_None) mcfg_Create(config::MapleExpansionDevices[bus][0], bus, 0); @@ -349,6 +378,10 @@ static void vmuDigest() void mcfg_CreateDevices() { + settings.input.lightgunGame = false; + settings.input.keyboardGame = false; + settings.input.mouseGame = false; + settings.input.fourPlayerGames = false; switch (settings.platform.system) { case DC_PLATFORM_DREAMCAST: @@ -361,6 +394,10 @@ void mcfg_CreateDevices() case DC_PLATFORM_ATOMISWAVE: createAtomiswaveDevices(); break; + case DC_PLATFORM_SYSTEMSP: + if (settings.content.gameId == "INW PUPPY 2008 VER1.001") + settings.input.lightgunGame = true; + return; default: die("Unknown system"); break; @@ -368,15 +405,17 @@ void mcfg_CreateDevices() vmuDigest(); } -void mcfg_DestroyDevices() +// Don't destroy the JVS MIE if full is false +void mcfg_DestroyDevices(bool full) { for (int i = 0; i < MAPLE_PORTS; i++) - for (int j=0;j<=5;j++) + for (int j = 0; j <= 5; j++) { - if (MapleDevices[i][j] != NULL) + if (MapleDevices[i][j] != nullptr + && (full || MapleDevices[i][j]->get_device_type() != MDT_NaomiJamma)) { delete MapleDevices[i][j]; - MapleDevices[i][j] = NULL; + MapleDevices[i][j] = nullptr; } } } @@ -384,6 +423,7 @@ void mcfg_DestroyDevices() void mcfg_SerializeDevices(Serializer& ser) { ser << maple_ddt_pending_reset; + ser << SDCKBOccupied; ser << (u32)mapleDmaOut.size(); for (const auto& pair : mapleDmaOut) { @@ -407,7 +447,7 @@ void mcfg_SerializeDevices(Serializer& ser) void mcfg_DeserializeDevices(Deserializer& deser) { if (!deser.rollback()) - mcfg_DestroyDevices(); + mcfg_DestroyDevices(false); u8 eeprom[sizeof(maple_naomi_jamma::eeprom)]; if (deser.version() < Deserializer::V23) { @@ -416,6 +456,8 @@ void mcfg_DeserializeDevices(Deserializer& deser) deser.skip(); // EEPROM_loaded } deser >> maple_ddt_pending_reset; + if (deser.version() >= Deserializer::V47) + deser >> SDCKBOccupied; mapleDmaOut.clear(); if (deser.version() >= Deserializer::V23) { @@ -439,7 +481,7 @@ void mcfg_DeserializeDevices(Deserializer& deser) deser >> deviceType; if (deviceType != MDT_None) { - if (!deser.rollback()) + if (!deser.rollback() && deviceType != MDT_NaomiJamma) mcfg_Create((MapleDeviceType)deviceType, i, j); MapleDevices[i][j]->deserialize(deser); } @@ -447,3 +489,10 @@ void mcfg_DeserializeDevices(Deserializer& deser) if (deser.version() < Deserializer::V23 && EEPROM != nullptr) memcpy(EEPROM, eeprom, sizeof(eeprom)); } + +maple_naomi_jamma *getMieDevice() +{ + if (MapleDevices[0][5] == nullptr || MapleDevices[0][5]->get_device_type() != MDT_NaomiJamma) + return nullptr; + return (maple_naomi_jamma *)MapleDevices[0][5]; +} diff --git a/core/hw/maple/maple_cfg.h b/core/hw/maple/maple_cfg.h index b14b6299a..404d7e86f 100644 --- a/core/hw/maple/maple_cfg.h +++ b/core/hw/maple/maple_cfg.h @@ -22,6 +22,7 @@ enum MapleDeviceType MDT_RacingController = 15, MDT_DenshaDeGoController = 16, MDT_Dreameye = 17, + MDT_SegaControllerXL = 18, MDT_Count }; @@ -91,8 +92,8 @@ struct MapleInputState } u32 kcode = ~0; - u8 halfAxes[PJTI_Count]; // LT, RT, 2, 3 - int8_t fullAxes[PJAI_Count]; // Left X, Y, Right X, Y, Other X, Other Y + u16 halfAxes[PJTI_Count]; // LT, RT, 2, 3 + int16_t fullAxes[PJAI_Count]; // Left X, Y, Right X, Y, Other X, Other Y u8 mouseButtons = ~0; struct { int x = -1; @@ -111,7 +112,7 @@ struct MapleInputState extern MapleInputState mapleInputState[4]; void mcfg_CreateDevices(); -void mcfg_DestroyDevices(); +void mcfg_DestroyDevices(bool full = true); void mcfg_SerializeDevices(Serializer& ser); void mcfg_DeserializeDevices(Deserializer& deser); @@ -120,3 +121,6 @@ void push_vmu_screen(int bus_id, int bus_port, u8* buffer); void insertRfidCard(int playerNum); const u8 *getRfidCardData(int playerNum); void setRfidCardData(int playerNum, u8 *data); + +struct maple_naomi_jamma; +maple_naomi_jamma *getMieDevice(); diff --git a/core/hw/maple/maple_devs.cpp b/core/hw/maple/maple_devs.cpp index 76e898bd9..33e76b772 100755 --- a/core/hw/maple/maple_devs.cpp +++ b/core/hw/maple/maple_devs.cpp @@ -3,13 +3,14 @@ #include "maple_helper.h" #include "maple_if.h" #include "hw/pvr/spg.h" -#include "oslib/audiostream.h" +#include "audio/audiostream.h" #include "oslib/oslib.h" +#include "oslib/storage.h" #include "hw/aica/sgc_if.h" #include "cfg/option.h" #include -#include -#include +#include +#include const char* maple_sega_controller_name = "Dreamcast Controller"; const char* maple_sega_vmu_name = "Visual Memory"; @@ -31,15 +32,19 @@ const char* maple_densha_controller_name = "TAITO 001 Controller"; const char* maple_sega_brand = "Produced By or Under License From SEGA ENTERPRISES,LTD."; //fill in the info -void maple_device::Setup(u32 port, int playerNum) +void maple_device::Setup(u32 bus, u32 port, int playerNum) { - maple_port = port; - bus_port = maple_GetPort(port); - bus_id = maple_GetBusId(port); + maple_port = (bus << 6) | (1 << port); + bus_port = port; + bus_id = bus; logical_port[0] = 'A' + bus_id; logical_port[1] = bus_port == 5 ? 'x' : '1' + bus_port; logical_port[2] = 0; player_num = playerNum == -1 ? bus_id : playerNum; + + config = new MapleConfigMap(this); + OnSetup(); + MapleDevices[bus][port] = this; } maple_device::~maple_device() { @@ -153,7 +158,15 @@ struct maple_sega_controller: maple_base //2 (Maximum current consumption) w16(get_device_current(1)); - return cmd == MDC_DeviceRequest ? MDRS_DeviceStatus : MDRS_DeviceStatusAll; + if (cmd == MDC_AllStatusReq) + { + const char *extra = "Version 1.010,1998/09/28,315-6211-AB ,Analog Module : The 4th Edition.5/8 +DF"; + wptr(extra, strlen(extra)); + return MDRS_DeviceStatusAll; + } + else { + return MDRS_DeviceStatus; + } //controller condition case MDCF_GetCondition: @@ -323,10 +336,11 @@ u8 vmu_default[] = { struct maple_sega_vmu: maple_base { - FILE* file; - u8 flash_data[128*1024]; + FILE *file = nullptr; + u8 flash_data[128_KB]; u8 lcd_data[192]; u8 lcd_data_decoded[48*32]; + bool fullSaveNeeded = false; MapleDeviceType get_device_type() override { @@ -352,11 +366,28 @@ struct maple_sega_vmu: maple_base config->SetImage(lcd_data_decoded); break; } + fullSaveNeeded = true; + } + + bool fullSave() + { + if (file == nullptr) + return false; + if (std::fseek(file, 0, SEEK_SET) != 0) { + ERROR_LOG(MAPLE, "VMU %s: I/O error", logical_port); + return false; + } + if (std::fwrite(flash_data, sizeof(flash_data), 1, file) != 1) { + ERROR_LOG(MAPLE, "Failed to write the VMU %s to disk", logical_port); + return false; + } + fullSaveNeeded = false; + return true; } void initializeVmu() { - INFO_LOG(MAPLE, "Initialising empty VMU..."); + INFO_LOG(MAPLE, "Initialising empty VMU %s...", logical_port); uLongf dec_sz = sizeof(flash_data); int rv = uncompress(flash_data, &dec_sz, vmu_default, sizeof(vmu_default)); @@ -364,34 +395,44 @@ struct maple_sega_vmu: maple_base verify(rv == Z_OK); verify(dec_sz == sizeof(flash_data)); - if (file != nullptr) - { - if (std::fwrite(flash_data, sizeof(flash_data), 1, file) != 1) - WARN_LOG(MAPLE, "Failed to write the VMU to disk"); - if (std::fseek(file, 0, SEEK_SET) != 0) - WARN_LOG(MAPLE, "VMU: I/O error"); - } + fullSave(); } void OnSetup() override { memset(flash_data, 0, sizeof(flash_data)); memset(lcd_data, 0, sizeof(lcd_data)); - std::string apath = hostfs::getVmuPath(logical_port); - - file = nowide::fopen(apath.c_str(), "rb+"); - if (file == nullptr) - { - INFO_LOG(MAPLE, "Unable to open VMU save file \"%s\", creating new file", apath.c_str()); - file = nowide::fopen(apath.c_str(), "wb+"); - if (file == nullptr) - ERROR_LOG(MAPLE, "Failed to create VMU save file \"%s\"", apath.c_str()); - initializeVmu(); - } - - if (file != nullptr) - if (std::fread(flash_data, sizeof(flash_data), 1, file) != 1) - WARN_LOG(MAPLE, "Failed to read the VMU from disk"); + + // Load existing vmu file if found + std::string rpath = hostfs::getVmuPath(logical_port, false); + // this might be a storage url + FILE *rfile = hostfs::storage().openFile(rpath, "rb"); + if (rfile == nullptr) { + INFO_LOG(MAPLE, "Unable to open VMU file \"%s\", creating new file", rpath.c_str()); + } + else + { + if (std::fread(flash_data, sizeof(flash_data), 1, rfile) != 1) + WARN_LOG(MAPLE, "Failed to read the VMU file \"%s\" from disk", rpath.c_str()); + std::fclose(rfile); + } + // Open or create the vmu file to save to + std::string wpath = hostfs::getVmuPath(logical_port, true); + file = nowide::fopen(wpath.c_str(), "rb+"); + if (file == nullptr) + { + file = nowide::fopen(wpath.c_str(), "wb+"); + if (file == nullptr) { + ERROR_LOG(MAPLE, "Failed to create VMU save file \"%s\"", wpath.c_str()); + } + else if (rfile != nullptr) + { + // VMU file is being renamed so save it fully now + // and delete the old file + if (fullSave()) + nowide::remove(rpath.c_str()); + } + } u8 sum = 0; for (u32 i = 0; i < sizeof(flash_data); i++) @@ -400,6 +441,7 @@ struct maple_sega_vmu: maple_base if (sum == 0) // This means the existing VMU file is completely empty and needs to be recreated initializeVmu(); + fullSaveNeeded = false; } ~maple_sega_vmu() override @@ -440,7 +482,15 @@ struct maple_sega_vmu: maple_base //2 w16(0x0082); // 13 mA - return cmd == MDC_DeviceRequest ? MDRS_DeviceStatus : MDRS_DeviceStatusAll; + if (cmd == MDC_AllStatusReq) + { + const char *extra = "Version 1.005,1999/04/15,315-6208-03,SEGA Visual Memory System BIOS Produced by "; + wptr(extra, strlen(extra)); + return MDRS_DeviceStatusAll; + } + else { + return MDRS_DeviceStatus; + } //in[0] is function used //out[0] is function used @@ -617,17 +667,19 @@ struct maple_sega_vmu: maple_base if (file != nullptr) { - if (std::fseek(file, write_adr, SEEK_SET) != 0 + if (fullSaveNeeded) { + if (!fullSave()) + return MDRE_FileError; + } + else if (std::fseek(file, write_adr, SEEK_SET) != 0 || std::fwrite(&flash_data[write_adr], write_len, 1, file) != 1) { - WARN_LOG(MAPLE, "Failed to save VMU %s: I/O error", logical_port); + ERROR_LOG(MAPLE, "Failed to save VMU %s: I/O error", logical_port); return MDRE_FileError; // I/O error } - std::fflush(file); } - else - { - INFO_LOG(MAPLE, "Failed to save VMU %s data", logical_port); + else { + WARN_LOG(MAPLE, "Failed to save VMU %s data", logical_port); } return MDRS_DeviceReply; } @@ -635,7 +687,7 @@ struct maple_sega_vmu: maple_base case MFID_2_LCD: { DEBUG_LOG(MAPLE, "VMU %s LCD write", logical_port); - r32(); + r32(); // PT, phase, block# rptr(lcd_data,192); u8 white=0xff,black=0x00; @@ -962,7 +1014,15 @@ struct maple_sega_purupuru : maple_base //2 w16(0x0640); // 160 mA - return cmd == MDC_DeviceRequest ? MDRS_DeviceStatus : MDRS_DeviceStatusAll; + if (cmd == MDC_AllStatusReq) + { + const char *extra = "Version 1.000,1998/11/10,315-6211-AH ,Vibration Motor:1,Fm:4 - 30Hz,Pow:7 "; + wptr(extra, strlen(extra)); + return MDRS_DeviceStatusAll; + } + else { + return MDRS_DeviceStatus; + } //get last vibration case MDCF_GetCondition: @@ -1286,12 +1346,8 @@ struct maple_lightgun : maple_base //2 key code w16(transform_kcode(pjs.kcode)); - //not used - //2 - w16(0xFFFF); - - //not used - //4 + //6 analog (not used) + w16(0); w32(0x80808080); } return MDRS_DataTransfer; @@ -1509,9 +1565,7 @@ struct maple_racing_controller: maple_sega_controller // byte 2: R2 L2 D2 U2 D X Y Z // byte 3: R L D U St A B C - return 0xfe003700; // Steering + accelerator/brake unit: Ra,La,Da,Ua,A,B,Start,A1,A2,A3,A5,A6 - // (A5 & A6 only valid when the accelerator/brake unit is connected.) - //return 0xfe000700; // Steering only + return 0xfe000700; // Steering only: Ra,La,Da,Ua,A,B,Start,A1,A2,A3 } u16 getButtonState(const PlainJoystickState &pjs) override @@ -1538,9 +1592,6 @@ struct maple_racing_controller: maple_sega_controller case 0: return pjs.trigger[PJTI_R]; // A1: lever, 0 at rest case 1: return pjs.trigger[PJTI_L]; // A2: lever, 0 at rest case 2: return pjs.joy[PJAI_X1]; // A3: 0-0xff, 0x80 at rest - // (A5 and A6 are only valid when the accelerator/brake unit is connected) - case 4: return pjs.trigger[PJTI_R2]; // A5: lever, 0 at rest - case 5: return pjs.trigger[PJTI_L2]; // A6: lever, 0 at rest default: return 0x80; // unused } } @@ -1591,6 +1642,51 @@ struct maple_densha_controller: maple_sega_controller } }; +struct FullController : maple_sega_controller +{ + u32 get_capabilities() override + { + // byte 0: 0 0 0 0 0 0 0 0 + // byte 1: 0 0 a5 a4 a3 a2 a1 a0 + // byte 2: R2 L2 D2 U2 D X Y Z + // byte 3: R L D U St A B C + return 0xffff3f00; // 6 axes, all buttons + } + + u16 getButtonState(const PlainJoystickState &pjs) override + { + u32 kcode = pjs.kcode; + mutualExclusion(kcode, DC_DPAD_UP | DC_DPAD_DOWN); + mutualExclusion(kcode, DC_DPAD_LEFT | DC_DPAD_RIGHT); + mutualExclusion(kcode, DC_DPAD2_UP | DC_DPAD2_DOWN); + mutualExclusion(kcode, DC_DPAD2_LEFT | DC_DPAD2_RIGHT); + return kcode; + } + + u32 getAnalogAxis(int index, const PlainJoystickState &pjs) override + { + if (index == 4 || index == 5) + { + // Limit the magnitude of the analog axes to 128 + s8 xaxis = pjs.joy[PJAI_X2] - 128; + s8 yaxis = pjs.joy[PJAI_Y2] - 128; + limit_joystick_magnitude<128>(xaxis, yaxis); + if (index == 4) + return xaxis + 128; + else + return yaxis + 128; + } + return maple_sega_controller::getAnalogAxis(index, pjs); + } + + const char *get_device_name() override { + return "Dreamcast Controller XL"; + } + + MapleDeviceType get_device_type() override { + return MDT_SegaControllerXL; + } +}; // Emulates a 838-14245-92 maple to RS232 converter // wired to a 838-14243 RFID reader/writer (apparently Saxa HW210) @@ -1627,7 +1723,7 @@ struct RFIDReaderWriter : maple_base u32 resp = Dma(command, &buffer_in[1], buffer_in_len - 4, &buffer_out[1], outlen); if (reci & 0x20) - reci |= maple_GetAttachedDevices(maple_GetBusId(reci)); + reci |= maple_GetAttachedDevices(bus_id); verify(u8(outlen / 4) * 4 == outlen); buffer_out[0] = (resp << 0 ) | (reci << 8) | (send << 16) | ((outlen / 4) << 24); @@ -1722,22 +1818,24 @@ struct RFIDReaderWriter : maple_base DEBUG_LOG(MAPLE, "RFID card read (data? %d)", d4Seen); w32(getStatus()); if (!d4Seen) - w32(0x12345678); // arbitrary value (unknown) + // serial0 and serial1 only + wptr(cardData, 8); else wptr(cardData, sizeof(cardData)); return (MapleDeviceRV)0xfe; case 0xD9: // lock card - w32(getStatus()); cardLocked = true; + w32(getStatus()); INFO_LOG(MAPLE, "RFID card %d locked", player_num); return (MapleDeviceRV)0xfe; case 0xDA: // unlock card - w32(getStatus()); cardLocked = false; cardInserted = false; - INFO_LOG(MAPLE, "RFID card %d unlocked", player_num); + w32(getStatus()); + NOTICE_LOG(MAPLE, "RFID card %d unlocked", player_num); + os_notify("Card ejected", 2000); return (MapleDeviceRV)0xfe; case 0xB1: // write to card @@ -1752,6 +1850,34 @@ struct RFIDReaderWriter : maple_base return (MapleDeviceRV)0xfe; } + case 0xD1: // decrement counter + { + int counter = r8(); + switch (counter) { + case 0x03: + counter = 0; + break; + case 0x0c: + counter = 1; + break; + case 0x30: + counter = 2; + break; + case 0xc0: + counter = 3; + break; + default: + WARN_LOG(MAPLE, "Unknown counter selector %x", counter); + counter = 0; + break; + } + DEBUG_LOG(MAPLE, "RFID decrement %d", counter); + cardData[19 - counter]--; + saveCard(); + w32(getStatus()); + return (MapleDeviceRV)0xfe; + } + default: INFO_LOG(MAPLE, "RFIDReaderWriter: unknown MAPLE COMMAND %d", cmd); return MDRE_UnknownCmd; @@ -1787,24 +1913,62 @@ struct RFIDReaderWriter : maple_base FILE *fp = nowide::fopen(path.c_str(), "rb"); if (fp == nullptr) { - static u8 blankCard[128] = { - 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,0x6c, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0xff - }; - // Generate random bytes used by vf4 vanilla to make the card id - srand(time(0)); - blankCard[2] = rand() & 0xff; - blankCard[4] = rand() & 0xff; - blankCard[5] = rand() & 0xff; - blankCard[6] = rand() & 0xff; - blankCard[7] = rand() & 0xff; - memcpy(cardData, blankCard, sizeof(blankCard)); + if (settings.content.gameId.substr(0, 8) == "MKG TKOB") + { + constexpr u8 MUSHIKING_CHIP_DATA[128] = { + 0x12, 0x34, 0x56, 0x78, // Serial No.0 + 0x31, 0x00, 0x86, 0x07, // Serial No.1 + 0x00, 0x00, 0x00, 0x00, // Key + 0x04, 0xf6, 0x00, 0xAA, // Extend Extend Access Mode + 0x23, 0xFF, 0xFF, 0xFF, // Counter4 Counter3 Counter2 Counter1 + 0x00, 0x00, 0x00, 0x00, // User Data (first set date: day bits 0-4, month bits 5-8, year bits 9-... + 2000) + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x23, 0xFF, 0xFF, 0xFF, // User Data (max counters) + }; + memcpy(cardData, MUSHIKING_CHIP_DATA, sizeof(MUSHIKING_CHIP_DATA)); + for (int i = 0; i < 8; i++) + cardData[i] = rand() & 0xff; + u32 mask = 0; + if (settings.content.gameId == "MKG TKOB 2 JPN VER2.001-" // mushik2e + || settings.content.gameId == "MKG TKOB 4 JPN VER2.000-") // mushik4e + mask = 0x40; + cardData[4] &= ~0xc0; + cardData[4] |= mask; + + u32 serial1 = (cardData[4] << 24) | (cardData[5] << 16) | (cardData[6] << 8) | cardData[7]; + u32 key = ~serial1; + key = ((key >> 4) & 0x0f0f0f0f) + | ((key << 4) & 0xf0f0f0f0); + cardData[8] = key >> 24; + cardData[9] = key >> 16; + cardData[10] = key >> 8; + cardData[11] = key; + } + else + { + constexpr u8 VF4_CARD_DATA[128] = { + 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,0x6c, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0xff + }; + memcpy(cardData, VF4_CARD_DATA, sizeof(VF4_CARD_DATA)); + // Generate random bytes used by vf4 vanilla to make the card id + srand(time(0)); + cardData[2] = rand() & 0xff; + cardData[4] = rand() & 0xff; + cardData[5] = rand() & 0xff; + cardData[6] = rand() & 0xff; + cardData[7] = rand() & 0xff; + } INFO_LOG(NAOMI, "Card P%d initialized", player_num + 1); } else @@ -1856,7 +2020,8 @@ struct RFIDReaderWriter : maple_base cardInserted = true; loadCard(); } - else if (!cardLocked) { + else if (!cardLocked) + { cardInserted = false; if (!transientData) memset(cardData, 0, sizeof(cardData)); @@ -1905,84 +2070,134 @@ const u8 *getRfidCardData(int playerNum) maple_device* maple_Create(MapleDeviceType type) { - maple_device* rv=0; switch(type) { case MDT_SegaController: if (!settings.platform.isAtomiswave()) - rv = new maple_sega_controller(); + return new maple_sega_controller(); else - rv = new maple_atomiswave_controller(); - break; - - case MDT_Microphone: - rv=new maple_microphone(); - break; - - case MDT_SegaVMU: - rv = new maple_sega_vmu(); - break; - - case MDT_PurupuruPack: - rv = new maple_sega_purupuru(); - break; - - case MDT_Keyboard: - rv = new maple_keyboard(); - break; - - case MDT_Mouse: - rv = new maple_mouse(); - break; - + return new maple_atomiswave_controller(); + case MDT_Microphone: return new maple_microphone(); + case MDT_SegaVMU: return new maple_sega_vmu(); + case MDT_PurupuruPack: return new maple_sega_purupuru(); + case MDT_Keyboard: return new maple_keyboard(); + case MDT_Mouse: return new maple_mouse(); case MDT_LightGun: if (!settings.platform.isAtomiswave()) - rv = new maple_lightgun(); + return new maple_lightgun(); else - rv = new atomiswave_lightgun(); - break; + return new atomiswave_lightgun(); + case MDT_NaomiJamma: return new maple_naomi_jamma(); + case MDT_TwinStick: return new maple_sega_twinstick(); + case MDT_AsciiStick: return new maple_ascii_stick(); + case MDT_MaracasController: return new maple_maracas_controller(); + case MDT_FishingController: return new maple_fishing_controller(); + case MDT_PopnMusicController: return new maple_popnmusic_controller(); + case MDT_RacingController: return new maple_racing_controller(); + case MDT_DenshaDeGoController: return new maple_densha_controller(); + case MDT_SegaControllerXL: return new FullController(); + case MDT_RFIDReaderWriter: return new RFIDReaderWriter(); - case MDT_NaomiJamma: - rv = new maple_naomi_jamma(); + default: + ERROR_LOG(MAPLE, "Invalid device type %d", type); + die("Invalid maple device type"); break; + } + return nullptr; +} - case MDT_TwinStick: - rv = new maple_sega_twinstick(); - break; +#if defined(_WIN32) && !defined(TARGET_UWP) && defined(USE_SDL) && !defined(LIBRETRO) +#include "sdl/dreamconn.h" - case MDT_AsciiStick: - rv = new maple_ascii_stick(); - break; +struct DreamConnVmu : public maple_sega_vmu +{ + std::shared_ptr dreamconn; - case MDT_MaracasController: - rv = new maple_maracas_controller(); - break; + DreamConnVmu(std::shared_ptr dreamconn) : dreamconn(dreamconn) { + } - case MDT_FishingController: - rv = new maple_fishing_controller(); - break; + u32 dma(u32 cmd) override + { + if (dma_count_in >= 4) + { + const u32 functionId = *(u32 *)dma_buffer_in; + if ((cmd == MDCF_BlockWrite && functionId == MFID_2_LCD) // LCD screen + || (cmd == MDCF_SetCondition && functionId == MFID_3_Clock)) // Buzzer + { + const MapleMsg *msg = reinterpret_cast(dma_buffer_in - 4); + dreamconn->send(*msg); + } + } + return maple_sega_vmu::dma(cmd); + } - case MDT_PopnMusicController: - rv = new maple_popnmusic_controller(); - break; + void copy(maple_sega_vmu *other) + { + memcpy(flash_data, other->flash_data, sizeof(flash_data)); + memcpy(lcd_data, other->lcd_data, sizeof(lcd_data)); + memcpy(lcd_data_decoded, other->lcd_data_decoded, sizeof(lcd_data_decoded)); + fullSaveNeeded = other->fullSaveNeeded; + } - case MDT_RacingController: - rv = new maple_racing_controller(); - break; + void updateScreen() + { + MapleMsg msg; + msg.command = MDCF_BlockWrite; + msg.destAP = maple_port; + msg.originAP = bus_id << 6; + msg.size = 2 + sizeof(lcd_data) / 4; + *(u32 *)&msg.data[0] = MFID_2_LCD; + *(u32 *)&msg.data[4] = 0; // PT, phase, block# + memcpy(&msg.data[8], lcd_data, sizeof(lcd_data)); + dreamconn->send(msg); + } +}; - case MDT_DenshaDeGoController: - rv = new maple_densha_controller(); - break; +struct DreamConnPurupuru : public maple_sega_purupuru +{ + std::shared_ptr dreamconn; - case MDT_RFIDReaderWriter: - rv = new RFIDReaderWriter(); - break; + DreamConnPurupuru(std::shared_ptr dreamconn) : dreamconn(dreamconn) { + } - default: - ERROR_LOG(MAPLE, "Invalid device type %d", type); - die("Invalid maple device type"); - break; + u32 dma(u32 cmd) override + { + if (cmd == MDCF_BlockWrite || cmd == MDCF_SetCondition) { + const MapleMsg *msg = reinterpret_cast(dma_buffer_in - 4); + dreamconn->send(*msg); + } + return maple_sega_purupuru::dma(cmd); } +}; - return rv; +void createDreamConnDevices(std::shared_ptr dreamconn, bool gameStart) +{ + const int bus = dreamconn->getBus(); + if (dreamconn->hasVmu()) + { + maple_device *dev = MapleDevices[bus][0]; + if (gameStart || (dev != nullptr && dev->get_device_type() == MDT_SegaVMU)) + { + DreamConnVmu *vmu = new DreamConnVmu(dreamconn); + vmu->Setup(bus, 0); + if (!gameStart) { + // if loading a state, copy data from the regular vmu and send a screen update + vmu->copy(static_cast(dev)); + vmu->updateScreen(); + } + delete dev; + } + } + if (dreamconn->hasRumble()) + { + maple_device *dev = MapleDevices[bus][1]; + if (gameStart || (dev != nullptr && dev->get_device_type() == MDT_PurupuruPack)) + { + delete dev; + DreamConnPurupuru *rumble = new DreamConnPurupuru(dreamconn); + rumble->Setup(bus, 1); + } + } } + +#endif diff --git a/core/hw/maple/maple_devs.h b/core/hw/maple/maple_devs.h index 3f1a9f60b..89f1e5836 100755 --- a/core/hw/maple/maple_devs.h +++ b/core/hw/maple/maple_devs.h @@ -5,6 +5,7 @@ #include #include "input/gamepad.h" #include "serialize.h" +#include "hw/hwreg.h" #include #include @@ -88,12 +89,12 @@ enum NAOMI_KEYS NAOMI_BTN5_KEY = 1 << 4, NAOMI_BTN6_KEY = 1 << 3, NAOMI_BTN7_KEY = 1 << 2, - NAOMI_BTN8_KEY = 1 << 16, - NAOMI_TEST_KEY = 1 << 1, + // Not actual JVS buttons + NAOMI_BTN8_KEY = 1 << 16, - // Not an actual button - NAOMI_COIN_KEY = 1 << 0, + NAOMI_TEST_KEY = 1 << 18, + NAOMI_COIN_KEY = 1 << 19, NAOMI_RELOAD_KEY = 1 << 17, }; @@ -115,9 +116,9 @@ enum AWAVE_KEYS AWAVE_SERVICE_KEY = 1 << 13, AWAVE_TEST_KEY = 1 << 14, - // Not an actual button - AWAVE_COIN_KEY = 1 << 15, - AWAVE_TRIGGER_KEY = 1 << 12, + // Not actual AW buttons + AWAVE_COIN_KEY = 1 << 16, + AWAVE_TRIGGER_KEY = 1 << 17, }; struct maple_device @@ -130,7 +131,7 @@ struct maple_device MapleConfigMap* config; //fill in the info - void Setup(u32 port, int playerNum = -1); + void Setup(u32 bus, u32 port = 5, int playerNum = -1); virtual void OnSetup() {}; virtual ~maple_device(); @@ -141,8 +142,7 @@ struct maple_device ser << player_num; } virtual void deserialize(Deserializer& deser) { - if (deser.version() >= Deserializer::V14) - deser >> player_num; + deser >> player_num; } virtual MapleDeviceType get_device_type() = 0; @@ -246,7 +246,7 @@ struct maple_base: maple_device u32 resp = Dma(command, &buffer_in[1], buffer_in_len - 4, &buffer_out[1], outlen); if (reci & 0x20) - reci |= maple_GetAttachedDevices(maple_GetBusId(reci)); + reci |= maple_GetAttachedDevices(bus_id); verify(u8(outlen / 4) * 4 == outlen); buffer_out[0] = (resp << 0 ) | (send << 8) | (reci << 16) | ((outlen / 4) << 24); @@ -257,7 +257,7 @@ struct maple_base: maple_device class jvs_io_board; -struct maple_naomi_jamma : maple_base +struct maple_naomi_jamma : maple_base, SerialPort { static constexpr u8 ALL_NODES = 0xff; @@ -271,7 +271,7 @@ struct maple_naomi_jamma : maple_base u8 eeprom[128]; maple_naomi_jamma(); - ~maple_naomi_jamma(); + ~maple_naomi_jamma() override; MapleDeviceType get_device_type() override { @@ -295,4 +295,11 @@ struct maple_naomi_jamma : maple_base void serialize(Serializer& ser) const override; void deserialize(Deserializer& deser) override; + + void setPipe(Pipe *pipe) override { + serialPipe = pipe; + } + void updateStatus() override {} + + Pipe *serialPipe = nullptr; }; diff --git a/core/hw/maple/maple_helper.cpp b/core/hw/maple/maple_helper.cpp index 03c509103..6e683d972 100644 --- a/core/hw/maple/maple_helper.cpp +++ b/core/hw/maple/maple_helper.cpp @@ -1,15 +1,6 @@ #include "maple_helper.h" #include "maple_if.h" -u32 maple_GetPort(u32 addr) -{ - for (int i=0;i<6;i++) - { - if ((1<> 6; -} - -u32 maple_GetPort(u32 addr); u32 maple_GetAttachedDevices(u32 bus); - -//device : 0 .. 4 -> subdevice , 5 -> main device :) -static inline u32 maple_GetAddress(u32 bus, u32 port) -{ - u32 rv = bus << 6; - rv |= 1 << port; - - return rv; -} diff --git a/core/hw/maple/maple_if.cpp b/core/hw/maple/maple_if.cpp index e097f8ae0..e446057a9 100644 --- a/core/hw/maple/maple_if.cpp +++ b/core/hw/maple/maple_if.cpp @@ -32,6 +32,7 @@ int maple_schid; static void maple_DoDma(); static void maple_handle_reconnect(); +static int maple_schd(int tag, int cycles, int jitter, void *arg); //really hackish //misses delay , and stop/start implementation @@ -40,6 +41,7 @@ static void maple_handle_reconnect(); bool maple_ddt_pending_reset; // pending DMA xfers std::vector>> mapleDmaOut; +bool SDCKBOccupied; void maple_vblank() { @@ -47,8 +49,8 @@ void maple_vblank() { if (SB_MDTSEL == 1) { - if (maple_ddt_pending_reset) - { + // Hardware trigger on vblank + if (maple_ddt_pending_reset) { DEBUG_LOG(MAPLE, "DDT vblank ; reset pending"); } else @@ -64,7 +66,10 @@ void maple_vblank() else { maple_ddt_pending_reset = false; + if (SDCKBOccupied) + maple_schd(0, 0, 0, nullptr); } + SDCKBOccupied = false; } if (settings.platform.isConsole()) maple_handle_reconnect(); @@ -119,6 +124,14 @@ static void maple_SB_MDSTAR_Write(u32 addr, u32 data) } #endif +static u32 getPort(u32 addr) +{ + for (int i = 0; i < 6; i++) + if ((1 << i) & addr) + return i; + return 5; +} + static void maple_DoDma() { verify(SB_MDEN & 1); @@ -152,7 +165,6 @@ static void maple_DoDma() const bool swap_msb = (SB_MMSEL == 0); u32 xfer_count = 0; bool last = false; - bool occupy = false; while (!last) { u32 header_1 = ReadMem32_nommu(addr); @@ -198,8 +210,8 @@ static void maple_DoDma() //Number of additional words in frame u32 inlen = (frame_header >> 24) & 0xFF; - u32 port = maple_GetPort(reci); - u32 bus = maple_GetBusId(reci); + u32 port = getPort(reci); + u32 bus = reci >> 6; if (MapleDevices[bus][5] && MapleDevices[bus][port]) { @@ -245,7 +257,7 @@ static void maple_DoDma() { u32 bus = (header_1 >> 16) & 3; if (MapleDevices[bus][5]) { - occupy = MapleDevices[bus][5]->get_lightgun_pos(); + SDCKBOccupied = SDCKBOccupied || MapleDevices[bus][5]->get_lightgun_pos(); xfer_count++; } addr += 1 * 4; @@ -253,6 +265,7 @@ static void maple_DoDma() break; case MP_SDCKBOccupyCancel: + SDCKBOccupied = false; addr += 1 * 4; break; @@ -273,11 +286,11 @@ static void maple_DoDma() // Maple bus max speed: 2 Mb/s, actual speed: 1 Mb/s //printf("Maple XFER size %d bytes - %.2f ms\n", xfer_count, xfer_count * 1000.0f / (128 * 1024)); - if (!occupy) + if (!SDCKBOccupied) sh4_sched_request(maple_schid, std::min((u64)xfer_count * (SH4_MAIN_CLOCK / (256 * 1024)), (u64)SH4_MAIN_CLOCK)); } -static int maple_schd(int tag, int c, int j) +static int maple_schd(int tag, int cycles, int jitter, void *arg) { if (SB_MDEN & 1) { @@ -335,6 +348,7 @@ void maple_Reset(bool hard) SB_MSHTCL = 0; SB_MDAPRO = 0x00007F00; SB_MMSEL = 1; + mapleDmaOut.clear(); } void maple_Term() diff --git a/core/hw/maple/maple_jvs.cpp b/core/hw/maple/maple_jvs.cpp index 87887db2e..2cd83cc9d 100644 --- a/core/hw/maple/maple_jvs.cpp +++ b/core/hw/maple/maple_jvs.cpp @@ -24,6 +24,7 @@ #include "cfg/option.h" #include "network/output.h" #include "hw/naomi/printer.h" +#include "input/haptic.h" #include #include @@ -79,7 +80,7 @@ const char *GetCurrentGameButtonName(DreamcastKey key) { if (pos >= std::size(awave_button_mapping)) return nullptr; - const u32* mapping = settings.input.JammaSetup == JVS::LightGun ? awavelg_button_mapping : awave_button_mapping; + const u32* mapping = settings.input.lightgunGame ? awavelg_button_mapping : awave_button_mapping; arcade_key = mapping[pos]; } for (int i = 0; NaomiGameInputs->buttons[i].source != 0; i++) @@ -122,6 +123,14 @@ const char *GetCurrentGameAxisName(DreamcastKey axis) if (axis != DC_AXIS_LT) continue; break; + case 6: + if (axis != DC_AXIS_RT2) + continue; + break; + case 7: + if (axis != DC_AXIS_LT2) + continue; + break; default: continue; } @@ -135,7 +144,6 @@ const char *GetCurrentGameAxisName(DreamcastKey axis) * Sega JVS I/O board */ static bool old_coin_chute[4]; -static int coin_count[4]; class jvs_io_board { @@ -153,15 +161,19 @@ class jvs_io_board virtual void serialize(Serializer& ser) const; virtual void deserialize(Deserializer& deser); + u32 getDigitalOutput() const { + return digOutput; + } + bool lightgun_as_analog = false; protected: virtual const char *get_id() = 0; virtual u16 read_analog_axis(int player_num, int player_axis, bool inverted); - virtual void read_digital_in(const u32 *buttons, u16 *v) + virtual void read_digital_in(const u32 *buttons, u32 *v) { - memset(v, 0, sizeof(u16) * 4); + memset(v, 0, sizeof(u32) * 4); for (u32 player = first_player; player < 4; player++) { // always-on mapping @@ -178,6 +190,15 @@ class jvs_io_board continue; if (keycode & NAOMI_RELOAD_KEY) keycode |= NAOMI_BTN0_KEY; + if (lightgun_as_analog && (keycode & NAOMI_BTN0_KEY)) + { + const MapleInputState& inputState = mapleInputState[player]; + if (inputState.absPos.x < 0 || inputState.absPos.x > 639 + || inputState.absPos.y < 0 || inputState.absPos.y > 479 + || (keycode & NAOMI_RELOAD_KEY)) { + keycode |= NAOMI_BTN1_KEY; // offscreen sensor, not used by deathcox + } + } // P1 mapping (only for P2) if (player == 1) @@ -239,6 +260,16 @@ class jvs_io_board y = mapleInputState[playerNum].absPos.y; } } + + virtual s16 readRotaryEncoders(int channel, s16 relX, s16 relY) + { + switch (channel) + { + case 0: return relX; + case 1: return relY; + default: return 0; + } + } u32 player_count = 0; u32 digital_in_count = 0; @@ -248,6 +279,8 @@ class jvs_io_board u32 light_gun_count = 0; u32 output_count = 0; bool init_in_progress = false; + maple_naomi_jamma *parent; + u8 first_player; private: void init_mappings() @@ -279,13 +312,12 @@ class jvs_io_board } u8 node_id; - maple_naomi_jamma *parent; - u8 first_player; std::array cur_mapping; std::array p1_mapping; std::array p2_mapping; u32 digOutput = 0; + int coin_count[4] {}; }; // Most common JVS board @@ -345,7 +377,140 @@ class jvs_837_13938 : public jvs_io_board } protected: const char *get_id() override { return "SEGA ENTERPRISES,LTD.;837-13938 ENCORDER BD ;Ver0.01;99/08"; } +}; + +// Uses btn1 to switch between cue aim and cue roller encoders +class jvs_837_13938_shootout : public jvs_837_13938 +{ +public: + jvs_837_13938_shootout(u8 node_id, maple_naomi_jamma *parent, int first_player = 0) + : jvs_837_13938(node_id, parent, first_player) + { + memset(lastValue, 0, sizeof(lastValue)); + } + +protected: + void read_digital_in(const u32 *buttons, u32 *v) override + { + jvs_837_13938::read_digital_in(buttons, v); + btn3down = v[0] & NAOMI_BTN3_KEY; + } + + s16 readRotaryEncoders(int channel, s16 relX, s16 relY) override + { + switch (channel) + { + case 0: // CUE AIM L/R + if (!btn3down) + lastValue[0] = relX; + break; + case 1: // CUE AIM U/D + if (!btn3down) + lastValue[1] = relY; + break; + case 2: // CUE ROLLER + if (btn3down) + lastValue[2] = relY; + break; + default: + return 0; + } + return lastValue[channel]; + } + + bool btn3down = false; + s16 lastValue[3]; +}; + +// +// The encoders are rotated by 45° so coordinates must be converted. +// Polling is done twice per frame so we only handle half the delta per poll. +// +class jvs_837_13938_kick4cash : public jvs_837_13938 +{ +public: + jvs_837_13938_kick4cash(u8 node_id, maple_naomi_jamma *parent, int first_player = 0) + : jvs_837_13938(node_id, parent, first_player) + {} + +protected: + s16 readRotaryEncoders(int channel, s16 relX, s16 relY) override + { + const s16 deltaX = (relX - prevRelX) / 2; + const s16 deltaY = (relY - prevRelY) / 2; + s16 rv; + switch (channel) + { + case 0: // x + rotX += (deltaX - deltaY) * 0.7071f; + rv = (int)std::round(rotX); + break; + case 1: // y + rotY += (deltaX + deltaY) * 0.7071f; + rv = (int)std::round(rotY); + break; + default: + rv = 0; + break; + } + if (channel == 1) + { + prevRelX += deltaX; + prevRelY += deltaY; + } + return rv; + } + + s16 prevRelX = 0; + s16 prevRelY = 0; + float rotX = 0.f; + float rotY = 0.f; +}; + +class jvs_837_13938_crackindj : public jvs_837_13938 +{ +public: + jvs_837_13938_crackindj(u8 node_id, maple_naomi_jamma *parent, int first_player = 0) + : jvs_837_13938(node_id, parent, first_player) + {} + + void serialize(Serializer& ser) const override + { + jvs_837_13938::serialize(ser); + ser << motorRotation; + } + void deserialize(Deserializer& deser) override + { + jvs_837_13938::deserialize(deser); + if (deser.version() >= Deserializer::V46) + deser >> motorRotation; + } +protected: + s16 readRotaryEncoders(int channel, s16 relX, s16 relY) override + { + jvs_io_board& outputBoard = *parent->io_boards[1]; + bool turntableOn = outputBoard.getDigitalOutput() & 0x10; + switch (channel) + { + case 0: // Left turntable + if (turntableOn && relX == lastRel[0]) + motorRotation[0] -= 10; + lastRel[0] = relX; + return -relX + motorRotation[0]; + case 2: // Right turntable + if (turntableOn && relY == lastRel[1]) + motorRotation[1] -= 10; + lastRel[1] = relY; + return relY + motorRotation[1]; + default: + return 0; + } + } + +private: + s16 motorRotation[2]{}; + s16 lastRel[2]{}; }; // Sega Marine Fishing, 18 Wheeler (TODO) @@ -423,7 +588,7 @@ class jvs_837_13844_motor_board : public jvs_837_13844 } protected: - void read_digital_in(const u32 *buttons, u16 *v) override + void read_digital_in(const u32 *buttons, u32 *v) override { jvs_837_13844::read_digital_in(buttons, v); @@ -507,8 +672,10 @@ class jvs_837_13844_wrungp : public jvs_837_13844_motor_board }; // 837-13844 jvs board wired to force-feedback drive board -// 838-13843: f355 -// 838-13992: 18 wheeler +// 838-13843: f355 (ROM EPR-21867) +// 838-13992: 18 wheeler (ROM EPR-23000) +// with 838-12912-01 servo board (same as model3) +// https://github.com/njz3/vJoyIOFeederWithFFB/blob/master/DRIVEBOARD.md class jvs_837_13844_racing : public jvs_837_13844_motor_board { public: @@ -520,13 +687,55 @@ class jvs_837_13844_racing : public jvs_837_13844_motor_board void serialize(Serializer& ser) const override { ser << testMode; + ser << damper_high; + ser << active; + ser << motorPower; + ser << springSat; + ser << springSpeed; + ser << torque; + ser << damper; jvs_837_13844_motor_board::serialize(ser); } void deserialize(Deserializer& deser) override { if (deser.version() >= Deserializer::V31) deser >> testMode; + else + testMode = false; + if (deser.version() >= Deserializer::V51) + { + deser >> damper_high; + deser >> active; + deser >> motorPower; + deser >> springSat; + deser >> springSpeed; + deser >> torque; + deser >> damper; + } + else + { + damper_high = 8; + active = false; + motorPower = 1.f; + springSat = 0.f; + springSpeed = 0.f; + torque = 0.f; + damper = 0.f; + } jvs_837_13844_motor_board::deserialize(deser); + if (active) + { + haptic::setSpring(0, springSat, springSpeed); + haptic::setTorque(0, torque); + haptic::setDamper(0, damper, damper / 2.f); + } + else { + haptic::stopAll(0); + } + } + + void setTokyoBusMode(bool enable) { + tokyoBus = enable; } protected: @@ -534,31 +743,106 @@ class jvs_837_13844_racing : public jvs_837_13844_motor_board { in = ~in; networkOutput.output("m3ffb", in); - // E0: stop motor - // E3: roll right - // EB: roll left - - // Dn: set wheel high-order? - // Cn: set wheel low-order? - // 18 wheeler: ff, fe, 3f, 49, 67 - // d8, c0, e0, d0 - // 4b, 4a, 9f, 4b, 4d, 4e, 4f, 45, 45, 4f, a3, 4d, ..., 9f, 4c, + u8 out = 0; switch (in) { + case 0: + case 1: + case 2: + // 18wheeler: 0 light (60%), 1 normal (80%), 2 heavy (100%) + if (!active) + motorPower = 0.6f + in * 0.2f; + break; + case 0xf0: + active = false; testMode = true; break; + case 0xfe: + active = true; + break; + case 0xff: testMode = false; + active = false; + haptic::stopAll(0); break; case 0xf1: - out = 0x10; + out = 0x10; // needed by f355 and tokyobus + break; + + case 0xfa: + motorPower = 1.f; // f355: 100% + break; + case 0xfb: + motorPower = 0.9f; // f355: 90% + break; + case 0xfc: + motorPower = 0.8f; // f355: 80% + break; + case 0xfd: + motorPower = 0.6f; // f355: 60% break; default: + if (active) + { + if (in >= 0x40 && in <= 0x7f) + { + if (tokyoBus) + { + if (in <= 0x4a) + // heavy: 4a + // normal: 47 + // light: 44 + motorPower = (in & 0xf) / 10.f; + } + else + { + // Spring + // bits 0-3 sets the strength of the spring effect + // bits 4-5 selects a table scaling the effect given the deflection: + // (from the f355 rom EPR-21867) + // 0: large deadzone then abrupt scaling (0 (* 129), 10, 20, 30, 40, 50, 60, 70, 7F) + // used by 18wheeler in game but with a different rom (TODO reveng) + // other tables scale linearly: + // 1: light speed (96 steps from 0 to 7f) + // 2: medium speed (48 steps, default) + // 3: high speed (32 steps) + springSat = (in & 0xf) / 15.f * motorPower; + const int speedSel = (in >> 4) & 3; + springSpeed = speedSel == 3 ? 1.f : speedSel == 2 ? 0.67f : speedSel == 1 ? 0.33f : 0.67f; + haptic::setSpring(0, springSat, springSpeed); + } + } + else if (in >= 0x80 && in <= 0xbf) + { + // Rumble + const float v = (in & 0x3f) / 63.f * motorPower / 2.f; // additional 0.5 factor to soften it + MapleConfigMap::UpdateVibration(0, v, 0.f, 50); // duration? + } + else if (in >= 0xe0 && in <= 0xef) + { + // Test menu roll left/right (not used in game) + torque = (in < 0xe8 ? (0xe0 - in) : (in - 0xe8)) / 7.f; + haptic::setTorque(0, torque); + } + else if ((in & 0xf0) == 0xc0) + { + // Damper? more likely Friction + // activated in f355 when turning the wheel while stopped + // high-order bits are set with Dn, low-order bits with Cn. Only the later commits the change. + const u8 v = (damper_high << 4) | (in & 0xf); + damper = std::abs(v - 0x80) / 128.f * motorPower; + haptic::setDamper(0, damper, damper / 2.f); + } + else if ((in & 0xf0) == 0xd0) { + damper_high = in & 0xf; + } + } break; } if (testMode) @@ -574,6 +858,14 @@ class jvs_837_13844_racing : public jvs_837_13844_motor_board private: bool testMode = false; + u8 damper_high = 8; + bool active = false; + float motorPower = 1.f; + float springSat = 0.f; + float springSpeed = 0.f; + float torque = 0.f; + float damper = 0.f; + bool tokyoBus = false; }; // 18 Wheeler: fake the drive board and limit the wheel analog value @@ -598,7 +890,7 @@ class jvs_837_13844_18wheeler : public jvs_837_13844_racing } protected: - void read_digital_in(const u32 *buttons, u16 *v) override + void read_digital_in(const u32 *buttons, u32 *v) override { jvs_837_13844_racing::read_digital_in(buttons, v); if (buttons[0] & NAOMI_BTN2_KEY) @@ -730,7 +1022,7 @@ class jvs_namco_v226 : public jvs_io_board protected: const char *get_id() override { return "SEGA ENTERPRISES,LTD.;I/O BD JVS;837-13551 ;Ver1.00;98/10"; } - void read_digital_in(const u32 *buttons, u16 *v) override + void read_digital_in(const u32 *buttons, u32 *v) override { jvs_io_board::read_digital_in(buttons, v); // main button @@ -746,8 +1038,8 @@ class jvs_namco_v226 : public jvs_io_board u16 read_joystick_x(int joy_num) { - s8 axis_x = mapleInputState[joy_num].fullAxes[PJAI_X1]; - axis_y = mapleInputState[joy_num].fullAxes[PJAI_Y1]; + s8 axis_x = mapleInputState[joy_num].fullAxes[PJAI_X1] >> 8; + axis_y = mapleInputState[joy_num].fullAxes[PJAI_Y1] >> 8; limit_joystick_magnitude<64>(axis_x, axis_y); return std::min(0xff, 0x80 - axis_x) << 8; } @@ -777,13 +1069,13 @@ class jvs_namco_v226 : public jvs_io_board case 7: return read_joystick_y(3); case 8: - return mapleInputState[0].halfAxes[PJTI_R] << 8; + return mapleInputState[0].halfAxes[PJTI_R]; case 9: - return mapleInputState[1].halfAxes[PJTI_R] << 8; + return mapleInputState[1].halfAxes[PJTI_R]; case 10: - return mapleInputState[2].halfAxes[PJTI_R] << 8; + return mapleInputState[2].halfAxes[PJTI_R]; case 11: - return mapleInputState[3].halfAxes[PJTI_R] << 8; + return mapleInputState[3].halfAxes[PJTI_R]; default: return 0x8000; } @@ -809,25 +1101,26 @@ class jvs_namco_v226_pcb : public jvs_io_board protected: const char *get_id() override { return "SEGA ENTERPRISES,LTD.;I/O BD JVS;837-13551 ;Ver1.00;98/10"; } - void read_digital_in(const u32 *buttons, u16 *v) override + void read_digital_in(const u32 *buttons, u32 *v) override { jvs_io_board::read_digital_in(buttons, v); - for (u32 player = 0; player < player_count; player++) + for (u32 player = first_player; player < first_player + player_count && player < 4; player++) { - u8 trigger = mapleInputState[player].halfAxes[PJTI_R] >> 2; + u8 trigger = mapleInputState[player].halfAxes[PJTI_R] >> 10; + const u32 idx = player - first_player; // Ball button - v[player] = ((trigger & 0x20) << 3) | ((trigger & 0x10) << 5) | ((trigger & 0x08) << 7) + v[idx] = ((trigger & 0x20) << 3) | ((trigger & 0x10) << 5) | ((trigger & 0x08) << 7) | ((trigger & 0x04) << 9) | ((trigger & 0x02) << 11) | ((trigger & 0x01) << 13) // other buttons - | (v[player] & (NAOMI_SERVICE_KEY | NAOMI_TEST_KEY | NAOMI_START_KEY)) - | ((v[player] & NAOMI_BTN0_KEY) >> 4); // remap button4 to button0 (change button) + | (v[idx] & (NAOMI_SERVICE_KEY | NAOMI_TEST_KEY | NAOMI_START_KEY)) + | ((v[idx] & NAOMI_BTN0_KEY) >> 4); // remap button4 to button0 (change button) } } u16 read_joystick_x(int joy_num) { - s8 axis_x = mapleInputState[joy_num].fullAxes[PJAI_X1]; - axis_y = mapleInputState[joy_num].fullAxes[PJAI_Y1]; + s8 axis_x = mapleInputState[joy_num].fullAxes[PJAI_X1] >> 8; + axis_y = mapleInputState[joy_num].fullAxes[PJAI_Y1] >> 8; limit_joystick_magnitude<48>(axis_x, axis_y); return (axis_x + 128) << 8; } @@ -837,17 +1130,31 @@ class jvs_namco_v226_pcb : public jvs_io_board return std::min(0xff, 0x80 - axis_y) << 8; } - u16 read_analog_axis(int player_num, int player_axis, bool inverted) override { + u16 read_analog_axis(int player_num, int player_axis, bool inverted) override + { switch (player_axis) { + // P1 case 0: - return read_joystick_x(0); + return read_joystick_x(player_num + 0); case 1: - return read_joystick_y(0); + return read_joystick_y(player_num + 0); + // P2 & P4 case 4: - return read_joystick_x(1); + return read_joystick_x(player_num + 1); case 5: - return read_joystick_y(1); + return read_joystick_y(player_num + 1); + // P3 + case 8: + if (player_num == 0) + return read_joystick_x(player_num + 2); + else + return 0x8000; + case 9: + if (player_num == 0) + return read_joystick_y(player_num + 2); + else + return 0x8000; default: return 0x8000; } @@ -865,7 +1172,7 @@ class jvs_837_13551_mushiking : public jvs_837_13551 : jvs_837_13551(node_id, parent, first_player) { } protected: - void read_digital_in(const u32 *buttons, u16 *v) override + void read_digital_in(const u32 *buttons, u32 *v) override { jvs_837_13551::read_digital_in(buttons, v); if (!(v[0] & NAOMI_TEST_KEY)) @@ -892,79 +1199,156 @@ maple_naomi_jamma::maple_naomi_jamma() { if (settings.naomi.drivingSimSlave == 0 && !settings.naomi.slave) { - switch (settings.input.JammaSetup) + const std::string& gameId = settings.content.gameId; + if (gameId == "POWER STONE 2 JAPAN") { - case JVS::Default: - default: - if (settings.content.gameId.substr(0, 8) == "MKG TKOB" || settings.content.gameId.substr(0, 9) == "MUSHIKING") - io_boards.push_back(std::make_unique(1, this)); - else - io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::FourPlayers: + // 4 players + INFO_LOG(MAPLE, "Enabling 4-player setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::RotaryEncoders: - io_boards.push_back(std::make_unique(1, this)); + settings.input.fourPlayerGames = true; + } + else if (gameId == "DYNAMIC GOLF" + || gameId.substr(0, 13) == "SHOOTOUT POOL" + || gameId.substr(0, 10) == "CRACKIN'DJ" + || gameId == "KICK '4' CASH") + { + // Rotary encoders + INFO_LOG(MAPLE, "Enabling JVS rotary encoders for game %s", gameId.c_str()); + if (gameId.substr(0, 13) == "SHOOTOUT POOL") + io_boards.push_back(std::make_unique(1, this)); + else if (gameId == "KICK '4' CASH") + io_boards.push_back(std::make_unique(1, this)); + else if (gameId.substr(0, 10) == "CRACKIN'DJ") + io_boards.push_back(std::make_unique(1, this)); + else + io_boards.push_back(std::make_unique(1, this)); io_boards.push_back(std::make_unique(2, this)); - break; - case JVS::OutTrigger: + settings.input.mouseGame = true; + } + else if (gameId == "OUTTRIGGER JAPAN") + { + INFO_LOG(MAPLE, "Enabling JVS rotary encoders for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); io_boards.push_back(std::make_unique(2, this)); - break; - case JVS::SegaMarineFishing: + } + else if (gameId == "SEGA MARINE FISHING JAPAN") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::DualIOBoards4P: - if (settings.content.gameId == "RINGOUT 4X4 JAPAN") - { - io_boards.push_back(std::make_unique(1, this)); - io_boards.push_back(std::make_unique(2, this, 2)); - } - else - { - // reverse the board order so that P1 is P1 - io_boards.push_back(std::make_unique(1, this, 2)); - io_boards.push_back(std::make_unique(2, this, 0)); - } - break; - case JVS::LightGun: + } + else if (gameId == "RINGOUT 4X4 JAPAN") + { + // Dual I/O boards 4P + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); + io_boards.push_back(std::make_unique(1, this)); + io_boards.push_back(std::make_unique(2, this, 2)); + settings.input.fourPlayerGames = true; + } + else if (gameId == "VIRTUA ATHLETE" + || gameId == "ROYAL RUMBLE" + || gameId == "BEACH SPIKERS JAPAN" + || gameId == "MJ JAPAN") + { + // Dual I/O boards 4P + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); + // reverse the board order so that P1 is P1 + io_boards.push_back(std::make_unique(1, this, 2)); + io_boards.push_back(std::make_unique(2, this, 0)); + settings.input.fourPlayerGames = true; + } + else if (gameId == "NINJA ASSAULT") + { + // Light-gun game + INFO_LOG(MAPLE, "Enabling lightgun setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::LightGunAsAnalog: + settings.input.lightgunGame = true; + } + else if (gameId == "THE MAZE OF THE KINGS" + || gameId == " CONFIDENTIAL MISSION ---------" + || gameId == "DEATH CRIMSON OX" + || gameId.substr(0, 5) == "hotd2" // House of the Dead 2 + || gameId == "LUPIN THE THIRD -THE SHOOTING-") + { + INFO_LOG(MAPLE, "Enabling lightgun as analog setup for game %s", gameId.c_str()); // Regular board sending lightgun coords as axis 0/1 io_boards.push_back(std::make_unique(1, this)); io_boards.back()->lightgun_as_analog = true; - break; - case JVS::Mazan: + settings.input.lightgunGame = true; + } + else if (gameId == "MAZAN") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); io_boards.push_back(std::make_unique(2, this)); - break; - case JVS::GunSurvivor: + settings.input.lightgunGame = true; + } + else if (gameId == " BIOHAZARD GUN SURVIVOR2") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::DogWalking: + } + else if (gameId == "INU NO OSANPO") // Dog Walking + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::TouchDeUno: + } + else if (gameId == " TOUCH DE UNOH -------------" + || gameId == " TOUCH DE UNOH 2 -----------" + || gameId == "MIRAI YOSOU STUDIO") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::WorldKicks: + settings.input.lightgunGame = true; + } + else if (gameId == "WORLD KICKS") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::WorldKicksPCB: + settings.input.fourPlayerGames = true; + } + else if (gameId == "WORLD KICKS PCB") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this, 2)); io_boards.push_back(std::make_unique(2, this)); - break; - case JVS::WaveRunnerGP: + settings.input.fourPlayerGames = true; + } + else if (gameId == "WAVE RUNNER GP") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::_18Wheeler: + } + else if (gameId == " 18WHEELER") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; - case JVS::F355: + } + else if (gameId == "F355 CHALLENGE JAPAN" || gameId == "TOKYO BUS GUIDE") + { + INFO_LOG(MAPLE, "Enabling specific JVS setup for game %s", gameId.c_str()); io_boards.push_back(std::make_unique(1, this)); - break; + if (gameId == "TOKYO BUS GUIDE") + static_cast(io_boards.back().get())->setTokyoBusMode(true); + } + else if (gameId.substr(0, 8) == "MKG TKOB" + || gameId.substr(0, 9) == "MUSHIKING" + || gameId == "MUSHIUSA '04 1ST VER0.900-") + { + io_boards.push_back(std::make_unique(1, this)); + } + else if (gameId == "ANPANMAN POPCORN KOUJOU 2") + { + io_boards.push_back(std::make_unique(1, this)); + } + else + { + if (gameId == "POKASUKA GHOST (JAPANESE)" // Manic Panic Ghosts + || gameId == "TOUCH DE ZUNO (JAPAN)") + { + settings.input.lightgunGame = true; + } + // Default JVS I/O board + io_boards.push_back(std::make_unique(1, this)); } } @@ -1360,6 +1744,47 @@ void maple_naomi_jamma::handle_86_subcommand() w8(0x0); break; + // RS422 port + case 0x41: // reset? + DEBUG_LOG(MAPLE, "JVS: RS422 reset"); + if (serialPipe != nullptr) + while (serialPipe->available()) + serialPipe->read(); + break; + + case 0x47: // send data + DEBUG_LOG(MAPLE, "JVS: RS422 send %02x", dma_buffer_in[4]); + if (serialPipe != nullptr) + serialPipe->write(dma_buffer_in[4]); + break; + + case 0x4d: // receive data + { + int avail = 0; + if (serialPipe != nullptr) + avail = std::min(serialPipe->available(), 0xfe); + DEBUG_LOG(MAPLE, "JVS: RS422 receive %d bytes", avail); + w8(MDRS_JVSReply); + w8(0); + w8(0x20); + w8(1 + (avail + 3) / 4); + + w8(0); + w8(0); + w8(0); + w8(avail == 0 ? 0xff : avail); // 0xff => no data, else byte count + + for (int i = 0; i < ((avail + 3) / 4) * 4; i++) + w8(i >= avail ? 0 : serialPipe->read()); + break; + } + + case 0x49: // I? + case 0x4b: // K? + case 0x4f: // O? + //DEBUG_LOG(MAPLE, "JVS: 0x86,%02x RS422 len %d", subcode, dma_count_in - 3); + break; + default: INFO_LOG(MAPLE, "JVS: Unknown 0x86 sub-command %x", subcode); w8(MDRE_UnknownCmd); @@ -1579,10 +2004,10 @@ u16 jvs_io_board::read_analog_axis(int player_num, int player_axis, bool inverte { u16 v; if (player_axis >= 0 && player_axis < 4) - v = (mapleInputState[player_num].fullAxes[player_axis] + 128) << 8; + v = mapleInputState[player_num].fullAxes[player_axis] + 0x8000; else v = 0x8000; - return inverted ? 0xff00 - v : v; + return inverted ? 0xffff - v : v; } #define JVS_OUT(b) buffer_out[length++] = b @@ -1744,14 +2169,13 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou { JVS_STATUS1(); // report byte - u16 inputs[4]; + u32 inputs[4]; read_digital_in(buttons, inputs); JVS_OUT((inputs[0] & NAOMI_TEST_KEY) ? 0x80 : 0x00); // test, tilt1, tilt2, tilt3, unused, unused, unused, unused LOGJVS("btns "); for (int player = 0; player < buffer_in[cmdi + 1]; player++) { - inputs[player] &= ~(NAOMI_TEST_KEY | NAOMI_COIN_KEY); - LOGJVS("P%d %02x ", player + 1 + first_player, inputs[player] >> 8); + LOGJVS("P%d %02x ", player + 1 + first_player, (inputs[player] >> 8) & 0xFF); JVS_OUT(inputs[player] >> 8); if (buffer_in[cmdi + 2] == 2) { @@ -1774,15 +2198,15 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou { coin_chute = true; if (!old_coin_chute[first_player + slot]) - coin_count[first_player + slot] += 1; + coin_count[slot] += 1; } old_coin_chute[first_player + slot] = coin_chute; LOGJVS("%d:%d ", slot + 1 + first_player, coin_count[first_player + slot]); // status (2 highest bits, 0: normal), coin count MSB - JVS_OUT((coin_count[first_player + slot] >> 8) & 0x3F); + JVS_OUT((coin_count[slot] >> 8) & 0x3F); // coin count LSB - JVS_OUT(coin_count[first_player + slot]); + JVS_OUT(coin_count[slot]); } cmdi += 2; } @@ -1841,21 +2265,33 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou const AxisDescriptor& axisDesc = NaomiGameInputs->axes[player_axis]; if (axisDesc.type == Half) { - if (axisDesc.axis == 4) - axis_value = mapleInputState[player_num].halfAxes[PJTI_R] << 8; - else if (axisDesc.axis == 5) - axis_value = mapleInputState[player_num].halfAxes[PJTI_L] << 8; - else + switch (axisDesc.axis) + { + case 4: + axis_value = mapleInputState[player_num].halfAxes[PJTI_R]; + break; + case 5: + axis_value = mapleInputState[player_num].halfAxes[PJTI_L]; + break; + case 6: + axis_value = mapleInputState[player_num].halfAxes[PJTI_R2]; + break; + case 7: + axis_value = mapleInputState[player_num].halfAxes[PJTI_L2]; + break; + default: axis_value = 0; + break; + } if (axisDesc.inverted) - axis_value = 0xff00u - axis_value; + axis_value = 0xffffu - axis_value; // this fixes kingrt66 immediate win - if (axis_value == 0x8000) + if (axis_value >= 0x8000 && axis_value < 0x8100) axis_value = 0x8100; } else { - axis_value = read_analog_axis(player_num, axisDesc.axis, axisDesc.inverted); + axis_value = read_analog_axis(player_num, axisDesc.axis, axisDesc.inverted); } } else @@ -1868,6 +2304,12 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou axis_value = read_analog_axis(player_num, player_axis, false); } LOGJVS("%d:%4x ", axis, axis_value); + // Strangely, the least significant byte appears to be handled as signed, + // so we compensate when it's negative. + // Avoid overflow (wild riders) + axis_value = std::min(0xff7f, axis_value); + if (axis_value & 0x80) + axis_value += 0x100; JVS_OUT(axis_value >> 8); JVS_OUT(axis_value); } @@ -1882,31 +2324,17 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou static s16 roty = 0; // TODO Add more players. // I can't think of any naomi multiplayer game that uses rotary encoders - rotx += mapleInputState[first_player].relPos.x * 5; - roty -= mapleInputState[first_player].relPos.y * 5; + rotx += mapleInputState[first_player].relPos.x * 3; + roty -= mapleInputState[first_player].relPos.y * 3; mapleInputState[first_player].relPos.x = 0; mapleInputState[first_player].relPos.y = 0; LOGJVS("rotenc "); for (int chan = 0; chan < buffer_in[cmdi + 1]; chan++) { - if (chan == 0) - { - LOGJVS("%d:%4x ", chan, rotx & 0xFFFF); - JVS_OUT(rotx >> 8); // MSB - JVS_OUT(rotx); // LSB - } - else if (chan == 1) - { - LOGJVS("%d:%4x ", chan, roty & 0xFFFF); - JVS_OUT(roty >> 8); // MSB - JVS_OUT(roty); // LSB - } - else - { - LOGJVS("%d:%4x ", chan, 0); - JVS_OUT(0x00); // MSB - JVS_OUT(0x00); // LSB - } + s16 v = readRotaryEncoders(chan, rotx, roty); + LOGJVS("%d:%4x ", chan, v & 0xFFFF); + JVS_OUT(v >> 8); // MSB + JVS_OUT(v); // LSB } cmdi += 2; } @@ -1945,8 +2373,8 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou break; case 0x30: // substract coin - if (buffer_in[cmdi + 1] > 0 && first_player + buffer_in[cmdi + 1] - 1 < (int)std::size(coin_count)) - coin_count[first_player + buffer_in[cmdi + 1] - 1] -= (buffer_in[cmdi + 2] << 8) + buffer_in[cmdi + 3]; + if (buffer_in[cmdi + 1] > 0 && buffer_in[cmdi + 1] - 1 < (int)std::size(coin_count)) + coin_count[buffer_in[cmdi + 1] - 1] -= (buffer_in[cmdi + 2] << 8) + buffer_in[cmdi + 3]; JVS_STATUS1(); // report byte cmdi += 4; break; @@ -1977,7 +2405,6 @@ u32 jvs_io_board::handle_jvs_message(u8 *buffer_in, u32 length_in, u8 *buffer_ou break; } } - LOGJVS("\n"); } else { @@ -2002,9 +2429,14 @@ void jvs_io_board::serialize(Serializer& ser) const { ser << node_id; ser << lightgun_as_analog; + ser << coin_count; } void jvs_io_board::deserialize(Deserializer& deser) { deser >> node_id; deser >> lightgun_as_analog; + if (deser.version() >= Deserializer::V46) + deser >> coin_count; + else + memset(coin_count, 0, sizeof(coin_count)); } diff --git a/core/hw/mem/addrspace.cpp b/core/hw/mem/addrspace.cpp index 65a0e67ac..a0e8f1810 100644 --- a/core/hw/mem/addrspace.cpp +++ b/core/hw/mem/addrspace.cpp @@ -211,7 +211,7 @@ template static T DYNACALL readMemNotMapped(u32 addresss) { INFO_LOG(MEMORY, "[sh4]read%d from %08x, not mapped (default handler)", (int)sizeof(T), addresss); - return (u8)MEM_ERROR_RETURN_VALUE; + return (T)MEM_ERROR_RETURN_VALUE; } //default write hander template @@ -380,16 +380,10 @@ bool bm_lockedWrite(u8* address) bool reserve() { - static_assert((sizeof(Sh4RCB) % PAGE_SIZE) == 0, "sizeof(Sh4RCB) not multiple of PAGE_SIZE"); - if (ram_base != nullptr) return true; - // Use vmem only if settings mandate so, and if we have proper exception handlers. -#if !defined(TARGET_NO_EXCEPTIONS) - if (!settings.dynarec.disable_nvmem) - virtmem::init((void**)&ram_base, (void**)&p_sh4rcb, RAM_SIZE_MAX + VRAM_SIZE_MAX + ARAM_SIZE_MAX + elan::ERAM_SIZE_MAX); -#endif + virtmem::init((void**)&ram_base, (void**)&p_sh4rcb, RAM_SIZE_MAX + VRAM_SIZE_MAX + ARAM_SIZE_MAX + elan::ERAM_SIZE_MAX); return true; } @@ -449,6 +443,7 @@ void initMappings() virtmem::create_mappings(&mem_mappings[0], std::size(mem_mappings)); // Point buffers to actual data pointers + // This *must* be the first r/w mirror (switch) aica::aica_ram.setRegion(&ram_base[0x20000000], ARAM_SIZE); // Points to the writable AICA addrspace vram.setRegion(&ram_base[0x04000000], VRAM_SIZE); // Points to first vram mirror (writable and lockable) mem_b.setRegion(&ram_base[0x0C000000], RAM_SIZE); // Main memory, first mirror @@ -461,9 +456,9 @@ void initMappings() mem_b.zero(); NOTICE_LOG(VMEM, "BASE %p RAM(%d MB) %p VRAM64(%d MB) %p ARAM(%d MB) %p", ram_base, - RAM_SIZE / 1024 / 1024, &mem_b[0], - VRAM_SIZE / 1024 / 1024, &vram[0], - ARAM_SIZE / 1024 / 1024, &aica::aica_ram[0]); + (u32)(RAM_SIZE / 1_MB), &mem_b[0], + (u32)(VRAM_SIZE / 1_MB), &vram[0], + (u32)(ARAM_SIZE / 1_MB), &aica::aica_ram[0]); } void release() @@ -483,6 +478,7 @@ void release() void protectVram(u32 addr, u32 size) { addr &= VRAM_MASK; +#ifndef __SWITCH__ if (virtmemEnabled()) { virtmem::region_lock(ram_base + 0x04000000 + addr, size); // P0 @@ -495,6 +491,7 @@ void protectVram(u32 addr, u32 size) } } else +#endif { virtmem::region_lock(&vram[addr], size); } @@ -503,6 +500,7 @@ void protectVram(u32 addr, u32 size) void unprotectVram(u32 addr, u32 size) { addr &= VRAM_MASK; +#ifndef __SWITCH__ if (virtmemEnabled()) { virtmem::region_unlock(ram_base + 0x04000000 + addr, size); // P0 @@ -515,6 +513,7 @@ void unprotectVram(u32 addr, u32 size) } } else +#endif { virtmem::region_unlock(&vram[addr], size); } @@ -522,6 +521,7 @@ void unprotectVram(u32 addr, u32 size) u32 getVramOffset(void *addr) { +#ifndef __SWITCH__ if (virtmemEnabled()) { ptrdiff_t offset = (u8*)addr - ram_base; @@ -533,6 +533,7 @@ u32 getVramOffset(void *addr) return offset & VRAM_MASK; } else +#endif { ptrdiff_t offset = (u8*)addr - &vram[0]; if (offset < 0 || offset >= VRAM_SIZE) diff --git a/core/hw/mem/mem_watch.h b/core/hw/mem/mem_watch.h index b91b76060..4d1be89ee 100644 --- a/core/hw/mem/mem_watch.h +++ b/core/hw/mem/mem_watch.h @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "types.h" #include "addrspace.h" #include "hw/aica/aica_if.h" diff --git a/core/hw/modem/modem.cpp b/core/hw/modem/modem.cpp index 29a273e97..f3d6e904d 100644 --- a/core/hw/modem/modem.cpp +++ b/core/hw/modem/modem.cpp @@ -28,10 +28,7 @@ #include "network/picoppp.h" #include "serialize.h" #include "cfg/option.h" - -#ifndef NDEBUG -#include "oslib/oslib.h" -#endif +#include "stdclass.h" #include #define MODEM_COUNTRY_RES 0 @@ -127,27 +124,27 @@ static u64 last_dial_time; static bool data_sent; #ifndef NDEBUG -static double last_comm_stats; +static u64 last_comm_stats; static int sent_bytes; static int recvd_bytes; static FILE *recv_fp; static FILE *sent_fp; #endif -static int modem_sched_func(int tag, int cycles, int jitter) +static int modem_sched_func(int tag, int cycles, int jitter, void *arg) { #ifndef NDEBUG - if (os_GetSeconds() - last_comm_stats >= 2) + if (getTimeMs() - last_comm_stats >= 2000) { if (last_comm_stats != 0) { - DEBUG_LOG(MODEM, "Stats sent %d (%.2f kB/s) received %d (%.2f kB/s) TDBE %d RDBF %d\n", sent_bytes, sent_bytes / 2000.0, + DEBUG_LOG(MODEM, "Stats sent %d (%.2f kB/s) received %d (%.2f kB/s) TDBE %d RDBF %d", sent_bytes, sent_bytes / 2000.0, recvd_bytes, recvd_bytes / 2000.0, modem_regs.reg1e.TDBE, modem_regs.reg1e.RDBF); sent_bytes = 0; recvd_bytes = 0; } - last_comm_stats = os_GetSeconds(); + last_comm_stats = getTimeMs(); } #endif int callback_cycles = 0; @@ -286,6 +283,8 @@ static int modem_sched_func(int tag, int cycles, int jitter) // This value is critical. Setting it too low will cause some sockets to stall. // Check Sonic Adventure 2 and Samba de Amigo (PAL) integrated browsers. // 143 us/bytes corresponds to 56K + // 57600 @ 10b: 174 + // 38400 @ 10b: 260 callback_cycles = SH4_MAIN_CLOCK / 1000000 * 143; modem_regs.reg1e.TDBE = 1; @@ -626,7 +625,10 @@ static void ModemNormalWrite(u32 reg, u32 data) { modem_regs.reg1a.SFRES = 0; LOG("Soft Reset SET && NEWC, executing reset and init"); + modem_reset(0); modem_reset(1); + modem_regs.reg1f.NEWC = 1; + modem_regs.ptr[0x20] = 0; } else { @@ -702,15 +704,13 @@ u32 ModemReadMem_A0_006(u32 addr, u32 size) case MS_ST_CONTROLER: case MS_ST_DSP: - if (reg==0x10) - { - modem_regs.reg1e.TDBE=0; + case MS_END_DSP: + if (reg == 0x10) + // don't reset TBDE to help kos modem self test + //modem_regs.reg1e.TDBE = 0; return 0; - } else - { return modem_regs.ptr[reg]; - } case MS_RESETING: return 0; //still reset diff --git a/core/hw/modem/modem_regs.h b/core/hw/modem/modem_regs.h index 08e739c59..d51de741e 100644 --- a/core/hw/modem/modem_regs.h +++ b/core/hw/modem/modem_regs.h @@ -34,9 +34,9 @@ union modemreg_t struct { u8 RXP:1; - u8 RXHF:1; - u8 TXHF:1; - u8 nil2:2; + u8 RXHF:1; // Receiver FIFO Half Full + u8 TXHF:1; // Transmitter FIFO Half Full + u8 :2; u8 VPAUSE:1; u8 VOLUME:2; } reg01; @@ -51,32 +51,32 @@ union modemreg_t u8 V54PE:1; u8 V54AE:1; u8 V54TE:1; - u8 RTSDE:1; - u8 nil1:1; + u8 RTSDE:1; // Remote RTS Pattern Detector Enable + u8 :1; u8 S511:1; } v0; struct { u8 CODBITS:2; - u8 nil2:2; + u8 :2; u8 CDEN:1; u8 DCDEN:1; } v1; struct { - u8 nila:6; - u8 TDE:1; - u8 SQDIS:1; + u8 :6; + u8 TDE:1; // Tone Detectors Enable + u8 SQDIS:1; // Squarer Disable (Tone Detector C) }; }; } reg02; //03 EPT SEPT SRCEN RLSDE - - GTE GTS struct { - u8 GTS:1; - u8 GTE:1; - u8 nil2:2; - u8 RLSDE:1; + u8 GTS:1; // Guard Tone Select + u8 GTE:1; // Guard Tone Enable + u8 :2; + u8 RLSDE:1; // RLSD Enable u8 SRCEN:1; u8 SEPT:1; u8 EPT:1; @@ -87,65 +87,65 @@ union modemreg_t u8 STRN:1; u8 TOD:1; u8 NRZIEN_VAGC:1; - u8 nil1_1:1; - u8 FIFOEN:1; - u8 nil1:2; + u8 :1; + u8 FIFOEN:1; // FIFO Enable + u8 :2; u8 RB:1; } reg04; //05 - - - TXSQ CEQ - STOFF - struct { - u8 nil1_2:1; + u8 :1; u8 STOFF:1; - u8 nil1_1:1; - u8 CEQ:1; + u8 :1; + u8 CEQ:1; // Compromise Equalizer Enable u8 TXSQ:1; - u8 nil1:3; + u8 :3; } reg05; //06 - EXOS - HDLC PEN STB WDSZ/DECBITS struct { u8 WDSZ_DECBITS:2; u8 STB:1; - u8 PEN:1; - u8 HDLC:1; - u8 nil1_1:1; + u8 PEN:1; // Parity Enable + u8 HDLC:1; // HDLC Select + u8 :1; u8 EXOS:1; - u8 nil1:1; + u8 :1; } reg06; //07 RDLE RDL L2ACT - L3ACT - RA MHLD struct { u8 MHLD:1; - u8 RA:1; - u8 nil1_1:1; + u8 RA:1; // Relay A Activate + u8 :1; u8 L3ACT:1; - u8 nil1:1; + u8 :1; u8 L2ACT:1; - u8 RDL:1; - u8 RDLE:1; + u8 RDL:1; // Remote Digital Loopback + u8 RDLE:1; // Remote Digital Loopback Response Enable } reg07; //08 ASYN TPDM V21S V54T V54A V54P RTRN RTS struct { - u8 RTS:1; - u8 RTRN:1; + u8 RTS:1; // Request to Send + u8 RTRN:1; // Retrain u8 V54P:1; u8 V54A:1; u8 V54T:1; u8 V21S:1; - u8 TPDM:1; - u8 ASYN:1; + u8 TPDM:1; // Transmitter Parallel Data Mode + u8 ASYN:1; // Asynchronous/Synchronous } reg08; //09 NV25 CC DTMF ORG LL DATA RRTSE DTR struct { - u8 DTR:1; - u8 RRTSE:1; - u8 DATA:1; + u8 DTR:1; // Data Terminal Ready + u8 RRTSE:1; // Remote RTS Signaling Enable + u8 DATA:1; // Control bit DATA u8 LL:1; u8 ORG:1; - u8 DTMF:1; + u8 DTMF:1; // DTMF Select u8 CC:1; u8 NV25:1; } reg09; @@ -153,12 +153,12 @@ union modemreg_t struct { u8 SYNCD:1; - u8 FLAGS:1; + u8 FLAGS:1; // Flag Sequence u8 CRCS:1; u8 OE:1; - u8 FE:1; - u8 PE:1; - u8 FLAGDT:1; + u8 FE:1; // Framing Error + u8 PE:1; // Parity Error + u8 FLAGDT:1; // V.21 Channel 2 Flag Detected u8 PNSUC:1; } reg0a; //0B TONEA TONEB TONEC ATV25 ATBEL - DISDET EQMAT @@ -166,18 +166,18 @@ union modemreg_t { u8 EQMAT:1; u8 DISDET:1; - u8 nil:1; + u8 :1; u8 ATBEL:1; - u8 ATV25:1; - u8 TONEC:1; - u8 TONEB:1; - u8 TONEA:1; + u8 ATV25:1; // V25 Answer Tone Detector + u8 TONEC:1; // Tone C Detected + u8 TONEB:1; // Tone B Detected + u8 TONEA:1; // Tone A Detected } reg0b; //0C AADET ACDET CADET CCDET SDET SNDET RXFNE RSEQ struct { - u8 RSEQ:1; - u8 RXFNE:1; + u8 RSEQ:1; // Rate Sequence Received + u8 RXFNE:1; // Receiver FIFO Not Empty u8 SNDET:1; u8 SDET:1; u8 CCDET:1; @@ -188,9 +188,9 @@ union modemreg_t //0D P2DET PNDET S1DET SCR1 U1DET - TXFNF - struct { - u8 nil2:1; - u8 TXFNF:1; - u8 nil1:1; + u8 :1; + u8 TXFNF:1; // Transmitter FIFO Not Full + u8 :1; u8 U1DET:1; u8 SCR1:1; u8 S1DET:1; @@ -200,7 +200,7 @@ union modemreg_t //0E RTDET BRKD RREDT SPEED struct { - u8 SPEED:5; + u8 SPEED:5; // Speed Indication u8 RREDT:1; u8 BRKD:1; u8 RTDET:1; @@ -209,13 +209,13 @@ union modemreg_t struct { u8 V54DT:1; - u8 RTSDT:1; + u8 RTSDT:1; // Remote RTS Pattern Detected u8 TM:1; - u8 RI:1; - u8 DSR:1; - u8 CTS:1; - u8 FED:1; - u8 RLSD:1; + u8 RI:1; // Ring Indicator + u8 DSR:1; // Data Set Ready + u8 CTS:1; // Clear To Send + u8 FED:1; // Fast Energy Detector + u8 RLSD:1; // Received Line Signal Detector } reg0f; //10 Transmit Data Buffer (TBUFFER)/Voice Transmit Buffer (VBUFT) u8 reg10; @@ -227,7 +227,7 @@ union modemreg_t u8 V23HDX:1; u8 RXV:1; u8 TXV:1; - u8 PARSL:2; + u8 PARSL:2; // Parity Select u8 BRKS:1; } reg11; //12 Configuration (CONF) @@ -235,9 +235,9 @@ union modemreg_t //13 TLVL RTH TXCLK struct { - u8 TLVL:4; - u8 RTH:2; - u8 TXCLK:2; + u8 TLVL:4; // Transmit Level + u8 RTH:2; // Receiver Threshold + u8 TXCLK:2; // Transmit Clock Select } reg13; //14 ABCODE u8 reg14; @@ -247,9 +247,9 @@ union modemreg_t u8 EARC:1; u8 EXL3:1; u8 RREN:1; - u8 AUTO:1; - u8 HWRWK:1; - u8 RDWK:1; + u8 AUTO:1; // Automatic Mode Change Enable + u8 HWRWK:1; // Host Write Wake up + u8 RDWK:1; // Ring Detect Wake up u8 STOP:1; u8 SLEEP:1; } reg15; @@ -263,14 +263,14 @@ union modemreg_t //1A SFRES RIEN RION DMAE - SCOBF SCIBE SECEN struct { - u8 SECEN:1; - u8 SCIBE:1; - u8 SCOBF:1; - u8 nil:1; + u8 SECEN:1; // Secondary Channel Enable + u8 SCIBE:1; // Secondary Channel Input Buffer Empty + u8 SCOBF:1; // Secondary Channel Output Buffer Full + u8 :1; u8 DMAE:1; - u8 RION:1; - u8 RIEN:1; - u8 SFRES:1; + u8 RION:1; // Ring Indicator On + u8 RIEN:1; // RION Enable + u8 SFRES:1; // Soft Reset } reg1a; //1B EDET DTDET OTS DTMFD DTMFW struct @@ -285,36 +285,36 @@ union modemreg_t //1D MEACC - MEMW MEMCR Memory Access Address High B11-B8 (MEADDH) struct { - u8 MEMADD_l:8; //anything else exept u8 breaks it ? WTFH ? - u8 MEMADD_h:4; - u8 MEMCR:1; - u8 MEMW:1; - u8 nil:1; - u8 MEACC:1; + u8 MEMADD_l:8; // Memory Access Address Low + u8 MEMADD_h:4; // Memory Access Address High + u8 MEMCR:1; // Memory Continuous Read + u8 MEMW:1; // Memory Write + u8 :1; + u8 MEACC:1; // Memory Access Enable } reg1c_1d; //1E TDBIA RDBIA TDBIE - TDBE RDBIE - RDBF struct { - u8 RDBF:1; - u8 nil:1; - u8 RDBIE:1; - u8 TDBE:1; - u8 nil2:1; - u8 TDBIE:1; - u8 RDBIA:1; - u8 TDBIA:1; + u8 RDBF:1; // Receive Data Buffer Full + u8 :1; + u8 RDBIE:1; // Receive Data Buffer Interrupt Enable + u8 TDBE:1; // Transmit Data Buffer Empty + u8 :1; + u8 TDBIE:1; // Transmit Data Buffer Interrupt Enable + u8 RDBIA:1; // Receive Data Buffer Interrupt Active + u8 TDBIA:1; // Transmit Data Buffer Interrupt Active } reg1e; //1F NSIA NCIA - NSIE NEWS NCIE - NEWC struct { - u8 NEWC:1; - u8 nil:1; - u8 NCIE:1; - u8 NEWS :1; - u8 NSIE:1; - u8 nil2:1; - u8 NCIA:1; - u8 NSIA:1; + u8 NEWC:1; // New Configuration + u8 :1; + u8 NCIE:1; // NEWC Interrupt Enable + u8 NEWS :1; // New Status + u8 NSIE:1; // NEWS Interrupt Enable + u8 :1; + u8 NCIA:1; // NEWC Interrupt Active + u8 NSIA:1; // NEWS Interrupt Active } reg1f; }; }; diff --git a/core/hw/naomi/card_reader.cpp b/core/hw/naomi/card_reader.cpp index 20963fcd1..8dffa1cf1 100644 --- a/core/hw/naomi/card_reader.cpp +++ b/core/hw/naomi/card_reader.cpp @@ -20,23 +20,28 @@ #include "oslib/oslib.h" #include "hw/sh4/modules/modules.h" #include "hw/maple/maple_cfg.h" +#include "hw/maple/maple_devs.h" #include #include -#include +#include namespace card_reader { -class CardReader +class CardReaderWriter { -protected: - u8 calcCrc(u8 *data, u32 len) +public: + virtual ~CardReaderWriter() = default; + + void insertCard() { - u32 crc = 0; - for (u32 i = 0; i < len; i++) - crc ^= data[i]; - return crc; + cardInserted = loadCard(); + if (cardInserted) + INFO_LOG(NAOMI, "Card inserted"); } +protected: + virtual bool loadCard() = 0; + bool loadCard(u8 *cardData, u32 len) { std::string path = hostfs::getArcadeFlashPath() + ".card"; @@ -44,7 +49,7 @@ class CardReader if (fp == nullptr) return false; - DEBUG_LOG(NAOMI, "Loading card file from %s", path.c_str()); + INFO_LOG(NAOMI, "Loading card file from %s", path.c_str()); if (fread(cardData, 1, len, fp) != len) WARN_LOG(NAOMI, "Truncated or empty card file: %s" ,path.c_str()); fclose(fp); @@ -61,16 +66,34 @@ class CardReader WARN_LOG(NAOMI, "Can't create card file %s: errno %d", path.c_str(), errno); return; } - DEBUG_LOG(NAOMI, "Saving card file to %s", path.c_str()); + INFO_LOG(NAOMI, "Saving card file to %s", path.c_str()); if (fwrite(cardData, 1, len, fp) != len) WARN_LOG(NAOMI, "Truncated write to file: %s", path.c_str()); fclose(fp); } -}; + template + static u8 calcCrc(T begin, T end) + { + u32 crc = 0; + for (auto it = begin; it != end; it++) + crc ^= *it; + return crc; + } + + bool cardInserted = false; + std::deque outBuffer; + std::vector inBuffer; + + static constexpr u8 STX = 2; + static constexpr u8 ETX = 3; + static constexpr u8 ENQ = 5; + static constexpr u8 ACK = 6; +}; /* - Initial D card reader protocol (from my good friend Metallic) + Sanwa CRP-1231BR-10 card reader/writer protocol (from my good friend Metallic) + used in InitialD and Derby Owners Club >>> SEND PKT: [START 02][LEN][CMD][0][0][0]{optional data}[STOP 03][CRC] <<< RECV ACK: [OK 06] @@ -99,101 +122,95 @@ class CardReader Protocol dumps and more: https://www.arcade-projects.com/threads/naomi-2-chihiro-triforce-card-reader-emulator-initial-d3-wmmt-mario-kart-f-zero-ax.814/ - */ -class InitialDCardReader final : public CardReader, SerialPipe -{ -public: - InitialDCardReader() { - serial_setPipe(this); - } - ~InitialDCardReader() { - serial_setPipe(nullptr); - } + Bits from YACardEmu: https://github.com/GXTX/YACardEmu/ + Copyright (C) 2020-2023 wutno (https://github.com/GXTX) + Copyright (C) 2022-2023 tugpoat (https://github.com/tugpoat) +*/ +class SanwaCRP1231BR : public CardReaderWriter, public SerialPort::Pipe +{ +public: void write(u8 b) override { - if (inBufferIdx == 0 && b == 5) + if (inBuffer.empty() && b == ENQ) { DEBUG_LOG(NAOMI, "Received RQ(5)"); handleCommand(); return; } - inBuffer[inBufferIdx++] = b; - if (inBufferIdx >= 3) + inBuffer.push_back(b); + if (inBuffer.size() >= 3) { - if (inBuffer[0] != 2) + if (inBuffer[0] != STX) { INFO_LOG(NAOMI, "Unexpected cmd start byte %x", inBuffer[0]); - inBufferIdx = 0; + inBuffer.clear(); return; } u32 len = inBuffer[1]; - if (inBufferIdx < len + 2) + if (inBuffer.size() < len + 2) { - if (inBufferIdx == sizeof(inBuffer)) + if (inBuffer.size() == 256) { WARN_LOG(NAOMI, "Card reader buffer overflow"); - inBufferIdx = 0; + inBuffer.clear(); } return; } - u32 crc = calcCrc(&inBuffer[1], inBufferIdx - 2); - if (crc != inBuffer[inBufferIdx - 1]) + u32 crc = calcCrc(inBuffer.begin() + 1, inBuffer.end() - 1); + if (crc != inBuffer.back()) { - INFO_LOG(NAOMI, "Wrong crc: expected %x got %x", crc, inBuffer[inBufferIdx - 1]); - inBufferIdx = 0; + INFO_LOG(NAOMI, "Wrong crc: expected %x got %x", crc, inBuffer.back()); + inBuffer.clear(); return; } DEBUG_LOG(NAOMI, "Received cmd %x len %d", inBuffer[2], inBuffer[1]); - outBuffer[outBufferLen++] = 6; // ACK - rxCommandLen = inBufferIdx - 3; - memcpy(rxCommand, inBuffer + 2, rxCommandLen); - inBufferIdx = 0; + outBuffer.push_back(ACK); + rxCommandLen = std::min(inBuffer.size() - 3, sizeof(rxCommand)); + memcpy(rxCommand, &inBuffer[2], rxCommandLen); + inBuffer.clear(); } } u8 read() override { - verify(outBufferIdx < outBufferLen); - u8 b = outBuffer[outBufferIdx++]; + if (outBuffer.empty()) + return 0; + u8 b = outBuffer.front(); + outBuffer.pop_front(); DEBUG_LOG(NAOMI, "Sending %x", b); - if (outBufferIdx == outBufferLen) - outBufferIdx = outBufferLen = 0; return b; } int available() override { - return outBufferLen - outBufferIdx; - } - - void insertCard() - { - cardInserted = loadCard(cardData, sizeof(cardData)); - if (cardInserted) - INFO_LOG(NAOMI, "Card inserted"); + return outBuffer.size(); } -private: +protected: enum Commands { CARD_INIT = 0x10, CARD_GET_CARD_STATE = 0x20, - CARD_IS_PRESENT = 0x40, // cancel? + CARD_CANCEL = 0x40, CARD_LOAD_CARD = 0xB0, CARD_CLEAN_CARD = 0xA0, CARD_READ = 0x33, CARD_WRITE = 0x53, - CARD_WRITE_INFO = 0x7C, - CARD_PRINT = 0x78, - CARD_7A = 0x7A, - CARD_7D = 0x7D, + CARD_PRINT = 0x7C, + CARD_PRINT_SETTINGS = 0x78, + CARD_REGISTER_FONT = 0x7A, + CARD_ERASE_PRINT = 0x7D, CARD_DOOR = 0xD0, CARD_EJECT = 0x80, CARD_NEW = 0xB0, }; - u8 getStatus1() + bool loadCard() override { + return CardReaderWriter::loadCard(cardData, sizeof(cardData)); + } + + virtual u8 getStatus1() { return ((doorOpen ? 2 : 1) << 6) | 0x20 | (cardInserted ? 0x18 : 0); } @@ -202,9 +219,8 @@ class InitialDCardReader final : public CardReader, SerialPipe { if (rxCommandLen == 0) return; - outBuffer[outBufferLen++] = 2; - u32 crcIdx = outBufferLen; - u8 len = 6; + outBuffer.push_back(STX); + u32 crcIdx = outBuffer.size(); u8 status1 = getStatus1(); u8 status2 = '0'; u8 status3 = '0'; @@ -212,38 +228,76 @@ class InitialDCardReader final : public CardReader, SerialPipe { case CARD_DOOR: doorOpen = rxCommand[4] == '1'; + INFO_LOG(NAOMI, "Door %s", doorOpen ? "open" : "closed"); status1 = getStatus1(); break; case CARD_NEW: + INFO_LOG(NAOMI, "New card"); cardInserted = true; doorOpen = false; status1 = getStatus1(); break; case CARD_WRITE: - memcpy(cardData, &rxCommand[7], sizeof(cardData)); + // 4: mode ('0': read 0x45 bytes, '1': variable length write 1-47 bytes) + // 5: parity ('0': 7-bit parity, '1': 8-bit no parity) + // 6: track (see below) + INFO_LOG(NAOMI, "Card write mode %c parity %c track %c", rxCommand[4], rxCommand[5], rxCommand[6]); + switch (rxCommand[6]) + { + case '0': // track 1 + memcpy(cardData, &rxCommand[7], TRACK_SIZE); + break; + case '1': // track 2 + memcpy(cardData + TRACK_SIZE, &rxCommand[7], TRACK_SIZE); + break; + case '2': // track 3 + memcpy(cardData + TRACK_SIZE * 2, &rxCommand[7], TRACK_SIZE); + break; + case '3': // track 1 & 2 + memcpy(cardData, &rxCommand[7], TRACK_SIZE * 2); + break; + case '4': // track 1 & 3 + memcpy(cardData, &rxCommand[7], TRACK_SIZE); + memcpy(cardData + TRACK_SIZE * 2, &rxCommand[7 + TRACK_SIZE], TRACK_SIZE); + break; + case '5': // track 2 & 3 + memcpy(cardData + TRACK_SIZE, &rxCommand[7], TRACK_SIZE * 2); + break; + case '6': // track 1 2 & 3 + memcpy(cardData, &rxCommand[7], TRACK_SIZE * 3); + break; + default: + WARN_LOG(NAOMI, "Unknown track# %02x", rxCommand[6]); + break; + } saveCard(cardData, sizeof(cardData)); break; case CARD_READ: - if (cardInserted && !doorOpen) - len = 6 + sizeof(cardData); - else + // 4: mode ('0': read 0x45 bytes, '1': variable length read 1-47 bytes, '2': card capture, pull in card?) + // 5: parity ('0': 7-bit parity, '1': 8-bit no parity) + // 6: track (see below) + INFO_LOG(NAOMI, "Card read mode %c parity %c track %c", rxCommand[4], rxCommand[5], rxCommand[6]); + if (!cardInserted || doorOpen) status3 = cardInserted ? '0' : '4'; break; case CARD_EJECT: + NOTICE_LOG(NAOMI, "Card ejected"); + if (cardInserted) + os_notify("Card ejected", 2000); cardInserted = false; status1 = getStatus1(); break; - case CARD_IS_PRESENT: + case CARD_CANCEL: case CARD_GET_CARD_STATE: case CARD_INIT: - case CARD_7A: + case CARD_REGISTER_FONT: + case CARD_PRINT_SETTINGS: case CARD_PRINT: - case CARD_WRITE_INFO: case CARD_CLEAN_CARD: break; @@ -251,55 +305,387 @@ class InitialDCardReader final : public CardReader, SerialPipe WARN_LOG(NAOMI, "Unknown command %x", rxCommand[0]); break; } - outBuffer[outBufferLen++] = len; - outBuffer[outBufferLen++] = rxCommand[0]; - outBuffer[outBufferLen++] = status1; - outBuffer[outBufferLen++] = status2; - outBuffer[outBufferLen++] = status3; - if (rxCommand[0] == CARD_READ && cardInserted && !doorOpen) + outBuffer.push_back(ACK); + outBuffer.push_back(rxCommand[0]); + outBuffer.push_back(status1); + outBuffer.push_back(status2); + outBuffer.push_back(status3); + if (rxCommand[0] == CARD_READ && cardInserted && !doorOpen && rxCommand[4] != '2') { - memcpy(&outBuffer[outBufferLen], cardData, sizeof(cardData)); - outBufferLen += sizeof(cardData); + u32 idx = 0; + u32 size = TRACK_SIZE; + switch (rxCommand[6]) + { + case '0': // track 1 + break; + case '1': // track 2 + idx = TRACK_SIZE; + break; + case '2': // track 3 + idx = TRACK_SIZE * 2; + break; + case '3': // track 1 & 2 + size = TRACK_SIZE * 2; + break; + case '4': // track 1 & 3 + for (u32 i = 0; i < TRACK_SIZE; i++) + outBuffer.push_back(cardData[i]); + outBuffer[crcIdx] += TRACK_SIZE; + idx = TRACK_SIZE * 2; + break; + case '5': // track 2 & 3 + idx = TRACK_SIZE; + size = TRACK_SIZE * 2; + break; + case '6': // track 1 2 & 3 + size = TRACK_SIZE * 3; + break; + default: + WARN_LOG(NAOMI, "Unknown track# %02x", rxCommand[6]); + size = 0; + break; + } + for (u32 i = 0; i < size; i++) + outBuffer.push_back(cardData[idx + i]); + outBuffer[crcIdx] += size; } - outBuffer[outBufferLen++] = 3; - outBuffer[outBufferLen] = calcCrc(&outBuffer[crcIdx], outBufferLen - crcIdx); - outBufferLen++; + outBuffer.push_back(ETX); + outBuffer.push_back(calcCrc(outBuffer.begin() + crcIdx, outBuffer.end())); } - u8 inBuffer[256]; - u32 inBufferIdx = 0; - u8 rxCommand[256]; u32 rxCommandLen = 0; - u8 outBuffer[256]; - u32 outBufferIdx = 0; - u32 outBufferLen = 0; - - u8 cardData[207]; + static constexpr u32 TRACK_SIZE = 0x45; + u8 cardData[TRACK_SIZE * 3]; bool doorOpen = false; - bool cardInserted = false; }; -static std::unique_ptr initdReader; +class SanwaCRP1231LR : public SanwaCRP1231BR +{ + u8 getStatus1() override + { + // '0' no card + // '1' pos magnetic read/write + // '2' pos thermal printer + // '3' pos thermal dispenser + // '4' ejected not removed + return cardInserted ? '1' : '0'; + } +}; + +// Hooked to the SH4 SCIF serial port +class InitialDCardReader final : public SanwaCRP1231BR +{ +public: + InitialDCardReader() { + SCIFSerialPort::Instance().setPipe(this); + } + + ~InitialDCardReader() override { + SCIFSerialPort::Instance().setPipe(nullptr); + } +}; + +// Hooked to the MIE via a 838-13661 RS232/RS422 converter board +class DerbyBRCardReader final : public SanwaCRP1231BR +{ +public: + DerbyBRCardReader() { + getMieDevice()->setPipe(this); + } + + ~DerbyBRCardReader() override { + getMieDevice()->setPipe(nullptr); + } +}; + +class DerbyLRCardReader final : public SanwaCRP1231LR +{ +public: + DerbyLRCardReader() { + getMieDevice()->setPipe(this); + } + + ~DerbyLRCardReader() override { + getMieDevice()->setPipe(nullptr); + } +}; + +/* + Club Kart - Sanwa CR-1231R + +>>> SEND CMD: [START 02][CMD char1][CMD char2]{parameter char}{data}[STOP 03][CRC] +<<< RECV ACK: [OK 06] or [ERR 15] +<<< RECV STX: [START 02]{REPLY}{data}[STOP 03][CRC] + note: it seems reply packet sent only after command fully completed or error happened + + REPLY: 2chars + OK - RESULT_OK + O1 - RESULT_CANCEL_INSERT + N0 - ERROR_CONNECT / Unknown Error + N1 - ERROR_COMMAND / Connection Error + N2 - ERROR_MOTOR / Mechanic Error 1 + N3 - ERROR_HEAD_UPDOWN / Mechanic Error 2 + N4 - ERROR_CARD_STUCK / Card Stuffed + N5 - ERROR_VERIFY / OK ???? + N6 - ERROR_HEAD_TEMP / Mechanic Error 3 + N7 - ERROR_CARD_EMPTY / Card Empty + N8 - ERROR_CARD_LOAD / Draw Card Error + N9 - ERROR_NO_HOPPER / Card Empty + NA - ERROR_CARD_PRESENT + NB - ERROR_CARD_EJECT + NC - ERROR_CANT_CANCEL + ND - ERROR_NOT_INSERT + NE - ERROR_NOT_WAIT + NF - ERROR_BAD_CARD + + CMD SS REPLY: 6 ASCII characters + 5chars '0'/'1' - Card Sensors Status, MSB first + 0 + 10 18 + 1C C E 8 7 3 + other + 1char '0'/'1' - Dispenser Status + '0' - Empty + '1' - Full + +Commands: +IN - init +CA - cancel command +OT0 - eject card +HI - get new card from dispenser +CL - cleaning +RT5 - unknown +RL - read data/load card into reader +WL - write data (followed by 69 bytes of data) +SS - get status + +reply for commands is simple +06 +02 'O' 'K' 03 crc +except +- RL command, which have 69 bytes of card data after OK (or no any reply if no card insterted) +- SS command, which is +06 +02 '0/1' '0/1' '0/1' '0/1' '0/1' '0/1' 03 crc +there 0/1 - encoded in char binary value described earlier + */ +class ClubKartCardReader : public CardReaderWriter, SerialPort::Pipe +{ +public: + ClubKartCardReader() { + SCIFSerialPort::Instance().setPipe(this); + } + ~ClubKartCardReader() override { + SCIFSerialPort::Instance().setPipe(nullptr); + } + + void write(u8 data) override + { + inBuffer.push_back(data); + if (inBuffer.size() == 5) + { + if ((inBuffer[1] != 'W' || inBuffer[2] != 'L') && inBuffer[2] != 'T') + { + handleCommand(); + inBuffer.clear(); + } + } + else if (inBuffer.size() == 6 && inBuffer[2] == 'T') // OT0, RT5 + { + handleCommand(); + inBuffer.clear(); + } + else if (inBuffer.size() == TRACK_SIZE + 5) // WL + { + handleCommand(); + inBuffer.clear(); + } + } + + int available() override { + return outBuffer.size(); + } + + u8 read() override + { + if (outBuffer.empty()) + return 0; + u8 b = outBuffer.front(); + outBuffer.pop_front(); + return b; + } + +private: + enum Commands { + CARD_INIT, + CARD_CANCEL_CMD, + CARD_EJECT, + CARD_NEW, + CARD_CLEAN, + CARD_RT5, + CARD_READ, + CARD_WRITE, + CARD_STATUS, + + CARD_MAX + }; + static const u8 CommandBytes[][2]; + + bool loadCard() override + { + bool rc = CardReaderWriter::loadCard(cardData, sizeof(cardData)); + if (rc && readPending) + { + sendReply(CARD_READ); + readPending = false; + } + return rc; + } + + void handleCommand() + { + readPending = false; + int cmd; + for (cmd = 0; cmd < CARD_MAX; cmd++) + if (inBuffer[1] == CommandBytes[cmd][0] && inBuffer[2] == CommandBytes[cmd][1]) + break; + if (cmd == CARD_MAX) + { + WARN_LOG(NAOMI, "Unhandled command '%c%c'", inBuffer[1], inBuffer[2]); + return; + } + u32 crc = calcCrc(inBuffer.begin() + 1, inBuffer.end() - 1); + if (crc != inBuffer.back()) + { + WARN_LOG(NAOMI, "Wrong crc: expected %x got %x", crc, inBuffer.back()); + return; + } + outBuffer.push_back(ACK); + switch (cmd) + { + case CARD_WRITE: + INFO_LOG(NAOMI, "Card write"); + for (u32 i = 0; i < sizeof(cardData); i++) + cardData[i] = inBuffer[i + 3]; + saveCard(cardData, sizeof(cardData)); + break; + case CARD_READ: + INFO_LOG(NAOMI, "Card read"); + if (!cardInserted) { + readPending = true; + return; + } + break; + case CARD_EJECT: + NOTICE_LOG(NAOMI, "Card ejected"); + if (cardInserted) + os_notify("Card ejected", 2000); + cardInserted = false; + break; + case CARD_NEW: + INFO_LOG(NAOMI, "New card"); + cardInserted = true; + break; + case CARD_INIT: + DEBUG_LOG(NAOMI, "Card init"); + break; + case CARD_CANCEL_CMD: + DEBUG_LOG(NAOMI, "Cancel cmd"); + break; + case CARD_CLEAN: + DEBUG_LOG(NAOMI, "Card clean"); + break; + case CARD_RT5: + DEBUG_LOG(NAOMI, "Card RT5"); + break; + case CARD_STATUS: + DEBUG_LOG(NAOMI, "Card status (cardInserted %d)", cardInserted); + break; + } + sendReply(cmd); + } + + void sendReply(int cmd) + { + outBuffer.push_back(STX); + u32 crcIndex = outBuffer.size(); + if (cmd == CARD_STATUS) + { + outBuffer.push_back('0'); + outBuffer.push_back('0'); + outBuffer.push_back('0'); + outBuffer.push_back(cardInserted ? '1' : '0'); + outBuffer.push_back(cardInserted ? '1' : '0'); + outBuffer.push_back('1'); // dispenser full + } + else + { + outBuffer.push_back('O'); + outBuffer.push_back('K'); + if (cmd == CARD_READ) { + for (u32 i = 0; i < sizeof(cardData); i++) + outBuffer.push_back(cardData[i]); + } + } + outBuffer.push_back(ETX); + outBuffer.push_back(calcCrc(outBuffer.begin() + crcIndex, outBuffer.end())); + } + + static constexpr u32 TRACK_SIZE = 0x45; + u8 cardData[TRACK_SIZE]; + + bool readPending = false; +}; + +const u8 ClubKartCardReader::CommandBytes[][2] +{ + { 'I', 'N' }, // init + { 'C', 'A' }, // cancel command + { 'O', 'T' }, // ...0 - eject card + { 'H', 'I' }, // get new card from dispenser + { 'C', 'L' }, // cleaning + { 'R', 'T' }, // ...5 - unknown + { 'R', 'L' }, // read data/load card into reader + { 'W', 'L' }, // write data (followed by 69 bytes of data) + { 'S', 'S' }, // get status +}; + +static std::unique_ptr cardReader; void initdInit() { - initdReader = std::make_unique(); + term(); + cardReader = std::make_unique(); +} + +void derbyInit() +{ + term(); + if (settings.content.gameId == " DERBY OWNERS CLUB WE ---------") + cardReader = std::make_unique(); + else + cardReader = std::make_unique(); } -void initdTerm() { - initdReader.reset(); +void clubkInit() { + term(); + cardReader = std::make_unique(); } -class BarcodeReader final : public SerialPipe +void term() { + cardReader.reset(); +} + +class BarcodeReader final : public SerialPort::Pipe { public: BarcodeReader() { - serial_setPipe(this); + SCIFSerialPort::Instance().setPipe(this); } - ~BarcodeReader() { - serial_setPipe(nullptr); + ~BarcodeReader() override { + SCIFSerialPort::Instance().setPipe(nullptr); } int available() override { @@ -320,7 +706,7 @@ class BarcodeReader final : public SerialPipe INFO_LOG(NAOMI, "Card read: %s", card.c_str()); std::string data = card + "*"; toSend.insert(toSend.end(), (const u8 *)&data[0], (const u8 *)(&data.back() + 1)); - serial_updateStatusRegister(); + SCIFSerialPort::Instance().updateStatus(); } std::string getCard() const { @@ -366,12 +752,19 @@ void barcodeSetCard(const std::string& card) void insertCard(int playerNum) { - if (initdReader != nullptr) - initdReader->insertCard(); + if (cardReader != nullptr) + cardReader->insertCard(); else if (barcodeReader != nullptr) barcodeReader->insertCard(); else insertRfidCard(playerNum); } +bool readerAvailable() +{ + return cardReader != nullptr + || barcodeAvailable() + || getRfidCardData(0) != nullptr; +} + } diff --git a/core/hw/naomi/card_reader.h b/core/hw/naomi/card_reader.h index 534333338..dce392992 100644 --- a/core/hw/naomi/card_reader.h +++ b/core/hw/naomi/card_reader.h @@ -22,7 +22,9 @@ namespace card_reader { void initdInit(); -void initdTerm(); +void derbyInit(); +void clubkInit(); +void term(); void barcodeInit(); void barcodeTerm(); @@ -31,5 +33,6 @@ std::string barcodeGetCard(); void barcodeSetCard(const std::string& card); void insertCard(int playerNum); +bool readerAvailable(); } diff --git a/core/hw/naomi/gdcartridge.cpp b/core/hw/naomi/gdcartridge.cpp index d27287db7..7c1a7a07a 100644 --- a/core/hw/naomi/gdcartridge.cpp +++ b/core/hw/naomi/gdcartridge.cpp @@ -14,6 +14,14 @@ #include "stdclass.h" #include "emulator.h" #include "oslib/storage.h" +#include "naomi_regs.h" +#include "hw/holly/sb.h" +#include "hw/holly/holly_intc.h" +#include "hw/mem/addrspace.h" +#include "serialize.h" +#include "hw/sh4/sh4_sched.h" +#include "naomi.h" +#include /* @@ -437,7 +445,7 @@ void GDCartridge::find_file(const char *name, const u8 *dir_sector, u32 &file_st void GDCartridge::read_gdrom(Disc *gdrom, u32 sector, u8* dst, u32 count, LoadProgress *progress) { - gdrom->ReadSectors(sector + 150, count, dst, 2048, progress); + gdrom->ReadSectors(sector + 150, count, dst, 2048, false, progress); } void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) @@ -448,6 +456,7 @@ void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) dimm_data = NULL; } dimm_data_size = 0; + loadedSegments.clear(); char name[128]; memset(name,'\0',128); @@ -494,19 +503,25 @@ void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) u8 buffer[2048]; std::string parent = hostfs::storage().getParentPath(settings.content.path); std::string gdrom_path = get_file_basename(settings.content.fileName) + "/" + gdrom_name; - gdrom_path = hostfs::storage().getSubPath(parent, gdrom_path); - std::unique_ptr gdrom = std::unique_ptr(OpenDisc(gdrom_path + ".chd", digest)); - if (gdrom == nullptr) - gdrom = std::unique_ptr(OpenDisc(gdrom_path + ".gdi", digest)); - if (gdrom_parent_name != nullptr && gdrom == nullptr) + try { + gdrom_path = hostfs::storage().getSubPath(parent, gdrom_path); + gdrom = std::unique_ptr(OpenDisc(gdrom_path + ".chd", digest)); + } + catch (const FlycastException& e) { - std::string gdrom_parent_path = hostfs::storage().getSubPath(parent, std::string(gdrom_parent_name) + "/" + gdrom_name); - gdrom = std::unique_ptr(OpenDisc(gdrom_parent_path + ".chd", digest)); + WARN_LOG(NAOMI, "Opening chd failed: %s", e.what()); + if (gdrom_parent_name != nullptr) + { + try { + std::string gdrom_parent_path = hostfs::storage().getSubPath(parent, std::string(gdrom_parent_name) + "/" + gdrom_name); + gdrom = std::unique_ptr(OpenDisc(gdrom_parent_path + ".chd", digest)); + } catch (const FlycastException& e) { + WARN_LOG(NAOMI, "Opening parent chd failed: %s", e.what()); + } + } if (gdrom == nullptr) - gdrom = std::unique_ptr(OpenDisc(gdrom_parent_path + ".gdi", digest)); + throw NaomiCartException("Naomi GDROM: Cannot open " + gdrom_path + ".chd"); } - if (gdrom == nullptr) - throw NaomiCartException("Naomi GDROM: Cannot open " + gdrom_path + ".chd or " + gdrom_path + ".gdi"); // primary volume descriptor // read frame 0xb06e (frame=sector+150) @@ -522,7 +537,7 @@ void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) // directory u8 dir_sector[2048]; // find data of file - u32 file_start, file_size; + u32 file_size; if (netpic == 0) { u32 dir = ((buffer[0x2 + 0] << 0) | @@ -582,25 +597,11 @@ void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) if (dimm_data_size != file_rounded_size) memset(dimm_data + file_rounded_size, 0, dimm_data_size - file_rounded_size); - // read encrypted data into dimm_data - u32 sectors = file_rounded_size / 2048; - read_gdrom(gdrom.get(), file_start, dimm_data, sectors, progress); + loadedSegments.resize(dimm_data_size / SEGMENT_SIZE); + std::fill(loadedSegments.begin() + (file_rounded_size + SEGMENT_SIZE - 1) / SEGMENT_SIZE, + loadedSegments.end(), true); - // decrypt loaded data - u32 des_subkeys[32]; des_generate_subkeys(rev64(key), des_subkeys); - - for (u32 i = 0; i < file_rounded_size; i += 8) - { - if ((i & 0xfff) == 0 && progress != nullptr) - { - if (progress->cancelled) - throw LoadCancelledException(); - progress->label = "Decrypting..."; - progress->progress = (float)(i + 8) / file_rounded_size; - } - *(u64 *)(dimm_data + i) = des_encrypt_decrypt(*(u64 *)(dimm_data + i), des_subkeys); - } } if (!dimm_data) @@ -608,6 +609,27 @@ void GDCartridge::device_start(LoadProgress *progress, std::vector *digest) } } +void GDCartridge::loadSegments(u32 offset, u32 size) +{ + const u32 lastSegment = (offset + size - 1) / SEGMENT_SIZE; + for (u32 segment = offset / SEGMENT_SIZE; segment <= lastSegment; segment++) + { + if (loadedSegments[segment]) + continue; + DEBUG_LOG(NAOMI, "Loading segment %d", segment); + // load data + read_gdrom(gdrom.get(), file_start + (segment * SEGMENT_SIZE) / 2048, + dimm_data + segment * SEGMENT_SIZE, + SEGMENT_SIZE / 2048, + nullptr); + // decrypt loaded data + u64 *pData = (u64 *)(dimm_data + segment * SEGMENT_SIZE); + for (u32 i = 0; i < SEGMENT_SIZE; i += 8, pData++) + *pData = des_encrypt_decrypt(*pData, des_subkeys); + loadedSegments[segment] = true; + } +} + void GDCartridge::device_reset() { dimm_cur_address = 0; @@ -621,16 +643,10 @@ void *GDCartridge::GetDmaPtr(u32 &size) } dimm_cur_address = DmaOffset & (dimm_data_size-1); size = std::min(size, dimm_data_size - dimm_cur_address); + loadSegments(dimm_cur_address, size); return dimm_data + dimm_cur_address; } -void GDCartridge::AdvancePtr(u32 size) -{ - dimm_cur_address += size; - if(dimm_cur_address >= dimm_data_size) - dimm_cur_address %= dimm_data_size; -} - bool GDCartridge::Read(u32 offset, u32 size, void *dst) { if (dimm_data == NULL) @@ -638,7 +654,241 @@ bool GDCartridge::Read(u32 offset, u32 size, void *dst) *(u32 *)dst = 0; return true; } - u32 addr = offset & (dimm_data_size-1); - memcpy(dst, &dimm_data[addr], std::min(size, dimm_data_size - addr)); + u32 addr = offset & (dimm_data_size - 1); + size = std::min(size, dimm_data_size - addr); + loadSegments(addr, size); + memcpy(dst, &dimm_data[addr], size); return true; } + +GDCartridge::GDCartridge(u32 size) : NaomiCartridge(size) +{ + schedId = sh4_sched_register(0, [](int tag, int sch_cycl, int jitter, void *arg){ + return ((GDCartridge *)arg)->schedCallback(); + }, this); +} + +GDCartridge::~GDCartridge() +{ + free(dimm_data); + sh4_sched_unregister(schedId); +} + +u32 GDCartridge::ReadMem(u32 address, u32 size) +{ + switch (address) + { + case NAOMI_DIMM_COMMAND: + DEBUG_LOG(NAOMI, "DIMM COMMAND read -> %x", dimm_command); + return dimm_command; + case NAOMI_DIMM_OFFSETL: + DEBUG_LOG(NAOMI, "DIMM OFFSETL read -> %x", dimm_offsetl); + return dimm_offsetl; + case NAOMI_DIMM_PARAMETERL: + DEBUG_LOG(NAOMI, "DIMM PARAMETERL read -> %x", dimm_parameterl); + return dimm_parameterl; + case NAOMI_DIMM_PARAMETERH: + DEBUG_LOG(NAOMI, "DIMM PARAMETERH read -> %x", dimm_parameterh); + return dimm_parameterh; + case NAOMI_DIMM_STATUS: + { + u32 rc = DIMM_STATUS & ~(((SB_ISTEXT >> 3) & 1) << 8); + static u32 lastRc; + if (rc != lastRc) + DEBUG_LOG(NAOMI, "DIMM STATUS read -> %x", rc); + lastRc = rc; + return rc; + } + default: + return NaomiCartridge::ReadMem(address, size); + } +} + +void GDCartridge::WriteMem(u32 address, u32 data, u32 size) +{ + switch (address) + { + case NAOMI_DIMM_COMMAND: + dimm_command = data; + DEBUG_LOG(NAOMI, "DIMM COMMAND Write<%d>: %x", size, data); + return; + + case NAOMI_DIMM_OFFSETL: + dimm_offsetl = data; + DEBUG_LOG(NAOMI, "DIMM OFFSETL Write<%d>: %x", size, data); + return; + case NAOMI_DIMM_PARAMETERL: + dimm_parameterl = data; + DEBUG_LOG(NAOMI, "DIMM PARAMETERL Write<%d>: %x", size, data); + return; + case NAOMI_DIMM_PARAMETERH: + dimm_parameterh = data; + DEBUG_LOG(NAOMI, "DIMM PARAMETERH Write<%d>: %x", size, data); + return; + + case NAOMI_DIMM_STATUS: + DEBUG_LOG(NAOMI, "DIMM STATUS Write<%d>: %x", size, data); + if (data & 0x100) + // write 0 seems ignored + asic_CancelInterrupt(holly_EXP_PCI); + if ((data & 1) == 0) + // irq to dimm + process(); + return; + + default: + NaomiCartridge::WriteMem(address, data, size); + return; + } +} + +void GDCartridge::process() +{ + INFO_LOG(NAOMI, "NetDIMM cmd %04x sock %d offset %04x paramh/l %04x %04x", (dimm_command >> 9) & 0x3f, + dimm_command & 0xff, dimm_offsetl, dimm_parameterh, dimm_parameterl); + + int cmdGroup = (dimm_command >> 13) & 3; + int cmd = (dimm_command >> 9) & 0xf; + switch (cmdGroup) + { + case 0: // system commands + systemCmd(cmd); + break; + case 1: // network commands + WARN_LOG(NAOMI, "Network command received cmd %x. Need full NetDIMM?", cmd); + returnToNaomi(true, 0, -1); + break; + default: + WARN_LOG(NAOMI, "Unknown DIMM command group %d cmd %x", cmdGroup, cmd); + returnToNaomi(true, 0, -1); + break; + } +} + +void GDCartridge::returnToNaomi(bool failed, u16 offsetl, u32 parameter) +{ + dimm_command = ((dimm_command & 0x7e00) + 0x400) | (failed ? 0xff : 0x4); + dimm_offsetl = offsetl; + dimm_parameterh = parameter >> 16; + dimm_parameterl = parameter; + verify(((SB_ISTEXT >> 3) & 1) == 0); + asic_RaiseInterrupt(holly_EXP_PCI); +} + +void GDCartridge::systemCmd(int cmd) +{ + switch (cmd) + { + case 0xf: // startup + INFO_LOG(NAOMI, "NetDIMM startup"); + // bit 16,17: dimm0 size (none, 128, 256, 512) + // bit 18,19: dimm1 size + // bit 28: network enabled (network settings appear in bios menu) + // bit 29: set + // bit 30: gd-rom connected + // bit 31: mobile/ppp network? + // (| 30, 70, F0, 1F0, 3F0, 7F0) + // | offset >> 20 (dimm buffers offset @ size - 16MB) + // offset = (64MB << 0-5) - 16MB + // vf4 forces this value to 0f000000 (256MB) if != 1f000000 (512MB) + if (dimm_data_size == 512_MB) + addrspace::write32(0xc01fc04, (3 << 16) | 0x60000000 | (dimm_data_size >> 20)); // dimm board config 1 x 512 MB + else if (dimm_data_size == 256_MB) + addrspace::write32(0xc01fc04, (2 << 16) | 0x60000000 | (dimm_data_size >> 20)); // dimm board config 1 x 256 MB + else + addrspace::write32(0xc01fc04, (1 << 16) | 0x60000000 | (dimm_data_size >> 20)); // dimm board config 1 x 128 MB + addrspace::write32(0xc01fc0c, 0x1020000 | 0x264); // fw version 1.02 + // DIMM board serial Id + { + const u32 *serial = (u32 *)(getGameSerialId() + 0x20); // get only the serial id + addrspace::write32(0xc01fc40, *serial++); + addrspace::write32(0xc01fc44, *serial++); + addrspace::write32(0xc01fc48, *serial++); + addrspace::write32(0xc01fc4c, *serial++); + } + // SET_BASE_ADDRESS(0c000000, 0) + dimm_command = 0x8600; + dimm_offsetl = 0; + dimm_parameterl = 0; + dimm_parameterh = 0x0c00; + asic_RaiseInterrupt(holly_EXP_PCI); + sh4_sched_request(schedId, SH4_MAIN_CLOCK); + + break; + + case 0: // nop + case 1: // control read + case 3: // set base address + case 4: // peek8 + case 5: // peek16 + case 6: // peek32 + case 8: // poke8 + case 9: // poke16 + case 10: // poke32 + // These are callbacks from naomi + INFO_LOG(NAOMI, "System callback command %x", cmd); + break; + + default: + WARN_LOG(NAOMI, "Unknown system command %x", cmd); + break; + } +} + +void GDCartridge::Serialize(Serializer &ser) const +{ + NaomiCartridge::Serialize(ser); + ser << dimm_command; + ser << dimm_offsetl; + ser << dimm_parameterl; + ser << dimm_parameterh; + sh4_sched_serialize(ser, schedId); +} + +void GDCartridge::Deserialize(Deserializer &deser) +{ + NaomiCartridge::Deserialize(deser); + if (deser.version() >= Deserializer::V53) + { + deser >> dimm_command; + deser >> dimm_offsetl; + deser >> dimm_parameterl; + deser >> dimm_parameterh; + sh4_sched_deserialize(deser, schedId); + } +} + +int GDCartridge::schedCallback() +{ + if (SB_ISTEXT & 8) // holly_EXP_PCI + return SH4_MAIN_CLOCK; + + // regularly peek the test request address + peek(0xc01fc08); + asic_RaiseInterrupt(holly_EXP_PCI); + + u32 testRequest = addrspace::read32(0xc01fc08); + if (testRequest & 1) + { + // bios dimm (fake) test + addrspace::write32(0xc01fc08, testRequest & ~1); + bool isMem; + char *p = (char *)addrspace::writeConst(0xc01fd00, isMem, 4); + strcpy(p, "CHECKING DIMM BD"); + p = (char *)addrspace::writeConst(0xc01fd10, isMem, 4); + strcpy(p, "DIMM0 - GOOD"); + p = (char *)addrspace::writeConst(0xc01fd20, isMem, 4); + strcpy(p, "DIMM1 - GOOD"); + p = (char *)addrspace::writeConst(0xc01fd30, isMem, 4); + strcpy(p, "--- COMPLETED---"); + addrspace::write32(0xc01fc0c, 0x0102a264); + } + else if (testRequest != 0) + { + addrspace::write32(0xc01fc08, 0); + addrspace::write32(0xc01fc0c, 0x03170100); + INFO_LOG(NAOMI, "TEST REQUEST %x", testRequest); + } + + return SH4_MAIN_CLOCK; +} diff --git a/core/hw/naomi/gdcartridge.h b/core/hw/naomi/gdcartridge.h index be3f654c7..7ec87e756 100644 --- a/core/hw/naomi/gdcartridge.h +++ b/core/hw/naomi/gdcartridge.h @@ -9,39 +9,69 @@ * // copyright-holders:Olivier Galibert * */ - -#ifndef CORE_HW_NAOMI_GDCARTRIDGE_H_ -#define CORE_HW_NAOMI_GDCARTRIDGE_H_ - +#pragma once #include "naomi_cart.h" #include "imgread/common.h" -class GDCartridge: public NaomiCartridge { +class GDCartridge: public NaomiCartridge +{ public: - GDCartridge(u32 size) : NaomiCartridge(size) - { - } - ~GDCartridge() override - { - free(dimm_data); - } - void Init(LoadProgress *progress = nullptr, std::vector *digest = nullptr) override - { + GDCartridge(u32 size); + ~GDCartridge() override; + + void Init(LoadProgress *progress = nullptr, std::vector *digest = nullptr) override { device_start(progress, digest); device_reset(); } void* GetDmaPtr(u32 &size) override; - void AdvancePtr(u32 size) override; bool Read(u32 offset, u32 size, void* dst) override; + u32 ReadMem(u32 address, u32 size) override; + void WriteMem(u32 address, u32 data, u32 size) override; void SetGDRomName(const char *name, const char *parentName) { this->gdrom_name = name; this->gdrom_parent_name = parentName; } + void Serialize(Serializer &ser) const override; + void Deserialize(Deserializer &deser) override; + protected: + virtual void process(); + virtual int schedCallback(); + void returnToNaomi(bool failed, u16 offsetl, u32 parameter); + + template + void peek(u32 address) + { + static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4); + int size; + switch (sizeof(T)) + { + case 1: + size = 4; + break; + case 2: + size = 5; + break; + case 4: + size = 6; + break; + } + dimm_command = ((address >> 16) & 0x1ff) | (size << 9) | 0x8000; + dimm_offsetl = address & 0xffff; + dimm_parameterl = 0; + dimm_parameterh = 0; + } + u8 *dimm_data = nullptr; u32 dimm_data_size = 0; + u16 dimm_command; + u16 dimm_offsetl; + u16 dimm_parameterl; + u16 dimm_parameterh; + static constexpr u16 DIMM_STATUS = 0x111; + int schedId; private: - enum { FILENAME_LENGTH=24 }; + static constexpr int FILENAME_LENGTH = 24; const char *gdrom_name = nullptr; const char *gdrom_parent_name = nullptr; @@ -61,6 +91,12 @@ class GDCartridge: public NaomiCartridge { static const u32 DES_MASK_TABLE[]; static const u8 DES_ROTATE_TABLE[16]; + std::vector loadedSegments; + static constexpr u32 SEGMENT_SIZE = 16_KB; + std::unique_ptr gdrom; + u32 file_start = 0; + u32 des_subkeys[32]; + void device_start(LoadProgress *progress, std::vector *digest); void device_reset(); void find_file(const char *name, const u8 *dir_sector, u32 &file_start, u32 &file_size); @@ -71,6 +107,6 @@ class GDCartridge: public NaomiCartridge { u64 des_encrypt_decrypt(u64 src, const u32 *des_subkeys); u64 rev64(u64 src); void read_gdrom(Disc *gdrom, u32 sector, u8* dst, u32 count = 1, LoadProgress *progress = nullptr); + void loadSegments(u32 offset, u32 size); + void systemCmd(int cmd); }; - -#endif /* CORE_HW_NAOMI_GDCARTRIDGE_H_ */ diff --git a/core/hw/naomi/hopper.cpp b/core/hw/naomi/hopper.cpp new file mode 100644 index 000000000..6d2206d79 --- /dev/null +++ b/core/hw/naomi/hopper.cpp @@ -0,0 +1,1306 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#include "hopper.h" +#include "input/gamepad.h" +#include "hw/maple/maple_cfg.h" +#include "hw/sh4/sh4_sched.h" +#include "hw/sh4/modules/modules.h" +#include "serialize.h" +#include "oslib/oslib.h" +#include "emulator.h" +#include "cfg/option.h" + +#include +#include +#include +#include + +namespace hopper +{ + +class BaseHopper : public SerialPort::Pipe +{ +public: + BaseHopper() + { + schedId = sh4_sched_register(0, schedCallback, this); + sh4_sched_request(schedId, SCHED_CYCLES); + EventManager::listen(Event::Pause, handleEvent, this); + + std::string path = getConfigFileName(); + FILE *f = fopen(path.c_str(), "rb"); + if (f == nullptr) { + INFO_LOG(NAOMI, "Hopper config not found at %s", path.c_str()); + } + else + { + u8 data[4096]; + size_t len = fread(data, 1, sizeof(data), f); + fclose(f); + verify(len < sizeof(data)); + if (len <= 0) { + ERROR_LOG(NAOMI, "Hopper config empty or I/O error: %s", path.c_str()); + } + else + { + Deserializer deser(data, len); + deserializeConfig(deser); + } + } + } + + virtual ~BaseHopper() { + EventManager::unlisten(Event::Pause, handleEvent, this); + sh4_sched_unregister(schedId); + } + + u8 read() override + { + if (toSend.empty()) + return 0; + else + { + u8 v = toSend.front(); + toSend.pop_front(); + return v; + } + } + + int available() override { + return toSend.size(); + } + + void write(u8 data) override + { + if (recvBuffer.empty() && data != 'H') { + WARN_LOG(NAOMI, "Ignored data %02x %c", data, data); + return; + } + recvBuffer.push_back(data); + if (recvBuffer.size() == 3) + expectedBytes = data; + else if (recvBuffer.size() == 4) + expectedBytes += data << 8; + else if (expectedBytes > 0 && recvBuffer.size() == expectedBytes) + { + handleMessage(recvBuffer[1]); + recvBuffer.clear(); + expectedBytes = 0; + } + } + + void serialize(Serializer& ser) const + { + ser << (u32)recvBuffer.size(); + ser.serialize(recvBuffer.data(), recvBuffer.size()); + serializeConfig(ser); + ser << expectedBytes; + ser << (u32)toSend.size(); + for (u8 b : toSend) + ser << b; + ser << started; + sh4_sched_serialize(ser, schedId); + } + + void deserialize(Deserializer& deser) + { + u32 size; + deser >> size; + recvBuffer.resize(size); + deser.deserialize(recvBuffer.data(), size); + deserializeConfig(deser); + deser >> expectedBytes; + deser >> size; + toSend.clear(); + for (u32 i = 0; i < size; i++) + { + u8 b; + deser >> b; + toSend.push_back(b); + } + deser >> started; + sh4_sched_deserialize(deser, schedId); + } + + void saveConfig() const + { + std::string path = getConfigFileName(); + FILE *f = fopen(path.c_str(), "wb"); + if (f == nullptr) { + ERROR_LOG(NAOMI, "Can't save hopper config to %s", path.c_str()); + return; + } + Serializer ser; + serializeConfig(ser); + std::unique_ptr data = std::make_unique(ser.size()); + ser = Serializer(data.get(), ser.size()); + serializeConfig(ser); + + size_t len = fwrite(data.get(), 1, ser.size(), f); + fclose(f); + if (len != ser.size()) + ERROR_LOG(NAOMI, "Hopper config I/O error: %s", path.c_str()); + } + +protected: + virtual void handleMessage(u8 command) = 0; + virtual void sendCoinInMessage() = 0; + virtual void sendCoinOutMessage() = 0; + virtual void sendPayWinMessage() = 0; + + void sendMessage(u8 command, const u8 *payload, size_t len) + { + DEBUG_LOG(NAOMI, "hopper sending command %x size %x", command, (int)len + 5); + // 'H' payload ... + u8 chksum = 'H' + command; + toSend.push_back('H'); + toSend.push_back(command); + len += 5; + toSend.push_back(len & 0xff); + chksum += len & 0xff; + toSend.push_back(len >> 8); + chksum += len >> 8; + len -= 5; + for (size_t i = 0; i < len; i++, payload++) { + toSend.push_back(*payload); + chksum += *payload; + } + toSend.push_back(chksum); + SCIFSerialPort::Instance().updateStatus(); + } + + void bet(const u32 *values) + { + for (int i = 0; i < 2; i++) + { + u32& primary = i == 0 ? credit0 : credit1; + u32& second = i == 0 ? credit1 : credit0; + if (primary >= values[i]) { + primary -= values[i]; + } + else + { + int residual = values[i] - primary; + primary = 0; + second = std::max(0, (int)second - residual); + } + } + premium = std::max(0, (int)premium - (int)values[2]); + } + + void payOut(u32 value) + { + if (value == 0) + return; + wonAmount += value; + if (!autoPayOut) + credit0 += value; + else { + paidAmount += value; + sendPayWinMessage(); + } + } + + void insertCoin(u32 value) { + credit0 += value; + } + + std::vector recvBuffer; + u32 credit0 = 0; + u32 credit1 = 0; + u32 totalCredit = 100; // min bet + u32 premium = 0; + u32 gameNumber = 0; + bool freePlay = false; + bool autoPayOut = false; + bool autoExchange = false; + bool twoWayMode = true; + bool coinDiscrimination = true; + bool betButton = true; + u8 currency = ~0; // 0:medal, 1:pound, 2:dollar, 3:euro, 4:token, 5: any cash (837-14438 only) + u8 medalExchRate = 5; + u32 maxHopperFloat = 200; + u32 maxPay = 1999900; + u32 maxCredit = 1999900; + u32 hopperSize = 39900; + u32 maxBet = 10000; + u32 minBet = 100; // normally 1000 + u32 addBet = 100; + u32 paidAmount = 0; + u32 wonAmount = 0; + u32 curBase = 100; + + int schedId; + bool started = false; + bool coinKey = false; + + static constexpr u32 SCHED_CYCLES = SH4_MAIN_CLOCK / 60; + +private: + static int schedCallback(int tag, int cycles, int jitter, void *p) + { + BaseHopper *board = (BaseHopper *)p; + if (board->started) + { + // button D is coin + if ((mapleInputState[0].kcode & DC_BTN_D) == 0 && !board->coinKey) + board->sendCoinInMessage(); + board->coinKey = (mapleInputState[0].kcode & DC_BTN_D) == 0; + } + return SCHED_CYCLES; + } + + static void handleEvent(Event event, void *p) { + ((BaseHopper *)p)->saveConfig(); + } + + std::string getConfigFileName() const + { + return hostfs::getArcadeFlashPath() + "-hopper.bin"; + } + + void serializeConfig(Serializer& ser) const + { + ser << credit0; + ser << credit1; + ser << totalCredit; + ser << premium; + ser << gameNumber; + ser << freePlay; + ser << autoPayOut; + ser << autoExchange; + ser << twoWayMode; + ser << coinDiscrimination; + ser << currency; + ser << medalExchRate; + ser << maxHopperFloat; + ser << maxPay; + ser << maxCredit; + ser << hopperSize; + ser << maxBet; + ser << minBet; + ser << addBet; + ser << paidAmount; + ser << wonAmount; + ser << betButton; + ser << curBase; + } + + void deserializeConfig(Deserializer& deser) + { + deser >> credit0; + deser >> credit1; + deser >> totalCredit; + deser >> premium; + deser >> gameNumber; + deser >> freePlay; + deser >> autoPayOut; + deser >> autoExchange; + deser >> twoWayMode; + deser >> coinDiscrimination; + deser >> currency; + deser >> medalExchRate; + deser >> maxHopperFloat; + deser >> maxPay; + deser >> maxCredit; + deser >> hopperSize; + deser >> maxBet; + deser >> minBet; + deser >> addBet; + if (deser.version() >= Deserializer::V39) + { + deser >> paidAmount; + deser >> wonAmount; + deser >> betButton; + deser >> curBase; + } + else + { + paidAmount = 0; + wonAmount = 0; + } + } + + u32 expectedBytes = 0; + std::deque toSend; +}; + +// +// SEGA 837-14438 hopper board +// +// Used by kick'4'cash +// Can be used by club kart prize (ver.b) and shootout pool prize (ver.b) if P1 btn 0 is pressed at boot +// +class Sega837_14438Hopper : public BaseHopper +{ +protected: + void handleMessage(u8 command) override + { + switch (command) + { + case 0x40: + { + // VERSION + INFO_LOG(NAOMI, "hopper received VERSION"); + std::array payload{}; + payload[0] = 0x00010001; + payload[1] = 3; + sendMessage(0x20, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x41: + { + // POWER ON + INFO_LOG(NAOMI, "hopper received POWER ON"); + // 8: currency + if (currency != recvBuffer[8]) { + currency = recvBuffer[8]; + setDefaults(); + } + std::array payload{}; + payload[0] = gameNumber; // game number + payload[1] = 0; // atp num + payload[2] = 0; // atp kind and error code + payload[3] = status; // status bitfield. rectangle in background if != 0 + payload[4] = freePlay | (autoPayOut << 8) | (twoWayMode << 16) | (medalExchRate << 24); + payload[5] = autoExchange | (coinDiscrimination << 8) | (curBase << 16) | (betButton << 24); + payload[6] = 0; // ? 8c027124 + payload[7] = maxPay; + payload[8] = maxCredit; + payload[9] = hopperSize; + payload[10] = maxBet; + payload[11] = minBet; + payload[12] = addBet; + payload[13] = currency; // currency (lsb, 0:medal, 1:pound, 2:dollar, 3:euro, 4:token, 5: any cash) + // ? 8c027141, 8c027142, 8c027143 + payload[14] = credit0; // credit0 + payload[15] = credit1; // credit1 + payload[16] = totalCredit; // totalCredit + payload[17] = premium; // premium + // FUN_8c00e26e + payload[18] = 0; // ? 8c02cd60 + payload[19] = 0; // ? FUN_8c014806() or FUN_8c00817c() + // &payload[20] // copy of mem (8c02715c, 0x58 bytes) + // FUN_8c009f8a + payload[0x2a] = 0; // ? FUN_8c015b5a() + payload[0x2b] = 0; // ? FUN_8c0163d8() + FUN_8c0148d4() + payload[0x2c] = 0; // hopperOutLap + payload[0x2d] = wonAmount; + payload[0x2e] = 0; // ? 8c02717c + payload[0x2f] = 0; // ? 8c027180 + payload[0x30] = 0; // ? 8c027188 + payload[0x31] = 0; // ? 8c02718c + payload[0x32] = paidAmount; // paid? 8c027190 + + payload[0x33] = maxHopperFloat; + payload[0x34] = 0; // showLastWinAndHopperFloat (b6: show last win b7: show hopperfloat) + payload[0x35] = 0; // ? 8c02714c + payload[0x36] = 0; // ? 8c027150 + payload[0x37] = 0x80; // dataportCondition (b6: protocol on, bit7: forever) + payload[0x38] = 0; // ? 8c027f48 + payload[0x39] = 0; // ? 8c027f4c + payload[0x3a] = 0; // ? 8c027f50 + // FUN_8c00ae24 + payload[0x3b] = 0; // ? 20 bytes + // 1c2 0 ? + // 1c9 100 or 50 depending on currency + // 1ca 10000 or 100 depending... + // 1cb (short)same as 1c9 + // (short)499 or 5 dep... + // 1cc (short)500 or 5 + // 499 + // 1cd (short)500 + // (short)49 or 19 dep... + // 1ce 50 or 20 dep... + // 1cf 200, 70 or 100 + // 1d0 0 or 100 + // 1d1 0 or 100 + // 1d2 0, 2 or 3 + // 1d3 (short)2000, 70 or 200 + // (short)200, 70 or 50 + // 1d4 100, 0 or 10 + // 1d6 (short)100 0 0 0 0 0 0 0 + // 1d8 (short)12 shorts? + // 100 200 300 400 500 1000 2000 2500 5000 10000 0 ... + // Default values + const u32 *def = getDefaultValues(); + payload[0x1c0] = def[0]; + payload[0x1c1] = def[1]; + payload[0x1c3] = def[2]; + payload[0x1c4] = def[3]; + payload[0x1c5] = def[4]; + payload[0x1c6] = def[5]; + payload[0x1c7] = def[6]; + payload[0x1c8] = def[7]; + getRanges(&payload[0x1c9]); + payload[0x1e9] = 1; // hopper ready flag + sendMessage(0x21, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + started = true; + break; + } + + case 0x42: + { + // GET_STATUS + INFO_LOG(NAOMI, "hopper received GET STATUS"); + // TODO offset 4: 0 or 2 + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; + sendMessage(0x22, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x43: + { + // GAME START + INFO_LOG(NAOMI, "hopper received GAME START"); + u32 *betValues = (u32 *)&recvBuffer[4]; + bet(betValues); + std::array payload{}; + payload[0] = ++gameNumber; // game#, ? + payload[1] = 0; // atp num + payload[2] = 0; // atp kind and error code + payload[3] = status; + payload[4] = credit0; + payload[5] = credit1; + payload[6] = totalCredit; + payload[7] = premium; + // &payload[8] ? 0x58 bytes + sendMessage(0x23, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x44: + { + // GAME END + INFO_LOG(NAOMI, "hopper received GAME END"); + std::array payload{}; + payload[0] = gameNumber; // gameNum, upper 16 bits: ? 0, -1 or -2 + payload[1] = credit0; + payload[2] = credit1; + payload[3] = totalCredit; + payload[4] = premium; + // ? (58 bytes) + payload[27] = 2; // wins + payload[28] = 0; // last paid + sendMessage(0x24, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x45: + { + // TEST + INFO_LOG(NAOMI, "hopper received TEST"); + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; + // TODO + // 3: memcpy 8c027028, 0x60 + // 0x18: memcpy &errorCode, 0x80 (follows previous in ram) + // 0x38: bit0: dataport temp? bit1: ? + payload[0x38] = 0; + sendMessage(0x25, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x4a: + { + // SWITCH + INFO_LOG(NAOMI, "hopper received SWITCH"); + // TODO ? + break; + } + + case 0x4b: + { + // CONFIG_HOP + INFO_LOG(NAOMI, "hopper received CONFIG HOP"); + if (recvBuffer[2] == 0x2c && recvBuffer[3] == 0) + { + freePlay = recvBuffer[4] & 1; + autoPayOut = recvBuffer[5] & 1; + twoWayMode = recvBuffer[6] & 1; + medalExchRate = recvBuffer[7]; + autoExchange = recvBuffer[8] & 1; + coinDiscrimination = recvBuffer[9] & 1; + curBase = recvBuffer[0xa]; + betButton = recvBuffer[0xb] & 1; + // 0xc ?? + maxPay = *(u32 *)&recvBuffer[0x10]; + maxCredit = *(u32 *)&recvBuffer[0x14]; + hopperSize = *(u32 *)&recvBuffer[0x18]; + maxBet = *(u32 *)&recvBuffer[0x1c]; + minBet = *(u32 *)&recvBuffer[0x20]; + addBet = *(u32 *)&recvBuffer[0x24]; + } + std::array payload{}; + payload[0] = freePlay | (autoPayOut << 8) | (twoWayMode << 16) | (medalExchRate << 24); + payload[1] = autoExchange | (coinDiscrimination << 8) | (curBase << 16) | (betButton << 24); + payload[2] = 0; // ? 8c027124 + payload[3] = maxPay; + payload[4] = maxCredit; + payload[5] = hopperSize; + payload[6] = maxBet; + payload[7] = minBet; + payload[8] = addBet; + payload[9] = currency; // currency (lsb, 0:medal, 1:pound, 2:dollar, 3:euro, 4:token, 5:any cash) + // ? 8c027141, 8c027142, 8c027143 + sendMessage(0x2b, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x61: // COIN IN ACK + case 0x62: // COIN OUT ACK + break; + + default: + WARN_LOG(NAOMI, "Unexpected hopper message: %x", command); + break; + } + } + +private: + /* + void sendStatusMessage() + { + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; // status bitfield. rectangle in background if != 0 + sendMessage(0, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + void sendErrorMessage() + { + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; // status bitfield. rectangle in background if != 0 + sendMessage(7, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + */ + + void sendCoinInMessage() override + { + insertCoin(100); + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; + payload[3] = credit0; + payload[4] = credit1; + payload[5] = totalCredit; + payload[6] = premium; + sendMessage(1, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + void sendCoinOutMessage() override + { + insertCoin(100); + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; + payload[3] = credit0; + payload[4] = credit1; + payload[5] = totalCredit; + payload[6] = premium; + sendMessage(2, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + void sendPayWinMessage() override + { + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = 0; // atp kind and error code + payload[2] = status; + payload[3] = credit0; + payload[4] = credit1; + payload[5] = totalCredit; + payload[6] = premium; + payload[7] = wonAmount; + payload[8] = paidAmount; + sendMessage(3, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + const u32 *getDefaultValues() + { + static const u32 defaults[][8] = { + // free play... max pay hopper size min bet + // auto exch... max credit max bet add bet + { 0x05010000, 0x01640100, 1999900, 1999900, 39900, 10000, 1000, 100 }, + { 0x100, 0x50000, 10000, 1999900, 39900, 100, 100, 50 }, + { 0x100, 0x50000, 10000, 1999900, 39900, 100, 100, 100 }, + { 0x100, 0x50000, 10000, 1999900, 39900, 100, 100, 100 }, + { 0, 0x01640000, 1999900, 1999900, 39900, 10000, 100, 100 }, + { 0x100, 0x50000, 10000, 1999900, 39900, 100, 100, 100 }, + }; + if (currency >= std::size(defaults)) + return defaults[0]; + else + return defaults[currency]; + } + + void setDefaults() + { + const u32 *def = getDefaultValues(); + freePlay = def[0] & 1; + autoPayOut = def[0] & 0x100; + twoWayMode = def[0] & 0x10000; + medalExchRate = def[0] >> 24; + autoExchange = def[1] & 1; + coinDiscrimination = def[1] & 0x100; + curBase = (def[1] >> 16) & 0xff; + betButton = def[1] & 0x1000000; + maxPay = def[2]; + maxCredit = def[3]; + hopperSize = def[4]; + maxBet = def[5]; + minBet = def[6]; + addBet = def[7]; + totalCredit = minBet; + } + + void getRanges(u32 *p) + { + switch (currency) + { + case 0: // medal + p[0x0] = 100; + p[0x1] = 10000; + p[0x2] = 100 | (499 << 16); + p[0x3] = 500 | (499 << 16); + p[0x4] = 500 | (49 << 16); + p[0x5] = 50; + p[0x6] = 200; + p[0x7] = 0; + p[0x8] = 0; + p[0x9] = 0; + p[0xa] = 2000 | (200 << 16); + p[0xb] = 100; + p[0xc] = 0; + + p[0xd] = 100; + p[0xe] = 0; + p[0xf] = 0; + p[0x10] = 0; + + p[0x11] = 100 | (200 << 16); + p[0x12] = 300 | (400 << 16); + p[0x13] = 500 | (1000 << 16); + p[0x14] = 2000 | (2500 << 16); + p[0x15] = 5000 | (10000 << 16); + p[0x16] = 0; + break; + case 1: // pound + p[0x0] = 50; + p[0x1] = 100; + p[0x2] = 50 | (5 << 16); + p[0x3] = 5 | (499 << 16); + p[0x4] = 500 | (19 << 16); + p[0x5] = 20; + p[0x6] = 70; + p[0x7] = 0; + p[0x8] = 0; + p[0x9] = 0; + p[0xa] = 70 | (70 << 16); + p[0xb] = 0; + p[0xc] = 0; + + p[0xd] = 5 | (10 << 16); + p[0xe] = 20 | (50 << 16); + p[0xf] = 50 | (100 << 16); + p[0x10] = 200; + + p[0x11] = 5 | (10 << 16); + p[0x12] = 20 | (50 << 16); + p[0x13] = 100 | (200 << 16); + p[0x14] = 500 | (1000 << 16); + p[0x15] = 0; + p[0x16] = 0; + break; + case 2: // dollar + case 5: // any cash + default: + p[0x0] = 50; + p[0x1] = 100; + p[0x2] = 50 | (5 << 16); + p[0x3] = 5 | (499 << 16); + p[0x4] = 500 | (19 << 16); + p[0x5] = 20; + p[0x6] = 200; + p[0x7] = 0; + p[0x8] = 0; + p[0x9] = 0; + p[0xa] = 200 | (50 << 16); + p[0xb] = 10; + p[0xc] = 0; + + p[0xd] = 5 | (10 << 16); + p[0xe] = 20 | (25 << 16); + p[0xf] = 50 | (100 << 16); + p[0x10] = 200 | (100 << 16); + + p[0x11] = 5 | (10 << 16); + p[0x12] = 20 | (25 << 16); + p[0x13] = 50 | (100 << 16); + p[0x14] = 200 | (500 << 16); + p[0x15] = 1000; + p[0x16] = 0; + break; + case 3: // euro + p[0x0] = 50; + p[0x1] = 100; + p[0x2] = 50 | (5 << 16); + p[0x3] = 5 | (499 << 16); + p[0x4] = 500 | (19 << 16); + p[0x5] = 20; + p[0x6] = 200; + p[0x7] = 0; + p[0x8] = 0; + p[0x9] = 0; + p[0xa] = 200 | (50 << 16); + p[0xb] = 10; + p[0xc] = 0; + + p[0xd] = 5 | (10 << 16); + p[0xe] = 20 | (50 << 16); + p[0xf] = 50 | (100 << 16); + p[0x10] = 200 | (100 << 16); + + p[0x11] = 5 | (10 << 16); + p[0x12] = 20 | (50 << 16); + p[0x13] = 100 | (200 << 16); + p[0x14] = 500 | (1000 << 16); + p[0x15] = 0; + p[0x16] = 0; + break; + case 4: // token + p[0x0] = 100; + p[0x1] = 10000; + p[0x2] = 100 | (499 << 16); + p[0x3] = 500 | (499 << 16); + p[0x4] = 500 | (19 << 16); + p[0x5] = 20; + p[0x6] = 200; + p[0x7] = 0; + p[0x8] = 0; + p[0x9] = 0; + p[0xa] = 200 | (50 << 16); + p[0xb] = 10; + p[0xc] = 0; + + p[0xd] = 100; + p[0xe] = 0; + p[0xf] = 0; + p[0x10] = 0; + + p[0x11] = 100 | (200 << 16); + p[0x12] = 300 | (400 << 16); + p[0x13] = 500 | (1000 << 16); + p[0x14] = 2000 | (2500 << 16); + p[0x15] = 5000 | (10000 << 16); + p[0x16] = 0; + break; + } + } + + // ?:1 + // ?:1 + // coinInEnabled?:1 + // yenInEnabled?:1 + // frontDoorOpen:1 + // backDoorOpen:1 + // cashDoorOpen:1 + // needsRefill?:1 + // ?:1 + const u32 status = 0x00000000; +}; + +// Naomi SWP Hopper Board +class NaomiHopper : public BaseHopper +{ +protected: + void handleMessage(u8 command) override + { + switch (command) + { + case 0x20: + { + // POWER ON + static const char hopperErrors[][32] = { + "UNKNOWN ERROR", + "ROM IS BAD", + "LOW BATTERY", + "ROM HAS CHANGED", + "RAM DATA IS BAD", + "I/O ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "COIN IN JAM(HOPPER)", + "COIN IN JAM(GAME)", + "HOPPER OVER PAID", + "HOPPER RUNAWAY", + "HOPPER EMPTY/JAM", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "COM. TIME OUT", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "I/O BOARD IS BAD", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "UNKNOWN ERROR", + "ATP NONE\0\0\0\0\0\0\0\0MAX. PAY", + "HOPPER SIZE\0\0\0\0\0MAX. CREDIT", + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0DOOR IS OPEN" + }; + + // 8: currency + if (currency != recvBuffer[8]) { + currency = recvBuffer[8]; + setDefaults(); + } + INFO_LOG(NAOMI, "hopper received POWER ON"); + std::array payload{}; + payload[0] = gameNumber; + payload[1] = 0; // atp num + payload[2] = status; // status bitfield. rectangle in background if != 0 + payload[3] = freePlay | (autoPayOut << 8) | (twoWayMode << 16) | (medalExchRate << 24); + payload[4] = autoExchange | (coinDiscrimination << 8) | (curBase << 16) | (betButton << 24); + payload[5] = maxPay; + payload[6] = maxCredit; + payload[7] = hopperSize; + payload[8] = maxBet; + payload[9] = minBet; + payload[10] = addBet; + payload[11] = currency; // ? BYTE_8c0c9fa8-b + payload[12] = credit0; + payload[13] = credit1; + payload[14] = totalCredit; + payload[15] = premium; + payload[16] = wonAmount; + payload[17] = paidAmount; // paid amount (if autoPO) else credit won? + + payload[18] = 0; // coin1 in count + payload[19] = 0; // coin2 in count + payload[20] = 0; // coin3 in count + payload[21] = 0; // coin4 in count + payload[22] = 0; // coin5 in count + payload[23] = 0; // coin6 in count + payload[24] = 0; // coin out count + + payload[25] = 0; // big int(1/2) 8c0ca674? + payload[26] = 0; // big int(2/2)? + payload[27] = 0; // 8c0ca67c? + + payload[28] = 0; // 8c0ca680? + payload[29] = 0; // big int(1/2) 8c0ca684? + payload[30] = 0; // big int(2/2)? + payload[31] = 0; // 8c0ca68c? + payload[32] = 0; // 8c0ca690? + size_t idx = 0x84; + for (size_t i = 0; i < std::size(hopperErrors); i++) { + memcpy((u8 *)payload.data() + idx, hopperErrors[i], sizeof(hopperErrors[i])); + idx += 32; + } + // init done/hopper ready? + payload[0x139] = 1; + sendMessage(0x10, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + + started = true; + + // Displays the in-game hopper debug overlay + //u32 payload2 = 0; + //sendMessage(0xf, (const u8 *)&payload2, 3); // DEBUG + break; + } + + case 0x21: // GET_STATUS + { + INFO_LOG(NAOMI, "hopper received GET STATUS"); + std::array payload{}; + payload[0] = 0; // atp num? + payload[1] = status; + sendMessage(0x11, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x22: // GAME START + { + INFO_LOG(NAOMI, "hopper received GAME START"); + // 4: bet value: credit0 + // 8: credit1 + // c: premium + u32 *betValues = (u32 *)&recvBuffer[4]; + bet(betValues); + wonAmount = 0; + paidAmount = 0; + std::array payload{}; + payload[0] = ++gameNumber; + payload[1] = 0; // atp num + payload[2] = status; + payload[3] = credit0; + payload[4] = credit1; + payload[5] = totalCredit; + payload[6] = premium; + // 7-c: coinIn1-6Count + // d: coinOutCount + // e-f: bigint 8c0ca674 + // 10: 8c0ca67c + // 11: 8c0ca680 + // 12-13: bigint 8c0ca684 + // 14: 8c0ca68c + // 15: 8c0ca690 + sendMessage(0x12, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x23: // GAME END + { + INFO_LOG(NAOMI, "hopper received GAME END"); + // 8: amount to pay? + u32 value = *(u32 *)&recvBuffer[8]; + payOut(value); + std::array payload{}; + payload[0] = gameNumber; // gameNum, upper 16 bits: ? 0, -1 or -2 + payload[1] = credit0; + payload[2] = credit1; + payload[3] = totalCredit; + payload[4] = premium; + // 5-a: coinIn1-6Count + // b: coinOutCount + // c-d: bigint 8c0ca674 + // e: 8c0ca67c + // f: 8c0ca680 + // 10-11: bigint 8c0ca684 + // 12: 8c0ca68c + // 13: 8c0ca690 + sendMessage(0x13, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x24: // TEST START + { + INFO_LOG(NAOMI, "hopper received TEST START"); + // recv[4] is 1 + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = status; + // c0 bytes from 8c0ca1b4 + payload[0x12] = 2023 | (7 << 16) | (19 << 24); // year month day + payload[0x13] = (55 << 24) | (48 << 16) | (11 << 8) | 3; // day of week, hour, minute, second + payload[0x14] = gameNumber; + sendMessage(0x14, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x25: // BACKUP CLEAR + { + INFO_LOG(NAOMI, "hopper received BACKUP CLEAR"); + credit0 = 0; + credit1 = 0; + premium = 0; + paidAmount = 0; + wonAmount = 0; + std::array payload{}; + payload[0] = credit0; + payload[1] = credit1; + payload[2] = totalCredit; + payload[3] = premium; + // coin1InCount -> coin6InCount + // coinOutCount + // bigint 8c0ca674 + // 8c0ca67c + // 8c0ca680 + // bigint 8c0ca684 + // 8c0ca68c + // 8c0ca690 + // copy c0 bytes from 8c0ca1b4 + payload[0x23] = 2023 | (7 << 16) | (19 << 24); // year month day + payload[0x24] = (55 << 24) | (48 << 16) | (11 << 8) | 3; // day of week, hour, minute, second + payload[0x25] = gameNumber; + sendMessage(0x15, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x26: // BET + { + INFO_LOG(NAOMI, "hopper received BET"); + u32 v = *(u32 *)&recvBuffer[4]; + std::array payload{}; + payload[0] = v; + sendMessage(0x16, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x29: // SWITCH + { + INFO_LOG(NAOMI, "hopper received SWITCH"); + // 4: test button + // 5: service button + // 6-7: c01 in test menu + break; + } + + case 0x2a: // CONFIG HOP + { + INFO_LOG(NAOMI, "hopper received CONFIG HOP"); + if (recvBuffer[2] == 0x28 && recvBuffer[3] == 0) + { + freePlay = recvBuffer[4] & 1; + autoPayOut = recvBuffer[5] & 1; + twoWayMode = recvBuffer[6] & 1; + medalExchRate = recvBuffer[7]; + autoExchange = recvBuffer[8] & 1; + coinDiscrimination = recvBuffer[9] & 1; + curBase = recvBuffer[0xa]; + betButton = recvBuffer[0xb] & 1; + maxPay = *(u32 *)&recvBuffer[0xc]; + maxCredit = *(u32 *)&recvBuffer[0x10]; + hopperSize = *(u32 *)&recvBuffer[0x14]; + maxBet = *(u32 *)&recvBuffer[0x18]; + minBet = *(u32 *)&recvBuffer[0x1c]; + addBet = *(u32 *)&recvBuffer[0x20]; + } + std::array payload{}; + payload[0] = freePlay | (autoPayOut << 8) | (twoWayMode << 16) | (medalExchRate << 24); + payload[1] = autoExchange | (coinDiscrimination << 8) | (curBase << 16) | (betButton << 24); + payload[2] = maxPay; + payload[3] = maxCredit; + payload[4] = hopperSize; + payload[5] = maxBet; + payload[6] = minBet; + payload[7] = addBet; + //payload[8] = currency; // currency (lsb, 0:medal, 1:pound, 2:dollar, 3:euro, 4:token) + // ?, ?, ? + sendMessage(0x1a, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + break; + } + + case 0x2f: // TEST DATA MON + { + INFO_LOG(NAOMI, "hopper received cmd TEST DATA MON"); + // recv[4] == 2 (3 in coin test, 4 in error log) + // recv[8] b0 payout lamp + // b1 coin in lamp + // b2 divider cash box side + // b3 divider hopper side + // b5 coin inhibit + // b6 cash inhibit + // recv[c] hopper run + // no reply + break; + } + + case 0x31: // COIN IN ACK? + { + INFO_LOG(NAOMI, "hopper received cmd 31"); + // no reply + break; + } + + case 0x32: // COIN OUT ACK? + { + INFO_LOG(NAOMI, "hopper received cmd 32"); + // no reply + break; + } + + default: + WARN_LOG(NAOMI, "Unexpected hopper message: %x", command); + break; + } + } + +private: + /* + void sendStatusMessage() + { + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = status; // status bitfield + sendMessage(0, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + */ + + void sendCoinInMessage() override + { + insertCoin(100); + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = status; + payload[2] = credit0; + payload[3] = credit1; + payload[4] = totalCredit; + payload[5] = premium; + sendMessage(1, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + void sendCoinOutMessage() override + { + insertCoin(100); + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = status; + payload[2] = credit0; + payload[3] = credit1; + payload[4] = totalCredit; + payload[5] = premium; + sendMessage(2, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + void sendPayWinMessage() override + { + std::array payload{}; + payload[0] = 0; // atp num + payload[1] = status; + payload[2] = credit0; + payload[3] = credit1; + payload[4] = totalCredit; + payload[5] = premium; + payload[6] = wonAmount; + payload[7] = paidAmount; + sendMessage(3, (const u8 *)payload.data(), payload.size() * sizeof(u32) - 1); + } + + void setDefaults() + { + switch (currency) + { + case 0: // Medal + medalExchRate = 5; + twoWayMode = true; + autoPayOut = false; + coinDiscrimination = true; + curBase = 100; + betButton = true; + maxPay = 1999900; + maxCredit = 1999900; + hopperSize = 39900; + maxBet = 10000; + minBet = 1000; + addBet = 100; + break; + case 1: // Pound + medalExchRate = 0; + twoWayMode = false; + autoPayOut = true; + coinDiscrimination = false; + curBase = 5; + betButton = false; + maxPay = 4000; + maxCredit = 1999900; + hopperSize = 1999900; + maxBet = 100; + minBet = 100; + addBet = 50; + break; + case 2: // Dollar + case 3: // Euro + medalExchRate = 0; + twoWayMode = false; + autoPayOut = false; + coinDiscrimination = false; + curBase = 5; + betButton = true; + maxPay = 1999900; + maxCredit = 1999900; + hopperSize = 39900; + maxBet = 10000; + minBet = 100; + addBet = 100; + break; + case 4: // Token + medalExchRate = 0; + twoWayMode = false; + autoPayOut = false; + coinDiscrimination = false; + curBase = 100; + betButton = true; + maxPay = 1999900; + maxCredit = 1999900; + hopperSize = 39900; + maxBet = 10000; + minBet = 100; + addBet = 100; + break; + default: + WARN_LOG(NAOMI, "Unsupported currency %d", currency); + break; + } + totalCredit = minBet; + } + + // error:16 + // atpType:4 + // doorOpen:1 + // unk1:1 + // unk2:1 + // unk3:1 + // unk4:1 + const u32 status = 0x00000000; +}; + +static BaseHopper *hopper; + +void init() +{ + term(); + if (settings.content.gameId == "KICK '4' CASH") + hopper = new Sega837_14438Hopper(); + else + hopper = new NaomiHopper(); + SCIFSerialPort::Instance().setPipe(hopper); + config::ForceFreePlay.override(false); +} + +void term() +{ + SCIFSerialPort::Instance().setPipe(nullptr); + delete hopper; + hopper = nullptr; +} + +void serialize(Serializer& ser) +{ + if (hopper != nullptr) + hopper->serialize(ser); +} + +void deserialize(Deserializer& deser) +{ + if (hopper != nullptr) + hopper->deserialize(deser); +} + +} // namespace hopper diff --git a/core/rend/gui_android.h b/core/hw/naomi/hopper.h similarity index 54% rename from core/rend/gui_android.h rename to core/hw/naomi/hopper.h index 68e5cc074..6c905b86c 100644 --- a/core/rend/gui_android.h +++ b/core/hw/naomi/hopper.h @@ -1,22 +1,31 @@ /* - Copyright 2019 flyinghead + Copyright 2023 flyinghead - This file is part of reicast. + This file is part of Flycast. - reicast is free software: you can redistribute it and/or modify + Flycast 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 Foundation, either version 2 of the License, or (at your option) any later version. - reicast is distributed in the hope that it will be useful, + Flycast 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 reicast. If not, see . + along with Flycast. If not, see . */ #pragma once +#include "types.h" -void gui_display_vjoy_commands(); -void vjoy_start_editing(); +namespace hopper +{ + +void init(); +void term(); + +void serialize(Serializer& ser); +void deserialize(Deserializer& deser); + +} diff --git a/core/hw/naomi/m1cartridge.cpp b/core/hw/naomi/m1cartridge.cpp index bd82664ce..e32dd46d5 100644 --- a/core/hw/naomi/m1cartridge.cpp +++ b/core/hw/naomi/m1cartridge.cpp @@ -39,7 +39,6 @@ void M1Cartridge::AdvancePtr(u32 size) has_history = true; buffer_actual_size = 0; } - enc_fill(); } else NaomiCartridge::AdvancePtr(size); @@ -147,11 +146,13 @@ void M1Cartridge::Serialize(Serializer& ser) const void M1Cartridge::Deserialize(Deserializer& deser) { deser >> buffer; + deser.skip(32768 - sizeof(buffer), Deserializer::V52); deser >> dict; deser >> hist; deser >> avail_val; deser >> rom_cur_address; deser >> buffer_actual_size; + buffer_actual_size = std::min(buffer_actual_size, sizeof(buffer)); deser >> avail_bits; deser >> stream_ended; deser >> has_history; diff --git a/core/hw/naomi/m1cartridge.h b/core/hw/naomi/m1cartridge.h index f35497806..1ba034fce 100644 --- a/core/hw/naomi/m1cartridge.h +++ b/core/hw/naomi/m1cartridge.h @@ -26,6 +26,7 @@ class M1Cartridge : public NaomiCartridge { if (encryption) { + enc_fill(); size = std::min(size, (u32)sizeof(buffer)); return buffer; } @@ -48,7 +49,6 @@ class M1Cartridge : public NaomiCartridge //printf("M1 ENCRYPTION ON @ %08x\n", dma_offset); encryption = true; enc_reset(); - enc_fill(); } else encryption = false; @@ -100,7 +100,7 @@ class M1Cartridge : public NaomiCartridge u16 actel_id; - u8 buffer[32768]; + u8 buffer[1024]; u8 dict[111], hist[2]; u64 avail_val; u32 rom_cur_address, buffer_actual_size, avail_bits; diff --git a/core/hw/naomi/m4cartridge.cpp b/core/hw/naomi/m4cartridge.cpp index 7a2db1b05..4e1068505 100644 --- a/core/hw/naomi/m4cartridge.cpp +++ b/core/hw/naomi/m4cartridge.cpp @@ -165,9 +165,9 @@ void *M4Cartridge::GetDmaPtr(u32 &size) if (cfi_mode) { u32 fpr_num = m4id & 0x7f; - if (((rom_cur_address >> 26) & 0x07) < fpr_num) { + if (((DmaOffset >> 26) & 0x07) < fpr_num) { size = std::min(size, 2u); - return &cfidata[rom_cur_address & 0xffff]; + return &cfidata[DmaOffset & 0xffff]; } } @@ -184,9 +184,8 @@ void *M4Cartridge::GetDmaPtr(u32 &size) } if (encryption) { - size = std::min(size, (u32)sizeof(buffer)); + size = std::min(size, buffer_actual_size); return buffer; - } else { @@ -207,17 +206,18 @@ void M4Cartridge::AdvancePtr(u32 size) { if (encryption) { - if (size < buffer_actual_size) - { + if (size < buffer_actual_size) { memmove(buffer, buffer + size, buffer_actual_size - size); buffer_actual_size -= size; } - else + else { buffer_actual_size = 0; + } enc_fill(); } - else - rom_cur_address += size; + else { + NaomiCartridge::AdvancePtr(size); + } } void M4Cartridge::enc_reset() @@ -232,27 +232,32 @@ u16 M4Cartridge::decrypt_one_round(u16 word, u16 subkey) return one_round[word ^ subkey] ^ subkey ; } +u16 M4Cartridge::decrypt(u16 enc) +{ + u16 dec = iv; + iv = decrypt_one_round(enc ^ iv, subkey1); + dec ^= decrypt_one_round(iv, subkey2); + counter++; + if (counter == 16) { + counter = 0; + iv = 0; + } + + return dec; +} + void M4Cartridge::enc_fill() { const u8 *base = RomPtr + rom_cur_address; while (buffer_actual_size < sizeof(buffer)) { - u16 enc = base[0] | (base[1] << 8); - u16 dec = iv; - iv = decrypt_one_round(enc ^ iv, subkey1); - dec ^= decrypt_one_round(iv, subkey2); + u16 dec = decrypt(base[0] | (base[1] << 8)); buffer[buffer_actual_size++] = dec; buffer[buffer_actual_size++] = dec >> 8; base += 2; rom_cur_address += 2; - - counter++; - if(counter == 16) { - counter = 0; - iv = 0; - } } // printf("Decrypted M4 data:\n"); // for (int i = 0; i < buffer_actual_size; i++) @@ -285,7 +290,9 @@ bool M4Cartridge::GetBootId(RomBootID *bootId) if (RomSize < sizeof(RomBootID)) return false; RomBootID *pBootId = (RomBootID *)RomPtr; - if (memcmp(pBootId->boardName, "NAOMI", 5)) + if (memcmp(pBootId->boardName, "NAOMI", 5) + && memcmp(pBootId->boardName, "Naomi2", 6) + && memcmp(pBootId->boardName, "SystemSP", 8)) { rom_cur_address = 0; enc_reset(); @@ -314,8 +321,10 @@ void M4Cartridge::Serialize(Serializer& ser) const void M4Cartridge::Deserialize(Deserializer& deser) { deser >> buffer; + deser.skip(32768 - sizeof(buffer), Deserializer::V52); deser >> rom_cur_address; deser >> buffer_actual_size; + buffer_actual_size = std::min(buffer_actual_size, sizeof(buffer)); deser >> iv; deser >> counter; deser >> encryption; diff --git a/core/hw/naomi/m4cartridge.h b/core/hw/naomi/m4cartridge.h index 3249c3a4c..614f273c6 100644 --- a/core/hw/naomi/m4cartridge.h +++ b/core/hw/naomi/m4cartridge.h @@ -54,6 +54,8 @@ class M4Cartridge: public NaomiCartridge { protected: void DmaOffsetChanged(u32 dma_offset) override; void PioOffsetChanged(u32 pio_offset) override; + u16 decrypt(u16 w); + void enc_reset(); private: void device_start(); @@ -67,7 +69,7 @@ class M4Cartridge: public NaomiCartridge { u16 subkey2 = 0; u16 one_round[0x10000]; - u8 buffer[32768]; + u8 buffer[2048]; u32 rom_cur_address, buffer_actual_size; u16 iv; u8 counter; @@ -76,9 +78,10 @@ class M4Cartridge: public NaomiCartridge { bool xfer_ready; void enc_init(); - void enc_reset(); void enc_fill(); u16 decrypt_one_round(u16 word, u16 subkey); + + static_assert(sizeof(RomBootID) <= sizeof(buffer)); }; #endif /* CORE_HW_NAOMI_M4CARTRIDGE_H_ */ diff --git a/core/hw/naomi/multiboard.cpp b/core/hw/naomi/multiboard.cpp index df9b4b371..344f1cb01 100644 --- a/core/hw/naomi/multiboard.cpp +++ b/core/hw/naomi/multiboard.cpp @@ -33,12 +33,11 @@ static Multiboard *multiboard; #include "naomi_roms.h" #include "cfg/option.h" #include "hw/sh4/sh4_sched.h" -#include #include constexpr int SyncCycles = 500000; -static int schedCallback(int tag, int cycles, int jitter) +static int schedCallback(int tag, int cycles, int jitter, void *arg) { multiboard->syncWait(); return SyncCycles; @@ -128,6 +127,11 @@ void Multiboard::startSlave() int x = cfgLoadInt("window", "left", (1920 - 640) / 2); int y = cfgLoadInt("window", "top", (1080 - 480) / 2); int width = cfgLoadInt("window", "width", 640); + std::string biosFile = CurrentCartridge->game->bios == nullptr ? "naomi" : CurrentCartridge->game->bios; + std::string biosPath = hostfs::findNaomiBios(biosFile + ".zip"); + if (biosPath.empty()) + biosPath = hostfs::findNaomiBios(biosFile + ".7z"); + for (int i = 0; i < slaves; i++) { std::string region = "config:Dreamcast.Region=" + std::to_string(config::Region); @@ -144,7 +148,7 @@ void Multiboard::startSlave() "-config", region.c_str(), "-config", left.c_str(), "-config", top.c_str(), - CurrentCartridge->game->bios == nullptr ? "naomi" : CurrentCartridge->game->bios + biosPath.c_str() }; os_RunInstance(std::size(args), args); } diff --git a/core/hw/naomi/multiboard.h b/core/hw/naomi/multiboard.h index f2c273bda..87d4453e9 100644 --- a/core/hw/naomi/multiboard.h +++ b/core/hw/naomi/multiboard.h @@ -68,9 +68,46 @@ class IpcMutex class IpcConditionVariable { - HANDLE semaphore; + class Semaphore + { + HANDLE handle; + + public: + Semaphore() + { + SECURITY_ATTRIBUTES secattr{ sizeof(SECURITY_ATTRIBUTES) }; + secattr.bInheritHandle = TRUE; + handle = CreateSemaphore(&secattr, 0, std::numeric_limits::max(), NULL); + if (handle == NULL) + throw std::runtime_error("Semaphore create failed"); + } + ~Semaphore() { + CloseHandle(handle); + } + + bool wait(DWORD msecs = INFINITE) + { + DWORD rc = WaitForSingleObject(handle, msecs); + if (rc == WAIT_ABANDONED || rc == WAIT_FAILED) + throw std::runtime_error("Semaphore wait failure"); + return rc != WAIT_TIMEOUT; + } + + void signal(int n = 1) { + ReleaseSemaphore(handle, n, nullptr); + } + }; + + Semaphore semaphore; IpcMutex mutex; int waiters = 0; + // The unlock/wait/lock in wait() should be atomic so the h semaphore is used + // to make sure all processes about to wait (i.e. on the waiters list) are notified before any other. + // This race condition happens more frequently with one slave, where one process + // notifies the other that everybody is ready and ends up notifying itself, + // while the other process waits indefinitely. + // See https://birrell.org/andrew/papers/ImplementingCVs.pdf + Semaphore h; std::cv_status waitMs(std::unique_lock& lock, DWORD msecs) { @@ -78,35 +115,28 @@ class IpcConditionVariable waiters++; mutex.unlock(); - // The unlock/wait/lock should be atomical so this implementation isn't compliant lock.unlock(); - DWORD rc = WaitForSingleObject(semaphore, msecs); + std::cv_status status = semaphore.wait(msecs) ? + std::cv_status::no_timeout : std::cv_status::timeout; + // must be done before re-acquiring the lock + h.signal(); lock.lock(); - if (rc == WAIT_ABANDONED || rc == WAIT_FAILED) - throw std::runtime_error("Semaphore wait failure"); - return rc == WAIT_TIMEOUT ? std::cv_status::timeout : std::cv_status::no_timeout; + return status; } public: - IpcConditionVariable() - { - SECURITY_ATTRIBUTES secattr{ sizeof(SECURITY_ATTRIBUTES) }; - secattr.bInheritHandle = TRUE; - semaphore = CreateSemaphore(&secattr, 0, std::numeric_limits::max(), NULL); - if (semaphore == NULL) - throw std::runtime_error("Semaphore create failed"); - } - - ~IpcConditionVariable() - { - CloseHandle(semaphore); - } - void notify_all() { mutex.lock(); - ReleaseSemaphore(semaphore, waiters, NULL); - waiters = 0; + if (waiters > 0) + { + semaphore.signal(waiters); + // make sure waiters are notified before moving on + do { + h.wait(); + waiters--; + } while (waiters > 0); + } mutex.unlock(); } diff --git a/core/hw/naomi/naomi.cpp b/core/hw/naomi/naomi.cpp index 8e84ab0fc..9a6fa8fbd 100644 --- a/core/hw/naomi/naomi.cpp +++ b/core/hw/naomi/naomi.cpp @@ -1,6 +1,19 @@ /* - This file is a mix of my code, Zezu's, and duno wtf-else (most likely ElSemi's ?) -*/ + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ #include "types.h" #include "hw/holly/sb.h" #include "hw/sh4/sh4_mem.h" @@ -17,318 +30,53 @@ #include "serialize.h" #include "network/output.h" #include "hw/sh4/modules/modules.h" -#include "rend/gui.h" +#include "oslib/oslib.h" #include "printer.h" +#include "hw/flashrom/x76f100.h" +#include "input/haptic.h" #include static NaomiM3Comm m3comm; Multiboard *multiboard; -static const u32 BoardID = 0x980055AA; -static u32 GSerialBuffer, BSerialBuffer; -static int GBufPos, BBufPos; -static int GState, BState; -static int GOldClk, BOldClk; -static int BControl, BCmd, BLastCmd; -static int GControl, GCmd, GLastCmd; -static int SerStep, SerStep2; - -/* -El numero de serie solo puede contener: -0-9 (0x30-0x39) -A-H (0x41-0x48) -J-N (0x4A-0x4E) -P-Z (0x50-0x5A) -*/ -static u8 BSerial[]="\xB7"/*CRC1*/"\x19"/*CRC2*/"0123234437897584372973927387463782196719782697849162342198671923649"; -//static u8 BSerial[]="\x09\xa1 0000000000000000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; // default from mame -static u8 GSerial[]="\xB7"/*CRC1*/"\x19"/*CRC2*/"0123234437897584372973927387463782196719782697849162342198671923649"; - -static u8 midiTxBuf[4]; -static u32 midiTxBufIndex; - -static unsigned int ShiftCRC(unsigned int CRC,unsigned int rounds) -{ - const unsigned int Magic=0x10210000; - unsigned int i; - for(i=0;i>16); -} +static X76F100SerialFlash mainSerialId; +static X76F100SerialFlash romSerialId; -void NaomiInit() -{ - u16 CRC; - CRC=CRCSerial(BSerial+2,0x2E); - BSerial[0]=(u8)(CRC>>8); - BSerial[1]=(u8)(CRC); - - CRC=CRCSerial(GSerial+2,0x2E); - GSerial[0]=(u8)(CRC>>8); - GSerial[1]=(u8)(CRC); -} +static int dmaSchedId = -1; +static int dmaXferDelay = 10; // cart dma xfer speed, in cycles/byte (default 20 MB/s) -void NaomiBoardIDWrite(const u16 Data) +void NaomiBoardIDWrite(const u16 data) { - int Dat=Data&8; - int Clk=Data&4; - int Rst=Data&0x20; - int Sta=Data&0x10; - - if(Rst) - { - BState=0; - BBufPos=0; - } - - if(Clk!=BOldClk && !Clk) //Falling Edge clock - { - //State change - if(BState==0 && Sta) - BState=1; - if(BState==1 && !Sta) - BState=2; - - if((BControl&0xfff)==0xFF0) //Command mode - { - BCmd<<=1; - if(Dat) - BCmd|=1; - else - BCmd&=0xfffffffe; - } - - //State processing - if(BState==1) //LoadBoardID - { - BSerialBuffer=BoardID; - BBufPos=0; //?? - } - if(BState==2) //ShiftBoardID - { - BBufPos++; - } - } - BOldClk=Clk; + // bit 2: clock + // bit 3: data + // bit 4: reset (x76f100 only) + // bit 5: chip select + mainSerialId.writeCS(data & 0x20); + mainSerialId.writeRST(data & 0x10); + mainSerialId.writeSCL(data & 4); + mainSerialId.writeSDA(data & 8); } u16 NaomiBoardIDRead() { - if((BControl&0xff)==0xFE) - return 0xffff; - return (BSerialBuffer&(1<<(31-BBufPos)))?8:0; -} - -static u32 AdaptByte(u8 val) -{ - return val<<24; -} - -void NaomiBoardIDWriteControl(const u16 Data) -{ - if((Data&0xfff)==0xF30 && BCmd!=BLastCmd) - { - if((BCmd&0x81)==0x81) - { - SerStep2=(BCmd>>1)&0x3f; - - BSerialBuffer=0x00000000; //First block contains CRC - BBufPos=0; - } - if((BCmd&0xff)==0x55) //Load Offset 0 - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2])>>1; - } - if((BCmd&0xff)==0xAA) //Load Offset 1 - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+1]); - } - if((BCmd&0xff)==0x54) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+2]); - } - if((BCmd&0xff)==0xA8) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+3]); - } - if((BCmd&0xff)==0x50) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+4]); - } - if((BCmd&0xff)==0xA0) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+5]); - } - if((BCmd&0xff)==0x40) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+6]); - } - if((BCmd&0xff)==0x80) - { - BState=2; - BBufPos=0; - BSerialBuffer=AdaptByte(BSerial[8*SerStep2+7]); - } - BLastCmd=BCmd; - } - BControl=Data; -} - -static void NaomiGameIDProcessCmd() -{ - if(GCmd!=GLastCmd) - { - if((GCmd&0x81)==0x81) - { - SerStep=(GCmd>>1)&0x3f; - - GSerialBuffer=0x00000000; //First block contains CRC - GBufPos=0; - } - if((GCmd&0xff)==0x55) //Load Offset 0 - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep])>>0; - } - if((GCmd&0xff)==0xAA) //Load Offset 1 - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+1]); - } - if((GCmd&0xff)==0x54) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+2]); - } - if((GCmd&0xff)==0xA8) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+3]); - } - if((GCmd&0xff)==0x50) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+4]); - } - if((GCmd&0xff)==0xA0) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+5]); - } - if((GCmd&0xff)==0x40) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+6]); - } - if((GCmd&0xff)==0x80) - { - GState=2; - GBufPos=0; - GSerialBuffer=AdaptByte(GSerial[8*SerStep+7]); - } - GLastCmd=GCmd; - } + // bit 0 indicates the eeprom is a X76F100, otherwise the BIOS expects an AT93C46 + // bit 3 is xf76f100 SDA + // bit 4 is at93c46 DO + return (mainSerialId.readSDA() << 3) | 1; } - -void NaomiGameIDWrite(const u16 Data) +void NaomiGameIDWrite(const u16 data) { - int Dat=Data&0x01; // mame: SDA - int Clk=Data&0x02; // mame: SCL - int Rst=Data&0x04; // mame: CS - int Sta=Data&0x08; // mame: RST - int Cmd=Data&0x10; // mame: unused... - - if(Rst) - { - GState=0; - GBufPos=0; - } - - if(Clk!=GOldClk && !Clk) //Falling Edge clock - { - //State change - if(GState==0 && Sta) - GState=1; - if(GState==1 && !Sta) - GState=2; - - //State processing - if(GState==1) //LoadBoardID - { - GSerialBuffer=BoardID; - GBufPos=0; //?? - } - if(GState==2) //ShiftBoardID - GBufPos++; - - if(GControl!=Cmd && !Cmd) - { - NaomiGameIDProcessCmd(); - } - GControl=Cmd; - } - if(Clk!=GOldClk && Clk) //Rising Edge clock - { - if(Cmd) //Command mode - { - GCmd<<=1; - if(Dat) - GCmd|=1; - else - GCmd&=0xfffffffe; - GControl=Cmd; - } - } - GOldClk=Clk; + romSerialId.writeCS(data & 4); + romSerialId.writeRST(data & 8); + romSerialId.writeSCL(data & 2); + romSerialId.writeSDA(data & 1); } u16 NaomiGameIDRead() { - return (GSerialBuffer&(1<<(31-GBufPos)))?1:0; + return romSerialId.readSDA() << 15; } static bool aw_ram_test_skipped = false; @@ -362,43 +110,65 @@ void WriteMem_naomi(u32 address, u32 data, u32 size) CurrentCartridge->WriteMem(address, data, size); } +static int naomiDmaSched(int tag, int sch_cycl, int jitter, void *arg) +{ + u32 start = SB_GDSTARD; + u32 len = std::min(((SB_GDLEN + 31) & ~31) - SB_GDLEND, 1024); + SB_GDLEND += len; + while (len > 0) + { + u32 block_len = len; + void* ptr = CurrentCartridge->GetDmaPtr(block_len); + if (block_len == 0) + { + INFO_LOG(NAOMI, "Aborted DMA transfer. Read past end of cart?"); + for (u32 i = 0; i < len; i += 8, start += 8) + addrspace::write64(start, 0); + break; + } + WriteMemBlock_nommu_ptr(start, (u32*)ptr, block_len); + CurrentCartridge->AdvancePtr(block_len); + len -= block_len; + start += block_len; + } + SB_GDSTARD = start; + if (SB_GDLEN <= SB_GDLEND) + { + SB_GDST = 0; + asic_RaiseInterrupt(holly_GDROM_DMA); + return 0; + } + else { + return std::min(SB_GDLEN - SB_GDLEND, 1024) * dmaXferDelay; + } +} + //Dma Start static void Naomi_DmaStart(u32 addr, u32 data) { - if ((data & 1) == 0) + if ((data & 1) == 0 || SB_GDST == 1) return; if (SB_GDEN == 0) { - INFO_LOG(NAOMI, "Invalid (NAOMI)GD-DMA start, SB_GDEN=0. Ignoring it."); + INFO_LOG(NAOMI, "Invalid NAOMI-DMA start, SB_GDEN=0. Ignoring it."); return; } if (multiboard != nullptr && multiboard->dmaStart()) { } - else if (!m3comm.DmaStart(addr, data) && CurrentCartridge != NULL) + else if (!m3comm.DmaStart(addr, data) && CurrentCartridge != nullptr) { - DEBUG_LOG(NAOMI, "NAOMI-DMA start addr %08X len %d", SB_GDSTAR, SB_GDLEN); + DEBUG_LOG(NAOMI, "NAOMI-DMA start addr %08X len %x", SB_GDSTAR, SB_GDLEN); verify(1 == SB_GDDIR); - u32 start = SB_GDSTAR & 0x1FFFFFE0; - u32 len = (SB_GDLEN + 31) & ~31; + SB_GDST = 1; + SB_GDSTARD = SB_GDSTAR & 0x1FFFFFE0; SB_GDLEND = 0; - while (len > 0) - { - u32 block_len = len; - void* ptr = CurrentCartridge->GetDmaPtr(block_len); - if (block_len == 0) - { - INFO_LOG(NAOMI, "Aborted DMA transfer. Read past end of cart?"); - break; - } - WriteMemBlock_nommu_ptr(start, (u32*)ptr, block_len); - CurrentCartridge->AdvancePtr(block_len); - len -= block_len; - start += block_len; - SB_GDLEND += block_len; - } - SB_GDSTARD = start; + // Max G1 bus rate: 50 MHz x 16 bits + // SH4_access990312_e.xls: 14.4 MB/s from GD-ROM to system RAM + // Here: 20 MB/s + sh4_sched_request(dmaSchedId, std::min(SB_GDLEN, 1024) * dmaXferDelay); + return; } else { @@ -408,21 +178,57 @@ static void Naomi_DmaStart(u32 addr, u32 data) asic_RaiseInterrupt(holly_GDROM_DMA); } +void Naomi_setDmaDelay() +{ + if (settings.platform.isAtomiswave() || settings.content.gameId == "FORCE FIVE" + || settings.content.gameId == "KENJU") + // 7 MB/s for Atomiwave games and conversions + dmaXferDelay = 27; + else + dmaXferDelay = 10; +} static void Naomi_DmaEnable(u32 addr, u32 data) { SB_GDEN = data & 1; if (SB_GDEN == 0 && SB_GDST == 1) { - INFO_LOG(NAOMI, "(NAOMI)GD-DMA aborted"); + INFO_LOG(NAOMI, "NAOMI-DMA aborted"); SB_GDST = 0; + sh4_sched_request(dmaSchedId, -1); } } void naomi_reg_Init() { - NaomiInit(); networkOutput.init(); + + static const u8 romSerialData[0x84] = { + 0x19, 0x00, 0xaa, 0x55, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x69, 0x79, 0x68, 0x6b, 0x74, 0x6d, 0x68, 0x6d, + 0xa1, 0x09, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0' + }; + romSerialId.setData(romSerialData); + mainSerialId.setData(romSerialData); + if (dmaSchedId == -1) + dmaSchedId = sh4_sched_register(0, naomiDmaSched); +} + +// Sets the full content of the rom board serial eeprom (132 bytes) +// including response to reset and read/write passwords. +void setGameSerialId(const u8 *data) +{ + romSerialId.setData(data); +} + +// Return the protected data from the rom board serial eeprom (112 bytes) +// excluding response to reset and passwords. +const u8 *getGameSerialId() +{ + return romSerialId.getProtectedData(); } void naomi_reg_Term() @@ -432,6 +238,10 @@ void naomi_reg_Term() multiboard = nullptr; m3comm.closeNetwork(); networkOutput.term(); + if (dmaSchedId != -1) + sh4_sched_unregister(dmaSchedId); + dmaSchedId = -1; + midiffb::term(); } void naomi_reg_Reset(bool hard) @@ -440,24 +250,10 @@ void naomi_reg_Reset(bool hard) hollyRegs.setWriteHandler(Naomi_DmaEnable); SB_GDST = 0; SB_GDEN = 0; + sh4_sched_request(dmaSchedId, -1); aw_ram_test_skipped = false; - GSerialBuffer = 0; - BSerialBuffer = 0; - GBufPos = 0; - BBufPos = 0; - GState = 0; - BState = 0; - GOldClk = 0; - BOldClk = 0; - BControl = 0; - BCmd = 0; - BLastCmd = 0; - GControl = 0; - GCmd = 0; - GLastCmd = 0; - SerStep = 0; - SerStep2 = 0; + m3comm.closeNetwork(); if (hard) { @@ -470,9 +266,12 @@ void naomi_reg_Reset(bool hard) if (settings.naomi.multiboard) multiboard = new Multiboard(); networkOutput.reset(); + mainSerialId.reset(); + romSerialId.reset(); } else if (multiboard != nullptr) multiboard->reset(); + midiffb::reset(); } static u8 aw_maple_devs; @@ -559,10 +358,14 @@ void libExtDevice_WriteMem_A0_006(u32 addr, u32 data, u32 size) if ((u8)data != awDigitalOuput) { if (atomiswaveForceFeedback) + { // Wheel force feedback: // bit 0 direction (0 pos, 1 neg) // bit 1-4 strength networkOutput.output("awffb", (u8)data); + // This really needs to be soften + haptic::setTorque(0, (data & 1 ? -1.f : 1.f) * ((data >> 1) & 0xf) / 15.f * 0.5f); + } else { u8 changes = data ^ awDigitalOuput; @@ -583,56 +386,45 @@ void libExtDevice_WriteMem_A0_006(u32 addr, u32 data, u32 size) INFO_LOG(NAOMI, "Unhandled write @ %x (%d): %x", addr, size, data); } -static bool ffbCalibrating; - void naomi_Serialize(Serializer& ser) { - ser << GSerialBuffer; - ser << BSerialBuffer; - ser << GBufPos; - ser << BBufPos; - ser << GState; - ser << BState; - ser << GOldClk; - ser << BOldClk; - ser << BControl; - ser << BCmd; - ser << BLastCmd; - ser << GControl; - ser << GCmd; - ser << GLastCmd; - ser << SerStep; - ser << SerStep2; - ser.serialize(BSerial, 69); - ser.serialize(GSerial, 69); + mainSerialId.serialize(ser); + romSerialId.serialize(ser); ser << aw_maple_devs; ser << coin_chute_time; ser << aw_ram_test_skipped; - ser << midiTxBuf; - ser << midiTxBufIndex; // TODO serialize m3comm? - ser << ffbCalibrating; + midiffb::serialize(ser); + sh4_sched_serialize(ser, dmaSchedId); } void naomi_Deserialize(Deserializer& deser) { - deser >> GSerialBuffer; - deser >> BSerialBuffer; - deser >> GBufPos; - deser >> BBufPos; - deser >> GState; - deser >> BState; - deser >> GOldClk; - deser >> BOldClk; - deser >> BControl; - deser >> BCmd; - deser >> BLastCmd; - deser >> GControl; - deser >> GCmd; - deser >> GLastCmd; - deser >> SerStep; - deser >> SerStep2; - deser.deserialize(BSerial, 69); - deser.deserialize(GSerial, 69); + if (deser.version() < Deserializer::V40) + { + deser.skip(); // GSerialBuffer + deser.skip(); // BSerialBuffer + deser.skip(); // GBufPos + deser.skip(); // BBufPos + deser.skip(); // GState + deser.skip(); // BState + deser.skip(); // GOldClk + deser.skip(); // BOldClk + deser.skip(); // BControl + deser.skip(); // BCmd + deser.skip(); // BLastCmd + deser.skip(); // GControl + deser.skip(); // GCmd + deser.skip(); // GLastCmd + deser.skip(); // SerStep + deser.skip(); // SerStep2 + deser.skip(69); // BSerial + deser.skip(69); // GSerial + } + else + { + mainSerialId.deserialize(deser); + romSerialId.deserialize(deser); + } if (deser.version() < Deserializer::V36) { deser.skip(); // reg_dimm_command; @@ -641,30 +433,30 @@ void naomi_Deserialize(Deserializer& deser) deser.skip(); // reg_dimm_parameterh; deser.skip(); // reg_dimm_status; } - if (deser.version() < Deserializer::V11) - deser.skip(); - else if (deser.version() >= Deserializer::V14) - deser >> aw_maple_devs; + deser >> aw_maple_devs; if (deser.version() >= Deserializer::V20) { deser >> coin_chute_time; deser >> aw_ram_test_skipped; } - if (deser.version() >= Deserializer::V27) - { - deser >> midiTxBuf; - deser >> midiTxBufIndex; - } - else - { - midiTxBufIndex = 0; - } - if (deser.version() >= Deserializer::V34) - deser >> ffbCalibrating; - else - ffbCalibrating = false; + midiffb::deserialize(deser); + if (deser.version() >= Deserializer::V45) + sh4_sched_deserialize(deser, dmaSchedId); } +namespace midiffb { + +static bool initialized; +static u8 midiTxBuf[4]; +static u32 midiTxBufIndex; +static bool calibrating; +static float damperParam; +static float damperSpeed; +static float power = 0.8f; +static bool active; +static float position = 8192.f; +static float torque; + static void midiSend(u8 b1, u8 b2, u8 b3) { aica::midiSend(b1); @@ -673,50 +465,220 @@ static void midiSend(u8 b1, u8 b2, u8 b3) aica::midiSend((b1 ^ b2 ^ b3) & 0x7f); } -static void forceFeedbackMidiReceiver(u8 data) +// https://www.arcade-projects.com/threads/force-feedback-translator-sega-midi-sega-rs422-and-namco-rs232.924/ +static void midiReceiver(u8 data) { - static float position = 8192.f; - static float torque; + // fake position used during calibration position = std::min(16383.f, std::max(0.f, position + torque)); if (data & 0x80) midiTxBufIndex = 0; midiTxBuf[midiTxBufIndex] = data; if (midiTxBufIndex == 3 && ((midiTxBuf[0] ^ midiTxBuf[1] ^ midiTxBuf[2]) & 0x7f) == midiTxBuf[3]) { - if (midiTxBuf[0] == 0x84) + const u8 cmd = midiTxBuf[0] & 0x7f; + switch (cmd) + { + case 0: + // FFB on/off + if (midiTxBuf[2] == 0) + { + active = false; + haptic::stopAll(0); + if (calibrating) { + calibrating = false; + os_notify("Calibration done", 2000); + } + } + else if (midiTxBuf[2] == 1) { + active = true; + haptic::setDamper(0, damperParam * power, damperSpeed); + } + break; + + // 01: 30 40 then 7f 40 (sgdrvsim search base pos) + // 30 40 (*2 initdv3e init, clubk after init) + // 7f 7f (kingrt init) + // 1f 1f kingrt test menu + // 02: 00 54 (sgdrvsim search base pos, kingrt) + // 7f 54 (*2 initdv3e init) + // 04 54 (clubk after init) + + case 3: + // Drive power + // buf[2]? initdv3, clubk2k3: 4, kingrt: 0, sgdrvsim: 28 + power = (midiTxBuf[1] >> 3) / 15.f; + break; + case 4: + // Torque torque = ((midiTxBuf[1] << 7) | midiTxBuf[2]) - 0x80; - else if (midiTxBuf[0] == 0xff) - ffbCalibrating = true; - else if (midiTxBuf[0] == 0xf0) - ffbCalibrating = false; - - if (!ffbCalibrating) + if (active && !calibrating) + haptic::setTorque(0, torque / 128.f * power); + break; + case 5: + // Rumble + // decoding from FFB Arcade Plugin (by Boomslangnz) + // https://github.com/Boomslangnz/FFBArcadePlugin/blob/master/Game%20Files/Demul.cpp + // buf[1]? + if (active) + MapleConfigMap::UpdateVibration(0, std::max(0.f, (float)(midiTxBuf[2] - 1) / 24.f * power), 0.f, 17); + break; + case 6: + // Damper + damperParam = midiTxBuf[1] / 127.f; + damperSpeed = midiTxBuf[2] / 127.f; + // clubkart sets it to 28 40 in menus, and 04 12 when in game (not changing in between) + // initdv3 starts with 02 2c // FIXME no effect with sat=2 + // changes it in-game: 02 11-2c + // finish line(?): 02 5a + // ends with 00 00 + // kingrt66: 60 0a (start), 40 0a (in game) + // sgdrvsim: 08 20 when calibrating center + // 18 40 init + // 28 nn in menus (nn is viscoSpeed<<6 >>8 from table: 20,28,30,38,...,98) + // 1e+n 0+m in game (n and m are set in test menu, default 1e, 0)) + // also: 8+n 0a+m and 0+n 3c+m + // byte1 is effect force? byte2 speed of effect? + if (active && !calibrating) + haptic::setDamper(0, damperParam * power, damperSpeed); + break; + + // 07 nn nn: set wheel center. n=004d 90° right, 0100 center, 011a ? left + // 09 00 00: kingrt init + // 03 40: end init + // 0A 10 58: kingrt end init + // 0B nn mm: auto center? deflection range? + // sgdrvsim: 20 10 in menus, else 00 00. Also nn 7f (nn computed) + // kingrt: 1b 00 end init + // 70 00 00: kingrt init (before 7f & 7a), kingrt test menu (after 7f) + // 7A 00 10,14: clubk,initv3e,kingrt init/tets menu + // 7C 00 3f: initdv3e init + // 20: clubk init + // 30: kingrt init + // 7D 00 00: nop, poll + + case 0x7f: + // FIXME also set when entering the service menu (kingrt66) + os_notify("Calibrating the wheel. Keep it centered.", 10000); + calibrating = true; + haptic::setSpring(0, 0.8f, 1.f); + position = 8192.f; + break; + } + + + if (!calibrating) { int direction = -1; if (NaomiGameInputs != nullptr) direction = NaomiGameInputs->axes[0].inverted ? 1 : -1; - position = std::clamp(mapleInputState[0].fullAxes[0] * direction * 64.f + 8192.f, 0.f, 16383.f); + position = std::clamp(mapleInputState[0].fullAxes[0] * direction / 4.f + 8192.f, 0.f, 16383.f); } // required: b1 & 0x1f == 0x10 && b1 & 0x40 == 0 midiSend(0x90, ((int)position >> 7) & 0x7f, (int)position & 0x7f); - // decoding from FFB Arcade Plugin (by Boomslangnz) - // https://github.com/Boomslangnz/FFBArcadePlugin/blob/master/Game%20Files/Demul.cpp - if (midiTxBuf[0] == 0x85) - MapleConfigMap::UpdateVibration(0, std::max(0.f, (float)(midiTxBuf[2] - 1) / 24.f), 0.f, 5); - if (midiTxBuf[0] != 0xfd) + if (cmd != 0x7d) { networkOutput.output("midiffb", (midiTxBuf[0] << 16) | (midiTxBuf[1]) << 8 | midiTxBuf[2]); + DEBUG_LOG(NAOMI, "midiFFB: %02x %02x %02x", cmd, midiTxBuf[1], midiTxBuf[2]); + } } midiTxBufIndex = (midiTxBufIndex + 1) % std::size(midiTxBuf); } -void initMidiForceFeedback() +void init() +{ + aica::setMidiReceiver(midiReceiver); + initialized = true; + reset(); +} + +void reset() +{ + active = false; + calibrating = false; + midiTxBufIndex = 0; + power = 0.8f; + damperParam = 0.f; + damperSpeed = 0.f; + torque = 0.f; +} + +void term() +{ + aica::setMidiReceiver(nullptr); + initialized = false; +} + +void serialize(Serializer& ser) { - aica::setMidiReceiver(forceFeedbackMidiReceiver); + if (initialized) + { + ser << midiTxBuf; + ser << midiTxBufIndex; + ser << calibrating; + ser << active; + ser << power; + ser << damperParam; + ser << damperSpeed; + ser << position; + ser << torque; + } +} + +void deserialize(Deserializer& deser) +{ + if (deser.version() >= Deserializer::V27) + { + if (initialized) { + deser >> midiTxBuf; + deser >> midiTxBufIndex; + } + else if (deser.version() < Deserializer::V51) { + deser.skip(4); // midiTxBuf + deser.skip(); // midiTxBufIndex + } + } + else { + midiTxBufIndex = 0; + } + if (deser.version() >= Deserializer::V34) + { + if (initialized) + deser >> calibrating; + else if (deser.version() < Deserializer::V51) + deser.skip(); // calibrating + } + else { + calibrating = false; + } + if (initialized) + { + if (deser.version() >= Deserializer::V51) + { + deser >> active; + deser >> power; + deser >> damperParam; + deser >> damperSpeed; + deser >> position; + deser >> torque; + if (active && !calibrating) + haptic::setDamper(0, damperParam * power, damperSpeed); + } + else + { + active = false; + power = 0.8f; + damperParam = 0.f; + damperSpeed = 0.f; + position = 8192.f; + torque = 0.f; + } + } } -struct DriveSimPipe : public SerialPipe +} // namespace midiffb + +struct DriveSimPipe : public SerialPort::Pipe { void write(u8 data) override { @@ -745,7 +707,7 @@ struct DriveSimPipe : public SerialPipe { char message[16]; sprintf(message, "Speed: %3d", speed); - gui_display_notification(message, 1000); + os_notify(message, 1000); } } buffer.clear(); @@ -773,7 +735,7 @@ void initDriveSimSerialPipe() static DriveSimPipe pipe; pipe.reset(); - serial_setPipe(&pipe); + SCIFSerialPort::Instance().setPipe(&pipe); } G2PrinterConnection g2PrinterConnection; diff --git a/core/hw/naomi/naomi.h b/core/hw/naomi/naomi.h index 29c2456be..4abb1a0e3 100644 --- a/core/hw/naomi/naomi.h +++ b/core/hw/naomi/naomi.h @@ -14,14 +14,25 @@ void naomi_Deserialize(Deserializer& deser); u32 ReadMem_naomi(u32 Addr, u32 size); void WriteMem_naomi(u32 Addr, u32 data, u32 size); -void NaomiBoardIDWrite(u16 Data); -void NaomiBoardIDWriteControl(u16 Data); +void NaomiBoardIDWrite(u16 data); u16 NaomiBoardIDRead(); u16 NaomiGameIDRead(); -void NaomiGameIDWrite(u16 Data); +void NaomiGameIDWrite(u16 data); +void setGameSerialId(const u8 *data); +const u8 *getGameSerialId(); -void initMidiForceFeedback(); void initDriveSimSerialPipe(); +void Naomi_setDmaDelay(); + +namespace midiffb { + +void init(); +void reset(); +void term(); +void serialize(Serializer& ser); +void deserialize(Deserializer& deser); + +} u32 libExtDevice_ReadMem_A0_006(u32 addr, u32 size); void libExtDevice_WriteMem_A0_006(u32 addr, u32 data, u32 size); @@ -50,7 +61,7 @@ static inline u32 g2ext_readMem(u32 addr, u32 size) if (multiboard != nullptr) return multiboard->readG2Ext(addr, size); - INFO_LOG(NAOMI, "Unhandled G2 Ext read<%d> at %x", size, addr); + DEBUG_LOG(NAOMI, "Unhandled G2 Ext read<%d> at %x", size, addr); return 0; } @@ -61,5 +72,5 @@ static inline void g2ext_writeMem(u32 addr, u32 data, u32 size) else if (multiboard != nullptr) multiboard->writeG2Ext(addr, size, data); else - INFO_LOG(NAOMI, "Unhandled G2 Ext write<%d> at %x: %x", size, addr, data); + DEBUG_LOG(NAOMI, "Unhandled G2 Ext write<%d> at %x: %x", size, addr, data); } diff --git a/core/hw/naomi/naomi_cart.cpp b/core/hw/naomi/naomi_cart.cpp index cdf257f67..a9ee7f746 100644 --- a/core/hw/naomi/naomi_cart.cpp +++ b/core/hw/naomi/naomi_cart.cpp @@ -26,7 +26,6 @@ #include "decrypt.h" #include "naomi_roms.h" #include "hw/flashrom/nvmem.h" -#include "hw/holly/holly_intc.h" #include "m1cartridge.h" #include "m4cartridge.h" #include "awcartridge.h" @@ -44,6 +43,8 @@ #include "oslib/storage.h" #include "network/alienfnt_modem.h" #include "netdimm.h" +#include "systemsp.h" +#include "hopper.h" Cartridge *CurrentCartridge; bool bios_loaded = false; @@ -55,36 +56,50 @@ bool atomiswaveForceFeedback; static bool loadBios(const char *filename, Archive *child_archive, Archive *parent_archive, int region) { + std::string path; + std::string biosName; + if (settings.naomi.slave) + { + // extract basename of bios + biosName = get_file_basename(filename); + size_t idx = get_last_slash_pos(biosName); + if (idx != std::string::npos) + biosName = biosName.substr(idx + 1); + path = filename; + } + else + { + biosName = filename; + } int biosid = 0; for (; BIOS[biosid].name != nullptr; biosid++) - if (!stricmp(BIOS[biosid].name, filename)) + if (!stricmp(BIOS[biosid].name, biosName.c_str())) break; if (BIOS[biosid].name == nullptr) { - WARN_LOG(NAOMI, "Unknown BIOS %s", filename); + WARN_LOG(NAOMI, "Unknown BIOS %s", biosName.c_str()); return false; } const BIOS_t *bios = &BIOS[biosid]; - std::string arch_name(filename); - std::string path = hostfs::findNaomiBios(arch_name + ".zip"); if (path.empty()) - path = hostfs::findNaomiBios(arch_name + ".7z"); + { + std::string arch_name(bios->filename != nullptr ? bios->filename : filename); + path = hostfs::findNaomiBios(arch_name + ".zip"); + if (path.empty()) + path = hostfs::findNaomiBios(arch_name + ".7z"); + } DEBUG_LOG(NAOMI, "Loading BIOS from %s", path.c_str()); std::unique_ptr bios_archive(OpenArchive(path)); bool found_region = false; u8 *biosData = nvmem::getBiosData(); + MD5Sum md5; - for (int romid = 0; bios->blobs[romid].filename != nullptr && !found_region; romid++) + for (int romid = 0; bios->blobs[romid].filename != nullptr; romid++) { - if (region == -1) - { - region = bios->blobs[romid].region; - config::Region.override(region); - } - else if (bios->blobs[romid].region != (u32)region) + if (region != -1 && bios->blobs[romid].region != (u32)region) continue; std::unique_ptr file; @@ -106,21 +121,47 @@ static bool loadBios(const char *filename, Archive *child_archive, Archive *pare WARN_LOG(NAOMI, "%s: Cannot open %s", filename, bios->blobs[romid].filename); continue; } - verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); - u32 read = file->Read(biosData + bios->blobs[romid].offset, bios->blobs[romid].length); - if (config::GGPOEnable) + switch (bios->blobs[romid].blob_type) { - MD5Sum md5; - md5.add(biosData + bios->blobs[romid].offset, bios->blobs[romid].length); - md5.getDigest(settings.network.md5.bios); + case Normal: + if (!found_region) + { + verify(bios->blobs[romid].offset + bios->blobs[romid].length <= BIOS_SIZE); + u32 read = file->Read(biosData + bios->blobs[romid].offset, bios->blobs[romid].length); + if (config::GGPOEnable) + md5.add(biosData + bios->blobs[romid].offset, bios->blobs[romid].length); + DEBUG_LOG(NAOMI, "Mapped %s: %x bytes at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset); + found_region = true; + if (region == -1) + config::Region.override(bios->blobs[romid].region); + } + break; + case EepromBE16: + { + // FIXME memory leak + naomi_default_eeprom = (u8 *)malloc(bios->blobs[romid].length); + if (naomi_default_eeprom == nullptr) + throw NaomiCartException("Memory allocation failed"); + + u32 read = file->Read(naomi_default_eeprom, bios->blobs[romid].length); + for (unsigned i = 0; i < bios->blobs[romid].length; i += 2) + std::swap(naomi_default_eeprom[i], naomi_default_eeprom[i + 1]); + if (config::GGPOEnable) + md5.add(naomi_default_eeprom, bios->blobs[romid].length); + DEBUG_LOG(NAOMI, "Loaded %s: %x bytes default eeprom", bios->blobs[romid].filename, read); + } + break; + default: + die("Unsupported BIOS blob type"); + break; } - DEBUG_LOG(NAOMI, "Mapped %s: %x bytes at %07x", bios->blobs[romid].filename, read, bios->blobs[romid].offset); - found_region = true; } // Reload the writeable portion of the FlashROM if (found_region) nvmem::reloadAWBios(); + if (config::GGPOEnable) + md5.getDigest(settings.network.md5.bios); return found_region; } @@ -158,9 +199,12 @@ void naomi_cart_LoadBios(const char *filename) std::unique_ptr parent_archive; if (game->parent_name != nullptr) { - std::string parentPath = hostfs::storage().getParentPath(filename); - parentPath = hostfs::storage().getSubPath(parentPath, game->parent_name); - parent_archive.reset(OpenArchive(parentPath)); + try { + std::string parentPath = hostfs::storage().getParentPath(filename); + parentPath = hostfs::storage().getSubPath(parentPath, game->parent_name); + parent_archive.reset(OpenArchive(parentPath)); + } catch (const FlycastException& e) { + } } const char *bios = "naomi"; @@ -195,11 +239,17 @@ static void loadMameRom(const std::string& path, const std::string& fileName, Lo std::unique_ptr parent_archive; if (game->parent_name != nullptr) { - std::string parentPath = hostfs::storage().getParentPath(path); - parentPath = hostfs::storage().getSubPath(parentPath, game->parent_name); - parent_archive.reset(OpenArchive(parentPath)); + try { + std::string parentPath = hostfs::storage().getParentPath(path); + parentPath = hostfs::storage().getSubPath(parentPath, game->parent_name); + parent_archive.reset(OpenArchive(parentPath)); + } catch (const FlycastException& e) { + } if (parent_archive != nullptr) INFO_LOG(NAOMI, "Opened %s", game->parent_name); + else + WARN_LOG(NAOMI, "Parent not found: %s", game->parent_name); + } if (archive == nullptr && parent_archive == nullptr) @@ -224,7 +274,16 @@ static void loadMameRom(const std::string& path, const std::string& fileName, Lo CurrentCartridge = new M2Cartridge(game->size); break; case M4: - CurrentCartridge = new M4Cartridge(game->size); + if (game->bios != nullptr && !strcmp(game->bios, "segasp")) + { + systemsp::SystemSpCart *spcart = new systemsp::SystemSpCart(game->size); + if (game->gdrom_name != nullptr) + spcart->setMediaName(game->gdrom_name, game->parent_name); + CurrentCartridge = spcart; + } + else { + CurrentCartridge = new M4Cartridge(game->size); + } break; case AW: CurrentCartridge = new AWCartridge(game->size); @@ -232,7 +291,9 @@ static void loadMameRom(const std::string& path, const std::string& fileName, Lo case GD: { GDCartridge *gdcart; - if (strncmp(game->name, "vf4", 3) == 0) + if (strncmp(game->name, "vf4", 3) == 0 + || strcmp(game->name, "mj1") == 0 + || strncmp(game->name, "wccf", 4) == 0) gdcart = new NetDimm(game->size); else gdcart = new GDCartridge(game->size); @@ -350,14 +411,27 @@ static void loadMameRom(const std::string& path, const std::string& fileName, Lo case Eeprom: { - naomi_default_eeprom = (u8 *)malloc(game->blobs[romid].length); - if (naomi_default_eeprom == nullptr) - throw NaomiCartException("Memory allocation failed"); - - u32 read = file->Read(naomi_default_eeprom, game->blobs[romid].length); - if (config::GGPOEnable) - md5.add(naomi_default_eeprom, game->blobs[romid].length); - DEBUG_LOG(NAOMI, "Loaded %s: %x bytes default eeprom", game->blobs[romid].filename, read); + if (game->blobs[romid].length == 0x84) + { + // on-cart X76F100 security eeprom + u8 data[0x84]; + u32 read = file->Read(data, sizeof(data)); + if (config::GGPOEnable) + md5.add(data, sizeof(data)); + setGameSerialId(data); + DEBUG_LOG(NAOMI, "Loaded %s: %x bytes rom serial eeprom", game->blobs[romid].filename, read); + } + else + { + naomi_default_eeprom = (u8 *)malloc(game->blobs[romid].length); + if (naomi_default_eeprom == nullptr) + throw NaomiCartException("Memory allocation failed"); + + u32 read = file->Read(naomi_default_eeprom, game->blobs[romid].length); + if (config::GGPOEnable) + md5.add(naomi_default_eeprom, game->blobs[romid].length); + DEBUG_LOG(NAOMI, "Loaded %s: %x bytes default eeprom", game->blobs[romid].filename, read); + } } break; @@ -571,15 +645,26 @@ void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, Lo if (CurrentCartridge->GetBootId(&bootId) && (!memcmp(bootId.boardName, "NAOMI", 5) || !memcmp(bootId.boardName, "Naomi2", 6) - || !memcmp(bootId.boardName, "SYSTEM_X_APP", 12))) // Atomiswave + || !memcmp(bootId.boardName, "SYSTEM_X_APP", 12) // Atomiswave + || !memcmp(bootId.boardName, "SystemSP", 8))) // System SP { - std::string gameId = trim_trailing_ws(std::string(bootId.gameTitle[0], &bootId.gameTitle[0][32])); + bool systemSP = memcmp(bootId.boardName, "SystemSP", 8) == 0; + std::string gameId = trim_trailing_ws(std::string(bootId.gameTitle[systemSP ? 1 : 0], &bootId.gameTitle[systemSP ? 1 : 0][32])); + std::string romName; + if (CurrentCartridge->game != nullptr) { + romName = CurrentCartridge->game->name; + settings.content.title = CurrentCartridge->game->description; + } if (gameId == "SAMPLE GAME MAX LONG NAME-") { // Use better game names - if (!strcmp(CurrentCartridge->game->name, "sgdrvsim")) + if (romName == "sgdrvsim") gameId = "SEGA DRIVING SIMULATOR"; - else if (!strcmp(CurrentCartridge->game->name, "dragntr3")) + else if (romName == "dragntr") + gameId = "DRAGON TREASURE"; + else if (romName == "dragntr2") + gameId = "DRAGON TREASURE 2"; + else if (romName == "dragntr3") gameId = "DRAGON TREASURE 3"; } if (!gameId.empty()) @@ -592,7 +677,7 @@ void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, Lo || gameId == "INITIAL D CYCRAFT") { card_reader::initdInit(); - initMidiForceFeedback(); + midiffb::init(); } else if (gameId == "MAXIMUM SPEED" || gameId == "FASTER THAN SPEED") { @@ -603,7 +688,10 @@ void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, Lo || gameId == "SEGA DRIVING SIMULATOR") { if (settings.naomi.drivingSimSlave == 0) - initMidiForceFeedback(); + midiffb::init(); + if (romName == "clubkrt" || romName == "clubkrto" + || romName == "clubkrta" || romName == "clubkrtc") + card_reader::clubkInit(); } else if (gameId == "POKASUKA GHOST (JAPANESE)" // Manic Panic Ghosts || gameId == "TOUCH DE ZUNO (JAPAN)") @@ -611,7 +699,11 @@ void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, Lo touchscreen::init(); } else if (gameId.substr(0, 8) == "MKG TKOB" - || gameId.substr(0, 9) == "MUSHIKING") + || gameId.substr(0, 9) == "MUSHIKING" + || gameId == "MUSHIUSA '04 1ST VER0.900-" + || gameId.substr(0, 13) == "DINOSAUR KING" + || gameId == "INW PUPPY 2008 VER1.001" // SystemSP isshoni + || gameId.substr(0, 14) == "LOVE AND BERRY") { card_reader::barcodeInit(); } @@ -621,11 +713,18 @@ void naomi_cart_LoadRom(const std::string& path, const std::string& fileName, Lo } if (gameId == " TOUCH DE UNOH -------------" || gameId == " TOUCH DE UNOH 2 -----------" - // only for F355 Deluxe - || (gameId == "F355 CHALLENGE JAPAN" && !strcmp(CurrentCartridge->game->name, "f355"))) + || (gameId == "F355 CHALLENGE JAPAN" && (config::MultiboardSlaves == 2 || romName == "f355")) + || gameId == "MIRAI YOSOU STUDIO") { printer::init(); } + if (romName == "clubkprz" || romName.substr(0, 7) == "clubkpz" + || romName.substr(0, 7) == "shootpl" + || gameId == "KICK '4' CASH") + { + hopper::init(); + } + Naomi_setDmaDelay(); #ifdef NAOMI_MULTIBOARD // Not a multiboard game but needs the same desktop environment @@ -681,13 +780,15 @@ void naomi_cart_Close() { touchscreen::term(); printer::term(); - card_reader::initdTerm(); + card_reader::term(); card_reader::barcodeTerm(); serialModemTerm(); + hopper::term(); delete CurrentCartridge; CurrentCartridge = nullptr; NaomiGameInputs = nullptr; bios_loaded = false; + naomi_default_eeprom = nullptr; } void naomi_cart_serialize(Serializer& ser) @@ -696,14 +797,16 @@ void naomi_cart_serialize(Serializer& ser) CurrentCartridge->Serialize(ser); touchscreen::serialize(ser); printer::serialize(ser); + hopper::serialize(ser); } void naomi_cart_deserialize(Deserializer& deser) { - if (CurrentCartridge != nullptr && (!settings.platform.isAtomiswave() || deser.version() >= Deserializer::V10_LIBRETRO)) + if (CurrentCartridge != nullptr) CurrentCartridge->Deserialize(deser); touchscreen::deserialize(deser); printer::deserialize(deser); + hopper::deserialize(deser); } int naomi_cart_GetPlatform(const char *path) @@ -716,10 +819,13 @@ int naomi_cart_GetPlatform(const char *path) return DC_PLATFORM_ATOMISWAVE; else if (game->bios != nullptr && !strcmp("naomi2", game->bios)) return DC_PLATFORM_NAOMI2; + else if (game->bios != nullptr && !strcmp("segasp", game->bios)) + return DC_PLATFORM_SYSTEMSP; else { #ifdef NAOMI_MULTIBOARD - if (game->multiboard > 0) + if (game->multiboard > 0 + && (!strncmp("f355", game->name, 4) || config::MultiboardSlaves == 2)) settings.naomi.multiboard = true; #endif return DC_PLATFORM_NAOMI; @@ -750,7 +856,7 @@ bool Cartridge::Read(u32 offset, u32 size, void* dst) static u32 ones = 0xffffffff; // Makes Outtrigger boot - INFO_LOG(NAOMI, "offset %d > %d", offset, RomSize); + INFO_LOG(NAOMI, "offset %x > %x", offset, RomSize); memcpy(dst, &ones, size); } else @@ -806,7 +912,7 @@ void* NaomiCartridge::GetDmaPtr(u32& size) { if ((DmaOffset & 0x1fffffff) >= RomSize) { - INFO_LOG(NAOMI, "Error: DmaOffset >= RomSize"); + INFO_LOG(NAOMI, "Error: DmaOffset (%x) >= RomSize (%x)", DmaOffset, RomSize); size = 0; return nullptr; } @@ -834,7 +940,7 @@ u32 NaomiCartridge::ReadMem(u32 address, u32 size) return 0xffff; case NAOMI_DIMM_STATUS: DEBUG_LOG(NAOMI, "DIMM STATUS read"); - return 0xffff; + return 0x7fff; case NAOMI_ROM_OFFSETH_addr: return RomPioOffset >> 16 | (RomPioAutoIncrement << 15); @@ -856,7 +962,7 @@ u32 NaomiCartridge::ReadMem(u32 address, u32 size) return (u16)DmaCount; case NAOMI_BOARDID_READ_addr: - return NaomiGameIDRead() ? 0x8000 : 0x0000; + return NaomiGameIDRead(); case NAOMI_DMA_OFFSETH_addr: return DmaOffset >> 16; @@ -864,7 +970,6 @@ u32 NaomiCartridge::ReadMem(u32 address, u32 size) return DmaOffset & 0xFFFF; case NAOMI_BOARDID_WRITE_addr: - DEBUG_LOG(NAOMI, "naomi ReadBoardId: %X, %d", address, size); return 1; default: @@ -944,14 +1049,12 @@ void NaomiCartridge::WriteMem(u32 address, u32 data, u32 size) NaomiGameIDWrite((u16)data); return; - //This should be valid case NAOMI_BOARDID_READ_addr: - DEBUG_LOG(NAOMI, "naomi WriteMem: %X <= %X, %d", address, data, size); return; case NAOMI_LED_addr: - DEBUG_LOG(NAOMI, "LED %d %d %d %d %d %d %d %d", (data >> 7) & 1, (data >> 6) & 1, (data >> 5) & 1, (data >> 4) & 1, - (data >> 3) & 1, (data >> 2) & 1, (data >> 1) & 1, data & 1); + //DEBUG_LOG(NAOMI, "LED %d %d %d %d %d %d %d %d", (data >> 7) & 1, (data >> 6) & 1, (data >> 5) & 1, (data >> 4) & 1, + // (data >> 3) & 1, (data >> 2) & 1, (data >> 1) & 1, data & 1); return; default: @@ -959,7 +1062,9 @@ void NaomiCartridge::WriteMem(u32 address, u32 data, u32 size) } if (multiboard != nullptr) multiboard->writeG1(address, size, data); - else + else if (address != NAOMI_MBOARD_DATA_addr + && address != NAOMI_MBOARD_OFFSET_addr + && address != NAOMI_MBOARD_STATUS_addr) DEBUG_LOG(NAOMI, "naomiCart::WriteMem<%d>: unknown %08x <= %x", size, address, data); } diff --git a/core/hw/naomi/naomi_cart.h b/core/hw/naomi/naomi_cart.h index 263f9e9ae..ea7440c2a 100644 --- a/core/hw/naomi/naomi_cart.h +++ b/core/hw/naomi/naomi_cart.h @@ -71,7 +71,7 @@ class Cartridge virtual void SetKeyData(u8 *key_data) { } virtual bool GetBootId(RomBootID *bootId) = 0; - const Game *game; + const Game *game = nullptr; protected: u8* RomPtr; @@ -86,7 +86,9 @@ class NaomiCartridge : public Cartridge u32 ReadMem(u32 address, u32 size) override; void WriteMem(u32 address, u32 data, u32 size) override; void* GetDmaPtr(u32 &size) override; - void AdvancePtr(u32 size) override {} + void AdvancePtr(u32 size) override { + DmaOffset += size; + } void Serialize(Serializer& ser) const override; void Deserialize(Deserializer& deser) override; bool GetBootId(RomBootID *bootId) override; @@ -123,7 +125,7 @@ class M2Cartridge : public NaomiCartridge bool GetBootId(RomBootID *bootId) override; private: - u8 naomi_cart_ram[64 * 1024]; + u8 naomi_cart_ram[64_KB]; }; class NaomiCartException : public FlycastException @@ -169,7 +171,7 @@ struct AxisDescriptor struct InputDescriptors { ButtonDescriptor buttons[18]; - AxisDescriptor axes[8]; + AxisDescriptor axes[16]; }; extern InputDescriptors *NaomiGameInputs; diff --git a/core/hw/naomi/naomi_flashrom.cpp b/core/hw/naomi/naomi_flashrom.cpp index 91d201fa8..35a19524f 100644 --- a/core/hw/naomi/naomi_flashrom.cpp +++ b/core/hw/naomi/naomi_flashrom.cpp @@ -136,7 +136,7 @@ void write_naomi_eeprom(u32 offset, u8 value) WARN_LOG(NAOMI, "EEPROM record doesn't exist or is too short"); } -static u8 readEeprom(u32 offset) +u8 read_naomi_eeprom(u32 offset) { return EEPROM[offset & 127]; } @@ -149,11 +149,7 @@ static bool initEeprom(const RomBootID *bootId) for (int i = 0; i < 4; i++) write_naomi_eeprom(3 + i, bootId->gameID[i]); write_naomi_eeprom(7, 9); // FIXME 9 or 0x18? - if (bootId->cabinet == 0 - && (settings.input.JammaSetup == JVS::FourPlayers - || settings.input.JammaSetup == JVS::DualIOBoards4P - || settings.input.JammaSetup == JVS::WorldKicks - || settings.input.JammaSetup == JVS::WorldKicksPCB)) + if (bootId->cabinet == 0 && settings.input.fourPlayerGames) write_naomi_eeprom(8, 0x30); else if (bootId->cabinet & 8) write_naomi_eeprom(8, 0x30); @@ -166,9 +162,11 @@ static bool initEeprom(const RomBootID *bootId) if (bootId->coinFlag[0][0] == 1) { // ROM-specific defaults - write_naomi_eeprom(2, bootId->coinFlag[0][1] | (((bootId->coinFlag[0][1] & 2) ^ 2) << 3)); + // bit 0: vertical mode + // bit 1: disable advertise audio (set by ikaruga and shangril, ignored to avoid bug reports) + write_naomi_eeprom(2, (bootId->coinFlag[0][1] & 1) | 0x10); if (bootId->coinFlag[0][2] == 1) // individual coin chute - write_naomi_eeprom(8, readEeprom(8) | 1); + write_naomi_eeprom(8, read_naomi_eeprom(8) | 1); write_naomi_eeprom(9, bootId->coinFlag[0][3] - 1); write_naomi_eeprom(10, std::max(bootId->coinFlag[0][6], (u8)1)); write_naomi_eeprom(11, std::max(bootId->coinFlag[0][4], (u8)1)); @@ -203,21 +201,21 @@ void configure_naomi_eeprom(const RomBootID *bootId) if (bootId->vertical == 2) { NOTICE_LOG(NAOMI, "EEPROM: vertical monitor orientation"); - write_naomi_eeprom(2, readEeprom(2) | 1); + write_naomi_eeprom(2, read_naomi_eeprom(2) | 1); config::Rotate90.override(true); } else if (bootId->vertical == 1) { NOTICE_LOG(NAOMI, "EEPROM: horizontal monitor orientation"); - write_naomi_eeprom(2, readEeprom(2) & ~1); + write_naomi_eeprom(2, read_naomi_eeprom(2) & ~1); } // Number of players if (bootId->cabinet != 0 && bootId->cabinet < 0x10) { - int nPlayers = readEeprom(8) >> 4; // 0 to 3 + int nPlayers = read_naomi_eeprom(8) >> 4; // 0 to 3 if (!(bootId->cabinet & (1 << nPlayers))) { - u8 coinChute = readEeprom(8) & 1; + u8 coinChute = read_naomi_eeprom(8) & 1; if (bootId->cabinet & 8) { NOTICE_LOG(NAOMI, "EEPROM: 4-player cabinet"); diff --git a/core/hw/naomi/naomi_flashrom.h b/core/hw/naomi/naomi_flashrom.h index e914a7b0a..e5e26180c 100644 --- a/core/hw/naomi/naomi_flashrom.h +++ b/core/hw/naomi/naomi_flashrom.h @@ -23,6 +23,7 @@ #include "naomi_cart.h" void write_naomi_flash(u32 addr, u8 value); +u8 read_naomi_eeprom(u32 offset); void write_naomi_eeprom(u32 offset, u8 value); void configure_naomi_eeprom(const RomBootID *bootId); void configure_maxspeed_flash(bool enableNetwork, bool master); diff --git a/core/hw/naomi/naomi_m3comm.cpp b/core/hw/naomi/naomi_m3comm.cpp index cd53bdb92..29a928fd3 100644 --- a/core/hw/naomi/naomi_m3comm.cpp +++ b/core/hw/naomi/naomi_m3comm.cpp @@ -30,7 +30,7 @@ #include "hw/sh4/sh4_mem.h" #include "network/naomi_network.h" #include "emulator.h" -#include "rend/gui.h" +#include "oslib/oslib.h" #include #include @@ -72,7 +72,7 @@ void NaomiM3Comm::closeNetwork() void NaomiM3Comm::connectNetwork() { - gui_display_notification("Network started", 5000); + os_notify("Network started", 5000); packet_number = 0; slot_count = naomiNetwork.getSlotCount(); slot_id = naomiNetwork.getSlotId(); diff --git a/core/hw/naomi/naomi_m3comm.h b/core/hw/naomi/naomi_m3comm.h index da6c6a871..45021de19 100644 --- a/core/hw/naomi/naomi_m3comm.h +++ b/core/hw/naomi/naomi_m3comm.h @@ -41,8 +41,8 @@ class NaomiM3Comm u16 comm_offset = 0; u16 comm_status0 = 0; u16 comm_status1 = 0; - u8 m68k_ram[128 * 1024]; - u8 comm_ram[128 * 1024]; + u8 m68k_ram[128_KB]; + u8 comm_ram[128_KB]; u16 packet_number = 0; int slot_count = 0; diff --git a/core/hw/naomi/naomi_roms.cpp b/core/hw/naomi/naomi_roms.cpp index 677fbd9a7..d8a0fdece 100644 --- a/core/hw/naomi/naomi_roms.cpp +++ b/core/hw/naomi/naomi_roms.cpp @@ -38,9 +38,12 @@ const BIOS_t BIOS[] = { "awbios", { + // Sammy version { 0, "bios0.ic23", 0x000000, 0x020000 }, //or - //{ "bios1.ic23", 0x000000, 0x020000 }, + //{ 0, "bios1.ic23", 0x000000, 0x020000 }, + // Sega version + //{ 0, "fpr-24363.ic48", 0x000000, 0x020000 }, } }, { @@ -88,57 +91,94 @@ const BIOS_t BIOS[] = //ROM_SYSTEM_BIOS( 1, "bios1", "epr-21576g (Japan)" ) { 0, "epr-21576g.ic27", 0x000000, 0x200000, 0xd2a1c6bf }, //ROM_SYSTEM_BIOS( 2, "bios2", "epr-21576e (Japan)" ) - //{ 0, "epr-21576e.ic27", 0x000000, 0x200000 }, + //{ 0, "epr-21576e.ic27", 0x000000, 0x200000, 0x08c0add7 }, //ROM_SYSTEM_BIOS( 3, "bios3", "epr-21576d (Japan)" ) - //{ 0, "epr-21576d.ic27", 0x000000, 0x200000 }, + //{ 0, "epr-21576d.ic27", 0x000000, 0x200000, 0x3b2afa7b }, //ROM_SYSTEM_BIOS( 4, "bios4", "epr-21576c (Japan)" ) - //{ 0, "epr-21576c.ic27", 0x000000, 0x200000 }, // BAD DUMP + //{ 0, "epr-21576c.ic27", 0x000000, 0x200000, 0x4599ad13 }, // BAD DUMP //ROM_SYSTEM_BIOS( 5, "bios5", "epr-21576b (Japan)" ) - //{ 0, "epr-21576b.ic27", 0x000000, 0x200000 }, + //{ 0, "epr-21576b.ic27", 0x000000, 0x200000, 0x755a6e07 }, //ROM_SYSTEM_BIOS( 6, "bios6", "epr-21576a (Japan)" ) - //{ 0, "epr-21576a.ic27", 0x000000, 0x200000 }, + //{ 0, "epr-21576a.ic27", 0x000000, 0x200000, 0xcedfe439 }, //ROM_SYSTEM_BIOS( 7, "bios7", "epr-21576 (Japan)" ) - //{ 0, "epr-21576.ic27", 0x000000, 0x200000 }, + //{ 0, "epr-21576.ic27", 0x000000, 0x200000, 0x9dad3495 }, //ROM_SYSTEM_BIOS( 8, "bios8", "epr-21578h (Export)" ) { 2, "epr-21578h.ic27", 0x000000, 0x200000, 0x7b452946 }, //ROM_SYSTEM_BIOS( 9, "bios9", "epr-21578g (Export)" ) { 2, "epr-21578g.ic27", 0x000000, 0x200000, 0x55413214 }, //ROM_SYSTEM_BIOS( 10, "bios10", "epr-21578f (Export)" ) - //{ 2, "epr-21578f.ic27", 0x000000, 0x200000 }, + //{ 2, "epr-21578f.ic27", 0x000000, 0x200000, 0x628a27fd }, //ROM_SYSTEM_BIOS( 11, "bios11", "epr-21578e (Export)" ) - //{ 2, "epr-21578e.ic27", 0x000000, 0x200000 }, + //{ 2, "epr-21578e.ic27", 0x000000, 0x200000, 0x087f09a3 }, //ROM_SYSTEM_BIOS( 12, "bios12", "epr-21578d (Export)" ) - //{ 2, "epr-21578d.ic27", 0x000000, 0x200000 }, + //{ 2, "epr-21578d.ic27", 0x000000, 0x200000, 0xdfd5f42a }, //ROM_SYSTEM_BIOS( 13, "bios13", "epr-21578a (Export)" ) - //{ 2, "epr-21578a.ic27", 0x000000, 0x200000 }, + //{ 2, "epr-21578a.ic27", 0x000000, 0x200000, 0x6c9aad83 }, //ROM_SYSTEM_BIOS( 14, "bios14", "epr-21577h (USA)" ) { 1, "epr-21577h.ic27", 0x000000, 0x200000, 0xfdf17452 }, //ROM_SYSTEM_BIOS( 15, "bios15", "epr-21577g (USA)" ) { 1, "epr-21577g.ic27", 0x000000, 0x200000, 0x25f64af7 }, //ROM_SYSTEM_BIOS( 16, "bios16", "epr-21577e (USA)" ) - //{ 1, "epr-21577e.ic27", 0x000000, 0x200000 }, + //{ 1, "epr-21577e.ic27", 0x000000, 0x200000, 0xcf36e97b }, //ROM_SYSTEM_BIOS( 17, "bios17", "epr-21577d (USA)" ) - //{ 1, "epr-21577d.ic27", 0x000000, 0x200000 }, + //{ 1, "epr-21577d.ic27", 0x000000, 0x200000, 0x60ddcbbe }, //ROM_SYSTEM_BIOS( 18, "bios18", "epr-21577a (USA)" ) - //{ 1, "epr-21577a.ic27", 0x000000, 0x200000 }, + //{ 1, "epr-21577a.ic27", 0x000000, 0x200000, 0x969dc491 }, //ROM_SYSTEM_BIOS( 19, "bios19", "epr-21579d (Korea)" ) { 3, "epr-21579d.ic27", 0x000000, 0x200000, 0x33513691 }, //ROM_SYSTEM_BIOS( 20, "bios20", "epr-21579 (Korea)" ) - //{ 3, "epr-21579.ic27", 0x000000, 0x200000 }, + //{ 3, "epr-21579.ic27", 0x000000, 0x200000, 0x71f9c918 }, //ROM_SYSTEM_BIOS( 21, "bios21", "Set4 Dev BIOS" ) - //{ 3, "boot_rom_64b8.ic606", 0x000000, 0x080000 }, + //{ 3, "boot_rom_64b8.ic606", 0x000000, 0x080000, 0x7a50fab9 }, //ROM_SYSTEM_BIOS( 22, "bios22", "Dev BIOS v1.10" ) - //{ 3, "develop110.ic27", 0x000000, 0x200000 }, + //{ 3, "develop110.ic27", 0x000000, 0x200000, 0xde7cfdb0 }, //ROM_SYSTEM_BIOS( 23, "bios23", "Dev BIOS (Nov 1998)" ) - //{ 3, "develop.ic27", 0x000000, 0x200000 }, + //{ 3, "develop.ic27", 0x000000, 0x200000, 0x309a196a }, //ROM_SYSTEM_BIOS( 24, "bios24", "Development ROM Board" ) - //{ 3, "zukinver0930.ic25", 0x000000, 0x200000 }, + //{ 3, "zukinver0930.ic25", 0x000000, 0x200000, 0x58e17c23 }, //ROM_SYSTEM_BIOS( 25, "bios25", "epr-21576h (multi-region hack)" ) // The default dipswitch configuration selects Korea for the multiregion hacked BIOS // See hw/maple/maple_jvs.cpp { 3, "epr-21576h_multi.ic27", 0x000000, 0x200000, 0xcce01f1f }, } }, + { + "naomidev", + { + //ROM_SYSTEM_BIOS( 21, "bios21", "Set4 Dev BIOS" ) + //{ 0, "boot_rom_64b8.ic606", 0x000000, 0x080000, 0x7a50fab9 }, + //ROM_SYSTEM_BIOS( 22, "bios22", "Dev BIOS v1.10" ) + { 0, "develop110.ic27", 0x000000, 0x200000, 0xde7cfdb0 }, + //ROM_SYSTEM_BIOS( 23, "bios23", "Dev BIOS (Nov 1998)" ) + //{ 0, "develop.ic27", 0x000000, 0x200000, 0x309a196a }, + }, + "naomi", + }, + { + "naomigd", + { + //ROM_SYSTEM_BIOS( 2, "bios2", "epr-21576h (Japan)" ) + { 0, "epr-21576h.ic27", 0x000000, 0x200000, 0xd4895685 }, + //ROM_SYSTEM_BIOS( 1, "bios1", "epr-21576g (Japan)" ) + { 0, "epr-21576g.ic27", 0x000000, 0x200000, 0xd2a1c6bf }, + //ROM_SYSTEM_BIOS( 0, "bios0", "epr-21576e (Japan)" ) + { 0, "epr-21576e.ic27", 0x000000, 0x200000, 0x08c0add7 }, + + //ROM_SYSTEM_BIOS( 3, "bios3", "epr-21578h (Export)" ) + { 2, "epr-21578h.ic27", 0x000000, 0x200000, 0x7b452946 }, + //ROM_SYSTEM_BIOS( 4, "bios4", "epr-21578g (Export)" ) + { 2, "epr-21578g.ic27", 0x000000, 0x200000, 0x55413214 }, + //ROM_SYSTEM_BIOS( 5, "bios5", "epr-21578e (Export)" ) + { 2, "epr-21578e.ic27", 0x000000, 0x200000, 0x087f09a3 }, + + //ROM_SYSTEM_BIOS( 6, "bios6", "epr-21577h (USA)" ) + { 1, "epr-21577h.ic27", 0x000000, 0x200000, 0xfdf17452 }, + //ROM_SYSTEM_BIOS( 7, "bios7", "epr-21577g (USA)" ) + { 1, "epr-21577g.ic27", 0x000000, 0x200000, 0x25f64af7 }, + //ROM_SYSTEM_BIOS( 8, "bios8", "epr-21577e (USA)" ) + { 1, "epr-21577e.ic27", 0x000000, 0x200000, 0xcf36e97b }, + }, + }, { "naomi2", { @@ -160,6 +200,33 @@ const BIOS_t BIOS[] = { 3, "epr-23605c_multi.ic27", 0x000000, 0x200000, 0x353fdbcd }, } }, + { + "segasp", + { + // BOOT VER 2.01 + { 0, "epr-24328a.ic50", 0x000000, 0x200000, 0x03ec3805 }, + { 1, "epr-24328a.ic50", 0x000000, 0x200000, 0x03ec3805 }, + { 2, "epr-24328a.ic50", 0x000000, 0x200000, 0x03ec3805 }, + // BOOT VER 2.00 + //{ 0, "epr-24328.ic50", 0x000000, 0x200000, 0x25f2ef00 }, + // BOOT VER 1.01 + //{ 0, "epr-24236a.ic50", 0x000000, 0x200000, 0xca7df0de }, + + { 1, "mb_eeprom_us.ic54s", 0x000, 0x800, 0x4186d7ab, EepromBE16 }, + { 2, "mb_eeprom_exp.ic54s", 0x000, 0x800, 0x947ddfad, EepromBE16 }, + }, + }, + { + "naomi-jp-d", // for marstv + { + //ROM_SYSTEM_BIOS( 3, "bios3", "epr-21576d (Japan)" ) + { 0, "epr-21576d.ic27", 0x000000, 0x200000, 0x3b2afa7b }, + { 1, "epr-21576d.ic27", 0x000000, 0x200000, 0x3b2afa7b }, + { 2, "epr-21576d.ic27", 0x000000, 0x200000, 0x3b2afa7b }, + { 3, "epr-21576d.ic27", 0x000000, 0x200000, 0x3b2afa7b }, + }, + "naomi", + }, { nullptr } @@ -175,7 +242,7 @@ const Game Games[] = "Giant Gram 2000", 0x0b000000, 0x7f805c3f, - NULL, + "naomi", M1, ROT0, { @@ -208,7 +275,7 @@ const Game Games[] = // Kick '4' Cash (Export) { "kick4csh", - NULL, + nullptr, "Kick '4' Cash (Export)", 0x9000000, 0x820857c9, @@ -238,25 +305,22 @@ const Game Games[] = //ROM_REGION(0x200, "some_eeprom", 0) //ROM_LOAD( "25lc040.ic13s", 0, 0x200, CRC(1576366a) SHA1(3e8bf3dbc8a248a6863242b78d5c6e53a869e951) ) - // TODO Need emulation of 837-14438 board on serial port //ROM_REGION(0x220000, "hopper_board", 0) //ROM_LOAD( "fpr-24150.ic6", 0x0000000, 0x200000, CRC(3845c34c) SHA1(027b17bac64482ee152773d5fab30fcbc6e2bcb7) ) // SH4 code //ROM_LOAD( "6372a.ic3", 0x0200000, 0x020000, CRC(f30839ad) SHA1(ea1a32c4da1ed9745300bcdd7964a7c0964e3221) ) // FPGA config - - { NULL, 0, 0 }, }, - NULL, - NULL, + nullptr, + &kick4csh_inputs, kick4csh_eeprom_dump }, // Marvel vs. Capcom 2 New Age of Heroes (Export, Korea, Rev A) { "mvsc2", - NULL, + nullptr, "Marvel vs. Capcom 2 New Age of Heroes (Export, Korea)", 0x08800000, 0xc18b6e7c, - NULL, + "naomi", M1, ROT0, { @@ -284,21 +348,19 @@ const Game Games[] = //ROM_REGION(0x200, "some_eeprom", 0) //ROM_LOAD( "25lc040.ic13s", 0x000000, 0x200, CRC(dc449637) SHA1(6cab09f61be1498271a36bff6a114a4eeeb00e1a) ) - - { NULL, 0, 0 }, }, - NULL, + nullptr, &mvsc2_inputs, mvsc2_eeprom_dump, }, // Mushiking The King Of Beetle (2K3 2ND, World) { "mushike", - NULL, + nullptr, "Mushiking The King Of Beetle (2K3 2ND Ver. 1.003-, World)", 0x4000000, 0x3892fb3a, - NULL, + "naomi", M1, ROT0, { @@ -321,9 +383,9 @@ const Game Games[] = // note: this dump from "empty/dead" Management Chip with no game run count left //ROM_REGION( 0x80, "rf_tag", 0 ) //{ "mushi_type1.bin", 0, 0x80, CRC(8f36572b) SHA1(87e00e56d07a961e9180c7da02e35f7fd216dbae) ) - - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Quiz Ah Megamisama (JPN, USA, EXP, KOR, AUS) { @@ -353,7 +415,6 @@ const Game Games[] = { "mpr-23224.ic30s", 0x7000002, 0x0800000, 0x0000000, InterleavedWord }, { "mpr-23225.ic31", 0x8000000, 0x0800000, 0x0000000, InterleavedWord }, { "mpr-23226.ic32s", 0x8000002, 0x0800000, 0x0000000, InterleavedWord }, - { NULL, 0, 0 }, } }, // Shootout Pool @@ -373,13 +434,9 @@ const Game Games[] = { "mtp-23842.ic19s", 0x2000000, 0x800000, 0x0000000, InterleavedWord }, { "mtp-23843.ic20", 0x2000002, 0x800000, 0x0000000, InterleavedWord }, { "copy", 0x400000, 0xc00000, 0x0000000, Copy, 0x1000000 }, - { NULL, 0, 0 }, - } - // btn0: TOP VIEW, btn2; START/MODE, up: ZOOM IN, down: ZOOM OUT - // mouse: TRACK BALL X/Y - // TODO CUE ROLLER (x8000) - // CUE TIP UD (x80h) - // CUE TIP LR (x80h) + }, + nullptr, + &shootout_inputs, }, // Shootout Pool The Medal / Shootout Pool Prize (Rev A) { @@ -401,9 +458,9 @@ const Game Games[] = //ROM_REGION(0x200, "some_eeprom", 0) //ROM_LOAD( "25lc040.ic13s", 0, 0x200, CRC(d11312d3) SHA1(c444012954f58a9af283ab8439f31cb89de9c14d) ) - - { NULL, 0, 0 }, - } + }, + nullptr, + &shootout_inputs, }, // Shootout Pool The Medal Ver. B / Shootout Pool Prize Ver. B { @@ -422,8 +479,9 @@ const Game Games[] = { "opr-24176.ic19s", 0x2000000, 0x800000, 0x0000000, InterleavedWord }, { "opr-24177.ic20", 0x2000002, 0x800000, 0x0000000, InterleavedWord }, { "copy", 0x400000, 0xc00000, 0x0000000, Copy, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &shootout_inputs, }, // Shootout Pool Prize (Export) / Shootout Pool The Medal (Japan) Version B (prototype) { @@ -442,8 +500,9 @@ const Game Games[] = { "rom3.ic3s", 0x1800000, 0x800000 }, { "rom4.ic4s", 0x2000000, 0x800000 }, // IC5 - IC21 populated, empty. - { NULL, 0, 0 }, - } + }, + nullptr, + &shootout_inputs, }, // Touch de Uno! 2 (Japan) @@ -469,11 +528,9 @@ const Game Games[] = //ROM_REGION(0x200, "some_eeprom", 0) //ROM_LOAD( "25lc040.ic13s", 0, 0x200, CRC(6291605c) SHA1(44f757da4814b08108d1a4f431c9a39c38acecb2) ) - - { NULL, 0, 0 }, }, nullptr, - nullptr, + &service_btns_inputs, tduno2_eeprom_dump, }, // Virtua Tennis 2 / Power Smash 2 (Rev A) @@ -507,7 +564,6 @@ const Game Games[] = { "mpr-22323.ic33", 0x9000000, 0x800000, 0x0000000, InterleavedWord }, { "mpr-22324.ic34s", 0x9000002, 0x800000, 0x0000000, InterleavedWord }, { "copy", 0x0400000, 0xc00000, 0x0000000, Copy, 0x1000000 }, // changed - { NULL, 0, 0 }, }, nullptr, &shot12_inputs @@ -532,6 +588,50 @@ const Game Games[] = { "opr-23970.ic22", 0x3000002, 0x800000, 0x0000000, InterleavedWord }, { NULL, 0, 0 }, } + }, + // Soreike! Anpanman Popcorn Koujou 2 (Rev C) + { + "anpanman2", + nullptr, + "Soreike! Anpanman Popcorn Koujou 2", + 0x03000000, + 0x2f68b225, + nullptr, + M1, + ROT0, + { + { "epr-24049b.ic11", 0x0000000, 0x0400000, 0x7c810603 }, + { "opr-24038.ic17s", 0x1000000, 0x0800000, 0x7addc59b, InterleavedWord }, + { "opr-24039.ic18", 0x1000002, 0x0800000, 0x97e16543, InterleavedWord }, + { "opr-24040.ic19s", 0x2000000, 0x0800000, 0x59a8d850, InterleavedWord }, + { "opr-24041.ic20", 0x2000002, 0x0800000, 0xd0e6dfd0, InterleavedWord }, + { "copy", 0x0400000, 0x0c00000, 0x0000000, Copy, 0x1000000 }, + + // some eeprom + //{ "at25010.ic13s", 0, 0x84, 0xbd5d61f3, Eeprom }, + }, + }, + // Soreike! Anpanman Popcorn Koujou 2 (Rev A) + { + "anpanman2a", + "anpanman2", + "Soreike! Anpanman Popcorn Koujou 2 (Rev A)", + 0x03000000, + 0x2f68b225, + nullptr, + M1, + ROT0, + { + { "epr-24049a.ic11", 0x0000000, 0x0400000, 0xef7fe4ba }, + { "opr-24038.ic17s", 0x1000000, 0x0800000, 0x7addc59b, InterleavedWord }, + { "opr-24039.ic18", 0x1000002, 0x0800000, 0x97e16543, InterleavedWord }, + { "opr-24040.ic19s", 0x2000000, 0x0800000, 0x59a8d850, InterleavedWord }, + { "opr-24041.ic20", 0x2000002, 0x0800000, 0xd0e6dfd0, InterleavedWord }, + { "copy", 0x0400000, 0x0c00000, 0x0000000, Copy, 0x1000000 }, + + // some eeprom + //{ "at25010.ic13s", 0, 0x84, 0xbd5d61f3, Eeprom }, + }, }, // Mushiking The King Of Beetle (2K3 2ND Ver. 1.002-, World) { @@ -540,7 +640,7 @@ const Game Games[] = "Mushiking The King Of Beetle (2K3 2ND Ver. 1.002-, World)", 0x04000000, 0x3892fb3a, - NULL, + "naomi", M1, ROT0, { @@ -563,9 +663,9 @@ const Game Games[] = // note: this dump from "empty/dead" Management Chip with no game run count left //ROM_REGION( 0x80, "rf_tag", 0 ) //{ "mushi_type1.bin", 0, 0x80, CRC(8f36572b) SHA1(87e00e56d07a961e9180c7da02e35f7fd216dbae) ) - - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetle (2K3 2ND Ver. 1.000-, Korea) { @@ -574,7 +674,7 @@ const Game Games[] = "Mushiking The King Of Beetle (2K3 2ND Ver. 1.000-, Korea)", 0x04000000, 0x3892fb3a, - nullptr, + "naomi", M1, ROT0, { @@ -586,7 +686,9 @@ const Game Games[] = { "opr-24270.ic21s", 0x3000000, 0x0800000, 0x02a513ad, InterleavedWord }, { "opr-24271.ic22", 0x3000002, 0x0800000, 0x7e5c745c, InterleavedWord }, { "copy", 0x0400000, 0x0c00000, 0, Copy, 0x1000000 }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetle (2K3 2ND Ver. 1.000-, China) { @@ -595,13 +697,15 @@ const Game Games[] = "Mushiking The King Of Beetle (2K3 2ND Ver. 1.000-, China)", 0x04000000, 0x5501, - nullptr, + "naomi", M4, ROT0, { { "ic8.bin", 0x00000000, 0x04000000, 0x5edc61fb }, { "317-0437-com.ic3", 0, 0x800, 0x3b6fcee8, Key }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetles - Mushiking II / III / III+ (Ver. 1.000-) (Korea) // require rev.H Korea BIOS, not dumped @@ -611,14 +715,16 @@ const Game Games[] = "Mushiking The King Of Beetles - Mushiking II / III / III+ (Ver. 1.000-) (Korea)", 0x08000000, 0x5502, - nullptr, + "naomi", M4, ROT0, { { "fpr-24355.ic8", 0x00000000, 0x04000000, 0x8bd89229 }, { "fpr-24356.ic9", 0x04000000, 0x04000000, 0xed649c81 }, { "317-0437-com.ic3", 0, 0x800, 0x3b6fcee8, Key }, - } + }, + nullptr, + &mushik_inputs, }, // Naomi M2/M3 Roms // 18 Wheeler (deluxe) (Rev A) @@ -653,7 +759,6 @@ const Game Games[] = { "mpr-22181.ic18s", 0x9000000, 0x800000 }, { "mpr-22182.ic19s", 0x9800000, 0x800000 }, { "mpr-22183.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &_18wheelr_inputs, @@ -705,8 +810,6 @@ const Game Games[] = // 18 Wheeler motor controller 838-13992, code is for a TMPZ84C015 which is Z80 compatible //ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) //ROM_LOAD( "epr-23000.ic8", 0x000000, 0x010000, CRC(e3b162f7) SHA1(52c7ad759c3c4a3148764e14d77ba5006bc8af48) ) - - { NULL, 0, 0 }, }, NULL, &_18wheelr_inputs, @@ -758,8 +861,6 @@ const Game Games[] = // 18 Wheeler motor controller 838-13992, code is for a TMPZ84C015 which is Z80 compatible //ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) //ROM_LOAD( "epr-23000.ic8", 0x000000, 0x010000, CRC(e3b162f7) SHA1(52c7ad759c3c4a3148764e14d77ba5006bc8af48) ) - - { NULL, 0, 0 }, }, NULL, &_18wheelr_inputs, @@ -808,8 +909,6 @@ const Game Games[] = // 18 Wheeler motor controller 838-13992, code is for a TMPZ84C015 which is Z80 compatible //ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) //ROM_LOAD( "epr-23000.ic8", 0x000000, 0x010000, CRC(e3b162f7) SHA1(52c7ad759c3c4a3148764e14d77ba5006bc8af48) ) - - { NULL, 0, 0 }, }, NULL, &_18wheelr_inputs, @@ -857,8 +956,6 @@ const Game Games[] = // 840-0023 2000 317-0273-COM Naomi //ROM_PARAMETER( ":rom_board:segam2crypt:key", "2807cf54" ) - - { NULL, 0, 0 }, }, NULL, &_18wheelr_inputs, // no issue with wheel range on this version @@ -889,14 +986,12 @@ const Game Games[] = { "mpr-21738.ic11", 0x5800000, 0x800000 }, // on-cart X76F100 eeprom contents - //ROM_REGION( 0x84, "naomibd_eeprom", 0 ) - //ROM_LOAD( "airlinepdx.sf", 0x000000, 0x000084, CRC(404b2add) SHA1(540c8474806775646ace111a2993397b1419fee3) ) - - { NULL, 0, 0 }, + { "airlinepdx.sf", 0x000000, 0x000084, 0x404b2add, Eeprom }, }, NULL, &alpilot_inputs, - alpilot_eeprom_dump + alpilot_eeprom_dump, + 2, }, // Airline Pilots (Japan, Rev A) { @@ -921,11 +1016,11 @@ const Game Games[] = { "mpr-21736.ic9", 0x4800000, 0x800000 }, { "mpr-21737.ic10", 0x5000000, 0x800000 }, { "mpr-21738.ic11", 0x5800000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &alpilot_inputs, - alpilot_eeprom_dump + alpilot_eeprom_dump, + 2, }, // Alien Front (Rev T) { @@ -944,7 +1039,6 @@ const Game Games[] = { "mpr-23583.ic3", 0x2800000, 0x1000000 }, { "mpr-23584.ic4", 0x3800000, 0x1000000 }, { "mpr-23585.ic5", 0x4800000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &alienfnt_inputs, @@ -967,7 +1061,6 @@ const Game Games[] = { "mpr-23583.ic3", 0x2800000, 0x1000000 }, { "mpr-23584.ic4", 0x3800000, 0x1000000 }, { "mpr-23585.ic5", 0x4800000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &alienfnt_inputs, @@ -1051,11 +1144,11 @@ const Game Games[] = // Crackin' DJ { "crackndj", - NULL, + nullptr, "Crackin' DJ", 0x0a800000, 0x281c2347, - NULL, + nullptr, M2, ROT0, { @@ -1070,17 +1163,19 @@ const Game Games[] = { "mpr-23532.ic8", 0x7800000, 0x1000000 }, { "mpr-23533.ic9", 0x8800000, 0x1000000 }, { "mpr-23534.ic10", 0x9800000, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &crackindj_inputs, + crackndj_eeprom_dump, }, // Crackin' DJ Part 2 (Japan) { "crakndj2", - NULL, + nullptr, "Crackin' DJ Part 2", 0x0a800000, 0x28428247, - NULL, + nullptr, M2, ROT0, { @@ -1108,9 +1203,10 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD("sflash.ic37", 0x000000, 0x000084, CRC(08f27149) SHA1(3b8d53dcf2c09035b318022906c444cf8504d7fa) ) - - { NULL, 0, 0 }, - } + }, + nullptr, + &crackindj_inputs, + crakndj2_eeprom_dump, }, // Crazy Taxi { @@ -1137,7 +1233,6 @@ const Game Games[] = { "mpr-21681.ic13s", 0x6800000, 0x800000 }, { "mpr-21682.ic14s", 0x7000000, 0x800000 }, { "mpr-21683.ic15s", 0x7800000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &crzytaxi_inputs, @@ -1163,9 +1258,9 @@ const Game Games[] = { "mpr-23425.ic6", 0x3000000, 0x0800000 }, { "mpr-23426.ic7", 0x3800000, 0x0800000 }, { "mpr-23427.ic8", 0x4000000, 0x0800000 }, - { NULL, 0, 0 }, - } - // SMASH, JUMP, udlr + }, + nullptr, + &csmash_inputs, }, // Cosmic Smash { @@ -1187,8 +1282,9 @@ const Game Games[] = { "mpr-23425.ic6", 0x3000000, 0x0800000 }, { "mpr-23426.ic7", 0x3800000, 0x0800000 }, { "mpr-23427.ic8", 0x4000000, 0x0800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &csmash_inputs, }, // Cannon Spike / Gun Spike { @@ -1214,7 +1310,6 @@ const Game Games[] = { "mpr-23207.ic10", 0x5000000, 0x0800000 }, { "mpr-23208.ic11", 0x5800000, 0x0800000 }, { "mpr-23209.ic12s", 0x6000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &cspike_inputs @@ -1241,10 +1336,9 @@ const Game Games[] = { "mpr-23521.ic8", 0x4000000, 0x0800000 }, { "mpr-23522.ic9", 0x4800000, 0x0800000 }, { "mpr-23523.ic10", 0x5000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, - &trigger_inputs + &lightgun_inputs }, // Death Crimson OX (USA) { @@ -1268,10 +1362,9 @@ const Game Games[] = { "mpr-23521.ic8", 0x4000000, 0x0800000, 0xcf8674b8 }, { "mpr-23522.ic9", 0x4800000, 0x0800000, 0x7ae6716e }, { "mpr-23523.ic10",0x5000000, 0x0800000, 0xc91efb67 }, - }, NULL, - &trigger_inputs + &lightgun_inputs }, // Death Crimson OX { @@ -1295,10 +1388,9 @@ const Game Games[] = { "mpr-23521.ic8", 0x4000000, 0x0800000 }, { "mpr-23522.ic9", 0x4800000, 0x0800000 }, { "mpr-23523.ic10", 0x5000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, - &trigger_inputs + &lightgun_inputs }, // Derby Owners Club 2000 (Rev A) { @@ -1329,7 +1421,11 @@ const Game Games[] = { "mpr-22237.ic15s", 0x7800000, 0x800000 }, { "mpr-22238.ic16s", 0x8000000, 0x800000 }, { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club (JPN, USA, EXP, KOR, AUS) (Rev B) { @@ -1358,7 +1454,11 @@ const Game Games[] = { "mpr-22097.ic13s", 0x6800000, 0x0800000 }, { "mpr-22098.ic14s", 0x7000000, 0x0800000 }, { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club II (JPN, USA, EXP, KOR, AUS) (Rev B) { @@ -1384,7 +1484,11 @@ const Game Games[] = { "mpr-22304.ic10", 0x9800000, 0x1000000 }, { "mpr-22305.ic11", 0xa800000, 0x1000000 }, { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club World Edition (JPN, USA, EXP, KOR, AUS) (Rev D) { @@ -1407,6 +1511,10 @@ const Game Games[] = { "mpr-22338.ic7", 0x6800000, 0x1000000, 0x4bda7303 }, { NULL, 0, 0, 0x00000000 }, }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club World Edition (Rev A) { @@ -1428,7 +1536,11 @@ const Game Games[] = { "mpr-22333.ic6", 0x5800000, 0x1000000, 0x96f324aa }, { "mpr-22334.ic7", 0x6800000, 0x1000000, 0x5389b05a }, { NULL, 0, 0, 0x00000000 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club World Edition (Rev B) { @@ -1450,7 +1562,11 @@ const Game Games[] = { "mpr-22333.ic6", 0x5800000, 0x1000000, 0x96f324aa }, { "mpr-22334.ic7", 0x6800000, 0x1000000, 0x5389b05a }, { NULL, 0, 0, 0x00000000 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, }, // Derby Owners Club World Edition (Rev C) { @@ -1472,7 +1588,36 @@ const Game Games[] = { "mpr-22333.ic6", 0x5800000, 0x1000000, 0x96f324aa }, { "mpr-22334.ic7", 0x6800000, 0x1000000, 0x5389b05a }, { NULL, 0, 0, 0x00000000 }, - } + }, + nullptr, + nullptr, + nullptr, + 1, + }, + // Derby Owners Club World Edition (Rev T) + { + "drbyocwt", + "derbyocw", + "Derby Owners Club World Edition (Rev T)", + 0x7800000, + 0xffffffff, // not populated + nullptr, + M2, + ROT0, + { + { "epr-22336t.ic22", 0x0000000, 0x0400000, 0x18dc46b7 }, + { "mpr-22328.ic1", 0x0800000, 0x1000000, 0x179cec02 }, + { "mpr-22329.ic2", 0x1800000, 0x1000000, 0xe0d5b98c }, + { "mpr-22330.ic3", 0x2800000, 0x1000000, 0x6737cd62 }, + { "mpr-22331.ic4", 0x3800000, 0x1000000, 0x8fb5cbcf }, + { "mpr-22332.ic5", 0x4800000, 0x1000000, 0xc5e365a8 }, + { "mpr-22333.ic6", 0x5800000, 0x1000000, 0x96f324aa }, + { "mpr-22334.ic7", 0x6800000, 0x1000000, 0x5389b05a }, + }, + nullptr, + nullptr, + nullptr, + 1, }, // Dead or Alive 2 (JPN, USA, EXP, KOR, AUS) { @@ -1509,10 +1654,7 @@ const Game Games[] = { "mpr-22120.ic21s", 0xa800000, 0x0800000 }, // on-cart X76F100 eeprom contents - //ROM_REGION( 0x84, "naomibd_eeprom", 0 ) - //ROM_LOAD( "841-0003.sf", 0x000000, 0x000084, CRC(3a119a17) SHA1(d37a092cca7c9cfc5f2637b355af90a65d04013e) ) - - { NULL, 0, 0 }, + { "841-0003.sf", 0x000000, 0x000084, 0x3a119a17, Eeprom }, }, nullptr, &doa2_inputs, @@ -1553,10 +1695,7 @@ const Game Games[] = { "mpr-22120.ic21s", 0xa800000, 0x0800000 }, // on-cart X76F100 eeprom contents - //ROM_REGION( 0x84, "naomibd_eeprom", 0 ) - //ROM_LOAD( "841-0003.sf", 0x000000, 0x000084, CRC(3a119a17) SHA1(d37a092cca7c9cfc5f2637b355af90a65d04013e) ) - - { NULL, 0, 0 }, + { "841-0003.sf", 0x000000, 0x000084, 0x3a119a17, Eeprom }, }, nullptr, &doa2_inputs, @@ -1597,9 +1736,7 @@ const Game Games[] = { "mpr-22120.ic21s",0xa800000, 0x0800000 }, // on-cart X76F100 eeprom contents - //ROM_REGION( 0x84, "naomibd_eeprom", 0 ) - //ROM_LOAD( "841-0003.sf", 0x000000, 0x000084, CRC(3a119a17) SHA1(d37a092cca7c9cfc5f2637b355af90a65d04013e) ) - { NULL, 0, 0 }, + { "841-0003.sf", 0x000000, 0x000084, 0x3a119a17, Eeprom }, }, nullptr, &doa2_inputs, @@ -1637,7 +1774,6 @@ const Game Games[] = { "mpr-22138.ic17s", 0x8800000, 0x0800000 }, { "mpr-22139.ic18s", 0x9000000, 0x0800000 }, { "mpr-22140.ic19s", 0x9800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &wsbb_inputs, @@ -1676,11 +1812,11 @@ const Game Games[] = { "mpr-21572.ic19s", 0x9800000, 0x0800000 }, { "mpr-21573.ic20s", 0xa000000, 0x0800000 }, { "mpr-21574.ic21s", 0xa800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &wsbb_inputs, }, +#ifdef NAOMI_MULTIBOARD // Ferrari F355 Challenge (deluxe) { "f355", @@ -1719,8 +1855,6 @@ const Game Games[] = //ROM_REGION( 0x10000, "drivebd", 0 ) // drive board ROM //ROM_LOAD( "epr-21867p.bin", 0x000000, 0x010000, CRC(6143b911) SHA1(360ebc53696da7a29e6404376c82947563274835) ) // prototype preview //ROM_LOAD( "epr-21867.bin", 0x000000, 0x010000, CRC(4f93a2a0) SHA1(875907e7fcfc44850e2c60c12268ac61c742f217) ) - - { NULL, 0, 0 }, }, nullptr, &f355_inputs, @@ -1760,7 +1894,6 @@ const Game Games[] = { "mpr-22845.ic19s", 0x9800000, 0x800000, 0x3327aed1 }, { "mpr-22846.ic20s", 0xa000000, 0x800000, 0xd4148f39 }, { "mpr-22847.ic21s", 0xa800000, 0x800000, 0x955ad42e }, - { NULL, 0, 0 }, }, nullptr, &f355_inputs, @@ -1800,7 +1933,6 @@ const Game Games[] = { "rom19.ic19s", 0x9800000, 0x800000, 0x3327aed1 }, { "rom20.ic20s", 0xa000000, 0x800000, 0xd4148f39 }, { "rom21.ic21s", 0xa800000, 0x800000, 0x955ad42e }, - { NULL, 0, 0 }, }, nullptr, &f355_inputs, @@ -1841,13 +1973,13 @@ const Game Games[] = { "mpr-23396.ic19s", 0x9800000, 0x800000 }, { "mpr-23397.ic20s", 0xa000000, 0x800000 }, { "mpr-23398.ic21s", 0xa800000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, &f355_inputs, nullptr, 3, }, +#endif // Giant Gram: All Japan Pro Wrestling 2 (JPN, USA, EXP, KOR, AUS) { "ggram2", @@ -1872,7 +2004,6 @@ const Game Games[] = { "mpr-21829.ic9", 0x4800000, 0x0800000 }, { "mpr-21830.ic10", 0x5000000, 0x0800000 }, { "mpr-21831.ic11", 0x5800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &giant_gram_inputs, @@ -1903,7 +2034,6 @@ const Game Games[] = { "mpr-23353.ic12s", 0x6000000, 0x0800000 }, { "mpr-23354.ic13s", 0x6800000, 0x0800000 }, { "mpr-23355.ic14s", 0x7000000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &ggx_inputs, @@ -1931,7 +2061,6 @@ const Game Games[] = { "mpr-23635.ic8", 0x7800000, 0x1000000 }, { "mpr-23636.ic9", 0x8800000, 0x1000000 }, { "mpr-23637.ic10", 0x9800000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &shot1234_inputs, @@ -1963,7 +2092,6 @@ const Game Games[] = { "bhf1ma13.6n", 0xd000000, 0x1000000 }, { "bhf1ma14.6m", 0xe000000, 0x1000000 }, { "bhf1ma15.6l", 0xf000000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &gunsur2_inputs, @@ -1995,7 +2123,6 @@ const Game Games[] = { "bhf1ma13.6n", 0xd000000, 0x1000000 }, { "bhf1ma14.6m", 0xe000000, 0x1000000 }, { "bhf1ma15.6l", 0xf000000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &gunsur2_inputs, @@ -2019,7 +2146,6 @@ const Game Games[] = { "mpr-22273.ic3", 0x2800000, 0x1000000 }, { "mpr-22274.ic4", 0x3800000, 0x1000000 }, { "mpr-22275.ic5", 0x4800000, 0x1000000 }, - { NULL, 0, 0 }, }, nullptr, &shot12_inputs, @@ -2047,7 +2173,6 @@ const Game Games[] = { "mpr-23713.ic9", 0x4800000, 0x0800000 }, { "mpr-23714.ic10", 0x5000000, 0x0800000 }, { "mpr-23715.ic11", 0x5800000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &hmgeo_inputs, @@ -2086,10 +2211,9 @@ const Game Games[] = { "mpr-21403.ic18s", 0x9000000, 0x800000 }, { "mpr-21404.ic19s", 0x9800000, 0x800000 }, { "mpr-21405.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, - nullptr, + &lightgun_inputs, // no free play with eeprom }, // The House of the Dead 2 @@ -2125,10 +2249,9 @@ const Game Games[] = { "mpr-21403.ic18s", 0x9000000, 0x800000 }, { "mpr-21404.ic19s", 0x9800000, 0x800000 }, { "mpr-21405.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, - nullptr, + &lightgun_inputs, // no free play with eeprom }, // The House of the Dead 2 (Export) @@ -2164,10 +2287,9 @@ const Game Games[] = { "mpr-21403.ic18s", 0x9000000, 0x800000 }, { "mpr-21404.ic19s", 0x9800000, 0x800000 }, { "mpr-21405.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, - nullptr, + &lightgun_inputs, // no free play with eeprom }, // The House of the Dead 2 (prototype) @@ -2175,7 +2297,7 @@ const Game Games[] = "hotd2p", "hotd2", "The House of the Dead 2 (prototype)", - 0xa800000, + 0xb000000, 0xfffffff, // not populated "hod2bios", M2, @@ -2203,10 +2325,10 @@ const Game Games[] = { "mpr-21403.ic18s", 0x9000000, 0x800000 }, { "mpr-21404.ic19s", 0x9800000, 0x800000 }, { "mpr-21405.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, + { "rom21.ic21s", 0xa800000, 0x800000, 0x256603d7 }, }, nullptr, - nullptr, + &lightgun_inputs, // no free play with eeprom }, // Inu No Osanpo / Dog Walking (Japan, Export, Rev A) @@ -2237,7 +2359,6 @@ const Game Games[] = { "rom14.ic14s", 0x7000000, 0x800000 }, { "rom15.ic15s", 0x7800000, 0x800000 }, { "rom16.ic16s", 0x8000000, 0x800000 }, - { NULL, 0, 0 }, } }, // Jambo! Safari (Rev A) @@ -2260,7 +2381,6 @@ const Game Games[] = { "mpr-22823.ic6", 0x3000000, 0x800000 }, { "mpr-22824.ic7", 0x3800000, 0x800000 }, { "mpr-22825.ic8", 0x4000000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &jambo_inputs @@ -2268,11 +2388,11 @@ const Game Games[] = // Mars TV (JPN) { "marstv", - NULL, + nullptr, "Mars TV", 0x08000000, 0x280b8ef5, - NULL, + "naomi-jp-d", M2, ROT0, { @@ -2293,8 +2413,9 @@ const Game Games[] = { "mpr-22990.ic13s", 0x6800000, 0x800000 }, { "mpr-22991.ic14s", 0x7000000, 0x800000 }, { "mpr-22992.ic15s", 0x7800000, 0x800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, // TODO }, // Mazan: Flash of the Blade (MAZ2 Ver. A) { @@ -2303,24 +2424,22 @@ const Game Games[] = "Mazan: Flash of the Blade (World)", 0x10000000, 0x280fea94, - NULL, + nullptr, M2, ROT0, { - { "maz2vera.2d", 0x0800000, 0x0800000 }, - { "maz1ma1.4m", 0x1000000, 0x1000000 }, - { "maz1ma2.4l", 0x2000000, 0x1000000 }, - { "maz1ma3.4k", 0x3000000, 0x1000000 }, - { "maz1ma4.4j", 0x4000000, 0x1000000 }, - { "maz1ma5.4h", 0x5000000, 0x1000000 }, - { "maz1ma6.4f", 0x6000000, 0x1000000 }, - { "maz1ma7.4e", 0x7000000, 0x1000000 }, - { "maz1ma8.4d", 0x8000000, 0x1000000 }, - { NULL, 0, 0 }, + { "maz2vera.2d", 0x0800000, 0x0800000, 0x620cdbb6 }, + { "maz1ma1.4m", 0x1000000, 0x1000000, 0x68e12189 }, + { "maz1ma2.4l", 0x2000000, 0x1000000, 0xc7a05b44 }, + { "maz1ma3.4k", 0x3000000, 0x1000000, 0x48e1a8a5 }, + { "maz1ma4.4j", 0x4000000, 0x1000000, 0x0187cdab }, + { "maz1ma5.4h", 0x5000000, 0x1000000, 0xc6885ee7 }, + { "maz1ma6.4f", 0x6000000, 0x1000000, 0xa6593c36 }, + { "maz1ma7.4e", 0x7000000, 0x1000000, 0x6103ad9c }, + { "maz1ma8.4d", 0x8000000, 0x1000000, 0xd46c9f40 }, }, nullptr, - // ENTER, START BUTTON - nullptr, + &mazan_inputs, // no free play with eeprom }, // Mazan: Flash of the Blade (US, MAZ3 Ver.A) @@ -2330,33 +2449,57 @@ const Game Games[] = "Mazan: Flash of the Blade (US)", 0x10000000, 0x280fea94, - NULL, + nullptr, M2, ROT0, { - { "maz3vera.2d", 0x0800000, 0x0800000 }, - { "maz1ma1.4m", 0x1000000, 0x1000000 }, - { "maz1ma2.4l", 0x2000000, 0x1000000 }, - { "maz1ma3.4k", 0x3000000, 0x1000000 }, - { "maz1ma4.4j", 0x4000000, 0x1000000 }, - { "maz1ma5.4h", 0x5000000, 0x1000000 }, - { "maz1ma6.4f", 0x6000000, 0x1000000 }, - { "maz1ma7.4e", 0x7000000, 0x1000000 }, - { "maz1ma8.4d", 0x8000000, 0x1000000 }, - { NULL, 0, 0 }, + { "maz3vera.2d", 0x0800000, 0x0800000, 0xa4344ec9 }, + { "maz1ma1.4m", 0x1000000, 0x1000000, 0x68e12189 }, + { "maz1ma2.4l", 0x2000000, 0x1000000, 0xc7a05b44 }, + { "maz1ma3.4k", 0x3000000, 0x1000000, 0x48e1a8a5 }, + { "maz1ma4.4j", 0x4000000, 0x1000000, 0x0187cdab }, + { "maz1ma5.4h", 0x5000000, 0x1000000, 0xc6885ee7 }, + { "maz1ma6.4f", 0x6000000, 0x1000000, 0xa6593c36 }, + { "maz1ma7.4e", 0x7000000, 0x1000000, 0x6103ad9c }, + { "maz1ma8.4d", 0x8000000, 0x1000000, 0xd46c9f40 }, }, nullptr, + &mazan_inputs, + // no free play with eeprom + }, + // Mazan: Flash of the Blade (Japan, MAZ1 Ver.A) + { + "mazanj", + "mazan", + "Mazan: Flash of the Blade (Japan)", + 0x10000000, + 0x280fea94, + nullptr, + M2, + ROT0, + { + { "maz1vera.2d", 0x0800000, 0x0800000, 0xd157f771 }, + { "maz1ma1.4m", 0x1000000, 0x1000000, 0x68e12189 }, + { "maz1ma2.4l", 0x2000000, 0x1000000, 0xc7a05b44 }, + { "maz1ma3.4k", 0x3000000, 0x1000000, 0x48e1a8a5 }, + { "maz1ma4.4j", 0x4000000, 0x1000000, 0x0187cdab }, + { "maz1ma5.4h", 0x5000000, 0x1000000, 0xc6885ee7 }, + { "maz1ma6.4f", 0x6000000, 0x1000000, 0xa6593c36 }, + { "maz1ma7.4e", 0x7000000, 0x1000000, 0x6103ad9c }, + { "maz1ma8.4d", 0x8000000, 0x1000000, 0xd46c9f40 }, + }, nullptr, + &mazan_inputs, // no free play with eeprom }, - // Mushiking The King Of Beetles - Mushiking IV / V / VI (World) + // Mushiking The King Of Beetles 2004 Second (Japan) { "mushi2k4", - NULL, + nullptr, "Mushiking The King Of Beetles 2004 Second (Japan)", 0x5800000, 0xffffffff, // not populated - NULL, + "naomi", M2, ROT0, { @@ -2366,17 +2509,18 @@ const Game Games[] = { "mpr-24244.ic3", 0x02800000, 0x01000000 }, { "mpr-24245.ic4", 0x03800000, 0x01000000 }, { "mpr-24246.ic5", 0x04800000, 0x01000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetles 2005 First (Japan) { "mushi2k5", - NULL, + nullptr, "Mushiking The King Of Beetles 2005 First (Japan)", 0x7800000, 0xffffffff, // not populated - NULL, + "naomi", M2, ROT0, { @@ -2388,8 +2532,9 @@ const Game Games[] = { "mpr-24280.ic5", 0x4800000, 0x1000000, 0x00000000 }, { "mpr-24281.ic6", 0x5800000, 0x1000000, 0x00000000 }, { "mpr-24282.ic7", 0x6800000, 0x1000000, 0x00000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetle (MUSHIUSA '04 1ST, Prototype) { @@ -2398,7 +2543,7 @@ const Game Games[] = "Mushiking The King Of Beetle (MUSHIUSA '04 1ST, Prototype)", 0x07800000, 0xffffffff, // not populated - NULL, + "naomi", M2, ROT0, { @@ -2409,8 +2554,9 @@ const Game Games[] = { "rom5.ic5s", 0x2800000, 0x800000, 0x7076a50e }, { "rom6.ic6s", 0x3000000, 0x800000, 0xd7143066 }, { "rom7.ic7s", 0x3800000, 0x800000, 0x98839bab }, - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Marvel vs. Capcom 2 New Age of Heroes (USA, Rev A) { @@ -2441,7 +2587,6 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD("sflash.ic37", 0x000000, 0x000084, CRC(37a66f3c) SHA1(df6cd2cdc2813caa5da4dc9f171998485bcbdc44)) - { NULL, 0, 0 }, }, NULL, &mvsc2_inputs, @@ -2472,7 +2617,6 @@ const Game Games[] = { "nja1ma10.4b", 0xa000000, 0x1000000 }, //ROM_REGION( 0x20000, "jyu_io", 0 ) // H8/3334-based I/O board ROM, eventually should be separated out //ROM_LOAD( "jyu1_prg0a.ic3", 0x000000, 0x020000, CRC(aec4dbc1) SHA1(bddd4f345baf7f594998a39c09da18b3834f0ac2) ) - { NULL, 0, 0 }, }, NULL, &ninjaslt_inputs, @@ -2504,7 +2648,6 @@ const Game Games[] = //ROM_REGION( 0x20000, "jyu_io", 0 ) // H8/3334-based I/O board ROM, eventually should be separated out //ROM_LOAD( "jyu1_prg0a.ic3", 0x000000, 0x020000, CRC(aec4dbc1) SHA1(bddd4f345baf7f594998a39c09da18b3834f0ac2) ) - { NULL, 0, 0 }, }, NULL, &ninjaslt_inputs, @@ -2536,8 +2679,6 @@ const Game Games[] = //ROM_REGION( 0x20000, "jyu_io", 0 ) // H8/3334-based I/O board ROM, eventually should be separated out //ROM_LOAD( "jyu1_prg0a.ic3", 0x000000, 0x020000, CRC(aec4dbc1) SHA1(bddd4f345baf7f594998a39c09da18b3834f0ac2) ) - - { NULL, 0, 0 }, }, NULL, &ninjaslt_inputs, @@ -2569,8 +2710,6 @@ const Game Games[] = //ROM_REGION( 0x20000, "jyu_io", 0 ) // H8/3334-based I/O board ROM, eventually should be separated out //ROM_LOAD( "jyu1_prg0a.ic3", 0x000000, 0x020000, CRC(aec4dbc1) SHA1(bddd4f345baf7f594998a39c09da18b3834f0ac2) ) - - { NULL, 0, 0 }, }, NULL, &ninjaslt_inputs, @@ -2593,7 +2732,6 @@ const Game Games[] = { "mpr-24056.ic3", 0x2800000, 0x1000000 }, { "mpr-24057.ic4", 0x3800000, 0x1000000 }, { "mpr-24058.ic5", 0x4800000, 0x1000000 }, - { NULL, 0, 0 }, } }, // OutTrigger (JPN, USA, EXP, KOR, AUS) @@ -2629,12 +2767,9 @@ const Game Games[] = { "mpr-22160.ic19s",0x9800000, 0x0800000 }, //ROM_REGION( 0x10000, "io_board", 0) //ROM_LOAD("epr-22084.ic3", 0x0000, 0x10000, CRC(18cf58bb) SHA1(1494f8215231929e41bbe2a133658d01882fbb0f) ) - - { NULL, 0, 0 }, }, nullptr, - // TRIGGER, CHANGE, JUMP - nullptr, + &otrigger_inputs, otrigger_eeprom_dump, }, // Moero! Justice Gakuen (JPN) / Project Justice (USA, EXP, KOR, AUS) (Rev A) @@ -2660,7 +2795,6 @@ const Game Games[] = { "mpr-23545.ic9", 0x8800000, 0x1000000 }, { "mpr-23546.ic10", 0x9800000, 0x1000000 }, { "mpr-23547.ic11", 0xa800000, 0x1000000 }, - { NULL, 0, 0 }, }, nullptr, &capcom_4btn_inputs, @@ -2686,7 +2820,6 @@ const Game Games[] = { "mpr-21594.ic6", 0x3000000, 0x0800000 }, { "mpr-21595.ic7", 0x3800000, 0x0800000 }, { "mpr-21596.ic8", 0x4000000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &pstone_inputs, @@ -2712,7 +2845,6 @@ const Game Games[] = { "mpr-23124.ic7", 0x3800000, 0x0800000 }, { "mpr-23125.ic8", 0x4000000, 0x0800000 }, { "mpr-23126.ic9", 0x4800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &pstone2_inputs, @@ -2738,7 +2870,6 @@ const Game Games[] = { "07.ic8", 0x3800000, 0x0800000 }, { "08.ic9", 0x4000000, 0x0800000 }, { "09.ic10", 0x4800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &pstone2_inputs, @@ -2775,8 +2906,9 @@ const Game Games[] = { "mpr-22203.ic18s", 0x9000000, 0x800000 }, { "mpr-22204.ic19s", 0x9800000, 0x800000 }, { "mpr-22205.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &puyoda_inputs, }, // Ring Out 4x4 (Rev A) { @@ -2800,7 +2932,6 @@ const Game Games[] = { "mpr-21768.ic8", 0x4000000, 0x800000 }, { "mpr-21769.ic9", 0x4800000, 0x800000 }, { "mpr-21770.ic10", 0x5000000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &ringout_inputs, @@ -2827,7 +2958,6 @@ const Game Games[] = { "mpr-21768.ic8", 0x4000000, 0x800000 }, { "mpr-21769.ic9", 0x4800000, 0x800000 }, { "mpr-21770.ic10", 0x5000000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &ringout_inputs, @@ -2860,8 +2990,9 @@ const Game Games[] = { "mpr-22963.ic14s",0x7000000, 0x0800000 }, { "mpr-22964.ic15s",0x7800000, 0x0800000 }, { "mpr-22965.ic16s",0x8000000, 0x0800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &samba_inputs, }, // Samba De Amigo (Rev A) { @@ -2891,8 +3022,9 @@ const Game Games[] = { "mpr-22963.ic14s", 0x7000000, 0x0800000 }, { "mpr-22964.ic15s", 0x7800000, 0x0800000 }, { "mpr-22965.ic16s", 0x8000000, 0x0800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &samba_inputs, }, // Samba De Amigo (USA, prototype) { @@ -2920,8 +3052,9 @@ const Game Games[] = { "rom12.ic12s", 0x06000000, 0x00800000 }, { "rom13.ic13s", 0x06800000, 0x00800000 }, { "rom14.ic14s", 0x07000000, 0x00800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &samba_inputs, }, //Samba de Amigo ver. 2000 (Japan) { @@ -2946,8 +3079,9 @@ const Game Games[] = { "mpr-23597.ic9", 0x08800000, 0x1000000 }, { "mpr-23598.ic10", 0x09800000, 0x1000000 }, { "mpr-23599.ic11", 0x0a800000, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &samba_inputs, }, // Sega Tetris { @@ -2968,9 +3102,9 @@ const Game Games[] = { "mpr-22913.ic4", 0x2000000, 0x800000 }, { "mpr-22914.ic5", 0x2800000, 0x800000 }, { "mpr-22915.ic6", 0x3000000, 0x800000 }, - { NULL, 0, 0 }, - } - // SW1/2 + }, + nullptr, + &sgtetris_inputs, }, // Dengen Tenshi Taisen Janshi Shangri-la (JPN, USA, EXP, KOR, AUS) { @@ -2996,7 +3130,6 @@ const Game Games[] = { "mpr-22070.ic10", 0x5000000, 0x0800000 }, { "mpr-22071.ic11", 0x5800000, 0x0800000 }, { "mpr-22072.ic12s", 0x6000000, 0x0800000 }, - { NULL, 0, 0 }, } }, // Star Horse (satellite) @@ -3021,8 +3154,6 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD( "sflash.ic46", 0x000000, 0x000084, CRC(4929e940) SHA1(f8c4277ca0ae5e36b2eed033cc731b8fc4fccafc) ) - - { NULL, 0, 0 }, } }, // Star Horse (live and backup) @@ -3059,8 +3190,6 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(1557297e) SHA1(41e8a7a8eaf5076b124d378afdf97e328d100e72) ) - - { NULL, 0, 0 }, } }, // Star Horse (main screens) @@ -3082,8 +3211,6 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD( "sflash.ic46", 0x000000, 0x000084, CRC(951684e4) SHA1(0beaf5827064252293223b946c04b8698e7207bb) ) - - { NULL, 0, 0 }, } }, // Star Horse Progress (satellite, Rev A) @@ -3105,7 +3232,6 @@ const Game Games[] = { "mpr-24127.ic5", 0x4800000, 0x1000000 }, { "mpr-24128.ic6", 0x5800000, 0x1000000 }, { "mpr-24129.ic7", 0x6800000, 0x1000000 }, - { NULL, 0, 0 }, } }, // Star Horse Progress (backup data) @@ -3124,8 +3250,6 @@ const Game Games[] = //ROM_REGION(0x84, "some_eeprom", 0) //ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(fe8f8f5c) SHA1(839461ab736e0228dec7e2512e1692d6ecc4e664) ) - - { NULL, 0, 0 }, } }, // Star Horse Progress (live, Rev A) @@ -3151,7 +3275,6 @@ const Game Games[] = { "mpr-24116.ic9", 0x08800000, 0x01000000 }, { "mpr-24117.ic10", 0x09800000, 0x01000000 }, { "mpr-24118.ic11", 0x0a800000, 0x01000000 }, - { NULL, 0, 0 }, } }, // Star Horse Progress (main screens) @@ -3172,7 +3295,6 @@ const Game Games[] = { "mpr-24091.ic4", 0x03800000, 0x01000000 }, { "mpr-24092.ic5", 0x04800000, 0x01000000 }, { "mpr-24093.ic6", 0x05800000, 0x01000000 }, - { NULL, 0, 0 }, } }, // Star Horse Progress (sound & backup) @@ -3193,7 +3315,6 @@ const Game Games[] = { "mpr-24101.ic4", 0x03800000, 0x01000000 }, { "mpr-24102.ic5", 0x04800000, 0x01000000 }, { "mpr-24103.ic6", 0x05800000, 0x01000000 }, - { NULL, 0, 0 }, } }, // Star Horse 2001 (satellite, Rev B) @@ -3215,9 +3336,91 @@ const Game Games[] = { "mpr-23744.ic5", 0x04800000, 0x01000000 }, { "mpr-23745.ic6", 0x05800000, 0x01000000 }, { "mpr-23746.ic7", 0x06800000, 0x01000000 }, - { NULL, 0, 0 }, } }, + // Star Horse 2002 (main screens) + { + "shors2k2m", + nullptr, + "Star Horse 2002 (main screens)", + 0x6800000, + 0xffffffff, // not populated + nullptr, + M2, + ROT0, + { + { "epr-23851.ic22", 0x00000000, 0x00400000, 0x23dbad62 }, + { "mpr-23852.ic1", 0x00800000, 0x01000000, 0xb289b968 }, + { "mpr-23853.ic2", 0x01800000, 0x01000000, 0xef43b551 }, + { "mpr-23854.ic3", 0x02800000, 0x01000000, 0x1bb65979 }, + { "mpr-23855.ic4", 0x03800000, 0x01000000, 0x04b725d8 }, + { "mpr-23856.ic5", 0x04800000, 0x01000000, 0x8ef1691e }, + { "mpr-23857.ic6", 0x05800000, 0x01000000, 0xb2900844 }, + }, + }, + // Star Horse 2002 (sound and backup, Rev A) + { + "shors2k2s", + nullptr, + "Star Horse 2002 (sound and backup)", + 0x5800000, + 0xffffffff, // not populated + nullptr, + M2, + ROT0, + { + { "epr-23866a.ic22", 0x00000000, 0x00400000, 0xabf21b86 }, + { "mpr-23888.ic1", 0x00800000, 0x01000000, 0xc55b45be }, + { "mpr-23889.ic2", 0x01800000, 0x01000000, 0xe3f0f02e }, + { "mpr-23890.ic3", 0x02800000, 0x01000000, 0x187eca4e }, + { "mpr-23891.ic4", 0x03800000, 0x01000000, 0x24783524 }, + { "mpr-23892.ic5", 0x04800000, 0x01000000, 0xc8785077 }, + }, + }, + // Star Horse 2002 (live) + { + "shors2k2l", + nullptr, + "Star Horse 2002 (live)", + 0x9800000, + 0xffffffff, // not populated + nullptr, + M2, + ROT0, + { + { "epr-23867.ic22", 0x00000000, 0x00400000, 0x25fbbf6e }, + { "mpr-23894.ic1", 0x00800000, 0x01000000, 0xfb87d357 }, + { "mpr-23895.ic2", 0x01800000, 0x01000000, 0x519743f5 }, + { "mpr-23896.ic3", 0x02800000, 0x01000000, 0xb0c597f5 }, + { "mpr-23897.ic4", 0x03800000, 0x01000000, 0x8e7a4d58 }, + { "mpr-23898.ic5", 0x04800000, 0x01000000, 0xc9bb098b }, + { "mpr-23899.ic6", 0x05800000, 0x01000000, 0x99a3f8c4 }, + { "mpr-23900.ic7", 0x06800000, 0x01000000, 0xe4b3a767 }, + { "mpr-23901.ic8", 0x07800000, 0x01000000, 0xd05001ce }, + { "mpr-23902.ic9", 0x08800000, 0x01000000, 0x48eb5457 }, + }, + }, + // Star Horse 2002 (sound, Export/Taiwan) + { + "shors2k2", + nullptr, + "Star Horse 2002 (sound, Export/Taiwan)", + 0x4000000, + 0x403431d2, + nullptr, + M1, + ROT0, + { + { "epr-23964.ic11", 0x0000000, 0x0400000, 0x26c53dac }, + { "opr-23965.ic17s", 0x1000000, 0x0800000, 0x28fceb93, InterleavedWord }, + { "opr-23966.ic18", 0x1000002, 0x0800000, 0xd3bb88b4, InterleavedWord }, + { "opr-23967.ic19s", 0x2000000, 0x0800000, 0x7dae177e, InterleavedWord }, + { "opr-23968.ic20", 0x2000002, 0x0800000, 0x20b3b237, InterleavedWord }, + { "opr-23969.ic21s", 0x3000000, 0x0800000, 0x1d8644b6, InterleavedWord }, + { "opr-23970.ic22", 0x3000002, 0x0800000, 0xdd0201a8, InterleavedWord }, + { "copy", 0x0400000, 0x0c00000, 0x00000000, Copy, 0x1000000 }, + }, + }, // Super Major League '99 { "smlg99", @@ -3252,7 +3455,6 @@ const Game Games[] = { "mpr-22056.ic19s", 0x9800000, 0x800000 }, { "mpr-22057.ic20s", 0xa000000, 0x800000 }, { "mpr-22058.ic21s", 0xa800000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &wsbb_inputs, @@ -3286,7 +3488,6 @@ const Game Games[] = { "mpr-23338.ic15s",0x7800000, 0x0800000 }, { "mpr-23339.ic16s",0x8000000, 0x0800000 }, { "mpr-23340.ic17s",0x8800000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &slashout_inputs, @@ -3316,7 +3517,6 @@ const Game Games[] = { "mpr-22217.ic10", 0x5000000, 0x0800000 }, { "mpr-22218.ic11", 0x5800000, 0x0800000 }, { "mpr-22219.ic12s", 0x6000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &marine_fishing_inputs, @@ -3343,7 +3543,6 @@ const Game Games[] = { "mpr-22974.ic8", 0x4000000, 0x0800000 }, { "mpr-22975.ic9", 0x4800000, 0x0800000 }, { "mpr-22976.ic10", 0x5000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &shot1234_inputs, @@ -3381,10 +3580,11 @@ const Game Games[] = { "mpr-23319.ic18s", 0x9000000, 0x800000 }, { "mpr-23320.ic19s", 0x9800000, 0x800000 }, { "mpr-23321.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, &sstrkfgt_inputs, + nullptr, + 2, }, // Sega Strike Fighter (Rev A, no training mode) { @@ -3418,10 +3618,11 @@ const Game Games[] = { "mpr-23319.ic18s", 0x9000000, 0x800000 }, { "mpr-23320.ic19s", 0x9800000, 0x800000 }, { "mpr-23321.ic20s", 0xa000000, 0x800000 }, - { NULL, 0, 0 }, }, nullptr, &sstrkfgt_inputs, + nullptr, + 2, }, // Idol Janshi Suchie-Pai 3 (JPN) { @@ -3450,7 +3651,6 @@ const Game Games[] = { "mpr-21991.ic12s",0x6000000, 0x0800000 }, { "mpr-21992.ic13s",0x6800000, 0x0800000 }, { "mpr-21993.ic14s",0x7000000, 0x0400000 }, - { NULL, 0, 0 }, } }, // Touch de Uno! / Unou Nouryoku Check Machine (Japan) @@ -3475,13 +3675,10 @@ const Game Games[] = { "mpr-22077.ic4", 0x2000000, 0x400000 }, // on-cart X76F100 eeprom contents - //ROM_REGION( 0x84, "naomibd_eeprom", 0 ) - //ROM_LOAD( "x76f100.ic37", 0x000000, 0x000084, CRC(c79251d5) SHA1(3e70bbbb6d28bade7eec7e27d716463045656f98) ) - - { NULL, 0, 0 }, + { "x76f100.ic37", 0x000000, 0x000084, 0xc79251d5, Eeprom }, }, nullptr, - nullptr, + &service_btns_inputs, tduno_eeprom_dump, }, // Tokyo Bus (Rev A) @@ -3514,7 +3711,6 @@ const Game Games[] = { "rom16.ic16s", 0x8000000, 0x0800000 }, { "rom17.ic17s", 0x8800000, 0x0800000 }, { "rom18.ic18s", 0x9000000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &tokyobus_inputs, @@ -3553,7 +3749,6 @@ const Game Games[] = { "mpr-23019.ic19s", 0x9800000, 0x0800000 }, { "mpr-23020.ic20s", 0xa000000, 0x0800000 }, // IC21s not populated - { NULL, 0, 0 }, }, nullptr, nullptr, @@ -3592,7 +3787,6 @@ const Game Games[] = { "mpr-23019.ic19s", 0x9800000, 0x0800000 }, { "mpr-23020.ic20s", 0xa000000, 0x0800000 }, // IC21S not populated - { NULL, 0, 0 }, }, nullptr, nullptr, @@ -3626,7 +3820,6 @@ const Game Games[] = { "trf1ma13.6n", 0xd000000, 0x1000000 }, { "trf1ma14.6m", 0xe000000, 0x1000000 }, { "trf1ma15.6l", 0xf000000, 0x1000000 }, - { NULL, 0, 0 }, }, nullptr, &toukon4_inputs, @@ -3653,7 +3846,6 @@ const Game Games[] = { "mpr-22032.ic8", 0x4000000, 0x0800000 }, { "mpr-22033.ic9", 0x4800000, 0x0800000 }, { "mpr-22034.ic10",0x5000000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &toyfight_inputs, @@ -3692,9 +3884,9 @@ const Game Games[] = { "mpr-22946.ic19s", 0x9800000, 0x0800000 }, { "mpr-22947.ic20s", 0xa000000, 0x0800000 }, { "mpr-22948.ic21s", 0xa800000, 0x0800000 }, - { NULL, 0, 0 }, - } - // PASS, SHOOT + }, + nullptr, + &virnba_inputs, }, // Virtua NBA { @@ -3729,8 +3921,9 @@ const Game Games[] = { "mpr-22946.ic19s", 0x9800000, 0x0800000 }, { "mpr-22947.ic20s", 0xa000000, 0x0800000 }, { "mpr-22948.ic21s", 0xa800000, 0x0800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &virnba_inputs, }, // Virtua NBA (prototype) { @@ -3739,34 +3932,35 @@ const Game Games[] = "Virtua NBA (prototype)", 0x0b000000, 0x28068b58, - NULL, + nullptr, M2, ROT0, { - { "vnbaearly.ic22", 0x0000000, 0x0400000 }, - { "mpr-22928.ic1", 0x0800000, 0x0800000 }, - { "mpr-22929.ic2", 0x1000000, 0x0800000 }, - { "mpr-22930.ic3", 0x1800000, 0x0800000 }, - { "mpr-22931.ic4", 0x2000000, 0x0800000 }, - { "mpr-22932.ic5", 0x2800000, 0x0800000 }, - { "mpr-22933.ic6", 0x3000000, 0x0800000 }, - { "mpr-22934.ic7", 0x3800000, 0x0800000 }, - { "mpr-22935.ic8", 0x4000000, 0x0800000 }, - { "mpr-22936.ic9", 0x4800000, 0x0800000 }, - { "mpr-22937.ic10", 0x5000000, 0x0800000 }, - { "mpr-22938.ic11", 0x5800000, 0x0800000 }, - { "mpr-22939.ic12s", 0x6000000, 0x0800000 }, - { "mpr-22940.ic13s", 0x6800000, 0x0800000 }, - { "mpr-22941.ic14s", 0x7000000, 0x0800000 }, - { "mpr-22942.ic15s", 0x7800000, 0x0800000 }, - { "mpr-22943.ic16s", 0x8000000, 0x0800000 }, - { "mpr-22944.ic17s", 0x8800000, 0x0800000 }, - { "mpr-22945.ic18s", 0x9000000, 0x0800000 }, - { "mpr-22946.ic19s", 0x9800000, 0x0800000 }, - { "mpr-22947.ic20s", 0xa000000, 0x0800000 }, - { "mpr-22948.ic21s", 0xa800000, 0x0800000 }, - { NULL, 0, 0 }, - } + { "vnbaearly.ic22", 0x0000000, 0x0400000, 0x5bbf7a45 }, + { "rom1.ic1s", 0x0800000, 0x0800000, 0x0ea48727 }, + { "rom2.ic2s", 0x1000000, 0x0800000, 0x2941a358 }, + { "rom3.ic3s", 0x1800000, 0x0800000, 0x0fa29eef }, + { "rom4.ic4s", 0x2000000, 0x0800000, 0x5cbcd7a5 }, + { "rom5.ic5s", 0x2800000, 0x0800000, 0xf026bf67 }, + { "rom6.ic6s", 0x3000000, 0x0800000, 0x91c452ab }, + { "rom7.ic7s", 0x3800000, 0x0800000, 0x11e4c24b }, + { "rom8.ic8s", 0x4000000, 0x0800000, 0x72629663 }, + { "rom9.ic9s", 0x4800000, 0x0800000, 0x54b660e6 }, + { "rom10.ic10s", 0x5000000, 0x0800000, 0x8fc00425 }, + { "rom11.ic11s", 0x5800000, 0x0800000, 0xd55234c4 }, + { "rom12.ic12s", 0x6000000, 0x0800000, 0x4b42b46d }, + { "rom13.ic13s", 0x6800000, 0x0800000, 0x6edbb058 }, + { "rom14.ic14s", 0x7000000, 0x0800000, 0xaa3885d5 }, + { "rom15.ic15s", 0x7800000, 0x0800000, 0xe4d59ed3 }, + { "rom16.ic16s", 0x8000000, 0x0800000, 0x9f7a587b }, + { "rom17.ic17s", 0x8800000, 0x0800000, 0x18b7df45 }, + { "rom18.ic18s", 0x9000000, 0x0800000, 0x27eae4d8 }, + { "rom19.ic19s", 0x9800000, 0x0800000, 0x7bb7ff29 }, + { "rom20.ic20s", 0xa000000, 0x0800000, 0x9a08015e }, + { "rom21.ic21s", 0xa800000, 0x0800000, 0x194594f2 }, + }, + nullptr, + &virnba_inputs, }, // Virtua NBA (prototype, 15.11) { @@ -3801,8 +3995,9 @@ const Game Games[] = { "rom19.ic19s", 0x9800000, 0x0800000 }, { "rom20.ic20s", 0xa000000, 0x0800000 }, { "rom21.ic21s", 0xa800000, 0x0800000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &virnba_inputs, }, // Virtual On Oratorio Tangram M.S.B.S. ver5.66 2000 Edition { @@ -3829,7 +4024,6 @@ const Game Games[] = { "mpr-23192.ic11", 0x5800000, 0x800000 }, { "mpr-23193.ic12s", 0x6000000, 0x800000 }, { "mpr-23194.ic13s", 0x6800000, 0x800000 }, - { NULL, 0, 0 }, }, NULL, &vonot_inputs, @@ -3862,9 +4056,9 @@ const Game Games[] = { "mpr-21921.ic13s",0x6800000, 0x0800000 }, { "mpr-21922.ic14s",0x7000000, 0x0800000 }, { "mpr-21923.ic15s",0x7800000, 0x0400000 }, - { NULL, 0, 0 }, - } - // LONG PASS, SHOOT, SHORT PASS + }, + nullptr, + &vs2_2k_inputs, }, // Virtua Striker 2 Ver. 2000 { @@ -3893,8 +4087,9 @@ const Game Games[] = { "mpr-21921.ic13s", 0x6800000, 0x0800000 }, { "mpr-21922.ic14s", 0x7000000, 0x0800000 }, { "mpr-21923.ic15s", 0x7800000, 0x0400000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &vs2_2k_inputs, }, // Virtua Tennis (USA, EXP, KOR, AUS) / Power Smash (JPN) { @@ -3919,7 +4114,6 @@ const Game Games[] = { "mpr-22924.ic9", 0x4800000, 0x0800000 }, { "mpr-22925.ic10",0x5000000, 0x0800000 }, { "mpr-22926.ic11",0x5800000, 0x0800000 }, - { NULL, 0, 0 }, }, nullptr, &shot12_inputs, @@ -3943,7 +4137,6 @@ const Game Games[] = { "mpr-23722.ic4", 0x3800000, 0x1000000 }, { "mpr-23723.ic5", 0x4800000, 0x1000000 }, { "mpr-23724.ic6", 0x5800000, 0x1000000 }, - { NULL, 0, 0 }, }, NULL, &wrungp_inputs, @@ -3972,8 +4165,6 @@ const Game Games[] = // 838-12801 DRIVE BD WAVERUNNER //ROM_REGION( 0x10000, "motorio", ROMREGION_ERASEFF) //ROM_LOAD( "epr-19250.ic8", 0x000000, 0x010000, CRC(542d3836) SHA1(128cb0bfaf05791d219437653002f6bb948a4ad5) ) - - { NULL, 0, 0 }, }, NULL, &wrungp_inputs, @@ -4001,9 +4192,9 @@ const Game Games[] = { "wk1ma8.4e", 0x8000000, 0x1000000 }, { "wk1ma9.4d", 0x9000000, 0x1000000 }, { "wk1ma10.4c", 0xa000000, 0x1000000 }, - { NULL, 0, 0 }, - } - // BUTTON, (n/a, n/a, ENTER) + }, + nullptr, + &wldkicks_inputs, // TODO some default eeprom/nvram would help }, // World Kicks (Japan, WK1 Ver.A) { @@ -4027,8 +4218,9 @@ const Game Games[] = { "wk1ma8.4e", 0x8000000, 0x1000000 }, { "wk1ma9.4d", 0x9000000, 0x1000000 }, { "wk1ma10.4c", 0xa000000, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &wldkicks_inputs, }, // World Kicks (US, WK3 Ver.A) { @@ -4052,8 +4244,9 @@ const Game Games[] = { "wk1ma8.4e", 0x8000000, 0x1000000 }, { "wk1ma9.4d", 0x9000000, 0x1000000 }, { "wk1ma10.4c", 0xa000000, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &wldkicks_inputs, }, // World Kicks PCB (Japan, WKC1 Ver.A) { @@ -4077,8 +4270,9 @@ const Game Games[] = { "wk1ma8.4e", 0x8000000, 0x1000000 }, { "wk1ma9.4d", 0x9000000, 0x1000000 }, { "wk1ma10.4c", 0xa000000, 0x1000000 }, - { NULL, 0, 0 }, - } + }, + nullptr, + &wldkickspcb_inputs, // TODO some default eeprom/nvram would help }, // World Kicks PCB (World, WKC2 Ver.A) { @@ -4102,9 +4296,9 @@ const Game Games[] = { "wk1ma8.4e", 0x8000000, 0x1000000 }, { "wk1ma9.4d", 0x9000000, 0x1000000 }, { "wk1ma10.4c", 0xa000000, 0x1000000 }, - { NULL, 0, 0 }, - } - // C BUTTON + }, + nullptr, + &wldkickspcb_inputs, }, // WWF Royal Rumble (JPN, USA, EXP, KOR, AUS) { @@ -4126,9 +4320,9 @@ const Game Games[] = { "mpr-22267.ic6", 0x5800000, 0x1000000 }, { "mpr-22268.ic7", 0x6800000, 0x1000000 }, { "mpr-22269.ic8", 0x7800000, 0x1000000 }, - { NULL, 0, 0 }, - } - // ATTACK, GRAPPLE, SUPPORT + }, + nullptr, + &wwfroyal_inputs, }, // Zero Gunner 2 { @@ -4147,7 +4341,6 @@ const Game Games[] = { "mpr-23686.ic3", 0x2800000, 0x1000000 }, { "mpr-23687.ic4", 0x3800000, 0x1000000 }, { "mpr-23688.ic5", 0x4800000, 0x1000000 }, - { NULL, 0, 0 }, }, nullptr, &shot12_inputs, @@ -4184,7 +4377,6 @@ const Game Games[] = { "mpr-21724.ic17s", 0x8800000, 0x0800000 }, { "mpr-21725.ic18s", 0x9000000, 0x0800000 }, { "mpr-21726.ic19s", 0x9800000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &zombie_inputs, @@ -4222,13 +4414,87 @@ const Game Games[] = { "mpr-21724.ic17s",0x8800000, 0x0800000 }, { "mpr-21725.ic18s",0x9000000, 0x0800000 }, { "mpr-21726.ic19s",0x9800000, 0x0800000 }, - { NULL, 0, 0 }, }, NULL, &zombie_inputs, zombrvn_eeprom_dump, }, - // Naomi M4 Roms + { + "hopper", + nullptr, + "SWP Hopper Board", + 0x0b000000, + 0x1e5bb0cd, + NULL, + M2, + ROT0, + { + { "epr-24083.ic11", 0x000000, 0x400000, 0x2733e65a }, + }, + }, + // Virtua Golf / Dynamic Golf (prototype) + { + "dygolfp", + "dygolf", + "Virtua Golf / Dynamic Golf (prototype)", + 0xb000000, + 0xffffffff, // not populated + "naomi", + M2, + ROT0, + { + { "rom0.ic22", 0x00000000, 0x00400000, 0x2f391fdf }, + { "rom1.ic1s", 0x00800000, 0x00800000, 0x2c683edd }, + { "rom2.ic2s", 0x01000000, 0x00800000, 0x1795e6f4 }, + { "rom3.ic3s", 0x01800000, 0x00800000, 0x9b45cc32 }, + { "rom4.ic4s", 0x02000000, 0x00800000, 0x2c5a570a }, + { "rom5.ic5s", 0x02800000, 0x00800000, 0x48cc544e }, + { "rom6.ic6s", 0x03000000, 0x00800000, 0xe12db83b }, + { "rom7.ic7s", 0x03800000, 0x00800000, 0x36c313a6 }, + { "rom8.ic8s", 0x04000000, 0x00800000, 0x9868d078 }, + { "rom9.ic9s", 0x04800000, 0x00800000, 0x032cca1a }, + { "rom10.ic10s", 0x05000000, 0x00800000, 0x6d094477 }, + { "rom11.ic11s", 0x05800000, 0x00800000, 0x6c803ca0 }, + }, + nullptr, + &dygolf_inputs, + }, + // Nittere Shiki! Mirai Yosou Studio / NTV Future Forecast Studio (Japan) + { + "ntvmys", + nullptr, + "Nittere Shiki! Mirai Yosou Studio / NTV Future Forecast Studio", + 0x9800000, + 0x281a6263, + "naomi", + M2, + ROT0, + { + { "epr-23419a.ic22", 0x00000000, 0x00400000, 0x8639d1e5 }, + { "rom1.ic1s", 0x00800000, 0x00800000, 0x5f11a3ec }, + { "rom2.ic2s", 0x01000000, 0x00800000, 0x0d46bfe5 }, + { "rom3.ic3s", 0x01800000, 0x00800000, 0xac5c846e }, + { "rom4.ic4s", 0x02000000, 0x00800000, 0x6cb2153f }, + { "rom5.ic5s", 0x02800000, 0x00800000, 0xfd70ef17 }, + { "rom6.ic6s", 0x03000000, 0x00800000, 0xe52afefa }, + { "rom7.ic7s", 0x03800000, 0x00800000, 0x976b929d }, + { "rom8.ic8s", 0x04000000, 0x00800000, 0x7914b241 }, + { "rom9.ic9s", 0x04800000, 0x00800000, 0x2c50b20c }, + { "rom10.ic10s", 0x05000000, 0x00800000, 0xa4b8fbc8 }, + { "rom11.ic11s", 0x05800000, 0x00800000, 0x8a7dbf32 }, + // ic 12s populated, empty (ff) + { "rom11.ic11s", 0x06800000, 0x00800000, 0x523a20f9 }, + { "rom11.ic11s", 0x07000000, 0x00800000, 0x5ddf6931 }, + { "rom11.ic11s", 0x07800000, 0x00800000, 0x1ef1cbed }, + { "rom11.ic11s", 0x08000000, 0x00800000, 0x82fa259a }, + { "rom11.ic11s", 0x08800000, 0x00800000, 0x6c1207d4 }, + { "rom11.ic11s", 0x09000000, 0x00800000, 0xeb8201b0 }, + // ROM_REGION( 0x84, "some_eeprom", 0 ) + // ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(44c05f0c) SHA1(daf3687282d2665837025261aadc4ac477bb43a1) ) + }, + }, + + // Naomi M4 Roms // Akatsuki Blitzkampf Ausf. Achse (Japan) { "ausfache", @@ -4244,9 +4510,7 @@ const Game Games[] = { "ic9.bin", 0x4000000, 0x4000000 }, // IC10 and IC11 Populated, Empty { "317-05130-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, }, - // ATTACK1/2/3 nullptr, &ausfache_inputs, ausfache_eeprom_dump, @@ -4262,14 +4526,14 @@ const Game Games[] = M4, ROT0, { - { "fpr-24382.ic8", 0x0000000, 0x4000000 }, - { "fpr-24383.ic9", 0x4000000, 0x4000000 }, - { "fpr-24384.ic10", 0x8000000, 0x4000000 }, - { "fpr-24385.ic11", 0xc000000, 0x4000000 }, - { "317-0495-com.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, - } - // PUNCH, KICK, JUMP + { "fpr-24382.ic8", 0x0000000, 0x4000000, 0x4daefde5 }, + { "fpr-24383.ic9", 0x4000000, 0x4000000, 0x8ac2fe5d }, + { "fpr-24384.ic10", 0x8000000, 0x4000000, 0x2e9116c4 }, + { "fpr-24385.ic11", 0xc000000, 0x4000000, 0x2b79f45d }, + { "317-0495-com.ic3", 0, 0x800, 0xc229a59b, Key }, + }, + nullptr, + &asndynmt_inputs, }, // Asian Dynamite / Dynamite Deka EX (older) { @@ -4282,15 +4546,14 @@ const Game Games[] = M4, ROT0, { - { "fpr-24382.ic8", 0x0000000, 0x4000000 }, - { "fpr-24383.ic9", 0x4000000, 0x4000000 }, - { "fpr-24384.ic10", 0x8000000, 0x4000000 }, - { "fpr-24385.ic11", 0xc000000, 0x4000000 }, - { "317-0495-com.ic3", 0, 0x800, 0x0000000, Key }, - - { NULL, 0, 0 }, - } - // PUNCH, KICK, JUMP + { "fpr-24382.ic8", 0x0000000, 0x4000000, 0x5b4763fc }, + { "fpr-24383.ic9", 0x4000000, 0x4000000, 0x8ac2fe5d }, + { "fpr-24384.ic10", 0x8000000, 0x4000000, 0x2e9116c4 }, + { "fpr-24385.ic11", 0xc000000, 0x4000000, 0x2b79f45d }, + { "317-0495-com.ic3", 0, 0x800, 0xc229a59b, Key }, + }, + nullptr, + &asndynmt_inputs, }, // Illvelo (Illmatic Envelope) (Japan) { @@ -4307,10 +4570,9 @@ const Game Games[] = { "fpr-24438.ic9", 0x4000000, 0x4000000 }, { "fpr-24439.ic10", 0x8000000, 0x4000000 }, { "317-5131-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, }, - NULL, - NULL, // SHOT/DOLL/SPECIAL + nullptr, + &illvelo_inputs, illvelo_eeprom_dump }, // Manic Panic Ghosts! *** BAD DUMP *** @@ -4330,15 +4592,13 @@ const Game Games[] = { "fpr-24374.ic11", 0x0c000000, 0x4000000 }, { "fpr-24375.ic12", 0x10000000, 0x4000000 }, - //ROM_REGION( 0x200000, "ioboard", 0) // touch screen I/O board, program disassembles as little-endian SH-4 - //ROM_LOAD( "fpr24351.ic14", 0x000000, 0x200000, CRC(4d1b7b89) SHA1(965b8c6b5a2e7b3f1b1e2eac19c86000c3b66754) ) - //ROM_REGION( 0x800, "pic_readout", 0 ) //ROM_LOAD( "317-0461-com.ic3", 0, 0x800, BAD_DUMP CRC(c9282cdd) SHA1(23933e489d763515428e2714cc6e7676df1d5323) ) { "317-0461-com.ic3", 0, 0x800, 0x0000000, Key }, - - { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, + manicpnc_eeprom_dump, }, // Mamoru-kun wa Norowarete Shimatta! (Japan) { @@ -4355,10 +4615,9 @@ const Game Games[] = { "ic9.bin", 0x4000000, 0x4000000 }, { "ic10.bin", 0x8000000, 0x4000000 }, { "317-5132-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, }, NULL, - &mamonoro_inputs, // SHOT(A)/(B) + &mamonoro_inputs, mamonoro_eeprom_dump }, // Melty Blood Actress Again Version A (Japan, Rev A) @@ -4380,7 +4639,6 @@ const Game Games[] = { "ic12.bin", 0x10000000, 0x4000000 }, { "ic13.bin", 0x14000000, 0x4000000 }, { "317-5133-jpn.ic3", 0, 0x800, 0x0000000, Key }, // pic_readout - { NULL, 0, 0 }, }, nullptr, &meltyb_inputs, @@ -4404,7 +4662,6 @@ const Game Games[] = { "ic12.bin", 0x10000000, 0x4000000 }, { "ic13.bin", 0x14000000, 0x4000000 }, { "317-5133-jpn.ic3", 0, 0x800, 0x0000000, Key }, // pic_readout - { NULL, 0, 0 }, }, nullptr, &meltyb_inputs, @@ -4424,13 +4681,14 @@ const Game Games[] = { "fpr-24333.ic8", 0x0000000, 0x4000000 }, { "fpr-24334.ic9", 0x4000000, 0x4000000 }, { "317-0437-com.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, - // MushiKing II - The King Of Beetle II ENG (Ver. 1.001) + // Mushiking The King Of Beetles - Mushiking II / III / III+ (World, Ver. 2.001) { "mushik2e", - NULL, + nullptr, "Mushiking The King Of Beetles - Mushiking II / III / III+ (World, Ver. 2.001)", 0x8000000, 0x5582, @@ -4445,15 +4703,16 @@ const Game Games[] = //ROM_REGION( 0x800, "pic_readout", 0 ) //ROM_LOAD( "317-0437-com.ic3", 0, 0x800, CRC(3b6fcee8) SHA1(65fbdd3b8c61a4b5ccb6389b25483a7ecdc0794d) ) { "317-0437-com.ic3", 0, 0x800, 0x0000000, Key }, - - { NULL, 0, 0 }, - } + }, + nullptr, + &mushik_inputs, }, // Mushiking The King Of Beetles - Mushiking IV / V / VI (World) // change game version (4/5/6): in BACKUP DATA CLEAR menu hold P1 and P2 buttons 1 for 3 seconds, then change version number in appeared menu and select YES(CLEAR) + // ~equivalent of Japanese 2K6 versions { "mushik4e", - NULL, + nullptr, "Mushiking The King Of Beetles - Mushiking IV / V / VI (World)", 0x8000000, 0x5502, @@ -4461,15 +4720,36 @@ const Game Games[] = M4, ROT0, { - { "fpr-24417.ic8", 0x0000000, 0x4000000 }, - { "fpr-24418.ic9", 0x4000000, 0x4000000 }, + { "fpr-24417.ic8", 0x0000000, 0x4000000, 0x01278cbb }, + { "fpr-24418.ic9", 0x4000000, 0x4000000, 0x7c8d7687 }, //ROM_REGION( 0x800, "pic_readout", 0 ) - //ROM_LOAD( "317-0437-com.ic3", 0, 0x800, CRC(3b6fcee8) SHA1(65fbdd3b8c61a4b5ccb6389b25483a7ecdc0794d) ) - { "317-0437-com.ic3", 0, 0x800, 0x0000000, Key }, + { "317-0437-com.ic3", 0, 0x800, 0x3b6fcee8, Key }, + }, + nullptr, + &mushik_inputs, + }, + // Mushiking The King Of Beetles - Mushiking IV / V / VI (Taiwan) + // change game version (4/5/6): in BACKUP DATA CLEAR menu hold P1 and P2 buttons 1 for 3 seconds, then change version number in appeared menu and select YES(CLEAR) + // ~equivalent of Japanese 2K6 versions + { + "mushik4t", + "mushik4e", + "Mushiking The King Of Beetles - Mushiking IV / V / VI (Taiwan)", + 0x8000000, + 0x5502, + "naomi", + M4, + ROT0, + { + { "fpr-24420.ic8", 0x0000000, 0x4000000, 0x4a44a604 }, + { "fpr-24421.ic9", 0x4000000, 0x4000000, 0xaf137021 }, // BAD DUMP - { NULL, 0, 0 }, - } + //ROM_REGION( 0x800, "pic_readout", 0 ) + { "317-0437-com.ic3", 0, 0x800, 0x3b6fcee8, Key }, + }, + nullptr, + &mushik_inputs, }, { "mushi2k61", @@ -4486,6 +4766,8 @@ const Game Games[] = { "317-0444-jpn.ic3", 0, 0x800, 0x6ded35a2, Key }, }, + nullptr, + &mushik_inputs, }, { "mushi2k62", @@ -4502,6 +4784,8 @@ const Game Games[] = { "317-0444-jpn.ic3", 0, 0x800, 0x6ded35a2, Key }, }, + nullptr, + &mushik_inputs, }, // Pokasuka Ghost *** BAD DUMP *** { @@ -4520,15 +4804,13 @@ const Game Games[] = { "fpr-24368.ic11", 0x0c000000, 0x4000000, 0x124f55e2 }, { "fpr-24369.ic12", 0x10000000, 0x4000000, 0x35b544ab }, - //ROM_REGION( 0x200000, "ioboard", 0) // touch screen I/O board, program disassembles as little-endian SH-4 - //ROM_LOAD( "fpr24351.ic14", 0x000000, 0x200000, CRC(4d1b7b89) SHA1(965b8c6b5a2e7b3f1b1e2eac19c86000c3b66754) ) - //ROM_REGION( 0x800, "pic_readout", 0 ) //ROM_LOAD( "317-0461-com.ic3", 0, 0x800, BAD_DUMP CRC(c9282cdd) SHA1(23933e489d763515428e2714cc6e7676df1d5323) ) { "317-0461-com.ic3", 0, 0x800, 0xc9282cdd, Key }, - - { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, + manicpnc_eeprom_dump, }, // Radirgy Noa { @@ -4544,11 +4826,9 @@ const Game Games[] = { "ic8.bin", 0x0000000, 0x4000000 }, { "ic9.bin", 0x4000000, 0x4000000 }, { "317-5138-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, }, NULL, - &radirgyn_inputs, - // SHOT (A)/(B)/(C) + &radirgy_inputs, }, // Rhythm Tengoku { @@ -4566,9 +4846,9 @@ const Game Games[] = { "fpr-24425.ic10", 0x08000000, 0x4000000 }, { "fpr-24426.ic11", 0x0c000000, 0x4000000 }, { "317-0503-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, - } - // SHOT A/B + }, + nullptr, + &rhytngk_inputs, }, // Shooting Love 2007 (Japan) { @@ -4586,10 +4866,9 @@ const Game Games[] = { "fpr-24415.ic10", 0x8000000, 0x4000000 }, { "fpr-24416.ic11", 0xc000000, 0x4000000 }, { "317-5129-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, }, - NULL, - NULL, // PUSH1/2/3 + nullptr, + &sl2007_inputs, sl2007_eeprom_dump }, // Touch De Zunou (Rev A) *** BAD DUMP *** @@ -4609,8 +4888,9 @@ const Game Games[] = //ROM_REGION( 0x800, "pic_readout", 0 ) //ROM_LOAD( "317-0435-jpn.ic3", 0, 0x800, BAD_DUMP CRC(b553d900) SHA1(ed1c3c2053f2c0e98cb5c4d99f93143a66c29e5c) ) { "317-0435-jpn.ic3", 0, 0x800, 0x0000000, Key }, - { NULL, 0, 0 }, - } + }, + nullptr, + nullptr, }, // Star Horse Progress Returns (satellite) { @@ -4625,7 +4905,6 @@ const Game Games[] = { { "fpr-24489.ic8", 0x00000000, 0x4000000 }, { "fpr-24490.ic9", 0x04000000, 0x4000000 }, - { NULL, 0, 0 }, } }, // Naomi GD Roms @@ -4633,7 +4912,7 @@ const Game Games[] = // Azumanga Daioh Puzzle Bobble { "azumanga", - NULL, + nullptr, "Azumanga Daioh Puzzle Bobble", 0x4000, 0, @@ -4641,15 +4920,15 @@ const Game Games[] = GD, ROT0, { - { "317-5091-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5091-jpn.pic", 0, 0x4000, 0xb71ede16 }, }, "gdl-0018", - }, + &azumanga_inputs, + }, // Border Down (Rev A) { "bdrdown", - NULL, + nullptr, "Border Down", 0x4000, 0, @@ -4657,17 +4936,16 @@ const Game Games[] = GD, ROT0, { - { "317-5097-jpn.pic", 0, 0x4000 }, - { "bdrdown-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5097-jpn.pic", 0, 0x4000, 0x16d2a748 }, + { "bdrdown-default-eeprom.bin", 0, 0x80, 0x5b19727c, Eeprom }, }, "gdl-0023a", - // SHOT, LASER, SPEED + &bdrdown_inputs, }, // Chaos Field (Japan) { "cfield", - NULL, + nullptr, "Chaos Field", 0x4000, 0, @@ -4675,17 +4953,16 @@ const Game Games[] = GD, ROT0, { - { "317-5102-com.pic", 0, 0x4000 }, - { "cfield-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5102-com.pic", 0, 0x4000, 0x8f1d8387 }, + { "cfield-default-eeprom.bin", 0, 0x80, 0xa7acb6bf, Eeprom }, }, "gdl-0025", - // TRG1/2/3 + &cfield_inputs, }, // Musapey's Choco Marker (Rev A) { "chocomk", - NULL, + nullptr, "Musapey's Choco Marker (Rev A)", 0x4000, 0, @@ -4693,16 +4970,15 @@ const Game Games[] = GD, ROT0, { - { "317-5085-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5085-jpn.pic", 0, 0x4000, 0x677fd544 }, }, "gdl-0014a", - // BUTTON A/B + &button12_inputs, }, // Cleopatra Fortune Plus { "cleoftp", - NULL, + nullptr, "Cleopatra Fortune Plus", 0x4000, 0, @@ -4710,16 +4986,15 @@ const Game Games[] = GD, ROT0, { - { "317-5083-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5083-com.pic", 0, 0x4000, 0x096a0fc2 }, }, "gdl-0012", - // BUTTON 1/2 + &button12_inputs, }, // Confidential Mission { "confmiss", - NULL, + nullptr, "Confidential Mission", 0x4000, 0, @@ -4727,17 +5002,16 @@ const Game Games[] = GD, ROT0, { - { "317-0298-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0298-com.pic", 0, 0x4000, 0x15971bf6 }, }, "gds-0001", - nullptr, + &lightgun_inputs, confmiss_eeprom_dump, }, // Capcom vs. SNK Millennium Fight 2000 Pro (Japan) { "cvsgd", - NULL, + nullptr, "Capcom vs. SNK Millennium Fight 2000 Pro (Japan)", 0x4000, 0, @@ -4745,8 +5019,7 @@ const Game Games[] = GD, ROT0, { - { "317-5076-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5076-jpn.pic", 0, 0x4000, 0x7c125b10 }, }, "gdl-0004", &capcom_4btn_inputs, @@ -4757,7 +5030,7 @@ const Game Games[] = // with Japan BIOS will be shown 010705, likely forgot / was not cared to update it { "cvs2", - NULL, + nullptr, "Capcom vs. SNK 2 Mark Of The Millennium 2001 (USA)", 0x4000, 0, @@ -4765,8 +5038,7 @@ const Game Games[] = GD, ROT0, { - { "317-5078-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5078-com.pic", 0, 0x4000, 0xe7bb621d }, }, "gdl-0008", &capcom_6btn_inputs, @@ -4784,8 +5056,7 @@ const Game Games[] = GD, ROT0, { - { "317-5078-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5078-com.pic", 0, 0x4000, 0xe7bb621d }, }, "gdl-0007a", &capcom_6btn_inputs, @@ -4794,7 +5065,7 @@ const Game Games[] = // Dragon Treasure (Rev B) { "dragntr", - NULL, + nullptr, "Dragon Treasure (Rev B)", 0x4000, 0, @@ -4802,9 +5073,8 @@ const Game Games[] = GD, ROT0, { - { "317-0363-com.pic", 0, 0x4000 }, - //{ "317-0364-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0363-com.pic", 0, 0x4000, 0xffecccf8 }, + //{ "317-0364-com.pic", 0, 0x4000, 0x82975008 }, }, "gds-0030b", }, @@ -4819,16 +5089,15 @@ const Game Games[] = GD, ROT0, { - { "317-0363-com.pic", 0, 0x4000 }, - //{ "317-0364-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0363-com.pic", 0, 0x4000, 0xffecccf8 }, + //{ "317-0364-com.pic", 0, 0x4000, 0x82975008 }, }, "gds-0030a", }, // Dragon Treasure 2 (Rev A) { "dragntr2", - NULL, + nullptr, "Dragon Treasure 2 (Rev A)", 0x4000, 0, @@ -4836,16 +5105,15 @@ const Game Games[] = GD, ROT0, { - { "317-0389-com.pic", 0, 0x4000 }, - //{ "317-0390-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0389-com.pic", 0, 0x4000, 0x35c511f9 }, + //{ "317-0390-com.pic", 0, 0x4000, 0x92183b60 }, }, "gds-0037a", }, // Dragon Treasure 3 (Rev A) { "dragntr3", - NULL, + nullptr, "Dragon Treasure 3 (Rev A)", 0x4000, 0, @@ -4853,16 +5121,15 @@ const Game Games[] = GD, ROT0, { - { "317-0426-jpn.pic", 0, 0x4000 }, - //{ "317-0390-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0426-jpn.pic", 0, 0x4000, 0x8df4d33a }, + //{ "317-0390-com.pic", 0, 0x4000, 0x92183b60 }, }, "gds-0041a", }, // Virtua Golf / Dynamic Golf (Rev A) { "dygolf", - NULL, + nullptr, "Virtua Golf / Dynamic Golf", 0x4000, 0, @@ -4870,15 +5137,15 @@ const Game Games[] = GD, ROT0, { - { "317-0308-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0308-com.pic", 0, 0x4000, 0x5e1ef2c4 }, }, "gds-0009a", + &dygolf_inputs, }, // Guilty Gear XX { "ggxx", - NULL, + nullptr, "Guilty Gear XX", 0x4000, 0, @@ -4886,8 +5153,7 @@ const Game Games[] = GD, ROT0, { - { "317-5082-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5082-com.pic", 0, 0x4000, 0x1b41189b }, }, "gdl-0011", &guilty_gear_inputs, @@ -4895,7 +5161,7 @@ const Game Games[] = // Guilty Gear XX Accent Core (Japan) { "ggxxac", - NULL, + nullptr, "Guilty Gear XX Accent Core", 0x4000, 0, @@ -4903,8 +5169,7 @@ const Game Games[] = GD, ROT0, { - { "317-5126-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5126-jpn.pic", 0, 0x4000, 0x87c44284 }, }, "gdl-0041", &guilty_gear_inputs, @@ -4913,7 +5178,7 @@ const Game Games[] = // Guilty Gear XX #Reload (Japan, Rev A) { "ggxxrl", - NULL, + nullptr, "Guilty Gear XX #Reload (Rev A)", 0x4000, 0, @@ -4921,8 +5186,7 @@ const Game Games[] = GD, ROT0, { - { "317-5092-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5092-jpn.pic", 0, 0x4000, 0x7ad7b541 }, }, "gdl-0019a", &guilty_gear_inputs, @@ -4938,8 +5202,7 @@ const Game Games[] = GD, ROT0, { - { "317-5092-jpn.pic" , 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5092-jpn.pic" , 0, 0x4000, 0x7ad7b541 }, }, "gdl-0019", &guilty_gear_inputs, @@ -4947,7 +5210,7 @@ const Game Games[] = // Guilty Gear XX Slash (Japan, Rev A) { "ggxxsla", - NULL, + nullptr, "Guilty Gear XX Slash (Rev A)", 0x4000, 0, @@ -4955,8 +5218,7 @@ const Game Games[] = GD, ROT0, { - { "317-5111-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5111-jpn.pic", 0, 0x4000, 0x96bcbd42 }, }, "gdl-0033a", &guilty_gear_inputs, @@ -4965,7 +5227,7 @@ const Game Games[] = // Mobile Suit Gundam: Federation vs. Zeon { "gundmgd", - NULL, + nullptr, "Mobile Suit Gundam: Federation vs. Zeon", 0x4000, 0, @@ -4973,9 +5235,8 @@ const Game Games[] = GD, ROT0, { - { "317-5069-com.pic", 0, 0x4000 }, - //{ "gundmgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5069-com.pic", 0, 0x4000, 0x44d0b242 }, + //{ "gundmgd-default-eeprom.bin", 0, 0x80, 0xdc80fa1e, Eeprom }, }, "gdl-0001", &shot1234_inputs, @@ -4984,7 +5245,7 @@ const Game Games[] = // Mobile Suit Gundam: Federation vs. Zeon DX (USA, Japan) { "gundmxgd", - NULL, + nullptr, "Mobile Suit Gundam: Federation vs. Zeon DX", 0x4000, 0, @@ -4992,9 +5253,8 @@ const Game Games[] = GD, ROT0, { - { "317-5079-com.pic", 0, 0x4000 }, - //{ "gundmxgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5079-com.pic", 0, 0x4000, 0x8f9fb55d }, + //{ "gundmxgd-default-eeprom.bin", 0, 0x80, 0xdc0e8d45, Eeprom }, }, "gdl-0006", &shot1234_inputs, @@ -5003,7 +5263,7 @@ const Game Games[] = // Ikaruga { "ikaruga", - NULL, + nullptr, "Ikaruga", 0x4000, 0, @@ -5011,18 +5271,16 @@ const Game Games[] = GD, ROT270, { - { "317-5081-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5081-jpn.pic", 0, 0x4000, 0x72ca4579 }, }, "gdl-0010", - // SHOT, CHANGE + &ikaruga_inputs, nullptr, - ikaruga_eeprom_dump, }, // Jingi Storm - The Arcade (Japan) { "jingystm", - NULL, + nullptr, "Jingi Storm - The Arcade", 0x4000, 0, @@ -5030,18 +5288,16 @@ const Game Games[] = GD, ROT0, { - { "317-5122-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5122-jpn.pic", 0, 0x4000, 0x88983220 }, }, "gdl-0037", - // GUARD, PUNCH, KICK - nullptr, + &jingystm_inputs, jingystm_eeprom_dump, }, // Karous (Japan) { "karous", - NULL, + nullptr, "Karous", 0x4000, 0, @@ -5049,17 +5305,16 @@ const Game Games[] = GD, ROT270, { - { "317-5125-com.pic", 0, 0x4000 }, - { "karous-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5125-com.pic", 0, 0x4000, 0x918efc4f }, + { "karous-default-eeprom.bin", 0, 0x80, 0xb017451c, Eeprom }, }, "gdl-0040", - // SHOT, SWORD, SPECIAL same as radirgy + &radirgy_inputs, }, // La Keyboard { "keyboard", - NULL, + nullptr, "La Keyboard", 0x4000, 0, @@ -5067,16 +5322,15 @@ const Game Games[] = GD, ROT0, { - { "317-0323-com.pic", 0, 0x4000 }, - { "keyboard-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-0323-com.pic", 0, 0x4000, 0xc8854ef2 }, + { "keyboard-default-eeprom.bin", 0, 0x80, 0x9262fc90, Eeprom }, }, "gds-0017", }, // Kurukuru Chameleon (Japan) { "kurucham", - NULL, + nullptr, "Kurukuru Chameleon", 0x4000, 0, @@ -5084,15 +5338,15 @@ const Game Games[] = GD, ROT0, { - { "317-5115-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5115-jpn.pic", 0, 0x4000, 0xe5435e85 }, }, "gdl-0034", + nullptr, // TODO }, // Lupin The Third - The Shooting (Rev A) { "lupinsho", - NULL, + nullptr, "Lupin The Third - The Shooting (Rev A)", 0x4000, 0, @@ -5100,11 +5354,10 @@ const Game Games[] = GD, ROT0, { - { "317-0325-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0325-jpn.pic", 0, 0x4000, 0xf71cb2fc }, }, "gds-0018a", - nullptr, + &lightgun_inputs, lupinsho_eeprom_dump, }, // Lupin The Third - The Shooting @@ -5118,17 +5371,16 @@ const Game Games[] = GD, ROT0, { - { "317-0325-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0325-jpn.pic", 0, 0x4000, 0xf71cb2fc }, }, "gds-0018", - nullptr, + &lightgun_inputs, lupinsho_eeprom_dump, }, // Lupin The Third - The Typing (Rev A) { "luptype", - NULL, + nullptr, "Lupin The Third - The Typing", 0x4000, 0, @@ -5136,8 +5388,7 @@ const Game Games[] = GD, ROT0, { - { "317-0332-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0332-jpn.pic", 0, 0x4000, 0x43e78ecf }, }, "gds-0021a", nullptr, @@ -5146,7 +5397,7 @@ const Game Games[] = // Melty Blood Act Cadenza Version B2 (Japan) { "meltyb", - NULL, + nullptr, "Melty Blood Act Cadenza (Ver. B2)", 0x4000, 0, @@ -5154,8 +5405,7 @@ const Game Games[] = GD, ROT0, { - { "317-5124-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5124-jpn.pic", 0, 0x4000, 0xad162bfa }, }, "gdl-0039a", &meltyb_inputs, @@ -5164,7 +5414,7 @@ const Game Games[] = // Melty Blood Act Cadenza Ver. A (Japan) { "meltybld", - NULL, + nullptr, "Melty Blood Act Cadenza (Ver. A)", 0x4000, 0, @@ -5172,8 +5422,7 @@ const Game Games[] = GD, ROT0, { - { "317-5104-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5104-jpn.pic", 0, 0x4000, 0xafa5e709 }, }, "gdl-0028c", &meltyb_inputs, @@ -5190,8 +5439,7 @@ const Game Games[] = GD, ROT0, { - { "317-5104-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5104-jpn.pic", 0, 0x4000, 0xafa5e709 }, }, "gdl-0028", &meltyb_inputs, @@ -5208,8 +5456,7 @@ const Game Games[] = GD, ROT0, { - { "317-5124-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5124-jpn.pic", 0, 0x4000, 0xad162bfa }, }, "gdl-0039", &meltyb_inputs, @@ -5218,7 +5465,7 @@ const Game Games[] = // Moeru Casinyo (Japan) { "moeru", - NULL, + nullptr, "Moeru Casinyo", 0x4000, 0, @@ -5226,16 +5473,16 @@ const Game Games[] = GD, ROT0, { - { "317-5084-jpn.pic", 0, 0x4000 }, - { "moeru-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5084-jpn.pic", 0, 0x4000, 0xdb7dac1e }, + { "moeru-default-eeprom.bin", 0, 0x80, 0x50ca079f, Eeprom }, }, "gdl-0013", + nullptr, // TODO }, // The Maze of the Kings { "mok", - NULL, + nullptr, "The Maze of the Kings", 0x4000, 0, @@ -5243,17 +5490,16 @@ const Game Games[] = GD, ROT0, { - { "317-0333-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0333-com.pic", 0, 0x4000, 0x15fb7792 }, }, "gds-0022", - nullptr, + &lightgun_inputs, mok_eeprom_dump, }, // Monkey Ball { "monkeyba", - NULL, + nullptr, "Monkey Ball", 0x4000, 0, @@ -5261,8 +5507,7 @@ const Game Games[] = GD, ROT0, { - { "317-0307-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0307-com.pic", 0, 0x4000, 0x4046de19 }, }, "gds-0008", &monkeyba_inputs, @@ -5271,7 +5516,7 @@ const Game Games[] = // Psyvariar 2 - The Will To Fabricate (Japan) { "psyvar2", - NULL, + nullptr, "Psyvariar 2 - The Will To Fabricate", 0x4000, 0, @@ -5279,19 +5524,17 @@ const Game Games[] = GD, ROT270, { - { "317-5100-jpn.pic", 0, 0x4000 }, - // { "psyvar2-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5100-jpn.pic", 0, 0x4000, 0xf37a1dbe }, + // { "psyvar2-default-eeprom.bin", 0, 0x80, 0x9d8661f3, Eeprom }, }, "gdl-0024", - // SHOT, BOMB - nullptr, + &psyvariar_inputs, psyvar2_eeprom_dump, }, // Puyo Pop Fever (World) { "puyofev", - NULL, + nullptr, "Puyo Pop Fever (World)", 0x4000, 0, @@ -5299,12 +5542,11 @@ const Game Games[] = GD, ROT0, { - { "317-0375-com.pic", 0, 0x4000 }, - // { "puyofev-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-0375-com.pic", 0, 0x4000, 0x52b56b52 }, + // { "puyofev-default-eeprom.bin", 0, 0x80, 0x42e5fd40, Eeprom }, }, "gds-0034", - nullptr, + &puyofev_inputs, puyofev_eeprom_dump, }, // Puyo Puyo Fever (Japan) @@ -5318,12 +5560,11 @@ const Game Games[] = GD, ROT0, { - { "317-0375-com.pic", 0, 0x4000 }, - // { "puyofev-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-0375-com.pic", 0, 0x4000, 0x52b56b52 }, + // { "puyofev-default-eeprom.bin", 0, 0x80, 0x42e5fd40, Eeprom }, }, "gds-0031", - nullptr, + &puyofev_inputs, puyofev_eeprom_dump, }, // Puyo Puyo Fever (Prototype) @@ -5360,17 +5601,15 @@ const Game Games[] = { "ic37s.bin", 0x0b000000, 0x800000, 0xfc89454c, InterleavedWord }, { "ic38s.bin", 0x0b000002, 0x800000, 0x86954476, InterleavedWord }, { "copy", 0x00400000, 0xc00000, 0x0000000, Copy, 0x1000000 }, - - { NULL, 0, 0, 0x00000000 }, }, nullptr, - nullptr, + &puyofev_inputs, puyofev_eeprom_dump, }, // Quiz Keitai Q mode { "quizqgd", - NULL, + nullptr, "Quiz Keitai Q mode", 0x4000, 0, @@ -5378,16 +5617,16 @@ const Game Games[] = GD, ROT270, { - { "317-5090-jpn.pic", 0, 0x4000 }, - { "quizqgd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5090-jpn.pic", 0, 0x4000, 0x141cced2 }, + { "quizqgd-default-eeprom.bin", 0, 0x80, 0x46c10aa3, Eeprom }, }, "gdl-0017", + nullptr, // TODO }, // Radirgy (Japan, Rev A) { "radirgy", - NULL, + nullptr, "Radirgy (Rev A)", 0x4000, 0, @@ -5395,12 +5634,11 @@ const Game Games[] = GD, ROT270, { - { "317-5110-jpn.pic", 0, 0x4000 }, - { "radirgy-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5110-jpn.pic", 0, 0x4000, 0x829d06e2 }, + { "radirgy-default-eeprom.bin", 0, 0x80, 0x8d60a282, Eeprom }, }, "gdl-0032a", - // SHOT, SWORD, SPECIAL same as karous + &radirgy_inputs, }, // Radirgy (Japan) { @@ -5413,16 +5651,16 @@ const Game Games[] = GD, ROT270, { - { "317-5110-jpn.pic", 0, 0x4000 }, - { "radirgy-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5110-jpn.pic", 0, 0x4000, 0x829d06e2 }, + { "radirgy-default-eeprom.bin", 0, 0x80, 0x8d60a282, Eeprom }, }, "gdl-0032", + &radirgy_inputs, }, // Senko No Ronde (Japan, Rev A) { "senko", - NULL, + nullptr, "Senko no Ronde (Rev A)", 0x4000, 0, @@ -5430,12 +5668,11 @@ const Game Games[] = GD, ROT0, { - { "317-5107-jpn.pic", 0, 0x4000 }, - // { "senko-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5107-jpn.pic", 0, 0x4000, 0x6bc3fad0 }, + // { "senko-default-eeprom.bin", 0, 0x80, 0xb3d3be09, Eeprom }, }, "gdl-0030a", - nullptr, + &senko_inputs, senko_eeprom_dump, }, // Senko No Ronde (Japan) @@ -5449,18 +5686,17 @@ const Game Games[] = GD, ROT0, { - { "317-5107-jpn.pic", 0, 0x4000 }, - // { "senkoo-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5107-jpn.pic", 0, 0x4000, 0x6bc3fad0 }, + // { "senkoo-default-eeprom.bin", 0, 0x80, 0xa2203a7f, Eeprom }, }, "gdl-0030", - nullptr, + &senko_inputs, senko_eeprom_dump, }, // Senko No Ronde Special (Export, Japan) { "senkosp", - NULL, + nullptr, "Senko no Ronde Special", 0x4000, 0, @@ -5468,8 +5704,7 @@ const Game Games[] = GD, ROT0, { - { "317-5123-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5123-com.pic", 0, 0x4000, 0x7340df6e }, }, "gdl-0038", &senkosp_inputs, @@ -5478,7 +5713,7 @@ const Game Games[] = // Street Fighter Zero 3 Upper (Japan) { "sfz3ugd", - NULL, + nullptr, "Street Fighter Zero 3 Upper", 0x4000, 0, @@ -5486,9 +5721,8 @@ const Game Games[] = GD, ROT0, { - { "317-5072-com.pic", 0, 0x4000 }, - // { "sfz3ugd-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5072-com.pic", 0, 0x4000, 0x3238ba01 }, + // { "sfz3ugd-default-eeprom.bin", 0, 0x80, 0x699dd01b, Eeprom }, }, "gdl-0002", &capcom_6btn_inputs, @@ -5497,7 +5731,7 @@ const Game Games[] = // Shakatto Tambourine (Rev B) { "shaktam", - NULL, + nullptr, "Shakatto Tambourine (Rev B)", 0x4000, 0, @@ -5505,15 +5739,15 @@ const Game Games[] = GD, ROT0, { - { "317-0299-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0299-com.pic", 0, 0x4000, 0x9e1a8971 }, }, "gds-0002b", + &shaktam_inputs, }, // Shakatto Tambourine Cho Powerup Chu (2K1 AUT) { "shaktamb", - NULL, + nullptr, "Shakatto Tambourine Cho Powerup Chu (2K1 AUT)", 0x4000, 0, @@ -5521,15 +5755,15 @@ const Game Games[] = GD, ROT0, { - { "317-0321-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0321-com.pic", 0, 0x4000, 0x81519e71 }, }, "gds-0016", + &shaktam_inputs, }, // Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR) { "shaktmsp", - NULL, + nullptr, "Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR)", 0x4000, 0, @@ -5537,15 +5771,15 @@ const Game Games[] = GD, ROT0, { - { "317-0315-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0315-com.pic", 0, 0x4000, 0xc225b08b }, }, "gds-0013", + &shaktam_inputs, }, // Shikigami No Shiro II / The Castle of Shikigami II { "shikgam2", - NULL, + nullptr, "Shikigami no Shiro II / The Castle of Shikigami II", 0x4000, 0, @@ -5553,16 +5787,16 @@ const Game Games[] = GD, ROT270, { - { "317-5095-jpn.pic", 0, 0x4000 }, - { "shikgam2-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5095-jpn.pic", 0, 0x4000, 0x7c25cb5c }, + { "shikgam2-default-eeprom.bin", 0, 0x80, 0x5fb60e27, Eeprom }, }, "gdl-0021", + &sl2007_inputs, }, // Slashout { "slashout", - NULL, + nullptr, "Slashout", 0x4000, 0, @@ -5570,8 +5804,7 @@ const Game Games[] = GD, ROT0, { - { "317-0302-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0302-com.pic", 0, 0x4000, 0xfa290329 }, }, "gds-0004", &slashout_inputs, @@ -5580,7 +5813,7 @@ const Game Games[] = // Spikers Battle { "spkrbtl", - NULL, + nullptr, "Spikers Battle", 0x4000, 0, @@ -5588,17 +5821,16 @@ const Game Games[] = GD, ROT0, { - { "317-0303-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0303-com.pic", 0, 0x4000, 0xb42999dd }, }, "gds-0005", - NULL, // BEAT, CHARGE ,JUMP, SHIFT + &spkrbtl_inputs, spkrbtl_eeprom_dump }, // Sports Jam { "sprtjam", - NULL, + nullptr, "Sports Jam", 0x4000, 0, @@ -5606,8 +5838,7 @@ const Game Games[] = GD, ROT0, { - { "317-0300-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0300-com.pic", 0, 0x4000, 0x19a97214 }, }, "gds-0003", &shot12_inputs, @@ -5615,7 +5846,7 @@ const Game Games[] = // Super Shanghai 2005 (Japan, Rev A) { "ss2005", - NULL, + nullptr, "Super Shanghai 2005 (Rev A)", 0x4000, 0, @@ -5623,9 +5854,8 @@ const Game Games[] = GD, ROT0, { - { "317-5108-jpn.pic", 0, 0x4000 }, - { "ss2005-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5108-jpn.pic", 0, 0x4000, 0x4fa7dede }, + { "ss2005-default-eeprom.bin", 0, 0x80, 0x26bd9003, Eeprom }, }, "gdl-0031a", }, @@ -5640,16 +5870,15 @@ const Game Games[] = GD, ROT0, { - { "317-5108-jpn.pic", 0, 0x4000 }, - { "ss2005-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5108-jpn.pic", 0, 0x4000, 0x4fa7dede }, + { "ss2005-default-eeprom.bin", 0, 0x80, 0x26bd9003, Eeprom }, }, "gdl-0031", }, // Doki Doki Idol Star Seeker { "starseek", - NULL, + nullptr, "Doki Doki Idol Star Seeker", 0x4000, 0, @@ -5657,15 +5886,14 @@ const Game Games[] = GD, ROT0, { - { "317-5077-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5077-jpn.pic", 0, 0x4000, 0x19f8d4d0 }, }, "gdl-0005", }, // Noukone Puzzle Takoron (Japan) { "takoron", - NULL, + nullptr, "Noukone Puzzle Takoron", 0x4000, 0, @@ -5673,15 +5901,14 @@ const Game Games[] = GD, ROT0, { - { "317-5127-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-5127-jpn.pic", 0, 0x4000, 0x870c55eb }, }, "gdl-0042", }, // Tetris Kiwamemichi (Japan) { "tetkiwam", - NULL, + nullptr, "Tetris Kiwamemichi", 0x4000, 0, @@ -5689,16 +5916,15 @@ const Game Games[] = GD, ROT0, { - { "317-5093-jpn.pic", 0, 0x4000 }, - { "tetkiwam-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5093-jpn.pic", 0, 0x4000, 0xa61e1e2a }, + { "tetkiwam-default-eeprom.bin", 0, 0x80, 0x843f2a99, Eeprom }, }, "gdl-0020", }, // Trigger Heart Exelica Ver.A (Japan) { "trgheart", - NULL, + nullptr, "Trigger Heart Exelica (Ver. A)", 0x4000, 0, @@ -5706,13 +5932,11 @@ const Game Games[] = GD, ROT270, { - { "317-5121-jpn.pic", 0, 0x4000 }, - // { "trgheart-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5121-jpn.pic", 0, 0x4000, 0xcdb9b179 }, + // { "trgheart-default-eeprom.bin", 0, 0x80, 0x7faff313, Eeprom }, }, "gdl-0036a", - // SHOT, ANCHOR, BOMB - nullptr, + &trgheart_inputs, trgheart_eeprom_dump, }, // Trigger Heart Exelica (Japan) @@ -5726,18 +5950,17 @@ const Game Games[] = GD, ROT270, { - { "317-5121-jpn.pic", 0, 0x4000 }, - // { "trgheart-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5121-jpn.pic", 0, 0x4000, 0xcdb9b179 }, + // { "trgheart-default-eeprom.bin", 0, 0x80, 0x7faff313, Eeprom }, }, "gdl-0036", - nullptr, + &trgheart_inputs, trgheart_eeprom_dump, }, // Trizeal (Japan) { "trizeal", - NULL, + nullptr, "Trizeal", 0x4000, 0, @@ -5745,19 +5968,17 @@ const Game Games[] = GD, ROT270, { - { "317-5103-jpn.pic", 0, 0x4000 }, - // { "trizeal-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5103-jpn.pic", 0, 0x4000, 0x93feaff4 }, + // { "trizeal-default-eeprom.bin", 0, 0x80, 0xac0847ce, Eeprom }, }, "gdl-0026", - // PUSH1/2/3 - nullptr, + &sl2007_inputs, trizeal_eeprom_dump, }, // Under Defeat (Japan) { "undefeat", - NULL, + nullptr, "Under Defeat", 0x4000, 0, @@ -5765,18 +5986,17 @@ const Game Games[] = GD, ROT270, { - { "317-5117-jpn.pic", 0, 0x4000 }, - // { "undefeat-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, + { "317-5117-jpn.pic", 0, 0x4000, 0x61e65ca8 }, + // { "undefeat-default-eeprom.bin", 0, 0x80, 0x9d2b071c, Eeprom }, }, "gdl-0035", - // SHOT, BOMB - nullptr, + &psyvariar_inputs, undefeat_eeprom_dump, }, // Usagi - Yamashiro Mahjong Hen (Japan) { "usagiym", - NULL, + nullptr, "Usagi - Yamashiro Mahjong Hen", 0x4000, 0, @@ -5784,16 +6004,15 @@ const Game Games[] = GD, ROT0, { - { "317-5096-jpn.pic", 0, 0x4000 }, - { "usagiym-default-eeprom.bin", 0, 0x80, 0x0000000, Eeprom }, - { NULL, 0, 0 }, + { "317-5096-jpn.pic", 0, 0x4000, 0x2d16887b }, + { "usagiym-default-eeprom.bin", 0, 0x80, 0x1fbdf0ca, Eeprom }, }, "gdl-0022", }, // Virtua Athletics / Virtua Athlete { "vathlete", - NULL, + nullptr, "Virtua Athletics / Virtua Athlete", 0x4000, 0, @@ -5801,16 +6020,15 @@ const Game Games[] = GD, ROT0, { - { "317-0330-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0330-com.pic", 0, 0x4000, 0x33ccf2d1 }, }, "gds-0019", - // RUN1, ACTION, RUN2 + &vathlete_inputs, }, // Virtua Tennis 2 / Power Smash 2 (Rev A) { "vtennis2", - NULL, + nullptr, "Virtua Tennis 2 / Power Smash 2", 0x4000, 0, @@ -5818,17 +6036,16 @@ const Game Games[] = GD, ROT0, { - { "317-0318-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0318-com.pic", 0, 0x4000, 0x83de4047 }, }, "gds-0015a", - nullptr, + &shot12_inputs, vtennis2_eeprom_dump, }, // Virtua Tennis / Power Smash { "vtennisg", - NULL, + nullptr, "Virtua Tennis / Power Smash", 0x4000, 0, @@ -5836,8 +6053,7 @@ const Game Games[] = GD, ROT0, { - { "317-0312-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0312-com.pic", 0, 0x4000, 0x7213684e }, }, "gds-0011", &shot12_inputs, @@ -5846,7 +6062,7 @@ const Game Games[] = // World Series Baseball / Super Major League { "wsbbgd", - NULL, + nullptr, "World Series Baseball / Super Major League", 0x4000, 0, @@ -5854,8 +6070,7 @@ const Game Games[] = GD, ROT0, { - { "317-0309-com.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0309-com.pic", 0, 0x4000, 0x62d760bf }, }, "gds-0010", &wsbb_inputs, @@ -5864,7 +6079,7 @@ const Game Games[] = // uses CRP-1231 card RW connected via 838-13661 RS422/RS232C converter BD, and 2x JVS I/O boards (or one special I/O ?). { "mj1", - NULL, + nullptr, "Sega Yonin Uchi Mahjong MJ (Update Disc Ver.1.008, Japan) (CDP-10002B)", 0x4000, 0, @@ -5872,18 +6087,184 @@ const Game Games[] = GD, ROT0, { - { "317-0352-jpn.pic", 0, 0x4000 }, - { NULL, 0, 0 }, + { "317-0352-jpn.pic", 0, 0x4000, 0xc2c45f9c }, }, "cdp-10002b", }, + // World Club Champion Football Serie A 2001-2002 Ver.2 (Japan) (CDP-10001C) + { + "wccf116", + nullptr, + "World Club Champion Football Serie A 2001-2002", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0329-jpn.pic", 0, 0x4000, 0x097f5f92 }, + }, + "cdp-10001c", + }, + // World Club Champion Football Serie A 2001-2002 DIMM FIRM Ver.3.03 (CDP-10003) + { + "wccf1dup", + nullptr, + "World Club Champion Football Serie A 2001-2002 DIMM FIRM Ver.3.03", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0329-jpn.pic", 0, 0x4000, 0x097f5f92 }, + }, + "cdp-10003", + }, + // World Club Champion Football Serie A 2002-2003 Ver.2.12 (Italy) (CDV-10002) + { + "wccf212e", + nullptr, + "World Club Champion Football Serie A 2002-2003 (Italy)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0369-exp.pic", 0, 0x4000, 0xadf2d113 }, + // 837-14229 "IC BD FLAT READER" + // SH4-based camera sensor board connected to MAPLE CN7 + }, + "cdv-10002", + }, + // World Club Champion Football Serie A 2002-2003 Ver.2.34 (Japan) (CDV-10008) + { + "wccf234j", + nullptr, + "World Club Champion Football Serie A 2002-2003 (Japan)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0369-jpn.pic", 0, 0x4000, 0xfb3672ba }, + }, + "cdv-10008", + }, + // World Club Champion Football European Clubs 2004-2005 (Asia) (CDV-10013) + { + "wccf310j", + nullptr, + "World Club Champion Football European Clubs 2004-2005 (Asia)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0419-jpn.pic", 0, 0x4000, 0x04fae86b }, + }, + "cdv-10013", + }, + // World Club Champion Football European Clubs 2004-2005 Ver.1.1 (Export) (CDV-10015) + { + "wccf331e", + "wccf322e", + "World Club Champion Football European Clubs 2004-2005 v1.1 (Export)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0419-exp.pic", 0, 0x4000, 0x3f5e1445 }, + }, + "cdv-10015", + }, + // World Club Champion Football European Clubs 2004-2005 Ver.3.22 (Export) (CDV-10015P) + { + "wccf322e", + nullptr, + "World Club Champion Football European Clubs 2004-2005 (Export)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0419-exp.pic", 0, 0x4000, 0x3f5e1445 }, + }, + "cdv-10015p", + }, + // World Club Champion Football European Clubs 2004-2005 Ver.1.1 (Japan) (CDV-10020) + { + "wccf331j", + "wccf341j", + "World Club Champion Football European Clubs 2004-2005 v1.1 (Japan)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-unk-jpn.pic", 0, 0x4000, 0xa4abd76b }, + }, + "cdv-10020", + }, + // World Club Champion Football European Clubs 2004-2005 Ver.1.2 (Japan) (CDV-10021) + { + "wccf341j", + nullptr, + "World Club Champion Football European Clubs 2004-2005 (Japan)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-unk-jpn.pic", 0, 0x4000, 0xa4abd76b }, + }, + "cdv-10021", + }, + // World Club Champion Football European Clubs 2005-2006 (Japan) (CDV-10025) + { + "wccf400j", + nullptr, + "World Club Champion Football European Clubs 2005-2006 (Japan)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0456-jpn.pic", 0, 0x4000, 0xcf3bd834 }, + }, + "cdv-10025", + }, + // World Club Champion Football European Clubs 2005-2006 (Export) (CDV-10027) + { + "wccf420e", + nullptr, + "World Club Champion Football European Clubs 2005-2006 (Export)", + 0x4000, + 0, + "naomi", + GD, + ROT0, + { + { "317-0456-exp.pic", 0, 0x4000, 0xfb7dd592 }, + }, + "cdv-10027", + }, // AtomisWave Roms // Animal Basket (24 Jan 2005) { "anmlbskt", - NULL, + nullptr, "Animal Basket", 0x4000000, 0x45, @@ -5891,11 +6272,10 @@ const Game Games[] = AW, ROT270, { - { "vm2001f01.u3", 0x0000000, 0x800000 }, - { "vm2001f01.u4", 0x1000000, 0x800000 }, - { "vm2001f01.u2", 0x1800000, 0x800000 }, - { "vm2001f01.u15", 0x2000000, 0x800000 }, - { NULL, 0, 0 }, + { "vm2001f01.u3", 0x0000000, 0x800000, 0x4fb33380 }, + { "vm2001f01.u4", 0x1000000, 0x800000, 0x7cb2e7c3 }, + { "vm2001f01.u2", 0x1800000, 0x800000, 0x386070a1 }, + { "vm2001f01.u15", 0x2000000, 0x800000, 0x2bb1be28 }, } }, // Animal Basket (19 Jan 2005) @@ -5909,18 +6289,17 @@ const Game Games[] = AW, ROT270, { - { "u3", 0x0000000, 0x1000000 }, - { "u1", 0x1000000, 0x1000000 }, - { "u4", 0x2000000, 0x1000000 }, - { "u2", 0x3000000, 0x1000000 }, + { "u3", 0x0000000, 0x1000000, 0xcd082af3 }, + { "u1", 0x1000000, 0x1000000, 0x4a2a01d3 }, + { "u4", 0x2000000, 0x1000000, 0x646e9773 }, + { "u2", 0x3000000, 0x1000000, 0xb9162d97 }, // U14-U17 not populated - { NULL, 0, 0 }, } }, // Sega Bass Fishing Challenge (Version A) { "basschal", - NULL, + nullptr, "Sega Bass Fishing Challenge (Ver. A)", 0x8000000, 0x2a, @@ -5928,16 +6307,17 @@ const Game Games[] = AW, ROT0, { - { "vera.u3", 0x00000000, 0x01000000 }, - { "vera.u1", 0x01000000, 0x01000000 }, - { "vera.u4", 0x02000000, 0x01000000 }, - { "vera.u2", 0x03000000, 0x01000000 }, - { "vera.u15", 0x04000000, 0x01000000 }, - { "vera.u17", 0x05000000, 0x01000000 }, - { "vera.u14", 0x06000000, 0x01000000 }, - { "vera.u16", 0x07000000, 0x01000000 }, - { NULL, 0, 0 }, - } + { "vera.u3", 0x00000000, 0x01000000, 0x8cbec9d7 }, + { "vera.u1", 0x01000000, 0x01000000, 0xcfef27e5 }, + { "vera.u4", 0x02000000, 0x01000000, 0xbd1f13aa }, + { "vera.u2", 0x03000000, 0x01000000, 0x0a463c37 }, + { "vera.u15", 0x04000000, 0x01000000, 0xe588afd1 }, + { "vera.u17", 0x05000000, 0x01000000, 0xd78389a4 }, + { "vera.u14", 0x06000000, 0x01000000, 0x35df044f }, + { "vera.u16", 0x07000000, 0x01000000, 0x3590072d }, + }, + nullptr, + &basschal_inputs, }, // Sega Bass Fishing Challenge { @@ -5950,21 +6330,22 @@ const Game Games[] = AW, ROT0, { - { "610-0811.u3", 0x00000000, 0x01000000 }, - { "610-0811.u1", 0x01000000, 0x01000000 }, - { "vera.u4", 0x02000000, 0x01000000 }, - { "610-0811.u2", 0x03000000, 0x01000000 }, - { "610-0811.u15", 0x04000000, 0x01000000 }, - { "610-0811.u17", 0x05000000, 0x01000000 }, - { "610-0811.u14", 0x06000000, 0x01000000 }, - { "vera.u16", 0x07000000, 0x01000000 }, - { NULL, 0, 0 }, - } + { "610-0811.u3", 0x00000000, 0x01000000, 0xef31abe7 }, + { "610-0811.u1", 0x01000000, 0x01000000, 0x44c3cf90 }, + { "vera.u4", 0x02000000, 0x01000000, 0xbd1f13aa }, + { "610-0811.u2", 0x03000000, 0x01000000, 0x1c61ed69 }, + { "610-0811.u15", 0x04000000, 0x01000000, 0xe8f02238 }, + { "610-0811.u17", 0x05000000, 0x01000000, 0xdb799f5a }, + { "610-0811.u14", 0x06000000, 0x01000000, 0xf2769383 }, + { "vera.u16", 0x07000000, 0x01000000, 0x3590072d }, + }, + nullptr, + &basschal_inputs, }, // Block Pong-Pong { "blokpong", - NULL, + nullptr, "Block Pong-Pong", 0x4000000, 0x45, @@ -5972,21 +6353,19 @@ const Game Games[] = AW, ROT270, { - { "u3", 0x0000000, 0x1000000 }, - { "u1", 0x1000000, 0x1000000 }, - { "u4", 0x2000000, 0x1000000 }, - //ROM_LOAD( "u2", 0x3000000, 0x1000000, CRC(b9162d97) SHA1(7f561617fa0538da554ad6f6c4d6a20e739491dc) ) // garbage data not used by this game, match anmlbskta U2 + { "u3", 0x0000000, 0x1000000, 0xdebaf8bd }, + { "u1", 0x1000000, 0x1000000, 0xca097a3f }, + { "u4", 0x2000000, 0x1000000, 0xd235dd29 }, + //{ "u2", 0x3000000, 0x1000000, 0xb9162d97 }, // garbage data not used by this game, match anmlbskta U2 // U14-U17 not populated - - { NULL, 0, 0 }, }, - NULL, + nullptr, &blokpong_inputs, }, // Sega Clay Challenge { "claychal", - NULL, + nullptr, "Sega Clay Challenge", 0x8000100, 0x2a, @@ -5994,21 +6373,22 @@ const Game Games[] = AW, ROT0, { - { "608-2161.u3", 0x0000000, 0x1000100 }, - { "608-2161.u1", 0x1000000, 0x1000100 }, - { "608-2161.u4", 0x2000000, 0x1000100 }, - { "608-2161.u2", 0x3000000, 0x1000100 }, - { "608-2161.u15", 0x4000000, 0x1000100 }, - { "608-2161.u17", 0x5000000, 0x1000100 }, - { "608-2161.u14", 0x6000000, 0x1000100 }, - { "608-2161.u16", 0x7000000, 0x1000100 }, - { NULL, 0, 0 }, - } + { "608-2161.u3", 0x0000000, 0x1000100, 0x5bb65194 }, + { "608-2161.u1", 0x1000000, 0x1000100, 0x526fc1af }, + { "608-2161.u4", 0x2000000, 0x1000100, 0x55f4e762 }, + { "608-2161.u2", 0x3000000, 0x1000100, 0xc40dae68 }, + { "608-2161.u15", 0x4000000, 0x1000100, 0xb82dcb0a }, + { "608-2161.u17", 0x5000000, 0x1000100, 0x2f973eb4 }, + { "608-2161.u14", 0x6000000, 0x1000100, 0x2e7d966f }, + { "608-2161.u16", 0x7000000, 0x1000100, 0x14f8ca87 }, + }, + nullptr, + &aw_lightgun_inputs, }, // Demolish Fist { "demofist", - NULL, + nullptr, "Demolish Fist", 0x8000000, 0x90, @@ -6016,23 +6396,22 @@ const Game Games[] = AW, ROT0, { - { "ax0601p01.ic18", 0x0000000, 0x0800000 }, - { "ax0601m01.ic11", 0x1000000, 0x1000000 }, - { "ax0602m01.ic12", 0x2000000, 0x1000000 }, - { "ax0603m01.ic13", 0x3000000, 0x1000000 }, - { "ax0604m01.ic14", 0x4000000, 0x1000000 }, - { "ax0605m01.ic15", 0x5000000, 0x1000000 }, - { "ax0606m01.ic16", 0x6000000, 0x1000000 }, - { "ax0607m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax0601p01.ic18", 0x0000000, 0x0800000, 0x0efb38ad }, + { "ax0601m01.ic11", 0x1000000, 0x1000000, 0x12fda2c7 }, + { "ax0602m01.ic12", 0x2000000, 0x1000000, 0xaea61fdf }, + { "ax0603m01.ic13", 0x3000000, 0x1000000, 0xd5879d35 }, + { "ax0604m01.ic14", 0x4000000, 0x1000000, 0xa7b09048 }, + { "ax0605m01.ic15", 0x5000000, 0x1000000, 0x18d8437e }, + { "ax0606m01.ic16", 0x6000000, 0x1000000, 0x42c81617 }, + { "ax0607m01.ic17", 0x7000000, 0x1000000, 0x96e5aa84 }, }, - NULL, + nullptr, &demofist_inputs, }, // Dirty Pigskin Football { "dirtypig", - NULL, + nullptr, "Dirty Pigskin Football", 0x8000000, 0x2a, @@ -6040,21 +6419,22 @@ const Game Games[] = AW, ROT0, { - { "695-0014.u3", 0x0000000, 0x1000000 }, - { "695-0014.u1", 0x1000000, 0x1000000 }, - { "695-0014.u4", 0x2000000, 0x1000000 }, - { "695-0014.u2", 0x3000000, 0x1000000 }, - { "695-0014.u15", 0x4000000, 0x1000000 }, - { "695-0014.u17", 0x5000000, 0x1000000 }, - { "695-0014.u14", 0x6000000, 0x1000000 }, - { "695-0014.u16", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, - } + { "695-0014.u3", 0x0000000, 0x1000000, 0x9fdd7d07 }, + { "695-0014.u1", 0x1000000, 0x1000000, 0xa91d2fcb }, + { "695-0014.u4", 0x2000000, 0x1000000, 0x3342f237 }, + { "695-0014.u2", 0x3000000, 0x1000000, 0x4d82152f }, + { "695-0014.u15", 0x4000000, 0x1000000, 0xd239a549 }, + { "695-0014.u17", 0x5000000, 0x1000000, 0x16bb5992 }, + { "695-0014.u14", 0x6000000, 0x1000000, 0x55470242 }, + { "695-0014.u16", 0x7000000, 0x1000000, 0x730180a4 }, + }, + nullptr, + &aw_shot123_inputs, }, // Dolphin Blue { "dolphin", - NULL, + nullptr, "Dolphin Blue", 0x8000000, 0x40, @@ -6062,21 +6442,20 @@ const Game Games[] = AW, ROT0, { - { "ax0401p01.ic18", 0x0000000, 0x0800000 }, - { "ax0401m01.ic11", 0x1000000, 0x1000000 }, - { "ax0402m01.ic12", 0x2000000, 0x1000000 }, - { "ax0403m01.ic13", 0x3000000, 0x1000000 }, - { "ax0404m01.ic14", 0x4000000, 0x1000000 }, - { "ax0405m01.ic15", 0x5000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax0401p01.ic18", 0x0000000, 0x0800000, 0x195d6328 }, + { "ax0401m01.ic11", 0x1000000, 0x1000000, 0x5e5dca57 }, + { "ax0402m01.ic12", 0x2000000, 0x1000000, 0x77dd4771 }, + { "ax0403m01.ic13", 0x3000000, 0x1000000, 0x911d0674 }, + { "ax0404m01.ic14", 0x4000000, 0x1000000, 0xf82a4ca3 }, + { "ax0405m01.ic15", 0x5000000, 0x1000000, 0xb88298d7 }, }, - NULL, + nullptr, &dolphin_inputs, }, // Fist Of The North Star { "fotns", - NULL, + nullptr, "Fist Of The North Star", 0x8000000, 0xc2, @@ -6084,15 +6463,14 @@ const Game Games[] = AW, ROT0, { - { "ax1901p01.ic18", 0x0000000, 0x0800000 }, - { "ax1901m01.ic11", 0x1000000, 0x1000000 }, - { "ax1902m01.ic12", 0x2000000, 0x1000000 }, - { "ax1903m01.ic13", 0x3000000, 0x1000000 }, - { "ax1904m01.ic14", 0x4000000, 0x1000000 }, - { "ax1905m01.ic15", 0x5000000, 0x1000000 }, - { "ax1906m01.ic16", 0x6000000, 0x1000000 }, - { "ax1907m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax1901p01.ic18", 0x0000000, 0x0800000, 0xa06998b0 }, + { "ax1901m01.ic11", 0x1000000, 0x1000000, 0xff5a1642 }, + { "ax1902m01.ic12", 0x2000000, 0x1000000, 0xd9aae8a9 }, + { "ax1903m01.ic13", 0x3000000, 0x1000000, 0x1711b23d }, + { "ax1904m01.ic14", 0x4000000, 0x1000000, 0x443bfb26 }, + { "ax1905m01.ic15", 0x5000000, 0x1000000, 0xeb1cada0 }, + { "ax1906m01.ic16", 0x6000000, 0x1000000, 0xfe6da168 }, + { "ax1907m01.ic17", 0x7000000, 0x1000000, 0x9d3a0520 }, }, nullptr, &fotns_inputs, @@ -6100,7 +6478,7 @@ const Game Games[] = // Faster Than Speed { "ftspeed", - NULL, + nullptr, "Faster Than Speed", 0x9000000, 0x6b, @@ -6108,22 +6486,21 @@ const Game Games[] = AW, ROT0, { - { "ax1701p01.ic18", 0x0000000, 0x0800000 }, - { "ax1701m01.ic11", 0x1000000, 0x1000000 }, - { "ax1702m01.ic12", 0x2000000, 0x1000000 }, - { "ax1703m01.ic13", 0x3000000, 0x1000000 }, - { "ax1704m01.ic14", 0x4000000, 0x1000000 }, - { "ax1705m01.ic15", 0x5000000, 0x1000000 }, - { "ax1706m01.ic16", 0x6000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax1701p01.ic18", 0x0000000, 0x0800000, 0x480cade7 }, + { "ax1701m01.ic11", 0x1000000, 0x1000000, 0x7dcdc784 }, + { "ax1702m01.ic12", 0x2000000, 0x1000000, 0x06c9bf85 }, + { "ax1703m01.ic13", 0x3000000, 0x1000000, 0x8f8e0224 }, + { "ax1704m01.ic14", 0x4000000, 0x1000000, 0xfbb4bb16 }, + { "ax1705m01.ic15", 0x5000000, 0x1000000, 0x996f68e1 }, + { "ax1706m01.ic16", 0x6000000, 0x1000000, 0x804b2eb2 }, }, - NULL, + nullptr, &ftspeed_inputs, }, // Guilty Gear Isuka { "ggisuka", - NULL, + nullptr, "Guilty Gear Isuka", 0x9000000, 0xed, @@ -6131,16 +6508,15 @@ const Game Games[] = AW, ROT0, { - { "ax1201p01.ic18", 0x0000000, 0x0800000 }, - { "ax1201m01.ic10", 0x0800000, 0x1000000 }, - { "ax1202m01.ic11", 0x1000000, 0x1000000 }, - { "ax1203m01.ic12", 0x2000000, 0x1000000 }, - { "ax1204m01.ic13", 0x3000000, 0x1000000 }, - { "ax1205m01.ic14", 0x4000000, 0x1000000 }, - { "ax1206m01.ic15", 0x5000000, 0x1000000 }, - { "ax1207m01.ic16", 0x6000000, 0x1000000 }, - { "ax1208m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax1201p01.ic18", 0x0000000, 0x0800000, 0x0a78d52c }, + { "ax1201m01.ic10", 0x0800000, 0x1000000, 0xdf96ce30 }, + { "ax1202m01.ic11", 0x1000000, 0x1000000, 0xdfc6fd67 }, + { "ax1203m01.ic12", 0x2000000, 0x1000000, 0xbf623df9 }, + { "ax1204m01.ic13", 0x3000000, 0x1000000, 0xc80c3930 }, + { "ax1205m01.ic14", 0x4000000, 0x1000000, 0xe99a269d }, + { "ax1206m01.ic15", 0x5000000, 0x1000000, 0x807ab795 }, + { "ax1207m01.ic16", 0x6000000, 0x1000000, 0x6636d1b8 }, + { "ax1208m01.ic17", 0x7000000, 0x1000000, 0x38bda476 }, }, nullptr, &guilty_gear_aw_inputs, @@ -6148,7 +6524,7 @@ const Game Games[] = // Guilty Gear X ver. 1.5 { "ggx15", - NULL, + nullptr, "Guilty Gear X ver. 1.5", 0x8000000, 0xc9, @@ -6156,23 +6532,22 @@ const Game Games[] = AW, ROT0, { - { "ax0801p01.ic18", 0x0000000, 0x0800000 }, - { "ax0801m01.ic11", 0x1000000, 0x1000000 }, - { "ax0802m01.ic12", 0x2000000, 0x1000000 }, - { "ax0803m01.ic13", 0x3000000, 0x1000000 }, - { "ax0804m01.ic14", 0x4000000, 0x1000000 }, - { "ax0805m01.ic15", 0x5000000, 0x1000000 }, - { "ax0806m01.ic16", 0x6000000, 0x1000000 }, - { "ax0807m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax0801p01.ic18", 0x0000000, 0x0800000, 0xd920c6bb }, + { "ax0801m01.ic11", 0x1000000, 0x1000000, 0x61879b2d }, + { "ax0802m01.ic12", 0x2000000, 0x1000000, 0xc0ff124d }, + { "ax0803m01.ic13", 0x3000000, 0x1000000, 0x4400c89a }, + { "ax0804m01.ic14", 0x4000000, 0x1000000, 0x70f58ab4 }, + { "ax0805m01.ic15", 0x5000000, 0x1000000, 0x72740e45 }, + { "ax0806m01.ic16", 0x6000000, 0x1000000, 0x3bf8ecba }, + { "ax0807m01.ic17", 0x7000000, 0x1000000, 0xe397dd79 }, }, - NULL, + nullptr, &ggx15_inputs, }, // The King of Fighters Neowave { "kofnw", - NULL, + nullptr, "The King of Fighters Neowave", 0x8000000, 0x99, @@ -6180,16 +6555,15 @@ const Game Games[] = AW, ROT0, { - { "ax2201en_p01.ic18", 0x0000000, 0x0800000 }, - { "ax2201m01.ic11", 0x1000000, 0x1000000 }, - { "ax2202m01.ic12", 0x2000000, 0x1000000 }, - { "ax2203m01.ic13", 0x3000000, 0x1000000 }, - { "ax2204m01.ic14", 0x4000000, 0x1000000 }, - { "ax2205m01.ic15", 0x5000000, 0x1000000 }, - { "ax2206m01.ic16", 0x6000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax2201en_p01.ic18", 0x0000000, 0x0800000, 0x27aab918 }, + { "ax2201m01.ic11", 0x1000000, 0x1000000, 0x22ea665b }, + { "ax2202m01.ic12", 0x2000000, 0x1000000, 0x7fad1bea }, + { "ax2203m01.ic13", 0x3000000, 0x1000000, 0x78986ca4 }, + { "ax2204m01.ic14", 0x4000000, 0x1000000, 0x6ffbeb04 }, + { "ax2205m01.ic15", 0x5000000, 0x1000000, 0x2851b791 }, + { "ax2206m01.ic16", 0x6000000, 0x1000000, 0xe53eb965 }, }, - NULL, + nullptr, &kofnw_inputs, }, // The King of Fighters Neowave (Japan) @@ -6203,23 +6577,22 @@ const Game Games[] = AW, ROT0, { - { "ax2201jp_p01.ic18", 0x0000000, 0x0800000 }, + { "ax2201jp_p01.ic18", 0x0000000, 0x0800000, 0xecc4a5c7 }, // these are taken from the above set, game *seems* to work fine with these - { "ax2201m01.ic11", 0x1000000, 0x1000000 }, - { "ax2202m01.ic12", 0x2000000, 0x1000000 }, - { "ax2203m01.ic13", 0x3000000, 0x1000000 }, - { "ax2204m01.ic14", 0x4000000, 0x1000000 }, - { "ax2205m01.ic15", 0x5000000, 0x1000000 }, - { "ax2206m01.ic16", 0x6000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax2201m01.ic11", 0x1000000, 0x1000000, 0x22ea665b }, + { "ax2202m01.ic12", 0x2000000, 0x1000000, 0x7fad1bea }, + { "ax2203m01.ic13", 0x3000000, 0x1000000, 0x78986ca4 }, + { "ax2204m01.ic14", 0x4000000, 0x1000000, 0x6ffbeb04 }, + { "ax2205m01.ic15", 0x5000000, 0x1000000, 0x2851b791 }, + { "ax2206m01.ic16", 0x6000000, 0x1000000, 0xe53eb965 }, }, - NULL, + nullptr, &kofnw_inputs, }, // The King of Fighters XI { "kofxi", - NULL, + nullptr, "The King of Fighters XI", 0x14000000, 0xd3, @@ -6227,23 +6600,22 @@ const Game Games[] = AW, ROT0, { - { "ax3201p01.fmem1", 0x00000000, 0x0800000 }, - { "ax3201m01.mrom1", 0x02000000, 0x2000000 }, - { "ax3202m01.mrom2", 0x04000000, 0x2000000 }, - { "ax3203m01.mrom3", 0x06000000, 0x2000000 }, - { "ax3204m01.mrom4", 0x0a000000, 0x2000000 }, - { "ax3205m01.mrom5", 0x0c000000, 0x2000000 }, - { "ax3206m01.mrom6", 0x0e000000, 0x2000000 }, - { "ax3207m01.mrom7", 0x12000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax3201p01.fmem1", 0x00000000, 0x0800000, 0x6dbdd71b }, + { "ax3201m01.mrom1", 0x02000000, 0x2000000, 0x7f9d6af9}, + { "ax3202m01.mrom2", 0x04000000, 0x2000000, 0x1ae40afa }, + { "ax3203m01.mrom3", 0x06000000, 0x2000000, 0x8c5e3bfd }, + { "ax3204m01.mrom4", 0x0a000000, 0x2000000, 0xba97f80c }, + { "ax3205m01.mrom5", 0x0c000000, 0x2000000, 0x3c747067 }, + { "ax3206m01.mrom6", 0x0e000000, 0x2000000, 0xcb81e5f5 }, + { "ax3207m01.mrom7", 0x12000000, 0x2000000, 0x164f6329 }, }, - NULL, + nullptr, &kofxi_inputs, }, // Knights of Valour - The Seven Spirits { "kov7sprt", - NULL, + nullptr, "Knights of Valour - The Seven Spirits", 0x8000000, 0x35, @@ -6251,23 +6623,22 @@ const Game Games[] = AW, ROT0, { - { "ax1301p01.ic18", 0x0000000, 0x0800000 }, - { "ax1301m01.ic11", 0x1000000, 0x1000000 }, - { "ax1301m02.ic12", 0x2000000, 0x1000000 }, - { "ax1301m03.ic13", 0x3000000, 0x1000000 }, - { "ax1301m04.ic14", 0x4000000, 0x1000000 }, - { "ax1301m05.ic15", 0x5000000, 0x1000000 }, - { "ax1301m06.ic16", 0x6000000, 0x1000000 }, - { "ax1301m07.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax1301p01.ic18", 0x0000000, 0x0800000, 0x6833a334 }, + { "ax1301m01.ic11", 0x1000000, 0x1000000, 0x58ae7ca1 }, + { "ax1301m02.ic12", 0x2000000, 0x1000000, 0x871ea03f }, + { "ax1301m03.ic13", 0x3000000, 0x1000000, 0xabc328bc }, + { "ax1301m04.ic14", 0x4000000, 0x1000000, 0x25a176d1 }, + { "ax1301m05.ic15", 0x5000000, 0x1000000, 0xe6573a93 }, + { "ax1301m06.ic16", 0x6000000, 0x1000000, 0xcb8cacb4 }, + { "ax1301m07.ic17", 0x7000000, 0x1000000, 0x0ca92213 }, }, - NULL, + nullptr, &kov7sprt_inputs, }, // Maximum Speed { "maxspeed", - NULL, + nullptr, "Maximum Speed", 0x9000000, 0x55, @@ -6275,21 +6646,20 @@ const Game Games[] = AW, ROT0, { - { "ax0501p01.ic18", 0x0000000, 0x0800000 }, - { "ax0501m01.ic11", 0x1000000, 0x1000000 }, - { "ax0502m01.ic12", 0x2000000, 0x1000000 }, - { "ax0503m01.ic13", 0x3000000, 0x1000000 }, - { "ax0504m01.ic14", 0x4000000, 0x1000000 }, - { "ax0505m01.ic15", 0x5000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax0501p01.ic18", 0x0000000, 0x0800000, 0xe1651867 }, + { "ax0501m01.ic11", 0x1000000, 0x1000000, 0x4a847a59 }, + { "ax0502m01.ic12", 0x2000000, 0x1000000, 0x2580237f }, + { "ax0503m01.ic13", 0x3000000, 0x1000000, 0xe5a3766b }, + { "ax0504m01.ic14", 0x4000000, 0x1000000, 0x7955b55a }, + { "ax0505m01.ic15", 0x5000000, 0x1000000, 0xe8ccc660 }, }, - NULL, + nullptr, &maxspeed_inputs }, // Metal Slug 6 { "mslug6", - NULL, + nullptr, "Metal Slug 6", 0xc000000, 0x82, @@ -6297,12 +6667,11 @@ const Game Games[] = AW, ROT0, { - { "ax3001p01.fmem1", 0x0000000, 0x0800000 }, - { "ax3001m01.mrom1", 0x2000000, 0x2000000 }, - { "ax3002m01.mrom2", 0x4000000, 0x2000000 }, - { "ax3003m01.mrom3", 0x6000000, 0x2000000 }, - { "ax3004m01.mrom4", 0xa000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax3001p01.fmem1", 0x0000000, 0x0800000, 0xaf67dbce }, + { "ax3001m01.mrom1", 0x2000000, 0x2000000, 0xe56417ee }, + { "ax3002m01.mrom2", 0x4000000, 0x2000000, 0x1be3bbc1 }, + { "ax3003m01.mrom3", 0x6000000, 0x2000000, 0x4fe37370 }, + { "ax3004m01.mrom4", 0xa000000, 0x2000000, 0x2f4c4c6f }, }, nullptr, &mslug6_inputs, @@ -6310,7 +6679,7 @@ const Game Games[] = // NeoGeo Battle Coliseum { "ngbc", - NULL, + nullptr, "NeoGeo Battle Coliseum", 0x14000000, 0xa0, @@ -6318,17 +6687,16 @@ const Game Games[] = AW, ROT0, { - { "ax3301en_p01.fmem1", 0x00000000, 0x0800000 }, - { "ax3301m01.mrom1", 0x02000000, 0x2000000 }, - { "ax3302m01.mrom2", 0x04000000, 0x2000000 }, - { "ax3303m01.mrom3", 0x06000000, 0x2000000 }, - { "ax3304m01.mrom4", 0x0a000000, 0x2000000 }, - { "ax3305m01.mrom5", 0x0c000000, 0x2000000 }, - { "ax3306m01.mrom6", 0x0e000000, 0x2000000 }, - { "ax3307m01.mrom7", 0x12000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax3301en_p01.fmem1", 0x00000000, 0x0800000, 0xf7e24e67 }, + { "ax3301m01.mrom1", 0x02000000, 0x2000000, 0xe6013de9 }, + { "ax3302m01.mrom2", 0x04000000, 0x2000000, 0xf7cfef6c }, + { "ax3303m01.mrom3", 0x06000000, 0x2000000, 0x0cdf8647 }, + { "ax3304m01.mrom4", 0x0a000000, 0x2000000, 0x2f031db0 }, + { "ax3305m01.mrom5", 0x0c000000, 0x2000000, 0xf6668aaa }, + { "ax3306m01.mrom6", 0x0e000000, 0x2000000, 0x5cf32fbd }, + { "ax3307m01.mrom7", 0x12000000, 0x2000000, 0x26d9da53 }, }, - NULL, + nullptr, &ngbc_inputs, }, // NeoGeo Battle Coliseum (Japan) @@ -6342,23 +6710,22 @@ const Game Games[] = AW, ROT0, { - { "ax3301p01.fmem1", 0x00000000, 0x0800000 }, - { "ax3301m01.mrom1", 0x02000000, 0x2000000 }, - { "ax3302m01.mrom2", 0x04000000, 0x2000000 }, - { "ax3303m01.mrom3", 0x06000000, 0x2000000 }, - { "ax3304m01.mrom4", 0x0a000000, 0x2000000 }, - { "ax3305m01.mrom5", 0x0c000000, 0x2000000 }, - { "ax3306m01.mrom6", 0x0e000000, 0x2000000 }, - { "ax3307m01.mrom7", 0x12000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax3301p01.fmem1", 0x00000000, 0x0800000, 0x6dd78275 }, + { "ax3301m01.mrom1", 0x02000000, 0x2000000, 0xe6013de9 }, + { "ax3302m01.mrom2", 0x04000000, 0x2000000, 0xf7cfef6c }, + { "ax3303m01.mrom3", 0x06000000, 0x2000000, 0x0cdf8647 }, + { "ax3304m01.mrom4", 0x0a000000, 0x2000000, 0x2f031db0 }, + { "ax3305m01.mrom5", 0x0c000000, 0x2000000, 0xf6668aaa }, + { "ax3306m01.mrom6", 0x0e000000, 0x2000000, 0x5cf32fbd }, + { "ax3307m01.mrom7", 0x12000000, 0x2000000, 0x26d9da53 }, }, - NULL, + nullptr, &ngbc_inputs, }, // Ranger Mission { "rangrmsn", - NULL, + nullptr, "Ranger Mission", 0x8000000, 0x88, @@ -6366,19 +6733,20 @@ const Game Games[] = AW, ROT0, { - { "ax1601p01.ic18", 0x0000000, 0x0800000 }, - { "ax1601m01.ic11", 0x1000000, 0x1000000 }, - { "ax1602m01.ic12", 0x2000000, 0x1000000 }, - { "ax1603m01.ic13", 0x3000000, 0x1000000 }, - { "ax1604m01.ic14", 0x4000000, 0x1000000 }, - { "ax1605m01.ic15", 0x5000000, 0x1000000 }, - { NULL, 0, 0 }, - } + { "ax1601p01.ic18", 0x0000000, 0x0800000, 0x00a74fbb }, + { "ax1601m01.ic11", 0x1000000, 0x1000000, 0xf34eed33 }, + { "ax1602m01.ic12", 0x2000000, 0x1000000, 0xa7d59efb }, + { "ax1603m01.ic13", 0x3000000, 0x1000000, 0x7c0aa241 }, + { "ax1604m01.ic14", 0x4000000, 0x1000000, 0xd2369144 }, + { "ax1605m01.ic15", 0x5000000, 0x1000000, 0x0c11c1f9 }, + }, + nullptr, + &aw_lightgun_inputs, }, // The Rumble Fish { "rumblef", - NULL, + nullptr, "The Rumble Fish", 0x8000000, 0xaa, @@ -6386,15 +6754,14 @@ const Game Games[] = AW, ROT0, { - { "ax1801p01.ic18", 0x0000000, 0x0800000 }, - { "ax1801m01.ic11", 0x1000000, 0x1000000 }, - { "ax1802m01.ic12", 0x2000000, 0x1000000 }, - { "ax1803m01.ic13", 0x3000000, 0x1000000 }, - { "ax1804m01.ic14", 0x4000000, 0x1000000 }, - { "ax1805m01.ic15", 0x5000000, 0x1000000 }, - { "ax1806m01.ic16", 0x6000000, 0x1000000 }, - { "ax1807m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, + { "ax1801p01.ic18", 0x0000000, 0x0800000, 0x2f7fb163 }, + { "ax1801m01.ic11", 0x1000000, 0x1000000, 0xc38aa61c }, + { "ax1802m01.ic12", 0x2000000, 0x1000000, 0x72e0ebc8 }, + { "ax1803m01.ic13", 0x3000000, 0x1000000, 0xd0f59d98 }, + { "ax1804m01.ic14", 0x4000000, 0x1000000, 0x15595cba }, + { "ax1805m01.ic15", 0x5000000, 0x1000000, 0x3d3f8e0d }, + { "ax1806m01.ic16", 0x6000000, 0x1000000, 0xac2751bb }, + { "ax1807m01.ic17", 0x7000000, 0x1000000, 0x3b2fbdb0 }, }, nullptr, &rumblef_inputs, @@ -6410,23 +6777,22 @@ const Game Games[] = AW, ROT0, { - { "ic12", 0x00000000, 0x00800000 }, - { "ic13", 0x00800000, 0x00800000 }, - { "ic14", 0x01000000, 0x00800000 }, - { "ic15", 0x01800000, 0x00800000 }, - { "ic16", 0x02000000, 0x00800000 }, - { "ic17", 0x02800000, 0x00800000 }, - { "ic18", 0x03000000, 0x00800000 }, - { "ic19", 0x03800000, 0x00800000 }, - { "ic20", 0x04000000, 0x00800000 }, - { "ic21", 0x04800000, 0x00800000 }, - { "ic22", 0x05000000, 0x00800000 }, - { "ic23", 0x05800000, 0x00800000 }, - { "ic24", 0x06000000, 0x00800000 }, - { "ic25", 0x06800000, 0x00800000 }, - { "ic26", 0x07000000, 0x00800000 }, + { "ic12", 0x00000000, 0x00800000, 0x79866072 }, + { "ic13", 0x00800000, 0x00800000, 0x5630bc83 }, + { "ic14", 0x01000000, 0x00800000, 0xbcd49846 }, + { "ic15", 0x01800000, 0x00800000, 0x61257cfb }, + { "ic16", 0x02000000, 0x00800000, 0xc2eb7c61 }, + { "ic17", 0x02800000, 0x00800000, 0xdcf673d3 }, + { "ic18", 0x03000000, 0x00800000, 0x72c066bb }, + { "ic19", 0x03800000, 0x00800000, 0xb20bf301 }, + { "ic20", 0x04000000, 0x00800000, 0xd27e7393 }, + { "ic21", 0x04800000, 0x00800000, 0xc2da1ecf }, + { "ic22", 0x05000000, 0x00800000, 0x730e0e1c }, + { "ic23", 0x05800000, 0x00800000, 0xd93afcac }, + { "ic24", 0x06000000, 0x00800000, 0x262d97b9 }, + { "ic25", 0x06800000, 0x00800000, 0xe45cf169 }, + { "ic26", 0x07000000, 0x00800000, 0x6421720d }, // IC27 populated, empty - { NULL, 0, 0 }, }, nullptr, &rumblef_inputs, @@ -6434,7 +6800,7 @@ const Game Games[] = // The Rumble Fish 2 { "rumblef2", - NULL, + nullptr, "The Rumble Fish 2", 0xe000000, 0x07, @@ -6442,13 +6808,12 @@ const Game Games[] = AW, ROT0, { - { "ax3401p01.fmem1", 0x0000000, 0x0800000 }, - { "ax3401m01.mrom1", 0x2000000, 0x2000000 }, - { "ax3402m01.mrom2", 0x4000000, 0x2000000 }, - { "ax3403m01.mrom3", 0x6000000, 0x2000000 }, - { "ax3404m01.mrom4", 0xa000000, 0x2000000 }, - { "ax3405m01.mrom5", 0xc000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax3401p01.fmem1", 0x0000000, 0x0800000, 0xa33601cf }, + { "ax3401m01.mrom1", 0x2000000, 0x2000000, 0x60894d4c }, + { "ax3402m01.mrom2", 0x4000000, 0x2000000, 0xe4224cc9 }, + { "ax3403m01.mrom3", 0x6000000, 0x2000000, 0x081c0edb }, + { "ax3404m01.mrom4", 0xa000000, 0x2000000, 0xa426b443 }, + { "ax3405m01.mrom5", 0xc000000, 0x2000000, 0x4766ce56 }, }, nullptr, &rumblef_inputs, @@ -6464,23 +6829,22 @@ const Game Games[] = AW, ROT0, { - { "ic12", 0x00000000, 0x00800000 }, - { "ic13", 0x00800000, 0x00800000 }, - { "ic14", 0x01000000, 0x00800000 }, - { "ic15", 0x01800000, 0x00800000 }, - { "ic16", 0x02000000, 0x00800000 }, - { "ic17", 0x02800000, 0x00800000 }, - { "ic18", 0x03000000, 0x00800000 }, - { "ic19", 0x03800000, 0x00800000 }, - { "ic20", 0x04000000, 0x00800000 }, - { "ic21", 0x04800000, 0x00800000 }, - { "ic22", 0x05000000, 0x00800000 }, - { "ic23", 0x05800000, 0x00800000 }, - { "ic24", 0x06000000, 0x00800000 }, - { "ic25", 0x06800000, 0x00800000 }, - { "ic26", 0x07000000, 0x00800000 }, + { "ic12", 0x00000000, 0x00800000, 0x1a0e74ab }, + { "ic13", 0x00800000, 0x00800000, 0x5630bc83 }, + { "ic14", 0x01000000, 0x00800000, 0x7fcfc59c }, + { "ic15", 0x01800000, 0x00800000, 0xeee00692 }, + { "ic16", 0x02000000, 0x00800000, 0xcd029db9 }, + { "ic17", 0x02800000, 0x00800000, 0x223a5b58 }, + { "ic18", 0x03000000, 0x00800000, 0x5e2d2f67 }, + { "ic19", 0x03800000, 0x00800000, 0x3cfb2adc }, + { "ic20", 0x04000000, 0x00800000, 0x2c216a05 }, + { "ic21", 0x04800000, 0x00800000, 0x79540865 }, + { "ic22", 0x05000000, 0x00800000, 0xc91d95a0 }, + { "ic23", 0x05800000, 0x00800000, 0x5c39ca18 }, + { "ic24", 0x06000000, 0x00800000, 0x858d2775 }, + { "ic25", 0x06800000, 0x00800000, 0x975d35fb }, + { "ic26", 0x07000000, 0x00800000, 0xff9a2c4c }, // IC27 populated, empty - { NULL, 0, 0 }, }, nullptr, &rumblef_inputs, @@ -6488,7 +6852,7 @@ const Game Games[] = // Net Select: Salaryman Kintaro { "salmankt", - NULL, + nullptr, "Net Select: Salaryman Kintaro", 0x9000000, 0x77, @@ -6496,21 +6860,22 @@ const Game Games[] = AW, ROT0, { - { "ax1401p01.ic18", 0x0000000, 0x0800000 }, - { "ax1401m01.ic11", 0x1000000, 0x1000000 }, - { "ax1402m01.ic12", 0x2000000, 0x1000000 }, - { "ax1403m01.ic13", 0x3000000, 0x1000000 }, - { "ax1404m01.ic14", 0x4000000, 0x1000000 }, - { "ax1405m01.ic15", 0x5000000, 0x1000000 }, - { "ax1406m01.ic16", 0x6000000, 0x1000000 }, - { "ax1407m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, - } + { "ax1401p01.ic18", 0x0000000, 0x0800000, 0x28d779e0 }, + { "ax1401m01.ic11", 0x1000000, 0x1000000, 0xfd7af845 }, + { "ax1402m01.ic12", 0x2000000, 0x1000000, 0xf6006f85 }, + { "ax1403m01.ic13", 0x3000000, 0x1000000, 0x074f7c4b }, + { "ax1404m01.ic14", 0x4000000, 0x1000000, 0xaf4e3829 }, + { "ax1405m01.ic15", 0x5000000, 0x1000000, 0xb548446f }, + { "ax1406m01.ic16", 0x6000000, 0x1000000, 0x437673e6 }, + { "ax1407m01.ic17", 0x7000000, 0x1000000, 0x6b6acc0a }, + }, + nullptr, + nullptr, // TODO }, // Samurai Shodown VI / Samurai Spirits Tenkaichi Kenkakuden { "samsptk", - NULL, + nullptr, "Samurai Shodown VI", 0x14000000, 0x1d, @@ -6518,23 +6883,22 @@ const Game Games[] = AW, ROT0, { - { "ax2901p01.fmem1", 0x00000000, 0x0800000 }, - { "ax2901m01.mrom1", 0x02000000, 0x2000000 }, - { "ax2902m01.mrom2", 0x04000000, 0x2000000 }, - { "ax2903m01.mrom3", 0x06000000, 0x2000000 }, - { "ax2904m01.mrom4", 0x0a000000, 0x2000000 }, - { "ax2905m01.mrom5", 0x0c000000, 0x2000000 }, - { "ax2906m01.mrom6", 0x0e000000, 0x2000000 }, - { "ax2907m01.mrom7", 0x12000000, 0x2000000 }, - { NULL, 0, 0 }, + { "ax2901p01.fmem1", 0x00000000, 0x0800000, 0x58e0030b }, + { "ax2901m01.mrom1", 0x02000000, 0x2000000, 0xdbbbd90d }, + { "ax2902m01.mrom2", 0x04000000, 0x2000000, 0xa3bd7890 }, + { "ax2903m01.mrom3", 0x06000000, 0x2000000, 0x56f50fdd }, + { "ax2904m01.mrom4", 0x0a000000, 0x2000000, 0x8a3ae175 }, + { "ax2905m01.mrom5", 0x0c000000, 0x2000000, 0x429877ba }, + { "ax2906m01.mrom6", 0x0e000000, 0x2000000, 0xcb95298d }, + { "ax2907m01.mrom7", 0x12000000, 0x2000000, 0x48015081 }, }, - NULL, + nullptr, &samsptk_inputs, }, // Sports Shooting USA { "sprtshot", - NULL, + nullptr, "Sports Shooting USA", 0x8000000, 0x64, @@ -6542,18 +6906,19 @@ const Game Games[] = AW, ROT0, { - { "ax0101p01.ic18", 0x0000000, 0x0800000 }, - { "ax0101m01.ic11", 0x1000000, 0x1000000 }, - { "ax0102m01.ic12", 0x2000000, 0x1000000 }, - { "ax0103m01.ic13", 0x3000000, 0x1000000 }, - { "ax0104m01.ic14", 0x4000000, 0x1000000 }, - { NULL, 0, 0 }, - } + { "ax0101p01.ic18", 0x0000000, 0x0800000, 0xb3642b5d }, + { "ax0101m01.ic11", 0x1000000, 0x1000000, 0x1e39184d }, + { "ax0102m01.ic12", 0x2000000, 0x1000000, 0x700764d1 }, + { "ax0103m01.ic13", 0x3000000, 0x1000000, 0x6144e7a8 }, + { "ax0104m01.ic14", 0x4000000, 0x1000000, 0xccb72150 }, + }, + nullptr, + &aw_lightgun_inputs, // PUMP is mercury sensor when gun is pointing down }, // Sushi Bar { "sushibar", - NULL, + nullptr, "Sushi Bar", 0x8000000, 0x25, @@ -6561,19 +6926,19 @@ const Game Games[] = AW, ROT0, { - { "ic12", 0x00000000, 0x00800000 }, - { "ic14", 0x01000000, 0x00800000 }, - { "ic15", 0x01800000, 0x00800000 }, - { "ic16", 0x02000000, 0x00800000 }, - { "ic17", 0x02800000, 0x00800000 }, - { "ic18", 0x03000000, 0x00800000 }, - { NULL, 0, 0 }, + { "ic12", 0x00000000, 0x00800000, 0x06a2ed58 }, + // IC 13 populated, empty + { "ic14", 0x01000000, 0x00800000, 0x4860f944 }, + { "ic15", 0x01800000, 0x00800000, 0x7113506c }, + { "ic16", 0x02000000, 0x00800000, 0x77e8e39e }, + { "ic17", 0x02800000, 0x00800000, 0x0eba54ea }, + { "ic18", 0x03000000, 0x00800000, 0xb9957c76 }, } }, // Net Select Horse Racing: Victory Furlong" { "vfurlong", - NULL, + nullptr, "Net Select Horse Racing: Victory Furlong", 0x9000000, 0xdb, @@ -6581,21 +6946,22 @@ const Game Games[] = AW, ROT0, { - { "ax2001p01.ic18", 0x0000000, 0x0800000 }, - { "ax2001m01.ic11", 0x1000000, 0x1000000 }, - { "ax2002m01.ic12", 0x2000000, 0x1000000 }, - { "ax2003m01.ic13", 0x3000000, 0x1000000 }, - { "ax2004m01.ic14", 0x4000000, 0x1000000 }, - { "ax2005m01.ic15", 0x5000000, 0x1000000 }, - { "ax2006m01.ic16", 0x6000000, 0x1000000 }, - { "ax2007m01.ic17", 0x7000000, 0x1000000 }, - { NULL, 0, 0 }, - } + { "ax2001p01.ic18", 0x0000000, 0x0800000, 0x17ea9aa9 }, + // same as above except for Customer ID, included for reference + // { "ax2001p01_alt.ic18", 0x0000000, 0x0800000, 0x845399dd }, + { "ax2001m01.ic11", 0x1000000, 0x1000000, 0x64460b24 }, + { "ax2002m01.ic12", 0x2000000, 0x1000000, 0xd4da357f }, + { "ax2003m01.ic13", 0x3000000, 0x1000000, 0xaa1e1246 }, + { "ax2004m01.ic14", 0x4000000, 0x1000000, 0x4d555d7c }, + { "ax2005m01.ic15", 0x5000000, 0x1000000, 0x785208e2 }, + { "ax2006m01.ic16", 0x6000000, 0x1000000, 0x8134ec55 }, + { "ax2007m01.ic17", 0x7000000, 0x1000000, 0xd0557e8a }, + }, }, // WaiWai Drive { "waidrive", - NULL, + nullptr, "WaiWai Drive", 0x4000000, 0x45, @@ -6603,15 +6969,14 @@ const Game Games[] = AW, ROT270, { - { "u3", 0x0000000, 0x1000000 }, - { "u1", 0x1000000, 0x1000000 }, - { NULL, 0, 0 }, + { "u3", 0x0000000, 0x1000000, 0x7acfb499 }, + { "u1", 0x1000000, 0x1000000, 0xb3c1c3bb }, } }, // Extreme Hunting { "xtrmhunt", - NULL, + nullptr, "Extreme Hunting", 0x8000000, 0xe4, @@ -6619,19 +6984,21 @@ const Game Games[] = AW, ROT0, { - { "ax2401p01.ic18", 0x0000000, 0x0800000 }, - { "ax2401m01.ic11", 0x1000000, 0x1000000 }, - { "ax2402m01.ic12", 0x2000000, 0x1000000 }, - { "ax2403m01.ic13", 0x3000000, 0x1000000 }, - { "ax2404m01.ic14", 0x4000000, 0x1000000 }, - { "ax2405m01.ic15", 0x5000000, 0x1000000 }, - { "ax2406m01.ic16", 0x6000000, 0x1000000 }, - } + { "ax2401p01.ic18", 0x0000000, 0x0800000, 0x8e2a11f5 }, + { "ax2401m01.ic11", 0x1000000, 0x1000000, 0x76dbc286 }, + { "ax2402m01.ic12", 0x2000000, 0x1000000, 0xcd590ea2 }, + { "ax2403m01.ic13", 0x3000000, 0x1000000, 0x06f62eb5 }, + { "ax2404m01.ic14", 0x4000000, 0x1000000, 0x759ef5cb }, + { "ax2405m01.ic15", 0x5000000, 0x1000000, 0x940d77f1 }, + { "ax2406m01.ic16", 0x6000000, 0x1000000, 0xcbcf2c5d }, + }, + nullptr, + &aw_lightgun_inputs, }, // Extreme Hunting 2 { "xtrmhnt2", - NULL, + nullptr, "Extreme Hunting 2", 0x8000000, 0x2a, @@ -6639,21 +7006,21 @@ const Game Games[] = AW, ROT0, { - { "610-0752.u3", 0x0000000, 0x1000000 }, - { "610-0752.u1", 0x1000000, 0x1000000 }, - { "610-0752.u4", 0x2000000, 0x1000000 }, - { "610-0752.u2", 0x3000000, 0x1000000 }, - { "610-0752.u15", 0x4000000, 0x1000000 }, - { "610-0752.u17", 0x5000000, 0x1000000 }, - { "610-0752.u14", 0x6000000, 0x1000000 }, - { "610-0752.u16", 0x7000000, 0x1000000 }, + { "610-0752.u3", 0x0000000, 0x1000000, 0xbab6182e }, + { "610-0752.u1", 0x1000000, 0x1000000, 0x3086bc47 }, + { "610-0752.u4", 0x2000000, 0x1000000, 0x9787f145 }, + { "610-0752.u2", 0x3000000, 0x1000000, 0xd3a88b31 }, + { "610-0752.u15", 0x4000000, 0x1000000, 0x864a6342 }, + { "610-0752.u17", 0x5000000, 0x1000000, 0xa79fb1fa }, + { "610-0752.u14", 0x6000000, 0x1000000, 0xce83bcc7 }, + { "610-0752.u16", 0x7000000, 0x1000000, 0x8ac71c76 }, //ROM_REGION( 0x1400000, "network", 0) // network board //ROM_LOAD( "fpr-24330a.ic2", 0x000000, 0x400000, CRC(8d89877e) SHA1(6caafc49114eb0358e217bc2d1a3ab58a93c8d19) ) //ROM_LOAD( "flash128.ic4s", 0x400000, 0x1000000, CRC(866ed675) SHA1(2c4c06935b7ab1876e640cede51713b841833567) ) - - { NULL, 0, 0 }, - } + }, + nullptr, + &aw_lightgun_inputs, }, // // Naomi 2 @@ -6680,7 +7047,9 @@ const Game Games[] = { "mpr-23660.ic9", 0x8800000, 0x1000000, 0xe49e65f5 }, { "mpr-23661.ic10", 0x9800000, 0x1000000, 0x7d44dc74 }, { "mpr-23662.ic11", 0xa800000, 0x0800000, 0xd6ef7d68 }, - } + }, + nullptr, + &vs2_2k_inputs, }, { "vstrik3c", @@ -6704,7 +7073,9 @@ const Game Games[] = { "mpr-23660.ic9", 0x8800000, 0x1000000, 0xe49e65f5 }, { "mpr-23661.ic10", 0x9800000, 0x1000000, 0x7d44dc74 }, { "mpr-23662.ic11", 0xa800000, 0x0800000, 0xd6ef7d68 }, - } + }, + nullptr, + &vs2_2k_inputs, }, { "wldrider", @@ -6753,7 +7124,9 @@ const Game Games[] = { "mpr-23782.ic9", 0x8800000, 0x1000000, 0x4f72e901 }, { "mpr-23783.ic10", 0x9800000, 0x1000000, 0xc8d4f6f9 }, { "mpr-23784.ic11", 0xa800000, 0x1000000, 0xf74f2fee }, - } + }, + nullptr, + &vf4_inputs, }, { "kingrt66", @@ -6876,7 +7249,7 @@ const Game Games[] = { "copy", 0x400000, 0xc00000, 0x00000000, Copy, 0x1000000 }, }, nullptr, - nullptr, + &vf4_inputs, vf4evo_eeprom_dump, }, { @@ -6904,7 +7277,7 @@ const Game Games[] = }, nullptr, &clubkart_inputs, - clubkrt_eeprom_dump, + nullptr, }, { "clubkrta", @@ -6931,7 +7304,7 @@ const Game Games[] = }, nullptr, &clubkart_inputs, - clubkrt_eeprom_dump, + nullptr, }, { "clubkrtc", @@ -6958,7 +7331,7 @@ const Game Games[] = }, nullptr, &clubkart_inputs, - clubkrt_eeprom_dump, + nullptr, }, { "clubkrt", @@ -6985,7 +7358,7 @@ const Game Games[] = }, nullptr, &clubkart_inputs, - clubkrt_eeprom_dump, + nullptr, }, { "clubkprz", @@ -7051,6 +7424,37 @@ const Game Games[] = nullptr, &clubkart_inputs, }, + { + "clubkpzbp", + "clubkpzb", + "Club Kart Prize (Ver. B prototype)", + 0xa000000, + 0xffffffff, + "naomi2", + M2, + ROT0, + { + { "rom0.ic22", 0x0000000, 0x400000, 0xe958f9e0 }, + { "rom2.ic2s", 0x1000000, 0x800000, 0xd4ef582c }, + { "rom3.ic3s", 0x1800000, 0x800000, 0x6302239e }, + { "rom4.ic4s", 0x2000000, 0x800000, 0x4f5e9426 }, + { "rom5.ic5s", 0x2800000, 0x800000, 0x7bb189ea }, + { "rom6.ic6s", 0x3000000, 0x800000, 0x5a256041 }, + { "rom7.ic7s", 0x3800000, 0x800000, 0x82bc57c3 }, + { "rom8.ic8s", 0x4000000, 0x800000, 0x71d7259a }, + { "rom9.ic9s", 0x4800000, 0x800000, 0x98663de6 }, + { "rom10.ic10s", 0x5000000, 0x800000, 0x0786f88e }, + { "rom11.ic11s", 0x5800000, 0x800000, 0x259b7dd5 }, + { "rom12.ic12s", 0x6000000, 0x800000, 0xf2de41b8 }, + { "rom13.ic13s", 0x6800000, 0x800000, 0x2e00966e }, + { "rom14.ic14s", 0x7000000, 0x800000, 0xc428e593 }, + { "rom15.ic15s", 0x7800000, 0x800000, 0xc196ac29 }, + { "rom16.ic16s", 0x8000000, 0x800000, 0x538827ca }, + { "rom17.ic17s", 0x8800000, 0x800000, 0xfbff0538 }, + }, + nullptr, + &clubkart_inputs, + }, { "clubk2k3", nullptr, @@ -7157,6 +7561,7 @@ const Game Games[] = nullptr, &clubkart_inputs, }, +#ifdef NAOMI_MULTIBOARD { "sgdrvsim", nullptr, @@ -7182,6 +7587,7 @@ const Game Games[] = &drvsim_inputs, sgdrvsim_eeprom_dump, }, +#endif // // Naomi 2 GD-ROM // @@ -7198,6 +7604,7 @@ const Game Games[] = { "317-0304-com.bin", 0, 0x4000, 0x8e82d17a }, }, "gds-0006", + &vs2_2k_inputs, }, { "vf4o", @@ -7212,7 +7619,7 @@ const Game Games[] = { "317-0314-com.pic", 0, 0x4000, 0xfa0b6c70 }, }, "gds-0012", - nullptr, + &vf4_inputs, vf4_eeprom_dump }, { @@ -7228,7 +7635,7 @@ const Game Games[] = { "317-0314-com.pic", 0, 0x4000, 0xfa0b6c70 }, }, "gds-0012b", - nullptr, + &vf4_inputs, vf4_eeprom_dump }, { @@ -7244,7 +7651,7 @@ const Game Games[] = { "317-0314-com.pic", 0, 0x4000, 0xfa0b6c70 }, }, "gds-0012c", - nullptr, + &vf4_inputs, vf4_eeprom_dump }, { @@ -7260,6 +7667,7 @@ const Game Games[] = { "317-0317-com.pic", 0, 0x4000, 0xef65fe73 }, }, "gds-0014", + &beachspi_inputs, }, { "initd", @@ -7304,7 +7712,7 @@ const Game Games[] = { "317-0338-jpn.pic", 0, 0x4000, 0xb177ba7d }, }, "gds-0024c", - nullptr, + &vf4_inputs, vf4evo_eeprom_dump, }, { @@ -7320,7 +7728,7 @@ const Game Games[] = { "317-0338-jpn.pic", 0, 0x4000, 0xb177ba7d }, }, "gds-0024b", - nullptr, + &vf4_inputs, vf4evo_eeprom_dump, }, { @@ -7336,7 +7744,7 @@ const Game Games[] = { "317-0338-jpn.pic", 0, 0x4000, 0xb177ba7d }, }, "gds-0024a", - nullptr, + &vf4_inputs, vf4evo_eeprom_dump, }, { @@ -7517,7 +7925,7 @@ const Game Games[] = { "317-0387-com.pic", 0, 0x4000, 0x8728aeaa }, }, "gds-0036f", - nullptr, + &vf4_inputs, vf4tuned_eeprom_dump, }, { @@ -7533,7 +7941,7 @@ const Game Games[] = { "317-0387-com.pic", 0, 0x4000, 0x8728aeaa }, }, "gds-0036d", - nullptr, + &vf4_inputs, vf4tuned_eeprom_dump, }, { @@ -7549,7 +7957,7 @@ const Game Games[] = { "317-0387-com.pic", 0, 0x4000, 0x8728aeaa }, }, "gds-0036a", - nullptr, + &vf4_inputs, vf4tuned_eeprom_dump, }, { @@ -7581,6 +7989,448 @@ const Game Games[] = }, "gds-0039a", &initd_inputs, + }, + // + // System SP Games + // + { + // Brick People / Block PeePoo (Ver 1.002) + "brickppl", + nullptr, + "Brick People / Block PeePoo", + 0x20000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0xd79afdb6 }, + { "ic63", 0x04000000, 0x4000000, 0x4f3c0937 }, + { "ic64", 0x08000000, 0x4000000, 0x383e90d9 }, + { "ic65", 0x0c000000, 0x4000000, 0x4c29b5ac }, + { "317-0558-com.ic15", 0, 0x800, 0x7592d004, Key }, + }, + }, + { + "bingogal", + nullptr, + "Bingo Galaxy (main)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x01000000, 0xc07d9870 }, + { "ic63", 0x01000000, 0x01000000, 0x5d85e6c0 }, + { "ic64", 0x02000000, 0x01000000, 0x73134f52 }, + { "ic65", 0x03000000, 0x01000000, 0x1e4ae511 }, + { "ic66s", 0x04000000, 0x01000000, 0x810d5dfc }, + { "ic67s", 0x05000000, 0x01000000, 0x92014e31 }, + { "ic68s", 0x06000000, 0x01000000, 0x0640172c }, + { "ic69s", 0x07000000, 0x01000000, 0xca26fbf9 }, + { "317-0513-jpn.ic15", 0, 0x800, 0x778dc297, Key }, + }, + }, + { + "bingogals", + nullptr, + "Bingo Galaxy (satellite)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x01000000, 0x880eb905 }, + { "ic63", 0x01000000, 0x01000000, 0x41dab407 }, + { "ic64", 0x02000000, 0x01000000, 0x97dfb2ab }, + }, + }, + { + "dinoking", + nullptr, + "Dinosaur King (USA)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x01000000, 0x8bd18bf7 }, + { "ic63", 0x01000000, 0x01000000, 0x8e8c8d1b }, + { "ic64", 0x02000000, 0x01000000, 0x01b32ff7 }, + { "ic65", 0x03000000, 0x01000000, 0x4b60cdb3 }, + { "ic66s", 0x04000000, 0x01000000, 0xee3c278e }, + { "ic67s", 0x05000000, 0x01000000, 0x42441393 }, + { "ic68s", 0x06000000, 0x01000000, 0x4a787a44 }, + { "ic69s", 0x07000000, 0x01000000, 0xc78e46c2 }, + { "317-0408-com.ic15", 0, 0x800, 0xf77c49dc, Key }, + }, + nullptr, + &dinok_inputs, + }, + { + "galilfac", + nullptr, + "Galileo Factory (main)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x37fda864 }, + { "ic63", 0x04000000, 0x4000000, 0xc16707a7 }, + { "317-unk-jpn.ic15", 0, 0x800, 0xf2233b04, Key }, + }, + }, + { + "isshoni", + nullptr, + "Isshoni Wanwan Waiwai Puppy 2008", + 0x20000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x82a71af8 }, + { "ic63", 0x04000000, 0x4000000, 0xd4f65679 }, + { "ic64", 0x08000000, 0x4000000, 0x28c764c8 }, + { "ic65", 0x0c000000, 0x4000000, 0x906e7df8 }, + { "ic66s", 0x10000000, 0x4000000, 0x7815e178 }, + { "ic67s", 0x14000000, 0x4000000, 0x8d2c6567 }, + { "ic68s", 0x18000000, 0x4000000, 0xd8213da3 }, + { "317-0496-jpn.ic15", 0, 0x800, 0x7bca4250, Key }, + }, + }, + { + // Yataimura Kingyosukui (1-player, Japan, Ver 1.005) + "kingyo", + nullptr, + "Yataimura Kingyosukui", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x01000000, 0x02f8ee37 }, + { "ic63", 0x01000000, 0x01000000, 0x98b1738a }, + { "ic64", 0x02000000, 0x01000000, 0x27998de0 }, + { "ic65", 0x03000000, 0x01000000, 0x548b3a81 }, + { "317-5151-jpn.ic15", 0, 0x800, 0xd29c911a, Key }, + }, + }, + { + // Love And Berry - 1st-2nd Collection (Export, v2.000) + "lovebery", + nullptr, + "Love And Berry - 1st-2nd Collection (Export)", + 0x20000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x1bd80ed0 }, + { "ic63", 0x04000000, 0x4000000, 0xd3870287 }, + { "317-0446-com.ic15", 0, 0x800, 0x9e519dc6, Key }, + }, + nullptr, + &lovebery_inputs, + }, + { + "lovebero", + "lovebery", + "Love And Berry - 1st-2nd Collection (Export, v1.003)", + 0x20000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0X0a23cea3 }, + { "ic63", 0x04000000, 0x4000000, 0xd3870287 }, + { "317-0446-com.ic15", 0, 0x800, 0x9e519dc6, Key }, + }, + nullptr, + &lovebery_inputs, + }, + { + "magicpop", + nullptr, + "Magical Poppins", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0xf52306db }, + { "ic63", 0x04000000, 0x4000000, 0x1e5bad78 }, + { "317-0474-jpn.ic15", 0, 0x800, 0x711ba0aa, Key }, + }, + }, + { + "manpuku", + nullptr, + "Manpuku Suizokukan", + 0x08000000, + 0x5502, // mame has 5508 + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x04000000, 0xa6712d70 }, + { "317-0640-jpn.ic15", 0, 0x800, 0x2fe1e48c, Key }, + }, + }, + { + "ochaken", + nullptr, + "Ocha-Ken Hot Medal", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x7eb89b69 }, + { "ic63", 0x04000000, 0x4000000, 0xe52d7885 }, + { "317-unknown.ic15", 0, 0x800, 0x0a6e8627, Key }, + }, + }, + { + "puyomedal", + nullptr, + "Puyo Puyo! The Medal Edition", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x4fcfb8c7 }, + { "ic63", 0x04000000, 0x4000000, 0x0db8a64a }, + { "317-0568-jpn.ic15", 0, 0x800, 0x313e6987, Key }, + }, + }, + { + // Yataimura Shateki (1-player, Japan, Ver 1.000) + "shateki", + nullptr, + "Yataimura Shateki", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x01000000, 0xc463ae32 }, + { "ic63", 0x01000000, 0x01000000, 0x2acf1456 }, + { "ic64", 0x02000000, 0x01000000, 0xfd04ebf8 }, + { "ic65", 0x03000000, 0x01000000, 0x0c0ed06b }, + { "ic66s", 0x04000000, 0x01000000, 0x3a9f33cc }, + { "ic67s", 0x05000000, 0x01000000, 0x8e08cf8b }, + { "ic68s", 0x06000000, 0x01000000, 0x14734999 }, + { "ic69s", 0x07000000, 0x01000000, 0x6c0cd4c5 }, + { "317-0628-jpn.ic15", 0, 0x800, 0xc02f7424, Key }, + }, + }, + { + // Tetris Giant / Tetris Dekaris (Ver.2.000) + "tetgiant", + nullptr, + "Tetris Giant / Tetris Dekaris", + 0x20000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x31ba1938 }, + { "ic63", 0x04000000, 0x4000000, 0xcb946213 }, + { "317-0604-com.ic15", 0, 0x800, 0xa46dfd47, Key }, + }, + nullptr, + &tetgiant_inputs, + }, + { + "unomedal", + nullptr, + "UNO the Medal", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x2af0cfb3 }, + { "ic63", 0x04000000, 0x4000000, 0xfe375da9 }, + { "317-0526-jpn.ic15", 0, 0x800, 0x14232fb7, Key }, + }, + }, + { + "westdrmg", + nullptr, + "Western Dream Gold", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "ic62", 0x00000000, 0x4000000, 0x67bde24c }, + { "ic63", 0x04000000, 0x4000000, 0xf5901eab }, + { "317-0473-jpn.ic15", 0, 0x800, 0x8ec686b0, Key }, + }, + }, + // Compact Flash roms + { + // Dinosaur King - Operation: Dinosaur Rescue (USA, Export) + "dinokior", + nullptr, + "Dinosaur King - Operation: Dinosaur Rescue (USA, Export)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "317-0408-com.ic15", 0, 0x800, 0xf77c49dc, Key }, + }, + "mda-c0021", + &dinok_inputs, + }, + { + // Dinosaur King - D-Team VS. the Alpha Fortress (Export, Ver 2.500) + "dinoki25", + nullptr, + "Dinosaur King - D-Team VS. the Alpha Fortress (Export)", + 0x08000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "317-0408-com.ic15", 0, 0x800, 0xf77c49dc, Key }, + }, + "mda-c0047", + &dinok_inputs, + }, + { + // Konglongwang - D-Kids VS Alpha Yaosai (China, Ver 2.501) + // This game's protection uses contact IC card reader made by Hirocon, with 2 IC card slots, cards probably SLE4428 or SLE5528. + "dinokich", + "dinoki25", + "Konglongwang - D-Kids VS Alpha Yaosai (China)", + 0x08000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "317-0408-com.ic15", 0, 0x800, 0xf77c49dc, Key }, + }, + "mda-c0081", + &dinok_inputs, + }, + { + // Kodai Ouja Kyouryuu King - Mezame yo! Arata-naru Chikara!! (Japan, Ver 4.000) + // This version does not use RFID readers and Management chips. + "dinoki4", + nullptr, + "Ancient Ruler Dinosaur King - Wake up! New Power!! (Japan)", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "317-0408-com.ic15", 0, 0x800, 0xf77c49dc, Key }, + }, + "mda-c0061", + &dinok_inputs, + }, + { + // Heat Up Hockey Image (Ver.1.003R) + "huhimage", + nullptr, + "Heat Up Hockey Image", + 0x08000000, + 0x5502, // mame has 5508 (8 * 512 Mb) but size is 128 MB + "segasp", + M4, + ROT270, + { + { "317-0606-jpn.ic15", 0, 0x800, 0x75638f59, Key }, + }, + "tsb0-sega00001", + }, + { + // Yataimura Kingyosukui (4-player, China, Ver 1.000) + "kingyoch", + "kingyo", + "Yataimura Kingyosukui (China)", + 0x08000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "317-0563-jpn.ic15", 0, 0x800, 0x8af67833, Key }, + }, + "kingyo", + }, + { + // Love And Berry - 3rd-5th Collection (USA, Export, Ver 1.002) + "loveber3", + nullptr, + "Love And Berry - 3rd-5th Collection (USA, Export)", + 0x08000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "317-0446-com.ic15", 0, 0x800, 0x9e519dc6, Key }, + }, + "mda-c0042", + &lovebery_inputs, + }, + { + // Love And Berry - 3rd-5th Collection (China, Ver 1.001) + // This game's protection uses contact IC card reader made by Hirocon, with 2 IC card slots, cards probably SLE4428 or SLE5528. + "loveber3cn", + "loveber3", + "Love And Berry - 3rd-5th Collection (China)", + 0x08000000, + 0x5508, + "segasp", + M4, + ROT0, + { + { "317-0446-com.ic15", 0, 0x800, 0x9e519dc6, Key }, + }, + "mda-c0071", + &lovebery_inputs, + }, + { + "tetgiano", + "tetgiant", + "Tetris Giant / Tetris Dekaris", + 0x08000000, + 0x5502, + "segasp", + M4, + ROT0, + { + { "317-0604-com.ic15", 0, 0x800, 0xa46dfd47, Key }, + }, + "mda-c0076", + &tetgiant_inputs, }, { nullptr diff --git a/core/hw/naomi/naomi_roms.h b/core/hw/naomi/naomi_roms.h index 43e0726ff..c67f78692 100644 --- a/core/hw/naomi/naomi_roms.h +++ b/core/hw/naomi/naomi_roms.h @@ -33,7 +33,8 @@ enum BlobType { InterleavedWord, Copy, Key, - Eeprom + Eeprom, + EepromBE16 }; enum CartridgeType { @@ -59,7 +60,9 @@ struct BIOS_t u32 offset; u32 length; u32 crc; + BlobType blob_type; } blobs[MAX_GAME_FILES]; + const char* filename; // if different from name }; extern const BIOS_t BIOS[]; diff --git a/core/hw/naomi/naomi_roms_eeprom.h b/core/hw/naomi/naomi_roms_eeprom.h index 34ba473a8..207f3110a 100644 --- a/core/hw/naomi/naomi_roms_eeprom.h +++ b/core/hw/naomi/naomi_roms_eeprom.h @@ -350,17 +350,6 @@ static u8 ggxxsla_eeprom_dump[] { 0x00, 0x00, }; -static u8 ikaruga_eeprom_dump[] { - 0x14, 0x7d, 0x01, 0x42, 0x45, 0x4a, 0x30, 0x09, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0x14, 0x7d, 0x01, 0x42, 0x45, 0x4a, 0x30, 0x09, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, -}; - static u8 jingystm_eeprom_dump[] { 0x11, 0x9d, 0x10, 0x42, 0x4d, 0x4a, 0x20, 0x09, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x9d, 0x10, 0x42, 0x4d, 0x4a, 0x20, 0x09, 0x10, 0x1a, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, @@ -583,18 +572,6 @@ static u8 tduno2_eeprom_dump[] { 0x63, 0x46, }; -// card reader disabled -static u8 clubkrt_eeprom_dump[] { - 0x95, 0x95, 0x10, 0x42, 0x44, 0x42, 0x31, 0x09, 0x00, 0x1A, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0x95, 0x95, 0x10, 0x42, 0x44, 0x42, 0x31, 0x09, 0x00, 0x1A, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, - 0x0C, 0xBA, 0x20, 0x20, 0x0C, 0xBA, 0x20, 0x20, 0x25, 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0xC0, 0x30, 0xC0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x25, 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x30, - 0xC0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, -}; - // card reader disabled static u8 clubk2k3_eeprom_dump[] { 0x73, 0x25, 0x10, 0x42, 0x48, 0x4C, 0x30, 0x09, 0x00, 0x1A, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, @@ -666,3 +643,34 @@ static u8 vf4tuned_eeprom_dump[] = { 0x51, 0x8d, 0x91, 0xd9, 0x21, 0x7c, 0x9c, 0xc8, 0xc3, 0xae, 0xe8, 0x4d, 0xeb, 0x10, 0x67, 0x9a, 0xd7, 0x02, 0x67, 0xd6 }; + +// correct coin assignment +static u8 manicpnc_eeprom_dump[128] = { + 0x22, 0x11, 0x10, 0x42, 0x4d, 0x4b, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x12, 0x12, 0x11, 0x11, + 0x22, 0x11, 0x10, 0x42, 0x4d, 0x4b, 0x30, 0x09, 0x10, 0x00, 0x01, 0x01, 0x01, 0x00, 0x12, 0x12, 0x11, 0x11, +}; + +// calibration done +static u8 crackndj_eeprom_dump[] = { + 0x4e, 0x8b, 0x10, 0x42, 0x43, 0x47, 0x30, 0x09, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x4e, 0x8b, 0x10, 0x42, 0x43, 0x47, 0x30, 0x09, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x5d, 0x2c, 0x24, 0x24, 0x5d, 0x2c, 0x24, 0x24, 0x00, 0x47, 0x43, 0x42, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x44, 0x4a, 0x20, 0x41, 0x4d, 0x33, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x47, 0x43, 0x42, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x44, 0x4a, 0x20, 0x41, 0x4d, 0x33, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +// calibration done +static u8 crakndj2_eeprom_dump[] = { + 0xa1, 0xab, 0x10, 0x42, 0x44, 0x4b, 0x30, 0x09, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xa1, 0xab, 0x10, 0x42, 0x44, 0x4b, 0x30, 0x09, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x11, 0x11, 0x11, 0x11, + 0xb4, 0xdd, 0x24, 0x24, 0xb4, 0xdd, 0x24, 0x24, 0x00, 0x4b, 0x44, 0x42, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x44, 0x4a, 0x20, 0x41, 0x4d, 0x33, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x4b, 0x44, 0x42, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x44, 0x4a, 0x20, 0x41, 0x4d, 0x33, 0x03, 0x00, 0x00, 0xfe, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + diff --git a/core/hw/naomi/naomi_roms_input.h b/core/hw/naomi/naomi_roms_input.h index 90bd77f5c..7151bfb4d 100644 --- a/core/hw/naomi/naomi_roms_input.h +++ b/core/hw/naomi/naomi_roms_input.h @@ -30,15 +30,25 @@ { NAOMI_TEST_KEY, "" }, \ { NAOMI_SERVICE_KEY, "" }, #define NAO_START_DESC { NAOMI_START_KEY, "" }, +#define NAO_DPAD_DESC { NAOMI_UP_KEY, "" }, \ + { NAOMI_DOWN_KEY, "" }, \ + { NAOMI_LEFT_KEY, "" }, \ + { NAOMI_RIGHT_KEY, "" }, \ + +#define INPUT_1_BUTTON(btn0) { \ + { \ + { NAOMI_BTN0_KEY, btn0 }, \ + NAO_DPAD_DESC \ + NAO_START_DESC \ + NAO_BASE_BTN_DESC \ + } \ +} #define INPUT_2_BUTTONS(btn0, btn1) { \ { \ { NAOMI_BTN0_KEY, btn0 }, \ { NAOMI_BTN1_KEY, btn1 }, \ - { NAOMI_UP_KEY, "" }, \ - { NAOMI_DOWN_KEY, "" }, \ - { NAOMI_LEFT_KEY, "" }, \ - { NAOMI_RIGHT_KEY, "" }, \ + NAO_DPAD_DESC \ NAO_START_DESC \ NAO_BASE_BTN_DESC \ } \ @@ -49,10 +59,7 @@ { NAOMI_BTN0_KEY, btn0 }, \ { NAOMI_BTN1_KEY, btn1 }, \ { NAOMI_BTN2_KEY, btn2 }, \ - { NAOMI_UP_KEY, "" }, \ - { NAOMI_DOWN_KEY, "" }, \ - { NAOMI_LEFT_KEY, "" }, \ - { NAOMI_RIGHT_KEY, "" }, \ + NAO_DPAD_DESC \ NAO_START_DESC \ NAO_BASE_BTN_DESC \ } \ @@ -64,10 +71,7 @@ { NAOMI_BTN1_KEY, btn1 }, \ { NAOMI_BTN2_KEY, btn2 }, \ { NAOMI_BTN3_KEY, btn3 }, \ - { NAOMI_UP_KEY, "" }, \ - { NAOMI_DOWN_KEY, "" }, \ - { NAOMI_LEFT_KEY, "" }, \ - { NAOMI_RIGHT_KEY, "" }, \ + NAO_DPAD_DESC \ NAO_START_DESC \ NAO_BASE_BTN_DESC \ } \ @@ -80,15 +84,18 @@ { NAOMI_BTN2_KEY, btn2 }, \ { NAOMI_BTN3_KEY, btn3 }, \ { NAOMI_BTN5_KEY, btn4, NAOMI_BTN4_KEY }, \ - { NAOMI_UP_KEY, "" }, \ - { NAOMI_DOWN_KEY, "" }, \ - { NAOMI_LEFT_KEY, "" }, \ - { NAOMI_RIGHT_KEY, "" }, \ + NAO_DPAD_DESC \ NAO_START_DESC \ NAO_BASE_BTN_DESC \ } \ } +static InputDescriptors service_btns_inputs = { + { + NAO_BASE_BTN_DESC + } +}; + static InputDescriptors _18wheelr_inputs = { { { NAOMI_BTN0_KEY, "HORN" }, @@ -145,10 +152,7 @@ static InputDescriptors capcom_4btn_inputs = { { NAOMI_BTN1_KEY, "HEAVY PUNCH" }, { NAOMI_BTN3_KEY, "LIGHT KICK" }, { NAOMI_BTN4_KEY, "HEAVY KICK" }, - { NAOMI_UP_KEY, "" }, - { NAOMI_DOWN_KEY, "" }, - { NAOMI_LEFT_KEY, "" }, - { NAOMI_RIGHT_KEY, "" }, + NAO_DPAD_DESC \ NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -162,10 +166,7 @@ static InputDescriptors capcom_6btn_inputs = { { NAOMI_BTN3_KEY, "LIGHT KICK" }, { NAOMI_BTN4_KEY, "MEDIUM KICK" }, { NAOMI_BTN5_KEY, "HEAVY KICK" }, - { NAOMI_UP_KEY, "" }, - { NAOMI_DOWN_KEY, "" }, - { NAOMI_LEFT_KEY, "" }, - { NAOMI_RIGHT_KEY, "" }, + NAO_DPAD_DESC \ NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -193,9 +194,10 @@ static InputDescriptors toyfight_inputs = INPUT_3_BUTTONS("Punch", "Kick", "Dodg static InputDescriptors ausfache_inputs = INPUT_3_BUTTONS("Weak Attack", "Medium Attack", "Strong Attack"); -static InputDescriptors trigger_inputs = { +static InputDescriptors lightgun_inputs = { { { NAOMI_BTN0_KEY, "TRIGGER" }, + { NAOMI_RELOAD_KEY, "" }, NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -241,10 +243,7 @@ static InputDescriptors mvsc2_inputs = { { NAOMI_BTN3_KEY, "LIGHT KICK" }, { NAOMI_BTN4_KEY, "STRONG KICK" }, { NAOMI_BTN5_KEY, "ASSIST B" }, - { NAOMI_UP_KEY, "" }, - { NAOMI_DOWN_KEY, "" }, - { NAOMI_LEFT_KEY, "" }, - { NAOMI_RIGHT_KEY, "" }, + NAO_DPAD_DESC \ NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -255,12 +254,23 @@ static InputDescriptors ninjaslt_inputs = { { NAOMI_BTN2_KEY, "ENTER", NAOMI_BTN0_KEY }, { NAOMI_START_KEY, "", NAOMI_BTN2_KEY, 0, NAOMI_BTN3_KEY }, { NAOMI_BTN0_KEY, "TRIGGER", NAOMI_BTN4_KEY, 0, NAOMI_BTN5_KEY }, + { NAOMI_RELOAD_KEY, "" }, { NAOMI_UP_KEY, "SELECT UP" }, { NAOMI_DOWN_KEY, "SELECT DOWN" }, NAO_BASE_BTN_DESC }, }; +static InputDescriptors mazan_inputs = { + { + { NAOMI_BTN0_KEY, "TRIGGER" }, + { NAOMI_UP_KEY, "SELECT UP" }, + { NAOMI_DOWN_KEY, "SELECT DOWN" }, + NAO_START_DESC + NAO_BASE_BTN_DESC + }, +}; + static InputDescriptors vonot_inputs = { { { NAOMI_UP_KEY, "L UP" }, @@ -291,7 +301,7 @@ static InputDescriptors pstone2_inputs = INPUT_3_BUTTONS("Punch", "Jump", "Attac static InputDescriptors shot1234_inputs = INPUT_4_BUTTONS("SHOT1", "SHOT2", "SHOT3", "SHOT4"); -static InputDescriptors radirgyn_inputs = INPUT_3_BUTTONS("SHOOT", "SWORD", "SHIELD/SPECIAL"); +static InputDescriptors radirgy_inputs = INPUT_3_BUTTONS("SHOOT", "SWORD", "SHIELD/SPECIAL"); static InputDescriptors mamonoro_inputs = INPUT_2_BUTTONS("SHOOT", "SPECIAL"); @@ -371,9 +381,14 @@ static InputDescriptors f355_inputs = { // manual gear shift on P2 DPad // L R - // U 2 1 - // 4 3 - // D 6 5 + // U 1 3 5 + // D 2 4 6 + { NAOMI_BTN2_KEY, "GEAR 1", 0, NAOMI_UP_KEY | NAOMI_LEFT_KEY }, + { NAOMI_BTN3_KEY, "GEAR 2", 0, NAOMI_DOWN_KEY | NAOMI_LEFT_KEY }, + { NAOMI_BTN4_KEY, "GEAR 3", 0, NAOMI_UP_KEY }, + { NAOMI_BTN5_KEY, "GEAR 4", 0, NAOMI_DOWN_KEY }, + { NAOMI_BTN6_KEY, "GEAR 5", 0, NAOMI_UP_KEY | NAOMI_RIGHT_KEY }, + { NAOMI_BTN7_KEY, "GEAR 6", 0, NAOMI_DOWN_KEY | NAOMI_RIGHT_KEY }, NAO_START_DESC NAO_BASE_BTN_DESC @@ -382,7 +397,7 @@ static InputDescriptors f355_inputs = { { "HANDLE", Full, 0 }, { "ACCEL", Half, 4 }, { "BRAKE", Half, 5 }, - { "CLUTCH", Full, 2 }, // Deluxe only + { "CLUTCH", Half, 6 }, // Deluxe only }, }; @@ -391,10 +406,7 @@ static InputDescriptors zombie_inputs = { { NAOMI_BTN0_KEY, "L" }, { NAOMI_BTN1_KEY, "R" }, { NAOMI_BTN2_KEY, "G" }, - { NAOMI_UP_KEY, "" }, - { NAOMI_DOWN_KEY, "" }, - { NAOMI_LEFT_KEY, "" }, - { NAOMI_RIGHT_KEY, "" }, + NAO_DPAD_DESC \ NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -455,6 +467,7 @@ static InputDescriptors guilty_gear_inputs = INPUT_5_BUTTONS("KICK", "SLASH", "H static InputDescriptors ggx_inputs = INPUT_4_BUTTONS("PUNCH", "KICK", "SLASH", "HSLASH"); +static InputDescriptors senko_inputs = INPUT_3_BUTTONS("ACTION", "MAIN", "SUB"); static InputDescriptors senkosp_inputs = INPUT_5_BUTTONS("MAIN", "SUB", "MAIN+SUB", "ACTION", "OVER DRIVE"); static InputDescriptors meltyb_inputs = INPUT_5_BUTTONS("LAttack", "MAttack", "HAttack", "Guard", "Quick Action"); @@ -463,6 +476,153 @@ static InputDescriptors toukon4_inputs = INPUT_5_BUTTONS("X", "Y", "R", "A", "B" static InputDescriptors hmgeo_inputs = INPUT_4_BUTTONS("Fire", "Attack", "Jump", "Target"); +static InputDescriptors shootout_inputs = { + { + { NAOMI_START_KEY, "START/MODE", NAOMI_BTN2_KEY }, + { NAOMI_BTN0_KEY, "TOP/VIEW" }, // !prize + { NAOMI_BTN1_KEY, "BET", NAOMI_BTN6_KEY }, // prize only + { NAOMI_BTN3_KEY, "CUE ROLLER" }, // only used by emulator. press to use cue roller instead of cue aim + { NAOMI_UP_KEY, "ZOOM IN" }, + { NAOMI_DOWN_KEY, "ZOOM OUT" }, + NAO_BASE_BTN_DESC + }, + { + { "CUE TIP U/D", Full, 1, true }, + { "CUE TIP L/R", Full, 0, true }, + } +}; + +static InputDescriptors vf4_inputs = INPUT_3_BUTTONS("PUNCH", "KICK", "GUARD"); + +static InputDescriptors crackindj_inputs = { + { + NAO_START_DESC + NAO_BASE_BTN_DESC + }, + { + { "FADER", Full, 0, true }, + }, +}; + +static InputDescriptors shaktam_inputs = { + { + NAO_START_DESC + NAO_BASE_BTN_DESC + { NAOMI_BTN0_KEY, "SHAKE L" }, + { NAOMI_BTN1_KEY, "SHAKE R" }, + { NAOMI_BTN2_KEY, "KNOCK", NAOMI_DOWN_KEY }, + { NAOMI_DOWN_KEY, "DOWN", NAOMI_LEFT_KEY }, + { NAOMI_UP_KEY, "UP", NAOMI_RIGHT_KEY }, + }, + { + { "TAMBOURINE X", Full, 0 }, + { "TAMBOURINE Y", Full, 1 }, + { "", Full, 2 }, // unused but P2 starts at axis 4 + { "", Full, 3 }, // unused but P2 starts at axis 4 + }, +}; + +static InputDescriptors mushik_inputs = { + { + { NAOMI_BTN0_KEY, "HIT" }, + { NAOMI_BTN1_KEY, "PINCH" }, + { NAOMI_BTN2_KEY, "THROW" }, + NAO_BASE_BTN_DESC + }, +}; + +static InputDescriptors csmash_inputs = INPUT_2_BUTTONS("SMASH", "JUMP"); +static InputDescriptors otrigger_inputs = INPUT_3_BUTTONS("TRIGGER", "CHANGE", "JUMP"); +static InputDescriptors puyoda_inputs = INPUT_1_BUTTON("STAR"); +static InputDescriptors sgtetris_inputs = INPUT_2_BUTTONS("SW1", "SW2"); +static InputDescriptors virnba_inputs = INPUT_2_BUTTONS("PASS", "SHOOT"); +static InputDescriptors vs2_2k_inputs = INPUT_3_BUTTONS("LONG PASS", "SHOOT", "SHORT PASS"); +static InputDescriptors wwfroyal_inputs = INPUT_3_BUTTONS("ATTACK", "GRAPPLE", "SUPPORT"); +static InputDescriptors asndynmt_inputs = INPUT_3_BUTTONS("PUNCH", "KICK", "JUMP"); +static InputDescriptors illvelo_inputs = INPUT_3_BUTTONS("SHOT", "DOLL", "SPECIAL"); +static InputDescriptors rhytngk_inputs = INPUT_2_BUTTONS("SHOT A", "SHOT B"); +static InputDescriptors sl2007_inputs = INPUT_3_BUTTONS("PUSH 1", "PUSH 2", "PUSH 3"); +static InputDescriptors azumanga_inputs = INPUT_1_BUTTON("BUTTON A"); +static InputDescriptors bdrdown_inputs = INPUT_3_BUTTONS("SHOT", "LASER", "SPEED"); +static InputDescriptors cfield_inputs = INPUT_3_BUTTONS("TRG1", "TRG2", "TRG3"); +static InputDescriptors button12_inputs = INPUT_2_BUTTONS("BUTTON 1", "BUTTON 2"); +static InputDescriptors ikaruga_inputs = INPUT_2_BUTTONS("SHOT", "CHANGE"); +static InputDescriptors jingystm_inputs = INPUT_3_BUTTONS("GUARD", "PUNCH", "KICK"); +static InputDescriptors psyvariar_inputs = INPUT_2_BUTTONS("SHOT", "BOMB"); +static InputDescriptors puyofev_inputs = INPUT_2_BUTTONS("ROTATE1", "ROTATE2"); +static InputDescriptors spkrbtl_inputs = INPUT_4_BUTTONS("BEAT", "CHARGE", "JUMP", "SHIFT"); +static InputDescriptors trgheart_inputs = INPUT_3_BUTTONS("SHOT", "ANCHOR", "BOMB"); +static InputDescriptors vathlete_inputs = INPUT_3_BUTTONS("RUN1", "ACTION", "RUN2"); + +static InputDescriptors samba_inputs = { + { + { NAOMI_BTN0_KEY, "MARACAS R" }, + { NAOMI_BTN1_KEY, "MARACAS L" }, + NAO_START_DESC + NAO_BASE_BTN_DESC + }, + { + { "MARACAS R X", Full, 0 }, + { "MARACAS R Y", Full, 1 }, + { "MARACAS L X", Full, 2 }, + { "MARACAS L Y", Full, 3 }, + } +}; + +static InputDescriptors wldkicks_inputs = { + { + { NAOMI_BTN0_KEY, "BUTTON" }, + { NAOMI_BTN3_KEY, "ENTER" }, // service mode + { NAOMI_UP_KEY, "" }, // service mode + { NAOMI_DOWN_KEY, "" }, // service mode + NAO_BASE_BTN_DESC + }, + { + { "STICK L/R", Full, 0 }, // P1 + { "STICK U/D", Full, 1 }, + { "", Full, 2 }, // P2 + { "", Full, 3 }, + { "", Full, 4 }, // P3 + { "", Full, 5 }, + { "", Full, 6 }, // P4 + { "", Full, 7 }, + { "KICK", Full, 8 }, // P1 FIXME need to set Full here to have read_analog_axis() called but not seen as trigger + { "", Full, 9 }, // P2 + { "", Full, 10 }, // P3 + { "", Full, 11 }, // P4 + } +}; +static InputDescriptors wldkickspcb_inputs = { + { + { NAOMI_BTN0_KEY, "CHANGE" }, // original label: C BUTTON + NAO_START_DESC + NAO_BASE_BTN_DESC + }, + { + { "STICK L/R", Full, 0 }, + { "STICK U/D", Full, 1 }, + { "", Full, 2 }, +// { "", Full, 3 }, + { "BALL", Half, 4 }, // this is wrong, just to indicate RT is used + } +}; + +static InputDescriptors dygolf_inputs = { + { + NAO_DPAD_DESC + NAO_START_DESC + NAO_BASE_BTN_DESC + } +}; + +static InputDescriptors kick4csh_inputs = { + { + { NAOMI_BTN1_KEY, "VIEW" }, + { NAOMI_BTN2_KEY, "CHANCE" }, + { NAOMI_START_KEY, "START/DECIDE" }, + NAO_BASE_BTN_DESC + } +}; // // AtomisWave games // @@ -471,6 +631,11 @@ static InputDescriptors hmgeo_inputs = INPUT_4_BUTTONS("Fire", "Attack", "Jump", { AWAVE_TEST_KEY, "" }, \ { AWAVE_SERVICE_KEY, "" }, #define AW_START_DESC { AWAVE_START_KEY, "" }, +#define AW_DPAD_DESC { AWAVE_UP_KEY, "" }, \ + { AWAVE_DOWN_KEY, "" }, \ + { AWAVE_LEFT_KEY, "" }, \ + { AWAVE_RIGHT_KEY, "" }, + #define AW_5_BUTTONS(btn0, btn1, btn2, btn3, btn4) { \ { \ @@ -479,10 +644,7 @@ static InputDescriptors hmgeo_inputs = INPUT_4_BUTTONS("Fire", "Attack", "Jump", { AWAVE_BTN2_KEY, btn2 }, \ { AWAVE_BTN3_KEY, btn3 }, \ { AWAVE_BTN4_KEY, btn4 }, \ - { AWAVE_UP_KEY, "" }, \ - { AWAVE_DOWN_KEY, "" }, \ - { AWAVE_LEFT_KEY, "" }, \ - { AWAVE_RIGHT_KEY, "" }, \ + AW_DPAD_DESC \ AW_START_DESC \ AW_BASE_BTN_DESC \ } \ @@ -494,10 +656,7 @@ static InputDescriptors hmgeo_inputs = INPUT_4_BUTTONS("Fire", "Attack", "Jump", { AWAVE_BTN1_KEY, btn1 }, \ { AWAVE_BTN2_KEY, btn2 }, \ { AWAVE_BTN3_KEY, btn3 }, \ - { AWAVE_UP_KEY, "" }, \ - { AWAVE_DOWN_KEY, "" }, \ - { AWAVE_LEFT_KEY, "" }, \ - { AWAVE_RIGHT_KEY, "" }, \ + AW_DPAD_DESC \ AW_START_DESC \ AW_BASE_BTN_DESC \ } \ @@ -508,10 +667,7 @@ static InputDescriptors hmgeo_inputs = INPUT_4_BUTTONS("Fire", "Attack", "Jump", { AWAVE_BTN0_KEY, btn0 }, \ { AWAVE_BTN1_KEY, btn1 }, \ { AWAVE_BTN2_KEY, btn2 }, \ - { AWAVE_UP_KEY, "" }, \ - { AWAVE_DOWN_KEY, "" }, \ - { AWAVE_LEFT_KEY, "" }, \ - { AWAVE_RIGHT_KEY, "" }, \ + AW_DPAD_DESC \ AW_START_DESC \ AW_BASE_BTN_DESC \ } \ @@ -583,6 +739,32 @@ static InputDescriptors mslug6_inputs = AW_5_BUTTONS("SHOOT", "JUMP", "GRENADE", static InputDescriptors rumblef_inputs = AW_5_BUTTONS("LP", "SP", "Dodge", "LK", "SK"); +static InputDescriptors basschal_inputs = { + { + { AWAVE_BTN0_KEY, "ROTATE LEFT" }, + { AWAVE_BTN1_KEY, "ROTATE RIGHT" }, + { AWAVE_LEFT_KEY, "LEFT POINT" }, + { AWAVE_RIGHT_KEY, "RIGHT POINT" }, + AW_START_DESC + AW_BASE_BTN_DESC + }, +}; + +static InputDescriptors aw_lightgun_inputs = { + { + { AWAVE_BTN0_KEY, "TRIGGER" }, + { AWAVE_BTN1_KEY, "PUMP" }, + AW_START_DESC + AW_BASE_BTN_DESC + }, +}; + +static InputDescriptors aw_shot123_inputs = AW_3_BUTTONS("SHOT1", "SHOT2", "SHOT3"); + +// +// Naomi 2 +// + static InputDescriptors kingrt66_inputs = { { { NAOMI_BTN0_KEY, "HORN" }, @@ -604,7 +786,8 @@ static InputDescriptors kingrt66_inputs = { static InputDescriptors clubkart_inputs = { { - { NAOMI_DOWN_KEY, "VIEW" }, + { NAOMI_DOWN_KEY, "VIEW" }, // !prize (start is used instead) + { NAOMI_BTN1_KEY, "BET" }, // prize only NAO_START_DESC NAO_BASE_BTN_DESC }, @@ -694,9 +877,46 @@ static InputDescriptors drvsim_inputs = { // WIPER-HI }, { - { "Master", Full, 0, true }, + { "", Full, ~0u, true }, // Master audio volume { "Accelerator", Half, 4 }, { "Brake", Half, 5 }, - { "Clutch", Full, 1 }, + { "Clutch", Half, 6 }, + { "Wheel", Full, 0, true }, // only read via ffb board, not jvs + }, +}; + +static InputDescriptors beachspi_inputs = INPUT_2_BUTTONS("A", "B"); + +// +// System SP games +// + +static InputDescriptors dinok_inputs = { + { + { DC_BTN_A, "ROCK" }, + { DC_BTN_B, "SCISSORS" }, + { DC_BTN_C, "PAPER" }, + NAO_BASE_BTN_DESC + }, +}; + +static InputDescriptors lovebery_inputs = { + { + { DC_BTN_A, "P1 BUTTON" }, + { DC_BTN_B, "P2 BUTTON", 0, DC_BTN_A }, + NAO_BASE_BTN_DESC + }, +}; + +static InputDescriptors tetgiant_inputs = { + { + { DC_BTN_A, "BUTTON L" }, + { DC_BTN_B, "BUTTON R" }, + { DC_DPAD_UP, "" }, + { DC_DPAD_DOWN, "" }, + { DC_DPAD_LEFT, "" }, + { DC_DPAD_RIGHT, "" }, + { DC_BTN_START, "" }, + NAO_BASE_BTN_DESC }, }; diff --git a/core/hw/naomi/netdimm.cpp b/core/hw/naomi/netdimm.cpp index dfbaa26f7..128f81850 100644 --- a/core/hw/naomi/netdimm.cpp +++ b/core/hw/naomi/netdimm.cpp @@ -29,14 +29,10 @@ //#define HTTP_TRACE -const char *SERVER_NAME = "vfnet.duckdns.org"; - -NetDimm *NetDimm::Instance; +const char *SERVER_NAME = "vfnet.flyca.st"; NetDimm::NetDimm(u32 size) : GDCartridge(size) { - schedId = sh4_sched_register(0, schedCallback); - Instance = this; if (serverIp == 0) { hostent *hp = gethostbyname(SERVER_NAME); @@ -47,87 +43,13 @@ NetDimm::NetDimm(u32 size) : GDCartridge(size) } } -NetDimm::~NetDimm() -{ - sh4_sched_unregister(schedId); - Instance = nullptr; -} - void NetDimm::Init(LoadProgress *progress, std::vector *digest) { GDCartridge::Init(progress, digest); - dimmBufferOffset = dimm_data_size - 16 * 1024 * 1024; + dimmBufferOffset = dimm_data_size - 16_MB; finalTuned = strcmp(game->name, "vf4tuned") == 0; } -u32 NetDimm::ReadMem(u32 address, u32 size) -{ - switch (address) - { - case NAOMI_DIMM_COMMAND: - DEBUG_LOG(NAOMI, "DIMM COMMAND read -> %x", dimm_command); - return dimm_command; - case NAOMI_DIMM_OFFSETL: - DEBUG_LOG(NAOMI, "DIMM OFFSETL read -> %x", dimm_offsetl); - return dimm_offsetl; - case NAOMI_DIMM_PARAMETERL: - DEBUG_LOG(NAOMI, "DIMM PARAMETERL read -> %x", dimm_parameterl); - return dimm_parameterl; - case NAOMI_DIMM_PARAMETERH: - DEBUG_LOG(NAOMI, "DIMM PARAMETERH read -> %x", dimm_parameterh); - return dimm_parameterh; - case NAOMI_DIMM_STATUS: - { - u32 rc = DIMM_STATUS & ~(((SB_ISTEXT >> 3) & 1) << 8); - static u32 lastRc; - if (rc != lastRc) - DEBUG_LOG(NAOMI, "DIMM STATUS read -> %x", rc); - lastRc = rc; - return rc; - } - default: - return GDCartridge::ReadMem(address, size); - } -} - -void NetDimm::WriteMem(u32 address, u32 data, u32 size) -{ - switch (address) - { - case NAOMI_DIMM_COMMAND: - dimm_command = data; - DEBUG_LOG(NAOMI, "DIMM COMMAND Write<%d>: %x", size, data); - return; - - case NAOMI_DIMM_OFFSETL: - dimm_offsetl = data; - DEBUG_LOG(NAOMI, "DIMM OFFSETL Write<%d>: %x", size, data); - return; - case NAOMI_DIMM_PARAMETERL: - dimm_parameterl = data; - DEBUG_LOG(NAOMI, "DIMM PARAMETERL Write<%d>: %x", size, data); - return; - case NAOMI_DIMM_PARAMETERH: - dimm_parameterh = data; - DEBUG_LOG(NAOMI, "DIMM PARAMETERH Write<%d>: %x", size, data); - return; - - case NAOMI_DIMM_STATUS: - DEBUG_LOG(NAOMI, "DIMM STATUS Write<%d>: %x", size, data); - if (data & 0x100) - // write 0 seems ignored - asic_CancelInterrupt(holly_EXP_PCI); - if ((data & 1) == 0) - // irq to dimm - process(); - return; - - default: - GDCartridge::WriteMem(address, data, size); - return; - } -} - bool NetDimm::Write(u32 offset, u32 size, u32 data) { // u8 b0 = data; @@ -141,11 +63,6 @@ bool NetDimm::Write(u32 offset, u32 size, u32 data) return true; } -int NetDimm::schedCallback(int tag, int sch_cycl, int jitter) -{ - return Instance->schedCallback(); -} - int NetDimm::schedCallback() { fd_set readFds {}; @@ -360,16 +277,6 @@ int NetDimm::schedCallback() return SH4_MAIN_CLOCK; } -void NetDimm::returnToNaomi(bool failed, u16 offsetl, u32 parameter) -{ - dimm_command = ((dimm_command & 0x7e00) + 0x400) | (failed ? 0xff : 0x4); - dimm_offsetl = offsetl; - dimm_parameterh = parameter >> 16; - dimm_parameterl = parameter; - verify(((SB_ISTEXT >> 3) & 1) == 0); - asic_RaiseInterrupt(holly_EXP_PCI); -} - void NetDimm::systemCmd(int cmd) { switch (cmd) @@ -386,10 +293,12 @@ void NetDimm::systemCmd(int cmd) // | offset >> 20 (dimm buffers offset @ size - 16MB) // offset = (64MB << 0-5) - 16MB // vf4 forces this value to 0f000000 (256MB) if != 1f000000 (512MB) - if (dimm_data_size == 512 * 1024 * 1024) + if (dimm_data_size == 512_MB) addrspace::write32(0xc01fc04, (3 << 16) | 0x70000000 | (dimmBufferOffset >> 20)); // dimm board config 1 x 512 MB - else if (dimm_data_size == 256 * 1024 * 1024) + else if (dimm_data_size == 256_MB) addrspace::write32(0xc01fc04, (2 << 16) | 0x70000000 | (dimmBufferOffset >> 20)); // dimm board config 1 x 256 MB + else if (dimm_data_size == 128_MB) + addrspace::write32(0xc01fc04, (1 << 16) | 0x70000000 | (dimmBufferOffset >> 20)); // dimm board config 1 x 128 MB else die("Unsupported dimm mem size"); addrspace::write32(0xc01fc0c, 0x3170000 | 0x264); // fw version | 100/264/364? @@ -401,10 +310,14 @@ void NetDimm::systemCmd(int cmd) addrspace::write32(0xc01fc24, 0x3e000a); addrspace::write32(0xc01fc28, 0x18077f); addrspace::write32(0xc01fc2c, 0x10014); - // PIC16? - //addrspace::write32(0xc01fc40, .); - // ... - //addrspace::write32(0xc01fc54, .); + // DIMM board serial Id + { + const u32 *serial = (u32 *)(getGameSerialId() + 0x20); // get only the serial id + addrspace::write32(0xc01fc40, *serial++); + addrspace::write32(0xc01fc44, *serial++); + addrspace::write32(0xc01fc48, *serial++); + addrspace::write32(0xc01fc4c, *serial++); + } addrspace::write32(0xc01fc18, 0x10002); // net mode (2 or 4 is mobile), bit 16 dhcp? // network order addrspace::write32(0xc01fc60, htonl(0xc0a80101)); // ip address (192.168.1.1) @@ -814,29 +727,20 @@ void NetDimm::process() netCmd(cmd); break; default: - WARN_LOG(NAOMI, "Unknown DIMM command group %d cmd %x\n", cmdGroup, cmd); + WARN_LOG(NAOMI, "Unknown DIMM command group %d cmd %x", cmdGroup, cmd); returnToNaomi(true, 0, -1); break; } } -void NetDimm::Serialize(Serializer &ser) const -{ - GDCartridge::Serialize(ser); - ser << dimm_command; - ser << dimm_offsetl; - ser << dimm_parameterl; - ser << dimm_parameterh; - sh4_sched_serialize(ser, schedId); -} - void NetDimm::Deserialize(Deserializer &deser) { GDCartridge::Deserialize(deser); for (Socket& socket : sockets) socket.close(); - if (deser.version() >= Deserializer::V36) + if (deser.version() >= Deserializer::V36 && deser.version() < Deserializer::V53) { + // moved to parent class in v53 deser >> dimm_command; deser >> dimm_offsetl; deser >> dimm_parameterl; diff --git a/core/hw/naomi/netdimm.h b/core/hw/naomi/netdimm.h index 4915e8682..e936c70e0 100644 --- a/core/hw/naomi/netdimm.h +++ b/core/hw/naomi/netdimm.h @@ -24,23 +24,18 @@ class NetDimm : public GDCartridge { public: NetDimm(u32 size); - ~NetDimm(); void Init(LoadProgress *progress = nullptr, std::vector *digest = nullptr) override; - u32 ReadMem(u32 address, u32 size) override; - void WriteMem(u32 address, u32 data, u32 size) override; - bool Write(u32 offset, u32 size, u32 data) override; - void Serialize(Serializer &ser) const override; void Deserialize(Deserializer &deser) override; +protected: + void process() override; + int schedCallback() override; + private: - void returnToNaomi(bool failed, u16 offsetl, u32 parameter); - static int schedCallback(int tag, int sch_cycl, int jitter); - int schedCallback(); - void process(); void systemCmd(int cmd); void netCmd(int cmd); @@ -67,29 +62,6 @@ class NetDimm : public GDCartridge dimm_parameterh = value >> 16; } - template - void peek(u32 address) - { - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4); - int size; - switch (sizeof(T)) - { - case 1: - size = 4; - break; - case 2: - size = 5; - break; - case 4: - size = 6; - break; - } - dimm_command = ((address >> 16) & 0x1ff) | (size << 9) | 0x8000; - dimm_offsetl = address & 0xffff; - dimm_parameterl = 0; - dimm_parameterh = 0; - } - sock_t getSocket(int idx) { if (idx < 1 || idx > (int)sockets.size()) @@ -105,13 +77,6 @@ class NetDimm : public GDCartridge return false; } - u16 dimm_command; - u16 dimm_offsetl; - u16 dimm_parameterl; - u16 dimm_parameterh; - static constexpr u16 DIMM_STATUS = 0x111; - int schedId; - struct Socket { Socket() = default; Socket(sock_t fd) : fd(fd) {} @@ -166,5 +131,4 @@ class NetDimm : public GDCartridge u32 dimmBufferOffset = 0x0f000000; static constexpr int POLL_CYCLES = SH4_MAIN_CLOCK / 60; - static NetDimm *Instance; }; diff --git a/core/hw/naomi/printer.cpp b/core/hw/naomi/printer.cpp index a8c337ec5..737a3e622 100644 --- a/core/hw/naomi/printer.cpp +++ b/core/hw/naomi/printer.cpp @@ -17,51 +17,55 @@ along with Flycast. If not, see . */ #include "types.h" +#include "stdclass.h" #include "printer.h" #include "serialize.h" -#include "rend/gui.h" +#include "oslib/oslib.h" #include #include #include #ifdef STANDALONE_TEST +#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION #undef INFO_LOG #define INFO_LOG(t, s, ...) printf(s "\n", __VA_ARGS__) +#undef NOTICE_LOG +#define NOTICE_LOG INFO_LOG +#undef ERROR_LOG +#define ERROR_LOG INFO_LOG #else -#include -CMRC_DECLARE(flycast); +#include "oslib/resources.h" #endif +#include #include namespace printer { +static u8 reverseBits(u8 b) +{ + b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; + b = (b & 0xCC) >> 2 | (b & 0x33) << 2; + b = (b & 0xAA) >> 1 | (b & 0x55) << 1; + return b; +} + class BitmapWriter { public: BitmapWriter(int printerWidth) : printerWidth(printerWidth) { #ifndef STANDALONE_TEST - try { - cmrc::embedded_filesystem fs = cmrc::flycast::get_filesystem(); - cmrc::file fontFile = fs.open("fonts/printer_ascii8x16.bin"); - ascii8x16 = (const u8 *)fontFile.begin(); - fontFile = fs.open("fonts/printer_ascii12x24.bin"); - ascii12x24 = (const u8 *)fontFile.begin(); - fontFile = fs.open("fonts/printer_kanji16x16.bin"); - kanji16x16 = (const u8 *)fontFile.begin(); - fontFile = fs.open("fonts/printer_kanji24x24.bin"); - kanji24x24 = (const u8 *)fontFile.begin(); - } catch (const std::system_error& e) { - ERROR_LOG(NAOMI, "Failed to load a printer font: %s", e.what()); - throw; - } - + size_t size; + ascii8x16 = resource::load("fonts/printer_ascii8x16.bin", size); + ascii12x24 = resource::load("fonts/printer_ascii12x24.bin", size); + kanji16x16 = resource::load("fonts/printer_kanji16x16.bin", size); + kanji24x24 = resource::load("fonts/printer_kanji24x24.bin", size); #else - loadFont("printer_ascii8x16.bin", (u8 **)&ascii8x16); - loadFont("printer_ascii12x24.bin", (u8 **)&ascii12x24); - loadFont("printer_kanji16x16.bin", (u8 **)&kanji16x16); - loadFont("printer_kanji24x24.bin", (u8 **)&kanji24x24); + ascii8x16 = loadFont("printer_ascii8x16.bin"); + ascii12x24 = loadFont("printer_ascii12x24.bin"); + kanji16x16 = loadFont("printer_kanji16x16.bin"); + kanji24x24 = loadFont("printer_kanji24x24.bin"); #endif } @@ -168,9 +172,9 @@ class BitmapWriter printBufferEmpty = false; } - void printImage(int hpos, int width, int height, const u8 *data) + void printImage(int hpos, int width, int height, const u8 *data, bool msb) { - //printf("printImage: hpos %d w %d h %d\n", hpos, width, height); + //printf("printImage: hpos %d w %d h %d msb %d\n", hpos, width, height, msb); const int savePenx = penx; penx = hpos; u8 *pen = getPenPosition(height); @@ -178,7 +182,7 @@ class BitmapWriter { for (int x = 0; x < width; x++) { - bool b = data[x / 8] & (msbBitmap ? 0x80 >> (x % 8) : 1 << (x % 8)); + bool b = data[x / 8] & (msb ? 0x80 >> (x % 8) : 1 << (x % 8)); if (b) { if (xorMode) @@ -226,21 +230,34 @@ class BitmapWriter void setDoubleHeight(bool enabled) { doubleHeight = enabled; } + bool getBitmapMSB() const { + return msbBitmap; + } void setBitmapMSB(bool enabled) { msbBitmap = enabled; } void setXorMode(bool enabled) { xorMode = enabled; } + void setMaxCharWidth(int width) { + maxCharWidth = width; + } void setCustomChar(char code, int width, int height, const u8 *data) { if ((u8)code >= customChars.size()) customChars.resize(code + 1); CustomChar& cchar = customChars[code]; - cchar.width = std::min(width, 48); + cchar.width = std::min(width, maxCharWidth); cchar.height = height; cchar.data.resize((cchar.width + 7) / 8 * height); - if (cchar.width == width) { + if (msbBitmap) + { + int widthBytes = (cchar.width + 7) / 8; + for (int y = 0; y < height; y++) + for (int x = 0; x < widthBytes; x++) + cchar.data[widthBytes * y + x] = reverseBits(data[(width + 7) / 8 * y + x]); + } + else if (cchar.width == width) { memcpy(cchar.data.data(), data, cchar.data.size()); } else @@ -263,6 +280,20 @@ class BitmapWriter for (int d = from; d <= to && d < (int)ruledLine.size(); d++) ruledLine[d] = 0xff; } + void drawRuledPattern(u8 n1, u8 n2) + { + if (ruledLine.empty()) + ruledLine.resize(printerWidth); + u8 pattern[16]; + for (int i = 0; i < 8; i++) + { + u8 mask = msbBitmap ? 0x80 >> i : 1 << i; + pattern[i] = (n1 & mask) ? 0xff : 0; + pattern[8 + i] = (n2 & mask) ? 0xff : 0; + } + for (int d = 0; d < (int)ruledLine.size(); d++) + ruledLine[d] = pattern[d % std::size(pattern)]; + } void clearRuledLine() { ruledLine.clear(); } @@ -310,9 +341,76 @@ class BitmapWriter { if (page.empty()) return false; + const auto& appendData = [](void *context, void *data, int size) { + std::vector& v = *(std::vector *)context; + v.insert(v.end(), (u8 *)data, (u8 *)data + size); + }; + stbi_flip_vertically_on_write(0); + if (settings.content.gameId.substr(0, 4) == "F355") + { + u8 *data = nullptr; + int x, y, comp; +#ifndef STANDALONE_TEST + size_t size; + std::unique_ptr fileData = resource::load("picture/f355_print_template.png", size); + data = stbi_load_from_memory(fileData.get(), size, &x, &y, &comp, STBI_rgb_alpha); +#else + FILE *f = fopen("f355_print_template.png", "rb"); + if (f != nullptr) + { + data = stbi_load_from_file(f, &x, &y, &comp, STBI_rgb_alpha); + fclose(f); + } + else + fprintf(stderr, "Can't open template file %d\n", errno); +#endif + if (data != nullptr && (x != printerWidth || comp != STBI_rgb_alpha)) + { + ERROR_LOG(NAOMI, "Invalid printer template: width %d comp %d", x, comp); + stbi_image_free(data); + data = nullptr; + } + if (data != nullptr) + { + if (lines > y) + { + u8 *newData = (u8 *)malloc(printerWidth * 4 * lines); + const u8 *end = newData + printerWidth * 4 * lines; + for (u8 *p = newData; p < end; p += printerWidth * 4 * y) + memcpy(p, data, std::min(printerWidth * 4 * y, (int)(end - p))); + stbi_image_free(data); + data = newData; + } + u32 *p = (u32 *)data; + for (u8 b : page) + { + if (b == 0xff) + *p = 0xff000000; + p++; + } + std::vector pngData; + stbi_write_png_to_func(appendData, &pngData, printerWidth, lines, 4, data, printerWidth * 4); + stbi_image_free(data); + try { + hostfs::saveScreenshot(filename, pngData); + } catch (const FlycastException& e) { + ERROR_LOG(NAOMI, "Error saving print out: %s", e.what()); + return false; + } + + return true; + } + } for (u8& b : page) b = 0xff - b; - stbi_write_png(filename.c_str(), printerWidth, lines, 1, &page[0], printerWidth); + std::vector pngData; + stbi_write_png_to_func(appendData, &pngData, printerWidth, lines, 1, &page[0], printerWidth); + try { + hostfs::saveScreenshot(filename, pngData); + } catch (const FlycastException& e) { + ERROR_LOG(NAOMI, "Error saving print out: %s", e.what()); + return false; + } return true; } @@ -438,12 +536,12 @@ class BitmapWriter int glyphSize; if (bigFont) { - glyph = ascii12x24; + glyph = ascii12x24.get(); glyphSize = 2 * 24; } else { - glyph = ascii8x16; + glyph = ascii8x16.get(); glyphSize = 16; } if ((uint8_t)c < ' ') @@ -458,12 +556,12 @@ class BitmapWriter int glyphSize; if (bigFont) { - glyph = kanji24x24; + glyph = kanji24x24.get(); glyphSize = 3 * 24; } else { - glyph = kanji16x16; + glyph = kanji16x16.get(); glyphSize = 2 * 16; } if (c == ' ') @@ -489,20 +587,20 @@ class BitmapWriter page.insert(page.end(), printerWidth * count, 0); } - void loadFont(const char *fname, u8 **data) + std::unique_ptr loadFont(const char *fname) { FILE *f = fopen(fname, "rb"); - if (!f) + if (!f) { perror(fname); - else - { - fseek(f, 0, SEEK_END); - size_t sz = ftell(f); - fseek(f, 0, SEEK_SET); - *data = (u8 *)malloc(sz); - fread(*data, sz, 1, f); - fclose(f); + return nullptr; } + fseek(f, 0, SEEK_END); + size_t sz = ftell(f); + fseek(f, 0, SEEK_SET); + std::unique_ptr data = std::make_unique(sz); + fread(data.get(), sz, 1, f); + fclose(f); + return data; } int printerWidth = 920; @@ -530,16 +628,17 @@ class BitmapWriter std::vector data; }; std::vector customChars; + int maxCharWidth = 48; // depends on the printer type? 48 for tduno, 64 for ntvmys std::vector ruledLine; bool ruledLineMode = false; int underline = 0; int maxUnderline = 0; - const u8 *ascii8x16; - const u8 *ascii12x24; - const u8 *kanji16x16; - const u8 *kanji24x24; + std::unique_ptr ascii8x16; + std::unique_ptr ascii12x24; + std::unique_ptr kanji16x16; + std::unique_ptr kanji24x24; }; // @@ -549,6 +648,10 @@ class BitmapWriter class ThermalPrinter { public: + void setMaxCharWidth(int width) { + getWriter().setMaxCharWidth(width); + } + void print(char c) { if (expectedDataBytes > 0) @@ -667,6 +770,7 @@ class ThermalPrinter { ser << bm.width; ser << bm.height; + ser << bm.msb; ser << (u32)bm.data.size(); ser.serialize(bm.data.data(), bm.data.size()); } @@ -701,6 +805,10 @@ class ThermalPrinter { deser >> bm.width; deser >> bm.height; + if (deser.version() >= Deserializer::V48) + deser >> bm.msb; + else + bm.msb = false; deser >> size; bm.data.resize(size); deser.deserialize(bm.data.data(), bm.data.size()); @@ -738,11 +846,16 @@ class ThermalPrinter state = Default; if (bitmapWriter && bitmapWriter->isDirty()) { - std::string s = settings.content.gameId + "-results.png"; - bitmapWriter->save(s); + std::string date = timeToISO8601(time(nullptr)); + std::replace(date.begin(), date.end(), '/', '-'); + std::replace(date.begin(), date.end(), ':', '-'); + std::string s = settings.content.gameId + " - " + date + ".png"; + const bool success = bitmapWriter->save(s); bitmapWriter.reset(); - s = "Print out saved to " + s; - gui_display_notification(s.c_str(), 5000); + if (success) { + os_notify("Print out saved", 5000, s.c_str()); + NOTICE_LOG(NAOMI, "%s", s.c_str()); + } } break; case 'K': // Set Kanji mode @@ -836,6 +949,8 @@ class ThermalPrinter break; case 'T': // Create bitmap: n w yl yh [data...] where n is the bitmap id [0, 255], w is the width in bytes [1, 127], // yl + yh * 256 is the number of lines [1, 1023] + expectedDataBytes = 4; + break; case 'm': // Mark position detection: s nl nh where n is the max feed amount until detection [0, 65535] // s & 3 == 0: Feed the paper in the forward direction until it passes the marking position. // s & 3 == 1: Feed the paper in the forward direction to the marking position. @@ -897,15 +1012,15 @@ class ThermalPrinter const size_t idx = (u8)dataBytes[0]; const int hpos = (u8)dataBytes[1] * 8; if (idx < bitmaps.size()) - getWriter().printImage(hpos, bitmaps[idx].width, bitmaps[idx].height, &bitmaps[idx].data[0]); + getWriter().printImage(hpos, bitmaps[idx].width, bitmaps[idx].height, &bitmaps[idx].data[0], bitmaps[idx].msb); } break; case 'T': { // bitmap - if (expectedDataBytes == 3) + if (expectedDataBytes == 4) { - expectedDataBytes += (u8)dataBytes[1] * (u8)dataBytes[2]; + expectedDataBytes += ((u8)dataBytes[1] & 0x7f) * std::min((u8)dataBytes[2] | ((u8)dataBytes[3] << 8), 1023); } else { @@ -920,6 +1035,7 @@ class ThermalPrinter bitmaps.resize(idx + 1); bitmaps[idx].width = w; bitmaps[idx].height = h; + bitmaps[idx].msb = getWriter().getBitmapMSB(); std::swap(bitmaps[idx].data, bitmap); } } @@ -979,6 +1095,14 @@ class ThermalPrinter state = Default; getWriter().clearRuledLine(); break; + case 'D': // Dot fill. Writes "1" (black) at dot position specified by (nh * 256 + nl) * dotpitch in the selected ruled line buffer. + // nl[0-255] nh[0-3] + expectedDataBytes = 2; + break; + case 'F': // Pattern fill. Writes one line to the selected ruled line buffer using the data pattern specified by n1 and n2. + // pattern is arranged horizontally from left to right. (Each byte obey image lsb/msb selection ESC =) + expectedDataBytes = 2; + break; case 'P': // Prints the data in the print buffer and prints 1 line of the ruled line buffer if (!dc3Lock) state = Default; @@ -1001,6 +1125,12 @@ class ThermalPrinter { switch (curCommand) { + case 'D': + getWriter().drawRuledLine((u8)dataBytes[0] + (u8)dataBytes[1] * 256, (u8)dataBytes[0] + (u8)dataBytes[1] * 256); + break; + case 'F': + getWriter().drawRuledPattern((u8)dataBytes[0], (u8)dataBytes[1]); + break; case 'L': getWriter().drawRuledLine((u8)dataBytes[0] + (u8)dataBytes[1] * 256, (u8)dataBytes[2] + (u8)dataBytes[3] * 256); break; @@ -1026,6 +1156,7 @@ class ThermalPrinter { int width; int height; + bool msb; std::vector data; }; std::vector bitmaps; @@ -1046,6 +1177,8 @@ static std::unique_ptr printer; void init() { printer = std::make_unique(); + if (settings.content.gameId == "MIRAI YOSOU STUDIO") + printer->setMaxCharWidth(64); } void term() @@ -1083,6 +1216,14 @@ void deserialize(Deserializer& deser) #ifdef STANDALONE_TEST settings_t settings; +std::string get_writable_data_path(const std::string& s) +{ + return "./" + s; +} + +void os_notify(char const*, int, char const*) { +} + int main(int argc, char *argv[]) { if (argc < 2) @@ -1092,8 +1233,9 @@ int main(int argc, char *argv[]) perror(argv[1]); return 1; } - settings.content.gameId = "somegame"; + settings.content.gameId = "F355 CHALLENGE"; printer::ThermalPrinter printer; +// printer.setMaxCharWidth(64); for (;;) { int c = fgetc(f); diff --git a/core/hw/naomi/systemsp.cpp b/core/hw/naomi/systemsp.cpp new file mode 100644 index 000000000..7f1fb8e2b --- /dev/null +++ b/core/hw/naomi/systemsp.cpp @@ -0,0 +1,2682 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +// based on mame code: +// license:BSD-3-Clause +// copyright-holders:David Haywood, MetalliC +#include "systemsp.h" +#include "naomi_cart.h" +#include "hw/flashrom/nvmem.h" +#include "network/ggpo.h" +#include "hw/maple/maple_cfg.h" +#include "input/gamepad.h" +#include "hw/sh4/sh4_sched.h" +#include "hw/holly/holly_intc.h" +#include "hw/holly/sb.h" +#include "oslib/storage.h" +#include "oslib/oslib.h" +#include "cfg/option.h" +#include "card_reader.h" +#include "naomi_roms.h" +#include "stdclass.h" +#include "hw/mem/addrspace.h" +#include +#include + +#ifdef DEBUG_SERIAL +#define SERIAL_LOG(...) DEBUG_LOG(NAOMI, __VA_ARGS__) +#else +#define SERIAL_LOG(...) +#endif +#ifdef DEBUG_FLASH +#define FLASH_LOG(...) DEBUG_LOG(FLASHROM, __VA_ARGS__) +#else +#define FLASH_LOG(...) +#endif +#ifdef DEBUG_ATA +#define ATA_LOG(...) DEBUG_LOG(NAOMI, __VA_ARGS__) +#else +#define ATA_LOG(...) +#endif +#ifdef DEBUG_IO +#define IO_LOG(...) DEBUG_LOG(NAOMI, __VA_ARGS__) +#else +#define IO_LOG(...) +#endif + +namespace systemsp +{ + +SystemSpCart *SystemSpCart::Instance; + +constexpr u8 DINOKING_CHIP_DATA[128] = { + 0x12, 0x34, 0x56, 0x78, // Serial No.0 + 0x31, 0x00, 0x86, 0x07, // Serial No.1 + 0x00, 0x00, 0x00, 0x00, // Key + 0x05, 0x40, 0x00, 0xAA, // Extend Extend Access Mode + 0x23, 0xFF, 0xFF, 0xFF, // Counter4 Counter3 Counter2 Counter1 + 0x00, 0x00, 0x00, 0x00, // User Data (first set date: day bits 0-4, month bits 5-8, year bits 9-... + 2000) + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x23, 0xFF, 0xFF, 0xFF, // User Data (max counters) +}; +constexpr u8 LOVEBERRY_CHIP_DATA[128] = { + 0x10, 0xc5, 0x10, 0x96, // Serial No.0 + 0xab, 0x2f, 0xf1, 0x74, // Serial No.1 + 0x99, 0x33, 0x78, 0xa7, // Key + 0x05, 0x77, 0x00, 0xAA, // Extend Extend Access Mode + 0x23, 0xFF, 0xFF, 0xFF, // Counter4 Counter3 Counter2 Counter1 + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x00, 0x00, 0x00, 0x00, // User Data + 0x23, 0xFF, 0xFF, 0xFF, // User Data +}; + +// +// RS232C I/F board (838-14244) connected to RFID Chip R/W board (838-14243 aka Maxell Picochet ME-MR23) +// +class RfidReaderWriter : public SerialPort::Pipe +{ + enum Response : u8 { + OK = 0xa, + RETRY = 0xca, + NG = 0x3a, + NOT = 0x6a, + }; + + enum Command : u8 { + REQ = 0x4e, + SEL = 0x2e, + READ = 0xe, + WRITE = 0xce, + WRITE_NOP = 0x8e, + WRITE_ST = 0xee, + HALT = 0xae, + COUNT = 0x6e, + RESET = 0x7e, + TEST = 0x5e, + CHANGE = 0x3e, + }; + static constexpr u8 TEST_CODE = 0; + static constexpr u8 RF_OFF = 0x80; + +public: + RfidReaderWriter(SerialPort *port, int index, const std::string& gameName) : port(port), index(index), gameName(gameName) + { + port->setPipe(this); + + FILE *f = nowide::fopen(getCardDataPath().c_str(), "rb"); + if (f != nullptr) + { + if (fread(cardData.data(), 1, cardData.size(), f) != cardData.size()) + WARN_LOG(NAOMI, "Rfid card %d: truncated read", index); + fclose(f); + } + else { + makeNewCard(); + } + } + + void write(u8 v) override + { + if (expectedBytes > 0) + { + SERIAL_LOG("UART%d write data out: %02x", index, v); + recvBuffer.push_back(v); + if (recvBuffer.size() < expectedBytes) + return; + + switch (recvBuffer[0]) + { + case TEST: + if (recvBuffer[1] == RF_OFF) + { + state = Off; + toSend.push_back(OK); + SERIAL_LOG("UART%d state Off", index); + } + else if (state == Off) + { + state = Connecting; + toSend.push_back(NOT); + SERIAL_LOG("UART%d state Connecting", index); + } + else + toSend.push_back(OK); + break; + case SEL: + if ((state == Connected || state == FullRead) + && (recvBuffer[5] != 0 || recvBuffer[6] != 0 || recvBuffer[7] != 0 || recvBuffer[8] != 0)) + state = FullRead; + else + state = Connected; + toSend.push_back(OK); + break; + case COUNT: + { + u8 newVal = 0; + switch (recvBuffer[1]) + { + case 0xc0: + newVal = --cardData[16]; + break; + case 0x30: + newVal = --cardData[17]; + break; + case 0x0c: + newVal = --cardData[18]; + break; + case 0x03: + newVal = --cardData[19]; + if (newVal == 0) + makeNewCard(); + break; + } + toSend.push_back(OK); + toSend.push_back(newVal); + saveData(); + SERIAL_LOG("UART%d COUNT %x -> %x", index, recvBuffer[1], newVal); + break; + } + case WRITE: + memcpy(&cardData[4 * rowCounter], &recvBuffer[1], 4); + saveData(); + SERIAL_LOG("UART%d card written @ row %d", index, rowCounter); + toSend.push_back(OK); + break; + case WRITE_NOP: + case WRITE_ST: + case CHANGE: + case HALT: + toSend.push_back(OK); + break; + default: + SERIAL_LOG("UART%d unhandled cmd %x (len %d)", index, recvBuffer[0], expectedBytes); + break; + } + expectedBytes = 0; + } + else + { + switch (v) + { + case TEST: + SERIAL_LOG("UART%d cmd TEST", index); + expect(v, 2); + break; + case CHANGE: // change baud rate + SERIAL_LOG("UART%d cmd CHANGE", index); + expect(v, 1); + break; + case RESET: + SERIAL_LOG("UART%d cmd RESET", index); + state = Off; + toSend.push_back(OK); + break; + case HALT: + SERIAL_LOG("UART%d cmd HALT", index); + expect(v, 4); // ser0 + break; + case READ: + SERIAL_LOG("UART%d cmd READ", index); + toSend.push_back(OK); + if (state == FullRead) { + toSend.insert(toSend.end(), cardData.begin(), cardData.end()); + } + else + { + toSend.insert(toSend.end(), cardData.begin(), cardData.begin() + 8); + static const u8 maskedData[120] = { 0, 0, 0, 0, 0, 0, 0, 0xaa }; + toSend.insert(toSend.end(), std::begin(maskedData), std::end(maskedData)); + } + break; + case SEL: + SERIAL_LOG("UART%d cmd SEL", index); + expect(v, 8); // ser0 key (key is calc'ed from ser1) + break; + case REQ: + SERIAL_LOG("UART%d cmd REQ", index); + if (state == Connecting) + { + state = Connected; + toSend.push_back(RETRY); + SERIAL_LOG("UART%d state Connected", index); + } + else if (state == Connected || state == FullRead) + { + toSend.push_back(OK); + toSend.insert(toSend.end(), &cardData[0], &cardData[4]); // ser0 + SERIAL_LOG("UART%d exec REQ", index); + } + else + toSend.push_back(RETRY); + break; + case COUNT: + SERIAL_LOG("UART%d cmd COUNT", index); + expect(v, 1); + break; + case WRITE: + SERIAL_LOG("UART%d cmd WRITE", index); + rowCounter++; + expect(v, 4); + break; + case WRITE_ST: + case WRITE_NOP: + SERIAL_LOG("UART%d cmd %s", index, v == WRITE_ST ? "WRITE_ST" : "WRITE_NOP"); + if (v == WRITE_ST) + rowCounter = 0; + else + rowCounter++; + expect(v, 4); + break; + default: + INFO_LOG(NAOMI, "UART%d write data out: unknown cmd %x", index, v); + toSend.push_back(NG); + break; + } + } + port->updateStatus(); + } + + int available() override { + return toSend.size(); + } + + u8 read() override + { + u8 b = 0; + if (!toSend.empty()) + { + b = toSend.front(); + toSend.pop_front(); + } + if (toSend.empty()) + port->updateStatus(); + return b; + } + + void serialize(Serializer& ser) const override + { + ser << (u32)toSend.size(); + for (u8 b : toSend) + ser << b; + ser << expectedBytes; + ser << (u32)recvBuffer.size(); + ser.serialize(recvBuffer.data(), recvBuffer.size()); + ser << state; + ser << rowCounter; + ser.serialize(cardData.data(), cardData.size()); + } + + void deserialize(Deserializer& deser) override + { + u32 size; + deser >> size; + toSend.resize(size); + for (u32 i = 0; i < size; i++) + deser >> toSend[i]; + deser >> expectedBytes; + deser >> size; + recvBuffer.resize(size); + deser.deserialize(recvBuffer.data(), recvBuffer.size()); + if (deser.version() >= Deserializer::V41) + { + deser >> state; + deser >> rowCounter; + deser.deserialize(cardData.data(), cardData.size()); + } + else + { + state = Off; + rowCounter = 0; + } + } + +private: + void expect(u8 cmd, int bytes) + { + expectedBytes = bytes + 1; + recvBuffer.clear(); + recvBuffer.push_back(cmd); + } + + void makeNewCard() + { + INFO_LOG(NAOMI, "Creating new RFID card"); + if (gameName.substr(0, 6) == "dinoki") + { + memcpy(&cardData[0], &DINOKING_CHIP_DATA[0], sizeof(DINOKING_CHIP_DATA)); + for (int i = 0; i < 4; i++) + cardData[i] = rand() & 0xff; + + u32 ser1 = ((rand() & 0xffff) << 16) | (rand() & 0xffff); + ser1 &= ~0xc0000000; + if (config::Region == 1) // USA (dinoking, dinokior) + ser1 |= 0x40000000; + ser1 = dinoShuffle(ser1); + cardData[4] = ser1 >> 24; + cardData[5] = ser1 >> 16; + cardData[6] = ser1 >> 8; + cardData[7] = ser1; + } + else + { + memcpy(&cardData[0], &LOVEBERRY_CHIP_DATA[0], sizeof(LOVEBERRY_CHIP_DATA)); + for (int i = 0; i < 4; i++) + cardData[i] = rand() & 0xff; + + cardData[5] = rand() & 0xff; + cardData[7] = rand() & 0xff; + u32 ser1 = (cardData[4] << 24) | (cardData[5] << 16) | (cardData[6] << 8) | cardData[7]; + if (config::Region == 2) // Export + { + ser1 = loveberyDeobfuscate(ser1); + ser1 &= ~0xc0000000; + ser1 = loveberyObfuscate(ser1); + cardData[4] = ser1 >> 24; + cardData[5] = ser1 >> 16; + cardData[6] = ser1 >> 8; + cardData[7] = ser1; + } + + ser1 ^= 0x321c89d3; + cardData[8] = ser1 >> 24; + cardData[9] = ser1 >> 16; + cardData[10] = ser1 >> 8; + cardData[11] = ser1; + } + } + + std::string getCardDataPath() + { + std::string path = hostfs::getArcadeFlashPath(); + switch (config::Region) + { + case 0: + path += "-jp"; + break; + case 1: + path += "-us"; + break; + default: + path += "-exp"; + break; + } + path += ".rfid" + std::to_string(index); + + return path; + } + + void saveData() + { + FILE *f = nowide::fopen(getCardDataPath().c_str(), "wb"); + if (f == nullptr) { + WARN_LOG(NAOMI, "Can't save RFID card: error %x", errno); + return; + } + fwrite(cardData.data(), 1, cardData.size(), f); + fclose(f); + } + + u32 dinoShuffle(u32 v) { + return ((v & 1) << 22) | ((v & 2) << 28) | ((v & 4) << 1) | ((v & 8) << 3) + | ((v & 0x10) << 21) | ((v & 0x20) << 10) | ((v & 0x40) << 1) | ((v & 0x80) >> 7) + | ((v & 0x100) << 22) | ((v & 0x200) >> 1) | ((v & 0x400) >> 1) | ((v & 0x800) << 17) + | ((v & 0x1000) << 4) | ((v & 0x2000) << 18) | ((v & 0x4000) >> 4) | ((v & 0x8000) >> 13) + | ((v & 0x10000) >> 15) | ((v & 0x20000) >> 4) | ((v & 0x40000) << 1) | ((v & 0x80000) >> 8) + | ((v & 0x100000) >> 6) | ((v & 0x200000) << 2) | ((v & 0x400000) >> 18) | ((v & 0x800000) >> 2) + | ((v & 0x1000000) >> 12) | ((v & 0x2000000) >> 7) | ((v & 0x4000000) << 1) | ((v & 0x8000000) >> 3) + | ((v & 0x10000000) >> 11) | ((v & 0x20000000) >> 9) | ((v & 0x40000000) >> 25) | ((v & 0x80000000) >> 5); + } + + u32 dinoUnshuffle(u32 v) { + return ((v & 1) << 7) | ((v & 2) << 15) | ((v & 4) << 13) | ((v & 8) >> 1) + | ((v & 0x10) << 18) | ((v & 0x20) << 25) | ((v & 0x40) >> 3) | ((v & 0x80) >> 1) + | ((v & 0x100) << 1) | ((v & 0x200) << 1) | ((v & 0x400) << 4) | ((v & 0x800) << 8) + | ((v & 0x1000) << 12) | ((v & 0x2000) << 4) | ((v & 0x4000) << 6) | ((v & 0x8000) >> 10) + | ((v & 0x10000) >> 4) | ((v & 0x20000) << 11) | ((v & 0x40000) << 7) | ((v & 0x80000) >> 1) + | ((v & 0x100000) << 9) | ((v & 0x200000) << 2) | ((v & 0x400000) >> 22) | ((v & 0x800000) >> 2) + | ((v & 0x1000000) << 3) | ((v & 0x2000000) >> 21) | ((v & 0x4000000) << 5) | ((v & 0x8000000) >> 1) + | ((v & 0x10000000) >> 17) | ((v & 0x20000000) >> 28) | ((v & 0x40000000) >> 22) | ((v & 0x80000000) >> 18); + } + + u32 loveberyDeobfuscate(u32 v) + { + v ^= 0xa35ec5e3; + // 87654321 -> 34781256 + return ((v & 0xf00000) >> 20) | ((v & 0xf0000) >> 12) + | ((v & 0xf0) << 4) | ((v & 0xf) << 12) + | ((v & 0xf0000000) >> 12) | ((v & 0xf000000) >> 4) + | ((v & 0xf000) << 12) | ((v & 0xf00) << 20); + } + u32 loveberyObfuscate(u32 v) + { + v = ((v & 0xf) << 20) | ((v & 0xf0) << 12) + | ((v & 0xf00) >> 4) | ((v & 0xf000) >> 12) + | ((v & 0xf0000) << 12) | ((v & 0xf00000) << 4) + | ((v & 0xf000000) >> 12) | ((v & 0xf0000000) >> 20); + return v ^ 0xa35ec5e3; + } + + SerialPort *port; + const int index; + const std::string gameName; + std::deque toSend; + std::array cardData; + u8 expectedBytes = 0; + std::vector recvBuffer; + enum State { + Off, + Connecting, + Connected, + FullRead + } state = Off; + int rowCounter = 0; +}; + +// +// Isshoni Wanwan Waiwai Puppy touchscreen +// +class Touchscreen : public SerialPort::Pipe +{ +public: + Touchscreen(SerialPort *port) : port(port) + { + port->setPipe(this); + schedId = sh4_sched_register(0, schedCallback, this); + } + + ~Touchscreen() override + { + sh4_sched_unregister(schedId); + } + + void write(u8 v) override + { + if (v == '\r') + { + if (recvBuffer.size() >= 2 && recvBuffer[0] == 1) + { + toSend.push_back(1); + if (recvBuffer.size() == 3 && recvBuffer[1] == 'O' && recvBuffer[2] == 'I') + { + SERIAL_LOG("Received cmd OI: get name"); + toSend.push_back('A'); + toSend.push_back('3'); + toSend.push_back('0'); + toSend.push_back('9'); + toSend.push_back('9'); + toSend.push_back('9'); + } + else if (recvBuffer.size() == 3 && recvBuffer[1] == 'N' && recvBuffer[2] == 'M') + { + SERIAL_LOG("Received cmd NM: unit verify"); + const std::array id { 'E','X','I','I','-','7','7','2','0','S','C',' ','R','e','v',' ','3','.','0' }; + toSend.insert(toSend.end(), id.begin(), id.end()); + } + else if (recvBuffer.size() == 3 && recvBuffer[1] == 'U' && recvBuffer[2] == 'V') + { + SERIAL_LOG("Received cmd UV: reset"); + const std::array resp { 'Q','M','V','*','*','*','0','0' }; + toSend.insert(toSend.end(), resp.begin(), resp.end()); + } + else if (recvBuffer.size() == 2 && recvBuffer[1] == 'R') + { + SERIAL_LOG("Received cmd R"); + toSend.push_back('0'); + sh4_sched_request(schedId, SCHED_CYCLES); + } + else + { + SERIAL_LOG("Received cmd %c", recvBuffer[1]); + toSend.push_back('0'); + } + toSend.push_back('\r'); + port->updateStatus(); + + // FIXME + if (recvBuffer.size() == 2 && recvBuffer[1] == 'Z') + sendPosition(0); + } + else + { + WARN_LOG(NAOMI, "\\r ignored. buf size %d", (int)recvBuffer.size()); + } + recvBuffer.clear(); + } + else + { + if (recvBuffer.size() == 9) + { + if (!memcmp(&recvBuffer[0], "Ua0000000", 9)) + { + SERIAL_LOG("UART receive Ua...%c", v); + sendPosition(1); + } + else + WARN_LOG(NAOMI, "Unknown command %.9s", &recvBuffer[0]); + recvBuffer.clear(); + } + else + { + recvBuffer.push_back(v); + } + } + } + + int available() override { + return toSend.size(); + } + + u8 read() override + { + u8 data = 0; + if (!toSend.empty()) + { + data = toSend.front(); + toSend.pop_front(); + } + if (toSend.empty()) + port->updateStatus(); + SERIAL_LOG("UART read data %x", data); + return data; + } + + void serialize(Serializer& ser) const override + { + ser << (u32)toSend.size(); + for (u8 b : toSend) + ser << b; + ser << (u32)recvBuffer.size(); + ser.serialize(recvBuffer.data(), recvBuffer.size()); + } + + void deserialize(Deserializer& deser) override + { + u32 size; + deser >> size; + toSend.resize(size); + for (u32 i = 0; i < size; i++) + deser >> toSend[i]; + deser >> size; + recvBuffer.resize(size); + deser.deserialize(recvBuffer.data(), recvBuffer.size()); + } + +private: + void sendPosition(int type) + { + MapleInputState input[4]; + ggpo::getInput(input); + // 0-1023 ? + const u32 x = (640 - input[0].absPos.x) * 1023 / 639; + const u32 y = input[0].absPos.y * 1023 / 479; + + size_t start = toSend.size(); + if (type == 1) + { + toSend.push_back('U'); + toSend.push_back('T'); + toSend.push_back(0x20); // bit 0 and 1 are checked + toSend.push_back(x & 0xff); + toSend.push_back((x >> 8) & 0x1f); + toSend.push_back(y & 0xff); + toSend.push_back((y >> 8) & 0x1f); + toSend.push_back(0); // z pos + u8 crc = 0xaa; + for (; start < toSend.size(); start++) + crc += toSend[start]; + toSend.push_back(crc); + port->updateStatus(); + } + else + { + bool button = (input[0].kcode & DC_BTN_A) == 0; + if (button != lastButton || x != lastPosX || y != lastPosY) + { + // bit 6 is touch down + if (button) + toSend.push_back(0xc0); + else + toSend.push_back(0x80); + toSend.push_back((x & 7) << 4); + toSend.push_back((x >> 3) & 0x7f); + toSend.push_back((y & 7) << 4); + toSend.push_back((y >> 3) & 0x7f); + lastButton = button; + lastPosX = x; + lastPosY = y; + port->updateStatus(); + } + } + } + + static int schedCallback(int tag, int cycles, int jitter, void *p) + { + ((Touchscreen *)p)->sendPosition(0); + return SCHED_CYCLES; + } + + SerialPort *port; + std::deque toSend; + std::vector recvBuffer; + int schedId = 0; + u32 lastPosX = ~0; + u32 lastPosY = ~0; + bool lastButton = false; + + static constexpr u32 SCHED_CYCLES = SH4_MAIN_CLOCK / 60; +}; + +u8 SerialPort::readReg(u32 addr) +{ + switch ((addr & 0x3f) / 4) + { + case 0: // data in + if (pipe != nullptr) + return pipe->read(); + else + return 0; + case 1: // out buffer len + //SERIAL_LOG("UART%d read out buf len", index); + return 0; + case 2: // in buffer len + //SERIAL_LOG("UART%d read in buf len %d", index, (int)toSend.size()); + if (pipe != nullptr) + return pipe->available(); + else + return 0; + case 3: // errors? + SERIAL_LOG("UART%d read errors", index); + return 0; + case 4: // unknown + SERIAL_LOG("UART%d read reg4", index); + return 0; + case 5: // flow control + SERIAL_LOG("UART%d read flow control", index); + return 0; + case 6: // status. bit 3: receive buffer not empty + SERIAL_LOG("UART%d read status", index); + if (pipe != nullptr && pipe->available() > 0) + return 8; + else + return 0; + case 7: // interrupt status/mask? + SERIAL_LOG("UART%d read interrupt mask/status?", index); + return 0; + case 8: // unknown + SERIAL_LOG("UART%d read reg8", index); + return 0; + case 9: // control? + SERIAL_LOG("UART%d read control?", index); + return 0; + case 10: // baudrate (lsb) + SERIAL_LOG("UART%d read baudrate(lsb)", index); + return 0; + case 11: // baudrate (msb) + SERIAL_LOG("UART%d read baudrate(msb)", index); + return 0; + default: + INFO_LOG(NAOMI, "Unknown UART%d port %x\n", index, addr); + return 0; + } +} + +void SerialPort::writeReg(u32 addr, u8 v) +{ + switch ((addr & 0x3f) / 4) + { + case 0: // data out + if (pipe != nullptr) + pipe->write(v); + else + INFO_LOG(NAOMI, "UART%d out: %02x %c", index, v, v); + break; + + case 1: // out buffer len + SERIAL_LOG("UART%d write out buffer len: %x", index, v); + break; + + case 2: // in buffer len + SERIAL_LOG("UART%d write in buffer len: %x", index, v); + break; + + case 3: // errors? + SERIAL_LOG("UART%d write errors: %x", index, v); + break; + + case 4: // unknown + SERIAL_LOG("UART%d write reg4: %x", index, v); + break; + + case 5: // flow control + SERIAL_LOG("UART%d write flow control: %x", index, v); + break; + + case 6: // status. bit 3: receive buffer not empty + SERIAL_LOG("UART%d write status: %x", index, v); + break; + + case 7: // interrupt status/mask? + SERIAL_LOG("UART%d write interrupt status/mask?: %x", index, v); + break; + + case 8: // unknown + SERIAL_LOG("UART%d write reg8: %x", index, v); + break; + + case 9: // control? + SERIAL_LOG("UART%d write control: %x", index, v); + break; + + case 10: // baudrate (lsb) + SERIAL_LOG("UART%d write baudrate(lsb): %x", index, v); + flush(); + break; + + case 11: // baudrate (msb) + SERIAL_LOG("UART%d write baudrate(msb): %x", index, v); + flush(); + break; + + default: + INFO_LOG(NAOMI, "Unknown UART%d port %x\n", index, addr); + break; + } +} + +void SerialPort::updateStatus() +{ + cart->updateInterrupt(index == 1 ? SystemSpCart::INT_UART1 : SystemSpCart::INT_UART2); +} + +class DefaultIOManager : public IOPortManager +{ +public: + // IN_PORT0 + u8 getCN9_17_24() override + { + u8 v = 0xff; + // 0: P1 start + // 1: P2 start + // 2: P1 right + // 3: P2 right + // 4: P1 left + // 5: P2 left + // 6: P1 up + // 7: P2 up + getInputState(); + if (!(mapleInputState[0].kcode & DC_BTN_START)) + v &= ~0x01; + if (!(mapleInputState[1].kcode & DC_BTN_START)) + v &= ~0x02; + if (!(mapleInputState[0].kcode & DC_DPAD_RIGHT)) + v &= ~0x04; + if (!(mapleInputState[1].kcode & DC_DPAD_RIGHT)) + v &= ~0x08; + if (!(mapleInputState[0].kcode & DC_DPAD_LEFT)) + v &= ~0x10; + if (!(mapleInputState[1].kcode & DC_DPAD_LEFT)) + v &= ~0x20; + if (!(mapleInputState[0].kcode & DC_DPAD_UP)) + v &= ~0x40; + if (!(mapleInputState[1].kcode & DC_DPAD_UP)) + v &= ~0x80; + IO_LOG("systemsp::read IN_PORT0 %x", v); + return v; + } + + // IN_PORT3 / IO-0 + u8 getCN9_25_32() override + { + u8 v = 0xff; + // 0: P1 down + // 1: P2 down + // 2: P1 button 1 + // 3: P2 button 1 + // 4: P1 button 2 + // 5: P2 button 2 + // 6: P1 button 3 + // 7: P2 button 3 + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD_DOWN)) + v &= ~0x01; + if (!(mapleInputState[1].kcode & DC_DPAD_DOWN)) + v &= ~0x02; + if (!(mapleInputState[0].kcode & DC_BTN_A)) + v &= ~0x04; + if (!(mapleInputState[1].kcode & DC_BTN_A)) + v &= ~0x08; + if (!(mapleInputState[0].kcode & DC_BTN_B)) + v &= ~0x10; + if (!(mapleInputState[1].kcode & DC_BTN_B)) + v &= ~0x20; + if (!(mapleInputState[0].kcode & DC_BTN_C)) + v &= ~0x40; + if (!(mapleInputState[1].kcode & DC_BTN_C)) + v &= ~0x80; + IO_LOG("systemsp::read IN_PORT3 %x", v); + return v; + } + + // IO-1 + u8 getCN9_33_40() override + { + IO_LOG("systemsp::read IN CN9 33-40"); + return 0xff; + } + + // IN_PORT1 + u8 getCN9_41_48() override + { + u8 v = 0xff; + // 0: P1 service + // 2: P1 test + // 4: P1 coin + // 5: P2 coin + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD2_UP)) // service + v &= ~0x01; + if (!(mapleInputState[0].kcode & DC_DPAD2_DOWN)) // test + v &= ~0x04; + if (!(mapleInputState[0].kcode & DC_BTN_D)) // coin + v &= ~0x10; + if (!(mapleInputState[1].kcode & DC_BTN_D)) + v &= ~0x20; + IO_LOG("systemsp::read IN_PORT1 %x", v); + return v; + } + + // IN_PORT4 / OUT-0 + u8 getCN9_49_56() override + { + u8 v = 0; + // FIXME these are outputs?? + // 0: P1 coin meter + // 1: P2 coin meter + getInputState(); + if (!(mapleInputState[0].kcode & DC_BTN_D)) // coin + v |= 1; + if (!(mapleInputState[1].kcode & DC_BTN_D)) + v |= 2; + IO_LOG("systemsp::read IN_PORT4 %x", v); + return v; + } + + // IN G-PORT + u8 getCN10_9_16() override + { + u8 v = 0; + // dinosaur king, love & berry: + // 0: 232c sel status 1 (not used) + // 1: 232c sel status 2 (not used) + // 2: card status1 (not used) + // 3: card status2 (not used) + // 4: card status3 (not used) + // FIXME read sequentially after reading/writing reg24 (c0?), gives 4 shorts (8 reads) + IO_LOG("systemsp::read IN G-PORT %d", v); + return v; + } + +protected: + static constexpr u64 msAsCycles(int ms) { + return (u64)SH4_MAIN_CLOCK * ms / 1000; + } + + // On and Period in SH4 ms + template + class PeriodicSensor + { + public: + bool get(bool actuator = true) + { + const u64 now = sh4_sched_now64(); + if (actuator) + position = (position + now - lastTime) % msAsCycles(Period); + lastTime = now; + return position < msAsCycles(On); + } + + private: + u64 position = msAsCycles(Period) / 2; + u64 lastTime = 0; + }; + + // Width in SH4 ms + template + class PulseSensor + { + public: + bool get(bool actuator) + { + if (!actuator) + { + startTime = 0; + return false; + } + else + { + const u64 now = sh4_sched_now64(); + if (startTime == 0) + startTime = now; + return now - startTime < msAsCycles(Width); + } + } + + private: + u64 startTime = 0; + }; + + void getInputState() + { + ggpo::getInput(mapleInputState); + if (NaomiGameInputs != nullptr) + { + for (const ButtonDescriptor& bd : NaomiGameInputs->buttons) + { + if (bd.name == nullptr) + break; + if (bd.target != 0) + { + // remap P1 -> P1 and P2 -> P2 + if ((mapleInputState[0].kcode & bd.source) == 0) + mapleInputState[0].kcode &= ~bd.target; + if ((mapleInputState[1].kcode & bd.source) == 0) + mapleInputState[1].kcode &= ~bd.target; + } + else if (bd.p2_target != 0) + { + // remap P1 -> P2 + if ((mapleInputState[0].kcode & bd.source) == 0) + mapleInputState[1].kcode &= ~bd.p2_target; + } + else if (bd.p1_target != 0) + { + // remap P2 -> P1 + if ((mapleInputState[1].kcode & bd.source) == 0) + mapleInputState[0].kcode &= ~bd.p1_target; + } + } + } + } + + MapleInputState mapleInputState[4]; +}; + +class CardReaderIOManager : public DefaultIOManager +{ +public: + u8 getCN9_17_24() override + { + getInputState(); + for (size_t i = 0; i < 2; i++) + { + if ((mapleInputState[i].kcode & DC_BTN_INSERT_CARD) == 0 + && (last_kcode[i] & DC_BTN_INSERT_CARD) != 0) + card_reader::insertCard(i); + last_kcode[i] = mapleInputState[i].kcode; + } + return DefaultIOManager::getCN9_17_24(); + } + + u8 getCN9_33_40() override + { + IO_LOG("systemsp::read IN CN9 33-40"); + // dinosaur king, love & berry: + // 0: P1 card set (not used) + // 2: CD1 input ok (active low) + // 4: CD1 card jam (active low) + // 6: CD1 empty (active low) + return 0xfb; + } + +private: + u32 last_kcode[2] = {}; +}; + +class IsshoniIOManager : public CardReaderIOManager +{ +public: + u8 getCN9_17_24() override { + CardReaderIOManager::getCN9_17_24(); + return 0xff; + } + + u8 getCN9_25_32() override { + return 0xff; + } +}; + +class HopperIOManager : public DefaultIOManager +{ + // IN_PORT1 + u8 getCN9_41_48() override + { + u8 v = 0xbf; + // 0: P1 service + // 2: P1 test + // 4: P1 coin + // 5: P2 coin + // 6: must be 0 (hopper: not connected / mount error) + // 7: must be 1 (hopper: coin2 chute jammed) + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD2_UP)) // service + v &= ~0x01; + if (!(mapleInputState[0].kcode & DC_DPAD2_DOWN)) // test + v &= ~0x04; + if (p1CoinSensor.get(!(mapleInputState[0].kcode & DC_BTN_D))) + v &= ~0x10; + if (p2CoinSensor.get(!(mapleInputState[1].kcode & DC_BTN_D))) + v &= ~0x20; + if (hopperSensor.get(hopperActive) && hopperActive) + v |= 0x40; + IO_LOG("systemsp::read IN_PORT1 %x", v); + return v; + } + + void setCN9_49_56(u8 v) override + { + // 4: hopper + // 7: ? + hopperActive = (v & 0x10) != 0; + if (hopperActive) + IO_LOG("HOPPER ON"); + } + + bool hopperActive = false; + PulseSensor<100> p1CoinSensor; + PulseSensor<100> p2CoinSensor; + PeriodicSensor<10, 50> hopperSensor; +}; + +class ManpukuIOManager : public HopperIOManager +{ + // IN_PORT0 + u8 getCN9_17_24() override + { + u8 v = 0xff; + // 4: Left + // 5: Middle + // 6: Right + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD_LEFT)) + v &= ~0x10; + if (!(mapleInputState[0].kcode & DC_DPAD_DOWN)) + v &= ~0x20; + if (!(mapleInputState[0].kcode & DC_DPAD_RIGHT)) + v &= ~0x40; + IO_LOG("systemsp::read IN_PORT0 %x", v); + return v; + } +}; + +// Yataimura Kingyosukui, Yataimura Shateki +class KingyoIOManager : public HopperIOManager +{ + // IN_PORT0 + u8 getCN9_17_24() override + { + u8 v = 0xff; + // 0: Left + // 1: Right + // 2: Down + // 3: Up + // 4: Button 1 + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD_LEFT)) + v &= ~0x01; + if (!(mapleInputState[0].kcode & DC_DPAD_RIGHT)) + v &= ~0x02; + if (!(mapleInputState[0].kcode & DC_DPAD_DOWN)) + v &= ~0x04; + if (!(mapleInputState[0].kcode & DC_DPAD_UP)) + v &= ~0x08; + if (!(mapleInputState[0].kcode & DC_BTN_A)) + v &= ~0x10; + IO_LOG("systemsp::read IN_PORT0 %x", v); + return v; + } +}; + +// Notes: +// COUNT HOPPER JAM - LOCK SENSOR ON 1 SEC +// 00:19:308 hw/naomi/systemsp.cpp:1197 D[NAOMI]: OUT CN9_33-40 COUNT HOPPER HOPPER MTR +// 00:19:311 hw/naomi/systemsp.cpp:1223 D[NAOMI]: JP SOLENOID ON +// -> fixed by timing countHopperRot sensor to 0.5 s max +// HOPPER EMPTY/JAM - MOTOR DRIVE BUT SENSOR OFF +// 01:56:773 hw/naomi/systemsp.cpp:1197 D[NAOMI]: OUT CN9_33-40 HOPPER MTR +// -> fixed by resetting hopper sensor when hopper motor is on. +// SLOPE SENSOR TIMEOUT - MOTOR DRIVE BUT SENSOR OFF +// 07:52:477 hw/naomi/systemsp.cpp:1218 D[NAOMI]: OUT CN9_33-40 COUNT HOPPER SLOPE MTR +// -> set slope sensor low when slope motor on +// ILLEGAL CHACKER IN - MANY CHACKER IN BUT NO COIN IN +// -> fixed by setting COIN L or R when checker on +// COIN IN RATIO TOO HIGH - CTRL COIN IN RATIO OVER 105% +// -> not enough coin L/R vs. checker in? +// debug flag locations: +// magicpop 0x8c2e729e +// unomedal 0x8c22baf2 +// puyomedal 0x8c2b67de +// ochaken 0x8c25c6da +// westdmrg 0x8c22d1aa +class MedalIOManager : public DefaultIOManager +{ + // IN_PORT0 + u8 getCN9_17_24() override + { + u8 v = 0x50; + // 0: slope sensor up (active high) + // 1: slope sensor low (active high) + // 2: count hopper rot. (active high) + // 3: count hopper sensor (active high) + // 4: hopper sensor + // 5: pusher sensor (active high) + // 6: tilt bob sensor + // 7: checker 9 (active high) + if (countHopperRotSensor.get(countHopperMtr)) + v |= 0x04; // count hopper rot sensor + // FIXME generates FIELD P/O TOO HIGH errors. Activate the sensor 50% of the time? + //if (countHopperSensor.get(countHopperMtr)) + // v |= 0x08; // count hopper sensor + if (hopperSensor.get(hopperMtr)) + v &= ~0x10; // hopper sensor + if (slopeMtr) + v |= 2; // slope sensor low + else + v |= 1; // slope sensor up + if (pusherSensor.get(pusherMtr)) + v |= 0x20; // pusher sensor + if (!(mapleInputState[0].kcode & DC_BTN_START)) + v |= 0x80; // checker 9 + return v; + } + + // IN_PORT1 + u8 getCN9_41_48() override + { + u8 v = 0x2f; + // 0: service/reset sw + // 1: left sw + // 2: test sw + // 3: center sw + // 4: door sensor up (active high) + // 5: right sw + // 6: door sensor left (active high) + // 7: tilt sensor br (active high) + getInputState(); + if (!(mapleInputState[0].kcode & DC_DPAD2_UP)) // service/reset + v &= ~0x01; + if (!(mapleInputState[0].kcode & DC_DPAD2_DOWN)) // test + v &= ~0x04; + if (!(mapleInputState[0].kcode & DC_DPAD_LEFT)) // left sw + v &= ~0x02; + if (!(mapleInputState[0].kcode & DC_DPAD_DOWN)) // center sw + v &= ~0x08; + if (!(mapleInputState[0].kcode & DC_DPAD_RIGHT)) // right sw + v &= ~0x20; + + return v; + } + + // IN_PORT3 / IO-0 + u8 getCN9_25_32() override + { + u8 v = 0; + // 0: checker 1 (active high) + // 1: checker 2 (active high) + // 2: checker 3 (active high) + // 3: checker 4 (active high) + // 4: checker 5 (active high) + // 5: checker 6 (active high) + // 6: checker 7 (active high) + // 7: checker 8 (active high) + if (!(mapleInputState[0].kcode & DC_BTN_A)) + v |= 0x01; + if (!(mapleInputState[0].kcode & DC_BTN_B)) + v |= 0x02; + if (!(mapleInputState[0].kcode & DC_BTN_C)) + v |= 0x04; + if (!(mapleInputState[0].kcode & DC_BTN_X)) + v |= 0x08; + if (!(mapleInputState[0].kcode & DC_BTN_Y)) + v |= 0x10; + if (!(mapleInputState[0].kcode & DC_BTN_Z)) + v |= 0x20; + if (!(mapleInputState[0].kcode & DC_DPAD2_LEFT)) + v |= 0x40; + if (!(mapleInputState[0].kcode & DC_DPAD2_RIGHT)) + v |= 0x80; + return v; + } + + // IN G-PORT + u8 getCN10_9_16() override + { + u8 v = 0; + // 0: jp mecha sensor u (active high) + // 2: jp mecha sensor d (active high) + // 3: co. full sensor (active high) + // 4: coin in L (active high) + // 5: coin in R (active high) + // 7: jp solenoid sensor (active high) + if (jpmechaMtr) + v |= 4; + else + v |= 1; + // FIXME not enough coin ins if multiple checkers pressed at once -> COIN IN RATIO TOO HIGH + if ((mapleInputState[0].kcode & (DC_BTN_A | DC_BTN_B | DC_BTN_C | DC_BTN_X | DC_BTN_Y | DC_BTN_Z)) + != (DC_BTN_A | DC_BTN_B | DC_BTN_C | DC_BTN_X | DC_BTN_Y | DC_BTN_Z)) + v |= 0x10; // coin in L + if ((mapleInputState[0].kcode & (DC_DPAD2_LEFT | DC_DPAD2_RIGHT | DC_BTN_START)) + != (DC_DPAD2_LEFT | DC_DPAD2_RIGHT | DC_BTN_START)) + v |= 0x20; // coin in R + if (jpmechaSolenoid) + v |= 0x80; + + return v; + } + + // IO-1 (CN9 33-40) + void setCN9_33_40(u8 v) override + { + // 3: jp mecha motor + // 4: count hopper motor + // 5: hopper motor + // 6: pusher motor + // 7: slope motor + jpmechaMtr = !(v & 0x08); + countHopperMtr = !(v & 0x10); + hopperMtr = !(v & 0x20); + pusherMtr = !(v & 0x40); + slopeMtr = !(v & 0x80); + if ((v & 0xf8) != 0xf8) + IO_LOG("OUT CN9_33-40 %s %s %s %s %s", + v & 0x08 ? "" : "JP MECHA MTR", + v & 0x10 ? "" : "COUNT HOPPER", + v & 0x20 ? "" : "HOPPER MTR", + v & 0x40 ? "" : "PUSHER MTR", + v & 0x80 ? "" : "SLOPE MTR"); + } + + // OUT-0 (CN9 49-56) + void setCN9_49_56(u8 v) override + { + // 4: sw lamp L + // 5: sw lamp R + // 6: patrol lamp + // 7: jackpot lamp + } + + // OUT-1 (CN10 17-24) + void setCN10_17_24(u8 v) override + { + // 0: sw.lamp c + // 1: jp solenoid + // 6: side lamp L + // 7: side lamp R + jpmechaSolenoid = v & 2; + if (jpmechaSolenoid) + IO_LOG("JP SOLENOID ON"); + } + + bool jpmechaMtr = false; + bool countHopperMtr = false; + bool hopperMtr = false; + bool pusherMtr = false; + bool slopeMtr = false; + bool jpmechaSolenoid = false; + PeriodicSensor<50, 250> hopperSensor; + PeriodicSensor<100, 4300> pusherSensor; + PeriodicSensor<100, 500> countHopperRotSensor; + PeriodicSensor<50, 250> countHopperSensor; +}; + +template +T readMemArea0(u32 addr) +{ + verify(SystemSpCart::Instance != nullptr); + return SystemSpCart::Instance->readMemArea0(addr); +} +template u32 readMemArea0<>(u32 addr); +template u16 readMemArea0<>(u32 addr); +template u8 readMemArea0<>(u32 addr); + +template +T SystemSpCart::readMemArea0(u32 addr) +{ + addr &= 0x1fffff; + if (addr < 0x10000) + { + // banked access to ROM/NET board address space, mainly backup SRAM and ATA + u32 offset = (addr & 0xffff) | ((bank & 0x3fff) << 16); + if ((bank & 0x3f00) == 0x3900) + { + // SRAM + FLASH_LOG("systemsp::read(%x) SRAM. offset %x", addr, offset); + verify(!(bank & 0x4000)); + // 8-bit device on 16-bit bus + if constexpr (sizeof(T) == 1) + { + if (offset & 1) + return 0xff; + else + return nvmem::readFlash(offset / 2, 1); + } + else if constexpr (sizeof(T) == 2) + return 0xff00 | nvmem::readFlash(offset / 2, 1); + else + return 0xff00ff00 | nvmem::readFlash(offset / 2, 1) | (nvmem::readFlash(offset / 2 + 1, 1) << 16); + } + else if ((bank & 0x3f00) == 0x3a00) + { + // CF IDE registers + switch (addr & 0xffff) + { + case 0x00: // RD data + if constexpr (sizeof(T) == 2) + { + addr &= ~1; + T ret = readMemArea0(addr); + ret |= readMemArea0(addr) << 8; + if (bank & 0x4000) + // decrypt + ret = decrypt(ret); + return ret; + } + else + { + u8 data = 0; + if (ata.bufferIndex < SECTOR_SIZE) + { + data = ata.buffer[ata.bufferIndex++]; + if (ata.bufferIndex == SECTOR_SIZE) + { + if (ata.sectorCount > 1) + { + // read next sector + ata.sectorCount--; + ata.sectorNumber++; + if (ata.sectorNumber == 0) + ata.cylinder++; + if (ata.cylinder == 0) + ata.driveHead.head++; + readSectors(); + updateInterrupt(INT_ATA); + } + else + { + // no more data + ata.status.drq = 0; + } + } + } + ATA_LOG("systemsp::read(%x) CF ATA data %02x %c", addr, data, data >= 32 && data < 127 ? (char)data : ' '); + return data; + } + case 0x04: // error + ATA_LOG("systemsp::read(%x) CF ATA error", addr); + return 0; + case 0x08: // sector count + ATA_LOG("systemsp::read(%x) CF ATA sector count %d", addr, ata.sectorCount); + return ata.sectorCount; + case 0x0c: // sector no + ATA_LOG("systemsp::read(%x) CF ATA sector# %x", addr, ata.sectorNumber); + return ata.sectorNumber; + case 0x10: // cylinder (lsb) + ATA_LOG("systemsp::read(%x) CF ATA cylinder(lsb) %x", addr, ata.cylinder & 0xff); + return ata.cylinder & 0xff; + case 0x14: // cylinder (msb) + ATA_LOG("systemsp::read(%x) CF ATA cylinder(msb) %x", addr, ata.cylinder >> 8); + return ata.cylinder >> 8; + case 0x18: // select card/head + ATA_LOG("systemsp::read(%x) CF ATA card/head %x", addr, ata.driveHead.full); + return ata.driveHead.full; + case 0x1c: // status + { + // BUSY RDY DWF DSC DRQ CORR 0 ERR + ATA_LOG("systemsp::read(%x) CF ATA status %x", addr, ata.status.full); + u8 status = ata.status.full; + // TODO correct? + ata.status.dsc = 0; + return status; + } + default: + INFO_LOG(NAOMI, "systemsp::read(%x) CF IDE unknown reg", addr); + return -1; + } + } + else if ((bank & 0x3f00) == 0x3b00) + { + // CF IDE AltStatus/Device Ctrl register + if ((addr & 0xffff) == 0x18) { + ATA_LOG("systemsp::read(%x) CF IDE AltStatus %x", addr, ata.status.full); + return ata.status.full; + } + INFO_LOG(NAOMI, "systemsp::read(%x) CF IDE AltStatus unknown addr", addr); + return 0; + } + else if ((bank & 0x3f00) == 0x3d00) + { + // Network aka Media board shared buffer/RAM + verify(!(bank & 0x4000)); + DEBUG_LOG(NAOMI, "systemsp::read(%x) Network shared RAM. offset %x", addr, offset); + return -1; + } + else if ((bank & 0x3f00) == 0x3f00) + { + // Network board present flag (0x01) + DEBUG_LOG(NAOMI, "systemsp::read(%x) Network board present. offset %x", addr, offset); + return 0; + } + T v; + if (!CurrentCartridge->Read(offset, sizeof(T), &v)) + return -1; + else + return v; + } + else if (addr == 0x10000) + { + // bank register + return (T)bank; + } + else if (addr < 0x10100) + { + // IRQ pending/reset, ATA control + DEBUG_LOG(NAOMI, "systemsp::read(%x) IRQ pending/reset, ATA control", addr); + switch (addr - 0x10000) + { + case 0x30: + return 0; + case 0x80: + { + // interrupt status + const u8 intPending = ata.interruptPending; + ata.interruptPending = 0; + updateInterrupt(); + // b0: UART1 + // b1: UART2 + // b3: DIMM + // b4: ATA controller + return intPending; + } + case 0x84: + // interrupt mask? + // 10084: (dinoking) bit0,1 reset, sometimes set + return ata.reg84; + default: + return 0; + } + } + else if (addr < 0x10128) + { + // I/O chip for inputs + switch (addr - 0x10100) + { + case 0x0: // IN_PORT0 (CN9 17-24) + return ioPortManager->getCN9_17_24(); + + case 0x4: // IN_PORT1 (CN9 41-48) + return ioPortManager->getCN9_41_48(); + + case 0x8: // IN_PORT3 (CN9 25-32) + return ioPortManager->getCN9_25_32(); + + case 0xc: // IN CN9 33-40 + return ioPortManager->getCN9_33_40(); + + case 0x10: // IN_PORT4 (CN9 49-56) + return ioPortManager->getCN9_49_56(); + + case 0x18: // IN_PORT2 (DIP switches and jumpers, and P1 service for older pcb rev) + { + // DIP switches + // 0: unknown, active low + // 1: unknown, active low + // 2: monitor (1: 31 kHz, 0: 15 kHz) + // 3: unknown, must be on (active low) + // 4: JP5 (system service) + // 5: JP6 (system test) + // 6: JP7 + // 7: JP8 + IO_LOG("systemsp::read(%x) IN_PORT2 %x", addr, 7); + return 0xf7; + } + case 0x20: // IN G_PORT CN10 9-16 + return ioPortManager->getCN10_9_16(); + + case 0x24: // bios, write too + IO_LOG("systemsp::read(%x) ??", addr); + return 0; + default: + IO_LOG("systemsp::read(%x) inputs??", addr); + return 0; + } + } + else if (addr == 0x10128) + { + // eeprom + return eeprom.readDO() << 4; + } + else if (addr == 0x10150) + { + // CFG rom board debug flags + // bit 0 - romboard type, 1 = M4 + // bit 1 - debug mode (enable easter eggs in BIOS, can boot game without proper eeproms/settings) + IO_LOG("systemsp::read(%x) CFG DIP switches", addr); + return 3; // M4 board type, debug on; + } + else if (addr < 0x10180) { + // unknown + } + else if (addr < 0x101c0) + { + // custom UART 1 + return uart1.readReg(addr); + } + else if (addr < 0x101f0) + { + // custom UART 2 + return uart2.readReg(addr); + } + INFO_LOG(NAOMI, "systemsp::readMemArea0<%d>: Unknown addr %x", (int)sizeof(T), addr); + return -1; +} + +template +void writeMemArea0(u32 addr, T v) +{ + verify(SystemSpCart::Instance != nullptr); + SystemSpCart::Instance->writeMemArea0(addr, v); +} +template void writeMemArea0<>(u32 addr, u32 v); +template void writeMemArea0<>(u32 addr, u16 v); +template void writeMemArea0<>(u32 addr, u8 v); + +template +void SystemSpCart::writeMemArea0(u32 addr, T v) +{ + //DEBUG_LOG(NAOMI, "SystemSpCart::writeMemArea0(%x, %x)", addr, (u32)v); + addr &= 0x1fffff; + if (addr < 0x10000) + { + // banked access to ROM/NET board address space, mainly backup SRAM and ATA + u32 offset = (addr & 0xffff) | ((bank & 0x3fff) << 16); + if ((bank & 0x3f00) == 0x3900) + { + FLASH_LOG("systemsp::write(%x) SRAM. offset %x data %x", addr, offset, (u32)v); + // 8-bit device on 16-bit bus + if constexpr (sizeof(T) == 1) { + if (offset & 1) + return; + } + if constexpr (sizeof(T) == 4) + nvmem::writeFlash(offset / 2 + 1, (u8)(v >> 16), 1); + nvmem::writeFlash(offset / 2, (u8)v, 1); + return; + } + else if ((bank & 0x3f00) == 0x3a00) + { + // CF IDE registers + switch (addr & 0xffff) + { + case 0x00: // WR data + ATA_LOG("systemsp::write(%x) CF ATA data = %x", addr, (u32)v); + break; + case 0x04: // features + ATA_LOG("systemsp::write(%x) CF ATA features = %x", addr, (u32)v); + ata.features = v; + break; + case 0x08: // sector count + ATA_LOG("systemsp::write(%x) CF ATA sector count = %x", addr, (u32)v); + ata.sectorCount = v; + break; + case 0x0c: // sector no + ATA_LOG("systemsp::write(%x) CF ATA sector# = %x", addr, (u32)v); + ata.sectorNumber = v; + break; + case 0x10: // cylinder (lsb) + ATA_LOG("systemsp::write(%x) CF ATA cylinder(lsb) = %x", addr, (u32)v); + ata.cylinder = (ata.cylinder & 0xff00) | (v & 0xff); + break; + case 0x14: // cylinder (msb) + ATA_LOG("systemsp::write(%x) CF ATA cylinder(msb) = %x", addr, (u32)v); + ata.cylinder = (ata.cylinder & 0xff) | ((v & 0xff) << 8); + break; + case 0x18: // select card/head + ATA_LOG("systemsp::write(%x) CF ATA card/head = %x", addr, (u32)v); + ata.driveHead.full = v | 0xa0; + break; + case 0x1c: // command + switch (v) + { + case 0x20: + ATA_LOG("systemsp::write(%x) CF ATA cmd: read %d sector(s): c %x h %x s %x", addr, ata.sectorCount, ata.cylinder, ata.driveHead.head, ata.sectorNumber); + ata.status.rdy = 0; + ata.status.bsy = 1; + ata.status.drq = 1; // FIXME should be done in the callback + sh4_sched_request(schedId, 2000); // 10 us + readSectors(); + break; + case 0xe1: + ATA_LOG("systemsp::write(%x) CF ATA cmd: idle immediate", addr); + ata.status.bsy = 1; + ata.status.rdy = 0; + sh4_sched_request(schedId, 2000); // 10 us + break; + default: + INFO_LOG(NAOMI, "systemsp::write(%x) CF ATA command unknown: %x", addr, (u32)v); + break; + } + break; + default: + INFO_LOG(NAOMI, "systemsp::write(%x) CF ATA unknown reg = %x", addr, (u32)v); + break; + } + return; + } + else if ((bank & 0x3f00) == 0x3b00) + { + if ((addr & 0xffff) == 0x18) + { + // CF IDE AltStatus/Device Ctrl register + if (ata.devCtrl.srst && !(v & 4)) + { + // software reset + ata.bufferIndex = ~0; + ata.error = 0; + ata.status.drq = 0; + ata.status.err = 0; + } + ATA_LOG("systemsp::write(%x) CF IDE Device Ctrl = %x", addr, (u32)v); + ata.devCtrl.full = v & 0x86; + } + else + INFO_LOG(NAOMI, "systemsp::write(%x) CF IDE unknown reg %x data %x", addr, offset, (u32)v); + return; + } + else if ((bank & 0x3f00) == 0x3d00) { + // Network aka Media board shared buffer/RAM + DEBUG_LOG(NAOMI, "systemsp::write(%x) Network shared RAM. offset %x data %x", addr, offset, (u32)v); + return; + } + else if ((bank & 0x3f00) == 0x3f00) { + // Network board present flag (0x01) + DEBUG_LOG(NAOMI, "systemsp::write(%x) Network board present. offset %x data %x", addr, offset, (u32)v); + return; + } + } + else if (addr == 0x10000) + { + // bank register + if (bank != (u16)v) + DEBUG_LOG(NAOMI, "systemsp: G2 Bank set to %08X%s", (v & 0x3fff) << 16, (v & 0x4000) ? " decrypt ON" : ""); + bank = (u16)v; + return; + } + else if (addr < 0x10100) + { + // IRQ pending/reset, ATA control + DEBUG_LOG(NAOMI, "systemsp::write(%x) IRQ pending/reset, ATA control. data %x", addr, (u32)v); + switch (addr - 10000) + { + case 0x84: + ata.reg84 = v; + break; + default: + break; + } + return; + } + else if (addr < 0x10128) + { + // I/O chip for outputs + switch (addr - 0x10100) + { + case 0x8: // OUT_PORT3 (CN9 25-32)? + IO_LOG("systemsp::write(%x) OUT CN9 25-32? %x", addr, v); + break; + case 0xc: // IO-1 CN9 33-40 + ioPortManager->setCN9_33_40(v); + break; + case 0x10: // OUT_PORT4 (CN9 49-56) + // 0: (P1 coin meter) + // 1: (P2 coin meter) + // giant tetris: + // 2: P1 start lamp + // 3: P2 start lamp + // 4: P1 button 1 lamp + // 5: P2 button 1 lamp + // 6: P1 button 2 lamp + // 7: P2 button 2 lamp + // dinosaur king, love & berry: + // 2: coin blocker 1 (not used) + // 3: coin blocker 2 (not used) + // 4: cd1 card pickout + // 5: cd2 card pickout (not used) + // 6: cd1 jam reset + // 7: cd2 jam reset (not used) + // hopper: + // 4: payout? + // 7: ? + ioPortManager->setCN9_49_56(v); + break; + case 0x14: // OUT CN10 17-24 + // dinosaur king, love & berry: + // 0: 232c select1 (not used) + // 1: 232c select2 (not used) + // 2: 232c reset (not used) + // 3: card trigger (not used) + // 4: rfid chip1 reset + // 5: rfid chip2 reset + // 6: rfid chip1 empty lamp + // 7: rfid chip2 empty lamp + ioPortManager->setCN10_17_24(v); + break; + case 0x24: // read too + default: + IO_LOG("systemsp::write(%x) outputs? data %x", addr, (u32)v); + break; + } + return; + } + else if (addr == 0x10128) + { + // eeprom + eeprom.writeDI((v & 1) != 0); + eeprom.writeCS((v & 2) != 0); + eeprom.writeCLK((v & 4) != 0); + return; + } + else if (addr < 0x10180) + { + // rom board dip switches? + IO_LOG("systemsp::write(%x) DIP switches? data %x", addr, (u32)v); + return; + } + else if (addr < 0x101c0) + { + // custom UART 1 + uart1.writeReg(addr, v); + return; + } + else if (addr < 0x101f0) + { + // custom UART 2 + uart2.writeReg(addr, v); + return; + } + INFO_LOG(NAOMI, "systemsp::writeMemArea0<%d>: Unknown addr %x = %x", (int)sizeof(T), addr, (int)v); +} + +void SystemSpCart::updateInterrupt(u32 mask) +{ + ata.interruptPending |= mask; + if ((ata.interruptPending & (INT_UART1 | INT_UART2 | INT_DIMM)) + || ((ata.interruptPending & INT_ATA) && ata.devCtrl.nien == 0)) + asic_RaiseInterrupt(holly_EXP_PCI); + else + asic_CancelInterrupt(holly_EXP_PCI); +} + +SystemSpCart::SystemSpCart(u32 size) : M4Cartridge(size), uart1(this, 1), uart2(this, 2) +{ + schedId = sh4_sched_register(0, schedCallback, this); + Instance = this; + // mb_serial.ic57 + static const u8 eepromData[0x80] = { + 0xf5, 0x90, 0x53, 0x45, 0x47, 0x41, 0x20, 0x45, 0x4e, 0x54, 0x45, 0x52, + 0x50, 0x52, 0x49, 0x53, 0x45, 0x53, 0x2c, 0x4c, 0x54, 0x44, 0x2e, 0x00, + 0x4e, 0x41, 0x4f, 0x4d, 0x49, 0x00, 0x00, 0x00, 0x41, 0x41, 0x46, 0x45, + 0x30, 0x31, 0x44, 0x31, 0x35, 0x39, 0x32, 0x34, 0x38, 0x31, 0x36, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + }; + eeprom.Load(eepromData, sizeof(eepromData)); +} + +SystemSpCart::~SystemSpCart() +{ + EventManager::unlisten(Event::Pause, handleEvent, this); + if (chd != nullptr) + chd_close(chd); + if (chdFile != nullptr) + fclose(chdFile); + sh4_sched_unregister(schedId); + Instance = nullptr; +} + +chd_file *SystemSpCart::openChd(const std::string path) +{ + chdFile = hostfs::storage().openFile(path, "rb"); + if (chdFile == nullptr) + { + WARN_LOG(NAOMI, "Cannot open file '%s' errno %d", path.c_str(), errno); + return nullptr; + } + chd_file *chd; + chd_error err = chd_open_file(chdFile, CHD_OPEN_READ, 0, &chd); + + if (err != CHDERR_NONE) + { + WARN_LOG(NAOMI, "Invalid CHD file %s", path.c_str()); + fclose(chdFile); + chdFile = nullptr; + return nullptr; + } + INFO_LOG(NAOMI, "compact flash: parsing file %s", path.c_str()); + + const chd_header* head = chd_get_header(chd); + + hunkbytes = head->hunkbytes; + hunkmem = std::make_unique(hunkbytes); + + return chd; +} + +void SystemSpCart::readSectors() +{ + verify(ata.driveHead.lba == 1); + u32 lba = (ata.driveHead.head << 24) | (ata.cylinder << 8) | ata.sectorNumber; + u32 newHunk = lba * SECTOR_SIZE / hunkbytes; + u32 offset = (lba * SECTOR_SIZE) % hunkbytes; + if (hunknum != newHunk) + { + hunknum = newHunk; + if (chd_read(chd, hunknum, &hunkmem[0]) != CHDERR_NONE) + WARN_LOG(NAOMI, "CHD read failed"); + } + memcpy(ata.buffer, &hunkmem[offset], SECTOR_SIZE); + ata.bufferIndex = 0; +} + +std::string SystemSpCart::getEepromPath() const +{ + std::string path = hostfs::getArcadeFlashPath(); + switch (region) + { + case 0: + path += "-jp"; + break; + case 1: + path += "-us"; + break; + default: + path += "-exp"; + break; + } + path += ".eeprom"; + return path; +} + +class BootIdLoader +{ + static constexpr u32 SECSIZE = 512; + +public: + BootIdLoader(SystemSpCart& cart) : cart(cart) + { + const chd_header* head = chd_get_header(cart.chd); + + hunkbytes = head->hunkbytes; + hunkmem = std::make_unique(hunkbytes); + } + + RomBootID *load() + { + // Read master boot record + if (chd_read(cart.chd, 0, &hunkmem[0]) != CHDERR_NONE) + return nullptr; + // Check boot signature + if (hunkmem[510] != 0x55 || hunkmem[511] != 0xaa) + return nullptr; + // Get partition 1 info + if (hunkmem[446 + 4] != 6) + // Not a FAT16B partition + return nullptr; + u32 start = *(u32 *)&hunkmem[446 + 8]; + + // Read partition Bios Parameter Block + if (chd_read(cart.chd, start * SECSIZE / hunkbytes, &hunkmem[0]) != CHDERR_NONE) + return nullptr; + int offset = (start * SECSIZE) % hunkbytes; + // Partition attributes + sectorsPerCluster = hunkmem[offset + 13]; + u16 resSectors = *(u16 *)&hunkmem[offset + 14]; + u8 fatCount = hunkmem[offset + 16]; + rootFolderSize = *(u16 *)&hunkmem[offset + 17]; // in entries + u16 fatSize = *(u16 *)&hunkmem[offset + 22]; // in sectors + // FATs start after reserved sectors + fatOffset = start + resSectors; + rootOffset = fatOffset + fatSize * fatCount; + dataStartOffset = rootOffset + rootFolderSize * sizeof(DirEntry) / SECSIZE; + + if (!openFile("1STREAD.BIN")) + return nullptr; + std::unique_ptr buffer = std::make_unique(file.size); + cart.enc_reset(); + for (u32 i = 0; i < file.size; i += 2) + *(u16 *)&buffer[i] = cart.decrypt(*(u16 *)&hunkmem[file.offset + i]); + if (memcmp(&buffer[0], "SPCF", 4)) + // wrong signature + return nullptr; + std::string imageName((const char *)&buffer[0x80]); + if (imageName.length() > 12) + // make short 8.3 name + imageName = imageName.substr(0, 6) + "~1" + imageName.substr(imageName.find('.')); + string_toupper(imageName); + + if (!openFile(imageName)) + return nullptr; + buffer = std::make_unique(sizeof(RomBootID)); + cart.enc_reset(); + for (size_t i = 0; i < sizeof(RomBootID); i += 2) + { + if (file.offset + i >= hunkbytes) + { + u32 fileOffset = dataStartOffset + (file.cluster - 2) * sectorsPerCluster + i / SECSIZE; + if (chd_read(cart.chd, fileOffset * SECSIZE / hunkbytes, &hunkmem[0]) != CHDERR_NONE) + return nullptr; + file.offset = (fileOffset * SECSIZE) % hunkbytes - i; + file.size -= i; + } + *(u16 *)&buffer[i] = cart.decrypt(*(u16 *)&hunkmem[file.offset + i]); + } + if (memcmp(&buffer[0], "SystemSP", 8)) + { + // Yes, it is encrypted twice (except tetgiano) + cart.enc_reset(); + for (size_t i = 0; i < sizeof(RomBootID); i += 2) + *(u16 *)&buffer[i] = cart.decrypt(*(u16 *)&buffer[i]); + } + RomBootID *bootId = new RomBootID(); + memcpy(bootId, &buffer[0], sizeof(RomBootID)); + + return bootId; + } + +private: + struct DirEntry + { + char name[8]; + char ext[3]; + enum Attribute : u8 { + ReadOnly = 0x01, + Hidden = 0x02, + System = 0x04, + VolumeName = 0x8, + Directory = 0x10, + Archive = 0x20, + LongName = 0xf, + }; + Attribute attributes; + u8 _reserved; + u8 creationTimeMs; + u16 creationTime; + u16 creationDate; + u16 accessDate; + u16 clusterHigh; + u16 updateTime; + u16 updateDate; + u16 cluster; + u32 size; + }; + + bool openFile(const std::string& fileName) + { + u32 curRootOffset = rootOffset; + if (chd_read(cart.chd, curRootOffset * SECSIZE / hunkbytes, &hunkmem[0]) != CHDERR_NONE) + return false; + int offset = (curRootOffset * SECSIZE) % hunkbytes; + for (int i = 0; i < rootFolderSize; i++) + { + if (offset + i * sizeof(DirEntry) >= hunkbytes) + { + ++curRootOffset; + if (chd_read(cart.chd, curRootOffset * SECSIZE / hunkbytes, &hunkmem[0]) != CHDERR_NONE) + return false; + offset = (curRootOffset * SECSIZE) % hunkbytes - i * sizeof(DirEntry); + } + const DirEntry *entry = (const DirEntry *)&hunkmem[offset + i * sizeof(DirEntry)]; + u8 b = (u8)entry->name[0]; + if (b == 0) + // end of directory + return false; + if (b == 0xe5 || b == 0x2e) + // unused or ./.. entry + continue; + if (entry->attributes == DirEntry::LongName || (entry->attributes & (DirEntry::VolumeName | DirEntry::System))) + // long name or volume name/system + continue; + std::string name(std::begin(entry->name), std::end(entry->name)); + name = trim_trailing_ws(name); + std::string ext(std::begin(entry->ext), std::end(entry->ext)); + ext = trim_trailing_ws(ext); + if (!ext.empty()) + name += "." + ext; + //printf("%s%c\t%d\n", name.c_str(), entry->attributes & DirEntry::Directory ? '/' : ' ', entry->size); + if (name != fileName) + continue; + file.cluster = entry->cluster; + file.size = entry->size; + u32 fileOffset = dataStartOffset + (file.cluster - 2) * sectorsPerCluster; + if (chd_read(cart.chd, fileOffset * SECSIZE / hunkbytes, &hunkmem[0]) != CHDERR_NONE) + return false; + file.offset = (fileOffset * SECSIZE) % hunkbytes; + + return true; + } + return false; + } + + SystemSpCart& cart; + u32 hunkbytes; + std::unique_ptr hunkmem; + u8 sectorsPerCluster = 0; + u32 fatOffset = 0; + u16 rootFolderSize = 0; + u32 rootOffset = 0; + u32 dataStartOffset = 0; + struct { + u32 cluster; + u32 size; + int offset; + } file; +}; + +void SystemSpCart::Init(LoadProgress *progress, std::vector *digest) +{ + M4Cartridge::Init(progress, digest); + + if (mediaName != nullptr) + { + std::string parent = hostfs::storage().getParentPath(settings.content.path); + std::string gdrom_path = get_file_basename(settings.content.fileName) + "/" + std::string(mediaName) + ".chd"; + try { + gdrom_path = hostfs::storage().getSubPath(parent, gdrom_path); + chd = openChd(gdrom_path); + } catch (const FlycastException& e) { + } + if (parentName != nullptr && chd == nullptr) + { + try { + std::string gdrom_parent_path = hostfs::storage().getSubPath(parent, std::string(parentName) + "/" + std::string(mediaName) + ".chd"); + chd = openChd(gdrom_parent_path); + } catch (const FlycastException& e) { + } + } + if (chd == nullptr) + throw NaomiCartException("SystemSP: Cannot open CompactFlash file " + gdrom_path); + + BootIdLoader loader(*this); + romBootId.reset(loader.load()); + } + else + { + ata.status.rdy = 0; + ata.status.df = 1; + } + + RomBootID bootId; + if (GetBootId(&bootId) + && bootId.country != 0 && (bootId.country & (2 << config::Region)) == 0) + { + if (bootId.country & 4) + { + NOTICE_LOG(NAOMI, "Forcing region USA"); + config::Region.override(1); + } + else if (bootId.country & 8) + { + NOTICE_LOG(NAOMI, "Forcing region Export"); + config::Region.override(2); + } + else if (bootId.country & 2) + { + NOTICE_LOG(NAOMI, "Forcing region Japan"); + config::Region.override(0); + } + // Force BIOS reload now to get the default eeprom for the correct region + naomi_default_eeprom = nullptr; + naomi_cart_LoadBios(settings.content.fileName.c_str()); + } + region = config::Region; + // Region must be set before loading the eeprom + if (!eeprom.Load(getEepromPath()) && naomi_default_eeprom != nullptr) + memcpy(eeprom.data, naomi_default_eeprom, 128); + + // dinoki4 doesn't use rfid chips. dinokich uses a different reader/writer protocol + if ((!strncmp(game->name, "dinoki", 6) && strcmp(game->name, "dinoki4") != 0 && strcmp(game->name, "dinokich") != 0) + || !strncmp(game->name, "loveber", 7)) + { + new RfidReaderWriter(&uart1, 1, game->name); + new RfidReaderWriter(&uart2, 2, game->name); + } + else if (!strcmp(game->name, "isshoni")) + { + new Touchscreen(&uart1); + ioPortManager = std::make_unique(); + } + else if (!strcmp(game->name, "manpuku")) { + ioPortManager = std::make_unique(); + } + else if (!strncmp(game->name, "kingyo", 6) || !strcmp(game->name, "shateki")) { + ioPortManager = std::make_unique(); + } + else if (!strcmp(game->name, "magicpop") + || !strcmp(game->name, "ochaken") + || !strcmp(game->name, "puyomedal") + || !strcmp(game->name, "unomedal") + || !strcmp(game->name, "westdrmg")) { + ioPortManager = std::make_unique(); + } + if (!strncmp(game->name, "dinoki", 6) || !strncmp(game->name, "loveber", 7)) + ioPortManager = std::make_unique(); + if (!ioPortManager) + ioPortManager = std::make_unique(); + + EventManager::listen(Event::Pause, handleEvent, this); +} + +u32 SystemSpCart::ReadMem(u32 address, u32 size) +{ + if (address == NAOMI_DIMM_STATUS) + { + u32 rc = DIMM_STATUS & ~(((SB_ISTEXT >> 3) & 1) << 8); + DEBUG_LOG(NAOMI, "DIMM STATUS read -> %x", rc); + return rc; + } + else { + return M4Cartridge::ReadMem(address, size); + } +} + +void SystemSpCart::WriteMem(u32 address, u32 data, u32 size) +{ + if (address == NAOMI_DIMM_STATUS) + { + DEBUG_LOG(NAOMI, "DIMM STATUS Write<%d>: %x", size, data); + if (data & 0x100) + asic_CancelInterrupt(holly_EXP_PCI); + if ((data & 2) == 0) + // irq to dimm + process(); + } + else { + M4Cartridge::WriteMem(address, data, size); + } +} + +bool SystemSpCart::Read(u32 offset, u32 size, void *dst) +{ + // TODO sram? if ((offset & 0x3f000000) == 0x39000000) + + if ((offset & 0x3f000000) == 0x3f000000) + { + // network card present + int rc = 1; + DEBUG_LOG(NAOMI, "SystemSpCart::Read<%d>%x: net card present -> %d", size, offset, rc); + memcpy(dst, &rc, size); + return true; + } + if ((offset & 0x3f000000) == 0x3d000000) + { + // network card mem + switch (size) + { + case 4: + *(u32 *)dst = readNetMem(offset); + break; + case 2: + *(u16 *)dst = readNetMem(offset); + break; + case 1: + default: + *(u8 *)dst = readNetMem(offset); + break; + } + u16 d = readNetMem(offset); + DEBUG_LOG(NAOMI, "SystemSpCart::Read<%d>%x: net mem -> %x", size, offset, d); + return true; + } + return M4Cartridge::Read(offset, size, dst); +} + +bool SystemSpCart::Write(u32 offset, u32 size, u32 data) +{ + if ((offset & 0x3f000000) == 0x3d000000) + { + // network card mem + switch (size) + { + case 4: + writeNetMem(offset, data); + break; + case 2: + writeNetMem(offset, (u16)data); + break; + case 1: + default: + writeNetMem(offset, (u8)data); + break; + } + DEBUG_LOG(NAOMI, "SystemSpCart::Write<%d>%x: net mem = %x", size, offset, data); + int idx = offset & (sizeof(netmem) - 2); + // FIXME + if (idx == 2) + memcpy(&netmem[idx + 0x200], &data, size); + return true; + } + // ??? if ((offset & 0x3f000000) == 0x39000000) + switch (flash.cmdState) + { + case CmdState::INIT: + if ((offset & 0xfff) == 0xaaa && data == 0xaa) { + flash.cmdState = CmdState::AAA_AA_1; + return true; + } + else if (offset == flash.progAddress && data == 0x29) + { + // write buffer to flash + FLASH_LOG("Flash cmd PROGRAM BUF TO FLASH %x", offset); + flash.progAddress = ~0; + return true; + } + break; + case CmdState::AAA_AA_1: + if (((offset & 0xfff) == 0x555 || (offset & 0xfff) == 0x554) && data == 0x55) { + flash.cmdState = CmdState::_555_55_1; + return true; + } + FLASH_LOG("Unexpected command %x %x in state aaa_aa_1", offset, data); + flash.cmdState = CmdState::INIT; + break; + case CmdState::_555_55_1: + if ((offset & 0xfff) == 0xaaa) + { + if (data == 0xa0) { + flash.cmdState = CmdState::PROGRAM; + return true; + } + else if (data == 0x80) { + flash.cmdState = CmdState::AAA_80; + return true; + } + } + else if (data == 0x25) + { + flash.cmdState = CmdState::WRITE_BUF_1; + flash.progAddress = offset; + return true; + } + FLASH_LOG("Unexpected command %x %x in state 555_55_1", offset, data); + flash.cmdState = CmdState::INIT; + break; + case CmdState::PROGRAM: + FLASH_LOG("Flash cmd PROGRAM %x %x", offset, data); + *(u16 *)&RomPtr[offset & (RomSize - 1)] = data; + flash.cmdState = CmdState::INIT; + return true; + case CmdState::WRITE_BUF_1: + flash.wordCount = data + 1; + flash.cmdState = CmdState::WRITE_BUF_2; + FLASH_LOG("Flash cmd WRITE BUFFFER addr %x count %x", flash.progAddress, flash.wordCount); + return true; + case CmdState::WRITE_BUF_2: + *(u16 *)&RomPtr[offset & (RomSize - 1)] = data; + if (--flash.wordCount == 0) + flash.cmdState = CmdState::INIT; + return true; + case CmdState::AAA_80: + if ((offset & 0xfff) == 0xaaa && data == 0xaa) { + flash.cmdState = CmdState::AAA_AA_2; + return true; + } + INFO_LOG(NAOMI, "Unexpected command %x %x in state aaa_80", offset, data); + flash.cmdState = CmdState::INIT; + break; + case CmdState::AAA_AA_2: + if (((offset & 0xfff) == 0x555 || (offset & 0xfff) == 0x554) && data == 0x55) { + flash.cmdState = CmdState::_555_55_2; + return true; + } + INFO_LOG(NAOMI, "Unexpected command %x %x in state aaa_aa_2", offset, data); + flash.cmdState = CmdState::INIT; + break; + case CmdState::_555_55_2: + if ((offset & 0xfff) == 0xaaa && data == 0x10) + { + // Erase chip + FLASH_LOG("Flash cmd CHIP ERASE"); + if ((offset & 0x1fffffff) < RomSize) + memset(&RomPtr[offset & (0x1fffffff & ~(64_MB - 1))], 0xff, 64_MB); + flash.cmdState = CmdState::INIT; + return true; + } + else if (data == 0x30) + { + // Erase sector + FLASH_LOG("Flash cmd SECTOR ERASE %x", offset); + if ((offset & 0x1fffffff) < RomSize) + memset(&RomPtr[offset & (RomSize - 1) & 0xffff0000], 0xff, 0x1000); // 64k sector size? + flash.cmdState = CmdState::INIT; + return true; + } + INFO_LOG(NAOMI, "Unexpected command %x %x in state aaa_aa_2", offset, data); + flash.cmdState = CmdState::INIT; + break; + } + FLASH_LOG("SystemSpCart::Write<%d>%x: %x", size, offset, data); + + return M4Cartridge::Write(offset, size, data); +} + +int SystemSpCart::schedCallback(int tag, int sch_cycl, int jitter, void *arg) +{ + return ((SystemSpCart *)arg)->schedCallback(); +} + +int SystemSpCart::schedCallback() +{ + ata.status.rdy = 1; + ata.status.bsy = 0; + updateInterrupt(INT_ATA); + + return 0; +} + +void SystemSpCart::Serialize(Serializer& ser) const +{ + M4Cartridge::Serialize(ser); + sh4_sched_serialize(ser, schedId); + uart1.serialize(ser); + uart2.serialize(ser); + eeprom.Serialize(ser); + ser << bank; + ser << ata.features; + ser << ata.cylinder; + ser << ata.sectorCount; + ser << ata.sectorNumber; + ser << ata.status.full; + ser << ata.error; + ser << ata.driveHead.full; + ser << ata.devCtrl.full; + ser << ata.interruptPending; + ser << ata.reg84; + ser << ata.buffer; + ser << ata.bufferIndex; + ser << flash.cmdState; + ser << flash.progAddress; + ser << flash.wordCount; + if (mediaName != nullptr) + ser.serialize(RomPtr, RomSize); +} + +void SystemSpCart::Deserialize(Deserializer& deser) +{ + M4Cartridge::Deserialize(deser); + sh4_sched_deserialize(deser, schedId); + uart1.deserialize(deser); + uart2.deserialize(deser); + eeprom.Deserialize(deser); + deser >> bank; + deser >> ata.features; + deser >> ata.cylinder; + deser >> ata.sectorCount; + deser >> ata.sectorNumber; + deser >> ata.status.full; + deser >> ata.error; + deser >> ata.driveHead.full; + deser >> ata.devCtrl.full; + deser >> ata.interruptPending; + deser >> ata.reg84; + deser >> ata.buffer; + deser >> ata.bufferIndex; + deser >> flash.cmdState; + deser >> flash.progAddress; + deser >> flash.wordCount; + if (mediaName != nullptr) + deser.deserialize(RomPtr, RomSize); +} + +void SystemSpCart::saveFiles() +{ + eeprom.Save(getEepromPath()); +} + +// TODO implement actual networking features. Only socket() and close() are currently functional. +void SystemSpCart::process() +{ + DmaOffset |= 0x40000000; // needed by BIOS. why? + u8 reqId = readNetMem(0x200); + int cmd = readNetMem(0x202); + DEBUG_LOG(NAOMI, "SystemSpCart::process cmd %03x", cmd); + const u8 netmem4 = readNetMem(4); // FIXME memset should be done later on + memset(&netmem[0], 0, 32); + writeNetMem(0, reqId); + writeNetMem(1, (u8)0); + switch (cmd) + { + case 1: // init? nop? + INFO_LOG(NAOMI, "process: init/nop"); + writeNetMem(2, NET_OK); + break; + case 0x100: // get dimm status + INFO_LOG(NAOMI, "process: get dimm status"); + writeNetMem(2, NET_OK); + // 0 initializing + // 1 checking network + // 2 ? + // 3 testing prg + // 4 loading prg + // 5 ready + writeNetMem(4, 5); + break; + case 0x101: // get firmware version + INFO_LOG(NAOMI, "process: get firmware version"); + writeNetMem(2, NET_OK); + writeNetMem(4, (u8)0x25); // minor + writeNetMem(5, (u8)1); // major + break; + case 0x104: // get network type and address + INFO_LOG(NAOMI, "process: get network type"); + writeNetMem(2, NET_OK); + writeNetMem(4, 5); // 4: ether (dhcp), 5: ether (static ip) + writeNetMem(0x24, inetaddr); + writeNetMem(0x28, netmask); + break; + + case 0x204: // set network type and address + // 4: type (0 none, 3,4 ether) + inetaddr = readNetMem(0x24); + netmask = readNetMem(0x28); + INFO_LOG(NAOMI, "process: set net type %d ip %08x mask %08x", netmem4, inetaddr, netmask); + writeNetMem(2, NET_OK); + break; + + case 0x301: // network test + { + // 204: 4 + u32 addr = readNetMem(0x208); + INFO_LOG(NAOMI, "process: network_test(%x, %x)", readNetMem(0x204), addr); + bool isMem; + char *p = (char *)addrspace::writeConst(addr, isMem, 4); + strcpy(p, "CHECKING NETWORK\n"); + p = (char *)addrspace::writeConst(addr + 0x11, isMem, 4); + strcpy(p, "PRETENDING... :P\n"); + p = (char *)addrspace::writeConst(addr + 0x22, isMem, 4); + strcpy(p, "--- COMPLETED---\n"); + writeNetMem(2, NET_OK); + writeNetMem(4, 1); // TODO how to signal the test progress/completion? + } + break; + + case 0x401: // accept + INFO_LOG(NAOMI, "process: accept(%d)", readNetMem(0x208)); + writeNetMem(2, NET_ERROR); + break; + case 0x402: // bind + { + u32 addr = readNetMem(0x20c); + u32 len = readNetMem(0x210); + sockaddr_in sa{}; + memcpy(&sa, &netmem[addr & (sizeof(netmem) - 1)], std::min(len, sizeof(sa))); + INFO_LOG(NAOMI, "process: bind(%d, %08x:%d)", readNetMem(0x208), htonl(sa.sin_addr.s_addr), htons(sa.sin_port)); + writeNetMem(2, NET_OK); + } + break; + case 0x403: // close socket + { + const int sockidx = readNetMem(0x208); + const sock_t sockfd = sockidx < 1 || sockidx > 0x3f || sockidx > (int)sockets.size() ? INVALID_SOCKET : sockets[sockidx - 1].fd; + u16 rc; + if (sockfd == INVALID_SOCKET) + { + INFO_LOG(NAOMI, "process: closesocket(%d) invalid socket", sockidx); + rc = NET_ERROR; + } + else + { + rc = sockets[sockidx - 1].close() != 0 ? NET_ERROR : NET_OK; + INFO_LOG(NAOMI, "process: closesocket(%d) %d -> %x", sockidx, sockfd, rc); + } + writeNetMem(2, rc); + } + break; + case 0x404: // connect + { + u32 addr = readNetMem(0x20c); + u32 len = readNetMem(0x210); + sockaddr_in sa{}; + memcpy(&sa, &netmem[addr & (sizeof(netmem) - 1)], std::min(len, sizeof(sa))); + INFO_LOG(NAOMI, "process: connect(%d, %08x:%d)", readNetMem(0x208), htonl(sa.sin_addr.s_addr), htons(sa.sin_port)); + writeNetMem(2, NET_OK); + } + break; + case 0x406: // inet_addr + { + u32 addr = readNetMem(0x208); + //u32 len = readNetMem(0x20c); + const char *s = (const char *)&netmem[addr & (sizeof(netmem) - 1)]; + INFO_LOG(NAOMI, "process: inet_addr(%s)", s); + u32 ipaddr = inet_addr(s); + writeNetMem(2, NET_OK); + writeNetMem(4, ipaddr); + } + break; + case 0x408: // listen + INFO_LOG(NAOMI, "process: listen(%d)", readNetMem(0x208)); // backlog??? or 208 is backlog and 201 is sockfd? + writeNetMem(2, NET_OK); + break; + case 0x409: // recv + { + u32 addr = readNetMem(0x20c); + u32 len = readNetMem(0x210); + INFO_LOG(NAOMI, "process: recv(%d, %x, %x)", readNetMem(0x208), addr, len); + writeNetMem(2, NET_OK); + //writeNetMem(4, len); // ?? + } + break; + case 0x40a: // send + { + u32 addr = readNetMem(0x20c); + u32 len = readNetMem(0x210); + INFO_LOG(NAOMI, "process: send(%d, %x, %x)", readNetMem(0x208), addr, len); + writeNetMem(2, NET_OK); + writeNetMem(4, len); // ?? + } + break; + case 0x40b: // openSocket + { + int domain = readNetMem(0x208); + int type = readNetMem(0x20c); + int protocol = readNetMem(0x210); + const sock_t fd = socket(domain, type, protocol); + int sockidx = -1; + if (fd != INVALID_SOCKET) + { + // TODO? + //set_non_blocking(fd); + size_t i = 0; + for (; i < sockets.size(); i++) + if (sockets[i].fd == INVALID_SOCKET) + break; + if (i == sockets.size()) + sockets.emplace_back(fd); + else + sockets[i].fd = fd; + sockidx = i + 1; + } + INFO_LOG(NAOMI, "process: openSocket(%d, %d, %d) %d -> %d", domain, type, protocol, fd, sockidx); + writeNetMem(2, sockidx != -1 ? NET_OK : NET_ERROR); + if (sockidx != -1) + writeNetMem(4, sockidx); + } + break; + case 0x40e: // setsockopt + { + // TODO socket option level/name are different (mips linux?) + u32 addr = readNetMem(0x214); + //u32 len = readNetMem(0x218); + INFO_LOG(NAOMI, "process: setsockopt(%d, level: %x, name: %x, value:%x)", readNetMem(0x208), readNetMem(0x20c), readNetMem(0x210), + readNetMem(addr)); + writeNetMem(2, NET_OK); + } + break; + case 0x410: // settimeout + INFO_LOG(NAOMI, "process: settimeout(%d, %d, %d, %d)", readNetMem(0x208), readNetMem(0x20c), readNetMem(0x210), readNetMem(0x214)); + writeNetMem(2, NET_OK); + break; + case 0x411: // geterrno + INFO_LOG(NAOMI, "process: getterrno(%d)", readNetMem(0x208)); + writeNetMem(2, NET_OK); + writeNetMem(4, 111); // FIXME errno values TBD + break; + case 0x414: // getParambyDHCP? + INFO_LOG(NAOMI, "process: getParambyDHCP"); + writeNetMem(2, NET_OK); + writeNetMem(4, 1); // ??? + break; + case 0x415: // modifyMyIPaddr? + { + u32 addr = readNetMem(0x208); + //u32 len = readNetMem(0x20c); + INFO_LOG(NAOMI, "process: modifyMyIPaddr(%s, %08x)", &netmem[addr & (sizeof(netmem) - 1)], readNetMem(0x210)); + writeNetMem(2, NET_OK); + } + break; + + default: + WARN_LOG(NAOMI, "Unknown netdimm command: %x", cmd); + writeNetMem(2, NET_ERROR); + break; + } + updateInterrupt(INT_DIMM); +} + +} diff --git a/core/hw/naomi/systemsp.h b/core/hw/naomi/systemsp.h new file mode 100644 index 000000000..21dba627d --- /dev/null +++ b/core/hw/naomi/systemsp.h @@ -0,0 +1,327 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once +#include "types.h" +#include "emulator.h" +#include "hw/hwreg.h" +#include "hw/naomi/m4cartridge.h" +#include "hw/flashrom/at93cxx.h" +#include "serialize.h" +#include "network/net_platform.h" +#include +#include + +namespace systemsp +{ + +template +T readMemArea0(u32 addr); +template +void writeMemArea0(u32 addr, T v); + +class SystemSpCart; + +// rom board custom UART ports +class SerialPort : public ::SerialPort +{ +public: + class Pipe : public ::SerialPort::Pipe + { + public: + virtual void serialize(Serializer& ser) const {} + virtual void deserialize(Deserializer& deser) {} + }; + + SerialPort(SystemSpCart *cart, int index) : cart(cart), index(index) { + } + + ~SerialPort() override { + if (pipe != nullptr) + delete pipe; + } + + u8 readReg(u32 addr); + + void writeReg(u32 addr, u8 v); + + void serialize(Serializer& ser) const { + if (pipe != nullptr) + pipe->serialize(ser); + } + + void deserialize(Deserializer& deser) { + if (pipe != nullptr) + pipe->deserialize(deser); + } + + void setPipe(::SerialPort::Pipe *pipe) override { + this->pipe = (Pipe *)pipe; + } + + void updateStatus() override; + +private: + void flush() + { + if (pipe != nullptr) + while (pipe->available()) + pipe->read(); + } + + SystemSpCart *cart; + const int index; + Pipe *pipe = nullptr; +}; + +// +// ATA registers for CompactFlash interface +// +union AtaStatusRegister +{ + u8 full; + struct { + u8 err:1; // error + u8 idx:1; // index, always 0 + u8 corr:1; // corrected data, always 0 + u8 drq:1; // pio data available + u8 dsc:1; // seek complete + u8 df:1; // drive fault error + u8 rdy:1; // drive ready + u8 bsy:1; // drive busy + }; +}; + +union AtaDriveHeadRegister +{ + u8 full; + struct { + u8 head:4; + u8 drv:1; + u8 :1; + u8 lba:1; + u8 :1; + }; +}; + +union AtaDevCtrlRegister +{ + u8 full; + struct { + u8 :1; + u8 nien:1; // disable interrupts + u8 srst:1; // software reset + u8 :4; + u8 hob:1; // high-order byte + }; +}; + +class IOPortManager +{ +public: + virtual u8 getCN9_17_24() = 0; + virtual u8 getCN9_25_32() = 0; + virtual u8 getCN9_33_40() = 0; + virtual u8 getCN9_41_48() = 0; + virtual u8 getCN9_49_56() = 0; + virtual u8 getCN10_9_16() = 0; + virtual void setCN9_33_40(u8 v) {} + virtual void setCN9_49_56(u8 v) {} + virtual void setCN10_17_24(u8 v) {} + virtual ~IOPortManager() = default; +}; + +class SystemSpCart : public M4Cartridge +{ +public: + SystemSpCart(u32 size); + ~SystemSpCart() override; + + void Init(LoadProgress *progress = nullptr, std::vector *digest = nullptr) override; + void setMediaName(const char *mediaName, const char *parentName) { + this->mediaName = mediaName; + this->parentName = parentName; + } + + u32 ReadMem(u32 address, u32 size) override; + void WriteMem(u32 address, u32 data, u32 size) override; + + bool Read(u32 offset, u32 size, void *data) override; + bool Write(u32 offset, u32 size, u32 data) override; + + template + T readMemArea0(u32 addr); + template + void writeMemArea0(u32 addr, T v); + + void Serialize(Serializer &ser) const override; + void Deserialize(Deserializer &deser) override; + + bool GetBootId(RomBootID *bootId) override + { + if (mediaName == nullptr) + return M4Cartridge::GetBootId(bootId); + if (!romBootId) + return false; + memcpy(bootId, romBootId.get(), sizeof(RomBootID)); + return true; + } + + void updateInterrupt(u32 mask = 0); + +private: + static int schedCallback(int tag, int sch_cycl, int jitter, void *arg); + int schedCallback(); + chd_file *openChd(const std::string path); + void readSectors(); + void saveFiles(); + std::string getEepromPath() const; + + static void handleEvent(Event event, void *p) { + ((SystemSpCart *)p)->saveFiles(); + } + + void process(); + + template + T readNetMem(u32 addr) { + return ReadMemArr(netmem, addr & (sizeof(netmem) - sizeof(T))); + } + template + void writeNetMem(u32 addr, T data) { + WriteMemArr(netmem, addr & (sizeof(netmem) - sizeof(T)), data); + } + + int schedId; + const char *mediaName = nullptr; + const char *parentName = nullptr; + FILE *chdFile = nullptr; + chd_file *chd = nullptr; + u32 hunkbytes = 0; + std::unique_ptr hunkmem; + u32 hunknum = ~0; + std::unique_ptr romBootId; + + AT93C46SerialEeprom eeprom; + SerialPort uart1; + SerialPort uart2; + u16 bank = 0; + int region = 0; + std::unique_ptr ioPortManager; + + static constexpr u32 SECTOR_SIZE = 512; + + struct { + u8 features = 0; + u16 cylinder = 0; + u8 sectorCount = 0; + u8 sectorNumber = 0; + AtaStatusRegister status = { 0x50 }; + u8 error = 0; + AtaDriveHeadRegister driveHead = { 0xa0 }; + AtaDevCtrlRegister devCtrl = { 0 }; + u8 interruptPending = 0; + u8 reg84 = 0; + u8 buffer[SECTOR_SIZE]; + u32 bufferIndex = 0; + } ata; + + enum class CmdState { + INIT, + AAA_AA_1, + _555_55_1, + WRITE_BUF_1, + WRITE_BUF_2, + PROGRAM, + AAA_80, + AAA_AA_2, + _555_55_2, + }; + struct { + CmdState cmdState = CmdState::INIT; + u32 progAddress = ~0; + u16 wordCount = 0; + } flash; + + static constexpr u16 DIMM_STATUS = 0x8102; + u8 netmem[8_MB] {}; + u32 inetaddr = 0x641ea8c0; // 192.168.30.100 + u32 netmask = 0x00ffffff; // 255.255.255.0 + struct Socket + { + Socket() = default; + Socket(sock_t fd) : fd(fd) {} + + int close() + { + int rc = 0; + if (fd != INVALID_SOCKET) + rc = ::closesocket(fd); + fd = INVALID_SOCKET; + connecting = false; + receiving = false; + sending = false; + connectTimeout = 0; + connectTime = 0; + sendTimeout = 0; + sendTime = 0; + recvTimeout = 0; + recvTime = 0; + return rc; + } + + bool isClosed() const { + return fd == INVALID_SOCKET; + } + + bool isBusy() const { + return connecting || receiving || sending; + } + + sock_t fd = INVALID_SOCKET; + bool connecting = false; + bool receiving = false; + u8 *recvData = nullptr; + u32 recvLen = 0; + bool sending = false; + const u8 *sendData = nullptr; + u32 sendLen = 0; + u64 connectTimeout = 0; + u64 connectTime = 0; + u64 sendTimeout = 0; + u64 sendTime = 0; + u64 recvTimeout = 0; + u64 recvTime = 0; + int lastError = 0; + }; + std::vector sockets; + static constexpr u16 NET_OK = 0x8001; + static constexpr u16 NET_ERROR = 0x8000; + +public: + static constexpr u32 INT_UART1 = 0x01; + static constexpr u32 INT_UART2 = 0x02; + static constexpr u32 INT_DIMM = 0x08; + static constexpr u32 INT_ATA = 0x10; + + static SystemSpCart *Instance; + + friend class BootIdLoader; +}; + +} diff --git a/core/hw/naomi/touchscreen.cpp b/core/hw/naomi/touchscreen.cpp index e3a79bcbd..d894f878f 100644 --- a/core/hw/naomi/touchscreen.cpp +++ b/core/hw/naomi/touchscreen.cpp @@ -20,6 +20,7 @@ #include "hw/sh4/sh4_sched.h" #include "hw/sh4/modules/modules.h" #include "hw/maple/maple_cfg.h" +#include "hw/maple/maple_devs.h" #include "input/gamepad.h" #include "serialize.h" @@ -34,20 +35,19 @@ namespace touchscreen // 837-14672 touchscreen sensor board // used by Manic Panic Ghosts and Touch De Zunou // -class TouchscreenPipe final : public SerialPipe +class TouchscreenPipe final : public SerialPort::Pipe { public: TouchscreenPipe() { - Instance = this; - schedId = sh4_sched_register(0, schedCallback); - serial_setPipe(this); + schedId = sh4_sched_register(0, schedCallback, this); + SCIFSerialPort::Instance().setPipe(this); } - ~TouchscreenPipe() + ~TouchscreenPipe() override { + SCIFSerialPort::Instance().setPipe(nullptr); sh4_sched_unregister(schedId); - Instance = nullptr; } void write(u8 data) override @@ -103,7 +103,7 @@ class TouchscreenPipe final : public SerialPipe return; toSend.insert(toSend.end(), &msg[0], &msg[size]); toSend.push_back(calcChecksum(msg, size)); - serial_updateStatusRegister(); + SCIFSerialPort::Instance().updateStatus(); } u8 calcChecksum(const u8 *data, int size) @@ -114,27 +114,33 @@ class TouchscreenPipe final : public SerialPipe return 256 - c; } - static int schedCallback(int tag, int cycles, int lag) + static int schedCallback(int tag, int cycles, int jitter, void *arg) { + TouchscreenPipe *instance = (TouchscreenPipe *)arg; u32 pack[2]; for (size_t i = 0; i < std::size(pack); i++) { int x = std::clamp(mapleInputState[i].absPos.x, 0, 1023); int y = std::clamp(mapleInputState[i].absPos.y, 0, 1023); +#ifdef LIBRETRO + int hit = (mapleInputState[i].kcode & NAOMI_BTN0_KEY) == 0; + int charge = (mapleInputState[i].kcode & NAOMI_BTN1_KEY) == 0; +#else int hit = (mapleInputState[i].kcode & DC_BTN_A) == 0; int charge = (mapleInputState[i].kcode & DC_BTN_B) == 0; +#endif // touches require bits 20, 21 and 22 // drag needs bit 22 off // bit 23 is charge pack[i] = (charge << 23) | (hit << 21) | (hit << 20) | (y << 10) | x; - if (!Instance->touch[i]) + if (!instance->touch[i]) pack[i] |= hit << 22; - Instance->touch[i] = hit; + instance->touch[i] = hit; } u8 msg[] = { 0xaa, 0x10, u8(pack[0] >> 16), u8(pack[0] >> 8), u8(pack[0]), u8(pack[1] >> 16), u8(pack[1] >> 8), u8(pack[1]) }; - Instance->send(msg, sizeof(msg)); + instance->send(msg, sizeof(msg)); return FRAME_CYCLES; } @@ -144,10 +150,8 @@ class TouchscreenPipe final : public SerialPipe bool schedulerStarted = false; bool touch[2] {}; - static TouchscreenPipe *Instance; static constexpr int FRAME_CYCLES = SH4_MAIN_CLOCK / 60; }; -TouchscreenPipe *TouchscreenPipe::Instance; std::unique_ptr touchscreen; diff --git a/core/hw/pvr/Renderer_if.cpp b/core/hw/pvr/Renderer_if.cpp index 90a9f46c2..7f669f3fd 100644 --- a/core/hw/pvr/Renderer_if.cpp +++ b/core/hw/pvr/Renderer_if.cpp @@ -1,12 +1,13 @@ #include "Renderer_if.h" #include "spg.h" -#include "rend/TexCache.h" +#include "rend/texconv.h" #include "rend/transform_matrix.h" #include "cfg/option.h" #include "emulator.h" #include "serialize.h" #include "hw/holly/holly_intc.h" #include "hw/sh4/sh4_if.h" +#include "hw/sh4/sh4_core.h" #include "profiler/fc_profiler.h" #include "network/ggpo.h" @@ -38,6 +39,7 @@ static bool rendererEnabled = true; TA_context* _pvrrc; static bool presented; +static u32 fbAddrHistory[2] { 1, 1 }; class PvrMessageQueue { @@ -89,10 +91,12 @@ class PvrMessageQueue } else { + setDefaultRoundingMode(); // drain the queue after switching to !threaded rendering while (!queue.empty()) waitAndExecute(); execute(msg); + Sh4cntx.restoreHostRoundingMode(); } } @@ -231,7 +235,7 @@ class PvrMessageQueue { presented = true; if (!config::ThreadedRendering && !ggpo::active()) - sh4_cpu.Stop(); + emu.getSh4Executor()->Stop(); #ifdef LIBRETRO retro_rend_present(); #endif @@ -250,9 +254,10 @@ bool rend_single_frame(const bool& enabled) { FC_PROFILE_SCOPE; + const int timeout = SPG_CONTROL.isPAL() ? 23 : 20; presented = false; while (enabled && !presented) - if (!pvrQueue.waitAndExecute(50)) + if (!pvrQueue.waitAndExecute(timeout)) return false; return true; } @@ -314,7 +319,7 @@ bool rend_init_renderer() rendererEnabled = true; if (renderer == nullptr) rend_create_renderer(); - bool success = renderer->Init(); + bool success = renderer != nullptr && renderer->Init(); if (!success) { delete renderer; renderer = rend_norend(); @@ -342,6 +347,8 @@ void rend_reset() fb_w_cur = 1; pvrQueue.reset(); rendererEnabled = true; + fbAddrHistory[0] = 1; + fbAddrHistory[1] = 1; } void rend_start_render() @@ -394,7 +401,18 @@ void rend_start_render() ctx->rend.fog_clamp_max = FOG_CLAMP_MAX; if (!ctx->rend.isRTT) + { + if (FB_W_SOF1 != fbAddrHistory[0] && FB_W_SOF1 != fbAddrHistory[1]) + { + ctx->rend.clearFramebuffer = true; + fbAddrHistory[0] = fbAddrHistory[1]; + fbAddrHistory[1] = FB_W_SOF1; + } + else { + ctx->rend.clearFramebuffer = false; + } ggpo::endOfFrame(); + } if (QueueRender(ctx)) { @@ -406,7 +424,7 @@ void rend_start_render() } } -int rend_end_render(int tag, int cycles, int jitter) +int rend_end_render(int tag, int cycles, int jitter, void *arg) { if (settings.platform.isNaomi2()) { @@ -516,11 +534,7 @@ void rend_serialize(Serializer& ser) } void rend_deserialize(Deserializer& deser) { - if ((deser.version() >= Deserializer::V12_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO) - || deser.version() >= Deserializer::V12) - deser >> fb_w_cur; - else - fb_w_cur = 1; + deser >> fb_w_cur; if (deser.version() >= Deserializer::V20) { deser >> render_called; @@ -529,4 +543,6 @@ void rend_deserialize(Deserializer& deser) deser >> fb_watch_addr_end; } pend_rend = false; + fbAddrHistory[0] = 1; + fbAddrHistory[1] = 1; } diff --git a/core/hw/pvr/Renderer_if.h b/core/hw/pvr/Renderer_if.h index 1c09009b0..c9a5e29af 100644 --- a/core/hw/pvr/Renderer_if.h +++ b/core/hw/pvr/Renderer_if.h @@ -1,6 +1,8 @@ #pragma once #include "types.h" #include "ta_ctx.h" +#include "emulator.h" +#include extern u32 FrameCount; @@ -8,7 +10,7 @@ bool rend_init_renderer(); void rend_term_renderer(); void rend_vblank(); void rend_start_render(); -int rend_end_render(int tag, int cycles, int jitter); +int rend_end_render(int tag, int cycles, int jitter, void *arg); void rend_cancel_emu_wait(); bool rend_single_frame(const bool& enabled); void rend_swap_frame(u32 fb_r_sof1); @@ -21,6 +23,8 @@ void rend_enable_renderer(bool enabled); bool rend_is_enabled(); void rend_serialize(Serializer& ser); void rend_deserialize(Deserializer& deser); +static void rend_updatePalette(); +static void rend_updateFogTable(); /////// extern TA_context* _pvrrc; @@ -53,7 +57,14 @@ struct FramebufferInfo struct Renderer { - virtual ~Renderer() = default; + Renderer() { + EventManager::listen(Event::Terminate, onEvent, this); + EventManager::listen(Event::LoadState, onEvent, this); + } + virtual ~Renderer() { + EventManager::unlisten(Event::Terminate, onEvent, this); + EventManager::unlisten(Event::LoadState, onEvent, this); + } virtual bool Init() = 0; virtual void Term() = 0; @@ -62,12 +73,34 @@ struct Renderer virtual bool Render() = 0; virtual void RenderFramebuffer(const FramebufferInfo& info) = 0; virtual bool RenderLastFrame() { return false; } + // Get the last rendered frame pixel data in RGB format + // The returned image is rotated and scaled (upward orientation and square pixels) + // If both width and height are zero, the internal render resolution will be used. + // Otherwise either width or height will be used as the maximum width or height respectively. + virtual bool GetLastFrame(std::vector& data, int& width, int& height) { return false; } virtual bool Present() { return true; } - virtual void DrawOSD(bool clear_screen) { } - virtual BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) { return nullptr; } + +protected: + bool resetTextureCache = false; + bool clearLastFrame = false; + bool updatePalette = true; + bool updateFogTable = true; + +private: + static void onEvent(Event event, void *arg) + { + Renderer *renderer = static_cast(arg); + renderer->resetTextureCache = true; + renderer->updatePalette = true; + renderer->updateFogTable = true; + if (event == Event::Terminate) + renderer->clearLastFrame = true; + } + friend void rend_updatePalette(); + friend void rend_updateFogTable(); }; extern Renderer* renderer; @@ -77,3 +110,11 @@ extern u32 fb_watch_addr_end; extern bool fb_dirty; void check_framebuffer_write(); +static inline void rend_updatePalette() { + if (renderer != nullptr) + renderer->updatePalette = true; +} +static inline void rend_updateFogTable() { + if (renderer != nullptr) + renderer->updateFogTable = true; +} diff --git a/core/hw/pvr/elan.cpp b/core/hw/pvr/elan.cpp index 935b76589..f5837a041 100644 --- a/core/hw/pvr/elan.cpp +++ b/core/hw/pvr/elan.cpp @@ -57,6 +57,7 @@ #include "hw/holly/sb.h" #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_mmr.h" +#include "hw/sh4/sh4_sched.h" #include "serialize.h" #include "elan_struct.h" #include "network/ggpo.h" @@ -82,6 +83,8 @@ static u32 reg30 = 0x31; static u32 elanCmd[32 / 4]; +static int schedId = -1; + static u32 DYNACALL read_elanreg(u32 paddr) { u32 addr = paddr & 0x01ffffff; @@ -252,7 +255,6 @@ static glm::mat4x4 curMatrix; static int taMVMatrix = -1; static int taNormalMatrix = -1; static glm::mat4 projectionMatrix; -static int taProjMatrix = -1; static LightModel *curLightModel; static ElanBase *curLights[MAX_LIGHTS]; static float nearPlane = 0.001f; @@ -273,7 +275,6 @@ struct State u32 gmp = Null; u32 instance = Null; - u32 projMatrix = Null; u32 lightModel = Null; u32 lights[MAX_LIGHTS] = { Null, Null, Null, Null, Null, Null, Null, Null, @@ -282,15 +283,17 @@ struct State bool lightModelUpdated = false; float envMapUOffset = 0.f; float envMapVOffset = 0.f; + float projMatrix[4] = { 579.411194f, -320.f, -579.411194f, -240.f }; + int projMatrixIdx = -1; void reset() { gmp = Null; instance = Null; - projMatrix = Null; lightModel = Null; for (auto& light : lights) light = Null; + projMatrixIdx = -1; update(); if (isDirectX(config::RendererType)) packColor = packColorBGRA; @@ -347,30 +350,43 @@ struct State void setProjectionMatrix(void *p) { - projMatrix = elanRamAddress(p); + ProjMatrix *pm = (ProjMatrix *)&RAM[elanRamAddress(p)]; + projMatrix[0] = pm->fx; + projMatrix[1] = pm->tx; + projMatrix[2] = pm->fy; + projMatrix[3] = pm->ty; + DEBUG_LOG(PVR, "Proj matrix x: %f %f y: %f %f near %f far %f", pm->fx, pm->tx, pm->fy, pm->ty, nearPlane, farPlane); updateProjectionMatrix(); } void updateProjectionMatrix() { - if (projMatrix == Null) - { - taProjMatrix = -1; - return; - } - ProjMatrix *pm = (ProjMatrix *)&RAM[projMatrix]; - DEBUG_LOG(PVR, "Proj matrix x: %f %f y: %f %f near %f far %f", pm->fx, pm->tx, pm->fy, pm->ty, nearPlane, farPlane); // fx = -m00 * w/2 // tx = -m20 * w/2 + left + w/2 // fy = -m11 * h/2 // ty = -m21 * h/2 + top + h/2 projectionMatrix = glm::mat4( - -pm->fx, 0, 0, 0, - 0, pm->fy, 0, 0, - -pm->tx, -pm->ty, -1, -1, - 0, 0, 0, 0 + -projMatrix[0], 0, 0, 0, + 0, projMatrix[2], 0, 0, + -projMatrix[1], -projMatrix[3], -1, -1, + 0, 0, 0, 0 ); - taProjMatrix = ta_add_matrix(glm::value_ptr(projectionMatrix)); + projMatrixIdx = ta_add_matrix(glm::value_ptr(projectionMatrix)); + } + + void resetProjectionMatrix() + { + projMatrix[0] = 579.411194f; + projMatrix[1] = -320.f; + projMatrix[2] = -579.411194f; + projMatrix[3] = -240.f; + } + + int getProjectionMatrixIndex() + { + if (projMatrixIdx == -1) + updateProjectionMatrix(); + return projMatrixIdx; } void setGMP(void *p) @@ -470,7 +486,6 @@ struct State void update() { updateMatrix(); - updateProjectionMatrix(); updateGMP(); updateLightModel(); for (u32 i = 0; i < MAX_LIGHTS; i++) @@ -498,9 +513,11 @@ struct State void deserialize(Deserializer& deser) { + projMatrixIdx = -1; if (deser.version() < Deserializer::V24) { reset(); + resetProjectionMatrix(); return; } ta_parse_reset(); @@ -509,7 +526,14 @@ struct State ta_set_list_type(listType); deser >> gmp; deser >> instance; - deser >> projMatrix; + if (deser.version() < Deserializer::V40) + { + deser.skip(); // projMatrix address + resetProjectionMatrix(); + } + else { + deser >> projMatrix; + } u32 tileclip; deser >> tileclip; ta_set_tileclip(tileclip); @@ -959,7 +983,7 @@ class ModifierVolumeClipper tri.x2 * curMatrix[0][2] + tri.y2 * curMatrix[1][2] + tri.z2 * curMatrix[2][2] + curMatrix[3][2] }; dist = -dist - nearPlane; - ModTriangle newTri; + ModTriangle newTri[2]; int n = sutherlandHodgmanClip(dist, tri, newTri); switch (n) { @@ -969,9 +993,10 @@ class ModifierVolumeClipper case 3: ta_add_triangle(tri); break; - case 4: + case 5: ta_add_triangle(tri); - ta_add_triangle(newTri); + ta_add_triangle(newTri[0]); + ta_add_triangle(newTri[1]); break; } } @@ -992,86 +1017,78 @@ class ModifierVolumeClipper } // Clip the triangle 'trig' with respect to the provided distances to the clipping plane. - int sutherlandHodgmanClip(glm::vec3& dist, ModTriangle& trig, ModTriangle& newTrig) + int sutherlandHodgmanClip(glm::vec3& dist, ModTriangle& trig, ModTriangle *newTrig) { constexpr float clipEpsilon = 0.f; //0.00001; constexpr float clipEpsilon2 = 0.f; //0.01; - if (!glm::any(glm::greaterThanEqual(dist , glm::vec3(clipEpsilon2)))) - // all clipped - return 0; + if (!glm::any(glm::greaterThanEqual(dist , glm::vec3(clipEpsilon2)))) { + // all clipped: leave it alone as it will be projected onto the near plane in the shader + return 3; + } if (glm::all(glm::greaterThanEqual(dist , glm::vec3(-clipEpsilon)))) // none clipped return 3; - // There are either 1 or 2 vertices above the clipping plane. + // There are either 1 or 2 vertices above the clipping plane. Tesselate into 3 triangles along the plane. glm::bvec3 above = glm::greaterThanEqual(dist, glm::vec3(0.f)); - bool nextIsAbove; glm::vec3 v0(trig.x0, trig.y0, trig.z0); glm::vec3 v1(trig.x1, trig.y1, trig.z1); glm::vec3 v2(trig.x2, trig.y2, trig.z2); - glm::vec3 v3; - // Find the CCW-most vertex above the plane. - if (above[1] && !above[0]) + glm::vec3 v3, v4; + // Find the lonely vertex on one side of the plane + if (above[0] == above[2]) { - // Cycle once CCW. Use v3 as a temp - nextIsAbove = above[2]; + // this is vertex 1 so cycle CCW v3 = v0; v0 = v1; v1 = v2; v2 = v3; dist = glm::vec3(dist.y, dist.z, dist.x); } - else if (above[2] && !above[1]) + else if (above[0] == above[1]) { - // Cycle once CW. Use v3 as a temp. - nextIsAbove = above[0]; + // this is vertex 2 so cycle CW v3 = v2; v2 = v1; v1 = v0; v0 = v3; dist = glm::vec3(dist.z, dist.x, dist.y); } - else - nextIsAbove = above[1]; + v3 = intersect(v0, dist[0], v1, dist[1]); + v4 = intersect(v0, dist[0], v2, dist[2]); + // v0 v3 v4 trig.x0 = v0.x; trig.y0 = v0.y; trig.z0 = v0.z; - // We always need to clip v2-v0. - v3 = intersect(v0, dist[0], v2, dist[2]); - if (nextIsAbove) - { - v2 = intersect(v1, dist[1], v2, dist[2]); - trig.x1 = v1.x; - trig.y1 = v1.y; - trig.z1 = v1.z; - trig.x2 = v2.x; - trig.y2 = v2.y; - trig.z2 = v2.z; - newTrig.x0 = v0.x; - newTrig.y0 = v0.y; - newTrig.z0 = v0.z; - newTrig.x1 = v2.x; - newTrig.y1 = v2.y; - newTrig.z1 = v2.z; - newTrig.x2 = v3.x; - newTrig.y2 = v3.y; - newTrig.z2 = v3.z; - - return 4; - } - else - { - v1 = intersect(v0, dist[0], v1, dist[1]); - trig.x1 = v1.x; - trig.y1 = v1.y; - trig.z1 = v1.z; - trig.x2 = v3.x; - trig.y2 = v3.y; - trig.z2 = v3.z; - - return 3; - } + trig.x1 = v3.x; + trig.y1 = v3.y; + trig.z1 = v3.z; + trig.x2 = v4.x; + trig.y2 = v4.y; + trig.z2 = v4.z; + // v3 v1 v4 + newTrig[0].x0 = v3.x; + newTrig[0].y0 = v3.y; + newTrig[0].z0 = v3.z; + newTrig[0].x1 = v1.x; + newTrig[0].y1 = v1.y; + newTrig[0].z1 = v1.z; + newTrig[0].x2 = v4.x; + newTrig[0].y2 = v4.y; + newTrig[0].z2 = v4.z; + // v2 v4 v1 + newTrig[1].x0 = v2.x; + newTrig[1].y0 = v2.y; + newTrig[1].z0 = v2.z; + newTrig[1].x1 = v4.x; + newTrig[1].y1 = v4.y; + newTrig[1].z1 = v4.z; + newTrig[1].x2 = v1.x; + newTrig[1].y2 = v1.y; + newTrig[1].z2 = v1.z; + + return 5; } bool enabled; @@ -1087,7 +1104,7 @@ static void sendMVPolygon(ICHList *list, const T *vtx, bool needClipping) mvp.isp.VolumeLast = list->pcw.volume; mvp.isp.DepthMode &= 3; mvp.mvMatrix = taMVMatrix; - mvp.projMatrix = taProjMatrix; + mvp.projMatrix = state.getProjectionMatrixIndex(); ta_add_poly(list->pcw.listType, mvp); ModifierVolumeClipper clipper(needClipping); @@ -1242,7 +1259,7 @@ static void setStateParams(PolyParam& pp, const ICHList *list) sendLights(); pp.mvMatrix = taMVMatrix; pp.normalMatrix = taNormalMatrix; - pp.projMatrix = taProjMatrix; + pp.projMatrix = state.getProjectionMatrixIndex(); pp.lightModel = taLightModel; pp.envMapping[0] = false; pp.envMapping[1] = false; @@ -1279,7 +1296,7 @@ static void setStateParams(PolyParam& pp, const ICHList *list) pp.tsp1.full ^= modelTSP.full; // projFlip is for left-handed projection matrices (initd rear view mirror) - bool projFlip = taProjMatrix != -1 && std::signbit(projectionMatrix[0][0]) == std::signbit(projectionMatrix[1][1]); + bool projFlip = std::signbit(projectionMatrix[0][0]) == std::signbit(projectionMatrix[1][1]); pp.isp.CullMode ^= (u32)cullingReversed ^ (u32)projFlip; pp.pcw.Shadow ^= shadowedVolume; if (pp.pcw.Shadow == 0 || pp.pcw.Volume == 0) @@ -1303,15 +1320,15 @@ static void sendPolygon(ICHList *list) case ICHList::VTX_TYPE_V: { N2_VERTEX *vtx = (N2_VERTEX *)((u8 *)list + sizeof(ICHList)); - if (!isBetweenNearAndFar(vtx, list->vtxCount, needClipping)) - break; int listType = ta_get_list_type(); if (listType == -1) listType = list->pcw.listType; if (listType & 1) - sendMVPolygon(list, vtx, needClipping); + sendMVPolygon(list, vtx, true); else { + if (!isBetweenNearAndFar(vtx, list->vtxCount, needClipping)) + break; PolyParam pp{}; pp.pcw.Shadow = list->pcw.shadow; pp.pcw.Texture = 0; @@ -1332,15 +1349,15 @@ static void sendPolygon(ICHList *list) case ICHList::VTX_TYPE_VU: { N2_VERTEX_VU *vtx = (N2_VERTEX_VU *)((u8 *)list + sizeof(ICHList)); - if (!isBetweenNearAndFar(vtx, list->vtxCount, needClipping)) - break; int listType = ta_get_list_type(); if (listType == -1) listType = list->pcw.listType; if (listType & 1) - sendMVPolygon(list, vtx, needClipping); + sendMVPolygon(list, vtx, true); else { + if (!isBetweenNearAndFar(vtx, list->vtxCount, needClipping)) + break; PolyParam pp{}; pp.pcw.Shadow = list->pcw.shadow; pp.pcw.Texture = list->pcw.texture; @@ -1438,6 +1455,13 @@ static void sendPolygon(ICHList *list) envMapping = false; } +[[noreturn]] static void raiseError() +{ + // no idea if this is correct but it stops initdv2/v3jb sending garbage + reg74 |= 0x12; + throw TAParserException(); +} + template static void executeCommand(u8 *data, int size) { @@ -1556,7 +1580,7 @@ static void executeCommand(u8 *data, int size) WARN_LOG(PVR, "Unknown interrupt mask %x", wait->mask); // initdv2j: happens at end of race, garbage data after end of model due to wrong size? //die("unexpected"); - inter = (HollyInterruptID)-1; + raiseError(); break; } if (inter != (HollyInterruptID)-1) @@ -1580,12 +1604,14 @@ static void executeCommand(u8 *data, int size) if (link->size > VRAM_SIZE) { WARN_LOG(PVR, "Texture DMA from %x to %x (%x invalid)", DMAC_SAR(2), link->vramAddress & 0x1ffffff8, link->size); - size = 0; - break; + raiseError(); } - DEBUG_LOG(PVR, "Texture DMA from %x to %x (%x)", DMAC_SAR(2), link->vramAddress & 0x1ffffff8, link->size); + DEBUG_LOG(PVR, "Texture DMA from %x to %x (%x) %s", DMAC_SAR(2), link->vramAddress & 0x1ffffff8, link->size, + data >= (u8 *)elanCmd && data < (u8 *)elanCmd + sizeof(elanCmd) ? "CMD" : "ERAM"); memcpy(&vram[link->vramAddress & VRAM_MASK], &mem_b[DMAC_SAR(2) & RAM_MASK], link->size); - reg74 |= 1; + // theoretical bandwidth: 64 bits @ 100 MHz + // but initdv3j needs ~50 MB/s to boot + sh4_sched_request(schedId, 512); } else if (link->offset & 0x20000000) { @@ -1593,12 +1619,12 @@ static void executeCommand(u8 *data, int size) if (link->size > VRAM_SIZE) { WARN_LOG(PVR, "Texture DMA from eram %x -> %x (%x invalid)", link->offset & ELAN_RAM_MASK, link->vramAddress & VRAM_MASK, link->size); - size = 0; - break; + raiseError(); } - DEBUG_LOG(PVR, "Texture DMA from eram %x -> %x (%x)", link->offset & ELAN_RAM_MASK, link->vramAddress & VRAM_MASK, link->size); + DEBUG_LOG(PVR, "Texture DMA from eram %x -> %x (%x) %s", link->offset & ELAN_RAM_MASK, link->vramAddress & VRAM_MASK, link->size, + data >= (u8 *)elanCmd && data < (u8 *)elanCmd + sizeof(elanCmd) ? "CMD" : "ERAM"); memcpy(&vram[link->vramAddress & VRAM_MASK], &RAM[link->offset & ELAN_RAM_MASK], link->size); - reg74 |= 1; + sh4_sched_request(schedId, 512); } else { @@ -1629,7 +1655,7 @@ static void executeCommand(u8 *data, int size) default: WARN_LOG(PVR, "Unhandled Elan command %x", cmd->pcw.n2Command); - size -= 32; + raiseError(); break; } } @@ -1642,7 +1668,7 @@ static void executeCommand(u8 *data, int size) try { size -= ta_add_ta_data((u32 *)data, size); } catch (const TAParserException& e) { - size = 0; + raiseError(); } } else @@ -1701,7 +1727,7 @@ static void executeCommand(u8 *data, int size) break; default: WARN_LOG(PVR, "Invalid param type %d", pcw.paraType); - i = size; + raiseError(); break; } } @@ -1720,12 +1746,15 @@ static void DYNACALL write_elancmd(u32 addr, u32 data) if (addr == 7) { - if (!ggpo::rollbacking()) - executeCommand((u8 *)elanCmd, sizeof(elanCmd)); - else - executeCommand((u8 *)elanCmd, sizeof(elanCmd)); - if (!(reg74 & 1)) - reg74 |= 2; + try { + if (!ggpo::rollbacking()) + executeCommand((u8 *)elanCmd, sizeof(elanCmd)); + else + executeCommand((u8 *)elanCmd, sizeof(elanCmd)); + if (!sh4_sched_is_scheduled(schedId)) + reg74 |= 2; + } catch (const TAParserException& e) { + } } } @@ -1741,8 +1770,17 @@ static void DYNACALL write_elanram(u32 addr, T data) *(T *)&RAM[addr & ELAN_RAM_MASK] = data; } +int schedCallback(int tag, int cycles, int lag, void *arg) +{ + // DMA done + reg74 |= 1; + return 0; +} + void init() { + if (schedId == -1) + schedId = sh4_sched_register(0, schedCallback); } void reset(bool hard) @@ -1751,11 +1789,16 @@ void reset(bool hard) { memset(RAM, 0, ERAM_SIZE); state.reset(); + state.resetProjectionMatrix(); } } void term() { + if (schedId != -1) { + sh4_sched_unregister(schedId); + schedId = -1; + } } void vmem_init() @@ -1785,6 +1828,7 @@ void serialize(Serializer& ser) if (!ser.rollback()) ser.serialize(RAM, ERAM_SIZE); state.serialize(ser); + sh4_sched_serialize(ser, schedId); } void deserialize(Deserializer& deser) @@ -1797,6 +1841,8 @@ void deserialize(Deserializer& deser) if (!deser.rollback()) deser.deserialize(RAM, ERAM_SIZE); state.deserialize(deser); + if (deser.version() >= Deserializer::V44) + sh4_sched_deserialize(deser, schedId); } } diff --git a/core/hw/pvr/elan.h b/core/hw/pvr/elan.h index b1dea22f6..6c3b04e5f 100644 --- a/core/hw/pvr/elan.h +++ b/core/hw/pvr/elan.h @@ -33,5 +33,5 @@ void deserialize(Deserializer& deser); extern u8 *RAM; extern u32 ERAM_SIZE; -constexpr u32 ERAM_SIZE_MAX = 32 * 1024 * 1024; +constexpr u32 ERAM_SIZE_MAX = 32_MB; } diff --git a/core/hw/pvr/elan_struct.h b/core/hw/pvr/elan_struct.h index 98486e3f7..f138e00a8 100644 --- a/core/hw/pvr/elan_struct.h +++ b/core/hw/pvr/elan_struct.h @@ -50,13 +50,13 @@ union PCW // Naomi 2 u32 n2Command : 4; - u32 reserved : 4; + u32 : 4; // Group Control u32 userClip : 2; u32 stripLen : 2; u32 parallelLight:1; - u32 res_2 : 2; + u32 : 2; u32 groupEnable : 1; // Para Control @@ -78,10 +78,10 @@ struct Model : public ElanBase { // 08000800 struct { - u32 _res:27; + u32 :27; u32 cwCulling:1; u32 openVolume:1; - u32 _res0:3; + u32 :3; } param; TSP tsp; u32 zero; // 0 @@ -181,7 +181,7 @@ struct GMP : public ElanBase u32 e0:1; // environmental mapping u32 e1:1; - u32 _res:19; + u32 :19; }; u32 full; } paramSelect; @@ -223,7 +223,7 @@ union HeaderAndNormal u32 ny:8; u32 nz:8; - u32 _res:5; + u32 :5; u32 strip:1; u32 fan:1; u32 endOfStrip:1; @@ -403,10 +403,10 @@ struct LightModel : public ElanBase u32 useAmbientOffset1:1; u32 useBaseOver:1; // diffusion saturated light: overflow ambient+diffuse into specular - u32 _res:2; + u32 :2; u32 bumpId1:4; u32 bumpId2:4; - u32 _res0:12; + u32 :12; }; u16 diffuseMask0; u16 specularMask0; @@ -469,7 +469,7 @@ struct ParallelLight : public ElanBase // 08100400 struct { u32 lightId:4; - u32 _res:4; + u32 :4; u32 blue:8; u32 green:8; u32 red:8; @@ -481,7 +481,7 @@ struct ParallelLight : public ElanBase u32 routing:4; u32 dmode:2; - u32 _res1:2; + u32 :2; }; u32 _res2[5]; @@ -501,7 +501,7 @@ struct PointLight : public ElanBase // 08000400 struct { u32 lightId:4; - u32 _res:1; + u32 :1; u32 dmode:3; u32 blue:8; u32 green:8; diff --git a/core/hw/pvr/pvr.cpp b/core/hw/pvr/pvr.cpp index 0c6141f90..285496d45 100644 --- a/core/hw/pvr/pvr.cpp +++ b/core/hw/pvr/pvr.cpp @@ -21,7 +21,6 @@ #include "pvr_regs.h" #include "Renderer_if.h" #include "ta_ctx.h" -#include "rend/TexCache.h" #include "serialize.h" #include "pvr_mem.h" #include "elan.h" @@ -31,7 +30,6 @@ extern u8 ta_fsm[2049]; //[2048] stores the current state extern u32 ta_fsm_cl; extern u32 taRenderPass; // pvr_regs.cpp -extern bool fog_needs_update; extern bool pal_needs_update; namespace pvr @@ -39,7 +37,6 @@ namespace pvr void reset(bool hard) { - KillTex = true; Regs_Reset(hard); spg_Reset(hard); if (hard) @@ -47,7 +44,11 @@ void reset(bool hard) tactx_Term(); elan::reset(hard); if (hard) + { ta_parse_reset(); + YUV_reset(); + taRenderPass = 0; + } } void init() @@ -88,7 +89,7 @@ void deserialize(Deserializer& deser) YUV_deserialize(deser); deser >> pvr_regs; - fog_needs_update = true; + rend_updateFogTable(); spg_Deserialize(deser); @@ -100,8 +101,7 @@ void deserialize(Deserializer& deser) deser >> taRenderPass; else taRenderPass = 0; - if (deser.version() >= Deserializer::V11 || (deser.version() >= Deserializer::V10_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) - DeserializeTAContext(deser); + DeserializeTAContext(deser); if (!deser.rollback()) vram.deserialize(deser); diff --git a/core/hw/pvr/pvr_mem.cpp b/core/hw/pvr/pvr_mem.cpp index 708185961..d0d8e6d8d 100644 --- a/core/hw/pvr/pvr_mem.cpp +++ b/core/hw/pvr/pvr_mem.cpp @@ -190,10 +190,19 @@ void YUV_deserialize(Deserializer& deser) deser >> YUV_y_curr; deser >> YUV_x_size; deser >> YUV_y_size; - if (deser.version() >= Deserializer::V16) - deser >> YUV_index; - else - YUV_index = 0; + deser >> YUV_index; +} + +void YUV_reset() +{ + memset(YUV_tempdata, 0, sizeof(YUV_tempdata)); + YUV_dest = 0; + YUV_blockcount = 0; + YUV_x_curr = 0; + YUV_y_curr = 0; + YUV_x_size = 0; + YUV_y_size = 0; + YUV_index = 0; } //vram 32-64b @@ -210,10 +219,10 @@ template u32 pvr_read32p(u32 addr); template float pvr_read32p(u32 addr); //write -template +template void DYNACALL pvr_write32p(u32 addr, T data) { - if constexpr (sizeof(T) == 1) + if constexpr (!Internal && sizeof(T) == 1) { INFO_LOG(MEMORY, "%08x: 8-bit VRAM writes are not possible", addr); return; @@ -225,9 +234,12 @@ void DYNACALL pvr_write32p(u32 addr, T data) *(T *)&vram[pvr_map32(addr)] = data; } -template void pvr_write32p(u32 addr, u8 data); -template void pvr_write32p(u32 addr, u16 data); -template void pvr_write32p(u32 addr, u32 data); +template void pvr_write32p(u32 addr, u8 data); +template void pvr_write32p(u32 addr, u8 data); +template void pvr_write32p(u32 addr, u16 data); +template void pvr_write32p(u32 addr, u16 data); +template void pvr_write32p(u32 addr, u32 data); +template void pvr_write32p(u32 addr, u32 data); void DYNACALL TAWrite(u32 address, const SQBuffer *data, u32 count) { diff --git a/core/hw/pvr/pvr_mem.h b/core/hw/pvr/pvr_mem.h index cf30c523b..2e2b1476e 100644 --- a/core/hw/pvr/pvr_mem.h +++ b/core/hw/pvr/pvr_mem.h @@ -16,10 +16,11 @@ void DYNACALL TAWriteSQ(u32 address, const SQBuffer *sqb); void YUV_init(); void YUV_serialize(Serializer& ser); void YUV_deserialize(Deserializer& deser); +void YUV_reset(); // 32-bit vram path handlers template T DYNACALL pvr_read32p(u32 addr); -template void DYNACALL pvr_write32p(u32 addr, T data); +template void DYNACALL pvr_write32p(u32 addr, T data); // Area 4 handlers template T DYNACALL pvr_read_area4(u32 addr); template void DYNACALL pvr_write_area4(u32 addr, T data); diff --git a/core/hw/pvr/pvr_regs.cpp b/core/hw/pvr/pvr_regs.cpp index 235c728fb..67eb5e714 100644 --- a/core/hw/pvr/pvr_regs.cpp +++ b/core/hw/pvr/pvr_regs.cpp @@ -6,7 +6,6 @@ #include bool pal_needs_update=true; -bool fog_needs_update=true; u8 pvr_regs[pvr_RegSize]; @@ -221,7 +220,7 @@ void pvr_WriteReg(u32 paddr,u32 data) if (addr >= PALETTE_RAM_START_addr && PvrReg(addr,u32) != data) pal_needs_update = true; else if (addr >= FOG_TABLE_START_addr && addr <= FOG_TABLE_END_addr && PvrReg(addr,u32) != data) - fog_needs_update = true; + rend_updateFogTable(); break; } PvrReg(addr, u32) = data; diff --git a/core/hw/pvr/pvr_regs.h b/core/hw/pvr/pvr_regs.h index 9d5896fbb..02faa6fab 100644 --- a/core/hw/pvr/pvr_regs.h +++ b/core/hw/pvr/pvr_regs.h @@ -86,12 +86,12 @@ union FB_R_CTRL_type u32 fb_line_double : 1; //1 u32 fb_depth : 2; //3-2 u32 fb_concat : 3; //6-4 - u32 R : 1; //7 + u32 : 1; //7 u32 fb_chroma_threshold : 8; //15-8 u32 fb_stripsize : 6; //21-16 u32 fb_strip_buf_en : 1; //22 u32 vclk_div : 1; //23 - u32 Reserved : 8; //31-24 + u32 : 8; //31-24 }; u32 full; }; @@ -109,7 +109,7 @@ union FB_R_SIZE_type u32 fb_x_size : 10; //0 u32 fb_y_size : 10; //10 u32 fb_modulus : 10; //20 - u32 fb_res : 2; //30 + u32 : 2; //30 }; u32 full; }; @@ -145,7 +145,7 @@ struct VO_BORDER_COL_type : RGBAColorTemplate u32 _green : 8; u32 _red : 8; u32 _chroma : 1; - u32 _res : 7; + u32 : 7; }; u32 full; }; @@ -159,7 +159,7 @@ struct RGBColor : RGBAColorTemplate u32 _blue : 8; u32 _green : 8; u32 _red : 8; - u32 _res : 8; + u32 : 8; }; u32 full; }; @@ -188,7 +188,7 @@ union SPG_STATUS_type u32 blank : 1; //11 u32 hsync : 1; //12 u32 vsync : 1; //13 - u32 res : 18; //31-14 + u32 : 18; //31-14 }; u32 full; }; @@ -198,11 +198,11 @@ union SPG_HBLANK_INT_type struct { u32 line_comp_val : 10; //9-0 - u32 res1 : 2; //10-11 - u32 hblank_int_mode: 2; //12-13 - u32 res2 : 2; //14-15 + u32 : 2; //11-10 + u32 hblank_int_mode: 2; //13-12 + u32 : 2; //15-14 u32 hblank_in_interrupt : 10; //25-16 - u32 res3 : 6; //31-26 + u32 : 6; //31-26 }; u32 full; }; @@ -211,10 +211,10 @@ union SPG_VBLANK_INT_type { struct { - u32 vblank_in_interrupt_line_number : 10;//9-0 - u32 res : 6 ; //15-10 - u32 vblank_out_interrupt_line_number : 10;//25-16 - u32 res1 : 6 ; //31-26 + u32 vblank_in_interrupt_line_number : 10; //9-0 + u32 : 6; //15-10 + u32 vblank_out_interrupt_line_number : 10; //25-16 + u32 : 6; //31-26 }; u32 full; }; @@ -232,18 +232,22 @@ union SPG_CONTROL_type u32 PAL : 1; //7 u32 sync_direction : 1; //8 u32 csync_on_h : 1; //9 - u32 Reserved : 22; //31-10 + u32 : 22; //31-10 }; u32 full; + + bool isNTSC() const { return NTSC == 1 && PAL == 0; } + bool isPAL() const { return NTSC == 0 && PAL == 1; } + bool isVGA() const { return NTSC == 0 && PAL == 0; } }; union SPG_HBLANK_type { struct { u32 hstart : 10;//9-0 - u32 res : 6; //15-10 + u32 : 6; //15-10 u32 hbend : 10;//25-16 - u32 res1 : 6; //31-26 + u32 : 6; //31-26 }; u32 full; }; @@ -253,9 +257,9 @@ union SPG_LOAD_type struct { u32 hcount : 10; //9-0 - u32 res : 6 ; //15-10 + u32 : 6 ; //15-10 u32 vcount : 10; //25-16 - u32 res1 : 6 ; //31-26 + u32 : 6 ; //31-26 }; u32 full; }; @@ -265,9 +269,9 @@ union SPG_VBLANK_type struct { u32 vstart : 10; //9-0 - u32 res : 6 ; //15-10 + u32 : 6 ; //15-10 u32 vbend : 10; //25-16 - u32 res1 : 6 ; //31-26 + u32 : 6 ; //31-26 }; u32 full; }; @@ -277,8 +281,8 @@ union SPG_WIDTH_type struct { u32 hswidth : 7; //6-0 - u32 res : 1; //7-7 - u32 vswidth : 4; //8-11 + u32 : 1; //7 + u32 vswidth : 4; //11-8 u32 bpwidth : 10; //21-12 u32 eqwidth : 10; //31-22 }; @@ -290,9 +294,9 @@ union SCALER_CTL_type struct { u32 vscalefactor : 16;//15-0 - u32 hscale : 1; //16-16 - u32 interlace : 1; //17-17 - u32 fieldselect : 1; //18-18 + u32 hscale : 1; //16 + u32 interlace : 1; //17 + u32 fieldselect : 1; //18 }; u32 full; }; @@ -302,9 +306,9 @@ union FB_X_CLIP_type struct { u32 min : 11; - u32 pad1 : 5; + u32 : 5; u32 max : 11; - u32 pad : 5; + u32 : 5; }; u32 full; }; @@ -313,10 +317,10 @@ union FB_Y_CLIP_type { struct { - u32 min : 10; //15-0 - u32 pad1 : 6 ; //16-16 - u32 max : 10; //17-17 - u32 pad : 6; //18-18 + u32 min : 10; //9-0 + u32 : 6 ; //15-10 + u32 max : 10; //25-16 + u32 : 6; //31-26 }; u32 full; }; @@ -329,11 +333,11 @@ union VO_CONTROL_type u32 vsync_pol : 1; //1 u32 blank_pol : 1; //2 u32 blank_video : 1; //3 - u32 field_mode : 4; //4 + u32 field_mode : 4; //7-4 u32 pixel_double : 1; //8 - u32 res_1 : 7; //9 - u32 pclk_delay : 6; //16 - u32 res_2 : 10; //22 + u32 : 7; //15-9 + u32 pclk_delay : 6; //21-16 + u32 : 10; //31-22 }; u32 full; }; @@ -342,8 +346,8 @@ union VO_STARTX_type { struct { - u32 HStart : 10; //0 - u32 res_1 : 22; //10 + u32 HStart : 10; //9-0 + u32 : 22; //31-10 }; u32 full; }; @@ -351,10 +355,10 @@ union VO_STARTY_type { struct { - u32 VStart_field1:10; //0 - u32 res_1:6; //10 - u32 VStart_field2:10; //16 - u32 res_2:6; //26 + u32 VStart_field1:10; //9-0 + u32 :6; //15-10 + u32 VStart_field2:10; //25-16 + u32 :6; //31-26 }; u32 full; }; @@ -384,10 +388,10 @@ union FB_W_CTRL_type { u32 fb_packmode : 3; u32 fb_dither : 1; - u32 pad0 : 4; + u32 : 4; u32 fb_kval : 8; u32 fb_alpha_threshold : 8; - u32 pad1 : 8; + u32 : 8; }; u32 full; }; @@ -397,7 +401,7 @@ union FB_W_LINESTRIDE_type struct { u32 stride : 9; - u32 pad0 : 23; + u32 : 23; }; u32 full; }; @@ -417,9 +421,9 @@ union TA_GLOB_TILE_CLIP_type struct { u32 tile_x_num : 6; - u32 reserved : 10; + u32 : 10; u32 tile_y_num : 4; - u32 reserved2 : 12; + u32 : 12; }; u32 full; }; @@ -429,13 +433,13 @@ union TA_YUV_TEX_CTRL_type struct { u32 yuv_u_size : 6; - u32 reserved1 : 2; + u32 : 2; u32 yuv_v_size : 6; - u32 reserved2 : 2; + u32 : 2; u32 yuv_tex : 1; - u32 reserved3 : 7; + u32 : 7; u32 yuv_form : 1; - u32 reserved4 : 7; + u32 : 7; }; u32 full; }; @@ -449,7 +453,7 @@ union FOG_DENSITY_type }; u32 full; - float get() { + float get() const { return mantissa / 128.f * std::pow(2.0f, (float)exponent); } }; diff --git a/core/hw/pvr/spg.cpp b/core/hw/pvr/spg.cpp index ecde17c63..0e2115c77 100755 --- a/core/hw/pvr/spg.cpp +++ b/core/hw/pvr/spg.cpp @@ -1,13 +1,13 @@ -#include #include "spg.h" #include "hw/holly/holly_intc.h" #include "hw/holly/sb.h" #include "hw/sh4/sh4_sched.h" -#include "oslib/oslib.h" #include "hw/maple/maple_if.h" #include "serialize.h" #include "network/ggpo.h" #include "hw/pvr/Renderer_if.h" +#include "stdclass.h" +#include #ifdef TEST_AUTOMATION #include "input/gamepad_device.h" @@ -18,10 +18,10 @@ static u32 clc_pvr_scanline; static u32 pvr_numscanlines = 512; static u32 prv_cur_scanline = -1; -static u32 vblk_cnt; #if !defined(NDEBUG) || defined(DEBUGFAST) -static float last_fps; +static u32 vblk_cnt; +static u64 last_fps; #endif // 27 mhz pixel clock @@ -96,7 +96,7 @@ void rescheduleSPG() sh4_sched_request(vblank_schid, getNextSpgInterrupt()); } -static int spg_line_sched(int tag, int cycles, int jitter) +static int spg_line_sched(int tag, int cycles, int jitter, void *arg) { clc_pvr_scanline += cycles + jitter; @@ -156,17 +156,18 @@ static int spg_line_sched(int tag, int cycles, int jitter) rend_vblank(); - double now = os_GetSeconds() * 1000000.0; + u64 now = getTimeMs(); cpu_time_idx = (cpu_time_idx + 1) % cpu_cycles.size(); if (cpu_cycles[cpu_time_idx] != 0) { u32 cycle_span = (u32)(sh4_sched_now64() - cpu_cycles[cpu_time_idx]); - double time_span = now - real_times[cpu_time_idx]; - double cpu_speed = ((double)cycle_span / time_span) / (SH4_MAIN_CLOCK / 100000000); - SH4FastEnough = cpu_speed >= 85.0; + u64 time_span = now - real_times[cpu_time_idx]; + float cpu_speed = ((float)cycle_span / time_span) / (SH4_MAIN_CLOCK / 100000); + SH4FastEnough = cpu_speed >= 85.f; } - else + else { SH4FastEnough = false; + } cpu_cycles[cpu_time_idx] = sh4_sched_now64(); real_times[cpu_time_idx] = now; @@ -176,15 +177,15 @@ static int spg_line_sched(int tag, int cycles, int jitter) #if !defined(NDEBUG) || defined(DEBUGFAST) vblk_cnt++; - if ((os_GetSeconds()-last_fps)>2) + if (getTimeMs() - last_fps >= 2000) { static int Last_FC; - double ts=os_GetSeconds()-last_fps; - double spd_fps=(FrameCount-Last_FC)/ts; - double spd_vbs=vblk_cnt/ts; - double spd_cpu=spd_vbs*Frame_Cycles; - spd_cpu/=1000000; //mrhz kthx - double fullvbs=(spd_vbs/spd_cpu)*200; + double ts = ((double)getTimeMs() - last_fps) / 1000.0; + double spd_fps = (FrameCount - Last_FC) / ts; + double spd_vbs = vblk_cnt / ts; + double spd_cpu = spd_vbs * Frame_Cycles; + spd_cpu /= 1000000.0; //mrhz kthx + double fullvbs = (spd_vbs / spd_cpu) * 200.0; Last_FC=FrameCount; @@ -193,16 +194,16 @@ static int spg_line_sched(int tag, int cycles, int jitter) const char* mode=0; const char* res=0; - res=SPG_CONTROL.interlace?"480i":"240p"; + res = SPG_CONTROL.interlace ? "480i" : "240p"; - if (SPG_CONTROL.NTSC==0 && SPG_CONTROL.PAL==1) - mode="PAL"; - else if (SPG_CONTROL.NTSC==1 && SPG_CONTROL.PAL==0) - mode="NTSC"; + if (SPG_CONTROL.isPAL()) + mode = "PAL"; + else if (SPG_CONTROL.isNTSC()) + mode = "NTSC"; else { - res=SPG_CONTROL.interlace?"480i":"480p"; - mode="VGA"; + res = SPG_CONTROL.interlace ? "480i" : "480p"; + mode = "VGA"; } double frames_done=spd_cpu/2; @@ -210,13 +211,13 @@ static int spg_line_sched(int tag, int cycles, int jitter) double full_rps = spd_fps + fskip / ts; - INFO_LOG(COMMON, "%s/%c - %4.2f - %4.2f - V: %4.2f (%.2f, %s%s%4.2f) R: %4.2f+%4.2f", - VER_SHORTNAME,'n',mspdf,spd_cpu*100/200,spd_vbs, - spd_vbs/full_rps,mode,res,fullvbs, - spd_fps,fskip/ts); + INFO_LOG(COMMON, "SPG - %4.2f - %4.2f - V: %4.2f (%.2f, %s%s%4.2f) R: %4.2f+%4.2f", + mspdf, spd_cpu * 100 / 200, spd_vbs, + spd_vbs / full_rps, mode, res, fullvbs, + spd_fps, fskip / ts); - fskip=0; - last_fps=os_GetSeconds(); + fskip = 0; + last_fps = getTimeMs(); } #endif } @@ -234,7 +235,7 @@ static int spg_line_sched(int tag, int cycles, int jitter) void read_lightgun_position(int x, int y) { - static u8 flip; + static u32 flip; maple_int_pending = true; if (y < 0 || y >= 480 || x < 0 || x >= 640) { @@ -244,9 +245,11 @@ void read_lightgun_position(int x, int y) else { lightgun_line = y / (SPG_CONTROL.interlace ? 2 : 1) + SPG_VBLANK_INT.vblank_out_interrupt_line_number; - // For some reason returning the same position twice makes it register off screen - lightgun_hpos = (x + 286) ^ flip; - flip ^= 1; + // For some reason returning the same position twice makes it register off screen. + // Atomiswave Clay Challenge wants more wiggle than others for shots to register. + lightgun_line ^= (flip >> 1) & 1; + lightgun_hpos = (x + 286) ^ (flip & 1); + flip++; } } @@ -274,6 +277,9 @@ void spg_Reset(bool hard) cpu_time_idx = 0; cpu_cycles.fill(0); real_times.fill(0.0); + maple_int_pending = false; + lightgun_line = 0xffff; + lightgun_hpos = 0; } void scheduleRenderDone(TA_context *cntx) @@ -311,19 +317,11 @@ void spg_Deserialize(Deserializer& deser) if (deser.version() < Deserializer::V30) deser.skip(); // in_vblank deser >> clc_pvr_scanline; - if (deser.version() >= Deserializer::V12) - { - deser >> maple_int_pending; - if (deser.version() >= Deserializer::V14) - { - deser >> pvr_numscanlines; - deser >> prv_cur_scanline; - deser >> Line_Cycles; - deser >> Frame_Cycles; - deser >> lightgun_line; - deser >> lightgun_hpos; - } - } - if (deser.version() < Deserializer::V14) - CalculateSync(); + deser >> maple_int_pending; + deser >> pvr_numscanlines; + deser >> prv_cur_scanline; + deser >> Line_Cycles; + deser >> Frame_Cycles; + deser >> lightgun_line; + deser >> lightgun_hpos; } diff --git a/core/hw/pvr/ta.cpp b/core/hw/pvr/ta.cpp index 6732a585e..4207b0452 100644 --- a/core/hw/pvr/ta.cpp +++ b/core/hw/pvr/ta.cpp @@ -531,7 +531,7 @@ static void DYNACALL ta_thd_data32_i(const simd256_t *data) INFO_LOG(PVR, "Warning: data sent to TA prior to ListInit. Ignored"); return; } - if (ta_tad.End() - ta_tad.thd_root >= TA_DATA_SIZE) + if (ta_tad.End() - ta_tad.thd_root >= (ptrdiff_t)TA_DATA_SIZE) { INFO_LOG(PVR, "Warning: TA data buffer overflow"); asic_RaiseInterrupt(holly_MATR_NOMEM); diff --git a/core/hw/pvr/ta_ctx.cpp b/core/hw/pvr/ta_ctx.cpp index 58c23d0d1..dd64b05a4 100644 --- a/core/hw/pvr/ta_ctx.cpp +++ b/core/hw/pvr/ta_ctx.cpp @@ -249,8 +249,7 @@ static void deserializeContext(Deserializer& deser, TA_context **pctx) tad_context& tad = (*pctx)->tad; deser.deserialize(tad.thd_root, size); tad.thd_data = tad.thd_root + size; - if ((deser.version() >= Deserializer::V12 && deser.version() < Deserializer::V26) - || (deser.version() >= Deserializer::V12_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) + if (deser.version() < Deserializer::V26) { u32 render_pass_count; deser >> render_pass_count; diff --git a/core/hw/pvr/ta_ctx.h b/core/hw/pvr/ta_ctx.h index a719cc760..b12df6e1b 100644 --- a/core/hw/pvr/ta_ctx.h +++ b/core/hw/pvr/ta_ctx.h @@ -112,6 +112,7 @@ struct ModifierVolumeParam u32 first; u32 count; ISP_Modvol isp; + u32 tileclip; int mvMatrix; int projMatrix; @@ -121,6 +122,7 @@ struct ModifierVolumeParam first = 0; count = 0; isp.full = 0; + tileclip = 0; mvMatrix = -1; projMatrix = -1; } @@ -227,13 +229,10 @@ struct SortedTriangle struct rend_context { - u8* proc_start; - u8* proc_end; - - f32 fZ_min; f32 fZ_max; bool isRTT; + bool clearFramebuffer; TA_GLOB_TILE_CLIP_type ta_GLOB_TILE_CLIP; SCALER_CTL_type scaler_ctl; @@ -280,28 +279,44 @@ struct rend_context global_param_op.back().init(); verts.resize(4); - fZ_min = 1000000.0f; fZ_max = 1.0f; matrices.clear(); lightModels.clear(); + clearFramebuffer = false; } void newRenderPass(); // For RTT TODO merge with framebufferWidth/Height - u32 getFramebufferWidth() const { + u32 getFramebufferWidth() const + { u32 w = fb_X_CLIP.max + 1; if (fb_W_LINESTRIDE != 0) // Happens for Flag to Flag, Virtua Tennis? w = std::min(fb_W_LINESTRIDE * 4, w); return w; } - u32 getFramebufferHeight() const { - return fb_Y_CLIP.max + 1; + u32 getFramebufferHeight() const + { + u32 h = fb_Y_CLIP.max + 1; + if (scaler_ctl.vscalefactor < 0x400) + h = h * 1024 / scaler_ctl.vscalefactor; + return h; + } + u32 getFramebufferMinX() const + { + return fb_X_CLIP.min; + } + u32 getFramebufferMinY() const + { + u32 y = fb_Y_CLIP.min; + if (scaler_ctl.vscalefactor < 0x400) + y = y * 1024 / scaler_ctl.vscalefactor; + return y; } }; -#define TA_DATA_SIZE (8 * 1024 * 1024) +#define TA_DATA_SIZE 8_MB //vertex lists struct TA_context @@ -329,10 +344,12 @@ struct TA_context sa2: idx: 36094, vtx: 24520, op: 1330, pt: 10, tr: 177, mvo: 39, modt: 360, ov: 0 */ - void MarkRend() - { - rend.proc_start = tad.thd_root; - rend.proc_end = tad.End(); + u8 *getTADataBegin() { + return tad.thd_root; + } + + u8 *getTADataEnd() { + return tad.End(); } void Alloc() @@ -358,16 +375,15 @@ struct TA_context void Reset() { - verify(tad.End() - tad.thd_root <= TA_DATA_SIZE); + verify(tad.End() - tad.thd_root <= (ptrdiff_t)TA_DATA_SIZE); tad.Clear(); nextContext = nullptr; rend.Clear(); - rend.proc_end = rend.proc_start = tad.thd_root; } ~TA_context() { - verify(tad.End() - tad.thd_root <= TA_DATA_SIZE); + verify(tad.End() - tad.thd_root <= (ptrdiff_t)TA_DATA_SIZE); freeAligned(tad.thd_root); } }; diff --git a/core/hw/pvr/ta_structs.h b/core/hw/pvr/ta_structs.h index 122fb8cf0..a298b8677 100644 --- a/core/hw/pvr/ta_structs.h +++ b/core/hw/pvr/ta_structs.h @@ -17,17 +17,17 @@ union PCW u32 Volume : 1; //1 u32 Shadow : 1; //1 - u32 Reserved : 8; //0000 0000 + u32 : 8; // Group Control u32 User_Clip : 2; u32 Strip_Len : 2; - u32 Res_2 : 3; + u32 : 3; u32 Group_En : 1; // Para Control u32 ListType : 3; - u32 Res_1 : 1; + u32 : 1; u32 EndOfStrip : 1; u32 ParaType : 3; }; @@ -42,7 +42,7 @@ union ISP_TSP { struct { - u32 Reserved : 20; + u32 : 20; u32 DCalcCtrl : 1; u32 CacheBypass : 1; u32 UV_16b : 1; //In TA they are replaced @@ -110,7 +110,7 @@ union TCW struct { u32 TexAddr :21; - u32 Reserved : 4; + u32 : 4; u32 StrideSel : 1; u32 ScanOrder : 1; u32 PixelFmt : 3; @@ -119,7 +119,7 @@ union TCW }; struct { - u32 pading_0 :21; + u32 :21; u32 PalSelect : 6; }; u32 full; @@ -691,10 +691,10 @@ union RegionArrayTile { struct { - u32 Reserved_0 : 2; + u32 : 2; u32 X : 6; u32 Y : 6; - u32 Reserved_1 : 14; + u32 : 14; u32 FlushAccumulate : 1; u32 PreSort : 1; // For type 2 only. Ignored for type 1. u32 NoZClear : 1; diff --git a/core/hw/pvr/ta_vtx.cpp b/core/hw/pvr/ta_vtx.cpp index 0d7d87d4a..af83fda83 100644 --- a/core/hw/pvr/ta_vtx.cpp +++ b/core/hw/pvr/ta_vtx.cpp @@ -397,7 +397,7 @@ case num : {\ //32B case ParamType_User_Tile_Clip: - SetTileClip(data->data_32[3] & 63, data->data_32[4] & 31, data->data_32[5] & 63, data->data_32[6] & 31); + setClipRect(data->data_32[3] & 63, data->data_32[4] & 31, data->data_32[5] & 63, data->data_32[6] & 31); data += SZ32; break; @@ -413,7 +413,7 @@ case num : {\ //PolyType :32B/64B case ParamType_Polygon_or_Modifier_Volume: { - TileClipMode(data->pcw.User_Clip); + setClipMode(data->pcw.User_Clip); //Yep , C++ IS lame & limited #include "ta_const_df.h" if (CurrentList == ListType_None && !startList(data->pcw.ListType)) @@ -465,7 +465,7 @@ case num : {\ //32B //Sets Sprite info , and switches to ta_sprite_data function case ParamType_Sprite: - TileClipMode(data->pcw.User_Clip); + setClipMode(data->pcw.User_Clip); if (CurrentList != ListType_None || startList(data->pcw.ListType)) { VertexDataFP = ta_sprite_data; @@ -501,23 +501,25 @@ case num : {\ { TaCmd = ta_main; BaseTAParser::reset(); + setClipRect(0, 0, 39, 14); + setClipMode(0); } private: - static void SetTileClip(u32 xmin,u32 ymin,u32 xmax,u32 ymax) + static void setClipRect(u32 xmin, u32 ymin, u32 xmax, u32 ymax) { - u32 rv=tileclip_val & 0xF0000000; - rv|=xmin; //6 bits - rv|=xmax<<6; //6 bits - rv|=ymin<<12; //5 bits - rv|=ymax<<17; //5 bits - tileclip_val=rv; + u32 rv = tileclip_val & 0xF0000000; + rv |= xmin; // 6 bits + rv |= xmax << 6; // 6 bits + rv |= ymin << 12; // 5 bits + rv |= ymax << 17; // 5 bits + tileclip_val = rv; } - static void TileClipMode(u32 mode) + static void setClipMode(u32 mode) { //Group_En bit seems ignored, thanks p1pkin - tileclip_val=(tileclip_val&(~0xF0000000)) | (mode<<28); + tileclip_val = (tileclip_val & ~0xF0000000) | (mode << 28); } //Polys -- update code on sprites if that gets updated too -- @@ -1117,6 +1119,7 @@ case num : {\ p->isp.full = param->isp.full; p->isp.VolumeLast = param->pcw.Volume != 0; p->first = vd_rc.modtrig.size(); + p->tileclip = tileclip_val; } static void AppendModVolVertexA(TA_ModVolA* mvv) @@ -1159,7 +1162,7 @@ static void parseRenderPass(RenderPass& pass, const RenderPass& previousPass, re || config::RendererType == RenderType::Vulkan_OIT; const bool mergeTranslucent = config::PerStripSorting || perPixel; - if (config::RenderResolution > 480 && !config::EmulateFramebuffer) + if (config::RenderResolution > 480 && !config::EmulateFramebuffer && config::FixUpscaleBleedingEdge) { fix_texture_bleeding(ctx.global_param_op, previousPass.op_count, pass.op_count, ctx); fix_texture_bleeding(ctx.global_param_pt, previousPass.pt_count, pass.pt_count, ctx); @@ -1210,12 +1213,8 @@ static void ta_parse_vdrc(TA_context* ctx, bool primRestart) while (childCtx != nullptr) { - childCtx->MarkRend(); - vd_rc.proc_start = childCtx->rend.proc_start; - vd_rc.proc_end = childCtx->rend.proc_end; - - Ta_Dma* ta_data = (Ta_Dma *)vd_rc.proc_start; - Ta_Dma* ta_data_end = (Ta_Dma *)vd_rc.proc_end; + Ta_Dma* ta_data = (Ta_Dma *)childCtx->getTADataBegin(); + Ta_Dma* ta_data_end = (Ta_Dma *)childCtx->getTADataEnd(); while (ta_data < ta_data_end) try { @@ -1224,6 +1223,15 @@ static void ta_parse_vdrc(TA_context* ctx, bool primRestart) break; } + // Disable blending for opaque polys of the first pass + if (pass == 0) + { + for (PolyParam& pp : vd_rc.global_param_op) { + pp.tsp.DstInstr = 0; + pp.tsp.SrcInstr = 1; + } + } + bool empty_pass = vd_rc.global_param_op.size() == (pass == 0 ? 0u : (int)vd_rc.render_passes.back().op_count) && vd_rc.global_param_pt.size() == (pass == 0 ? 0u : (int)vd_rc.render_passes.back().pt_count) && vd_rc.global_param_tr.size() == (pass == 0 ? 0u : (int)vd_rc.render_passes.back().tr_count); @@ -1287,6 +1295,14 @@ static void ta_parse_naomi2(TA_context* ctx, bool primRestart) for (RenderPass& pass : ctx->rend.render_passes) { parseRenderPass(pass, previousPass, ctx->rend, primRestart); + // Disable blending for opaque polys of the first pass + if (&pass == &ctx->rend.render_passes[0]) + { + for (PolyParam& pp : ctx->rend.global_param_op) { + pp.tsp.DstInstr = 0; + pp.tsp.SrcInstr = 1; + } + } previousPass = pass; } @@ -1319,24 +1335,13 @@ const float identityMat[] { 0.f, 0.f, 0.f, 1.f }; -const float defaultProjMat[] { - 579.411194f, 0.f, 0.f, 0.f, - 0.f, -579.411194f, 0.f, 0.f, - -320.f, -240.f, -1.f, -1.f, - 0.f, 0.f, 0.f, 0.f -}; - constexpr int IdentityMatIndex = 0; -constexpr int DefaultProjMatIndex = 1; constexpr int NoLightIndex = 0; static void setDefaultMatrices() { if (ta_ctx->rend.matrices.empty()) - { ta_ctx->rend.matrices.push_back(*(N2Matrix *)identityMat); - ta_ctx->rend.matrices.push_back(*(N2Matrix *)defaultProjMat); - } } static void setDefaultLight() @@ -1363,8 +1368,6 @@ void ta_add_poly(const PolyParam& pp) n2CurrentPP->mvMatrix = IdentityMatIndex; if (n2CurrentPP->normalMatrix == -1) n2CurrentPP->normalMatrix = IdentityMatIndex; - if (n2CurrentPP->projMatrix == -1) - n2CurrentPP->projMatrix = DefaultProjMatIndex; setDefaultLight(); if (n2CurrentPP->lightModel == -1) n2CurrentPP->lightModel = NoLightIndex; @@ -1397,8 +1400,6 @@ void ta_add_poly(int listType, const ModifierVolumeParam& mvp) setDefaultMatrices(); if (n2CurrentMVP->mvMatrix == -1) n2CurrentMVP->mvMatrix = IdentityMatIndex; - if (n2CurrentMVP->projMatrix == -1) - n2CurrentMVP->projMatrix = DefaultProjMatIndex; vd_ctx = nullptr; } @@ -1606,8 +1607,9 @@ void FillBGP(TA_context* ctx) vertex_ptr += strip_vs; } - f32 bg_depth = ISP_BACKGND_D.f; - reinterpret_cast(bg_depth) &= 0xFFFFFFF0; // ISP_BACKGND_D has only 28 bits + // Apply a negative 1e-6 bias since the background plane is clipping too much + // (Fixes Xtreme Sports, Blue Stinger (JP) and many WinCE games using yuv FMV) + float bg_depth = std::max(ISP_BACKGND_D.f - 1e-6f, 1e-11f); cv[0].z = bg_depth; cv[1].z = bg_depth; cv[2].z = bg_depth; @@ -1629,23 +1631,25 @@ void FillBGP(TA_context* ctx) } else { + if (cv[2].x == cv[1].x) { + cv[2].x = cv[0].x; + cv[2].u = cv[0].u; + } const float deltaU = (cv[1].u - cv[0].u) * 0.4f; cv[0].x -= 256.f; cv[0].u -= deltaU; cv[1].x += 256.f; cv[1].u += deltaU; - cv[2].x += 256.f; - cv[2].u += deltaU; + cv[2].x -= 256.f; + cv[2].u -= deltaU; cv[0].x *= scale_x; cv[1].x *= scale_x; cv[2].x *= scale_x; cv[3] = cv[2]; - cv[3].x = cv[0].x; - cv[3].u = cv[0].u; - - std::swap(cv[0], cv[1]); + cv[3].x = cv[1].x; + cv[3].u = cv[1].u; } } @@ -1661,6 +1665,7 @@ static void getRegionTileClipping(u32& xmin, u32& xmax, u32& ymin, u32& ymax) getRegionTileAddrAndSize(addr, tile_size); RegionArrayTile tile; + int maxTiles = 3000; do { tile.full = pvr_read32p(addr); xmin = std::min(xmin, tile.X); @@ -1668,7 +1673,9 @@ static void getRegionTileClipping(u32& xmin, u32& xmax, u32& ymin, u32& ymax) ymin = std::min(ymin, tile.Y); ymax = std::max(ymax, tile.Y); addr += tile_size; - } while (!tile.LastRegion); + } while (!tile.LastRegion && --maxTiles >= 0); + if (maxTiles < 0) + WARN_LOG(PVR, "getRegionTileClipping overflow"); xmin *= 32; xmax *= 32; diff --git a/core/hw/sh4/dyna/blockmanager.cpp b/core/hw/sh4/dyna/blockmanager.cpp index 92f929b80..ea8cce072 100644 --- a/core/hw/sh4/dyna/blockmanager.cpp +++ b/core/hw/sh4/dyna/blockmanager.cpp @@ -40,7 +40,7 @@ static bm_Map blkmap; u32 protected_blocks; u32 unprotected_blocks; -#define FPCA(x) ((DynarecCodeEntryPtr&)sh4rcb.fpcb[(x>>1)&FPCB_MASK]) +#define FPCA(x) ((DynarecCodeEntryPtr&)p_sh4rcb->fpcb[(x>>1)&FPCB_MASK]) // addr must be a physical address // This returns an executable address @@ -65,8 +65,8 @@ DynarecCodeEntryPtr DYNACALL bm_GetCodeByVAddr(u32 addr) #ifdef USE_WINCE_HACK case 0xfffffde7: // GetTickCount // This should make this syscall faster - r[0] = sh4_sched_now64() * 1000 / SH4_MAIN_CLOCK; - next_pc = pr; + Sh4cntx.r[0] = sh4_sched_now64() * 1000 / SH4_MAIN_CLOCK; + Sh4cntx.pc = Sh4cntx.pr; Sh4cntx.cycle_counter -= 100; break; @@ -75,11 +75,11 @@ DynarecCodeEntryPtr DYNACALL bm_GetCodeByVAddr(u32 addr) bool isRam; u64 *ptr; u32 paddr; - if (rdv_writeMemImmediate(r[4], sizeof(u64), (void*&)ptr, isRam, paddr) && isRam) + if (rdv_writeMemImmediate(Sh4cntx.r[4], sizeof(u64), (void*&)ptr, isRam, paddr) && isRam) { *ptr = sh4_sched_now64() >> 4; - r[0] = 1; - next_pc = pr; + Sh4cntx.r[0] = 1; + Sh4cntx.pc = Sh4cntx.pr; Sh4cntx.cycle_counter -= 100; } else @@ -94,7 +94,7 @@ DynarecCodeEntryPtr DYNACALL bm_GetCodeByVAddr(u32 addr) Do_Exception(addr, Sh4Ex_AddressErrorRead); break; } - addr = next_pc; + addr = Sh4cntx.pc; } u32 paddr; @@ -102,7 +102,7 @@ DynarecCodeEntryPtr DYNACALL bm_GetCodeByVAddr(u32 addr) if (rv != MmuError::NONE) { DoMMUException(addr, rv, MMU_TT_IREAD); - mmu_instruction_translation(next_pc, paddr); + mmu_instruction_translation(Sh4cntx.pc, paddr); } return bm_GetCode(paddr); @@ -237,11 +237,12 @@ void bm_Reset() protected_blocks = 0; unprotected_blocks = 0; +#ifndef __SWITCH__ if (addrspace::virtmemEnabled()) { // Windows cannot lock/unlock a region spanning more than one VirtualAlloc or MapViewOfFile // so we have to unlock each region individually - if (settings.platform.ram_size == 16 * 1024 * 1024) + if (settings.platform.ram_size == 16_MB) { virtmem::region_unlock(addrspace::ram_base + 0x0C000000, RAM_SIZE); virtmem::region_unlock(addrspace::ram_base + 0x0D000000, RAM_SIZE); @@ -255,6 +256,7 @@ void bm_Reset() } } else +#endif { virtmem::region_unlock(&mem_b[0], RAM_SIZE); } @@ -280,7 +282,7 @@ void bm_UnlockPage(u32 addr, u32 size) void bm_ResetCache() { - ngen_ResetBlocks(); + sh4Dynarec->reset(); addrspace::bm_reset(); for (const auto& it : blkmap) @@ -360,9 +362,8 @@ void bm_WriteBlockMap(const std::string& file) if (f) { INFO_LOG(DYNAREC, "Writing block map !"); - for (auto& it : blkmap) + for (const auto& [_, block] : blkmap) { - RuntimeBlockInfoPtr& block = it.second; fprintf(f, "block: %d:%08X:%p:%d:%d:%d\n", block->BlockType, block->addr, block->code, block->host_code_size, block->guest_cycles, block->guest_opcodes); for(size_t j = 0; j < block->oplist.size(); j++) fprintf(f,"\top: %zd:%d:%s\n", j, block->oplist[j].guest_offs, block->oplist[j].dissasm().c_str()); @@ -374,119 +375,12 @@ void bm_WriteBlockMap(const std::string& file) void sh4_jitsym(FILE* out) { - for (const auto& it : blkmap) + for (const auto& [_, block] : blkmap) { - const RuntimeBlockInfoPtr& block = it.second; fprintf(out, "%p %d %08X\n", block->code, block->host_code_size, block->addr); } } -#if 0 -u32 GetLookup(RuntimeBlockInfo* elem) -{ - return elem->lookups; -} - -bool UDgreater ( RuntimeBlockInfo* elem1, RuntimeBlockInfo* elem2 ) -{ - return elem1->runs > elem2->runs; -} - -bool UDgreater2 ( RuntimeBlockInfo* elem1, RuntimeBlockInfo* elem2 ) -{ - return elem1->runs*elem1->host_opcodes > elem2->runs*elem2->host_opcodes; -} - -bool UDgreater3 ( RuntimeBlockInfo* elem1, RuntimeBlockInfo* elem2 ) -{ - return elem1->runs*elem1->host_opcodes/elem1->guest_cycles > elem2->runs*elem2->host_opcodes/elem2->guest_cycles; -} - -void bm_PrintTopBlocks() -{ - double total_lups=0; - double total_runs=0; - double total_cycles=0; - double total_hops=0; - double total_sops=0; - - for (size_t i=0;iruns*all_blocks[i]->guest_cycles; - total_hops+=all_blocks[i]->runs*all_blocks[i]->host_opcodes; - total_sops+=all_blocks[i]->runs*all_blocks[i]->guest_opcodes; - total_runs+=all_blocks[i]->runs; - } - - INFO_LOG(DYNAREC, "Total lookups: %.0fKRuns, %.0fKLuops, Total cycles: %.0fMhz, Total Hops: %.0fMips, Total Sops: %.0fMips!",total_runs/1000,total_lups/1000,total_cycles/1000/1000,total_hops/1000/1000,total_sops/1000/1000); - total_hops/=100; - total_cycles/=100; - total_runs/=100; - - double sel_hops=0; - for (size_t i=0;i<(all_blocks.size()/100);i++) - { - INFO_LOG(DYNAREC, "Block %08X: %p, r: %d (c: %d, s: %d, h: %d) (r: %.2f%%, c: %.2f%%, h: %.2f%%)", - all_blocks[i]->addr, all_blocks[i]->code,all_blocks[i]->runs, - all_blocks[i]->guest_cycles,all_blocks[i]->guest_opcodes,all_blocks[i]->host_opcodes, - - all_blocks[i]->runs/total_runs, - all_blocks[i]->guest_cycles*all_blocks[i]->runs/total_cycles, - all_blocks[i]->host_opcodes*all_blocks[i]->runs/total_hops); - - sel_hops+=all_blocks[i]->host_opcodes*all_blocks[i]->runs; - } - - INFO_LOG(DYNAREC, " >-< %.2f%% covered in top 1%% blocks",sel_hops/total_hops); - - size_t i; - for (i=all_blocks.size()/100;sel_hops/total_hops<50;i++) - { - INFO_LOG(DYNAREC, "Block %08X: %p, r: %d (c: %d, s: %d, h: %d) (r: %.2f%%, c: %.2f%%, h: %.2f%%)", - all_blocks[i]->addr, all_blocks[i]->code,all_blocks[i]->runs, - all_blocks[i]->guest_cycles,all_blocks[i]->guest_opcodes,all_blocks[i]->host_opcodes, - - all_blocks[i]->runs/total_runs, - all_blocks[i]->guest_cycles*all_blocks[i]->runs/total_cycles, - all_blocks[i]->host_opcodes*all_blocks[i]->runs/total_hops); - - sel_hops+=all_blocks[i]->host_opcodes*all_blocks[i]->runs; - } - - INFO_LOG(DYNAREC, " >-< %.2f%% covered in top %.2f%% blocks",sel_hops/total_hops,i*100.0/all_blocks.size()); - -} - -void bm_Sort() -{ - INFO_LOG(DYNAREC, "!!!!!!!!!!!!!!!!!!! BLK REPORT !!!!!!!!!!!!!!!!!!!!"); - - INFO_LOG(DYNAREC, " ---- Blocks: Sorted based on Runs ! ---- "); - std::sort(all_blocks.begin(),all_blocks.end(),UDgreater); - bm_PrintTopBlocks(); - - INFO_LOG(DYNAREC, "<><><><><><><><><><><><><><><><><><><><><><><><><>"); - - INFO_LOG(DYNAREC, " ---- Blocks: Sorted based on hops ! ---- "); - std::sort(all_blocks.begin(),all_blocks.end(),UDgreater2); - bm_PrintTopBlocks(); - - INFO_LOG(DYNAREC, "<><><><><><><><><><><><><><><><><><><><><><><><><>"); - - INFO_LOG(DYNAREC, " ---- Blocks: Sorted based on wefs ! ---- "); - std::sort(all_blocks.begin(),all_blocks.end(),UDgreater3); - bm_PrintTopBlocks(); - - INFO_LOG(DYNAREC, "^^^^^^^^^^^^^^^^^^^ END REPORT ^^^^^^^^^^^^^^^^^^^"); - - for (size_t i=0;iruns=0; - } -} -#endif - RuntimeBlockInfo::~RuntimeBlockInfo() { if (sh4_code_size != 0) @@ -537,10 +431,6 @@ void RuntimeBlockInfo::Discard() void RuntimeBlockInfo::SetProtectedFlags() { -#ifdef TARGET_NO_EXCEPTIONS - this->read_only = false; - return; -#endif // Don't write protect rom and BIOS/IP.BIN (Grandia II) if (!IsOnRam(addr) || (addr & 0x1FFF0000) == 0x0c000000) { @@ -582,7 +472,7 @@ void bm_RamWriteAccess(u32 addr) std::vector list_copy; list_copy.insert(list_copy.begin(), block_list.begin(), block_list.end()); if (!list_copy.empty()) - DEBUG_LOG(DYNAREC, "bm_RamWriteAccess write access to %08x pc %08x", addr, next_pc); + DEBUG_LOG(DYNAREC, "bm_RamWriteAccess write access to %08x pc %08x", addr, Sh4cntx.pc); for (auto& block : list_copy) bm_DiscardBlock(block); verify(block_list.empty()); @@ -591,6 +481,7 @@ void bm_RamWriteAccess(u32 addr) u32 bm_getRamOffset(void *p) { +#ifndef __SWITCH__ if (addrspace::virtmemEnabled()) { if ((u8 *)p < addrspace::ram_base || (u8 *)p >= addrspace::ram_base + 0x20000000) @@ -601,6 +492,7 @@ u32 bm_getRamOffset(void *p) return addr & RAM_MASK; } else +#endif { if ((u8 *)p < &mem_b[0] || (u8 *)p >= &mem_b[RAM_SIZE]) return -1; @@ -654,16 +546,14 @@ void print_blocks() INFO_LOG(DYNAREC, "Writing blocks to %p", f); } - for (auto it : blkmap) + for (const auto& [_, blk] : blkmap) { - RuntimeBlockInfoPtr blk = it.second; if (f) { fprintf(f,"block: %p\n",blk.get()); fprintf(f,"vaddr: %08X\n",blk->vaddr); fprintf(f,"paddr: %08X\n",blk->addr); fprintf(f,"code: %p\n",blk->code); - fprintf(f,"runs: %d\n",blk->runs); fprintf(f,"BlockType: %d\n",blk->BlockType); fprintf(f,"NextBlock: %08X\n",blk->NextBlock); fprintf(f,"BranchBlock: %08X\n",blk->BranchBlock); @@ -708,8 +598,6 @@ void print_blocks() fprintf(f,"}\n"); } - - blk->runs=0; } if (f) fclose(f); diff --git a/core/hw/sh4/dyna/blockmanager.h b/core/hw/sh4/dyna/blockmanager.h index 6e506ae5d..fd6445f25 100644 --- a/core/hw/sh4/dyna/blockmanager.h +++ b/core/hw/sh4/dyna/blockmanager.h @@ -2,6 +2,7 @@ #include "types.h" #include "decoder.h" +#include "shil.h" #include "stdclass.h" #include @@ -15,23 +16,19 @@ struct RuntimeBlockInfo bool Setup(u32 pc,fpscr_t fpu_cfg); u32 addr; - DynarecCodeEntryPtr code; - u32 lookups; u32 vaddr; + DynarecCodeEntryPtr code; u32 host_code_size; //in bytes u32 sh4_code_size; //in bytes - u32 runs; - s32 staging_runs; - fpscr_t fpu_cfg; u32 guest_cycles; u32 guest_opcodes; u32 host_opcodes; // set by host code generator, optional bool has_fpu_op; - u32 blockcheck_failures; bool temp_block; + u32 blockcheck_failures; u32 BranchBlock; //if not 0xFFFFFFFF then jump target u32 NextBlock; //if not 0xFFFFFFFF then next block (by position) @@ -45,8 +42,11 @@ struct RuntimeBlockInfo BlockEndType BlockType; bool has_jcond; + bool read_only; std::vector oplist; + //predecessors references + std::vector pre_refs; bool containsCode(const void *ptr) { @@ -55,18 +55,15 @@ struct RuntimeBlockInfo virtual ~RuntimeBlockInfo(); - virtual u32 Relink()=0; + virtual u32 Relink() { + return 0; + } - //predecessors references - std::vector pre_refs; - void AddRef(const RuntimeBlockInfoPtr& other); void RemRef(const RuntimeBlockInfoPtr& other); void Discard(); void SetProtectedFlags(); - - bool read_only; }; void bm_WriteBlockMap(const std::string& file); @@ -87,15 +84,31 @@ void bm_Init(); void bm_Term(); void bm_vmem_pagefill(void** ptr,u32 size_bytes); -bool bm_RamWriteAccess(void *p); -void bm_RamWriteAccess(u32 addr); static inline bool bm_IsRamPageProtected(u32 addr) { extern bool unprotected_pages[RAM_SIZE_MAX/PAGE_SIZE]; addr &= RAM_MASK; return !unprotected_pages[addr / PAGE_SIZE]; } + +#if FEAT_SHREC != DYNAREC_NONE + +bool bm_RamWriteAccess(void *p); +void bm_RamWriteAccess(u32 addr); void bm_LockPage(u32 addr, u32 size = PAGE_SIZE); void bm_UnlockPage(u32 addr, u32 size = PAGE_SIZE); u32 bm_getRamOffset(void *p); +#else + +inline static bool bm_RamWriteAccess(void *p) { + return false; +} +inline static void bm_RamWriteAccess(u32 addr) {} +inline static void bm_LockPage(u32 addr, u32 size = PAGE_SIZE) {} +inline static void bm_UnlockPage(u32 addr, u32 size = PAGE_SIZE) {} +inline static u32 bm_getRamOffset(void *p) { + return 0; +} + +#endif diff --git a/core/hw/sh4/dyna/decoder.cpp b/core/hw/sh4/dyna/decoder.cpp index 4977b92f5..cc4129ca7 100644 --- a/core/hw/sh4/dyna/decoder.cpp +++ b/core/hw/sh4/dyna/decoder.cpp @@ -95,9 +95,6 @@ static void dec_End(u32 dst, BlockEndType flags, bool delaySlot) verify(state.JumpAddr != NullAddress); } -#define SR_STATUS_MASK STATUS_MASK -#define SR_T_MASK 1 - static u32 dec_jump_simm8(u32 op) { return state.cpu.rpc + GetSImm8(op)*2 + 4; @@ -114,8 +111,8 @@ static u32 dec_set_pr() } static void dec_write_sr(shil_param src) { - Emit(shop_and,mk_reg(reg_sr_status),src,mk_imm(SR_STATUS_MASK)); - Emit(shop_and,mk_reg(reg_sr_T),src,mk_imm(SR_T_MASK)); + Emit(shop_and, mk_reg(reg_sr_status), src, mk_imm(sr_t::MASK)); + Emit(shop_and, mk_reg(reg_sr_T), src, mk_imm(1)); } //bf sh4dec(i1000_1011_iiii_iiii) @@ -508,6 +505,8 @@ static void dec_param(DecParam p,shil_param& r1,shil_param& r2, u32 op) u32 shft=p-PRM_RN_D4_x1; r1=mk_regi(reg_r0+GetN(op)); r2=mk_imm(GetImm4(op)<guest_opcodes++; dec_updateBlockCycles(blk, op); - if (OpDesc[op]->IsFloatingPoint()) + if (!blk->has_fpu_op && OpDesc[op]->IsFloatingPoint()) { - if (sr.FD == 1) + if (Sh4cntx.sr.FD == 1) { // We need to know FPSCR to compile the block, so let the exception handler run first // as it may change the fp registers - Do_Exception(next_pc, Sh4Ex_FpuDisabled); + Do_Exception(Sh4cntx.pc, Sh4Ex_FpuDisabled); return false; } blk->has_fpu_op = true; diff --git a/core/hw/sh4/dyna/decoder.h b/core/hw/sh4/dyna/decoder.h index 3deafea55..7c8324404 100644 --- a/core/hw/sh4/dyna/decoder.h +++ b/core/hw/sh4/dyna/decoder.h @@ -1,5 +1,4 @@ #pragma once -#include "shil.h" #include "../sh4_if.h" #define mkbet(c,s,v) ((c<<3)|(s<<1)|v) diff --git a/core/hw/sh4/dyna/decoder_opcodes.h b/core/hw/sh4/dyna/decoder_opcodes.h index 6eee9fed6..b44c34fc6 100644 --- a/core/hw/sh4/dyna/decoder_opcodes.h +++ b/core/hw/sh4/dyna/decoder_opcodes.h @@ -1,8 +1,10 @@ #pragma once #if FEAT_SHREC != DYNAREC_NONE #define sh4dec(str) void dec_##str (u32 op) +void dec_illegalOp(u32 op); #else #define sh4dec(str) static void dec_##str (u32 op) { } +inline static void dec_illegalOp(u32 op) {} #endif sh4dec(i1000_1011_iiii_iiii); @@ -33,5 +35,3 @@ sh4dec(i0100_nnnn_0110_1010); sh4dec(i0100_nnnn_0110_0110); sh4dec(i0100_nnnn_0001_1011); sh4dec(i0100_nnnn_0000_0011); - -void dec_illegalOp(u32 op); diff --git a/core/hw/sh4/dyna/driver.cpp b/core/hw/sh4/dyna/driver.cpp index 428423246..78009e77b 100644 --- a/core/hw/sh4/dyna/driver.cpp +++ b/core/hw/sh4/dyna/driver.cpp @@ -8,8 +8,6 @@ #include "hw/sh4/sh4_mem.h" #include "hw/sh4/modules/mmu.h" -#include - #include "blockmanager.h" #include "ngen.h" #include "decoder.h" @@ -17,10 +15,14 @@ #if FEAT_SHREC != DYNAREC_NONE +constexpr u32 CODE_SIZE = 10_MB; +constexpr u32 TEMP_CODE_SIZE = 1_MB; +constexpr u32 FULL_SIZE = CODE_SIZE + TEMP_CODE_SIZE; + #if defined(_WIN32) || FEAT_SHREC != DYNAREC_JIT || defined(TARGET_IPHONE) || defined(TARGET_ARM_MAC) static u8 *SH4_TCB; #else -alignas(4096) static u8 SH4_TCB[CODE_SIZE + TEMP_CODE_SIZE] +alignas(4096) static u8 SH4_TCB[FULL_SIZE] #if defined(__OpenBSD__) __attribute__((section(".openbsd.mutable"))); #elif defined(__unix__) || defined(__SWITCH__) @@ -32,72 +34,90 @@ alignas(4096) static u8 SH4_TCB[CODE_SIZE + TEMP_CODE_SIZE] #endif #endif -u8* CodeCache; +static u8* CodeCache; static u8* TempCodeCache; ptrdiff_t cc_rx_offset; -static u32 LastAddr; -static u32 TempLastAddr; -static u32 *emit_ptr; -static u32 *emit_ptr_limit; - static std::unordered_set smc_hotspots; -static sh4_if sh4Interp; +static Sh4CodeBuffer codeBuffer; +Sh4Dynarec *sh4Dynarec; +Sh4Recompiler *Sh4Recompiler::Instance; -void* emit_GetCCPtr() { return emit_ptr==0?(void*)&CodeCache[LastAddr]:(void*)emit_ptr; } - -static void clear_temp_cache(bool full) +void *Sh4CodeBuffer::get() { - //printf("recSh4:Temp Code Cache clear at %08X\n", curr_pc); - TempLastAddr = 0; - bm_ResetTempCache(full); + return tempBuffer ? &TempCodeCache[tempLastAddr] : &CodeCache[lastAddr]; } -static void recSh4_ClearCache() +void Sh4CodeBuffer::advance(u32 size) { - INFO_LOG(DYNAREC, "recSh4:Dynarec Cache clear at %08X free space %d", next_pc, emit_FreeSpace()); - LastAddr = 0; - bm_ResetCache(); - smc_hotspots.clear(); - clear_temp_cache(true); + if (tempBuffer) + tempLastAddr += size; + else + lastAddr += size; } -static void recSh4_Run() +u32 Sh4CodeBuffer::getFreeSpace() { - sh4_int_bCpuRun = true; - RestoreHostRoundingMode(); + if (tempBuffer) + return TEMP_CODE_SIZE - tempLastAddr; + else + return CODE_SIZE - lastAddr; +} - u8 *sh4_dyna_rcb = (u8 *)&Sh4cntx + sizeof(Sh4cntx); - INFO_LOG(DYNAREC, "cntx // fpcb offset: %td // pc offset: %td // pc %08X", (u8*)&sh4rcb.fpcb - sh4_dyna_rcb, (u8*)&sh4rcb.cntx.pc - sh4_dyna_rcb, sh4rcb.cntx.pc); - - ngen_mainloop(sh4_dyna_rcb); +void *Sh4CodeBuffer::getBase() +{ + return CodeCache; +} - sh4_int_bCpuRun = false; +u32 Sh4CodeBuffer::getSize() +{ + return FULL_SIZE; } -void emit_Skip(u32 sz) +void Sh4CodeBuffer::reset(bool temporary) { - if (emit_ptr) - emit_ptr = (u32*)((u8*)emit_ptr + sz); + if (temporary) + tempLastAddr = 0; else - LastAddr += sz; + lastAddr = 0; +} +void Sh4Recompiler::clear_temp_cache(bool full) +{ + //printf("recSh4:Temp Code Cache clear at %08X\n", curr_pc); + codeBuffer.reset(true); + bm_ResetTempCache(full); } -u32 emit_FreeSpace() + +void Sh4Recompiler::ResetCache() { - if (emit_ptr) - return (emit_ptr_limit - emit_ptr) * sizeof(u32); - else - return CODE_SIZE - LastAddr; + INFO_LOG(DYNAREC, "recSh4:Dynarec Cache clear at %08X free space %d", getContext()->pc, codeBuffer.getFreeSpace()); + codeBuffer.reset(false); + bm_ResetCache(); + smc_hotspots.clear(); + clear_temp_cache(true); +} + +void Sh4Recompiler::Run() +{ + getContext()->restoreHostRoundingMode(); + + u8 *sh4_dyna_rcb = (u8 *)getContext() + sizeof(Sh4Context); + INFO_LOG(DYNAREC, "cntx // fpcb offset: %td // pc offset: %td // pc %08X", (u8*)p_sh4rcb->fpcb - sh4_dyna_rcb, + (u8*)&getContext()->pc - sh4_dyna_rcb, getContext()->pc); + + sh4Dynarec->mainloop(sh4_dyna_rcb); + + getContext()->CpuRunning = false; } void AnalyseBlock(RuntimeBlockInfo* blk); bool RuntimeBlockInfo::Setup(u32 rpc,fpscr_t rfpu_cfg) { - staging_runs=addr=lookups=runs=host_code_size=0; - guest_cycles=guest_opcodes=host_opcodes=0; + addr = host_code_size = 0; + guest_cycles = guest_opcodes = host_opcodes = 0; sh4_code_size = 0; pBranchBlock=pNextBlock=0; code=0; @@ -149,59 +169,52 @@ bool RuntimeBlockInfo::Setup(u32 rpc,fpscr_t rfpu_cfg) DynarecCodeEntryPtr rdv_CompilePC(u32 blockcheck_failures) { - u32 pc=next_pc; + const u32 pc = Sh4cntx.pc; - if (emit_FreeSpace()<16*1024 || pc==0x8c0000e0 || pc==0xac010000 || pc==0xac008300) - recSh4_ClearCache(); + if (codeBuffer.getFreeSpace() < 32_KB || pc == 0x8c0000e0 || pc == 0xac010000 || pc == 0xac008300) + Sh4Recompiler::Instance->ResetCache(); - RuntimeBlockInfo* rbi = ngen_AllocateBlock(); + RuntimeBlockInfo* rbi = sh4Dynarec->allocateBlock(); - if (!rbi->Setup(pc,fpscr)) + if (!rbi->Setup(pc, Sh4cntx.fpscr)) { delete rbi; - return NULL; + return nullptr; } rbi->blockcheck_failures = blockcheck_failures; if (smc_hotspots.find(rbi->addr) != smc_hotspots.end()) { - if (TEMP_CODE_SIZE - TempLastAddr < 16 * 1024) - clear_temp_cache(false); - emit_ptr = (u32 *)(TempCodeCache + TempLastAddr); - emit_ptr_limit = (u32 *)(TempCodeCache + TEMP_CODE_SIZE); + codeBuffer.useTempBuffer(true); + if (codeBuffer.getFreeSpace() < 32_KB) + Sh4Recompiler::Instance->clear_temp_cache(false); rbi->temp_block = true; if (rbi->read_only) INFO_LOG(DYNAREC, "WARNING: temp block %x (%x) is protected!", rbi->vaddr, rbi->addr); } bool do_opts = !rbi->temp_block; - rbi->staging_runs=do_opts?100:-100; bool block_check = !rbi->read_only; - ngen_Compile(rbi, block_check, (pc & 0xFFFFFF) == 0x08300 || (pc & 0xFFFFFF) == 0x10000, false, do_opts); - verify(rbi->code!=0); + sh4Dynarec->compile(rbi, block_check, do_opts); + verify(rbi->code != nullptr); bm_AddBlock(rbi); - if (emit_ptr != NULL) - { - TempLastAddr = (u8*)emit_ptr - TempCodeCache; - emit_ptr = NULL; - emit_ptr_limit = NULL; - } + codeBuffer.useTempBuffer(false); return rbi->code; } DynarecCodeEntryPtr DYNACALL rdv_FailedToFindBlock_pc() { - return rdv_FailedToFindBlock(next_pc); + return rdv_FailedToFindBlock(Sh4cntx.pc); } DynarecCodeEntryPtr DYNACALL rdv_FailedToFindBlock(u32 pc) { //DEBUG_LOG(DYNAREC, "rdv_FailedToFindBlock %08x", pc); - next_pc=pc; + Sh4cntx.pc=pc; DynarecCodeEntryPtr code = rdv_CompilePC(0); if (code == NULL) - code = bm_GetCodeByVAddr(next_pc); + code = bm_GetCodeByVAddr(Sh4cntx.pc); else code = (DynarecCodeEntryPtr)CC_RW2RX(code); return code; @@ -235,15 +248,15 @@ DynarecCodeEntryPtr DYNACALL rdv_BlockCheckFail(u32 addr) } else { - next_pc = addr; - recSh4_ClearCache(); + Sh4cntx.pc = addr; + Sh4Recompiler::Instance->ResetCache(); } return (DynarecCodeEntryPtr)CC_RW2RX(rdv_CompilePC(blockcheck_failures)); } DynarecCodeEntryPtr rdv_FindOrCompile() { - DynarecCodeEntryPtr rv = bm_GetCodeByVAddr(next_pc); // Returns exec addr + DynarecCodeEntryPtr rv = bm_GetCodeByVAddr(Sh4cntx.pc); // Returns exec addr if (rv == ngen_FailedToFindBlock) rv = (DynarecCodeEntryPtr)CC_RW2RX(rdv_CompilePC(0)); // Returns rw addr @@ -269,20 +282,20 @@ void* DYNACALL rdv_LinkBlock(u8* code,u32 dpc) if (bcls == BET_CLS_Static) { if (rbi->BlockType == BET_StaticIntr) - next_pc = rbi->NextBlock; + Sh4cntx.pc = rbi->NextBlock; else - next_pc = rbi->BranchBlock; + Sh4cntx.pc = rbi->BranchBlock; } else if (bcls == BET_CLS_Dynamic) { - next_pc = dpc; + Sh4cntx.pc = dpc; } else if (bcls == BET_CLS_COND) { if (dpc) - next_pc = rbi->BranchBlock; + Sh4cntx.pc = rbi->BranchBlock; else - next_pc = rbi->NextBlock; + Sh4cntx.pc = rbi->NextBlock; } DynarecCodeEntryPtr rv = rdv_FindOrCompile(); // Returns rx ptr @@ -301,17 +314,17 @@ void* DYNACALL rdv_LinkBlock(u8* code,u32 dpc) } else if (rbi->relink_data == 0) { - rbi->pBranchBlock = bm_GetBlock(next_pc).get(); + rbi->pBranchBlock = bm_GetBlock(Sh4cntx.pc).get(); rbi->pBranchBlock->AddRef(rbi); } } else { - RuntimeBlockInfo* nxt = bm_GetBlock(next_pc).get(); + RuntimeBlockInfo* nxt = bm_GetBlock(Sh4cntx.pc).get(); - if (rbi->BranchBlock == next_pc) + if (rbi->BranchBlock == Sh4cntx.pc) rbi->pBranchBlock = nxt; - if (rbi->NextBlock == next_pc) + if (rbi->NextBlock == Sh4cntx.pc) rbi->pNextBlock = nxt; nxt->AddRef(rbi); @@ -322,86 +335,64 @@ void* DYNACALL rdv_LinkBlock(u8* code,u32 dpc) } else { - INFO_LOG(DYNAREC, "null RBI: from %08X to %08X -- unlinked stale block -- code %p next %p", rbi->vaddr, next_pc, code, rv); + INFO_LOG(DYNAREC, "null RBI: from %08X to %08X -- unlinked stale block -- code %p next %p", rbi->vaddr, Sh4cntx.pc, code, rv); } return (void*)rv; } -static void recSh4_Stop() -{ - sh4Interp.Stop(); -} - -static void recSh4_Step() -{ - sh4Interp.Step(); -} -static void recSh4_Reset(bool hard) +void Sh4Recompiler::Reset(bool hard) { - sh4Interp.Reset(hard); - recSh4_ClearCache(); + super::Reset(hard); + ResetCache(); if (hard) bm_Reset(); } -static void recSh4_Init() +void Sh4Recompiler::Init() { - INFO_LOG(DYNAREC, "recSh4 Init"); - Get_Sh4Interpreter(&sh4Interp); - sh4Interp.Init(); + INFO_LOG(DYNAREC, "Sh4Recompiler::Init"); + super::Init(); bm_Init(); if (addrspace::virtmemEnabled()) - verify(&mem_b[0] == ((u8*)p_sh4rcb->sq_buffer + 512 + 0x0C000000)); + verify(&mem_b[0] == ((u8*)getContext()->sq_buffer + sizeof(Sh4Context) + 0x0C000000)); // Call the platform-specific magic to make the pages RWX CodeCache = nullptr; #ifdef FEAT_NO_RWX_PAGES - bool rc = virtmem::prepare_jit_block(SH4_TCB, CODE_SIZE + TEMP_CODE_SIZE, (void**)&CodeCache, &cc_rx_offset); + bool rc = virtmem::prepare_jit_block(SH4_TCB, FULL_SIZE, (void**)&CodeCache, &cc_rx_offset); #else - bool rc = virtmem::prepare_jit_block(SH4_TCB, CODE_SIZE + TEMP_CODE_SIZE, (void**)&CodeCache); + bool rc = virtmem::prepare_jit_block(SH4_TCB, FULL_SIZE, (void**)&CodeCache); #endif verify(rc); // Ensure the pointer returned is non-null verify(CodeCache != nullptr); TempCodeCache = CodeCache + CODE_SIZE; - ngen_init(); + sh4Dynarec->init(*getContext(), codeBuffer); bm_ResetCache(); } -static void recSh4_Term() +void Sh4Recompiler::Term() { - INFO_LOG(DYNAREC, "recSh4 Term"); + INFO_LOG(DYNAREC, "Sh4Recompiler::Term"); #ifdef FEAT_NO_RWX_PAGES if (CodeCache != nullptr) - virtmem::release_jit_block(CodeCache, (u8 *)CodeCache + cc_rx_offset, CODE_SIZE + TEMP_CODE_SIZE); + virtmem::release_jit_block(CodeCache, (u8 *)CodeCache + cc_rx_offset, FULL_SIZE); #else if (CodeCache != nullptr && CodeCache != SH4_TCB) - virtmem::release_jit_block(CodeCache, CODE_SIZE + TEMP_CODE_SIZE); + virtmem::release_jit_block(CodeCache, FULL_SIZE); #endif CodeCache = nullptr; TempCodeCache = nullptr; bm_Term(); - sh4Interp.Term(); + super::Term(); } -static bool recSh4_IsCpuRunning() +Sh4Executor *Get_Sh4Recompiler() { - return sh4Interp.IsCpuRunning(); -} - -void Get_Sh4Recompiler(sh4_if* cpu) -{ - cpu->Run = recSh4_Run; - cpu->Stop = recSh4_Stop; - cpu->Step = recSh4_Step; - cpu->Reset = recSh4_Reset; - cpu->Init = recSh4_Init; - cpu->Term = recSh4_Term; - cpu->IsCpuRunning = recSh4_IsCpuRunning; - cpu->ResetCache = recSh4_ClearCache; + return new Sh4Recompiler(); } static bool translateAddress(u32 addr, int size, u32 access, u32& outAddr, RuntimeBlockInfo* block) @@ -451,4 +442,8 @@ bool rdv_writeMemImmediate(u32 addr, int size, void*& ptr, bool& isRam, u32& phy return true; } +void rdv_SetFailedToFindBlockHandler(void (*handler)()) +{ + ngen_FailedToFindBlock = handler; +} #endif // FEAT_SHREC != DYNAREC_NONE diff --git a/core/hw/sh4/dyna/ngen.h b/core/hw/sh4/dyna/ngen.h index aa0c99150..852f8d15e 100644 --- a/core/hw/sh4/dyna/ngen.h +++ b/core/hw/sh4/dyna/ngen.h @@ -1,51 +1,9 @@ -/* - Header file for native generator interface - Needs some cleanup - - - SH4 -> Code gen -> Ram - - Ram -> link/relocate -> Staging buffer - Ram -> link/relocate -> Steady-state buffer - - Staging : scratch, relatively small, circular code buffer - Steady state : 'final' code buffer. When blocks reach a steady-state, they get copied here - - When the Staging buffer is full, a reset is done on the dynarec. - If the stating buffer is full, but re-locating everything will free enough space, it will be relocated (GC'd) - - If the stating buffer is full, then blocks in it are put into "hibernation" - - Block can be - in Ram, only ('hibernated') - in Ram + steady state buffer - in Ram + staging buffer - - Changes required on the ngen/dynarecs for this to work - - - Support relocation - - Support re-linking - - Support hibernated blocks, or block removal - - Changes on BM - - - Block graph - - Block removal - - Relocation driving logic - - - This will enable - - - Extensive block specialisation (Further mem opts, other things that might gain) - - Possibility of superblock chains -*/ +// Header file for native generator interface #pragma once #include "blockmanager.h" #include "oslib/host_context.h" - -#define CODE_SIZE (10*1024*1024) -#define TEMP_CODE_SIZE (1024*1024) +#include "../sh4_interpreter.h" // When NO_RWX is enabled there's two address-spaces, one executable and // one writtable. The emitter and most of the code in rec-* will work with @@ -61,12 +19,6 @@ #define CC_RX2RW(ptr) (ptr) #endif -extern u8* CodeCache; - -void emit_Skip(u32 sz); -u32 emit_FreeSpace(); -void* emit_GetCCPtr(); - //Called from ngen_FailedToFindBlock DynarecCodeEntryPtr DYNACALL rdv_FailedToFindBlock(u32 pc); DynarecCodeEntryPtr DYNACALL rdv_FailedToFindBlock_pc(); @@ -76,48 +28,120 @@ DynarecCodeEntryPtr DYNACALL rdv_BlockCheckFail(u32 addr); DynarecCodeEntryPtr rdv_CompilePC(u32 blockcheck_failures); //Finds or compiles code @pc DynarecCodeEntryPtr rdv_FindOrCompile(); +// Registers a custom FailedToFindBlock handler function +void rdv_SetFailedToFindBlockHandler(void (*handler)()); //code -> pointer to code of block, dpc -> if dynamic block, pc. if cond, 0 for next, 1 for branch void* DYNACALL rdv_LinkBlock(u8* code,u32 dpc); -//Stuff to be implemented per dynarec core - -void ngen_init(); - -//Called to compile a block -void ngen_Compile(RuntimeBlockInfo* block, bool smc_checks, bool reset, bool staging, bool optimise); - -//Called when blocks are reset -void ngen_ResetBlocks(); //Value to be returned when the block manager failed to find a block, //should call rdv_FailedToFindBlock and then jump to the return value +// Set with rdv_SetFailedToFindBlockHandler(). Internal use only. extern void (*ngen_FailedToFindBlock)(); -// The dynarec mainloop -// cntx points right after the Sh4RCB struct, -// which corresponds to the start of the 512 MB or 4 GB virtual address space if enabled. -void ngen_mainloop(void* cntx); - -void ngen_HandleException(host_context_t &context); -bool ngen_Rewrite(host_context_t &context, void *faultAddress); //Canonical callback interface enum CanonicalParamType { - CPT_u32, - CPT_u32rv, - CPT_u64rvL, - CPT_u64rvH, - CPT_f32, - CPT_f32rv, - CPT_ptr, + CPT_u32, // u32 param + CPT_u32rv, // u32 return value + CPT_u64rvL, // u64 return value lsb + CPT_u64rvH, // u64 return value msb + CPT_f32, // f32 param + CPT_f32rv, // f32 return value + CPT_ptr, // register pointer + CPT_sh4ctx, // Sh4Context pointer }; -void ngen_CC_Start(shil_opcode* op); -void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp); -void ngen_CC_Call(shil_opcode* op,void* function); -void ngen_CC_Finish(shil_opcode* op); - -RuntimeBlockInfo* ngen_AllocateBlock(); - bool rdv_readMemImmediate(u32 addr, int size, void*& ptr, bool& isRam, u32& physAddr, RuntimeBlockInfo* block = nullptr); bool rdv_writeMemImmediate(u32 addr, int size, void*& ptr, bool& isRam, u32& physAddr, RuntimeBlockInfo* block = nullptr); + +class Sh4CodeBuffer +{ +public: + // Return the current position of the code buffer, where new code should be emitted. + void *get(); + // Advance the buffer position by 'size' bytes. + void advance(u32 size); + // Return the available free space in bytes. + u32 getFreeSpace(); + // Return a pointer to the beginning of the code buffer. + void *getBase(); + // Return the full size of the code buffer. + // Note that the code buffer may be partitioned (long term blocks, short term blocks) so the full size + // might be greater than what getFreeSpace() returns when the buffer is empty. + u32 getSize(); + + // Select the long term or temporary buffer (internal use) + void useTempBuffer(bool enable) { tempBuffer = enable; } + // Reset main or temp code buffer position to 0 (internal use) + void reset(bool temporary); + +private: + u32 lastAddr = 0; + u32 tempLastAddr = 0; + bool tempBuffer = false; +}; + +class Sh4Dynarec +{ +public: + // Initialize the dynarec, which should keep a reference to the passed code buffer to generate code later. + virtual void init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) = 0; + // Compile the given block. + // If smc_checks is true, add self-modifying code detection. + // If optimize is true, use fast memory accesses if possible, that will be rewritten if they fail. + virtual void compile(RuntimeBlockInfo* block, bool smc_checks, bool optimise) = 0; + // Signal the dynarec that the code buffer has been cleared. It should re-generate its main loop if needed. + virtual void reset() {} + // Run the code. + // cntx points right after the Sh4RCB struct, which corresponds to the start of the 512 MB virtual address space + // (if available). + virtual void mainloop(void* cntx) = 0; + // An SH4 exception has occurred. The dynarec should abort execution of the current block and longjmp to its main loop + // to execute the exception handler. + virtual void handleException(host_context_t& context) = 0; + // Rewrite the memory access at host PC address 'faultAddress'. This fast memory access failed and should be rewritten + // to use mem access handlers. + virtual bool rewrite(host_context_t& context, void *faultAddress) = 0; + // Allocate a new block information structure. + virtual RuntimeBlockInfo *allocateBlock() { + return new RuntimeBlockInfo(); + } + + // Dynarec canonical implementation callback methods. + // Used to call default implementation of shil ops that the dynarec doesn't implement. + // Start call + virtual void canonStart(const shil_opcode *op) = 0; + // Pass input parameter or retrieve return parameter + virtual void canonParam(const shil_opcode *op, const shil_param *param, CanonicalParamType paramType) = 0; + // Call the implementation + virtual void canonCall(const shil_opcode *op, void *function) = 0; + // Finish call + virtual void canonFinish(const shil_opcode *op) = 0; + + virtual ~Sh4Dynarec() = default; +}; + +extern Sh4Dynarec *sh4Dynarec; + +class Sh4Recompiler : public Sh4Interpreter +{ + using super = Sh4Interpreter; + +public: + Sh4Recompiler() { + Instance = this; + } + ~Sh4Recompiler() { + Instance = nullptr; + } + void Run() override; + void ResetCache() override; + void Reset(bool hard) override; + void Init() override; + void Term() override; + + void clear_temp_cache(bool full); + + static Sh4Recompiler *Instance; +}; diff --git a/core/hw/sh4/dyna/shil.cpp b/core/hw/sh4/dyna/shil.cpp index 6c20e8b54..d5c161761 100644 --- a/core/hw/sh4/dyna/shil.cpp +++ b/core/hw/sh4/dyna/shil.cpp @@ -1,27 +1,10 @@ -#include - #include "types.h" +#if FEAT_SHREC != DYNAREC_NONE #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_mmr.h" - #include "ngen.h" -#include "hw/sh4/sh4_core.h" - -#define SHIL_MODE 1 -#include "shil_canonical.h" - -#define SHIL_MODE 4 -#include "shil_canonical.h" - -//#define SHIL_MODE 2 -//#include "shil_canonical.h" - -#if FEAT_SHREC != DYNAREC_NONE -#define SHIL_MODE 3 -#include "shil_canonical.h" -#endif - #include "ssa.h" +#include void AnalyseBlock(RuntimeBlockInfo* blk) { @@ -29,6 +12,56 @@ void AnalyseBlock(RuntimeBlockInfo* blk) optim.Optimize(); } +u32 getRegOffset(Sh4RegType reg) +{ + if (reg >= reg_r0 && reg <= reg_r15) { + const size_t regofs = (reg - reg_r0) * sizeof(u32); + return offsetof(Sh4Context, r[0]) + regofs; + } + if (reg >= reg_r0_Bank && reg <= reg_r7_Bank) { + const size_t regofs = (reg - reg_r0_Bank) * sizeof(u32); + return offsetof(Sh4Context, r_bank[0]) + regofs; + } + if (reg >= reg_fr_0 && reg <= reg_fr_15) { + const size_t regofs = (reg - reg_fr_0) * sizeof(float); + return offsetof(Sh4Context, fr[0]) + regofs; + } + if (reg >= reg_xf_0 && reg <= reg_xf_15) { + const size_t regofs = (reg - reg_xf_0) * sizeof(float); + return offsetof(Sh4Context, xf[0]) + regofs; + } + switch (reg) + { + case reg_gbr: return offsetof(Sh4Context, gbr); + case reg_vbr: return offsetof(Sh4Context, vbr); + case reg_ssr: return offsetof(Sh4Context, ssr); + case reg_spc: return offsetof(Sh4Context, spc); + case reg_sgr: return offsetof(Sh4Context, sgr); + case reg_dbr: return offsetof(Sh4Context, dbr); + case reg_mach: return offsetof(Sh4Context, mac.h); + case reg_macl: return offsetof(Sh4Context, mac.l); + case reg_pr: return offsetof(Sh4Context, pr); + case reg_fpul: return offsetof(Sh4Context, fpul); + case reg_nextpc: return offsetof(Sh4Context, pc); + case reg_sr_status: return offsetof(Sh4Context, sr.status); + case reg_sr_T: return offsetof(Sh4Context, sr.T); + case reg_old_fpscr: return offsetof(Sh4Context, old_fpscr.full); + case reg_fpscr: return offsetof(Sh4Context, fpscr.full); + case reg_pc_dyn: return offsetof(Sh4Context, jdyn); + case reg_temp: return offsetof(Sh4Context, temp_reg); + case reg_sq_buffer: return offsetof(Sh4Context, sq_buffer); + default: + ERROR_LOG(SH4, "Unknown register ID %d", reg); + die("Invalid reg"); + return 0; + } +} + +u32* GetRegPtr(Sh4Context& ctx, u32 reg) +{ + return (u32 *)((u8 *)&ctx + getRegOffset((Sh4RegType)reg)); +} + std::string name_reg(Sh4RegType reg) { std::stringstream ss; @@ -119,6 +152,22 @@ static std::string dissasm_param(const shil_param& prm, bool comma) return ss.str(); } +#include "hw/sh4/sh4_core.h" + +#define SHIL_MODE 1 +#include "shil_canonical.h" + +#define SHIL_MODE 4 +#include "shil_canonical.h" + +//#define SHIL_MODE 2 +//#include "shil_canonical.h" + +#if FEAT_SHREC != DYNAREC_NONE +#define SHIL_MODE 3 +#include "shil_canonical.h" +#endif + std::string shil_opcode::dissasm() const { std::stringstream ss; @@ -130,3 +179,5 @@ const char* shil_opcode_name(int op) { return shilop_str[op]; } + +#endif // FEAT_SHREC != DYNAREC_NONE diff --git a/core/hw/sh4/dyna/shil.h b/core/hw/sh4/dyna/shil.h index 9e2112bbf..787570855 100644 --- a/core/hw/sh4/dyna/shil.h +++ b/core/hw/sh4/dyna/shil.h @@ -5,6 +5,131 @@ struct shil_opcode; typedef void shil_chfp(shil_opcode* op); extern shil_chfp* shil_chf[]; +enum Sh4RegType +{ + //GPRs + reg_r0, + reg_r1, + reg_r2, + reg_r3, + reg_r4, + reg_r5, + reg_r6, + reg_r7, + reg_r8, + reg_r9, + reg_r10, + reg_r11, + reg_r12, + reg_r13, + reg_r14, + reg_r15, + + //FPU, bank 0 + reg_fr_0, + reg_fr_1, + reg_fr_2, + reg_fr_3, + reg_fr_4, + reg_fr_5, + reg_fr_6, + reg_fr_7, + reg_fr_8, + reg_fr_9, + reg_fr_10, + reg_fr_11, + reg_fr_12, + reg_fr_13, + reg_fr_14, + reg_fr_15, + + //FPU, bank 1 + reg_xf_0, + reg_xf_1, + reg_xf_2, + reg_xf_3, + reg_xf_4, + reg_xf_5, + reg_xf_6, + reg_xf_7, + reg_xf_8, + reg_xf_9, + reg_xf_10, + reg_xf_11, + reg_xf_12, + reg_xf_13, + reg_xf_14, + reg_xf_15, + + //GPR Interrupt bank + reg_r0_Bank, + reg_r1_Bank, + reg_r2_Bank, + reg_r3_Bank, + reg_r4_Bank, + reg_r5_Bank, + reg_r6_Bank, + reg_r7_Bank, + + //Misc regs + reg_gbr, + reg_ssr, + reg_spc, + reg_sgr, + reg_dbr, + reg_vbr, + reg_mach, + reg_macl, + reg_pr, + reg_fpul, + reg_nextpc, + reg_sr_status, //Only the status bits + reg_sr_T, //Only T + reg_old_fpscr, + reg_fpscr, + + reg_pc_dyn, //Write only, for dynarec only (dynamic block exit address) + reg_temp, + + sh4_reg_count, + + /* + These are virtual registers, used by the dynarec decoder + */ + regv_dr_0, + regv_dr_2, + regv_dr_4, + regv_dr_6, + regv_dr_8, + regv_dr_10, + regv_dr_12, + regv_dr_14, + + regv_xd_0, + regv_xd_2, + regv_xd_4, + regv_xd_6, + regv_xd_8, + regv_xd_10, + regv_xd_12, + regv_xd_14, + + regv_fv_0, + regv_fv_4, + regv_fv_8, + regv_fv_12, + + regv_xmtrx, + regv_fmtrx, + + reg_sq_buffer, + + NoReg=-1 +}; + +u32 getRegOffset(Sh4RegType reg); +u32* GetRegPtr(Sh4Context& ctx, u32 reg); + enum shil_param_type { FMT_NULL, @@ -27,7 +152,6 @@ enum shil_param_type param types: r32, r64 */ - #define SHIL_MODE 0 #include "shil_canonical.h" @@ -107,9 +231,9 @@ struct shil_param bool is_imm_s8() const { return is_imm() && (int8_t)_imm == (int32_t)_imm; } - u32* reg_ptr() const { verify(is_reg()); return GetRegPtr(_reg); } - s32 reg_nofs() const { verify(is_reg()); return (s32)((u8*)GetRegPtr(_reg) - (u8*)GetRegPtr(reg_xf_0)-sizeof(Sh4cntx)); } - u32 reg_aofs() const { return -reg_nofs(); } + u32* reg_ptr(Sh4Context& ctx) const { verify(is_reg()); return GetRegPtr(ctx, _reg); } + u32 reg_offset() const { verify(is_reg()); return getRegOffset(_reg); } + s32 reg_nofs() const { verify(is_reg()); return (int)getRegOffset(_reg) - sizeof(Sh4Context); } u32 imm_value() const { verify(is_imm()); return _imm; } diff --git a/core/hw/sh4/dyna/shil_canonical.h b/core/hw/sh4/dyna/shil_canonical.h index 565f27d63..21e1a8230 100644 --- a/core/hw/sh4/dyna/shil_canonical.h +++ b/core/hw/sh4/dyna/shil_canonical.h @@ -31,15 +31,16 @@ #define shil_canonical(rv,name,args,code) struct name { static rv impl args { code } }; - #define shil_cf_arg_u32(x) ngen_CC_Param(op,&op->x,CPT_u32); - #define shil_cf_arg_f32(x) ngen_CC_Param(op,&op->x,CPT_f32); - #define shil_cf_arg_ptr(x) ngen_CC_Param(op,&op->x,CPT_ptr); - #define shil_cf_rv_u32(x) ngen_CC_Param(op,&op->x,CPT_u32rv); - #define shil_cf_rv_f32(x) ngen_CC_Param(op,&op->x,CPT_f32rv); - #define shil_cf_rv_u64(x) ngen_CC_Param(op,&op->rd,CPT_u64rvL); ngen_CC_Param(op,&op->rd2,CPT_u64rvH); - #define shil_cf(x) ngen_CC_Call(op, (void *)&x::impl); - - #define shil_compile(code) static void compile(shil_opcode* op) { ngen_CC_Start(op); code ngen_CC_Finish(op); } + #define shil_cf_arg_u32(x) sh4Dynarec->canonParam(op, &op->x, CPT_u32); + #define shil_cf_arg_f32(x) sh4Dynarec->canonParam(op, &op->x, CPT_f32); + #define shil_cf_arg_ptr(x) sh4Dynarec->canonParam(op, &op->x, CPT_ptr); + #define shil_cf_arg_sh4ctx() sh4Dynarec->canonParam(op, nullptr, CPT_sh4ctx); + #define shil_cf_rv_u32(x) sh4Dynarec->canonParam(op, &op->x, CPT_u32rv); + #define shil_cf_rv_f32(x) sh4Dynarec->canonParam(op, &op->x, CPT_f32rv); + #define shil_cf_rv_u64(x) sh4Dynarec->canonParam(op, &op->rd, CPT_u64rvL); sh4Dynarec->canonParam(op, &op->rd2, CPT_u64rvH); + #define shil_cf(x) sh4Dynarec->canonCall(op, (void *)&x::impl); + + #define shil_compile(code) static void compile(shil_opcode* op) { sh4Dynarec->canonStart(op); code sh4Dynarec->canonFinish(op); } #elif SHIL_MODE==2 //generate struct declarations ... #define SHIL_START @@ -135,6 +136,28 @@ shil_compile( \ die("This opcode requires native dynarec implementation"); \ ) +#if SHIL_MODE==1 + +template +static inline float innerProduct(const float *f1, const float *f2) +{ +#if HOST_CPU == CPU_X86 || HOST_CPU == CPU_X64 || HOST_CPU == CPU_ARM64 + const double f = (double)f1[0] * f2[Stride * 0] + + (double)f1[1] * f2[Stride * 1] + + (double)f1[2] * f2[Stride * 2] + + (double)f1[3] * f2[Stride * 3]; + return fixNaN((float)f); +#else + const float f = f1[0] * f2[Stride * 0] + + f1[1] * f2[Stride * 1] + + f1[2] * f2[Stride * 2] + + f1[3] * f2[Stride * 3]; + return fixNaN(f); +#endif +} + +#endif + #else #define BIN_OP_I(z) @@ -205,11 +228,12 @@ shil_opc_end() shil_opc(sync_fpscr) shil_canonical ( -void, f1, (), - UpdateFPSCR(); +void, f1, (Sh4Context *ctx), + Sh4Context::UpdateFPSCR(ctx); ) shil_compile ( + shil_cf_arg_sh4ctx(); shil_cf(f1); ) shil_opc_end() @@ -415,24 +439,6 @@ shil_compile shil_opc_end() - -//shop_swap -- swap all bytes in word -shil_opc(swap) -shil_canonical -( -u32,f1,(u32 r1), - return (r1 >>24) | ((r1 >>16)&0xFF00) |((r1&0xFF00)<<8) | (r1<<24); -) - -shil_compile -( - shil_cf_arg_u32(rs1); - shil_cf(f1); - shil_cf_rv_u32(rd); -) - -shil_opc_end() - //shop_shld shil_opc(shld) shil_canonical @@ -656,7 +662,8 @@ shil_opc_end() shil_opc(div1) shil_canonical ( -u64,f1,(u32 a, s32 b, u32 T), +u64,f1,(u32 a, s32 b, u32 T, Sh4Context *ctx), + sr_t& sr = ctx->sr; bool qxm = sr.Q ^ sr.M; sr.Q = (int)a < 0; a = (a << 1) | T; @@ -670,6 +677,7 @@ u64,f1,(u32 a, s32 b, u32 T), ) shil_compile ( + shil_cf_arg_sh4ctx(); shil_cf_arg_u32(rs3); shil_cf_arg_u32(rs2); shil_cf_arg_u32(rs1); @@ -791,27 +799,15 @@ shil_opc_end() shil_opc(pref) shil_canonical ( -void,f1,(u32 r1), - if ((r1>>26) == 0x38) do_sqw_mmu(r1); -) - -shil_canonical -( -void,f2,(u32 r1), - if ((r1>>26) == 0x38) do_sqw_nommu(r1,sq_both); +void,f1,(u32 r1, Sh4Context *ctx), + if ((r1 >> 26) == 0x38) ctx->doSqWrite(r1, ctx); ) shil_compile ( + shil_cf_arg_sh4ctx(); shil_cf_arg_u32(rs1); - if (CCN_MMUCR.AT) - { - shil_cf(f1); - } - else - { - shil_cf(f2); - } + shil_cf(f1); ) shil_opc_end() @@ -909,31 +905,12 @@ shil_opc_end() //shop_fipr shil_opc(fipr) -#if HOST_CPU == CPU_X86 || HOST_CPU == CPU_X64 shil_canonical ( f32,f1,(const float* fn, const float* fm), - double idp = (double)fn[0] * fm[0]; - idp += (double)fn[1] * fm[1]; - idp += (double)fn[2] * fm[2]; - idp += (double)fn[3] * fm[3]; - - return fixNaN((float)idp); + return innerProduct(fn, fm); ) -#else -shil_canonical -( -f32,f1,(float* fn, float* fm), - - float idp = fn[0] * fm[0]; - idp+=fn[1]*fm[1]; - idp+=fn[2]*fm[2]; - idp+=fn[3]*fm[3]; - - return fixNaN(idp); -) -#endif shil_compile ( @@ -942,74 +919,24 @@ shil_compile shil_cf(f1); shil_cf_rv_f32(rd); ) - shil_opc_end() - - //shop_ftrv shil_opc(ftrv) -#if HOST_CPU == CPU_X86 || HOST_CPU == CPU_X64 shil_canonical ( -void,f1,(float* fd, const float* fn, const float* fm), - - double v1 = (double)fm[0] * fn[0] + - (double)fm[4] * fn[1] + - (double)fm[8] * fn[2] + - (double)fm[12] * fn[3]; - - double v2 = (double)fm[1] * fn[0] + - (double)fm[5] * fn[1] + - (double)fm[9] * fn[2] + - (double)fm[13] * fn[3]; - - double v3 = (double)fm[2] * fn[0] + - (double)fm[6] * fn[1] + - (double)fm[10] * fn[2] + - (double)fm[14] * fn[3]; +void,f1,(float *fd, const float *fn, const float *fm), - double v4 = (double)fm[3] * fn[0] + - (double)fm[7] * fn[1] + - (double)fm[11] * fn[2] + - (double)fm[15] * fn[3]; - - fd[0] = fixNaN((float)v1); - fd[1] = fixNaN((float)v2); - fd[2] = fixNaN((float)v3); - fd[3] = fixNaN((float)v4); + float v1 = innerProduct<4>(fn, fm); + float v2 = innerProduct<4>(fn, fm + 1); + float v3 = innerProduct<4>(fn, fm + 2); + float v4 = innerProduct<4>(fn, fm + 3); + fd[0] = v1; + fd[1] = v2; + fd[2] = v3; + fd[3] = v4; ) -#else -shil_canonical -( -void,f1,(float* fd,float* fn, float* fm), - - float v1 = fm[0] * fn[0] + - fm[4] * fn[1] + - fm[8] * fn[2] + - fm[12] * fn[3]; - - float v2 = fm[1] * fn[0] + - fm[5] * fn[1] + - fm[9] * fn[2] + - fm[13] * fn[3]; - - float v3 = fm[2] * fn[0] + - fm[6] * fn[1] + - fm[10] * fn[2] + - fm[14] * fn[3]; - float v4 = fm[3] * fn[0] + - fm[7] * fn[1] + - fm[11] * fn[2] + - fm[15] * fn[3]; - - fd[0] = fixNaN(v1); - fd[1] = fixNaN(v2); - fd[2] = fixNaN(v3); - fd[3] = fixNaN(v4); -) -#endif shil_compile ( shil_cf_arg_ptr(rs2); @@ -1024,7 +951,7 @@ shil_opc(fmac) shil_canonical ( f32,f1,(float fn, float f0,float fm), - return fixNaN(fn + f0 * fm); + return fixNaN(std::fma(f0, fm, fn)); ) shil_compile ( diff --git a/core/hw/sh4/dyna/ssa.cpp b/core/hw/sh4/dyna/ssa.cpp index 66e4e911c..783874765 100644 --- a/core/hw/sh4/dyna/ssa.cpp +++ b/core/hw/sh4/dyna/ssa.cpp @@ -18,6 +18,8 @@ You should have received a copy of the GNU General Public License along with reicast. If not, see . */ +#include "build.h" +#if FEAT_SHREC != DYNAREC_NONE #include "blockmanager.h" #include "ssa.h" @@ -167,9 +169,6 @@ bool SSAOptimizer::ExecuteConstOp(shil_opcode* op) case shop_swaplb: rd = shil_opcl_swaplb::f1::impl(rs1); break; - case shop_swap: - rd = shil_opcl_swap::f1::impl(rs1); - break; case shop_seteq: rd = shil_opcl_seteq::f1::impl(rs1, rs2); break; @@ -372,3 +371,4 @@ bool SSAOptimizer::ExecuteConstOp(shil_opcode* op) return false; } } +#endif // FEAT_SHREC != DYNAREC_NONE diff --git a/core/hw/sh4/dyna/ssa.h b/core/hw/sh4/dyna/ssa.h index a2e34d920..ba9a33127 100644 --- a/core/hw/sh4/dyna/ssa.h +++ b/core/hw/sh4/dyna/ssa.h @@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License along with reicast. If not, see . */ +#pragma once #include #include #include @@ -69,6 +70,7 @@ class SSAOptimizer for (shil_opcode& op : block->oplist) { + // FIXME shop_ifb should be assumed to increase versions too? (increment all reg_versions[]) AddVersionToOperand(op.rs1, false); AddVersionToOperand(op.rs2, false); AddVersionToOperand(op.rs3, false); @@ -211,26 +213,18 @@ class SSAOptimizer } else if (op.op == shop_readm || op.op == shop_writem) { - if (op.rs1.is_imm()) + if (op.rs1.is_imm() && !op.rs3.is_reg()) { - if (op.rs3.is_imm()) - { - // Merge base addr and offset + // Merge base addr and offset + if (op.rs3.is_imm()) { op.rs1._imm += op.rs3.imm_value(); op.rs3.type = FMT_NULL; } - else if (op.rs3.is_reg()) - { - // Swap rs1 and rs3 so that rs1 is never an immediate operand - shil_param t = op.rs1; - op.rs1 = op.rs3; - op.rs3 = t; - } // If we know the address to read and it's in the same memory page(s) as the block // and if those pages are read-only, then we can directly read the memory at compile time // and propagate the read value as a constant. - if (op.rs1.is_imm() && op.op == shop_readm && block->read_only + if (op.op == shop_readm && block->read_only && (op.rs1._imm >> 12) >= (block->vaddr >> 12) && (op.rs1._imm >> 12) <= ((block->vaddr + block->sh4_code_size - 1) >> 12) && op.size <= 4) @@ -262,6 +256,15 @@ class SSAOptimizer } } } + else + { + if (op.rs1.is_imm() && op.rs3.is_reg()) + // Swap rs1 and rs3 so that rs1 is never an immediate operand + std::swap(op.rs1, op.rs3); + if (op.rs3.is_imm() && op.rs3.imm_value() == 0) + // 0 displacement has no effect + op.rs3.type = FMT_NULL; + } } else if (ExecuteConstOp(&op)) { @@ -282,33 +285,37 @@ class SSAOptimizer { // Replace shld/shad with shl/shr/sar u32 r2 = op.rs2.imm_value(); - if ((r2 & 0x80000000) == 0) - { - // rd = r1 << (r2 & 0x1F) - op.op = shop_shl; - op.rs2._imm = r2 & 0x1F; - stats.constant_ops_replaced++; - } - else if ((r2 & 0x1F) == 0) + if (r2 != 0) // r2 == 0 is nop, handled in SimplifyExpressionPass() { - if (op.op == shop_shl) - // rd = 0 - ReplaceByMov32(op, 0); + if ((r2 & 0x1F) == 0) + { + if (op.op == shop_shld) { + // rd = 0 + ReplaceByMov32(op, 0); + } + else + { + // rd = r1 >> 31 + op.op = shop_sar; + op.rs2._imm = 31; + stats.constant_ops_replaced++; + } + } + else if ((r2 & 0x80000000) == 0) + { + // rd = r1 << (r2 & 0x1F) + op.op = shop_shl; + op.rs2._imm = r2 & 0x1F; + stats.constant_ops_replaced++; + } else { - // rd = r1 >> 31; - op.op = shop_sar; - op.rs2._imm = 31; + // rd = r1 >> ((~r2 & 0x1F) + 1) + op.op = op.op == shop_shad ? shop_sar : shop_shr; + op.rs2._imm = (~r2 & 0x1F) + 1; stats.constant_ops_replaced++; } } - else - { - // rd = r1 >> ((~r2 & 0x1F) + 1) - op.op = op.op == shop_shad ? shop_sar : shop_shr; - op.rs2._imm = (~r2 & 0x1F) + 1; - stats.constant_ops_replaced++; - } } } } @@ -439,9 +446,9 @@ class SSAOptimizer for (size_t opnum = 0; opnum < block->oplist.size(); opnum++) { shil_opcode& op = block->oplist[opnum]; - if (op.rs2.is_imm()) + if (op.rs2.is_imm() || op.rs2.is_null()) { - if (op.rs2.imm_value() == 0) + if (op.rs2.is_null() || op.rs2.imm_value() == 0) { // a & 0 == 0 // a * 0 == 0 @@ -589,10 +596,15 @@ class SSAOptimizer defnum = opnum; // find alias redef - if (DefinesHigherVersion(op->rd, alias.second) && aliasdef == (size_t)-1) - aliasdef = opnum; - else if (DefinesHigherVersion(op->rd2, alias.second) && aliasdef == (size_t)-1) - aliasdef = opnum; + if (aliasdef == (size_t)-1) + { + if (DefinesHigherVersion(op->rd, alias.second)) + aliasdef = opnum; + else if (DefinesHigherVersion(op->rd2, alias.second)) + aliasdef = opnum; + else if (op->op == shop_ifb) + aliasdef = opnum; + } // find last use if (UsesRegValue(op->rs1, alias.first)) diff --git a/core/hw/sh4/interpr/sh4_fpu.cpp b/core/hw/sh4/interpr/sh4_fpu.cpp index f25673b22..231f45fe3 100644 --- a/core/hw/sh4/interpr/sh4_fpu.cpp +++ b/core/hw/sh4/interpr/sh4_fpu.cpp @@ -6,8 +6,6 @@ #include "hw/sh4/sh4_rom.h" #include "hw/sh4/sh4_mem.h" -#define sh4op(str) void DYNACALL str (u32 op) - static u32 GetN(u32 op) { return (op >> 8) & 0xf; } @@ -15,14 +13,14 @@ static u32 GetM(u32 op) { return (op >> 4) & 0xf; } -static double getDRn(u32 op) { - return GetDR((op >> 9) & 7); +static double getDRn(Sh4Context *ctx, u32 op) { + return ctx->getDR((op >> 9) & 7); } -static double getDRm(u32 op) { - return GetDR((op >> 5) & 7); +static double getDRm(Sh4Context *ctx, u32 op) { + return ctx->getDR((op >> 5) & 7); } -static void setDRn(u32 op, double d) { - SetDR((op >> 9) & 7, d); +static void setDRn(Sh4Context *ctx, u32 op, double d) { + ctx->setDR((op >> 9) & 7, d); } static void iNimp(const char *str); @@ -32,127 +30,127 @@ static void iNimp(const char *str); //fadd , sh4op(i1111_nnnn_mmmm_0000) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] += fr[m]; - CHECK_FPU_32(fr[n]); + ctx->fr[n] += ctx->fr[m]; + CHECK_FPU_32(ctx->fr[n]); } else { - double d = getDRn(op) + getDRm(op); + double d = getDRn(ctx, op) + getDRm(ctx, op); d = fixNaN64(d); - setDRn(op, d); + setDRn(ctx, op, d); } } //fsub , sh4op(i1111_nnnn_mmmm_0001) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] -= fr[m]; - CHECK_FPU_32(fr[n]); + ctx->fr[n] -= ctx->fr[m]; + CHECK_FPU_32(ctx->fr[n]); } else { - double d = getDRn(op) - getDRm(op); + double d = getDRn(ctx, op) - getDRm(ctx, op); d = fixNaN64(d); - setDRn(op, d); + setDRn(ctx, op, d); } } //fmul , sh4op(i1111_nnnn_mmmm_0010) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] *= fr[m]; - CHECK_FPU_32(fr[n]); + ctx->fr[n] *= ctx->fr[m]; + CHECK_FPU_32(ctx->fr[n]); } else { - double d = getDRn(op) * getDRm(op); + double d = getDRn(ctx, op) * getDRm(ctx, op); d = fixNaN64(d); - setDRn(op, d); + setDRn(ctx, op, d); } } //fdiv , sh4op(i1111_nnnn_mmmm_0011) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] /= fr[m]; + ctx->fr[n] /= ctx->fr[m]; - CHECK_FPU_32(fr[n]); + CHECK_FPU_32(ctx->fr[n]); } else { - double d = getDRn(op) / getDRm(op); + double d = getDRn(ctx, op) / getDRm(ctx, op); d = fixNaN64(d); - setDRn(op, d); + setDRn(ctx, op, d); } } //fcmp/eq , sh4op(i1111_nnnn_mmmm_0100) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - sr.T = fr[m] == fr[n]; + ctx->sr.T = ctx->fr[m] == ctx->fr[n]; } else { - sr.T = getDRn(op) == getDRm(op); + ctx->sr.T = getDRn(ctx, op) == getDRm(ctx, op); } } //fcmp/gt , sh4op(i1111_nnnn_mmmm_0101) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); u32 m = GetM(op); - if (fr[n] > fr[m]) - sr.T = 1; + if (ctx->fr[n] > ctx->fr[m]) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } else { - sr.T = getDRn(op) > getDRm(op); + ctx->sr.T = getDRn(ctx, op) > getDRm(ctx, op); } } //All memory opcodes are here //fmov.s @(R0,), sh4op(i1111_nnnn_mmmm_0110) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr_hex[n] = ReadMem32(r[m] + r[0]); + ctx->fr_hex(n) = ReadMem32(ctx->r[m] + ctx->r[0]); } else { u32 n = GetN(op)>>1; u32 m = GetM(op); if (((op >> 8) & 1) == 0) - dr_hex[n] = ReadMem64(r[m] + r[0]); + ctx->dr_hex(n) = ReadMem64(ctx->r[m] + ctx->r[0]); else - xd_hex[n] = ReadMem64(r[m] + r[0]); + ctx->xd_hex(n) = ReadMem64(ctx->r[m] + ctx->r[0]); } } @@ -160,21 +158,21 @@ sh4op(i1111_nnnn_mmmm_0110) //fmov.s ,@(R0,) sh4op(i1111_nnnn_mmmm_0111) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - WriteMem32(r[0] + r[n], fr_hex[m]); + WriteMem32(ctx->r[0] + ctx->r[n], ctx->fr_hex(m)); } else { u32 n = GetN(op); u32 m = GetM(op)>>1; if (((op >> 4) & 0x1) == 0) - WriteMem64(r[n] + r[0], dr_hex[m]); + WriteMem64(ctx->r[n] + ctx->r[0], ctx->dr_hex(m)); else - WriteMem64(r[n] + r[0], xd_hex[m]); + WriteMem64(ctx->r[n] + ctx->r[0], ctx->xd_hex(m)); } } @@ -182,20 +180,20 @@ sh4op(i1111_nnnn_mmmm_0111) //fmov.s @, sh4op(i1111_nnnn_mmmm_1000) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr_hex[n] = ReadMem32(r[m]); + ctx->fr_hex(n) = ReadMem32(ctx->r[m]); } else { u32 n = GetN(op)>>1; u32 m = GetM(op); if (((op >> 8) & 1) == 0) - dr_hex[n] = ReadMem64(r[m]); + ctx->dr_hex(n) = ReadMem64(ctx->r[m]); else - xd_hex[n] = ReadMem64(r[m]); + ctx->xd_hex(n) = ReadMem64(ctx->r[m]); } } @@ -203,23 +201,23 @@ sh4op(i1111_nnnn_mmmm_1000) //fmov.s @+, sh4op(i1111_nnnn_mmmm_1001) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr_hex[n] = ReadMem32(r[m]); - r[m] += 4; + ctx->fr_hex(n) = ReadMem32(ctx->r[m]); + ctx->r[m] += 4; } else { u32 n = GetN(op)>>1; u32 m = GetM(op); if (((op >> 8) & 1) == 0) - dr_hex[n] = ReadMem64(r[m]); + ctx->dr_hex(n) = ReadMem64(ctx->r[m]); else - xd_hex[n] = ReadMem64(r[m]); - r[m] += 8; + ctx->xd_hex(n) = ReadMem64(ctx->r[m]); + ctx->r[m] += 8; } } @@ -227,11 +225,11 @@ sh4op(i1111_nnnn_mmmm_1001) //fmov.s ,@ sh4op(i1111_nnnn_mmmm_1010) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - WriteMem32(r[n], fr_hex[m]); + WriteMem32(ctx->r[n], ctx->fr_hex(m)); } else { @@ -239,38 +237,38 @@ sh4op(i1111_nnnn_mmmm_1010) u32 m = GetM(op)>>1; if (((op >> 4) & 0x1) == 0) - WriteMem64(r[n], dr_hex[m]); + WriteMem64(ctx->r[n], ctx->dr_hex(m)); else - WriteMem64(r[n], xd_hex[m]); + WriteMem64(ctx->r[n], ctx->xd_hex(m)); } } //fmov.s ,@- sh4op(i1111_nnnn_mmmm_1011) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - u32 addr = r[n] - 4; + u32 addr = ctx->r[n] - 4; - WriteMem32(addr, fr_hex[m]); + WriteMem32(addr, ctx->fr_hex(m)); - r[n] = addr; + ctx->r[n] = addr; } else { u32 n = GetN(op); u32 m = GetM(op)>>1; - u32 addr = r[n] - 8; + u32 addr = ctx->r[n] - 8; if (((op >> 4) & 0x1) == 0) - WriteMem64(addr, dr_hex[m]); + WriteMem64(addr, ctx->dr_hex(m)); else - WriteMem64(addr, xd_hex[m]); + WriteMem64(addr, ctx->xd_hex(m)); - r[n] = addr; + ctx->r[n] = addr; } } @@ -279,11 +277,11 @@ sh4op(i1111_nnnn_mmmm_1011) //fmov , sh4op(i1111_nnnn_mmmm_1100) { - if (fpscr.SZ == 0) + if (ctx->fpscr.SZ == 0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] = fr[m]; + ctx->fr[n] = ctx->fr[m]; } else { @@ -293,22 +291,22 @@ sh4op(i1111_nnnn_mmmm_1100) { case 0x00: //dr[n] = dr[m]; - dr_hex[n] = dr_hex[m]; + ctx->dr_hex(n) = ctx->dr_hex(m); break; case 0x01: //dr[n] = xd[m]; - dr_hex[n] = xd_hex[m]; + ctx->dr_hex(n) = ctx->xd_hex(m); break; case 0x10: //xd[n] = dr[m]; - xd_hex[n] = dr_hex[m]; + ctx->xd_hex(n) = ctx->dr_hex(m); break; case 0x11: //xd[n] = xd[m]; - xd_hex[n] = xd_hex[m]; + ctx->xd_hex(n) = ctx->xd_hex(m); break; } } @@ -320,10 +318,10 @@ sh4op(i1111_nnnn_0101_1101) { int n=GetN(op); - if (fpscr.PR ==0) - fr_hex[n]&=0x7FFFFFFF; + if (ctx->fpscr.PR == 0) + ctx->fr_hex(n) &= 0x7FFFFFFF; else - fr_hex[(n&0xE)]&=0x7FFFFFFF; + ctx->fr_hex(n & 0xE) &= 0x7FFFFFFF; } @@ -334,21 +332,21 @@ sh4op(i1111_nnn0_1111_1101) //cosine(x) = sine(pi/2 + x). - if (fpscr.PR==0) + if (ctx->fpscr.PR==0) { - u32 pi_index=fpul&0xFFFF; + u32 pi_index = ctx->fpul & 0xFFFF; #ifdef NATIVE_FSCA float rads = pi_index / (65536.0f / 2) * float(M_PI); - fr[n + 0] = sinf(rads); - fr[n + 1] = cosf(rads); + ctx->fr[n + 0] = sinf(rads); + ctx->fr[n + 1] = cosf(rads); - CHECK_FPU_32(fr[n]); - CHECK_FPU_32(fr[n+1]); + CHECK_FPU_32(ctx->fr[n]); + CHECK_FPU_32(ctx->fr[n + 1]); #else - fr[n + 0] = sin_table[pi_index].u[0]; - fr[n + 1] = sin_table[pi_index].u[1]; + ctx->fr[n + 0] = sin_table[pi_index].u[0]; + ctx->fr[n + 1] = sin_table[pi_index].u[1]; #endif } @@ -360,10 +358,10 @@ sh4op(i1111_nnn0_1111_1101) sh4op(i1111_nnnn_0111_1101) { u32 n = GetN(op); - if (fpscr.PR==0) + if (ctx->fpscr.PR==0) { - fr[n] = (float)(1/sqrtf(fr[n])); - CHECK_FPU_32(fr[n]); + ctx->fr[n] = 1.f / sqrtf(ctx->fr[n]); + CHECK_FPU_32(ctx->fr[n]); } else iNimp("FSRRA : Double precision mode"); @@ -373,10 +371,10 @@ sh4op(i1111_nnnn_0111_1101) sh4op(i1111_nnnn_1011_1101) { - if (fpscr.PR == 1) + if (ctx->fpscr.PR == 1) { - u32 *p = &fpul; - *((float *)p) = (float)getDRn(op); + u32 *p = &ctx->fpul; + *((float *)p) = (float)getDRn(ctx, op); } else { @@ -388,10 +386,10 @@ sh4op(i1111_nnnn_1011_1101) //fcnvsd FPUL, sh4op(i1111_nnnn_1010_1101) { - if (fpscr.PR == 1) + if (ctx->fpscr.PR == 1) { - u32 *p = &fpul; - setDRn(op, (double)*((float *)p)); + u32 *p = &ctx->fpul; + setDRn(ctx, op, (double)*((float *)p)); } else { @@ -404,25 +402,14 @@ sh4op(i1111_nnmm_1110_1101) { int n=GetN(op)&0xC; int m=(GetN(op)&0x3)<<2; - if (fpscr.PR == 0) - { -#if HOST_CPU == CPU_X86 || HOST_CPU == CPU_X64 - // multiplications are done with 28 bits of precision (53 - 25) and the final sum at 30 bits - double idp = (double)fr[n + 0] * fr[m + 0]; - idp += (double)fr[n + 1] * fr[m + 1]; - idp += (double)fr[n + 2] * fr[m + 2]; - idp += (double)fr[n + 3] * fr[m + 3]; - - fr[n + 3] = fixNaN((float)idp); -#else - float rv = fr[n + 0] * fr[m + 0]; - rv += fr[n + 1] * fr[m + 1]; - rv += fr[n + 2] * fr[m + 2]; - rv += fr[n + 3] * fr[m + 3]; - - CHECK_FPU_32(rv); - fr[n + 3] = rv; -#endif + if (ctx->fpscr.PR == 0) + { + double idp = (double)ctx->fr[n + 0] * ctx->fr[m + 0]; + idp += (double)ctx->fr[n + 1] * ctx->fr[m + 1]; + idp += (double)ctx->fr[n + 2] * ctx->fr[m + 2]; + idp += (double)ctx->fr[n + 3] * ctx->fr[m + 3]; + + ctx->fr[n + 3] = fixNaN((float)idp); } else { @@ -433,24 +420,24 @@ sh4op(i1111_nnmm_1110_1101) //fldi0 sh4op(i1111_nnnn_1000_1101) { - if (fpscr.PR!=0) + if (ctx->fpscr.PR!=0) return; u32 n = GetN(op); - fr[n] = 0.0f; + ctx->fr[n] = 0.0f; } //fldi1 sh4op(i1111_nnnn_1001_1101) { - if (fpscr.PR!=0) + if (ctx->fpscr.PR!=0) return; u32 n = GetN(op); - fr[n] = 1.0f; + ctx->fr[n] = 1.0f; } //flds ,FPUL @@ -458,27 +445,27 @@ sh4op(i1111_nnnn_0001_1101) { u32 n = GetN(op); - fpul = fr_hex[n]; + ctx->fpul = ctx->fr_hex(n); } //fsts FPUL, sh4op(i1111_nnnn_0000_1101) { u32 n = GetN(op); - fr_hex[n] = fpul; + ctx->fr_hex(n) = ctx->fpul; } //float FPUL, sh4op(i1111_nnnn_0010_1101) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); - fr[n] = (float)(int)fpul; + ctx->fr[n] = (float)(int)ctx->fpul; } else { - setDRn(op, (double)(int)fpul); + setDRn(ctx, op, (double)(int)ctx->fpul); } } @@ -488,40 +475,40 @@ sh4op(i1111_nnnn_0100_1101) { u32 n = GetN(op); - if (fpscr.PR ==0) - fr_hex[n]^=0x80000000; + if (ctx->fpscr.PR == 0) + ctx->fr_hex(n) ^= 0x80000000; else - fr_hex[(n&0xE)]^=0x80000000; + ctx->fr_hex(n & 0xE) ^= 0x80000000; } //frchg sh4op(i1111_1011_1111_1101) { - fpscr.FR = 1 - fpscr.FR; + ctx->fpscr.FR = 1 - ctx->fpscr.FR; - UpdateFPSCR(); + Sh4Context::UpdateFPSCR(ctx); } //fschg sh4op(i1111_0011_1111_1101) { - fpscr.SZ = 1 - fpscr.SZ; + ctx->fpscr.SZ = 1 - ctx->fpscr.SZ; } //fsqrt sh4op(i1111_nnnn_0110_1101) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); - fr[n] = sqrtf(fr[n]); - CHECK_FPU_32(fr[n]); + ctx->fr[n] = sqrtf(ctx->fr[n]); + CHECK_FPU_32(ctx->fr[n]); } else { - setDRn(op, fixNaN64(sqrt(getDRn(op)))); + setDRn(ctx, op, fixNaN64(sqrt(getDRn(ctx, op)))); } } @@ -529,31 +516,31 @@ sh4op(i1111_nnnn_0110_1101) //ftrc , FPUL sh4op(i1111_nnnn_0011_1101) { - if (fpscr.PR == 0) + if (ctx->fpscr.PR == 0) { u32 n = GetN(op); - fpul = (u32)(s32)fr[n]; + ctx->fpul = (u32)(s32)ctx->fr[n]; - if ((s32)fpul > 0x7fffff80) - fpul = 0x7fffffff; + if ((s32)ctx->fpul > 0x7fffff80) + ctx->fpul = 0x7fffffff; // Intel CPUs convert out of range float numbers to 0x80000000. Manually set the correct sign - else if (fpul == 0x80000000 && fr[n] == fr[n]) + else if (ctx->fpul == 0x80000000 && ctx->fr[n] == ctx->fr[n]) { - if (*(int *)&fr[n] > 0) // Using integer math to avoid issues with Inf and NaN - fpul--; + if (*(int *)&ctx->fr[n] > 0) // Using integer math to avoid issues with Inf and NaN + ctx->fpul--; } } else { - f64 f = getDRn(op); - fpul = (u32)(s32)f; + f64 f = getDRn(ctx, op); + ctx->fpul = (u32)(s32)f; // TODO saturate // Intel CPUs convert out of range float numbers to 0x80000000. Manually set the correct sign - if (fpul == 0x80000000 && f == f) + if (ctx->fpul == 0x80000000 && f == f) { if (*(s64 *)&f > 0) // Using integer math to avoid issues with Inf and NaN - fpul--; + ctx->fpul--; } } } @@ -562,13 +549,13 @@ sh4op(i1111_nnnn_0011_1101) //fmac ,, sh4op(i1111_nnnn_mmmm_1110) { - if (fpscr.PR==0) + if (ctx->fpscr.PR==0) { u32 n = GetN(op); u32 m = GetM(op); - fr[n] =(f32) ((f64)fr[n]+(f64)fr[0] * (f64)fr[m]); - CHECK_FPU_32(fr[n]); + ctx->fr[n] = std::fma(ctx->fr[0], ctx->fr[m], ctx->fr[n]); + CHECK_FPU_32(ctx->fr[n]); } else { @@ -589,66 +576,32 @@ sh4op(i1111_nn01_1111_1101) u32 n=GetN(op)&0xC; - if (fpscr.PR==0) - { -#if HOST_CPU == CPU_X86 || HOST_CPU == CPU_X64 - double v1 = (double)xf[0] * fr[n + 0] + - (double)xf[4] * fr[n + 1] + - (double)xf[8] * fr[n + 2] + - (double)xf[12] * fr[n + 3]; - - double v2 = (double)xf[1] * fr[n + 0] + - (double)xf[5] * fr[n + 1] + - (double)xf[9] * fr[n + 2] + - (double)xf[13] * fr[n + 3]; - - double v3 = (double)xf[2] * fr[n + 0] + - (double)xf[6] * fr[n + 1] + - (double)xf[10] * fr[n + 2] + - (double)xf[14] * fr[n + 3]; - - double v4 = (double)xf[3] * fr[n + 0] + - (double)xf[7] * fr[n + 1] + - (double)xf[11] * fr[n + 2] + - (double)xf[15] * fr[n + 3]; - - fr[n + 0] = fixNaN((float)v1); - fr[n + 1] = fixNaN((float)v2); - fr[n + 2] = fixNaN((float)v3); - fr[n + 3] = fixNaN((float)v4); -#else - float v1, v2, v3, v4; - - v1 = xf[0] * fr[n + 0] + - xf[4] * fr[n + 1] + - xf[8] * fr[n + 2] + - xf[12] * fr[n + 3]; - - v2 = xf[1] * fr[n + 0] + - xf[5] * fr[n + 1] + - xf[9] * fr[n + 2] + - xf[13] * fr[n + 3]; - - v3 = xf[2] * fr[n + 0] + - xf[6] * fr[n + 1] + - xf[10] * fr[n + 2] + - xf[14] * fr[n + 3]; - - v4 = xf[3] * fr[n + 0] + - xf[7] * fr[n + 1] + - xf[11] * fr[n + 2] + - xf[15] * fr[n + 3]; - - CHECK_FPU_32(v1); - CHECK_FPU_32(v2); - CHECK_FPU_32(v3); - CHECK_FPU_32(v4); - - fr[n + 0] = v1; - fr[n + 1] = v2; - fr[n + 2] = v3; - fr[n + 3] = v4; -#endif + if (ctx->fpscr.PR==0) + { + double v1 = (double)ctx->xf[0] * ctx->fr[n + 0] + + (double)ctx->xf[4] * ctx->fr[n + 1] + + (double)ctx->xf[8] * ctx->fr[n + 2] + + (double)ctx->xf[12] * ctx->fr[n + 3]; + + double v2 = (double)ctx->xf[1] * ctx->fr[n + 0] + + (double)ctx->xf[5] * ctx->fr[n + 1] + + (double)ctx->xf[9] * ctx->fr[n + 2] + + (double)ctx->xf[13] * ctx->fr[n + 3]; + + double v3 = (double)ctx->xf[2] * ctx->fr[n + 0] + + (double)ctx->xf[6] * ctx->fr[n + 1] + + (double)ctx->xf[10] * ctx->fr[n + 2] + + (double)ctx->xf[14] * ctx->fr[n + 3]; + + double v4 = (double)ctx->xf[3] * ctx->fr[n + 0] + + (double)ctx->xf[7] * ctx->fr[n + 1] + + (double)ctx->xf[11] * ctx->fr[n + 2] + + (double)ctx->xf[15] * ctx->fr[n + 3]; + + ctx->fr[n + 0] = fixNaN((float)v1); + ctx->fr[n + 1] = fixNaN((float)v2); + ctx->fr[n + 2] = fixNaN((float)v3); + ctx->fr[n + 3] = fixNaN((float)v4); } else { diff --git a/core/hw/sh4/interpr/sh4_interpreter.cpp b/core/hw/sh4/interpr/sh4_interpreter.cpp index 6bd3d4970..6b826463e 100644 --- a/core/hw/sh4/interpr/sh4_interpreter.cpp +++ b/core/hw/sh4/interpr/sh4_interpreter.cpp @@ -14,41 +14,34 @@ #include "debug/gdb_server.h" #include "../sh4_cycles.h" -// SH4 underclock factor when using the interpreter so that it's somewhat usable -#ifdef STRICT_MODE -constexpr int CPU_RATIO = 1; -#else -constexpr int CPU_RATIO = 8; -#endif - Sh4ICache icache; Sh4OCache ocache; -Sh4Cycles sh4cycles(CPU_RATIO); +Sh4Interpreter *Sh4Interpreter::Instance; -static void ExecuteOpcode(u16 op) +void Sh4Interpreter::ExecuteOpcode(u16 op) { - if (sr.FD == 1 && OpDesc[op]->IsFloatingPoint()) - RaiseFPUDisableException(); - OpPtr[op](op); + if (ctx->sr.FD == 1 && OpDesc[op]->IsFloatingPoint()) + throw SH4ThrownException(ctx->pc - 2, Sh4Ex_FpuDisabled); + OpPtr[op](ctx, op); sh4cycles.executeCycles(op); } -static u16 ReadNexOp() +u16 Sh4Interpreter::ReadNexOp() { - if (!mmu_enabled() && (next_pc & 1)) + u32 addr = ctx->pc; + if (!mmu_enabled() && (addr & 1)) // address error - throw SH4ThrownException(next_pc, Sh4Ex_AddressErrorRead); + throw SH4ThrownException(addr, Sh4Ex_AddressErrorRead); - u32 addr = next_pc; - next_pc += 2; + ctx->pc = addr + 2; return IReadMem16(addr); } -static void Sh4_int_Run() +void Sh4Interpreter::Run() { - sh4_int_bCpuRun = true; - RestoreHostRoundingMode(); + Instance = this; + ctx->restoreHostRoundingMode(); try { do @@ -59,31 +52,38 @@ static void Sh4_int_Run() u32 op = ReadNexOp(); ExecuteOpcode(op); - } while (p_sh4rcb->cntx.cycle_counter > 0); - p_sh4rcb->cntx.cycle_counter += SH4_TIMESLICE; + } while (ctx->cycle_counter > 0); + ctx->cycle_counter += SH4_TIMESLICE; UpdateSystem_INTC(); } catch (const SH4ThrownException& ex) { Do_Exception(ex.epc, ex.expEvn); // an exception requires the instruction pipeline to drain, so approx 5 cycles sh4cycles.addCycles(5 * CPU_RATIO); } - } while (sh4_int_bCpuRun); + } while (ctx->CpuRunning); } catch (const debugger::Stop&) { } - sh4_int_bCpuRun = false; + ctx->CpuRunning = false; + Instance = nullptr; +} + +void Sh4Interpreter::Start() +{ + ctx->CpuRunning = true; } -static void Sh4_int_Stop() +void Sh4Interpreter::Stop() { - sh4_int_bCpuRun = false; + ctx->CpuRunning = false; } -static void Sh4_int_Step() +void Sh4Interpreter::Step() { - verify(!sh4_int_bCpuRun); + verify(!ctx->CpuRunning); + Instance = this; - RestoreHostRoundingMode(); + ctx->restoreHostRoundingMode(); try { u32 op = ReadNexOp(); ExecuteOpcode(op); @@ -93,48 +93,49 @@ static void Sh4_int_Step() sh4cycles.addCycles(5 * CPU_RATIO); } catch (const debugger::Stop&) { } + Instance = nullptr; } -static void Sh4_int_Reset(bool hard) +void Sh4Interpreter::Reset(bool hard) { - verify(!sh4_int_bCpuRun); + verify(!ctx->CpuRunning); if (hard) { - int schedNext = p_sh4rcb->cntx.sh4_sched_next; - memset(&p_sh4rcb->cntx, 0, sizeof(p_sh4rcb->cntx)); - p_sh4rcb->cntx.sh4_sched_next = schedNext; + int schedNext = ctx->sh4_sched_next; + memset(ctx, 0, sizeof(*ctx)); + ctx->sh4_sched_next = schedNext; } - next_pc = 0xA0000000; + ctx->pc = 0xA0000000; - memset(r,0,sizeof(r)); - memset(r_bank,0,sizeof(r_bank)); + memset(ctx->r, 0, sizeof(ctx->r)); + memset(ctx->r_bank, 0, sizeof(ctx->r_bank)); - gbr=ssr=spc=sgr=dbr=vbr=0; - mac.full=pr=fpul=0; + ctx->gbr = ctx->ssr = ctx->spc = ctx->sgr = ctx->dbr = ctx->vbr = 0; + ctx->mac.full = ctx->pr = ctx->fpul = 0; - sh4_sr_SetFull(0x700000F0); - old_sr.status=sr.status; + ctx->sr.setFull(0x700000F0); + ctx->old_sr.status = ctx->sr.status; UpdateSR(); - fpscr.full = 0x00040001; - old_fpscr=fpscr; - UpdateFPSCR(); + ctx->fpscr.full = 0x00040001; + ctx->old_fpscr = ctx->fpscr; + icache.Reset(hard); ocache.Reset(hard); sh4cycles.reset(); - p_sh4rcb->cntx.cycle_counter = SH4_TIMESLICE; + ctx->cycle_counter = SH4_TIMESLICE; INFO_LOG(INTERPRETER, "Sh4 Reset"); } -static bool Sh4_int_IsCpuRunning() +bool Sh4Interpreter::IsCpuRunning() { - return sh4_int_bCpuRun; + return ctx->CpuRunning; } //TODO : Check for valid delayslot instruction -void ExecuteDelayslot() +void Sh4Interpreter::ExecuteDelayslot() { try { u32 op = ReadNexOp(); @@ -144,12 +145,12 @@ void ExecuteDelayslot() AdjustDelaySlotException(ex); throw ex; } catch (const debugger::Stop& e) { - next_pc -= 2; // break on previous instruction + ctx->pc -= 2; // break on previous instruction throw e; } } -void ExecuteDelayslot_RTE() +void Sh4Interpreter::ExecuteDelayslot_RTE() { try { // In an RTE delay slot, status register (SR) bits are referenced as follows. @@ -159,60 +160,45 @@ void ExecuteDelayslot_RTE() // instruction execution. The STC and STC.L SR instructions access all SR bits after modification. u32 op = ReadNexOp(); // Now restore all SR bits - sh4_sr_SetFull(ssr); + ctx->sr.setFull(ctx->ssr); // And execute ExecuteOpcode(op); } catch (const SH4ThrownException&) { throw FlycastException("Fatal: SH4 exception in RTE delay slot"); } catch (const debugger::Stop& e) { - next_pc -= 2; // break on previous instruction + ctx->pc -= 2; // break on previous instruction throw e; } } // every SH4_TIMESLICE cycles -int UpdateSystem() +int UpdateSystem_INTC() { Sh4cntx.sh4_sched_next -= SH4_TIMESLICE; if (Sh4cntx.sh4_sched_next < 0) sh4_sched_tick(SH4_TIMESLICE); - - return Sh4cntx.interrupt_pend; -} - -int UpdateSystem_INTC() -{ - if (UpdateSystem()) + if (Sh4cntx.interrupt_pend) return UpdateINTC(); else return 0; } -static void sh4_int_resetcache() { -} - -static void Sh4_int_Init() +void Sh4Interpreter::Init() { - static_assert(sizeof(Sh4cntx) == 448, "Invalid Sh4Cntx size"); - - memset(&p_sh4rcb->cntx, 0, sizeof(p_sh4rcb->cntx)); + ctx = &p_sh4rcb->cntx; + memset(ctx, 0, sizeof(*ctx)); + sh4cycles.init(ctx); + icache.init(ctx); + ocache.init(ctx); } -static void Sh4_int_Term() +void Sh4Interpreter::Term() { - Sh4_int_Stop(); + Stop(); INFO_LOG(INTERPRETER, "Sh4 Term"); } -void Get_Sh4Interpreter(sh4_if* cpu) +Sh4Executor *Get_Sh4Interpreter() { - cpu->Run = Sh4_int_Run; - cpu->Stop = Sh4_int_Stop; - cpu->Step = Sh4_int_Step; - cpu->Reset = Sh4_int_Reset; - cpu->Init = Sh4_int_Init; - cpu->Term = Sh4_int_Term; - cpu->IsCpuRunning = Sh4_int_IsCpuRunning; - - cpu->ResetCache = sh4_int_resetcache; + return new Sh4Interpreter(); } diff --git a/core/hw/sh4/interpr/sh4_opcodes.cpp b/core/hw/sh4/interpr/sh4_opcodes.cpp index 13f334238..26df085e0 100644 --- a/core/hw/sh4/interpr/sh4_opcodes.cpp +++ b/core/hw/sh4/interpr/sh4_opcodes.cpp @@ -3,7 +3,6 @@ */ #include "types.h" -#include "hw/sh4/sh4_interpreter.h" #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_mmr.h" #include "hw/sh4/sh4_core.h" @@ -11,13 +10,12 @@ #include "hw/sh4/sh4_interrupts.h" #include "debug/gdb_server.h" #include "hw/sh4/dyna/decoder.h" +#include "emulator.h" #ifdef STRICT_MODE #include "hw/sh4/sh4_cache.h" #endif -#define iNimp cpu_iNimp - //Read Mem macros #define ReadMemU32(to,addr) to=ReadMem32(addr) @@ -41,17 +39,12 @@ #define WriteMemBOU8(addr,offset,data) WriteMemU8(addr+offset,data) // 0xxx -void cpu_iNimp(u32 op, const char* info) -{ - ERROR_LOG(INTERPRETER, "Unimplemented opcode: %08X next_pc: %08X pr: %08X msg: %s", op, next_pc, pr, info); - die("iNimp reached\n"); -} //stc GBR, sh4op(i0000_nnnn_0001_0010) { u32 n = GetN(op); - r[n] = gbr; + ctx->r[n] = ctx->gbr; } @@ -59,7 +52,7 @@ sh4op(i0000_nnnn_0001_0010) sh4op(i0000_nnnn_0010_0010) { u32 n = GetN(op); - r[n] = vbr; + ctx->r[n] = ctx->vbr; } @@ -67,21 +60,21 @@ sh4op(i0000_nnnn_0010_0010) sh4op(i0000_nnnn_0011_0010) { u32 n = GetN(op); - r[n] = ssr; + ctx->r[n] = ctx->ssr; } //stc SGR, sh4op(i0000_nnnn_0011_1010) { u32 n = GetN(op); - r[n] = sgr; + ctx->r[n] = ctx->sgr; } //stc SPC, sh4op(i0000_nnnn_0100_0010) { u32 n = GetN(op); - r[n] = spc; + ctx->r[n] = ctx->spc; } @@ -90,21 +83,21 @@ sh4op(i0000_nnnn_1mmm_0010) { u32 n = GetN(op); u32 m = GetM(op) & 0x7; - r[n] = r_bank[m]; + ctx->r[n] = ctx->r_bank[m]; } //sts FPUL, sh4op(i0000_nnnn_0101_1010) { u32 n = GetN(op); - r[n] = fpul; + ctx->r[n] = ctx->fpul; } //stc DBR, sh4op(i0000_nnnn_1111_1010) { u32 n = GetN(op); - r[n] = dbr; + ctx->r[n] = ctx->dbr; } @@ -112,7 +105,7 @@ sh4op(i0000_nnnn_1111_1010) sh4op(i0000_nnnn_0000_1010) { u32 n = GetN(op); - r[n] = mac.h; + ctx->r[n] = ctx->mac.h; } @@ -120,7 +113,7 @@ sh4op(i0000_nnnn_0000_1010) sh4op(i0000_nnnn_0001_1010) { u32 n = GetN(op); - r[n]=mac.l; + ctx->r[n] = ctx->mac.l; } @@ -128,7 +121,7 @@ sh4op(i0000_nnnn_0001_1010) sh4op(i0000_nnnn_0010_1010) { u32 n = GetN(op); - r[n] = pr; + ctx->r[n] = ctx->pr; } @@ -137,7 +130,7 @@ sh4op(i0000_nnnn_mmmm_1100) { u32 n = GetN(op); u32 m = GetM(op); - ReadMemBOS8(r[n],r[0],r[m]); + ReadMemBOS8(ctx->r[n], ctx->r[0], ctx->r[m]); } @@ -146,7 +139,7 @@ sh4op(i0000_nnnn_mmmm_1101) { u32 n = GetN(op); u32 m = GetM(op); - ReadMemBOS16(r[n],r[0],r[m]); + ReadMemBOS16(ctx->r[n], ctx->r[0], ctx->r[m]); } @@ -156,7 +149,7 @@ sh4op(i0000_nnnn_mmmm_1110) u32 n = GetN(op); u32 m = GetM(op); - ReadMemBOU32(r[n],r[0],r[m]); + ReadMemBOU32(ctx->r[n], ctx->r[0], ctx->r[m]); } //mov.b ,@(R0,) @@ -165,7 +158,7 @@ sh4op(i0000_nnnn_mmmm_0100) u32 n = GetN(op); u32 m = GetM(op); - WriteMemBOU8(r[0],r[n], r[m]); + WriteMemBOU8(ctx->r[0], ctx->r[n], ctx->r[m]); } @@ -174,7 +167,7 @@ sh4op(i0000_nnnn_mmmm_0101) { u32 n = GetN(op); u32 m = GetM(op); - WriteMemBOU16(r[0] , r[n], r[m]); + WriteMemBOU16(ctx->r[0] , ctx->r[n], ctx->r[m]); } @@ -183,11 +176,10 @@ sh4op(i0000_nnnn_mmmm_0110) { u32 n = GetN(op); u32 m = GetM(op); - WriteMemBOU32(r[0], r[n], r[m]); + WriteMemBOU32(ctx->r[0], ctx->r[n], ctx->r[m]); } - // // 1xxx @@ -197,7 +189,7 @@ sh4op(i0001_nnnn_mmmm_iiii) u32 n = GetN(op); u32 m = GetM(op); u32 disp = GetImm4(op); - WriteMemBOU32(r[n] , (disp <<2), r[m]); + WriteMemBOU32(ctx->r[n] , (disp <<2), ctx->r[m]); } // @@ -208,7 +200,7 @@ sh4op(i0010_nnnn_mmmm_0000) { u32 n = GetN(op); u32 m = GetM(op); - WriteMemU8(r[n],r[m] ); + WriteMemU8(ctx->r[n], ctx->r[m]); } // mov.w ,@ @@ -216,7 +208,7 @@ sh4op(i0010_nnnn_mmmm_0001) { u32 n = GetN(op); u32 m = GetM(op); - WriteMemU16(r[n],r[m]); + WriteMemU16(ctx->r[n], ctx->r[m]); } // mov.l ,@ @@ -224,7 +216,7 @@ sh4op(i0010_nnnn_mmmm_0010) { u32 n = GetN(op); u32 m = GetM(op); - WriteMemU32(r[n],r[m]); + WriteMemU32(ctx->r[n], ctx->r[m]); } // mov.b ,@- @@ -233,9 +225,9 @@ sh4op(i0010_nnnn_mmmm_0100) u32 n = GetN(op); u32 m = GetM(op); - u32 addr = r[n] - 1; - WriteMemBOU8(r[n], (u32)-1, r[m]); - r[n] = addr; + u32 addr = ctx->r[n] - 1; + WriteMemBOU8(ctx->r[n], (u32)-1, ctx->r[m]); + ctx->r[n] = addr; } //mov.w ,@- @@ -244,9 +236,9 @@ sh4op(i0010_nnnn_mmmm_0101) u32 n = GetN(op); u32 m = GetM(op); - u32 addr = r[n] - 2; - WriteMemU16(addr, r[m]); - r[n] = addr; + u32 addr = ctx->r[n] - 2; + WriteMemU16(addr, ctx->r[m]); + ctx->r[n] = addr; } //mov.l ,@- @@ -255,21 +247,21 @@ sh4op(i0010_nnnn_mmmm_0110) u32 n = GetN(op); u32 m = GetM(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, r[m]); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->r[m]); + ctx->r[n] = addr; } - // +// // 4xxx //sts.l FPUL,@- sh4op(i0100_nnnn_0101_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, fpul); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->fpul); + ctx->r[n] = addr; } //sts.l MACH,@- @@ -277,9 +269,9 @@ sh4op(i0100_nnnn_0000_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, mac.h); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->mac.h); + ctx->r[n] = addr; } @@ -288,9 +280,9 @@ sh4op(i0100_nnnn_0001_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, mac.l); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->mac.l); + ctx->r[n] = addr; } @@ -299,9 +291,9 @@ sh4op(i0100_nnnn_0010_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr,pr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->pr); + ctx->r[n] = addr; } //sts.l DBR,@- @@ -309,9 +301,9 @@ sh4op(i0100_nnnn_1111_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr,dbr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->dbr); + ctx->r[n] = addr; } //stc.l GBR,@- @@ -319,9 +311,9 @@ sh4op(i0100_nnnn_0001_0011) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, gbr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->gbr); + ctx->r[n] = addr; } @@ -330,9 +322,9 @@ sh4op(i0100_nnnn_0010_0011) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, vbr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->vbr); + ctx->r[n] = addr; } @@ -341,18 +333,18 @@ sh4op(i0100_nnnn_0011_0011) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, ssr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->ssr); + ctx->r[n] = addr; } //stc.l SGR,@- sh4op(i0100_nnnn_0011_0010) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, sgr); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->sgr); + ctx->r[n] = addr; } @@ -361,9 +353,9 @@ sh4op(i0100_nnnn_0100_0011) { u32 n = GetN(op); - u32 addr = r[n] - 4; - WriteMemU32(addr, spc); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->spc); + ctx->r[n] = addr; } //stc RM_BANK,@- @@ -372,20 +364,19 @@ sh4op(i0100_nnnn_1mmm_0011) u32 n = GetN(op); u32 m = GetM(op) & 0x07; - u32 addr = r[n] - 4; - WriteMemU32(addr, r_bank[m]); - r[n] = addr; + u32 addr = ctx->r[n] - 4; + WriteMemU32(addr, ctx->r_bank[m]); + ctx->r[n] = addr; } - //lds.l @+,MACH sh4op(i0100_nnnn_0000_0110) { u32 n = GetN(op); - ReadMemU32(mac.h,r[n]); + ReadMemU32(ctx->mac.h, ctx->r[n]); - r[n] += 4; + ctx->r[n] += 4; } @@ -393,9 +384,9 @@ sh4op(i0100_nnnn_0000_0110) sh4op(i0100_nnnn_0001_0110) { u32 n = GetN(op); - ReadMemU32(mac.l,r[n]); + ReadMemU32(ctx->mac.l, ctx->r[n]); - r[n] += 4; + ctx->r[n] += 4; } @@ -403,9 +394,9 @@ sh4op(i0100_nnnn_0001_0110) sh4op(i0100_nnnn_0010_0110) { u32 n = GetN(op); - ReadMemU32(pr,r[n]); + ReadMemU32(ctx->pr, ctx->r[n]); - r[n] += 4; + ctx->r[n] += 4; } @@ -414,8 +405,8 @@ sh4op(i0100_nnnn_0101_0110) { u32 n = GetN(op); - ReadMemU32(fpul,r[n]); - r[n] += 4; + ReadMemU32(ctx->fpul, ctx->r[n]); + ctx->r[n] += 4; } //lds.l @+,DBR @@ -423,8 +414,8 @@ sh4op(i0100_nnnn_1111_0110) { u32 n = GetN(op); - ReadMemU32(dbr,r[n]); - r[n] += 4; + ReadMemU32(ctx->dbr, ctx->r[n]); + ctx->r[n] += 4; } @@ -433,8 +424,8 @@ sh4op(i0100_nnnn_0001_0111) { u32 n = GetN(op); - ReadMemU32(gbr,r[n]); - r[n] += 4; + ReadMemU32(ctx->gbr, ctx->r[n]); + ctx->r[n] += 4; } @@ -443,8 +434,8 @@ sh4op(i0100_nnnn_0010_0111) { u32 n = GetN(op); - ReadMemU32(vbr,r[n]); - r[n] += 4; + ReadMemU32(ctx->vbr, ctx->r[n]); + ctx->r[n] += 4; } @@ -453,8 +444,8 @@ sh4op(i0100_nnnn_0011_0111) { u32 n = GetN(op); - ReadMemU32(ssr,r[n]); - r[n] += 4; + ReadMemU32(ctx->ssr, ctx->r[n]); + ctx->r[n] += 4; } //ldc.l @+,SGR @@ -462,8 +453,8 @@ sh4op(i0100_nnnn_0011_0110) { u32 n = GetN(op); - ReadMemU32(sgr,r[n]); - r[n] += 4; + ReadMemU32(ctx->sgr, ctx->r[n]); + ctx->r[n] += 4; } //ldc.l @+,SPC @@ -471,8 +462,8 @@ sh4op(i0100_nnnn_0100_0111) { u32 n = GetN(op); - ReadMemU32(spc,r[n]); - r[n] += 4; + ReadMemU32(ctx->spc, ctx->r[n]); + ctx->r[n] += 4; } @@ -482,15 +473,15 @@ sh4op(i0100_nnnn_1mmm_0111) u32 n = GetN(op); u32 m = GetM(op) & 7; - ReadMemU32(r_bank[m],r[n]); - r[n] += 4; + ReadMemU32(ctx->r_bank[m], ctx->r[n]); + ctx->r[n] += 4; } //lds ,MACH sh4op(i0100_nnnn_0000_1010) { u32 n = GetN(op); - mac.h = r[n]; + ctx->mac.h = ctx->r[n]; } @@ -498,7 +489,7 @@ sh4op(i0100_nnnn_0000_1010) sh4op(i0100_nnnn_0001_1010) { u32 n = GetN(op); - mac.l = r[n]; + ctx->mac.l = ctx->r[n]; } @@ -506,7 +497,7 @@ sh4op(i0100_nnnn_0001_1010) sh4op(i0100_nnnn_0010_1010) { u32 n = GetN(op); - pr = r[n]; + ctx->pr = ctx->r[n]; } @@ -514,27 +505,23 @@ sh4op(i0100_nnnn_0010_1010) sh4op(i0100_nnnn_0101_1010) { u32 n = GetN(op); - fpul =r[n]; + ctx->fpul = ctx->r[n]; } - - //ldc ,DBR sh4op(i0100_nnnn_1111_1010) { u32 n = GetN(op); - dbr = r[n]; + ctx->dbr = ctx->r[n]; } - - //ldc ,GBR sh4op(i0100_nnnn_0001_1110) { u32 n = GetN(op); - gbr = r[n]; + ctx->gbr = ctx->r[n]; } @@ -543,7 +530,7 @@ sh4op(i0100_nnnn_0010_1110) { u32 n = GetN(op); - vbr = r[n]; + ctx->vbr = ctx->r[n]; } @@ -552,7 +539,7 @@ sh4op(i0100_nnnn_0011_1110) { u32 n = GetN(op); - ssr = r[n]; + ctx->ssr = ctx->r[n]; } //ldc ,SGR @@ -560,7 +547,7 @@ sh4op(i0100_nnnn_0011_1010) { u32 n = GetN(op); - sgr = r[n]; + ctx->sgr = ctx->r[n]; } //ldc ,SPC @@ -568,7 +555,7 @@ sh4op(i0100_nnnn_0100_1110) { u32 n = GetN(op); - spc = r[n]; + ctx->spc = ctx->r[n]; } @@ -578,10 +565,10 @@ sh4op(i0100_nnnn_1mmm_1110) u32 n = GetN(op); u32 m = GetM(op) & 7; - r_bank[m] = r[n]; + ctx->r_bank[m] = ctx->r[n]; } - // +// // 5xxx //mov.l @(,), @@ -591,7 +578,7 @@ sh4op(i0101_nnnn_mmmm_iiii) u32 m = GetM(op); u32 disp = GetImm4(op) << 2; - ReadMemBOU32(r[n],r[m],disp); + ReadMemBOU32(ctx->r[n], ctx->r[m], disp); } // @@ -602,7 +589,7 @@ sh4op(i0110_nnnn_mmmm_0000) u32 n = GetN(op); u32 m = GetM(op); - ReadMemS8(r[n],r[m]); + ReadMemS8(ctx->r[n], ctx->r[m]); } @@ -611,7 +598,7 @@ sh4op(i0110_nnnn_mmmm_0001) { u32 n = GetN(op); u32 m = GetM(op); - ReadMemS16(r[n] ,r[m]); + ReadMemS16(ctx->r[n], ctx->r[m]); } @@ -621,7 +608,7 @@ sh4op(i0110_nnnn_mmmm_0010) u32 n = GetN(op); u32 m = GetM(op); - ReadMemU32(r[n],r[m]); + ReadMemU32(ctx->r[n], ctx->r[m]); } @@ -630,7 +617,7 @@ sh4op(i0110_nnnn_mmmm_0011) { u32 n = GetN(op); u32 m = GetM(op); - r[n] = r[m]; + ctx->r[n] = ctx->r[m]; } @@ -639,9 +626,9 @@ sh4op(i0110_nnnn_mmmm_0100) { u32 n = GetN(op); u32 m = GetM(op); - ReadMemS8(r[n],r[m]); + ReadMemS8(ctx->r[n], ctx->r[m]); if (n != m) - r[m] += 1; + ctx->r[m] += 1; } @@ -650,9 +637,9 @@ sh4op(i0110_nnnn_mmmm_0101) { u32 n = GetN(op); u32 m = GetM(op); - ReadMemS16(r[n],r[m]); + ReadMemS16(ctx->r[n], ctx->r[m]); if (n != m) - r[m] += 2; + ctx->r[m] += 2; } @@ -663,19 +650,19 @@ sh4op(i0110_nnnn_mmmm_0110) u32 m = GetM(op); - ReadMemU32(r[n],r[m]); + ReadMemU32(ctx->r[n], ctx->r[m]); if (n != m) - r[m] += 4; + ctx->r[m] += 4; } // //8xxx - // mov.b R0,@(,) +// mov.b R0,@(,) sh4op(i1000_0000_mmmm_iiii) { u32 n = GetM(op); u32 disp = GetImm4(op); - WriteMemBOU8(r[n],disp,r[0]); + WriteMemBOU8(ctx->r[n], disp, ctx->r[0]); } @@ -684,7 +671,7 @@ sh4op(i1000_0001_mmmm_iiii) { u32 disp = GetImm4(op); u32 m = GetM(op); - WriteMemBOU16(r[m] , (disp << 1),r[0]); + WriteMemBOU16(ctx->r[m], (disp << 1), ctx->r[0]); } @@ -693,7 +680,7 @@ sh4op(i1000_0100_mmmm_iiii) { u32 disp = GetImm4(op); u32 m = GetM(op); - ReadMemBOS8(r[0] ,r[m] , disp); + ReadMemBOS8(ctx->r[0], ctx->r[m] , disp); } @@ -702,10 +689,10 @@ sh4op(i1000_0101_mmmm_iiii) { u32 disp = GetImm4(op); u32 m = GetM(op); - ReadMemBOS16(r[0],r[m] , (disp << 1)); + ReadMemBOS16(ctx->r[0], ctx->r[m], (disp << 1)); } - // +// // 9xxx //mov.w @(,PC), @@ -713,17 +700,17 @@ sh4op(i1001_nnnn_iiii_iiii) { u32 n = GetN(op); u32 disp = GetImm8(op); - ReadMemS16(r[n],(disp<<1) + next_pc + 2); + ReadMemS16(ctx->r[n], (disp << 1) + ctx->pc + 2); } - // +// // Cxxx // mov.b R0,@(,GBR) sh4op(i1100_0000_iiii_iiii) { u32 disp = GetImm8(op); - WriteMemBOU8(gbr, disp, r[0]); + WriteMemBOU8(ctx->gbr, disp, ctx->r[0]); } @@ -731,7 +718,7 @@ sh4op(i1100_0000_iiii_iiii) sh4op(i1100_0001_iiii_iiii) { u32 disp = GetImm8(op); - WriteMemBOU16(gbr, (disp << 1), r[0]); + WriteMemBOU16(ctx->gbr, (disp << 1), ctx->r[0]); } @@ -739,14 +726,14 @@ sh4op(i1100_0001_iiii_iiii) sh4op(i1100_0010_iiii_iiii) { u32 disp = GetImm8(op); - WriteMemBOU32(gbr, (disp << 2), r[0]); + WriteMemBOU32(ctx->gbr, (disp << 2), ctx->r[0]); } // mov.b @(,GBR),R0 sh4op(i1100_0100_iiii_iiii) { u32 disp = GetImm8(op); - ReadMemBOS8(r[0],gbr,disp); + ReadMemBOS8(ctx->r[0], ctx->gbr, disp); } @@ -754,7 +741,7 @@ sh4op(i1100_0100_iiii_iiii) sh4op(i1100_0101_iiii_iiii) { u32 disp = GetImm8(op); - ReadMemBOS16(r[0],gbr,(disp<<1)); + ReadMemBOS16(ctx->r[0], ctx->gbr, (disp << 1)); } @@ -763,14 +750,14 @@ sh4op(i1100_0110_iiii_iiii) { u32 disp = GetImm8(op); - ReadMemBOU32(r[0],gbr,(disp<<2)); + ReadMemBOU32(ctx->r[0], ctx->gbr, (disp << 2)); } // mova @(,PC),R0 sh4op(i1100_0111_iiii_iiii) { - r[0] = ((next_pc+2)&0xFFFFFFFC)+(GetImm8(op)<<2); + ctx->r[0] = ((ctx->pc + 2) & 0xFFFFFFFC) + (GetImm8(op) << 2); } // @@ -780,10 +767,11 @@ sh4op(i1100_0111_iiii_iiii) sh4op(i1101_nnnn_iiii_iiii) { u32 n = GetN(op); - u32 disp = (GetImm8(op)); + u32 disp = GetImm8(op); - ReadMemU32(r[n],(disp<<2) + ((next_pc+2) & 0xFFFFFFFC)); + ReadMemU32(ctx->r[n], (disp << 2) + ((ctx->pc + 2) & 0xFFFFFFFC)); } + // // Exxx @@ -791,7 +779,7 @@ sh4op(i1101_nnnn_iiii_iiii) sh4op(i1110_nnnn_iiii_iiii) { u32 n = GetN(op); - r[n] = (u32)(s32)(s8)(GetSImm8(op)); + ctx->r[n] = (u32)(s32)(s8)GetSImm8(op); } @@ -799,35 +787,40 @@ sh4op(i1110_nnnn_iiii_iiii) sh4op(i0000_nnnn_1100_0011) { u32 n = GetN(op); - WriteMemU32(r[n],r[0]);//at r[n],r[0] + WriteMemU32(ctx->r[n], ctx->r[0]); // TODO ocache } //clrmac sh4op(i0000_0000_0010_1000) { - mac.full=0; + ctx->mac.full = 0; +} + +static void executeDelaySlot() { + Sh4Interpreter::Instance->ExecuteDelayslot(); } //braf sh4op(i0000_nnnn_0010_0011) { u32 n = GetN(op); - u32 newpc = r[n] + next_pc + 2;// - ExecuteDelayslot(); //WARN : r[n] can change here - next_pc = newpc; + u32 newpc = ctx->r[n] + ctx->pc + 2; + executeDelaySlot(); //WARN : r[n] can change here + ctx->pc = newpc; } + //bsrf sh4op(i0000_nnnn_0000_0011) { u32 n = GetN(op); - u32 newpc = r[n] + next_pc +2; - u32 newpr = next_pc + 2; + u32 newpc = ctx->r[n] + ctx->pc +2; + u32 newpr = ctx->pc + 2; - ExecuteDelayslot(); //WARN : pr and r[n] can change here + executeDelaySlot(); //WARN : pr and r[n] can change here - pr = newpr; - next_pc = newpc; + ctx->pr = newpr; + ctx->pc = newpc; debugger::subroutineCall(); } @@ -835,9 +828,9 @@ sh4op(i0000_nnnn_0000_0011) //rte sh4op(i0000_0000_0010_1011) { - u32 newpc = spc; - ExecuteDelayslot_RTE(); - next_pc = newpc; + u32 newpc = ctx->spc; + Sh4Interpreter::Instance->ExecuteDelayslot_RTE(); + ctx->pc = newpc; if (UpdateSR()) UpdateINTC(); debugger::subroutineReturn(); @@ -847,23 +840,24 @@ sh4op(i0000_0000_0010_1011) //rts sh4op(i0000_0000_0000_1011) { - u32 newpc=pr; - ExecuteDelayslot(); //WARN : pr can change here - next_pc=newpc; + u32 newpc = ctx->pr; + executeDelaySlot(); //WARN : pr can change here + ctx->pc = newpc; debugger::subroutineReturn(); } -u32 branch_target_s8(u32 op) +u32 branch_target_s8(Sh4Context *ctx, u32 op) { - return GetSImm8(op)*2 + 2 + next_pc; + return GetSImm8(op) * 2 + 2 + ctx->pc; } + // bf sh4op(i1000_1011_iiii_iiii) { - if (sr.T==0) + if (ctx->sr.T == 0) { //direct jump - next_pc = branch_target_s8(op); + ctx->pc = branch_target_s8(ctx, op); } } @@ -871,12 +865,12 @@ sh4op(i1000_1011_iiii_iiii) // bf.s sh4op(i1000_1111_iiii_iiii) { - if (sr.T==0) + if (ctx->sr.T == 0) { //delay 1 instruction - u32 newpc=branch_target_s8(op); - ExecuteDelayslot(); - next_pc = newpc; + u32 newpc = branch_target_s8(ctx, op); + executeDelaySlot(); + ctx->pc = newpc; } } @@ -884,10 +878,10 @@ sh4op(i1000_1111_iiii_iiii) // bt sh4op(i1000_1001_iiii_iiii) { - if (sr.T != 0) + if (ctx->sr.T != 0) { //direct jump - next_pc = branch_target_s8(op); + ctx->pc = branch_target_s8(ctx, op); } } @@ -895,37 +889,37 @@ sh4op(i1000_1001_iiii_iiii) // bt.s sh4op(i1000_1101_iiii_iiii) { - if (sr.T != 0) + if (ctx->sr.T != 0) { //delay 1 instruction - u32 newpc=branch_target_s8(op); - ExecuteDelayslot(); - next_pc = newpc; + u32 newpc = branch_target_s8(ctx, op); + executeDelaySlot(); + ctx->pc = newpc; } } -u32 branch_target_s12(u32 op) +static u32 branch_target_s12(Sh4Context *ctx, u32 op) { - return GetSImm12(op)*2 + 2 + next_pc; + return GetSImm12(op) * 2 + 2 + ctx->pc; } // bra sh4op(i1010_iiii_iiii_iiii) { - u32 newpc = branch_target_s12(op); - ExecuteDelayslot(); - next_pc=newpc; + u32 newpc = branch_target_s12(ctx, op); + executeDelaySlot(); + ctx->pc = newpc; } // bsr sh4op(i1011_iiii_iiii_iiii) { - u32 newpr = next_pc + 2; //return after delayslot - u32 newpc = branch_target_s12(op); - ExecuteDelayslot(); + u32 newpr = ctx->pc + 2; //return after delayslot + u32 newpc = branch_target_s12(ctx, op); + executeDelaySlot(); - pr = newpr; - next_pc = newpc; + ctx->pr = newpr; + ctx->pc = newpc; debugger::subroutineCall(); } @@ -935,7 +929,7 @@ sh4op(i1100_0011_iiii_iiii) WARN_LOG(INTERPRETER, "TRAP #%X", GetImm8(op)); debugger::debugTrap(Sh4Ex_Trap); CCN_TRA = (GetImm8(op) << 2); - Do_Exception(next_pc, Sh4Ex_Trap); + Do_Exception(ctx->pc, Sh4Ex_Trap); } //jmp @ @@ -943,9 +937,9 @@ sh4op(i0100_nnnn_0010_1011) { u32 n = GetN(op); - u32 newpc=r[n]; - ExecuteDelayslot(); //r[n] can change here - next_pc=newpc; + u32 newpc = ctx->r[n]; + executeDelaySlot(); //r[n] can change here + ctx->pc = newpc; } //jsr @ @@ -953,12 +947,12 @@ sh4op(i0100_nnnn_0000_1011) { u32 n = GetN(op); - u32 newpr = next_pc + 2; //return after delayslot - u32 newpc= r[n]; - ExecuteDelayslot(); //r[n]/pr can change here + u32 newpr = ctx->pc + 2; //return after delayslot + u32 newpc = ctx->r[n]; + executeDelaySlot(); //r[n]/pr can change here - pr = newpr; - next_pc = newpc; + ctx->pr = newpr; + ctx->pc = newpc; debugger::subroutineCall(); } @@ -966,8 +960,7 @@ sh4op(i0100_nnnn_0000_1011) sh4op(i0000_0000_0001_1011) { //just wait for an Interrupt - - int i=0,s=1; + int i = 0, s = 1; while (!UpdateSystem_INTC())//448 { @@ -978,9 +971,8 @@ sh4op(i0000_0000_0001_1011) } } //if not Interrupted , we must rexecute the sleep - if (s==0) - next_pc-=2;// re execute sleep - + if (s == 0) + ctx->pc -= 2;// re execute sleep } @@ -989,7 +981,7 @@ sh4op(i0011_nnnn_mmmm_1000) { u32 n = GetN(op); u32 m = GetM(op); - r[n] -=r[m]; + ctx->r[n] -= ctx->r[m]; } //add , @@ -997,10 +989,10 @@ sh4op(i0011_nnnn_mmmm_1100) { u32 n = GetN(op); u32 m = GetM(op); - r[n] +=r[m]; + ctx->r[n] += ctx->r[m]; } - // +// // 7xxx //add #, @@ -1008,7 +1000,7 @@ sh4op(i0111_nnnn_iiii_iiii) { u32 n = GetN(op); s32 stmp1 = GetSImm8(op); - r[n] +=stmp1; + ctx->r[n] += stmp1; } //Bitwise logical operations @@ -1019,7 +1011,7 @@ sh4op(i0010_nnnn_mmmm_1001) { u32 n = GetN(op); u32 m = GetM(op); - r[n] &= r[m]; + ctx->r[n] &= ctx->r[m]; } //xor , @@ -1027,7 +1019,7 @@ sh4op(i0010_nnnn_mmmm_1010) { u32 n = GetN(op); u32 m = GetM(op); - r[n] ^= r[m]; + ctx->r[n] ^= ctx->r[m]; } //or , @@ -1035,7 +1027,7 @@ sh4op(i0010_nnnn_mmmm_1011) { u32 n = GetN(op); u32 m = GetM(op); - r[n] |= r[m]; + ctx->r[n] |= ctx->r[m]; } @@ -1043,7 +1035,7 @@ sh4op(i0010_nnnn_mmmm_1011) sh4op(i0100_nnnn_0000_1000) { u32 n = GetN(op); - r[n] <<= 2; + ctx->r[n] <<= 2; } @@ -1051,7 +1043,7 @@ sh4op(i0100_nnnn_0000_1000) sh4op(i0100_nnnn_0001_1000) { u32 n = GetN(op); - r[n] <<= 8; + ctx->r[n] <<= 8; } @@ -1059,7 +1051,7 @@ sh4op(i0100_nnnn_0001_1000) sh4op(i0100_nnnn_0010_1000) { u32 n = GetN(op); - r[n] <<= 16; + ctx->r[n] <<= 16; } @@ -1067,7 +1059,7 @@ sh4op(i0100_nnnn_0010_1000) sh4op(i0100_nnnn_0000_1001) { u32 n = GetN(op); - r[n] >>= 2; + ctx->r[n] >>= 2; } @@ -1075,7 +1067,7 @@ sh4op(i0100_nnnn_0000_1001) sh4op(i0100_nnnn_0001_1001) { u32 n = GetN(op); - r[n] >>= 8; + ctx->r[n] >>= 8; } @@ -1083,22 +1075,22 @@ sh4op(i0100_nnnn_0001_1001) sh4op(i0100_nnnn_0010_1001) { u32 n = GetN(op); - r[n] >>= 16; + ctx->r[n] >>= 16; } // and #,R0 sh4op(i1100_1001_iiii_iiii) { u32 imm = GetImm8(op); - r[0] &= imm; + ctx->r[0] &= imm; } // xor #,R0 sh4op(i1100_1010_iiii_iiii) { - u32 imm = GetImm8(op); - r[0] ^= imm; + u32 imm = GetImm8(op); + ctx->r[0] ^= imm; } @@ -1106,7 +1098,7 @@ sh4op(i1100_1010_iiii_iiii) sh4op(i1100_1011_iiii_iiii) { u32 imm = GetImm8(op); - r[0] |= imm; + ctx->r[0] |= imm; } @@ -1130,7 +1122,7 @@ sh4op(i0000_0000_0011_1000) sh4op(i0000_nnnn_1001_0011) { #ifdef STRICT_MODE - ocache.WriteBack(r[GetN(op)], false, true); + ocache.WriteBack(ctx->r[GetN(op)], false, true); #endif } @@ -1138,7 +1130,7 @@ sh4op(i0000_nnnn_1001_0011) sh4op(i0000_nnnn_1010_0011) { #ifdef STRICT_MODE - ocache.WriteBack(r[GetN(op)], true, true); + ocache.WriteBack(ctx->r[GetN(op)], true, true); #endif } @@ -1146,7 +1138,7 @@ sh4op(i0000_nnnn_1010_0011) sh4op(i0000_nnnn_1011_0011) { #ifdef STRICT_MODE - ocache.WriteBack(r[GetN(op)], true, false); + ocache.WriteBack(ctx->r[GetN(op)], true, false); #endif } @@ -1154,14 +1146,11 @@ sh4op(i0000_nnnn_1011_0011) sh4op(i0000_nnnn_1000_0011) { u32 n = GetN(op); - u32 Dest = r[n]; + u32 Dest = ctx->r[n]; if ((Dest >> 26) == 0x38) // Store Queue { - if (CCN_MMUCR.AT) - do_sqw_mmu(Dest); - else - do_sqw_nommu(Dest, sq_both); + ctx->doSqWrite(Dest, ctx); } else { @@ -1176,32 +1165,32 @@ sh4op(i0000_nnnn_1000_0011) //sets sh4op(i0000_0000_0101_1000) { - sr.S = 1; + ctx->sr.S = 1; } //clrs sh4op(i0000_0000_0100_1000) { - sr.S = 0; + ctx->sr.S = 0; } //sett sh4op(i0000_0000_0001_1000) { - sr.T = 1; + ctx->sr.T = 1; } //clrt sh4op(i0000_0000_0000_1000) { - sr.T = 0; + ctx->sr.T = 0; } //movt sh4op(i0000_nnnn_0010_1001) { u32 n = GetN(op); - r[n] = sr.T; + ctx->r[n] = ctx->sr.T; } //************************ Reg Compares ************************ @@ -1210,30 +1199,30 @@ sh4op(i0100_nnnn_0001_0001) { u32 n = GetN(op); - if (((s32)r[n]) >= 0) - sr.T = 1; + if (((s32)ctx->r[n]) >= 0) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //cmp/pl sh4op(i0100_nnnn_0001_0101) { u32 n = GetN(op); - if ((s32)r[n] > 0) - sr.T = 1; + if ((s32)ctx->r[n] > 0) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //cmp/eq #,R0 sh4op(i1000_1000_iiii_iiii) { u32 imm = (u32)(s32)(GetSImm8(op)); - if (r[0] == imm) - sr.T =1; + if (ctx->r[0] == imm) + ctx->sr.T = 1; else - sr.T =0; + ctx->sr.T = 0; } //cmp/eq , @@ -1242,10 +1231,10 @@ sh4op(i0011_nnnn_mmmm_0000) u32 n = GetN(op); u32 m = GetM(op); - if (r[m] == r[n]) - sr.T = 1; + if (ctx->r[m] == ctx->r[n]) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //cmp/hs , @@ -1253,10 +1242,10 @@ sh4op(i0011_nnnn_mmmm_0010) { u32 n = GetN(op); u32 m = GetM(op); - if (r[n] >= r[m]) - sr.T=1; + if (ctx->r[n] >= ctx->r[m]) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; } //cmp/ge , @@ -1264,10 +1253,10 @@ sh4op(i0011_nnnn_mmmm_0011) { u32 n = GetN(op); u32 m = GetM(op); - if ((s32)r[n] >= (s32)r[m]) - sr.T = 1; + if ((s32)ctx->r[n] >= (s32)ctx->r[m]) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //cmp/hi , @@ -1276,10 +1265,10 @@ sh4op(i0011_nnnn_mmmm_0110) u32 n = GetN(op); u32 m = GetM(op); - if (r[n] > r[m]) - sr.T=1; + if (ctx->r[n] > ctx->r[m]) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; } //cmp/gt , @@ -1288,10 +1277,10 @@ sh4op(i0011_nnnn_mmmm_0111) u32 n = GetN(op); u32 m = GetM(op); - if (((s32)r[n]) > ((s32)r[m])) - sr.T = 1; + if ((s32)ctx->r[n] > (s32)ctx->r[m]) + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //cmp/str , @@ -1304,27 +1293,27 @@ sh4op(i0010_nnnn_mmmm_1100) u32 temp; u32 HH, HL, LH, LL; - temp = r[n] ^ r[m]; + temp = ctx->r[n] ^ ctx->r[m]; - HH=(temp&0xFF000000)>>24; - HL=(temp&0x00FF0000)>>16; - LH=(temp&0x0000FF00)>>8; - LL=temp&0x000000FF; - HH=HH&&HL&&LH&&LL; - if (HH==0) - sr.T=1; + HH = (temp & 0xFF000000) >> 24; + HL = (temp & 0x00FF0000) >> 16; + LH = (temp & 0x0000FF00) >> 8; + LL = temp & 0x000000FF; + HH = HH && HL && LH && LL; + if (HH == 0) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; } //tst #,R0 sh4op(i1100_1000_iiii_iiii) { - u32 utmp1 = r[0] & GetImm8(op); + u32 utmp1 = ctx->r[0] & GetImm8(op); if (utmp1 == 0) - sr.T = 1; + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; } //tst , sh4op(i0010_nnnn_mmmm_1000) @@ -1332,10 +1321,10 @@ sh4op(i0010_nnnn_mmmm_1000) u32 n = GetN(op); u32 m = GetM(op); - if ((r[n] & r[m])!=0) - sr.T=0; + if ((ctx->r[n] & ctx->r[m]) != 0) + ctx->sr.T = 0; else - sr.T=1; + ctx->sr.T = 1; } //************************ mulls! ************************ @@ -1344,7 +1333,7 @@ sh4op(i0010_nnnn_mmmm_1110) { u32 n = GetN(op); u32 m = GetM(op); - mac.l = (u16)r[n] * (u16)r[m]; + ctx->mac.l = (u16)ctx->r[n] * (u16)ctx->r[m]; } //muls.w , @@ -1353,7 +1342,7 @@ sh4op(i0010_nnnn_mmmm_1111) u32 n = GetN(op); u32 m = GetM(op); - mac.l = (u32)((s16)r[n] * (s16)r[m]); + ctx->mac.l = (u32)((s16)ctx->r[n] * (s16)ctx->r[m]); } //dmulu.l , sh4op(i0011_nnnn_mmmm_0101) @@ -1361,7 +1350,7 @@ sh4op(i0011_nnnn_mmmm_0101) u32 n = GetN(op); u32 m = GetM(op); - mac.full = (u64)r[n] * (u64)r[m]; + ctx->mac.full = (u64)ctx->r[n] * (u64)ctx->r[m]; } //dmuls.l , @@ -1370,7 +1359,7 @@ sh4op(i0011_nnnn_mmmm_1101) u32 n = GetN(op); u32 m = GetM(op); - mac.full = (s64)(s32)r[n] * (s64)(s32)r[m]; + ctx->mac.full = (s64)(s32)ctx->r[n] * (s64)(s32)ctx->r[m]; } @@ -1379,7 +1368,7 @@ sh4op(i0100_nnnn_mmmm_1111) { u32 n = GetN(op); u32 m = GetM(op); - if (sr.S!=0) + if (ctx->sr.S != 0) { die("mac.w @+,@+ : S=1"); } @@ -1387,14 +1376,14 @@ sh4op(i0100_nnnn_mmmm_1111) { s32 rm,rn; - rn = (s32)(s16)ReadMem16(r[n]); - rm = (s32)(s16)ReadMem16(r[m] + (n == m ? 2 : 0)); + rn = (s32)(s16)ReadMem16(ctx->r[n]); + rm = (s32)(s16)ReadMem16(ctx->r[m] + (n == m ? 2 : 0)); - r[n]+=2; - r[m]+=2; + ctx->r[n] += 2; + ctx->r[m] += 2; - s32 mul=rm * rn; - mac.full+=(s64)mul; + s32 mul = rm * rn; + ctx->mac.full += (s64)mul; } } //mac.l @+,@+ @@ -1404,14 +1393,14 @@ sh4op(i0000_nnnn_mmmm_1111) u32 m = GetM(op); s32 rm, rn; - verify(sr.S==0); + verify(ctx->sr.S == 0); - ReadMemS32(rm,r[m]); - ReadMemS32(rn,r[n] + (n == m ? 4 : 0)); - r[m] += 4; - r[n] += 4; + ReadMemS32(rm, ctx->r[m]); + ReadMemS32(rn, ctx->r[n] + (n == m ? 4 : 0)); + ctx->r[m] += 4; + ctx->r[n] += 4; - mac.full += (s64)rm * (s64)rn; + ctx->mac.full += (s64)rm * (s64)rn; } //mul.l , @@ -1419,15 +1408,15 @@ sh4op(i0000_nnnn_mmmm_0111) { u32 n = GetN(op); u32 m = GetM(op); - mac.l = (u32)((((s32)r[n]) * ((s32)r[m]))); + ctx->mac.l = (u32)((((s32)ctx->r[n]) * ((s32)ctx->r[m]))); } //************************ Div ! ************************ //div0u sh4op(i0000_0000_0001_1001) { - sr.Q = 0; - sr.M = 0; - sr.T = 0; + ctx->sr.Q = 0; + ctx->sr.M = 0; + ctx->sr.T = 0; } //div0s , sh4op(i0010_nnnn_mmmm_0111) @@ -1435,9 +1424,9 @@ sh4op(i0010_nnnn_mmmm_0111) u32 n = GetN(op); u32 m = GetM(op); - sr.Q = r[n] >> 31; - sr.M = r[m] >> 31; - sr.T = sr.M ^ sr.Q; + ctx->sr.Q = ctx->r[n] >> 31; + ctx->sr.M = ctx->r[m] >> 31; + ctx->sr.T = ctx->sr.M ^ ctx->sr.Q; } //div1 , @@ -1446,45 +1435,46 @@ sh4op(i0011_nnnn_mmmm_0100) u32 n = GetN(op); u32 m = GetM(op); - const u8 old_q = sr.Q; - sr.Q = (u8)((0x80000000 & r[n]) != 0); + const u8 old_q = ctx->sr.Q; + ctx->sr.Q = (u8)((0x80000000 & ctx->r[n]) != 0); - r[n] <<= 1; - r[n] |= sr.T; + const u32 old_rm = ctx->r[m]; + ctx->r[n] <<= 1; + ctx->r[n] |= ctx->sr.T; - const u32 old_rn = r[n]; + const u32 old_rn = ctx->r[n]; if (old_q == 0) { - if (sr.M == 0) + if (ctx->sr.M == 0) { - r[n] -= r[m]; - bool tmp1 = r[n] > old_rn; - sr.Q = sr.Q ^ tmp1; + ctx->r[n] -= old_rm; + bool tmp1 = ctx->r[n] > old_rn; + ctx->sr.Q = ctx->sr.Q ^ tmp1; } else { - r[n] += r[m]; - bool tmp1 = r[n] < old_rn; - sr.Q = !sr.Q ^ tmp1; + ctx->r[n] += old_rm; + bool tmp1 = ctx->r[n] < old_rn; + ctx->sr.Q = !ctx->sr.Q ^ tmp1; } } else { - if (sr.M == 0) + if (ctx->sr.M == 0) { - r[n] += r[m]; - bool tmp1 = r[n] < old_rn; - sr.Q = sr.Q ^ tmp1; + ctx->r[n] += old_rm; + bool tmp1 = ctx->r[n] < old_rn; + ctx->sr.Q = ctx->sr.Q ^ tmp1; } else { - r[n] -= r[m]; - bool tmp1 = r[n] > old_rn; - sr.Q = !sr.Q ^ tmp1; + ctx->r[n] -= old_rm; + bool tmp1 = ctx->r[n] > old_rn; + ctx->sr.Q = !ctx->sr.Q ^ tmp1; } } - sr.T = (sr.Q == sr.M); + ctx->sr.T = (ctx->sr.Q == ctx->sr.M); } //************************ Simple maths ************************ @@ -1493,18 +1483,18 @@ sh4op(i0011_nnnn_mmmm_1110) { u32 n = GetN(op); u32 m = GetM(op); - u32 tmp1 = r[n] + r[m]; - u32 tmp0 = r[n]; + u32 tmp1 = ctx->r[n] + ctx->r[m]; + u32 tmp0 = ctx->r[n]; - r[n] = tmp1 + sr.T; + ctx->r[n] = tmp1 + ctx->sr.T; if (tmp0 > tmp1) - sr.T = 1; + ctx->sr.T = 1; else - sr.T = 0; + ctx->sr.T = 0; - if (tmp1 > r[n]) - sr.T = 1; + if (tmp1 > ctx->r[n]) + ctx->sr.T = 1; } // addv , @@ -1513,16 +1503,16 @@ sh4op(i0011_nnnn_mmmm_1111) //Retail game "Twinkle Star Sprites" "uses" this opcode. u32 n = GetN(op); u32 m = GetM(op); - s64 br=(s64)(s32)r[n]+(s64)(s32)r[m]; + s64 br = (s64)(s32)ctx->r[n] + (s64)(s32)ctx->r[m]; if (br >=0x80000000) - sr.T=1; - else if (br < (s64) (0xFFFFFFFF80000000u)) - sr.T=1; + ctx->sr.T = 1; + else if (br < (s64)0xFFFFFFFF80000000u) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; - r[n]+=r[m]; + ctx->r[n] += ctx->r[m]; } //subc , @@ -1531,17 +1521,17 @@ sh4op(i0011_nnnn_mmmm_1010) u32 n = GetN(op); u32 m = GetM(op); - u32 tmp1 = r[n] - r[m]; - u32 tmp0 = r[n]; - r[n] = tmp1 - sr.T; + u32 tmp1 = ctx->r[n] - ctx->r[m]; + u32 tmp0 = ctx->r[n]; + ctx->r[n] = tmp1 - ctx->sr.T; if (tmp0 < tmp1) - sr.T=1; + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; - if (tmp1 < r[n]) - sr.T=1; + if (tmp1 < ctx->r[n]) + ctx->sr.T = 1; } //subv , @@ -1550,26 +1540,27 @@ sh4op(i0011_nnnn_mmmm_1011) //Retail game "Twinkle Star Sprites" "uses" this opcode. u32 n = GetN(op); u32 m = GetM(op); - s64 br=(s64)(s32)r[n]-(s64)(s32)r[m]; + s64 br = (s64)(s32)ctx->r[n] - (s64)(s32)ctx->r[m]; - if (br >=0x80000000) - sr.T=1; + if (br >= 0x80000000) + ctx->sr.T = 1; else if (br < (s64) (0xFFFFFFFF80000000u)) - sr.T=1; + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; - r[n]-=r[m]; + ctx->r[n] -= ctx->r[m]; } + //dt sh4op(i0100_nnnn_0001_0000) { u32 n = GetN(op); - r[n]-=1; - if (r[n] == 0) - sr.T=1; + ctx->r[n] -= 1; + if (ctx->r[n] == 0) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; } //negc , @@ -1579,16 +1570,16 @@ sh4op(i0110_nnnn_mmmm_1010) u32 m = GetM(op); //r[n]=-r[m]-sr.T; - u32 tmp=0 - r[m]; - r[n]=tmp - sr.T; + u32 tmp = 0 - ctx->r[m]; + ctx->r[n] = tmp - ctx->sr.T; - if (0sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; - if (tmpr[n]) + ctx->sr.T = 1; } @@ -1597,7 +1588,7 @@ sh4op(i0110_nnnn_mmmm_1011) { u32 n = GetN(op); u32 m = GetM(op); - r[n] = -r[m]; + ctx->r[n] = -ctx->r[m]; } //not , @@ -1606,7 +1597,7 @@ sh4op(i0110_nnnn_mmmm_0111) u32 n = GetN(op); u32 m = GetM(op); - r[n] = ~r[m]; + ctx->r[n] = ~ctx->r[m]; } @@ -1616,15 +1607,15 @@ sh4op(i0100_nnnn_0000_0000) { u32 n = GetN(op); - sr.T = r[n] >> 31; - r[n] <<= 1; + ctx->sr.T = ctx->r[n] >> 31; + ctx->r[n] <<= 1; } //shal sh4op(i0100_nnnn_0010_0000) { - u32 n=GetN(op); - sr.T=r[n]>>31; - r[n]=((s32)r[n])<<1; + u32 n = GetN(op); + ctx->sr.T = ctx->r[n] >> 31; + ctx->r[n] = ((s32)ctx->r[n]) << 1; } @@ -1632,8 +1623,8 @@ sh4op(i0100_nnnn_0010_0000) sh4op(i0100_nnnn_0000_0001) { u32 n = GetN(op); - sr.T = r[n] & 0x1; - r[n] >>= 1; + ctx->sr.T = ctx->r[n] & 0x1; + ctx->r[n] >>= 1; } //shar @@ -1641,8 +1632,8 @@ sh4op(i0100_nnnn_0010_0001) { u32 n = GetN(op); - sr.T=r[n] & 1; - r[n]=((s32)r[n])>>1; + ctx->sr.T = ctx->r[n] & 1; + ctx->r[n] = ((s32)ctx->r[n]) >> 1; } //shad , @@ -1650,15 +1641,13 @@ sh4op(i0100_nnnn_mmmm_1100) { u32 n = GetN(op); u32 m = GetM(op); - u32 sgn = r[m] & 0x80000000; + u32 sgn = ctx->r[m] & 0x80000000; if (sgn == 0) - r[n] <<= (r[m] & 0x1F); - else if ((r[m] & 0x1F) == 0) - { - r[n]=((s32)r[n])>>31; - } + ctx->r[n] <<= ctx->r[m] & 0x1F; + else if ((ctx->r[m] & 0x1F) == 0) + ctx->r[n] = (s32)ctx->r[n] >> 31; else - r[n] = ((s32)r[n]) >> ((~r[m] & 0x1F) + 1); + ctx->r[n] = (s32)ctx->r[n] >> ((~ctx->r[m] & 0x1F) + 1); } @@ -1667,32 +1656,24 @@ sh4op(i0100_nnnn_mmmm_1101) { u32 n = GetN(op); u32 m = GetM(op); - u32 sgn = r[m] & 0x80000000; + u32 sgn = ctx->r[m] & 0x80000000; if (sgn == 0) - r[n] <<= (r[m] & 0x1F); - else if ((r[m] & 0x1F) == 0) - { - r[n] = 0; - } + ctx->r[n] <<= (ctx->r[m] & 0x1F); + else if ((ctx->r[m] & 0x1F) == 0) + ctx->r[n] = 0; else - r[n] = ((u32)r[n]) >> ((~r[m] & 0x1F) + 1); //isn't this the same as -r[m] ? + ctx->r[n] = ((u32)ctx->r[n]) >> ((~ctx->r[m] & 0x1F) + 1); //isn't this the same as -r[m] ? } - //rotcl sh4op(i0100_nnnn_0010_0100) { u32 n = GetN(op); - u32 t; - - t = sr.T; - - sr.T = r[n] >> 31; - - r[n] <<= 1; - - r[n]|=t; + u32 t = ctx->sr.T; + ctx->sr.T = ctx->r[n] >> 31; + ctx->r[n] <<= 1; + ctx->r[n] |= t; } @@ -1701,27 +1682,19 @@ sh4op(i0100_nnnn_0000_0100) { u32 n = GetN(op); - sr.T=r[n]>>31; - - r[n] <<= 1; - - r[n]|=sr.T; + ctx->sr.T = ctx->r[n] >> 31; + ctx->r[n] <<= 1; + ctx->r[n] |= ctx->sr.T; } //rotcr sh4op(i0100_nnnn_0010_0101) { u32 n = GetN(op); - u32 t; - - - t = r[n] & 0x1; - - r[n] >>= 1; - - r[n] |=(sr.T)<<31; - - sr.T = t; + u32 t = ctx->r[n] & 0x1; + ctx->r[n] >>= 1; + ctx->r[n] |= ctx->sr.T << 31; + ctx->sr.T = t; } @@ -1729,10 +1702,12 @@ sh4op(i0100_nnnn_0010_0101) sh4op(i0100_nnnn_0000_0101) { u32 n = GetN(op); - sr.T = r[n] & 0x1; - r[n] >>= 1; - r[n] |= ((sr.T) << 31); + + ctx->sr.T = ctx->r[n] & 0x1; + ctx->r[n] >>= 1; + ctx->r[n] |= ctx->sr.T << 31; } + //************************ byte reorder/sign ************************ //swap.b , sh4op(i0110_nnnn_mmmm_1000) @@ -1740,8 +1715,8 @@ sh4op(i0110_nnnn_mmmm_1000) u32 m = GetM(op); u32 n = GetN(op); - u32 rg=r[m]; - r[n] = (rg & 0xFFFF0000) | ((rg&0xFF)<<8) | ((rg>>8)&0xFF); + u32 rg = ctx->r[m]; + ctx->r[n] = (rg & 0xFFFF0000) | ((rg & 0xFF) << 8) | ((rg >> 8) & 0xFF); } @@ -1751,18 +1726,17 @@ sh4op(i0110_nnnn_mmmm_1001) u32 n = GetN(op); u32 m = GetM(op); - u16 t = (u16)(r[m]>>16); - r[n] = (r[m] << 16) | t; + u16 t = (u16)(ctx->r[m] >> 16); + ctx->r[n] = (ctx->r[m] << 16) | t; } - //extu.b , sh4op(i0110_nnnn_mmmm_1100) { u32 n = GetN(op); u32 m = GetM(op); - r[n] = (u32)(u8)r[m]; + ctx->r[n] = (u32)(u8)ctx->r[m]; } @@ -1771,7 +1745,7 @@ sh4op(i0110_nnnn_mmmm_1101) { u32 n = GetN(op); u32 m = GetM(op); - r[n] =(u32)(u16) r[m]; + ctx->r[n] = (u32)(u16)ctx->r[m]; } @@ -1781,8 +1755,7 @@ sh4op(i0110_nnnn_mmmm_1110) u32 n = GetN(op); u32 m = GetM(op); - r[n] = (u32)(s32)(s8)(u8)(r[m]); - + ctx->r[n] = (u32)(s32)(s8)(u8)ctx->r[m]; } @@ -1792,7 +1765,7 @@ sh4op(i0110_nnnn_mmmm_1111) u32 n = GetN(op); u32 m = GetM(op); - r[n] = (u32)(s32)(s16)(u16)(r[m]); + ctx->r[n] = (u32)(s32)(s16)(u16)ctx->r[m]; } @@ -1802,7 +1775,7 @@ sh4op(i0010_nnnn_mmmm_1101) u32 n = GetN(op); u32 m = GetM(op); - r[n] = ((r[n] >> 16) & 0xFFFF) | ((r[m] << 16) & 0xFFFF0000); + ctx->r[n] = ((ctx->r[n] >> 16) & 0xFFFF) | ((ctx->r[m] << 16) & 0xFFFF0000); } @@ -1811,57 +1784,56 @@ sh4op(i0010_nnnn_mmmm_1101) sh4op(i1100_1100_iiii_iiii) { //Retail game "Twinkle Star Sprites" "uses" this opcode. - u32 imm=GetImm8(op); + u32 imm = GetImm8(op); - u32 temp = (u8)ReadMem8(gbr+r[0]); + u32 temp = (u8)ReadMem8(ctx->gbr + ctx->r[0]); temp &= imm; - if (temp==0) - sr.T=1; + if (temp == 0) + ctx->sr.T = 1; else - sr.T=0; + ctx->sr.T = 0; } //and.b #,@(R0,GBR) sh4op(i1100_1101_iiii_iiii) { - u8 temp = (u8)ReadMem8(gbr+r[0]); + u8 temp = (u8)ReadMem8(ctx->gbr + ctx->r[0]); temp &= GetImm8(op); - WriteMem8(gbr +r[0], temp); + WriteMem8(ctx->gbr + ctx->r[0], temp); } //xor.b #,@(R0,GBR) sh4op(i1100_1110_iiii_iiii) { - u8 temp = (u8)ReadMem8(gbr+r[0]); + u8 temp = (u8)ReadMem8(ctx->gbr + ctx->r[0]); temp ^= GetImm8(op); - WriteMem8(gbr +r[0], temp); + WriteMem8(ctx->gbr + ctx->r[0], temp); } //or.b #,@(R0,GBR) sh4op(i1100_1111_iiii_iiii) { - u8 temp = (u8)ReadMem8(gbr+r[0]); + u8 temp = (u8)ReadMem8(ctx->gbr + ctx->r[0]); temp |= GetImm8(op); - WriteMem8(gbr+r[0], temp); + WriteMem8(ctx->gbr + ctx->r[0], temp); } + //tas.b @ sh4op(i0100_nnnn_0001_1011) { u32 n = GetN(op); - u8 val; - - val=(u8)ReadMem8(r[n]); + u8 val = (u8)ReadMem8(ctx->r[n]); u32 srT; if (val == 0) @@ -1871,9 +1843,9 @@ sh4op(i0100_nnnn_0001_1011) val |= 0x80; - WriteMem8(r[n], val); + WriteMem8(ctx->r[n], val); - sr.T=srT; + ctx->sr.T = srT; } //************************ Opcodes that read/write the status registers ************************ @@ -1881,30 +1853,30 @@ sh4op(i0100_nnnn_0001_1011) sh4op(i0000_nnnn_0000_0010)//0002 { u32 n = GetN(op); - r[n] = sh4_sr_GetFull(); + ctx->r[n] = ctx->sr.getFull(); } //sts FPSCR, sh4op(i0000_nnnn_0110_1010) { u32 n = GetN(op); - r[n] = fpscr.full; + ctx->r[n] = ctx->fpscr.full; } //sts.l FPSCR,@- sh4op(i0100_nnnn_0110_0010) { u32 n = GetN(op); - WriteMemU32(r[n] - 4, fpscr.full); - r[n] -= 4; + WriteMemU32(ctx->r[n] - 4, ctx->fpscr.full); + ctx->r[n] -= 4; } //stc.l SR,@- sh4op(i0100_nnnn_0000_0011) { u32 n = GetN(op); - WriteMemU32(r[n] - 4, sh4_sr_GetFull()); - r[n] -= 4; + WriteMemU32(ctx->r[n] - 4, ctx->sr.getFull()); + ctx->r[n] -= 4; } //lds.l @+,FPSCR @@ -1912,10 +1884,9 @@ sh4op(i0100_nnnn_0110_0110) { u32 n = GetN(op); - ReadMemU32(fpscr.full,r[n]); - - UpdateFPSCR(); - r[n] += 4; + ReadMemU32(ctx->fpscr.full, ctx->r[n]); + Sh4Context::UpdateFPSCR(ctx); + ctx->r[n] += 4; } //ldc.l @+,SR @@ -1924,10 +1895,10 @@ sh4op(i0100_nnnn_0000_0111) u32 n = GetN(op); u32 sr_t; - ReadMemU32(sr_t,r[n]); + ReadMemU32(sr_t, ctx->r[n]); - sh4_sr_SetFull(sr_t); - r[n] += 4; + ctx->sr.setFull(sr_t); + ctx->r[n] += 4; if (UpdateSR()) UpdateINTC(); } @@ -1936,15 +1907,15 @@ sh4op(i0100_nnnn_0000_0111) sh4op(i0100_nnnn_0110_1010) { u32 n = GetN(op); - fpscr.full = r[n]; - UpdateFPSCR(); + ctx->fpscr.full = ctx->r[n]; + Sh4Context::UpdateFPSCR(ctx); } //ldc ,SR sh4op(i0100_nnnn_0000_1110) { u32 n = GetN(op); - sh4_sr_SetFull(r[n]); + ctx->sr.setFull(ctx->r[n]); if (UpdateSR()) UpdateINTC(); } @@ -1954,6 +1925,6 @@ sh4op(iNotImplemented) INFO_LOG(INTERPRETER, "iNimp %04X", op); debugger::debugTrap(Sh4Ex_IllegalInstr); - throw SH4ThrownException(next_pc - 2, Sh4Ex_IllegalInstr); + throw SH4ThrownException(ctx->pc - 2, Sh4Ex_IllegalInstr); } diff --git a/core/hw/sh4/interpr/sh4_opcodes.h b/core/hw/sh4/interpr/sh4_opcodes.h index 3748685b4..f2a64275d 100644 --- a/core/hw/sh4/interpr/sh4_opcodes.h +++ b/core/hw/sh4/interpr/sh4_opcodes.h @@ -1,6 +1,6 @@ #pragma once #include "types.h" -#include "../sh4_interpreter.h" +#include "hw/sh4/sh4_opcode_list.h" /* Opcodes :) */ diff --git a/core/hw/sh4/modules/bsc.cpp b/core/hw/sh4/modules/bsc.cpp index 9f372b7c0..04ece27ff 100644 --- a/core/hw/sh4/modules/bsc.cpp +++ b/core/hw/sh4/modules/bsc.cpp @@ -9,56 +9,46 @@ BSCRegisters bsc; -template -static void write_BSC_PCTRA(u32 addr, T data) +//u32 port_out_data; +static void write_BSC_PDTRA_arcade(u32 addr, u16 data) { - BSC_PCTRA.full = data; - if (settings.platform.isNaomi()) - NaomiBoardIDWriteControl((u16)data); - //else - //printf("C:BSC_PCTRA = %08X\n",data); + BSC_PDTRA.full = data; + NaomiBoardIDWrite(data); } -//u32 port_out_data; static void write_BSC_PDTRA(u32 addr, u16 data) { BSC_PDTRA.full = data; - //printf("D:BSC_PDTRA = %04x\n", data); +} - if (settings.platform.isNaomi()) - NaomiBoardIDWrite(data); +static u16 read_BSC_PDTRA_arcade(u32 addr) +{ + return NaomiBoardIDRead(); } static u16 read_BSC_PDTRA(u32 addr) { - if (settings.platform.isNaomi()) - { - return NaomiBoardIDRead(); - } + /* as seen on chankast */ + u32 tpctra = BSC_PCTRA.full; + u32 tpdtra = BSC_PDTRA.full; + + u16 tfinal = 0; + // magic values + if ((tpctra & 0xf) == 0x8) + tfinal = 3; + else if ((tpctra & 0xf) == 0xB) + tfinal = 3; else - { - /* as seen on chankast */ - u32 tpctra = BSC_PCTRA.full; - u32 tpdtra = BSC_PDTRA.full; - - u16 tfinal = 0; - // magic values - if ((tpctra & 0xf) == 0x8) - tfinal = 3; - else if ((tpctra & 0xf) == 0xB) - tfinal = 3; - else - tfinal = 0; - - if ((tpctra & 0xf) == 0xB && (tpdtra & 0xf) == 2) - tfinal = 0; - else if ((tpctra & 0xf) == 0xC && (tpdtra & 0xf) == 2) - tfinal = 3; - - tfinal |= config::Cable << 8; - - return tfinal; - } + tfinal = 0; + + if ((tpctra & 0xf) == 0xB && (tpdtra & 0xf) == 2) + tfinal = 0; + else if ((tpctra & 0xf) == 0xC && (tpdtra & 0xf) == 2) + tfinal = 3; + + tfinal |= config::Cable << 8; + + return tfinal; } void BSCRegisters::init() @@ -101,10 +91,10 @@ void BSCRegisters::init() //BSC PCTRA 0xFF80002C 0x1F80002C 32 0x00000000 Held Held Held Bclk // Naomi BIOS writes u16 in this register but ignoring them doesn't seem to hurt - setWriteHandler(write_BSC_PCTRA); + setRW(); //BSC PDTRA 0xFF800030 0x1F800030 16 Undefined Held Held Held Bclk - setHandlers(read_BSC_PDTRA, write_BSC_PDTRA); + setRW(); //BSC PCTRB 0xFF800040 0x1F800040 32 0x00000000 Held Held Held Bclk setRW(); @@ -149,4 +139,9 @@ void BSCRegisters::reset() BSC_WCR3.full = 0x07777777; BSC_RFCR.full = 17; + + if (settings.platform.isNaomi() || settings.platform.isSystemSP()) + setHandlers(read_BSC_PDTRA_arcade, write_BSC_PDTRA_arcade); + else + setHandlers(read_BSC_PDTRA, write_BSC_PDTRA); } diff --git a/core/hw/sh4/modules/ccn.cpp b/core/hw/sh4/modules/ccn.cpp index 23e4ba51e..ae5003b5a 100644 --- a/core/hw/sh4/modules/ccn.cpp +++ b/core/hw/sh4/modules/ccn.cpp @@ -7,6 +7,8 @@ #include "hw/sh4/sh4_mmr.h" #include "hw/sh4/sh4_core.h" #include "hw/sh4/sh4_cache.h" +#include "cfg/option.h" +#include "emulator.h" CCNRegisters ccn; @@ -53,7 +55,7 @@ static void CCN_MMUCR_write(u32 addr, u32 value) { //printf("<*******>MMU Enabled , ONLY SQ remaps work<*******>\n"); mmu_set_state(); - sh4_cpu.ResetCache(); + emu.getSh4Executor()->ResetCache(); } } @@ -63,14 +65,14 @@ static void CCN_CCR_write(u32 addr, u32 value) temp.reg_data = value & 0x89AF; if (temp.ICI) { - DEBUG_LOG(SH4, "Sh4: i-cache invalidation %08X", curr_pc); + DEBUG_LOG(SH4, "Sh4: i-cache invalidation %08X", Sh4cntx.pc); //Shikigami No Shiro II uses ICI frequently if (!config::DynarecEnabled) icache.Invalidate(); temp.ICI = 0; } if (temp.OCI) { - DEBUG_LOG(SH4, "Sh4: o-cache invalidation %08X", curr_pc); + DEBUG_LOG(SH4, "Sh4: o-cache invalidation %08X", Sh4cntx.pc); if (!config::DynarecEnabled) ocache.Invalidate(); temp.OCI = 0; @@ -82,6 +84,7 @@ static void CCN_CCR_write(u32 addr, u32 value) static u32 CPU_VERSION_read(u32 addr) { return 0x040205c1; // this is what a real SH7091 in a Dreamcast returns - the later Naomi BIOSes check and care! + // 0x040204d0 on a PAL VA1 dreamcast, also works } static u32 CCN_PRR_read(u32 addr) diff --git a/core/hw/sh4/modules/fastmmu.cpp b/core/hw/sh4/modules/fastmmu.cpp index 504ca9ae8..bc9c08487 100644 --- a/core/hw/sh4/modules/fastmmu.cpp +++ b/core/hw/sh4/modules/fastmmu.cpp @@ -18,9 +18,9 @@ */ #include "mmu.h" #include "hw/sh4/sh4_if.h" -#include "hw/sh4/sh4_interrupts.h" #include "hw/sh4/sh4_core.h" #include "types.h" +#include "stdclass.h" #ifdef FAST_MMU @@ -141,7 +141,7 @@ int main(int argc, char *argv[]) for (int i = 0; i < full_table_size; i++) { u32 sz = full_table[i].entry.Data.SZ1 * 2 + full_table[i].entry.Data.SZ0; - u32 mask = sz == 3 ? 1*1024*1024 : sz == 2 ? 64*1024 : sz == 1 ? 4*1024 : 1024; + u32 mask = sz == 3 ? 1_MB : sz == 2 ? 64_KB : sz == 1 ? 4_KB : 1_KB; mask--; addrs.push_back(((full_table[i].entry.Address.VPN << 10) & mmu_mask[sz]) | (random() * mask / RAND_MAX)); asids.push_back(full_table[i].entry.Address.ASID); @@ -157,7 +157,7 @@ int main(int argc, char *argv[]) addrs.push_back(random()); asids.push_back(666); } - double start = os_GetSeconds(); + u64 start = getTimeMs(); int success = 0; const int loops = 100000; for (int i = 0; i < loops; i++) @@ -171,8 +171,8 @@ int main(int argc, char *argv[]) success++; } } - double end = os_GetSeconds(); - printf("Lookup time: %f ms. Success rate %f max_len %d\n", (end - start) * 1000.0 / addrs.size(), (double)success / addrs.size() / loops, 0/*max_length*/); + u64 end = getTimeMs(); + printf("Lookup time: %f ms. Success rate %f max_len %d\n", ((double)end - start) / addrs.size(), (double)success / addrs.size() / loops, 0/*max_length*/); } #endif diff --git a/core/hw/sh4/modules/mmu.cpp b/core/hw/sh4/modules/mmu.cpp index 44e9165b0..af9de30e0 100644 --- a/core/hw/sh4/modules/mmu.cpp +++ b/core/hw/sh4/modules/mmu.cpp @@ -85,7 +85,7 @@ void ITLB_Sync(u32 entry) template static void mmuException(MmuError mmu_error, u32 address, u32 am, F raise) { - printf_mmu("MMU exception -> pc = 0x%X : ", next_pc); + printf_mmu("MMU exception -> pc = 0x%X : ", Sh4cntx.pc); CCN_TEA = address; CCN_PTEH.VPN = address >> 10; @@ -156,7 +156,7 @@ static void mmuException(MmuError mmu_error, u32 address, u32 am, F raise) mmuException(mmu_error, address, am, [](Sh4ExceptionCode event) { debugger::debugTrap(event); // FIXME CCN_TEA and CCN_PTEH have been updated already - throw SH4ThrownException(next_pc - 2, event); + throw SH4ThrownException(Sh4cntx.pc - 2, event); }); die("Unknown mmu_error"); } @@ -165,7 +165,7 @@ static void mmuException(MmuError mmu_error, u32 address, u32 am, F raise) void DoMMUException(u32 address, MmuError mmu_error, u32 access_type) { mmuException(mmu_error, address, access_type, [](Sh4ExceptionCode event) { - Do_Exception(next_pc, event); + Do_Exception(Sh4cntx.pc, event); }); } @@ -179,7 +179,7 @@ bool mmu_match(u32 va, CCN_PTEH_type Address, CCN_PTEL_type Data) if ((((Address.VPN << 10) & mask) == (va & mask))) { - bool needAsidMatch = Data.SH == 0 && (sr.MD == 0 || CCN_MMUCR.SV == 0); + bool needAsidMatch = Data.SH == 0 && (Sh4cntx.sr.MD == 0 || CCN_MMUCR.SV == 0); if (!needAsidMatch || Address.ASID == CCN_PTEH.ASID) return true; @@ -231,7 +231,7 @@ template MmuError mmu_full_SQ(u32 va, u32& rv) { - if ((va & 3) || (CCN_MMUCR.SQMD == 1 && sr.MD == 0)) + if ((va & 3) || (CCN_MMUCR.SQMD == 1 && Sh4cntx.sr.MD == 0)) //here, or after ? return MmuError::BADADDR; @@ -250,7 +250,7 @@ MmuError mmu_full_SQ(u32 va, u32& rv) u32 md = entry->Data.PR >> 1; //Priv mode protection - if (md == 0 && sr.MD == 0) + if (md == 0 && Sh4cntx.sr.MD == 0) return MmuError::PROTECTED; //Write Protection (Lock or FW) @@ -287,7 +287,7 @@ MmuError mmu_data_translation(u32 va, u32& rv) } } - if (sr.MD == 0 && (va & 0x80000000) != 0) + if (Sh4cntx.sr.MD == 0 && (va & 0x80000000) != 0) //if on kernel, and not SQ addr -> error return MmuError::BADADDR; @@ -326,7 +326,7 @@ MmuError mmu_data_translation(u32 va, u32& rv) //0X & User mode-> protection violation //Priv mode protection - if (md == 0 && sr.MD == 0) + if (md == 0 && Sh4cntx.sr.MD == 0) return MmuError::PROTECTED; //X0 -> read olny @@ -351,7 +351,7 @@ template MmuError mmu_data_translation(u32 va, u32& rv); MmuError mmu_instruction_translation(u32 va, u32& rv) { - if (sr.MD == 0 && (va & 0x80000000) != 0) + if (Sh4cntx.sr.MD == 0 && (va & 0x80000000) != 0) // User mode on kernel address return MmuError::BADADDR; @@ -375,7 +375,7 @@ MmuError mmu_instruction_translation(u32 va, u32& rv) //0X & User mode-> protection violation //Priv mode protection - if (md == 0 && sr.MD == 0) + if (md == 0 && Sh4cntx.sr.MD == 0) return MmuError::PROTECTED; return MmuError::NONE; @@ -396,7 +396,7 @@ MmuError mmu_instruction_lookup(u32 va, const TLB_Entry** tlb_entry_ret, u32& rv if ((((entry.Address.VPN << 10) & mask) == (va & mask))) { - bool needAsidMatch = entry.Data.SH == 0 && (sr.MD == 0 || CCN_MMUCR.SV == 0); + bool needAsidMatch = entry.Data.SH == 0 && (Sh4cntx.sr.MD == 0 || CCN_MMUCR.SV == 0); if (!needAsidMatch || entry.Address.ASID == CCN_PTEH.ASID) { @@ -459,7 +459,9 @@ void mmu_set_state() setSqwHandler(); } +#ifdef FAST_MMU u32 mmuAddressLUT[0x100000]; +#endif void MMU_init() { @@ -492,6 +494,7 @@ void MMU_reset() memset(ITLB, 0, sizeof(ITLB)); mmu_set_state(); mmu_flush_table(); + memset(sq_remap, 0, sizeof(sq_remap)); } void MMU_term() @@ -588,8 +591,6 @@ void mmu_deserialize(Deserializer& deser) deser >> UTLB; deser >> ITLB; - if (deser.version() >= Deserializer::V11 - || (deser.version() >= Deserializer::V11_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) - deser >> sq_remap; + deser >> sq_remap; deser.skip(64 * 4, Deserializer::V23); // ITLB_LRU_USE } diff --git a/core/hw/sh4/modules/mmu.h b/core/hw/sh4/modules/mmu.h index 9ffd68373..a7d3206c3 100644 --- a/core/hw/sh4/modules/mmu.h +++ b/core/hw/sh4/modules/mmu.h @@ -1,7 +1,6 @@ #pragma once #include "types.h" #include "hw/sh4/sh4_mmr.h" -#include "cfg/option.h" #include "hw/sh4/dyna/ngen.h" //Translation Types @@ -37,7 +36,6 @@ struct TLB_Entry extern TLB_Entry UTLB[64]; extern TLB_Entry ITLB[4]; -extern u32 sq_remap[64]; extern bool mmuOn; constexpr u32 fast_reg_lut[8] = @@ -118,6 +116,7 @@ template void DYNACALL mmu_WriteMem(u32 adr, T data); void mmu_TranslateSQW(u32 adr, u32* out); +#ifdef FAST_MMU // maps 4K virtual page number to physical address extern u32 mmuAddressLUT[0x100000]; @@ -131,7 +130,9 @@ static inline void mmuAddressLUTFlush(bool full) memset(mmuAddressLUT, 0, slotPages * sizeof(u32)); // flush slot 0 } } +#endif +#if FEAT_SHREC == DYNAREC_JIT static inline u32 DYNACALL mmuDynarecLookup(u32 vaddr, u32 write, u32 pc) { u32 paddr; @@ -146,7 +147,7 @@ static inline u32 DYNACALL mmuDynarecLookup(u32 vaddr, u32 write, u32 pc) Sh4cntx.pc = pc; DoMMUException(vaddr, rv, write ? MMU_TT_DWRITE : MMU_TT_DREAD); host_context_t ctx; - ngen_HandleException(ctx); + sh4Dynarec->handleException(ctx); ((void (*)())ctx.pc)(); // not reached return 0; @@ -158,6 +159,7 @@ static inline u32 DYNACALL mmuDynarecLookup(u32 vaddr, u32 write, u32 pc) return paddr; } +#endif void MMU_init(); void MMU_reset(); diff --git a/core/hw/sh4/modules/modules.h b/core/hw/sh4/modules/modules.h index 6c8a7afc0..57244e24e 100644 --- a/core/hw/sh4/modules/modules.h +++ b/core/hw/sh4/modules/modules.h @@ -1,5 +1,6 @@ #pragma once #include "hw/hwreg.h" +#include extern u32 UBC[9]; extern u32 BSC[19]; @@ -93,16 +94,68 @@ class SCIFRegisters : public RegisterBank }; extern SCIFRegisters scif; -struct SerialPipe +class SCIFSerialPort : public SerialPort { - // Serial TX - virtual void write(u8 data) { } - // RX buffer Size - virtual int available() { return 0; } - // Serial RX - virtual u8 read() { return 0; } - - virtual ~SerialPipe() = default; +public: + void setPipe(Pipe *pipe) override { + this->pipe = pipe; + } + Pipe *getPipe() const { + return pipe; + } + void updateStatus() override {} + void receiveBreak() override; + void init(); + void term(); + void reset(); + void serialize(Serializer& ser); + void deserialize(Deserializer& deser); + + u8 SCFRDR2_read(); + void SCFTDR2_write(u8 data); + u16 readStatus(); + void writeStatus(u16 data); + u16 SCFDR2_read(); + static u16 SCFCR2_read(u32 addr); + void SCFCR2_write(u16 data); + void SCSPTR2_write(u16 data); + static void SCBRR2_write(u32 addr, u8 data); + static void SCSMR2_write(u32 addr, u16 data); + void SCSCR2_write(u16 data); + + static SCIFSerialPort& Instance(); + +private: + enum StatusBit { + DR = 0x01, + RDF = 0x02, + PER = 0x04, + FER = 0x08, + BRK = 0x10, + TDFE = 0x20, + TEND = 0x40, + ER = 0x80, + }; + + void setStatusBit(StatusBit bit); + bool isTDFE() const; + bool isRDF() const; + void updateBaudRate(); + void setBreak(bool on); + void sendBreak(); + bool txDone(); + void rxSched(); + static int schedCallback(int tag, int cycles, int lag, void *arg); + + Pipe *pipe = nullptr; + int schedId = -1; + int brkSchedId = -1; + int frameSize = 10; // default 8 data bits, 1 stop bit, no parity + int cyclesPerBit = SH4_MAIN_CLOCK / 6103; + u16 statusLastRead = 0; + std::deque txFifo; + std::deque rxFifo; + bool transmitting = false; }; -void serial_setPipe(SerialPipe *pipe); -void serial_updateStatusRegister(); + +void setupPtyPipe(); diff --git a/core/hw/sh4/modules/serial.cpp b/core/hw/sh4/modules/serial.cpp index b75da9c01..7338af8f2 100644 --- a/core/hw/sh4/modules/serial.cpp +++ b/core/hw/sh4/modules/serial.cpp @@ -1,6 +1,5 @@ /* Dreamcast serial port. - This is missing most of the functionality, but works for KOS (And thats all that uses it) */ #include #include @@ -17,141 +16,442 @@ #include "hw/sh4/sh4_interrupts.h" #include "cfg/option.h" #include "modules.h" +#include "hw/sh4/sh4_sched.h" +#include "serialize.h" + +//#define DEBUG_SCIF + +#ifdef DEBUG_SCIF +#define SCIF_LOG(...) INFO_LOG(SH4, __VA_ARGS__) +#else +#define SCIF_LOG(...) +#endif SCIRegisters sci; SCIFRegisters scif; -static SerialPipe *serialPipe; -/* -//SCIF SCSMR2 0xFFE80000 0x1FE80000 16 0x0000 0x0000 Held Held Pclk -SCSMR2_type SCIF_SCSMR2; +static void updateInterrupts() +{ + InterruptPend(sh4_SCIF_TXI, SCIF_SCFSR2.TDFE); + InterruptMask(sh4_SCIF_TXI, SCIF_SCSCR2.TIE); -//SCIF SCBRR2 0xFFE80004 0x1FE80004 8 0xFF 0xFF Held Held Pclk -u8 SCIF_SCBRR2; + InterruptPend(sh4_SCIF_RXI, SCIF_SCFSR2.RDF || SCIF_SCFSR2.DR); + InterruptMask(sh4_SCIF_RXI, SCIF_SCSCR2.RIE); -//SCIF SCSCR2 0xFFE80008 0x1FE80008 16 0x0000 0x0000 Held Held Pclk -SCSCR2_type SCIF_SCSCR2; + InterruptPend(sh4_SCIF_BRI, SCIF_SCFSR2.BRK); + InterruptMask(sh4_SCIF_BRI, SCIF_SCSCR2.RIE || SCIF_SCSCR2.REIE); -//SCIF SCFTDR2 0xFFE8000C 0x1FE8000C 8 Undefined Undefined Held Held Pclk -u8 SCIF_SCFTDR2; + InterruptPend(sh4_SCIF_ERI, SCIF_SCFSR2.ER || SCIF_SCFSR2.FER || SCIF_SCFSR2.PER); + InterruptMask(sh4_SCIF_ERI, SCIF_SCSCR2.RIE || SCIF_SCSCR2.REIE); +} -//SCIF SCFSR2 0xFFE80010 0x1FE80010 16 0x0060 0x0060 Held Held Pclk -SCSCR2_type SCIF_SCFSR2; +int SCIFSerialPort::schedCallback(int tag, int cycles, int lag, void *arg) +{ + SCIFSerialPort& scif = *(SCIFSerialPort *)arg; + if (tag == 0) + { + bool reschedule = scif.txDone(); + scif.rxSched(); + if (reschedule || scif.pipe != nullptr) + return scif.frameSize * scif.cyclesPerBit; + else + return 0; + } + else + { + scif.sendBreak(); + return 0; + } +} -//SCIF SCFRDR2 0xFFE80014 0x1FE80014 8 Undefined Undefined Held Held Pclk -//Read OLNY -u8 SCIF_SCFRDR2; +bool SCIFSerialPort::isTDFE() const { + return (int)txFifo.size() <= 1 << (3 - SCIF_SCFCR2.TTRG); +} -//SCIF SCFCR2 0xFFE80018 0x1FE80018 16 0x0000 0x0000 Held Held Pclk -SCFCR2_type SCIF_SCFCR2; +bool SCIFSerialPort::isRDF() const { + constexpr u32 trigLevels[] { 1, 4, 8, 14 }; + return rxFifo.size() >= trigLevels[SCIF_SCFCR2.RTRG]; +} -//Read OLNY -//SCIF SCFDR2 0xFFE8001C 0x1FE8001C 16 0x0000 0x0000 Held Held Pclk -SCFDR2_type SCIF_SCFDR2; +bool SCIFSerialPort::txDone() +{ + if (!transmitting || SCIF_SCFCR2.TFRST == 1) + return false; + if (txFifo.empty()) + { + setStatusBit(TEND); + transmitting = false; + return false; // don't reschedule + } + u8 v = txFifo.front(); + txFifo.pop_front(); + if (pipe != nullptr) + pipe->write(v); + if (isTDFE()) { + setStatusBit(TDFE); + updateInterrupts(); + } + return true; +} -//SCIF SCSPTR2 0xFFE80020 0x1FE80020 16 0x0000 0x0000 Held Held Pclk -SCSPTR2_type SCIF_SCSPTR2; +void SCIFSerialPort::rxSched() +{ + if (pipe == nullptr) + return; -//SCIF SCLSR2 0xFFE80024 0x1FE80024 16 0x0000 0x0000 Held Held Pclk -SCLSR2_type SCIF_SCLSR2; -*/ + if (pipe->available() > 0) + { + u8 v = pipe->read(); + if (SCIF_SCSCR2.RE == 0 || SCIF_SCFCR2.RFRST == 1) + return; + if (rxFifo.size() == 16) + { + // rx overrun + SCIF_SCLSR2.ORER = 1; + updateInterrupts(); + INFO_LOG(SH4, "scif: Receive overrun"); + } + else + { + rxFifo.push_back(v); + if (isRDF()) { + setStatusBit(RDF); + updateInterrupts(); + } + } + } + else if (!rxFifo.empty()) + { + setStatusBit(DR); + updateInterrupts(); + } +} -static void Serial_UpdateInterrupts() +void SCIFSerialPort::updateBaudRate() { - InterruptPend(sh4_SCIF_TXI, SCIF_SCFSR2.TDFE); - InterruptMask(sh4_SCIF_TXI, SCIF_SCSCR2.TIE); - - InterruptPend(sh4_SCIF_RXI, SCIF_SCFSR2.RDF || SCIF_SCFSR2.DR); - InterruptMask(sh4_SCIF_RXI, SCIF_SCSCR2.RIE); + // 1 start bit, 7 or 8 data bits, optional parity bit, 1 or 2 stop bits + frameSize = 1 + 8 - SCIF_SCSMR2.CHR + SCIF_SCSMR2.PE + 1 + SCIF_SCSMR2.STOP; + int bauds = SH4_MAIN_CLOCK / 4 / (SCIF_SCBRR2 + 1) / 32 / (1 << (SCIF_SCSMR2.CKS * 2)); + cyclesPerBit = SH4_MAIN_CLOCK / bauds; + INFO_LOG(SH4, "SCIF: Frame size %d cycles/bit %d (%d bauds) pipe %p", frameSize, cyclesPerBit, bauds, pipe); + sh4_sched_request(schedId, frameSize * cyclesPerBit); } -void serial_updateStatusRegister() +// SCIF SCFTDR2 - Transmit FIFO Data Register +void SCIFSerialPort::SCFTDR2_write(u8 data) { - if (serialPipe != nullptr) + SCIF_LOG("serial out %02x %c fifo_sz %d", data, data == '\0' ? ' ' : data, (int)txFifo.size()); + if (SCIF_SCFCR2.TFRST == 1) + return; + if (SCIF_SCSMR2.CHR == 1) + data &= 0x7f; + if (txFifo.empty() && !transmitting && SCIF_SCSCR2.TE == 1) { - constexpr int trigLevels[] { 1, 4, 8, 14 }; - int avail = serialPipe->available(); - - if (avail >= trigLevels[SCIF_SCFCR2.RTRG1 * 2 + SCIF_SCFCR2.RTRG0]) - SCIF_SCFSR2.RDF = 1; - if (avail >= 1) - SCIF_SCFSR2.DR = 1; - Serial_UpdateInterrupts(); + if (pipe != nullptr) + pipe->write(data); + transmitting = true; + // Need to reschedule so it doesn't happen too early (f355) + sh4_sched_request(schedId, frameSize * cyclesPerBit); + setStatusBit(TDFE); // immediately transfer SCFTDR2 into the shift register + updateInterrupts(); + } + else if (txFifo.size() < 16) { + txFifo.push_back(data); } } -// SCIF SCFTDR2 -static void SerialWrite(u32 addr, u8 data) +// SCIF_SCFSR2 read - Serial Status Register +u16 SCIFSerialPort::readStatus() +{ +// SCIF_LOG("SCIF_SCFSR2.read %s%s%s%s%s%s%s%s", +// SCIF_SCFSR2.ER ? "ER " : "", +// SCIF_SCFSR2.TEND ? "TEND " : "", +// SCIF_SCFSR2.TDFE ? "TDFE " : "", +// SCIF_SCFSR2.BRK ? "BRK " : "", +// SCIF_SCFSR2.FER ? "FER " : "", +// SCIF_SCFSR2.PER ? "PER " : "", +// SCIF_SCFSR2.RDF ? "RDF " : "", +// SCIF_SCFSR2.DR ? "DR" : ""); + statusLastRead = SCIF_SCFSR2.full; + return SCIF_SCFSR2.full; +} + +void SCIFSerialPort::setStatusBit(StatusBit bit) +{ + statusLastRead &= ~bit; + SCIF_SCFSR2.full |= bit; +} + +// SCIF_SCFSR2 write - Serial Status Register +void SCIFSerialPort::writeStatus(u16 data) { - //DEBUG_LOG(COMMON, "serial %02x", data); - if (serialPipe != nullptr) - serialPipe->write(data); + data = data | ~0x00f3 | ~statusLastRead; + // RDF and TDFE cannot be reset until the trigger level is reached + if (isRDF()) + data |= RDF; + if (isTDFE()) + data |= TDFE; + if (!rxFifo.empty()) + data |= DR; + SCIF_LOG("SCIF_SCFSR2.reset %s%s%s%s%s%s%s%s", + (data & ER) ? "" : "ER ", + (data & TEND) ? "" : "TEND ", + (data & TDFE) ? "" : "TDFE ", + (data & BRK) ? "" : "BRK ", + (data & FER) ? "" : "FER ", + (data & PER) ? "" : "PER ", + (data & RDF) ? "" : "RDF ", + (data & DR) ? "" : "DR"); + + SCIF_SCFSR2.full &= data; + statusLastRead &= data; + + updateInterrupts(); +} - SCIF_SCFSR2.TDFE = 1; - SCIF_SCFSR2.TEND = 1; +//SCIF_SCFDR2 - FIFO Data Count Register +u16 SCIFSerialPort::SCFDR2_read() +{ + u16 rv = rxFifo.size() | (txFifo.size() << 8); + SCIF_LOG("SCIF: fifo count rx %d tx %d", rv & 0xff, rv >> 8); - Serial_UpdateInterrupts(); + return rv; } -//SCIF_SCFSR2 read -static u16 ReadSerialStatus(u32 addr) +//SCIF_SCFRDR2 - Receive FIFO Data Register +u8 SCIFSerialPort::SCFRDR2_read() { - serial_updateStatusRegister(); - return SCIF_SCFSR2.full; + if (rxFifo.empty()) { + INFO_LOG(SH4, "Empty rx fifo read"); + return 0; + } + u8 data = rxFifo.front(); + rxFifo.pop_front(); + SCIF_LOG("serial in %02x %c", data, data); + return data; } -static void WriteSerialStatus(u32 addr, u16 data) +SCIFSerialPort& SCIFSerialPort::Instance() { - if (!SCIF_SCFSR2.BRK) - data &= ~0x10; + static SCIFSerialPort instance; - SCIF_SCFSR2.full = data & 0x00f3; + return instance; +} + +//SCSCR2 - Serial Control Register +static u16 SCSCR2_read(u32 addr) +{ + return SCIF_SCSCR2.full; +} + +void SCIFSerialPort::SCSCR2_write(u16 data) +{ + SCIF_SCSCR2.full = data & 0x00fa; + if (SCIF_SCSCR2.TE == 0) + { + setStatusBit(TEND); + // TE must be cleared to send a break + setBreak(SCIF_SCSPTR2.SPB2IO == 1 && SCIF_SCSPTR2.SPB2DT == 0); + } + else { + setBreak(false); + } + updateInterrupts(); + SCIF_LOG("SCIF_SCSCR2= %s%s%s%s%s", + SCIF_SCSCR2.TIE ? "TIE " : "", + SCIF_SCSCR2.RIE ? "RIE " : "", + SCIF_SCSCR2.TE ? "TE " : "", + SCIF_SCSCR2.RE ? "RE " : "", + SCIF_SCSCR2.REIE ? "REIE" : ""); +} - SCIF_SCFSR2.TDFE = 1; - SCIF_SCFSR2.TEND = 1; +// SCSPTR2 - Serial Port Register +static u16 SCSPTR2_read(u32 addr) +{ + SCIF_LOG("SCIF_SCSPTR2.read %x", SCIF_SCSPTR2.full); + return SCIF_SCSPTR2.full & ~0x10; // CTS active/low +} - serial_updateStatusRegister(); +void SCIFSerialPort::setBreak(bool on) +{ + if (on) { + // tetris needs to send/receive breaks + if (!sh4_sched_is_scheduled(brkSchedId)) + sh4_sched_request(brkSchedId, cyclesPerBit * frameSize); + } + else { + if (sh4_sched_is_scheduled(brkSchedId)) + sh4_sched_request(brkSchedId, -1); + } } -//SCIF_SCFDR2 - 16b -static u16 Read_SCFDR2(u32 addr) +void SCIFSerialPort::SCSPTR2_write(u16 data) { - if (serialPipe != nullptr) - return std::min(16, serialPipe->available()); + SCIF_SCSPTR2.full = data & 0x00f3; + if (SCIF_SCSPTR2.SPB2IO == 1) + setBreak(SCIF_SCSPTR2.SPB2DT == 0 && SCIF_SCSCR2.TE == 0); else - return 0; + setBreak(false); + + SCIF_LOG("SCIF_SCSPTR2= %s%s%s%s%s%s", + SCIF_SCSPTR2.RTSIO ? "RTSIO " : "", + SCIF_SCSPTR2.RTSDT ? "RTSDT " : "", + SCIF_SCSPTR2.CTSIO ? "CTSIO " : "", + SCIF_SCSPTR2.CTSDT ? "CTSDT " : "", + SCIF_SCSPTR2.SPB2IO ? "SPB2IO " : "", + SCIF_SCSPTR2.SPB2DT ? "SPB2DT" : ""); } -//SCIF_SCFRDR2 -static u8 ReadSerialData(u32 addr) +// SCFCR2 - FIFO Control Register +u16 SCIFSerialPort::SCFCR2_read(u32 addr) { - u8 data = 0; - if (serialPipe != nullptr) - data = serialPipe->read(); - serial_updateStatusRegister(); +// SCIF_LOG("SCIF_SCFCR2.read %x", SCIF_SCFCR2.full); + return SCIF_SCFCR2.full; +} - return data; +void SCIFSerialPort::SCFCR2_write(u16 data) +{ + if (SCIF_SCFCR2.TFRST == 1 && !(data & 4)) + { + // when TFRST 1 -> 0 + // seems to help tetris send data during sync + setStatusBit(TEND); + setStatusBit(TDFE); + updateInterrupts(); + } + SCIF_SCFCR2.full = data & 0x00ff; + if (SCIF_SCFCR2.TFRST == 1) + { + txFifo.clear(); + if (pipe == nullptr) + sh4_sched_request(schedId, -1); + transmitting = false; + } + if (SCIF_SCFCR2.RFRST == 1) + rxFifo.clear(); + SCIF_LOG("SCIF_SCFCR2= %s%s%sTTRG %d RTRG %d", + SCIF_SCFCR2.RFRST ? "RFRST " : "", + SCIF_SCFCR2.TFRST ? "TFRST " : "", + SCIF_SCFCR2.MCE ? "MCE " : "", + SCIF_SCFCR2.TTRG, + SCIF_SCFCR2.RTRG); } -//SCSCR2 +// SCBRR2 - Bit Rate Register +void SCIFSerialPort::SCBRR2_write(u32 addr, u8 data) +{ + SCIF_SCBRR2 = data; + Instance().updateBaudRate(); +} -static u16 SCSCR2_read(u32 addr) +// SCSMR2 - Serial Mode Register +void SCIFSerialPort::SCSMR2_write(u32 addr, u16 data) { - return SCIF_SCSCR2.full; + SCIF_SCSMR2.full = data & 0x007b; + Instance().updateBaudRate(); } -static void SCSCR2_write(u32 addr, u16 data) +void SCIFSerialPort::receiveBreak() { - SCIF_SCSCR2.full = data & 0x00fa; + SCIF_LOG("Break received"); + setStatusBit(BRK); + updateInterrupts(); +} + +void SCIFSerialPort::sendBreak() +{ + if (pipe != nullptr) + pipe->sendBreak(); +} - Serial_UpdateInterrupts(); + +void SCIFSerialPort::init() +{ + if (schedId == -1) + schedId = sh4_sched_register(0, schedCallback, this); + if (brkSchedId == -1) + brkSchedId = sh4_sched_register(1, schedCallback, this); +} + +void SCIFSerialPort::term() +{ + if (schedId != -1) { + sh4_sched_unregister(schedId); + schedId = -1; + } + if (brkSchedId != -1) { + sh4_sched_unregister(brkSchedId); + brkSchedId = -1; + } +} + +void SCIFSerialPort::reset() +{ + sh4_sched_request(brkSchedId, -1); + transmitting = false; + statusLastRead = 0; + txFifo.clear(); + rxFifo.clear(); + updateBaudRate(); +} + +void SCIFSerialPort::serialize(Serializer& ser) +{ + sh4_sched_serialize(ser, schedId); + sh4_sched_serialize(ser, brkSchedId); + ser << statusLastRead; + ser << (int)txFifo.size(); + for (u8 b : txFifo) + ser << b; + ser << (int)rxFifo.size(); + for (u8 b : rxFifo) + ser << b; + ser << transmitting; +} + +void SCIFSerialPort::deserialize(Deserializer& deser) +{ + txFifo.clear(); + rxFifo.clear(); + if (deser.version() >= Deserializer::V43) + { + sh4_sched_deserialize(deser, schedId); + sh4_sched_deserialize(deser, brkSchedId); + deser >> statusLastRead; + int size; + deser >> size; + for (int i = 0; i < size; i++) + { + u8 b; + deser >> b; + txFifo.push_back(b); + } + deser >> size; + for (int i = 0; i < size; i++) + { + u8 b; + deser >> b; + rxFifo.push_back(b); + } + deser >> transmitting; + } + else + { + statusLastRead = 0; + transmitting = false; + } + SCIF_SCBRR2 &= 0xff; // work around previous issues with dynarecs + updateBaudRate(); } -struct PTYPipe : public SerialPipe +struct PTYPipe : public SerialPort::Pipe { - void write(u8 data) override { - if (config::SerialConsole) - ::write(tty, &data, 1); + void write(u8 data) override + { + if (config::SerialConsole) { + int rc = ::write(tty, &data, 1); + (void)rc; + } } int available() override { @@ -163,10 +463,13 @@ struct PTYPipe : public SerialPipe return count; } - u8 read() override { + u8 read() override + { u8 data = 0; - if (tty != 1) - ::read(tty, &data, 1); + if (tty != 1) { + int rc = ::read(tty, &data, 1); + (void)rc; + } return data; } @@ -204,7 +507,7 @@ struct PTYPipe : public SerialPipe } #endif } - serial_setPipe(this); + SCIFSerialPort::Instance().setPipe(this); } void term() @@ -214,12 +517,46 @@ struct PTYPipe : public SerialPipe ::close(tty); tty = 1; } + SCIFSerialPort::Instance().setPipe(nullptr); } private: int tty = 1; }; -static PTYPipe ptyPipe; + +void setupPtyPipe() +{ + static PTYPipe ptyPipe; + + if (config::SerialConsole || config::SerialPTY) + { + if (SCIFSerialPort::Instance().getPipe() == nullptr) + ptyPipe.init(); + } + else + { + if (SCIFSerialPort::Instance().getPipe() == &ptyPipe) + ptyPipe.term(); + } +} + +template +class SingletonForward { + +}; + +template +struct SingletonForward +{ + static Ret(*forward(Ret(*function)(u32 addr, Args...)))(u32 addr, Args...) { + return function; + } +}; + +#define SINGLETON_FORWARD(accessor, function) \ + SingletonForward::type::function)>::forward([](u32 addr, auto... args) { \ + return accessor.function(args...); \ + }) //Init term res void SCIFRegisters::init() @@ -229,54 +566,41 @@ void SCIFRegisters::init() // Serial Communication Interface with FIFO //SCIF SCSMR2 0xFFE80000 0x1FE80000 16 0x0000 0x0000 Held Held Pclk - setRW(); + setWriteHandler(SCIFSerialPort::SCSMR2_write); //SCIF SCBRR2 0xFFE80004 0x1FE80004 8 0xFF 0xFF Held Held Pclk - setRW(); + setWriteHandler(SCIFSerialPort::SCBRR2_write); //SCIF SCSCR2 0xFFE80008 0x1FE80008 16 0x0000 0x0000 Held Held Pclk - setHandlers(SCSCR2_read, SCSCR2_write); + setHandlers(SCSCR2_read, SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCSCR2_write)); //SCIF SCFTDR2 0xFFE8000C 0x1FE8000C 8 Undefined Undefined Held Held Pclk - setWriteOnly(SerialWrite); + setWriteOnly(SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCFTDR2_write)); //SCIF SCFSR2 0xFFE80010 0x1FE80010 16 0x0060 0x0060 Held Held Pclk - setHandlers(ReadSerialStatus, WriteSerialStatus); + setHandlers(SINGLETON_FORWARD(SCIFSerialPort::Instance(), readStatus), + SINGLETON_FORWARD(SCIFSerialPort::Instance(), writeStatus)); //READ only //SCIF SCFRDR2 0xFFE80014 0x1FE80014 8 Undefined Undefined Held Held Pclk - setReadOnly(ReadSerialData); + setReadOnly(SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCFRDR2_read)); //SCIF SCFCR2 0xFFE80018 0x1FE80018 16 0x0000 0x0000 Held Held Pclk - setRW(); + setHandlers(SCIFSerialPort::SCFCR2_read, SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCFCR2_write)); //Read only //SCIF SCFDR2 0xFFE8001C 0x1FE8001C 16 0x0000 0x0000 Held Held Pclk - setReadOnly(Read_SCFDR2); + setReadOnly(SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCFDR2_read)); //SCIF SCSPTR2 0xFFE80020 0x1FE80020 16 0x0000 0x0000 Held Held Pclk - setRW(); + setHandlers(SCSPTR2_read, SINGLETON_FORWARD(SCIFSerialPort::Instance(), SCSPTR2_write)); //SCIF SCLSR2 0xFFE80024 0x1FE80024 16 0x0000 0x0000 Held Held Pclk setRW(); - reset(true); -} - -void SCIRegisters::init() -{ - super::init(); + SCIFSerialPort::Instance().init(); - // Serial Communication Interface - setRW(); - setRW(); - setRW(); - setRW(); - setRW(); - setReadOnly(); - setRW(); - - reset(); + reset(true); } void SCIFRegisters::reset(bool hard) @@ -299,25 +623,38 @@ void SCIFRegisters::reset(bool hard) SCIF_SCFSR2.full = 0x060; if (hard) - ptyPipe.init(); + SCIFSerialPort::Instance().setPipe(nullptr); + SCIFSerialPort::Instance().reset(); } -void SCIRegisters::reset() +void SCIFRegisters::term() { - super::reset(); + SCIFSerialPort::Instance().term(); - SCI_SCBRR1 = 0xff; - SCI_SCTDR1 = 0xff; - SCI_SCSSR1 = 0x84; + super::term(); } -void SCIFRegisters::term() +void SCIRegisters::init() { - super::term(); - ptyPipe.term(); + super::init(); + + // Serial Communication Interface + setRW(); + setRW(); + setRW(); + setRW(); + setRW(); + setReadOnly(); + setRW(); + + reset(); } -void serial_setPipe(SerialPipe *pipe) +void SCIRegisters::reset() { - serialPipe = pipe; + super::reset(); + + SCI_SCBRR1 = 0xff; + SCI_SCTDR1 = 0xff; + SCI_SCSSR1 = 0x84; } diff --git a/core/hw/sh4/modules/tmu.cpp b/core/hw/sh4/modules/tmu.cpp index 45e3589a1..6e9785132 100644 --- a/core/hw/sh4/modules/tmu.cpp +++ b/core/hw/sh4/modules/tmu.cpp @@ -218,7 +218,7 @@ static void write_TMU_TSTR(u32 addr, u8 data) turn_on_off_ch(i, data & (1 << i)); } -static int sched_tmu_cb(int ch, int sch_cycl, int jitter) +static int sched_tmu_cb(int ch, int sch_cycl, int jitter, void *arg) { if (tmu_mask[ch]) { diff --git a/core/hw/sh4/modules/wince.h b/core/hw/sh4/modules/wince.h index 71f9c2d5c..dd2e8e662 100644 --- a/core/hw/sh4/modules/wince.h +++ b/core/hw/sh4/modules/wince.h @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with reicast. If not, see . */ +#pragma once #ifdef TRACE_WINCE_SYSCALLS #include "hw/sh4/sh4_sched.h" @@ -362,7 +363,7 @@ static bool wince_resolve_address(u32 va, TLB_Entry &entry) u32 paddr = *(u32 *)&mem_b[(page_group + page) & ram_mask]; if (paddr & 0x80000000) { - u32 whatever = *(u32 *)&mem_b[(r_bank[4] + 0x14) & ram_mask]; + u32 whatever = *(u32 *)&mem_b[(p_sh4rcb->cntx.r_bank[4] + 0x14) & ram_mask]; if (whatever != *(u32 *)&mem_b[paddr & ram_mask]) { paddr += 12; diff --git a/core/hw/sh4/sh4_cache.h b/core/hw/sh4/sh4_cache.h index 5f9ba26e8..e99fe7f46 100644 --- a/core/hw/sh4/sh4_cache.h +++ b/core/hw/sh4/sh4_cache.h @@ -21,7 +21,7 @@ #include "types.h" #include "sh4_mem.h" #include "modules/mmu.h" -#include "hw/sh4/sh4_core.h" +#include "hw/sh4/sh4_if.h" #include "serialize.h" #include "sh4_cycles.h" @@ -55,6 +55,11 @@ static bool translatedArea(u32 area) class Sh4ICache { public: + void init(Sh4Context *ctx) { + this->ctx = ctx; + sh4cycles.init(ctx); + } + u16 ReadMem(u32 address) { bool cacheOn = false; @@ -177,7 +182,7 @@ class Sh4ICache return MmuError::BADADDR; const u32 area = address >> 29; - const bool userMode = sr.MD == 0; + const bool userMode = ctx->sr.MD == 0; if (userMode) { @@ -221,6 +226,8 @@ class Sh4ICache } std::array lines; + Sh4Cycles sh4cycles; + Sh4Context *ctx = nullptr; }; extern Sh4ICache icache; @@ -231,6 +238,11 @@ extern Sh4ICache icache; class Sh4OCache { public: + void init(Sh4Context *ctx) { + this->ctx = ctx; + sh4cycles.init(ctx); + } + template T ReadMem(u32 address) { @@ -514,7 +526,7 @@ class Sh4OCache return lookup; } const u32 area = address >> 29; - const bool userMode = sr.MD == 0; + const bool userMode = ctx->sr.MD == 0; // kernel mem protected in user mode if (userMode && (address & 0x80000000)) @@ -589,6 +601,8 @@ class Sh4OCache // TODO serialize u64 writeBackBufferCycles = 0; u64 writeThroughBufferCycles = 0; + Sh4Cycles sh4cycles; + Sh4Context *ctx = nullptr; }; extern Sh4OCache ocache; diff --git a/core/hw/sh4/sh4_core.h b/core/hw/sh4/sh4_core.h index 993f7350c..868616dc3 100644 --- a/core/hw/sh4/sh4_core.h +++ b/core/hw/sh4/sh4_core.h @@ -1,100 +1,11 @@ #pragma once #include "types.h" #include "sh4_if.h" -#include "cfg/option.h" +#include -#define r Sh4cntx.r -#define r_bank Sh4cntx.r_bank -#define gbr Sh4cntx.gbr -#define ssr Sh4cntx.ssr -#define spc Sh4cntx.spc -#define sgr Sh4cntx.sgr -#define dbr Sh4cntx.dbr -#define vbr Sh4cntx.vbr -#define mac Sh4cntx.mac -#define pr Sh4cntx.pr -#define fpul Sh4cntx.fpul -#define next_pc Sh4cntx.pc -#define curr_pc (next_pc-2) -#define sr Sh4cntx.sr -#define fpscr Sh4cntx.fpscr -#define old_sr Sh4cntx.old_sr -#define old_fpscr Sh4cntx.old_fpscr -#define fr (&Sh4cntx.xffr[16]) -#define xf Sh4cntx.xffr -#define fr_hex ((u32*)fr) -#define xf_hex ((u32*)xf) -#define dr_hex ((u64*)fr) -#define xd_hex ((u64*)xf) -#define sh4_int_bCpuRun Sh4cntx.CpuRunning - - - -void UpdateFPSCR(); +int UpdateSystem_INTC(); bool UpdateSR(); -void RestoreHostRoundingMode(); - -union DoubleReg -{ - f64 dbl; - f32 sgl[2]; -}; - -static inline f64 GetDR(u32 n) -{ -#ifdef TRACE - if (n>7) - INFO_LOG(SH4, "DR_r INDEX OVERRUN %d >7", n); -#endif - DoubleReg t; - - t.sgl[1]=fr[(n<<1) + 0]; - t.sgl[0]=fr[(n<<1) + 1]; - - return t.dbl; -} - -static inline f64 GetXD(u32 n) -{ -#ifdef TRACE - if (n>7) - INFO_LOG(SH4, "XD_r INDEX OVERRUN %d >7", n); -#endif - DoubleReg t; - - t.sgl[1]=xf[(n<<1) + 0]; - t.sgl[0]=xf[(n<<1) + 1]; - - return t.dbl; -} - -static inline void SetDR(u32 n,f64 val) -{ -#ifdef TRACE - if (n>7) - INFO_LOG(SH4, "DR_w INDEX OVERRUN %d >7", n); -#endif - DoubleReg t; - t.dbl=val; - - - fr[(n<<1) | 1]=t.sgl[0]; - fr[(n<<1) | 0]=t.sgl[1]; -} - -static inline void SetXD(u32 n,f64 val) -{ -#ifdef TRACE - if (n>7) - INFO_LOG(SH4, "XD_w INDEX OVERRUN %d >7", n); -#endif - - DoubleReg t; - t.dbl=val; - - xf[(n<<1) | 1]=t.sgl[0]; - xf[(n<<1) | 0]=t.sgl[1]; -} +void setDefaultRoundingMode(); struct SH4ThrownException { @@ -104,11 +15,6 @@ struct SH4ThrownException Sh4ExceptionCode expEvn; }; -static inline void RaiseFPUDisableException() -{ - throw SH4ThrownException(next_pc - 2, Sh4Ex_FpuDisabled); -} - static inline void AdjustDelaySlotException(SH4ThrownException& ex) { ex.epc -= 2; @@ -118,20 +24,13 @@ static inline void AdjustDelaySlotException(SH4ThrownException& ex) ex.expEvn = Sh4Ex_SlotIllegalInstr; } -// The SH4 sets the signaling bit to 0 for qNaN (unlike all recent CPUs). Some games rely on this. +// The SH4 sets the signaling bit to 0 for qNaN (unlike all recent CPUs). static inline f32 fixNaN(f32 f) { #ifdef STRICT_MODE u32& hex = *(u32 *)&f; -#ifdef __FAST_MATH__ - // fast-math - if ((hex & 0x7fffffff) > 0x7f800000) + if (std::isnan(f)) hex = 0x7fbfffff; -#else - // no fast-math - if (f != f) - hex = 0x7fbfffff; -#endif #endif return f; } @@ -140,15 +39,8 @@ static inline f64 fixNaN64(f64 f) { #ifdef STRICT_MODE u64& hex = *(u64 *)&f; -#ifdef __FAST_MATH__ - // fast-math - if ((hex & 0x7fffffffffffffffll) > 0x7ff0000000000000ll) + if (std::isnan(f)) hex = 0x7ff7ffffffffffffll; -#else - // no fast-math - if (f != f) - hex = 0x7ff7ffffffffffffll; -#endif #endif return f; } diff --git a/core/hw/sh4/sh4_core_regs.cpp b/core/hw/sh4/sh4_core_regs.cpp index 27e53cc76..7542f1388 100644 --- a/core/hw/sh4/sh4_core_regs.cpp +++ b/core/hw/sh4/sh4_core_regs.cpp @@ -5,38 +5,34 @@ #include "types.h" #include "sh4_core.h" #include "sh4_interrupts.h" - +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM +#include +#endif Sh4RCB* p_sh4rcb; -sh4_if sh4_cpu; static void ChangeGPR() { - std::swap((u32 (&)[8])r, r_bank); -} - -static void ChangeFP() -{ - std::swap((f32 (&)[16])Sh4cntx.xffr, *(f32 (*)[16])&Sh4cntx.xffr[16]); + std::swap((u32 (&)[8])Sh4cntx.r, Sh4cntx.r_bank); } //called when sr is changed and we must check for reg banks etc. //returns true if interrupt pending bool UpdateSR() { - if (sr.MD) + if (Sh4cntx.sr.MD) { - if (old_sr.RB != sr.RB) + if (Sh4cntx.old_sr.RB != Sh4cntx.sr.RB) ChangeGPR();//bank change } else { - if (old_sr.RB) + if (Sh4cntx.old_sr.RB) ChangeGPR();//switch } - old_sr.status = sr.status; - old_sr.RB &= sr.MD; + Sh4cntx.old_sr.status = Sh4cntx.sr.status; + Sh4cntx.old_sr.RB &= Sh4cntx.sr.MD; return SRdecode(); } @@ -45,21 +41,21 @@ bool UpdateSR() static u32 old_rm = 0xFF; static u32 old_dn = 0xFF; -static void setHostRoundingMode() +static void setHostRoundingMode(u32 roundingMode, u32 denorm2zero) { - if ((old_rm!=fpscr.RM) || (old_dn!=fpscr.DN)) + if (old_rm != roundingMode || old_dn != denorm2zero) { - old_rm=fpscr.RM ; - old_dn=fpscr.DN ; + old_rm = roundingMode; + old_dn = denorm2zero; //Correct rounding is required by some games (SOTB, etc) #ifdef _MSC_VER - if (fpscr.RM == 1) //if round to 0 , set the flag + if (roundingMode == 1) // if round to 0 , set the flag _controlfp(_RC_CHOP, _MCW_RC); else _controlfp(_RC_NEAR, _MCW_RC); - if (fpscr.DN) //denormals are considered 0 + if (denorm2zero == 1) // denormals are considered 0 _controlfp(_DN_FLUSH, _MCW_DN); else _controlfp(_DN_SAVE, _MCW_DN); @@ -69,41 +65,49 @@ static void setHostRoundingMode() u32 temp=0x1f80; //no flush to zero && round to nearest - if (fpscr.RM==1) //if round to 0 , set the flag + if (roundingMode==1) // if round to 0 , set the flag temp|=(3<<13); - if (fpscr.DN) //denormals are considered 0 + if (denorm2zero == 1) // denormals are considered 0 temp|=(1<<15); asm("ldmxcsr %0" : : "m"(temp)); #elif HOST_CPU==CPU_ARM - static const unsigned int x = 0x04086060; - unsigned int y = 0x02000000; - if (fpscr.RM==1) //if round to 0 , set the flag - y|=3<<22; + static const unsigned int offMask = 0x04086060; + unsigned int onMask = 0x02000000; + + if (roundingMode == 1) + onMask |= 3 << 22; + + if (denorm2zero == 1) + onMask |= 1 << 24; + + #ifdef __ANDROID__ + fenv_t fenv; + fegetenv(&fenv); + fenv &= offMask; + fenv |= onMask; + fesetenv(&fenv); + #else + int raa; - if (fpscr.DN) - y|=1<<24; - - - int raa; - - asm volatile - ( - "fmrx %0, fpscr \n\t" - "and %0, %0, %1 \n\t" - "orr %0, %0, %2 \n\t" - "fmxr fpscr, %0 \n\t" - : "=r"(raa) - : "r"(x), "r"(y) - ); + asm volatile + ( + "fmrx %0, fpscr \n\t" + "and %0, %0, %1 \n\t" + "orr %0, %0, %2 \n\t" + "fmxr fpscr, %0 \n\t" + : "=r"(raa) + : "r"(offMask), "r"(onMask) + ); + #endif #elif HOST_CPU == CPU_ARM64 static const unsigned long off_mask = 0x04080000; unsigned long on_mask = 0x02000000; // DN=1 Any operation involving one or more NaNs returns the Default NaN - if (fpscr.RM == 1) // if round to 0, set the flag + if (roundingMode == 1) on_mask |= 3 << 22; - if (fpscr.DN) + if (denorm2zero == 1) on_mask |= 1 << 24; // flush denormalized numbers to zero asm volatile @@ -114,6 +118,7 @@ static void setHostRoundingMode() "MSR FPCR, x10 \n\t" : : "r"(off_mask), "r"(on_mask) + : "x10" ); #else #error "SetFloatStatusReg: Unsupported platform" @@ -124,120 +129,24 @@ static void setHostRoundingMode() } //called when fpscr is changed and we must check for reg banks etc.. -void UpdateFPSCR() +void DYNACALL Sh4Context::UpdateFPSCR(Sh4Context *ctx) { - if (fpscr.FR !=old_fpscr.FR) - ChangeFP(); // FPU bank change + if (ctx->fpscr.FR != ctx->old_fpscr.FR) + // FPU bank change + std::swap(ctx->xf, ctx->fr); - old_fpscr=fpscr; - setHostRoundingMode(); + ctx->old_fpscr = ctx->fpscr; + setHostRoundingMode(ctx->fpscr.RM, ctx->fpscr.DN); } -void RestoreHostRoundingMode() +void Sh4Context::restoreHostRoundingMode() { old_rm = 0xFF; old_dn = 0xFF; - setHostRoundingMode(); -} - -static u32* Sh4_int_GetRegisterPtr(Sh4RegType reg) -{ - if ((reg>=reg_r0) && (reg<=reg_r15)) - { - return &r[reg-reg_r0]; - } - else if ((reg>=reg_r0_Bank) && (reg<=reg_r7_Bank)) - { - return &r_bank[reg-reg_r0_Bank]; - } - else if ((reg>=reg_fr_0) && (reg<=reg_fr_15)) - { - return &fr_hex[reg-reg_fr_0]; - } - else if ((reg>=reg_xf_0) && (reg<=reg_xf_15)) - { - return &xf_hex[reg-reg_xf_0]; - } - else - { - switch(reg) - { - case reg_gbr : - return &gbr; - break; - case reg_vbr : - return &vbr; - break; - - case reg_ssr : - return &ssr; - break; - - case reg_spc : - return &spc; - break; - - case reg_sgr : - return &sgr; - break; - - case reg_dbr : - return &dbr; - break; - - case reg_mach : - return &mac.h; - break; - - case reg_macl : - return &mac.l; - break; - - case reg_pr : - return ≺ - break; - - case reg_fpul : - return &fpul; - break; - - - case reg_nextpc : - return &next_pc; - break; - - case reg_sr_status : - return &sr.status; - break; - - case reg_sr_T : - return &sr.T; - break; - - case reg_old_fpscr : - return &old_fpscr.full; - break; - - case reg_fpscr : - return &fpscr.full; - break; - - case reg_pc_dyn: - return &Sh4cntx.jdyn; - - case reg_temp: - return &Sh4cntx.temp_reg; - - default: - ERROR_LOG(SH4, "Unknown register ID %d", reg); - die("Invalid reg"); - return 0; - break; - } - } + setHostRoundingMode(fpscr.RM, fpscr.DN); } -u32* GetRegPtr(u32 reg) +void setDefaultRoundingMode() { - return Sh4_int_GetRegisterPtr((Sh4RegType)reg); + setHostRoundingMode(0, 0); } diff --git a/core/hw/sh4/sh4_cycles.cpp b/core/hw/sh4/sh4_cycles.cpp index 5588c9d6a..e55ca0760 100644 --- a/core/hw/sh4/sh4_cycles.cpp +++ b/core/hw/sh4/sh4_cycles.cpp @@ -17,6 +17,74 @@ along with Flycast. If not, see . */ #include "sh4_cycles.h" +#include "modules/mmu.h" + +int Sh4Cycles::countCycles(u16 op) +{ + sh4_opcodelistentry *opcode = OpDesc[op]; + int cycles = 0; +#ifndef STRICT_MODE + static const bool isMemOp[45] { + false, + false, + true, // all mem moves, ldtlb, sts.l FPUL/FPSCR, @-Rn, lds.l @Rn+,FPUL + true, // gbr-based load/store + false, + true, // tst.b #, @(R0,GBR) + true, // and/or/xor.b #, @(R0,GBR) + true, // tas.b @Rn + false, + false, + false, + false, + true, // movca.l R0, @Rn + false, + false, + false, + false, + true, // ldc.l @Rn+, VBR/SPC/SSR/Rn_Bank/DBR + true, // ldc.l @Rn+, GBR/SGR + true, // ldc.l @Rn+, SR + false, + false, + true, // stc.l DBR/SR/GBR/VBR/SSR/SPC/Rn_Bank, @-Rn + true, // stc.l SGR, @-Rn + false, + true, // lds.l @Rn+, PR + false, + true, // sts.l PR, @-Rn + false, + true, // lds.l @Rn+, MACH/MACL + false, + true, // sts.l MACH/MACL, @-Rn + false, + true, // lds.l @Rn+,FPSCR + false, + true, // mac.wl @Rm+,@Rn+ + }; + if (isMemOp[opcode->ex_type]) + { + if (++memOps < 4) + cycles = mmu_enabled() ? 5 : 2; + } + // TODO only for mem read? +#endif + + if (lastUnit == CO + || opcode->unit == CO + || (lastUnit == opcode->unit && lastUnit != MT)) + { + // cannot run in parallel + lastUnit = opcode->unit; + cycles += opcode->IssueCycles; + } + else + { + // can run in parallel + lastUnit = CO; + } + return cycles * cpuRatio; +} // TODO additional wait cycles depending on area?: // Area Wait cycles (not including external wait) diff --git a/core/hw/sh4/sh4_cycles.h b/core/hw/sh4/sh4_cycles.h index 46354980f..246a1bd4d 100644 --- a/core/hw/sh4/sh4_cycles.h +++ b/core/hw/sh4/sh4_cycles.h @@ -21,75 +21,46 @@ #include "sh4_opcode_list.h" #include "sh4_if.h" #include "sh4_sched.h" -#include "modules/mmu.h" class Sh4Cycles { public: Sh4Cycles(int cpuRatio = 1) : cpuRatio(cpuRatio) {} + void init(Sh4Context *ctx) { + this->ctx = ctx; + } + void executeCycles(u16 op) { - Sh4cntx.cycle_counter -= countCycles(op); + ctx->cycle_counter -= countCycles(op); } void addCycles(int cycles) const { - Sh4cntx.cycle_counter -= cycles; + ctx->cycle_counter -= cycles; } void addReadAccessCycles(u32 addr, u32 size) const { - Sh4cntx.cycle_counter -= readAccessCycles(addr, size); + ctx->cycle_counter -= readAccessCycles(addr, size); } void addWriteAccessCycles(u32 addr, u32 size) const { - Sh4cntx.cycle_counter -= writeAccessCycles(addr, size); + ctx->cycle_counter -= writeAccessCycles(addr, size); } - int countCycles(u16 op) - { - sh4_opcodelistentry *opcode = OpDesc[op]; - int cycles = 0; -#ifndef STRICT_MODE - if (opcode->ex_type == 2 || opcode->ex_type == 3 - || opcode->ex_type == 5 || opcode->ex_type == 6 || opcode->ex_type == 7 - // cache mgmt || opcode->ex_type == 10 || opcode->ex_type == 11 - || opcode->ex_type == 12 - || opcode->ex_type == 17 || opcode->ex_type == 18 || opcode->ex_type == 19 - || opcode->ex_type == 22 || opcode->ex_type == 23 || opcode->ex_type == 25 - || opcode->ex_type == 27 || opcode->ex_type == 29 || opcode->ex_type == 31 - || opcode->ex_type == 33 || opcode->ex_type == 35) - { - cycles = mmu_enabled() ? 5 : 2; - } - // TODO only for mem read? -#endif - - if (lastUnit == CO - || opcode->unit == CO - || (lastUnit == opcode->unit && lastUnit != MT)) - { - // cannot run in parallel - lastUnit = opcode->unit; - cycles += opcode->IssueCycles; - } - else - { - // can run in parallel - lastUnit = CO; - } - return cycles * cpuRatio; - } + int countCycles(u16 op); void reset() { lastUnit = CO; + memOps = 0; } - static u64 now() { - return sh4_sched_now64() + SH4_TIMESLICE - Sh4cntx.cycle_counter; + u64 now() { + return sh4_sched_now64() + SH4_TIMESLICE - ctx->cycle_counter; } int readAccessCycles(u32 addr, u32 size) const { @@ -108,6 +79,6 @@ class Sh4Cycles sh4_eu lastUnit = CO; const int cpuRatio; + int memOps = 0; + Sh4Context *ctx = nullptr; }; - -extern Sh4Cycles sh4cycles; diff --git a/core/hw/sh4/sh4_if.h b/core/hw/sh4/sh4_if.h index 23cba5351..217e53071 100644 --- a/core/hw/sh4/sh4_if.h +++ b/core/hw/sh4/sh4_if.h @@ -1,180 +1,71 @@ #pragma once #include "types.h" #include "stdclass.h" +#include -enum Sh4RegType -{ - //GPRs - reg_r0, - reg_r1, - reg_r2, - reg_r3, - reg_r4, - reg_r5, - reg_r6, - reg_r7, - reg_r8, - reg_r9, - reg_r10, - reg_r11, - reg_r12, - reg_r13, - reg_r14, - reg_r15, - - //FPU, bank 0 - reg_fr_0, - reg_fr_1, - reg_fr_2, - reg_fr_3, - reg_fr_4, - reg_fr_5, - reg_fr_6, - reg_fr_7, - reg_fr_8, - reg_fr_9, - reg_fr_10, - reg_fr_11, - reg_fr_12, - reg_fr_13, - reg_fr_14, - reg_fr_15, - - //FPU, bank 1 - reg_xf_0, - reg_xf_1, - reg_xf_2, - reg_xf_3, - reg_xf_4, - reg_xf_5, - reg_xf_6, - reg_xf_7, - reg_xf_8, - reg_xf_9, - reg_xf_10, - reg_xf_11, - reg_xf_12, - reg_xf_13, - reg_xf_14, - reg_xf_15, - - //GPR Interrupt bank - reg_r0_Bank, - reg_r1_Bank, - reg_r2_Bank, - reg_r3_Bank, - reg_r4_Bank, - reg_r5_Bank, - reg_r6_Bank, - reg_r7_Bank, - - //Misc regs - reg_gbr, - reg_ssr, - reg_spc, - reg_sgr, - reg_dbr, - reg_vbr, - reg_mach, - reg_macl, - reg_pr, - reg_fpul, - reg_nextpc, - reg_sr_status, //Only the status bits - reg_sr_T, //Only T - reg_old_fpscr, - reg_fpscr, - - reg_pc_dyn, //Write only, for dynarec only (dynamic block exit address) - reg_temp, - - sh4_reg_count, - - /* - These are virtual registers, used by the dynarec decoder - */ - regv_dr_0, - regv_dr_2, - regv_dr_4, - regv_dr_6, - regv_dr_8, - regv_dr_10, - regv_dr_12, - regv_dr_14, - - regv_xd_0, - regv_xd_2, - regv_xd_4, - regv_xd_6, - regv_xd_8, - regv_xd_10, - regv_xd_12, - regv_xd_14, - - regv_fv_0, - regv_fv_4, - regv_fv_8, - regv_fv_12, - - regv_xmtrx, - regv_fmtrx, - - NoReg=-1 -}; - -//Varius sh4 registers +// SR (status register) union sr_status_t { struct { - u32 T_h : 1;//<<0 - u32 S : 1;//<<1 - u32 rsvd0 : 2;//<<2 - u32 IMASK : 4;//<<4 - u32 Q : 1;//<<8 - u32 M : 1;//<<9 - u32 rsvd1 : 5;//<<10 - u32 FD : 1;//<<15 - u32 rsvd2 : 12;//<<16 - u32 BL : 1;//<<28 - u32 RB : 1;//<<29 - u32 MD : 1;//<<20 - u32 rsvd3 : 1;//<<31 + u32 T_h : 1; + u32 S : 1; + u32 : 2; + u32 IMASK : 4; + u32 Q : 1; + u32 M : 1; + u32 : 5; + u32 FD : 1; + u32 : 12; + u32 BL : 1; + u32 RB : 1; + u32 MD : 1; + u32 : 1; }; u32 status; }; -#define STATUS_MASK 0x700083F2 - -//Status register bitfield +// Status register with isolated T bit. +// Used in place of the normal SR bitfield so that the T bit can be +// handled as a regular register. This simplifies dynarec implementations. struct sr_t { union { struct { - u32 T_h : 1;//<<0 - u32 S : 1;//<<1 - u32 rsvd0 : 2;//<<2 - u32 IMASK : 4;//<<4 - u32 Q : 1;//<<8 - u32 M : 1;//<<9 - u32 rsvd1 : 5;//<<10 - u32 FD : 1;//<<15 - u32 rsvd2 : 12;//<<16 - u32 BL : 1;//<<28 - u32 RB : 1;//<<29 - u32 MD : 1;//<<20 - u32 rsvd3 : 1;//<<31 + u32 T_h : 1; + u32 S : 1; + u32 : 2; + u32 IMASK : 4; + u32 Q : 1; + u32 M : 1; + u32 : 5; + u32 FD : 1; + u32 : 12; + u32 BL : 1; + u32 RB : 1; + u32 MD : 1; + u32 : 1; }; u32 status; }; u32 T; + static constexpr u32 MASK = 0x700083F2; + + u32 getFull() const { + return (status & MASK) | T; + } + + void setFull(u32 v) { + status = v & MASK; + T = v & 1; + } }; -//FPSCR (fpu status and control register) bitfield +// FPSCR (fpu status and control register) struct fpscr_t { union @@ -203,31 +94,34 @@ struct fpscr_t u32 PR : 1; u32 SZ : 1; u32 FR : 1; - u32 pad : 10; - }; - struct - { - u32 _nil : 2+1+1+1+1+4+8+1; - u32 PR_SZ : 2; - u32 nilz : 11; + u32 : 10; }; }; }; //sh4 interface -struct sh4_if +class Sh4Executor { - void (*Run)(); - void (*Stop)(); - void (*Step)(); - void (*Reset)(bool hard); - void (*Init)(); - void (*Term)(); - void (*ResetCache)(); - bool (*IsCpuRunning)(); +public: + virtual ~Sh4Executor() = default; + virtual void Run() = 0; + virtual void Start() = 0; + virtual void Stop() = 0; + virtual void Step() = 0; + virtual void Reset(bool hard) = 0; + virtual void Init() = 0; + virtual void Term() = 0; + virtual void ResetCache() = 0; + virtual bool IsCpuRunning() = 0; }; -extern sh4_if sh4_cpu; +struct alignas(32) SQBuffer { + u8 data[32]; +}; + +void setSqwHandler(); +struct Sh4Context; +typedef void DYNACALL SQWriteFunc(u32 dst, Sh4Context *ctx); struct alignas(64) Sh4Context { @@ -235,7 +129,10 @@ struct alignas(64) Sh4Context { struct { - f32 xffr[32]; + SQBuffer sq_buffer[2]; + + float xf[16]; + float fr[16]; u32 r[16]; union @@ -268,19 +165,55 @@ struct alignas(64) Sh4Context u32 temp_reg; int cycle_counter; + + SQWriteFunc *doSqWrite; }; - u64 raw[64-8]; + u64 raw[64]; }; -}; -struct alignas(32) SQBuffer { - u8 data[32]; -}; + u32& fr_hex(int idx) { + assert(idx >= 0 && idx <= 15); + return reinterpret_cast(fr[idx]); + } + u64& dr_hex(int idx) { + assert(idx >= 0 && idx <= 7); + return *reinterpret_cast(&fr[idx * 2]); + } + u64& xd_hex(int idx) { + assert(idx >= 0 && idx <= 7); + return *reinterpret_cast(&xf[idx * 2]); + } + + double getDR(u32 n) + { + assert(n <= 7); + DoubleReg t; + t.sgl[1] = fr[n * 2]; + t.sgl[0] = fr[n * 2 + 1]; -void setSqwHandler(); -void DYNACALL do_sqw_mmu(u32 dst); + return t.dbl; + } -typedef void DYNACALL sqw_fp(u32 dst, const SQBuffer *sqb); + void setDR(u32 n, double val) + { + assert(n <= 7); + DoubleReg t; + t.dbl = val; + fr[n * 2] = t.sgl[1]; + fr[n * 2 + 1] = t.sgl[0]; + } + + static void DYNACALL UpdateFPSCR(Sh4Context *ctx); + void restoreHostRoundingMode(); + +private: + union DoubleReg + { + double dbl; + float sgl[2]; + }; +}; +static_assert(sizeof(Sh4Context) == 512, "Invalid Sh4Context size"); #define FPCB_SIZE (RAM_SIZE_MAX/2) #define FPCB_MASK (FPCB_SIZE -1) @@ -290,40 +223,23 @@ typedef void DYNACALL sqw_fp(u32 dst, const SQBuffer *sqb); // want to be an i8r4 value that can be substracted in one op (such as 0x4100000) #define FPCB_PAD 0x100000 #else -#define FPCB_PAD 0x10000 +// For other systems we could use PAGE_SIZE, except on windows that has a 64 KB granularity for memory mapping +#define FPCB_PAD 64_KB #endif struct alignas(PAGE_SIZE) Sh4RCB { void* fpcb[FPCB_SIZE]; - u8 _pad[FPCB_PAD - sizeof(Sh4Context) - sizeof(SQBuffer) * 2 - sizeof(void *)]; - sqw_fp* do_sqw_nommu; - SQBuffer sq_buffer[2]; + u8 _pad[FPCB_PAD - sizeof(Sh4Context)]; Sh4Context cntx; }; +static_assert((sizeof(Sh4RCB) % PAGE_SIZE) == 0, "sizeof(Sh4RCB) not multiple of PAGE_SIZE"); extern Sh4RCB* p_sh4rcb; - -static inline u32 sh4_sr_GetFull() -{ - return (p_sh4rcb->cntx.sr.status & STATUS_MASK) | p_sh4rcb->cntx.sr.T; -} - -static inline void sh4_sr_SetFull(u32 value) -{ - p_sh4rcb->cntx.sr.status=value & STATUS_MASK; - p_sh4rcb->cntx.sr.T=value&1; -} - -#define do_sqw_nommu sh4rcb.do_sqw_nommu - -#define sh4rcb (*p_sh4rcb) -#define Sh4cntx (sh4rcb.cntx) +#define Sh4cntx (p_sh4rcb->cntx) //Get an interface to sh4 interpreter -void Get_Sh4Interpreter(sh4_if* cpu); -void Get_Sh4Recompiler(sh4_if* cpu); - -u32* GetRegPtr(u32 reg); +Sh4Executor *Get_Sh4Interpreter(); +Sh4Executor *Get_Sh4Recompiler(); enum Sh4ExceptionCode : u16 { diff --git a/core/hw/sh4/sh4_interpreter.h b/core/hw/sh4/sh4_interpreter.h index 9b9137e15..47dd2e444 100644 --- a/core/hw/sh4/sh4_interpreter.h +++ b/core/hw/sh4/sh4_interpreter.h @@ -1,43 +1,37 @@ #pragma once #include "types.h" -#include "sh4_if.h" +#include "sh4_cycles.h" -#undef sh4op -#define sh4op(str) void DYNACALL str (u32 op) -typedef void (DYNACALL OpCallFP) (u32 op); - -enum OpcodeType +class Sh4Interpreter : public Sh4Executor { - //basic - Normal = 0, // Heh , nothing special :P - ReadsPC = 1, // PC must be set upon calling it - WritesPC = 2, // It will write PC (branch) - Delayslot = 4, // Has a delayslot opcode , valid only when WritesPC is set - - WritesSR = 8, // Writes to SR , and UpdateSR needs to be called - WritesFPSCR = 16, // Writes to FPSCR , and UpdateSR needs to be called - Invalid = 128, // Invalid - - UsesFPU = 2048, // Floating point op - FWritesFPSCR = UsesFPU | WritesFPSCR, - - // Heh, not basic :P - ReadWritePC = ReadsPC|WritesPC, // Read and writes pc :P - WritesSRRWPC = WritesSR|ReadsPC|WritesPC, - - // Branches (not delay slot): - Branch_dir = ReadWritePC, // Direct (eg , pc=r[xx]) -- this one is ReadWritePC b/c the delayslot may use pc ;) - Branch_rel = ReadWritePC, // Relative (rg pc+=10); - - // Delay slot - Branch_dir_d = Delayslot|Branch_dir, // Direct (eg , pc=r[xx]) - Branch_rel_d = Delayslot|Branch_rel, // Relative (rg pc+=10); +public: + void Run() override; + void ResetCache() override {} + void Start() override; + void Stop() override; + void Step() override; + void Reset(bool hard) override; + void Init() override; + void Term() override; + bool IsCpuRunning() override; + void ExecuteDelayslot(); + void ExecuteDelayslot_RTE(); + Sh4Context *getContext() { return ctx; } + + static Sh4Interpreter *Instance; + +protected: + Sh4Context *ctx = nullptr; + +private: + void ExecuteOpcode(u16 op); + u16 ReadNexOp(); + + Sh4Cycles sh4cycles{CPU_RATIO}; + // SH4 underclock factor when using the interpreter so that it's somewhat usable +#ifdef STRICT_MODE + static constexpr int CPU_RATIO = 1; +#else + static constexpr int CPU_RATIO = 8; +#endif }; - -void ExecuteDelayslot(); -void ExecuteDelayslot_RTE(); - -#define SH4_TIMESLICE 448 // at 112 Bangai-O doesn't start. 224 is ok - -int UpdateSystem(); -int UpdateSystem_INTC(); diff --git a/core/hw/sh4/sh4_interrupts.cpp b/core/hw/sh4/sh4_interrupts.cpp index 6274f4272..49a3be455 100644 --- a/core/hw/sh4/sh4_interrupts.cpp +++ b/core/hw/sh4/sh4_interrupts.cpp @@ -141,10 +141,10 @@ void SIIDRebuild() //Decode SR.IMSK into a interrupt mask, update and return the interrupt state bool SRdecode() { - if (sr.BL) + if (Sh4cntx.sr.BL) decoded_srimask=~0xFFFFFFFF; else - decoded_srimask=~InterruptLevelBit[sr.IMASK]; + decoded_srimask=~InterruptLevelBit[Sh4cntx.sr.IMASK]; recalc_pending_itrs(); return Sh4cntx.interrupt_pend; @@ -185,14 +185,14 @@ static void Do_Interrupt(Sh4ExceptionCode intEvn) { CCN_INTEVT = intEvn; - ssr = sh4_sr_GetFull(); - spc = next_pc; - sgr = r[15]; - sr.BL = 1; - sr.MD = 1; - sr.RB = 1; + Sh4cntx.ssr = Sh4cntx.sr.getFull(); + Sh4cntx.spc = Sh4cntx.pc; + Sh4cntx.sgr = Sh4cntx.r[15]; + Sh4cntx.sr.BL = 1; + Sh4cntx.sr.MD = 1; + Sh4cntx.sr.RB = 1; UpdateSR(); - next_pc = vbr + 0x600; + Sh4cntx.pc = Sh4cntx.vbr + 0x600; debugger::subroutineCall(); } @@ -200,19 +200,19 @@ void Do_Exception(u32 epc, Sh4ExceptionCode expEvn) { assert((expEvn >= Sh4Ex_TlbMissRead && expEvn <= Sh4Ex_SlotIllegalInstr) || expEvn == Sh4Ex_FpuDisabled || expEvn == Sh4Ex_SlotFpuDisabled || expEvn == Sh4Ex_UserBreak); - if (sr.BL != 0) + if (Sh4cntx.sr.BL != 0) throw FlycastException("Fatal: SH4 exception when blocked"); CCN_EXPEVT = expEvn; - ssr = sh4_sr_GetFull(); - spc = epc; - sgr = r[15]; - sr.BL = 1; - sr.MD = 1; - sr.RB = 1; + Sh4cntx.ssr = Sh4cntx.sr.getFull(); + Sh4cntx.spc = epc; + Sh4cntx.sgr = Sh4cntx.r[15]; + Sh4cntx.sr.BL = 1; + Sh4cntx.sr.MD = 1; + Sh4cntx.sr.RB = 1; UpdateSR(); - next_pc = vbr + (expEvn == Sh4Ex_TlbMissRead || expEvn == Sh4Ex_TlbMissWrite ? 0x400 : 0x100); + Sh4cntx.pc = Sh4cntx.vbr + (expEvn == Sh4Ex_TlbMissRead || expEvn == Sh4Ex_TlbMissWrite ? 0x400 : 0x100); debugger::subroutineCall(); //printf("RaiseException: from pc %08x to %08x, event %x\n", epc, next_pc, expEvn); diff --git a/core/hw/sh4/sh4_mem.cpp b/core/hw/sh4/sh4_mem.cpp index ff8ee5e27..196cdf58f 100644 --- a/core/hw/sh4/sh4_mem.cpp +++ b/core/hw/sh4/sh4_mem.cpp @@ -9,9 +9,9 @@ #include "sh4_mmr.h" #include "hw/pvr/elan.h" #include "hw/pvr/pvr_mem.h" -#include "cfg/option.h" #include "hw/mem/addrspace.h" #include "hw/sh4/modules/mmu.h" +#include "cfg/option.h" #ifdef STRICT_MODE #include "sh4_cache.h" @@ -156,22 +156,21 @@ void mem_map_default() map_area4_init(); map_area5_init(); map_area6_init(); - map_area7_init(); - // 00-0C: 7 times the normal memmap mirrors - for (int i = 0; i < 7; i++) + // 00-E0: 8 times the normal memmap mirrors + for (int i = 0; i < 8; i++) { - map_area0(i << 5); //Bios,Flahsrom,i/f regs,Ext. Device,Sound Ram - map_area1(i << 5); //VRAM + map_area0(i << 5); // Bios,Flahsrom,i/f regs,Ext. Device,Sound Ram + map_area1(i << 5); // VRAM elan::vmem_map(i << 5); // Naomi2 Elan - map_area3(i << 5); //RAM - map_area4(i << 5); //TA - map_area5(i << 5); //Ext. Device - map_area6(i << 5); //Unassigned - map_area7(i << 5); //Sh4 Regs + map_area3(i << 5); // RAM + map_area4(i << 5); // TA + map_area5(i << 5); // Ext. Device + map_area6(i << 5); // Unassigned } + map_area7(); // On Chip RAM - // E0: p4 region + // E0-FF: P4 region map_p4(); } void mem_Init() diff --git a/core/hw/sh4/sh4_mmr.cpp b/core/hw/sh4/sh4_mmr.cpp index c584b24b8..314ff8f82 100644 --- a/core/hw/sh4/sh4_mmr.cpp +++ b/core/hw/sh4/sh4_mmr.cpp @@ -12,14 +12,11 @@ #include "serialize.h" #include "sh4_interrupts.h" #include "sh4_sched.h" -#include "sh4_interpreter.h" #include #include -//64bytes of sq // now on context ~ - -static std::array OnChipRAM; +static std::array OnChipRAM; // 8 KB //All registers are 4 byte aligned @@ -390,7 +387,8 @@ void DYNACALL WriteMem_P4(u32 addr,T data) template T DYNACALL ReadMem_p4mmr(u32 addr) { - DEBUG_LOG(SH4, "read %s", regName(addr)); + if ((addr & 0x1fffffff) != TMU_TCNT0_addr) + DEBUG_LOG(SH4, "read %s", regName(addr)); /* if (likely(addr == 0xffd80024)) @@ -558,11 +556,16 @@ void DYNACALL WriteMem_p4mmr(u32 addr, T data) //*********** //On Chip Ram //*********** + +inline static u32 onChipRamOffset(u32 addr) { + return ((addr >> (CCN_CCR.OIX == 1 ? 13 : 1)) & 0x1000) | (addr & 0xfff); +} + template T DYNACALL ReadMem_area7_OCR(u32 addr) { if (CCN_CCR.ORA == 1) - return *(T *)&OnChipRAM[addr & OnChipRAM_MASK]; + return *(T *)&OnChipRAM[onChipRamOffset(addr)]; INFO_LOG(SH4, "On Chip Ram Read, but OCR is disabled. addr %x", addr); return 0; @@ -572,7 +575,7 @@ template void DYNACALL WriteMem_area7_OCR(u32 addr, T data) { if (CCN_CCR.ORA == 1) - *(T *)&OnChipRAM[addr & OnChipRAM_MASK] = data; + *(T *)&OnChipRAM[onChipRamOffset(addr)] = data; else INFO_LOG(SH4, "On Chip Ram Write, but OCR is disabled. addr %x", addr); } @@ -611,6 +614,7 @@ void sh4_mmr_reset(bool hard) ubc.reset(); MMU_reset(); + memset(p_sh4rcb->cntx.sq_buffer, 0, sizeof(p_sh4rcb->cntx.sq_buffer)); } void sh4_mmr_term() @@ -629,40 +633,28 @@ void sh4_mmr_term() bsc.term(); } -// AREA 7--Sh4 Regs -static addrspace::handler p4mmr_handler; -static addrspace::handler area7_ocr_handler; - -void map_area7_init() -{ - p4mmr_handler = addrspaceRegisterHandlerTemplate(ReadMem_p4mmr, WriteMem_p4mmr); - area7_ocr_handler = addrspaceRegisterHandlerTemplate(ReadMem_area7_OCR, WriteMem_area7_OCR); -} - -void map_area7(u32 base) +// AREA 7 +void map_area7() { // on-chip RAM: 7C000000-7FFFFFFF - if (base == 0x60) - addrspace::mapHandler(area7_ocr_handler, 0x7C, 0x7F); + addrspace::handler area7_ocr_handler = addrspaceRegisterHandlerTemplate(ReadMem_area7_OCR, WriteMem_area7_OCR); + addrspace::mapHandler(area7_ocr_handler, 0x7C, 0x7F); } -//P4 +// P4 void map_p4() { - //P4 Region : - addrspace::handler p4_handler = addrspaceRegisterHandlerTemplate(ReadMem_P4, WriteMem_P4); - - //register this before mmr and SQ so they overwrite it and handle em - //default P4 handler - //0xE0000000-0xFFFFFFFF - addrspace::mapHandler(p4_handler, 0xE0, 0xFF); - - //Store Queues -- Write only 32bit - addrspace::mapBlock(sq_both, 0xE0, 0xE0, 63); - addrspace::mapBlock(sq_both, 0xE1, 0xE1, 63); - addrspace::mapBlock(sq_both, 0xE2, 0xE2, 63); - addrspace::mapBlock(sq_both, 0xE3, 0xE3, 63); - + // Store Queues -- Write only 32bit + addrspace::mapBlock(p_sh4rcb->cntx.sq_buffer, 0xE0, 0xE0, 63); + addrspace::mapBlock(p_sh4rcb->cntx.sq_buffer, 0xE1, 0xE1, 63); + addrspace::mapBlock(p_sh4rcb->cntx.sq_buffer, 0xE2, 0xE2, 63); + addrspace::mapBlock(p_sh4rcb->cntx.sq_buffer, 0xE3, 0xE3, 63); + + // sh4 IC, OC and TLB arrays + addrspace::handler p4arrays_handler = addrspaceRegisterHandlerTemplate(ReadMem_P4, WriteMem_P4); + addrspace::mapHandler(p4arrays_handler, 0xF0, 0xF7); + // sh4 system registers + addrspace::handler p4mmr_handler = addrspaceRegisterHandlerTemplate(ReadMem_p4mmr, WriteMem_p4mmr); addrspace::mapHandler(p4mmr_handler, 0xFF, 0xFF); } @@ -683,6 +675,7 @@ void serialize(Serializer& ser) ser << TMU; ser << SCI; ser << SCIF; + SCIFSerialPort::Instance().serialize(ser); icache.Serialize(ser); ocache.Serialize(ser); @@ -691,65 +684,29 @@ void serialize(Serializer& ser) interrupts_serialize(ser); - ser << (*p_sh4rcb).sq_buffer; - ser << (*p_sh4rcb).cntx; sh4_sched_serialize(ser); } -template -static void register_deserialize_libretro(T& regs, Deserializer& deser) -{ - for (auto& reg : regs) - { - deser.skip(); // regs.data[i].flags - deser >> reg; - } -} - void deserialize(Deserializer& deser) { deser >> OnChipRAM; - if (deser.version() <= Deserializer::VLAST_LIBRETRO) - { - register_deserialize_libretro(CCN, deser); - register_deserialize_libretro(UBC, deser); - register_deserialize_libretro(BSC, deser); - register_deserialize_libretro(DMAC, deser); - register_deserialize_libretro(CPG, deser); - register_deserialize_libretro(RTC, deser); - register_deserialize_libretro(INTC, deser); - register_deserialize_libretro(TMU, deser); - register_deserialize_libretro(SCI, deser); - register_deserialize_libretro(SCIF, deser); - } - else - { - deser >> CCN; - deser >> UBC; - deser >> BSC; - deser >> DMAC; - deser >> CPG; - deser >> RTC; - deser >> INTC; - deser >> TMU; - deser >> SCI; - deser >> SCIF; - } - if (deser.version() >= Deserializer::V9 - // Note (lr): was added in V11 fa49de29 24/12/2020 but ver not updated until V12 (13/4/2021) - || (deser.version() >= Deserializer::V11_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) - icache.Deserialize(deser); - else - icache.Reset(true); - if (deser.version() >= Deserializer::V10 - // Note (lr): was added in V11 2eb66879 27/12/2020 but ver not updated until V12 (13/4/2021) - || (deser.version() >= Deserializer::V11_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) - ocache.Deserialize(deser); - else - ocache.Reset(true); + deser >> CCN; + deser >> UBC; + deser >> BSC; + deser >> DMAC; + deser >> CPG; + deser >> RTC; + deser >> INTC; + deser >> TMU; + deser >> SCI; + deser >> SCIF; + + SCIFSerialPort::Instance().deserialize(deser); + icache.Deserialize(deser); + ocache.Deserialize(deser); if (!deser.rollback()) mem_b.deserialize(deser); @@ -761,8 +718,6 @@ void deserialize(Deserializer& deser) CCN_QACR_write<0>(0, CCN_QACR0.reg_data); CCN_QACR_write<1>(0, CCN_QACR1.reg_data); - deser >> (*p_sh4rcb).sq_buffer; - deser >> (*p_sh4rcb).cntx; if (deser.version() >= Deserializer::V19 && deser.version() < Deserializer::V21) deser.skip(); // sh4InterpCycles @@ -783,11 +738,7 @@ void deserialize2(Deserializer& deser) if (deser.version() <= Deserializer::V32) { deser >> SCIF_SCFSR2; - if (deser.version() >= Deserializer::V11 - || (deser.version() >= Deserializer::V11_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO)) - deser >> SCIF_SCSCR2; - else - SCIF_SCSCR2.full = 0; + deser >> SCIF_SCSCR2; deser >> BSC_PDTRA; } diff --git a/core/hw/sh4/sh4_mmr.h b/core/hw/sh4/sh4_mmr.h index 6f6a437ab..6b6e554c7 100644 --- a/core/hw/sh4/sh4_mmr.h +++ b/core/hw/sh4/sh4_mmr.h @@ -6,15 +6,9 @@ #include "modules/dmac.h" //For mem mapping -void map_area7_init(); -void map_area7(u32 base); +void map_area7(); void map_p4(); -#define OnChipRAM_SIZE (0x2000) -#define OnChipRAM_MASK (OnChipRAM_SIZE-1) - -#define sq_both (sh4rcb.sq_buffer) - void sh4_mmr_init(); void sh4_mmr_reset(bool hard); void sh4_mmr_term(); @@ -435,7 +429,7 @@ union BSC_BCR1_type struct { u32 A56PCM : 1; - u32 res_0 : 1; + u32 : 1; u32 DRAMTP0 : 1; u32 DRAMTP1 : 1; u32 DRAMTP2 : 1; @@ -452,20 +446,17 @@ union BSC_BCR1_type u32 HIZCNT : 1; u32 HIZMEM : 1; //16 - u32 res_1 : 1; + u32 : 1; u32 MEMMPX : 1; u32 PSHR : 1; u32 BREQEN : 1; u32 A4MBC : 1; u32 A1MBC : 1; - u32 res_2 : 1; - u32 res_3 : 1; + u32 : 2; //24 u32 OPUP : 1; u32 IPUP : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; + u32 : 3; u32 A0MPX : 1; // Set to 1 (area 0 is mpx) u32 MASTER : 1; // What is it on the Dreamcast ? u32 ENDIAN : 1; // This is 1 on the Dreamcast @@ -483,7 +474,7 @@ union BSC_BCR2_type struct { u32 PORTEN : 1; - u32 res_0 : 1; + u32 : 1; u32 A0SZ0 : 1; u32 A1SZ1 : 1; u32 A2SZ0 : 1; @@ -514,38 +505,38 @@ union BSC_WCR1_type u32 A0IW0 : 1; u32 A0IW1 : 1; u32 A0IW2 : 1; - u32 res_0 : 1; + u32 : 1; u32 A1IW0 : 1; u32 A1IW1 : 1; u32 A1IW2 : 1; - u32 res_1 : 1; + u32 : 1; //8 u32 A2IW0 : 1; u32 A2IW1 : 1; u32 A2IW2 : 1; - u32 res_2 : 1; + u32 : 1; u32 A3IW0 : 1; u32 A3IW1 : 1; u32 A3IW2 : 1; - u32 res_3 : 1; + u32 : 1; //16 u32 A4IW0 : 1; u32 A4IW1 : 1; u32 A4IW2 : 1; - u32 res_4 : 1; + u32 : 1; u32 A5IW0 : 1; u32 A5IW1 : 1; u32 A5IW2 : 1; - u32 res_5 : 1; + u32 : 1; //24 u32 A6IW0 : 1; u32 A6IW1 : 1; u32 A6IW2 : 1; - u32 res_6 : 1; + u32 : 1; u32 DMAIW0 : 1; u32 DMAIW1 : 1; u32 DMAIW2 : 1; - u32 res_7 : 1; + u32 : 1; }; u32 full; @@ -570,12 +561,12 @@ union BSC_WCR2_type u32 A2W0 : 1; u32 A2W1 : 1; u32 A2W2 : 1; - u32 res_0 : 1; + u32 : 1; u32 A3W0 : 1; u32 A3W1 : 1; u32 A3W2 : 1; //16 - u32 res_1 : 1; + u32 : 1; u32 A4W0 : 1; u32 A4W1 : 1; u32 A4W2 : 1; @@ -607,38 +598,34 @@ union BSC_WCR3_type u32 A0H0 : 1; u32 A0H1 : 1; u32 A0S0 : 1; - u32 res_0 : 1; + u32 : 1; u32 A1H0 : 1; //TODO: check if this is correct, on the manual it says A1H0 .. typo in the manual ? u32 A1H1 : 1; u32 A1S0 : 1; - u32 res_1 : 1; + u32 : 1; //8 u32 A2H0 : 1; u32 A2H1 : 1; u32 A2S0 : 1; - u32 res_2 : 1; + u32 : 1; u32 A3H0 : 1; u32 A3H1 : 1; u32 A3S0 : 1; - u32 res_3 : 1; + u32 : 1; //16 u32 A4H0 : 1; u32 A4H1 : 1; u32 A4S0 : 1; - u32 res_4 : 1; + u32 : 1; u32 A5H0 : 1; u32 A5H1 : 1; u32 A5S0 : 1; - u32 res_5 : 1; + u32 : 1; //24 u32 A6H0 : 1; u32 A6H1 : 1; u32 A6S0 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - u32 res_8 : 1; - u32 res_9 : 1; - u32 res_10 : 1; + u32 : 5; }; u32 full; @@ -672,16 +659,14 @@ union BSC_MCR_type //16 u32 RCD0 : 1; u32 RCD1 : 1; - u32 res_0 : 1; + u32 : 1; u32 TPC0 : 1; u32 TPC1 : 1; u32 TPC2 : 1; - u32 res_1 : 1; + u32 : 1; u32 TCAS : 1; //24 - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; + u32 : 3; u32 TRC0 : 1; u32 TRC1 : 1; u32 TRC2 : 1; @@ -738,14 +723,7 @@ union BSC_RTCSR_type u32 CMIE : 1; u32 CMF : 1; //8 - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; + u32 : 8; //16 }; u16 full; @@ -760,14 +738,7 @@ union BSC_RTCNT_type { u32 VALUE : 8; //8 - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; + u32 : 8; //16 }; u16 full; @@ -782,14 +753,7 @@ union BSC_RTCOR_type { u32 VALUE : 8; //8 - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; + u32 : 8; //16 }; u16 full; @@ -804,13 +768,7 @@ union BSC_RFCR_type struct { u32 VALUE : 10; - //10 - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; + u32 : 6; //16 }; u16 full; @@ -908,32 +866,7 @@ union BSC_PCTRB_type u32 PB19IO : 1; u32 PB19PUP : 1; //8 - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - //16 - u32 res_8 : 1; - u32 res_9 : 1; - u32 res_10 : 1; - u32 res_11 : 1; - u32 res_12 : 1; - u32 res_13 : 1; - u32 res_14 : 1; - u32 res_15 : 1; - //24 - u32 res_16 : 1; - u32 res_17 : 1; - u32 res_18 : 1; - u32 res_19 : 1; - u32 res_20 : 1; - u32 res_21 : 1; - u32 res_22 : 1; - u32 res_23 : 1; + u32 :24; }; u32 full; @@ -950,19 +883,7 @@ union BSC_PDTRB_type u32 PB17DT : 1; u32 PB18DT : 1; u32 PB19DT : 1; - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - //8 - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - u32 res_8 : 1; - u32 res_9 : 1; - u32 res_10 : 1; - u32 res_11 : 1; + u32 :12; //16 }; u16 full; @@ -1006,7 +927,7 @@ union CCN_PTEH_type struct { u32 ASID : 8; //0-7 ASID - u32 res : 2; //8,9 reserved + u32 : 2; u32 VPN : 22; //10-31 VPN }; u32 reg_data; @@ -1026,9 +947,9 @@ union CCN_PTEL_type u32 SZ1 : 1; u32 V : 1; - u32 res_0 : 1; + u32 : 1; u32 PPN : 19; //PPN 10-28 - u32 res_1 : 3; + u32 : 3; }; u32 reg_data; }; @@ -1058,7 +979,7 @@ union CCN_PTEA_type { u32 SA : 3; u32 TC : 1; - u32 res : 28; + u32 : 28; }; u32 reg_data; }; @@ -1071,16 +992,16 @@ union CCN_CCR_type u32 WT : 1; u32 CB : 1; u32 OCI : 1; - u32 res : 1; + u32 : 1; u32 ORA : 1; - u32 res_1 : 1; + u32 : 1; u32 OIX : 1; u32 ICE : 1; - u32 res_2 : 2; + u32 : 2; u32 ICI : 1; - u32 res_3 : 3; + u32 : 3; u32 IIX : 1; - u32 res_4 : 16; + u32 : 16; }; u32 reg_data; }; @@ -1089,9 +1010,9 @@ union CCN_QACR_type { struct { - u32 res : 2; + u32 : 2; u32 Area : 3; - u32 res_1 : 27; + u32 : 27; }; u32 reg_data; }; @@ -1129,39 +1050,28 @@ union DMAC_CHCR_type u32 DE : 1; //Channel Enable u32 TE : 1; //Transfer End u32 IE : 1; //Interrupt Enable - u32 res0 : 1; + u32 : 1; u32 TS : 3; //Transmit Size - //u32 TS1 :1; - //u32 TS2 :1; u32 TM : 1; //Transmit Mode u32 RS : 4; //Resource Select - //u32 RS1 :1; - //u32 RS2 :1; - //u32 RS3 :1; u32 SM : 2; //SRC mode - //u32 SM1 :1; u32 DM : 2; //DST mode - //u32 DM1 :1; u32 AL : 1; //Acknowledge Level u32 AM : 1; //Acknowledge Mode u32 RL : 1; //In normal DMA mode, this bit is valid only in CHCR0 and CHCR1. In DDT mode, this bit is invalid. u32 DS : 1; //In normal DMA mode, this bit is valid only in CHCR0 and CHCR1. In DDT mode, it is valid in CHCR0�CHCR3. - u32 res1 : 4; + u32 : 4; u32 DTC : 1; u32 DSA : 3; - //u32 DSA1:1; - //u32 DSA2:1; u32 STC : 1; u32 SSA : 3; - //u32 SSA1:1; - //u32 SSA2:1; }; u32 full; }; @@ -1170,22 +1080,19 @@ union DMAC_DMAOR_type { struct { - u32 DME : 1; - u32 NMIF : 1; - u32 AE : 1; - u32 res0 : 1; - - u32 COD : 1; - u32 res1 : 3; - - u32 PR0 : 1; - u32 PR1 : 1; - u32 res2 : 2; - - u32 res3 : 3; - u32 DDT : 1; - - u32 res4 : 16; + u32 DME : 1; // DMAC master enable + u32 NMIF : 1; // NMI flag + u32 AE : 1; // address error flag + u32 : 1; + u32 COD : 1; // check overrun for DREQ + u32 : 3; + + u32 PR0 : 1; // priority mode: + u32 PR1 : 1; // PR0: 0, PR1: 1 => CH2 > CH0 > CH1 > CH3 + u32 : 5; + u32 DDT : 1; // 0: normal DMA mode, 1: on-demand data transfer mode + + u32 : 16; }; u32 full; }; @@ -1233,23 +1140,13 @@ union SCIF_SCSMR2_type { struct { - u32 CKS0 : 1; - u32 CKS1 : 1; - u32 res_0 : 1; - u32 STOP : 1; - u32 OE_paritymode : 1; - u32 PE : 1; - u32 CHR : 1; - u32 res_1 : 1; - //8 - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - u32 res_8 : 1; - u32 res_9 : 1; + u32 CKS : 2; // Clock Select + u32 : 1; + u32 STOP : 1; // Stop Bit Length + u32 OE_paritymode : 1; // Parity Mode + u32 PE : 1; // Parity Enable + u32 CHR : 1; // Character Length + u32 : 9; //16 }; u16 full; @@ -1265,23 +1162,16 @@ union SCIF_SCSCR2_type { struct { - u32 res_0 : 1; - u32 CKE1 : 1; - u32 res_1 : 1; - u32 REIE : 1; - u32 RE : 1; - u32 TE : 1; - u32 RIE : 1; - u32 TIE : 1; + u32 : 1; + u32 CKE1 : 1; // Clock Enable 1 + u32 : 1; + u32 REIE : 1; // Receive Error Interrupt Enable + u32 RE : 1; // Receive Enable + u32 TE : 1; // Transmit Enable + u32 RIE : 1; // Receive Interrupt Enable + u32 TIE : 1; // Transmit Interrupt Enable //8 - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - u32 res_8 : 1; - u32 res_9 : 1; + u32 : 8; //16 }; u16 full; @@ -1296,23 +1186,17 @@ union SCIF_SCFSR2_type { struct { - u32 DR : 1; - u32 RDF : 1; - u32 PER : 1; - u32 FER : 1; - u32 BRK : 1; - u32 TDFE : 1; - u32 TEND : 1; - u32 ER : 1; + u32 DR : 1; // Receive Data Ready + u32 RDF : 1; // Receive FIFO Data Full + u32 PER : 1; // Parity Error + u32 FER : 1; // Framing Error + u32 BRK : 1; // Break Detect + u32 TDFE : 1; // Transmit FIFO Data Empty + u32 TEND : 1; // Transmit End + u32 ER : 1; // Receive Error //8 - u32 FER0 : 1; - u32 FER1 : 1; - u32 FER2 : 1; - u32 FER3 : 1; - u32 PER0 : 1; - u32 PER1 : 1; - u32 PER2 : 1; - u32 PER3 : 1; + u32 FERn : 4; // Number of Framing Errors + u32 PERn : 4; // Number of Parity Errors //16 }; u16 full; @@ -1327,40 +1211,31 @@ union SCIF_SCFCR2_type { struct { - u32 LOOP : 1; - u32 RFRST : 1; - u32 TFRST : 1; - u32 MCE : 1; - u32 TTRG0 : 1; - u32 TTRG1 : 1; - u32 RTRG0 : 1; - u32 RTRG1 : 1; + u32 LOOP : 1; // Loopback Test + u32 RFRST : 1; // Receive FIFO Data Register Reset + u32 TFRST : 1; // Transmit FIFO Data Register Reset + u32 MCE : 1; // Modem Control Enable + u32 TTRG : 2; // Transmit FIFO Data Number Trigger + u32 RTRG : 2; // Receive FIFO Data Number Trigger //8 - u32 res_0 : 1; - u32 res_1 : 1; - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; + u32 : 8; //16 }; u16 full; }; #define SCIF_SCFCR2 SH4IO_REG_T(SCIF, SCFCR2) -//Read OLNY +//Read ONLY //SCIF SCFDR2 0xFFE8001C 0x1FE8001C 16 0x0000 0x0000 Held Held Pclk union SCIF_SCFDR2_type { struct { - u32 R : 5; - u32 res_0 : 3; + u32 R : 5; // Number of received data bytes + u32 : 3; //8 - u32 T : 5; - u32 res_1 : 3; + u32 T : 5; // Number of untransmitted data bytes + u32 : 3; //16 }; u16 full; @@ -1371,23 +1246,15 @@ union SCIF_SCSPTR2_type { struct { - u32 SPB2DT : 1; - u32 SPB2IO : 1; - u32 res_0 : 1; - u32 res_1 : 1; - u32 CTSDT : 1; - u32 CTSIO : 1; - u32 RTSDT : 1; - u32 RTSIO : 1; + u32 SPB2DT : 1; // Serial Port Break Data + u32 SPB2IO : 1; // Serial Port Break I/O + u32 : 2; + u32 CTSDT : 1; // Serial Port CTS Port Data + u32 CTSIO : 1; // Serial Port CTS Port I/O + u32 RTSDT : 1; // Serial Port RTS Port Data + u32 RTSIO : 1; // Serial Port RTS Port I/O //8 - u32 res_2 : 1; - u32 res_3 : 1; - u32 res_4 : 1; - u32 res_5 : 1; - u32 res_6 : 1; - u32 res_7 : 1; - u32 res_8 : 1; - u32 res_9 : 1; + u32 : 8; //16 }; u16 full; @@ -1399,10 +1266,8 @@ union SCIF_SCLSR2_type { struct { - u32 ORER : 1; - u32 res_0 : 7; - //8 - u32 res_1 : 8; + u32 ORER : 1; // Overrun Error + u32 :15; //16 }; u16 full; @@ -1435,11 +1300,11 @@ union INTC_ICR_type u16 reg_data; struct { - u32 res : 7; + u32 : 7; u32 IRLM : 1; u32 NMIE : 1; u32 NMIB : 1; - u32 res_2 : 4; + u32 : 4; u32 MAI : 1; u32 NMIL : 1; }; @@ -1462,7 +1327,7 @@ union INTC_IPRB_type u16 reg_data; struct { - u32 Reserved : 4; + u32 : 4; u32 SCI1 : 4; u32 REF : 4; u32 WDT : 4; diff --git a/core/hw/sh4/sh4_opcode_list.cpp b/core/hw/sh4/sh4_opcode_list.cpp index 9fe9f007e..654fd6ac6 100644 --- a/core/hw/sh4/sh4_opcode_list.cpp +++ b/core/hw/sh4/sh4_opcode_list.cpp @@ -80,9 +80,9 @@ static u64 dec_MRd(DecParam d,DecParam s,u32 sz) { return dec_Fill(DM_ReadM,d,s, //d= reg to read from static u64 dec_MWt(DecParam d,DecParam s,u32 sz) { return dec_Fill(DM_WriteM,d,s,shop_writem,sz); } -sh4_opcodelistentry missing_opcode = {dec_illegalOp, iNotImplemented, 0, 0, ReadWritePC, "missing", 0, 0, CO, 1 }; +static sh4_opcodelistentry missing_opcode = {dec_illegalOp, iNotImplemented, 0, 0, ReadWritePC, "missing", 0, 0, CO, 1 }; -sh4_opcodelistentry opcodes[]= +static sh4_opcodelistentry opcodes[]= { //HLE {0, reios_trap, Mask_none, REIOS_OPCODE, Branch_dir, "reios_trap", 100, 100, CO, 1 }, @@ -344,7 +344,7 @@ sh4_opcodelistentry opcodes[]= {0,0,0,0,ReadWritePC}//Branch in order to stop the block and save PC ect :) }; -void BuildOpcodeTables() +static void BuildOpcodeTables() { for (int i=0;i<0x10000;i++) @@ -461,25 +461,25 @@ std::string disassemble_op(const char* tx1, u32 pc, u16 opcode) } else if (strcmp2(tx1,"FREG_N>")) { - sprintf(buf,"FR%d=%f ", GetN(opcode), p_sh4rcb->cntx.xffr[16 + GetN(opcode)]); + sprintf(buf,"FR%d=%f ", GetN(opcode), p_sh4rcb->cntx.fr[GetN(opcode)]); regs += buf; sprintf(buf,"FR%d",GetN(opcode)); } else if (strcmp2(tx1,"FREG_M>")) { - sprintf(buf,"FR%d=%f ", GetM(opcode), p_sh4rcb->cntx.xffr[16 + GetM(opcode)]); + sprintf(buf,"FR%d=%f ", GetM(opcode), p_sh4rcb->cntx.fr[GetM(opcode)]); regs += buf; sprintf(buf,"FR%d",GetM(opcode)); } else if (strcmp2(tx1, "FREG_M_SD_F>")) { - sprintf(buf,"FR%d=%f ", GetM(opcode), p_sh4rcb->cntx.xffr[16 + GetM(opcode)]); + sprintf(buf,"FR%d=%f ", GetM(opcode), p_sh4rcb->cntx.fr[GetM(opcode)]); regs += buf; sprintf(buf,"FR%d", GetM(opcode)); } else if (strcmp2(tx1,"FREG_0>")) { - sprintf(buf,"FR0=%f ", p_sh4rcb->cntx.xffr[16]); + sprintf(buf,"FR0=%f ", p_sh4rcb->cntx.fr[0]); regs += buf; sprintf(buf,"FR0"); } diff --git a/core/hw/sh4/sh4_opcode_list.h b/core/hw/sh4/sh4_opcode_list.h index 7f4ce3719..d0b905aae 100644 --- a/core/hw/sh4/sh4_opcode_list.h +++ b/core/hw/sh4/sh4_opcode_list.h @@ -1,7 +1,11 @@ #pragma once #include "types.h" -#include "sh4_interpreter.h" +#include "sh4_if.h" +#include +#define sh4op(str) void DYNACALL str (Sh4Context *ctx, u32 op) + +typedef void (DYNACALL OpCallFP) (Sh4Context *ctx, u32 op); extern OpCallFP* OpPtr[0x10000]; typedef void OpDissasmFP(char* out,const char* const FormatString,u32 pc,u16 opcode); @@ -16,6 +20,34 @@ enum sh4_eu CO, }; +enum OpcodeType +{ + //basic + Normal = 0, // Heh , nothing special :P + ReadsPC = 1, // PC must be set upon calling it + WritesPC = 2, // It will write PC (branch) + Delayslot = 4, // Has a delayslot opcode , valid only when WritesPC is set + + WritesSR = 8, // Writes to SR , and UpdateSR needs to be called + WritesFPSCR = 16, // Writes to FPSCR , and UpdateSR needs to be called + Invalid = 128, // Invalid + + UsesFPU = 2048, // Floating point op + FWritesFPSCR = UsesFPU | WritesFPSCR, + + // Heh, not basic :P + ReadWritePC = ReadsPC|WritesPC, // Read and writes pc :P + WritesSRRWPC = WritesSR|ReadsPC|WritesPC, + + // Branches (not delay slot): + Branch_dir = ReadWritePC, // Direct (eg , pc=r[xx]) -- this one is ReadWritePC b/c the delayslot may use pc ;) + Branch_rel = ReadWritePC, // Relative (rg pc+=10); + + // Delay slot + Branch_dir_d = Delayslot|Branch_dir, // Direct (eg , pc=r[xx]) + Branch_rel_d = Delayslot|Branch_rel, // Relative (rg pc+=10); +}; + std::string disassemble_op(const char* tx1, u32 pc, u16 opcode); typedef void ( RecOpCallFP) (u32 op); @@ -74,7 +106,6 @@ struct sh4_opcodelistentry }; extern sh4_opcodelistentry* OpDesc[0x10000]; -extern sh4_opcodelistentry opcodes[]; void DissasembleOpcode(u16 opcode,u32 pc,char* Dissasm); enum DecParam diff --git a/core/hw/sh4/sh4_rom.cpp b/core/hw/sh4/sh4_rom.cpp index d5998f611..38291a3ed 100644 --- a/core/hw/sh4/sh4_rom.cpp +++ b/core/hw/sh4/sh4_rom.cpp @@ -1,14 +1,14 @@ #include "types.h" #include "sh4_rom.h" -u32 sin_coefs[0x8000]= +static u32 sin_coefs[0x8000]= { #include "fsca-table.h" }; f32_x2 sin_table[0x10000]; -void sh4rom_init() +static void sh4rom_init() { for (int i=0x0000;i<0x10000;i++) { @@ -27,4 +27,4 @@ void sh4rom_init() } } -static OnLoad ol_sh4rom(&sh4rom_init); \ No newline at end of file +static OnLoad ol_sh4rom(&sh4rom_init); diff --git a/core/hw/sh4/sh4_sched.cpp b/core/hw/sh4/sh4_sched.cpp index 21b16587f..b636221df 100755 --- a/core/hw/sh4/sh4_sched.cpp +++ b/core/hw/sh4/sh4_sched.cpp @@ -24,6 +24,7 @@ struct sched_list { sh4_sched_callback* cb; + void *arg; int tag; int start; int end; @@ -70,9 +71,9 @@ void sh4_sched_ffts() sh4_sched_ffb += Sh4cntx.sh4_sched_next; } -int sh4_sched_register(int tag, sh4_sched_callback* ssc) +int sh4_sched_register(int tag, sh4_sched_callback* ssc, void *arg) { - sched_list t{ ssc, tag, -1, -1}; + sched_list t{ ssc, arg, tag, -1, -1}; for (sched_list& sched : sch_list) if (sched.cb == nullptr) { @@ -137,6 +138,11 @@ void sh4_sched_request(int id, int cycles) sh4_sched_ffts(); } +bool sh4_sched_is_scheduled(int id) +{ + return sch_list[id].end != -1; +} + /* Returns how much time has passed for this callback */ static int sh4_sched_elapsed(sched_list& sched) { @@ -157,7 +163,7 @@ static void handle_cb(sched_list& sched) int jitter = elapsd - remain; sched.end = -1; - int re_sch = sched.cb(sched.tag, remain, jitter); + int re_sch = sched.cb(sched.tag, remain, jitter, sched.arg); if (re_sch > 0) sh4_sched_request(&sched - &sch_list[0], std::max(0, re_sch - jitter)); diff --git a/core/hw/sh4/sh4_sched.h b/core/hw/sh4/sh4_sched.h index b7d146352..b40368972 100644 --- a/core/hw/sh4/sh4_sched.h +++ b/core/hw/sh4/sh4_sched.h @@ -1,20 +1,20 @@ -#ifndef SH4_SCHED_H -#define SH4_SCHED_H - +#pragma once #include "types.h" +#define SH4_TIMESLICE 448 // at 112 Bangai-O doesn't start. 224 is ok + /* tag, as passed on sh4_sched_register sch_cycles, the cycle duration that the callback requested (sh4_sched_request) jitter, the number of cycles that the callback was delayed, [0... 448] */ -typedef int sh4_sched_callback(int tag, int sch_cycl, int jitter); +typedef int sh4_sched_callback(int tag, int sch_cycl, int jitter, void *arg); /* Register a callback to the scheduler. The returned id is used for sh4_sched_request and sh4_sched_unregister calls */ -int sh4_sched_register(int tag, sh4_sched_callback* ssc); +int sh4_sched_register(int tag, sh4_sched_callback* ssc, void *arg = nullptr); /*** * Unregister a callback from the scheduler. @@ -31,11 +31,16 @@ u64 sh4_sched_now64(); Schedule a callback to be called sh4 *cycles* after the invocation of this function. *Cycles* range is (0, 200M]. - Passing a value of 0 disables the callback. + Passing a value of -1 disables the callback. If called multiple times, only the last call is in effect */ void sh4_sched_request(int id, int cycles); +/* + Returns true if the callback is scheduled to be called in the future. + */ +bool sh4_sched_is_scheduled(int id); + /* Tick for *cycles* */ @@ -48,5 +53,3 @@ void sh4_sched_serialize(Serializer& ser); void sh4_sched_deserialize(Deserializer& deser); void sh4_sched_serialize(Serializer& ser, int id); void sh4_sched_deserialize(Deserializer& deser, int id); - -#endif //SH4_SCHED_H diff --git a/core/hw/sh4/storeq.cpp b/core/hw/sh4/storeq.cpp index 5a8f9f0ba..2f4f71267 100644 --- a/core/hw/sh4/storeq.cpp +++ b/core/hw/sh4/storeq.cpp @@ -22,14 +22,13 @@ static u32 CCN_QACR_TR[2]; template -void DYNACALL do_sqw(u32 Dest, const SQBuffer *sqb) +static void DYNACALL sqWrite(u32 dest, Sh4Context *ctx) { - u32 Address; - + u32 address; //Translate the SQ addresses as needed if (mmu_on) { - mmu_TranslateSQW(Dest, &Address); + mmu_TranslateSQW(dest, &address); } else { @@ -38,52 +37,46 @@ void DYNACALL do_sqw(u32 Dest, const SQBuffer *sqb) u32 QACR = CCN_QACR_TR[0]; //QACR has already 0xE000_0000 - Address = QACR + (Dest & ~0x1f); + address = QACR + (dest & ~0x1f); } - if (((Address >> 26) & 7) != 4)//Area 4 + if (((address >> 26) & 7) != 4)//Area 4 { - const SQBuffer *sq = &sqb[(Dest >> 5) & 1]; - WriteMemBlock_nommu_sq(Address, sq); + const SQBuffer *sq = &ctx->sq_buffer[(dest >> 5) & 1]; + WriteMemBlock_nommu_sq(address, sq); } else { - TAWriteSQ(Address, sqb); + TAWriteSQ(address, ctx->sq_buffer); // TODO pass the correct SQBuffer instead of letting TAWriteSQ deal with it } } -void DYNACALL do_sqw_mmu(u32 dst) { - do_sqw(dst, sq_both); -} - -static void DYNACALL do_sqw_simplemmu(u32 dst, const SQBuffer *sqb) { - do_sqw(dst, sqb); -} - //yes, this micro optimization makes a difference -static void DYNACALL do_sqw_nommu_area_3(u32 dst, const SQBuffer *sqb) +static void DYNACALL sqWrite_nommu_area_3(u32 dest, Sh4Context *ctx) { - SQBuffer *pmem = (SQBuffer *)((u8 *)sqb + sizeof(Sh4RCB::sq_buffer) + sizeof(Sh4RCB::cntx) + 0x0C000000); - pmem += (dst & (RAM_SIZE_MAX - 1)) >> 5; - *pmem = sqb[(dst >> 5) & 1]; + SQBuffer *pmem = (SQBuffer *)((u8 *)ctx + sizeof(Sh4Context) + 0x0C000000); + pmem += (dest & (RAM_SIZE_MAX - 1)) >> 5; + *pmem = ctx->sq_buffer[(dest >> 5) & 1]; } -static void DYNACALL do_sqw_nommu_area_3_nonvmem(u32 dst, const SQBuffer *sqb) +static void DYNACALL sqWrite_nommu_area_3_nonvmem(u32 dest, Sh4Context *ctx) { u8* pmem = &mem_b[0]; - memcpy((SQBuffer *)&pmem[dst & (RAM_MASK - 0x1F)], &sqb[(dst >> 5) & 1], sizeof(SQBuffer)); + memcpy((SQBuffer *)&pmem[dest & (RAM_MASK - 0x1F)], &ctx->sq_buffer[(dest >> 5) & 1], sizeof(SQBuffer)); } -static void DYNACALL do_sqw_nommu_full(u32 dst, const SQBuffer *sqb) { - do_sqw(dst, sqb); +static void DYNACALL sqWriteTA(u32 dest, Sh4Context *ctx) +{ + TAWriteSQ(dest, ctx->sq_buffer); } void setSqwHandler() { + Sh4Context& ctx = p_sh4rcb->cntx; if (CCN_MMUCR.AT == 1) { - do_sqw_nommu = &do_sqw_simplemmu; + ctx.doSqWrite = &sqWrite; } else { @@ -95,17 +88,17 @@ void setSqwHandler() { case 3: if (addrspace::virtmemEnabled()) - do_sqw_nommu = &do_sqw_nommu_area_3; + ctx.doSqWrite = &sqWrite_nommu_area_3; else - do_sqw_nommu = &do_sqw_nommu_area_3_nonvmem; + ctx.doSqWrite = &sqWrite_nommu_area_3_nonvmem; break; case 4: - do_sqw_nommu = &TAWriteSQ; + ctx.doSqWrite = &sqWriteTA; break; default: - do_sqw_nommu = &do_sqw_nommu_full; + ctx.doSqWrite = &sqWrite; break; } } diff --git a/core/imgread/cdi.cpp b/core/imgread/cdi.cpp index 3f1dc1d46..100b6d93f 100644 --- a/core/imgread/cdi.cpp +++ b/core/imgread/cdi.cpp @@ -16,149 +16,160 @@ Disc* cdi_parse(const char* file, std::vector *digest) WARN_LOG(GDROM, "Cannot open file '%s' errno %d", file, errno); throw FlycastException(std::string("Cannot open CDI file ") + file); } - - image_s image = { 0 }; - track_s track = { 0 }; - if (!CDI_init(fsource, &image, file)) - { - std::fclose(fsource); - throw FlycastException(std::string("Invalid CDI file ") + file); - } - - CDI_get_sessions(fsource,&image); - - Disc* rv= new Disc(); - - image.remaining_sessions = image.sessions; - - /////////////////////////////////////////////////////////////// Loop sessions + try { + image_s image = { 0 }; + track_s track = { 0 }; + if (!CDI_init(fsource, &image, file)) + throw FlycastException(std::string("Invalid CDI file ") + file); - bool ft=true, CD_M2=false,CD_M1=false,CD_DA=false; + if (!CDI_get_sessions(fsource, &image)) { + WARN_LOG(GDROM, "Invalid CDI file '%s': can't get sessions", file); + throw FlycastException("Invalid CDI image"); + } + if (image.sessions > 255) { + WARN_LOG(GDROM, "Invalid CDI file '%s': too many sessions (%d)", file, image.sessions); + throw FlycastException("Invalid CDI image"); + } - while(image.remaining_sessions > 0) - { - ft=true; - image.global_current_session++; + std::unique_ptr rv = std::make_unique(); - CDI_get_tracks (fsource, &image); + image.remaining_sessions = image.sessions; - image.header_position = std::ftell(fsource); + /////////////////////////////////////////////////////////////// Loop sessions - if (image.tracks == 0) - INFO_LOG(GDROM, "Open session"); - else - { - // Clear cuesheet - image.remaining_tracks = image.tracks; + bool ft=true, CD_M2=false,CD_M1=false,CD_DA=false; - ///////////////////////////////////////////////////////////////// Loop tracks + while(image.remaining_sessions > 0) + { + ft=true; + image.global_current_session++; - while(image.remaining_tracks > 0) - { - track.global_current_track++; - track.number = image.tracks - image.remaining_tracks + 1; + if (!CDI_get_tracks(fsource, &image)) { + WARN_LOG(GDROM, "Invalid CDI file '%s': can't get tracks", file); + throw FlycastException("Invalid CDI image"); + } - CDI_read_track (fsource, &image, &track); + image.header_position = std::ftell(fsource); - if (track.sector_size != 2048 && track.sector_size != 2336 && track.sector_size != 2352 && track.sector_size != 2448) - { - delete rv; - std::fclose(fsource); - WARN_LOG(GDROM, "Invalid sector size: %lu", track.sector_size); - throw FlycastException("Invalid CDI sector size"); + if (image.tracks == 0) + INFO_LOG(GDROM, "Open session"); + else + { + if (image.tracks > 100) { + WARN_LOG(GDROM, "Invalid CDI file '%s': too many tracks (%d)", file, image.tracks); + throw FlycastException("Invalid CDI image"); } + // Clear cuesheet + image.remaining_tracks = image.tracks; - image.header_position = std::ftell(fsource); + ///////////////////////////////////////////////////////////////// Loop tracks - // Show info -#if 0 - printf("Saving "); - printf("Track: %2d ",track.global_current_track); - printf("Type: "); - switch(track.mode) + while(image.remaining_tracks > 0) { - case 0 : printf("Audio/"); break; - case 1 : printf("Mode1/"); break; - case 2 : - default: printf("Mode2/"); break; - } - printf("%lu ",track.sector_size); - - printf("Pregap: %-3ld ",track.pregap_length); - printf("Size: %-6ld ",track.length); - printf("LBA: %-6ld ",track.start_lba); -#endif - if (ft) - { - ft = false; - Session s; - s.StartFAD = track.pregap_length + track.start_lba; - s.FirstTrack = (u8)track.global_current_track; - rv->sessions.push_back(s); - } + track.global_current_track++; + track.number = image.tracks - image.remaining_tracks + 1; - Track t; - if (track.mode==2) - CD_M2=true; - if (track.mode==1) - CD_M1=true; - if (track.mode==0) - CD_DA=true; - - t.ADR=1;//hmm is that ok ? - - t.CTRL=track.mode==0?0:4; - t.StartFAD=track.start_lba+track.pregap_length; - t.EndFAD=t.StartFAD+track.length-1; - FILE *trackFile = hostfs::storage().openFile(file, "rb"); - if (trackFile == nullptr) - { - delete rv; - std::fclose(fsource); - WARN_LOG(GDROM, "Cannot re-open file '%s' errno %d", file, errno); - throw FlycastException("Cannot re-open CDI file"); - } - t.file = new RawTrackFile(trackFile, track.position + track.pregap_length * track.sector_size, t.StartFAD, track.sector_size); + if (!CDI_read_track (fsource, &image, &track)) + throw FlycastException("Invalid CDI image"); - rv->tracks.push_back(t); + if (track.sector_size != 2048 && track.sector_size != 2336 && track.sector_size != 2352 && track.sector_size != 2448) + { + WARN_LOG(GDROM, "Invalid sector size: %lu", track.sector_size); + throw FlycastException("Invalid CDI sector size"); + } - if (track.length < 0) - WARN_LOG(GDROM, "Negative track size found. You must extract image with /pregap option"); + image.header_position = std::ftell(fsource); - std::fseek(fsource, track.position, SEEK_SET); - if (track.total_length < track.length + track.pregap_length) - { - WARN_LOG(GDROM, "This track seems truncated. Skipping..."); - // FIXME that can't be right - std::fseek(fsource, track.total_length, SEEK_CUR); - } - else - { - std::fseek(fsource, track.total_length * track.sector_size, SEEK_CUR); - rv->EndFAD=track.start_lba +track.total_length; + // Show info +#if 0 + printf("Saving "); + printf("Track: %2d ",track.global_current_track); + printf("Type: "); + switch(track.mode) + { + case 0 : printf("Audio/"); break; + case 1 : printf("Mode1/"); break; + case 2 : + default: printf("Mode2/"); break; + } + printf("%lu ",track.sector_size); + + printf("Pregap: %-3ld ",track.pregap_length); + printf("Size: %-6ld ",track.length); + printf("LBA: %-6ld ",track.start_lba); +#endif + if (ft) + { + ft = false; + Session s; + s.StartFAD = track.pregap_length + track.start_lba; + s.FirstTrack = (u8)track.global_current_track; + rv->sessions.push_back(s); + } + + Track t; + if (track.mode==2) + CD_M2=true; + if (track.mode==1) + CD_M1=true; + if (track.mode==0) + CD_DA=true; + + t.ADR=1;//hmm is that ok ? + + t.CTRL=track.mode==0?0:4; + t.StartFAD=track.start_lba+track.pregap_length; + t.EndFAD=t.StartFAD+track.length-1; + FILE *trackFile = hostfs::storage().openFile(file, "rb"); + if (trackFile == nullptr) { + WARN_LOG(GDROM, "Cannot re-open file '%s' errno %d", file, errno); + throw FlycastException("Cannot re-open CDI file"); + } + t.file = new RawTrackFile(trackFile, track.position + track.pregap_length * track.sector_size, t.StartFAD, track.sector_size); + + rv->tracks.push_back(t); + + if (track.length < 0) + WARN_LOG(GDROM, "Negative track size found. You must extract image with /pregap option"); + + std::fseek(fsource, track.position, SEEK_SET); + if (track.total_length < track.length + track.pregap_length) + { + WARN_LOG(GDROM, "This track seems truncated. Skipping..."); + // FIXME that can't be right + std::fseek(fsource, track.total_length, SEEK_CUR); + } + else + { + std::fseek(fsource, track.total_length * track.sector_size, SEEK_CUR); + rv->EndFAD = track.start_lba + track.total_length - 1; + } + track.position = std::ftell(fsource); + + std::fseek(fsource, image.header_position, SEEK_SET); + + image.remaining_tracks--; } - track.position = std::ftell(fsource); - - std::fseek(fsource, image.header_position, SEEK_SET); - - image.remaining_tracks--; } - } - CDI_skip_next_session(fsource, &image); + CDI_skip_next_session(fsource, &image); - image.remaining_sessions--; - } - if (digest != nullptr) - *digest = MD5Sum().add(fsource).getDigest(); - std::fclose(fsource); + image.remaining_sessions--; + } + if (digest != nullptr) + *digest = MD5Sum().add(fsource).getDigest(); + std::fclose(fsource); - rv->type=GuessDiscType(CD_M1,CD_M2,CD_DA); + rv->type=GuessDiscType(CD_M1,CD_M2,CD_DA); - rv->LeadOut.StartFAD = rv->EndFAD; - rv->LeadOut.ADR = 1; - rv->LeadOut.CTRL = 4; + rv->LeadOut.StartFAD = rv->EndFAD; + rv->LeadOut.ADR = 1; + rv->LeadOut.CTRL = 4; - return rv; + return rv.release(); + } catch (...) { + std::fclose(fsource); + throw; + } } diff --git a/core/imgread/cdio.cpp b/core/imgread/cdio.cpp new file mode 100755 index 000000000..8b328c11e --- /dev/null +++ b/core/imgread/cdio.cpp @@ -0,0 +1,241 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#include "build.h" +#ifdef USE_LIBCDIO +#include "types.h" +#include "imgread/common.h" +#include +#include +#include +#include + +namespace hostfs +{ + +const std::vector& getCdromDrives() +{ + static std::vector cdromDevices; + static bool devicesFetched; + + if (devicesFetched) + return cdromDevices; + devicesFetched = true; + // Set a custom log handler + cdio_log_set_handler([](cdio_log_level_t level, const char message[]) { + switch (level) + { + case CDIO_LOG_DEBUG: + DEBUG_LOG(GDROM, "%s", message); + break; + case CDIO_LOG_INFO: + INFO_LOG(GDROM, "%s", message); + break; + case CDIO_LOG_WARN: + WARN_LOG(GDROM, "%s", message); + break; + case CDIO_LOG_ERROR: + case CDIO_LOG_ASSERT: + ERROR_LOG(GDROM, "%s", message); + break; + } + }); + // Get the list of all hardware devices + char **list = cdio_get_devices(DRIVER_DEVICE); + if (list != nullptr) + { + for (char **dev = &list[0]; *dev != nullptr; dev++) + cdromDevices.push_back(*dev); + cdio_free_device_list(list); + } + + return cdromDevices; +} + +} + +struct CdioDrive; + +struct CdioTrack : public TrackFile +{ + CdioTrack(CdioDrive& disk, bool audio) + : disk(disk), audio(audio) {} + bool Read(u32 FAD, u8 *dst, SectorFormat *sector_type, u8 *subcode, SubcodeFormat *subcode_type); + + CdioDrive& disk; + bool audio; +}; + +struct CdioDrive : public Disc +{ + bool open(const char *path) + { + const std::vector& devices = hostfs::getCdromDrives(); + if (!devices.empty()) + { + // If the list isn't empty, check that an entry exists for the current path + std::string lpath(path); +#ifdef _WIN32 + if (lpath.substr(0, 4) != "\\\\.\\") + lpath = "\\\\.\\" + lpath; +#endif + bool found = false; + for (const std::string& dev : devices) + if (dev == lpath) { + found = true; + break; + } + if (!found) { + WARN_LOG(GDROM, "%s isn't a CD device", path); + return false; + } + } + pCdio = cdio_open(path, DRIVER_DEVICE); + if (pCdio == nullptr) { + WARN_LOG(GDROM, "Can't open CD device %s", path); + return false; + } + track_t firstTrk = cdio_get_first_track_num(pCdio); + track_t lastTrk = cdio_get_last_track_num(pCdio); + if (firstTrk == CDIO_INVALID_TRACK || lastTrk == CDIO_INVALID_TRACK) + { + WARN_LOG(GDROM, "Can't find first and/or last track"); + close(); + return false; + } + + Session session; + session.StartFAD = 150; + session.FirstTrack = firstTrk; + sessions.push_back(session); + type = CdDA; // TODO more CD types + + for (int i = firstTrk; i <= lastTrk; i++) + { + lba_t lba = cdio_get_track_lba(pCdio, i); + if (lba == CDIO_INVALID_LBA) + { + WARN_LOG(GDROM, "Can't find track %d", i); + close(); + return false; + } + track_format_t format = cdio_get_track_format(pCdio, i); + bool copy = true; + if (format == TRACK_FORMAT_AUDIO) { + track_flag_t copyFlag = cdio_get_track_copy_permit(pCdio, i); + copy = copyFlag == CDIO_TRACK_FLAG_TRUE; + } + else if (!tracks.empty() && !tracks.back().isDataTrack()) + { + // session 1 lead-out & session 2 lead-in and pre-gap + tracks.back().EndFAD -= 11400; + + type = CdRom_XA; + Session session; + session.StartFAD = lba; + session.FirstTrack = i; + sessions.push_back(session); + } + Track t; + t.ADR = 1; // FIXME correct? + t.CTRL = format == TRACK_FORMAT_AUDIO ? 0 : CDIO_CDROM_DATA_TRACK; + t.StartFAD = lba; + lsn_t last = cdio_get_track_last_lsn(pCdio, i); + if (last == CDIO_INVALID_LSN) + WARN_LOG(GDROM, "Can't get last lsn of track %d", i); + else + t.EndFAD = cdio_lsn_to_lba(last); + if (i == firstTrk) + sessions.front().StartFAD = t.StartFAD; + INFO_LOG(GDROM, "Track #%d: start %d end %d format %d copy %d", i, t.StartFAD, t.EndFAD, format, copy); + t.file = new CdioTrack(*this, format == TRACK_FORMAT_AUDIO); + tracks.push_back(t); + } + lba_t leadout = cdio_get_track_lba(pCdio, CDIO_CDROM_LEADOUT_TRACK); + if (leadout == CDIO_INVALID_LBA) + { + WARN_LOG(GDROM, "Can't find leadout track"); + close(); + return false; + } + LeadOut.StartFAD = leadout; + LeadOut.ADR = 1; + LeadOut.CTRL = CDIO_CDROM_DATA_TRACK; + + return true; + } + + void close() + { + if (pCdio != nullptr) { + cdio_destroy(pCdio); + pCdio = nullptr; + } + } + ~CdioDrive() { + close(); + } + + CdIo_t *pCdio = nullptr; +}; + +bool CdioTrack::Read(u32 FAD, u8 *dst, SectorFormat *sector_type, u8 *subcode, SubcodeFormat *subcode_type) +{ + lsn_t lsn = cdio_lba_to_lsn(FAD); + if (audio) + { + *sector_type = SECFMT_2352; + if (cdio_read_audio_sector(disk.pCdio, dst, lsn) != DRIVER_OP_SUCCESS) { + WARN_LOG(GDROM, "Read audio fad %d failed", FAD); + return false; + } + } + else + { + *sector_type = SECFMT_2048_MODE2_FORM1; + if (cdio_read_mode2_sector(disk.pCdio, dst, lsn, false) != DRIVER_OP_SUCCESS) + { + if (cdio_read_mode1_sector(disk.pCdio, dst, lsn, false) != DRIVER_OP_SUCCESS) { + WARN_LOG(GDROM, "Read data fad %d failed", FAD); + return false; + } + *sector_type = SECFMT_2048_MODE1; + } + } + + return true; +} + +Disc *cdio_parse(const char *file, std::vector *digest) +{ + INFO_LOG(GDROM, "Opening CDIO device %s", file); + CdioDrive *disk = new CdioDrive(); + + if (disk->open(file)) + { + if (digest != nullptr) + digest->clear(); + return disk; + } + else { + delete disk; + return nullptr; + } +} + +#endif // USE_LIBCDIO diff --git a/core/imgread/chd.cpp b/core/imgread/chd.cpp index 540368f54..0bb7417ff 100644 --- a/core/imgread/chd.cpp +++ b/core/imgread/chd.cpp @@ -21,7 +21,7 @@ struct CHDDisc : Disc void tryOpen(const char* file); - ~CHDDisc() + ~CHDDisc() override { delete[] hunk_mem; @@ -189,7 +189,7 @@ void CHDDisc::tryOpen(const char* file) Track t; t.StartFAD = total_frames; total_frames += frames; - t.EndFAD = total_frames - 1; + t.EndFAD = total_frames - 1 - padframes; t.CTRL = strcmp(type,"AUDIO") == 0 ? 0 : 4; u32 sectorSize = getSectorSize(type); diff --git a/core/imgread/common.cpp b/core/imgread/common.cpp index 0571c5057..d0157b509 100644 --- a/core/imgread/common.cpp +++ b/core/imgread/common.cpp @@ -2,15 +2,18 @@ #include "hw/gdrom/gdromv3.h" #include "cfg/option.h" #include "stdclass.h" +#include "hw/sh4/sh4_sched.h" +#include "serialize.h" Disc* chd_parse(const char* file, std::vector *digest); Disc* gdi_parse(const char* file, std::vector *digest); Disc* cdi_parse(const char* file, std::vector *digest); Disc* cue_parse(const char* file, std::vector *digest); -Disc* ioctl_parse(const char* file, std::vector *digest); +Disc *cdio_parse(const char *file, std::vector *digest); -u32 NullDriveDiscType; +static u32 NullDriveDiscType; Disc* disc; +static int schedId = -1; constexpr Disc* (*drivers[])(const char* path, std::vector *digest) { @@ -18,12 +21,12 @@ constexpr Disc* (*drivers[])(const char* path, std::vector *digest) gdi_parse, cdi_parse, cue_parse, -#if defined(_WIN32) && !defined(TARGET_UWP) - ioctl_parse, +#ifdef USE_LIBCDIO + cdio_parse, #endif }; -u8 q_subchannel[96]; +static u8 q_subchannel[96]; static bool convertSector(u8* in_buff , u8* out_buff , int from , int to,int sector) { @@ -90,12 +93,14 @@ Disc* OpenDisc(const std::string& path, std::vector *digest) return disc; } - return nullptr; + throw FlycastException("Unknown disk format"); } +namespace gdr { + static bool loadDisk(const std::string& path) { - TermDrive(); + termDrive(); //try all drivers std::vector digest; @@ -113,44 +118,46 @@ static bool loadDisk(const std::string& path) INFO_LOG(GDROM, "gdrom: Failed to open image \"%s\"", path.c_str()); NullDriveDiscType = NoDisk; } - libCore_gdrom_disc_change(); return disc != NULL; } -bool InitDrive(const std::string& path) +static bool doDiscSwap(const std::string& path); + + +bool initDrive(const std::string& path) { - bool rc = DiscSwap(path); - // not needed at startup and confuses some games - sns_asc = 0; - sns_ascq = 0; - sns_key = 0; + bool rc = doDiscSwap(path); + if (rc && disc == nullptr) + { + // Drive is busy + sns_asc = 4; + sns_ascq = 1; + sns_key = 2; + SecNumber.Status = GD_BUSY; + sh4_sched_request(schedId, SH4_MAIN_CLOCK); + } + else { + gd_setdisc(); + } return rc; } -void DiscOpenLid() +void openLid() { - TermDrive(); + settings.content.path.clear(); + termDrive(); NullDriveDiscType = Open; gd_setdisc(); - sns_asc = 0x29; - sns_ascq = 0x00; - sns_key = 0x6; } -bool DiscSwap(const std::string& path) +static bool doDiscSwap(const std::string& path) { - // These Additional Sense Codes mean "The lid was closed" - sns_asc = 0x28; - sns_ascq = 0x00; - sns_key = 0x6; - if (path.empty()) { - TermDrive(); + termDrive(); NullDriveDiscType = NoDisk; - gd_setdisc(); return true; } @@ -158,17 +165,25 @@ bool DiscSwap(const std::string& path) return true; NullDriveDiscType = NoDisk; - gd_setdisc(); - return false; } -void TermDrive() +void termDrive() { + sh4_sched_request(schedId, -1); delete disc; - disc = NULL; + disc = nullptr; +} + +bool isOpen() { + return disc == nullptr && NullDriveDiscType == Open; +} + +bool isLoaded() { + return disc != nullptr; } +} // namespace gdr // //convert our nice toc struct to dc's native one :) @@ -190,10 +205,14 @@ static u32 createTrackInfoFirstLast(const Track& track, u32 tracknum) return createTrackInfo(track, tracknum << 16); } -void libGDR_ReadSector(u8 *buff, u32 startSector, u32 sectorCount, u32 sectorSize) +u32 libGDR_ReadSector(u8 *buff, u32 startSector, u32 sectorCount, u32 sectorSize, bool stopOnMiss) { if (disc != nullptr) - disc->ReadSectors(startSector, sectorCount, buff, sectorSize); + return disc->ReadSectors(startSector, sectorCount, buff, sectorSize, stopOnMiss); + if (stopOnMiss) + return 0; + memset(buff, 0, sectorCount * sectorSize); + return sectorCount; } void libGDR_GetToc(u32* to, DiskArea area) @@ -223,8 +242,7 @@ void libGDR_GetToc(u32* to, DiskArea area) to[100] = createTrackInfoFirstLast(disc->tracks[last_track - 1], last_track); if (disc->type == GdRom && area == SingleDensity) - // use smaller LEADOUT - to[101] = createTrackInfo(disc->LeadOut, 13085); + to[101] = createTrackInfo(disc->LeadOut, disc->tracks[1].EndFAD + 1); else to[101] = createTrackInfo(disc->LeadOut, disc->LeadOut.StartFAD); @@ -250,13 +268,25 @@ DiscType GuessDiscType(bool m1, bool m2, bool da) return CdRom; } -void Disc::ReadSectors(u32 FAD, u32 count, u8* dst, u32 fmt, LoadProgress *progress) +bool Disc::readSector(u32 FAD, u8 *dst, SectorFormat *sector_type, u8 *subcode, SubcodeFormat *subcode_type) +{ + for (size_t i = tracks.size(); i-- > 0; ) + { + *subcode_type = SUBFMT_NONE; + if (tracks[i].Read(FAD, dst, sector_type, subcode, subcode_type)) + return true; + } + + return false; +} + +u32 Disc::ReadSectors(u32 FAD, u32 count, u8* dst, u32 fmt, bool stopOnMiss, LoadProgress *progress) { u8 temp[2448]; SectorFormat secfmt; SubcodeFormat subfmt; - for (u32 i = 1; i <= count; i++) + for (u32 i = 0; i < count; i++) { if (progress != nullptr) { @@ -265,42 +295,40 @@ void Disc::ReadSectors(u32 FAD, u32 count, u8* dst, u32 fmt, LoadProgress *progr progress->label = "Loading..."; progress->progress = (float)i / count; } - if (ReadSector(FAD,temp,&secfmt,q_subchannel,&subfmt)) - { - //TODO: Proper sector conversions - if (secfmt==SECFMT_2352) - { - convertSector(temp,dst,2352,fmt,FAD); - } - else if (fmt == 2048 && secfmt==SECFMT_2336_MODE2) - memcpy(dst,temp+8,2048); - else if (fmt==2048 && (secfmt==SECFMT_2048_MODE1 || secfmt==SECFMT_2048_MODE2_FORM1 )) - { - memcpy(dst,temp,2048); - } - else if (fmt==2352 && (secfmt==SECFMT_2048_MODE1 || secfmt==SECFMT_2048_MODE2_FORM1 )) - { - INFO_LOG(GDROM, "GDR:fmt=2352;secfmt=2048"); - memcpy(dst,temp,2048); - } - else if (fmt==2048 && secfmt==SECFMT_2448_MODE2) - { - // Pier Solar and the Great Architects - convertSector(temp, dst, 2448, fmt, FAD); - } - else - { - WARN_LOG(GDROM, "ERROR: UNABLE TO CONVERT SECTOR. THIS IS FATAL. Format: %d Sector format: %d", fmt, secfmt); - //verify(false); - } - } - else + if (!readSector(FAD, temp, &secfmt, q_subchannel, &subfmt)) { WARN_LOG(GDROM, "Sector Read miss FAD: %d", FAD); + if (stopOnMiss) + return i; + memset(temp, 0, sizeof(temp)); + secfmt = SECFMT_2352; + } + + //TODO: Proper sector conversions + if (secfmt == SECFMT_2352) { + convertSector(temp, dst, 2352, fmt, FAD); + } + else if (fmt == 2048 && secfmt == SECFMT_2336_MODE2) { + memcpy(dst, temp + 8, 2048); } - dst+=fmt; + else if (fmt == 2048 && (secfmt == SECFMT_2048_MODE1 || secfmt == SECFMT_2048_MODE2_FORM1)) { + memcpy(dst, temp, 2048); + } + else if (fmt == 2352 && (secfmt == SECFMT_2048_MODE1 || secfmt == SECFMT_2048_MODE2_FORM1 )) { + INFO_LOG(GDROM, "GDR:fmt=2352;secfmt=2048"); + memcpy(dst, temp, 2048); + } + else if (fmt == 2048 && secfmt == SECFMT_2448_MODE2) { + // Pier Solar and the Great Architects + convertSector(temp, dst, 2448, fmt, FAD); + } + else { + WARN_LOG(GDROM, "ERROR: UNABLE TO CONVERT SECTOR. THIS IS FATAL. Format: %d Sector format: %d", fmt, secfmt); + } + dst += fmt; FAD++; } + return count; } void libGDR_ReadSubChannel(u8 * buff, u32 len) @@ -310,8 +338,70 @@ void libGDR_ReadSubChannel(u8 * buff, u32 len) u32 libGDR_GetDiscType() { - if (disc) + // Pretend no disk is inserted if a disk swapping is in progress + if (!sh4_sched_is_scheduled(schedId) && disc != nullptr) return disc->type; else return NullDriveDiscType; } + +static int discSwapCallback(int tag, int sch_cycl, int jitter, void *arg) +{ + if (disc != nullptr) + // The lid was closed + sns_asc = 0x28; + else + // No disc inserted at the time of power-on, reset or hard reset, or TOC cannot be read. + sns_asc = 0x29; + sns_ascq = 0; + sns_key = 6; + gd_setdisc(); + + return 0; +} + +namespace gdr +{ + +void insertDisk(const std::string& path) +{ + if (!doDiscSwap(path)) + throw FlycastException("This media cannot be loaded"); + settings.content.path = path; + // Drive is busy after the lid was closed + sns_asc = 4; + sns_ascq = 1; + sns_key = 2; + SecNumber.Status = GD_BUSY; + sh4_sched_request(schedId, SH4_MAIN_CLOCK); // 1 s +} + +} + +void libGDR_init() +{ + verify(schedId == -1); + schedId = sh4_sched_register(0, discSwapCallback); +} +void libGDR_term() +{ + gdr::termDrive(); + sh4_sched_unregister(schedId); + schedId = -1; +} + +void libGDR_serialize(Serializer& ser) +{ + ser << NullDriveDiscType; + ser << q_subchannel; + sh4_sched_serialize(ser, schedId); +} +void libGDR_deserialize(Deserializer& deser) +{ + deser >> NullDriveDiscType; + deser >> q_subchannel; + if (deser.version() >= Deserializer::V46) + sh4_sched_deserialize(deser, schedId); + else + sh4_sched_request(schedId, -1); +} diff --git a/core/imgread/common.h b/core/imgread/common.h index 0e1ab86d5..8366d7fdc 100644 --- a/core/imgread/common.h +++ b/core/imgread/common.h @@ -60,10 +60,16 @@ enum DiskArea DoubleDensity }; -bool InitDrive(const std::string& path); -void TermDrive(); -bool DiscSwap(const std::string& path); -void DiscOpenLid(); +namespace gdr { + +bool initDrive(const std::string& path); +void termDrive(); +void insertDisk(const std::string& path); +void openLid(); +bool isOpen(); +bool isLoaded(); + +} struct Session { @@ -112,19 +118,7 @@ struct Disc DiscType type; std::string catalog; - bool ReadSector(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type) - { - for (size_t i=tracks.size();i-->0;) - { - *subcode_type=SUBFMT_NONE; - if (tracks[i].Read(FAD,dst,sector_type,subcode,subcode_type)) - return true; - } - - return false; - } - - void ReadSectors(u32 FAD, u32 count, u8 *dst, u32 fmt, LoadProgress *progress = nullptr); + u32 ReadSectors(u32 FAD, u32 count, u8 *dst, u32 fmt, bool stopOnMiss = false, LoadProgress *progress = nullptr); virtual ~Disc() { @@ -167,7 +161,7 @@ struct Disc for (u32 j=tracks[i].StartFAD;j<=tracks[i].EndFAD;j++) { - u8 temp[2352]; + u8 temp[2448]; ReadSectors(j,1,temp,fmt); std::fwrite(temp, fmt, 1, fo); } @@ -211,6 +205,9 @@ struct Disc GetSessionInfo(ses, ses[2]); return (ses[3] << 16) | (ses[4] << 8) | (ses[5] << 0); } + +private: + bool readSector(u32 FAD, u8 *dst, SectorFormat *sector_type, u8 *subcode, SubcodeFormat *subcode_type); }; Disc* OpenDisc(const std::string& path, std::vector *digest = nullptr); @@ -242,7 +239,8 @@ struct RawTrackFile : TrackFile *sector_type=SECFMT_2448_MODE2; else { - verify(false); + WARN_LOG(GDROM, "Unsupported sector size %d", fmt); + return false; } std::fseek(file, offset + FAD * fmt, SEEK_SET); @@ -263,7 +261,7 @@ struct RawTrackFile : TrackFile DiscType GuessDiscType(bool m1, bool m2, bool da); //IO -void libGDR_ReadSector(u8 * buff,u32 StartSector,u32 SectorCount,u32 secsz); +u32 libGDR_ReadSector(u8 * buff, u32 StartSector, u32 SectorCount, u32 secsz, bool stopOnMiss = false); void libGDR_ReadSubChannel(u8 * buff, u32 len); void libGDR_GetToc(u32 *toc, DiskArea area); u32 libGDR_GetDiscType(); @@ -273,6 +271,10 @@ bool libGDR_GetTrack(u32 track_num, u32& start_fad, u32& end_fad); std::string libGDR_GetDiskCatalog(); std::string libGDR_GetTrackIsrc(u32 trackNum); void libGDR_GetTrackAdrAndControl(u32 trackNum, u8& adr, u8& ctrl); +void libGDR_init(); +void libGDR_term(); +void libGDR_serialize(Serializer& ser); +void libGDR_deserialize(Deserializer& deser); namespace flycast { diff --git a/core/imgread/cue.cpp b/core/imgread/cue.cpp index d1cc86463..10caf986c 100644 --- a/core/imgread/cue.cpp +++ b/core/imgread/cue.cpp @@ -59,7 +59,7 @@ Disc* cue_parse(const char* file, std::vector *digest) hostfs::FileInfo fileInfo = hostfs::storage().getFileInfo(file); size_t cue_len = fileInfo.size; - char cue_data[64 * 1024] = { 0 }; + char cue_data[64_KB] = { 0 }; if (cue_len >= sizeof(cue_data)) { diff --git a/core/imgread/gdi.cpp b/core/imgread/gdi.cpp index 2adf4af57..1197d3375 100644 --- a/core/imgread/gdi.cpp +++ b/core/imgread/gdi.cpp @@ -84,7 +84,7 @@ Disc* load_gdi(const char* file, std::vector *digest) t.StartFAD = FADS + 150; t.CTRL = CTRL; - if (SSIZE!=0) + if (SSIZE != 0) { std::string path = hostfs::storage().getSubPath(basepath, track_filename); FILE *file = hostfs::storage().openFile(path, "rb"); @@ -96,9 +96,11 @@ Disc* load_gdi(const char* file, std::vector *digest) if (digest != nullptr) md5.add(file); t.file = new RawTrackFile(file, OFFSET, t.StartFAD, SSIZE); + hostfs::FileInfo fileInfo = hostfs::storage().getFileInfo(path); + if ((fileInfo.size - OFFSET) % SSIZE != 0) + WARN_LOG(GDROM, "Warning: Size of track %s is not multiple of sector size %d", track_filename.c_str(), SSIZE); + t.EndFAD = t.StartFAD + (u32)(fileInfo.size - OFFSET) / SSIZE - 1; } - if (!disc->tracks.empty()) - disc->tracks.back().EndFAD = t.StartFAD - 1; disc->tracks.push_back(t); } diff --git a/core/imgread/ioctl.cpp b/core/imgread/ioctl.cpp deleted file mode 100644 index 6b879e0ef..000000000 --- a/core/imgread/ioctl.cpp +++ /dev/null @@ -1,360 +0,0 @@ -#include "build.h" -#if defined(_WIN32) && !defined(TARGET_UWP) -#include "types.h" -#include "common.h" - -#include -#include - -#include -#include - -#ifdef _MSC_VER -#define _NTSCSI_USER_MODE_ -#include -#undef _NTSCSI_USER_MODE_ -#else -#define CD_RAW_READ_SUBCODE_SIZE ( 96) - -#pragma pack(push, cdb, 1) -typedef union _CDB { - struct _READ_CD { - UCHAR OperationCode; // 0xBE - SCSIOP_READ_CD - UCHAR RelativeAddress : 1; - UCHAR Reserved0 : 1; - UCHAR ExpectedSectorType : 3; - UCHAR Lun : 3; - UCHAR StartingLBA[4]; - UCHAR TransferBlocks[3]; - UCHAR Reserved2 : 1; - UCHAR ErrorFlags : 2; - UCHAR IncludeEDC : 1; - UCHAR IncludeUserData : 1; - UCHAR HeaderCode : 2; - UCHAR IncludeSyncData : 1; - UCHAR SubChannelSelection : 3; - UCHAR Reserved3 : 5; - UCHAR Control; - } READ_CD; -} CDB, *PCDB; -#pragma pack(pop, cdb) - -#define READ_TOC_FORMAT_FULL_TOC 0x02 - -#define SCSIOP_READ 0x28 -#define SCSIOP_READ_CD 0xBE -#endif - -#define RAW_SECTOR_SIZE 2352 -#define CD_SECTOR_SIZE 2048 -#define SECTORS_AT_READ 20 -#define CD_BLOCKS_PER_SECOND 75 - -struct spti_s -{ - SCSI_PASS_THROUGH_DIRECT sptd; - DWORD alignmentDummy; - BYTE senseBuf[0x12]; -}; - -ULONG msf2fad(const UCHAR Addr[4]) -{ - ULONG Sectors = ( Addr[0] * (CD_BLOCKS_PER_SECOND*60) ) + ( Addr[1]*CD_BLOCKS_PER_SECOND) + Addr[2]; - return Sectors; -} - - -// Msf: Hours, Minutes, Seconds, Frames -ULONG AddressToSectors( UCHAR Addr[4] ); - - -bool spti_SendCommand(HANDLE hand,spti_s& s,SCSI_ADDRESS& ioctl_addr) -{ - s.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); - s.sptd.PathId = ioctl_addr.PathId; - s.sptd.TargetId = ioctl_addr.TargetId; - s.sptd.Lun = ioctl_addr.Lun; - s.sptd.TimeOutValue = 30; - //s.sptd.CdbLength = 0x0A; - s.sptd.SenseInfoLength = 0x12; - s.sptd.SenseInfoOffset = offsetof(spti_s, senseBuf); -// s.sptd.DataIn = SCSI_IOCTL_DATA_IN; -// s.sptd.DataTransferLength = 0x800; -// s.sptd.DataBuffer = pdata; - - DWORD bytesReturnedIO = 0; - if(!DeviceIoControl(hand, IOCTL_SCSI_PASS_THROUGH_DIRECT, &s, sizeof(s), &s, sizeof(s), &bytesReturnedIO, NULL)) - return false; - - if(s.sptd.ScsiStatus) - return false; - return true; -} - -bool spti_Read10(HANDLE hand,void * pdata,u32 sector,SCSI_ADDRESS& ioctl_addr) -{ - spti_s s; - memset(&s,0,sizeof(spti_s)); - - s.sptd.Cdb[0] = SCSIOP_READ; - s.sptd.Cdb[1] = (ioctl_addr.Lun&7) << 5;// | DPO ; DPO = 8 - - s.sptd.Cdb[2] = (BYTE)(sector >> 0x18 & 0xFF); // MSB - s.sptd.Cdb[3] = (BYTE)(sector >> 0x10 & 0xFF); - s.sptd.Cdb[4] = (BYTE)(sector >> 0x08 & 0xFF); - s.sptd.Cdb[5] = (BYTE)(sector >> 0x00 & 0xFF); // LSB - - s.sptd.Cdb[7] = 0; - s.sptd.Cdb[8] = 1; - - s.sptd.CdbLength = 0x0A; - s.sptd.DataIn = SCSI_IOCTL_DATA_IN; - s.sptd.DataTransferLength = 0x800; - s.sptd.DataBuffer = pdata; - - return spti_SendCommand(hand,s,ioctl_addr); -} -bool spti_ReadCD(HANDLE hand,void * pdata,u32 sector,SCSI_ADDRESS& ioctl_addr) -{ - spti_s s; - memset(&s,0,sizeof(spti_s)); - CDB& r = *(PCDB)s.sptd.Cdb; - - r.READ_CD.OperationCode = SCSIOP_READ_CD; - - r.READ_CD.StartingLBA[0] = (BYTE)(sector >> 0x18 & 0xFF); - r.READ_CD.StartingLBA[1] = (BYTE)(sector >> 0x10 & 0xFF); - r.READ_CD.StartingLBA[2] = (BYTE)(sector >> 0x08 & 0xFF); - r.READ_CD.StartingLBA[3] = (BYTE)(sector >> 0x00 & 0xFF); - - // 1 sector - r.READ_CD.TransferBlocks[0] = 0; - r.READ_CD.TransferBlocks[1] = 0; - r.READ_CD.TransferBlocks[2] = 1; - - // 0xF8 - r.READ_CD.IncludeSyncData = 1; - r.READ_CD.HeaderCode = 3; - r.READ_CD.IncludeUserData = 1; - r.READ_CD.IncludeEDC = 1; - - r.READ_CD.SubChannelSelection = 1; - - s.sptd.CdbLength = 12; - s.sptd.DataIn = SCSI_IOCTL_DATA_IN; - s.sptd.DataTransferLength = 2448; - s.sptd.DataBuffer = pdata; - return spti_SendCommand(hand,s,ioctl_addr); -} - -struct PhysicalDrive; -struct PhysicalTrack:TrackFile -{ - PhysicalDrive* disc; - PhysicalTrack(PhysicalDrive* disc) { this->disc=disc; } - - bool Read(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type) override; -}; - -struct PhysicalDrive:Disc -{ - HANDLE drive; - SCSI_ADDRESS scsi_addr; - bool use_scsi; - - PhysicalDrive() - { - drive=INVALID_HANDLE_VALUE; - memset(&scsi_addr,0,sizeof(scsi_addr)); - use_scsi=false; - } - - bool Build(char* path) - { - drive = CreateFile( path, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL); - - if ( INVALID_HANDLE_VALUE == drive ) - return false; //failed to open - - printf(" Opened device %s, reading TOC ...",path); - // Get track-table and parse it - CDROM_READ_TOC_EX tocrq={0}; - - tocrq.Format = READ_TOC_FORMAT_FULL_TOC; - tocrq.Msf=1; - tocrq.SessionTrack=1; - u8 buff[2048]; - CDROM_TOC_FULL_TOC_DATA *ftd=(CDROM_TOC_FULL_TOC_DATA*)buff; - - ULONG BytesRead; - memset(buff,0,sizeof(buff)); - int code = DeviceIoControl(drive,IOCTL_CDROM_READ_TOC_EX,&tocrq,sizeof(tocrq),ftd, 2048, &BytesRead, NULL); - -// CDROM_TOC toc; - int currs=-1; - if (0==code) - { - printf(" failed\n"); - //failed to read toc - CloseHandle(drive); - return false; - } - else - { - printf(" done !\n"); - - type=CdRom_XA; - - BytesRead-=sizeof(CDROM_TOC_FULL_TOC_DATA); - BytesRead/=sizeof(ftd->Descriptors[0]); - - for (u32 i=0;iDescriptors[i].Point==0xA2) - { - this->EndFAD=msf2fad(ftd->Descriptors[i].Msf); - continue; - } - if (ftd->Descriptors[i].Point>=1 && ftd->Descriptors[i].Point<=0x63 && - ftd->Descriptors[i].Adr==1) - { - u32 trackn=ftd->Descriptors[i].Point-1; - verify(trackn==tracks.size()); - Track t; - - t.ADR=ftd->Descriptors[i].Adr; - t.CTRL=ftd->Descriptors[i].Control; - t.StartFAD=msf2fad(ftd->Descriptors[i].Msf); - t.file = new PhysicalTrack(this); - - tracks.push_back(t); - - if (currs!=ftd->Descriptors[i].SessionNumber) - { - currs=ftd->Descriptors[i].SessionNumber; - verify(sessions.size()==(currs-1)); - Session s; - s.FirstTrack=trackn+1; - s.StartFAD=t.StartFAD; - - sessions.push_back(s); - } - } - } - LeadOut.StartFAD = EndFAD; - LeadOut.ADR = 1; - LeadOut.CTRL = 4; - } - - DWORD bytesReturnedIO = 0; - BOOL resultIO = DeviceIoControl(drive, IOCTL_SCSI_GET_ADDRESS, NULL, 0, &scsi_addr, sizeof(scsi_addr), &bytesReturnedIO, NULL); - //done ! - if (resultIO) - use_scsi=true; - else - use_scsi=false; - - return true; - } -}; - -bool PhysicalTrack::Read(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type) -{ - static u8 temp[2500]; - - u32 LBA=FAD-150; - - if (disc->use_scsi) - { - if (!spti_ReadCD(disc->drive, temp,LBA,disc->scsi_addr)) - { - if (spti_Read10(disc->drive, dst,LBA,disc->scsi_addr)) - { - //sector read success, just user data - *sector_type=SECFMT_2048_MODE2_FORM1; //m2f1 seems more common ? is there some way to detect it properly here? - return true; - } - } - else - { - //sector read success, with subcode - memcpy(dst, temp, 2352); - memcpy(subcode, temp + 2352, CD_RAW_READ_SUBCODE_SIZE); - - *sector_type=SECFMT_2352; - *subcode_type=SUBFMT_96; - return true; - } - } - - //hmm, spti failed/cannot be used - - - //try IOCTL_CDROM_RAW_READ - - - static __RAW_READ_INFO Info; - - Info.SectorCount=1; - Info.DiskOffset.QuadPart = LBA * CD_SECTOR_SIZE; //CD_SECTOR_SIZE, even though we read RAW sectors. Its how winapi works. - ULONG Dummy; - - //try all 3 track modes, starting from the one that succeeded last time (Info is static) to save time ! - for (int tr=0;tr<3;tr++) - { - if ( 0 == DeviceIoControl( disc->drive, IOCTL_CDROM_RAW_READ, &Info, sizeof(Info), dst, RAW_SECTOR_SIZE, &Dummy, NULL ) ) - { - Info.TrackMode=(TRACK_MODE_TYPE)((Info.TrackMode+1)%3); //try next mode - } - else - { - //sector read success - *sector_type=SECFMT_2352; - return true; - } - } - - //finally, try ReadFile - if (SetFilePointer(disc->drive,LBA*2048,0,FILE_BEGIN)!=INVALID_SET_FILE_POINTER) - { - DWORD BytesRead; - if (FALSE!=ReadFile(disc->drive,dst,2048,&BytesRead,0) && BytesRead==2048) - { - //sector read success, just user data - *sector_type=SECFMT_2048_MODE2_FORM1; //m2f1 seems more common ? is there some way to detect it properly here? - return true; - } - } - - printf("IOCTL: Totally failed to read sector @LBA %d\n", LBA); - return false; -} - - -Disc* ioctl_parse(const char* file, std::vector *digest) -{ - - if (strlen(file)==3 && GetDriveType(file)==DRIVE_CDROM) - { - printf("Opening device %s ...",file); - char fn[]={ '\\', '\\', '.', '\\', file[0],':', '\0' }; - PhysicalDrive* rv = new PhysicalDrive(); - - if (rv->Build(fn)) - { - if (digest != nullptr) - digest->clear(); - return rv; - } - else - { - delete rv; - return 0; - } - } - else - { - return 0; - } -} -#endif diff --git a/core/imgread/isofs.cpp b/core/imgread/isofs.cpp index d22ac3aff..31119dba2 100644 --- a/core/imgread/isofs.cpp +++ b/core/imgread/isofs.cpp @@ -61,41 +61,69 @@ IsoFs::Directory *IsoFs::getRoot() return root; } -IsoFs::Entry *IsoFs::Directory::getEntry(const std::string& name) +void IsoFs::Directory::reset() { - std::string isoname = name + ';'; - for (u32 i = 0; i < data.size(); ) + index = 0; + if (data.empty() && len != 0) + { + data.resize(len); + fs->disc->ReadSectors(startFad, len / 2048, data.data(), 2048); + } +} + +IsoFs::Entry *IsoFs::Directory::nextEntry() +{ + if (index >= data.size()) + return nullptr; + const iso9660_dir_t *dir = (const iso9660_dir_t *)&data[index]; + if (dir->length == 0) { - const iso9660_dir_t *dir = (const iso9660_dir_t *)&data[i]; + if ((index & 2047) == 0) + return nullptr; + index = ((index + 2047) / 2048) * 2048; + if (index >= data.size()) + return nullptr; + dir = (const iso9660_dir_t *)&data[index]; if (dir->length == 0) - break; + return nullptr; + } + std::string name(dir->filename.str + 1, dir->filename.str[0]); - if ((u8)dir->filename.str[0] > isoname.size() - && memcmp(dir->filename.str + 1, isoname.c_str(), isoname.size()) == 0) - { - DEBUG_LOG(GDROM, "Found %s at offset %X", name.c_str(), i); - u32 startFad = decode_iso733(dir->extent) + 150; - u32 len = decode_iso733(dir->size); - if ((dir->file_flags & ISO_DIRECTORY) == 0) - { - File *file = new File(fs); - file->startFad = startFad; - file->len = len; - - return file; - } - else - { - Directory *directory = new Directory(fs); - directory->data.resize(len); - fs->disc->ReadSectors(startFad, len / 2048, directory->data.data(), 2048); - - return directory; - } - } - i += dir->length; + u32 startFad = decode_iso733(dir->extent) + 150; + u32 len = decode_iso733(dir->size); + Entry *entry; + if ((dir->file_flags & ISO_DIRECTORY) == 0) + { + File *file = new File(fs); + entry = file; + } + else + { + Directory *directory = new Directory(fs); + len = ((len + 2047) / 2048) * 2048; + entry = directory; + } + entry->startFad = startFad; + entry->len = len; + entry->name = name; + index += dir->length; + + return entry; +} + +IsoFs::Entry *IsoFs::Directory::getEntry(const std::string& name) +{ + std::string isoname = name + ';'; + reset(); + while (true) + { + Entry *entry = nextEntry(); + if (entry == nullptr) + return nullptr; + if (entry->getName().substr(0, isoname.size()) == isoname) + return entry; + delete entry; } - return nullptr; } u32 IsoFs::File::read(u8 *buf, u32 size, u32 offset) const @@ -112,3 +140,17 @@ u32 IsoFs::File::read(u8 *buf, u32 size, u32 offset) const } return sectors * 2048 + size; } + +std::vector IsoFs::Directory::list() +{ + std::vector v; + reset(); + while (true) + { + Entry *entry = nextEntry(); + if (entry == nullptr) + break; + v.push_back(entry); + } + return v; +} diff --git a/core/imgread/isofs.h b/core/imgread/isofs.h index 4d2944900..839961872 100644 --- a/core/imgread/isofs.h +++ b/core/imgread/isofs.h @@ -27,24 +27,33 @@ class IsoFs public: virtual bool isDirectory() const = 0; virtual ~Entry() = default; + const std::string& getName() const { return name; } protected: Entry(IsoFs *fs) : fs(fs) {} IsoFs *fs; + std::string name; + u32 startFad = 0; + u32 len = 0; + + friend class IsoFs; }; class Directory final : public Entry { public: bool isDirectory() const override { return true; } - Entry *getEntry(const std::string& name); + std::vector list(); private: Directory(IsoFs *fs) : Entry(fs) {} + void reset(); + Entry *nextEntry(); std::vector data; + u32 index = 0; friend class IsoFs; }; @@ -53,17 +62,12 @@ class IsoFs { public: bool isDirectory() const override { return false; } - u32 getSize() const { return len; } - u32 read(u8 *buf, u32 size, u32 offset = 0) const; private: File(IsoFs *fs) : Entry(fs) {} - u32 startFad = 0; - u32 len = 0; - friend class IsoFs; }; diff --git a/core/input/gamepad.h b/core/input/gamepad.h index eaf8fb0ee..e4fdc049b 100644 --- a/core/input/gamepad.h +++ b/core/input/gamepad.h @@ -50,6 +50,9 @@ enum DreamcastKey EMU_BTN_ESCAPE, EMU_BTN_LOADSTATE, EMU_BTN_SAVESTATE, + EMU_BTN_BYPASS_KB, + EMU_BTN_SCREENSHOT, + EMU_BTN_SRVMODE, // used internally by virtual gamepad // Real axes DC_AXIS_TRIGGERS = 0x1000000, diff --git a/core/input/gamepad_device.cpp b/core/input/gamepad_device.cpp index 99884fbbf..5dcb38b56 100644 --- a/core/input/gamepad_device.cpp +++ b/core/input/gamepad_device.cpp @@ -19,8 +19,8 @@ #include "gamepad_device.h" #include "cfg/cfg.h" -#include "oslib/oslib.h" -#include "rend/gui.h" +#include "stdclass.h" +#include "ui/gui.h" #include "emulator.h" #include "hw/maple/maple_devs.h" #include "mouse.h" @@ -33,17 +33,17 @@ // Gamepads u32 kcode[4] = { ~0u, ~0u, ~0u, ~0u }; -s8 joyx[4]; -s8 joyy[4]; -s8 joyrx[4]; -s8 joyry[4]; -u8 rt[4]; -u8 lt[4]; -s8 joy3x[4]; -s8 joy3y[4]; +s16 joyx[4]; +s16 joyy[4]; +s16 joyrx[4]; +s16 joyry[4]; +s16 joy3x[4]; +s16 joy3y[4]; +u16 rt[4]; +u16 lt[4]; +u16 lt2[4]; +u16 rt2[4]; // Keyboards -u8 lt2[4]; -u8 rt2[4]; u8 kb_shift[MAPLE_PORTS]; // shift keys pressed (bitmask) u8 kb_key[MAPLE_PORTS][6]; // normal keys pressed @@ -99,21 +99,25 @@ bool GamepadDevice::handleButtonInput(int port, DreamcastKey key, bool pressed) if (pressed) gui_saveState(); break; + case EMU_BTN_SCREENSHOT: + if (pressed) + gui_takeScreenshot(); + break; case DC_AXIS_LT: if (port >= 0) - lt[port] = pressed ? 255 : 0; + lt[port] = pressed ? 0xffff : 0; break; case DC_AXIS_RT: if (port >= 0) - rt[port] = pressed ? 255 : 0; + rt[port] = pressed ? 0xffff : 0; break; case DC_AXIS_LT2: if (port >= 0) - lt2[port] = pressed ? 255 : 0; + lt2[port] = pressed ? 0xffff : 0; break; case DC_AXIS_RT2: if (port >= 0) - rt2[port] = pressed ? 255 : 0; + rt2[port] = pressed ? 0xffff : 0; break; case DC_AXIS_UP: case DC_AXIS_DOWN: @@ -152,7 +156,7 @@ bool GamepadDevice::handleButtonInput(int port, DreamcastKey key, bool pressed) bool GamepadDevice::gamepad_btn_input(u32 code, bool pressed) { if (_input_detected != nullptr && _detecting_button - && os_GetSeconds() >= _detection_start_time && pressed) + && getTimeMs() >= _detection_start_time && pressed) { _input_detected(code, false, false); _input_detected = nullptr; @@ -179,6 +183,26 @@ bool GamepadDevice::gamepad_btn_input(u32 code, bool pressed) return rc; } +static DreamcastKey getOppositeAxis(DreamcastKey key) +{ + switch (key) + { + case DC_AXIS_RIGHT: return DC_AXIS_LEFT; + case DC_AXIS_LEFT: return DC_AXIS_RIGHT; + case DC_AXIS_UP: return DC_AXIS_DOWN; + case DC_AXIS_DOWN: return DC_AXIS_UP; + case DC_AXIS2_RIGHT: return DC_AXIS2_LEFT; + case DC_AXIS2_LEFT: return DC_AXIS2_RIGHT; + case DC_AXIS2_UP: return DC_AXIS2_DOWN; + case DC_AXIS2_DOWN: return DC_AXIS2_UP; + case DC_AXIS3_RIGHT: return DC_AXIS3_LEFT; + case DC_AXIS3_LEFT: return DC_AXIS3_RIGHT; + case DC_AXIS3_UP: return DC_AXIS3_DOWN; + case DC_AXIS3_DOWN: return DC_AXIS3_UP; + default: return key; + } +} + // // value must be >= -32768 and <= 32767 for full axes // and 0 to 32767 for half axes/triggers @@ -187,7 +211,7 @@ bool GamepadDevice::gamepad_axis_input(u32 code, int value) { bool positive = value >= 0; if (_input_detected != NULL && _detecting_axis - && os_GetSeconds() >= _detection_start_time && std::abs(value) >= 16384) + && getTimeMs() >= _detection_start_time && std::abs(value) >= 16384) { _input_detected(code, true, positive); _input_detected = nullptr; @@ -202,80 +226,81 @@ bool GamepadDevice::gamepad_axis_input(u32 code, int value) { //printf("T-AXIS %d Mapped to %d -> %d\n", key, value, std::min(std::abs(v) >> 7, 255)); if (key == DC_AXIS_LT) - lt[port] = std::min(std::abs(v) >> 7, 255); + lt[port] = std::min(std::abs(v) << 1, 0xffff); else if (key == DC_AXIS_RT) - rt[port] = std::min(std::abs(v) >> 7, 255); + rt[port] = std::min(std::abs(v) << 1, 0xffff); else if (key == DC_AXIS_LT2) - lt2[port] = std::min(std::abs(v) >> 7, 255); + lt2[port] = std::min(std::abs(v) << 1, 0xffff); else if (key == DC_AXIS_RT2) - rt2[port] = std::min(std::abs(v) >> 7, 255); + rt2[port] = std::min(std::abs(v) << 1, 0xffff); else return false; } else if ((key & DC_BTN_GROUP_MASK) == DC_AXIS_STICKS) // Analog axes { //printf("AXIS %d Mapped to %d -> %d\n", key, value, v); - s8 *this_axis; - s8 *other_axis; + s16 *this_axis; + int otherAxisValue; int axisDirection = -1; switch (key) { case DC_AXIS_RIGHT: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS_LEFT: this_axis = &joyx[port]; - other_axis = &joyy[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS_UP]; break; case DC_AXIS_DOWN: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS_UP: this_axis = &joyy[port]; - other_axis = &joyx[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS_LEFT]; break; case DC_AXIS2_RIGHT: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS2_LEFT: this_axis = &joyrx[port]; - other_axis = &joyry[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS2_UP]; break; case DC_AXIS2_DOWN: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS2_UP: this_axis = &joyry[port]; - other_axis = &joyrx[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS2_LEFT]; break; case DC_AXIS3_RIGHT: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS3_LEFT: this_axis = &joy3x[port]; - other_axis = &joy3y[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS3_UP]; break; case DC_AXIS3_DOWN: axisDirection = 1; - //no break + [[fallthrough]]; case DC_AXIS3_UP: this_axis = &joy3y[port]; - other_axis = &joy3x[port]; + otherAxisValue = lastAxisValue[port][DC_AXIS3_LEFT]; break; default: return false; } - // Lightgun with left analog stick int& lastValue = lastAxisValue[port][key]; - if (lastValue != v) + int& lastOpValue = lastAxisValue[port][getOppositeAxis(key)]; + if (lastValue != v || lastOpValue != v) { - lastValue = v; + lastValue = lastOpValue = v; + // Lightgun with left analog stick if (key == DC_AXIS_RIGHT || key == DC_AXIS_LEFT) mo_x_abs[port] = (std::abs(v) * axisDirection + 32768) * 639 / 65535; else if (key == DC_AXIS_UP || key == DC_AXIS_DOWN) @@ -283,21 +308,26 @@ bool GamepadDevice::gamepad_axis_input(u32 code, int value) } // Radial dead zone // FIXME compute both axes at the same time - v = std::min(127, std::abs(v >> 8)); - if ((float)(v * v + *other_axis * *other_axis) < input_mapper->dead_zone * input_mapper->dead_zone * 128.f * 128.f) + const float nv = std::abs(v) / 32768.f; + const float r2 = nv * nv + otherAxisValue * otherAxisValue / 32768.f / 32768.f; + if (r2 < input_mapper->dead_zone * input_mapper->dead_zone || r2 == 0.f) { *this_axis = 0; - *other_axis = 0; } else - *this_axis = v * axisDirection; + { + float pdz = nv * input_mapper->dead_zone / std::sqrt(r2); + // there's a dead angular zone at 45° with saturation > 1 (both axes are saturated) + v = std::round((nv - pdz) / (1 - pdz) * 32768.f * input_mapper->saturation); + *this_axis = std::clamp(v * axisDirection, -32768, 32767); + } } else if (key != EMU_BTN_NONE && key <= DC_BTN_BITMAPPED_LAST) // Map triggers to digital buttons { //printf("B-AXIS %d Mapped to %d -> %d\n", key, value, v); // TODO hysteresis? int threshold = 16384; - if ( code == leftTrigger || code == rightTrigger ) + if (code == leftTrigger || code == rightTrigger ) threshold = 100; if (std::abs(v) < threshold) @@ -417,24 +447,18 @@ bool GamepadDevice::find_mapping(int system /* = settings.platform.system */) return false; } -int GamepadDevice::GetGamepadCount() -{ - _gamepads_mutex.lock(); - int count = _gamepads.size(); - _gamepads_mutex.unlock(); - return count; +int GamepadDevice::GetGamepadCount() { + Lock _(_gamepads_mutex); + return _gamepads.size(); } std::shared_ptr GamepadDevice::GetGamepad(int index) { - _gamepads_mutex.lock(); - std::shared_ptr dev; + Lock _(_gamepads_mutex); if (index >= 0 && index < (int)_gamepads.size()) - dev = _gamepads[index]; + return _gamepads[index]; else - dev = NULL; - _gamepads_mutex.unlock(); - return dev; + return nullptr; } void GamepadDevice::save_mapping(int system /* = settings.platform.system */) @@ -479,7 +503,7 @@ void GamepadDevice::detect_btn_input(input_detected_cb button_pressed) _input_detected = button_pressed; _detecting_button = true; _detecting_axis = false; - _detection_start_time = os_GetSeconds() + 0.2; + _detection_start_time = getTimeMs() + 200; } void GamepadDevice::detect_axis_input(input_detected_cb axis_moved) @@ -487,7 +511,7 @@ void GamepadDevice::detect_axis_input(input_detected_cb axis_moved) _input_detected = axis_moved; _detecting_button = false; _detecting_axis = true; - _detection_start_time = os_GetSeconds() + 0.2; + _detection_start_time = getTimeMs() + 200; } void GamepadDevice::detectButtonOrAxisInput(input_detected_cb input_changed) @@ -495,7 +519,7 @@ void GamepadDevice::detectButtonOrAxisInput(input_detected_cb input_changed) _input_detected = input_changed; _detecting_button = true; _detecting_axis = true; - _detection_start_time = os_GetSeconds() + 0.2; + _detection_start_time = getTimeMs() + 200; } #ifdef TEST_AUTOMATION @@ -527,21 +551,19 @@ void GamepadDevice::Register(const std::shared_ptr& gamepad) setbuf(record_input, NULL); } #endif - _gamepads_mutex.lock(); + Lock _(_gamepads_mutex); _gamepads.push_back(gamepad); - _gamepads_mutex.unlock(); MapleConfigMap::UpdateVibration = updateVibration; } void GamepadDevice::Unregister(const std::shared_ptr& gamepad) { - _gamepads_mutex.lock(); + Lock _(_gamepads_mutex); for (auto it = _gamepads.begin(); it != _gamepads.end(); it++) if (*it == gamepad) { _gamepads.erase(it); break; } - _gamepads_mutex.unlock(); } void GamepadDevice::SaveMaplePorts() @@ -554,6 +576,83 @@ void GamepadDevice::SaveMaplePorts() } } +s16 (&GamepadDevice::getTargetArray(DigAnalog axis))[4] +{ + switch (axis) + { + case DIGANA_LEFT: + case DIGANA_RIGHT: + return joyx; + case DIGANA_UP:; + case DIGANA_DOWN: + return joyy; + case DIGANA2_LEFT: + case DIGANA2_RIGHT: + return joyrx; + case DIGANA2_UP: + case DIGANA2_DOWN: + return joyry; + case DIGANA3_LEFT: + case DIGANA3_RIGHT: + return joy3x; + case DIGANA3_UP: + case DIGANA3_DOWN: + return joy3y; + default: + die("unknown axis"); + } +} + +void GamepadDevice::rampAnalog() +{ + Lock _(rampMutex); + if (lastAnalogUpdate == 0) + // also used as a flag that no analog ramping is needed on this device (yet) + return; + + const u64 now = getTimeMs(); + const int delta = std::round(static_cast(now - lastAnalogUpdate) * AnalogRamp); + lastAnalogUpdate = now; + for (unsigned port = 0; port < std::size(digitalToAnalogState); port++) + { + for (int axis = 0; axis < 12; axis += 2) // 3 sticks with 2 axes each + { + DigAnalog negDir = static_cast(1 << axis); + if ((rampAnalogState[port] & negDir) == 0) + // axis not active + continue; + DigAnalog posDir = static_cast(1 << (axis + 1)); + const int socd = digitalToAnalogState[port] & (negDir | posDir); + s16& axisValue = getTargetArray(negDir)[port]; + if (socd != 0 && socd != (negDir | posDir)) + { + // One axis is pressed => ramp up + if (socd == posDir) + axisValue = std::min(32767, axisValue + delta); + else + axisValue = std::max(-32768, axisValue - delta); + } + else + { + // No axis is pressed (or both) => ramp down + if (axisValue > 0) + axisValue = std::max(0, axisValue - delta); + else if (axisValue < 0) + axisValue = std::min(0, axisValue + delta); + else + rampAnalogState[port] &= ~negDir; + } + } + } +} + +void GamepadDevice::RampAnalog() +{ + Lock _(_gamepads_mutex); + for (auto& gamepad : _gamepads) + gamepad->rampAnalog(); +} + #ifdef TEST_AUTOMATION #include "cfg/option.h" static bool replay_inited; diff --git a/core/input/gamepad_device.h b/core/input/gamepad_device.h index 9819414cd..4cf560f68 100644 --- a/core/input/gamepad_device.h +++ b/core/input/gamepad_device.h @@ -20,6 +20,7 @@ #pragma once #include "types.h" #include "mapping.h" +#include "stdclass.h" #include #include @@ -70,14 +71,43 @@ class GamepadDevice } } } + bool has_analog_stick() const { return hasAnalogStick; } + float get_dead_zone() const { return input_mapper->dead_zone; } + void set_dead_zone(float deadzone) { + if (deadzone != input_mapper->dead_zone) + { + input_mapper->dead_zone = deadzone; + input_mapper->set_dirty(); + save_mapping(); + } + } + float get_saturation() const { return input_mapper->saturation; } + void set_saturation(float saturation) + { + if (saturation != input_mapper->saturation) + { + input_mapper->saturation = saturation; + input_mapper->set_dirty(); + save_mapping(); + } + } static void Register(const std::shared_ptr& gamepad); - static void Unregister(const std::shared_ptr& gamepad); - static int GetGamepadCount(); static std::shared_ptr GetGamepad(int index); static void SaveMaplePorts(); + static void RampAnalog(); + + template + static std::shared_ptr GetGamepad() + { + Lock _(_gamepads_mutex); + for (const auto& gamepad : _gamepads) + if (dynamic_cast(gamepad.get()) != nullptr) + return std::dynamic_pointer_cast(gamepad); + return {}; + } static void load_system_mappings(); bool find_mapping(int system = settings.platform.system); @@ -109,6 +139,7 @@ class GamepadDevice std::string _unique_id; std::shared_ptr input_mapper; bool rumbleEnabled = false; + bool hasAnalogStick = false; int rumblePower = 100; u32 leftTrigger = ~0; u32 rightTrigger = ~0; @@ -133,39 +164,45 @@ class GamepadDevice }; template - void buttonToAnalogInput(int port, DreamcastKey key, bool pressed, s8& joystick) + void buttonToAnalogInput(int port, DreamcastKey key, bool pressed, s16& joystick) { if (port < 0) return; + Lock _(rampMutex); DigAnalog axis = key == DcNegDir ? NegDir : PosDir; if (pressed) digitalToAnalogState[port] |= axis; else digitalToAnalogState[port] &= ~axis; - const u32 socd = digitalToAnalogState[port] & (NegDir | PosDir); - if (socd == 0 || socd == (NegDir | PosDir)) - joystick = 0; - else if (socd == NegDir) - joystick = -128; - else - joystick = 127; - + rampAnalogState[port] |= NegDir; + if (lastAnalogUpdate == 0) + lastAnalogUpdate = getTimeMs(); } + s16 (&getTargetArray(DigAnalog axis))[4]; + void rampAnalog(); + std::string _api_name; int _maple_port; bool _detecting_button = false; bool _detecting_axis = false; - double _detection_start_time = 0.0; + u64 _detection_start_time = 0; input_detected_cb _input_detected; bool _remappable; u32 digitalToAnalogState[4]; std::map lastAxisValue[4]; bool perGameMapping = false; bool instanceMapping = false; - + + u64 lastAnalogUpdate = 0; + u32 rampAnalogState[4] {}; + static constexpr float AnalogRamp = 32767.f / 100.f; // 100 ms ramp time + std::mutex rampMutex; + static std::vector> _gamepads; static std::mutex _gamepads_mutex; + + using Lock = std::lock_guard; }; #ifdef TEST_AUTOMATION @@ -173,7 +210,7 @@ void replay_input(); #endif extern u32 kcode[4]; -extern u8 rt[4], lt[4], rt2[4], lt2[4]; -extern s8 joyx[4], joyy[4]; -extern s8 joyrx[4], joyry[4]; -extern s8 joy3x[4], joy3y[4]; +extern u16 rt[4], lt[4], rt2[4], lt2[4]; +extern s16 joyx[4], joyy[4]; +extern s16 joyrx[4], joyry[4]; +extern s16 joy3x[4], joy3y[4]; diff --git a/core/input/haptic.h b/core/input/haptic.h new file mode 100644 index 000000000..230728567 --- /dev/null +++ b/core/input/haptic.h @@ -0,0 +1,55 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#include "build.h" + +#ifdef USE_SDL +void sdl_setTorque(int, float); +void sdl_setDamper(int, float, float); +void sdl_setSpring(int, float, float); +void sdl_stopHaptic(int); +#endif + +namespace haptic { + +inline static void setTorque(int port, float v) { +#ifdef USE_SDL + sdl_setTorque(port, v); +#endif +} + +inline static void setDamper(int port, float param, float speed) { +#ifdef USE_SDL + sdl_setDamper(port, param, speed); +#endif +} + +inline static void setSpring(int port, float saturation, float speed) { +#ifdef USE_SDL + sdl_setSpring(port, saturation, speed); +#endif +} + +inline static void stopAll(int port) { +#ifdef USE_SDL + sdl_stopHaptic(port); +#endif +} + +} diff --git a/core/input/keyboard_device.h b/core/input/keyboard_device.h index dc2f10fab..83aa757ec 100644 --- a/core/input/keyboard_device.h +++ b/core/input/keyboard_device.h @@ -20,7 +20,8 @@ #include "types.h" #include "cfg/option.h" #include "gamepad_device.h" -#include "rend/gui.h" +#include "ui/gui.h" +#include "hw/maple/maple_devs.h" #include extern u8 kb_key[4][6]; // normal keys pressed @@ -61,6 +62,7 @@ class KeyboardInputMapping : public InputMapping set_button(DC_AXIS_LEFT, 13); // J set_button(DC_AXIS_RIGHT, 15); // L set_button(DC_BTN_D, 4); // Q (Coin) + set_button(EMU_BTN_SCREENSHOT, 69); // F12 dirty = false; } @@ -80,6 +82,27 @@ class KeyboardDevice : public GamepadDevice void input(u8 keycode, bool pressed, int modifier_keys) { + const int port = maple_port(); + const bool portIsValid = port >= 0 && port < MAPLE_PORTS; + + // Checking if we're in-game with an emulated keyboard first, + // then check if the "Bypass Emulated Keyboard" hotkey is held and we're not in GUI, + // if so: send emu hotkeys only and return earlier. + if ((settings.platform.isConsole() && portIsValid && config::MapleMainDevices[port] == MDT_Keyboard) + || (settings.platform.isArcade() && settings.input.keyboardGame)) + { + if (keycode == input_mapper->get_button_code(0, EMU_BTN_BYPASS_KB)) + bypass_kb = pressed && !gui_keyboard_captured(); + + if (bypass_kb) + { + set_maple_port(-1); + gamepad_btn_input(keycode, pressed); + set_maple_port(port); + return; + } + } + // Some OSes (Mac OS) don't distinguish left and right modifier keys so we set them both. // But not for Alt since Right Alt is used as a special modifier keys on some international // keyboards. @@ -105,14 +128,13 @@ class KeyboardDevice : public GamepadDevice default: break; } - const int port = maple_port(); - if (port >= 0 && port < (int)std::size(kb_shift)) + if (portIsValid) kb_shift[port] = _modifier_keys; if (keycode != 0) { gui_keyboard_key(keycode, pressed); - if (keycode < 0xE0 && port >= 0 && port < (int)std::size(kb_key)) + if (keycode < 0xE0 && portIsValid) { if (pressed) { @@ -156,9 +178,8 @@ class KeyboardDevice : public GamepadDevice // or the corresponding maple device (if any) isn't a keyboard else if (gui_is_open() || port == (int)std::size(kb_key) - || (settings.platform.isConsole() && config::MapleMainDevices[port] != MDT_Keyboard) - || (settings.platform.isNaomi() && settings.input.JammaSetup != JVS::Keyboard) - || settings.platform.isAtomiswave()) + || (settings.platform.isConsole() && (!portIsValid || config::MapleMainDevices[port] != MDT_Keyboard)) + || (settings.platform.isArcade() && !settings.input.keyboardGame)) gamepad_btn_input(keycode, pressed); } @@ -471,4 +492,5 @@ class KeyboardDevice : public GamepadDevice int _modifier_keys = 0; u32 _kb_used = 0; + bool bypass_kb = false; }; diff --git a/core/input/mapping.cpp b/core/input/mapping.cpp index 0f4df76e9..fdea33989 100644 --- a/core/input/mapping.cpp +++ b/core/input/mapping.cpp @@ -60,6 +60,8 @@ button_list[] = { DC_BTN_INSERT_CARD, "emulator", "insert_card" }, { EMU_BTN_LOADSTATE, "emulator", "btn_jump_state" }, { EMU_BTN_SAVESTATE, "emulator", "btn_quick_save" }, + { EMU_BTN_BYPASS_KB, "emulator", "btn_bypass_kb" }, + { EMU_BTN_SCREENSHOT, "emulator", "btn_screenshot" }, }; static struct @@ -196,6 +198,8 @@ void InputMapping::load(FILE* fp) dz = std::min(dz, 100); dz = std::max(dz, 0); this->dead_zone = (float)dz / 100.f; + int sat = std::clamp(mf.get_int("emulator", "saturation", 100), 50, 200); + this->saturation = (float)sat / 100.f; this->rumblePower = mf.get_int("emulator", "rumble_power", this->rumblePower); version = mf.get_int("emulator", "version", 1); @@ -428,6 +432,7 @@ bool InputMapping::save(const std::string& name) mf.set("emulator", "mapping_name", this->name); mf.set_int("emulator", "dead_zone", (int)std::round(this->dead_zone * 100.f)); + mf.set_int("emulator", "saturation", (int)std::round(this->saturation * 100.f)); mf.set_int("emulator", "rumble_power", this->rumblePower); mf.set_int("emulator", "version", 3); diff --git a/core/input/mapping.h b/core/input/mapping.h index 9e3d2530e..8adac51af 100644 --- a/core/input/mapping.h +++ b/core/input/mapping.h @@ -35,6 +35,8 @@ class InputMapping InputMapping(const InputMapping& other) { name = other.name; dead_zone = other.dead_zone; + saturation = other.saturation; + rumblePower = other.rumblePower; for (int port = 0; port < 4; port++) { buttons[port] = other.buttons[port]; @@ -44,6 +46,7 @@ class InputMapping std::string name; float dead_zone = 0.1f; + float saturation = 1.0f; int rumblePower = 100; int version = 3; diff --git a/core/input/mouse.cpp b/core/input/mouse.cpp index 6e171e512..7efdf933f 100644 --- a/core/input/mouse.cpp +++ b/core/input/mouse.cpp @@ -18,7 +18,7 @@ */ #include "mouse.h" #include "cfg/option.h" -#include "rend/gui.h" +#include "ui/gui.h" // Mouse buttons // bit 0: Button C diff --git a/core/input/mouse.h b/core/input/mouse.h index d17f8dcf1..f5f238815 100644 --- a/core/input/mouse.h +++ b/core/input/mouse.h @@ -104,3 +104,15 @@ class SystemMouse : public Mouse void setButton(Button button, bool pressed); void setWheel(int delta); }; + +class TouchMouse : public SystemMouse +{ +public: + TouchMouse() : SystemMouse("Flycast", -1) + { + _name = "Touch Mouse"; + _unique_id = "touch_mouse"; + loadMapping(); + } +}; + diff --git a/core/input/virtual_gamepad.h b/core/input/virtual_gamepad.h new file mode 100644 index 000000000..69adc2828 --- /dev/null +++ b/core/input/virtual_gamepad.h @@ -0,0 +1,117 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#include "gamepad_device.h" +#include "ui/vgamepad.h" + +class VirtualGamepad : public GamepadDevice +{ +public: + VirtualGamepad(const char *api_name, int maple_port = 0) + : GamepadDevice(maple_port, api_name, false) + { + _name = "Virtual Gamepad"; + _unique_id = "virtual_gamepad_uid"; + input_mapper = std::make_shared(); + // hasAnalogStick = true; // TODO has an analog stick but input mapping isn't persisted + + leftTrigger = DC_AXIS_LT; + rightTrigger = DC_AXIS_RT; + } + + bool is_virtual_gamepad() override { + return true; + }; + + // normalized coordinates [-1, 1] + void joystickInput(float x, float y) + { + vgamepad::setAnalogStick(x, y); + int joyx = std::round(x * 32767.f); + int joyy = std::round(y * 32767.f); + if (joyx >= 0) + gamepad_axis_input(DC_AXIS_RIGHT, joyx); + else + gamepad_axis_input(DC_AXIS_LEFT, -joyx); + if (joyy >= 0) + gamepad_axis_input(DC_AXIS_DOWN, joyy); + else + gamepad_axis_input(DC_AXIS_UP, -joyy); + } + + void releaseAll() + { + for (int i = 0; i < 32; i++) + if (buttonState & (1 << i)) + gamepad_btn_input(1 << i, false); + buttonState = 0; + joystickInput(0, 0); + gamepad_axis_input(DC_AXIS_LT, 0); + gamepad_axis_input(DC_AXIS_RT, 0); + if (previousFastForward) + gamepad_btn_input(EMU_BTN_FFORWARD, false); + previousFastForward = false; + } + + virtual bool handleButtonInput(u32& state, u32 key, bool pressed) { + // can be overridden in derived classes to handle specific key combos + // (iOS up+down or left+right) + return false; + } + + void buttonInput(vgamepad::ControlId controlId, bool pressed) + { + u32 kcode = vgamepad::controlToDcKey(controlId); + if (kcode == 0) + return; + if (handleButtonInput(buttonState, kcode, pressed)) + return; + if (kcode == DC_AXIS_LT) { + gamepad_axis_input(DC_AXIS_LT, pressed ? 0x7fff : 0); + } + else if (kcode == DC_AXIS_RT) { + gamepad_axis_input(DC_AXIS_RT, pressed ? 0x7fff : 0); + } + else if (kcode == EMU_BTN_SRVMODE) { + if (pressed) + vgamepad::toggleServiceMode(); + } + else + { + if (pressed) + buttonState |= kcode; + else + buttonState &= ~kcode; + if ((kcode & (DC_DPAD_LEFT | DC_DPAD_RIGHT)) != 0 + && (kcode & (DC_DPAD_UP | DC_DPAD_DOWN)) != 0) + { + // diagonals + gamepad_btn_input(kcode & (DC_DPAD_LEFT | DC_DPAD_RIGHT), pressed); + gamepad_btn_input(kcode & (DC_DPAD_UP | DC_DPAD_DOWN), pressed); + } + else { + gamepad_btn_input(kcode, pressed); + } + } + } + +private: + u32 buttonState = 0; + bool previousFastForward = false; +}; diff --git a/core/linux-dist/dispmanx.cpp b/core/linux-dist/dispmanx.cpp deleted file mode 100644 index adafdf984..000000000 --- a/core/linux-dist/dispmanx.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#if defined(SUPPORT_DISPMANX) -#include "dispmanx.h" -#include "types.h" -#include "wsi/context.h" -#include "cfg/option.h" - -#include -#include - -void dispmanx_window_create() -{ - DISPMANX_DISPLAY_HANDLE_T dispman_display; - DISPMANX_UPDATE_HANDLE_T dispman_update; - DISPMANX_ELEMENT_HANDLE_T dispman_element; - VC_RECT_T src_rect; - VC_RECT_T dst_rect; - VC_DISPMANX_ALPHA_T dispman_alpha; - uint32_t screen_width; - uint32_t screen_height; - uint32_t window_width; - uint32_t window_height; - - dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS; - dispman_alpha.opacity = 0xFF; - dispman_alpha.mask = 0; - - graphics_get_display_size(0 /* LCD */, &screen_width, &screen_height); - - window_width = cfgLoadInt("window", "width", 0); - window_height = cfgLoadInt("window", "height", 0); - - if(window_width < 1) - window_width = screen_width; - if(window_height < 1) - window_height = screen_height; - - src_rect.x = 0; - src_rect.y = 0; - src_rect.width = window_width << 16; - src_rect.height = window_height << 16; - - if (config::DispmanxMaintainAspect) - { - float screen_aspect = (float)screen_width / screen_height; - float window_aspect = (float)window_width / window_height; - if(screen_aspect > window_aspect) - { - dst_rect.width = window_width * screen_height / window_height; - dst_rect.height = screen_height; - } - else - { - dst_rect.width = screen_width; - dst_rect.height = window_height * screen_width / window_width; - } - dst_rect.x = (screen_width - dst_rect.width) / 2; - dst_rect.y = (screen_height - dst_rect.height) / 2; - } - else - { - dst_rect.x = 0; - dst_rect.y = 0; - dst_rect.width = screen_width; - dst_rect.height = screen_height; - } - - dispman_display = vc_dispmanx_display_open( 0 /* LCD */); - dispman_update = vc_dispmanx_update_start( 0 ); - dispman_element = vc_dispmanx_element_add(dispman_update, dispman_display, - 0 /*layer*/, &dst_rect, 0 /*src*/, - &src_rect, DISPMANX_PROTECTION_NONE, - &dispman_alpha /*alpha*/, 0 /*clamp*/, (DISPMANX_TRANSFORM_T)0 /*transform*/); - - static EGL_DISPMANX_WINDOW_T native_window; - native_window.element = dispman_element; - native_window.width = window_width; - native_window.height = window_height; - vc_dispmanx_update_submit_sync( dispman_update ); - - initRenderApi(&native_window, (void *)dispman_display); -} -#endif diff --git a/core/linux-dist/dispmanx.h b/core/linux-dist/dispmanx.h deleted file mode 100644 index db95adfa8..000000000 --- a/core/linux-dist/dispmanx.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -extern void dispmanx_window_create(); diff --git a/core/linux-dist/evdev.cpp b/core/linux-dist/evdev.cpp index c63fb54bc..09d8095a6 100644 --- a/core/linux-dist/evdev.cpp +++ b/core/linux-dist/evdev.cpp @@ -7,6 +7,7 @@ #include #ifdef USE_UDEV +#include #include #endif diff --git a/core/linux-dist/evdev_gamepad.h b/core/linux-dist/evdev_gamepad.h index ae40832e8..aae93e552 100644 --- a/core/linux-dist/evdev_gamepad.h +++ b/core/linux-dist/evdev_gamepad.h @@ -1,6 +1,7 @@ +#pragma once #include "evdev.h" #include "input/gamepad_device.h" -#include "oslib/oslib.h" +#include "stdclass.h" #include #include @@ -65,6 +66,7 @@ class EvdevGamepadDevice : public GamepadDevice } else INFO_LOG(INPUT, "using custom mapping '%s'", input_mapper->name.c_str()); + hasAnalogStick = true; } ~EvdevGamepadDevice() override { @@ -79,7 +81,7 @@ class EvdevGamepadDevice : public GamepadDevice void rumble(float power, float inclination, u32 duration_ms) override { vib_inclination = inclination * power; - vib_stop_time = os_GetSeconds() + duration_ms / 1000.0; + vib_stop_time = getTimeMs() + duration_ms; do_rumble(power, duration_ms); } @@ -87,7 +89,7 @@ class EvdevGamepadDevice : public GamepadDevice { if (vib_inclination > 0) { - int rem_time = (vib_stop_time - os_GetSeconds()) * 1000; + int rem_time = vib_stop_time - getTimeMs(); if (rem_time <= 0) vib_inclination = 0; else @@ -306,7 +308,7 @@ class EvdevGamepadDevice : public GamepadDevice std::string _devnode; int _rumble_effect_id = -1; float vib_inclination = 0; - double vib_stop_time = 0; + u64 vib_stop_time = 0; std::map axis_min_values; std::map axis_ranges; static std::map> evdev_gamepads; diff --git a/core/linux-dist/main.cpp b/core/linux-dist/main.cpp index e970f880a..83a18bc76 100644 --- a/core/linux-dist/main.cpp +++ b/core/linux-dist/main.cpp @@ -3,10 +3,10 @@ #endif #include "types.h" -#if defined(__unix__) || defined(__SWITCH__) +#if defined(__unix__) #include "log/LogManager.h" #include "emulator.h" -#include "rend/mainui.h" +#include "ui/mainui.h" #include "oslib/directory.h" #include "oslib/oslib.h" #include "stdclass.h" @@ -16,14 +16,6 @@ #include #include -#if defined(__SWITCH__) -#include "nswitch.h" -#endif - -#if defined(SUPPORT_DISPMANX) - #include "dispmanx.h" -#endif - #if defined(SUPPORT_X11) #include "x11.h" #endif @@ -32,50 +24,10 @@ #include "sdl/sdl.h" #endif -#if defined(USE_EVDEV) - #include "evdev.h" -#endif - #ifdef USE_BREAKPAD #include "breakpad/client/linux/handler/exception_handler.h" #endif -void os_SetupInput() -{ -#if defined(USE_EVDEV) - input_evdev_init(); -#endif - -#if defined(SUPPORT_X11) - input_x11_init(); -#endif - -#if defined(USE_SDL) - input_sdl_init(); -#endif -} - -void os_TermInput() -{ -#if defined(USE_EVDEV) - input_evdev_close(); -#endif -#if defined(USE_SDL) - input_sdl_quit(); -#endif -} - -void UpdateInputState() -{ - #if defined(USE_EVDEV) - input_evdev_handle(); - #endif - - #if defined(USE_SDL) - input_sdl_handle(); - #endif -} - void os_DoEvents() { #if defined(SUPPORT_X11) @@ -84,39 +36,12 @@ void os_DoEvents() #endif } -void os_SetWindowText(const char * text) -{ - #if defined(SUPPORT_X11) - x11_window_set_text(text); - #endif - #if defined(USE_SDL) - sdl_window_set_text(text); - #endif -} - -void os_CreateWindow() -{ - #if defined(SUPPORT_DISPMANX) - dispmanx_window_create(); - #endif - #if defined(SUPPORT_X11) - x11_window_create(); - #endif - #if defined(USE_SDL) - sdl_window_create(); - #endif -} - void common_linux_setup(); // Find the user config directory. // $HOME/.config/flycast on linux -std::string find_user_config_dir() +static std::string find_user_config_dir() { -#ifdef __SWITCH__ - flycast::mkdir("/flycast", 0755); - return "/flycast/"; -#else std::string xdg_home; if (nowide::getenv("XDG_CONFIG_HOME") != nullptr) // If XDG_CONFIG_HOME is set explicitly, we'll use that instead of $HOME/.config @@ -140,17 +65,12 @@ std::string find_user_config_dir() } // Unable to detect config dir, use the current folder return "."; -#endif } // Find the user data directory. // $HOME/.local/share/flycast on linux -std::string find_user_data_dir() +static std::string find_user_data_dir() { -#ifdef __SWITCH__ - flycast::mkdir("/flycast/data", 0755); - return "/flycast/data/"; -#else std::string xdg_home; if (nowide::getenv("XDG_DATA_HOME") != nullptr) // If XDG_DATA_HOME is set explicitly, we'll use that instead of $HOME/.local/share @@ -174,10 +94,8 @@ std::string find_user_data_dir() } // Unable to detect data dir, use the current folder return "."; -#endif } -#ifndef __SWITCH__ static void addDirectoriesFromPath(std::vector& dirs, const std::string& path, const std::string& suffix) { std::string::size_type pos = 0; @@ -193,7 +111,6 @@ static void addDirectoriesFromPath(std::vector& dirs, const std::st if (pos < path.length()) dirs.push_back(path.substr(pos) + suffix); } -#endif // Find a file in the user and system config directories. // The following folders are checked in this order: @@ -204,13 +121,10 @@ static void addDirectoriesFromPath(std::vector& dirs, const std::st // /etc/flycast/ // /etc/xdg/flycast/ // . -std::vector find_system_config_dirs() +static std::vector find_system_config_dirs() { std::vector dirs; -#ifdef __SWITCH__ - dirs.push_back("/flycast/"); -#else std::string xdg_home; if (nowide::getenv("XDG_CONFIG_HOME") != nullptr) // If XDG_CONFIG_HOME is set explicitly, we'll use that instead of $HOME/.config @@ -235,7 +149,6 @@ std::vector find_system_config_dirs() dirs.push_back("/etc/flycast/"); // This isn't part of the XDG spec, but much more common than /etc/xdg/ dirs.push_back("/etc/xdg/flycast/"); } -#endif dirs.push_back("./"); return dirs; @@ -252,13 +165,10 @@ std::vector find_system_config_dirs() // <$FLYCAST_BIOS_PATH> // ./ // ./data -std::vector find_system_data_dirs() +static std::vector find_system_data_dirs() { std::vector dirs; -#ifdef __SWITCH__ - dirs.push_back("/flycast/data/"); -#else std::string xdg_home; if (nowide::getenv("XDG_DATA_HOME") != nullptr) // If XDG_DATA_HOME is set explicitly, we'll use that instead of $HOME/.local/share @@ -288,7 +198,6 @@ std::vector find_system_data_dirs() std::string path = (std::string)nowide::getenv("FLYCAST_BIOS_PATH"); addDirectoriesFromPath(dirs, path, "/"); } -#endif dirs.push_back("./"); dirs.push_back("data/"); @@ -323,11 +232,6 @@ static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, int main(int argc, char* argv[]) { selfPath = argv[0]; -#if defined(__SWITCH__) - socketInitializeDefault(); - nxlinkStdio(); - //appletSetFocusHandlingMode(AppletFocusHandlingMode_NoSuspend); -#endif #if defined(USE_BREAKPAD) google_breakpad::MinidumpDescriptor descriptor("/tmp"); google_breakpad::ExceptionHandler eh(descriptor, nullptr, dumpCallback, nullptr, true, -1); @@ -353,9 +257,7 @@ int main(int argc, char* argv[]) } #endif -#if defined(__unix__) common_linux_setup(); -#endif if (flycast_init(argc, argv)) die("Flycast initialization failed\n"); @@ -366,29 +268,16 @@ int main(int argc, char* argv[]) mainui_loop(); -#if defined(SUPPORT_X11) - x11_window_destroy(); -#endif -#if defined(USE_SDL) - sdl_window_destroy(); -#endif - flycast_term(); os_UninstallFaultHandler(); -#if defined(__SWITCH__) - socketExit(); -#endif - return 0; } -#if defined(__unix__) [[noreturn]] void os_DebugBreak() { raise(SIGTRAP); std::abort(); } -#endif -#endif // __unix__ || __SWITCH__ +#endif // __unix__ diff --git a/core/linux-dist/x11.cpp b/core/linux-dist/x11.cpp index 49f317e2d..f7e3c329f 100644 --- a/core/linux-dist/x11.cpp +++ b/core/linux-dist/x11.cpp @@ -6,7 +6,7 @@ #include "types.h" #include "cfg/cfg.h" #include "x11.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "input/gamepad.h" #include "input/mouse.h" #include "icon.h" @@ -21,6 +21,8 @@ #define DEFAULT_WINDOW_WIDTH 640 #define DEFAULT_WINDOW_HEIGHT 480 +static void x11_window_set_text(const char *text); + static Window x11_win; Display *x11_disp; @@ -278,16 +280,8 @@ void x11_window_create() int depth = CopyFromParent; - XVisualInfo* x11Visual = nullptr; - Colormap x11Colormap = 0; -#if !defined(GLES) - - if (!theGLContext.ChooseVisual(x11_disp, &x11Visual, &depth)) - exit(1); - x11Colormap = XCreateColormap(x11_disp, RootWindow(x11_disp, x11Screen), x11Visual->visual, AllocNone); -#else int i32Depth = DefaultDepth(x11_disp, x11Screen); - x11Visual = new XVisualInfo; + XVisualInfo* x11Visual = new XVisualInfo; if (!XMatchVisualInfo(x11_disp, x11Screen, i32Depth, TrueColor, x11Visual)) { ERROR_LOG(RENDERER, "Error: Unable to acquire visual"); @@ -296,8 +290,8 @@ void x11_window_create() } // Gets the window parameters Window sRootWindow = RootWindow(x11_disp, x11Screen); - x11Colormap = XCreateColormap(x11_disp, sRootWindow, x11Visual->visual, AllocNone); -#endif + Colormap x11Colormap = XCreateColormap(x11_disp, sRootWindow, x11Visual->visual, AllocNone); + XSetWindowAttributes sWA; sWA.colormap = x11Colormap; @@ -326,11 +320,8 @@ void x11_window_create() // Creates the X11 window x11_win = XCreateWindow(x11_disp, RootWindow(x11_disp, x11Screen), 0, 0, x11_width, x11_height, 0, depth, InputOutput, x11Visual->visual, ui32Mask, &sWA); -#if !defined(GLES) - XFree(x11Visual); -#else + delete x11Visual; -#endif XSetWindowBackground(x11_disp, x11_win, 0); @@ -367,7 +358,7 @@ void x11_window_create() } } -void x11_window_set_text(const char* text) +static void x11_window_set_text(const char* text) { if (x11_win) { diff --git a/core/linux-dist/x11.h b/core/linux-dist/x11.h index 75c176531..7013db703 100644 --- a/core/linux-dist/x11.h +++ b/core/linux-dist/x11.h @@ -1,11 +1,10 @@ #pragma once -extern void input_x11_init(); -extern void event_x11_handle(); -extern void input_x11_handle(); -extern void x11_window_create(); -extern void x11_window_set_text(const char* text); -extern void x11_window_destroy(); +void input_x11_init(); +void event_x11_handle(); +void input_x11_handle(); +void x11_window_create(); +void x11_window_destroy(); // numbers const int KEY_1 = 10; diff --git a/core/linux/common.cpp b/core/linux/common.cpp index 2347a7935..c1f9d8b77 100644 --- a/core/linux/common.cpp +++ b/core/linux/common.cpp @@ -11,11 +11,10 @@ #if defined(__linux__) && !defined(__ANDROID__) #include #endif -#if !defined(TARGET_BSD) && !defined(__ANDROID__) && defined(TARGET_VIDEOCORE) - #include -#endif #include -#include "hw/sh4/dyna/blockmanager.h" +#ifdef __linux__ +#include +#endif #include "oslib/host_context.h" @@ -23,6 +22,7 @@ #include "rend/TexCache.h" #include "hw/mem/addrspace.h" #include "hw/mem/mem_watch.h" +#include "emulator.h" #ifdef __SWITCH__ #include @@ -30,8 +30,6 @@ extern "C" char __start__; #define siginfo_t switch_siginfo_t #endif // __SWITCH__ -#if !defined(TARGET_NO_EXCEPTIONS) - void context_from_segfault(host_context_t* hctx, void* segfault_ctx); void context_to_segfault(host_context_t* hctx, void* segfault_ctx); @@ -53,28 +51,28 @@ void fault_handler(int sn, siginfo_t * si, void *segfault_ctx) // texture protection in VRAM if (VramLockedWrite((u8*)si->si_addr)) return; +#if FEAT_SHREC == DYNAREC_JIT // FPCB jump table protection if (addrspace::bm_lockedWrite((u8*)si->si_addr)) return; -#if FEAT_SHREC == DYNAREC_JIT // fast mem access rewriting host_context_t ctx; context_from_segfault(&ctx, segfault_ctx); - bool dyna_cde = ((unat)CC_RX2RW(ctx.pc) >= (unat)CodeCache) && ((unat)CC_RX2RW(ctx.pc) < (unat)(CodeCache + CODE_SIZE + TEMP_CODE_SIZE)); - - if (dyna_cde && ngen_Rewrite(ctx, si->si_addr)) + if (sh4Dynarec->rewrite(ctx, si->si_addr)) { context_to_segfault(&ctx, segfault_ctx); return; } + + ERROR_LOG(COMMON, "SIGSEGV @ %p invalid access to %p", (void *)ctx.pc, si->si_addr); #endif - ERROR_LOG(COMMON, "SIGSEGV @ %p -> %p was not in vram, dynacode:%d", (void *)ctx.pc, si->si_addr, dyna_cde); + #ifdef __SWITCH__ MemoryInfo meminfo; u32 pageinfo; svcQueryMemory(&meminfo, &pageinfo, (u64)&__start__); - ERROR_LOG(COMMON, ".text base: %p", (void*)meminfo.addr); + ERROR_LOG(COMMON, ".text base: %p -> offset: %lx", (void*)meminfo.addr, ctx.pc - meminfo.addr); #else if (next_segv_handler.sa_sigaction != nullptr) next_segv_handler.sa_sigaction(sn, si, segfault_ctx); @@ -110,36 +108,22 @@ void os_UninstallFaultHandler() #endif } -#else // !defined(TARGET_NO_EXCEPTIONS) - -void os_InstallFaultHandler() -{ -} -void os_UninstallFaultHandler() -{ -} -#endif // !defined(TARGET_NO_EXCEPTIONS) - -double os_GetSeconds() -{ - timeval a; - gettimeofday (&a,0); - static u64 tvs_base=a.tv_sec; - return a.tv_sec-tvs_base+a.tv_usec/1000000.0; -} - -#if !defined(__unix__) && !defined(LIBRETRO) +#if !defined(__unix__) && !defined(LIBRETRO) && !defined(__SWITCH__) [[noreturn]] void os_DebugBreak() { __builtin_trap(); } #endif -void enable_runfast() +// RunFast mode is the combination of the following conditions: +// * the VFP11 coprocessor is in flush-to-zero mode +// * the VFP11 coprocessor is in default NaN mode +// * all exception enable bits are cleared. +static void enable_runfast() { - #if HOST_CPU==CPU_ARM && !defined(ARMCC) - static const unsigned int x = 0x04086060; - static const unsigned int y = 0x03000000; +#if HOST_CPU == CPU_ARM && !defined(ARMCC) + static const unsigned int x = 0x04086060; // reset and disable FP exceptions, flush-to-zero, default NaN mode + static const unsigned int y = 0x03000000; // round to zero int r; asm volatile ( "fmrx %0, fpscr \n\t" //r0 = FPSCR @@ -151,45 +135,58 @@ void enable_runfast() ); DEBUG_LOG(BOOT, "ARM VFP-Run Fast (NFP) enabled !"); - #endif +#endif } -void linux_fix_personality() { -#if defined(__linux__) && !defined(__ANDROID__) +// Some old CPUs lack the NX (no exec) flag so READ_IMPLIES_EXEC is set by default on these platforms. +// However resetting the flag isn't going to magically change the way the CPU works. So I wonder how useful this is. +// It's not needed on modern 64-bit architectures anyway. +static void linux_fix_personality() +{ +#if defined(__linux__) && !defined(__ANDROID__) && (HOST_CPU == CPU_X86 || HOST_CPU == CPU_ARM) DEBUG_LOG(BOOT, "Personality: %08X", personality(0xFFFFFFFF)); personality(~READ_IMPLIES_EXEC & personality(0xFFFFFFFF)); DEBUG_LOG(BOOT, "Updated personality: %08X", personality(0xFFFFFFFF)); #endif } -void linux_rpi2_init() { -#if !defined(TARGET_BSD) && !defined(__ANDROID__) && defined(TARGET_VIDEOCORE) - void* handle; - void (*rpi_bcm_init)(void); - - handle = dlopen("libbcm_host.so", RTLD_LAZY); - - if (handle) { - DEBUG_LOG(BOOT, "found libbcm_host"); - *(void**) (&rpi_bcm_init) = dlsym(handle, "bcm_host_init"); - if (rpi_bcm_init) { - DEBUG_LOG(BOOT, "rpi2: bcm_init"); - rpi_bcm_init(); - } - } -#endif +#if defined(__unix__) && !defined(LIBRETRO) && !defined(__ANDROID__) +static void sigintHandler(int) +{ + dc_exit(); } +#endif void common_linux_setup() { linux_fix_personality(); - linux_rpi2_init(); enable_runfast(); os_InstallFaultHandler(); - signal(SIGINT, exit); +#if defined(__unix__) && !defined(LIBRETRO) && !defined(__ANDROID__) + // exit cleanly on ^C + signal(SIGINT, sigintHandler); +#endif DEBUG_LOG(BOOT, "Linux paging: %ld %08X %08X", sysconf(_SC_PAGESIZE), PAGE_SIZE, PAGE_MASK); verify(PAGE_MASK==(sysconf(_SC_PAGESIZE)-1)); } + +#ifndef __APPLE__ + +void os_SetThreadName(const char *name) +{ +#ifdef __linux__ + if (strlen(name) > 16) + { + static char tmp[17]; + strncpy(tmp, name, 16); + name = tmp; + } + pthread_setname_np(pthread_self(), name); #endif +} + +#endif + +#endif // __unix__ or __APPLE__ or __SWITCH__ diff --git a/core/linux/context.cpp b/core/linux/context.cpp index 2d5bd6230..7ab2d8e90 100644 --- a/core/linux/context.cpp +++ b/core/linux/context.cpp @@ -8,7 +8,7 @@ #define __USE_GNU 1 #endif - #if !defined(TARGET_NO_EXCEPTIONS) && !defined(__OpenBSD__) + #if !defined(__OpenBSD__) #include #endif @@ -39,7 +39,6 @@ static void bicopy(Tctx& ctx, Tseg& seg) template static void context_segfault(host_context_t* hostctx, void* segfault_ctx) { -#if !defined(TARGET_NO_EXCEPTIONS) #if HOST_CPU == CPU_ARM #if defined(__FreeBSD__) bicopy(hostctx->pc, MCTX(.__gregs[_REG_PC])); @@ -65,6 +64,15 @@ static void context_segfault(host_context_t* hostctx, void* segfault_ctx) #if defined(__APPLE__) bicopy(hostctx->pc, MCTX(->__ss.__pc)); bicopy(hostctx->x0, MCTX(->__ss.__x[0])); + #elif defined(__FreeBSD__) + bicopy(hostctx->pc, MCTX(.mc_gpregs.gp_elr)); + bicopy(hostctx->x0, MCTX(.mc_gpregs.gp_x[0])); + #elif defined(__NetBSD__) + bicopy(hostctx->pc, MCTX(.__gregs[_REG_ELR])); + bicopy(hostctx->x0, MCTX(.__gregs[_REG_X0])); + #elif defined(__OpenBSD__) + bicopy(hostctx->pc, MCTX(->sc_elr)); + bicopy(hostctx->x0, MCTX(->sc_x[0])); #else bicopy(hostctx->pc, MCTX(.pc)); bicopy(hostctx->x0, MCTX(.regs[0])); @@ -91,6 +99,9 @@ static void context_segfault(host_context_t* hostctx, void* segfault_ctx) #elif HOST_CPU == CPU_X64 #if defined(__FreeBSD__) || defined(__DragonFly__) bicopy(hostctx->pc, MCTX(.mc_rip)); + bicopy(hostctx->rsp, MCTX(.mc_rsp)); + bicopy(hostctx->r9, MCTX(.mc_r9)); + bicopy(hostctx->rdi, MCTX(.mc_rdi)); #elif defined(__OpenBSD__) bicopy(hostctx->pc, MCTX(->sc_rip)); bicopy(hostctx->rsp, MCTX(->sc_rsp)); @@ -114,15 +125,9 @@ static void context_segfault(host_context_t* hostctx, void* segfault_ctx) #else #error "Unsupported OS" #endif -#elif HOST_CPU == CPU_MIPS - bicopy(hostctx->pc, MCTX(.pc)); -#elif HOST_CPU == CPU_GENERIC - //nothing! #else #error Unsupported HOST_CPU #endif - #endif - } void context_from_segfault(host_context_t* hostctx, void* segfault_ctx) { diff --git a/core/linux/libnx_vmem.cpp b/core/linux/libnx_vmem.cpp deleted file mode 100644 index fd4af9893..000000000 --- a/core/linux/libnx_vmem.cpp +++ /dev/null @@ -1,338 +0,0 @@ -#if defined(__SWITCH__) -#include "hw/sh4/sh4_if.h" -#include "hw/mem/addrspace.h" -#include "oslib/virtmem.h" - -#include -#include - -namespace virtmem -{ - -#define siginfo_t switch_siginfo_t - -using mem_handle_t = uintptr_t; -static mem_handle_t vmem_fd = -1; -//static mem_handle_t vmem_fd_page = -1; -static mem_handle_t vmem_fd_codememory = -1; - -static void *reserved_base; -static size_t reserved_size; -static VirtmemReservation *virtmemReservation; - -bool region_lock(void *start, size_t len) -{ - size_t inpage = (uintptr_t)start & PAGE_MASK; - len += inpage; - size_t inlen = len & PAGE_MASK; - if (inlen) - len = (len + PAGE_SIZE) & ~(PAGE_SIZE-1); - - Result rc; - uintptr_t start_addr = (uintptr_t)start - inpage; - for (uintptr_t addr = start_addr; addr < (start_addr + len); addr += PAGE_SIZE) - { - rc = svcSetMemoryPermission((void*)addr, PAGE_SIZE, Perm_R); - if (R_FAILED(rc)) - WARN_LOG(VMEM, "Failed to SetPerm Perm_R on %p len 0x%x rc 0x%x", (void*)addr, PAGE_SIZE, rc); - } - - return true; -} - -bool region_unlock(void *start, size_t len) -{ - size_t inpage = (uintptr_t)start & PAGE_MASK; - len += inpage; - size_t inlen = len & PAGE_MASK; - if (inlen) - len = (len + PAGE_SIZE) & ~(PAGE_SIZE-1); - - Result rc; - uintptr_t start_addr = (uintptr_t)start - inpage; - for (uintptr_t addr = start_addr; addr < (start_addr + len); addr += PAGE_SIZE) - { - rc = svcSetMemoryPermission((void*)addr, PAGE_SIZE, Perm_Rw); - if (R_FAILED(rc)) - WARN_LOG(VMEM, "Failed to SetPerm Perm_Rw on %p len 0x%x rc 0x%x", (void*)addr, PAGE_SIZE, rc); - } - - return true; -} - -/* -static bool region_set_exec(void *start, size_t len) -{ - size_t inpage = (uintptr_t)start & PAGE_MASK; - - svcSetMemoryPermission((void*)((uintptr_t)start - inpage), len + inpage, Perm_R); // *shrugs* - - return true; -} - -static void *region_reserve(void *start, size_t len) -{ - virtmemLock(); - void *p = virtmemFindAslr(len, 0); - if (p != nullptr) - virtmemReservation = virtmemAddReservation(p, len); - virtmemUnlock(); - return p; -} -*/ - -static bool region_release(void *start, size_t len) -{ - if (virtmemReservation != nullptr) - { - virtmemLock(); - virtmemRemoveReservation(virtmemReservation); - virtmemUnlock(); - virtmemReservation = nullptr; - } - return true; -} - -static void *region_map_file(void *file_handle, void *dest, size_t len, size_t offset, bool readwrite) -{ - Result rc = svcMapProcessMemory(dest, envGetOwnProcessHandle(), (u64)(vmem_fd_codememory + offset), len); - if (R_FAILED(rc)) - WARN_LOG(VMEM, "Fatal error creating the view... base: %p offset: 0x%zx size: 0x%zx src: %p err: 0x%x", - (void*)vmem_fd, offset, len, (void*)(vmem_fd_codememory + offset), rc); - else - INFO_LOG(VMEM, "Created the view... base: %p offset: 0x%zx size: 0x%zx src: %p err: 0x%x", - (void*)vmem_fd, offset, len, (void*)(vmem_fd_codememory + offset), rc); - - return dest; -} - -static bool region_unmap_file(void *start, size_t len) -{ - return region_release(start, len); -} - -/* -// Allocates memory via a fd on shmem/ahmem or even a file on disk -static mem_handle_t allocate_shared_filemem(unsigned size) -{ - void* mem = memalign(0x1000, size); - return (uintptr_t)mem; -} -*/ - -// Implement vmem initialization for RAM, ARAM, VRAM and SH4 context, fpcb etc. - -// vmem_base_addr points to an address space of 512MB that can be used for fast memory ops. -// In negative offsets of the pointer (up to FPCB size, usually 65/129MB) the context and jump table -// can be found. If the platform init returns error, the user is responsible for initializing the -// memory using a fallback (that is, regular mallocs and falling back to slow memory JIT). -bool init(void **vmem_base_addr, void **sh4rcb_addr, size_t ramSize) -{ - return false; -#if 0 - const unsigned size_aligned = ((RAM_SIZE_MAX + VRAM_SIZE_MAX + ARAM_SIZE_MAX + PAGE_SIZE) & (~(PAGE_SIZE-1))); - vmem_fd_page = allocate_shared_filemem(size_aligned); - if (vmem_fd_page < 0) - return false; - - vmem_fd_codememory = (uintptr_t)virtmemReserve(size_aligned); - - if (R_FAILED(svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64) vmem_fd_codememory, (u64) vmem_fd_page, size_aligned))) - WARN_LOG(VMEM, "Failed to Map memory (platform_int)..."); - - if (R_FAILED(svcSetProcessMemoryPermission(envGetOwnProcessHandle(), vmem_fd_codememory, size_aligned, Perm_Rx))) - WARN_LOG(VMEM, "Failed to set perms (platform_int)..."); - - // Now try to allocate a contiguous piece of memory. - if (reserved_base == NULL) - { - reserved_size = 512*1024*1024 + sizeof(Sh4RCB) + ARAM_SIZE_MAX + 0x10000; - reserved_base = region_reserve(NULL, reserved_size); - if (!reserved_base) - return false; - } - - *sh4rcb_addr = reserved_base; - *vmem_base_addr = (char *)reserved_base + sizeof(Sh4RCB); - const size_t fpcb_size = sizeof(((Sh4RCB *)NULL)->fpcb); - void *sh4rcb_base_ptr = (char *)reserved_base + fpcb_size; - - // Now map the memory for the SH4 context, do not include FPCB on purpose (paged on demand). - region_unlock(sh4rcb_base_ptr, sizeof(Sh4RCB) - fpcb_size); - - return true; -#endif -} - -// Just tries to wipe as much as possible in the relevant area. -void destroy() -{ - if (reserved_base != NULL) - region_release(reserved_base, reserved_size); -} - -// Resets a chunk of memory by deleting its data and setting its protection back. -void reset_mem(void *ptr, unsigned size_bytes) { - svcSetMemoryPermission(ptr, size_bytes, Perm_None); -} - -// Allocates a bunch of memory (page aligned and page-sized) -void ondemand_page(void *address, unsigned size_bytes) { - bool rc = region_unlock(address, size_bytes); - verify(rc); -} - -// Creates mappings to the underlying file including mirroring sections -void create_mappings(const Mapping *vmem_maps, unsigned nummaps) -{ - for (unsigned i = 0; i < nummaps; i++) { - // Ignore unmapped stuff, it is already reserved as PROT_NONE - if (!vmem_maps[i].memsize) - continue; - - // Calculate the number of mirrors - u64 address_range_size = vmem_maps[i].end_address - vmem_maps[i].start_address; - unsigned num_mirrors = (address_range_size) / vmem_maps[i].memsize; - verify((address_range_size % vmem_maps[i].memsize) == 0 && num_mirrors >= 1); - - for (unsigned j = 0; j < num_mirrors; j++) { - u64 offset = vmem_maps[i].start_address + j * vmem_maps[i].memsize; - bool rc = region_unmap_file(&addrspace::ram_base[offset], vmem_maps[i].memsize); - verify(rc); - void *p = region_map_file((void*)(uintptr_t)vmem_fd, &addrspace::ram_base[offset], - vmem_maps[i].memsize, vmem_maps[i].memoffset, vmem_maps[i].allow_writes); - verify(p != nullptr); - } - } -} - -// Prepares the code region for JIT operations, thus marking it as RWX -bool prepare_jit_block(void *code_area, size_t size, void **code_area_rwx) -{ - die("Not supported in libnx"); - - return false; -} - -void release_jit_block(void *code_area, size_t size) -{ - die("Not supported in libnx"); -} - -// Use two addr spaces: need to remap something twice, therefore use allocate_shared_filemem() -bool prepare_jit_block(void *code_area, size_t size, void **code_area_rw, ptrdiff_t *rx_offset) -{ - const size_t size_aligned = ((size + PAGE_SIZE) & (~(PAGE_SIZE-1))); - - virtmemLock(); - void* ptr_rw = virtmemFindAslr(size_aligned, 0); - bool failure = ptr_rw == nullptr - || R_FAILED(svcMapProcessMemory(ptr_rw, envGetOwnProcessHandle(), (u64)code_area, size_aligned)); - virtmemUnlock(); - if (failure) - { - WARN_LOG(DYNAREC, "Failed to map jit rw block..."); - return false; - } - - *code_area_rw = ptr_rw; - *rx_offset = (char*)code_area - (char*)ptr_rw; - INFO_LOG(DYNAREC, "Info: Using NO_RWX mode, rx ptr: %p, rw ptr: %p, offset: %ld\n", code_area, ptr_rw, (long)*rx_offset); - - return true; -} - -void release_jit_block(void *code_area1, void *code_area2, size_t size) -{ - const size_t size_aligned = ((size + PAGE_SIZE) & (~(PAGE_SIZE-1))); - virtmemLock(); - svcUnmapProcessMemory(code_area2, envGetOwnProcessHandle(), (u64)code_area1, size_aligned); - virtmemUnlock(); -} - -} // namespace virtmem - -#ifndef TARGET_NO_EXCEPTIONS - -#include -void fault_handler(int sn, siginfo_t * si, void *segfault_ctx); - -extern "C" -{ -alignas(16) u8 __nx_exception_stack[0x1000]; -u64 __nx_exception_stack_size = sizeof(__nx_exception_stack); - -void context_switch_aarch64(void* context); - -void __libnx_exception_handler(ThreadExceptionDump *ctx) -{ - mcontext_t m_ctx; - - m_ctx.pc = ctx->pc.x; - - for(int i=0; i<29; i++) - { - // printf("X%d: %p\n", i, ctx->cpu_gprs[i].x); - m_ctx.regs[i] = ctx->cpu_gprs[i].x; - } - - /* - printf("PC: %p\n", ctx->pc.x); - printf("FP: %p\n", ctx->fp.x); - printf("LR: %p\n", ctx->lr.x); - printf("SP: %p\n", ctx->sp.x); - */ - - ucontext_t u_ctx; - u_ctx.uc_mcontext = m_ctx; - - siginfo_t sig_info; - - sig_info.si_addr = (void*)ctx->far.x; - - fault_handler(0, &sig_info, (void*) &u_ctx); - - uint64_t handle[64] = { 0 }; - - uint64_t *ptr = (uint64_t*)handle; - ptr[0] = m_ctx.regs[0]; /* x0 0 */ - ptr[1] = m_ctx.regs[1]; /* x1 8 */ - ptr[2] = m_ctx.regs[2]; /* x2 16 */ - ptr[3] = m_ctx.regs[3]; /* x3 24 */ - ptr[4] = m_ctx.regs[4]; /* x4 32 */ - ptr[5] = m_ctx.regs[5]; /* x5 40 */ - ptr[6] = m_ctx.regs[6]; /* x6 48 */ - ptr[7] = m_ctx.regs[7]; /* x7 56 */ - /* Non-volatiles. */ - ptr[8] = m_ctx.regs[8]; /* x8 64 */ - ptr[9] = m_ctx.regs[9]; /* x9 72 */ - ptr[10] = m_ctx.regs[10]; /* x10 80 */ - ptr[11] = m_ctx.regs[11]; /* x11 88 */ - ptr[12] = m_ctx.regs[12]; /* x12 96 */ - ptr[13] = m_ctx.regs[13]; /* x13 104 */ - ptr[14] = m_ctx.regs[14]; /* x14 112 */ - ptr[15] = m_ctx.regs[15]; /* x15 120 */ - ptr[16] = m_ctx.regs[16]; /* x16 128 */ - ptr[17] = m_ctx.regs[17]; /* x17 136 */ - ptr[18] = m_ctx.regs[18]; /* x18 144 */ - ptr[19] = m_ctx.regs[19]; /* x19 152 */ - ptr[20] = m_ctx.regs[20]; /* x20 160 */ - ptr[21] = m_ctx.regs[21]; /* x21 168 */ - ptr[22] = m_ctx.regs[22]; /* x22 176 */ - ptr[23] = m_ctx.regs[23]; /* x23 184 */ - ptr[24] = m_ctx.regs[24]; /* x24 192 */ - ptr[25] = m_ctx.regs[25]; /* x25 200 */ - ptr[26] = m_ctx.regs[26]; /* x26 208 */ - ptr[27] = m_ctx.regs[27]; /* x27 216 */ - ptr[28] = m_ctx.regs[28]; /* x28 224 */ - /* Special regs */ - ptr[29] = ctx->fp.x; /* frame pointer 232 */ - ptr[30] = ctx->lr.x; /* link register 240 */ - ptr[31] = ctx->sp.x; /* stack pointer 248 */ - ptr[32] = (uintptr_t)ctx->pc.x; /* PC 256 */ - - context_switch_aarch64(ptr); -} -} -#endif // TARGET_NO_EXCEPTIONS -#endif // __SWITCH__ diff --git a/core/linux/posix_vmem.cpp b/core/linux/posix_vmem.cpp index bb3193219..46105157b 100644 --- a/core/linux/posix_vmem.cpp +++ b/core/linux/posix_vmem.cpp @@ -169,7 +169,7 @@ bool init(void **vmem_base_addr, void **sh4rcb_addr, size_t ramSize) return false; // Now try to allocate a contiguous piece of memory. - reserved_size = 512*1024*1024 + sizeof(Sh4RCB) + ARAM_SIZE_MAX + 0x10000; + reserved_size = 512_MB + sizeof(Sh4RCB) + ARAM_SIZE_MAX + 0x10000; reserved_base = mem_region_reserve(NULL, reserved_size); if (!reserved_base) { close(vmem_fd); diff --git a/core/linux/unwind_info.cpp b/core/linux/unwind_info.cpp index 8ba41f6d1..f328f7ec1 100644 --- a/core/linux/unwind_info.cpp +++ b/core/linux/unwind_info.cpp @@ -20,7 +20,7 @@ // Based on Asmjit unwind info registration and stack walking code for Windows, Linux and macOS // https://gist.github.com/dpjudas/925d5c4ffef90bd8114be3b465069fff #include "build.h" -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" extern "C" { diff --git a/core/log/LogManager.cpp b/core/log/LogManager.cpp index d86102ac4..dacaac706 100644 --- a/core/log/LogManager.cpp +++ b/core/log/LogManager.cpp @@ -175,10 +175,12 @@ LogManager::~LogManager() // in the form 00:00:000. static std::string GetTimeFormatted() { - double now = os_GetSeconds(); - u32 minutes = (u32)now / 60; - u32 seconds = (u32)now % 60; - u32 ms = (now - (u32)now) * 1000; + u64 now = getTimeMs(); + u32 ms = (u32)(now % 1000); + now /= 1000; + u32 seconds = (u32)(now % 60); + now /= 60; + u32 minutes = (u32)now; return StringFromFormat("%02d:%02d:%03d", minutes, seconds, ms); } diff --git a/core/log/StringUtil.h b/core/log/StringUtil.h index 15cd9a5f0..a9b1625eb 100644 --- a/core/log/StringUtil.h +++ b/core/log/StringUtil.h @@ -1,3 +1,4 @@ +#pragma once #include #ifdef _WIN32 diff --git a/core/lua/lua.cpp b/core/lua/lua.cpp index 7ddcd2b1b..e5512a043 100644 --- a/core/lua/lua.cpp +++ b/core/lua/lua.cpp @@ -21,7 +21,8 @@ #ifdef USE_LUA #include #include -#include "rend/gui.h" +#include "ui/gui.h" +#include "ui/gui_util.h" #include "hw/mem/addrspace.h" #include "cfg/option.h" #include "emulator.h" @@ -30,7 +31,7 @@ #include "hw/maple/maple_devs.h" #include "hw/maple/maple_if.h" #include "stdclass.h" -#include "imgui/imgui.h" +#include "imgui.h" namespace lua { @@ -43,7 +44,7 @@ using lock_guard = std::lock_guard; static void emuEventCallback(Event event, void *) { - if (L == nullptr) + if (L == nullptr || settings.raHardcoreMode) return; lock_guard lock(mutex); try { @@ -71,6 +72,12 @@ static void emuEventCallback(Event event, void *) case Event::VBlank: key = "vblank"; break; + case Event::Network: + key = "network"; + break; + case Event::DiskChange: + key = "diskChange"; + break; } if (v[key].isFunction()) v[key](); @@ -129,7 +136,6 @@ CONFIG_ACCESSORS(Cable); CONFIG_ACCESSORS(Region); CONFIG_ACCESSORS(Broadcast); CONFIG_ACCESSORS(Language); -CONFIG_ACCESSORS(ForceWindowsCE); CONFIG_ACCESSORS(AutoLoadState); CONFIG_ACCESSORS(AutoSaveState); CONFIG_ACCESSORS(SavestateSlot); @@ -223,6 +229,12 @@ static void setMapleType(int bus, int type, lua_State *L) case MDT_Mouse: case MDT_LightGun: case MDT_TwinStick: + case MDT_MaracasController: + case MDT_FishingController: + case MDT_PopnMusicController: + case MDT_RacingController: + case MDT_DenshaDeGoController: + case MDT_SegaControllerXL: case MDT_None: config::MapleMainDevices[bus - 1] = (MapleDeviceType)type; maple_ReconnectDevices(); @@ -364,7 +376,7 @@ static void beginWindow(const char *title, int x, int y, int w, int h) ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); ImGui::SetNextWindowPos(ImVec2(x, y)); - ImGui::SetNextWindowSize(ImVec2(w * settings.display.uiScale, h * settings.display.uiScale)); + ImGui::SetNextWindowSize(ScaledVec2(w, h)); ImGui::SetNextWindowBgAlpha(0.7f); ImGui::Begin(title, NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus); ImGui::PushStyleColor(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); @@ -390,7 +402,7 @@ static void uiTextRightAligned(const std::string& text) static void uiBargraph(float v) { - ImGui::ProgressBar(v, ImVec2(-1, 10.f * settings.display.uiScale), ""); + ImGui::ProgressBar(v, ImVec2(-1, uiScaled(10.f)), ""); } static int uiButton(lua_State *L) @@ -441,7 +453,7 @@ static void luaRegister(lua_State *L) gui_open_settings(); })) .addFunction("exit", dc_exit) - .addFunction("displayNotification", gui_display_notification) + .addFunction("displayNotification", os_notify) .endNamespace() .beginNamespace("config") @@ -505,7 +517,6 @@ static void luaRegister(lua_State *L) CONFIG_PROPERTY(UseReios, bool) CONFIG_PROPERTY(FastGDRomLoad, bool) CONFIG_PROPERTY(OpenGlChecks, bool) - CONFIG_PROPERTY(ForceWindowsCE, bool) .endNamespace() .beginNamespace("network") @@ -621,6 +632,7 @@ void init() EventManager::listen(Event::Terminate, emuEventCallback); EventManager::listen(Event::LoadState, emuEventCallback); EventManager::listen(Event::VBlank, emuEventCallback); + EventManager::listen(Event::Network, emuEventCallback); doExec(initFile); } @@ -635,6 +647,7 @@ void term() EventManager::unlisten(Event::Terminate, emuEventCallback); EventManager::unlisten(Event::LoadState, emuEventCallback); EventManager::unlisten(Event::VBlank, emuEventCallback); + EventManager::unlisten(Event::Network, emuEventCallback); lua_close(L); L = nullptr; } diff --git a/core/lua/lua.h b/core/lua/lua.h index 28806c57b..48ef341a0 100644 --- a/core/lua/lua.h +++ b/core/lua/lua.h @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ -#include "build.h" +#pragma once #include namespace lua diff --git a/core/network/alienfnt_modem.cpp b/core/network/alienfnt_modem.cpp index 0293d8ada..05cb9157f 100644 --- a/core/network/alienfnt_modem.cpp +++ b/core/network/alienfnt_modem.cpp @@ -25,17 +25,17 @@ #include #include -struct ModemEmu : public SerialPipe +struct ModemEmu : public SerialPort::Pipe { ModemEmu() { - serial_setPipe(this); + SCIFSerialPort::Instance().setPipe(this); schedId = sh4_sched_register(0, schedCallback); } - ~ModemEmu() { + ~ModemEmu() override { sh4_sched_unregister(schedId); stop_pico(); - serial_setPipe(nullptr); + SCIFSerialPort::Instance().setPipe(nullptr); } u8 read() override @@ -132,12 +132,12 @@ struct ModemEmu : public SerialPipe { toSend.insert(toSend.end(), l.begin(), l.end()); toSend.push_back('\n'); - serial_updateStatusRegister(); + SCIFSerialPort::Instance().updateStatus(); } - static int schedCallback(int tag, int cycles, int lag) + static int schedCallback(int tag, int cycles, int lag, void *arg) { - serial_updateStatusRegister(); + SCIFSerialPort::Instance().updateStatus(); return SH4_MAIN_CLOCK / 60; } diff --git a/core/network/dns.cpp b/core/network/dns.cpp index af98bfcb5..ad3ae58b5 100644 --- a/core/network/dns.cpp +++ b/core/network/dns.cpp @@ -29,6 +29,9 @@ extern "C" { #include #include #include +#ifdef _MSC_VER +#pragma pack(pop) +#endif } void get_host_by_name(const char *name, struct pico_ip4 dnsaddr); diff --git a/core/network/ggpo.cpp b/core/network/ggpo.cpp index 18f5134c3..6d4bb5fce 100644 --- a/core/network/ggpo.cpp +++ b/core/network/ggpo.cpp @@ -23,10 +23,9 @@ #include "input/keyboard_device.h" #include "input/mouse.h" #include "cfg/option.h" +#include "oslib/oslib.h" #include -void UpdateInputState(); - namespace ggpo { @@ -35,7 +34,7 @@ bool inRollback; static void getLocalInput(MapleInputState inputState[4]) { if (!config::ThreadedRendering) - UpdateInputState(); + os_UpdateInputState(); std::lock_guard lock(relPosMutex); for (int player = 0; player < 4; player++) { @@ -73,7 +72,8 @@ static void getLocalInput(MapleInputState inputState[4]) #ifdef USE_GGPO #include "ggponet.h" #include "emulator.h" -#include "rend/gui.h" +#include "ui/gui.h" +#include "ui/gui_util.h" #include "hw/mem/mem_watch.h" #include #include @@ -81,7 +81,7 @@ static void getLocalInput(MapleInputState inputState[4]) #include #include #include -#include "imgui/imgui.h" +#include "imgui.h" #include "miniupnp.h" #include "hw/naomi/naomi_cart.h" @@ -216,19 +216,19 @@ static bool on_event(GGPOEvent *info) switch (info->code) { case GGPO_EVENTCODE_CONNECTED_TO_PEER: INFO_LOG(NETWORK, "Connected to peer %d", info->u.connected.player); - gui_display_notification("Connected to peer", 2000); + os_notify("Connected to peer", 2000); break; case GGPO_EVENTCODE_SYNCHRONIZING_WITH_PEER: INFO_LOG(NETWORK, "Synchronizing with peer %d", info->u.synchronizing.player); - gui_display_notification("Synchronizing with peer", 2000); + os_notify("Synchronizing with peer", 2000); break; case GGPO_EVENTCODE_SYNCHRONIZED_WITH_PEER: INFO_LOG(NETWORK, "Synchronized with peer %d", info->u.synchronized.player); - gui_display_notification("Synchronized with peer", 2000); + os_notify("Synchronized with peer", 2000); break; case GGPO_EVENTCODE_RUNNING: INFO_LOG(NETWORK, "Running"); - gui_display_notification("Running", 2000); + os_notify("Running", 2000); synchronized = true; break; case GGPO_EVENTCODE_DISCONNECTED_FROM_PEER: @@ -242,11 +242,11 @@ static bool on_event(GGPOEvent *info) break; case GGPO_EVENTCODE_CONNECTION_INTERRUPTED: INFO_LOG(NETWORK, "Connection interrupted with player %d", info->u.connection_interrupted.player); - gui_display_notification("Connection interrupted", 2000); + os_notify("Connection interrupted", 2000); break; case GGPO_EVENTCODE_CONNECTION_RESUMED: INFO_LOG(NETWORK, "Connection resumed with player %d", info->u.connection_resumed.player); - gui_display_notification("Connection resumed", 2000); + os_notify("Connection resumed", 2000); break; } return true; @@ -330,10 +330,10 @@ static bool load_game_state(unsigned char *buffer, int len) */ static bool save_game_state(unsigned char **buffer, int *len, int *checksum, int frame) { - verify(!sh4_cpu.IsCpuRunning()); + verify(!emu.getSh4Executor()->IsCpuRunning()); lastSavedFrame = frame; // TODO this is way too much memory - size_t allocSize = (settings.platform.isNaomi() ? 20 : 10) * 1024 * 1024; + size_t allocSize = settings.platform.isNaomi() ? 20_MB : 10_MB; *buffer = (unsigned char *)malloc(allocSize); if (*buffer == nullptr) { @@ -440,7 +440,7 @@ static void free_buffer(void *buffer) { if (buffer != nullptr) { - Deserializer deser(buffer, 1024 * 1024, true); + Deserializer deser(buffer, 1_MB, true); int frame; deser >> frame; deltaStates.erase(frame); @@ -510,9 +510,9 @@ void startSession(int localPort, int localPlayerNum) mouseGame = false; if (settings.input.lightgunGame) absPointerPos = true; - else if (settings.input.JammaSetup == JVS::Keyboard) + else if (settings.input.keyboardGame) keyboardGame = true; - else if (settings.input.JammaSetup == JVS::RotaryEncoders) + else if (settings.input.mouseGame) mouseGame = true; else if (NaomiGameInputs != nullptr) { @@ -642,9 +642,9 @@ void getInput(MapleInputState inputState[4]) state.kcode = ~inputs->kcode; if (analogAxes > 0) { - state.fullAxes[PJAI_X1] = inputs->u.analog.x; + state.fullAxes[PJAI_X1] = inputs->u.analog.x << 8; if (analogAxes >= 2) - state.fullAxes[PJAI_Y1] = inputs->u.analog.y; + state.fullAxes[PJAI_Y1] = inputs->u.analog.y << 8; } else if (absPointerPos) { @@ -663,8 +663,8 @@ void getInput(MapleInputState inputState[4]) state.relPos.wheel = inputs->u.relPos.wheel; state.mouseButtons = ~inputs->mouseButtons; } - state.halfAxes[PJTI_R] = (state.kcode & BTN_TRIGGER_RIGHT) == 0 ? 255 : 0; - state.halfAxes[PJTI_L] = (state.kcode & BTN_TRIGGER_LEFT) == 0 ? 255 : 0; + state.halfAxes[PJTI_R] = (state.kcode & BTN_TRIGGER_RIGHT) == 0 ? 0xffff : 0; + state.halfAxes[PJTI_L] = (state.kcode & BTN_TRIGGER_LEFT) == 0 ? 0xffff : 0; } } @@ -706,14 +706,14 @@ bool nextFrame() // may call save_game_state do { if (!config::ThreadedRendering) - UpdateInputState(); + os_UpdateInputState(); Inputs inputs; inputs.kcode = ~kcode[0]; - if (rt[0] >= 64) + if (rt[0] >= 0x4000) inputs.kcode |= BTN_TRIGGER_RIGHT; else inputs.kcode &= ~BTN_TRIGGER_RIGHT; - if (lt[0] >= 64) + if (lt[0] >= 0x4000) inputs.kcode |= BTN_TRIGGER_LEFT; else inputs.kcode &= ~BTN_TRIGGER_LEFT; @@ -721,9 +721,9 @@ bool nextFrame() inputs.kbModifiers = 0; if (analogAxes > 0) { - inputs.u.analog.x = joyx[0]; + inputs.u.analog.x = joyx[0] >> 8; if (analogAxes >= 2) - inputs.u.analog.y = joyy[0]; + inputs.u.analog.y = joyy[0] >> 8; } else if (absPointerPos) { @@ -783,6 +783,7 @@ std::future startNetwork() synchronized = false; return std::async(std::launch::async, []{ { + ThreadName _("GGPO-start"); std::lock_guard lock(ggpoMutex); #ifdef SYNC_TEST startSession(0, 0); @@ -857,17 +858,17 @@ void displayStats() GGPONetworkStats stats; ggpo_get_network_stats(ggpoSession, remotePlayer, &stats); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_WindowBorderSize, 0); ImGui::SetNextWindowPos(ImVec2(10, 10)); - ImGui::SetNextWindowSize(ImVec2(95 * settings.display.uiScale, 0)); + ImGui::SetNextWindowSize(ScaledVec2(95, 0)); ImGui::SetNextWindowBgAlpha(0.7f); ImGui::Begin("##ggpostats", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoInputs); - ImGui::PushStyleColor(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); + ImguiStyleColor _2(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); // Send Queue ImGui::Text("Send Q"); - ImGui::ProgressBar(stats.network.send_queue_len / 10.f, ImVec2(-1, 10.f * settings.display.uiScale), ""); + ImGui::ProgressBar(stats.network.send_queue_len / 10.f, ImVec2(-1, uiScaled(10.f)), ""); // Frame Delay ImGui::Text("Delay"); @@ -889,7 +890,7 @@ void displayStats() // yellow ImGui::PushStyleColor(ImGuiCol_PlotHistogram, ImVec4(.9f, .9f, .1f, 1)); ImGui::Text("Predicted"); - ImGui::ProgressBar(stats.sync.predicted_frames / 7.f, ImVec2(-1, 10.f * settings.display.uiScale), ""); + ImGui::ProgressBar(stats.sync.predicted_frames / 7.f, ImVec2(-1, uiScaled(10.f)), ""); if (stats.sync.predicted_frames >= 5) ImGui::PopStyleColor(); @@ -898,16 +899,14 @@ void displayStats() if (timesync > 0) ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 0, 0, 1)); ImGui::Text("Behind"); - ImGui::ProgressBar(0.5f + stats.timesync.local_frames_behind / 16.f, ImVec2(-1, 10.f * settings.display.uiScale), ""); + ImGui::ProgressBar(0.5f + stats.timesync.local_frames_behind / 16.f, ImVec2(-1, uiScaled(10.f)), ""); if (timesync > 0) { ImGui::PopStyleColor(); timesyncOccurred--; } - ImGui::PopStyleColor(); ImGui::End(); - ImGui::PopStyleVar(2); } void endOfFrame() @@ -915,7 +914,7 @@ void endOfFrame() if (active()) { _endOfFrame = true; - sh4_cpu.Stop(); + emu.getSh4Executor()->Stop(); } } diff --git a/core/network/ggpo.h b/core/network/ggpo.h index 43a887076..2b9889a15 100644 --- a/core/network/ggpo.h +++ b/core/network/ggpo.h @@ -17,8 +17,8 @@ along with Flycast. If not, see . */ #pragma once -#include "types.h" #include +#include struct MapleInputState; diff --git a/core/network/miniupnp.cpp b/core/network/miniupnp.cpp index c5ecf120d..8f7be3301 100644 --- a/core/network/miniupnp.cpp +++ b/core/network/miniupnp.cpp @@ -43,7 +43,11 @@ bool MiniUPnP::Init() WARN_LOG(NETWORK, "UPnP discover failed: error %d", error); return false; } +#if MINIUPNPC_API_VERSION >= 18 + error = UPNP_GetValidIGD(devlist, &urls, &data, lanAddress, sizeof(lanAddress), nullptr, 0); +#else error = UPNP_GetValidIGD(devlist, &urls, &data, lanAddress, sizeof(lanAddress)); +#endif freeUPNPDevlist(devlist); if (error != 1) { diff --git a/core/network/naomi_network.cpp b/core/network/naomi_network.cpp index 0b89cd991..43500056d 100644 --- a/core/network/naomi_network.cpp +++ b/core/network/naomi_network.cpp @@ -19,7 +19,7 @@ #include "naomi_network.h" #include "hw/naomi/naomi_flashrom.h" #include "cfg/option.h" -#include "rend/gui.h" +#include "oslib/oslib.h" #include #include @@ -104,7 +104,7 @@ bool NaomiNetwork::startNetwork() std::string notif = slaves.empty() ? "Waiting for players..." : std::to_string(slaves.size()) + " player(s) connected. Waiting..."; - gui_display_notification(notif.c_str(), timeout.count() * 2000); + os_notify(notif.c_str(), timeout.count() * 2000); poll(); @@ -125,12 +125,12 @@ bool NaomiNetwork::startNetwork() nextPeer = slaves[0].addr; - gui_display_notification("Starting game", 2000); + os_notify("Starting game", 2000); SetNaomiNetworkConfig(0); return true; } - gui_display_notification("No player connected", 8000); + os_notify("No player connected", 8000); } else { @@ -164,7 +164,7 @@ bool NaomiNetwork::startNetwork() } NOTICE_LOG(NETWORK, "Connecting to server"); - gui_display_notification("Connecting to server", 10000); + os_notify("Connecting to server", 10000); steady_clock::time_point start_time = steady_clock::now(); while (!networkStopping && !_startNow && steady_clock::now() - start_time < timeout) @@ -249,7 +249,7 @@ bool NaomiNetwork::receive(const sockaddr_in *addr, const Packet *packet, u32 si nextPeer.sin_port = packet->sync.nextNodePort; nextPeer.sin_addr.s_addr = packet->sync.nextNodeIp == 0 ? addr->sin_addr.s_addr : packet->sync.nextNodeIp; std::string notif = "Connected as slot " + std::to_string(slotId); - gui_display_notification(notif.c_str(), 2000); + os_notify(notif.c_str(), 2000); } break; @@ -350,7 +350,7 @@ void SetNaomiNetworkConfig(int node) write_naomi_flash(0x224, node == -1 ? 0 : 1); // network on write_naomi_flash(0x220, node == 0 ? 0 : 1); // node id } - else if (gameId == "CLUB KART IN JAPAN") + else if (gameId == "CLUB KART IN JAPAN" && settings.content.fileName.substr(0, 6) != "clubkp") { write_naomi_eeprom(0x34, node + 1); // also 03 = satellite } @@ -358,19 +358,20 @@ void SetNaomiNetworkConfig(int node) || gameId == "INITIAL D Ver.2" || gameId == "INITIAL D Ver.3") { - write_naomi_eeprom(0x34, node == -1 ? 0x02 : node == 0 ? 0x12 : 0x22); + u8 b = read_naomi_eeprom(0x34) & 0xcf; + write_naomi_eeprom(0x34, (node == -1 ? 0x00 : node == 0 ? 0x10 : 0x20) | b); } else if (gameId == "THE KING OF ROUTE66") { - write_naomi_eeprom(0x3d, node == -1 ? 0x44 : node == 0 ? 0x54 : 0x64); + u8 b = read_naomi_eeprom(0x3d) & 0xf; + write_naomi_eeprom(0x3d, (node == -1 ? 0x40 : node == 0 ? 0x50 : 0x60) | b); } else if (gameId == "MAXIMUM SPEED") { configure_maxspeed_flash(node != -1, node == 0); } - else if (gameId == "F355 CHALLENGE JAPAN") + else if (gameId == "F355 CHALLENGE JAPAN" && settings.content.fileName != "f355") { - // FIXME need default flash write_naomi_flash(0x230, node == -1 ? 0 : node == 0 ? 1 : 2); if (node != -1) // car number (0 to 7) @@ -393,6 +394,9 @@ bool NaomiNetworkSupported() }; if (!config::NetworkEnable) return false; + if (settings.content.fileName.substr(0, 6) == "clubkp" || settings.content.fileName == "f355") + // Club Kart Prize and F355 (vanilla) don't support networking + return false; for (auto game : games) if (settings.content.gameId == game) return true; diff --git a/core/network/naomi_network.h b/core/network/naomi_network.h index b84675e5c..378c0f420 100644 --- a/core/network/naomi_network.h +++ b/core/network/naomi_network.h @@ -22,6 +22,7 @@ #include "miniupnp.h" #include "cfg/option.h" #include "emulator.h" +#include "oslib/oslib.h" #include #include @@ -44,6 +45,7 @@ class NaomiNetwork networkStopping = false; _startNow = false; return std::async(std::launch::async, [this] { + ThreadName _("NaomiNetwork-start"); bool res = startNetwork(); emu.setNetworkState(res); return res; diff --git a/core/network/net_handshake.cpp b/core/network/net_handshake.cpp index 62f192667..5263b5a1b 100644 --- a/core/network/net_handshake.cpp +++ b/core/network/net_handshake.cpp @@ -20,7 +20,9 @@ #include "cfg/option.h" #include "ggpo.h" #include "naomi_network.h" -#include "net_serial_maxspeed.h" +//#include "net_serial_maxspeed.h" +#include "null_modem.h" +#include "hw/naomi/naomi_flashrom.h" NetworkHandshake *NetworkHandshake::instance; @@ -69,7 +71,13 @@ void NetworkHandshake::init() else if (NaomiNetworkSupported()) instance = new NaomiNetworkHandshake(); else if (config::NetworkEnable && settings.content.gameId == "MAXIMUM SPEED") - instance = new MaxSpeedHandshake(); +// instance = new MaxSpeedHandshake(); + { + configure_maxspeed_flash(true, config::ActAsServer); + instance = new BattleCableHandshake(); + } + else if (config::BattleCableEnable && !settings.platform.isNaomi()) + instance = new BattleCableHandshake(); else instance = nullptr; } diff --git a/core/network/net_platform.h b/core/network/net_platform.h index ccf6e2222..f4eab1ed1 100644 --- a/core/network/net_platform.h +++ b/core/network/net_platform.h @@ -29,7 +29,7 @@ #define INADDR_NONE 0xffffffff #endif #ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN sizeof(struct sockaddr_in) +#define INET_ADDRSTRLEN 16 #endif #define SOL_TCP 6 // Shrug #else diff --git a/core/network/net_serial_maxspeed.h b/core/network/net_serial_maxspeed.h index 625ba8019..c564919a5 100644 --- a/core/network/net_serial_maxspeed.h +++ b/core/network/net_serial_maxspeed.h @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "hw/sh4/modules/modules.h" #include "net_platform.h" #include "cfg/option.h" @@ -26,7 +27,7 @@ #include "hw/naomi/naomi_flashrom.h" #include -struct MaxSpeedNetPipe : public SerialPipe +struct MaxSpeedNetPipe : public SerialPort::Pipe { class Exception : public FlycastException { @@ -88,12 +89,14 @@ struct MaxSpeedNetPipe : public SerialPipe } createSocket(); + SCIFSerialPort::Instance().setPipe(this); return true; } void shutdown() { + SCIFSerialPort::Instance().setPipe(nullptr); enableNetworkBroadcast(false); if (VALID(sock)) closesocket(sock); @@ -215,7 +218,8 @@ struct MaxSpeedNetPipe : public SerialPipe peerAddress.sin_family = AF_INET; peerAddress.sin_addr.s_addr = INADDR_BROADCAST; peerAddress.sin_port = htons(NaomiNetwork::SERVER_PORT); - if (!config::NetworkServer.get().empty()) + // ignore server name if acting as server + if (!config::NetworkServer.get().empty() && !config::ActAsServer) { auto pos = config::NetworkServer.get().find_last_of(':'); std::string server; @@ -242,8 +246,6 @@ struct MaxSpeedNetPipe : public SerialPipe } else enableNetworkBroadcast(true); - - serial_setPipe(this); } sock_t sock = INVALID_SOCKET; diff --git a/core/network/null_modem.h b/core/network/null_modem.h new file mode 100644 index 000000000..199f162b7 --- /dev/null +++ b/core/network/null_modem.h @@ -0,0 +1,285 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once +#include "hw/sh4/modules/modules.h" +#include "net_platform.h" +#include "cfg/option.h" +#include "miniupnp.h" +#include "hw/sh4/sh4_sched.h" +#include "naomi_network.h" +#include "net_handshake.h" +#include + +class NullModemPipe : public SerialPort::Pipe +{ +public: + class Exception : public FlycastException + { + public: + Exception(const std::string& reason) : FlycastException(reason) {} + }; + + // Serial TX + void write(u8 data) override + { + u8 packet[2] = { 'D', data }; + int rc = sendto(sock, (const char *)&packet[0], sizeof(packet), 0, (const sockaddr *)&peerAddress, sizeof(peerAddress)); + if (rc != sizeof(packet)) + ERROR_LOG(NETWORK, "sendto: %d errno %d", rc, get_last_error()); + DEBUG_LOG(NETWORK, "Write %02x %c (buf rx %d)", data, data, (int)rxBuffer.size()); + } + + void sendBreak() override + { + const char b = 'B'; + int rc = sendto(sock, &b, 1, 0, (const sockaddr *)&peerAddress, sizeof(peerAddress)); + if (rc != 1) + ERROR_LOG(NETWORK, "sendto: %d errno %d", rc, get_last_error()); + DEBUG_LOG(NETWORK, "Send Break"); + } + + // RX buffer Size + int available() override { + poll(); + checkBreak(); + int realSize = 0; + for (u32 b : rxBuffer) + if (b != (u32)~0) + realSize++; + return realSize; + } + + // Serial RX + u8 read() override + { + poll(); + if (rxBuffer.empty()) { + WARN_LOG(NETWORK, "NetPipe: empty read"); + return 0; + } + u8 b = rxBuffer.front(); + rxBuffer.pop_front(); + DEBUG_LOG(NETWORK, "Read %02x (buf rx %d)", b, (int)rxBuffer.size()); + checkBreak(); + + return b; + } + + ~NullModemPipe() + { + shutdown(); + } + + bool init() + { +#ifdef _WIN32 + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) + { + ERROR_LOG(NETWORK, "WSAStartup failed. errno=%d", get_last_error()); + throw Exception("WSAStartup failed"); + } +#endif + if (config::EnableUPnP) + { + miniupnp.Init(); + miniupnp.AddPortMapping(config::LocalPort, true); + } + + createSocket(); + SCIFSerialPort::Instance().setPipe(this); + + return true; + } + + void shutdown() + { + enableNetworkBroadcast(false); + if (VALID(sock)) + closesocket(sock); + sock = INVALID_SOCKET; + SCIFSerialPort::Instance().setPipe(nullptr); + } + +private: + void checkBreak() + { + if (!rxBuffer.empty() && rxBuffer.front() == (u32)~0) { + SCIFSerialPort::Instance().receiveBreak(); + rxBuffer.pop_front(); + } + } + + void poll() + { + if (lastPoll == sh4_sched_now64()) + return; + lastPoll = sh4_sched_now64(); + u8 data[0x100]; + sockaddr_in addr; + while (true) + { + socklen_t len = sizeof(addr); + int rc = recvfrom(sock, (char *)data, sizeof(data), 0, (sockaddr *)&addr, &len); + if (rc == -1) + { + int error = get_last_error(); + if (error == L_EWOULDBLOCK || error == L_EAGAIN) + break; +#ifdef _WIN32 + if (error == WSAECONNRESET) + // Happens if the previous send resulted in an ICMP Port Unreachable message + break; +#endif + throw Exception("Receive error: errno " + std::to_string(error)); + } + if (peerAddress.sin_addr.s_addr == INADDR_BROADCAST) + { + if (addr.sin_port != htons(config::LocalPort) || !is_local_address(addr.sin_addr.s_addr)) + { + peerAddress.sin_addr.s_addr = addr.sin_addr.s_addr; + peerAddress.sin_port = addr.sin_port; + enableNetworkBroadcast(false); + NOTICE_LOG(NETWORK, "Data received from peer %x:%d", htonl(addr.sin_addr.s_addr), htons(addr.sin_port)); + } + else + { + // this is coming from us so ignore it + continue; + } + } + if (rc == 2) + { + if (data[0] != 'D') { + ERROR_LOG(NETWORK, "Unexpected packet '%c'", data[0]); + } + else + { + rxBuffer.push_back(data[1]); + if (!dataReceived) + { + dataReceived = true; + char name[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &addr.sin_addr, name, sizeof(name)); + std::string s(name); + s += ":" + std::to_string(htons(addr.sin_port)); + os_notify("Network connected", 5000, s.c_str()); + } + } + } + else if (rc == 1) + { + if (data[0] != 'B') + ERROR_LOG(NETWORK, "Unexpected packet '%c'", data[0]); + else + rxBuffer.push_back(~0); + } + } + } + + void createSocket() + { + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock == INVALID_SOCKET) + { + ERROR_LOG(NETWORK, "Socket creation failed: errno %d", get_last_error()); + throw Exception("Socket creation failed"); + } + int option = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&option, sizeof(option)); + + sockaddr_in serveraddr{}; + serveraddr.sin_family = AF_INET; + serveraddr.sin_port = htons(config::LocalPort); + + if (::bind(sock, (sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) + { + ERROR_LOG(NETWORK, "NaomiServer: bind() failed. errno=%d", get_last_error()); + closesocket(sock); + + throw Exception("Socket bind failed"); + } + set_non_blocking(sock); + + // Allow broadcast packets to be sent + int broadcast = 1; + if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char *)&broadcast, sizeof(broadcast)) == -1) + WARN_LOG(NETWORK, "setsockopt(SO_BROADCAST) failed. errno=%d", get_last_error()); + + peerAddress.sin_family = AF_INET; + peerAddress.sin_addr.s_addr = INADDR_BROADCAST; + peerAddress.sin_port = htons(NaomiNetwork::SERVER_PORT); + if (!config::NetworkServer.get().empty() + // ignore server name if acting as server (maxspeed) + && (!config::ActAsServer || settings.platform.isConsole())) + { + auto pos = config::NetworkServer.get().find_last_of(':'); + std::string server; + if (pos != std::string::npos) + { + peerAddress.sin_port = htons(atoi(config::NetworkServer.get().substr(pos + 1).c_str())); + server = config::NetworkServer.get().substr(0, pos); + } + else + server = config::NetworkServer; + addrinfo *resultAddr; + if (getaddrinfo(server.c_str(), 0, nullptr, &resultAddr)) + WARN_LOG(NETWORK, "Server %s is unknown", server.c_str()); + else + { + for (addrinfo *ptr = resultAddr; ptr != nullptr; ptr = ptr->ai_next) + if (ptr->ai_family == AF_INET) + { + peerAddress.sin_addr.s_addr = ((sockaddr_in *)ptr->ai_addr)->sin_addr.s_addr; + break; + } + freeaddrinfo(resultAddr); + } + } + else + enableNetworkBroadcast(true); + } + + sock_t sock = INVALID_SOCKET; + MiniUPnP miniupnp; + std::deque rxBuffer; + sockaddr_in peerAddress{}; + u64 lastPoll = 0; + bool dataReceived = false; +}; + +class BattleCableHandshake : public NetworkHandshake +{ +public: + std::future start() override { + std::promise promise; + promise.set_value(pipe.init()); + return promise.get_future(); + } + void stop() override { + pipe.shutdown(); + } + bool canStartNow() override { + return true; + } + void startNow() override {} + +private: + NullModemPipe pipe; +}; diff --git a/core/network/picoppp.cpp b/core/network/picoppp.cpp index bc3ef5091..efc748b08 100644 --- a/core/network/picoppp.cpp +++ b/core/network/picoppp.cpp @@ -26,9 +26,6 @@ #include "stdclass.h" //#define BBA_PCAPNG_DUMP -#ifdef BBA_PCAPNG_DUMP -#include "oslib/oslib.h" -#endif #ifdef __MINGW32__ #define _POSIX_SOURCE @@ -42,6 +39,9 @@ extern "C" { #include #include #include +#ifdef _MSC_VER +#pragma pack(pop) +#endif } #include "net_platform.h" @@ -51,6 +51,7 @@ extern "C" { #include "miniupnp.h" #include "cfg/option.h" #include "emulator.h" +#include "oslib/oslib.h" #include #include @@ -188,11 +189,29 @@ static GamePortList GamesPorts[] = { { "MK-51037", "HDR-0106" }, { 12079, 20675 }, }, + { // Dee Dee Planet + { "HDR-0041" }, + { 9879 }, + }, + { // Driving Strikers online demo + { "IND-161053" }, + { 30099 }, + }, + { // Floigan Bros + { "MK-51114" }, + {}, + { 37001 }, + }, + { // Internet Game Pack + { "MK-51138" }, + { 5656 }, + { 5011, 10500, 10501, 10502, 10503 }, + }, { // NBA 2K1,2K2 / NFL 2K1,2K2 / NCAA 2K2 - { "MK-51063", "HDR-0150", // NBA 2K1 - "MK-51178", "HDR-0197", "MK-5117850", // NBA 2K2 - "MK-51062", "HDR-0144", // NFL 2K1 - "MK-51168", "HDR-0196", // NFL 2K2 + { "MK-51063", "HDR-0150", // NBA 2K1 + "MK-51178", "HDR-0197", "MK-5117850", // NBA 2K2 + "MK-51062", "HDR-0144", // NFL 2K1 + "MK-51168", "HDR-0196", // NFL 2K2 "MK-51176" }, // NCAA 2K2 { 5502, 5503, 5656 }, { 5011, 6666 }, @@ -217,6 +236,14 @@ static GamePortList GamesPorts[] = { { 7648, 1285, 1028 }, { }, }, + { + { + "HDR-0073" // Sega Tetris + "GENERIC", "T44501M" // Golf Shiyouyo 2 + // (the dreamcastlive patched versions are id'ed as GENERIC) + }, + { 20675, 12079 }, + }, { // StarLancer { "T40209N", "T17723D 05" }, { 2300, 6500, 47624 }, // FIXME 2300-2400 ? @@ -232,10 +259,6 @@ static GamePortList GamesPorts[] = { { }, { 17219 }, }, - { // Driving Strikers online demo - { "IND-161053" }, - { 30099 }, - }, { // Atomiswave { "FASTER THAN SPEED" }, @@ -740,51 +763,57 @@ static int modem_set_speed(pico_device *dev, uint32_t speed) return 0; } -static void check_dns_entries() +static uint32_t dns_query_start; +static uint32_t dns_query_attempts; + +static void reset_dns_entries() { - static uint32_t dns_query_start = 0; - static uint32_t dns_query_attempts = 0; + dns_query_attempts = 0; + dns_query_start = 0; + public_ip.addr = 0; + afo_ip.addr = 0; +} +static void check_dns_entries() +{ if (public_ip.addr == 0) { - if (!dns_query_start) + u32 ip; + pico_string_to_ipv4(RESOLVER1_OPENDNS_COM, &ip); + pico_ip4 tmpdns { ip }; + if (dns_query_start == 0) { dns_query_start = PICO_TIME_MS(); - struct pico_ip4 tmpdns; - pico_string_to_ipv4(RESOLVER1_OPENDNS_COM, &tmpdns.addr); get_host_by_name("myip.opendns.com", tmpdns); } + else if (get_dns_answer(&public_ip, tmpdns) == 0) + { + dns_query_attempts = 0; + dns_query_start = 0; + char myip[16]; + pico_ipv4_to_string(myip, public_ip.addr); + INFO_LOG(MODEM, "My IP is %s", myip); + } else { - struct pico_ip4 tmpdns; - pico_string_to_ipv4(RESOLVER1_OPENDNS_COM, &tmpdns.addr); - if (get_dns_answer(&public_ip, tmpdns) == 0) - { - dns_query_attempts = 0; - dns_query_start = 0; - char myip[16]; - pico_ipv4_to_string(myip, public_ip.addr); - INFO_LOG(MODEM, "My IP is %s", myip); - } - else + if (PICO_TIME_MS() - dns_query_start > 1000) { - if (PICO_TIME_MS() - dns_query_start > 1000) + if (++dns_query_attempts >= 5) { - if (++dns_query_attempts >= 5) - { - public_ip.addr = 0xffffffff; // Bogus but not null - dns_query_attempts = 0; - } - else - // Retry - dns_query_start = 0; + public_ip.addr = 0xffffffff; // Bogus but not null + dns_query_attempts = 0; + dns_query_start = 0; + WARN_LOG(MODEM, "Can't resolve my IP"); } + else + // Retry + dns_query_start = 0; } } } else if (afo_ip.addr == 0) { - if (!dns_query_start) + if (dns_query_start == 0) { dns_query_start = PICO_TIME_MS(); get_host_by_name("auriga.segasoft.com", dnsaddr); // Alien Front Online server @@ -809,6 +838,7 @@ static void check_dns_entries() pico_string_to_ipv4("146.185.135.179", &addr); // Default address memcpy(&afo_ip.addr, &addr, sizeof(addr)); dns_query_attempts = 0; + WARN_LOG(MODEM, "Can't resolve auriga.segasoft.com. Using default 146.185.135.179"); } else // Retry @@ -882,7 +912,7 @@ static void dumpFrame(const u8 *frame, u32 size) fwrite(&roundedSize, sizeof(roundedSize), 1, pcapngDump); u32 ifId = 0; fwrite(&ifId, sizeof(ifId), 1, pcapngDump); - u64 now = (u64)(os_GetSeconds() * 1000000.0); + u64 now = getTimeMs() * 1000; fwrite((u32 *)&now + 1, 4, 1, pcapngDump); fwrite(&now, 4, 1, pcapngDump); fwrite(&size, sizeof(size), 1, pcapngDump); @@ -951,6 +981,7 @@ static void *pico_thread_func(void *) std::future upnp = std::async(std::launch::async, [ports]() { // Initialize miniupnpc and map network ports + ThreadName _("UPNP-init"); MiniUPnP upnp; if (ports != nullptr && config::EnableUPnP) { @@ -982,12 +1013,33 @@ static void *pico_thread_func(void *) out_buffer_lock.unlock(); } - u32 addr; - pico_string_to_ipv4(config::DNS.get().c_str(), &addr); - memcpy(&dnsaddr.addr, &addr, sizeof(addr)); + // Find DNS ip address + { + std::string dnsName = config::DNS; + if (dnsName == "46.101.91.123") + // override legacy default with current one + dnsName = "dns.flyca.st"; + hostent *hp = gethostbyname(dnsName.c_str()); + if (hp != nullptr && hp->h_length > 0) + { + memcpy(&dnsaddr.addr, hp->h_addr_list[0], sizeof(dnsaddr.addr)); + char s[17]; + pico_ipv4_to_string(s, dnsaddr.addr); + NOTICE_LOG(MODEM, "%s IP is %s", dnsName.c_str(), s); + } + else + { + u32 addr; + pico_string_to_ipv4("46.101.91.123", &addr); + dnsaddr.addr = addr; + WARN_LOG(MODEM, "Can't resolve dns.flyca.st. Using default 46.101.91.123"); + } + } + reset_dns_entries(); // Create ppp/eth device const bool usingPPP = !config::EmulateBBA; + u32 addr; if (usingPPP) { // PPP @@ -1145,7 +1197,7 @@ static void *pico_thread_func(void *) return NULL; } -static cThread pico_thread(pico_thread_func, NULL); +static cThread pico_thread(pico_thread_func, nullptr, "PicoTCP"); bool start_pico() { diff --git a/core/nullDC.cpp b/core/nullDC.cpp index 15d2f3e8b..8e60388a3 100644 --- a/core/nullDC.cpp +++ b/core/nullDC.cpp @@ -5,15 +5,44 @@ #include "cfg/cfg.h" #include "cfg/option.h" #include "log/LogManager.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "oslib/oslib.h" +#include "oslib/directory.h" +#include "oslib/storage.h" #include "debug/gdb_server.h" #include "archive/rzip.h" -#include "rend/mainui.h" +#include "ui/mainui.h" #include "input/gamepad_device.h" #include "lua/lua.h" #include "stdclass.h" #include "serialize.h" +#include + +static std::string lastStateFile; +static time_t lastStateTime; + +struct SavestateHeader +{ + void init() + { + memcpy(magic, MAGIC, sizeof(magic)); + creationDate = time(nullptr); + version = Deserializer::Current; + pngSize = 0; + } + + bool isValid() const { + return !memcmp(magic, MAGIC, sizeof(magic)); + } + + char magic[8]; + u64 creationDate; + u32 version; + u32 pngSize; + // png data + + static constexpr const char *MAGIC = "FLYSAVE1"; +}; int flycast_init(int argc, char* argv[]) { @@ -62,13 +91,15 @@ int flycast_init(int argc, char* argv[]) return 0; } +#ifndef __ANDROID__ void dc_exit() { try { - emu.stop(); + emu.unloadGame(); } catch (...) { } mainui_stop(); } +#endif void SaveSettings() { @@ -86,15 +117,18 @@ void flycast_term() gui_cancel_load(); lua::term(); emu.term(); + os_DestroyWindow(); gui_term(); os_TermInput(); } -void dc_savestate(int index) +void dc_savestate(int index, const u8 *pngData, u32 pngSize) { if (settings.network.online) return; + lastStateFile.clear(); + Serializer ser; dc_serialize(ser); @@ -102,7 +136,7 @@ void dc_savestate(int index) if (data == nullptr) { WARN_LOG(SAVESTATE, "Failed to save state - could not malloc %d bytes", (int)ser.size()); - gui_display_notification("Save state failed - memory full", 2000); + os_notify("Save state failed - memory full", 5000); return; } @@ -110,87 +144,105 @@ void dc_savestate(int index) dc_serialize(ser); std::string filename = hostfs::getSavestatePath(index, true); -#if 0 FILE *f = nowide::fopen(filename.c_str(), "wb"); - - if ( f == NULL ) + if (f == nullptr) { WARN_LOG(SAVESTATE, "Failed to save state - could not open %s for writing", filename.c_str()); - gui_display_notification("Cannot open save file", 2000); + os_notify("Cannot open save file", 5000); free(data); return; } + RZipFile zipFile; + SavestateHeader header; + header.init(); + header.pngSize = pngSize; + if (std::fwrite(&header, sizeof(header), 1, f) != 1) + goto fail; + if (pngSize > 0 && std::fwrite(pngData, 1, pngSize, f) != pngSize) + goto fail; + +#if 0 + // Uncompressed savestate std::fwrite(data, 1, ser.size(), f); std::fclose(f); #else - RZipFile zipFile; - if (!zipFile.Open(filename, true)) - { - WARN_LOG(SAVESTATE, "Failed to save state - could not open %s for writing", filename.c_str()); - gui_display_notification("Cannot open save file", 2000); - free(data); - return; - } + if (!zipFile.Open(f, true)) + goto fail; if (zipFile.Write(data, ser.size()) != ser.size()) - { - WARN_LOG(SAVESTATE, "Failed to save state - error writing %s", filename.c_str()); - gui_display_notification("Error saving state", 2000); - zipFile.Close(); - free(data); - return; - } + goto fail; zipFile.Close(); #endif free(data); NOTICE_LOG(SAVESTATE, "Saved state to %s size %d", filename.c_str(), (int)ser.size()); - gui_display_notification("State saved", 1000); + os_notify("State saved", 2000); + return; + +fail: + WARN_LOG(SAVESTATE, "Failed to save state - error writing %s", filename.c_str()); + os_notify("Error saving state", 5000); + if (zipFile.rawFile() != nullptr) + zipFile.Close(); + else + std::fclose(f); + free(data); + // delete failed savestate? } void dc_loadstate(int index) { + if (settings.raHardcoreMode) + return; u32 total_size = 0; - FILE *f = nullptr; std::string filename = hostfs::getSavestatePath(index, false); - RZipFile zipFile; - if (zipFile.Open(filename, false)) + FILE *f = hostfs::storage().openFile(filename, "rb"); + if (f == nullptr) { + WARN_LOG(SAVESTATE, "Failed to load state - could not open %s for reading", filename.c_str()); + os_notify("Save state not found", 2000); + return; + } + SavestateHeader header; + if (std::fread(&header, sizeof(header), 1, f) == 1) + { + if (!header.isValid()) + // seek to beginning of file if this isn't a valid header (legacy savestate) + std::fseek(f, 0, SEEK_SET); + else + // skip png data + std::fseek(f, header.pngSize, SEEK_CUR); + } + else { + // probably not a valid savestate but we'll fail later + std::fseek(f, 0, SEEK_SET); + } + + if (index == -1 && config::GGPOEnable) + { + long pos = std::ftell(f); + MD5Sum().add(f) + .getDigest(settings.network.md5.savestate); + std::fseek(f, pos, SEEK_SET); + } + RZipFile zipFile; + if (zipFile.Open(f, false)) { total_size = (u32)zipFile.Size(); - if (index == -1 && config::GGPOEnable) - { - f = zipFile.rawFile(); - long pos = std::ftell(f); - MD5Sum().add(f) - .getDigest(settings.network.md5.savestate); - std::fseek(f, pos, SEEK_SET); - f = nullptr; - } } else { - f = nowide::fopen(filename.c_str(), "rb"); - - if ( f == NULL ) - { - WARN_LOG(SAVESTATE, "Failed to load state - could not open %s for reading", filename.c_str()); - gui_display_notification("Save state not found", 2000); - return; - } - if (index == -1 && config::GGPOEnable) - MD5Sum().add(f) - .getDigest(settings.network.md5.savestate); + long pos = std::ftell(f); std::fseek(f, 0, SEEK_END); - total_size = (u32)std::ftell(f); - std::fseek(f, 0, SEEK_SET); + total_size = (u32)std::ftell(f) - pos; + std::fseek(f, pos, SEEK_SET); } void *data = malloc(total_size); if (data == nullptr) { WARN_LOG(SAVESTATE, "Failed to load state - could not malloc %d bytes", total_size); - gui_display_notification("Failed to load state - memory full", 2000); - if (f != nullptr) + os_notify("Failed to load state", 5000, "Not enough memory"); + if (zipFile.rawFile() == nullptr) std::fclose(f); else zipFile.Close(); @@ -198,36 +250,85 @@ void dc_loadstate(int index) } size_t read_size; - if (f == nullptr) + if (zipFile.rawFile() != nullptr) { read_size = zipFile.Read(data, total_size); zipFile.Close(); } else { - read_size = fread(data, 1, total_size, f); + read_size = std::fread(data, 1, total_size, f); std::fclose(f); } if (read_size != total_size) { WARN_LOG(SAVESTATE, "Failed to load state - I/O error"); - gui_display_notification("Failed to load state - I/O error", 2000); + os_notify("Failed to load state", 5000, "I/O error"); free(data); return; } try { Deserializer deser(data, total_size); - dc_loadstate(deser); + emu.loadstate(deser); NOTICE_LOG(SAVESTATE, "Loaded state ver %d from %s size %d", deser.version(), filename.c_str(), total_size); if (deser.size() != total_size) + // Note: this isn't true for RA savestates WARN_LOG(SAVESTATE, "Savestate size %d but only %d bytes used", total_size, (int)deser.size()); } catch (const Deserializer::Exception& e) { ERROR_LOG(SAVESTATE, "%s", e.what()); + os_notify("Failed to load state", 5000, e.what()); } free(data); - EventManager::event(Event::LoadState); +} + +time_t dc_getStateCreationDate(int index) +{ + std::string filename = hostfs::getSavestatePath(index, false); + if (filename != lastStateFile) + { + lastStateFile = filename; + FILE *f = hostfs::storage().openFile(filename, "rb"); + if (f == nullptr) + lastStateTime = 0; + else + { + SavestateHeader header; + if (std::fread(&header, sizeof(header), 1, f) != 1 || !header.isValid()) + { + std::fclose(f); + try { + hostfs::FileInfo fileInfo = hostfs::storage().getFileInfo(filename); + lastStateTime = fileInfo.updateTime; + } catch (...) { + lastStateTime = 0; + } + } + else { + std::fclose(f); + lastStateTime = (time_t)header.creationDate; + } + } + } + return lastStateTime; +} + +void dc_getStateScreenshot(int index, std::vector& pngData) +{ + pngData.clear(); + std::string filename = hostfs::getSavestatePath(index, false); + FILE *f = hostfs::storage().openFile(filename, "rb"); + if (f == nullptr) + return; + SavestateHeader header; + if (std::fread(&header, sizeof(header), 1, f) == 1 && header.isValid() && header.pngSize != 0) + { + pngData.resize(header.pngSize); + if (std::fread(pngData.data(), 1, pngData.size(), f) != pngData.size()) + pngData.clear(); + } + std::fclose(f); } #endif diff --git a/core/oslib/audiobackend_oss.cpp b/core/oslib/audiobackend_oss.cpp deleted file mode 100644 index b9f81c601..000000000 --- a/core/oslib/audiobackend_oss.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#ifdef USE_OSS -#include "audiostream.h" -#include -#include -#include -#include - -class OSSAudioBackend : public AudioBackend -{ - int audioFD = -1; - int recordFD = -1; - -public: - OSSAudioBackend() - : AudioBackend("oss", "Open Sound System") {} - - bool init() override - { - audioFD = open("/dev/dsp", O_WRONLY); - if (audioFD < 0) - { - WARN_LOG(AUDIO, "Couldn't open /dev/dsp."); - return false; - } - INFO_LOG(AUDIO, "sound enabled, dsp opened for write"); - int tmp=44100; - int err_ret; - err_ret=ioctl(audioFD,SNDCTL_DSP_SPEED,&tmp); - INFO_LOG(AUDIO, "set Frequency to %i, return %i (rate=%i)", 44100, err_ret, tmp); - int channels=2; - err_ret=ioctl(audioFD, SNDCTL_DSP_CHANNELS, &channels); - INFO_LOG(AUDIO, "set dsp to stereo (%i => %i)", channels, err_ret); - int format=AFMT_S16_LE; - err_ret=ioctl(audioFD, SNDCTL_DSP_SETFMT, &format); - INFO_LOG(AUDIO, "set dsp to %s audio (%i/%i => %i)", "16bits signed", AFMT_S16_LE, format, err_ret); - - return true; - } - - u32 push(const void* frame, u32 samples, bool wait) override - { - write(audioFD, frame, samples * 4); - return 1; - } - - void term() override - { - if (audioFD >= 0) - close(audioFD); - audioFD = -1; - } - - // recording untested - - bool initRecord(u32 sampling_freq) override - { - recordFD = open("/dev/dsp", O_RDONLY); - if (recordFD < 0) - { - INFO_LOG(AUDIO, "OSS: can't open default audio capture device"); - return false; - } - int tmp = AFMT_S16_NE; // Native 16 bits - if (ioctl(recordFD, SNDCTL_DSP_SETFMT, &tmp) == -1 || tmp != AFMT_S16_NE) - { - INFO_LOG(AUDIO, "OSS: can't set sample format"); - close(recordFD); - recordFD = -1; - return false; - } - tmp = 1; - if (ioctl(recordFD, SNDCTL_DSP_CHANNELS, &tmp) == -1) - { - INFO_LOG(AUDIO, "OSS: can't set channel count"); - close(recordFD); - recordFD = -1; - return false; - } - tmp = sampling_freq; - if (ioctl(recordFD, SNDCTL_DSP_SPEED, &tmp) == -1) - { - INFO_LOG(AUDIO, "OSS: can't set sample rate"); - close(recordFD); - recordFD = -1; - return false; - } - - return true; - } - - void termRecord() override - { - if (recordFD >= 0) - close(recordFD); - recordFD = -1; - } - - u32 record(void *buffer, u32 samples) override - { - samples *= 2; - int l = read(recordFD, buffer, samples); - if (l < (int)samples) - { - if (l < 0) - { - INFO_LOG(AUDIO, "OSS: Recording error"); - l = 0; - } - memset((u8 *)buffer + l, 0, samples - l); - } - return l / 2; - } -}; -static OSSAudioBackend ossAudioBackend; - -#endif diff --git a/core/oslib/host_context.h b/core/oslib/host_context.h index 02483b63b..535207f4a 100644 --- a/core/oslib/host_context.h +++ b/core/oslib/host_context.h @@ -2,9 +2,7 @@ #include "types.h" struct host_context_t { -#if HOST_CPU != CPU_GENERIC - unat pc; -#endif + uintptr_t pc; #if HOST_CPU == CPU_X86 u32 eax; diff --git a/core/rend/boxart/http_client.cpp b/core/oslib/http_client.cpp similarity index 75% rename from core/rend/boxart/http_client.cpp rename to core/oslib/http_client.cpp index d68db142f..3742159b1 100644 --- a/core/rend/boxart/http_client.cpp +++ b/core/oslib/http_client.cpp @@ -68,6 +68,86 @@ int get(const std::string& url, std::vector& content, std::string& contentTy return 200; } +static int post(const std::string& url, const char *headers, const u8 *payload, u32 payloadSize, std::vector& reply) +{ + char scheme[16], host[256], path[256]; + URL_COMPONENTS components{}; + components.dwStructSize = sizeof(components); + components.lpszScheme = scheme; + components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]); + components.lpszHostName = host; + components.dwHostNameLength = sizeof(host) / sizeof(host[0]); + components.lpszUrlPath = path; + components.dwUrlPathLength = sizeof(path) / sizeof(path[0]); + + if (!InternetCrackUrlA(url.c_str(), url.length(), 0, &components)) + return 500; + + bool https = !strcmp(scheme, "https"); + + int rc = 500; + HINTERNET ic = InternetConnect(hInet, host, components.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + if (ic == NULL) + return rc; + + HINTERNET hreq = HttpOpenRequest(ic, "POST", path, NULL, NULL, NULL, https ? INTERNET_FLAG_SECURE : 0, 0); + if (hreq == NULL) { + InternetCloseHandle(ic); + return rc; + } + if (payloadSize > 0) + { + char clen[128]; + snprintf(clen, sizeof(clen), "Content-Length: %d\r\n", payloadSize); + HttpAddRequestHeaders(hreq, clen, -1L, HTTP_ADDREQ_FLAG_ADD_IF_NEW); + } + if (!HttpSendRequest(hreq, headers, -1, (void *)payload, payloadSize)) + WARN_LOG(NETWORK, "HttpSendRequest Error %d", GetLastError()); + else + { + DWORD status; + DWORD size = sizeof(status); + DWORD index = 0; + if (!HttpQueryInfo(hreq, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, &index)) + WARN_LOG(NETWORK, "HttpQueryInfo Error %d", GetLastError()); + else + { + rc = status; + reply.clear(); + u8 buffer[4096]; + DWORD bytesRead = sizeof(buffer); + while (true) + { + if (!InternetReadFile(hreq, buffer, sizeof(buffer), &bytesRead)) + { + WARN_LOG(NETWORK, "InternetReadFile failed: %lx", GetLastError()); + InternetCloseHandle(hreq); + rc = 500; + break; + } + if (bytesRead == 0) + break; + reply.insert(reply.end(), buffer, buffer + bytesRead); + } + } + } + + InternetCloseHandle(hreq); + InternetCloseHandle(ic); + + return rc; +} + +int post(const std::string& url, const char *payload, const char *contentType, std::vector& reply) +{ + char buf[512]; + if (contentType != nullptr) { + sprintf(buf, "Content-Type: %s", contentType); + contentType = buf; + } + return post(url, contentType, (const u8 *)payload, strlen(payload), reply); +} + int post(const std::string& url, const std::vector& fields) { static const std::string boundary("----flycast-boundary-8304529454"); @@ -122,49 +202,9 @@ int post(const std::string& url, const std::vector& fields) } content += "--" + boundary + "--\r\n"; - char scheme[16], host[256], path[256]; - URL_COMPONENTS components{}; - components.dwStructSize = sizeof(components); - components.lpszScheme = scheme; - components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]); - components.lpszHostName = host; - components.dwHostNameLength = sizeof(host) / sizeof(host[0]); - components.lpszUrlPath = path; - components.dwUrlPathLength = sizeof(path) / sizeof(path[0]); - - if (!InternetCrackUrlA(url.c_str(), url.length(), 0, &components)) - return 500; - - bool https = !strcmp(scheme, "https"); - - int rc = 500; - HINTERNET ic = InternetConnect(hInet, host, components.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); - if (ic == NULL) - return rc; - - HINTERNET hreq = HttpOpenRequest(ic, "POST", path, NULL, NULL, NULL, https ? INTERNET_FLAG_SECURE : 0, 0); - if (hreq == NULL) { - InternetCloseHandle(ic); - return rc; - } + std::vector reply; std::string header("Content-Type: multipart/form-data; boundary=" + boundary); - if (!HttpSendRequest(hreq, header.c_str(), -1, &content[0], content.length())) - WARN_LOG(NETWORK, "HttpSendRequest Error %d", GetLastError()); - else - { - DWORD status; - DWORD size = sizeof(status); - DWORD index = 0; - if (!HttpQueryInfo(hreq, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, &index)) - WARN_LOG(NETWORK, "HttpQueryInfo Error %d", GetLastError()); - else - rc = status; - } - - InternetCloseHandle(hreq); - InternetCloseHandle(ic); - - return rc; + return post(url, header.c_str(), (const u8 *)&content[0], content.length(), reply); } void term() @@ -195,7 +235,7 @@ static size_t receiveData(void *buffer, size_t size, size_t nmemb, std::vector& content, std::string& contentType) +static CURL *makeCurlEasy(const std::string& url) { CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Flycast/1.0"); @@ -206,6 +246,13 @@ int get(const std::string& url, std::vector& content, std::string& contentTy curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + return curl; +} + +int get(const std::string& url, std::vector& content, std::string& contentType) +{ + CURL *curl = makeCurlEasy(url); + std::vector recvBuffer; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receiveData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &recvBuffer); @@ -227,17 +274,41 @@ int get(const std::string& url, std::vector& content, std::string& contentTy return (int)httpCode; } -int post(const std::string& url, const std::vector& fields) +int post(const std::string& url, const char *payload, const char *contentType, std::vector& reply) { - CURL *curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Flycast/1.0"); - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + CURL *curl = makeCurlEasy(url); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload); + curl_slist *headers = nullptr; + if (contentType != nullptr) + { + headers = curl_slist_append(headers, ("Content-Type: " + std::string(contentType)).c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + } - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + std::vector recvBuffer; + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receiveData); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &recvBuffer); + CURLcode res = curl_easy_perform(curl); + + long httpCode = 500; + if (res == CURLE_OK) + { + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); + reply = recvBuffer; + } + curl_slist_free_all(headers); + curl_easy_cleanup(curl); + + return (int)httpCode; +} + +int post(const std::string& url, const std::vector& fields) +{ + CURL *curl = makeCurlEasy(url); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_mime *mime = curl_mime_init(curl); for (const auto& field : fields) @@ -263,7 +334,6 @@ int post(const std::string& url, const std::vector& fields) curl_easy_cleanup(curl); return (int)httpCode; - } void term() diff --git a/core/rend/boxart/http_client.h b/core/oslib/http_client.h similarity index 95% rename from core/rend/boxart/http_client.h rename to core/oslib/http_client.h index 2b44aad1b..c71fb668f 100644 --- a/core/rend/boxart/http_client.h +++ b/core/oslib/http_client.h @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include #include #include @@ -49,6 +50,7 @@ struct PostField }; int post(const std::string& url, const std::vector& fields); +int post(const std::string& url, const char *payload, const char *contentType, std::vector& reply); static inline bool success(int status) { return status >= 200 && status < 300; diff --git a/core/oslib/oslib.cpp b/core/oslib/oslib.cpp index 3a078bae7..4595ed42d 100644 --- a/core/oslib/oslib.cpp +++ b/core/oslib/oslib.cpp @@ -25,22 +25,69 @@ #ifndef _WIN32 #include #endif +#if defined(USE_SDL) +#include "sdl/sdl.h" +#else + #if defined(SUPPORT_X11) + #include "linux-dist/x11.h" + #endif + #if defined(USE_EVDEV) + #include "linux-dist/evdev.h" + #endif +#endif +#if defined(_WIN32) && !defined(TARGET_UWP) +#include "windows/rawinput.h" +#include +#endif +#include "profiler/fc_profiler.h" +#include "input/gamepad_device.h" namespace hostfs { -std::string getVmuPath(const std::string& port) +std::string getVmuPath(const std::string& port, bool save) { - if (port == "A1" && config::PerGameVmu && !settings.content.path.empty()) - return get_game_save_prefix() + "_vmu_save_A1.bin"; + if (port == "A1" && config::PerGameVmu) + { + if (settings.platform.isConsole() && !settings.content.gameId.empty()) + { + constexpr std::string_view INVALID_CHARS { " /\\:*?|<>" }; + std::string vmuName = settings.content.gameId; + for (char &c: vmuName) + if (INVALID_CHARS.find(c) != INVALID_CHARS.npos) + c = '_'; + vmuName += "_vmu_save_A1.bin"; + std::string wpath = get_writable_data_path(vmuName); + if (save || file_exists(wpath)) + return wpath; + std::string rpath = get_readonly_data_path(vmuName); + if (hostfs::storage().exists(rpath)) + return rpath; + if (!settings.content.path.empty()) + { + // Legacy path using the rom file name + rpath = get_game_save_prefix() + "_vmu_save_A1.bin"; + if (file_exists(rpath)) + return rpath; + } + return wpath; + } + if (!settings.content.path.empty()) + return get_game_save_prefix() + "_vmu_save_A1.bin"; + } - char tempy[512]; - sprintf(tempy, "vmu_save_%s.bin", port.c_str()); + std::string vmuName = "vmu_save_" + port + ".bin"; + std::string wpath = get_writable_data_path(vmuName); + if (save || file_exists(wpath)) + return wpath; + std::string rpath = get_readonly_data_path(vmuName); + if (hostfs::storage().exists(rpath)) + return rpath; // VMU saves used to be stored in .reicast, not in .reicast/data - std::string apath = get_writable_config_path(tempy); - if (!file_exists(apath)) - apath = get_writable_data_path(tempy); - return apath; + rpath = get_readonly_config_path(vmuName); + if (file_exists(rpath)) + return rpath; + return wpath; } std::string getArcadeFlashPath() @@ -63,13 +110,16 @@ std::string findFlash(const std::string& prefix, const std::string& names) name = name.replace(percent, 1, prefix); std::string fullpath = get_readonly_data_path(name); - if (file_exists(fullpath)) + if (hostfs::storage().exists(fullpath)) return fullpath; for (const auto& path : config::ContentPath.get()) { - fullpath = path + "/" + name; - if (file_exists(fullpath)) - return fullpath; + try { + fullpath = hostfs::storage().getSubPath(path, name); + if (hostfs::storage().exists(fullpath)) + return fullpath; + } catch (const hostfs::StorageException& e) { + } } start = semicolon; @@ -88,14 +138,14 @@ std::string getFlashSavePath(const std::string& prefix, const std::string& name) std::string findNaomiBios(const std::string& name) { std::string fullpath = get_readonly_data_path(name); - if (file_exists(fullpath)) + if (hostfs::storage().exists(fullpath)) return fullpath; for (const auto& path : config::ContentPath.get()) { try { fullpath = hostfs::storage().getSubPath(path, name); - hostfs::storage().getFileInfo(fullpath); - return fullpath; + if (hostfs::storage().exists(fullpath)) + return fullpath; } catch (const hostfs::StorageException& e) { } } @@ -113,10 +163,22 @@ std::string getSavestatePath(int index, bool writable) state_file = state_file + index_str + ".state"; if (index == -1) state_file += ".net"; - if (writable) + + static std::string lastFile; + static std::string lastPath; + + if (writable) { + lastFile.clear(); return get_writable_data_path(state_file); + } else - return get_readonly_data_path(state_file); + { + if (lastFile != state_file) { + lastFile = state_file; + lastPath = get_readonly_data_path(state_file); + } + return lastPath; + } } std::string getShaderCachePath(const std::string& filename) @@ -137,11 +199,197 @@ std::string getTextureDumpPath() return get_writable_data_path("texdump/"); } +#if defined(__unix__) && !defined(__ANDROID__) + +static std::string runCommand(const std::string& cmd) +{ + char buf[1024] {}; + FILE *fp = popen(cmd.c_str(), "r"); + if (fp == nullptr) { + INFO_LOG(COMMON, "popen failed: %d", errno); + return ""; + } + std::string result; + while (fgets(buf, sizeof(buf), fp) != nullptr) + result += trim_trailing_ws(buf, "\n"); + + int rc; + if ((rc = pclose(fp)) != 0) { + INFO_LOG(COMMON, "Command error: %d", rc); + return ""; + } + + return result; +} + +static std::string getScreenshotsPath() +{ + std::string picturesPath = runCommand("xdg-user-dir PICTURES"); + if (!picturesPath.empty()) + return picturesPath; + const char *home = nowide::getenv("HOME"); + if (home != nullptr) + return home; + else + return "."; +} + +#elif defined(TARGET_UWP) +//TODO move to shell/uwp? +using namespace Platform; +using namespace Windows::Foundation; +using namespace Windows::Storage; + +void saveScreenshot(const std::string& name, const std::vector& data) +{ + try { + StorageFolder^ folder = KnownFolders::PicturesLibrary; // or SavedPictures? + if (folder == nullptr) { + INFO_LOG(COMMON, "KnownFolders::PicturesLibrary is null"); + throw FlycastException("Can't find Pictures library"); + } + nowide::wstackstring wstr; + wchar_t *wname = wstr.convert(name.c_str()); + String^ msname = ref new String(wname); + ArrayReference arrayRef(const_cast(&data[0]), data.size()); + + IAsyncOperation^ op = folder->CreateFileAsync(msname, CreationCollisionOption::FailIfExists); + cResetEvent asyncEvent; + op->Completed = ref new AsyncOperationCompletedHandler( + [&asyncEvent, &arrayRef](IAsyncOperation^ op, AsyncStatus) { + IAsyncAction^ action = FileIO::WriteBytesAsync(op->GetResults(), arrayRef); + action->Completed = ref new AsyncActionCompletedHandler( + [&asyncEvent](IAsyncAction^, AsyncStatus){ + asyncEvent.Set(); + }); + }); + asyncEvent.Wait(); + } + catch (COMException^ e) { + WARN_LOG(COMMON, "Save screenshot failed: %S", e->Message->Data()); + throw FlycastException(""); + } +} + +#elif defined(_WIN32) && !defined(TARGET_UWP) + +static std::string getScreenshotsPath() +{ + wchar_t *screenshotPath; + if (FAILED(SHGetKnownFolderPath(FOLDERID_Screenshots, KF_FLAG_CREATE, NULL, &screenshotPath)) + && FAILED(SHGetKnownFolderPath(FOLDERID_Pictures, KF_FLAG_CREATE, NULL, &screenshotPath))) + return get_writable_config_path(""); + nowide::stackstring path; + std::string ret; + if (path.convert(screenshotPath) == nullptr) + ret = get_writable_config_path(""); + else + ret = path.get(); + CoTaskMemFree(screenshotPath); + + return ret; +} + +#else + +std::string getScreenshotsPath(); + +#endif + +#if !defined(__ANDROID__) && !defined(TARGET_UWP) && !defined(TARGET_IPHONE) && !defined(__SWITCH__) + +void saveScreenshot(const std::string& name, const std::vector& data) +{ + std::string path = getScreenshotsPath(); + path += "/" + name; + FILE *f = nowide::fopen(path.c_str(), "wb"); + if (f == nullptr) + throw FlycastException(path); + if (std::fwrite(&data[0], data.size(), 1, f) != 1) { + std::fclose(f); + unlink(path.c_str()); + throw FlycastException(path); + } + std::fclose(f); +} + +#endif + +#ifndef USE_LIBCDIO +const std::vector& getCdromDrives() { + static std::vector empty; + return empty; +} +#endif + +} // namespace hostfs + +void os_CreateWindow() +{ +#if defined(USE_SDL) + sdl_window_create(); +#elif defined(SUPPORT_X11) + x11_window_create(); +#endif +} + +void os_DestroyWindow() +{ +#if defined(USE_SDL) + sdl_window_destroy(); +#elif defined(SUPPORT_X11) + x11_window_destroy(); +#endif +} + +void os_SetupInput() +{ +#if defined(USE_SDL) + input_sdl_init(); +#else + #if defined(SUPPORT_X11) + input_x11_init(); + #endif + #if defined(USE_EVDEV) + input_evdev_init(); + #endif +#endif +#if defined(_WIN32) && !defined(TARGET_UWP) + if (config::UseRawInput) + rawinput::init(); +#endif +} + +void os_TermInput() +{ +#if defined(USE_SDL) + input_sdl_quit(); +#else + #if defined(USE_EVDEV) + input_evdev_close(); + #endif +#endif +#if defined(_WIN32) && !defined(TARGET_UWP) + if (config::UseRawInput) + rawinput::term(); +#endif +} + +void os_UpdateInputState() +{ + FC_PROFILE_SCOPE; + + GamepadDevice::RampAnalog(); +#if defined(USE_SDL) + input_sdl_handle(); +#elif defined(USE_EVDEV) + input_evdev_handle(); +#endif } #ifdef USE_BREAKPAD -#include "rend/boxart/http_client.h" +#include "http_client.h" #include "version.h" #include "log/InMemoryListener.h" #include "wsi/context.h" diff --git a/core/oslib/oslib.h b/core/oslib/oslib.h index 197d1bd88..e55fffea3 100644 --- a/core/oslib/oslib.h +++ b/core/oslib/oslib.h @@ -5,16 +5,30 @@ #include #endif -void os_SetWindowText(const char* text); -double os_GetSeconds(); - void os_DoEvents(); void os_CreateWindow(); +void os_DestroyWindow(); void os_SetupInput(); void os_TermInput(); +void os_UpdateInputState(); void os_InstallFaultHandler(); void os_UninstallFaultHandler(); void os_RunInstance(int argc, const char *argv[]); +void os_SetThreadName(const char *name); +void os_notify(const char *msg, int durationMs = 2000, const char *details = nullptr); + +// raii thread name setter +class ThreadName +{ +public: + ThreadName(const char *name) { + os_SetThreadName(name); + } + ~ThreadName() { + // default name + os_SetThreadName("flycast"); + } +}; #ifdef _MSC_VER #include @@ -33,7 +47,7 @@ u32 static inline bitscanrev(u32 v) namespace hostfs { - std::string getVmuPath(const std::string& port); + std::string getVmuPath(const std::string& port, bool save); std::string getArcadeFlashPath(); @@ -47,80 +61,14 @@ namespace hostfs std::string getTextureDumpPath(); std::string getShaderCachePath(const std::string& filename); -} - -#ifdef _WIN64 -#ifdef __MINGW64__ -struct _RUNTIME_FUNCTION; -typedef struct _RUNTIME_FUNCTION RUNTIME_FUNCTION; -#else -struct _IMAGE_RUNTIME_FUNCTION_ENTRY; -typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION; -#endif -#endif - -class UnwindInfo -{ -public: - virtual ~UnwindInfo() = default; - void start(void *address); - void pushReg(u32 offset, int reg); - void saveReg(u32 offset, int reg, int stackOffset); - void saveExtReg(u32 offset, int reg, int stackOffset); - void allocStack(u32 offset, int size); - void endProlog(u32 offset); - size_t end(u32 offset, ptrdiff_t rwRxOffset = 0); - - void clear(); - void allocStackPtr(const void *address, int size) { - allocStack((u32)((const u8 *)address - startAddr), size); - } - -protected: - virtual void registerFrame(void *frame); - virtual void deregisterFrame(void *frame); + void saveScreenshot(const std::string& name, const std::vector& data); -private: - u8 *startAddr; -#ifdef _WIN64 - std::vector tables; - std::vector codes; + const std::vector& getCdromDrives(); +#ifdef __ANDROID__ + void importHomeDirectory(); + void exportHomeDirectory(); #endif -#if defined(__unix__) || defined(__APPLE__) || defined(__SWITCH__) - int stackOffset = 0; - uintptr_t lastOffset = 0; - std::vector cieInstructions; - std::vector fdeInstructions; - std::vector registeredFrames; -#endif -}; - -#if HOST_CPU != CPU_X64 && HOST_CPU != CPU_ARM64 \ - && (HOST_CPU != CPU_X86 || defined(_WIN32)) \ - && (HOST_CPU != CPU_ARM || !defined(__ANDROID__)) -inline void UnwindInfo::start(void *address) { -} -inline void UnwindInfo::pushReg(u32 offset, int reg) { -} -inline void UnwindInfo::saveReg(u32 offset, int reg, int stackOffset) { -} -inline void UnwindInfo::saveExtReg(u32 offset, int reg, int stackOffset) { } -inline void UnwindInfo::allocStack(u32 offset, int size) { -} -inline void UnwindInfo::endProlog(u32 offset) { -} -inline size_t UnwindInfo::end(u32 offset, ptrdiff_t rwRxOffset) { - return 0; -} -inline void UnwindInfo::clear() { -} -inline void UnwindInfo::registerFrame(void *frame) { -} -inline void UnwindInfo::deregisterFrame(void *frame) { -} -#endif - static inline void *allocAligned(size_t alignment, size_t size) { diff --git a/core/oslib/resources.cpp b/core/oslib/resources.cpp new file mode 100644 index 000000000..de6394c72 --- /dev/null +++ b/core/oslib/resources.cpp @@ -0,0 +1,68 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "resources.h" +#include "archive/ZipArchive.h" +#include +#include +CMRC_DECLARE(flycast); + +namespace resource +{ + +std::unique_ptr load(const std::string& path, size_t& size) +{ + try { + cmrc::embedded_filesystem fs = cmrc::flycast::get_filesystem(); + std::string zipName = path + ".zip"; + if (fs.exists(zipName)) + { + cmrc::file zipFile = fs.open(zipName); + ZipArchive zip; + if (zip.Open(zipFile.cbegin(), zipFile.size())) + { + std::unique_ptr file; + file.reset(zip.OpenFirstFile()); + if (file != nullptr) + { + size = file->length(); + std::unique_ptr buffer = std::make_unique(size); + size = file->Read(buffer.get(), size); + + return buffer; + } + } + } + else + { + cmrc::file file = fs.open(path); + size = file.size(); + std::unique_ptr buffer = std::make_unique(size); + memcpy(buffer.get(), file.begin(), size); + + return buffer; + } + } catch (const std::system_error& e) { + } + INFO_LOG(COMMON, "Resource not found: %s", path.c_str()); + size = 0; + return nullptr; +} + +} + diff --git a/core/wsi/gl4funcs.cpp b/core/oslib/resources.h similarity index 80% rename from core/wsi/gl4funcs.cpp rename to core/oslib/resources.h index cf5a5a1a7..96f70ff0e 100644 --- a/core/wsi/gl4funcs.cpp +++ b/core/oslib/resources.h @@ -1,7 +1,5 @@ /* - Created on: Oct 18, 2019 - - Copyright 2019 flyinghead + Copyright 2024 flyinghead This file is part of Flycast. @@ -18,12 +16,13 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "types.h" +#include + +namespace resource +{ -#ifndef GLES -#if !defined(__APPLE__) -#undef ARRAY_SIZE // macros are evil -#include -#endif -#endif +std::unique_ptr load(const std::string& path, size_t& size); +} diff --git a/core/oslib/storage.cpp b/core/oslib/storage.cpp index e3c7055c5..dbb1546d9 100644 --- a/core/oslib/storage.cpp +++ b/core/oslib/storage.cpp @@ -40,7 +40,9 @@ CustomStorage& customStorage() std::string getParentPath(const std::string& path) override { die("Not implemented"); } std::string getSubPath(const std::string& reference, const std::string& relative) override { die("Not implemented"); } FileInfo getFileInfo(const std::string& path) override { die("Not implemented"); } - void addStorage(bool isDirectory, bool writeAccess, void (*callback)(bool cancelled, std::string selectedPath)) override { + bool exists(const std::string& path) override { die("Not implemented"); } + bool addStorage(bool isDirectory, bool writeAccess, const std::string& description, + void (*callback)(bool cancelled, std::string selectedPath), const std::string& mimeType) override { die("Not implemented"); } }; @@ -184,35 +186,79 @@ class StdStorage : public Storage #ifndef _WIN32 struct stat st; if (flycast::stat(path.c_str(), &st) != 0) { - INFO_LOG(COMMON, "Cannot stat file '%s' errno %d", path.c_str(), errno); + if (errno != ENOENT) + INFO_LOG(COMMON, "Cannot stat file '%s' errno %d", path.c_str(), errno); throw StorageException("Cannot stat " + path); } info.isDirectory = S_ISDIR(st.st_mode); info.size = st.st_size; + info.updateTime = st.st_mtime; #else // _WIN32 + std::string lpath(path); + if (path.length() == 2 && isalpha(path[0]) && path[1] == ':') + /* D: -> \\.\D:\ */ + lpath = "\\\\.\\" + path + "\\"; + else if (path.substr(0, 4) == "\\\\.\\" && path.length() == 6) + /* \\.\D: -> \\.\D:\ */ + lpath += "\\"; nowide::wstackstring wname; - if (wname.convert(path.c_str())) + if (wname.convert(lpath.c_str())) { - WIN32_FILE_ATTRIBUTE_DATA fileAttribs; - if (GetFileAttributesExW(wname.get(), GetFileExInfoStandard, &fileAttribs)) + if (lpath.substr(0, 4) == "\\\\.\\") { - info.isDirectory = (fileAttribs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; - info.size = fileAttribs.nFileSizeLow + ((u64)fileAttribs.nFileSizeHigh << 32); + // Win32 device namespace + UINT type = GetDriveTypeW(wname.get()); + if (type != DRIVE_CDROM) + throw StorageException("Invalid device " + lpath.substr(4, 2)); + info.isDirectory = false; + info.isWritable = false; } else { - INFO_LOG(COMMON, "Cannot get attrbutes of '%s' error 0x%x", path.c_str(), GetLastError()); - throw StorageException("Cannot get attributes of " + path); + WIN32_FILE_ATTRIBUTE_DATA fileAttribs; + if (GetFileAttributesExW(wname.get(), GetFileExInfoStandard, &fileAttribs)) + { + info.isDirectory = (fileAttribs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + info.size = fileAttribs.nFileSizeLow + ((u64)fileAttribs.nFileSizeHigh << 32); + u64 t = ((u64)fileAttribs.ftLastWriteTime.dwHighDateTime << 32) | fileAttribs.ftLastWriteTime.dwLowDateTime; + info.updateTime = t / 10000000 - 11644473600LL; // 100-nano to secs minus (unix epoch - windows epoch) + } + else + { + const int error = GetLastError(); + if (error != ERROR_FILE_NOT_FOUND && error != ERROR_PATH_NOT_FOUND) + INFO_LOG(COMMON, "Cannot get attributes of '%s' error 0x%x", lpath.c_str(), error); + _set_errno(error); + throw StorageException("Cannot get attributes of " + lpath); + } } } else { + _set_errno(EINVAL); throw StorageException("Invalid file name " + path); } #endif return info; } + bool exists(const std::string& path) override + { +#ifndef _WIN32 + struct stat st; + return flycast::stat(path.c_str(), &st) == 0; +#else // _WIN32 + nowide::wstackstring wname; + if (wname.convert(path.c_str())) + { + WIN32_FILE_ATTRIBUTE_DATA fileAttribs; + if (GetFileAttributesExW(wname.get(), GetFileExInfoStandard, &fileAttribs)) + return true; + } + return false; +#endif + } + private: std::vector listRoots() { @@ -314,6 +360,14 @@ FileInfo AllStorage::getFileInfo(const std::string& path) return stdStorage.getFileInfo(path); } +bool AllStorage::exists(const std::string& path) +{ + if (customStorage().isKnownPath(path)) + return customStorage().exists(path); + else + return stdStorage.exists(path); +} + std::string AllStorage::getDefaultDirectory() { std::string directory; @@ -358,9 +412,10 @@ AllStorage& storage() return storage; } -void addStorage(bool isDirectory, bool writeAccess, void (*callback)(bool cancelled, std::string selectedPath)) +bool addStorage(bool isDirectory, bool writeAccess, const std::string& description, + void (*callback)(bool cancelled, std::string selectedPath), const std::string& mimeType) { - customStorage().addStorage(isDirectory, writeAccess, callback); + return customStorage().addStorage(isDirectory, writeAccess, description, callback, mimeType); } } diff --git a/core/oslib/storage.h b/core/oslib/storage.h index e1d1b9811..47281dccc 100644 --- a/core/oslib/storage.h +++ b/core/oslib/storage.h @@ -27,14 +27,18 @@ namespace hostfs struct FileInfo { FileInfo() = default; - FileInfo(const std::string& name, const std::string& path, bool isDirectory, size_t size = 0, bool isWritable = false) - : name(name), path(path), isDirectory(isDirectory), size(size), isWritable(isWritable) {} + FileInfo(const std::string& name, const std::string& path, bool isDirectory, + size_t size = 0, bool isWritable = false, u64 updateTime = 0) + : name(name), path(path), isDirectory(isDirectory), size(size), + isWritable(isWritable), updateTime(updateTime) { + } std::string name; std::string path; bool isDirectory = false; size_t size = 0; bool isWritable = false; + u64 updateTime = 0; }; class StorageException : public FlycastException @@ -52,6 +56,7 @@ class Storage virtual std::string getParentPath(const std::string& path) = 0; virtual std::string getSubPath(const std::string& reference, const std::string& subpath) = 0; virtual FileInfo getFileInfo(const std::string& path) = 0; + virtual bool exists(const std::string& path) = 0; virtual ~Storage() = default; }; @@ -59,7 +64,8 @@ class Storage class CustomStorage : public Storage { public: - virtual void addStorage(bool isDirectory, bool writeAccess, void (*callback)(bool cancelled, std::string selectedPath)) = 0; + virtual bool addStorage(bool isDirectory, bool writeAccess, const std::string& description, + void (*callback)(bool cancelled, std::string selectedPath), const std::string& mimeType) = 0; }; class AllStorage : public Storage @@ -72,11 +78,13 @@ class AllStorage : public Storage std::string getParentPath(const std::string& path) override; std::string getSubPath(const std::string& reference, const std::string& subpath) override; FileInfo getFileInfo(const std::string& path) override; + bool exists(const std::string& path) override; std::string getDefaultDirectory(); }; AllStorage& storage(); -void addStorage(bool isDirectory, bool writeAccess, void (*callback)(bool cancelled, std::string selectedPath)); +bool addStorage(bool isDirectory, bool writeAccess, const std::string& description, + void (*callback)(bool cancelled, std::string selectedPath), const std::string& mimeType = {}); // iterate depth-first over the files contained in a folder hierarchy class DirectoryTree diff --git a/core/oslib/unwind_info.h b/core/oslib/unwind_info.h new file mode 100644 index 000000000..aa65ed672 --- /dev/null +++ b/core/oslib/unwind_info.h @@ -0,0 +1,70 @@ +#pragma once +#include "types.h" +#include + +#ifdef _WIN32 +#include +#endif + +class UnwindInfo +{ +public: + virtual ~UnwindInfo() = default; + void start(void *address); + void pushReg(u32 offset, int reg); + void saveReg(u32 offset, int reg, int stackOffset); + void saveExtReg(u32 offset, int reg, int stackOffset); + void allocStack(u32 offset, int size); + void endProlog(u32 offset); + size_t end(u32 offset, ptrdiff_t rwRxOffset = 0); + + void clear(); + void allocStackPtr(const void *address, int size) { + allocStack((u32)((const u8 *)address - startAddr), size); + } + +protected: + virtual void registerFrame(void *frame); + virtual void deregisterFrame(void *frame); + +private: + u8 *startAddr; +#ifdef _M_X64 + std::vector tables; + std::vector codes; +#endif +#if defined(__unix__) || defined(__APPLE__) || defined(__SWITCH__) + int stackOffset = 0; + uintptr_t lastOffset = 0; + std::vector cieInstructions; + std::vector fdeInstructions; + std::vector registeredFrames; +#endif +}; + +#if HOST_CPU != CPU_X64 \ + && (HOST_CPU != CPU_ARM64 || defined(_WIN32)) \ + && (HOST_CPU != CPU_X86 || defined(_WIN32)) \ + && (HOST_CPU != CPU_ARM || !defined(__ANDROID__)) +inline void UnwindInfo::start(void *address) { +} +inline void UnwindInfo::pushReg(u32 offset, int reg) { +} +inline void UnwindInfo::saveReg(u32 offset, int reg, int stackOffset) { +} +inline void UnwindInfo::saveExtReg(u32 offset, int reg, int stackOffset) { +} +inline void UnwindInfo::allocStack(u32 offset, int size) { +} +inline void UnwindInfo::endProlog(u32 offset) { +} +inline size_t UnwindInfo::end(u32 offset, ptrdiff_t rwRxOffset) { + return 0; +} +inline void UnwindInfo::clear() { +} +inline void UnwindInfo::registerFrame(void *frame) { +} +inline void UnwindInfo::deregisterFrame(void *frame) { +} +#endif diff --git a/core/oslib/virtmem.h b/core/oslib/virtmem.h index be2ad7c2f..79b774d95 100644 --- a/core/oslib/virtmem.h +++ b/core/oslib/virtmem.h @@ -1,3 +1,4 @@ +#pragma once #include "types.h" namespace virtmem diff --git a/core/profiler/fc_profiler.cpp b/core/profiler/fc_profiler.cpp index 3fa498daa..5128e8264 100644 --- a/core/profiler/fc_profiler.cpp +++ b/core/profiler/fc_profiler.cpp @@ -1,8 +1,8 @@ #include "fc_profiler.h" #include "log/LogManager.h" #include "cfg/option.h" -#include "imgui/imgui.h" -#include "implot/implot.h" +#include "imgui.h" +#include "implot.h" #include namespace fc_profiler diff --git a/core/rec-ARM/arm_unwind.h b/core/rec-ARM/arm_unwind.h index d425cef17..7eb32d00f 100644 --- a/core/rec-ARM/arm_unwind.h +++ b/core/rec-ARM/arm_unwind.h @@ -17,9 +17,23 @@ along with Flycast. If not, see . */ #pragma once -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" + +#ifdef _M_ARM +#pragma push_macro("MemoryBarrier") +#pragma push_macro("Yield") +#undef MemoryBarrier +#undef Yield +#endif + #include using namespace vixl::aarch32; + +#ifdef _M_ARM +#pragma pop_macro("MemoryBarrier") +#pragma pop_macro("Yield") +#endif + #include class ArmUnwindInfo : public UnwindInfo diff --git a/core/rec-ARM/rec_arm.cpp b/core/rec-ARM/rec_arm.cpp index b384df772..4552a3c5a 100644 --- a/core/rec-ARM/rec_arm.cpp +++ b/core/rec-ARM/rec_arm.cpp @@ -17,13 +17,27 @@ #include "types.h" #if FEAT_SHREC == DYNAREC_JIT && HOST_CPU == CPU_ARM +#ifndef _M_ARM #include +#endif #include #include +#ifdef _M_ARM +#pragma push_macro("MemoryBarrier") +#pragma push_macro("Yield") +#undef MemoryBarrier +#undef Yield +#endif + #include using namespace vixl::aarch32; +#ifdef _M_ARM +#pragma pop_macro("MemoryBarrier") +#pragma pop_macro("Yield") +#endif + #include "hw/sh4/sh4_opcode_list.h" #include "hw/sh4/sh4_mmr.h" @@ -36,6 +50,7 @@ using namespace vixl::aarch32; #include "cfg/option.h" #include "arm_unwind.h" #include "oslib/virtmem.h" +#include "emulator.h" //#define CANONICALTEST @@ -74,83 +89,46 @@ extern "C" char *stpcpy(char *dst, char const *src) } #endif -#undef do_sqw_nommu #define rcbOffset(x) (-sizeof(Sh4RCB) + offsetof(Sh4RCB, x)) +#define ctxOffset(x) (-sizeof(Sh4Context) + offsetof(Sh4Context, x)) -struct DynaRBI: RuntimeBlockInfo -{ - virtual u32 Relink(); - Register T_reg; -}; - -using FPBinOP = void (MacroAssembler::*)(DataType, SRegister, SRegister, SRegister); -using FPUnOP = void (MacroAssembler::*)(DataType, SRegister, SRegister); -using BinaryOP = void (MacroAssembler::*)(Register, Register, const Operand&); - -class Arm32Assembler : public MacroAssembler +struct DynaRBI : RuntimeBlockInfo { -public: - Arm32Assembler() = default; - Arm32Assembler(u8 *buffer, size_t size) : MacroAssembler(buffer, size, A32) {} + DynaRBI(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) + : sh4ctx(sh4ctx), codeBuffer(codeBuffer) {} + u32 Relink() override; - void Finalize() { - FinalizeCode(); - virtmem::flush_cache(GetBuffer()->GetStartAddress(), GetCursorAddress() - 1, - GetBuffer()->GetStartAddress(), GetCursorAddress() - 1); - } + Register T_reg; + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; }; -static Arm32Assembler ass; -static ArmUnwindInfo unwinder; -std::map ArmUnwindInfo::fdes; - -static void loadSh4Reg(Register Rt, u32 Sh4_Reg) -{ - const int shRegOffs = (u8*)GetRegPtr(Sh4_Reg) - (u8*)&p_sh4rcb->cntx - sizeof(Sh4cntx); - - ass.Ldr(Rt, MemOperand(r8, shRegOffs)); -} - -static void storeSh4Reg(Register Rt, u32 Sh4_Reg) -{ - const int shRegOffs = (u8*)GetRegPtr(Sh4_Reg) - (u8*)&p_sh4rcb->cntx - sizeof(Sh4cntx); +static std::map ccmap; +static std::map ccnmap; - ass.Str(Rt, MemOperand(r8, shRegOffs)); -} +static const void *no_update; +static const void *intc_sched; +static const void *ngen_blockcheckfail; +static const void *ngen_LinkBlock_Generic_stub; +static const void *ngen_LinkBlock_cond_Branch_stub; +static const void *ngen_LinkBlock_cond_Next_stub; +static void (*ngen_FailedToFindBlock_)(); +static void (*mainloop)(void *); +static void (*handleException)(); +static void (*checkBlockFpu)(); +static void (*checkBlockNoFpu)(); -const int alloc_regs[] = { 5, 6, 7, 9, 10, 11, -1 }; -const int alloc_regs_mmu[] = { 5, 6, 7, 10, 11, -1 }; -const int alloc_fpu[] = { 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, -1 }; +class Arm32Assembler; -struct arm_reg_alloc: RegAlloc +struct arm_reg_alloc : RegAlloc { - void Preload(u32 reg, int nreg) override - { - loadSh4Reg(Register(nreg), reg); - } - void Writeback(u32 reg, int nreg) override - { - if (reg == reg_pc_dyn) - // reg_pc_dyn has been stored in r4 by the jdyn op implementation - // No need to write it back since it won't be used past the end of the block - ; //ass.Mov(r4, Register(nreg)); - else - storeSh4Reg(Register(nreg), reg); - } + arm_reg_alloc(Arm32Assembler& ass) : ass(ass) {} - void Preload_FPU(u32 reg, int nreg) override - { - const s32 shRegOffs = (u8*)GetRegPtr(reg) - (u8*)&p_sh4rcb->cntx - sizeof(Sh4cntx); - - ass.Vldr(SRegister(nreg), MemOperand(r8, shRegOffs)); - } - void Writeback_FPU(u32 reg, int nreg) override - { - const s32 shRegOffs = (u8*)GetRegPtr(reg) - (u8*)&p_sh4rcb->cntx - sizeof(Sh4cntx); + void Preload(u32 reg, int nreg) override; + void Writeback(u32 reg, int nreg) override; - ass.Vstr(SRegister(nreg), MemOperand(r8, shRegOffs)); - } + void Preload_FPU(u32 reg, int nreg) override; + void Writeback_FPU(u32 reg, int nreg) override; SRegister mapFReg(const shil_param& prm, int index = 0) { @@ -160,223 +138,353 @@ struct arm_reg_alloc: RegAlloc { return Register(mapg(prm)); } -}; - -static arm_reg_alloc reg; - -static const void *no_update; -static const void *intc_sched; -static const void *ngen_blockcheckfail; -static const void *ngen_LinkBlock_Generic_stub; -static const void *ngen_LinkBlock_cond_Branch_stub; -static const void *ngen_LinkBlock_cond_Next_stub; -static void (*ngen_FailedToFindBlock_)(); -static void (*mainloop)(void *); -static void (*handleException)(); -static void (*checkBlockFpu)(); -static void (*checkBlockNoFpu)(); -static void generate_mainloop(); - -static std::map ccmap; -static std::map ccnmap; -static bool restarting; -static u32 jmp_stack; +private: + Arm32Assembler& ass; +}; -void ngen_mainloop(void* context) +enum mem_op_type { - do { - restarting = false; - generate_mainloop(); - - mainloop(context); - if (restarting) - p_sh4rcb->cntx.CpuRunning = 1; - } while (restarting); -} + SZ_8, + SZ_16, + SZ_32I, + SZ_32F, + SZ_64F, +}; -static void jump(const void *code, ConditionType cond = al) +class Arm32Assembler : public MacroAssembler { - ptrdiff_t offset = reinterpret_cast(code) - ass.GetBuffer()->GetStartAddress(); - verify((offset & 3) == 0); - if (offset < -32 * 1024 * 1024 || offset >= 32 * 1024 * 1024) + using FPBinOP = void (MacroAssembler::*)(DataType, SRegister, SRegister, SRegister); + using FPUnOP = void (MacroAssembler::*)(DataType, SRegister, SRegister); + using BinaryOP = void (MacroAssembler::*)(Register, Register, const Operand&); + +public: + Arm32Assembler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) + : MacroAssembler((u8 *)codeBuffer.get(), codeBuffer.getFreeSpace(), A32), sh4ctx(sh4ctx), codeBuffer(codeBuffer), reg(*this) {} + Arm32Assembler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer, u8 *buffer, size_t size) + : MacroAssembler(buffer, size, A32), sh4ctx(sh4ctx), codeBuffer(codeBuffer), reg(*this) {} + + void compile(RuntimeBlockInfo* block, bool force_checks, bool optimise); + void rewrite(Register raddr, Register rt, SRegister ft, DRegister fd, bool write, bool is_sq, mem_op_type optp); + void genMainLoop(); + void canonStart(const shil_opcode *op); + void canonParam(const shil_opcode *op, const shil_param *par, CanonicalParamType tp); + void canonCall(const shil_opcode *op, void *function); + void canonFinish(const shil_opcode *op); + + void loadSh4Reg(Register Rt, u32 Sh4_Reg) { - WARN_LOG(DYNAREC, "jump offset too large: %d", offset); - UseScratchRegisterScope scope(&ass); - Register reg = scope.Acquire(); - ass.Mov(cond, reg, (u32)code); - ass.Bx(cond, reg); + const int shRegOffs = getRegOffset((Sh4RegType)Sh4_Reg) - sizeof(Sh4Context); + + Ldr(Rt, MemOperand(r8, shRegOffs)); } - else + + void storeSh4Reg(Register Rt, u32 Sh4_Reg) { - Label code_label(offset); - ass.B(cond, &code_label); + const int shRegOffs = getRegOffset((Sh4RegType)Sh4_Reg) - sizeof(Sh4Context); + + Str(Rt, MemOperand(r8, shRegOffs)); } -} -static void call(const void *code, ConditionType cond = al) -{ - ptrdiff_t offset = reinterpret_cast(code) - ass.GetBuffer()->GetStartAddress(); - verify((offset & 3) == 0); - if (offset < -32 * 1024 * 1024 || offset >= 32 * 1024 * 1024) + void Finalize() { - WARN_LOG(DYNAREC, "call offset too large: %d", offset); - UseScratchRegisterScope scope(&ass); - Register reg = scope.Acquire(); - ass.Mov(cond, reg, (u32)code); - ass.Blx(cond, reg); + FinalizeCode(); + virtmem::flush_cache(GetBuffer()->GetStartAddress(), GetCursorAddress() - 1, + GetBuffer()->GetStartAddress(), GetCursorAddress() - 1); } - else + + void jump(const void *code, ConditionType cond = al) { - Label code_label(offset); - ass.Bl(cond, &code_label); + ptrdiff_t offset = reinterpret_cast(code) - GetBuffer()->GetStartAddress(); + verify((offset & 3) == 0); + if (offset < -32 * 1024 * 1024 || offset >= 32 * 1024 * 1024) + { + WARN_LOG(DYNAREC, "jump offset too large: %d", offset); + UseScratchRegisterScope scope(this); + Register reg = scope.Acquire(); + Mov(cond, reg, (u32)code); + Bx(cond, reg); + } + else + { + Label code_label(offset); + B(cond, &code_label); + } } -} -static u32 relinkBlock(DynaRBI *block) -{ - u32 start_offset = ass.GetCursorOffset(); - switch(block->BlockType) + void call(const void *code, ConditionType cond = al) { - case BET_Cond_0: - case BET_Cond_1: + ptrdiff_t offset = reinterpret_cast(code) - GetBuffer()->GetStartAddress(); + verify((offset & 3) == 0); + if (offset < -32 * 1024 * 1024 || offset >= 32 * 1024 * 1024) + { + WARN_LOG(DYNAREC, "call offset too large: %d", offset); + UseScratchRegisterScope scope(this); + Register reg = scope.Acquire(); + Mov(cond, reg, (u32)code); + Blx(cond, reg); + } + else + { + Label code_label(offset); + Bl(cond, &code_label); + } + } + + u32 relinkBlock(DynaRBI *block) { - //quick opt here: - //peek into reg alloc, store actual sr_T register to relink_data + u32 start_offset = GetCursorOffset(); + switch (block->BlockType) + { + case BET_Cond_0: + case BET_Cond_1: + { + //quick opt here: + //peek into reg alloc, store actual sr_T register to relink_data #ifndef CANONICALTEST - bool last_op_sets_flags = !block->has_jcond && !block->oplist.empty() && - block->oplist.back().rd._reg == reg_sr_T && ccmap.count(block->oplist.back().op); + bool last_op_sets_flags = !block->has_jcond && !block->oplist.empty() && + block->oplist.back().rd._reg == reg_sr_T && ccmap.count(block->oplist.back().op); #else - bool last_op_sets_flags = false; + bool last_op_sets_flags = false; #endif - ConditionType CC = eq; + ConditionType CC = eq; - if (last_op_sets_flags) - { - shilop op = block->oplist.back().op; + if (last_op_sets_flags) + { + shilop op = block->oplist.back().op; - if ((block->BlockType & 1) == 1) - CC = ccmap[op]; + if ((block->BlockType & 1) == 1) + CC = ccmap[op]; + else + CC = ccnmap[op]; + } else - CC = ccnmap[op]; - } - else - { - if (!block->has_jcond) { - if (block->T_reg.IsRegister()) + if (!block->has_jcond) { - ass.Mov(r4, block->T_reg); + if (block->T_reg.IsRegister()) + { + mov(r4, block->T_reg); + } + else + { + INFO_LOG(DYNAREC, "SLOW COND PATH %x", block->oplist.empty() ? -1 : block->oplist.back().op); + loadSh4Reg(r4, reg_sr_T); + } } + cmp(r4, block->BlockType & 1); + } + + if (!mmu_enabled()) + { + if (block->pBranchBlock) + jump((void *)block->pBranchBlock->code, CC); else - { - INFO_LOG(DYNAREC, "SLOW COND PATH %x", block->oplist.empty() ? -1 : block->oplist.back().op); - loadSh4Reg(r4, reg_sr_T); - } + call(ngen_LinkBlock_cond_Branch_stub, CC); + + if (block->pNextBlock) + jump((void *)block->pNextBlock->code); + else + call(ngen_LinkBlock_cond_Next_stub); + nop(); + nop(); + nop(); + nop(); } - ass.Cmp(r4, block->BlockType & 1); + else + { + mov(Condition(CC).Negate(), r4, block->NextBlock); + mov(CC, r4, block->BranchBlock); + storeSh4Reg(r4, reg_nextpc); + jump(no_update); + } + break; } - if (!mmu_enabled()) - { - if (block->pBranchBlock) - jump((void *)block->pBranchBlock->code, CC); + case BET_DynamicRet: + case BET_DynamicCall: + case BET_DynamicJump: + if (!mmu_enabled()) + { + sub(r2, r8, -rcbOffset(fpcb)); + ubfx(r1, r4, 1, 24); + ldr(pc, MemOperand(r2, r1, LSL, 2)); + } else - call(ngen_LinkBlock_cond_Branch_stub, CC); + { + storeSh4Reg(r4, reg_nextpc); + jump(no_update); + } + break; - if (block->pNextBlock) - jump((void *)block->pNextBlock->code); + case BET_StaticCall: + case BET_StaticJump: + if (!mmu_enabled()) + { + if (block->pBranchBlock == nullptr) + call(ngen_LinkBlock_Generic_stub); + else + call((void *)block->pBranchBlock->code); + nop(); + nop(); + nop(); + } else - call(ngen_LinkBlock_cond_Next_stub); - ass.Nop(); - ass.Nop(); - ass.Nop(); - ass.Nop(); - } - else - { - ass.Mov(Condition(CC).Negate(), r4, block->NextBlock); - ass.Mov(CC, r4, block->BranchBlock); - storeSh4Reg(r4, reg_nextpc); - jump(no_update); - } - break; - } + { + mov(r4, block->BranchBlock); + storeSh4Reg(r4, reg_nextpc); + jump(no_update); + } - case BET_DynamicRet: - case BET_DynamicCall: - case BET_DynamicJump: - if (!mmu_enabled()) - { - ass.Sub(r2, r8, -rcbOffset(fpcb)); - ass.Ubfx(r1, r4, 1, 24); - ass.Ldr(pc, MemOperand(r2, r1, LSL, 2)); - } - else - { - storeSh4Reg(r4, reg_nextpc); - jump(no_update); - } - break; + break; + + case BET_StaticIntr: + case BET_DynamicIntr: + if (block->BlockType == BET_StaticIntr) + mov(r4, block->NextBlock); + //else -> already in r4 djump ! - case BET_StaticCall: - case BET_StaticJump: - if (!mmu_enabled()) - { - if (block->pBranchBlock == nullptr) - call(ngen_LinkBlock_Generic_stub); - else - call((void *)block->pBranchBlock->code); - ass.Nop(); - ass.Nop(); - ass.Nop(); - } - else - { - ass.Mov(r4, block->BranchBlock); storeSh4Reg(r4, reg_nextpc); + call((void *)UpdateINTC); + loadSh4Reg(r4, reg_nextpc); jump(no_update); + break; + + default: + ERROR_LOG(DYNAREC, "Error, Relink() Block Type: %X", block->BlockType); + verify(false); + break; } + return GetCursorOffset() - start_offset; + } + +private: + Register GetParam(const shil_param& param, Register raddr = r0); + void binaryOp(shil_opcode* op, BinaryOP dtop); + void binaryFpOp(shil_opcode* op, FPBinOP fpop); + void unaryFpOp(shil_opcode* op, FPUnOP fpop); + void vmem_slowpath(Register raddr, Register rt, SRegister ft, DRegister fd, mem_op_type optp, bool read); + Register GenMemAddr(shil_opcode* op, Register raddr = r0); + bool readMemImmediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise); + bool writeMemImmediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise); + void genMmuLookup(RuntimeBlockInfo* block, const shil_opcode& op, u32 write, Register& raddr); + void compileOp(RuntimeBlockInfo* block, shil_opcode* op, bool optimise); + + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; + arm_reg_alloc reg; + struct CC_PS + { + CanonicalParamType type; + const shil_param* par; + }; + std::vector CC_pars; +}; - break; +void arm_reg_alloc::Preload(u32 reg, int nreg) +{ + ass.loadSh4Reg(Register(nreg), reg); +} +void arm_reg_alloc::Writeback(u32 reg, int nreg) +{ + if (reg == reg_pc_dyn) + // reg_pc_dyn has been stored in r4 by the jdyn op implementation + // No need to write it back since it won't be used past the end of the block + ; //ass.Mov(r4, Register(nreg)); + else + ass.storeSh4Reg(Register(nreg), reg); +} - case BET_StaticIntr: - case BET_DynamicIntr: - if (block->BlockType == BET_StaticIntr) - ass.Mov(r4, block->NextBlock); - //else -> already in r4 djump ! +void arm_reg_alloc::Preload_FPU(u32 reg, int nreg) +{ + const s32 shRegOffs = getRegOffset((Sh4RegType)reg) - sizeof(Sh4Context); - storeSh4Reg(r4, reg_nextpc); - call((void *)UpdateINTC); - loadSh4Reg(r4, reg_nextpc); - jump(no_update); - break; + ass.Vldr(SRegister(nreg), MemOperand(r8, shRegOffs)); +} +void arm_reg_alloc::Writeback_FPU(u32 reg, int nreg) +{ + const s32 shRegOffs = getRegOffset((Sh4RegType)reg) - sizeof(Sh4Context); - default: - ERROR_LOG(DYNAREC, "Error, Relink() Block Type: %X", block->BlockType); - verify(false); - break; - } - return ass.GetCursorOffset() - start_offset; + ass.Vstr(SRegister(nreg), MemOperand(r8, shRegOffs)); } +static ArmUnwindInfo unwinder; +std::map ArmUnwindInfo::fdes; + +static u32 jmp_stack; + +class Arm32Dynarec : public Sh4Dynarec +{ +public: + Arm32Dynarec() { + sh4Dynarec = this; + } + + void init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) override; + void reset() override; + RuntimeBlockInfo *allocateBlock() override; + void handleException(host_context_t &context) override; + bool rewrite(host_context_t& context, void *faultAddress) override; + + void mainloop(void* context) override + { + do { + restarting = false; + generate_mainloop(); + + ::mainloop(context); + if (restarting && !emu.restartCpu()) + restarting = false; + } while (restarting); + } + + void compile(RuntimeBlockInfo* block, bool smc_check, bool optimise) override { + ass = new Arm32Assembler(*sh4ctx, *codeBuffer); + ass->compile(block, smc_check, optimise); + delete ass; + ass = nullptr; + } + + void canonStart(const shil_opcode *op) override { + ass->canonStart(op); + } + void canonParam(const shil_opcode *op, const shil_param *param, CanonicalParamType paramType) override { + ass->canonParam(op, param, paramType); + } + void canonCall(const shil_opcode *op, void *function)override { + ass->canonCall(op, function); + } + void canonFinish(const shil_opcode *op) override { + ass->canonFinish(op); + } + +private: + void generate_mainloop(); + + Sh4Context *sh4ctx = nullptr; + Sh4CodeBuffer *codeBuffer = nullptr; + bool restarting = false; + Arm32Assembler *ass = nullptr; +}; +static Arm32Dynarec instance; + u32 DynaRBI::Relink() { - ass = Arm32Assembler((u8 *)code + relink_offset, host_code_size - relink_offset); + Arm32Assembler ass(sh4ctx, codeBuffer, (u8 *)code + relink_offset, host_code_size - relink_offset); - u32 size = relinkBlock(this); + u32 size = ass.relinkBlock(this); ass.Finalize(); return size; } -static Register GetParam(const shil_param& param, Register raddr = r0) +Register Arm32Assembler::GetParam(const shil_param& param, Register raddr) { if (param.is_imm()) { - ass.Mov(raddr, param._imm); + Mov(raddr, param._imm); return raddr; } if (param.is_r32i()) @@ -386,7 +494,7 @@ static Register GetParam(const shil_param& param, Register raddr = r0) return Register(); } -static void ngen_Binary(shil_opcode* op, BinaryOP dtop) +void Arm32Assembler::binaryOp(shil_opcode* op, BinaryOP dtop) { Register rs1 = GetParam(op->rs1); @@ -395,10 +503,10 @@ static void ngen_Binary(shil_opcode* op, BinaryOP dtop) { if (ImmediateA32::IsImmediateA32(op->rs2._imm)) { - (ass.*dtop)(reg.mapReg(op->rd), rs1, Operand(op->rs2._imm)); + ((*this).*dtop)(reg.mapReg(op->rd), rs1, Operand(op->rs2._imm)); return; } - ass.Mov(rs2, op->rs2._imm); + Mov(rs2, op->rs2._imm); } else if (op->rs2.is_r32i()) { @@ -410,16 +518,16 @@ static void ngen_Binary(shil_opcode* op, BinaryOP dtop) verify(false); } - (ass.*dtop)(reg.mapReg(op->rd), rs1, rs2); + ((*this).*dtop)(reg.mapReg(op->rd), rs1, rs2); } -static void ngen_fp_bin(shil_opcode* op, FPBinOP fpop) +void Arm32Assembler::binaryFpOp(shil_opcode* op, FPBinOP fpop) { SRegister rs1 = s0; if (op->rs1.is_imm()) { - ass.Mov(r0, op->rs1._imm); - ass.Vmov(rs1, r0); + Mov(r0, op->rs1._imm); + Vmov(rs1, r0); } else { @@ -429,35 +537,28 @@ static void ngen_fp_bin(shil_opcode* op, FPBinOP fpop) SRegister rs2 = s1; if (op->rs2.is_imm()) { - ass.Mov(r0, op->rs2._imm); - ass.Vmov(rs2, r0); + Mov(r0, op->rs2._imm); + Vmov(rs2, r0); } else { rs2 = reg.mapFReg(op->rs2); } - (ass.*fpop)(DataType(F32), reg.mapFReg(op->rd), rs1, rs2); + ((*this).*fpop)(DataType(F32), reg.mapFReg(op->rd), rs1, rs2); } -static void ngen_fp_una(shil_opcode* op, FPUnOP fpop) +void Arm32Assembler::unaryFpOp(shil_opcode* op, FPUnOP fpop) { - (ass.*fpop)(DataType(F32), reg.mapFReg(op->rd), reg.mapFReg(op->rs1)); + ((*this).*fpop)(DataType(F32), reg.mapFReg(op->rd), reg.mapFReg(op->rs1)); } -struct CC_PS -{ - CanonicalParamType type; - shil_param* par; -}; -static std::vector CC_pars; - -void ngen_CC_Start(shil_opcode* op) +void Arm32Assembler::canonStart(const shil_opcode *op) { CC_pars.clear(); } -void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) +void Arm32Assembler::canonParam(const shil_opcode *op, const shil_param *par, CanonicalParamType tp) { switch(tp) { @@ -465,30 +566,31 @@ void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) #ifdef __ARM_PCS_VFP // -mfloat-abi=hard if (reg.IsAllocg(*par)) - ass.Vmov(reg.mapReg(*par), s0); + Vmov(reg.mapReg(*par), s0); else if (reg.IsAllocf(*par)) - ass.Vmov(reg.mapFReg(*par), s0); + Vmov(reg.mapFReg(*par), s0); break; #endif case CPT_u32rv: case CPT_u64rvL: if (reg.IsAllocg(*par)) - ass.Mov(reg.mapReg(*par), r0); + Mov(reg.mapReg(*par), r0); else if (reg.IsAllocf(*par)) - ass.Vmov(reg.mapFReg(*par), r0); + Vmov(reg.mapFReg(*par), r0); else die("unhandled param"); break; case CPT_u64rvH: verify(reg.IsAllocg(*par)); - ass.Mov(reg.mapReg(*par), r1); + Mov(reg.mapReg(*par), r1); break; case CPT_u32: case CPT_ptr: case CPT_f32: + case CPT_sh4ctx: { CC_PS t = { tp, par }; CC_pars.push_back(t); @@ -501,7 +603,7 @@ void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) } } -void ngen_CC_Call(shil_opcode* op, void* function) +void Arm32Assembler::canonCall(const shil_opcode *op, void *function) { Register rd = r0; SRegister fd = s0; @@ -511,7 +613,11 @@ void ngen_CC_Call(shil_opcode* op, void* function) CC_PS& param = CC_pars[i]; if (param.type == CPT_ptr) { - ass.Mov(rd, (u32)param.par->reg_ptr()); + Mov(rd, (u32)param.par->reg_ptr(sh4ctx)); + } + else if (param.type == CPT_sh4ctx) + { + Mov(rd, reinterpret_cast(&sh4ctx)); } else { @@ -522,9 +628,9 @@ void ngen_CC_Call(shil_opcode* op, void* function) if (param.type == CPT_f32) { if (reg.IsAllocg(*param.par)) - ass.Vmov(fd, reg.mapReg(*param.par)); + Vmov(fd, reg.mapReg(*param.par)); else if (reg.IsAllocf(*param.par)) - ass.Vmov(fd, reg.mapFReg(*param.par)); + Vmov(fd, reg.mapFReg(*param.par)); else die("Must not happen!"); continue; @@ -532,16 +638,16 @@ void ngen_CC_Call(shil_opcode* op, void* function) #endif if (reg.IsAllocg(*param.par)) - ass.Mov(rd, reg.mapReg(*param.par)); + Mov(rd, reg.mapReg(*param.par)); else if (reg.IsAllocf(*param.par)) - ass.Vmov(rd, reg.mapFReg(*param.par)); + Vmov(rd, reg.mapFReg(*param.par)); else die("Must not happen!"); } else { verify(param.par->is_imm()); - ass.Mov(rd, param.par->_imm); + Mov(rd, param.par->_imm); } } rd = Register(rd.GetCode() + 1); @@ -554,27 +660,18 @@ void ngen_CC_Call(shil_opcode* op, void* function) if (ccParam.type == CPT_ptr && prm.count() == 2 && reg.IsAllocf(prm) && (op->rd._reg == prm._reg || op->rd2._reg == prm._reg)) { // fsca rd param is a pointer to a 64-bit reg so reload the regs if allocated - const int shRegOffs = (u8*)GetRegPtr(prm._reg) - (u8*)&p_sh4rcb->cntx - sizeof(Sh4cntx); - ass.Vldr(reg.mapFReg(prm, 0), MemOperand(r8, shRegOffs)); - ass.Vldr(reg.mapFReg(prm, 1), MemOperand(r8, shRegOffs + 4)); + const int shRegOffs = prm.reg_nofs(); + Vldr(reg.mapFReg(prm, 0), MemOperand(r8, shRegOffs)); + Vldr(reg.mapFReg(prm, 1), MemOperand(r8, shRegOffs + 4)); } } } -void ngen_CC_Finish(shil_opcode* op) +void Arm32Assembler::canonFinish(const shil_opcode *op) { CC_pars.clear(); } -enum mem_op_type -{ - SZ_8, - SZ_16, - SZ_32I, - SZ_32F, - SZ_64F, -}; - static mem_op_type memop_type(shil_opcode* op) { bool fp32 = op->rs2.is_r32f() || op->rd.is_r32f(); @@ -601,73 +698,19 @@ const void * const _mem_func[2][2] = { (void *)addrspace::read32, (void *)addrspace::read64 }, }; -const struct -{ - u32 mask; - u32 key; - bool read; - mem_op_type optp; - u32 offs; -} -op_table[] = -{ - //LDRSB - { 0x0E500FF0, 0x001000D0, true, SZ_8, 1 }, - //LDRSH - { 0x0E500FF0, 0x001000F0, true, SZ_16, 1 }, - //LDR - { 0x0E500010, 0x06100000, true, SZ_32I, 1 }, - //VLDR.32 - { 0x0F300F00, 0x0D100A00, true, SZ_32F, 2 }, - //VLDR.64 - { 0x0F300F00, 0x0D100B00, true, SZ_64F, 2 }, - - // - //STRB - { 0x0FF00010, 0x07C00000, false, SZ_8, 1 }, - //STRH - { 0x0FF00FF0, 0x018000B0, false, SZ_16, 1 }, - //STR - { 0x0E500010, 0x06000000, false, SZ_32I, 1 }, - //VSTR.32 - { 0x0F300F00, 0x0D000A00, false, SZ_32F, 2 }, - //VSTR.64 - { 0x0F300F00, 0x0D000B00, false, SZ_64F, 2 }, - - { 0, 0 }, -}; - -union arm_mem_op -{ - struct - { - u32 Ra:4; - u32 pad0:8; - u32 Rt:4; - u32 Rn:4; - u32 pad1:2; - u32 D:1; - u32 pad3:1; - u32 pad4:4; - u32 cond:4; - }; - - u32 full; -}; - -static void vmem_slowpath(Register raddr, Register rt, SRegister ft, DRegister fd, mem_op_type optp, bool read) +void Arm32Assembler::vmem_slowpath(Register raddr, Register rt, SRegister ft, DRegister fd, mem_op_type optp, bool read) { if (!raddr.Is(r0)) - ass.Mov(r0, raddr); + Mov(r0, raddr); if (!read) { if (optp <= SZ_32I) - ass.Mov(r1, rt); + Mov(r1, rt); else if (optp == SZ_32F) - ass.Vmov(r1, ft); + Vmov(r1, ft); else if (optp == SZ_64F) - ass.Vmov(r2, r3, fd); + Vmov(r2, r3, fd); } const void *funct = nullptr; @@ -683,21 +726,81 @@ static void vmem_slowpath(Register raddr, Register rt, SRegister ft, DRegister f if (read) { if (optp <= SZ_32I) - ass.Mov(rt, r0); + Mov(rt, r0); else if (optp == SZ_32F) - ass.Vmov(ft, r0); + Vmov(ft, r0); else if (optp == SZ_64F) - ass.Vmov(fd, r0, r1); + Vmov(fd, r0, r1); } } -bool ngen_Rewrite(host_context_t &context, void *faultAddress) +bool Arm32Dynarec::rewrite(host_context_t& context, void *faultAddress) { + static constexpr struct + { + u32 mask; + u32 key; + bool read; + mem_op_type optp; + u32 offs; + } + op_table[] = + { + //LDRSB + { 0x0E500FF0, 0x001000D0, true, SZ_8, 1 }, + //LDRSH + { 0x0E500FF0, 0x001000F0, true, SZ_16, 1 }, + //LDR + { 0x0E500010, 0x06100000, true, SZ_32I, 1 }, + //VLDR.32 + { 0x0F300F00, 0x0D100A00, true, SZ_32F, 2 }, + //VLDR.64 + { 0x0F300F00, 0x0D100B00, true, SZ_64F, 2 }, + + // + //STRB + { 0x0FF00010, 0x07C00000, false, SZ_8, 1 }, + //STRH + { 0x0FF00FF0, 0x018000B0, false, SZ_16, 1 }, + //STR + { 0x0E500010, 0x06000000, false, SZ_32I, 1 }, + //VSTR.32 + { 0x0F300F00, 0x0D000A00, false, SZ_32F, 2 }, + //VSTR.64 + { 0x0F300F00, 0x0D000B00, false, SZ_64F, 2 }, + + { 0, 0 }, + }; + + union arm_mem_op + { + struct + { + u32 Ra:4; + u32 pad0:8; + u32 Rt:4; + u32 Rn:4; + u32 pad1:2; + u32 D:1; + u32 pad3:1; + u32 pad4:4; + u32 cond:4; + }; + + u32 full; + }; + + if (codeBuffer == nullptr) + // init() not called yet + return false; + if ((u8 *)context.pc < (u8 *)codeBuffer->getBase() + || (u8 *)context.pc >= (u8 *)codeBuffer->getBase() + codeBuffer->getSize()) + return false; u32 *regs = context.reg; arm_mem_op *ptr = (arm_mem_op *)context.pc; mem_op_type optp; - u32 read; + bool read; s32 offs = -1; u32 fop = ptr[0].full; @@ -750,32 +853,41 @@ bool ngen_Rewrite(host_context_t &context, void *faultAddress) u32 fault_offs = (uintptr_t)faultAddress - regs[8]; bool is_sq = (sh4_addr >> 26) == 0x38; - ass = Arm32Assembler((u8 *)ptr, 12); - // fault offset must always be the addr from ubfx (sanity check) // ignore last 2 bits zeroed to avoid sigbus errors verify(fault_offs == 0 || (fault_offs & ~3) == (sh4_addr & 0x1FFFFFFC)); - if (is_sq && !read && optp >= SZ_32I) + ass = new Arm32Assembler(*sh4ctx, *codeBuffer, (u8 *)ptr, 12); + ass->rewrite(raddr, rt, ft, fd, !read, is_sq, optp); + delete ass; + ass = nullptr; + context.pc = (size_t)ptr; + + return true; +} + +void Arm32Assembler::rewrite(Register raddr, Register rt, SRegister ft, DRegister fd, bool write, bool is_sq, mem_op_type optp) +{ + if (is_sq && write && optp >= SZ_32I) { if (optp >= SZ_32F) { if (!raddr.Is(r0)) - ass.Mov(r0, raddr); + Mov(r0, raddr); else - ass.Nop(); + Nop(); raddr = r0; } switch (optp) { case SZ_32I: - ass.Mov(r1, rt); + Mov(r1, rt); break; case SZ_32F: - ass.Vmov(r1, ft); + Vmov(r1, ft); break; case SZ_64F: - ass.Vmov(r2, r3, fd); + Vmov(r2, r3, fd); break; default: break; @@ -789,65 +901,61 @@ bool ngen_Rewrite(host_context_t &context, void *faultAddress) if (optp >= SZ_32F) { if (!raddr.Is(r0)) - ass.Mov(r0, raddr); + Mov(r0, raddr); else - ass.Nop(); + Nop(); } - if (!read) + if (write) { if (optp <= SZ_32I) - ass.Mov(r1, rt); + Mov(r1, rt); else if (optp == SZ_32F) - ass.Vmov(r1, ft); + Vmov(r1, ft); else if (optp == SZ_64F) - ass.Vmov(r2, r3, fd); + Vmov(r2, r3, fd); } - const void *funct = nullptr; + const void *funct; - if (offs == 1) - funct = _mem_hndl[read][optp][raddr.GetCode()]; - else if (optp >= SZ_32F) - funct = _mem_func[read][optp - SZ_32F]; + if (optp >= SZ_32F) + funct = _mem_func[!write][optp - SZ_32F]; + else + funct = _mem_hndl[!write][optp][raddr.GetCode()]; - verify(funct != nullptr); call(funct); - if (read) + if (!write) { if (optp <= SZ_32I) - ass.Mov(rt, r0); + Mov(rt, r0); else if (optp == SZ_32F) - ass.Vmov(ft, r0); + Vmov(ft, r0); else if (optp == SZ_64F) - ass.Vmov(fd, r0, r1); + Vmov(fd, r0, r1); } } - ass.Finalize(); - context.pc = (size_t)ptr; - - return true; + Finalize(); } -static Register GenMemAddr(shil_opcode* op, Register raddr = r0) +Register Arm32Assembler::GenMemAddr(shil_opcode* op, Register raddr) { if (op->rs3.is_imm()) { if (ImmediateA32::IsImmediateA32(op->rs3._imm)) { - ass.Add(raddr, reg.mapReg(op->rs1), op->rs3._imm); + Add(raddr, reg.mapReg(op->rs1), op->rs3._imm); } else { - ass.Mov(r1, op->rs3._imm); - ass.Add(raddr, reg.mapReg(op->rs1), r1); + Mov(r1, op->rs3._imm); + Add(raddr, reg.mapReg(op->rs1), r1); } } else if (op->rs3.is_r32i()) { - ass.Add(raddr, reg.mapReg(op->rs1), reg.mapReg(op->rs3)); + Add(raddr, reg.mapReg(op->rs1), reg.mapReg(op->rs3)); } else if (!op->rs3.is_null()) { @@ -856,7 +964,7 @@ static Register GenMemAddr(shil_opcode* op, Register raddr = r0) } else if (op->rs1.is_imm()) { - ass.Mov(raddr, op->rs1._imm); + Mov(raddr, op->rs1._imm); } else { @@ -866,7 +974,7 @@ static Register GenMemAddr(shil_opcode* op, Register raddr = r0) return raddr; } -static bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) +bool Arm32Assembler::readMemImmediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) { if (!op->rs1.is_imm()) return false; @@ -884,35 +992,35 @@ static bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool { if (optp == SZ_32F || optp == SZ_64F) ptr = (void *)((uintptr_t)ptr & ~3); - ass.Mov(r0, (u32)ptr); + Mov(r0, (u32)ptr); switch(optp) { case SZ_8: - ass.Ldrsb(rd, MemOperand(r0)); + Ldrsb(rd, MemOperand(r0)); break; case SZ_16: - ass.Ldrsh(rd, MemOperand(r0)); + Ldrsh(rd, MemOperand(r0)); break; case SZ_32I: - ass.Ldr(rd, MemOperand(r0)); + Ldr(rd, MemOperand(r0)); break; case SZ_32F: - ass.Vldr(reg.mapFReg(op->rd), MemOperand(r0)); + Vldr(reg.mapFReg(op->rd), MemOperand(r0)); break; case SZ_64F: if (reg.IsAllocf(op->rd)) { - ass.Vldr(reg.mapFReg(op->rd, 0), MemOperand(r0)); - ass.Vldr(reg.mapFReg(op->rd, 1), MemOperand(r0, 4)); + Vldr(reg.mapFReg(op->rd, 0), MemOperand(r0)); + Vldr(reg.mapFReg(op->rd, 1), MemOperand(r0, 4)); } else { - ass.Vldr(d0, MemOperand(r0)); - ass.Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); + Vldr(d0, MemOperand(r0)); + Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); } break; } @@ -923,33 +1031,33 @@ static bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool if (optp == SZ_64F) { // Need to call the handler twice - ass.Mov(r0, op->rs1._imm); + Mov(r0, op->rs1._imm); call(ptr); if (reg.IsAllocf(op->rd)) - ass.Vmov(reg.mapFReg(op->rd, 0), r0); + Vmov(reg.mapFReg(op->rd, 0), r0); else - ass.Str(r0, MemOperand(r8, op->rd.reg_nofs())); + Str(r0, MemOperand(r8, op->rd.reg_nofs())); - ass.Mov(r0, op->rs1._imm + 4); + Mov(r0, op->rs1._imm + 4); call(ptr); if (reg.IsAllocf(op->rd)) - ass.Vmov(reg.mapFReg(op->rd, 1), r0); + Vmov(reg.mapFReg(op->rd, 1), r0); else - ass.Str(r0, MemOperand(r8, op->rd.reg_nofs() + 4)); + Str(r0, MemOperand(r8, op->rd.reg_nofs() + 4)); } else { - ass.Mov(r0, op->rs1._imm); + Mov(r0, op->rs1._imm); call(ptr); switch(optp) { case SZ_8: - ass.Sxtb(r0, r0); + Sxtb(r0, r0); break; case SZ_16: - ass.Sxth(r0, r0); + Sxth(r0, r0); break; case SZ_32I: @@ -962,9 +1070,9 @@ static bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool } if (reg.IsAllocg(op->rd)) - ass.Mov(rd, r0); + Mov(rd, r0); else if (reg.IsAllocf(op->rd)) - ass.Vmov(reg.mapFReg(op->rd), r0); + Vmov(reg.mapFReg(op->rd), r0); else die("Unsupported"); } @@ -973,7 +1081,7 @@ static bool ngen_readm_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool return true; } -static bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) +bool Arm32Assembler::writeMemImmediate(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) { if (!op->rs1.is_imm()) return false; @@ -988,7 +1096,7 @@ static bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bo Register rs2 = r1; SRegister rs2f = s0; if (op->rs2.is_imm()) - ass.Mov(rs2, op->rs2._imm); + Mov(rs2, op->rs2._imm); else if (optp == SZ_32F) rs2f = reg.mapFReg(op->rs2); else if (optp != SZ_64F) @@ -998,35 +1106,35 @@ static bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bo { if (optp == SZ_32F || optp == SZ_64F) ptr = (void *)((uintptr_t)ptr & ~3); - ass.Mov(r0, (u32)ptr); + Mov(r0, (u32)ptr); switch(optp) { case SZ_8: - ass.Strb(rs2, MemOperand(r0)); + Strb(rs2, MemOperand(r0)); break; case SZ_16: - ass.Strh(rs2, MemOperand(r0)); + Strh(rs2, MemOperand(r0)); break; case SZ_32I: - ass.Str(rs2, MemOperand(r0)); + Str(rs2, MemOperand(r0)); break; case SZ_32F: - ass.Vstr(rs2f, MemOperand(r0)); + Vstr(rs2f, MemOperand(r0)); break; case SZ_64F: if (reg.IsAllocf(op->rs2)) { - ass.Vstr(reg.mapFReg(op->rs2, 0), MemOperand(r0)); - ass.Vstr(reg.mapFReg(op->rs2, 1), MemOperand(r0, 4)); + Vstr(reg.mapFReg(op->rs2, 0), MemOperand(r0)); + Vstr(reg.mapFReg(op->rs2, 1), MemOperand(r0, 4)); } else { - ass.Vldr(d0, MemOperand(r8, op->rs2.reg_nofs())); - ass.Vstr(d0, MemOperand(r0)); + Vldr(d0, MemOperand(r8, op->rs2.reg_nofs())); + Vstr(d0, MemOperand(r0)); } break; @@ -1039,46 +1147,50 @@ static bool ngen_writemem_immediate(RuntimeBlockInfo* block, shil_opcode* op, bo { if (optp == SZ_64F) die("SZ_64F not supported"); - ass.Mov(r0, op->rs1._imm); - if (optp == SZ_32F) - ass.Vmov(r1, rs2f); + Mov(r0, op->rs1._imm); + if (optp == SZ_8) + Uxtb(r1, rs2); + else if (optp == SZ_16) + Uxth(r1, rs2); + else if (optp == SZ_32F) + Vmov(r1, rs2f); else if (!rs2.Is(r1)) - ass.Mov(r1, rs2); + Mov(r1, rs2); call(ptr); } return true; } -static void genMmuLookup(RuntimeBlockInfo* block, const shil_opcode& op, u32 write, Register& raddr) +void Arm32Assembler::genMmuLookup(RuntimeBlockInfo* block, const shil_opcode& op, u32 write, Register& raddr) { if (mmu_enabled()) { Label inCache; Label done; - ass.Lsr(r1, raddr, 12); - ass.Ldr(r1, MemOperand(r9, r1, LSL, 2)); - ass.Cmp(r1, 0); - ass.B(ne, &inCache); + Lsr(r1, raddr, 12); + Ldr(r1, MemOperand(r9, r1, LSL, 2)); + Cmp(r1, 0); + B(ne, &inCache); if (!raddr.Is(r0)) - ass.Mov(r0, raddr); - ass.Mov(r1, write); - ass.Mov(r2, block->vaddr + op.guest_offs - (op.delay_slot ? 2 : 0)); // pc + Mov(r0, raddr); + Mov(r1, write); + Mov(r2, block->vaddr + op.guest_offs - (op.delay_slot ? 2 : 0)); // pc call((void *)mmuDynarecLookup); - ass.B(&done); - ass.Bind(&inCache); - ass.And(r0, raddr, 0xFFF); - ass.Orr(r0, r0, r1); - ass.Bind(&done); + B(&done); + Bind(&inCache); + And(r0, raddr, 0xFFF); + Orr(r0, r0, r1); + Bind(&done); raddr = r0; } } -static void interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) +static void interpreter_fallback(Sh4Context *ctx, u16 op, OpCallFP *oph, u32 pc) { try { - oph(op); + oph(ctx, op); } catch (SH4ThrownException& ex) { if (pc & 1) { @@ -1091,10 +1203,10 @@ static void interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) } } -static void do_sqw_mmu_no_ex(u32 addr, u32 pc) +static void do_sqw_mmu_no_ex(u32 addr, Sh4Context *ctx, u32 pc) { try { - do_sqw_mmu(addr); + ctx->doSqWrite(addr, ctx); } catch (SH4ThrownException& ex) { if (pc & 1) { @@ -1107,54 +1219,54 @@ static void do_sqw_mmu_no_ex(u32 addr, u32 pc) } } -static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) +void Arm32Assembler::compileOp(RuntimeBlockInfo* block, shil_opcode* op, bool optimise) { switch(op->op) { case shop_readm: - if (!ngen_readm_immediate(block, op, optimise)) + if (!readMemImmediate(block, op, optimise)) { mem_op_type optp = memop_type(op); Register raddr = GenMemAddr(op); genMmuLookup(block, *op, 0, raddr); if (addrspace::virtmemEnabled()) { - ass.Bic(r1, raddr, optp == SZ_32F || optp == SZ_64F ? 0xE0000003 : 0xE0000000); + Bic(r1, raddr, optp == SZ_32F || optp == SZ_64F ? 0xE0000003 : 0xE0000000); switch(optp) { case SZ_8: - ass.Ldrsb(reg.mapReg(op->rd), MemOperand(r1, r8)); + Ldrsb(reg.mapReg(op->rd), MemOperand(r1, r8)); break; case SZ_16: - ass.Ldrsh(reg.mapReg(op->rd), MemOperand(r1, r8)); + Ldrsh(reg.mapReg(op->rd), MemOperand(r1, r8)); break; case SZ_32I: - ass.Ldr(reg.mapReg(op->rd), MemOperand(r1, r8)); + Ldr(reg.mapReg(op->rd), MemOperand(r1, r8)); break; case SZ_32F: - ass.Add(r1, r1, r8); //3 opcodes, there's no [REG+REG] VLDR - ass.Vldr(reg.mapFReg(op->rd), MemOperand(r1)); + Add(r1, r1, r8); //3 opcodes, there's no [REG+REG] VLDR + Vldr(reg.mapFReg(op->rd), MemOperand(r1)); break; case SZ_64F: - ass.Add(r1, r1, r8); //3 opcodes, there's no [REG+REG] VLDR - ass.Vldr(d0, MemOperand(r1)); + Add(r1, r1, r8); //3 opcodes, there's no [REG+REG] VLDR + Vldr(d0, MemOperand(r1)); if (reg.IsAllocf(op->rd)) { - ass.Vmov(r0, r1, d0); - ass.Vmov(reg.mapFReg(op->rd, 0), r0); - ass.Vmov(reg.mapFReg(op->rd, 1), r1); + Vmov(r0, r1, d0); + Vmov(reg.mapFReg(op->rd, 0), r0); + Vmov(reg.mapFReg(op->rd, 1), r1); // easier to do just this but we need to use a different op than 32f to distinguish during rewrite - //ass.Vldr(reg.mapFReg(op->rd, 0), MemOperand(r1)); - //ass.Vldr(reg.mapFReg(op->rd, 1), MemOperand(r1, 4)); + //Vldr(reg.mapFReg(op->rd, 0), MemOperand(r1)); + //Vldr(reg.mapFReg(op->rd, 1), MemOperand(r1, 4)); } else { - ass.Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); + Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); } break; } @@ -1181,13 +1293,13 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o vmem_slowpath(raddr, r0, s0, d0, optp, true); if (reg.IsAllocf(op->rd)) { - ass.Vmov(r0, r1, d0); - ass.Vmov(reg.mapFReg(op->rd, 0), r0); - ass.Vmov(reg.mapFReg(op->rd, 1), r1); + Vmov(r0, r1, d0); + Vmov(reg.mapFReg(op->rd, 0), r0); + Vmov(reg.mapFReg(op->rd, 1), r1); } else { - ass.Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); + Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); } break; } @@ -1196,7 +1308,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o break; case shop_writem: - if (!ngen_writemem_immediate(block, op, optimise)) + if (!writeMemImmediate(block, op, optimise)) { mem_op_type optp = memop_type(op); @@ -1210,20 +1322,20 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o { if (reg.IsAllocf(op->rs2)) { - ass.Vmov(r2, reg.mapFReg(op->rs2, 0)); - ass.Vmov(r3, reg.mapFReg(op->rs2, 1)); - ass.Vmov(d0, r2, r3); + Vmov(r2, reg.mapFReg(op->rs2, 0)); + Vmov(r3, reg.mapFReg(op->rs2, 1)); + Vmov(d0, r2, r3); } else { - ass.Vldr(d0, MemOperand(r8, op->rs2.reg_nofs())); + Vldr(d0, MemOperand(r8, op->rs2.reg_nofs())); } } else if (op->rs2.is_imm()) { - ass.Mov(rs2, op->rs2._imm); + Mov(rs2, op->rs2._imm); if (optp == SZ_32F) - ass.Vmov(rs2f, rs2); + Vmov(rs2f, rs2); } else { @@ -1234,30 +1346,30 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o } if (addrspace::virtmemEnabled()) { - ass.Bic(r1, raddr, optp == SZ_32F || optp == SZ_64F ? 0xE0000003 : 0xE0000000); + Bic(r1, raddr, optp == SZ_32F || optp == SZ_64F ? 0xE0000003 : 0xE0000000); switch(optp) { case SZ_8: - ass.Strb(rs2, MemOperand(r1, r8)); + Strb(rs2, MemOperand(r1, r8)); break; case SZ_16: - ass.Strh(rs2, MemOperand(r1, r8)); + Strh(rs2, MemOperand(r1, r8)); break; case SZ_32I: - ass.Str(rs2, MemOperand(r1, r8)); + Str(rs2, MemOperand(r1, r8)); break; case SZ_32F: - ass.Add(r1, r1, r8); //3 opcodes: there's no [REG+REG] VLDR, also required for SQ - ass.Vstr(rs2f, MemOperand(r1)); + Add(r1, r1, r8); //3 opcodes: there's no [REG+REG] VLDR, also required for SQ + Vstr(rs2f, MemOperand(r1)); break; case SZ_64F: - ass.Add(r1, r1, r8); //3 opcodes: there's no [REG+REG] VLDR, also required for SQ - ass.Vstr(d0, MemOperand(r1)); + Add(r1, r1, r8); //3 opcodes: there's no [REG+REG] VLDR, also required for SQ + Vstr(d0, MemOperand(r1)); break; } } else { @@ -1292,12 +1404,12 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o verify(op->rd.is_reg() && op->rd._reg == reg_pc_dyn); if (op->rs2.is_imm()) { - ass.Mov(r2, op->rs2.imm_value()); - ass.Add(r4, reg.mapReg(op->rs1), r2); + Mov(r2, op->rs2.imm_value()); + Add(r4, reg.mapReg(op->rs1), r2); } else { - ass.Mov(r4, reg.mapReg(op->rs1)); + Mov(r4, reg.mapReg(op->rs1)); } break; @@ -1308,7 +1420,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o { if (op->rd.is_r32i()) { - ass.Mov(reg.mapReg(op->rd), op->rs1._imm); + Mov(reg.mapReg(op->rd), op->rs1._imm); } else { @@ -1318,22 +1430,22 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o //hum, vmov can't do 0, but can do all kind of weird small consts ... really useful ... //simd is slow on a9 #if 0 - ass.Movw(r0, 0); - ass.Vmov(reg.mapFReg(op->rd), r0); + Movw(r0, 0); + Vmov(reg.mapFReg(op->rd), r0); #else //1-1=0 ! //should be slightly faster ... //we could get rid of the imm mov, if not for infs & co .. - ass.Vmov(reg.mapFReg(op->rd), 1.f);; - ass.Vsub(reg.mapFReg(op->rd), reg.mapFReg(op->rd), reg.mapFReg(op->rd)); + Vmov(reg.mapFReg(op->rd), 1.f);; + Vsub(reg.mapFReg(op->rd), reg.mapFReg(op->rd), reg.mapFReg(op->rd)); #endif } else if (op->rs1._imm == 0x3F800000) - ass.Vmov(reg.mapFReg(op->rd), 1.f); + Vmov(reg.mapFReg(op->rd), 1.f); else { - ass.Mov(r0, op->rs1._imm); - ass.Vmov(reg.mapFReg(op->rd), r0); + Mov(r0, op->rs1._imm); + Vmov(reg.mapFReg(op->rd), r0); } } } @@ -1350,19 +1462,19 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o switch(type) { case 0: // reg = reg - ass.Mov(reg.mapReg(op->rd), reg.mapReg(op->rs1)); + Mov(reg.mapReg(op->rd), reg.mapReg(op->rs1)); break; case 1: // vfp = reg - ass.Vmov(reg.mapFReg(op->rd), reg.mapReg(op->rs1)); + Vmov(reg.mapFReg(op->rd), reg.mapReg(op->rs1)); break; case 2: // reg = vfp - ass.Vmov(reg.mapReg(op->rd), reg.mapFReg(op->rs1)); + Vmov(reg.mapReg(op->rd), reg.mapFReg(op->rs1)); break; case 3: // vfp = vfp - ass.Vmov(reg.mapFReg(op->rd), reg.mapFReg(op->rs1)); + Vmov(reg.mapFReg(op->rd), reg.mapFReg(op->rs1)); break; } } @@ -1383,86 +1495,87 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o SRegister rs1 = reg.mapFReg(op->rs1, 1); if (rd0.Is(rs1)) { - ass.Vmov(s0, rd0); - ass.Vmov(rd0, rs0); - ass.Vmov(rd1, s0); + Vmov(s0, rd0); + Vmov(rd0, rs0); + Vmov(rd1, s0); } else { if (!rd0.Is(rs0)) - ass.Vmov(rd0, rs0); + Vmov(rd0, rs0); if (!rd1.Is(rs1)) - ass.Vmov(rd1, rs1); + Vmov(rd1, rs1); } } else { - ass.Vldr(d0, MemOperand(r8, op->rs1.reg_nofs())); - ass.Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); + Vldr(d0, MemOperand(r8, op->rs1.reg_nofs())); + Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); } break; case shop_jcond: verify(op->rd.is_reg() && op->rd._reg == reg_pc_dyn); - ass.Mov(r4, reg.mapReg(op->rs1)); + Mov(r4, reg.mapReg(op->rs1)); break; case shop_ifb: if (op->rs1._imm) { - ass.Mov(r1, op->rs2._imm); + Mov(r1, op->rs2._imm); storeSh4Reg(r1, reg_nextpc); } - ass.Mov(r0, op->rs3._imm); + Sub(r0, r8, sizeof(Sh4Context)); + Mov(r1, op->rs3._imm); if (!mmu_enabled()) { call((void *)OpPtr[op->rs3._imm]); } else { - ass.Mov(r1, reinterpret_cast(*OpDesc[op->rs3._imm]->oph)); // op handler - ass.Mov(r2, block->vaddr + op->guest_offs - (op->delay_slot ? 1 : 0)); // pc + Mov(r2, reinterpret_cast(*OpDesc[op->rs3._imm]->oph)); // op handler + Mov(r3, block->vaddr + op->guest_offs - (op->delay_slot ? 1 : 0)); // pc call((void *)interpreter_fallback); } break; #ifndef CANONICALTEST case shop_neg: - ass.Rsb(reg.mapReg(op->rd), reg.mapReg(op->rs1), 0); + Rsb(reg.mapReg(op->rd), reg.mapReg(op->rs1), 0); break; case shop_not: - ass.Mvn(reg.mapReg(op->rd), reg.mapReg(op->rs1)); + Mvn(reg.mapReg(op->rd), reg.mapReg(op->rs1)); break; case shop_shl: - ngen_Binary(op, &MacroAssembler::Lsl); + binaryOp(op, &MacroAssembler::Lsl); break; case shop_shr: - ngen_Binary(op, &MacroAssembler::Lsr); + binaryOp(op, &MacroAssembler::Lsr); break; case shop_sar: - ngen_Binary(op, &MacroAssembler::Asr); + binaryOp(op, &MacroAssembler::Asr); break; case shop_and: - ngen_Binary(op, &MacroAssembler::And); + binaryOp(op, &MacroAssembler::And); break; case shop_or: - ngen_Binary(op, &MacroAssembler::Orr); + binaryOp(op, &MacroAssembler::Orr); break; case shop_xor: - ngen_Binary(op, &MacroAssembler::Eor); + binaryOp(op, &MacroAssembler::Eor); break; case shop_add: - ngen_Binary(op, &MacroAssembler::Add); + binaryOp(op, &MacroAssembler::Add); break; case shop_sub: - ngen_Binary(op, &MacroAssembler::Sub); + binaryOp(op, &MacroAssembler::Sub); break; case shop_ror: - ngen_Binary(op, &MacroAssembler::Ror); + binaryOp(op, &MacroAssembler::Ror); break; case shop_adc: @@ -1471,9 +1584,9 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs2 = GetParam(op->rs2, r2); Register rs3 = GetParam(op->rs3, r3); - ass.Lsr(SetFlags, r0, rs3, 1); //C=rs3, r0=0 - ass.Adc(SetFlags, reg.mapReg(op->rd), rs1, rs2); //(C,rd)=rs1+rs2+rs3(C) - ass.Adc(reg.mapReg(op->rd2), r0, 0); //rd2=C, (or MOVCS rd2, 1) + Lsr(SetFlags, r0, rs3, 1); //C=rs3, r0=0 + Adc(SetFlags, reg.mapReg(op->rd), rs1, rs2); //(C,rd)=rs1+rs2+rs3(C) + Adc(reg.mapReg(op->rd2), r0, 0); //rd2=C, (or MOVCS rd2, 1) } break; @@ -1483,15 +1596,15 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs1 = GetParam(op->rs1, r1); Register rs2 = GetParam(op->rs2, r2); if (!rd2.Is(rs1)) { - ass.Lsr(SetFlags, rd2, rs2, 1); //C=rs2, rd2=0 - ass.And(rd2, rs1, 1); //get new carry + Lsr(SetFlags, rd2, rs2, 1); //C=rs2, rd2=0 + And(rd2, rs1, 1); //get new carry } else { - ass.Lsr(SetFlags, r0, rs2, 1); //C=rs2, rd2=0 - ass.Add(r0, rs1, 1); + Lsr(SetFlags, r0, rs2, 1); //C=rs2, rd2=0 + Add(r0, rs1, 1); } - ass.Rrx(reg.mapReg(op->rd), rs1); //RRX w/ carry :) + Rrx(reg.mapReg(op->rd), rs1); //RRX w/ carry :) if (rd2.Is(rs1)) - ass.Mov(rd2, r0); + Mov(rd2, r0); } break; @@ -1499,9 +1612,9 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o { Register rs1 = GetParam(op->rs1, r1); Register rs2 = GetParam(op->rs2, r2); - ass.Orr(SetFlags, reg.mapReg(op->rd), rs2, Operand(rs1, LSL, 1)); //(C,rd)= rs1<<1 + (|) rs2 - ass.Mov(reg.mapReg(op->rd2), 0); //clear rd2 (for ADC/MOVCS) - ass.Adc(reg.mapReg(op->rd2), reg.mapReg(op->rd2), 0); //rd2=C (or MOVCS rd2, 1) + Orr(SetFlags, reg.mapReg(op->rd), rs2, Operand(rs1, LSL, 1)); //(C,rd)= rs1<<1 + (|) rs2 + Mov(reg.mapReg(op->rd2), 0); //clear rd2 (for ADC/MOVCS) + Adc(reg.mapReg(op->rd2), reg.mapReg(op->rd2), 0); //rd2=C (or MOVCS rd2, 1) } break; @@ -1511,20 +1624,20 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs1 = GetParam(op->rs1, r1); if (rs1.Is(rd2)) { - ass.Mov(r1, rs1); + Mov(r1, rs1); rs1 = r1; } Register rs2 = GetParam(op->rs2, r2); if (rs2.Is(rd2)) { - ass.Mov(r2, rs2); + Mov(r2, rs2); rs2 = r2; } Register rs3 = GetParam(op->rs3, r3); - ass.Eor(rd2, rs3, 1); - ass.Lsr(SetFlags, rd2, rd2, 1); //C=rs3, rd2=0 - ass.Sbc(SetFlags, reg.mapReg(op->rd), rs1, rs2); - ass.Mov(cc, rd2, 1); + Eor(rd2, rs3, 1); + Lsr(SetFlags, rd2, rd2, 1); //C=rs3, rd2=0 + Sbc(SetFlags, reg.mapReg(op->rd), rs1, rs2); + Mov(cc, rd2, 1); } break; @@ -1534,36 +1647,36 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs1 = GetParam(op->rs1, r1); if (rs1.Is(rd2)) { - ass.Mov(r1, rs1); + Mov(r1, rs1); rs1 = r1; } Register rs2 = GetParam(op->rs2, r2); - ass.Eor(rd2, rs2, 1); - ass.Lsr(SetFlags, rd2, rd2, 1); //C=rs3, rd2=0 - ass.Sbc(SetFlags, reg.mapReg(op->rd), rd2, rs1); // rd2 == 0 - ass.Mov(cc, rd2, 1); + Eor(rd2, rs2, 1); + Lsr(SetFlags, rd2, rd2, 1); //C=rs3, rd2=0 + Sbc(SetFlags, reg.mapReg(op->rd), rd2, rs1); // rd2 == 0 + Mov(cc, rd2, 1); } break; case shop_shld: { verify(!op->rs2.is_imm()); - ass.And(SetFlags, r0, reg.mapReg(op->rs2), 0x8000001F); - ass.Rsb(mi, r0, r0, 0x80000020); + And(SetFlags, r0, reg.mapReg(op->rs2), 0x8000001F); + Rsb(mi, r0, r0, 0x80000020); Register rs1 = GetParam(op->rs1, r1); - ass.Lsr(mi, reg.mapReg(op->rd), rs1, r0); - ass.Lsl(pl, reg.mapReg(op->rd), rs1, r0); + Lsr(mi, reg.mapReg(op->rd), rs1, r0); + Lsl(pl, reg.mapReg(op->rd), rs1, r0); } break; case shop_shad: { verify(!op->rs2.is_imm()); - ass.And(SetFlags, r0, reg.mapReg(op->rs2), 0x8000001F); - ass.Rsb(mi, r0, r0, 0x80000020); + And(SetFlags, r0, reg.mapReg(op->rs2), 0x8000001F); + Rsb(mi, r0, r0, 0x80000020); Register rs1 = GetParam(op->rs1, r1); - ass.Asr(mi, reg.mapReg(op->rd), rs1, r0); - ass.Lsl(pl, reg.mapReg(op->rd), rs1, r0); + Asr(mi, reg.mapReg(op->rd), rs1, r0); + Lsl(pl, reg.mapReg(op->rd), rs1, r0); } break; @@ -1572,6 +1685,11 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o call((void *)UpdateSR); break; + case shop_sync_fpscr: + Sub(r0, r8, sizeof(Sh4Context)); + call((void *)Sh4Context::UpdateFPSCR); + break; + case shop_test: case shop_seteq: case shop_setge: @@ -1588,7 +1706,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o if (op->rs2.is_imm()) { if (!ImmediateA32::IsImmediateA32(op->rs2._imm)) - ass.Mov(rs2, (u32)op->rs2._imm); + Mov(rs2, (u32)op->rs2._imm); else is_imm = true; } @@ -1605,22 +1723,22 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o if (op->op == shop_test) { if (is_imm) - ass.Tst(rs1, op->rs2._imm); + Tst(rs1, op->rs2._imm); else - ass.Tst(rs1, rs2); + Tst(rs1, rs2); } else { if (is_imm) - ass.Cmp(rs1, op->rs2._imm); + Cmp(rs1, op->rs2._imm); else - ass.Cmp(rs1, rs2); + Cmp(rs1, rs2); } static const ConditionType opcls2[] = { eq, eq, ge, gt, hs, hi }; - ass.Mov(rd, 0); - ass.Mov(opcls2[op->op-shop_test], rd, 1); + Mov(rd, 0); + Mov(opcls2[op->op-shop_test], rd, 1); } break; @@ -1628,14 +1746,14 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o { Register rs1 = GetParam(op->rs1, r1); Register rs2 = GetParam(op->rs2, r2); - ass.Eor(r1, rs1, rs2); - ass.Mov(reg.mapReg(op->rd), 0); + Eor(r1, rs1, rs2); + Mov(reg.mapReg(op->rd), 0); - ass.Tst(r1, 0xFF000000u); - ass.Tst(ne, r1, 0x00FF0000u); - ass.Tst(ne, r1, 0x0000FF00u); - ass.Tst(ne, r1, 0x000000FFu); - ass.Mov(eq, reg.mapReg(op->rd), 1); + Tst(r1, 0xFF000000u); + Tst(ne, r1, 0x00FF0000u); + Tst(ne, r1, 0x0000FF00u); + Tst(ne, r1, 0x000000FFu); + Mov(eq, reg.mapReg(op->rd), 1); } break; @@ -1644,17 +1762,17 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o case shop_mul_u16: { Register rs2 = GetParam(op->rs2, r2); - ass.Uxth(r1, reg.mapReg(op->rs1)); - ass.Uxth(r2, rs2); - ass.Mul(reg.mapReg(op->rd), r1, r2); + Uxth(r1, reg.mapReg(op->rs1)); + Uxth(r2, rs2); + Mul(reg.mapReg(op->rd), r1, r2); } break; case shop_mul_s16: { Register rs2 = GetParam(op->rs2, r2); - ass.Sxth(r1, reg.mapReg(op->rs1)); - ass.Sxth(r2, rs2); - ass.Mul(reg.mapReg(op->rd), r1, r2); + Sxth(r1, reg.mapReg(op->rs1)); + Sxth(r2, rs2); + Mul(reg.mapReg(op->rd), r1, r2); } break; case shop_mul_i32: @@ -1664,19 +1782,19 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o //x86_opcode_class opmt[]={op_mul32,op_mul32,op_mul32,op_mul32,op_imul32}; //only the top 32 bits are different on signed vs unsigned - ass.Mul(reg.mapReg(op->rd), reg.mapReg(op->rs1), rs2); + Mul(reg.mapReg(op->rd), reg.mapReg(op->rs1), rs2); } break; case shop_mul_u64: { Register rs2 = GetParam(op->rs2, r2); - ass.Umull(reg.mapReg(op->rd), reg.mapReg(op->rd2), reg.mapReg(op->rs1), rs2); + Umull(reg.mapReg(op->rd), reg.mapReg(op->rd2), reg.mapReg(op->rs1), rs2); } break; case shop_mul_s64: { Register rs2 = GetParam(op->rs2, r2); - ass.Smull(reg.mapReg(op->rd), reg.mapReg(op->rd2), reg.mapReg(op->rs1), rs2); + Smull(reg.mapReg(op->rd), reg.mapReg(op->rd2), reg.mapReg(op->rs1), rs2); } break; @@ -1685,28 +1803,28 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o ConditionType cc = eq; if (!op->rs1.is_imm()) { - ass.Lsr(r1, reg.mapReg(op->rs1), 26); - ass.Mov(r0, reg.mapReg(op->rs1)); - ass.Cmp(r1, 0x38); + Lsr(r1, reg.mapReg(op->rs1), 26); + Mov(r0, reg.mapReg(op->rs1)); + Cmp(r1, 0x38); } else { // The SSA pass has already checked that the // destination is a store queue so no need to check - ass.Mov(r0, op->rs1.imm_value()); + Mov(r0, op->rs1.imm_value()); cc = al; } + Sub(r1, r8, sizeof(Sh4Context)); if (mmu_enabled()) { - ass.Mov(r1, block->vaddr + op->guest_offs - (op->delay_slot ? 1 : 0)); // pc + Mov(r2, block->vaddr + op->guest_offs - (op->delay_slot ? 1 : 0)); // pc call((void *)do_sqw_mmu_no_ex, cc); } else { - ass.Ldr(r2, MemOperand(r8, rcbOffset(do_sqw_nommu))); - ass.Sub(r1, r8, -rcbOffset(sq_buffer)); - ass.Blx(cc, r2); + Ldr(r2, MemOperand(r8, ctxOffset(doSqWrite))); + Blx(cc, r2); } } break; @@ -1714,9 +1832,9 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o case shop_ext_s8: case shop_ext_s16: if (op->op == shop_ext_s8) - ass.Sxtb(reg.mapReg(op->rd), reg.mapReg(op->rs1)); + Sxtb(reg.mapReg(op->rd), reg.mapReg(op->rs1)); else - ass.Sxth(reg.mapReg(op->rd), reg.mapReg(op->rs1)); + Sxth(reg.mapReg(op->rd), reg.mapReg(op->rs1)); break; case shop_xtrct: @@ -1725,7 +1843,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs1; if (op->rs1.is_imm()) { rs1 = r1; - ass.Mov(rs1, op->rs1._imm); + Mov(rs1, op->rs1._imm); } else { @@ -1734,7 +1852,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o Register rs2; if (op->rs2.is_imm()) { rs2 = r2; - ass.Mov(rs2, op->rs2._imm); + Mov(rs2, op->rs2._imm); } else { @@ -1743,15 +1861,15 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o if (rd.Is(rs1)) { verify(!rd.Is(rs2)); - ass.Lsr(rd, rs1, 16); - ass.Lsl(r0, rs2, 16); + Lsr(rd, rs1, 16); + Lsl(r0, rs2, 16); } else { - ass.Lsl(rd, rs2, 16); - ass.Lsr(r0, rs1, 16); + Lsl(rd, rs2, 16); + Lsr(r0, rs1, 16); } - ass.Orr(rd, rd, r0); + Orr(rd, rd, r0); } break; @@ -1767,7 +1885,7 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o static const FPBinOP opcds[] = { &MacroAssembler::Vadd, &MacroAssembler::Vsub, &MacroAssembler::Vmul, &MacroAssembler::Vdiv }; - ngen_fp_bin(op, opcds[op->op - shop_fadd]); + binaryFpOp(op, opcds[op->op - shop_fadd]); } break; @@ -1775,12 +1893,12 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o case shop_fneg: { static const FPUnOP opcds[] = { &MacroAssembler::Vabs, &MacroAssembler::Vneg }; - ngen_fp_una(op, opcds[op->op - shop_fabs]); + unaryFpOp(op, opcds[op->op - shop_fabs]); } break; case shop_fsqrt: - ngen_fp_una(op, &MacroAssembler::Vsqrt); + unaryFpOp(op, &MacroAssembler::Vsqrt); break; @@ -1790,116 +1908,115 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o SRegister rs1 = s1; if (op->rs1.is_imm()) { - ass.Mov(r0, op->rs1.imm_value()); - ass.Vmov(rs1, r0); + Mov(r0, op->rs1.imm_value()); + Vmov(rs1, r0); } else rs1 = reg.mapFReg(op->rs1); SRegister rs2 = s2; if (op->rs2.is_imm()) { - ass.Mov(r1, op->rs2.imm_value()); - ass.Vmov(rs2, r1); + Mov(r1, op->rs2.imm_value()); + Vmov(rs2, r1); } else { rs2 = reg.mapFReg(op->rs2); if (rs2.Is(rd)) { - ass.Vmov(s2, rs2); + Vmov(s2, rs2); rs2 = s2; } } SRegister rs3 = s3; if (op->rs3.is_imm()) { - ass.Mov(r2, op->rs3.imm_value()); - ass.Vmov(rs3, r2); + Mov(r2, op->rs3.imm_value()); + Vmov(rs3, r2); } else { rs3 = reg.mapFReg(op->rs3); if (rs3.Is(rd)) { - ass.Vmov(s3, rs3); + Vmov(s3, rs3); rs3 = s3; } } if (!rd.Is(rs1)) - ass.Vmov(rd, rs1); - ass.Vmla(rd, rs2, rs3); + Vmov(rd, rs1); + Vmla(rd, rs2, rs3); } break; case shop_fsrra: - ass.Vmov(s1, 1.f); - ass.Vsqrt(s0, reg.mapFReg(op->rs1)); - ass.Vdiv(reg.mapFReg(op->rd), s1, s0); + Vmov(s1, 1.f); + Vsqrt(s0, reg.mapFReg(op->rs1)); + Vdiv(reg.mapFReg(op->rd), s1, s0); break; case shop_fsetgt: case shop_fseteq: #if 1 //this is apparently much faster (tested on A9) - ass.Mov(reg.mapReg(op->rd), 0); - ass.Vcmp(reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); + Mov(reg.mapReg(op->rd), 0); + Vcmp(reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); - ass.Vmrs(RegisterOrAPSR_nzcv(APSR_nzcv), FPSCR); + Vmrs(RegisterOrAPSR_nzcv(APSR_nzcv), FPSCR); if (op->op == shop_fsetgt) - ass.Mov(gt, reg.mapReg(op->rd), 1); + Mov(gt, reg.mapReg(op->rd), 1); else - ass.Mov(eq, reg.mapReg(op->rd), 1); + Mov(eq, reg.mapReg(op->rd), 1); #else if (op->op == shop_fsetgt) - ass.Vcgt(d0, reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); + Vcgt(d0, reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); else - ass.Vceq(d0, reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); + Vceq(d0, reg.mapFReg(op->rs1), reg.mapFReg(op->rs2)); - ass.Vmov(r0, s0); - ass.And(reg.mapReg(op->rd), r0, 1); + Vmov(r0, s0); + And(reg.mapReg(op->rd), r0, 1); #endif break; case shop_fsca: //r1: base ptr - ass.Mov(r1, (u32)sin_table & 0xFFFF); + Mov(r1, (u32)sin_table & 0xFFFF); if (op->rs1.is_imm()) - ass.Mov(r0, op->rs1._imm & 0xFFFF); + Mov(r0, op->rs1._imm & 0xFFFF); else - ass.Uxth(r0, reg.mapReg(op->rs1)); - ass.Movt(r1, (u32)sin_table >> 16); + Uxth(r0, reg.mapReg(op->rs1)); + Movt(r1, (u32)sin_table >> 16); - ass.Add(r0, r1, Operand(r0, LSL, 3)); + Add(r0, r1, Operand(r0, LSL, 3)); if (reg.IsAllocf(op->rd)) { - ass.Vldr(reg.mapFReg(op->rd, 0), MemOperand(r0)); - ass.Vldr(reg.mapFReg(op->rd, 1), MemOperand(r0, 4)); + Vldr(reg.mapFReg(op->rd, 0), MemOperand(r0)); + Vldr(reg.mapFReg(op->rd, 1), MemOperand(r0, 4)); } else { - ass.Vldr(d0, MemOperand(r0)); - ass.Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); + Vldr(d0, MemOperand(r0)); + Vstr(d0, MemOperand(r8, op->rd.reg_nofs())); } break; case shop_fipr: { - QRegister _r1 = q0; QRegister _r2 = q0; - ass.Sub(r0, r8, op->rs1.reg_aofs()); - if (op->rs2.reg_aofs() == op->rs1.reg_aofs()) + Sub(r0, r8, -op->rs1.reg_nofs()); + if (op->rs2.reg_nofs() == op->rs1.reg_nofs()) { - ass.Vldm(r0, NO_WRITE_BACK, DRegisterList(d0, 2)); + Vldm(r0, NO_WRITE_BACK, DRegisterList(d0, 2)); } else { - ass.Sub(r1, r8, op->rs2.reg_aofs()); - ass.Vldm(r0, NO_WRITE_BACK, DRegisterList(d0, 2)); - ass.Vldm(r1, NO_WRITE_BACK, DRegisterList(d2, 2)); + Sub(r1, r8, -op->rs2.reg_nofs()); + Vldm(r0, NO_WRITE_BACK, DRegisterList(d0, 2)); + Vldm(r1, NO_WRITE_BACK, DRegisterList(d2, 2)); _r2 = q1; } @@ -1907,14 +2024,14 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o //VFP SRegister fs2 = _r2.Is(q0) ? s0 : s4; - ass.Vmul(reg.mapFReg(op->rd), s0, fs2); - ass.Vmla(reg.mapFReg(op->rd), s1, SRegister(fs2.GetCode() + 1)); - ass.Vmla(reg.mapFReg(op->rd), s2, SRegister(fs2.GetCode() + 2)); - ass.Vmla(reg.mapFReg(op->rd), s3, SRegister(fs2.GetCode() + 3)); + Vmul(reg.mapFReg(op->rd), s0, fs2); + Vmla(reg.mapFReg(op->rd), s1, SRegister(fs2.GetCode() + 1)); + Vmla(reg.mapFReg(op->rd), s2, SRegister(fs2.GetCode() + 2)); + Vmla(reg.mapFReg(op->rd), s3, SRegister(fs2.GetCode() + 3)); #else - ass.Vmul(q0, _r1, _r2); - ass.Vpadd(d0, d0, d1); - ass.Vadd(reg.mapFReg(op->rd), f0, f1); + Vmul(q0, _r1, _r2); + Vpadd(d0, d0, d1); + Vadd(reg.mapFReg(op->rd), f0, f1); #endif } break; @@ -1922,12 +2039,12 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o case shop_ftrv: { Register rdp = r1; - ass.Sub(r2, r8, op->rs2.reg_aofs()); - ass.Sub(r1, r8, op->rs1.reg_aofs()); - if (op->rs1.reg_aofs() != op->rd.reg_aofs()) + Sub(r2, r8, -op->rs2.reg_nofs()); + Sub(r1, r8, -op->rs1.reg_nofs()); + if (op->rs1.reg_nofs() != op->rd.reg_nofs()) { rdp = r0; - ass.Sub(r0, r8, op->rd.reg_aofs()); + Sub(r0, r8, -op->rd.reg_nofs()); } #if 1 @@ -1937,71 +2054,71 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o //f12,f13,f14,f15 : mtx temp //(This is actually faster than using neon) - ass.Vldm(r2, WRITE_BACK, DRegisterList(d4, 2)); - ass.Vldm(r1, NO_WRITE_BACK, DRegisterList(d0, 2)); + Vldm(r2, WRITE_BACK, DRegisterList(d4, 2)); + Vldm(r1, NO_WRITE_BACK, DRegisterList(d0, 2)); - ass.Vmul(s4, vixl::aarch32::s8, s0); - ass.Vmul(s5, s9, s0); - ass.Vmul(s6, s10, s0); - ass.Vmul(s7, s11, s0); + Vmul(s4, vixl::aarch32::s8, s0); + Vmul(s5, s9, s0); + Vmul(s6, s10, s0); + Vmul(s7, s11, s0); - ass.Vldm(r2, WRITE_BACK, DRegisterList(d6, 2)); + Vldm(r2, WRITE_BACK, DRegisterList(d6, 2)); - ass.Vmla(s4, s12, s1); - ass.Vmla(s5, s13, s1); - ass.Vmla(s6, s14, s1); - ass.Vmla(s7, s15, s1); + Vmla(s4, s12, s1); + Vmla(s5, s13, s1); + Vmla(s6, s14, s1); + Vmla(s7, s15, s1); - ass.Vldm(r2, WRITE_BACK, DRegisterList(d4, 2)); + Vldm(r2, WRITE_BACK, DRegisterList(d4, 2)); - ass.Vmla(s4, vixl::aarch32::s8, s2); - ass.Vmla(s5, s9, s2); - ass.Vmla(s6, s10, s2); - ass.Vmla(s7, s11, s2); + Vmla(s4, vixl::aarch32::s8, s2); + Vmla(s5, s9, s2); + Vmla(s6, s10, s2); + Vmla(s7, s11, s2); - ass.Vldm(r2, NO_WRITE_BACK, DRegisterList(d6, 2)); + Vldm(r2, NO_WRITE_BACK, DRegisterList(d6, 2)); - ass.Vmla(s4, s12, s3); - ass.Vmla(s5, s13, s3); - ass.Vmla(s6, s14, s3); - ass.Vmla(s7, s15, s3); + Vmla(s4, s12, s3); + Vmla(s5, s13, s3); + Vmla(s6, s14, s3); + Vmla(s7, s15, s3); - ass.Vstm(rdp, NO_WRITE_BACK, DRegisterList(d2, 2)); + Vstm(rdp, NO_WRITE_BACK, DRegisterList(d2, 2)); #else //this fits really nicely to NEON ! // TODO - ass.Vldm(d16,r2,8); - ass.Vldm(d0,r1,2); - - ass.Vmla(q2,q8,d0,0); - ass.Vmla(q2,q9,d0,1); - ass.Vmla(q2,q10,d1,0); - ass.Vmla(q2,q11,d1,1); - ass.Vstm(d4,rdp,2); + Vldm(d16,r2,8); + Vldm(d0,r1,2); + + Vmla(q2,q8,d0,0); + Vmla(q2,q9,d0,1); + Vmla(q2,q10,d1,0); + Vmla(q2,q11,d1,1); + Vstm(d4,rdp,2); #endif } break; case shop_frswap: - ass.Sub(r0, r8, op->rs1.reg_aofs()); - ass.Sub(r1, r8, op->rd.reg_aofs()); + Sub(r0, r8, -op->rs1.reg_nofs()); + Sub(r1, r8, -op->rd.reg_nofs()); //Assumes no FPU reg alloc here //frswap touches all FPU regs, so all spans should be clear here .. - ass.Vldm(r1, NO_WRITE_BACK, DRegisterList(d0, 8)); - ass.Vldm(r0, NO_WRITE_BACK, DRegisterList(d8, 8)); - ass.Vstm(r0, NO_WRITE_BACK, DRegisterList(d0, 8)); - ass.Vstm(r1, NO_WRITE_BACK, DRegisterList(d8, 8)); + Vldm(r1, NO_WRITE_BACK, DRegisterList(d0, 8)); + Vldm(r0, NO_WRITE_BACK, DRegisterList(d8, 8)); + Vstm(r0, NO_WRITE_BACK, DRegisterList(d0, 8)); + Vstm(r1, NO_WRITE_BACK, DRegisterList(d8, 8)); break; case shop_cvt_f2i_t: - ass.Vcvt(S32, F32, s0, reg.mapFReg(op->rs1)); - ass.Vmov(reg.mapReg(op->rd), s0); + Vcvt(S32, F32, s0, reg.mapFReg(op->rs1)); + Vmov(reg.mapReg(op->rd), s0); break; case shop_cvt_i2f_n: // may be some difference should be made ? case shop_cvt_i2f_z: - ass.Vmov(s0, reg.mapReg(op->rs1)); - ass.Vcvt(F32, S32, reg.mapFReg(op->rd), s0); + Vmov(s0, reg.mapReg(op->rs1)); + Vcvt(F32, S32, reg.mapFReg(op->rd), s0); break; #endif @@ -2011,17 +2128,18 @@ static void ngen_compile_opcode(RuntimeBlockInfo* block, shil_opcode* op, bool o } } - -void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool staging, bool optimise) +void Arm32Assembler::compile(RuntimeBlockInfo* block, bool force_checks, bool optimise) { - ass = Arm32Assembler((u8 *)emit_GetCCPtr(), emit_FreeSpace()); - - block->code = (DynarecCodeEntryPtr)emit_GetCCPtr(); + block->code = (DynarecCodeEntryPtr)codeBuffer.get(); //reg alloc + static constexpr int alloc_regs[] = { 5, 6, 7, 9, 10, 11, -1 }; + static constexpr int alloc_regs_mmu[] = { 5, 6, 7, 10, 11, -1 }; + static constexpr int alloc_fpu[] = { 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, -1 }; reg.DoAlloc(block, mmu_enabled() ? alloc_regs_mmu : alloc_regs, alloc_fpu); - u8* blk_start = ass.GetCursorAddress(); + u8* blk_start = GetCursorAddress(); //pre-load the first reg alloc operations, for better efficiency .. if (!block->oplist.empty()) @@ -2030,8 +2148,8 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s // block checks if (mmu_enabled()) { - ass.Mov(r0, block->vaddr); - ass.Mov(r1, block->addr); + Mov(r0, block->vaddr); + Mov(r1, block->addr); if (block->has_fpu_op) call((void *)checkBlockFpu); else @@ -2040,7 +2158,7 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s if (force_checks) { u32 addr = block->addr; - ass.Mov(r0, addr); + Mov(r0, addr); s32 sz = block->sh4_code_size; while (sz > 0) @@ -2050,10 +2168,10 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s u32* ptr = (u32*)GetMemPtr(addr, 4); if (ptr != nullptr) { - ass.Mov(r2, (u32)ptr); - ass.Ldr(r2, MemOperand(r2)); - ass.Mov(r1, *ptr); - ass.Cmp(r1, r2); + Mov(r2, (u32)ptr); + Ldr(r2, MemOperand(r2)); + Mov(r1, *ptr); + Cmp(r1, r2); jump(ngen_blockcheckfail, ne); } @@ -2065,10 +2183,10 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s u16* ptr = (u16 *)GetMemPtr(addr, 2); if (ptr != nullptr) { - ass.Mov(r2, (u32)ptr); - ass.Ldrh(r2, MemOperand(r2)); - ass.Mov(r1, *ptr); - ass.Cmp(r1, r2); + Mov(r2, (u32)ptr); + Ldrh(r2, MemOperand(r2)); + Mov(r1, *ptr); + Cmp(r1, r2); jump(ngen_blockcheckfail, ne); } @@ -2079,25 +2197,25 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s } //scheduler - ass.Ldr(r1, MemOperand(r8, rcbOffset(cntx.cycle_counter))); - ass.Cmp(r1, 0); + Ldr(r1, MemOperand(r8, ctxOffset(cycle_counter))); + Cmp(r1, 0); Label cyclesRemaining; - ass.B(pl, &cyclesRemaining); - ass.Mov(r0, block->vaddr); + B(pl, &cyclesRemaining); + Mov(r0, block->vaddr); call(intc_sched); - ass.Mov(r1, r0); - ass.Bind(&cyclesRemaining); + Mov(r1, r0); + Bind(&cyclesRemaining); const u32 cycles = block->guest_cycles; if (!ImmediateA32::IsImmediateA32(cycles)) { - ass.Sub(r1, r1, cycles & ~3); - ass.Sub(r1, r1, cycles & 3); + Sub(r1, r1, cycles & ~3); + Sub(r1, r1, cycles & 3); } else { - ass.Sub(r1, r1, cycles); + Sub(r1, r1, cycles); } - ass.Str(r1, MemOperand(r8, rcbOffset(cntx.cycle_counter))); + Str(r1, MemOperand(r8, ctxOffset(cycle_counter))); //compile the block's opcodes shil_opcode* op; @@ -2105,12 +2223,12 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s { op = &block->oplist[i]; - op->host_offs = ass.GetCursorOffset(); + op->host_offs = GetCursorOffset(); if (i != 0) reg.OpBegin(op, i); - ngen_compile_opcode(block, op, optimise); + compileOp(block, op, optimise); reg.OpEnd(op); } @@ -2128,14 +2246,14 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s //Relink written bytes must be added to the count ! - block->relink_offset = ass.GetCursorOffset(); + block->relink_offset = GetCursorOffset(); block->relink_data = 0; relinkBlock((DynaRBI *)block); - ass.Finalize(); - emit_Skip(ass.GetCursorOffset()); + Finalize(); + codeBuffer.advance(GetCursorOffset()); - u8* pEnd = ass.GetCursorAddress(); + u8* pEnd = GetCursorAddress(); //blk_start might not be the same, due to profiling counters .. block->host_opcodes = (pEnd - blk_start) / 4; @@ -2143,89 +2261,94 @@ void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool s block->host_code_size = pEnd - (u8*)block->code; } -void ngen_ResetBlocks() +void Arm32Dynarec::reset() { - INFO_LOG(DYNAREC, "ngen_ResetBlocks()"); - mainloop = nullptr; + INFO_LOG(DYNAREC, "Arm32Dynarec::reset"); + ::mainloop = nullptr; unwinder.clear(); - if (p_sh4rcb->cntx.CpuRunning) + if (sh4ctx->CpuRunning) { // Force the dynarec out of mainloop() to regenerate it - p_sh4rcb->cntx.CpuRunning = 0; + sh4ctx->CpuRunning = 0; restarting = true; } else generate_mainloop(); } -static void generate_mainloop() +void Arm32Dynarec::generate_mainloop() { - if (mainloop != nullptr) + if (::mainloop != nullptr) return; INFO_LOG(DYNAREC, "Generating main loop"); - ass = Arm32Assembler((u8 *)emit_GetCCPtr(), emit_FreeSpace()); + Arm32Assembler ass(*sh4ctx, *codeBuffer); + + ass.genMainLoop(); +} - unwinder.start(ass.GetCursorAddress()); +void Arm32Assembler::genMainLoop() +{ + unwinder.start(GetCursorAddress()); // Stubs Label ngen_LinkBlock_Shared_stub; // ngen_LinkBlock_Generic_stub - ngen_LinkBlock_Generic_stub = ass.GetCursorAddress(); - ass.Mov(r1,r4); // djump/pc -> in case we need it .. - ass.B(&ngen_LinkBlock_Shared_stub); + ngen_LinkBlock_Generic_stub = GetCursorAddress(); + Mov(r1,r4); // djump/pc -> in case we need it .. + B(&ngen_LinkBlock_Shared_stub); // ngen_LinkBlock_cond_Branch_stub - ngen_LinkBlock_cond_Branch_stub = ass.GetCursorAddress(); - ass.Mov(r1, 1); - ass.B(&ngen_LinkBlock_Shared_stub); + ngen_LinkBlock_cond_Branch_stub = GetCursorAddress(); + Mov(r1, 1); + B(&ngen_LinkBlock_Shared_stub); // ngen_LinkBlock_cond_Next_stub - ngen_LinkBlock_cond_Next_stub = ass.GetCursorAddress(); - ass.Mov(r1, 0); - ass.B(&ngen_LinkBlock_Shared_stub); + ngen_LinkBlock_cond_Next_stub = GetCursorAddress(); + Mov(r1, 0); + B(&ngen_LinkBlock_Shared_stub); // ngen_LinkBlock_Shared_stub - ass.Bind(&ngen_LinkBlock_Shared_stub); - ass.Mov(r0, lr); - ass.Sub(r0, r0, 4); // go before the call + Bind(&ngen_LinkBlock_Shared_stub); + Mov(r0, lr); + Sub(r0, r0, 4); // go before the call call((void *)rdv_LinkBlock); - ass.Bx(r0); + Bx(r0); // ngen_FailedToFindBlock_ - ngen_FailedToFindBlock_ = ass.GetCursorAddress(); + ngen_FailedToFindBlock_ = GetCursorAddress(); if (mmu_enabled()) { call((void *)rdv_FailedToFindBlock_pc); } else { - ass.Mov(r0, r4); + Mov(r0, r4); call((void *)rdv_FailedToFindBlock); } - ass.Bx(r0); + Bx(r0); // ngen_blockcheckfail - ngen_blockcheckfail = ass.GetCursorAddress(); + ngen_blockcheckfail = GetCursorAddress(); call((void *)rdv_BlockCheckFail); if (mmu_enabled()) { Label jumpblockLabel; - ass.Cmp(r0, 0); - ass.B(ne, &jumpblockLabel); + Cmp(r0, 0); + B(ne, &jumpblockLabel); loadSh4Reg(r0, reg_nextpc); call((void *)bm_GetCodeByVAddr); - ass.Bind(&jumpblockLabel); + Bind(&jumpblockLabel); } - ass.Bx(r0); + Bx(r0); // Main loop Label no_updateLabel; -// ngen_mainloop: - mainloop = ass.GetCursorAddress(); +// mainloop: + ::mainloop = GetCursorAddress(); RegisterList savedRegisters = RegisterList::Union( RegisterList(r4, r5, r6, r7), RegisterList(r8, r9, r10, r11), RegisterList(r12, lr)); { - UseScratchRegisterScope scope(&ass); + UseScratchRegisterScope scope(this); scope.ExcludeAll(); - ass.Push(savedRegisters); + Push(savedRegisters); } unwinder.allocStack(0, 40); unwinder.saveReg(0, r4, 40); @@ -2242,113 +2365,113 @@ static void generate_mainloop() if (!mmu_enabled()) { // r8: context - ass.Mov(r8, r0); + Mov(r8, r0); } else { - ass.Sub(sp, sp, 4); + Sub(sp, sp, 4); unwinder.allocStack(0, 8); - ass.Push(r0); // push context + Push(r0); // push context unwinder.saveReg(0, r4, 4); - ass.Mov(r0, reinterpret_cast(&jmp_stack)); - ass.Mov(r1, sp); - ass.Str(r1, MemOperand(r0)); + Mov(r0, reinterpret_cast(&jmp_stack)); + Mov(r1, sp); + Str(r1, MemOperand(r0)); - ass.Bind(&longjumpLabel); + Bind(&longjumpLabel); - ass.Ldr(r8, MemOperand(sp)); // r8: context - ass.Mov(r9, (uintptr_t)mmuAddressLUT); // r9: mmu LUT + Ldr(r8, MemOperand(sp)); // r8: context + Mov(r9, (uintptr_t)mmuAddressLUT); // r9: mmu LUT } - ass.Ldr(r4, MemOperand(r8, rcbOffset(cntx.pc))); // r4: pc - ass.B(&no_updateLabel); // Go to mainloop ! + Ldr(r4, MemOperand(r8, ctxOffset(pc))); // r4: pc + B(&no_updateLabel); // Go to mainloop ! // this code is here for fall-through behavior of do_iter Label do_iter; Label cleanup; // intc_sched: r0 is pc, r1 is cycle_counter - intc_sched = ass.GetCursorAddress(); - ass.Add(r1, r1, SH4_TIMESLICE); - ass.Str(r1, MemOperand(r8, rcbOffset(cntx.cycle_counter))); - ass.Str(r0, MemOperand(r8, rcbOffset(cntx.pc))); - ass.Ldr(r0, MemOperand(r8, rcbOffset(cntx.CpuRunning))); - ass.Cmp(r0, 0); - ass.B(eq, &cleanup); - ass.Mov(r4, lr); + intc_sched = GetCursorAddress(); + Add(r1, r1, SH4_TIMESLICE); + Str(r1, MemOperand(r8, ctxOffset(cycle_counter))); + Str(r0, MemOperand(r8, ctxOffset(pc))); + Ldr(r0, MemOperand(r8, ctxOffset(CpuRunning))); + Cmp(r0, 0); + B(eq, &cleanup); + Mov(r4, lr); call((void *)UpdateSystem_INTC); - ass.Cmp(r0, 0); - ass.B(ne, &do_iter); - ass.Mov(lr, r4); - ass.Ldr(r0, MemOperand(r8, rcbOffset(cntx.cycle_counter))); - ass.Bx(lr); + Cmp(r0, 0); + B(ne, &do_iter); + Mov(lr, r4); + Ldr(r0, MemOperand(r8, ctxOffset(cycle_counter))); + Bx(lr); // do_iter: - ass.Bind(&do_iter); - ass.Ldr(r4, MemOperand(r8, rcbOffset(cntx.pc))); + Bind(&do_iter); + Ldr(r4, MemOperand(r8, ctxOffset(pc))); // no_update: - no_update = ass.GetCursorAddress(); - ass.Bind(&no_updateLabel); + no_update = GetCursorAddress(); + Bind(&no_updateLabel); // next_pc _MUST_ be on r4 - ass.Ldr(r0, MemOperand(r8, rcbOffset(cntx.CpuRunning))); - ass.Cmp(r0, 0); - ass.B(eq, &cleanup); + Ldr(r0, MemOperand(r8, ctxOffset(CpuRunning))); + Cmp(r0, 0); + B(eq, &cleanup); if (!mmu_enabled()) { - ass.Sub(r2, r8, -rcbOffset(fpcb)); - ass.Ubfx(r1, r4, 1, 24); // 24+1 bits: 32 MB + Sub(r2, r8, -rcbOffset(fpcb)); + Ubfx(r1, r4, 1, 24); // 24+1 bits: 32 MB // RAM wraps around so if actual RAM size is 16MB, we won't overflow - ass.Ldr(pc, MemOperand(r2, r1, LSL, 2)); + Ldr(pc, MemOperand(r2, r1, LSL, 2)); } else { - ass.Mov(r0, r4); + Mov(r0, r4); call((void *)bm_GetCodeByVAddr); - ass.Bx(r0); + Bx(r0); } // cleanup: - ass.Bind(&cleanup); + Bind(&cleanup); if (mmu_enabled()) - ass.Add(sp, sp, 8); // pop context & alignment + Add(sp, sp, 8); // pop context & alignment { - UseScratchRegisterScope scope(&ass); + UseScratchRegisterScope scope(this); scope.ExcludeAll(); - ass.Pop(savedRegisters); + Pop(savedRegisters); } - ass.Bx(lr); + Bx(lr); // Exception handler - handleException = ass.GetCursorAddress(); + handleException = GetCursorAddress(); if (mmu_enabled()) { - ass.Mov(r0, reinterpret_cast(&jmp_stack)); - ass.Ldr(r1, MemOperand(r0)); - ass.Mov(sp, r1); - ass.B(&longjumpLabel); + Mov(r0, reinterpret_cast(&jmp_stack)); + Ldr(r1, MemOperand(r0)); + Mov(sp, r1); + B(&longjumpLabel); } // MMU Check block (with fpu) // r0: vaddr, r1: addr - checkBlockFpu = ass.GetCursorAddress(); + checkBlockFpu = GetCursorAddress(); Label fpu_enabled; loadSh4Reg(r2, reg_sr_status); - ass.Tst(r2, 1 << 15); // test SR.FD bit - ass.B(eq, &fpu_enabled); - ass.Mov(r1, Sh4Ex_FpuDisabled); // exception code + Tst(r2, 1 << 15); // test SR.FD bit + B(eq, &fpu_enabled); + Mov(r1, Sh4Ex_FpuDisabled); // exception code call((void *)Do_Exception); loadSh4Reg(r4, reg_nextpc); - ass.B(&no_updateLabel); - ass.Bind(&fpu_enabled); + B(&no_updateLabel); + Bind(&fpu_enabled); // fallthrough // MMU Check block (no fpu) // r0: vaddr, r1: addr - checkBlockNoFpu = ass.GetCursorAddress(); + checkBlockNoFpu = GetCursorAddress(); loadSh4Reg(r2, reg_nextpc); - ass.Cmp(r2, r0); - ass.Mov(r0, r1); + Cmp(r2, r0); + Mov(r0, r1); jump(ngen_blockcheckfail, ne); - ass.Bx(lr); + Bx(lr); // Memory handlers for (int s=0;s<6;s++) @@ -2370,12 +2493,17 @@ static void generate_mainloop() continue; const void *v; - if (i == 0) + if (i == 0 && s != 3 && s != 4) { v = fn; + } else { - v = ass.GetCursorAddress(); - ass.Mov(r0, Register(i)); + v = GetCursorAddress(); + Mov(r0, Register(i)); + if (s == 3) + Uxtb(r1, r1); + else if (s == 4) + Uxth(r1, r1); jump(fn); } @@ -2393,43 +2521,43 @@ static void generate_mainloop() if (optp != SZ_32I && reg != 0) continue; - _mem_hndl_SQ32[optp - SZ_32I][reg] = ass.GetCursorAddress(); + _mem_hndl_SQ32[optp - SZ_32I][reg] = GetCursorAddress(); if (optp == SZ_64F) { - ass.Lsr(r1, r0, 26); - ass.Cmp(r1, 0x38); - ass.And(r1, r0, 0x3F); - ass.Add(r1, r1, r8); + Lsr(r1, r0, 26); + Cmp(r1, 0x38); + And(r1, r0, 0x3F); + Add(r1, r1, r8); jump((void *)&addrspace::write64, ne); - ass.Strd(r2, r3, MemOperand(r1, rcbOffset(sq_buffer))); + Strd(r2, r3, MemOperand(r1, getRegOffset(reg_sq_buffer) - sizeof(Sh4Context))); } else { - ass.And(r3, Register(reg), 0x3F); - ass.Lsr(r2, Register(reg), 26); - ass.Add(r3, r3, r8); - ass.Cmp(r2, 0x38); + And(r3, Register(reg), 0x3F); + Lsr(r2, Register(reg), 26); + Add(r3, r3, r8); + Cmp(r2, 0x38); if (reg != 0) - ass.Mov(ne, r0, Register(reg)); + Mov(ne, r0, Register(reg)); jump((void *)&addrspace::write32, ne); - ass.Str(r1, MemOperand(r3, rcbOffset(sq_buffer))); + Str(r1, MemOperand(r3, getRegOffset(reg_sq_buffer) - sizeof(Sh4Context))); } - ass.Bx(lr); + Bx(lr); } } - ass.Finalize(); - emit_Skip(ass.GetBuffer()->GetSizeInBytes()); + Finalize(); + codeBuffer.advance(GetBuffer()->GetSizeInBytes()); - size_t unwindSize = unwinder.end(CODE_SIZE - 128); + size_t unwindSize = unwinder.end(codeBuffer.getSize() - 128); verify(unwindSize <= 128); - ngen_FailedToFindBlock = ngen_FailedToFindBlock_; + rdv_SetFailedToFindBlockHandler(ngen_FailedToFindBlock_); - INFO_LOG(DYNAREC, "readm helpers: up to %p", ass.GetCursorAddress()); + INFO_LOG(DYNAREC, "readm helpers: up to %p", GetCursorAddress()); } -void ngen_init() +void Arm32Dynarec::init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) { INFO_LOG(DYNAREC, "Initializing the ARM32 dynarec"); @@ -2450,16 +2578,19 @@ void ngen_init() ccmap[shop_setab] = hi; ccnmap[shop_setab] = ls; + + this->sh4ctx = &sh4ctx; + this->codeBuffer = &codeBuffer; } -void ngen_HandleException(host_context_t &context) +void Arm32Dynarec::handleException(host_context_t &context) { - context.pc = (uintptr_t)handleException; + context.pc = (uintptr_t)::handleException; } -RuntimeBlockInfo* ngen_AllocateBlock() +RuntimeBlockInfo* Arm32Dynarec::allocateBlock() { generate_mainloop(); // FIXME why is this needed? - return new DynaRBI(); + return new DynaRBI(*sh4ctx, *codeBuffer); }; #endif diff --git a/core/rec-ARM64/arm64_regalloc.h b/core/rec-ARM64/arm64_regalloc.h index 6882effd1..4b74fbbd2 100644 --- a/core/rec-ARM64/arm64_regalloc.h +++ b/core/rec-ARM64/arm64_regalloc.h @@ -53,18 +53,26 @@ struct Arm64RegAlloc : RegAlloc const Register& MapRegister(const shil_param& param) { + #define WREG(n) vixl::aarch64::w##n, + static const Register wregisters[] = {AARCH64_REGISTER_CODE_LIST(WREG)}; + #undef WREG + eReg ereg = mapg(param); if (ereg == (eReg)-1) die("Register not allocated"); - return Register::GetWRegFromCode(ereg); + return wregisters[ereg]; } const VRegister& MapVRegister(const shil_param& param, int index = 0) { + #define SREG(n) vixl::aarch64::s##n, + static const VRegister sregisters[] = {AARCH64_REGISTER_CODE_LIST(SREG)}; + #undef SREG + eFReg ereg = mapf(param, index); if (ereg == (eFReg)-1) die("VRegister not allocated"); - return VRegister::GetSRegFromCode(ereg); + return sregisters[ereg]; } Arm64Assembler *assembler; diff --git a/core/rec-ARM64/arm64_unwind.h b/core/rec-ARM64/arm64_unwind.h index da2e72ab3..a0c36dfef 100644 --- a/core/rec-ARM64/arm64_unwind.h +++ b/core/rec-ARM64/arm64_unwind.h @@ -17,7 +17,7 @@ along with Flycast. If not, see . */ #pragma once -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" #include using namespace vixl::aarch64; diff --git a/core/rec-ARM64/rec_arm64.cpp b/core/rec-ARM64/rec_arm64.cpp index 0242bbb59..c9fbe7f81 100644 --- a/core/rec-ARM64/rec_arm64.cpp +++ b/core/rec-ARM64/rec_arm64.cpp @@ -21,7 +21,9 @@ #if FEAT_SHREC == DYNAREC_JIT && HOST_CPU == CPU_ARM64 +#ifndef _M_ARM64 #include +#endif #include #include @@ -33,22 +35,25 @@ using namespace vixl::aarch64; #include "hw/sh4/sh4_mmr.h" #include "hw/sh4/sh4_interrupts.h" +#include "arm64_unwind.h" #include "hw/sh4/sh4_core.h" #include "hw/sh4/dyna/ngen.h" #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_rom.h" #include "arm64_regalloc.h" #include "hw/mem/addrspace.h" -#include "arm64_unwind.h" #include "oslib/virtmem.h" - -#undef do_sqw_nommu - -static void generate_mainloop(); +#include "emulator.h" struct DynaRBI : RuntimeBlockInfo { + DynaRBI(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) + : sh4ctx(sh4ctx), codeBuffer(codeBuffer) {} u32 Relink() override; + +private: + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; }; static u64 jmp_stack; @@ -70,59 +75,22 @@ static DynaCode *linkBlockNextStub; static DynaCode *writeStoreQueue32; static DynaCode *writeStoreQueue64; -static bool restarting; - -void ngen_mainloop(void* v_cntx) +static void jitWriteProtect(Sh4CodeBuffer &codeBuffer, bool enable) { - try { - do { - restarting = false; - generate_mainloop(); - - mainloop(v_cntx); - if (restarting) - p_sh4rcb->cntx.CpuRunning = 1; - } while (restarting); - } catch (const SH4ThrownException&) { - ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop"); - throw FlycastException("Fatal: Unhandled SH4 exception"); - } -} - #ifdef TARGET_IPHONE -static void JITWriteProtect(bool enable) -{ if (enable) - virtmem::region_set_exec(CodeCache, CODE_SIZE + TEMP_CODE_SIZE); + virtmem::region_set_exec(codeBuffer.getBase(), codeBuffer.getSize()); else - virtmem::region_unlock(CodeCache, CODE_SIZE + TEMP_CODE_SIZE); -} + virtmem::region_unlock(codeBuffer.getBase(), codeBuffer.getSize()); +#else + JITWriteProtect(enable); #endif - -void ngen_init() -{ - INFO_LOG(DYNAREC, "Initializing the ARM64 dynarec"); -} - -void ngen_ResetBlocks() -{ - unwinder.clear(); - mainloop = nullptr; - - if (p_sh4rcb->cntx.CpuRunning) - { - // Force the dynarec out of mainloop() to regenerate it - p_sh4rcb->cntx.CpuRunning = 0; - restarting = true; - } - else - generate_mainloop(); } -static void interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) +static void interpreter_fallback(Sh4Context *ctx, u16 op, OpCallFP *oph, u32 pc) { try { - oph(op); + oph(ctx, op); } catch (SH4ThrownException& ex) { if (pc & 1) { @@ -135,10 +103,10 @@ static void interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) } } -static void do_sqw_mmu_no_ex(u32 addr, u32 pc) +static void do_sqw_mmu_no_ex(u32 addr, Sh4Context *ctx, u32 pc) { try { - do_sqw_mmu(addr); + ctx->doSqWrite(addr, ctx); } catch (SH4ThrownException& ex) { if (pc & 1) { @@ -158,28 +126,29 @@ class Arm64Assembler : public MacroAssembler typedef void (MacroAssembler::*Arm64Fop_RRR)(const VRegister&, const VRegister&, const VRegister&); public: - Arm64Assembler() : Arm64Assembler(emit_GetCCPtr()) - { - } - Arm64Assembler(void *buffer) : MacroAssembler((u8 *)buffer, emit_FreeSpace()), regalloc(this) + Arm64Assembler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) + : Arm64Assembler(sh4ctx, codeBuffer, codeBuffer.get()) { } + + Arm64Assembler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer, void *buffer) + : MacroAssembler((u8 *)buffer, codeBuffer.getFreeSpace()), regalloc(this), sh4ctx(sh4ctx), codeBuffer(codeBuffer) { - call_regs.push_back(&w0); - call_regs.push_back(&w1); - call_regs.push_back(&w2); - call_regs.push_back(&w3); - call_regs.push_back(&w4); - call_regs.push_back(&w5); - call_regs.push_back(&w6); - call_regs.push_back(&w7); - - call_regs64.push_back(&x0); - call_regs64.push_back(&x1); - call_regs64.push_back(&x2); - call_regs64.push_back(&x3); - call_regs64.push_back(&x4); - call_regs64.push_back(&x5); - call_regs64.push_back(&x6); - call_regs64.push_back(&x7); + call_regs.push_back((const WRegister*)&w0); + call_regs.push_back((const WRegister*)&w1); + call_regs.push_back((const WRegister*)&w2); + call_regs.push_back((const WRegister*)&w3); + call_regs.push_back((const WRegister*)&w4); + call_regs.push_back((const WRegister*)&w5); + call_regs.push_back((const WRegister*)&w6); + call_regs.push_back((const WRegister*)&w7); + + call_regs64.push_back((const XRegister*)&x0); + call_regs64.push_back((const XRegister*)&x1); + call_regs64.push_back((const XRegister*)&x2); + call_regs64.push_back((const XRegister*)&x3); + call_regs64.push_back((const XRegister*)&x4); + call_regs64.push_back((const XRegister*)&x5); + call_regs64.push_back((const XRegister*)&x6); + call_regs64.push_back((const XRegister*)&x7); call_fregs.push_back(&s0); call_fregs.push_back(&s1); @@ -191,7 +160,7 @@ class Arm64Assembler : public MacroAssembler call_fregs.push_back(&s7); } - void ngen_BinaryOp_RRO(shil_opcode* op, Arm64Op_RRO arm_op, Arm64Op_RROF arm_op2) + void binaryOp_RRO(shil_opcode* op, Arm64Op_RRO arm_op, Arm64Op_RROF arm_op2) { Operand op3 = Operand(0); if (op->rs2.is_imm()) @@ -208,7 +177,7 @@ class Arm64Assembler : public MacroAssembler ((*this).*arm_op2)(regalloc.MapRegister(op->rd), regalloc.MapRegister(op->rs1), op3, LeaveFlags); } - void ngen_BinaryFop(shil_opcode* op, Arm64Fop_RRR arm_op) + void binaryFop(shil_opcode* op, Arm64Fop_RRR arm_op) { VRegister reg1; VRegister reg2; @@ -243,7 +212,7 @@ class Arm64Assembler : public MacroAssembler Add(*ret_reg, regalloc.MapRegister(op.rs1), op.rs3._imm); else { - Ldr(*ret_reg, sh4_context_mem_operand(op.rs1.reg_ptr())); + Ldr(*ret_reg, sh4_context_mem_operand(op.rs1._reg)); Add(*ret_reg, *ret_reg, op.rs3._imm); } } @@ -253,8 +222,8 @@ class Arm64Assembler : public MacroAssembler Add(*ret_reg, regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs3)); else { - Ldr(*ret_reg, sh4_context_mem_operand(op.rs1.reg_ptr())); - Ldr(w8, sh4_context_mem_operand(op.rs3.reg_ptr())); + Ldr(*ret_reg, sh4_context_mem_operand(op.rs1._reg)); + Ldr(w8, sh4_context_mem_operand(op.rs3._reg)); Add(*ret_reg, *ret_reg, w8); } } @@ -273,7 +242,7 @@ class Arm64Assembler : public MacroAssembler } else { - Ldr(*ret_reg, sh4_context_mem_operand(op.rs1.reg_ptr())); + Ldr(*ret_reg, sh4_context_mem_operand(op.rs1._reg)); } } else @@ -285,10 +254,10 @@ class Arm64Assembler : public MacroAssembler return *ret_reg; } - void ngen_Compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool staging, bool optimise) + void compileBlock(RuntimeBlockInfo* block, bool force_checks, bool optimise) { //printf("REC-ARM64 compiling %08x\n", block->addr); - JITWriteProtect(false); + jitWriteProtect(codeBuffer, false); this->block = block; CheckBlock(force_checks, block); @@ -296,7 +265,7 @@ class Arm64Assembler : public MacroAssembler regalloc.DoAlloc(block); // scheduler - Ldr(w1, sh4_context_mem_operand(&Sh4cntx.cycle_counter)); + Ldr(w1, sh4_context_mem_operand(&sh4ctx.cycle_counter)); Cmp(w1, 0); Label cycles_remaining; B(&cycles_remaining, pl); @@ -306,7 +275,7 @@ class Arm64Assembler : public MacroAssembler Bind(&cycles_remaining); Sub(w1, w1, block->guest_cycles); - Str(w1, sh4_context_mem_operand(&Sh4cntx.cycle_counter)); + Str(w1, sh4_context_mem_operand(&sh4ctx.cycle_counter)); for (size_t i = 0; i < block->oplist.size(); i++) { @@ -319,18 +288,19 @@ class Arm64Assembler : public MacroAssembler if (op.rs1._imm) // if NeedPC() { Mov(w10, op.rs2._imm); - Str(w10, sh4_context_mem_operand(&next_pc)); + Str(w10, sh4_context_mem_operand(&sh4ctx.pc)); } - Mov(w0, op.rs3._imm); + Mov(x0, x28); + Mov(w1, op.rs3._imm); if (!mmu_enabled()) { GenCallRuntime(OpDesc[op.rs3._imm]->oph); } else { - Mov(x1, reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler - Mov(w2, block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc + Mov(x2, reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler + Mov(w3, block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc GenCallRuntime(interpreter_fallback); } @@ -422,7 +392,8 @@ class Arm64Assembler : public MacroAssembler GenCallRuntime(UpdateSR); break; case shop_sync_fpscr: - GenCallRuntime(UpdateFPSCR); + Mov(x0, x28); + GenCallRuntime(Sh4Context::UpdateFPSCR); break; case shop_swaplb: @@ -443,19 +414,19 @@ class Arm64Assembler : public MacroAssembler break; case shop_and: - ngen_BinaryOp_RRO(&op, &MacroAssembler::And, NULL); + binaryOp_RRO(&op, &MacroAssembler::And, NULL); break; case shop_or: - ngen_BinaryOp_RRO(&op, &MacroAssembler::Orr, NULL); + binaryOp_RRO(&op, &MacroAssembler::Orr, NULL); break; case shop_xor: - ngen_BinaryOp_RRO(&op, &MacroAssembler::Eor, NULL); + binaryOp_RRO(&op, &MacroAssembler::Eor, NULL); break; case shop_add: - ngen_BinaryOp_RRO(&op, NULL, &MacroAssembler::Add); + binaryOp_RRO(&op, NULL, &MacroAssembler::Add); break; case shop_sub: - ngen_BinaryOp_RRO(&op, NULL, &MacroAssembler::Sub); + binaryOp_RRO(&op, NULL, &MacroAssembler::Sub); break; case shop_shl: if (op.rs2.is_imm()) @@ -485,7 +456,7 @@ class Arm64Assembler : public MacroAssembler case shop_adc: { Register reg1; - Operand op2; + Operand op2 = Operand(0); Register reg3; if (op.rs1.is_imm()) { @@ -517,8 +488,8 @@ class Arm64Assembler : public MacroAssembler case shop_sbc: { Register reg1; - Operand op2; - Operand op3; + Operand op2 = Operand(0); + Operand op3 = Operand(0); if (op.rs1.is_imm()) { Mov(w0, op.rs1.imm_value()); @@ -543,8 +514,8 @@ class Arm64Assembler : public MacroAssembler break; case shop_negc: { - Operand op1; - Operand op2; + Operand op1 = Operand(0); + Operand op2 = Operand(0); if (op.rs1.is_imm()) op1 = Operand(op.rs1.imm_value()); else @@ -811,7 +782,7 @@ class Arm64Assembler : public MacroAssembler Lsr(w1, regalloc.MapRegister(op.rs1), 26); else { - Ldr(w0, sh4_context_mem_operand(op.rs1.reg_ptr())); + Ldr(w0, sh4_context_mem_operand(op.rs1._reg)); Lsr(w1, w0, 26); } Cmp(w1, 0x38); @@ -820,17 +791,15 @@ class Arm64Assembler : public MacroAssembler Mov(w0, regalloc.MapRegister(op.rs1)); } + Mov(x1, x28); if (mmu_enabled()) { - Mov(w1, block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc - + Mov(w2, block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc GenCallRuntime(do_sqw_mmu_no_ex); } else { - Sub(x9, x28, offsetof(Sh4RCB, cntx) - offsetof(Sh4RCB, do_sqw_nommu)); - Ldr(x9, MemOperand(x9)); - Sub(x1, x28, offsetof(Sh4RCB, cntx) - offsetof(Sh4RCB, sq_buffer)); + Ldr(x9, sh4_context_mem_operand(&sh4ctx.doSqWrite)); Blr(x9); } Bind(¬_sqw); @@ -885,16 +854,16 @@ class Arm64Assembler : public MacroAssembler // case shop_fadd: - ngen_BinaryFop(&op, &MacroAssembler::Fadd); + binaryFop(&op, &MacroAssembler::Fadd); break; case shop_fsub: - ngen_BinaryFop(&op, &MacroAssembler::Fsub); + binaryFop(&op, &MacroAssembler::Fsub); break; case shop_fmul: - ngen_BinaryFop(&op, &MacroAssembler::Fmul); + binaryFop(&op, &MacroAssembler::Fmul); break; case shop_fdiv: - ngen_BinaryFop(&op, &MacroAssembler::Fdiv); + binaryFop(&op, &MacroAssembler::Fdiv); break; case shop_fabs: @@ -936,16 +905,17 @@ class Arm64Assembler : public MacroAssembler else { Ldr(x2, MemOperand(x1)); - Str(x2, sh4_context_mem_operand(op.rd.reg_ptr())); + Str(x2, sh4_context_mem_operand(op.rd._reg)); } break; + /* fall back to the canonical implementations for better precision case shop_fipr: - Add(x9, x28, sh4_context_mem_operand(op.rs1.reg_ptr()).GetOffset()); + Add(x9, x28, op.rs1.reg_offset()); Ld1(v0.V4S(), MemOperand(x9)); if (op.rs1._reg != op.rs2._reg) { - Add(x9, x28, sh4_context_mem_operand(op.rs2.reg_ptr()).GetOffset()); + Add(x9, x28, op.rs2.reg_offset()); Ld1(v1.V4S(), MemOperand(x9)); Fmul(v0.V4S(), v0.V4S(), v1.V4S()); } @@ -956,9 +926,9 @@ class Arm64Assembler : public MacroAssembler break; case shop_ftrv: - Add(x9, x28, sh4_context_mem_operand(op.rs1.reg_ptr()).GetOffset()); + Add(x9, x28, op.rs1.reg_offset()); Ld1(v0.V4S(), MemOperand(x9)); - Add(x9, x28, sh4_context_mem_operand(op.rs2.reg_ptr()).GetOffset()); + Add(x9, x28, op.rs2.reg_offset()); Ld1(v1.V4S(), MemOperand(x9, 16, PostIndex)); Ld1(v2.V4S(), MemOperand(x9, 16, PostIndex)); Ld1(v3.V4S(), MemOperand(x9, 16, PostIndex)); @@ -967,13 +937,14 @@ class Arm64Assembler : public MacroAssembler Fmla(v5.V4S(), v2.V4S(), s0, 1); Fmla(v5.V4S(), v3.V4S(), s0, 2); Fmla(v5.V4S(), v4.V4S(), s0, 3); - Add(x9, x28, sh4_context_mem_operand(op.rd.reg_ptr()).GetOffset()); + Add(x9, x28, op.rd.reg_offset()); St1(v5.V4S(), MemOperand(x9)); break; + */ case shop_frswap: - Add(x9, x28, sh4_context_mem_operand(op.rs1.reg_ptr()).GetOffset()); - Add(x10, x28, sh4_context_mem_operand(op.rd.reg_ptr()).GetOffset()); + Add(x9, x28, op.rs1.reg_offset()); + Add(x10, x28, op.rd.reg_offset()); Ld4(v0.V2D(), v1.V2D(), v2.V2D(), v3.V2D(), MemOperand(x9)); Ld4(v4.V2D(), v5.V2D(), v6.V2D(), v7.V2D(), MemOperand(x10)); St4(v4.V2D(), v5.V2D(), v6.V2D(), v7.V2D(), MemOperand(x9)); @@ -1002,15 +973,15 @@ class Arm64Assembler : public MacroAssembler RelinkBlock(block); Finalize(); - JITWriteProtect(true); + jitWriteProtect(codeBuffer, true); } - void ngen_CC_Start(shil_opcode* op) + void canonStart(const shil_opcode *op) { CC_pars.clear(); } - void ngen_CC_Param(shil_opcode& op, shil_param& prm, CanonicalParamType tp) + void canonParam(const shil_opcode& op, const shil_param *prm, CanonicalParamType tp) { switch (tp) { @@ -1018,29 +989,30 @@ class Arm64Assembler : public MacroAssembler case CPT_u32: case CPT_ptr: case CPT_f32: + case CPT_sh4ctx: { - CC_PS t = { tp, &prm }; + CC_PS t = { tp, prm }; CC_pars.push_back(t); } break; case CPT_u64rvL: case CPT_u32rv: - host_reg_to_shil_param(prm, w0); + host_reg_to_shil_param(*prm, w0); break; case CPT_u64rvH: Lsr(x10, x0, 32); - host_reg_to_shil_param(prm, w10); + host_reg_to_shil_param(*prm, w10); break; case CPT_f32rv: - host_reg_to_shil_param(prm, s0); + host_reg_to_shil_param(*prm, s0); break; } } - void ngen_CC_Call(shil_opcode*op, void* function) + void canonCall(const shil_opcode *op, void *function) { int regused = 0; int fregused = 0; @@ -1049,21 +1021,19 @@ class Arm64Assembler : public MacroAssembler for (int i = CC_pars.size(); i-- > 0;) { verify(fregused < (int)call_fregs.size() && regused < (int)call_regs.size()); - shil_param& prm = *CC_pars[i].prm; + const shil_param& prm = *CC_pars[i].prm; switch (CC_pars[i].type) { // push the params - case CPT_u32: shil_param_to_host_reg(prm, *call_regs[regused++]); - break; case CPT_f32: if (prm.is_reg()) Fmov(*call_fregs[fregused], regalloc.MapVRegister(prm)); else if (prm.is_imm()) - Fmov(*call_fregs[fregused], reinterpret_cast(prm._imm)); + Fmov(*call_fregs[fregused], reinterpret_cast(prm._imm)); else verify(prm.is_null()); fregused++; @@ -1072,14 +1042,18 @@ class Arm64Assembler : public MacroAssembler case CPT_ptr: verify(prm.is_reg()); // push the ptr itself - Mov(*call_regs64[regused++], reinterpret_cast(prm.reg_ptr())); + Mov(*call_regs64[regused++], reinterpret_cast(prm.reg_ptr(sh4ctx))); + break; + case CPT_sh4ctx: + Mov(*call_regs64[regused++], reinterpret_cast(&sh4ctx)); break; + case CPT_u32rv: case CPT_u64rvL: case CPT_u64rvH: case CPT_f32rv: - // return values are handled in ngen_CC_param() + // return values are handled in canonParam() break; } } @@ -1090,15 +1064,21 @@ class Arm64Assembler : public MacroAssembler if (ccParam.type == CPT_ptr && prm.count() == 2 && regalloc.IsAllocf(prm) && (op->rd._reg == prm._reg || op->rd2._reg == prm._reg)) { // fsca rd param is a pointer to a 64-bit reg so reload the regs if allocated - Ldr(regalloc.MapVRegister(prm, 0), sh4_context_mem_operand(GetRegPtr(prm._reg))); - Ldr(regalloc.MapVRegister(prm, 1), sh4_context_mem_operand(GetRegPtr(prm._reg + 1))); + Ldr(regalloc.MapVRegister(prm, 0), sh4_context_mem_operand(prm._reg)); + Ldr(regalloc.MapVRegister(prm, 1), sh4_context_mem_operand((Sh4RegType)(prm._reg + 1))); } } } MemOperand sh4_context_mem_operand(void *p) { - u32 offset = (u8*)p - (u8*)&p_sh4rcb->cntx; + u32 offset = (u8*)p - (u8*)&sh4ctx; + verify((offset & 3) == 0 && offset <= 16380); // FIXME 64-bit regs need multiple of 8 up to 32760 + return MemOperand(x28, offset); + } + MemOperand sh4_context_mem_operand(Sh4RegType reg) + { + u32 offset = getRegOffset(reg); verify((offset & 3) == 0 && offset <= 16380); // FIXME 64-bit regs need multiple of 8 up to 32760 return MemOperand(x28, offset); } @@ -1110,13 +1090,11 @@ class Arm64Assembler : public MacroAssembler switch (size) { case 1: - GenCallRuntime(addrspace::read8); - Sxtb(w0, w0); + GenCallRuntime(addrspace::read8SX32); break; case 2: - GenCallRuntime(addrspace::read16); - Sxth(w0, w0); + GenCallRuntime(addrspace::read16SX32); break; case 4: @@ -1141,10 +1119,12 @@ class Arm64Assembler : public MacroAssembler switch (size) { case 1: + Uxtb(w1, w1); GenCallRuntime(addrspace::write8); break; case 2: + Uxth(w1, w1); GenCallRuntime(addrspace::write16); break; @@ -1194,7 +1174,7 @@ class Arm64Assembler : public MacroAssembler #endif { Mov(w29, block->BranchBlock); - Str(w29, sh4_context_mem_operand(&next_pc)); + Str(w29, sh4_context_mem_operand(&sh4ctx.pc)); GenBranch(arm64_no_update); } } @@ -1208,9 +1188,9 @@ class Arm64Assembler : public MacroAssembler // next_pc = branch_pc_value; if (block->has_jcond) - Ldr(w11, sh4_context_mem_operand(&Sh4cntx.jdyn)); + Ldr(w11, sh4_context_mem_operand(&sh4ctx.jdyn)); else - Ldr(w11, sh4_context_mem_operand(&sr.T)); + Ldr(w11, sh4_context_mem_operand(&sh4ctx.sr.T)); Cmp(w11, block->BlockType & 1); @@ -1238,7 +1218,7 @@ class Arm64Assembler : public MacroAssembler #endif { Mov(w29, block->BranchBlock); - Str(w29, sh4_context_mem_operand(&next_pc)); + Str(w29, sh4_context_mem_operand(&sh4ctx.pc)); GenBranch(arm64_no_update); } } @@ -1266,7 +1246,7 @@ class Arm64Assembler : public MacroAssembler #endif { Mov(w29, block->NextBlock); - Str(w29, sh4_context_mem_operand(&next_pc)); + Str(w29, sh4_context_mem_operand(&sh4ctx.pc)); GenBranch(arm64_no_update); } } @@ -1278,16 +1258,15 @@ class Arm64Assembler : public MacroAssembler case BET_DynamicRet: // next_pc = *jdyn; - Str(w29, sh4_context_mem_operand(&next_pc)); + Str(w29, sh4_context_mem_operand(&sh4ctx.pc)); if (!mmu_enabled()) { // TODO Call no_update instead (and check CpuRunning less frequently?) Sub(x2, x28, offsetof(Sh4RCB, cntx)); -#if RAM_SIZE_MAX == 33554432 - Ubfx(w1, w29, 1, 24); -#else - Ubfx(w1, w29, 1, 23); -#endif + if (RAM_SIZE == 32_MB) + Ubfx(w1, w29, 1, 24); + else + Ubfx(w1, w29, 1, 23); Ldr(x15, MemOperand(x2, x1, LSL, 3)); // Get block entry point Br(x15); } @@ -1308,11 +1287,11 @@ class Arm64Assembler : public MacroAssembler Mov(w29, block->NextBlock); // else next_pc = *jdyn (already in w29) - Str(w29, sh4_context_mem_operand(&next_pc)); + Str(w29, sh4_context_mem_operand(&sh4ctx.pc)); GenCallRuntime(UpdateINTC); - Ldr(w29, sh4_context_mem_operand(&next_pc)); + Ldr(w29, sh4_context_mem_operand(&sh4ctx.pc)); GenBranch(arm64_no_update); break; @@ -1337,7 +1316,7 @@ class Arm64Assembler : public MacroAssembler block->host_code_size = GetBuffer()->GetSizeInBytes(); block->host_opcodes = GetLabelAddress(&code_end) - GetBuffer()->GetStartAddress(); - emit_Skip(block->host_code_size); + codeBuffer.advance(block->host_code_size); } // Flush and invalidate caches @@ -1373,12 +1352,12 @@ class Arm64Assembler : public MacroAssembler // int intc_sched(int pc, int cycle_counter) arm64_intc_sched = GetCursorAddress(); - verify((void *)arm64_intc_sched == (void *)CodeCache); + verify((void *)arm64_intc_sched == codeBuffer.getBase()); B(&intc_sched); // Not yet compiled block stub // WARNING: this function must be at a fixed address, or transitioning to mmu will fail (switch) - ngen_FailedToFindBlock = (void (*)())CC_RW2RX(GetCursorAddress()); + rdv_SetFailedToFindBlockHandler((void (*)())CC_RW2RX(GetCursorAddress())); if (mmu_enabled()) { GenCallRuntime(rdv_FailedToFindBlock_pc); @@ -1398,9 +1377,9 @@ class Arm64Assembler : public MacroAssembler if (!mmu_enabled()) { Sub(x2, x28, offsetof(Sh4RCB, cntx)); - if (RAM_SIZE == 32 * 1024 * 1024) + if (RAM_SIZE == 32_MB) Ubfx(w1, w29, 1, 24); // 24+1 bits: 32 MB - else if (RAM_SIZE == 16 * 1024 * 1024) + else if (RAM_SIZE == 16_MB) Ubfx(w1, w29, 1, 23); // 23+1 bits: 16 MB else die("Unsupported RAM_SIZE"); @@ -1418,7 +1397,7 @@ class Arm64Assembler : public MacroAssembler // For stack unwinding purposes, we pretend that the entire code block is just one function, with the same // unwinding instructions everywhere. This isn't true until the end of the following prolog, but exceptions // can only be thrown by called functions so this is good enough. - unwinder.start(CodeCache); + unwinder.start(codeBuffer.getBase()); // Save registers Stp(x19, x20, MemOperand(sp, -160, PreIndex)); @@ -1482,21 +1461,21 @@ class Arm64Assembler : public MacroAssembler Bind(&intc_sched); // w0 is pc, w1 is cycle_counter - Str(w0, sh4_context_mem_operand(&Sh4cntx.pc)); + Str(w0, sh4_context_mem_operand(&sh4ctx.pc)); // Add timeslice to cycle counter Add(w1, w1, SH4_TIMESLICE); - Str(w1, sh4_context_mem_operand(&Sh4cntx.cycle_counter)); - Ldr(w0, sh4_context_mem_operand(&Sh4cntx.CpuRunning)); + Str(w1, sh4_context_mem_operand(&sh4ctx.cycle_counter)); + Ldr(w0, sh4_context_mem_operand(&sh4ctx.CpuRunning)); Cbz(w0, &end_mainloop); Mov(x29, lr); // Save link register in case we return GenCallRuntime(UpdateSystem_INTC); Cbnz(w0, &do_interrupts); Mov(lr, x29); - Ldr(w0, sh4_context_mem_operand(&Sh4cntx.cycle_counter)); + Ldr(w0, sh4_context_mem_operand(&sh4ctx.cycle_counter)); Ret(); Bind(&do_interrupts); - Ldr(w29, sh4_context_mem_operand(&Sh4cntx.pc)); + Ldr(w29, sh4_context_mem_operand(&sh4ctx.pc)); B(&no_update); Bind(&end_mainloop); @@ -1531,12 +1510,12 @@ class Arm64Assembler : public MacroAssembler // w0: vaddr, w1: addr checkBlockFpu = GetCursorAddress(); Label fpu_enabled; - Ldr(w10, sh4_context_mem_operand(&sr)); + Ldr(w10, sh4_context_mem_operand(&sh4ctx.sr.status)); Tbz(w10, 15, &fpu_enabled); // test SR.FD bit Mov(w1, Sh4Ex_FpuDisabled); // exception code GenCallRuntime(Do_Exception); - Ldr(w29, sh4_context_mem_operand(&next_pc)); + Ldr(w29, sh4_context_mem_operand(&sh4ctx.pc)); B(&no_update); Bind(&fpu_enabled); // fallthrough @@ -1545,7 +1524,7 @@ class Arm64Assembler : public MacroAssembler // MMU Block check (no fpu) // w0: vaddr, w1: addr checkBlockNoFpu = GetCursorAddress(); - Ldr(w2, sh4_context_mem_operand(&Sh4cntx.pc)); + Ldr(w2, sh4_context_mem_operand(&sh4ctx.pc)); Cmp(w2, w0); Mov(w0, w1); B(&blockCheckFailLabel, ne); @@ -1590,8 +1569,7 @@ class Arm64Assembler : public MacroAssembler Cmp(x7, 0x38); GenBranchRuntime(addrspace::write32, Condition::ne); And(x0, x0, 0x3f); - Sub(x7, x0, sizeof(Sh4RCB::sq_buffer), LeaveFlags); - Str(w1, MemOperand(x28, x7)); + Str(w1, MemOperand(x28, x0)); Ret(); Label writeStoreQueue64Label; @@ -1600,14 +1578,13 @@ class Arm64Assembler : public MacroAssembler Cmp(x7, 0x38); GenBranchRuntime(addrspace::write64, Condition::ne); And(x0, x0, 0x3f); - Sub(x7, x0, sizeof(Sh4RCB::sq_buffer), LeaveFlags); - Str(x1, MemOperand(x28, x7)); + Str(x1, MemOperand(x28, x0)); Ret(); FinalizeCode(); - emit_Skip(GetBuffer()->GetSizeInBytes()); + codeBuffer.advance(GetBuffer()->GetSizeInBytes()); - size_t unwindSize = unwinder.end(CODE_SIZE - 128, (ptrdiff_t)CC_RW2RX(0)); + size_t unwindSize = unwinder.end(codeBuffer.getSize() - 128, (ptrdiff_t)CC_RW2RX(0)); verify(unwindSize <= 128); arm64_no_update = GetLabelAddress(&no_update); @@ -1816,9 +1793,9 @@ class Arm64Assembler : public MacroAssembler break; } if (op.size == 8) - Str(x1, sh4_context_mem_operand(op.rd.reg_ptr())); + Str(x1, sh4_context_mem_operand(op.rd._reg)); else - Str(w1, sh4_context_mem_operand(op.rd.reg_ptr())); + Str(w1, sh4_context_mem_operand(op.rd._reg)); } } else @@ -1832,14 +1809,14 @@ class Arm64Assembler : public MacroAssembler if (regalloc.IsAllocf(op.rd)) Fmov(regalloc.MapVRegister(op.rd, 0), w0); else - Str(w0, sh4_context_mem_operand(op.rd.reg_ptr())); + Str(w0, sh4_context_mem_operand(op.rd._reg)); Mov(w0, addr + 4); GenCallRuntime((void (*)())ptr); if (regalloc.IsAllocf(op.rd)) Fmov(regalloc.MapVRegister(op.rd, 1), w0); else - Str(w0, sh4_context_mem_operand((u8*)op.rd.reg_ptr() + 4)); + Str(w0, sh4_context_mem_operand((Sh4RegType)(op.rd._reg + 1))); } else { @@ -1881,14 +1858,14 @@ class Arm64Assembler : public MacroAssembler bool GenReadMemoryFast(const shil_opcode& op, size_t opid) { - // Direct memory access. Need to handle SIGSEGV and rewrite block as needed. See ngen_Rewrite() + // Direct memory access. Need to handle SIGSEGV and rewrite block as needed. See rewrite() if (!addrspace::virtmemEnabled()) return false; Instruction *start_instruction = GetCursorAddress(); // WARNING: the rewrite code relies on having 2 ops before the memory access - // Update ngen_Rewrite (and perhaps read_memory_rewrite_size) if adding or removing code + // Update rewrite (and perhaps read_memory_rewrite_size) if adding or removing code Ubfx(x1, x0, 0, 29); Add(x1, x1, sizeof(Sh4Context), LeaveFlags); @@ -2010,6 +1987,10 @@ class Arm64Assembler : public MacroAssembler } else { + if (op.size == 1) + Uxtb(w1, w1); + else if (op.size == 2) + Uxth(w1, w1); GenCallRuntime((void (*)())ptr); } } @@ -2019,14 +2000,14 @@ class Arm64Assembler : public MacroAssembler bool GenWriteMemoryFast(const shil_opcode& op, size_t opid) { - // Direct memory access. Need to handle SIGSEGV and rewrite block as needed. See ngen_Rewrite() + // Direct memory access. Need to handle SIGSEGV and rewrite block as needed. See rewrite() if (!addrspace::virtmemEnabled()) return false; Instruction *start_instruction = GetCursorAddress(); // WARNING: the rewrite code relies on having 2 ops before the memory access - // Update ngen_Rewrite (and perhaps write_memory_rewrite_size) if adding or removing code + // Update rewrite (and perhaps write_memory_rewrite_size) if adding or removing code Ubfx(x7, x0, 0, 29); Add(x7, x7, sizeof(Sh4Context), LeaveFlags); @@ -2131,14 +2112,14 @@ class Arm64Assembler : public MacroAssembler { if (param.is_r64f() && !regalloc.IsAllocf(param)) { - Ldr(reg, sh4_context_mem_operand(param.reg_ptr())); + Ldr(reg, sh4_context_mem_operand(param._reg)); } else if (param.is_r32f() || param.is_r64f()) { if (regalloc.IsAllocf(param)) Fmov(reg.W(), regalloc.MapVRegister(param, 0)); else - Ldr(reg.W(), sh4_context_mem_operand(param.reg_ptr())); + Ldr(reg.W(), sh4_context_mem_operand(param._reg)); if (param.is_r64f()) { Fmov(w15, regalloc.MapVRegister(param, 1)); @@ -2150,7 +2131,7 @@ class Arm64Assembler : public MacroAssembler if (regalloc.IsAllocg(param)) Mov(reg.W(), regalloc.MapRegister(param)); else - Ldr(reg.W(), sh4_context_mem_operand(param.reg_ptr())); + Ldr(reg.W(), sh4_context_mem_operand(param._reg)); } } else @@ -2172,7 +2153,7 @@ class Arm64Assembler : public MacroAssembler } else { - Str((const Register&)reg, sh4_context_mem_operand(param.reg_ptr())); + Str((const Register&)reg, sh4_context_mem_operand(param._reg)); } } else if (regalloc.IsAllocg(param)) @@ -2191,14 +2172,14 @@ class Arm64Assembler : public MacroAssembler } else { - Str(reg, sh4_context_mem_operand(param.reg_ptr())); + Str(reg, sh4_context_mem_operand(param._reg)); } } struct CC_PS { CanonicalParamType type; - shil_param* prm; + const shil_param *prm; }; std::vector CC_pars; std::vector call_regs; @@ -2208,149 +2189,209 @@ class Arm64Assembler : public MacroAssembler RuntimeBlockInfo* block = NULL; const int read_memory_rewrite_size = 5; // ubfx, add, ldr for fast access. calling a handler can use more than 3 depending on offset const int write_memory_rewrite_size = 5; // ubfx, add, str + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; }; -static Arm64Assembler* compiler; - -void ngen_Compile(RuntimeBlockInfo* block, bool smc_checks, bool reset, bool staging, bool optimise) +class Arm64Dynarec : public Sh4Dynarec { - verify(emit_FreeSpace() >= 16 * 1024); +public: + Arm64Dynarec() { + sh4Dynarec = this; + } - compiler = new Arm64Assembler(); + void init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) override + { + INFO_LOG(DYNAREC, "Initializing the ARM64 dynarec"); + this->sh4ctx = &sh4ctx; + this->codeBuffer = &codeBuffer; + } - compiler->ngen_Compile(block, smc_checks, reset, staging, optimise); + void reset() override + { + unwinder.clear(); + ::mainloop = nullptr; - delete compiler; - compiler = NULL; -} + if (sh4ctx->CpuRunning) + { + // Force the dynarec out of mainloop() to regenerate it + sh4ctx->CpuRunning = 0; + restarting = true; + } + else + generate_mainloop(); + } -void ngen_CC_Start(shil_opcode* op) -{ - compiler->ngen_CC_Start(op); -} + void mainloop(void* v_cntx) override + { + try { + do { + restarting = false; + generate_mainloop(); + + ::mainloop(v_cntx); + if (restarting && !emu.restartCpu()) + restarting = false; + } while (restarting); + } catch (const SH4ThrownException&) { + ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop"); + throw FlycastException("Fatal: Unhandled SH4 exception"); + } + } -void ngen_CC_Param(shil_opcode* op, shil_param* par, CanonicalParamType tp) -{ - compiler->ngen_CC_Param(*op, *par, tp); -} + void compile(RuntimeBlockInfo* block, bool smc_checks, bool optimise) override + { + verify(codeBuffer->getFreeSpace() >= 16 * 1024); -void ngen_CC_Call(shil_opcode*op, void* function) -{ - compiler->ngen_CC_Call(op, function); -} + compiler = new Arm64Assembler(*sh4ctx, *codeBuffer); -void ngen_CC_Finish(shil_opcode* op) -{ + compiler->compileBlock(block, smc_checks, optimise); -} + delete compiler; + compiler = nullptr; + } -#define STR_LDR_MASK 0xFFE0EC00 - -static const u32 armv8_mem_ops[] = { - 0x38E06800, // Ldrsb - 0x78E06800, // Ldrsh - 0xB8606800, // Ldr w - 0xF8606800, // Ldr x - 0x38206800, // Strb - 0x78206800, // Strh - 0xB8206800, // Str w - 0xF8206800, // Str x -}; -static const bool read_ops[] = { - true, - true, - true, - true, - false, - false, - false, - false, -}; -static const u32 op_sizes[] = { - 1, - 2, - 4, - 8, - 1, - 2, - 4, - 8, -}; -bool ngen_Rewrite(host_context_t &context, void *faultAddress) -{ - JITWriteProtect(false); - //LOGI("ngen_Rewrite pc %zx\n", context.pc); - u32 *code_ptr = (u32 *)CC_RX2RW(context.pc); - u32 armv8_op = *code_ptr; - bool is_read = false; - u32 size = 0; - bool found = false; - u32 masked = armv8_op & STR_LDR_MASK; - for (u32 i = 0; i < std::size(armv8_mem_ops); i++) + void canonStart(const shil_opcode *op) override { - if (masked == armv8_mem_ops[i]) - { - size = op_sizes[i]; - is_read = read_ops[i]; - found = true; - break; - } + compiler->canonStart(op); } - verify(found); - - // Skip the preceding ops (add, ubfx) - u32 *code_rewrite = code_ptr - 2; - Arm64Assembler *assembler = new Arm64Assembler(code_rewrite); - if (is_read) - assembler->GenReadMemorySlow(size); - else if (!is_read && size >= 4 && (context.x0 >> 26) == 0x38) - assembler->GenWriteStoreQueue(size); - else - assembler->GenWriteMemorySlow(size); - assembler->Finalize(true); - delete assembler; - context.pc = (unat)CC_RW2RX(code_rewrite); - JITWriteProtect(true); - - return true; -} -static void generate_mainloop() -{ - if (mainloop != nullptr) - return; - JITWriteProtect(false); - compiler = new Arm64Assembler(); + void canonParam(const shil_opcode *op, const shil_param *par, CanonicalParamType tp) override + { + compiler->canonParam(*op, par, tp); + } - compiler->GenMainloop(); + void canonCall(const shil_opcode *op, void *function) override + { + compiler->canonCall(op, function); + } - delete compiler; - compiler = nullptr; - JITWriteProtect(true); -} + void canonFinish(const shil_opcode *op) override { + } -RuntimeBlockInfo* ngen_AllocateBlock() -{ - generate_mainloop(); - return new DynaRBI(); -} + void generate_mainloop() + { + if (::mainloop != nullptr) + return; + jitWriteProtect(*codeBuffer, false); + compiler = new Arm64Assembler(*sh4ctx, *codeBuffer); -void ngen_HandleException(host_context_t &context) -{ - context.pc = (uintptr_t)handleException; -} + compiler->GenMainloop(); + + delete compiler; + compiler = nullptr; + jitWriteProtect(*codeBuffer, true); + } + + RuntimeBlockInfo* allocateBlock() override + { + generate_mainloop(); + return new DynaRBI(*sh4ctx, *codeBuffer); + } + + void handleException(host_context_t &context) override + { + context.pc = (uintptr_t)::handleException; + } + + bool rewrite(host_context_t &context, void *faultAddress) override + { + constexpr u32 STR_LDR_MASK = 0xFFE0EC00; + + static const u32 armv8_mem_ops[] = { + 0x38E06800, // Ldrsb + 0x78E06800, // Ldrsh + 0xB8606800, // Ldr w + 0xF8606800, // Ldr x + 0x38206800, // Strb + 0x78206800, // Strh + 0xB8206800, // Str w + 0xF8206800, // Str x + }; + static const bool read_ops[] = { + true, + true, + true, + true, + false, + false, + false, + false, + }; + static const u32 op_sizes[] = { + 1, + 2, + 4, + 8, + 1, + 2, + 4, + 8, + }; + + if (codeBuffer == nullptr) + // init() not called yet + return false; + //LOGI("Sh4Dynarec::rewrite pc %zx\n", context.pc); + u32 *code_ptr = (u32 *)CC_RX2RW(context.pc); + if ((u8 *)code_ptr < (u8 *)codeBuffer->getBase() + || (u8 *)code_ptr >= (u8 *)codeBuffer->getBase() + codeBuffer->getSize()) + return false; + jitWriteProtect(*codeBuffer, false); + u32 armv8_op = *code_ptr; + bool is_read = false; + u32 size = 0; + bool found = false; + u32 masked = armv8_op & STR_LDR_MASK; + for (u32 i = 0; i < std::size(armv8_mem_ops); i++) + { + if (masked == armv8_mem_ops[i]) + { + size = op_sizes[i]; + is_read = read_ops[i]; + found = true; + break; + } + } + verify(found); + + // Skip the preceding ops (add, ubfx) + u32 *code_rewrite = code_ptr - 2; + Arm64Assembler *assembler = new Arm64Assembler(*sh4ctx, *codeBuffer, code_rewrite); + if (is_read) + assembler->GenReadMemorySlow(size); + else if (!is_read && size >= 4 && (context.x0 >> 26) == 0x38) + assembler->GenWriteStoreQueue(size); + else + assembler->GenWriteMemorySlow(size); + assembler->Finalize(true); + delete assembler; + context.pc = (uintptr_t)CC_RW2RX(code_rewrite); + jitWriteProtect(*codeBuffer, true); + + return true; + } + +private: + Arm64Assembler* compiler = nullptr; + bool restarting = false; + Sh4Context *sh4ctx = nullptr; + Sh4CodeBuffer *codeBuffer = nullptr; +}; + +static Arm64Dynarec instance; u32 DynaRBI::Relink() { #ifndef NO_BLOCK_LINKING //printf("DynaRBI::Relink %08x\n", this->addr); - JITWriteProtect(false); - Arm64Assembler *compiler = new Arm64Assembler((u8 *)this->code + this->relink_offset); + jitWriteProtect(codeBuffer, false); + Arm64Assembler *compiler = new Arm64Assembler(sh4ctx, codeBuffer, (u8 *)this->code + this->relink_offset); u32 code_size = compiler->RelinkBlock(this); compiler->Finalize(true); delete compiler; - JITWriteProtect(true); + jitWriteProtect(codeBuffer, true); return code_size; #else @@ -2360,18 +2401,18 @@ u32 DynaRBI::Relink() void Arm64RegAlloc::Preload(u32 reg, eReg nreg) { - assembler->Ldr(Register(nreg, 32), assembler->sh4_context_mem_operand(GetRegPtr(reg))); + assembler->Ldr(Register(nreg, 32), assembler->sh4_context_mem_operand((Sh4RegType)reg)); } void Arm64RegAlloc::Writeback(u32 reg, eReg nreg) { - assembler->Str(Register(nreg, 32), assembler->sh4_context_mem_operand(GetRegPtr(reg))); + assembler->Str(Register(nreg, 32), assembler->sh4_context_mem_operand((Sh4RegType)reg)); } void Arm64RegAlloc::Preload_FPU(u32 reg, eFReg nreg) { - assembler->Ldr(VRegister(nreg, 32), assembler->sh4_context_mem_operand(GetRegPtr(reg))); + assembler->Ldr(VRegister(nreg, 32), assembler->sh4_context_mem_operand((Sh4RegType)reg)); } void Arm64RegAlloc::Writeback_FPU(u32 reg, eFReg nreg) { - assembler->Str(VRegister(nreg, 32), assembler->sh4_context_mem_operand(GetRegPtr(reg))); + assembler->Str(VRegister(nreg, 32), assembler->sh4_context_mem_operand((Sh4RegType)reg)); } #endif // FEAT_SHREC == DYNAREC_JIT diff --git a/core/rec-x64/rec_x64.cpp b/core/rec-x64/rec_x64.cpp index 277d1ed5b..08e5df24e 100644 --- a/core/rec-x64/rec_x64.cpp +++ b/core/rec-x64/rec_x64.cpp @@ -18,21 +18,13 @@ using namespace Xbyak::util; #include "hw/sh4/sh4_mem.h" #include "x64_regalloc.h" #include "xbyak_base.h" -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" #include "oslib/virtmem.h" - -struct DynaRBI : RuntimeBlockInfo -{ - u32 Relink() override { - return 0; - } -}; +#include "cfg/option.h" static void (*mainloop)(); static void (*handleException)(); -u32 mem_writes, mem_reads; - static u64 jmp_rsp; namespace MemSize { @@ -67,32 +59,12 @@ static UnwindInfo unwinder; static float xmmSave[4]; #endif -void ngen_mainloop(void *) -{ - verify(mainloop != nullptr); - try { - mainloop(); - } catch (const SH4ThrownException& ex) { - ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop code %x", ex.expEvn); - throw FlycastException("Fatal: Unhandled SH4 exception"); - } -} - -void ngen_init() -{ -} - -RuntimeBlockInfo* ngen_AllocateBlock() -{ - return new DynaRBI(); -} - static void ngen_blockcheckfail(u32 pc) { //printf("X64 JIT: SMC invalidation at %08X\n", pc); rdv_BlockCheckFail(pc); } -static void handle_sh4_exception(SH4ThrownException& ex, u32 pc) +static void handle_sh4_exception(Sh4Context *ctx, SH4ThrownException& ex, u32 pc) { if (pc & 1) { @@ -101,25 +73,25 @@ static void handle_sh4_exception(SH4ThrownException& ex, u32 pc) pc--; } Do_Exception(pc, ex.expEvn); - p_sh4rcb->cntx.cycle_counter += 4; // probably more is needed + ctx->cycle_counter += 4; // probably more is needed handleException(); } -static void interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) +static void interpreter_fallback(Sh4Context *ctx, u16 op, OpCallFP *oph, u32 pc) { try { - oph(op); + oph(ctx, op); } catch (SH4ThrownException& ex) { - handle_sh4_exception(ex, pc); + handle_sh4_exception(ctx, ex, pc); } } -static void do_sqw_mmu_no_ex(u32 addr, u32 pc) +static void do_sqw_mmu_no_ex(u32 addr, Sh4Context *ctx, u32 pc) { try { - do_sqw_mmu(addr); + ctx->doSqWrite(addr, ctx); } catch (SH4ThrownException& ex) { - handle_sh4_exception(ex, pc); + handle_sh4_exception(ctx, ex, pc); } } @@ -149,12 +121,12 @@ class BlockCompiler : public BaseXbyakRec using BaseCompiler = BaseXbyakRec; friend class BaseXbyakRec; - BlockCompiler() : BaseCompiler(), regalloc(this) { } - BlockCompiler(u8 *code_ptr) : BaseCompiler(code_ptr), regalloc(this) { } + BlockCompiler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) : BaseCompiler(sh4ctx, codeBuffer), regalloc(this) { } + BlockCompiler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer, u8 *code_ptr) : BaseCompiler(sh4ctx, codeBuffer, code_ptr), regalloc(this) { } - void compile(RuntimeBlockInfo* block, bool force_checks, bool reset, bool staging, bool optimise) + void compile(RuntimeBlockInfo* block, bool force_checks, bool optimise) { - //printf("X86_64 compiling %08x to %p\n", block->addr, emit_GetCCPtr()); + //printf("X86_64 compiling %08x to %p\n", block->addr, codeBuffer.get()); current_opid = -1; CheckBlock(force_checks, block); @@ -164,7 +136,7 @@ class BlockCompiler : public BaseXbyakRec if (mmu_enabled() && block->has_fpu_op) { Xbyak::Label fpu_enabled; - mov(rax, (uintptr_t)&sr); + mov(rax, (uintptr_t)&sh4ctx.sr.status); test(dword[rax], 0x8000); // test SR.FD bit jz(fpu_enabled); mov(call_regs[0], block->vaddr); // pc @@ -173,7 +145,7 @@ class BlockCompiler : public BaseXbyakRec jmp(exit_block, T_NEAR); L(fpu_enabled); } - mov(rax, (uintptr_t)&p_sh4rcb->cntx.cycle_counter); + mov(rax, (uintptr_t)&sh4ctx.cycle_counter); sub(dword[rax], block->guest_cycles); regalloc.DoAlloc(block); @@ -189,18 +161,19 @@ class BlockCompiler : public BaseXbyakRec case shop_ifb: if (mmu_enabled()) { - mov(call_regs64[1], reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler - mov(call_regs[2], block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc + mov(call_regs64[2], reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler + mov(call_regs[3], block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc } if (op.rs1._imm) { - mov(rax, (size_t)&next_pc); + mov(rax, (size_t)&sh4ctx.pc); mov(dword[rax], op.rs2._imm); } - mov(call_regs[0], op.rs3._imm); - + mov(call_regs[1], op.rs3._imm); + mov(call_regs64[0], (uintptr_t)&sh4ctx); + if (!mmu_enabled()) GenCall(OpDesc[op.rs3._imm]->oph); else @@ -214,9 +187,9 @@ class BlockCompiler : public BaseXbyakRec verify(op.rs1.is_r64f()); #if ALLOC_F64 == false - mov(rax, (uintptr_t)op.rs1.reg_ptr()); + mov(rax, (uintptr_t)op.rs1.reg_ptr(sh4ctx)); mov(rax, qword[rax]); - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(qword[rcx], rax); #else Xbyak::Xmm rd0 = regalloc.MapXRegister(op.rd, 0); @@ -253,7 +226,7 @@ class BlockCompiler : public BaseXbyakRec add(call_regs[0], regalloc.MapRegister(op.rs3)); else { - mov(rax, (uintptr_t)op.rs3.reg_ptr()); + mov(rax, (uintptr_t)op.rs3.reg_ptr(sh4ctx)); add(call_regs[0], dword[rax]); } } @@ -265,7 +238,7 @@ class BlockCompiler : public BaseXbyakRec #if ALLOC_F64 == false if (size == MemSize::S64) { - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(qword[rcx], rax); } else @@ -290,7 +263,7 @@ class BlockCompiler : public BaseXbyakRec add(call_regs[0], regalloc.MapRegister(op.rs3)); else { - mov(rax, (uintptr_t)op.rs3.reg_ptr()); + mov(rax, (uintptr_t)op.rs3.reg_ptr(sh4ctx)); add(call_regs[0], dword[rax]); } } @@ -299,7 +272,7 @@ class BlockCompiler : public BaseXbyakRec #if ALLOC_F64 == false if (op.size == 8) { - mov(rax, (uintptr_t)op.rs2.reg_ptr()); + mov(rax, (uintptr_t)op.rs2.reg_ptr(sh4ctx)); mov(call_regs64[1], qword[rax]); } else @@ -323,7 +296,8 @@ class BlockCompiler : public BaseXbyakRec GenCall(UpdateSR); break; case shop_sync_fpscr: - GenCall(UpdateFPSCR); + mov(call_regs64[0], (uintptr_t)&sh4ctx); + GenCall(Sh4Context::UpdateFPSCR); break; case shop_negc: @@ -387,7 +361,7 @@ class BlockCompiler : public BaseXbyakRec } else { - mov(rax, (uintptr_t)op.rs1.reg_ptr()); + mov(rax, (uintptr_t)op.rs1.reg_ptr(sh4ctx)); mov(eax, dword[rax]); rn = eax; } @@ -398,16 +372,15 @@ class BlockCompiler : public BaseXbyakRec mov(call_regs[0], rn); } + mov(call_regs64[1], (uintptr_t)&sh4ctx); if (mmu_enabled()) { - mov(call_regs[1], block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc - + mov(call_regs[2], block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc GenCall(do_sqw_mmu_no_ex); } else { - mov(call_regs64[1], (uintptr_t)sq_both); - mov(rax, (size_t)&do_sqw_nommu); + mov(rax, (size_t)&sh4ctx.doSqWrite); saveXmmRegisters(); call(qword[rax]); restoreXmmRegisters(); @@ -417,8 +390,8 @@ class BlockCompiler : public BaseXbyakRec break; case shop_frswap: - mov(rax, (uintptr_t)op.rs1.reg_ptr()); - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rax, (uintptr_t)op.rs1.reg_ptr(sh4ctx)); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); if (cpu.has(Cpu::tAVX512F)) { vmovaps(zmm0, zword[rax]); @@ -449,6 +422,42 @@ class BlockCompiler : public BaseXbyakRec } } break; + + case shop_fmac: + { + Xbyak::Xmm rs1 = regalloc.MapXRegister(op.rs1); + Xbyak::Xmm rs2 = regalloc.MapXRegister(op.rs2); + Xbyak::Xmm rs3 = regalloc.MapXRegister(op.rs3); + Xbyak::Xmm rd = regalloc.MapXRegister(op.rd); + if (rd == rs2) + { + movss(xmm1, rs2); + rs2 = xmm1; + } + if (rd == rs3) + { + movss(xmm2, rs3); + rs3 = xmm2; + } + if (op.rs1.is_imm()) // FIXME MapXRegister(op.rs1) would have failed + { + mov(eax, op.rs1._imm); + movd(rd, eax); + } + else if (rd != rs1) + { + movss(rd, rs1); + } + if (cpu.has(Cpu::tFMA) && !config::GGPOEnable) + vfmadd231ss(rd, rs2, rs3); + else + { + movss(xmm0, rs2); + mulss(xmm0, rs3); + addss(rd, xmm0); + } + } + break; #endif default: @@ -463,7 +472,7 @@ class BlockCompiler : public BaseXbyakRec regalloc.Cleanup(); current_opid = -1; - mov(rax, (size_t)&next_pc); + mov(rax, (size_t)&sh4ctx.pc); switch (block->BlockType) { @@ -483,9 +492,9 @@ class BlockCompiler : public BaseXbyakRec mov(dword[rax], block->NextBlock); if (block->has_jcond) - mov(rdx, (size_t)&Sh4cntx.jdyn); + mov(rdx, (size_t)&sh4ctx.jdyn); else - mov(rdx, (size_t)&sr.T); + mov(rdx, (size_t)&sh4ctx.sr.T); cmp(dword[rdx], block->BlockType & 1); Xbyak::Label branch_not_taken; @@ -500,7 +509,7 @@ class BlockCompiler : public BaseXbyakRec case BET_DynamicCall: case BET_DynamicRet: //next_pc = *jdyn; - mov(rdx, (size_t)&Sh4cntx.jdyn); + mov(rdx, (size_t)&sh4ctx.jdyn); mov(edx, dword[rdx]); mov(dword[rax], edx); break; @@ -509,7 +518,7 @@ class BlockCompiler : public BaseXbyakRec case BET_StaticIntr: if (block->BlockType == BET_DynamicIntr) { //next_pc = *jdyn; - mov(rdx, (size_t)&Sh4cntx.jdyn); + mov(rdx, (size_t)&sh4ctx.jdyn); mov(edx, dword[rdx]); mov(dword[rax], edx); } @@ -534,48 +543,49 @@ class BlockCompiler : public BaseXbyakRec block->code = (DynarecCodeEntryPtr)getCode(); block->host_code_size = getSize(); - emit_Skip(getSize()); + codeBuffer.advance(getSize()); } - void ngen_CC_Start(const shil_opcode& op) + void canonStart(const shil_opcode& op) { CC_pars.clear(); } - void ngen_CC_param(const shil_opcode& op, const shil_param& prm, CanonicalParamType tp) { + void canonParam(const shil_opcode& op, const shil_param *prm, CanonicalParamType tp) { switch (tp) { case CPT_u32: case CPT_ptr: case CPT_f32: + case CPT_sh4ctx: { - CC_PS t = { tp, &prm }; + CC_PS t = { tp, prm }; CC_pars.push_back(t); + break; } - break; // store from EAX case CPT_u64rvL: case CPT_u32rv: mov(rcx, rax); - host_reg_to_shil_param(prm, ecx); + host_reg_to_shil_param(*prm, ecx); break; case CPT_u64rvH: // assuming CPT_u64rvL has just been called shr(rcx, 32); - host_reg_to_shil_param(prm, ecx); + host_reg_to_shil_param(*prm, ecx); break; // store from xmm0 case CPT_f32rv: - host_reg_to_shil_param(prm, xmm0); + host_reg_to_shil_param(*prm, xmm0); break; } } - void ngen_CC_Call(const shil_opcode& op, void* function) + void canonCall(const shil_opcode& op, void* function) { int regused = 0; int xmmused = 0; @@ -598,11 +608,15 @@ class BlockCompiler : public BaseXbyakRec //push the ptr itself case CPT_ptr: verify(prm.is_reg()); - mov(call_regs64[regused++], (size_t)prm.reg_ptr()); + mov(call_regs64[regused++], (size_t)prm.reg_ptr(sh4ctx)); + break; + + case CPT_sh4ctx: + mov(call_regs64[regused++], (uintptr_t)&sh4ctx); break; default: - // Other cases handled in ngen_CC_param + // Other cases handled in canonParam break; } } @@ -613,9 +627,9 @@ class BlockCompiler : public BaseXbyakRec const shil_param& prm = *ccParam.prm; if (ccParam.type == CPT_ptr && prm.count() == 2 && regalloc.IsAllocf(prm) && (op.rd._reg == prm._reg || op.rd2._reg == prm._reg)) { // fsca rd param is a pointer to a 64-bit reg so reload the regs if allocated - mov(rax, (size_t)GetRegPtr(prm._reg)); + mov(rax, (size_t)GetRegPtr(sh4ctx, prm._reg)); movss(regalloc.MapXRegister(prm, 0), dword[rax]); - mov(rax, (size_t)GetRegPtr(prm._reg + 1)); + mov(rax, (size_t)GetRegPtr(sh4ctx, prm._reg + 1)); movss(regalloc.MapXRegister(prm, 1), dword[rax]); } } @@ -624,22 +638,22 @@ class BlockCompiler : public BaseXbyakRec void RegPreload(u32 reg, Xbyak::Operand::Code nreg) { - mov(rax, (size_t)GetRegPtr(reg)); + mov(rax, (size_t)GetRegPtr(sh4ctx, reg)); mov(Xbyak::Reg32(nreg), dword[rax]); } void RegWriteback(u32 reg, Xbyak::Operand::Code nreg) { - mov(rax, (size_t)GetRegPtr(reg)); + mov(rax, (size_t)GetRegPtr(sh4ctx, reg)); mov(dword[rax], Xbyak::Reg32(nreg)); } void RegPreload_FPU(u32 reg, s8 nreg) { - mov(rax, (size_t)GetRegPtr(reg)); + mov(rax, (size_t)GetRegPtr(sh4ctx, reg)); movss(Xbyak::Xmm(nreg), dword[rax]); } void RegWriteback_FPU(u32 reg, s8 nreg) { - mov(rax, (size_t)GetRegPtr(reg)); + mov(rax, (size_t)GetRegPtr(sh4ctx, reg)); movss(dword[rax], Xbyak::Xmm(nreg)); } @@ -675,7 +689,7 @@ class BlockCompiler : public BaseXbyakRec Xbyak::Label run_loop; L(run_loop); Xbyak::Label end_run_loop; - mov(rax, (size_t)&p_sh4rcb->cntx.CpuRunning); + mov(rax, (size_t)&sh4ctx.CpuRunning); mov(edx, dword[rax]); test(edx, edx); @@ -684,11 +698,11 @@ class BlockCompiler : public BaseXbyakRec //slice_loop: Xbyak::Label slice_loop; L(slice_loop); - mov(rax, (size_t)&p_sh4rcb->cntx.pc); + mov(rax, (size_t)&sh4ctx.pc); mov(call_regs[0], dword[rax]); call(bm_GetCodeByVAddr); call(rax); - mov(rax, (uintptr_t)&p_sh4rcb->cntx.cycle_counter); + mov(rax, (uintptr_t)&sh4ctx.cycle_counter); mov(ecx, dword[rax]); test(ecx, ecx); jg(slice_loop); @@ -735,7 +749,7 @@ class BlockCompiler : public BaseXbyakRec genMemHandlers(); size_t savedSize = getSize(); - setSize(CODE_SIZE - 128 - startOffset); + setSize(codeBuffer.getFreeSpace() - 128 - startOffset); unwindSize = unwinder.end(getSize()); verify(unwindSize <= 128); setSize(savedSize); @@ -744,7 +758,7 @@ class BlockCompiler : public BaseXbyakRec mainloop = (void (*)())getCode(); handleException = (void(*)())handleExceptionLabel.getAddress(); - emit_Skip(getSize()); + codeBuffer.advance(getSize()); } bool rewriteMemAccess(host_context_t &context) @@ -752,7 +766,7 @@ class BlockCompiler : public BaseXbyakRec if (!addrspace::virtmemEnabled()) return false; - //printf("ngen_Rewrite pc %p\n", context.pc); + //printf("rewriteMemAccess pc %p\n", context.pc); if (context.pc < (size_t)MemHandlerStart || context.pc >= (size_t)MemHandlerEnd) return false; @@ -853,7 +867,7 @@ class BlockCompiler : public BaseXbyakRec else { movsx(eax, byte[rax]); - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(dword[rcx], eax); } break; @@ -864,7 +878,7 @@ class BlockCompiler : public BaseXbyakRec else { movsx(eax, word[rax]); - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(dword[rcx], eax); } break; @@ -877,7 +891,7 @@ class BlockCompiler : public BaseXbyakRec else { mov(eax, dword[rax]); - mov(rcx, (uintptr_t)op.rd.reg_ptr()); + mov(rcx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(dword[rcx], eax); } break; @@ -885,7 +899,7 @@ class BlockCompiler : public BaseXbyakRec case 8: #if ALLOC_F64 == false mov(rcx, qword[rax]); - mov(rax, (uintptr_t)op.rd.reg_ptr()); + mov(rax, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(qword[rax], rcx); #else movd(regalloc.MapXRegister(op.rd, 0), dword[rax]); @@ -907,7 +921,7 @@ class BlockCompiler : public BaseXbyakRec mov(call_regs[0], addr); GenCall((void (*)())ptr); #if ALLOC_F64 == false - mov(rcx, (size_t)op.rd.reg_ptr()); + mov(rcx, (size_t)op.rd.reg_ptr(sh4ctx)); mov(dword[rcx], eax); #else movd(regalloc.MapXRegister(op.rd, 0), eax); @@ -916,7 +930,7 @@ class BlockCompiler : public BaseXbyakRec mov(call_regs[0], addr + 4); GenCall((void (*)())ptr); #if ALLOC_F64 == false - mov(rcx, (size_t)op.rd.reg_ptr() + 4); + mov(rcx, (size_t)op.rd.reg_ptr(sh4ctx) + 4); mov(dword[rcx], eax); #else movd(regalloc.MapXRegister(op.rd, 1), eax); @@ -976,7 +990,7 @@ class BlockCompiler : public BaseXbyakRec mov(byte[rax], (u8)op.rs2._imm); else { - mov(rcx, (uintptr_t)op.rs2.reg_ptr()); + mov(rcx, (uintptr_t)op.rs2.reg_ptr(sh4ctx)); mov(cl, byte[rcx]); mov(byte[rax], cl); } @@ -989,7 +1003,7 @@ class BlockCompiler : public BaseXbyakRec mov(word[rax], (u16)op.rs2._imm); else { - mov(rcx, (uintptr_t)op.rs2.reg_ptr()); + mov(rcx, (uintptr_t)op.rs2.reg_ptr(sh4ctx)); mov(cx, word[rcx]); mov(word[rax], cx); } @@ -1004,7 +1018,7 @@ class BlockCompiler : public BaseXbyakRec mov(dword[rax], op.rs2._imm); else { - mov(rcx, (uintptr_t)op.rs2.reg_ptr()); + mov(rcx, (uintptr_t)op.rs2.reg_ptr(sh4ctx)); mov(ecx, dword[rcx]); mov(dword[rax], ecx); } @@ -1012,7 +1026,7 @@ class BlockCompiler : public BaseXbyakRec case 8: #if ALLOC_F64 == false - mov(rcx, (uintptr_t)op.rs2.reg_ptr()); + mov(rcx, (uintptr_t)op.rs2.reg_ptr(sh4ctx)); mov(rcx, qword[rcx]); mov(qword[rax], rcx); #else @@ -1049,7 +1063,7 @@ class BlockCompiler : public BaseXbyakRec // same at compile and run times. if (mmu_enabled()) { - mov(rax, (uintptr_t)&next_pc); + mov(rax, (uintptr_t)&sh4ctx.pc); cmp(dword[rax], block->vaddr); jne(reinterpret_cast(&ngen_blockcheckfail)); } @@ -1152,7 +1166,7 @@ class BlockCompiler : public BaseXbyakRec shr(r9d, 26); cmp(r9d, 0x38); jne(no_sqw); - mov(rax, (uintptr_t)p_sh4rcb->sq_buffer); + mov(rax, (uintptr_t)sh4ctx.sq_buffer); and_(call_regs[0], 0x3F); if (size == MemSize::S32) @@ -1296,86 +1310,114 @@ void X64RegAlloc::Writeback_FPU(u32 reg, s8 nreg) compiler->RegWriteback_FPU(reg, nreg); } -static BlockCompiler* ccCompiler; - -void ngen_Compile(RuntimeBlockInfo* block, bool smc_checks, bool reset, bool staging, bool optimise) +class X64Dynarec : public Sh4Dynarec { - verify(emit_FreeSpace() >= 16 * 1024); - void* protStart = emit_GetCCPtr(); - size_t protSize = emit_FreeSpace(); - virtmem::jit_set_exec(protStart, protSize, false); +public: + X64Dynarec() { + sh4Dynarec = this; + } - BlockCompiler compiler; - ::ccCompiler = &compiler; - try { - compiler.compile(block, smc_checks, reset, staging, optimise); - } catch (const Xbyak::Error& e) { - ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + void compile(RuntimeBlockInfo* block, bool smc_checks, bool optimise) override + { + void* protStart = codeBuffer->get(); + size_t protSize = codeBuffer->getFreeSpace(); + virtmem::jit_set_exec(protStart, protSize, false); + + ccCompiler = new BlockCompiler(*sh4ctx, *codeBuffer); + try { + ccCompiler->compile(block, smc_checks, optimise); + } catch (const Xbyak::Error& e) { + ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + } + delete ccCompiler; + ccCompiler = nullptr; + virtmem::jit_set_exec(protStart, protSize, true); } - ::ccCompiler = nullptr; - virtmem::jit_set_exec(protStart, protSize, true); -} -void ngen_CC_Start(shil_opcode* op) -{ - ccCompiler->ngen_CC_Start(*op); -} + void init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) override + { + this->sh4ctx = &sh4ctx; + this->codeBuffer = &codeBuffer; + } -void ngen_CC_Param(shil_opcode* op, shil_param* par, CanonicalParamType tp) -{ - ccCompiler->ngen_CC_param(*op, *par, tp); -} + void mainloop(void *) override + { + verify(::mainloop != nullptr); + try { + ::mainloop(); + } catch (const SH4ThrownException& ex) { + ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop code %x", ex.expEvn); + throw FlycastException("Fatal: Unhandled SH4 exception"); + } + } -void ngen_CC_Call(shil_opcode* op, void* function) -{ - ccCompiler->ngen_CC_Call(*op, function); -} + void canonStart(const shil_opcode* op) override { + ccCompiler->canonStart(*op); + } -void ngen_CC_Finish(shil_opcode* op) -{ -} + void canonParam(const shil_opcode* op, const shil_param* par, CanonicalParamType tp) override { + ccCompiler->canonParam(*op, par, tp); + } -bool ngen_Rewrite(host_context_t &context, void *faultAddress) -{ - void* protStart = emit_GetCCPtr(); - size_t protSize = emit_FreeSpace(); - virtmem::jit_set_exec(protStart, protSize, false); + void canonCall(const shil_opcode* op, void* function) override { + ccCompiler->canonCall(*op, function); + } - u8 *retAddr = *(u8 **)context.rsp - 5; - BlockCompiler compiler(retAddr); - bool rc = false; - try { - rc = compiler.rewriteMemAccess(context); + void canonFinish(const shil_opcode* op) override { + } + + bool rewrite(host_context_t &context, void *faultAddress) override + { + if (codeBuffer == nullptr) + // init() not called yet + return false; + void* protStart = codeBuffer->get(); + size_t protSize = codeBuffer->getFreeSpace(); + virtmem::jit_set_exec(protStart, protSize, false); + + u8 *retAddr = *(u8 **)context.rsp - 5; + BlockCompiler compiler(*sh4ctx, *codeBuffer, retAddr); + bool rc = false; + try { + rc = compiler.rewriteMemAccess(context); + } catch (const Xbyak::Error& e) { + ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + } virtmem::jit_set_exec(protStart, protSize, true); - } catch (const Xbyak::Error& e) { - ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + return rc; } - return rc; -} -void ngen_HandleException(host_context_t &context) -{ - context.pc = (uintptr_t)handleException; -} + void handleException(host_context_t &context) override + { + context.pc = (uintptr_t)::handleException; + } -void ngen_ResetBlocks() -{ - unwinder.clear(); - // Avoid generating the main loop more than once - if (mainloop != nullptr && mainloop != emit_GetCCPtr()) - return; + void reset() override + { + unwinder.clear(); + // Avoid generating the main loop more than once + if (::mainloop != nullptr && ::mainloop != codeBuffer->get()) + return; - void* protStart = emit_GetCCPtr(); - size_t protSize = emit_FreeSpace(); - virtmem::jit_set_exec(protStart, protSize, false); + void* protStart = codeBuffer->get(); + size_t protSize = codeBuffer->getFreeSpace(); + virtmem::jit_set_exec(protStart, protSize, false); - BlockCompiler compiler; - try { - compiler.genMainloop(); - } catch (const Xbyak::Error& e) { - ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + BlockCompiler compiler(*sh4ctx, *codeBuffer); + try { + compiler.genMainloop(); + } catch (const Xbyak::Error& e) { + ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + } + virtmem::jit_set_exec(protStart, protSize, true); } - virtmem::jit_set_exec(protStart, protSize, true); -} + +private: + Sh4Context *sh4ctx = nullptr; + Sh4CodeBuffer *codeBuffer = nullptr; + BlockCompiler *ccCompiler = nullptr; +}; + +static X64Dynarec instance; #endif diff --git a/core/rec-x64/xbyak_base.h b/core/rec-x64/xbyak_base.h index 4fa95debf..cdbc01ad7 100644 --- a/core/rec-x64/xbyak_base.h +++ b/core/rec-x64/xbyak_base.h @@ -28,8 +28,9 @@ template class BaseXbyakRec : public Xbyak::CodeGenerator { protected: - BaseXbyakRec() : BaseXbyakRec((u8 *)emit_GetCCPtr()) { } - BaseXbyakRec(u8 *code_ptr) : Xbyak::CodeGenerator(emit_FreeSpace(), code_ptr) { } + BaseXbyakRec(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) : BaseXbyakRec(sh4ctx, codeBuffer, (u8 *)codeBuffer.get()) { } + BaseXbyakRec(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer, u8 *code_ptr) + : Xbyak::CodeGenerator(codeBuffer.getFreeSpace(), code_ptr), sh4ctx(sh4ctx), codeBuffer(codeBuffer) { } using BinaryOp = void (BaseXbyakRec::*)(const Xbyak::Operand&, const Xbyak::Operand&); using BinaryFOp = void (BaseXbyakRec::*)(const Xbyak::Xmm&, const Xbyak::Operand&); @@ -521,7 +522,7 @@ class BaseXbyakRec : public Xbyak::CodeGenerator movss(xmm2, rs3); rs3 = xmm2; } - if (op.rs1.is_imm()) + if (op.rs1.is_imm()) // FIXME mapXRegister(op.rs1) would have failed { mov(eax, op.rs1._imm); movd(rd, eax); @@ -530,19 +531,13 @@ class BaseXbyakRec : public Xbyak::CodeGenerator { movss(rd, rs1); } - //if (cpu.has(Xbyak::util::Cpu::tFMA)) - // vfmadd231ss(rd, rs2, rs3); - //else - { - movss(xmm0, rs2); - mulss(xmm0, rs3); - addss(rd, xmm0); - } + movss(xmm0, rs2); + mulss(xmm0, rs3); + addss(rd, xmm0); } break; case shop_fsrra: - // RSQRTSS has an |error| <= 1.5*2^-12 where the SH4 FSRRA needs |error| <= 2^-21 sqrtss(xmm0, mapXRegister(op.rs1)); if (ArchX64) { @@ -588,7 +583,7 @@ class BaseXbyakRec : public Xbyak::CodeGenerator mov(rcx, (uintptr_t)&sin_table); mov(rcx, qword[rcx + rax * 8]); #if ALLOC_F64 == false - mov(rdx, (uintptr_t)op.rd.reg_ptr()); + mov(rdx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); mov(qword[rdx], rcx); #else movd(mapXRegister(op.rd, 0), ecx); @@ -606,8 +601,8 @@ class BaseXbyakRec : public Xbyak::CodeGenerator verify(!isAllocAny(op.rd)); mov(ecx, dword[(size_t)&sin_table + eax * 8]); mov(edx, dword[(size_t)&sin_table[0].u[1] + eax * 8]); - mov(dword[op.rd.reg_ptr()], ecx); - mov(dword[op.rd.reg_ptr() + 1], edx); + mov(dword[op.rd.reg_ptr(sh4ctx)], ecx); + mov(dword[op.rd.reg_ptr(sh4ctx) + 1], edx); #endif } break; @@ -685,13 +680,13 @@ class BaseXbyakRec : public Xbyak::CodeGenerator if (ArchX64) { #ifndef XBYAK32 - mov(rax, (size_t)param.reg_ptr()); + mov(rax, (size_t)param.reg_ptr(sh4ctx)); mov(reg.cvt32(), dword[rax]); #endif } else { - mov(reg.cvt32(), dword[param.reg_ptr()]); + mov(reg.cvt32(), dword[param.reg_ptr(sh4ctx)]); } } } @@ -708,7 +703,7 @@ class BaseXbyakRec : public Xbyak::CodeGenerator if (ArchX64) { #ifndef XBYAK32 - mov(rax, (size_t)param.reg_ptr()); + mov(rax, (size_t)param.reg_ptr(sh4ctx)); if (!reg.isXMM()) mov(reg.cvt32(), dword[rax]); else @@ -718,9 +713,9 @@ class BaseXbyakRec : public Xbyak::CodeGenerator else { if (!reg.isXMM()) - mov(reg.cvt32(), dword[param.reg_ptr()]); + mov(reg.cvt32(), dword[param.reg_ptr(sh4ctx)]); else - movss((const Xbyak::Xmm &)reg, dword[param.reg_ptr()]); + movss((const Xbyak::Xmm &)reg, dword[param.reg_ptr(sh4ctx)]); } } } @@ -762,7 +757,7 @@ class BaseXbyakRec : public Xbyak::CodeGenerator if (ArchX64) { #ifndef XBYAK32 - mov(rax, (size_t)param.reg_ptr()); + mov(rax, (size_t)param.reg_ptr(sh4ctx)); if (!reg.isXMM()) mov(dword[rax], reg.cvt32()); else @@ -772,13 +767,16 @@ class BaseXbyakRec : public Xbyak::CodeGenerator else { if (!reg.isXMM()) - mov(dword[param.reg_ptr()], reg.cvt32()); + mov(dword[param.reg_ptr(sh4ctx)], reg.cvt32()); else - movss(dword[param.reg_ptr()], (const Xbyak::Xmm &)reg); + movss(dword[param.reg_ptr(sh4ctx)], (const Xbyak::Xmm &)reg); } } } + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; + private: Xbyak::Reg32 mapRegister(const shil_param& param) { return static_cast(this)->regalloc.MapRegister(param); diff --git a/core/rec-x86/rec_x86.cpp b/core/rec-x86/rec_x86.cpp index f73867611..6d422fc89 100644 --- a/core/rec-x86/rec_x86.cpp +++ b/core/rec-x86/rec_x86.cpp @@ -22,11 +22,11 @@ #include "rec_x86.h" #include "hw/sh4/sh4_core.h" -#include "hw/sh4/sh4_interpreter.h" #include "hw/sh4/sh4_interrupts.h" #include "hw/sh4/sh4_mem.h" #include "hw/mem/addrspace.h" -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" +#include "emulator.h" static void (*mainloop)(); static void (*ngen_FailedToFindBlock_)(); @@ -39,18 +39,13 @@ static void (*ngen_LinkBlock_Generic_stub)(); static void (*ngen_blockcheckfail)(); void (*X86Compiler::handleException)(); -static X86Compiler* compiler; - static Xbyak::Operand::Code alloc_regs[] { Xbyak::Operand::EBX, Xbyak::Operand::EBP, Xbyak::Operand::ESI, Xbyak::Operand::EDI, (Xbyak::Operand::Code)-1 }; static s8 alloc_fregs[] = { 7, 6, 5, 4, -1 }; alignas(16) static f32 thaw_regs[4]; UnwindInfo unwinder; -static bool restarting; static u64 jmp_esp; -static void generate_mainloop(); - void X86RegAlloc::doAlloc(RuntimeBlockInfo* block) { RegAlloc::DoAlloc(block, alloc_regs, alloc_fregs); @@ -74,14 +69,15 @@ void X86RegAlloc::Writeback_FPU(u32 reg, s8 nreg) struct DynaRBI : RuntimeBlockInfo { + DynaRBI(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) + : sh4ctx(sh4ctx), codeBuffer(codeBuffer) {} u32 Relink() override; + +private: + Sh4Context& sh4ctx; + Sh4CodeBuffer& codeBuffer; }; -RuntimeBlockInfo* ngen_AllocateBlock() -{ - generate_mainloop(); - return new DynaRBI(); -} void X86Compiler::alignStack(int amount) { @@ -96,7 +92,7 @@ void X86Compiler::alignStack(int amount) void X86Compiler::compile(RuntimeBlockInfo* block, bool force_checks, bool optimise) { - DEBUG_LOG(DYNAREC, "X86 compiling %08x to %p", block->addr, emit_GetCCPtr()); + DEBUG_LOG(DYNAREC, "X86 compiling %08x to %p", block->addr, codeBuffer.get()); current_opid = -1; unwinder.start((void *)getCurr()); @@ -114,26 +110,26 @@ void X86Compiler::compile(RuntimeBlockInfo* block, bool force_checks, bool optim if (mmu_enabled() && block->has_fpu_op) { Xbyak::Label fpu_enabled; - mov(eax, dword[&sr]); + mov(eax, dword[&sh4ctx.sr.status]); test(eax, 0x8000); // test SR.FD bit jz(fpu_enabled); push(Sh4Ex_FpuDisabled); // exception code push(block->vaddr); // pc call((void (*)())Do_Exception); add(esp, 8); - mov(ecx, dword[&next_pc]); + mov(ecx, dword[&sh4ctx.pc]); jmp((const void *)no_update); L(fpu_enabled); } - mov(eax, dword[&Sh4cntx.cycle_counter]); + mov(eax, dword[&sh4ctx.cycle_counter]); test(eax, eax); Xbyak::Label no_up; jg(no_up); mov(ecx, block->vaddr); call((const void *)intc_sched); L(no_up); - sub(dword[&Sh4cntx.cycle_counter], block->guest_cycles); + sub(dword[&sh4ctx.cycle_counter], block->guest_cycles); regalloc.doAlloc(block); @@ -160,7 +156,7 @@ void X86Compiler::compile(RuntimeBlockInfo* block, bool force_checks, bool optim size_t unwindSize = unwinder.end(getSize()); setSize(getSize() + unwindSize); - emit_Skip(getSize()); + codeBuffer.advance(getSize()); } u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) @@ -186,7 +182,7 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) mov(ecx, block->NextBlock); - cmp(dword[GetRegPtr(block->has_jcond ? reg_pc_dyn : reg_sr_T)], (u32)block->BlockType & 1); + cmp(dword[block->has_jcond ? &sh4ctx.jdyn : &sh4ctx.sr.T], (u32)block->BlockType & 1); Xbyak::Label branch_not_taken; jne(branch_not_taken, T_SHORT); @@ -199,7 +195,7 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) case BET_DynamicCall: case BET_DynamicRet: //next_pc = *jdyn; - mov(ecx, dword[GetRegPtr(reg_pc_dyn)]); + mov(ecx, dword[&sh4ctx.jdyn]); break; case BET_DynamicIntr: @@ -207,16 +203,16 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) if (block->BlockType == BET_DynamicIntr) { //next_pc = *jdyn; - mov(ecx, dword[GetRegPtr(reg_pc_dyn)]); - mov(dword[&next_pc], ecx); + mov(ecx, dword[&sh4ctx.jdyn]); + mov(dword[&sh4ctx.pc], ecx); } else { //next_pc = next_pc_value; - mov(dword[&next_pc], block->NextBlock); + mov(dword[&sh4ctx.pc], block->NextBlock); } call(UpdateINTC); - mov(ecx, dword[&next_pc]); + mov(ecx, dword[&sh4ctx.pc]); break; default: @@ -231,7 +227,7 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) { case BET_Cond_0: case BET_Cond_1: - cmp(dword[GetRegPtr(block->has_jcond ? reg_pc_dyn : reg_sr_T)], (u32)block->BlockType & 1); + cmp(dword[block->has_jcond ? &sh4ctx.jdyn : &sh4ctx.sr.T], (u32)block->BlockType & 1); if (mmu_enabled()) { @@ -273,7 +269,7 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) case BET_DynamicRet: case BET_DynamicCall: case BET_DynamicJump: - mov(ecx, dword[GetRegPtr(reg_pc_dyn)]); + mov(ecx, dword[&sh4ctx.jdyn]); jmp((const void *)no_update); break; @@ -303,16 +299,16 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) case BET_DynamicIntr: if (block->BlockType == BET_StaticIntr) { - mov(dword[&next_pc], block->NextBlock); + mov(dword[&sh4ctx.pc], block->NextBlock); } else { - mov(eax, dword[GetRegPtr(reg_pc_dyn)]); - mov(dword[&next_pc], eax); + mov(eax, dword[&sh4ctx.jdyn]); + mov(dword[&sh4ctx.pc], eax); } call(UpdateINTC); - mov(ecx, dword[&next_pc]); + mov(ecx, dword[&sh4ctx.pc]); jmp((const void *)no_update); break; @@ -329,7 +325,7 @@ u32 X86Compiler::relinkBlock(RuntimeBlockInfo* block) u32 DynaRBI::Relink() { - X86Compiler *compiler = new X86Compiler((u8*)code + relink_offset); + X86Compiler *compiler = new X86Compiler(sh4ctx, codeBuffer, (u8*)code + relink_offset); u32 codeSize = compiler->relinkBlock(this); delete compiler; @@ -364,7 +360,13 @@ void X86Compiler::ngen_CC_param(const shil_opcode& op, const shil_param& param, //push the ptr itself case CPT_ptr: verify(param.is_reg()); - push((unat)param.reg_ptr()); + push((uintptr_t)param.reg_ptr(sh4ctx)); + CC_stackSize += 4; + unwinder.allocStackPtr(getCurr(), 4); + break; + + case CPT_sh4ctx: + push((uintptr_t)&sh4ctx); CC_stackSize += 4; unwinder.allocStackPtr(getCurr(), 4); break; @@ -382,8 +384,8 @@ void X86Compiler::ngen_CC_param(const shil_opcode& op, const shil_param& param, // store from ST(0) case CPT_f32rv: - fstp(dword[param.reg_ptr()]); - movss(regalloc.MapXRegister(param), dword[param.reg_ptr()]); + fstp(dword[param.reg_ptr(sh4ctx)]); + movss(regalloc.MapXRegister(param), dword[param.reg_ptr(sh4ctx)]); break; } } @@ -445,33 +447,33 @@ void X86Compiler::genMainloop() Xbyak::Label longjmpLabel; L(longjmpLabel); - mov(ecx, dword[&Sh4cntx.pc]); + mov(ecx, dword[&sh4ctx.pc]); //next_pc _MUST_ be on ecx Xbyak::Label cleanup; //no_update: Xbyak::Label no_updateLabel; L(no_updateLabel); - mov(edx, dword[&Sh4cntx.CpuRunning]); + mov(edx, dword[&sh4ctx.CpuRunning]); cmp(edx, 0); jz(cleanup); if (!mmu_enabled()) { mov(esi, ecx); // save sh4 pc in ESI, used below if FPCB is still empty for this address - mov(eax, (size_t)&p_sh4rcb->fpcb[0]); + mov(eax, (uintptr_t)&sh4ctx + sizeof(Sh4Context) - sizeof(Sh4RCB) + offsetof(Sh4RCB, fpcb)); // address of fpcb[0] and_(ecx, RAM_SIZE_MAX - 2); jmp(dword[eax + ecx * 2]); } else { - mov(dword[&next_pc], ecx); + mov(dword[&sh4ctx.pc], ecx); call((void *)bm_GetCodeByVAddr); jmp(eax); } //cleanup: L(cleanup); - mov(dword[&next_pc], ecx); + mov(dword[&sh4ctx.pc], ecx); #ifndef _WIN32 // 16-byte alignment add(esp, 12); @@ -487,7 +489,7 @@ void X86Compiler::genMainloop() Xbyak::Label do_iter; L(do_iter); add(esp, 4); // pop intc_sched() return address - mov(ecx, dword[&Sh4cntx.pc]); + mov(ecx, dword[sh4ctx.pc]); jmp(no_updateLabel); //ngen_LinkBlock_Shared_stub: @@ -509,8 +511,8 @@ void X86Compiler::genMainloop() unwinder.endProlog(0); Xbyak::Label intc_schedLabel; L(intc_schedLabel); - add(dword[&Sh4cntx.cycle_counter], SH4_TIMESLICE); - mov(dword[&Sh4cntx.pc], ecx); + add(dword[&sh4ctx.cycle_counter], SH4_TIMESLICE); + mov(dword[&sh4ctx.pc], ecx); call((void *)UpdateSystem_INTC); cmp(eax, 0); jnz(do_iter); @@ -531,7 +533,7 @@ void X86Compiler::genMainloop() //ngen_LinkBlock_Generic_stub: Xbyak::Label ngen_LinkBlock_Generic_label; L(ngen_LinkBlock_Generic_label); - mov(edx, dword[&Sh4cntx.jdyn]); + mov(edx, dword[&sh4ctx.jdyn]); jmp(ngen_LinkBlock_Shared_stub); genMemHandlers(); @@ -574,7 +576,7 @@ void X86Compiler::genMainloop() Xbyak::Label jumpblockLabel; cmp(eax, 0); jne(jumpblockLabel); - mov(ecx, dword[&next_pc]); + mov(ecx, dword[&sh4ctx.pc]); jmp(no_updateLabel); L(jumpblockLabel); } @@ -591,7 +593,7 @@ void X86Compiler::genMainloop() ready(); - mainloop = (void (*)())getCode(); + ::mainloop = (void (*)())getCode(); ngen_FailedToFindBlock_ = (void (*)())failedToFindBlock.getAddress(); intc_sched = (void (*)())intc_schedLabel.getAddress(); no_update = (void (*)())no_updateLabel.getAddress(); @@ -601,12 +603,7 @@ void X86Compiler::genMainloop() ngen_blockcheckfail = (void (*)())ngen_blockcheckfailLabel.getAddress(); X86Compiler::handleException = (void (*)())handleExceptionLabel.getAddress(); - emit_Skip(getSize()); -} - -void ngen_HandleException(host_context_t &context) -{ - context.pc = (uintptr_t)X86Compiler::handleException; + codeBuffer.advance(getSize()); } bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* block) @@ -630,7 +627,7 @@ bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* b else { movsx(eax, byte[ptr]); - mov(dword[op.rd.reg_ptr()], eax); + mov(dword[op.rd.reg_ptr(sh4ctx)], eax); } break; @@ -640,7 +637,7 @@ bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* b else { movsx(eax, word[ptr]); - mov(dword[op.rd.reg_ptr()], eax); + mov(dword[op.rd.reg_ptr(sh4ctx)], eax); } break; @@ -652,7 +649,7 @@ bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* b else { mov(eax, dword[ptr]); - mov(dword[op.rd.reg_ptr()], eax); + mov(dword[op.rd.reg_ptr(sh4ctx)], eax); } break; @@ -665,7 +662,7 @@ bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* b else { movq(xmm0, qword[ptr]); - movq(qword[op.rd.reg_ptr()], xmm0); + movq(qword[op.rd.reg_ptr(sh4ctx)], xmm0); } break; @@ -684,11 +681,11 @@ bool X86Compiler::genReadMemImmediate(const shil_opcode& op, RuntimeBlockInfo* b // Need to call the handler twice mov(ecx, addr); genCall((void (DYNACALL *)())ptr); - mov(dword[op.rd.reg_ptr()], eax); + mov(dword[op.rd.reg_ptr(sh4ctx)], eax); mov(ecx, addr + 4); genCall((void (DYNACALL *)())ptr); - mov(dword[op.rd.reg_ptr() + 1], eax); + mov(dword[op.rd.reg_ptr(sh4ctx) + 1], eax); } else { @@ -752,7 +749,7 @@ bool X86Compiler::genWriteMemImmediate(const shil_opcode& op, RuntimeBlockInfo* mov(byte[ptr], (u8)op.rs2.imm_value()); else { - mov(al, byte[op.rs2.reg_ptr()]); + mov(al, byte[op.rs2.reg_ptr(sh4ctx)]); mov(byte[ptr], al); } break; @@ -764,7 +761,7 @@ bool X86Compiler::genWriteMemImmediate(const shil_opcode& op, RuntimeBlockInfo* mov(word[ptr], (u16)op.rs2.imm_value()); else { - mov(cx, word[op.rs2.reg_ptr()]); + mov(cx, word[op.rs2.reg_ptr(sh4ctx)]); mov(word[ptr], cx); } break; @@ -778,7 +775,7 @@ bool X86Compiler::genWriteMemImmediate(const shil_opcode& op, RuntimeBlockInfo* mov(dword[ptr], op.rs2.imm_value()); else { - mov(ecx, dword[op.rs2.reg_ptr()]); + mov(ecx, dword[op.rs2.reg_ptr(sh4ctx)]); mov(dword[ptr], ecx); } break; @@ -791,7 +788,7 @@ bool X86Compiler::genWriteMemImmediate(const shil_opcode& op, RuntimeBlockInfo* } else { - movq(xmm0, qword[op.rs2.reg_ptr()]); + movq(xmm0, qword[op.rs2.reg_ptr(sh4ctx)]); movq(qword[ptr], xmm0); } break; @@ -820,7 +817,7 @@ void X86Compiler::checkBlock(bool smc_checks, RuntimeBlockInfo* block) if (mmu_enabled()) { - mov(eax, dword[&next_pc]); + mov(eax, dword[&sh4ctx.pc]); cmp(eax, block->vaddr); jne(reinterpret_cast(ngen_blockcheckfail)); } @@ -846,103 +843,134 @@ void X86Compiler::checkBlock(bool smc_checks, RuntimeBlockInfo* block) } } -void ngen_init() +class X86Dynarec : public Sh4Dynarec { -} - -static void generate_mainloop() -{ - if (mainloop != nullptr) - return; +public: + X86Dynarec() { + sh4Dynarec = this; + } - compiler = new X86Compiler(); + void init(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) override + { + this->sh4ctx = &sh4ctx; + this->codeBuffer = &codeBuffer; + } - try { - compiler->genMainloop(); - } catch (const Xbyak::Error& e) { - ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + void handleException(host_context_t &context) override + { + context.pc = (uintptr_t)X86Compiler::handleException; } - delete compiler; - compiler = nullptr; + void generate_mainloop() + { + if (::mainloop != nullptr) + return; - ngen_FailedToFindBlock = ngen_FailedToFindBlock_; -} + compiler = new X86Compiler(*sh4ctx, *codeBuffer); -void ngen_ResetBlocks() -{ - mainloop = nullptr; - unwinder.clear(); + try { + compiler->genMainloop(); + } catch (const Xbyak::Error& e) { + ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + } - if (p_sh4rcb->cntx.CpuRunning) - { - // Force the dynarec out of mainloop() to regenerate it - p_sh4rcb->cntx.CpuRunning = 0; - restarting = true; + delete compiler; + compiler = nullptr; + + rdv_SetFailedToFindBlockHandler(ngen_FailedToFindBlock_); } - else - generate_mainloop(); -} -void ngen_mainloop(void* v_cntx) -{ - try { - do { - restarting = false; + void reset() override + { + ::mainloop = nullptr; + unwinder.clear(); + + if (sh4ctx->CpuRunning) + { + // Force the dynarec out of mainloop() to regenerate it + sh4ctx->CpuRunning = 0; + restarting = true; + } + else generate_mainloop(); + } - mainloop(); - if (restarting) - p_sh4rcb->cntx.CpuRunning = 1; - } while (restarting); - } catch (const SH4ThrownException& e) { - ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop %x pc %x", e.expEvn, e.epc); - throw FlycastException("Fatal: Unhandled SH4 exception"); + RuntimeBlockInfo* allocateBlock() override + { + generate_mainloop(); + return new DynaRBI(*sh4ctx, *codeBuffer); } -} -void ngen_Compile(RuntimeBlockInfo* block, bool smc_checks, bool, bool, bool optimise) -{ - verify(emit_FreeSpace() >= 16 * 1024); + void mainloop(void* v_cntx) override + { + try { + do { + restarting = false; + generate_mainloop(); + + ::mainloop(); + if (restarting && !emu.restartCpu()) + restarting = false; + } while (restarting); + } catch (const SH4ThrownException& e) { + ERROR_LOG(DYNAREC, "SH4ThrownException in mainloop %x pc %x", e.expEvn, e.epc); + throw FlycastException("Fatal: Unhandled SH4 exception"); + } + } + + void compile(RuntimeBlockInfo* block, bool smc_checks, bool optimise) override + { + compiler = new X86Compiler(*sh4ctx, *codeBuffer); - compiler = new X86Compiler(); + try { + compiler->compile(block, smc_checks, optimise); + } catch (const Xbyak::Error& e) { + ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + } - try { - compiler->compile(block, smc_checks, optimise); - } catch (const Xbyak::Error& e) { - ERROR_LOG(DYNAREC, "Fatal xbyak error: %s", e.what()); + delete compiler; } - delete compiler; -} + bool rewrite(host_context_t &context, void *faultAddress) override + { + if (codeBuffer == nullptr) + // init() not called yet + return false; + u8 *rewriteAddr = *(u8 **)context.esp - 5; + X86Compiler *compiler = new X86Compiler(*sh4ctx, *codeBuffer, rewriteAddr); + bool rv = compiler->rewriteMemAccess(context); + delete compiler; + + return rv; + } -bool ngen_Rewrite(host_context_t &context, void *faultAddress) -{ - u8 *rewriteAddr = *(u8 **)context.esp - 5; - X86Compiler *compiler = new X86Compiler(rewriteAddr); - bool rv = compiler->rewriteMemAccess(context); - delete compiler; + void canonStart(const shil_opcode *op) override + { + compiler->ngen_CC_Start(*op); + } - return rv; -} + void canonParam(const shil_opcode *op, const shil_param *par, CanonicalParamType tp) override + { + compiler->ngen_CC_param(*op, *par, tp); + } -void ngen_CC_Start(shil_opcode* op) -{ - compiler->ngen_CC_Start(*op); -} + void canonCall(const shil_opcode *op, void *function) override + { + compiler->ngen_CC_Call(*op, function); + } -void ngen_CC_Param(shil_opcode* op, shil_param* par, CanonicalParamType tp) -{ - compiler->ngen_CC_param(*op, *par, tp); -} + void canonFinish(const shil_opcode *op) override + { + compiler->ngen_CC_Finish(*op); + } -void ngen_CC_Call(shil_opcode* op, void* function) -{ - compiler->ngen_CC_Call(*op, function); -} +private: + Sh4Context *sh4ctx = nullptr; + Sh4CodeBuffer *codeBuffer = nullptr; + X86Compiler *compiler = nullptr; + bool restarting = false; +}; + +static X86Dynarec instance; -void ngen_CC_Finish(shil_opcode* op) -{ - compiler->ngen_CC_Finish(*op); -} #endif diff --git a/core/rec-x86/rec_x86.h b/core/rec-x86/rec_x86.h index a688b131d..cfd41096b 100644 --- a/core/rec-x86/rec_x86.h +++ b/core/rec-x86/rec_x86.h @@ -31,8 +31,8 @@ class X86Compiler : public BaseXbyakRec public: using BaseCompiler = BaseXbyakRec; - X86Compiler() : BaseCompiler(), regalloc(this) { } - X86Compiler(u8 *code_ptr) : BaseCompiler(code_ptr), regalloc(this) { } + X86Compiler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer) : BaseCompiler(sh4ctx, codeBuffer), regalloc(this) { } + X86Compiler(Sh4Context& sh4ctx, Sh4CodeBuffer& codeBuffer, u8 *code_ptr) : BaseCompiler(sh4ctx, codeBuffer, code_ptr), regalloc(this) { } void compile(RuntimeBlockInfo* block, bool force_checks, bool optimise); @@ -50,22 +50,22 @@ class X86Compiler : public BaseXbyakRec void regPreload(u32 reg, Xbyak::Operand::Code nreg) { DEBUG_LOG(DYNAREC, "RegPreload reg %d -> %s", reg, Xbyak::Reg32(nreg).toString()); - mov(Xbyak::Reg32(nreg), dword[GetRegPtr(reg)]); + mov(Xbyak::Reg32(nreg), dword[GetRegPtr(sh4ctx, reg)]); } void regWriteback(u32 reg, Xbyak::Operand::Code nreg) { DEBUG_LOG(DYNAREC, "RegWriteback reg %d <- %s", reg, Xbyak::Reg32(nreg).toString()); - mov(dword[GetRegPtr(reg)], Xbyak::Reg32(nreg)); + mov(dword[GetRegPtr(sh4ctx, reg)], Xbyak::Reg32(nreg)); } void regPreload_FPU(u32 reg, s8 nreg) { DEBUG_LOG(DYNAREC, "RegPreload_FPU reg %d -> xmm%d", reg, nreg); - movss(Xbyak::Xmm(nreg), dword[GetRegPtr(reg)]); + movss(Xbyak::Xmm(nreg), dword[GetRegPtr(sh4ctx, reg)]); } void regWriteback_FPU(u32 reg, s8 nreg) { DEBUG_LOG(DYNAREC, "RegWriteback_FPU reg %d <- xmm%d", reg, nreg); - movss(dword[GetRegPtr(reg)], Xbyak::Xmm(nreg)); + movss(dword[GetRegPtr(sh4ctx, reg)], Xbyak::Xmm(nreg)); } void genMainloop(); diff --git a/core/rec-x86/x86_ops.cpp b/core/rec-x86/x86_ops.cpp index 7653f85be..e539389fd 100644 --- a/core/rec-x86/x86_ops.cpp +++ b/core/rec-x86/x86_ops.cpp @@ -27,7 +27,7 @@ #include "hw/sh4/sh4_core.h" #include "hw/sh4/sh4_interrupts.h" #include "hw/mem/addrspace.h" -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" extern UnwindInfo unwinder; @@ -139,12 +139,12 @@ void X86Compiler::genMemHandlers() and_(ecx, 0x3F); if (size == MemSize::S32) - mov(dword[(size_t)p_sh4rcb->sq_buffer + ecx], edx); + mov(dword[(size_t)sh4ctx.sq_buffer + ecx], edx); else if (size >= MemSize::F32) { - movss(dword[(size_t)p_sh4rcb->sq_buffer + ecx], xmm0); + movss(dword[(size_t)sh4ctx.sq_buffer + ecx], xmm0); if (size == MemSize::F64) - movss(dword[((size_t)p_sh4rcb->sq_buffer + 4) + ecx], xmm1); + movss(dword[((size_t)sh4ctx.sq_buffer + 4) + ecx], xmm1); } ret(); L(no_sqw); @@ -283,7 +283,7 @@ void X86Compiler::genMmuLookup(RuntimeBlockInfo* block, const shil_opcode& op, u } [[noreturn]] -static void DYNACALL handle_sh4_exception(SH4ThrownException& ex, u32 pc) +static void DYNACALL handle_sh4_exception(Sh4Context *ctx, SH4ThrownException& ex, u32 pc) { if (pc & 1) { @@ -292,27 +292,27 @@ static void DYNACALL handle_sh4_exception(SH4ThrownException& ex, u32 pc) pc--; } Do_Exception(pc, ex.expEvn); - p_sh4rcb->cntx.cycle_counter += 4; // probably more is needed + ctx->cycle_counter += 4; // probably more is needed X86Compiler::handleException(); // not reached std::abort(); } -static void DYNACALL interpreter_fallback(u16 op, OpCallFP *oph, u32 pc) +static void DYNACALL interpreter_fallback(Sh4Context *ctx, u16 op, OpCallFP *oph, u32 pc) { try { - oph(op); + oph(ctx, op); } catch (SH4ThrownException& ex) { - handle_sh4_exception(ex, pc); + handle_sh4_exception(ctx, ex, pc); } } -static void DYNACALL do_sqw_mmu_no_ex(u32 addr, u32 pc) +static void DYNACALL do_sqw_mmu_no_ex(u32 addr, Sh4Context *ctx, u32 pc) { try { - do_sqw_mmu(addr); + ctx->doSqWrite(addr, ctx); } catch (SH4ThrownException& ex) { - handle_sh4_exception(ex, pc); + handle_sh4_exception(ctx, ex, pc); } } @@ -323,12 +323,13 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& case shop_ifb: if (mmu_enabled()) { - mov(edx, reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler + push(reinterpret_cast(*OpDesc[op.rs3._imm]->oph)); // op handler push(block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc } if (op.rs1.is_imm() && op.rs1.imm_value()) - mov(dword[&next_pc], op.rs2.imm_value()); - mov(ecx, op.rs3.imm_value()); + mov(dword[&sh4ctx.pc], op.rs2.imm_value()); + mov(ecx, (uintptr_t)&sh4ctx); + mov(edx, op.rs3.imm_value()); if (!mmu_enabled()) genCall(OpDesc[op.rs3.imm_value()]->oph); else @@ -345,8 +346,8 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& movss(regalloc.MapXRegister(op.rd, 1), regalloc.MapXRegister(op.rs1, 1)); #else verify(!regalloc.IsAllocAny(op.rd)); - movq(xmm0, qword[op.rs1.reg_ptr()]); - movq(qword[op.rd.reg_ptr()], xmm0); + movq(xmm0, qword[op.rs1.reg_ptr(sh4ctx)]); + movq(qword[op.rd.reg_ptr(sh4ctx)], xmm0); #endif break; @@ -362,7 +363,7 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& else if (regalloc.IsAllocg(op.rs3)) add(ecx, regalloc.MapRegister(op.rs3)); else - add(ecx, dword[op.rs3.reg_ptr()]); + add(ecx, dword[op.rs3.reg_ptr(sh4ctx)]); } int memOpSize; @@ -409,8 +410,8 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& else { verify(!regalloc.IsAllocAny(op.rd)); - movss(dword[op.rd.reg_ptr()], xmm0); - movss(dword[op.rd.reg_ptr() + 1], xmm1); + movss(dword[op.rd.reg_ptr(sh4ctx)], xmm0); + movss(dword[op.rd.reg_ptr(sh4ctx) + 1], xmm1); } } } @@ -427,7 +428,7 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& else if (regalloc.IsAllocg(op.rs3)) add(ecx, regalloc.MapRegister(op.rs3)); else - add(ecx, dword[op.rs3.reg_ptr()]); + add(ecx, dword[op.rs3.reg_ptr(sh4ctx)]); } int memOpSize; @@ -463,8 +464,8 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& } else { - movd(xmm0, dword[op.rs2.reg_ptr()]); - movd(xmm1, dword[op.rs2.reg_ptr() + 1]); + movd(xmm0, dword[op.rs2.reg_ptr(sh4ctx)]); + movd(xmm1, dword[op.rs2.reg_ptr(sh4ctx) + 1]); } } const u8 *start = getCurr(); @@ -486,7 +487,8 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& genCallCdecl(UpdateSR); break; case shop_sync_fpscr: - genCallCdecl(UpdateFPSCR); + mov(ecx, (uintptr_t)&sh4ctx); + genCall(Sh4Context::UpdateFPSCR); break; case shop_pref: @@ -509,7 +511,7 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& } else { - mov(eax, dword[op.rs1.reg_ptr()]); + mov(eax, dword[op.rs1.reg_ptr(sh4ctx)]); rn = eax; } mov(ecx, rn); @@ -519,16 +521,16 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& mov(ecx, rn); } + mov(edx, (uintptr_t)&sh4ctx); if (mmu_enabled()) { - mov(edx, block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc + push(block->vaddr + op.guest_offs - (op.delay_slot ? 1 : 0)); // pc genCall(do_sqw_mmu_no_ex); } else { - mov(edx, (size_t)sh4rcb.sq_buffer); freezeXMM(); - call(dword[&do_sqw_nommu]); + call(dword[&sh4ctx.doSqWrite]); thawXMM(); } L(no_sqw); @@ -547,8 +549,8 @@ void X86Compiler::genOpcode(RuntimeBlockInfo* block, bool optimise, shil_opcode& break; case shop_frswap: - mov(eax, (uintptr_t)op.rs1.reg_ptr()); - mov(ecx, (uintptr_t)op.rd.reg_ptr()); + mov(eax, (uintptr_t)op.rs1.reg_ptr(sh4ctx)); + mov(ecx, (uintptr_t)op.rd.reg_ptr(sh4ctx)); for (int i = 0; i < 4; i++) { movaps(xmm0, xword[eax + (i * 16)]); diff --git a/core/reios/descrambl.cpp b/core/reios/descrambl.cpp index 32b0562ff..9b54c3bba 100644 --- a/core/reios/descrambl.cpp +++ b/core/reios/descrambl.cpp @@ -11,7 +11,7 @@ #include #include -#define MAXCHUNK (2048*1024) +#define MAXCHUNK 2_MB static u32 seed; diff --git a/core/reios/gdrom_hle.cpp b/core/reios/gdrom_hle.cpp index 04d77d453..17e2f5fc5 100644 --- a/core/reios/gdrom_hle.cpp +++ b/core/reios/gdrom_hle.cpp @@ -9,7 +9,6 @@ #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_sched.h" #include "hw/sh4/sh4_core.h" -#undef r #include "gdrom_hle.h" #include "hw/gdrom/gdromv3.h" @@ -23,8 +22,126 @@ #define SWAP32(a) ((((a) & 0xff) << 24) | (((a) & 0xff00) << 8) | (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff)) #define debugf(...) DEBUG_LOG(REIOS, __VA_ARGS__) +static void readSectors(u32 addr, u32 sector, u32 count, bool virtualAddr); -gdrom_hle_state_t gd_hle_state; +struct gdrom_hle_state_t +{ + gdrom_hle_state_t() : params{}, result{} {} + + u32 last_request_id = 0xFFFFFFFF; + u32 next_request_id = 2; + gd_return_value status = GDC_OK; + gd_command command = GDCC_NONE; + u32 params[4]; + u32 result[4]; + u32 cur_sector = 0; + u32 multi_read_sector = 0; + u32 multi_read_offset = 0; + u32 multi_read_count = 0; + u32 multi_read_total = 0; + u32 multi_callback = 0; + u32 multi_callback_arg = 0; + bool dma_trans_ended = false; + u64 xfer_end_time = 0; + + void Serialize(Serializer& ser) + { + ser << last_request_id; + ser << next_request_id; + ser << status; + ser << command; + ser << params; + ser << result; + ser << cur_sector; + ser << multi_read_sector; + ser << multi_read_offset; + ser << multi_read_count; + ser << multi_read_total; + ser << multi_callback; + ser << multi_callback_arg; + ser << dma_trans_ended; + ser << xfer_end_time; + + } + void Deserialize(Deserializer& deser) + { + deser >> last_request_id; + deser >> next_request_id; + deser >> status; + deser >> command; + deser >> params; + deser >> result; + deser >> cur_sector; + deser >> multi_read_sector; + deser >> multi_read_offset; + deser >> multi_read_count; + deser >> multi_read_total; + deser >> multi_callback; + deser >> multi_callback_arg; + deser >> dma_trans_ended; + deser >> xfer_end_time; + } +}; +static gdrom_hle_state_t gd_hle_state; + +static int schedId = -1; + +static int getGdromTicks() +{ + u32 len = gd_hle_state.multi_read_count * 2048; + if (len > 10240) + return 1000000; // Large transfers: GD-ROM transfer rate 1.8 MB/s + else + return len * 2; // Small transfers: Max G1 bus rate: 50 MHz x 16 bits +} + +static int schedCallback(int tag, int cycles, int jitter, void *arg) +{ + const u32 sect = std::min(gd_hle_state.multi_read_count, 5u); + readSectors(gd_hle_state.multi_read_offset, gd_hle_state.multi_read_sector, sect, false); + gd_hle_state.multi_read_count -= sect; + gd_hle_state.multi_read_sector += sect; + gd_hle_state.cur_sector = gd_hle_state.multi_read_sector; + gd_hle_state.multi_read_offset += sect * 2048; + + if (gd_hle_state.multi_read_count == 0) + { + gd_hle_state.result[3] = GDC_WAIT_INTERNAL; + SecNumber.Status = GD_STANDBY; + gd_hle_state.status = GDC_COMPLETE; + } + gd_hle_state.result[2] = (gd_hle_state.multi_read_total - gd_hle_state.multi_read_count) * 2048; + + return getGdromTicks(); +} + +void reios_init() { + if (schedId == -1) + schedId = sh4_sched_register(0, schedCallback); +} + +void reios_serialize(Serializer& ser) { + gd_hle_state.Serialize(ser); + sh4_sched_serialize(ser, schedId); +} + +void reios_deserialize(Deserializer& deser) +{ + gd_hle_state.Deserialize(deser); + if (deser.version() >= Deserializer::V54) + sh4_sched_deserialize(deser, schedId); +} + +void gdrom_hle_reset() { + gd_hle_state = {}; +} + +void reios_term() +{ + if (schedId != -1) + sh4_sched_unregister(schedId); + schedId = -1; +} static void GDROM_HLE_ReadSES() { @@ -65,19 +182,10 @@ static void GDROM_HLE_ReadTOC() WriteMem32(dest, toc[i]); } -template -static void read_sectors_to(u32 addr, u32 sector, u32 count) +static void readSectors(u32 addr, u32 sector, u32 count, bool virtualAddr) { gd_hle_state.cur_sector = sector + count - 1; - if (virtual_addr) - gd_hle_state.xfer_end_time = 0; - else if (count > 5 && !config::FastGDRomLoad) - // Large Transfers: GD-ROM rate (approx. 1.8 MB/s) - gd_hle_state.xfer_end_time = sh4_sched_now64() + (u64)count * 2048 * 1000000L / 10240; - else - // Small transfers: Max G1 bus rate: 50 MHz x 16 bits - gd_hle_state.xfer_end_time = sh4_sched_now64() + 5 * 2048 * 2; - if (!virtual_addr || !mmu_enabled()) + if (!virtualAddr || !mmu_enabled()) { u8 * pDst = GetMemPtr(addr, 0); @@ -95,7 +203,7 @@ static void read_sectors_to(u32 addr, u32 sector, u32 count) for (std::size_t i = 0; i < std::size(temp); i++) { - if (virtual_addr) + if (virtualAddr) WriteMem32(addr, temp[i]); else WriteMem32_nommu(addr, temp[i]); @@ -107,6 +215,12 @@ static void read_sectors_to(u32 addr, u32 sector, u32 count) } } +static void read_pio_sectors(u32 addr, u32 sector, u32 count) +{ + gd_hle_state.xfer_end_time = 0; + readSectors(addr, sector, count, true); +} + static void GDROM_HLE_ReadDMA() { u32 fad = gd_hle_state.params[0] & 0xffffff; @@ -116,7 +230,13 @@ static void GDROM_HLE_ReadDMA() debugf("GDROM: DMA READ Sector=%d, Num=%d, Buffer=%08x, zero=%x", fad, nsect, buffer, gd_hle_state.params[3]); - read_sectors_to(buffer, fad, nsect); + gd_hle_state.cur_sector = fad; + gd_hle_state.multi_read_sector = fad; + gd_hle_state.multi_read_offset = buffer; + gd_hle_state.multi_read_count = nsect; + gd_hle_state.multi_read_total = nsect; + sh4_sched_request(schedId, getGdromTicks()); + gd_hle_state.result[2] = 0; gd_hle_state.result[3] = 0; } @@ -130,41 +250,41 @@ static void GDROM_HLE_ReadPIO() debugf("GDROM: PIO READ Sector=%d, Num=%d, Buffer=%08x, SeekAhead=%x", fad, nsect, buffer, gd_hle_state.params[3]); - read_sectors_to(buffer, fad, nsect); + read_pio_sectors(buffer, fad, nsect); gd_hle_state.result[2] = nsect * 2048; gd_hle_state.result[3] = 0; } -static void GDCC_HLE_GETSCD() { +static void GDCC_HLE_GETSCD() +{ u32 format = gd_hle_state.params[0]; u32 size = gd_hle_state.params[1]; u32 dest = gd_hle_state.params[2]; // params[3] 0 DEBUG_LOG(REIOS, "GDROM: GETSCD format %x size %x dest %08x", format, size, dest); - - if (libGDR_GetDiscType() == Open || libGDR_GetDiscType() == NoDisk) - { - gd_hle_state.status = GDC_ERR; - gd_hle_state.result[0] = 6; // GDC_ERR_UNITATTENTION - gd_hle_state.result[1] = 0; - gd_hle_state.result[2] = 0; - gd_hle_state.result[3] = 0; - return; - } if (sns_asc != 0) { // Helps D2 detect the disk change gd_hle_state.status = GDC_ERR; gd_hle_state.result[0] = sns_key; - gd_hle_state.result[1] = sns_asc; - gd_hle_state.result[2] = 0x18; // ? - gd_hle_state.result[3] = sns_ascq; // ? + gd_hle_state.result[1] = sns_asc | (sns_ascq << 8); + gd_hle_state.result[2] = 0x18; // ? + gd_hle_state.result[3] = 0; sns_key = 0; sns_asc = 0; sns_ascq = 0; return; } + if (SecNumber.Status != GD_BUSY && (libGDR_GetDiscType() == Open || libGDR_GetDiscType() == NoDisk)) + { + gd_hle_state.status = GDC_ERR; + gd_hle_state.result[0] = 2; + gd_hle_state.result[1] = 0x3a; // Media operation command was received but no media is inserted. + gd_hle_state.result[2] = 0; + gd_hle_state.result[3] = 0; + return; + } if (cdda.status == cdda_t::Playing) gd_hle_state.cur_sector = cdda.CurrAddr.FAD; u8 scd[100]; @@ -293,19 +413,9 @@ static void GD_HLE_Command(gd_command cc) case GDCC_DMAREAD: cdda.status = cdda_t::NoInfo; - if (gd_hle_state.xfer_end_time == 0) + if (gd_hle_state.multi_read_count == 0) GDROM_HLE_ReadDMA(); - if (gd_hle_state.xfer_end_time > 0) - { - if (gd_hle_state.xfer_end_time > sh4_sched_now64()) - return; - gd_hle_state.xfer_end_time = 0; - } - gd_hle_state.result[2] = gd_hle_state.params[1] * 2048; - gd_hle_state.result[3] = 0; - SecNumber.Status = GD_PAUSE; - break; - + return; case GDCC_PLAY2: { @@ -688,25 +798,34 @@ void gdrom_hle_op() // // Returns: 0 OK, -1 ERR, 1 BUSY, 2 COMPLETE, 3 CONTINUE gd_drv_stat status; - u32 discType = libGDR_GetDiscType(); - switch (discType) + u32 discType; + if (SecNumber.Status == GD_BUSY) { - case Open: - status = GD_STAT_OPEN; - discType = 0; - break; - case NoDisk: - status = GD_STAT_NODISC; + status = GD_STAT_BUSY; discType = 0; - break; - default: - if (gd_hle_state.status == GDC_CONTINUE || SecNumber.Status == GD_PLAY) - status = GD_STAT_PLAY; - else - status = GD_STAT_PAUSE; - if (memcmp(ip_meta.disk_type, "GD-ROM", sizeof(ip_meta.disk_type)) == 0) - discType = GdRom; - break; + } + else + { + discType = libGDR_GetDiscType(); + switch (discType) + { + case Open: + status = GD_STAT_OPEN; + discType = 0; + break; + case NoDisk: + status = GD_STAT_NODISC; + discType = 0; + break; + default: + if (gd_hle_state.status == GDC_CONTINUE || SecNumber.Status == GD_PLAY) + status = GD_STAT_PLAY; + else + status = GD_STAT_PAUSE; + if (memcmp(ip_meta.disk_type, "GD-ROM", sizeof(ip_meta.disk_type)) == 0) + discType = GdRom; + break; + } } WriteMem32(r[4], (u32)status); WriteMem32(r[4] + 4, discType); diff --git a/core/reios/gdrom_hle.h b/core/reios/gdrom_hle.h index 2f5d98785..acc9e22ca 100644 --- a/core/reios/gdrom_hle.h +++ b/core/reios/gdrom_hle.h @@ -1,5 +1,6 @@ #pragma once #include "serialize.h" +#include "cfg/option.h" #define SYSCALL_GDROM 0x00 @@ -69,9 +70,8 @@ enum misc_command { MISC_SETVECTOR }; -void gdrom_hle_init(); -void gdrom_hle_term(); void gdrom_hle_op(); +void gdrom_hle_reset(); typedef enum : int32_t { GDC_ERR = -1, @@ -84,66 +84,6 @@ typedef enum : int32_t { GDC_RET2 } gd_return_value; -struct gdrom_hle_state_t -{ - gdrom_hle_state_t() : params{}, result{} {} - - u32 last_request_id = 0xFFFFFFFF; - u32 next_request_id = 2; - gd_return_value status = GDC_OK; - gd_command command = GDCC_NONE; - u32 params[4]; - u32 result[4]; - u32 cur_sector = 0; - u32 multi_read_sector = 0; - u32 multi_read_offset = 0; - u32 multi_read_count = 0; - u32 multi_read_total = 0; - u32 multi_callback = 0; - u32 multi_callback_arg = 0; - bool dma_trans_ended = false; - u64 xfer_end_time = 0; - - void Serialize(Serializer& ser) - { - ser << last_request_id; - ser << next_request_id; - ser << status; - ser << command; - ser << params; - ser << result; - ser << cur_sector; - ser << multi_read_sector; - ser << multi_read_offset; - ser << multi_read_count; - ser << multi_read_total; - ser << multi_callback; - ser << multi_callback_arg; - ser << dma_trans_ended; - ser << xfer_end_time; - - } - void Deserialize(Deserializer& deser) - { - deser >> last_request_id; - deser >> next_request_id; - deser >> status; - deser >> command; - deser >> params; - deser >> result; - deser >> cur_sector; - deser >> multi_read_sector; - deser >> multi_read_offset; - deser >> multi_read_count; - deser >> multi_read_total; - deser >> multi_callback; - deser >> multi_callback_arg; - deser >> dma_trans_ended; - deser >> xfer_end_time; - } -}; -extern gdrom_hle_state_t gd_hle_state; - // status for GDROM_GET_DRV_STAT enum gd_drv_stat { GD_STAT_BUSY, diff --git a/core/reios/reios.cpp b/core/reios/reios.cpp index 65748ebaa..49f501f4c 100644 --- a/core/reios/reios.cpp +++ b/core/reios/reios.cpp @@ -15,8 +15,7 @@ #include "gdrom_hle.h" #include "descrambl.h" -#include "hw/sh4/sh4_core.h" -#undef r +#include "hw/sh4/sh4_if.h" #include "hw/sh4/sh4_mem.h" #include "hw/holly/sb.h" #include "hw/naomi/naomi_cart.h" @@ -26,12 +25,11 @@ #include "imgread/common.h" #include "imgread/isofs.h" #include "hw/sh4/sh4_mmr.h" -#include +#include "oslib/resources.h" +#include "oslib/oslib.h" #include -CMRC_DECLARE(flycast); - #define debugf(...) DEBUG_LOG(REIOS, __VA_ARGS__) #define dc_bios_syscall_system 0x8C0000B0 @@ -136,7 +134,7 @@ ip_meta_t ip_meta; void reios_disk_id() { - if (libGDR_GetDiscType() == Open || libGDR_GetDiscType() == NoDisk) + if (!gdr::isLoaded()) { memset(&ip_meta, 0, sizeof(ip_meta)); return; @@ -354,14 +352,31 @@ static void reios_sys_misc() break; case 1: // Exit to BIOS menu - WARN_LOG(REIOS, "SYS_MISC 1"); - throw FlycastException("Reboot to BIOS"); + { + WARN_LOG(REIOS, "SYS_MISC 1"); + if (gdr::isLoaded()) { + // just restart the game + p_sh4rcb->cntx.pc = 0xa0000000; + os_notify("Reboot to BIOS", 5000); + } + else { + throw FlycastException("Reboot to BIOS"); + } + } break; case 2: // check disk - p_sh4rcb->cntx.r[0] = 0; - // Reload part of IP.BIN bootstrap - libGDR_ReadSector(GetMemPtr(0x8c008100, 0), base_fad, 7, 2048); + { + u32 diskType = libGDR_GetDiscType(); + if (diskType == NoDisk || diskType == Open) { + p_sh4rcb->cntx.r[0] = -1; + } + else { + p_sh4rcb->cntx.r[0] = 0; + // Reload part of IP.BIN bootstrap + libGDR_ReadSector(GetMemPtr(0x8c008100, 0), base_fad, 7, 2048); + } + } break; case 3: // Exit to CD menu @@ -469,25 +484,26 @@ static void reios_setup_state(u32 boot_addr) */ //Setup registers to imitate a normal boot - p_sh4rcb->cntx.r[15] = 0x8d000000; - - gbr = 0x8c000000; - ssr = 0x40000001; - spc = 0x8c000776; - sgr = 0x8d000000; - dbr = 0x8c000010; - vbr = 0x8c000000; - pr = 0xac00043c; - fpul = 0x00000000; - next_pc = boot_addr; - - sr.status = 0x400000f0; - sr.T = 1; - - old_sr.status = 0x400000f0; - - fpscr.full = 0x00040001; - old_fpscr.full = 0x00040001; + Sh4Context& ctx = p_sh4rcb->cntx; + ctx.r[15] = 0x8d000000; + + ctx.gbr = 0x8c000000; + ctx.ssr = 0x40000001; + ctx.spc = 0x8c000776; + ctx.sgr = 0x8d000000; + ctx.dbr = 0x8c000010; + ctx.vbr = 0x8c000000; + ctx.pr = 0xac00043c; + ctx.fpul = 0x00000000; + ctx.pc = boot_addr; + + ctx.sr.status = 0x400000f0; + ctx.sr.T = 1; + + ctx.old_sr.status = 0x400000f0; + + ctx.fpscr.full = 0x00040001; + ctx.old_fpscr.full = 0x00040001; } static void reios_setup_naomi(u32 boot_addr) { @@ -495,7 +511,7 @@ static void reios_setup_naomi(u32 boot_addr) { SR 0x60000000 0x00000001 FPSRC 0x00040001 - - xffr 0x13e1fe40 float [32] + - xf,fr 0x13e1fe40 float [32] [0x0] 1.00000000 float [0x1] 0.000000000 float [0x2] 0.000000000 float @@ -575,40 +591,41 @@ static void reios_setup_naomi(u32 boot_addr) { */ //Setup registers to imitate a normal boot - p_sh4rcb->cntx.r[0] = 0x0c021000; - p_sh4rcb->cntx.r[1] = 0x0c01f820; - p_sh4rcb->cntx.r[2] = 0xa0710004; - p_sh4rcb->cntx.r[3] = 0x0c01f130; - p_sh4rcb->cntx.r[4] = 0x5bfccd08; - p_sh4rcb->cntx.r[5] = 0xa05f7000; - p_sh4rcb->cntx.r[6] = 0xa05f7008; - p_sh4rcb->cntx.r[7] = 0x00000007; - p_sh4rcb->cntx.r[8] = 0x00000000; - p_sh4rcb->cntx.r[9] = 0x00002000; - p_sh4rcb->cntx.r[10] = 0xffffffff; - p_sh4rcb->cntx.r[11] = 0x0c0e0000; - p_sh4rcb->cntx.r[12] = 0x00000000; - p_sh4rcb->cntx.r[13] = 0x00000000; - p_sh4rcb->cntx.r[14] = 0x00000000; - p_sh4rcb->cntx.r[15] = 0x0cc00000; - - gbr = 0x0c2abcc0; - ssr = 0x60000000; - spc = 0x0c041738; - sgr = 0x0cbfffb0; - dbr = 0x00000fff; - vbr = 0x0c000000; - pr = 0xac0195ee; - fpul = 0x000001e0; - next_pc = boot_addr; - - sr.status = 0x60000000; - sr.T = 1; - - old_sr.status = 0x60000000; - - fpscr.full = 0x00040001; - old_fpscr.full = 0x00040001; + Sh4Context& ctx = p_sh4rcb->cntx; + ctx.r[0] = 0x0c021000; + ctx.r[1] = 0x0c01f820; + ctx.r[2] = 0xa0710004; + ctx.r[3] = 0x0c01f130; + ctx.r[4] = 0x5bfccd08; + ctx.r[5] = 0xa05f7000; + ctx.r[6] = 0xa05f7008; + ctx.r[7] = 0x00000007; + ctx.r[8] = 0x00000000; + ctx.r[9] = 0x00002000; + ctx.r[10] = 0xffffffff; + ctx.r[11] = 0x0c0e0000; + ctx.r[12] = 0x00000000; + ctx.r[13] = 0x00000000; + ctx.r[14] = 0x00000000; + ctx.r[15] = 0x0cc00000; + + ctx.gbr = 0x0c2abcc0; + ctx.ssr = 0x60000000; + ctx.spc = 0x0c041738; + ctx.sgr = 0x0cbfffb0; + ctx.dbr = 0x00000fff; + ctx.vbr = 0x0c000000; + ctx.pr = 0xac0195ee; + ctx.fpul = 0x000001e0; + ctx.pc = boot_addr; + + ctx.sr.status = 0x60000000; + ctx.sr.T = 1; + + ctx.old_sr.status = 0x60000000; + + ctx.fpscr.full = 0x00040001; + ctx.old_fpscr.full = 0x00040001; } static void reios_boot() @@ -620,7 +637,7 @@ static void reios_boot() //find boot file //boot it - memset(GetMemPtr(0x8C000000, 0), 0xFF, 64 * 1024); + memset(GetMemPtr(0x8C000000, 0), 0xFF, 64_KB); setup_syscall(0x8C001000, dc_bios_syscall_system); setup_syscall(0x8C001002, dc_bios_syscall_font); @@ -674,19 +691,26 @@ static void reios_boot() } } -static std::map hooks; +#define SYSCALL_ADDR(addr) (((addr) & 0x1FFFFFFF) | 0x80000000) -#define SYSCALL_ADDR_MAP(addr) (((addr) & 0x1FFFFFFF) | 0x80000000) +static const std::map hooks = { + { SYSCALL_ADDR(0xA0000000), reios_boot }, -static void register_hook(u32 pc, hook_fp* fn) { - hooks[SYSCALL_ADDR_MAP(pc)] = fn; -} + { SYSCALL_ADDR(0x8C001000), reios_sys_system }, + { SYSCALL_ADDR(0x8C001002), reios_sys_font }, + { SYSCALL_ADDR(0x8C001004), reios_sys_flashrom }, + { SYSCALL_ADDR(0x8C001006), gdrom_hle_op }, + { SYSCALL_ADDR(0x8C001008), reios_sys_misc }, + + { SYSCALL_ADDR(dc_bios_entrypoint_gd2), gdrom_hle_op }, +}; -void DYNACALL reios_trap(u32 op) { +void DYNACALL reios_trap(Sh4Context *ctx, u32 op) +{ verify(op == REIOS_OPCODE); - u32 pc = next_pc - 2; + u32 pc = ctx->pc - 2; - u32 mapd = SYSCALL_ADDR_MAP(pc); + u32 mapd = SYSCALL_ADDR(pc); //debugf("dispatch %08X -> %08X", pc, mapd); @@ -699,29 +723,11 @@ void DYNACALL reios_trap(u32 op) { it->second(); // Return from syscall, except if pc was modified - if (pc == next_pc - 2) - next_pc = pr; + if (pc == ctx->pc - 2) + ctx->pc = ctx->pr; } -bool reios_init() -{ - INFO_LOG(REIOS, "reios: Init"); - - register_hook(0xA0000000, reios_boot); - - register_hook(0x8C001000, reios_sys_system); - register_hook(0x8C001002, reios_sys_font); - register_hook(0x8C001004, reios_sys_flashrom); - register_hook(0x8C001006, gdrom_hle_op); - register_hook(0x8C001008, reios_sys_misc); - - register_hook(dc_bios_entrypoint_gd2, gdrom_hle_op); - - return true; -} - -void reios_set_flash(MemChip* flash) -{ +void reios_set_flash(MemChip* flash) { flashrom = flash; } @@ -747,17 +753,9 @@ void reios_reset(u8* rom) // 7078 24 × 24 pixels (72 bytes) characters // 129 32 × 32 pixels (128 bytes) characters memset(pFont, 0, 536496); - try { - cmrc::embedded_filesystem fs = cmrc::flycast::get_filesystem(); - cmrc::file fontFile = fs.open("fonts/biosfont.bin"); - memcpy(pFont, fontFile.begin(), fontFile.end() - fontFile.begin()); - } catch (const std::system_error& e) { - ERROR_LOG(REIOS, "Failed to load the bios font: %s", e.what()); - throw; - } - - gd_hle_state = {}; -} + size_t size; + std::unique_ptr fontData = resource::load("fonts/biosfont.bin", size); + memcpy(pFont, fontData.get(), size); -void reios_term() { + gdrom_hle_reset(); } diff --git a/core/reios/reios.h b/core/reios/reios.h index af1b616f5..c9bb54d18 100644 --- a/core/reios/reios.h +++ b/core/reios/reios.h @@ -3,13 +3,15 @@ #include "types.h" #include "hw/flashrom/flashrom.h" -bool reios_init(); +void reios_init(); void reios_set_flash(MemChip* flash); void reios_reset(u8* rom); - +void reios_serialize(Serializer& ser); +void reios_deserialize(Deserializer& deser); void reios_term(); -void DYNACALL reios_trap(u32 op); +struct Sh4Context; +void DYNACALL reios_trap(Sh4Context *ctx, u32 op); void reios_disk_id(); diff --git a/core/reios/reios_elf.cpp b/core/reios/reios_elf.cpp index 6ffa02b13..2f397a50d 100644 --- a/core/reios/reios_elf.cpp +++ b/core/reios/reios_elf.cpp @@ -15,29 +15,32 @@ bool reios_loadElf(const std::string& elf) { std::fseek(f, 0, SEEK_END); size_t size = std::ftell(f); - if (size > 16 * 1024 * 1024) { + if (size == 0 || size > 16_MB) { std::fclose(f); return false; } void* elfF = malloc(size); - memset(elfF, 0, size); std::fseek(f, 0, SEEK_SET); size_t nread = std::fread(elfF, 1, size, f); std::fclose(f); elf_t elfFile; - - if (nread != size || elf_newFile(elfF, nread, &elfFile) != 0 || elf_checkFile(&elfFile) != 0) + if (nread != size || elf_newFile(elfF, nread, &elfFile) != 0) { - free((void*)elfFile.elfFile); + free(elfF); return false; } bool phys = false; - for (int i = 0; i < elf_getNumProgramHeaders(&elfFile); i++) + for (size_t i = 0; i < elf_getNumProgramHeaders(&elfFile); i++) { + uint32_t type = elf_getProgramHeaderType(&elfFile, i); + if (type != PT_LOAD) { + DEBUG_LOG(REIOS, "Ignoring section %d type %d", (int)i, type); + continue; + } // Load that section uint64_t dest; if (phys) @@ -49,15 +52,15 @@ bool reios_loadElf(const std::string& elf) { u8* ptr = GetMemPtr(dest, len); if (ptr == NULL) { - WARN_LOG(REIOS, "Invalid load address for section %d: %08lx", i, (long)dest); + WARN_LOG(REIOS, "Invalid load address for section %d: %08lx", (int)i, (long)dest); continue; } - DEBUG_LOG(REIOS, "Loading section %d to %08lx - %08lx", i, (long)dest, (long)(dest + len - 1)); + DEBUG_LOG(REIOS, "Loading section %d to %08lx - %08lx", (int)i, (long)dest, (long)(dest + len - 1)); memcpy(ptr, src, len); ptr += len; memset(ptr, 0, elf_getProgramHeaderMemorySize(&elfFile, i) - len); } - free((void*)elfFile.elfFile); + free(elfF); return true; } diff --git a/core/rend/CustomTexture.cpp b/core/rend/CustomTexture.cpp index 263a38a82..1ff8444b2 100644 --- a/core/rend/CustomTexture.cpp +++ b/core/rend/CustomTexture.cpp @@ -16,8 +16,8 @@ You should have received a copy of the GNU General Public License along with reicast. If not, see . */ -#include "TexCache.h" #include "CustomTexture.h" +#include "TexCache.h" #include "oslib/directory.h" #include "oslib/storage.h" #include "cfg/option.h" @@ -63,10 +63,10 @@ void CustomTexture::LoaderThread() { int width, height; u8 *image_data = LoadCustomTexture(texture->texture_hash, width, height); + if (image_data == nullptr && texture->old_vqtexture_hash != 0) + image_data = LoadCustomTexture(texture->old_vqtexture_hash, width, height); if (image_data == nullptr) - { image_data = LoadCustomTexture(texture->old_texture_hash, width, height); - } if (image_data != nullptr) { texture->custom_width = width; @@ -107,13 +107,15 @@ bool CustomTexture::Init() if (!textures_path.empty()) { - DIR *dir = flycast::opendir(textures_path.c_str()); - if (dir != nullptr) - { - NOTICE_LOG(RENDERER, "Found custom textures directory: %s", textures_path.c_str()); - custom_textures_available = true; - flycast::closedir(dir); - loader_thread.Start(); + try { + hostfs::FileInfo fileInfo = hostfs::storage().getFileInfo(textures_path); + if (fileInfo.isDirectory) + { + NOTICE_LOG(RENDERER, "Found custom textures directory: %s", textures_path.c_str()); + custom_textures_available = true; + loader_thread.Start(); + } + } catch (const FlycastException& e) { } } } @@ -142,7 +144,7 @@ u8* CustomTexture::LoadCustomTexture(u32 hash, int& width, int& height) if (it == texture_map.end()) return nullptr; - FILE *file = nowide::fopen(it->second.c_str(), "rb"); + FILE *file = hostfs::storage().openFile(it->second, "rb"); if (file == nullptr) return nullptr; int n; @@ -280,7 +282,19 @@ void CustomTexture::DumpTexture(u32 hash, int w, int h, TextureType textype, voi } stbi_flip_vertically_on_write(1); - stbi_write_png(path.str().c_str(), w, h, STBI_rgb_alpha, dst_buffer, 0); + const auto& savefunc = [](void *context, void *data, int size) { + FILE *f = nowide::fopen((const char *)context, "wb"); + if (f == nullptr) + { + WARN_LOG(RENDERER, "Dump texture: can't save to file %s: error %d", (const char *)context, errno); + } + else + { + fwrite(data, 1, size, f); + fclose(f); + } + }; + stbi_write_png_to_func(savefunc, (void *)path.str().c_str(), w, h, STBI_rgb_alpha, dst_buffer, 0); free(dst_buffer); } diff --git a/core/rend/CustomTexture.h b/core/rend/CustomTexture.h index 9eb60e1c6..3994b9925 100644 --- a/core/rend/CustomTexture.h +++ b/core/rend/CustomTexture.h @@ -18,7 +18,7 @@ */ #pragma once -#include "TexCache.h" +#include "texconv.h" #include "stdclass.h" #include @@ -26,9 +26,11 @@ #include #include +class BaseTextureCacheData; + class CustomTexture { public: - CustomTexture() : loader_thread(loader_thread_func, this) {} + CustomTexture() : loader_thread(loader_thread_func, this, "CustomTexLoader") {} ~CustomTexture() { Terminate(); } u8* LoadCustomTexture(u32 hash, int& width, int& height); void LoadCustomTextureAsync(BaseTextureCacheData *texture_data); diff --git a/core/rend/TexCache.cpp b/core/rend/TexCache.cpp index 70fb6f160..fe73022ed 100644 --- a/core/rend/TexCache.cpp +++ b/core/rend/TexCache.cpp @@ -1,10 +1,24 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ #include "TexCache.h" -#include "CustomTexture.h" #include "deps/xbrz/xbrz.h" #include "hw/pvr/pvr_mem.h" #include "hw/mem/addrspace.h" -#include #include #include @@ -12,14 +26,6 @@ #include #endif -const u8 *vq_codebook; -u32 palette_index; -bool KillTex=false; -u32 palette16_ram[1024]; -u32 palette32_ram[1024]; -u32 pal_hash_256[4]; -u32 pal_hash_16[64]; -bool palette_updated; extern bool pal_needs_update; // Rough approximation of LoD bias from D adjust param, only used to increase LoD @@ -27,149 +33,6 @@ const std::array D_Adjust_LoD_Bias = { 0.f, -4.f, -2.f, -1.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }; -u32 detwiddle[2][11][1024]; -//input : address in the yyyyyxxxxx format -//output : address in the xyxyxyxy format -//U : x resolution , V : y resolution -//twiddle works on 64b words - - -static u32 twiddle_slow(u32 x,u32 y,u32 x_sz,u32 y_sz) -{ - u32 rv=0;//low 2 bits are directly passed -> needs some misc stuff to work.However - //Pvr internally maps the 64b banks "as if" they were twiddled :p - - u32 sh=0; - x_sz>>=1; - y_sz>>=1; - while(x_sz!=0 || y_sz!=0) - { - if (y_sz) - { - u32 temp=y&1; - rv|=temp<>=1; - y>>=1; - sh++; - } - if (x_sz) - { - u32 temp=x&1; - rv|=temp<>=1; - x>>=1; - sh++; - } - } - return rv; -} - -static void BuildTwiddleTables() -{ - for (u32 s = 0; s < 11; s++) - { - u32 x_sz = 1024; - u32 y_sz = 1 << s; - for (u32 i = 0; i < x_sz; i++) - { - detwiddle[0][s][i] = twiddle_slow(i, 0, x_sz, y_sz); - detwiddle[1][s][i] = twiddle_slow(0, i, y_sz, x_sz); - } - } -} - -static OnLoad btt(&BuildTwiddleTables); - -void palette_update() -{ - if (!pal_needs_update) - return; - pal_needs_update = false; - palette_updated = true; - - if (!isDirectX(config::RendererType)) - { - switch(PAL_RAM_CTRL&3) - { - case 0: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = Unpacker1555::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker1555_32::unpack(PALETTE_RAM[i]); - } - break; - - case 1: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker565_32::unpack(PALETTE_RAM[i]); - } - break; - - case 2: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = Unpacker4444::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker4444_32::unpack(PALETTE_RAM[i]); - } - break; - - case 3: - for (int i=0;i<1024;i++) - palette32_ram[i] = Unpacker8888::unpack(PALETTE_RAM[i]); - break; - } - } - else - { - switch(PAL_RAM_CTRL&3) - { - - case 0: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker1555_32::unpack(PALETTE_RAM[i]); - } - break; - - case 1: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker565_32::unpack(PALETTE_RAM[i]); - } - break; - - case 2: - for (int i=0;i<1024;i++) - { - palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); - palette32_ram[i] = Unpacker4444_32::unpack(PALETTE_RAM[i]); - } - break; - - case 3: - for (int i=0;i<1024;i++) - palette32_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); - break; - } - } - for (std::size_t i = 0; i < std::size(pal_hash_16); i++) - pal_hash_16[i] = XXH32(&PALETTE_RAM[i << 4], 16 * 4, 7); - for (std::size_t i = 0; i < std::size(pal_hash_256); i++) - pal_hash_256[i] = XXH32(&PALETTE_RAM[i << 8], 256 * 4, 7); -} - -void forcePaletteUpdate() -{ - pal_needs_update = true; -} - - static std::vector VramLocks[VRAM_SIZE_MAX / PAGE_SIZE]; //List functions @@ -298,58 +161,19 @@ void UpscalexBRZ(int factor, u32* source, u32* dest, int width, int height, bool #endif } -struct PvrTexInfo -{ - const char* name; - int bpp; //4/8 for pal. 16 for yuv, rgb, argb - TextureType type; - // Conversion to 16 bpp - TexConvFP PL; - TexConvFP TW; - TexConvFP VQ; - // Conversion to 32 bpp - TexConvFP32 PL32; - TexConvFP32 TW32; - TexConvFP32 VQ32; - // Conversion to 8 bpp (palette) - TexConvFP8 TW8; -}; - -#define TEX_CONV_TABLE \ -const PvrTexInfo pvrTexInfo[8] = \ -{ /* name bpp Final format Planar Twiddled VQ Planar(32b) Twiddled(32b) VQ (32b) Palette (8b) */ \ - {"1555", 16, TextureType::_5551, tex1555_PL, tex1555_TW, tex1555_VQ, tex1555_PL32, tex1555_TW32, tex1555_VQ32, nullptr }, \ - {"565", 16, TextureType::_565, tex565_PL, tex565_TW, tex565_VQ, tex565_PL32, tex565_TW32, tex565_VQ32, nullptr }, \ - {"4444", 16, TextureType::_4444, tex4444_PL, tex4444_TW, tex4444_VQ, tex4444_PL32, tex4444_TW32, tex4444_VQ32, nullptr }, \ - {"yuv", 16, TextureType::_8888, nullptr, nullptr, nullptr, texYUV422_PL, texYUV422_TW, texYUV422_VQ, nullptr }, \ - {"bumpmap", 16, TextureType::_4444, texBMP_PL, texBMP_TW, texBMP_VQ, tex4444_PL32, tex4444_TW32, tex4444_VQ32, nullptr }, \ - {"pal4", 4, TextureType::_5551, nullptr, texPAL4_TW, texPAL4_VQ, nullptr, texPAL4_TW32, texPAL4_VQ32, texPAL4PT_TW }, \ - {"pal8", 8, TextureType::_5551, nullptr, texPAL8_TW, texPAL8_VQ, nullptr, texPAL8_TW32, texPAL8_VQ32, texPAL8PT_TW }, \ - {"ns/1555", 0}, \ -} - -namespace opengl { - TEX_CONV_TABLE; -} -namespace directx { - TEX_CONV_TABLE; -} -#undef TEX_CONV_TABLE -static const PvrTexInfo *pvrTexInfo = opengl::pvrTexInfo; - extern const u32 VQMipPoint[11] = { - 0x00000,//1 - 0x00001,//2 - 0x00002,//4 - 0x00006,//8 - 0x00016,//16 - 0x00056,//32 - 0x00156,//64 - 0x00556,//128 - 0x01556,//256 - 0x05556,//512 - 0x15556//1024 + VQ_CODEBOOK_SIZE + 0x00000, // 1 + VQ_CODEBOOK_SIZE + 0x00001, // 2 + VQ_CODEBOOK_SIZE + 0x00002, // 4 + VQ_CODEBOOK_SIZE + 0x00006, // 8 + VQ_CODEBOOK_SIZE + 0x00016, // 16 + VQ_CODEBOOK_SIZE + 0x00056, // 32 + VQ_CODEBOOK_SIZE + 0x00156, // 64 + VQ_CODEBOOK_SIZE + 0x00556, // 128 + VQ_CODEBOOK_SIZE + 0x01556, // 256 + VQ_CODEBOOK_SIZE + 0x05556, // 512 + VQ_CODEBOOK_SIZE + 0x15556 // 1024 }; extern const u32 OtherMipPoint[11] = { @@ -411,22 +235,22 @@ bool BaseTextureCacheData::NeedsUpdate() { void BaseTextureCacheData::protectVRam() { - u32 end = sa + size - 1; + u32 end = mmStartAddress + size - 1; if (end >= VRAM_SIZE) { WARN_LOG(PVR, "protectVRam: end >= VRAM_SIZE. Tried to lock area out of vram"); end = VRAM_SIZE - 1; } - if (sa_tex > end) + if (startAddress > end) { - WARN_LOG(PVR, "vramlock_Lock: sa_tex > end. Tried to lock negative block"); + WARN_LOG(PVR, "vramlock_Lock: startAddress > end. Tried to lock negative block"); return; } vram_block *block = new vram_block(); block->end = end; - block->start = sa_tex; + block->start = startAddress; block->texture = this; { @@ -483,21 +307,16 @@ BaseTextureCacheData::BaseTextureCacheData(TSP tsp, TCW tcw) //decode info from tsp/tcw into the texture struct tex = &pvrTexInfo[tcw.PixelFmt == PixelReserved ? Pixel1555 : tcw.PixelFmt]; //texture format table entry - sa_tex = (tcw.TexAddr << 3) & VRAM_MASK; //texture start address - sa = sa_tex; //data texture start address (modified for MIPs, as needed) + startAddress = (tcw.TexAddr << 3) & VRAM_MASK; // texture start address + mmStartAddress = startAddress; // data texture start address (modified for MIPs, as needed) width = 8 << tsp.TexU; //tex width height = 8 << tsp.TexV; //tex height texconv8 = nullptr; - if (tcw.ScanOrder && (tex->PL || tex->PL32)) + if (tcw.ScanOrder && tex->PL32 != nullptr) { //Texture is stored 'planar' in memory, no deswizzle is needed - if (tcw.VQ_Comp != 0) - { - WARN_LOG(RENDERER, "Warning: planar texture with VQ set (invalid)"); - this->tcw.VQ_Comp = 0; - } if (tcw.MipMapped != 0) { WARN_LOG(RENDERER, "Warning: planar texture with mipmaps (invalid)"); @@ -514,10 +333,21 @@ BaseTextureCacheData::BaseTextureCacheData(TSP tsp, TCW tcw) } //Call the format specific conversion code - texconv = tex->PL; - texconv32 = tex->PL32; - //calculate the size, in bytes, for the locking - size = stride * height * tex->bpp / 8; + texconv = nullptr; + if (tcw.VQ_Comp != 0) + { + // VQ + texconv32 = tex->PLVQ32; + mmStartAddress += VQ_CODEBOOK_SIZE; + size = stride * height / 4; + } + else + { + // Normal + texconv32 = tex->PL32; + //calculate the size, in bytes, for the locking + size = stride * height * tex->bpp / 8; + } } else { @@ -535,16 +365,18 @@ BaseTextureCacheData::BaseTextureCacheData(TSP tsp, TCW tcw) { verify(tex->VQ != NULL || tex->VQ32 != NULL); if (tcw.MipMapped) - sa += VQMipPoint[tsp.TexU + 3]; + mmStartAddress += VQMipPoint[tsp.TexU + 3]; + else + mmStartAddress += VQ_CODEBOOK_SIZE; texconv = tex->VQ; texconv32 = tex->VQ32; - size = width * height / 8 + 256 * 8; + size = width * height / 4; } else { verify(tex->TW != NULL || tex->TW32 != NULL); if (tcw.MipMapped) - sa += OtherMipPoint[tsp.TexU + 3] * tex->bpp / 8; + mmStartAddress += OtherMipPoint[tsp.TexU + 3] * tex->bpp / 8; texconv = tex->TW; texconv32 = tex->TW32; size = width * height * tex->bpp / 8; @@ -555,21 +387,41 @@ BaseTextureCacheData::BaseTextureCacheData(TSP tsp, TCW tcw) void BaseTextureCacheData::ComputeHash() { - u32 hashSize = size; + // Include everything but texaddr, reserved and stride. Palette textures don't have ScanOrder + const u32 tcwMask = IsPaletted() ? 0xF8000000 : 0xFC000000; if (tcw.VQ_Comp) { // The size for VQ textures wasn't correctly calculated. // We use the old size to compute the hash for backward-compatibility // with existing custom texture packs. - hashSize = size - 256 * 8; + int oldSize = width * height / 8; + old_vqtexture_hash = XXH32(&vram[mmStartAddress - VQ_CODEBOOK_SIZE], oldSize, 7); + if (IsPaletted()) + old_vqtexture_hash ^= palette_hash; + old_texture_hash = old_vqtexture_hash; + old_vqtexture_hash ^= tcw.full & tcwMask; + // New hash + XXH32_state_t *state = XXH32_createState(); + XXH32_reset(state, 7); + // hash vq codebook + XXH32_update(state, &vram[startAddress], VQ_CODEBOOK_SIZE); + // hash texture + XXH32_update(state, &vram[mmStartAddress], size); + texture_hash = XXH32_digest(state); + XXH32_freeState(state); + if (IsPaletted()) + texture_hash ^= palette_hash; + texture_hash ^= tcw.full & tcwMask; + } + else + { + old_vqtexture_hash = 0; + texture_hash = XXH32(&vram[mmStartAddress], size, 7); + if (IsPaletted()) + texture_hash ^= palette_hash; + old_texture_hash = texture_hash; + texture_hash ^= tcw.full & tcwMask; } - texture_hash = XXH32(&vram[sa], hashSize, 7); - if (IsPaletted()) - texture_hash ^= palette_hash; - old_texture_hash = texture_hash; - // Include everything but texaddr, reserved and stride. Palette textures don't have ScanOrder - const u32 tcwMask = IsPaletted() ? 0xF8000000 : 0xFC000000; - texture_hash ^= tcw.full & tcwMask; } bool BaseTextureCacheData::Update() @@ -610,34 +462,35 @@ bool BaseTextureCacheData::Update() } if (tcw.VQ_Comp) - ::vq_codebook = &vram[sa_tex]; // might be used if VQ tex + ::vq_codebook = &vram[startAddress]; //texture conversion work u32 stride = width; - if (tcw.StrideSel && tcw.ScanOrder && (tex->PL || tex->PL32)) + if (tcw.StrideSel && tcw.ScanOrder && tex->PL32 != nullptr) { stride = (TEXT_CONTROL & 31) * 32; if (stride == 0) stride = width; } - const u32 original_h = height; - if (sa_tex > VRAM_SIZE || sa + size > VRAM_SIZE) + u32 heightLimit = height; + const u32 originalSize = size; + if (startAddress > VRAM_SIZE || mmStartAddress + size > VRAM_SIZE) { - height = 0; - if (sa < VRAM_SIZE && sa + size > VRAM_SIZE && tcw.ScanOrder) + heightLimit = 0; + if (mmStartAddress < VRAM_SIZE && mmStartAddress + size > VRAM_SIZE && tcw.ScanOrder) { // Shenmue Space Harrier mini-arcade loads a texture that goes beyond the end of VRAM // but only uses the top portion of it - height = (VRAM_SIZE - sa) * 8 / stride / tex->bpp; - size = stride * height * tex->bpp/8; + heightLimit = (VRAM_SIZE - mmStartAddress) * 8 / stride / tex->bpp; + size = stride * heightLimit * tex->bpp/8; } - if (height == 0) + if (heightLimit == 0) { - WARN_LOG(RENDERER, "Warning: invalid texture. Address %08X %08X size %d", sa_tex, sa, size); + size = originalSize; + WARN_LOG(RENDERER, "Warning: invalid texture. Address %08X %08X size %d", startAddress, mmStartAddress, size); dirty = 1; - height = original_h; unprotectVRam(); return false; } @@ -686,7 +539,7 @@ bool BaseTextureCacheData::Update() u32 vram_addr; if (tcw.VQ_Comp) { - vram_addr = sa_tex + VQMipPoint[i]; + vram_addr = startAddress + VQMipPoint[i]; if (i == 0) { PixelBuffer pb0; @@ -697,7 +550,7 @@ bool BaseTextureCacheData::Update() } } else - vram_addr = sa_tex + OtherMipPoint[i] * tex->bpp / 8; + vram_addr = startAddress + OtherMipPoint[i] * tex->bpp / 8; if (tcw.PixelFmt == PixelYUV && i == 0) // Special case for YUV at 1x1 LoD pvrTexInfo[Pixel565].TW32(&pb32, &vram[vram_addr], 1, 1); @@ -709,7 +562,7 @@ bool BaseTextureCacheData::Update() else { pb32.init(width, height); - texconv32(&pb32, (u8*)&vram[sa], stride, height); + texconv32(&pb32, (u8*)&vram[mmStartAddress], stride, heightLimit); // xBRZ scaling if (textureUpscaling) @@ -737,7 +590,7 @@ bool BaseTextureCacheData::Update() for (u32 i = 0; i <= tsp.TexU + 3u; i++) { pb8.set_mipmap(i); - u32 vram_addr = sa_tex + OtherMipPoint[i] * tex->bpp / 8; + u32 vram_addr = startAddress + OtherMipPoint[i] * tex->bpp / 8; texconv8(&pb8, &vram[vram_addr], 1 << i, 1 << i); } pb8.set_mipmap(0); @@ -745,7 +598,7 @@ bool BaseTextureCacheData::Update() else { pb8.init(width, height); - texconv8(&pb8, &vram[sa], stride, height); + texconv8(&pb8, &vram[mmStartAddress], stride, height); } temp_tex_buffer = pb8.data(); } @@ -760,7 +613,7 @@ bool BaseTextureCacheData::Update() u32 vram_addr; if (tcw.VQ_Comp) { - vram_addr = sa_tex + VQMipPoint[i]; + vram_addr = startAddress + VQMipPoint[i]; if (i == 0) { PixelBuffer pb0; @@ -771,7 +624,7 @@ bool BaseTextureCacheData::Update() } } else - vram_addr = sa_tex + OtherMipPoint[i] * tex->bpp / 8; + vram_addr = startAddress + OtherMipPoint[i] * tex->bpp / 8; texconv(&pb16, (u8*)&vram[vram_addr], 1 << i, 1 << i); } pb16.set_mipmap(0); @@ -779,7 +632,7 @@ bool BaseTextureCacheData::Update() else { pb16.init(width, height); - texconv(&pb16,(u8*)&vram[sa],stride,height); + texconv(&pb16, (u8*)&vram[mmStartAddress], stride, heightLimit); } temp_tex_buffer = pb16.data(); } @@ -792,9 +645,6 @@ bool BaseTextureCacheData::Update() temp_tex_buffer = pb16.data(); mipmapped = false; } - // Restore the original texture height if it was constrained to VRAM limits above - height = original_h; - //lock the texture to detect changes in it protectVRam(); @@ -806,6 +656,8 @@ bool BaseTextureCacheData::Update() NOTICE_LOG(RENDERER, "Dumped texture %x.png. Old hash %x", texture_hash, old_texture_hash); } PrintTextureName(); + // Restore the original texture size if it was constrained to VRAM limits above + size = originalSize; return true; } @@ -824,6 +676,7 @@ void BaseTextureCacheData::CheckCustomTexture() void BaseTextureCacheData::SetDirectXColorOrder(bool enabled) { pvrTexInfo = enabled ? directx::pvrTexInfo : opengl::pvrTexInfo; + pal_needs_update = true; } template @@ -952,87 +805,330 @@ void ReadFramebuffer(const FramebufferInfo& info, PixelBuffer& pb, int& wid template void ReadFramebuffer(const FramebufferInfo& info, PixelBuffer& pb, int& width, int& height); template void ReadFramebuffer(const FramebufferInfo& info, PixelBuffer& pb, int& width, int& height); -template -void WriteTextureToVRam(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride) +template +static inline u8 roundColor(u8 in) { - u32 padding = linestride; - if (padding / 2 > width) - padding = padding / 2 - width; - else - padding = 0; + u8 out = in >> (8 - bits); + if (out != 0xffu >> (8 - bits)) + out += (in >> (8 - bits - 1)) & 1; + return out; +} - const u16 kval_bit = (fb_w_ctrl.fb_kval & 0x80) << 8; - const u8 fb_alpha_threshold = fb_w_ctrl.fb_alpha_threshold; +// write to 32-bit vram area (framebuffer) +class FBPixelWriter +{ +public: + FBPixelWriter(u32 dstAddr) : dstAddr(dstAddr) {} - const u8 *p = data; + template + void write(T pixel) { + pvr_write32p(dstAddr, pixel); + dstAddr += sizeof(T); + } - for (u32 l = 0; l < height; l++) { - switch(fb_w_ctrl.fb_packmode) + void advance(int bytes) { + dstAddr += bytes; + } + +private: + u32 dstAddr; +}; + +// write to 64-bit vram area (render to texture) +class TexPixelWriter +{ +public: + TexPixelWriter(u16 *dest) : dest(dest) {} + + void write(u16 pixel) { + *dest++ = pixel; + } + + void advance(int bytes) { + (u8 *&)dest += bytes; + } + +private: + u16 *dest; +}; + +// 0555 KRGB 16 bit (default) Bit 15 is the value of fb_kval[7]. +template +class FBLineWriter0555 +{ +public: + FBLineWriter0555(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) { + kval_bit = (fb_w_ctrl.fb_kval & 0x80) << 8; + } + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) { - case 0: //0x0 0555 KRGB 16 bit (default) Bit 15 is the value of fb_kval[7]. - for (u32 c = 0; c < width; c++) { - *dst++ = (((p[Red] >> 3) & 0x1F) << 10) | (((p[Green] >> 3) & 0x1F) << 5) | ((p[Blue] >> 3) & 0x1F) | kval_bit; - p += 4; + u8 red, green, blue; + if constexpr (Round) + { + red = roundColor<5>(pixel[Red]); + green = roundColor<5>(pixel[Green]); + blue = roundColor<5>(pixel[Blue]); } - break; - case 1: //0x1 565 RGB 16 bit - for (u32 c = 0; c < width; c++) { - *dst++ = (((p[Red] >> 3) & 0x1F) << 11) | (((p[Green] >> 2) & 0x3F) << 5) | ((p[Blue] >> 3) & 0x1F); - p += 4; + else + { + red = pixel[Red] >> 3; + green = pixel[Green] >> 3; + blue = pixel[Blue] >> 3; } - break; - case 2: //0x2 4444 ARGB 16 bit - for (u32 c = 0; c < width; c++) { - *dst++ = (((p[Red] >> 4) & 0xF) << 8) | (((p[Green] >> 4) & 0xF) << 4) | ((p[Blue] >> 4) & 0xF) | (((p[Alpha] >> 4) & 0xF) << 12); - p += 4; + pixWriter.write((u16)((red << 10) | (green << 5) | blue | kval_bit)); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 2; + +private: + u16 kval_bit; + PixelWriter& pixWriter; +}; + +// 565 RGB 16 bit +template +class FBLineWriter565 +{ +public: + FBLineWriter565(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) {} + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + u8 red, green, blue; + if constexpr (Round) + { + red = roundColor<5>(pixel[Red]); + green = roundColor<6>(pixel[Green]); + blue = roundColor<5>(pixel[Blue]); } - break; - case 3://0x3 1555 ARGB 16 bit The alpha value is determined by comparison with the value of fb_alpha_threshold. - for (u32 c = 0; c < width; c++) { - *dst++ = (((p[Red] >> 3) & 0x1F) << 10) | (((p[Green] >> 3) & 0x1F) << 5) | ((p[Blue] >> 3) & 0x1F) | (p[Alpha] >= fb_alpha_threshold ? 0x8000 : 0); - p += 4; + else + { + red = pixel[Red] >> 3; + green = pixel[Green] >> 2; + blue = pixel[Blue] >> 3; } - break; + pixWriter.write((u16)((red << 11) | (green << 5) | blue)); + pixel += 4; } - dst += padding; } -} -template void WriteTextureToVRam<0, 1, 2, 3>(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride); -template void WriteTextureToVRam<2, 1, 0, 3>(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride); -template -static inline u8 roundColor(u8 in) + static constexpr int BytesPerPixel = 2; + +private: + PixelWriter& pixWriter; +}; + +// 4444 ARGB 16 bit +template +class FBLineWriter4444 { - u8 out = in >> (8 - bits); - if (out != 0xffu >> (8 - bits)) - out += (in >> (8 - bits - 1)) & 1; - return out; +public: + FBLineWriter4444(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) {} + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + u8 red, green, blue, alpha; + if constexpr (Round) + { + red = roundColor<4>(pixel[Red]); + green = roundColor<4>(pixel[Green]); + blue = roundColor<4>(pixel[Blue]); + alpha = roundColor<4>(pixel[Alpha]); + } + else + { + red = pixel[Red] >> 4; + green = pixel[Green] >> 4; + blue = pixel[Blue] >> 4; + alpha = pixel[Alpha] >> 4; + } + pixWriter.write((u16)((red << 8) | (green << 4) | blue | (alpha << 12))); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 2; + +private: + PixelWriter& pixWriter; +}; + +// 1555 ARGB 16 bit The alpha value is determined by comparison with the value of fb_alpha_threshold. +template +class FBLineWriter1555 +{ +public: + FBLineWriter1555(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) { + fb_alpha_threshold = fb_w_ctrl.fb_alpha_threshold; + } + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + u8 red, green, blue; + if constexpr (Round) + { + red = roundColor<5>(pixel[Red]); + green = roundColor<5>(pixel[Green]); + blue = roundColor<5>(pixel[Blue]); + } + else + { + red = pixel[Red] >> 3; + green = pixel[Green] >> 3; + blue = pixel[Blue] >> 3; + } + pixWriter.write((u16)((red << 10) | (green << 5) | blue + | (pixel[Alpha] >= fb_alpha_threshold ? 0x8000 : 0))); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 2; + +private: + PixelWriter& pixWriter; + u8 fb_alpha_threshold; +}; + +// 888 RGB 24 bit packed +template +class FBLineWriter888 +{ +public: + FBLineWriter888(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) {} + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + pixWriter.write(pixel[Blue]); + pixWriter.write(pixel[Green]); + pixWriter.write(pixel[Red]); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 3; + +private: + PixelWriter& pixWriter; +}; + +// 0888 KRGB 32 bit (K is the value of fb_kval.) +template +class FBLineWriter0888 +{ +public: + FBLineWriter0888(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) { + fb_kval = fb_w_ctrl.fb_kval << 24; + } + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + pixWriter.write((u32)((pixel[Red] << 16) | (pixel[Green] << 8) | pixel[Blue] | fb_kval)); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 4; + +private: + u32 fb_kval; + PixelWriter& pixWriter; +}; + +// 8888 ARGB 32 bit +template +class FBLineWriter8888 +{ +public: + FBLineWriter8888(FB_W_CTRL_type fb_w_ctrl, PixelWriter& pixWriter) : pixWriter(pixWriter) {} + + void write(int xmin, int xmax, const u8 *& pixel, int y) + { + for (int c = xmin; c < xmax; c++) + { + pixWriter.write((u32)((pixel[Red] << 16) | (pixel[Green] << 8) | pixel[Blue] | (pixel[Alpha] << 24))); + pixel += 4; + } + } + + static constexpr int BytesPerPixel = 4; + +private: + PixelWriter& pixWriter; +}; + +template +static void writeTexture(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride) +{ + u32 padding = linestride; + if (padding > width * 2) + padding = padding - width * 2; + else + padding = 0; + + TexPixelWriter pixWriter(dst); + FBLineWriter lineWriter(fb_w_ctrl, pixWriter); + + for (u32 l = 0; l < height; l++) { + lineWriter.write(0, width, data, l); + pixWriter.advance(padding); + } } template -void WriteFramebuffer(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_CTRL_type fb_w_ctrl, u32 linestride, FB_X_CLIP_type xclip, FB_Y_CLIP_type yclip) +void WriteTextureToVRam(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride) { - int bpp; + bool dither = fb_w_ctrl.fb_dither && config::EmulateFramebuffer; switch (fb_w_ctrl.fb_packmode) { - case 0: - case 1: - case 2: - case 3: - bpp = 2; - break; - case 4: - bpp = 3; - break; - case 5: - case 6: - bpp = 4; - break; - default: - die("Invalid framebuffer format"); - bpp = 4; - break; + case 0: // 0555 KRGB 16 bit (default) + if (dither) + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + else + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + break; + case 1: // 565 RGB 16 bit + if (dither) + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + else + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + break; + case 2: // 4444 ARGB 16 bit + if (dither) + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + else + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + break; + case 3: // 1555 ARGB 16 bit + if (dither) + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + else + writeTexture>(width, height, data, dst, fb_w_ctrl, linestride); + break; } +} +template void WriteTextureToVRam<0, 1, 2, 3>(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride); +template void WriteTextureToVRam<2, 1, 0, 3>(u32 width, u32 height, const u8 *data, u16 *dst, FB_W_CTRL_type fb_w_ctrl, u32 linestride); + +template +static void writeFramebufferLW(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_CTRL_type fb_w_ctrl, u32 linestride, FB_X_CLIP_type xclip, FB_Y_CLIP_type yclip) +{ + int bpp = FBLineWriter::BytesPerPixel; u32 padding = linestride; if (padding > width * bpp) @@ -1040,92 +1136,58 @@ void WriteFramebuffer(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_C else padding = 0; - const u16 kval_bit = (fb_w_ctrl.fb_kval & 0x80) << 8; - const u8 fb_alpha_threshold = fb_w_ctrl.fb_alpha_threshold; - const u8 *p = data + 4 * yclip.min * width; dstAddr += bpp * yclip.min * (width + padding / bpp); - for (u32 l = yclip.min; l < height && l <= yclip.max; l++) + const u32 clipWidth = std::min(width, xclip.max + 1u); + height = std::min(height, yclip.max + 1u); + + FBPixelWriter pixWriter(dstAddr); + FBLineWriter lineWriter(fb_w_ctrl, pixWriter); + + for (u32 l = yclip.min; l < height; l++) { p += 4 * xclip.min; - dstAddr += bpp * xclip.min; + pixWriter.advance(bpp * xclip.min); - switch(fb_w_ctrl.fb_packmode) - { - case 0: // 0555 KRGB 16 bit (default) Bit 15 is the value of fb_kval[7]. - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u16)((roundColor<5>(p[Red]) << 10) - | (roundColor<5>(p[Green]) << 5) - | roundColor<5>(p[Blue]) - | kval_bit)); - p += 4; - dstAddr += bpp; - } - break; - case 1: // 565 RGB 16 bit - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u16)((roundColor<5>(p[Red]) << 11) - | (roundColor<6>(p[Green]) << 5) - | roundColor<5>(p[Blue]))); - p += 4; - dstAddr += bpp; - } - break; - case 2: // 4444 ARGB 16 bit - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u16)((roundColor<4>(p[Red]) << 8) - | (roundColor<4>(p[Green]) << 4) - | roundColor<4>(p[Blue]) - | (roundColor<4>(p[Alpha]) << 12))); - p += 4; - dstAddr += bpp; - } - break; - case 3: // 1555 ARGB 16 bit The alpha value is determined by comparison with the value of fb_alpha_threshold. - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u16)((roundColor<5>(p[Red]) << 10) - | (roundColor<5>(p[Green]) << 5) - | roundColor<5>(p[Blue]) - | (p[Alpha] >= fb_alpha_threshold ? 0x8000 : 0))); - p += 4; - dstAddr += bpp; - } - break; - case 4: // 888 RGB 24 bit packed - for (u32 c = xclip.min; c < width - 3u && c <= xclip.max - 3u; c += 4) { - pvr_write32p(dstAddr, (u32)((p[Blue + 4] << 24) | (p[Red] << 16) | (p[Green] << 8) | p[Blue])); - p += 4; - dstAddr += 4; - pvr_write32p(dstAddr, (u32)((p[Green + 4] << 24) | (p[Blue + 4] << 16) | (p[Red] << 8) | p[Green])); - p += 4; - dstAddr += 4; - pvr_write32p(dstAddr, (u32)((p[Red + 4] << 24) | (p[Green + 4] << 16) | (p[Blue + 4] << 8) | p[Red])); - p += 8; - dstAddr += 4; - } - break; - case 5: // 0888 KRGB 32 bit (K is the value of fk_kval.) - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u32)((p[Red] << 16) | (p[Green] << 8) | p[Blue] | (fb_w_ctrl.fb_kval << 24))); - p += 4; - dstAddr += bpp; - } - break; - case 6: // 8888 ARGB 32 bit - for (u32 c = xclip.min; c < width && c <= xclip.max; c++) { - pvr_write32p(dstAddr, (u32)((p[Red] << 16) | (p[Green] << 8) | p[Blue] | (p[Alpha] << 24))); - p += 4; - dstAddr += bpp; - } - break; - default: - break; - } - dstAddr += padding + (width - xclip.max - 1) * bpp; + lineWriter.write(xclip.min, clipWidth, p, l); + + pixWriter.advance(padding + (width - xclip.max - 1) * bpp); p += (width - xclip.max - 1) * 4; } } + +template +void WriteFramebuffer(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_CTRL_type fb_w_ctrl, u32 linestride, FB_X_CLIP_type xclip, FB_Y_CLIP_type yclip) +{ + switch (fb_w_ctrl.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 1: // 565 RGB 16 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 2: // 4444 ARGB 16 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 3: // 1555 ARGB 16 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 4: // 888 RGB 24 bit packed + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 5: // 0888 KRGB 32 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + case 6: // 8888 ARGB 32 bit + writeFramebufferLW>(width, height, data, dstAddr, fb_w_ctrl, linestride, xclip, yclip); + break; + default: + die("Invalid framebuffer format"); + break; + } +} template void WriteFramebuffer<0, 1, 2, 3>(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_CTRL_type fb_w_ctrl, u32 linestride, FB_X_CLIP_type xclip, FB_Y_CLIP_type yclip); template void WriteFramebuffer<2, 1, 0, 3>(u32 width, u32 height, const u8 *data, u32 dstAddr, FB_W_CTRL_type fb_w_ctrl, diff --git a/core/rend/TexCache.h b/core/rend/TexCache.h index e4dc58032..1ce4ba250 100644 --- a/core/rend/TexCache.h +++ b/core/rend/TexCache.h @@ -1,7 +1,25 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ #pragma once #include "oslib/oslib.h" #include "hw/pvr/Renderer_if.h" #include "cfg/option.h" +#include "texconv.h" +#include "CustomTexture.h" #include #include @@ -11,549 +29,6 @@ #include #include -extern const u8 *vq_codebook; -extern u32 palette_index; -extern u32 palette16_ram[1024]; -extern u32 palette32_ram[1024]; -extern bool fog_needs_update; -extern u32 pal_hash_256[4]; -extern u32 pal_hash_16[64]; -extern bool KillTex; -extern bool palette_updated; - -extern u32 detwiddle[2][11][1024]; - -void palette_update(); -void forcePaletteUpdate(); - -template -class PixelBuffer -{ - pixel_type* p_buffer_start = nullptr; - pixel_type* p_current_mipmap = nullptr; - pixel_type* p_current_line = nullptr; - pixel_type* p_current_pixel = nullptr; - - u32 pixels_per_line = 0; - -public: - ~PixelBuffer() - { - deinit(); - } - - void init(u32 width, u32 height, bool mipmapped) - { - deinit(); - size_t size = width * height * sizeof(pixel_type); - if (mipmapped) - { - do - { - width /= 2; - height /= 2; - size += width * height * sizeof(pixel_type); - } - while (width != 0 && height != 0); - } - p_buffer_start = p_current_line = p_current_pixel = p_current_mipmap = (pixel_type *)malloc(size); - this->pixels_per_line = 1; - } - - void init(u32 width, u32 height) - { - deinit(); - p_buffer_start = p_current_line = p_current_pixel = p_current_mipmap = (pixel_type *)malloc(width * height * sizeof(pixel_type)); - this->pixels_per_line = width; - } - - void deinit() - { - if (p_buffer_start != NULL) - { - free(p_buffer_start); - p_buffer_start = p_current_mipmap = p_current_line = p_current_pixel = NULL; - } - } - - void steal_data(PixelBuffer &buffer) - { - deinit(); - p_buffer_start = p_current_mipmap = p_current_line = p_current_pixel = buffer.p_buffer_start; - pixels_per_line = buffer.pixels_per_line; - buffer.p_buffer_start = buffer.p_current_mipmap = buffer.p_current_line = buffer.p_current_pixel = NULL; - } - - void set_mipmap(int level) - { - u32 offset = 0; - for (int i = 0; i < level; i++) - offset += (1 << (2 * i)); - p_current_mipmap = p_current_line = p_current_pixel = p_buffer_start + offset; - pixels_per_line = 1 << level; - } - - pixel_type *data(u32 x = 0, u32 y = 0) - { - return p_current_mipmap + pixels_per_line * y + x; - } - - void prel(u32 x, pixel_type value) - { - p_current_pixel[x] = value; - } - - void prel(u32 x, u32 y, pixel_type value) - { - p_current_pixel[y * pixels_per_line + x] = value; - } - - void rmovex(u32 value) - { - p_current_pixel += value; - } - - void rmovey(u32 value) - { - p_current_line += pixels_per_line * value; - p_current_pixel = p_current_line; - } - - void amove(u32 x_m, u32 y_m) - { - //p_current_pixel=p_buffer_start; - p_current_line = p_current_mipmap + pixels_per_line * y_m; - p_current_pixel = p_current_line + x_m; - } -}; - -// OpenGL -struct RGBAPacker { - static u32 pack(u8 r, u8 g, u8 b, u8 a) { - return r | (g << 8) | (b << 16) | (a << 24); - } -}; -// DirectX -struct BGRAPacker { - static u32 pack(u8 r, u8 g, u8 b, u8 a) { - return b | (g << 8) | (r << 16) | (a << 24); - } -}; - -template -inline static u32 YUV422(s32 Y, s32 Yu, s32 Yv) -{ - Yu -= 128; - Yv -= 128; - - s32 R = Y + Yv * 11 / 8; // Y + (Yv-128) * (11/8) ? - s32 G = Y - (Yu * 11 + Yv * 22) / 32; // Y - (Yu-128) * (11/8) * 0.25 - (Yv-128) * (11/8) * 0.5 ? - s32 B = Y + Yu * 110 / 64; // Y + (Yu-128) * (11/8) * 1.25 ? - - return Packer::pack(std::clamp(R, 0, 255), std::clamp(G, 0, 255), std::clamp(B, 0, 255), 0xFF); -} - -#define twop(x,y,bcx,bcy) (detwiddle[0][bcy][x]+detwiddle[1][bcx][y]) - -template -struct UnpackerNop { - using unpacked_type = Pixel; - static Pixel unpack(Pixel word) { - return word; - } -}; -// ARGB1555 to RGBA5551 -struct Unpacker1555 { - using unpacked_type = u16; - static u16 unpack(u16 word) { - return ((word >> 15) & 1) | (((word >> 10) & 0x1F) << 11) | (((word >> 5) & 0x1F) << 6) | (((word >> 0) & 0x1F) << 1); - } -}; -// ARGB4444 to RGBA4444 -struct Unpacker4444 { - using unpacked_type = u16; - static u16 unpack(u16 word) { - return (((word >> 0) & 0xF) << 4) | (((word >> 4) & 0xF) << 8) | (((word >> 8) & 0xF) << 12) | (((word >> 12) & 0xF) << 0); - } -}; - -template -struct Unpacker1555_32 { - using unpacked_type = u32; - static u32 unpack(u16 word) { - return Packer::pack( - (((word >> 10) & 0x1F) << 3) | ((word >> 12) & 7), - (((word >> 5) & 0x1F) << 3) | ((word >> 7) & 7), - (((word >> 0) & 0x1F) << 3) | ((word >> 2) & 7), - (word & 0x8000) ? 0xFF : 0); - } -}; -template -struct Unpacker565_32 { - using unpacked_type = u32; - static u32 unpack(u16 word) { - return Packer::pack( - (((word >> 11) & 0x1F) << 3) | ((word >> 13) & 7), - (((word >> 5) & 0x3F) << 2) | ((word >> 9) & 3), - (((word >> 0) & 0x1F) << 3) | ((word >> 2) & 7), - 0xFF); - } -}; -template -struct Unpacker4444_32 { - using unpacked_type = u32; - static u32 unpack(u16 word) { - return Packer::pack( - (((word >> 8) & 0xF) << 4) | ((word >> 8) & 0xF), - (((word >> 4) & 0xF) << 4) | ((word >> 4) & 0xF), - (((word >> 0) & 0xF) << 4) | ((word >> 0) & 0xF), - (((word >> 12) & 0xF) << 4) | ((word >> 12) & 0xF)); - } -}; -// ARGB8888 to whatever -template -struct Unpacker8888 { - using unpacked_type = u32; - static u32 unpack(u32 word) { - return Packer::pack( - (word >> 16) & 0xFF, - (word >> 8) & 0xFF, - (word >> 0) & 0xFF, - (word >> 24) & 0xFF); - } -}; - -template -struct ConvertPlanar -{ - using unpacked_type = typename Unpacker::unpacked_type; - static constexpr u32 xpp = 4; - static constexpr u32 ypp = 1; - static void Convert(PixelBuffer *pb, const u8 *data) - { - const u16 *p_in = (const u16 *)data; - pb->prel(0, Unpacker::unpack(p_in[0])); - pb->prel(1, Unpacker::unpack(p_in[1])); - pb->prel(2, Unpacker::unpack(p_in[2])); - pb->prel(3, Unpacker::unpack(p_in[3])); - } -}; - -template -struct ConvertPlanarYUV -{ - using unpacked_type = u32; - static constexpr u32 xpp = 4; - static constexpr u32 ypp = 1; - static void Convert(PixelBuffer *pb, const u8 *data) - { - //convert 4x1 4444 to 4x1 8888 - const u32 *p_in = (const u32 *)data; - - - s32 Y0 = (p_in[0] >> 8) & 255; // - s32 Yu = (p_in[0] >> 0) & 255; //p_in[0] - s32 Y1 = (p_in[0] >> 24) & 255; //p_in[3] - s32 Yv = (p_in[0] >> 16) & 255; //p_in[2] - - //0,0 - pb->prel(0, YUV422(Y0, Yu, Yv)); - //1,0 - pb->prel(1, YUV422(Y1, Yu, Yv)); - - //next 4 bytes - p_in += 1; - - Y0 = (p_in[0] >> 8) & 255; // - Yu = (p_in[0] >> 0) & 255; //p_in[0] - Y1 = (p_in[0] >> 24) & 255; //p_in[3] - Yv = (p_in[0] >> 16) & 255; //p_in[2] - - //0,0 - pb->prel(2, YUV422(Y0, Yu, Yv)); - //1,0 - pb->prel(3, YUV422(Y1, Yu, Yv)); - } -}; - -template -struct ConvertTwiddle -{ - using unpacked_type = typename Unpacker::unpacked_type; - static constexpr u32 xpp = 2; - static constexpr u32 ypp = 2; - static void Convert(PixelBuffer *pb, const u8 *data) - { - const u16 *p_in = (const u16 *)data; - pb->prel(0, 0, Unpacker::unpack(p_in[0])); - pb->prel(0, 1, Unpacker::unpack(p_in[1])); - pb->prel(1, 0, Unpacker::unpack(p_in[2])); - pb->prel(1, 1, Unpacker::unpack(p_in[3])); - } -}; - -template -struct ConvertTwiddleYUV -{ - using unpacked_type = u32; - static constexpr u32 xpp = 2; - static constexpr u32 ypp = 2; - static void Convert(PixelBuffer *pb, const u8 *data) - { - //convert 4x1 4444 to 4x1 8888 - const u16* p_in = (const u16 *)data; - - s32 Y0 = (p_in[0] >> 8) & 255; // - s32 Yu = (p_in[0] >> 0) & 255; //p_in[0] - s32 Y1 = (p_in[2] >> 8) & 255; //p_in[3] - s32 Yv = (p_in[2] >> 0) & 255; //p_in[2] - - //0,0 - pb->prel(0, 0, YUV422(Y0, Yu, Yv)); - //1,0 - pb->prel(1, 0, YUV422(Y1, Yu, Yv)); - - //next 4 bytes - //p_in+=2; - - Y0 = (p_in[1] >> 8) & 255; // - Yu = (p_in[1] >> 0) & 255; //p_in[0] - Y1 = (p_in[3] >> 8) & 255; //p_in[3] - Yv = (p_in[3] >> 0) & 255; //p_in[2] - - //0,1 - pb->prel(0, 1, YUV422(Y0, Yu, Yv)); - //1,1 - pb->prel(1, 1, YUV422(Y1, Yu, Yv)); - } -}; - -template -struct UnpackerPalToRgb { - using unpacked_type = Pixel; - static Pixel unpack(u8 col) - { - u32 *pal = sizeof(Pixel) == 2 ? &palette16_ram[palette_index] : &palette32_ram[palette_index]; - return pal[col]; - } -}; - -template -struct ConvertTwiddlePal4 -{ - using unpacked_type = typename Unpacker::unpacked_type; - static constexpr u32 xpp = 4; - static constexpr u32 ypp = 4; - static void Convert(PixelBuffer *pb, const u8 *data) - { - const u8 *p_in = data; - - pb->prel(0, 0, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(0, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - pb->prel(1, 0, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(1, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - - pb->prel(0, 2, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(0, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - pb->prel(1, 2, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(1, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - - pb->prel(2, 0, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(2, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - pb->prel(3, 0, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(3, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - - pb->prel(2, 2, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(2, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - pb->prel(3, 2, Unpacker::unpack(p_in[0] & 0xF)); - pb->prel(3, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; - } -}; - -template -struct ConvertTwiddlePal8 -{ - using unpacked_type = typename Unpacker::unpacked_type; - static constexpr u32 xpp = 2; - static constexpr u32 ypp = 4; - static void Convert(PixelBuffer *pb, const u8 *data) - { - const u8* p_in = (const u8 *)data; - - pb->prel(0, 0, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(0, 1, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(1, 0, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(1, 1, Unpacker::unpack(p_in[0])); p_in++; - - pb->prel(0, 2, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(0, 3, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(1, 2, Unpacker::unpack(p_in[0])); p_in++; - pb->prel(1, 3, Unpacker::unpack(p_in[0])); p_in++; - } -}; - -//handler functions -template -void texture_PL(PixelBuffer* pb, const u8* p_in, u32 Width, u32 Height) -{ - pb->amove(0,0); - - Height/=PixelConvertor::ypp; - Width/=PixelConvertor::xpp; - - for (u32 y=0;yrmovex(PixelConvertor::xpp); - } - pb->rmovey(PixelConvertor::ypp); - } -} - -template -void texture_TW(PixelBuffer* pb, const u8* p_in, u32 Width, u32 Height) -{ - pb->amove(0, 0); - - const u32 divider = PixelConvertor::xpp * PixelConvertor::ypp; - - const u32 bcx = bitscanrev(Width); - const u32 bcy = bitscanrev(Height); - - for (u32 y = 0; y < Height; y += PixelConvertor::ypp) - { - for (u32 x = 0; x < Width; x += PixelConvertor::xpp) - { - const u8* p = &p_in[(twop(x, y, bcx, bcy) / divider) << 3]; - PixelConvertor::Convert(pb, p); - - pb->rmovex(PixelConvertor::xpp); - } - pb->rmovey(PixelConvertor::ypp); - } -} - -template -void texture_VQ(PixelBuffer* pb, const u8* p_in, u32 Width, u32 Height) -{ - p_in += 256 * 4 * 2; // Skip VQ codebook - pb->amove(0, 0); - - const u32 divider = PixelConvertor::xpp * PixelConvertor::ypp; - const u32 bcx = bitscanrev(Width); - const u32 bcy = bitscanrev(Height); - - for (u32 y = 0; y < Height; y += PixelConvertor::ypp) - { - for (u32 x = 0; x < Width; x += PixelConvertor::xpp) - { - u8 p = p_in[twop(x, y, bcx, bcy) / divider]; - PixelConvertor::Convert(pb, &vq_codebook[p * 8]); - - pb->rmovex(PixelConvertor::xpp); - } - pb->rmovey(PixelConvertor::ypp); - } -} - -typedef void (*TexConvFP)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); -typedef void (*TexConvFP8)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); -typedef void (*TexConvFP32)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); - -//Planar -constexpr TexConvFP tex565_PL = texture_PL>>; -//Twiddle -constexpr TexConvFP tex565_TW = texture_TW>>; -// Palette -constexpr TexConvFP texPAL4_TW = texture_TW>>; -constexpr TexConvFP texPAL8_TW = texture_TW>>; -constexpr TexConvFP32 texPAL4_TW32 = texture_TW>>; -constexpr TexConvFP32 texPAL8_TW32 = texture_TW>>; -constexpr TexConvFP8 texPAL4PT_TW = texture_TW>>; -constexpr TexConvFP8 texPAL8PT_TW = texture_TW>>; -//VQ -constexpr TexConvFP tex565_VQ = texture_VQ>>; -// According to the documentation, a texture cannot be compressed and use -// a palette at the same time. However the hardware displays them -// just fine. -constexpr TexConvFP texPAL4_VQ = texture_VQ>>; -constexpr TexConvFP texPAL8_VQ = texture_VQ>>; -constexpr TexConvFP32 texPAL4_VQ32 = texture_VQ>>; -constexpr TexConvFP32 texPAL8_VQ32 = texture_VQ>>; - -namespace opengl { -// OpenGL - -//Planar -constexpr TexConvFP tex1555_PL = texture_PL>; -constexpr TexConvFP tex4444_PL = texture_PL>; -constexpr TexConvFP texBMP_PL = tex4444_PL; -constexpr TexConvFP32 texYUV422_PL = texture_PL>; - -constexpr TexConvFP32 tex565_PL32 = texture_PL>>; -constexpr TexConvFP32 tex1555_PL32 = texture_PL>>; -constexpr TexConvFP32 tex4444_PL32 = texture_PL>>; - -//Twiddle -constexpr TexConvFP tex1555_TW = texture_TW>; -constexpr TexConvFP tex4444_TW = texture_TW>; -constexpr TexConvFP texBMP_TW = tex4444_TW; -constexpr TexConvFP32 texYUV422_TW = texture_TW>; - -constexpr TexConvFP32 tex565_TW32 = texture_TW>>; -constexpr TexConvFP32 tex1555_TW32 = texture_TW>>; -constexpr TexConvFP32 tex4444_TW32 = texture_TW>>; - -//VQ -constexpr TexConvFP tex1555_VQ = texture_VQ>; -constexpr TexConvFP tex4444_VQ = texture_VQ>; -constexpr TexConvFP texBMP_VQ = tex4444_VQ; -constexpr TexConvFP32 texYUV422_VQ = texture_VQ>; - -constexpr TexConvFP32 tex565_VQ32 = texture_VQ>>; -constexpr TexConvFP32 tex1555_VQ32 = texture_VQ>>; -constexpr TexConvFP32 tex4444_VQ32 = texture_VQ>>; -} - -namespace directx { -// DirectX - -//Planar -constexpr TexConvFP tex1555_PL = texture_PL>>; -constexpr TexConvFP tex4444_PL = texture_PL>>; -constexpr TexConvFP texBMP_PL = tex4444_PL; -constexpr TexConvFP32 texYUV422_PL = texture_PL>; - -constexpr TexConvFP32 tex565_PL32 = texture_PL>>; -constexpr TexConvFP32 tex1555_PL32 = texture_PL>>; -constexpr TexConvFP32 tex4444_PL32 = texture_PL>>; - -//Twiddle -constexpr TexConvFP tex1555_TW = texture_TW>>; -constexpr TexConvFP tex4444_TW = texture_TW>>; -constexpr TexConvFP texBMP_TW = tex4444_TW; -constexpr TexConvFP32 texYUV422_TW = texture_TW>; - -constexpr TexConvFP32 tex565_TW32 = texture_TW>>; -constexpr TexConvFP32 tex1555_TW32 = texture_TW>>; -constexpr TexConvFP32 tex4444_TW32 = texture_TW>>; - -//VQ -constexpr TexConvFP tex1555_VQ = texture_VQ>>; -constexpr TexConvFP tex4444_VQ = texture_VQ>>; -constexpr TexConvFP texBMP_VQ = tex4444_VQ; -constexpr TexConvFP32 texYUV422_VQ = texture_VQ>; - -constexpr TexConvFP32 tex565_VQ32 = texture_VQ>>; -constexpr TexConvFP32 tex1555_VQ32 = texture_VQ>>; -constexpr TexConvFP32 tex4444_VQ32 = texture_VQ>>; -} - class BaseTextureCacheData; struct vram_block @@ -569,9 +44,6 @@ bool VramLockedWrite(u8* address); void UpscalexBRZ(int factor, u32* source, u32* dest, int width, int height, bool has_alpha); -struct PvrTexInfo; -enum class TextureType { _565, _5551, _4444, _8888, _8 }; - class BaseTextureCacheData { protected: @@ -583,10 +55,10 @@ class BaseTextureCacheData tsp = other.tsp; tcw = other.tcw; tex_type = other.tex_type; - sa_tex = other.sa_tex; + startAddress = other.startAddress; dirty = other.dirty; std::swap(lock_block, other.lock_block); - sa = other.sa; + mmStartAddress = other.mmStartAddress; width = other.width; height = other.height; size = other.size; @@ -597,6 +69,7 @@ class BaseTextureCacheData Updates = other.Updates; palette_hash = other.palette_hash; texture_hash = other.texture_hash; + old_vqtexture_hash = other.old_vqtexture_hash; old_texture_hash = other.old_texture_hash; std::swap(custom_image_data, other.custom_image_data); custom_width = other.custom_width; @@ -610,12 +83,12 @@ class BaseTextureCacheData // Decoded/filtered texture format TextureType tex_type; - u32 sa_tex; // texture data start address in vram + u32 startAddress; // texture data start address in vram u32 dirty; // frame number at which texture was overwritten vram_block* lock_block; - u32 sa; // pixel data start address of max level mipmap + u32 mmStartAddress; // pixel data start address of max level mipmap u16 width, height; // width & height of the texture u32 size; // size in bytes of max level mipmap in vram @@ -629,6 +102,7 @@ class BaseTextureCacheData //used for palette updates u32 palette_hash; // Palette hash at time of last update u32 texture_hash; // xxhash of texture data, used for custom textures + u32 old_vqtexture_hash; // legacy hash for vq textures u32 old_texture_hash; // legacy hash u8* custom_image_data; // loaded custom image data u32 custom_width; @@ -685,21 +159,18 @@ class BaseTextureCacheData static bool IsGpuHandledPaletted(TSP tsp, TCW tcw) { // Some palette textures are handled on the GPU - // This is currently limited to textures using nearest filtering and not mipmapped. + // This is currently limited to textures using nearest or bilinear filtering and not mipmapped. // Enabling texture upscaling or dumping also disables this mode. return (tcw.PixelFmt == PixelPal4 || tcw.PixelFmt == PixelPal8) && config::TextureUpscale == 1 && !config::DumpTextures - && tsp.FilterMode == 0 + && tsp.FilterMode <= 1 && !tcw.MipMapped && !tcw.VQ_Comp; } static void SetDirectXColorOrder(bool enabled); }; -// TODO Split the texture cache in a separate header -#include "CustomTexture.h" - template class BaseTextureCache { @@ -741,8 +212,8 @@ class BaseTextureCache Texture *getRTTexture(u32 address, u32 fb_packmode, u32 width, u32 height) { - // TexAddr : (address), Reserved : 0, StrideSel : 0, ScanOrder : 1 - TCW tcw{ { address >> 3, 0, 0, 1 } }; + // TexAddr : (address), StrideSel : 0, ScanOrder : 1 + TCW tcw{ { address >> 3, 0, 1 } }; switch (fb_packmode) { case 0: @@ -792,7 +263,6 @@ class BaseTextureCache texture.Delete(); cache.clear(); - KillTex = false; INFO_LOG(RENDERER, "Texture cache cleared"); } @@ -801,10 +271,10 @@ class BaseTextureCache // Only use TexU and TexV from TSP in the cache key // TexV : 7, TexU : 7 const TSP TSPTextureCacheMask = { { 7, 7 } }; - // TexAddr : 0x1FFFFF, Reserved : 0, StrideSel : 0, ScanOrder : 1, PixelFmt : 7, VQ_Comp : 1, MipMapped : 1 - const TCW TCWTextureCacheMask = { { 0x1FFFFF, 0, 0, 1, 7, 1, 1 } }; + // TexAddr : 0x1FFFFF, StrideSel : 0, ScanOrder : 1, PixelFmt : 7, VQ_Comp : 1, MipMapped : 1 + const TCW TCWTextureCacheMask = { { 0x1FFFFF, 0, 1, 7, 1, 1 } }; // TexAddr : 0x1FFFFF, PalSelect : 0, PixelFmt : 7, VQ_Comp : 1, MipMapped : 1 - const TCW TCWPalTextureCacheMask = { { 0x1FFFFF, 0, 0, 0, 7, 1, 1 } }; + const TCW TCWPalTextureCacheMask = { { 0x1FFFFF, 0, 0, 7, 1, 1 } }; }; template @@ -829,6 +299,6 @@ static inline void MakeFogTexture(u8 *tex_data) } } -void dump_screenshot(u8 *buffer, u32 width, u32 height, bool alpha = false, u32 rowPitch = 0, bool invertY = true); +void dump_screenshot(u8 *buffer, u32 width, u32 height, bool alpha = false, u32 rowPitch = 0, bool invertY = false); extern const std::array D_Adjust_LoD_Bias; diff --git a/core/rend/dx11/dx11_driver.h b/core/rend/dx11/dx11_driver.h index 419919ae5..446de5926 100644 --- a/core/rend/dx11/dx11_driver.h +++ b/core/rend/dx11/dx11_driver.h @@ -17,10 +17,10 @@ along with Flycast. If not, see . */ #pragma once -#include "rend/imgui_driver.h" -#include "imgui/backends/imgui_impl_dx11.h" +#include "ui/imgui_driver.h" +#include "imgui_impl_dx11.h" #include "dx11context.h" -#include "rend/gui.h" +#include "ui/gui.h" #include class DX11Driver final : public ImGuiDriver @@ -30,7 +30,7 @@ class DX11Driver final : public ImGuiDriver ImGui_ImplDX11_Init(device, deviceContext); } - ~DX11Driver() { + ~DX11Driver() override { ImGui_ImplDX11_Shutdown(); } @@ -57,12 +57,12 @@ class DX11Driver final : public ImGuiDriver ImTextureID getTexture(const std::string& name) override { auto it = textures.find(name); if (it != textures.end()) - return (ImTextureID)it->second.textureView.get(); + return (ImTextureID)&it->second.imTexture; else return ImTextureID{}; } - ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height) override + ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) override { Texture& texture = textures[name]; texture.texture.reset(); @@ -86,8 +86,14 @@ class DX11Driver final : public ImGuiDriver theDX11Context.getDevice()->CreateShaderResourceView(texture.texture, &viewDesc, &texture.textureView.get()); theDX11Context.getDeviceContext()->UpdateSubresource(texture.texture, 0, nullptr, data, width * 4, width * 4 * height); + texture.imTexture.shaderResourceView = texture.textureView.get(); + texture.imTexture.pointSampling = nearestSampling; - return (ImTextureID)texture.textureView.get(); + return (ImTextureID)&texture.imTexture; + } + + void deleteTexture(const std::string& name) override { + textures.erase(name); } private: @@ -95,6 +101,7 @@ class DX11Driver final : public ImGuiDriver { ComPtr texture; ComPtr textureView; + ImTextureDX11 imTexture; }; bool frameRendered = false; diff --git a/core/rend/dx11/dx11_naomi2.cpp b/core/rend/dx11/dx11_naomi2.cpp index 1418f7ecc..56ed07d17 100644 --- a/core/rend/dx11/dx11_naomi2.cpp +++ b/core/rend/dx11/dx11_naomi2.cpp @@ -131,7 +131,9 @@ VertexOut main(in VertexIn vin) #endif vo.index = uint(polyNumber) + vin.vertexId; #endif - +#if MODIFIER_VOLUME == 1 + vo.pos.z = min(vo.pos.z, -0.001f); +#endif vo.pos = mul(projMat, vo.pos); vo.pos = float4(vo.pos.xy / vo.pos.w, 1.f / vo.pos.w, 1.f); diff --git a/core/rend/dx11/dx11_overlay.cpp b/core/rend/dx11/dx11_overlay.cpp index 7f171656e..2c0354741 100644 --- a/core/rend/dx11/dx11_overlay.cpp +++ b/core/rend/dx11/dx11_overlay.cpp @@ -28,14 +28,23 @@ void DX11Overlay::draw(u32 width, u32 height, bool vmu, bool crosshair) deviceContext->RSSetScissorRects(1, &rect); if (vmu) { +#ifndef LIBRETRO float vmu_padding = 8.f * settings.display.uiScale; float vmu_height = 70.f * settings.display.uiScale; float vmu_width = 48.f / 32.f * vmu_height; -#ifndef LIBRETRO const float blend_factor[4] = { 0.75f, 0.75f, 0.75f, 0.75f }; deviceContext->OMSetBlendState(blendStates.getState(true, 8, 8), blend_factor, 0xffffffff); #else + float vmu_padding_x = 8.f * width / 640.f; + float vmu_padding_y = 8.f * height / 480.f; + float vmu_width = 48.f * width / 640.f; + float vmu_height = 32.f * height / 480.f; + if (config::Widescreen) + { + vmu_padding_x = vmu_padding_x / 4.f * 3.f; + vmu_width = vmu_width / 4.f * 3.f; + } deviceContext->OMSetBlendState(blendStates.getState(true, 4, 5), nullptr, 0xffffffff); #endif @@ -47,7 +56,7 @@ void DX11Overlay::draw(u32 width, u32 height, bool vmu, bool crosshair) vmuTextures[i].reset(); continue; } - if (vmuTextures[i] == nullptr || vmu_lcd_changed[i]) + if (vmuTextures[i] == nullptr || this->vmuLastChanged[i] != ::vmuLastChanged[i]) { vmuTextureViews[i].reset(); vmuTextures[i].reset(); @@ -73,8 +82,8 @@ void DX11Overlay::draw(u32 width, u32 height, bool vmu, bool crosshair) for (int y = 0; y < 32; y++) memcpy(&data[y * 48], &vmu_lcd_data[i][(31 - y) * 48], sizeof(u32) * 48); deviceContext->UpdateSubresource(vmuTextures[i], 0, nullptr, data, 48 * 4, 48 * 4 * 32); + this->vmuLastChanged[i] = ::vmuLastChanged[i]; } - vmu_lcd_changed[i] = false; } float x, y; float w = vmu_width; @@ -88,20 +97,20 @@ void DX11Overlay::draw(u32 width, u32 height, bool vmu, bool crosshair) { case UPPER_LEFT: default: - x = vmu_padding; - y = vmu_padding; + x = vmu_padding_x; + y = vmu_padding_y; break; case UPPER_RIGHT: - x = width - vmu_padding - w; - y = vmu_padding; + x = width - vmu_padding_x - w; + y = vmu_padding_y; break; case LOWER_LEFT: - x = vmu_padding; - y = height - vmu_padding - h; + x = vmu_padding_x; + y = height - vmu_padding_y - h; break; case LOWER_RIGHT: - x = width - vmu_padding - w; - y = height - vmu_padding - h; + x = width - vmu_padding_x - w; + y = height - vmu_padding_y - h; break; } #else @@ -135,45 +144,42 @@ void DX11Overlay::draw(u32 width, u32 height, bool vmu, bool crosshair) } if (crosshair) { - if (!xhairTexture) + for (u32 i = 0; i < config::CrosshairColor.size(); i++) { - const u32* texData = getCrosshairTextureData(); - D3D11_TEXTURE2D_DESC desc{}; - desc.Width = 16; - desc.Height = 16; - desc.ArraySize = 1; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - desc.MipLevels = 1; - - if (SUCCEEDED(device->CreateTexture2D(&desc, nullptr, &xhairTexture.get()))) + if (!crosshairNeeded(i)) + continue; + if (!xhairTexture) { - D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc{}; - viewDesc.Format = desc.Format; - viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - viewDesc.Texture2D.MipLevels = desc.MipLevels; - device->CreateShaderResourceView(xhairTexture, &viewDesc, &xhairTextureView.get()); + const u32* texData = getCrosshairTextureData(); + D3D11_TEXTURE2D_DESC desc{}; + desc.Width = 16; + desc.Height = 16; + desc.ArraySize = 1; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.MipLevels = 1; - deviceContext->UpdateSubresource(xhairTexture, 0, nullptr, texData, 16 * 4, 16 * 4 * 16); + if (SUCCEEDED(device->CreateTexture2D(&desc, nullptr, &xhairTexture.get()))) + { + D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc{}; + viewDesc.Format = desc.Format; + viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + viewDesc.Texture2D.MipLevels = desc.MipLevels; + device->CreateShaderResourceView(xhairTexture, &viewDesc, &xhairTextureView.get()); + + deviceContext->UpdateSubresource(xhairTexture, 0, nullptr, texData, 16 * 4, 16 * 4 * 16); + } } - } - for (u32 i = 0; i < config::CrosshairColor.size(); i++) - { - if (config::CrosshairColor[i] == 0) - continue; - if (settings.platform.isConsole() - && config::MapleMainDevices[i] != MDT_LightGun) - continue; auto [x, y] = getCrosshairPosition(i); #ifdef LIBRETRO - float halfWidth = LIGHTGUN_CROSSHAIR_SIZE / 2.f / config::ScreenStretching * 100.f; - float halfHeight = LIGHTGUN_CROSSHAIR_SIZE / 2.f; + float halfWidth = lightgun_crosshair_size / 2.f / config::ScreenStretching * 100.f * config::RenderResolution / 480.f; + float halfHeight = lightgun_crosshair_size / 2.f * config::RenderResolution / 480.f; x /= config::ScreenStretching / 100.f; #else - float halfWidth = XHAIR_WIDTH * settings.display.uiScale / 2.f; + float halfWidth = config::CrosshairSize * settings.display.uiScale / 2.f; float halfHeight = halfWidth; #endif D3D11_VIEWPORT vp{}; diff --git a/core/rend/dx11/dx11_overlay.h b/core/rend/dx11/dx11_overlay.h index fbdf54c20..73ff81bcc 100644 --- a/core/rend/dx11/dx11_overlay.h +++ b/core/rend/dx11/dx11_overlay.h @@ -35,6 +35,7 @@ class DX11Overlay this->deviceContext = deviceContext; this->samplers = samplers; quad.init(device, deviceContext, shaders); + vmuLastChanged.fill({}); } void term() @@ -60,6 +61,7 @@ class DX11Overlay ComPtr xhairTextureView; std::array, 8> vmuTextures; std::array, 8> vmuTextureViews; + std::array vmuLastChanged {}; Quad quad; Samplers *samplers; BlendStates blendStates; diff --git a/core/rend/dx11/dx11_renderer.cpp b/core/rend/dx11/dx11_renderer.cpp index d865b93c8..4363d04a2 100644 --- a/core/rend/dx11/dx11_renderer.cpp +++ b/core/rend/dx11/dx11_renderer.cpp @@ -20,12 +20,13 @@ #include "dx11context.h" #include "hw/pvr/ta.h" #include "hw/pvr/pvr_mem.h" -#include "rend/gui.h" -#include "rend/tileclip.h" +#include "ui/gui.h" #include "rend/sorter.h" #include +void os_VideoRoutingTermDX(); + const D3D11_INPUT_ELEMENT_DESC MainLayout[] { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, (UINT)offsetof(Vertex, x), D3D11_INPUT_PER_VERTEX_DATA, 0 }, @@ -157,8 +158,7 @@ bool DX11Renderer::Init() quad->init(device, deviceContext, shaders); n2Helper.init(device, deviceContext); - fog_needs_update = true; - forcePaletteUpdate(); + updateFogTable = true; if (!success) { @@ -173,6 +173,9 @@ bool DX11Renderer::Init() void DX11Renderer::Term() { NOTICE_LOG(RENDERER, "DX11 renderer terminating"); +#ifdef VIDEO_ROUTING + os_VideoRoutingTermDX(); +#endif n2Helper.term(); vtxConstants.reset(); pxlConstants.reset(); @@ -185,6 +188,10 @@ void DX11Renderer::Term() quad.reset(); deviceContext.reset(); device.reset(); + vrStagingTexture.reset(); + vrStagingTextureSRV.reset(); + vrScaledTexture.reset(); + vrScaledRenderTarget.reset(); } void DX11Renderer::createDepthTexAndView(ComPtr& texture, ComPtr& view, int width, int height, DXGI_FORMAT format, UINT bindFlags) @@ -311,13 +318,36 @@ BaseTextureCacheData *DX11Renderer::GetTexture(TSP tsp, TCW tcw) void DX11Renderer::Process(TA_context* ctx) { - if (KillTex) + if (resetTextureCache) { texCache.Clear(); + resetTextureCache = false; + } texCache.Cleanup(); ta_parse(ctx, true); } +void DX11Renderer::resetContextState() +{ + // Reset device context state. Very much needed for libretro where current state is unknown. + deviceContext->OMSetRenderTargetsAndUnorderedAccessViews(0, nullptr, nullptr, 0, 0, nullptr, nullptr); + deviceContext->PSSetShader(nullptr, nullptr, 0); + deviceContext->GSSetShader(nullptr, nullptr, 0); + deviceContext->HSSetShader(nullptr, nullptr, 0); + deviceContext->DSSetShader(nullptr, nullptr, 0); + deviceContext->CSSetShader(nullptr, nullptr, 0); + deviceContext->VSSetShader(nullptr, nullptr, 0); + ID3D11ShaderResourceView *nullview[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] {}; + deviceContext->CSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->DSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->GSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->HSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->PSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->VSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, nullview); + deviceContext->SetPredication(nullptr, false); + deviceContext->SOSetTargets(0, nullptr, nullptr); +} + void DX11Renderer::configVertexShader() { matrices.CalcMatrices(&pvrrc, width, height); @@ -351,10 +381,6 @@ void DX11Renderer::configVertexShader() memcpy(mappedSubres.pData, &constant, sizeof(constant)); deviceContext->Unmap(vtxConstants, 0); deviceContext->VSSetConstantBuffers(0, 1, &vtxConstants.get()); - deviceContext->GSSetShader(nullptr, nullptr, 0); - deviceContext->HSSetShader(nullptr, nullptr, 0); - deviceContext->DSSetShader(nullptr, nullptr, 0); - deviceContext->CSSetShader(nullptr, nullptr, 0); } void DX11Renderer::uploadGeometryBuffers() @@ -411,6 +437,31 @@ void DX11Renderer::setupPixelShaderConstants() // Punch-through alpha ref pixelConstants.alphaTestValue = (PT_ALPHA_REF & 0xFF) / 255.0f; + // Dithering + dithering = config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3; + if (dithering) + { + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + pixelConstants.ditherColorMax[0] = pixelConstants.ditherColorMax[1] = pixelConstants.ditherColorMax[2] = 31.f; + pixelConstants.ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + pixelConstants.ditherColorMax[0] = pixelConstants.ditherColorMax[2] = 31.f; + pixelConstants.ditherColorMax[1] = 63.f; + pixelConstants.ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + pixelConstants.ditherColorMax[0] = pixelConstants.ditherColorMax[1] + = pixelConstants.ditherColorMax[2] = pixelConstants.ditherColorMax[3] = 15.f; + break; + default: + break; + } + } + D3D11_MAPPED_SUBRESOURCE mappedSubres; deviceContext->Map(pxlConstants, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedSubres); memcpy(mappedSubres.pData, &pixelConstants, sizeof(pixelConstants)); @@ -421,15 +472,20 @@ void DX11Renderer::setupPixelShaderConstants() bool DX11Renderer::Render() { - // make sure to unbind the framebuffer view before setting it as render target - ID3D11ShaderResourceView *nullView = nullptr; - deviceContext->PSSetShaderResources(0, 1, &nullView); + resetContextState(); bool is_rtt = pvrrc.isRTT; if (!is_rtt) { resize(pvrrc.framebufferWidth, pvrrc.framebufferHeight); deviceContext->OMSetRenderTargets(1, &fbRenderTarget.get(), depthTexView); deviceContext->ClearDepthStencilView(depthTexView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.f, 0); + if (pvrrc.clearFramebuffer) + { + float colors[4]; + VO_BORDER_COL.getRGBColor(colors); + colors[3] = 1.f; + deviceContext->ClearRenderTargetView(fbRenderTarget, colors); + } } configVertexShader(); @@ -459,7 +515,8 @@ bool DX11Renderer::Render() #ifndef LIBRETRO deviceContext->OMSetRenderTargets(1, &theDX11Context.getRenderTarget().get(), nullptr); displayFramebuffer(); - DrawOSD(false); + drawOSD(); + renderVideoRouting(); theDX11Context.setFrameRendered(); #else ID3D11RenderTargetView *nullView = nullptr; @@ -468,6 +525,7 @@ bool DX11Renderer::Render() #endif frameRendered = true; frameRenderedOnce = true; + clearLastFrame = false; } return !is_rtt; @@ -549,6 +607,19 @@ void DX11Renderer::setCullMode(int mode) deviceContext->RSSetState(rasterizer); } +TileClipping DX11Renderer::setTileClip(u32 tileclip, int clip_rect[4]) +{ + TileClipping clipmode = GetTileClip(tileclip, matrices.GetViewportMatrix(), clip_rect); + if (clipmode == TileClipping::Outside) { + RECT rect { clip_rect[0], clip_rect[1], clip_rect[0] + clip_rect[2], clip_rect[1] + clip_rect[3] }; + deviceContext->RSSetScissorRects(1, &rect); + } + else { + deviceContext->RSSetScissorRects(1, &scissorRect); + } + return clipmode; +} + template void DX11Renderer::setRenderState(const PolyParam *gp) { @@ -567,9 +638,17 @@ void DX11Renderer::setRenderState(const PolyParam *gp) int fog_ctrl = config::Fog ? gp->tsp.FogCtrl : 2; int clip_rect[4] = {}; - TileClipping clipmode = GetTileClip(gp->tileclip, matrices.GetViewportMatrix(), clip_rect); + TileClipping clipmode = setTileClip(gp->tileclip, clip_rect); DX11Texture *texture = (DX11Texture *)gp->texture; - bool gpuPalette = texture != nullptr ? texture->gpuPalette : false; + int gpuPalette = texture == nullptr || !texture->gpuPalette ? 0 + : gp->tsp.FilterMode + 1; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + } ComPtr vertexShader = shaders->getVertexShader(gp->pcw.Gouraud, gp->isNaomi2()); deviceContext->VSSetShader(vertexShader, nullptr, 0); @@ -587,10 +666,10 @@ void DX11Renderer::setRenderState(const PolyParam *gp) gp->pcw.Gouraud, Type == ListType_Punch_Through, clipmode == TileClipping::Inside, - gp->pcw.Texture && gp->tsp.FilterMode == 0 && !gp->tsp.ClampU && !gp->tsp.ClampV && !gp->tsp.FlipU && !gp->tsp.FlipV); + dithering); deviceContext->PSSetShader(pixelShader, nullptr, 0); - if (gpuPalette) + if (gpuPalette != 0) { if (gp->tcw.PixelFmt == PixelPal4) constants.paletteIndex = (float)(gp->tcw.PalSelect << 4); @@ -598,23 +677,14 @@ void DX11Renderer::setRenderState(const PolyParam *gp) constants.paletteIndex = (float)((gp->tcw.PalSelect >> 4) << 8); } - if (clipmode == TileClipping::Outside) - { - RECT rect { clip_rect[0], clip_rect[1], clip_rect[0] + clip_rect[2], clip_rect[1] + clip_rect[3] }; - deviceContext->RSSetScissorRects(1, &rect); - } - else + if (clipmode == TileClipping::Inside) { - deviceContext->RSSetScissorRects(1, &scissorRect); - if (clipmode == TileClipping::Inside) - { - constants.clipTest[0] = (float)clip_rect[0]; - constants.clipTest[1] = (float)clip_rect[1]; - constants.clipTest[2] = (float)(clip_rect[0] + clip_rect[2]); - constants.clipTest[3] = (float)(clip_rect[1] + clip_rect[3]); - } + constants.clipTest[0] = (float)clip_rect[0]; + constants.clipTest[1] = (float)clip_rect[1]; + constants.clipTest[2] = (float)(clip_rect[0] + clip_rect[2]); + constants.clipTest[3] = (float)(clip_rect[1] + clip_rect[3]); } - if (constants.trilinearAlpha != 1.f || gpuPalette || clipmode == TileClipping::Inside) + if (constants.trilinearAlpha != 1.f || gpuPalette != 0 || clipmode == TileClipping::Inside) { D3D11_MAPPED_SUBRESOURCE mappedSubres; deviceContext->Map(pxlPolyConstants, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedSubres); @@ -626,21 +696,20 @@ void DX11Renderer::setRenderState(const PolyParam *gp) { deviceContext->PSSetShaderResources(0, 1, &texture->textureView.get()); bool linearFiltering; - if (config::TextureFiltering == 0) - linearFiltering = gp->tsp.FilterMode != 0 && !gpuPalette; + if (gpuPalette != 0) + linearFiltering = false; + else if (config::TextureFiltering == 0) + linearFiltering = gp->tsp.FilterMode != 0; else if (config::TextureFiltering == 1) linearFiltering = false; else linearFiltering = true; - auto sampler = samplers->getSampler(linearFiltering, gp->tsp.ClampU, gp->tsp.ClampV, gp->tsp.FlipU, gp->tsp.FlipV); + auto sampler = samplers->getSampler(linearFiltering, gp->tsp.ClampU, gp->tsp.ClampV, gp->tsp.FlipU, gp->tsp.FlipV, Type == ListType_Punch_Through); deviceContext->PSSetSamplers(0, 1, &sampler.get()); } // Apparently punch-through polys support blending, or at least some combinations - if (Type == ListType_Translucent || Type == ListType_Punch_Through) - deviceContext->OMSetBlendState(blendStates.getState(true, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); - else - deviceContext->OMSetBlendState(blendStates.getState(false, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); + deviceContext->OMSetBlendState(blendStates.getState(true, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); setCullMode(gp->isp.CullMode); @@ -764,7 +833,6 @@ void DX11Renderer::drawModVols(int first, int count) deviceContext->PSSetShader(shaders->getModVolShader(), nullptr, 0); - deviceContext->RSSetScissorRects(1, &scissorRect); setCullMode(0); const ModifierVolumeParam *params = &pvrrc.global_param_mvo[first]; @@ -796,6 +864,10 @@ void DX11Renderer::drawModVols(int first, int count) // XOR'ing (closed volume) deviceContext->OMSetDepthStencilState(depthStencilStates.getMVState(DepthStencilStates::Xor), 0); + int clip_rect[4] = {}; + setTileClip(param.tileclip, clip_rect); + // TODO inside clipping + if (param.count > 0) { setCullMode(param.isp.CullMode); @@ -814,6 +886,7 @@ void DX11Renderer::drawModVols(int first, int count) setCullMode(0); //enable color writes deviceContext->OMSetBlendState(blendStates.getState(true, 4, 5), nullptr, 0xffffffff); + deviceContext->RSSetScissorRects(1, &scissorRect); //black out any stencil with '1' //only pixels that are Modvol enabled, and in area 1 @@ -867,7 +940,7 @@ void DX11Renderer::drawStrips() bool DX11Renderer::RenderLastFrame() { - if (!frameRenderedOnce) + if (!frameRenderedOnce || clearLastFrame) return false; displayFramebuffer(); return true; @@ -959,7 +1032,8 @@ void DX11Renderer::RenderFramebuffer(const FramebufferInfo& info) deviceContext->OMSetRenderTargets(1, &theDX11Context.getRenderTarget().get(), nullptr); displayFramebuffer(); - DrawOSD(false); + drawOSD(); + renderVideoRouting(); theDX11Context.setFrameRendered(); #else ID3D11RenderTargetView *nullView = nullptr; @@ -968,6 +1042,7 @@ void DX11Renderer::RenderFramebuffer(const FramebufferInfo& info) #endif frameRendered = true; frameRenderedOnce = true; + clearLastFrame = false; } void DX11Renderer::setBaseScissor() @@ -1024,10 +1099,10 @@ void DX11Renderer::setBaseScissor() } else { - fWidth = (float)(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1); - fHeight = (float)(pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1); - min_x = (float)pvrrc.fb_X_CLIP.min; - min_y = (float)pvrrc.fb_Y_CLIP.min; + min_x = (float)pvrrc.getFramebufferMinX(); + min_y = (float)pvrrc.getFramebufferMinY(); + fWidth = (float)pvrrc.getFramebufferWidth() - min_x; + fHeight = (float)pvrrc.getFramebufferHeight() - min_y; if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) { min_x *= config::RenderResolution / 480.f; @@ -1152,34 +1227,35 @@ void DX11Renderer::readRttRenderTarget(u32 texAddress) void DX11Renderer::updatePaletteTexture() { - if (!palette_updated) - return; - palette_updated = false; - - deviceContext->UpdateSubresource(paletteTexture, 0, nullptr, palette32_ram, 32 * sizeof(u32), 32 * sizeof(u32) * 32); - + if (updatePalette) + { + updatePalette = false; + deviceContext->UpdateSubresource(paletteTexture, 0, nullptr, palette32_ram, 32 * sizeof(u32), 32 * sizeof(u32) * 32); + } deviceContext->PSSetShaderResources(1, 1, &paletteTextureView.get()); deviceContext->PSSetSamplers(1, 1, &samplers->getSampler(false).get()); } void DX11Renderer::updateFogTexture() { - if (!fog_needs_update || !config::Fog) + if (!config::Fog) return; - fog_needs_update = false; - u8 temp_tex_buffer[256]; - MakeFogTexture(temp_tex_buffer); - - deviceContext->UpdateSubresource(fogTexture, 0, nullptr, temp_tex_buffer, 128, 128 * 2); + if (updateFogTable) + { + updateFogTable = false; + u8 temp_tex_buffer[256]; + MakeFogTexture(temp_tex_buffer); + deviceContext->UpdateSubresource(fogTexture, 0, nullptr, temp_tex_buffer, 128, 128 * 2); + } deviceContext->PSSetShaderResources(2, 1, &fogTextureView.get()); deviceContext->PSSetSamplers(2, 1, &samplers->getSampler(true).get()); } -void DX11Renderer::DrawOSD(bool clear_screen) +void DX11Renderer::drawOSD() { #ifndef LIBRETRO - theDX11Context.setOverlay(!clear_screen); + theDX11Context.setOverlay(true); gui_display_osd(); theDX11Context.setOverlay(false); #endif @@ -1225,9 +1301,10 @@ void DX11Renderer::writeFramebufferToVRAM() viewDesc.Texture2D.MipLevels = 1; device->CreateShaderResourceView(fbScaledTexture, &viewDesc, &fbScaledTextureView.get()); } + deviceContext->OMSetRenderTargets(1, &fbScaledRenderTarget.get(), nullptr); D3D11_VIEWPORT vp{}; - vp.Width = (FLOAT)width; - vp.Height = (FLOAT)height; + vp.Width = (FLOAT)scaledW; + vp.Height = (FLOAT)scaledH; vp.MinDepth = 0.f; vp.MaxDepth = 1.f; deviceContext->RSSetViewports(1, &vp); @@ -1294,6 +1371,181 @@ void DX11Renderer::writeFramebufferToVRAM() WriteFramebuffer<2, 1, 0, 3>(width, height, (u8 *)tmp_buf.data(), texAddress, pvrrc.fb_W_CTRL, linestride, xClip, yClip); } +bool DX11Renderer::GetLastFrame(std::vector& data, int& width, int& height) +{ + if (!frameRenderedOnce) + return false; + + if (width != 0) { + height = width / aspectRatio; + } + else if (height != 0) { + width = aspectRatio * height; + } + else + { + width = this->width; + height = this->height; + if (config::Rotate90) + std::swap(width, height); + // We need square pixels for PNG + int w = aspectRatio * height; + if (width > w) + height = width / aspectRatio; + else + width = w; + } + + ComPtr dstTex; + ComPtr dstRenderTarget; + createTexAndRenderTarget(dstTex, dstRenderTarget, width, height); + + ID3D11ShaderResourceView *nullResView = nullptr; + deviceContext->PSSetShaderResources(0, 1, &nullResView); + deviceContext->OMSetRenderTargets(1, &dstRenderTarget.get(), nullptr); + D3D11_VIEWPORT vp{}; + vp.Width = (FLOAT)width; + vp.Height = (FLOAT)height; + vp.MinDepth = 0.f; + vp.MaxDepth = 1.f; + deviceContext->RSSetViewports(1, &vp); + const D3D11_RECT r = { 0, 0, (LONG)width, (LONG)height }; + deviceContext->RSSetScissorRects(1, &r); + deviceContext->OMSetBlendState(blendStates.getState(false), nullptr, 0xffffffff); + deviceContext->GSSetShader(nullptr, nullptr, 0); + deviceContext->HSSetShader(nullptr, nullptr, 0); + deviceContext->DSSetShader(nullptr, nullptr, 0); + deviceContext->CSSetShader(nullptr, nullptr, 0); + + quad->draw(fbTextureView, samplers->getSampler(true), nullptr, -1.f, -1.f, 2.f, 2.f, config::Rotate90); + +#ifndef LIBRETRO + deviceContext->OMSetRenderTargets(1, &theDX11Context.getRenderTarget().get(), nullptr); +#else + ID3D11RenderTargetView *nullView = nullptr; + deviceContext->OMSetRenderTargets(1, &nullView, nullptr); +#endif + D3D11_TEXTURE2D_DESC desc; + dstTex->GetDesc(&desc); + desc.Usage = D3D11_USAGE_STAGING; + desc.BindFlags = 0; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + + ComPtr stagingTex; + HRESULT hr = device->CreateTexture2D(&desc, nullptr, &stagingTex.get()); + if (FAILED(hr)) + { + WARN_LOG(RENDERER, "Staging screenshot texture creation failed"); + return false; + } + deviceContext->CopyResource(stagingTex, dstTex); + + D3D11_MAPPED_SUBRESOURCE mappedSubres; + hr = deviceContext->Map(stagingTex, 0, D3D11_MAP_READ, 0, &mappedSubres); + if (FAILED(hr)) + { + WARN_LOG(RENDERER, "Failed to map staging screenshot texture"); + return false; + } + const u8* const src = (const u8 *)mappedSubres.pData; + for (int y = 0; y < height; y++) + { + const u8 *p = src + y * mappedSubres.RowPitch; + for (int x = 0; x < width; x++, p += 4) + { + data.push_back(p[2]); + data.push_back(p[1]); + data.push_back(p[0]); + } + } + deviceContext->Unmap(stagingTex, 0); + + return true; +} + +void DX11Renderer::renderVideoRouting() +{ +#ifdef VIDEO_ROUTING + if (config::VideoRouting) + { + extern void os_VideoRoutingPublishFrameTexture(ID3D11Texture2D* pTexture); + + ID3D11RenderTargetView* pRenderTargetView = theDX11Context.getRenderTarget().get(); + + // Backbuffer texture would be different after resizing, fetching new address everytime + ID3D11Resource* pResource = nullptr; + pRenderTargetView->GetResource(&pResource); + ID3D11Texture2D* backBufferTexture = nullptr; + pResource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&backBufferTexture); + + if (config::VideoRoutingScale) + { + D3D11_TEXTURE2D_DESC bbDesc = {}; + backBufferTexture->GetDesc(&bbDesc); + D3D11_TEXTURE2D_DESC vrsDesc = {}; + if (vrStagingTexture) + vrStagingTexture->GetDesc(&vrsDesc); + + // Window resized? + if (!vrStagingTexture || bbDesc.Width != vrsDesc.Width || bbDesc.Height != vrsDesc.Height) + { + vrStagingTexture.reset(); + vrStagingTextureSRV.reset(); + + D3D11_TEXTURE2D_DESC srvDesc = bbDesc; + srvDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + srvDesc.Usage = D3D11_USAGE_DEFAULT; + device->CreateTexture2D(&srvDesc, nullptr, &vrStagingTexture.get()); + + D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc{}; + viewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + viewDesc.Texture2D.MipLevels = 1; + + device->CreateShaderResourceView(vrStagingTexture.get(), &viewDesc, &vrStagingTextureSRV.get()); + } + + // Scale down value changed? + D3D11_TEXTURE2D_DESC vrscDesc = {}; + if (vrScaledTexture) + vrScaledTexture->GetDesc(&vrscDesc); + int targetWidth = config::VideoRoutingVRes * settings.display.width / settings.display.height; + if (!vrScaledTexture || (int)vrscDesc.Height != config::VideoRoutingVRes) + { + + vrScaledTexture.reset(); + vrScaledRenderTarget.reset(); + createTexAndRenderTarget(vrScaledTexture, vrScaledRenderTarget, targetWidth, config::VideoRoutingVRes); + } + D3D11_VIEWPORT scaledViewPort{}; + scaledViewPort.Width = targetWidth; + scaledViewPort.Height = config::VideoRoutingVRes; + scaledViewPort.MinDepth = 0.f; + scaledViewPort.MaxDepth = 1.f; + + deviceContext->OMSetRenderTargets(1, &vrScaledRenderTarget.get(), nullptr); + deviceContext->RSSetViewports(1, &scaledViewPort); + deviceContext->CopyResource(vrStagingTexture.get(), backBufferTexture); + quad->draw(vrStagingTextureSRV, samplers->getSampler(true)); + os_VideoRoutingPublishFrameTexture(vrScaledTexture); + + deviceContext->OMSetRenderTargets(1, &theDX11Context.getRenderTarget().get(), nullptr); + + } else { + os_VideoRoutingPublishFrameTexture(backBufferTexture); + } + + backBufferTexture->Release(); + pResource->Release(); + } + else + { + os_VideoRoutingTermDX(); + } +#endif +} + Renderer *rend_DirectX11() { return new DX11Renderer(); diff --git a/core/rend/dx11/dx11_renderer.h b/core/rend/dx11/dx11_renderer.h index 0c87afc1c..fb73fd7e8 100644 --- a/core/rend/dx11/dx11_renderer.h +++ b/core/rend/dx11/dx11_renderer.h @@ -27,6 +27,7 @@ #include "dx11_shaders.h" #include "dx11_renderstate.h" #include "dx11_naomi2.h" +#include "rend/tileclip.h" #ifndef LIBRETRO #include "dx11_driver.h" #endif @@ -41,18 +42,20 @@ struct DX11Renderer : public Renderer bool Present() override { - if (!frameRendered) + if (!frameRendered || clearLastFrame) return false; frameRendered = false; #ifndef LIBRETRO imguiDriver->setFrameRendered(); +#else + theDX11Context.present(); #endif return true; } bool RenderLastFrame() override; - void DrawOSD(bool clear_screen) override; BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override; + bool GetLastFrame(std::vector& data, int& width, int& height) override; protected: struct VertexConstants @@ -70,6 +73,7 @@ struct DX11Renderer : public Renderer float colorClampMax[4]; float fog_col_vert[4]; float fog_col_ram[4]; + float ditherColorMax[4]; float fogDensity; float shadowScale; float alphaTestValue; @@ -96,6 +100,10 @@ struct DX11Renderer : public Renderer void setCullMode(int mode); virtual void setRTTSize(int width, int height) {} void writeFramebufferToVRAM(); + void renderVideoRouting(); + void resetContextState(); + void drawOSD(); + TileClipping setTileClip(u32 val, int clip_rect[4]); ComPtr device; ComPtr deviceContext; @@ -122,9 +130,9 @@ struct DX11Renderer : public Renderer bool frameRenderedOnce = false; Naomi2Helper n2Helper; float aspectRatio = 4.f / 3.f; + bool dithering = false; private: - void readDCFramebuffer(); void prepareRttRenderTarget(u32 texAddress); void setBaseScissor(); void drawStrips(); @@ -154,6 +162,10 @@ struct DX11Renderer : public Renderer ComPtr fbScaledTexture; ComPtr fbScaledTextureView; ComPtr fbScaledRenderTarget; + ComPtr vrStagingTexture; + ComPtr vrStagingTextureSRV; + ComPtr vrScaledTexture; + ComPtr vrScaledRenderTarget; ComPtr rasterCullNone, rasterCullFront, rasterCullBack; diff --git a/core/rend/dx11/dx11_shaders.cpp b/core/rend/dx11/dx11_shaders.cpp index 91c54d145..625e55577 100644 --- a/core/rend/dx11/dx11_shaders.cpp +++ b/core/rend/dx11/dx11_shaders.cpp @@ -124,8 +124,7 @@ VertexOut main(in VertexIn vin) )"; -const char * const PixelShader = R"( - +extern const char * const PixelShaderCommon = R"( #if pp_Gouraud == 1 #define INTERPOLATION #else @@ -134,14 +133,6 @@ const char * const PixelShader = R"( #define PI 3.1415926f -struct Pixel -{ - float4 pos : SV_POSITION; - float4 uv : TEXCOORD0; - INTERPOLATION float4 col : COLOR0; - INTERPOLATION float4 spec : COLOR1; -}; - Texture2D texture0 : register(t0); sampler sampler0 : register(s0); @@ -151,24 +142,6 @@ sampler paletteSampler : register(s1); Texture2D fogTexture : register(t2); sampler fogSampler : register(s2); -cbuffer constantBuffer : register(b0) -{ - float4 colorClampMin; - float4 colorClampMax; - float4 FOG_COL_VERT; - float4 FOG_COL_RAM; - float fogDensity; - float shadowScale; - float alphaTestValue; -}; - -cbuffer polyConstantBuffer : register(b1) -{ - float4 clipTest; - float paletteIndex; - float trilinearAlpha; -}; - float fog_mode2(float w) { float z = clamp( @@ -194,17 +167,84 @@ float4 clampColor(float4 color) #endif } -#if pp_Palette == 1 +#if pp_Palette != 0 -float4 palettePixel(float2 coords) +float4 getPaletteEntry(float colIdx) { - uint colorIdx = int(floor(texture0.Sample(sampler0, coords).a * 255.0f + 0.5f) + paletteIndex); + uint colorIdx = int(floor(colIdx * 255.0f + 0.5f) + paletteIndex); float2 c = float2((fmod(float(colorIdx), 32.0f) * 2.0f + 1.0f) / 64.0f, (float(colorIdx / 32) * 2.0f + 1.0f) / 64.0f); return paletteTexture.Sample(paletteSampler, c); } #endif +#if pp_Palette == 1 + +float4 palettePixel(Texture2D tex, sampler texSampler, float2 coords) +{ + return getPaletteEntry(tex.Sample(texSampler, coords).a); +} + +#elif pp_Palette == 2 + +float4 palettePixelBilinear(Texture2D tex, sampler texSampler, float2 coords) +{ + float2 textureSize; + tex.GetDimensions(textureSize.x, textureSize.y); + float2 pixCoord = coords * textureSize - 0.5f; // coordinates of top left pixel + float2 originPixCoord = floor(pixCoord); + + float2 sampleUV = (originPixCoord + 0.5f) / textureSize; // UV coordinates of center of top left pixel + + // Sample from all surrounding texels + float4 c00 = getPaletteEntry(tex.Sample(texSampler, sampleUV).a); + float4 c01 = getPaletteEntry(tex.Sample(texSampler, sampleUV, int2(0, 1)).a); + float4 c11 = getPaletteEntry(tex.Sample(texSampler, sampleUV, int2(1, 1)).a); + float4 c10 = getPaletteEntry(tex.Sample(texSampler, sampleUV, int2(1, 0)).a); + + float2 weight = pixCoord - originPixCoord; + + // Bi-linear mixing + float4 temp0 = lerp(c00, c10, weight.x); + float4 temp1 = lerp(c01, c11, weight.x); + return lerp(temp0, temp1, weight.y); +} + +#endif + +)"; + +const char * const PixelShader = R"( + +cbuffer constantBuffer : register(b0) +{ + float4 colorClampMin; + float4 colorClampMax; + float4 FOG_COL_VERT; + float4 FOG_COL_RAM; + float4 ditherColorMax; + float fogDensity; + float shadowScale; + float alphaTestValue; +}; + +cbuffer polyConstantBuffer : register(b1) +{ + float4 clipTest; + float paletteIndex; + float trilinearAlpha; +}; + +#include "pixel_common.hlsl" + +struct Pixel +{ + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + INTERPOLATION float4 col : COLOR0; + INTERPOLATION float4 spec : COLOR1; +}; + struct PSO { float4 col : SV_TARGET; @@ -241,13 +281,12 @@ PSO main(in Pixel inpix) #if DIV_POS_Z != 1 uv /= inpix.uv.w; #endif - #if NearestWrapFix == 1 - uv = min(fmod(uv, 1.f), 0.9997f); - #endif #if pp_Palette == 0 float4 texcol = texture0.Sample(sampler0, uv); + #elif pp_Palette == 1 + float4 texcol = palettePixel(texture0, sampler0, uv); #else - float4 texcol = palettePixel(uv); + float4 texcol = palettePixelBilinear(texture0, sampler0, uv); #endif #if pp_BumpMap == 1 @@ -259,11 +298,6 @@ PSO main(in Pixel inpix) #if pp_IgnoreTexA == 1 texcol.a = 1.0f; #endif - #if cp_AlphaTest == 1 - if (alphaTestValue > texcol.a) - discard; - texcol.a = 1.0f; - #endif #endif #if pp_ShadInstr == 0 color = texcol; @@ -298,13 +332,33 @@ PSO main(in Pixel inpix) color *= trilinearAlpha; #endif + #if cp_AlphaTest == 1 + color.a = round(color.a * 255.0f) * 0.0039215688593685626983642578125; // 1 / 255 + if (alphaTestValue > color.a) + discard; + color.a = 1.0f; + #endif + +#if DITHERING == 1 + static const float ditherTable[16] = { + 0.9375f, 0.1875f, 0.75f, 0.0f, + 0.4375f, 0.6875f, 0.25f, 0.5f, + 0.8125f, 0.0625f, 0.875f, 0.125f, + 0.3125f, 0.5625f, 0.375f, 0.625f + }; + float r = ditherTable[int(inpix.pos.y % 4.0f) * 4 + int(inpix.pos.x % 4.0f)] + 0.03125f; // why is this bias needed?? + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + color += r / ditherColorMax; + // avoid rounding + color = floor(color * 255.0f) / 255.0f; +#endif PSO pso; #if DIV_POS_Z == 1 float w = 100000.0f / inpix.uv.w; #else float w = 100000.0f * inpix.uv.w; #endif - pso.z = log2(1.0f + w) / 34.0f; + pso.z = log2(1.0f + max(w, -0.999999f)) / 34.0f; pso.col = color; return pso; @@ -324,7 +378,7 @@ PSO modifierVolume(in MVPixel inpix) #else float w = 100000.0f * inpix.uv.w; #endif - pso.z = log2(1.0f + w) / 34.0f; + pso.z = log2(1.0f + max(w, -0.999999f)) / 34.0f; pso.col = float4(0, 0, 0, 1.f - shadowScale); return pso; @@ -380,6 +434,24 @@ float4 main(in VertexIn vin) : SV_Target )"; +struct IncludeManager : public ID3DInclude +{ + HRESULT STDMETHODCALLTYPE Open(D3D_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) override + { + if (!strcmp(pFileName, "pixel_common.hlsl")) + { + *ppData = PixelShaderCommon; + *pBytes = (UINT)strlen(PixelShaderCommon); + return S_OK; + } + return E_FAIL; + } + + HRESULT STDMETHODCALLTYPE Close(LPCVOID pData) override { + return S_OK; + } +}; + const char * const MacroValues[] { "0", "1", "2", "3" }; enum VertexMacroEnum { @@ -388,6 +460,7 @@ enum VertexMacroEnum { MacroPositionOnly, MacroTwoVolumes, MacroLightOn, + MacroModifierVolume, }; static D3D_SHADER_MACRO VertexMacros[] @@ -397,6 +470,7 @@ static D3D_SHADER_MACRO VertexMacros[] { "POSITION_ONLY", "0" }, { "pp_TwoVolumes", "0" }, { "LIGHT_ON", "1" }, + { "MODIFIER_VOLUME", "0" }, { nullptr, nullptr } }; @@ -413,7 +487,7 @@ enum PixelMacroEnum { MacroPalette, MacroAlphaTest, MacroClipInside, - MacroNearestWrapFix + MacroDithering }; static D3D_SHADER_MACRO PixelMacros[] @@ -432,13 +506,13 @@ static D3D_SHADER_MACRO PixelMacros[] { "pp_Palette", "0" }, { "cp_AlphaTest", "0" }, { "pp_ClipInside", "0" }, - { "NearestWrapFix", "0" }, + { "DITHERING", "0" }, { nullptr, nullptr } }; const ComPtr& DX11Shaders::getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, - bool trilinear, bool palette, bool gouraud, bool alphaTest, bool clipInside, bool nearestWrapFix) + bool trilinear, int palette, bool gouraud, bool alphaTest, bool clipInside, bool dithering) { bool divPosZ = !settings.platform.isNaomi2() && config::NativeDepthInterpolation; const u32 hash = (int)pp_Texture @@ -451,11 +525,11 @@ const ComPtr& DX11Shaders::getShader(bool pp_Texture, bool pp | (fog_clamping << 9) | (trilinear << 10) | (palette << 11) - | (gouraud << 12) - | (alphaTest << 13) - | (clipInside << 14) - | (nearestWrapFix << 15) - | (divPosZ << 16); + | (gouraud << 13) + | (alphaTest << 14) + | (clipInside << 15) + | (divPosZ << 16) + | (dithering << 17); auto& shader = shaders[hash]; if (shader == nullptr) { @@ -474,8 +548,8 @@ const ComPtr& DX11Shaders::getShader(bool pp_Texture, bool pp PixelMacros[MacroPalette].Definition = MacroValues[palette]; PixelMacros[MacroAlphaTest].Definition = MacroValues[alphaTest]; PixelMacros[MacroClipInside].Definition = MacroValues[clipInside]; - PixelMacros[MacroNearestWrapFix].Definition = MacroValues[nearestWrapFix]; PixelMacros[MacroDivPosZ].Definition = MacroValues[divPosZ]; + PixelMacros[MacroDithering].Definition = MacroValues[dithering]; shader = compilePS(PixelShader, "main", PixelMacros); verify(shader != nullptr); @@ -501,6 +575,7 @@ const ComPtr& DX11Shaders::getVertexShader(bool gouraud, boo VertexMacros[MacroPositionOnly].Definition = MacroValues[false]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; VertexMacros[MacroLightOn].Definition = MacroValues[true]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[false]; std::string source(DX11N2VertexShader); source += std::string("\n") + DX11N2ColorShader; vertexShader = compileVS(source.c_str(), "main", VertexMacros); @@ -527,6 +602,7 @@ const ComPtr& DX11Shaders::getMVVertexShader(bool naomi2) VertexMacros[MacroPositionOnly].Definition = MacroValues[true]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; VertexMacros[MacroLightOn].Definition = MacroValues[false]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[true]; modVolVertexShaders[index] = compileVS(DX11N2VertexShader, "main", VertexMacros); } } @@ -574,7 +650,9 @@ ComPtr DX11Shaders::compileShader(const char* source, const char* func if (!lookupShader(hash, shaderBlob)) { ComPtr errorBlob; - if (FAILED(this->D3DCompile(source, strlen(source), nullptr, pDefines, nullptr, function, profile, 0, 0, &shaderBlob.get(), &errorBlob.get()))) + IncludeManager includeManager; + + if (FAILED(this->D3DCompile(source, strlen(source), nullptr, pDefines, &includeManager, function, profile, 0, 0, &shaderBlob.get(), &errorBlob.get()))) ERROR_LOG(RENDERER, "Shader compilation failed: %s", errorBlob->GetBufferPointer()); else cacheShader(hash, shaderBlob); @@ -615,6 +693,7 @@ ComPtr DX11Shaders::getVertexShaderBlob() // FIXME code dup VertexMacros[MacroPositionOnly].Definition = MacroValues[false]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[false]; std::string source(DX11N2VertexShader); source += std::string("\n") + DX11N2ColorShader; return compileShader(source.c_str(), "main", "vs_4_0", VertexMacros); @@ -626,6 +705,7 @@ ComPtr DX11Shaders::getMVVertexShaderBlob() VertexMacros[MacroGouraud].Definition = MacroValues[false]; VertexMacros[MacroPositionOnly].Definition = MacroValues[true]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[true]; return compileShader(DX11N2VertexShader, "main", "vs_4_0", VertexMacros); } diff --git a/core/rend/dx11/dx11_shaders.h b/core/rend/dx11/dx11_shaders.h index 69245aa68..24adb4fa5 100644 --- a/core/rend/dx11/dx11_shaders.h +++ b/core/rend/dx11/dx11_shaders.h @@ -51,8 +51,8 @@ class DX11Shaders : CachedDX11Shaders void term(); const ComPtr& getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, - bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, bool trilinear, bool palette, bool gouraud, - bool alphaTest, bool clipInside, bool nearestWrapFix); + bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, bool trilinear, int palette, bool gouraud, + bool alphaTest, bool clipInside, bool dithering); const ComPtr& getVertexShader(bool gouraud, bool naomi2); const ComPtr& getModVolShader(); const ComPtr& getMVVertexShader(bool naomi2); diff --git a/core/rend/dx11/dx11_texture.h b/core/rend/dx11/dx11_texture.h index fc251cf6e..e3bca85b8 100644 --- a/core/rend/dx11/dx11_texture.h +++ b/core/rend/dx11/dx11_texture.h @@ -67,9 +67,9 @@ class DX11TextureCache final : public BaseTextureCache class Samplers { public: - ComPtr getSampler(bool linear, bool clampU = true, bool clampV = true, bool flipU = false, bool flipV = false) + ComPtr getSampler(bool linear, bool clampU = true, bool clampV = true, bool flipU = false, bool flipV = false, bool punchThrough = false) { - int hash = (int)clampU | ((int)clampV << 1) | ((int)flipU << 2) | ((int)flipV << 3) | ((int)linear << 4); + int hash = (int)clampU | ((int)clampV << 1) | ((int)flipU << 2) | ((int)flipV << 3) | ((int)linear << 4) | ((int)punchThrough << 5); auto& sampler = samplers[hash]; if (!sampler) { @@ -77,19 +77,23 @@ class Samplers D3D11_SAMPLER_DESC desc{}; if (linear) { - if (config::AnisotropicFiltering > 1) + if (punchThrough) + desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; + else if (config::AnisotropicFiltering > 1) desc.Filter = D3D11_FILTER_ANISOTROPIC; else desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; } - else + else { desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + } desc.AddressU = clampU ? D3D11_TEXTURE_ADDRESS_CLAMP : flipU ? D3D11_TEXTURE_ADDRESS_MIRROR : D3D11_TEXTURE_ADDRESS_WRAP; desc.AddressV = clampV ? D3D11_TEXTURE_ADDRESS_CLAMP : flipV ? D3D11_TEXTURE_ADDRESS_MIRROR : D3D11_TEXTURE_ADDRESS_WRAP; desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; desc.ComparisonFunc = D3D11_COMPARISON_NEVER; desc.MaxAnisotropy = config::AnisotropicFiltering; desc.MaxLOD = D3D11_FLOAT32_MAX; + desc.MipLODBias = -1.5f; createSampler(&desc, &sampler.get()); } return sampler; diff --git a/core/rend/dx11/dx11context.cpp b/core/rend/dx11/dx11context.cpp index ae33c17d0..808efac00 100644 --- a/core/rend/dx11/dx11context.cpp +++ b/core/rend/dx11/dx11context.cpp @@ -25,7 +25,7 @@ #include "hw/pvr/Renderer_if.h" #include "emulator.h" #include "dx11_driver.h" -#include "imgui/backends/imgui_impl_dx11.h" +#include "imgui_impl_dx11.h" #include #include #ifdef TARGET_UWP @@ -64,6 +64,7 @@ bool DX11Context::init(bool keepCurrentWindow) ComPtr dxgiFactory6; ComPtr dxgiAdapter; HRESULT hr; + allowTearing = false; hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void **)&dxgiFactory.get()); if (SUCCEEDED(hr)) { @@ -71,6 +72,10 @@ bool DX11Context::init(bool keepCurrentWindow) if (dxgiFactory6) { dxgiFactory6->EnumAdapterByGpuPreference(0, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, __uuidof(IDXGIAdapter), (void **)&dxgiAdapter.get()); + UINT tearing; + if (SUCCEEDED(dxgiFactory6->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, + sizeof(tearing))) && tearing != 0) + allowTearing = true; dxgiFactory6.reset(); } } @@ -127,6 +132,8 @@ bool DX11Context::init(bool keepCurrentWindow) desc.BufferCount = 2; desc.SampleDesc.Count = 1; desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; + if (allowTearing) + desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; #ifdef TARGET_UWP desc.Width = settings.display.width; @@ -157,6 +164,8 @@ bool DX11Context::init(bool keepCurrentWindow) desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; + if (allowTearing) + desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; hr = dxgiFactory->CreateSwapChain(pDevice, &desc, &swapchain.get()); } @@ -221,33 +230,33 @@ void DX11Context::Present() frameRendered = false; bool swapOnVSync = !settings.input.fastForwardMode && config::VSync; HRESULT hr; - if (!swapchain) - { + if (!swapchain) { hr = DXGI_ERROR_DEVICE_RESET; } - else if (swapOnVSync) - { + else if (swapOnVSync) { int swapInterval = std::min(4, std::max(1, (int)(settings.display.refreshRate / 60))); hr = swapchain->Present(swapInterval, 0); } - else - { - hr = swapchain->Present(0, DXGI_PRESENT_DO_NOT_WAIT); + else { + hr = swapchain->Present(0, allowTearing ? DXGI_PRESENT_ALLOW_TEARING : DXGI_PRESENT_DO_NOT_WAIT); } - if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) - { + if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) { WARN_LOG(RENDERER, "Present failed: device removed/reset"); handleDeviceLost(); } - else if (hr != DXGI_ERROR_WAS_STILL_DRAWING && FAILED(hr)) + else if (hr != DXGI_ERROR_WAS_STILL_DRAWING && FAILED(hr)) { WARN_LOG(RENDERER, "Present failed %x", hr); + } } void DX11Context::EndImGuiFrame() { if (pDevice && pDeviceContext && renderTargetView) { - if (!overlayOnly) + if (overlayOnly) { + overlay.draw(settings.display.width, settings.display.height, config::FloatVMUs, true); + } + else { pDeviceContext->OMSetRenderTargets(1, &renderTargetView.get(), nullptr); const FLOAT black[4] { 0.f, 0.f, 0.f, 1.f }; @@ -255,15 +264,6 @@ void DX11Context::EndImGuiFrame() if (renderer != nullptr) renderer->RenderLastFrame(); } - if (overlayOnly) - { - if (crosshairsNeeded() || config::FloatVMUs) - overlay.draw(settings.display.width, settings.display.height, config::FloatVMUs, true); - } - else - { - overlay.draw(settings.display.width, settings.display.height, true, false); - } ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); } frameRendered = true; @@ -279,9 +279,9 @@ void DX11Context::resize() pDeviceContext->OMSetRenderTargets(1, &nullRTV, nullptr); renderTargetView.reset(); #ifdef TARGET_UWP - HRESULT hr = swapchain->ResizeBuffers(2, settings.display.width, settings.display.height, DXGI_FORMAT_R8G8B8A8_UNORM, 0); + HRESULT hr = swapchain->ResizeBuffers(2, settings.display.width, settings.display.height, DXGI_FORMAT_R8G8B8A8_UNORM, allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0); #else - HRESULT hr = swapchain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH); + HRESULT hr = swapchain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH | (allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0)); if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET) { handleDeviceLost(); diff --git a/core/rend/dx11/dx11context.h b/core/rend/dx11/dx11context.h index 8e8d909c0..260264545 100644 --- a/core/rend/dx11/dx11context.h +++ b/core/rend/dx11/dx11context.h @@ -55,6 +55,9 @@ class DX11Context : public GraphicsContext bool isIntel() const { return vendorId == VENDOR_INTEL; } + bool isAMD() override { + return vendorId == VENDOR_ATI || vendorId == VENDOR_AMD; + } void setFrameRendered() { frameRendered = true; @@ -83,6 +86,7 @@ class DX11Context : public GraphicsContext ComPtr renderTargetView; bool overlayOnly = false; DX11Overlay overlay; + bool allowTearing = false; bool swapOnVSync = false; bool frameRendered = false; std::string adapterDesc; @@ -97,6 +101,8 @@ class DX11Context : public GraphicsContext pD3DCompile d3dcompiler = nullptr; static constexpr UINT VENDOR_INTEL = 0x8086; + static constexpr UINT VENDOR_ATI = 0x1002; + static constexpr UINT VENDOR_AMD = 0x1022; }; extern DX11Context theDX11Context; #endif diff --git a/core/rend/dx11/dx11context_lr.cpp b/core/rend/dx11/dx11context_lr.cpp index feedec653..f2358b2fd 100644 --- a/core/rend/dx11/dx11context_lr.cpp +++ b/core/rend/dx11/dx11context_lr.cpp @@ -132,6 +132,8 @@ ComPtr& DX11Context::getRenderTarget(int width, int heig void DX11Context::presentFrame(ComPtr& textureView, int width, int height) { + ID3D11ShaderResourceView *nullSRView = nullptr; + pDeviceContext->PSSetShaderResources(0, 1, &nullSRView); ComPtr renderTarget = getRenderTarget(width, height); pDeviceContext->OMSetRenderTargets(1, &renderTarget.get(), nullptr); @@ -160,7 +162,11 @@ void DX11Context::presentFrame(ComPtr& textureView, in ID3D11RenderTargetView *nullView = nullptr; pDeviceContext->OMSetRenderTargets(1, &nullView, nullptr); - pDeviceContext->PSSetShaderResources(0, 1, &this->textureView.get()); +} + +void DX11Context::present() +{ + pDeviceContext->PSSetShaderResources(0, 1, &textureView.get()); } #endif diff --git a/core/rend/dx11/dx11context_lr.h b/core/rend/dx11/dx11context_lr.h index 00d5ffa0d..cf5a87921 100644 --- a/core/rend/dx11/dx11context_lr.h +++ b/core/rend/dx11/dx11context_lr.h @@ -35,6 +35,7 @@ class DX11Context : public GraphicsContext public: bool init(ID3D11Device *device, ID3D11DeviceContext *deviceContext, pD3DCompile D3DCompile, D3D_FEATURE_LEVEL featureLevel); void term() override; + void present(); const ComPtr& getDevice() const { return pDevice; } const ComPtr& getDeviceContext() const { return pDeviceContext; } @@ -50,6 +51,9 @@ class DX11Context : public GraphicsContext bool isIntel() const { return vendorId == VENDOR_INTEL; } + bool isAMD() override { + return vendorId == VENDOR_ATI || vendorId == VENDOR_AMD; + } DX11Shaders& getShaders() { return shaders; @@ -90,6 +94,8 @@ class DX11Context : public GraphicsContext bool supportedTexFormats[5] {}; // indexed by TextureType enum static constexpr UINT VENDOR_INTEL = 0x8086; + static constexpr UINT VENDOR_ATI = 0x1002; + static constexpr UINT VENDOR_AMD = 0x1022; }; extern DX11Context theDX11Context; #endif diff --git a/core/rend/dx11/oit/dx11_oitbuffers.h b/core/rend/dx11/oit/dx11_oitbuffers.h index c52b55515..86faa42c8 100644 --- a/core/rend/dx11/oit/dx11_oitbuffers.h +++ b/core/rend/dx11/oit/dx11_oitbuffers.h @@ -81,7 +81,12 @@ class Buffers desc.Format = DXGI_FORMAT_R32_UINT; desc.MipLevels = 1; - HRESULT hr = device->CreateTexture2D(&desc, nullptr, &abufferPointersTex.get()); + D3D11_SUBRESOURCE_DATA initialData{}; + initialData.SysMemPitch = this->width * sizeof(int); + initialData.pSysMem = malloc(initialData.SysMemPitch * this->height); + memset((void *)initialData.pSysMem, 0xff, initialData.SysMemPitch * this->height); + HRESULT hr = device->CreateTexture2D(&desc, &initialData, &abufferPointersTex.get()); + free((void *)initialData.pSysMem); if (FAILED(hr)) { WARN_LOG(RENDERER, "A-buffer texture creation failed: %x", hr); diff --git a/core/rend/dx11/oit/dx11_oitrenderer.cpp b/core/rend/dx11/oit/dx11_oitrenderer.cpp index 0267c1301..faaa430a9 100644 --- a/core/rend/dx11/oit/dx11_oitrenderer.cpp +++ b/core/rend/dx11/oit/dx11_oitrenderer.cpp @@ -96,39 +96,52 @@ struct DX11OITRenderer : public DX11Renderer return success; } - void resize(int w, int h) override + void resizeInternal(u32 width, u32 height) { - if (w == (int)width && h == (int)height && opaqueTex != nullptr) - return; - DX11Renderer::resize(w, h); - buffers.resize(w, h); + if (width > maxWidth || height > maxHeight || opaqueTex == nullptr) + { + maxWidth = std::max(maxWidth, width); + maxHeight = std::max(maxHeight, height); + buffers.resize(maxWidth, maxHeight); + + createTexAndRenderTarget(opaqueTex, opaqueRenderTarget, maxWidth, maxHeight); + multipassTex.reset(); + multipassRenderTarget.reset(); + multipassTextureView.reset(); + opaqueTextureView.reset(); + D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc{}; + viewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + viewDesc.Texture2D.MipLevels = 1; + device->CreateShaderResourceView(opaqueTex, &viewDesc, &opaqueTextureView.get()); + + // For depth pass. Use a 32-bit format for depth to avoid loss of precision + createDepthTexAndView(depthStencilTex2, depthStencilView2, maxWidth, maxHeight, DXGI_FORMAT_R32G8X24_TYPELESS, D3D11_BIND_SHADER_RESOURCE); + stencilView.reset(); + viewDesc.Format = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; + device->CreateShaderResourceView(depthStencilTex2, &viewDesc, &stencilView.get()); + + depthView.reset(); + viewDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; + device->CreateShaderResourceView(depthStencilTex2, &viewDesc, &depthView.get()); + + createDepthTexAndView(depthTex, depthTexView, maxWidth, maxHeight, DXGI_FORMAT_R32G8X24_TYPELESS); + } + else if (!depthTex) + createDepthTexAndView(depthTex, depthTexView, maxWidth, maxHeight, DXGI_FORMAT_R32G8X24_TYPELESS); + } - createTexAndRenderTarget(opaqueTex, opaqueRenderTarget, width, height); - multipassTex.reset(); - multipassRenderTarget.reset(); - multipassTextureView.reset(); - opaqueTextureView.reset(); - D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc{}; - viewDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - viewDesc.Texture2D.MipLevels = 1; - device->CreateShaderResourceView(opaqueTex, &viewDesc, &opaqueTextureView.get()); - - // For depth pass. Use a 32-bit format for depth to avoid loss of precision - createDepthTexAndView(depthStencilTex2, depthStencilView2, width, height, DXGI_FORMAT_R32G8X24_TYPELESS, D3D11_BIND_SHADER_RESOURCE); - stencilView.reset(); - viewDesc.Format = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; - device->CreateShaderResourceView(depthStencilTex2, &viewDesc, &stencilView.get()); - - depthView.reset(); - viewDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; - device->CreateShaderResourceView(depthStencilTex2, &viewDesc, &depthView.get()); - - createDepthTexAndView(depthTex, depthTexView, width, height, DXGI_FORMAT_R32G8X24_TYPELESS); + void resize(int width, int height) override + { + DX11Renderer::resize(width, height); + depthTexView.reset(); + depthTex.reset(); + resizeInternal(width, height); } - void setRTTSize(int width, int height) override { - buffers.resize(width, height); + void setRTTSize(int width, int height) override + { + resizeInternal(width, height); } void Term() override @@ -144,6 +157,7 @@ struct DX11OITRenderer : public DX11Renderer opaqueTex.reset(); shaders.term(); buffers.term(); + maxWidth = maxHeight = 0; DX11Renderer::Term(); } @@ -165,8 +179,17 @@ struct DX11OITRenderer : public DX11Renderer constants.trilinearAlpha = 1.f; int clip_rect[4] = {}; - TileClipping clipmode = GetTileClip(gp->tileclip, matrices.GetViewportMatrix(), clip_rect); - bool gpuPalette = gp->texture != nullptr ? gp->texture->gpuPalette : false; + TileClipping clipmode = setTileClip(gp->tileclip, clip_rect); + int gpuPalette = gp->texture == nullptr || !gp->texture->gpuPalette ? 0 + : gp->tsp.FilterMode + 1; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + } + // Two volumes mode only supported for OP and PT bool two_volumes_mode = (gp->tsp1.full != (u32)-1) && Type != ListType_Translucent; bool useTexture; @@ -188,7 +211,6 @@ struct DX11OITRenderer : public DX11Renderer gp->pcw.Gouraud, useTexture, clipmode == TileClipping::Inside, - false, two_volumes_mode, pass); } @@ -212,14 +234,13 @@ struct DX11OITRenderer : public DX11Renderer gp->pcw.Gouraud, Type == ListType_Punch_Through, clipmode == TileClipping::Inside, - gp->pcw.Texture && gp->tsp.FilterMode == 0 && !gp->tsp.ClampU && !gp->tsp.ClampV && !gp->tsp.FlipU && !gp->tsp.FlipV, two_volumes_mode, pass); } deviceContext->PSSetShader(pixelShader, nullptr, 0); - if (gpuPalette) + if (gpuPalette != 0) { if (gp->tcw.PixelFmt == PixelPal4) constants.paletteIndex = (float)(gp->tcw.PalSelect << 4); @@ -227,21 +248,12 @@ struct DX11OITRenderer : public DX11Renderer constants.paletteIndex = (float)((gp->tcw.PalSelect >> 4) << 8); } - if (clipmode == TileClipping::Outside) + if (clipmode == TileClipping::Inside) { - RECT rect { clip_rect[0], clip_rect[1], clip_rect[0] + clip_rect[2], clip_rect[1] + clip_rect[3] }; - deviceContext->RSSetScissorRects(1, &rect); - } - else - { - deviceContext->RSSetScissorRects(1, &scissorRect); - if (clipmode == TileClipping::Inside) - { - constants.clipTest[0] = (float)clip_rect[0]; - constants.clipTest[1] = (float)clip_rect[1]; - constants.clipTest[2] = (float)(clip_rect[0] + clip_rect[2]); - constants.clipTest[3] = (float)(clip_rect[1] + clip_rect[3]); - } + constants.clipTest[0] = (float)clip_rect[0]; + constants.clipTest[1] = (float)clip_rect[1]; + constants.clipTest[2] = (float)(clip_rect[0] + clip_rect[2]); + constants.clipTest[3] = (float)(clip_rect[1] + clip_rect[3]); } constants.blend_mode0[0] = gp->tsp.SrcInstr; constants.blend_mode0[1] = gp->tsp.DstInstr; @@ -272,13 +284,9 @@ struct DX11OITRenderer : public DX11Renderer } if (pass == DX11OITShaders::Color) - { // Apparently punch-through polys support blending, or at least some combinations - if (Type == ListType_Translucent || Type == ListType_Punch_Through) - deviceContext->OMSetBlendState(blendStates.getState(true, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); - else - deviceContext->OMSetBlendState(blendStates.getState(false, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); - } + deviceContext->OMSetBlendState(blendStates.getState(true, gp->tsp.SrcInstr, gp->tsp.DstInstr), nullptr, 0xffffffff); + if (useTexture) { for (int i = 0; i < 2; i++) @@ -290,13 +298,15 @@ struct DX11OITRenderer : public DX11Renderer deviceContext->PSSetShaderResources(slot, 1, &texture->textureView.get()); TSP tsp = i == 0 ? gp->tsp : gp->tsp1; bool linearFiltering; - if (config::TextureFiltering == 0) - linearFiltering = tsp.FilterMode != 0 && !gpuPalette; + if (gpuPalette != 0) + linearFiltering = false; + else if (config::TextureFiltering == 0) + linearFiltering = tsp.FilterMode != 0; else if (config::TextureFiltering == 1) linearFiltering = false; else linearFiltering = true; - auto sampler = samplers->getSampler(linearFiltering, tsp.ClampU, tsp.ClampV, tsp.FlipU, tsp.FlipV); + auto sampler = samplers->getSampler(linearFiltering, tsp.ClampU, tsp.ClampV, tsp.FlipU, tsp.FlipV, Type == ListType_Punch_Through); deviceContext->PSSetSamplers(slot, 1, &sampler.get()); } } @@ -305,7 +315,7 @@ struct DX11OITRenderer : public DX11Renderer //set Z mode, only if required int zfunc; - if (Type == ListType_Punch_Through || (pass == DX11OITShaders::Depth && SortingEnabled)) + if (Type == ListType_Punch_Through || SortingEnabled) zfunc = 6; // GEQ else zfunc = gp->isp.DepthMode; @@ -452,7 +462,7 @@ struct DX11OITRenderer : public DX11Renderer deviceContext->IASetInputLayout(finalInputLayout); deviceContext->VSSetShader(shaders.getFinalVertexShader(), nullptr, 0); - deviceContext->PSSetShader(shaders.getFinalShader(), nullptr, 0); + deviceContext->PSSetShader(shaders.getFinalShader(dithering && lastPass), nullptr, 0); deviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); deviceContext->Draw(4, 0); @@ -512,9 +522,16 @@ struct DX11OITRenderer : public DX11Renderer buffers.bind(); deviceContext->ClearDepthStencilView(depthTexView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.f, 0); deviceContext->ClearDepthStencilView(depthStencilView2, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.f, 0); + if (pvrrc.clearFramebuffer && !pvrrc.isRTT) + { + float colors[4]; + VO_BORDER_COL.getRGBColor(colors); + colors[3] = 1.f; + deviceContext->ClearRenderTargetView(opaqueRenderTarget, colors); + } RenderPass previous_pass {}; - int render_pass_count = (int)pvrrc.render_passes.size(); + const int render_pass_count = (int)pvrrc.render_passes.size(); for (int render_pass = 0; render_pass < render_pass_count; render_pass++) { const RenderPass& current_pass = pvrrc.render_passes[render_pass]; @@ -549,13 +566,13 @@ struct DX11OITRenderer : public DX11Renderer drawList(pvrrc.global_param_op, previous_pass.op_count, op_count); drawList(pvrrc.global_param_pt, previous_pass.pt_count, pt_count); + deviceContext->PSSetShaderResources(4, 1, &nullView); // // PASS 3: Render TR to a-buffers // if (current_pass.autosort) { - deviceContext->PSSetShaderResources(4, 1, &nullView); deviceContext->OMSetRenderTargetsAndUnorderedAccessViews(1, &opaqueRenderTarget.get(), depthTexView, 0, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr); deviceContext->PSSetShaderResources(4, 1, &depthView.get()); // disable color writes @@ -563,14 +580,6 @@ struct DX11OITRenderer : public DX11Renderer drawList(pvrrc.global_param_tr, previous_pass.tr_count, tr_count); // unbind depth tex deviceContext->PSSetShaderResources(4, 1, &nullView); - if (render_pass < render_pass_count - 1) - { - // - // PASS 3b: Geometry pass with TR to update the depth for the next TA render pass - // - deviceContext->OMSetRenderTargetsAndUnorderedAccessViews(1, &opaqueRenderTarget.get(), depthStencilView2, 0, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr); - drawList(pvrrc.global_param_tr, previous_pass.tr_count, tr_count); - } if (!theDX11Context.isIntel()) { // Intel Iris Plus 640 just crashes @@ -582,12 +591,20 @@ struct DX11OITRenderer : public DX11Renderer } else { - deviceContext->PSSetShaderResources(4, 1, &nullView); + deviceContext->OMSetRenderTargetsAndUnorderedAccessViews(1, &opaqueRenderTarget.get(), depthTexView, 0, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr); drawList(pvrrc.global_param_tr, previous_pass.tr_count, tr_count); } if (render_pass < render_pass_count - 1) { // + // PASS 3b: Geometry pass with TR to update the depth for the next TA render pass + // + deviceContext->OMSetRenderTargetsAndUnorderedAccessViews(1, &opaqueRenderTarget.get(), depthStencilView2, 0, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr); + if (current_pass.autosort) + drawList(pvrrc.global_param_tr, previous_pass.tr_count, tr_count); + else + drawList(pvrrc.global_param_tr, previous_pass.tr_count, tr_count); + // // PASS 3c: Render a-buffer to temporary texture // if (!multipassTex) @@ -623,6 +640,7 @@ struct DX11OITRenderer : public DX11Renderer bool Render() override { + resetContextState(); bool is_rtt = pvrrc.isRTT; if (!is_rtt) @@ -666,7 +684,8 @@ struct DX11OITRenderer : public DX11Renderer #ifndef LIBRETRO deviceContext->OMSetRenderTargets(1, &theDX11Context.getRenderTarget().get(), nullptr); displayFramebuffer(); - DrawOSD(false); + drawOSD(); + renderVideoRouting(); theDX11Context.setFrameRendered(); #else ID3D11RenderTargetView *nullView = nullptr; @@ -675,6 +694,7 @@ struct DX11OITRenderer : public DX11Renderer #endif frameRendered = true; frameRenderedOnce = true; + clearLastFrame = false; } return !is_rtt; @@ -700,6 +720,8 @@ struct DX11OITRenderer : public DX11Renderer ComPtr finalInputLayout; ComPtr vtxPolyConstants; int64_t pixelBufferSize = 0; + u32 maxWidth = 0; + u32 maxHeight = 0; }; Renderer *rend_OITDirectX11() diff --git a/core/rend/dx11/oit/dx11_oitshaders.cpp b/core/rend/dx11/oit/dx11_oitshaders.cpp index c8e4a66bc..170acff8e 100644 --- a/core/rend/dx11/oit/dx11_oitshaders.cpp +++ b/core/rend/dx11/oit/dx11_oitshaders.cpp @@ -20,6 +20,8 @@ #include "../dx11context.h" #include "../dx11_naomi2.h" +extern const char * const PixelShaderCommon; + const char * const VertexShader = R"( #if pp_Gouraud == 1 #define INTERPOLATION @@ -114,6 +116,7 @@ cbuffer constantBuffer : register(b0) float4 colorClampMax; float4 FOG_COL_VERT; float4 FOG_COL_RAM; + float4 ditherColorMax; float fogDensity; float shadowScale; float alphaTestValue; @@ -145,7 +148,7 @@ float getFragDepth(float z) #else float w = 100000.0 * z; #endif - return log2(1.0 + w) / 34.0; + return log2(1.0 + max(w, -0.999999f)) / 34.0; } struct PolyParam { @@ -274,13 +277,6 @@ const char * const PixelShader = R"( #include "oit_header.hlsl" -#if pp_Gouraud == 1 -#define INTERPOLATION -#else -#define INTERPOLATION nointerpolation -#endif - -#define PI 3.1415926f #define PASS_DEPTH 0 #define PASS_COLOR 1 #define PASS_OIT 2 @@ -291,29 +287,9 @@ const char * const PixelShader = R"( #define IF(x) #endif -struct VertexIn -{ - float4 pos : SV_POSITION; - float4 uv : TEXCOORD0; - INTERPOLATION float4 col : COLOR0; - INTERPOLATION float4 spec : COLOR1; - float2 uv1 : TEXCOORD1; - INTERPOLATION float4 col1 : COLOR2; - INTERPOLATION float4 spec1 : COLOR3; - nointerpolation uint index : BLENDINDICES0; -}; - -Texture2D texture0 : register(t0); -sampler sampler0 : register(s0); Texture2D texture1 : register(t3); sampler sampler1 : register(s3); -Texture2D paletteTexture : register(t1); -sampler paletteSampler : register(s1); - -Texture2D fogTexture : register(t2); -sampler fogSampler : register(s2); - #if PASS == PASS_COLOR Texture2D stencilTexture : register(t4); #endif @@ -340,41 +316,19 @@ cbuffer polyConstantBuffer : register(b1) int ignore_tex_alpha1; }; -float fog_mode2(float w) -{ - float z = clamp( -#if DIV_POS_Z == 1 - fogDensity / w -#else - fogDensity * w -#endif - , 1.0f, 255.9999f); - float exp = floor(log2(z)); - float m = z * 16.0f / pow(2.0, exp) - 16.0f; - float idx = floor(m) + exp * 16.0f + 0.5f; - float4 fogCoef = fogTexture.Sample(fogSampler, float2(idx / 128.0f, 0.75f - (m - floor(m)) / 2.0f)); - return fogCoef.a; -} +#include "pixel_common.hlsl" -float4 clampColor(float4 color) -{ -#if FogClamping == 1 - return clamp(color, colorClampMin, colorClampMax); -#else - return color; -#endif -} - -#if pp_Palette == 1 - -float4 palettePixel(Texture2D tex, sampler texSampler, float2 coords) +struct VertexIn { - uint colorIdx = int(floor(tex.Sample(texSampler, coords).a * 255.0f + 0.5f) + paletteIndex); - float2 c = float2((fmod(float(colorIdx), 32.0f) * 2.0f + 1.0f) / 64.0f, (float(colorIdx / 32) * 2.0f + 1.0f) / 64.0f); - return paletteTexture.Sample(paletteSampler, c); -} - -#endif + float4 pos : SV_POSITION; + float4 uv : TEXCOORD0; + INTERPOLATION float4 col : COLOR0; + INTERPOLATION float4 spec : COLOR1; + float2 uv1 : TEXCOORD1; + INTERPOLATION float4 col1 : COLOR2; + INTERPOLATION float4 spec1 : COLOR3; + nointerpolation uint index : BLENDINDICES0; +}; struct PSO { @@ -448,23 +402,24 @@ PSO main(in VertexIn inpix) uv /= inpix.uv.w; #endif - #if NearestWrapFix == 1 - uv = min(fmod(uv, 1.f), 0.9997f); - #endif float4 texcol; #if pp_TwoVolumes == 1 if (area1) #if pp_Palette == 0 texcol = texture1.Sample(sampler1, uv); - #else + #elif pp_Palette == 1 texcol = palettePixel(texture1, sampler1, uv); + #else + texcol = palettePixelBilinear(texture1, sampler1, uv); #endif else #endif #if pp_Palette == 0 texcol = texture0.Sample(sampler0, uv); - #else + #elif pp_Palette == 1 texcol = palettePixel(texture0, sampler0, uv); + #else + texcol = palettePixelBilinear(texture0, sampler0, uv); #endif #if pp_BumpMap == 1 float s = PI / 2.0f * (texcol.a * 15.0f * 16.0f + texcol.r * 15.0f) / 255.0f; @@ -476,11 +431,6 @@ PSO main(in VertexIn inpix) IF(cur_ignore_tex_alpha) texcol.a = 1.0f; #endif - #if cp_AlphaTest == 1 - if (alphaTestValue > texcol.a) - discard; - texcol.a = 1.0f; - #endif #endif #if pp_ShadInstr == 0 || pp_TwoVolumes == 1 // DECAL IF(cur_shading_instr == 0) @@ -524,6 +474,13 @@ PSO main(in VertexIn inpix) color *= trilinearAlpha; + #if cp_AlphaTest == 1 + color.a = round(color.a * 255.0f) * 0.0039215688593685626983642578125; // 1 / 255 + if (alphaTestValue > color.a) + discard; + color.a = 1.0f; + #endif + #if PASS == PASS_COLOR pso.col = color; #elif PASS == PASS_OIT @@ -693,6 +650,19 @@ float4 resolveAlphaBlend(in float2 pos) else finalColor = result; } +#if DITHERING == 1 + static const float ditherTable[16] = { + 0.9375f, 0.1875f, 0.75f, 0.0f, + 0.4375f, 0.6875f, 0.25f, 0.5f, + 0.8125f, 0.0625f, 0.875f, 0.125f, + 0.3125f, 0.5625f, 0.375f, 0.625f + }; + float r = ditherTable[int(pos.y % 4.0f) * 4 + int(pos.x % 4.0f)] + 0.03125f; // why is this bias needed?? + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + finalColor += r / ditherColorMax; + // avoid rounding + finalColor = floor(finalColor * 255.0f) / 255.0f; +#endif return finalColor; } @@ -780,14 +750,19 @@ void main(in MVPixel inpix) } )"; -struct IncludeManager : public ID3DInclude +struct OITIncludeManager : public ID3DInclude { HRESULT STDMETHODCALLTYPE Open(D3D_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) override { + const char *src = nullptr; if (!strcmp(pFileName, "oit_header.hlsl")) + src = OITShaderHeader; + else if (!strcmp(pFileName, "pixel_common.hlsl")) + src = PixelShaderCommon; + if (src != nullptr) { - *ppData = OITShaderHeader; - *pBytes = (UINT)strlen(OITShaderHeader); + *ppData = src; + *pBytes = (UINT)strlen(src); return S_OK; } return E_FAIL; @@ -806,6 +781,7 @@ enum VertexMacroEnum { MacroDivPosZ, MacroPositionOnly, MacroLightOn, + MacroModifierVolume, }; static D3D_SHADER_MACRO VertexMacros[] @@ -815,6 +791,7 @@ static D3D_SHADER_MACRO VertexMacros[] { "DIV_POS_Z", "0" }, { "POSITION_ONLY", "0" }, { "LIGHT_ON", "1" }, + { "MODIFIER_VOLUME", "0" }, { nullptr, nullptr } }; @@ -830,7 +807,6 @@ enum PixelMacroEnum { MacroPalette, MacroAlphaTest, MacroClipInside, - MacroNearestWrapFix, MacroPass }; @@ -850,14 +826,13 @@ static D3D_SHADER_MACRO PixelMacros[] { "pp_Palette", "0" }, { "cp_AlphaTest", "0" }, { "pp_ClipInside", "0" }, - { "NearestWrapFix", "0" }, { "PASS", "0" }, { nullptr, nullptr } }; const ComPtr& DX11OITShaders::getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, - bool palette, bool gouraud, bool alphaTest, bool clipInside, bool nearestWrapFix, bool twoVolumes, Pass pass) + int palette, bool gouraud, bool alphaTest, bool clipInside, bool twoVolumes, Pass pass) { bool divPosZ = !settings.platform.isNaomi2() && config::NativeDepthInterpolation; const u32 hash = (int)pp_Texture @@ -868,11 +843,10 @@ const ComPtr& DX11OITShaders::getShader(bool pp_Texture, bool | (pp_FogCtrl << 6) | ((int)pp_BumpMap << 8) | ((int)fog_clamping << 9) - | ((int)palette << 10) - | ((int)gouraud << 11) - | ((int)alphaTest << 12) - | ((int)clipInside << 13) - | ((int)nearestWrapFix << 14) + | (palette << 10) + | ((int)gouraud << 12) + | ((int)alphaTest << 13) + | ((int)clipInside << 14) | ((int)twoVolumes << 15) | ((int)pass << 16) | ((int)divPosZ << 18); @@ -894,7 +868,6 @@ const ComPtr& DX11OITShaders::getShader(bool pp_Texture, bool PixelMacros[MacroPalette].Definition = MacroValues[palette]; PixelMacros[MacroAlphaTest].Definition = MacroValues[alphaTest]; PixelMacros[MacroClipInside].Definition = MacroValues[clipInside]; - PixelMacros[MacroNearestWrapFix].Definition = MacroValues[nearestWrapFix]; PixelMacros[MacroTwoVolumes].Definition = MacroValues[twoVolumes]; PixelMacros[MacroDivPosZ].Definition = MacroValues[divPosZ]; PixelMacros[MacroPass].Definition = MacroValues[pass]; @@ -929,6 +902,7 @@ const ComPtr& DX11OITShaders::getVertexShader(bool gouraud, VertexMacros[MacroPositionOnly].Definition = MacroValues[positionOnly]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[twoVolumes]; VertexMacros[MacroLightOn].Definition = MacroValues[lightOn]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[false]; std::string source(DX11N2VertexShader); if (!positionOnly && lightOn) source += std::string("\n") + DX11N2ColorShader; @@ -956,6 +930,7 @@ const ComPtr& DX11OITShaders::getMVVertexShader(bool naomi2) VertexMacros[MacroPositionOnly].Definition = MacroValues[true]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; VertexMacros[MacroLightOn].Definition = MacroValues[false]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[true]; mvVertexShader = compileVS(DX11N2VertexShader, "main", VertexMacros); } } @@ -976,26 +951,28 @@ const ComPtr& DX11OITShaders::getModVolShader() return modVolShader; } -const ComPtr& DX11OITShaders::getFinalShader() +const ComPtr& DX11OITShaders::getFinalShader(bool dithering) { if (maxLayers != config::PerPixelLayers) { - finalShader.reset(); + for (auto& shader : finalShaders) + shader.reset(); for (auto& shader : trModVolShaders) shader.reset(); maxLayers = config::PerPixelLayers; } - if (!finalShader) + if (!finalShaders[dithering]) { const std::string maxLayers{ std::to_string(config::PerPixelLayers) }; D3D_SHADER_MACRO macros[] { { "MAX_PIXELS_PER_FRAGMENT", maxLayers.c_str() }, + { "DITHERING", MacroValues[dithering] }, { } }; - finalShader = compilePS(OITFinalShaderSource, "main", macros); + finalShaders[dithering] = compilePS(OITFinalShaderSource, "main", macros); } - return finalShader; + return finalShaders[dithering]; } const ComPtr& DX11OITShaders::getFinalVertexShader() @@ -1010,7 +987,8 @@ const ComPtr& DX11OITShaders::getTrModVolShader(int type) { if (maxLayers != config::PerPixelLayers) { - finalShader.reset(); + for (auto& shader : finalShaders) + shader.reset(); for (auto& shader : trModVolShaders) shader.reset(); maxLayers = config::PerPixelLayers; @@ -1041,7 +1019,7 @@ ComPtr DX11OITShaders::compileShader(const char* source, const char* f if (!lookupShader(hash, shaderBlob)) { ComPtr errorBlob; - IncludeManager includeManager; + OITIncludeManager includeManager; if (FAILED(this->D3DCompile(source, strlen(source), nullptr, pDefines, &includeManager, function, profile, 0, 0, &shaderBlob.get(), &errorBlob.get()))) ERROR_LOG(RENDERER, "Shader compilation failed: %s", errorBlob->GetBufferPointer()); @@ -1084,6 +1062,7 @@ ComPtr DX11OITShaders::getVertexShaderBlob() // FIXME code dup VertexMacros[MacroPositionOnly].Definition = MacroValues[false]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[true]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[false]; std::string source(DX11N2VertexShader); source += std::string("\n") + DX11N2ColorShader; return compileShader(source.c_str(), "main", "vs_5_0", VertexMacros); @@ -1095,6 +1074,7 @@ ComPtr DX11OITShaders::getMVVertexShaderBlob() VertexMacros[MacroGouraud].Definition = MacroValues[false]; VertexMacros[MacroPositionOnly].Definition = MacroValues[true]; VertexMacros[MacroTwoVolumes].Definition = MacroValues[false]; + VertexMacros[MacroModifierVolume].Definition = MacroValues[true]; return compileShader(DX11N2VertexShader, "main", "vs_5_0", VertexMacros); } diff --git a/core/rend/dx11/oit/dx11_oitshaders.h b/core/rend/dx11/oit/dx11_oitshaders.h index cd05f924d..5f7ad67f5 100644 --- a/core/rend/dx11/oit/dx11_oitshaders.h +++ b/core/rend/dx11/oit/dx11_oitshaders.h @@ -34,11 +34,11 @@ class DX11OITShaders : CachedDX11Shaders const ComPtr& getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, - bool palette, bool gouraud, bool alphaTest, bool clipInside, bool nearestWrapFix, bool twoVolumes, Pass pass); + int palette, bool gouraud, bool alphaTest, bool clipInside, bool twoVolumes, Pass pass); const ComPtr& getVertexShader(bool gouraud, bool naomi2, bool positionOnly, bool lightOn, bool twoVolumes = true); const ComPtr& getModVolShader(); const ComPtr& getMVVertexShader(bool naomi2); - const ComPtr& getFinalShader(); + const ComPtr& getFinalShader(bool dithering); const ComPtr& getTrModVolShader(int type); const ComPtr& getFinalVertexShader(); @@ -53,7 +53,8 @@ class DX11OITShaders : CachedDX11Shaders shader.reset(); for (auto& shader : trModVolShaders) shader.reset(); - finalShader.reset(); + for (auto& shader : finalShaders) + shader.reset(); clearShader.reset(); finalVertexShader.reset(); device.reset(); @@ -74,7 +75,7 @@ class DX11OITShaders : CachedDX11Shaders ComPtr modVolVertexShaders[4]; ComPtr trModVolShaders[16]; - ComPtr finalShader; + ComPtr finalShaders[2]; ComPtr clearShader; ComPtr finalVertexShader; pD3DCompile D3DCompile = nullptr; diff --git a/core/rend/dx9/d3d_overlay.cpp b/core/rend/dx9/d3d_overlay.cpp index a8bf76493..4dc527b7a 100644 --- a/core/rend/dx9/d3d_overlay.cpp +++ b/core/rend/dx9/d3d_overlay.cpp @@ -20,7 +20,6 @@ #include "rend/osd.h" #include #include -#include void D3DOverlay::drawQuad(const RECT& rect, D3DCOLOR color) { @@ -51,8 +50,9 @@ void D3DOverlay::draw(u32 width, u32 height, bool vmu, bool crosshair) texture.reset(); continue; } - if (texture == nullptr || vmu_lcd_changed[i]) + if (texture == nullptr || this->vmuLastChanged[i] != ::vmuLastChanged[i]) { + texture.reset(); device->CreateTexture(48, 32, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture.get(), 0); D3DLOCKED_RECT rect; if (SUCCEEDED(texture->LockRect(0, &rect, nullptr, 0))) @@ -61,8 +61,8 @@ void D3DOverlay::draw(u32 width, u32 height, bool vmu, bool crosshair) for (int y = 0; y < 32; y++) memcpy(dst + y * rect.Pitch, vmu_lcd_data[i] + (31 - y) * 48, 48 * 4); texture->UnlockRect(0); + this->vmuLastChanged[i] = ::vmuLastChanged[i]; } - vmu_lcd_changed[i] = false; } float x; if (i & 2) @@ -89,35 +89,32 @@ void D3DOverlay::draw(u32 width, u32 height, bool vmu, bool crosshair) } if (crosshair) { - if (!xhairTexture) + for (u32 i = 0; i < config::CrosshairColor.size(); i++) { - const u32* texData = getCrosshairTextureData(); - device->CreateTexture(16, 16, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &xhairTexture.get(), 0); - D3DLOCKED_RECT rect; - if (SUCCEEDED(xhairTexture->LockRect(0, &rect, nullptr, 0))) + if (!crosshairNeeded(i)) + continue; + + if (!xhairTexture) { - if (rect.Pitch == 16 * sizeof(u32)) - memcpy(rect.pBits, texData, 16 * 16 * sizeof(u32)); - else + const u32* texData = getCrosshairTextureData(); + device->CreateTexture(16, 16, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &xhairTexture.get(), 0); + D3DLOCKED_RECT rect; + if (SUCCEEDED(xhairTexture->LockRect(0, &rect, nullptr, 0))) { - u8 *dst = (u8 *) rect.pBits; - for (int y = 0; y < 16; y++) - memcpy(dst + y * rect.Pitch, texData + y * 16, 16 * sizeof(u32)); + if (rect.Pitch == 16 * sizeof(u32)) + memcpy(rect.pBits, texData, 16 * 16 * sizeof(u32)); + else + { + u8 *dst = (u8 *) rect.pBits; + for (int y = 0; y < 16; y++) + memcpy(dst + y * rect.Pitch, texData + y * 16, 16 * sizeof(u32)); + } + xhairTexture->UnlockRect(0); } - xhairTexture->UnlockRect(0); } - } - device->SetTexture(0, xhairTexture); - for (u32 i = 0; i < config::CrosshairColor.size(); i++) - { - if (config::CrosshairColor[i] == 0) - continue; - if (settings.platform.isConsole() - && config::MapleMainDevices[i] != MDT_LightGun) - continue; - + device->SetTexture(0, xhairTexture); auto [x, y] = getCrosshairPosition(i); - float halfWidth = XHAIR_WIDTH * settings.display.uiScale / 2.f; + float halfWidth = config::CrosshairSize * settings.display.uiScale / 2.f; RECT rect { (long) (x - halfWidth), (long) (y - halfWidth), (long) (x + halfWidth), (long) (y + halfWidth) }; D3DCOLOR color = (config::CrosshairColor[i] & 0xFF00FF00) | ((config::CrosshairColor[i] >> 16) & 0xFF) diff --git a/core/rend/dx9/d3d_overlay.h b/core/rend/dx9/d3d_overlay.h index 8288cdf76..3852de40e 100644 --- a/core/rend/dx9/d3d_overlay.h +++ b/core/rend/dx9/d3d_overlay.h @@ -28,6 +28,7 @@ class D3DOverlay public: void init(const ComPtr& device) { this->device = device; + vmuLastChanged.fill({}); } void term() { @@ -45,11 +46,12 @@ class D3DOverlay struct Vertex { - float pos[3]; - float uv[2]; + float pos[3]; + float uv[2]; }; ComPtr device; ComPtr xhairTexture; std::array, 8> vmuTextures; + std::array vmuLastChanged {}; }; diff --git a/core/rend/dx9/d3d_renderer.cpp b/core/rend/dx9/d3d_renderer.cpp index e69dae12d..7d2e55028 100644 --- a/core/rend/dx9/d3d_renderer.cpp +++ b/core/rend/dx9/d3d_renderer.cpp @@ -19,8 +19,7 @@ #include "d3d_renderer.h" #include "hw/pvr/ta.h" #include "hw/pvr/pvr_mem.h" -#include "rend/tileclip.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "rend/sorter.h" const u32 DstBlendGL[] @@ -130,7 +129,7 @@ bool D3DRenderer::Init() device = theDXContext.getDevice(); devCache.setDevice(device); - bool success = ensureVertexBufferSize(vertexBuffer, vertexBufferSize, 4 * 1024 * 1024); + bool success = ensureVertexBufferSize(vertexBuffer, vertexBufferSize, 4_MB); success &= ensureIndexBufferSize(indexBuffer, indexBufferSize, 120 * 1024 * 4); success &= SUCCEEDED(device->CreateVertexDeclaration(MainVtxElement, &mainVtxDecl.get())); @@ -140,8 +139,7 @@ bool D3DRenderer::Init() success &= (bool)shaders.getVertexShader(true); success &= SUCCEEDED(device->CreateTexture(32, 32, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &paletteTexture.get(), 0)); success &= SUCCEEDED(device->CreateTexture(128, 2, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, &fogTexture.get(), 0)); - fog_needs_update = true; - forcePaletteUpdate(); + updateFogTable = true; if (!success) { @@ -189,7 +187,7 @@ void D3DRenderer::postReset() width = 0; height = 0; resize(w, h); - bool rc = ensureVertexBufferSize(vertexBuffer, vertexBufferSize, 4 * 1024 * 1024); + bool rc = ensureVertexBufferSize(vertexBuffer, vertexBufferSize, 4_MB); verify(rc); rc = ensureIndexBufferSize(indexBuffer, indexBufferSize, 120 * 1024 * 4); verify(rc); @@ -201,8 +199,8 @@ void D3DRenderer::postReset() verify(rc); rc = SUCCEEDED(device->CreateTexture(128, 2, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, &fogTexture.get(), 0)); verify(rc); - fog_needs_update = true; - forcePaletteUpdate(); + updateFogTable = true; + updatePalette = true; } void D3DRenderer::Term() @@ -276,6 +274,7 @@ void D3DRenderer::RenderFramebuffer(const FramebufferInfo& info) if (!dcfbTexture) { device->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &dcfbTexture.get(), 0); + dcfbSurface.reset(); dcfbTexture->GetSurfaceLevel(0, &dcfbSurface.get()); } @@ -296,15 +295,14 @@ void D3DRenderer::RenderFramebuffer(const FramebufferInfo& info) devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); device->ColorFill(framebufferSurface, 0, D3DCOLOR_ARGB(255, info.vo_border_col._red, info.vo_border_col._green, info.vo_border_col._blue)); - u32 bar = (this->width - this->height * 640 / 480) / 2; - RECT rd{ (LONG)bar, 0, (LONG)(this->width - bar), (LONG)this->height }; - device->StretchRect(dcfbSurface, nullptr, framebufferSurface, &rd, D3DTEXF_LINEAR); + device->StretchRect(dcfbSurface, nullptr, framebufferSurface, nullptr, D3DTEXF_LINEAR); aspectRatio = getDCFramebufferAspectRatio(); displayFramebuffer(); - DrawOSD(false); + drawOSD(); frameRendered = true; frameRenderedOnce = true; + clearLastFrame = false; theDXContext.setFrameRendered(); } @@ -318,8 +316,10 @@ void D3DRenderer::Process(TA_context* ctx) if (settings.platform.isNaomi2()) throw FlycastException("DirectX 9 doesn't support Naomi 2 games. Select a different graphics API"); - if (KillTex) + if (resetTextureCache) { texCache.Clear(); + resetTextureCache = false; + } texCache.Cleanup(); ta_parse(ctx, false); @@ -338,6 +338,25 @@ inline void D3DRenderer::setTexMode(D3DSAMPLERSTATETYPE state, u32 clamp, u32 mi } } +TileClipping D3DRenderer::setTileClip(u32 tileclip, int clip_rect[4]) +{ + TileClipping clipmode = GetTileClip(tileclip, matrices.GetViewportMatrix(), clip_rect); + if (clipmode == TileClipping::Outside) + { + devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); + RECT rect { clip_rect[0], clip_rect[1], clip_rect[0] + clip_rect[2], clip_rect[1] + clip_rect[3] }; + // TODO cache + device->SetScissorRect(&rect); + } + else + { + devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, scissorEnable); + if (scissorEnable) + device->SetScissorRect(&scissorRect); + } + return clipmode; +} + template void D3DRenderer::setGPState(const PolyParam *gp) { @@ -356,9 +375,17 @@ void D3DRenderer::setGPState(const PolyParam *gp) int fog_ctrl = config::Fog ? gp->tsp.FogCtrl : 2; int clip_rect[4] = {}; - TileClipping clipmode = GetTileClip(gp->tileclip, matrices.GetViewportMatrix(), clip_rect); + TileClipping clipmode = setTileClip(gp->tileclip, clip_rect); D3DTexture *texture = (D3DTexture *)gp->texture; - bool gpuPalette = texture != nullptr ? texture->gpuPalette : false; + int gpuPalette = texture == nullptr || !texture->gpuPalette ? 0 + : gp->tsp.FilterMode + 1; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + } devCache.SetPixelShader(shaders.getShader( gp->pcw.Texture, @@ -372,15 +399,18 @@ void D3DRenderer::setGPState(const PolyParam *gp) trilinear_alpha != 1.f, gpuPalette, gp->pcw.Gouraud, - clipmode == TileClipping::Inside)); + clipmode == TileClipping::Inside, + dithering)); if (trilinear_alpha != 1.f) { float f[4] { trilinear_alpha, 0, 0, 0 }; device->SetPixelShaderConstantF(5, f, 1); } - if (gpuPalette) + if (gpuPalette != 0) { + float textureSize[4] { (float)texture->width, (float)texture->height }; + device->SetPixelShaderConstantF(9, textureSize, 1); float paletteIndex[4]; if (gp->tcw.PixelFmt == PixelPal4) paletteIndex[0] = (float)(gp->tcw.PalSelect << 4); @@ -391,23 +421,10 @@ void D3DRenderer::setGPState(const PolyParam *gp) devCache.SetVertexShader(shaders.getVertexShader(gp->pcw.Gouraud)); devCache.SetRenderState(D3DRS_SHADEMODE, gp->pcw.Gouraud == 1 ? D3DSHADE_GOURAUD : D3DSHADE_FLAT); - if (clipmode == TileClipping::Outside) - { - devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); - RECT rect { clip_rect[0], clip_rect[1], clip_rect[0] + clip_rect[2], clip_rect[1] + clip_rect[3] }; - // TODO cache - device->SetScissorRect(&rect); - } - else + if (clipmode == TileClipping::Inside) { - devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, scissorEnable); - if (scissorEnable) - device->SetScissorRect(&scissorRect); - if (clipmode == TileClipping::Inside) - { - float f[] = { (float)clip_rect[0], (float)clip_rect[1], (float)(clip_rect[0] + clip_rect[2]), (float)(clip_rect[1] + clip_rect[3]) }; - device->SetPixelShaderConstantF(4, f, 1); - } + float f[] = { (float)clip_rect[0], (float)clip_rect[1], (float)(clip_rect[0] + clip_rect[2]), (float)(clip_rect[1] + clip_rect[3]) }; + device->SetPixelShaderConstantF(4, f, 1); } const u32 stencil = (gp->pcw.Shadow != 0) ? 0x80 : 0; @@ -422,8 +439,10 @@ void D3DRenderer::setGPState(const PolyParam *gp) //set texture filter mode bool linearFiltering; - if (config::TextureFiltering == 0) - linearFiltering = gp->tsp.FilterMode != 0 && !gpuPalette; + if (gpuPalette != 0) + linearFiltering = false; + else if (config::TextureFiltering == 0) + linearFiltering = gp->tsp.FilterMode != 0; else if (config::TextureFiltering == 1) linearFiltering = false; else @@ -441,17 +460,22 @@ void D3DRenderer::setGPState(const PolyParam *gp) //bilinear filtering devCache.SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); devCache.SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - devCache.SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // LINEAR for Trilinear filtering - devCache.SetSamplerState(0, D3DSAMP_MAXANISOTROPY, std::min(maxAnisotropy, (int)config::AnisotropicFiltering)); + if (Type == ListType_Punch_Through) { + devCache.SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT); + devCache.SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 1); + } + else { + devCache.SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); // LINEAR for Trilinear filtering + devCache.SetSamplerState(0, D3DSAMP_MAXANISOTROPY, std::min(maxAnisotropy, (int)config::AnisotropicFiltering)); + } } + float bias = -1.f; + devCache.SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, *(DWORD *)&bias); } // Apparently punch-through polys support blending, or at least some combinations - if (Type == ListType_Translucent || Type == ListType_Punch_Through) - { - devCache.SetRenderState(D3DRS_SRCBLEND, SrcBlendGL[gp->tsp.SrcInstr]); - devCache.SetRenderState(D3DRS_DESTBLEND, DstBlendGL[gp->tsp.DstInstr]); - } + devCache.SetRenderState(D3DRS_SRCBLEND, SrcBlendGL[gp->tsp.SrcInstr]); + devCache.SetRenderState(D3DRS_DESTBLEND, DstBlendGL[gp->tsp.DstInstr]); devCache.SetRenderState(D3DRS_CULLMODE, CullMode[gp->isp.CullMode]); @@ -673,6 +697,7 @@ void D3DRenderer::drawModVols(int first, int count) devCache.SetRenderState(D3DRS_COLORWRITEENABLE, 0); int mod_base = -1; + int clip_rect[4] = {}; for (int cmv = 0; cmv < count; cmv++) { @@ -691,6 +716,9 @@ void D3DRenderer::drawModVols(int first, int count) else setMVS_Mode(Xor, param.isp); // XOR'ing (closed volume) + setTileClip(param.tileclip, clip_rect); + //TODO inside clipping + device->DrawPrimitive(D3DPT_TRIANGLELIST, param.first * 3, param.count); if (mv_mode == 1 || mv_mode == 2) @@ -705,6 +733,7 @@ void D3DRenderer::drawModVols(int first, int count) devCache.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); //enable color writes devCache.SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE); + setTileClip(0, clip_rect); //black out any stencil with '1' devCache.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); @@ -760,11 +789,10 @@ void D3DRenderer::drawStrips() { devCache.SetRenderState(D3DRS_STENCILENABLE, FALSE); } - devCache.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + devCache.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); drawList(pvrrc.global_param_op, previous_pass.op_count, op_count); - devCache.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); devCache.SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); devCache.SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); devCache.SetRenderState(D3DRS_ALPHAREF, PT_ALPHA_REF & 0xFF); @@ -841,10 +869,10 @@ void D3DRenderer::setBaseScissor() } else { - fWidth = (float)(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1); - fHeight = (float)(pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1); - min_x = (float)pvrrc.fb_X_CLIP.min; - min_y = (float)pvrrc.fb_Y_CLIP.min; + min_x = (float)pvrrc.getFramebufferMinX(); + min_y = (float)pvrrc.getFramebufferMinY(); + fWidth = (float)pvrrc.getFramebufferWidth() - min_x; + fHeight = (float)pvrrc.getFramebufferHeight() - min_y; if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) { min_x *= config::RenderResolution / 480.f; @@ -868,7 +896,7 @@ void D3DRenderer::setBaseScissor() } } -void D3DRenderer::prepareRttRenderTarget(u32 texAddress) +void D3DRenderer::prepareRttRenderTarget(u32 texAddress, int& vpWidth, int& vpHeight) { u32 fbw = pvrrc.getFramebufferWidth(); u32 fbh = pvrrc.getFramebufferHeight(); @@ -885,6 +913,22 @@ void D3DRenderer::prepareRttRenderTarget(u32 texAddress) rttTexture->GetSurfaceLevel(0, &rttSurface.get()); device->SetRenderTarget(0, rttSurface); + if (fbw2 > width || fbh2 > height || !depthSurface) + { + if (depthSurface) + { + D3DSURFACE_DESC desc; + depthSurface->GetDesc(&desc); + if (fbw2 > desc.Width || fbh2 > desc.Height) + depthSurface.reset(); + } + if (!depthSurface) + { + HRESULT rc = SUCCEEDED(device->CreateDepthStencilSurface(std::max(fbw2, width), std::max(fbh2, height), D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, TRUE, &depthSurface.get(), nullptr)); + verify(rc); + } + } + D3DVIEWPORT9 viewport; viewport.X = viewport.Y = 0; viewport.Width = fbw; @@ -892,6 +936,8 @@ void D3DRenderer::prepareRttRenderTarget(u32 texAddress) viewport.MinZ = 0; viewport.MaxZ = 1; device->SetViewport(&viewport); + vpWidth = fbw; + vpHeight = fbh; } void D3DRenderer::readRttRenderTarget(u32 texAddress) @@ -958,13 +1004,16 @@ bool D3DRenderer::Render() bool rc = SUCCEEDED(device->GetRenderTarget(0, &backbuffer.get())); verify(rc); u32 texAddress = pvrrc.fb_W_SOF1 & VRAM_MASK; + int vpWidth, vpHeight; if (is_rtt) { - prepareRttRenderTarget(texAddress); + prepareRttRenderTarget(texAddress, vpWidth, vpHeight); } else { resize(pvrrc.framebufferWidth, pvrrc.framebufferHeight); + if (pvrrc.clearFramebuffer) + device->ColorFill(framebufferSurface, 0, D3DCOLOR_ARGB(255, VO_BORDER_COL._red, VO_BORDER_COL._green, VO_BORDER_COL._blue)); rc = SUCCEEDED(device->SetRenderTarget(0, framebufferSurface)); verify(rc); D3DVIEWPORT9 viewport; @@ -975,13 +1024,15 @@ bool D3DRenderer::Render() viewport.MaxZ = 1; rc = SUCCEEDED(device->SetViewport(&viewport)); verify(rc); + vpWidth = width; + vpHeight = height; } rc = SUCCEEDED(device->SetDepthStencilSurface(depthSurface)); verify(rc); matrices.CalcMatrices(&pvrrc, width, height); // infamous DX9 half-pixel viewport shift // https://docs.microsoft.com/en-us/windows/win32/direct3d9/directly-mapping-texels-to-pixels - glm::mat4 normalMat = glm::translate(glm::vec3(-1.f / width, 1.f / height, 0)) * matrices.GetNormalMatrix(); + glm::mat4 normalMat = glm::translate(glm::vec3(1.f / vpWidth, 1.f / vpHeight, 0)) * matrices.GetNormalMatrix(); rc = SUCCEEDED(device->SetVertexShaderConstantF(0, &normalMat[0][0], 4)); verify(rc); @@ -1061,6 +1112,33 @@ bool D3DRenderer::Render() pvrrc.fog_clamp_max.getRGBAColor(color_clamp); device->SetPixelShaderConstantF(7, color_clamp, 1); + // Dithering + dithering = config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3; + if (dithering) + { + float ditherColorMax[4]; + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + ditherColorMax[0] = ditherColorMax[1] = ditherColorMax[2] = 31.f; + ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + ditherColorMax[0] = ditherColorMax[2] = 31.f; + ditherColorMax[1] = 63.f; + ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + ditherColorMax[0] = ditherColorMax[1] + = ditherColorMax[2] = ditherColorMax[3] = 15.f; + break; + default: + break; + } + device->SetPixelShaderConstantF(8, ditherColorMax, 1); + } + devCache.SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); device->SetVertexDeclaration(mainVtxDecl); @@ -1071,6 +1149,7 @@ bool D3DRenderer::Render() devCache.SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); devCache.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + devCache.SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); devCache.SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); devCache.SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); devCache.SetRenderState(D3DRS_CLIPPING, FALSE); @@ -1101,9 +1180,10 @@ bool D3DRenderer::Render() { aspectRatio = getOutputFramebufferAspectRatio(); displayFramebuffer(); - DrawOSD(false); + drawOSD(); frameRendered = true; frameRenderedOnce = true; + clearLastFrame = false; theDXContext.setFrameRendered(); } @@ -1204,7 +1284,7 @@ void D3DRenderer::displayFramebuffer() bool D3DRenderer::RenderLastFrame() { - if (!frameRenderedOnce || !theDXContext.isReady()) + if (clearLastFrame || !frameRenderedOnce || !theDXContext.isReady()) return false; backbuffer.reset(); bool rc = SUCCEEDED(device->GetRenderTarget(0, &backbuffer.get())); @@ -1217,9 +1297,9 @@ bool D3DRenderer::RenderLastFrame() void D3DRenderer::updatePaletteTexture() { - if (!palette_updated) + if (!updatePalette) return; - palette_updated = false; + updatePalette = false; D3DLOCKED_RECT rect; bool rc = SUCCEEDED(paletteTexture->LockRect(0, &rect, nullptr, 0)); @@ -1241,9 +1321,9 @@ void D3DRenderer::updatePaletteTexture() void D3DRenderer::updateFogTexture() { - if (!fog_needs_update || !config::Fog) + if (!updateFogTable || !config::Fog) return; - fog_needs_update = false; + updateFogTable = false; u8 temp_tex_buffer[256]; MakeFogTexture(temp_tex_buffer); @@ -1264,9 +1344,9 @@ void D3DRenderer::updateFogTexture() device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); } -void D3DRenderer::DrawOSD(bool clear_screen) +void D3DRenderer::drawOSD() { - theDXContext.setOverlay(!clear_screen); + theDXContext.setOverlay(true); gui_display_osd(); theDXContext.setOverlay(false); } @@ -1355,6 +1435,105 @@ void D3DRenderer::writeFramebufferToVRAM() WriteFramebuffer<2, 1, 0, 3>(width, height, (u8 *)tmp_buf.data(), texAddress, pvrrc.fb_W_CTRL, linestride, xClip, yClip); } +bool D3DRenderer::GetLastFrame(std::vector& data, int& width, int& height) +{ + if (!frameRenderedOnce || !theDXContext.isReady()) + return false; + + if (width != 0) { + height = width / aspectRatio; + } + else if (height != 0) { + width = aspectRatio * height; + } + else + { + width = this->width; + height = this->height; + if (config::Rotate90) + std::swap(width, height); + // We need square pixels for PNG + int w = aspectRatio * height; + if (width > w) + height = width / aspectRatio; + else + width = w; + } + + backbuffer.reset(); + device->GetRenderTarget(0, &backbuffer.get()); + + // Target texture and surface + ComPtr target; + device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &target.get(), NULL); + ComPtr surface; + target->GetSurfaceLevel(0, &surface.get()); + device->SetRenderTarget(0, surface); + // Draw + devCache.SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + device->SetPixelShader(NULL); + device->SetVertexShader(NULL); + device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + device->SetRenderState(D3DRS_ZENABLE, FALSE); + device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + device->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + + glm::mat4 identity = glm::identity(); + glm::mat4 projection = glm::translate(glm::vec3(-1.f / width, 1.f / height, 0)); + if (config::Rotate90) + projection *= glm::rotate((float)M_PI_2, glm::vec3(0, 0, 1)); + + device->SetTransform(D3DTS_WORLD, (const D3DMATRIX *)&identity[0][0]); + device->SetTransform(D3DTS_VIEW, (const D3DMATRIX *)&identity[0][0]); + device->SetTransform(D3DTS_PROJECTION, (const D3DMATRIX *)&projection[0][0]); + + device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); + D3DVIEWPORT9 viewport{}; + viewport.Width = width; + viewport.Height = height; + viewport.MaxZ = 1; + bool rc = SUCCEEDED(device->SetViewport(&viewport)); + verify(rc); + float coords[] { + -1, 1, 0.5f, 0, 0, + -1, -1, 0.5f, 0, 1, + 1, 1, 0.5f, 1, 0, + 1, -1, 0.5f, 1, 1, + }; + device->SetTexture(0, framebufferTexture); + device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, coords, sizeof(float) * 5); + + // Copy back + ComPtr offscreenSurface; + rc = SUCCEEDED(device->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &offscreenSurface.get(), nullptr)); + verify(rc); + rc = SUCCEEDED(device->GetRenderTargetData(surface, offscreenSurface)); + verify(rc); + + D3DLOCKED_RECT rect; + RECT lockRect { 0, 0, (long)width, (long)height }; + rc = SUCCEEDED(offscreenSurface->LockRect(&rect, &lockRect, D3DLOCK_READONLY)); + verify(rc); + data.clear(); + data.reserve(width * height * 3); + for (int y = 0; y < height; y++) + { + const u8 *src = (const u8 *)rect.pBits + y * rect.Pitch; + for (int x = 0; x < width; x++, src += 4) + { + data.push_back(src[2]); + data.push_back(src[1]); + data.push_back(src[0]); + } + } + rc = SUCCEEDED(offscreenSurface->UnlockRect()); + device->SetRenderTarget(0, backbuffer); + + return true; +} + Renderer* rend_DirectX9() { return new D3DRenderer(); diff --git a/core/rend/dx9/d3d_renderer.h b/core/rend/dx9/d3d_renderer.h index d4915ce08..045c7a03e 100644 --- a/core/rend/dx9/d3d_renderer.h +++ b/core/rend/dx9/d3d_renderer.h @@ -25,7 +25,8 @@ #include "rend/transform_matrix.h" #include "d3d_texture.h" #include "d3d_shaders.h" -#include "rend/imgui_driver.h" +#include "ui/imgui_driver.h" +#include "rend/tileclip.h" class RenderStateCache { @@ -105,17 +106,17 @@ struct D3DRenderer : public Renderer bool RenderLastFrame() override; bool Present() override { - if (!frameRendered) + if (!frameRendered || clearLastFrame) return false; imguiDriver->setFrameRendered(); frameRendered = false; return true; } - void DrawOSD(bool clear_screen) override; BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override; void preReset(); void postReset(); void RenderFramebuffer(const FramebufferInfo& info) override; + bool GetLastFrame(std::vector& data, int& width, int& height) override; private: enum ModifierVolumeMode { Xor, Or, Inclusion, Exclusion, ModeCount }; @@ -136,9 +137,11 @@ struct D3DRenderer : public Renderer void drawModVols(int first, int count); void setTexMode(D3DSAMPLERSTATETYPE state, u32 clamp, u32 mirror); void setBaseScissor(); - void prepareRttRenderTarget(u32 texAddress); + void prepareRttRenderTarget(u32 texAddress, int& vpWidth, int& vpHeight); void readRttRenderTarget(u32 texAddress); void writeFramebufferToVRAM(); + void drawOSD(); + TileClipping setTileClip(u32 tileclip, int rect[4]); RenderStateCache devCache; ComPtr device; @@ -175,5 +178,6 @@ struct D3DRenderer : public Renderer bool frameRenderedOnce = false; int maxAnisotropy = 1; float aspectRatio = 4.f / 3.f; + bool dithering = false; }; diff --git a/core/rend/dx9/d3d_shaders.cpp b/core/rend/dx9/d3d_shaders.cpp index 331f23ddd..518d4a2fb 100644 --- a/core/rend/dx9/d3d_shaders.cpp +++ b/core/rend/dx9/d3d_shaders.cpp @@ -94,6 +94,8 @@ float4 clipTest : register(c4); float4 trilinearAlpha : register(c5); float4 colorClampMin : register(c6); float4 colorClampMax : register(c7); +float4 ditherColorMax : register(c8); +float4 textureSize : register(c9); float fog_mode2(float w) { @@ -120,18 +122,55 @@ float4 clampColor(float4 color) #endif } +#if pp_Palette != 0 + +float4 getPaletteEntry(float colIdx) +{ + int colorIdx = int(floor(colIdx * 255.0f + 0.5f) + paletteIndex.x); + float2 c = float2((fmod(float(colorIdx), 32.0f) * 2.0f + 1.0f) / 64.0f, (float(colorIdx / 32) * 2.0f + 1.0f) / 64.0f); + return tex2D(tex_pal, c); +} + +#endif + #if pp_Palette == 1 float4 palettePixel(float4 coords) { #if DIV_POS_Z == 1 - float texColIdx = tex2D(samplr, coords.xy).a; + return getPaletteEntry(tex2D(samplr, coords.xy).a); #else - float texColIdx = tex2Dproj(samplr, coords).a; + return getPaletteEntry(tex2Dproj(samplr, coords).a); #endif - int colorIdx = int(floor(texColIdx * 255.0f + 0.5f) + paletteIndex.x); - float2 c = float2((fmod(float(colorIdx), 32.0f) * 2.0f + 1.0f) / 64.0f, (float(colorIdx / 32) * 2.0f + 1.0f) / 64.0f); - return tex2D(tex_pal, c); +} + +#elif pp_Palette == 2 + +float4 palettePixelBilinear(float4 coords) +{ +#if DIV_POS_Z == 0 + coords.xy /= coords.w; +#endif + float2 pixCoord = coords.xy * textureSize.xy - 0.5f; // coordinates of top left pixel + float2 originPixCoord = floor(pixCoord); + + float2 sampleUV = (originPixCoord + 0.5f) / textureSize.xy; // UV coordinates of center of top left pixel + + // Sample from all surrounding texels + float4 c00 = getPaletteEntry(tex2D(samplr, sampleUV).a); + sampleUV = (originPixCoord + float2(0.5f, 1.5f)) / textureSize.xy; + float4 c01 = getPaletteEntry(tex2D(samplr, sampleUV).a); + sampleUV = (originPixCoord + float2(1.5f, 1.5f)) / textureSize.xy; + float4 c11 = getPaletteEntry(tex2D(samplr, sampleUV).a); + sampleUV = (originPixCoord + float2(1.5f, 0.5f)) / textureSize.xy; + float4 c10 = getPaletteEntry(tex2D(samplr, sampleUV).a); + + float2 weight = pixCoord - originPixCoord; + + // Bi-linear mixing + float4 temp0 = lerp(c00, c10, weight.x); + float4 temp1 = lerp(c01, c11, weight.x); + return lerp(temp0, temp1, weight.y); } #endif @@ -175,8 +214,10 @@ PSO main(in pixel inpix) #else float4 texcol = tex2Dproj(samplr, inpix.uv); #endif - #else + #elif pp_Palette == 1 float4 texcol = palettePixel(inpix.uv); + #else + float4 texcol = palettePixelBilinear(inpix.uv); #endif #if pp_BumpMap == 1 @@ -222,14 +263,26 @@ PSO main(in pixel inpix) color *= trilinearAlpha; #endif - //color.rgb = float3(inpix.uv.w * FOG_DENSITY_SCALE.x / 128.0f); +#if DITHERING == 1 + static const float ditherTable[16] = { + 0.9375f, 0.1875f, 0.75f, 0.0f, + 0.4375f, 0.6875f, 0.25f, 0.5f, + 0.8125f, 0.0625f, 0.875f, 0.125f, + 0.3125f, 0.5625f, 0.375f, 0.625f + }; + float r = ditherTable[int(inpix.pos.y % 4.0f) * 4 + int(inpix.pos.x % 4.0f)] + 0.03125f; // why is this bias needed?? + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + color += r / ditherColorMax; + // avoid rounding + color = floor(color * 255.0f) / 255.0f; +#endif PSO pso; #if DIV_POS_Z == 1 float w = 100000.0f / inpix.uv.w; #else float w = 100000.0f * inpix.uv.w; #endif - pso.z = log2(1.0f + w) / 34.0f; + pso.z = log2(1.0f + max(w, -0.999999f)) / 34.0f; pso.col = color; return pso; @@ -243,7 +296,7 @@ PSO modifierVolume(float4 uv : TEXCOORD0) #else float w = 100000.0f * uv.w; #endif - pso.z = log2(1.0f + w) / 34.0f; + pso.z = log2(1.0f + max(w, -0.999999f)) / 34.0f; pso.col = float4(0, 0, 0, FOG_DENSITY_SCALE.y); return pso; @@ -273,6 +326,7 @@ enum ShaderMacros { MacroBumpMap, MacroTriLinear, MacroClipInside, + MacroDithering, }; static D3DXMACRO PixelMacros[] @@ -290,12 +344,13 @@ static D3DXMACRO PixelMacros[] { "pp_BumpMap", "0" }, { "pp_TriLinear", "0" }, { "pp_ClipInside", "0" }, + { "DITHERING", "0" }, {0, 0} }; const ComPtr& D3DShaders::getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, - bool trilinear, bool palette, bool gouraud, bool clipInside) + bool trilinear, int palette, bool gouraud, bool clipInside, bool dithering) { u32 hash = (int)pp_Texture | (pp_UseAlpha << 1) @@ -307,9 +362,10 @@ const ComPtr& D3DShaders::getShader(bool pp_Texture, bool | (fog_clamping << 9) | (trilinear << 10) | (palette << 11) - | (gouraud << 12) - | (clipInside << 13) - | ((int)config::NativeDepthInterpolation << 14); + | (gouraud << 13) + | (clipInside << 14) + | ((int)config::NativeDepthInterpolation << 15) + | (dithering << 16); auto it = shaders.find(hash); if (it == shaders.end()) { @@ -328,6 +384,7 @@ const ComPtr& D3DShaders::getShader(bool pp_Texture, bool PixelMacros[MacroGouraud].Definition = MacroValues[gouraud]; PixelMacros[MacroClipInside].Definition = MacroValues[clipInside]; PixelMacros[MacroDivPosZ].Definition = MacroValues[config::NativeDepthInterpolation]; + PixelMacros[MacroDithering].Definition = MacroValues[dithering]; ComPtr shader = compilePS(PixelShader, "main", PixelMacros); verify((bool )shader); it = shaders.insert(std::make_pair(hash, shader)).first; @@ -365,7 +422,7 @@ ComPtr D3DShaders::compileShader(const char* source, const char* fu ComPtr errors; ComPtr shader; ComPtr constants; - D3DXCompileShader(source, strlen(source), pDefines, NULL, function, profile, SHADER_DEBUG, &shader.get(), &errors.get(), &constants.get()); + pD3DXCompileShader(source, strlen(source), pDefines, NULL, function, profile, SHADER_DEBUG, &shader.get(), &errors.get(), &constants.get()); if (errors) { char *text = (char *) errors->GetBufferPointer(); WARN_LOG(RENDERER, "%s", text); @@ -375,7 +432,7 @@ ComPtr D3DShaders::compileShader(const char* source, const char* fu ComPtr D3DShaders::compileVS(const char* source, const char* function, const D3DXMACRO* pDefines) { - ComPtr buffer = compileShader(source, function, D3DXGetVertexShaderProfile(device), pDefines); + ComPtr buffer = compileShader(source, function, pD3DXGetVertexShaderProfile(device), pDefines); ComPtr shader; if (buffer) device->CreateVertexShader((DWORD *)buffer->GetBufferPointer(), &shader.get()); @@ -385,10 +442,49 @@ ComPtr D3DShaders::compileVS(const char* source, const c ComPtr D3DShaders::compilePS(const char* source, const char* function, const D3DXMACRO* pDefines) { - ComPtr buffer = compileShader(source, function, D3DXGetPixelShaderProfile(device), pDefines); + ComPtr buffer = compileShader(source, function, pD3DXGetPixelShaderProfile(device), pDefines); ComPtr shader; if (buffer) device->CreatePixelShader((DWORD *)buffer->GetBufferPointer(), &shader.get()); return shader; } + +void D3DShaders::init(const ComPtr& device) +{ + this->device = device; + // d3dx9_24.dll is found in the Feb 2005 (!) release of the DirectX SDK so I doubt it will work but let's try + for (int ver = 43; ver >= 24; ver--) + { + std::string dllname = "d3dx9_" + std::to_string(ver) + ".dll"; + d3dx9Library = LoadLibraryA(dllname.c_str()); + if (d3dx9Library != NULL) { + DEBUG_LOG(RENDERER, "Loaded %s", dllname.c_str()); + break; + } + } + if (d3dx9Library == NULL) { + ERROR_LOG(RENDERER, "Cannot load d3dx9_??.dll"); + throw FlycastException("Cannot load d3dx9_??.dll"); + } + pD3DXCompileShader = (decltype(D3DXCompileShader) *)GetProcAddress(d3dx9Library, "D3DXCompileShader"); + pD3DXGetVertexShaderProfile = (decltype(D3DXGetVertexShaderProfile) *)GetProcAddress(d3dx9Library, "D3DXGetVertexShaderProfile"); + pD3DXGetPixelShaderProfile = (decltype(D3DXGetPixelShaderProfile) *)GetProcAddress(d3dx9Library, "D3DXGetPixelShaderProfile"); + if (pD3DXCompileShader == nullptr || pD3DXGetVertexShaderProfile == nullptr || pD3DXGetPixelShaderProfile == nullptr) { + ERROR_LOG(RENDERER, "Cannot find entry point in d3dx9_??.dll"); + throw FlycastException("Cannot load d3dx9_??.dll"); + } +} + +void D3DShaders::term() +{ + shaders.clear(); + for (auto& shader : vertexShaders) + shader.reset(); + for (auto& shader : modVolShaders) + shader.reset(); + device.reset(); + if (d3dx9Library != NULL) + FreeLibrary(d3dx9Library); + d3dx9Library = NULL; +} diff --git a/core/rend/dx9/d3d_shaders.h b/core/rend/dx9/d3d_shaders.h index 3ea5eccb7..6ce69d74f 100644 --- a/core/rend/dx9/d3d_shaders.h +++ b/core/rend/dx9/d3d_shaders.h @@ -24,24 +24,13 @@ class D3DShaders { public: - void init(const ComPtr& device) - { - this->device = device; - } - + void init(const ComPtr& device); const ComPtr& getShader(bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, - bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, bool trilinear, bool palette, bool gouraud, - bool clipInside); + bool pp_Offset, u32 pp_FogCtrl, bool pp_BumpMap, bool fog_clamping, bool trilinear, int palette, bool gouraud, + bool clipInside, bool dithering); const ComPtr& getVertexShader(bool gouraud); const ComPtr& getModVolShader(); - void term() { - shaders.clear(); - for (auto& shader : vertexShaders) - shader.reset(); - for (auto& shader : modVolShaders) - shader.reset(); - device.reset(); - } + void term(); private: ComPtr compileShader(const char* source, const char* function, const char* profile, const D3DXMACRO* pDefines); @@ -52,4 +41,8 @@ class D3DShaders std::unordered_map> shaders; ComPtr vertexShaders[4]; ComPtr modVolShaders[2]; + HMODULE d3dx9Library = NULL; + decltype(D3DXCompileShader) *pD3DXCompileShader = nullptr; + decltype(D3DXGetVertexShaderProfile) *pD3DXGetVertexShaderProfile = nullptr; + decltype(D3DXGetPixelShaderProfile) *pD3DXGetPixelShaderProfile = nullptr; }; diff --git a/core/rend/dx9/dx9_driver.h b/core/rend/dx9/dx9_driver.h index 82d4c88af..4e271b40d 100644 --- a/core/rend/dx9/dx9_driver.h +++ b/core/rend/dx9/dx9_driver.h @@ -17,8 +17,8 @@ along with Flycast. If not, see . */ #pragma once -#include "rend/imgui_driver.h" -#include "imgui/backends/imgui_impl_dx9.h" +#include "ui/imgui_driver.h" +#include "imgui_impl_dx9.h" #include "dxcontext.h" #include @@ -29,7 +29,7 @@ class DX9Driver final : public ImGuiDriver ImGui_ImplDX9_Init(device); } - ~DX9Driver() { + ~DX9Driver() override { ImGui_ImplDX9_Shutdown(); } @@ -53,20 +53,21 @@ class DX9Driver final : public ImGuiDriver frameRendered = true; } - ImTextureID getTexture(const std::string& name) override { + ImTextureID getTexture(const std::string& name) override + { auto it = textures.find(name); if (it != textures.end()) - return (ImTextureID)it->second.get(); + return (ImTextureID)&it->second.imTexture; else return ImTextureID{}; } - ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height) override + ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) override { - ComPtr& texture = textures[name]; - texture.reset(); - HRESULT hr = theDXContext.getDevice()->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture.get(), 0); - if (FAILED(hr) || !texture) + Texture& texture = textures[name]; + texture.tex.reset(); + HRESULT hr = theDXContext.getDevice()->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture.tex.get(), 0); + if (FAILED(hr) || !texture.tex) { WARN_LOG(RENDERER, "CreateTexture failed (%d x %d): error %x", width, height, hr); textures.erase(name); @@ -76,7 +77,7 @@ class DX9Driver final : public ImGuiDriver width *= 4; D3DLOCKED_RECT rect; - texture->LockRect(0, &rect, nullptr, 0); + texture.tex->LockRect(0, &rect, nullptr, 0); u8 *dst = (u8 *)rect.pBits; const u8 *src = data; for (int y = 0; y < height; y++) @@ -92,12 +93,23 @@ class DX9Driver final : public ImGuiDriver dst += rect.Pitch; src += width; } - texture->UnlockRect(0); + texture.tex->UnlockRect(0); + texture.imTexture.d3dTexture = texture.tex.get(); + texture.imTexture.pointSampling = nearestSampling; + + return (ImTextureID)&texture.imTexture; + } - return (ImTextureID)texture.get(); + void deleteTexture(const std::string& name) override { + textures.erase(name); } private: bool frameRendered = false; - std::unordered_map> textures; + struct Texture + { + ComPtr tex; + ImTextureDX9 imTexture; + }; + std::unordered_map textures; }; diff --git a/core/rend/dx9/dxcontext.cpp b/core/rend/dx9/dxcontext.cpp index 84ba8d96d..2fb35aa07 100644 --- a/core/rend/dx9/dxcontext.cpp +++ b/core/rend/dx9/dxcontext.cpp @@ -25,7 +25,7 @@ #include "hw/pvr/Renderer_if.h" #include "emulator.h" #include "dx9_driver.h" -#include "imgui/backends/imgui_impl_dx9.h" +#include "imgui_impl_dx9.h" DXContext theDXContext; @@ -34,13 +34,32 @@ bool DXContext::init(bool keepCurrentWindow) NOTICE_LOG(RENDERER, "DX9 Context initializing"); GraphicsContext::instance = this; #ifdef USE_SDL - if (!keepCurrentWindow && !sdl_recreate_window(0)) + if (!keepCurrentWindow && !sdl_recreate_window(0)) { + term(); return false; + } #endif - pD3D.reset(Direct3DCreate9(D3D_SDK_VERSION)); - if (!pD3D) { + d3d9Library = LoadLibraryA("D3D9.DLL"); + if (d3d9Library == NULL) + { + ERROR_LOG(RENDERER, "Cannot load D3D9.DLL"); + term(); + return false; + } + decltype(Direct3DCreate9) *pDirect3DCreate9 = (decltype(Direct3DCreate9) *)GetProcAddress(d3d9Library, "Direct3DCreate9"); + if (pDirect3DCreate9 == nullptr) + { + ERROR_LOG(RENDERER, "Cannot find entry point Direct3DCreate9"); + term(); + return false; + } + + pD3D.reset(pDirect3DCreate9(D3D_SDK_VERSION)); + if (!pD3D) + { ERROR_LOG(RENDERER, "Direct3DCreate9 failed"); + term(); return false; } memset(&d3dpp, 0, sizeof(d3dpp)); @@ -79,6 +98,7 @@ bool DXContext::init(bool keepCurrentWindow) if (FAILED(hr)) { ERROR_LOG(RENDERER, "DirectX9 device creation failed: %x", hr); + term(); return false; } imguiDriver = std::unique_ptr(new DX9Driver(pDevice)); @@ -89,6 +109,7 @@ bool DXContext::init(bool keepCurrentWindow) driverName = std::string(id.Description); driverVersion = std::to_string(id.DriverVersion.HighPart >> 16) + "." + std::to_string((u16)id.DriverVersion.HighPart) + "." + std::to_string(id.DriverVersion.LowPart >> 16) + "." + std::to_string((u16)id.DriverVersion.LowPart); + amd = id.VendorId == 0x1002 || id.VendorId == 0x1022; deviceReady = true; return true; @@ -102,6 +123,9 @@ void DXContext::term() imguiDriver.reset(); pDevice.reset(); pD3D.reset(); + if (d3d9Library != NULL) + FreeLibrary(d3d9Library); + d3d9Library = NULL; deviceReady = false; } @@ -172,14 +196,7 @@ void DXContext::EndImGuiFrame() if (SUCCEEDED(pDevice->BeginScene())) { if (overlayOnly) - { - if (crosshairsNeeded() || config::FloatVMUs) - overlay.draw(settings.display.width, settings.display.height, config::FloatVMUs, true); - } - else - { - overlay.draw(settings.display.width, settings.display.height, true, false); - } + overlay.draw(settings.display.width, settings.display.height, config::FloatVMUs, true); ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); pDevice->EndScene(); } diff --git a/core/rend/dx9/dxcontext.h b/core/rend/dx9/dxcontext.h index 9f62153b3..b0ab23aed 100644 --- a/core/rend/dx9/dxcontext.h +++ b/core/rend/dx9/dxcontext.h @@ -50,6 +50,9 @@ class DXContext : public GraphicsContext std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return amd; + } void setFrameRendered() { frameRendered = true; } @@ -60,6 +63,7 @@ class DXContext : public GraphicsContext private: void resetDevice(); + HMODULE d3d9Library = NULL; ComPtr pD3D; ComPtr pDevice; D3DPRESENT_PARAMETERS d3dpp{}; @@ -69,6 +73,7 @@ class DXContext : public GraphicsContext bool frameRendered = false; std::string driverName; std::string driverVersion; + bool amd = false; bool deviceReady = false; }; extern DXContext theDXContext; diff --git a/core/rend/game_scanner.h b/core/rend/game_scanner.h deleted file mode 100644 index 8dd4b5df9..000000000 --- a/core/rend/game_scanner.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - Copyright 2020 flyinghead - - This file is part of flycast. - - flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - flycast 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 flycast. If not, see . - */ -#pragma once -#include -#include -#include -#include - -#include "types.h" -#include "stdclass.h" -#include "hw/naomi/naomi_roms.h" -#include "oslib/storage.h" -#include "cfg/option.h" - -struct GameMedia { - std::string name; // Display name - std::string path; // Full path to rom. May be an encoded uri - std::string fileName; // Last component of the path, decoded - std::string gameName; // for arcade games only, description from the rom list -}; - -static bool operator<(const GameMedia &left, const GameMedia &right) -{ - return left.name < right.name; -} - -class GameScanner -{ - std::vector game_list; - std::vector arcade_game_list; - std::mutex mutex; - std::mutex threadMutex; - std::unique_ptr scan_thread; - bool scan_done = false; - bool running = false; - std::unordered_map arcade_games; - std::unordered_set arcade_gdroms; - - void insert_game(const GameMedia& game) - { - std::lock_guard guard(mutex); - game_list.insert(std::upper_bound(game_list.begin(), game_list.end(), game), game); - } - - void insert_arcade_game(const GameMedia& game) - { - arcade_game_list.insert(std::upper_bound(arcade_game_list.begin(), arcade_game_list.end(), game), game); - } - - void add_game_directory(const std::string& path) - { - hostfs::DirectoryTree tree(path); - std::string emptyParentPath; - for (const hostfs::FileInfo& item : tree) - { - if (!running) - break; - - if (game_list.empty()) - { - // This won't work for android content uris - size_t slash = get_last_slash_pos(item.path); - std::string parentPath; - if (slash != 0 && slash != std::string::npos) - parentPath = item.path.substr(0, slash); - else - parentPath = item.path; - if (parentPath != emptyParentPath) - { - ++empty_folders_scanned; - emptyParentPath = parentPath; - if (empty_folders_scanned > 1000) - content_path_looks_incorrect = true; - } - } - else - { - content_path_looks_incorrect = false; - } - - if (item.name.substr(0, 2) == "._") - // Ignore Mac OS turds - continue; - std::string fileName(item.name); - std::string gameName(get_file_basename(item.name)); - std::string extension = get_file_extension(item.name); - if (extension == "zip" || extension == "7z") - { - string_tolower(gameName); - auto it = arcade_games.find(gameName); - if (it == arcade_games.end()) - continue; - gameName = it->second->description; - fileName = fileName + " (" + gameName + ")"; - insert_arcade_game(GameMedia{ fileName, item.path, item.name, gameName }); - continue; - } - else if (extension == "bin" || extension == "lst" || extension == "dat") - { - if (!config::HideLegacyNaomiRoms) - insert_arcade_game(GameMedia{ fileName, item.path, item.name, gameName }); - continue; - } - else if (extension == "chd" || extension == "gdi") - { - // Hide arcade gdroms - std::string basename = gameName; - string_tolower(basename); - if (arcade_gdroms.count(basename) != 0) - continue; - } - else if (extension != "cdi" && extension != "cue") - continue; - insert_game(GameMedia{ fileName, item.path, item.name, gameName }); - } - } - -public: - ~GameScanner() - { - stop(); - } - void refresh() - { - stop(); - scan_done = false; - } - - void stop() - { - std::lock_guard guard(threadMutex); - running = false; - empty_folders_scanned = 0; - content_path_looks_incorrect = false; - if (scan_thread && scan_thread->joinable()) - scan_thread->join(); - } - - void fetch_game_list() - { - std::lock_guard guard(threadMutex); - if (scan_done || running) - return; - if (scan_thread && scan_thread->joinable()) - scan_thread->join(); - running = true; - scan_thread = std::unique_ptr( - new std::thread([this]() - { - if (arcade_games.empty()) - for (int gameid = 0; Games[gameid].name != nullptr; gameid++) - { - const Game *game = &Games[gameid]; - arcade_games[game->name] = game; - if (game->gdrom_name != nullptr) - arcade_gdroms.insert(game->gdrom_name); - } - { - std::lock_guard guard(mutex); - game_list.clear(); - } - arcade_game_list.clear(); - for (const auto& path : config::ContentPath.get()) - { - try { - add_game_directory(path); - } catch (const hostfs::StorageException& e) { - // ignore - } - if (!running) - break; - } - { - std::lock_guard guard(mutex); - game_list.insert(game_list.end(), arcade_game_list.begin(), arcade_game_list.end()); - } - if (running) - scan_done = true; - running = false; - })); - } - - std::mutex& get_mutex() { return mutex; } - const std::vector& get_game_list() { return game_list; } - unsigned int empty_folders_scanned = 0; - bool content_path_looks_incorrect = false; -}; diff --git a/core/rend/gl4/abuffer.cpp b/core/rend/gl4/abuffer.cpp index d524c9ea6..0fcb723e1 100644 --- a/core/rend/gl4/abuffer.cpp +++ b/core/rend/gl4/abuffer.cpp @@ -24,7 +24,7 @@ static GLuint pixels_buffer; static GLuint pixels_pointers; static GLuint atomic_buffer; -static gl4PipelineShader g_abuffer_final_shader; +static gl4PipelineShader g_abuffer_final_shader[2]; static gl4PipelineShader g_abuffer_clear_shader; static gl4PipelineShader g_abuffer_tr_modvol_shaders[ModeCount]; static int maxLayers; @@ -46,6 +46,9 @@ static AQuadVertexArray g_quadVertexArray; static const char *final_shader_source = R"( layout(binding = 0) uniform sampler2D tex; uniform float shade_scale_factor; +#if DITHERING == 1 +uniform vec4 ditherColorMax; +#endif out vec4 FragColor; @@ -178,6 +181,19 @@ vec4 resolveAlphaBlend(ivec2 coords) { else finalColor = result; } +#if DITHERING == 1 + float ditherTable[16] = float[]( + 0.9375, 0.1875, 0.75, 0., + 0.4375, 0.6875, 0.25, 0.5, + 0.8125, 0.0625, 0.875, 0.125, + 0.3125, 0.5625, 0.375, 0.625 + ); + float r = ditherTable[int(mod(gl_FragCoord.y, 4.)) * 4 + int(mod(gl_FragCoord.x, 4.))]; + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + finalColor += r / ditherColorMax; + // avoid rounding + finalColor = floor(finalColor * 255.) / 255.; +#endif return finalColor; @@ -273,23 +289,28 @@ static void compileFinalAndModVolShaders() if (maxLayers != config::PerPixelLayers) { maxLayers = config::PerPixelLayers; - glcache.DeleteProgram(g_abuffer_final_shader.program); - g_abuffer_final_shader.program = 0; - for (int mode = 0; mode < ModeCount; mode++) - { - glcache.DeleteProgram(g_abuffer_tr_modvol_shaders[mode].program); - g_abuffer_tr_modvol_shaders[mode].program = 0; + for (auto& shader : g_abuffer_final_shader) { + glcache.DeleteProgram(shader.program); + shader.program = 0; + } + for (auto& shader : g_abuffer_tr_modvol_shaders) { + glcache.DeleteProgram(shader.program); + shader.program = 0; } } - if (g_abuffer_final_shader.program == 0) + if (g_abuffer_final_shader[0].program == 0) { OpenGl4Source vertexShader; vertexShader.addSource(VertexShaderSource); - OpenGl4Source finalShader; - finalShader.addConstant("MAX_PIXELS_PER_FRAGMENT", config::PerPixelLayers) - .addSource(ShaderHeader) - .addSource(final_shader_source); - gl4CompilePipelineShader(&g_abuffer_final_shader, finalShader.generate().c_str(), vertexShader.generate().c_str()); + for (size_t i = 0; i < std::size(g_abuffer_final_shader); i++) + { + OpenGl4Source finalShader; + finalShader.addConstant("MAX_PIXELS_PER_FRAGMENT", config::PerPixelLayers) + .addConstant("DITHERING", i) + .addSource(ShaderHeader) + .addSource(final_shader_source); + gl4CompilePipelineShader(&g_abuffer_final_shader[i], finalShader.generate().c_str(), vertexShader.generate().c_str()); + } } if (g_abuffer_tr_modvol_shaders[0].program == 0) { @@ -391,12 +412,18 @@ void initABuffer() g_quadVertexArray.bind(g_quadBuffer.get(), g_quadIndexBuffer.get()); g_quadVertexArray.unbind(); - // Clear A-buffer pointers - glcache.UseProgram(g_abuffer_clear_shader.program); - gl4ShaderUniforms.Set(&g_abuffer_clear_shader); - - abufferDrawQuad(); - glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + if (pixels_pointers != 0) + { + // Clear A-buffer pointers + glcache.UseProgram(g_abuffer_clear_shader.program); + gl4ShaderUniforms.Set(&g_abuffer_clear_shader); + glcache.Disable(GL_DEPTH_TEST); + glcache.Disable(GL_CULL_FACE); + glcache.Disable(GL_SCISSOR_TEST); + + abufferDrawQuad(); + glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + } glCheck(); } @@ -421,14 +448,15 @@ void termABuffer() g_quadVertexArray.term(); g_quadBuffer.reset(); g_quadIndexBuffer.reset(); - glcache.DeleteProgram(g_abuffer_final_shader.program); - g_abuffer_final_shader.program = 0; + for (auto& shader : g_abuffer_final_shader) { + glcache.DeleteProgram(shader.program); + shader.program = 0; + } glcache.DeleteProgram(g_abuffer_clear_shader.program); g_abuffer_clear_shader.program = 0; - for (int mode = 0; mode < ModeCount; mode++) - { - glcache.DeleteProgram(g_abuffer_tr_modvol_shaders[mode].program); - g_abuffer_tr_modvol_shaders[mode].program = 0; + for (auto& shader : g_abuffer_tr_modvol_shaders) { + glcache.DeleteProgram(shader.program); + shader.program = 0; } maxLayers = 0; } @@ -550,17 +578,44 @@ void checkOverflowAndReset() glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0 , sizeof(GLuint), &max_pixel_index); } -void renderABuffer() +void renderABuffer(bool lastPass) { // Render to output FBO compileFinalAndModVolShaders(); - glcache.UseProgram(g_abuffer_final_shader.program); - gl4ShaderUniforms.Set(&g_abuffer_final_shader); + if (lastPass && config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3) + { + glcache.UseProgram(g_abuffer_final_shader[1].program); + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + gl4ShaderUniforms.ditherColorMax[0] = gl4ShaderUniforms.ditherColorMax[1] = gl4ShaderUniforms.ditherColorMax[2] = 31.f; + gl4ShaderUniforms.ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + gl4ShaderUniforms.ditherColorMax[0] = gl4ShaderUniforms.ditherColorMax[2] = 31.f; + gl4ShaderUniforms.ditherColorMax[1] = 63.f; + gl4ShaderUniforms.ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + gl4ShaderUniforms.ditherColorMax[0] = gl4ShaderUniforms.ditherColorMax[1] + = gl4ShaderUniforms.ditherColorMax[2] = gl4ShaderUniforms.ditherColorMax[3] = 15.f; + break; + default: + break; + } + gl4ShaderUniforms.Set(&g_abuffer_final_shader[1]); + } + else { + glcache.UseProgram(g_abuffer_final_shader[0].program); + gl4ShaderUniforms.Set(&g_abuffer_final_shader[0]); + } glcache.Disable(GL_DEPTH_TEST); glcache.Disable(GL_CULL_FACE); glcache.Disable(GL_SCISSOR_TEST); glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT); + glcache.Disable(GL_BLEND); abufferDrawQuad(); diff --git a/core/rend/gl4/gl4.h b/core/rend/gl4/gl4.h index 0e68cce56..979bfcc36 100755 --- a/core/rend/gl4/gl4.h +++ b/core/rend/gl4/gl4.h @@ -45,6 +45,7 @@ struct gl4PipelineShader GLint fog_clamp_min, fog_clamp_max; GLint ndcMat; GLint palette_index; + GLint ditherColorMax; // Naomi2 GLint mvMat; @@ -98,7 +99,7 @@ struct gl4PipelineShader bool pp_Gouraud; bool pp_BumpMap; bool fog_clamping; - bool palette; + int palette; bool naomi2; bool divPosZ; }; @@ -180,7 +181,7 @@ bool gl4CompilePipelineShader(gl4PipelineShader* s, const char *pixel_source = n void initABuffer(); void termABuffer(); void reshapeABuffer(int width, int height); -void renderABuffer(); +void renderABuffer(bool lastPass); void DrawTranslucentModVols(int first, int count, bool useOpaqueGeom); void checkOverflowAndReset(); @@ -227,6 +228,7 @@ extern struct gl4ShaderUniforms_t int height; } base_clipping; int palette_index; + float ditherColorMax[4]; void setUniformArray(GLint location, int v0, int v1) { @@ -257,6 +259,7 @@ extern struct gl4ShaderUniforms_t glUniform4fv(s->fog_clamp_max, 1, fog_clamp_max); glUniformMatrix4fv(s->ndcMat, 1, GL_FALSE, &ndcMat[0][0]); glUniform1i(s->palette_index, palette_index); + glUniform4fv(s->ditherColorMax, 1, ditherColorMax); } } gl4ShaderUniforms; diff --git a/core/rend/gl4/gl4naomi2.cpp b/core/rend/gl4/gl4naomi2.cpp index 2ec1a12a1..b74cb91bd 100644 --- a/core/rend/gl4/gl4naomi2.cpp +++ b/core/rend/gl4/gl4naomi2.cpp @@ -34,6 +34,7 @@ N2Vertex4Source::N2Vertex4Source(const gl4PipelineShader* shader) : OpenGl4Sourc { addConstant("OIT_RENDER"); addConstant("DIV_POS_Z", false); + addConstant("MODIFIER_VOLUME", 0); if (shader == nullptr) { addConstant("POSITION_ONLY", 1); diff --git a/core/rend/gl4/gldraw.cpp b/core/rend/gl4/gldraw.cpp index 63ee638bb..efc2ae7c6 100644 --- a/core/rend/gl4/gldraw.cpp +++ b/core/rend/gl4/gldraw.cpp @@ -20,12 +20,10 @@ #include "rend/gles/glcache.h" #include "rend/gles/naomi2.h" #include "rend/tileclip.h" -#include "rend/osd.h" #include static gl4PipelineShader* CurrentShader; -extern u32 gcflip; GLuint geom_fbo; GLuint stencilTexId; GLuint opaqueTexId; @@ -37,7 +35,7 @@ GLuint depthSaveTexId; static gl4PipelineShader *gl4GetProgram(bool cp_AlphaTest, bool pp_InsideClipping, bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_TwoVolumes, bool pp_Gouraud, bool pp_BumpMap, bool fog_clamping, - bool palette, bool naomi2, Pass pass) + int palette, bool naomi2, Pass pass) { u32 rv=0; @@ -53,7 +51,7 @@ static gl4PipelineShader *gl4GetProgram(bool cp_AlphaTest, bool pp_InsideClippin rv <<= 1; rv |= (int)pp_Gouraud; rv <<= 1; rv |= (int)pp_BumpMap; rv <<= 1; rv |= (int)fog_clamping; - rv <<= 1; rv |= (int)palette; + rv <<= 2; rv |= palette; rv <<= 1; rv |= (int)naomi2; rv <<= 2; rv |= (int)pass; rv <<= 1; rv |= (int)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation); @@ -118,10 +116,20 @@ static void SetGPState(const PolyParam* gp) int clip_rect[4] = {}; TileClipping clipmode = GetTileClip(gp->tileclip, ViewportMatrix, clip_rect); - bool gpuPalette = false; + int gpuPalette = gp->texture == nullptr || !gp->texture->gpuPalette ? 0 + : gp->tsp.FilterMode + 1; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + } if (pass == Pass::Depth) { + if (Type != ListType_Punch_Through) + gpuPalette = 0; CurrentShader = gl4GetProgram(Type == ListType_Punch_Through ? true : false, clipmode == TileClipping::Inside, Type == ListType_Punch_Through ? gp->pcw.Texture : false, @@ -134,7 +142,7 @@ static void SetGPState(const PolyParam* gp) false, false, false, - false, + gpuPalette, gp->isNaomi2(), pass); } @@ -143,9 +151,7 @@ static void SetGPState(const PolyParam* gp) // Two volumes mode only supported for OP and PT bool two_volumes_mode = (gp->tsp1.full != (u32)-1) && Type != ListType_Translucent; bool color_clamp = gp->tsp.ColorClamp && (pvrrc.fog_clamp_min.full != 0 || pvrrc.fog_clamp_max.full != 0xffffffff); - int fog_ctrl = config::Fog ? gp->tsp.FogCtrl : 2; - gpuPalette = gp->texture != nullptr ? gp->texture->gpuPalette : false; CurrentShader = gl4GetProgram(Type == ListType_Punch_Through ? true : false, clipmode == TileClipping::Inside, @@ -165,7 +171,7 @@ static void SetGPState(const PolyParam* gp) } glcache.UseProgram(CurrentShader->program); - if (gpuPalette) + if (gpuPalette != 0) { if (gp->tcw.PixelFmt == PixelPal4) gl4ShaderUniforms.palette_index = gp->tcw.PalSelect << 4; @@ -179,7 +185,7 @@ static void SetGPState(const PolyParam* gp) gl4ShaderUniforms.tcw1 = gp->tcw1; gl4ShaderUniforms.Set(CurrentShader); - if (pass == Pass::Color && (Type == ListType_Translucent || Type == ListType_Punch_Through)) + if (pass == Pass::Color) { glcache.Enable(GL_BLEND); glcache.BlendFunc(SrcBlendGL[gp->tsp.SrcInstr], DstBlendGL[gp->tsp.DstInstr]); @@ -224,13 +230,14 @@ static void SetGPState(const PolyParam* gp) SetTextureRepeatMode(i, GL_TEXTURE_WRAP_T, tsp.ClampV, tsp.FlipV); bool nearest_filter; - if (config::TextureFiltering == 0) { + if (gpuPalette != 0) + nearest_filter = true; + else if (config::TextureFiltering == 0) nearest_filter = tsp.FilterMode == 0; - } else if (config::TextureFiltering == 1) { + else if (config::TextureFiltering == 1) nearest_filter = true; - } else { + else nearest_filter = false; - } bool mipmapped = gp->tcw.MipMapped != 0 && gp->tcw.ScanOrder == 0 && config::UseMipmaps; @@ -245,7 +252,7 @@ static void SetGPState(const PolyParam* gp) { //bilinear filtering //PowerVR supports also trilinear via two passes, but we ignore that for now - glSamplerParameteri(texSamplers[i], GL_TEXTURE_MIN_FILTER, mipmapped ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); + glSamplerParameteri(texSamplers[i], GL_TEXTURE_MIN_FILTER, mipmapped && Type != ListType_Punch_Through ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); glSamplerParameteri(texSamplers[i], GL_TEXTURE_MAG_FILTER, GL_LINEAR); } @@ -265,8 +272,7 @@ static void SetGPState(const PolyParam* gp) glActiveTexture(GL_TEXTURE0); } - //gcflip is global clip flip, needed for when rendering to texture due to mirrored Y direction - SetCull(gp->isp.CullMode ^ gcflip); + SetCull(gp->isp.CullMode ^ 1); //set Z mode, only if required if (Type == ListType_Punch_Through || (pass == Pass::Depth && SortingEnabled)) @@ -483,6 +489,28 @@ void gl4DrawStrips(GLuint output_fbo, int width, int height) { checkOverflowAndReset(); glBindFramebuffer(GL_FRAMEBUFFER, geom_fbo); + if (!pvrrc.isRTT) + { + glcache.Disable(GL_SCISSOR_TEST); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + if (pvrrc.clearFramebuffer) + { + // Clear framebuffer + glcache.ClearColor(VO_BORDER_COL.red(), VO_BORDER_COL.green(), VO_BORDER_COL.blue(), 1.f); + glClear(GL_COLOR_BUFFER_BIT); + } + else + { + // Copy previous framebuffer content (in case of partial render) + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, geom_fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, output_fbo); + glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glCheck(); + glBindFramebuffer(GL_FRAMEBUFFER, geom_fbo); + } + if (gl4ShaderUniforms.base_clipping.enabled) + glcache.Enable(GL_SCISSOR_TEST); + } if (texSamplers[0] == 0) glGenSamplers(2, texSamplers); @@ -688,7 +716,7 @@ void gl4DrawStrips(GLuint output_fbo, int width, int height) glBindSampler(0, 0); glcache.BindTexture(GL_TEXTURE_2D, opaqueTexId); - renderABuffer(); + renderABuffer(false); glcache.DeleteTextures(1, &opaqueTexId); opaqueTexId = texId; @@ -716,5 +744,5 @@ void gl4DrawStrips(GLuint output_fbo, int width, int height) glActiveTexture(GL_TEXTURE0); glBindSampler(0, 0); glcache.BindTexture(GL_TEXTURE_2D, opaqueTexId); - renderABuffer(); + renderABuffer(true); } diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index 413d175cf..ff0f64ec8 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -19,10 +19,10 @@ #include "gl4.h" #include "rend/gles/glcache.h" #include "rend/transform_matrix.h" -#include "rend/osd.h" #include "glsl.h" #include "gl4naomi2.h" #include "rend/gles/naomi2.h" +#include "rend/gles/quad.h" #ifdef LIBRETRO #include "rend/gles/postprocess.h" @@ -164,7 +164,7 @@ uniform sampler2D DepthTex; uniform float trilinear_alpha; uniform vec4 fog_clamp_min; uniform vec4 fog_clamp_max; -#if pp_Palette == 1 +#if pp_Palette != 0 uniform sampler2D palette; uniform int palette_index; #endif @@ -213,18 +213,53 @@ vec4 fog_clamp(vec4 col) #endif } +#if pp_Palette != 0 + +vec4 getPaletteEntry(float colIdx) +{ + int color_idx = int(floor(colIdx * 255.0 + 0.5)) + palette_index; + ivec2 c = ivec2(color_idx % 32, color_idx / 32); + return texelFetch(palette, c, 0); +} + +#endif + #if pp_Palette == 1 vec4 palettePixel(sampler2D tex, vec3 coords) { #if DIV_POS_Z == 1 - float colIdx = texture(tex, coords.xy).r; + return getPaletteEntry(texture(tex, coords.xy).r); #else - float colIdx = textureProj(tex, coords).r; + return getPaletteEntry(textureProj(tex, coords).r); #endif - int color_idx = int(floor(colIdx * 255.0 + 0.5)) + palette_index; - ivec2 c = ivec2(color_idx % 32, color_idx / 32); - return texelFetch(palette, c, 0); +} + +#elif pp_Palette == 2 + +vec4 palettePixelBilinear(sampler2D tex, vec3 coords) +{ +#if DIV_POS_Z == 0 + coords.xy /= coords.z; +#endif + vec2 texSize = vec2(textureSize(tex, 0)); + vec2 pixCoord = coords.xy * texSize - 0.5; // coordinates of top left pixel + vec2 originPixCoord = floor(pixCoord); + + vec2 sampleUV = (originPixCoord + 0.5) / texSize; // UV coordinates of center of top left pixel + + // Sample from all surrounding texels + vec4 c00 = getPaletteEntry(texture(tex, sampleUV).r); + vec4 c01 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(0, 1)).r); + vec4 c11 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 1)).r); + vec4 c10 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 0)).r); + + vec2 weight = pixCoord - originPixCoord; + + // Bi-linear mixing + vec4 temp0 = mix(c00, c10, weight.x); + vec4 temp1 = mix(c01, c11, weight.x); + return mix(temp0, temp1, weight.y); } #endif @@ -303,13 +338,20 @@ void main() #endif texcol = textureProj(tex0, vtx_uv); #endif - #else + #elif pp_Palette == 1 #if pp_TwoVolumes == 1 if (area1) texcol = palettePixel(tex1, vec3(vtx_uv1.xy, vtx_uv.z)); else #endif texcol = palettePixel(tex0, vtx_uv); + #else + #if pp_TwoVolumes == 1 + if (area1) + texcol = palettePixelBilinear(tex1, vec3(vtx_uv1.xy, vtx_uv.z)); + else + #endif + texcol = palettePixelBilinear(tex0, vtx_uv); #endif #if pp_BumpMap == 1 @@ -322,12 +364,6 @@ void main() IF(cur_ignore_tex_alpha) texcol.a=1.0; #endif - - #if cp_AlphaTest == 1 - if (cp_AlphaTestValue > texcol.a) - discard; - texcol.a = 1.0; - #endif #endif #if pp_ShadInstr==0 || pp_TwoVolumes == 1 // DECAL IF(cur_shading_instr == 0) @@ -385,6 +421,13 @@ void main() color *= trilinear_alpha; + #if cp_AlphaTest == 1 + color.a = round(color.a * 255.0) / 255.0; + if (cp_AlphaTestValue > color.a) + discard; + color.a = 1.0; + #endif + //color.rgb=vec3(gl_FragCoord.w * sp_FOG_DENSITY / 128.0); #if PASS == PASS_COLOR @@ -546,6 +589,7 @@ bool gl4CompilePipelineShader(gl4PipelineShader* s, const char *fragment_source if (gu != -1) glUniform1i(gu, 6); // GL_TEXTURE6 s->palette_index = glGetUniformLocation(s->program, "palette_index"); + s->ditherColorMax = glGetUniformLocation(s->program, "ditherColorMax"); if (s->naomi2) initN2Uniforms(s); @@ -598,6 +642,7 @@ static void create_modvol_shader() gl4.modvol_shader.ndcMat = glGetUniformLocation(gl4.modvol_shader.program, "ndcMat"); N2Vertex4Source n2VertexShader; + n2VertexShader.setConstant("MODIFIER_VOLUME", true); fragmentShader.setConstant("DIV_POS_Z", false); gl4.n2ModVolShader.program = gl_CompileAndLink(n2VertexShader.generate().c_str(), fragmentShader.generate().c_str()); gl4.n2ModVolShader.ndcMat = glGetUniformLocation(gl4.n2ModVolShader.program, "ndcMat"); @@ -625,7 +670,7 @@ static void gl_create_resources() } GlVertexArray::unbind(); - initQuad(); + gl.quad = std::make_unique(); glCheck(); } @@ -667,9 +712,10 @@ struct OpenGL4Renderer : OpenGLRenderer if (!config::EmulateFramebuffer) { - DrawOSD(false); - gl.ofbo2.ready = false; frameRendered = true; + clearLastFrame = false; + drawOSD(); + renderVideoRouting(); } restoreCurrentFramebuffer(); @@ -684,24 +730,6 @@ struct OpenGL4Renderer : OpenGLRenderer } bool renderFrame(int width, int height); - -#ifdef LIBRETRO - void DrawOSD(bool clearScreen) override - { - void DrawVmuTexture(u8 vmu_screen_number, int width, int height); - void DrawGunCrosshair(u8 port, int width, int height); - - if (settings.platform.isConsole()) - { - for (int vmu_screen_number = 0 ; vmu_screen_number < 4 ; vmu_screen_number++) - if (vmu_lcd_status[vmu_screen_number * 2]) - DrawVmuTexture(vmu_screen_number, width, height); - } - - for (int lightgun_port = 0 ; lightgun_port < 4 ; lightgun_port++) - DrawGunCrosshair(lightgun_port, width, height); - } -#endif }; //setup @@ -736,9 +764,9 @@ bool OpenGL4Renderer::Init() u32 dst[16]; UpscalexBRZ(2, src, dst, 2, 2, false); } - fog_needs_update = true; - forcePaletteUpdate(); + updateFogTable = true; TextureCacheData::SetDirectXColorOrder(false); + TextureCacheData::setUploadToGPUFlavor(); return true; } @@ -779,6 +807,9 @@ static void resize(int w, int h) bool OpenGL4Renderer::renderFrame(int width, int height) { + if (!config::EmulateFramebuffer) + initVideoRoutingFrameBuffer(); + const bool is_rtt = pvrrc.isRTT; TransformMatrix matrices(pvrrc, is_rtt ? pvrrc.getFramebufferWidth() : width, @@ -786,11 +817,6 @@ bool OpenGL4Renderer::renderFrame(int width, int height) gl4ShaderUniforms.ndcMat = matrices.GetNormalMatrix(); const glm::mat4& scissor_mat = matrices.GetScissorMatrix(); ViewportMatrix = matrices.GetViewportMatrix(); - - if (!is_rtt && !config::EmulateFramebuffer) - gcflip = 0; - else - gcflip = 1; /* Handle Dc to screen scaling @@ -800,8 +826,8 @@ bool OpenGL4Renderer::renderFrame(int width, int height) if (is_rtt) { float scaling = config::RenderToTextureBuffer ? 1.f : config::RenderResolution / 480.f; - rendering_width = matrices.GetDreamcastViewport().x * scaling; - rendering_height = matrices.GetDreamcastViewport().y * scaling; + rendering_width = pvrrc.getFramebufferWidth() * scaling; // FIXME hscale? + rendering_height = pvrrc.getFramebufferHeight() * scaling; } else { @@ -847,10 +873,8 @@ bool OpenGL4Renderer::renderFrame(int width, int height) #ifdef LIBRETRO if (config::EmulateFramebuffer) output_fbo = init_output_framebuffer(width, height); - else if (config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) - output_fbo = postProcessor.getFramebuffer(width, height); else - output_fbo = glsm_get_current_framebuffer(); + output_fbo = postProcessor.getFramebuffer(width, height); glViewport(0, 0, width, height); #else output_fbo = init_output_framebuffer(rendering_width, rendering_height); @@ -864,114 +888,104 @@ bool OpenGL4Renderer::renderFrame(int width, int height) if (!is_rtt) glcache.ClearColor(VO_BORDER_COL.red(), VO_BORDER_COL.green(), VO_BORDER_COL.blue(), 1.f); - if (!is_rtt && (FB_R_CTRL.fb_enable == 0 || VO_CONTROL.blank_video == 1)) - { - // Video output disabled - glBindFramebuffer(GL_FRAMEBUFFER, output_fbo); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClear(GL_COLOR_BUFFER_BIT); - } - else - { - //Main VBO - //move vertex to gpu - gl4.vbo.getVertexBuffer()->update(pvrrc.verts.data(), pvrrc.verts.size() * sizeof(decltype(*pvrrc.verts.data()))); - gl4.vbo.getIndexBuffer()->update(pvrrc.idx.data(), pvrrc.idx.size() * sizeof(decltype(*pvrrc.idx.data()))); + //Main VBO + //move vertex to gpu + gl4.vbo.getVertexBuffer()->update(pvrrc.verts.data(), pvrrc.verts.size() * sizeof(decltype(*pvrrc.verts.data()))); + gl4.vbo.getIndexBuffer()->update(pvrrc.idx.data(), pvrrc.idx.size() * sizeof(decltype(*pvrrc.idx.data()))); - //Modvol VBO - if (!pvrrc.modtrig.empty()) - gl4.vbo.getModVolBuffer()->update(pvrrc.modtrig.data(), pvrrc.modtrig.size() * sizeof(decltype(*pvrrc.modtrig.data()))); + //Modvol VBO + if (!pvrrc.modtrig.empty()) + gl4.vbo.getModVolBuffer()->update(pvrrc.modtrig.data(), pvrrc.modtrig.size() * sizeof(decltype(*pvrrc.modtrig.data()))); - // TR PolyParam data - if (!pvrrc.global_param_tr.empty()) + // TR PolyParam data + if (!pvrrc.global_param_tr.empty()) + { + std::vector trPolyParams(pvrrc.global_param_tr.size() * 2); + int i = 0; + for (const PolyParam& pp : pvrrc.global_param_tr) { - std::vector trPolyParams(pvrrc.global_param_tr.size() * 2); - int i = 0; - for (const PolyParam& pp : pvrrc.global_param_tr) - { - trPolyParams[i++] = (pp.tsp.full & 0xffff00c0) | ((pp.isp.full >> 16) & 0xe400) | ((pp.pcw.full >> 7) & 1); - trPolyParams[i++] = pp.tsp1.full; - } - gl4.vbo.getPolyParamBuffer()->update(trPolyParams.data(), trPolyParams.size() * sizeof(u32)); - // Declare storage - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, gl4.vbo.getPolyParamBuffer()->getName()); + trPolyParams[i++] = (pp.tsp.full & 0xffff00c0) | ((pp.isp.full >> 16) & 0xe400) | ((pp.pcw.full >> 7) & 1); + trPolyParams[i++] = pp.tsp1.full; } - glCheck(); + gl4.vbo.getPolyParamBuffer()->update(trPolyParams.data(), trPolyParams.size() * sizeof(u32)); + // Declare storage + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, gl4.vbo.getPolyParamBuffer()->getName()); + } + glCheck(); - if (is_rtt || !config::Widescreen || matrices.IsClipped() || config::Rotate90 || config::EmulateFramebuffer) + if (is_rtt || !config::Widescreen || matrices.IsClipped() || config::Rotate90 || config::EmulateFramebuffer) + { + float fWidth; + float fHeight; + float min_x; + float min_y; + if (!is_rtt) { - float fWidth; - float fHeight; - float min_x; - float min_y; - if (!is_rtt) + glm::vec4 clip_min(pvrrc.fb_X_CLIP.min, pvrrc.fb_Y_CLIP.min, 0, 1); + glm::vec4 clip_dim(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1, + pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1, 0, 0); + clip_min = scissor_mat * clip_min; + clip_dim = scissor_mat * clip_dim; + + min_x = clip_min[0]; + min_y = clip_min[1]; + fWidth = clip_dim[0]; + fHeight = clip_dim[1]; + if (fWidth < 0) + { + min_x += fWidth; + fWidth = -fWidth; + } + if (fHeight < 0) { - glm::vec4 clip_min(pvrrc.fb_X_CLIP.min, pvrrc.fb_Y_CLIP.min, 0, 1); - glm::vec4 clip_dim(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1, - pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1, 0, 0); - clip_min = scissor_mat * clip_min; - clip_dim = scissor_mat * clip_dim; - - min_x = clip_min[0]; - min_y = clip_min[1]; - fWidth = clip_dim[0]; - fHeight = clip_dim[1]; - if (fWidth < 0) - { - min_x += fWidth; - fWidth = -fWidth; - } - if (fHeight < 0) - { - min_y += fHeight; - fHeight = -fHeight; - } - if (matrices.GetSidebarWidth() > 0) - { - float scaled_offs_x = matrices.GetSidebarWidth(); - - glcache.Enable(GL_SCISSOR_TEST); - glcache.Scissor(0, 0, (GLsizei)lroundf(scaled_offs_x), rendering_height); - glClear(GL_COLOR_BUFFER_BIT); - glcache.Scissor((GLint)lroundf(rendering_width - scaled_offs_x), 0, (GLsizei)lroundf(scaled_offs_x) + 1, rendering_height); - glClear(GL_COLOR_BUFFER_BIT); - } + min_y += fHeight; + fHeight = -fHeight; } - else + if (matrices.GetSidebarWidth() > 0) { - fWidth = pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1; - fHeight = pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1; - min_x = pvrrc.fb_X_CLIP.min; - min_y = pvrrc.fb_Y_CLIP.min; - if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) - { - float scale = config::RenderResolution / 480.f; - min_x *= scale; - min_y *= scale; - fWidth *= scale; - fHeight *= scale; - } + float scaled_offs_x = matrices.GetSidebarWidth(); + + glcache.Enable(GL_SCISSOR_TEST); + glcache.Scissor(0, 0, (GLsizei)lroundf(scaled_offs_x), rendering_height); + glClear(GL_COLOR_BUFFER_BIT); + glcache.Scissor((GLint)lroundf(rendering_width - scaled_offs_x), 0, (GLsizei)lroundf(scaled_offs_x) + 1, rendering_height); + glClear(GL_COLOR_BUFFER_BIT); } - gl4ShaderUniforms.base_clipping.enabled = true; - gl4ShaderUniforms.base_clipping.x = (int)lroundf(min_x); - gl4ShaderUniforms.base_clipping.y = (int)lroundf(min_y); - gl4ShaderUniforms.base_clipping.width = (int)lroundf(fWidth); - gl4ShaderUniforms.base_clipping.height = (int)lroundf(fHeight); - glcache.Scissor(gl4ShaderUniforms.base_clipping.x, gl4ShaderUniforms.base_clipping.y, - gl4ShaderUniforms.base_clipping.width, gl4ShaderUniforms.base_clipping.height); - glcache.Enable(GL_SCISSOR_TEST); } else { - gl4ShaderUniforms.base_clipping.enabled = false; + min_x = (float)pvrrc.getFramebufferMinX(); + min_y = (float)pvrrc.getFramebufferMinY(); + fWidth = (float)pvrrc.getFramebufferWidth() - min_x; + fHeight = (float)pvrrc.getFramebufferHeight() - min_y; + if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) + { + float scale = config::RenderResolution / 480.f; + min_x *= scale; + min_y *= scale; + fWidth *= scale; + fHeight *= scale; + } } + gl4ShaderUniforms.base_clipping.enabled = true; + gl4ShaderUniforms.base_clipping.x = (int)lroundf(min_x); + gl4ShaderUniforms.base_clipping.y = (int)lroundf(min_y); + gl4ShaderUniforms.base_clipping.width = (int)lroundf(fWidth); + gl4ShaderUniforms.base_clipping.height = (int)lroundf(fHeight); + glcache.Scissor(gl4ShaderUniforms.base_clipping.x, gl4ShaderUniforms.base_clipping.y, + gl4ShaderUniforms.base_clipping.width, gl4ShaderUniforms.base_clipping.height); + glcache.Enable(GL_SCISSOR_TEST); + } + else + { + gl4ShaderUniforms.base_clipping.enabled = false; + } - gl4DrawStrips(output_fbo, rendering_width, rendering_height); + gl4DrawStrips(output_fbo, rendering_width, rendering_height); #ifdef LIBRETRO - if ((config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) && !is_rtt && !config::EmulateFramebuffer) - postProcessor.render(glsm_get_current_framebuffer()); + if (!is_rtt && !config::EmulateFramebuffer) + postProcessor.render(glsm_get_current_framebuffer()); #endif - } if (is_rtt) ReadRTTBuffer(); @@ -981,6 +995,7 @@ bool OpenGL4Renderer::renderFrame(int width, int height) { gl.ofbo.aspectRatio = getOutputFramebufferAspectRatio(); #ifndef LIBRETRO + gl.ofbo2.ready = false; renderLastFrame(); #endif } diff --git a/core/rend/gl4/glsl.h b/core/rend/gl4/glsl.h index 4eb50c354..5bcc33942 100644 --- a/core/rend/gl4/glsl.h +++ b/core/rend/gl4/glsl.h @@ -45,7 +45,7 @@ void setFragDepth(float z) \n\ #else \n\ float w = 100000.0 * z; \n\ #endif \n\ - gl_FragDepth = log2(1.0 + w) / 34.0; \n\ + gl_FragDepth = log2(1.0 + max(w, -0.999999)) / 34.0; \n\ } \n\ \n\ struct PolyParam { \n\ diff --git a/core/rend/gles/gldraw.cpp b/core/rend/gles/gldraw.cpp index f50a4b536..38239508e 100644 --- a/core/rend/gles/gldraw.cpp +++ b/core/rend/gles/gldraw.cpp @@ -1,10 +1,14 @@ #include "glcache.h" #include "gles.h" +#include "quad.h" #include "rend/tileclip.h" #include "rend/osd.h" #include "naomi2.h" #include "rend/transform_matrix.h" +#ifdef LIBRETRO #include "postprocess.h" +#include "vmu_xhair.h" +#endif #include @@ -71,7 +75,6 @@ const u32 SrcBlendGL[] = }; PipelineShader* CurrentShader; -u32 gcflip; void SetCull(u32 CullMode) { @@ -103,26 +106,49 @@ static void SetBaseClipping() glcache.Disable(GL_SCISSOR_TEST); } +static TileClipping setTileClip(u32 tileclip, int clip_rect[4]) +{ + TileClipping clipmode = GetTileClip(tileclip, ViewportMatrix, clip_rect); + if (clipmode == TileClipping::Outside) + { + glcache.Enable(GL_SCISSOR_TEST); + glcache.Scissor(clip_rect[0], clip_rect[1], clip_rect[2], clip_rect[3]); + } + else { + SetBaseClipping(); + } + return clipmode; +} + template void SetGPState(const PolyParam* gp,u32 cflip=0) { + float trilinear_alpha; if (gp->pcw.Texture && gp->tsp.FilterMode > 1 && Type != ListType_Punch_Through && gp->tcw.MipMapped == 1) { - ShaderUniforms.trilinear_alpha = 0.25f * (gp->tsp.MipMapD & 0x3); + trilinear_alpha = 0.25f * (gp->tsp.MipMapD & 0x3); if (gp->tsp.FilterMode == 2) // Trilinear pass A - ShaderUniforms.trilinear_alpha = 1.f - ShaderUniforms.trilinear_alpha; + trilinear_alpha = 1.f - trilinear_alpha; } else - ShaderUniforms.trilinear_alpha = 1.f; + trilinear_alpha = 1.f; bool color_clamp = gp->tsp.ColorClamp && (pvrrc.fog_clamp_min.full != 0 || pvrrc.fog_clamp_max.full != 0xffffffff); int fog_ctrl = config::Fog ? gp->tsp.FogCtrl : 2; int clip_rect[4] = {}; - TileClipping clipmode = GetTileClip(gp->tileclip, ViewportMatrix, clip_rect); + TileClipping clipmode = setTileClip(gp->tileclip, clip_rect); TextureCacheData *texture = (TextureCacheData *)gp->texture; - bool gpuPalette = texture != nullptr ? texture->gpuPalette : false; + int gpuPalette = texture == nullptr || !texture->gpuPalette ? 0 + : gp->tsp.FilterMode + 1; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + } CurrentShader = GetProgram(Type == ListType_Punch_Through ? true : false, clipmode == TileClipping::Inside, @@ -135,32 +161,32 @@ void SetGPState(const PolyParam* gp,u32 cflip=0) gp->pcw.Gouraud, gp->tcw.PixelFmt == PixelBumpMap, color_clamp, - ShaderUniforms.trilinear_alpha != 1.f, + trilinear_alpha != 1.f, gpuPalette, - gp->isNaomi2()); + gp->isNaomi2(), + ShaderUniforms.dithering); glcache.UseProgram(CurrentShader->program); if (CurrentShader->trilinear_alpha != -1) - glUniform1f(CurrentShader->trilinear_alpha, ShaderUniforms.trilinear_alpha); - if (gpuPalette) + glUniform1f(CurrentShader->trilinear_alpha, trilinear_alpha); + if (gpuPalette != 0) { + int paletteIndex; if (gp->tcw.PixelFmt == PixelPal4) - ShaderUniforms.palette_index = gp->tcw.PalSelect << 4; + paletteIndex = gp->tcw.PalSelect << 4; else - ShaderUniforms.palette_index = (gp->tcw.PalSelect >> 4) << 8; - glUniform1i(CurrentShader->palette_index, ShaderUniforms.palette_index); + paletteIndex = (gp->tcw.PalSelect >> 4) << 8; + glUniform1i(CurrentShader->palette_index, paletteIndex); + if (gpuPalette == 2 && CurrentShader->texSize != -1) + { + float texSize[] { (float)texture->width, (float)texture->height }; + glUniform2fv(CurrentShader->texSize, 1, texSize); + } } if (clipmode == TileClipping::Inside) glUniform4f(CurrentShader->pp_ClipTest, (float)clip_rect[0], (float)clip_rect[1], (float)(clip_rect[0] + clip_rect[2]), (float)(clip_rect[1] + clip_rect[3])); - if (clipmode == TileClipping::Outside) - { - glcache.Enable(GL_SCISSOR_TEST); - glcache.Scissor(clip_rect[0], clip_rect[1], clip_rect[2], clip_rect[3]); - } - else - SetBaseClipping(); if (config::ModifierVolumes) { @@ -178,13 +204,14 @@ void SetGPState(const PolyParam* gp,u32 cflip=0) SetTextureRepeatMode(GL_TEXTURE_WRAP_T, gp->tsp.ClampV, gp->tsp.FlipV); bool nearest_filter; - if (config::TextureFiltering == 0) { - nearest_filter = gp->tsp.FilterMode == 0 || gpuPalette; - } else if (config::TextureFiltering == 1) { + if (gpuPalette != 0) + nearest_filter = true; + else if (config::TextureFiltering == 0) + nearest_filter = gp->tsp.FilterMode == 0; + else if (config::TextureFiltering == 1) nearest_filter = true; - } else { + else nearest_filter = false; - } bool mipmapped = texture->IsMipmapped(); @@ -199,7 +226,7 @@ void SetGPState(const PolyParam* gp,u32 cflip=0) { //bilinear filtering //PowerVR supports also trilinear via two passes, but we ignore that for now - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapped ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mipmapped && Type != ListType_Punch_Through ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } @@ -215,7 +242,7 @@ void SetGPState(const PolyParam* gp,u32 cflip=0) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, std::min(config::AnisotropicFiltering, gl.max_anisotropy)); // Set the recommended minification filter for best results - if (mipmapped) + if (mipmapped && Type != ListType_Punch_Through) glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } else @@ -224,18 +251,13 @@ void SetGPState(const PolyParam* gp,u32 cflip=0) } // Apparently punch-through polys support blending, or at least some combinations - if (Type == ListType_Translucent || Type == ListType_Punch_Through) - { - glcache.Enable(GL_BLEND); - glcache.BlendFunc(SrcBlendGL[gp->tsp.SrcInstr],DstBlendGL[gp->tsp.DstInstr]); - } - else - glcache.Disable(GL_BLEND); + // Opaque polygons support blending in list continuations (wild guess) + glcache.Enable(GL_BLEND); + glcache.BlendFunc(SrcBlendGL[gp->tsp.SrcInstr],DstBlendGL[gp->tsp.DstInstr]); //set cull mode ! //cflip is required when exploding triangles for triangle sorting - //gcflip is global clip flip, needed for when rendering to texture due to mirrored Y direction - SetCull(gp->isp.CullMode^cflip^gcflip); + SetCull(gp->isp.CullMode ^ cflip ^ 1); //set Z mode, only if required if (Type == ListType_Punch_Through || (Type == ListType_Translucent && SortingEnabled)) @@ -327,7 +349,7 @@ static void drawSorted(int first, int count, bool multipass) // FIXME no clipping in modvol shader //SetTileClip(gp->tileclip,true); - SetCull(params->isp.CullMode ^ gcflip); + SetCull(params->isp.CullMode ^ 1); glDrawElements(GL_TRIANGLES, pvrrc.sortedTriangles[p].count, gl.index_type, (GLvoid*)(gl.get_index_size() * pvrrc.sortedTriangles[p].first)); @@ -520,6 +542,9 @@ void DrawModVols(int first, int count) { glcache.UseProgram(gl.modvol_shader.program); } + int clip_rect[4]; + setTileClip(param.tileclip, clip_rect); + // TODO inside clipping u32 mv_mode = param.isp.DepthMode; @@ -545,6 +570,7 @@ void DrawModVols(int first, int count) SetCull(0); //enable color writes glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + SetBaseClipping(); //black out any stencil with '1' glcache.Enable(GL_BLEND); @@ -618,15 +644,13 @@ void DrawStrips() void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info) { + initVideoRoutingFrameBuffer(); glReadFramebuffer(info); saveCurrentFramebuffer(); getVideoShift(gl.ofbo.shiftX, gl.ofbo.shiftY); #ifdef LIBRETRO - if (config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) - { - glBindFramebuffer(GL_FRAMEBUFFER, postProcessor.getFramebuffer(gl.dcfb.width, gl.dcfb.height)); - glcache.BindTexture(GL_TEXTURE_2D, gl.dcfb.tex); - } + glBindFramebuffer(GL_FRAMEBUFFER, postProcessor.getFramebuffer(gl.dcfb.width, gl.dcfb.height)); + glcache.BindTexture(GL_TEXTURE_2D, gl.dcfb.tex); #else if (gl.ofbo2.framebuffer != nullptr && (gl.dcfb.width != gl.ofbo2.framebuffer->getWidth() || gl.dcfb.height != gl.ofbo2.framebuffer->getHeight())) @@ -655,17 +679,18 @@ void OpenGLRenderer::RenderFramebuffer(const FramebufferInfo& info) else { glcache.Disable(GL_BLEND); - drawQuad(gl.dcfb.tex, false, true); + gl.quad->draw(gl.dcfb.tex, false, false); } #ifdef LIBRETRO - if (config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) - postProcessor.render(glsm_get_current_framebuffer()); + postProcessor.render(glsm_get_current_framebuffer()); #else renderLastFrame(); #endif - DrawOSD(false); + drawOSD(); frameRendered = true; + clearLastFrame = false; + renderVideoRouting(); restoreCurrentFramebuffer(); } @@ -692,18 +717,18 @@ void writeFramebufferToVRAM() if (gl.fbscaling.framebuffer == nullptr) gl.fbscaling.framebuffer = std::make_unique(scaledW, scaledH); - if (gl.gl_major < 3) + if (gl.bogusBlitFramebuffer) { gl.fbscaling.framebuffer->bind(); glViewport(0, 0, scaledW, scaledH); glcache.Disable(GL_SCISSOR_TEST); - glcache.ClearColor(1.f, 0.f, 0.f, 1.f); + glcache.ClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_COLOR_BUFFER_BIT); glcache.BindTexture(GL_TEXTURE_2D, gl.ofbo.framebuffer->getTexture()); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glcache.Disable(GL_BLEND); - drawQuad(gl.ofbo.framebuffer->getTexture(), false); + gl.quad->draw(gl.ofbo.framebuffer->getTexture(), false); } else { @@ -764,7 +789,7 @@ bool OpenGLRenderer::renderLastFrame() else dx = (int)roundf(settings.display.width * (1 - renderAR / screenAR) / 2.f); - if (gl.gl_major < 3 || config::Rotate90) + if (gl.bogusBlitFramebuffer || config::Rotate90) { glViewport(dx, dy, settings.display.width - dx * 2, settings.display.height - dy * 2); glBindFramebuffer(GL_FRAMEBUFFER, gl.ofbo.origFbo); @@ -776,19 +801,19 @@ bool OpenGLRenderer::renderLastFrame() if (gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) { static float sverts[20] = { - -1.f, 1.f, 1.f, 0.f, 1.f, - -1.f, -1.f, 1.f, 0.f, 0.f, - 1.f, 1.f, 1.f, 1.f, 1.f, - 1.f, -1.f, 1.f, 1.f, 0.f, + -1.f, -1.f, 1.f, 0.f, 1.f, + -1.f, 1.f, 1.f, 0.f, 0.f, + 1.f, -1.f, 1.f, 1.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 0.f, }; sverts[0] = sverts[5] = -1.f + gl.ofbo.shiftX * 2.f / framebuffer->getWidth(); sverts[10] = sverts[15] = sverts[0] + 2; - sverts[1] = sverts[11] = 1.f - gl.ofbo.shiftY * 2.f / framebuffer->getHeight(); - sverts[6] = sverts[16] = sverts[1] - 2; + sverts[1] = sverts[11] = -1.f - gl.ofbo.shiftY * 2.f / framebuffer->getHeight(); + sverts[6] = sverts[16] = sverts[1] + 2; vertices = sverts; } glcache.Disable(GL_BLEND); - drawQuad(framebuffer->getTexture(), config::Rotate90, false, vertices); + gl.quad->draw(framebuffer->getTexture(), config::Rotate90, true, vertices); } else { @@ -797,8 +822,8 @@ bool OpenGLRenderer::renderLastFrame() glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gl.ofbo.origFbo); glcache.ClearColor(VO_BORDER_COL.red(), VO_BORDER_COL.green(), VO_BORDER_COL.blue(), 1.f); glClear(GL_COLOR_BUFFER_BIT); - glBlitFramebuffer(-gl.ofbo.shiftX, gl.ofbo.shiftY, framebuffer->getWidth() - gl.ofbo.shiftX, framebuffer->getHeight() + gl.ofbo.shiftY, - dx, dy, settings.display.width - dx, settings.display.height - dy, + glBlitFramebuffer(-gl.ofbo.shiftX, -gl.ofbo.shiftY, framebuffer->getWidth() - gl.ofbo.shiftX, framebuffer->getHeight() - gl.ofbo.shiftY, + dx, settings.display.height - dy, settings.display.width - dx, dy, GL_COLOR_BUFFER_BIT, config::TextureFiltering == 1 ? GL_NEAREST : GL_LINEAR); glBindFramebuffer(GL_FRAMEBUFFER, gl.ofbo.origFbo); #endif @@ -806,57 +831,163 @@ bool OpenGLRenderer::renderLastFrame() return true; } -#ifdef LIBRETRO -#include "vmu_xhair.h" +bool OpenGLRenderer::GetLastFrame(std::vector& data, int& width, int& height) +{ + GlFramebuffer *framebuffer = gl.ofbo2.ready ? gl.ofbo2.framebuffer.get() : gl.ofbo.framebuffer.get(); + if (framebuffer == nullptr) + return false; + if (width != 0) { + height = width / gl.ofbo.aspectRatio; + } + else if (height != 0) { + width = gl.ofbo.aspectRatio * height; + } + else + { + width = framebuffer->getWidth(); + height = framebuffer->getHeight(); + if (config::Rotate90) + std::swap(width, height); + // We need square pixels for PNG + int w = gl.ofbo.aspectRatio * height; + if (width > w) + height = width / gl.ofbo.aspectRatio; + else + width = w; + } + + GlFramebuffer dstFramebuffer(width, height, false, false); + + glViewport(0, 0, width, height); + glcache.Disable(GL_BLEND); + verify(framebuffer->getTexture() != 0); + const float *vertices = nullptr; + if (config::Rotate90) + { + static float rvertices[4][5] = { + { -1.f, 1.f, 1.f, 1.f, 0.f }, + { -1.f, -1.f, 1.f, 1.f, 1.f }, + { 1.f, 1.f, 1.f, 0.f, 0.f }, + { 1.f, -1.f, 1.f, 0.f, 1.f }, + }; + vertices = &rvertices[0][0]; + } + gl.quad->draw(framebuffer->getTexture(), config::Rotate90, false, vertices); + + data.resize(width * height * 3); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + if (gl.is_gles) + { + // GL_RGB not supported + std::vector tmp(width * height * 4); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, tmp.data()); + u8 *dst = data.data(); + const u8 *src = tmp.data(); + while (src <= &tmp.back()) + { + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + src++; + } + } + else { + glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, data.data()); + } + restoreCurrentFramebuffer(); + glCheck(); + + return true; +} -static GLuint vmuTextureId[4] {}; -static GLuint lightgunTextureId[4] {}; +static GLuint vmuTextureId[8] {}; +static GLuint lightgunTextureId {}; +static u64 vmuLastUpdated[8] {}; -static void updateVmuTexture(int vmu_screen_number) +static void updateVmuTexture(int vmuIndex) { - if (vmuTextureId[vmu_screen_number] == 0) + if (vmuTextureId[vmuIndex] == 0) { - vmuTextureId[vmu_screen_number] = glcache.GenTexture(); - glcache.BindTexture(GL_TEXTURE_2D, vmuTextureId[vmu_screen_number]); + vmuTextureId[vmuIndex] = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, vmuTextureId[vmuIndex]); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } else - glcache.BindTexture(GL_TEXTURE_2D, vmuTextureId[vmu_screen_number]); - + glcache.BindTexture(GL_TEXTURE_2D, vmuTextureId[vmuIndex]); - const u32 *data = vmu_lcd_data[vmu_screen_number * 2]; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, VMU_SCREEN_WIDTH, VMU_SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + const u32 *data = vmu_lcd_data[vmuIndex]; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 48, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - vmu_lcd_changed[vmu_screen_number * 2] = false; + vmuLastUpdated[vmuIndex] = vmuLastChanged[vmuIndex]; } -void DrawVmuTexture(u8 vmu_screen_number, int width, int height) +static void drawVmuTexture(u8 vmuIndex, int width, int height) { - constexpr float vmu_padding = 8.f; - float x = vmu_padding; - float y = vmu_padding; - float w = (float)VMU_SCREEN_WIDTH * vmu_screen_params[vmu_screen_number].vmu_screen_size_mult * 4.f / 3.f / gl.ofbo.aspectRatio; - float h = (float)VMU_SCREEN_HEIGHT * vmu_screen_params[vmu_screen_number].vmu_screen_size_mult; - - if (vmu_lcd_changed[vmu_screen_number * 2] || vmuTextureId[vmu_screen_number] == 0) - updateVmuTexture(vmu_screen_number); - - switch (vmu_screen_params[vmu_screen_number].vmu_screen_position) - { - case UPPER_LEFT: - break; - case UPPER_RIGHT: - x = width - x - w; - break; - case LOWER_LEFT: - y = height - y - h; - break; - case LOWER_RIGHT: - x = width - x - w; - y = height - y - h; - break; + const float *color = nullptr; +#ifndef LIBRETRO + const float vmu_padding = 8.f * settings.display.uiScale; + const float w = 96.f * settings.display.uiScale; + const float h = 64.f * settings.display.uiScale; + + float x; + float y; + if (vmuIndex & 2) + x = width - vmu_padding - w; + else + x = vmu_padding; + if (vmuIndex & 4) + { + y = height - vmu_padding - h; + if (vmuIndex & 1) + y -= vmu_padding + h; + } + else + { + y = vmu_padding; + if (vmuIndex & 1) + y += vmu_padding + h; + } + const float blend_factor[4] = { 0.75f, 0.75f, 0.75f, 0.75f }; + color = blend_factor; +#else + if (vmuIndex & 1) + return; + const float vmu_padding_x = 8.f * width / 640.f * 4.f / 3.f / gl.ofbo.aspectRatio; + const float vmu_padding_y = 8.f * height / 480.f; + const float w = (float)VMU_SCREEN_WIDTH * width / 640.f * 4.f / 3.f / gl.ofbo.aspectRatio + * vmu_screen_params[vmuIndex / 2].vmu_screen_size_mult; + const float h = (float)VMU_SCREEN_HEIGHT * height / 480.f + * vmu_screen_params[vmuIndex / 2].vmu_screen_size_mult; + + float x; + float y; + + switch (vmu_screen_params[vmuIndex / 2].vmu_screen_position) + { + case UPPER_LEFT: + default: + x = vmu_padding_x; + y = vmu_padding_y; + break; + case UPPER_RIGHT: + x = width - vmu_padding_x - w; + y = vmu_padding_y; + break; + case LOWER_LEFT: + x = vmu_padding_x; + y = height - vmu_padding_y - h; + break; + case LOWER_RIGHT: + x = width - vmu_padding_x - w; + y = height - vmu_padding_y - h; + break; } +#endif + + if (vmuLastChanged[vmuIndex] != vmuLastUpdated[vmuIndex] || vmuTextureId[vmuIndex] == 0) + updateVmuTexture(vmuIndex); + float x1 = (x + w) * 2 / width - 1; float y1 = -(y + h) * 2 / height + 1; x = x * 2 / width - 1; @@ -869,92 +1000,85 @@ void DrawVmuTexture(u8 vmu_screen_number, int width, int height) }; glcache.Enable(GL_BLEND); glcache.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - drawQuad(vmuTextureId[vmu_screen_number], false, false, vertices); + gl.quad->draw(vmuTextureId[vmuIndex], false, false, vertices, color); } -static void updateLightGunTexture(int port) +static void updateLightGunTexture() { - s32 x,y ; - u8 temp_tex_buffer[LIGHTGUN_CROSSHAIR_SIZE*LIGHTGUN_CROSSHAIR_SIZE*4]; - u8 *dst = temp_tex_buffer; - u8 *src = NULL ; - - if (lightgunTextureId[port] == 0) + if (lightgunTextureId == 0) { - lightgunTextureId[port] = glcache.GenTexture(); - glcache.BindTexture(GL_TEXTURE_2D, lightgunTextureId[port]); + lightgunTextureId = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, lightgunTextureId); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, getCrosshairTextureData()); } - else - glcache.BindTexture(GL_TEXTURE_2D, lightgunTextureId[port]); - - u8* colour = &( lightgun_palette[ lightgun_params[port].colour * 3 ] ); - - for ( y = LIGHTGUN_CROSSHAIR_SIZE-1 ; y >= 0 ; y--) - { - src = lightgun_img_crosshair + (y*LIGHTGUN_CROSSHAIR_SIZE) ; - - for ( x = 0 ; x < LIGHTGUN_CROSSHAIR_SIZE ; x++) - { - if ( src[x] ) - { - *dst++ = colour[0] ; - *dst++ = colour[1] ; - *dst++ = colour[2] ; - *dst++ = 0xFF ; - } - else - { - *dst++ = 0 ; - *dst++ = 0 ; - *dst++ = 0 ; - *dst++ = 0 ; - } - } - } - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, LIGHTGUN_CROSSHAIR_SIZE, LIGHTGUN_CROSSHAIR_SIZE, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp_tex_buffer); - - lightgun_params[port].dirty = false; } -void DrawGunCrosshair(u8 port, int width, int height) +static void drawGunCrosshair(u8 port, int width, int height) { - if (lightgun_params[port].offscreen || lightgun_params[port].colour == 0) - return; - - float w = (float)LIGHTGUN_CROSSHAIR_SIZE * 4.f / 3.f / gl.ofbo.aspectRatio; - float h = (float)LIGHTGUN_CROSSHAIR_SIZE; auto [x, y] = getCrosshairPosition(port); - x -= w / 2; - y -= h / 2; +#ifdef LIBRETRO + float halfWidth = lightgun_crosshair_size / 2.f / config::ScreenStretching * 100.f * config::RenderResolution / 480.f; + float halfHeight = lightgun_crosshair_size / 2.f * config::RenderResolution / 480.f; + x /= config::ScreenStretching / 100.f; +#else + float halfWidth = config::CrosshairSize * settings.display.uiScale / 2.f; + float halfHeight = halfWidth; +#endif - if (lightgun_params[port].dirty || lightgunTextureId[port] == 0) - updateLightGunTexture(port); + updateLightGunTexture(); - float x1 = (x + w) * 2 / width - 1; - float y1 = -(y + h) * 2 / height + 1; - x = x * 2 / width - 1; - y = -y * 2 / height + 1; + float x1 = (x + halfWidth) * 2 / width - 1; + float y1 = -(y + halfHeight) * 2 / height + 1; + x = (x - halfWidth) * 2 / width - 1; + y = -(y - halfHeight) * 2 / height + 1; float vertices[20] = { x, y1, 1.f, 0.f, 0.f, x, y, 1.f, 0.f, 1.f, x1, y1, 1.f, 1.f, 0.f, x1, y, 1.f, 1.f, 1.f, }; + const float color[4] = { + (config::CrosshairColor[port] & 0xff) / 255.f, + ((config::CrosshairColor[port] >> 8) & 0xff) / 255.f, + ((config::CrosshairColor[port] >> 16) & 0xff) / 255.f, + ((config::CrosshairColor[port] >> 24) & 0xff) / 255.f + }; glcache.Enable(GL_BLEND); - glcache.BlendFunc(GL_SRC_ALPHA, GL_ONE); - drawQuad(lightgunTextureId[port], false, false, vertices); - glcache.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + gl.quad->draw(lightgunTextureId, false, false, vertices, color); +} + +void drawVmusAndCrosshairs(int width, int height) +{ +#ifndef LIBRETRO + width = settings.display.width; + height = settings.display.height; + glViewport(0, 0, width, height); + glBindFramebuffer(GL_FRAMEBUFFER, gl.ofbo.origFbo); + const bool showVmus = config::FloatVMUs; +#else + const bool showVmus = true; +#endif + + if (settings.platform.isConsole() && showVmus) + { + for (int i = 0; i < 8 ; i++) + if (vmu_lcd_status[i]) + drawVmuTexture(i, width, height); + } + + for (int i = 0 ; i < 4 ; i++) + if (crosshairNeeded(i)) + drawGunCrosshair(i, width, height); + glCheck(); } void termVmuLightgun() { glcache.DeleteTextures(std::size(vmuTextureId), vmuTextureId); memset(vmuTextureId, 0, sizeof(vmuTextureId)); - glcache.DeleteTextures(std::size(lightgunTextureId), lightgunTextureId); - memset(lightgunTextureId, 0, sizeof(lightgunTextureId)); + glcache.DeleteTextures(1, &lightgunTextureId); + lightgunTextureId = 0; } -#endif diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index 9ff78586d..d2d7b7ffd 100644 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -1,18 +1,17 @@ #include "glcache.h" #include "gles.h" +#include "quad.h" #include "hw/pvr/ta.h" #ifndef LIBRETRO -#include "rend/gui.h" +#include "ui/gui.h" #else +#include "rend/gles/postprocess.h" #include "vmu_xhair.h" #endif -#include "rend/osd.h" -#include "rend/TexCache.h" #include "rend/transform_matrix.h" #include "wsi/gl_context.h" #include "emulator.h" #include "naomi2.h" -#include "rend/gles/postprocess.h" #ifdef TEST_AUTOMATION #include "cfg/cfg.h" @@ -49,7 +48,7 @@ const char* ShaderCompatSource = R"( #if TARGET_GL == GLES3 out highp vec4 FragColor; #define gl_FragColor FragColor -#define FOG_CHANNEL a +#define FOG_CHANNEL r #elif TARGET_GL == GL3 out highp vec4 FragColor; #define gl_FragColor FragColor @@ -132,7 +131,7 @@ const char* PixelPipelineShader = R"( /* Shader program params*/ /* gles has no alpha test stage, so its emulated on the shader */ -uniform lowp float cp_AlphaTestValue; +uniform highp float cp_AlphaTestValue; uniform lowp vec4 pp_ClipTest; uniform lowp vec3 sp_FOG_COL_RAM,sp_FOG_COL_VERT; uniform highp float sp_FOG_DENSITY; @@ -140,9 +139,15 @@ uniform sampler2D tex,fog_table; uniform lowp float trilinear_alpha; uniform lowp vec4 fog_clamp_min; uniform lowp vec4 fog_clamp_max; -#if pp_Palette == 1 +#if pp_Palette != 0 uniform sampler2D palette; uniform mediump int palette_index; +#if TARGET_GL == GLES2 || TARGET_GL == GL2 +uniform lowp vec2 texSize; +#endif +#endif +#if DITHERING == 1 +uniform lowp vec4 ditherColorMax; #endif /* Vertex input*/ @@ -177,20 +182,15 @@ highp vec4 fog_clamp(lowp vec4 col) #endif } -#if pp_Palette == 1 +#if pp_Palette != 0 -lowp vec4 palettePixel(highp vec3 coords) +lowp vec4 getPaletteEntry(highp float colorIndex) { + highp int color_idx = int(floor(colorIndex * 255.0 + 0.5)) + palette_index; #if TARGET_GL == GLES2 || TARGET_GL == GL2 - highp int color_idx = int(floor(texture(tex, coords.xy).FOG_CHANNEL * 255.0 + 0.5)) + palette_index; highp vec2 c = vec2((mod(float(color_idx), 32.0) * 2.0 + 1.0) / 64.0, (float(color_idx / 32) * 2.0 + 1.0) / 64.0); return texture(palette, c); #else - #if DIV_POS_Z == 1 - highp int color_idx = int(floor(texture(tex, coords.xy).FOG_CHANNEL * 255.0 + 0.5)) + palette_index; - #else - highp int color_idx = int(floor(textureProj(tex, coords).FOG_CHANNEL * 255.0 + 0.5)) + palette_index; - #endif highp ivec2 c = ivec2(color_idx % 32, color_idx / 32); return texelFetch(palette, c, 0); #endif @@ -198,6 +198,56 @@ lowp vec4 palettePixel(highp vec3 coords) #endif +#if pp_Palette == 1 // Nearest filtering + +lowp vec4 palettePixel(highp vec3 coords) +{ +#if TARGET_GL != GLES2 && TARGET_GL != GL2 && DIV_POS_Z != 1 + coords.xy /= coords.z; +#endif + return getPaletteEntry(texture(tex, coords.xy).FOG_CHANNEL); +} + +#elif pp_Palette == 2 // Bi-linear filtering + +lowp vec4 palettePixelBilinear(highp vec3 coords) +{ +#if TARGET_GL != GLES2 && TARGET_GL != GL2 && DIV_POS_Z != 1 + coords.xy /= coords.z; +#endif +#if TARGET_GL != GLES2 && TARGET_GL != GL2 + lowp vec2 texSize = vec2(textureSize(tex, 0)); +#endif + highp vec2 pixCoord = coords.xy * texSize - 0.5; // coordinates of top left pixel + highp vec2 originPixCoord = floor(pixCoord); + + highp vec2 sampleUV = (originPixCoord + 0.5) / texSize; // UV coordinates of center of top left pixel + + // Sample from all surrounding texels + lowp vec4 c00 = getPaletteEntry(texture(tex, sampleUV).FOG_CHANNEL); +#if TARGET_GL != GLES2 && TARGET_GL != GL2 + lowp vec4 c01 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(0, 1)).FOG_CHANNEL); + lowp vec4 c11 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 1)).FOG_CHANNEL); + lowp vec4 c10 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 0)).FOG_CHANNEL); +#else + sampleUV = (originPixCoord + vec2(0.5, 1.5)) / texSize; + lowp vec4 c01 = getPaletteEntry(texture(tex, sampleUV).FOG_CHANNEL); + sampleUV = (originPixCoord + vec2(1.5, 1.5)) / texSize; + lowp vec4 c11 = getPaletteEntry(texture(tex, sampleUV).FOG_CHANNEL); + sampleUV = (originPixCoord + vec2(1.5, 0.5)) / texSize; + lowp vec4 c10 = getPaletteEntry(texture(tex, sampleUV).FOG_CHANNEL); +#endif + + highp vec2 weight = pixCoord - originPixCoord; + + // Bi-linear mixing + lowp vec4 temp0 = mix(c00, c10, weight.x); + lowp vec4 temp1 = mix(c01, c11, weight.x); + return mix(temp0, temp1, weight.y); +} + +#endif + #if TARGET_GL == GLES2 #define depth gl_FragCoord.w #else @@ -233,8 +283,10 @@ void main() #else lowp vec4 texcol = textureProj(tex, vtx_uv); #endif - #else + #elif pp_Palette == 1 lowp vec4 texcol = palettePixel(vtx_uv); + #else + lowp vec4 texcol = palettePixelBilinear(vtx_uv); #endif #if pp_BumpMap == 1 @@ -246,12 +298,6 @@ void main() #if pp_IgnoreTexA==1 texcol.a=1.0; #endif - - #if cp_AlphaTest == 1 - if (cp_AlphaTestValue > texcol.a) - discard; - texcol.a = 1.0; - #endif #endif #if pp_ShadInstr==0 { @@ -294,6 +340,13 @@ void main() color *= trilinear_alpha; #endif + #if cp_AlphaTest == 1 + color.a = floor(color.a * 255.0 + 0.5) / 255.0; + if (cp_AlphaTestValue > color.a) + discard; + color.a = 1.0; + #endif + //color.rgb = vec3(vtx_uv.z * sp_FOG_DENSITY / 128.0); #if TARGET_GL != GLES2 #if DIV_POS_Z == 1 @@ -301,7 +354,21 @@ void main() #else highp float w = 100000.0 * vtx_uv.z; #endif - gl_FragDepth = log2(1.0 + w) / 34.0; + gl_FragDepth = log2(1.0 + max(w, -0.999999)) / 34.0; + +#if DITHERING == 1 + mediump float ditherTable[16] = float[]( + 0.9375, 0.1875, 0.75, 0., + 0.4375, 0.6875, 0.25, 0.5, + 0.8125, 0.0625, 0.875, 0.125, + 0.3125, 0.5625, 0.375, 0.625 + ); + mediump float r = ditherTable[int(mod(gl_FragCoord.y, 4.)) * 4 + int(mod(gl_FragCoord.x, 4.))]; + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + color += r / ditherColorMax; + // avoid rounding + color = floor(color * 255.) / 255.; +#endif #endif gl_FragColor = color; } @@ -321,47 +388,13 @@ void main() #else highp float w = 100000.0 * vtx_uv.z; #endif - gl_FragDepth = log2(1.0 + w) / 34.0; + gl_FragDepth = log2(1.0 + max(w, -0.999999)) / 34.0; #endif gl_FragColor=vec4(0.0, 0.0, 0.0, sp_ShaderColor); } )"; -const char* OSD_VertexShader = R"( -uniform highp vec4 scale; - -in highp vec4 in_pos; -in lowp vec4 in_base; -in mediump vec2 in_uv; - -out lowp vec4 vtx_base; -out mediump vec2 vtx_uv; - -void main() -{ - vtx_base = in_base; - vtx_uv = in_uv; - highp vec4 vpos = in_pos; - - vpos.w = 1.0; - vpos.z = vpos.w; - vpos.xy = vpos.xy * scale.xy - scale.zw; - gl_Position = vpos; -} -)"; - -const char* OSD_Shader = R"( -in lowp vec4 vtx_base; -in mediump vec2 vtx_uv; - -uniform sampler2D tex; -void main() -{ - gl_FragColor = vtx_base * texture(tex, vtx_uv); -} -)"; - -static void gl_free_osd_resources(); +void os_VideoRoutingTermGL(); GLCache glcache; gl_ctx gl; @@ -402,6 +435,8 @@ void do_swap_automation() dump_screenshot(img, framebuffer->getWidth(), framebuffer->getHeight()); delete[] img; dc_exit(); + void sdl_window_destroy(); + sdl_window_destroy(); // avoid crash flycast_term(); exit(0); } @@ -425,7 +460,10 @@ static void gl_delete_shaders() void termGLCommon() { - termQuad(); +#ifdef VIDEO_ROUTING + os_VideoRoutingTermGL(); +#endif + gl.quad.reset(); // palette, fog glcache.DeleteTextures(1, &fogTextureId); @@ -433,21 +471,17 @@ void termGLCommon() glcache.DeleteTextures(1, &paletteTextureId); paletteTextureId = 0; // RTT - glDeleteBuffers(1, &gl.rtt.pbo); - gl.rtt.pbo = 0; - gl.rtt.pboSize = 0; gl.rtt.framebuffer.reset(); - gl.rtt.texAddress = ~0; - gl_free_osd_resources(); gl.ofbo.framebuffer.reset(); glcache.DeleteTextures(1, &gl.dcfb.tex); gl.dcfb.tex = 0; gl.ofbo2.framebuffer.reset(); gl.fbscaling.framebuffer.reset(); + gl.videorouting.framebuffer.reset(); + termVmuLightgun(); #ifdef LIBRETRO postProcessor.term(); - termVmuLightgun(); #endif } @@ -463,6 +497,8 @@ static void gles_term() gl_delete_shaders(); } +bool testBlitFramebuffer(); + void findGLVersion() { gl.index_type = GL_UNSIGNED_INT; @@ -480,6 +516,7 @@ void findGLVersion() gl.border_clamp_supported = true; gl.prim_restart_supported = false; gl.prim_restart_fixed_supported = true; + gl.single_channel_format = GL_RED; } else { @@ -488,8 +525,8 @@ void findGLVersion() gl.index_type = GL_UNSIGNED_SHORT; gl.prim_restart_supported = false; gl.prim_restart_fixed_supported = false; + gl.single_channel_format = GL_ALPHA; } - gl.single_channel_format = GL_ALPHA; const char *extensions = (const char *)glGetString(GL_EXTENSIONS); if (strstr(extensions, "GL_OES_packed_depth_stencil") != NULL) gl.GL_OES_packed_depth_stencil_supported = true; @@ -558,10 +595,25 @@ void findGLVersion() glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &gl.max_anisotropy); } #endif - gl.mesa_nouveau = strstr((const char *)glGetString(GL_VERSION), "Mesa") != nullptr && !strcmp((const char *)glGetString(GL_VENDOR), "nouveau"); + const char *vendor = (const char *)glGetString(GL_VENDOR); + const char *renderer = (const char *)glGetString(GL_RENDERER); + gl.mesa_nouveau = !stricmp(vendor, "nouveau") + || (!stricmp(vendor, "Mesa") && !strncmp(renderer, "NV", 2)); NOTICE_LOG(RENDERER, "OpenGL%s version %d.%d", gl.is_gles ? " ES" : "", gl.gl_major, gl.gl_minor); + NOTICE_LOG(RENDERER, "Vendor '%s' Renderer '%s' Version '%s'", vendor, renderer, glGetString(GL_VERSION)); while (glGetError() != GL_NO_ERROR) ; + gl.bogusBlitFramebuffer = true; // not supported in GL/GLES 2 +#ifndef GLES2 + if (gl.gl_major >= 3) + { + gl.bogusBlitFramebuffer = !testBlitFramebuffer(); + if (gl.bogusBlitFramebuffer) + WARN_LOG(RENDERER, "glBlitFramebuffer is bogus. Using quad drawer instead"); + else + NOTICE_LOG(RENDERER, "glBlitFramebuffer test successful"); + } +#endif } struct ShaderUniforms_t ShaderUniforms; @@ -656,7 +708,7 @@ GLuint gl_CompileAndLink(const char *vertexShader, const char *fragmentShader) PipelineShader *GetProgram(bool cp_AlphaTest, bool pp_InsideClipping, bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_Gouraud, bool pp_BumpMap, bool fog_clamping, bool trilinear, - bool palette, bool naomi2) + int palette, bool naomi2, bool dithering) { u32 rv=0; @@ -672,9 +724,10 @@ PipelineShader *GetProgram(bool cp_AlphaTest, bool pp_InsideClipping, rv <<= 1; rv |= pp_BumpMap; rv <<= 1; rv |= fog_clamping; rv <<= 1; rv |= trilinear; - rv <<= 1; rv |= palette; + rv <<= 2; rv |= palette; rv <<= 1; rv |= naomi2; rv <<= 1, rv |= !settings.platform.isNaomi2() && config::NativeDepthInterpolation; + rv <<= 1; rv |= dithering; PipelineShader *shader = &gl.shaders[rv]; if (shader->program == 0) @@ -694,6 +747,7 @@ PipelineShader *GetProgram(bool cp_AlphaTest, bool pp_InsideClipping, shader->palette = palette; shader->naomi2 = naomi2; shader->divPosZ = !settings.platform.isNaomi2() && config::NativeDepthInterpolation; + shader->dithering = dithering; CompilePipelineShader(shader); } @@ -732,6 +786,7 @@ class FragmentShaderSource : public OpenGlSource addConstant("pp_TriLinear", s->trilinear); addConstant("pp_Palette", s->palette); addConstant("DIV_POS_Z", s->divPosZ); + addConstant("DITHERING", s->dithering); addSource(PixelCompatShader); addSource(GouraudSource); @@ -800,6 +855,8 @@ bool CompilePipelineShader(PipelineShader* s) s->fog_clamp_max = -1; } s->ndcMat = glGetUniformLocation(s->program, "ndcMat"); + s->ditherColorMax = glGetUniformLocation(s->program, "ditherColorMax"); + s->texSize = glGetUniformLocation(s->program, "texSize"); if (s->naomi2) initN2Uniforms(s); @@ -809,66 +866,6 @@ bool CompilePipelineShader(PipelineShader* s) return true; } -void OSDVertexArray::defineVtxAttribs() -{ - glEnableVertexAttribArray(VERTEX_POS_ARRAY); - glVertexAttribPointer(VERTEX_POS_ARRAY, 2, GL_FLOAT, GL_FALSE, sizeof(OSDVertex), (void*)offsetof(OSDVertex, x)); - - glEnableVertexAttribArray(VERTEX_COL_BASE_ARRAY); - glVertexAttribPointer(VERTEX_COL_BASE_ARRAY, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(OSDVertex), (void*)offsetof(OSDVertex, r)); - - glEnableVertexAttribArray(VERTEX_UV_ARRAY); - glVertexAttribPointer(VERTEX_UV_ARRAY, 2, GL_FLOAT, GL_FALSE, sizeof(OSDVertex), (void*)offsetof(OSDVertex, u)); - - glDisableVertexAttribArray(VERTEX_COL_OFFS_ARRAY); -} - -#ifdef __ANDROID__ -static void gl_load_osd_resources() -{ - OpenGlSource vertexSource; - vertexSource.addSource(VertexCompatShader) - .addSource(OSD_VertexShader); - OpenGlSource fragmentSource; - fragmentSource.addSource(PixelCompatShader) - .addSource(OSD_Shader); - - gl.OSD_SHADER.program = gl_CompileAndLink(vertexSource.generate().c_str(), fragmentSource.generate().c_str()); - gl.OSD_SHADER.scale = glGetUniformLocation(gl.OSD_SHADER.program, "scale"); - glUniform1i(glGetUniformLocation(gl.OSD_SHADER.program, "tex"), 0); //bind osd texture to slot 0 - - if (gl.OSD_SHADER.osd_tex == 0) - { - int width, height; - u8 *image_data = loadOSDButtons(width, height); - //Now generate the OpenGL texture object - gl.OSD_SHADER.osd_tex = glcache.GenTexture(); - glcache.BindTexture(GL_TEXTURE_2D, gl.OSD_SHADER.osd_tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)image_data); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - delete[] image_data; - } - gl.OSD_SHADER.geometry = std::make_unique(GL_ARRAY_BUFFER); -} -#endif - -static void gl_free_osd_resources() -{ - if (gl.OSD_SHADER.program != 0) - { - glcache.DeleteProgram(gl.OSD_SHADER.program); - gl.OSD_SHADER.program = 0; - } - - if (gl.OSD_SHADER.osd_tex != 0) { - glcache.DeleteTextures(1, &gl.OSD_SHADER.osd_tex); - gl.OSD_SHADER.osd_tex = 0; - } - gl.OSD_SHADER.geometry.reset(); - gl.OSD_SHADER.vao.term(); -} - static void create_modvol_shader() { if (gl.modvol_shader.program != 0) @@ -908,16 +905,18 @@ static void gl_create_resources() findGLVersion(); +#ifndef LIBRETRO if (gl.gl_major >= 3) // will be used later. Better fail fast verify(glGenVertexArrays != nullptr); +#endif //create vbos gl.vbo.geometry = std::make_unique(GL_ARRAY_BUFFER); gl.vbo.modvols = std::make_unique(GL_ARRAY_BUFFER); gl.vbo.idxs = std::make_unique(GL_ELEMENT_ARRAY_BUFFER); - initQuad(); + gl.quad = std::make_unique(); } GLuint gl_CompileShader(const char* shader,GLuint type); @@ -982,9 +981,9 @@ bool OpenGLRenderer::Init() u32 dst[16]; UpscalexBRZ(2, src, dst, 2, 2, false); } - fog_needs_update = true; - forcePaletteUpdate(); + updateFogTable = true; TextureCacheData::SetDirectXColorOrder(false); + TextureCacheData::setUploadToGPUFlavor(); return true; } @@ -1036,79 +1035,12 @@ static void updatePaletteTexture(GLenum texture_slot) glActiveTexture(GL_TEXTURE0); } -void OpenGLRenderer::DrawOSD(bool clear_screen) +void OpenGLRenderer::drawOSD() { -#ifdef LIBRETRO - void DrawVmuTexture(u8 vmu_screen_number, int width, int height); - void DrawGunCrosshair(u8 port, int width, int height); - - if (settings.platform.isConsole()) - { - for (int vmu_screen_number = 0 ; vmu_screen_number < 4 ; vmu_screen_number++) - if (vmu_lcd_status[vmu_screen_number * 2]) - DrawVmuTexture(vmu_screen_number, width, height); - } - - for (int lightgun_port = 0 ; lightgun_port < 4 ; lightgun_port++) - DrawGunCrosshair(lightgun_port, width, height); - -#else + drawVmusAndCrosshairs(width, height); +#ifndef LIBRETRO gui_display_osd(); -#ifdef __ANDROID__ - if (gl.OSD_SHADER.osd_tex == 0) - gl_load_osd_resources(); - if (gl.OSD_SHADER.osd_tex != 0) - { - glcache.Disable(GL_SCISSOR_TEST); - glViewport(0, 0, settings.display.width, settings.display.height); - - if (clear_screen) - { - glcache.ClearColor(0.7f, 0.7f, 0.7f, 1.f); - glClear(GL_COLOR_BUFFER_BIT); - renderLastFrame(); - glViewport(0, 0, settings.display.width, settings.display.height); - } - - glcache.UseProgram(gl.OSD_SHADER.program); - - float scale_h = settings.display.height / 480.f; - float offs_x = (settings.display.width - scale_h * 640.f) / 2.f; - float scale[4]; - scale[0] = 2.f / (settings.display.width / scale_h); - scale[1]= -2.f / 480.f; - scale[2]= 1.f - 2.f * offs_x / settings.display.width; - scale[3]= -1.f; - glUniform4fv(gl.OSD_SHADER.scale, 1, scale); - - glActiveTexture(GL_TEXTURE0); - glcache.BindTexture(GL_TEXTURE_2D, gl.OSD_SHADER.osd_tex); - - glBindFramebuffer(GL_FRAMEBUFFER, gl.ofbo.origFbo); - - const std::vector& osdVertices = GetOSDVertices(); - gl.OSD_SHADER.geometry->update(osdVertices.data(), osdVertices.size() * sizeof(OSDVertex)); - gl.OSD_SHADER.vao.bind(gl.OSD_SHADER.geometry.get()); - - glcache.Enable(GL_BLEND); - glcache.Disable(GL_DEPTH_TEST); - glcache.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glcache.DepthMask(false); - glcache.DepthFunc(GL_ALWAYS); - - glcache.Disable(GL_CULL_FACE); - int dfa = osdVertices.size() / 4; - - for (int i = 0; i < dfa; i++) - glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4); - - glCheck(); - imguiDriver->setFrameRendered(); - } -#endif #endif - GlVertexArray::unbind(); } void OpenGLRenderer::Process(TA_context* ctx) @@ -1116,19 +1048,19 @@ void OpenGLRenderer::Process(TA_context* ctx) if (gl.gl_major < 3 && settings.platform.isNaomi2()) throw FlycastException("OpenGL ES 3.0+ required for Naomi 2"); - if (KillTex) + if (resetTextureCache) { TexCache.Clear(); + resetTextureCache = false; + } TexCache.Cleanup(); - if (fog_needs_update && config::Fog) - { - fog_needs_update = false; + if (updateFogTable && config::Fog) { + updateFogTable = false; updateFogTexture((u8 *)FOG_TABLE, getFogTextureSlot(), gl.single_channel_format); } - if (palette_updated) - { + if (updatePalette) { updatePaletteTexture(getPaletteTextureSlot()); - palette_updated = false; + updatePalette = false; } ta_parse(ctx, gl.prim_restart_fixed_supported || gl.prim_restart_supported); } @@ -1151,9 +1083,11 @@ static void upload_vertex_indices() bool OpenGLRenderer::renderFrame(int width, int height) { + if (!config::EmulateFramebuffer) + initVideoRoutingFrameBuffer(); + bool is_rtt = pvrrc.isRTT; - float vtx_min_fZ = 0.f; //pvrrc.fZ_min; float vtx_max_fZ = pvrrc.fZ_max; //sanitise the values, now with NaN detection (for omap) @@ -1162,7 +1096,6 @@ bool OpenGLRenderer::renderFrame(int width, int height) vtx_max_fZ = 10 * 1024; //add some extra range to avoid clipping border cases - vtx_min_fZ *= 0.98f; vtx_max_fZ *= 1.001f; TransformMatrix matrices(pvrrc, is_rtt ? pvrrc.getFramebufferWidth() : width, @@ -1171,13 +1104,8 @@ bool OpenGLRenderer::renderFrame(int width, int height) const glm::mat4& scissor_mat = matrices.GetScissorMatrix(); ViewportMatrix = matrices.GetViewportMatrix(); - if (!is_rtt && !config::EmulateFramebuffer) - gcflip = 0; - else - gcflip = 1; - - ShaderUniforms.depth_coefs[0] = 2 / (vtx_max_fZ - vtx_min_fZ); - ShaderUniforms.depth_coefs[1] = -vtx_min_fZ - 1; + ShaderUniforms.depth_coefs[0] = 2.f / vtx_max_fZ; + ShaderUniforms.depth_coefs[1] = -1.f; ShaderUniforms.depth_coefs[2] = 0; ShaderUniforms.depth_coefs[3] = 0; @@ -1209,6 +1137,34 @@ bool OpenGLRenderer::renderFrame(int width, int height) ShaderUniforms.PT_ALPHA=(PT_ALPHA_REF&0xFF)/255.0f; + if (config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3) + { + ShaderUniforms.dithering = true; + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + ShaderUniforms.ditherColorMax[0] = ShaderUniforms.ditherColorMax[1] = ShaderUniforms.ditherColorMax[2] = 31.f; + ShaderUniforms.ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + ShaderUniforms.ditherColorMax[0] = ShaderUniforms.ditherColorMax[2] = 31.f; + ShaderUniforms.ditherColorMax[1] = 63.f; + ShaderUniforms.ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + ShaderUniforms.ditherColorMax[0] = ShaderUniforms.ditherColorMax[1] + = ShaderUniforms.ditherColorMax[2] = ShaderUniforms.ditherColorMax[3] = 15.f; + break; + default: + break; + } + } + else + { + ShaderUniforms.dithering = false; + } + for (auto& it : gl.shaders) { glcache.UseProgram(it.second.program); @@ -1242,15 +1198,11 @@ bool OpenGLRenderer::renderFrame(int width, int height) if (init_output_framebuffer(width, height) == 0) return false; } - else if (config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) - { - glBindFramebuffer(GL_FRAMEBUFFER, postProcessor.getFramebuffer(width, height)); - } else { - glBindFramebuffer(GL_FRAMEBUFFER, glsm_get_current_framebuffer()); + glBindFramebuffer(GL_FRAMEBUFFER, postProcessor.getFramebuffer(width, height)); + glViewport(0, 0, width, height); } - glViewport(0, 0, width, height); #else if (init_output_framebuffer(width, height) == 0) return false; @@ -1271,113 +1223,126 @@ bool OpenGLRenderer::renderFrame(int width, int height) glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCheck(); if (!is_rtt) glcache.ClearColor(VO_BORDER_COL.red(), VO_BORDER_COL.green(), VO_BORDER_COL.blue(), 1.f); + else + glcache.ClearColor(0.f, 0.f, 0.f, 0.f); - if (!is_rtt && (FB_R_CTRL.fb_enable == 0 || VO_CONTROL.blank_video == 1)) - { - // Video output disabled + if (is_rtt || pvrrc.clearFramebuffer) glClear(GL_COLOR_BUFFER_BIT); - } - else - { - //move vertex to gpu - //Main VBO - gl.vbo.geometry->update(&pvrrc.verts[0], pvrrc.verts.size() * sizeof(decltype(pvrrc.verts[0]))); + //move vertex to gpu + //Main VBO + gl.vbo.geometry->update(&pvrrc.verts[0], pvrrc.verts.size() * sizeof(decltype(pvrrc.verts[0]))); - upload_vertex_indices(); + upload_vertex_indices(); - //Modvol VBO - if (!pvrrc.modtrig.empty()) - gl.vbo.modvols->update(&pvrrc.modtrig[0], pvrrc.modtrig.size() * sizeof(decltype(pvrrc.modtrig[0]))); + //Modvol VBO + if (!pvrrc.modtrig.empty()) + gl.vbo.modvols->update(&pvrrc.modtrig[0], pvrrc.modtrig.size() * sizeof(decltype(pvrrc.modtrig[0]))); - if (!wide_screen_on) + if (!wide_screen_on) + { + float fWidth; + float fHeight; + float min_x; + float min_y; + if (!is_rtt) { - float fWidth; - float fHeight; - float min_x; - float min_y; - if (!is_rtt) + glm::vec4 clip_min(pvrrc.fb_X_CLIP.min, pvrrc.fb_Y_CLIP.min, 0, 1); + glm::vec4 clip_dim(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1, + pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1, 0, 0); + clip_min = scissor_mat * clip_min; + clip_dim = scissor_mat * clip_dim; + + min_x = clip_min[0]; + min_y = clip_min[1]; + fWidth = clip_dim[0]; + fHeight = clip_dim[1]; + if (fWidth < 0) { - glm::vec4 clip_min(pvrrc.fb_X_CLIP.min, pvrrc.fb_Y_CLIP.min, 0, 1); - glm::vec4 clip_dim(pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1, - pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1, 0, 0); - clip_min = scissor_mat * clip_min; - clip_dim = scissor_mat * clip_dim; - - min_x = clip_min[0]; - min_y = clip_min[1]; - fWidth = clip_dim[0]; - fHeight = clip_dim[1]; - if (fWidth < 0) - { - min_x += fWidth; - fWidth = -fWidth; - } - if (fHeight < 0) - { - min_y += fHeight; - fHeight = -fHeight; - } - if (matrices.GetSidebarWidth() > 0) - { - float scaled_offs_x = matrices.GetSidebarWidth(); - - glcache.Enable(GL_SCISSOR_TEST); - glcache.Scissor(0, 0, (GLsizei)lroundf(scaled_offs_x), (GLsizei)height); - glClear(GL_COLOR_BUFFER_BIT); - glcache.Scissor(width - scaled_offs_x, 0, (GLsizei)lroundf(scaled_offs_x + 1.f), (GLsizei)height); - glClear(GL_COLOR_BUFFER_BIT); - } + min_x += fWidth; + fWidth = -fWidth; } - else + if (fHeight < 0) { - fWidth = pvrrc.fb_X_CLIP.max - pvrrc.fb_X_CLIP.min + 1; - fHeight = pvrrc.fb_Y_CLIP.max - pvrrc.fb_Y_CLIP.min + 1; - min_x = pvrrc.fb_X_CLIP.min; - min_y = pvrrc.fb_Y_CLIP.min; - if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) - { - float scale = config::RenderResolution / 480.f; - min_x *= scale; - min_y *= scale; - fWidth *= scale; - fHeight *= scale; - } + min_y += fHeight; + fHeight = -fHeight; + } + if (matrices.GetSidebarWidth() > 0) + { + float scaled_offs_x = matrices.GetSidebarWidth(); + + glcache.Enable(GL_SCISSOR_TEST); + glcache.Scissor(0, 0, (GLsizei)lroundf(scaled_offs_x), (GLsizei)height); + glClear(GL_COLOR_BUFFER_BIT); + glcache.Scissor(width - scaled_offs_x, 0, (GLsizei)lroundf(scaled_offs_x + 1.f), (GLsizei)height); + glClear(GL_COLOR_BUFFER_BIT); } - ShaderUniforms.base_clipping.enabled = true; - ShaderUniforms.base_clipping.x = (int)lroundf(min_x); - ShaderUniforms.base_clipping.y = (int)lroundf(min_y); - ShaderUniforms.base_clipping.width = (int)lroundf(fWidth); - ShaderUniforms.base_clipping.height = (int)lroundf(fHeight); - glcache.Scissor(ShaderUniforms.base_clipping.x, ShaderUniforms.base_clipping.y, ShaderUniforms.base_clipping.width, ShaderUniforms.base_clipping.height); - glcache.Enable(GL_SCISSOR_TEST); } else { - ShaderUniforms.base_clipping.enabled = false; + min_x = (float)pvrrc.getFramebufferMinX(); + min_y = (float)pvrrc.getFramebufferMinY(); + fWidth = (float)pvrrc.getFramebufferWidth() - min_x; + fHeight = (float)pvrrc.getFramebufferHeight() - min_y; + if (config::RenderResolution > 480 && !config::RenderToTextureBuffer) + { + float scale = config::RenderResolution / 480.f; + min_x *= scale; + min_y *= scale; + fWidth *= scale; + fHeight *= scale; + } } + ShaderUniforms.base_clipping.enabled = true; + ShaderUniforms.base_clipping.x = (int)lroundf(min_x); + ShaderUniforms.base_clipping.y = (int)lroundf(min_y); + ShaderUniforms.base_clipping.width = (int)lroundf(fWidth); + ShaderUniforms.base_clipping.height = (int)lroundf(fHeight); + glcache.Scissor(ShaderUniforms.base_clipping.x, ShaderUniforms.base_clipping.y, ShaderUniforms.base_clipping.width, ShaderUniforms.base_clipping.height); + glcache.Enable(GL_SCISSOR_TEST); + } + else + { + ShaderUniforms.base_clipping.enabled = false; + } - DrawStrips(); + DrawStrips(); #ifdef LIBRETRO - if ((config::PowerVR2Filter || gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) && !is_rtt && !config::EmulateFramebuffer) - postProcessor.render(glsm_get_current_framebuffer()); + if (!is_rtt && !config::EmulateFramebuffer) + postProcessor.render(glsm_get_current_framebuffer()); #endif - } if (is_rtt) ReadRTTBuffer(); else if (config::EmulateFramebuffer) writeFramebufferToVRAM(); -#ifndef LIBRETRO else { gl.ofbo.aspectRatio = getOutputFramebufferAspectRatio(); +#ifndef LIBRETRO + gl.ofbo2.ready = false; renderLastFrame(); - } #endif + } GlVertexArray::unbind(); return !is_rtt; } +void OpenGLRenderer::initVideoRoutingFrameBuffer() +{ +#ifdef VIDEO_ROUTING + if (config::VideoRouting) + { + int targetWidth = (config::VideoRoutingScale ? config::VideoRoutingVRes * settings.display.width / settings.display.height : settings.display.width); + int targetHeight = (config::VideoRoutingScale ? config::VideoRoutingVRes : settings.display.height); + if (gl.videorouting.framebuffer != nullptr + && (gl.videorouting.framebuffer->getWidth() != targetWidth || gl.videorouting.framebuffer->getHeight() != targetHeight)) + gl.videorouting.framebuffer.reset(); + if (gl.videorouting.framebuffer == nullptr) + gl.videorouting.framebuffer = std::make_unique(targetWidth, targetHeight, true, true); + } +#endif +} + void OpenGLRenderer::Term() { TexCache.Clear(); @@ -1395,15 +1360,39 @@ bool OpenGLRenderer::Render() if (!config::EmulateFramebuffer) { - DrawOSD(false); frameRendered = true; - gl.ofbo2.ready = false; + clearLastFrame = false; + drawOSD(); + renderVideoRouting(); } restoreCurrentFramebuffer(); return true; } +void OpenGLRenderer::renderVideoRouting() +{ +#ifdef VIDEO_ROUTING + if (config::VideoRouting) + { + glBindFramebuffer(GL_READ_FRAMEBUFFER, gl.ofbo.origFbo); + gl.videorouting.framebuffer->bind(GL_DRAW_FRAMEBUFFER); + glcache.Disable(GL_SCISSOR_TEST); + int targetWidth = (config::VideoRoutingScale ? config::VideoRoutingVRes * settings.display.width / settings.display.height : settings.display.width); + int targetHeight = (config::VideoRoutingScale ? config::VideoRoutingVRes : settings.display.height); + glBlitFramebuffer(0, 0, settings.display.width, settings.display.height, + 0, 0, targetWidth, targetHeight, + GL_COLOR_BUFFER_BIT, GL_LINEAR); + extern void os_VideoRoutingPublishFrameTexture(GLuint texID, GLuint texTarget, float w, float h); + os_VideoRoutingPublishFrameTexture(gl.videorouting.framebuffer->getTexture(), GL_TEXTURE_2D, targetWidth, targetHeight); + } + else + { + os_VideoRoutingTermGL(); + } +#endif +} + Renderer* rend_GLES2() { return new OpenGLRenderer(); diff --git a/core/rend/gles/gles.h b/core/rend/gles/gles.h index 8617e98ea..13f3a1d71 100755 --- a/core/rend/gles/gles.h +++ b/core/rend/gles/gles.h @@ -7,7 +7,7 @@ #include "glcache.h" #include "rend/shader_util.h" #ifndef LIBRETRO -#include "rend/imgui_driver.h" +#include "ui/imgui_driver.h" #endif #include @@ -22,6 +22,12 @@ #ifndef GL_PRIMITIVE_RESTART_FIXED_INDEX #define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #endif +#ifndef GL_RGBA8 +#define GL_RGBA8 0x8058 +#endif +#ifndef GL_R8 +#define GL_R8 0x8229 +#endif #define glCheck() do { if (unlikely(config::OpenGlChecks)) { verify(glGetError()==GL_NO_ERROR); } } while(0) @@ -36,9 +42,6 @@ // Naomi2 #define VERTEX_NORM_ARRAY 7 -//vertex types -extern u32 gcflip; - extern glm::mat4 ViewportMatrix; void DrawStrips(); @@ -57,6 +60,8 @@ struct PipelineShader GLint fog_clamp_min, fog_clamp_max; GLint ndcMat; GLint palette_index; + GLint ditherColorMax; + GLint texSize; // Naomi2 GLint mvMat; @@ -110,9 +115,10 @@ struct PipelineShader bool pp_BumpMap; bool fog_clamping; bool trilinear; - bool palette; + int palette; // 1 if nearest, 2 if bilinear bool naomi2; bool divPosZ; + bool dithering; }; class GlBuffer @@ -217,11 +223,7 @@ class ModvolVertexArray final : public GlVertexArray void defineVtxAttribs() override; }; -class OSDVertexArray final : public GlVertexArray -{ -protected: - void defineVtxAttribs() override; -}; +class GlQuadDrawer; struct gl_ctx { @@ -248,15 +250,6 @@ struct gl_ctx std::unordered_map shaders; - struct - { - GLuint program; - GLint scale; - OSDVertexArray vao; - std::unique_ptr geometry; - GLuint osd_tex; - } OSD_SHADER; - struct { MainVertexArray mainVAO; @@ -268,14 +261,6 @@ struct gl_ctx struct { - u32 texAddress = ~0; - GLuint pbo; - u32 pboSize; - bool directXfer; - u32 width; - u32 height; - FB_W_CTRL_type fb_w_ctrl; - u32 linestride; std::unique_ptr framebuffer; } rtt; @@ -305,6 +290,12 @@ struct gl_ctx bool ready = false; } ofbo2; + struct + { + std::unique_ptr framebuffer; + } videorouting; + + std::unique_ptr quad; const char *gl_version; const char *glsl_version_header; int gl_major; @@ -320,6 +311,7 @@ struct gl_ctx bool border_clamp_supported; bool prim_restart_supported; bool prim_restart_fixed_supported; + bool bogusBlitFramebuffer; size_t get_index_size() { return index_type == GL_UNSIGNED_INT ? sizeof(u32) : sizeof(u16); } }; @@ -394,7 +386,7 @@ void writeFramebufferToVRAM(); PipelineShader *GetProgram(bool cp_AlphaTest, bool pp_InsideClipping, bool pp_Texture, bool pp_UseAlpha, bool pp_IgnoreTexA, u32 pp_ShadInstr, bool pp_Offset, u32 pp_FogCtrl, bool pp_Gouraud, bool pp_BumpMap, bool fog_clamping, bool trilinear, - bool palette, bool naomi2); + int palette, bool naomi2, bool dithering); GLuint gl_CompileShader(const char* shader, GLuint type); GLuint gl_CompileAndLink(const char *vertexShader, const char *fragmentShader); @@ -408,7 +400,6 @@ extern struct ShaderUniforms_t float fog_den_float; float ps_FOG_COL_RAM[3]; float ps_FOG_COL_VERT[3]; - float trilinear_alpha; float fog_clamp_min[4]; float fog_clamp_max[4]; glm::mat4 ndcMat; @@ -419,7 +410,8 @@ extern struct ShaderUniforms_t int width; int height; } base_clipping; - int palette_index; + bool dithering; + float ditherColorMax[4]; void Set(const PipelineShader* s) { @@ -446,8 +438,8 @@ extern struct ShaderUniforms_t if (s->ndcMat != -1) glUniformMatrix4fv(s->ndcMat, 1, GL_FALSE, &ndcMat[0][0]); - if (s->palette_index != -1) - glUniform1i(s->palette_index, palette_index); + if (s->ditherColorMax != -1) + glUniform4fv(s->ditherColorMax, 1, ditherColorMax); } } ShaderUniforms; @@ -455,16 +447,24 @@ extern struct ShaderUniforms_t class TextureCacheData final : public BaseTextureCacheData { public: - TextureCacheData(TSP tsp, TCW tcw) : BaseTextureCacheData(tsp, tcw), texID(glcache.GenTexture()) { + TextureCacheData(TSP tsp, TCW tcw) : BaseTextureCacheData(tsp, tcw) { } TextureCacheData(TextureCacheData&& other) : BaseTextureCacheData(std::move(other)) { std::swap(texID, other.texID); } - GLuint texID; //gl texture + GLuint texID = 0; //gl texture std::string GetId() override { return std::to_string(texID); } void UploadToGPU(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded = false) override; bool Delete() override; + + static void setUploadToGPUFlavor(); + +private: + void UploadToGPUGl2(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded); + void UploadToGPUGl4(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded); + + static void (TextureCacheData::*uploadToGpu)(int, int, const u8 *, bool, bool); }; class GlTextureCache final : public BaseTextureCache @@ -502,20 +502,21 @@ struct OpenGLRenderer : Renderer bool RenderLastFrame() override { + if (clearLastFrame) + return false; saveCurrentFramebuffer(); bool ret = renderLastFrame(); restoreCurrentFramebuffer(); return ret; } - - void DrawOSD(bool clear_screen) override; + bool GetLastFrame(std::vector& data, int& width, int& height) override; BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override; bool Present() override { - if (!frameRendered) + if (!frameRendered || clearLastFrame) return false; #ifndef LIBRETRO imguiDriver->setFrameRendered(); @@ -545,6 +546,8 @@ struct OpenGLRenderer : Renderer } bool renderLastFrame(); + void renderVideoRouting(); + void drawOSD(); private: bool renderFrame(int width, int height); @@ -553,12 +556,9 @@ struct OpenGLRenderer : Renderer bool frameRendered = false; int width = 640; int height = 480; + void initVideoRoutingFrameBuffer(); }; -void initQuad(); -void termQuad(); -void drawQuad(GLuint texId, bool rotate = false, bool swapY = false, float *coords = nullptr); - extern const char* ShaderCompatSource; extern const char *VertexCompatShader; extern const char *PixelCompatShader; @@ -572,7 +572,9 @@ class OpenGlSource : public ShaderSource } }; +void drawVmusAndCrosshairs(int width, int height); +void termVmuLightgun(); + #ifdef LIBRETRO extern "C" struct retro_hw_render_callback hw_render; -void termVmuLightgun(); #endif diff --git a/core/rend/gles/gltex.cpp b/core/rend/gles/gltex.cpp index 1744cbc17..67efc8d07 100644 --- a/core/rend/gles/gltex.cpp +++ b/core/rend/gles/gltex.cpp @@ -1,120 +1,149 @@ #include "glcache.h" #include "gles.h" #include "hw/pvr/pvr_mem.h" -#include "rend/TexCache.h" #include GlTextureCache TexCache; +void (TextureCacheData::*TextureCacheData::uploadToGpu)(int, int, const u8 *, bool, bool) = &TextureCacheData::UploadToGPUGl2; -static void readAsyncPixelBuffer(u32 addr); - -void TextureCacheData::UploadToGPU(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded) +static void getOpenGLTexParams(TextureType texType, u32& bytesPerPixel, GLuint& gltype, GLuint& comps, GLuint& internalFormat) { - //upload to OpenGL ! - glcache.BindTexture(GL_TEXTURE_2D, texID); - GLuint comps = tex_type == TextureType::_8 ? gl.single_channel_format : GL_RGBA; - GLuint gltype; - u32 bytes_per_pixel = 2; - switch (tex_type) + comps = GL_RGBA; + bytesPerPixel = 2; + switch (texType) { case TextureType::_5551: gltype = GL_UNSIGNED_SHORT_5_5_5_1; + internalFormat = GL_RGB5_A1; break; case TextureType::_565: gltype = GL_UNSIGNED_SHORT_5_6_5; comps = GL_RGB; + internalFormat = GL_RGB565; break; case TextureType::_4444: gltype = GL_UNSIGNED_SHORT_4_4_4_4; + internalFormat = GL_RGBA4; break; case TextureType::_8888: - bytes_per_pixel = 4; + bytesPerPixel = 4; gltype = GL_UNSIGNED_BYTE; + internalFormat = GL_RGBA8; break; case TextureType::_8: - bytes_per_pixel = 1; + bytesPerPixel = 1; gltype = GL_UNSIGNED_BYTE; + comps = gl.single_channel_format; + internalFormat = GL_R8; break; default: die("Unsupported texture type"); - gltype = 0; break; } +} + +void TextureCacheData::UploadToGPUGl2(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded) +{ + if (texID == 0) + texID = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, texID); + GLuint comps; + GLuint gltype; + GLuint internalFormat; + u32 bytes_per_pixel; + getOpenGLTexParams(tex_type, bytes_per_pixel, gltype, comps, internalFormat); + if (mipmapsIncluded) { int mipmapLevels = 0; int dim = width; - while (dim != 0) - { + while (dim != 0) { mipmapLevels++; dim >>= 1; } + for (int i = 0; i < mipmapLevels; i++) { + glTexImage2D(GL_TEXTURE_2D, mipmapLevels - i - 1, comps, 1 << i, 1 << i, 0, comps, gltype, temp_tex_buffer); + temp_tex_buffer += (1 << (2 * i)) * bytes_per_pixel; + } + } + else + { + glTexImage2D(GL_TEXTURE_2D, 0,comps, width, height, 0, comps, gltype, temp_tex_buffer); + if (mipmapped) + glGenerateMipmap(GL_TEXTURE_2D); + } +} + +void TextureCacheData::UploadToGPUGl4(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded) +{ #if !defined(GLES2) && (!defined(__APPLE__) || defined(TARGET_IPHONE)) - // OpenGL 4.2 or GLES 3.0 min - if (gl.gl_major > 4 || (gl.gl_major == 4 && gl.gl_minor >= 2) - || (gl.is_gles && gl.gl_major >= 3)) - { - GLuint internalFormat; - switch (tex_type) - { - case TextureType::_5551: - internalFormat = GL_RGB5_A1; - break; - case TextureType::_565: - internalFormat = GL_RGB565; - break; - case TextureType::_4444: - internalFormat = GL_RGBA4; - break; - case TextureType::_8888: - internalFormat = GL_RGBA8; - break; - case TextureType::_8: - internalFormat = comps; - break; - default: - die("Unsupported texture format"); - internalFormat = 0; - break; - } - if (Updates == 1) - { - glTexStorage2D(GL_TEXTURE_2D, mipmapLevels, internalFormat, width, height); - glCheck(); - } - for (int i = 0; i < mipmapLevels; i++) - { - glTexSubImage2D(GL_TEXTURE_2D, mipmapLevels - i - 1, 0, 0, 1 << i, 1 << i, comps, gltype, temp_tex_buffer); - temp_tex_buffer += (1 << (2 * i)) * bytes_per_pixel; - } + GLuint comps; + GLuint gltype; + GLuint internalFormat; + u32 bytes_per_pixel; + getOpenGLTexParams(tex_type, bytes_per_pixel, gltype, comps, internalFormat); + + int mipmapLevels = 1; + if (mipmapped) + { + mipmapLevels = 0; + int dim = width; + while (dim != 0) { + mipmapLevels++; + dim >>= 1; } - else -#endif - { - for (int i = 0; i < mipmapLevels; i++) - { - glTexImage2D(GL_TEXTURE_2D, mipmapLevels - i - 1, comps, 1 << i, 1 << i, 0, comps, gltype, temp_tex_buffer); - temp_tex_buffer += (1 << (2 * i)) * bytes_per_pixel; - } + } + if (texID == 0) + { + texID = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, texID); + glTexStorage2D(GL_TEXTURE_2D, mipmapLevels, internalFormat, width, height); + } + else { + glcache.BindTexture(GL_TEXTURE_2D, texID); + } + if (mipmapsIncluded) + { + for (int i = 0; i < mipmapLevels; i++) { + glTexSubImage2D(GL_TEXTURE_2D, mipmapLevels - i - 1, 0, 0, 1 << i, 1 << i, comps, gltype, temp_tex_buffer); + temp_tex_buffer += (1 << (2 * i)) * bytes_per_pixel; } } else { - glTexImage2D(GL_TEXTURE_2D, 0,comps, width, height, 0, comps, gltype, temp_tex_buffer); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, comps, gltype, temp_tex_buffer); if (mipmapped) glGenerateMipmap(GL_TEXTURE_2D); } +#endif +} + +void TextureCacheData::UploadToGPU(int width, int height, const u8 *temp_tex_buffer, bool mipmapped, bool mipmapsIncluded) +{ + ((*this).*uploadToGpu)(width, height, temp_tex_buffer, mipmapped, mipmapsIncluded); glCheck(); } +void TextureCacheData::setUploadToGPUFlavor() +{ +#if !defined(GLES2) && (!defined(__APPLE__) || defined(TARGET_IPHONE)) + // OpenGL 4.2 or GLES 3.0 min + if (gl.gl_major > 4 || (gl.gl_major == 4 && gl.gl_minor >= 2) + || (gl.is_gles && gl.gl_major >= 3)) + uploadToGpu = &TextureCacheData::UploadToGPUGl4; +#endif +} + bool TextureCacheData::Delete() { if (!BaseTextureCacheData::Delete()) return false; - if (texID) + if (texID != 0) { glcache.DeleteTextures(1, &texID); + texID = 0; + } return true; } @@ -160,32 +189,12 @@ GLuint BindRTT(bool withDepthBuffer) DEBUG_LOG(RENDERER, "RTT packmode=%d stride=%d - %d x %d @ %06x", pvrrc.fb_W_CTRL.fb_packmode, pvrrc.fb_W_LINESTRIDE * 8, fbw, fbh, texAddress); - if (gl.rtt.texAddress != ~0u) - readAsyncPixelBuffer(gl.rtt.texAddress); - gl.rtt.texAddress = texAddress; - gl.rtt.framebuffer.reset(); u32 fbw2; u32 fbh2; getRenderToTextureDimensions(fbw, fbh, fbw2, fbh2); -#ifdef GL_PIXEL_PACK_BUFFER - if (gl.gl_major >= 3 && config::RenderToTextureBuffer) - { - if (gl.rtt.pbo == 0) - glGenBuffers(1, &gl.rtt.pbo); - u32 glSize = fbw2 * fbh2 * 4; - if (glSize > gl.rtt.pboSize) - { - glBindBuffer(GL_PIXEL_PACK_BUFFER, gl.rtt.pbo); - glBufferData(GL_PIXEL_PACK_BUFFER, glSize, 0, GL_STREAM_READ); - gl.rtt.pboSize = glSize; - glCheck(); - } - } -#endif - // Create a texture for rendering to GLuint texture = glcache.GenTexture(); glcache.BindTexture(GL_TEXTURE_2D, texture); @@ -198,136 +207,75 @@ GLuint BindRTT(bool withDepthBuffer) return gl.rtt.framebuffer->getFramebuffer(); } -constexpr u32 MAGIC_NUMBER = 0xbaadf00d; - void ReadRTTBuffer() { u32 w = pvrrc.getFramebufferWidth(); u32 h = pvrrc.getFramebufferHeight(); const u8 fb_packmode = pvrrc.fb_W_CTRL.fb_packmode; + const u32 tex_addr = pvrrc.fb_W_SOF1 & VRAM_MASK; if (config::RenderToTextureBuffer) { - u32 tex_addr = gl.rtt.texAddress; #ifdef TARGET_VIDEOCORE // Remove all vram locks before calling glReadPixels // (deadlock on rpi) u32 size = w * h * 2; - u32 page_tex_addr = tex_addr & PAGE_MASK; + u32 page_tex_addr = tex_addr & ~PAGE_MASK; u32 page_size = size + tex_addr - page_tex_addr; page_size = ((page_size - 1) / PAGE_SIZE + 1) * PAGE_SIZE; for (u32 page = page_tex_addr; page < page_tex_addr + page_size; page += PAGE_SIZE) VramLockedWriteOffset(page); #endif -#ifdef GL_PIXEL_PACK_BUFFER - if (gl.gl_major >= 3) - glBindBuffer(GL_PIXEL_PACK_BUFFER, gl.rtt.pbo); -#endif - glPixelStorei(GL_PACK_ALIGNMENT, 1); - gl.rtt.width = w; - gl.rtt.height = h; - u16 *dst = gl.gl_major >= 3 ? nullptr : (u16 *)&vram[tex_addr]; - gl.rtt.linestride = pvrrc.fb_W_LINESTRIDE * 8; - if (gl.rtt.linestride == 0) - gl.rtt.linestride = w * 2; + u16 *dst = (u16 *)&vram[tex_addr]; + + u32 linestride = pvrrc.fb_W_LINESTRIDE * 8; + if (linestride == 0) + linestride = w * 2; GLint color_fmt, color_type; glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &color_fmt); glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &color_type); - if (fb_packmode == 1 && gl.rtt.linestride == w * 2 && color_fmt == GL_RGB && color_type == GL_UNSIGNED_SHORT_5_6_5) + if (fb_packmode == 1 && linestride == w * 2 && color_fmt == GL_RGB && color_type == GL_UNSIGNED_SHORT_5_6_5) { - gl.rtt.directXfer = true; glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, dst); - if (dst == nullptr) - *(u32 *)&vram[tex_addr] = MAGIC_NUMBER; } else { - gl.rtt.directXfer = false; - if (gl.gl_major >= 3) - { - gl.rtt.fb_w_ctrl = pvrrc.fb_W_CTRL; - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0); - *(u32 *)&vram[tex_addr] = MAGIC_NUMBER; - } - else - { - PixelBuffer tmp_buf; - tmp_buf.init(w, h); - - u8 *p = (u8 *)tmp_buf.data(); - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, p); - - WriteTextureToVRam(w, h, p, dst, pvrrc.fb_W_CTRL, gl.rtt.linestride); - gl.rtt.texAddress = ~0; - } + PixelBuffer tmp_buf; + tmp_buf.init(w, h); + + u8 *p = (u8 *)tmp_buf.data(); + glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, p); + + WriteTextureToVRam(w, h, p, dst, pvrrc.fb_W_CTRL, linestride); } -#ifdef GL_PIXEL_PACK_BUFFER - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); -#endif glCheck(); } else { - //memset(&vram[gl.rtt.texAddress], 0, size); + //memset(&vram[tex_addr], 0, size); if (w <= 1024 && h <= 1024) { - TextureCacheData *texture_data = TexCache.getRTTexture(gl.rtt.texAddress, fb_packmode, w, h); + TextureCacheData *texture_data = TexCache.getRTTexture(tex_addr, fb_packmode, w, h); glcache.DeleteTextures(1, &texture_data->texID); texture_data->texID = gl.rtt.framebuffer->detachTexture(); texture_data->dirty = 0; texture_data->unprotectVRam(); } - gl.rtt.texAddress = ~0; } glBindFramebuffer(GL_FRAMEBUFFER, gl.ofbo.origFbo); } -static void readAsyncPixelBuffer(u32 addr) -{ -#ifndef GLES2 - if (!config::RenderToTextureBuffer || gl.rtt.pbo == 0) - return; - - u32 tex_addr = gl.rtt.texAddress; - if (addr != tex_addr) - return; - gl.rtt.texAddress = ~0; - - glBindBuffer(GL_PIXEL_PACK_BUFFER, gl.rtt.pbo); - u8 *ptr = (u8 *)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, gl.rtt.pboSize, GL_MAP_READ_BIT); - if (ptr == nullptr) - { - WARN_LOG(RENDERER, "glMapBuffer failed"); - return; - } - u16 *dst = (u16 *)&vram[tex_addr]; - // Make sure the vram region hasn't been overwritten already, otherwise we skip the copy - // (Worms World Party intro) - if (*(u32 *)dst == MAGIC_NUMBER) - { - if (gl.rtt.directXfer) - // Can be read directly into vram - memcpy(dst, ptr, gl.rtt.width * gl.rtt.height * 2); - else - WriteTextureToVRam(gl.rtt.width, gl.rtt.height, ptr, dst, gl.rtt.fb_w_ctrl, gl.rtt.linestride); - } - glUnmapBuffer(GL_PIXEL_PACK_BUFFER); - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); -#endif -} BaseTextureCacheData *OpenGLRenderer::GetTexture(TSP tsp, TCW tcw) { //lookup texture TextureCacheData* tf = TexCache.getTextureCacheData(tsp, tcw); - readAsyncPixelBuffer(tf->sa_tex); - //update if needed if (tf->NeedsUpdate()) { @@ -337,7 +285,7 @@ BaseTextureCacheData *OpenGLRenderer::GetTexture(TSP tsp, TCW tcw) else if (tf->IsCustomTextureAvailable()) { TexCache.DeleteLater(tf->texID); - tf->texID = glcache.GenTexture(); + tf->texID = 0; tf->CheckCustomTexture(); } @@ -366,28 +314,22 @@ void glReadFramebuffer(const FramebufferInfo& info) GLuint init_output_framebuffer(int width, int height) { if (gl.ofbo.framebuffer != nullptr - && (width != gl.ofbo.framebuffer->getWidth() || height != gl.ofbo.framebuffer->getHeight() - // if the rotate90 setting has changed - || (gl.gl_major >= 3 && (gl.ofbo.framebuffer->getTexture() == 0) == config::Rotate90))) + && (width != gl.ofbo.framebuffer->getWidth() || height != gl.ofbo.framebuffer->getHeight())) { gl.ofbo.framebuffer.reset(); } if (gl.ofbo.framebuffer == nullptr) { - GLuint texture = 0; - if (config::Rotate90) - { - // Create a texture for rendering to - texture = glcache.GenTexture(); - glcache.BindTexture(GL_TEXTURE_2D, texture); + // Create a texture for rendering to + GLuint texture = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl.ofbo.framebuffer = std::make_unique(width, height, true, texture); glcache.Disable(GL_SCISSOR_TEST); @@ -425,9 +367,7 @@ GlFramebuffer::GlFramebuffer(int width, int height, bool withDepth, GLuint textu // Use a renderbuffer and glBlitFramebuffer glGenRenderbuffers(1, &colorBuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer); -#ifdef GL_RGBA8 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height); -#endif } } makeFramebuffer(withDepth); @@ -505,9 +445,7 @@ GlFramebuffer::GlFramebuffer(int width, int height, bool withDepth, bool withTex // Use a renderbuffer and glBlitFramebuffer glGenRenderbuffers(1, &colorBuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorBuffer); -#ifdef GL_RGBA8 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height); -#endif } makeFramebuffer(withDepth); @@ -520,3 +458,70 @@ GlFramebuffer::~GlFramebuffer() glcache.DeleteTextures(1, &texture); glDeleteRenderbuffers(1, &colorBuffer); } + +bool testBlitFramebuffer() +{ +#ifdef GLES2 + return false; +#else + GLint ofbo = 0; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&ofbo); + + GLuint texture = glcache.GenTexture(); + glcache.BindTexture(GL_TEXTURE_2D, texture); + + u32 data[32 * 32]; + // Lower half is red + for (int i = 0; i < 16 * 32; i++) + data[i] = 0xFF0000FF; + // Upper half is green + for (int i = 16 * 32; i < 32 * 32; i++) + data[i] = 0xFF00FF00; // green + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + GlFramebuffer src(32, 32, false, texture); + + GlFramebuffer dest(32, 64, false, true); + + src.bind(GL_READ_FRAMEBUFFER); + GLenum error = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER); + if (error != GL_FRAMEBUFFER_COMPLETE) { + WARN_LOG(RENDERER, "testBlitFramebuffer: Source framebuffer error %x", error); + return false; + } + dest.bind(GL_DRAW_FRAMEBUFFER); + error = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); + if (error != GL_FRAMEBUFFER_COMPLETE) { + WARN_LOG(RENDERER, "testBlitFramebuffer: Destination framebuffer error %x", error); + return false; + } + + glcache.Disable(GL_SCISSOR_TEST); + glcache.ClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + // Apple A8X chokes on negative coordinates + // Many mobile GPUs don't support dstY0 > dstY1 and the resulting image is flipped vertically + glBlitFramebuffer(0, -1, 32, 31, 0, 64, 32, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST); + + u32 outdata[32 * 64]; + dest.bind(GL_READ_FRAMEBUFFER); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glReadPixels(0, 0, 32, 64, GL_RGBA, GL_UNSIGNED_BYTE, outdata); + glBindFramebuffer(GL_FRAMEBUFFER, ofbo); + error = glGetError(); + if (error != GL_NO_ERROR) { + WARN_LOG(RENDERER, "testBlitFramebuffer: OpenGL error %x", error); + return false; + } + // Now lower half should be green (except last line due to srcY0 == -1) + if (outdata[32 * 2] != 0xFF00FF00) { // green + WARN_LOG(RENDERER, "testBlitFramebuffer: Expected 0xFF00FF00 but was %08x", outdata[0]); + return false; + } + // And upper half should be red + if (outdata[31 * 64 - 1] != 0xFF0000FF) { // red + WARN_LOG(RENDERER, "testBlitFramebuffer: Expected 0xFF0000FF but was %08x", outdata[32 * 64 - 1]); + return false; + } + return true; +#endif +} diff --git a/core/rend/gles/naomi2.cpp b/core/rend/gles/naomi2.cpp index 752b68f1f..fa9ed4107 100644 --- a/core/rend/gles/naomi2.cpp +++ b/core/rend/gles/naomi2.cpp @@ -121,6 +121,9 @@ void main() computeEnvMap(vtx_uv.xy, vpos.xyz, vnorm); #endif #endif +#if MODIFIER_VOLUME == 1 + vpos.z = min(vpos.z, -0.001); +#endif vpos = projMat * vpos; wDivide(vpos); @@ -348,17 +351,18 @@ void computeBumpMap(inout vec4 color0, vec4 color1, vec3 position, vec3 normal, )"; -N2VertexSource::N2VertexSource(bool gouraud, bool geometryOnly, bool texture) : OpenGlSource() +N2VertexSource::N2VertexSource(bool gouraud, bool modifierVolume, bool texture) : OpenGlSource() { - addConstant("pp_Gouraud", gouraud); - addConstant("POSITION_ONLY", geometryOnly); + addConstant("pp_Gouraud", (int)gouraud); + addConstant("POSITION_ONLY", (int)modifierVolume); addConstant("pp_TwoVolumes", 0); addConstant("pp_Texture", (int)texture); addConstant("LIGHT_ON", 1); + addConstant("MODIFIER_VOLUME", (int)modifierVolume); addSource(VertexCompatShader); addSource(GouraudSource); - if (!geometryOnly) + if (!modifierVolume) addSource(N2ColorShader); addSource(N2VertexShader); } diff --git a/core/rend/gles/naomi2.h b/core/rend/gles/naomi2.h index fe46f8651..f841e4643 100644 --- a/core/rend/gles/naomi2.h +++ b/core/rend/gles/naomi2.h @@ -22,7 +22,7 @@ class N2VertexSource : public OpenGlSource { public: - N2VertexSource(bool gouraud, bool geometryOnly, bool texture); + N2VertexSource(bool gouraud, bool modifierVolume, bool texture); }; template diff --git a/core/rend/gles/opengl_driver.cpp b/core/rend/gles/opengl_driver.cpp index 8705b661f..001999cc1 100644 --- a/core/rend/gles/opengl_driver.cpp +++ b/core/rend/gles/opengl_driver.cpp @@ -17,12 +17,11 @@ along with Flycast. If not, see . */ #include "opengl_driver.h" -#include "imgui/backends/imgui_impl_opengl3.h" +#include "imgui_impl_opengl3.h" #include "wsi/gl_context.h" -#include "rend/osd.h" -#include "rend/gui.h" #include "glcache.h" #include "gles.h" +#include "hw/pvr/Renderer_if.h" #ifndef GL_CLAMP_TO_BORDER #define GL_CLAMP_TO_BORDER 0x812D @@ -31,41 +30,15 @@ #define GL_TEXTURE_BORDER_COLOR 0x1004 #endif -static constexpr int vmu_coords[8][2] = { - { 0 , 0 }, - { 0 , 0 }, - { 1 , 0 }, - { 1 , 0 }, - { 0 , 1 }, - { 0 , 1 }, - { 1 , 1 }, - { 1 , 1 }, -}; -constexpr int VMU_WIDTH = 70 * 48 / 32; -constexpr int VMU_HEIGHT = 70; -constexpr int VMU_PADDING = 8; - OpenGLDriver::OpenGLDriver() { - for (auto& tex : vmu_lcd_tex_ids) - tex = ImTextureID(); ImGui_ImplOpenGL3_Init(); - EventManager::listen(Event::Resume, emuEventCallback, this); - EventManager::listen(Event::Terminate, emuEventCallback, this); } OpenGLDriver::~OpenGLDriver() { - EventManager::unlisten(Event::Resume, emuEventCallback, this); - EventManager::unlisten(Event::Terminate, emuEventCallback, this); - std::vector texIds; - texIds.reserve(std::size(vmu_lcd_tex_ids) + 1 + textures.size()); - for (ImTextureID texId : vmu_lcd_tex_ids) - if (texId != ImTextureID()) - texIds.push_back((GLuint)(uintptr_t)texId); - if (crosshairTexId != ImTextureID()) - texIds.push_back((GLuint)(uintptr_t)crosshairTexId); + texIds.reserve(textures.size()); for (const auto& it : textures) texIds.push_back((GLuint)(uintptr_t)it.second); if (!texIds.empty()) @@ -73,86 +46,6 @@ OpenGLDriver::~OpenGLDriver() ImGui_ImplOpenGL3_Shutdown(); } -void OpenGLDriver::displayVmus() -{ - if (!gameStarted) - return; - ImGui::SetNextWindowBgAlpha(0); - ImGui::SetNextWindowPos(ImVec2(0, 0)); - ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); - - ImGui::Begin("vmu-window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoInputs - | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoFocusOnAppearing); - const float width = VMU_WIDTH * settings.display.uiScale; - const float height = VMU_HEIGHT * settings.display.uiScale; - const float padding = VMU_PADDING * settings.display.uiScale; - for (int i = 0; i < 8; i++) - { - if (!vmu_lcd_status[i]) - continue; - - if (vmu_lcd_changed[i] || vmu_lcd_tex_ids[i] == ImTextureID()) - vmu_lcd_tex_ids[i] = updateTexture("__vmu" + std::to_string(i), (const u8 *)vmu_lcd_data[i], 48, 32); - - int x = vmu_coords[i][0]; - int y = vmu_coords[i][1]; - ImVec2 pos; - if (x == 0) - pos.x = padding; - else - pos.x = ImGui::GetIO().DisplaySize.x - width - padding; - if (y == 0) - { - pos.y = padding; - if (i & 1) - pos.y += height + padding; - } - else - { - pos.y = ImGui::GetIO().DisplaySize.y - height - padding; - if (i & 1) - pos.y -= height + padding; - } - ImVec2 pos_b(pos.x + width, pos.y + height); - ImGui::GetWindowDrawList()->AddImage(vmu_lcd_tex_ids[i], pos, pos_b, ImVec2(0, 1), ImVec2(1, 0), 0xC0ffffff); - } - ImGui::End(); -} - -void OpenGLDriver::displayCrosshairs() -{ - if (!gameStarted) - return; - if (!crosshairsNeeded()) - return; - - if (crosshairTexId == ImTextureID()) - crosshairTexId = updateTexture("__crosshair", (const u8 *)getCrosshairTextureData(), 16, 16); - - ImGui::SetNextWindowBgAlpha(0); - ImGui::SetNextWindowPos(ImVec2(0, 0)); - ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); - - ImGui::Begin("xhair-window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoInputs - | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoFocusOnAppearing); - for (u32 i = 0; i < config::CrosshairColor.size(); i++) - { - if (config::CrosshairColor[i] == 0) - continue; - if (settings.platform.isConsole() && config::MapleMainDevices[i] != MDT_LightGun) - continue; - - ImVec2 pos; - std::tie(pos.x, pos.y) = getCrosshairPosition(i); - pos.x -= (XHAIR_WIDTH * settings.display.uiScale) / 2.f; - pos.y += (XHAIR_WIDTH * settings.display.uiScale) / 2.f; - ImVec2 pos_b(pos.x + XHAIR_WIDTH * settings.display.uiScale, pos.y - XHAIR_HEIGHT * settings.display.uiScale); - - ImGui::GetWindowDrawList()->AddImage(crosshairTexId, pos, pos_b, ImVec2(0, 1), ImVec2(1, 0), config::CrosshairColor[i]); - } - ImGui::End(); -} - void OpenGLDriver::newFrame() { ImGui_ImplOpenGL3_NewFrame(); @@ -160,6 +53,17 @@ void OpenGLDriver::newFrame() void OpenGLDriver::renderDrawData(ImDrawData* drawData, bool gui_open) { + if (gui_open) + { +#ifndef TARGET_IPHONE + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif + glcache.Disable(GL_SCISSOR_TEST); + glcache.ClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + if (renderer != nullptr) + renderer->RenderLastFrame(); + } ImGui_ImplOpenGL3_RenderDrawData(drawData); if (gui_open) frameRendered = true; @@ -172,15 +76,21 @@ void OpenGLDriver::present() frameRendered = false; } -ImTextureID OpenGLDriver::updateTexture(const std::string& name, const u8 *data, int width, int height) +ImTextureID OpenGLDriver::updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) { ImTextureID oldId = getTexture(name); if (oldId != ImTextureID()) glcache.DeleteTextures(1, (GLuint *)&oldId); GLuint texId = glcache.GenTexture(); - glcache.BindTexture(GL_TEXTURE_2D, texId); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glcache.BindTexture(GL_TEXTURE_2D, texId); + if (nearestSampling) { + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + else { + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } if (gl.border_clamp_supported) { float color[] = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -197,3 +107,12 @@ ImTextureID OpenGLDriver::updateTexture(const std::string& name, const u8 *data, return textures[name] = (ImTextureID)(u64)texId; } + +void OpenGLDriver::deleteTexture(const std::string& name) +{ + auto it = textures.find(name); + if (it != textures.end()) { + glcache.DeleteTextures(1, (GLuint *)&it->second); + textures.erase(it); + } +} diff --git a/core/rend/gles/opengl_driver.h b/core/rend/gles/opengl_driver.h index 9588a9965..77c63b9f7 100644 --- a/core/rend/gles/opengl_driver.h +++ b/core/rend/gles/opengl_driver.h @@ -17,8 +17,7 @@ along with Flycast. If not, see . */ #pragma once -#include "rend/imgui_driver.h" -#include "emulator.h" +#include "ui/imgui_driver.h" #include class OpenGLDriver final : public ImGuiDriver @@ -27,9 +26,6 @@ class OpenGLDriver final : public ImGuiDriver OpenGLDriver(); ~OpenGLDriver() override; - void displayVmus() override; - void displayCrosshairs() override; - void newFrame() override; void renderDrawData(ImDrawData* drawData, bool gui_open) override; void present() override; @@ -38,7 +34,8 @@ class OpenGLDriver final : public ImGuiDriver frameRendered = true; } - ImTextureID getTexture(const std::string& name) override { + ImTextureID getTexture(const std::string& name) override + { auto it = textures.find(name); if (it != textures.end()) return it->second; @@ -46,30 +43,10 @@ class OpenGLDriver final : public ImGuiDriver return ImTextureID{}; } - ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height) override; + ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) override; + void deleteTexture(const std::string& name) override; private: - void emuEvent(Event event) - { - switch (event) - { - case Event::Resume: - gameStarted = true; - break; - case Event::Terminate: - gameStarted = false; - break; - default: - break; - } - } - static void emuEventCallback(Event event, void *p) { - ((OpenGLDriver *)p)->emuEvent(event); - } - - ImTextureID vmu_lcd_tex_ids[8]; - ImTextureID crosshairTexId = ImTextureID(); - bool gameStarted = false; bool frameRendered = false; std::unordered_map textures; }; diff --git a/core/rend/gles/postprocess.cpp b/core/rend/gles/postprocess.cpp index 73155f9e6..d6029d324 100644 --- a/core/rend/gles/postprocess.cpp +++ b/core/rend/gles/postprocess.cpp @@ -20,6 +20,7 @@ #include "postprocess.h" #ifdef LIBRETRO +#include "quad.h" #include PostProcessor postProcessor; @@ -67,7 +68,9 @@ float dithertable[16] = float[]( void main() { vec2 texcoord = vTexCoord; + texcoord.y = 1. - texcoord.y; vec2 texcoord2 = vTexCoord; + texcoord2.y = 1. - texcoord2.y; texcoord2.x *= float(TextureSize.x); texcoord2.y *= float(TextureSize.y); vec4 color = texture(Source, texcoord); @@ -78,6 +81,7 @@ void main() int taps = int(3); float tap = (2.666f/float(taps)) / float(min(TextureSize.y, 720)); vec2 texcoord4 = vTexCoord; + texcoord4.y = 1. - texcoord4.y; texcoord4.y -= tap * 2.f; int bl; vec4 ble = vec4(0.0); @@ -136,6 +140,7 @@ void main() int taps = 32; float tap = 12.0/taps; vec2 texcoord4 = vTexCoord; + texcoord4.y = 1. - texcoord4.y; texcoord4.x = texcoord4.x + (2.0/640.0); texcoord4.y = texcoord4.y; vec4 blur1 = texture(Source, texcoord4); @@ -251,9 +256,7 @@ void PostProcessor::term() { framebuffer.reset(); vertexBuffer.reset(); - vertexBufferShifted.reset(); vertexArray.term(); - vertexArrayShifted.term(); PostProcessShader::term(); glCheck(); } @@ -281,8 +284,8 @@ void PostProcessor::render(GLuint output_fbo) if (!config::PowerVR2Filter) { - // Just handle shifting - if (gl.gl_major < 3) + // Just handle shifting and Y flipping + if (gl.bogusBlitFramebuffer) { glBindFramebuffer(GL_FRAMEBUFFER, output_fbo); glViewport(0, 0, framebuffer->getWidth(), framebuffer->getHeight()); @@ -291,17 +294,17 @@ void PostProcessor::render(GLuint output_fbo) glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); static float vertices[20] = { - -1.f, 1.f, 1.f, 0.f, 1.f, - -1.f, -1.f, 1.f, 0.f, 0.f, - 1.f, 1.f, 1.f, 1.f, 1.f, - 1.f, -1.f, 1.f, 1.f, 0.f, + -1.f, -1.f, 1.f, 0.f, 1.f, + -1.f, 1.f, 1.f, 0.f, 0.f, + 1.f, -1.f, 1.f, 1.f, 1.f, + 1.f, 1.f, 1.f, 1.f, 0.f, }; vertices[0] = vertices[5] = -1.f + gl.ofbo.shiftX * 2.f / framebuffer->getWidth(); vertices[10] = vertices[15] = vertices[0] + 2; - vertices[1] = vertices[11] = 1.f - gl.ofbo.shiftY * 2.f / framebuffer->getHeight(); - vertices[6] = vertices[16] = vertices[1] - 2; + vertices[1] = vertices[11] = -1.f - gl.ofbo.shiftY * 2.f / framebuffer->getHeight(); + vertices[6] = vertices[16] = vertices[1] + 2; glcache.Disable(GL_BLEND); - drawQuad(framebuffer->getTexture(), false, false, vertices); + gl.quad->draw(framebuffer->getTexture(), false, false, vertices); } else { @@ -310,8 +313,8 @@ void PostProcessor::render(GLuint output_fbo) glBindFramebuffer(GL_DRAW_FRAMEBUFFER, output_fbo); glcache.ClearColor(VO_BORDER_COL.red(), VO_BORDER_COL.green(), VO_BORDER_COL.blue(), 1.f); glClear(GL_COLOR_BUFFER_BIT); - glBlitFramebuffer(-gl.ofbo.shiftX, gl.ofbo.shiftY, framebuffer->getWidth() - gl.ofbo.shiftX, framebuffer->getHeight() + gl.ofbo.shiftY, - 0, 0, framebuffer->getWidth(), framebuffer->getHeight(), + glBlitFramebuffer(-gl.ofbo.shiftX, -gl.ofbo.shiftY, framebuffer->getWidth() - gl.ofbo.shiftX, framebuffer->getHeight() - gl.ofbo.shiftY, + 0, framebuffer->getHeight(), framebuffer->getWidth(), 0, GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebuffer(GL_FRAMEBUFFER, output_fbo); #endif @@ -319,28 +322,16 @@ void PostProcessor::render(GLuint output_fbo) return; } - PostProcessShader::select(FB_W_CTRL.fb_dither, SPG_CONTROL.interlace, FB_R_CTRL.vclk_div == 1 && SPG_CONTROL.interlace == 0); - if (gl.ofbo.shiftX != 0 || gl.ofbo.shiftY != 0) - { - if (vertexBufferShifted == nullptr) - vertexBufferShifted = std::make_unique(GL_ARRAY_BUFFER); - float vertices[] = { - -1, 1, 1, - -1, -1, 1, - 1, 1, 1, - 1, -1, 1, - }; - vertices[0] = vertices[3] = -1.f + gl.ofbo.shiftX * 2.f / framebuffer->getWidth(); - vertices[6] = vertices[9] = vertices[0] + 2; - vertices[1] = vertices[7] = 1.f - gl.ofbo.shiftY * 2.f / framebuffer->getHeight(); - vertices[4] = vertices[10] = vertices[1] - 2; - vertexBufferShifted->update(vertices, sizeof(vertices)); - vertexArrayShifted.bind(vertexBufferShifted.get()); - } + if (_pvrrc == nullptr) + // Framebuffer render: no dithering + PostProcessShader::select(false, + SPG_CONTROL.interlace, + FB_R_CTRL.vclk_div == 1 && SPG_CONTROL.interlace == 0); else - { - vertexArray.bind(vertexBuffer.get()); - } + PostProcessShader::select(pvrrc.fb_W_CTRL.fb_dither == 1 && pvrrc.fb_W_CTRL.fb_packmode <= 3 && !config::EmulateFramebuffer, + SPG_CONTROL.interlace, + FB_R_CTRL.vclk_div == 1 && SPG_CONTROL.interlace == 0); + vertexArray.bind(vertexBuffer.get()); glBindFramebuffer(GL_FRAMEBUFFER, output_fbo); glActiveTexture(GL_TEXTURE0); diff --git a/core/rend/gles/postprocess.h b/core/rend/gles/postprocess.h index 337b5719f..a92e336c3 100644 --- a/core/rend/gles/postprocess.h +++ b/core/rend/gles/postprocess.h @@ -39,8 +39,6 @@ class PostProcessor std::unique_ptr vertexBuffer; VertexArray vertexArray; std::unique_ptr framebuffer; - std::unique_ptr vertexBufferShifted; - VertexArray vertexArrayShifted; }; extern PostProcessor postProcessor; diff --git a/core/rend/gles/quad.cpp b/core/rend/gles/quad.cpp index 5419b9340..d331b703c 100644 --- a/core/rend/gles/quad.cpp +++ b/core/rend/gles/quad.cpp @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ -#include "gles.h" +#include "quad.h" static const char* VertexShader = R"( in highp vec3 in_pos; @@ -38,71 +38,42 @@ static const char* FragmentShader = R"( in mediump vec2 vtx_uv; uniform sampler2D tex; +uniform mediump vec4 tint; void main() { - gl_FragColor = texture(tex, vtx_uv); + gl_FragColor = tint * texture(tex, vtx_uv); } )"; -class QuadVertexArray final : public GlVertexArray +GlQuadDrawer::GlQuadDrawer() { -protected: - void defineVtxAttribs() override + OpenGlSource fragmentShader; + fragmentShader.addSource(PixelCompatShader) + .addSource(FragmentShader); + OpenGlSource vertexShader; + vertexShader.addConstant("ROTATE", 0) + .addSource(VertexCompatShader) + .addSource(VertexShader); + + const std::string fragmentGlsl = fragmentShader.generate(); + shader = gl_CompileAndLink(vertexShader.generate().c_str(), fragmentGlsl.c_str()); + GLint tex = glGetUniformLocation(shader, "tex"); + glUniform1i(tex, 0); // texture 0 + tintUniform = glGetUniformLocation(shader, "tint"); + + vertexShader.setConstant("ROTATE", 1); + rot90shader = gl_CompileAndLink(vertexShader.generate().c_str(), fragmentGlsl.c_str()); + tex = glGetUniformLocation(rot90shader, "tex"); + glUniform1i(tex, 0); // texture 0 + rot90TintUniform = glGetUniformLocation(rot90shader, "tint"); + + quadIndexBuffer = std::make_unique(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); + static const GLushort indices[] = { 0, 1, 2, 1, 3 }; + quadIndexBuffer->update(indices, sizeof(indices)); + + quadBuffer = std::make_unique(GL_ARRAY_BUFFER, GL_STATIC_DRAW); { - glEnableVertexAttribArray(VERTEX_POS_ARRAY); - glVertexAttribPointer(VERTEX_POS_ARRAY, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)0); - glEnableVertexAttribArray(VERTEX_UV_ARRAY); - glVertexAttribPointer(VERTEX_UV_ARRAY, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3)); - glDisableVertexAttribArray(VERTEX_COL_BASE_ARRAY); - glDisableVertexAttribArray(VERTEX_COL_OFFS_ARRAY); - glDisableVertexAttribArray(VERTEX_COL_BASE1_ARRAY); - glDisableVertexAttribArray(VERTEX_COL_OFFS1_ARRAY); - glDisableVertexAttribArray(VERTEX_UV1_ARRAY); - } -}; - -static GLuint shader; -static GLuint rot90shader; -static QuadVertexArray quadVertexArray; -static QuadVertexArray quadVertexArraySwapY; -static std::unique_ptr quadBuffer; -static std::unique_ptr quadBufferSwapY; -static std::unique_ptr quadIndexBuffer; -static std::unique_ptr quadBufferCustom; -static QuadVertexArray quadVertexArrayCustom; - -void initQuad() -{ - if (shader == 0) - { - OpenGlSource fragmentShader; - fragmentShader.addSource(PixelCompatShader) - .addSource(FragmentShader); - OpenGlSource vertexShader; - vertexShader.addConstant("ROTATE", 0) - .addSource(VertexCompatShader) - .addSource(VertexShader); - - const std::string fragmentGlsl = fragmentShader.generate(); - shader = gl_CompileAndLink(vertexShader.generate().c_str(), fragmentGlsl.c_str()); - GLint tex = glGetUniformLocation(shader, "tex"); - glUniform1i(tex, 0); // texture 0 - - vertexShader.setConstant("ROTATE", 1); - rot90shader = gl_CompileAndLink(vertexShader.generate().c_str(), fragmentGlsl.c_str()); - tex = glGetUniformLocation(rot90shader, "tex"); - glUniform1i(tex, 0); // texture 0 - } - if (quadIndexBuffer == nullptr) - { - quadIndexBuffer = std::make_unique(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); - static const GLushort indices[] = { 0, 1, 2, 1, 3 }; - quadIndexBuffer->update(indices, sizeof(indices)); - } - if (quadBuffer == nullptr) - { - quadBuffer = std::make_unique(GL_ARRAY_BUFFER, GL_STATIC_DRAW); float vertices[4][5] = { { -1.f, 1.f, 1.f, 0.f, 1.f }, { -1.f, -1.f, 1.f, 0.f, 0.f }, @@ -111,9 +82,8 @@ void initQuad() }; quadBuffer->update(vertices, sizeof(vertices)); } - if (quadBufferSwapY == nullptr) + quadBufferSwapY = std::make_unique(GL_ARRAY_BUFFER, GL_STATIC_DRAW); { - quadBufferSwapY = std::make_unique(GL_ARRAY_BUFFER, GL_STATIC_DRAW); float vertices[4][5] = { { -1.f, 1.f, 1.f, 0.f, 0.f }, { -1.f, -1.f, 1.f, 0.f, 1.f }, @@ -122,12 +92,11 @@ void initQuad() }; quadBufferSwapY->update(vertices, sizeof(vertices)); } - if (quadBufferCustom == nullptr) - quadBufferCustom = std::make_unique(GL_ARRAY_BUFFER); + quadBufferCustom = std::make_unique(GL_ARRAY_BUFFER); glCheck(); } -void termQuad() +GlQuadDrawer::~GlQuadDrawer() { quadIndexBuffer.reset(); quadBuffer.reset(); @@ -144,8 +113,7 @@ void termQuad() rot90shader = 0; } -// coords is an optional array of 20 floats (4 vertices with x,y,z,u,v each) -void drawQuad(GLuint texId, bool rotate, bool swapY, float *coords) +void GlQuadDrawer::draw(GLuint texId, bool rotate, bool swapY, const float *coords, const float *color) { glcache.Disable(GL_SCISSOR_TEST); glcache.Disable(GL_DEPTH_TEST); @@ -157,6 +125,12 @@ void drawQuad(GLuint texId, bool rotate, bool swapY, float *coords) glActiveTexture(GL_TEXTURE0); glcache.BindTexture(GL_TEXTURE_2D, texId); + if (color == nullptr) { + static constexpr float white[4] { 1.f, 1.f, 1.f, 1.f }; + color = white; + } + glUniform4fv(rotate ? rot90TintUniform : tintUniform, 1, color); + if (coords == nullptr) { if (swapY) diff --git a/core/rend/gles/quad.h b/core/rend/gles/quad.h new file mode 100644 index 000000000..d2c78cf3e --- /dev/null +++ b/core/rend/gles/quad.h @@ -0,0 +1,60 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once +#include "gles.h" + +class GlQuadDrawer +{ +public: + GlQuadDrawer(); + ~GlQuadDrawer(); + + // coords is an optional array of 20 floats (4 vertices with x,y,z,u,v each) + void draw(GLuint texId, bool rotate = false, bool swapY = false, const float *coords = nullptr, const float *color = nullptr); + +private: + class VertexArray final : public GlVertexArray + { + protected: + void defineVtxAttribs() override + { + glEnableVertexAttribArray(VERTEX_POS_ARRAY); + glVertexAttribPointer(VERTEX_POS_ARRAY, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)0); + glEnableVertexAttribArray(VERTEX_UV_ARRAY); + glVertexAttribPointer(VERTEX_UV_ARRAY, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3)); + glDisableVertexAttribArray(VERTEX_COL_BASE_ARRAY); + glDisableVertexAttribArray(VERTEX_COL_OFFS_ARRAY); + glDisableVertexAttribArray(VERTEX_COL_BASE1_ARRAY); + glDisableVertexAttribArray(VERTEX_COL_OFFS1_ARRAY); + glDisableVertexAttribArray(VERTEX_UV1_ARRAY); + } + }; + + GLuint shader; + GLint tintUniform; + GLuint rot90shader; + GLint rot90TintUniform; + VertexArray quadVertexArray; + VertexArray quadVertexArraySwapY; + std::unique_ptr quadBuffer; + std::unique_ptr quadBufferSwapY; + std::unique_ptr quadIndexBuffer; + std::unique_ptr quadBufferCustom; + VertexArray quadVertexArrayCustom; +}; diff --git a/core/rend/gui.cpp b/core/rend/gui.cpp deleted file mode 100644 index a7c3005df..000000000 --- a/core/rend/gui.cpp +++ /dev/null @@ -1,3191 +0,0 @@ -/* - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . - */ -#include "gui.h" -#include "osd.h" -#include "cfg/cfg.h" -#include "hw/maple/maple_if.h" -#include "hw/maple/maple_devs.h" -#include "imgui/imgui.h" -#include "roboto_medium.h" -#include "network/net_handshake.h" -#include "network/ggpo.h" -#include "wsi/context.h" -#include "input/gamepad_device.h" -#include "gui_util.h" -#include "game_scanner.h" -#include "version.h" -#include "oslib/oslib.h" -#include "oslib/audiostream.h" -#include "imgread/common.h" -#include "log/LogManager.h" -#include "emulator.h" -#include "rend/mainui.h" -#include "lua/lua.h" -#include "gui_chat.h" -#include "imgui_driver.h" -#include "implot/implot.h" -#include "boxart/boxart.h" -#include "profiler/fc_profiler.h" -#include "hw/naomi/card_reader.h" -#if defined(USE_SDL) -#include "sdl/sdl.h" -#endif - -#ifdef __ANDROID__ -#include "gui_android.h" -#endif - -#ifdef _WIN32 -#include -#else -#include -#endif -#include -#include - -static bool game_started; - -int insetLeft, insetRight, insetTop, insetBottom; -std::unique_ptr imguiDriver; - -static bool inited = false; -GuiState gui_state = GuiState::Main; -static bool commandLineStart; -static u32 mouseButtons; -static int mouseX, mouseY; -static float mouseWheel; -static std::string error_msg; -static bool error_msg_shown; -static std::string osd_message; -static double osd_message_end; -static std::mutex osd_message_mutex; -static void (*showOnScreenKeyboard)(bool show); -static bool keysUpNextFrame[512]; - -static int map_system = 0; -static void reset_vmus(); -void error_popup(); - -static GameScanner scanner; -static BackgroundGameLoader gameLoader; -static Boxart boxart; -static Chat chat; -static std::recursive_mutex guiMutex; -using LockGuard = std::lock_guard; - -static void emuEventCallback(Event event, void *) -{ - switch (event) - { - case Event::Resume: - game_started = true; - break; - case Event::Start: - GamepadDevice::load_system_mappings(); - break; - case Event::Terminate: - GamepadDevice::load_system_mappings(); - game_started = false; - break; - default: - break; - } -} - -void gui_init() -{ - if (inited) - return; - inited = true; - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); -#if FC_PROFILER - ImPlot::CreateContext(); -#endif - ImGuiIO& io = ImGui::GetIO(); (void)io; - io.BackendFlags |= ImGuiBackendFlags_HasGamepad; - - io.IniFilename = NULL; - - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - EventManager::listen(Event::Resume, emuEventCallback); - EventManager::listen(Event::Start, emuEventCallback); - EventManager::listen(Event::Terminate, emuEventCallback); - ggpo::receiveChatMessages([](int playerNum, const std::string& msg) { chat.receive(playerNum, msg); }); -} - -static ImGuiKey keycodeToImGuiKey(u8 keycode) -{ - switch (keycode) - { - case 0x2B: return ImGuiKey_Tab; - case 0x50: return ImGuiKey_LeftArrow; - case 0x4F: return ImGuiKey_RightArrow; - case 0x52: return ImGuiKey_UpArrow; - case 0x51: return ImGuiKey_DownArrow; - case 0x4B: return ImGuiKey_PageUp; - case 0x4E: return ImGuiKey_PageDown; - case 0x4A: return ImGuiKey_Home; - case 0x4D: return ImGuiKey_End; - case 0x49: return ImGuiKey_Insert; - case 0x4C: return ImGuiKey_Delete; - case 0x2A: return ImGuiKey_Backspace; - case 0x2C: return ImGuiKey_Space; - case 0x28: return ImGuiKey_Enter; - case 0x29: return ImGuiKey_Escape; - case 0x04: return ImGuiKey_A; - case 0x06: return ImGuiKey_C; - case 0x19: return ImGuiKey_V; - case 0x1B: return ImGuiKey_X; - case 0x1C: return ImGuiKey_Y; - case 0x1D: return ImGuiKey_Z; - case 0xE0: - case 0xE4: - return ImGuiMod_Ctrl; - case 0xE1: - case 0xE5: - return ImGuiMod_Shift; - default: return ImGuiKey_None; - } -} - -void gui_initFonts() -{ - static float uiScale; - - verify(inited); - -#if !defined(TARGET_UWP) && !defined(__SWITCH__) - settings.display.uiScale = std::max(1.f, settings.display.dpi / 100.f * 0.75f); - // Limit scaling on small low-res screens - if (settings.display.width <= 640 || settings.display.height <= 480) - settings.display.uiScale = std::min(1.4f, settings.display.uiScale); -#endif - if (settings.display.uiScale == uiScale && ImGui::GetIO().Fonts->IsBuilt()) - return; - uiScale = settings.display.uiScale; - - // Setup Dear ImGui style - ImGui::GetStyle() = ImGuiStyle{}; - ImGui::StyleColorsDark(); - ImGui::GetStyle().TabRounding = 0; - ImGui::GetStyle().ItemSpacing = ImVec2(8, 8); // from 8,4 - ImGui::GetStyle().ItemInnerSpacing = ImVec2(4, 6); // from 4,4 -#if defined(__ANDROID__) || defined(TARGET_IPHONE) - ImGui::GetStyle().TouchExtraPadding = ImVec2(1, 1); // from 0,0 -#endif - if (settings.display.uiScale > 1) - ImGui::GetStyle().ScaleAllSizes(settings.display.uiScale); - - static const ImWchar ranges[] = - { - 0x0020, 0xFFFF, // All chars - 0, - }; - - ImGuiIO& io = ImGui::GetIO(); - io.Fonts->Clear(); - const float fontSize = 17.f * settings.display.uiScale; - io.Fonts->AddFontFromMemoryCompressedTTF(roboto_medium_compressed_data, roboto_medium_compressed_size, fontSize, nullptr, ranges); - ImFontConfig font_cfg; - font_cfg.MergeMode = true; -#ifdef _WIN32 - u32 cp = GetACP(); - std::string fontDir = std::string(nowide::getenv("SYSTEMROOT")) + "\\Fonts\\"; - switch (cp) - { - case 932: // Japanese - { - font_cfg.FontNo = 2; // UIGothic - ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "msgothic.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); - font_cfg.FontNo = 2; // Meiryo UI - if (font == nullptr) - io.Fonts->AddFontFromFileTTF((fontDir + "Meiryo.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); - } - break; - case 949: // Korean - { - ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "Malgun.ttf").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); - if (font == nullptr) - { - font_cfg.FontNo = 2; // Dotum - io.Fonts->AddFontFromFileTTF((fontDir + "Gulim.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); - } - } - break; - case 950: // Traditional Chinese - { - font_cfg.FontNo = 1; // Microsoft JhengHei UI Regular - ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "Msjh.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); - font_cfg.FontNo = 0; - if (font == nullptr) - io.Fonts->AddFontFromFileTTF((fontDir + "MSJH.ttf").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); - } - break; - case 936: // Simplified Chinese - io.Fonts->AddFontFromFileTTF((fontDir + "Simsun.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseSimplifiedOfficial()); - break; - default: - break; - } -#elif defined(__APPLE__) && !defined(TARGET_IPHONE) - std::string fontDir = std::string("/System/Library/Fonts/"); - - extern std::string os_Locale(); - std::string locale = os_Locale(); - - if (locale.find("ja") == 0) // Japanese - { - io.Fonts->AddFontFromFileTTF((fontDir + "ヒラギノ角ゴシック W4.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); - } - else if (locale.find("ko") == 0) // Korean - { - io.Fonts->AddFontFromFileTTF((fontDir + "AppleSDGothicNeo.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); - } - else if (locale.find("zh-Hant") == 0) // Traditional Chinese - { - io.Fonts->AddFontFromFileTTF((fontDir + "PingFang.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); - } - else if (locale.find("zh-Hans") == 0) // Simplified Chinese - { - io.Fonts->AddFontFromFileTTF((fontDir + "PingFang.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseSimplifiedOfficial()); - } -#elif defined(__ANDROID__) - if (getenv("FLYCAST_LOCALE") != nullptr) - { - const ImWchar *glyphRanges = nullptr; - std::string locale = getenv("FLYCAST_LOCALE"); - if (locale.find("ja") == 0) // Japanese - glyphRanges = io.Fonts->GetGlyphRangesJapanese(); - else if (locale.find("ko") == 0) // Korean - glyphRanges = io.Fonts->GetGlyphRangesKorean(); - else if (locale.find("zh_TW") == 0 - || locale.find("zh_HK") == 0) // Traditional Chinese - glyphRanges = GetGlyphRangesChineseTraditionalOfficial(); - else if (locale.find("zh_CN") == 0) // Simplified Chinese - glyphRanges = GetGlyphRangesChineseSimplifiedOfficial(); - - if (glyphRanges != nullptr) - io.Fonts->AddFontFromFileTTF("/system/fonts/NotoSansCJK-Regular.ttc", fontSize, &font_cfg, glyphRanges); - } - - // TODO Linux, iOS, ... -#endif - NOTICE_LOG(RENDERER, "Screen DPI is %.0f, size %d x %d. Scaling by %.2f", settings.display.dpi, settings.display.width, settings.display.height, settings.display.uiScale); -} - -void gui_keyboard_input(u16 wc) -{ - ImGuiIO& io = ImGui::GetIO(); - if (io.WantCaptureKeyboard) - io.AddInputCharacter(wc); -} - -void gui_keyboard_inputUTF8(const std::string& s) -{ - ImGuiIO& io = ImGui::GetIO(); - if (io.WantCaptureKeyboard) - io.AddInputCharactersUTF8(s.c_str()); -} - -void gui_keyboard_key(u8 keyCode, bool pressed) -{ - if (!inited) - return; - ImGuiKey key = keycodeToImGuiKey(keyCode); - if (key == ImGuiKey_None) - return; - if (!pressed && ImGui::IsKeyDown(key)) - { - keysUpNextFrame[keyCode] = true; - return; - } - ImGuiIO& io = ImGui::GetIO(); - io.AddKeyEvent(key, pressed); -} - -bool gui_keyboard_captured() -{ - ImGuiIO& io = ImGui::GetIO(); - return io.WantCaptureKeyboard; -} - -bool gui_mouse_captured() -{ - ImGuiIO& io = ImGui::GetIO(); - return io.WantCaptureMouse; -} - -void gui_set_mouse_position(int x, int y) -{ - mouseX = std::round(x * settings.display.pointScale); - mouseY = std::round(y * settings.display.pointScale); -} - -void gui_set_mouse_button(int button, bool pressed) -{ - if (pressed) - mouseButtons |= 1 << button; - else - mouseButtons &= ~(1 << button); -} - -void gui_set_mouse_wheel(float delta) -{ - mouseWheel += delta; -} - -static void gui_newFrame() -{ - imguiDriver->newFrame(); - ImGui::GetIO().DisplaySize.x = settings.display.width; - ImGui::GetIO().DisplaySize.y = settings.display.height; - - ImGuiIO& io = ImGui::GetIO(); - - if (mouseX < 0 || mouseX >= settings.display.width || mouseY < 0 || mouseY >= settings.display.height) - io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); - else - io.AddMousePosEvent(mouseX, mouseY); - static bool delayTouch; -#if defined(__ANDROID__) || defined(TARGET_IPHONE) - // Delay touch by one frame to allow widgets to be hovered before click - // This is required for widgets using ImGuiButtonFlags_AllowItemOverlap such as TabItem's - if (!delayTouch && (mouseButtons & (1 << 0)) != 0 && !io.MouseDown[ImGuiMouseButton_Left]) - delayTouch = true; - else - delayTouch = false; -#endif - if (io.WantCaptureMouse) - { - io.AddMouseWheelEvent(0, -mouseWheel / 16); - mouseWheel = 0; - } - if (!delayTouch) - io.AddMouseButtonEvent(ImGuiMouseButton_Left, (mouseButtons & (1 << 0)) != 0); - io.AddMouseButtonEvent(ImGuiMouseButton_Right, (mouseButtons & (1 << 1)) != 0); - io.AddMouseButtonEvent(ImGuiMouseButton_Middle, (mouseButtons & (1 << 2)) != 0); - io.AddMouseButtonEvent(3, (mouseButtons & (1 << 3)) != 0); - - // shows a popup navigation window even in game because of the OSD - //io.AddKeyEvent(ImGuiKey_GamepadFaceLeft, ((kcode[0] & DC_BTN_X) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadFaceRight, ((kcode[0] & DC_BTN_B) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadFaceUp, ((kcode[0] & DC_BTN_Y) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadFaceDown, ((kcode[0] & DC_BTN_A) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadDpadLeft, ((kcode[0] & DC_DPAD_LEFT) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadDpadRight, ((kcode[0] & DC_DPAD_RIGHT) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadDpadUp, ((kcode[0] & DC_DPAD_UP) == 0)); - io.AddKeyEvent(ImGuiKey_GamepadDpadDown, ((kcode[0] & DC_DPAD_DOWN) == 0)); - - float analog; - analog = joyx[0] < 0 ? -(float)joyx[0] / 128 : 0.f; - io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickLeft, analog > 0.1f, analog); - analog = joyx[0] > 0 ? (float)joyx[0] / 128 : 0.f; - io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickRight, analog > 0.1f, analog); - analog = joyy[0] < 0 ? -(float)joyy[0] / 128.f : 0.f; - io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickUp, analog > 0.1f, analog); - analog = joyy[0] > 0 ? (float)joyy[0] / 128.f : 0.f; - io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickDown, analog > 0.1f, analog); - - ImGui::GetStyle().Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); - - if (showOnScreenKeyboard != nullptr) - showOnScreenKeyboard(io.WantTextInput); - -#if defined(USE_SDL) - if (io.WantTextInput && !SDL_IsTextInputActive()) - { - SDL_StartTextInput(); - } - else if (!io.WantTextInput && SDL_IsTextInputActive()) - { - SDL_StopTextInput(); - } -#endif -} - -static void delayedKeysUp() -{ - ImGuiIO& io = ImGui::GetIO(); - for (u32 i = 0; i < std::size(keysUpNextFrame); i++) - if (keysUpNextFrame[i]) - io.AddKeyEvent(keycodeToImGuiKey(i), false); - memset(keysUpNextFrame, 0, sizeof(keysUpNextFrame)); -} - -static void gui_endFrame(bool gui_open) -{ - ImGui::Render(); - imguiDriver->renderDrawData(ImGui::GetDrawData(), gui_open); - delayedKeysUp(); -} - -void gui_setOnScreenKeyboardCallback(void (*callback)(bool show)) -{ - showOnScreenKeyboard = callback; -} - -void gui_set_insets(int left, int right, int top, int bottom) -{ - insetLeft = left; - insetRight = right; - insetTop = top; - insetBottom = bottom; -} - -#if 0 -#include "oslib/timeseries.h" -#include -TimeSeries renderTimes; -TimeSeries vblankTimes; - -void gui_plot_render_time(int width, int height) -{ - std::vector v = renderTimes.data(); - ImGui::PlotLines("Render Times", v.data(), v.size(), 0, "", 0.0, 1.0 / 30.0, ImVec2(300, 50)); - ImGui::Text("StdDev: %.1f%%", renderTimes.stddev() * 100.f / 0.01666666667f); - v = vblankTimes.data(); - ImGui::PlotLines("VBlank", v.data(), v.size(), 0, "", 0.0, 1.0 / 30.0, ImVec2(300, 50)); - ImGui::Text("StdDev: %.1f%%", vblankTimes.stddev() * 100.f / 0.01666666667f); -} -#endif - -void gui_open_settings() -{ - const LockGuard lock(guiMutex); - if (gui_state == GuiState::Closed && !settings.naomi.slave) - { - if (!ggpo::active()) - { - HideOSD(); - try { - emu.stop(); - gui_state = GuiState::Commands; - } catch (const FlycastException& e) { - gui_stop_game(e.what()); - } - } - else - { - chat.toggle(); - } - } - else if (gui_state == GuiState::VJoyEdit) - { - gui_state = GuiState::VJoyEditCommands; - } - else if (gui_state == GuiState::Loading) - { - gameLoader.cancel(); - } - else if (gui_state == GuiState::Commands) - { - gui_state = GuiState::Closed; - GamepadDevice::load_system_mappings(); - emu.start(); - } -} - -void gui_start_game(const std::string& path) -{ - const LockGuard lock(guiMutex); - emu.unloadGame(); - reset_vmus(); - chat.reset(); - - scanner.stop(); - gui_state = GuiState::Loading; - gameLoader.load(path); -} - -void gui_stop_game(const std::string& message) -{ - const LockGuard lock(guiMutex); - if (!commandLineStart) - { - // Exit to main menu - emu.unloadGame(); - gui_state = GuiState::Main; - reset_vmus(); - if (!message.empty()) - gui_error("Flycast has stopped.\n\n" + message); - } - else - { - if (!message.empty()) - ERROR_LOG(COMMON, "Flycast has stopped: %s", message.c_str()); - // Exit emulator - dc_exit(); - } -} - -static bool savestateAllowed() -{ - return !settings.content.path.empty() && !settings.network.online && !settings.naomi.multiboard; -} - -static void gui_display_commands() -{ - imguiDriver->displayVmus(); - - centerNextWindow(); - ImGui::SetNextWindowSize(ScaledVec2(330, 0)); - - ImGui::Begin("##commands", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize); - - { - if (card_reader::barcodeAvailable()) - { - char cardBuf[64] {}; - strncpy(cardBuf, card_reader::barcodeGetCard().c_str(), sizeof(cardBuf) - 1); - if (ImGui::InputText("Card", cardBuf, sizeof(cardBuf), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr)) - card_reader::barcodeSetCard(cardBuf); - } - - DisabledScope scope(!savestateAllowed()); - - // Load State - if (ImGui::Button("Load State", ScaledVec2(110, 50)) && savestateAllowed()) - { - gui_state = GuiState::Closed; - dc_loadstate(config::SavestateSlot); - } - ImGui::SameLine(); - - // Slot # - std::string slot = "Slot " + std::to_string((int)config::SavestateSlot + 1); - if (ImGui::Button(slot.c_str(), ImVec2(80 * settings.display.uiScale - ImGui::GetStyle().FramePadding.x, 50 * settings.display.uiScale))) - ImGui::OpenPopup("slot_select_popup"); - if (ImGui::BeginPopup("slot_select_popup")) - { - for (int i = 0; i < 10; i++) - if (ImGui::Selectable(std::to_string(i + 1).c_str(), config::SavestateSlot == i, 0, - ImVec2(ImGui::CalcTextSize("Slot 8").x, 0))) { - config::SavestateSlot = i; - SaveSettings(); - } - ImGui::EndPopup(); - } - ImGui::SameLine(); - - // Save State - if (ImGui::Button("Save State", ScaledVec2(110, 50)) && savestateAllowed()) - { - gui_state = GuiState::Closed; - dc_savestate(config::SavestateSlot); - } - } - - ImGui::Columns(2, "buttons", false); - - // Settings - if (ImGui::Button("Settings", ScaledVec2(150, 50))) - { - gui_state = GuiState::Settings; - } - ImGui::NextColumn(); - if (ImGui::Button("Resume", ScaledVec2(150, 50))) - { - GamepadDevice::load_system_mappings(); - gui_state = GuiState::Closed; - } - - ImGui::NextColumn(); - - // Insert/Eject Disk - const char *disk_label = libGDR_GetDiscType() == Open ? "Insert Disk" : "Eject Disk"; - if (ImGui::Button(disk_label, ScaledVec2(150, 50))) - { - if (libGDR_GetDiscType() == Open) - { - gui_state = GuiState::SelectDisk; - } - else - { - DiscOpenLid(); - gui_state = GuiState::Closed; - } - } - ImGui::NextColumn(); - - // Cheats - { - DisabledScope scope(settings.network.online); - - if (ImGui::Button("Cheats", ScaledVec2(150, 50)) && !settings.network.online) - gui_state = GuiState::Cheats; - } - ImGui::Columns(1, nullptr, false); - - // Exit - if (ImGui::Button("Exit", ScaledVec2(300, 50) - + ImVec2(ImGui::GetStyle().ColumnsMinSpacing + ImGui::GetStyle().FramePadding.x * 2 - 1, 0))) - { - gui_stop_game(); - } - - ImGui::End(); -} - -inline static void header(const char *title) -{ - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)); // Left - ImGui::PushStyleVar(ImGuiStyleVar_DisabledAlpha, 1.0f); - ImGui::BeginDisabled(); - ImGui::ButtonEx(title, ImVec2(-1, 0)); - ImGui::EndDisabled(); - ImGui::PopStyleVar(); - ImGui::PopStyleVar(); -} - -const char *maple_device_types[] = -{ - "None", - "Sega Controller", - "Light Gun", - "Keyboard", - "Mouse", - "Twin Stick", - "Ascii Stick", - "Maracas Controller", - "Fishing Controller", - "Pop'n Music controller", - "Racing Controller", - "Densha de Go! Controller", -// "Dreameye", -}; - -const char *maple_expansion_device_types[] = -{ - "None", - "Sega VMU", - "Purupuru", - "Microphone" -}; - -static const char *maple_device_name(MapleDeviceType type) -{ - switch (type) - { - case MDT_SegaController: - return maple_device_types[1]; - case MDT_LightGun: - return maple_device_types[2]; - case MDT_Keyboard: - return maple_device_types[3]; - case MDT_Mouse: - return maple_device_types[4]; - case MDT_TwinStick: - return maple_device_types[5]; - case MDT_AsciiStick: - return maple_device_types[6]; - case MDT_MaracasController: - return maple_device_types[7]; - case MDT_FishingController: - return maple_device_types[8]; - case MDT_PopnMusicController: - return maple_device_types[9]; - case MDT_RacingController: - return maple_device_types[10]; - case MDT_DenshaDeGoController: - return maple_device_types[11]; - case MDT_Dreameye: -// return maple_device_types[12]; - case MDT_None: - default: - return maple_device_types[0]; - } -} - -static MapleDeviceType maple_device_type_from_index(int idx) -{ - switch (idx) - { - case 1: - return MDT_SegaController; - case 2: - return MDT_LightGun; - case 3: - return MDT_Keyboard; - case 4: - return MDT_Mouse; - case 5: - return MDT_TwinStick; - case 6: - return MDT_AsciiStick; - case 7: - return MDT_MaracasController; - case 8: - return MDT_FishingController; - case 9: - return MDT_PopnMusicController; - case 10: - return MDT_RacingController; - case 11: - return MDT_DenshaDeGoController; - case 12: - return MDT_Dreameye; - case 0: - default: - return MDT_None; - } -} - -static const char *maple_expansion_device_name(MapleDeviceType type) -{ - switch (type) - { - case MDT_SegaVMU: - return maple_expansion_device_types[1]; - case MDT_PurupuruPack: - return maple_expansion_device_types[2]; - case MDT_Microphone: - return maple_expansion_device_types[3]; - case MDT_None: - default: - return maple_expansion_device_types[0]; - } -} - -const char *maple_ports[] = { "None", "A", "B", "C", "D", "All" }; - -struct Mapping { - DreamcastKey key; - const char *name; -}; - -const Mapping dcButtons[] = { - { EMU_BTN_NONE, "Directions" }, - { DC_DPAD_UP, "Up" }, - { DC_DPAD_DOWN, "Down" }, - { DC_DPAD_LEFT, "Left" }, - { DC_DPAD_RIGHT, "Right" }, - - { DC_AXIS_UP, "Thumbstick Up" }, - { DC_AXIS_DOWN, "Thumbstick Down" }, - { DC_AXIS_LEFT, "Thumbstick Left" }, - { DC_AXIS_RIGHT, "Thumbstick Right" }, - - { DC_AXIS2_UP, "R.Thumbstick Up" }, - { DC_AXIS2_DOWN, "R.Thumbstick Down" }, - { DC_AXIS2_LEFT, "R.Thumbstick Left" }, - { DC_AXIS2_RIGHT, "R.Thumbstick Right" }, - - { DC_AXIS3_UP, "Axis 3 Up" }, - { DC_AXIS3_DOWN, "Axis 3 Down" }, - { DC_AXIS3_LEFT, "Axis 3 Left" }, - { DC_AXIS3_RIGHT, "Axis 3 Right" }, - - { DC_DPAD2_UP, "DPad2 Up" }, - { DC_DPAD2_DOWN, "DPad2 Down" }, - { DC_DPAD2_LEFT, "DPad2 Left" }, - { DC_DPAD2_RIGHT, "DPad2 Right" }, - - { EMU_BTN_NONE, "Buttons" }, - { DC_BTN_A, "A" }, - { DC_BTN_B, "B" }, - { DC_BTN_X, "X" }, - { DC_BTN_Y, "Y" }, - { DC_BTN_C, "C" }, - { DC_BTN_D, "D" }, - { DC_BTN_Z, "Z" }, - - { EMU_BTN_NONE, "Triggers" }, - { DC_AXIS_LT, "Left Trigger" }, - { DC_AXIS_RT, "Right Trigger" }, - { DC_AXIS_LT2, "Left Trigger 2" }, - { DC_AXIS_RT2, "Right Trigger 2" }, - - { EMU_BTN_NONE, "System Buttons" }, - { DC_BTN_START, "Start" }, - { DC_BTN_RELOAD, "Reload" }, - - { EMU_BTN_NONE, "Emulator" }, - { EMU_BTN_MENU, "Menu" }, - { EMU_BTN_ESCAPE, "Exit" }, - { EMU_BTN_FFORWARD, "Fast-forward" }, - { EMU_BTN_LOADSTATE, "Load State" }, - { EMU_BTN_SAVESTATE, "Save State" }, - - { EMU_BTN_NONE, nullptr } -}; - -const Mapping arcadeButtons[] = { - { EMU_BTN_NONE, "Directions" }, - { DC_DPAD_UP, "Up" }, - { DC_DPAD_DOWN, "Down" }, - { DC_DPAD_LEFT, "Left" }, - { DC_DPAD_RIGHT, "Right" }, - - { DC_AXIS_UP, "Thumbstick Up" }, - { DC_AXIS_DOWN, "Thumbstick Down" }, - { DC_AXIS_LEFT, "Thumbstick Left" }, - { DC_AXIS_RIGHT, "Thumbstick Right" }, - - { DC_AXIS2_UP, "R.Thumbstick Up" }, - { DC_AXIS2_DOWN, "R.Thumbstick Down" }, - { DC_AXIS2_LEFT, "R.Thumbstick Left" }, - { DC_AXIS2_RIGHT, "R.Thumbstick Right" }, - - { EMU_BTN_NONE, "Buttons" }, - { DC_BTN_A, "Button 1" }, - { DC_BTN_B, "Button 2" }, - { DC_BTN_C, "Button 3" }, - { DC_BTN_X, "Button 4" }, - { DC_BTN_Y, "Button 5" }, - { DC_BTN_Z, "Button 6" }, - { DC_DPAD2_LEFT, "Button 7" }, - { DC_DPAD2_RIGHT, "Button 8" }, -// { DC_DPAD2_RIGHT, "Button 9" }, // TODO - - { EMU_BTN_NONE, "Triggers" }, - { DC_AXIS_LT, "Left Trigger" }, - { DC_AXIS_RT, "Right Trigger" }, - - { EMU_BTN_NONE, "System Buttons" }, - { DC_BTN_START, "Start" }, - { DC_BTN_RELOAD, "Reload" }, - { DC_BTN_D, "Coin" }, - { DC_DPAD2_UP, "Service" }, - { DC_DPAD2_DOWN, "Test" }, - { DC_BTN_INSERT_CARD, "Insert Card" }, - - { EMU_BTN_NONE, "Emulator" }, - { EMU_BTN_MENU, "Menu" }, - { EMU_BTN_ESCAPE, "Exit" }, - { EMU_BTN_FFORWARD, "Fast-forward" }, - { EMU_BTN_LOADSTATE, "Load State" }, - { EMU_BTN_SAVESTATE, "Save State" }, - - { EMU_BTN_NONE, nullptr } -}; - -static MapleDeviceType maple_expansion_device_type_from_index(int idx) -{ - switch (idx) - { - case 1: - return MDT_SegaVMU; - case 2: - return MDT_PurupuruPack; - case 3: - return MDT_Microphone; - case 0: - default: - return MDT_None; - } -} - -static std::shared_ptr mapped_device; -static u32 mapped_code; -static bool analogAxis; -static bool positiveDirection; -static double map_start_time; -static bool arcade_button_mode; -static u32 gamepad_port; - -static void unmapControl(const std::shared_ptr& mapping, u32 gamepad_port, DreamcastKey key) -{ - mapping->clear_button(gamepad_port, key); - mapping->clear_axis(gamepad_port, key); -} - -static DreamcastKey getOppositeDirectionKey(DreamcastKey key) -{ - switch (key) - { - case DC_DPAD_UP: - return DC_DPAD_DOWN; - case DC_DPAD_DOWN: - return DC_DPAD_UP; - case DC_DPAD_LEFT: - return DC_DPAD_RIGHT; - case DC_DPAD_RIGHT: - return DC_DPAD_LEFT; - case DC_DPAD2_UP: - return DC_DPAD2_DOWN; - case DC_DPAD2_DOWN: - return DC_DPAD2_UP; - case DC_DPAD2_LEFT: - return DC_DPAD2_RIGHT; - case DC_DPAD2_RIGHT: - return DC_DPAD2_LEFT; - case DC_AXIS_UP: - return DC_AXIS_DOWN; - case DC_AXIS_DOWN: - return DC_AXIS_UP; - case DC_AXIS_LEFT: - return DC_AXIS_RIGHT; - case DC_AXIS_RIGHT: - return DC_AXIS_LEFT; - case DC_AXIS2_UP: - return DC_AXIS2_DOWN; - case DC_AXIS2_DOWN: - return DC_AXIS2_UP; - case DC_AXIS2_LEFT: - return DC_AXIS2_RIGHT; - case DC_AXIS2_RIGHT: - return DC_AXIS2_LEFT; - case DC_AXIS3_UP: - return DC_AXIS3_DOWN; - case DC_AXIS3_DOWN: - return DC_AXIS3_UP; - case DC_AXIS3_LEFT: - return DC_AXIS3_RIGHT; - case DC_AXIS3_RIGHT: - return DC_AXIS3_LEFT; - default: - return EMU_BTN_NONE; - } -} -static void detect_input_popup(const Mapping *mapping) -{ - ImVec2 padding = ScaledVec2(20, 20); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, padding); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, padding); - if (ImGui::BeginPopupModal("Map Control", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) - { - ImGui::Text("Waiting for control '%s'...", mapping->name); - double now = os_GetSeconds(); - ImGui::Text("Time out in %d s", (int)(5 - (now - map_start_time))); - if (mapped_code != (u32)-1) - { - std::shared_ptr input_mapping = mapped_device->get_input_mapping(); - if (input_mapping != NULL) - { - unmapControl(input_mapping, gamepad_port, mapping->key); - if (analogAxis) - { - input_mapping->set_axis(gamepad_port, mapping->key, mapped_code, positiveDirection); - DreamcastKey opposite = getOppositeDirectionKey(mapping->key); - // Map the axis opposite direction to the corresponding opposite dc button or axis, - // but only if the opposite direction axis isn't used and the dc button or axis isn't mapped. - if (opposite != EMU_BTN_NONE - && input_mapping->get_axis_id(gamepad_port, mapped_code, !positiveDirection) == EMU_BTN_NONE - && input_mapping->get_axis_code(gamepad_port, opposite).first == (u32)-1 - && input_mapping->get_button_code(gamepad_port, opposite) == (u32)-1) - input_mapping->set_axis(gamepad_port, opposite, mapped_code, !positiveDirection); - } - else - input_mapping->set_button(gamepad_port, mapping->key, mapped_code); - } - mapped_device = NULL; - ImGui::CloseCurrentPopup(); - } - else if (now - map_start_time >= 5) - { - mapped_device = NULL; - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - ImGui::PopStyleVar(2); -} - -static void displayLabelOrCode(const char *label, u32 code, const char *suffix = "") -{ - if (label != nullptr) - ImGui::Text("%s%s", label, suffix); - else - ImGui::Text("[%d]%s", code, suffix); -} - -static void displayMappedControl(const std::shared_ptr& gamepad, DreamcastKey key) -{ - std::shared_ptr input_mapping = gamepad->get_input_mapping(); - u32 code = input_mapping->get_button_code(gamepad_port, key); - if (code != (u32)-1) - { - displayLabelOrCode(gamepad->get_button_name(code), code); - return; - } - std::pair pair = input_mapping->get_axis_code(gamepad_port, key); - code = pair.first; - if (code != (u32)-1) - { - displayLabelOrCode(gamepad->get_axis_name(code), code, pair.second ? "+" : "-"); - return; - } -} - -static void controller_mapping_popup(const std::shared_ptr& gamepad) -{ - fullScreenWindow(true); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - if (ImGui::BeginPopupModal("Controller Mapping", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) - { - const ImGuiStyle& style = ImGui::GetStyle(); - const float winWidth = ImGui::GetIO().DisplaySize.x - insetLeft - insetRight - (style.WindowBorderSize + style.WindowPadding.x) * 2; - const float col_width = (winWidth - style.GrabMinSize - style.ItemSpacing.x - - (ImGui::CalcTextSize("Map").x + style.FramePadding.x * 2.0f + style.ItemSpacing.x) - - (ImGui::CalcTextSize("Unmap").x + style.FramePadding.x * 2.0f + style.ItemSpacing.x)) / 2; - const float scaling = settings.display.uiScale; - - static int item_current_map_idx = 0; - static int last_item_current_map_idx = 2; - - std::shared_ptr input_mapping = gamepad->get_input_mapping(); - if (input_mapping == NULL || ImGui::Button("Done", ScaledVec2(100, 30))) - { - ImGui::CloseCurrentPopup(); - gamepad->save_mapping(map_system); - last_item_current_map_idx = 2; - ImGui::EndPopup(); - ImGui::PopStyleVar(); - return; - } - ImGui::SetItemDefaultFocus(); - - float portWidth = 0; - if (gamepad->maple_port() == MAPLE_PORTS) - { - ImGui::SameLine(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, (30 * scaling - ImGui::GetFontSize()) / 2)); - portWidth = ImGui::CalcTextSize("AA").x + ImGui::GetStyle().ItemSpacing.x * 2.0f + ImGui::GetFontSize(); - ImGui::SetNextItemWidth(portWidth); - if (ImGui::BeginCombo("Port", maple_ports[gamepad_port + 1])) - { - for (u32 j = 0; j < MAPLE_PORTS; j++) - { - bool is_selected = gamepad_port == j; - if (ImGui::Selectable(maple_ports[j + 1], &is_selected)) - gamepad_port = j; - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - portWidth += ImGui::CalcTextSize("Port").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetStyle().FramePadding.x; - ImGui::PopStyleVar(); - } - float comboWidth = ImGui::CalcTextSize("Dreamcast Controls").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.x * 4; - float gameConfigWidth = 0; - if (!settings.content.gameId.empty()) - gameConfigWidth = ImGui::CalcTextSize(gamepad->isPerGameMapping() ? "Delete Game Config" : "Make Game Config").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetStyle().FramePadding.x * 2; - ImGui::SameLine(0, ImGui::GetContentRegionAvail().x - comboWidth - gameConfigWidth - ImGui::GetStyle().ItemSpacing.x - 100 * scaling * 2 - portWidth); - - ImGui::AlignTextToFramePadding(); - - if (!settings.content.gameId.empty()) - { - if (gamepad->isPerGameMapping()) - { - if (ImGui::Button("Delete Game Config", ScaledVec2(0, 30))) - { - gamepad->setPerGameMapping(false); - if (!gamepad->find_mapping(map_system)) - gamepad->resetMappingToDefault(arcade_button_mode, true); - } - } - else - { - if (ImGui::Button("Make Game Config", ScaledVec2(0, 30))) - gamepad->setPerGameMapping(true); - } - ImGui::SameLine(); - } - if (ImGui::Button("Reset...", ScaledVec2(100, 30))) - ImGui::OpenPopup("Confirm Reset"); - - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20)); - if (ImGui::BeginPopupModal("Confirm Reset", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) - { - ImGui::Text("Are you sure you want to reset the mappings to default?"); - static bool hitbox; - if (arcade_button_mode) - { - ImGui::Text("Controller Type:"); - if (ImGui::RadioButton("Gamepad", !hitbox)) - hitbox = false; - ImGui::SameLine(); - if (ImGui::RadioButton("Arcade / Hit Box", hitbox)) - hitbox = true; - } - ImGui::NewLine(); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(20 * scaling, ImGui::GetStyle().ItemSpacing.y)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(10, 10)); - if (ImGui::Button("Yes")) - { - gamepad->resetMappingToDefault(arcade_button_mode, !hitbox); - gamepad->save_mapping(map_system); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("No")) - ImGui::CloseCurrentPopup(); - ImGui::PopStyleVar(2);; - - ImGui::EndPopup(); - } - ImGui::PopStyleVar(1);; - - ImGui::SameLine(); - - const char* items[] = { "Dreamcast Controls", "Arcade Controls" }; - - if (last_item_current_map_idx == 2 && game_started) - // Select the right mappings for the current game - item_current_map_idx = settings.platform.isArcade() ? 1 : 0; - - // Here our selection data is an index. - - ImGui::SetNextItemWidth(comboWidth); - // Make the combo height the same as the Done and Reset buttons - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, (30 * scaling - ImGui::GetFontSize()) / 2)); - ImGui::Combo("##arcadeMode", &item_current_map_idx, items, IM_ARRAYSIZE(items)); - ImGui::PopStyleVar(); - if (last_item_current_map_idx != 2 && item_current_map_idx != last_item_current_map_idx) - { - gamepad->save_mapping(map_system); - } - const Mapping *systemMapping = dcButtons; - if (item_current_map_idx == 0) - { - arcade_button_mode = false; - map_system = DC_PLATFORM_DREAMCAST; - systemMapping = dcButtons; - } - else if (item_current_map_idx == 1) - { - arcade_button_mode = true; - map_system = DC_PLATFORM_NAOMI; - systemMapping = arcadeButtons; - } - - if (item_current_map_idx != last_item_current_map_idx) - { - if (!gamepad->find_mapping(map_system)) - if (map_system == DC_PLATFORM_DREAMCAST || !gamepad->find_mapping(DC_PLATFORM_DREAMCAST)) - gamepad->resetMappingToDefault(arcade_button_mode, true); - input_mapping = gamepad->get_input_mapping(); - - last_item_current_map_idx = item_current_map_idx; - } - - char key_id[32]; - - ImGui::BeginChildFrame(ImGui::GetID("buttons"), ImVec2(0, 0), ImGuiWindowFlags_DragScrolling); - - for (; systemMapping->name != nullptr; systemMapping++) - { - if (systemMapping->key == EMU_BTN_NONE) - { - ImGui::Columns(1, nullptr, false); - header(systemMapping->name); - ImGui::Columns(3, "bindings", false); - ImGui::SetColumnWidth(0, col_width); - ImGui::SetColumnWidth(1, col_width); - continue; - } - sprintf(key_id, "key_id%d", systemMapping->key); - ImGui::PushID(key_id); - - const char *game_btn_name = nullptr; - if (arcade_button_mode) - { - game_btn_name = GetCurrentGameButtonName(systemMapping->key); - if (game_btn_name == nullptr) - game_btn_name = GetCurrentGameAxisName(systemMapping->key); - } - if (game_btn_name != nullptr && game_btn_name[0] != '\0') - ImGui::Text("%s - %s", systemMapping->name, game_btn_name); - else - ImGui::Text("%s", systemMapping->name); - - ImGui::NextColumn(); - displayMappedControl(gamepad, systemMapping->key); - - ImGui::NextColumn(); - if (ImGui::Button("Map")) - { - map_start_time = os_GetSeconds(); - ImGui::OpenPopup("Map Control"); - mapped_device = gamepad; - mapped_code = -1; - gamepad->detectButtonOrAxisInput([](u32 code, bool analog, bool positive) - { - mapped_code = code; - analogAxis = analog; - positiveDirection = positive; - }); - } - detect_input_popup(systemMapping); - ImGui::SameLine(); - if (ImGui::Button("Unmap")) - { - input_mapping = gamepad->get_input_mapping(); - unmapControl(input_mapping, gamepad_port, systemMapping->key); - } - ImGui::NextColumn(); - ImGui::PopID(); - } - ImGui::Columns(1, nullptr, false); - scrollWhenDraggingOnVoid(); - windowDragScroll(); - - ImGui::EndChildFrame(); - error_popup(); - ImGui::EndPopup(); - } - ImGui::PopStyleVar(); -} - -void error_popup() -{ - if (!error_msg_shown && !error_msg.empty()) - { - ImVec2 padding = ScaledVec2(20, 20); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, padding); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, padding); - ImGui::OpenPopup("Error"); - if (ImGui::BeginPopupModal("Error", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar)) - { - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 400.f * settings.display.uiScale); - ImGui::TextWrapped("%s", error_msg.c_str()); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(16, 3)); - float currentwidth = ImGui::GetContentRegionAvail().x; - ImGui::SetCursorPosX((currentwidth - 80.f * settings.display.uiScale) / 2.f + ImGui::GetStyle().WindowPadding.x); - if (ImGui::Button("OK", ScaledVec2(80.f, 0))) - { - error_msg.clear(); - ImGui::CloseCurrentPopup(); - } - ImGui::SetItemDefaultFocus(); - ImGui::PopStyleVar(); - ImGui::PopTextWrapPos(); - ImGui::EndPopup(); - } - ImGui::PopStyleVar(); - ImGui::PopStyleVar(); - error_msg_shown = true; - } -} - -static void contentpath_warning_popup() -{ - static bool show_contentpath_selection; - - if (scanner.content_path_looks_incorrect) - { - ImGui::OpenPopup("Incorrect Content Location?"); - if (ImGui::BeginPopupModal("Incorrect Content Location?", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) - { - ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 400.f * settings.display.uiScale); - ImGui::TextWrapped(" Scanned %d folders but no game can be found! ", scanner.empty_folders_scanned); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(16, 3)); - float currentwidth = ImGui::GetContentRegionAvail().x; - ImGui::SetCursorPosX((currentwidth - 100.f * settings.display.uiScale) / 2.f + ImGui::GetStyle().WindowPadding.x - 55.f * settings.display.uiScale); - if (ImGui::Button("Reselect", ScaledVec2(100.f, 0))) - { - scanner.content_path_looks_incorrect = false; - ImGui::CloseCurrentPopup(); - show_contentpath_selection = true; - } - - ImGui::SameLine(); - ImGui::SetCursorPosX((currentwidth - 100.f * settings.display.uiScale) / 2.f + ImGui::GetStyle().WindowPadding.x + 55.f * settings.display.uiScale); - if (ImGui::Button("Cancel", ScaledVec2(100.f, 0))) - { - scanner.content_path_looks_incorrect = false; - ImGui::CloseCurrentPopup(); - scanner.stop(); - config::ContentPath.get().clear(); - } - ImGui::SetItemDefaultFocus(); - ImGui::PopStyleVar(); - ImGui::EndPopup(); - } - } - if (show_contentpath_selection) - { - scanner.stop(); - ImGui::OpenPopup("Select Directory"); - select_file_popup("Select Directory", [](bool cancelled, std::string selection) - { - show_contentpath_selection = false; - if (!cancelled) - { - config::ContentPath.get().clear(); - config::ContentPath.get().push_back(selection); - } - scanner.refresh(); - return true; - }); - } -} - -static inline void gui_debug_tab() -{ - if (ImGui::BeginTabItem("Debug")) - { - ImVec2 normal_padding = ImGui::GetStyle().FramePadding; - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - header("Logging"); - { - LogManager *logManager = LogManager::GetInstance(); - for (LogTypes::LOG_TYPE type = LogTypes::AICA; type < LogTypes::NUMBER_OF_LOGS; type = (LogTypes::LOG_TYPE)(type + 1)) - { - bool enabled = logManager->IsEnabled(type, logManager->GetLogLevel()); - std::string name = std::string(logManager->GetShortName(type)) + " - " + logManager->GetFullName(type); - if (ImGui::Checkbox(name.c_str(), &enabled) && logManager->GetLogLevel() > LogTypes::LWARNING) { - logManager->SetEnable(type, enabled); - cfgSaveBool("log", logManager->GetShortName(type), enabled); - } - } - ImGui::Spacing(); - - static const char *levels[] = { "Notice", "Error", "Warning", "Info", "Debug" }; - if (ImGui::BeginCombo("Log Verbosity", levels[logManager->GetLogLevel() - 1], ImGuiComboFlags_None)) - { - for (std::size_t i = 0; i < std::size(levels); i++) - { - bool is_selected = logManager->GetLogLevel() - 1 == (int)i; - if (ImGui::Selectable(levels[i], &is_selected)) { - logManager->SetLogLevel((LogTypes::LOG_LEVELS)(i + 1)); - cfgSaveInt("log", "Verbosity", i + 1); - } - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - } -#if FC_PROFILER - ImGui::Spacing(); - header("Profiling"); - { - - OptionCheckbox("Enable", config::ProfilerEnabled, "Enable the profiler."); - if (!config::ProfilerEnabled) - { - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); - } - OptionCheckbox("Display", config::ProfilerDrawToGUI, "Draw the profiler output in an overlay."); - OptionCheckbox("Output to terminal", config::ProfilerOutputTTY, "Write the profiler output to the terminal"); - // TODO frame warning time - if (!config::ProfilerEnabled) - { - ImGui::PopItemFlag(); - ImGui::PopStyleVar(); - } - } -#endif - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - } -} - -static void addContentPath(const std::string& path) -{ - auto& contentPath = config::ContentPath.get(); - if (std::count(contentPath.begin(), contentPath.end(), path) == 0) - { - scanner.stop(); - contentPath.push_back(path); - scanner.refresh(); - } -} - -static void gui_display_settings() -{ - static bool maple_devices_changed; - - fullScreenWindow(false); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - - ImGui::Begin("Settings", NULL, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NoResize - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse); - ImVec2 normal_padding = ImGui::GetStyle().FramePadding; - - if (ImGui::Button("Done", ScaledVec2(100, 30))) - { - if (game_started) - gui_state = GuiState::Commands; - else - gui_state = GuiState::Main; - if (maple_devices_changed) - { - maple_devices_changed = false; - if (game_started && settings.platform.isConsole()) - { - maple_ReconnectDevices(); - reset_vmus(); - } - } - SaveSettings(); - } - if (game_started) - { - ImGui::SameLine(); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(16 * settings.display.uiScale, normal_padding.y)); - if (config::Settings::instance().hasPerGameConfig()) - { - if (ImGui::Button("Delete Game Config", ScaledVec2(0, 30))) - { - config::Settings::instance().setPerGameConfig(false); - config::Settings::instance().load(false); - loadGameSpecificSettings(); - } - } - else - { - if (ImGui::Button("Make Game Config", ScaledVec2(0, 30))) - config::Settings::instance().setPerGameConfig(true); - } - ImGui::PopStyleVar(); - } - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(16, 6)); - - if (ImGui::BeginTabBar("settings", ImGuiTabBarFlags_NoTooltip)) - { - if (ImGui::BeginTabItem("General")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - { - DisabledScope scope(settings.platform.isArcade()); - - const char *languages[] = { "Japanese", "English", "German", "French", "Spanish", "Italian", "Default" }; - OptionComboBox("Language", config::Language, languages, std::size(languages), - "The language as configured in the Dreamcast BIOS"); - - const char *broadcast[] = { "NTSC", "PAL", "PAL/M", "PAL/N", "Default" }; - OptionComboBox("Broadcast", config::Broadcast, broadcast, std::size(broadcast), - "TV broadcasting standard for non-VGA modes"); - } - - const char *consoleRegion[] = { "Japan", "USA", "Europe", "Default" }; - const char *arcadeRegion[] = { "Japan", "USA", "Export", "Korea" }; - const char **region = settings.platform.isArcade() ? arcadeRegion : consoleRegion; - OptionComboBox("Region", config::Region, region, std::size(consoleRegion), - "BIOS region"); - - const char *cable[] = { "VGA", "RGB Component", "TV Composite" }; - { - DisabledScope scope(config::Cable.isReadOnly() || settings.platform.isArcade()); - - const char *value = config::Cable == 0 ? cable[0] - : config::Cable > 0 && config::Cable <= (int)std::size(cable) ? cable[config::Cable - 1] - : "?"; - if (ImGui::BeginCombo("Cable", value, ImGuiComboFlags_None)) - { - for (int i = 0; i < IM_ARRAYSIZE(cable); i++) - { - bool is_selected = i == 0 ? config::Cable <= 1 : config::Cable - 1 == i; - if (ImGui::Selectable(cable[i], &is_selected)) - config::Cable = i == 0 ? 0 : i + 1; - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::SameLine(); - ShowHelpMarker("Video connection type"); - } - -#if !defined(TARGET_IPHONE) - ImVec2 size; - size.x = 0.0f; - size.y = (ImGui::GetTextLineHeightWithSpacing() + ImGui::GetStyle().FramePadding.y * 2.f) - * (config::ContentPath.get().size() + 1) ;//+ ImGui::GetStyle().FramePadding.y * 2.f; - - if (ImGui::BeginListBox("Content Location", size)) - { - int to_delete = -1; - for (u32 i = 0; i < config::ContentPath.get().size(); i++) - { - ImGui::PushID(config::ContentPath.get()[i].c_str()); - ImGui::AlignTextToFramePadding(); - ImGui::Text("%s", config::ContentPath.get()[i].c_str()); - ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize("X").x - ImGui::GetStyle().FramePadding.x); - if (ImGui::Button("X")) - to_delete = i; - ImGui::PopID(); - } - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(24, 3)); -#ifdef __ANDROID__ - if (ImGui::Button("Add")) - { - hostfs::addStorage(true, false, [](bool cancelled, std::string selection) { - if (!cancelled) - addContentPath(selection); - }); - } -#else - if (ImGui::Button("Add")) - ImGui::OpenPopup("Select Directory"); - select_file_popup("Select Directory", [](bool cancelled, std::string selection) { - if (!cancelled) - addContentPath(selection); - return true; - }); -#endif - ImGui::PopStyleVar(); - scrollWhenDraggingOnVoid(); - - ImGui::EndListBox(); - if (to_delete >= 0) - { - scanner.stop(); - config::ContentPath.get().erase(config::ContentPath.get().begin() + to_delete); - scanner.refresh(); - } - } - ImGui::SameLine(); - ShowHelpMarker("The directories where your games are stored"); - - size.y = ImGui::GetTextLineHeightWithSpacing() * 1.25f + ImGui::GetStyle().FramePadding.y * 2.0f; - -#if defined(__linux__) && !defined(__ANDROID__) - if (ImGui::BeginListBox("Data Directory", size)) - { - ImGui::AlignTextToFramePadding(); - ImGui::Text("%s", get_writable_data_path("").c_str()); - ImGui::EndListBox(); - } - ImGui::SameLine(); - ShowHelpMarker("The directory containing BIOS files, as well as saved VMUs and states"); -#else - if (ImGui::BeginListBox("Home Directory", size)) - { - ImGui::AlignTextToFramePadding(); - ImGui::Text("%s", get_writable_config_path("").c_str()); -#ifdef __ANDROID__ - ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize("Change").x - ImGui::GetStyle().FramePadding.x); - if (ImGui::Button("Change")) - gui_state = GuiState::Onboarding; -#endif -#if defined(__APPLE__) && TARGET_OS_OSX - ImGui::SameLine(ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize("Reveal in Finder").x - ImGui::GetStyle().FramePadding.x); - if (ImGui::Button("Reveal in Finder")) - { - char temp[512]; - sprintf(temp, "open \"%s\"", get_writable_config_path("").c_str()); - system(temp); - } -#endif - ImGui::EndListBox(); - } - ImGui::SameLine(); - ShowHelpMarker("The directory where Flycast saves configuration files and VMUs. BIOS files should be in a subfolder named \"data\""); -#endif // !linux -#endif // !TARGET_IPHONE - - OptionCheckbox("Box Art Game List", config::BoxartDisplayMode, - "Display game cover art in the game list."); - OptionCheckbox("Fetch Box Art", config::FetchBoxart, - "Fetch cover images from TheGamesDB.net."); - if (OptionCheckbox("Hide Legacy Naomi Roms", config::HideLegacyNaomiRoms, - "Hide .bin, .dat and .lst files from the content browser")) - scanner.refresh(); - ImGui::Text("Automatic State:"); - OptionCheckbox("Load", config::AutoLoadState, - "Load the last saved state of the game when starting"); - ImGui::SameLine(); - OptionCheckbox("Save", config::AutoSaveState, - "Save the state of the game when stopping"); - OptionCheckbox("Naomi Free Play", config::ForceFreePlay, "Configure Naomi games in Free Play mode."); - - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Controls")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - header("Physical Devices"); - { - ImGui::Columns(4, "physicalDevices", false); - ImVec4 gray{ 0.5f, 0.5f, 0.5f, 1.f }; - ImGui::TextColored(gray, "System"); - ImGui::SetColumnWidth(-1, ImGui::CalcTextSize("System").x + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetStyle().ItemSpacing.x); - ImGui::NextColumn(); - ImGui::TextColored(gray, "Name"); - ImGui::NextColumn(); - ImGui::TextColored(gray, "Port"); - ImGui::SetColumnWidth(-1, ImGui::CalcTextSize("None").x * 1.6f + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetFrameHeight() - + ImGui::GetStyle().ItemInnerSpacing.x + ImGui::GetStyle().ItemSpacing.x); - ImGui::NextColumn(); - ImGui::NextColumn(); - for (int i = 0; i < GamepadDevice::GetGamepadCount(); i++) - { - std::shared_ptr gamepad = GamepadDevice::GetGamepad(i); - if (!gamepad) - continue; - ImGui::Text("%s", gamepad->api_name().c_str()); - ImGui::NextColumn(); - ImGui::Text("%s", gamepad->name().c_str()); - ImGui::NextColumn(); - char port_name[32]; - sprintf(port_name, "##mapleport%d", i); - ImGui::PushID(port_name); - if (ImGui::BeginCombo(port_name, maple_ports[gamepad->maple_port() + 1])) - { - for (int j = -1; j < (int)std::size(maple_ports) - 1; j++) - { - bool is_selected = gamepad->maple_port() == j; - if (ImGui::Selectable(maple_ports[j + 1], &is_selected)) - gamepad->set_maple_port(j); - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - - ImGui::EndCombo(); - } - ImGui::NextColumn(); - if (gamepad->remappable() && ImGui::Button("Map")) - { - gamepad_port = 0; - ImGui::OpenPopup("Controller Mapping"); - } - - controller_mapping_popup(gamepad); - -#ifdef __ANDROID__ - if (gamepad->is_virtual_gamepad()) - { - if (ImGui::Button("Edit")) - { - vjoy_start_editing(); - gui_state = GuiState::VJoyEdit; - } - ImGui::SameLine(); - OptionSlider("Haptic", config::VirtualGamepadVibration, 0, 60); - } - else -#endif - if (gamepad->is_rumble_enabled()) - { - ImGui::SameLine(0, 16 * settings.display.uiScale); - int power = gamepad->get_rumble_power(); - ImGui::SetNextItemWidth(150 * settings.display.uiScale); - if (ImGui::SliderInt("Rumble", &power, 0, 100)) - gamepad->set_rumble_power(power); - } - ImGui::NextColumn(); - ImGui::PopID(); - } - } - ImGui::Columns(1, NULL, false); - - ImGui::Spacing(); - OptionSlider("Mouse sensitivity", config::MouseSensitivity, 1, 500); -#if defined(_WIN32) && !defined(TARGET_UWP) - OptionCheckbox("Use Raw Input", config::UseRawInput, "Supports multiple pointing devices (mice, light guns) and keyboards"); -#endif - - ImGui::Spacing(); - header("Dreamcast Devices"); - { - for (int bus = 0; bus < MAPLE_PORTS; bus++) - { - ImGui::Text("Device %c", bus + 'A'); - ImGui::SameLine(); - char device_name[32]; - sprintf(device_name, "##device%d", bus); - float w = ImGui::CalcItemWidth() / 3; - ImGui::PushItemWidth(w); - if (ImGui::BeginCombo(device_name, maple_device_name(config::MapleMainDevices[bus]), ImGuiComboFlags_None)) - { - for (int i = 0; i < IM_ARRAYSIZE(maple_device_types); i++) - { - bool is_selected = config::MapleMainDevices[bus] == maple_device_type_from_index(i); - if (ImGui::Selectable(maple_device_types[i], &is_selected)) - { - config::MapleMainDevices[bus] = maple_device_type_from_index(i); - maple_devices_changed = true; - } - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - int port_count = 0; - switch (config::MapleMainDevices[bus]) { - case MDT_SegaController: - port_count = 2; - break; - case MDT_LightGun: - case MDT_TwinStick: - case MDT_AsciiStick: - case MDT_RacingController: - port_count = 1; - break; - default: break; - } - for (int port = 0; port < port_count; port++) - { - ImGui::SameLine(); - sprintf(device_name, "##device%d.%d", bus, port + 1); - ImGui::PushID(device_name); - if (ImGui::BeginCombo(device_name, maple_expansion_device_name(config::MapleExpansionDevices[bus][port]), ImGuiComboFlags_None)) - { - for (int i = 0; i < IM_ARRAYSIZE(maple_expansion_device_types); i++) - { - bool is_selected = config::MapleExpansionDevices[bus][port] == maple_expansion_device_type_from_index(i); - if (ImGui::Selectable(maple_expansion_device_types[i], &is_selected)) - { - config::MapleExpansionDevices[bus][port] = maple_expansion_device_type_from_index(i); - maple_devices_changed = true; - } - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::PopID(); - } - if (config::MapleMainDevices[bus] == MDT_LightGun) - { - ImGui::SameLine(); - sprintf(device_name, "##device%d.xhair", bus); - ImGui::PushID(device_name); - u32 color = config::CrosshairColor[bus]; - float xhairColor[4] { - (color & 0xff) / 255.f, - ((color >> 8) & 0xff) / 255.f, - ((color >> 16) & 0xff) / 255.f, - ((color >> 24) & 0xff) / 255.f - }; - ImGui::ColorEdit4("Crosshair color", xhairColor, ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_AlphaPreviewHalf - | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoLabel); - ImGui::SameLine(); - bool enabled = color != 0; - ImGui::Checkbox("Crosshair", &enabled); - if (enabled) - { - config::CrosshairColor[bus] = (u8)(xhairColor[0] * 255.f) - | ((u8)(xhairColor[1] * 255.f) << 8) - | ((u8)(xhairColor[2] * 255.f) << 16) - | ((u8)(xhairColor[3] * 255.f) << 24); - if (config::CrosshairColor[bus] == 0) - config::CrosshairColor[bus] = 0xC0FFFFFF; - } - else - { - config::CrosshairColor[bus] = 0; - } - ImGui::PopID(); - } - ImGui::PopItemWidth(); - } - OptionCheckbox("Per Game VMU A1", config::PerGameVmu, "When enabled, each game has its own VMU on port 1 of controller A."); - } - - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Video")) - { - int renderApi; - bool perPixel; - switch (config::RendererType) - { - default: - case RenderType::OpenGL: - renderApi = 0; - perPixel = false; - break; - case RenderType::OpenGL_OIT: - renderApi = 0; - perPixel = true; - break; - case RenderType::Vulkan: - renderApi = 1; - perPixel = false; - break; - case RenderType::Vulkan_OIT: - renderApi = 1; - perPixel = true; - break; - case RenderType::DirectX9: - renderApi = 2; - perPixel = false; - break; - case RenderType::DirectX11: - renderApi = 3; - perPixel = false; - break; - case RenderType::DirectX11_OIT: - renderApi = 3; - perPixel = true; - break; - } - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - const bool has_per_pixel = GraphicsContext::Instance()->hasPerPixel(); - header("Transparent Sorting"); - { - int renderer = perPixel ? 2 : config::PerStripSorting ? 1 : 0; - ImGui::Columns(has_per_pixel ? 3 : 2, "renderers", false); - ImGui::RadioButton("Per Triangle", &renderer, 0); - ImGui::SameLine(); - ShowHelpMarker("Sort transparent polygons per triangle. Fast but may produce graphical glitches"); - ImGui::NextColumn(); - ImGui::RadioButton("Per Strip", &renderer, 1); - ImGui::SameLine(); - ShowHelpMarker("Sort transparent polygons per strip. Faster but may produce graphical glitches"); - if (has_per_pixel) - { - ImGui::NextColumn(); - ImGui::RadioButton("Per Pixel", &renderer, 2); - ImGui::SameLine(); - ShowHelpMarker("Sort transparent polygons per pixel. Slower but accurate"); - } - ImGui::Columns(1, NULL, false); - switch (renderer) - { - case 0: - perPixel = false; - config::PerStripSorting.set(false); - break; - case 1: - perPixel = false; - config::PerStripSorting.set(true); - break; - case 2: - perPixel = true; - break; - } - } - ImGui::Spacing(); - ImGuiStyle& style = ImGui::GetStyle(); - float innerSpacing = style.ItemInnerSpacing.x; - - header("Rendering Options"); - { - ImGui::Text("Automatic Frame Skipping:"); - ImGui::Columns(3, "autoskip", false); - OptionRadioButton("Disabled", config::AutoSkipFrame, 0, "No frame skipping"); - ImGui::NextColumn(); - OptionRadioButton("Normal", config::AutoSkipFrame, 1, "Skip a frame when the GPU and CPU are both running slow"); - ImGui::NextColumn(); - OptionRadioButton("Maximum", config::AutoSkipFrame, 2, "Skip a frame when the GPU is running slow"); - ImGui::Columns(1, nullptr, false); - - OptionCheckbox("Shadows", config::ModifierVolumes, - "Enable modifier volumes, usually used for shadows"); - OptionCheckbox("Fog", config::Fog, "Enable fog effects"); - OptionCheckbox("Widescreen", config::Widescreen, - "Draw geometry outside of the normal 4:3 aspect ratio. May produce graphical glitches in the revealed areas.\nAspect Fit and shows the full 16:9 content."); - { - DisabledScope scope(!config::Widescreen); - - ImGui::Indent(); - OptionCheckbox("Super Widescreen", config::SuperWidescreen, - "Use the full width of the screen or window when its aspect ratio is greater than 16:9.\nAspect Fill and remove black bars."); - ImGui::Unindent(); - } - OptionCheckbox("Widescreen Game Cheats", config::WidescreenGameHacks, - "Modify the game so that it displays in 16:9 anamorphic format and use horizontal screen stretching. Only some games are supported."); - - const std::array aniso{ 1, 2, 4, 8, 16 }; - const std::array anisoText{ "Disabled", "2x", "4x", "8x", "16x" }; - u32 afSelected = 0; - for (u32 i = 0; i < aniso.size(); i++) - { - if (aniso[i] == config::AnisotropicFiltering) - afSelected = i; - } - - ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); - if (ImGui::BeginCombo("##Anisotropic Filtering", anisoText[afSelected].c_str(), ImGuiComboFlags_NoArrowButton)) - { - for (u32 i = 0; i < aniso.size(); i++) - { - bool is_selected = aniso[i] == config::AnisotropicFiltering; - if (ImGui::Selectable(anisoText[i].c_str(), is_selected)) - config::AnisotropicFiltering = aniso[i]; - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - ImGui::SameLine(0, innerSpacing); - - if (ImGui::ArrowButton("##Decrease Anisotropic Filtering", ImGuiDir_Left)) - { - if (afSelected > 0) - config::AnisotropicFiltering = aniso[afSelected - 1]; - } - ImGui::SameLine(0, innerSpacing); - if (ImGui::ArrowButton("##Increase Anisotropic Filtering", ImGuiDir_Right)) - { - if (afSelected < aniso.size() - 1) - config::AnisotropicFiltering = aniso[afSelected + 1]; - } - ImGui::SameLine(0, style.ItemInnerSpacing.x); - - ImGui::Text("Anisotropic Filtering"); - ImGui::SameLine(); - ShowHelpMarker("Higher values make textures viewed at oblique angles look sharper, but are more demanding on the GPU. This option only has a visible impact on mipmapped textures."); - - ImGui::Text("Texture Filtering:"); - ImGui::Columns(3, "textureFiltering", false); - OptionRadioButton("Default", config::TextureFiltering, 0, "Use the game's default texture filtering"); - ImGui::NextColumn(); - OptionRadioButton("Force Nearest-Neighbor", config::TextureFiltering, 1, "Force nearest-neighbor filtering for all textures. Crisper appearance, but may cause various rendering issues. This option usually does not affect performance."); - ImGui::NextColumn(); - OptionRadioButton("Force Linear", config::TextureFiltering, 2, "Force linear filtering for all textures. Smoother appearance, but may cause various rendering issues. This option usually does not affect performance."); - ImGui::Columns(1, nullptr, false); - -#ifndef TARGET_IPHONE - OptionCheckbox("VSync", config::VSync, "Synchronizes the frame rate with the screen refresh rate. Recommended"); - if (isVulkan(config::RendererType)) - { - ImGui::Indent(); - { - DisabledScope scope(!config::VSync); - - OptionCheckbox("Duplicate frames", config::DupeFrames, "Duplicate frames on high refresh rate monitors (120 Hz and higher)"); - } - ImGui::Unindent(); - } -#endif - OptionCheckbox("Show FPS Counter", config::ShowFPS, "Show on-screen frame/sec counter"); - OptionCheckbox("Show VMU In-game", config::FloatVMUs, "Show the VMU LCD screens while in-game"); - OptionCheckbox("Rotate Screen 90°", config::Rotate90, "Rotate the screen 90° counterclockwise"); - OptionCheckbox("Delay Frame Swapping", config::DelayFrameSwapping, - "Useful to avoid flashing screen or glitchy videos. Not recommended on slow platforms"); - OptionCheckbox("Native Depth Interpolation", config::NativeDepthInterpolation, - "Helps with texture corruption and depth issues on AMD GPUs. Can also help Intel GPUs in some cases."); - OptionCheckbox("Full Framebuffer Emulation", config::EmulateFramebuffer, - "Fully accurate VRAM framebuffer emulation. Helps games that directly access the framebuffer for special effects. " - "Very slow and incompatible with upscaling and wide screen."); - constexpr int apiCount = 0 - #ifdef USE_VULKAN - + 1 - #endif - #ifdef USE_DX9 - + 1 - #endif - #ifdef USE_OPENGL - + 1 - #endif - #ifdef USE_DX11 - + 1 - #endif - ; - - if (apiCount > 1) - { - ImGui::Text("Graphics API:"); - ImGui::Columns(apiCount, "renderApi", false); -#ifdef USE_OPENGL - ImGui::RadioButton("OpenGL", &renderApi, 0); - ImGui::NextColumn(); -#endif -#ifdef USE_VULKAN -#ifdef __APPLE__ - ImGui::RadioButton("Vulkan (Metal)", &renderApi, 1); - ImGui::SameLine(0, style.ItemInnerSpacing.x); - ShowHelpMarker("MoltenVK: An implementation of Vulkan that runs on Apple's Metal graphics framework"); -#else - ImGui::RadioButton("Vulkan", &renderApi, 1); -#endif // __APPLE__ - ImGui::NextColumn(); -#endif -#ifdef USE_DX9 - ImGui::RadioButton("DirectX 9", &renderApi, 2); - ImGui::NextColumn(); -#endif -#ifdef USE_DX11 - ImGui::RadioButton("DirectX 11", &renderApi, 3); - ImGui::NextColumn(); -#endif - ImGui::Columns(1, nullptr, false); - } - - const std::array scalings{ 0.5f, 1.f, 1.5f, 2.f, 2.5f, 3.f, 4.f, 4.5f, 5.f, 6.f, 7.f, 8.f, 9.f }; - const std::array scalingsText{ "Half", "Native", "x1.5", "x2", "x2.5", "x3", "x4", "x4.5", "x5", "x6", "x7", "x8", "x9" }; - std::array vres; - std::array resLabels; - u32 selected = 0; - for (u32 i = 0; i < scalings.size(); i++) - { - vres[i] = scalings[i] * 480; - if (vres[i] == config::RenderResolution) - selected = i; - if (!config::Widescreen) - resLabels[i] = std::to_string((int)(scalings[i] * 640)) + "x" + std::to_string((int)(scalings[i] * 480)); - else - resLabels[i] = std::to_string((int)(scalings[i] * 480 * 16 / 9)) + "x" + std::to_string((int)(scalings[i] * 480)); - resLabels[i] += " (" + scalingsText[i] + ")"; - } - - ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); - if (ImGui::BeginCombo("##Resolution", resLabels[selected].c_str(), ImGuiComboFlags_NoArrowButton)) - { - for (u32 i = 0; i < scalings.size(); i++) - { - bool is_selected = vres[i] == config::RenderResolution; - if (ImGui::Selectable(resLabels[i].c_str(), is_selected)) - config::RenderResolution = vres[i]; - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - ImGui::SameLine(0, innerSpacing); - - if (ImGui::ArrowButton("##Decrease Res", ImGuiDir_Left)) - { - if (selected > 0) - config::RenderResolution = vres[selected - 1]; - } - ImGui::SameLine(0, innerSpacing); - if (ImGui::ArrowButton("##Increase Res", ImGuiDir_Right)) - { - if (selected < vres.size() - 1) - config::RenderResolution = vres[selected + 1]; - } - ImGui::SameLine(0, style.ItemInnerSpacing.x); - - ImGui::Text("Internal Resolution"); - ImGui::SameLine(); - ShowHelpMarker("Internal render resolution. Higher is better, but more demanding on the GPU. Values higher than your display resolution (but no more than double your display resolution) can be used for supersampling, which provides high-quality antialiasing without reducing sharpness."); - - OptionSlider("Horizontal Stretching", config::ScreenStretching, 100, 250, - "Stretch the screen horizontally"); - OptionArrowButtons("Frame Skipping", config::SkipFrame, 0, 6, - "Number of frames to skip between two actually rendered frames"); - } - if (perPixel) - { - ImGui::Spacing(); - header("Per Pixel Settings"); - - const std::array bufSizes{ (u64)512 * 1024 * 1024, (u64)1024 * 1024 * 1024, (u64)2 * 1024 * 1024 * 1024, (u64)4 * 1024 * 1024 * 1024 }; - const std::array bufSizesText{ "512 MB", "1 GB", "2 GB", "4 GB" }; - ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); - u32 selected = 0; - for (; selected < bufSizes.size(); selected++) - if (bufSizes[selected] == config::PixelBufferSize) - break; - if (selected == bufSizes.size()) - selected = 0; - if (ImGui::BeginCombo("##PixelBuffer", bufSizesText[selected].c_str(), ImGuiComboFlags_NoArrowButton)) - { - for (u32 i = 0; i < bufSizes.size(); i++) - { - bool is_selected = i == selected; - if (ImGui::Selectable(bufSizesText[i].c_str(), is_selected)) - config::PixelBufferSize = bufSizes[i]; - if (is_selected) { - ImGui::SetItemDefaultFocus(); - selected = i; - } - } - ImGui::EndCombo(); - } - ImGui::PopItemWidth(); - ImGui::SameLine(0, innerSpacing); - - if (ImGui::ArrowButton("##Decrease BufSize", ImGuiDir_Left)) - { - if (selected > 0) - config::PixelBufferSize = bufSizes[selected - 1]; - } - ImGui::SameLine(0, innerSpacing); - if (ImGui::ArrowButton("##Increase BufSize", ImGuiDir_Right)) - { - if (selected < bufSizes.size() - 1) - config::PixelBufferSize = bufSizes[selected + 1]; - } - ImGui::SameLine(0, style.ItemInnerSpacing.x); - - ImGui::Text("Pixel Buffer Size"); - ImGui::SameLine(); - ShowHelpMarker("The size of the pixel buffer. May need to be increased when upscaling by a large factor."); - - OptionSlider("Maximum Layers", config::PerPixelLayers, 8, 128, - "Maximum number of transparent layers. May need to be increased for some complex scenes. Decreasing it may improve performance."); - } - ImGui::Spacing(); - header("Render to Texture"); - { - OptionCheckbox("Copy to VRAM", config::RenderToTextureBuffer, - "Copy rendered-to textures back to VRAM. Slower but accurate"); - } - ImGui::Spacing(); - header("Texture Upscaling"); - { -#ifdef _OPENMP - OptionArrowButtons("Texture Upscaling", config::TextureUpscale, 1, 8, - "Upscale textures with the xBRZ algorithm. Only on fast platforms and for certain 2D games"); - OptionSlider("Texture Max Size", config::MaxFilteredTextureSize, 8, 1024, - "Textures larger than this dimension squared will not be upscaled"); - OptionArrowButtons("Max Threads", config::MaxThreads, 1, 8, - "Maximum number of threads to use for texture upscaling. Recommended: number of physical cores minus one"); -#endif - OptionCheckbox("Load Custom Textures", config::CustomTextures, - "Load custom/high-res textures from data/textures/"); - } - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - - switch (renderApi) - { - case 0: - config::RendererType = perPixel ? RenderType::OpenGL_OIT : RenderType::OpenGL; - break; - case 1: - config::RendererType = perPixel ? RenderType::Vulkan_OIT : RenderType::Vulkan; - break; - case 2: - config::RendererType = RenderType::DirectX9; - break; - case 3: - config::RendererType = perPixel ? RenderType::DirectX11_OIT : RenderType::DirectX11; - break; - } - } - if (ImGui::BeginTabItem("Audio")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - OptionCheckbox("Enable DSP", config::DSPEnabled, - "Enable the Dreamcast Digital Sound Processor. Only recommended on fast platforms"); - OptionCheckbox("Enable VMU Sounds", config::VmuSound, "Play VMU beeps when enabled."); - - if (OptionSlider("Volume Level", config::AudioVolume, 0, 100, "Adjust the emulator's audio level")) - { - config::AudioVolume.calcDbPower(); - }; -#ifdef __ANDROID__ - if (config::AudioBackend.get() == "auto" || config::AudioBackend.get() == "android") - OptionCheckbox("Automatic Latency", config::AutoLatency, - "Automatically set audio latency. Recommended"); -#endif - if (!config::AutoLatency - || (config::AudioBackend.get() != "auto" && config::AudioBackend.get() != "android")) - { - int latency = (int)roundf(config::AudioBufferSize * 1000.f / 44100.f); - ImGui::SliderInt("Latency", &latency, 12, 512, "%d ms"); - config::AudioBufferSize = (int)roundf(latency * 44100.f / 1000.f); - ImGui::SameLine(); - ShowHelpMarker("Sets the maximum audio latency. Not supported by all audio drivers."); - } - - AudioBackend *backend = nullptr; - std::string backend_name = config::AudioBackend; - if (backend_name != "auto") - { - backend = AudioBackend::getBackend(config::AudioBackend); - if (backend != nullptr) - backend_name = backend->slug; - } - - AudioBackend *current_backend = backend; - if (ImGui::BeginCombo("Audio Driver", backend_name.c_str(), ImGuiComboFlags_None)) - { - bool is_selected = (config::AudioBackend.get() == "auto"); - if (ImGui::Selectable("auto - Automatic driver selection", &is_selected)) - config::AudioBackend.set("auto"); - - for (u32 i = 0; i < AudioBackend::getCount(); i++) - { - backend = AudioBackend::getBackend(i); - is_selected = (config::AudioBackend.get() == backend->slug); - - if (is_selected) - current_backend = backend; - - if (ImGui::Selectable((backend->slug + " - " + backend->name).c_str(), &is_selected)) - config::AudioBackend.set(backend->slug); - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - ImGui::SameLine(); - ShowHelpMarker("The audio driver to use"); - - if (current_backend != nullptr) - { - // get backend specific options - int option_count; - const AudioBackend::Option *options = current_backend->getOptions(&option_count); - - for (int o = 0; o < option_count; o++) - { - std::string value = cfgLoadStr(current_backend->slug, options->name, ""); - - if (options->type == AudioBackend::Option::integer) - { - int val = stoi(value); - if (ImGui::SliderInt(options->caption.c_str(), &val, options->minValue, options->maxValue)) - { - std::string s = std::to_string(val); - cfgSaveStr(current_backend->slug, options->name, s); - } - } - else if (options->type == AudioBackend::Option::checkbox) - { - bool check = value == "1"; - if (ImGui::Checkbox(options->caption.c_str(), &check)) - cfgSaveStr(current_backend->slug, options->name, - check ? "1" : "0"); - } - else if (options->type == AudioBackend::Option::list) - { - if (ImGui::BeginCombo(options->caption.c_str(), value.c_str(), ImGuiComboFlags_None)) - { - bool is_selected = false; - for (const auto& cur : options->values) - { - is_selected = value == cur; - if (ImGui::Selectable(cur.c_str(), &is_selected)) - cfgSaveStr(current_backend->slug, options->name, cur); - - if (is_selected) - ImGui::SetItemDefaultFocus(); - } - ImGui::EndCombo(); - } - } - else { - WARN_LOG(RENDERER, "Unknown option"); - } - - options++; - } - } - - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - } - if (ImGui::BeginTabItem("Advanced")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - header("CPU Mode"); - { - ImGui::Columns(2, "cpu_modes", false); - OptionRadioButton("Dynarec", config::DynarecEnabled, true, - "Use the dynamic recompiler. Recommended in most cases"); - ImGui::NextColumn(); - OptionRadioButton("Interpreter", config::DynarecEnabled, false, - "Use the interpreter. Very slow but may help in case of a dynarec problem"); - ImGui::Columns(1, NULL, false); - - OptionSlider("SH4 Clock", config::Sh4Clock, 100, 300, - "Over/Underclock the main SH4 CPU. Default is 200 MHz. Other values may crash, freeze or trigger unexpected nuclear reactions.", - "%d MHz"); - } - ImGui::Spacing(); - header("Network"); - { - { - DisabledScope scope(game_started); - - OptionCheckbox("Broadband Adapter Emulation", config::EmulateBBA, - "Emulate the Ethernet Broadband Adapter (BBA) instead of the Modem"); - } - OptionCheckbox("Enable GGPO Networking", config::GGPOEnable, - "Enable networking using GGPO"); - OptionCheckbox("Enable Naomi Networking", config::NetworkEnable, - "Enable networking for supported Naomi games"); - if (config::GGPOEnable) - { - config::NetworkEnable = false; - OptionCheckbox("Play as Player 1", config::ActAsServer, - "Deselect to play as player 2"); - char server_name[256]; - strcpy(server_name, config::NetworkServer.get().c_str()); - ImGui::InputText("Peer", server_name, sizeof(server_name), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("Your peer IP address and optional port"); - config::NetworkServer.set(server_name); - OptionSlider("Frame Delay", config::GGPODelay, 0, 20, - "Sets Frame Delay, advisable for sessions with ping >100 ms"); - - ImGui::Text("Left Thumbstick:"); - OptionRadioButton("Disabled", config::GGPOAnalogAxes, 0, "Left thumbstick not used"); - ImGui::SameLine(); - OptionRadioButton("Horizontal", config::GGPOAnalogAxes, 1, "Use the left thumbstick horizontal axis only"); - ImGui::SameLine(); - OptionRadioButton("Full", config::GGPOAnalogAxes, 2, "Use the left thumbstick horizontal and vertical axes"); - - OptionCheckbox("Enable Chat", config::GGPOChat, "Open the chat window when a chat message is received"); - if (config::GGPOChat) - { - OptionCheckbox("Enable Chat Window Timeout", config::GGPOChatTimeoutToggle, "Automatically close chat window after 20 seconds"); - if (config::GGPOChatTimeoutToggle) - { - char chatTimeout[256]; - sprintf(chatTimeout, "%d", (int)config::GGPOChatTimeout); - ImGui::InputText("Chat Window Timeout (seconds)", chatTimeout, sizeof(chatTimeout), ImGuiInputTextFlags_CharsDecimal, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("Sets duration that chat window stays open after new message is received."); - config::GGPOChatTimeout.set(atoi(chatTimeout)); - } - } - OptionCheckbox("Network Statistics", config::NetworkStats, - "Display network statistics on screen"); - } - else if (config::NetworkEnable) - { - OptionCheckbox("Act as Server", config::ActAsServer, - "Create a local server for Naomi network games"); - if (!config::ActAsServer) - { - char server_name[256]; - strcpy(server_name, config::NetworkServer.get().c_str()); - ImGui::InputText("Server", server_name, sizeof(server_name), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("The server to connect to. Leave blank to find a server automatically on the default port"); - config::NetworkServer.set(server_name); - } - char localPort[256]; - sprintf(localPort, "%d", (int)config::LocalPort); - ImGui::InputText("Local Port", localPort, sizeof(localPort), ImGuiInputTextFlags_CharsDecimal, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("The local UDP port to use"); - config::LocalPort.set(atoi(localPort)); - } - OptionCheckbox("Enable UPnP", config::EnableUPnP, "Automatically configure your network router for netplay"); - OptionCheckbox("Broadcast Digital Outputs", config::NetworkOutput, "Broadcast digital outputs and force-feedback state on TCP port 8000. " - "Compatible with the \"-output network\" MAME option. Arcade games only."); -#ifdef NAOMI_MULTIBOARD - ImGui::Text("Multiboard Screens:"); - //OptionRadioButton("Disabled", config::MultiboardSlaves, 0, "Multiboard disabled (when optional)"); - OptionRadioButton("1 (Twin)", config::MultiboardSlaves, 1, "One screen configuration (F355 Twin)"); - ImGui::SameLine(); - OptionRadioButton("3 (Deluxe)", config::MultiboardSlaves, 2, "Three screens configuration"); -#endif - } - ImGui::Spacing(); - header("Other"); - { - OptionCheckbox("HLE BIOS", config::UseReios, "Force high-level BIOS emulation"); - OptionCheckbox("Force Windows CE", config::ForceWindowsCE, - "Enable full MMU emulation and other Windows CE settings. Do not enable unless necessary"); - OptionCheckbox("Multi-threaded emulation", config::ThreadedRendering, - "Run the emulated CPU and GPU on different threads"); -#ifndef __ANDROID - OptionCheckbox("Serial Console", config::SerialConsole, - "Dump the Dreamcast serial console to stdout"); -#endif - OptionCheckbox("Dump Textures", config::DumpTextures, - "Dump all textures into data/texdump/"); - - bool logToFile = cfgLoadBool("log", "LogToFile", false); - bool newLogToFile = logToFile; - ImGui::Checkbox("Log to File", &newLogToFile); - if (logToFile != newLogToFile) - { - cfgSaveBool("log", "LogToFile", newLogToFile); - LogManager::Shutdown(); - LogManager::Init(); - } - ImGui::SameLine(); - ShowHelpMarker("Log debug information to flycast.log"); -#ifdef SENTRY_UPLOAD - OptionCheckbox("Automatically Report Crashes", config::UploadCrashLogs, - "Automatically upload crash reports to sentry.io to help in troubleshooting. No personal information is included."); -#endif - } - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - - #ifdef USE_LUA - header("Lua Scripting"); - { - char LuaFileName[256]; - - strcpy(LuaFileName, config::LuaFileName.get().c_str()); - ImGui::InputText("Lua Filename", LuaFileName, sizeof(LuaFileName), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); - ImGui::SameLine(); - ShowHelpMarker("Specify lua filename to use. Should be located in Flycast config directory. Defaults to flycast.lua when empty."); - config::LuaFileName = LuaFileName; - - } - #endif - } - -#if !defined(NDEBUG) || defined(DEBUGFAST) || FC_PROFILER - gui_debug_tab(); -#endif - - if (ImGui::BeginTabItem("About")) - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, normal_padding); - header("Flycast"); - { - ImGui::Text("Version: %s", GIT_VERSION); - ImGui::Text("Git Hash: %s", GIT_HASH); - ImGui::Text("Build Date: %s", BUILD_DATE); - } - ImGui::Spacing(); - header("Platform"); - { - ImGui::Text("CPU: %s", -#if HOST_CPU == CPU_X86 - "x86" -#elif HOST_CPU == CPU_ARM - "ARM" -#elif HOST_CPU == CPU_MIPS - "MIPS" -#elif HOST_CPU == CPU_X64 - "x86/64" -#elif HOST_CPU == CPU_GENERIC - "Generic" -#elif HOST_CPU == CPU_ARM64 - "ARM64" -#else - "Unknown" -#endif - ); - ImGui::Text("Operating System: %s", -#ifdef __ANDROID__ - "Android" -#elif defined(__unix__) - "Linux" -#elif defined(__APPLE__) -#ifdef TARGET_IPHONE - "iOS" -#else - "macOS" -#endif -#elif defined(TARGET_UWP) - "Windows Universal Platform" -#elif defined(_WIN32) - "Windows" -#elif defined(__SWITCH__) - "Switch" -#else - "Unknown" -#endif - ); -#ifdef TARGET_IPHONE - const char *getIosJitStatus(); - ImGui::Text("JIT Status: %s", getIosJitStatus()); -#endif - } - ImGui::Spacing(); - if (isOpenGL(config::RendererType)) - header("OpenGL"); - else if (isVulkan(config::RendererType)) - header("Vulkan"); - else if (isDirectX(config::RendererType)) - header("DirectX"); - ImGui::Text("Driver Name: %s", GraphicsContext::Instance()->getDriverName().c_str()); - ImGui::Text("Version: %s", GraphicsContext::Instance()->getDriverVersion().c_str()); - - ImGui::PopStyleVar(); - ImGui::EndTabItem(); - } - ImGui::EndTabBar(); - } - ImGui::PopStyleVar(); - - scrollWhenDraggingOnVoid(); - windowDragScroll(); - ImGui::End(); - ImGui::PopStyleVar(); -} - -void gui_display_notification(const char *msg, int duration) -{ - std::lock_guard lock(osd_message_mutex); - osd_message = msg; - osd_message_end = os_GetSeconds() + (double)duration / 1000.0; -} - -static std::string get_notification() -{ - std::lock_guard lock(osd_message_mutex); - if (!osd_message.empty() && os_GetSeconds() >= osd_message_end) - osd_message.clear(); - return osd_message; -} - -inline static void gui_display_demo() -{ - ImGui::ShowDemoWindow(); -} - -static void gameTooltip(const std::string& tip) -{ - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(ImGui::GetFontSize() * 25.0f); - ImGui::TextUnformatted(tip.c_str()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } -} - -static bool getGameImage(const GameBoxart& art, ImTextureID& textureId, bool allowLoad) -{ - textureId = ImTextureID{}; - if (art.boxartPath.empty()) - return false; - - // Get the boxart texture. Load it if needed. - textureId = imguiDriver->getTexture(art.boxartPath); - if (textureId == ImTextureID() && allowLoad) - { - int width, height; - u8 *imgData = loadImage(art.boxartPath, width, height); - if (imgData != nullptr) - { - try { - textureId = imguiDriver->updateTextureAndAspectRatio(art.boxartPath, imgData, width, height); - } catch (...) { - // vulkan can throw during resizing - } - free(imgData); - } - return true; - } - return false; -} - -static bool gameImageButton(ImTextureID textureId, const std::string& tooltip, ImVec2 size) -{ - float ar = imguiDriver->getAspectRatio(textureId); - ImVec2 uv0 { 0.f, 0.f }; - ImVec2 uv1 { 1.f, 1.f }; - if (ar > 1) - { - uv0.y = -(ar - 1) / 2; - uv1.y = 1 + (ar - 1) / 2; - } - else if (ar != 0) - { - ar = 1 / ar; - uv0.x = -(ar - 1) / 2; - uv1.x = 1 + (ar - 1) / 2; - } - bool pressed = ImGui::ImageButton("", textureId, size - ImGui::GetStyle().FramePadding * 2, uv0, uv1); - gameTooltip(tooltip); - - return pressed; -} - -static void gui_display_content() -{ - fullScreenWindow(false); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); - - ImGui::Begin("##main", NULL, ImGuiWindowFlags_NoDecoration); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); - ImGui::AlignTextToFramePadding(); - ImGui::Indent(10 * settings.display.uiScale); - ImGui::Text("GAMES"); - ImGui::Unindent(10 * settings.display.uiScale); - - static ImGuiTextFilter filter; -#if !defined(__ANDROID__) && !defined(TARGET_IPHONE) && !defined(TARGET_UWP) - ImGui::SameLine(0, 32 * settings.display.uiScale); - filter.Draw("Filter"); -#endif - if (gui_state != GuiState::SelectDisk) - { -#ifdef TARGET_UWP - void gui_load_game(); - ImGui::SameLine(ImGui::GetContentRegionMax().x - ImGui::CalcTextSize("Settings").x - ImGui::GetStyle().FramePadding.x * 4.0f - ImGui::GetStyle().ItemSpacing.x - ImGui::CalcTextSize("Load...").x); - if (ImGui::Button("Load...")) - gui_load_game(); - ImGui::SameLine(); -#else - ImGui::SameLine(ImGui::GetContentRegionMax().x - ImGui::CalcTextSize("Settings").x - ImGui::GetStyle().FramePadding.x * 2.0f); -#endif - if (ImGui::Button("Settings")) - gui_state = GuiState::Settings; - } - ImGui::PopStyleVar(); - - scanner.fetch_game_list(); - - // Only if Filter and Settings aren't focused... ImGui::SetNextWindowFocus(); - ImGui::BeginChild(ImGui::GetID("library"), ImVec2(0, 0), true, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NavFlattened); - { - const int itemsPerLine = std::max(ImGui::GetContentRegionMax().x / (150 * settings.display.uiScale + ImGui::GetStyle().ItemSpacing.x), 1); - const float responsiveBoxSize = ImGui::GetContentRegionMax().x / itemsPerLine - ImGui::GetStyle().FramePadding.x * 2; - const ImVec2 responsiveBoxVec2 = ImVec2(responsiveBoxSize, responsiveBoxSize); - - if (config::BoxartDisplayMode) - ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f)); - else - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ScaledVec2(8, 20)); - - int counter = 0; - int loadedImages = 0; - if (gui_state != GuiState::SelectDisk && filter.PassFilter("Dreamcast BIOS")) - { - ImGui::PushID("bios"); - bool pressed; - if (config::BoxartDisplayMode) - { - ImTextureID textureId{}; - GameMedia game; - GameBoxart art = boxart.getBoxart(game); - if (getGameImage(art, textureId, loadedImages < 10)) - loadedImages++; - if (textureId != ImTextureID()) - pressed = gameImageButton(textureId, "Dreamcast BIOS", responsiveBoxVec2); - else - pressed = ImGui::Button("Dreamcast BIOS", responsiveBoxVec2); - } - else - { - pressed = ImGui::Selectable("Dreamcast BIOS"); - } - if (pressed) - gui_start_game(""); - ImGui::PopID(); - counter++; - } - { - scanner.get_mutex().lock(); - for (const auto& game : scanner.get_game_list()) - { - if (gui_state == GuiState::SelectDisk) - { - std::string extension = get_file_extension(game.path); - if (extension != "gdi" && extension != "chd" - && extension != "cdi" && extension != "cue") - // Only dreamcast disks - continue; - } - std::string gameName = game.name; - GameBoxart art; - if (config::BoxartDisplayMode) - { - art = boxart.getBoxart(game); - gameName = art.name; - } - if (filter.PassFilter(gameName.c_str())) - { - ImGui::PushID(game.path.c_str()); - bool pressed; - if (config::BoxartDisplayMode) - { - if (counter % itemsPerLine != 0) - ImGui::SameLine(); - counter++; - ImTextureID textureId{}; - // Get the boxart texture. Load it if needed (max 10 per frame). - if (getGameImage(art, textureId, loadedImages < 10)) - loadedImages++; - if (textureId != ImTextureID()) - pressed = gameImageButton(textureId, game.name, responsiveBoxVec2); - else - { - pressed = ImGui::Button(gameName.c_str(), responsiveBoxVec2); - gameTooltip(game.name); - } - } - else - { - pressed = ImGui::Selectable(gameName.c_str()); - } - if (pressed) - { - if (gui_state == GuiState::SelectDisk) - { - settings.content.path = game.path; - try { - DiscSwap(game.path); - gui_state = GuiState::Closed; - } catch (const FlycastException& e) { - gui_error(e.what()); - } - } - else - { - std::string gamePath(game.path); - scanner.get_mutex().unlock(); - gui_start_game(gamePath); - scanner.get_mutex().lock(); - ImGui::PopID(); - break; - } - } - ImGui::PopID(); - } - } - scanner.get_mutex().unlock(); - } - ImGui::PopStyleVar(); - } - scrollWhenDraggingOnVoid(); - windowDragScroll(); - ImGui::EndChild(); - ImGui::End(); - ImGui::PopStyleVar(); - ImGui::PopStyleVar(); - - contentpath_warning_popup(); -} - -static bool systemdir_selected_callback(bool cancelled, std::string selection) -{ - if (cancelled) - { - gui_state = GuiState::Main; - return true; - } - selection += "/"; - - std::string data_path = selection + "data/"; - if (!file_exists(data_path)) - { - if (!make_directory(data_path)) - { - WARN_LOG(BOOT, "Cannot create 'data' directory: %s", data_path.c_str()); - gui_error("Invalid selection:\nFlycast cannot write to this directory."); - return false; - } - } - else - { - // Test - std::string testPath = data_path + "writetest.txt"; - FILE *file = fopen(testPath.c_str(), "w"); - if (file == nullptr) - { - WARN_LOG(BOOT, "Cannot write in the 'data' directory"); - gui_error("Invalid selection:\nFlycast cannot write to this directory."); - return false; - } - fclose(file); - unlink(testPath.c_str()); - } - set_user_config_dir(selection); - add_system_data_dir(selection); - set_user_data_dir(data_path); - - if (cfgOpen()) - { - config::Settings::instance().load(false); - // Make sure the renderer type doesn't change mid-flight - config::RendererType = RenderType::OpenGL; - gui_state = GuiState::Main; - if (config::ContentPath.get().empty()) - { - scanner.stop(); - config::ContentPath.get().push_back(selection); - } - SaveSettings(); - } - return true; -} - -static void gui_display_onboarding() -{ - ImGui::OpenPopup("Select System Directory"); - select_file_popup("Select System Directory", &systemdir_selected_callback); -} - -static std::future networkStatus; - -static void gui_network_start() -{ - centerNextWindow(); - ImGui::SetNextWindowSize(ScaledVec2(330, 180)); - - ImGui::Begin("##network", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10)); - ImGui::AlignTextToFramePadding(); - ImGui::SetCursorPosX(20.f * settings.display.uiScale); - - if (networkStatus.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) - { - ImGui::Text("Starting..."); - try { - if (networkStatus.get()) - gui_state = GuiState::Closed; - else - gui_stop_game(); - } catch (const FlycastException& e) { - gui_stop_game(e.what()); - } - } - else - { - ImGui::Text("Starting Network..."); - if (NetworkHandshake::instance->canStartNow()) - ImGui::Text("Press Start to start the game now."); - } - ImGui::Text("%s", get_notification().c_str()); - - float currentwidth = ImGui::GetContentRegionAvail().x; - ImGui::SetCursorPosX((currentwidth - 100.f * settings.display.uiScale) / 2.f + ImGui::GetStyle().WindowPadding.x); - ImGui::SetCursorPosY(126.f * settings.display.uiScale); - if (ImGui::Button("Cancel", ScaledVec2(100.f, 0)) && NetworkHandshake::instance != nullptr) - { - NetworkHandshake::instance->stop(); - try { - networkStatus.get(); - } - catch (const FlycastException& e) { - } - gui_stop_game(); - } - ImGui::PopStyleVar(); - - ImGui::End(); - - if ((kcode[0] & DC_BTN_START) == 0 && NetworkHandshake::instance != nullptr) - NetworkHandshake::instance->startNow(); -} - -static void gui_display_loadscreen() -{ - centerNextWindow(); - ImGui::SetNextWindowSize(ScaledVec2(330, 180)); - - ImGui::Begin("##loading", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10)); - ImGui::AlignTextToFramePadding(); - ImGui::SetCursorPosX(20.f * settings.display.uiScale); - try { - const char *label = gameLoader.getProgress().label; - if (label == nullptr) - { - if (gameLoader.ready()) - label = "Starting..."; - else - label = "Loading..."; - } - - if (gameLoader.ready()) - { - if (NetworkHandshake::instance != nullptr) - { - networkStatus = NetworkHandshake::instance->start(); - gui_state = GuiState::NetworkStart; - } - else - { - gui_state = GuiState::Closed; - ImGui::Text("%s", label); - } - } - else - { - ImGui::Text("%s", label); - ImGui::PushStyleColor(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); - ImGui::ProgressBar(gameLoader.getProgress().progress, ImVec2(-1, 20.f * settings.display.uiScale), ""); - ImGui::PopStyleColor(); - - float currentwidth = ImGui::GetContentRegionAvail().x; - ImGui::SetCursorPosX((currentwidth - 100.f * settings.display.uiScale) / 2.f + ImGui::GetStyle().WindowPadding.x); - ImGui::SetCursorPosY(126.f * settings.display.uiScale); - if (ImGui::Button("Cancel", ScaledVec2(100.f, 0))) - gameLoader.cancel(); - } - } catch (const FlycastException& ex) { - ERROR_LOG(BOOT, "%s", ex.what()); -#ifdef TEST_AUTOMATION - die("Game load failed"); -#endif - gui_stop_game(ex.what()); - } - ImGui::PopStyleVar(); - - ImGui::End(); -} - -void gui_display_ui() -{ - FC_PROFILE_SCOPE; - const LockGuard lock(guiMutex); - - if (gui_state == GuiState::Closed || gui_state == GuiState::VJoyEdit) - return; - if (gui_state == GuiState::Main) - { - if (!settings.content.path.empty() || settings.naomi.slave) - { -#ifndef __ANDROID__ - commandLineStart = true; -#endif - gui_start_game(settings.content.path); - return; - } - } - - gui_newFrame(); - ImGui::NewFrame(); - error_msg_shown = false; - bool gui_open = gui_is_open(); - - switch (gui_state) - { - case GuiState::Settings: - gui_display_settings(); - break; - case GuiState::Commands: - gui_display_commands(); - break; - case GuiState::Main: - //gui_display_demo(); - gui_display_content(); - break; - case GuiState::Closed: - break; - case GuiState::Onboarding: - gui_display_onboarding(); - break; - case GuiState::VJoyEdit: - break; - case GuiState::VJoyEditCommands: -#ifdef __ANDROID__ - gui_display_vjoy_commands(); -#endif - break; - case GuiState::SelectDisk: - gui_display_content(); - break; - case GuiState::Loading: - gui_display_loadscreen(); - break; - case GuiState::NetworkStart: - gui_network_start(); - break; - case GuiState::Cheats: - gui_cheats(); - break; - default: - die("Unknown UI state"); - break; - } - error_popup(); - gui_endFrame(gui_open); - - if (gui_state == GuiState::Closed) - emu.start(); -} - -static float LastFPSTime; -static int lastFrameCount = 0; -static float fps = -1; - -static std::string getFPSNotification() -{ - if (config::ShowFPS) - { - double now = os_GetSeconds(); - if (now - LastFPSTime >= 1.0) { - fps = (MainFrameCount - lastFrameCount) / (now - LastFPSTime); - LastFPSTime = now; - lastFrameCount = MainFrameCount; - } - if (fps >= 0.f && fps < 9999.f) { - char text[32]; - snprintf(text, sizeof(text), "F:%.1f%s", fps, settings.input.fastForwardMode ? " >>" : ""); - - return std::string(text); - } - } - return std::string(settings.input.fastForwardMode ? ">>" : ""); -} - -void gui_display_osd() -{ - if (gui_state == GuiState::VJoyEdit) - return; - std::string message = get_notification(); - if (message.empty()) - message = getFPSNotification(); - -// if (!message.empty() || config::FloatVMUs || crosshairsNeeded() || (ggpo::active() && config::NetworkStats)) - { - gui_newFrame(); - ImGui::NewFrame(); - - if (!message.empty()) - { - ImGui::SetNextWindowBgAlpha(0); - ImGui::SetNextWindowPos(ImVec2(0, ImGui::GetIO().DisplaySize.y), ImGuiCond_Always, ImVec2(0.f, 1.f)); // Lower left corner - ImGui::SetNextWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x, 0)); - - ImGui::Begin("##osd", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav - | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoBackground); - ImGui::SetWindowFontScale(1.5); - ImGui::TextColored(ImVec4(1, 1, 0, 0.7f), "%s", message.c_str()); - ImGui::End(); - } - imguiDriver->displayCrosshairs(); - if (config::FloatVMUs) - imguiDriver->displayVmus(); -// gui_plot_render_time(settings.display.width, settings.display.height); - if (ggpo::active()) - { - if (config::NetworkStats) - ggpo::displayStats(); - chat.display(); - } - lua::overlay(); - - gui_endFrame(gui_is_open()); - } -} - -void gui_display_profiler() -{ -#if FC_PROFILER - gui_newFrame(); - ImGui::NewFrame(); - - ImGui::Begin("Profiler", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoBackground); - - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.8f, 0.8f, 0.8f, 1.0f)); - - std::unique_lock lock(fc_profiler::ProfileThread::s_allThreadsLock); - - for(const fc_profiler::ProfileThread* profileThread : fc_profiler::ProfileThread::s_allThreads) - { - char text[256]; - std::snprintf(text, 256, "%.3f : Thread %s", (float)profileThread->cachedTime, profileThread->threadName.c_str()); - ImGui::TreeNode(text); - - ImGui::Indent(); - fc_profiler::drawGUI(profileThread->cachedResultTree); - ImGui::Unindent(); - } - - ImGui::PopStyleColor(); - - for (const fc_profiler::ProfileThread* profileThread : fc_profiler::ProfileThread::s_allThreads) - { - fc_profiler::drawGraph(*profileThread); - } - - ImGui::End(); - - gui_endFrame(true); -#endif -} - -void gui_open_onboarding() -{ - gui_state = GuiState::Onboarding; -} - -void gui_cancel_load() -{ - gameLoader.cancel(); -} - -void gui_term() -{ - if (inited) - { - inited = false; - scanner.stop(); - ImGui::DestroyContext(); - EventManager::unlisten(Event::Resume, emuEventCallback); - EventManager::unlisten(Event::Start, emuEventCallback); - EventManager::unlisten(Event::Terminate, emuEventCallback); - gui_save(); - } -} - -void fatal_error(const char* text, ...) -{ - va_list args; - - char temp[2048]; - va_start(args, text); - vsnprintf(temp, sizeof(temp), text, args); - va_end(args); - ERROR_LOG(COMMON, "%s", temp); - - gui_display_notification(temp, 2000); -} - -extern bool subfolders_read; - -void gui_refresh_files() -{ - scanner.refresh(); - subfolders_read = false; -} - -static void reset_vmus() -{ - for (u32 i = 0; i < std::size(vmu_lcd_status); i++) - vmu_lcd_status[i] = false; -} - -void gui_error(const std::string& what) -{ - error_msg = what; -} - -void gui_save() -{ - boxart.saveDatabase(); -} - -void gui_loadState() -{ - const LockGuard lock(guiMutex); - if (gui_state == GuiState::Closed && savestateAllowed()) - { - try { - emu.stop(); - dc_loadstate(config::SavestateSlot); - emu.start(); - } catch (const FlycastException& e) { - gui_stop_game(e.what()); - } - } -} - -void gui_saveState() -{ - const LockGuard lock(guiMutex); - if (gui_state == GuiState::Closed && savestateAllowed()) - { - try { - emu.stop(); - dc_savestate(config::SavestateSlot); - emu.start(); - } catch (const FlycastException& e) { - gui_stop_game(e.what()); - } - } -} - - -#ifdef TARGET_UWP -// Ugly but a good workaround for MS stupidity -// UWP doesn't allow the UI thread to wait on a thread/task. When an std::future is ready, it is possible -// that the task has not yet completed. Calling std::future::get() at this point will throw an exception -// AND destroy the std::future at the same time, rendering it invalid and discarding the future result. -bool __cdecl Concurrency::details::_Task_impl_base::_IsNonBlockingThread() { - return false; -} -#endif diff --git a/core/rend/gui_android.cpp b/core/rend/gui_android.cpp deleted file mode 100644 index 05fec1f3f..000000000 --- a/core/rend/gui_android.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - Copyright 2019 flyinghead - - This file is part of reicast. - - reicast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - reicast 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 reicast. If not, see . - */ -#ifdef __ANDROID__ - -#include "gui_android.h" -#include "gui.h" - -#include "types.h" -#include "stdclass.h" -#include "imgui/imgui.h" -#include "gui_util.h" - -void vjoy_reset_editing(); -void vjoy_stop_editing(bool canceled); - -void gui_display_vjoy_commands() -{ - centerNextWindow(); - - ImGui::Begin("Virtual Joystick", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoScrollbar); - - if (ImGui::Button("Save", ScaledVec2(150, 50))) - { - vjoy_stop_editing(false); - gui_state = GuiState::Settings; - } - ImGui::SameLine(); - if (ImGui::Button("Reset", ScaledVec2(150, 50))) - { - vjoy_reset_editing(); - gui_state = GuiState::VJoyEdit; - } - - ImGui::SameLine(); - if (ImGui::Button("Cancel", ScaledVec2(150, 50))) - { - vjoy_stop_editing(true); - gui_state = GuiState::Settings; - } - ImGui::End(); -} - -#endif // __ANDROID__ diff --git a/core/rend/gui_cheats.cpp b/core/rend/gui_cheats.cpp deleted file mode 100644 index 383e2aa39..000000000 --- a/core/rend/gui_cheats.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - Copyright 2021 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#include "gui.h" -#include "imgui/imgui.h" -#include "gui_util.h" -#include "cheats.h" -#include "oslib/storage.h" - -static bool addingCheat; - -static void addCheat() -{ - static char cheatName[64]; - static char cheatCode[128]; - centerNextWindow(); - ImGui::SetNextWindowSize(min(ImGui::GetIO().DisplaySize, ScaledVec2(600.f, 400.f))); - - ImGui::Begin("##main", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); - ImGui::AlignTextToFramePadding(); - ImGui::Indent(10 * settings.display.uiScale); - ImGui::Text("ADD CHEAT"); - - ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize("Cancel").x - ImGui::GetStyle().FramePadding.x * 4.f - - ImGui::CalcTextSize("OK").x - ImGui::GetStyle().ItemSpacing.x); - if (ImGui::Button("Cancel")) - addingCheat = false; - ImGui::SameLine(); - if (ImGui::Button("OK")) - { - try { - cheatManager.addGameSharkCheat(cheatName, cheatCode); - addingCheat = false; - cheatName[0] = 0; - cheatCode[0] = 0; - } catch (const FlycastException& e) { - gui_error(e.what()); - } - } - - ImGui::Unindent(10 * settings.display.uiScale); - ImGui::PopStyleVar(); - - ImGui::BeginChild(ImGui::GetID("input"), ImVec2(0, 0), true); - { - ImGui::InputText("Name", cheatName, sizeof(cheatName), 0, nullptr, nullptr); - ImGui::InputTextMultiline("Code", cheatCode, sizeof(cheatCode), ImVec2(0, ImGui::GetTextLineHeight() * 8), 0, nullptr, nullptr); - } - ImGui::EndChild(); - ImGui::End(); -} - -static void cheatFileSelected(bool cancelled, std::string path) -{ - if (!cancelled) - cheatManager.loadCheatFile(path); -} - -void gui_cheats() -{ - if (addingCheat) - { - addCheat(); - return; - } - centerNextWindow(); - ImGui::SetNextWindowSize(min(ImGui::GetIO().DisplaySize, ScaledVec2(600.f, 400.f))); - - ImGui::Begin("##main", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar - | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize); - - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); - ImGui::AlignTextToFramePadding(); - ImGui::Indent(10 * settings.display.uiScale); - ImGui::Text("CHEATS"); - - ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize("Add").x - ImGui::CalcTextSize("Close").x - ImGui::GetStyle().FramePadding.x * 6.f - - ImGui::CalcTextSize("Load").x - ImGui::GetStyle().ItemSpacing.x * 2); - if (ImGui::Button("Add")) - addingCheat = true; - ImGui::SameLine(); -#ifdef __ANDROID__ - if (ImGui::Button("Load")) - hostfs::addStorage(false, true, cheatFileSelected); -#else - if (ImGui::Button("Load")) - ImGui::OpenPopup("Select cheat file"); - select_file_popup("Select cheat file", [](bool cancelled, std::string selection) - { - cheatFileSelected(cancelled, selection); - return true; - }, true, "cht"); -#endif - - ImGui::SameLine(); - if (ImGui::Button("Close")) - gui_state = GuiState::Commands; - - ImGui::Unindent(10 * settings.display.uiScale); - ImGui::PopStyleVar(); - - ImGui::BeginChild(ImGui::GetID("cheats"), ImVec2(0, 0), true, ImGuiWindowFlags_DragScrolling); - { - if (cheatManager.cheatCount() == 0) - ImGui::Text("(No cheat loaded)"); - else - for (size_t i = 0; i < cheatManager.cheatCount(); i++) - { - ImGui::PushID(("cheat" + std::to_string(i)).c_str()); - bool v = cheatManager.cheatEnabled(i); - if (ImGui::Checkbox(cheatManager.cheatDescription(i).c_str(), &v)) - cheatManager.enableCheat(i, v); - ImGui::PopID(); - } - } - scrollWhenDraggingOnVoid(); - windowDragScroll(); - - ImGui::EndChild(); - ImGui::End(); -} diff --git a/core/rend/gui_util.h b/core/rend/gui_util.h deleted file mode 100644 index 7a99ad80c..000000000 --- a/core/rend/gui_util.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . - */ -#pragma once - -#include "types.h" -#include "cfg/option.h" -#include "imgui/imgui.h" -#include "imgui/imgui_internal.h" -#include "gui.h" -#include "emulator.h" - -#include -#include -#include -#include - -typedef bool (*StringCallback)(bool cancelled, std::string selection); - -void select_file_popup(const char *prompt, StringCallback callback, - bool selectFile = false, const std::string& extension = ""); - -void scrollWhenDraggingOnVoid(ImGuiMouseButton mouse_button = ImGuiMouseButton_Left); - -IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 7800 CJK Unified Ideographs from General Standard Chinese Characters -IMGUI_API const ImWchar* GetGlyphRangesChineseTraditionalOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 4700 CJK Unified Ideographs from Hong Kong's List of Graphemes of Commonly-Used Chinese Characters - -// Helper to display a little (?) mark which shows a tooltip when hovered. -void ShowHelpMarker(const char* desc); -template -bool OptionCheckbox(const char *name, config::Option& option, const char *help = nullptr); -bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help = nullptr, const char *format = nullptr); -template -bool OptionRadioButton(const char *name, config::Option& option, T value, const char *help = nullptr); -void OptionComboBox(const char *name, config::Option& option, const char *values[], int count, - const char *help = nullptr); -bool OptionArrowButtons(const char *name, config::Option& option, int min, int max, const char *help = nullptr); - -static inline void centerNextWindow() -{ - ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x / 2.f, ImGui::GetIO().DisplaySize.y / 2.f), - ImGuiCond_Always, ImVec2(0.5f, 0.5f)); -} - -static inline bool operator==(const ImVec2& l, const ImVec2& r) -{ - return l.x == r.x && l.y == r.y; -} - -static inline bool operator!=(const ImVec2& l, const ImVec2& r) -{ - return !(l == r); -} - -void fullScreenWindow(bool modal); -void windowDragScroll(); - -class BackgroundGameLoader -{ -public: - void load(const std::string& path) - { - progress.reset(); - future = std::async(std::launch::async, [this, path] { - emu.loadGame(path.c_str(), &progress); - }); - } - - void cancel() - { - if (progress.cancelled) - return; - progress.cancelled = true; - if (future.valid()) - try { - future.get(); - } catch (const FlycastException&) { - } - emu.unloadGame(); - gui_state = GuiState::Main; - } - - bool ready() - { - if (!future.valid()) - return true; - if (future.wait_for(std::chrono::seconds(0)) == std::future_status::ready) - { - future.get(); - return true; - } - return false; - } - - const LoadProgress& getProgress() const { - return progress; - } - -private: - LoadProgress progress; - std::future future; -}; - -struct ScaledVec2 : public ImVec2 -{ - ScaledVec2() - : ImVec2() {} - ScaledVec2(float x, float y) - : ImVec2(x * settings.display.uiScale, y * settings.display.uiScale) {} -}; - -inline static ImVec2 min(const ImVec2& l, const ImVec2& r) { - return ImVec2(std::min(l.x, r.x), std::min(l.y, r.y)); -} -inline static ImVec2 operator+(const ImVec2& l, const ImVec2& r) { - return ImVec2(l.x + r.x, l.y + r.y); -} -inline static ImVec2 operator-(const ImVec2& l, const ImVec2& r) { - return ImVec2(l.x - r.x, l.y - r.y); -} -inline static ImVec2 operator*(const ImVec2& v, float f) { - return ImVec2(v.x * f, v.y * f); -} -inline static ImVec2 operator/(const ImVec2& v, float f) { - return ImVec2(v.x / f, v.y / f); -} - -u8 *loadImage(const std::string& path, int& width, int& height); - -class DisabledScope -{ -public: - DisabledScope(bool disabled) : disabled(disabled) - { - if (disabled) - { - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); - } - } - ~DisabledScope() - { - if (disabled) - { - ImGui::PopItemFlag(); - ImGui::PopStyleVar(); - } - } - bool isDisabled() const { - return disabled; - } - -private: - bool disabled; -}; diff --git a/core/rend/osd.cpp b/core/rend/osd.cpp index 3419ba33c..a88d8d7d6 100644 --- a/core/rend/osd.cpp +++ b/core/rend/osd.cpp @@ -15,164 +15,14 @@ along with reicast. If not, see . */ #include "osd.h" -#include "types.h" -#include "input/gamepad.h" -#include "input/gamepad_device.h" #include "stdclass.h" #ifdef LIBRETRO #include "vmu_xhair.h" #endif -#include - -#if defined(__ANDROID__) && !defined(LIBRETRO) -extern float vjoy_pos[15][8]; -#else - -static float vjoy_pos[15][8]= -{ - {24+0,24+64,64,64}, //LEFT - {24+64,24+0,64,64}, //UP - {24+128,24+64,64,64}, //RIGHT - {24+64,24+128,64,64}, //DOWN - - {440+0,280+64,64,64}, //X - {440+64,280+0,64,64}, //Y - {440+128,280+64,64,64}, //B - {440+64,280+128,64,64}, //A - - {320-32,360+32,64,64}, //Start - - {440,200,90,64}, //LT - {542,200,90,64}, //RT - - {-24,128+224,128,128}, //ANALOG_RING - {96,320,64,64}, //ANALOG_POINT - {320-32,24,64,64}, // FFORWARD - {1} // VJOY_VISIBLE -}; -#endif // !__ANDROID__ - -static const float vjoy_sz[2][15] = { - { 64,64,64,64, 64,64,64,64, 64, 90,90, 128, 64, 64 }, - { 64,64,64,64, 64,64,64,64, 64, 64,64, 128, 64, 64 }, -}; - -static std::vector osdVertices; -std::vector DefaultOSDButtons; - -void HideOSD() -{ - vjoy_pos[VJOY_VISIBLE][0] = 0; -} - -static void DrawButton(const float xy[8], u32 state) -{ - OSDVertex vtx; - - vtx.r = vtx.g = vtx.b = (0x7F - 0x40 * state / 255) * vjoy_pos[VJOY_VISIBLE][0]; - vtx.a = 0xA0 * vjoy_pos[VJOY_VISIBLE][4]; - vjoy_pos[VJOY_VISIBLE][4] += (vjoy_pos[VJOY_VISIBLE][0] - vjoy_pos[VJOY_VISIBLE][4]) / 2; - - vtx.x = xy[0]; vtx.y = xy[1]; - vtx.u = xy[4]; vtx.v = xy[5]; - osdVertices.push_back(vtx); - - vtx.x = xy[0] + xy[2]; vtx.y = xy[1]; - vtx.u = xy[6]; vtx.v = xy[5]; - osdVertices.push_back(vtx); - - vtx.x = xy[0]; vtx.y = xy[1] + xy[3]; - vtx.u = xy[4]; vtx.v = xy[7]; - osdVertices.push_back(vtx); - - vtx.x = xy[0] + xy[2]; vtx.y = xy[1] + xy[3]; - vtx.u = xy[6]; vtx.v = xy[7]; - osdVertices.push_back(vtx); -} - -static void DrawButton2(const float xy[8], bool state) -{ - DrawButton(xy, state ? 0 : 255); -} - -const std::vector& GetOSDVertices() -{ - osdVertices.reserve(std::size(vjoy_pos) * 4); - osdVertices.clear(); - DrawButton2(vjoy_pos[0], kcode[0] & DC_DPAD_LEFT); - DrawButton2(vjoy_pos[1], kcode[0] & DC_DPAD_UP); - DrawButton2(vjoy_pos[2], kcode[0] & DC_DPAD_RIGHT); - DrawButton2(vjoy_pos[3], kcode[0] & DC_DPAD_DOWN); - - DrawButton2(vjoy_pos[4], kcode[0] & (settings.platform.isConsole() ? DC_BTN_X : DC_BTN_C)); - DrawButton2(vjoy_pos[5], kcode[0] & (settings.platform.isConsole() ? DC_BTN_Y : DC_BTN_X)); - DrawButton2(vjoy_pos[6], kcode[0] & DC_BTN_B); - DrawButton2(vjoy_pos[7], kcode[0] & DC_BTN_A); - - DrawButton2(vjoy_pos[8], kcode[0] & DC_BTN_START); - - DrawButton(vjoy_pos[9], lt[0]); - - DrawButton(vjoy_pos[10], rt[0]); - - DrawButton2(vjoy_pos[11], true); - DrawButton2(vjoy_pos[12], false); - - DrawButton2(vjoy_pos[13], false); - - return osdVertices; -} - -static void setVjoyUV() -{ - float u = 0; - float v = 0; - - for (int i = 0; i < VJOY_VISIBLE; i++) - { - //umin, vmin, umax, vmax - vjoy_pos[i][4] = (u + 1) / OSD_TEX_W; - vjoy_pos[i][5] = 1.f - (v + 1) / OSD_TEX_H; - - vjoy_pos[i][6] = (u + vjoy_sz[0][i] - 1) / OSD_TEX_W; - vjoy_pos[i][7] = 1.f - (v + vjoy_sz[1][i] - 1) / OSD_TEX_H; - - u += vjoy_sz[0][i]; - if (u >= OSD_TEX_W) - { - u -= OSD_TEX_W; - v += vjoy_sz[1][i]; - } - } -} - -static OnLoad setVjoyUVOnLoad(&setVjoyUV); - -u8 *loadOSDButtons(int &width, int &height) -{ - int n; - stbi_set_flip_vertically_on_load(1); - - FILE *file = nowide::fopen(get_readonly_data_path("buttons.png").c_str(), "rb"); - u8 *image_data = nullptr; - if (file != nullptr) - { - image_data = stbi_load_from_file(file, &width, &height, &n, STBI_rgb_alpha); - std::fclose(file); - } - if (image_data == nullptr) - { - if (DefaultOSDButtons.empty()) - die("No default OSD buttons"); - image_data = stbi_load_from_memory(DefaultOSDButtons.data(), DefaultOSDButtons.size(), &width, &height, &n, STBI_rgb_alpha); - } - return image_data; -} - u32 vmu_lcd_data[8][48 * 32]; bool vmu_lcd_status[8]; -bool vmu_lcd_changed[8]; +u64 vmuLastChanged[8]; void push_vmu_screen(int bus_id, int bus_port, u8* buffer) { @@ -192,7 +42,7 @@ void push_vmu_screen(int bus_id, int bus_port, u8* buffer) #ifndef LIBRETRO vmu_lcd_status[vmu_id] = true; #endif - vmu_lcd_changed[vmu_id] = true; + vmuLastChanged[vmu_id] = getTimeMs(); } static const int lightgunCrosshairData[16 * 16] = diff --git a/core/rend/osd.h b/core/rend/osd.h index 63ed099db..f88a13846 100644 --- a/core/rend/osd.h +++ b/core/rend/osd.h @@ -18,29 +18,11 @@ #include "types.h" #include "cfg/option.h" -#include - -#define VJOY_VISIBLE 14 -#define OSD_TEX_W 512 -#define OSD_TEX_H 256 - -struct OSDVertex -{ - float x, y; - float u, v; - u8 r, g, b, a; -}; - -const std::vector& GetOSDVertices(); - -extern std::vector DefaultOSDButtons; -u8 *loadOSDButtons(int &width, int &height); -void HideOSD(); // VMUs extern u32 vmu_lcd_data[8][48 * 32]; extern bool vmu_lcd_status[8]; -extern bool vmu_lcd_changed[8]; +extern u64 vmuLastChanged[8]; void push_vmu_screen(int bus_id, int bus_port, u8* buffer); @@ -48,22 +30,28 @@ void push_vmu_screen(int bus_id, int bus_port, u8* buffer); const u32 *getCrosshairTextureData(); std::pair getCrosshairPosition(int playerNum); -constexpr int XHAIR_WIDTH = 40; -constexpr int XHAIR_HEIGHT = 40; - -static inline bool crosshairsNeeded() +static inline bool crosshairNeeded(int port) { - if (config::CrosshairColor[0] == 0 && config::CrosshairColor[1] == 0 - && config::CrosshairColor[2] == 0 && config::CrosshairColor[3] == 0) + if (port < 0 || port >= 4) return false; - if (settings.platform.isArcade() && !settings.input.lightgunGame) - // not a lightgun game + if (config::CrosshairColor[port] == 0) return false; + if (settings.platform.isArcade()) + { + // Arcade game: only for lightgun games and P1 or P2 (no known 4-player lightgun or touchscreen game for now) + if (!settings.input.lightgunGame || (port >= 2 && !settings.input.fourPlayerGames)) + return false; + } + else { + // Console game + if (config::MapleMainDevices[port] != MDT_LightGun) + return false; + } return true; } static inline void blankVmus() { memset(vmu_lcd_data, 0, sizeof(vmu_lcd_data)); - memset(vmu_lcd_changed, true, sizeof(vmu_lcd_changed)); + memset(vmuLastChanged, 0, sizeof(vmuLastChanged)); } diff --git a/core/rend/roboto_medium.h b/core/rend/roboto_medium.h deleted file mode 100644 index 0f675e9de..000000000 --- a/core/rend/roboto_medium.h +++ /dev/null @@ -1,2419 +0,0 @@ -// File: 'Roboto-Medium.ttf' (162588 bytes) -// Exported using binary_to_compressed_c.cpp -static const unsigned int roboto_medium_compressed_size = 115741; -static const unsigned int roboto_medium_compressed_data[115744/4] = -{ - 0x0000bc57, 0x00000000, 0x1c7b0200, 0x00000400, 0x00010025, 0x82110000, 0x042e0804, 0x50471000, 0xaa7d534f, 0x02008c71, 0x0000a808, 0x53470c59, - 0x9c4c4255, 0x0200e028, 0x0000b461, 0x534f6819, 0x0ba1322f, 0x0000b6b1, 0x35829801, 0x6d63603c, 0x26407061, 0x00007248, 0x00006c1a, 0x7663c812, - 0x97042074, 0x00004a2b, 0x1f82bc2f, 0x7066562c, 0xf97b6d67, 0x0000ab61, 0x3382342d, 0x6167bc28, 0x08007073, 0x5f821300, 0x1f829c20, 0x670c2808, - 0xae66796c, 0x00e9629e, 0x00dc3900, 0x68cccb01, 0x3d786d64, 0x00203c3f, 0x00801500, 0x68ec0400, 0xf8646165, 0x8208ab7b, 0x821c203b, 0x6836212f, - 0x0a231082, 0x829b0aef, 0x8254200f, 0x6824280f, 0x2478746d, 0x82f544f3, 0x00f83b0f, 0x6c881300, 0xdd61636f, 0x00ad66de, 0x00143000, 0x6dc60900, - 0x07707861, 0x1f830212, 0x2f827820, 0x616e202b, 0x633d656d, 0x02004c6f, 0x29df8205, 0x6f70d402, 0x6dff7473, 0x8f826400, 0x1f837c20, 0x6572702b, - 0xf8b11b70, 0x2e000036, 0x220f82f0, 0x820100cc, 0x00022c05, 0xa4401100, 0x3c0f5f6d, 0x821b00f5, 0x0000268a, 0x11f0c400, 0x2c06822e, 0x4edbd000, - 0xfd24fa94, 0x085c09d5, 0x230f8273, 0x00020009, 0x01260085, 0x6c070000, 0x83820cfe, 0x24fa6b26, 0x5c0941fe, 0x1b854984, 0x04210584, 0x821183e2, - 0x008f2605, 0x004e0016, 0x211f8605, 0x4282000e, 0x00160223, 0x240f8206, 0x01950403, 0x241982f4, 0x059a0500, 0x20e18233, 0x2607851f, 0x6600d103, - 0x88000002, 0x00002d6a, 0xff0a00e0, 0x7f210050, 0x21000000, 0x00380382, 0x474f4f47, 0x00004000, 0x0006fdff, 0x660000fe, 0x00029a07, 0x9f010020, - 0x04231b83, 0x82b0053a, 0x0020240c, 0x828c0302, 0x821283f7, 0x82012003, 0x27038326, 0x8f002502, 0x65009802, 0x60219782, 0x081f8204, 0x00e0052b, - 0x001d0563, 0x005a0156, 0x00ca0252, 0x00d20280, 0x00890328, 0x0075041b, 0x00c20144, 0x00a0021c, 0x003c0247, 0x002a0387, 0x202f8202, 0x20038269, - 0x200382a8, 0x20038251, 0x2003824f, 0x20038234, 0x20038281, 0x20038275, 0x20038245, 0x08038268, 0x1f025d2e, 0xe7018200, 0x11042e00, 0x7a043f00, - 0x2a049100, 0xe4038000, 0x28073c00, 0x53055b00, 0x0c051200, 0x39059400, 0x3a056600, 0x86049400, 0x65200382, 0x72300f82, 0xaf056a00, 0x42029400, - 0x7104a300, 0x0b052d00, 0x54241782, 0x01079400, 0xae201b82, 0x86200382, 0x1d202f82, 0x60220784, 0x1b82fe04, 0x4a00d424, 0x2782db04, 0x7d00373e, - 0x12002d05, 0x30000a07, 0x29001005, 0x0700e004, 0x5000d104, 0x84003102, 0x14005803, 0x0c3a0782, 0x35006b03, 0x03009c03, 0x31009402, 0x5a005404, - 0x7c008104, 0x4f003004, 0x03828404, 0x53004b2a, 0x2d00d602, 0x52008904, 0x792a7782, 0x7d000b02, 0xb5ff0102, 0x07822d04, 0x8c000b24, 0x2b82f606, - 0x79007324, 0x2b828e04, 0x8b243783, 0xd0024f00, 0x213a1382, 0xa9024b00, 0x72040800, 0xf5037700, 0xf2051600, 0x06042100, 0xe5031f00, 0x07820c00, - 0xaf025228, 0x02023800, 0x0782ae00, 0x51051b34, 0x1e027500, 0x7d048600, 0xb5046400, 0x9d055e00, 0xa7825d00, 0xfc01193c, 0xf8048800, 0x85035a00, - 0x44065d00, 0x91035700, 0xe2038d00, 0x6d045700, 0x0f847f00, 0x8700db2e, 0x7f000a03, 0x5f004a04, 0x3c00f602, 0x37340382, 0x70009b02, 0x9200bb04, - 0x4500ed03, 0x8e004202, 0x6d001002, 0x80221782, 0x8782a703, 0x00e23408, 0x00d0055d, 0x002b0659, 0x00570650, 0x00e40367, 0xff850742, 0x004404f6, - 0x0084054d, 0x00ca0469, 0x00e70494, 0x00c10688, 0x00a70448, 0x00910467, 0x82880443, 0x00973ad7, 0x00b00582, 0x001a021f, 0x0098048f, 0x0064048e, - 0x004f0222, 0x00930521, 0x081f8290, 0xb4077e36, 0x3a076400, 0x0c025b00, 0x88058b00, 0xd0025100, 0x8a05e4ff, 0x9e045800, 0xa4054f00, 0xf2047d00, - 0x26027700, 0x3c04b5ff, 0xe6035900, 0xb0039400, 0xdc037200, 0x7c20bb82, 0x0b3ef782, 0xb2028100, 0x4d027800, 0xd8032900, 0x1f037a00, 0x6c024900, - 0x00008200, 0x00008efc, 0x07825efd, 0x07827320, 0x07823e20, 0x07820c20, 0x5d021c24, 0x4782c600, 0xdb836720, 0x00750437, 0x00bf059b, 0x007a0519, - 0x0038055b, 0x00900420, 0x00b1056c, 0x3607829b, 0x00ef0547, 0x00aa054a, 0x005b0544, 0x0084046b, 0x00c60456, 0x820e0496, 0x00882a23, 0x00600454, - 0x001a0460, 0x33bb8361, 0x7300a104, 0xa900aa02, 0x16006a04, 0x64001304, 0x2d00f304, 0x80261782, 0x52003704, 0x03829004, 0x3f002d22, 0x80222f82, - 0x4b82d005, 0x00c92608, 0x0094064f, 0x00b30466, 0xff7b0476, 0x007106e1, 0x00fe0533, 0x00590522, 0x00880868, 0x008f082d, 0x005b069b, 0x2a778231, - 0x00080592, 0x00060690, 0x82a20724, 0xd6280857, 0xa8054900, 0xa9059400, 0x0a052d00, 0x5f063900, 0xf9054f00, 0x89059200, 0x9b078e00, 0xf9079800, - 0x1a069800, 0xf9061800, 0x3408cf82, 0x05900007, 0x076b0050, 0x04a00054, 0x042000f7, 0x045b007d, 0x038f008f, 0x0485005a, 0x062700f6, 0x041e0076, - 0x044d0016, 0x04860098, 0x048f006e, 0x0621009a, 0x20078203, 0x820f8297, 0xf5032513, 0xd3052300, 0xd320e382, 0x66300f82, 0x8e065f00, 0xec068600, - 0x17057e00, 0x6f061f00, 0x68202782, 0x3c380382, 0x84065100, 0x70049100, 0x71042700, 0x3c04dbff, 0xd1065400, 0xe4061e00, 0x89223382, 0x5b83eeff, - 0x0049072d, 0x004f0688, 0xff670470, 0x822807e0, 0x00013e9f, 0x000c0586, 0x0060041c, 0x0042070a, 0x003606ac, 0x00ed069d, 0x00e60580, 0x00320982, - 0x2ec382a3, 0x0020048f, 0x00f00328, 0x007a0533, 0x8288045f, 0x001a26e3, 0x000e0410, 0x210f8720, 0x53824507, 0x74004422, 0x052f5b87, 0x0466001a, - 0x045c004a, 0x006d00ff, 0x4166fc00, 0x7b2806eb, 0xa5fd0000, 0x24fa0000, 0x4d200382, 0x05337f83, 0x04940013, 0x047c0086, 0x038f006a, 0x047e00a1, - 0x829b00b7, 0x7e24086b, 0x90002c05, 0x8e00ab04, 0x34009506, 0x3d00a405, 0x9400d007, 0x7e00aa05, 0x9b004708, 0x7e00f506, 0x67002a06, 0x613e5b82, - 0x2d003107, 0x26007005, 0x80007405, 0x74007304, 0x85008705, 0x16002406, 0xcbffc304, 0x43822105, 0x8e007824, 0x5382af05, 0x7e00882a, 0x51008805, - 0x5b00a604, 0x5d260382, 0x3400c704, 0x3b825303, 0x52000738, 0x6800f106, 0x5e00dd06, 0x3c005306, 0x2f002805, 0x48007b04, 0xcb823e04, 0x00be2408, - 0x009d0642, 0x00fd0740, 0x009e0694, 0x00040577, 0x002c045d, 0x00aa0555, 0x001d0521, 0x00550544, 0x822c0381, 0x00142787, 0x00290800, 0x07860400, - 0x00b90229, 0x000a0200, 0x825c0100, 0x007f2413, 0x82300200, 0x00a2240b, 0x82d10000, 0x23028203, 0x4700a102, 0x05250383, 0x069d0029, 0x08438230, - 0x04009d74, 0x6300c001, 0x3300bc01, 0x3200ce01, 0x4a00a801, 0x6c001403, 0x40001b03, 0x32000803, 0x40005d04, 0x5c009904, 0x8800cb02, 0x8a00fa03, - 0x8a00a605, 0x47006c01, 0x4a00a707, 0x6c007202, 0x54006902, 0x2d009c03, 0x3500f602, 0x69005c03, 0x5f00b504, 0x21007006, 0x9800b806, 0x94009308, - 0x35008807, 0x7c008c06, 0x5e008c04, 0x2100f505, 0x28003404, 0xc382a204, 0x005e3408, 0x007d054f, 0x00e40528, 0x00e20370, 0x002e084c, 0x00090590, - 0x0014056d, 0x00350696, 0x00dd0659, 0x00d10654, 0x00a2065b, 0x00910458, 0x00960562, 0x82d904a6, 0x8328088b, 0xb2049e00, 0x45083b00, 0x2d025e00, - 0x8e04afff, 0x7a046500, 0x11049100, 0x2a043c00, 0x0c048000, 0x5b022400, 0x9802a100, 0xf130d382, 0x1b054500, 0xa8042d00, 0xbc041800, 0x23072d00, - 0x05280385, 0x062d0011, 0x004b00b7, 0x083b0082, 0x08590030, 0x045c0035, 0x043a0033, 0x024f0093, 0x01b0ff10, 0x035c00b3, 0x877500a1, 0x0b042303, - 0x03857500, 0x824cff21, 0x837a2007, 0x05022f17, 0x9e049400, 0x60040900, 0x80047600, 0x83824f00, 0xe0037626, 0xc5037600, 0xa6300f82, 0xde045400, - 0xfc017600, 0xd5038500, 0x5b042400, 0xb9241782, 0x06067600, 0xdd201b82, 0xc0200382, 0x6d202f82, 0x4c220784, 0x07825c04, 0x3e003424, 0x27823b04, - 0x67008432, 0x09007b04, 0x28000706, 0x15005e04, 0x05003c04, 0x4124d382, 0x4b00f602, 0x80200382, 0x22088b45, 0x823500f6, 0x824f200b, 0x824d2003, - 0x86362003, 0x0346281f, 0x029000b9, 0x829600b2, 0x040a324b, 0x055600bb, 0x059b0044, 0x049b0028, 0x05810030, 0x23078239, 0x0481002d, 0x66266b83, - 0x4d043800, 0x2f820e00, 0x6f837620, 0x8f830420, 0x03257782, 0x04420098, 0x308f82d8, 0x05440019, 0x0550009d, 0x04500054, 0x055f00e4, 0x829b8291, - 0x540729e3, 0x57072400, 0x97057600, 0xd7200f82, 0x71202782, 0x59280b82, 0x3a062700, 0x46041a00, 0xe4203b82, 0x5c201382, 0xcb200382, 0x46241f82, - 0x5d051f00, 0x8c280b82, 0x84064100, 0x0a077600, 0x5a242b82, 0x20060a00, 0x67201382, 0x80240382, 0x92063c00, 0x88240782, 0x22044300, 0x92201782, - 0x9d204382, 0x1a202382, 0x6e300382, 0xf0052400, 0x5a044f00, 0xc4040500, 0x95061500, 0x47824f82, 0x828c0421, 0x00fe241b, 0x82d2040a, 0x836f831b, - 0x25cb82b7, 0x4600f703, 0x4b823608, 0x2800eb28, 0x7c008804, 0xb7823d04, 0x4f00982c, 0x5b00a403, 0x4c00a104, 0x13829404, 0x33829f20, 0x53004b2c, - 0x51008904, 0x6b007a05, 0x0382a205, 0x9b008624, 0x0782e005, 0x6b00e22c, 0x97001b04, 0x6e008204, 0x4782b903, 0x0f005726, 0x3500be04, 0x41065741, - 0x0428146b, 0x0466006b, 0x0643002e, 0x042b6782, 0x047300b4, 0x026200eb, 0x84b5ff26, 0x001b2703, 0xff1b028f, 0x078202fb, 0x0060042f, 0x00fe0176, - 0x00a00200, 0xff580547, 0x2f0383f7, 0xd4ff8f04, 0x2d00db04, 0xe8ffa902, 0x12005305, 0x39200398, 0x86236382, 0x8a049400, 0x42022703, 0x4202c8ff, - 0x0782a300, 0x0382cb20, 0xae05bf28, 0x86059400, 0x03906600, 0x7d003723, 0x27038a05, 0x0700e004, 0x5a005404, 0x30200398, 0x23061f41, 0x0453004b, - 0x02250386, 0x02b4ff1a, 0x22cb821a, 0x82b7ff1a, 0x04ab210b, 0x20078f48, 0x8b2b828e, 0x00722303, 0x038a0477, 0x00e50323, 0x8303830c, 0x906f83d7, - 0x82d78307, 0x9705206f, 0x823a2007, 0x821a20d3, 0x83f78363, 0x27079e8b, 0x6a007205, 0x52008904, 0xaf2a0798, 0x71049400, 0x42027900, 0xc782b3ff, - 0x07829f20, 0x0782b920, 0x0782a520, 0x0782df20, 0x4202cb34, 0x0b021700, 0x42020000, 0xb3069d00, 0x0c04a300, 0x2f827d00, 0x26022d26, 0x0b05b5ff, - 0x2d203b82, 0x54220f82, 0x23829400, 0xcf828a20, 0x55200783, 0xa1220784, 0x07848c00, 0x8c00e724, 0x2782ae05, 0x79007322, 0x042b078f, 0x05a5ff73, - 0x04660086, 0x8f4f008e, 0xfe042107, 0xd0225382, 0x07867c00, 0x07864f20, 0xd4043828, 0x21044a00, 0x07a04b00, 0x2d00db26, 0x0800a902, 0x86054b42, - 0x00d12407, 0x82370508, 0x007222af, 0x2f07a777, 0x30000a07, 0x2100f205, 0x0700e004, 0x0c00e503, 0x04270783, 0x045000d1, 0x8f520006, 0x85073307, - 0xc106f6ff, 0x84054800, 0x88046900, 0x7a044f00, 0x0384a6ff, 0x24003b26, 0x09009e04, 0x80250398, 0xe0034f00, 0x05234500, 0x01270786, 0x01a6fffc, - 0x828300fc, 0x82a92007, 0x049d2103, 0x20071b45, 0x8b5782c0, 0x00842303, 0x038b0467, 0x05003c22, 0x5b82678c, 0x038b0420, 0x6a007a22, 0x0f836b8f, - 0x00a60423, 0x22038c54, 0x827600de, 0x82912077, 0x82972003, 0x82bd2003, 0x8215208b, 0x457c2003, 0x03210bb3, 0x05bb45b9, 0x9f840783, 0xa78fa383, - 0xf7445c20, 0x23078306, 0x043e0034, 0x3b23038b, 0x87042400, 0x86c78f03, 0x0706240f, 0x83042800, 0x06ef45d3, 0x002a0423, 0x3f038341, 0x12005305, - 0x4affea04, 0x53ff1306, 0x56ffa602, 0xa7ff9a05, 0xe1fe4405, 0xb2ff6f05, 0x87ffaa02, 0x05211f83, 0x061f440c, 0x5000d122, 0x2107c74c, 0xbf4c0b05, - 0xdb042f11, 0xe0042d00, 0x10050700, 0x42022900, 0x0b83bfff, 0x0084042f, 0x00600456, 0x00880460, 0x00aa027e, 0x340b82a9, 0x00980480, 0x008e048e, - 0x00bb044f, 0x00f50392, 0x00060416, 0x206b821f, 0x831b84cc, 0x00602417, 0x44940680, 0x75260697, 0xd4049b00, 0x8f444a00, 0x04bf2806, 0x052d0071, - 0x839b0028, 0x0a05237f, 0x9f883900, 0x86242783, 0xa8059400, 0xaf209786, 0x2006b344, 0x202b82b1, 0x200b821d, 0x824f8239, 0x279b839f, 0x5a005404, - 0x53004b04, 0x86208782, 0x334d8784, 0x4c032006, 0x1f2005df, 0x03371b83, 0x0485005a, 0x024b0021, 0x027d000b, 0x02abff1a, 0x04b5ff01, 0x838f006e, - 0x07cb4223, 0xdb42078f, 0x5a013b07, 0x98025200, 0x4a046500, 0x26028f00, 0xbc01b1ff, 0x01073300, 0xf6069400, 0xaf837c00, 0xab867f84, 0x05258787, - 0x054400aa, 0x07774ac9, 0x08f1ff27, 0x094f0073, 0x26b3826b, 0x044900d6, 0x444d0016, 0x638307c7, 0x000e042f, 0x00420220, 0x00a207a3, 0x00760616, - 0x440b831e, 0x43430fff, 0x44042007, 0x052706d7, 0x04510088, 0x8359003c, 0x20378703, 0x275b8704, 0x049400a8, 0x05860098, 0x4b440787, 0x070b4b07, - 0x50220787, 0x3f826b00, 0x0a055128, 0xe5033900, 0x07900c00, 0x8e008938, 0x5f006604, 0x9b00f906, 0x8f006f06, 0x29001005, 0x1f000604, 0xd7828404, - 0x2d00a926, 0x21009a04, 0x0f8aa78f, 0x54041024, 0x1f9a9aff, 0xe7451220, 0x00532114, 0xef87178c, 0xff250799, 0xff4b04d5, 0x271f978e, 0xa3004202, - 0x8f001a02, 0x94240782, 0x78000b02, 0x8a0f4f45, 0x0427240f, 0x98a3ff8e, 0x07434e1f, 0x4745079f, 0x06734e0f, 0x97077b4e, 0x0b474507, 0x4f450320, - 0x23078406, 0x044f00a2, 0x05370382, 0x049b0028, 0x058f006e, 0x049400af, 0x04860097, 0x032d00db, 0x412300f5, 0x05200793, 0x8706ab41, 0x75042707, - 0x5a039b00, 0x1b428500, 0x07634c07, 0x00710427, 0xff070579, 0x2f0383d0, 0xf0ff7504, 0xe2ff5a03, 0xe3ff3c05, 0xaeff4404, 0x86082f42, 0x01072563, - 0x03069400, 0xeb417382, 0x07ab4206, 0x042b7387, 0x04600060, 0x06020065, 0x51810030, 0xa0261067, 0xb4045d00, 0x5f477d00, 0x07eb4608, 0x3005df41, - 0x0086040d, 0x004b0448, 0xfe420201, 0xfe1a02f6, 0x067741e2, 0xfe041636, 0xd0023200, 0x37056eff, 0x72047100, 0xdf040f00, 0x0c05acfe, 0x8124f382, - 0x3a057c00, 0x84220782, 0x07884f00, 0x4706a347, 0x7747076f, 0x4378200e, 0x7b8708a3, 0x47851d20, 0x20063347, 0x082b4772, 0x27061347, 0x12002d05, - 0x1600f503, 0xe3460787, 0x06d74608, 0xfecc053f, 0x009e041c, 0xff1c0409, 0xff1a052a, 0xff380237, 0xffca0439, 0xfe780493, 0xffee04e8, 0x201b84a4, - 0x05af4660, 0x002a0423, 0x07cf4b41, 0x4b5b0421, 0xc34b06c7, 0x003b2e07, 0x003c0424, 0x005e0405, 0xfffc0115, 0x210b839d, 0x3346e003, 0x34042705, - 0xfc013e00, 0x17838500, 0x23075346, 0x1f004604, 0xb9205b88, 0xe4205f86, 0xde235386, 0x83047600, 0x82d82057, 0x826d2007, 0x00802303, 0x5f83044f, - 0x37825b82, 0x83834220, 0x13830420, 0x05246f82, 0x040a00fe, 0x17823782, 0x9d051f24, 0xbb445000, 0x0421080b, 0x0253004b, 0x0078001a, 0x00010000, - 0x09e40400, 0x0000040b, 0x03020202, 0x06070506, 0x04030302, 0x20048405, 0x21008705, 0x09820202, 0x06080422, 0x05270082, 0x03060605, 0x84050605, - 0x8306200c, 0x8208200d, 0x04022505, 0x03040402, 0x05822e84, 0x05020224, 0x0c830802, 0x0305032c, 0x05070405, 0x02030504, 0x43820603, 0x0205062a, - 0x04070406, 0x04070504, 0x03201a82, 0x18821c82, 0x07040426, 0x08040707, 0x06205382, 0x28833484, 0x09238882, 0x82060208, 0x82062006, 0x8204200e, - 0x21908300, 0xb0820304, 0x03200282, 0x06225682, 0x31820606, 0x05820720, 0x05207584, 0x0f821282, 0x4d820b83, 0x07050526, 0x0a0a0607, 0x07221d82, - 0x29820509, 0x09220d82, 0xb2820709, 0xab820820, 0x07060422, 0x05202684, 0x05209a83, 0x07221582, 0x02820505, 0x08080526, 0x07080505, 0xdc820282, - 0x07080727, 0x0405090a, 0x85528206, 0x8209820d, 0x21028278, 0x37820605, 0x052af682, 0x06090607, 0x06070809, 0x1b820608, 0x28840720, 0x33821a82, - 0x14820820, 0x09050525, 0x82070907, 0x06063418, 0x05090504, 0x02020309, 0x01020205, 0x06030300, 0x82020407, 0x04032200, 0x24b28203, 0x09020604, - 0x240a8203, 0x08070504, 0x237b820a, 0x06050507, 0x09202082, 0x08200482, 0x4f830e82, 0x05020922, 0x03220083, 0x0d820203, 0x06080827, 0x09090008, - 0x224b8205, 0x83040404, 0x84042017, 0x210b831e, 0xcf840402, 0xd0852d84, 0x00880320, 0x06206c83, 0x31848d82, 0x3a820482, 0x00820620, 0x4f820520, - 0x06050525, 0x82060507, 0x41062013, 0x1082090a, 0x05211482, 0x22468507, 0x84090405, 0x830520d8, 0x24358200, 0x05050707, 0x85bc8204, 0x2023835d, - 0x83d08206, 0x820320e0, 0x82052063, 0x82248204, 0x82b68502, 0x860e85f1, 0x0a534211, 0x0d883282, 0x6b410420, 0x05714106, 0x06200582, 0x5a411a88, - 0x22138206, 0x86020305, 0x05082301, 0x21820205, 0x02050224, 0x71820305, 0x04842284, 0x06050623, 0x89018303, 0x8720833d, 0x215d8522, 0xbf830708, - 0x08212184, 0x22678a08, 0x82040505, 0x8acb8300, 0x820a873d, 0x04042119, 0xec840c84, 0x2b840420, 0x12822792, 0x16840720, 0x07060625, 0x82060603, - 0x0506218b, 0x08209383, 0x0621ff84, 0x841b8303, 0x82042004, 0x05052898, 0x05050507, 0x82050303, 0x8306201c, 0x06554327, 0x04219486, 0x82a88205, - 0x0405236e, 0x01830708, 0x02040526, 0x02020503, 0x8205b541, 0x06072855, 0x050b0a05, 0x82050605, 0x82092043, 0x2109826d, 0x0f840808, 0x83070921, - 0x084c4106, 0x04060522, 0x05220184, 0x2c820708, 0x5b41168a, 0x061e420a, 0x0323d28c, 0x99020302, 0x4119822d, 0x042009da, 0x0420aa82, 0x37437485, - 0x04052407, 0x82070709, 0x87062012, 0x847d8410, 0x052241ae, 0x84083443, 0x8e032065, 0x8405209a, 0x216482e8, 0xdf820503, 0x0820bf83, 0x20059142, - 0x43108206, 0x02210585, 0x28488505, 0x04040502, 0x04020205, 0x21008205, 0xdf430404, 0x24c88605, 0x06050607, 0x240b8206, 0x00000002, 0x24038603, - 0x0003001c, 0x830b8201, 0x000a2807, 0x00880600, 0x826c0604, 0x00ea260f, 0x00060080, 0x0809826a, 0x0d0002e7, 0xa0007e00, 0xad00ac00, 0xc600bf00, - 0xe600cf00, 0xfe00ef00, 0x11010f01, 0x27012501, 0x53013001, 0x67015f01, 0x7f017e01, 0x92018f01, 0xb001a101, 0xff01f001, 0x37021b02, 0xbc025902, - 0xc902c702, 0xf302dd02, 0x03030103, 0x0f030903, 0x8a032303, 0x92038c03, 0xb003a103, 0xc903b903, 0xd203ce03, 0x2504d603, 0x45042f04, 0x62044f04, - 0x79046f04, 0xce048604, 0xe104d704, 0x0105f504, 0x13051005, 0x3f1e011e, 0xf11e851e, 0xf91ef31e, 0x0b204d1f, 0x15201120, 0x22201e20, 0x30202720, - 0x3a203320, 0x44203c20, 0x7f207420, 0xaa20a420, 0xb120ac20, 0xbd20ba20, 0x13210521, 0x22211621, 0x2e212621, 0x02225e21, 0x0f220622, 0x1a221222, - 0x2b221e22, 0x60224822, 0xca256522, 0xc3f602ee, 0xfffe04fb, 0xfffffdff, 0x83008300, 0x822020eb, 0x82a120eb, 0x00ae3ceb, 0x00c700c0, 0x00e700d0, - 0x01ff00f0, 0x01120110, 0x01280126, 0x01540131, 0x86680160, 0x01a022eb, 0x22eb82af, 0x861802fa, 0x82c620eb, 0x82d820eb, 0x880020eb, 0x828420eb, - 0x038e2ceb, 0x03a30393, 0x03ba03b1, 0x82d103ca, 0x002808eb, 0x30042604, 0x50044604, 0x70046304, 0x88047a04, 0xd804cf04, 0xf604e204, 0x11050205, - 0x3e1e001e, 0xa01e801e, 0xf41ef21e, 0x002aeb82, 0x13201020, 0x20201720, 0xeb822520, 0x39203222, 0xa324eb88, 0xab20a620, 0xb922eb82, 0xeb8cbc20, - 0xeb865b20, 0xeb8a1120, 0xeb826420, 0xeb820120, 0xeb820120, 0xeb82fc20, 0x00000132, 0xe4fff6ff, 0xc2ffa401, 0xc1ff9801, 0x8b010000, 0x86200382, - 0x82200382, 0x80200382, 0x7e200382, 0x76200382, 0x782d0382, 0x06ff15ff, 0xf7fe04ff, 0xba01eafe, 0x37008200, 0x43fe64fe, 0xd7fdef00, 0xc8fdd6fd, - 0xa7fdb3fd, 0xa1fda6fd, 0x89fd9cfd, 0xca225182, 0x2082c9ff, 0x09fd0022, 0xaa280b82, 0xfafcfdfc, 0xb9fc0000, 0xb1200382, 0xa6200382, 0xa0240382, - 0xf4fe0000, 0xf1200382, 0x2e080b82, 0xe5000049, 0xe56ee5ae, 0xe44ee51f, 0xe54ce5b3, 0xe15be15c, 0xe1000057, 0xe153e154, 0xe349e151, 0xe341e175, - 0xe138e16d, 0x00ffe009, 0x82dae000, 0xd5340803, 0xcde0cee0, 0x79e086e0, 0x6ce077e0, 0x61e093df, 0x92df35e0, 0x86dfabde, 0x7edf85df, 0x6fdf7bdf, - 0x3cdf53df, 0xd5db39df, 0xdf0a9f13, 0xab02a306, 0x0100af01, 0x038c8f83, 0x00214982, 0x20d782e4, 0x2003820e, 0x20038a28, 0x24258c6a, 0x016a0100, - 0x89118d74, 0x6201210d, 0x21820b83, 0x00008624, 0x0b839e01, 0xb6200782, 0xfe240382, 0x26020000, 0x48200382, 0x58200382, 0xe2200382, 0xf2240382, - 0x06030000, 0x058b2385, 0x8bf80221, 0x240b870d, 0x0000e802, 0x87038202, 0x0a07ab0f, 0x024b02b6, 0x024d024c, 0x024f024e, 0x02810050, 0x025b0247, - 0x025d025c, 0x025f025e, 0x00820060, 0x02610283, 0x02630262, 0x00650264, 0x02850084, 0x02670266, 0x02690268, 0x006b026a, 0x02870086, 0x02770276, - 0x02790278, 0x007b027a, 0x02890088, 0x027d027c, 0x027f027e, 0x028a0080, 0x00460446, 0x0048028b, 0x02af028c, 0x02b102b0, 0x02b302b2, 0x028d00b4, - 0x02b602b5, 0x02b802b7, 0x02ba02b9, 0x00bc02bb, 0x028f008e, 0x02be02bd, 0x02c002bf, 0x02c202c1, 0x009000c3, 0x02c40291, 0x02c602c5, 0x02c802c7, - 0x009200c9, 0x02d80293, 0x02dc02d9, 0x02de02dd, 0x024902df, 0x0251024a, 0x02f7026c, 0x02f902f8, 0x02d602fa, 0x02da02d7, 0x00ad00db, 0x005203ae, - 0x035303af, 0x00550354, 0x03b100b0, 0x035d035c, 0x03b2005e, 0x0060035f, 0x036103b3, 0x03b40062, 0x03b50063, 0x03b60064, 0x00660365, 0x006703b7, - 0x03b900b8, 0x03690368, 0x036b036a, 0x036d036c, 0x006f036e, 0x037103c3, 0x03c40072, 0x00c50070, 0x00c700c6, 0x00c900c8, 0x03cb00ca, 0x00cc0073, - 0x03b003cd, 0x03d10079, 0x03d2007a, 0x037c037b, 0x007e037d, 0x00d400d3, 0x038003d5, 0x008103b1, 0x008203d6, 0x038303d7, 0x03d80084, 0x00d90085, - 0x03db00da, 0x007f0386, 0x038703dc, 0x03890388, 0x038b038a, 0x008d038c, 0x03de00dd, 0x008f038e, 0x00ea00e9, 0x03ec00eb, 0x00ed0090, 0x03ef00ee, - 0x00f00091, 0x00f200f1, 0x009203f3, 0x039303f4, 0x03f50094, 0x03f60095, 0x03b20396, 0x03010197, 0x03020198, 0x039a0399, 0x019c039b, 0x01040103, - 0x039d0305, 0x019e03b3, 0x01070106, 0x035c0408, 0x01b503b4, 0x01170116, 0x03190118, 0x03b703b6, 0x01b803b9, 0x04280127, 0x04620461, 0x0129015b, - 0x012b012a, 0x042d012c, 0x015e045d, 0x042f012e, 0x03570456, 0x04bb03ba, 0x01490448, 0x04310130, 0x0160045f, 0x04330132, 0x014b044a, 0x01350134, - 0x01370136, 0x03390138, 0x04bd03bc, 0x034d044c, 0x04bf03be, 0x046a0469, 0x014f044e, 0x043b013a, 0x01510450, 0x013d013c, 0x015a043e, 0x0440013f, - 0x03590458, 0x03c103c0, 0x014101c2, 0x04670442, 0x01430168, 0x04630444, 0x04520464, 0x04650453, 0x03450166, 0x03cc03cd, 0x03cf03ce, 0x03d103d0, - 0x014601d2, 0x04540447, 0x03e70355, 0x014801e8, 0x03e90349, 0x046b04ea, 0x034a016c, 0x036d04eb, 0x01ed03ec, 0x046a0169, 0x016e046f, 0x0147047f, - 0x000c0085, 0x0c210082, 0x82048240, 0x04012102, 0x02870482, 0x08820120, 0x83075e5f, 0x000d2407, 0x820d0000, 0x82032003, 0x82202003, 0x827e2003, - 0x82042003, 0x85a02003, 0x44022103, 0xa1200782, 0xac200382, 0x63200382, 0xad200382, 0x02210385, 0x20078245, 0x200382ae, 0x200382bf, 0x2003826f, - 0x240382c0, 0x020000c5, 0x2007824b, 0x200386c6, 0x20078281, 0x200382c7, 0x201782cf, 0x20078252, 0x210385d0, 0x07824702, 0x0382d120, 0x1782d620, - 0x07825b20, 0x0382d720, 0x0382d820, 0x03828220, 0x0382d920, 0x1782dd20, 0x07826120, 0x0382de20, 0x0382df20, 0x03828420, 0x0382e020, 0x1782e520, - 0x07826620, 0x0386e620, 0x07828620, 0x0382e720, 0x1782ef20, 0x07826d20, 0x0386f020, 0x07828720, 0x0382f120, 0x1782f620, 0x07827620, 0x0382f720, - 0x0382f820, 0x03828820, 0x0382f920, 0x1782fd20, 0x07827c20, 0x0386fe20, 0x07828a20, 0x0000ff24, 0x17820f01, 0x0121b382, 0x820b8210, 0x46022103, - 0x11200782, 0x04200385, 0x12200b83, 0x25200b82, 0x92202382, 0x26200782, 0x00210385, 0x2007828b, 0x21038527, 0xf7444802, 0x82302006, 0x82a62023, - 0x8531200b, 0x8c002103, 0x32200782, 0x37200382, 0xaf201782, 0x38200782, 0x00210385, 0x2007828d, 0x20038239, 0x20178240, 0x200782b5, 0x20038241, - 0x208b8242, 0x2007828e, 0x20038243, 0x20178249, 0x200782bd, 0x2003824a, 0x2017824b, 0x20078290, 0x2003824c, 0x20178251, 0x200782c4, 0x20038252, - 0x20178253, 0x20078292, 0x20038254, 0x2017825f, 0x200782ca, 0x20038260, 0x200b8261, 0x200782d8, 0x20038262, 0x200b8265, 0x200782dc, 0x20038266, - 0x200b8267, 0x20078249, 0x20038268, 0x200b827e, 0x200782e0, 0x2103857f, 0x07829400, 0x03858f20, 0x82950021, 0x82578307, 0x96002103, 0xa0200b82, - 0xa1200382, 0x97206b82, 0xc3830782, 0x0b82b020, 0x0b829920, 0x0385f020, 0x82aa0321, 0x85fa2007, 0x51022103, 0xfb200782, 0x02210385, 0x2007826c, - 0x200382fc, 0x206b82ff, 0x200382f7, 0x20038218, 0x20038219, 0x200382d6, 0x2003821a, 0x2003821b, 0x200382da, 0x21038537, 0x07829b00, 0x03855920, - 0x829c0021, 0x85bc2007, 0xab032103, 0xc6200782, 0xc7200382, 0x9d207782, 0xc9200782, 0x00210385, 0x21e7859f, 0xaf42dd02, 0x82f32006, 0x2403820f, - 0x0000a600, 0x21128203, 0x04820103, 0x0b82a720, 0x03850320, 0x82a90021, 0x85092007, 0x82002003, 0x0f0321b3, 0x03820b82, 0x82ab0021, 0x85232007, - 0xac002103, 0x84200782, 0x85200382, 0x2105eb42, 0x0b828603, 0x52200383, 0x87200782, 0x00210385, 0x200782af, 0x20038288, 0x2003828a, 0x20038253, - 0x2003868c, 0x20078256, 0x2003828e, 0x20038292, 0x20038257, 0x20038293, 0x20478294, 0x200782b0, 0x20038295, 0x20038297, 0x2003825c, 0x21038598, - 0x0782b200, 0x03829920, 0x03829a20, 0x03825f20, 0x03859b20, 0x82b30021, 0x21ff8207, 0x07829d03, 0x03826120, 0x03859e20, 0x82b40021, 0x869f2007, - 0x82632003, 0x85a02007, 0xb5002103, 0xa1200782, 0x64200386, 0xa3200782, 0x00210385, 0x200782b6, 0x200382a4, 0x200382a5, 0x20038265, 0x210385a6, - 0x0782b700, 0x0386a720, 0x07826720, 0x0382a820, 0xa782a920, 0x0782b820, 0x0382aa20, 0x0382b020, 0x03826820, 0x0382b120, 0x1782b920, 0x0782ba20, - 0x6f200387, 0xbb200b82, 0x00210385, 0x200782c3, 0x200382bc, 0x200382bd, 0x20038271, 0x210385be, 0x0782c400, 0x0386bf20, 0x07827020, 0x0382c020, - 0x2344c620, 0xc7032105, 0x03830b82, 0x07827320, 0x0382c820, 0x1782c920, 0x0782cc20, 0x0382ca20, 0x0382ce20, 0x03827420, 0x0382d120, 0x1782d220, - 0xd6200f83, 0x03820b82, 0x00d00024, 0x12820400, 0x03200383, 0x04219f82, 0x820f8201, 0x79032103, 0x02200782, 0x00200385, 0x04213782, 0x820b8203, - 0x7a032103, 0x2c820782, 0x03820420, 0x82d20021, 0x8205200b, 0x82082003, 0x827b204b, 0x82092007, 0x000b2403, 0x82d30000, 0x850c2007, 0x80032103, - 0x0d200782, 0x03200385, 0x0421f782, 0x820b820e, 0x81032103, 0x0f200782, 0x00200385, 0x042d8782, 0x04000010, 0x03000010, 0x04000082, 0x21038511, - 0x0782d700, 0x00001224, 0x17821304, 0x07828320, 0x03851420, 0x82d80021, 0x85152007, 0x85032103, 0x16200782, 0x18200382, 0x2105e744, 0x0b821904, - 0x03210382, 0x20078286, 0x2103851a, 0x07827f03, 0x03851b20, 0x82dc0021, 0x821c2007, 0x42222003, 0x04210573, 0x200b8223, 0x203b8224, 0x200782dd, - 0x21038525, 0x07828e03, 0x03822620, 0x17822f20, 0x0782df20, 0x03853020, 0x828f0321, 0x82312007, 0x82342003, 0x82e92017, 0x85352007, 0x90032103, - 0x36200782, 0x38200382, 0xed201782, 0x39200782, 0x03210385, 0x20078291, 0x2003823a, 0x0543453d, 0x823e0421, 0x2103820b, 0x07829203, 0x03853f20, - 0x82f40021, 0x82402007, 0x82412003, 0x8293208f, 0x85422007, 0xf5002103, 0x43200782, 0x03210385, 0x20078295, 0x21038544, 0x0782f600, 0x03854520, - 0x82960321, 0x82462007, 0x824f2003, 0x82f7205f, 0x85502007, 0xb2032103, 0x51200782, 0x03210385, 0x20078297, 0x21038552, 0x07820101, 0x03855320, - 0x82980321, 0x85542007, 0x02012103, 0x55200782, 0x58200382, 0x99208382, 0x59200782, 0x5b240382, 0x03010000, 0x5c200782, 0x03210385, 0x2007829d, - 0x2103855d, 0x0782b303, 0x03855e20, 0x829e0321, 0x825f2007, 0x82612003, 0x8206202f, 0x86622007, 0x825c2003, 0x82632007, 0x006f2403, 0x82090100, - 0x82702007, 0x82712003, 0x82b4205f, 0x82722007, 0x82752003, 0x82162017, 0x82762007, 0x82772003, 0x82b62017, 0x85782007, 0xb9032103, 0x79200782, - 0x03210385, 0x200782b8, 0x2003827a, 0x202f8286, 0x2007821a, 0x20038288, 0x200b8289, 0x20078227, 0x2003828a, 0x217b858b, 0x07828c04, 0xb7820383, - 0x828d0421, 0x8291200b, 0x82292023, 0x82922007, 0x85932003, 0x940421b7, 0x95200782, 0x2e201782, 0x96200782, 0x97200382, 0x56200382, 0x98200382, - 0xf7820382, 0x82ba0321, 0x829a2007, 0x829b2003, 0x82482003, 0x829c2003, 0x21f78203, 0x07823001, 0x03829e20, 0xeb869f20, 0x0782a020, 0x4782a120, - 0x07823220, 0x0382a220, 0x0382a320, 0x03824a20, 0x0382a420, 0x1782a920, 0x07823420, 0x0382aa20, 0xc743ab20, 0xac042105, 0xad200b82, 0x4c200382, - 0xae200382, 0xaf200382, 0xbe201782, 0xb0200782, 0xb1200382, 0x69200382, 0xb2200382, 0xb3200382, 0x4e200382, 0xb4200382, 0xb5200382, 0x3a204782, - 0xb6200782, 0xb7200382, 0x2105d741, 0x0782b804, 0x1782ba20, 0x07823c20, 0x0386bb20, 0x07825a20, 0x0382bc20, 0x1782bd20, 0x07823f20, 0x0382be20, - 0xcb41bf20, 0xc0042105, 0xc2200782, 0xc0206b82, 0xc3200782, 0xc4200382, 0x21050f47, 0x0b82c504, 0x0382c620, 0x03826720, 0x0382c720, 0x1782c820, - 0x07824320, 0x0382c920, 0xb741ca20, 0x82cb2006, 0x42cc2007, 0x04210537, 0x200782cd, 0x200382ce, 0x20038265, 0x200382cf, 0x835382d7, 0x82d8204f, - 0x2103820b, 0x07824501, 0x0385d920, 0x82cd0321, 0x85da2007, 0xcc032103, 0xdb200782, 0xdf200382, 0xce202f82, 0xe0200782, 0xe1200382, 0x46206b82, - 0xe2200782, 0xf5200382, 0xd3201782, 0xf6200782, 0xf7200382, 0x21058b42, 0x0782f804, 0x1782f920, 0x0782e720, 0x0382fa20, 0x2f82fb20, 0x07824820, - 0x0382fc20, 0x1782fd20, 0x0782e920, 0x0382fe20, 0x0382ff20, 0x00006b24, 0x03850005, 0x824a0121, 0x85012007, 0xeb032103, 0x02200782, 0x10200382, - 0x2105e347, 0x0b821105, 0x04210382, 0x2007826d, 0x20038212, 0x24478213, 0x1e0000ec, 0x82038200, 0xae032133, 0x3e200782, 0x3f200382, 0xac201782, - 0x80200782, 0x85200382, 0x21050f46, 0x0b82a01e, 0x0b82f120, 0x0782ee20, 0x0382f220, 0x0b82f320, 0x0782a520, 0x0382f420, 0x0000f928, 0x00004004, - 0x03854d1f, 0x00a90424, 0x53822000, 0x820b2021, 0x825b2077, 0x8210200b, 0x48112003, 0x2021051f, 0x200b8213, 0x200b8214, 0x20078269, 0x21038515, - 0x07826f04, 0x03821720, 0x01218882, 0x8207826b, 0x2220213c, 0x73202382, 0x25200b82, 0x27200382, 0x76200b82, 0x30200782, 0x01210385, 0x20078279, - 0x20038232, 0x05634633, 0x82392021, 0x823a200b, 0x827a2023, 0x853c2007, 0x83032003, 0x82442083, 0x2103820b, 0x07827c01, 0x03857420, 0x827d0121, - 0x857f2007, 0x7e012103, 0xa3200782, 0x04210385, 0x2007826e, 0x200385a4, 0x201f8301, 0x200b82a6, 0x245382aa, 0x20000080, 0x210385ab, 0x07824704, - 0x0385ac20, 0x82850121, 0x85b12007, 0x86012103, 0xb9200782, 0xba200382, 0x87202f82, 0xbc200782, 0xbd200382, 0x89240b82, 0x05210000, 0x01210385, - 0x8207828b, 0x822120fb, 0x8c012103, 0x16200b82, 0x01210385, 0x8207828d, 0x822120eb, 0x8e012103, 0x26200b82, 0x00200385, 0x21214f82, 0x820b822e, - 0x8f012103, 0x5b200782, 0x5e200382, 0x90245382, 0x02220000, 0x01210385, 0x20078294, 0x20038506, 0x218b8200, 0x0b820f22, 0x01210382, 0x20078295, - 0x24038211, 0x01000012, 0x20078296, 0x2103851a, 0x07829801, 0x03851e20, 0x82990121, 0x852b2007, 0x9a012103, 0x48200782, 0x01210385, 0x2007829b, - 0x21038560, 0x07829c01, 0x03826420, 0x47826520, 0x00009d24, 0x0385ca25, 0x009f0125, 0x8201ee00, 0x25878203, 0x0000a001, 0x0385c3f6, 0x00a20124, - 0x1782fb00, 0x0004fb29, 0x00a40100, 0x85fffe00, 0xaa012503, 0xfcff0000, 0xfd200382, 0x4b081782, 0x2c00b0ab, 0x5009b04b, 0x0101b158, 0x01b8598e, - 0x84b085ff, 0x0309b11d, 0xb02d5e5f, 0x20202c01, 0xb0446945, 0xb02d6001, 0x01b02c02, 0xb02d212a, 0x46202c03, 0x462503b0, 0x59235852, 0x8a208a20, - 0x208a6449, 0x61682046, 0x2504b064, 0x18820784, 0x598a6529, 0x00b0202f, 0x82695853, 0x58542605, 0x5940b021, 0x260a881b, 0x3a595965, 0x8304b02d, - 0x82318246, 0x598a212d, 0x6a204082, 0x07824086, 0x29081284, 0xb02dfd2f, 0x204b2c05, 0x502603b0, 0xb0585158, 0xb01b4480, 0x1b594440, 0x45202121, - 0x5850c0b0, 0x1b44c0b0, 0x2d595921, 0xa38806b0, 0x7d22ab82, 0xad851869, 0xb02c0727, 0xb02d2a06, 0x29418508, 0x40b05853, 0x5900b01b, 0x4f838a8a, - 0x23585329, 0x8a80b021, 0x828a1b8a, 0x845f82c1, 0x8dc0200f, 0x01b8220f, 0x20108f00, 0x27108b40, 0x452503b0, 0x508001b8, 0x06824a82, 0x1b212322, - 0x23231083, 0x82212321, 0x445929a1, 0x2c09b02d, 0x4558534b, 0x2120a282, 0x0a2aa282, 0x4529b02c, 0x2c0bb02d, 0x06822ab0, 0xb12c0c3f, 0x20880127, - 0xb958538a, 0x00040040, 0x0008b863, 0xb9585488, 0xe8032900, 0xb01b5970, 0x24ac8223, 0x10b88820, 0x83138800, 0x2c0d34e5, 0xb88840b0, 0x585a0020, - 0x44002ab1, 0x2a00b91b, 0x8244e803, 0x2b0c2e5a, 0x002b00b0, 0x020d01b2, 0x0eb2012b, 0x31058201, 0x303a0eb7, 0x00101b25, 0xb7002b08, 0x242e3801, - 0x0a82111a, 0x4e02b726, 0x15233240, 0x03250983, 0x212e3b48, 0x20098314, 0x25138804, 0x1f283005, 0x13830e16, 0x51630625, 0x831b2d3f, 0x40072209, - 0x253b8634, 0x3a4a5b08, 0x13831929, 0x64830925, 0x83233a4e, 0x770a2509, 0x21364c62, 0x0b230983, 0x855c7791, 0x760c2513, 0x1d364b60, 0x0d251383, - 0x141c242c, 0x2409820c, 0x0d0fb200, 0x31a28207, 0x697d4520, 0xb0b24418, 0xb2730113, 0x74011350, 0x048380b2, 0x01137026, 0x1f0fb275, 0x6f2b1382, - 0x0075011f, 0x00cc002a, 0x829e0091, 0xec460803, 0xb2007200, 0x56007d00, 0x4e005f00, 0x04016000, 0x0000c400, 0x60fe1400, 0x9b021400, 0x39ff1000, - 0x97fe0d00, 0x21031200, 0x3a040b00, 0x8d041400, 0xb0051000, 0x18061400, 0xc0061500, 0x5b021000, 0x04071200, 0x33820500, 0x60210285, 0x0a018700, - 0xc4009aaa, 0xbf014001, 0xf4025802, 0x3a030e03, 0x9c036903, 0xe303c103, 0x2004f903, 0x8b043704, 0x0a05b904, 0xc1057d05, 0x8f062706, 0x3a07bc06, - 0xb007a407, 0xdb07bc07, 0x21080208, 0x33098708, 0xdd097309, 0x790a300a, 0xef0ab90a, 0x8b0b4e0b, 0xd90ba60b, 0x440c200c, 0xd90c9d0c, 0x7e0d330d, - 0x370ede0d, 0xcf0ea50e, 0x3e0f0d0f, 0xd80f8d0f, 0x41100910, 0x7c106510, 0xc810a110, 0x0411e310, 0xe3118311, 0x94123712, 0x51130813, 0x0b14cb13, - 0x90144514, 0xf214d714, 0xa6155d15, 0x5816f415, 0xf516b816, 0xae176317, 0x2418f417, 0xbb187218, 0x3419fc18, 0x8e197719, 0x131acf19, 0xb21a501a, - 0x761b151b, 0xf81bd91b, 0xc41c931c, 0xe31d651d, 0x0c1eef1d, 0xd21ebc1e, 0x541f111f, 0x1920a71f, 0x8a203920, 0xd620b620, 0x39210b21, 0x8f218321, - 0xc321a921, 0x4622dd21, 0xe822aa22, 0xb4236323, 0xde242024, 0xab255625, 0x7c261d26, 0xf526da26, 0x8a274127, 0x1e28c727, 0xfd287928, 0xc9299929, - 0x922a2c2a, 0x632bff2a, 0x112cb72b, 0xa52c422c, 0x042ddc2c, 0x3b2d0c2d, 0x962d5e2d, 0x052ec22d, 0x7e2e3a2e, 0xbe2e9e2e, 0xf52ec72e, 0x432f272f, - 0xa12f5c2f, 0xcf2fa92f, 0x7530fc2f, 0xe330a330, 0x4d311131, 0x1c32c231, 0xf8328532, 0x9b336833, 0x8d340f34, 0x3035e734, 0xd035a335, 0x98362836, - 0x4237e936, 0xf5379f37, 0x78383938, 0x3639e438, 0x0e3a9639, 0xd33a5e3a, 0xa33b343b, 0x8c3c183c, 0x193ddd3c, 0xcd3d713d, 0xb83e393e, 0x3a3ff13e, - 0xec3f803f, 0x63402240, 0xe940a040, 0xa6414241, 0x6842f241, 0x4143e742, 0x1344a943, 0x8e443944, 0x7945fb44, 0x0346b245, 0x94464a46, 0x1847ea46, - 0xce474447, 0x46480448, 0xc7488348, 0x7d491b49, 0x384ac749, 0x094bb04a, 0xef4b814b, 0xd34c634c, 0x734d374d, 0x314ed24d, 0x1d4f984e, 0xeb4f9e4f, - 0xa5503950, 0x84511251, 0x7e52f551, 0xa4530653, 0xa5543754, 0x53550f55, 0x04569955, 0x2b576b56, 0x5c58e357, 0x3059db58, 0xb8598359, 0x075ad459, - 0x335a1d5a, 0x725b045b, 0x315cda5b, 0xcc5ca05c, 0x4a5df55c, 0xeb5d955d, 0x8d5e3d5e, 0x415fe25e, 0xed5f8f5f, 0xd2604360, 0xa2615c61, 0x3762e561, - 0xc9628662, 0xb7633863, 0x6c641764, 0x2565ca64, 0xee658c65, 0x57664866, 0xb6666766, 0xa5671e67, 0x80681768, 0x4a69e668, 0x1f6ab569, 0xf06a836a, - 0x9d6b4b6b, 0x406cef6b, 0xe16cb66c, 0xb8090198, 0x6cf16ce9, 0x6d056dfb, 0x6d436d20, 0x6d856d65, 0x6db06da4, 0x6eee6dbc, 0x6e8d6e2c, 0x6ebd6eb1, - 0x6fe66ecd, 0x6fd06fb4, 0x70ff6fec, 0x705a7013, 0x727e71dc, 0x7216720a, 0x734b73e6, 0x747e74c9, 0x755e75e4, 0x762476b6, 0x772277c1, 0x781678b8, - 0x78927878, 0x78c678ac, 0x794b79e0, 0x79a97971, 0x7af379bf, 0x7bc77a85, 0x7b857b46, 0x7ba37b94, 0x7cef7bdc, 0x7c317c18, 0x7ca07c3d, 0x7e8e7df5, - 0x7f8f7e18, 0x80487f48, 0x816181f8, 0x820b828e, 0x8252823c, 0x831b83c1, 0x84d98368, 0x8475842f, 0x850a85bc, 0x856b852d, 0x864486ef, 0x87cc868c, - 0x87608702, 0x88d587ba, 0x88438800, 0x88b98867, 0x894689f2, 0x8aea898f, 0x8aab8a42, 0x8b0e8bd5, 0x8b898b3f, 0x8c038cd2, 0x8c838c3b, 0x8dfe8cac, - 0x8eb38d71, 0x8e6e8e12, 0x8f1f8f9b, 0x8f958f7f, 0x909690e8, 0x916291ff, 0x92f191ab, 0x92749233, 0x935393ea, 0x94f393c9, 0x949b9428, 0x951895ce, - 0x958d954a, 0x964c96fb, 0x970c97af, 0x98f89785, 0x99d89888, 0x996c9917, 0x9a3d9ac2, 0x9bf79abb, 0x9b989b4f, 0x9c149cdb, 0x9c8d9c55, 0x9d219dcb, - 0x9d799d2d, 0x9e7e9eef, 0x9f139fd1, 0xa0f99f94, 0xa1c1a05f, 0xa15ca150, 0xa2f9a1ad, 0xa288a247, 0xa35ca3f7, 0xa430a4ba, 0xa547a5c2, 0xa653a6de, - 0xa705a7b2, 0xa76da765, 0xa81ea8b9, 0xa9f2a881, 0xaac0a96d, 0xaa6daa22, 0xab2aabc9, 0xababab54, 0xac2eacd7, 0xac8aac76, 0xacb0ac9e, 0xacd6acc4, - 0xad01aded, 0xae85ad5f, 0xae66ae02, 0xaec0aeb8, 0xaed0aec8, 0xafe3aedb, 0x0d018249, 0xc1af515d, 0x92b031b0, 0x37b1d4b0, 0x65b14eb1, 0x8eb17cb1, - 0xb9b1a6b1, 0xd1b1c5b1, 0xffb1e8b1, 0x2eb216b2, 0x5cb245b2, 0x8bb273b2, 0xb4b29db2, 0xe2b2cbb2, 0x11b3f9b2, 0x3ab328b3, 0x69b351b3, 0x97b380b3, - 0xbfb3a9b3, 0xecb3d5b3, 0x10b404b4, 0x33b41cb4, 0x5bb445b4, 0x88b472b4, 0xb5b49eb4, 0xdeb4cdb4, 0x07b5f5b4, 0x2eb51db5, 0x5db546b5, 0x85b56fb5, - 0xaeb59cb5, 0xdcb5c5b5, 0x04b6edb5, 0x85b61bb6, 0x39b727b7, 0x62b74bb7, 0x8fb778b7, 0xb8b7a6b7, 0xdbb7c9b7, 0x02b8ebb7, 0x2ab813b8, 0x57b840b8, - 0xdbb86eb8, 0x89b972b9, 0xb1b99ab9, 0xdeb9c7b9, 0x0bbaf4b9, 0x2eba22ba, 0x57ba40ba, 0x80ba69ba, 0xa9ba92ba, 0xd7bac0ba, 0xf9baeeba, 0x1bbb04bb, - 0x33bb27bb, 0x61bb4abb, 0x79bb6dbb, 0xa7bb90bb, 0xbfbbb3bb, 0xe9bbd4bb, 0x01bcf5bb, 0x2abc18bc, 0x42bc36bc, 0x6abc59bc, 0x96bc7fbc, 0xbebca7bc, - 0xedbcd5bc, 0x17bd05bd, 0x35bd29bd, 0x53bd41bd, 0x76bd64bd, 0x9fbd88bd, 0xc1bdb5bd, 0xd9bdcdbd, 0xf7bde5bd, 0x14be08be, 0x2cbe20be, 0x4fbe38be, - 0x72be5bbe, 0x9abe88be, 0xc7beb0be, 0xf1bedebe, 0x1cbf04bf, 0x8dbf2fbf, 0x06c0efbf, 0x34c01dc0, 0x62c04ac0, 0x90c079c0, 0xbec0a7c0, 0xe1c0d0c0, - 0x0ac1f8c0, 0x38c121c1, 0x98c168c1, 0xbfc1a8c1, 0xecc1d6c1, 0x15c2fdc1, 0x39c22dc2, 0x5cc245c2, 0x89c273c2, 0xb7c2a0c2, 0xe4c2cdc2, 0x0ec3fcc2, - 0x37c325c3, 0x5ec34dc3, 0x8dc376c3, 0xbac3a4c3, 0xe9c3d2c3, 0x16c4ffc3, 0x8fc47dc4, 0xbcc4a5c4, 0xdec4cdc4, 0x0ac5f4c4, 0x8ec521c5, 0xbac5a4c5, - 0xe8c5d1c5, 0x0ac6f4c5, 0x33c61cc6, 0x55c64ac6, 0x82c66bc6, 0xa4c68ec6, 0xc5c6b0c6, 0xe8c6d1c6, 0x0bc7f4c6, 0x33c71cc7, 0x58c746c7, 0x75c764c7, - 0x9dc787c7, 0xbac7a9c7, 0xdcc7c6c7, 0xfec7e8c7, 0x26c80fc8, 0x4cc839c8, 0xc4c8adc8, 0xf1c8dac8, 0x1fc908c9, 0x40c935c9, 0x58c94cc9, 0x70c964c9, - 0x88c97cc9, 0xabc9a3c9, 0xbbc9b3c9, 0xcbc9c3c9, 0xdbc9d3c9, 0xebc9e3c9, 0xfbc9f3c9, 0x0bca03ca, 0x2bca13ca, 0x55ca43ca, 0x79ca67ca, 0xa4ca8aca, - 0xb4caacca, 0xc4cabcca, 0xe4caccca, 0x0dcbfbca, 0x31cb1fcb, 0x60cb49cb, 0xd6cbcecb, 0xf6cbeecb, 0x15ccfecb, 0x34cc2ccc, 0x44cc3ccc, 0x63cc4ccc, - 0x73cc6bcc, 0x83cc7bcc, 0x93cc8bcc, 0xa3cc9bcc, 0xb3ccabcc, 0xd2cccacc, 0x2ecddacc, 0x3ecd36cd, 0x6ccd55cd, 0x7ccd74cd, 0x9ccd94cd, 0xc9cdb3cd, - 0xf7cde0cd, 0x25ce0ece, 0x4bce38ce, 0x73ce62ce, 0xa6ce87ce, 0xc4ceb2ce, 0xe3ceccce, 0x01cff5ce, 0x24cf0dcf, 0x52cf3bcf, 0x71cf69cf, 0x91cf79cf, - 0xb5cfa9cf, 0xcdcfc1cf, 0xe5cfd9cf, 0xf9cff1cf, 0x09d001d0, 0x37d020d0, 0x56d03fd0, 0x85d06dd0, 0xa4d09cd0, 0xc3d0acd0, 0xf1d0d9d0, 0x10d1f9d0, - 0x40d128d1, 0x6fd158d1, 0x9cd186d1, 0xccd1b4d1, 0xfcd1e4d1, 0x0cd204d2, 0x3bd224d2, 0x6ad253d2, 0x8dd27cd2, 0xbcd2a5d2, 0xecd2d4d2, 0x1bd304d3, - 0x53d337d3, 0x6bd35fd3, 0x7fd373d3, 0x97d38bd3, 0xb5d3a3d3, 0xe0d3c7d3, 0x0bd4f2d3, 0x30d41dd4, 0x55d442d4, 0x77d467d4, 0x99d486d4, 0xbed4abd4, - 0xe3d4d0d4, 0x08d5f5d4, 0x2ad51ad5, 0x46d53ad5, 0x64d552d5, 0x88d576d5, 0xb2d599d5, 0xddd5c4d5, 0x02d6efd5, 0x27d614d6, 0x49d639d6, 0x6ad658d6, - 0x88d67cd6, 0xa0d694d6, 0xbed6acd6, 0xe3d6d0d6, 0x08d7f5d6, 0x2dd71ad7, 0x52d73fd7, 0x74d764d7, 0x8fd783d7, 0xadd7a1d7, 0xcbd7bfd7, 0xe9d7ddd7, - 0x06d8fad7, 0x1ed812d8, 0x3cd82ad8, 0x60d84ed8, 0x84d872d8, 0xa8d896d8, 0xccd8bad8, 0xe9d8ddd8, 0x01d9f5d8, 0x1fd90dd9, 0x43d931d9, 0xced954d9, - 0xf4d9e8d9, 0x0cda00da, 0x24da18da, 0x3cda30da, 0x54da48da, 0x6cda60da, 0x84da78da, 0x9cda90da, 0xb4daa8da, 0xc8dac0da, 0x92db2ddb, 0x0fdcd0db, - 0xccdc6ddc, 0x02dde7dc, 0x1add0edd, 0x32dd26dd, 0x4add3edd, 0xe4dd95dd, 0x96de3ede, 0xaade9ede, 0xbcdeb4de, 0xccdec4de, 0xdcded4de, 0xf6dee4de, - 0x1fdf08df, 0x4edf36df, 0x7edf66df, 0xaedf96df, 0xdedfc6df, 0x0ee0f6df, 0x3ee026e0, 0x62e056e0, 0x7ae06ee0, 0x92e086e0, 0xaae09ee0, 0xc2e0b6e0, - 0xe6e0d4e0, 0xfee0f2e0, 0x16e10ae1, 0x2ee122e1, 0x46e13ae1, 0x6ae158e1, 0x82e176e1, 0x9ae18ee1, 0xb2e1a6e1, 0xd5e1c4e1, 0xede1e1e1, 0x05e2f9e1, - 0x1de211e2, 0x35e229e2, 0x4de241e2, 0x65e259e2, 0x7de271e2, 0x8de285e2, 0x9de295e2, 0xade2a5e2, 0xbde2b5e2, 0xcde2c5e2, 0xdde2d5e2, 0xfde2e5e2, - 0x2be314e3, 0x45e33de3, 0x65e34de3, 0x7fe36de3, 0x9de395e3, 0xade3a5e3, 0xcce3b5e3, 0xdce3d4e3, 0xece3e4e3, 0xfce3f4e3, 0x0ce404e4, 0x0ae599e4, - 0x73e56be5, 0x91e57fe5, 0xaae5a2e5, 0xc2e5b6e5, 0xdae5cee5, 0x0000e6e5, 0x64000500, 0x28030000, 0x0300b005, 0x09000600, 0x0f000c00, 0x0cb26f00, - 0x12111110, 0x100cb039, 0x83d000b0, 0x84062005, 0x84092005, 0xd00d2f05, 0x4500b000, 0x2f02b058, 0x1f02b11b, 0x0c84593e, 0x0c820020, 0x3e0f0027, - 0x0204b259, 0x21398200, 0x068505b2, 0x06850720, 0x06840820, 0xdc0ab024, 0x09840cb2, 0x840db221, 0xb04a0806, 0x0eb01002, 0x213130dc, 0x03211121, - 0x11010111, 0x01210301, 0x03210135, 0x023cfd28, 0xeefe36c4, 0x0c01bafe, 0xfe0302e4, 0xfd0201fe, 0xfab005fd, 0xfd0705a4, 0xfb77027d, 0xfd780211, - 0x885e025e, 0x02005e02, 0xf2ff8f00, 0xbf84a301, 0x3b000d26, 0x0f0e06b2, 0xb0247f82, 0x01b01006, 0x0c20a793, 0x0c20a782, 0x0629a783, 0x582b0a0d, - 0xf41bd821, 0x08288259, 0x2f01b02d, 0x23013130, 0x34012103, 0x15163236, 0x26220614, 0x17d17e01, 0xf9fe0001, 0x484a804a, 0xad014884, 0xc3fa0304, - 0x394b4b39, 0x824a4a37, 0x03652c73, 0x064002f4, 0x00040000, 0x41250009, 0x0320050e, 0x03385982, 0xb0593e21, 0x02b0d002, 0xd007b02f, 0xb02f07b0, - 0x08b01003, 0x2f08b0d0, 0x03245d82, 0x05331123, 0x01260483, 0xae8b2313, 0x04822d01, 0xfe770526, 0x890c027d, 0x53820483, 0x4e826020, 0xc782bc20, - 0x1f001b24, 0x53858d00, 0x6241ad84, 0x82102007, 0x87102060, 0x8202200c, 0x8202200c, 0x00b025c7, 0x1ab05845, 0x1a200c82, 0xb2230c82, 0x83020c1d, - 0x2f1d24fc, 0x880300b2, 0xd00426de, 0xb0101db0, 0x26058406, 0x0bb0d00b, 0x8908b22f, 0x100b231c, 0x13820eb0, 0x12b01028, 0x1008b0d0, 0x258414b0, - 0xb0d01626, 0x18b01000, 0x1e211184, 0x26bb82d0, 0x13230323, 0x84213523, 0x03332303, 0x03821333, 0x03231523, 0x82038233, 0x23133205, 0x4ce0cf02, - 0x01e74ca8, 0x01f33a05, 0x4ea74e11, 0x380382e1, 0xdd3aeed0, 0x76a74cfb, 0x01e03ae0, 0x0166fe9a, 0x39019e9a, 0xfea0019f, 0x3b038360, 0x9ec7fe9f, - 0x380266fe, 0x01003901, 0x2dff6400, 0x9b062604, 0x7d002c00, 0x2e2d2ab2, 0xfc92c082, 0xe2820920, 0xfc870920, 0x0c822320, 0xfc872320, 0x0c822020, - 0x0c822020, 0x0c19b223, 0x253b8220, 0xb21019b0, 0xfc870102, 0x090fb223, 0x05c84223, 0x8913b221, 0x23272214, 0x23148309, 0x2ab21023, 0xe5821488, - 0x26348b08, 0x35262726, 0x35373634, 0x16161533, 0x26342315, 0x15062223, 0x1e041614, 0x06141502, 0x35231507, 0x33352626, 0x32331614, 0x6c330336, - 0xcae946fc, 0xbeaea0ad, 0x606171f2, 0x00016b6c, 0xcf366492, 0xd5c69fb9, 0x72747ff3, 0x557c0177, 0x7d26596f, 0x14d6a6f5, 0xf519dcda, 0x68917ec4, - 0x5e695761, 0x5a866750, 0xc313d2a9, 0xc6f016c2, 0x006e8a7e, 0x63000500, 0x8905ecff, 0x0d00c505, 0x27001a00, 0x39003500, 0x05b28900, 0x9f833b3a, - 0xb0100525, 0x82b0d013, 0x841b2005, 0x84282005, 0xd0362e05, 0x2f36b000, 0xb02f38b0, 0xb0584500, 0x20fc8203, 0x07164103, 0x0c822520, 0x3e0f252f, - 0x1003b059, 0xb0d00ab0, 0x11b22f0a, 0x08054202, 0xb2100323, 0x2c0d8918, 0x1eb01025, 0x2f1eb0d0, 0xb21025b0, 0x2316892b, 0x32b2101e, 0x30280d88, - 0x36341331, 0x15163233, 0x2324fc82, 0x17352622, 0x3527f984, 0x22263435, 0x88011506, 0x8b20201a, 0x82232019, 0x057b081a, 0x63170127, 0xa98c8aaa, - 0xaf878aa9, 0x3e3f4daa, 0x4b7e4d4c, 0x87ae1202, 0xfea7ad88, 0x4faaabe8, 0x4e49403e, 0xfe4d3e3d, 0xc7027d02, 0x8498047d, 0x4889a9a9, 0x8ca5a883, - 0x55554506, 0x56454949, 0xd0fc4757, 0x8da6a686, 0xa7a98247, 0x57440589, 0x464b4b53, 0xf44a5454, 0x48720448, 0x56000300, 0x1105ecff, 0x1c00c405, - 0x31002500, 0x2eb29800, 0x12113332, 0x102eb039, 0x83d010b0, 0x431e2005, 0x324206f7, 0x2f1b240c, 0x421bb11b, 0x18200732, 0x18200c82, 0xb2230c82, - 0x82091b20, 0x28b2233a, 0x06831b09, 0x28200322, 0x10220683, 0x06832028, 0x1b851320, 0x18131122, 0x19220d83, 0x06831318, 0x19111622, 0xb0240682, - 0x1db2101b, 0x23083942, 0x111d1fb2, 0x09231483, 0x882fb210, 0x31302814, 0x37363413, 0x41352626, 0x8e080527, 0x07070614, 0x33353601, 0x21170710, - 0x24200627, 0x01373205, 0x14150607, 0x17140316, 0x35363737, 0x22232634, 0xa26e5606, 0xb0d04355, 0x695ccb9f, 0x3d190163, 0xfed67ed3, 0xfe9c52e6, - 0x01fdfe50, 0xfe6b7be2, 0x82781fc2, 0x1f6f6719, 0x4742563e, 0x65890154, 0x966b74a9, 0xbbc7ab46, 0x4c995b8a, 0x78b4fe48, 0xacf3fe93, 0xe57561fd, - 0x77015223, 0x65755b16, 0x54aa037e, 0x37194c7f, 0x60513956, 0x00010000, 0x01fc0352, 0x0000060b, 0x44160004, 0x230813b1, 0x03013130, 0x01331123, - 0xb99f1a0b, 0x79fe8305, 0x01000402, 0x31fe8000, 0x5f06a202, 0x10001000, 0x121107b2, 0x0026e682, 0xb02f04b0, 0xdf832f0d, 0x12123708, 0x02061737, - 0x12100703, 0x02260717, 0xf07c8002, 0xaf8d3086, 0x9aab0108, 0x7bf18630, 0x01e75002, 0x4247019f, 0x49fe6b8e, 0xfe56e5fe, 0x7c25fed1, 0x49014287, - 0x57829d01, 0x57822820, 0x57825120, 0x57831220, 0x87141321, 0x820e2057, 0x013f0857, 0x07020214, 0x11123627, 0x27021035, 0x12163727, 0x51021712, - 0x3087f87a, 0x8e98af96, 0xf080301f, 0x40020880, 0xfe63fede, 0x748741ad, 0x3201dd01, 0x01160117, 0x881c8ac9, 0xfec4fe3e, 0x8200d079, 0x021b2a5d, - 0x0574034d, 0x000e00b0, 0x31e98520, 0xb11b2f04, 0x593e1f04, 0x19d000b0, 0x182f00b0, 0x078209b0, 0x182f0922, 0x3508f382, 0x03053725, 0x17250333, - 0x03071305, 0x4c012703, 0x0137cffe, 0x0fb30f2e, 0xfe362901, 0xb491c8ca, 0xcc0392b2, 0x0175a958, 0x73a2fe58, 0xf6fe58ac, 0xfe20016a, 0x658366e9, - 0x9200442e, 0xb6042a04, 0x1a000b00, 0x2f09b000, 0xb0245b82, 0x06b21009, 0x22080242, 0x82d003b0, 0x2120085f, 0x23112115, 0x21352111, 0xae023311, - 0x84fe7c01, 0x0182feec, 0x2103ec7e, 0x014ffede, 0x9501deb1, 0x1c37af82, 0x5d01b8fe, 0x0900eb00, 0x09b21800, 0x12110b0a, 0x0ab00039, 0x4605b22f, - 0x303e08a2, 0x36271331, 0x33353736, 0x9f060607, 0x012b3a83, 0x690101db, 0x5b4eb8fe, 0xafbd4687, 0x8d83d56a, 0x09024730, 0xcd025402, 0x11000300, - 0x2f02b000, 0x878801b2, 0x352a8483, 0xfd540221, 0x020d02f3, 0x6f82c409, 0xf5ff872e, 0x0001a201, 0x22000a00, 0x0c0b00b2, 0x29087145, 0xb11b2f06, - 0x593e0f06, 0x798a00b2, 0x16320122, 0x33050044, 0x14013634, 0x444a4a44, 0x014a4c41, 0x393a4d00, 0x4d744a4b, 0x02267983, 0xfe0283ff, 0x7982b005, - 0xb0001323, 0x05974400, 0x1b480220, 0x30220806, 0x01231731, 0x02bfc133, 0x067dbf3d, 0x0200002d, 0xecff6900, 0xc4052204, 0x1b000d00, 0x03b24600, - 0x7d821d1c, 0x1003b024, 0xb54311b0, 0x820a2006, 0x1f0a2139, 0x20065548, 0x200c8203, 0x24908203, 0xb2100ab0, 0x82d08811, 0x18b2212e, 0x52080d88, - 0x10013130, 0x02222302, 0x12103503, 0x13123233, 0x23263427, 0x11070622, 0x32331614, 0x22043736, 0xefecf0eb, 0xeff1eb03, 0x70f303eb, 0x0370777a, - 0x70757a72, 0xfe650203, 0x01c1fec6, 0xfc310137, 0x3a013a01, 0xcffecefe, 0xb5bfcd14, 0xccb6fec0, 0x83c5b9c8, 0x00a82ad5, 0x05ff0200, 0x000600b5, - 0x05434239, 0x8b820520, 0xee480520, 0x05002111, 0x0423c083, 0x8803b22f, 0x02b22291, 0x35148303, 0x23213130, 0x25350511, 0xf2ff0233, 0x38029bfe, - 0x7a91041f, 0x5b83d1cd, 0x0000512e, 0xc4054004, 0x4e001900, 0x1b1a11b2, 0x20087f41, 0x20628211, 0x22629011, 0x82001103, 0x11b02421, 0x8909b210, - 0x85162062, 0x10002114, 0x240c0941, 0x01352121, 0x064d4436, 0x23154108, 0x33363634, 0x14151632, 0x21010706, 0x2dfc4004, 0x5969e501, 0x82766375, - 0x93e179f3, 0x8c7bf5d4, 0xa4029cfe, 0x751102a7, 0x80684f9d, 0xd5857d90, 0x6dbcd576, 0x83fe98ef, 0x4f000100, 0x1504ecff, 0x2926a182, 0x07b26e00, - 0xa1882b2a, 0xa1820f20, 0xa1870f20, 0x22075345, 0x830f01b2, 0x01b02ec3, 0x011fb22f, 0x9fb27101, 0xb25d0101, 0x2409823f, 0xb2100fb0, 0x09b64107, - 0xb2100123, 0x230d8828, 0x012815b2, 0x20064a45, 0x23148822, 0x33013130, 0x1620bf93, 0x0423c582, 0x47242223, 0x5408067d, 0x23263435, 0x94860123, - 0x706d8370, 0x77f37e62, 0xf9da84d5, 0x7d78637d, 0xd2dbf3fe, 0x81f3f4fe, 0x8882716d, 0x47038f86, 0x686c7201, 0x705b7173, 0xc3db67b8, 0x292cad62, - 0xe8c47ab0, 0x7860bae0, 0x7c737278, 0x00020000, 0x04000034, 0x00b00558, 0x000e000a, 0x05e54149, 0x200c3446, 0x27ed8204, 0x593e0f04, 0x040901b2, - 0xe082ab83, 0x2c095a48, 0xb0d006b0, 0x0bb01001, 0x0608b2d0, 0x211d820b, 0x24840db2, 0x3408c283, 0x23112315, 0x01272111, 0x11210133, 0xb5a30307, - 0x8bfdf3b5, 0xfb740207, 0x7d0190fd, 0xc3070212, 0x4401bcfe, 0xfcd80394, 0x20600257, 0x00010000, 0x04ecff81, 0x2687823a, 0xb26a001d, 0x411f1e1a, - 0x0120086d, 0x01207f82, 0x20076d41, 0x200c820d, 0x828c820d, 0x0b6b4274, 0x0d010722, 0xb0242f82, 0x1ab22f07, 0x23084641, 0x1a0705b2, 0x0d231483, - 0x8914b210, 0x14112114, 0xb2231483, 0x82141a1d, 0x3130371b, 0x15211313, 0x33360321, 0x14151232, 0x24222300, 0x16163327, 0x3c423233, 0x073a0806, - 0x0e034fae, 0x6528bcfd, 0xffe7d07f, 0xfec8df00, 0x0eeb0bf9, 0x7d70647c, 0x5c42798a, 0x02d20236, 0xa4fed2de, 0xe1f6fe3a, 0xe3f9fede, 0xa0716aba, - 0x239b858a, 0x02000033, 0xcb827500, 0xb705372c, 0x1f001400, 0x15b26200, 0x6c822120, 0x1015b023, 0x07354cb0, 0xc6820020, 0xd3900020, 0x44100021, - 0xb2220ab0, 0xd3870007, 0x83070521, 0x15b22109, 0xb024c588, 0x1bb2100d, 0x30270d88, 0x23150131, 0x88070606, 0x005c08c5, 0x00103511, 0x06220321, - 0x16141507, 0x26103632, 0xcc1e6103, 0xb67517f4, 0xfbfedfc1, 0xf1fedad4, 0x5e017501, 0x1f8550ec, 0x807ed888, 0x03c9b705, 0xfe7bc8da, 0xfeded7f0, - 0x014201ed, 0x7f015305, 0x49fdb201, 0xa24a4b5a, 0x0801a2bf, 0x010000a6, 0x00004500, 0xb0053604, 0x32000600, 0x20120744, 0x26cd8201, 0x593e0f01, - 0x411005b0, 0x00200b94, 0x3d060044, 0x01230101, 0x04213521, 0xffbafd36, 0x0ffd4502, 0x2905f103, 0xed04d7fa, 0x030000c3, 0x09456800, 0x00172a06, - 0x002b0021, 0x2c09b274, 0x0546482d, 0xd01ab027, 0xb01009b0, 0x06114524, 0x63821520, 0x31411520, 0x82092007, 0x8209200c, 0x29b22370, 0x2d831509, - 0xb22f2926, 0x7101291f, 0x220bfc41, 0x82291a03, 0x0fb22319, 0x4e851a29, 0x411fb221, 0xb024082f, 0x25b21015, 0x30250d88, 0x06140131, 0x085b4307, - 0x290aaf48, 0x22263403, 0x16141506, 0x09893632, 0x02045508, 0x7b725f6e, 0xd9d8fcfe, 0x707cfbfe, 0xccf06d5e, 0x81d3f0cd, 0xdc7d7fd4, 0xba6e1f7b, - 0x6dba6d6c, 0xa76b3004, 0x74b83530, 0xbfe2e1c0, 0x3032ba75, 0xdaba6ba7, 0x6caffcda, 0x6b6d8485, 0xfd027c80, 0x65757b5f, 0x00767664, 0x5d000200, - 0x1204faff, 0x1500c405, 0x6424fb82, 0x232209b2, 0xb021aa85, 0x13bb4916, 0xf3821120, 0xf3831120, 0x09111622, 0x7c242782, 0x182f16b0, 0x210be34b, - 0x16830200, 0x1011b024, 0xdb8812b2, 0x4909b021, 0xe9820ba2, 0x22230639, 0x36343502, 0x00323336, 0x00101511, 0x33352305, 0x32033636, 0x86353736, - 0x035508eb, 0xc0a37a1e, 0x8dd674e4, 0xfe0201dc, 0x1d9ffe9c, 0xdce6d723, 0x84238049, 0x027e7dd2, 0x0d018161, 0x82ea90db, 0xedfeb8fe, 0xfe76fe44, - 0x03c90362, 0x540f01c9, 0xc4a15f4a, 0xa88984ad, 0x00ffff00, 0x01f5ff82, 0x0051049d, 0xfb120026, 0x00070000, 0x03fbff12, 0x24178251, 0x01b8fe2e, - 0x20178288, 0x32118227, 0x005103e6, 0x12100006, 0x00010000, 0x03a4003f, 0x824e0484, 0xb217240f, 0x43080700, 0x052008f5, 0x0523ee82, 0x82593e1b, - 0x052308b4, 0x01350115, 0x02360115, 0x03bbfc4e, 0xe0770245, 0xc17501f3, 0x00f37401, 0x01910002, 0x03ef0364, 0x820300d6, 0x00252c69, 0xb02f07b0, - 0x03b0d003, 0x4100b22f, 0x07230902, 0x4804b210, 0x11290e05, 0x03213521, 0x03a2fcef, 0x2503835e, 0xfdca0c03, 0x8b83c98e, 0xa5008024, 0x8b92e003, - 0x8b820220, 0x8b850220, 0x89832520, 0xea023532, 0x600396fd, 0x7c02a0fc, 0x8cfeefe3, 0xef8cfec1, 0x3c308b82, 0x9803f4ff, 0x1800c405, 0x5e002300, - 0x252409b2, 0x2006cd41, 0x06cd411c, 0x200cb94e, 0x25528222, 0x593e0f22, 0x64481cb2, 0x00b02908, 0x2f00b0d0, 0x100004b2, 0x10203883, 0x220ce846, - 0x8200100c, 0x15b22114, 0x30251b84, 0x36340131, 0x072f4b36, 0x46231521, 0x072406e0, 0x03070607, 0x0807684b, 0x01262236, 0x1ac3425e, 0x565a5d28, - 0xed02f369, 0x98e1c9c3, 0xf402427b, 0x4a403f4a, 0x01478448, 0xbd9e85ac, 0x5e473d28, 0xb1536163, 0xa3b7ccce, 0x904b799e, 0x493bc9fe, 0x3007d94f, - 0x063bfe5b, 0x009005d9, 0x00420036, 0x433bb27c, 0x247d8244, 0xb0103bb0, 0x23cb8223, 0x33b02f2a, 0x4c0a774d, 0x0820074e, 0x0820d182, 0xb2230c82, - 0x82083305, 0x0fb2212d, 0xb0270684, 0x08b02f0f, 0x4d3ab210, 0xb027084f, 0x33b0d015, 0x891bb210, 0x102a2310, 0x0d8923b2, 0xb2100f23, 0x820d8840, - 0x062108e9, 0x27222302, 0x22230606, 0x12363726, 0x16323336, 0x33060317, 0x12373632, 0x04222100, 0x12060702, 0x200d8304, 0x2d218317, 0x13262724, - 0x33241212, 0x01120432, 0x16831606, 0x26139d08, 0x06062223, 0xbede0ccd, 0x87333db5, 0x1297924a, 0x6ec37f10, 0x34578154, 0x83668513, 0xc1fe1106, - 0xfec4c0fe, 0x0c09b2d1, 0xcf1f018b, 0x2640b754, 0xfe69cf3d, 0x5e5b94fe, 0x01de0c0b, 0x01f9f681, 0x03fcb267, 0x36514a0d, 0x322d1e60, 0x028c6f2f, - 0xdffefa06, 0xf04c4c9a, 0x0601a3c9, 0xfd422a8f, 0xaedbc6cd, 0x88017101, 0xed8dfec4, 0xb6a3fef1, 0x28892228, 0xd3ccd731, 0x12012601, 0xdbf2b501, - 0x8cfe65fe, 0x535f8d88, 0xd113ed01, 0x12000200, 0x42050000, 0x0700b005, 0x46000a00, 0x520f954b, 0x5141074d, 0x08884a07, 0x02040927, 0xb0391211, - 0x0bd74209, 0x840ab221, 0x31302914, 0x21032101, 0x21013301, 0x26080782, 0xccfdc303, 0x02f9fe76, 0x2702e326, 0x9cfdf8fe, 0x01d3a601, 0x05adfe53, - 0x0250fab0, 0x005c021f, 0x00940003, 0x82a30400, 0x000e287f, 0x001f0016, 0x4602b26d, 0x02250599, 0xd011b010, 0x200582b0, 0x06ab421e, 0x520c7347, - 0x172208d5, 0x87830100, 0xb22f1728, 0x7101171f, 0x56430fb2, 0x08b22308, 0x1983170f, 0xb2100023, 0x0ce94810, 0x0d881e20, 0x33313027, 0x04322111, - 0x086b4515, 0x0e820120, 0x34353624, 0x6e472527, 0x23450806, 0xf7f30194, 0x686c0201, 0xf9fe8176, 0x01eafef5, 0xe8867719, 0x76f8d2fe, 0xf6827b85, - 0xc4c6b005, 0x202ca064, 0xdccd7cb1, 0x39fe9102, 0x05e36976, 0x6c626bba, 0x00010060, 0x04ecff66, 0x00c405eb, 0xb240001d, 0x0a374803, 0x4b0c3652, - 0x0c210843, 0x0a035110, 0x1003b022, 0x350a3346, 0x06013130, 0x24222300, 0x34352702, 0x32332412, 0x26231700, 0x45472326, 0x08a48205, 0xeb043756, - 0xf9d4fe16, 0x90f7feae, 0x11019203, 0x2601f1b3, 0x9312fc18, 0x02b1a58e, 0x9695a3a9, 0xe9da0114, 0x01a5fbfe, 0xce88c930, 0xfeaa3a01, 0x8b9deffa, - 0xec81e9f1, 0x009c86f8, 0x94000200, 0xd2040000, 0x0b00b005, 0x46001500, 0x171602b2, 0xb0391211, 0x15b01002, 0x241b7141, 0xb21001b0, 0x0842410c, - 0x1000b024, 0x50410db2, 0x1512280f, 0x04021415, 0x83110323, 0x352b08a1, 0x94232634, 0x01c1ae01, 0xfea5a42b, 0xa5a6c5cf, 0xce02d5c7, 0xacb005c4, - 0x49ccc4fe, 0xaac6fecf, 0xe6fbe404, 0xed51e9f9, 0x840100fa, 0x844c2091, 0x424e2091, 0x06240589, 0x06b11b2f, 0x49076247, 0x0b2208f5, 0xaa830406, - 0x54450b20, 0x5204200c, 0xb0240b5e, 0x08b21006, 0x230c6245, 0x21152111, 0x03370385, 0x02aafde7, 0x0348fcbb, 0x024cfdb1, 0xfe8a0256, 0xb005ca40, - 0x866efecc, 0x8231207f, 0x0009227f, 0x1a094340, 0xfc42b220, 0x04b02113, 0x250b624e, 0x21013130, 0x6f862311, 0xb6fddb2d, 0xfd9d03fd, 0x024a0260, - 0x8397fd69, 0x824f206b, 0xff6a2e6b, 0x05f004ec, 0x001e00c4, 0x1f0bb255, 0x08654620, 0xf2820b20, 0xf2870b20, 0x20082342, 0x19674d0b, 0x0b1eb223, - 0x223d8203, 0x492f1eb0, 0x25220c80, 0x38420406, 0x10510805, 0x04322100, 0x21022317, 0x15070622, 0x32331214, 0x35211137, 0x4ff00421, 0xb7b2e8fe, - 0x0399e6fe, 0x1b013c01, 0x1d1e01f3, 0xf9fe2af8, 0xc703b1aa, 0xfe52c2b1, 0xbd2802d4, 0x01a66a67, 0x0172ce35, 0xf073014a, 0xf50701e2, 0xfeec70ed, - 0x1d0158fb, 0x052941c0, 0x05180527, 0x000b00b0, 0x12a9414c, 0x430c2b4e, 0xb02407ab, 0xb0584500, 0x2208c341, 0x44000609, 0xb94b0640, 0x31302909, - 0x21112321, 0x33112311, 0x33340582, 0xfdfc1805, 0x02fdfd75, 0x8702fc8b, 0xb00579fd, 0x5e02a2fd, 0xa3247982, 0x9f010000, 0x03227982, 0xee561d00, - 0x244a841a, 0xfc9f0133, 0x822a82fc, 0xff2d2435, 0x82e403ec, 0x000f260a, 0x1005b22f, 0x086d4111, 0x270cf54a, 0xb11b2f05, 0x593e0f05, 0x290ae042, - 0x33013130, 0x23041411, 0xe24c2622, 0xe8022b07, 0xd6fbfefc, 0x73fcf8e4, 0x9582666d, 0xd103fc29, 0x74cde6f6, 0x41778775, 0x0c220a15, 0x3f425300, - 0x82082012, 0x5608205e, 0x0b201427, 0x0b201982, 0x00227883, 0x9a820204, 0x006ab428, 0x5d02007a, 0x0d8506b2, 0x75066525, 0x825d0206, 0x072b0889, - 0x33112311, 0x21013711, 0x02210101, 0xfdfda536, 0x01aa018c, 0x02e3fd32, 0x02d4fe3c, 0x3afeaf75, 0x55fdb005, 0xfdfe01ad, 0x85d5fc7b, 0x2604218d, - 0x0522f382, 0x8d922800, 0x73820220, 0x73840220, 0x2e0a2743, 0x21152125, 0x91013311, 0x6efc9502, 0x41cacafd, 0x9424053b, 0x6a060000, 0x0e220a82, - 0x47856e00, 0x580c3441, 0xde410c6d, 0x00b02407, 0x84b05845, 0x073946ef, 0x2208df57, 0x83040001, 0x016523e2, 0xe2820175, 0x0d850720, 0x7a076a23, - 0x200d8207, 0x220d860a, 0x830a7a0a, 0x020922f0, 0x24f18221, 0x01230113, 0x08078213, 0x01dc0124, 0x01a301a4, 0xfe19fc47, 0x53feb552, 0xb005fc19, - 0x5c04a4fb, 0xe00150fa, 0x9efb8202, 0x7ffd6104, 0xb18820fe, 0x82170521, 0x0009240a, 0x5101b24c, 0x918306b7, 0x410c2a50, 0xa4420c8e, 0x0775430c, - 0x0502b223, 0x21ab8200, 0x068407b2, 0x21313024, 0x87820123, 0x11013331, 0xfd170533, 0xfdfd77fd, 0x04fb8b02, 0x82f7fb09, 0x04f33688, 0x0002000d, - 0x05ecff66, 0x00c4051e, 0x001e0010, 0x1f04b246, 0x243d8220, 0xb01004b0, 0x06514514, 0x410cff45, 0x0c20082b, 0x820b0d4e, 0x0cc6432e, 0x02140122, - 0x2c06c743, 0x20241234, 0x07171204, 0x22230234, 0x05c94302, 0x35124008, 0xfe941e05, 0xfeb1b3ed, 0x970197eb, 0x64011301, 0x01961301, 0xa4a8b7fd, - 0xa6bb02b9, 0xb202b5a8, 0xadbdfed6, 0xd14001ad, 0x4601d552, 0xbffeabad, 0x01f205d5, 0xebfffe02, 0xfafef054, 0x46f60001, 0xd42c0605, 0x0a00b005, - 0x4d001300, 0x15140ab2, 0x0a23b383, 0x860cb010, 0x0cc956b3, 0x564d0120, 0x0bb22306, 0x82450301, 0x46032011, 0x30240bc8, 0x23110131, 0x08055f47, - 0x2523042f, 0x35363221, 0x21272634, 0x02fd9101, 0x1f01f42d, 0xfefde7fe, 0x873001d3, 0xfe7e908e, 0xfd1d02c9, 0xfeb005e3, 0xcbeed6d1, 0x8d76787f, - 0x2e958202, 0x0504ff60, 0x00c4051a, 0x00230015, 0x4a08b246, 0x082305b9, 0x8620b010, 0x0c915195, 0x23086842, 0x19b21011, 0x2408cd42, 0xb21008b0, - 0x0c534d20, 0x17070225, 0x47062507, 0x04250a4e, 0x34071712, 0x0b4e4126, 0x76831929, 0xcafea4fa, 0x41b0463d, 0xb1390652, 0x961301b4, 0xa8b8fe01, - 0xb902b9a3, 0x02b5a9a7, 0xd1fecfb2, 0xf594c359, 0x0d56410d, 0xfefef628, 0xec55eaff, 0x5541f6fe, 0x05de2c09, 0x000e00b0, 0xb25a0017, 0x58191805, - 0x10200637, 0x0420bf86, 0x4908f854, 0xb2230a62, 0x8304020f, 0x540f2027, 0xb2230b25, 0x470f010b, 0x0e260698, 0x1004b0d0, 0xd74617b2, 0x0663410d, - 0x01070625, 0x41012115, 0x41080766, 0xe6feab02, 0xfc0002fd, 0x7e8d1201, 0xf1fe4701, 0x0401c2fd, 0x84859080, 0x3102f5fe, 0xb005cffd, 0xc592d6e2, - 0x0da1fd35, 0x7081fc02, 0x00028075, 0x4a000100, 0x8a04ecff, 0x2700c405, 0x11b26300, 0x21452928, 0x0c785108, 0xb6821d20, 0x3e0f1d27, 0x1d02b259, - 0x23218209, 0x1d090eb2, 0xb0210682, 0x0c9d4609, 0xa38b0220, 0x8422b221, 0x1db02129, 0x290ee04e, 0x27242634, 0x24343526, 0xd1593233, 0x07f44e0c, - 0x0808cf59, 0xfe878d41, 0x01c768a0, 0xee98e51f, 0x858ffc88, 0x0194897c, 0xfe60ce54, 0xfe9eefe9, 0xa4fd93f7, 0x01858499, 0x6a686077, 0xb0c97d41, - 0x7ecf70e4, 0x5f6a8172, 0x81656b50, 0xd7b670a7, 0x7c89ce75, 0x82006b88, 0x002d2adb, 0x05b00400, 0x000700b0, 0x12ad462e, 0x09450220, 0x06b02206, - 0x0ba54d10, 0x47d00421, 0x353107c5, 0xfeb00421, 0x3efefb3a, 0xe4048304, 0xe4041cfb, 0x245382cc, 0x04ecff7d, 0x245382bd, 0xb23c0010, 0x06815704, - 0x58450023, 0x0c2f41b0, 0x460c604d, 0x314908fb, 0x0131080b, 0x23001411, 0x11350022, 0x16141133, 0x11112033, 0xd7febd04, 0xdafefaf7, 0x019094fc, - 0xfcb00524, 0xf1fee833, 0x03ed0b01, 0x9232fccc, 0x0334019a, 0x247b82c6, 0x05000012, 0x227b821d, 0x4e380006, 0x234b0ca1, 0x0cec440c, 0x2508d244, - 0x11030100, 0xd9823912, 0x01210138, 0x02210123, 0x01720195, 0xf5f4fd16, 0x1501f6fd, 0x73043d01, 0x578250fa, 0x30000126, 0xe5060000, 0x0c260982, - 0x05b26000, 0xf9520e0d, 0x0c414515, 0x2415b748, 0xb0584500, 0x08bd5606, 0xb2217b84, 0x20068505, 0x8206840a, 0x33132189, 0x02828982, 0x13332608, - 0x0a053301, 0xb0fefbe0, 0xfeebfef2, 0xb0fef3e5, 0x1601e2fb, 0x046801d4, 0x0450fa48, 0x05d9fb27, 0x04bafbb0, 0x24ff8246, 0x04000029, 0x209d82e9, - 0x0767470b, 0x7d48f88c, 0x0c91460c, 0x89820720, 0x3e0f0727, 0x0100b259, 0x21d28204, 0x068506b2, 0x06000322, 0x92480d83, 0x051a4105, 0x01210122, - 0x28080284, 0x32018902, 0x48fe2401, 0xd9fec201, 0xc6fec7fe, 0xc301dafe, 0x240147fe, 0x0e02a203, 0x22fd2efd, 0xeafd1602, 0xd202de02, 0x20958200, - 0x20958207, 0x229582d6, 0x42310008, 0x958c0565, 0xca4a7b84, 0x85888510, 0x23113d73, 0x02210111, 0x014f016f, 0xfe18fe18, 0x190117fe, 0xb202fe02, - 0xe8fd68fc, 0x98031802, 0x50246183, 0x8c040000, 0x09226182, 0x61854400, 0xd147548c, 0x04b22312, 0xda820200, 0x1007b024, 0x364405b2, 0x09b22308, - 0x14820705, 0x2531303e, 0x35211521, 0x21352101, 0x03820115, 0x02c4fb0a, 0x0414fdf1, 0xa4caca1f, 0xa0cc4004, 0x84306f83, 0x1c02bcfe, 0x07008e06, - 0xb0002200, 0x07b02f04, 0x570f714b, 0xc282095b, 0x33112335, 0x21112115, 0xa5a51c02, 0x980168fe, 0xa9f9d005, 0x83d207bd, 0xff142447, 0x82640383, - 0x000325b7, 0x02b00013, 0x2005a94f, 0x066f5400, 0x13313036, 0x14230133, 0xf06002f0, 0xd3f9b005, 0x0c000100, 0xa601bcfe, 0x25207584, 0x01232d84, - 0x8b02b02f, 0x01b021bf, 0x200d6a4b, 0x31748213, 0x23113335, 0xfe9a010c, 0x06a7a766, 0xbd2ef88e, 0x77835706, 0xd9023524, 0x77823503, 0x27000622, - 0x460c2743, 0xd02409d3, 0x030701b2, 0x22054256, 0x82d005b0, 0x230322c4, 0x318e8201, 0xceb2b501, 0x01ab2b01, 0xa604cd2a, 0xd70233fe, 0x978229fd, - 0x41ff032a, 0x00009803, 0x1b000300, 0x43057d41, 0xce5d0a54, 0x31302d07, 0x21352105, 0x6bfc9803, 0xbfbf9503, 0x31258383, 0x0902d104, 0x29358306, - 0x01b00024, 0x010fb22f, 0x12525d01, 0x0fb42905, 0x02031f03, 0x0100b25d, 0x19248183, 0x182f00b0, 0x22088082, 0x02210123, 0xf2feca09, 0xd1041501, - 0x00002f01, 0xff5a0002, 0x04fb03ec, 0x001e004e, 0xb2850029, 0x832b2a17, 0x471720af, 0x1725090b, 0x17b11b2f, 0x0699591b, 0x4f0cef42, 0x02220826, - 0x34820417, 0x840bb221, 0x0bb02506, 0x1017b02f, 0x220b2b4f, 0x820f0b12, 0x09402e1e, 0x121c120c, 0x123c122c, 0x04b05d04, 0x0b9e5410, 0xb2100b24, - 0xe3890723, 0x27262131, 0x26222306, 0x33243435, 0x26343533, 0x58062223, 0x172907d4, 0x15171411, 0x37363225, 0x05a25f35, 0x03033e08, 0xa8740c10, - 0x0101cea3, 0x605e95ef, 0x76f36a53, 0xe2be7dcb, 0xfdfd2903, 0x83207f48, 0x1f5d8887, 0x89ba7946, 0x5447b9ad, 0x59405365, 0xadbf589b, 0x579218fe, - 0x3b46af11, 0x46565ecc, 0x2efd8253, 0x04ecff7c, 0x00000632, 0x001b000f, 0x5a13b264, 0x13200597, 0x20059f48, 0x054a4209, 0x1b2f0c24, 0x00410cb1, - 0x08324d07, 0x220c7a44, 0x82030c05, 0x0ab221e1, 0xb0200684, 0x5a10714f, 0x142f0cb5, 0x27222302, 0x33112307, 0x32333611, 0x83271112, 0x110723e0, - 0xd5823316, 0x32042f08, 0x6abec5e1, 0x69f3dc0c, 0xf3e2c6b2, 0x409e767c, 0x7c729f41, 0xfc120202, 0x7589d6fe, 0xd2fd0006, 0xfedafe7c, 0xb0b007f8, - 0x8d42fe8a, 0xb159acaa, 0xf5032b05, 0x1c004e04, 0x00b24b00, 0x49451e1d, 0x820f2008, 0x870f20b4, 0x08a952b4, 0x23092554, 0x0f0803b2, 0xb2232c82, - 0x82080f13, 0x0fb02406, 0x4316b210, 0x302208c1, 0x8c822531, 0x820e3321, 0x110027a8, 0x33003435, 0x18501632, 0x0246080a, 0x04785b39, 0xca7604e5, - 0xf6fee375, 0xc1e40801, 0x04e506f3, 0x80765c77, 0x6aae7f01, 0x66af654e, 0x03012601, 0x2901f719, 0x785db7e1, 0xb027aeab, 0x020000ad, 0xecff4f00, - 0x00060304, 0x19000e00, 0x17b26400, 0x75831b1a, 0xb0101727, 0xb000d003, 0x05674106, 0xb2820320, 0xb2870320, 0x0c820c20, 0xdd4b0c20, 0x22bf8807, - 0x820c0305, 0x0ab22137, 0xb0210684, 0x0cf9550c, 0xbb480320, 0x1344080d, 0x32331234, 0x11331117, 0x23062723, 0x14370222, 0x37323316, 0x22232611, - 0xc3e84f06, 0xdcf36aac, 0xbeb66d0c, 0x757ff3eb, 0x95434595, 0x25028076, 0x782f01fa, 0x00fa2a02, 0x32018470, 0x85b9a5f2, 0xbb82ce01, 0x5320b983, - 0x0b2cb982, 0x15004e04, 0x83001d00, 0x1f1e16b2, 0xb0248182, 0x08b01016, 0x84066b49, 0x43b6879c, 0x1a220812, 0x27830800, 0xb42f1a33, 0x1acf1abf, - 0x5fb45d02, 0x021a6f1a, 0x1a1fb471, 0x2206832f, 0x82ff1aef, 0x8cb22606, 0xb25d011a, 0x08fa420c, 0x4e52b020, 0x12b2280c, 0x12110008, 0x4108b039, - 0x05230d9b, 0x56350022, 0x122405d1, 0x16211511, 0x4008d683, 0x03060617, 0x21070622, 0x02262635, 0xe1fee759, 0xdd8be27d, 0x0b3dfdf1, 0x69a7779d, - 0xa4d94183, 0x01117b64, 0x147208cf, 0x1ef22301, 0xfe8effa2, 0x62fefee6, 0x7d879c86, 0x9f036b61, 0x7a127d8c, 0x06c5487d, 0x06d6022b, 0x00140015, - 0x1507b253, 0x08494216, 0x2120df84, 0x8f0bff43, 0x04b025ec, 0xd010b010, 0x210b6552, 0xb583d001, 0x220dba51, 0x82333523, 0x333c08b6, 0x26071732, - 0x15152223, 0x11231533, 0xc8a5a5d2, 0x064840b4, 0xdcae3528, 0xb48603dc, 0x12c4b463, 0x60b308be, 0x007afcb4, 0x52000200, 0x0c0456fe, 0x19004e04, - 0x83002400, 0x262522b2, 0xb0249382, 0x0bb01022, 0x870b3b4c, 0x2f06248c, 0x8706b11b, 0x820b200c, 0x110b210c, 0x1720b386, 0x17270c82, 0xb2593e0f, - 0x83170305, 0x0cec5041, 0x110fb222, 0xb2211483, 0x201b8515, 0x0b3e5817, 0x1003b023, 0x0ba45cb2, 0x20055242, 0x06b14f37, 0x16372727, 0x35363233, - 0x0e5d4235, 0xed524b08, 0x0b6ab9c4, 0xe1f7fedb, 0x733be377, 0x8c79a470, 0xf1beaf69, 0x937685f2, 0x78934547, 0xfc250285, 0x6d812d01, 0xf6d5e7fb, - 0x85925063, 0x75497f83, 0xa3f62e01, 0xdc017ebb, 0x0100be7b, 0x00007900, 0x0006f803, 0x42001000, 0xf7490ab2, 0x43102006, 0x0220051f, 0x25069457, - 0x584500b0, 0x165c0db0, 0x0b874407, 0x1002b024, 0xc6430ab2, 0x3601270a, 0x11132033, 0x62441123, 0x11233e05, 0x776c0133, 0x055a01b6, 0x925e61f3, - 0x03f3f348, 0x75fe8ac4, 0xba023dfd, 0xfc825d70, 0x2f7482fb, 0x7d000200, 0x90010000, 0x0300d505, 0x3e000d00, 0x41175567, 0x01200766, 0x8206af4d, - 0x0cb02677, 0x2f0cb0d0, 0x095e67b2, 0x67062251, 0x7f3e0958, 0xfefef3f3, 0x48488447, 0x3a044784, 0x4a381901, 0x4937384a, 0x02000049, 0x4bfeb5ff, - 0x73828501, 0x16000c28, 0x03b24900, 0x1b601817, 0x07cd4c06, 0x200c8045, 0x23738204, 0x593e1104, 0x2a0a155f, 0xb0100cb0, 0x15b0d015, 0x580fb22f, - 0x302f085b, 0x14110131, 0x27222306, 0x32331635, 0x89031137, 0xa57a2987, 0x263e439f, 0x15037930, 0xfb298c87, 0x11afa666, 0x048409c0, 0x299689a3, - 0x007d0001, 0x06360400, 0x6d510000, 0x0708430d, 0x670cf543, 0x6d510c95, 0x51082009, 0x0d850c6d, 0x08146d51, 0x6cdc012a, 0x014cf3f3, 0xfe24012b, - 0xfebd016e, 0x6fd001e7, 0x00069ffe, 0x015f8afc, 0xfd3dfe51, 0x00010089, 0x0100008c, 0x0000067f, 0x870d9752, 0x0776448d, 0x22067441, 0x82f3f37f, - 0x2c35822a, 0x0600007c, 0x004e0479, 0xb277001d, 0x0a295604, 0x240c6a45, 0xb11b2f07, 0x0cd34307, 0x3d650c87, 0x8215200c, 0x51152026, 0x0328116f, - 0x3912111b, 0x150705b2, 0x5706084a, 0x18280a0e, 0x013130d0, 0x32333617, 0x16210383, 0x06884217, 0x07063e08, 0x26112313, 0x11072223, 0x61011123, - 0xd9c67207, 0xb3d67650, 0x5af302af, 0x15695368, 0xbe05f301, 0x04f33d92, 0xa685713a, 0xfdc1c6a6, 0x67c00239, 0xfd485960, 0xbfc8021a, 0x04f0fc77, - 0x0723433a, 0x1024d582, 0x0bb25300, 0x8c0a1b4d, 0x820020d5, 0x870020ae, 0x820e20c8, 0x870e200c, 0x08a64bbb, 0x030e0122, 0x21056942, 0x34430bb2, - 0x43ad820b, 0x012c0c35, 0xc378075e, 0xf3065201, 0x48936559, 0x7d2c9982, 0xfd7dfe91, 0x67bd0235, 0xfefc8563, 0xdd469082, 0x823d2006, 0x000f2891, - 0xb243001a, 0x681c1b0c, 0xb021057c, 0x0b8f4f18, 0x5c0fda46, 0x04200bb6, 0x200dd061, 0x05b15c13, 0x1417172d, 0x22230606, 0x14173500, 0x49363216, - 0x2d08050a, 0x94e47e4f, 0x0b1101db, 0x96e57b01, 0xf3edfee5, 0x8d89f68a, 0x028c7779, 0x89ff9f27, 0x39e9e6fe, 0x018afca0, 0xa709fe31, 0xa4b9c0bd, - 0x9b82bdc0, 0x60fe7c24, 0x9b863004, 0x13b26e22, 0xe1489b85, 0x45002306, 0x5d43b058, 0x2f09240c, 0x4509b11b, 0x45450c52, 0x088d4a07, 0x2430eb48, - 0x33112311, 0x0feb4817, 0x30042e08, 0x6bb2c0e4, 0x6b0ae0f3, 0xf2e1c6b8, 0x41957881, 0x83749642, 0xfefb1202, 0xfffd75d5, 0x826eda05, 0xfafed9fe, - 0x7bbea206, 0xbb7e20fe, 0x20c78200, 0x20c7824f, 0x24c78202, 0x0019000e, 0x0e41486b, 0x8c081369, 0x0cfe48ba, 0x2954c787, 0x0c4b4808, 0x480b8b41, - 0x37211448, 0x45c68233, 0x2a080eea, 0xb5c6e84f, 0xf3d80e6a, 0xeac2aa6a, 0x907483f3, 0x748e4646, 0xfe260285, 0x6b7f2a01, 0xfc0126fa, 0xf62f0170, - 0x017bbda6, 0x43ba76ec, 0x0221058b, 0x26bf82b4, 0xb246000d, 0x470f0e09, 0xb8460d5f, 0x200c870c, 0x06305605, 0x6a0bb021, 0x09220cdb, 0x3c82050b, - 0x01313022, 0x3d064443, 0x33361733, 0xb3021732, 0x3aa73330, 0x5806e8f3, 0x0322349c, 0xfd80085c, 0x793a041c, 0x79820e8d, 0xecff4b24, 0x7982ca03, - 0x69002626, 0x282709b2, 0x870d7b51, 0x821c206c, 0x0f1c276c, 0x02b2593e, 0x2182091c, 0x1002b027, 0xb0d016b0, 0x0bdf5a09, 0x160db223, 0x2b1a8210, - 0x1c0d0cb4, 0xb05d020d, 0x24b2101c, 0x23083743, 0x022421b2, 0x03251b83, 0x02211321, 0x0a556b5d, 0x6b323321, 0x16200b52, 0x21065466, 0x76623526, - 0x023d0805, 0x53f86bdb, 0xc2b6ecb6, 0x5668f3ef, 0x015e6550, 0xf24fa31e, 0x74d085c4, 0x637805ec, 0x26016460, 0x28344441, 0xbc8ca758, 0x5d4699c0, - 0x3e383e4a, 0x577a573f, 0xa860b592, 0x495d5661, 0x2cdb8200, 0x02ecff08, 0x00410572, 0xb2520014, 0x0ab54800, 0xce821320, 0xdb871320, 0x26082c47, - 0x01b01013, 0x8200b0d0, 0xb02f2202, 0x0b265f01, 0x590db021, 0xd0480bd1, 0x08c48205, 0x15331134, 0x16141123, 0x15373233, 0x11202306, 0x33352311, - 0xbfad0111, 0x2a3f31bf, 0xfe4d532b, 0x05b2b2e8, 0xb4f9fe41, 0x373ea4fd, 0x0117bc0a, 0xb4650235, 0x95820701, 0xecff772a, 0x3a04f703, 0x53001000, - 0x2308c547, 0xb0584500, 0x840c6a45, 0x46a28795, 0x0f200c42, 0x0f27bc82, 0xb2593e0f, 0x410d0200, 0xd647058b, 0x0625290c, 0x35262223, 0x14113311, - 0x06829882, 0x0c03233a, 0xb5b0c56b, 0x3eb1abf3, 0x7e6ae5f3, 0xbd02c3ce, 0x7fce46fd, 0xc6fb0903, 0x16248b82, 0xda030000, 0xcd518b82, 0x0c6a4214, - 0x220fe34c, 0x510500b2, 0x133506cd, 0x01230133, 0xe5fa0133, 0xd389fefb, 0x01fc86fe, 0xfb060334, 0x825482c6, 0x0021245f, 0x82cc0500, 0x14cb510a, - 0x420c8243, 0x504d14e4, 0x0b002115, 0xb2217983, 0x20068505, 0x2206840a, 0x83013130, 0x03032187, 0x23088a82, 0x04331313, 0xfeedac33, 0xe4e8c8d9, - 0xedd8fec8, 0x01b7deaf, 0xfbeb024f, 0xfde702c6, 0xfd3a0419, 0x00e3021d, 0x1f209b82, 0xe820fb82, 0xc9519b82, 0x2487870d, 0xb11b2f0a, 0x14d94e0a, - 0xc9510720, 0x040a2608, 0xb2391211, 0x51068506, 0x13260fc9, 0x21010121, 0x05830303, 0xce01022e, 0xb5fe0e01, 0xf4fe5601, 0xf2fed7d8, 0xb6320782, - 0xd6020c01, 0xebfd6401, 0x7201dbfd, 0x25028efe, 0x91821502, 0x4bfe0c24, 0x9182d603, 0x3f000f24, 0x295a00b2, 0x0caf4d0a, 0x7e820520, 0x3e110527, - 0x0500b259, 0x059d4d0f, 0xd001b024, 0x206105b0, 0x3130220b, 0x087d8201, 0x22230230, 0x32173527, 0x01373736, 0xdcf70121, 0x52fe0301, 0x4035ed63, - 0x1b5d5c2e, 0x0184fe23, 0x025c0106, 0xfe22fbde, 0x03bc12ef, 0x045d4f43, 0x81820035, 0x00005224, 0x8182c003, 0x420de551, 0xaa540f87, 0x28e5510a, - 0x40028031, 0x250292fc, 0x4f03e5fd, 0x029fc2c2, 0x839ac4d7, 0xfe382e6f, 0x06910298, 0x0017003d, 0x1812b236, 0x22cf8219, 0x4a0cb000, 0x002005d1, - 0x0021e782, 0x22e78217, 0x820c0006, 0x06b02417, 0x4d05b22f, 0xb223080c, 0x44060512, 0x240805e7, 0x34350324, 0x35323523, 0x37363635, 0x15070617, - 0x15160714, 0x02171615, 0x079ffe61, 0xb503c1c1, 0x06ad30b0, 0x370282ad, 0x016398fe, 0xb2e1d560, 0xdeb4d4e2, 0xfa388c32, 0x5c5be1d8, 0x38fad5e3, - 0xae248583, 0x5501f2fe, 0x2b18ad6a, 0x33112301, 0xa7a75501, 0xbe06f2fe, 0x1b202d83, 0x7520b382, 0x1820b382, 0x0522b382, 0xb3841a19, 0xb3850b20, - 0xb3821820, 0xb3831820, 0x0b181122, 0xb0241782, 0x12b22f11, 0x0522b389, 0xb3841112, 0x3736172c, 0x26373435, 0x27263535, 0xad821637, 0x33143d08, - 0x15152215, 0x1b070614, 0xb6b604b0, 0xb630b004, 0xb3c2c2b2, 0xff39dbb5, 0x5656e7d0, 0x39ffcfea, 0xb9e5338c, 0xe1b2e1c8, 0x33e5bbc5, 0x75000100, - 0xdc048301, 0x17002f03, 0x11b23f00, 0x25063541, 0x03b22f0f, 0x5f820f18, 0x2f03b024, 0xb0440fb0, 0x1003260c, 0xb0d00bb0, 0x0cea5903, 0xb0100f2d, - 0x3130d017, 0x23061401, 0x51022e22, 0x3f080645, 0x021e3233, 0x35363233, 0x8ebedc04, 0x439a7d4a, 0xc14d4326, 0x854a94b6, 0x43274391, 0xb0120354, - 0x218938df, 0xdbab5468, 0x7022843b, 0x00020054, 0x0194fe86, 0x004d0499, 0x000f0003, 0x1007b23e, 0xb024de83, 0x00b01007, 0x4406d948, 0x032c0cc4, - 0x03b11b2f, 0xb0593e17, 0x07b2100d, 0x250ee663, 0x33133130, 0x8c842113, 0x35263408, 0x32333634, 0x18d1aa16, 0x0701fffe, 0x48424148, 0x48414248, - 0xfefb9602, 0x4b383705, 0x4b37384b, 0x0001004b, 0x040bff64, 0x0026050a, 0xb25d0020, 0x6b22211b, 0xc2430d2d, 0x0d665c0c, 0x0a03b222, 0x0a22a484, - 0x8c73b010, 0x10112b05, 0xb0d014b0, 0x18b22f14, 0x45820a11, 0x1011b022, 0x250c025b, 0x37363225, 0xe7710633, 0x35022405, 0x72123435, 0x41080507, - 0x26262317, 0x07032223, 0x4f021614, 0xe4067859, 0xc892c504, 0xb7ccccb7, 0x04b99ec8, 0x5b7607e4, 0x7f0110e6, 0x885068ae, 0xeaea1ccd, 0xdc1f0122, - 0x2001d51c, 0x1ce0e122, 0x75609cd8, 0xb048c8fe, 0xc38200ad, 0x00005e2e, 0xc3057c04, 0x65001f00, 0x21201ab2, 0x1224c388, 0x12b11b2f, 0x5e07ad55, - 0x04200817, 0x26084d47, 0xb2d008b0, 0x5f12051e, 0x1f200677, 0x0c291789, 0x101eb0d0, 0xb2d00fb0, 0x201d8516, 0x0b925a12, 0x01313035, 0x21071417, - 0x33352107, 0x27353636, 0x27333523, 0x47203634, 0x4908087e, 0x01152117, 0x024007fd, 0xe7fb01b8, 0x072b2752, 0xfa089ba1, 0xf5e89601, 0x67595e69, - 0x02370109, 0x5587b056, 0x6f09caca, 0xf2c7b95b, 0xb8daeaca, 0x6882695f, 0x0200c7f2, 0xe5ff5d00, 0xf1044f05, 0x28001b00, 0x02b23f00, 0x93462a29, - 0x1fb02105, 0x2d0b6975, 0xb0593e0f, 0x10b0d010, 0x1002b02f, 0x114320b2, 0x10b02408, 0x8826b210, 0x3082080d, 0x23062531, 0x27072722, 0x34352637, - 0x17372737, 0x17323336, 0x16071737, 0x17071415, 0x16140107, 0x36363216, 0x22262634, 0x3d040606, 0x9ecacb9f, 0x64878d81, 0x8e8d906d, 0x9bc2c09b, - 0x6b948e91, 0xfc8e8b62, 0xdcbe6e78, 0xbd6d6dbe, 0x6b6dbede, 0x90847e7f, 0xc8c59c89, 0x919093a5, 0x91947573, 0xc1ca9f97, 0x02918d9c, 0x75ce787b, - 0xcceece76, 0x00cc7575, 0x19000100, 0xc0040000, 0x1600b005, 0x5b557200, 0x2f162405, 0x4116b11b, 0x124a0780, 0x0c002208, 0x06dc5116, 0xb2d00123, - 0x330c850f, 0x13b02f0f, 0x2f13b0d0, 0x1f130fb4, 0xb05d0213, 0x04b0d004, 0x10231282, 0x540412b2, 0xb02407b1, 0x0fb0d006, 0x23076d42, 0x0eb2100f, - 0x0a211989, 0x057c57d0, 0x84152121, 0x05127001, 0x3521353a, 0x02210121, 0x013b016d, 0x0177fe18, 0x01a3fe0d, 0xfca3fe5d, 0x62019efe, 0x19200382, - 0x193a1282, 0x7c023403, 0x8a9836fd, 0x01d3fe97, 0x988a972d, 0x0200ca02, 0xf2fe8800, 0xc5826d01, 0x07000324, 0xc7821800, 0x20059044, 0x06c46206, - 0x0105b22a, 0x31302b03, 0x11331113, 0x332e6682, 0xe5e5e588, 0x1b03f2fe, 0xc803e5fc, 0x3d82f602, 0x26fe5a30, 0xc4058c04, 0x3d002f00, 0x20b28200, - 0xea833f3e, 0xb0102027, 0xb000d030, 0x204a8507, 0x274a8220, 0x593e1f20, 0x072039b2, 0x39201d83, 0x230b715d, 0x133902b2, 0x2006e34d, 0x0890420e, - 0x0e0bb222, 0xb2211483, 0x23308532, 0x2cb21032, 0x1a221b89, 0x63852c32, 0x8927b221, 0x2c242214, 0x2f148227, 0x14013130, 0x14151607, 0x24222304, - 0x16143735, 0x2d051265, 0x35022e27, 0x26263734, 0x33243435, 0x89750432, 0x16162d0a, 0x06272625, 0x1f161415, 0x34353602, 0x8108c782, 0xf2fe87ab, - 0xe0fef6ea, 0x79889cf2, 0xbcbb868d, 0x41a95dbe, 0xe6130144, 0xf30c01f0, 0x8b7b7891, 0xc2830178, 0x51cdfd5a, 0x95636c4c, 0x88732eb3, 0x59b8c701, - 0xc6adb964, 0x6e01cfd9, 0x4d4f5f78, 0x6e33375b, 0x5ab86d9a, 0xaa648832, 0x6acce1cc, 0x54525f80, 0x99716857, 0x281c156e, 0x2f56517c, 0x752f1035, - 0x02006151, 0xdf045d00, 0xcc052303, 0x11000800, 0xb0002200, 0x0fb22f07, 0xb25d0107, 0xfc410502, 0xd00b2408, 0x421007b0, 0x302b05fa, 0x36341331, - 0x06141632, 0x87252622, 0x435d2908, 0x76444476, 0x44c80143, 0x44290783, 0x44325605, 0x44446444, 0x3e068531, 0x57000300, 0xe205ecff, 0x1a00c405, - 0x36002800, 0x1fb28e00, 0x12113837, 0x101fb039, 0x83d009b0, 0x43332005, 0x33310665, 0x33b11b2f, 0xb0593e0f, 0x2db0d02d, 0x3302b22f, 0x2c26832d, - 0x0fb42f02, 0x02021f02, 0x2d09b25d, 0x26108333, 0x00b42f09, 0x82091009, 0x090d2210, 0x21108202, 0x5c6810b2, 0x02b02408, 0x8817b210, 0x1ab2230d, - 0x1f820902, 0x102db025, 0x88081fb2, 0x103323cd, 0x0d8825b2, 0x01313027, 0x26200614, 0x05af4535, 0x20078f41, 0x05ae4115, 0x02342535, 0x04222324, - 0x04121002, 0x25122420, 0x20241234, 0x60101204, 0x7c08054e, 0xfeaf5e04, 0x9ebfbdc0, 0x5c9cada3, 0x68675c58, 0x015a595b, 0xeefe96a6, 0xeffe9fa3, - 0x11019b9c, 0x13014001, 0xbbeffa98, 0x80014b01, 0xbbbb4a01, 0xc1c2b8fe, 0x02bcb7fe, 0xd5a29854, 0xd5ae71b4, 0x536095a5, 0x76757688, 0x85625186, - 0xab1d01a6, 0xfee0fea4, 0xa7e0feac, 0xa72001aa, 0xc75a01ca, 0xfea6fec7, 0xc9a6fe6c, 0x005a01c8, 0x028d0002, 0x051103b3, 0x001a00c4, 0xb28f0024, - 0x0527540d, 0xb0100d23, 0x0639411c, 0x1b2f142b, 0x3e1f14b1, 0x2503b259, 0x063d4714, 0xb0d00027, 0x01b22f00, 0x210f8303, 0x06840ab2, 0x2f0ab027, - 0xb21014b0, 0x0920410d, 0x0d0a1022, 0x21082e82, 0x0110ccb2, 0x0c13405d, 0x2c101c10, 0x4c103c10, 0x6c105c10, 0x8c107c10, 0xb25d0910, 0x710110ba, - 0xdc6903b0, 0x100a230c, 0x42881fb2, 0x01313033, 0x22230627, 0x36343526, 0x34353333, 0x15062223, 0x080a8227, 0x15163271, 0x25171411, 0x35373632, - 0x15060623, 0x11600214, 0x83767c4d, 0x7466ada8, 0xafad4941, 0x1a9a8988, 0x5428a0fe, 0x564c6a1b, 0x5244c102, 0x796e697b, 0x30337f33, 0x9181680e, - 0x61c4fe84, 0x19248251, 0x313c0189, 0x00ffff58, 0x038a0057, 0x00a90385, 0xeb7a0126, 0x01070000, 0x0052017a, 0x00010000, 0x0376017f, 0x002503c2, - 0x001a0005, 0x7a2f04b0, 0xb02105ec, 0x0b484e04, 0x23329c82, 0x21352111, 0xfdc8c203, 0x01430385, 0xab040176, 0x8f420400, 0x000d3508, 0x0031001b, - 0xb29d003a, 0x113c3b0a, 0x0ab03912, 0xd012b010, 0x31200583, 0x97420584, 0x0cc16107, 0x1b2f0a2c, 0x3e0f0ab1, 0x1003b059, 0x474212b2, 0x21348208, - 0x0d8818b2, 0x0a1db223, 0x06ae7a03, 0x0a031f22, 0x1f2c0983, 0x1f00b42f, 0x5d021f10, 0x1f1d32b2, 0x32231083, 0x891cb22f, 0x1c25222f, 0x282f8432, - 0xd02cb010, 0xb2101fb0, 0x221a883a, 0x42133130, 0x93420c77, 0x8211200e, 0x163231df, 0x16071415, 0x17161416, 0x35262315, 0x27232634, 0x21066b44, - 0x7e425723, 0x1105210f, 0x380fa242, 0x019725fd, 0x78ac9919, 0x0a073441, 0x4d420d9b, 0x5d458f9e, 0x028d5d47, 0x0e8442d9, 0xa442cb20, 0x5b2c080e, - 0x5203affe, 0x3f757d87, 0x44a36f1d, 0xa0221017, 0x3e86434c, 0x013b4636, 0x87000100, 0x5e031205, 0x0300b005, 0xb0001100, 0x02b22f01, 0x7508957b, - 0x033a05b1, 0x0229fd5e, 0x9e1205d7, 0x7f000200, 0x8b02af03, 0x0900c405, 0x39001300, 0x3d6300b2, 0x06d64206, 0x26082765, 0x0ab0d00a, 0x4205b22f, - 0xb0220875, 0xf5431000, 0x0855820a, 0x14163233, 0x26222306, 0x32133634, 0x26343536, 0x16140622, 0x9a6a8701, 0x9b6d6c98, 0x45356b9d, 0x49486a45, - 0xdc9ec405, 0x9edc9b9b, 0x354778fe, 0x684c4c34, 0x2c7d8248, 0x0301005f, 0x00fc04f3, 0x000f000b, 0x05eb7646, 0x250b7956, 0x00b01009, 0xfb76b0d0, - 0x0db0230f, 0x1f46b210, 0x0e052c0a, 0x39121106, 0x1b050bb4, 0x775d0205, 0x20080d17, 0x21352101, 0x57019c02, 0xfed8a9fe, 0xd865019b, 0xaffc3201, - 0x83035103, 0x017cfec7, 0x7901c784, 0x2ff882fb, 0x3c000100, 0xb2029b02, 0x1700bb05, 0x08b25900, 0x2006094b, 0x74878200, 0x00290c93, 0x00b11b2f, - 0xb2593e13, 0x08054116, 0x0002b223, 0x237a8216, 0x000f03b2, 0x2105434d, 0x1b8908b2, 0x14840c20, 0x8413b221, 0x23968306, 0x35360135, 0x08086a5c, - 0x1632332f, 0x020f1415, 0xfdb20221, 0x711d019c, 0x423a3436, 0x8f87a9ba, 0x8c626a9c, 0x9b027301, 0x6705017d, 0x42352a43, 0x80997436, 0x57666b73, - 0x2ea58271, 0x028f0237, 0x00ba05a9, 0xb27d0024, 0x4926251e, 0x0d2008e9, 0x0d209882, 0x20076848, 0x200c8217, 0x22a58317, 0x820d1701, 0xb07c3721, - 0xb6182f01, 0x01500140, 0x71030160, 0x010190b2, 0x100db05d, 0xa68906b2, 0x83010921, 0x01b02127, 0x230b306e, 0x012312b2, 0xb2213c82, 0x2443841b, - 0xb21017b0, 0x8230881e, 0x323321c9, 0x0720c78e, 0x68067251, 0x36080761, 0x01232734, 0x3684510c, 0xba41303e, 0xa38f82a5, 0x8fb19587, 0x45baab87, - 0x863d3f3c, 0x616c045c, 0x23273523, 0x69797c63, 0x8e293377, 0x717f7e6a, 0x2a373526, 0x82000165, 0x047031e3, 0x064802d1, 0x00030000, 0x02b00023, - 0x020fb22f, 0x0036b082, 0x2f00b0d0, 0x1f000fb4, 0xb05d0200, 0x03b01002, 0x03b019d0, 0x8982182f, 0x2301212d, 0x15013301, 0x06c3ebfe, 0x82d1fe00, - 0xfe922c3f, 0x041f0460, 0x0012003a, 0x790db260, 0x002206fd, 0x3f825845, 0x55b11b21, 0x072108aa, 0x0a8d562f, 0x0c821020, 0x59111021, 0xf25806c7, - 0x0868440c, 0xc6510d20, 0x0bb2220b, 0x057b600d, 0x16110123, 0x061c5116, 0x06272808, 0x11272223, 0x84011123, 0xa86a5902, 0x07dff33b, 0x4d79935c, - 0xfd3a04f2, 0x79828d84, 0xc6fb1203, 0xfe376b56, 0x73da053e, 0x032905f5, 0x00b00556, 0xb22b000a, 0x0a217902, 0x5b0c8a62, 0x260808e3, 0x11080001, - 0x31303912, 0x22231121, 0x24343524, 0x02112133, 0xfee65084, 0xe60a01f7, 0x08022101, 0xffd5d6fe, 0x820050fa, 0x028e2657, 0x03a90145, 0x22578252, - 0x8608b216, 0x2f022d57, 0x2b0a08b1, 0xdc1bd858, 0x13313059, 0x33069f58, 0x8e262223, 0x4e4b864a, 0x024c4140, 0x4e4e3aca, 0x4a4a3b3a, 0x6d2e3f82, - 0xc90141fe, 0x0e000300, 0x09b23400, 0x7582100f, 0x5608355d, 0x062308da, 0x8607b110, 0x0db2234f, 0x23820e07, 0x0d01b222, 0x30220683, 0x03422531, - 0x27200805, 0x34353632, 0x01372726, 0xac960b3e, 0x4742079b, 0x03205047, 0x69921b36, 0x2a2f8976, 0x8b05232d, 0x802c6982, 0x0202a002, 0x0600b305, - 0x01b23900, 0x780f9d72, 0x13260ca3, 0x04b2593e, 0x83680005, 0x03b22105, 0x2c0b8342, 0x35071123, 0x02023325, 0x6f01c9b9, 0x35508213, 0x7792303a, - 0x77000200, 0x2c03b202, 0x0c00c405, 0x40001a00, 0x895609b2, 0x10092205, 0x07e759b0, 0x3d7a0220, 0x201a8206, 0x05ca4802, 0x2518bc48, 0x34133130, - 0xa37e2036, 0x4237200e, 0x3f0806f9, 0x3601bf77, 0x9e9dbcc0, 0x505dafbe, 0x5d015b4e, 0x045d4e4f, 0xc2c3a061, 0xc39f48a6, 0x6205a3c4, 0x50616c6e, - 0x666d6e61, 0x00ffff00, 0x038a005d, 0x00a90399, 0x097b0126, 0x01070000, 0x007e017b, 0x592e1783, 0x83050000, 0x2700ab05, 0xd9ffd501, 0x07829802, - 0x1b017c2e, 0x07010800, 0xc502d801, 0x10000000, 0x250d1576, 0xffff3130, 0x33825000, 0xae05cc22, 0x00232b83, 0x840800f0, 0x02d0223b, 0x2233829b, - 0x891a03d6, 0x82092033, 0x1f0923e6, 0x3384593e, 0x33826720, 0xbb05fc22, 0xa8205f84, 0xd82c3384, 0x00003e03, 0xd7010701, 0x9b023000, 0x994b6787, - 0x31303507, 0x42000200, 0xa5037ffe, 0x19004e04, 0x61002300, 0x252410b2, 0x21053e73, 0x18461db0, 0x82212006, 0x4f212060, 0x10200721, 0x10280c82, - 0xb0593e17, 0x1db21021, 0x230e934f, 0x100003b2, 0x22187a73, 0x82001016, 0x3130271b, 0x07060601, 0xf4490607, 0x06332106, 0x0805ce48, 0x36373725, - 0x14133737, 0x35262206, 0x16323634, 0x35027602, 0x625a6749, 0xf36a5859, 0xcec2ef02, 0x4e5c9be2, 0x5bf7020a, 0x02360560, 0x4f917c95, 0x5e6a616a, - 0xb153645d, 0xa5b8c9d0, 0x73485da3, 0xea4f0135, 0x02002f08, 0x0000f6ff, 0xb0055707, 0x12000f00, 0x43677700, 0x0c3f6b12, 0x2008e866, 0x05e46d11, - 0xb22f1123, 0x09966902, 0x17510620, 0x0bb2210b, 0x0b212285, 0x0a746d2f, 0x4600b021, 0x12200ca1, 0x30242284, 0x03212131, 0x01240182, 0x13211521, - 0x46080384, 0x07032101, 0x0f7efc57, 0xfeb80afe, 0x034303de, 0x117afde0, 0xe4fd2402, 0xfa970214, 0x1b7901ed, 0xacfe5401, 0xfec5b005, 0x36fec568, - 0x88026701, 0x00010000, 0x03d6004d, 0x008604ec, 0x0038000b, 0xb22f03b0, 0x42030c09, 0x0a2106c8, 0x23098309, 0x090304b2, 0xb2231082, 0x82040a01, - 0x03b02906, 0xd005b010, 0x0a0407b2, 0x103e2484, 0x30d00bb0, 0x01011331, 0x17010137, 0x01070101, 0x3c014d01, 0x0194c4fe, 0x943c013b, 0x0484c4fe, - 0x01c5fe2a, 0x0142016c, 0xbefe9642, 0xfe3b0484, 0x410196be, 0x0000bffe, 0xff690003, 0x052205a1, 0x001700ee, 0x00290020, 0x6310b266, 0x102505c9, - 0xd01db010, 0x200582b0, 0x13957526, 0x21084b41, 0x9183101a, 0x8423b221, 0x23b02406, 0x831bb010, 0xee401834, 0x1ab02a0a, 0xd024b010, 0xb21004b0, - 0x0df56a26, 0x22230428, 0x37230727, 0x43721126, 0x176c0805, 0x16073337, 0x17140513, 0x22232601, 0x34050702, 0x33160127, 0x05351232, 0xedfe9422, - 0x5b84a4b4, 0x96c391a9, 0xc5b21401, 0x93a7578f, 0x44fc019d, 0x57f60147, 0x02b9a487, 0xfe2cbf02, 0xa9694e17, 0xd6b202b5, 0x4badbdfe, 0x01c3ee96, - 0x01d54367, 0x8f65af44, 0xc3fec1f3, 0x0380cf4b, 0xfffe553a, 0x72a608eb, 0x0136dcfc, 0x0000f600, 0x2d056572, 0x00b0057e, 0x0014000c, 0x1502b257, - 0x65721116, 0x490f2005, 0x00230f24, 0x46b05845, 0xb2230734, 0x83000a01, 0x2f012327, 0x09850eb2, 0x5e2f0e21, 0x01200b4f, 0x2d0d7672, 0x32331101, - 0x04141504, 0x23112323, 0x0c821311, 0x2634363e, 0xf1870127, 0xfe1201f4, 0xf3f2f3ee, 0x917df6f3, 0xb0057a8c, 0xc8eee8fe, 0xd4feefc7, 0x25390982, - 0xde821afe, 0x00000284, 0xff880001, 0x069b04ec, 0x002c0015, 0x2d23b25b, 0x0819482e, 0x1b2f0524, 0xc05d05b1, 0x0c5c5d07, 0x22086046, 0x7b15050e, - 0xb2210546, 0x0873411c, 0x1522b223, 0x05ed6b05, 0x4418b220, 0x21220bc5, 0x584c1123, 0x0e142505, 0x1e141502, 0x06260382, 0x27262223, 0x5a4f1637, - 0x022e2305, 0xe0483435, 0x075b0805, 0xe5f27a01, 0x1bd7bbce, 0xb2411645, 0x50c6d951, 0x2d3126ab, 0x5a61367f, 0x7e51ae46, 0x04b8505c, 0xeed65104, - 0x623ea9bb, 0x2c274171, 0x4b899454, 0x1927b9ab, 0x56251cc3, 0x885b3143, 0xc9585088, 0xf761514d, 0x00030000, 0x06ecff48, 0x00500484, 0x00340029, - 0xb2ca003c, 0x413e3d02, 0x2d26067b, 0x1002b0d0, 0x814138b0, 0x0c3f6606, 0x2808d25a, 0x00b0d000, 0x050cb22f, 0x28338317, 0x8fb22f0c, 0xb05d010c, - 0x0b6d5a17, 0xb0290d82, 0x1bb0d01b, 0x0038b22f, 0x2c25831b, 0x1fb42f38, 0x02382f38, 0x38efb471, 0x220683ff, 0x836f385f, 0x38bf2a06, 0x5d0238cf, - 0x01388cb2, 0x0b78525d, 0xb2100023, 0x08354123, 0x1005b022, 0x240a2e41, 0xb2100cb0, 0x0894522f, 0x101bb024, 0x298835b2, 0x05313022, 0x20067e77, - 0x05b44d35, 0xb54d2620, 0x36172508, 0x15123217, 0x23067363, 0x06061737, 0x0809c14d, 0x2201167d, 0x35210706, 0xe6042634, 0xd6418cfd, 0xeec8b086, - 0x585fbfe9, 0xfdf2735b, 0x836fdfc5, 0xfdeed4c8, 0x86980949, 0x493d6b89, 0x98fcd146, 0xc42d883a, 0x035d7868, 0x107f632b, 0x146dc401, 0xb0544da1, - 0x47ac9e9c, 0x4259675b, 0x85b99213, 0xfdfe0287, 0x9e8b89eb, 0x38a6223a, 0x2b3bb840, 0x465f02d1, 0xe7024f41, 0x711e7f8a, 0x0002007a, 0x04ecff67, - 0x002c0640, 0x002b001d, 0x7c07b265, 0x07230541, 0x4128b010, 0x19240673, 0x19b11b2f, 0x20075b42, 0x310c8207, 0x593e0f07, 0x19070fb2, 0xb0391211, - 0x11b22f0f, 0x0983070f, 0x755e1920, 0x0fb0210b, 0x220bed62, 0x7f1007b0, 0x25080ab5, 0x12013130, 0x02141511, 0x26222306, 0x36343526, 0x17323336, - 0x27072726, 0x37272637, 0x17371716, 0x26262703, 0x24462223, 0x03580807, 0xe57efe42, 0x7ee28a8c, 0x9284ce71, 0xcc7e3171, 0xa27eac4e, 0xb4b1ee4b, - 0x20018f4e, 0x8b7e4e7b, 0x896f6e8d, 0xf7fe1705, 0xa6526ffe, 0x7e92f9fe, 0xe79588e2, 0x7aa95b7d, 0x52726d87, 0x8732c32a, 0x19fd6d78, 0xa8383012, - 0xc8a87e95, 0x030000ad, 0x93004300, 0xcc043704, 0x0d260982, 0x52001900, 0x3f6604b2, 0x10042505, 0xb0d000b0, 0x11200582, 0x047bf782, 0x1003230d, - 0x0d4909b1, 0x46042007, 0x10220af6, 0x168711b1, 0x16881720, 0x2123de82, 0x4d012135, 0x03200826, 0x83064a43, 0x37042dee, 0xf4030cfc, 0x4a4409fe, - 0x4a43444a, 0x43200082, 0x02330985, 0xb201d446, 0x4b4b724c, 0x4afc4c72, 0x3a4c4c3a, 0x824a4a39, 0xff4f329f, 0x043d0477, 0x001500bb, 0x0025001d, - 0x2604b266, 0x05214927, 0x841bb021, 0x602320a9, 0xef5b1311, 0x04182208, 0x212d820f, 0x068420b2, 0x1020b024, 0x348319b0, 0x270aae56, 0xb01018b0, - 0x0fb0d021, 0x210bdb42, 0x2e603130, 0x37172705, 0x11160733, 0xb5820614, 0x23072725, 0x45132637, 0x06200583, 0x08068245, 0x7e4f3656, 0x586a94e4, - 0xc4669147, 0x5d96e57b, 0x6691485a, 0x0140f3ce, 0x77392f2b, 0x3a09028c, 0x332bd8fe, 0x2702897b, 0x2289ff9f, 0xfe99d08f, 0x8afca0c0, 0x96cf931e, - 0x629c3601, 0xbd166102, 0xfd5d94a7, 0x00c011a7, 0x82000200, 0x370460fe, 0x0f000006, 0x64001a00, 0x690e5160, 0x06241333, 0x06b11b2f, 0x69454760, - 0x042e1033, 0xb2c2e337, 0x6af3f36b, 0xf3e3c5b0, 0x46607683, 0xfef73107, 0xfffd75d1, 0xd7fda007, 0xfedafe77, 0xbaa605fa, 0x2c084760, 0x0500001f, - 0x00b0059d, 0x00170013, 0x056b486b, 0x680c4a4e, 0x142b086c, 0x12110f08, 0x2f14b039, 0x841410b2, 0x2f102909, 0xb0d000b0, 0x17b21010, 0x2b093b44, - 0x08b0d003, 0xd005b010, 0xb21014b0, 0x0af34218, 0xb0101723, 0x282a830a, 0xb0d00db0, 0x12b0100f, 0x1f4218d0, 0x11420809, 0x35231123, 0x11331133, - 0x01331121, 0x05213521, 0xfc7f7f1e, 0x7cfc75fd, 0x8b02fc7c, 0x0279fcfc, 0x0475fd8b, 0xf4fba2ae, 0x79fd8702, 0x01a20c04, 0x01fefe02, 0xbaa2fd02, - 0x8f000100, 0x82010000, 0x05643a04, 0x0cbb630e, 0x593e0f22, 0x22060564, 0x82f3f382, 0x2435822a, 0x0400008e, 0x220a826b, 0x855f000c, 0x2f0424ef, - 0x8704b11b, 0x22c96435, 0x38720620, 0x2f062d05, 0x2f061fb4, 0xb2710206, 0x5d01068f, 0x0bb94118, 0x06010a22, 0x82052b4a, 0x82d982db, 0x012008d7, - 0xef012101, 0x55f2f26f, 0x2c015001, 0xb90161fe, 0xac01cbfe, 0x3a0454fe, 0xb00150fe, 0xd3fdf3fd, 0x22209782, 0x36269782, 0x0d00b005, 0x4b185b00, - 0xd76f12fa, 0x0c012108, 0xb02a5c83, 0x00b02f01, 0x1001b0d0, 0x7d4102b2, 0x4d06200c, 0x3c080bff, 0xb01003b0, 0x09b0d008, 0x1000b0d0, 0xb0d00bb0, - 0x3130d00a, 0x07153701, 0x21152111, 0x37350711, 0xa1013311, 0x9502eaea, 0x82826efc, 0x476703fd, 0xf6fd4793, 0x278702ca, 0x96022793, 0x05cb5e00, - 0x062e0227, 0x000b0000, 0x2491854a, 0xb11b2f0a, 0x0cfc680a, 0x593e0f24, 0xb14901b2, 0x22919705, 0x8407b0d0, 0xd0092180, 0x80868c82, 0x7e862320, - 0x94949a34, 0xf38686f3, 0x92357903, 0x0219fd35, 0x2f922f90, 0x7982de02, 0x4bfe902e, 0xb0050905, 0x67001300, 0x151406b2, 0x71154178, 0xd56211ef, - 0x00b0240f, 0x4eb05845, 0x04200812, 0x230b315e, 0x0c000db2, 0xb2225682, 0xd74b0e12, 0x051f6706, 0x33163725, 0x76353532, 0x24080679, 0xa9be0905, - 0x280e3c46, 0x81fd7b3a, 0x7f02fcfc, 0x18fab005, 0xc711c6b7, 0x0431b80c, 0x05ebfb15, 0x04ecfbb0, 0x2ead8214, 0x044bfe7e, 0x004e0406, 0xb261001a, - 0x881c1b15, 0x198165ad, 0x1b2f0a24, 0xad870ab1, 0x08884b18, 0x03180122, 0xb0223b82, 0x2e6e100a, 0x03b0220a, 0xf8431810, 0x0641660a, 0x8a171621, - 0x08cf68ad, 0x5c013d08, 0xb0c4730d, 0xa6bb01b5, 0x280e3a45, 0x695d7c3b, 0x04f34b91, 0xd6aa963a, 0xb41bfdd2, 0x0cc611c2, 0x78d902b0, 0xe0fc6770, - 0x02003a04, 0xecff6400, 0xc4052d07, 0x23001700, 0x01b29100, 0x2305374d, 0x1ab01001, 0x20133f77, 0x20b0820e, 0x07f04e0e, 0x490ca460, 0xb021079e, - 0x0c1c630e, 0x0e001222, 0x1221cb83, 0x21bd8a2f, 0x946c00b0, 0x6ed9830b, 0xb022090a, 0x5e4b100c, 0x3130230a, 0x3b762121, 0x34112805, 0x32332412, - 0x7c152117, 0x05200650, 0x0806b66c, 0x1411075c, 0xfc2d0716, 0xa779a79d, 0x0294f7fe, 0xa80b0191, 0x5c03a77b, 0x56024cfd, 0xbb02aafd, 0x68637dfb, - 0xafa15b72, 0x9314b201, 0x01aa0d01, 0x1201ac3a, 0xfecc1496, 0x40fec86e, 0x38040d1c, 0xfebccf0e, 0x00d1c1ca, 0x5b000300, 0xf206ecff, 0x1e004f04, - 0x32002a00, 0x19b29b00, 0x0d483433, 0x24b02705, 0x1019b0d0, 0x5f6b2eb0, 0x0c264413, 0x1b2f1724, 0x4f6717b1, 0x821b2007, 0x821b200c, 0x05b2230c, - 0x47821708, 0x172fb223, 0x2c068208, 0xb42f2fb0, 0x2f2f2f1f, 0x8cb27102, 0x0de56c2f, 0x210ce649, 0x358419b2, 0xd022b024, 0x724803b0, 0x2bb02b0b, - 0x133130d0, 0x32330034, 0x77493617, 0x3736270a, 0x23060617, 0x03822722, 0x17110023, 0xba461814, 0x49252009, 0x68080680, 0xe00f015b, 0xb74186f9, - 0xfdeed66d, 0x75910b56, 0x4f478f59, 0xf778cd47, 0xe3f6868c, 0x86f2f2fe, 0x87867779, 0x03887578, 0x147855e1, 0x0271b501, 0x2f01f827, 0x015e54b1, - 0x88ecfdfe, 0x322a9e8b, 0xae413f9e, 0x012d01ae, 0xbaaa0902, 0xbea6c0b9, 0x7989baba, 0x007a6f19, 0x8b000100, 0x95020000, 0x0c001506, 0x03b23200, - 0x09b5740d, 0x1b2f0424, 0x8a6904b1, 0x43b0200f, 0x30250c7c, 0x34113331, 0x07fc6c36, 0xc28b1138, 0x19593fb0, 0x04a3322a, 0x15c3b69c, 0xfbba0bb9, - 0x00020068, 0xdf79ff51, 0x00162605, 0xb25b001e, 0x05df7900, 0x8c411720, 0x0ca34606, 0x28078242, 0x000f05b2, 0xb0391211, 0x0f0f6005, 0x210d7742, - 0xf47f1005, 0x20052f0c, 0x21351100, 0x22232626, 0x37270707, 0x0e823336, 0x14155108, 0x32270402, 0x15213736, 0xb8021614, 0xbdfedcfe, 0xdf05d003, - 0x3497a7cc, 0xdab02131, 0x6b013a01, 0xa9e5fea2, 0xfd12be96, 0x0114ba2f, 0x89490160, 0x1334f0e0, 0xfe480fc6, 0x6bb7fe8b, 0xafc3fec3, 0x1fbddad4, - 0x0100bfb9, 0x4bfee4ff, 0x1506d302, 0x7122c382, 0x797e14b2, 0x2f15240a, 0x4115b11b, 0x10200725, 0x10200c82, 0x20078146, 0x200c821d, 0x0c89641d, - 0x593e1124, 0x2e771db0, 0x69c2820c, 0xb02a09a4, 0x0eb01000, 0xd00fb0d0, 0xd98d15b0, 0x44230121, 0x16250726, 0x11353233, 0x0b726e23, 0x15074b08, - 0xc9840233, 0x3648a4b5, 0x1244070f, 0xc2a5a578, 0x195b3db1, 0x019d3b26, 0xfc8603c9, 0x11c0b035, 0xae0a03bf, 0x62b4ca03, 0xbc15c3b6, 0x0067ad0a, - 0xff580002, 0x06aa05ec, 0x0018002e, 0xb25b0026, 0x11282704, 0x04b03912, 0xc549b010, 0x550d2007, 0x4b4f0bdd, 0x0d0f2208, 0x06674b04, 0xa9581620, - 0x0db02208, 0x0ac44d10, 0x9c4c4382, 0x3130210a, 0x2a0c867b, 0x36173233, 0x14333536, 0x7a160706, 0x10240f3f, 0xb4edfe94, 0x30083b7a, 0x4c4fa2ff, - 0x577c79bb, 0xa8b8fd04, 0xb902b9a4, 0x073b4fa8, 0x4001ad22, 0x3205927b, 0x82830da8, 0xa723d1a4, 0xfef612df, 0x54ebfffe, 0x4ff6feec, 0x4f2a0637, - 0xbb04ecff, 0x1700a804, 0xd9822200, 0x24231422, 0x1420b183, 0x4809f573, 0x14200c22, 0x1427e682, 0xb2593e0f, 0x63140406, 0x0d2006a7, 0x1420d989, - 0x830b8341, 0x0b167bd9, 0x88069a4a, 0x141522d0, 0x07ba4306, 0x3536323c, 0x22232634, 0xe47d4f06, 0x358ae194, 0x6758a730, 0xe77b023f, 0xecfee395, - 0xd56a8af2, 0xa12c0807, 0x139589fd, 0xb386726a, 0x1d9e7d25, 0x018afca0, 0x0901012e, 0xb9c0bda7, 0x00bdbda7, 0x7d000100, 0x3d06ecff, 0x18000106, - 0x0cb25400, 0x2406a963, 0xb0584500, 0x20b28218, 0x07be4518, 0x0c821120, 0x08604d18, 0x2208ed5f, 0x50180c01, 0x08200604, 0x0c20cc89, 0x200e7c46, - 0x79b98615, 0x6d261147, 0xc5bbb55e, 0x4c79d7fe, 0x0adc280a, 0xd6e4a182, 0x79a5fd09, 0x772d1253, 0x2805ecff, 0x19009304, 0x07b26100, 0xfb4d181a, - 0x0c3f6309, 0x1808697c, 0x290bcb40, 0xb0100db0, 0x15b2d013, 0xad830813, 0xb22f1523, 0x22ad8803, 0x841506b2, 0x46082014, 0x30270b88, 0x06140131, - 0x5c231107, 0x11200578, 0x82072568, 0x373727c8, 0xa28f2805, 0x2c6806e5, 0x41482a08, 0x93040205, 0xfc0ba5b2, 0x0b3668cf, 0x42078831, 0x01004c4c, - 0x4bfeb5ff, 0x3a049301, 0x82000c00, 0x0aef4474, 0x200c316c, 0x118f6f04, 0x37088182, 0x23060611, 0x16372722, 0x11353233, 0xb8019301, 0x0f3846a7, - 0x047c3a27, 0xb285fb3a, 0x0dbf11c2, 0x006c04c0, 0x59000200, 0xf803ecff, 0x16004f04, 0x5e001e00, 0x201f08b2, 0x0822e283, 0xf444b010, 0x0cc46d07, - 0x2108984b, 0xf584000c, 0x732f0c21, 0xb0210d2f, 0x0c6c4708, 0xb2100c23, 0x08294a1a, 0x322a9282, 0x14151500, 0x22270606, 0xfc443502, 0x07062505, - 0x13363627, 0x0807f444, 0x01e40033, 0x86da7b14, 0xaa02efd5, 0x56778f0b, 0x464f4e8b, 0x785691d2, 0x714bfe13, 0xd4fe4f04, 0xfb9a1ff6, 0x0101018d, - 0xa18888ed, 0x3e9e3527, 0x8e60fc43, 0x06174674, 0xe0049435, 0x01064303, 0x45000800, 0x2f04b000, 0x01040fb2, 0x8350b25d, 0x82702004, 0x02b02f04, - 0x2f02b0d0, 0x19d001b0, 0x182f01b0, 0x286204b0, 0x0fb42a06, 0x02071f07, 0x0703b25d, 0x23f48304, 0x05b01001, 0x05222182, 0xaa82182f, 0x2723153d, - 0x01352307, 0xc3430333, 0x01c19596, 0xeb048f0f, 0x0d9c9c0b, 0x00001401, 0x82720001, 0x8434206d, 0x8825206d, 0x05de5d6d, 0x010fb424, 0x5282011f, - 0x01040022, 0x08245283, 0x2f08b0d0, 0x373d4d82, 0x23011533, 0x01333501, 0xfed092d2, 0xebfe96e9, 0x9b6605ce, 0x01e9fe0a, 0xff000918, 0x088f5cff, - 0x70000623, 0x2d5f8300, 0x02cc0475, 0x00e605fb, 0x002f000b, 0xcd8203b0, 0x5d010332, 0xb0d006b0, 0x0fb42f06, 0x02061f06, 0x1003b05d, 0x270a4a5b, - 0xb01006b0, 0x0bb0d00b, 0x143e6983, 0x35262006, 0x32161433, 0xfb023536, 0xb0dafeb0, 0x4a844bb6, 0x9c7ee605, 0x49427e9c, 0x5d834249, 0xdf04812e, - 0xd5058701, 0x1d000900, 0x0b0a03b2, 0x0020a782, 0xb222a582, 0x5461080f, 0x0910590c, 0x81262225, 0x82447e44, 0x59053302, 0x35474735, 0x00464634, - 0x78000200, 0x33028d04, 0x45822a06, 0x2a001425, 0x8205b000, 0x820520a5, 0xd01327a5, 0xb22f13b0, 0xcd600a00, 0x10052308, 0x0d880db2, 0x200b085d, - 0x07394807, 0x06223208, 0x805d5601, 0x7d61607d, 0x2e42117f, 0x623f412f, 0x7b2a063f, 0xaa7878aa, 0x412fd07b, 0x432e3040, 0x00010043, 0x0152fe29, - 0x003c00a1, 0xb222000f, 0x0ab5690f, 0xd54a0a20, 0x05b22106, 0x280ac45d, 0x15060621, 0x37323314, 0x062a5717, 0x8c013908, 0x2c474a57, 0x5c49152e, - 0x38f4745f, 0x1744315e, 0x5b6e2c8e, 0x01006cb5, 0xdb047a00, 0xf5055703, 0x40001500, 0x2f03b000, 0xb0d008b0, 0x0fb62f08, 0x2f081f08, 0xb05d0308, - 0x2005d567, 0x2217820b, 0x880fb210, 0x21168261, 0x0d8912b2, 0xb0100f23, 0x0de66715, 0x08056260, 0x36323334, 0x7f570335, 0x69392760, 0x35261a2b, - 0x395f7f95, 0x362634a1, 0x926ee905, 0x390c3c11, 0x966e082e, 0x002f395a, 0x49000200, 0x5603d104, 0x0300ff05, 0x87830700, 0x2b1ed95b, 0xb01000b0, - 0x05b0d005, 0x1002b02f, 0x82051742, 0xb0230890, 0xb019d007, 0x30182f07, 0x01330131, 0x03330323, 0xee680223, 0x90c5f6fe, 0x05b9dee9, 0x01d2feff, - 0x82d2fe2e, 0xfe823369, 0xffec016a, 0x000b00be, 0x003d0017, 0xb02f18b0, 0xf782d003, 0x000f403a, 0x20031003, 0x40033003, 0x60035003, 0xb05d0703, - 0x0fb0d00f, 0x0909b22f, 0x2308ca41, 0x15b21003, 0x30220d88, 0xa2511731, 0x083f640a, 0x22232f08, 0x4e698206, 0x496a6a49, 0x3065694e, 0x2d2d2122, - 0xee302221, 0x4b616349, 0x48605e4a, 0x222d2e21, 0x00303024, 0x8efc0100, 0x66fed104, 0xc95c0006, 0x07357b05, 0x07245618, 0x43100121, 0x586305b2, - 0x05347b06, 0x7b66fe21, 0x01260934, 0xd1045efd, 0x3f8736ff, 0x24072f41, 0x01b0d001, 0x0683432f, 0x2110095d, 0x095d21fe, 0xff230808, 0x0473fcff, - 0x0550ffdb, 0x000700f5, 0x00f9fba4, 0xfd010000, 0xfee6043e, 0x007f0699, 0x0025000e, 0x412f00b0, 0xb2210558, 0x053a7e01, 0xf1450720, 0x010d2109, - 0x0806bd4d, 0x36362731, 0x37233435, 0x14151632, 0xfd150706, 0x41490751, 0xaba90796, 0xe604484e, 0x231c0592, 0x58687b48, 0x450a4e3c, 0xfc020000, - 0xffe4040c, 0x82ee0534, 0x000723ed, 0xa4820037, 0x080f5718, 0xca41ea82, 0xd0062d05, 0xb62f06b0, 0x061f060f, 0x5d03062f, 0x2a059541, 0xb01000b0, - 0xb019d004, 0x41182f04, 0x01370503, 0xfe330323, 0xd5fed007, 0x22020601, 0x04faf5c3, 0xfe0a01e4, 0x830a01f6, 0xfe1c31bf, 0xff2ffe94, 0x0008008b, - 0x02b00011, 0x0506b22f, 0x2207b941, 0x65053130, 0xfd21070b, 0x05115a1c, 0x4735f126, 0x46466a47, 0x00273782, 0x01e904c6, 0x824106e2, 0x8317209b, - 0x83998237, 0x0c475efd, 0x2303332b, 0x8cdf0301, 0xfe410690, 0x262782a8, 0x03df0467, 0x82af06ba, 0x000c2809, 0x003b0015, 0x452f14b0, 0x80410862, - 0x14b02114, 0x8a06a144, 0x0fb02294, 0x82d382d0, 0x659b8859, 0x012e08b0, 0x9282e5ee, 0x7644a8fe, 0x44764343, 0xbe655602, 0xaf062405, 0x652fd6fe, - 0xff220cb9, 0xd55d00ff, 0x06022406, 0x83007800, 0x009b2acb, 0x05370400, 0x000500b0, 0x0a67512b, 0x10924718, 0xd84a0420, 0x0442180b, 0x37042a07, - 0x03fc60fd, 0xfbe4049c, 0x2641821c, 0x00190002, 0x82a00500, 0x00032409, 0x182f0006, 0x23171747, 0xb2593e0f, 0x2209346a, 0x420206b2, 0x2308061b, - 0x25210133, 0x6f020121, 0xfa3e02f3, 0x02550179, 0x0598fee0, 0xca50fab0, 0x0300bb03, 0xecff5b00, 0xc4051305, 0x14260982, 0x76002200, 0xfb4908b2, - 0x10082505, 0xb0d001b0, 0xd5690582, 0x0c6c5007, 0x35087b47, 0x11100802, 0xb07c3912, 0xb4182f02, 0x02700260, 0x30b45d02, 0x06824002, 0x0200b224, - 0x13527101, 0x10b0210a, 0x200c5c56, 0x0bf07d08, 0x20056f55, 0x7b461805, 0x033c081d, 0x0140fea3, 0x947001c0, 0xb0b3edfe, 0x0399eefe, 0x01140196, - 0x96130164, 0xa9b7fc01, 0xbb02b9a4, 0x02b5a9a6, 0xd689c279, 0xaaadbdfe, 0x5dcd3c01, 0xaf4401d5, 0xd5bffeab, 0x0501ef05, 0x0a834618, 0x2000012a, - 0x12050000, 0x0600b005, 0x07394118, 0x200cb264, 0x07c47801, 0x08c24718, 0x593e0f26, 0x010300b2, 0x08c84218, 0x01332008, 0xfe980221, 0x01f1fe97, - 0xff01f5fe, 0x4404f0fe, 0xb005bcfb, 0x000050fa, 0x006c0003, 0x822e0400, 0x0003265b, 0x000b0007, 0x05a9414b, 0x180c2e60, 0x22133741, 0x4d020805, - 0x5a1805b6, 0x08210b37, 0x0ce57110, 0x5c213721, 0x03200589, 0x6c3a0782, 0x3efcc203, 0xfdf60264, 0x9903570a, 0xcaca67fc, 0x03c64d03, 0x0100cc29, - 0xdb829b00, 0x7f821420, 0x38000722, 0x06207b85, 0x20060e6a, 0x085961b0, 0x7f07a74f, 0x062108bb, 0x0a305d10, 0x21313026, 0x11211123, 0x05270382, - 0x7ffdfc14, 0x427904fc, 0x01220683, 0xdb824700, 0x5b824d20, 0x3c000c22, 0x0320d792, 0x03206882, 0xf3415b82, 0xd005220b, 0x21c58cb0, 0xff6a07b0, - 0x21152505, 0x35010135, 0x2508c882, 0xfe1c0301, 0xfbbc0275, 0xfec901fa, 0xfde20337, 0x0288016b, 0xcafafdd0, 0x02420297, 0xfdcc983f, 0x030000ff, - 0xd3824a00, 0x7782ae20, 0x1c001528, 0x6c002300, 0xa9510bb2, 0x100b2505, 0xb0d019b0, 0x47180582, 0x142007a5, 0x14208182, 0x5b075e43, 0x132f08db, - 0x12110a14, 0x2f13b039, 0xb2d000b0, 0x83140a09, 0x2f09290c, 0xb0d00cb0, 0x21b21009, 0x8308e759, 0x4c13204b, 0x20200cb9, 0x1626ab83, 0x14151604, - 0x0e6e0706, 0x24610805, 0x24361026, 0x01333537, 0x11171614, 0x34050606, 0x36112726, 0xa17c0336, 0x888e0301, 0xfda9857c, 0x8ffcfea2, 0xa403018e, - 0xaac6fdfd, 0x03a79693, 0x9194a674, 0x03ff04a9, 0x9a9efe8f, 0x034d48f6, 0x8c01a9a9, 0xff3e01fa, 0xfdb1038f, 0x02b0a01f, 0xb704ae02, 0x04b6a09f, - 0xb30252fd, 0x00010000, 0x20e98244, 0x24e9825c, 0xb25c0017, 0x0adb6400, 0x6c0cb04c, 0x47180cab, 0x6a7a0cd9, 0x0b152208, 0x051c4c16, 0xd000b024, - 0x4f1815b0, 0x09200c42, 0x362ed583, 0x33113536, 0x07000611, 0x26112311, 0x0b822700, 0xd1821620, 0x03333108, 0xfd90834c, 0xf6e9fe03, 0xe8fef0fc, - 0x8f01fc04, 0x4302fc80, 0x01a7be17, 0xf606fef1, 0xfe19cffe, 0x1775018a, 0x01f53001, 0x9d0bfeff, 0x6c0318c2, 0x6b28b383, 0xdd040000, 0x2500c305, - 0x0722b382, 0x77822726, 0x24051c42, 0xb11b2f1a, 0x078d411a, 0x0c820f20, 0x78420f20, 0x82242007, 0x8324200c, 0x100f210c, 0x0bce5b18, 0x83d00e21, - 0x571a20ad, 0x11260c37, 0xd022b010, 0xb38223b0, 0x12362522, 0x2a07cf61, 0x17121415, 0x33352115, 0x5e350226, 0x5f080563, 0x15151204, 0x33070214, - 0xdf022115, 0x9d017b74, 0x7f9b8e90, 0xd807fe77, 0x018e786b, 0x01a5a405, 0x6b779006, 0xcf10fed4, 0xe7100120, 0xd9daca6d, 0xfeeb64cd, 0xcbcf1eeb, - 0x9e1f0167, 0x1d01b662, 0xe2fe9e9f, 0xfe9765b5, 0x00cb67dc, 0x56000200, 0x7904ebff, 0x16004e04, 0x79002100, 0x23221fb2, 0xb024d382, 0x13b0101f, - 0x76067a51, 0x924c0c4b, 0xa540180c, 0x42032015, 0xb2230864, 0x820c130a, 0x15b2214c, 0xb0210684, 0x0c6f420c, 0x12451320, 0x1611210e, 0x2306344a, - 0x22230627, 0x1027ea82, 0x17323312, 0x18140137, 0x0808b840, 0x03fd033a, 0x180a1146, 0x35a24c33, 0xe3c3c166, 0x67b5c4e4, 0x7a1cfe13, 0x46468c76, - 0x047f738a, 0x7bfafc3a, 0xa31eb404, 0xf81d01a2, 0x010a010d, 0xfd839736, 0x88ad9ebf, 0xc58ec701, 0x962ee582, 0x6a0477fe, 0x1400c405, 0x65002800, - 0xc56f27b2, 0x10272305, 0xe58200b0, 0x45180f20, 0xb0200d34, 0x2508177a, 0xb2593e0f, 0xc3830027, 0x2f27b024, 0xd88924b2, 0x27240622, 0xb021d882, - 0x0ce44500, 0x1e20df82, 0x30222288, 0x9c480131, 0x16162305, 0xd1821415, 0x2311272d, 0x36363411, 0x23263401, 0x83150622, 0x365c08ec, 0x27263435, - 0x32333523, 0xf2cf6902, 0x82795863, 0x7aa5d1f2, 0x01d97cf2, 0x605d714c, 0x719d5881, 0x7b677a89, 0xc405d448, 0x9b5fb2d8, 0x82bd2c30, 0xfe53eccd, - 0x73a90538, 0x6dfe70c1, 0x687e765a, 0x8952e5fc, 0x01916d6e, 0x010000b9, 0x5ffe2000, 0x3a04f503, 0x38000800, 0x0a0900b2, 0x0d534818, 0x66075d52, - 0xba4e0c5d, 0x07002208, 0x05ec4504, 0x01331322, 0x2a08a582, 0x0e023301, 0x8ffefbec, 0xfb8ffef3, 0xff023b01, 0x35fef0fb, 0x0b04d001, 0x00020000, - 0x04ecff54, 0x00200638, 0x002b001f, 0x5d16b262, 0x16200579, 0x24091152, 0xb11b2f03, 0x07e55203, 0x0c821620, 0x0d6b1620, 0x41092006, 0xb2230818, - 0x8203160e, 0x0eb0246e, 0x8929b22f, 0x291d2214, 0x057b700e, 0x310c1852, 0x33363413, 0x15171632, 0x06222326, 0x16171415, 0x40511712, 0x36342607, - 0x26262737, 0x083a6f13, 0x06224f08, 0x49b7d4d0, 0x69974f71, 0xe0bc5a4e, 0xe17a02de, 0xeefee295, 0x5b0289b8, 0x79897668, 0x6d918777, 0xea048979, - 0x1b16a591, 0x343d35c3, 0xfe4f425d, 0x9b1cccea, 0x230187f6, 0xffa50301, 0x89280522, 0xbca27dfd, 0xcb78b6bc, 0x0100be17, 0xe7826000, 0x4d040c28, - 0x8b002700, 0x4b1816b2, 0x4d410faf, 0x82252007, 0x822520df, 0x17b223df, 0xbc822509, 0x17b07c2f, 0x40b4182f, 0x02175017, 0x17d0b45d, 0x210682e0, - 0x824f18b2, 0x03b22308, 0x24821718, 0x210f527a, 0x14821017, 0x0d1cb226, 0x0bb25d01, 0xb0230482, 0x42b21025, 0xb2230943, 0x82181e21, 0x04b4261e, - 0x02211421, 0x5c63185d, 0x4223200e, 0x14250549, 0x15333316, 0x08a06423, 0x04143f08, 0x60242223, 0x61576269, 0xffbfd2f8, 0x5e597af2, 0xc7696072, - 0x667dd2d1, 0xfef28262, 0xfed5cbfc, 0x5c3201f8, 0x7924207f, 0xb5a59648, 0x4d4f3c91, 0xad4b3c3f, 0x573f9303, 0xba9b4259, 0xfb8200b2, 0x7efe612a, - 0xb005ca03, 0x4a001e00, 0x21069350, 0x2143b000, 0x09b46113, 0x230bdb53, 0x001c01b2, 0xb021b382, 0x23541815, 0x0115220e, 0x08a48306, 0x16171752, - 0x06141516, 0x35362707, 0x26272736, 0x10352627, 0x35213701, 0x60feca03, 0x4b3d4656, 0x7a4f61dd, 0x025d7d52, 0x4ac4686e, 0xdc250139, 0xb005c4fd, - 0x6d0afe91, 0x5a546bba, 0x621f4218, 0x3eba4751, 0x3d466765, 0x69321b21, 0x20018b50, 0xc3fd5101, 0x7e2eb383, 0x060461fe, 0x11004e04, 0x0cb25300, - 0x91591312, 0x2f072422, 0x5907b11b, 0x815e0791, 0x03012208, 0x213b820f, 0x434603b0, 0x3130220b, 0x0cc17f01, 0x11073608, 0x5c011123, 0xb6c1770c, - 0x5ef303ad, 0xf3469668, 0x97833a04, 0x9cfbc5c4, 0x696e5304, 0x04effc7a, 0x0003003a, 0x04ecff73, 0x00c4052c, 0x0016000d, 0xb279001e, 0x05dd5103, - 0xb0100324, 0x5f82d013, 0x181bb021, 0x231bf961, 0x0a030eb2, 0x7c2f8782, 0x182f0eb0, 0x700e60b4, 0xb45d020e, 0x82400e30, 0x00b22706, 0xb071010e, - 0x4418100a, 0x0e200b6e, 0x820c8544, 0x431b20bb, 0x62180857, 0x05210f26, 0x05745421, 0x05153308, 0x16141521, 0x04373632, 0xdfe3f82c, 0xe6f605fa, - 0xfd05f6e2, 0x7ad4013a, 0x017a6f71, 0x7b2cfed4, 0x020277e0, 0xfec4fe72, 0x014101b6, 0x3501e92d, 0x0c824c01, 0x3023d335, 0xcecbcbce, 0xd1d02aef, - 0x0000caca, 0xffa90001, 0x826102f4, 0x000c22ef, 0x0aa54b28, 0x24072043, 0xb11b2f09, 0x0da54b09, 0x517c9082, 0x9c01360b, 0x2b2a3e32, 0xe8fe564a, - 0xf6fc3a04, 0xbc0a363d, 0x03350117, 0x2c598211, 0x04eeff16, 0x00fb054a, 0xb2500019, 0x07315403, 0x4705a745, 0xb02507f7, 0xb0584500, 0x20638210, - 0x21638210, 0x49470bb0, 0x0fb2260b, 0x12110b00, 0x057c5e39, 0x5400b021, 0x50080ed5, 0x01171632, 0x37171716, 0x22230617, 0x03032726, 0x26270121, - 0x27072327, 0x6c120136, 0xab011f78, 0x11203124, 0x6d342a04, 0xf6ca2b75, 0x8101f7fe, 0x2249225b, 0x053b031b, 0xfb5055fb, 0x010756bf, 0x580ac001, - 0xfd14026f, 0xda0f0437, 0xb602034b, 0x2caf8210, 0x0376fe64, 0x00c405d4, 0xb256002c, 0x06e76403, 0xaf851620, 0xa2822a20, 0x3e1f2a23, 0x0a764a59, - 0x2d08b223, 0x219f832a, 0x78652f08, 0x1db2210a, 0x1d201485, 0x220ca067, 0x7e080924, 0x063108ef, 0x33211415, 0x11202315, 0x16041614, 0x06151617, - 0x2ab48206, 0x26343536, 0x26262724, 0x74363435, 0x4f08073c, 0x8a830317, 0x01887a57, 0xfe8c891c, 0x1901819e, 0x0251236f, 0x3583507b, 0xfdfe3f2e, - 0xa3767f4c, 0x017c6e90, 0x7d99e302, 0x5624da04, 0xfec6b84b, 0x428862e3, 0x6d381825, 0x643bbb48, 0x23295039, 0x3520442d, 0xc49194b7, 0x618e282d, - 0x002cc5a6, 0x2d2edf82, 0xcf04f4ff, 0x14003a04, 0x0bb25c00, 0x61431615, 0x0c1d4808, 0x2007854a, 0x08a16eb0, 0x593e0f27, 0xb21013b0, 0x08074500, - 0x180ab021, 0x2a0c6d4c, 0x0db01000, 0xd00eb0d0, 0x60d011b0, 0x707e0526, 0x213d080c, 0x23112311, 0xa9042135, 0x263f319f, 0xfe564a2f, 0xf3b4fee8, - 0x037c04ab, 0x3eb6fd7c, 0x17bc0a37, 0x53023501, 0x7c0384fc, 0x000200be, 0x0460fe80, 0x004e0431, 0x001a000e, 0x1b11b257, 0x21a3821c, 0xe14711b0, - 0x080d4c05, 0x430c3979, 0x226407fe, 0x00092208, 0x49348207, 0x495a0ba5, 0x31302b0c, 0x11123201, 0x23021415, 0x99822722, 0x03003422, 0x0809805b, - 0x56021538, 0xc1e0fbe0, 0x01f36ab3, 0x95431003, 0x727c7d76, 0x4e047766, 0xeffecbfe, 0xe5fef20f, 0x03fdfd77, 0x2101f2db, 0xad75d5fc, 0xc1c5b8b3, - 0x010000a0, 0x8afe5200, 0xb182e903, 0x4d002226, 0x24231bb2, 0x870df55e, 0x2f1427a9, 0x1714b11b, 0x8f50593e, 0x61058205, 0xb2230a68, 0x8200231c, - 0x1cb02135, 0x210eb167, 0xad741632, 0x1604240a, 0x42141716, 0x57080728, 0x27262627, 0x36363435, 0xedc43802, 0x71606de4, 0x2e019483, 0x7f013160, - 0x2a337f4c, 0xedee413c, 0x04dc7801, 0x61bbdd4e, 0x1aaabc74, 0x39569b83, 0xbf484253, 0x4e376538, 0x0f2a282c, 0x27d1fe37, 0x0089fa9d, 0x52000200, - 0x7e04ecff, 0x0f003a04, 0x4c001b00, 0x1d1c07b2, 0x4a051a77, 0x0e200833, 0x0e20b482, 0x200c7548, 0x20c1820f, 0x0bfa4f0e, 0x4407b021, 0x00290cc4, - 0xd019b010, 0x21013130, 0x07e24716, 0x00343525, 0x5c012137, 0x3b080ae3, 0xf5fe7e04, 0x91de7aba, 0x01f0fee2, 0x4102df0c, 0x7a85c7fc, 0x75838175, - 0x76038776, 0xec8efb92, 0x012c0183, 0x01ee0c03, 0xd8fd0223, 0xbdbcbba9, 0x00b0b39c, 0x3f000100, 0xec03ecff, 0x1024ab82, 0x01b24900, 0x0a2f4518, - 0x420c737e, 0x0f2008b9, 0xac42a38c, 0x44a68315, 0x280805c5, 0x20230617, 0x35211103, 0xfeec0321, 0x27332b98, 0x6c502637, 0xfe05ecfe, 0x03ad03ae, - 0x3bb0fd79, 0x2cb1163b, 0x54023901, 0x248782c1, 0x04ebff80, 0x24878208, 0xb2380012, 0x17ff6f0e, 0x1b2f0e28, 0x3e0f0eb1, 0x454bb259, 0x00b02409, - 0x5608b010, 0x460806cc, 0x32331011, 0x03263536, 0x10111633, 0x26222300, 0x72011127, 0x039171a1, 0xfe73f16e, 0xd1cbe7fc, 0xfd3a0401, 0xe9fdfe76, - 0x1d01e7a0, 0xfee2fee6, 0xe2c1fef4, 0x009502d8, 0xfe440002, 0x04850522, 0x001a0041, 0x6d5f0023, 0x1b240a35, 0x19b000d0, 0x2005a744, 0x207b8211, - 0x07b44111, 0x4a180620, 0x705d0b50, 0xd34a1808, 0x29958309, 0x0db0d018, 0xd01bb010, 0x5a4e11b0, 0x31303e0b, 0x35002405, 0x17371234, 0x14070606, - 0x34111716, 0x16323336, 0x00141516, 0x13231105, 0x08be8236, 0x2223264c, 0xfe650215, 0x7ee3fefc, 0x4c489873, 0x9e949a02, 0x87ec937c, 0xf5fedefe, - 0xa595f3f3, 0x37748d02, 0x37011c0e, 0x0501a4ff, 0xbc469253, 0x1ecda168, 0x92778002, 0xf392fb8d, 0xfe1ad7fe, 0x19940231, 0xbf9797c1, 0x0100003e, - 0xd7824f00, 0x3a047e28, 0x44001800, 0x015b00b2, 0x850d2006, 0x821420cf, 0x871420c2, 0x08e247cf, 0x1c471720, 0x01b02608, 0x1014b0d0, 0x2bc582b0, - 0x0fb0d006, 0xd00cb010, 0x11013130, 0x5f41a083, 0x36ae8205, 0x03002411, 0x10113311, 0x52031105, 0x7005a793, 0xe1fe79ee, 0x82f3f3fe, 0x01f531ba, - 0x041d01f3, 0x1b7dfc3a, 0x01e2a4ce, 0xedfee314, 0xca331482, 0x0132fe1a, 0x33011ed0, 0xed010a01, 0xa2fe18fe, 0x8282033c, 0xff6624a3, 0x822d06ec, - 0x002024a3, 0x7d1ab256, 0x4c4d0acb, 0x8218200c, 0x4e1820ad, 0x44180733, 0x5218088e, 0x00340b58, 0x3912111c, 0xb0d00eb0, 0x13b01000, 0x2f13b0d0, - 0x18051ab2, 0x20051b46, 0x06d15702, 0x1621ab82, 0x07224216, 0x02105708, 0x06272223, 0x10022223, 0x86e50137, 0x5b586107, 0x5f02fb60, 0x0761585a, - 0xd58df185, 0x5c5ce8cb, 0x8dd6cbe6, 0xe9fe3a04, 0x9dcbbded, 0xfe460194, 0xcb988eaf, 0x1501efbd, 0xfec8fde8, 0x01deded2, 0xe838022e, 0x76000200, - 0x9804ecff, 0x2000c405, 0x6b002900, 0x596d0fb2, 0x100f2305, 0xc34821b0, 0x0cfb4e06, 0x54180620, 0x24220790, 0x9c82061a, 0x2f24b022, 0x230bab48, - 0x0bb2d002, 0x06201785, 0x290cf562, 0x1eb01024, 0x101ab0d0, 0x9e4127b2, 0x31302608, 0x15070601, 0x24c08214, 0x37113500, 0x05084411, 0x26357108, - 0x34352700, 0x16323336, 0x37361115, 0x17161401, 0x22232611, 0x3a980406, 0xd3d5fa44, 0x82ecfefe, 0xd16d626e, 0xc50300ff, 0x4bbca7a5, 0x7daafd2a, - 0x346d046b, 0x14570243, 0xfdda750b, 0x01d40501, 0xdefe021d, 0x83868f7d, 0x1301267c, 0xcca91bc0, 0xcefebbd0, 0x23010b0c, 0x0120a26c, 0x00499a45, - 0xe1ff0100, 0x9e040000, 0x1a00c305, 0x00b24200, 0x500adf63, 0x0d200c7d, 0x0d27e782, 0xb2593e0f, 0x5f0d0400, 0xca470517, 0x12b0280a, 0x1004b0d0, - 0x82d017b0, 0x361321c4, 0x2507f960, 0x23110107, 0xaf820111, 0x82270721, 0x164a0812, 0xd23f0217, 0x46607a2b, 0x280d2642, 0xd9fe1f41, 0x21dbfefc, - 0x240a2b40, 0x7d674a3c, 0x0107032c, 0x1a6064f8, 0xfd4505c2, 0x02eefd6b, 0x45970210, 0x641bc105, 0x0200006c, 0xecff3300, 0x3a045406, 0x26001200, - 0x08b27000, 0x7f832827, 0xb0100823, 0x068f411e, 0x4211c843, 0xe6440757, 0x44112008, 0xb2230be6, 0x83061108, 0xd00f2d42, 0xb0d010b0, 0x16b0d015, - 0x100ab0d0, 0x230a7769, 0x0a101fb2, 0x24202083, 0x2322cf83, 0x59421516, 0x34112a08, 0x21352337, 0x21272601, 0x05814206, 0x35375b08, 0x16161533, - 0x06363233, 0xca378054, 0x5c5ceebc, 0x36c8bdee, 0xfe21066f, 0xfc3d04c5, 0x53043cc6, 0x01665c4b, 0x5d6302fa, 0x8303534b, 0xe2feaf9e, 0xe2e2d4fe, - 0x1c012e01, 0xfdb79cb1, 0xb1ada0fc, 0x97cabe9c, 0x8feee895, 0x0100ca97, 0xf2ff2200, 0xb005bc05, 0x6e001800, 0xdf5e11b2, 0x2f17240a, 0x1817b11b, - 0x250f1d68, 0x584500b0, 0x198213b0, 0xee831320, 0xe18c1720, 0x09170422, 0x0423c083, 0x5409b02f, 0xb0210b67, 0x0c736d04, 0x85100021, 0x31302dfd, - 0x36112101, 0x10043233, 0x32272304, 0x0805b144, 0x23110733, 0x21352111, 0x13fe9004, 0x01fb7294, 0xfeeefe18, 0x018c8901, 0x78868f8f, 0x047cfefd, - 0xfee4046e, 0xfef02674, 0x79bfec50, 0x20877784, 0xe40474fd, 0x2cc182cc, 0x04ecff68, 0x00c405ef, 0xb271001f, 0x03411803, 0xad5c180a, 0x0860650c, - 0x727e0c20, 0x0c17220c, 0x08574e03, 0x40173029, 0xb45d0217, 0x4e701760, 0x00230a5e, 0x18710117, 0x210a0a6d, 0x894d03b0, 0xde62180b, 0x6d212018, - 0x540805c3, 0xee043736, 0xf8d4fe16, 0x91f5feaf, 0x11019201, 0x2501f3b4, 0x9412fc18, 0x08b0a18e, 0x04fefb01, 0x939dab07, 0xd9011496, 0xa5fbfee8, - 0x7bcf3601, 0xaa3a01cf, 0x9cecf6fe, 0xcad2e58e, 0x9d87e5dd, 0x00020000, 0x0800002d, 0x00b00541, 0x00220019, 0x2309b274, 0x05e24e24, 0x60085366, - 0xdf5f0c87, 0x07b74b0c, 0x1800b223, 0x23348308, 0x18b02f00, 0x200c9941, 0xde521810, 0x5200200c, 0x12270c3b, 0xd01bb010, 0x82d01cb0, 0x216408e2, - 0x1415021e, 0x11210704, 0x02020321, 0x35232306, 0x37023e37, 0x11112113, 0x35363221, 0x05272634, 0x9931010d, 0xebfe7feb, 0xfecafde5, 0x630f1a42, - 0x28409ebc, 0x0a315f57, 0x01ab031c, 0x8f917e29, 0x01a1037a, 0xce87d475, 0xe40405fd, 0xf8fecdfd, 0xca86ddfe, 0xd76a0803, 0xfdc902d1, 0x93f4fd26, - 0x028f7375, 0x9b20e982, 0x4720e982, 0x1328e982, 0x87001c00, 0x1e1d01b2, 0x2006b65e, 0x05421814, 0x0791420b, 0x1b2f1324, 0x0c8713b1, 0x1808a14c, - 0x230bb850, 0x131000b2, 0xb228f685, 0x5d01009f, 0x020d04b2, 0x82069f42, 0x686518e9, 0x04b02109, 0x0cd34418, 0xc84c0d20, 0x1121220e, 0x2de78233, - 0x14151616, 0x11212304, 0x11231121, 0xf8860133, 0x97012335, 0x01fc8002, 0x7fee9c2b, 0xfdf3e3fe, 0xfc80fde0, 0x827c03fc, 0x922308f1, 0x45037c94, - 0xd2fd6b02, 0xcd85cb6e, 0xfd7a02f7, 0xfdb00586, 0x8618fe08, 0x00836f70, 0x00310001, 0x82c80500, 0x001522e7, 0x05d14d56, 0x410c6656, 0xb02114c2, - 0x0d6a4314, 0x85141021, 0xbc6418ca, 0x00b0280a, 0xd012b010, 0x43d013b0, 0x20220659, 0xac821504, 0x07985118, 0x35212a08, 0xfe920421, 0x018f8311, - 0xfc07010c, 0x868c9a7d, 0x048afefc, 0xfee40461, 0xe5ec1b9b, 0xca0137fe, 0xfd1c7a8b, 0xcce4044d, 0x24a18200, 0x0598fe92, 0x22a1820d, 0x7b48000b, - 0x0c7c0895, 0x083a6208, 0x46077d41, 0xb020078e, 0x25571983, 0x0a317508, 0x93820320, 0x11331324, 0x03831121, 0x11232008, 0x02fd9221, 0x4bfefd81, - 0x0537fefd, 0x041afbb0, 0xfe50fae6, 0x00680198, 0x00900002, 0x82c10400, 0x000d2877, 0xb25b0016, 0x76181710, 0xb021053b, 0x133f6903, 0x20086845, - 0x0c1b410c, 0x0a0c0222, 0x02223583, 0x247cb22f, 0x0dff6909, 0x01313023, 0x07d34121, 0x09820720, 0x3007cf41, 0xfd2c0427, 0xa02a0161, 0xebfe7cee, - 0x03d3fdef, 0x3a0d829c, 0x8c8f8029, 0xfee4047c, 0x85ca6e9f, 0x0502f8cc, 0xfe08fdb0, 0x6e738b12, 0x82000280, 0xfe2424af, 0x82dc059a, 0x000e28af, - 0xb2650014, 0x83161512, 0x10122379, 0xaf860bb0, 0x1b2f0b23, 0x0b6518b1, 0x82042008, 0x1704210c, 0x59066a7a, 0xb02807b3, 0x01b01004, 0x1002b0d0, - 0x4d0ba759, 0x2a4605ae, 0x100b2105, 0x820a2b4d, 0x234908b9, 0x23112111, 0x12363303, 0x11211337, 0x11212133, 0x05020321, 0x41fcf0cf, 0x577508f4, - 0x03260f68, 0xdbfbb996, 0x57fe7002, 0x9afe1b18, 0x9afe6601, 0x01543002, 0x8602cb41, 0x1a041afb, 0x65fe66fe, 0x00010000, 0x07000016, 0x22b7829b, - 0x427d0015, 0x5d180581, 0x73660cf4, 0x0c28580c, 0x5418b588, 0x0c830c13, 0x2808c065, 0x11020910, 0x10b03912, 0xdf49182f, 0x04b0260a, 0x1008b2d0, - 0x27178400, 0xd00bb010, 0x100013b2, 0xcd840c82, 0x23112325, 0x82012101, 0x6d332002, 0x210808d6, 0xfca3ff04, 0xfe9bfeaa, 0xfed501c5, 0x0132014a, - 0x96fc9d5c, 0x31015901, 0xd1014efe, 0x7402c6fe, 0x03838cfd, 0x02070327, 0x02a0fda9, 0x22038460, 0x83f7fc59, 0xff492ed7, 0x057f04ed, 0x002900c3, - 0x2a25b286, 0x08ed4d2b, 0x200c8741, 0x075a6a17, 0x6f180b20, 0x28220c5a, 0x2f82170b, 0x28b07c34, 0x10b2182f, 0xb45d0128, 0x28402830, 0x60b45d02, - 0x06837028, 0xb028a022, 0xb2230682, 0x82032806, 0x25b22125, 0x23084249, 0x282511b2, 0xb0211182, 0x0b6b5717, 0x251cb223, 0x7de0851f, 0x362208f1, - 0x69183233, 0x22220aa9, 0x2d7d2626, 0x26440808, 0x33352323, 0x946c0320, 0xfc926d7f, 0xfa8dea84, 0x6c781501, 0xd4fe817a, 0x7df99afa, 0x86789cfc, - 0xab8a8fa3, 0x040c01a2, 0x73746223, 0x67ba775b, 0xa663c4da, 0x7fab2a30, 0xbe6ee7c4, 0x7e815e7b, 0xc86f7b65, 0x942afd83, 0x0d050000, 0x0900b005, - 0xcf5d4500, 0x82072012, 0x5e0720f6, 0x925c102a, 0x0004220c, 0x21b58202, 0x068409b2, 0x0131303f, 0x11231133, 0x33112301, 0xfd100411, 0xfd81fdfd, - 0xfab005fd, 0xfb0d0450, 0xfbb005f3, 0x207183f2, 0x2471862d, 0xb24d0011, 0x0a135404, 0x5c0c2b44, 0x09200cfe, 0x2106af52, 0x7c4100b0, 0x09b0220b, - 0x21531810, 0x4678820d, 0x05220c6c, 0x5946fc0d, 0x4689840d, 0x002e0f4c, 0xff390001, 0x05dd04eb, 0x000f00b0, 0x4c18b249, 0xb04410fd, 0x00b2220f, - 0x0594490f, 0xde641020, 0x06b02105, 0x230b1e47, 0x0f060db2, 0x0808a15d, 0x23060744, 0x33163727, 0x01373732, 0x01a00221, 0xfe190124, 0xe0642e05, - 0x3d180268, 0xfe342c6c, 0x0214010e, 0xfbf902b7, 0x06b25b48, 0x7b5c04c8, 0x03002404, 0xc4ff4f00, 0xec051806, 0x1f001600, 0x55002800, 0x11590ab2, - 0x100a2505, 0xb0d01eb0, 0x202c0582, 0x0ab000d0, 0x2f15b02f, 0x0a1514b2, 0xb0296982, 0x00b02f14, 0x0a0bb2d0, 0x240c8315, 0x08b02f0b, 0x0b4e5cd0, - 0x14203482, 0x080b6442, 0xd020b024, 0x32013130, 0x14151204, 0x15230402, 0x26233523, 0x34350224, 0x35332412, 0x06220133, 0x17161415, 0x01821133, - 0x36324c08, 0x23263435, 0x01bbae03, 0xfe999916, 0x17f3bceb, 0x98ecfea9, 0xbe14019a, 0xaafbfef3, 0x17abbbc1, 0xbfab11f3, 0x2605adbf, 0xacf0fe98, - 0x97f1feaa, 0x9601bebe, 0xadaa0d01, 0xc6971201, 0xbccf6ffe, 0x0302cdb4, 0xcff2fc0e, 0x46d0b9b6, 0xa128051d, 0xb005bd05, 0x3b000b00, 0x46221d46, - 0x06201310, 0x21091046, 0x10460333, 0x14b02407, 0x46d1fbe8, 0xfb250510, 0x01d5fd1c, 0x246b835f, 0x0400008e, 0x226b82ee, 0x423f0011, 0xb64412d3, - 0x0767420c, 0x010eb22a, 0x39121109, 0xb22f0eb0, 0x2909da4d, 0x11013130, 0x23061123, 0x9b5c2420, 0x33250805, 0x04113732, 0xb0a2fcee, 0xf4fefbfe, - 0x7e01fc01, 0x05a4ae97, 0x0250fab0, 0xe8e6293d, 0x30fece01, 0x022a768b, 0x248183a7, 0x07000098, 0x20ed8403, 0x5f819248, 0x62430ce8, 0x0899550c, - 0x2b440120, 0x05b02308, 0xfa83b0d0, 0x0a470120, 0x82332006, 0x96012907, 0x01fcbc01, 0x95f9fcb9, 0x1a24fa86, 0x50fae604, 0x01266f82, 0xa2fe9800, - 0x0982ad07, 0x54000f25, 0x5b0bb000, 0x7c991240, 0x394d0d20, 0x2a7c8f07, 0xb0d009b0, 0x02b0d00a, 0x893130d0, 0x03332285, 0x24898a23, 0xf9de14aa, - 0x258c89dd, 0xe0fd12fb, 0x86825e01, 0x00020027, 0x05000018, 0x069f47d4, 0x01b25e22, 0x23059f47, 0x0eb01001, 0x221c0b7b, 0x470a0002, 0xb0240591, - 0x0cb21000, 0x20090d41, 0x0b845502, 0x200fa247, 0x15a24713, 0x8702182e, 0xeea02a01, 0xeee9fe7d, 0x75fed4fd, 0x29320d82, 0x7c8c8f80, 0xd3fdb005, - 0xcd86c96e, 0xed0402f7, 0xa147cbfd, 0x00032608, 0x0600009b, 0x22b18258, 0x820f000b, 0xb26d24bd, 0x841a1902, 0xb010258b, 0x02b0d00d, 0x4609076a, - 0x99710c21, 0x0c8f490c, 0x2208da6b, 0x4a0b0800, 0x1020065b, 0x0820d089, 0x230eab47, 0x16163221, 0x2105394b, 0x374a0133, 0x0127220a, 0x09654898, - 0xc004fd27, 0x40fbfcfc, 0x21c68401, 0x66488303, 0x50fa2107, 0x490b6a48, 0x0b260919, 0x4d001400, 0x69480eb2, 0x100e2305, 0x694801b0, 0x087a4213, - 0x87090021, 0x0a7641a5, 0xc9540920, 0x4ba58a0e, 0x012108d2, 0x8fa18a8d, 0x0902499b, 0x6b00012c, 0xf104ecff, 0x1f00c405, 0x7b4d7f00, 0x0c9e4b0c, - 0x35086a51, 0x111c1309, 0xb07c3912, 0xb4182f09, 0x09700960, 0xd0b45d02, 0x0683e009, 0x40093022, 0xb2240682, 0x71010900, 0x200b0949, 0x0ca2471c, - 0x03060022, 0xb0213e82, 0x0b454213, 0x090fb223, 0x05a5450c, 0x16166508, 0x37363233, 0x26213521, 0x06222326, 0x00362307, 0x12043233, 0x02141517, - 0x00222304, 0x14680127, 0xab9c9397, 0x02fefd06, 0xa0b10802, 0xfc12958c, 0xf2250118, 0x931001b3, 0xf4fe8f01, 0xd4fef8b0, 0x9ed90116, 0xccd7e486, - 0x9e8ce4d8, 0xa80801ee, 0x7bcdc8fe, 0xa8c7fecf, 0x00e80501, 0xa0000200, 0x0707ecff, 0x1728eb82, 0x7e002500, 0x272612b2, 0x2006ed49, 0x0bc55f1d, - 0x49076346, 0x18630c44, 0x0c214b08, 0x0d0a0e22, 0x815a4182, 0xf36f180b, 0x5ae5830a, 0xb0220964, 0x5e181004, 0xce6f0c28, 0x11232908, 0x11331123, - 0x24123633, 0x6b18ec84, 0x07340d5c, 0xedfe9407, 0xf8fea7b3, 0xfcb60e9e, 0x9a06b3fc, 0xb2ad0f01, 0x13616b18, 0x1c01982d, 0x05a3fdbd, 0xc971fdb0, - 0x18a53501, 0x8212666b, 0x002030fd, 0x055f0400, 0x000c00b0, 0xb2610015, 0x49171610, 0x0a2006ce, 0x1813655b, 0x630c4e41, 0x112208c7, 0x3483000a, - 0x6a181120, 0x05220c1e, 0x14831101, 0x8b4e0a20, 0x3044080b, 0x21112131, 0x26012101, 0x37243411, 0x14011121, 0x11333316, 0x03062223, 0xfee6fe62, - 0x01f1fee7, 0x1301fe45, 0xfdef01f6, 0xeb8a8a04, 0x02888ceb, 0x02e0fd20, 0x1101786b, 0xfa02e9d1, 0x7be90350, 0x8600028a, 0x5b2eb382, 0x3c04ebff, - 0x1a001306, 0x54002600, 0xc5510eb2, 0x100e2105, 0x2408195c, 0xb11b2f11, 0x10c57c11, 0x07110022, 0x2006db43, 0x05ac5819, 0x200a8741, 0x0d865507, - 0x12320136, 0x00141515, 0x11002223, 0x37121035, 0x33353636, 0x07060614, 0x36210282, 0x08ad7c17, 0x26345a08, 0xf6cc7a02, 0xdfe5f5fe, 0xf6f8eefe, - 0x42c4518a, 0x9f98a688, 0x7693911b, 0x797a8486, 0xfe038585, 0x0ceaeffe, 0x01defeea, 0x46000128, 0x98015e01, 0x363f1c33, 0x234f7e65, 0x9591a420, - 0x9ca59fc3, 0x8cb0afae, 0x000300a3, 0x0400008f, 0x003a043a, 0x0015000e, 0xb278001c, 0x05234f02, 0xb0100223, 0x0ccd4415, 0xd7820120, 0xb4790120, - 0x16b2230f, 0xd7820001, 0x16b07c2f, 0x40b4182f, 0x02165016, 0x16d0b45d, 0x210682e0, 0x3b5a0fb2, 0x08b22308, 0x7418160f, 0x03411476, 0x31302409, - 0x61211133, 0x01200b78, 0x3e080e82, 0x25233435, 0x34353233, 0x018f2327, 0x5de8deb7, 0xdf7c6a5b, 0x01f8fed1, 0xfebebb0a, 0xc4cfc8f9, 0x9b3a04d3, - 0x20774b91, 0x975b8616, 0xfecd019e, 0xae8786f3, 0x0004807a, 0x00850001, 0x824d0300, 0x0dd368d3, 0x714cbc87, 0x14d36808, 0xfe4d032a, 0xc802f22a, - 0x8afc7603, 0x02264182, 0xbefe2700, 0x0982c504, 0x14000e24, 0x8f4d5b00, 0xd004210a, 0x08115618, 0x7a2f0421, 0x9b480a99, 0x45002008, 0x062909c4, - 0xd007b0d0, 0xb0100cb0, 0x21088209, 0x854db010, 0x45042005, 0x3e080dd9, 0x37363637, 0x33112113, 0x21112311, 0x21132311, 0x07211121, 0x45658102, - 0xef020e07, 0x4afdf296, 0x760101f6, 0xeffe9f01, 0x71c20e07, 0x9e019ecb, 0xfcfd88fc, 0xbefe4201, 0xa7020402, 0x82d6fecf, 0x001e24f5, 0x825c0600, - 0x001522a9, 0x0a814d82, 0x0c4e5a18, 0x6a540c87, 0x23814d0c, 0x11021122, 0x2305814d, 0x5d01108f, 0x2729864d, 0x01012103, 0x11331321, 0x13200182, - 0x043e0a83, 0x80f38135, 0x01d6fef9, 0x01acfe67, 0xf372f529, 0x2901f673, 0x6901adfe, 0xb301d2fe, 0x03834dfe, 0x02330227, 0x0157fe07, 0x240383a9, - 0xcafdfcfd, 0x2cd98200, 0x03ecff4d, 0x004d04c4, 0xb28d0027, 0x0ad7611e, 0x1b2f2524, 0x127c25b1, 0x3e0f260c, 0x2519b259, 0x2fac8208, 0x2f19b07c, - 0x1940b418, 0x5d021950, 0xe019d0b4, 0xb2210682, 0x09934216, 0x19160322, 0x21057e55, 0x148910b2, 0x10160d22, 0xb42b1482, 0x0d130d03, 0x25b05d02, - 0x891eb210, 0x1921221b, 0x2b1b821e, 0x210b0940, 0x212b211b, 0x5d04213b, 0x6405b372, 0x7b4d0527, 0x1836200f, 0x080ccf4a, 0x57b00338, 0xcbf2ba4f, - 0xf272cc7c, 0x69595a76, 0xb4ae605c, 0x50525ea3, 0xb9f0f26e, 0x1203e0c9, 0x41247948, 0x53b195ba, 0x59426999, 0x464f4353, 0x428402af, 0x8f3c4f4a, - 0xfb82a4b7, 0x00008626, 0x3a041204, 0x5b0e814d, 0xd8420ca4, 0x0d814d10, 0x814d0720, 0x4d068405, 0x03340b81, 0xfef2f220, 0x04f2f258, 0x02c6fb3a, - 0x042efdd2, 0x002efd3a, 0x8f207182, 0x65207182, 0x0c227182, 0x47426800, 0x0cdf4205, 0x420c5279, 0x0b3e0c3a, 0x0bb11b2f, 0xb2593e0f, 0x11040206, - 0xb07c3912, 0xb4182f06, 0x06e306d3, 0x43b45d02, 0x06825306, 0x0613b222, 0x210c6e6b, 0x827d0ab2, 0x7bfd2f14, 0x016bf3f3, 0xfe2c012b, 0xfea80179, - 0x827d01c4, 0xfdfa2209, 0x20a183cc, 0x20a18221, 0x24a18214, 0xb24d000f, 0x0ad97004, 0x4e0c9959, 0x71490c23, 0x0c234e09, 0x4b0cf769, 0x213a05cf, - 0x23060203, 0x36372723, 0x04133736, 0xcefef314, 0xb0ab1314, 0x5032014b, 0x72820a49, 0x03c6fb2f, 0xfe87fe76, 0x05caedf0, 0x01e5ad0b, 0x062f41ce, - 0x826f0521, 0x000c228d, 0x052f4159, 0x240c2a45, 0xb11b2f0b, 0x07a1410b, 0x50083156, 0x5f4910ec, 0x445c1809, 0x8408200c, 0x2799820d, 0x23112101, - 0x01230111, 0x213d0582, 0x4001ff02, 0xfef33001, 0xd5fea5d6, 0x013201f3, 0xfb0f032b, 0xfdcc02c6, 0xfdd00234, 0x053d7f30, 0x00008624, 0x0a821104, - 0x7e000b22, 0x185c9385, 0x435c180c, 0x0c57470c, 0x20080e78, 0x05574709, 0x2f092408, 0xcf09bfb4, 0xb25d0209, 0x710109bf, 0x3f092fb4, 0xb2720209, - 0x7201095f, 0xff09efb4, 0xb4710209, 0x822f091f, 0x8fb22806, 0xb45d0109, 0x839f098f, 0x09a6531e, 0x3808a76b, 0x11211133, 0xf3110433, 0xf3f35bfe, - 0x01f3a501, 0x044bfeb5, 0x013dfe3a, 0x0ae142c3, 0x460d0d6c, 0x77180f6a, 0xb0200c2a, 0x27160d6c, 0xfef31204, 0x8c03f35a, 0x2a06bd45, 0x00230001, - 0x04d00300, 0x6d07003a, 0x07410745, 0xe570180c, 0x05b02118, 0x3405f254, 0x35211123, 0xfed00321, 0xa5fef3a1, 0x7903ad03, 0x790387fc, 0x335282c1, - 0x60fe5400, 0x00067f05, 0x24001a00, 0x7f002f00, 0x313007b2, 0x27064b5f, 0x07b0d020, 0xd02ab010, 0x15216a18, 0x240c7941, 0xb11b2f13, 0x07cd6013, - 0x520c6f56, 0x0a21084f, 0x0a586610, 0x1810b021, 0x260c1d46, 0x1eb0d028, 0x822db010, 0x10132da9, 0x17323312, 0x36113311, 0x11123233, 0x2507e860, - 0x02222306, 0x6b182527, 0x936908a9, 0x545c080a, 0x3e4cbbd1, 0xba5640f2, 0x53b7d4d3, 0x4f3df245, 0x0409d1af, 0x2d6a7437, 0xdc332125, 0x6a6cbafc, - 0x2a22212d, 0x0e027068, 0x37010901, 0xfece011c, 0xcbfe202e, 0xfef3e0fe, 0x56fe1ee6, 0x011aa601, 0xb63ce303, 0x3afd0dc7, 0xa24b010a, 0xc9020aa9, - 0x0100c10a, 0xbffe8600, 0x3a04a504, 0x2005c34f, 0x0a5b4e08, 0x0cad5e18, 0x200cca61, 0x0c5e630f, 0xc34fb020, 0xf386360f, 0x93f3a601, 0xd2fcdd14, - 0x88fc3a04, 0x88fc7803, 0x4101fdfd, 0x2a6b8200, 0x0300005f, 0x003b04e0, 0x52480011, 0x09220c25, 0x64181b2f, 0xaf7b090a, 0x08ca4f0c, 0x09010d2a, - 0x7c391211, 0x182f0db0, 0x250a8770, 0x23213130, 0x60180611, 0x200807a2, 0x37323316, 0xe0033311, 0xde685ef3, 0x6c69f3ea, 0x01f36462, 0xc7d51669, - 0xb4fe4c01, 0x02176276, 0x2483830c, 0x06000086, 0x4fef8403, 0xea430bc5, 0x14a6450c, 0x2827c54f, 0xf3520179, 0xfaf25301, 0x23fc8783, 0xc6fb7803, - 0x01266f82, 0xbffe7e00, 0x0982b406, 0x4b000f22, 0x44088448, 0x03240cfb, 0x03b11b2f, 0xc54f7c94, 0x4f092016, 0x712013bc, 0xb9248085, 0xbbfadd14, - 0x84418389, 0x267d8205, 0x001f0002, 0x82ea0400, 0x000d2609, 0xb25b0015, 0x05bf4b00, 0x7907b84f, 0x8a710c70, 0x0c002a08, 0x39121108, 0xb02f00b0, - 0x0c375a0c, 0x0cde4c18, 0x5e08b021, 0x3e080b65, 0x33013130, 0x15161632, 0x21070614, 0x21352111, 0x32331111, 0x27263436, 0x85ee4a02, 0xc4ec67c6, - 0xc8fe1dfe, 0x59ed2b02, 0x02566567, 0x6ea65ce2, 0x0301caa7, 0xe5fdc476, 0xa459a3fe, 0x4a00015f, 0x052105e3, 0x2aa782c9, 0x000f000b, 0xb26d0017, - 0x43191807, 0x0d2406ad, 0x1007b0d0, 0x088b7818, 0x630c9d43, 0xb14f0c0c, 0x860e2016, 0x4fb220cc, 0xbb891ab1, 0x8506b14f, 0x820121bd, 0xf326bd87, - 0xf3f34704, 0xc08cb9fb, 0xfb3a0425, 0x893a04c6, 0x000226c3, 0x0400008f, 0x26c38422, 0xb24d0013, 0x8315140e, 0x0aad4fc1, 0x6e41bb8c, 0x870a2009, - 0x0aad4fa1, 0xad4f0820, 0x41a18a0e, 0x9d8a075b, 0x9389978e, 0x5100012e, 0xe803ecff, 0x20004e04, 0x10b27d00, 0x480a2161, 0xd8440c23, 0x4b768208, - 0xb2230913, 0x8210081e, 0xb07c2fc1, 0xb4182f1e, 0x1e501e40, 0x03b25d02, 0x1282001e, 0x031cb226, 0x0bb25d01, 0x1b200483, 0x73087e49, 0xb2230d98, - 0x82181b15, 0x04b43129, 0x02151415, 0x0131305d, 0x23150622, 0x33363634, 0x20062e7b, 0x090b5723, 0x0805bc4f, 0x5501023d, 0xca74e576, 0x0b01dc72, - 0x7b91dc79, 0x76e56ec8, 0x0c7e6656, 0x5301acfe, 0x8b037e0e, 0xaf644f69, 0xfcd2fe68, 0x88fc9b19, 0x5d75ba67, 0xa8899977, 0x00008f84, 0xff910002, - 0x823806ec, 0x001426e1, 0xb285001f, 0x21881815, 0x0c1a4910, 0x240c5467, 0xb11b2f11, 0x796a1811, 0x13112111, 0x0120f584, 0xd029f582, 0x0201e001, - 0x0140b45d, 0x18068250, 0x200b4b44, 0x0c127c0c, 0x43180420, 0x01280d71, 0x33243633, 0x17170032, 0x2605937e, 0x23112327, 0x18013311, 0x08096a69, - 0xcc840132, 0xcb0a011b, 0x0b1101db, 0x96e57b01, 0x15f3fed2, 0x01f3f3ca, 0x88f68ab9, 0x8c77788d, 0xf8cf8702, 0x39e9e6fe, 0x018afca0, 0x3cfed404, - 0xd8fd3a04, 0x3008997e, 0x00270002, 0x04df0300, 0x000d003a, 0xb2610016, 0x058d5314, 0xb0101423, 0x06914f04, 0x490c6544, 0x05200c61, 0x0520ef82, - 0xb223ef82, 0x82010012, 0x12b022e2, 0x0a0c652f, 0x0307b223, 0x20148312, 0x0b285f00, 0x2a056f49, 0x13230323, 0x34352626, 0x4f033736, 0x3a080892, - 0xe7e3f2df, 0x6b64fffc, 0x65bcc6e9, 0x59e0ef4f, 0xfb3a046a, 0xfe8d01c6, 0x2ab50173, 0xc197659c, 0x44a0fe02, 0x5a380155, 0xff010000, 0x034bfedb, - 0x000006f8, 0xb28b0021, 0x82232215, 0xb0002265, 0x057c461e, 0x200c9c41, 0x06f57a0a, 0x687fb020, 0x2fac8208, 0xaf1e9fb6, 0x031ebf1e, 0x1e2fb25d, - 0x0fb25d01, 0x21220483, 0x44821e18, 0x2f21b022, 0x230afe68, 0x041802b2, 0x11f34518, 0xd75d0420, 0x00b0280b, 0xd01ab010, 0x5e1021b0, 0x152406e0, - 0x13203336, 0x07d84118, 0x35323322, 0x08ff4518, 0x35234c08, 0x15333533, 0xfe770221, 0x01b677f5, 0xa6b9055a, 0x270f3a46, 0x5e617b3b, 0x9ef34892, - 0x0b01f39e, 0x8ae9ad04, 0xfefc75fe, 0xbf11c4b2, 0xed02bf0d, 0xfc825d70, 0xabad04fb, 0x0100a8a8, 0xecff5400, 0x4e04f903, 0x7a001d00, 0x181e16b2, - 0x67097f8b, 0xff430c17, 0x08844e09, 0x0f19b222, 0x2609164d, 0x192f191f, 0x43b27102, 0xb223095f, 0x821b0003, 0x04b426e0, 0x02031403, 0x5973185d, - 0x13b2230d, 0x1b821619, 0x131cb226, 0x0bb25d01, 0x30210482, 0x6a731831, 0x214c0818, 0x02122115, 0x0678593e, 0xca7803e4, 0xf8fee474, 0xc0e40801, - 0x07e404f5, 0x7d6e5b76, 0xfe5b010a, 0x68ae19a6, 0x64b06650, 0x02012701, 0x2901f719, 0x7560b6e2, 0xfea88d94, 0x020000ec, 0x00001e00, 0x3a049a06, - 0x1f001600, 0x09b27900, 0x20056d43, 0x09515509, 0x450c7d42, 0x27660c92, 0x7f012008, 0x01230566, 0x4600b02f, 0xc5730c5f, 0x4301200d, 0x08200c61, - 0x0dc76c18, 0x33110122, 0x23086d46, 0x07060203, 0x82060c4c, 0x32440816, 0x26343536, 0xf8fa0327, 0xc3e9e5c3, 0xe6fe19fe, 0xafa81315, 0x5232024e, - 0x02140a47, 0x6858edf3, 0x3a045664, 0xbc0387fe, 0x02c1a09f, 0x87fe7603, 0x01eef2fe, 0xaf0b05ca, 0xfdce01e3, 0x58c1fec5, 0x0151484d, 0x8620e782, - 0xb120e782, 0x1226e782, 0x82001b00, 0x876901b2, 0x73012005, 0x022409bb, 0x02b11b2f, 0x6d14ab4f, 0xf4890c44, 0x110b1129, 0x01b03912, 0x8504b22f, - 0x2f042209, 0x0e5218b0, 0x04b0210c, 0x210b7843, 0x9e600bb0, 0x3130250b, 0x33112101, 0x1123f38a, 0x87331123, 0x012325ec, 0xf3a50179, 0x5b2def87, - 0x9802f3f3, 0x64665aed, 0x019f025b, 0x25e8879b, 0x23fedd01, 0xdf833a04, 0x464b5a32, 0x01000054, 0x0000eeff, 0x0006f803, 0x79001800, 0x08df4218, - 0x93431520, 0x82072012, 0x450720e7, 0xcd880723, 0x0115bf25, 0x832fb25d, 0x830f2004, 0x0f182204, 0x20dc8315, 0x0d8f4318, 0x83070421, 0x46d68214, - 0x00270ad7, 0xd011b010, 0x601018b0, 0x814306b0, 0x43232005, 0x8b241078, 0xb677e1fe, 0x08507218, 0xf38b8b29, 0xb5041f01, 0x18fe8af1, 0x34095572, - 0xa1aab504, 0x000100a1, 0x049afe86, 0x003a0412, 0x0045000b, 0x13d14ab0, 0x180c6749, 0x22092652, 0x49b05845, 0x1e5912e4, 0x11232d09, 0x79011121, - 0xfef3a601, 0xb2fef3b5, 0x25055a49, 0x9afec6fb, 0xbd4d6601, 0xff882c05, 0x05c106eb, 0x001e00b0, 0x1806b260, 0x5d0a8d46, 0x8a640c03, 0x778d180c, - 0x2f04240c, 0x1804b11b, 0x22108676, 0x6d040006, 0x1a210e25, 0x219283d0, 0x6f680614, 0x35262405, 0x67113311, 0x9e8205ae, 0x38080886, 0xd2f9c106, - 0xe9716de5, 0x67fdf3cf, 0x0172695e, 0x61636d01, 0xfbb0056e, 0xa5eed6ff, 0x04d5efa5, 0x75fcfb01, 0x04778182, 0x74fcfb03, 0x04797f83, 0x00010003, - 0x05ebff70, 0x94c882ed, 0x07d542bd, 0x840c1d4a, 0x0c254cbd, 0x1520bd91, 0x0620bd95, 0xc688bd92, 0xed052608, 0xc7bdda01, 0xb8cb6660, 0x4654f3d5, - 0x5cf46653, 0x045b4a4f, 0xc14efd3a, 0xdd8e8edc, 0xfdaf02c3, 0x6c6c7251, 0x31078972, 0xe0ff0200, 0x21040000, 0x12001806, 0x71001b00, 0x9b4315b2, - 0x10152105, 0x24082f62, 0xb11b2f0f, 0x07df550f, 0x2208e541, 0x46090f12, 0x336f06f4, 0x02b22109, 0x02291485, 0x1000b02f, 0xb0d00bb0, 0x06215a12, - 0x4513b221, 0xb0210895, 0x118a4309, 0x26077c44, 0x11333523, 0x43211133, 0x4108078a, 0xfea30227, 0xe5c4f7de, 0x12fec0e5, 0x01f3aeae, 0xeddefe22, - 0x5763655b, 0xc9fe3a04, 0xadaece03, 0x3a0404d3, 0xfe3301ab, 0xfe5bfdcd, 0x55596582, 0x01000269, 0xedff9800, 0xc505cd06, 0x8e002500, 0xf7780eb2, - 0x8224200a, 0x182420c5, 0x870ccb67, 0x0758590c, 0x4500b025, 0x8222b058, 0x0f222726, 0x00b2593e, 0xdf832422, 0xb22f002a, 0x7101001f, 0x1c2408b2, - 0x05200e83, 0x820c7b5b, 0xd00f21e4, 0x605eea82, 0xd012230b, 0x25471cb0, 0x18b2210b, 0x30223984, 0x5f580131, 0x17002205, 0x055a5923, 0x2608dd66, - 0x23000633, 0x48022422, 0x580806d7, 0x960bb594, 0xf1ab0901, 0xfc182601, 0xa18e9312, 0xe9010bab, 0xa80216fe, 0x149695a2, 0xd3fe16fc, 0xf8feacf8, - 0xfcb40393, 0xbe4f03fc, 0xfe9b1d01, 0x8b9deffa, 0xe1c3ccdd, 0xe99c86f2, 0x01a1fbfe, 0x74fdca34, 0x0000b005, 0xff860001, 0x04ba05ec, 0x0023004e, - 0x240db292, 0x08c76125, 0x200c2448, 0x20ef8223, 0x07884223, 0x07224c18, 0x4500b025, 0x8220b058, 0x0f202719, 0x0eb2593e, 0x61591b04, 0x0e402a08, - 0x5d020e50, 0xb0d000b0, 0x0b6c6004, 0x0e08b223, 0x2223820b, 0x57100eb0, 0xb0210a05, 0x0c24681b, 0x0f131622, 0x0f262283, 0xd01eb010, 0xd4493130, - 0x41162005, 0x0320050c, 0x24090b41, 0x2223020e, 0x060a4124, 0x149d7926, 0xc1d20401, 0x28054c47, 0x7c011adb, 0x7d0a85fe, 0x076a476e, 0xfed32d08, - 0xf39e14fd, 0xde7102f3, 0x60b6e2ff, 0xabe6fe75, 0x50688e8a, 0xfe64b066, 0x043afedc, 0x0200003a, 0x00001c00, 0xb0051705, 0x0e000b00, 0x20072566, - 0x20d58208, 0x07f94108, 0x650ccc53, 0x0d221580, 0xb5830208, 0x89630d20, 0x840e200f, 0x077c6317, 0x21032008, 0x21013301, 0x03032101, 0x73e17e83, - 0x02fafe8f, 0x0002f506, 0xe0fdfafe, 0x01a85301, 0x8356feaa, 0xb0052703, 0x680250fa, 0x9983f801, 0x00000a24, 0xa4824504, 0x10000b22, 0xd854998c, - 0x21999614, 0x99860802, 0x230a9e5e, 0x0fb2d004, 0x2320998d, 0x03829982, 0x07270339, 0xc35de402, 0x01f7685b, 0xab01e7a9, 0xf85cfef7, 0x01191964, - 0x83e9fe17, 0x3a043903, 0xc401c6fb, 0x64640601, 0xac000200, 0x30070000, 0x1300b005, 0x7c001600, 0x18054b53, 0x180cde87, 0x450c156b, 0xb0201479, - 0x840b987a, 0x0845690c, 0x04021522, 0x200c027d, 0x09184406, 0xb0d00a29, 0x0eb01006, 0x8416b2d0, 0x31302323, 0xbb822101, 0x23032123, 0x22018211, - 0x68132103, 0x23080536, 0xa8010321, 0x2b016801, 0xfe0002f5, 0xe27e8efa, 0xfafe8f72, 0xfcdbfe98, 0x016202fc, 0x6702a953, 0x50fa4903, 0x2a077141, - 0x55feab01, 0xb8fcb005, 0x8200f901, 0x009d26d7, 0x04180600, 0x22d7823a, 0x8a7f0018, 0x077341d7, 0x9345d784, 0x21d79a1c, 0xee4b1000, 0xb02f2305, - 0x3367d001, 0xd00b300b, 0xb0d007b0, 0x14b01001, 0xd015b0d0, 0x831217b2, 0x24da82fe, 0x01331333, 0x21da8623, 0xd24c1323, 0x33210805, 0x01072703, - 0xe7f8fe90, 0x6af7ab01, 0x685bc35d, 0xf3ba6df7, 0xf8ed01f3, 0x01191964, 0xfb7602c4, 0x07af41c6, 0x2105b341, 0xb1418afd, 0x82802006, 0x056e34d9, - 0x001a00b0, 0xb27a001d, 0x111f1e1b, 0x1bb03912, 0x180db010, 0x180b6758, 0x910f7582, 0x6c1320cc, 0xb2220692, 0xa5831900, 0x2f00b022, 0x2c0b296e, - 0x0fb0d00e, 0x1000b0d0, 0xb2d018b0, 0x2020851b, 0x0ec66b19, 0x1716162a, 0x26112311, 0x07232326, 0x23220782, 0x06830622, 0x36363f08, 0x01210121, - 0x7a042113, 0xfc05f1fe, 0x688f7602, 0x8f7efc06, 0x03fc0375, 0xfe0f01fa, 0xfde40485, 0x2ffee98e, 0xd9042803, 0x018dfed8, 0x0b6f816c, 0x5c02affd, - 0x90fe7e6e, 0xdbe16c01, 0xe5828802, 0x0200a92a, 0x00008200, 0x3a046405, 0xd76ae390, 0x82052007, 0x550520bc, 0x414a1442, 0x2ee3880c, 0x11000504, - 0x04b03912, 0xd007b02f, 0x591004b0, 0x5a6d0a14, 0x1bb22105, 0x05202085, 0x3324e38d, 0x37363635, 0xea82cf82, 0x35231525, 0x88272626, 0x821520ea, - 0x823908e3, 0xfeccc502, 0xfef403eb, 0x02bec6ea, 0x725e01f3, 0x2df2012f, 0x01036079, 0xd6fe9585, 0x0dd2ceb2, 0x24fedb01, 0xb3c7d311, 0x02727fb1, - 0x015ffe03, 0xba7c6ea4, 0x22016902, 0x30e18200, 0x080000a3, 0x00b005b3, 0x00230020, 0x241cb297, 0x229f8325, 0x18b0101c, 0x6307c54e, 0x6a610c18, - 0x0cd0560c, 0x4f0c9449, 0x192a0c93, 0x19b11b2f, 0xb2593e0f, 0xfb840709, 0xb04e0920, 0x09b0300b, 0xd00db010, 0xb01003b0, 0x17b0d01c, 0x8521b2d0, - 0x5f0b2023, 0x212a0d32, 0x21373411, 0x33112311, 0x04412111, 0x0fef4105, 0x21130131, 0xfe3bc502, 0x03fcfc9f, 0x0487fe30, 0x4184fee5, 0x053807f5, - 0x73917ffc, 0xe9080203, 0x60012efe, 0x9afd65a1, 0x7bfdb005, 0x78fd8502, 0x3708f841, 0x02adfd09, 0xfe7c715c, 0x01390391, 0x020000aa, 0x00008f00, - 0x3a047607, 0x20061141, 0x0511411d, 0x11411d20, 0xae74180e, 0x30114114, 0x11410b20, 0x09815108, 0x850f1141, 0x0f114123, 0x41363521, 0x16420d11, - 0x95023712, 0xb7fe3501, 0xa502f3f3, 0xf403ecfe, 0xbec5eafe, 0x5e01f202, 0x1c422e73, 0x94b02f0a, 0x0458fe64, 0x0127fe3a, 0x1124fed9, 0x2142c6d4, - 0xfe283014, 0x07aa0340, 0x00270088, 0xb2a70030, 0x63323102, 0x28240685, 0x2cb000d0, 0x24056d4c, 0xb11b2f05, 0xc8661805, 0x076e570c, 0x20080a42, - 0x0c0e6205, 0x11052622, 0x7c2b4582, 0x182f26b0, 0x012610b2, 0x8240b25d, 0x60b42604, 0x02267026, 0x0ae37e5d, 0x230cb223, 0x22278226, 0x181011b0, - 0x320a0d55, 0x012c0fb2, 0x102cb05d, 0xb0d029b0, 0x0fb42f29, 0x82291f29, 0x2c282234, 0x33298329, 0x30b0d030, 0x0131302f, 0x21232634, 0x04322135, - 0x07061415, 0x04380482, 0x15062323, 0x26071714, 0x36342726, 0x36363337, 0x23213435, 0x03203335, 0x07ff4c18, 0x96024c08, 0xe5fe7a85, 0x01ed1501, - 0x016e7d0b, 0xe8f7fe0c, 0x52987a35, 0xb102a284, 0x89723fa4, 0x8989cffe, 0x93941001, 0x97eafecf, 0x04ceebfe, 0xc76a5e21, 0xa370b5cf, 0xc5fe572c, - 0x6b6303e8, 0xb7289941, 0x028b867f, 0xf3657d01, 0x189f03c7, 0x2e07404d, 0xfe330002, 0x06880348, 0x0027001c, 0x41950030, 0x4e421a3b, 0x2f172407, - 0x4117b11b, 0x1220073b, 0x12250c82, 0xb0593e0f, 0xc6661805, 0x1225220c, 0x29e98205, 0x2f25b07c, 0x2540b418, 0xfc822550, 0x3e422420, 0x0cb22108, - 0x2005af42, 0x0b314112, 0x21112c41, 0x2c412c29, 0x09294105, 0x14151624, 0x04830706, 0x200d2941, 0x06294132, 0x29413220, 0x74640809, 0xe4fe6973, - 0xf8dc1701, 0xf6d95761, 0x907e36d0, 0x02968251, 0x6c35a1a9, 0x91f9fe77, 0x92a0e295, 0x96e9fed0, 0x02cdebfe, 0xb9473cfe, 0x774f8da5, 0x96ac4224, - 0x6b6204af, 0xb6309141, 0x01877d70, 0xa9943f50, 0x0b9b1203, 0x1701eafe, 0x0300000a, 0xecff5f00, 0xc4051705, 0x17001000, 0x66001e00, 0x201f04b2, - 0x04259e83, 0xd011b010, 0x200582b0, 0x06514618, 0x480c8a4d, 0x0c200803, 0x230be05f, 0x0c0414b2, 0x7c243b82, 0x182f14b0, 0xfe713a82, 0x1014230b, - 0x27411cb2, 0x56531808, 0x0420330e, 0x22011712, 0x26210706, 0x36320326, 0x16162137, 0x48181705, 0xfd33115b, 0x08b6a0a4, 0xb408bc02, 0x0ab39fa0, - 0xb80a44fd, 0x18d6b202, 0x2b0f6048, 0xd9f0ef01, 0xcafbeedb, 0xead9dee5, 0x4f30db83, 0x3d04ecff, 0x0f004e04, 0x1d001600, 0x04b26700, 0x82052747, - 0x841020d5, 0xcd5018db, 0x0c1f4b07, 0x5608ab66, 0xb22109ef, 0x2bd8861b, 0xb4182f1b, 0x1b501b40, 0x13b25d02, 0xea83ce88, 0x2509ba77, 0x34133130, - 0xbd543636, 0x0111210a, 0x1320d485, 0x4608e285, 0x94e47d4f, 0x0b1301da, 0x95e77b01, 0x01ecfee3, 0x10856bf7, 0x8410fffd, 0x10856a6b, 0x85100002, - 0xfda12702, 0xeae7fe89, 0x8afca039, 0x01012e01, 0x899293fe, 0xdd029388, 0x95828295, 0x00010000, 0x04000010, 0x82c205f3, 0xb24622d3, 0x0a175e02, - 0x0c5e4818, 0x1b2f0f24, 0x73180fb1, 0x01271045, 0x12110f0c, 0x1806b039, 0x220eff40, 0x82133717, 0x172c08b0, 0x07062307, 0x21012301, 0x1b1b6102, - 0x7a9c35e4, 0x5418022d, 0xf498fe27, 0x0d010efe, 0x6f728b01, 0x97acf702, 0x7c02d701, 0xb00594fb, 0x20208782, 0x18258782, 0x11004e04, 0x6c878200, - 0x05200ac3, 0x610b9547, 0x407a0c83, 0x05012208, 0x06594d0e, 0x0b4a0a20, 0x31302208, 0x27878201, 0x17323312, 0x22232607, 0x3a088984, 0x14e30133, - 0xcf5a7a14, 0x0c172743, 0x0d3b2220, 0xfed3f6fe, 0x6e01fb92, 0xbe016161, 0xc0162201, 0xfc2a3606, 0x003a04e2, 0xff5f0002, 0x06170576, 0x0013002e, - 0xb2550027, 0x85292805, 0x0805785e, 0x5e0c5466, 0x0626089f, 0x100db0d0, 0x058310b0, 0x881ab221, 0x17b02488, 0x1803b0d0, 0x820b407d, 0x369c8245, - 0x15070010, 0x00263523, 0x00103503, 0x15333537, 0x27110016, 0x82272634, 0x06062613, 0x16141515, 0x08138217, 0x3536364b, 0xf3fe1705, 0xfee8c6e9, - 0x120103ef, 0x01eac6e9, 0x7882fd0d, 0x848579c6, 0x8079c67b, 0xdafeb202, 0x7e238bfe, 0x7301237e, 0x01551d01, 0x237a0124, 0xfe237271, 0x06d9fe86, - 0x6023f5ce, 0xcff52361, 0x25fdc74c, 0xf6235f60, 0x26d582cf, 0x0488ff4f, 0x82b4043d, 0x002526d5, 0x2603b258, 0x20d58327, 0x09c95903, 0x580c9851, - 0x20820881, 0x1024d882, 0xd00db010, 0x200e4b5d, 0x20d88414, 0x26e9891d, 0x3130d01a, 0x84123413, 0x821220ce, 0x840220c4, 0x350222e2, 0x88c88201, - 0x08da84db, 0xbddd4f55, 0xdfddbfb8, 0xddbbb8bf, 0x5a525002, 0x4fb8505a, 0xb84f5658, 0x01da2702, 0x6d6e1f26, 0xddd8fe1f, 0xd9fedb11, 0x1f6c6b1d, - 0xfedd2601, 0x97b51ea7, 0x601fb282, 0x95b22160, 0x6821ae83, 0x00030000, 0x06ebff88, 0x003f07b5, 0x003d002a, 0xb2ba0046, 0x83484730, 0x103025cf, - 0xb0d009b0, 0x45200582, 0x51066744, 0x784c0cff, 0x0c49530c, 0x1b2f0b22, 0x7f058861, 0xb0210518, 0x0ffc5312, 0x2309d141, 0x120b1eb2, 0x23276a83, - 0x1013b0d0, 0x82d02ab0, 0x36b02e2b, 0x2f36b0d0, 0xb0d02cb0, 0x2bb22f2c, 0x114f1808, 0x2cb02a07, 0xd032b010, 0xb22f32b0, 0x2e138c39, 0x42b0d042, - 0xd046b02f, 0x302f46b0, 0x18320131, 0x2c07f35c, 0x26222306, 0x36341127, 0x06221533, 0x07565215, 0x11333f08, 0x32331616, 0x34113536, 0x15132326, - 0x022e2223, 0x15152223, 0x33343523, 0x01021e32, 0x33353736, 0x07061415, 0xf2cef404, 0xe3d0f101, 0xcee37272, 0xcff304f0, 0x5f66665f, 0x01f57269, - 0x09836871, 0x216a5a08, 0x30bf8a53, 0xeb866814, 0x6fc94625, 0x034129fe, 0x053b60a9, 0xfdddfab0, 0x9efbddea, 0x02d5f69e, 0xccfddd20, 0xedfd808e, - 0x77818e80, 0x79fe8201, 0x808e8073, 0x8e801302, 0x2386e301, 0x10680a4b, 0x4f0fdc22, 0x5287fe1a, 0x3167683c, 0x00001f78, 0xff740003, 0x05d105eb, - 0x067f41e3, 0x09b2af22, 0x25057f41, 0x3ab01009, 0x0582b0d0, 0x7f414620, 0x0c134d06, 0x3408484b, 0x00b01012, 0x2f00b0d0, 0xb0100bb0, 0x09b2d007, - 0x12110b12, 0x35744139, 0xb0d02d23, 0x0c74412d, 0x74412d20, 0x10362612, 0xb0d041b0, 0x0c744141, 0xc5531520, 0x08744108, 0x16141526, 0x37363233, - 0x2107d979, 0x74413535, 0x3a4d081d, 0xd401dcba, 0x6361c5b5, 0x04d3b2c2, 0x5b49bbdc, 0x5e504353, 0x5e01ec01, 0x5b544251, 0x5324bd49, 0x152cc18a, - 0x25eb8768, 0xfe70c546, 0xa9034130, 0x47043b60, 0xccf8cce5, 0xe09191e7, 0xcd0301c5, 0x7c75c3e7, 0x70757cf5, 0x6acaca6a, 0x2e0a8470, 0x2386e701, - 0x1068094c, 0x4e0fdc22, 0x4185fe1b, 0x02300770, 0xebff8800, 0x1107c106, 0x26001e00, 0x06b27d00, 0x20054369, 0x09c94a06, 0x570c9344, 0x042508e7, - 0x0806b2d0, 0x06b5650d, 0xaa431120, 0x100d2c09, 0xb0d015b0, 0x11b02f15, 0x821ab010, 0xb0102708, 0x1eb0d01e, 0x1782b02f, 0xb0d0252c, 0x26b02f25, - 0x2f26b0d0, 0xb64220b2, 0x83262009, 0x23b0226a, 0x20fe542f, 0x21352527, 0x23152117, 0x14065535, 0x0339fc27, 0xa6fe0155, 0x1b0e55b5, 0x7a7ae726, - 0x02007f7f, 0x21051355, 0xf184b105, 0xf18a8920, 0x59422520, 0x49f18406, 0x0e55076c, 0x2f1e240c, 0x4f1eb11b, 0xb2231c87, 0x55150806, 0xfd8910d9, - 0xb0d01f23, 0x20fd8c1f, 0xae4c181f, 0x11012108, 0x871c3e55, 0x144655fd, 0x039dfc27, 0xb2fe0438, 0x1b4e55b5, 0x7b7bfc22, 0x012efd82, 0x8cfe6600, - 0xc505b604, 0x53001800, 0x0f7c17b2, 0x180a200a, 0x200b3fa9, 0x200c8200, 0x10cb7600, 0xb0100a26, 0x0ab0d00e, 0x200cef7b, 0x0bbd5902, 0x01313032, - 0x00261123, 0x12341135, 0x00203324, 0x21102315, 0x08057144, 0x03331730, 0xffd3fb34, 0x01018d00, 0x010001a3, 0xddfefc1f, 0x8aa9a98c, 0x018cfe9f, - 0x47012066, 0xaf1101f9, 0xfe9b1801, 0x2601e9f7, 0xedfebcdf, 0x2482dfb6, 0xfe5c0029, 0x04f30389, 0x821a004e, 0x7e1920a9, 0x5d5f0a43, 0x20a9980c, - 0x18a9840f, 0x820ad8a3, 0x7c9718a9, 0x28a98509, 0x34353502, 0x32333636, 0xec431816, 0x1737080b, 0xf3d50233, 0xdb79d3b3, 0x6fc67c92, 0x715874e5, - 0x98707e82, 0x6a0189fe, 0xdc230120, 0x89fc9b1c, 0x5b76bb67, 0x1ba8bd7a, 0x0002bba1, 0x006d0001, 0x05930400, 0x8213003e, 0x0eb02101, 0x220a5859, - 0x82593e0f, 0x07052865, 0x13230325, 0x84053725, 0x03332103, 0x49080f82, 0x21015b02, 0xb5ddfe48, 0xdffee1af, 0xca250147, 0x0149defe, 0xe4acb923, - 0xfe4c2501, 0xacc101e0, 0xc1feaa80, 0x80ab8e01, 0xab6801ab, 0x4601ab82, 0x7fab6bfe, 0xfc0100aa, 0xffa20466, 0x00fd0539, 0x00110007, 0xb22f00b0, - 0x0f460603, 0x37678207, 0x21372715, 0xfd151727, 0x0201b117, 0x05b10122, 0xee017e20, 0x00dc016c, 0x73363782, 0x6dff1705, 0x0f001506, 0xb0002e00, - 0x07b02f0b, 0x2f07b0d0, 0x824300b2, 0x100b2c09, 0xb0d004b0, 0x0bb02f04, 0x880cb210, 0x08548216, 0x15153227, 0x23343523, 0x23070422, 0x24363335, - 0x88ee7ffe, 0xe2fe366a, 0x7927298b, 0x15061801, 0x681022dc, 0x01860177, 0x35658277, 0x16057bfd, 0x600672fe, 0x0c000500, 0x2f01b000, 0xb0d005b0, - 0x43822f05, 0x07333534, 0x7bfd0717, 0x523b01bd, 0x9684dc05, 0x01004470, 0x2b82a5fd, 0x2b879c20, 0x452f0321, 0x2b8205b2, 0x2737273a, 0xf7fd1533, - 0xbd013b52, 0x70441605, 0x08008496, 0xc4fe24fa, 0xaf05bf01, 0x1a385582, 0x35002700, 0x4f004200, 0x6a005c00, 0xb0007a00, 0x53b02f45, 0x2f60b02f, - 0x07d4b018, 0x18070b54, 0x2a0bf557, 0x10b01045, 0x1045b0d0, 0x47094cb2, 0x1726083d, 0x1053b0d0, 0x05831eb0, 0x895ab221, 0xd0252616, 0xb01060b0, - 0x2105832b, 0x168967b2, 0xb0d03226, 0x3fb21038, 0xa7821088, 0x32363422, 0x23083142, 0x33363401, 0x13200d89, 0x22200d88, 0x08ebb018, 0x26342323, - 0x8c0d8523, 0x860c8c35, 0x89268242, 0x3f348341, 0xbe7311fd, 0x30337074, 0xde01332e, 0x755f5d74, 0x2c2e3571, 0x5d754833, 0x3570745f, 0xcbfe335c, - 0x09821382, 0x332d2e24, 0x28874ffd, 0x744dfd22, 0xfe213286, 0x202887de, 0x83088235, 0x332d333b, 0x6854f304, 0x372e5468, 0xebfe3035, 0x55676854, - 0x09823431, 0x6755092a, 0x34315468, 0xf9fd2e37, 0x09831d83, 0x85e4fe21, 0x2e372327, 0x31881a05, 0x5521278a, 0x083b8567, 0xfa08002d, 0x0163fe4d, - 0x00c6058c, 0x00090004, 0x0013000e, 0x001d0018, 0x00270022, 0x21b0002f, 0x2f16b02f, 0xb02f12b0, 0x1bb02f0b, 0x4326b02f, 0x2e52051e, 0x0239080c, - 0x02b11b2f, 0x30593e11, 0x03170531, 0x27031323, 0x01033313, 0x25150537, 0x35250705, 0x25370105, 0x07010517, 0x03252705, 0x13370327, 0x07131701, - 0x0b50fe03, 0x3a46607a, 0x0804820c, 0x0d1d023c, 0xa6fe4d01, 0xfe0d75fb, 0x035a01b3, 0x4001029c, 0xfcdbfe44, 0xc0fe02f3, 0x2b260145, 0xc6419411, - 0x94116003, 0x0e3cc442, 0x6101adfe, 0x010ea204, 0xfea0fe52, 0x627c0c11, 0x04833b47, 0x10ae013c, 0xfcc84499, 0x4599118e, 0x02e402c8, 0xfe454601, - 0x02e3fcd5, 0x0147bbfe, 0x815a002b, 0x00622608, 0x001b0012, 0x12815a74, 0x7b0c1d47, 0x8e5a0c4b, 0x11b02107, 0x0bbb4918, 0x0d02b223, 0x082c7509, - 0xd00bb027, 0xb0d00cb0, 0x0c124a02, 0x221d845a, 0x5a153335, 0x05232084, 0x5afefd05, 0x05260584, 0xb2b2ab05, 0x825a90fc, 0x02002b07, 0x00009400, - 0xb005d904, 0xcf820e00, 0x04b24d22, 0x2005515b, 0x09d55f04, 0x670c7276, 0x162708a6, 0x12110103, 0x5816b039, 0x03200c6a, 0x340e2d5b, 0x21112311, - 0x14150432, 0x27071707, 0x36132306, 0x27263435, 0x3c128221, 0x01372737, 0x2d02fd91, 0x751f01f4, 0x79886d7a, 0x901cf9aa, 0x01c9fe7e, 0x733a4f30, - 0x5a9d186e, 0x77c13207, 0x37966487, 0x4a354301, 0xfe028d76, 0x64801604, 0x18ad8200, 0x2807798c, 0x00220013, 0x2317b26e, 0x05897b24, 0x4710b021, - 0x546806a9, 0x0cb6470c, 0x61620a20, 0x5e07200b, 0xb22306da, 0x82071009, 0x0eb22141, 0xb0210684, 0x0c786010, 0x4d550720, 0x8601200d, 0x272221c7, - 0x3322d782, 0x95183617, 0xd3820d69, 0x0436172c, 0x6f6a6e30, 0xb2705968, 0x8c18f36b, 0x462e0c85, 0x596e6a32, 0xf4120222, 0x78637a97, 0x8c187536, - 0x2136108c, 0x5867647b, 0x8f000100, 0x34040000, 0x07001007, 0x01b23200, 0x055b0908, 0x10085a0d, 0x31142071, 0x34043311, 0x02fd58fd, 0xe404f3b2, - 0xb0051cfb, 0x57826001, 0x00007e26, 0x73055b03, 0x2b205782, 0x7112336e, 0x11291d71, 0xfe5b0333, 0xeb01f316, 0x05b66bf2, 0x00390122, 0x9b2e5182, - 0x9d04c6fe, 0x1400b005, 0x0fb25b00, 0xa9841615, 0xcb430920, 0x0c087605, 0x2008c853, 0x0cb27f13, 0x83130321, 0x03b027dc, 0x1009b02f, 0x8f500ab2, - 0x10032109, 0x600a6965, 0x3a0805fa, 0x10110020, 0x32272300, 0x25023536, 0x11231123, 0xfd370421, 0x2201a860, 0xf6fe3c01, 0x888301f3, 0xbcabfe02, - 0x049c03fc, 0xfe5ffee4, 0xfeecfecd, 0xbad6fef4, 0x7b01c2b3, 0x8287fd09, 0x0001309f, 0x03e2fe7e, 0x003a04db, 0xb24a0015, 0x8417160b, 0x850a20a9, - 0xcb4818a9, 0x0836530c, 0xa98d1420, 0x820a1421, 0x20a98232, 0x095451b2, 0x152e9883, 0x15002033, 0x07060614, 0x34353627, 0x99842326, 0x46032208, - 0x01492bfe, 0x5e200101, 0xde5573ab, 0xf34e8e9b, 0x7603c802, 0xddfafee5, 0x1d8dc260, 0x81d44aae, 0x05ed5b97, 0x90000126, 0x36050000, 0x14229f82, - 0x637a6100, 0x0cb15212, 0x720cf85b, 0x0f2208bf, 0x97830c0a, 0xb22f0f26, 0x5d010f9f, 0x230a4676, 0x0f0801b2, 0x05311983, 0x100fb0d0, 0x30d012b0, - 0x21020931, 0x23152301, 0x08a38335, 0x33113327, 0x33153335, 0xfe0d0501, 0xfead017c, 0x41d3fec1, 0xfdfd59a3, 0x0137a359, 0xfdb0051b, 0x02f5fc5b, - 0xfde9e96d, 0x330b8293, 0x02fefe9a, 0x01000066, 0x00008e00, 0x3a04ae04, 0x5c001400, 0x5743ab85, 0x0c44410c, 0x0cab4e18, 0x59180320, 0xf67607cd, - 0x18b02005, 0x220c1075, 0x510901b2, 0xd022054a, 0xa6880eb0, 0xa68e0320, 0x04132608, 0x01c4fe94, 0xd8cbfe56, 0xf2579b2f, 0x279b57f2, 0xfd3a04cf, - 0x01c8fdfe, 0xfeb2b2ac, 0xfe3a0454, 0x01c7c750, 0x28a382b0, 0x06000034, 0x00b005a2, 0x074f410e, 0x4a0c5452, 0x4f410cc9, 0x2bca840c, 0xb2593e0f, - 0x11020608, 0x08b03912, 0x200ba976, 0x086e18b0, 0x0cb2230c, 0x40180801, 0x2b0809c3, 0x11213521, 0x01210133, 0xb6032101, 0x27fefcad, 0x018bd502, - 0xfe3601ad, 0xfe1f020c, 0xfd7002d0, 0xc4ec0490, 0x64029cfd, 0x09fd47fd, 0x3d269f82, 0xa8050000, 0x9f823a04, 0x43416b20, 0x0ce96e05, 0x950cbf4a, - 0x0a09219f, 0x09299f84, 0x092fb22f, 0x8cb27101, 0x0de87309, 0x0021a98e, 0x08a99409, 0xf27b4020, 0x88026afe, 0x012a016c, 0x0178fe2d, 0x01c5fea8, - 0x0354feac, 0x50fec476, 0xf9fdb001, 0xa982cdfd, 0x0000942a, 0xb0058307, 0x87000d00, 0x42124f5d, 0xeb5d0c99, 0x02012215, 0x06ee6406, 0x82019f21, - 0x016f21a4, 0xdf20ae82, 0x0f240483, 0xb2720101, 0x71221382, 0x0e823fb2, 0x012fb428, 0x7202013f, 0x24827cb2, 0x5602b021, 0xb0210baa, 0x0ee65301, - 0x21112124, 0x79752115, 0x33113905, 0x8b029101, 0x95fd6703, 0xfd75fdfc, 0x025203fd, 0x13fbc35e, 0x79fd8702, 0x26054760, 0x0500007e, 0x823a0466, - 0x5d6620bd, 0xd6621235, 0x20bd960c, 0x25bd830c, 0x2f01b07c, 0xfb69b418, 0x329cac05, 0x02a50171, 0xf3a3fe50, 0xf3f35bfe, 0xc3017702, 0x718afcc4, - 0x0027054d, 0xfe9b0001, 0x82ef07c4, 0x00162ca6, 0x1710b268, 0x39121118, 0x4407b000, 0x20640589, 0x6d49180c, 0x45002208, 0x8a531858, 0x01b22308, - 0x56410715, 0x07b02405, 0x4508b210, 0x49660932, 0x5615200d, 0x30230bd5, 0x45330131, 0x1126103e, 0x05211123, 0x40457d14, 0xfc91280c, 0x04fc7ffd, - 0x45410379, 0x89200e41, 0x82054346, 0xfe7e2cbb, 0x04ba06e6, 0x0018003a, 0x4e12b257, 0x72650623, 0x8c771806, 0xbf56180c, 0x45bb8209, 0xb2230752, - 0x85081701, 0x0add45bb, 0x6a17b021, 0x50450e6d, 0x09514509, 0x042fac83, 0x07017d0a, 0xab5d2c01, 0x69755573, 0x727f9aa5, 0x02310543, 0xdefbfe94, - 0x1d8ebf61, 0x678f28ad, 0x36fe9782, 0x05127803, 0x00020033, 0x05ebff67, 0x00c505d7, 0x00320025, 0x3316b285, 0x227b8334, 0x18b01016, 0x4907ad7a, - 0x1d240ca1, 0x1db11b2f, 0x27116e5e, 0x2f00b0d0, 0x1d0402b2, 0x18069949, 0x200c8082, 0x0f596ab0, 0x4418b220, 0xb027091c, 0x29b01002, 0x181db0d0, - 0x2b0dc0bb, 0x06272205, 0x02242223, 0x12343527, 0x27057353, 0x33121415, 0x11263732, 0x332d1082, 0x15111232, 0x33160710, 0x17161401, 0x08118236, - 0x2223266e, 0xd7051506, 0xb794b3df, 0xa9d4febb, 0x8ce17d03, 0xb2db7e66, 0xede22931, 0xbbf3c2b8, 0x8efd6a5c, 0x60a26365, 0x155e5458, 0x01ae4747, - 0xafc9bf36, 0xd4a11e01, 0xd7b8bde1, 0xcb07f9fe, 0xf0cb4401, 0xbffe3501, 0xfec6fafe, 0x0214cada, 0x48d58419, 0xd509018f, 0xa1afabae, 0x61000200, - 0xc904ebff, 0x22004e04, 0x8c002e00, 0x302f04b2, 0x5d063359, 0x0b2207b9, 0x11751b2f, 0x821a2009, 0x501a200c, 0x002014de, 0x00271982, 0xb2593e0f, - 0x411a0402, 0x0b200624, 0x680c6f64, 0x00240dd3, 0x0322b210, 0x29086e4d, 0x25b01002, 0x101ab0d0, 0x27522bb2, 0x31302108, 0x26052441, 0x34351100, - 0x56153312, 0x3322059a, 0x88182637, 0x15280728, 0x33160714, 0x36171401, 0x5e081082, 0x06222326, 0xbac90415, 0xe5907a93, 0xaadbd4fe, 0x7d9a4b40, - 0x94b68f25, 0x4d81bd96, 0x780efe58, 0x32313d63, 0x3936123b, 0x04014201, 0x0c01cf42, 0x7b9404ca, 0x02cca649, 0xbb7ae295, 0x77cdffea, 0x011194d3, - 0x636caa8f, 0x876b7ba9, 0x01006a78, 0xa1fe2d00, 0xb005b706, 0x4f000f00, 0x430db000, 0x7c630592, 0x07254211, 0x080b7318, 0x52180220, 0x05240cd6, - 0x100eb0d0, 0x080bca7e, 0x30d00a2b, 0x35210131, 0x11211521, 0x11331121, 0x11230333, 0xfe8d0121, 0xfebe03a0, 0xfc81029f, 0xfbe714b0, 0xc4ec04d1, - 0x04defbc4, 0xff4218e6, 0xfe262609, 0x043a05bf, 0x208b823a, 0x578b884b, 0x0f200c2f, 0x07075f18, 0x34450320, 0xd000230c, 0x7e8c0fb0, 0xb0100328, - 0x06b0d008, 0x8784b010, 0x87822320, 0x87887f82, 0x02f51b25, 0x7301dbc3, 0x032606bf, 0xfdc3c377, 0xc173034b, 0x00802c0a, 0x05e10400, 0x001800b0, - 0x4305b24f, 0x551806ef, 0x084108ef, 0x0cd75f07, 0x29071541, 0x000e05b2, 0xb0391211, 0x7e832f05, 0x4b180520, 0x11290c6a, 0x013130d0, 0x16171611, - 0x21878217, 0x04823736, 0x06112323, 0x05845e07, 0x01113e08, 0x354f027d, 0x646ca36e, 0x7060fdfd, 0x01faf6a3, 0x2cfeb005, 0x05273998, 0xdcfe2b01, - 0xa702190a, 0x3c0250fa, 0xe5eb0a18, 0x01dfea06, 0x000100cd, 0x03000074, 0x003b04f5, 0xb2510016, 0x064f4506, 0xa053a383, 0x0cf2450c, 0x2108be4c, - 0xee5b010f, 0x2f0f2205, 0xf9551818, 0x04b0210a, 0x20083349, 0x20988a21, 0x86b18233, 0x032708af, 0x3145f3f5, 0x01beb6a3, 0xa38201f2, 0x01f33b3b, - 0x8a050e69, 0xb1d0138b, 0xb0fe5001, 0x0b011fac, 0x0e06effe, 0x82000c02, 0x00852c9d, 0x05e50400, 0x001100b0, 0x5a05b246, 0x83840a65, 0x5f074141, - 0x1f4e0cfa, 0x05b22207, 0x06414101, 0x220a9c63, 0x83333130, 0x20332283, 0x06b66204, 0x1107222a, 0xb2a0fc85, 0x0c010501, 0x08cd4418, 0xc3fd2208, - 0xfee9e629, 0x8bd00133, 0x59fd2a76, 0x00020000, 0x05e9ff16, 0x00c405bc, 0x0024001c, 0x2516b264, 0x060b4526, 0x2307ed43, 0xb11b2f0e, 0x08927418, - 0x2208d343, 0x830e001e, 0x2f1e2227, 0x0a2d53b2, 0xb0d00428, 0x0ab0101e, 0x5718b0d0, 0xb0210cbe, 0x0d74610e, 0x0020052e, 0x26263511, 0x17143335, - 0x17241234, 0x6b080d82, 0x14152115, 0x37323316, 0x01060617, 0x26343521, 0x03062223, 0xfed2fedc, 0xb5a79baa, 0x0801948d, 0x0108019e, 0xcb98fc22, - 0x31acb1bd, 0x05fed843, 0x949a6c02, 0x0117b08e, 0x3c2b0154, 0xb6aad418, 0x1c01ae2a, 0x9cfe01a0, 0x3584b9fe, 0xc546d7ca, 0x6c032e28, 0xddc0b81f, - 0xcbff0200, 0x8b04ecff, 0x1a004e04, 0x8c002100, 0x232220b2, 0x2020b583, 0x4a09675a, 0xdd880ca8, 0x0d001c22, 0x1c332783, 0x1cbfb42f, 0x5d021ccf, - 0x6f1c5fb4, 0xb471021c, 0x822f1c1f, 0x8fb22806, 0xb45d011c, 0x83ff1cef, 0x4711200b, 0xfe820967, 0xfe871c20, 0xb6441520, 0x17b22108, 0x0d214c85, - 0xb9ab1810, 0x2205240c, 0x41272724, 0x36280505, 0x12323324, 0x16211511, 0x08090341, 0x22262631, 0xd4d80206, 0x0314e6fe, 0x68a98682, 0xbb07011f, - 0x3dfdf1dd, 0xa8779d0b, 0xda418467, 0xcf016dfe, 0x7aca7208, 0x32d1fb14, 0x9593c11d, 0x18f3c530, 0x360a5ea1, 0x7a129602, 0x00008c7d, 0xfe900001, - 0x05ed04bf, 0x001600b0, 0x4215b266, 0x102006ff, 0x1805bc44, 0x440c5453, 0x0f3a11c9, 0x07b2593e, 0x12110204, 0x07b07c39, 0x00b4182f, 0x02071007, - 0xd00ab05d, 0x3f4810b0, 0x07b0240b, 0x8816b210, 0x313022ea, 0x8a791801, 0x16400809, 0x00101500, 0x11202723, 0x01212502, 0xfdfd0895, 0x01b20171, - 0xe922fe32, 0xf0fe0001, 0x090101f4, 0xfeaefe02, 0xfd7102f8, 0xfdb0058f, 0xfd5c02a4, 0xd7fe1f8a, 0xfef3fef9, 0x6f01c2d3, 0x00067a01, 0x8e26bf82, - 0x4304eafe, 0xbf823a04, 0x0db25922, 0x0f49bf86, 0x0c7d5d06, 0x6e0ccf43, 0x14220887, 0xbf840f15, 0xbf821420, 0x50144025, 0x435d0214, 0xb2230a2d, - 0x4b0e1400, 0x16210501, 0x06a54d16, 0x26342723, 0x08bf8827, 0xafcd0222, 0x73aa5ebc, 0x8d02e055, 0xf2f2ae8b, 0x01410155, 0x2961022d, 0xba60ade3, - 0x47ad1c88, 0x098576ca, 0x21055e4c, 0xa983b001, 0x4bfe9b2c, 0xb0051305, 0x74001400, 0x5b180ab2, 0xf15b0aa7, 0x0c28510c, 0x18084d4e, 0x260856b0, - 0xb2593e11, 0x84120002, 0xe96818b3, 0xdaa21810, 0x02b0210d, 0x6e0b5057, 0x14200798, 0x09fe7018, 0x11212508, 0x97011123, 0xbefd7f02, 0x0e3c45a9, - 0xfd7b3e24, 0xb005fc81, 0x7d0283fd, 0xc6b718fa, 0xba0cc711, 0x97fd9802, 0x2506114b, 0x09044bfe, 0xbb823a04, 0x0bb26d22, 0x0e79bb8f, 0x20bb9614, - 0x25bb8903, 0x02500240, 0xb4a35d02, 0xb48e0620, 0xa501713f, 0xa6ba01f3, 0x270f3a45, 0x5bfe7c3b, 0xfe3a04f3, 0xfbc3013d, 0x11c1b385, 0x01c00dbf, - 0x2cac82e7, 0x0200003a, 0xebff5100, 0xc4051e05, 0xc5711800, 0x0745451c, 0x1b2f0829, 0x3e0f08b1, 0x720db259, 0x0d23055e, 0x5800b02f, 0x71180c92, - 0x0d220dc5, 0x625db210, 0x31302a09, 0x11002001, 0x04021415, 0x18078227, 0x350ac276, 0x37363201, 0x16141521, 0x40017102, 0xfea06d01, 0xdcfea9e3, - 0x7618bdfe, 0x3e0808c2, 0x2901a61b, 0xfd12be96, 0xc405ba2f, 0xb6fe8cfe, 0xc2fec16b, 0x600101b1, 0xe0894901, 0xc61334f0, 0xfcfa4a0d, 0xb91fbdda, - 0x010000bf, 0xebff5b00, 0xb0054b04, 0x6b001b00, 0x1d1c0bb2, 0x4d391211, 0xb15c125a, 0x0c564808, 0x0204b223, 0x232f8200, 0x020b1bb2, 0x7c290682, - 0x182f1bb0, 0xb2d005b0, 0x210e8410, 0x434b0bb0, 0x1bb0240b, 0x4419b210, 0x7b4808b0, 0x01172705, 0x14151616, 0x72772304, 0x35330809, 0x23232634, - 0xfdff0235, 0x01910392, 0xdac886fe, 0x8beae5fe, 0x87fc7ee2, 0x99907968, 0xe4048c91, 0x4ffea3cc, 0xc5c2ea18, 0x83bf67e8, 0x647f805f, 0x83ac8594, - 0xfe5d26c3, 0x04460475, 0x20c3823a, 0x20c3885c, 0x056d440b, 0x1b2f0227, 0x3e1b02b1, 0x79421859, 0x04b2220a, 0x86af8300, 0xc4b582b6, 0xf45208b4, - 0x8c039bfd, 0xcb88fe01, 0xebeafed7, 0xf37be489, 0x947a6c89, 0x038f939a, 0xfe9bc476, 0xbfe91943, 0xbf68eac2, 0x80856081, 0xab839669, 0x3400ffff, - 0x89044bfe, 0x2600b005, 0x0052b000, 0xde012600, 0x070029a4, 0x3501af01, 0xffff0000, 0x49fe2d00, 0xd182a203, 0xeb00262c, 0x27000055, 0x9dffde01, - 0x1f847aff, 0xfeff0b25, 0x82000200, 0x83042132, 0x0b283d82, 0x50001400, 0x161504b2, 0x7b06294b, 0xc9470742, 0x08ec500c, 0x03010022, 0x20058b6f, - 0xf06218b0, 0x00b0210c, 0x2b0ed679, 0x21113311, 0x35262622, 0x01372434, 0x2d080982, 0x16141506, 0xfd860317, 0xee9ddafd, 0xeb150180, 0xd7fe3401, - 0x798b927c, 0x15029b03, 0xd47450fa, 0x03fccc88, 0x06022ffd, 0x91747589, 0x9d820003, 0x00006824, 0x9d82b006, 0x21001826, 0x07b26000, 0x2405fb46, - 0x19b01007, 0x586b18d0, 0x08fb4612, 0x00080727, 0xb0391211, 0x0e807507, 0x8511b221, 0xd0192317, 0x1d4307b0, 0x19b02a0b, 0xd021b010, 0x22213130, - 0x20a88324, 0x2eb48221, 0x37363633, 0x33272636, 0x06071616, 0x87250706, 0x720224ba, 0x84e2feec, 0xfc3308b7, 0x056c5e4b, 0xf51d2102, 0x0402261f, - 0xb1feccf3, 0x907dd6fe, 0xd3fd7a8e, 0x0203face, 0x021afb15, 0xd94a7d8a, 0x45cc5e4c, 0xca03fcd4, 0x748a0602, 0x82019275, 0xff5e31cf, 0x067f06e7, - 0x001f0018, 0xb283002b, 0x112d2c19, 0x7e82a782, 0xcf862a20, 0x1b2f0624, 0xd97106b1, 0x0c104b07, 0x5b181820, 0x032115e4, 0x20418318, 0x0cfa6f18, - 0x14841020, 0x841ab221, 0x03b02106, 0x220bba48, 0x18101cb0, 0x200c9d84, 0x07b57f13, 0x84160621, 0x332733f2, 0x0e071617, 0x27042302, 0x02222306, - 0x23260127, 0xd8480622, 0x27610805, 0xa3c3e45e, 0x4e02f365, 0x04827443, 0x17ec4004, 0x7d02032f, 0xfffe8ce2, 0xb9cb6b55, 0xae020be0, 0x7f738347, - 0x458d767a, 0x010e0206, 0x7836010a, 0x4ffb4202, 0xb702694f, 0x59d5bea9, 0xf9a883b7, 0xb3b70485, 0x01de0501, 0xcdc16851, 0x4472aa9e, 0x3c000100, - 0xe305e7ff, 0x2900b005, 0x23b26300, 0xd752182a, 0xff4e1809, 0x08ff710c, 0x092a0122, 0x20065f4f, 0x08ae4700, 0x1809b021, 0x200ebb63, 0x22228301, - 0x48b21022, 0x1a210abc, 0x23378322, 0x35133130, 0x2a05db68, 0x16213521, 0x07141504, 0x88151316, 0x841620f5, 0x26063bf5, 0x26343527, 0x93a7e623, - 0xfef3fe84, 0xfa6401a5, 0xf6ff0601, 0x333c0105, 0xf3827265, 0x1af53108, 0x7a02022b, 0xb2a78ada, 0x02677c08, 0x6d01cd62, 0x01cdd175, 0x64e6ccd3, - 0x4dfefe3f, 0xb6024939, 0x62d5bea3, 0xf8a967ca, 0xaaa70485, 0x007e6e3e, 0x2f2de382, 0xfe04e2ff, 0x24003a04, 0x0fb26000, 0xdf901825, 0x2f1d2409, - 0x461db11b, 0x564c0799, 0xb6421808, 0x07b22309, 0xcb821d0e, 0x2516b222, 0xb0240683, 0x14b22f16, 0x2108f544, 0x5b181db0, 0x22220c62, 0x29821614, - 0x25313023, 0x06c34106, 0x0622cd82, 0xcd842306, 0x27232326, 0x34353633, 0x45080682, 0x10161621, 0x03171607, 0x5a4e0201, 0x41040360, 0x01182dec, - 0x9ebce904, 0xe6a208a0, 0xcbb9c202, 0x140106ff, 0xb9b0e4cb, 0x0258eb06, 0xa9967f8f, 0xcc398086, 0x837103f2, 0x04bd7f48, 0x02c39683, 0x4acafea6, - 0xd182ac30, 0xbafe482e, 0xb0053704, 0x5f002200, 0x24230bb2, 0x00227a82, 0x234517b0, 0x0cb84105, 0xe1821b20, 0x3e0f1b27, 0x0901b259, 0x26b8411b, - 0x4b101b21, 0x30220a8b, 0xbb821331, 0x2122bc82, 0xb1412721, 0x15332908, 0x27070614, 0x23373636, 0x0805ab41, 0xce01973b, 0xebfe8191, 0x0103eafe, - 0x0301ef2e, 0xcd03e3e4, 0x24835a64, 0x3ca30838, 0x02747e03, 0x7301c35c, 0x03c3eb6f, 0x66dfc9dc, 0x86f6fe47, 0x4bd863ac, 0x4977394d, 0x7184b131, - 0x26cb8285, 0x04a9fe74, 0x843a041a, 0x860620cb, 0x8a1820cb, 0x07a041cb, 0x08ea4d18, 0x1c090122, 0x8e41cb87, 0x0d844209, 0x01001022, 0x1c202283, - 0x840bb546, 0x353224cb, 0x82232634, 0x173228cb, 0x07141516, 0x8d151716, 0x233808cc, 0xd2e101b3, 0xe1fe636b, 0xe3200104, 0xb1ad6a78, 0x5568bb02, - 0x06382683, 0xc3012ba6, 0x8eb39b01, 0x64c1534a, 0x4f9e9259, 0xac24c33c, 0x4d47da65, 0x1e4f7e3d, 0x00a65483, 0x4226c782, 0x7f07ebff, 0xc782b005, - 0x00b26222, 0x5a18c786, 0x41480834, 0x2f1f2807, 0x0f1fb11b, 0x18b0593e, 0x200cf945, 0x0cdf4f0d, 0x210c7c68, 0x8f411fb0, 0x17b2230b, 0xd8820d1f, - 0x01313030, 0x02020321, 0x35230706, 0x13363637, 0x59652113, 0x36372305, 0x45433327, 0x22460805, 0x07043526, 0x0e1861fe, 0x4a9cb961, 0x0f687a28, - 0x4c8e031c, 0x047f6e3f, 0x1cf64104, 0x7f020229, 0xc6c38ce0, 0xe0fde304, 0xd3fef6fe, 0x03ca028a, 0x1c01df09, 0xbcfbdf02, 0xa7b46452, 0xc766d8bb, - 0x84fba766, 0xd582bdc1, 0xebff402a, 0x3a045a06, 0x62002100, 0x4506f74c, 0xee4e05f5, 0x821e200c, 0x871e20d5, 0x7e0520d5, 0xb0210601, 0x20d58c0c, - 0x2b6f1805, 0x4b1e200c, 0xb2230bfe, 0x880c1e16, 0x20d482d5, 0x20d48227, 0x24d48237, 0x32331616, 0x45d48336, 0x45080510, 0x03272622, 0x13f7fe17, - 0x53ada811, 0x49503202, 0xe102140a, 0x58455101, 0x40040467, 0x033016ec, 0x7dc77002, 0x0301c7c2, 0xfe9afe74, 0xca03f4e9, 0xe5ad0b05, 0x2bfdce01, - 0x99a06452, 0xb150c8b5, 0x7ce69b7c, 0xd382b9be, 0xe7ff942d, 0xb0058607, 0x65001d00, 0x7d1e14b2, 0x654b093b, 0x8219200c, 0x6e1920c6, 0xe0870c33, - 0x19821120, 0x0c821120, 0x4504b221, 0xb2230803, 0x82170009, 0x1cb221c1, 0xb0210684, 0x4783181c, 0x3130240b, 0x45141101, 0x06240dda, 0x21352726, - 0x08053070, 0x0a051131, 0x7e703e4d, 0xf6410404, 0x02032f17, 0xbb8ee27c, 0x82fd09c3, 0x7e02fcfc, 0xbcfbb005, 0xb3026056, 0x59d8bba6, 0xf7a883b7, - 0xc3c00487, 0x4b97fdff, 0x0020057f, 0x772ec782, 0x5c06e3ff, 0x1c003a04, 0x1bb27800, 0xc55b1e1d, 0x0f4b180d, 0x200c870c, 0x20ba8202, 0x20c78702, - 0x200c821a, 0x220c821a, 0x4d0807b2, 0xd02909a1, 0x0207e007, 0x0740b45d, 0x49068250, 0xb0210a67, 0x0b56481a, 0x8412b221, 0x87da8232, 0x113321c6, - 0x080ec845, 0x03030439, 0xf350fe1a, 0xf3b001f3, 0x5e465202, 0x40040364, 0x022b1aeb, 0x7ec77002, 0x01138afe, 0x0446feba, 0x0143fe3a, 0x522dfdbd, - 0x91a60266, 0xbf5dceaf, 0x7ce69b61, 0x82840108, 0xff5d2ed9, 0x05bb04eb, 0x002100c5, 0x2200b247, 0xf5a71823, 0x10d3500d, 0x4d100921, 0x6a180a91, - 0xb2210d2f, 0x06a1581a, 0x24220528, 0x34112702, 0x3e6b2412, 0x41152007, 0x3f080e94, 0xfeacbb02, 0x9a029beb, 0xdfad1701, 0xa2863f88, 0x9ec4c59d, - 0x0303837d, 0x1327f535, 0xea810201, 0x18019c15, 0xaf0f01ad, 0x599e1d01, 0xbce744b8, 0xe9b600ff, 0x95748502, 0x5858b1cc, 0x006ecd8b, 0x552eb582, - 0xe703ebff, 0x1e004e04, 0x13b24400, 0xb588201f, 0x0c104218, 0x47089569, 0xb2230941, 0x82130b05, 0x13b0212c, 0x2d0d807e, 0x37363625, 0x16332734, - 0x23060607, 0x2f640022, 0x05fb6b06, 0x15153608, 0x5a021614, 0x13024551, 0x04021deb, 0xfee7b5d2, 0x92e27ce2, 0x632e60bb, 0x948b728a, 0x474302af, - 0x528c6777, 0x3101b0a0, 0xfa971ef8, 0x3abd428b, 0x9a20a4bd, 0x2ca382bf, 0x05e7ff21, 0x00b0055a, 0xb24d0019, 0x996b1805, 0x58452207, 0x0ccc76b0, - 0x08fb6f18, 0x270c214c, 0xb0d004b0, 0x16b0d005, 0x0c988718, 0x02160e22, 0x2306ba43, 0x21152135, 0x44095341, 0x062a0587, 0xe3012726, 0x80043efe, - 0xe5423efe, 0xf5200806, 0x02032b1b, 0xbb8ce27d, 0xe30409c3, 0x87fccdcd, 0xb6026054, 0x62d8bba3, 0xf9a867ca, 0xc3c00485, 0x4428a382, 0xcb04e3ff, - 0x17003a04, 0x1821a383, 0x0dc54c19, 0x230c1d67, 0xb0593e0f, 0x1520a393, 0x1520a38d, 0x3308a398, 0x04230606, 0xfe890103, 0xfe8b03bb, 0x5e4552ad, - 0x40040363, 0x01192ceb, 0xfec2f104, 0x77031389, 0xf0fdc3c3, 0x84026454, 0x7c9e9374, 0xf2cc377e, 0x00840108, 0x812ea182, 0xff04ebff, 0x2800c505, - 0x26b27300, 0xa1882a29, 0x1b2f1622, 0x099aa118, 0x2008e941, 0x09274403, 0x0b162422, 0x7c2b2c82, 0x182f24b0, 0x012473b2, 0x8360b25d, 0x09d65704, - 0x0306b223, 0x23208225, 0x242510b2, 0x18054053, 0x230af749, 0x1e241bb2, 0x35056b41, 0x32331614, 0x14333536, 0x20230406, 0x25343524, 0x34352626, - 0x4b662124, 0x1458080a, 0x23153321, 0x7f010622, 0xae8699b7, 0xfdfe8dfc, 0xfef3fea0, 0x760e01bf, 0x012f0182, 0x8bfa9709, 0x907ca3fd, 0xb63301aa, - 0x01a39dbf, 0x817e6598, 0x69be825e, 0x57fdc4e9, 0xc562a631, 0x77ba69db, 0x63737559, 0x0070c8d9, 0x67000200, 0xd6026f04, 0x0500d705, 0x1b000d00, - 0x2709c565, 0xb0d001b0, 0x0bb02f01, 0x0806c065, 0x0131303b, 0x03153313, 0x15330123, 0x26071716, 0x70930135, 0xfe5de6d3, 0x4c03b1d4, 0x9804b050, - 0xfe153f01, 0x5f5401c1, 0x5a48467b, 0xffff00be, 0x09024700, 0xcd025402, 0x11000600, 0x2f0f9300, 0x046d029d, 0x00310399, 0xe0970146, 0x40cd4c00, - 0x81242383, 0xd1056d02, 0x85231385, 0x84666600, 0x04210813, 0x99033ffe, 0x27000000, 0x01004300, 0x0601fefe, 0x00014300, 0xb6001c00, 0x02100200, - 0x5d030220, 0x270683b4, 0x80b67102, 0xa0029002, 0x30330f82, 0x00010031, 0x01200463, 0x001a0696, 0xb21d0008, 0x410a0908, 0x002708bf, 0x00b11b2f, - 0x66593e21, 0xd3820594, 0x07061739, 0x36352315, 0x7c1a0136, 0x01d5035b, 0x4d1a0667, 0x8a989085, 0x8200d160, 0x04332645, 0x06650100, 0x20459000, - 0x20458204, 0x3d458304, 0x00b0d000, 0x1331302f, 0x35373627, 0x06141533, 0x035a7caf, 0x000469d5, 0x9e92834d, 0x4384678a, 0xd6fe3226, 0xca006401, - 0x18204382, 0x09248988, 0x0d04b22f, 0x86096067, 0x0606323e, 0x03557bad, 0xfe6601da, 0x947f4ed6, 0xd05d8593, 0x20838200, 0x2083824a, 0x2083847c, - 0x0a8e4d16, 0x3808c28b, 0x07171615, 0x35352626, 0x5a031f01, 0x06694d7c, 0x868f9e00, 0x67d13e4d, 0x00ffff8a, 0x0220046c, 0x001a06ef, 0x096c0126, - 0x01070000, 0x0059016c, 0x00ffff00, 0x02000440, 0x235582c0, 0x0d6d0126, 0x24081783, 0x005b016d, 0x00020000, 0x02c2fe32, 0x00ff00aa, 0x00120009, - 0x130bb221, 0x39121114, 0xb0100bb0, 0xb000d005, 0x22b58b13, 0x88d00eb0, 0x070623f7, 0x01411706, 0x7fb12107, 0x3739c283, 0x587ff831, 0xfe66da04, - 0x9d894ec2, 0x726cbac9, 0x8e4e4164, 0x63b6cb96, 0x27d182dd, 0x04000040, 0x00b0051e, 0x15917a18, 0x2022ce5e, 0x0c77480a, 0x82d00421, 0xaebe189d, - 0x33113a09, 0x1e042111, 0xfef388fe, 0xf373018d, 0x72037801, 0x72038efc, 0xfe7601c8, 0x247b828a, 0x0460fe5c, 0x207b8239, 0x07e37b13, 0x5f0c865e, - 0x4a180c3d, 0x02250c17, 0x02b11b2f, 0x06d64911, 0x180c6b57, 0x2008494f, 0x08044406, 0x100eb022, 0x2a0a4661, 0xb0d009b0, 0x11b0d010, 0x1806b0d0, - 0x27086563, 0x23112121, 0x21352111, 0xb0820384, 0x09821520, 0x83390421, 0x018e23b4, 0x0382fe72, 0xfe2bb882, 0xfe780188, 0xc2a00160, 0x83c4b402, - 0xfdc423bd, 0xc182004c, 0x06028839, 0xdb034402, 0x16000d00, 0x0f0e03b2, 0x00391211, 0xb12f03b0, 0x182b0a0a, 0x2109ad9b, 0x9a183233, 0x2d08077c, - 0x64798827, 0x67777867, 0x03027963, 0x79795f03, 0x775e2562, 0xff005d73, 0xff8a00ff, 0x016f03f5, 0x00260000, 0x00000312, 0x01120007, 0x178600cd, - 0x88280521, 0x85272017, 0x221f8317, 0x83008603, 0x02472e7f, 0x02210109, 0x000300cd, 0x0400b218, 0x487f8605, 0x29080a48, 0x23013130, 0x21013335, - 0x0902dada, 0x060000c4, 0xecff4a00, 0xc4055f07, 0x23001500, 0x34002700, 0x4e004100, 0x28b2b800, 0x3b82504f, 0x1028b025, 0x83d002b0, 0x841b2005, - 0x84262005, 0x84352005, 0xd0472505, 0x2f24b000, 0x4907d867, 0x58540cae, 0xd0032108, 0xb223fc82, 0x83120305, 0xd007314b, 0xb02f07b0, 0x0eb01012, - 0x2f0eb0d0, 0x031210b2, 0x2306f94f, 0x20b0d020, 0xb2221883, 0x7543022b, 0x03b02407, 0x8932b210, 0x102b290d, 0xb0d038b0, 0x3fb01032, 0x10222a82, - 0x198945b2, 0xb2101923, 0x820d884c, 0x183420db, 0x200732b4, 0x098b6f15, 0x69013521, 0x1184059a, 0x01352626, 0x03170127, 0x2605c245, 0x22263435, - 0x8b051506, 0x8b01200c, 0x032b080c, 0x9688ac2f, 0x86954e4e, 0x978aa9af, 0x8a944e4e, 0xa81bfdac, 0xabab8a85, 0x01aa8588, 0xc7027d77, 0x3e4fb07d, - 0x7c4e4a40, 0x86c7014d, 0xfb340808, 0x3e3f4d4e, 0x4b7e4d4c, 0xaa826501, 0x8ca76f6f, 0x6eaa8147, 0x0386aa6e, 0xaaaa837b, 0xa9824689, 0x1bfc89a9, - 0x48720448, 0x574438fc, 0x464b4c52, 0x4a4a5454, 0x21080988, 0x5545ea02, 0x46484955, 0x00495756, 0x6c000100, 0x33028a00, 0x0600a903, 0xb0001000, - 0x02b22f05, 0x835d0507, 0x37e98205, 0x35012313, 0x3c013301, 0xe0fea7f7, 0x02a72001, 0x0171fe19, 0x86011386, 0x54203783, 0x1b203782, 0x00233787, - 0x7b03b22f, 0x033d0537, 0x1331302f, 0x23011501, 0x01fb0313, 0xa7e0fe20, 0xa903f7f7, 0xfe137afe, 0x018f017a, 0x306f8290, 0x036d002d, 0x00270571, - 0x00090003, 0xb02f00b0, 0x24308202, 0x17012737, 0x20ea83aa, 0x34b5836d, 0x00ffff00, 0x02930235, 0x03a805be, 0x00d80107, 0x00930200, 0x05f94413, - 0x2308f94e, 0x3130d00d, 0x692c8583, 0xff028c02, 0x0f00ba05, 0x0ab25300, 0x4b0a0776, 0x4d570ce7, 0x2f0d250c, 0x130db11b, 0x2006c743, 0x200c8207, - 0x230c8207, 0x0d0301b2, 0x0323f583, 0x5e0ab210, 0x302e085a, 0x36170131, 0x11112033, 0x23261123, 0x06820722, 0x2001013c, 0x0301904b, 0x637d05c5, - 0xac05c527, 0xc9fe8779, 0xda0109fe, 0xd2fd59ad, 0xdb822003, 0x00005f2e, 0xc3057c04, 0x8e002700, 0x29281fb2, 0x20087346, 0x20668217, 0x07d34a17, - 0x0c820620, 0x3e0f0627, 0x0627b259, 0x24218217, 0xb22f27b0, 0x085e420d, 0xd001b025, 0x181006b0, 0x270a7a60, 0xb0d009b0, 0x10b01027, 0x232f0584, - 0x2f23b0d0, 0x1f230fb6, 0x03232f23, 0x8925b25d, 0x82112036, 0xb0102619, 0x17b0d014, 0x0c4e4810, 0x481e2321, 0x2127054e, 0x21071417, 0x18352107, - 0x220879ab, 0x18333523, 0x080f7dab, 0x21172137, 0xd0fe3203, 0xb8024002, 0x52e7fb01, 0xa5022b27, 0x979c04a0, 0x9601fa05, 0x5f69f5e8, 0x01066758, - 0x05c6fe3f, 0xd4013501, 0xca55872e, 0x5b6f09ca, 0x90799137, 0x8cab18a1, 0x90a13c07, 0x00050079, 0x06000021, 0x00b0054f, 0x001f001b, 0x00260023, - 0xb2bd0029, 0x822b2a0a, 0x0ab02586, 0xd01fb010, 0x21200583, 0x26200584, 0x28210584, 0x9f7d18d0, 0x0c304112, 0x1b2f0c24, 0xd14c0cb1, 0x82092007, - 0x8209200c, 0x05b2230c, 0x1a5e1a09, 0xd0012b06, 0xb22f01b0, 0x5d01010f, 0xbc4103b2, 0x05b02408, 0x8907b210, 0x8225200d, 0xb0d0236b, 0x1682d00e, - 0xd01db023, 0x2c8082b0, 0x03b0d011, 0xd01eb010, 0xb0d022b0, 0x3c418212, 0xd019b010, 0xb0d027b0, 0x09b0d015, 0xd024b010, 0xb01017b0, 0x3130d029, - 0x23153301, 0x2a038215, 0x21012311, 0x23112311, 0x82353335, 0x33112103, 0x33210d82, 0x2c0b8201, 0x23273305, 0x01233501, 0x77052733, 0x260082d8, - 0xfec9fefd, 0x82d3fcad, 0x01fc3e00, 0xfb570135, 0xf39471fe, 0x5fee67fe, 0x2f8c028f, 0x2b2ba3fd, 0x97a0c503, 0x0112fea0, 0x820383ee, 0x0122080a, - 0x0115feeb, 0x97defceb, 0x7efe9797, 0x44d7014b, 0x98000200, 0x3a06ecff, 0x1e00b005, 0xa2002500, 0xf37621b2, 0x10212105, 0x2408996a, 0xb11b2f15, - 0x074f4215, 0x0c821920, 0x8e181920, 0x416714ab, 0x8213200c, 0x0f132426, 0x18b0593e, 0x180db88e, 0x2a154073, 0x151320b2, 0xb0391211, 0x73b22f20, - 0x1d290a7e, 0xd01cb010, 0xb02f1cb0, 0x0b197815, 0x01313022, 0x0c137618, 0x0606232d, 0x23112307, 0x16322111, 0x82113317, 0x015c0801, 0x34113233, - 0x33062327, 0x263f32bf, 0xfe4d532f, 0xf41c78e8, 0x01fa9eca, 0x18fdd48c, 0xfbbff275, 0xe6f4925f, 0xfd8603a0, 0x0a383da4, 0x350117bc, 0xbbad6502, - 0x05e5fd03, 0x01b3c3b0, 0xfef9fe07, 0xf70001ad, 0xffff0006, 0xecff9400, 0xb0053c08, 0x36002600, 0x07000000, 0x72045700, 0x35200784, 0x53200c82, - 0x1f321782, 0x27002300, 0x2e002b00, 0x34003100, 0x32b2eb00, 0xc5833635, 0xb0103225, 0x82b0d01e, 0x84222005, 0x84272005, 0x842a2005, 0x842e2005, - 0x18302005, 0x2413236c, 0xb11b2f1f, 0x0764411f, 0x0c821b20, 0x0c871b20, 0x51086578, 0x0f2608fb, 0x09b2593e, 0x6c830210, 0x9c700920, 0x0fb22706, - 0xb05d0105, 0x8842d001, 0x4409200e, 0x21080b61, 0xb0d02db0, 0x30b0d00e, 0xd012b0d0, 0xb01009b0, 0x29b0d025, 0xd021b0d0, 0xb0d015b0, 0x26b01007, - 0xa582b0d0, 0x1638b482, 0x1001b0d0, 0xb0d01db0, 0x10b0d019, 0xd02fb010, 0xb0d02cb0, 0x32b0101f, 0x34321784, 0x013130d0, 0x03331321, 0x07231533, - 0x03211533, 0x03840323, 0x27333524, 0x15823523, 0x1b821320, 0x37330124, 0x03840523, 0x01232722, 0x4e080a82, 0x07012337, 0x01980433, 0x62fb5731, - 0xe425bf9a, 0xf37ef7fe, 0x92f2fe90, 0xfdfe7ff2, 0x94b925de, 0x0158fb62, 0xfdd46c34, 0xea2a9fce, 0x219f0e03, 0xbaa6fee9, 0xb001652a, 0x32fd5626, - 0xa701552f, 0x07041008, 0x57fea901, 0xfda0a2a0, 0x832502db, 0x830a8203, 0xa9012411, 0x83a215fd, 0xfe200800, 0xb9b9be00, 0x001f0102, 0x007c0002, - 0x04100600, 0x000d003a, 0xb26b001b, 0x111d1c08, 0x08b03912, 0x1809cf42, 0x240ced4d, 0xb11b2f16, 0x07cf4216, 0x2308c85a, 0xb0584500, 0x4208bf55, - 0x00200a93, 0x220c064e, 0x82091105, 0x10b2235a, 0xf6441109, 0x16322905, 0x11231117, 0x21232634, 0x01270682, 0x21113311, 0x82373632, 0x06450806, - 0x0c032306, 0xf302aebb, 0xaefe695a, 0xf39901f3, 0x596a5001, 0xef01f401, 0xc03a04dc, 0x01b5fecb, 0xfc636d42, 0xfb3a048a, 0xfdd602c6, 0x026861ed, - 0xbc57fdae, 0x000100d5, 0x04edff5e, 0x00c30530, 0xb28a0023, 0x5b481815, 0x0c154e0a, 0x2108a344, 0x8e831623, 0x2f23b024, 0xaa4500b2, 0x63092009, - 0x10280d6a, 0xb0d00cb0, 0x0eb01023, 0x132e0584, 0x2f13b0d0, 0x1f130fb6, 0x03132f13, 0xad18b25d, 0x16200a1c, 0x2e0b8c56, 0xb01013b0, 0x10b0d01e, - 0xd020b010, 0x60013130, 0x23230710, 0x44030020, 0x362106a0, 0x08447c00, 0x82152121, 0x03550801, 0x069cfe6a, 0x5f6e98a3, 0xff80781c, 0x08dafe00, - 0xadacacac, 0xfd2c010d, 0x661c856a, 0x09a29765, 0x9cfe6301, 0x0f026401, 0xcc21acae, 0x0120011d, 0x8d808d02, 0x1f1b01ff, 0xa4ac22cd, 0x0000808d, - 0x00210004, 0x05d40500, 0x001a00b0, 0x0024001f, 0xb2e30029, 0x05d7450c, 0xb0100c25, 0x82b0d01c, 0x84232005, 0x07d14505, 0x290cd263, 0xb11b2f01, - 0x593e0f01, 0x3b440bb0, 0x38be820b, 0x402f20b0, 0x10200013, 0x30202020, 0x50204020, 0x70206020, 0x09208020, 0x3ae0835d, 0xb0b62f1e, 0xd01ec01e, - 0x405d031e, 0x101e000b, 0x301e201e, 0x051e401e, 0x4526b25d, 0x273509db, 0x2f27b0d0, 0x27300f40, 0x27502740, 0x27702760, 0x27902780, 0xbb5e1807, - 0x1026320c, 0xb0d003b0, 0x06b0101e, 0x1020b0d0, 0xb2d00fb0, 0x823f8912, 0xd01d23bb, 0x198407b0, 0x25840a20, 0xb0d01422, 0x17243182, 0x013130d0, - 0x280af245, 0x17043221, 0x17231533, 0x2d048207, 0x01230606, 0x21152127, 0x27262125, 0x08820121, 0xd6013224, 0x0082b8fd, 0x2d025308, 0x3c0101ad, - 0x0102bde4, 0xfa36e1bc, 0x031501bd, 0x4302befd, 0xf001bdfd, 0xc8fe7246, 0x0cfef401, 0x027b3101, 0x03e3fd1d, 0xa048a01f, 0x81880901, 0xa02226a0, - 0xc201857d, 0x3be84828, 0x373bfe02, 0x28000100, 0x0c040000, 0x1a00b005, 0x16b26d00, 0x47481c1b, 0x0c014b08, 0x20081647, 0x0b535219, 0xd001b026, - 0xb01019b0, 0x1421c182, 0x22f3832f, 0x7fb21014, 0xfe820aa3, 0x4b101421, 0x0920061c, 0x22085957, 0x60090db2, 0x233606e1, 0x07331716, 0x07060623, - 0x01211501, 0x36323327, 0x21372137, 0x04822326, 0xd9033508, 0xca0f33da, 0xdc169732, 0xfed201c9, 0x0103fee1, 0x168370fd, 0x0133e6fd, 0xfed831e3, - 0xae0336f3, 0x654bf904, 0x11afa5b6, 0x020ddffd, 0x4c5d9951, 0x00cc9bb6, 0x2124cb82, 0x5104ecff, 0x1e24cb82, 0x1bb29100, 0x240a3153, 0xb11b2f11, - 0x974c1811, 0x3e0f260c, 0x1113b259, 0x2fed8205, 0xb02f13b0, 0x17b0d017, 0x1700b22f, 0x18b25d01, 0x2609574d, 0x08b0d019, 0x8209b0d0, 0xb0102c1b, - 0x0bb0d016, 0xd00ab0d0, 0x181013b0, 0x270a50de, 0xb0d015b0, 0x0db0d00c, 0xb0251683, 0x0fb0d012, 0x21ef83d0, 0xa75f1005, 0x1eb2220a, 0x061f4405, - 0x0206152b, 0x27222304, 0x37350711, 0x25038235, 0x37153311, 0x03830715, 0x3636112e, 0x51043535, 0xedfe9602, 0xdc8c6bb2, 0xfc210082, 0x080082e1, - 0x02b2aa22, 0xfed259ff, 0x0214abc3, 0x57c7575d, 0x57c85789, 0x5ad73b01, 0x5a895ac8, 0xfbfd59c8, 0x4df8fc02, 0x4f29f383, 0x0f050000, 0x17003a04, - 0x37871800, 0x0cde6a0d, 0x440c4546, 0x5e570ce7, 0x15b22307, 0x4a18170b, 0x0c200c34, 0x27090841, 0x3130d009, 0x13001601, 0x2406f066, 0x06061123, - 0x080b8215, 0x37001236, 0x28033335, 0x040301e0, 0x728101f3, 0xf38271f3, 0xdf040103, 0x296a03f3, 0xecfe92fe, 0xefc5b8bf, 0x026afd2a, 0xc7f32a95, - 0x1401bab1, 0xd12b7001, 0x28000200, 0x332caf82, 0x1600b005, 0x78001f00, 0x212018b2, 0x18207583, 0x09474918, 0x200c224f, 0x06605602, 0x0206b223, - 0x2127830c, 0xae4a2f06, 0xd0012f0b, 0xb01006b0, 0x0ab0d00a, 0x0a0fb22f, 0x49185d01, 0x14200b49, 0x15201b84, 0x10281b82, 0xb0d017b0, 0x1fb2100c, - 0x3023d088, 0x82212531, 0x06bd44bf, 0x3221112d, 0x04141504, 0x21152107, 0x73322101, 0x032505ec, 0xfcbefe33, 0x080082cd, 0xf12d0242, 0xeefe2001, - 0x01c4fef4, 0x01befe42, 0x8d90882d, 0xe7c4fe7c, 0x6bcbe7e7, 0xfbc802cb, 0x03f1d4d0, 0x7e36016b, 0x038e707d, 0x70000400, 0x8905ecff, 0x1900c505, - 0x34002600, 0x94003800, 0x3a391ab2, 0x1a25b783, 0xd000b010, 0x200582b0, 0x27058427, 0xb000d037, 0x37b02f35, 0x2012625b, 0x27f18224, 0x593e0f24, - 0xb01009b0, 0x22056e4e, 0x8303090d, 0x10092142, 0x230ba145, 0x16b21003, 0x2308e645, 0x090319b2, 0x242c2283, 0xd01db010, 0xb02f1db0, 0x2ab21024, - 0xb0241d88, 0x31b2101d, 0xb2180d88, 0xf98218c7, 0x2309574e, 0x17352620, 0x0808384e, 0x06222323, 0x01270515, 0x9fb10217, 0x9ea200ff, 0xaaa18082, - 0x42343641, 0x01406a43, 0x8887ae18, 0xe8fea7ad, 0xd2e818ab, 0xfbfd3d08, 0x7ec7027e, 0x92732504, 0x82478aa7, 0x357394ab, 0x4a4a5440, 0x31435545, - 0xa68640fd, 0x16d1e818, 0x4c000232, 0x9003ebff, 0x1700f905, 0x5a002100, 0x232201b2, 0x0124cf83, 0xd018b010, 0x0d8a5c18, 0x593e0f26, 0x000c06b2, - 0x44070b42, 0xb0210856, 0x0fdf6713, 0x3c830620, 0x3a0ff741, 0x35262205, 0x32352306, 0x36361137, 0x15163233, 0x07021415, 0x33161415, 0x6b363603, - 0x4e08059f, 0xe1db0207, 0x616061ed, 0x9ab20360, 0xb2d7ac88, 0x4dd46c68, 0x56202b57, 0xe5eb1503, 0x0118bb13, 0xb4d6bfe9, 0xfead269b, 0x8e4d67a9, - 0x4b44027a, 0x3f2966cc, 0x0000b240, 0x00900004, 0x05c20700, 0x000300c0, 0x001d000f, 0xb2a60027, 0x8329281e, 0x101e25a7, 0xb0d001b0, 0x88680582, - 0x82102005, 0x450028d1, 0x2f26b058, 0x4426b11b, 0x24200793, 0x0b385118, 0x8c180620, 0x21200bb6, 0x21200c82, 0x5b07904c, 0xdc8208ee, 0xb0d00d31, - 0x02b02f0d, 0x2f02b0d0, 0x010200b2, 0x4101b25d, 0xb02408e3, 0x13b2100d, 0x06230d89, 0x881ab210, 0x20b2230d, 0x95822124, 0x1f25b223, 0x08685726, - 0x36340128, 0x15151620, 0xf6410614, 0x21012510, 0x11231101, 0x5a080482, 0xfd970733, 0xfd61029f, 0x3801be76, 0xc2febabf, 0x515cafbd, 0x505c5b4f, - 0xc7fe5c4f, 0x0dfef4fe, 0x010b01f4, 0x9c01f2f6, 0x9f2f0295, 0x4ea6c0c1, 0xa2c2c29c, 0x6c6c6006, 0x6d5f5163, 0xa3fb626d, 0xf6fb0a04, 0xf3fbb005, - 0x00000d04, 0x036d0002, 0x05570494, 0x000c00b0, 0x4d6d0014, 0xf48c0592, 0x18087a4f, 0x2608c479, 0xb2593e1f, 0x82061501, 0x01b021b2, 0x0921ef82, - 0x22098201, 0x840103b2, 0xd0042510, 0x090108b2, 0x10291a84, 0xb0d00bb0, 0x0db11006, 0x059f520a, 0x1001b034, 0xb0d00fb0, 0x11b0100d, 0xd012b0d0, - 0x03013130, 0xd1820323, 0x13133327, 0x01231133, 0x080a8223, 0x2135232b, 0x3e7ce803, 0x81896f7c, 0xfe6f8585, 0x8d758a11, 0x09058c01, 0x74018bfe, - 0x1c028cfe, 0x7d0183fe, 0xbd01e4fd, 0xbb0145fe, 0x2cbb835f, 0x04ecff96, 0x004e0491, 0x001c0015, 0xd7681862, 0x4116200a, 0xd55306d7, 0x08bf440c, - 0x020a1922, 0x1924a083, 0x0a0fb22f, 0x24081452, 0x13b21002, 0x210d870c, 0x228515b2, 0xb2100a23, 0x08228816, 0x25313065, 0x26222306, 0x12343502, - 0x16323336, 0x21151716, 0x32331611, 0x07220137, 0x26112111, 0xbbb71404, 0x9087f491, 0xe38584f8, 0x00fd0384, 0xacc49a77, 0x7a9790fe, 0x5e731c02, - 0x01019d72, 0x03018f93, 0x90f38b9f, 0x6eb8fe3e, 0x7a2a037a, 0x1e01ebfe, 0x00ffff71, 0x05f5ff59, 0x009905cb, 0xffd50127, 0x828602d9, 0x007c2e07, - 0x010000fb, 0x03dc0107, 0x00000021, 0x0d934110, 0x82313021, 0xff542633, 0x056806f5, 0x242b82b4, 0x021d00d7, 0x22078294, 0x86a8017c, 0x89be2033, - 0x2f0d2733, 0x1f0db11b, 0x3384593e, 0x33825b20, 0xa8055c22, 0xd9242b82, 0x93020c00, 0x8c203384, 0xb2203386, 0x01203389, 0x01203382, 0x58203387, - 0x1a223382, 0x2b82a305, 0x2200db24, 0x33848e02, 0x33863320, 0xae187020, 0x003c136d, 0xff620002, 0x054304eb, 0x001900f5, 0xb25b0026, 0x11282713, - 0x13b03912, 0xd020b010, 0x088e7018, 0x2107924e, 0x1c5b00b2, 0x2f002305, 0x098502b2, 0x02510b20, 0x6400200c, 0x13210c46, 0x0c1e6b10, 0x17320127, - 0x22232626, 0x299e1807, 0x064a5b09, 0x63171221, 0x59080654, 0x26353536, 0xae380226, 0x84c51a77, 0x3c1d8b7c, 0x0d018f6e, 0xe37a2701, 0xf3fee394, - 0x857bf4fe, 0x85797a84, 0x04048b16, 0x35e5c27d, 0xfe2c19b7, 0x3572fe4e, 0xa7d3fec1, 0x0df72401, 0xc21201df, 0xb09aa4a7, 0x4c55c5d0, 0x0001005f, - 0x041bffa6, 0x00b005f4, 0x00270007, 0x2b4604b0, 0x08264305, 0xb0100425, 0x18b0d001, 0x240eb064, 0x21112305, 0x2e038211, 0xfdf4f404, 0x4e04f399, - 0xfad405e5, 0x8295062c, 0xfe40244b, 0x82c104f3, 0x000c254b, 0x03b00035, 0x08204b85, 0x07a65318, 0xb2100322, 0x2009a562, 0xb89018b0, 0xfd8f3e22, - 0xfb4403ee, 0xfd4f027f, 0xfc4704b1, 0x021202f6, 0xc373fd43, 0x02c80297, 0xfdc398c6, 0x276f8273, 0x036d029e, 0x003103ef, 0x178beb18, 0xfcef0328, - 0x025103af, 0x2b82c46d, 0x00003b24, 0x9b829204, 0x3c000824, 0x3d5900b2, 0x064f6b06, 0x20071942, 0xd5c618b0, 0x3e0f2308, 0xaa66b259, 0x70072006, - 0x303f0b36, 0x33010131, 0x23032301, 0x41022135, 0xfed97801, 0xd1d8c517, 0x2b016701, 0x50fa8504, 0x82c54102, 0xff5e3b89, 0x04df07ec, 0x001a004e, - 0x0039002a, 0x3a07b272, 0x3912113b, 0xb01007b0, 0x0583d022, 0xc1433220, 0x18042006, 0x200be858, 0x06035209, 0x1004b02c, 0xb0d016b0, 0x07b22f16, - 0x36830416, 0xb0d01226, 0x14b22f12, 0x16200c85, 0x820b0953, 0x18b2202a, 0x2809b980, 0xb0d02eb0, 0x37b0101e, 0x08a182d0, 0x06061429, 0x27262223, - 0x26222102, 0x34353526, 0x20333612, 0x32211213, 0x07171616, 0x22232634, 0x15070607, 0x33161716, 0x55353632, 0x372405c3, 0x27263537, 0x78081882, - 0x80df0706, 0xe98d90e6, 0xdffeaa55, 0x8181e58f, 0x24018ee4, 0x2401a9a9, 0x0181e48e, 0xa47a92ef, 0x0f0f286e, 0x799f6b2e, 0x925dfa95, 0x2bac697b, - 0x6e280f07, 0x029279a4, 0x90fd9811, 0xb6fea7a3, 0x1599ff8e, 0x8f000198, 0x4701b9fe, 0x0497fd8f, 0x4ac9c69a, 0x55452442, 0x05a2c3c3, 0x90b3c39d, - 0x4a42241a, 0x0000c3c9, 0xfeafff01, 0x06a8024b, 0x00150015, 0x1602b23d, 0x080d4c17, 0x1b2f0e24, 0xc5660eb1, 0x3e11220c, 0x0b765859, 0x1b630e20, - 0x6b05200d, 0x372308f5, 0x4e363411, 0x2d08061e, 0xb6900115, 0x123f42aa, 0x028a252c, 0x593fb2c0, 0xa3322a19, 0x13b6b04f, 0x049d0dbd, 0x15c3b3f4, - 0x00b80bb9, 0x65000200, 0x15040101, 0x8382fa03, 0x78002b24, 0x516710b2, 0x10102805, 0x00d01cb0, 0x492f19b0, 0xb0240515, 0x08b0d008, 0x10220b82, - 0x08820ab0, 0x210b4b60, 0xe16203b0, 0x0db0280b, 0xd015b010, 0x4d1019b0, 0x088305e1, 0xb0d02023, 0xf166181e, 0x6719200c, 0xb03e0b40, 0x2bb01023, - 0x133130d0, 0x36333636, 0x33161717, 0x06153732, 0x27272223, 0x06220726, 0x15941507, 0x30653a08, 0x4c524284, 0x8451469c, 0x517f6665, 0x544f9846, - 0x30308742, 0x4f544280, 0x87514698, 0x51836665, 0x524c9c46, 0x03308442, 0x0238328e, 0x7e204e22, 0x4c206ad9, 0x3c420224, 0x210f82cb, 0x0f844c24, - 0x82224e21, 0x0100300f, 0x80009100, 0xc304ef03, 0x37001300, 0x7e13b000, 0x04260ca7, 0x1013b0d0, 0x058407b0, 0xb0d00f24, 0xdb7b2f0f, 0x08b0210a, - 0x10221082, 0xba820bb0, 0x07210129, 0x35233727, 0x82213721, 0x17490803, 0x21153307, 0xef032107, 0x6d80e2fd, 0x2101b05d, 0x0261fe7e, 0x636e8610, - 0x7dd1febd, 0x6401ac01, 0xc9a63ee4, 0x3eedcadf, 0xffdfcaaf, 0x003c00ff, 0x048d0313, 0x0067006b, 0x00000020, 0x3900408b, 0x0107009a, 0xfd9eff97, - 0x201d82a6, 0x201d8280, 0x201d84e0, 0x3b1d8c22, 0x00a6fde2, 0x00240002, 0x05eb0300, 0x000500b0, 0xb2380009, 0x110b0a06, 0x06b03912, 0x0ee56118, - 0x6a07f148, 0x06220877, 0x27820300, 0x8408b221, 0x302b0806, 0x01330131, 0x01012301, 0x01131303, 0x8301c4a4, 0xfec580fe, 0xede1017e, 0xb005ecf2, - 0x29fd27fd, 0xd601d702, 0x29fe2afe, 0x8200d701, 0x00a1308f, 0x05bc01ab, 0x00270007, 0x001a0012, 0x830701b6, 0x07042107, 0x2406ed57, 0x3130dc11, - 0x30978200, 0x027f0263, 0x0039043e, 0x00070003, 0x0800b22a, 0x256f8209, 0x00d005b0, 0x534502b0, 0x3e1b220a, 0x201a8259, 0x06026b02, 0x82d00421, - 0x11232389, 0x03830133, 0x9d9d003c, 0x9d9d3e01, 0xba017f02, 0xba0146fe, 0x45000100, 0x5a0167ff, 0x08000601, 0x99450c00, 0xb0d02505, 0x31302f00, - 0x3006965c, 0x80c50606, 0x01c90349, 0x734d9953, 0x5d4f647b, 0x32a982ba, 0x0500002d, 0x0015061a, 0x004a0026, 0x00070000, 0x8244024a, 0x00022607, - 0x04000018, 0x26178217, 0x001b0017, 0x5209b273, 0x092005ad, 0x24090d6b, 0xb11b2f09, 0x07774309, 0x0c820420, 0xad520420, 0x0ce27607, 0x19821720, - 0x254a1720, 0x82192007, 0x8319200c, 0x1004240c, 0x71d013b0, 0xb0270a09, 0x09b0d001, 0x4d0fb210, 0x33370a08, 0x33352311, 0x33023e35, 0x07171632, - 0x06222326, 0x15331515, 0x82211123, 0xbd2a08f7, 0x6a01a5a5, 0x935088c2, 0x728a254f, 0xd5d5646f, 0xf3f36702, 0x4ab48603, 0x225cb67f, 0x6130c91a, - 0xfcb44461, 0x003a047a, 0xdd820001, 0x822c0421, 0x001624c5, 0x7412b263, 0x12200ad1, 0x12208982, 0xe15cbd87, 0x0856450c, 0x58450023, 0x081f62b0, - 0x88461220, 0x100e270c, 0xb0d005b0, 0x7b18100e, 0xb0250a70, 0x3130d008, 0x85a78201, 0x052257a6, 0x3336362e, 0x23110532, 0x4a663903, 0xf3dcdcc4, - 0xd72ab682, 0x44017ac4, 0x0e3f05f3, 0xa2825bb8, 0x6127b382, 0xfa30c3b7, 0x8302001b, 0x930621a9, 0x282fa982, 0xb5002c00, 0x2e2d14b2, 0xb0391211, - 0x6bb01014, 0x082007ad, 0x0820b182, 0x9784b187, 0x2b200c87, 0x2b201982, 0x20077c41, 0x200c8221, 0x710c8721, 0xa3410cf4, 0x8228200c, 0x41282026, - 0x25200796, 0x25200c82, 0x2a200c87, 0x2a200c82, 0x21210c83, 0x2e751810, 0x26b0240a, 0x4401b0d0, 0x16200fcf, 0x0dce4118, 0x4505b141, 0x15210953, - 0x11be4121, 0x21112329, 0x11232111, 0x18a5d233, 0x210854d4, 0xcc417401, 0x88263806, 0xd5646f73, 0x8cfef3d5, 0xf3f3ce04, 0x63b48603, 0xbe12c4b4, - 0x4160b308, 0x03210dd7, 0x09db4186, 0x06930629, 0x00270015, 0x5a13b2a5, 0xa6180a67, 0x36410cc3, 0x0c02410c, 0x0cd84218, 0xf5821f20, 0x36411f20, - 0x82272007, 0x4127200c, 0x2420070f, 0x2307f64e, 0xb0584500, 0x200ac042, 0x775b18b2, 0x4508200a, 0x15200ce6, 0x2a0b1641, 0xb01001b0, 0x22b0d026, - 0x413130d0, 0x2042121f, 0x42112006, 0x21210a37, 0x0d1b4111, 0x42053142, 0xfe210540, 0x0a15418c, 0x42053942, 0xfc31094a, 0x0001007a, 0x04ecff2d, - 0x001506d1, 0xb2850024, 0x0a016c13, 0x0c2d6518, 0x200ca043, 0x025e1823, 0x082b590b, 0x18102321, 0x200a0d66, 0x151e59b0, 0x2482b020, 0x1809ba50, - 0x260be45f, 0x18b0100e, 0x4419b0d0, 0x142005aa, 0x2606a946, 0x23111120, 0x83353335, 0x431120ea, 0x342b051e, 0x16323336, 0x04331117, 0x5931bfcb, - 0xb2330613, 0xa36c45b2, 0xc2a5a5f3, 0x72f165b0, 0xfd8603bf, 0x59373ea4, 0xb42f060d, 0xfbb920f8, 0xb4860367, 0x38c3b662, 0x828efe31, 0xff4b31ed, - 0x068006ec, 0x004c0018, 0x4d46b2a7, 0x3912114e, 0x20051e4c, 0x20d38247, 0x071e4347, 0x0c824020, 0xda414020, 0x0c074107, 0x19824b20, 0x92184b20, - 0xb0250f05, 0xb0584500, 0x2519822c, 0x593e0f2c, 0x07414bb0, 0x10b4560c, 0xb0d00d27, 0x47b0d00e, 0x0b2f6d10, 0xb2104023, 0x09fd4f20, 0xb2102c23, - 0x250d8834, 0x23013130, 0xb8471411, 0x27262f06, 0x33352311, 0x23263435, 0x14150622, 0xc518021e, 0x415f0c49, 0x35262705, 0x33161633, 0x24823632, - 0x26272628, 0x33363435, 0x06851732, 0x1515163f, 0xbf790633, 0x532f2671, 0x0190874d, 0x5860acac, 0x211d584f, 0x5668f41c, 0x015e6550, 0xa0cf181e, - 0x6b2b080c, 0xecb653f8, 0x2d4d5bb6, 0xdec9aed9, 0xfd8603bf, 0xbc0a88b7, 0x02a2aa17, 0x6258b44e, 0x3a455469, 0x4d796669, 0x3e4a5d46, 0x183f3e38, - 0x080ab9cf, 0x44413b55, 0xa7582834, 0x6c17bc8c, 0xcaa5814f, 0x16004fc5, 0x72fe5900, 0xae05ec07, 0x1a000d00, 0x37002800, 0x43003d00, 0x4f004900, - 0x5a005600, 0x62005e00, 0x6a006600, 0x76006e00, 0x7e007a00, 0x86008200, 0x8e008a00, 0x10b2c001, 0x1211908f, 0x1010b039, 0x83d000b0, 0x841b2005, - 0x84302005, 0x843c2005, 0x843e2005, 0x84462005, 0x844a2005, 0x84502005, 0x84572005, 0x845b2005, 0x84612005, 0x84632005, 0x84672005, 0x846d2005, - 0x84702005, 0x84772005, 0x847b2005, 0x847f2005, 0x84842005, 0x84882005, 0xd08c2405, 0x473db000, 0x462f0554, 0x46b11b2f, 0xb2593e1f, 0x2b03447d, - 0x82797cb2, 0x81782104, 0x80210482, 0x22048239, 0x833d460a, 0x2f0a21a9, 0x2806cc49, 0x0eb0d00e, 0x100ab02f, 0x05d548b0, 0x0f0e6f22, 0x7c271e82, - 0x182f6fb0, 0x4f0b50b2, 0x50210920, 0x2235846f, 0x881eb210, 0x03b02414, 0x8925b210, 0x100f320d, 0xb0d029b0, 0x0eb02f29, 0xd02eb010, 0xb22f2eb0, - 0x281c8934, 0x6bb0103d, 0xd067b0d0, 0x23dc82b0, 0x3fb2d03e, 0x36087a4f, 0xb0d065b0, 0x6db0d069, 0xd03cb0d0, 0xb01039b0, 0x46b0d041, 0x8947b210, - 0xd05b261f, 0xb0d057b0, 0x3016834a, 0xb0d060b0, 0x58b0d05c, 0xd04bb0d0, 0xb01044b0, 0x22ba824e, 0x8951b210, 0x10472965, 0xb0d05fb0, 0x76b2100f, - 0x21081389, 0x84b01078, 0x1079b0d0, 0xb0d085b0, 0x88b0107c, 0x107db0d0, 0xb0d089b0, 0x8cb01080, 0x1081b0d0, 0x1d4c8db0, 0x22232405, 0x43352726, - 0x132805af, 0x16323311, 0x16071415, 0x23210482, 0x05be4201, 0x1614152b, 0x35363233, 0x14113301, 0x222a8206, 0x84143335, 0x1120080e, 0x15331533, - 0x35333521, 0x11011133, 0x15231521, 0x11213525, 0x15013523, 0x34353233, 0x21351327, 0x03851c82, 0x0b8a0120, 0x1d831320, 0x23232623, 0x07065501, - 0x25200782, 0x4c080b8a, 0x64813703, 0x7e028066, 0x02806568, 0x7262bc43, 0xd0343254, 0x414a8ffe, 0x424a4a40, 0xba034940, 0x5852695c, 0x29685d6d, - 0x71c4f936, 0xc72805c4, 0x016df86f, 0xec05c435, 0xfc6f3601, 0x62677e5c, 0xfd1601cb, 0xfd15015b, 0x0214015c, 0x280b890a, 0x3a765dbc, 0xf1fc5d3c, - 0x22008471, 0x846f2207, 0xd4013d00, 0x5e787962, 0x787c5f75, 0x02b3fe5e, 0x544d4925, 0x2d460d20, 0x4548019b, 0x70454e4e, 0x28080483, 0x86fe4f01, - 0x53515d4e, 0xfc2c365b, 0xca3b01c9, 0xfeca7171, 0x011f06c5, 0xa9a9741d, 0xa9e3fe74, 0x53a9b6fc, 0x4a030452, 0x21008474, 0x5e8438f9, 0xc403712e, - 0xfe1e2950, 0xfa7efcd3, 0x7ef915fc, 0x25080685, 0x5c000500, 0xd707d5fd, 0x03007308, 0x20001c00, 0x28002400, 0xb0004c00, 0x25b02f21, 0xd000b02f, - 0xb02f00b0, 0x59531021, 0x02202206, 0x059b5e00, 0x28065955, 0x04b0d004, 0x000db22f, 0x21158302, 0xfb582f0d, 0x07b22305, 0x0f821404, 0x1419b223, - 0x29068204, 0x03093130, 0x37363405, 0x75443636, 0x33072105, 0x2c056b54, 0x06060714, 0x15231715, 0x15330333, 0x08038323, 0x03180452, 0xfc41fcbf, - 0x1e0f0444, 0xa75c4a24, 0x02a09095, 0x2b3a02cb, 0x5b5d3839, 0xcacaca2f, 0x0204044b, 0x52060404, 0x31fc31fc, 0x3af1cf03, 0x8727183a, 0x8b97804a, - 0x4034337f, 0x413c5f34, 0xaa5b4c5c, 0x0a044cfd, 0x0100049e, 0x00003a00, 0xb005ea03, 0x3ca3f518, 0xea032408, 0x02f4d4fd, 0x0344fd2c, 0xfa2905b0, - 0xc3ed04d7, 0x00020000, 0x0456fe4f, 0x004e0417, 0x0026001b, 0x511fb283, 0x1f23055b, 0x4f0cb010, 0x72180b2d, 0x0c241414, 0x0cb11b2f, 0x2007c566, - 0x06ec7418, 0x0406b228, 0x39121118, 0xa54d0cb0, 0x10b2220b, 0x21148312, 0x1b8516b2, 0xac571820, 0x04b0210b, 0x390bc45b, 0x34133130, 0x32333636, - 0x11333717, 0x22230014, 0x16372726, 0x35363233, 0x0b820635, 0x14372622, 0x53080c82, 0x23261137, 0x6d4f0622, 0x69bf85cd, 0xfbfed110, 0x49b955ef, - 0x8e908235, 0x7fae6a83, 0x8ff372cc, 0x45469578, 0x028d7c94, 0x8dfba026, 0x1cfc7286, 0x2ff6fef6, 0x9c4cb02d, 0x8c77169b, 0xc09f9dfc, 0x7bd90181, - 0x010000c1, 0x4bfeb0ff, 0xcd008e01, 0x2e000d00, 0x2008fb66, 0x05dd440e, 0xcd820520, 0xda820520, 0x4b0ab221, 0xb02e084b, 0x0db0100e, 0x2f0db0d0, - 0x11253130, 0x8f820714, 0x35389a84, 0x708e0111, 0x3846955b, 0x7c3d240e, 0xc8f7fecd, 0xc6114f62, 0x0501b20c, 0x002e6182, 0x019afe5c, 0x00b5004f, - 0x00120003, 0xa51804b0, 0x3b080cbb, 0x23013130, 0x4f013311, 0x9afef3f3, 0x02001b02, 0xd0047500, 0xdc06f702, 0x20000c00, 0xb0007b00, 0x06b02f03, - 0x2f06b0d0, 0x060f0b40, 0x062f061f, 0x064f063f, 0x03b05d05, 0x0609b210, 0x26086054, 0x0cb01006, 0x820cb0d0, 0xb0102e2a, 0x10b0d010, 0xd013b02f, - 0x402f13b0, 0x05f45d0d, 0x4f133f29, 0x06135f13, 0x5010b05d, 0xb02406db, 0x1ab21013, 0x08365118, 0xb2211682, 0x200d891d, 0x06005e1a, 0x20061422, - 0x08128818, 0x82141321, 0x264008e7, 0x15062223, 0x33363427, 0x32331632, 0xf7023536, 0xb0defeb0, 0x48464caf, 0x475f904a, 0x1f2a8138, 0x4561682a, - 0x1e2c882f, 0x65b0052c, 0x35657b7b, 0x01333c3a, 0x476b4b0f, 0x4d1b2532, 0x2432476c, 0xd52add84, 0x0807f602, 0x1c000d00, 0xdd845900, 0xb0d00723, - 0x28dd8307, 0x2f071f07, 0x4f073f07, 0x20dd8507, 0x20dd890a, 0x06704107, 0x0882b020, 0x2d054146, 0x14b0d014, 0x0e0fb22f, 0x39121114, 0xbf4515b2, - 0x1bb22308, 0x11820f0e, 0x01313022, 0x3521ae84, 0x05474533, 0x18272721, 0x080b37a8, 0xf602072e, 0xaf9291af, 0x454450ad, 0x4808df4d, 0x9e07923f, - 0x01444e9f, 0x7962b005, 0x39346279, 0x7619333a, 0x361a1702, 0x2f445060, 0x003a083a, 0xd324b384, 0x7e060003, 0x1122b382, 0x91415d00, 0x57b38a1b, - 0x088208b8, 0x84059141, 0x0f403cb9, 0x0e1f0e0f, 0x0e3f0e2f, 0x0e5f0e4f, 0x5d070e6f, 0xb01010b0, 0xb019d011, 0x90182f11, 0x07333db7, 0xaf000323, - 0xb1b19596, 0x4c47494c, 0x80a9b665, 0x7c61b005, 0x3c34637a, 0xc0ce343c, 0xe72d9984, 0xd1065c03, 0x1a000600, 0xb0008d00, 0x07674701, 0x50820420, - 0x182f0423, 0xdea918b0, 0x10033f07, 0xb0d005b0, 0x09402f05, 0x051f050f, 0x053f052f, 0x02b25d04, 0x12110305, 0xd00ab039, 0x18820ab0, 0x4f0a3f29, - 0x6f0a5f0a, 0x425d040a, 0xa98205dd, 0x0d1f0d2c, 0x0d3f0d2f, 0x0d5f0d4f, 0xa9820d6f, 0x5c420a20, 0x100d2307, 0x9e4114b2, 0x100a2309, 0x0d8917b2, - 0xb0101424, 0xc982d01a, 0x07272326, 0x37332523, 0x08123742, 0xc15c0329, 0x01c1b2b3, 0x59ba932a, 0x247b313d, 0x595a291b, 0x267f2a3c, 0xe7042c1a, - 0xdfed8e8e, 0x2c425f3e, 0x6040181b, 0x851c2d41, 0x0a0423e1, 0xe182cb06, 0x60001522, 0x0321e1b0, 0x27e18305, 0x07b01001, 0x2f07b0d0, 0xb223d885, - 0x820d0708, 0x0eb22115, 0xb223b388, 0x42070814, 0xb4850536, 0x2f421720, 0x08af860d, 0xb9bb1628, 0x81383f07, 0x498c8907, 0xe7040138, 0x74faa2a2, - 0x1d18057d, 0x4b59693e, 0x3b074137, 0x4cff0200, 0x5c03da04, 0xab828306, 0x5b000a27, 0x2f03b000, 0x128741b0, 0xb0d00123, 0x07d24301, 0xd2430920, - 0x5d042507, 0x060302b2, 0x52052c68, 0x072206f1, 0xb28219d0, 0x08b01823, 0x05a14110, 0x0a0fb628, 0x0a2f0a1f, 0x5b415d03, 0x05230808, 0x03330323, - 0x9f9fd55c, 0xa12301d4, 0xd79d87fe, 0x8eda04dd, 0x015cfa8e, 0x0002000b, 0x04e7047a, 0x8a90068b, 0xd005248b, 0x462f05b0, 0x403005f6, 0x1f000f09, - 0x3f002f00, 0xb05d0400, 0x02b01003, 0x02266b82, 0x04b2182f, 0x83830003, 0x0e820620, 0x182f0622, 0x09241983, 0x2f09b0d0, 0x2a053d41, 0x1f070fb6, - 0x03072f07, 0x8309b05d, 0xb0192492, 0x82182f0a, 0x3320088b, 0x07272305, 0x03330123, 0xa19d0123, 0x9fd42301, 0x3303d59f, 0x059dd8de, 0x8e8efae1, - 0xf5fea901, 0x20054143, 0x3c4143d4, 0xb0d01124, 0x62602f11, 0x12414305, 0xb0101123, 0x20b28210, 0x11414310, 0x17332522, 0x260b4143, 0x72b794fe, - 0x43b10580, 0xcd2c0742, 0x010000c0, 0x69049400, 0x2b06a901, 0x6f108d6f, 0x073513d3, 0x36343523, 0x3f832601, 0x55d30102, 0x6d532b06, 0x5985867c, - 0x27e183b6, 0x04000009, 0x008d0494, 0x0ff3f718, 0x146a1d20, 0x0c417506, 0xad690620, 0x04092707, 0x39121102, 0xfd5309b0, 0x0ab2210b, 0x2b081484, - 0x21253130, 0x33012307, 0x21012301, 0xfe3f0303, 0x01f55f1e, 0xd501dfd7, 0x0106fef6, 0xf9f9aa54, 0x73fb8d04, 0xba01b201, 0x76000300, 0x0a207b82, - 0x0e2a7b82, 0x1f001600, 0x1eb2a400, 0x55832120, 0xb0101e25, 0x82b0d002, 0x47112005, 0x012006c1, 0x01207682, 0xde849087, 0x593e0f26, 0x000117b2, - 0x22082d83, 0xafb42f17, 0x0217bf17, 0x176fb45d, 0x7102177f, 0x0117ffb2, 0x170fb271, 0x8fb47201, 0x02179f17, 0x825fb272, 0xcfb2210b, 0x3f201583, - 0xb4230482, 0x832f171f, 0x17bf222d, 0x521c83cf, 0xb223096b, 0x83170f08, 0x18002050, 0x210ce140, 0x426a1001, 0xaf83180a, 0x11032710, 0x35363233, - 0x347a2734, 0x26440805, 0x01762323, 0x59ebdeaf, 0xe270605b, 0x66e4e2dd, 0xd4fab464, 0x6567635b, 0xa58d04c6, 0x23834f9c, 0xa3638f17, 0xfefb01ab, - 0x9e4155c7, 0x4802aa05, 0x00464f45, 0x4f000100, 0x4304f0ff, 0x1b009d04, 0x03b24e00, 0x0ac54018, 0xf7820b20, 0xf7870b20, 0x22088f54, 0x83030b0f, - 0x560b20a6, 0x03200c45, 0x230bf662, 0x0b031bb2, 0x33051744, 0x22230406, 0x34351100, 0x32333636, 0x26231704, 0x11202326, 0x0805a44b, 0x42043746, - 0xd9f7fe11, 0x7eecfeec, 0x01d69cec, 0x0cf31404, 0xedfe727d, 0x7c788786, 0xbf84010d, 0x012c01d5, 0xffa9440b, 0x70c2da8a, 0x488efe69, 0x7062b5b9, - 0x76000200, 0x2a040000, 0x0b008d04, 0x46001300, 0x151413b2, 0xb0246682, 0x02b01013, 0x221ba941, 0x181001b0, 0x7f0bab8a, 0x33280eaf, 0x04322111, - 0x14151716, 0x2f08ab82, 0x20331103, 0x25103513, 0xa47b0176, 0x02900301, 0xa8f9fe8f, 0x47018283, 0x04c9fe06, 0x9ffb8a8d, 0x8bfea33d, 0xf9fcc903, - 0x01435c01, 0x01000860, 0x03218f83, 0x208f84b5, 0x0a115c4e, 0x20073241, 0x06275904, 0x060bb223, 0x20a88304, 0x0bae420b, 0x5304b021, 0x847a0ccb, - 0x3130260c, 0x21112101, 0x37038615, 0x0afe5f03, 0xc1fc4c02, 0xb7fd3c03, 0xf801f601, 0x04c2cafe, 0xf2fec48d, 0x9e207f86, 0x09227f82, 0x7f854000, - 0x3b437284, 0x43b2200f, 0x7f83132e, 0x9c490620, 0x20718408, 0x2e738523, 0x0efe5b03, 0xfd2803f3, 0x01f201cb, 0x8325fedb, 0x82d5206b, 0xff542c6b, - 0x044804f0, 0x001c009d, 0x781ab25c, 0x0a200afd, 0x0a20e582, 0x22102542, 0x830a030e, 0x100a23f2, 0x648811b2, 0x1803b021, 0x210b8655, 0x22851bb2, - 0x182f1b21, 0x2c0cdc42, 0x21060725, 0x35110022, 0x32330010, 0x09324216, 0x37203a08, 0x21352335, 0x96174804, 0xfef8d5fe, 0xf41601dc, 0xed19fad7, - 0xfe6c7912, 0x2801a0e4, 0xeb01f946, 0x018b1893, 0x4109012e, 0x2c010901, 0x5c64c0c3, 0xb74089fe, 0xb1c839ba, 0x05274100, 0x04680427, 0x000b008d, - 0x12a74186, 0xdf43c18c, 0x18b02007, 0x26081c95, 0xb2593e0f, 0x44000609, 0xb42d0570, 0x09bf09af, 0x3fb25d02, 0xb2710109, 0x820483cf, 0xb2722209, - 0x2e0983ff, 0x7201090f, 0x7f096fb4, 0xb4710209, 0x83ef09df, 0x835f2026, 0x091c2212, 0x5c0b832c, 0x30220942, 0x885c2131, 0x11332e05, 0x04331121, - 0xf4fdf368, 0x0c02f3f3, 0x056e41f3, 0x0111fe23, 0x20b382ef, 0x20b88285, 0x22b38277, 0x851d0003, 0x2f0224b3, 0x4402b11b, 0x4a840f86, 0x77013324, - 0x2a82f2f2, 0x24243582, 0x6403f0ff, 0x0e260a82, 0x05b22200, 0x8b52100f, 0x82052008, 0x8305203c, 0x410b20c9, 0x3021088e, 0x0e284f31, 0xf3710235, - 0xe1cab2e3, 0x574bb7f4, 0xe0fc8d04, 0xafc0cfae, 0x415d5ead, 0x0c220b3f, 0x67424b00, 0x82082012, 0x4208205b, 0xb0250f74, 0xb0584500, 0x1263180b, - 0x02062207, 0x298a8204, 0xb01006b0, 0x0ab2d001, 0x1e440601, 0x11072105, 0x0945f818, 0x87f0013f, 0x016ef3f3, 0xfe2c014f, 0xfed30143, 0x83db01de, - 0x8d04a8fe, 0x0186fdfd, 0xfdf7fd7d, 0x05c5417c, 0x82940321, 0x000522db, 0x20859228, 0x206b8202, 0x05fd5c02, 0x3007df4b, 0x21253130, 0x33112115, - 0x2b026901, 0xc2f3e2fc, 0x052341c2, 0x00007624, 0x0a828f05, 0x60000e24, 0x234101b2, 0x8200200a, 0x8c002041, 0x0fc943c7, 0xee84d484, 0x18079755, - 0x22089a67, 0x82040001, 0x07b221d4, 0x0a200685, 0x30220684, 0xf8180931, 0x23080d37, 0x015101b2, 0xf23e014e, 0xa8a0fe19, 0xf219a1fe, 0xb5fc8d04, - 0x73fb4b03, 0x3a023b01, 0x70038bfc, 0xc5fecbfd, 0x0421a388, 0x220a8267, 0x85450009, 0x820520eb, 0x8705209c, 0x0c71418f, 0x450cb142, 0x022208a6, - 0xf8180005, 0x04221530, 0x6e42f267, 0x03f22405, 0x82e5fc1b, 0x03e43781, 0x0200001c, 0xf0ff4f00, 0x9d046f04, 0x1c000e00, 0x03b24600, 0x56491e1d, - 0x45122006, 0x0d46065b, 0x46b02014, 0x5f181006, 0x10210c78, 0x05ff4500, 0x33361226, 0x27110032, 0x080ca551, 0xfe6f0433, 0xfeeceddf, 0x9bf085da, - 0xf22001f0, 0x98868896, 0x94888799, 0xf8fe2c02, 0x3501ccfe, 0xac2e0c01, 0xfe8b0701, 0x08f5fec7, 0xb7c0c0b7, 0xc3c7b235, 0x2ea783b6, 0x04000076, - 0x008d042c, 0x0013000a, 0x4604b24d, 0x04200503, 0x24096f4f, 0xb11b2f03, 0x07284103, 0xe96a0120, 0x18b22006, 0x181725f8, 0x6a09074d, 0x212b055f, - 0x14151632, 0x33270706, 0x82353632, 0x232008ae, 0x01f36901, 0xf1fdd4e5, 0x68f2fed4, 0xf3657977, 0x67fe9901, 0xadd58d04, 0xc403c6a9, 0x69575458, - 0x4c2c9183, 0x6c0430ff, 0x14009d04, 0x46002200, 0x0a23b318, 0x39411f20, 0x82112006, 0x41112084, 0x0f240cba, 0x11b0593e, 0x200c296a, 0x0d7f6708, - 0x06140125, 0x62071707, 0x272205db, 0x3f413435, 0x6c3b0814, 0x9dcf636e, 0x3432f6fe, 0x0184f29a, 0xef9cf182, 0x97f12201, 0x97978689, 0x02958988, - 0x48f1a32c, 0x09c98898, 0xaa01018b, 0x0501ab39, 0xfec8fe8e, 0xc0b708f4, 0xb033b6c3, 0x47b6c3c9, 0x3934064b, 0x0d008d04, 0x61001600, 0x181705b2, - 0xb0391211, 0x0fb01005, 0x430bb750, 0xf3420c0d, 0x820d2007, 0x820d20cf, 0x0eb2230c, 0x34830402, 0xd7460e20, 0x0ab2230b, 0x14830e00, 0x0c4b5318, - 0x01313023, 0x05857023, 0x07141526, 0x01211501, 0x08075e41, 0xdf480239, 0xdac801f3, 0x1201e1f0, 0x34fefcfe, 0x696c6cd5, 0xa901d56f, 0x8d0457fe, - 0x5bebaab7, 0x020b25fe, 0x514e5f6b, 0x00010060, 0x03f0ff3e, 0x009d04ef, 0xb2630025, 0x44272609, 0x092008d9, 0x09208d82, 0x4218a787, 0x032208b4, - 0x2182091c, 0x090db223, 0x1806821c, 0x210d47ac, 0x451803b0, 0x21200c2b, 0xb0212984, 0x0bf25e1c, 0x3423af82, 0x56262426, 0x232007e4, 0x2305b842, - 0x16171614, 0x0a778a18, 0x32214b08, 0x68020336, 0x53b0cffe, 0xfed2c3f6, 0x5f6578f3, 0xdd8f716e, 0x8accf8c0, 0x01f47ee5, 0x016f6100, 0x4c4f4232, - 0x925c8362, 0x51a0c8bb, 0x3a404d5d, 0xb236234c, 0x5dae998e, 0x4ac071aa, 0x24000100, 0x16040000, 0x07008d04, 0x95462e00, 0x07cf4412, 0x1006b022, - 0x220ace77, 0x47d004b0, 0x353107ab, 0xfe160421, 0x83fef37e, 0xc903f203, 0xc90337fc, 0x245382c4, 0x04f0ff67, 0x2653821e, 0xb235000f, 0x4111100c, - 0x31440825, 0x0898480c, 0x230ac36a, 0x0fb01008, 0x11245a83, 0x24200414, 0x07937a18, 0x11372008, 0xfffe1e04, 0x00ff4afe, 0xe56c7ef1, 0xfd8d0404, - 0xdde0be01, 0xfdff02c1, 0xd4687300, 0x82000703, 0x82092071, 0x827220c5, 0x6bf61871, 0x0c804308, 0x1b2f0724, 0x9d4107b1, 0x08844607, 0x05030122, - 0x3e050146, 0x21013717, 0x21012301, 0x12132a02, 0x01012201, 0xfef646fe, 0x01010147, 0x034b4d38, 0x4573fb57, 0x2824050b, 0xe5050000, 0x0c200a82, - 0x0ce98918, 0x870c5043, 0x15a4440c, 0x58450023, 0x083b4cb0, 0x03010022, 0xb2217b82, 0x20068505, 0xfaf7180a, 0x1803200b, 0x3e072ee6, 0xfeecaf4a, - 0xdbd8ebe6, 0xece6feeb, 0x01d6d8b1, 0xfb62032b, 0xfc410373, 0xfc8d04bf, 0x8264039c, 0x821520f5, 0x824a20f5, 0x000b2293, 0x05bb4153, 0x480c244c, - 0x2e630c51, 0x1807200c, 0x2207a05e, 0x83040100, 0x85062086, 0x00032206, 0x480d8306, 0x30220566, 0xe6180131, 0x23080b2d, 0x1c01f227, 0x8c0189fe, - 0xfaffe0fe, 0x8101e4fe, 0x1a0188fe, 0x9301fa02, 0xb5fdbefd, 0x67fe9901, 0x42024b02, 0x05209182, 0x36209182, 0x8c0b8741, 0x0c874191, 0x8508ff41, - 0x686f8284, 0x013b05c7, 0x011d0221, 0xfe0b010e, 0x64fef25d, 0x7a020b01, 0x07fd1302, 0xa1016cfe, 0x8200ec02, 0x00412461, 0x82f30300, 0x18092061, - 0x440cf3f7, 0xac420f22, 0x18b2200a, 0x0827f3f7, 0x7b027826, 0x6c024efc, 0xa00395fd, 0x038dc2c2, 0x008ac43c, 0x4b000200, 0xaa02f5ff, 0x0d002003, - 0x46001700, 0x191803b2, 0x20069146, 0x06a14410, 0x1b2f0a25, 0x4e190ab1, 0x03200628, 0x03210c82, 0x200c820f, 0x0f076c0a, 0xdb6b1520, 0x2223230d, - 0x43583526, 0x152c0805, 0x22233427, 0x33141507, 0xaa023732, 0x9f92909e, 0xa090919e, 0x037275bb, 0x01046f77, 0xaaaa9f3e, 0xae9d989e, 0xa90c9ead, - 0x9aa9b89f, 0x8020ff82, 0x02239482, 0x18001303, 0x20081bb8, 0x20738205, 0x20808705, 0x066a4601, 0x1005b023, 0x050557b0, 0x788a0320, 0x11232132, - 0x33253507, 0xc9b90202, 0x02136f01, 0x7792303a, 0x3c205182, 0xb2205182, 0x1721e182, 0xafda1800, 0x47588712, 0xd06c07df, 0x1602280b, 0x39121100, - 0x830f03b2, 0x0fb02206, 0x64bf1810, 0x0cb2230a, 0x1b830f00, 0x06841520, 0x21313024, 0xda183521, 0x7d2128af, 0xadda1801, 0xf5ff2312, 0xa382a902, - 0x7f002424, 0xcb5d1eb2, 0x820d200a, 0x870d20ef, 0x611720a3, 0xb223065f, 0x820d1700, 0xb07c347c, 0xb4182f00, 0x00600050, 0x80b67102, 0xa0009000, - 0x185d0300, 0x220eafda, 0x4e06000a, 0x242006ee, 0x22082741, 0x842412b2, 0x101723d0, 0x14891eb2, 0x08874118, 0x25059159, 0x23150622, 0xfd593634, - 0x54152006, 0x34270cb1, 0x0c012327, 0x18368451, 0x2114afda, 0xda18d201, 0x022a18af, 0x00003500, 0x1503be02, 0x0f190a00, 0xe0870ee7, 0x22083243, - 0x83040901, 0x2f0123b6, 0xa18802b2, 0xd006b02c, 0xb01001b0, 0x08b2d00b, 0x7646060b, 0x05e85805, 0x33013208, 0x23152315, 0x01272135, 0x35330133, - 0x5f5f0207, 0x9afebb5f, 0xbd6d0109, 0x0eba8bfe, 0xa3973a01, 0xf90179a3, 0x16f225fe, 0x00010000, 0x02f5ff4f, 0x248382ae, 0xb26a001a, 0x0a69720d, - 0x1b2f0224, 0x888702b1, 0x7c470d20, 0x02b02206, 0x48d91810, 0x07b2230a, 0x78820d02, 0x2f07b024, 0x968818b2, 0x1805b223, 0x6c148307, 0xb2230ced, - 0x82181311, 0x1ab22314, 0x06821318, 0x13313027, 0x21152113, 0x054e4107, 0x22230626, 0x16332726, 0x08066641, 0x3462072f, 0xacfeec01, 0x83473e14, - 0x818ca38c, 0x05b902ad, 0x42437572, 0x7f013543, 0x94969601, 0x787a861b, 0x52638499, 0x2844387d, 0x00020000, 0x2cbd824d, 0x002203b9, 0x001e0013, - 0x1f14b25b, 0x06396220, 0x6f180c20, 0xc5870b45, 0x21082f73, 0x976d1000, 0x0ab96e0a, 0xc5881420, 0x6d0cb021, 0x30250b9e, 0x22150131, 0x25af8a06, - 0x36343535, 0x12820333, 0x14153808, 0x35363233, 0x91320234, 0x6b470d89, 0x86a88775, 0xdef0ab93, 0x0f422d96, 0x0344357f, 0x625f9922, 0x777a8e45, - 0x319ba799, 0x57fee8d2, 0x91241724, 0x00743646, 0x82360001, 0x03ae22bc, 0x0e195a15, 0x8547a887, 0x10052308, 0x938804b2, 0x6a7fb220, 0x3a8c8205, - 0x21012301, 0xae022135, 0x01c4adfe, 0x024cfe53, 0xfdac0278, 0x967f0254, 0x44030000, 0x132b08bf, 0x24001c00, 0x07b29600, 0x69112625, 0x1426054f, - 0x1007b0d0, 0x1f4a22b0, 0x2070870b, 0x07204607, 0x11072222, 0x7c382d82, 0x182f22b0, 0x902280b6, 0x0322a022, 0x2250b45d, 0x71022260, 0x102200b4, - 0x40290683, 0x02225022, 0x22d0b45d, 0x210d82e0, 0x9e8919b2, 0x19220222, 0xb2233b82, 0x8522190c, 0x41b22070, 0x11210a4e, 0x74e21810, 0x0714210d, - 0x2206d348, 0x48373435, 0x5d0806f0, 0x34363201, 0x14062226, 0x22341316, 0x32161415, 0x71970236, 0x8c8ea184, 0x9b7184a4, 0xfe9b8281, 0x414035e4, - 0x9740406a, 0x316033c4, 0x37744102, 0x7a6a803d, 0x3d806b79, 0x76697437, 0x33e0fd76, 0x5a30305a, 0x56ab0133, 0x30302756, 0x46000200, 0xa302f7ff, - 0x13002003, 0x60001f00, 0x655314b2, 0x10142305, 0x501808b0, 0xff870bd1, 0x08a47d18, 0x08100222, 0x0227ff84, 0x10b0182f, 0x8811b210, 0x02b022dd, - 0x20cf8b10, 0x0e1e4208, 0x22230622, 0x172bc686, 0x07061415, 0x36323523, 0x5c373227, 0xcc82056a, 0xe7013708, 0x877e5a42, 0xa28b84aa, 0x13e0dc02, - 0x4e63798f, 0x33344223, 0x36013c41, 0x787d8a39, 0x3b97a6a4, 0x9301d9d7, 0x4534ac52, 0x394e4148, 0x01004437, 0x87029000, 0xab6b2d03, 0xfd2d311b, - 0x029d0263, 0x0300aa87, 0x48049600, 0x9506a202, 0x0f310982, 0x4e001b00, 0x2f0db000, 0xb0d019b0, 0x07b22f19, 0x08765a09, 0xb0d00223, 0x07525602, - 0x52560f20, 0x004f2707, 0x006f005f, 0xde825d07, 0xd003b025, 0x8203b019, 0x100d23f7, 0x368813b2, 0x01313026, 0x07230733, 0x8306fa44, 0x593720e6, - 0x2e0805a7, 0x22232634, 0xe6bc0106, 0x6e8295f5, 0x696c4c4e, 0x636b514f, 0x30242534, 0x34252430, 0xdec29506, 0x4d65644e, 0x4b62634a, 0x25313125, - 0x82333327, 0xfe0a329b, 0x041b044a, 0x0029004e, 0x00430036, 0x4408b29b, 0x06057a45, 0xb0d03026, 0x3ab01008, 0x200b8371, 0x0661471b, 0x1b2f1625, - 0x821116b1, 0x1026260c, 0xb0d028b0, 0x411e1928, 0x08b2230b, 0x41842616, 0x0fb22f24, 0x09830816, 0xb22f0f23, 0x086a5035, 0x351bb223, 0x2214820f, - 0x84081fb2, 0x10162325, 0x175c30b2, 0x10082309, 0x0d893ab2, 0xb2102623, 0x820d8841, 0x162325f2, 0x06141515, 0x2727ed82, 0x17141506, 0x85161633, - 0x4224200d, 0x372105ad, 0x06cc4726, 0x01211723, 0x28208206, 0x36323316, 0x25273435, 0x089c7303, 0x06227d08, 0x8a1b0415, 0x80ce733a, 0x73254551, - 0x8fcac3c2, 0xfed99afa, 0x7532b6f5, 0xc7fc645a, 0x71014b55, 0x312430fd, 0xac867288, 0x40eafe93, 0x7758597a, 0x0375b875, 0x166955a0, 0x125fa964, - 0x034a2f23, 0x588e9a01, 0x799b62a6, 0x483259a5, 0x9e315177, 0xcaa2165f, 0x13e5fb14, 0x4d423048, 0x096b405e, 0x4bb30202, 0x124e6766, 0x4d66664a, - 0x56000200, 0x5f04ebff, 0x10004e04, 0x6e001d00, 0x0a077f18, 0x53410920, 0x2f092406, 0x4109b11b, 0x4d180753, 0x6b440cd6, 0x1f621808, 0x0900270c, - 0x39121102, 0x06840bb2, 0x7702b021, 0x09230c5e, 0x411bb210, 0x53080a2c, 0x22230625, 0x10353502, 0x17323312, 0x13033337, 0x16140123, 0x37363233, - 0x23262635, 0x63030622, 0xe6c7f26e, 0x71e9c7e8, 0x736cdd1c, 0x7cc7fddd, 0x177c6074, 0x73637d11, 0x01d9c47f, 0x010ff420, 0xd736010a, 0xfde2fdc3, - 0xa0f901e4, 0x2fa6abac, 0x00c5b9a5, 0x9b2ed182, 0xf2040000, 0x1600b005, 0x61001e00, 0xd94518b2, 0x6a182005, 0x411809b7, 0x06490cd2, 0x20c48308, - 0x27eb820f, 0x593e0f0f, 0x010317b2, 0x4a052c57, 0x09220b1d, 0xd1491700, 0xcd7b1805, 0x0a854f0a, 0x16074e08, 0x17141513, 0x27262115, 0x23263435, - 0x36322125, 0x21213435, 0x02fc9701, 0xf7fff529, 0xfe4705e5, 0x7b043bfc, 0x01d3fe70, 0xfe819014, 0x02e3fef8, 0x05aafd56, 0xe3cdd9b0, 0xf6fe4565, - 0x1a3da973, 0x7479b831, 0x6d71ca80, 0x010000e6, 0x21c58200, 0xc5823005, 0x58000c22, 0x1805b14b, 0x52214b5b, 0x2f2215c3, 0x97181fb2, 0x023d234f, - 0xfcfcac43, 0x01ac018b, 0x020cfe36, 0x02d0fe20, 0x0590fd70, 0x029cfdb0, 0xfd47fd64, 0x28918309, 0x04000081, 0x00000635, 0x07434c0c, 0x0c1cd018, - 0x0ccd8f18, 0x530c1a42, 0x07270855, 0x12110208, 0x4f07b039, 0x945b0e7f, 0x23112807, 0x33113311, 0x82012101, 0x6fe23c02, 0x0169f2f2, 0xfe1c010f, - 0xfe8f019f, 0xfed901e6, 0xfc000627, 0xfe9e019c, 0x41b5fd11, 0x1226061d, 0x0b00b005, 0x1d414c00, 0x0cd44105, 0xa6180720, 0xe1410b71, 0xb768180c, - 0x03002208, 0x218b8201, 0x068505b2, 0x4d000921, 0x838b06e0, 0xfcfc973b, 0x01190206, 0x02a5fd38, 0x02c8fe7f, 0x0566fd9a, 0x027ffdb0, 0xfd35fd81, - 0x070f411b, 0x18062224, 0x838c0a00, 0x20074067, 0x63b31806, 0x20838c0b, 0x06827009, 0x0600b222, 0x06858385, 0x838c0820, 0x3a050641, 0x01f2f273, - 0xfe2a0159, 0xfedc0150, 0xfeeb01db, 0xfc180615, 0xfe9e0184, 0x83bafd0c, 0xff3e2e81, 0x05ef0313, 0x002a0073, 0x2b13b26f, 0x1563502c, 0x089d5518, - 0x09220322, 0x23055c50, 0xb0d00cb0, 0x210c0159, 0xed6f09b0, 0x10b2230b, 0x28831318, 0xb0102226, 0x22b0d01f, 0x230b4d6f, 0x280326b2, 0x6f501a82, - 0x3537230a, 0x72181533, 0x725009a4, 0x15072807, 0x26263523, 0x50143335, 0xcf240974, 0xcba6a0a9, 0x24087550, 0xbda0aec3, 0x0c7550e3, 0x10b48627, - 0xc015dcd9, 0x0979508d, 0x11ac8629, 0xc713e1e1, 0x834ac09a, 0x00382eeb, 0x041a0400, 0x001f009d, 0x201bb26e, 0x3d4f1821, 0x10b14f0d, 0x05131f22, - 0xb0212182, 0x0c3d7f1f, 0x7f180520, 0xb0340bc4, 0x08b0d007, 0x1000b0d0, 0xb0d00cb0, 0x0eb0101f, 0x1013b0d0, 0x220be87b, 0x851a1f17, 0x162130ea, - 0x21072107, 0x36363335, 0x35232727, 0x18262733, 0x080a5671, 0x2117173c, 0x85fe4703, 0x98025006, 0x0a65fc01, 0x01032b29, 0x06039ba0, 0xd9c2bfd8, - 0x4d5057f3, 0x01040557, 0xb2e50180, 0x0bc3c370, 0x93077d93, 0xd4eece69, 0x7e6a61bc, 0x01006979, 0xd1820e00, 0x8d043f29, 0x95001800, 0x831900b2, - 0x05ca426c, 0x240c084f, 0xb11b2f18, 0x55de8718, 0x002208bd, 0x9b82180c, 0x0c09b223, 0x22068201, 0x4d2f09b0, 0x403a05c1, 0x1f040f0d, 0x3f042f04, - 0x5f044f04, 0xb65d0604, 0x04df04cf, 0x5d0304ef, 0x401806b2, 0x0a200c42, 0xf5820d89, 0xee5f0920, 0x10062507, 0xb0d013b0, 0x4f071773, 0x33250565, - 0x15072115, 0x22018221, 0x82213523, 0x27200801, 0x01333521, 0x01250221, 0xfe0b010f, 0xdafed5be, 0xfe360110, 0xcafef2ca, 0xfe093601, 0xbefedcd3, - 0x2d06854f, 0x2a1d93b7, 0x91d9d991, 0x02931136, 0xeb820049, 0x00007624, 0xeb829703, 0x32000526, 0x070601b2, 0x0d8b5218, 0x820f8d59, 0x114a1883, - 0x11212f0d, 0x03211123, 0xf3d2fd97, 0xc9032103, 0x488237fc, 0x00020022, 0x2807c951, 0x00080003, 0x0905b23c, 0x0611540a, 0xb9460220, 0x14805806, - 0x0005b223, 0x18278202, 0x080a6d63, 0x21313021, 0x03330121, 0x21030727, 0x97fb7204, 0x69f6b901, 0x01de1312, 0xfe8d04e3, 0xfd4d4bc9, 0x5603006f, - 0x0329086b, 0x20001200, 0x07b27600, 0x06a84a21, 0xd001b026, 0xb01007b0, 0x24072b78, 0xb11b2f0f, 0x20cd870f, 0x260c8207, 0x593e0f07, 0x830f03b2, - 0xb07c2fef, 0xb4182f03, 0x03700360, 0x30b45d02, 0x06824003, 0x0300b224, 0xe98a7101, 0x0419b020, 0x58820caa, 0x230d6846, 0x05213521, 0x271ba156, - 0x5afe3803, 0x3701a601, 0x2314a756, 0x76c3df01, 0x201ca956, 0x084f4101, 0x38000826, 0x0a0907b2, 0x4108a341, 0x6f5a1447, 0x0207220d, 0x412e8200, - 0x25080549, 0x27012101, 0xfe0a0107, 0xf6b901ff, 0xfffeba01, 0x1312defe, 0x73fb8d04, 0x4d4b5603, 0x42000300, 0x55030000, 0x09828d04, 0x0b000728, - 0x04b25e00, 0x7f550d0c, 0x00b02405, 0x4b04b0d0, 0x93520965, 0x0853500c, 0x2209945a, 0x830a07b2, 0x07b02473, 0x4804b22f, 0xb0220853, 0xc474100a, - 0x268f830a, 0x21032135, 0x82132135, 0x55032b03, 0x1303edfc, 0x027efd49, 0x09834982, 0x3801c326, 0xc40a01c4, 0x21069d42, 0x93826204, 0x3f000722, - 0x0cef7018, 0x1b2f0624, 0x545906b1, 0x08d04514, 0x5b0eb177, 0x21280628, 0xfdf46204, 0xec03f3fb, 0x2207ad42, 0x82440001, 0x82e620f7, 0x000c2563, - 0x0d00b24b, 0x0961d718, 0x590ce954, 0x0120080e, 0xf953d288, 0x08b02306, 0x9c66b210, 0x2efc8209, 0x39121108, 0x01013130, 0x35211521, 0x82350101, - 0x01280806, 0xe6fe9002, 0x5efc7002, 0xc1fe3f01, 0xbafd7c03, 0x45021601, 0x98c47ffe, 0xa601b701, 0x8ffec498, 0x50000300, 0x4d050000, 0x11288582, - 0x1c001600, 0x08b26f00, 0x24053759, 0x14b01008, 0x216282d0, 0x3b431ab0, 0x82102006, 0x541020f9, 0x0f250cb2, 0x0fb2593e, 0x29758310, 0xb02f0fb0, - 0x09b2d000, 0x7c441008, 0xd0062206, 0x1b7418b0, 0x0fb0210c, 0x820bb156, 0x14b02553, 0xd01bb010, 0x5b08ad82, 0x14150416, 0x23150704, 0x35242635, - 0x35372434, 0x05020133, 0x34050411, 0x24112726, 0x01f04903, 0xede9fe14, 0xeafef0f3, 0xf3ef1701, 0x0104f9fd, 0x03ecfe18, 0x01829019, 0x0f150412, - 0xfad0caf6, 0x0f6c6d0f, 0xf7cdd0f9, 0xb7fd780d, 0x0215fdfe, 0x85fb152a, 0xd6fd0a81, 0x01000015, 0x0320db84, 0x1822db82, 0x4f454b00, 0x8212200c, - 0x451220cb, 0x16221042, 0xbe83120c, 0xcb831620, 0x1012b02a, 0xb0d017b0, 0x16b0d004, 0x200c9370, 0x2fb3830a, 0x11353636, 0x07061133, 0x23110706, - 0x03022611, 0x34080c82, 0x11171614, 0x7f230333, 0x6801f36e, 0xe3f3fa7d, 0x70f302fb, 0xdd01f37d, 0x01a7c218, 0xe3cdfe2f, 0xfe1daf93, 0x161701e8, - 0x00012a01, 0xd1fe3601, 0x0218c0a8, 0x2ca182af, 0x0400005f, 0x009d0484, 0xb25c0023, 0x01461807, 0x8219200a, 0x871920a1, 0x4a0f20a1, 0xb0240684, - 0xb0584500, 0x2207bc47, 0x5e100fb0, 0x0e260b99, 0xd000b0d0, 0x591819b0, 0x11260c33, 0xd020b010, 0xb28221b0, 0xb2822520, 0x2006404e, 0x24aa8215, - 0x33352115, 0x06d56026, 0x15004008, 0x07061415, 0x02211533, 0x946c78ad, 0x76948a8d, 0xb030fe74, 0x9cf283bd, 0x632a01ea, 0x2ffeb659, 0xb0c922c8, - 0xa9ac9e2b, 0xc7b128a4, 0x9bc4c823, 0x91162701, 0xe3fe84ec, 0xdf8d19ed, 0x8200c44a, 0xff242cc5, 0x045205ec, 0x0019008d, 0x1816b26b, 0x870f2356, - 0x820e20c5, 0x590e20c5, 0x18200781, 0x18200c82, 0x168c5518, 0x0208b223, 0x058a4d0e, 0x100eb024, 0xf56f0fb2, 0x08b02108, 0x2c0b4442, 0x21013130, - 0x21152135, 0x32333615, 0x21c28216, 0xf05a3523, 0x222a0805, 0x01231107, 0x03a6fe7e, 0x8aa0fead, 0xf0f0da8d, 0x747673eb, 0xf3858175, 0xc4c4c903, - 0xc6d427ee, 0x54bdc0bc, 0x26677269, 0x3962e7fd, 0x001d240a, 0x1803b28f, 0x570ad959, 0xb2201486, 0x21133962, 0x4e6215b2, 0x2f152d05, 0x0115ffb2, - 0x150fb271, 0x3fb27201, 0xcf200983, 0xb42f0482, 0x157f156f, 0xafb47102, 0x0215bf15, 0x835fb25d, 0x838f201c, 0xbd661804, 0x03b02109, 0x200c6448, - 0x197a621d, 0x82032221, 0x161624ef, 0x62363233, 0xfb28147c, 0xfe800116, 0x837e0a80, 0x37138162, 0x9f94c4cf, 0x02007062, 0x00002400, 0x8d041507, - 0x20001700, 0x04b27600, 0x2405b746, 0x18b01004, 0x056b48d0, 0x560c1b43, 0x00210893, 0x090b5f45, 0x7d12b021, 0x0b200c4f, 0x0b4c5918, 0x1214b229, - 0x39121103, 0x182f14b0, 0x820b6745, 0x0c555de1, 0x07061437, 0x03211121, 0x23060206, 0x36373723, 0x21133736, 0x16323311, 0x050c6425, 0x23264008, - 0xcff91507, 0xa4fe15fe, 0xac580b0e, 0x26013491, 0x150c4e60, 0xdaec3b03, 0xf140fdfa, 0x66767567, 0xd2ab7f01, 0xfec90302, 0xfffeef9c, 0x0702cd75, - 0x2b02ed9f, 0x0cd06cfe, 0x536b8efe, 0x5c006351, 0x0721051b, 0x25e58218, 0x001c0013, 0xb718b2c1, 0x132411bf, 0x13b11b2f, 0x870cf857, 0x8210200c, - 0x5c102019, 0x00221028, 0xd6831310, 0xb42f002f, 0x00bf00af, 0x3fb25d02, 0xb2710100, 0x820483cf, 0xb2722709, 0x7201005f, 0x0e83ffb2, 0x09820f20, - 0x006fb42a, 0x7102007f, 0xef00dfb4, 0xb4232b82, 0x822f001f, 0x9fb22106, 0xb2231982, 0x83020d04, 0x2f042448, 0x771000b0, 0xb0210aa7, 0x0c164f04, - 0xe9420d20, 0x33112d0f, 0x16323311, 0x06141516, 0x21112123, 0x0d699718, 0x01692108, 0x8cf2f3fd, 0xd2ff6fd2, 0x03fe1ffe, 0xf002f3f3, 0x767567f1, - 0x019e0266, 0x5f6cfeef, 0xd0af70ab, 0x21059661, 0x1f41a8fd, 0x00012e07, 0x05000024, 0x008d0452, 0xb2570015, 0x0a057c12, 0x240cfa5a, 0xb11b2f14, - 0x0f0a4114, 0x1003b022, 0x250b5e47, 0x08b2d000, 0xae430314, 0x0a8f4405, 0x200c9d43, 0x22af8217, 0x43232634, 0x86270b99, 0x04ebde8e, 0x437474f3, - 0xed350697, 0xfecbcf26, 0x7c5a0198, 0xe7fd2669, 0x00010000, 0x049ffe76, 0x269f8261, 0xb24f000b, 0x820d0c03, 0x0dcc795f, 0x4807ad41, 0x89481413, - 0x4708200d, 0xb0260838, 0x3130d009, 0x8d822121, 0x62112121, 0x612c05b8, 0xfef38afe, 0x0502f37e, 0x019ffef3, 0xfc236f82, 0x42ca0336, 0x0421053d, - 0x267d8428, 0xb25e0014, 0x84161508, 0x09a15fdf, 0x4d61758c, 0x46561808, 0x03b2230c, 0x3583080a, 0xb02f0323, 0x0cbd6508, 0x080cbc7c, 0x0131303d, - 0x16331521, 0x23061016, 0x01211121, 0x34353632, 0x11232726, 0xb7fdb203, 0xf8f4cffc, 0x031ffed9, 0x68a8fe3c, 0xf6667073, 0x03e0cb03, 0xcca8fec4, - 0x36fc8d04, 0x5d4f5463, 0x829cfe01, 0xfe2724a9, 0x821505af, 0x000f28a9, 0xb25b0015, 0x66171613, 0x0524064f, 0x0db000d0, 0x5c0ac96e, 0x63620c5e, - 0x06f64c0d, 0xb0100d24, 0xab82d00a, 0xd010b027, 0xb0d011b0, 0x0b1d6705, 0x37313025, 0x1837023e, 0x081065aa, 0x424a8233, 0x030c0523, 0xfcf2963d, - 0x0101f3f7, 0xfef00174, 0xc30d07a1, 0x7eb48651, 0x36fcc101, 0x5101ecfd, 0x1402affe, 0xfefc0603, 0x000100ae, 0x0600001a, 0x24ab821f, 0xb29e0015, - 0x0a734201, 0x240c5d60, 0xb11b2f0e, 0x14dd410e, 0x0c157518, 0x200c9844, 0x20338215, 0x22d48315, 0x830e030c, 0x2f0c2dff, 0x010c3fb2, 0x0c5fb271, - 0xcfb27201, 0xb4300982, 0x0cbf0caf, 0x8fb45d02, 0x020c9f0c, 0xd00fb072, 0x250b7478, 0x08b2d004, 0x3782040f, 0x0113b223, 0x0542490f, 0x82112321, - 0x21032101, 0x0d83aa18, 0x5ff50338, 0xfefc60f3, 0xfe5c01d3, 0xf71e01c4, 0xf754f354, 0xc2fe1e01, 0x12825e01, 0x2bfed523, 0x27038201, 0x39025402, - 0xe00120fe, 0xfd240383, 0x00a3fdd0, 0x422cf582, 0xe703f0ff, 0x27009d04, 0x26b28a00, 0x420a5d79, 0x1f7b0c43, 0x4e0a2008, 0xb2230b90, 0x82160a06, - 0x26b22190, 0xb0250684, 0xcfb22f26, 0x20d68226, 0x2804823f, 0xbf26afb4, 0xb25d0226, 0x220b82ff, 0x82260fb2, 0x835f20e7, 0x42232004, 0xb22308eb, - 0x83262310, 0x161c223b, 0x175c180a, 0x31302110, 0x20066e74, 0x078a5523, 0x1616072d, 0x23041415, 0x26272622, 0x54163335, 0x3f080582, 0x36333523, - 0x6b70e202, 0xf3f3665b, 0x6ef4d8c3, 0xfe6e6f5d, 0xaf5ddcfe, 0x0bf37c3f, 0xe07477ca, 0x03c79a94, 0x464f4643, 0xa7b3943c, 0x278a5b96, 0x9f5b9124, - 0x5b2f2db5, 0x4857939f, 0x04b003a6, 0x2b05e34d, 0x8d046e04, 0x4c000900, 0x0b0a00b2, 0x0d355b18, 0x4f0c4b4a, 0xb0200fae, 0x0c0e4218, 0x00030422, - 0xb2233b82, 0x41080509, 0x333c059f, 0x01112311, 0x11331123, 0xf3f37b03, 0xf3f3eefd, 0x73fb8d04, 0xddfc2303, 0xe0fc8d04, 0x40207786, 0x0c227782, - 0x594b7700, 0x0c8f6419, 0x4f0c9e52, 0x06220854, 0x70820502, 0x2f06b02e, 0x01063fb2, 0x065fb271, 0xcfb27201, 0xb42d0982, 0x06bf06af, 0x8fb45d02, - 0x02069f06, 0x0a4c4272, 0x1966b220, 0x52232008, 0xd33c0b37, 0x63f3f36a, 0x1d013801, 0xad0172fe, 0xd501d1fe, 0x8d042bfe, 0xe00120fe, 0xaefdc5fd, - 0x20064761, 0x26af8255, 0xb24d0010, 0x41121104, 0x31521527, 0x00b02114, 0x200cc150, 0x0b6a4409, 0x24068954, 0x06020603, 0x06664707, 0x55042508, - 0x0fa4fef3, 0x8caa570c, 0x6227013a, 0x04160c4a, 0x0373fb8d, 0xed9ffec9, 0x0178fefe, 0xa00b04cd, 0x002b02e6, 0x1f249182, 0x3904ecff, 0x0f249182, - 0x00b24300, 0x4e0a8561, 0x064e0ccf, 0x0706450c, 0x0801b223, 0x7dc0820f, 0x87820ad2, 0x13172008, 0x020e0121, 0x17372723, 0x21013732, 0xf3132902, - 0x70fe0a01, 0x5a7e5a38, 0x60570166, 0x825bfe33, 0x374b2e1d, 0x7efc7902, 0x0538697e, 0x036104c0, 0x2485837f, 0x05affe76, 0x24858224, 0xb242000b, - 0x06054609, 0xd5440320, 0x0c0e6005, 0x610c4b43, 0xf84508a3, 0xd000280a, 0x33253130, 0x45112303, 0x623407f8, 0xfcdd14c2, 0x0502f343, 0xecfdc3f4, - 0x8d045101, 0xca0336fc, 0x4121f782, 0x05d16200, 0x46001122, 0x111fa818, 0x650c2248, 0x0d2210a0, 0xf7820901, 0x4e0db021, 0x30200b7d, 0x071da818, - 0x33112723, 0x05ba7411, 0x1604333c, 0xea8186f3, 0x6ff301f0, 0xf3858279, 0xd226aa01, 0xfe6601d1, 0x266c779e, 0xbb421f02, 0x0e062105, 0x4122f384, - 0xf38607b2, 0x90080c43, 0x0ae84e74, 0xb0100324, 0x2f4fd006, 0x06b02405, 0x460ab010, 0x332005eb, 0x062af287, 0xf368fa0e, 0x01f35f01, 0xed85f360, - 0x7624f186, 0xd106affe, 0x0f246f82, 0x0bb24100, 0x4106e941, 0x3f5e1363, 0x44002008, 0xb0270863, 0x09b0d00d, 0x8307b0d0, 0x0eb0216c, 0x830e6241, - 0x0f062677, 0xfadd14c2, 0x41768596, 0x7b840b69, 0x0a000226, 0x1b050000, 0x0c287b82, 0x5e001500, 0x171608b2, 0x20066747, 0x068b4a14, 0x450ce441, - 0x072008f2, 0x230b7e4a, 0x03070ab2, 0x0a233583, 0x4d03b02f, 0xc0540da9, 0x3130220b, 0x05734a01, 0x11213525, 0x47163233, 0x05330868, 0xfecff91b, - 0x02a2fe15, 0xf9dbeb52, 0x756632fe, 0x4af96271, 0xc430065c, 0xfed06cfe, 0x4f536b9a, 0x8efe0263, 0x7600ffff, 0xa920ab82, 0x262aab82, 0x00000802, - 0xc2010700, 0x07823204, 0x4805d16d, 0x4d22072b, 0x2b4803b2, 0x48032005, 0x3150092b, 0x07b22314, 0xf8560604, 0x41132006, 0x034a094e, 0x20b2840c, - 0x83ae8223, 0x2ab189b0, 0xd2ff2804, 0xf2f31ffe, 0x886fd28c, 0xd0af29af, 0x6cfe8d04, 0xd4feab5f, 0x002eae86, 0x3c000100, 0x3004f0ff, 0x1d009d04, - 0xd94c8700, 0x0cdf4b0c, 0x1b2f1a2b, 0x3e0f1ab1, 0x1a00b259, 0x218f8212, 0x8c8803b2, 0x1209b223, 0x05cc4f1a, 0x2008246c, 0x071a6c71, 0x6c06416c, - 0xb2240832, 0x7201095f, 0x0b5f7818, 0x41181220, 0xb2210bd1, 0x8249840e, 0x05ba4ccf, 0x21352128, 0x06222302, 0xa6182307, 0x42080b8f, 0x2f012724, - 0x82787c0d, 0x7ffe0a80, 0xfb168001, 0xf30c7d72, 0xd6040114, 0x0c1701e2, 0x9bea7b01, 0x0ff8fedc, 0x62708401, 0x01c4949f, 0xc2706931, 0xf0e8feda, - 0x88ffa975, 0x0000bada, 0xff760002, 0x824106f0, 0x001328eb, 0xb2af0021, 0x83232204, 0x180420b9, 0x50096343, 0xda4d0cbb, 0x0c176b14, 0x080db223, - 0x05ca430b, 0xafb42008, 0x020dbf0d, 0x0d6fb45d, 0x71020d7f, 0x010dffb2, 0x0d0fb271, 0x8fb47201, 0x020d9f0d, 0x825fb272, 0xcfb2210b, 0x3f201583, - 0xb4230482, 0x822f0d1f, 0x4110832d, 0x10230c0e, 0x4117b210, 0xb0210858, 0x0d107103, 0x00100125, 0x18002223, 0x21070074, 0x676a0036, 0x41063011, - 0xdeeddffe, 0xbc13e2fe, 0x14bcf2f2, 0x6adc1d01, 0x102a126d, 0x041efee2, 0xe918fe8d, 0x706a0f01, 0x0002260e, 0x04000043, 0x06654312, 0x06b25a22, - 0x21056543, 0x59181006, 0x654308ff, 0x088a580c, 0x07091128, 0xb0391211, 0x64522f11, 0x0a01220b, 0x09305811, 0x224a0720, 0x3343080d, 0x34352601, - 0x11213336, 0x03231123, 0x33161413, 0x22231133, 0x16014306, 0x01d3f0d6, 0xe6f1f3cc, 0xdd6b612e, 0x026b61dd, 0xa3d1560a, 0x0173fbb9, 0x0344febc, - 0x01594a22, 0x0000574a, 0x000a0001, 0x82ff0300, 0x000d26a5, 0x0e01b250, 0x15f7670f, 0x1b2f022b, 0x3e0f02b1, 0x0207b259, 0x063f4308, 0x1f500420, - 0xd0012309, 0x794208b0, 0x07b0260b, 0xd00cb010, 0x05ba6930, 0x3335233f, 0x21152111, 0xa7023311, 0xd4d4f3d6, 0xd2fd2103, 0xfee601d6, 0xaae6011a, - 0xfec4fd01, 0x248383c7, 0x06affe1a, 0x2483826d, 0xb2a40019, 0x06c75008, 0x4a060b45, 0x62460ca4, 0x00b02407, 0x18b05845, 0x6a0ce844, 0x17220859, - 0xa0831109, 0xb22f1726, 0x7101173f, 0x73094273, 0x5a73076b, 0x42072006, 0xb2230817, 0x56170700, 0x4f4805ae, 0x25c1830a, 0x0fb2d00b, 0x4c840717, - 0x12b0102b, 0x1011b0d0, 0xb0d014b0, 0x26d78318, 0x23113313, 0x4a032311, 0x042611ae, 0xd0beeec1, 0xb04afdab, 0x5d022812, 0xedfd65fe, 0x4a015101, - 0x002f12b2, 0xfe760001, 0x047c04af, 0x0010008d, 0x4800b288, 0x04200689, 0x24057147, 0xb11b2f0c, 0x0c92520c, 0x01410c87, 0x08a6680c, 0x0c090d22, - 0x24054443, 0x010d3fb2, 0x092a4371, 0x43075343, 0xa5470642, 0x00b22309, 0x31830d08, 0x41100621, 0x30230a01, 0x84010131, 0x490120e5, 0x02280851, - 0xc8210193, 0xc2fe9bd0, 0x23075549, 0x70fe5202, 0x5749d387, 0x05474705, 0x82fe0421, 0x001426c9, 0x1505b280, 0x084f4216, 0xc6821420, 0xb9871420, - 0x200c9c45, 0x20198211, 0x07ee4e11, 0x2109165c, 0xf94f1411, 0x05f24f05, 0x01005f28, 0x00cfb272, 0x08507101, 0x8fb42a06, 0x02009f00, 0xd004b072, - 0x0df774b0, 0xb2d00c25, 0x4a000c08, 0x352306af, 0x5b331533, 0x232305bf, 0x84352315, 0x012508c9, 0x37a34769, 0x1c013801, 0xae0172fe, 0xc2fed1fe, - 0xf347a33e, 0xdead02f3, 0xfde001de, 0x01affdc4, 0xfecbcbd5, 0x053f6a2b, 0x00002424, 0x0a824e05, 0x85000e24, 0xef6f09b2, 0x0cb9430a, 0x4a0c0449, - 0x5a180ccf, 0x082208e9, 0x90820702, 0x2f08b02a, 0x01083fb2, 0x085fb271, 0x0982cb83, 0x08afb42b, 0x5d0208bf, 0x9f088fb4, 0x0ccf4a08, 0x4f07b021, - 0x84180bec, 0x02271767, 0xfef36ae1, 0x4a5302a0, 0x03240ee2, 0x20fec3ca, 0x0033cc85, 0xff4f0002, 0x049805eb, 0x002300a5, 0xb28c002e, 0x83302f15, - 0x10152189, 0x08013419, 0x1b2f1b24, 0xa64e1bb1, 0x1466570c, 0x2109f757, 0x7f181b04, 0x134d25dd, 0x02b02a09, 0xd026b010, 0xb2101bb0, 0x0876432c, - 0x05313038, 0x23062722, 0x35030020, 0x15330034, 0x15150622, 0x33331614, 0x0f822637, 0x3233122d, 0x10151712, 0x01331607, 0x63361710, 0x56080581, - 0xe3980511, 0xfea991ae, 0x04acfeda, 0x71db0801, 0x1bc0cb7f, 0xdc02c01b, 0x01ddc6bf, 0xfd5c5fa3, 0x01a2be94, 0x10b35b53, 0x3c013e39, 0xfe3a1801, - 0xb4cc2e01, 0xcdcb26b1, 0x1e01aa02, 0x0d01ea2c, 0x48ecfcfe, 0x0badfffe, 0xf4fed201, 0x35f3786f, 0xd2fe90a0, 0x6a00ffff, 0x263c07fb, 0x0000d201, - 0xde010700, 0xd5fe3b00, 0x15000100, 0x8b04affe, 0x0f008d04, 0x0ab25a00, 0x20069d49, 0x058f4307, 0x4b0c145c, 0x0b200c97, 0x4406b472, 0xb2260c9e, - 0x110b0f00, 0xbb513912, 0x0ab2230a, 0x9f420f0b, 0x21132105, 0x21066443, 0x09820303, 0x6b022121, 0x092306b0, 0x6b92cfc4, 0xfe250fb1, 0x01edfd77, - 0x0ab56b51, 0xaffe2424, 0xa1842e06, 0x09b25c22, 0x0220a186, 0x0a7e5018, 0x410cfe55, 0xea5a0fd2, 0x1808200b, 0x240bec4f, 0xb0d00ab0, 0x078b5d0b, - 0x4bd00d21, 0x250808bd, 0x15213521, 0x11211121, 0xc46a0533, 0x44fcde14, 0xa203a4fe, 0x0602acfe, 0xecfdc3f2, 0xc9035101, 0xfafcc4c4, 0xeb6bca03, - 0x16042106, 0x17249782, 0x04b24f00, 0x0a136c18, 0x240cc644, 0xb11b2f16, 0x10544b16, 0x0c011029, 0xb0391211, 0x45b22f10, 0xb027099e, 0x10b0d004, - 0x8213b010, 0x2321298a, 0x15070611, 0x26263523, 0x0805d54b, 0x3335172d, 0x11373615, 0xf3160433, 0xcca3564c, 0x54f302cf, 0x584aa356, 0x16aa01f3, - 0x0dc8cc0a, 0x6a01bfd1, 0x696b9ffe, 0x09f2f30c, 0x831f0218, 0x0076249b, 0x824b0400, 0x0f654c9b, 0x540cd241, 0x96470c88, 0x10042208, 0x239b8301, - 0x0db22f04, 0x260ac342, 0x36113313, 0x18163233, 0x080a65cb, 0x86f3762f, 0xf3efed80, 0x85817475, 0xfe8d04f3, 0xd1d62656, 0x61019efe, 0xfd26697c, - 0x000200e0, 0x05f0ff0a, 0x00a304a8, 0x0023001b, 0x240db264, 0x23548325, 0x1db0100d, 0x5106794b, 0x73430c86, 0x0e202208, 0x20278300, 0x7d7f1820, - 0xd003290c, 0xb01020b0, 0x00b0d00a, 0x200ce359, 0xd44a180e, 0x0548080d, 0x26270020, 0x14333526, 0x023e1716, 0x11002033, 0x21122115, 0x17373732, - 0x22030606, 0x35210706, 0xc9032634, 0xc0fefafe, 0xc1bfae0c, 0x8f095854, 0x000191f1, 0xc0fc1701, 0x864f0112, 0x3b412f73, 0xa080a1c5, 0x954c0208, - 0xea3dff82, 0x5dbbdd0b, 0xe4920c76, 0xfee5fe7e, 0xd0fe95f7, 0x21ba122b, 0xa5ee032c, 0x9586168c, 0x24dd8200, 0x04f0ff4f, 0x24dd8281, 0x001e0016, - 0x69ed185e, 0x0c7f5017, 0x3ba37b18, 0x14151725, 0x82230606, 0x354b08d2, 0x23262621, 0x27070722, 0x32133636, 0x15213736, 0x39021614, 0x3b010b01, - 0x96f98c02, 0xebfefefe, 0xb3073f03, 0x2d7686a6, 0x98c94041, 0xfd0a9e81, 0xa30494b4, 0x7af9dcfe, 0x0188f99b, 0x9508011c, 0x112c9a96, 0xfc2b22ba, - 0x848ea312, 0x00012ec9, 0x03ecff42, 0x008d04e8, 0xb2690019, 0x17595912, 0x2008ef43, 0x0b687102, 0x0204b22a, 0x39121100, 0x020b19b2, 0xb0270682, - 0x05b02f19, 0x850fb2d0, 0x0df4740c, 0xb2101923, 0x08454918, 0x01313025, 0x18213521, 0x22099d7b, 0x52163335, 0x2e080510, 0x02352323, 0x03defd8d, - 0xc6fe0152, 0x00ffc2a2, 0xf3f7d0df, 0x73657104, 0x037df173, 0xfe9bc4c9, 0x8bbf14c0, 0xa1b9c0a8, 0x535a5049, 0x5f00bbb0, 0x0e260923, 0x1c001500, - 0x91757e00, 0xd00f230a, 0x235f03b0, 0x15904b09, 0x5a7ca282, 0x0b13220a, 0x2fc48203, 0x2f13b07c, 0x1360b418, 0x5d021370, 0x401330b4, 0xb2290682, - 0x5d0113f0, 0x011300b2, 0x18528271, 0x220b094f, 0x58b21013, 0x275f0c73, 0x2201230d, 0x9f180706, 0xc975091b, 0xf0fd300d, 0x020e9479, 0x78930e36, - 0xfd0e9179, 0x75950fcc, 0x012b12d1, 0x95959d7f, 0x9ddbfc9d, 0x629d9393, 0x27240b8b, 0x25b2ae00, 0x240ae553, 0xb11b2f1d, 0x10695c1d, 0x0c1d0622, - 0xb03dcd82, 0x0fb22f06, 0xb05d0106, 0x01b0d001, 0x01cfb22f, 0x09405d01, 0x012f011f, 0x014f013f, 0x82d48204, 0x02b22110, 0x23099961, 0x07b21006, - 0x5d0c546c, 0xb03609fd, 0x0fb0d00e, 0x1007b0d0, 0xb0d011b0, 0x13b01006, 0x1002b0d0, 0x578216b0, 0x18b01028, 0x101db0d0, 0x2d4424b2, 0x21b22308, - 0x7d820124, 0x210cb22c, 0x31305d01, 0x21152101, 0x04821517, 0xd2620620, 0x23372406, 0x62353335, 0x012c11d5, 0xfe8301c4, 0x7b010382, 0x261273fe, - 0x0805da62, 0x9612343c, 0x999e03a1, 0xbfd80601, 0x54f3d7c4, 0x05574d53, 0x4292ba02, 0x35459316, 0x6c0ec3c3, 0x924a0e93, 0xd0eece27, 0x7e675ab6, - 0x01000079, 0xf0ff4600, 0x9e04b003, 0xa0002200, 0x76180ab2, 0x84450aef, 0x08e8440c, 0x09162222, 0xb030a582, 0x0fb22f22, 0xb45d0122, 0x22202210, - 0x00b25d02, 0x500cb662, 0x00290afd, 0xd00cb010, 0xb01022b0, 0x3105840e, 0x13b0d013, 0x13cfb22f, 0x1fb65d01, 0x3f132f13, 0x3b820313, 0xb2200d82, - 0x1b036318, 0xb0d01d26, 0x1fb01010, 0x0c036318, 0x27242226, 0x35333523, 0x362b0382, 0x17323336, 0x22232607, 0x82152107, 0x034c0801, 0x1183fe4e, - 0x79506f7b, 0xd46e761b, 0x971afffe, 0x1a989292, 0x7a6cd3ff, 0xd6755b16, 0xfe7c0122, 0x0183017d, 0x1c686a84, 0xc4d01fbf, 0xc3935c92, 0x1cbf20d6, - 0x005c93d6, 0x76000400, 0xc7070000, 0x03009e04, 0x1d000f00, 0xaa002700, 0x23495c18, 0x24074542, 0xb11b2f24, 0x14c04a24, 0x5c182120, 0xb6282249, - 0x02100200, 0x5d030220, 0x200ab56e, 0x0c5f6fb0, 0x6c06b021, 0x5c180b8f, 0x25230f4d, 0x18213521, 0x49114d5c, 0x0624051b, 0x01230115, 0x3b069b5a, - 0xc5fd8807, 0x8afd3b02, 0xc03601bf, 0xc1cafebe, 0x50535aaf, 0x4f5d0258, 0xa6fe5d4e, 0x3807be79, 0xf20195c8, 0x9cb8b996, 0xb8b89648, 0x6557059b, - 0x57535462, 0xfc5b6364, 0x0dd779b4, 0x0000282e, 0x8d04aa04, 0x1e001500, 0x0db28c00, 0x2305bd69, 0x17b0100d, 0x4706ab46, 0x2f610cd1, 0x03062108, - 0x20076343, 0x08fa4205, 0x1801b021, 0x18094f60, 0x31085643, 0x9f0a8fb6, 0x030aaf0a, 0x0a1fb45d, 0x71020a2f, 0x2f8909b2, 0x2f841320, 0xb0d01429, - 0x16b0100a, 0x4f0cb0d0, 0x25210dba, 0x63601821, 0x1016240c, 0x78210706, 0xf6240b1a, 0xd0f3f5fe, 0x33080082, 0xf6d1eb01, 0xf6fec8ed, 0xf5fe0b01, - 0x757361f8, 0x9999f95e, 0xb74db699, 0xfed33a02, 0x4d05cdb4, 0x55670401, 0x02006556, 0xecff7c00, 0x00064604, 0x1a000f00, 0x246b0019, 0x300c0559, - 0xb11b2f06, 0x593e0f06, 0x030c05b2, 0xb2391211, 0x8306840a, 0x0a6252b3, 0x280ce467, 0x14013130, 0x27222302, 0x9f291907, 0x04320813, 0xc0c7f346, - 0xf3d2116d, 0xf0ccb269, 0x9a7b8bf3, 0x7a994744, 0xf411028a, 0x7a8ecffe, 0xd2fd0006, 0xfed6fe7c, 0xbba608fa, 0x8737fe85, 0x010000bc, 0xbd825000, - 0x4e040028, 0x4b001d00, 0x4b5f17b2, 0x2052180a, 0x0826560c, 0x23094654, 0x100803b2, 0x1420b083, 0x51054b62, 0xb6180c2d, 0x35250b32, 0x36363435, - 0x06537f33, 0x0805a84b, 0x5a420233, 0x04e4067a, 0xe674ca7a, 0xe17af2fe, 0x06f4c398, 0x5c7807e4, 0xae858579, 0xb0664f69, 0xfe2b0164, 0x87fb9e19, - 0x765fb4e4, 0xad1bb2b3, 0x000200b0, 0x2aa5824f, 0x00000617, 0x001c0011, 0x621ab264, 0x1a2005ed, 0x4b050b6c, 0x52180659, 0xd14f0cde, 0x0d4c4b07, - 0x0d040622, 0x0b20b283, 0xb0200684, 0x210cae5d, 0xcf5f04b0, 0x3130220b, 0x2cb58413, 0x11331117, 0x23062723, 0x35262622, 0xc44a1837, 0x703c080a, - 0x6aac82cd, 0x6c11d3f3, 0x74cb7ebb, 0x947b8df3, 0x7d924646, 0x9f26028d, 0x02778cfd, 0x7500fa29, 0x9bfd8c89, 0x81c29d01, 0xc17dd701, 0x00ffff00, - 0x0200005b, 0x00b505b2, 0xb3150006, 0x2e05bb7b, 0x045504ec, 0x000f004e, 0xb2430019, 0x821b1a04, 0x43828297, 0xcc8c081d, 0x7c08d958, 0x2b820935, - 0x870a9d52, 0x150024ae, 0x82061415, 0x003e08ad, 0x16141735, 0x34353632, 0x4c062226, 0xe696eb82, 0xed7f2001, 0xe1fee698, 0x93fc95f2, 0x0295f897, - 0x8bfd9f27, 0x0dfccdfe, 0x018dfc9d, 0xa009fe31, 0x9fb5c4c4, 0x0200c6c5, 0x60fe7c00, 0x97824404, 0x1b001028, 0x19b26e00, 0x97831d1c, 0x18101921, - 0x24084dad, 0xb11b2f0d, 0x07456e0d, 0x0c525f18, 0x19820720, 0x6f110721, 0x765606b3, 0x0d062208, 0x21418204, 0x06840bb2, 0x5f0db021, 0x04200c2e, - 0x840eeb47, 0x274508ba, 0x33112311, 0x32333617, 0x34071712, 0x07222326, 0x32331611, 0x6f440436, 0x6cb181c8, 0x6c0ed9f3, 0x0aefc1ba, 0x927c91f1, - 0x78934544, 0x9e110293, 0xfe748afd, 0x71da0500, 0xecebfe85, 0x78c29f27, 0xc37817fe, 0x20c98200, 0x20c9824f, 0x20c98616, 0x20c98a6b, 0x0b677c04, - 0x141f4d18, 0xc9820920, 0xc9870920, 0x42081a52, 0xb2210c3b, 0x0cff5514, 0x180bb248, 0x2609074d, 0x23061123, 0x42270222, 0x2c080b37, 0xb786cd6f, - 0xf3d2116b, 0xf6beaa6a, 0x7893f20b, 0x8c484690, 0x26028f7e, 0x828afca2, 0x0126fa6e, 0x1c0170fc, 0xc59e27e2, 0x73f40176, 0x24c583c6, 0x04ecff53, - 0x24c5820b, 0x001e0016, 0x12134b7c, 0x4b0cad6d, 0x1b3a08f1, 0x12110008, 0x2f1bb039, 0xcf1bbfb4, 0xb45d021b, 0x1b6f1b5f, 0x1fb47102, 0x06822f1b, - 0x1b8fb228, 0xefb45d01, 0x0b83ff1b, 0x424a0c20, 0x0e095108, 0xfe540820, 0x3130220b, 0x9a7a1805, 0x15122808, 0x16162115, 0x4c363233, 0x35080b05, - 0xfef27602, 0x8be27dcf, 0x3efdf1dd, 0x558da90f, 0x3f3a3192, 0x7c66a7bd, 0x73d00110, 0xf7280114, 0x8bf99e21, 0x7bf7f4fe, 0x202f9d85, 0x033932a6, - 0x1a7c8d9f, 0xe1837f70, 0x56fe5124, 0xe1820404, 0x24001926, 0x22b28300, 0x2105ab74, 0x2b191022, 0x00208241, 0x0dc64e18, 0xc8410220, 0x514d080a, - 0x6bbdc3e7, 0xfafed011, 0x37af57ed, 0x8e837535, 0xbeae6a82, 0x7381f2ea, 0x94444397, 0x26028076, 0x862b01fd, 0xf210fc72, 0x212efefe, 0x94963fb0, - 0x2f017622, 0x85b7a8f6, 0xb57fd101, 0x00010000, 0x05ebff6b, 0x00c50526, 0xb240001d, 0x0a75450c, 0x1b2f0c24, 0x5b180cb1, 0x0d460f8b, 0x421a2011, - 0x3020087e, 0x151f3f19, 0x15024208, 0x33121415, 0x05373632, 0xd2fe1724, 0xdcfeb6f9, 0x019e01a0, 0x01fbb720, 0x16fd1734, 0xccac90a3, 0x9b91acd2, - 0xe9da0116, 0x01b4fafe, 0xd53cd245, 0xfeb44a01, 0x9298e9f3, 0x34efe6fe, 0x8fe4feeb, 0x26a58a96, 0xb2550020, 0x5322210c, 0xa598088d, 0x640aa044, - 0xb2210c3d, 0x05d64620, 0x6b2f2021, 0x25350c0a, 0x22230406, 0x35270224, 0x33241234, 0x23170432, 0x02222102, 0x08b98607, 0x35211143, 0x46260521, - 0xc0b0dcfe, 0x02adcefe, 0xb723019f, 0x1f2b01f8, 0xe9fe2ef9, 0xe803d3aa, 0x1f9b64bc, 0x1f02ddfe, 0xb2725fbc, 0x31d14801, 0xb64f01d9, 0x0701e3f0, - 0x33e9e5fe, 0x30dffeec, 0xc01b0124, 0x05457200, 0x0517052b, 0x000b00b0, 0xb2460015, 0x05475703, 0x40180320, 0x0124096f, 0x01b11b2f, 0x106b7e18, - 0xfd610120, 0x5a00200c, 0x40080ba3, 0x11333130, 0x12043221, 0x02141517, 0x11030704, 0x35123233, 0x23023435, 0xc8be019b, 0x03b24101, 0xccc0feb0, - 0xf8dcaec4, 0xb005daf1, 0xc8c3feb1, 0xbffecc38, 0xe40403b2, 0x0e01e6fb, 0x01ea26f0, 0x2a95830c, 0x05ebff6b, 0x00c50572, 0x82200011, 0x09cf6595, - 0x2007c94f, 0x2095820d, 0x7d95870d, 0xb14608c9, 0x421d2010, 0x8e820b07, 0x220b4d41, 0x82071712, 0x02222695, 0x16141515, 0x08a48216, 0x72053740, - 0xb4d8fea6, 0xaad8feb2, 0x2a01a501, 0x2601b2b4, 0xdcfb04a8, 0x66dfa9ad, 0xd8a46eb6, 0xcec3020a, 0xbabab0fe, 0x31c94e01, 0xc04d01cb, 0xc6b9feb7, - 0x2201e412, 0x25e8dbfe, 0x0186f193, 0xb785da09, 0xb7840320, 0x23001422, 0x0820b782, 0x23058150, 0x20b01008, 0x20065545, 0x20b78210, 0x63b78710, - 0x10210863, 0x0b576610, 0xb2100823, 0x24b78d20, 0x25071707, 0x21bb8806, 0xba8f0420, 0x72053538, 0xa5ef8997, 0x3e43d5fe, 0xaadafeb3, 0x2801a702, - 0x27016801, 0xbe8201a8, 0xdeaa3008, 0xae6fb566, 0xcac602d9, 0xc062bdfe, 0xb70df594, 0x2ecb4d01, 0xbb5201d0, 0xceaffeb7, 0x1f01ec05, 0x1defddfe, - 0x0184f297, 0x0000f520, 0x82970001, 0x04ef26c6, 0x0006008c, 0x053a6732, 0x450c5160, 0x04280842, 0x12110500, 0x2f04b039, 0x350a5d5b, 0x23213130, - 0x25350511, 0xf3ef0233, 0x39029bfe, 0x7a69031f, 0x5382d0cd, 0x00006e2c, 0x9e042c04, 0x59001900, 0xef4f09b2, 0x0c7e580a, 0x18205a88, 0xb223fc88, - 0x82001802, 0x03b22365, 0x06821100, 0x1011b022, 0x210ac54a, 0x14840cb2, 0x1117b222, 0x25058e56, 0x01352121, 0x0e6a3636, 0x23380806, 0x33363634, - 0x14151632, 0x21010706, 0x60fc2c04, 0x3946fb01, 0x7b675a69, 0x85d779f3, 0x6e57eaca, 0x4902b1fe, 0x3fba019f, 0x5a484063, 0xbc736078, 0x5a9cb76a, - 0xd6fe669f, 0x2a06c752, 0xc4059703, 0x32000700, 0x180803b2, 0x5709159e, 0x2c590c56, 0x10062108, 0x0a846418, 0x31302108, 0x21113301, 0x21112311, - 0xfdf3a402, 0x2e02f3d2, 0x05fec405, 0x8d0437fc, 0x0f000100, 0xf203a3fe, 0x19220982, 0xf5505900, 0x2f0c2e08, 0x584500b0, 0x1b2f02b0, 0x3e1d02b1, - 0x0a395459, 0x2306a47f, 0x020c05b2, 0x0524fb83, 0x100cb02f, 0x240a8a66, 0xb21005b0, 0x9f6f1817, 0x19b22208, 0x06d87317, 0x21352125, 0x83160115, - 0x230424f9, 0x50372722, 0x400805e4, 0x35232326, 0xbafd9e02, 0x9dfe7703, 0xfe90dbab, 0xcec7b0f2, 0xa4ad9d39, 0x48b7aac4, 0x8fc4c903, 0xf71a80fe, - 0x84f3a3b0, 0xb858b667, 0x7b929692, 0x00020000, 0x04c4fe35, 0x008c048b, 0x000e000a, 0x05094252, 0x0cd24318, 0x4b0c8b57, 0xff4a08a5, 0x06b02c09, - 0xd005b010, 0xb22f05b0, 0x83000608, 0x100028c1, 0xb2d00cb0, 0x8202090d, 0x303d080c, 0x15332531, 0x11231123, 0x33012721, 0x07112101, 0xb6b6d503, - 0x0658fdf2, 0xfdfaa602, 0x17aa0164, 0xc5fec3c2, 0x03943b01, 0x0236fcf9, 0xff002a80, 0x024b00ff, 0x05aa028d, 0x010703b8, 0x209e82d4, 0xed781898, - 0x2f0a2c07, 0x1f0ab11b, 0x10b0593e, 0x833130d0, 0x02352627, 0x05be0298, 0x202782ad, 0x18278bd8, 0x820d1579, 0x824f204f, 0x84ae204f, 0x84d92027, - 0x85102027, 0x07ee44e3, 0x82313021, 0x824d2023, 0x05b92223, 0x204b82ba, 0x204b8bda, 0x20738200, 0x20738300, 0x20738614, 0x85738236, 0x8bdb204b, - 0x8205204b, 0x82052027, 0x894b8427, 0x84dc20bf, 0x85192023, 0x1811206f, 0x2307e26f, 0x11b0d019, 0x8305a64f, 0x024624c5, 0x84a3028f, 0x8bdd20ed, - 0x82082079, 0x8208202d, 0x1ab02151, 0x00377983, 0xfe660001, 0x041e04a0, 0x001c008c, 0x1d19b25d, 0x3912111e, 0x570eb000, 0xc4180d49, 0x01210c78, - 0x2222820e, 0x522f07b0, 0xb2230a45, 0x83190705, 0x09651814, 0x11b2220c, 0x22148313, 0x7e191cb2, 0x03240a8e, 0x12363736, 0x4205414b, 0x36080959, - 0x87070622, 0xfd29035a, 0x86652d9a, 0xf585edcf, 0x4ab5e4a5, 0xab8fbd84, 0x6653788e, 0x0375011b, 0xaafed217, 0xfe020232, 0xf398e4f7, 0x63b27582, - 0xa28794b3, 0x82003b35, 0xfe4324bb, 0x821004c4, 0x000625bb, 0x01b00025, 0x8b0dd667, 0x180020b4, 0x7d079544, 0x230805d4, 0xb6fd1004, 0xfd3e02f3, - 0x04cd0332, 0x05befa06, 0x0200c305, 0xf0ff4f00, 0x9d046d06, 0x1e001400, 0x16b29100, 0x20054d4f, 0x09254916, 0x530c465a, 0x00240c9a, 0x00b11b2f, - 0x42071f5b, 0x0b2008d4, 0x230bd146, 0x0b0010b2, 0x20063a57, 0x089b4411, 0x1000b022, 0x0bd45e18, 0x26560220, 0x180a200c, 0x2c0dc284, 0x22052121, - 0x34351100, 0x05333612, 0x3f4e1821, 0x37052307, 0xef4d2711, 0x06390805, 0xfe47fd6d, 0xdafeecad, 0x019bf085, 0xfdb80253, 0xfef601b7, 0xfb4c020a, - 0x86cfcdf4, 0x01109998, 0x2e0c0135, 0x8b0701ac, 0xf2fec410, 0x0fcafec3, 0x09140308, 0xb235b7c0, 0x2ef982c7, 0x04b4fe73, 0x00a00454, 0x00240018, - 0x4a1fb253, 0x1f20051f, 0x2005a961, 0x0ee35c14, 0x49551420, 0x1419220c, 0x24d5820c, 0x2f19b07c, 0x9d701818, 0x7270180b, 0x3205270e, 0x23063736, - 0xa64e0222, 0x11002405, 0x44021415, 0x13210559, 0x071f5132, 0x16144108, 0xbd98e901, 0xd1aa7219, 0x87da7bf7, 0x911401f1, 0x9eb2f3fe, 0xd17d2f84, - 0x7f8852b0, 0x898a876d, 0x015abec8, 0xed99e512, 0xfed1fe80, 0xfee5cef6, 0xb63cb2b2, 0x78e9012f, 0xb1b4a5ac, 0x00b08a92, 0x6224c782, 0x8504ebff, - 0x0d28c782, 0x46001a00, 0x1c1b03b2, 0xb0219b82, 0x090f5103, 0x500cc141, 0x4e180822, 0x816e10c8, 0x31303309, 0x23001001, 0x35022622, 0x32330010, - 0x34071216, 0x075b2026, 0x08d18205, 0xfe850442, 0xf39ef3e3, 0xf21f0182, 0xf281f29f, 0x99f6fe9b, 0x9785869a, 0xfe3e0202, 0x8ec4fee9, 0x01c70c01, - 0x8e3e0116, 0xb8a7f3fe, 0x2cbac8c7, 0xb4c5cdb5, 0xb5ffffff, 0x93014bfe, 0x06023a04, 0x00009b00, 0x002b0f91, 0x0100008f, 0x003a0482, 0x848c0006, - 0xfefb221f, 0x200f845c, 0x820f8326, 0xd2a32415, 0x8dffff0a, 0x01002325, 0xf9827600, 0x9c04162a, 0x65002100, 0x232201b2, 0x2408454a, 0xb11b2f15, - 0x07125315, 0x0c821f20, 0xa6421f20, 0x6d102007, 0x1f2007cd, 0x230b7c46, 0x151f0ab2, 0x23063464, 0x08b2d019, 0x21081c46, 0x9e4915b0, 0x4625200d, - 0x4d080914, 0x22232613, 0x11231115, 0x32333636, 0x16031716, 0x06141516, 0x01272223, 0x4d484beb, 0x54747c5c, 0xb15146ca, 0xcfd101ef, 0xf968cd78, - 0xafd9aaa1, 0x31db6c7c, 0x47585265, 0x390101a3, 0x021cfdf9, 0x61d5d7f0, 0x17d4fe6f, 0xcaaf81a4, 0xdb820036, 0x02472008, 0x02540209, 0x000602cd, - 0x00000011, 0x00f7ff02, 0x05f00400, 0x000f00b0, 0xb282001d, 0x831f1e10, 0x101023a0, 0x0f4906b0, 0x92b81806, 0x0801480c, 0x5c480320, 0x2f032d05, - 0x0103cfb2, 0x033fb25d, 0x6fb27101, 0x1f200483, 0x9f200483, 0x0f251383, 0xb2720103, 0x099c4d02, 0xb0d01123, 0x0bb96100, 0x7d05b021, 0xb02b0b83, - 0x1db01003, 0x333130d0, 0x4a352311, 0x1530059d, 0x04021415, 0x11231323, 0x35363233, 0x23263435, 0x2e080982, 0x01bbbbb2, 0x2b01c1ae, 0xcffea5a4, - 0xa3e53fc5, 0xc4ced5cb, 0x8c02e5b1, 0xac7a02aa, 0x49ccc4fe, 0xaac6fecf, 0x3efe8c02, 0xed46f0fd, 0x4052fefa, 0x012ee1df, 0x0000d4ff, 0x00061604, - 0x74001800, 0xbb790cb2, 0xbbc61806, 0x152f2529, 0x0fb25d01, 0x18290483, 0x1211150f, 0x2f18b039, 0x11c418b2, 0x0f04210b, 0x04201483, 0x270e4b4c, - 0xb0d011b0, 0x13b01018, 0x2305e362, 0x13203336, 0x0809696f, 0x35231132, 0x15333533, 0xe7710233, 0x5a01b677, 0x5e61f305, 0xc3f34892, 0x04e7f3c3, - 0x8afdfec7, 0x3dfd75fe, 0x5d70ba02, 0x04fbfc82, 0x8f8faac7, 0x2d000100, 0xb024c182, 0x0f00b005, 0x4807bd7c, 0x78490831, 0x3e0f2608, 0x0a0fb259, - 0x208b8302, 0x28a08b0f, 0xb0d004b0, 0x06b0100f, 0x0d6e77d0, 0x080e7d63, 0x1521352f, 0x03331121, 0xd3fbcfb9, 0x043efed3, 0xcf3afe83, 0xeefc1203, - 0x01aa1203, 0xfecccc28, 0xff0100d8, 0x02ecffe8, 0x00410585, 0xb272001c, 0x06a54700, 0x1b247d83, 0x1bb11b2f, 0x61076351, 0x1b2608a8, 0xd001b010, - 0x134c1bb0, 0x8304200c, 0x17b02510, 0x2f17b0d0, 0x21055549, 0x641817b0, 0x08230c56, 0x4111b0d0, 0x1b2f0c46, 0xd01cb010, 0x302f1cb0, 0x33110131, - 0x82152315, 0x14112103, 0x0d6b6518, 0x35234408, 0xad011133, 0xd8d8bfbf, 0x2b2a3f31, 0xe8fe4d53, 0xb2b2d2d2, 0xf9fe4105, 0xfeaaa5b4, 0x0a373ef3, - 0x350117bc, 0xa5aa1601, 0xff0701b4, 0x001200ff, 0x07420500, 0x00260236, 0x01000025, 0x01440007, 0x49360123, 0x04200787, 0x0426ca82, 0xb0593e1f, - 0x8749dc0c, 0x222d8f05, 0x89c20175, 0x08f6432d, 0x2d8c0d20, 0x5b883720, 0xc3009d22, 0x0f205b92, 0x2c202d8c, 0xa42c2d88, 0x3701c500, 0xb0000900, - 0x16b02f04, 0x0220238c, 0x6a222388, 0x5182ee00, 0x75491620, 0x26ad8805, 0x1bb0dc12, 0x883130d0, 0x889420dd, 0x01a2262f, 0x006a0158, 0x2353840c, - 0x15b0dc10, 0xb120258b, 0x00272585, 0x01df0107, 0x821c015e, 0xfe66263d, 0x05eb043c, 0x2a1782c4, 0x00000027, 0x01790007, 0x82fbffc9, 0x00942617, - 0x074c0400, 0x2017823d, 0x05334129, 0x01e80023, 0x0733413d, 0x1b2f0628, 0x3e1f06b1, 0x0541b059, 0x222d8f07, 0x92870175, 0x860e202d, 0x202d85e1, - 0x225b883e, 0x9288009d, 0x8c10202d, 0x8809202d, 0x006a222d, 0x412d82b3, 0x8988060f, 0xb0dc1323, 0x21e9841c, 0xaf82c8ff, 0xb984a020, 0xb9852d20, - 0x8997ff21, 0x8202205d, 0x830220b9, 0x860520b9, 0x00a3245d, 0x8a7d0200, 0x0075222d, 0x202d8935, 0x202d8203, 0x202d8303, 0x212d8506, 0x2d82cbff, - 0x83077a21, 0x225b85b9, 0x9237ff9d, 0x8608205b, 0x82bf202d, 0x0785212d, 0x2d85b983, 0x62ff6a22, 0x8988b989, 0xb0dc0b23, 0x27b98414, 0x00009400, - 0x2c071705, 0x3220e982, 0xa422b984, 0x1d42ee00, 0x2f052305, 0x538515b0, 0xff660027, 0x071e05ec, 0x20238236, 0x22238433, 0x423a0144, 0xbe51096f, - 0x96202008, 0x0175222d, 0x202d89d9, 0x20dd820d, 0x20dd830d, 0x202d8c21, 0x225b8837, 0x92da009d, 0x8c23205b, 0x85ad832d, 0x00a42289, 0x20ad82dc, - 0x05a74213, 0x22205b88, 0x02202d8c, 0x6a225b88, 0xd5420501, 0x23b78809, 0x2fb0dc26, 0x24050b41, 0x04ecff7d, 0x20e784bd, 0x20e78639, 0x4d8b8911, - 0x12200813, 0x2d8f5d86, 0xb0017522, 0x09202d82, 0x2f228b82, 0x238c13b0, 0x5185dd83, 0xb1009d22, 0x67415192, 0x83518507, 0x202d85af, 0x21dd826a, - 0x75420036, 0x237f8806, 0x21b0dc18, 0x0724af85, 0xd6040000, 0x3d20af84, 0x7522af84, 0x5d898701, 0x20088a52, 0x2a8b860b, 0x03ecff5a, 0x020006fb, - 0x84450026, 0x0044242d, 0x430000ad, 0x1729075d, 0x17b11b2f, 0xb0593e1b, 0x222d962b, 0x824c0175, 0x23dd822d, 0x2cb02f17, 0x0120238c, 0x06235186, - 0x914d9d00, 0x8b2e204f, 0xf605212b, 0xa4222b88, 0x7b90014f, 0x2b8c2d20, 0x2b88cc20, 0x00786a22, 0x88070541, 0xdc3123a7, 0x05413ab0, 0x20d78505, - 0x24d7885e, 0x00e200a2, 0x232f9034, 0x37b0dc2f, 0x7c202f8b, 0x00312f85, 0x00df0107, 0xffe7ffe8, 0xfe4f00ff, 0x04f5033c, 0x2017824e, 0x26e98247, - 0x01790007, 0x82fbff3d, 0xff532617, 0x060b04ec, 0x20178200, 0x06374149, 0x3741a120, 0x2f082909, 0x1b08b11b, 0x1fb0593e, 0x2d8fbb86, 0x40017522, - 0x22053741, 0x43b02f08, 0x23850721, 0x51860120, 0x9d000623, 0x08374141, 0xc3424f88, 0x212b8407, 0x2b88cc05, 0x416c6a21, 0x2b88080b, 0xb0dc2523, - 0x21db842e, 0xa182b4ff, 0xf9058c22, 0x8c202d82, 0x06240982, 0xf9834400, 0x20076541, 0x20a98202, 0x44a98302, 0x8f240785, 0x69020000, 0x75212b8a, - 0x202b8821, 0x202b8203, 0x442b8303, 0xb7200783, 0x66222b82, 0x5786fa05, 0x9d000725, 0x88ff23ff, 0x4459882d, 0xab200783, 0x71222d82, 0x2d88c505, - 0x4eff6a22, 0xc7422d82, 0x442d8806, 0x79260983, 0xf8030000, 0x2f82f605, 0xb5845220, 0x0155a42a, 0xb0000900, 0x1cb02f03, 0x26065541, 0x04ecff4f, - 0x8200063d, 0x41532021, 0xb6200683, 0x5a098341, 0x2d9708de, 0x55017522, 0xf1462d82, 0x8c1d2005, 0x86012051, 0x00062351, 0x8341569d, 0x414f8808, - 0x7d8407d3, 0x7d839f84, 0xa4000623, 0x239f8458, 0x26b02f04, 0x05214d8b, 0x229f88cc, 0x8281006a, 0x0b3f4771, 0x593e1b32, 0xb0dc22b0, 0x3130d02b, - 0x7700ffff, 0xf703ecff, 0x5920cf84, 0xaf20cf86, 0x0724cf89, 0x07b11b2f, 0x69442f83, 0x222d8f07, 0x854e0175, 0x440620cf, 0x23850969, 0x5183cf83, - 0x4f20cf82, 0x4f88cf88, 0x84076744, 0x85ad842b, 0x7a6a212b, 0x88085342, 0x0965442b, 0x4bfe0c24, 0xab84d603, 0xab845d20, 0x16017522, 0x01227d85, - 0xa187b02f, 0x51842384, 0x06232383, 0x88426a00, 0x820f2051, 0x830f20cd, 0xdc1723cd, 0x174820b0, 0xea06210a, 0x24083d48, 0x01be0070, 0x181b493a, - 0xecff5a26, 0xb405fb03, 0x23080d44, 0x00044870, 0x20058744, 0x0cbd482a, 0x4f881c20, 0xf600a022, 0x48120f49, 0x4f850709, 0x2f44e620, 0x00a02208, - 0x12074580, 0x5b832d20, 0x00020033, 0x0552fe12, 0x00b00542, 0x00190016, 0x1a19b274, 0x06c35c1b, 0x934d1620, 0x82162006, 0x561620de, 0x2d7b07a3, - 0x8201200c, 0x4e012019, 0x0c200784, 0x0c240c82, 0xb2593e11, 0x0a428a18, 0xb010012b, 0x11b0d011, 0x1417b22f, 0x21558316, 0x23512f17, 0x19b2230a, - 0x14821416, 0x01313038, 0x06062301, 0x32331415, 0x23061737, 0x34352622, 0x03210337, 0x04820121, 0x1b033508, 0x573e2702, 0x2e2c474a, 0x5f5c4915, - 0xfd739574, 0xf9fe76cc, 0x01622602, 0xb005d3a6, 0x5e3850fa, 0x8e174431, 0x8d5b6e2c, 0xfe490162, 0xfcb005ad, 0x005c026f, 0x5a30d382, 0xfb0352fe, - 0x2d004e04, 0xa6003800, 0x3a3917b2, 0x10227d84, 0xd3862fb0, 0x24086445, 0xb0584500, 0x20b98229, 0x0f8a5d29, 0x1983b020, 0x19821e20, 0xe0841e20, - 0x00b0d026, 0x1702b22f, 0x84059d5d, 0x0bb02606, 0x1017b02f, 0x0abe65b2, 0x0f0b1222, 0x40306682, 0x1c120c09, 0x3c122c12, 0xb05d0412, 0x24b21029, - 0x2309784f, 0x2eb21004, 0x23093052, 0x32b2100b, 0x30240d88, 0x27262531, 0x1b224b19, 0x310e2241, 0x37363203, 0x06222335, 0x02161415, 0x740d0bff, - 0x4b19a3a8, 0x2a201031, 0x3e093841, 0x207f4876, 0x5d888783, 0x79451907, 0xb9ad89ba, 0x53655447, 0x589b5940, 0x18feadbf, 0x41115792, 0x8c330846, - 0x3b460801, 0x46565ecc, 0x00ffff53, 0x04ecff66, 0x4a4b07eb, 0x012c05c3, 0x01750007, 0x004b01c0, 0x0cb00009, 0x2609e745, 0x03ecff4f, 0x460006f5, - 0x23840551, 0x00002928, 0xb0000900, 0x2f462f0f, 0x20478508, 0x2247884c, 0x82c1009d, 0x48132047, 0x5b4905d1, 0x20518510, 0x23518601, 0x2a9d0006, - 0x4308e543, 0xb5440867, 0x20598507, 0x24598829, 0x01a701a1, 0x07654354, 0xc1445988, 0xf503230a, 0xab88de05, 0x1001a122, 0x8786a982, 0x25205b88, - 0x82095949, 0x22b589fd, 0x88d8009e, 0x07b946fd, 0x9e21ab8f, 0x49fb8741, 0x942607fb, 0xd2040000, 0x73823e07, 0x0000282a, 0x9e000701, 0x3d016700, - 0xb0247582, 0x1ab02f01, 0x27095945, 0x02065b05, 0x48002600, 0x012d2383, 0x040104a2, 0x000600fc, 0x302f1eb0, 0x07334c31, 0x4bf10621, 0x702408a9, - 0x41018300, 0x4718334c, 0xb420054d, 0x22084d47, 0x83043c70, 0x2f08236f, 0xf94b1eb0, 0x8823200c, 0x00a0224f, 0x096d4bbb, 0x4d08f94b, 0x4f85075b, - 0x4f88e620, 0x4774a021, 0xed8b11c9, 0x1b074c22, 0xa1245988, 0x46016e01, 0x1420a990, 0x210b4748, 0x7548de05, 0x01a12208, 0x098f4127, 0x2008f947, - 0x312d8326, 0x94000100, 0x4c0452fe, 0x1b00b005, 0x11b28000, 0x15531d1c, 0x0c9d4408, 0x1b2f0f24, 0xc9430fb1, 0x07b74414, 0x441ab221, 0x1a210589, - 0x0a7e712f, 0x5314b021, 0xb0260b37, 0x0fb0d003, 0x9018b210, 0xb02109d4, 0x0dbe5516, 0x11210124, 0x8f431521, 0x1837200e, 0x25070564, 0x02aafde7, - 0x7a436fbb, 0xfd872d09, 0xfdb10393, 0x0256024c, 0xca40fe8a, 0x3b086943, 0xb0055f86, 0x006efecc, 0x53000200, 0x0b046dfe, 0x23004e04, 0xa5002b00, - 0x2d2c11b2, 0x7005db5a, 0x19200833, 0x1920d482, 0x0c895018, 0x2250e187, 0x02b22307, 0x34831911, 0x45100c21, 0xb2230a7c, 0x83111928, 0x2f283814, - 0x2f281fb4, 0xb4710228, 0x28cf28bf, 0x8fb25d02, 0xb45d0128, 0x836f285f, 0x28ef2212, 0x210682ff, 0x38531db2, 0x1810200a, 0x210aa1d4, 0x438523b2, - 0x5a691920, 0x3130240b, 0x45070625, 0x26220eb0, 0x10562700, 0x6aab1805, 0x22012b08, 0x35210706, 0xfa032626, 0x0d417149, 0xcf502409, 0x6006fbfe, - 0x3d3105f7, 0xa7779d0b, 0x64c5fe69, 0xcf01117b, 0x6ab87208, 0x081c4133, 0x0d526638, 0x3ad71301, 0xfe8effa2, 0x62fefee6, 0x02879c86, 0x127d8c56, - 0x414f7d7a, 0x09e54e08, 0x9f009e22, 0x2012bd42, 0x0cab4a11, 0x2909874a, 0x0000589e, 0x08b00009, 0xc343b02f, 0xff6a3207, 0x07f004ec, 0x0026024c, - 0x0100002b, 0x009d0007, 0x099d44be, 0x1b2f0b24, 0xcb4d0bb1, 0xfe52250b, 0x060c0456, 0x4b204f83, 0x06232d82, 0x43409d00, 0x514a080d, 0x86272008, - 0x2059857b, 0x22598831, 0x92f100a0, 0x84878759, 0xe6052159, 0x59852d82, 0x9173a021, 0x8c282059, 0x88292059, 0x01a12259, 0x09f744a4, 0x8787b388, - 0xde205985, 0x07245986, 0x2601a100, 0x88096743, 0x872d20b5, 0xf9fd255b, 0xc405f004, 0x002a5b85, 0x01a20107, 0xff92febb, 0x458400ff, 0x87a90621, - 0xb9012545, 0x7e002701, 0x2006c34a, 0x09594429, 0x07180523, 0x2123823e, 0x4b41002c, 0x41e22005, 0x0720099b, 0x079c5018, 0x26078150, 0x03000079, - 0x825e07f8, 0x864c202d, 0x0117222d, 0x2051835d, 0x08f34910, 0x00b3ff27, 0x07900200, 0x4f238233, 0xa42405eb, 0x3e0139ff, 0x50075144, 0x07200847, - 0xff217f85, 0x222d829f, 0x4bef057c, 0xa4240895, 0xfaff25ff, 0x02225183, 0xcf44b02f, 0xb9ff2106, 0x90222382, 0x5188f106, 0x32ff7022, 0x50094d45, - 0xff210fc7, 0x205184a5, 0x245188ad, 0xff1eff70, 0x176f4cfd, 0x82dfff21, 0x0765222d, 0x225b8823, 0x896affa0, 0x875b88ff, 0x82cb20ad, 0x0551222d, - 0x225b88df, 0x4c56ffa0, 0x2d861271, 0xfe170027, 0x059f0158, 0x2f5b85b0, 0xa3000600, 0xffff06ee, 0x52fe0000, 0xd5059001, 0x4d281582, 0x06000000, - 0x00d7a300, 0x9d261582, 0xa3010000, 0x87881b07, 0x1c00a122, 0x88098745, 0x07995387, 0xecffa32a, 0xb0052606, 0x2d002600, 0x07254382, 0x42022e00, - 0x23458300, 0x034bfe7d, 0x17825b82, 0x07245b83, 0x0b024e00, 0x2d2a1784, 0xab04ecff, 0x26023707, 0xb7412e00, 0x68012105, 0x5d098b4a, 0x9341090b, - 0xfeb52406, 0x846b024b, 0x859b20e5, 0x28ff232d, 0xa347deff, 0x3e1b230c, 0xaf43b059, 0xfd942407, 0x841805f9, 0x832f20e5, 0xa2012f8b, 0x92fe9d01, - 0x7d00ffff, 0x3604f9fd, 0x73820006, 0x17864f20, 0x17842d20, 0x00009426, 0x36072604, 0x30201782, 0x75225d84, 0x8b892900, 0x4d085554, 0x002706b5, - 0x0200008a, 0x82910762, 0x8650202d, 0x011a222d, 0x0c4d4291, 0x8b822120, 0x2006114e, 0x218b8200, 0x8b842604, 0x00215b82, 0x208b8207, 0x2473846d, - 0x01f9fd55, 0x828b847f, 0x21178345, 0x8b891000, 0x82b10521, 0x268b845d, 0x0a02a201, 0x5e00ab04, 0x65560647, 0x31302107, 0x8c20cd82, 0xe7258782, - 0x26000206, 0x82878400, 0x048d2259, 0x242987fc, 0xb11b2f08, 0x47878208, 0x838a08fb, 0x01a10025, 0x86d4fdca, 0x06eb2241, 0x21418500, 0x17820700, - 0xaffd6422, 0x23051d45, 0x36071705, 0x2208eb52, 0x41eb0175, 0x2d5e090f, 0x07f94108, 0x00007926, 0x0006f803, 0x2406954e, 0x01750007, 0x05f74c52, - 0x81430320, 0x94002708, 0x1705f9fd, 0x5185b005, 0x0121ed83, 0x26ed84dc, 0x03f9fd79, 0x854e04f8, 0x2017843b, 0x53178441, 0x3720056d, 0x9e228188, - 0x81890301, 0x85105d48, 0x4f012081, 0x9e220817, 0x5344006a, 0x06c94d06, 0x00a5ff22, 0x0320a383, 0x07262186, 0x60ffa201, 0x2b41fd04, 0x2f152407, - 0x4115b11b, 0x6626072b, 0x1e05ecff, 0x0b53ea06, 0x00702208, 0x09734dd5, 0x2313674a, 0xb4053d04, 0x22081d4f, 0x56045170, 0x1b200631, 0x200c5b53, - 0x224f881c, 0x890d01a0, 0x454f88c9, 0x414f07bf, 0x4fe62005, 0xa022081f, 0x734d8900, 0x086f4f09, 0x84078349, 0x350721ab, 0xa5225b88, 0xb7536301, - 0x08e55309, 0xb0dc2123, 0x054f4e25, 0xff205d85, 0xa5225d88, 0x7d4fdf00, 0x531d2012, 0x94260837, 0xde040000, 0x2f823607, 0xe9423620, 0x71012105, - 0x1f505f82, 0x07774a05, 0x00007c23, 0x05bb4b02, 0x23855620, 0x82ad0021, 0x22238253, 0x56b02f0b, 0xfd250825, 0x05de04f9, 0x314785b0, 0xa2010700, - 0x92fe6e01, 0x4f00ffff, 0xb402f9fd, 0x17824e04, 0x17833b82, 0x430a0021, 0xde220803, 0x77883707, 0x89009e22, 0x1c207788, 0x20065741, 0x22778238, - 0x850106fa, 0x0601263b, 0x00c69e00, 0x20758500, 0x24218612, 0x04ecff4a, 0x20bd848a, 0x21998537, 0x45858e01, 0xb02f0923, 0x2623862a, 0x03ecff4b, - 0x820006ca, 0x86572045, 0x853a2023, 0x462382bd, 0x4785078f, 0x47858d83, 0x8f009d22, 0x8d129b54, 0x83978351, 0x00062351, 0x81473b9d, 0x0c5a1808, - 0x25598808, 0x8a0441fe, 0x7d82c405, 0x00315982, 0x01790007, 0xff00009d, 0xfe4b00ff, 0x04ca0338, 0x8495854e, 0xff442217, 0x221782f7, 0x8bf9fd4a, - 0xa201252f, 0x92fe8901, 0x4b221782, 0x2f8bf9fd, 0x30201782, 0xb98f1784, 0xa6009e22, 0x54080141, 0x0141079b, 0x26af8905, 0x0000529e, 0x82b00009, - 0x07e154ff, 0x75822d20, 0xb005b022, 0x38248d82, 0x07000000, 0x77205d82, 0x08265d84, 0x7202f9fd, 0x17824105, 0x17855820, 0x84c80021, 0xfe2d2317, - 0x2f8a0444, 0x8b22d582, 0xa5820300, 0x41fe0824, 0x2f89a502, 0x00790023, 0x26ed84dc, 0x0400002d, 0x853707b0, 0x0701255f, 0x98009e00, 0x2012eb43, - 0x06b1410d, 0xecff0829, 0x83062703, 0x86002600, 0xcd012675, 0xffff7d05, 0x05135600, 0x26022c2c, 0x00003900, 0xa4000701, 0xf156b300, 0x08206709, - 0x5107354c, 0xf62005d9, 0x59202d82, 0x06232d82, 0x5551a400, 0x0d200865, 0x87076c6d, 0x2159842b, 0x5988ea06, 0xac007025, 0x56003a01, 0x714605bf, - 0x204f8507, 0x224f88b4, 0x4c044a70, 0xa5520cb1, 0x214f840b, 0x4f881c07, 0xe400a022, 0x8d124f42, 0x86e620a9, 0x00072459, 0x538200a0, 0xab8c1201, - 0x88940721, 0x01a2225b, 0x056f5a46, 0xb02f0023, 0x08955a16, 0x0621ad84, 0x2953885e, 0x00e400a2, 0x000c0034, 0x258b06b0, 0x3520a785, 0xa5224b88, - 0x5d443a01, 0x08514109, 0xb0dc1323, 0x08ab5317, 0x052e0423, 0x225588ff, 0x82d800a5, 0x825585a9, 0x82152025, 0x01003025, 0x89fe7d00, 0xb005bd04, - 0x57001f00, 0x18201cb2, 0x24098958, 0xb11b2f18, 0x071f5218, 0x08329b18, 0x087c9818, 0x593e172b, 0x181304b2, 0xb2391211, 0x090a5109, 0x38791320, - 0x18b0210b, 0x2205e964, 0x4c141101, 0x20311059, 0x33113500, 0x33161411, 0x04111120, 0x3d7e85bd, 0x070d524f, 0x00ff3633, 0x94fcdbfe, 0x05240190, - 0x9832fcb0, 0x59293de4, 0x050d5237, 0x0145552e, 0xcd03eb0c, 0x9a9232fc, 0xc6033401, 0x7726bb82, 0xf70352fe, 0xbb823a04, 0x1ab26622, 0x0752bb8a, - 0x8212200c, 0x181220c8, 0x8310a390, 0x820a20c8, 0x110a2119, 0x0520c882, 0x1f29c189, 0xd00fb010, 0xb02f0fb0, 0x0b097112, 0x6017b021, 0x21200559, - 0x510e204d, 0xc98305db, 0x37323322, 0x03210682, 0x09144de2, 0x6b05922a, 0xf3b5b0c5, 0xf33eb1ab, 0x0808024d, 0x62618c25, 0x02c3ce7e, 0xce46fdbd, - 0xfb09037f, 0x00ffffc6, 0x06000030, 0x023707e5, 0x003b0026, 0x00070100, 0x46a8019d, 0xe74a128f, 0x21002706, 0xcc050000, 0x2d820106, 0x2d865b20, - 0x7d420a20, 0x820b2009, 0x490b20cf, 0x67590b77, 0x595b8305, 0x9d220567, 0x67598800, 0xfe0c241a, 0x84d6034b, 0x050b555b, 0x51179d21, 0xd74211a3, - 0x20598507, 0x85878202, 0x006a2259, 0x098b42b3, 0x23089148, 0x19b0dc10, 0x26058b42, 0x04000050, 0x8236078c, 0x843e202f, 0x017522b7, 0x4c898983, - 0xc1480843, 0x00522607, 0x06c00300, 0x202d8200, 0x202d865e, 0x1263431b, 0x5b852d87, 0x5b881420, 0x6a01a124, 0xed433f01, 0x465b8807, 0x5b840785, - 0x88de0521, 0x01a1225b, 0x09374d02, 0x87084556, 0x205b852d, 0x225b8837, 0x459b009e, 0x072305b1, 0x450eb02f, 0x51840601, 0x86010621, 0x00062451, - 0x8200339e, 0x89b02051, 0xf6ff2721, 0x57070000, 0x21824207, 0xcf858120, 0x01bb0223, 0x0c8f4442, 0x593e1f22, 0x2408b55c, 0x06ecff48, 0x204f8484, - 0x222d8686, 0x56010071, 0x3f200639, 0x692a7386, 0x2205a1ff, 0x26028007, 0x23858300, 0x01e00123, 0x44518780, 0x5346080b, 0xff4f2607, 0x053d0477, - 0x202d82fe, 0x222d8689, 0x56feff30, 0x1b200cb7, 0x874e7f82, 0xa6ff2b06, 0x2a040000, 0x26028d04, 0x2d83bd01, 0xffde012f, 0x006eff16, 0x1fb20046, - 0xb2710117, 0x1804836f, 0x29086677, 0xbf17afb6, 0x0317cf17, 0x1282b272, 0x5fb27226, 0xb6720117, 0xdf251083, 0xb2710317, 0x2a2a823f, 0xef17dfb4, - 0xb45d0217, 0x822f171f, 0x31302306, 0x5fdfffff, 0x82240021, 0x841620bf, 0x82cd20bf, 0x01062cbf, 0x00be32de, 0x00b20008, 0x835d010b, 0x0900217f, - 0x94221f82, 0xdf821e06, 0x1f82ba20, 0x44000726, 0x1e00c700, 0x200c0d41, 0x0ae1601d, 0x75222d8f, 0x2d896601, 0x4708356d, 0x2d85070d, 0x5b861f20, - 0x9d000623, 0x43599167, 0x2b8507cb, 0x2b881420, 0x1f69a422, 0x840edd60, 0xea052121, 0x6a22a988, 0x7b829200, 0x830b9d59, 0x09dd60a9, 0x06212f84, - 0x252f887c, 0x00fc00a2, 0x2f8f0052, 0xb0dc1023, 0x05954318, 0x99202f85, 0x00312f85, 0x01df0107, 0xff040002, 0xfe4f00ff, 0x04430441, 0x3417829d, - 0x000000bc, 0x01790007, 0xff00006b, 0x007600ff, 0x06b50300, 0x2017821e, 0x063941be, 0x0b419620, 0x08386d09, 0x8f070b41, 0x0175222d, 0x182d8935, - 0x4308fe43, 0x2d850745, 0x5b861f20, 0x9d000623, 0x08394136, 0xbf4a5988, 0x212b8407, 0x2b88ea05, 0x1e616a22, 0x2b88e587, 0x2009e360, 0x20ab82a6, - 0x20b5847e, 0x21b585c2, 0x878975ff, 0x936d0220, 0x05b02106, 0x24065943, 0x02000083, 0x232d885b, 0x13750006, 0x03208788, 0x03212b82, 0x094b4e1d, - 0x82a9ff21, 0x0658212b, 0x5985b383, 0x15ff9d22, 0xa74e5992, 0x9dff2106, 0x63202d82, 0x2d85b584, 0x40ff6a22, 0x8809cd41, 0x095d5c87, 0x00007626, - 0x14066704, 0xc720e582, 0xa428b784, 0x1f008800, 0xb0000900, 0x240ae160, 0x04f0ff4f, 0x20ad846f, 0x222384c8, 0x89d50044, 0x08016b81, 0x8f079f4c, - 0x0175222d, 0x4b2d8274, 0x335c05a5, 0x83518309, 0x235183d3, 0x759d0006, 0x4f88ff88, 0xe3562120, 0x832b8308, 0x212b85a1, 0x9f8477a4, 0xb02f0b22, - 0x20064b44, 0x84718400, 0x229f85f3, 0x89a0006a, 0x234f88f3, 0x2db0dc24, 0x20059142, 0x20cf8267, 0x20cf841e, 0x20cf86ce, 0x25cf89b5, 0xb11b2f08, - 0x57501d08, 0x222d8f0a, 0x89540175, 0x5644182d, 0x07cb4508, 0xd9832d85, 0x5b82ce20, 0x5520d982, 0x5988d988, 0x8407df46, 0x85b7842b, 0x006a2287, - 0x88b78980, 0x09195c2d, 0x00000524, 0xb7843604, 0x754dd220, 0x2d012105, 0x43188989, 0xd160081a, 0x82092007, 0x0594222d, 0x08f943d2, 0x22627022, - 0x201e7f44, 0x08d34304, 0x9a00a022, 0x04275989, 0x04b11b2f, 0x46593e1d, 0x002f058b, 0xfe090002, 0x04940452, 0x0016008d, 0x5b710019, 0x771812f5, - 0x3d570c65, 0x00b02407, 0x5bb05845, 0xb22325f5, 0x5b001417, 0x002012f2, 0x2c17f25b, 0x23072127, 0x03210301, 0xd501bf02, 0x091b4936, 0xfe599d2f, - 0x01f55f1e, 0x54013cd7, 0xfb8d04aa, 0x08204973, 0xeb619234, 0xfd8d04f9, 0x00ba0125, 0x4f00ffff, 0x4304f0ff, 0x87441e06, 0x07012505, 0x63017500, - 0x4208af42, 0x43220bd3, 0x23861f06, 0x9d000623, 0x11af4264, 0xaf422020, 0x0543220a, 0x244f88fc, 0x004a01a1, 0x07794127, 0x660a8d42, 0x7d8505db, - 0x9e225989, 0xd14e1e7b, 0x244f8706, 0x0400006a, 0x277b842a, 0x010000bd, 0xf89e0006, 0x01232184, 0x8618b02f, 0x05a94471, 0xa944d220, 0x31702108, - 0x4508e941, 0x0420162f, 0xa0212b88, 0x88c98869, 0x073b462b, 0xc9835785, 0x22058945, 0x891c01a1, 0x202d88c9, 0x06655914, 0x52fe7626, 0x8d04b503, - 0x18156559, 0x590c164b, 0x1b221d65, 0x51790416, 0x0ac17205, 0x254b6559, 0x020afe5f, 0x26425e4c, 0xfd872309, 0x7d1803fb, 0x24420977, 0x5f862608, - 0xfec48d04, 0x099146f2, 0x21093546, 0x33414d9e, 0x07134e11, 0xf0ff5425, 0x83064804, 0x00c0272b, 0x00060100, 0x2b88689d, 0x1b2f0a28, 0x3e1d0ab1, - 0xd944b059, 0x232b8507, 0x01260204, 0x07242b83, 0x9b00a000, 0x88097543, 0x0707422d, 0x05212d84, 0x222d88fc, 0x414e01a1, 0x2d88098d, 0x2607835c, - 0x04f9fd54, 0x859d0448, 0x0700272d, 0x6a01a201, 0x5d4792fe, 0x68042105, 0xc1209f84, 0x7b209f85, 0x2d479f88, 0x42102008, 0xff270557, 0x02000091, - 0x8214066e, 0x054b4643, 0x17ffa422, 0x57051b46, 0x97200a13, 0x05212383, 0x232388d2, 0x0010ff70, 0x46087d42, 0xff210ff7, 0x212d82bd, 0xf1830643, - 0xa0225185, 0xf18948ff, 0xb7562d88, 0xfe152607, 0x048d0152, 0x255b858d, 0xa3000600, 0xc18200ec, 0xb7827c20, 0xfc058222, 0x01241585, 0xfba10006, - 0x88085d43, 0x07b54b41, 0xf0ff2424, 0xed843704, 0x3582c320, 0x9d000724, 0x6f89f400, 0x2008a644, 0x25ef8513, 0xf9fd7600, 0x6f846804, 0x0000c428, - 0xa2010700, 0x33411201, 0x49032007, 0xc52005cb, 0x06234582, 0x410a7500, 0x9b490833, 0x067f4708, 0x03214383, 0x82438494, 0x5543842b, 0x762605e1, - 0x94030000, 0xb5829004, 0x01201782, 0x95225b83, 0xe1558a03, 0x3e1d240c, 0x41313059, 0x418b05a1, 0x01a10025, 0x8546fd72, 0x67042317, 0xa9471e06, - 0x01752208, 0x12b54685, 0x7620f987, 0x6720cb82, 0xc7208784, 0x7820cb86, 0x2208ff41, 0x881f0667, 0x009e2245, 0x4445899d, 0x59471001, 0x82d22005, - 0x84c8202d, 0x707022f9, 0x069d4422, 0x9d471d20, 0x8604200c, 0x00072421, 0x48a800a0, 0x1b45121b, 0x066f220b, 0x222d881d, 0x82fe00a5, 0x000c262d, - 0xb02f0bb0, 0x0881541f, 0x00007624, 0xe9843904, 0x7582cb20, 0x75000724, 0x91451701, 0x2f042305, 0xab4119b0, 0x8439200a, 0x252382df, 0xa2010700, - 0xdf881801, 0xdf843920, 0x01251782, 0x2f9e0006, 0x0e9b551e, 0xf0ff3e24, 0x5d84ef03, 0x5d86cc20, 0x5d854120, 0x51480920, 0x20238509, 0x83a7821f, - 0x00062323, 0xf141429d, 0x08b97608, 0x2607fb53, 0x0341fe3e, 0x859d04ef, 0x07002a2b, 0x4f017900, 0xffff0000, 0x21438f00, 0x8984599e, 0x230a8754, - 0x04f9fd24, 0x8408434c, 0x842520c3, 0x822420c3, 0x841620ff, 0x82cd20c3, 0x20c382a1, 0x116f4447, 0x07410d20, 0xfe242206, 0x82438b47, 0x0039227d, - 0x267d8206, 0x04f0ff67, 0x8214061e, 0x84ce2095, 0x57a42243, 0x0783461f, 0x4208b348, 0x2b8407f7, 0x88d20521, 0x5070232b, 0xe9520022, 0x06094405, - 0x21840020, 0x86040621, 0x00072421, 0x418800a0, 0xa94809e5, 0x214f8c08, 0x2d887c06, 0xea00a22f, 0x0c005200, 0x2f00b000, 0xb0dc15b0, 0x0985491a, - 0x1d063422, 0xa5222588, 0x0b42de00, 0x20258205, 0x05816b12, 0x00010029, 0x0482fe67, 0x828d041e, 0xb2612419, 0x5f201f1b, 0x172408bb, 0x17b11b2f, - 0x48075546, 0x0d200c70, 0x0d281982, 0xb0593e17, 0xb0584500, 0x23079751, 0x001204b2, 0xb0223b82, 0xcd72100d, 0x7112200b, 0x30260bd8, 0x06110131, - 0x4d640706, 0x2626220d, 0x05425227, 0x11373228, 0x7d011e04, 0x42527f77, 0xcd403107, 0x7ef102f2, 0x0404e56c, 0x81fcfc8d, 0x5a5632bd, 0x37054052, - 0xd606495d, 0xfd0503bb, 0xd4687300, 0xffff0703, 0x00002800, 0x1f06e505, 0xd021e782, 0x057b5100, 0xb5491920, 0x07734712, 0x8305e349, 0x82d2202d, - 0x0006232d, 0xfb412e9d, 0x08674108, 0x8407fb41, 0xea05212b, 0x2b855982, 0x4c596a21, 0x2b8808a1, 0x26091d51, 0x03000041, 0x821e06f3, 0x84d3202d, - 0x01752287, 0x12c34130, 0x84073f44, 0xfc05212d, 0xa1222d88, 0x6d461701, 0x08294609, 0x8407f54a, 0x83e3842d, 0x0006235b, 0x5546489e, 0x0c716f11, - 0x66410621, 0x003c058f, 0xbfad0006, 0xffffff00, 0x0400004a, 0x004106b0, 0x64290026, 0x00070000, 0x0084fead, 0x53241783, 0x7c050000, 0x2c201784, - 0x8d201786, 0x562a1784, 0x03020000, 0x26004306, 0x17862d00, 0x0200902a, 0xa7ffffff, 0x3205ecff, 0x33212f84, 0x20478514, 0x202f83e1, 0x210582fe, - 0x17843a05, 0x2f863d20, 0x17831b20, 0x82b2ff21, 0x84f12077, 0x86b92017, 0x84ec202f, 0xff873617, 0x06da02f4, 0x0026029a, 0x010000c2, 0xffae0007, - 0x00ebff20, 0x0a79641c, 0x593e1b2c, 0xb0dc18b0, 0x18b0d010, 0x736cb010, 0x00122a06, 0x05420500, 0x000602b0, 0x25458325, 0x00009400, 0x0f84a304, - 0x0f882620, 0x0f844c20, 0x0f842920, 0x1f825020, 0x0f848c20, 0x0f843e20, 0x05212f82, 0x200f8418, 0x200f842c, 0x207b82a3, 0x200f849f, 0x201f8e2d, - 0x210f872f, 0x1f846a06, 0x1f883120, 0x0f841720, 0x0f843220, 0xecff6626, 0xc4051e05, 0x33208f82, 0xd4207f88, 0x34201f84, 0x84098557, 0x8438200f, - 0x8207200f, 0x84d6208f, 0x843d200f, 0x21a5820f, 0x0f84e904, 0x0f833c20, 0x3f6fff20, 0x2fc1532f, 0xebff5629, 0x41067904, 0x51002602, 0xad2c0535, - 0x00005001, 0xb0000900, 0x24b02f13, 0x2406f144, 0x04ecff60, 0x4a23840c, 0xad220595, 0xbd591901, 0x07934508, 0x61fe7e24, 0x23840604, 0x22055949, - 0x5c2301ad, 0x1420089d, 0xa9264786, 0x6102f4ff, 0xe1412c06, 0x00062406, 0x44eb0fad, 0xa94206f5, 0x82802007, 0x0608228d, 0x282182a2, 0x010000ca, - 0x1dae0006, 0x070142f3, 0x0842af18, 0xb0dc1e29, 0x1eb0d015, 0x4427b010, 0x8e2b05d5, 0x6b040000, 0x06023a04, 0x4c008d00, 0xec24055d, 0x4e043d04, - 0x53200f82, 0x92240f84, 0x1f0460fe, 0x76201f84, 0x16240f84, 0xda030000, 0x5a200f84, 0x1f200f84, 0xe8200f82, 0x5c200f84, 0xff210f83, 0x22a582cc, - 0x42b70592, 0x6a240887, 0xebff6fff, 0x18078750, 0x23085b74, 0x1db0dc14, 0xb3847f85, 0x88bf0521, 0x6c6a22b3, 0x882d87f3, 0xdc1a23b3, 0x1b5c23b0, - 0x4106210a, 0x9d822d82, 0x00070125, 0x412201ad, 0x04220527, 0xe147b02f, 0x21518407, 0x51863406, 0x0d222383, 0x2941f3ff, 0x0a037106, 0x062d0623, - 0x23238232, 0x010000cd, 0x02232382, 0x86f1ff2c, 0x66232023, 0x35720c3b, 0x9b002728, 0x37040000, 0x53823d07, 0x5384b020, 0x82017522, 0x73091161, - 0x08200875, 0x2c067d4c, 0x04ecff4a, 0x00c4058a, 0xb2630027, 0x5f4e1811, 0x2f09250a, 0x1f09b11b, 0x20060d46, 0x2e0c821d, 0x593e0f1d, 0x091d02b2, - 0xb2391211, 0x821d090e, 0x09b02106, 0x210c0d7f, 0x47181002, 0xb2210aee, 0x24298422, 0xb2101db0, 0x0a706925, 0x26340124, 0x7a192724, 0xff226551, - 0x054400ff, 0x3085430e, 0xecff2d34, 0xb005e403, 0x2e000602, 0xffff0000, 0x00009b00, 0x0f833005, 0x44e30121, 0x18260835, 0x26023607, 0x69412f00, - 0x576e2006, 0x09610937, 0x07154308, 0xebff3926, 0x2307dd04, 0xdd202d82, 0xa0222d84, 0x9741d900, 0x2f0f2709, 0x1f0fb11b, 0xe371593e, 0x1f114508, - 0x04218b82, 0x209b8437, 0x142145b0, 0xab829420, 0x6d840d20, 0x6d85db20, 0x891d0121, 0x0803586d, 0x82071147, 0x100f452d, 0x450b4f45, 0x7d820f0f, - 0x84140521, 0x45b5207d, 0x2f82141f, 0x05eb0427, 0x000602c4, 0x142f4527, 0x270e1f45, 0xecff5a00, 0x4e04fb03, 0x45202f82, 0x53242f84, 0x0b04ecff, - 0x49200f84, 0x862a0f84, 0x12040000, 0x2602d905, 0xcd85ef00, 0xff970023, 0x079749f3, 0x1b20cd84, 0x200ac375, 0x443d824f, 0x7c240b3b, 0x300460fe, - 0x54214d84, 0x203e8200, 0x231f8200, 0x4e04f503, 0x9ded7519, 0x00ffff2d, 0x034bfe0c, 0x023a04d6, 0x445d0006, 0x002013e3, 0x332cc571, 0x00008500, - 0xf3054d03, 0xeb002602, 0x07010000, 0xc2007500, 0x61094341, 0x0820082d, 0x26067544, 0x03ecff4b, 0x824e04ca, 0x8457207b, 0x827d207b, 0x05902233, - 0x200f82d5, 0x200f834d, 0x2e8d71ff, 0xfeb5ff25, 0x8485014b, 0x844e203f, 0x008f264f, 0x05650400, 0x208d82f2, 0x825982f0, 0x4401238d, 0x6753f2ff, - 0x3e1b220c, 0x07416659, 0x21050941, 0x2d82e605, 0x2105fd5a, 0xfd5a4aa0, 0x07454b11, 0x2005b35b, 0x08b35b36, 0x08024422, 0x67099543, 0xd95608a9, - 0x05b35b07, 0xb35b0020, 0x01442208, 0x12b35b6a, 0x5b8f2d87, 0xa7027522, 0x0c255b89, 0x0cb11b2f, 0x8fb58a1f, 0x0275225b, 0x465b8909, 0x1f440883, - 0x205b8507, 0x22b78802, 0x82d3016a, 0x000c295b, 0xb02f01b0, 0x0db0dc16, 0x84057946, 0xcc052153, 0x6a22af88, 0x53823501, 0x3f48258f, 0x5c362005, - 0x44220801, 0xa789e800, 0x2008fd43, 0x06eb410a, 0x240d8b71, 0x77440006, 0x062f6d00, 0x2a07c74c, 0x01fc0352, 0x0300060b, 0x630b0006, 0x21200e03, - 0x0121ef82, 0x29a382d0, 0xffff3130, 0xf4036500, 0x27844002, 0x27820620, 0x44182c20, 0x78180ab3, 0x791807ab, 0x092808c8, 0xd006b010, 0xb02f06b0, - 0x8f2a3d89, 0xc803f2ff, 0x2600b005, 0x3d820500, 0x0500072e, 0x00002502, 0xb1ffffff, 0x73024bfe, 0x240acf66, 0xff3fff9e, 0x0e5360de, 0x0004332a, - 0x00066501, 0x6d010602, 0x2509e149, 0x26023607, 0x5f423100, 0x90022105, 0x20090141, 0x073b7902, 0x01411120, 0x007c2406, 0x82790600, 0x0026223d, - 0x202d8651, 0x08f748a0, 0x2607834f, 0x056dfe12, 0x4bb00542, 0x0730067f, 0x7a01a600, 0xffff0300, 0x71fe5a00, 0x4e04fb03, 0x45201782, 0xa624b584, - 0x0700ad00, 0x2333777a, 0x3d070d05, 0xaf454582, 0x01442205, 0x12af454a, 0x7607a356, 0x44210f0f, 0x1b3d7600, 0x20053d45, 0x083d45f3, 0xc4004422, - 0x87123d45, 0x0044245b, 0x825c0500, 0x000632e7, 0xff0000b8, 0xfe4f00ff, 0x047e0522, 0x0006023a, 0x340f84cc, 0x04000010, 0x02fc06f3, 0x00180126, - 0x00070100, 0x014904ab, 0x072b490e, 0x2008c746, 0x07af7b11, 0x82f1ff21, 0x0518262f, 0x012602d0, 0x232f8519, 0xe2ffe503, 0x11282f87, 0x11b11b2f, - 0xb0593e1b, 0x32091961, 0x084bfe4f, 0x004e0464, 0x00530026, 0x00070000, 0x848e045d, 0xfe662677, 0x055c094b, 0x201782c4, 0x20178533, 0x2dd78205, - 0x4900ffff, 0x7f043afe, 0x2602c305, 0x1783da00, 0x01b00125, 0x82a0ff92, 0xfe4d2617, 0x04c4033b, 0x2017824d, 0x221786ee, 0x82a1ff39, 0xfe662317, - 0x277c043e, 0x222f820a, 0x84a4ffd6, 0x773e20e7, 0x17820ba9, 0x17844a20, 0x220fdb4b, 0x825ffe20, 0x023a2427, 0x4cbc0006, 0x1620146b, 0x9b22b482, - 0x77822307, 0xef84d920, 0x4702a021, 0x0d200a79, 0x0d21ef82, 0x51ef821f, 0x1e26078f, 0x5c060000, 0x2d82d905, 0x2d85ed20, 0x41870121, 0x5d63099b, - 0x482d8708, 0x0f7e0ed1, 0x741c2006, 0x8d7d51a3, 0x29bd7d08, 0xecff5a25, 0x7905fb03, 0x755f265f, 0xb0053105, 0x81000602, 0xffff0000, 0xecff4800, - 0x50048406, 0xd5410f82, 0x00942505, 0x074c0400, 0x34533171, 0x05ebff51, 0x02db061e, 0x00450126, 0x00070100, 0x01c2006a, 0x0ceb4b0f, 0x593e1f23, - 0x09bf7bb0, 0xd7825920, 0x4f04f822, 0x9c209982, 0x0f84a984, 0x02cd0524, 0x0f820026, 0x00060125, 0x8c01696a, 0x8c1b203d, 0x050d423d, 0x0d420920, - 0x026a2208, 0x09397d15, 0x0d420d20, 0xdc1d2307, 0xdf4526b0, 0x050f4205, 0x0f42bf20, 0x016a2308, 0x894cff7f, 0x080f4208, 0x49262f89, 0x7f04edff, - 0xfd421707, 0x22cd8405, 0x874b01a3, 0x08ed468f, 0x2009d77a, 0x22cd824d, 0x43cc05c4, 0xbd830515, 0x53774e20, 0x82252008, 0x8325208d, 0xdc2f23bd, - 0xc77d38b0, 0x060d2209, 0x089544f1, 0xe5007022, 0x4609b96d, 0x39440847, 0x05674407, 0x6744a720, 0x00062406, 0x47f75f70, 0xbb6107d1, 0x4a2b8708, - 0x0920059f, 0x6a215988, 0x0a174101, 0x11205988, 0x8508f552, 0x44bf205b, 0x6a2208c3, 0x17418f00, 0x08014a09, 0x66252f89, 0x1e05ecff, 0x29a57d07, - 0xecff4f25, 0x79053d04, 0x5f20296b, 0x17265f82, 0x0602c405, 0xaf4e1601, 0x1701210d, 0x1f840f84, 0x02060723, 0x271f8326, 0x6a000701, 0x3a011301, - 0x420c7f4e, 0x7f880d65, 0x01243f83, 0x736a0006, 0x49089741, 0x917b089b, 0x6b002108, 0xf126ad82, 0x26021807, 0xc342e600, 0x01e32206, 0x245d874c, - 0xb11b2f13, 0x235d8313, 0x30b0dc27, 0x2405c741, 0x03ecff51, 0x20dd84e8, 0x822f82fe, 0x8859205d, 0x083b415d, 0xb0dc2823, 0x262d8531, 0x04ebff39, - 0x4cf106dd, 0x702408a9, 0x4101a100, 0x260e1148, 0x034bfe0c, 0x49b405d6, 0x70220891, 0x218e0412, 0x07214584, 0x22458809, 0x42d1006a, 0x274609f9, - 0x09a55d08, 0x852ded79, 0x883c205d, 0x01a5225d, 0x235d922f, 0x12b0dc16, 0x5d83d385, 0xff05f622, 0x0724af86, 0xa000a500, 0x8409c948, 0x3e1b238d, - 0x2f89b059, 0x00008e24, 0xbd84ee04, 0x6141e020, 0x0f012105, 0x44185f89, 0x192308bf, 0x8522b0dc, 0x005f265f, 0x05e00300, 0x205f82bf, 0x056141f8, - 0xb5436720, 0x08c96a08, 0x9b322d89, 0x58060000, 0x26000a07, 0x000be500, 0x2d002700, 0x3582b904, 0x6a000726, 0x3e01c201, 0x2310bd43, 0x29b0dc20, - 0x8f266585, 0xc9050000, 0x3782bf05, 0xbd82fd20, 0x8c002724, 0x37864704, 0x0d437420, 0x08696609, 0xb0dc1f23, 0x2a378528, 0x054bfe29, 0x02b00551, - 0x823c0026, 0x01073037, 0x00c303af, 0x00ffff00, 0x044bfe1f, 0x823a0456, 0x855c2017, 0xc8022117, 0x2608cd42, 0x02000603, 0x84480006, 0x822d200f, - 0x84fd203f, 0x85dc203f, 0x6f042127, 0x21201784, 0x07201782, 0xf1203f84, 0x03211785, 0x22178479, 0x4997fe12, 0xac220c2b, 0x2b490d05, 0x499b2006, - 0xac230c2b, 0x18004004, 0x2009d744, 0x08c746bb, 0x0505aa24, 0x7f583c01, 0x07314406, 0xecff5a26, 0x8506fb03, 0x2408617b, 0x008f04aa, 0x06796506, - 0x220bb37b, 0x87b1074a, 0xb7012747, 0x2101bf00, 0x874a1700, 0x07914f05, 0x090eb124, 0x4e18b0f4, 0x55820737, 0x06d40423, 0x2c55867c, 0x49b70106, - 0x000c00ec, 0xb02f17b0, 0x080f432c, 0x00001026, 0xae074205, 0xb6245588, 0x2b01c400, 0x04275587, 0x04b11b2f, 0x84593e1f, 0xd0132855, 0xff003130, - 0x849affff, 0x887920ab, 0x4eb62255, 0x205586f6, 0x2055882a, 0x20558412, 0x245588de, 0x01c300b5, 0x23258313, 0x0bb02f04, 0x8308b742, 0x0657229f, - 0x224988a9, 0x96de4db5, 0x88d62049, 0x82b42049, 0x9305209f, 0xfb032349, 0x4988a106, 0xd04eb422, 0xfe254991, 0x07420597, 0x23498537, 0x9d002700, - 0x36239382, 0x41000700, 0x06210cbf, 0x25438501, 0x9d002600, 0x1d83004d, 0x410cc541, 0xb3240927, 0x3001ef00, 0x0e208786, 0x41086d68, 0x1b4105c7, - 0x79b32209, 0x208786fb, 0x0877462d, 0x89051b41, 0xa4b82049, 0x97b82049, 0x3e082149, 0x24081b41, 0x01ee00b2, 0x21939536, 0x1b410807, 0x78b22208, - 0x21939500, 0x49881808, 0xf100b124, 0x49863c01, 0xb5651420, 0x20dd8508, 0x224988e2, 0x86067bb1, 0xdc332149, 0x072b4218, 0x97fe1225, 0x49074205, - 0x002506b5, 0x00a00027, 0x419382f6, 0x05210e65, 0x844385e6, 0x0080211f, 0x260b6741, 0x049efe94, 0x82b0054c, 0x8629201f, 0x00cb2c17, 0x00ffff0a, - 0x0494fe53, 0x824e040b, 0x86492017, 0x518f2017, 0x4c22089d, 0x237ac207, 0x04aa2b08, 0x004301ca, 0x06b00009, 0xb758b02f, 0xff532607, 0x060b04ec, - 0x253b8585, 0xaa000701, 0x5d438304, 0x10c57a05, 0x47883320, 0x8a00a424, 0x47863e01, 0xfd771720, 0xf605210b, 0x06244786, 0x0143a400, 0x7606fd77, - 0x0f220bb1, 0x4587b807, 0x00b70125, 0x43280184, 0x072d074d, 0x07b11b2f, 0xb1593e1f, 0xb0f4090f, 0x054d4315, 0x9b830020, 0x7c06c822, 0x01275387, - 0x00ec3db7, 0x82b0000c, 0x71202099, 0xff2707ad, 0x040000d5, 0x88b5074c, 0x00b62455, 0x87320189, 0x82062055, 0x87062055, 0x06f94355, 0x848eff21, - 0x887920f1, 0x42b62255, 0x205586f6, 0x2155871e, 0x55829400, 0xe5079222, 0xb5245588, 0x1a018800, 0x2306fb6d, 0x13b0dc0c, 0x83055d45, 0x064b229f, - 0x224988a9, 0x94de41b5, 0x074c2249, 0x204988dd, 0x209f82b4, 0x2249940c, 0x88a1060b, 0x42b42249, 0x214991d0, 0xe9829efe, 0x49853e20, 0x00270023, - 0x2593829d, 0x0007003d, 0x054204ac, 0x0106210a, 0x00244385, 0x419d0026, 0x42053b42, 0xa326050b, 0x11020000, 0xa776c207, 0x03aa2208, 0x050b4278, - 0xb02f0223, 0x06c34104, 0x01232982, 0x827e06fd, 0x008c2e23, 0x00070100, 0xff6403aa, 0x000900ff, 0x24238ab0, 0x019afe94, 0x081b77a7, 0xac000726, - 0x06007803, 0x78222582, 0x1d779efe, 0x2217830a, 0x820a005c, 0xfe662617, 0x051e0594, 0x4d5382c4, 0xac2305bd, 0x4e001d05, 0x9224055d, 0x4e043d04, - 0xed4d1782, 0x04ac2405, 0x7ffeff9d, 0x05230509, 0x73bb071e, 0xaa2408ad, 0x3c011c05, 0x14208383, 0x2609e57e, 0x04ecff4f, 0x5785063d, 0xaa220885, - 0xb3429804, 0x2f042305, 0x51741bb0, 0x0761220a, 0x294787b1, 0xd600b701, 0x0c002101, 0x4782b000, 0x754b2120, 0x22498308, 0x867c06dd, 0x01062449, - 0x43ec52b7, 0x1d2006d9, 0x2208e147, 0x82ecff27, 0x88ae2091, 0x00b62449, 0x862b01db, 0x871f2049, 0xa3ff2149, 0x79209384, 0xb6224988, 0x4986f657, - 0x49881b20, 0x20059b4a, 0x224988de, 0x45da00b5, 0xdb8405f9, 0x8307094c, 0x06602293, 0x224988a9, 0x96de56b5, 0x88d62049, 0x82b42049, 0x8f052093, - 0x41002093, 0xa1200527, 0xb4224988, 0x4991d057, 0x8294fe21, 0x853720dd, 0x27002349, 0x93829d00, 0x4105f945, 0x06210aa7, 0x24438501, 0x9d002600, - 0x05554256, 0x2b05ad41, 0x05ecff58, 0x023307aa, 0x00970026, 0x75261783, 0x3301d301, 0x7984ffff, 0x0006bb22, 0x98281782, 0x07010000, 0x58017500, - 0x2008735a, 0x06a14125, 0x44223b8f, 0x3b943401, 0xb9004422, 0x23203b88, 0xb8203b8c, 0xaa247788, 0x39011605, 0x85207788, 0xaa227788, 0x19429b04, - 0x2f092205, 0x203b8db0, 0x243b8829, 0x01d600a4, 0x213b8734, 0x3b86f605, 0xa4000625, 0x7300015b, 0x2e2005e3, 0xfe257587, 0x06aa0594, 0x2339882e, - 0x000605ac, 0x2405cb42, 0x04bb048b, 0x313985a8, 0xac000700, 0xf7ff9a04, 0x7d00ffff, 0xbd0494fe, 0x1b72b005, 0x20178405, 0x262f84f2, 0x0394fe77, - 0x723a04f7, 0x17840503, 0x17844120, 0x20054b72, 0x252f85bb, 0xaa000701, 0xfb42f304, 0x2f002105, 0x7208b579, 0xe1830595, 0x00005922, 0x91202384, - 0x0620e185, 0x47822389, 0x073d0623, 0x20478242, 0x24238499, 0x01d70175, 0x0ed56142, 0x05234782, 0x82ec0528, 0x869a2023, 0xff572223, 0x065b53ec, - 0x4a181c20, 0x478c096f, 0x38014422, 0x99504788, 0x22478f07, 0x88b80044, 0x8c1a2047, 0x88c72047, 0x05aa248f, 0x8648011a, 0x21478c8f, 0x8f887106, - 0x9a04aa24, 0x8f86f2ff, 0x3820478d, 0xa4224788, 0xc344da00, 0x5c042005, 0x8f8509ed, 0x4786e220, 0xa4000624, 0x4586ed5a, 0x26077742, 0x068bfe7d, - 0x8501063d, 0x07003145, 0x1905ac00, 0xfffff7ff, 0x94fe7700, 0x93042805, 0x17833985, 0x0045042d, 0x00ffff00, 0x04a4fe07, 0x55b005d6, 0x17840553, - 0x1000c622, 0x0c261782, 0xd6030ffe, 0x594c3a04, 0x22478405, 0x827bff46, 0x00072617, 0x07d60400, 0x088355bb, 0xca04aa22, 0x2305c541, 0x09b02f01, - 0x200c7955, 0x08954c85, 0x5904aa22, 0x8205c541, 0x077b5523, 0x2c204785, 0xa4244788, 0x37018a00, 0x20066b4d, 0x21478b14, 0x8d4df605, 0x19a42208, - 0x20218601, 0x3121831b, 0x4f000200, 0xb204ecff, 0x16000006, 0x8c002100, 0x4d191fb2, 0x1024089d, 0x13b000d0, 0x0aa35618, 0x07f44018, 0x0c147f18, - 0x1b2f022e, 0x3e0f02b1, 0x132fb259, 0x0fb25d01, 0x16270483, 0x12111302, 0x1816b039, 0x220c4d52, 0x82060c04, 0x0eb22114, 0xb02a0684, 0x16b0d00f, - 0xd011b010, 0xad7306b0, 0xdc56180c, 0x2301370e, 0x06272311, 0x11022223, 0x32331234, 0x35233517, 0x15333533, 0x64180133, 0x3b0809ca, 0xdcafb204, - 0xbeb66d0c, 0xacc3e8eb, 0xf3fbfb6a, 0x7f90fcaf, 0x43459575, 0x04807695, 0x7037fbc9, 0x01320184, 0x2f01fa07, 0x8daaf378, 0xa59dfc8d, 0xce0185b9, - 0xffffbb82, 0xaefe4f00, 0x263af384, 0x00004800, 0xde012700, 0x42028501, 0x43000701, 0x6dff9900, 0xb2001200, 0xce821c2f, 0x011c1f25, 0x829fb271, - 0x31302109, 0x9b2a3382, 0x7e059afe, 0x2602b005, 0x3382e301, 0xb0010734, 0x00002f04, 0x8f00ffff, 0xc2049afe, 0x26023a04, 0x1785f000, 0x84730321, - 0x82942017, 0x83db202f, 0x2c00212f, 0x04211785, 0x2017848c, 0x202f8286, 0x202f84d5, 0x201785f3, 0x05d75203, 0x17822d20, 0x230aef77, 0x4d02b001, - 0x23242f84, 0xd0039afe, 0xf5202f84, 0x01212f85, 0x201784e6, 0x205f8229, 0x0ab94d22, 0xd303b022, 0x1f201784, 0x27204782, 0x220ab94d, 0x84d802b0, - 0x828e2017, 0x84ad202f, 0x85e0202f, 0x5e042147, 0x5f201784, 0xa4222f82, 0x9f4e3b04, 0x82002005, 0x550321d7, 0x2f821784, 0x8bee0421, 0xcf02212f, - 0x2f821784, 0x8be00321, 0xc601212f, 0x9b201784, 0x37204782, 0xb0202f84, 0x01215f85, 0x20178407, 0x20bf8285, 0x208f844d, 0x211785eb, 0x1784ec00, - 0x9afe1624, 0x2f840508, 0x1785d920, 0x84b60621, 0xfe1e2417, 0x84b4069a, 0x85ed202f, 0x65052117, 0x162a1784, 0xbc0543fe, 0x2602c405, 0x17853f01, - 0xffed022d, 0xffffffa9, 0x0446fecb, 0x824e048b, 0x85402017, 0xf5012617, 0xffffacff, 0x05cd7c00, 0x06020024, 0x17824c00, 0xd0ff0236, 0xc1040000, - 0x1300b005, 0x6e001c00, 0x1e1d00b2, 0xb0391211, 0x07564918, 0x0cfa5f18, 0x08887518, 0x0a101322, 0x13202483, 0x200cca42, 0x2d148502, 0x00b02f02, - 0xd00cb010, 0xb01013b0, 0x9418d00e, 0x0a200e63, 0x0b705a18, 0x0131302d, 0x32211523, 0x14151616, 0x18210704, 0x08072455, 0x21110338, 0x34353632, - 0x6d022726, 0xa02a01e0, 0xebfe7cee, 0xc0d3fdef, 0xe0e0fdc0, 0x8f802901, 0x47047c8c, 0x85ca6ec4, 0x0402f8cc, 0xbfbfaa47, 0x12fec7fd, 0x806e738b, - 0xc9400002, 0xff012cc9, 0x040000f0, 0x00b00537, 0x4f49000d, 0x08240589, 0x08b11b2f, 0x44075c60, 0x0d27085c, 0x12110208, 0x410db039, 0xb0280b87, - 0x0db0d004, 0xd006b010, 0x0d948c18, 0x107a7918, 0xfcf68d3f, 0x9c03abab, 0x02f660fd, 0x0261fd9f, 0x6702aa9f, 0x0065fecc, 0x00e2ff01, 0x044d0300, - 0x447b8e3a, 0x7bb607e5, 0x23112129, 0x33352311, 0x82152111, 0x7f023801, 0xa3f2f8fe, 0xfec802a3, 0x0108012a, 0x012ffed1, 0xbf01aad1, 0x8200fbc4, - 0x00e3247d, 0x82440500, 0x001422f9, 0x42f99274, 0x5c180c8e, 0xc81808f7, 0x0f2408b8, 0x0eb2593e, 0x20051341, 0x3a47180e, 0x07b2210b, 0x8e181485, - 0x07310d8e, 0xd00ab010, 0xb01004b0, 0x12b2d00c, 0x12110e01, 0x09244139, 0x15333535, 0x15231533, 0x01210133, 0x57022101, 0xccccfcac, 0x18d5d5fc, - 0x2c0e8195, 0xc7aa3f04, 0x02f3aac7, 0xfd47fd64, 0x27bb8209, 0x040000ae, 0x00000649, 0xc75bbb8d, 0x41bb8407, 0xb0200f46, 0x1021bb8d, 0x20858202, - 0x20bb8fb0, 0x5f7b1810, 0x20bba111, 0x2abb8511, 0xf26ff601, 0xc4f2e7e7, 0x180169c4, 0x350cb095, 0x9baabb04, 0xe1fdaa9b, 0x11fe9e01, 0xff00b5fd, - 0xfe9400ff, 0x6d61057e, 0x00db3205, 0x00270000, 0x011d01a0, 0x0007013d, 0xff800410, 0x0c3960c6, 0x0bfd5518, 0x7efe8625, 0x6005e404, 0x35830667, - 0xff970023, 0x213583f3, 0x358e8703, 0x830b6f60, 0x46e9206b, 0x63820903, 0xc6ff8c22, 0x4d838382, 0x0346e320, 0x10002309, 0x17848603, 0x07212f82, - 0x202f8432, 0x829b8231, 0xd5052193, 0x8f241784, 0x41067efe, 0xf2202f84, 0x04211785, 0x201784e4, 0x20cb822d, 0x097d53dc, 0x7f205f82, 0x21201784, - 0xe620ad82, 0x82097d53, 0x8289205f, 0x00012fa5, 0x04000007, 0x00b005d6, 0xb256000e, 0xaa180f0a, 0x764309e9, 0x2f0b240c, 0x430bb11b, 0x062a1083, - 0x12110802, 0x2f06b039, 0x481805b2, 0x0123099f, 0x420ab2d0, 0x06230572, 0x180eb010, 0x220af77c, 0x82012101, 0x03332c02, 0xcafed5c3, 0x0167fe7a, - 0x824f0119, 0xfe183601, 0x04028667, 0x0402fcfd, 0xfd0203aa, 0xfcb2024e, 0x010000fe, 0x06375b00, 0x63209582, 0x49429591, 0x08bb5407, 0x58450024, - 0xa28202b0, 0x1fcbde18, 0xb223a588, 0x83000b0a, 0xd00d21ba, 0x0521a284, 0x05a34323, 0x33012308, 0x01331313, 0xdc600333, 0xfea2cef3, 0xecf3fbbb, - 0xafbcfefb, 0x0160fe01, 0x9103aaa0, 0xff0201fd, 0x9d836ffc, 0x23069162, 0x63001100, 0x4105a943, 0x0e200c1f, 0x0e208982, 0x200f2c41, 0x18a383b0, - 0x22081484, 0x83020b11, 0x4611207e, 0x04200c45, 0x07291485, 0x1011b0d0, 0xb2d009b0, 0x230f840d, 0x23013130, 0x21053a41, 0xd7423523, 0x03333706, - 0x950187db, 0xc7fed9fe, 0xdafec6fe, 0x73819601, 0x240182fe, 0x01823201, 0x83fe2439, 0xfd950279, 0xfd16026b, 0xaa9502ea, 0xf2fd7102, 0x8ffd0e02, - 0x66000100, 0xb38e06f3, 0x18074a41, 0x440c34c3, 0xb3890c5d, 0xb3930e20, 0xb3891485, 0xb3850f84, 0x21030323, 0x08b38401, 0x21131359, 0x57033301, - 0xfe260195, 0xfed7d8f4, 0x8a2501f2, 0x01effe82, 0x01ceca0c, 0x8ceefe0e, 0x29fed701, 0x8efe7201, 0x01aad701, 0x019cfeb9, 0xff47fe64, 0xff6000ff, - 0x040c04ec, 0x0006024d, 0xff0000be, 0x000200ff, 0x05310400, 0x002602b0, 0x0000002a, 0xffde0107, 0x8269fe72, 0x02812317, 0xe318056d, 0x51200f5d, - 0x40222b82, 0x3b82c405, 0x20096f59, 0x590f8415, 0x3420056f, 0x58201f82, 0x06224b82, 0x5b841800, 0x6b828120, 0x0f843a20, 0x0f841920, 0xfaff5d29, - 0xc4051204, 0x4e000600, 0x7d2005cf, 0x36201f82, 0x14210f84, 0x208b8314, 0x220f826a, 0x184b07f0, 0x2408df49, 0x01bd0175, 0x06b36f4b, 0x654b2120, - 0xfe522606, 0x060c0456, 0xd5491800, 0x01752208, 0x0825603f, 0xad672720, 0x0d461809, 0x0144220c, 0x0977604c, 0x87520620, 0x56b02006, 0x461807d3, - 0x44220f0d, 0x5182b300, 0x81421320, 0x08776805, 0x52181220, 0x21200c91, 0x24082557, 0x017704ab, 0x0c417a33, 0x593e1f27, 0xb0dc0cb0, 0x05975210, - 0xecff0d26, 0xec05fb03, 0x24083157, 0xff0104ab, 0x202f87fe, 0x9b571817, 0xa9581809, 0x00482607, 0x074c0400, 0x08df5328, 0x3c04ab22, 0x8809b35a, - 0xdc0d23bb, 0x5f8511b0, 0xecff0124, 0x5f840b04, 0x00004928, 0xab000701, 0x5f89f503, 0x2008575a, 0x0735691f, 0x00f6fe25, 0x841e0200, 0x852d205f, - 0xea02212f, 0x93615f89, 0xdc052308, 0x5f8409b0, 0x82e2fe21, 0x050a222f, 0x088752e4, 0xd602ab24, 0xbf87f6ff, 0x1b202f84, 0x2f88ef82, 0x57510020, - 0x52212005, 0xab220833, 0x1f418e04, 0x089d6309, 0xb0dc2023, 0x215f8424, 0xbf821600, 0xbf843d20, 0x8f855320, 0x890a0421, 0x2f0424bf, 0x8304b11b, - 0x181c205f, 0x25086154, 0x04000032, 0x5f8307de, 0x2f863620, 0x7f412620, 0x6a192012, 0xff210753, 0x20bf826e, 0x205f84b4, 0x212f8556, 0x5f896203, - 0x2008115d, 0x0847540f, 0x8f827120, 0x5f84bd20, 0x2f853920, 0x89650421, 0x0890695f, 0xb0dc1223, 0x24bf8516, 0x03ecff0f, 0x505f84f7, 0xab220503, - 0x5f920304, 0xfe322f88, 0x050000ac, 0x00410602, 0x64cf0026, 0x00070000, 0x634cfdad, 0xfe942b05, 0x05a3049e, 0x002602b0, 0x17830026, 0xb904ac32, - 0xffff0a00, 0x8bfe7c00, 0x00063204, 0x46002602, 0xcb221786, 0x1782f7ff, 0xd2202f83, 0x28202f84, 0x94201786, 0x4f242f84, 0x030494fe, 0x48202f84, - 0xb4291786, 0xffff0000, 0xf9fd9400, 0x252f8a04, 0x4801a201, 0x178292fe, 0x17824f20, 0x17822f8a, 0x17846820, 0x05215f82, 0x0a4f4718, 0x2605ac22, - 0x79245f84, 0xf8039efe, 0x4c205f84, 0xa1205f86, 0x94201784, 0x8769d782, 0x00092311, 0x4c1804b0, 0x00270883, 0x0400007d, 0x823d0736, 0x004f2bcb, - 0x00070100, 0x016b0175, 0x238d003d, 0xdffe9422, 0x2f207786, 0xe9225f86, 0xa7824b00, 0xcafe7d22, 0x0b094b18, 0x04ac0025, 0x41360079, 0x26200607, - 0x3020a784, 0x240c3741, 0x019efe78, 0x20a7848b, 0x21178550, 0xa7855c03, 0x069efe23, 0x0af7476a, 0xd605ac22, 0x7c201784, 0x79221782, 0x9b824e04, - 0x2f855120, 0x84d90521, 0xfe942217, 0x074a189a, 0xac00250b, 0x06002805, 0x79227782, 0x4a189efe, 0x8f820b07, 0x2f858d20, 0x04000025, 0x824207d4, - 0x86342047, 0x517220e3, 0x032005a7, 0x09935f18, 0x60fe7c26, 0xf7053004, 0x54202382, 0x9d272386, 0x0900f7ff, 0x6c0cb000, 0x942209b9, 0x48189efe, - 0x5f820b81, 0x5f84ba20, 0x9efe7222, 0x0b814818, 0x03ac0023, 0x22178456, 0x1894fe4a, 0x2a0c9947, 0x00d504ac, 0x00ffff00, 0x188bfe4b, 0x820b6947, - 0xff7c2247, 0x221782f7, 0x1897fe2d, 0x240cf346, 0x00c304ac, 0x22178203, 0x1894fe08, 0x820b2347, 0x8414202f, 0x00122647, 0x071d0500, 0x20b38238, - 0x22b3843a, 0x51b000a4, 0x581805ef, 0x16260a2b, 0xda030000, 0x2382ed05, 0x23825a20, 0xa4000624, 0x0151f818, 0x083d4506, 0x059efe25, 0x85b0051d, - 0x07002145, 0xef205d82, 0x1626bd84, 0xda039efe, 0x39853a04, 0x57201784, 0x30241784, 0xe5069efe, 0x3b202f84, 0x20069541, 0x201784e6, 0x20478221, - 0x202f84cc, 0x2017865b, 0x2417844e, 0x049efe50, 0x202f848c, 0x2117853e, 0x1784c104, 0x5f825220, 0x2f84c020, 0x17865e20, 0x17836320, 0xff1cfe33, - 0x056405ec, 0x002600d7, 0x00004633, 0xfd5a0107, 0x2aed84b5, 0x04000009, 0x021e0594, 0x84ba0126, 0xffad282f, 0xffddfe76, 0x822affff, 0x05f127e1, - 0x01260021, 0x2f823cbe, 0xfead0025, 0x82e0fe64, 0x82372017, 0x05a4222f, 0x2017821c, 0x221786c1, 0x82dbfe71, 0x00392417, 0x84b30100, 0x86c2202f, - 0x84732017, 0xff93262f, 0x057904f0, 0x212f821e, 0x47850ac8, 0x5f83cd20, 0x82e8fe21, 0x84722047, 0x86d22017, 0x8422202f, 0x82a42077, 0x848e2017, - 0x86f32017, 0x83de202f, 0x84002017, 0x8d0423a7, 0xa7830602, 0x20066777, 0x200f840a, 0x20c784bb, 0x20af8276, 0x200f84b5, 0x200f84be, 0x200f8241, - 0x500f84f3, 0x1f8205c1, 0x84680421, 0x84c1200f, 0x8285201f, 0x847720af, 0x84c2200f, 0x201f890f, 0x210f87c4, 0x1f848f05, 0x20058950, 0x22c7824f, - 0x829d046f, 0x05b35e7f, 0x2c202f83, 0xc9201f84, 0x24202f84, 0x1620b782, 0xcd200f84, 0x05200f84, 0x36200f82, 0xd2200f84, 0x15200f84, 0x4a200f82, - 0xd1200f84, 0x40180f83, 0x4f843001, 0x18284574, 0x202c1541, 0x272d8300, 0x021e0697, 0x00ea0126, 0x2005ad44, 0x056b7723, 0xb02f0422, 0x2407a16b, - 0x03f0ff3e, 0x20ff84ef, 0x133f41cc, 0x2420cfb0, 0x64254f82, 0x06028d04, 0x051b6001, 0x04218382, 0x20838468, 0x104d78c4, 0x91480f20, 0xff1f2a06, - 0x063904ec, 0x02260204, 0x23238201, 0x7aa00006, 0x7708bf74, 0x2f42102d, 0x84972023, 0x42f3827f, 0x0320054f, 0x830b3f42, 0x836e208f, 0xfe01216b, - 0xa0228f84, 0x8775ba00, 0x7d0d2012, 0x2d4209db, 0x0f6d420c, 0x20133d42, 0x207d8462, 0x087d42ef, 0x830b4d42, 0x0443262f, 0x0106029d, 0x145d42bc, - 0x370c4d42, 0x42000100, 0xe70339fe, 0x28009d04, 0x27b2a400, 0x12112a29, 0x17b00039, 0x20056755, 0x07cf7c0a, 0x0cb0cc18, 0x0fa09318, 0x32821920, - 0x1927b223, 0x2e06820a, 0xb22f27b0, 0x7201275f, 0x01273fb2, 0x83cfb271, 0x83ff2004, 0x820f2004, 0x6fb42f13, 0x02277f27, 0x27afb471, 0x5d0227bf, - 0x12828fb2, 0x83bfb221, 0x71242004, 0xb2230876, 0x18272410, 0x21085f5c, 0x52851db2, 0xb5181920, 0x34230e55, 0x18222326, 0x2b093dae, 0x16160706, - 0x07061415, 0x26112311, 0x1cb89318, 0xf3acbb24, 0x9318b09b, 0x862918b6, 0x41fe18ae, 0xac18c201, 0xba931887, 0x01003007, 0x9afe7600, 0x8d042c05, - 0xa8000f00, 0x181003b2, 0x220987b3, 0x181b2f0c, 0x1809068a, 0x200ce770, 0x20198201, 0x07997801, 0x180c9856, 0x2208947d, 0x8309060a, 0x2f0a2fe2, - 0xbf0aafb4, 0xb25d020a, 0x71010a3f, 0x0483cfb2, 0x72220982, 0x0983ffb2, 0x010a0f2e, 0x0a6fb472, 0x71020a7f, 0xef0adfb4, 0xb4232682, 0x822f0a1f, - 0x5fb22106, 0xb2211982, 0x4a8d1805, 0x4e0e200c, 0x47510859, 0x5ff41806, 0x05333c09, 0xfdc4f32c, 0x02f3f3f4, 0xfec4f30c, 0x0166019a, 0x0425fedb, - 0x0111fe8d, 0x8228fcef, 0xfe4f2ae1, 0x04430443, 0x001e009d, 0x0c7b795e, 0xc7820e20, 0x08829618, 0x0c820420, 0xd17f0420, 0x26c78707, 0xb2d006b0, - 0x83030e12, 0x180e20ca, 0x200ccd6e, 0x0b717903, 0x031eb223, 0x05df510e, 0xa2410620, 0x27022305, 0xbe183435, 0x0c281448, 0xb5f3a9c6, 0xec7e01cf, - 0x1148be18, 0x1bd09f2d, 0xb90149fe, 0xdd1f0124, 0x18ffa94f, 0x180b4dbe, 0x22093588, 0x45010602, 0x0a34052b, 0xa8053afe, 0x2602a304, 0x00001702, - 0xb0010700, 0xa0ffe602, 0x2505a343, 0xd2056e04, 0x93432602, 0x00702c06, 0x00220082, 0x00b00009, 0x440ab02f, 0x23830b23, 0x21062344, 0x21844270, - 0x50180220, 0x502609f1, 0x4d050000, 0x6d828d04, 0x0000f128, 0x1200ffff, 0x3d6455fe, 0x01a3240c, 0x82030082, 0xfe5a2217, 0x0c3d6459, 0xb500a324, - 0x17820700, 0x5cfe9422, 0x240c0f61, 0x004001a3, 0x2217820a, 0x6152fe53, 0xa3220c0f, 0x5f840401, 0x9efe7826, 0x3a048b01, 0x2705574c, 0xac000700, - 0x0a005c03, 0x0f28d782, 0x0300ba00, 0x09040100, 0x5e200b82, 0x0b850382, 0x1a000124, 0x17865e00, 0x0e000224, 0x0b867800, 0x178a0320, 0x0b8a0420, - 0x2c000524, 0x23868600, 0x17820620, 0x0b86b220, 0x40000724, 0x0b86cc00, 0x0c000924, 0x0b860c01, 0x14000b24, 0x0b861801, 0x26000c24, 0x0b862c01, - 0x5c000d24, 0x0b865201, 0x54000e24, 0x0b86ae01, 0x0c001024, 0x0b860202, 0x0b821120, 0x43000e3a, 0x70006f00, 0x72007900, 0x67006900, 0x74006800, - 0x32002000, 0x31003000, 0x20220182, 0x1d824700, 0x17826f20, 0x65006c22, 0x49261782, 0x63006e00, 0x09822e00, 0x6c004122, 0x20220182, 0x35885200, - 0x15827320, 0x25825220, 0x03827320, 0x76007222, 0x64200582, 0x52202982, 0x62203f82, 0x74200382, 0x20220382, 0x15844d00, 0x75006924, 0x39826d00, - 0x57826520, 0x45827520, 0x7b826120, 0x35845620, 0x4d827320, 0x63826f20, 0x2e208183, 0x85858382, 0x8f823520, 0x95883b20, 0x39823420, 0x87006f21, - 0x8e2d2053, 0x20198953, 0x834b8220, 0x82612093, 0x82742039, 0x00612261, 0x21638264, 0x6d83006d, 0x13826b20, 0x66006f22, 0xdf8b0582, 0xed8c2e20, - 0x6320198d, 0x6d24bf82, 0x68004300, 0x69244982, 0x74007300, 0x61205d82, 0xe185a984, 0x17826520, 0x17827420, 0x4c20bd83, 0x63201b82, 0x6e206b82, - 0x65200f82, 0x20207582, 0x6e20ef82, 0x72207d84, 0x68208b84, 0x20241b82, 0x70004100, 0x63208b82, 0x65205182, 0x338d1582, 0x11822c20, 0x20151141, - 0x20798268, 0x22398274, 0x822f003a, 0x00772101, 0x2e200183, 0x4b894782, 0xa9822e20, 0x67007222, 0x6c201d82, 0x7320878c, 0x4c221182, 0xc3824900, - 0x4e00452e, 0x45005300, 0x32002d00, 0x30002e00, 0x410c4f41, 0x03210ba1, 0x21008400, 0xbb826aff, 0x048e0984, 0x0200012c, 0x02000800, 0x0f00ffff, - 0x1b820100, 0x000a2008, 0x00ac005c, 0x4c464404, 0x631a0054, 0x006c7279, 0x65726728, 0x6c36006b, 0x006e7461, 0x82040044, 0x82002023, 0x0002242d, - 0x8a040000, 0x0001220d, 0x220d8a05, 0x8a060002, 0x00032a0d, 0x63080007, 0x00707370, 0x20058432, 0x20058438, 0x2605843e, 0x72656b44, 0x914a006e, - 0x205f8205, 0x22918401, 0x84030001, 0x8402200b, 0x21048205, 0x5b820100, 0x0c000522, 0x01210185, 0x202586de, 0x20078208, 0x2285820a, 0x82480024, - 0x82de2009, 0x25ec09d5, 0x27002600, 0x29002800, 0x2b002a00, 0x2d002c00, 0x2f002e00, 0x31003000, 0x33003200, 0x35003400, 0x37003600, 0x39003800, - 0x3b003a00, 0x3d003c00, 0x65003e00, 0x92006700, 0xb100b000, 0xb300b200, 0xb500b400, 0xb700b600, 0xb900b800, 0xd200d100, 0xd400d300, 0xd600d500, - 0xd800d700, 0xda00d900, 0xdc00db00, 0xde00dd00, 0xe000df00, 0xe200e100, 0xe400e300, 0xe600e500, 0xe800e700, 0x30012c01, 0x38013201, 0x3c013a01, - 0x3f013e01, 0x46014501, 0x85017f01, 0x8d018a01, 0x47024602, 0x4b024902, 0x4d024c02, 0x4f024e02, 0x51025002, 0x53025202, 0x55025402, 0x57025602, - 0x59025802, 0x5b025a02, 0x5d025c02, 0x5f025e02, 0x61026002, 0x63026202, 0x65026402, 0x84028202, 0x88028602, 0x8c028a02, 0x90028e02, 0x94029202, - 0x98029602, 0x9c029a02, 0xa0029e02, 0xa402a202, 0xa802a602, 0xac02aa02, 0xb102ae02, 0xb502b302, 0xb902b702, 0xbd02bb02, 0xc102bf02, 0xc602c402, - 0xca02c802, 0xce02cc02, 0xd202d002, 0xd802d402, 0xdc02da02, 0xe002de02, 0xe402e202, 0xe802e602, 0xec02ea02, 0xf002ee02, 0xf302f102, 0x5203f502, - 0x54035303, 0x56035503, 0x58035703, 0x5b035a03, 0x5d035c03, 0x5f035e03, 0x61036003, 0x64036303, 0x66036503, 0x68036703, 0x79036903, 0x7b037a03, - 0x7d037c03, 0x7f037e03, 0x81038003, 0x83038203, 0x85038403, 0x87038603, 0x89038803, 0x8b038a03, 0x8d038c03, 0xba038e03, 0xbe03bc03, 0xd903d303, - 0x4804df03, 0x4e044a04, 0x58045604, 0x69045d04, 0x00000200, 0x0a000200, 0x0100ba3b, 0x04006c03, 0xb1010000, 0x9e36b206, 0xdc069e36, 0x40373207, - 0xca364c36, 0xd8378a3b, 0xde3a3807, 0x1e38de3a, 0xea358c3a, 0x35080983, 0x56368a3b, 0xf40a720a, 0x1e383e38, 0x7836a436, 0x003b3239, 0x5e0b2a36, - 0xdc36b637, 0xa00bee37, 0xd40cca0c, 0x96399639, 0xdc36f837, 0xca0d1836, 0x2c0e2438, 0x05829039, 0xdc364628, 0xca39880e, 0x55824037, 0x0f403608, - 0x10fc0f02, 0x12d811fa, 0x12243876, 0x1596397c, 0x1814173a, 0x18401826, 0x1a4c1846, 0x1a4c1a46, 0x1bb41a82, 0x1ea81c32, 0x3a18205a, 0x224e21de, - 0x253239e0, 0x217f832e, 0x0583f636, 0xf8253308, 0xa0399227, 0x32297028, 0x1e2ac029, 0x2839f82a, 0x9039822b, 0x762c4c2c, 0xdc36dc2d, 0xa0306230, - 0x9033d231, 0x5432dc36, 0x0433da32, 0x90335a33, 0x91824037, 0x2438a423, 0x2da78233, 0x2839ca39, 0x8c3a8c3a, 0x9e362839, 0xf383e033, 0x359e3631, - 0x35783552, 0x358c3582, 0x35bc35aa, 0x83e035ce, 0x8a3b21fd, 0x38210183, 0x203b823e, 0x23038940, 0xd837ca36, 0x89830185, 0x29850385, 0x1e212d84, - 0x23018438, 0xb637003b, 0xee21018c, 0x23018437, 0xf8379639, 0x38230187, 0x82243824, 0x87b62057, 0xca362103, 0x3b210185, 0x205f828a, 0x23038fee, - 0x9639de3a, 0x91417189, 0xea352105, 0x19850183, 0x39231d83, 0x82963996, 0x87f8203d, 0x18362103, 0x38210183, 0x8401843e, 0x299d8597, 0x003b7836, - 0x003b2438, 0x01832a36, 0xd8207f82, 0x8205db41, 0x364026b5, 0x36d8374c, 0x2069842a, 0x2915858c, 0x3e385636, 0x3239003b, 0x0582de3a, 0xb582bf82, - 0xd837f824, 0x1942ca39, 0x8c3a2407, 0x8237f636, 0xca392237, 0x29478637, 0xca365636, 0x32393e38, 0xf582b637, 0xdc36f82e, 0x90392438, 0x2839ee37, - 0x78362438, 0x7d830183, 0x83057741, 0x24ff84bb, 0x36ee37d8, 0x201f82a4, 0x821b83ca, 0x39322415, 0x41de3a90, 0x1d82081d, 0xee214982, 0x83158239, - 0x823720db, 0xf6362153, 0x03862d82, 0x2b881783, 0x75824020, 0x538303a3, 0xfb85039a, 0x4b413720, 0x0b574108, 0x38238385, 0x411e381e, 0x38210547, - 0x22b58424, 0x83de3a8c, 0x903925f5, 0x2839ca39, 0x39269383, 0x39a03996, 0x47413aca, 0x3b002805, 0x0002008a, 0x8204008b, 0x00002201, 0x24018206, - 0x000b0001, 0x2213820c, 0x82130013, 0x00252813, 0x0005002a, 0x8236002c, 0x00383215, 0x0016003f, 0x00460045, 0x0049001e, 0x0020004a, 0x2201824c, - 0x824f0022, 0x00232801, 0x00540051, 0x82560024, 0x00282201, 0x24018258, 0x005a0029, 0x263d825d, 0x005f005f, 0x828a002e, 0x002f2201, 0x2a01829c, - 0x00b00030, 0x003100b4, 0x82b800b6, 0x00ba2655, 0x003900ba, 0x280182bc, 0x00bf003a, 0x003b00c0, 0x220182c2, 0x82c4003d, 0x003e2801, 0x00cd00c6, - 0x82d1003f, 0x00472801, 0x00dd00d3, 0x82df0048, 0x00532401, 0x82e300e1, 0x00e5266d, 0x005700ee, 0x0a0182f0, 0xf500618a, 0x6200f700, 0xfb00fa00, - 0xfd006500, 0x6700ff00, 0x04010201, 0x09016a00, 0x6d000901, 0x0c010c01, 0x17016e00, 0x6f001901, 0x21012101, 0x2b017200, 0x73002d01, 0x30013001, - 0x32017600, 0x77003201, 0x49014901, 0x6c017800, 0x79006d01, 0x71016f01, 0xba017b00, 0x7e00ba01, 0xbd01bd01, 0xc4017f00, 0x8000c501, 0xc801c801, - 0xca018200, 0x8300cb01, 0xcd01cd01, 0x28028500, 0x86002802, 0x2b022a02, 0x46028700, 0x89004702, 0x49024902, 0x4b028b00, 0x8c006c02, 0x71026e02, - 0x7602ae00, 0xb2007b02, 0x88028002, 0x8a02b800, 0xc1008a02, 0x8c028c02, 0x8e02c200, 0xc3008e02, 0x90029002, 0x9202c400, 0xc5009b02, 0xa602a402, - 0xa802cf00, 0xd200a802, 0xaa02aa02, 0xac02d300, 0xd400ac02, 0xae02ae02, 0xb102d500, 0xd600b102, 0xb302b302, 0xb502d700, 0xd800b502, 0xb702b702, - 0xb902d900, 0xda00b902, 0xbb02bb02, 0xbd02db00, 0xdc00c902, 0xcb02cb02, 0xcd02e900, 0xea00cd02, 0xcf02cf02, 0xda02eb00, 0xec00da02, 0xdc02dc02, - 0xde02ed00, 0xee00de02, 0xe002e002, 0xe202ef00, 0xf000e202, 0xe402e402, 0xe602f100, 0xf200e602, 0xe802e802, 0xea02f300, 0xf400ea02, 0xec02ec02, - 0xee02f500, 0xf600f102, 0xf302f302, 0xf502fa00, 0xfb00f502, 0x57035203, 0x5a03fc00, 0x02016903, 0x6c036c03, 0x70031201, 0x13017003, 0x72037203, - 0x76031401, 0x15017603, 0x7a037903, 0x7c031601, 0x18018503, 0x89038703, 0x8b032201, 0x25019003, 0x93039203, 0x95032b01, 0x2d019803, 0x9f039e03, - 0xa1033101, 0x3301a103, 0xa303a303, 0xa5033401, 0x3501a803, 0xb003ab03, 0xb2033901, 0x3f01b203, 0xb703b603, 0xbc034001, 0x4201bc03, 0xc703be03, - 0xca034301, 0x4d01cb03, 0xd003cd03, 0xd7034f01, 0x5301d803, 0xdc03dc03, 0xde035501, 0x5601e403, 0xea03e903, 0xee035d01, 0x5f011604, 0x18041804, - 0x1a048801, 0x89012704, 0x2f042f04, 0x32049701, 0x98013204, 0x34043404, 0x40049901, 0x9a014504, 0x48044804, 0x4a04a001, 0xa1014a04, 0x4c044c04, - 0x4e04a201, 0xa3014f04, 0x57045404, 0x5a04a501, 0xa9015a04, 0x5d045c04, 0x5f04aa01, 0xac015f04, 0x63046304, 0x6504ad01, 0xae016504, 0x69046904, - 0xa904af01, 0xb001a904, 0x38000a00, 0xd100c4ff, 0xd5240382, 0x3201c4ff, 0x3a240382, 0xda02c4ff, 0xdc200382, 0xde280382, 0x8d03c4ff, 0x4c04c4ff, - 0x153a1f82, 0x14003a00, 0x26003b00, 0x16003d00, 0x14001801, 0x16006502, 0x2600ec02, 0x0782ee02, 0x1600f024, 0x03825703, 0x03826620, 0x03826920, - 0x26009f24, 0x0382a103, 0x0382a320, 0x0f82a520, 0x1400b628, 0x1600be03, 0x03824004, 0x03824220, 0x03824420, 0x002d2782, 0xff130001, 0x00ce0008, - 0x00eefe10, 0x28038212, 0x0040ff25, 0x0030ff2e, 0x286b8238, 0x00deff45, 0x00ebff47, 0x20038248, 0x20038249, 0x2003824b, 0x20038253, 0x2c038255, - 0x00e6ff56, 0x00eaff59, 0x00e8ff5a, 0x2003825d, 0x20138293, 0x20038298, 0x2013829a, 0x204382b1, 0x200382b3, 0x200f82ba, 0x201b82bc, 0x200782c7, - 0x200382c8, 0x201b82ca, 0x205782d1, 0x240382d5, 0x01ebfff6, 0x24038202, 0x0140ff0c, 0x24078217, 0x01e8ff19, 0x2007821d, 0x24038221, 0x01140032, - 0x20078239, 0x8207823a, 0x4c012173, 0x56200b82, 0x6e240382, 0x7201eefe, 0x76200382, 0x77200382, 0xba280382, 0x4b02c0ff, 0x4c0240ff, 0x4d200382, - 0x4e200382, 0x4f200382, 0x50200382, 0x51200382, 0x66240382, 0x6702deff, 0x68200382, 0x69200382, 0x6a200382, 0x6b200382, 0x6c200382, 0x6d240382, - 0x6e02ebff, 0x6f200382, 0x70200382, 0x71200382, 0x77200382, 0x78200382, 0x79200382, 0x7a200382, 0x7b200382, 0x7c240382, 0x7d02eaff, 0x7e200382, - 0x7f200382, 0x80240382, 0x8102e8ff, 0x82200382, 0x83205f82, 0x84204782, 0x85200782, 0x86200782, 0x87200782, 0x89200782, 0x8b203382, 0x8d200382, - 0x8f200382, 0x91200382, 0x93200382, 0x95200382, 0x97200382, 0x99200382, 0x9b200382, 0x9d200382, 0x9f200382, 0xa1200382, 0xa3200382, 0xb1240382, - 0xc50230ff, 0xc7200782, 0xc9200382, 0xda240382, 0xdc021400, 0xde200382, 0xe1200382, 0xe3207782, 0xe5200382, 0xe7200382, 0xe9200382, 0xeb200382, - 0xef280382, 0x5203e8ff, 0x5a0340ff, 0x6a270382, 0x6e03ebff, 0x8203eaff, 0x720321cb, 0x75201782, 0x76200b82, 0x77201382, 0x7e230782, 0x820330ff, - 0x8d0329af, 0x8f031400, 0x9003deff, 0x92201782, 0x94200382, 0x95200382, 0x97202b82, 0x9e200782, 0xa6200782, 0xae200382, 0xaf204b82, 0xb2202382, - 0xb7201382, 0xb8200f82, 0xbd200782, 0xbf200382, 0xc4200b82, 0xc5201b82, 0xc6201b82, 0xc7200782, 0xcb200782, 0xcd201782, 0xce200382, 0xd8200382, - 0xda200382, 0xdc200382, 0xe0200382, 0xe2202b82, 0xe4200382, 0xeb200382, 0xee200f82, 0xef202f82, 0xf0202f82, 0xf1200782, 0xf2200782, 0xf3200782, - 0xf4200782, 0xf5200782, 0xf6200782, 0xf7200782, 0xf8200782, 0xf9200782, 0xfa200782, 0xfb200782, 0xfc200782, 0xfd200782, 0xfe200782, 0xff280782, - 0x0004deff, 0x010440ff, 0x02200782, 0x03200782, 0x04200782, 0x05200782, 0x07240782, 0x0904ebff, 0x0b200382, 0x0d200382, 0x0f200382, 0x11200382, - 0x13200382, 0x15200382, 0x1b200382, 0x1d200382, 0x1f200382, 0x21200382, 0x23200382, 0x25200382, 0x27200382, 0x29200382, 0x2b200382, 0x2d200382, - 0x2f200382, 0x31200382, 0x33240382, 0x3504eaff, 0x37200382, 0x39200382, 0x3b200382, 0x3d200382, 0x3f200382, 0x41240382, 0x4304e8ff, 0x45200382, - 0x4c360382, 0x20001400, 0xdfff3800, 0xe4ff3a00, 0xecff3b00, 0xddff3d00, 0x0f82d100, 0xdfffd528, 0xe4ff1801, 0x07823201, 0x03823a20, 0x0e00ba2c, - 0xddff6502, 0xdfffda02, 0x0382dc02, 0x0382de20, 0xecffec24, 0x1382ee02, 0xddfff024, 0x03825703, 0x03826620, 0x03826920, 0xdfff8d28, 0xecff9f03, - 0x0382a103, 0x0382a320, 0x1382a520, 0xe4ffb628, 0xddffbe03, 0x03824004, 0x03824220, 0x03824420, 0xdfff4c23, 0x212f8204, 0x81821a00, 0x8182ce20, - 0x7d82ed20, 0x7d82d020, 0xd500ce24, 0x7d82ceff, 0x7d82ed20, 0x3a01ce24, 0x7982ceff, 0x7982d020, 0x7982ce20, 0xde02ce22, 0xee260f82, 0xf002d0ff, - 0x7582d0ff, 0x6603d022, 0x69200782, 0x8d240382, 0xa503ceff, 0xb6220782, 0x6982edff, 0x6982d020, 0x4204d026, 0x4404d0ff, 0x4c220382, 0x6982ceff, - 0x1000d02c, 0xeeff2e00, 0xeeff3900, 0x03826102, 0x03826220, 0x03826320, 0x03826420, 0x0382b120, 0x0382e020, 0x0382e220, 0x0382e420, 0x0382e620, - 0x0382e820, 0xeeffea28, 0xeeff7e03, 0x03823204, 0x3b823420, 0x06004a22, 0x0b204582, 0x0d2c0382, 0x41001400, 0x47001200, 0x4800e8ff, 0x49200382, - 0x4b200382, 0x55200382, 0x61240382, 0x93001300, 0x98200782, 0xba200382, 0xc7200382, 0xc8200382, 0xf6240382, 0x0201e8ff, 0x1d200382, 0x21200382, - 0x39200382, 0x33820382, 0x824c0121, 0x82562007, 0x006c2403, 0x826d0110, 0x826f2003, 0x82702003, 0x00712803, 0xff6d0210, 0x826e02e8, 0x826f2003, - 0x82702003, 0x82712003, 0x82892003, 0x828b2003, 0x828d2003, 0x828f2003, 0x82912003, 0x216f8203, 0x07829502, 0x03829720, 0x03829920, 0x03829b20, - 0x03829d20, 0x03829f20, 0x0382a120, 0xe8ffa324, 0x03826a03, 0x03829020, 0x03829420, 0x03829720, 0x1000a724, 0x0382a803, 0x0382ab20, 0x0f82b220, - 0x0382b820, 0x0382bd20, 0x0382cb20, 0x0382cd20, 0x0382ce20, 0x0382da20, 0xe8ffeb24, 0x03820704, 0x03820920, 0x03820b20, 0x03820d20, 0x03820f20, - 0x03821120, 0x03821320, 0x03821520, 0x03822920, 0x03822b20, 0x03822d20, 0xeb823120, 0xf5000230, 0x6d01d6ff, 0x3d0098ff, 0xecff4700, 0x03824800, - 0x03824920, 0x03824b20, 0x03825520, 0x03829320, 0x03829820, 0x0382ba20, 0x0382c720, 0x0382c820, 0xecfff624, 0x03820201, 0x03821d20, 0x03822120, - 0x03823920, 0x01212f82, 0x2407824c, 0x02ecff56, 0x2003826d, 0x2003826e, 0x2003826f, 0x20038270, 0x20038271, 0x20038289, 0x2003828b, 0x2003828d, - 0x2003828f, 0x82038291, 0x9502215b, 0x97200782, 0x99200382, 0x9b200382, 0x9d200382, 0x9f200382, 0xa1200382, 0xa3240382, 0x6a03ecff, 0x90200382, - 0x94200382, 0x97200382, 0xb2200382, 0xb8200382, 0xbd200382, 0xcb200382, 0xcd200382, 0xce200382, 0xda200382, 0xeb220382, 0xff82ecff, 0x0904ec22, - 0x0b200782, 0x0d200382, 0x0f200382, 0x11200382, 0x13200382, 0x15200382, 0x29200382, 0x2b200382, 0x2d200382, 0x31200382, 0x1826cb82, 0xe2ff5300, - 0x03821701, 0x18006d28, 0xe2ff7702, 0x03827802, 0x03827920, 0x03827a20, 0x03827b20, 0x0382c520, 0x0382c720, 0xe2ffc924, 0x03827003, 0x03827620, - 0x03829220, 0x0382d820, 0xe2ffdc24, 0x03821b04, 0x03821d20, 0x03821f20, 0x03822120, 0x03822320, 0x03822520, 0x03822720, 0xe2ff2f2e, 0x10000600, - 0x120084ff, 0x6e0184ff, 0x72200382, 0x76200382, 0x77200382, 0x10221382, 0x81822e00, 0xe9823920, 0x03826120, 0x03826220, 0x03826320, 0x03826420, - 0x0382b120, 0x0382e020, 0x0382e220, 0x0382e420, 0x0382e620, 0x0382e820, 0xe582ea20, 0xb9827e20, 0x03823220, 0x3b823420, 0x06001e26, 0x0b00f2ff, - 0x5a240382, 0x5d00f3ff, 0xbc200382, 0xf52c0382, 0x1901f5ff, 0x6c01f3ff, 0x6d01f2ff, 0x6f200382, 0x70200382, 0x71280382, 0x8002f2ff, 0x8102f3ff, - 0xef240382, 0x7203f3ff, 0x95200382, 0x9e200382, 0xa6200382, 0xa7240382, 0xa803f2ff, 0xab200382, 0xb7200382, 0xbf200f82, 0xe0200382, 0xe2200382, - 0xe4240382, 0x4104f3ff, 0x43200382, 0x45200382, 0x3e226382, 0x05822700, 0x03822b20, 0x03823320, 0x03823520, 0x03828320, 0x03829220, 0x03829720, - 0x0382b220, 0x0d00c324, 0x8582d200, 0x03820720, 0x03821620, 0x03821a20, 0x03821c20, 0x03821e20, 0x03822020, 0x03823820, 0x89825520, 0x03822820, - 0x03822920, 0x02214b82, 0x2007822c, 0x20038252, 0x8203825c, 0x5e0221cd, 0x5f200782, 0x60200382, 0x88200382, 0x8a200382, 0x8c200382, 0x8e200382, - 0x9c200382, 0xb9820382, 0x82a00221, 0x82a22007, 0x82c42003, 0x82c62003, 0x82c82003, 0x82f92003, 0x825620b1, 0x82632003, 0x82892003, 0x21338203, - 0x0782b903, 0x0382bc20, 0x0382d720, 0x0382d920, 0xc982db20, 0x03821a20, 0x03821c20, 0x03821e20, 0x03822020, 0x03822220, 0x03822420, 0x03822620, - 0x03822820, 0x03822a20, 0x03822c20, 0x03822e20, 0x03823020, 0xd782a920, 0xf9823f20, 0x2b00e626, 0x3300e6ff, 0x35200382, 0x83200382, 0x92200382, - 0x97200382, 0xb2200382, 0xb7260382, 0xc300c2ff, 0xfd821000, 0x0701e626, 0x1601e6ff, 0x1a200382, 0x1c200382, 0x1e200382, 0x20200382, 0x38200382, - 0x55240382, 0x2802e6ff, 0x29200382, 0x4f820382, 0xe622fd82, 0x0b825202, 0x03825c20, 0x03825d20, 0x03825e20, 0x03825f20, 0x03826020, 0x03828820, - 0x03828a20, 0x03828c20, 0x03828e20, 0x03829c20, 0x03829e20, 0x0382a020, 0x0382a220, 0x0382c420, 0x0382c620, 0x0382c820, 0xe6fff924, 0x03825603, - 0x03826320, 0x03828920, 0xfd823382, 0xbc03e622, 0xd7200b82, 0xd9200382, 0xdb240382, 0x1a04e6ff, 0x1c200382, 0x1e200382, 0x20200382, 0x22200382, - 0x24200382, 0x26200382, 0x28200382, 0x2a200382, 0x2c200382, 0x2e200382, 0x30200382, 0xa9200382, 0x372edb82, 0xe4ff2500, 0xd2ff3c00, 0xd3ff3d00, - 0x0b82b100, 0x0382b320, 0xe2ffc32c, 0xd2ffd900, 0xe4ff0c01, 0x03824b02, 0x03824c20, 0x03824d20, 0x03824e20, 0x03824f20, 0x03825020, 0x03825120, - 0xd3ff6524, 0x07828202, 0x03828420, 0x03828620, 0x0f82ee20, 0xd3fff028, 0xe4ff5203, 0x07825703, 0x07825a20, 0x07826620, 0xd2ff6724, 0x07826903, - 0x0f828220, 0x0b828e20, 0x0b82a520, 0x0b82ae20, 0x0782be20, 0x0f82c120, 0x0b82c420, 0x0382c620, 0x0b82cf20, 0x0382e920, 0x0b82ee20, 0x0382f020, - 0x0382f220, 0x0382f420, 0x0382f620, 0x0382f820, 0x0382fa20, 0x0382fc20, 0xe4fffe24, 0x03820004, 0x03820220, 0x03820420, 0xd3ff4024, 0x03824204, - 0x03824420, 0xd2ff4e24, 0x03825604, 0x00276f82, 0xff100027, 0x82120046, 0xff252203, 0x22dd82cd, 0x82b300cd, 0xffc62207, 0x26d982f2, 0xff6e01cd, - 0x82720146, 0x82762003, 0xff772203, 0x26e98246, 0xff4c02cd, 0x824d02cd, 0x824e2003, 0x824f2003, 0x82502003, 0x82512003, 0x82822003, 0x82842003, - 0xff862203, 0x22dd82cd, 0x825a03cd, 0x82822007, 0x82ae2003, 0x82c42003, 0x82c62003, 0x82ee2003, 0x82f02003, 0x82f22003, 0x82f42003, 0x82f62003, - 0x82f82003, 0x82fa2003, 0x82fc2003, 0xfffe2403, 0x820004cd, 0x82022003, 0x82042003, 0x00012c87, 0x000e00c3, 0xff4700af, 0x824800dc, 0x82492003, - 0x824b2003, 0xff512403, 0x825200c1, 0xff532403, 0x825400d6, 0x82552007, 0xff592813, 0xff5a00dd, 0x825d00e1, 0x82932003, 0x8298200f, 0x829a2003, - 0x82ba2013, 0x82bc2007, 0xffbe2413, 0x82c000e6, 0xffc1302b, 0xffc200eb, 0xffc400e9, 0xffc500f0, 0x82c700e7, 0x82c8201f, 0xffc92403, 0x82ca00e3, - 0xffcb2c2f, 0xffcc00ce, 0xffcd00d4, 0x82eb00db, 0x82ef202f, 0x82f02003, 0x82f22003, 0x82f32003, 0x82f42003, 0x82f62003, 0x82f7202f, 0x82f92007, - 0x82fa2003, 0x82fd2003, 0xffff2803, 0xff0201c1, 0x820401dc, 0xff172807, 0xff1901d6, 0x821d01e1, 0x8221200f, 0x82352003, 0x82392013, 0x82442007, - 0x82492007, 0x824b2003, 0x824c200b, 0xff562403, 0x826d02dc, 0x826e2003, 0x826f2003, 0x82702003, 0x82712003, 0xff762803, 0xff7702c1, 0x827802d6, - 0x82792003, 0x827a2003, 0x827b2003, 0xff7c2403, 0x827d02dd, 0x827e2003, 0x827f2003, 0xff802403, 0x828102e1, 0x82892003, 0x828b2033, 0x828d2003, - 0x828f2003, 0x82912003, 0x82932003, 0x82952003, 0x82972003, 0x82992003, 0x829b2003, 0x829d2003, 0x829f2003, 0x82a12003, 0x82a32003, 0x82be2003, - 0x82c02067, 0x82c22003, 0x82c32003, 0x82c52003, 0x82c72063, 0x82c92003, 0x82e12003, 0x82e3205f, 0x82e52003, 0x82e72003, 0x82e92003, 0x82eb2003, - 0xffef3403, 0xff6a03e1, 0xff6c03dc, 0xff6e03c1, 0xff7003dd, 0x827203d6, 0x82752013, 0x8276200b, 0x8277200b, 0x82902007, 0x8291201f, 0x8292201f, - 0x8293200f, 0x82942007, 0x8295200f, 0x82972023, 0x82982007, 0x829d200f, 0x829e2003, 0x82a6200f, 0x82ad2003, 0x82b2200b, 0x82b32017, 0x82b72007, - 0x82b8200f, 0x82bd200b, 0x82bf2003, 0x82cb200b, 0x82cd2007, 0x82ce2003, 0x82d42003, 0x82d6201f, 0x82d82003, 0x82da2053, 0x82dc200f, 0x82e02007, - 0x82e22023, 0x82e42003, 0x82e82003, 0xffeb241b, 0x820704dc, 0x82092003, 0x820b2003, 0x820d2003, 0x820f2003, 0x82112003, 0x82132003, 0x82152003, - 0xff1b2403, 0x821d04d6, 0x821f2003, 0x82212003, 0x82232003, 0x82252003, 0x82272003, 0x82292003, 0x822b201f, 0x822d2003, 0x822f2003, 0x8231200f, - 0xff332407, 0x823504dd, 0x82372003, 0x82392003, 0x823b2003, 0x823d2003, 0x823f2003, 0xff412403, 0x824304e1, 0x82452003, 0xff492403, 0x824b04c1, - 0x82552003, 0x82622003, 0x82642003, 0xff662a03, 0x007600c1, 0x00daff06, 0x2403820b, 0x00f0ff47, 0x20038248, 0x20038249, 0x2003824b, 0x28038255, - 0x00efff59, 0x00dcff5a, 0x2003825d, 0x200f8293, 0x20038298, 0x2013829a, 0x200782ba, 0x2c1382bc, 0x00ecffc1, 0x000f00c3, 0x00eaffc5, 0x201382c7, - 0x240382c8, 0x00ceffc9, 0x282382ca, 0x00e7ffcb, 0x01f0fff6, 0x24038202, 0x01dcff19, 0x2007821d, 0x20038221, 0x82038239, 0x4c01215f, 0x56200782, - 0x6c240382, 0x6d01daff, 0x6f200382, 0x70200382, 0x71280382, 0x6d02daff, 0x6e02f0ff, 0x6f200382, 0x70200382, 0x71200382, 0x7c240382, 0x7d02efff, - 0x7e200382, 0x7f200382, 0x80240382, 0x8102dcff, 0x89200382, 0x8b201b82, 0x8d200382, 0x8f200382, 0x91200382, 0xab820382, 0x82950221, 0x82972007, - 0x82992003, 0x829b2003, 0x829d2003, 0x829f2003, 0x82a12003, 0x82a32003, 0x82e12003, 0x82e32043, 0x82e52003, 0x82e72003, 0x82e92003, 0x82eb2003, - 0xffef2c03, 0xff6a03dc, 0xff6e03f0, 0x827203ef, 0x8275200b, 0x82772007, 0x82902003, 0x82942013, 0x82952003, 0x82972013, 0x829e2007, 0x82a62007, - 0xffa72403, 0x82a803da, 0x82ab2003, 0x82b22003, 0x82b72017, 0x82b82013, 0x82bd2007, 0x82bf2003, 0x82cb200b, 0x82cd2007, 0x82ce2003, 0x82da2003, - 0x82e02003, 0x82e22013, 0x82e42003, 0xffeb2403, 0x820704f0, 0x82092003, 0x820b2003, 0x820d2003, 0x820f2003, 0x82112003, 0x82132003, 0x82152003, - 0x82292003, 0x822b2003, 0x822d2003, 0x82312003, 0xff332403, 0x823504ef, 0x82372003, 0x82392003, 0x823b2003, 0x823d2003, 0x823f2003, 0xff412403, - 0x824304dc, 0xff452a03, 0x004400dc, 0x000c0010, 0x24038212, 0x00e7ff47, 0x20038248, 0x20038249, 0x2003824b, 0x20038255, 0x20038293, 0x20038298, - 0x240382ba, 0x000f00c3, 0x200782c7, 0x240382c8, 0x01e7fff6, 0x20038202, 0x2003821d, 0x20038221, 0x82038239, 0x4c012133, 0x56200782, 0x6e240382, - 0x72010c00, 0x76200382, 0x77280382, 0x6d020c00, 0x6e02e7ff, 0x6f200382, 0x70200382, 0x71200382, 0x89200382, 0x8b200382, 0x8d200382, 0x8f200382, - 0x91200382, 0x6f820382, 0x82950221, 0x82972007, 0x82992003, 0x829b2003, 0x829d2003, 0x829f2003, 0x82a12003, 0xffa32403, 0x826a03e7, 0x82902003, - 0x82942003, 0x82972003, 0x82b22003, 0x82b82003, 0x82bd2003, 0x82cb2003, 0x82cd2003, 0x82ce2003, 0x82da2003, 0xffeb2403, 0x820704e7, 0x82092003, - 0x820b2003, 0x820d2003, 0x820f2003, 0x82112003, 0x82132003, 0x82152003, 0x82292003, 0x822b2003, 0x822d2003, 0x82312003, 0x00063adb, 0x00eaffc9, - 0x00eeffec, 0x00d5fff5, 0x01edfffd, 0x01ecff33, 0x00ecff58, 0x20118201, 0x2a0582c0, 0x002000c9, 0x0006007e, 0x820b000c, 0x0ba34c03, 0x0f824a20, - 0xe8ff4b24, 0x41825300, 0x07825520, 0x21825a20, 0x03825d20, 0x200baf4c, 0x240f82bc, 0x0090ffc3, 0x200782c5, 0x202382c7, 0x200382c8, 0x203782c9, - 0x06bf4cf6, 0xeaff1727, 0x0b001901, 0x19c74c01, 0x6d010c26, 0x6f010c00, 0x70200382, 0x71200382, 0xba280382, 0xbc01bfff, 0xc001eeff, 0xc820a982, - 0xca20b182, 0xcc2e0782, 0xcd01f5ff, 0xcf010e00, 0xd2010d00, 0xeb4c0d00, 0xff772414, 0x827802ea, 0x82792003, 0x827a2003, 0x827b2003, 0x00802403, - 0x8281020b, 0x36074d03, 0x82c50221, 0x82c72043, 0x82c92003, 0x00ef2c03, 0xff6a030b, 0xff7003e8, 0x827203ea, 0x8276200b, 0x82902007, 0x8292200f, - 0x82942007, 0x82952007, 0x82972013, 0x829e2007, 0x82a62007, 0x00a72403, 0x82a8030c, 0x82ab2003, 0x82b22003, 0x82b72017, 0x07374d13, 0x0b82bf20, - 0x200b3b4d, 0x204382d8, 0x202382da, 0x200782dc, 0x201b82e0, 0x200382e2, 0x4d0382e4, 0x1b24234f, 0x1d04eaff, 0x1f200382, 0x21200382, 0x23200382, - 0x25200382, 0x27200382, 0x6b4d0382, 0x822f200b, 0xff31280f, 0x004104e8, 0x8243040b, 0x00453003, 0x0001000b, 0x00e2fff5, 0xff5c000d, 0x825e00ed, - 0x82ed2003, 0xfff52803, 0xfff202c0, 0x82f402ed, 0xfff62403, 0x829603ed, 0x82c22003, 0x82d02003, 0xffea2403, 0x824f04ed, 0x82572003, 0x820c2027, - 0x82f22035, 0x00f22435, 0x82f2ffed, 0x82f22031, 0x02f22431, 0x82f2fff6, 0x03f22231, 0x200782c2, 0x220382d0, 0x82f2ffea, 0x04f22a31, 0x00f2ff57, - 0xff5a001f, 0x203584f4, 0x2407825d, 0x00f3ff5e, 0x820782bc, 0x1901253d, 0x8002f4ff, 0x81200382, 0xef200382, 0xf2220382, 0x4d82f3ff, 0x4d82f320, - 0x7203f326, 0x9503f4ff, 0x96200382, 0x9e204d82, 0xa6200782, 0xb7200382, 0xbf200382, 0x65870382, 0x0b82e020, 0x0382e220, 0x0382e420, 0x7182ea20, - 0xf4ff4124, 0x03824304, 0x03824520, 0x0f824f20, 0x5d267d83, 0xcaff0600, 0x03820b00, 0xd2ff3828, 0xd4ff3a00, 0x7d823c00, 0xd3ff3d22, 0xe6209582, - 0xef249582, 0xe6ff5d00, 0xe6229182, 0x1f82d100, 0x0382d520, 0x1f82d920, 0xe982dd20, 0xe1ffe024, 0x2f82e500, 0xefffed32, 0xc9fff500, 0xd1fffd00, - 0xe5ff0801, 0xd4ff1801, 0xe62eb982, 0xe3ff1f01, 0xd2ff3201, 0xc4ff3301, 0x07823a01, 0xe1ff3c24, 0x1b824d01, 0xf5ff4e34, 0xe7ff4f01, 0x64ff5701, - 0xc9ff5801, 0xcaff6c01, 0x03826d01, 0x03826f20, 0x03827020, 0xcaff7126, 0xd3ff6502, 0xe62af982, 0xe6ff8102, 0xd2ffda02, 0x0382dc02, 0x0382de20, - 0x1782ee20, 0x1382ef20, 0xd3fff024, 0x03825703, 0x2205934a, 0x826903f4, 0xff722c0b, 0xff8103e6, 0xff8d03ed, 0x828e03d2, 0x829520f1, 0xff96240f, - 0x829e03ef, 0x82a52007, 0x82a6201f, 0xffa72407, 0x82a803ca, 0x82ab2003, 0xffb62403, 0x82b703d4, 0x82be2013, 0x82bf201b, 0x82c12007, 0x82c22033, - 0x82cf202f, 0x82d02007, 0x82df2007, 0x82e0204b, 0x82e12017, 0x82e22007, 0x82e32007, 0x82e42007, 0xffe52407, 0x82e903e1, 0xffea2c23, 0xff4004ef, - 0xff4104d3, 0x824204e6, 0x82432007, 0x82442007, 0x82452007, 0xff4c2807, 0xff4e04d2, 0x824f04f4, 0xff502423, 0x825204e1, 0x82562003, 0x8257200f, - 0x27ab820f, 0x06006c00, 0x0b00c0ff, 0x38340382, 0x3a009dff, 0x3c00c7ff, 0x3d00f0ff, 0x5100abff, 0x5200d2ff, 0x54200382, 0xc0200382, 0xd1200382, - 0xd3241f82, 0xd500f5ff, 0xd9200782, 0xdc202382, 0xdd2c0b82, 0xe000eaff, 0xe500e5ff, 0xeb00c1ff, 0xef202382, 0xf0200382, 0xf2200382, 0xf3200382, - 0xf4200382, 0xf5240382, 0xf700cdff, 0xf9200782, 0xfa200382, 0xfd200382, 0xff240382, 0x0401d2ff, 0x182c0382, 0x3201c7ff, 0x33019dff, 0x3501ccff, - 0x3a200f82, 0x3c280b82, 0x3f01e5ff, 0x4401dfff, 0x49200f82, 0x4d300382, 0x4f01ceff, 0x5101eaff, 0x5701f5ff, 0x58019eff, 0x6c240f82, 0x6d01c0ff, - 0x6f200382, 0x70200382, 0x712c0382, 0x6502c0ff, 0x7602abff, 0xbe02d2ff, 0xc0200382, 0xc2200382, 0xc3200382, 0xda240382, 0xdc029dff, 0xde200382, - 0xee200382, 0xf0242382, 0x5703abff, 0x66200382, 0x67240382, 0x6903f0ff, 0x6c2c0782, 0x8103d2ff, 0x8d03eaff, 0x8e039dff, 0x91201382, 0x93200f82, - 0x98200382, 0x9d200382, 0xa5200382, 0xa7242382, 0xa803c0ff, 0xab200382, 0xad200382, 0xb3201382, 0xb6240382, 0xbe03c7ff, 0xc1201b82, 0xcf203382, - 0xd4200382, 0xd6201382, 0xdf200382, 0xe1204b82, 0xe3200382, 0xe5240382, 0xe803e5ff, 0xe9201382, 0xec281f82, 0x4004f5ff, 0x4204abff, 0x44200382, - 0xdf820382, 0xff4b0431, 0xff4c04d2, 0xff4e049d, 0xff5004f0, 0x825204e5, 0x82552003, 0x82562013, 0x8262200f, 0x82642007, 0x82662003, 0x82672003, - 0x27ab823b, 0x06006f00, 0x0b00b1ff, 0x38340382, 0x3a009eff, 0x3c00c5ff, 0x3d00f2ff, 0x5100a8ff, 0x5200cfff, 0x54200382, 0x5c240382, 0xc000efff, - 0xd1200782, 0xd5202382, 0xd9200382, 0xdd232382, 0x4300ecff, 0xc222052b, 0x1b82eb00, 0x2382ed20, 0x0782ef20, 0x0382f020, 0x0382f220, 0x0382f320, - 0x0382f420, 0xc6fff524, 0x0782f700, 0x0382f920, 0x0382fa20, 0x0382fd20, 0xcfffff24, 0x03820401, 0xc5ff182c, 0x9eff3201, 0xc0ff3301, 0x0f823501, - 0x0b823a20, 0xe1ff3c22, 0x2206b141, 0x824901cf, 0xff4d3413, 0xff4f01cd, 0xff5701e8, 0xff58019f, 0xff6c01c6, 0x826d01b1, 0x826f2003, 0x82702003, - 0xff712c03, 0xff6502b1, 0xff7602a8, 0x82be02cf, 0x82c02003, 0x82c22003, 0x82c32003, 0xffda2403, 0x82dc029e, 0x82de2003, 0x82ee2003, 0xfff02423, - 0x825703a8, 0x82662003, 0xff672403, 0x826903f2, 0xff6c2c07, 0xff8103cf, 0xff8d03ec, 0x828e039e, 0x82912013, 0x8293200f, 0xff962403, 0x829803ef, - 0x829d2007, 0x82a52003, 0xffa72427, 0x82a803b1, 0x82ab2003, 0x82ad2003, 0x82b32013, 0xffb62403, 0x82be03c5, 0x82c1201b, 0x05634337, 0xd003f222, - 0xd4203782, 0xd6201b82, 0xdf200382, 0xe1205782, 0xe3200382, 0xe5240382, 0xe803e1ff, 0xe9201382, 0x63432b82, 0x04a82605, 0x04a8ff42, 0x82038244, - 0x4b042be7, 0x4c04cfff, 0x4e049eff, 0x5f43f2ff, 0x8255200c, 0x82562017, 0xff572413, 0x826204ef, 0x8264200b, 0x82662003, 0x2bbb8203, 0x38004d00, - 0x5100beff, 0x5200e1ff, 0x54200382, 0x5a240382, 0x5d00efff, 0xbc200382, 0xc0200382, 0xd1200f82, 0xd5201f82, 0xe5240382, 0xeb00c9ff, 0xef200f82, - 0xf0200382, 0xf2200382, 0xf3200382, 0xf4200382, 0xf5240382, 0xf700dfff, 0xf9200782, 0xfa200382, 0xfd200382, 0xff240382, 0x0401e1ff, 0x08340382, - 0x1901edff, 0x1f01efff, 0x3201ebff, 0x3301beff, 0x3501dfff, 0x3a201782, 0x3f240b82, 0x4401e9ff, 0x49200b82, 0x4e300382, 0x5801f5ff, 0x7602e0ff, - 0x8002e1ff, 0x8102efff, 0xbe200382, 0xc0200b82, 0xc2200382, 0xc3200382, 0xda240382, 0xdc02beff, 0xde200382, 0xef280382, 0x6c03efff, 0x7203e1ff, - 0x8d240782, 0x9103beff, 0x93200b82, 0x95200382, 0x98200f82, 0x9d200782, 0x9e200382, 0xa6200b82, 0xad200382, 0xb3200b82, 0xb7200382, 0xbf200b82, - 0xd4200382, 0xd6200b82, 0xe0200382, 0xe2200b82, 0xe4200382, 0xe8280382, 0x4104e1ff, 0x4304efff, 0x45200382, 0x93820382, 0x824b0421, 0xff4c2413, - 0x825504be, 0x82622007, 0x82642003, 0x82662003, 0x006428db, 0x00e6ff38, 0x42e7ff3a, 0xe72606eb, 0xd6ff5100, 0x03825200, 0x03825420, 0xf1ff5c24, - 0x0782c000, 0x2382d120, 0x0382d520, 0x2605eb42, 0xffe000ee, 0x82e500e8, 0x82eb200f, 0x82ed201b, 0x82ef2023, 0x82f02007, 0x82f22003, 0x82f32003, - 0x82f42003, 0xfff52403, 0x82f700d0, 0x82f92007, 0x82fa2003, 0x82fd2003, 0xffff2403, 0x820401d6, 0xff182c03, 0xff3201e7, 0xff3301e6, 0x823501ce, - 0x823a200f, 0xff3c240b, 0x824401e8, 0x8249200b, 0x824d2003, 0xff4f241f, 0x825701ed, 0xff582c17, 0xff6502d0, 0xff7602e7, 0x82be02d6, 0x82c02003, - 0x82c22003, 0x82c32003, 0xffda2403, 0x82dc02e6, 0x82de2003, 0x82ee2003, 0xfff02423, 0x825703e7, 0x82662003, 0x05d34203, 0x6c03e72c, 0x8103d6ff, - 0x8d03eeff, 0xd342e6ff, 0x03d62206, 0x24138293, 0x03f1ff96, 0x20078298, 0x2003829d, 0x202f82a5, 0x200782ad, 0x200382b3, 0x200b82b6, 0x420382be, - 0xf12605c7, 0xf2ffcf03, 0x2b82d003, 0x1b82d420, 0x0382d620, 0x4b82df20, 0x0382e120, 0x0382e320, 0xe8ffe524, 0x1382e803, 0x2605c742, 0xff4004f1, - 0x824204e7, 0x82442003, 0x27c78203, 0xd6ff4b04, 0xe6ff4c04, 0x2606c742, 0xff5004f1, 0x825204e8, 0x82552003, 0x05c74217, 0x6204f122, 0x64200b82, - 0x66200382, 0x692e0382, 0x9300e7ff, 0x10002500, 0xe8ff2700, 0x03822b00, 0x03823320, 0x03823520, 0xe0ff3824, 0x03823a00, 0xdfff3d24, 0x0f828300, - 0x03829220, 0x03829720, 0x2b82b120, 0x0782b220, 0x0782b320, 0x1f82d120, 0x0b82d220, 0x0b82d320, 0x0b82d520, 0x1400d824, 0x0b82dc00, 0x26059944, - 0x00ec00e0, 0x82f10013, 0xfff82c0f, 0x000301e0, 0xff070110, 0x820c01e8, 0x82162007, 0x82182007, 0x821a2013, 0x821c2007, 0x821e2003, 0x82202003, - 0x82322003, 0x82382013, 0x823a2007, 0xff3c2407, 0x823d01e1, 0x82402007, 0xff452c07, 0xff4d01e9, 0xff4f01df, 0x825101de, 0x8255203f, 0x82572023, - 0xff59280f, 0xff2802f2, 0x822902e8, 0x21bb8203, 0x07822c02, 0x10004b24, 0x03824c02, 0x03824d20, 0x03824e20, 0x03824f20, 0x03825020, 0x02213782, - 0x201f8252, 0x2003825c, 0x2003825d, 0x2003825e, 0x2003825f, 0x24038260, 0x02dfff65, 0x20238282, 0x20038284, 0x20038286, 0x20138288, 0x2003828a, - 0x2003828c, 0x2003828e, 0x2003829c, 0x2003829e, 0x200382a0, 0x200382a2, 0x200382c4, 0x200382c6, 0x240382c8, 0x02e0ffda, 0x200382dc, 0x200382de, - 0x204782ee, 0x280382f0, 0x03e8fff9, 0x03100052, 0x82078256, 0x5a0321a7, 0x63200b82, 0x66240b82, 0x6903dfff, 0x6b820382, 0x82890321, 0x255f820f, - 0xe0ff8d03, 0x1382a503, 0x2382ae20, 0x0b82b620, 0x1782b920, 0x0382bc20, 0x1382be20, 0x1382c420, 0x0382c620, 0x0f82d720, 0x0382d920, 0x0382db20, - 0xe1ffe524, 0x2782e603, 0x1782ec20, 0x0382ed20, 0x0382ee20, 0x0382f020, 0x0382f220, 0x0382f420, 0x0382f620, 0x0382f820, 0x0382fa20, 0x0382fc20, - 0x1000fe24, 0x03820004, 0x03820220, 0x03820420, 0xe8ff1a24, 0x03821c04, 0x03821e20, 0x03822020, 0x03822220, 0x03822420, 0x03822620, 0x03822820, - 0x03822a20, 0x03822c20, 0x03822e20, 0x03823020, 0xdfff4024, 0x03824204, 0x03824420, 0xe0ff4c28, 0xe1ff5004, 0x07825104, 0x07825220, 0x07825320, - 0x53826720, 0x03826820, 0x0431d782, 0x00e8ffa9, 0xff1b0032, 0xff3800f2, 0xff3a00f1, 0x06f749f4, 0xd100f022, 0x71480f82, 0x00f12205, 0x481782d9, - 0xf32a0571, 0xf1ffe500, 0xf4ff1801, 0x07823201, 0x03823a20, 0xf2ff4d24, 0x03824f01, 0x2a052148, 0xff6502f2, 0xffda02f0, 0x82dc02f1, 0x82de2003, - 0x82ee2003, 0xfff0240f, 0x825703f0, 0x82662003, 0xff672403, 0x826903f4, 0xff812807, 0xff8d03f3, 0x828e03f1, 0x82a5200f, 0x82b6200f, 0x82be2007, - 0x82c12007, 0x82cf2007, 0x82df2003, 0x82e1201f, 0x82e32003, 0x82e92003, 0x05bd470f, 0xd982f020, 0x4404f02e, 0x4c04f0ff, 0x4e04f1ff, 0x5604f4ff, - 0x67230382, 0x8204f5ff, 0x66002553, 0x0f002500, 0xe620c982, 0xe62ac982, 0x0e003c00, 0xe6ff3d00, 0x1382b100, 0x0382b320, 0x0b82d120, 0x1382d320, - 0x0782d520, 0x1300d824, 0x0b82d900, 0x0382dc20, 0x0b00dd22, 0x2a064749, 0xffe600e6, 0x00ec00f4, 0x82f10012, 0xfff5302f, 0xfff800e7, 0xfffd00e8, - 0x000301e7, 0x820c010f, 0xff182203, 0x069544e6, 0x3a01e722, 0x3c280b82, 0x3d01e5ff, 0x4d01e8ff, 0x4f200b82, 0x51220382, 0x91440e00, 0x02e72606, - 0x020f004b, 0x2003824c, 0x2003824d, 0x2003824e, 0x2003824f, 0x20038250, 0x24038251, 0x02e6ff65, 0x20078282, 0x20038284, 0x44038286, 0xe62a0da5, - 0xe6fff002, 0x0f005203, 0x07825703, 0x07825a20, 0x07826620, 0x0e006724, 0x07826903, 0x0b008123, 0x213b8203, 0x0b828d03, 0x13828e20, 0x0782a520, - 0x2382ae20, 0x0782b620, 0x0382be20, 0x1382c120, 0x0f82c420, 0x0382c620, 0x0b82cf20, 0x2f82df20, 0x0382e120, 0x0382e320, 0xe5ffe528, 0xe8ffe603, - 0x1782e903, 0x0382ec20, 0x2382ed20, 0x0382ee20, 0x0382f020, 0x0382f220, 0x0382f420, 0x0382f620, 0x0382f820, 0x0382fa20, 0x0382fc20, 0x0f00fe24, - 0x03820004, 0x03820220, 0x03820420, 0xe6ff4024, 0x03824204, 0x03824420, 0x03824c20, 0x0e004e2c, 0xe5ff5004, 0xe8ff5104, 0x07825204, 0x07825320, - 0x13825620, 0x0421af82, 0x822f8268, 0x370027b3, 0xbfff0600, 0x03820b00, 0x9fff382c, 0xc9ff3a00, 0xadff3d00, 0x0b82d100, 0x0382d520, 0x3a051b49, - 0xffe500e6, 0xfff500c4, 0xfffd00cd, 0xff1801d5, 0xff3201c9, 0xff33019f, 0x823a01cc, 0xff3c3c07, 0xff3f01e6, 0xff4d01df, 0xff4f01d1, 0xff5701ec, - 0xff5801a1, 0xff6c01cf, 0x826d01bf, 0x826f2003, 0x82702003, 0xff712c03, 0xff6502bf, 0xffda02ad, 0x82dc029f, 0x82de2003, 0x82ee2003, 0xfff0240f, - 0x825703ad, 0x82662003, 0x82692003, 0xff812803, 0xff8d03ec, 0x82a5039f, 0xffa7240b, 0x82a803bf, 0x82ab2003, 0xffb62403, 0x82be03c9, 0x0d8b4813, - 0x4004e624, 0xf582adff, 0x4404ad22, 0x4c220782, 0xf1829fff, 0xed82e620, 0x8204e621, 0x3000294b, 0xe3ff3800, 0xe5ff3c00, 0xe420d582, 0xe322d582, - 0x0b82d300, 0x1382d520, 0xe2ffd824, 0x0b82d900, 0x0382dc20, 0xe9ffdd28, 0xeafff100, 0x03820301, 0xe3ff3222, 0xe328d582, 0xe5ff5101, 0xe4ff5701, - 0xe420b182, 0xe320b182, 0xe326b182, 0xe3ffde02, 0x1382ee02, 0xe4fff023, 0x211b8203, 0x07826603, 0xe5ff6724, 0x07826903, 0xe9ff8122, 0xe322b582, - 0x0f828e03, 0x0f82a520, 0x0382be20, 0x0b82c120, 0x0382cf20, 0x1b82df20, 0x0382e120, 0x0382e320, 0x0f82e920, 0x0382ec20, 0xeaffed22, 0xe424b982, - 0xe4ff4204, 0xe42ab982, 0xe3ff4c04, 0xe5ff4e04, 0x03825604, 0x04215382, 0x821f8268, 0x23002157, 0xe220c182, 0xbd83c182, 0xbd82e220, 0xd500e422, - 0xd822b982, 0xbd82e1ff, 0xdc00e425, 0x8300e4ff, 0x82ec20bd, 0xfff12207, 0x24c182eb, 0xff3201eb, 0x20c182e2, 0x83c182e2, 0x02e224b9, 0x82e2ffdc, - 0x03e222b9, 0x20a58867, 0x22a582e2, 0x82c103e4, 0x82cf200f, 0x219d8d03, 0x4b8203e4, 0xffed0323, 0x209182eb, 0x209182e2, 0x219182e4, 0x3b8204e4, - 0xeb229182, 0x8d821700, 0x3d00eb28, 0xd100f3ff, 0x8982ebff, 0xeb206d83, 0xeb286d82, 0xf3ff6502, 0xebffda02, 0xeb206d82, 0xeb226d82, 0x0f82ee02, - 0xf3fff024, 0x03825703, 0x03826620, 0x03826920, 0xebff8d24, 0x0782a503, 0xf3ffbe22, 0xf320fb82, 0xf320fb82, 0xf320fb82, 0xeb216982, 0x271f8204, - 0x51003600, 0x5200efff, 0x54200382, 0x5c240382, 0xc000f0ff, 0xeb200782, 0xec240382, 0xed00eeff, 0xef200f82, 0xf0200b82, 0xf2200382, 0xf3200382, - 0xf4200382, 0xf5200382, 0xf7201b82, 0xf9200782, 0xfa200382, 0xfd200382, 0xff240382, 0x0401efff, 0x08280382, 0x1f01f4ff, 0x3301f1ff, 0x35200b82, - 0x44200382, 0x49200382, 0x58240382, 0x7602efff, 0xbe200382, 0xc0200382, 0xc2200382, 0xc3240382, 0x6c03efff, 0x91200382, 0x93200382, 0x96240382, - 0x9803f0ff, 0x9d200782, 0xad200382, 0xb3200382, 0xc2200382, 0xd0201382, 0xd4200382, 0xd6200b82, 0xe8200382, 0xea230382, 0x8204f0ff, 0x4b042553, - 0x4f04efff, 0x55200b82, 0x57200782, 0x62200782, 0x64200782, 0x66200382, 0x22208f82, 0x260a6f5c, 0xff5d00f5, 0x82bc00f5, 0xfff52403, 0x82fd00f4, - 0xff0824a1, 0x821901f5, 0x82332003, 0x82582003, 0x157f5c03, 0x8102f52a, 0xef02f5ff, 0x7203f5ff, 0x95200382, 0x9e200382, 0xa6200382, 0x7f5c0382, - 0x03f5220d, 0x201382bf, 0x200382e0, 0x240382e2, 0x04f5ffe4, 0x20038241, 0x20038243, 0x26738245, 0xff510032, 0x825200ee, 0x82542003, 0x82c02003, - 0x82eb2003, 0x00ec2403, 0x82ef0014, 0x82f02007, 0x82f22003, 0x82f32003, 0x82f42003, 0xfff52403, 0x82f700ed, 0x82f82007, 0x82f92007, 0x82fa2007, - 0xfffb2203, 0x26b582d0, 0xffff00ee, 0x820401ee, 0xff332403, 0x823501ed, 0x823d2007, 0x82442007, 0x82492007, 0xff582803, 0xff7602ed, 0x82be02ee, - 0x82c02003, 0x82c22003, 0xffc32403, 0x826c03ee, 0x82912003, 0x82932003, 0x82982003, 0x829d2003, 0x82ad2003, 0x82b32003, 0x82d42003, 0x82d62003, - 0xffe62703, 0xffe803ed, 0x478204ee, 0x824b0421, 0xff512407, 0x825304ed, 0x82552003, 0x8262200b, 0x82642003, 0x82662003, 0x000a2287, 0x24cf8206, - 0x01f5ff0b, 0x2003826c, 0x2003826d, 0x2003826f, 0x24038270, 0x03f5ff71, 0x200382a7, 0x200382a8, 0x212382ab, 0x33570059, 0xff53280f, 0xff5500c7, - 0x829300f0, 0x82982003, 0x82ba2003, 0x57c72003, 0xf6210617, 0x050b57ff, 0xc7ff1726, 0xebff1b01, 0x20180f57, 0x241b82bc, 0x01e9ffc0, 0x220782c8, - 0x57ebffca, 0x7724140b, 0x7802c7ff, 0x79200382, 0x7a200382, 0x7b200382, 0x07570382, 0x82c52037, 0x82c7203b, 0xffc92803, 0xff6a03c7, 0x827003f0, - 0x82762007, 0x82902003, 0x8292200b, 0x82942007, 0x82972007, 0x82b22003, 0x07d75603, 0x200bd356, 0x202382d8, 0x201b82da, 0x560782dc, 0x1b2423cf, - 0x1d04c7ff, 0x1f200382, 0x21200382, 0x23200382, 0x25200382, 0x27200382, 0xeb560382, 0x822f200b, 0xff312a0f, 0x00a100f0, 0x000d0006, 0x2003820b, - 0x240d8245, 0x00c0ff47, 0x20038248, 0x20038249, 0x2013824a, 0x2407824b, 0x00e2ff53, 0x55078255, 0xc0220993, 0x0f829800, 0x0382ba20, 0x3982bc20, - 0xd6ffc624, 0x0b82c700, 0x0382c820, 0xd5ffcb30, 0xc8ffec00, 0xd7fff100, 0xc0fff600, 0x03820201, 0xd7ff0330, 0xe2ff1701, 0x0b001901, 0xecff1b01, - 0x13821d01, 0x0c001f24, 0x07822101, 0x03823920, 0x01216382, 0x2007824c, 0x201f824e, 0x20038250, 0x240b8256, 0x010d006c, 0x2003826d, 0x2003826f, - 0x20038270, 0x55038271, 0x662423ab, 0x6702f0ff, 0x68200382, 0x69200382, 0x6a200382, 0x6b200382, 0x6c200382, 0x6d240382, 0x6e02c0ff, 0x6f200382, - 0x70200382, 0x71200382, 0x01610382, 0x07c75513, 0x33828320, 0x03828520, 0x03828720, 0x2b828920, 0x03828b20, 0x03828d20, 0x03828f20, 0x03829120, - 0x03829320, 0x03829520, 0x03829720, 0x03829920, 0x03829b20, 0x03829d20, 0x03829f20, 0x0382a120, 0x0382a320, 0x200a4d61, 0x05d35502, 0x7003c024, - 0xd355e2ff, 0x03e22a06, 0x03f0ff8f, 0x03c0ff90, 0x20138292, 0x55078294, 0xc02105d7, 0x09d75503, 0xa8030d26, 0xab030d00, 0xaf200382, 0xb2202b82, - 0xdb552382, 0x03c02205, 0x240b82bd, 0x030b00bf, 0x201782c5, 0x200382c7, 0x200f82cb, 0x200382cd, 0x200382ce, 0x204f82d8, 0x200782da, 0x550782dc, - 0xc0260de3, 0xd7ffed03, 0x2f82ef03, 0x0382f120, 0x0382f320, 0x0382f520, 0x0382f720, 0x0382f920, 0x0382fb20, 0x0382fd20, 0xf0ffff24, 0x03820104, - 0x03820320, 0x03820520, 0xc0ff0724, 0x03820904, 0x03820b20, 0x03820d20, 0x03820f20, 0x03821120, 0x03821320, 0x03821520, 0x201b1562, 0x201f8229, - 0x2003822b, 0x2403822d, 0x04e2ff2f, 0x56078231, 0x042e0a17, 0x00d7ff68, 0x00ec000f, 0x00f10014, 0x8d820010, 0xfff80024, 0x858200f0, 0x00000131, - 0x00030116, 0xff330110, 0xff3d01e6, 0x825801dc, 0x82e62099, 0x00ed2403, 0x82510410, 0x82532095, 0x82682003, 0x004c2633, 0x00eeff47, 0x20038248, - 0x20038249, 0x2003824b, 0x20038255, 0x20038293, 0x20038298, 0x200382ba, 0x200382c7, 0x220382c8, 0x821200ec, 0x820e2065, 0x00e32265, 0x260f82f6, - 0x00e3fff8, 0x82b8fffb, 0x01e3246d, 0x82eeff02, 0x010e226d, 0x2007821d, 0x24038221, 0x01baff33, 0x23078239, 0x01d9ff3d, 0x01215382, 0x200b824c, - 0x28038256, 0x02e3ff58, 0x02eeff6d, 0x2003826e, 0x2003826f, 0x20038270, 0x20038271, 0x20038289, 0x2003828b, 0x2003828d, 0x2003828f, 0x82038291, - 0x95022183, 0x97200782, 0x99200382, 0x9b200382, 0x9d200382, 0x9f200382, 0xa1200382, 0xa3240382, 0x6a03eeff, 0x90200382, 0x94200382, 0x97200382, - 0xb2200382, 0xb8200382, 0xbd200382, 0xcb200382, 0xcd200382, 0xce200382, 0xda200382, 0xe6240382, 0xeb03e3ff, 0xed280782, 0x07040e00, 0x0904eeff, - 0x0b200382, 0x0d200382, 0x0f200382, 0x11200382, 0x13200382, 0x15200382, 0x29200382, 0x2b200382, 0x2d200382, 0x31200382, 0x51240382, 0x5304e3ff, - 0x682a0382, 0x20000e00, 0xc0ff5a00, 0x03825d00, 0x0382bc20, 0x80fff53c, 0xeefff800, 0xf0fffd00, 0xdbff0801, 0xc0ff1901, 0xdcff1f01, 0x47ff3301, - 0xf1823d01, 0x07004e30, 0xf4ff5001, 0x7fff5801, 0xc0ff8002, 0x03828102, 0xc0ffef24, 0x03827203, 0x03829520, 0x03829e20, 0x0382a620, 0x0382b720, - 0x0382bf20, 0x0382e020, 0x0382e220, 0x0382e420, 0x7982e620, 0xc0ff4124, 0x03824304, 0x03824520, 0x0f825120, 0x6b825320, 0x9f572120, 0x82f02006, - 0x00f43085, 0x00f4ffbc, 0x00efffec, 0x00f0ffed, 0x82f3fff1, 0x01ee2489, 0x57f3ff03, 0x9f570fab, 0x03f0210a, 0x25119f57, 0xffd003f0, 0x9f5703f0, - 0x03f0250d, 0x04f3ffed, 0x260da357, 0xff5704f0, 0x826804f0, 0x000a2a67, 0x00d6ff06, 0x01d6ff0b, 0x2003826c, 0x2003826d, 0x2003826f, 0x24038270, - 0x03d6ff71, 0x200382a7, 0x200382a8, 0x242382ab, 0xff5c0015, 0x289f82e0, 0xfff500e0, 0xfff80076, 0x08a382c2, 0x0801d322, 0x1f01d9ff, 0x3301dbff, - 0x3d011eff, 0x4e01edff, 0x5001f0ff, 0x5801f2ff, 0x960356ff, 0xc203e0ff, 0xd0200382, 0xe6280382, 0xea03c2ff, 0x4f04e0ff, 0x51240382, 0x5304c2ff, - 0x57200382, 0x0d204f82, 0x64204d82, 0xd2204d82, 0xd9204d82, 0xe6244d9c, 0x5104d2ff, 0x53240382, 0x0900d2ff, 0x6a203582, 0xc6203182, 0x0020319b, - 0xd720db83, 0xd720db82, 0xd726db82, 0xd7ff6d01, 0x03826f01, 0x03827020, 0xd7ff7122, 0xd722db82, 0x0782a803, 0xd7ffab2a, 0x47005c00, 0x480098ff, - 0x49200382, 0x4b200382, 0x53240382, 0x550070ff, 0x57280782, 0x5b0018ff, 0x93000b00, 0x98200b82, 0xba200382, 0xc7200382, 0xc8200382, 0xf6240382, - 0x020198ff, 0x17240382, 0x1d0170ff, 0x21200782, 0x39200382, 0x3f820382, 0x824c0121, 0xff562407, 0x826d0298, 0x826e2003, 0x826f2003, 0x82702003, - 0x82712003, 0xff772403, 0x82780270, 0x82792003, 0x827a2003, 0x827b2003, 0x82892003, 0x828b2017, 0x828d2003, 0x828f2003, 0x82912003, 0x21738203, - 0x07829502, 0x03829720, 0x03829920, 0x03829b20, 0x03829d20, 0x03829f20, 0x0382a120, 0x0382a320, 0x3b82c520, 0x0382c720, 0x0382c920, 0x18ffd124, - 0x0382d302, 0x0382d520, 0x0382d720, 0x18ffd92c, 0x98ff6a03, 0x70ff7003, 0x03827603, 0x0b829020, 0x07829220, 0x07829420, 0x03829720, 0x1f829920, - 0x0782b220, 0x0382b820, 0x0382bd20, 0x0382cb20, 0x0382cd20, 0x0382ce20, 0x2782d820, 0x0782da20, 0x0782dc20, 0x98ffeb24, 0x03820704, 0x03820920, - 0x03820b20, 0x03820d20, 0x03820f20, 0x03821120, 0x03821320, 0x03821520, 0x70ff1b24, 0x03821d04, 0x03821f20, 0x03822120, 0x03822320, 0x03822520, - 0x03822720, 0x1f822920, 0x03822b20, 0x03822d20, 0x0f822f20, 0x98ff312a, 0xbc010900, 0xc001f2ff, 0xc8200382, 0xca200382, 0xcd340382, 0xce01c0ff, - 0xcf01ecff, 0xd001c7ff, 0xd201d8ff, 0x0200bfff, 0xee200d82, 0xf5200d82, 0xaf480982, 0x07002d06, 0xefffc801, 0xf0ffca01, 0xbbffcd01, 0xb7203186, - 0xd5202382, 0xb4223182, 0x15820400, 0x3582ee20, 0xd101f122, 0xd2224b82, 0x1184eaff, 0x1182e920, 0x2382eb20, 0x2382f120, 0x1184e520, 0x2384f220, - 0xf5ffd022, 0xee201182, 0xeb5c5d82, 0x0b002906, 0xccff5b00, 0x1300ba01, 0xf3209f82, 0xf1209f82, 0xf2206d82, 0xf2206d82, 0xbd235782, 0x83ffce01, - 0x82b8205b, 0x82d72049, 0x00b73437, 0x004a0004, 0x00580014, 0x005b0032, 0x006d0111, 0x82080010, 0x00e5283f, 0x00cbffb7, 0x82e4ffcc, 0x820d2047, - 0x82ed2047, 0x82eb2047, 0x82ec2047, 0x82ec2047, 0x0010266b, 0xff57010b, 0x082b82e6, 0x0e005830, 0xd7fe8100, 0x98ffc300, 0xc7ffc600, 0x12ffd800, - 0x52ffec00, 0xcfff4a01, 0x80ffba01, 0x0d000900, 0x41000f00, 0x56000c00, 0x6100ebff, 0x15820e00, 0x5182cb20, 0x5182e920, 0x5182e720, 0x5182e720, - 0x0100e722, 0x0b207d82, 0x14202b84, 0x11202b82, 0xe2202b82, 0x13202b82, 0xb4202b82, 0xd9202b82, 0xd9202b82, 0xd9202b82, 0xd9202b82, 0x0d20b182, - 0x412b7982, 0x6100f4ff, 0x4001efff, 0x5e00edff, 0xd6200bb5, 0x200cb55e, 0x288f8212, 0x00e500ae, 0xffea0012, 0x3e9782e0, 0xffee00ad, 0xfffc00d6, - 0xff0001df, 0xff0601d2, 0xff1b01e0, 0xff2b01ce, 0xff2d01dd, 0x823101e2, 0x8237200f, 0xff3d2203, 0x205782e9, 0x22c382da, 0x825401bd, 0x00573e2b, - 0x001d0011, 0x00afff23, 0x00efff58, 0x00dfff5b, 0x00eeff99, 0x00e5ffb7, 0x00d1ffb8, 0x2e1d82c3, 0x00c8ffc9, 0x001300d8, 0x00c5ffe5, 0x82cafff5, - 0x01d03083, 0x0181ff33, 0x0165ff3c, 0x0185ff3d, 0x8266ff3f, 0x01dd3451, 0x01f2ff45, 0x01b1ff4d, 0x01caff4f, 0x01a9ff57, 0x82c8ff58, 0x82f520db, - 0x01f52edb, 0x01c7ffcd, 0x01f1ffce, 0x01cdffcf, 0x249182d0, 0x00c4ffd2, 0x474d8208, 0x08200547, 0x1f221982, 0x5582f3ff, 0x4e01f122, 0x50200782, - 0x58260382, 0x0500f1ff, 0x8b824a00, 0xeaff5b22, 0xf0203782, 0xed263782, 0xf0ffd201, 0x37820200, 0x6d01f526, 0x0900c0ff, 0x2006d15f, 0x241182b8, - 0xff0801e2, 0x06954df0, 0x4582eb20, 0x7f82f520, 0x2582ec20, 0x0100903a, 0xebffba01, 0x4a000600, 0xc5000d00, 0xc6000b00, 0xc900eaff, 0xec000c00, - 0x1b209f82, 0x3a226582, 0x8d820400, 0xbfff5622, 0x2408fd82, 0xff6d00d1, 0xff7c006c, 0xff81006e, 0xff860043, 0xff8900ac, 0xffb700a1, 0xffbe00b8, - 0xffc2007e, 0xffc5007b, 0x2041829b, 0x22798279, 0x82cb00b2, 0xffcc3613, 0xffcd007d, 0xffd8007c, 0x00e500af, 0xffe9000f, 0xffea00e4, 0x245d82a0, - 0xffee0074, 0x22998280, 0x82fc00b2, 0xfffd3223, 0xfffe00b2, 0xff000180, 0x00010179, 0xff060128, 0x32b1827d, 0xff1b017f, 0xff1f0166, 0xff2b01da, - 0xff2d0181, 0x82310198, 0xff333a17, 0xff3701b3, 0xff3d01a0, 0xff3f017c, 0xff40019a, 0xff45016c, 0xff4a01e6, 0x34d9826b, 0xff500192, 0xff5401ad, - 0x0057017b, 0xff58010f, 0xff590191, 0x26e382f2, 0xffbc01af, 0x82c001b9, 0x82c82003, 0x82ca2003, 0xffcc2803, 0xffcd01bc, 0x82d001f1, 0xffd12403, - 0x820200ed, 0x82682095, 0x00ee2871, 0xffb70017, 0x82c100d4, 0x05e14113, 0xcb82e020, 0xcc00e724, 0xcb82e5ff, 0xd800ee24, 0xc7821200, 0xbb82e920, - 0x3301d724, 0x8782d7ff, 0x8782d320, 0x8782d620, 0x8782c520, 0x4d01e728, 0x4f010d00, 0x7b820c00, 0x7b84d620, 0x42ffbc21, 0xe9220bf1, 0x63820100, - 0x6d82f120, 0xd6fff52c, 0x88ff6d01, 0xe5000a00, 0x4d82c3ff, 0xfd00cf24, 0x5182d4ff, 0x3c01ce24, 0xdd51e7ff, 0x82a0200e, 0x00d13e4d, 0xff560030, - 0xff5b007e, 0xfe6d009d, 0xfe7c00f1, 0xfe8100f4, 0xff8600ab, 0xff89005e, 0x34b3824b, 0xffbe0072, 0xffc2000f, 0xffc5000a, 0xffc60041, 0xffc90007, - 0x20bb8268, 0x20bb820f, 0x28bb820e, 0xffd8000c, 0x00e50063, 0x2cbf8205, 0xffea00bd, 0xfeec0049, 0xffee00fe, 0x247d8213, 0xfffc0068, 0x0881820e, - 0xfe006826, 0x000113ff, 0x010107ff, 0x06013000, 0x08010eff, 0x1b0111ff, 0x1f01e7fe, 0x2b01acff, 0x2d0115ff, 0x31013cff, 0x34081782, 0x016aff33, - 0x0149ff37, 0x010cff3d, 0x013fff3f, 0x01f1fe40, 0x01c0ff45, 0x01effe4a, 0x0131ff4e, 0x015fff50, 0x010aff54, 0x01050057, 0x0130ff58, 0x00d5ff59, - 0x24bd8214, 0xffb700c1, 0x209982c5, 0x208582b4, 0x207982d7, 0x207582b9, 0x2c6582e9, 0xff1b01b2, 0xff1f01d2, 0xff3301c8, 0x205582a0, 0x204d82c5, - 0x204982e4, 0x204982cc, 0x204182cc, 0x284182cb, 0xffbc01ef, 0xffc001e8, 0x083f44e6, 0xd800082c, 0xec001500, 0x3c011500, 0x3582e4ff, 0x8b82e520, - 0x4d01e434, 0x4f01e3ff, 0x5701e2ff, 0x2200e4ff, 0xe2ff0a00, 0x7b820d00, 0xcfff0e30, 0x12004100, 0xeaff4a00, 0xd8ff5600, 0x07825800, 0x13006136, - 0xaeff6d00, 0xcdff7c00, 0xa0ff8100, 0xc1ff8600, 0xc0ff8900, 0xd022a382, 0x1f82bb00, 0xc6ffbe24, 0x3d82bf00, 0xe9ffc12e, 0xd6ffc200, 0xe8ffc500, - 0xbaffc600, 0xe934bf82, 0xcbffcb00, 0xdaffcc00, 0xc7ffcd00, 0xd3ff7501, 0xabffba01, 0xcd209f82, 0xcb209f82, 0xcb2a9f82, 0xcbffca01, 0xf3ffcd01, - 0x0382d001, 0xefffd132, 0x81000900, 0xb400dfff, 0xb600f3ff, 0xc300f0ff, 0xd8205d82, 0xe5220f82, 0xa782e0ff, 0x3d82e020, 0x01ed2508, 0x00f5ffd1, - 0x008a0702, 0x0a000004, 0x0036125e, 0x001d0021, 0xffdbff00, 0xffceff88, 0xffecffc5, 0x00a4ffa5, 0xfe2100aa, 0x8c2caae3, 0x88ff212a, 0xff230e85, - 0x82f4ffd0, 0x82eb2081, 0xffef3281, 0xffd9ffb3, 0xfff5ff6a, 0x000c00ce, 0x00c9ff11, 0x85bd8212, 0x21059a26, 0x3f82e5ff, 0x0382e820, 0x248dc920, - 0x8df3ff21, 0x200d910f, 0x21bdaaff, 0x3f8bebff, 0x00abff25, 0x82eaff00, 0x85d52003, 0xe1ff2115, 0x00270785, 0xff86ff00, 0x87e9ffea, 0x2407870d, - 0x0000edff, 0x820382ff, 0x8214200f, 0x23028403, 0xe6ffefff, 0x04990884, 0x1a8b1220, 0xff21ad87, 0x201586e4, 0x20098211, 0x82fd8311, 0x8211200f, - 0x83028a03, 0xae0e8a9b, 0x8397830a, 0x25d58957, 0xe9ff0000, 0x4687d8ff, 0x88a3ff21, 0x875c2009, 0xe0fe2309, 0x0b871300, 0xff000031, 0xff33ffc0, - 0xff32ffe8, 0xffe9fea3, 0x8985fff2, 0x25099319, 0xf5ff4eff, 0x3582f3ff, 0x2011b141, 0x2015820f, 0x2003826f, 0x253783a7, 0xcdff6cfe, 0x0d82dcff, - 0x0d834820, 0xff250383, 0xff58ff88, 0x260182a7, 0xffb4ff30, 0x821000e4, 0x00103613, 0xff10000f, 0xffaeffbf, 0x00cbffc4, 0xff7eff00, 0xfe00007c, - 0x281982fe, 0xfff0fe00, 0xfff0ff28, 0x290b83b3, 0xd2ffb5ff, 0x0000d4ff, 0x778dd2ff, 0xffe4ff23, 0x871f83f5, 0x29ff2103, 0xff210983, 0x85058363, - 0xd5ff2703, 0xe1ffdfff, 0x1d410000, 0x850e2006, 0x08df4115, 0x00220e87, 0x0a8371ff, 0x83c4ff21, 0x25038905, 0x0000e6ff, 0x0382ebff, 0x1384e720, - 0xff213d84, 0x204b84eb, 0x22118211, 0x82d1ff11, 0x21028405, 0x068464ff, 0xff230484, 0x82c1ff6a, 0x82d820d3, 0xffc63203, 0xff1100e3, 0x001200a0, - 0xff120011, 0xffecffd9, 0x842284e2, 0x19ff2904, 0x00000d00, 0xa0ff68ff, 0x8542e782, 0x200f8305, 0x831382eb, 0x0a6f4203, 0x42edff21, 0x37840639, - 0xff210491, 0x871391ef, 0xf1ff2111, 0x07930987, 0x211b5543, 0x3b85f5ff, 0x8ff2ff21, 0x41178339, 0x218f0d79, 0x4f910f9b, 0x07442d89, 0xb0ff211d, - 0x09ad2989, 0x99a8ff21, 0xf1ff232f, 0x1d83f0ff, 0x09830585, 0xff210387, 0x260982eb, 0xff000010, 0x82edffe2, 0x82dc2005, 0x43028d0d, 0x53200df3, - 0x00211c8d, 0x2033820f, 0x41d183f1, 0xff211983, 0x213383d7, 0x058359ff, 0xff23038f, 0x430000ec, 0x1d8f09c7, 0xc9830f9b, 0x319bcd91, 0xff251b83, - 0xff5fff33, 0x26018255, 0xff6bff66, 0x820700bd, 0x00073713, 0xff070005, 0xff61ff7e, 0x0092ff86, 0xff0fff00, 0xfe00000c, 0x00820036, 0x821efe21, - 0xffd1220f, 0x2005826a, 0x8a0e82c0, 0x9fff2102, 0xc8201382, 0xad200382, 0xff211487, 0x200983e7, 0x0d9545ff, 0x1384c920, 0xafffa526, 0xaeffbdff, - 0xd2230382, 0x4100e9ff, 0x0786074f, 0x00caff25, 0x82bbff00, 0xfe002217, 0x202d8477, 0x89058339, 0xecff2403, 0x82ff0000, 0x8b118903, 0x153b4109, - 0x8b79ff21, 0x210b8d23, 0x0f87b5ff, 0x820f1743, 0x000224bb, 0x82060078, 0x00002201, 0x2201820b, 0x82100001, 0x82022001, 0x001232b1, 0x00250003, - 0x00040029, 0x0034002c, 0x00380009, 0x2615823e, 0x00470045, 0x82490019, 0x001c2201, 0x2801824c, 0x0051001d, 0x001e0054, 0x22018256, 0x825a0022, - 0x00232801, 0x005e005c, 0x828a0024, 0x00272801, 0x00b300b0, 0x82bc0028, 0x002c2201, 0x220182c0, 0x82c6002d, 0x002e2801, 0x00d400d3, 0x82d6002f, - 0x00312201, 0x280182d9, 0x00db0032, 0x003300dd, 0x220182df, 0x82e10036, 0x00372201, 0x220182e3, 0x82e50038, 0x00392201, 0x220182eb, 0x82ed003a, - 0x003b2201, 0x220182f6, 0x82fb003c, 0x3d1c0a01, 0xfe00fd00, 0x03013e00, 0x40000401, 0x09010901, 0x0c014200, 0x43000c01, 0x19011701, 0x2b014400, - 0x47002d01, 0x30013001, 0x32014a00, 0x4b003201, 0x49014901, 0x6c014c00, 0x4d007201, 0x77017601, 0x28025400, 0x56002802, 0x2b022a02, 0x46025700, - 0x59004702, 0x49024902, 0x4b025b00, 0x5c007102, 0x7b027602, 0x80028300, 0x89009002, 0x9b029202, 0xa4029a00, 0xa400a602, 0xa802a802, 0xaa02a700, - 0xa800aa02, 0xac02ac02, 0xae02a900, 0xaa00ae02, 0xb102b102, 0xb302ab00, 0xac00b302, 0xb502b502, 0xb702ad00, 0xae00b702, 0xb902b902, 0xbb02af00, - 0xb000bb02, 0xc902bd02, 0xcb02b100, 0xbe00cb02, 0xcd02cd02, 0xcf02bf00, 0xc000cf02, 0xda02da02, 0xdc02c100, 0xc200dc02, 0xde02de02, 0xe002c300, - 0xc400e002, 0xe202e202, 0xe402c500, 0xc600e402, 0xe602e602, 0xe802c700, 0xc800e802, 0xea02ea02, 0xec02c900, 0xca00ec02, 0xf602ee02, 0x5203cb00, - 0xd4005703, 0x69035a03, 0x6c03da00, 0xea006c03, 0x70037003, 0x7203eb00, 0xec007203, 0x76037603, 0x7903ed00, 0xee007a03, 0x85037c03, 0x8703f000, - 0xfa008903, 0x90038b03, 0x9203fd00, 0x03019803, 0x9f039e03, 0xa1030a01, 0x0c01a103, 0xa303a303, 0xa5030d01, 0x0e01a803, 0xb003ab03, 0xb2031201, - 0x1801b203, 0xb703b603, 0xbc031901, 0x1b01c703, 0xcb03ca03, 0xcd032701, 0x2901d003, 0xd803d703, 0xdc032d01, 0x2f01dc03, 0xe403de03, 0xe9033001, - 0x3701ea03, 0x1604ee03, 0x18043901, 0x62011804, 0x27041a04, 0x2f046301, 0x71012f04, 0x32043204, 0x34047201, 0x73013404, 0x45044004, 0x48047401, - 0x7a014804, 0x4a044a04, 0x4c047b01, 0x7c014c04, 0x4f044e04, 0x54047d01, 0x7f015704, 0x5a045a04, 0x5c048301, 0x84015d04, 0x5f045f04, 0x63048601, - 0x87016304, 0x65046504, 0x69048801, 0x89016904, 0xa904a904, 0x02008a01, 0x10004e01, 0x01220182, 0x01821200, 0x25000122, 0x02220182, 0x01822600, - 0x27000322, 0x04220182, 0x01822800, 0x29000522, 0x06280182, 0x2d002c00, 0x2e000700, 0x08220182, 0x01822f00, 0x30000922, 0x0a240182, 0x32003100, - 0x33261782, 0x05003300, 0x01823400, 0x38000b22, 0x0c220182, 0x01823900, 0x3a000822, 0x0d220182, 0x01823b00, 0x3c000e22, 0x0f220182, 0x01823d00, - 0x3e001022, 0x11220182, 0x01824500, 0x46001222, 0x13220182, 0x01824700, 0x49001422, 0x15220182, 0x01824c00, 0x51001628, 0x16005200, 0x01825300, - 0x54001722, 0x13220182, 0x01825600, 0x5a001822, 0x19220182, 0x01825c00, 0x5d001a22, 0x19220182, 0x01825e00, 0x8a001b22, 0x13220182, 0x0182b000, - 0xb1001c22, 0x02220182, 0x0182b200, 0xb3000522, 0x02220182, 0x0182bc00, 0xc0001922, 0x16220182, 0x0182c600, 0xd3001328, 0x1d00d400, 0x0182d600, - 0xd9000722, 0x0f240182, 0xdc00db00, 0xdd26cb82, 0x1e00dd00, 0x0182df00, 0xe1000722, 0x07220182, 0x0182e300, 0xe5001d22, 0x1d220182, 0x0182eb00, - 0xed001f22, 0x1a220182, 0x0182f600, 0xfb001322, 0x20220182, 0x0182fd00, 0xfe002022, 0x132a0182, 0x04010301, 0x09012000, 0x05820901, 0x010c3208, - 0x0102000c, 0x00170117, 0x01180117, 0x010d0018, 0x00190119, 0x012b0119, 0x0113002b, 0x002c012c, 0x012d011c, 0x011f002d, 0x00300130, 0x01320109, - 0x22058232, 0x82490149, 0x016e2811, 0x0101006e, 0x82720172, 0x01763405, 0x02010077, 0x00280228, 0x022a0204, 0x0205002b, 0x82470246, 0x02492e05, - 0x020c0049, 0x0051024b, 0x02520202, 0x2e1d8252, 0x00560253, 0x02570206, 0x0207005b, 0x8260025c, 0x61320823, 0x08006402, 0x65026502, 0x66021000, - 0x12006c02, 0x6d026d02, 0x6e021400, 0x15007102, 0x76027602, 0x77021600, 0x17007b02, 0x81028002, 0x82021900, 0x4d828202, 0x83028322, 0x84222982, - 0x0b828402, 0x85028522, 0x86220b82, 0x0b828602, 0x87028722, 0x88220b82, 0x6b828802, 0x89028922, 0x8a224782, 0x0b828a02, 0x8b028b22, 0x8c220b82, - 0x0b828c02, 0x8d028d22, 0x8e220b82, 0x0b828e02, 0x8f028f22, 0x90220b82, 0x89829002, 0x92029222, 0x93229b82, 0x77829302, 0x94029422, 0x95220b82, - 0x0b829502, 0x96029622, 0x97220b82, 0x0b829702, 0x98029822, 0x99220b82, 0x0b829902, 0x9a029a22, 0x9b220b82, 0x0b829b02, 0xa402a422, 0xa522d182, - 0xad82a502, 0xa602a622, 0xa8220b82, 0x0582a802, 0xaa02aa22, 0xac220582, 0x0582ac02, 0xae02ae22, 0xb1220582, 0xef82b102, 0xb302b32e, 0xb5020900, - 0x0a00b502, 0xb702b702, 0xb9220582, 0x0582b902, 0xbb02bb22, 0xbd220582, 0x2982bd02, 0xbe02be22, 0xbf224d82, 0x0b82bf02, 0xc002c022, 0xc1220b82, - 0x0b82c102, 0xc302c222, 0xc4220b82, 0xb382c402, 0xc502c528, 0xc6021700, 0x0b82c602, 0xc702c722, 0xc8220b82, 0x0b82c802, 0xc902c922, 0xcb280b82, - 0x1800cb02, 0xcd02cd02, 0xcf220582, 0x0582cf02, 0xda02da28, 0xdc020c00, 0x0582dc02, 0xde02de22, 0xe0220582, 0x8f82e002, 0xe202e222, 0xe4220582, - 0x0582e402, 0xe602e622, 0xe8220582, 0x0582e802, 0xea02ea22, 0xec340582, 0x0e00ec02, 0xee02ee02, 0xef021000, 0x1900ef02, 0xf002f002, 0xf12e0b82, - 0x1100f102, 0xf202f202, 0xf3021b00, 0x0b82f302, 0xf402f422, 0xf5220b82, 0x0b82f502, 0x02f62608, 0x031b00f6, 0x00520352, 0x03530302, 0x03060053, - 0x00550354, 0x03560307, 0x03050056, 0x00570357, 0x035a0310, 0x281d825a, 0x005b035b, 0x035c0303, 0x2823825c, 0x005d035d, 0x035e0311, 0x2829825f, - 0x00600360, 0x03610309, 0x220b8262, 0x82630363, 0x03642e35, 0x030b0064, 0x00650365, 0x0366030c, 0x28418266, 0x00670367, 0x0368030f, 0x22238268, - 0x82690369, 0x036c3411, 0x0316006c, 0x00700370, 0x03720317, 0x03190072, 0x82760376, 0x0379220b, 0x285f8279, 0x007a037a, 0x037c031c, 0x282f827d, - 0x007e037e, 0x037f0308, 0x28658280, 0x00810381, 0x0382031e, 0x288f8282, 0x00830383, 0x03840303, 0x22298284, 0x82850385, 0x03872235, 0x222f8288, - 0x82890389, 0x038b2283, 0x2883828b, 0x008c038c, 0x038d0304, 0x2289828d, 0x828e038e, 0x038f2e83, 0x0312008f, 0x00900390, 0x03920315, 0x2e718292, - 0x00930393, 0x03940313, 0x03140094, 0x82950395, 0x03962889, 0x031a0096, 0x82970397, 0x03982823, 0x031f0098, 0x829e039e, 0x039f2817, 0x030e009f, - 0x82a103a1, 0x03a32205, 0x220582a3, 0x82a503a5, 0x03a622cb, 0x221d82a6, 0x82ac03ac, 0x03ad227d, 0x22d782ad, 0x82ae03ae, 0x03af22a1, 0x226b82af, - 0x82b003b0, 0x03b2229b, 0x284d82b2, 0x00b603b6, 0x03b7030d, 0x222f82b7, 0x82bc03bc, 0x03bd229b, 0x227782bd, 0x82be03be, 0x03bf2247, 0x221782bf, - 0x82c003c0, 0x03c12247, 0x22ad82c1, 0x82c203c2, 0x03c32289, 0x221182c3, 0x82c403c4, 0x03c52253, 0x225382c5, 0x82c603c6, 0x03c7220b, 0x220b82c7, - 0x82ca03ca, 0x03cb225f, 0x225f82cb, 0x82ce03cd, 0x03cf2205, 0x223b82cf, 0x82d003d0, 0x03d7283b, 0x030500d7, 0x82d803d8, 0x03dc22e9, 0x220582dc, - 0x82de03de, 0x03df28ef, 0x031e00df, 0x82e003e0, 0x03e12271, 0x220b82e1, 0x82e203e2, 0x03e3220b, 0x220b82e3, 0x82e403e4, 0x03e9220b, 0x224782e9, - 0x82ea03ea, 0x03ee2247, 0x227182ee, 0x82ef03ef, 0x03f02271, 0x220b82f0, 0x82f103f1, 0x03f2220b, 0x220b82f2, 0x82f303f3, 0x03f4220b, 0x220b82f4, - 0x82f503f5, 0x03f6220b, 0x220b82f6, 0x82f703f7, 0x03f8220b, 0x220b82f8, 0x82f903f9, 0x03fa220b, 0x220b82fa, 0x82fb03fb, 0x03fc220b, 0x220b82fc, - 0x82fd03fd, 0x03fe220b, 0x2e0b82fe, 0x00ff03ff, 0x04000412, 0x04020000, 0x82010401, 0x0402220b, 0x220b8202, 0x82030403, 0x0404220b, 0x220b8204, - 0x82050405, 0x04062e0b, 0x04060006, 0x00070407, 0x04080415, 0x220b8208, 0x82090409, 0x040a220b, 0x220b820a, 0x820b040b, 0x040c220b, 0x220b820c, - 0x820d040d, 0x040e220b, 0x220b820e, 0x820f040f, 0x0410220b, 0x220b8210, 0x82110411, 0x0412220b, 0x220b8212, 0x82130413, 0x0414220b, 0x220b8214, - 0x82150415, 0x0416280b, 0x04070016, 0x82180418, 0x041a2e05, 0x0405001a, 0x001b041b, 0x041c0417, 0x220b821c, 0x821d041d, 0x041e220b, 0x220b821e, - 0x821f041f, 0x0420220b, 0x220b8220, 0x82210421, 0x0422220b, 0x220b8222, 0x82230423, 0x0424220b, 0x220b8224, 0x82250425, 0x0426220b, 0x220b8226, - 0x82270427, 0x042f220b, 0x2805822f, 0x00320432, 0x04340408, 0x2e058234, 0x00400440, 0x04410410, 0x04190041, 0x82420442, 0x0443220b, 0x220b8243, - 0x82440444, 0x0445220b, 0x280b8245, 0x00480448, 0x044a0409, 0x0895824a, 0x4c044c20, 0x4e040c00, 0x0f004e04, 0x4f044f04, 0x54041a00, 0x1c005404, - 0x55045504, 0x56041f00, 0x17825604, 0x57045722, 0x5a2e1782, 0x16005a04, 0x5c045c04, 0x5d041d00, 0x23825d04, 0x5f045f22, 0x63224782, 0x47826304, - 0x65046522, 0x69220582, 0x65826904, 0xa904a92a, 0x02000500, 0x06006d01, 0x01200182, 0x220aab4a, 0x82110016, 0x00192201, 0x21018212, 0xe9470016, - 0x00272605, 0x00080027, 0x2201822b, 0x822e0008, 0x001a2201, 0x22018233, 0x82350008, 0x00082201, 0x22018237, 0x8238001b, 0x00092201, 0x22018239, - 0x823a000a, 0x000b2201, 0x2201823b, 0x823c000c, 0x00172201, 0x2201823d, 0x823e000d, 0x00182201, 0x28018245, 0x00470003, 0x00040049, 0x2401824b, - 0x00510004, 0x228d8252, 0x82530053, 0x0054228b, 0x220b8254, 0x82550055, 0x0057261d, 0x00070057, 0x22018259, 0x825a000e, 0x000f2201, 0x2201825c, - 0x825d001c, 0x000f2201, 0x2201825e, 0x82830010, 0x00082201, 0x22018292, 0x82930008, 0x00042201, 0x22018297, 0x82980008, 0x00042201, 0x2101829a, - 0xe347000e, 0x47082009, 0xba2206e3, 0x5f82ba00, 0xbc00bc26, 0xc0000f00, 0x05240182, 0xc800c700, 0xca261182, 0x0e00ca00, 0x0182d100, 0xd2000922, - 0x08220182, 0x0182d300, 0xd5001122, 0x09220182, 0x0182d900, 0xdc001722, 0x11220182, 0x0182dd00, 0xe0001522, 0x12220182, 0x0182eb00, 0xed000522, - 0x1c240182, 0xf000ef00, 0xf128bf82, 0x1300f100, 0xf400f200, 0xf6220b82, 0x5982f600, 0xf700f722, 0xf8280b82, 0x1400f800, 0xfa00f900, 0xfd220b82, - 0x0582fd00, 0xff00ff34, 0x02010500, 0x04000201, 0x03010301, 0x04011300, 0x11820401, 0x0701072e, 0x0c010800, 0x02000c01, 0x16011601, 0x17340b82, - 0x06001701, 0x18011801, 0x19010b00, 0x0f001901, 0x1a011a01, 0x1c221782, 0x05821c01, 0x1d011d22, 0x1e224182, 0x0b821e01, 0x20012022, 0x21220582, - 0x11822101, 0x22052548, 0x82350135, 0x01382253, 0x22178238, 0x82390139, 0x013a2817, 0x0109003a, 0x82440144, 0x01492217, 0x22058249, 0x824c014b, - 0x01512817, 0x01110051, 0x82550155, 0x01562229, 0x34118256, 0x006a0169, 0x016c0119, 0x0101006d, 0x006e016e, 0x016f0116, 0x220b8271, 0x82720172, - 0x01762e0b, 0x02160077, 0x00290228, 0x022b0208, 0x2405822c, 0x00450245, 0x0a674819, 0x5c020824, 0x17826002, 0x02612e08, 0x020a0064, 0x00650265, - 0x0266020d, 0x0203006c, 0x0071026d, 0x02760204, 0x02050076, 0x007b0277, 0x027c0206, 0x020e007f, 0x00810280, 0x0a5b480f, 0x48020321, 0x0321095b, - 0x095b4802, 0x88020324, 0x59828802, 0x89028922, 0x8a224782, 0x0b828a02, 0x8b028b22, 0x8c220b82, 0x0b828c02, 0x8d028d22, 0x8e220b82, 0x0b828e02, - 0x8f028f22, 0x91220b82, 0x05829102, 0x93029322, 0x95220582, 0x05829502, 0x97029722, 0x99220582, 0x05829902, 0x9b029b22, 0x9c220582, 0x2f829c02, - 0x9d029d22, 0x9e220b82, 0x0b829e02, 0x9f029f22, 0xa0220b82, 0x0b82a002, 0xa102a122, 0xa2220b82, 0x0b82a202, 0xa302a322, 0xb1280b82, 0x1a00b102, - 0xbe02be02, 0xc022c582, 0x0582c002, 0xc302c222, 0xc4220582, 0x2382c402, 0xc502c522, 0xc622d782, 0x0b82c602, 0xc702c722, 0xc8220b82, 0x0b82c802, - 0xc902c922, 0xd02e0b82, 0x1b00d002, 0xd102d102, 0xd2020700, 0x0b82d202, 0xd302d322, 0xd4220b82, 0x0b82d402, 0xd502d522, 0xd6220b82, 0x0b82d602, - 0xd702d722, 0xd8220b82, 0x0b82d802, 0xd902d922, 0xda280b82, 0x0900da02, 0xdc02dc02, 0xde220582, 0x0582de02, 0xe002e02e, 0xe1020a00, 0x0e00e102, - 0xe202e202, 0xe3220b82, 0x0b82e302, 0xe402e422, 0xe5220b82, 0x0b82e502, 0xe602e622, 0xe7220b82, 0x0b82e702, 0xe802e822, 0xe9220b82, 0x0b82e902, - 0xea02ea22, 0xeb220b82, 0x0b82eb02, 0xec02ec34, 0xee020c00, 0x0d00ee02, 0xef02ef02, 0xf0020f00, 0x0b82f002, 0xf102f12e, 0xf2021800, 0x1000f202, - 0xf302f302, 0xf4220b82, 0x0b82f402, 0xf502f522, 0xf6220b82, 0x0b82f602, 0xf902f924, 0x67480800, 0x03562206, 0x240b8256, 0x00570357, 0x065b480d, - 0x5d035d28, 0x63031800, 0x17826303, 0x66036622, 0x67281782, 0x17006703, 0x69036903, 0x20080b82, 0x006a036a, 0x036c0304, 0x0305006c, 0x006e036e, - 0x0370030e, 0x03060070, 0x00720372, 0x0375030f, 0x22118275, 0x82760376, 0x03772211, 0x2a0b8277, 0x007e037e, 0x0381031a, 0x48150081, 0x8922062b, - 0x59828903, 0x8c038c22, 0x8d280582, 0x09008d03, 0x8e038e03, 0x8f285f82, 0x03008f03, 0x90039003, 0x91225f82, 0x5f829103, 0x92039222, 0x93224782, - 0x0b829303, 0x94039422, 0x95221782, 0x65829503, 0x96039628, 0x97031c00, 0x11829703, 0x98039822, 0x99281d82, 0x07009903, 0x9d039d03, 0x9e220b82, - 0x23829e03, 0x9f039f28, 0xa1030c00, 0x0582a103, 0xa303a322, 0xa5220582, 0xbf82a503, 0xa603a622, 0xa7281d82, 0x0100a803, 0xab03ab03, 0xad220582, - 0x3582ad03, 0x24092548, 0x03b20303, 0x225982b2, 0x82b303b3, 0x03b62817, 0x030b00b6, 0x82b703b7, 0x03b82235, 0x221782b8, 0x82b903b9, 0x03bc22b9, - 0x220582bc, 0x82bd03bd, 0x03be2211, 0x225982be, 0x82bf03bf, 0x03c12223, 0x22cb82c1, 0x82c203c2, 0x092548a1, 0x48030321, 0x03240925, 0xcb03cb03, - 0xcd223582, 0x0582ce03, 0xcf03cf22, 0xd0222f82, 0x2f82d003, 0xd403d422, 0xd6227182, 0x0582d603, 0xd703d722, 0xd8285f82, 0x0600d803, 0xd903d903, - 0xda220b82, 0x2f82da03, 0xdb03db22, 0xdc220b82, 0x1782dc03, 0xdf03df28, 0xe0031500, 0x7782e003, 0xe103e122, 0xe2220b82, 0x0b82e203, 0xe303e322, - 0xe4220b82, 0x0b82e403, 0xe503e52e, 0xe6031200, 0x1400e603, 0xe803e803, 0xe9225982, 0x7182e903, 0xea03ea22, 0xeb227182, 0x5382eb03, 0xec03ec2b, - 0xed031100, 0x1300ed03, 0x095b4803, 0x48030321, 0x0321095b, 0x095b4803, 0x48030321, 0x0321095b, 0x095b4803, 0x48030321, 0x0321095b, 0x095b4803, - 0x48030321, 0x0321095b, 0x095b4803, 0x5b480320, 0x0403210a, 0x21095b48, 0x5b480403, 0x04032a09, 0x00070407, 0x04090404, 0x22058209, 0x820b040b, - 0x040d2205, 0x2205820d, 0x820f040f, 0x04112205, 0x22058211, 0x82130413, 0x04152205, 0x2e058215, 0x001a041a, 0x041b0408, 0x0406001b, 0x821c041c, - 0x041d220b, 0x220b821d, 0x821e041e, 0x041f220b, 0x220b821f, 0x82200420, 0x0421220b, 0x220b8221, 0x82220422, 0x0423220b, 0x220b8223, 0x82240424, - 0x0425220b, 0x220b8225, 0x82260426, 0x0427220b, 0x220b8227, 0x82280428, 0x0429220b, 0x225f8229, 0x822a042a, 0x042b220b, 0x220b822b, 0x822c042c, - 0x042d220b, 0x220b822d, 0x822e042e, 0x042f220b, 0x222f822f, 0x82300430, 0x0431220b, 0x2e178231, 0x00320432, 0x0433040a, 0x040e0033, 0x82340434, - 0x0435220b, 0x220b8235, 0x82370437, 0x04392205, 0x22058239, 0x823b043b, 0x043d2205, 0x2205823d, 0x823f043f, 0x04402e05, 0x040d0040, 0x00410441, - 0x0442040f, 0x220b8242, 0x82430443, 0x0444220b, 0x220b8244, 0x82450445, 0x0449280b, 0x04050049, 0x824b044b, 0x4c200805, 0x09004c04, 0x4e044e04, - 0x4f041700, 0x1c004f04, 0x50045004, 0x51041200, 0x14005104, 0x52045204, 0x53220b82, 0x0b825304, 0x55045522, 0x56222f82, 0x29825604, 0x57045722, - 0x62222982, 0x11826204, 0x64046422, 0x66220582, 0x05826604, 0x6704672e, 0x68041100, 0x13006804, 0x69046904, 0x6f347182, 0x19006f04, 0xa904a904, - 0x01000800, 0x0a000000, 0x10080602, 0x0c0b5918, 0x7267482e, 0x76006b65, 0x6e74616c, 0x0400a400, 0x00242382, 0x1200ffff, 0x20080782, 0x0014000a, - 0x0028001e, 0x00410034, 0x0055004b, 0x0069005f, 0x007d0073, 0x00910087, 0x00a5009b, 0x082d8aaf, 0x0b000122, 0x1f001500, 0x35002900, 0x4c004200, - 0x60005600, 0x74006a00, 0x88007e00, 0x9c009200, 0xb000a600, 0x22082d8a, 0x000c0002, 0x00200016, 0x0036002a, 0x004d0043, 0x00610057, 0x0075006b, - 0x0089007f, 0x009d0093, 0x82b100a7, 0x06250877, 0x20455a41, 0x52435400, 0x7e002054, 0x204c4f4d, 0x414ea800, 0xd4002056, 0x204d4f52, 0x55540001, - 0x2c012052, 0x08ad8300, 0x03001326, 0x17000d00, 0x2b002100, 0x37003200, 0x4e004400, 0x62005800, 0x76006c00, 0x8a008000, 0x9e009400, 0xb200a800, - 0x12202b84, 0x20088782, 0x0018000e, 0x002c0022, 0x00450038, 0x0059004f, 0x006d0063, 0x00810077, 0x0095008b, 0x00a9009f, 0x082986b3, 0x0f000522, - 0x23001900, 0x39002d00, 0x50004600, 0x64005a00, 0x78006e00, 0x8c008200, 0xa0009600, 0xb400aa00, 0x26082984, 0x00060013, 0x001a0010, 0x002e0024, - 0x003e003a, 0x00510047, 0x0065005b, 0x0079006f, 0x008d0083, 0x00a10097, 0x86b500ab, 0x0724082b, 0x1b001100, 0x2f002500, 0x3f003b00, 0x52004800, - 0x66005c00, 0x7a007000, 0x8e008400, 0xa2009800, 0xb600ac00, 0x24082b86, 0x00120008, 0x0026001c, 0x003c0030, 0x00490040, 0x005d0053, 0x00710067, - 0x0085007b, 0x0099008f, 0x00ad00a3, 0x082b86b7, 0x1300092c, 0x27001d00, 0x33003100, 0x4a003d00, 0x5e005400, 0x72006800, 0x86007c00, 0x9a009000, - 0xae00a400, 0xb900b800, 0x63733263, 0x05845804, 0x05845e20, 0x05846420, 0x05a46a20, 0x706d6325, 0xb4637004, 0x6c642505, 0x78046769, 0x7e200584, - 0x84200584, 0x8a200584, 0x6e2505a4, 0x90046d6f, 0x20058364, 0x20058496, 0x2005849c, 0x2505a3a2, 0x63617266, 0x05b5a804, 0x6122b282, 0x0584b204, - 0x6e6cba26, 0xc0046d75, 0xc6200584, 0xcc200584, 0xd2200584, 0x6f2505a4, 0xd8046c63, 0x2005836c, 0x200584de, 0x224c82e4, 0x84ea0472, 0x84f02005, - 0x84f62005, 0xa3fc2005, 0x826f2005, 0x02052124, 0x08200584, 0x0e200584, 0x14200584, 0x702005a3, 0x1a203b83, 0x20200584, 0x26200584, 0x2c200584, - 0x732505a3, 0x0570636d, 0x20058432, 0x20058438, 0x2005843e, 0x2505a444, 0x05313073, 0x0583734a, 0x05845020, 0x05845620, 0x05a65c20, 0x62053222, - 0x32222982, 0x05846805, 0x05846e20, 0x05a67420, 0x7a053322, 0x33222982, 0x05848005, 0x05848620, 0x05a68c20, 0x92053422, 0x34222982, 0x05849805, - 0x05849e20, 0x05a6a420, 0xaa053522, 0x35222982, 0x0584b005, 0x0584b620, 0x05a6bc20, 0xc2053622, 0x36222982, 0x0584c805, 0x0584ce20, 0x05a6d420, - 0xda053722, 0x37222982, 0x0584e005, 0x0584e620, 0x05a3ec20, 0x756e7425, 0x84f2056d, 0x84f82005, 0x83fe2005, 0x04062105, 0x002205a3, 0x5e180000, - 0x022417db, 0x09000800, 0x0e201f84, 0x10200584, 0x0f200584, 0x0d200584, 0x43200584, 0x45200584, 0x44200584, 0x42200584, 0x03260582, 0x40003f00, - 0x09824100, 0x11000224, 0x17841200, 0x3c200585, 0x3e200b84, 0x3d200584, 0x3b200584, 0x0a200584, 0x0c200584, 0x0b200584, 0x47200584, 0x49200584, - 0x48200584, 0x46200584, 0x30200584, 0x32200584, 0x31200584, 0x2f200584, 0x38200584, 0x3a200584, 0x39200584, 0x37200584, 0x05200584, 0x07200584, - 0x06200584, 0x04200584, 0x14200584, 0x16200584, 0x15200584, 0x13200584, 0x18200584, 0x1a200584, 0x19200584, 0x17200584, 0x1c200584, 0x1e200584, - 0x1d200584, 0x1b200584, 0x20200584, 0x22200584, 0x21200584, 0x1f200584, 0x24200584, 0x26200584, 0x25200584, 0x23200584, 0x28200584, 0x2a200584, - 0x29200584, 0x27200584, 0x2c200584, 0x2e200584, 0x2d200584, 0x2b200584, 0x34200584, 0x36200584, 0x35200584, 0x33240584, 0x98004b00, 0x04210185, - 0x25018526, 0xc0071407, 0x0182500e, 0x880e6622, 0xbe240186, 0x120fe40e, 0x26210186, 0x2101850f, 0x01850f3a, 0x850f4e21, 0x0f602101, 0x7a210185, - 0x2101850f, 0x01850fbc, 0x850fda21, 0x0ff82101, 0x10210184, 0x2101862a, 0x0185105c, 0xa2108e26, 0xcc10da10, 0xda200186, 0x03820b82, 0x00061123, - 0x089f8401, 0x0200086f, 0xdf00c401, 0xba01e701, 0xbc01bb01, 0xbe01bd01, 0xc001bf01, 0xc201c101, 0xc401c301, 0xc601c501, 0xc801c701, 0xca01c901, - 0xcc01cb01, 0xce01cd01, 0xd001cf01, 0xd201d101, 0xe801d301, 0x4302e901, 0xea013b02, 0xec01eb01, 0xee01ed01, 0xf001ef01, 0xf201f101, 0xf401f301, - 0xf601f501, 0xf801f701, 0xfa01f901, 0xfc01fb01, 0xfe01fd01, 0x096e8202, 0x02dc0455, 0x02030202, 0x02050204, 0x02070206, 0x02090208, 0x020b020a, - 0x020f022f, 0x02110210, 0x02150214, 0x02170216, 0x02190218, 0x021c021b, 0x021d021e, 0x02fc02fb, 0x02fe02fd, 0x030003ff, 0x03020301, 0x03040303, - 0x03060305, 0x03080307, 0x030a0309, 0x030c030b, 0x030e030d, 0x0310030f, 0x03120311, 0x03140313, 0x03160315, 0x03180317, 0x031a0319, 0x031c031b, - 0x031e031d, 0x0320031f, 0x03220321, 0x03240323, 0x03260325, 0x03280327, 0x032a0329, 0x032c032b, 0x032e032d, 0x0330032f, 0x03320331, 0x03340333, - 0x03360335, 0x03380337, 0x033a0339, 0x033c033b, 0x033e033d, 0x0340033f, 0x03420341, 0x03450343, 0x03460344, 0x03480347, 0x034a0349, 0x034c034b, - 0x034e034d, 0x0350034f, 0x04aa0451, 0x04ac04ab, 0x04ae04ad, 0x04b004af, 0x04b204b1, 0x04b404b3, 0x04b604b5, 0x04b804b7, 0x04ba04b9, 0x04bc04bb, - 0x04be04bd, 0x04c004bf, 0x04c204c1, 0x04c404c3, 0x04ff01c5, 0x04c704c6, 0x04c904c8, 0x04cb04ca, 0x04cd04cc, 0x04cf04ce, 0x04d104d0, 0x04d304d2, - 0x04d504d4, 0x04d804d7, 0x041a02da, 0x040e02db, 0x021302d6, 0x02d9040d, 0x0012020c, 0x18df0001, 0x223ab562, 0x10920085, 0x8001b762, 0x22098d43, - 0x43b70074, 0x022b338b, 0x022f03fc, 0x04fa013b, 0x43ca04c9, 0x012b076d, 0x040002ff, 0x04ce04cd, 0x43d304d0, 0xa5431575, 0x0c81430b, 0x19021722, - 0x20387143, 0x2c73434e, 0x433b7143, 0xc82e056f, 0xcc04cb04, 0xd104cf04, 0x0102d204, 0x5343d404, 0xc604230b, 0x3743c704, 0x18022105, 0x20063943, - 0x0a3b43fb, 0x3d431620, 0xb7820906, 0x46004500, 0x48004700, 0x4a004900, 0x4c004b00, 0x4e004d00, 0x50004f00, 0x52005100, 0x54005300, 0x56005500, - 0x58005700, 0x5a005900, 0x5c005b00, 0x5e005d00, 0x8c008700, 0xe9009300, 0xeb00ea00, 0xed00ec00, 0xef00ee00, 0xf100f000, 0xf300f200, 0xf500f400, - 0xf700f600, 0xf900f800, 0xfb00fa00, 0xfd00fc00, 0xff00fe00, 0x01010001, 0x03010201, 0x05010401, 0x2d010601, 0x33013101, 0x3b013901, 0x40013d01, - 0x4a024701, 0x67026602, 0x69026802, 0x6b026a02, 0x6d026c02, 0x6f026e02, 0x71027002, 0x73027202, 0x75027402, 0x77027602, 0x79027802, 0x7b027a02, - 0x7d027c02, 0x7f027e02, 0x81028002, 0x85028302, 0x89028702, 0x8d028b02, 0x91028f02, 0x95029302, 0x99029702, 0x9d029b02, 0xa1029f02, 0xa502a302, - 0xa902a702, 0xad02ab02, 0xb402b202, 0xb802b602, 0xbc02ba02, 0xc002be02, 0xc502c202, 0xc902c702, 0xcd02cb02, 0xd102cf02, 0xd502d302, 0xdb02d902, - 0xdf02dd02, 0xe302e102, 0xe702e502, 0xeb02e902, 0xef02ed02, 0xf402f202, 0x8f03f602, 0x91039003, 0x93039203, 0x95039403, 0x97039603, 0x99039803, - 0x9b039a03, 0x9d039c03, 0xbb039e03, 0xbf03bd03, 0xd403cd03, 0xe003da03, 0x49044604, 0x4f044b04, 0x59045704, 0x5e045a04, 0x06006a04, 0x06000000, - 0x2a001200, 0x5a004200, 0x8a007200, 0x11820300, 0x11820120, 0x90000124, 0x0b820100, 0x05824a20, 0x4d000122, 0x7820178a, 0x4e20178a, 0x6020178a, - 0x02211789, 0x20178aad, 0x21178948, 0x178a9a03, 0x178a3020, 0x178a9c20, 0x17891820, 0x00190423, 0x220d8202, 0x82ab00a7, 0x82042089, 0x00012803, - 0x06010008, 0x8236001e, 0x05df4dab, 0x00ca7208, 0x010e01fc, 0x014a0118, 0x017e0164, 0x01ba0190, 0x02f601ec, 0x02320218, 0x02760244, 0x02a20288, - 0x03de02cc, 0x031a0310, 0x03360324, 0x03720368, 0x0386037c, 0x03ba03a0, 0x04f603cc, 0x04320428, 0x046e0454, 0x04b20480, 0x05de04c4, 0x051a0508, - 0x052e0524, 0x05420538, 0x0596056c, 0x06ea05c0, 0x00060014, 0x0014000e, 0x0020001a, 0x022c0026, 0x2293824b, 0x824c02a7, 0x02a82205, 0x2205824e, - 0x82f003a9, 0x04aa2205, 0x2205827a, 0x82ee03ab, 0x00ac2605, 0x04040001, 0x21098787, 0x09828802, 0x0382a820, 0x0c000624, 0x07828904, 0x8b04ac26, - 0xa2010200, 0x5320578e, 0x54205784, 0xa8220582, 0x05820a04, 0x0804a922, 0x7c205784, 0xab220582, 0x4d840604, 0x33820220, 0x76040c22, 0xa2207b84, - 0x69834384, 0x1b848d20, 0x5720a58d, 0x58204d84, 0xa6202984, 0x16204d84, 0x7e204d84, 0x18204d84, 0x03223184, 0xd9830800, 0x848f0421, 0x82912073, - 0x02ac2205, 0x865584b3, 0xb5022119, 0x93201984, 0xb7201984, 0x81841984, 0x84ac0321, 0x84952017, 0x00052c45, 0x0012000c, 0x001e0018, 0x84780424, - 0x84bd2075, 0x845b2075, 0x84972075, 0x92bf203b, 0x845c20ef, 0x845d202b, 0x845f202b, 0x841c202b, 0x848020a1, 0x411a20a1, 0x99200847, 0xa82c0982, - 0x0a000400, 0x16001000, 0xca021c00, 0x82207b84, 0x9b202584, 0xcc205d84, 0xd020b38c, 0x9d201f84, 0xd6201984, 0x0421b389, 0x2011849f, 0x208992da, - 0x20898461, 0x20898462, 0x208984e0, 0x20898434, 0x20638484, 0x0a794132, 0x1d84a120, 0x3d41a320, 0x8303200b, 0x03a72257, 0x207584a1, 0x0f1141a5, - 0x11830320, 0x6502a722, 0x44201d84, 0x42203d84, 0x40205b84, 0x02215589, 0x201d84f1, 0x12c541a7, 0x99846620, 0x99846720, 0x05826920, 0x8303a921, - 0x04aa222b, 0x220b827b, 0x41ef03ab, 0x88200823, 0x20086b42, 0x0a6b4289, 0x0b828a20, 0x8c04ac22, 0x6e20f192, 0x6f205784, 0x0b207784, 0x09209584, - 0x7d209584, 0x0720f184, 0x77205788, 0x01244d84, 0x8e040400, 0x19201388, 0x200c3b42, 0x20438490, 0x22058292, 0x41b402ac, 0xb6200c87, 0x94201984, - 0xb8201984, 0x21098741, 0x1784ad03, 0x29419620, 0x7904210f, 0xbe209384, 0x7620eb84, 0x98209384, 0xc0203b84, 0x9783bf92, 0x7802a722, 0x7a202b84, - 0x1d202b84, 0x8120bf84, 0x1b20bf84, 0x9a20ab88, 0x200e3b42, 0x207b84cb, 0x20258483, 0x205d849c, 0x20b38ccd, 0x201f84d1, 0x2019849e, 0x21b389d7, - 0x1184a004, 0x8992db20, 0xb5847c20, 0x89847d20, 0x8984e120, 0x89843520, 0x63848520, 0xe5413320, 0xa2042109, 0xa4201d84, 0x200c3b42, 0x220d82a0, - 0x84a203a7, 0x41a62075, 0x03200f11, 0xa7221183, 0x1d848002, 0x3d844520, 0x5b844320, 0x55894120, 0x84f20221, 0x41a8201d, 0xf72008ff, 0x0124f184, - 0xf9020400, 0xf8200988, 0xfa200988, 0xb1430984, 0x7202210a, 0x7320bf84, 0xa720bf84, 0x17206384, 0x7f206384, 0xab210582, 0x21298a00, 0x11822a04, - 0x2804a722, 0x2e206f84, 0x2c202984, 0x30202984, 0x0421b78f, 0x2029842b, 0x20298429, 0x2029842f, 0x2029842d, 0x20299031, 0x20298438, 0x20298436, - 0x2029843c, 0x2029843a, 0x2029903e, 0x20298439, 0x20298437, 0x2029843d, 0x2029843b, 0x08eb413f, 0xdb848620, 0x1100022c, 0x29002500, 0x2b000000, - 0xbf822d00, 0x002f3008, 0x00080034, 0x003b0036, 0x003d000e, 0x0014003e, 0x00490045, 0x004b0016, 0x001b004d, 0x0054004f, 0x0056001e, 0x0024005b, - 0x005e005d, 0x8281002a, 0x002c2201, 0x22018283, 0x8286002d, 0x002e2201, 0x22018289, 0x828c002f, 0x00302801, 0x009a0097, 0x82cf0031, 0x00352101, - 0x2207294a, 0x82060001, 0x00012679, 0x02d40202, 0x201588d5, 0x286f8202, 0x04dd0404, 0x04df04de, 0x291582e0, 0x02860204, 0x02980287, 0xc7460099, - 0x26002108, 0x0a223782, 0x19461c00, 0xa3012105, 0x4a220782, 0x0582a801, 0x01005826, 0xa9010400, 0x02240986, 0x57004a00, 0x4420358a, 0x14203584, - 0xa4202384, 0x4d200b82, 0xa6200984, 0x5b890984, 0x258a1e20, 0x0b82a520, 0x25845020, 0x0986a720, 0x6f825382, 0x0121c18a, 0x221f8295, 0x884b0001, - 0x21d582bf, 0x13842701, 0x138cba20, 0x1384ac20, 0x13883620, 0xbf830220, 0x01e30123, 0x26118ae4, 0x0102000a, 0x82e601e5, 0x00022411, 0x8a4f002f, - 0x001e3a19, 0x0228020c, 0x0229022a, 0x022c022b, 0x0220021f, 0x02ae0121, 0x02240223, 0x2a258225, 0x0027000c, 0x002b0028, 0x4a350033, 0x4b210605, - 0x05f34900, 0x2908954b, 0x03000c00, 0x27022602, 0x2f822702, 0x49000326, 0xae014b00, 0x66325f8a, 0x3d020800, 0x2e022d02, 0x31023002, 0x3a023902, - 0x1d8a3c02, 0x08001632, 0x15001b00, 0x17001600, 0x19001800, 0x14001d00, 0x08301d82, 0x2202ad01, 0x71047004, 0x73047204, 0x75047404, 0x0421318d, - 0x231d8975, 0x7404ad01, 0x08201d82, 0x45893782, 0x47821b20, 0x63839f89, 0x63841b8d, 0x0221938d, 0x0c53413d, 0x0d826920, 0x13000128, 0x00000600, - 0xa3820100, 0x05820320, 0x03821220, 0x0f845220, 0x4a00002a, 0x02000200, 0x7c017c01, 0xd4221e82, 0x7952dd01, 0x82082008, 0x01282209, 0x384b88c0, - 0x001a0002, 0x0032020a, 0x0073007a, 0x02330274, 0x02350234, 0x02370236, 0x203f8238, 0x51b38201, 0x44820581, 0x24086382, 0x00260002, 0x01d40110, - 0x01d601d5, 0x01d801d7, 0x01da01d9, 0x01dc01db, 0x024002dd, 0x0241023e, 0x043f0242, 0x205982e1, 0x24eb8c10, 0x001b001a, 0x2aef821c, 0x024e004d, - 0x039a03ad, 0x0519049c, 0x4bd158fa, 0x00000034, -}; - diff --git a/core/rend/texconv.cpp b/core/rend/texconv.cpp new file mode 100644 index 000000000..6b6cae678 --- /dev/null +++ b/core/rend/texconv.cpp @@ -0,0 +1,539 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "texconv.h" +#include "cfg/option.h" +#include "hw/pvr/Renderer_if.h" +#include +#include + +const u8 *vq_codebook; +u32 palette_index; +u32 palette16_ram[1024]; +u32 palette32_ram[1024]; +u32 pal_hash_256[4]; +u32 pal_hash_16[64]; +extern bool pal_needs_update; + +u32 detwiddle[2][11][1024]; +//input : address in the yyyyyxxxxx format +//output : address in the xyxyxyxy format +//U : x resolution , V : y resolution +//twiddle works on 64b words + +static u32 twiddle_slow(u32 x, u32 y, u32 x_sz, u32 y_sz) +{ + u32 rv = 0; // low 2 bits are directly passed -> needs some misc stuff to work.However + // Pvr internally maps the 64b banks "as if" they were twiddled + + u32 sh = 0; + x_sz >>= 1; + y_sz >>= 1; + while (x_sz != 0 || y_sz != 0) + { + if (y_sz != 0) + { + u32 temp = y & 1; + rv |= temp << sh; + + y_sz >>= 1; + y >>= 1; + sh++; + } + if (x_sz != 0) + { + u32 temp = x & 1; + rv |= temp << sh; + + x_sz >>= 1; + x >>= 1; + sh++; + } + } + return rv; +} + +static OnLoad _([]() { + constexpr u32 x_sz = 1024; + for (u32 s = 0; s < 11; s++) + { + u32 y_sz = 1 << s; + for (u32 i = 0; i < x_sz; i++) { + detwiddle[0][s][i] = twiddle_slow(i, 0, x_sz, y_sz); + detwiddle[1][s][i] = twiddle_slow(0, i, y_sz, x_sz); + } + } +}); + +void palette_update() +{ + if (!pal_needs_update) + return; + pal_needs_update = false; + rend_updatePalette(); + + if (!isDirectX(config::RendererType)) + { + switch (PAL_RAM_CTRL & 3) + { + case 0: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = Unpacker1555::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker1555_32::unpack(PALETTE_RAM[i]); + } + break; + + case 1: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker565_32::unpack(PALETTE_RAM[i]); + } + break; + + case 2: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = Unpacker4444::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker4444_32::unpack(PALETTE_RAM[i]); + } + break; + + case 3: + for (int i = 0; i < 1024; i++) + palette32_ram[i] = Unpacker8888::unpack(PALETTE_RAM[i]); + break; + } + } + else + { + switch (PAL_RAM_CTRL & 3) + { + case 0: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker1555_32::unpack(PALETTE_RAM[i]); + } + break; + + case 1: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker565_32::unpack(PALETTE_RAM[i]); + } + break; + + case 2: + for (int i = 0; i < 1024; i++) { + palette16_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); + palette32_ram[i] = Unpacker4444_32::unpack(PALETTE_RAM[i]); + } + break; + + case 3: + for (int i = 0; i < 1024; i++) + palette32_ram[i] = UnpackerNop::unpack(PALETTE_RAM[i]); + break; + } + } + for (std::size_t i = 0; i < std::size(pal_hash_16); i++) + pal_hash_16[i] = XXH32(&PALETTE_RAM[i << 4], 16 * 4, 7); + for (std::size_t i = 0; i < std::size(pal_hash_256); i++) + pal_hash_256[i] = XXH32(&PALETTE_RAM[i << 8], 256 * 4, 7); +} + +template +inline static u32 YUV422(s32 Y, s32 Yu, s32 Yv) +{ + Yu -= 128; + Yv -= 128; + + s32 R = Y + Yv * 11 / 8; // Y + (Yv-128) * (11/8) ? + s32 G = Y - (Yu * 11 + Yv * 22) / 32; // Y - (Yu-128) * (11/8) * 0.25 - (Yv-128) * (11/8) * 0.5 ? + s32 B = Y + Yu * 110 / 64; // Y + (Yu-128) * (11/8) * 1.25 ? + + return Packer::pack(std::clamp(R, 0, 255), std::clamp(G, 0, 255), std::clamp(B, 0, 255), 0xFF); +} + +static u32 twop(u32 x, u32 y, u32 bcx, u32 bcy) { + return detwiddle[0][bcy][x] + detwiddle[1][bcx][y]; +} + +template +struct ConvertPlanar +{ + using unpacked_type = typename Unpacker::unpacked_type; + static constexpr u32 xpp = 4; + static constexpr u32 ypp = 1; + static void Convert(PixelBuffer *pb, const u8 *data) + { + const u16 *p_in = (const u16 *)data; + pb->prel(0, Unpacker::unpack(p_in[0])); + pb->prel(1, Unpacker::unpack(p_in[1])); + pb->prel(2, Unpacker::unpack(p_in[2])); + pb->prel(3, Unpacker::unpack(p_in[3])); + } +}; + +template +struct ConvertPlanarYUV +{ + using unpacked_type = u32; + static constexpr u32 xpp = 4; + static constexpr u32 ypp = 1; + static void Convert(PixelBuffer *pb, const u8 *data) + { + //convert 4x1 4444 to 4x1 8888 + const u32 *p_in = (const u32 *)data; + + + s32 Y0 = (p_in[0] >> 8) & 255; // + s32 Yu = (p_in[0] >> 0) & 255; //p_in[0] + s32 Y1 = (p_in[0] >> 24) & 255; //p_in[3] + s32 Yv = (p_in[0] >> 16) & 255; //p_in[2] + + //0,0 + pb->prel(0, YUV422(Y0, Yu, Yv)); + //1,0 + pb->prel(1, YUV422(Y1, Yu, Yv)); + + //next 4 bytes + p_in += 1; + + Y0 = (p_in[0] >> 8) & 255; // + Yu = (p_in[0] >> 0) & 255; //p_in[0] + Y1 = (p_in[0] >> 24) & 255; //p_in[3] + Yv = (p_in[0] >> 16) & 255; //p_in[2] + + //0,0 + pb->prel(2, YUV422(Y0, Yu, Yv)); + //1,0 + pb->prel(3, YUV422(Y1, Yu, Yv)); + } +}; + +template +struct ConvertTwiddle +{ + using unpacked_type = typename Unpacker::unpacked_type; + static constexpr u32 xpp = 2; + static constexpr u32 ypp = 2; + static void Convert(PixelBuffer *pb, const u8 *data) + { + const u16 *p_in = (const u16 *)data; + pb->prel(0, 0, Unpacker::unpack(p_in[0])); + pb->prel(0, 1, Unpacker::unpack(p_in[1])); + pb->prel(1, 0, Unpacker::unpack(p_in[2])); + pb->prel(1, 1, Unpacker::unpack(p_in[3])); + } +}; + +template +struct ConvertTwiddleYUV +{ + using unpacked_type = u32; + static constexpr u32 xpp = 2; + static constexpr u32 ypp = 2; + static void Convert(PixelBuffer *pb, const u8 *data) + { + //convert 4x1 4444 to 4x1 8888 + const u16* p_in = (const u16 *)data; + + s32 Y0 = (p_in[0] >> 8) & 255; // + s32 Yu = (p_in[0] >> 0) & 255; //p_in[0] + s32 Y1 = (p_in[2] >> 8) & 255; //p_in[3] + s32 Yv = (p_in[2] >> 0) & 255; //p_in[2] + + //0,0 + pb->prel(0, 0, YUV422(Y0, Yu, Yv)); + //1,0 + pb->prel(1, 0, YUV422(Y1, Yu, Yv)); + + //next 4 bytes + //p_in+=2; + + Y0 = (p_in[1] >> 8) & 255; // + Yu = (p_in[1] >> 0) & 255; //p_in[0] + Y1 = (p_in[3] >> 8) & 255; //p_in[3] + Yv = (p_in[3] >> 0) & 255; //p_in[2] + + //0,1 + pb->prel(0, 1, YUV422(Y0, Yu, Yv)); + //1,1 + pb->prel(1, 1, YUV422(Y1, Yu, Yv)); + } +}; + +template +struct UnpackerPalToRgb { + using unpacked_type = Pixel; + static Pixel unpack(u8 col) + { + u32 *pal = sizeof(Pixel) == 2 ? &palette16_ram[palette_index] : &palette32_ram[palette_index]; + return pal[col]; + } +}; + +template +struct ConvertTwiddlePal4 +{ + using unpacked_type = typename Unpacker::unpacked_type; + static constexpr u32 xpp = 4; + static constexpr u32 ypp = 4; + static void Convert(PixelBuffer *pb, const u8 *data) + { + const u8 *p_in = data; + + pb->prel(0, 0, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(0, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + pb->prel(1, 0, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(1, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + + pb->prel(0, 2, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(0, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + pb->prel(1, 2, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(1, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + + pb->prel(2, 0, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(2, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + pb->prel(3, 0, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(3, 1, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + + pb->prel(2, 2, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(2, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + pb->prel(3, 2, Unpacker::unpack(p_in[0] & 0xF)); + pb->prel(3, 3, Unpacker::unpack((p_in[0] >> 4) & 0xF)); p_in++; + } +}; + +template +struct ConvertTwiddlePal8 +{ + using unpacked_type = typename Unpacker::unpacked_type; + static constexpr u32 xpp = 2; + static constexpr u32 ypp = 4; + static void Convert(PixelBuffer *pb, const u8 *data) + { + const u8* p_in = (const u8 *)data; + + pb->prel(0, 0, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(0, 1, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(1, 0, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(1, 1, Unpacker::unpack(p_in[0])); p_in++; + + pb->prel(0, 2, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(0, 3, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(1, 2, Unpacker::unpack(p_in[0])); p_in++; + pb->prel(1, 3, Unpacker::unpack(p_in[0])); p_in++; + } +}; + +//handler functions +template +void texture_PL(PixelBuffer* pb, const u8* p_in, u32 width, u32 height) +{ + pb->amove(0,0); + + height /= PixelConvertor::ypp; + width /= PixelConvertor::xpp; + + for (u32 y = 0; y < height; y++) + { + for (u32 x = 0; x < width; x++) + { + const u8* p = p_in; + PixelConvertor::Convert(pb, p); + p_in += 8; + + pb->rmovex(PixelConvertor::xpp); + } + pb->rmovey(PixelConvertor::ypp); + } +} + +template +void texture_PLVQ(PixelBuffer* pb, const u8* p_in, u32 width, u32 height) +{ + pb->amove(0, 0); + + height /= PixelConvertor::ypp; + width /= PixelConvertor::xpp; + + for (u32 y = 0; y < height; y++) + { + for (u32 x = 0; x < width; x++) + { + u8 p = *p_in++; + PixelConvertor::Convert(pb, &vq_codebook[p * 8]); + pb->rmovex(PixelConvertor::xpp); + } + pb->rmovey(PixelConvertor::ypp); + } +} + +template +void texture_TW(PixelBuffer* pb, const u8* p_in, u32 width, u32 height) +{ + pb->amove(0, 0); + + const u32 divider = PixelConvertor::xpp * PixelConvertor::ypp; + + const u32 bcx = bitscanrev(width); + const u32 bcy = bitscanrev(height); + + for (u32 y = 0; y < height; y += PixelConvertor::ypp) + { + for (u32 x = 0; x < width; x += PixelConvertor::xpp) + { + const u8* p = &p_in[(twop(x, y, bcx, bcy) / divider) << 3]; + PixelConvertor::Convert(pb, p); + + pb->rmovex(PixelConvertor::xpp); + } + pb->rmovey(PixelConvertor::ypp); + } +} + +template +void texture_VQ(PixelBuffer* pb, const u8* p_in, u32 width, u32 height) +{ + pb->amove(0, 0); + + const u32 divider = PixelConvertor::xpp * PixelConvertor::ypp; + const u32 bcx = bitscanrev(width); + const u32 bcy = bitscanrev(height); + + for (u32 y = 0; y < height; y += PixelConvertor::ypp) + { + for (u32 x = 0; x < width; x += PixelConvertor::xpp) + { + u8 p = p_in[twop(x, y, bcx, bcy) / divider]; + PixelConvertor::Convert(pb, &vq_codebook[p * 8]); + + pb->rmovex(PixelConvertor::xpp); + } + pb->rmovey(PixelConvertor::ypp); + } +} + +//Twiddle +const TexConvFP tex565_TW = texture_TW>>; +// Palette +const TexConvFP texPAL4_TW = texture_TW>>; +const TexConvFP texPAL8_TW = texture_TW>>; +const TexConvFP32 texPAL4_TW32 = texture_TW>>; +const TexConvFP32 texPAL8_TW32 = texture_TW>>; +const TexConvFP8 texPAL4PT_TW = texture_TW>>; +const TexConvFP8 texPAL8PT_TW = texture_TW>>; +//VQ +const TexConvFP tex565_VQ = texture_VQ>>; +// According to the documentation, a texture cannot be compressed and use +// a palette at the same time. However the hardware displays them +// just fine. +const TexConvFP texPAL4_VQ = texture_VQ>>; +const TexConvFP texPAL8_VQ = texture_VQ>>; +const TexConvFP32 texPAL4_VQ32 = texture_VQ>>; +const TexConvFP32 texPAL8_VQ32 = texture_VQ>>; + +namespace opengl { +// OpenGL + +//Planar +const TexConvFP32 texYUV422_PL = texture_PL>; +const TexConvFP32 tex565_PL32 = texture_PL>>; +const TexConvFP32 tex1555_PL32 = texture_PL>>; +const TexConvFP32 tex4444_PL32 = texture_PL>>; + +const TexConvFP32 texYUV422_PLVQ = texture_PLVQ>; +const TexConvFP32 tex565_PLVQ32 = texture_PLVQ>>; +const TexConvFP32 tex1555_PLVQ32 = texture_PLVQ>>; +const TexConvFP32 tex4444_PLVQ32 = texture_PLVQ>>; + +//Twiddle +const TexConvFP tex1555_TW = texture_TW>; +const TexConvFP tex4444_TW = texture_TW>; +const TexConvFP texBMP_TW = tex4444_TW; +const TexConvFP32 texYUV422_TW = texture_TW>; + +const TexConvFP32 tex565_TW32 = texture_TW>>; +const TexConvFP32 tex1555_TW32 = texture_TW>>; +const TexConvFP32 tex4444_TW32 = texture_TW>>; + +//VQ +const TexConvFP tex1555_VQ = texture_VQ>; +const TexConvFP tex4444_VQ = texture_VQ>; +const TexConvFP texBMP_VQ = tex4444_VQ; +const TexConvFP32 texYUV422_VQ = texture_VQ>; + +const TexConvFP32 tex565_VQ32 = texture_VQ>>; +const TexConvFP32 tex1555_VQ32 = texture_VQ>>; +const TexConvFP32 tex4444_VQ32 = texture_VQ>>; +} + +namespace directx { +// DirectX + +//Planar +const TexConvFP32 texYUV422_PL = texture_PL>; +const TexConvFP32 tex565_PL32 = texture_PL>>; +const TexConvFP32 tex1555_PL32 = texture_PL>>; +const TexConvFP32 tex4444_PL32 = texture_PL>>; + +const TexConvFP32 texYUV422_PLVQ = texture_PLVQ>; +const TexConvFP32 tex565_PLVQ32 = texture_PLVQ>>; +const TexConvFP32 tex1555_PLVQ32 = texture_PLVQ>>; +const TexConvFP32 tex4444_PLVQ32 = texture_PLVQ>>; + +//Twiddle +const TexConvFP tex1555_TW = texture_TW>>; +const TexConvFP tex4444_TW = texture_TW>>; +const TexConvFP texBMP_TW = tex4444_TW; +const TexConvFP32 texYUV422_TW = texture_TW>; + +const TexConvFP32 tex565_TW32 = texture_TW>>; +const TexConvFP32 tex1555_TW32 = texture_TW>>; +const TexConvFP32 tex4444_TW32 = texture_TW>>; + +//VQ +const TexConvFP tex1555_VQ = texture_VQ>>; +const TexConvFP tex4444_VQ = texture_VQ>>; +const TexConvFP texBMP_VQ = tex4444_VQ; +const TexConvFP32 texYUV422_VQ = texture_VQ>; + +const TexConvFP32 tex565_VQ32 = texture_VQ>>; +const TexConvFP32 tex1555_VQ32 = texture_VQ>>; +const TexConvFP32 tex4444_VQ32 = texture_VQ>>; +} + +#define TEX_CONV_TABLE \ +const PvrTexInfo pvrTexInfo[8] = \ +{ /* name bpp Final format Twiddled VQ Planar(32b) Twiddled(32b) VQ (32b) PL VQ (32b) Palette (8b) */ \ + {"1555", 16, TextureType::_5551, tex1555_TW, tex1555_VQ, tex1555_PL32, tex1555_TW32, tex1555_VQ32, tex1555_PLVQ32, nullptr }, \ + {"565", 16, TextureType::_565, tex565_TW, tex565_VQ, tex565_PL32, tex565_TW32, tex565_VQ32, tex565_PLVQ32, nullptr }, \ + {"4444", 16, TextureType::_4444, tex4444_TW, tex4444_VQ, tex4444_PL32, tex4444_TW32, tex4444_VQ32, tex4444_PLVQ32, nullptr }, \ + {"yuv", 16, TextureType::_8888, nullptr, nullptr, texYUV422_PL, texYUV422_TW, texYUV422_VQ, texYUV422_PLVQ, nullptr }, \ + {"bumpmap", 16, TextureType::_4444, texBMP_TW, texBMP_VQ, tex4444_PL32, tex4444_TW32, tex4444_VQ32, tex4444_PLVQ32, nullptr }, \ + {"pal4", 4, TextureType::_5551, texPAL4_TW, texPAL4_VQ, nullptr, texPAL4_TW32, texPAL4_VQ32, nullptr, texPAL4PT_TW }, \ + {"pal8", 8, TextureType::_5551, texPAL8_TW, texPAL8_VQ, nullptr, texPAL8_TW32, texPAL8_VQ32, nullptr, texPAL8PT_TW }, \ + {"ns/1555", 0}, \ +} + +namespace opengl { + TEX_CONV_TABLE; +} +namespace directx { + TEX_CONV_TABLE; +} +#undef TEX_CONV_TABLE +const PvrTexInfo *pvrTexInfo = opengl::pvrTexInfo; diff --git a/core/rend/texconv.h b/core/rend/texconv.h new file mode 100644 index 000000000..cbaa2cf26 --- /dev/null +++ b/core/rend/texconv.h @@ -0,0 +1,257 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#include "types.h" + +constexpr int VQ_CODEBOOK_SIZE = 256 * 8; +extern const u8 *vq_codebook; +extern u32 palette_index; +extern u32 palette16_ram[1024]; +extern u32 palette32_ram[1024]; +extern u32 pal_hash_256[4]; +extern u32 pal_hash_16[64]; + +void palette_update(); + +template +class PixelBuffer +{ + Pixel* p_buffer_start = nullptr; + Pixel* p_current_mipmap = nullptr; + Pixel* p_current_line = nullptr; + Pixel* p_current_pixel = nullptr; + + u32 pixels_per_line = 0; + +public: + ~PixelBuffer() { + deinit(); + } + + void init(u32 width, u32 height, bool mipmapped) + { + deinit(); + size_t size = width * height * sizeof(Pixel); + if (mipmapped) + { + do + { + width /= 2; + height /= 2; + size += width * height * sizeof(Pixel); + } + while (width != 0 && height != 0); + } + p_buffer_start = p_current_line = p_current_pixel = p_current_mipmap = (Pixel *)malloc(size); + this->pixels_per_line = 1; + } + + void init(u32 width, u32 height) + { + deinit(); + p_buffer_start = p_current_line = p_current_pixel = p_current_mipmap = (Pixel *)malloc(width * height * sizeof(Pixel)); + this->pixels_per_line = width; + } + + void deinit() + { + if (p_buffer_start != nullptr) + { + free(p_buffer_start); + p_buffer_start = p_current_mipmap = p_current_line = p_current_pixel = nullptr; + } + } + + void steal_data(PixelBuffer &buffer) + { + deinit(); + p_buffer_start = p_current_mipmap = p_current_line = p_current_pixel = buffer.p_buffer_start; + pixels_per_line = buffer.pixels_per_line; + buffer.p_buffer_start = buffer.p_current_mipmap = buffer.p_current_line = buffer.p_current_pixel = nullptr; + } + + void set_mipmap(int level) + { + u32 offset = 0; + for (int i = 0; i < level; i++) + offset += (1 << (2 * i)); + p_current_mipmap = p_current_line = p_current_pixel = p_buffer_start + offset; + pixels_per_line = 1 << level; + } + + Pixel *data(u32 x = 0, u32 y = 0) + { + return p_current_mipmap + pixels_per_line * y + x; + } + + void prel(u32 x, Pixel value) + { + p_current_pixel[x] = value; + } + + void prel(u32 x, u32 y, Pixel value) + { + p_current_pixel[y * pixels_per_line + x] = value; + } + + void rmovex(u32 value) + { + p_current_pixel += value; + } + + void rmovey(u32 value) + { + p_current_line += pixels_per_line * value; + p_current_pixel = p_current_line; + } + + void amove(u32 x_m, u32 y_m) + { + //p_current_pixel=p_buffer_start; + p_current_line = p_current_mipmap + pixels_per_line * y_m; + p_current_pixel = p_current_line + x_m; + } +}; + +// OpenGL +struct RGBAPacker { + static u32 pack(u8 r, u8 g, u8 b, u8 a) { + return r | (g << 8) | (b << 16) | (a << 24); + } +}; +// DirectX +struct BGRAPacker { + static u32 pack(u8 r, u8 g, u8 b, u8 a) { + return b | (g << 8) | (r << 16) | (a << 24); + } +}; + +template +struct UnpackerNop { + using unpacked_type = Pixel; + static Pixel unpack(Pixel word) { + return word; + } +}; + +// ARGB1555 to RGBA5551 +struct Unpacker1555 { + using unpacked_type = u16; + static u16 unpack(u16 word) { + return ((word >> 15) & 1) | (((word >> 10) & 0x1F) << 11) | (((word >> 5) & 0x1F) << 6) | (((word >> 0) & 0x1F) << 1); + } +}; + +// ARGB4444 to RGBA4444 +struct Unpacker4444 { + using unpacked_type = u16; + static u16 unpack(u16 word) { + return (((word >> 0) & 0xF) << 4) | (((word >> 4) & 0xF) << 8) | (((word >> 8) & 0xF) << 12) | (((word >> 12) & 0xF) << 0); + } +}; + +template +struct Unpacker1555_32 { + using unpacked_type = u32; + static u32 unpack(u16 word) { + return Packer::pack( + (((word >> 10) & 0x1F) << 3) | ((word >> 12) & 7), + (((word >> 5) & 0x1F) << 3) | ((word >> 7) & 7), + (((word >> 0) & 0x1F) << 3) | ((word >> 2) & 7), + (word & 0x8000) ? 0xFF : 0); + } +}; + +template +struct Unpacker565_32 { + using unpacked_type = u32; + static u32 unpack(u16 word) { + return Packer::pack( + (((word >> 11) & 0x1F) << 3) | ((word >> 13) & 7), + (((word >> 5) & 0x3F) << 2) | ((word >> 9) & 3), + (((word >> 0) & 0x1F) << 3) | ((word >> 2) & 7), + 0xFF); + } +}; + +template +struct Unpacker4444_32 { + using unpacked_type = u32; + static u32 unpack(u16 word) { + return Packer::pack( + (((word >> 8) & 0xF) << 4) | ((word >> 8) & 0xF), + (((word >> 4) & 0xF) << 4) | ((word >> 4) & 0xF), + (((word >> 0) & 0xF) << 4) | ((word >> 0) & 0xF), + (((word >> 12) & 0xF) << 4) | ((word >> 12) & 0xF)); + } +}; + +// ARGB8888 to whatever +template +struct Unpacker8888 { + using unpacked_type = u32; + static u32 unpack(u32 word) { + return Packer::pack( + (word >> 16) & 0xFF, + (word >> 8) & 0xFF, + (word >> 0) & 0xFF, + (word >> 24) & 0xFF); + } +}; + +enum class TextureType { _565, _5551, _4444, _8888, _8 }; + +typedef void (*TexConvFP)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); +typedef void (*TexConvFP8)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); +typedef void (*TexConvFP32)(PixelBuffer *pb, const u8 *p_in, u32 width, u32 height); + +struct PvrTexInfo +{ + const char* name; + int bpp; //4/8 for pal. 16 for yuv, rgb, argb + TextureType type; + // Conversion to 16 bpp + TexConvFP TW; + TexConvFP VQ; + // Conversion to 32 bpp + TexConvFP32 PL32; + TexConvFP32 TW32; + TexConvFP32 VQ32; + TexConvFP32 PLVQ32; + // Conversion to 8 bpp (palette) + TexConvFP8 TW8; +}; + +namespace opengl +{ + extern const TexConvFP32 tex1555_TW32; + extern const TexConvFP32 tex1555_VQ32; + extern const TexConvFP32 tex1555_PL32; + extern const TexConvFP32 tex565_TW32; + extern const TexConvFP32 tex565_VQ32; + extern const TexConvFP32 tex565_PL32; + extern const TexConvFP32 tex4444_TW32; + extern const TexConvFP32 tex4444_VQ32; + extern const TexConvFP32 tex4444_PL32; + + extern const PvrTexInfo pvrTexInfo[8]; +} +namespace directx +{ + extern const PvrTexInfo pvrTexInfo[8]; +} +extern const PvrTexInfo *pvrTexInfo; diff --git a/core/rend/tileclip.h b/core/rend/tileclip.h index 8a46f1d10..260f7539c 100644 --- a/core/rend/tileclip.h +++ b/core/rend/tileclip.h @@ -54,11 +54,19 @@ static inline TileClipping GetTileClip(u32 val, const glm::mat4& viewport, int * csy = csy * 32; cey = (cey + 1) * 32; - if (csx <= 0 && csy <= 0 && cex >= 640 && cey >= 480 && tileClippingMode == TileClipping::Outside) + if (csx == 0 && csy == 0 && cex >= 640 && cey >= 480) return TileClipping::Off; if (!pvrrc.isRTT) { + if (tileClippingMode == TileClipping::Outside && !config::EmulateFramebuffer) + { + // Intersect with framebuffer clipping + csx = std::max(csx, pvrrc.fb_X_CLIP.min); + csy = std::max(csy, pvrrc.fb_Y_CLIP.min); + cex = std::min(cex, pvrrc.fb_X_CLIP.max + 1); + cey = std::min(cey, pvrrc.fb_Y_CLIP.max + 1); + } glm::vec4 clip_start(csx, csy, 0, 1); glm::vec4 clip_end(cex, cey, 0, 1); clip_start = viewport * clip_start; diff --git a/core/rend/transform_matrix.h b/core/rend/transform_matrix.h index f3291354d..d79327272 100644 --- a/core/rend/transform_matrix.h +++ b/core/rend/transform_matrix.h @@ -19,7 +19,7 @@ along with Flycast. If not, see . */ #pragma once -#include "TexCache.h" +#include "hw/pvr/Renderer_if.h" #include "hw/pvr/ta_ctx.h" #include "cfg/option.h" @@ -95,15 +95,9 @@ class TransformMatrix return sidebarWidth; } - glm::vec2 GetDreamcastViewport() const { - return dcViewport; - } - void CalcMatrices(const rend_context *renderingContext, int width = 0, int height = 0) { - const int screenFlipY = (System == COORD_OPENGL && !config::EmulateFramebuffer) || System == COORD_DIRECTX ? -1 : 1; - constexpr int rttFlipY = System == COORD_DIRECTX ? -1 : 1; - constexpr int framebufferFlipY = System == COORD_DIRECTX ? -1 : 1; + constexpr int flipY = System == COORD_DIRECTX ? -1 : 1; renderViewport = { width == 0 ? settings.display.width : width, height == 0 ? settings.display.height : height }; this->renderingContext = renderingContext; @@ -114,8 +108,8 @@ class TransformMatrix if (renderingContext->scaler_ctl.hscale) dcViewport.x *= 2; dcViewport.y = (float)(renderingContext->fb_Y_CLIP.max - renderingContext->fb_Y_CLIP.min + 1); - normalMatrix = glm::translate(glm::vec3(-1, -rttFlipY, 0)) - * glm::scale(glm::vec3(2.0f / dcViewport.x, 2.0f / dcViewport.y * rttFlipY, 1.f)); + normalMatrix = glm::translate(glm::vec3(-1, -flipY, 0)) + * glm::scale(glm::vec3(2.0f / dcViewport.x, 2.0f / dcViewport.y * flipY, 1.f)); scissorMatrix = normalMatrix; sidebarWidth = 0; } @@ -140,9 +134,9 @@ class TransformMatrix else sidebarWidth = 0; float x_coef = 2.0f / dcViewport.x; - float y_coef = 2.0f / dcViewport.y * screenFlipY; + float y_coef = 2.0f / dcViewport.y * flipY; - glm::mat4 trans = glm::translate(glm::vec3(-1 + 2 * sidebarWidth, -screenFlipY, 0)); + glm::mat4 trans = glm::translate(glm::vec3(-1 + 2 * sidebarWidth, -flipY, 0)); normalMatrix = trans * glm::scale(glm::vec3(x_coef, y_coef, 1.f)); @@ -152,15 +146,15 @@ class TransformMatrix normalMatrix = glm::scale(glm::vec3(1, 1, 1 / config::ExtraDepthScale)) * normalMatrix; - glm::mat4 vp_trans = glm::translate(glm::vec3(1, framebufferFlipY, 0)); + glm::mat4 vp_trans = glm::translate(glm::vec3(1, flipY, 0)); if (renderingContext->isRTT) { - vp_trans = glm::scale(glm::vec3(dcViewport.x / 2, dcViewport.y / 2 * framebufferFlipY, 1.f)) + vp_trans = glm::scale(glm::vec3(dcViewport.x / 2, dcViewport.y / 2 * flipY, 1.f)) * vp_trans; } else { - vp_trans = glm::scale(glm::vec3(renderViewport.x / 2, renderViewport.y / 2 * framebufferFlipY, 1.f)) + vp_trans = glm::scale(glm::vec3(renderViewport.x / 2, renderViewport.y / 2 * flipY, 1.f)) * vp_trans; } viewportMatrix = vp_trans * normalMatrix; @@ -296,13 +290,14 @@ inline static void getVideoShift(float& x, float& y) switch (SPG_LOAD.hcount) { case 857: // NTSC, VGA - x = VO_STARTX.HStart - (vga ? 0xa8 : 0xa4); + x = (int)VO_STARTX.HStart - (vga ? 0xa8 : 0xa4); break; case 863: // PAL - x = VO_STARTX.HStart - 0xae; + x = (int)VO_STARTX.HStart - 0xae; break; case 851: // Naomi - x = VO_STARTX.HStart - 0xa5; // a0 for 15 kHz + case 850: // meltyb + x = (int)VO_STARTX.HStart - 0xa5; // a0 for 15 kHz break; default: x = 0; @@ -312,23 +307,24 @@ inline static void getVideoShift(float& x, float& y) switch (SPG_LOAD.vcount) { case 524: // NTSC, VGA - y = VO_STARTY.VStart_field1 - (vga ? 0x28 : 0x12); + y = (int)VO_STARTY.VStart_field1 - (vga ? 0x28 : 0x12); break; case 262: // NTSC 240p - y = VO_STARTY.VStart_field1 - 0x11; + y = (int)VO_STARTY.VStart_field1 - 0x11; break; case 624: // PAL - y = VO_STARTY.VStart_field1 - 0x2d; + y = (int)VO_STARTY.VStart_field1 - 0x2d; break; case 312: // PAL 240p - y = VO_STARTY.VStart_field1 - 0x2e; + y = (int)VO_STARTY.VStart_field1 - 0x2e; break; case 529: // Naomi 31 kHz - y = VO_STARTY.VStart_field1 - 0x24; + case 528: // meltyb + y = (int)VO_STARTY.VStart_field1 - 0x24; break; case 536: // Naomi 15 kHz 480i case 268: // Naomi 15 kHz 240p - y = VO_STARTY.VStart_field1 - 0x17; // 16 for 240p + y = (int)VO_STARTY.VStart_field1 - 0x17; // 16 for 240p break; default: y = 0; diff --git a/core/rend/vulkan/adreno.cpp b/core/rend/vulkan/adreno.cpp new file mode 100644 index 000000000..308089f8a --- /dev/null +++ b/core/rend/vulkan/adreno.cpp @@ -0,0 +1,210 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "build.h" +#if defined(__ANDROID__) && !defined(LIBRETRO) && HOST_CPU == CPU_ARM64 +#include "adreno.h" +#include +#include "cfg/option.h" +#include +#include "json.hpp" +using namespace nlohmann; +#include "archive/ZipArchive.h" +#include "oslib/directory.h" +#include "oslib/storage.h" +#include "stdclass.h" + +std::string getNativeLibraryPath(); +std::string getFilesPath(); + +const std::string DRIVER_PATH = "/gpu_driver/"; +static void *libvulkanHandle; + +static json loadDriverMeta() +{ + std::string fullPath = getFilesPath() + DRIVER_PATH + "meta.json"; + FILE *f = nowide::fopen(fullPath.c_str(), "rt"); + if (f == nullptr) { + WARN_LOG(RENDERER, "Can't open %s", fullPath.c_str()); + return json{}; + } + std::string content(4096, '\0'); + size_t l = fread(content.data(), 1, content.size(), f); + fclose(f); + if (l <= 0) { + WARN_LOG(RENDERER, "Can't read %s", fullPath.c_str()); + return json{}; + } + content.resize(l); + try { + return json::parse(content); + } catch (const json::exception& e) { + WARN_LOG(COMMON, "Corrupted meta.json file: %s", e.what()); + return json{}; + } +} + +static std::string getLibraryName() +{ + json v = loadDriverMeta(); + std::string name; + try { + v.at("libraryName").get_to(name); + } catch (const json::exception& e) { + } + return name; +} + +PFN_vkGetInstanceProcAddr loadVulkanDriver() +{ + // If the user has selected a custom driver, try to load it + if (config::CustomGpuDriver) + { + std::string libName = getLibraryName(); + if (!libName.empty()) + { + std::string driverPath = getFilesPath() + DRIVER_PATH; + std::string tmpLibDir = getFilesPath() + "/tmp/"; + mkdir(tmpLibDir.c_str(), 0755); + //std::string redirectDir = get_writable_data_path(""); + libvulkanHandle = adrenotools_open_libvulkan( + RTLD_NOW | RTLD_LOCAL, + ADRENOTOOLS_DRIVER_CUSTOM /* | ADRENOTOOLS_DRIVER_FILE_REDIRECT */, + tmpLibDir.c_str(), + getNativeLibraryPath().c_str(), + driverPath.c_str(), + libName.c_str(), + nullptr, //redirectDir.c_str(), + nullptr); + if (libvulkanHandle == nullptr) { + char *error = dlerror(); + WARN_LOG(RENDERER, "Failed to load custom Vulkan driver %s%s: %s", driverPath.c_str(), libName.c_str(), error ? error : ""); + } + } + } + if (libvulkanHandle == nullptr) + { + libvulkanHandle = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); + if (libvulkanHandle == nullptr) + { + char *error = dlerror(); + WARN_LOG(RENDERER, "Failed to load system Vulkan driver: %s", error ? error : ""); + return nullptr; + } + } + + return reinterpret_cast(dlsym(libvulkanHandle, "vkGetInstanceProcAddr")); +} + +void unloadVulkanDriver() +{ + if (libvulkanHandle != nullptr) { + dlclose(libvulkanHandle); + libvulkanHandle = nullptr; + } +} + +bool getCustomGpuDriverInfo(std::string& name, std::string& description, std::string& vendor, std::string& version) +{ + json j = loadDriverMeta(); + try { + j.at("name").get_to(name); + } catch (const json::exception& e) { + return false; + } + try { + j.at("description").get_to(description); + } catch (const json::exception& e) { + description = ""; + } + try { + j.at("vendor").get_to(vendor); + } catch (const json::exception& e) { + vendor = ""; + } + try { + j.at("driverVersion").get_to(version); + } catch (const json::exception& e) { + version = ""; + } + + return true; +} + +void uploadCustomGpuDriver(const std::string& zipPath) +{ + FILE *zipf = hostfs::storage().openFile(zipPath, "r"); + if (zipf == nullptr) + throw FlycastException("Can't open zip file"); + ZipArchive archive; + if (!archive.Open(zipf)) + throw FlycastException("Invalid zip file"); + std::string fullPath = getFilesPath() + DRIVER_PATH; + flycast::mkdir(fullPath.c_str(), 0755); + // Clean driver directory + DIR *dir = flycast::opendir(fullPath.c_str()); + if (dir != nullptr) + { + while (true) + { + dirent *direntry = flycast::readdir(dir); + if (direntry == nullptr) + break; + std::string name = direntry->d_name; + if (name == "." || name == "..") + continue; + name = fullPath + name; + unlink(name.c_str()); + } + } + // Extract and save files + for (size_t i = 0; ; i++) + { + ArchiveFile *afile = archive.OpenFileByIndex(i); + if (afile == nullptr) + break; + FILE *f = fopen((fullPath + afile->getName()).c_str(), "wb"); + if (f == nullptr) { + delete afile; + throw FlycastException("Can't save files"); + } + u8 buf[8_KB]; + while (true) + { + u32 len = afile->Read(buf, sizeof(buf)); + if (len < 0) + { + fclose(f); + delete afile; + throw FlycastException("Can't read zip"); + } + if (len == 0) + break; + if (fwrite(buf, 1, len, f) != len) + { + fclose(f); + delete afile; + throw FlycastException("Can't save files"); + } + } + fclose(f); + delete afile; + } +} + +#endif // __ANDROID__ && !LIBRETRO && arm64 diff --git a/core/rend/vulkan/adreno.h b/core/rend/vulkan/adreno.h new file mode 100644 index 000000000..261b0af8c --- /dev/null +++ b/core/rend/vulkan/adreno.h @@ -0,0 +1,25 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#include "vulkan.h" + +PFN_vkGetInstanceProcAddr loadVulkanDriver(); +void unloadVulkanDriver(); +bool getCustomGpuDriverInfo(std::string& name, std::string& description, std::string& vendor, std::string& version); +void uploadCustomGpuDriver(const std::string& zipPath); diff --git a/core/rend/vulkan/buffer.cpp b/core/rend/vulkan/buffer.cpp index 58ca65ccb..e0f730794 100644 --- a/core/rend/vulkan/buffer.cpp +++ b/core/rend/vulkan/buffer.cpp @@ -19,7 +19,6 @@ along with Flycast. If not, see . */ #include "buffer.h" -#include "utils.h" #include "vulkan_context.h" BufferData::BufferData(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags propertyFlags) diff --git a/core/rend/vulkan/buffer.h b/core/rend/vulkan/buffer.h index 4f443a75e..0d56238ce 100644 --- a/core/rend/vulkan/buffer.h +++ b/core/rend/vulkan/buffer.h @@ -67,11 +67,11 @@ struct BufferData allocation.UnmapMemory(); } - void *MapMemory() + void *MapMemory() const { return allocation.MapMemory(); } - void UnmapMemory() + void UnmapMemory() const { allocation.UnmapMemory(); } diff --git a/core/rend/vulkan/commandpool.cpp b/core/rend/vulkan/commandpool.cpp index 678bc9494..5e34110d5 100644 --- a/core/rend/vulkan/commandpool.cpp +++ b/core/rend/vulkan/commandpool.cpp @@ -22,6 +22,7 @@ void CommandPool::Init(size_t chainSize) { this->chainSize = chainSize; + device = VulkanContext::Instance()->GetDevice(); if (commandPools.size() > chainSize) { commandPools.resize(chainSize); @@ -31,41 +32,80 @@ void CommandPool::Init(size_t chainSize) { while (commandPools.size() < chainSize) { - commandPools.push_back(VulkanContext::Instance()->GetDevice().createCommandPoolUnique( + commandPools.push_back(device.createCommandPoolUnique( vk::CommandPoolCreateInfo(vk::CommandPoolCreateFlagBits::eTransient, VulkanContext::Instance()->GetGraphicsQueueFamilyIndex()))); - fences.push_back(VulkanContext::Instance()->GetDevice().createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled))); + fences.push_back(device.createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled))); } } - if (freeBuffers.size() != chainSize) - freeBuffers.resize(chainSize); - if (inFlightBuffers.size() != chainSize) - inFlightBuffers.resize(chainSize); + freeBuffers.resize(chainSize); + inFlightBuffers.resize(chainSize); + inFlightObjects.resize(chainSize); +} + +void CommandPool::Term() +{ + if (!fences.empty()) + { + std::vector allFences = vk::uniqueToRaw(fences); + vk::Result res = device.waitForFences(allFences, true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "CommandPool::Term: waitForFences failed %d", (int)res); + } + inFlightObjects.clear(); + freeBuffers.clear(); + inFlightBuffers.clear(); + fences.clear(); + commandPools.clear(); } void CommandPool::BeginFrame() { + if (frameStarted) + return; + frameStarted = true; index = (index + 1) % chainSize; - VulkanContext::Instance()->GetDevice().waitForFences(fences[index].get(), true, UINT64_MAX); - VulkanContext::Instance()->GetDevice().resetFences(fences[index].get()); - std::vector& inFlight = inFlightBuffers[index]; + vk::Result res = device.waitForFences(fences[index].get(), true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "CommandPool::BeginFrame: waitForFences failed %d", (int)res); + std::vector& inFlightBuf = inFlightBuffers[index]; std::vector& freeBuf = freeBuffers[index]; - std::move(inFlight.begin(), inFlight.end(), std::back_inserter(freeBuf)); - inFlight.clear(); - VulkanContext::Instance()->GetDevice().resetCommandPool(*commandPools[index], vk::CommandPoolResetFlagBits::eReleaseResources); + std::move(inFlightBuf.begin(), inFlightBuf.end(), std::back_inserter(freeBuf)); + inFlightBuf.clear(); + device.resetCommandPool(*commandPools[index], vk::CommandPoolResetFlagBits::eReleaseResources); + inFlightObjects[index].clear(); + lastBuffers.clear(); } void CommandPool::EndFrame() { + if (!frameStarted) + return; + frameStarted = false; std::vector commandBuffers = vk::uniqueToRaw(inFlightBuffers[index]); + if (!commandBuffers.empty()) + { + // sort buffers: !last, last + size_t len = commandBuffers.size() - 1; + while (len != 0) + { + for (size_t i = 0; i < len; i++) + if (lastBuffers[i] && !lastBuffers[i + 1]) { + std::vector::swap(lastBuffers[i], lastBuffers[i + 1]); + std::swap(commandBuffers[i], commandBuffers[i + 1]); + } + len--; + } + } + device.resetFences(fences[index].get()); VulkanContext::Instance()->SubmitCommandBuffers(commandBuffers, *fences[index]); } -vk::CommandBuffer CommandPool::Allocate() +vk::CommandBuffer CommandPool::Allocate(bool submitLast) { if (freeBuffers[index].empty()) { inFlightBuffers[index].emplace_back(std::move( - VulkanContext::Instance()->GetDevice().allocateCommandBuffersUnique(vk::CommandBufferAllocateInfo(*commandPools[index], vk::CommandBufferLevel::ePrimary, 1)) + device.allocateCommandBuffersUnique(vk::CommandBufferAllocateInfo(*commandPools[index], vk::CommandBufferLevel::ePrimary, 1)) .front())); } else @@ -73,5 +113,15 @@ vk::CommandBuffer CommandPool::Allocate() inFlightBuffers[index].emplace_back(std::move(freeBuffers[index].back())); freeBuffers[index].pop_back(); } + lastBuffers.push_back(submitLast); return *inFlightBuffers[index].back(); } + +void CommandPool::EndFrameAndWait() +{ + EndFrame(); + vk::Result res = device.waitForFences(fences[index].get(), true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "CommandPool::waitForCommandCompletion: waitForFences failed %d", (int)res); + inFlightObjects[index].clear(); +} diff --git a/core/rend/vulkan/commandpool.h b/core/rend/vulkan/commandpool.h index 171fca36c..3f42f662a 100644 --- a/core/rend/vulkan/commandpool.h +++ b/core/rend/vulkan/commandpool.h @@ -22,40 +22,36 @@ #include "vulkan.h" #include +#include -class CommandPool +class CommandPool : public FlightManager { public: void Init(size_t chainSize = 2); - - void Term() - { - freeBuffers.clear(); - inFlightBuffers.clear(); - fences.clear(); - commandPools.clear(); - } - + void Term(); void BeginFrame(); void EndFrame(); - vk::CommandBuffer Allocate(); + void EndFrameAndWait(); + vk::CommandBuffer Allocate(bool submitLast = false); - vk::Fence GetCurrentFence() - { - return *fences[index]; + int GetIndex() const { + return index; } - int GetIndex() const - { - return index; + void addToFlight(Deletable *object) override { + inFlightObjects[index].emplace_back(object); } private: int index = 0; std::vector> freeBuffers; std::vector> inFlightBuffers; + std::vector lastBuffers; std::vector commandPools; std::vector fences; // size should be the same as used by client: 2 for renderer (texCommandPool) size_t chainSize; + std::vector>> inFlightObjects; + bool frameStarted = false; + vk::Device device{}; }; diff --git a/core/rend/vulkan/compiler.cpp b/core/rend/vulkan/compiler.cpp index a1619f310..a58394e53 100644 --- a/core/rend/vulkan/compiler.cpp +++ b/core/rend/vulkan/compiler.cpp @@ -22,7 +22,8 @@ #include "vulkan_context.h" #include -#include +#include +#include int ShaderCompiler::initCount; diff --git a/core/rend/vulkan/compiler.h b/core/rend/vulkan/compiler.h index 2025d7397..cc4d7249d 100644 --- a/core/rend/vulkan/compiler.h +++ b/core/rend/vulkan/compiler.h @@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "vulkan.h" class ShaderCompiler diff --git a/core/rend/vulkan/drawer.cpp b/core/rend/vulkan/drawer.cpp index 96e5d8538..abfb99338 100644 --- a/core/rend/vulkan/drawer.cpp +++ b/core/rend/vulkan/drawer.cpp @@ -22,7 +22,7 @@ #include "hw/pvr/pvr_mem.h" #include "rend/sorter.h" -TileClipping BaseDrawer::SetTileClip(u32 val, vk::Rect2D& clipRect) +TileClipping BaseDrawer::SetTileClip(vk::CommandBuffer cmdBuffer, u32 val, vk::Rect2D& clipRect) { int rect[4] = {}; TileClipping clipmode = ::GetTileClip(val, matrices.GetViewportMatrix(), rect); @@ -33,6 +33,10 @@ TileClipping BaseDrawer::SetTileClip(u32 val, vk::Rect2D& clipRect) clipRect.extent.width = rect[2]; clipRect.extent.height = rect[3]; } + if (clipmode == TileClipping::Outside) + SetScissor(cmdBuffer, clipRect); + else + SetScissor(cmdBuffer, baseScissor); return clipmode; } @@ -82,6 +86,9 @@ void BaseDrawer::SetBaseScissor(const vk::Extent2D& viewport) void BaseDrawer::scaleAndWriteFramebuffer(vk::CommandBuffer commandBuffer, FramebufferAttachment *finalFB) { + static const float scopeColor[4] = { 0.25f, 0.25f, 0.25f, 0.25f }; + CommandBufferDebugScope _(commandBuffer, "scaleAndWriteFramebuffer", scopeColor); + u32 width = (pvrrc.ta_GLOB_TILE_CLIP.tile_x_num + 1) * 32; u32 height = (pvrrc.ta_GLOB_TILE_CLIP.tile_y_num + 1) * 32; @@ -100,7 +107,8 @@ void BaseDrawer::scaleAndWriteFramebuffer(vk::CommandBuffer commandBuffer, Frame u32 scaledH = height * yscale; scaledFB = new FramebufferAttachment(GetContext()->GetPhysicalDevice(), GetContext()->GetDevice()); - scaledFB->Init(scaledW, scaledH, vk::Format::eR8G8B8A8Unorm, vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst); + scaledFB->Init(scaledW, scaledH, vk::Format::eR8G8B8A8Unorm, vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst, + "SCALED FRAMEBUFFER"); setImageLayout(commandBuffer, scaledFB->GetImage(), vk::Format::eR8G8B8A8Unorm, 1, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal); @@ -143,10 +151,8 @@ void BaseDrawer::scaleAndWriteFramebuffer(vk::CommandBuffer commandBuffer, Frame vk::PipelineStageFlagBits::eHost, {}, nullptr, bufferMemoryBarrier, nullptr); commandBuffer.end(); - commandPool->EndFrame(); + commandPool->EndFrameAndWait(); - vk::Fence fence = commandPool->GetCurrentFence(); - GetContext()->GetDevice().waitForFences(1, &fence, true, UINT64_MAX); PixelBuffer tmpBuf; tmpBuf.init(width, height); finalFB->GetBufferData()->download(width * height * 4, tmpBuf.data()); @@ -163,12 +169,11 @@ void BaseDrawer::scaleAndWriteFramebuffer(vk::CommandBuffer commandBuffer, Frame void Drawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sortTriangles, const PolyParam& poly, u32 first, u32 count) { + static const float scopeColor[4] = { 0.25f, 0.50f, 0.25f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawPoly", scopeColor); + vk::Rect2D scissorRect; - TileClipping tileClip = SetTileClip(poly.tileclip, scissorRect); - if (tileClip == TileClipping::Outside) - SetScissor(cmdBuffer, scissorRect); - else - SetScissor(cmdBuffer, baseScissor); + TileClipping tileClip = SetTileClip(cmdBuffer, poly.tileclip, scissorRect); float trilinearAlpha = 1.f; if (poly.tsp.FilterMode > 1 && poly.pcw.Texture && listType != ListType_Punch_Through && poly.tcw.MipMapped == 1) @@ -178,19 +183,24 @@ void Drawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sor // Trilinear pass A trilinearAlpha = 1.f - trilinearAlpha; } - bool gpuPalette = poly.texture != nullptr ? poly.texture->gpuPalette : false; + int gpuPalette = poly.texture == nullptr || !poly.texture->gpuPalette ? 0 + : poly.tsp.FilterMode + 1; float palette_index = 0.f; - if (gpuPalette) + if (gpuPalette != 0) { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear if (poly.tcw.PixelFmt == PixelPal4) palette_index = float(poly.tcw.PalSelect << 4) / 1023.f; else palette_index = float((poly.tcw.PalSelect >> 4) << 8) / 1023.f; } - if (tileClip == TileClipping::Inside || trilinearAlpha != 1.f || gpuPalette) + if (tileClip == TileClipping::Inside || trilinearAlpha != 1.f || gpuPalette != 0) { - std::array pushConstants = { + const std::array pushConstants = { (float)scissorRect.offset.x, (float)scissorRect.offset.y, (float)scissorRect.offset.x + (float)scissorRect.extent.width, @@ -201,7 +211,7 @@ void Drawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sor cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); } - vk::Pipeline pipeline = pipelineManager->GetPipeline(listType, sortTriangles, poly, gpuPalette); + vk::Pipeline pipeline = pipelineManager->GetPipeline(listType, sortTriangles, poly, gpuPalette, dithering); cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); if (poly.pcw.Texture || poly.isNaomi2()) { @@ -225,7 +235,8 @@ void Drawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sor break; } } - descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, poly, index, *GetMainBuffer(0)->buffer, offset, offsets.lightsOffset); + descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, poly, index, curMainBuffer, offset, offsets.lightsOffset, + listType == ListType_Punch_Through); } cmdBuffer.drawIndexed(count, 1, first, 0, 0); } @@ -234,6 +245,10 @@ void Drawer::DrawSorted(const vk::CommandBuffer& cmdBuffer, const std::vectorGetDepthPassPipeline(polyParam.isp.CullMode, polyParam.isNaomi2()); cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); vk::Rect2D scissorRect; - TileClipping tileClip = SetTileClip(polyParam.tileclip, scissorRect); - if (tileClip == TileClipping::Outside) - SetScissor(cmdBuffer, scissorRect); - else - SetScissor(cmdBuffer, baseScissor); + SetTileClip(cmdBuffer, polyParam.tileclip, scissorRect); cmdBuffer.drawIndexed(param.count, 1, pvrrc.idx.size() + param.first, 0, 0); } } @@ -262,6 +273,10 @@ void Drawer::DrawList(const vk::CommandBuffer& cmdBuffer, u32 listType, bool sor { if (first == last) return; + + static const float scopeColor[4] = { 0.50f, 0.25f, 0.50f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawList", scopeColor); + const PolyParam *pp_end = polys.data() + last; for (const PolyParam *pp = &polys[first]; pp != pp_end; pp++) if (pp->count > 2) @@ -273,14 +288,16 @@ void Drawer::DrawModVols(const vk::CommandBuffer& cmdBuffer, int first, int coun if (count == 0 || pvrrc.modtrig.empty() || !config::ModifierVolumes) return; - vk::Buffer buffer = GetMainBuffer(0)->buffer.get(); - cmdBuffer.bindVertexBuffers(0, buffer, offsets.modVolOffset); - SetScissor(cmdBuffer, baseScissor); + static const float scopeColor[4] = { 0.75f, 0.25f, 0.25f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawModVols", scopeColor); + + cmdBuffer.bindVertexBuffers(0, curMainBuffer, offsets.modVolOffset); ModifierVolumeParam* params = &pvrrc.global_param_mvo[first]; int mod_base = -1; vk::Pipeline pipeline; + vk::Rect2D scissorRect; for (int cmv = 0; cmv < count; cmv++) { @@ -300,7 +317,9 @@ void Drawer::DrawModVols(const vk::CommandBuffer& cmdBuffer, int first, int coun pipeline = pipelineManager->GetModifierVolumePipeline(ModVolMode::Xor, param.isp.CullMode, param.isNaomi2()); // XOR'ing (closed volume) cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); - descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, param, first + cmv, *GetMainBuffer(0)->buffer, offsets.naomi2ModVolOffset); + descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, param, first + cmv, curMainBuffer, offsets.naomi2ModVolOffset); + SetTileClip(cmdBuffer, param.tileclip, scissorRect); + // TODO inside clipping cmdBuffer.draw(param.count * 3, 1, param.first * 3, 0); @@ -313,9 +332,10 @@ void Drawer::DrawModVols(const vk::CommandBuffer& cmdBuffer, int first, int coun mod_base = -1; } } - cmdBuffer.bindVertexBuffers(0, buffer, {0}); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); + SetTileClip(cmdBuffer, 0, scissorRect); - std::array pushConstants = { 1 - FPU_SHAD_SCALE.scale_factor / 256.f, 0, 0, 0, 0 }; + const std::array pushConstants = { 1 - FPU_SHAD_SCALE.scale_factor / 256.f, 0, 0, 0, 0, 0 }; cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); pipeline = pipelineManager->GetModifierVolumePipeline(ModVolMode::Final, 0, false); @@ -346,22 +366,52 @@ void Drawer::UploadMainBuffer(const VertexShaderUniforms& vertexUniforms, const BufferData *buffer = GetMainBuffer(packer.size()); packer.upload(*buffer); + curMainBuffer = buffer->buffer.get(); } bool Drawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) { FragmentShaderUniforms fragUniforms = MakeFragmentUniforms(); + dithering = config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3; + if (dithering) + { + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[1] = fragUniforms.ditherColorMax[2] = 31.f; + fragUniforms.ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[2] = 31.f; + fragUniforms.ditherColorMax[1] = 63.f; + fragUniforms.ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[1] + = fragUniforms.ditherColorMax[2] = fragUniforms.ditherColorMax[3] = 15.f; + break; + default: + break; + } + } currentScissor = vk::Rect2D(); vk::CommandBuffer cmdBuffer = BeginRenderPass(); - if (!pvrrc.isRTT && (FB_R_CTRL.fb_enable == 0 || VO_CONTROL.blank_video == 1)) + + static const float scopeColor[4] = { 0.75f, 0.75f, 0.75f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "Draw", scopeColor); + + if (VulkanContext::Instance()->hasProvokingVertex()) { - // Video output disabled - return true; + // Pipelines are using VK_EXT_provoking_vertex, no need to + // re-order vertices + } + else + { + setFirstProvokingVertex(pvrrc); } - - setFirstProvokingVertex(pvrrc); // Upload vertex and index buffers VertexShaderUniforms vtxUniforms; @@ -370,17 +420,16 @@ bool Drawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) UploadMainBuffer(vtxUniforms, fragUniforms); // Update per-frame descriptor set and bind it - descriptorSets.updateUniforms(GetMainBuffer(0)->buffer.get(), (u32)offsets.vertexUniformOffset, (u32)offsets.fragmentUniformOffset, + descriptorSets.updateUniforms(curMainBuffer, (u32)offsets.vertexUniformOffset, (u32)offsets.fragmentUniformOffset, fogTexture->GetImageView(), paletteTexture->GetImageView()); descriptorSets.bindPerFrameDescriptorSets(cmdBuffer); // Bind vertex and index buffers - const vk::Buffer buffer = GetMainBuffer(0)->buffer.get(); - cmdBuffer.bindVertexBuffers(0, buffer, {0}); - cmdBuffer.bindIndexBuffer(buffer, offsets.indexOffset, vk::IndexType::eUint32); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); + cmdBuffer.bindIndexBuffer(curMainBuffer, offsets.indexOffset, vk::IndexType::eUint32); // Make sure to push constants even if not used - std::array pushConstants = { 0, 0, 0, 0, 0 }; + const std::array pushConstants = { 0, 0, 0, 0, 0, 0 }; cmdBuffer.pushConstants(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants); RenderPass previous_pass{}; @@ -407,6 +456,7 @@ bool Drawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) DrawList(cmdBuffer, ListType_Translucent, false, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); previous_pass = current_pass; } + curMainBuffer = nullptr; return !pvrrc.isRTT; } @@ -441,7 +491,7 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() vk::Device device = context->GetDevice(); NewImage(); - vk::CommandBuffer commandBuffer = commandPool->Allocate(); + vk::CommandBuffer commandBuffer = commandPool->Allocate(true); commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); if (!depthAttachment || widthPow2 > depthAttachment->getExtent().width || heightPow2 > depthAttachment->getExtent().height) @@ -451,7 +501,8 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() else GetContext()->WaitIdle(); depthAttachment->Init(widthPow2, heightPow2, GetContext()->GetDepthFormat(), - vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment); + vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment, + "RTT DEPTH ATTACHMENT"); } vk::Image colorImage; vk::ImageView colorImageView; @@ -460,19 +511,22 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() if (!config::RenderToTextureBuffer) { texture = textureCache->getRTTexture(textureAddr, pvrrc.fb_W_CTRL.fb_packmode, origWidth, origHeight); - if (textureCache->IsInFlight(texture)) + if (textureCache->IsInFlight(texture, false)) { texture->readOnlyImageView = *texture->imageView; - textureCache->DestroyLater(texture); + texture->deferDeleteResource(commandPool); } textureCache->SetInFlight(texture); - if (texture->format != vk::Format::eR8G8B8A8Unorm || texture->extent.width != widthPow2 || texture->extent.height != heightPow2) + constexpr vk::ImageUsageFlags imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled; + if (!texture->image || texture->format != vk::Format::eR8G8B8A8Unorm + || texture->extent.width != widthPow2 || texture->extent.height != heightPow2 + || (texture->usageFlags & imageUsage) != imageUsage) { texture->extent = vk::Extent2D(widthPow2, heightPow2); texture->format = vk::Format::eR8G8B8A8Unorm; texture->needsStaging = true; - texture->CreateImage(vk::ImageTiling::eOptimal, vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, + texture->CreateImage(vk::ImageTiling::eOptimal, imageUsage, vk::ImageLayout::eUndefined, vk::ImageAspectFlagBits::eColor); colorImageCurrentLayout = vk::ImageLayout::eUndefined; } @@ -492,7 +546,8 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() else GetContext()->WaitIdle(); colorAttachment->Init(widthPow2, heightPow2, vk::Format::eR8G8B8A8Unorm, - vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc); + vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc, + "RTT COLOR ATTACHMENT"); colorImageCurrentLayout = vk::ImageLayout::eUndefined; } else @@ -517,8 +572,8 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass() commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(rttPipelineManager->GetRenderPass(), *framebuffers[GetCurrentImage()], vk::Rect2D( { 0, 0 }, { width, height }), clear_colors), vk::SubpassContents::eInline); commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)upscaledWidth, (float)upscaledHeight, 1.0f, 0.0f)); - u32 minX = pvrrc.fb_X_CLIP.min; - u32 minY = pvrrc.fb_Y_CLIP.min; + u32 minX = pvrrc.getFramebufferMinX() * upscaledWidth / origWidth; + u32 minY = pvrrc.getFramebufferMinY() * upscaledHeight / origHeight; getRenderToTextureDimensions(minX, minY, widthPow2, heightPow2); baseScissor = vk::Rect2D(vk::Offset2D(minX, minY), vk::Extent2D(upscaledWidth, upscaledHeight)); commandBuffer.setScissor(0, baseScissor); @@ -555,12 +610,10 @@ void TextureDrawer::EndRenderPass() currentCommandBuffer.end(); currentCommandBuffer = nullptr; - commandPool->EndFrame(); if (config::RenderToTextureBuffer) { - vk::Fence fence = commandPool->GetCurrentFence(); - GetContext()->GetDevice().waitForFences(fence, true, UINT64_MAX); + commandPool->EndFrameAndWait(); u16 *dst = (u16 *)&vram[textureAddr]; @@ -571,6 +624,7 @@ void TextureDrawer::EndRenderPass() } else { + commandPool->EndFrame(); //memset(&vram[fb_rtt.TexAddr << 3], '\0', size); texture->dirty = 0; @@ -581,15 +635,20 @@ void TextureDrawer::EndRenderPass() void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderManager, const vk::Extent2D& viewport) { + emulateFramebuffer = config::EmulateFramebuffer; this->shaderManager = shaderManager; if (this->viewport != viewport) { - framebuffers.clear(); - colorAttachments.clear(); - depthAttachment.reset(); + if (!framebuffers.empty()) { + verify(commandPool != nullptr); + commandPool->addToFlight(new Deleter(std::move(framebuffers))); + } + if (!colorAttachments.empty()) + commandPool->addToFlight(new Deleter(std::move(colorAttachments))); + if (depthAttachment) + commandPool->addToFlight(new Deleter(depthAttachment.release())); transitionNeeded.clear(); clearNeeded.clear(); - frameRendered = false; } this->viewport = viewport; if (!depthAttachment) @@ -597,7 +656,8 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan depthAttachment = std::make_unique( GetContext()->GetPhysicalDevice(), GetContext()->GetDevice()); depthAttachment->Init(viewport.width, viewport.height, GetContext()->GetDepthFormat(), - vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment); + vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransientAttachment, + "DEPTH ATTACHMENT"); } if (!renderPassLoad) @@ -661,7 +721,8 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan usage |= vk::ImageUsageFlagBits::eTransferSrc; else usage |= vk::ImageUsageFlagBits::eSampled; - colorAttachments.back()->Init(viewport.width, viewport.height, vk::Format::eR8G8B8A8Unorm, usage); + colorAttachments.back()->Init(viewport.width, viewport.height, vk::Format::eR8G8B8A8Unorm, usage, + "COLOR ATTACHMENT " + std::to_string(colorAttachments.size() - 1)); attachments[0] = colorAttachments.back()->GetImageView(); vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), *renderPassLoad, attachments, viewport.width, viewport.height, 1); @@ -680,38 +741,45 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan vk::CommandBuffer ScreenDrawer::BeginRenderPass() { - NewImage(); - vk::CommandBuffer commandBuffer = commandPool->Allocate(); - commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - - if (transitionNeeded[GetCurrentImage()]) + if (!renderPassStarted) { - setImageLayout(commandBuffer, colorAttachments[GetCurrentImage()]->GetImage(), vk::Format::eR8G8B8A8Unorm, - 1, vk::ImageLayout::eUndefined, - config::EmulateFramebuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal); - transitionNeeded[GetCurrentImage()] = false; - } + NewImage(); + frameRendered = false; + vk::CommandBuffer commandBuffer = commandPool->Allocate(true); + commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - vk::RenderPass renderPass = clearNeeded[GetCurrentImage()] ? *renderPassClear : *renderPassLoad; - clearNeeded[GetCurrentImage()] = false; - const std::array clear_colors = { vk::ClearColorValue(std::array { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } }; - commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(renderPass, *framebuffers[GetCurrentImage()], - vk::Rect2D( { 0, 0 }, viewport), clear_colors), vk::SubpassContents::eInline); - commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)viewport.width, (float)viewport.height, 1.0f, 0.0f)); + if (transitionNeeded[GetCurrentImage()]) + { + setImageLayout(commandBuffer, colorAttachments[GetCurrentImage()]->GetImage(), vk::Format::eR8G8B8A8Unorm, + 1, vk::ImageLayout::eUndefined, + emulateFramebuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal); + transitionNeeded[GetCurrentImage()] = false; + } + + vk::RenderPass renderPass = clearNeeded[GetCurrentImage()] || pvrrc.clearFramebuffer ? *renderPassClear : *renderPassLoad; + clearNeeded[GetCurrentImage()] = false; + const std::array clear_colors = { vk::ClearColorValue(std::array { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } }; + commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(renderPass, *framebuffers[GetCurrentImage()], + vk::Rect2D( { 0, 0 }, viewport), clear_colors), vk::SubpassContents::eInline); + currentCommandBuffer = commandBuffer; + renderPassStarted = true; + } + currentCommandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)viewport.width, (float)viewport.height, 1.0f, 0.0f)); matrices.CalcMatrices(&pvrrc, viewport.width, viewport.height); SetBaseScissor(viewport); - commandBuffer.setScissor(0, baseScissor); - currentCommandBuffer = commandBuffer; + currentCommandBuffer.setScissor(0, baseScissor); - return commandBuffer; + return currentCommandBuffer; } void ScreenDrawer::EndRenderPass() { + if (!renderPassStarted) + return; currentCommandBuffer.endRenderPass(); - if (config::EmulateFramebuffer) + if (emulateFramebuffer) { scaleAndWriteFramebuffer(currentCommandBuffer, colorAttachments[GetCurrentImage()].get()); } diff --git a/core/rend/vulkan/drawer.h b/core/rend/vulkan/drawer.h index 863d74d9f..99b1817be 100644 --- a/core/rend/vulkan/drawer.h +++ b/core/rend/vulkan/drawer.h @@ -39,7 +39,7 @@ class BaseDrawer protected: VulkanContext *GetContext() const { return VulkanContext::Instance(); } - TileClipping SetTileClip(u32 val, vk::Rect2D& clipRect); + TileClipping SetTileClip(vk::CommandBuffer cmdBuffer, u32 val, vk::Rect2D& clipRect); void SetBaseScissor(const vk::Extent2D& viewport = vk::Extent2D()); void scaleAndWriteFramebuffer(vk::CommandBuffer commandBuffer, FramebufferAttachment *finalFB); @@ -52,6 +52,48 @@ class BaseDrawer } } + BufferData* GetMainBuffer(u32 size, vk::BufferUsageFlags extraFlags = {}) + { + const vk::BufferUsageFlags usageFlags + { vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eUniformBuffer | extraFlags }; + BufferData *buffer; + if (!mainBuffers.empty()) + { + buffer = mainBuffers.back().release(); + mainBuffers.pop_back(); + if (buffer->bufferSize < size) + { + // FIXME vf4evob still complains about buffer in use after 2 frames. Due to swap chain size of 3 + commandPool->addToFlight(new Deleter(buffer)); + u32 newSize = (u32)buffer->bufferSize; + while (newSize < size) + newSize *= 2; + INFO_LOG(RENDERER, "Increasing main buffer size %zd -> %d", buffer->bufferSize, newSize); + buffer = new BufferData(newSize, usageFlags); + } + } + else { + buffer = new BufferData(std::max(512 * 1024u, size), usageFlags); + } + + class BufferHolder : public Deletable + { + public: + BufferHolder(BufferData *buffer, BaseDrawer *drawer) : buffer(buffer), drawer(drawer) {} + + ~BufferHolder() override { + drawer->mainBuffers.emplace_back(buffer); + } + + private: + BufferData *buffer; + BaseDrawer *drawer; + }; + commandPool->addToFlight(new BufferHolder(buffer, this)); + + return buffer; + } + template T MakeFragmentUniforms() { @@ -167,6 +209,7 @@ class BaseDrawer vk::Rect2D currentScissor; TransformMatrix matrices; CommandPool *commandPool = nullptr; + std::vector> mainBuffers; }; class Drawer : public BaseDrawer @@ -181,7 +224,9 @@ class Drawer : public BaseDrawer } bool Draw(const Texture *fogTexture, const Texture *paletteTexture); - virtual void EndRenderPass() { renderPass++; } + virtual void EndRenderPass() { + renderPassStarted = false; + } vk::CommandBuffer GetCurrentCommandBuffer() const { return currentCommandBuffer; } protected: @@ -196,7 +241,6 @@ class Drawer : public BaseDrawer perStripSorting = config::PerStripSorting; pipelineManager->Reset(); } - renderPass = 0; } void Init(SamplerManager *samplerManager, PipelineManager *pipelineManager) @@ -209,28 +253,9 @@ class Drawer : public BaseDrawer int GetCurrentImage() const { return imageIndex; } - BufferData* GetMainBuffer(u32 size) - { - u32 bufferIndex = imageIndex + renderPass * GetSwapChainSize(); - while (mainBuffers.size() <= bufferIndex) - { - mainBuffers.push_back(std::make_unique(std::max(512 * 1024u, size), - vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eUniformBuffer)); - } - if (mainBuffers[bufferIndex]->bufferSize < size) - { - u32 newSize = (u32)mainBuffers[bufferIndex]->bufferSize; - while (newSize < size) - newSize *= 2; - INFO_LOG(RENDERER, "Increasing main buffer size %d -> %d", (u32)mainBuffers[bufferIndex]->bufferSize, newSize); - mainBuffers[bufferIndex] = std::make_unique(newSize, - vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eUniformBuffer); - } - return mainBuffers[bufferIndex].get(); - } - vk::CommandBuffer currentCommandBuffer; SamplerManager *samplerManager = nullptr; + bool renderPassStarted = false; private: void SortTriangles(); @@ -241,7 +266,6 @@ class Drawer : public BaseDrawer void UploadMainBuffer(const VertexShaderUniforms& vertexUniforms, const FragmentShaderUniforms& fragmentUniforms); int imageIndex = 0; - int renderPass = 0; struct { vk::DeviceSize indexOffset = 0; vk::DeviceSize modVolOffset = 0; @@ -255,9 +279,10 @@ class Drawer : public BaseDrawer vk::DeviceSize lightsOffset = 0; } offsets; DescriptorSets descriptorSets; - std::vector> mainBuffers; + vk::Buffer curMainBuffer; PipelineManager *pipelineManager = nullptr; bool perStripSorting = false; + bool dithering = false; }; class ScreenDrawer : public Drawer @@ -273,6 +298,8 @@ class ScreenDrawer : public Drawer framebuffers.clear(); colorAttachments.clear(); depthAttachment.reset(); + transitionNeeded.clear(); + clearNeeded.clear(); Drawer::Term(); } @@ -280,6 +307,7 @@ class ScreenDrawer : public Drawer void EndRenderPass() override; bool PresentFrame() { + EndRenderPass(); if (!frameRendered) return false; frameRendered = false; @@ -307,6 +335,7 @@ class ScreenDrawer : public Drawer std::vector clearNeeded; bool frameRendered = false; float aspectRatio = 0.f; + bool emulateFramebuffer = false; }; class TextureDrawer : public Drawer diff --git a/core/rend/vulkan/oit/oit_drawer.cpp b/core/rend/vulkan/oit/oit_drawer.cpp index 54ff60c0f..33eee1523 100644 --- a/core/rend/vulkan/oit/oit_drawer.cpp +++ b/core/rend/vulkan/oit/oit_drawer.cpp @@ -28,12 +28,11 @@ void OITDrawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool autosort, Pass pass, const PolyParam& poly, u32 first, u32 count) { + static const float scopeColor[4] = { 0.25f, 0.50f, 0.25f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawPoly(OIT)", scopeColor); + vk::Rect2D scissorRect; - TileClipping tileClip = SetTileClip(poly.tileclip, scissorRect); - if (tileClip == TileClipping::Outside) - SetScissor(cmdBuffer, scissorRect); - else - SetScissor(cmdBuffer, baseScissor); + SetTileClip(cmdBuffer, poly.tileclip, scissorRect); float trilinearAlpha = 1.f; if (poly.tsp.FilterMode > 1 && poly.pcw.Texture && listType != ListType_Punch_Through && poly.tcw.MipMapped == 1) @@ -46,13 +45,20 @@ void OITDrawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool bool twoVolumes = poly.tsp1.full != (u32)-1 || poly.tcw1.full != (u32)-1; - bool gpuPalette = poly.texture != nullptr ? poly.texture->gpuPalette : false; - + int gpuPalette = poly.texture == nullptr || !poly.texture->gpuPalette ? 0 + : poly.tsp.FilterMode + 1; float palette_index = 0.f; - if (poly.tcw.PixelFmt == PixelPal4) - palette_index = float(poly.tcw.PalSelect << 4) / 1023.f; - else - palette_index = float((poly.tcw.PalSelect >> 4) << 8) / 1023.f; + if (gpuPalette != 0) + { + if (config::TextureFiltering == 1) + gpuPalette = 1; // force nearest + else if (config::TextureFiltering == 2) + gpuPalette = 2; // force linear + if (poly.tcw.PixelFmt == PixelPal4) + palette_index = float(poly.tcw.PalSelect << 4) / 1023.f; + else + palette_index = float((poly.tcw.PalSelect >> 4) << 8) / 1023.f; + } OITDescriptorSets::PushConstants pushConstants = { { @@ -111,7 +117,8 @@ void OITDrawer::DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool break; } } - descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, poly, polyNumber, *GetMainBuffer(0)->buffer, offset, offsets.lightsOffset); + descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, poly, polyNumber, curMainBuffer, offset, offsets.lightsOffset, + listType == ListType_Punch_Through); } vk::Pipeline pipeline = pipelineManager->GetPipeline(listType, autosort, poly, pass, gpuPalette); @@ -125,6 +132,10 @@ void OITDrawer::DrawList(const vk::CommandBuffer& cmdBuffer, u32 listType, bool { if (first == last) return; + + static const float scopeColor[4] = { 0.50f, 0.25f, 0.50f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawList(OIT)", scopeColor); + const PolyParam *pp_end = polys.data() + last; for (const PolyParam *pp = &polys[first]; pp != pp_end; pp++) if (pp->count > 2) @@ -137,8 +148,10 @@ void OITDrawer::DrawModifierVolumes(const vk::CommandBuffer& cmdBuffer, int firs if (count == 0 || pvrrc.modtrig.empty() || !config::ModifierVolumes) return; - vk::Buffer buffer = GetMainBuffer(0)->buffer.get(); - cmdBuffer.bindVertexBuffers(0, buffer, offsets.modVolOffset); + static const float scopeColor[4] = { 0.75f, 0.25f, 0.25f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "DrawModVols(OIT)", scopeColor); + + cmdBuffer.bindVertexBuffers(0, curMainBuffer, offsets.modVolOffset); SetScissor(cmdBuffer, baseScissor); const ModifierVolumeParam *params = &modVolParams[first]; @@ -179,7 +192,7 @@ void OITDrawer::DrawModifierVolumes(const vk::CommandBuffer& cmdBuffer, int firs cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); vk::DeviceSize uniformOffset = Translucent ? offsets.naomi2TrModVolOffset : offsets.naomi2ModVolOffset; - descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, param, first + cmv, *GetMainBuffer(0)->buffer, uniformOffset); + descriptorSets.bindPerPolyDescriptorSets(cmdBuffer, param, first + cmv, curMainBuffer, uniformOffset); cmdBuffer.draw(param.count * 3, 1, param.first * 3, 0); @@ -207,7 +220,7 @@ void OITDrawer::DrawModifierVolumes(const vk::CommandBuffer& cmdBuffer, int firs } } } - cmdBuffer.bindVertexBuffers(0, buffer, {0}); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); } void OITDrawer::UploadMainBuffer(const OITDescriptorSets::VertexShaderUniforms& vertexUniforms, @@ -251,18 +264,39 @@ void OITDrawer::UploadMainBuffer(const OITDescriptorSets::VertexShaderUniforms& BufferData *buffer = GetMainBuffer(packer.size()); packer.upload(*buffer); + curMainBuffer = buffer->buffer.get(); +} + +vk::Framebuffer OITTextureDrawer::getFramebuffer(int renderPass, int renderPassCount) +{ + if (renderPass < renderPassCount - 1) + { + framebufferIndex = (renderPassCount - renderPass) % 2; + return *tempFramebuffers[framebufferIndex]; + } + else { + framebufferIndex = 0; + return *framebuffer; + } } bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) { vk::CommandBuffer cmdBuffer = NewFrame(); - if (needDepthTransition) + static const float scopeColor[4] = { 0.75f, 0.75f, 0.75f, 1.0f }; + CommandBufferDebugScope _(cmdBuffer, "Draw(OIT)", scopeColor); + + if (needAttachmentTransition) { - needDepthTransition = false; + needAttachmentTransition = false; // Not convinced that this is really needed but it makes validation layers happy + for (auto& attachment : colorAttachments) + setImageLayout(cmdBuffer, attachment->GetImage(), vk::Format::eR8G8B8A8Unorm, 1, + vk::ImageLayout::eUndefined, getAttachmentInitialLayout()); for (auto& attachment : depthAttachments) - setImageLayout(cmdBuffer, attachment->GetImage(), GetContext()->GetDepthFormat(), 1, vk::ImageLayout::eUndefined, vk::ImageLayout::eDepthStencilReadOnlyOptimal); + setImageLayout(cmdBuffer, attachment->GetImage(), GetContext()->GetDepthFormat(), 1, + vk::ImageLayout::eUndefined, vk::ImageLayout::eDepthStencilReadOnlyOptimal); } OITDescriptorSets::VertexShaderUniforms vtxUniforms; @@ -273,13 +307,44 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) // sizeof(Pixel) == 16 fragUniforms.pixelBufferSize = std::min(config::PixelBufferSize, GetContext()->GetMaxMemoryAllocationSize()) / 16; fragUniforms.viewportWidth = maxWidth; + dithering = config::EmulateFramebuffer && pvrrc.fb_W_CTRL.fb_dither && pvrrc.fb_W_CTRL.fb_packmode <= 3; + if (dithering) + { + switch (pvrrc.fb_W_CTRL.fb_packmode) + { + case 0: // 0555 KRGB 16 bit + case 3: // 1555 ARGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[1] = fragUniforms.ditherColorMax[2] = 31.f; + fragUniforms.ditherColorMax[3] = 255.f; + break; + case 1: // 565 RGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[2] = 31.f; + fragUniforms.ditherColorMax[1] = 63.f; + fragUniforms.ditherColorMax[3] = 255.f; + break; + case 2: // 4444 ARGB 16 bit + fragUniforms.ditherColorMax[0] = fragUniforms.ditherColorMax[1] + = fragUniforms.ditherColorMax[2] = fragUniforms.ditherColorMax[3] = 15.f; + break; + default: + break; + } + } currentScissor = vk::Rect2D(); bool firstFrameAfterInit = oitBuffers->isFirstFrameAfterInit(); oitBuffers->OnNewFrame(cmdBuffer); - setFirstProvokingVertex(pvrrc); + if (VulkanContext::Instance()->hasProvokingVertex()) + { + // Pipelines are using VK_EXT_provoking_vertex, no need to + // re-order vertices + } + else + { + setFirstProvokingVertex(pvrrc); + } // Upload vertex and index buffers UploadMainBuffer(vtxUniforms, fragUniforms); @@ -287,8 +352,7 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) quadBuffer->Update(); // Update per-frame descriptor set and bind it - const vk::Buffer mainBuffer = GetMainBuffer(0)->buffer.get(); - descriptorSets.updateUniforms(mainBuffer, (u32)offsets.vertexUniformOffset, (u32)offsets.fragmentUniformOffset, + descriptorSets.updateUniforms(curMainBuffer, (u32)offsets.vertexUniformOffset, (u32)offsets.fragmentUniformOffset, fogTexture->GetImageView(), (u32)offsets.polyParamsOffset, (u32)offsets.polyParamsSize, depthAttachments[0]->GetStencilView(), depthAttachments[0]->GetImageView(), paletteTexture->GetImageView(), oitBuffers); @@ -297,8 +361,8 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) descriptorSets.updateColorInputDescSet(1, colorAttachments[1]->GetImageView()); // Bind vertex and index buffers - cmdBuffer.bindVertexBuffers(0, mainBuffer, {0}); - cmdBuffer.bindIndexBuffer(mainBuffer, offsets.indexOffset, vk::IndexType::eUint32); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); + cmdBuffer.bindIndexBuffer(curMainBuffer, offsets.indexOffset, vk::IndexType::eUint32); // Make sure to push constants even if not used OITDescriptorSets::PushConstants pushConstants = { }; @@ -333,63 +397,29 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) const bool initialPass = render_pass == 0; const bool finalPass = render_pass == (int)pvrrc.render_passes.size() - 1; - vk::Framebuffer targetFramebuffer; - if (!finalPass) - targetFramebuffer = *tempFramebuffers[(pvrrc.render_passes.size() - 1 - render_pass) % 2]; - else - targetFramebuffer = GetFinalFramebuffer(); + vk::Framebuffer targetFramebuffer = getFramebuffer(render_pass, pvrrc.render_passes.size()); cmdBuffer.beginRenderPass( - vk::RenderPassBeginInfo(pipelineManager->GetRenderPass(initialPass, finalPass), + vk::RenderPassBeginInfo(pipelineManager->GetRenderPass(initialPass, finalPass, initialPass && pvrrc.clearFramebuffer), targetFramebuffer, viewport, clear_colors), vk::SubpassContents::eInline); - if (!pvrrc.isRTT && (FB_R_CTRL.fb_enable == 0 || VO_CONTROL.blank_video == 1)) - { - // Video output disabled - cmdBuffer.nextSubpass(vk::SubpassContents::eInline); - } - else - { - // Depth + stencil subpass - DrawList(cmdBuffer, ListType_Opaque, false, Pass::Depth, pvrrc.global_param_op, previous_pass.op_count, current_pass.op_count); - DrawList(cmdBuffer, ListType_Punch_Through, false, Pass::Depth, pvrrc.global_param_pt, previous_pass.pt_count, current_pass.pt_count); + // Depth + stencil subpass + DrawList(cmdBuffer, ListType_Opaque, false, Pass::Depth, pvrrc.global_param_op, previous_pass.op_count, current_pass.op_count); + DrawList(cmdBuffer, ListType_Punch_Through, false, Pass::Depth, pvrrc.global_param_pt, previous_pass.pt_count, current_pass.pt_count); - DrawModifierVolumes(cmdBuffer, previous_pass.mvo_count, current_pass.mvo_count - previous_pass.mvo_count, pvrrc.global_param_mvo.data()); + DrawModifierVolumes(cmdBuffer, previous_pass.mvo_count, current_pass.mvo_count - previous_pass.mvo_count, pvrrc.global_param_mvo.data()); - // Color subpass - cmdBuffer.nextSubpass(vk::SubpassContents::eInline); - - // OP + PT - DrawList(cmdBuffer, ListType_Opaque, false, Pass::Color, pvrrc.global_param_op, previous_pass.op_count, current_pass.op_count); - DrawList(cmdBuffer, ListType_Punch_Through, false, Pass::Color, pvrrc.global_param_pt, previous_pass.pt_count, current_pass.pt_count); - - // TR - if (current_pass.autosort) - { - if (!firstFrameAfterInit) - DrawList(cmdBuffer, ListType_Translucent, true, Pass::OIT, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); - } - else - DrawList(cmdBuffer, ListType_Translucent, false, Pass::Color, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); - } - - // Final subpass + // Color subpass cmdBuffer.nextSubpass(vk::SubpassContents::eInline); - descriptorSets.bindColorInputDescSet(cmdBuffer, (pvrrc.render_passes.size() - 1 - render_pass) % 2); - if (initialPass && !pvrrc.isRTT && clearNeeded[GetCurrentImage()]) - { - clearNeeded[GetCurrentImage()] = false; - SetScissor(cmdBuffer, viewport); - cmdBuffer.clearAttachments(vk::ClearAttachment(vk::ImageAspectFlagBits::eColor, 0, clear_colors[0]), - vk::ClearRect(viewport, 0, 1)); - } - SetScissor(cmdBuffer, baseScissor); + // OP + PT + DrawList(cmdBuffer, ListType_Opaque, false, Pass::Color, pvrrc.global_param_op, previous_pass.op_count, current_pass.op_count); + DrawList(cmdBuffer, ListType_Punch_Through, false, Pass::Color, pvrrc.global_param_pt, previous_pass.pt_count, current_pass.pt_count); + // TR if (firstFrameAfterInit) { - // missing the transparent stuff on the first frame cuz I'm lazy - // Clear + // Clear abuffers cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipelineManager->GetClearPipeline()); quadBuffer->Bind(cmdBuffer); quadBuffer->Draw(cmdBuffer); @@ -397,8 +427,27 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) vk::MemoryBarrier memoryBarrier(vk::AccessFlagBits::eShaderWrite, vk::AccessFlagBits::eShaderRead); cmdBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eFragmentShader, vk::DependencyFlagBits::eByRegion, memoryBarrier, nullptr, nullptr); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); firstFrameAfterInit = false; } + if (current_pass.autosort) + DrawList(cmdBuffer, ListType_Translucent, true, Pass::OIT, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); + else + DrawList(cmdBuffer, ListType_Translucent, false, Pass::Color, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); + + // Final subpass + cmdBuffer.nextSubpass(vk::SubpassContents::eInline); + // Bind the input attachment (OP+PT) + descriptorSets.bindColorInputDescSet(cmdBuffer, 1 - getFramebufferIndex()); + + if (initialPass && !pvrrc.isRTT && clearNeeded[getFramebufferIndex()]) + { + clearNeeded[getFramebufferIndex()] = false; + SetScissor(cmdBuffer, viewport); + cmdBuffer.clearAttachments(vk::ClearAttachment(vk::ImageAspectFlagBits::eColor, 0, clear_colors[0]), + vk::ClearRect(viewport, 0, 1)); + } + // Tr modifier volumes if (GetContext()->GetVendorID() != VulkanContext::VENDOR_QUALCOMM) // Adreno bug { @@ -408,7 +457,8 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) DrawModifierVolumes(cmdBuffer, previous_pass.mvo_tr_count, current_pass.mvo_tr_count - previous_pass.mvo_tr_count, pvrrc.global_param_mvo_tr.data()); } - vk::Pipeline pipeline = pipelineManager->GetFinalPipeline(); + SetScissor(cmdBuffer, viewport); + vk::Pipeline pipeline = pipelineManager->GetFinalPipeline(dithering && finalPass); cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline); quadBuffer->Bind(cmdBuffer); quadBuffer->Draw(cmdBuffer); @@ -416,62 +466,80 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture) if (!finalPass) { // Re-bind vertex and index buffers - cmdBuffer.bindVertexBuffers(0, mainBuffer, {0}); - cmdBuffer.bindIndexBuffer(mainBuffer, offsets.indexOffset, vk::IndexType::eUint32); + cmdBuffer.bindVertexBuffers(0, curMainBuffer, {0}); + cmdBuffer.bindIndexBuffer(curMainBuffer, offsets.indexOffset, vk::IndexType::eUint32); // Tr depth-only pass DrawList(cmdBuffer, ListType_Translucent, current_pass.autosort, Pass::Depth, pvrrc.global_param_tr, previous_pass.tr_count, current_pass.tr_count); - - cmdBuffer.endRenderPass(); } + cmdBuffer.endRenderPass(); previous_pass = current_pass; } + curMainBuffer = nullptr; return !pvrrc.isRTT; } -void OITDrawer::MakeBuffers(int width, int height) +void OITDrawer::MakeBuffers(int width, int height, vk::ImageUsageFlags colorUsage) { oitBuffers->Init(width, height); - if (width <= maxWidth && height <= maxHeight) + if (width <= maxWidth && height <= maxHeight && colorUsage == currentBufferUsage) return; maxWidth = std::max(maxWidth, width); maxHeight = std::max(maxHeight, height); + currentBufferUsage = colorUsage; + + for (auto& framebuffer : tempFramebuffers) { + if (framebuffer) + commandPool->addToFlight(new Deleter(std::move(framebuffer))); + } - GetContext()->WaitIdle(); + vk::Device device = GetContext()->GetDevice(); + vk::ImageUsageFlags usage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eInputAttachment + | colorUsage; for (auto& attachment : colorAttachments) { - attachment.reset(); + if (attachment) + commandPool->addToFlight(new Deleter(std::move(attachment))); attachment = std::make_unique( - GetContext()->GetPhysicalDevice(), GetContext()->GetDevice()); - attachment->Init(maxWidth, maxHeight, vk::Format::eR8G8B8A8Unorm, - vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eInputAttachment); + GetContext()->GetPhysicalDevice(), device); + attachment->Init(maxWidth, maxHeight, vk::Format::eR8G8B8A8Unorm, usage, + "COLOR ATTACHMENT " + std::to_string(&attachment - &colorAttachments[0])); } for (auto& attachment : depthAttachments) { - attachment.reset(); + if (attachment) + commandPool->addToFlight(new Deleter(std::move(attachment))); attachment = std::make_unique( - GetContext()->GetPhysicalDevice(), GetContext()->GetDevice()); + GetContext()->GetPhysicalDevice(), device); attachment->Init(maxWidth, maxHeight, GetContext()->GetDepthFormat(), - vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eInputAttachment); + vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eInputAttachment, + "DEPTH ATTACHMENT" + std::to_string(&attachment - &depthAttachments[0])); } - needDepthTransition = true; + needAttachmentTransition = true; std::array attachments = { - colorAttachments[1]->GetImageView(), colorAttachments[0]->GetImageView(), + colorAttachments[1]->GetImageView(), depthAttachments[0]->GetImageView(), depthAttachments[1]->GetImageView(), }; vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), pipelineManager->GetRenderPass(true, true), attachments, maxWidth, maxHeight, 1); - tempFramebuffers[0] = GetContext()->GetDevice().createFramebufferUnique(createInfo); + tempFramebuffers[0] = device.createFramebufferUnique(createInfo); attachments[0] = attachments[1]; - attachments[1] = colorAttachments[1]->GetImageView(); - tempFramebuffers[1] = GetContext()->GetDevice().createFramebufferUnique(createInfo); + attachments[1] = colorAttachments[0]->GetImageView(); + tempFramebuffers[1] = device.createFramebufferUnique(createInfo); +} + +vk::Framebuffer OITScreenDrawer::getFramebuffer(int renderPass, int renderPassCount) +{ + framebufferIndex = 1 - framebufferIndex; + vk::Framebuffer framebuffer = tempFramebuffers[framebufferIndex].get(); + return framebuffer; } void OITScreenDrawer::MakeFramebuffers(const vk::Extent2D& viewport) @@ -480,35 +548,12 @@ void OITScreenDrawer::MakeFramebuffers(const vk::Extent2D& viewport) this->viewport.offset.y = 0; this->viewport.extent = viewport; - MakeBuffers(viewport.width, viewport.height); - framebuffers.clear(); - finalColorAttachments.clear(); - transitionNeeded.clear(); - clearNeeded.clear(); + // make sure all attachments have the same dimensions + maxWidth = 0; + maxHeight = 0; + MakeBuffers(viewport.width, viewport.height, emulateFramebuffer ? vk::ImageUsageFlagBits::eTransferSrc : vk::ImageUsageFlagBits::eSampled); - vk::ImageUsageFlags usage = vk::ImageUsageFlagBits::eColorAttachment; - if (config::EmulateFramebuffer) - usage |= vk::ImageUsageFlagBits::eTransferSrc; - else - usage |= vk::ImageUsageFlagBits::eSampled; - while (finalColorAttachments.size() < GetSwapChainSize()) - { - finalColorAttachments.push_back(std::make_unique( - GetContext()->GetPhysicalDevice(), GetContext()->GetDevice())); - finalColorAttachments.back()->Init(viewport.width, viewport.height, vk::Format::eR8G8B8A8Unorm, - usage); - std::array attachments = { - finalColorAttachments.back()->GetImageView(), - colorAttachments[0]->GetImageView(), - depthAttachments[0]->GetImageView(), - depthAttachments[1]->GetImageView(), - }; - vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), screenPipelineManager->GetRenderPass(true, true), - attachments, viewport.width, viewport.height, 1); - framebuffers.push_back(GetContext()->GetDevice().createFramebufferUnique(createInfo)); - transitionNeeded.push_back(true); - clearNeeded.push_back(true); - } + clearNeeded = { true, true }; } vk::CommandBuffer OITTextureDrawer::NewFrame() @@ -532,10 +577,10 @@ vk::CommandBuffer OITTextureDrawer::NewFrame() VulkanContext *context = GetContext(); vk::Device device = context->GetDevice(); - vk::CommandBuffer commandBuffer = commandPool->Allocate(); + vk::CommandBuffer commandBuffer = commandPool->Allocate(true); commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - MakeBuffers(widthPow2, heightPow2); + MakeBuffers(widthPow2, heightPow2, config::RenderToTextureBuffer ? vk::ImageUsageFlagBits::eTransferSrc : vk::ImageUsageFlagBits::eSampled); vk::ImageView colorImageView; vk::ImageLayout colorImageCurrentLayout; @@ -543,19 +588,22 @@ vk::CommandBuffer OITTextureDrawer::NewFrame() if (!config::RenderToTextureBuffer) { texture = textureCache->getRTTexture(textureAddr, pvrrc.fb_W_CTRL.fb_packmode, origWidth, origHeight); - if (textureCache->IsInFlight(texture)) + if (textureCache->IsInFlight(texture, false)) { texture->readOnlyImageView = *texture->imageView; - textureCache->DestroyLater(texture); + texture->deferDeleteResource(commandPool); } textureCache->SetInFlight(texture); - if (texture->format != vk::Format::eR8G8B8A8Unorm || texture->extent.width != widthPow2 || texture->extent.height != heightPow2) + constexpr vk::ImageUsageFlags imageUsage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled; + if (!texture->image || texture->format != vk::Format::eR8G8B8A8Unorm + || texture->extent.width != widthPow2 || texture->extent.height != heightPow2 + || (texture->usageFlags & imageUsage) != imageUsage) { texture->extent = vk::Extent2D(widthPow2, heightPow2); texture->format = vk::Format::eR8G8B8A8Unorm; texture->needsStaging = true; - texture->CreateImage(vk::ImageTiling::eOptimal, vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, + texture->CreateImage(vk::ImageTiling::eOptimal, imageUsage, vk::ImageLayout::eUndefined, vk::ImageAspectFlagBits::eColor); colorImageCurrentLayout = vk::ImageLayout::eUndefined; } @@ -575,7 +623,8 @@ vk::CommandBuffer OITTextureDrawer::NewFrame() else GetContext()->WaitIdle(); colorAttachment->Init(widthPow2, heightPow2, vk::Format::eR8G8B8A8Unorm, - vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc); + vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc, + "RTT COLOR ATTACHMENT"); colorImageCurrentLayout = vk::ImageLayout::eUndefined; } else @@ -592,17 +641,18 @@ vk::CommandBuffer OITTextureDrawer::NewFrame() std::array imageViews = { colorImageView, - colorAttachments[0]->GetImageView(), + colorAttachments[1]->GetImageView(), depthAttachments[0]->GetImageView(), depthAttachments[1]->GetImageView(), }; - framebuffers.resize(GetSwapChainSize()); - framebuffers[GetCurrentImage()] = device.createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), + if (framebuffer) + commandPool->addToFlight(new Deleter(std::move(framebuffer))); + framebuffer = device.createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), rttPipelineManager->GetRenderPass(true, true), imageViews, widthPow2, heightPow2, 1)); commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)upscaledWidth, (float)upscaledHeight, 1.0f, 0.0f)); - u32 minX = pvrrc.fb_X_CLIP.min; - u32 minY = pvrrc.fb_Y_CLIP.min; + u32 minX = pvrrc.getFramebufferMinX() * upscaledWidth / origWidth; + u32 minY = pvrrc.getFramebufferMinY() * upscaledHeight / origHeight; getRenderToTextureDimensions(minX, minY, widthPow2, heightPow2); baseScissor = vk::Rect2D(vk::Offset2D(minX, minY), vk::Extent2D(upscaledWidth, upscaledHeight)); commandBuffer.setScissor(0, baseScissor); @@ -613,8 +663,6 @@ vk::CommandBuffer OITTextureDrawer::NewFrame() void OITTextureDrawer::EndFrame() { - currentCommandBuffer.endRenderPass(); - u32 clippedWidth = pvrrc.getFramebufferWidth(); u32 clippedHeight = pvrrc.getFramebufferHeight(); @@ -641,12 +689,10 @@ void OITTextureDrawer::EndFrame() colorImage = nullptr; currentCommandBuffer = nullptr; - commandPool->EndFrame(); if (config::RenderToTextureBuffer) { - vk::Fence fence = commandPool->GetCurrentFence(); - GetContext()->GetDevice().waitForFences(fence, true, UINT64_MAX); + commandPool->EndFrameAndWait(); u16 *dst = (u16 *)&vram[textureAddr]; @@ -657,35 +703,30 @@ void OITTextureDrawer::EndFrame() } else { + commandPool->EndFrame(); //memset(&vram[fb_rtt.TexAddr << 3], '\0', size); texture->dirty = 0; texture->unprotectVRam(); } - OITDrawer::EndFrame(); } vk::CommandBuffer OITScreenDrawer::NewFrame() { - frameRendered = false; - NewImage(); - vk::CommandBuffer commandBuffer = commandPool->Allocate(); - commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - - if (transitionNeeded[GetCurrentImage()]) + if (!frameStarted) { - setImageLayout(commandBuffer, finalColorAttachments[GetCurrentImage()]->GetImage(), vk::Format::eR8G8B8A8Unorm, 1, - vk::ImageLayout::eUndefined, - config::EmulateFramebuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal); - transitionNeeded[GetCurrentImage()] = false; + frameStarted = true; + frameRendered = false; + NewImage(); + currentCommandBuffer = commandPool->Allocate(true); + currentCommandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); } matrices.CalcMatrices(&pvrrc, viewport.extent.width, viewport.extent.height); SetBaseScissor(viewport.extent); - commandBuffer.setScissor(0, baseScissor); - commandBuffer.setViewport(0, vk::Viewport((float)viewport.offset.x, (float)viewport.offset.y, (float)viewport.extent.width, (float)viewport.extent.height, 1.0f, 0.0f)); - currentCommandBuffer = commandBuffer; + currentCommandBuffer.setScissor(0, baseScissor); + currentCommandBuffer.setViewport(0, vk::Viewport((float)viewport.offset.x, (float)viewport.offset.y, (float)viewport.extent.width, (float)viewport.extent.height, 1.0f, 0.0f)); - return commandBuffer; + return currentCommandBuffer; } diff --git a/core/rend/vulkan/oit/oit_drawer.h b/core/rend/vulkan/oit/oit_drawer.h index 3b2d92d4b..7ea1a5613 100644 --- a/core/rend/vulkan/oit/oit_drawer.h +++ b/core/rend/vulkan/oit/oit_drawer.h @@ -41,10 +41,9 @@ class OITDrawer : public BaseDrawer bool Draw(const Texture *fogTexture, const Texture *paletteTexture); virtual vk::CommandBuffer NewFrame() = 0; - virtual void EndFrame() { renderPass++; }; + virtual void EndFrame() = 0; protected: - u32 GetSwapChainSize() { return 2; } void Init(SamplerManager *samplerManager, OITPipelineManager *pipelineManager, OITBuffers *oitBuffers) { this->pipelineManager = pipelineManager; @@ -73,45 +72,28 @@ class OITDrawer : public BaseDrawer maxHeight = 0; } - int GetCurrentImage() const { return imageIndex; } - - void NewImage() - { + void NewImage() { descriptorSets.nextFrame(); - imageIndex = (imageIndex + 1) % GetSwapChainSize(); - renderPass = 0; } - BufferData* GetMainBuffer(u32 size) - { - u32 bufferIndex = imageIndex + renderPass * GetSwapChainSize(); - while (mainBuffers.size() <= bufferIndex) - { - mainBuffers.push_back(std::make_unique(std::max(512 * 1024u, size), - vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eUniformBuffer - | vk::BufferUsageFlagBits::eStorageBuffer)); - } - if (mainBuffers[bufferIndex]->bufferSize < size) - { - u32 newSize = (u32)mainBuffers[bufferIndex]->bufferSize; - while (newSize < size) - newSize *= 2; - INFO_LOG(RENDERER, "Increasing main buffer size %d -> %d", (u32)mainBuffers[bufferIndex]->bufferSize, newSize); - mainBuffers[bufferIndex] = std::make_unique(newSize, - vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eUniformBuffer - | vk::BufferUsageFlagBits::eStorageBuffer); - } - return mainBuffers[bufferIndex].get(); + BufferData* GetMainBuffer(u32 size) { + return BaseDrawer::GetMainBuffer(size, vk::BufferUsageFlagBits::eStorageBuffer); } - void MakeBuffers(int width, int height); - virtual vk::Framebuffer GetFinalFramebuffer() const = 0; + void MakeBuffers(int width, int height, vk::ImageUsageFlags colorUsage = {}); + virtual vk::Framebuffer getFramebuffer(int renderPass, int renderPassCount) = 0; + int getFramebufferIndex() { return framebufferIndex; } + virtual vk::ImageLayout getAttachmentInitialLayout() = 0; vk::Rect2D viewport; std::array, 2> colorAttachments; std::array, 2> depthAttachments; + std::array tempFramebuffers; vk::CommandBuffer currentCommandBuffer; std::vector clearNeeded; + int maxWidth = 0; + int maxHeight = 0; + int framebufferIndex = 0; private: void DrawPoly(const vk::CommandBuffer& cmdBuffer, u32 listType, bool autosort, Pass pass, @@ -140,18 +122,14 @@ class OITDrawer : public BaseDrawer std::unique_ptr quadBuffer; - std::array tempFramebuffers; - OITPipelineManager *pipelineManager = nullptr; SamplerManager *samplerManager = nullptr; OITBuffers *oitBuffers = nullptr; - int maxWidth = 0; - int maxHeight = 0; - bool needDepthTransition = false; - int imageIndex = 0; - int renderPass = 0; + bool needAttachmentTransition = false; OITDescriptorSets descriptorSets; - std::vector> mainBuffers; + vk::Buffer curMainBuffer; + bool dithering = false; + vk::ImageUsageFlags currentBufferUsage {}; }; class OITScreenDrawer : public OITDrawer @@ -160,9 +138,11 @@ class OITScreenDrawer : public OITDrawer void Init(SamplerManager *samplerManager, OITShaderManager *shaderManager, OITBuffers *oitBuffers, const vk::Extent2D& viewport) { - if (!screenPipelineManager) + emulateFramebuffer = config::EmulateFramebuffer; + if (!screenPipelineManager) { screenPipelineManager = std::make_unique(); - screenPipelineManager->Init(shaderManager, oitBuffers); + screenPipelineManager->Init(shaderManager, oitBuffers); + } OITDrawer::Init(samplerManager, screenPipelineManager.get(), oitBuffers); MakeFramebuffers(viewport); @@ -171,8 +151,6 @@ class OITScreenDrawer : public OITDrawer void Term() { screenPipelineManager.reset(); - framebuffers.clear(); - finalColorAttachments.clear(); OITDrawer::Term(); } @@ -180,10 +158,11 @@ class OITScreenDrawer : public OITDrawer void EndFrame() override { - currentCommandBuffer.endRenderPass(); - if (config::EmulateFramebuffer) - { - scaleAndWriteFramebuffer(currentCommandBuffer, finalColorAttachments[GetCurrentImage()].get()); + if (!frameStarted) + return; + frameStarted = false; + if (emulateFramebuffer) { + scaleAndWriteFramebuffer(currentCommandBuffer, colorAttachments[framebufferIndex].get()); } else { @@ -192,17 +171,17 @@ class OITScreenDrawer : public OITDrawer aspectRatio = getOutputFramebufferAspectRatio(); } currentCommandBuffer = nullptr; - OITDrawer::EndFrame(); frameRendered = true; } bool PresentFrame() { + EndFrame(); if (!frameRendered) return false; frameRendered = false; - GetContext()->PresentFrame(finalColorAttachments[GetCurrentImage()]->GetImage(), - finalColorAttachments[GetCurrentImage()]->GetImageView(), viewport.extent, aspectRatio); + GetContext()->PresentFrame(colorAttachments[framebufferIndex]->GetImage(), + colorAttachments[framebufferIndex]->GetImageView(), viewport.extent, aspectRatio); return true; } @@ -210,17 +189,19 @@ class OITScreenDrawer : public OITDrawer vk::CommandBuffer GetCurrentCommandBuffer() const { return currentCommandBuffer; } protected: - vk::Framebuffer GetFinalFramebuffer() const override { return *framebuffers[GetCurrentImage()]; } + vk::Framebuffer getFramebuffer(int renderPass, int renderPassCount) override; + vk::ImageLayout getAttachmentInitialLayout() override { + return emulateFramebuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal; + } private: void MakeFramebuffers(const vk::Extent2D& viewport); - std::vector> finalColorAttachments; - std::vector framebuffers; std::unique_ptr screenPipelineManager; - std::vector transitionNeeded; bool frameRendered = false; float aspectRatio = 0.f; + bool frameStarted = false; + bool emulateFramebuffer = false; }; class OITTextureDrawer : public OITDrawer @@ -238,8 +219,8 @@ class OITTextureDrawer : public OITDrawer } void Term() { + framebuffer.reset(); colorAttachment.reset(); - framebuffers.clear(); rttPipelineManager.reset(); OITDrawer::Term(); } @@ -248,7 +229,10 @@ class OITTextureDrawer : public OITDrawer protected: vk::CommandBuffer NewFrame() override; - vk::Framebuffer GetFinalFramebuffer() const override { return *framebuffers[GetCurrentImage()]; } + vk::Framebuffer getFramebuffer(int renderPass, int renderPassCount) override; + vk::ImageLayout getAttachmentInitialLayout() override { + return config::RenderToTextureBuffer ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal; + } private: u32 textureAddr = 0; @@ -256,8 +240,8 @@ class OITTextureDrawer : public OITDrawer Texture *texture = nullptr; vk::Image colorImage; std::unique_ptr colorAttachment; - std::vector framebuffers; std::unique_ptr rttPipelineManager; + vk::UniqueFramebuffer framebuffer; TextureCache *textureCache = nullptr; }; diff --git a/core/rend/vulkan/oit/oit_pipeline.cpp b/core/rend/vulkan/oit/oit_pipeline.cpp index 12eede501..312941a4f 100644 --- a/core/rend/vulkan/oit/oit_pipeline.cpp +++ b/core/rend/vulkan/oit/oit_pipeline.cpp @@ -21,9 +21,9 @@ #include "oit_pipeline.h" #include "../quad.h" -void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, bool gpuPalette) +void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, int gpuPalette) { - vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(); + vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(true, pp.isNaomi2()); // Input assembly state vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(), @@ -49,6 +49,17 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP 0.0f, // depthBiasSlopeFactor 1.0f // lineWidth ); + + // Dreamcast uses the last vertex as the provoking vertex, but Vulkan uses the first. + // Utilize VK_EXT_provoking_vertex when available to set the provoking vertex to be the + // last vertex + vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT provokingVertexInfo{}; + if (GetContext()->hasProvokingVertex()) + { + provokingVertexInfo.provokingVertexMode = vk::ProvokingVertexModeEXT::eLastVertex; + pipelineRasterizationStateCreateInfo.pNext = &provokingVertexInfo; + } + vk::PipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo; // Depth and stencil @@ -90,10 +101,10 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP // Color flags and blending vk::PipelineColorBlendAttachmentState pipelineColorBlendAttachmentState; + vk::ColorComponentFlags colorComponentFlags(vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA); // Apparently punch-through polys support blending, or at least some combinations if (listType == ListType_Punch_Through || pass == Pass::Color) { - vk::ColorComponentFlags colorComponentFlags(vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA); u32 src = pp.tsp.SrcInstr; u32 dst = pp.tsp.DstInstr; pipelineColorBlendAttachmentState = @@ -110,6 +121,8 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP } else { + if (pass == Pass::Depth || pass == Pass::OIT) + colorComponentFlags = vk::ColorComponentFlags(); pipelineColorBlendAttachmentState = { false, // blendEnable @@ -119,7 +132,7 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP vk::BlendFactor::eZero, // srcAlphaBlendFactor vk::BlendFactor::eZero, // dstAlphaBlendFactor vk::BlendOp::eAdd, // alphaBlendOp - vk::ColorComponentFlags() // colorWriteMask + colorComponentFlags // colorWriteMask }; } @@ -142,7 +155,7 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP OITShaderManager::FragmentShaderParams params = {}; params.alphaTest = listType == ListType_Punch_Through; params.bumpmap = pp.tcw.PixelFmt == PixelBumpMap; - params.clamping = pp.tsp.ColorClamp && (pvrrc.fog_clamp_min.full != 0 || pvrrc.fog_clamp_max.full != 0xffffffff); + params.clamping = pp.tsp.ColorClamp; params.insideClipTest = (pp.tileclip >> 28) == 3; params.fog = config::Fog ? pp.tsp.FogCtrl : 2; params.gouraud = pp.pcw.Gouraud; @@ -183,7 +196,7 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP graphicsPipelineCreateInfo).value; } -void OITPipelineManager::CreateFinalPipeline() +void OITPipelineManager::CreateFinalPipeline(bool dithering) { vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetQuadInputStateCreateInfo(false); @@ -240,7 +253,7 @@ void OITPipelineManager::CreateFinalPipeline() vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates); vk::ShaderModule vertex_module = shaderManager->GetFinalVertexShader(); - vk::ShaderModule fragment_module = shaderManager->GetFinalShader(); + vk::ShaderModule fragment_module = shaderManager->GetFinalShader(dithering); std::array stages = { vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"), @@ -264,7 +277,7 @@ void OITPipelineManager::CreateFinalPipeline() 2 // subpass ); - finalPipeline = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value; + finalPipelines[dithering] = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value; } void OITPipelineManager::CreateClearPipeline() @@ -334,7 +347,7 @@ void OITPipelineManager::CreateClearPipeline() &pipelineDynamicStateCreateInfo, // pDynamicState *pipelineLayout, // layout renderPasses->GetRenderPass(true, true), // renderPass - 2 // subpass + 1 // subpass ); clearPipeline = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value; diff --git a/core/rend/vulkan/oit/oit_pipeline.h b/core/rend/vulkan/oit/oit_pipeline.h index 13e61850a..a3c7b103e 100644 --- a/core/rend/vulkan/oit/oit_pipeline.h +++ b/core/rend/vulkan/oit/oit_pipeline.h @@ -45,6 +45,7 @@ class OITDescriptorSets float colorClampMax[4]; float sp_FOG_COL_RAM[4]; // Only using 3 elements but easier for std140 float sp_FOG_COL_VERT[4]; // same comment + float ditherColorMax[4]; float cp_AlphaTestValue; float sp_FOG_DENSITY; float shade_scale_factor; // new for OIT @@ -94,8 +95,8 @@ class OITDescriptorSets u32 polyParamsOffset, u32 polyParamsSize, vk::ImageView stencilImageView, vk::ImageView depthImageView, vk::ImageView paletteImageView, OITBuffers *oitBuffers) { - if (!perFrameDescSet) - perFrameDescSet = perFrameAlloc.alloc(); + perFrameDescSet = perFrameAlloc.alloc(); + perPolyDescSets.clear(); std::vector bufferInfos; bufferInfos.emplace_back(buffer, vertexUniformOffset, sizeof(VertexShaderUniforms)); @@ -143,8 +144,7 @@ class OITDescriptorSets void updateColorInputDescSet(int index, vk::ImageView colorImageView) { - if (!colorInputDescSets[index]) - colorInputDescSets[index] = colorInputAlloc.alloc(); + colorInputDescSets[index] = colorInputAlloc.alloc(); vk::DescriptorImageInfo colorImageInfo(vk::Sampler(), colorImageView, vk::ImageLayout::eShaderReadOnlyOptimal); vk::WriteDescriptorSet writeDescriptorSet(colorInputDescSets[index], 0, 0, vk::DescriptorType::eInputAttachment, colorImageInfo); @@ -153,7 +153,7 @@ class OITDescriptorSets } void bindPerPolyDescriptorSets(vk::CommandBuffer cmdBuffer, const PolyParam& poly, int polyNumber, vk::Buffer buffer, - vk::DeviceSize uniformOffset, vk::DeviceSize lightOffset) + vk::DeviceSize uniformOffset, vk::DeviceSize lightOffset, bool punchThrough) { vk::DescriptorSet perPolyDescSet; auto it = perPolyDescSets.find(&poly); @@ -165,14 +165,14 @@ class OITDescriptorSets vk::DescriptorImageInfo imageInfo0; if (poly.texture != nullptr) { - imageInfo0 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly.tsp), ((Texture *)poly.texture)->GetReadOnlyImageView(), + imageInfo0 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly, punchThrough, false), ((Texture *)poly.texture)->GetReadOnlyImageView(), vk::ImageLayout::eShaderReadOnlyOptimal }; writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo0); } vk::DescriptorImageInfo imageInfo1; if (poly.texture1 != nullptr) { - imageInfo1 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly.tsp1), ((Texture *)poly.texture1)->GetReadOnlyImageView(), + imageInfo1 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly, punchThrough, true), ((Texture *)poly.texture1)->GetReadOnlyImageView(), vk::ImageLayout::eShaderReadOnlyOptimal }; writeDescriptorSets.emplace_back(perPolyDescSet, 1, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo1); } @@ -321,13 +321,14 @@ class OITPipelineManager pipelines.clear(); modVolPipelines.clear(); trModVolPipelines.clear(); - finalPipeline.reset(); + finalPipelines[0].reset(); + finalPipelines[1].reset(); clearPipeline.reset(); } - vk::Pipeline GetPipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, bool gpuPalette) + vk::Pipeline GetPipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, int gpuPalette) { - u32 pipehash = hash(listType, autosort, &pp, pass, gpuPalette); + u64 pipehash = hash(listType, autosort, &pp, pass, gpuPalette); const auto &pipeline = pipelines.find(pipehash); if (pipeline != pipelines.end()) return pipeline->second.get(); @@ -357,14 +358,18 @@ class OITPipelineManager return *trModVolPipelines[pipehash]; } - vk::Pipeline GetFinalPipeline() + vk::Pipeline GetFinalPipeline(bool dithering) { - if (!finalPipeline || maxLayers != config::PerPixelLayers) + if (!finalPipelines[dithering] || maxLayers != config::PerPixelLayers) { - CreateFinalPipeline(); - maxLayers = config::PerPixelLayers; + if (maxLayers != config::PerPixelLayers) { + finalPipelines[0].reset(); + finalPipelines[1].reset(); + maxLayers = config::PerPixelLayers; + } + CreateFinalPipeline(dithering); } - return *finalPipeline; + return *finalPipelines[dithering]; } vk::Pipeline GetClearPipeline() { @@ -377,21 +382,21 @@ class OITPipelineManager vk::DescriptorSetLayout GetPerPolyDSLayout() const { return *perPolyLayout; } vk::DescriptorSetLayout GetColorInputDSLayout() const { return *colorInputLayout; } - vk::RenderPass GetRenderPass(bool initial, bool last) { return renderPasses->GetRenderPass(initial, last); } + vk::RenderPass GetRenderPass(bool initial, bool last, bool loadClear = false) { return renderPasses->GetRenderPass(initial, last, loadClear); } private: void CreateModVolPipeline(ModVolMode mode, int cullMode, bool naomi2); void CreateTrModVolPipeline(ModVolMode mode, int cullMode, bool naomi2); - u32 hash(u32 listType, bool autosort, const PolyParam *pp, Pass pass, bool gpuPalette) const + u64 hash(u32 listType, bool autosort, const PolyParam *pp, Pass pass, int gpuPalette) const { - u32 hash = pp->pcw.Gouraud | (pp->pcw.Offset << 1) | (pp->pcw.Texture << 2) | (pp->pcw.Shadow << 3) + u64 hash = pp->pcw.Gouraud | (pp->pcw.Offset << 1) | (pp->pcw.Texture << 2) | (pp->pcw.Shadow << 3) | (((pp->tileclip >> 28) == 3) << 4); hash |= ((listType >> 1) << 5); if (pp->tcw1.full != (u32)-1 || pp->tsp1.full != (u32)-1) { // Two-volume mode - hash |= (1 << 31) | (pp->tsp.ColorClamp << 11); + hash |= ((u64)1 << 33) | (pp->tsp.ColorClamp << 11); } else { @@ -401,9 +406,9 @@ class OITPipelineManager | (pp->tsp.SrcInstr << 14) | (pp->tsp.DstInstr << 17); } hash |= (pp->isp.ZWriteDis << 20) | (pp->isp.CullMode << 21) | ((autosort ? 6 : pp->isp.DepthMode) << 23); - hash |= ((u32)gpuPalette << 26) | ((u32)pass << 27) | ((u32)pp->isNaomi2() << 29); - hash |= (u32)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 30; - hash |= (u32)(pp->tcw.PixelFmt == PixelBumpMap) << 31; + hash |= ((u64)gpuPalette << 26) | ((u64)pass << 28) | ((u64)pp->isNaomi2() << 30); + hash |= (u64)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 31; + hash |= (u64)(pp->tcw.PixelFmt == PixelBumpMap) << 32; return hash; } @@ -412,7 +417,7 @@ class OITPipelineManager return ((int)mode << 2) | cullMode | ((u32)naomi2 << 5) | ((u32)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 6); } - vk::PipelineVertexInputStateCreateInfo GetMainVertexInputStateCreateInfo(bool full = true) const + vk::PipelineVertexInputStateCreateInfo GetMainVertexInputStateCreateInfo(bool full = true, bool naomi2 = false) const { // Vertex input state static const vk::VertexInputBindingDescription vertexBindingDescriptions[] = @@ -422,11 +427,11 @@ class OITPipelineManager static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] = { vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, x)), // pos - vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, col)), // base color - vk::VertexInputAttributeDescription(2, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, spc)), // offset color + vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, col)), // base color + vk::VertexInputAttributeDescription(2, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, spc)), // offset color vk::VertexInputAttributeDescription(3, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, u)), // tex coord - vk::VertexInputAttributeDescription(4, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, col1)), // base1 color - vk::VertexInputAttributeDescription(5, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, spc1)), // offset1 color + vk::VertexInputAttributeDescription(4, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, col1)), // base1 color + vk::VertexInputAttributeDescription(5, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, spc1)), // offset1 color vk::VertexInputAttributeDescription(6, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, u1)), // tex1 coord vk::VertexInputAttributeDescription(7, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, nx)), // naomi2 normal }; @@ -434,22 +439,39 @@ class OITPipelineManager { vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, x)), // pos }; + + const vk::VertexInputAttributeDescription* attributeDescription = vertexInputLightAttributeDescriptions; + u32 attributeDescriptionSize = std::size(vertexInputLightAttributeDescriptions); + + if (full) + { + attributeDescription = vertexInputAttributeDescriptions; + + if (naomi2) + { + attributeDescriptionSize = std::size(vertexInputAttributeDescriptions); + } + else + { + // naomi2 normal not needed + attributeDescriptionSize = std::size(vertexInputAttributeDescriptions) - 1; + } + } return vk::PipelineVertexInputStateCreateInfo( - vk::PipelineVertexInputStateCreateFlags(), - std::size(vertexBindingDescriptions), - vertexBindingDescriptions, - full ? std::size(vertexInputAttributeDescriptions) : std::size(vertexInputLightAttributeDescriptions), - full ? vertexInputAttributeDescriptions : vertexInputLightAttributeDescriptions); + vk::PipelineVertexInputStateCreateFlags(), + std::size(vertexBindingDescriptions), vertexBindingDescriptions, + attributeDescriptionSize, attributeDescription + ); } - void CreatePipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, bool gpuPalette); - void CreateFinalPipeline(); + void CreatePipeline(u32 listType, bool autosort, const PolyParam& pp, Pass pass, int gpuPalette); + void CreateFinalPipeline(bool dithering); void CreateClearPipeline(); - std::map pipelines; + std::map pipelines; std::map modVolPipelines; std::map trModVolPipelines; - vk::UniquePipeline finalPipeline; + vk::UniquePipeline finalPipelines[2]; vk::UniquePipeline clearPipeline; vk::UniquePipelineLayout pipelineLayout; diff --git a/core/rend/vulkan/oit/oit_renderer.cpp b/core/rend/vulkan/oit/oit_renderer.cpp index d85547aea..090808b16 100644 --- a/core/rend/vulkan/oit/oit_renderer.cpp +++ b/core/rend/vulkan/oit/oit_renderer.cpp @@ -53,6 +53,7 @@ class OITVulkanRenderer final : public BaseVulkanRenderer { DEBUG_LOG(RENDERER, "OITVulkanRenderer::Term"); GetContext()->WaitIdle(); + texCommandPool.Term(); screenDrawer.Term(); textureDrawer.Term(); oitBuffers.Term(); @@ -61,17 +62,26 @@ class OITVulkanRenderer final : public BaseVulkanRenderer BaseVulkanRenderer::Term(); } + void Process(TA_context* ctx) override + { + if (emulateFramebuffer != config::EmulateFramebuffer) + { + screenDrawer.EndFrame(); + VulkanContext::Instance()->WaitIdle(); + screenDrawer.Term(); + screenDrawer.Init(&samplerManager, &oitShaderManager, &oitBuffers, viewport); + BaseInit(screenDrawer.GetRenderPass(), 2); + emulateFramebuffer = config::EmulateFramebuffer; + } + else if (ctx->rend.isRTT) { + screenDrawer.EndFrame(); + } + BaseVulkanRenderer::Process(ctx); + } + bool Render() override { try { - if (emulateFramebuffer != config::EmulateFramebuffer) - { - VulkanContext::Instance()->WaitIdle(); - screenDrawer.Term(); - screenDrawer.Init(&samplerManager, &oitShaderManager, &oitBuffers, viewport); - BaseInit(screenDrawer.GetRenderPass(), 2); - emulateFramebuffer = config::EmulateFramebuffer; - } OITDrawer *drawer; if (pvrrc.isRTT) drawer = &textureDrawer; @@ -81,7 +91,8 @@ class OITVulkanRenderer final : public BaseVulkanRenderer } drawer->Draw(fogTexture.get(), paletteTexture.get()); - drawer->EndFrame(); + if (config::EmulateFramebuffer || pvrrc.isRTT) + drawer->EndFrame(); return !pvrrc.isRTT; } catch (const vk::SystemError& e) { @@ -94,6 +105,8 @@ class OITVulkanRenderer final : public BaseVulkanRenderer bool Present() override { + if (clearLastFrame) + return false; if (config::EmulateFramebuffer || framebufferRendered) return presentFramebuffer(); else diff --git a/core/rend/vulkan/oit/oit_renderpass.cpp b/core/rend/vulkan/oit/oit_renderpass.cpp index 056d693f4..484ace4ff 100644 --- a/core/rend/vulkan/oit/oit_renderpass.cpp +++ b/core/rend/vulkan/oit/oit_renderpass.cpp @@ -20,17 +20,18 @@ */ #include "oit_renderpass.h" -vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) +vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last, bool loadClear) { + vk::AttachmentDescription attach0 = GetAttachment0Description(initial, last, loadClear); std::array attachmentDescriptions = { // Swap chain image - GetAttachment0Description(initial, last), + attach0, // OP+PT color attachment vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eR8G8B8A8Unorm, vk::SampleCountFlagBits::e1, - initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, + loadClear && initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, last ? vk::AttachmentStoreOp::eDontCare : vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare, - initial ? vk::ImageLayout::eUndefined : vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eShaderReadOnlyOptimal), + loadClear && initial ? vk::ImageLayout::eUndefined : attach0.finalLayout, attach0.finalLayout), // initial layout is eUndefined for rtt, so use final layout instead // OP+PT depth attachment vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), GetContext()->GetDepthFormat(), vk::SampleCountFlagBits::e1, initial ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, @@ -88,6 +89,10 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last) vk::AccessFlagBits::eInputAttachmentRead | vk::AccessFlagBits::eShaderRead, vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite, vk::DependencyFlagBits::eByRegion); + dependencies.emplace_back(1, 1, vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eFragmentShader, + vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, + vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, + vk::DependencyFlagBits::eByRegion); dependencies.emplace_back(2, 2, vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eFragmentShader, vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite, diff --git a/core/rend/vulkan/oit/oit_renderpass.h b/core/rend/vulkan/oit/oit_renderpass.h index a67af4f11..9c3c9cf87 100644 --- a/core/rend/vulkan/oit/oit_renderpass.h +++ b/core/rend/vulkan/oit/oit_renderpass.h @@ -20,15 +20,16 @@ */ #pragma once #include "../vulkan_context.h" +#include "cfg/option.h" class RenderPasses { public: - vk::RenderPass GetRenderPass(bool initial, bool last) + vk::RenderPass GetRenderPass(bool initial, bool last, bool loadClear = false) { - size_t index = (initial ? 1 : 0) | (last ? 2 : 0); + size_t index = (initial ? 1 : 0) | (last ? 2 : 0) | (loadClear ? 4 : 0); if (!renderPasses[index]) - renderPasses[index] = MakeRenderPass(initial, last); + renderPasses[index] = MakeRenderPass(initial, last, loadClear); return *renderPasses[index]; } void Reset() @@ -40,32 +41,36 @@ class RenderPasses protected: VulkanContext *GetContext() const { return VulkanContext::Instance(); } - vk::UniqueRenderPass MakeRenderPass(bool initial, bool last); - virtual vk::AttachmentDescription GetAttachment0Description(bool initial, bool last) const + vk::UniqueRenderPass MakeRenderPass(bool initial, bool last, bool loadClear); + virtual vk::AttachmentDescription GetAttachment0Description(bool initial, bool last, bool loadClear) const { return vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eR8G8B8A8Unorm, vk::SampleCountFlagBits::e1, - vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eStore, + initial && loadClear ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare, - config::EmulateFramebuffer && last ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal, + config::EmulateFramebuffer && initial ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal, config::EmulateFramebuffer && last ? vk::ImageLayout::eTransferSrcOptimal : vk::ImageLayout::eShaderReadOnlyOptimal); } virtual std::vector GetSubpassDependencies() const { - std::vector deps; - deps.emplace_back(2, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader, - vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead, vk::DependencyFlagBits::eByRegion); - return deps; + if (config::EmulateFramebuffer) + return { { 2, VK_SUBPASS_EXTERNAL, + vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eTransfer | vk::PipelineStageFlagBits::eHost, + vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eHostRead, vk::DependencyFlagBits::eByRegion } }; + else + return { { 2, VK_SUBPASS_EXTERNAL, + vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader, + vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead, vk::DependencyFlagBits::eByRegion } }; } private: - std::array renderPasses; + std::array renderPasses; }; class RttRenderPasses : public RenderPasses { protected: - vk::AttachmentDescription GetAttachment0Description(bool initial, bool last) const override + vk::AttachmentDescription GetAttachment0Description(bool initial, bool last, bool loadClear) const override { return vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eR8G8B8A8Unorm, vk::SampleCountFlagBits::e1, vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eStore, @@ -76,14 +81,12 @@ class RttRenderPasses : public RenderPasses std::vector GetSubpassDependencies() const override { - std::vector deps; if (config::RenderToTextureBuffer) - deps.emplace_back(2, VK_SUBPASS_EXTERNAL, + return { { 2, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eTransfer | vk::PipelineStageFlagBits::eHost, - vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eHostRead); + vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eHostRead } }; else - deps.emplace_back(2, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader, - vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead); - return deps; + return { { 2, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader, + vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead } }; } }; diff --git a/core/rend/vulkan/oit/oit_shaders.cpp b/core/rend/vulkan/oit/oit_shaders.cpp index 36136c2f6..145975730 100644 --- a/core/rend/vulkan/oit/oit_shaders.cpp +++ b/core/rend/vulkan/oit/oit_shaders.cpp @@ -23,6 +23,8 @@ #include "rend/gl4/glsl.h" #include "cfg/option.h" +extern const char *FragmentShaderCommon; + static const char OITVertexShaderSource[] = R"( layout (std140, set = 0, binding = 0) uniform VertexShaderUniforms { @@ -35,11 +37,11 @@ layout (push_constant) uniform constants } pushConstants; layout (location = 0) in vec4 in_pos; -layout (location = 1) in uvec4 in_base; -layout (location = 2) in uvec4 in_offs; +layout (location = 1) in vec4 in_base; +layout (location = 2) in vec4 in_offs; layout (location = 3) in mediump vec2 in_uv; -layout (location = 4) in uvec4 in_base1; // New for OIT, only for OP/PT with 2-volume -layout (location = 5) in uvec4 in_offs1; +layout (location = 4) in vec4 in_base1; // New for OIT, only for OP/PT with 2-volume +layout (location = 5) in vec4 in_offs1; layout (location = 6) in mediump vec2 in_uv1; layout (location = 0) INTERPOLATION out highp vec4 vtx_base; @@ -57,11 +59,11 @@ void main() vpos /= vpos.z; vpos.z = vpos.w; #endif - vtx_base = vec4(in_base) / 255.0; - vtx_offs = vec4(in_offs) / 255.0; + vtx_base = in_base; + vtx_offs = in_offs; vtx_uv = vec3(in_uv, vpos.z); - vtx_base1 = vec4(in_base1) / 255.0; - vtx_offs1 = vec4(in_offs1) / 255.0; + vtx_base1 = in_base1; + vtx_offs1 = in_offs1; vtx_uv1 = in_uv1; #if pp_Gouraud == 1 && DIV_POS_Z != 1 vtx_base *= vpos.z; @@ -89,6 +91,7 @@ layout (std140, set = 0, binding = 1) uniform FragmentShaderUniforms vec4 colorClampMax; vec4 sp_FOG_COL_RAM; vec4 sp_FOG_COL_VERT; + vec4 ditherColorMax; float cp_AlphaTestValue; float sp_FOG_DENSITY; float shade_scale_factor; @@ -130,9 +133,7 @@ layout (set = 0, binding = 3, std430) readonly buffer TrPolyParamBuffer { )"; -static const char OITFragmentShaderSource[] = R"( -#define PI 3.1415926 - +static const char OITFragmentShaderTop[] = R"( #define PASS_DEPTH 0 #define PASS_COLOR 1 #define PASS_OIT 2 @@ -173,7 +174,7 @@ layout (set = 1, binding = 0) uniform sampler2D tex0; layout (set = 1, binding = 1) uniform sampler2D tex1; #endif #endif -#if pp_Palette == 1 +#if pp_Palette != 0 layout (set = 0, binding = 6) uniform sampler2D palette; #endif @@ -195,49 +196,10 @@ layout (location = 6) flat in uint vtx_index; #if pp_FogCtrl != 2 || pp_TwoVolumes == 1 layout (set = 0, binding = 2) uniform sampler2D fog_table; - -float fog_mode2(float w) -{ - float z = clamp( -#if DIV_POS_Z == 1 - uniformBuffer.sp_FOG_DENSITY / w -#else - uniformBuffer.sp_FOG_DENSITY * w -#endif - , 1.0, 255.9999); - float exp = floor(log2(z)); - float m = z * 16.0 / pow(2.0, exp) - 16.0; - float idx = floor(m) + exp * 16.0 + 0.5; - vec4 fog_coef = texture(fog_table, vec2(idx / 128.0, 0.75 - (m - floor(m)) / 2.0)); - return fog_coef.r; -} -#endif - -vec4 colorClamp(vec4 col) -{ -// TODO This can change in two-volume mode -#if ColorClamping == 1 - return clamp(col, uniformBuffer.colorClampMin, uniformBuffer.colorClampMax); -#else - return col; -#endif -} - -#if pp_Palette == 1 - -vec4 palettePixel(sampler2D tex, vec3 coords) -{ -#if DIV_POS_Z == 1 - float texIdx = texture(tex, coords.xy).r; -#else - float texIdx = textureProj(tex, coords).r; -#endif - vec4 c = vec4(texIdx * 255.0 / 1023.0 + pushConstants.palette_index, 0.5, 0.0, 0.0); - return texture(palette, c.xy); -} - #endif +)"; +static const char OITFragmentShaderMain[] = R"( void main() { setFragDepth(vtx_uv.z); @@ -304,8 +266,10 @@ void main() #else texcol = textureProj(tex1, vec3(vtx_uv1, vtx_uv.z)); #endif - #else + #elif pp_Palette == 1 texcol = palettePixel(tex1, vec3(vtx_uv1, vtx_uv.z)); + #else + texcol = palettePixelBilinear(tex1, vec3(vtx_uv1, vtx_uv.z)); #endif else #endif @@ -315,8 +279,10 @@ void main() #else texcol = textureProj(tex0, vtx_uv); #endif - #else + #elif pp_Palette == 1 texcol = palettePixel(tex0, vtx_uv); + #else + texcol = palettePixelBilinear(tex0, vtx_uv); #endif #if pp_BumpMap == 1 float s = PI / 2.0 * (texcol.a * 15.0 * 16.0 + texcol.r * 15.0) / 255.0; @@ -328,12 +294,6 @@ void main() IF(cur_ignore_tex_alpha) texcol.a = 1.0; #endif - - #if cp_AlphaTest == 1 - if (uniformBuffer.cp_AlphaTestValue > texcol.a) - discard; - texcol.a = 1.0; - #endif #endif #if pp_ShadInstr == 0 || pp_TwoVolumes == 1 // DECAL IF(cur_shading_instr == 0) @@ -391,6 +351,13 @@ void main() color *= pushConstants.trilinearAlpha; + #if cp_AlphaTest == 1 + color.a = round(color.a * 255.0) / 255.0; + if (uniformBuffer.cp_AlphaTestValue > color.a) + discard; + color.a = 1.0; + #endif + //color.rgb = vec3(vtx_uv.z * uniformBuffer.sp_FOG_DENSITY / 128.0); #if PASS == PASS_COLOR @@ -559,6 +526,19 @@ vec4 resolveAlphaBlend(ivec2 coords) { finalColor = result; } +#if DITHERING == 1 + float ditherTable[16] = float[]( + 0.9375, 0.1875, 0.75, 0., + 0.4375, 0.6875, 0.25, 0.5, + 0.8125, 0.0625, 0.875, 0.125, + 0.3125, 0.5625, 0.375, 0.625 + ); + float r = ditherTable[int(mod(gl_FragCoord.y, 4.)) * 4 + int(mod(gl_FragCoord.x, 4.))]; + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + finalColor += r / uniformBuffer.ditherColorMax; + // avoid rounding + finalColor = floor(finalColor * 255.) / 255.; +#endif return finalColor; } @@ -658,11 +638,11 @@ layout (push_constant) uniform constants } pushConstants; layout (location = 0) in vec4 in_pos; -layout (location = 1) in uvec4 in_base; -layout (location = 2) in uvec4 in_offs; +layout (location = 1) in vec4 in_base; +layout (location = 2) in vec4 in_offs; layout (location = 3) in mediump vec2 in_uv; -layout (location = 4) in uvec4 in_base1; -layout (location = 5) in uvec4 in_offs1; +layout (location = 4) in vec4 in_base1; +layout (location = 5) in vec4 in_offs1; layout (location = 6) in mediump vec2 in_uv1; layout (location = 7) in vec3 in_normal; @@ -697,16 +677,16 @@ void wDivide(inout vec4 vpos) void main() { vec4 vpos = n2Uniform.mvMat * in_pos; - vtx_base = vec4(in_base) / 255.0; - vtx_offs = vec4(in_offs) / 255.0; + vtx_base = in_base; + vtx_offs = in_offs; #if LIGHT_ON == 1 vec3 vnorm = normalize(mat3(n2Uniform.normalMat) * in_normal); #endif #if pp_TwoVolumes == 1 - vtx_base1 = vec4(in_base1) / 255.0; - vtx_offs1 = vec4(in_offs1) / 255.0; + vtx_base1 = in_base1; + vtx_offs1 = in_offs1; vtx_uv1 = in_uv1; #if LIGHT_ON == 1 // FIXME need offset0 and offset1 for bump maps @@ -783,19 +763,22 @@ vk::UniqueShaderModule OITShaderManager::compileShader(const FragmentShaderParam .addConstant("pp_Gouraud", (int)params.gouraud) .addConstant("pp_BumpMap", (int)params.bumpmap) .addConstant("ColorClamping", (int)params.clamping) - .addConstant("pp_Palette", (int)params.palette) + .addConstant("pp_Palette", params.palette) .addConstant("DIV_POS_Z", (int)params.divPosZ) .addConstant("PASS", (int)params.pass) .addSource(GouraudSource) .addSource(OITShaderHeader) - .addSource(OITFragmentShaderSource); + .addSource(OITFragmentShaderTop) + .addSource(FragmentShaderCommon) + .addSource(OITFragmentShaderMain); return ShaderCompiler::Compile(vk::ShaderStageFlagBits::eFragment, src.generate()); } -vk::UniqueShaderModule OITShaderManager::compileFinalShader() +vk::UniqueShaderModule OITShaderManager::compileFinalShader(bool dithering) { VulkanSource src; src.addConstant("MAX_PIXELS_PER_FRAGMENT", config::PerPixelLayers) + .addConstant("DITHERING", dithering) .addSource(OITShaderHeader) .addSource(OITFinalShaderSource); diff --git a/core/rend/vulkan/oit/oit_shaders.h b/core/rend/vulkan/oit/oit_shaders.h index 56d821d87..7c6b623cc 100644 --- a/core/rend/vulkan/oit/oit_shaders.h +++ b/core/rend/vulkan/oit/oit_shaders.h @@ -58,7 +58,7 @@ class OITShaderManager bool bumpmap; bool clamping; bool twoVolume; - bool palette; + int palette; bool divPosZ; Pass pass; @@ -68,7 +68,7 @@ class OITShaderManager | ((u32)texture << 3) | ((u32)ignoreTexAlpha << 4) | (shaderInstr << 5) | ((u32)offset << 7) | ((u32)fog << 8) | ((u32)gouraud << 10) | ((u32)bumpmap << 11) | ((u32)clamping << 12) | ((u32)twoVolume << 13) - | ((u32)palette << 14) | ((int)pass << 15) | ((u32)divPosZ << 17); + | ((u32)palette << 14) | ((int)pass << 16) | ((u32)divPosZ << 18); } }; @@ -102,16 +102,19 @@ class OITShaderManager vk::ShaderModule GetTrModVolShader(const TrModVolShaderParams& params) { return getShader(trModVolShaders, params); } - vk::ShaderModule GetFinalShader() + vk::ShaderModule GetFinalShader(bool dithering) { - if (!finalFragmentShader || maxLayers != config::PerPixelLayers) + if (!finalFragmentShaders[dithering] || maxLayers != config::PerPixelLayers) { - if (maxLayers != config::PerPixelLayers) + if (maxLayers != config::PerPixelLayers) { trModVolShaders.clear(); - finalFragmentShader = compileFinalShader(); + finalFragmentShaders[0].reset(); + finalFragmentShaders[1].reset(); + } + finalFragmentShaders[dithering] = compileFinalShader(dithering); maxLayers = config::PerPixelLayers; } - return *finalFragmentShader; + return *finalFragmentShaders[dithering]; } vk::ShaderModule GetFinalVertexShader() { @@ -136,7 +139,8 @@ class OITShaderManager trModVolShaders.clear(); finalVertexShader.reset(); - finalFragmentShader.reset(); + finalFragmentShaders[0].reset(); + finalFragmentShaders[1].reset(); clearShader.reset(); } @@ -156,7 +160,7 @@ class OITShaderManager vk::UniqueShaderModule compileShader(const ModVolShaderParams& params); vk::UniqueShaderModule compileModVolFragmentShader(bool divPosZ); vk::UniqueShaderModule compileShader(const TrModVolShaderParams& params); - vk::UniqueShaderModule compileFinalShader(); + vk::UniqueShaderModule compileFinalShader(bool dithering); vk::UniqueShaderModule compileFinalVertexShader(); vk::UniqueShaderModule compileClearShader(); @@ -167,7 +171,7 @@ class OITShaderManager std::map trModVolShaders; vk::UniqueShaderModule finalVertexShader; - vk::UniqueShaderModule finalFragmentShader; + vk::UniqueShaderModule finalFragmentShaders[2]; vk::UniqueShaderModule clearShader; int maxLayers = 0; }; diff --git a/core/rend/vulkan/overlay.cpp b/core/rend/vulkan/overlay.cpp index 99101d385..483f1e8d9 100644 --- a/core/rend/vulkan/overlay.cpp +++ b/core/rend/vulkan/overlay.cpp @@ -41,6 +41,7 @@ void VulkanOverlay::Init(QuadPipeline *pipeline) } xhairDrawer = std::make_unique(); xhairDrawer->Init(pipeline); + vmuLastChanged.fill({}); } void VulkanOverlay::Term() @@ -65,7 +66,7 @@ std::unique_ptr VulkanOverlay::createTexture(vk::CommandBuffer commandB return texture; } -void VulkanOverlay::Prepare(vk::CommandBuffer cmdBuffer, bool vmu, bool crosshair, TextureCache& textureCache) +void VulkanOverlay::Prepare(vk::CommandBuffer cmdBuffer, bool vmu, bool crosshair) { if (vmu) { @@ -76,18 +77,21 @@ void VulkanOverlay::Prepare(vk::CommandBuffer cmdBuffer, bool vmu, bool crosshai { if (texture) { - textureCache.DestroyLater(texture.get()); + texture->deferDeleteResource(VulkanContext::Instance()); texture.reset(); } continue; } - if (texture != nullptr && !vmu_lcd_changed[i]) + if (texture != nullptr && ::vmuLastChanged[i] == this->vmuLastChanged[i]) continue; if (texture) - textureCache.DestroyLater(texture.get()); + texture->deferDeleteResource(VulkanContext::Instance()); texture = createTexture(cmdBuffer, 48, 32, (u8*)vmu_lcd_data[i]); - vmu_lcd_changed[i] = false; +#ifdef VK_DEBUG + VulkanContext::Instance()->setObjectName(texture->GetImageView(), "VMU " + std::to_string(i)); +#endif + this->vmuLastChanged[i] = ::vmuLastChanged[i]; } } if (crosshair && !xhairTexture) @@ -97,7 +101,7 @@ void VulkanOverlay::Prepare(vk::CommandBuffer cmdBuffer, bool vmu, bool crosshai } } -vk::CommandBuffer VulkanOverlay::Prepare(vk::CommandPool commandPool, bool vmu, bool crosshair, TextureCache& textureCache) +vk::CommandBuffer VulkanOverlay::Prepare(vk::CommandPool commandPool, bool vmu, bool crosshair) { VulkanContext *context = VulkanContext::Instance(); commandBuffers.resize(context->GetSwapChainSize()); @@ -106,7 +110,7 @@ vk::CommandBuffer VulkanOverlay::Prepare(vk::CommandPool commandPool, bool vmu, .front()); vk::CommandBuffer cmdBuffer = *commandBuffers[context->GetCurrentImageIndex()]; cmdBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - Prepare(cmdBuffer, vmu, crosshair, textureCache); + Prepare(cmdBuffer, vmu, crosshair); cmdBuffer.end(); return cmdBuffer; @@ -123,9 +127,21 @@ void VulkanOverlay::Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport, if (vmu) { +#ifndef LIBRETRO f32 vmu_padding = 8.f * scaling; f32 vmu_height = 32.f * scaling; f32 vmu_width = 48.f * scaling; +#else + f32 vmu_padding_x = 8.f * viewport.width / 640.f; + f32 vmu_padding_y = 8.f * viewport.height / 480.f; + f32 vmu_width = 48.f * viewport.width / 640.f; + f32 vmu_height = 32.f * viewport.height / 480.f; + if (config::Widescreen) + { + vmu_padding_x = vmu_padding_x / 4.f * 3.f; + vmu_width = vmu_width / 4.f * 3.f; + } +#endif pipeline->BindPipeline(commandBuffer); const float *color = nullptr; @@ -155,20 +171,20 @@ void VulkanOverlay::Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport, { case UPPER_LEFT: default: - x = vmu_padding; - y = vmu_padding; + x = vmu_padding_x; + y = vmu_padding_y; break; case UPPER_RIGHT: - x = viewport.width - vmu_padding - w; - y = vmu_padding; + x = viewport.width - vmu_padding_x - w; + y = vmu_padding_y; break; case LOWER_LEFT: - x = vmu_padding; - y = viewport.height - vmu_padding - h; + x = vmu_padding_x; + y = viewport.height - vmu_padding_y - h; break; case LOWER_RIGHT: - x = viewport.width - vmu_padding - w; - y = viewport.height - vmu_padding - h; + x = viewport.width - vmu_padding_x - w; + y = viewport.height - vmu_padding_y - h; break; } #else @@ -196,26 +212,23 @@ void VulkanOverlay::Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport, drawers[i]->Draw(commandBuffer, vmuTextures[i]->GetImageView(), vtx, true, color); } } - if (crosshair && crosshairsNeeded()) + if (crosshair) { pipeline->BindPipeline(commandBuffer); bool imageViewBound = false; for (size_t i = 0; i < config::CrosshairColor.size(); i++) { - if (config::CrosshairColor[i] == 0) - continue; - if (settings.platform.isConsole() && config::MapleMainDevices[i] != MDT_LightGun) + if (!crosshairNeeded(i)) continue; auto [x, y] = getCrosshairPosition(i); - #ifdef LIBRETRO - float w = LIGHTGUN_CROSSHAIR_SIZE * scaling / config::ScreenStretching * 100.f; - float h = LIGHTGUN_CROSSHAIR_SIZE * scaling; + float w = lightgun_crosshair_size * scaling / config::ScreenStretching * 100.f; + float h = lightgun_crosshair_size * scaling; x /= config::ScreenStretching / 100.f; #else - float w = XHAIR_WIDTH * scaling; - float h = XHAIR_HEIGHT * scaling; + float w = config::CrosshairSize * scaling; + float h = config::CrosshairSize * scaling; #endif x -= w / 2; y -= h / 2; diff --git a/core/rend/vulkan/overlay.h b/core/rend/vulkan/overlay.h index 78439f5cb..ac222747f 100644 --- a/core/rend/vulkan/overlay.h +++ b/core/rend/vulkan/overlay.h @@ -26,7 +26,6 @@ #include class Texture; -class TextureCache; class VulkanOverlay { @@ -36,8 +35,8 @@ class VulkanOverlay void Init(QuadPipeline *pipeline); void Term(); - vk::CommandBuffer Prepare(vk::CommandPool commandPool, bool vmu, bool crosshair, TextureCache& textureCache); - void Prepare(vk::CommandBuffer commandBuffer, bool vmu, bool crosshair, TextureCache& textureCache); + vk::CommandBuffer Prepare(vk::CommandPool commandPool, bool vmu, bool crosshair); + void Prepare(vk::CommandBuffer commandBuffer, bool vmu, bool crosshair); void Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport, float scaling, bool vmu, bool crosshair); private: @@ -46,6 +45,7 @@ class VulkanOverlay std::array, 8> vmuTextures; std::vector commandBuffers; std::array, 8> drawers; + std::array vmuLastChanged {}; QuadPipeline *pipeline = nullptr; std::unique_ptr xhairTexture; diff --git a/core/rend/vulkan/pipeline.cpp b/core/rend/vulkan/pipeline.cpp index 158986374..e2330571c 100644 --- a/core/rend/vulkan/pipeline.cpp +++ b/core/rend/vulkan/pipeline.cpp @@ -20,7 +20,6 @@ */ #include "pipeline.h" #include "hw/pvr/Renderer_if.h" -#include "rend/osd.h" void PipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, bool naomi2) { @@ -31,7 +30,7 @@ void PipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, bool n if (mode == ModVolMode::Final) { - pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(false); + pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(false, naomi2); pipelineInputAssemblyStateCreateInfo = vk::PipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(), vk::PrimitiveTopology::eTriangleStrip); } @@ -161,7 +160,7 @@ void PipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, bool n void PipelineManager::CreateDepthPassPipeline(int cullMode, bool naomi2) { // Vertex input state - vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(false); + vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(false, false); // Input assembly state vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo ( @@ -189,6 +188,17 @@ void PipelineManager::CreateDepthPassPipeline(int cullMode, bool naomi2) 0.0f, // depthBiasSlopeFactor 1.0f // lineWidth ); + + // Dreamcast uses the last vertex as the provoking vertex, but Vulkan uses the first. + // Utilize VK_EXT_provoking_vertex when available to set the provoking vertex to be the + // last vertex + vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT provokingVertexInfo{}; + if (GetContext()->hasProvokingVertex()) + { + provokingVertexInfo.provokingVertexMode = vk::ProvokingVertexModeEXT::eLastVertex; + pipelineRasterizationStateCreateInfo.pNext = &provokingVertexInfo; + } + vk::PipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo; // Depth and stencil @@ -260,9 +270,9 @@ void PipelineManager::CreateDepthPassPipeline(int cullMode, bool naomi2) graphicsPipelineCreateInfo).value; } -void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const PolyParam& pp, bool gpuPalette) +void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const PolyParam& pp, int gpuPalette, bool dithering) { - vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(); + vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo = GetMainVertexInputStateCreateInfo(true, pp.isNaomi2()); // Input assembly state vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo; @@ -295,6 +305,17 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol 0.0f, // depthBiasSlopeFactor 1.0f // lineWidth ); + + // Dreamcast uses the last vertex as the provoking vertex, but Vulkan uses the first. + // Utilize VK_EXT_provoking_vertex when available to set the provoking vertex to be the + // last vertex + vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT provokingVertexInfo{}; + if (GetContext()->hasProvokingVertex()) + { + provokingVertexInfo.provokingVertexMode = vk::ProvokingVertexModeEXT::eLastVertex; + pipelineRasterizationStateCreateInfo.pNext = &provokingVertexInfo; + } + vk::PipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo; // Depth and stencil @@ -342,38 +363,21 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol // Color flags and blending vk::ColorComponentFlags colorComponentFlags(vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA); - vk::PipelineColorBlendAttachmentState pipelineColorBlendAttachmentState; // Apparently punch-through polys support blending, or at least some combinations - if (listType == ListType_Translucent || listType == ListType_Punch_Through) + // Opaque polygons support blending in list continuations (wild guess) + u32 src = pp.tsp.SrcInstr; + u32 dst = pp.tsp.DstInstr; + vk::PipelineColorBlendAttachmentState pipelineColorBlendAttachmentState { - u32 src = pp.tsp.SrcInstr; - u32 dst = pp.tsp.DstInstr; - pipelineColorBlendAttachmentState = - { - true, // blendEnable - getBlendFactor(src, true), // srcColorBlendFactor - getBlendFactor(dst, false), // dstColorBlendFactor - vk::BlendOp::eAdd, // colorBlendOp - getBlendFactor(src, true), // srcAlphaBlendFactor - getBlendFactor(dst, false), // dstAlphaBlendFactor - vk::BlendOp::eAdd, // alphaBlendOp - colorComponentFlags // colorWriteMask - }; - } - else - { - pipelineColorBlendAttachmentState = - { - false, // blendEnable - vk::BlendFactor::eZero, // srcColorBlendFactor - vk::BlendFactor::eZero, // dstColorBlendFactor - vk::BlendOp::eAdd, // colorBlendOp - vk::BlendFactor::eZero, // srcAlphaBlendFactor - vk::BlendFactor::eZero, // dstAlphaBlendFactor - vk::BlendOp::eAdd, // alphaBlendOp - colorComponentFlags // colorWriteMask - }; - } + true, // blendEnable + getBlendFactor(src, true), // srcColorBlendFactor + getBlendFactor(dst, false), // dstColorBlendFactor + vk::BlendOp::eAdd, // colorBlendOp + getBlendFactor(src, true), // srcAlphaBlendFactor + getBlendFactor(dst, false), // dstAlphaBlendFactor + vk::BlendOp::eAdd, // alphaBlendOp + colorComponentFlags // colorWriteMask + }; vk::PipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo ( @@ -392,7 +396,7 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol FragmentShaderParams params = {}; params.alphaTest = listType == ListType_Punch_Through; params.bumpmap = pp.tcw.PixelFmt == PixelBumpMap; - params.clamping = pp.tsp.ColorClamp && (pvrrc.fog_clamp_min.full != 0 || pvrrc.fog_clamp_max.full != 0xffffffff); + params.clamping = pp.tsp.ColorClamp; params.insideClipTest = (pp.tileclip >> 28) == 3; params.fog = config::Fog ? pp.tsp.FogCtrl : 2; params.gouraud = pp.pcw.Gouraud; @@ -404,6 +408,7 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol params.useAlpha = pp.tsp.UseAlpha; params.palette = gpuPalette; params.divPosZ = divPosZ; + params.dithering = dithering; vk::ShaderModule fragment_module = shaderManager->GetFragmentShader(params); std::array stages = { @@ -427,82 +432,6 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol renderPass // renderPass ); - pipelines[hash(listType, sortTriangles, &pp, gpuPalette)] = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), + pipelines[hash(listType, sortTriangles, &pp, gpuPalette, dithering)] = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value; } - -void OSDPipeline::CreatePipeline() -{ - // Vertex input state - static const vk::VertexInputBindingDescription vertexInputBindingDescription(0, sizeof(OSDVertex)); - static const std::array vertexInputAttributeDescriptions = { - vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32Sfloat, offsetof(OSDVertex, x)), // pos - vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Uint, offsetof(OSDVertex, r)), // color - vk::VertexInputAttributeDescription(2, 0, vk::Format::eR32G32Sfloat, offsetof(OSDVertex, u)), // tex coord - }; - vk::PipelineVertexInputStateCreateInfo vertexInputStateCreateInfo( - vk::PipelineVertexInputStateCreateFlags(), - vertexInputBindingDescription, - vertexInputAttributeDescriptions); - - // Input assembly state - vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(), vk::PrimitiveTopology::eTriangleStrip); - - // Viewport and scissor states - vk::PipelineViewportStateCreateInfo pipelineViewportStateCreateInfo(vk::PipelineViewportStateCreateFlags(), 1, nullptr, 1, nullptr); - - // Rasterization and multisample states - vk::PipelineRasterizationStateCreateInfo pipelineRasterizationStateCreateInfo; - pipelineRasterizationStateCreateInfo.lineWidth = 1.0; - vk::PipelineMultisampleStateCreateInfo pipelineMultisampleStateCreateInfo; - - // Depth and stencil - vk::PipelineDepthStencilStateCreateInfo pipelineDepthStencilStateCreateInfo; - - // Color flags and blending - vk::PipelineColorBlendAttachmentState pipelineColorBlendAttachmentState( - true, // blendEnable - vk::BlendFactor::eSrcAlpha, // srcColorBlendFactor - vk::BlendFactor::eOneMinusSrcAlpha, // dstColorBlendFactor - vk::BlendOp::eAdd, // colorBlendOp - vk::BlendFactor::eSrcAlpha, // srcAlphaBlendFactor - vk::BlendFactor::eOneMinusSrcAlpha, // dstAlphaBlendFactor - vk::BlendOp::eAdd, // alphaBlendOp - vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG - | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA - ); - vk::PipelineColorBlendStateCreateInfo pipelineColorBlendStateCreateInfo - ( - vk::PipelineColorBlendStateCreateFlags(), // flags - false, // logicOpEnable - vk::LogicOp::eNoOp, // logicOp - pipelineColorBlendAttachmentState, // attachments - { { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants - ); - - std::array dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor }; - vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates); - - std::array stages = { - vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, shaderManager->GetOSDVertexShader(), "main"), - vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, shaderManager->GetOSDFragmentShader(), "main"), - }; - vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo - ( - vk::PipelineCreateFlags(), // flags - stages, // stages - &vertexInputStateCreateInfo, // pVertexInputState - &pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState - nullptr, // pTessellationState - &pipelineViewportStateCreateInfo, // pViewportState - &pipelineRasterizationStateCreateInfo, // pRasterizationState - &pipelineMultisampleStateCreateInfo, // pMultisampleState - &pipelineDepthStencilStateCreateInfo, // pDepthStencilState - &pipelineColorBlendStateCreateInfo, // pColorBlendState - &pipelineDynamicStateCreateInfo, // pDynamicState - *pipelineLayout, // layout - renderPass // renderPass - ); - - pipeline = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value; -} diff --git a/core/rend/vulkan/pipeline.h b/core/rend/vulkan/pipeline.h index c5d1769b7..d3dfaa8a2 100644 --- a/core/rend/vulkan/pipeline.h +++ b/core/rend/vulkan/pipeline.h @@ -41,8 +41,8 @@ class DescriptorSets } void updateUniforms(vk::Buffer buffer, u32 vertexUniformOffset, u32 fragmentUniformOffset, vk::ImageView fogImageView, vk::ImageView paletteImageView) { - if (!perFrameDescSet) - perFrameDescSet = perFrameAlloc.alloc(); + perFrameDescSet = perFrameAlloc.alloc(); + perPolyDescSets.clear(); std::vector bufferInfos; bufferInfos.emplace_back(buffer, vertexUniformOffset, sizeof(VertexShaderUniforms)); @@ -77,7 +77,7 @@ class DescriptorSets } void bindPerPolyDescriptorSets(vk::CommandBuffer cmdBuffer, const PolyParam& poly, int polyNumber, vk::Buffer buffer, - vk::DeviceSize uniformOffset, vk::DeviceSize lightOffset) + vk::DeviceSize uniformOffset, vk::DeviceSize lightOffset, bool punchThrough) { vk::DescriptorSet perPolyDescSet; auto it = perPolyDescSets.find(&poly); @@ -89,7 +89,7 @@ class DescriptorSets vk::DescriptorImageInfo imageInfo; if (poly.texture != nullptr) { - imageInfo = vk::DescriptorImageInfo(samplerManager->GetSampler(poly.tsp), + imageInfo = vk::DescriptorImageInfo(samplerManager->GetSampler(poly, punchThrough), ((Texture *)poly.texture)->GetReadOnlyImageView(), vk::ImageLayout::eShaderReadOnlyOptimal); writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo); } @@ -211,14 +211,14 @@ class PipelineManager } } - vk::Pipeline GetPipeline(u32 listType, bool sortTriangles, const PolyParam& pp, bool gpuPalette) + vk::Pipeline GetPipeline(u32 listType, bool sortTriangles, const PolyParam& pp, int gpuPalette, bool dithering) { - u32 pipehash = hash(listType, sortTriangles, &pp, gpuPalette); + u64 pipehash = hash(listType, sortTriangles, &pp, gpuPalette, dithering); const auto &pipeline = pipelines.find(pipehash); if (pipeline != pipelines.end()) return pipeline->second.get(); - CreatePipeline(listType, sortTriangles, pp, gpuPalette); + CreatePipeline(listType, sortTriangles, pp, gpuPalette, dithering); return *pipelines[pipehash]; } @@ -260,9 +260,9 @@ class PipelineManager void CreateModVolPipeline(ModVolMode mode, int cullMode, bool naomi2); void CreateDepthPassPipeline(int cullMode, bool naomi2); - u32 hash(u32 listType, bool sortTriangles, const PolyParam *pp, bool gpuPalette) const + u64 hash(u32 listType, bool sortTriangles, const PolyParam *pp, int gpuPalette, bool dithering) const { - u32 hash = pp->pcw.Gouraud | (pp->pcw.Offset << 1) | (pp->pcw.Texture << 2) | (pp->pcw.Shadow << 3) + u64 hash = pp->pcw.Gouraud | (pp->pcw.Offset << 1) | (pp->pcw.Texture << 2) | (pp->pcw.Shadow << 3) | (((pp->tileclip >> 28) == 3) << 4); hash |= ((listType >> 1) << 5); bool ignoreTexAlpha = pp->tsp.IgnoreTexA || pp->tcw.PixelFmt == Pixel565; @@ -270,9 +270,10 @@ class PipelineManager | (pp->tsp.ColorClamp << 11) | ((config::Fog ? pp->tsp.FogCtrl : 2) << 12) | (pp->tsp.SrcInstr << 14) | (pp->tsp.DstInstr << 17); hash |= (pp->isp.ZWriteDis << 20) | (pp->isp.CullMode << 21) | (pp->isp.DepthMode << 23); - hash |= ((u32)sortTriangles << 26) | ((u32)gpuPalette << 27) | ((u32)pp->isNaomi2() << 28); - hash |= (u32)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 29; - hash |= (u32)(pp->tcw.PixelFmt == PixelBumpMap) << 30; + hash |= ((u64)sortTriangles << 26) | ((u64)gpuPalette << 27) | ((u64)pp->isNaomi2() << 29); + hash |= (u64)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 30; + hash |= (u64)(pp->tcw.PixelFmt == PixelBumpMap) << 31; + hash |= (u64)dithering << 32; return hash; } @@ -285,7 +286,7 @@ class PipelineManager return cullMode | ((int)naomi2 << 2) | ((int)(!settings.platform.isNaomi2() && config::NativeDepthInterpolation) << 3); } - vk::PipelineVertexInputStateCreateInfo GetMainVertexInputStateCreateInfo(bool full = true) const + vk::PipelineVertexInputStateCreateInfo GetMainVertexInputStateCreateInfo(bool full = true, bool naomi2 = false) const { // Vertex input state static const vk::VertexInputBindingDescription vertexBindingDescriptions[] = @@ -295,8 +296,8 @@ class PipelineManager static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] = { vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, x)), // pos - vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, col)), // base color - vk::VertexInputAttributeDescription(2, 0, vk::Format::eR8G8B8A8Uint, offsetof(Vertex, spc)), // offset color + vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, col)), // base color + vk::VertexInputAttributeDescription(2, 0, vk::Format::eR8G8B8A8Unorm, offsetof(Vertex, spc)), // offset color vk::VertexInputAttributeDescription(3, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, u)), // tex coord vk::VertexInputAttributeDescription(4, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, nx)), // naomi2 normal }; @@ -304,17 +305,38 @@ class PipelineManager { vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, x)), // pos }; + + + const vk::VertexInputAttributeDescription* attributeDescription = vertexInputLightAttributeDescriptions; + u32 attributeDescriptionSize = std::size(vertexInputLightAttributeDescriptions); + + if (full) + { + attributeDescription = vertexInputAttributeDescriptions; + + if (naomi2) + { + attributeDescriptionSize = std::size(vertexInputAttributeDescriptions); + } + else + { + // naomi2 normal not needed + attributeDescriptionSize = std::size(vertexInputAttributeDescriptions) - 1; + } + } + + + return vk::PipelineVertexInputStateCreateInfo( vk::PipelineVertexInputStateCreateFlags(), - std::size(vertexBindingDescriptions), - vertexBindingDescriptions, - full ? std::size(vertexInputAttributeDescriptions) : std::size(vertexInputLightAttributeDescriptions), - full ? vertexInputAttributeDescriptions : vertexInputLightAttributeDescriptions); + std::size(vertexBindingDescriptions), vertexBindingDescriptions, + attributeDescriptionSize, attributeDescription + ); } - void CreatePipeline(u32 listType, bool sortTriangles, const PolyParam& pp, bool gpuPalette); + void CreatePipeline(u32 listType, bool sortTriangles, const PolyParam& pp, int gpuPalette, bool dithering); - std::map pipelines; + std::map pipelines; std::map modVolPipelines; std::map depthPassPipelines; @@ -376,74 +398,3 @@ class RttPipelineManager : public PipelineManager vk::UniqueRenderPass rttRenderPass; bool renderToTextureBuffer = false; }; - -class OSDPipeline -{ -public: - void Init(ShaderManager *shaderManager, vk::ImageView imageView, vk::RenderPass renderPass) - { - this->shaderManager = shaderManager; - if (!pipelineLayout) - { - vk::DescriptorSetLayoutBinding binding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment); // texture - descSetLayout = GetContext()->GetDevice().createDescriptorSetLayoutUnique( - vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), binding)); - pipelineLayout = GetContext()->GetDevice().createPipelineLayoutUnique( - vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), descSetLayout.get())); - } - if (!sampler) - { - sampler = GetContext()->GetDevice().createSamplerUnique( - vk::SamplerCreateInfo(vk::SamplerCreateFlags(), vk::Filter::eLinear, vk::Filter::eLinear, - vk::SamplerMipmapMode::eLinear, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, - vk::SamplerAddressMode::eClampToEdge, 0.0f, false, 16.0f, false, - vk::CompareOp::eNever, 0.0f, 0.0f, vk::BorderColor::eFloatOpaqueBlack)); - } - if (this->renderPass != renderPass) - { - this->renderPass = renderPass; - pipeline.reset(); - } - if (!descriptorSet) - { - descriptorSet = std::move(GetContext()->GetDevice().allocateDescriptorSetsUnique( - vk::DescriptorSetAllocateInfo(GetContext()->GetDescriptorPool(), descSetLayout.get())).front()); - } - vk::DescriptorImageInfo imageInfo(*sampler, imageView, vk::ImageLayout::eShaderReadOnlyOptimal); - vk::WriteDescriptorSet writeDescriptorSet(*descriptorSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo); - GetContext()->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr); - } - - void Term() - { - descriptorSet.reset(); - pipeline.reset(); - sampler.reset(); - pipelineLayout.reset(); - descSetLayout.reset(); - } - - vk::Pipeline GetPipeline() - { - if (!pipeline) - CreatePipeline(); - return *pipeline; - } - - void BindDescriptorSets(vk::CommandBuffer cmdBuffer) const - { - cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipelineLayout, 0, descriptorSet.get(), nullptr); - } - -private: - VulkanContext *GetContext() const { return VulkanContext::Instance(); } - void CreatePipeline(); - - vk::RenderPass renderPass; - vk::UniquePipeline pipeline; - vk::UniqueSampler sampler; - vk::UniqueDescriptorSet descriptorSet; - vk::UniquePipelineLayout pipelineLayout; - vk::UniqueDescriptorSetLayout descSetLayout; - ShaderManager *shaderManager = nullptr; -}; diff --git a/core/rend/vulkan/quad.cpp b/core/rend/vulkan/quad.cpp index 3458075cb..c18266311 100644 --- a/core/rend/vulkan/quad.cpp +++ b/core/rend/vulkan/quad.cpp @@ -23,6 +23,19 @@ #include +namespace { + size_t hashQuadVertex(const QuadVertex& vertex) + { + size_t seed = 0; + seed ^= std::hash{}(vertex.x) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= std::hash{}(vertex.y) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= std::hash{}(vertex.z) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= std::hash{}(vertex.u) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= std::hash{}(vertex.v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; + } +} + static VulkanContext *GetContext() { return VulkanContext::Instance(); @@ -137,7 +150,7 @@ void QuadPipeline::Init(ShaderManager *shaderManager, vk::RenderPass renderPass, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, 0.0f, false, - 16.0f, false, vk::CompareOp::eNever, 0.0f, 0.0f, + 16.0f, false, vk::CompareOp::eNever, 0.0f, vk::LodClampNone, vk::BorderColor::eFloatOpaqueBlack)); } if (!nearestSampler) @@ -149,7 +162,7 @@ void QuadPipeline::Init(ShaderManager *shaderManager, vk::RenderPass renderPass, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, 0.0f, false, - 16.0f, false, vk::CompareOp::eNever, 0.0f, 0.0f, + 16.0f, false, vk::CompareOp::eNever, 0.0f, vk::LodClampNone, vk::BorderColor::eFloatOpaqueBlack)); } if (this->renderPass != renderPass) @@ -169,7 +182,7 @@ void QuadDrawer::Init(QuadPipeline *pipeline) descSet.reset(); } -void QuadDrawer::Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView, QuadVertex vertices[], bool nearestFilter, const float *color) +void QuadDrawer::Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView, QuadVertex vertices[4], bool nearestFilter, const float *color) { VulkanContext *context = GetContext(); auto &descSet = descriptorSets[context->GetCurrentImageIndex()]; @@ -198,3 +211,13 @@ void QuadDrawer::Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView, commandBuffer.pushConstants(pipeline->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, sizeof(float) * 4, color); buffer->Draw(commandBuffer); } + +size_t QuadBuffer::hashQuadVertexData(QuadVertex vertices[4]) const +{ + size_t seed = 0; + seed ^= hashQuadVertex(vertices[0]) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hashQuadVertex(vertices[1]) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hashQuadVertex(vertices[2]) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + seed ^= hashQuadVertex(vertices[3]) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; +} diff --git a/core/rend/vulkan/quad.h b/core/rend/vulkan/quad.h index cc36bef08..d3e060e64 100644 --- a/core/rend/vulkan/quad.h +++ b/core/rend/vulkan/quad.h @@ -50,11 +50,12 @@ class QuadBuffer commandBuffer.draw(4, 1, 0, 0); } - void Update(QuadVertex vertices[] = nullptr) + void Update(QuadVertex vertices[4] = nullptr) { if (vertices == nullptr) { - static QuadVertex defaultVtx[] { + static QuadVertex defaultVtx[4] + { { -1.f, -1.f, 0.f, 0.f, 0.f }, { 1.f, -1.f, 0.f, 1.f, 0.f }, { -1.f, 1.f, 0.f, 0.f, 1.f }, @@ -62,10 +63,24 @@ class QuadBuffer }; vertices = defaultVtx; }; + + const size_t quadVerticesHash = hashQuadVertexData(vertices);; + if (quadVerticesHash == lastUploadHash) + { + // data already uploaded + return; + } + + // new data to upload, update hash + lastUploadHash = quadVerticesHash; buffer->upload(sizeof(QuadVertex) * 4, vertices); + } private: std::unique_ptr buffer; + + size_t hashQuadVertexData(QuadVertex vertices[4]) const; + size_t lastUploadHash = 0; }; class QuadPipeline @@ -119,7 +134,7 @@ class QuadDrawer QuadDrawer& operator=(const QuadDrawer &) = delete; void Init(QuadPipeline *pipeline); - void Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView, QuadVertex vertices[] = nullptr, bool nearestFilter = false, const float *color = nullptr); + void Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView, QuadVertex vertices[4] = nullptr, bool nearestFilter = false, const float *color = nullptr); private: QuadPipeline *pipeline = nullptr; std::unique_ptr buffer; diff --git a/core/rend/vulkan/shaders.cpp b/core/rend/vulkan/shaders.cpp index 75e327602..4f21f74f2 100644 --- a/core/rend/vulkan/shaders.cpp +++ b/core/rend/vulkan/shaders.cpp @@ -30,8 +30,8 @@ layout (std140, set = 0, binding = 0) uniform VertexShaderUniforms } uniformBuffer; layout (location = 0) in vec4 in_pos; -layout (location = 1) in uvec4 in_base; -layout (location = 2) in uvec4 in_offs; +layout (location = 1) in vec4 in_base; +layout (location = 2) in vec4 in_offs; layout (location = 3) in mediump vec2 in_uv; layout (location = 0) INTERPOLATION out highp vec4 vtx_base; @@ -45,8 +45,8 @@ void main() vpos /= vpos.z; vpos.z = vpos.w; #endif - vtx_base = vec4(in_base) / 255.0; - vtx_offs = vec4(in_offs) / 255.0; + vtx_base = in_base; + vtx_offs = in_offs; vtx_uv = vec3(in_uv, vpos.z); #if pp_Gouraud == 1 && DIV_POS_Z != 1 vtx_base *= vpos.z; @@ -62,9 +62,7 @@ void main() } )"; -static const char FragmentShaderSource[] = R"( -#define PI 3.1415926 - +static const char FragmentShaderTop[] = R"( layout (location = 0) out vec4 FragColor; #define gl_FragColor FragColor @@ -74,6 +72,7 @@ layout (std140, set = 0, binding = 1) uniform FragmentShaderUniforms vec4 colorClampMax; vec4 sp_FOG_COL_RAM; vec4 sp_FOG_COL_VERT; + vec4 ditherColorMax; float cp_AlphaTestValue; float sp_FOG_DENSITY; } uniformBuffer; @@ -88,7 +87,10 @@ layout (push_constant) uniform pushBlock #if pp_Texture == 1 layout (set = 1, binding = 0) uniform sampler2D tex; #endif -#if pp_Palette == 1 +#if pp_FogCtrl != 2 +layout (set = 0, binding = 2) uniform sampler2D fog_table; +#endif +#if pp_Palette != 0 layout (set = 0, binding = 3) uniform sampler2D palette; #endif @@ -96,10 +98,12 @@ layout (set = 0, binding = 3) uniform sampler2D palette; layout (location = 0) INTERPOLATION in highp vec4 vtx_base; layout (location = 1) INTERPOLATION in highp vec4 vtx_offs; layout (location = 2) in highp vec3 vtx_uv; +)"; -#if pp_FogCtrl != 2 -layout (set = 0, binding = 2) uniform sampler2D fog_table; +const char *FragmentShaderCommon = R"( +#define PI 3.1415926 +#if pp_FogCtrl != 2 || pp_TwoVolumes == 1 float fog_mode2(float w) { float z = clamp( @@ -126,21 +130,58 @@ vec4 colorClamp(vec4 col) #endif } +#if pp_Palette != 0 + +vec4 getPaletteEntry(float colIdx) +{ + vec2 c = vec2(colIdx * 255.0 / 1023.0 + pushConstants.palette_index, 0.5); + return texture(palette, c); +} + +#endif + #if pp_Palette == 1 vec4 palettePixel(sampler2D tex, vec3 coords) { #if DIV_POS_Z == 1 - float texIdx = texture(tex, coords.xy).r; + return getPaletteEntry(texture(tex, coords.xy).r); #else - float texIdx = textureProj(tex, coords).r; + return getPaletteEntry(textureProj(tex, coords).r); #endif - vec4 c = vec4(texIdx * 255.0 / 1023.0 + pushConstants.palette_index, 0.5, 0.0, 0.0); - return texture(palette, c.xy); } +#elif pp_Palette == 2 + +vec4 palettePixelBilinear(sampler2D tex, vec3 coords) +{ +#if DIV_POS_Z == 0 + coords.xy /= coords.z; #endif + vec2 texSize = vec2(textureSize(tex, 0)); + vec2 pixCoord = coords.xy * texSize - 0.5; // coordinates of top left pixel + vec2 originPixCoord = floor(pixCoord); + + vec2 sampleUV = (originPixCoord + 0.5) / texSize; // UV coordinates of center of top left pixel + + // Sample from all surrounding texels + vec4 c00 = getPaletteEntry(texture(tex, sampleUV).r); + vec4 c01 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(0, 1)).r); + vec4 c11 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 1)).r); + vec4 c10 = getPaletteEntry(textureOffset(tex, sampleUV, ivec2(1, 0)).r); + + vec2 weight = pixCoord - originPixCoord; + // Bi-linear mixing + vec4 temp0 = mix(c00, c10, weight.x); + vec4 temp1 = mix(c01, c11, weight.x); + return mix(temp0, temp1, weight.y); +} + +#endif +)"; + +static const char FragmentShaderMain[] = R"( void main() { // Clip inside the box @@ -171,7 +212,11 @@ void main() vec4 texcol = textureProj(tex, vtx_uv); #endif #else - vec4 texcol = palettePixel(tex, vtx_uv); + #if pp_Palette == 1 + vec4 texcol = palettePixel(tex, vtx_uv); + #else + vec4 texcol = palettePixelBilinear(tex, vtx_uv); + #endif #endif #if pp_BumpMap == 1 @@ -183,12 +228,6 @@ void main() #if pp_IgnoreTexA == 1 texcol.a = 1.0; #endif - - #if cp_AlphaTest == 1 - if (uniformBuffer.cp_AlphaTestValue > texcol.a) - discard; - texcol.a = 1.0; - #endif #endif #if pp_ShadInstr == 0 { @@ -237,6 +276,13 @@ void main() color *= pushConstants.trilinearAlpha; #endif + #if cp_AlphaTest == 1 + color.a = round(color.a * 255.0) / 255.0; + if (uniformBuffer.cp_AlphaTestValue > color.a) + discard; + color.a = 1.0; + #endif + //color.rgb = vec3(gl_FragCoord.w * uniformBuffer.sp_FOG_DENSITY / 128.0); #if DIV_POS_Z == 1 @@ -244,8 +290,21 @@ void main() #else highp float w = 100000.0 * vtx_uv.z; #endif - gl_FragDepth = log2(1.0 + w) / 34.0; - + gl_FragDepth = log2(1.0 + max(w, -0.999999)) / 34.0; + +#if DITHERING == 1 + float ditherTable[16] = float[]( + 0.9375, 0.1875, 0.75, 0., + 0.4375, 0.6875, 0.25, 0.5, + 0.8125, 0.0625, 0.875, 0.125, + 0.3125, 0.5625, 0.375, 0.625 + ); + float r = ditherTable[int(mod(gl_FragCoord.y, 4.)) * 4 + int(mod(gl_FragCoord.x, 4.))]; + // 31 for 5-bit color, 63 for 6 bits, 15 for 4 bits + color += r / uniformBuffer.ditherColorMax; + // avoid rounding + color = floor(color * 255.) / 255.; +#endif gl_FragColor = color; } )"; @@ -291,7 +350,7 @@ void main() #else highp float w = 100000.0 * depth; #endif - gl_FragDepth = log2(1.0 + w) / 34.0; + gl_FragDepth = log2(1.0 + max(w, -0.999999)) / 34.0; FragColor = vec4(0.0, 0.0, 0.0, pushConstants.sp_ShaderColor); } )"; @@ -335,33 +394,6 @@ void main() } )"; -static const char OSDVertexShaderSource[] = R"( -layout (location = 0) in vec4 inPos; -layout (location = 1) in uvec4 inColor; -layout (location = 2) in vec2 inUV; -layout (location = 0) out lowp vec4 outColor; -layout (location = 1) out mediump vec2 outUV; - -void main() -{ - outColor = inColor / 255.0; - outUV = inUV; - gl_Position = inPos; -} -)"; - -static const char OSDFragmentShaderSource[] = R"( -layout (binding = 0) uniform sampler2D tex; -layout (location = 0) in lowp vec4 inColor; -layout (location = 1) in mediump vec2 inUV; -layout (location = 0) out vec4 FragColor; - -void main() -{ - FragColor = inColor * texture(tex, inUV); -} -)"; - extern const char N2LightShaderSource[] = R"( layout (std140, set = 1, binding = 2) uniform N2VertexShaderUniforms @@ -600,8 +632,8 @@ layout (std140, set = 0, binding = 0) uniform VertexShaderUniforms } uniformBuffer; layout (location = 0) in vec4 in_pos; -layout (location = 1) in uvec4 in_base; -layout (location = 2) in uvec4 in_offs; +layout (location = 1) in vec4 in_base; +layout (location = 2) in vec4 in_offs; layout (location = 3) in mediump vec2 in_uv; layout (location = 4) in vec3 in_normal; @@ -625,8 +657,8 @@ void wDivide(inout vec4 vpos) void main() { vec4 vpos = n2Uniform.mvMat * in_pos; - vtx_base = vec4(in_base) / 255.0; - vtx_offs = vec4(in_offs) / 255.0; + vtx_base = in_base; + vtx_offs = in_offs; vec3 vnorm = normalize(mat3(n2Uniform.normalMat) * in_normal); @@ -684,6 +716,7 @@ void wDivide(inout vec4 vpos) void main() { vec4 vpos = n2Uniform.mvMat * in_pos; + vpos.z = min(vpos.z, -0.001); vpos = n2Uniform.projMat * vpos; wDivide(vpos); @@ -726,10 +759,13 @@ vk::UniqueShaderModule ShaderManager::compileShader(const FragmentShaderParams& .addConstant("pp_BumpMap", (int)params.bumpmap) .addConstant("ColorClamping", (int)params.clamping) .addConstant("pp_TriLinear", (int)params.trilinear) - .addConstant("pp_Palette", (int)params.palette) + .addConstant("pp_Palette", params.palette) .addConstant("DIV_POS_Z", (int)params.divPosZ) + .addConstant("DITHERING", (int)params.dithering) .addSource(GouraudSource) - .addSource(FragmentShaderSource); + .addSource(FragmentShaderTop) + .addSource(FragmentShaderCommon) + .addSource(FragmentShaderMain); return ShaderCompiler::Compile(vk::ShaderStageFlagBits::eFragment, src.generate()); } @@ -762,13 +798,3 @@ vk::UniqueShaderModule ShaderManager::compileQuadFragmentShader(bool ignoreTexAl .addSource(QuadFragmentShaderSource); return ShaderCompiler::Compile(vk::ShaderStageFlagBits::eFragment,src.generate()); } - -vk::UniqueShaderModule ShaderManager::compileOSDVertexShader() -{ - return ShaderCompiler::Compile(vk::ShaderStageFlagBits::eVertex, VulkanSource().addSource(OSDVertexShaderSource).generate()); -} - -vk::UniqueShaderModule ShaderManager::compileOSDFragmentShader() -{ - return ShaderCompiler::Compile(vk::ShaderStageFlagBits::eFragment, VulkanSource().addSource(OSDFragmentShaderSource).generate()); -} diff --git a/core/rend/vulkan/shaders.h b/core/rend/vulkan/shaders.h index 148122335..6ec5e019d 100644 --- a/core/rend/vulkan/shaders.h +++ b/core/rend/vulkan/shaders.h @@ -20,7 +20,7 @@ */ #pragma once #include "vulkan.h" -#include "SPIRV/GlslangToSpv.h" +#include #include #include @@ -49,8 +49,9 @@ struct FragmentShaderParams bool bumpmap; bool clamping; bool trilinear; - bool palette; + int palette; bool divPosZ; + bool dithering; u32 hash() { @@ -58,7 +59,7 @@ struct FragmentShaderParams | ((u32)texture << 3) | ((u32)ignoreTexAlpha << 4) | (shaderInstr << 5) | ((u32)offset << 7) | ((u32)fog << 8) | ((u32)gouraud << 10) | ((u32)bumpmap << 11) | ((u32)clamping << 12) | ((u32)trilinear << 13) - | ((u32)palette << 14) | ((u32)divPosZ << 15); + | ((u32)palette << 14) | ((u32)divPosZ << 16) | ((u32)dithering << 17); } }; @@ -83,6 +84,7 @@ struct FragmentShaderUniforms float colorClampMax[4]; float sp_FOG_COL_RAM[4]; // Only using 3 elements but easier for std140 float sp_FOG_COL_VERT[4]; // same comment + float ditherColorMax[4]; float cp_AlphaTestValue; float sp_FOG_DENSITY; }; @@ -145,18 +147,6 @@ class ShaderManager return *quadFragmentShader; } } - vk::ShaderModule GetOSDVertexShader() - { - if (!osdVertexShader) - osdVertexShader = compileOSDVertexShader(); - return *osdVertexShader; - } - vk::ShaderModule GetOSDFragmentShader() - { - if (!osdFragmentShader) - osdFragmentShader = compileOSDFragmentShader(); - return *osdFragmentShader; - } void term() { @@ -169,8 +159,6 @@ class ShaderManager quadRotateVertexShader.reset(); quadFragmentShader.reset(); quadNoAlphaFragmentShader.reset(); - osdVertexShader.reset(); - osdFragmentShader.reset(); } private: @@ -190,8 +178,6 @@ class ShaderManager vk::UniqueShaderModule compileModVolFragmentShader(bool divPosZ); vk::UniqueShaderModule compileQuadVertexShader(bool rotate); vk::UniqueShaderModule compileQuadFragmentShader(bool ignoreTexAlpha); - vk::UniqueShaderModule compileOSDVertexShader(); - vk::UniqueShaderModule compileOSDFragmentShader(); std::map vertexShaders; std::map fragmentShaders; @@ -201,6 +187,4 @@ class ShaderManager vk::UniqueShaderModule quadRotateVertexShader; vk::UniqueShaderModule quadFragmentShader; vk::UniqueShaderModule quadNoAlphaFragmentShader; - vk::UniqueShaderModule osdVertexShader; - vk::UniqueShaderModule osdFragmentShader; }; diff --git a/core/rend/vulkan/texture.cpp b/core/rend/vulkan/texture.cpp index a958675cd..a269762b9 100644 --- a/core/rend/vulkan/texture.cpp +++ b/core/rend/vulkan/texture.cpp @@ -25,6 +25,9 @@ void setImageLayout(vk::CommandBuffer const& commandBuffer, vk::Image image, vk::Format format, u32 mipmapLevels, vk::ImageLayout oldImageLayout, vk::ImageLayout newImageLayout) { + static const float scopeColor[4] = { 0.75f, 0.75f, 0.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer, "setImageLayout", scopeColor); + vk::AccessFlags sourceAccessMask; switch (oldImageLayout) { @@ -180,7 +183,8 @@ void Texture::UploadToGPU(int width, int height, const u8 *data, bool mipmapped, } } bool isNew = true; - if (width != (int)extent.width || height != (int)extent.height || format != this->format) + if (width != (int)extent.width || height != (int)extent.height + || format != this->format || !this->image) Init(width, height, format, dataSize, mipmapped, mipmapsIncluded); else isNew = false; @@ -228,9 +232,10 @@ void Texture::Init(u32 width, u32 height, vk::Format format, u32 dataSize, bool CreateImage(imageTiling, usageFlags, initialLayout, vk::ImageAspectFlagBits::eColor); } -void Texture::CreateImage(vk::ImageTiling tiling, const vk::ImageUsageFlags& usage, vk::ImageLayout initialLayout, - const vk::ImageAspectFlags& aspectMask) +void Texture::CreateImage(vk::ImageTiling tiling, vk::ImageUsageFlags usage, vk::ImageLayout initialLayout, + vk::ImageAspectFlags aspectMask) { + this->usageFlags = usage; vk::ImageCreateInfo imageCreateInfo(vk::ImageCreateFlags(), vk::ImageType::e2D, format, vk::Extent3D(extent, 1), mipmapLevels, 1, vk::SampleCountFlagBits::e1, tiling, usage, vk::SharingMode::eExclusive, nullptr, initialLayout); @@ -246,12 +251,21 @@ void Texture::CreateImage(vk::ImageTiling tiling, const vk::ImageUsageFlags& usa vk::ImageViewCreateInfo imageViewCreateInfo(vk::ImageViewCreateFlags(), image.get(), vk::ImageViewType::e2D, format, vk::ComponentMapping(), vk::ImageSubresourceRange(aspectMask, 0, mipmapLevels, 0, 1)); imageView = device.createImageViewUnique(imageViewCreateInfo); +#ifdef VK_DEBUG + char name[128]; + sprintf(name, "texture @ %x", startAddress); + VulkanContext::Instance()->setObjectName(image.get(), name); + VulkanContext::Instance()->setObjectName(imageView.get(), name); +#endif } void Texture::SetImage(u32 srcSize, const void *srcData, bool isNew, bool genMipmaps) { verify((bool)commandBuffer); + static const float scopeColor[4] = { 1.0f, 1.0f, 0.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer, "SetImage", scopeColor); + if (!isNew && !needsStaging) setImageLayout(commandBuffer, image.get(), format, mipmapLevels, vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eGeneral); @@ -346,6 +360,9 @@ void Texture::SetImage(u32 srcSize, const void *srcData, bool isNew, bool genMip void Texture::GenerateMipmaps() { + static const float scopeColor[4] = { 0.75f, 0.75f, 0.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer, "GenerateMipmaps", scopeColor); + u32 mipWidth = extent.width; u32 mipHeight = extent.height; vk::ImageMemoryBarrier barrier(vk::AccessFlagBits::eTransferWrite, vk::AccessFlagBits::eTransferRead, @@ -396,7 +413,29 @@ void Texture::GenerateMipmaps() commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eFragmentShader, {}, nullptr, nullptr, barrier); } -void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format, const vk::ImageUsageFlags& usage) +void Texture::deferDeleteResource(FlightManager *manager) +{ + class ResourceDeleter : public Deletable + { + public: + ResourceDeleter(Texture *texture) + { + std::swap(image, texture->image); + std::swap(imageView, texture->imageView); + std::swap(bufferData, texture->stagingBufferData); + std::swap(allocation, texture->allocation); + } + + private: + vk::UniqueImage image; + vk::UniqueImageView imageView; + std::unique_ptr bufferData; + Allocation allocation; + }; + manager->addToFlight(new ResourceDeleter(this)); +} + +void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format, const vk::ImageUsageFlags& usage, const std::string& name) { this->format = format; this->extent = vk::Extent2D { width, height }; @@ -412,6 +451,10 @@ void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format, const vk::ImageTiling::eOptimal, usage, vk::SharingMode::eExclusive, nullptr, vk::ImageLayout::eUndefined); image = device.createImageUnique(imageCreateInfo); +#ifdef VK_DEBUG + if (!name.empty()) + VulkanContext::Instance()->setObjectName(image.get(), name); +#endif VmaAllocationCreateInfo allocCreateInfo = { VmaAllocationCreateFlags(), VmaMemoryUsage::VMA_MEMORY_USAGE_GPU_ONLY }; if (usage & vk::ImageUsageFlagBits::eTransientAttachment) @@ -423,12 +466,20 @@ void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format, const vk::ImageViewCreateInfo imageViewCreateInfo(vk::ImageViewCreateFlags(), image.get(), vk::ImageViewType::e2D, format, vk::ComponentMapping(), vk::ImageSubresourceRange(depth ? vk::ImageAspectFlagBits::eDepth : vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1)); imageView = device.createImageViewUnique(imageViewCreateInfo); +#ifdef VK_DEBUG + if (!name.empty()) + VulkanContext::Instance()->setObjectName(imageView.get(), name); +#endif if ((usage & vk::ImageUsageFlagBits::eDepthStencilAttachment) && (usage & vk::ImageUsageFlagBits::eInputAttachment)) { // Also create an imageView for the stencil imageViewCreateInfo.subresourceRange = vk::ImageSubresourceRange(vk::ImageAspectFlagBits::eStencil, 0, 1, 0, 1); stencilView = device.createImageViewUnique(imageViewCreateInfo); +#ifdef VK_DEBUG + if (!name.empty()) + VulkanContext::Instance()->setObjectName(stencilView.get(), name); +#endif } } } diff --git a/core/rend/vulkan/texture.h b/core/rend/vulkan/texture.h index 2c667dcbc..5acd49775 100644 --- a/core/rend/vulkan/texture.h +++ b/core/rend/vulkan/texture.h @@ -64,17 +64,19 @@ class Texture final : public BaseTextureCacheData void SetCommandBuffer(vk::CommandBuffer commandBuffer) { this->commandBuffer = commandBuffer; } bool Force32BitTexture(TextureType type) const override { return !VulkanContext::Instance()->IsFormatSupported(type); } vk::Extent2D getSize() const { return extent; } + void deferDeleteResource(FlightManager *manager); private: void Init(u32 width, u32 height, vk::Format format ,u32 dataSize, bool mipmapped, bool mipmapsIncluded); void SetImage(u32 size, const void *data, bool isNew, bool genMipmaps); - void CreateImage(vk::ImageTiling tiling, const vk::ImageUsageFlags& usage, vk::ImageLayout initialLayout, - const vk::ImageAspectFlags& aspectMask); + void CreateImage(vk::ImageTiling tiling, vk::ImageUsageFlags usage, vk::ImageLayout initialLayout, + vk::ImageAspectFlags aspectMask); void GenerateMipmaps(); vk::Format format = vk::Format::eUndefined; vk::Extent2D extent; u32 mipmapLevels = 1; + vk::ImageUsageFlags usageFlags; bool needsStaging = false; std::unique_ptr stagingBufferData; vk::CommandBuffer commandBuffer; @@ -99,41 +101,51 @@ class SamplerManager samplers.clear(); } - vk::Sampler GetSampler(TSP tsp) + vk::Sampler GetSampler(const PolyParam& poly, bool punchThrough, bool texture1 = false) { - const u32 samplerHash = tsp.full & TSP_Mask; // MipMapD, FilterMode, ClampU, ClampV, FlipU, FlipV + TSP tsp = texture1 ? poly.tsp1 : poly.tsp; + if (poly.texture != nullptr && poly.texture->gpuPalette) + tsp.FilterMode = 0; + else if (config::TextureFiltering == 1) + tsp.FilterMode = 0; + else if (config::TextureFiltering == 2) + tsp.FilterMode = 1; + return GetSampler(tsp, punchThrough); + } + + vk::Sampler GetSampler(TSP tsp, bool punchThrough = false) + { + const u32 samplerHash = (tsp.full & TSP_Mask) | punchThrough; // MipMapD, FilterMode, ClampU, ClampV, FlipU, FlipV const auto& it = samplers.find(samplerHash); if (it != samplers.end()) return it->second.get(); - vk::Filter filter; - if (config::TextureFiltering == 0) { - filter = tsp.FilterMode == 0 ? vk::Filter::eNearest : vk::Filter::eLinear; - } else if (config::TextureFiltering == 1) { - filter = vk::Filter::eNearest; - } else { - filter = vk::Filter::eLinear; - } + vk::Filter filter = tsp.FilterMode == 0 ? vk::Filter::eNearest : vk::Filter::eLinear; const vk::SamplerAddressMode uRepeat = tsp.ClampU ? vk::SamplerAddressMode::eClampToEdge : tsp.FlipU ? vk::SamplerAddressMode::eMirroredRepeat : vk::SamplerAddressMode::eRepeat; const vk::SamplerAddressMode vRepeat = tsp.ClampV ? vk::SamplerAddressMode::eClampToEdge : tsp.FlipV ? vk::SamplerAddressMode::eMirroredRepeat : vk::SamplerAddressMode::eRepeat; + // The W-axis is unused for 2D textures + // Try to keep all three of the wrapping-modes the same by just repeating vRepeat for wRepeat + // BestPractices-Arm-vkCreateSampler-different-wrapping-modes + const vk::SamplerAddressMode wRepeat = vRepeat; + const bool anisotropicFiltering = config::AnisotropicFiltering > 1 && VulkanContext::Instance()->SupportsSamplerAnisotropy() - && filter == vk::Filter::eLinear; + && filter == vk::Filter::eLinear && !punchThrough; #ifndef __APPLE__ - const float mipLodBias = D_Adjust_LoD_Bias[tsp.MipMapD]; + const float mipLodBias = D_Adjust_LoD_Bias[tsp.MipMapD] - 1.f; #else // not supported by metal const float mipLodBias = 0; #endif - const vk::SamplerMipmapMode mipmapMode = filter == vk::Filter::eLinear ? vk::SamplerMipmapMode::eLinear : vk::SamplerMipmapMode::eNearest; + const vk::SamplerMipmapMode mipmapMode = !punchThrough && filter == vk::Filter::eLinear ? vk::SamplerMipmapMode::eLinear : vk::SamplerMipmapMode::eNearest; return samplers.emplace( std::make_pair(samplerHash, VulkanContext::Instance()->GetDevice().createSamplerUnique( vk::SamplerCreateInfo(vk::SamplerCreateFlags(), filter, filter, - mipmapMode, uRepeat, vRepeat, vk::SamplerAddressMode::eClampToEdge, mipLodBias, + mipmapMode, uRepeat, vRepeat, wRepeat, mipLodBias, anisotropicFiltering, std::min((float)config::AnisotropicFiltering, VulkanContext::Instance()->GetMaxSamplerAnisotropy()), false, vk::CompareOp::eNever, - 0.0f, 256.0f, vk::BorderColor::eFloatOpaqueBlack)))).first->second.get(); + 0.0f, vk::LodClampNone, vk::BorderColor::eFloatOpaqueBlack)))).first->second.get(); } static const u32 TSP_Mask = 0x7ef00; @@ -147,7 +159,7 @@ class FramebufferAttachment FramebufferAttachment(vk::PhysicalDevice physicalDevice, vk::Device device) : format(vk::Format::eUndefined), physicalDevice(physicalDevice), device(device) {} - void Init(u32 width, u32 height, vk::Format format, const vk::ImageUsageFlags& usage); + void Init(u32 width, u32 height, vk::Format format, const vk::ImageUsageFlags& usage, const std::string& name = ""); void Reset() { image.reset(); imageView.reset(); } vk::ImageView GetImageView() const { return *imageView; } @@ -176,22 +188,23 @@ class TextureCache final : public BaseTextureCache TextureCache() { Texture::SetDirectXColorOrder(false); } - void SetCurrentIndex(int index) { + void SetCurrentIndex(int index) + { + if (index == (int)currentIndex) + return; if (currentIndex < inFlightTextures.size()) std::for_each(inFlightTextures[currentIndex].begin(), inFlightTextures[currentIndex].end(), [](Texture *texture) { texture->readOnlyImageView = vk::ImageView(); }); currentIndex = index; EmptyTrash(inFlightTextures); - EmptyTrash(trashedImageViews); - EmptyTrash(trashedImages); - EmptyTrash(trashedMem); - EmptyTrash(trashedBuffers); } - bool IsInFlight(Texture *texture) + // Checks whether a given texture is in use by a previous frame, including the current one if previous is false + bool IsInFlight(Texture *texture, bool previous) { for (u32 i = 0; i < inFlightTextures.size(); i++) - if (i != currentIndex && inFlightTextures[i].find(texture) != inFlightTextures[i].end()) + if ((!previous || i != currentIndex) + && inFlightTextures[i].find(texture) != inFlightTextures[i].end()) return true; return false; } @@ -201,32 +214,18 @@ class TextureCache final : public BaseTextureCache inFlightTextures[currentIndex].insert(texture); } - void DestroyLater(Texture *texture) - { - if (!texture->image) - return; - trashedImages[currentIndex].push_back(std::move(texture->image)); - trashedImageViews[currentIndex].push_back(std::move(texture->imageView)); - trashedMem[currentIndex].push_back(std::move(texture->allocation)); - trashedBuffers[currentIndex].push_back(std::move(texture->stagingBufferData)); - texture->format = vk::Format::eUndefined; - } - void Cleanup(); void Clear() { - BaseTextureCache::Clear(); + VulkanContext *context = VulkanContext::Instance(); for (auto& set : inFlightTextures) + { + for (Texture *tex : set) + tex->deferDeleteResource(context); set.clear(); - for (auto& v : trashedImageViews) - v.clear(); - for (auto& v : trashedImages) - v.clear(); - for (auto& v : trashedMem) - v.clear(); - for (auto& v : trashedBuffers) - v.clear(); + } + BaseTextureCache::Clear(); } private: @@ -243,12 +242,10 @@ class TextureCache final : public BaseTextureCache { if (v.size() < currentIndex + 1) v.resize(currentIndex + 1); - v[currentIndex].clear(); + else + v[currentIndex].clear(); } + std::vector> inFlightTextures; - std::vector> trashedImageViews; - std::vector> trashedImages; - std::vector> trashedMem; - std::vector>> trashedBuffers; - u32 currentIndex = 0; + u32 currentIndex = ~0; }; diff --git a/core/rend/vulkan/vk_context_lr.cpp b/core/rend/vulkan/vk_context_lr.cpp index 8daa7aaa7..c02c6b773 100644 --- a/core/rend/vulkan/vk_context_lr.cpp +++ b/core/rend/vulkan/vk_context_lr.cpp @@ -24,6 +24,7 @@ #include "oslib/oslib.h" #include "rend/transform_matrix.h" #include "texture.h" +#include #if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE @@ -71,6 +72,9 @@ bool VkCreateDevice(retro_vulkan_context* context, VkInstance instance, VkPhysic physicalDevice = vkinstance.enumeratePhysicalDevices().front(); } context->gpu = (VkPhysicalDevice)physicalDevice; + + const vk::PhysicalDeviceProperties physicalDeviceProperties = physicalDevice.getProperties(); + std::vector queueFamilyProperties = physicalDevice.getQueueFamilyProperties(); // get the first index into queueFamilyProperties which supports graphics and compute @@ -124,54 +128,116 @@ bool VkCreateDevice(retro_vulkan_context* context, VkInstance instance, VkPhysic DEBUG_LOG(RENDERER, "Using distinct Graphics and Present queue families"); } - vk::PhysicalDeviceFeatures supportedFeatures; - physicalDevice.getFeatures(&supportedFeatures); - bool fragmentStoresAndAtomics = supportedFeatures.fragmentStoresAndAtomics; - VulkanContext::Instance()->samplerAnisotropy = supportedFeatures.samplerAnisotropy; - // Enable VK_KHR_dedicated_allocation if available - bool getMemReq2Supported = false; - VulkanContext::Instance()->dedicatedAllocationSupported = false; - std::vector deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; - for (unsigned i = 0; i < num_required_device_extensions; i++) - deviceExtensions.push_back(required_device_extensions[i]); - for (const auto& property : physicalDevice.enumerateDeviceExtensionProperties()) + std::set supportedExtensions; + + const auto deviceExtensionProperties = physicalDevice.enumerateDeviceExtensionProperties(); + for (const auto& property : deviceExtensionProperties) { - if (!strcmp(property.extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)) + supportedExtensions.insert(property.extensionName); + } + + std::vector enabledExtensions; + + const auto tryAddDeviceExtension = [&supportedExtensions = std::as_const(supportedExtensions), &enabledExtensions] + (std::string_view extensionName) -> bool { - deviceExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - getMemReq2Supported = true; - } - else if (!strcmp(property.extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)) + if (supportedExtensions.count(extensionName.data())) + { + enabledExtensions.push_back(extensionName.data()); + NOTICE_LOG(RENDERER, "Device extension enabled: %s", extensionName.data()); + return true; + } + NOTICE_LOG(RENDERER, "Device extension unavailable: %s", extensionName.data()); + return false; + }; + + // Required swapchain extension + tryAddDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + + // Enable VK_KHR_dedicated_allocation if available + if (physicalDeviceProperties.apiVersion >= VK_API_VERSION_1_1) + { + // Core in Vulkan 1.1 + VulkanContext::Instance()->dedicatedAllocationSupported = true; + } + else + { + const bool getMemReq2Supported = tryAddDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); + if (getMemReq2Supported) { - deviceExtensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); - VulkanContext::Instance()->dedicatedAllocationSupported = true; + VulkanContext::Instance()->dedicatedAllocationSupported = tryAddDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); } } - VulkanContext::Instance()->dedicatedAllocationSupported &= getMemReq2Supported; + + // Check for VK_KHR_get_physical_device_properties2 + // Core as of Vulkan 1.1 + const bool getPhysicalDeviceProperties2Supported = + (physicalDeviceProperties.apiVersion >= VK_API_VERSION_1_1) + ? true : tryAddDeviceExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + + if (getPhysicalDeviceProperties2Supported) + { + // Enable VK_EXT_provoking_vertex if available + VulkanContext::Instance()->provokingVertexSupported = tryAddDeviceExtension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME); + } + + // Get device features + + vk::PhysicalDeviceFeatures2 featuresChain{}; + vk::PhysicalDeviceFeatures& features = featuresChain.features; + + vk::PhysicalDeviceProvokingVertexFeaturesEXT provokingVertexFeatures{}; + if (VulkanContext::Instance()->provokingVertexSupported) + { + featuresChain.pNext = &provokingVertexFeatures; + } + + // Get the physical device's features + if (getPhysicalDeviceProperties2Supported && featuresChain.pNext) + { + physicalDevice.getFeatures2(&featuresChain); + } + else + { + physicalDevice.getFeatures(&features); + } + + if (VulkanContext::Instance()->provokingVertexSupported) + { + VulkanContext::Instance()->provokingVertexSupported &= provokingVertexFeatures.provokingVertexLast; + } + + VulkanContext::Instance()->samplerAnisotropy = features.samplerAnisotropy; + VulkanContext::Instance()->fragmentStoresAndAtomics = features.fragmentStoresAndAtomics; // create a Device float queuePriority = 1.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfos[] = { + vk::DeviceQueueCreateInfo deviceQueueCreateInfo[] = { vk::DeviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), context->queue_family_index, 1, &queuePriority), vk::DeviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), context->presentation_queue_family_index, 1, &queuePriority), }; - vk::PhysicalDeviceFeatures features(*required_features); - if (fragmentStoresAndAtomics) - features.fragmentStoresAndAtomics = true; - if (VulkanContext::Instance()->samplerAnisotropy) - features.samplerAnisotropy = true; - vk::Device device = physicalDevice.createDevice(vk::DeviceCreateInfo(vk::DeviceCreateFlags(), - context->queue_family_index == context->presentation_queue_family_index ? 1 : 2, deviceQueueCreateInfos, - num_required_device_layers, required_device_layers, deviceExtensions.size(), &deviceExtensions[0], &features)); - context->device = (VkDevice)device; + bool singleQueue = context->queue_family_index == context->presentation_queue_family_index; + vk::DeviceCreateInfo deviceCreateInfo; + if (singleQueue) + deviceCreateInfo = vk::DeviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo[0], nullptr, enabledExtensions); + else + deviceCreateInfo = vk::DeviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo, nullptr, enabledExtensions); + + if (getPhysicalDeviceProperties2Supported) + deviceCreateInfo.pNext = &featuresChain; + else + deviceCreateInfo.setPEnabledFeatures(&features); + vk::Device newDevice = physicalDevice.createDevice(deviceCreateInfo); + + context->device = (VkDevice)newDevice; #if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 VULKAN_HPP_DEFAULT_DISPATCHER.init(context->device); #endif // Queues - context->queue = (VkQueue)device.getQueue(context->queue_family_index, 0); - context->presentation_queue = (VkQueue)device.getQueue(context->presentation_queue_family_index, 0); + context->queue = (VkQueue)newDevice.getQueue(context->queue_family_index, 0); + context->presentation_queue = (VkQueue)newDevice.getQueue(context->presentation_queue_family_index, 0); return true; } @@ -182,6 +248,7 @@ bool VulkanContext::init(retro_hw_render_interface_vulkan *retro_render_if) || retro_render_if->interface_version != RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION) return false; this->retro_render_if = retro_render_if; + GraphicsContext::instance = this; instance = vk::Instance(retro_render_if->instance); physicalDevice = vk::PhysicalDevice(retro_render_if->gpu); @@ -316,7 +383,6 @@ bool VulkanContext::init(retro_hw_render_interface_vulkan *retro_render_if) quadDrawer->Init(quadPipeline.get()); overlay = std::make_unique(); overlay->Init(quadPipelineWithAlpha.get()); - textureCache = std::make_unique(); return true; } @@ -329,7 +395,7 @@ void VulkanContext::PresentFrame(vk::Image image, vk::ImageView imageView, const getVideoShift(shiftX, shiftY); beginFrame(extent); - QuadVertex vtx[] { + QuadVertex vtx[4] { { -1, -1, 0, 0, 0 }, { 1, -1, 0, 1, 0 }, { -1, 1, 0, 0, 1 }, @@ -367,22 +433,22 @@ void VulkanContext::beginFrame(vk::Extent2D extent) vk::Extent2D caExtent = colorAttachments[currentImage]->getExtent(); if (extent != caExtent) { - colorAttachments[currentImage].reset(); - framebuffers[currentImage].reset(); + addToFlight(new Deleter(std::move(colorAttachments[currentImage]))); + addToFlight(new Deleter(std::move(framebuffers[currentImage]))); } } commandPool.BeginFrame(); const std::array clear_colors = { getBorderColor(), vk::ClearDepthStencilValue{ 0.f, 0 } }; - cmdBuffer = commandPool.Allocate(); + cmdBuffer = commandPool.Allocate(true); cmdBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - textureCache->SetCurrentIndex(currentImage); - overlay->Prepare(cmdBuffer, true, true, *textureCache); + overlay->Prepare(cmdBuffer, true, true); if (colorAttachments[currentImage] == nullptr) { colorAttachments[currentImage] = std::make_unique(physicalDevice, device); colorAttachments[currentImage]->Init(extent.width, extent.height, vk::Format::eR8G8B8A8Unorm, - vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled); + vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled, + "COLOR ATTACHMENT " + std::to_string(currentImage)); vk::ImageView imageView = colorAttachments[currentImage]->GetImageView(); vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), *renderPass, imageView, extent.width, extent.height, 1); @@ -404,6 +470,7 @@ void VulkanContext::endFrame() void VulkanContext::term() { + GraphicsContext::instance = nullptr; if (device) { device.waitIdle(); @@ -424,7 +491,6 @@ void VulkanContext::term() } overlay->Term(); overlay.reset(); - textureCache.reset(); framebuffers.clear(); colorAttachments.clear(); commandPool.Term(); diff --git a/core/rend/vulkan/vk_context_lr.h b/core/rend/vulkan/vk_context_lr.h index 16edba20b..2dc1f0afa 100644 --- a/core/rend/vulkan/vk_context_lr.h +++ b/core/rend/vulkan/vk_context_lr.h @@ -22,28 +22,29 @@ #include "vulkan.h" #include "vmallocator.h" #include "quad.h" -#include "rend/TexCache.h" +#include "rend/texconv.h" #include "libretro_vulkan.h" #include "wsi/context.h" #include "commandpool.h" #include "overlay.h" +#include static vk::Format findDepthFormat(vk::PhysicalDevice physicalDevice); class FramebufferAttachment; -class TextureCache; -class VulkanContext : public GraphicsContext +class VulkanContext : public GraphicsContext, public FlightManager { public: VulkanContext(); - ~VulkanContext(); + ~VulkanContext() override; bool init(retro_hw_render_interface_vulkan *render_if); void term() override; u32 GetGraphicsQueueFamilyIndex() const { return retro_render_if->queue_index; } void PresentFrame(vk::Image image, vk::ImageView imageView, const vk::Extent2D& extent, float aspectRatio); + bool GetLastFrame(std::vector& data, int& width, int& height) { return false; } vk::PhysicalDevice GetPhysicalDevice() const { return physicalDevice; } vk::Device GetDevice() const { return device; } @@ -83,14 +84,28 @@ class VulkanContext : public GraphicsContext + "." + std::to_string(VK_API_VERSION_MINOR(props.driverVersion)) + "." + std::to_string(VK_API_VERSION_PATCH(props.driverVersion)); } + bool isAMD() override { + return vendorID == VENDOR_ATI || vendorID == VENDOR_AMD; + } vk::Format GetDepthFormat() const { return depthFormat; } static VulkanContext *Instance() { return contextInstance; } bool SupportsSamplerAnisotropy() const { return samplerAnisotropy; } bool SupportsDedicatedAllocation() const { return dedicatedAllocationSupported; } + bool hasPerPixel() override { return fragmentStoresAndAtomics; } + bool hasProvokingVertex() { return provokingVertexSupported; } const VMAllocator& GetAllocator() const { return allocator; } vk::DeviceSize GetMaxMemoryAllocationSize() const { return maxMemoryAllocationSize; } f32 GetMaxSamplerAnisotropy() const { return samplerAnisotropy ? maxSamplerAnisotropy : 1.f; } u32 GetVendorID() const { return vendorID; } + void addToFlight(Deletable *object) override { + commandPool.addToFlight(object); + } +#ifdef VK_DEBUG + template::value>> + void setObjectName(const HandleType& object, const std::string& name) + { + } +#endif constexpr static int VENDOR_AMD = 0x1022; // AMD GPU products use the ATI vendor Id @@ -115,9 +130,11 @@ class VulkanContext : public GraphicsContext bool optimalTilingSupported1555 = false; bool optimalTilingSupported4444 = false; public: + bool fragmentStoresAndAtomics = false; bool samplerAnisotropy = false; f32 maxSamplerAnisotropy = 0.f; bool dedicatedAllocationSupported = false; + bool provokingVertexSupported = false; private: u32 vendorID = 0; @@ -143,8 +160,6 @@ class VulkanContext : public GraphicsContext std::vector framebuffers; std::vector> colorAttachments; std::unique_ptr overlay; - // only used to delay the destruction of overlay textures - std::unique_ptr textureCache; retro_vulkan_image retro_image; diff --git a/core/rend/vulkan/vmallocator.cpp b/core/rend/vulkan/vmallocator.cpp index 6a441d2c5..abe592a5f 100644 --- a/core/rend/vulkan/vmallocator.cpp +++ b/core/rend/vulkan/vmallocator.cpp @@ -55,6 +55,8 @@ void VMAllocator::Init(vk::PhysicalDevice physicalDevice, vk::Device device, vk: allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT; allocatorInfo.physicalDevice = (VkPhysicalDevice)physicalDevice; + // Top-out at vulkan 1.1 + allocatorInfo.vulkanApiVersion = (physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_1) ? VK_API_VERSION_1_1 : VK_API_VERSION_1_0; allocatorInfo.device = (VkDevice)device; allocatorInfo.instance = (VkInstance)instance; #if !defined(NDEBUG) || defined(DEBUGFAST) @@ -69,6 +71,5 @@ void VMAllocator::Init(vk::PhysicalDevice physicalDevice, vk::Device device, vk: #endif VkResult rc = vmaCreateAllocator(&allocatorInfo, &allocator); - if (rc != VK_SUCCESS) - vk::throwResultException((vk::Result)rc, "vmaCreateAllocator failed"); + vk::resultCheck(static_cast(rc), "vmaCreateAllocator failed"); } diff --git a/core/rend/vulkan/vmallocator.h b/core/rend/vulkan/vmallocator.h index 4d61d4f10..f94de21e1 100644 --- a/core/rend/vulkan/vmallocator.h +++ b/core/rend/vulkan/vmallocator.h @@ -64,8 +64,7 @@ class Allocation return allocInfo.pMappedData; void *p; VkResult res = vmaMapMemory(allocator, allocation, &p); - if (res != VK_SUCCESS) - vk::throwResultException((vk::Result)res, "vmaMapMemory failed"); + vk::resultCheck(static_cast(res), "vmaMapMemory failed"); VkMemoryPropertyFlags flags; vmaGetMemoryTypeProperties(allocator, allocInfo.memoryType, &flags); if ((flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) && (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) @@ -115,8 +114,7 @@ class VMAllocator VmaAllocation vmaAllocation; VmaAllocationInfo allocInfo; VkResult rc = vmaAllocateMemory(allocator, (VkMemoryRequirements*)&memoryRequirements, &allocCreateInfo, &vmaAllocation, &allocInfo); - if (rc != VK_SUCCESS) - vk::throwResultException((vk::Result)rc, "vmaAllocateMemory failed"); + vk::resultCheck(static_cast(rc), "vmaAllocateMemory failed"); return Allocation(allocator, vmaAllocation, allocInfo); } @@ -125,8 +123,7 @@ class VMAllocator VmaAllocation vmaAllocation; VmaAllocationInfo allocInfo; VkResult rc = vmaAllocateMemoryForImage(allocator, (VkImage)image, &allocCreateInfo, &vmaAllocation, &allocInfo); - if (rc != VK_SUCCESS) - vk::throwResultException((vk::Result)rc, "vmaAllocateMemoryForImage failed"); + vk::resultCheck(static_cast(rc), "vmaAllocateMemoryForImage failed"); vmaBindImageMemory(allocator, vmaAllocation, (VkImage)image); return Allocation(allocator, vmaAllocation, allocInfo); @@ -137,8 +134,7 @@ class VMAllocator VmaAllocation vmaAllocation; VmaAllocationInfo allocInfo; VkResult rc = vmaAllocateMemoryForBuffer(allocator, (VkBuffer)buffer, &allocCreateInfo, &vmaAllocation, &allocInfo); - if (rc != VK_SUCCESS) - vk::throwResultException((vk::Result)rc, "vmaAllocateMemoryForBuffer failed"); + vk::resultCheck(static_cast(rc), "vmaAllocateMemoryForBuffer failed"); vmaBindBufferMemory(allocator, vmaAllocation, (VkBuffer)buffer); return Allocation(allocator, vmaAllocation, allocInfo); diff --git a/core/rend/vulkan/vulkan.h b/core/rend/vulkan/vulkan.h index 4066ce85d..825e7bc65 100644 --- a/core/rend/vulkan/vulkan.h +++ b/core/rend/vulkan/vulkan.h @@ -23,4 +23,42 @@ #include -//#define VK_DEBUG +//#define VK_DEBUG 1 + +#if VK_USE_64_BIT_PTR_DEFINES == 1 +using VkHandle = void *; +#else +using VkHandle = uint64_t; +#endif + +// RAII-like interface for objects that need to be deleted/released in the future +class Deletable +{ +public: + virtual ~Deletable() = default; +}; + +// Implementations of this interface control when object are in use and delete them when possible +class FlightManager +{ +public: + virtual void addToFlight(Deletable *object) = 0; + + virtual ~FlightManager() = default; +}; + +template +class Deleter : public Deletable +{ +public: + Deleter() = delete; + explicit Deleter(T& o) : o(o) {} + Deleter(T&& o) : o(std::move(o)) {} + ~Deleter() override { + if constexpr (std::is_pointer_v) + delete o; + } + +private: + T o; +}; diff --git a/core/rend/vulkan/vulkan_context.cpp b/core/rend/vulkan/vulkan_context.cpp index e61d949dc..557d6bb11 100644 --- a/core/rend/vulkan/vulkan_context.cpp +++ b/core/rend/vulkan/vulkan_context.cpp @@ -19,20 +19,23 @@ along with Flycast. If not, see . */ #include "vulkan_context.h" -#include "imgui/imgui.h" -#include "imgui/backends/imgui_impl_vulkan.h" -#include "../gui.h" +#include "vulkan_renderer.h" +#include "imgui.h" +#include "imgui_impl_vulkan.h" +#include "ui/gui.h" #ifdef USE_SDL #include #include #endif #include "compiler.h" -#include "texture.h" #include "utils.h" #include "emulator.h" #include "oslib/oslib.h" #include "vulkan_driver.h" #include "rend/transform_matrix.h" +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 +#include "adreno.h" +#endif #if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE @@ -139,8 +142,13 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co try { #if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = nullptr; +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 + vkGetInstanceProcAddr = loadVulkanDriver(); +#else static vk::DynamicLoader dl; - PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); + vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); +#endif if (vkGetInstanceProcAddr == nullptr) { ERROR_LOG(RENDERER, "Vulkan entry point vkGetInstanceProcAddr not found"); return false; @@ -150,10 +158,9 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co bool vulkan11 = false; if (VULKAN_HPP_DEFAULT_DISPATCHER.vkEnumerateInstanceVersion != nullptr) { - u32 apiVersion = vk::enumerateInstanceVersion(); + const u32 apiVersion = vk::enumerateInstanceVersion(); - vulkan11 = VK_API_VERSION_MAJOR(apiVersion) > 1 - || (VK_API_VERSION_MAJOR(apiVersion) == 1 && VK_API_VERSION_MINOR(apiVersion) >= 1); + vulkan11 = (apiVersion >= VK_API_VERSION_1_1); } vk::ApplicationInfo applicationInfo("Flycast", 1, "Flycast", 1, vulkan11 ? VK_API_VERSION_1_1 : VK_API_VERSION_1_0); @@ -165,11 +172,11 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co //layer_names.push_back("VK_LAYER_ARM_AGA"); #ifdef VK_DEBUG #ifndef __ANDROID__ - vext.push_back("VK_EXT_debug_utils"); - vext.push_back("VK_EXT_debug_report"); + vext.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + vext.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); layer_names.push_back("VK_LAYER_KHRONOS_validation"); #else - vext.push_back("VK_EXT_debug_report"); // NDK <= 19? + vext.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); // NDK <= 19? layer_names.push_back("VK_LAYER_GOOGLE_threading"); layer_names.push_back("VK_LAYER_LUNARG_parameter_validation"); layer_names.push_back("VK_LAYER_LUNARG_core_validation"); @@ -199,54 +206,67 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co #endif #endif - const auto devices = instance->enumeratePhysicalDevices(); + auto devices = instance->enumeratePhysicalDevices(); if (devices.empty()) { ERROR_LOG(RENDERER, "Vulkan error: no physical devices found"); return false; } - // Choose a discrete gpu if there's one, otherwise just pick the first one - physicalDevice = nullptr; - for (const auto& phyDev : devices) - { - vk::PhysicalDeviceProperties props; - phyDev.getProperties(&props); - if (props.deviceType == vk::PhysicalDeviceType::eDiscreteGpu) + // The order of physical-devices provided by the driver should be somewhat preserved with stable-partitions/stable-sorts + + // Prefer GPUs that support optimal R5G5B5/R5G6B5A1/R4G4B4A4 + const auto supportsOptimalFormat = [](vk::Format format) { - physicalDevice = phyDev; - break; + return [format](const vk::PhysicalDevice& physicalDevice) -> bool + { + const vk::FormatProperties formatProperties = physicalDevice.getFormatProperties(format); + return (formatProperties.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImage) + && (formatProperties.optimalTilingFeatures & vk::FormatFeatureFlagBits::eBlitDst) + && (formatProperties.optimalTilingFeatures & vk::FormatFeatureFlagBits::eBlitSrc); + }; + }; + std::stable_partition(devices.begin(), devices.end(), supportsOptimalFormat(vk::Format::eR5G6B5UnormPack16)); + std::stable_partition(devices.begin(), devices.end(), supportsOptimalFormat(vk::Format::eR5G5B5A1UnormPack16)); + std::stable_partition(devices.begin(), devices.end(), supportsOptimalFormat(vk::Format::eR4G4B4A4UnormPack16)); + + // Prefer GPUs that support fragmentStoresAndAtomics + std::stable_partition( + devices.begin(), devices.end(), + [](const vk::PhysicalDevice& physicalDevice) -> bool + { + return !!physicalDevice.getFeatures().fragmentStoresAndAtomics; } - } - if (!physicalDevice) - physicalDevice = devices.front(); + ); - const vk::PhysicalDeviceProperties *properties; - if (vulkan11) + // Finally, prefer Discrete GPUs + std::stable_partition( + devices.begin(), devices.end(), + [](const vk::PhysicalDevice& physicalDevice) -> bool + { + return physicalDevice.getProperties().deviceType == vk::PhysicalDeviceType::eDiscreteGpu; + } + ); + + // Top of the device-list is the _most_ qualified GPU + physicalDevice = devices.front(); + + vk::PhysicalDeviceProperties properties = physicalDevice.getProperties(); + if (vulkan11 && properties.apiVersion >= VK_API_VERSION_1_1) { - static vk::PhysicalDeviceProperties2 properties2; - vk::PhysicalDeviceMaintenance3Properties properties3; - properties2.pNext = &properties3; - physicalDevice.getProperties2(&properties2); - properties = &properties2.properties; - maxMemoryAllocationSize = properties3.maxMemoryAllocationSize; + const auto properties2 = physicalDevice.getProperties2(); + properties = properties2.get().properties; + maxMemoryAllocationSize = properties2.get().maxMemoryAllocationSize; if (maxMemoryAllocationSize == 0) // Happens on Windows 7 with NVidia 376.33, ok on 441.66 maxMemoryAllocationSize = 0xFFFFFFFFu; } - else - { - static vk::PhysicalDeviceProperties phyProperties; - physicalDevice.getProperties(&phyProperties); - properties = &phyProperties; - } - uniformBufferAlignment = properties->limits.minUniformBufferOffsetAlignment; - storageBufferAlignment = properties->limits.minStorageBufferOffsetAlignment; - maxStorageBufferRange = properties->limits.maxStorageBufferRange; - maxSamplerAnisotropy = properties->limits.maxSamplerAnisotropy; - unifiedMemory = properties->deviceType == vk::PhysicalDeviceType::eIntegratedGpu; - vendorID = properties->vendorID; - NOTICE_LOG(RENDERER, "Vulkan API %s. Device %s", vulkan11 ? "1.1" : "1.0", properties->deviceName.data()); + + uniformBufferAlignment = properties.limits.minUniformBufferOffsetAlignment; + storageBufferAlignment = properties.limits.minStorageBufferOffsetAlignment; + maxSamplerAnisotropy = properties.limits.maxSamplerAnisotropy; + vendorID = properties.vendorID; + NOTICE_LOG(RENDERER, "Vulkan API %s. Device %s", vulkan11 ? "1.1" : "1.0", properties.deviceName.data()); vk::FormatProperties formatProperties = physicalDevice.getFormatProperties(vk::Format::eR5G5B5A1UnormPack16); if ((formatProperties.optimalTilingFeatures & vk::FormatFeatureFlagBits::eSampledImage) @@ -269,12 +289,6 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co optimalTilingSupported4444 = true; else NOTICE_LOG(RENDERER, "eR4G4B4A4UnormPack16 not supported for optimal tiling"); - vk::PhysicalDeviceFeatures features; - physicalDevice.getFeatures(&features); - fragmentStoresAndAtomics = features.fragmentStoresAndAtomics; - samplerAnisotropy = features.samplerAnisotropy; - if (!fragmentStoresAndAtomics) - NOTICE_LOG(RENDERER, "Fragment stores & atomic not supported: no per-pixel sorting"); ShaderCompiler::Init(); @@ -297,8 +311,14 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co void VulkanContext::InitImgui() { - imguiDriver.reset(); - imguiDriver = std::unique_ptr(new VulkanDriver()); + VulkanDriver *vkDriver = dynamic_cast(imguiDriver.get()); + if (vkDriver == nullptr) { + imguiDriver.reset(); + imguiDriver = std::unique_ptr(new VulkanDriver()); + } + else { + vkDriver->reset(); + } ImGui_ImplVulkan_InitInfo initInfo{}; initInfo.Instance = (VkInstance)*instance; initInfo.PhysicalDevice = (VkPhysicalDevice)physicalDevice; @@ -307,6 +327,7 @@ void VulkanContext::InitImgui() initInfo.Queue = (VkQueue)graphicsQueue; initInfo.PipelineCache = (VkPipelineCache)*pipelineCache; initInfo.DescriptorPool = (VkDescriptorPool)*descriptorPool; + initInfo.RenderPass = (VkRenderPass)*renderPass; initInfo.MinImageCount = 2; initInfo.ImageCount = GetSwapChainSize(); #ifdef VK_DEBUG @@ -319,25 +340,10 @@ void VulkanContext::InitImgui() }); #endif - if (!ImGui_ImplVulkan_Init(&initInfo, (VkRenderPass)*renderPass)) + if (!ImGui_ImplVulkan_Init(&initInfo)) { die("ImGui initialization failed"); } - if (ImGui::GetIO().Fonts->TexID == 0) - { - // Upload Fonts - device->resetFences(*drawFences.front()); - device->resetCommandPool(*commandPools.front(), vk::CommandPoolResetFlagBits::eReleaseResources); - vk::CommandBuffer& commandBuffer = *commandBuffers.front(); - commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - ImGui_ImplVulkan_CreateFontsTexture((VkCommandBuffer)commandBuffer); - commandBuffer.end(); - vk::SubmitInfo submitInfo(nullptr, nullptr, commandBuffer); - graphicsQueue.submit(submitInfo, *drawFences.front()); - - device->waitIdle(); - ImGui_ImplVulkan_DestroyFontUploadObjects(); - } } bool VulkanContext::InitDevice() @@ -346,6 +352,8 @@ bool VulkanContext::InitDevice() return false; try { + const vk::PhysicalDeviceProperties physicalDeviceProperties = physicalDevice.getProperties(); + std::vector queueFamilyProperties = physicalDevice.getQueueFamilyProperties(); #ifdef VK_DEBUG std::for_each(queueFamilyProperties.begin(), queueFamilyProperties.end(), @@ -395,54 +403,117 @@ bool VulkanContext::InitDevice() else DEBUG_LOG(RENDERER, "Using distinct Graphics and Present queue families"); - // Enable VK_KHR_dedicated_allocation if available - bool getMemReq2Supported = false; - dedicatedAllocationSupported = false; - std::vector deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; - for (const auto& property : physicalDevice.enumerateDeviceExtensionProperties()) + + std::set supportedExtensions; + + const auto deviceExtensionProperties = physicalDevice.enumerateDeviceExtensionProperties(); + for (const auto& property : deviceExtensionProperties) { - if (!strcmp(property.extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)) - { - deviceExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - getMemReq2Supported = true; - } - else if (!strcmp(property.extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)) + supportedExtensions.insert(property.extensionName); + } + + std::vector enabledExtensions; + + const auto tryAddDeviceExtension = [&supportedExtensions = std::as_const(supportedExtensions), &enabledExtensions] + (std::string_view extensionName) -> bool + { + if (supportedExtensions.count(extensionName.data())) { - deviceExtensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); - dedicatedAllocationSupported = true; + enabledExtensions.push_back(extensionName.data()); + NOTICE_LOG(RENDERER, "Device extension enabled: %s", extensionName.data()); + return true; } - else if (!strcmp(property.extensionName, "VK_KHR_portability_subset")) - deviceExtensions.push_back("VK_KHR_portability_subset"); + NOTICE_LOG(RENDERER, "Device extension unavailable: %s", extensionName.data()); + return false; + }; + + // Required swapchain extension + tryAddDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + +#ifdef VK_ENABLE_BETA_EXTENSIONS + tryAddDeviceExtension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); +#endif +#ifdef VK_USE_PLATFORM_METAL_EXT + tryAddDeviceExtension(VK_EXT_METAL_OBJECTS_EXTENSION_NAME); +#endif #ifdef VK_DEBUG - else if (!strcmp(property.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) - { - NOTICE_LOG(RENDERER, "Debug extension %s available", property.extensionName.data()); - deviceExtensions.push_back(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); - } - else if(!strcmp(property.extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) - { - NOTICE_LOG(RENDERER, "Debug extension %s available", property.extensionName.data()); - deviceExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); - } - else if (!strcmp(property.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) + tryAddDeviceExtension(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); +#endif + + // Enable VK_KHR_dedicated_allocation if available + if (physicalDeviceProperties.apiVersion >= VK_API_VERSION_1_1) + { + // Core in Vulkan 1.1 + dedicatedAllocationSupported = true; + } + else + { + const bool getMemReq2Supported = tryAddDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); + if (getMemReq2Supported) { - NOTICE_LOG(RENDERER, "Debug extension %s available", property.extensionName.data()); - deviceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + dedicatedAllocationSupported = tryAddDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); } -#endif } - dedicatedAllocationSupported &= getMemReq2Supported; + + // Check for VK_KHR_get_physical_device_properties2 + // Core as of Vulkan 1.1 + const bool getPhysicalDeviceProperties2Supported = + (physicalDeviceProperties.apiVersion >= VK_API_VERSION_1_1) + ? true : tryAddDeviceExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + + if (getPhysicalDeviceProperties2Supported) + { + // Enable VK_EXT_provoking_vertex if available + provokingVertexSupported = tryAddDeviceExtension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME); + } + + // Get device features + + vk::PhysicalDeviceFeatures2 featuresChain{}; + vk::PhysicalDeviceFeatures& features = featuresChain.features; + + vk::PhysicalDeviceProvokingVertexFeaturesEXT provokingVertexFeatures{}; + if (provokingVertexSupported) + { + featuresChain.pNext = &provokingVertexFeatures; + } + + // Get the physical device's features + if (getPhysicalDeviceProperties2Supported && featuresChain.pNext) + { + physicalDevice.getFeatures2(&featuresChain); + } + else + { + physicalDevice.getFeatures(&features); + } + + if (provokingVertexSupported) + { + provokingVertexSupported &= provokingVertexFeatures.provokingVertexLast; + } + + samplerAnisotropy = features.samplerAnisotropy; + fragmentStoresAndAtomics = features.fragmentStoresAndAtomics; + if (!fragmentStoresAndAtomics) + NOTICE_LOG(RENDERER, "Fragment stores & atomic not supported: no per-pixel sorting"); // create a UniqueDevice float queuePriority = 1.0f; vk::DeviceQueueCreateInfo deviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), graphicsQueueIndex, 1, &queuePriority); - vk::PhysicalDeviceFeatures features; - if (fragmentStoresAndAtomics) - features.fragmentStoresAndAtomics = true; - if (samplerAnisotropy) - features.samplerAnisotropy = true; - device = physicalDevice.createDeviceUnique(vk::DeviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo, - nullptr, deviceExtensions, &features)); + + if (getPhysicalDeviceProperties2Supported) + { + vk::DeviceCreateInfo deviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo, + nullptr, enabledExtensions); + deviceCreateInfo.pNext = &featuresChain; + device = physicalDevice.createDeviceUnique(deviceCreateInfo); + } + else + { + device = physicalDevice.createDeviceUnique(vk::DeviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo, + nullptr, enabledExtensions, &features)); + } #if VULKAN_HPP_DISPATCH_LOADER_DYNAMIC == 1 VULKAN_HPP_DEFAULT_DISPATCHER.init(*device); @@ -503,8 +574,7 @@ bool VulkanContext::InitDevice() quadRotatePipeline = std::make_unique(true, true); quadRotateDrawer = std::make_unique(); - vk::PhysicalDeviceProperties props; - physicalDevice.getProperties(&props); + vk::PhysicalDeviceProperties props = physicalDevice.getProperties(); driverName = (const char *)props.deviceName; #ifdef __APPLE__ driverVersion = std::to_string(VK_API_VERSION_MAJOR(props.apiVersion)) + "." @@ -544,6 +614,14 @@ void VulkanContext::CreateSwapChain() { device->waitIdle(); + if (!drawFences.empty()) + { + std::vector allFences = vk::uniqueToRaw(drawFences); + vk::Result res = device->waitForFences(allFences, true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "VulkanContext::CreateSwapChain: waitForFences failed %d", (int)res); + } + inFlightObjects.clear(); overlay->Term(); framebuffers.clear(); drawFences.clear(); @@ -626,8 +704,8 @@ void VulkanContext::CreateSwapChain() if (surfaceCapabilities.maxImageCount != 0) imageCount = std::min(imageCount, surfaceCapabilities.maxImageCount); vk::ImageUsageFlags usage = vk::ImageUsageFlagBits::eColorAttachment; -#ifdef TEST_AUTOMATION - // for final screenshot +#if defined(TEST_AUTOMATION) || (defined(VIDEO_ROUTING) && defined(TARGET_MAC)) + // for final screenshot or Syphon usage |= vk::ImageUsageFlagBits::eTransferSrc; #endif vk::SwapchainCreateInfoKHR swapChainCreateInfo(vk::SwapchainCreateFlagsKHR(), GetSurface(), imageCount, colorFormat, vk::ColorSpaceKHR::eSrgbNonlinear, @@ -694,16 +772,20 @@ void VulkanContext::CreateSwapChain() framebuffers.reserve(imageViews.size()); drawFences.reserve(imageViews.size()); - renderCompleteSemaphores.reserve(imageViews.size()); - imageAcquiredSemaphores.reserve(imageViews.size()); for (auto const& view : imageViews) { framebuffers.push_back(device->createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), *renderPass, view.get(), width, height, 1))); drawFences.push_back(device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled))); + } + renderCompleteSemaphores.reserve(imageViews.size() + 1); + imageAcquiredSemaphores.reserve(imageViews.size() + 1); + for (unsigned i = 0; i < imageViews.size() + 1; i++) + { renderCompleteSemaphores.push_back(device->createSemaphoreUnique(vk::SemaphoreCreateInfo())); imageAcquiredSemaphores.push_back(device->createSemaphoreUnique(vk::SemaphoreCreateInfo())); } + inFlightObjects.resize(imageViews.size()); currentSemaphore = 0; quadPipeline->Init(shaderManager.get(), *renderPass, 0); quadPipelineWithAlpha->Init(shaderManager.get(), *renderPass, 0); @@ -740,26 +822,28 @@ bool VulkanContext::init() SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, NULL); extensions.resize(extensionsCount + extensions.size()); SDL_Vulkan_GetInstanceExtensions((SDL_Window *)window, &extensionsCount, &extensions[extensions.size() - extensionsCount]); -#elif defined(_WIN32) +#elif defined(VK_USE_PLATFORM_WIN32_KHR) extern void CreateMainWindow(); CreateMainWindow(); extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); -#elif defined(VK_USE_PLATFORM_IOS_MVK) - extensions.push_back(VK_MVK_IOS_SURFACE_EXTENSION_NAME); #elif defined(VK_USE_PLATFORM_METAL_EXT) extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); -#elif defined(SUPPORT_X11) +#elif defined(VK_USE_PLATFORM_XLIB_KHR) extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); -#elif defined(__ANDROID__) +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); #endif - if (!InitInstance(&extensions[0], extensions.size())) + if (!InitInstance(&extensions[0], extensions.size())) { + term(); return false; + } #if defined(USE_SDL) VkSurfaceKHR surface; - if (SDL_Vulkan_CreateSurface((SDL_Window *)window, (VkInstance)*instance, &surface) == 0) + if (SDL_Vulkan_CreateSurface((SDL_Window *)window, (VkInstance)*instance, &surface) == 0) { + term(); return false; + } this->surface.reset(vk::SurfaceKHR(surface)); SDL_Window *sdlWin = (SDL_Window *)window; int w, h; @@ -771,18 +855,15 @@ bool VulkanContext::init() settings.display.dpi = roundf(std::max(hdpi, vdpi)); sdl_fix_steamdeck_dpi(sdlWin); -#elif defined(_WIN32) +#elif defined(VK_USE_PLATFORM_WIN32_KHR) vk::Win32SurfaceCreateInfoKHR createInfo(vk::Win32SurfaceCreateFlagsKHR(), GetModuleHandle(NULL), (HWND)window); surface = instance->createWin32SurfaceKHRUnique(createInfo); -#elif defined(SUPPORT_X11) +#elif defined(VK_USE_PLATFORM_XLIB_KHR) vk::XlibSurfaceCreateInfoKHR createInfo(vk::XlibSurfaceCreateFlagsKHR(), (Display*)display, (Window)window); surface = instance->createXlibSurfaceKHRUnique(createInfo); -#elif defined(__ANDROID__) +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) vk::AndroidSurfaceCreateInfoKHR createInfo(vk::AndroidSurfaceCreateFlagsKHR(), (struct ANativeWindow*)window); surface = instance->createAndroidSurfaceKHRUnique(createInfo); -#elif defined(VK_USE_PLATFORM_IOS_MVK) - vk::IOSSurfaceCreateInfoMVK createInfo(vk::IOSSurfaceCreateFlagsMVK(), window); - surface = instance->createIOSSurfaceMVKUnique(createInfo); #elif defined(VK_USE_PLATFORM_METAL_EXT) vk::MetalSurfaceCreateInfoEXT createInfo(vk::MetalSurfaceCreateFlagsEXT(), window); surface = instance->createMetalSurfaceEXTUnique(createInfo); @@ -790,9 +871,13 @@ bool VulkanContext::init() #error "Unknown Vulkan platform" #endif overlay = std::make_unique(); - textureCache = std::make_unique(); - return InitDevice(); + if (!InitDevice()) { + term(); + return false; + } + + return true; } bool VulkanContext::recreateSwapChainIfNeeded() @@ -812,13 +897,13 @@ void VulkanContext::NewFrame() recreateSwapChainIfNeeded(); if (!IsValid()) throw InvalidVulkanContext(); - device->acquireNextImageKHR(*swapChain, UINT64_MAX, *imageAcquiredSemaphores[currentSemaphore], nullptr, ¤tImage); - device->waitForFences(*drawFences[currentImage], true, UINT64_MAX); - device->resetFences(*drawFences[currentImage]); + vk::Result res = device->acquireNextImageKHR(*swapChain, UINT64_MAX, *imageAcquiredSemaphores[currentSemaphore], nullptr, ¤tImage); + res = device->waitForFences(*drawFences[currentImage], true, UINT64_MAX); + (void)res; device->resetCommandPool(*commandPools[currentImage], vk::CommandPoolResetFlagBits::eReleaseResources); + inFlightObjects[currentImage].clear(); vk::CommandBuffer commandBuffer = *commandBuffers[currentImage]; commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - textureCache->SetCurrentIndex(GetCurrentImageIndex()); verify(!rendering); rendering = true; } @@ -846,6 +931,7 @@ void VulkanContext::EndFrame(vk::CommandBuffer overlayCmdBuffer) allCmdBuffers.push_back(overlayCmdBuffer); allCmdBuffers.push_back(commandBuffer); vk::SubmitInfo submitInfo(*imageAcquiredSemaphores[currentSemaphore], wait_stage, allCmdBuffers, *renderCompleteSemaphores[currentSemaphore]); + device->resetFences(*drawFences[currentImage]); graphicsQueue.submit(submitInfo, *drawFences[currentImage]); verify(rendering); rendering = false; @@ -858,15 +944,16 @@ void VulkanContext::Present() noexcept { try { DoSwapAutomation(); - presentQueue.presentKHR(vk::PresentInfoKHR(1, &(*renderCompleteSemaphores[currentSemaphore]), 1, &(*swapChain), ¤tImage)); - currentSemaphore = (currentSemaphore + 1) % imageViews.size(); + vk::Result res = presentQueue.presentKHR(vk::PresentInfoKHR(1, &(*renderCompleteSemaphores[currentSemaphore]), 1, &(*swapChain), ¤tImage)); + (void)res; + currentSemaphore = (currentSemaphore + 1) % renderCompleteSemaphores.size(); if (lastFrameView && IsValid() && !gui_is_open()) for (int i = 1; i < swapInterval; i++) { PresentFrame(vk::Image(), lastFrameView, lastFrameExtent, lastFrameAR); - presentQueue.presentKHR(vk::PresentInfoKHR(1, &(*renderCompleteSemaphores[currentSemaphore]), 1, &(*swapChain), ¤tImage)); - currentSemaphore = (currentSemaphore + 1) % imageViews.size(); + res = presentQueue.presentKHR(vk::PresentInfoKHR(1, &(*renderCompleteSemaphores[currentSemaphore]), 1, &(*swapChain), ¤tImage)); + currentSemaphore = (currentSemaphore + 1) % renderCompleteSemaphores.size(); } } catch (const vk::SystemError& e) { // Happens when resizing the window @@ -890,7 +977,7 @@ void VulkanContext::Present() noexcept void VulkanContext::DrawFrame(vk::ImageView imageView, const vk::Extent2D& extent, float aspectRatio) { - QuadVertex vtx[] { + QuadVertex vtx[4] { { -1, -1, 0, 0, 0 }, { 1, -1, 0, 1, 0 }, { -1, 1, 0, 0, 1 }, @@ -904,6 +991,10 @@ void VulkanContext::DrawFrame(vk::ImageView imageView, const vk::Extent2D& exten vtx[2].y = vtx[3].y = vtx[0].y + 2; vk::CommandBuffer commandBuffer = GetCurrentCommandBuffer(); + + static const float scopeColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer, "DrawFrame", scopeColor); + if (config::Rotate90) quadRotatePipeline->BindPipeline(commandBuffer); else @@ -937,7 +1028,7 @@ void VulkanContext::WaitIdle() const vk::CommandBuffer VulkanContext::PrepareOverlay(bool vmu, bool crosshair) { - return overlay->Prepare(*commandPools[GetCurrentImageIndex()], vmu, crosshair, *textureCache); + return overlay->Prepare(*commandPools[GetCurrentImageIndex()], vmu, crosshair); } void VulkanContext::DrawOverlay(float scaling, bool vmu, bool crosshair) @@ -959,6 +1050,7 @@ void VulkanContext::PresentFrame(vk::Image image, vk::ImageView imageView, const try { NewFrame(); auto overlayCmdBuffer = PrepareOverlay(config::FloatVMUs, true); + gui_draw_osd(); BeginRenderPass(); @@ -966,8 +1058,10 @@ void VulkanContext::PresentFrame(vk::Image image, vk::ImageView imageView, const DrawFrame(imageView, extent, aspectRatio); DrawOverlay(settings.display.uiScale, config::FloatVMUs, true); - renderer->DrawOSD(false); + imguiDriver->renderDrawData(ImGui::GetDrawData(), false); EndFrame(overlayCmdBuffer); + static_cast(renderer)->RenderVideoRouting(); + } catch (const InvalidVulkanContext& err) { } } @@ -983,26 +1077,32 @@ void VulkanContext::term() { GraphicsContext::instance = nullptr; lastFrameView = nullptr; - if (!device) - return; - WaitIdle(); + if (device && graphicsQueue) + WaitIdle(); + if (device && !drawFences.empty()) + { + std::vector allFences = vk::uniqueToRaw(drawFences); + vk::Result res = device->waitForFences(allFences, true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "VulkanContext::term: waitForFences failed %d", (int)res); + } + inFlightObjects.clear(); imguiDriver.reset(); if (device && pipelineCache) - { - std::vector cacheData = device->getPipelineCacheData(*pipelineCache); - if (!cacheData.empty()) - { - std::string cachePath = hostfs::getShaderCachePath("vulkan_pipeline.cache"); - FILE *f = nowide::fopen(cachePath.c_str(), "wb"); - if (f != nullptr) - { - (void)std::fwrite(&cacheData[0], 1, cacheData.size(), f); - std::fclose(f); - } - } - } + { + std::vector cacheData = device->getPipelineCacheData(*pipelineCache); + if (!cacheData.empty()) + { + std::string cachePath = hostfs::getShaderCachePath("vulkan_pipeline.cache"); + FILE *f = nowide::fopen(cachePath.c_str(), "wb"); + if (f != nullptr) + { + (void)std::fwrite(&cacheData[0], 1, cacheData.size(), f); + std::fclose(f); + } + } + } overlay.reset(); - textureCache.reset(); ShaderCompiler::Term(); swapChain.reset(); imageViews.clear(); @@ -1037,6 +1137,9 @@ void VulkanContext::term() #endif #endif instance.reset(); +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 + unloadVulkanDriver(); +#endif } void VulkanContext::DoSwapAutomation() @@ -1212,3 +1315,120 @@ VulkanContext::~VulkanContext() verify(contextInstance == this); contextInstance = nullptr; } + +bool VulkanContext::GetLastFrame(std::vector& data, int& width, int& height) +{ + if (!lastFrameView) + return false; + + if (width != 0) { + height = width / lastFrameAR; + } + else if (height != 0) { + width = lastFrameAR * height; + } + else + { + width = lastFrameExtent.width; + height = lastFrameExtent.height; + if (config::Rotate90) + std::swap(width, height); + // We need square pixels for PNG + int w = lastFrameAR * height; + if (width > w) + height = width / lastFrameAR; + else + width = w; + } + // color attachment + FramebufferAttachment attachment(physicalDevice, *device); + attachment.Init(width, height, vk::Format::eR8G8B8A8Unorm, vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferSrc, "screenshot"); + // command buffer + vk::UniqueCommandBuffer commandBuffer = std::move(device->allocateCommandBuffersUnique( + vk::CommandBufferAllocateInfo(*commandPools.back(), vk::CommandBufferLevel::ePrimary, 1)).front()); + commandBuffer->begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); + + static const float scopeColor[4] = { 1.0f, 1.0f, 0.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer.get(), "GetLastFrame", scopeColor); + + // render pass + vk::AttachmentDescription attachmentDescription = vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), vk::Format::eR8G8B8A8Unorm, vk::SampleCountFlagBits::e1, + vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eStore, vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare, + vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferSrcOptimal); + vk::AttachmentReference colorReference(0, vk::ImageLayout::eColorAttachmentOptimal); + vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics, nullptr, colorReference, + nullptr, nullptr); + vk::UniqueRenderPass renderPass = device->createRenderPassUnique(vk::RenderPassCreateInfo(vk::RenderPassCreateFlags(), + attachmentDescription, subpass)); + // framebuffer + vk::ImageView imageView = attachment.GetImageView(); + vk::UniqueFramebuffer framebuffer = device->createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), + *renderPass, imageView, width, height, 1)); + vk::ClearValue clearValue; + commandBuffer->beginRenderPass(vk::RenderPassBeginInfo(*renderPass, *framebuffer, vk::Rect2D({0, 0}, {(u32)width, (u32)height}), clearValue), + vk::SubpassContents::eInline); + + // Pipeline + QuadPipeline pipeline(true, config::Rotate90); + pipeline.Init(shaderManager.get(), *renderPass, 0); + pipeline.BindPipeline(*commandBuffer); + + // Draw + QuadVertex vtx[4] { + { -1, -1, 0, 0, 0 }, + { 1, -1, 0, 1, 0 }, + { -1, 1, 0, 0, 1 }, + { 1, 1, 0, 1, 1 }, + }; + + vk::Viewport viewport(0, 0, width, height); + commandBuffer->setViewport(0, viewport); + commandBuffer->setScissor(0, vk::Rect2D(vk::Offset2D(0, 0), vk::Extent2D(width, height))); + QuadDrawer drawer; + drawer.Init(&pipeline); + drawer.Draw(*commandBuffer, lastFrameView, vtx, false); + commandBuffer->endRenderPass(); + + // Copy back + vk::BufferImageCopy copyRegion(0, width, height, vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1), vk::Offset3D(0, 0, 0), + vk::Extent3D(width, height, 1)); + commandBuffer->copyImageToBuffer(attachment.GetImage(), vk::ImageLayout::eTransferSrcOptimal, + *attachment.GetBufferData()->buffer, copyRegion); + + vk::BufferMemoryBarrier bufferMemoryBarrier( + vk::AccessFlagBits::eTransferWrite, + vk::AccessFlagBits::eHostRead, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED, + *attachment.GetBufferData()->buffer, + 0, + VK_WHOLE_SIZE); + commandBuffer->pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eHost, {}, nullptr, bufferMemoryBarrier, nullptr); + commandBuffer->end(); + + vk::UniqueFence fence = device->createFenceUnique(vk::FenceCreateInfo()); + vk::SubmitInfo submitInfo(nullptr, nullptr, commandBuffer.get(), nullptr); + graphicsQueue.submit(submitInfo, *fence); + + vk::Result res = device->waitForFences(fence.get(), true, UINT64_MAX); + if (res != vk::Result::eSuccess) + WARN_LOG(RENDERER, "VulkanContext::GetLastFrame: waitForFences failed %d", (int)res); + + const u8 *img = (const u8 *)attachment.GetBufferData()->MapMemory(); + data.clear(); + data.reserve(width * height * 3); + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + data.push_back(*img++); + data.push_back(*img++); + data.push_back(*img++); + img++; + } + } + attachment.GetBufferData()->UnmapMemory(); + + return true; +} diff --git a/core/rend/vulkan/vulkan_context.h b/core/rend/vulkan/vulkan_context.h index b1af59857..4c6a45056 100644 --- a/core/rend/vulkan/vulkan_context.h +++ b/core/rend/vulkan/vulkan_context.h @@ -21,6 +21,8 @@ #pragma once #ifdef USE_VULKAN +#include "vulkan.h" + #include class InvalidVulkanContext : public std::runtime_error { @@ -28,25 +30,75 @@ class InvalidVulkanContext : public std::runtime_error { InvalidVulkanContext() : std::runtime_error("Invalid Vulkan context") {} }; +// RAII utility-object for adding debug-scopes to command buffers +#ifdef VK_DEBUG +class CommandBufferDebugScope { +private: + const vk::CommandBuffer commandBuffer; + +public: + CommandBufferDebugScope( + vk::CommandBuffer targetCommandBuffer, + std::string_view scopeName, const float scopeColor[4] + ) : commandBuffer(targetCommandBuffer) + { + vk::DebugUtilsLabelEXT label{}; + label.pLabelName = scopeName.data(); + std::copy_n(scopeColor, 4, label.color.data()); + commandBuffer.beginDebugUtilsLabelEXT(label); + } + + void operator()(std::string_view scopeName, const float scopeColor[4]) const + { + vk::DebugUtilsLabelEXT label{}; + label.pLabelName = scopeName.data(); + std::copy_n(scopeColor, 4, label.color.data()); + commandBuffer.insertDebugUtilsLabelEXT(label); + } + + ~CommandBufferDebugScope() + { + commandBuffer.endDebugUtilsLabelEXT(); + } +}; +#else +class CommandBufferDebugScope { +public: + CommandBufferDebugScope( + vk::CommandBuffer targetCommandBuffer, + std::string_view scopeName, const float scopeColor[4] + ) + { + } + + void operator()(std::string_view scopeName, const float scopeColor[4]) const + { + } + + ~CommandBufferDebugScope() + { + } +}; +#endif + #ifdef LIBRETRO #include "vk_context_lr.h" #else -#include "vulkan.h" #include "vmallocator.h" #include "quad.h" -#include "rend/TexCache.h" +#include "rend/texconv.h" #include "overlay.h" #include "wsi/context.h" +#include struct ImDrawData; -class TextureCache; -class VulkanContext : public GraphicsContext +class VulkanContext : public GraphicsContext, public FlightManager { public: VulkanContext(); - ~VulkanContext(); + ~VulkanContext() override; bool init(); void term() override; @@ -61,6 +113,7 @@ class VulkanContext : public GraphicsContext void Present() noexcept; void PresentFrame(vk::Image image, vk::ImageView imageView, const vk::Extent2D& extent, float aspectRatio) noexcept; void PresentLastFrame(); + bool GetLastFrame(std::vector& data, int& width, int& height); vk::PhysicalDevice GetPhysicalDevice() const { return physicalDevice; } vk::Device GetDevice() const { return *device; } @@ -69,6 +122,7 @@ class VulkanContext : public GraphicsContext vk::CommandBuffer GetCurrentCommandBuffer() const { return *commandBuffers[GetCurrentImageIndex()]; } vk::DescriptorPool GetDescriptorPool() const { return *descriptorPool; } vk::Extent2D GetViewPort() const { return { (u32)settings.display.width, (u32)settings.display.height }; } + vk::SwapchainKHR GetSwapChain() const { return *swapChain; } u32 GetSwapChainSize() const { return (u32)imageViews.size(); } int GetCurrentImageIndex() const { return currentImage; } void WaitIdle() const; @@ -95,14 +149,15 @@ class VulkanContext : public GraphicsContext std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return vendorID == VENDOR_ATI || vendorID == VENDOR_AMD; + } vk::Format GetDepthFormat() const { return depthFormat; } static VulkanContext *Instance() { return contextInstance; } bool SupportsSamplerAnisotropy() const { return samplerAnisotropy; } float GetMaxSamplerAnisotropy() const { return samplerAnisotropy ? maxSamplerAnisotropy : 1.f; } bool SupportsDedicatedAllocation() const { return dedicatedAllocationSupported; } const VMAllocator& GetAllocator() const { return allocator; } - bool IsUnifiedMemory() const { return unifiedMemory; } - u32 GetMaxStorageBufferRange() const { return maxStorageBufferRange; } vk::DeviceSize GetMaxMemoryAllocationSize() const { return maxMemoryAllocationSize; } u32 GetVendorID() const { return vendorID; } vk::CommandBuffer PrepareOverlay(bool vmu, bool crosshair); @@ -112,17 +167,24 @@ class VulkanContext : public GraphicsContext vk::SubmitInfo(nullptr, nullptr, buffers), fence); } bool hasPerPixel() override { return fragmentStoresAndAtomics; } + bool hasProvokingVertex() { return provokingVertexSupported; } bool recreateSwapChainIfNeeded(); + void addToFlight(Deletable *object) override { + inFlightObjects[GetCurrentImageIndex()].emplace_back(object); + } #ifdef VK_DEBUG - void setObjectName(u64 object, VkDebugReportObjectTypeEXT objectType, const std::string& name) + template::value>> + void setObjectName(const HandleType& object, const std::string& name) { - VkDebugMarkerObjectNameInfoEXT nameInfo = {}; - nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; - nameInfo.objectType = objectType; - nameInfo.object = object; + vk::DebugUtilsObjectNameInfoEXT nameInfo {}; + nameInfo.objectType = HandleType::objectType; + nameInfo.objectHandle = reinterpret_cast(static_cast(object)); nameInfo.pObjectName = name.c_str(); - VULKAN_HPP_DEFAULT_DISPATCHER.vkDebugMarkerSetObjectNameEXT((VkDevice)*device, &nameInfo); + if (device) { + vk::Result e = device->setDebugUtilsObjectNameEXT(&nameInfo); + (void)e; + } } #endif constexpr static int VENDOR_AMD = 0x1022; @@ -160,7 +222,6 @@ class VulkanContext : public GraphicsContext u32 presentQueueIndex = 0; vk::DeviceSize uniformBufferAlignment = 0; vk::DeviceSize storageBufferAlignment = 0; - u32 maxStorageBufferRange = 0; vk::DeviceSize maxMemoryAllocationSize = 0xFFFFFFFFu; bool optimalTilingSupported565 = false; bool optimalTilingSupported1555 = false; @@ -169,7 +230,7 @@ class VulkanContext : public GraphicsContext bool samplerAnisotropy = false; float maxSamplerAnisotropy = 0.f; bool dedicatedAllocationSupported = false; - bool unifiedMemory = false; + bool provokingVertexSupported = false; u32 vendorID = 0; int swapInterval = 1; vk::UniqueDevice device; @@ -213,8 +274,7 @@ class VulkanContext : public GraphicsContext float lastFrameAR = 0.f; std::unique_ptr overlay; - // only used to delay the destruction of overlay textures - std::unique_ptr textureCache; + std::vector>> inFlightObjects; std::string driverName; std::string driverVersion; diff --git a/core/rend/vulkan/vulkan_driver.h b/core/rend/vulkan/vulkan_driver.h index 6628ce937..3c00d0aa9 100644 --- a/core/rend/vulkan/vulkan_driver.h +++ b/core/rend/vulkan/vulkan_driver.h @@ -17,8 +17,8 @@ along with Flycast. If not, see . */ #pragma once -#include "rend/imgui_driver.h" -#include "imgui/backends/imgui_impl_vulkan.h" +#include "ui/imgui_driver.h" +#include "imgui_impl_vulkan.h" #include "vulkan_context.h" #include "texture.h" #include @@ -26,13 +26,22 @@ class VulkanDriver final : public ImGuiDriver { public: - ~VulkanDriver() { + void reset() override + { + ImGuiDriver::reset(); textures.clear(); linearSampler.reset(); + pointSampler.reset(); ImGui_ImplVulkan_Shutdown(); + justStarted = true; + } + + ~VulkanDriver() { + reset(); } void newFrame() override { + ImGui_ImplVulkan_NewFrame(); } void renderDrawData(ImDrawData *drawData, bool gui_open) override @@ -43,32 +52,31 @@ class VulkanDriver final : public ImGuiDriver try { bool rendering = context->IsRendering(); if (!rendering) - { - if (context->recreateSwapChainIfNeeded()) - return; - context->NewFrame(); - } - vk::CommandBuffer vmuCmdBuffer{}; + context->NewFrame(); // may reset this driver if (!rendering || newFrameStarted) { - vmuCmdBuffer = getContext()->PrepareOverlay(true, false); context->BeginRenderPass(); - context->PresentLastFrame(); - context->DrawOverlay(settings.display.uiScale, true, false); + if (renderer->RenderLastFrame()) + context->PresentLastFrame(); } if (!justStarted) + { + const vk::CommandBuffer targetCommandBuffer = getCommandBuffer(); + static const float scopeColor[4] = {0.26f, 0.59f, 0.98f, 0.31f}; + CommandBufferDebugScope _(targetCommandBuffer, "ImGui", scopeColor); // Record Imgui Draw Data and draw funcs into command buffer ImGui_ImplVulkan_RenderDrawData(drawData, (VkCommandBuffer)getCommandBuffer()); + } justStarted = false; if (!rendering || newFrameStarted) - context->EndFrame(vmuCmdBuffer); + context->EndFrame(); newFrameStarted = false; } catch (const InvalidVulkanContext& err) { } } void present() override { - getContext()->Present(); // may destroy this driver + getContext()->Present(); // may reset this driver } ImTextureID getTexture(const std::string& name) override { @@ -79,26 +87,50 @@ class VulkanDriver final : public ImGuiDriver return ImTextureID{}; } - ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height) override + ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) override { + if (justStarted) + // give it some more time + return {}; VkTexture vkTex(std::make_unique()); vkTex.texture->tex_type = TextureType::_8888; vkTex.texture->SetCommandBuffer(getCommandBuffer()); vkTex.texture->UploadToGPU(width, height, data, false); vkTex.texture->SetCommandBuffer(nullptr); - if (!linearSampler) + VkSampler sampler; + if (nearestSampling) + { + if (!pointSampler) + { + pointSampler = getContext()->GetDevice().createSamplerUnique( + vk::SamplerCreateInfo(vk::SamplerCreateFlags(), + vk::Filter::eNearest, vk::Filter::eNearest, + vk::SamplerMipmapMode::eNearest, + vk::SamplerAddressMode::eClampToBorder, + vk::SamplerAddressMode::eClampToBorder, + vk::SamplerAddressMode::eClampToBorder, 0.0f, false, + 0.f, false, vk::CompareOp::eNever, 0.0f, vk::LodClampNone, + vk::BorderColor::eFloatTransparentBlack)); + } + sampler = (VkSampler)*pointSampler; + } + else { - linearSampler = getContext()->GetDevice().createSamplerUnique( - vk::SamplerCreateInfo(vk::SamplerCreateFlags(), - vk::Filter::eLinear, vk::Filter::eLinear, - vk::SamplerMipmapMode::eLinear, - vk::SamplerAddressMode::eClampToBorder, - vk::SamplerAddressMode::eClampToBorder, - vk::SamplerAddressMode::eClampToEdge, 0.0f, false, - 0.f, false, vk::CompareOp::eNever, 0.0f, VK_LOD_CLAMP_NONE, - vk::BorderColor::eFloatTransparentBlack)); + if (!linearSampler) + { + linearSampler = getContext()->GetDevice().createSamplerUnique( + vk::SamplerCreateInfo(vk::SamplerCreateFlags(), + vk::Filter::eLinear, vk::Filter::eLinear, + vk::SamplerMipmapMode::eLinear, + vk::SamplerAddressMode::eClampToBorder, + vk::SamplerAddressMode::eClampToBorder, + vk::SamplerAddressMode::eClampToBorder, 0.0f, false, + 0.f, false, vk::CompareOp::eNever, 0.0f, vk::LodClampNone, + vk::BorderColor::eFloatTransparentBlack)); + } + sampler = (VkSampler)*linearSampler; } - ImTextureID texId = vkTex.textureId = ImGui_ImplVulkan_AddTexture((VkSampler)*linearSampler, (VkImageView)vkTex.texture->GetImageView(), + ImTextureID texId = vkTex.textureId = ImGui_ImplVulkan_AddTexture(sampler, (VkImageView)vkTex.texture->GetImageView(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); // TODO update existing texture //auto it = textures.find(name); @@ -110,6 +142,27 @@ class VulkanDriver final : public ImGuiDriver return texId; } + void deleteTexture(const std::string& name) override + { + auto it = textures.find(name); + if (it != textures.end()) + { + class DescSetDeleter : public Deletable + { + public: + DescSetDeleter(VkDescriptorSet descSet) : descSet(descSet) {} + ~DescSetDeleter() { + ImGui_ImplVulkan_RemoveTexture(descSet); + } + VkDescriptorSet descSet; + }; + getContext()->addToFlight(new DescSetDeleter((VkDescriptorSet)it->second.textureId)); + if (it->second.texture != nullptr) + it->second.texture->deferDeleteResource(getContext()); + textures.erase(it); + } + } + private: struct VkTexture { VkTexture() = default; @@ -139,6 +192,7 @@ class VulkanDriver final : public ImGuiDriver std::unordered_map textures; vk::UniqueSampler linearSampler; + vk::UniqueSampler pointSampler; bool newFrameStarted = false; bool justStarted = true; }; diff --git a/core/rend/vulkan/vulkan_renderer.cpp b/core/rend/vulkan/vulkan_renderer.cpp index 0586d997a..c40fc989b 100644 --- a/core/rend/vulkan/vulkan_renderer.cpp +++ b/core/rend/vulkan/vulkan_renderer.cpp @@ -21,6 +21,216 @@ #include "vulkan.h" #include "vulkan_renderer.h" #include "drawer.h" +#include "hw/pvr/ta.h" +#include "rend/transform_matrix.h" + +bool BaseVulkanRenderer::BaseInit(vk::RenderPass renderPass, int subpass) +{ + texCommandPool.Init(); + fbCommandPool.Init(); + quadPipeline = std::make_unique(false, false); + quadPipeline->Init(&shaderManager, renderPass, subpass); + framebufferDrawer = std::make_unique(); + framebufferDrawer->Init(quadPipeline.get()); + + return true; +} + +void BaseVulkanRenderer::Term() +{ + GetContext()->WaitIdle(); + GetContext()->PresentFrame(nullptr, nullptr, vk::Extent2D(), 0); +#if defined(VIDEO_ROUTING) && defined(TARGET_MAC) + os_VideoRoutingTermVk(); +#endif + framebufferDrawer.reset(); + quadPipeline.reset(); + textureCache.Clear(); + fogTexture = nullptr; + paletteTexture = nullptr; + texCommandPool.Term(); + fbCommandPool.Term(); + framebufferTextures.clear(); + framebufferTexIndex = 0; + shaderManager.term(); +} + +BaseTextureCacheData *BaseVulkanRenderer::GetTexture(TSP tsp, TCW tcw) +{ + Texture* tf = textureCache.getTextureCacheData(tsp, tcw); + + //update if needed + if (tf->NeedsUpdate()) + { + // This kills performance when a frame is skipped and lots of texture updated each frame + //if (textureCache.IsInFlight(tf, true)) + // textureCache.DestroyLater(tf); + tf->SetCommandBuffer(texCommandBuffer); + if (!tf->Update()) + { + tf->SetCommandBuffer(nullptr); + return nullptr; + } + } + else if (tf->IsCustomTextureAvailable()) + { + tf->deferDeleteResource(&texCommandPool); + tf->SetCommandBuffer(texCommandBuffer); + tf->CheckCustomTexture(); + } + tf->SetCommandBuffer(nullptr); + textureCache.SetInFlight(tf); + + return tf; +} + +void BaseVulkanRenderer::Process(TA_context* ctx) +{ + if (!ctx->rend.isRTT) { + framebufferRendered = false; + if (!config::EmulateFramebuffer) + clearLastFrame = false; + } + if (resetTextureCache) { + textureCache.Clear(); + resetTextureCache = false; + } + + texCommandPool.BeginFrame(); + textureCache.SetCurrentIndex(texCommandPool.GetIndex()); + textureCache.Cleanup(); + + texCommandBuffer = texCommandPool.Allocate(); + texCommandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); + + ta_parse(ctx, true); + + // TODO can't update fog or palette twice in multi render + CheckFogTexture(); + CheckPaletteTexture(); + texCommandBuffer.end(); +} + +void BaseVulkanRenderer::ReInitOSD() +{ + texCommandPool.Init(); + fbCommandPool.Init(); +} + +void BaseVulkanRenderer::RenderFramebuffer(const FramebufferInfo& info) +{ + framebufferTexIndex = (framebufferTexIndex + 1) % GetContext()->GetSwapChainSize(); + + if (framebufferTextures.size() != GetContext()->GetSwapChainSize()) + framebufferTextures.resize(GetContext()->GetSwapChainSize()); + std::unique_ptr& curTexture = framebufferTextures[framebufferTexIndex]; + if (!curTexture) + { + curTexture = std::make_unique(); + curTexture->tex_type = TextureType::_8888; + } + + fbCommandPool.BeginFrame(); + vk::CommandBuffer commandBuffer = fbCommandPool.Allocate(); + + commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); + curTexture->SetCommandBuffer(commandBuffer); + { + static const float scopeColor[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; + CommandBufferDebugScope _(commandBuffer, "RenderFramebuffer", scopeColor); + + if (info.fb_r_ctrl.fb_enable == 0 || info.vo_control.blank_video == 1) + { + // Video output disabled + u8 rgba[]{ (u8)info.vo_border_col._red, (u8)info.vo_border_col._green, (u8)info.vo_border_col._blue, 255 }; + curTexture->UploadToGPU(1, 1, rgba, false); + } + else + { + PixelBuffer pb; + int width; + int height; + ReadFramebuffer(info, pb, width, height); + + curTexture->UploadToGPU(width, height, (u8*)pb.data(), false); + } + + } + curTexture->SetCommandBuffer(nullptr); + commandBuffer.end(); + fbCommandPool.EndFrame(); + framebufferRendered = true; + clearLastFrame = false; +} + +void BaseVulkanRenderer::RenderVideoRouting() +{ +#if defined(VIDEO_ROUTING) && defined(TARGET_MAC) + if (config::VideoRouting) + { + auto device = GetContext()->GetDevice(); + auto srcImage = device.getSwapchainImagesKHR(GetContext()->GetSwapChain())[GetContext()->GetCurrentImageIndex()]; + auto graphicsQueue = device.getQueue(GetContext()->GetGraphicsQueueFamilyIndex(), 0); + + int targetWidth = (config::VideoRoutingScale ? config::VideoRoutingVRes * settings.display.width / settings.display.height : settings.display.width); + int targetHeight = (config::VideoRoutingScale ? config::VideoRoutingVRes : settings.display.height); + + extern void os_VideoRoutingPublishFrameTexture(const vk::Device& device, const vk::Image& image, const vk::Queue& queue, float x, float y, float w, float h); + os_VideoRoutingPublishFrameTexture(device, srcImage, graphicsQueue, 0, 0, targetWidth, targetHeight); + } + else + { + os_VideoRoutingTermVk(); + } +#endif +} + +void BaseVulkanRenderer::CheckFogTexture() +{ + if (!fogTexture) + { + fogTexture = std::make_unique(); + fogTexture->tex_type = TextureType::_8; + updateFogTable = true; + } + if (!updateFogTable || !config::Fog) + return; + updateFogTable = false; + u8 texData[256]; + MakeFogTexture(texData); + + fogTexture->SetCommandBuffer(texCommandBuffer); + fogTexture->UploadToGPU(128, 2, texData, false); + fogTexture->SetCommandBuffer(nullptr); +} + +void BaseVulkanRenderer::CheckPaletteTexture() +{ + if (!paletteTexture) { + paletteTexture = std::make_unique(); + paletteTexture->tex_type = TextureType::_8888; + } + else if (!updatePalette) { + return; + } + updatePalette = false; + + paletteTexture->SetCommandBuffer(texCommandBuffer); + paletteTexture->UploadToGPU(1024, 1, (u8 *)palette32_ram, false); + paletteTexture->SetCommandBuffer(nullptr); +} + +bool BaseVulkanRenderer::presentFramebuffer() +{ + if (framebufferTexIndex >= (int)framebufferTextures.size()) + return false; + Texture *fbTexture = framebufferTextures[framebufferTexIndex].get(); + if (fbTexture == nullptr) + return false; + GetContext()->PresentFrame(fbTexture->GetImage(), fbTexture->GetImageView(), fbTexture->getSize(), + getDCFramebufferAspectRatio()); + return true; +} class VulkanRenderer final : public BaseVulkanRenderer { @@ -44,23 +254,33 @@ class VulkanRenderer final : public BaseVulkanRenderer { DEBUG_LOG(RENDERER, "VulkanRenderer::Term"); GetContext()->WaitIdle(); + texCommandPool.Term(); // make sure all in-flight buffers are returned screenDrawer.Term(); textureDrawer.Term(); samplerManager.term(); BaseVulkanRenderer::Term(); } + void Process(TA_context* ctx) override + { + if (emulateFramebuffer != config::EmulateFramebuffer) + { + screenDrawer.EndRenderPass(); + VulkanContext::Instance()->WaitIdle(); + screenDrawer.Term(); + screenDrawer.Init(&samplerManager, &shaderManager, viewport); + BaseInit(screenDrawer.GetRenderPass()); + emulateFramebuffer = config::EmulateFramebuffer; + } + else if (ctx->rend.isRTT) { + screenDrawer.EndRenderPass(); + } + BaseVulkanRenderer::Process(ctx); + } + bool Render() override { try { - if (emulateFramebuffer != config::EmulateFramebuffer) - { - VulkanContext::Instance()->WaitIdle(); - screenDrawer.Term(); - screenDrawer.Init(&samplerManager, &shaderManager, viewport); - BaseInit(screenDrawer.GetRenderPass()); - emulateFramebuffer = config::EmulateFramebuffer; - } Drawer *drawer; if (pvrrc.isRTT) drawer = &textureDrawer; @@ -70,7 +290,9 @@ class VulkanRenderer final : public BaseVulkanRenderer } drawer->Draw(fogTexture.get(), paletteTexture.get()); - drawer->EndRenderPass(); + if (config::EmulateFramebuffer || pvrrc.isRTT) + // delay ending the render pass in case of multi render + drawer->EndRenderPass(); return !pvrrc.isRTT; } catch (const vk::SystemError& e) { @@ -83,6 +305,8 @@ class VulkanRenderer final : public BaseVulkanRenderer bool Present() override { + if (clearLastFrame) + return false; if (config::EmulateFramebuffer || framebufferRendered) return presentFramebuffer(); else diff --git a/core/rend/vulkan/vulkan_renderer.h b/core/rend/vulkan/vulkan_renderer.h index d9b3b765f..f24ff3c00 100644 --- a/core/rend/vulkan/vulkan_renderer.h +++ b/core/rend/vulkan/vulkan_renderer.h @@ -16,221 +16,36 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "vulkan.h" #include "hw/pvr/Renderer_if.h" -#include "hw/pvr/ta.h" #include "commandpool.h" #include "pipeline.h" -#include "rend/osd.h" -#include "rend/transform_matrix.h" -#ifndef LIBRETRO -#include "rend/gui.h" -#endif +#include "shaders.h" #include #include +void os_VideoRoutingTermVk(); + class BaseVulkanRenderer : public Renderer { protected: - bool BaseInit(vk::RenderPass renderPass, int subpass = 0) - { - texCommandPool.Init(); - fbCommandPool.Init(); - -#if defined(__ANDROID__) && !defined(LIBRETRO) - if (!vjoyTexture) - { - int w, h; - u8 *image_data = loadOSDButtons(w, h); - texCommandPool.BeginFrame(); - vjoyTexture = std::make_unique(); - vjoyTexture->tex_type = TextureType::_8888; - vk::CommandBuffer cmdBuffer = texCommandPool.Allocate(); - cmdBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - vjoyTexture->SetCommandBuffer(cmdBuffer); - vjoyTexture->UploadToGPU(OSD_TEX_W, OSD_TEX_H, image_data, false); - vjoyTexture->SetCommandBuffer(nullptr); - cmdBuffer.end(); - texCommandPool.EndFrame(); - delete [] image_data; - osdPipeline.Init(&shaderManager, vjoyTexture->GetImageView(), GetContext()->GetRenderPass()); - } - if (!osdBuffer) - { - osdBuffer = std::make_unique(sizeof(OSDVertex) * VJOY_VISIBLE * 4, - vk::BufferUsageFlagBits::eVertexBuffer); - } -#endif - quadPipeline = std::make_unique(false, false); - quadPipeline->Init(&shaderManager, renderPass, subpass); - framebufferDrawer = std::make_unique(); - framebufferDrawer->Init(quadPipeline.get()); - - return true; - } + bool BaseInit(vk::RenderPass renderPass, int subpass = 0); public: - void Term() override - { - GetContext()->WaitIdle(); - GetContext()->PresentFrame(nullptr, nullptr, vk::Extent2D(), 0); - framebufferDrawer.reset(); - quadPipeline.reset(); - osdBuffer.reset(); - osdPipeline.Term(); - vjoyTexture.reset(); - textureCache.Clear(); - fogTexture = nullptr; - paletteTexture = nullptr; - texCommandPool.Term(); - fbCommandPool.Term(); - framebufferTextures.clear(); - framebufferTexIndex = 0; - shaderManager.term(); - } - - BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override - { - Texture* tf = textureCache.getTextureCacheData(tsp, tcw); - - //update if needed - if (tf->NeedsUpdate()) - { - // This kills performance when a frame is skipped and lots of texture updated each frame - //if (textureCache.IsInFlight(tf)) - // textureCache.DestroyLater(tf); - tf->SetCommandBuffer(texCommandBuffer); - if (!tf->Update()) - { - tf->SetCommandBuffer(nullptr); - return nullptr; - } - } - else if (tf->IsCustomTextureAvailable()) - { - textureCache.DestroyLater(tf); - tf->SetCommandBuffer(texCommandBuffer); - tf->CheckCustomTexture(); - } - tf->SetCommandBuffer(nullptr); - textureCache.SetInFlight(tf); - - return tf; - } - - void Process(TA_context* ctx) override - { - if (KillTex) - textureCache.Clear(); - - texCommandPool.BeginFrame(); - textureCache.SetCurrentIndex(texCommandPool.GetIndex()); - textureCache.Cleanup(); - - texCommandBuffer = texCommandPool.Allocate(); - texCommandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - - ta_parse(ctx, true); - - CheckFogTexture(); - CheckPaletteTexture(); - texCommandBuffer.end(); + void Term() override; + BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override; + void Process(TA_context* ctx) override; + void ReInitOSD(); + void RenderFramebuffer(const FramebufferInfo& info) override; + void RenderVideoRouting(); + + bool RenderLastFrame() override { + return !clearLastFrame; } - - void ReInitOSD() - { - texCommandPool.Init(); - fbCommandPool.Init(); -#if defined(__ANDROID__) && !defined(LIBRETRO) - osdPipeline.Init(&shaderManager, vjoyTexture->GetImageView(), GetContext()->GetRenderPass()); -#endif - } - - void DrawOSD(bool clear_screen) override - { -#ifndef LIBRETRO - gui_display_osd(); - if (!vjoyTexture) - return; - try { - if (clear_screen) - { - GetContext()->NewFrame(); - GetContext()->BeginRenderPass(); - GetContext()->PresentLastFrame(); - } - const float dc2s_scale_h = settings.display.height / 480.0f; - const float sidebarWidth = (settings.display.width - dc2s_scale_h * 640.0f) / 2; - - std::vector osdVertices = GetOSDVertices(); - const float x1 = 2.0f / (settings.display.width / dc2s_scale_h); - const float y1 = 2.0f / 480; - const float x2 = 1 - 2 * sidebarWidth / settings.display.width; - const float y2 = 1; - for (OSDVertex& vtx : osdVertices) - { - vtx.x = vtx.x * x1 - x2; - vtx.y = vtx.y * y1 - y2; - } - - const vk::CommandBuffer cmdBuffer = GetContext()->GetCurrentCommandBuffer(); - cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, osdPipeline.GetPipeline()); - - osdPipeline.BindDescriptorSets(cmdBuffer); - const vk::Viewport viewport(0, 0, (float)settings.display.width, (float)settings.display.height, 0, 1.f); - cmdBuffer.setViewport(0, viewport); - const vk::Rect2D scissor({ 0, 0 }, { (u32)settings.display.width, (u32)settings.display.height }); - cmdBuffer.setScissor(0, scissor); - osdBuffer->upload((u32)(osdVertices.size() * sizeof(OSDVertex)), osdVertices.data()); - cmdBuffer.bindVertexBuffers(0, osdBuffer->buffer.get(), {0}); - for (u32 i = 0; i < (u32)osdVertices.size(); i += 4) - cmdBuffer.draw(4, 1, i, 0); - if (clear_screen) - GetContext()->EndFrame(); - } catch (const InvalidVulkanContext&) { - } -#endif - } - - void RenderFramebuffer(const FramebufferInfo& info) override - { - framebufferTexIndex = (framebufferTexIndex + 1) % GetContext()->GetSwapChainSize(); - - if (framebufferTextures.size() != GetContext()->GetSwapChainSize()) - framebufferTextures.resize(GetContext()->GetSwapChainSize()); - std::unique_ptr& curTexture = framebufferTextures[framebufferTexIndex]; - if (!curTexture) - { - curTexture = std::make_unique(); - curTexture->tex_type = TextureType::_8888; - } - - fbCommandPool.BeginFrame(); - vk::CommandBuffer commandBuffer = fbCommandPool.Allocate(); - commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit)); - curTexture->SetCommandBuffer(commandBuffer); - - if (info.fb_r_ctrl.fb_enable == 0 || info.vo_control.blank_video == 1) - { - // Video output disabled - u8 rgba[] { (u8)info.vo_border_col._red, (u8)info.vo_border_col._green, (u8)info.vo_border_col._blue, 255 }; - curTexture->UploadToGPU(1, 1, rgba, false); - } - else - { - PixelBuffer pb; - int width; - int height; - ReadFramebuffer(info, pb, width, height); - - curTexture->UploadToGPU(width, height, (u8*)pb.data(), false); - } - - curTexture->SetCommandBuffer(nullptr); - commandBuffer.end(); - fbCommandPool.EndFrame(); - framebufferRendered = true; + bool GetLastFrame(std::vector& data, int& width, int& height) override { + return GetContext()->GetLastFrame(data, width, height); } protected: @@ -244,57 +59,9 @@ class BaseVulkanRenderer : public Renderer viewport.height = h; } - void CheckFogTexture() - { - if (!fogTexture) - { - fogTexture = std::make_unique(); - fogTexture->tex_type = TextureType::_8; - fog_needs_update = true; - } - if (!fog_needs_update || !config::Fog) - return; - fog_needs_update = false; - u8 texData[256]; - MakeFogTexture(texData); - fogTexture->SetCommandBuffer(texCommandBuffer); - - fogTexture->UploadToGPU(128, 2, texData, false); - - fogTexture->SetCommandBuffer(nullptr); - } - - void CheckPaletteTexture() - { - if (!paletteTexture) - { - paletteTexture = std::make_unique(); - paletteTexture->tex_type = TextureType::_8888; - forcePaletteUpdate(); - } - if (!palette_updated) - return; - palette_updated = false; - - paletteTexture->SetCommandBuffer(texCommandBuffer); - - paletteTexture->UploadToGPU(1024, 1, (u8 *)palette32_ram, false); - - paletteTexture->SetCommandBuffer(nullptr); - } - - bool presentFramebuffer() - { - if (framebufferTexIndex >= (int)framebufferTextures.size()) - return false; - Texture *fbTexture = framebufferTextures[framebufferTexIndex].get(); - if (fbTexture == nullptr) - return false; - GetContext()->PresentFrame(fbTexture->GetImage(), fbTexture->GetImageView(), fbTexture->getSize(), - getDCFramebufferAspectRatio()); - framebufferRendered = false; - return true; - } + void CheckFogTexture(); + void CheckPaletteTexture(); + bool presentFramebuffer(); ShaderManager shaderManager; std::unique_ptr fogTexture; @@ -302,9 +69,6 @@ class BaseVulkanRenderer : public Renderer CommandPool texCommandPool; std::vector> framebufferTextures; int framebufferTexIndex = 0; - OSDPipeline osdPipeline; - std::unique_ptr vjoyTexture; - std::unique_ptr osdBuffer; TextureCache textureCache; vk::Extent2D viewport; vk::CommandBuffer texCommandBuffer; diff --git a/core/sdl/dreamconn.cpp b/core/sdl/dreamconn.cpp new file mode 100644 index 000000000..c379042fb --- /dev/null +++ b/core/sdl/dreamconn.cpp @@ -0,0 +1,225 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#include "dreamconn.h" + +#ifdef USE_DREAMCONN +#include "hw/maple/maple_devs.h" +#include "ui/gui.h" +#include +#include +#include +#include +#include + +void createDreamConnDevices(std::shared_ptr dreamconn, bool gameStart); + +static bool sendMsg(const MapleMsg& msg, asio::ip::tcp::iostream& stream) +{ + std::ostringstream s; + s.fill('0'); + s << std::hex << std::uppercase + << std::setw(2) << (u32)msg.command << " " + << std::setw(2) << (u32)msg.destAP << " " + << std::setw(2) << (u32)msg.originAP << " " + << std::setw(2) << (u32)msg.size; + const u32 sz = msg.getDataSize(); + for (u32 i = 0; i < sz; i++) + s << " " << std::setw(2) << (u32)msg.data[i]; + s << "\r\n"; + + asio::ip::tcp::socket& sock = static_cast(stream.socket()); + asio::error_code ec; + asio::write(sock, asio::buffer(s.str()), ec); + return !ec; +} + +static bool receiveMsg(MapleMsg& msg, std::istream& stream) +{ + std::string response; + if (!std::getline(stream, response)) + return false; + sscanf(response.c_str(), "%hhx %hhx %hhx %hhx", &msg.command, &msg.destAP, &msg.originAP, &msg.size); + if ((msg.getDataSize() - 1) * 3 + 13 >= response.length()) + return false; + for (unsigned i = 0; i < msg.getDataSize(); i++) + sscanf(&response[i * 3 + 12], "%hhx", &msg.data[i]); + return !stream.fail(); +} + +void DreamConn::connect() +{ + iostream = asio::ip::tcp::iostream("localhost", std::to_string(BASE_PORT + bus)); + if (!iostream) { + WARN_LOG(INPUT, "DreamConn[%d] connection failed: %s", bus, iostream.error().message().c_str()); + disconnect(); + return; + } + iostream.expires_from_now(std::chrono::seconds(1)); + // Now get the controller configuration + MapleMsg msg; + msg.command = MDCF_GetCondition; + msg.destAP = (bus << 6) | 0x20; + msg.originAP = bus << 6; + msg.setData(MFID_0_Input); + if (!sendMsg(msg, iostream)) + { + WARN_LOG(INPUT, "DreamConn[%d] communication failed", bus); + disconnect(); + return; + } + if (!receiveMsg(msg, iostream)) { + WARN_LOG(INPUT, "DreamConn[%d] read timeout", bus); + disconnect(); + return; + } + iostream.expires_from_now(std::chrono::duration::max()); // don't use a 64-bit based duration to avoid overflow + expansionDevs = msg.originAP & 0x1f; + NOTICE_LOG(INPUT, "Connected to DreamConn[%d]: VMU:%d, Rumble Pack:%d", bus, hasVmu(), hasRumble()); + config::MapleExpansionDevices[bus][0] = hasVmu() ? MDT_SegaVMU : MDT_None; + config::MapleExpansionDevices[bus][1] = hasRumble() ? MDT_PurupuruPack : MDT_None; +} + +void DreamConn::disconnect() +{ + if (iostream) { + iostream.close(); + NOTICE_LOG(INPUT, "Disconnected from DreamConn[%d]", bus); + } +} + +bool DreamConn::send(const MapleMsg& msg) +{ + if (!iostream) + return false; + if (!sendMsg(msg, iostream)) { + WARN_LOG(INPUT, "DreamConn[%d] send failed: %s", bus, iostream.error().message().c_str()); + return false; + } + return true; +} + +bool DreamConnGamepad::isDreamConn(int deviceIndex) +{ + char guid_str[33] {}; + SDL_JoystickGetGUIDString(SDL_JoystickGetDeviceGUID(deviceIndex), guid_str, sizeof(guid_str)); + INFO_LOG(INPUT, "GUID: %s VID:%c%c%c%c PID:%c%c%c%c", guid_str, + guid_str[10], guid_str[11], guid_str[8], guid_str[9], + guid_str[18], guid_str[19], guid_str[16], guid_str[17]); + // DreamConn VID:4457 PID:4443 + return memcmp("5744000043440000", guid_str + 8, 16) == 0; +} + +DreamConnGamepad::DreamConnGamepad(int maple_port, int joystick_idx, SDL_Joystick* sdl_joystick) + : SDLGamepad(maple_port, joystick_idx, sdl_joystick) +{ + _name = "DreamConn+ Controller"; + EventManager::listen(Event::Start, handleEvent, this); + EventManager::listen(Event::LoadState, handleEvent, this); +} + +DreamConnGamepad::~DreamConnGamepad() { + EventManager::unlisten(Event::Start, handleEvent, this); + EventManager::unlisten(Event::LoadState, handleEvent, this); +} + +void DreamConnGamepad::set_maple_port(int port) +{ + if (port < 0 || port >= 4) { + dreamconn.reset(); + } + else if (dreamconn == nullptr || dreamconn->getBus() != port) { + dreamconn.reset(); + dreamconn = std::make_shared(port); + } + SDLGamepad::set_maple_port(port); +} + +void DreamConnGamepad::handleEvent(Event event, void *arg) +{ + DreamConnGamepad *gamepad = static_cast(arg); + if (gamepad->dreamconn != nullptr) + createDreamConnDevices(gamepad->dreamconn, event == Event::Start); +} + +bool DreamConnGamepad::gamepad_btn_input(u32 code, bool pressed) +{ + if (!is_detecting_input() && input_mapper) + { + DreamcastKey key = input_mapper->get_button_id(0, code); + if (key == DC_BTN_START) { + startPressed = pressed; + checkKeyCombo(); + } + } + else { + startPressed = false; + } + return SDLGamepad::gamepad_btn_input(code, pressed); +} + +bool DreamConnGamepad::gamepad_axis_input(u32 code, int value) +{ + if (!is_detecting_input()) + { + if (code == leftTrigger) { + ltrigPressed = value > 0; + checkKeyCombo(); + } + else if (code == rightTrigger) { + rtrigPressed = value > 0; + checkKeyCombo(); + } + } + else { + ltrigPressed = false; + rtrigPressed = false; + } + return SDLGamepad::gamepad_axis_input(code, value); +} + +void DreamConnGamepad::checkKeyCombo() { + if (ltrigPressed && rtrigPressed && startPressed) + gui_open_settings(); +} + +#else + +void DreamConn::connect() { +} +void DreamConn::disconnect() { +} + +bool DreamConnGamepad::isDreamConn(int deviceIndex) { + return false; +} +DreamConnGamepad::DreamConnGamepad(int maple_port, int joystick_idx, SDL_Joystick* sdl_joystick) + : SDLGamepad(maple_port, joystick_idx, sdl_joystick) { +} +DreamConnGamepad::~DreamConnGamepad() { +} +void DreamConnGamepad::set_maple_port(int port) { + SDLGamepad::set_maple_port(port); +} +bool DreamConnGamepad::gamepad_btn_input(u32 code, bool pressed) { + return SDLGamepad::gamepad_btn_input(code, pressed); +} +bool DreamConnGamepad::gamepad_axis_input(u32 code, int value) { + return SDLGamepad::gamepad_axis_input(code, value); +} +#endif diff --git a/core/sdl/dreamconn.h b/core/sdl/dreamconn.h new file mode 100644 index 000000000..bf2e32680 --- /dev/null +++ b/core/sdl/dreamconn.h @@ -0,0 +1,101 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once +#include "types.h" +#include "emulator.h" +#include "sdl_gamepad.h" +#if defined(_WIN32) && !defined(TARGET_UWP) +#define USE_DREAMCONN 1 +#include +#endif + +struct MapleMsg +{ + u8 command; + u8 destAP; + u8 originAP; + u8 size; + u8 data[1024]; + + u32 getDataSize() const { + return size * 4; + } + + template + void setData(const T& p) { + memcpy(data, &p, sizeof(T)); + this->size = (sizeof(T) + 3) / 4; + } +}; +static_assert(sizeof(MapleMsg) == 1028); + +class DreamConn +{ + const int bus; +#ifdef USE_DREAMCONN + asio::ip::tcp::iostream iostream; +#endif + u8 expansionDevs = 0; + static constexpr u16 BASE_PORT = 37393; + +public: + DreamConn(int bus) : bus(bus) { + connect(); + } + ~DreamConn() { + disconnect(); + } + + bool send(const MapleMsg& msg); + + int getBus() const { + return bus; + } + bool hasVmu() { + return expansionDevs & 1; + } + bool hasRumble() { + return expansionDevs & 2; + } + +private: + void connect(); + void disconnect(); +}; + +class DreamConnGamepad : public SDLGamepad +{ +public: + DreamConnGamepad(int maple_port, int joystick_idx, SDL_Joystick* sdl_joystick); + ~DreamConnGamepad(); + + void set_maple_port(int port) override; + bool gamepad_btn_input(u32 code, bool pressed) override; + bool gamepad_axis_input(u32 code, int value) override; + static bool isDreamConn(int deviceIndex); + +private: + static void handleEvent(Event event, void *arg); + void checkKeyCombo(); + + std::shared_ptr dreamconn; + bool ltrigPressed = false; + bool rtrigPressed = false; + bool startPressed = false; +}; diff --git a/core/sdl/sdl.cpp b/core/sdl/sdl.cpp index 32c5197b4..a93c19e3c 100644 --- a/core/sdl/sdl.cpp +++ b/core/sdl/sdl.cpp @@ -14,10 +14,12 @@ #include "hw/maple/maple_devs.h" #include "sdl_gamepad.h" #include "sdl_keyboard.h" +#include "sdl_keyboard_mac.h" #include "wsi/context.h" #include "emulator.h" #include "stdclass.h" -#include "imgui/imgui.h" +#include "imgui.h" +#include "hw/naomi/card_reader.h" #if !defined(_WIN32) && !defined(__APPLE__) && !defined(__SWITCH__) #include "linux-dist/icon.h" #endif @@ -26,7 +28,10 @@ #endif #ifdef __SWITCH__ #include "nswitch.h" +#include "switch_gamepad.h" #endif +#include "dreamconn.h" +#include static SDL_Window* window = NULL; static u32 windowFlags; @@ -34,7 +39,8 @@ static u32 windowFlags; #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 -static std::shared_ptr sdl_mouse; +std::map> SDLGamepad::sdl_gamepads; +static std::unordered_map> sdl_mice; static std::shared_ptr sdl_keyboard; static bool window_fullscreen; static bool window_maximized; @@ -42,6 +48,14 @@ static SDL_Rect windowPos { SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WI static bool gameRunning; static bool mouseCaptured; static std::string clipboardText; +static std::string barcode; +static u64 lastBarcodeTime; + +static KeyboardLayout detectKeyboardLayout(); +static bool handleBarcodeScanner(const SDL_Event& event); +void sdl_stopHaptic(int port); +static void pauseHaptic(); +static void resumeHaptic(); static struct SDLDeInit { @@ -51,10 +65,12 @@ static struct SDLDeInit } bool initialized = false; -} sqlDeinit; +} sdlDeInit; static void sdl_open_joystick(int index) { + if (settings.naomi.slave) + return; SDL_Joystick *pJoystick = SDL_JoystickOpen(index); if (pJoystick == NULL) @@ -63,7 +79,15 @@ static void sdl_open_joystick(int index) return; } try { - std::shared_ptr gamepad = std::make_shared(index < MAPLE_PORTS ? index : -1, index, pJoystick); +#ifdef __SWITCH__ + std::shared_ptr gamepad = std::make_shared(index < MAPLE_PORTS ? index : -1, index, pJoystick); +#else + std::shared_ptr gamepad; + if (DreamConnGamepad::isDreamConn(index)) + gamepad = std::make_shared(index < MAPLE_PORTS ? index : -1, index, pJoystick); + else + gamepad = std::make_shared(index < MAPLE_PORTS ? index : -1, index, pJoystick); +#endif SDLGamepad::AddSDLGamepad(gamepad); } catch (const FlycastException& e) { } @@ -71,11 +95,21 @@ static void sdl_open_joystick(int index) static void sdl_close_joystick(SDL_JoystickID instance) { + if (settings.naomi.slave) + return; std::shared_ptr gamepad = SDLGamepad::GetSDLGamepad(instance); if (gamepad != NULL) gamepad->close(); } +static void setWindowTitleGame() +{ + if (settings.naomi.slave) + SDL_SetWindowTitle(window, ("Flycast - Multiboard Slave " + cfgLoadStr("naomi", "BoardId", "")).c_str()); + else + SDL_SetWindowTitle(window, ("Flycast - " + settings.content.title).c_str()); +} + static void captureMouse(bool capture) { if (window == nullptr || !gameRunning) @@ -86,7 +120,7 @@ static void captureMouse(bool capture) SDL_SetRelativeMouseMode(SDL_FALSE); else SDL_ShowCursor(SDL_ENABLE); - SDL_SetWindowTitle(window, "Flycast"); + setWindowTitleGame(); mouseCaptured = false; } else @@ -106,19 +140,24 @@ static void emuEventCallback(Event event, void *) { switch (event) { + case Event::Terminate: + SDL_SetWindowTitle(window, "Flycast"); + sdl_stopHaptic(0); + break; case Event::Pause: gameRunning = false; if (!config::UseRawInput) SDL_SetRelativeMouseMode(SDL_FALSE); SDL_ShowCursor(SDL_ENABLE); - SDL_SetWindowTitle(window, "Flycast"); + setWindowTitleGame(); + pauseHaptic(); break; case Event::Resume: gameRunning = true; captureMouse(mouseCaptured); if (window_fullscreen && !mouseCaptured) SDL_ShowCursor(SDL_DISABLE); - + resumeHaptic(); break; default: break; @@ -128,14 +167,15 @@ static void emuEventCallback(Event event, void *) static void checkRawInput() { #if defined(_WIN32) && !defined(TARGET_UWP) - if ((bool)config::UseRawInput != (bool)sdl_mouse) + if ((bool)config::UseRawInput != (bool)sdl_keyboard) return; if (config::UseRawInput) { GamepadDevice::Unregister(sdl_keyboard); sdl_keyboard = nullptr; - GamepadDevice::Unregister(sdl_mouse); - sdl_mouse = nullptr; + for (auto& it : sdl_mice) + GamepadDevice::Unregister(it.second); + sdl_mice.clear(); rawinput::init(); } else @@ -143,20 +183,17 @@ static void checkRawInput() rawinput::term(); sdl_keyboard = std::make_shared(0); GamepadDevice::Register(sdl_keyboard); - sdl_mouse = std::make_shared(); - GamepadDevice::Register(sdl_mouse); } #else if (!sdl_keyboard) { +#ifdef __APPLE__ + sdl_keyboard = std::make_shared(0); +#else sdl_keyboard = std::make_shared(0); +#endif GamepadDevice::Register(sdl_keyboard); } - if (!sdl_mouse) - { - sdl_mouse = std::make_shared(); - GamepadDevice::Register(sdl_mouse); - } #endif } @@ -189,10 +226,15 @@ void input_sdl_init() if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) die("SDL: error initializing Joystick subsystem"); } - sqlDeinit.initialized = true; + sdlDeInit.initialized = true; + if (SDL_WasInit(SDL_INIT_HAPTIC) == 0) + SDL_InitSubSystem(SDL_INIT_HAPTIC); SDL_SetRelativeMouseMode(SDL_FALSE); + // Event::Start is called on a background thread, so we can't use it to change the window title (macOS) + // However it's followed by Event::Resume which is fine. + EventManager::listen(Event::Terminate, emuEventCallback); EventManager::listen(Event::Pause, emuEventCallback); EventManager::listen(Event::Resume, emuEventCallback); @@ -221,21 +263,39 @@ void input_sdl_init() } }); } + if (settings.input.keyboardLangId == KeyboardLayout::US) + settings.input.keyboardLangId = detectKeyboardLayout(); + barcode.clear(); } void input_sdl_quit() { + EventManager::unlisten(Event::Terminate, emuEventCallback); + EventManager::unlisten(Event::Pause, emuEventCallback); + EventManager::unlisten(Event::Resume, emuEventCallback); SDLGamepad::closeAllGamepads(); - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC); } -inline void SDLMouse::setAbsPos(int x, int y) { +inline void SDLMouse::setAbsPos(int x, int y) +{ int width, height; SDL_GetWindowSize(window, &width, &height); if (width != 0 && height != 0) Mouse::setAbsPos(x, y, width, height); } +static std::shared_ptr getMouse(u64 mouseId) +{ + auto& mouse = sdl_mice[mouseId]; + if (mouse == nullptr) + { + mouse = std::make_shared(mouseId); + GamepadDevice::Register(mouse); + } + return mouse; +} + void input_sdl_handle() { SDLGamepad::UpdateRumble(); @@ -275,33 +335,40 @@ void input_sdl_handle() return (sdl_keyboard->get_input_mapping()->get_button_id(0, code) != EMU_BTN_NONE); } }; - - if (event.type == SDL_KEYDOWN - && ((event.key.keysym.sym == SDLK_RETURN && (event.key.keysym.mod & KMOD_ALT)) - || (event.key.keysym.sym == SDLK_F11 && (event.key.keysym.mod & (KMOD_ALT | KMOD_CTRL | KMOD_SHIFT | KMOD_GUI)) == 0))) + if (event.type == SDL_KEYDOWN) { - if (window_fullscreen) + // Alt-Return and F11 toggle full screen + if ((event.key.keysym.sym == SDLK_RETURN && (event.key.keysym.mod & KMOD_ALT)) + || (event.key.keysym.sym == SDLK_F11 && (event.key.keysym.mod & (KMOD_ALT | KMOD_CTRL | KMOD_SHIFT | KMOD_GUI)) == 0)) { - SDL_SetWindowFullscreen(window, 0); - if (!gameRunning || !mouseCaptured) - SDL_ShowCursor(SDL_ENABLE); + if (window_fullscreen) + { + SDL_SetWindowFullscreen(window, 0); + if (!gameRunning || !mouseCaptured) + SDL_ShowCursor(SDL_ENABLE); + } + else + { + SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP); + if (gameRunning) + SDL_ShowCursor(SDL_DISABLE); + } + window_fullscreen = !window_fullscreen; + break; } - else + // Left-Alt + Left-CTRL toggles mouse capture + if ((event.key.keysym.mod & KMOD_LALT) && (event.key.keysym.mod & KMOD_LCTRL) + && !(is_key_mapped(SDL_SCANCODE_LALT) || is_key_mapped(SDL_SCANCODE_LCTRL))) { - SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP); - if (gameRunning) - SDL_ShowCursor(SDL_DISABLE); + captureMouse(!mouseCaptured); + break; } - window_fullscreen = !window_fullscreen; - } - else if (event.type == SDL_KEYDOWN && (event.key.keysym.mod & KMOD_LALT) && (event.key.keysym.mod & KMOD_LCTRL) && !(is_key_mapped(SDL_SCANCODE_LALT) || is_key_mapped(SDL_SCANCODE_LCTRL)) ) - { - captureMouse(!mouseCaptured); + // Barcode scanner + if (card_reader::barcodeAvailable() && handleBarcodeScanner(event)) + break; } - else if (!config::UseRawInput) - { + if (!config::UseRawInput) sdl_keyboard->input(event.key.keysym.scancode, event.type == SDL_KEYDOWN); - } } break; @@ -400,15 +467,11 @@ void input_sdl_handle() checkRawInput(); if (!config::UseRawInput) { + auto mouse = getMouse(event.motion.which); if (mouseCaptured && gameRunning) - sdl_mouse->setRelPos(event.motion.xrel, event.motion.yrel); + mouse->setRelPos(event.motion.xrel, event.motion.yrel); else - sdl_mouse->setAbsPos(event.motion.x, event.motion.y); - sdl_mouse->setButton(Mouse::LEFT_BUTTON, event.motion.state & SDL_BUTTON_LMASK); - sdl_mouse->setButton(Mouse::RIGHT_BUTTON, event.motion.state & SDL_BUTTON_RMASK); - sdl_mouse->setButton(Mouse::MIDDLE_BUTTON, event.motion.state & SDL_BUTTON_MMASK); - sdl_mouse->setButton(Mouse::BUTTON_4, event.motion.state & SDL_BUTTON_X1MASK); - sdl_mouse->setButton(Mouse::BUTTON_5, event.motion.state & SDL_BUTTON_X2MASK); + mouse->setAbsPos(event.motion.x, event.motion.y); } else if (mouseCaptured && gameRunning) { @@ -434,24 +497,25 @@ void input_sdl_handle() checkRawInput(); if (!config::UseRawInput) { + auto mouse = getMouse(event.button.which); if (!mouseCaptured || !gameRunning) - sdl_mouse->setAbsPos(event.button.x, event.button.y); + mouse->setAbsPos(event.button.x, event.button.y); bool pressed = event.button.state == SDL_PRESSED; switch (event.button.button) { case SDL_BUTTON_LEFT: - sdl_mouse->setButton(Mouse::LEFT_BUTTON, pressed); + mouse->setButton(Mouse::LEFT_BUTTON, pressed); break; case SDL_BUTTON_RIGHT: - sdl_mouse->setButton(Mouse::RIGHT_BUTTON, pressed); + mouse->setButton(Mouse::RIGHT_BUTTON, pressed); break; case SDL_BUTTON_MIDDLE: - sdl_mouse->setButton(Mouse::MIDDLE_BUTTON, pressed); + mouse->setButton(Mouse::MIDDLE_BUTTON, pressed); break; case SDL_BUTTON_X1: - sdl_mouse->setButton(Mouse::BUTTON_4, pressed); + mouse->setButton(Mouse::BUTTON_4, pressed); break; case SDL_BUTTON_X2: - sdl_mouse->setButton(Mouse::BUTTON_5, pressed); + mouse->setButton(Mouse::BUTTON_5, pressed); break; } } @@ -461,8 +525,10 @@ void input_sdl_handle() case SDL_MOUSEWHEEL: gui_set_mouse_wheel(-event.wheel.y * 35); checkRawInput(); - if (!config::UseRawInput) - sdl_mouse->setWheel(-event.wheel.y); + if (!config::UseRawInput) { + auto mouse = getMouse(event.wheel.which); + mouse->setWheel(-event.wheel.y); + } break; case SDL_JOYDEVICEADDED: @@ -472,16 +538,48 @@ void input_sdl_handle() case SDL_JOYDEVICEREMOVED: sdl_close_joystick((SDL_JoystickID)event.jdevice.which); break; + + case SDL_DROPFILE: + gui_start_game(event.drop.file); + break; + + // Switch touchscreen support + case SDL_FINGERDOWN: + case SDL_FINGERMOTION: + { + auto mouse = getMouse(0); + int x = event.tfinger.x * settings.display.width; + int y = event.tfinger.y * settings.display.height; + gui_set_mouse_position(x, y); + if (mouseCaptured && gameRunning && event.type == SDL_FINGERMOTION) + { + int dx = event.tfinger.dx * settings.display.width; + int dy = event.tfinger.dy * settings.display.height; + mouse->setRelPos(dx, dy); + } + else + mouse->setAbsPos(x, y); + if (event.type == SDL_FINGERDOWN) { + mouse->setButton(Mouse::LEFT_BUTTON, true); + gui_set_mouse_button(0, true); + } + } + break; + case SDL_FINGERUP: + { + auto mouse = getMouse(0); + int x = event.tfinger.x * settings.display.width; + int y = event.tfinger.y * settings.display.height; + gui_set_mouse_position(x, y); + gui_set_mouse_button(0, false); + mouse->setAbsPos(x, y); + mouse->setButton(Mouse::LEFT_BUTTON, false); + } + break; } } } -void sdl_window_set_text(const char* text) -{ - if (window != nullptr) - SDL_SetWindowTitle(window, text); -} - static float hdpiScaling = 1.f; static inline void get_window_state() @@ -589,6 +687,18 @@ bool sdl_recreate_window(u32 flags) settings.display.width = windowPos.w * hdpiScaling; settings.display.height = windowPos.h * hdpiScaling; +#ifdef __linux__ + if (flags & SDL_WINDOW_RESIZABLE) + { + // The position passed to SDL_CreateWindow doesn't take decorations into account on linux. + // SDL_ShowWindow retrieves the border dimensions and SDL_SetWindowPosition uses them + // to correctly (re)position the window if needed. + // TODO a similar issue happens when switching back from fullscreen + SDL_ShowWindow(window); + SDL_SetWindowPosition(window, windowPos.x, windowPos.y); + } +#endif + #if !defined(GLES) && !defined(_WIN32) && !defined(__SWITCH__) && !defined(__APPLE__) // Set the window icon u32 pixels[48 * 48]; @@ -662,7 +772,6 @@ static int suspendEventFilter(void *userdata, SDL_Event *event) { if (event->type == SDL_APP_WILLENTERBACKGROUND) { - gui_save(); if (gameRunning) { try { @@ -689,7 +798,7 @@ void sdl_window_create() SDL_Vulkan_LoadLibrary("libvulkan.dylib"); #endif } - sqlDeinit.initialized = true; + sdlDeInit.initialized = true; initRenderApi(); // ImGui copy & paste ImGui::GetIO().GetClipboardTextFn = getClipboardText; @@ -737,3 +846,460 @@ void sdl_fix_steamdeck_dpi(SDL_Window *window) } #endif } + +static KeyboardLayout detectKeyboardLayout() +{ + SDL_Keycode key = SDL_GetKeyFromScancode(SDL_SCANCODE_Q); + if (key == SDLK_a) { + INFO_LOG(INPUT, "French keyboard detected"); + return KeyboardLayout::FR; + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_Y); + if (key == SDLK_z) + { + // GE or CH + key = SDL_GetKeyFromScancode(SDL_SCANCODE_MINUS); + if (key == '\'') { + // CH has no direct ss + INFO_LOG(INPUT, "Swiss keyboard detected"); + return KeyboardLayout::CH; + } + else { + INFO_LOG(INPUT, "German keyboard detected"); + return KeyboardLayout::GE; + } + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_SEMICOLON); + if (key == 0xf1) // n with tilde + { + // SP or LATAM + key = SDL_GetKeyFromScancode(SDL_SCANCODE_APOSTROPHE); + if (key == '{') { + INFO_LOG(INPUT, "Latam keyboard detected"); + return KeyboardLayout::LATAM; + } + else { + INFO_LOG(INPUT, "Spanish keyboard detected"); + return KeyboardLayout::SP; + } + } + if (key == 0xe7) // c with cedilla + { + // PT or BR + key = SDL_GetKeyFromScancode(SDL_SCANCODE_RIGHTBRACKET); + if (key == SDLK_LEFTBRACKET) + INFO_LOG(INPUT, "Portuguese (BR) keyboard detected"); + else + INFO_LOG(INPUT, "Portuguese keyboard detected"); + return KeyboardLayout::PT; + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_MINUS); + if (key == SDLK_PLUS) { + INFO_LOG(INPUT, "Swedish keyboard detected"); + return KeyboardLayout::SW; + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_RIGHTBRACKET); + if (key == SDLK_ASTERISK) { + // Not on MacOS + INFO_LOG(INPUT, "Dutch keyboard detected"); + return KeyboardLayout::NL; + } + if (key == SDLK_LEFTBRACKET) + { + key = SDL_GetKeyFromScancode(SDL_SCANCODE_SEMICOLON); + if (key == SDLK_SEMICOLON) { + // FIXME not working on MacOS + INFO_LOG(INPUT, "Japanese keyboard detected"); + return KeyboardLayout::JP; + } + } + if (key == SDLK_PLUS) + { + // IT + key = SDL_GetKeyFromScancode(SDL_SCANCODE_GRAVE); + if (key == SDLK_BACKSLASH) { + INFO_LOG(INPUT, "Italian keyboard detected"); + return KeyboardLayout::IT; + } + } + if (key == 0xe7) { // c with cedilla + // MacOS + INFO_LOG(INPUT, "FR_CA keyboard detected"); + return KeyboardLayout::FR_CA; + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_GRAVE); + if (key == SDLK_HASH) { + // linux + INFO_LOG(INPUT, "FR_CA keyboard detected"); + return KeyboardLayout::FR_CA; + } + key = SDL_GetKeyFromScancode(SDL_SCANCODE_BACKSLASH); + if (key == SDLK_HASH) { + // MacOS: regular British keyboard not detected, only British - PC + INFO_LOG(INPUT, "UK keyboard detected"); + return KeyboardLayout::UK; + } + // TODO CN, KO have no special keyboard layout + + INFO_LOG(INPUT, "Unknown or US keyboard"); + return KeyboardLayout::US; +} + +// All known card games use simple Code 39 barcodes. +// The barcode scanner should be configured to use HID-USB (act like a keyboard) +// and use '*' as preamble and terminator, which are the Code 39 start and stop characters. +// So disable the default terminator ('\n') and enable sending the Code 39 start and stop characters. +static bool handleBarcodeScanner(const SDL_Event& event) +{ + static const std::unordered_map keymapDefault { + { SDL_SCANCODE_SPACE, ' ' }, + { 0x100 | SDL_SCANCODE_B, 'B' }, + { 0x100 | SDL_SCANCODE_C, 'C' }, + { 0x100 | SDL_SCANCODE_D, 'D' }, + { 0x100 | SDL_SCANCODE_E, 'E' }, + { 0x100 | SDL_SCANCODE_F, 'F' }, + { 0x100 | SDL_SCANCODE_G, 'G' }, + { 0x100 | SDL_SCANCODE_H, 'H' }, + { 0x100 | SDL_SCANCODE_I, 'I' }, + { 0x100 | SDL_SCANCODE_J, 'J' }, + { 0x100 | SDL_SCANCODE_K, 'K' }, + { 0x100 | SDL_SCANCODE_L, 'L' }, + { 0x100 | SDL_SCANCODE_N, 'N' }, + { 0x100 | SDL_SCANCODE_O, 'O' }, + { 0x100 | SDL_SCANCODE_P, 'P' }, + { 0x100 | SDL_SCANCODE_R, 'R' }, + { 0x100 | SDL_SCANCODE_S, 'S' }, + { 0x100 | SDL_SCANCODE_T, 'T' }, + { 0x100 | SDL_SCANCODE_U, 'U' }, + { 0x100 | SDL_SCANCODE_V, 'V' }, + { 0x100 | SDL_SCANCODE_X, 'X' }, + }; + static const std::unordered_map keymapUS { + { 0x100 | SDL_SCANCODE_8, '*' }, + { SDL_SCANCODE_MINUS, '-' }, + { SDL_SCANCODE_PERIOD, '.' }, + { 0x100 | SDL_SCANCODE_4, '$' }, + { SDL_SCANCODE_SLASH, '/' }, + { 0x100 | SDL_SCANCODE_EQUALS, '+' }, + { 0x100 | SDL_SCANCODE_5, '%' }, + { 0x100 | SDL_SCANCODE_A, 'A' }, + { 0x100 | SDL_SCANCODE_M, 'M' }, + { 0x100 | SDL_SCANCODE_Q, 'Q' }, + { 0x100 | SDL_SCANCODE_W, 'W' }, + { 0x100 | SDL_SCANCODE_Y, 'Y' }, + { 0x100 | SDL_SCANCODE_Z, 'Z' }, + { SDL_SCANCODE_0, '0' }, + { SDL_SCANCODE_1, '1' }, + { SDL_SCANCODE_2, '2' }, + { SDL_SCANCODE_3, '3' }, + { SDL_SCANCODE_4, '4' }, + { SDL_SCANCODE_5, '5' }, + { SDL_SCANCODE_6, '6' }, + { SDL_SCANCODE_7, '7' }, + { SDL_SCANCODE_8, '8' }, + { SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map keymapFr { + { SDL_SCANCODE_BACKSLASH, '*' }, + { SDL_SCANCODE_6, '-' }, + { 0x100 | SDL_SCANCODE_COMMA, '.' }, + { 0x100 | SDL_SCANCODE_RIGHTBRACKET, '$' }, + { 0x100 | SDL_SCANCODE_PERIOD, '/' }, + { 0x100 | SDL_SCANCODE_EQUALS, '+' }, + { 0x100 | SDL_SCANCODE_APOSTROPHE, '%' }, + { 0x100 | SDL_SCANCODE_Q, 'A' }, + { 0x100 | SDL_SCANCODE_SEMICOLON, 'M' }, + { 0x100 | SDL_SCANCODE_A, 'Q' }, + { 0x100 | SDL_SCANCODE_Z, 'W' }, + { 0x100 | SDL_SCANCODE_Y, 'Y' }, + { 0x100 | SDL_SCANCODE_W, 'Z' }, + { 0x100 | SDL_SCANCODE_0, '0' }, + { 0x100 | SDL_SCANCODE_1, '1' }, + { 0x100 | SDL_SCANCODE_2, '2' }, + { 0x100 | SDL_SCANCODE_3, '3' }, + { 0x100 | SDL_SCANCODE_4, '4' }, + { 0x100 | SDL_SCANCODE_5, '5' }, + { 0x100 | SDL_SCANCODE_6, '6' }, + { 0x100 | SDL_SCANCODE_7, '7' }, + { 0x100 | SDL_SCANCODE_8, '8' }, + { 0x100 | SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map keymapGe { + { 0x100 | SDL_SCANCODE_RIGHTBRACKET, '*' }, + { SDL_SCANCODE_SLASH, '-' }, + { SDL_SCANCODE_PERIOD, '.' }, + { 0x100 | SDL_SCANCODE_4, '$' }, + { 0x100 | SDL_SCANCODE_7, '/' }, + { SDL_SCANCODE_RIGHTBRACKET, '+' }, + { 0x100 | SDL_SCANCODE_5, '%' }, + { 0x100 | SDL_SCANCODE_A, 'A' }, + { 0x100 | SDL_SCANCODE_M, 'M' }, + { 0x100 | SDL_SCANCODE_Q, 'Q' }, + { 0x100 | SDL_SCANCODE_W, 'W' }, + { 0x100 | SDL_SCANCODE_Z, 'Y' }, + { 0x100 | SDL_SCANCODE_Y, 'Z' }, + { SDL_SCANCODE_0, '0' }, + { SDL_SCANCODE_1, '1' }, + { SDL_SCANCODE_2, '2' }, + { SDL_SCANCODE_3, '3' }, + { SDL_SCANCODE_4, '4' }, + { SDL_SCANCODE_5, '5' }, + { SDL_SCANCODE_6, '6' }, + { SDL_SCANCODE_7, '7' }, + { SDL_SCANCODE_8, '8' }, + { SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map keymapItSp { + { 0x100 | SDL_SCANCODE_RIGHTBRACKET, '*' }, + { SDL_SCANCODE_SLASH, '-' }, + { SDL_SCANCODE_PERIOD, '.' }, + { 0x100 | SDL_SCANCODE_4, '$' }, + { 0x100 | SDL_SCANCODE_7, '/' }, + { SDL_SCANCODE_RIGHTBRACKET, '+' }, + { 0x100 | SDL_SCANCODE_5, '%' }, + { 0x100 | SDL_SCANCODE_A, 'A' }, + { 0x100 | SDL_SCANCODE_M, 'M' }, + { 0x100 | SDL_SCANCODE_Q, 'Q' }, + { 0x100 | SDL_SCANCODE_W, 'W' }, + { 0x100 | SDL_SCANCODE_Z, 'Z' }, + { 0x100 | SDL_SCANCODE_Y, 'Y' }, + { SDL_SCANCODE_0, '0' }, + { SDL_SCANCODE_1, '1' }, + { SDL_SCANCODE_2, '2' }, + { SDL_SCANCODE_3, '3' }, + { SDL_SCANCODE_4, '4' }, + { SDL_SCANCODE_5, '5' }, + { SDL_SCANCODE_6, '6' }, + { SDL_SCANCODE_7, '7' }, + { SDL_SCANCODE_8, '8' }, + { SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map keymapCH { + { 0x100 | SDL_SCANCODE_3, '*' }, + { SDL_SCANCODE_SLASH, '-' }, + { SDL_SCANCODE_PERIOD, '.' }, + { SDL_SCANCODE_BACKSLASH, '$' }, + { 0x100 | SDL_SCANCODE_7, '/' }, + { 0x100 | SDL_SCANCODE_1, '+' }, + { 0x100 | SDL_SCANCODE_5, '%' }, + { 0x100 | SDL_SCANCODE_A, 'A' }, + { 0x100 | SDL_SCANCODE_M, 'M' }, + { 0x100 | SDL_SCANCODE_Q, 'Q' }, + { 0x100 | SDL_SCANCODE_W, 'W' }, + { 0x100 | SDL_SCANCODE_Y, 'Z' }, + { 0x100 | SDL_SCANCODE_Z, 'Y' }, + { SDL_SCANCODE_0, '0' }, + { SDL_SCANCODE_1, '1' }, + { SDL_SCANCODE_2, '2' }, + { SDL_SCANCODE_3, '3' }, + { SDL_SCANCODE_4, '4' }, + { SDL_SCANCODE_5, '5' }, + { SDL_SCANCODE_6, '6' }, + { SDL_SCANCODE_7, '7' }, + { SDL_SCANCODE_8, '8' }, + { SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map keymapJp { + { 0x100 | SDL_SCANCODE_APOSTROPHE, '*' }, + { SDL_SCANCODE_MINUS, '-' }, + { SDL_SCANCODE_PERIOD, '.' }, + { 0x100 | SDL_SCANCODE_4, '$' }, + { SDL_SCANCODE_SLASH, '/' }, + { 0x100 | SDL_SCANCODE_SEMICOLON, '+' }, + { 0x100 | SDL_SCANCODE_5, '%' }, + { 0x100 | SDL_SCANCODE_A, 'A' }, + { 0x100 | SDL_SCANCODE_M, 'M' }, + { 0x100 | SDL_SCANCODE_Q, 'Q' }, + { 0x100 | SDL_SCANCODE_W, 'W' }, + { 0x100 | SDL_SCANCODE_Y, 'Y' }, + { 0x100 | SDL_SCANCODE_Z, 'Z' }, + { SDL_SCANCODE_0, '0' }, + { SDL_SCANCODE_1, '1' }, + { SDL_SCANCODE_2, '2' }, + { SDL_SCANCODE_3, '3' }, + { SDL_SCANCODE_4, '4' }, + { SDL_SCANCODE_5, '5' }, + { SDL_SCANCODE_6, '6' }, + { SDL_SCANCODE_7, '7' }, + { SDL_SCANCODE_8, '8' }, + { SDL_SCANCODE_9, '9' }, + }; + static const std::unordered_map* keymap; + + if (keymap == nullptr) + { + switch (settings.input.keyboardLangId) + { + case KeyboardLayout::FR: + keymap = &keymapFr; + break; + case KeyboardLayout::GE: + keymap = &keymapGe; + break; + case KeyboardLayout::CH: + keymap = &keymapCH; + break; + case KeyboardLayout::IT: + case KeyboardLayout::SP: + case KeyboardLayout::LATAM: + keymap = &keymapItSp; + break; + case KeyboardLayout::JP: + keymap = &keymapJp; + break; + case KeyboardLayout::US: + case KeyboardLayout::UK: + default: + keymap = &keymapUS; + break; + } + } + SDL_Scancode scancode = event.key.keysym.scancode; + if (scancode >= SDL_SCANCODE_LCTRL) + // Ignore modifier keys + return false; + u16 mod = event.key.keysym.mod; + if (mod & (KMOD_LALT | KMOD_CTRL | KMOD_GUI)) + // Ignore unused modifiers + return false; + + u16 k = 0; + if (mod & (KMOD_LSHIFT | KMOD_RSHIFT)) + k |= 0x100; + if ((mod & KMOD_CAPS) + && ((scancode >= SDL_SCANCODE_A && scancode <= SDL_SCANCODE_Z) + || settings.input.keyboardLangId == KeyboardLayout::FR + || settings.input.keyboardLangId == KeyboardLayout::GE + || settings.input.keyboardLangId == KeyboardLayout::CH)) + // FIXME all this depends on the OS so best not to use caps lock for now + k ^= 0x100; + if (mod & KMOD_RALT) + k |= 0x200; + k |= scancode & 0xff; + auto it = keymap->find(k); + if (it == keymap->end()) + { + it = keymapDefault.find(k); + if (it == keymapDefault.end()) + { + if (!barcode.empty()) + { + INFO_LOG(INPUT, "Unrecognized barcode scancode %d mod 0x%x", scancode, mod); + barcode.clear(); + } + return false; + } + } + u64 now = getTimeMs(); + if (!barcode.empty() && now - lastBarcodeTime >= 500) + { + INFO_LOG(INPUT, "Barcode timeout"); + barcode.clear(); + } + char c = it->second; + if (c == '*') + { + if (barcode.empty()) + { + DEBUG_LOG(INPUT, "Barcode start"); + barcode += '*'; + lastBarcodeTime = now; + } + else + { + card_reader::barcodeSetCard(barcode); + barcode.clear(); + card_reader::insertCard(0); + } + return true; + } + if (barcode.empty()) + return false; + barcode += c; + lastBarcodeTime = now; + + return true; +} + +static float torque; +static float springSat; +static float springSpeed; +static float damperParam; +static float damperSpeed; + +void sdl_setTorque(int port, float torque) +{ + ::torque = torque; + if (gameRunning) + SDLGamepad::SetTorque(port, torque); +} + +void sdl_setSpring(int port, float saturation, float speed) +{ + springSat = saturation; + springSpeed = speed; + SDLGamepad::SetSpring(port, saturation, speed); +} + +void sdl_setDamper(int port, float param, float speed) +{ + damperParam = param; + damperSpeed = speed; + SDLGamepad::SetDamper(port, param, speed); +} + +void sdl_stopHaptic(int port) +{ + torque = 0.f; + springSat = 0.f; + springSpeed = 0.f; + damperParam = 0.f; + damperSpeed = 0.f; + SDLGamepad::StopHaptic(port); +} + +void pauseHaptic() { + SDLGamepad::SetTorque(0, 0.f); +} + +void resumeHaptic() { + SDLGamepad::SetTorque(0, torque); +} + +#if 0 +#include "ui/gui_util.h" + +void sdl_displayHapticStats() +{ + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_WindowBorderSize, 0); + ImGui::SetNextWindowPos(ImVec2(10, 10)); + ImGui::SetNextWindowSize(ScaledVec2(120, 0)); + ImGui::SetNextWindowBgAlpha(0.7f); + ImGui::Begin("##ggpostats", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoInputs); + ImguiStyleColor _2(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); + + ImGui::Text("Torque"); + char s[32]; + snprintf(s, sizeof(s), "%.1f", torque); + ImGui::ProgressBar(0.5f + torque / 2.f, ImVec2(-1, 0), s); + + ImGui::Text("Spring Sat"); + snprintf(s, sizeof(s), "%.1f", springSat); + ImGui::ProgressBar(springSat, ImVec2(-1, 0), s); + + ImGui::Text("Spring Speed"); + snprintf(s, sizeof(s), "%.1f", springSpeed); + ImGui::ProgressBar(springSpeed, ImVec2(-1, 0), s); + + ImGui::Text("Damper Param"); + snprintf(s, sizeof(s), "%.1f", damperParam); + ImGui::ProgressBar(damperParam, ImVec2(-1, 0), s); + + ImGui::Text("Damper Speed"); + snprintf(s, sizeof(s), "%.1f", damperSpeed); + ImGui::ProgressBar(damperSpeed, ImVec2(-1, 0), s); + + ImGui::End(); +} +#endif diff --git a/core/sdl/sdl.h b/core/sdl/sdl.h index a79f85f22..c60d083f2 100644 --- a/core/sdl/sdl.h +++ b/core/sdl/sdl.h @@ -6,7 +6,6 @@ void input_sdl_init(); void input_sdl_handle(); void input_sdl_quit(); void sdl_window_create(); -void sdl_window_set_text(const char* text); void sdl_window_destroy(); bool sdl_recreate_window(u32 flags); void sdl_fix_steamdeck_dpi(SDL_Window *window); diff --git a/core/sdl/sdl_gamepad.h b/core/sdl/sdl_gamepad.h index a5fb64386..d9820e5e4 100644 --- a/core/sdl/sdl_gamepad.h +++ b/core/sdl/sdl_gamepad.h @@ -1,6 +1,7 @@ +#pragma once #include "input/gamepad_device.h" #include "input/mouse.h" -#include "oslib/oslib.h" +#include "stdclass.h" #include "sdl.h" template @@ -175,7 +176,7 @@ class SDLGamepad : public GamepadDevice _name = joyName; sdl_joystick_instance = SDL_JoystickInstanceID(sdl_joystick); _unique_id = "sdl_joystick_" + std::to_string(sdl_joystick_instance); - INFO_LOG(INPUT, "SDL: Opened joystick %d on port %d: '%s' unique_id=%s", sdl_joystick_instance, maple_port, _name.c_str(), _unique_id.c_str()); + NOTICE_LOG(INPUT, "SDL: Opened joystick %d on port %d: '%s' unique_id=%s", sdl_joystick_instance, maple_port, _name.c_str(), _unique_id.c_str()); if (SDL_IsGameController(joystick_idx)) { @@ -200,11 +201,93 @@ class SDLGamepad : public GamepadDevice else INFO_LOG(INPUT, "using custom mapping '%s'", input_mapper->name.c_str()); + hasAnalogStick = SDL_JoystickNumAxes(sdl_joystick) > 0; + set_maple_port(maple_port); + #if SDL_VERSION_ATLEAST(2, 0, 18) rumbleEnabled = SDL_JoystickHasRumble(sdl_joystick); #else rumbleEnabled = (SDL_JoystickRumble(sdl_joystick, 1, 1, 1) != -1); #endif + + // Open the haptic interface + haptic = SDL_HapticOpenFromJoystick(sdl_joystick); + if (haptic != nullptr) + { + // Query supported haptic effects for force-feedback + u32 hapq = SDL_HapticQuery(haptic); + INFO_LOG(INPUT, "SDL_HapticQuery: supported: %x", hapq); + if ((hapq & SDL_HAPTIC_SINE) != 0 && SDL_JoystickGetType(sdl_joystick) == SDL_JOYSTICK_TYPE_WHEEL) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_SINE; + effect.periodic.direction.type = SDL_HAPTIC_CARTESIAN; + effect.periodic.direction.dir[0] = -1; // west + effect.periodic.period = 40; // 25 Hz + effect.periodic.magnitude = 0x7fff; + effect.periodic.length = SDL_HAPTIC_INFINITY; + sineEffectId = SDL_HapticNewEffect(haptic, &effect); + if (sineEffectId != -1) + { + rumbleEnabled = true; + hapticRumble = true; + NOTICE_LOG(INPUT, "wheel %d: haptic sine supported", sdl_joystick_instance); + } + } + if (hapq & SDL_HAPTIC_AUTOCENTER) + { + SDL_HapticSetAutocenter(haptic, 0); + hasAutocenter = true; + NOTICE_LOG(INPUT, "wheel %d: haptic autocenter supported", sdl_joystick_instance); + } + if (hapq & SDL_HAPTIC_GAIN) + SDL_HapticSetGain(haptic, 100); + if (hapq & SDL_HAPTIC_CONSTANT) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_CONSTANT; + effect.constant.direction.type = SDL_HAPTIC_CARTESIAN; + effect.constant.direction.dir[0] = -1; // west, updated when used + effect.constant.length = SDL_HAPTIC_INFINITY; + effect.constant.delay = 0; + effect.constant.level = 0; // updated when used + constEffectId = SDL_HapticNewEffect(haptic, &effect); + if (constEffectId != -1) + NOTICE_LOG(INPUT, "wheel %d: haptic constant supported", sdl_joystick_instance); + } + if (hapq & SDL_HAPTIC_SPRING) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_SPRING; + effect.condition.length = SDL_HAPTIC_INFINITY; + effect.condition.direction.type = SDL_HAPTIC_CARTESIAN; // not used but required! + // effect level at full deflection + effect.condition.left_sat[0] = effect.condition.right_sat[0] = 0xffff; + // how fast to increase the force + effect.condition.left_coeff[0] = effect.condition.right_coeff[0] = 0x7fff; + springEffectId = SDL_HapticNewEffect(haptic, &effect); + if (springEffectId != -1) + NOTICE_LOG(INPUT, "wheel %d: haptic spring supported", sdl_joystick_instance); + } + if (hapq & SDL_HAPTIC_DAMPER) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_DAMPER; + effect.condition.length = SDL_HAPTIC_INFINITY; + effect.condition.direction.type = SDL_HAPTIC_CARTESIAN; // not used but required! + // max effect level + effect.condition.left_sat[0] = effect.condition.right_sat[0] = 0xffff; + // how fast to increase the force + effect.condition.left_coeff[0] = effect.condition.right_coeff[0] = 0x7fff; + damperEffectId = SDL_HapticNewEffect(haptic, &effect); + if (damperEffectId != -1) + NOTICE_LOG(INPUT, "wheel %d: haptic damper supported", sdl_joystick_instance); + } + if (sineEffectId == -1 && constEffectId == -1 && damperEffectId == -1 && springEffectId == -1 && !hasAutocenter) { + SDL_HapticClose(haptic); + haptic = nullptr; + } + } } bool gamepad_axis_input(u32 code, int value) override @@ -214,8 +297,43 @@ class SDLGamepad : public GamepadDevice return GamepadDevice::gamepad_axis_input(code, value); } - u16 getRumbleIntensity(float power) { - return (u16)std::min(power * 65535.f / std::pow(1.06f, 100.f - rumblePower), 65535.f); + void set_maple_port(int port) override + { + GamepadDevice::set_maple_port(port); + SDL_JoystickSetPlayerIndex(sdl_joystick, port <= 3 ? port : -1); + } + + u16 getRumbleIntensity(float power) + { + if (rumblePower == 0) + return 0; + else + return (u16)std::min(power * 65535.f / std::pow(1.06f, 100.f - rumblePower), 65535.f); + } + void doRumble(float power, u32 duration_ms) + { + const u16 intensity = getRumbleIntensity(power); + if (hapticRumble) + { + if (intensity != 0 && duration_ms != 0) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_SINE; + effect.periodic.direction.type = SDL_HAPTIC_CARTESIAN; + effect.periodic.direction.dir[0] = (vib_stop_time & 1) ? -1 : 1; // west or east randomly + effect.periodic.period = 40; // 25 Hz + effect.periodic.magnitude = intensity / 4; // scale by an additional 0.5 to soften it + effect.periodic.length = duration_ms; + SDL_HapticUpdateEffect(haptic, sineEffectId, &effect); + SDL_HapticRunEffect(haptic, sineEffectId, 1); + } + else { + SDL_HapticStopEffect(haptic, sineEffectId); + } + } + else { + SDL_JoystickRumble(sdl_joystick, intensity, intensity, duration_ms); + } } void rumble(float power, float inclination, u32 duration_ms) override @@ -223,10 +341,8 @@ class SDLGamepad : public GamepadDevice if (rumbleEnabled) { vib_inclination = inclination * power; - vib_stop_time = os_GetSeconds() + duration_ms / 1000.0; - - u16 intensity = getRumbleIntensity(power); - SDL_JoystickRumble(sdl_joystick, intensity, intensity, duration_ms); + vib_stop_time = getTimeMs() + duration_ms; + doRumble(power, duration_ms); } } void update_rumble() override @@ -235,20 +351,141 @@ class SDLGamepad : public GamepadDevice return; if (vib_inclination > 0) { - int rem_time = (vib_stop_time - os_GetSeconds()) * 1000; + int rem_time = vib_stop_time - getTimeMs(); if (rem_time <= 0) + { vib_inclination = 0; - else + if (hapticRumble) + SDL_HapticStopEffect(haptic, sineEffectId); + else + SDL_JoystickRumble(sdl_joystick, 0, 0, 0); + } + else { + doRumble(vib_inclination * rem_time, rem_time); + } + } + } + + void setTorque(float torque) + { + if (haptic == nullptr || constEffectId == -1) + return; + if (torque != 0.f && rumblePower != 0) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_CONSTANT; + effect.constant.direction.type = SDL_HAPTIC_CARTESIAN; + effect.constant.direction.dir[0] = torque < 0 ? -1 : 1; // west/cw if torque < 0 + effect.constant.length = SDL_HAPTIC_INFINITY; + effect.constant.level = std::abs(torque) * 32767.f * rumblePower / 100.f; + SDL_HapticUpdateEffect(haptic, constEffectId, &effect); + SDL_HapticRunEffect(haptic, constEffectId, 1); + } + else { + SDL_HapticStopEffect(haptic, constEffectId); + } + } + + void stopHaptic() + { + if (haptic != nullptr) + { + SDL_HapticStopAll(haptic); + if (hasAutocenter) + SDL_HapticSetAutocenter(haptic, 0); + vib_inclination = 0; + } + if (!hapticRumble) + rumble(0, 0, 0); + } + + void setSpring(float saturation, float speed) + { + if (haptic == nullptr) + return; + if (springEffectId == -1) + { + // Spring not supported so use autocenter if available + if (hasAutocenter) { - u16 intensity = getRumbleIntensity(vib_inclination * rem_time); - SDL_JoystickRumble(sdl_joystick, intensity, intensity, rem_time); + if (speed != 0.f) + SDL_HapticSetAutocenter(haptic, saturation * rumblePower); + else + SDL_HapticSetAutocenter(haptic, 0); } } + else + { + if (saturation != 0.f && speed != 0.f && rumblePower != 0) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_SPRING; + effect.condition.length = SDL_HAPTIC_INFINITY; + effect.condition.direction.type = SDL_HAPTIC_CARTESIAN; + // effect level at full deflection + effect.condition.left_sat[0] = effect.condition.right_sat[0] = (saturation * rumblePower / 100.f) * 0xffff; + // how fast to increase the force + effect.condition.left_coeff[0] = effect.condition.right_coeff[0] = speed * 0x7fff; + SDL_HapticUpdateEffect(haptic, springEffectId, &effect); + SDL_HapticRunEffect(haptic, springEffectId, 1); + } + else { + SDL_HapticStopEffect(haptic, springEffectId); + } + } + } + + void setDamper(float param, float speed) + { + if (haptic == nullptr || damperEffectId == -1) + return; + if (param != 0.f && speed != 0.f && rumblePower != 0) + { + SDL_HapticEffect effect{}; + effect.type = SDL_HAPTIC_DAMPER; + effect.condition.length = SDL_HAPTIC_INFINITY; + effect.condition.direction.type = SDL_HAPTIC_CARTESIAN; + // max effect level + effect.condition.left_sat[0] = effect.condition.right_sat[0] = (param * rumblePower / 100.f) * 0xffff; + // how fast to increase the force + effect.condition.left_coeff[0] = effect.condition.right_coeff[0] = speed * 0x7fff; + SDL_HapticUpdateEffect(haptic, damperEffectId, &effect); + SDL_HapticRunEffect(haptic, damperEffectId, 1); + } + else { + SDL_HapticStopEffect(haptic, damperEffectId); + } } void close() { - INFO_LOG(INPUT, "SDL: Joystick '%s' on port %d disconnected", _name.c_str(), maple_port()); + NOTICE_LOG(INPUT, "SDL: Joystick '%s' on port %d disconnected", _name.c_str(), maple_port()); + if (haptic != nullptr) + { + stopHaptic(); + SDL_HapticSetGain(haptic, 0); + if (sineEffectId != -1) { + SDL_HapticDestroyEffect(haptic, sineEffectId); + sineEffectId = -1; + } + if (constEffectId != -1) { + SDL_HapticDestroyEffect(haptic, constEffectId); + constEffectId = -1; + } + if (springEffectId != -1) { + SDL_HapticDestroyEffect(haptic, springEffectId); + springEffectId = -1; + } + if (damperEffectId != -1) { + SDL_HapticDestroyEffect(haptic, damperEffectId); + damperEffectId = -1; + } + SDL_HapticClose(haptic); + haptic = nullptr; + rumbleEnabled = false; + hapticRumble = false; + hasAutocenter = false; + } if (sdl_controller != nullptr) SDL_GameControllerClose(sdl_controller); SDL_JoystickClose(sdl_joystick); @@ -401,30 +638,62 @@ class SDLGamepad : public GamepadDevice while (!sdl_gamepads.empty()) sdl_gamepads.begin()->second->close(); } - static void UpdateRumble() + static void UpdateRumble() { + for (auto &[k, gamepad] : sdl_gamepads) + gamepad->update_rumble(); + } + + template + static void applyToPort(int port, Func func, Args&&... args) { - for (auto& pair : sdl_gamepads) - pair.second->update_rumble(); + for (auto &[k, gamepad] : sdl_gamepads) + if (gamepad->maple_port() == port) + ((*gamepad).*func)(std::forward(args)...); + } + static void SetTorque(int port, float torque) { + applyToPort(port, &SDLGamepad::setTorque, torque); + } + static void SetSpring(int port, float saturation, float speed) { + applyToPort(port, &SDLGamepad::setSpring, saturation, speed); + } + static void SetDamper(int port, float param, float speed) { + applyToPort(port, &SDLGamepad::setDamper, param, speed); + } + static void StopHaptic(int port) { + applyToPort(port, &SDLGamepad::stopHaptic); } +protected: + u64 vib_stop_time = 0; + SDL_JoystickID sdl_joystick_instance; + private: SDL_Joystick* sdl_joystick; - SDL_JoystickID sdl_joystick_instance; float vib_inclination = 0; - double vib_stop_time = 0; SDL_GameController *sdl_controller = nullptr; static std::map> sdl_gamepads; + SDL_Haptic *haptic = nullptr; + bool hapticRumble = false; + bool hasAutocenter = false; + int sineEffectId = -1; + int constEffectId = -1; + int springEffectId = -1; + int damperEffectId = -1; }; -std::map> SDLGamepad::sdl_gamepads; - class SDLMouse : public Mouse { public: - SDLMouse() : Mouse("SDL") + SDLMouse(u64 mouseId) : Mouse("SDL") { - this->_name = "Default Mouse"; - this->_unique_id = "sdl_mouse"; + if (mouseId == 0) { + this->_name = "Default Mouse"; + this->_unique_id = "sdl_mouse"; + } + else { + this->_name = "Mouse " + std::to_string(mouseId); + this->_unique_id = "sdl_mouse_" + std::to_string(mouseId); + } loadMapping(); } diff --git a/core/sdl/sdl_keyboard.h b/core/sdl/sdl_keyboard.h index b524ef563..8455acd6b 100644 --- a/core/sdl/sdl_keyboard.h +++ b/core/sdl/sdl_keyboard.h @@ -2,25 +2,6 @@ #include "input/keyboard_device.h" #include "sdl.h" -#ifdef __APPLE__ -#include -#include -#include -// Rumbling Taptic Engine by Private MultitouchSupport.framework -extern "C" { -typedef void *MTDeviceRef; -bool MTDeviceIsAvailable(void); -MTDeviceRef MTDeviceCreateDefault(void); -OSStatus MTDeviceGetDeviceID(MTDeviceRef, uint64_t*) __attribute__ ((weak_import)); -CFTypeRef MTActuatorCreateFromDeviceID(UInt64 deviceID); -IOReturn MTActuatorOpen(CFTypeRef actuatorRef); -IOReturn MTActuatorClose(CFTypeRef actuatorRef); -IOReturn MTActuatorActuate(CFTypeRef actuatorRef, SInt32 actuationID, UInt32 unknown1, Float32 unknown2, Float32 unknown3); -bool MTActuatorIsOpen(CFTypeRef actuatorRef); -enum ActuatePattern { minimal = 3, weak = 5, medium = 4, strong = 6 }; -} -#endif - class SDLKeyboardDevice : public KeyboardDevice { public: @@ -54,12 +35,6 @@ class SDLKeyboardDevice : public KeyboardDevice } else input_mapper = getDefaultMapping(); - -#ifdef __APPLE__ - uint64_t deviceID; - if ( MTDeviceIsAvailable() && MTDeviceGetDeviceID(MTDeviceCreateDefault(), &deviceID) == 0 && (vib_device = MTActuatorCreateFromDeviceID(deviceID)) != NULL && MTActuatorOpen(vib_device) == kIOReturnSuccess) - rumbleEnabled = true; -#endif } const char *get_button_name(u32 code) override @@ -70,59 +45,6 @@ class SDLKeyboardDevice : public KeyboardDevice return name; } -#ifdef __APPLE__ - void rumble(float power, float inclination, u32 duration_ms) override - { - if (rumbleEnabled) - { - vib_stop_time = os_GetSeconds() + duration_ms / 1000.0; - - __block int pattern; - if (power >= 0.75) - pattern = ActuatePattern::strong; - else if (power >= 0.5) - pattern = ActuatePattern::medium; - else if (power >= 0.25) - pattern = ActuatePattern::weak; - else if (power > 0) - pattern = ActuatePattern::minimal; - else - { - while(!vib_timer_stack.empty()) - { - dispatch_source_cancel(vib_timer_stack.top()); - vib_timer_stack.pop(); - } - return; - } - // Since the Actuator API does not support duration - // using a interval timer with `10ms * rumblePower percentage` to fake it - __block dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); - vib_timer_stack.push(_timer); - dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 10 * NSEC_PER_MSEC * rumblePower / 100.f, 0); - - dispatch_source_set_event_handler(_timer, ^{ - if ( vib_stop_time - os_GetSeconds() < 0 ) - { - dispatch_source_cancel(_timer); - return; - } - MTActuatorActuate(vib_device, pattern, 0, 0.0, 0.0); - }); - - dispatch_resume(_timer); - } - } - - ~SDLKeyboardDevice() { - if (rumbleEnabled) - { - MTActuatorClose(vib_device); - CFRelease(vib_device); - } - } -#endif - void input(SDL_Scancode scancode, bool pressed) { u8 keycode; @@ -132,11 +54,4 @@ class SDLKeyboardDevice : public KeyboardDevice keycode = (u8)scancode; KeyboardDevice::input(keycode, pressed, 0); } - -#ifdef __APPLE__ -private: - std::stack vib_timer_stack; - CFTypeRef vib_device = NULL; - double vib_stop_time = 0; -#endif }; diff --git a/core/sdl/sdl_keyboard_mac.h b/core/sdl/sdl_keyboard_mac.h new file mode 100644 index 000000000..732f8e8b0 --- /dev/null +++ b/core/sdl/sdl_keyboard_mac.h @@ -0,0 +1,112 @@ +/* + Copyright 2022 edw + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#ifdef __APPLE__ +#include "sdl_keyboard.h" +#include "stdclass.h" +#include +#include +#include + +// Rumbling Taptic Engine by Private MultitouchSupport.framework +extern "C" { +typedef void *MTDeviceRef; +bool MTDeviceIsAvailable(void); +MTDeviceRef MTDeviceCreateDefault(void); +OSStatus MTDeviceGetDeviceID(MTDeviceRef, uint64_t*) __attribute__ ((weak_import)); +CFTypeRef MTActuatorCreateFromDeviceID(UInt64 deviceID); +IOReturn MTActuatorOpen(CFTypeRef actuatorRef); +IOReturn MTActuatorClose(CFTypeRef actuatorRef); +IOReturn MTActuatorActuate(CFTypeRef actuatorRef, SInt32 actuationID, UInt32 unknown1, Float32 unknown2, Float32 unknown3); +bool MTActuatorIsOpen(CFTypeRef actuatorRef); +enum ActuatePattern { minimal = 3, weak = 5, medium = 4, strong = 6 }; +} + +class SDLMacKeyboard : public SDLKeyboardDevice +{ +public: + SDLMacKeyboard(int maple_port) : SDLKeyboardDevice(maple_port) + { + uint64_t deviceID; + if (MTDeviceIsAvailable() + && MTDeviceGetDeviceID(MTDeviceCreateDefault(), &deviceID) == 0 + && (vib_device = MTActuatorCreateFromDeviceID(deviceID)) != NULL + && MTActuatorOpen(vib_device) == kIOReturnSuccess) + rumbleEnabled = true; + } + + void rumble(float power, float inclination, u32 duration_ms) override + { + if (!rumbleEnabled) + return; + + vib_stop_time = getTimeMs() + duration_ms; + + __block int pattern; + if (power >= 0.75) + pattern = ActuatePattern::strong; + else if (power >= 0.5) + pattern = ActuatePattern::medium; + else if (power >= 0.25) + pattern = ActuatePattern::weak; + else if (power > 0) + pattern = ActuatePattern::minimal; + else + { + while(!vib_timer_stack.empty()) + { + dispatch_source_cancel(vib_timer_stack.top()); + vib_timer_stack.pop(); + } + return; + } + // Since the Actuator API does not support duration + // using a interval timer with `10ms * rumblePower percentage` to fake it + __block dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); + vib_timer_stack.push(_timer); + dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 10 * NSEC_PER_MSEC * rumblePower / 100.f, 0); + + dispatch_source_set_event_handler(_timer, ^{ + if (vib_stop_time < getTimeMs()) + { + dispatch_source_cancel(_timer); + return; + } + MTActuatorActuate(vib_device, pattern, 0, 0.0, 0.0); + }); + + dispatch_resume(_timer); + } + + ~SDLMacKeyboard() + { + if (rumbleEnabled) + { + MTActuatorClose(vib_device); + CFRelease(vib_device); + } + } + +private: + std::stack vib_timer_stack; + CFTypeRef vib_device = NULL; + u64 vib_stop_time = 0; +}; + +#endif // _APPLE_ diff --git a/core/serialize.cpp b/core/serialize.cpp index 610dd5f32..74912657c 100644 --- a/core/serialize.cpp +++ b/core/serialize.cpp @@ -10,15 +10,13 @@ #include "hw/pvr/pvr.h" #include "hw/sh4/sh4_sched.h" #include "hw/sh4/sh4_mmr.h" -#include "reios/gdrom_hle.h" +#include "reios/reios.h" #include "hw/naomi/naomi.h" #include "hw/naomi/naomi_cart.h" #include "hw/bba/bba.h" #include "cfg/option.h" - -//./core/imgread/common.o -extern u32 NullDriveDiscType; -extern u8 q_subchannel[96]; +#include "imgread/common.h" +#include "achievements/achievements.h" void dc_serialize(Serializer& ser) { @@ -43,8 +41,7 @@ void dc_serialize(Serializer& ser) sh4::serialize2(ser); - ser << NullDriveDiscType; - ser << q_subchannel; + libGDR_serialize(ser); naomi_Serialize(ser); @@ -53,68 +50,14 @@ void dc_serialize(Serializer& ser) ser << config::Region.get(); naomi_cart_serialize(ser); - gd_hle_state.Serialize(ser); + reios_serialize(ser); + achievements::serialize(ser); DEBUG_LOG(SAVESTATE, "Saved %d bytes", (u32)ser.size()); } -static void dc_deserialize_libretro(Deserializer& deser) -{ - aica::deserialize(deser); - - sb_deserialize(deser); - - nvmem::deserialize(deser); - - gdrom::deserialize(deser); - - mcfg_DeserializeDevices(deser); - - pvr::deserialize(deser); - - sh4::deserialize(deser); - - if (deser.version() >= Deserializer::V13_LIBRETRO) - deser.skip(); // settings.network.EmulateBBA - config::EmulateBBA.override(false); - - ModemDeserialize(deser); - - sh4::deserialize2(deser); - - deser >> NullDriveDiscType; - deser >> q_subchannel; - - deser.skip(); // FLASH_SIZE - deser.skip(); // BBSRAM_SIZE - deser.skip(); // BIOS_SIZE - deser.skip(); // RAM_SIZE - deser.skip(); // ARAM_SIZE - deser.skip(); // VRAM_SIZE - deser.skip(); // RAM_MASK - deser.skip(); // ARAM_MASK - deser.skip(); // VRAM_MASK - - naomi_Deserialize(deser); - - deser >> config::Broadcast.get(); - deser >> config::Cable.get(); - deser >> config::Region.get(); - - naomi_cart_deserialize(deser); - gd_hle_state.Deserialize(deser); - - DEBUG_LOG(SAVESTATE, "Loaded %d bytes (libretro compat)", (u32)deser.size()); -} - void dc_deserialize(Deserializer& deser) { - if (deser.version() >= Deserializer::V9_LIBRETRO && deser.version() <= Deserializer::VLAST_LIBRETRO) - { - dc_deserialize_libretro(deser); - sh4_sched_ffts(); - return; - } DEBUG_LOG(SAVESTATE, "Loading state version %d", deser.version()); aica::deserialize(deser); @@ -131,31 +74,84 @@ void dc_deserialize(Deserializer& deser) sh4::deserialize(deser); - if (deser.version() >= Deserializer::V13) - deser >> config::EmulateBBA.get(); - else - config::EmulateBBA.override(false); + deser >> config::EmulateBBA.get(); if (config::EmulateBBA) bba_Deserialize(deser); ModemDeserialize(deser); sh4::deserialize2(deser); - deser >> NullDriveDiscType; - deser >> q_subchannel; + libGDR_deserialize(deser); naomi_Deserialize(deser); deser >> config::Broadcast.get(); - verify(config::Broadcast <= 4); + verify(config::Broadcast >= 0 && config::Broadcast <= 4); deser >> config::Cable.get(); - verify(config::Cable <= 3); + verify(config::Cable >= 0 && config::Cable <= 3); deser >> config::Region.get(); - verify(config::Region <= 3); + verify(config::Region >= 0 && config::Region <= 3); naomi_cart_deserialize(deser); - gd_hle_state.Deserialize(deser); + reios_deserialize(deser); + achievements::deserialize(deser); sh4_sched_ffts(); DEBUG_LOG(SAVESTATE, "Loaded %d bytes", (u32)deser.size()); } + +Deserializer::Deserializer(const void *data, size_t limit, bool rollback) + : SerializeBase(limit, rollback), data((const u8 *)data) +{ + if (!memcmp(data, "RASTATE\001", 8)) + { + // RetroArch savestates now have several sections: MEM, ACHV, RPLY, etc. + const u8 *p = this->data + 8; + limit -= 8; + while (limit > 8) + { + const u8 *section = p; + u32 sectionSize = *(const u32 *)&p[4]; + p += 8; + limit -= 8; + if (!memcmp(section, "MEM ", 4)) + { + // That's the part we're interested in + this->data = p; + this->limit = sectionSize; + break; + } + sectionSize = (sectionSize + 7) & ~7; // align to 8 bytes + if (limit < sectionSize) { + limit = 0; + break; + } + p += sectionSize; + limit -= sectionSize; + } + if (limit <= 8) + throw Exception("Can't find MEM section in RetroArch savestate"); + } + deserialize(_version); + if (_version < V16) + throw Exception("Unsupported version"); + if (_version > Current) + throw Exception("Version too recent"); + + if(_version >= V42 && settings.platform.isConsole()) + { + u32 ramSize; + deserialize(ramSize); + if (ramSize != settings.platform.ram_size) + throw Exception("Selected RAM Size doesn't match Save State"); + } +} + +Serializer::Serializer(void *data, size_t limit, bool rollback) + : SerializeBase(limit, rollback), data((u8 *)data) +{ + Version v = Current; + serialize(v); + if (settings.platform.isConsole()) + serialize(settings.platform.ram_size); +} diff --git a/core/serialize.h b/core/serialize.h index 137812805..7a6cb2895 100644 --- a/core/serialize.h +++ b/core/serialize.h @@ -26,22 +26,7 @@ class SerializeBase { public: enum Version : int32_t { - V9_LIBRETRO = 8, - V10_LIBRETRO, - V11_LIBRETRO, - V12_LIBRETRO, - V13_LIBRETRO, - VLAST_LIBRETRO = V13_LIBRETRO, - - V8 = 803, - V9, - V10, - V11, - V12, - V13, - V14, - V15, - V16, + V16 = 811, V17, V18, V19, @@ -63,7 +48,24 @@ class SerializeBase V35, V36, V37, - Current = V37, + V38, + V39, + V40, + V41, + V42, + V43, + V44, + V45, + V46, + V47, + V48, + V49, + V50, + V51, + V52, + V53, + V54, + Current = V54, Next = Current + 1, }; @@ -89,15 +91,7 @@ class Deserializer : public SerializeBase Exception(const char *msg) : std::runtime_error(msg) {} }; - Deserializer(const void *data, size_t limit, bool rollback = false) - : SerializeBase(limit, rollback), data((const u8 *)data) - { - deserialize(_version); - if (_version < V9_LIBRETRO || (_version > V13_LIBRETRO && _version < V8)) - throw Exception("Unsupported version"); - if (_version > Current) - throw Exception("Version too recent"); - } + Deserializer(const void *data, size_t limit, bool rollback = false); template void deserialize(T& obj) @@ -153,12 +147,7 @@ class Serializer : public SerializeBase Serializer() : Serializer(nullptr, std::numeric_limits::max(), false) {} - Serializer(void *data, size_t limit, bool rollback = false) - : SerializeBase(limit, rollback), data((u8 *)data) - { - Version v = Current; - serialize(v); - } + Serializer(void *data, size_t limit, bool rollback = false); template void serialize(const T& obj) diff --git a/core/stdclass.cpp b/core/stdclass.cpp index c3f419482..342ff90f3 100644 --- a/core/stdclass.cpp +++ b/core/stdclass.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #ifdef _WIN32 #include @@ -20,6 +21,8 @@ static std::string user_data_dir; static std::vector system_config_dirs; static std::vector system_data_dirs; +const std::string defaultWs(" \0", 2); + bool file_exists(const std::string& filename) { return (flycast::access(filename.c_str(), R_OK) == 0); @@ -91,11 +94,11 @@ std::string get_readonly_data_path(const std::string& filename) return filepath; } // Try the game directory - std::string parent = hostfs::storage().getParentPath(settings.content.path); try { + std::string parent = hostfs::storage().getParentPath(settings.content.path); std::string filepath = hostfs::storage().getSubPath(parent, filename); - hostfs::FileInfo info = hostfs::storage().getFileInfo(filepath); - return info.path; + if (hostfs::storage().exists(filepath)) + return filepath; } catch (const FlycastException&) { } // Not found, so we return the user variant @@ -128,7 +131,10 @@ bool make_directory(const std::string& path) void cThread::Start() { verify(!thread.joinable()); - thread = std::thread(entry, param); + thread = std::thread([this]() { + ThreadName _(name); + entry(param); + }); } void cThread::WaitToEnd() @@ -206,3 +212,29 @@ void RamRegion::free() freeAligned(data); data = nullptr; } + +u64 getTimeMs() +{ + using the_clock = std::chrono::steady_clock; + std::chrono::time_point now = the_clock::now(); + static std::chrono::time_point start = now; + + return std::chrono::duration_cast(now - start).count(); +} + +#ifdef _WIN32 +static struct tm *localtime_r(const time_t *_clock, struct tm *_result) +{ + return localtime_s(_result, _clock) ? nullptr : _result; +} +#endif + +std::string timeToISO8601(time_t time) +{ + tm t; + if (localtime_r(&time, &t) == nullptr) + return {}; + std::string s(32, '\0'); + s.resize(snprintf(s.data(), 32, "%04d/%02d/%02d %02d:%02d:%02d", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)); + return s; +} diff --git a/core/stdclass.h b/core/stdclass.h index 1373c04a7..5a3cad09e 100644 --- a/core/stdclass.h +++ b/core/stdclass.h @@ -9,13 +9,16 @@ #include #include #include +#include +#include +#include #ifdef __ANDROID__ #include #undef PAGE_MASK #elif defined(__APPLE__) && defined(__aarch64__) #define PAGE_SIZE 16384 -#else +#elif !defined(PAGE_SIZE) #define PAGE_SIZE 4096 #endif #ifndef PAGE_MASK @@ -28,12 +31,13 @@ class cThread typedef void* ThreadEntryFP(void* param); ThreadEntryFP* entry; void* param; + const char *name; public: std::thread thread; - cThread(ThreadEntryFP* function, void* param) - :entry(function), param(param) {} + cThread(ThreadEntryFP* function, void* param, const char *name) + :entry(function), param(param), name(name) {} ~cThread() { WaitToEnd(); } void Start(); void WaitToEnd(); @@ -106,6 +110,11 @@ static inline void string_tolower(std::string& s) std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c){ return std::tolower(c); }); } +static inline void string_toupper(std::string& s) +{ + std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c){ return std::toupper(c); }); +} + static inline std::string get_file_extension(const std::string& s) { size_t dot = s.find_last_of('.'); @@ -124,8 +133,10 @@ static inline std::string get_file_basename(const std::string& s) return s.substr(0, dot); } +extern const std::string defaultWs; + static inline std::string trim_trailing_ws(const std::string& str, - const std::string& whitespace = " ") + const std::string& whitespace = defaultWs) { const auto strEnd = str.find_last_not_of(whitespace); if (strEnd == std::string::npos) @@ -135,7 +146,7 @@ static inline std::string trim_trailing_ws(const std::string& str, } static inline std::string trim_ws(const std::string& str, - const std::string& whitespace = " ") + const std::string& whitespace = defaultWs) { const auto strStart = str.find_first_not_of(whitespace); if (strStart == std::string::npos) @@ -189,3 +200,42 @@ class MD5Sum return v; } }; + +u64 getTimeMs(); +std::string timeToISO8601(time_t time); + +class ThreadRunner +{ +public: + void init() { + threadId = std::this_thread::get_id(); + } + void runOnThread(std::function func) + { + if (threadId == std::this_thread::get_id()) { + func(); + } + else { + LockGuard _(mutex); + tasks.push_back(func); + } + } + void execTasks() + { + assert(threadId == std::this_thread::get_id()); + std::vector> localTasks; + { + LockGuard _(mutex); + std::swap(localTasks, tasks); + } + for (auto& func : localTasks) + func(); + } + +private: + using LockGuard = std::lock_guard; + + std::thread::id threadId; + std::vector> tasks; + std::mutex mutex; +}; diff --git a/core/types.h b/core/types.h index 78d2e287f..2b541e108 100644 --- a/core/types.h +++ b/core/types.h @@ -30,86 +30,6 @@ typedef uint64_t u64; typedef float f32; typedef double f64; -typedef size_t unat; - -//intc function pointer and enums -enum HollyInterruptType -{ - holly_nrm = 0x0000, - holly_ext = 0x0100, - holly_err = 0x0200, -}; - -enum HollyInterruptID -{ - // asic9a /sh4 external holly normal [internal] - holly_RENDER_DONE_vd = holly_nrm | 0, //bit 0 = End of Render interrupt : Video - holly_RENDER_DONE_isp = holly_nrm | 1, //bit 1 = End of Render interrupt : ISP - holly_RENDER_DONE = holly_nrm | 2, //bit 2 = End of Render interrupt : TSP - - holly_SCANINT1 = holly_nrm | 3, //bit 3 = V Blank-in interrupt - holly_SCANINT2 = holly_nrm | 4, //bit 4 = V Blank-out interrupt - holly_HBLank = holly_nrm | 5, //bit 5 = H Blank-in interrupt - - holly_YUV_DMA = holly_nrm | 6, //bit 6 = End of Transferring interrupt : YUV - holly_OPAQUE = holly_nrm | 7, //bit 7 = End of Transferring interrupt : Opaque List - holly_OPAQUEMOD = holly_nrm | 8, //bit 8 = End of Transferring interrupt : Opaque Modifier Volume List - - holly_TRANS = holly_nrm | 9, //bit 9 = End of Transferring interrupt : Translucent List - holly_TRANSMOD = holly_nrm | 10, //bit 10 = End of Transferring interrupt : Translucent Modifier Volume List - holly_PVR_DMA = holly_nrm | 11, //bit 11 = End of DMA interrupt : PVR-DMA - holly_MAPLE_DMA = holly_nrm | 12, //bit 12 = End of DMA interrupt : Maple-DMA - - holly_MAPLE_VBOI = holly_nrm | 13, //bit 13 = Maple V blank over interrupt - holly_GDROM_DMA = holly_nrm | 14, //bit 14 = End of DMA interrupt : GD-DMA - holly_SPU_DMA = holly_nrm | 15, //bit 15 = End of DMA interrupt : AICA-DMA - - holly_EXT_DMA1 = holly_nrm | 16, //bit 16 = End of DMA interrupt : Ext-DMA1(External 1) - holly_EXT_DMA2 = holly_nrm | 17, //bit 17 = End of DMA interrupt : Ext-DMA2(External 2) - holly_DEV_DMA = holly_nrm | 18, //bit 18 = End of DMA interrupt : Dev-DMA(Development tool DMA) - - holly_CH2_DMA = holly_nrm | 19, //bit 19 = End of DMA interrupt : ch2-DMA - holly_PVR_SortDMA = holly_nrm | 20, //bit 20 = End of DMA interrupt : Sort-DMA (Transferring for alpha sorting) - holly_PUNCHTHRU = holly_nrm | 21, //bit 21 = End of Transferring interrupt : Punch Through List - - // asic9c/sh4 external holly external [EXTERNAL] - holly_GDROM_CMD = holly_ext | 0x00, //bit 0 = GD-ROM interrupt - holly_SPU_IRQ = holly_ext | 0x01, //bit 1 = AICA interrupt - holly_EXP_8BIT = holly_ext | 0x02, //bit 2 = Modem interrupt - holly_EXP_PCI = holly_ext | 0x03, //bit 3 = External Device interrupt - - // asic9b/sh4 external holly err only error [error] - //missing quite a few ehh ? - //bit 0 = RENDER : ISP out of Cache(Buffer over flow) - //bit 1 = RENDER : Hazard Processing of Strip Buffer - holly_PRIM_NOMEM = holly_err | 0x02, //bit 2 = TA : ISP/TSP Parameter Overflow - holly_MATR_NOMEM = holly_err | 0x03, //bit 3 = TA : Object List Pointer Overflow - //bit 4 = TA : Illegal Parameter - //bit 5 = TA : FIFO Overflow - //bit 6 = PVRIF : Illegal Address set - //bit 7 = PVRIF : DMA over run - holly_MAPLE_ILLADDR = holly_err | 0x08, //bit 8 = MAPLE : Illegal Address set - holly_MAPLE_OVERRUN = holly_err | 0x09, //bit 9 = MAPLE : DMA over run - holly_MAPLE_FIFO = holly_err | 0x0a, //bit 10 = MAPLE : Write FIFO overflow - holly_MAPLE_ILLCMD = holly_err | 0x0b, //bit 11 = MAPLE : Illegal command - //bit 12 = G1 : Illegal Address set - //bit 13 = G1 : GD-DMA over run - //bit 14 = G1 : ROM/FLASH access at GD-DMA - holly_AICA_ILLADDR = holly_err | 0x0f, //bit 15 = G2 : AICA-DMA Illegal Address set - holly_EXT1_ILLADDR = holly_err | 0x10, //bit 16 = G2 : Ext-DMA1 Illegal Address set - holly_EXT2_ILLADDR = holly_err | 0x11, //bit 17 = G2 : Ext-DMA2 Illegal Address set - holly_DEV_ILLADDR = holly_err | 0x12, //bit 18 = G2 : Dev-DMA Illegal Address set - holly_AICA_OVERRUN = holly_err | 0x13, //bit 19 = G2 : AICA-DMA over run - holly_EXT1_OVERRUN = holly_err | 0x14, //bit 20 = G2 : Ext-DMA1 over run - holly_EXT2_OVERRUN = holly_err | 0x15, //bit 21 = G2 : Ext-DMA2 over run - holly_DEV_OVERRUN = holly_err | 0x16, //bit 22 = G2 : Dev-DMA over run - //bit 23 = G2 : AICA-DMA Time out - //bit 24 = G2 : Ext-DMA1 Time out - //bit 25 = G2 : Ext-DMA2 Time out - //bit 26 = G2 : Dev-DMA Time out - //bit 27 = G2 : Time out in CPU accessing -}; - #ifndef TARGET_UWP #include "nowide/cstdlib.hpp" #include "nowide/cstdio.hpp" @@ -131,9 +51,8 @@ int darw_printf(const char* Text,...); #endif #ifndef TARGET_IPHONE -#if defined(__APPLE__) && defined(__MACH__) && HOST_CPU == CPU_ARM64 -#define TARGET_ARM_MAC -#include "pthread.h" +#if defined(TARGET_ARM_MAC) +#include inline static void JITWriteProtect(bool enabled) { if (__builtin_available(macOS 11.0, *)) pthread_jit_write_protect_np(enabled); @@ -160,9 +79,6 @@ inline static void JITWriteProtect(bool enabled) { #include "log/Log.h" -#define VER_EMUNAME "Flycast" -#define VER_SHORTNAME VER_EMUNAME - #ifndef _MSC_VER #define stricmp strcasecmp #endif @@ -173,27 +89,6 @@ void fatal_error(const char* text, ...); #define verify(x) do { if ((x) == false){ fatal_error("Verify Failed : " #x "\n in %s -> %s : %d", (__FUNCTION__), (__FILE__), __LINE__); os_DebugBreak();}} while (false) #define die(reason) do { fatal_error("Fatal error : %s\n in %s -> %s : %d", (reason), (__FUNCTION__), (__FILE__), __LINE__); os_DebugBreak();} while (false) -enum class JVS { - Default, - FourPlayers, - RotaryEncoders, - SegaMarineFishing, - DualIOBoards4P, - LightGun, - Mazan, - GunSurvivor, - DogWalking, - TouchDeUno, - WorldKicks, - WorldKicksPCB, - Keyboard, - OutTrigger, - LightGunAsAnalog, - WaveRunnerGP, - _18Wheeler, - F355 -}; - enum class RenderType { OpenGL = 0, OpenGL_OIT = 3, @@ -252,6 +147,7 @@ struct settings_t bool isAtomiswave() const { return system == DC_PLATFORM_ATOMISWAVE; } bool isArcade() const { return !isConsole(); } bool isConsole() const { return system == DC_PLATFORM_DREAMCAST; } + bool isSystemSP() const { return system == DC_PLATFORM_SYSTEMSP; } } platform; struct { @@ -263,11 +159,6 @@ struct settings_t float uiScale = 1.f; } display; - struct - { - bool disable_nvmem; - } dynarec; - struct { bool muteAudio; @@ -278,13 +169,17 @@ struct settings_t std::string path; std::string gameId; std::string fileName; + std::string title; } content; struct { - JVS JammaSetup; KeyboardLayout keyboardLangId = KeyboardLayout::US; bool fastForwardMode; + // The following flags are only set for arcade games bool lightgunGame; // or touchscreen + bool keyboardGame; + bool mouseGame; // or rotary encoders + bool fourPlayerGames; } input; struct @@ -309,7 +204,7 @@ struct settings_t int drivingSimSlave; } naomi; - bool disableRenderer; + bool raHardcoreMode; }; extern settings_t settings; @@ -342,3 +237,23 @@ class LoadCancelledException : public FlycastException class Serializer; class Deserializer; + +constexpr size_t operator""_KB(unsigned long long x) +{ + return 1024 * x; +} + +constexpr size_t operator""_MB(unsigned long long x) +{ + return 1024 * 1024 * x; +} + +constexpr size_t operator""_GB(unsigned long long x) +{ + return 1024 * 1024 * 1024 * x; +} + +constexpr u32 RAM_SIZE_MAX = 32_MB; +constexpr u32 VRAM_SIZE_MAX = 16_MB; +constexpr u32 ARAM_SIZE_MAX = 8_MB; + diff --git a/core/ui/IconsFontAwesome6.h b/core/ui/IconsFontAwesome6.h new file mode 100644 index 000000000..a9e11503c --- /dev/null +++ b/core/ui/IconsFontAwesome6.h @@ -0,0 +1,1406 @@ +// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py +// for C and C++ +// from codepoints https://github.com/FortAwesome/Font-Awesome/raw/6.x/metadata/icons.yml +// for use with font https://github.com/FortAwesome/Font-Awesome/blob/6.x/webfonts/fa-regular-400.ttf, https://github.com/FortAwesome/Font-Awesome/blob/6.x/webfonts/fa-solid-900.ttf + +#pragma once + +#define FONT_ICON_FILE_NAME_FAR "fa-regular-400.ttf" +#define FONT_ICON_FILE_NAME_FAS "fa-solid-900.ttf" + +#define ICON_MIN_FA 0xe005 +#define ICON_MAX_16_FA 0xf8ff +#define ICON_MAX_FA 0xf8ff + +#define ICON_FA_0 "0" // U+0030 +#define ICON_FA_1 "1" // U+0031 +#define ICON_FA_2 "2" // U+0032 +#define ICON_FA_3 "3" // U+0033 +#define ICON_FA_4 "4" // U+0034 +#define ICON_FA_5 "5" // U+0035 +#define ICON_FA_6 "6" // U+0036 +#define ICON_FA_7 "7" // U+0037 +#define ICON_FA_8 "8" // U+0038 +#define ICON_FA_9 "9" // U+0039 +#define ICON_FA_A "A" // U+0041 +#define ICON_FA_ADDRESS_BOOK "\xef\x8a\xb9" // U+f2b9 +#define ICON_FA_ADDRESS_CARD "\xef\x8a\xbb" // U+f2bb +#define ICON_FA_ALIGN_CENTER "\xef\x80\xb7" // U+f037 +#define ICON_FA_ALIGN_JUSTIFY "\xef\x80\xb9" // U+f039 +#define ICON_FA_ALIGN_LEFT "\xef\x80\xb6" // U+f036 +#define ICON_FA_ALIGN_RIGHT "\xef\x80\xb8" // U+f038 +#define ICON_FA_ANCHOR "\xef\x84\xbd" // U+f13d +#define ICON_FA_ANCHOR_CIRCLE_CHECK "\xee\x92\xaa" // U+e4aa +#define ICON_FA_ANCHOR_CIRCLE_EXCLAMATION "\xee\x92\xab" // U+e4ab +#define ICON_FA_ANCHOR_CIRCLE_XMARK "\xee\x92\xac" // U+e4ac +#define ICON_FA_ANCHOR_LOCK "\xee\x92\xad" // U+e4ad +#define ICON_FA_ANGLE_DOWN "\xef\x84\x87" // U+f107 +#define ICON_FA_ANGLE_LEFT "\xef\x84\x84" // U+f104 +#define ICON_FA_ANGLE_RIGHT "\xef\x84\x85" // U+f105 +#define ICON_FA_ANGLE_UP "\xef\x84\x86" // U+f106 +#define ICON_FA_ANGLES_DOWN "\xef\x84\x83" // U+f103 +#define ICON_FA_ANGLES_LEFT "\xef\x84\x80" // U+f100 +#define ICON_FA_ANGLES_RIGHT "\xef\x84\x81" // U+f101 +#define ICON_FA_ANGLES_UP "\xef\x84\x82" // U+f102 +#define ICON_FA_ANKH "\xef\x99\x84" // U+f644 +#define ICON_FA_APPLE_WHOLE "\xef\x97\x91" // U+f5d1 +#define ICON_FA_ARCHWAY "\xef\x95\x97" // U+f557 +#define ICON_FA_ARROW_DOWN "\xef\x81\xa3" // U+f063 +#define ICON_FA_ARROW_DOWN_1_9 "\xef\x85\xa2" // U+f162 +#define ICON_FA_ARROW_DOWN_9_1 "\xef\xa2\x86" // U+f886 +#define ICON_FA_ARROW_DOWN_A_Z "\xef\x85\x9d" // U+f15d +#define ICON_FA_ARROW_DOWN_LONG "\xef\x85\xb5" // U+f175 +#define ICON_FA_ARROW_DOWN_SHORT_WIDE "\xef\xa2\x84" // U+f884 +#define ICON_FA_ARROW_DOWN_UP_ACROSS_LINE "\xee\x92\xaf" // U+e4af +#define ICON_FA_ARROW_DOWN_UP_LOCK "\xee\x92\xb0" // U+e4b0 +#define ICON_FA_ARROW_DOWN_WIDE_SHORT "\xef\x85\xa0" // U+f160 +#define ICON_FA_ARROW_DOWN_Z_A "\xef\xa2\x81" // U+f881 +#define ICON_FA_ARROW_LEFT "\xef\x81\xa0" // U+f060 +#define ICON_FA_ARROW_LEFT_LONG "\xef\x85\xb7" // U+f177 +#define ICON_FA_ARROW_POINTER "\xef\x89\x85" // U+f245 +#define ICON_FA_ARROW_RIGHT "\xef\x81\xa1" // U+f061 +#define ICON_FA_ARROW_RIGHT_ARROW_LEFT "\xef\x83\xac" // U+f0ec +#define ICON_FA_ARROW_RIGHT_FROM_BRACKET "\xef\x82\x8b" // U+f08b +#define ICON_FA_ARROW_RIGHT_LONG "\xef\x85\xb8" // U+f178 +#define ICON_FA_ARROW_RIGHT_TO_BRACKET "\xef\x82\x90" // U+f090 +#define ICON_FA_ARROW_RIGHT_TO_CITY "\xee\x92\xb3" // U+e4b3 +#define ICON_FA_ARROW_ROTATE_LEFT "\xef\x83\xa2" // U+f0e2 +#define ICON_FA_ARROW_ROTATE_RIGHT "\xef\x80\x9e" // U+f01e +#define ICON_FA_ARROW_TREND_DOWN "\xee\x82\x97" // U+e097 +#define ICON_FA_ARROW_TREND_UP "\xee\x82\x98" // U+e098 +#define ICON_FA_ARROW_TURN_DOWN "\xef\x85\x89" // U+f149 +#define ICON_FA_ARROW_TURN_UP "\xef\x85\x88" // U+f148 +#define ICON_FA_ARROW_UP "\xef\x81\xa2" // U+f062 +#define ICON_FA_ARROW_UP_1_9 "\xef\x85\xa3" // U+f163 +#define ICON_FA_ARROW_UP_9_1 "\xef\xa2\x87" // U+f887 +#define ICON_FA_ARROW_UP_A_Z "\xef\x85\x9e" // U+f15e +#define ICON_FA_ARROW_UP_FROM_BRACKET "\xee\x82\x9a" // U+e09a +#define ICON_FA_ARROW_UP_FROM_GROUND_WATER "\xee\x92\xb5" // U+e4b5 +#define ICON_FA_ARROW_UP_FROM_WATER_PUMP "\xee\x92\xb6" // U+e4b6 +#define ICON_FA_ARROW_UP_LONG "\xef\x85\xb6" // U+f176 +#define ICON_FA_ARROW_UP_RIGHT_DOTS "\xee\x92\xb7" // U+e4b7 +#define ICON_FA_ARROW_UP_RIGHT_FROM_SQUARE "\xef\x82\x8e" // U+f08e +#define ICON_FA_ARROW_UP_SHORT_WIDE "\xef\xa2\x85" // U+f885 +#define ICON_FA_ARROW_UP_WIDE_SHORT "\xef\x85\xa1" // U+f161 +#define ICON_FA_ARROW_UP_Z_A "\xef\xa2\x82" // U+f882 +#define ICON_FA_ARROWS_DOWN_TO_LINE "\xee\x92\xb8" // U+e4b8 +#define ICON_FA_ARROWS_DOWN_TO_PEOPLE "\xee\x92\xb9" // U+e4b9 +#define ICON_FA_ARROWS_LEFT_RIGHT "\xef\x81\xbe" // U+f07e +#define ICON_FA_ARROWS_LEFT_RIGHT_TO_LINE "\xee\x92\xba" // U+e4ba +#define ICON_FA_ARROWS_ROTATE "\xef\x80\xa1" // U+f021 +#define ICON_FA_ARROWS_SPIN "\xee\x92\xbb" // U+e4bb +#define ICON_FA_ARROWS_SPLIT_UP_AND_LEFT "\xee\x92\xbc" // U+e4bc +#define ICON_FA_ARROWS_TO_CIRCLE "\xee\x92\xbd" // U+e4bd +#define ICON_FA_ARROWS_TO_DOT "\xee\x92\xbe" // U+e4be +#define ICON_FA_ARROWS_TO_EYE "\xee\x92\xbf" // U+e4bf +#define ICON_FA_ARROWS_TURN_RIGHT "\xee\x93\x80" // U+e4c0 +#define ICON_FA_ARROWS_TURN_TO_DOTS "\xee\x93\x81" // U+e4c1 +#define ICON_FA_ARROWS_UP_DOWN "\xef\x81\xbd" // U+f07d +#define ICON_FA_ARROWS_UP_DOWN_LEFT_RIGHT "\xef\x81\x87" // U+f047 +#define ICON_FA_ARROWS_UP_TO_LINE "\xee\x93\x82" // U+e4c2 +#define ICON_FA_ASTERISK "*" // U+002a +#define ICON_FA_AT "@" // U+0040 +#define ICON_FA_ATOM "\xef\x97\x92" // U+f5d2 +#define ICON_FA_AUDIO_DESCRIPTION "\xef\x8a\x9e" // U+f29e +#define ICON_FA_AUSTRAL_SIGN "\xee\x82\xa9" // U+e0a9 +#define ICON_FA_AWARD "\xef\x95\x99" // U+f559 +#define ICON_FA_B "B" // U+0042 +#define ICON_FA_BABY "\xef\x9d\xbc" // U+f77c +#define ICON_FA_BABY_CARRIAGE "\xef\x9d\xbd" // U+f77d +#define ICON_FA_BACKWARD "\xef\x81\x8a" // U+f04a +#define ICON_FA_BACKWARD_FAST "\xef\x81\x89" // U+f049 +#define ICON_FA_BACKWARD_STEP "\xef\x81\x88" // U+f048 +#define ICON_FA_BACON "\xef\x9f\xa5" // U+f7e5 +#define ICON_FA_BACTERIA "\xee\x81\x99" // U+e059 +#define ICON_FA_BACTERIUM "\xee\x81\x9a" // U+e05a +#define ICON_FA_BAG_SHOPPING "\xef\x8a\x90" // U+f290 +#define ICON_FA_BAHAI "\xef\x99\xa6" // U+f666 +#define ICON_FA_BAHT_SIGN "\xee\x82\xac" // U+e0ac +#define ICON_FA_BAN "\xef\x81\x9e" // U+f05e +#define ICON_FA_BAN_SMOKING "\xef\x95\x8d" // U+f54d +#define ICON_FA_BANDAGE "\xef\x91\xa2" // U+f462 +#define ICON_FA_BANGLADESHI_TAKA_SIGN "\xee\x8b\xa6" // U+e2e6 +#define ICON_FA_BARCODE "\xef\x80\xaa" // U+f02a +#define ICON_FA_BARS "\xef\x83\x89" // U+f0c9 +#define ICON_FA_BARS_PROGRESS "\xef\xa0\xa8" // U+f828 +#define ICON_FA_BARS_STAGGERED "\xef\x95\x90" // U+f550 +#define ICON_FA_BASEBALL "\xef\x90\xb3" // U+f433 +#define ICON_FA_BASEBALL_BAT_BALL "\xef\x90\xb2" // U+f432 +#define ICON_FA_BASKET_SHOPPING "\xef\x8a\x91" // U+f291 +#define ICON_FA_BASKETBALL "\xef\x90\xb4" // U+f434 +#define ICON_FA_BATH "\xef\x8b\x8d" // U+f2cd +#define ICON_FA_BATTERY_EMPTY "\xef\x89\x84" // U+f244 +#define ICON_FA_BATTERY_FULL "\xef\x89\x80" // U+f240 +#define ICON_FA_BATTERY_HALF "\xef\x89\x82" // U+f242 +#define ICON_FA_BATTERY_QUARTER "\xef\x89\x83" // U+f243 +#define ICON_FA_BATTERY_THREE_QUARTERS "\xef\x89\x81" // U+f241 +#define ICON_FA_BED "\xef\x88\xb6" // U+f236 +#define ICON_FA_BED_PULSE "\xef\x92\x87" // U+f487 +#define ICON_FA_BEER_MUG_EMPTY "\xef\x83\xbc" // U+f0fc +#define ICON_FA_BELL "\xef\x83\xb3" // U+f0f3 +#define ICON_FA_BELL_CONCIERGE "\xef\x95\xa2" // U+f562 +#define ICON_FA_BELL_SLASH "\xef\x87\xb6" // U+f1f6 +#define ICON_FA_BEZIER_CURVE "\xef\x95\x9b" // U+f55b +#define ICON_FA_BICYCLE "\xef\x88\x86" // U+f206 +#define ICON_FA_BINOCULARS "\xef\x87\xa5" // U+f1e5 +#define ICON_FA_BIOHAZARD "\xef\x9e\x80" // U+f780 +#define ICON_FA_BITCOIN_SIGN "\xee\x82\xb4" // U+e0b4 +#define ICON_FA_BLENDER "\xef\x94\x97" // U+f517 +#define ICON_FA_BLENDER_PHONE "\xef\x9a\xb6" // U+f6b6 +#define ICON_FA_BLOG "\xef\x9e\x81" // U+f781 +#define ICON_FA_BOLD "\xef\x80\xb2" // U+f032 +#define ICON_FA_BOLT "\xef\x83\xa7" // U+f0e7 +#define ICON_FA_BOLT_LIGHTNING "\xee\x82\xb7" // U+e0b7 +#define ICON_FA_BOMB "\xef\x87\xa2" // U+f1e2 +#define ICON_FA_BONE "\xef\x97\x97" // U+f5d7 +#define ICON_FA_BONG "\xef\x95\x9c" // U+f55c +#define ICON_FA_BOOK "\xef\x80\xad" // U+f02d +#define ICON_FA_BOOK_ATLAS "\xef\x95\x98" // U+f558 +#define ICON_FA_BOOK_BIBLE "\xef\x99\x87" // U+f647 +#define ICON_FA_BOOK_BOOKMARK "\xee\x82\xbb" // U+e0bb +#define ICON_FA_BOOK_JOURNAL_WHILLS "\xef\x99\xaa" // U+f66a +#define ICON_FA_BOOK_MEDICAL "\xef\x9f\xa6" // U+f7e6 +#define ICON_FA_BOOK_OPEN "\xef\x94\x98" // U+f518 +#define ICON_FA_BOOK_OPEN_READER "\xef\x97\x9a" // U+f5da +#define ICON_FA_BOOK_QURAN "\xef\x9a\x87" // U+f687 +#define ICON_FA_BOOK_SKULL "\xef\x9a\xb7" // U+f6b7 +#define ICON_FA_BOOK_TANAKH "\xef\xa0\xa7" // U+f827 +#define ICON_FA_BOOKMARK "\xef\x80\xae" // U+f02e +#define ICON_FA_BORDER_ALL "\xef\xa1\x8c" // U+f84c +#define ICON_FA_BORDER_NONE "\xef\xa1\x90" // U+f850 +#define ICON_FA_BORDER_TOP_LEFT "\xef\xa1\x93" // U+f853 +#define ICON_FA_BORE_HOLE "\xee\x93\x83" // U+e4c3 +#define ICON_FA_BOTTLE_DROPLET "\xee\x93\x84" // U+e4c4 +#define ICON_FA_BOTTLE_WATER "\xee\x93\x85" // U+e4c5 +#define ICON_FA_BOWL_FOOD "\xee\x93\x86" // U+e4c6 +#define ICON_FA_BOWL_RICE "\xee\x8b\xab" // U+e2eb +#define ICON_FA_BOWLING_BALL "\xef\x90\xb6" // U+f436 +#define ICON_FA_BOX "\xef\x91\xa6" // U+f466 +#define ICON_FA_BOX_ARCHIVE "\xef\x86\x87" // U+f187 +#define ICON_FA_BOX_OPEN "\xef\x92\x9e" // U+f49e +#define ICON_FA_BOX_TISSUE "\xee\x81\x9b" // U+e05b +#define ICON_FA_BOXES_PACKING "\xee\x93\x87" // U+e4c7 +#define ICON_FA_BOXES_STACKED "\xef\x91\xa8" // U+f468 +#define ICON_FA_BRAILLE "\xef\x8a\xa1" // U+f2a1 +#define ICON_FA_BRAIN "\xef\x97\x9c" // U+f5dc +#define ICON_FA_BRAZILIAN_REAL_SIGN "\xee\x91\xac" // U+e46c +#define ICON_FA_BREAD_SLICE "\xef\x9f\xac" // U+f7ec +#define ICON_FA_BRIDGE "\xee\x93\x88" // U+e4c8 +#define ICON_FA_BRIDGE_CIRCLE_CHECK "\xee\x93\x89" // U+e4c9 +#define ICON_FA_BRIDGE_CIRCLE_EXCLAMATION "\xee\x93\x8a" // U+e4ca +#define ICON_FA_BRIDGE_CIRCLE_XMARK "\xee\x93\x8b" // U+e4cb +#define ICON_FA_BRIDGE_LOCK "\xee\x93\x8c" // U+e4cc +#define ICON_FA_BRIDGE_WATER "\xee\x93\x8e" // U+e4ce +#define ICON_FA_BRIEFCASE "\xef\x82\xb1" // U+f0b1 +#define ICON_FA_BRIEFCASE_MEDICAL "\xef\x91\xa9" // U+f469 +#define ICON_FA_BROOM "\xef\x94\x9a" // U+f51a +#define ICON_FA_BROOM_BALL "\xef\x91\x98" // U+f458 +#define ICON_FA_BRUSH "\xef\x95\x9d" // U+f55d +#define ICON_FA_BUCKET "\xee\x93\x8f" // U+e4cf +#define ICON_FA_BUG "\xef\x86\x88" // U+f188 +#define ICON_FA_BUG_SLASH "\xee\x92\x90" // U+e490 +#define ICON_FA_BUGS "\xee\x93\x90" // U+e4d0 +#define ICON_FA_BUILDING "\xef\x86\xad" // U+f1ad +#define ICON_FA_BUILDING_CIRCLE_ARROW_RIGHT "\xee\x93\x91" // U+e4d1 +#define ICON_FA_BUILDING_CIRCLE_CHECK "\xee\x93\x92" // U+e4d2 +#define ICON_FA_BUILDING_CIRCLE_EXCLAMATION "\xee\x93\x93" // U+e4d3 +#define ICON_FA_BUILDING_CIRCLE_XMARK "\xee\x93\x94" // U+e4d4 +#define ICON_FA_BUILDING_COLUMNS "\xef\x86\x9c" // U+f19c +#define ICON_FA_BUILDING_FLAG "\xee\x93\x95" // U+e4d5 +#define ICON_FA_BUILDING_LOCK "\xee\x93\x96" // U+e4d6 +#define ICON_FA_BUILDING_NGO "\xee\x93\x97" // U+e4d7 +#define ICON_FA_BUILDING_SHIELD "\xee\x93\x98" // U+e4d8 +#define ICON_FA_BUILDING_UN "\xee\x93\x99" // U+e4d9 +#define ICON_FA_BUILDING_USER "\xee\x93\x9a" // U+e4da +#define ICON_FA_BUILDING_WHEAT "\xee\x93\x9b" // U+e4db +#define ICON_FA_BULLHORN "\xef\x82\xa1" // U+f0a1 +#define ICON_FA_BULLSEYE "\xef\x85\x80" // U+f140 +#define ICON_FA_BURGER "\xef\xa0\x85" // U+f805 +#define ICON_FA_BURST "\xee\x93\x9c" // U+e4dc +#define ICON_FA_BUS "\xef\x88\x87" // U+f207 +#define ICON_FA_BUS_SIMPLE "\xef\x95\x9e" // U+f55e +#define ICON_FA_BUSINESS_TIME "\xef\x99\x8a" // U+f64a +#define ICON_FA_C "C" // U+0043 +#define ICON_FA_CABLE_CAR "\xef\x9f\x9a" // U+f7da +#define ICON_FA_CAKE_CANDLES "\xef\x87\xbd" // U+f1fd +#define ICON_FA_CALCULATOR "\xef\x87\xac" // U+f1ec +#define ICON_FA_CALENDAR "\xef\x84\xb3" // U+f133 +#define ICON_FA_CALENDAR_CHECK "\xef\x89\xb4" // U+f274 +#define ICON_FA_CALENDAR_DAY "\xef\x9e\x83" // U+f783 +#define ICON_FA_CALENDAR_DAYS "\xef\x81\xb3" // U+f073 +#define ICON_FA_CALENDAR_MINUS "\xef\x89\xb2" // U+f272 +#define ICON_FA_CALENDAR_PLUS "\xef\x89\xb1" // U+f271 +#define ICON_FA_CALENDAR_WEEK "\xef\x9e\x84" // U+f784 +#define ICON_FA_CALENDAR_XMARK "\xef\x89\xb3" // U+f273 +#define ICON_FA_CAMERA "\xef\x80\xb0" // U+f030 +#define ICON_FA_CAMERA_RETRO "\xef\x82\x83" // U+f083 +#define ICON_FA_CAMERA_ROTATE "\xee\x83\x98" // U+e0d8 +#define ICON_FA_CAMPGROUND "\xef\x9a\xbb" // U+f6bb +#define ICON_FA_CANDY_CANE "\xef\x9e\x86" // U+f786 +#define ICON_FA_CANNABIS "\xef\x95\x9f" // U+f55f +#define ICON_FA_CAPSULES "\xef\x91\xab" // U+f46b +#define ICON_FA_CAR "\xef\x86\xb9" // U+f1b9 +#define ICON_FA_CAR_BATTERY "\xef\x97\x9f" // U+f5df +#define ICON_FA_CAR_BURST "\xef\x97\xa1" // U+f5e1 +#define ICON_FA_CAR_ON "\xee\x93\x9d" // U+e4dd +#define ICON_FA_CAR_REAR "\xef\x97\x9e" // U+f5de +#define ICON_FA_CAR_SIDE "\xef\x97\xa4" // U+f5e4 +#define ICON_FA_CAR_TUNNEL "\xee\x93\x9e" // U+e4de +#define ICON_FA_CARAVAN "\xef\xa3\xbf" // U+f8ff +#define ICON_FA_CARET_DOWN "\xef\x83\x97" // U+f0d7 +#define ICON_FA_CARET_LEFT "\xef\x83\x99" // U+f0d9 +#define ICON_FA_CARET_RIGHT "\xef\x83\x9a" // U+f0da +#define ICON_FA_CARET_UP "\xef\x83\x98" // U+f0d8 +#define ICON_FA_CARROT "\xef\x9e\x87" // U+f787 +#define ICON_FA_CART_ARROW_DOWN "\xef\x88\x98" // U+f218 +#define ICON_FA_CART_FLATBED "\xef\x91\xb4" // U+f474 +#define ICON_FA_CART_FLATBED_SUITCASE "\xef\x96\x9d" // U+f59d +#define ICON_FA_CART_PLUS "\xef\x88\x97" // U+f217 +#define ICON_FA_CART_SHOPPING "\xef\x81\xba" // U+f07a +#define ICON_FA_CASH_REGISTER "\xef\x9e\x88" // U+f788 +#define ICON_FA_CAT "\xef\x9a\xbe" // U+f6be +#define ICON_FA_CEDI_SIGN "\xee\x83\x9f" // U+e0df +#define ICON_FA_CENT_SIGN "\xee\x8f\xb5" // U+e3f5 +#define ICON_FA_CERTIFICATE "\xef\x82\xa3" // U+f0a3 +#define ICON_FA_CHAIR "\xef\x9b\x80" // U+f6c0 +#define ICON_FA_CHALKBOARD "\xef\x94\x9b" // U+f51b +#define ICON_FA_CHALKBOARD_USER "\xef\x94\x9c" // U+f51c +#define ICON_FA_CHAMPAGNE_GLASSES "\xef\x9e\x9f" // U+f79f +#define ICON_FA_CHARGING_STATION "\xef\x97\xa7" // U+f5e7 +#define ICON_FA_CHART_AREA "\xef\x87\xbe" // U+f1fe +#define ICON_FA_CHART_BAR "\xef\x82\x80" // U+f080 +#define ICON_FA_CHART_COLUMN "\xee\x83\xa3" // U+e0e3 +#define ICON_FA_CHART_GANTT "\xee\x83\xa4" // U+e0e4 +#define ICON_FA_CHART_LINE "\xef\x88\x81" // U+f201 +#define ICON_FA_CHART_PIE "\xef\x88\x80" // U+f200 +#define ICON_FA_CHART_SIMPLE "\xee\x91\xb3" // U+e473 +#define ICON_FA_CHECK "\xef\x80\x8c" // U+f00c +#define ICON_FA_CHECK_DOUBLE "\xef\x95\xa0" // U+f560 +#define ICON_FA_CHECK_TO_SLOT "\xef\x9d\xb2" // U+f772 +#define ICON_FA_CHEESE "\xef\x9f\xaf" // U+f7ef +#define ICON_FA_CHESS "\xef\x90\xb9" // U+f439 +#define ICON_FA_CHESS_BISHOP "\xef\x90\xba" // U+f43a +#define ICON_FA_CHESS_BOARD "\xef\x90\xbc" // U+f43c +#define ICON_FA_CHESS_KING "\xef\x90\xbf" // U+f43f +#define ICON_FA_CHESS_KNIGHT "\xef\x91\x81" // U+f441 +#define ICON_FA_CHESS_PAWN "\xef\x91\x83" // U+f443 +#define ICON_FA_CHESS_QUEEN "\xef\x91\x85" // U+f445 +#define ICON_FA_CHESS_ROOK "\xef\x91\x87" // U+f447 +#define ICON_FA_CHEVRON_DOWN "\xef\x81\xb8" // U+f078 +#define ICON_FA_CHEVRON_LEFT "\xef\x81\x93" // U+f053 +#define ICON_FA_CHEVRON_RIGHT "\xef\x81\x94" // U+f054 +#define ICON_FA_CHEVRON_UP "\xef\x81\xb7" // U+f077 +#define ICON_FA_CHILD "\xef\x86\xae" // U+f1ae +#define ICON_FA_CHILD_COMBATANT "\xee\x93\xa0" // U+e4e0 +#define ICON_FA_CHILD_DRESS "\xee\x96\x9c" // U+e59c +#define ICON_FA_CHILD_REACHING "\xee\x96\x9d" // U+e59d +#define ICON_FA_CHILDREN "\xee\x93\xa1" // U+e4e1 +#define ICON_FA_CHURCH "\xef\x94\x9d" // U+f51d +#define ICON_FA_CIRCLE "\xef\x84\x91" // U+f111 +#define ICON_FA_CIRCLE_ARROW_DOWN "\xef\x82\xab" // U+f0ab +#define ICON_FA_CIRCLE_ARROW_LEFT "\xef\x82\xa8" // U+f0a8 +#define ICON_FA_CIRCLE_ARROW_RIGHT "\xef\x82\xa9" // U+f0a9 +#define ICON_FA_CIRCLE_ARROW_UP "\xef\x82\xaa" // U+f0aa +#define ICON_FA_CIRCLE_CHECK "\xef\x81\x98" // U+f058 +#define ICON_FA_CIRCLE_CHEVRON_DOWN "\xef\x84\xba" // U+f13a +#define ICON_FA_CIRCLE_CHEVRON_LEFT "\xef\x84\xb7" // U+f137 +#define ICON_FA_CIRCLE_CHEVRON_RIGHT "\xef\x84\xb8" // U+f138 +#define ICON_FA_CIRCLE_CHEVRON_UP "\xef\x84\xb9" // U+f139 +#define ICON_FA_CIRCLE_DOLLAR_TO_SLOT "\xef\x92\xb9" // U+f4b9 +#define ICON_FA_CIRCLE_DOT "\xef\x86\x92" // U+f192 +#define ICON_FA_CIRCLE_DOWN "\xef\x8d\x98" // U+f358 +#define ICON_FA_CIRCLE_EXCLAMATION "\xef\x81\xaa" // U+f06a +#define ICON_FA_CIRCLE_H "\xef\x91\xbe" // U+f47e +#define ICON_FA_CIRCLE_HALF_STROKE "\xef\x81\x82" // U+f042 +#define ICON_FA_CIRCLE_INFO "\xef\x81\x9a" // U+f05a +#define ICON_FA_CIRCLE_LEFT "\xef\x8d\x99" // U+f359 +#define ICON_FA_CIRCLE_MINUS "\xef\x81\x96" // U+f056 +#define ICON_FA_CIRCLE_NODES "\xee\x93\xa2" // U+e4e2 +#define ICON_FA_CIRCLE_NOTCH "\xef\x87\x8e" // U+f1ce +#define ICON_FA_CIRCLE_PAUSE "\xef\x8a\x8b" // U+f28b +#define ICON_FA_CIRCLE_PLAY "\xef\x85\x84" // U+f144 +#define ICON_FA_CIRCLE_PLUS "\xef\x81\x95" // U+f055 +#define ICON_FA_CIRCLE_QUESTION "\xef\x81\x99" // U+f059 +#define ICON_FA_CIRCLE_RADIATION "\xef\x9e\xba" // U+f7ba +#define ICON_FA_CIRCLE_RIGHT "\xef\x8d\x9a" // U+f35a +#define ICON_FA_CIRCLE_STOP "\xef\x8a\x8d" // U+f28d +#define ICON_FA_CIRCLE_UP "\xef\x8d\x9b" // U+f35b +#define ICON_FA_CIRCLE_USER "\xef\x8a\xbd" // U+f2bd +#define ICON_FA_CIRCLE_XMARK "\xef\x81\x97" // U+f057 +#define ICON_FA_CITY "\xef\x99\x8f" // U+f64f +#define ICON_FA_CLAPPERBOARD "\xee\x84\xb1" // U+e131 +#define ICON_FA_CLIPBOARD "\xef\x8c\xa8" // U+f328 +#define ICON_FA_CLIPBOARD_CHECK "\xef\x91\xac" // U+f46c +#define ICON_FA_CLIPBOARD_LIST "\xef\x91\xad" // U+f46d +#define ICON_FA_CLIPBOARD_QUESTION "\xee\x93\xa3" // U+e4e3 +#define ICON_FA_CLIPBOARD_USER "\xef\x9f\xb3" // U+f7f3 +#define ICON_FA_CLOCK "\xef\x80\x97" // U+f017 +#define ICON_FA_CLOCK_ROTATE_LEFT "\xef\x87\x9a" // U+f1da +#define ICON_FA_CLONE "\xef\x89\x8d" // U+f24d +#define ICON_FA_CLOSED_CAPTIONING "\xef\x88\x8a" // U+f20a +#define ICON_FA_CLOUD "\xef\x83\x82" // U+f0c2 +#define ICON_FA_CLOUD_ARROW_DOWN "\xef\x83\xad" // U+f0ed +#define ICON_FA_CLOUD_ARROW_UP "\xef\x83\xae" // U+f0ee +#define ICON_FA_CLOUD_BOLT "\xef\x9d\xac" // U+f76c +#define ICON_FA_CLOUD_MEATBALL "\xef\x9c\xbb" // U+f73b +#define ICON_FA_CLOUD_MOON "\xef\x9b\x83" // U+f6c3 +#define ICON_FA_CLOUD_MOON_RAIN "\xef\x9c\xbc" // U+f73c +#define ICON_FA_CLOUD_RAIN "\xef\x9c\xbd" // U+f73d +#define ICON_FA_CLOUD_SHOWERS_HEAVY "\xef\x9d\x80" // U+f740 +#define ICON_FA_CLOUD_SHOWERS_WATER "\xee\x93\xa4" // U+e4e4 +#define ICON_FA_CLOUD_SUN "\xef\x9b\x84" // U+f6c4 +#define ICON_FA_CLOUD_SUN_RAIN "\xef\x9d\x83" // U+f743 +#define ICON_FA_CLOVER "\xee\x84\xb9" // U+e139 +#define ICON_FA_CODE "\xef\x84\xa1" // U+f121 +#define ICON_FA_CODE_BRANCH "\xef\x84\xa6" // U+f126 +#define ICON_FA_CODE_COMMIT "\xef\x8e\x86" // U+f386 +#define ICON_FA_CODE_COMPARE "\xee\x84\xba" // U+e13a +#define ICON_FA_CODE_FORK "\xee\x84\xbb" // U+e13b +#define ICON_FA_CODE_MERGE "\xef\x8e\x87" // U+f387 +#define ICON_FA_CODE_PULL_REQUEST "\xee\x84\xbc" // U+e13c +#define ICON_FA_COINS "\xef\x94\x9e" // U+f51e +#define ICON_FA_COLON_SIGN "\xee\x85\x80" // U+e140 +#define ICON_FA_COMMENT "\xef\x81\xb5" // U+f075 +#define ICON_FA_COMMENT_DOLLAR "\xef\x99\x91" // U+f651 +#define ICON_FA_COMMENT_DOTS "\xef\x92\xad" // U+f4ad +#define ICON_FA_COMMENT_MEDICAL "\xef\x9f\xb5" // U+f7f5 +#define ICON_FA_COMMENT_SLASH "\xef\x92\xb3" // U+f4b3 +#define ICON_FA_COMMENT_SMS "\xef\x9f\x8d" // U+f7cd +#define ICON_FA_COMMENTS "\xef\x82\x86" // U+f086 +#define ICON_FA_COMMENTS_DOLLAR "\xef\x99\x93" // U+f653 +#define ICON_FA_COMPACT_DISC "\xef\x94\x9f" // U+f51f +#define ICON_FA_COMPASS "\xef\x85\x8e" // U+f14e +#define ICON_FA_COMPASS_DRAFTING "\xef\x95\xa8" // U+f568 +#define ICON_FA_COMPRESS "\xef\x81\xa6" // U+f066 +#define ICON_FA_COMPUTER "\xee\x93\xa5" // U+e4e5 +#define ICON_FA_COMPUTER_MOUSE "\xef\xa3\x8c" // U+f8cc +#define ICON_FA_COOKIE "\xef\x95\xa3" // U+f563 +#define ICON_FA_COOKIE_BITE "\xef\x95\xa4" // U+f564 +#define ICON_FA_COPY "\xef\x83\x85" // U+f0c5 +#define ICON_FA_COPYRIGHT "\xef\x87\xb9" // U+f1f9 +#define ICON_FA_COUCH "\xef\x92\xb8" // U+f4b8 +#define ICON_FA_COW "\xef\x9b\x88" // U+f6c8 +#define ICON_FA_CREDIT_CARD "\xef\x82\x9d" // U+f09d +#define ICON_FA_CROP "\xef\x84\xa5" // U+f125 +#define ICON_FA_CROP_SIMPLE "\xef\x95\xa5" // U+f565 +#define ICON_FA_CROSS "\xef\x99\x94" // U+f654 +#define ICON_FA_CROSSHAIRS "\xef\x81\x9b" // U+f05b +#define ICON_FA_CROW "\xef\x94\xa0" // U+f520 +#define ICON_FA_CROWN "\xef\x94\xa1" // U+f521 +#define ICON_FA_CRUTCH "\xef\x9f\xb7" // U+f7f7 +#define ICON_FA_CRUZEIRO_SIGN "\xee\x85\x92" // U+e152 +#define ICON_FA_CUBE "\xef\x86\xb2" // U+f1b2 +#define ICON_FA_CUBES "\xef\x86\xb3" // U+f1b3 +#define ICON_FA_CUBES_STACKED "\xee\x93\xa6" // U+e4e6 +#define ICON_FA_D "D" // U+0044 +#define ICON_FA_DATABASE "\xef\x87\x80" // U+f1c0 +#define ICON_FA_DELETE_LEFT "\xef\x95\x9a" // U+f55a +#define ICON_FA_DEMOCRAT "\xef\x9d\x87" // U+f747 +#define ICON_FA_DESKTOP "\xef\x8e\x90" // U+f390 +#define ICON_FA_DHARMACHAKRA "\xef\x99\x95" // U+f655 +#define ICON_FA_DIAGRAM_NEXT "\xee\x91\xb6" // U+e476 +#define ICON_FA_DIAGRAM_PREDECESSOR "\xee\x91\xb7" // U+e477 +#define ICON_FA_DIAGRAM_PROJECT "\xef\x95\x82" // U+f542 +#define ICON_FA_DIAGRAM_SUCCESSOR "\xee\x91\xba" // U+e47a +#define ICON_FA_DIAMOND "\xef\x88\x99" // U+f219 +#define ICON_FA_DIAMOND_TURN_RIGHT "\xef\x97\xab" // U+f5eb +#define ICON_FA_DICE "\xef\x94\xa2" // U+f522 +#define ICON_FA_DICE_D20 "\xef\x9b\x8f" // U+f6cf +#define ICON_FA_DICE_D6 "\xef\x9b\x91" // U+f6d1 +#define ICON_FA_DICE_FIVE "\xef\x94\xa3" // U+f523 +#define ICON_FA_DICE_FOUR "\xef\x94\xa4" // U+f524 +#define ICON_FA_DICE_ONE "\xef\x94\xa5" // U+f525 +#define ICON_FA_DICE_SIX "\xef\x94\xa6" // U+f526 +#define ICON_FA_DICE_THREE "\xef\x94\xa7" // U+f527 +#define ICON_FA_DICE_TWO "\xef\x94\xa8" // U+f528 +#define ICON_FA_DISEASE "\xef\x9f\xba" // U+f7fa +#define ICON_FA_DISPLAY "\xee\x85\xa3" // U+e163 +#define ICON_FA_DIVIDE "\xef\x94\xa9" // U+f529 +#define ICON_FA_DNA "\xef\x91\xb1" // U+f471 +#define ICON_FA_DOG "\xef\x9b\x93" // U+f6d3 +#define ICON_FA_DOLLAR_SIGN "$" // U+0024 +#define ICON_FA_DOLLY "\xef\x91\xb2" // U+f472 +#define ICON_FA_DONG_SIGN "\xee\x85\xa9" // U+e169 +#define ICON_FA_DOOR_CLOSED "\xef\x94\xaa" // U+f52a +#define ICON_FA_DOOR_OPEN "\xef\x94\xab" // U+f52b +#define ICON_FA_DOVE "\xef\x92\xba" // U+f4ba +#define ICON_FA_DOWN_LEFT_AND_UP_RIGHT_TO_CENTER "\xef\x90\xa2" // U+f422 +#define ICON_FA_DOWN_LONG "\xef\x8c\x89" // U+f309 +#define ICON_FA_DOWNLOAD "\xef\x80\x99" // U+f019 +#define ICON_FA_DRAGON "\xef\x9b\x95" // U+f6d5 +#define ICON_FA_DRAW_POLYGON "\xef\x97\xae" // U+f5ee +#define ICON_FA_DROPLET "\xef\x81\x83" // U+f043 +#define ICON_FA_DROPLET_SLASH "\xef\x97\x87" // U+f5c7 +#define ICON_FA_DRUM "\xef\x95\xa9" // U+f569 +#define ICON_FA_DRUM_STEELPAN "\xef\x95\xaa" // U+f56a +#define ICON_FA_DRUMSTICK_BITE "\xef\x9b\x97" // U+f6d7 +#define ICON_FA_DUMBBELL "\xef\x91\x8b" // U+f44b +#define ICON_FA_DUMPSTER "\xef\x9e\x93" // U+f793 +#define ICON_FA_DUMPSTER_FIRE "\xef\x9e\x94" // U+f794 +#define ICON_FA_DUNGEON "\xef\x9b\x99" // U+f6d9 +#define ICON_FA_E "E" // U+0045 +#define ICON_FA_EAR_DEAF "\xef\x8a\xa4" // U+f2a4 +#define ICON_FA_EAR_LISTEN "\xef\x8a\xa2" // U+f2a2 +#define ICON_FA_EARTH_AFRICA "\xef\x95\xbc" // U+f57c +#define ICON_FA_EARTH_AMERICAS "\xef\x95\xbd" // U+f57d +#define ICON_FA_EARTH_ASIA "\xef\x95\xbe" // U+f57e +#define ICON_FA_EARTH_EUROPE "\xef\x9e\xa2" // U+f7a2 +#define ICON_FA_EARTH_OCEANIA "\xee\x91\xbb" // U+e47b +#define ICON_FA_EGG "\xef\x9f\xbb" // U+f7fb +#define ICON_FA_EJECT "\xef\x81\x92" // U+f052 +#define ICON_FA_ELEVATOR "\xee\x85\xad" // U+e16d +#define ICON_FA_ELLIPSIS "\xef\x85\x81" // U+f141 +#define ICON_FA_ELLIPSIS_VERTICAL "\xef\x85\x82" // U+f142 +#define ICON_FA_ENVELOPE "\xef\x83\xa0" // U+f0e0 +#define ICON_FA_ENVELOPE_CIRCLE_CHECK "\xee\x93\xa8" // U+e4e8 +#define ICON_FA_ENVELOPE_OPEN "\xef\x8a\xb6" // U+f2b6 +#define ICON_FA_ENVELOPE_OPEN_TEXT "\xef\x99\x98" // U+f658 +#define ICON_FA_ENVELOPES_BULK "\xef\x99\xb4" // U+f674 +#define ICON_FA_EQUALS "=" // U+003d +#define ICON_FA_ERASER "\xef\x84\xad" // U+f12d +#define ICON_FA_ETHERNET "\xef\x9e\x96" // U+f796 +#define ICON_FA_EURO_SIGN "\xef\x85\x93" // U+f153 +#define ICON_FA_EXCLAMATION "!" // U+0021 +#define ICON_FA_EXPAND "\xef\x81\xa5" // U+f065 +#define ICON_FA_EXPLOSION "\xee\x93\xa9" // U+e4e9 +#define ICON_FA_EYE "\xef\x81\xae" // U+f06e +#define ICON_FA_EYE_DROPPER "\xef\x87\xbb" // U+f1fb +#define ICON_FA_EYE_LOW_VISION "\xef\x8a\xa8" // U+f2a8 +#define ICON_FA_EYE_SLASH "\xef\x81\xb0" // U+f070 +#define ICON_FA_F "F" // U+0046 +#define ICON_FA_FACE_ANGRY "\xef\x95\x96" // U+f556 +#define ICON_FA_FACE_DIZZY "\xef\x95\xa7" // U+f567 +#define ICON_FA_FACE_FLUSHED "\xef\x95\xb9" // U+f579 +#define ICON_FA_FACE_FROWN "\xef\x84\x99" // U+f119 +#define ICON_FA_FACE_FROWN_OPEN "\xef\x95\xba" // U+f57a +#define ICON_FA_FACE_GRIMACE "\xef\x95\xbf" // U+f57f +#define ICON_FA_FACE_GRIN "\xef\x96\x80" // U+f580 +#define ICON_FA_FACE_GRIN_BEAM "\xef\x96\x82" // U+f582 +#define ICON_FA_FACE_GRIN_BEAM_SWEAT "\xef\x96\x83" // U+f583 +#define ICON_FA_FACE_GRIN_HEARTS "\xef\x96\x84" // U+f584 +#define ICON_FA_FACE_GRIN_SQUINT "\xef\x96\x85" // U+f585 +#define ICON_FA_FACE_GRIN_SQUINT_TEARS "\xef\x96\x86" // U+f586 +#define ICON_FA_FACE_GRIN_STARS "\xef\x96\x87" // U+f587 +#define ICON_FA_FACE_GRIN_TEARS "\xef\x96\x88" // U+f588 +#define ICON_FA_FACE_GRIN_TONGUE "\xef\x96\x89" // U+f589 +#define ICON_FA_FACE_GRIN_TONGUE_SQUINT "\xef\x96\x8a" // U+f58a +#define ICON_FA_FACE_GRIN_TONGUE_WINK "\xef\x96\x8b" // U+f58b +#define ICON_FA_FACE_GRIN_WIDE "\xef\x96\x81" // U+f581 +#define ICON_FA_FACE_GRIN_WINK "\xef\x96\x8c" // U+f58c +#define ICON_FA_FACE_KISS "\xef\x96\x96" // U+f596 +#define ICON_FA_FACE_KISS_BEAM "\xef\x96\x97" // U+f597 +#define ICON_FA_FACE_KISS_WINK_HEART "\xef\x96\x98" // U+f598 +#define ICON_FA_FACE_LAUGH "\xef\x96\x99" // U+f599 +#define ICON_FA_FACE_LAUGH_BEAM "\xef\x96\x9a" // U+f59a +#define ICON_FA_FACE_LAUGH_SQUINT "\xef\x96\x9b" // U+f59b +#define ICON_FA_FACE_LAUGH_WINK "\xef\x96\x9c" // U+f59c +#define ICON_FA_FACE_MEH "\xef\x84\x9a" // U+f11a +#define ICON_FA_FACE_MEH_BLANK "\xef\x96\xa4" // U+f5a4 +#define ICON_FA_FACE_ROLLING_EYES "\xef\x96\xa5" // U+f5a5 +#define ICON_FA_FACE_SAD_CRY "\xef\x96\xb3" // U+f5b3 +#define ICON_FA_FACE_SAD_TEAR "\xef\x96\xb4" // U+f5b4 +#define ICON_FA_FACE_SMILE "\xef\x84\x98" // U+f118 +#define ICON_FA_FACE_SMILE_BEAM "\xef\x96\xb8" // U+f5b8 +#define ICON_FA_FACE_SMILE_WINK "\xef\x93\x9a" // U+f4da +#define ICON_FA_FACE_SURPRISE "\xef\x97\x82" // U+f5c2 +#define ICON_FA_FACE_TIRED "\xef\x97\x88" // U+f5c8 +#define ICON_FA_FAN "\xef\xa1\xa3" // U+f863 +#define ICON_FA_FAUCET "\xee\x80\x85" // U+e005 +#define ICON_FA_FAUCET_DRIP "\xee\x80\x86" // U+e006 +#define ICON_FA_FAX "\xef\x86\xac" // U+f1ac +#define ICON_FA_FEATHER "\xef\x94\xad" // U+f52d +#define ICON_FA_FEATHER_POINTED "\xef\x95\xab" // U+f56b +#define ICON_FA_FERRY "\xee\x93\xaa" // U+e4ea +#define ICON_FA_FILE "\xef\x85\x9b" // U+f15b +#define ICON_FA_FILE_ARROW_DOWN "\xef\x95\xad" // U+f56d +#define ICON_FA_FILE_ARROW_UP "\xef\x95\xb4" // U+f574 +#define ICON_FA_FILE_AUDIO "\xef\x87\x87" // U+f1c7 +#define ICON_FA_FILE_CIRCLE_CHECK "\xee\x96\xa0" // U+e5a0 +#define ICON_FA_FILE_CIRCLE_EXCLAMATION "\xee\x93\xab" // U+e4eb +#define ICON_FA_FILE_CIRCLE_MINUS "\xee\x93\xad" // U+e4ed +#define ICON_FA_FILE_CIRCLE_PLUS "\xee\x92\x94" // U+e494 +#define ICON_FA_FILE_CIRCLE_QUESTION "\xee\x93\xaf" // U+e4ef +#define ICON_FA_FILE_CIRCLE_XMARK "\xee\x96\xa1" // U+e5a1 +#define ICON_FA_FILE_CODE "\xef\x87\x89" // U+f1c9 +#define ICON_FA_FILE_CONTRACT "\xef\x95\xac" // U+f56c +#define ICON_FA_FILE_CSV "\xef\x9b\x9d" // U+f6dd +#define ICON_FA_FILE_EXCEL "\xef\x87\x83" // U+f1c3 +#define ICON_FA_FILE_EXPORT "\xef\x95\xae" // U+f56e +#define ICON_FA_FILE_IMAGE "\xef\x87\x85" // U+f1c5 +#define ICON_FA_FILE_IMPORT "\xef\x95\xaf" // U+f56f +#define ICON_FA_FILE_INVOICE "\xef\x95\xb0" // U+f570 +#define ICON_FA_FILE_INVOICE_DOLLAR "\xef\x95\xb1" // U+f571 +#define ICON_FA_FILE_LINES "\xef\x85\x9c" // U+f15c +#define ICON_FA_FILE_MEDICAL "\xef\x91\xb7" // U+f477 +#define ICON_FA_FILE_PDF "\xef\x87\x81" // U+f1c1 +#define ICON_FA_FILE_PEN "\xef\x8c\x9c" // U+f31c +#define ICON_FA_FILE_POWERPOINT "\xef\x87\x84" // U+f1c4 +#define ICON_FA_FILE_PRESCRIPTION "\xef\x95\xb2" // U+f572 +#define ICON_FA_FILE_SHIELD "\xee\x93\xb0" // U+e4f0 +#define ICON_FA_FILE_SIGNATURE "\xef\x95\xb3" // U+f573 +#define ICON_FA_FILE_VIDEO "\xef\x87\x88" // U+f1c8 +#define ICON_FA_FILE_WAVEFORM "\xef\x91\xb8" // U+f478 +#define ICON_FA_FILE_WORD "\xef\x87\x82" // U+f1c2 +#define ICON_FA_FILE_ZIPPER "\xef\x87\x86" // U+f1c6 +#define ICON_FA_FILL "\xef\x95\xb5" // U+f575 +#define ICON_FA_FILL_DRIP "\xef\x95\xb6" // U+f576 +#define ICON_FA_FILM "\xef\x80\x88" // U+f008 +#define ICON_FA_FILTER "\xef\x82\xb0" // U+f0b0 +#define ICON_FA_FILTER_CIRCLE_DOLLAR "\xef\x99\xa2" // U+f662 +#define ICON_FA_FILTER_CIRCLE_XMARK "\xee\x85\xbb" // U+e17b +#define ICON_FA_FINGERPRINT "\xef\x95\xb7" // U+f577 +#define ICON_FA_FIRE "\xef\x81\xad" // U+f06d +#define ICON_FA_FIRE_BURNER "\xee\x93\xb1" // U+e4f1 +#define ICON_FA_FIRE_EXTINGUISHER "\xef\x84\xb4" // U+f134 +#define ICON_FA_FIRE_FLAME_CURVED "\xef\x9f\xa4" // U+f7e4 +#define ICON_FA_FIRE_FLAME_SIMPLE "\xef\x91\xaa" // U+f46a +#define ICON_FA_FISH "\xef\x95\xb8" // U+f578 +#define ICON_FA_FISH_FINS "\xee\x93\xb2" // U+e4f2 +#define ICON_FA_FLAG "\xef\x80\xa4" // U+f024 +#define ICON_FA_FLAG_CHECKERED "\xef\x84\x9e" // U+f11e +#define ICON_FA_FLAG_USA "\xef\x9d\x8d" // U+f74d +#define ICON_FA_FLASK "\xef\x83\x83" // U+f0c3 +#define ICON_FA_FLASK_VIAL "\xee\x93\xb3" // U+e4f3 +#define ICON_FA_FLOPPY_DISK "\xef\x83\x87" // U+f0c7 +#define ICON_FA_FLORIN_SIGN "\xee\x86\x84" // U+e184 +#define ICON_FA_FOLDER "\xef\x81\xbb" // U+f07b +#define ICON_FA_FOLDER_CLOSED "\xee\x86\x85" // U+e185 +#define ICON_FA_FOLDER_MINUS "\xef\x99\x9d" // U+f65d +#define ICON_FA_FOLDER_OPEN "\xef\x81\xbc" // U+f07c +#define ICON_FA_FOLDER_PLUS "\xef\x99\x9e" // U+f65e +#define ICON_FA_FOLDER_TREE "\xef\xa0\x82" // U+f802 +#define ICON_FA_FONT "\xef\x80\xb1" // U+f031 +#define ICON_FA_FONT_AWESOME "\xef\x8a\xb4" // U+f2b4 +#define ICON_FA_FOOTBALL "\xef\x91\x8e" // U+f44e +#define ICON_FA_FORWARD "\xef\x81\x8e" // U+f04e +#define ICON_FA_FORWARD_FAST "\xef\x81\x90" // U+f050 +#define ICON_FA_FORWARD_STEP "\xef\x81\x91" // U+f051 +#define ICON_FA_FRANC_SIGN "\xee\x86\x8f" // U+e18f +#define ICON_FA_FROG "\xef\x94\xae" // U+f52e +#define ICON_FA_FUTBOL "\xef\x87\xa3" // U+f1e3 +#define ICON_FA_G "G" // U+0047 +#define ICON_FA_GAMEPAD "\xef\x84\x9b" // U+f11b +#define ICON_FA_GAS_PUMP "\xef\x94\xaf" // U+f52f +#define ICON_FA_GAUGE "\xef\x98\xa4" // U+f624 +#define ICON_FA_GAUGE_HIGH "\xef\x98\xa5" // U+f625 +#define ICON_FA_GAUGE_SIMPLE "\xef\x98\xa9" // U+f629 +#define ICON_FA_GAUGE_SIMPLE_HIGH "\xef\x98\xaa" // U+f62a +#define ICON_FA_GAVEL "\xef\x83\xa3" // U+f0e3 +#define ICON_FA_GEAR "\xef\x80\x93" // U+f013 +#define ICON_FA_GEARS "\xef\x82\x85" // U+f085 +#define ICON_FA_GEM "\xef\x8e\xa5" // U+f3a5 +#define ICON_FA_GENDERLESS "\xef\x88\xad" // U+f22d +#define ICON_FA_GHOST "\xef\x9b\xa2" // U+f6e2 +#define ICON_FA_GIFT "\xef\x81\xab" // U+f06b +#define ICON_FA_GIFTS "\xef\x9e\x9c" // U+f79c +#define ICON_FA_GLASS_WATER "\xee\x93\xb4" // U+e4f4 +#define ICON_FA_GLASS_WATER_DROPLET "\xee\x93\xb5" // U+e4f5 +#define ICON_FA_GLASSES "\xef\x94\xb0" // U+f530 +#define ICON_FA_GLOBE "\xef\x82\xac" // U+f0ac +#define ICON_FA_GOLF_BALL_TEE "\xef\x91\x90" // U+f450 +#define ICON_FA_GOPURAM "\xef\x99\xa4" // U+f664 +#define ICON_FA_GRADUATION_CAP "\xef\x86\x9d" // U+f19d +#define ICON_FA_GREATER_THAN ">" // U+003e +#define ICON_FA_GREATER_THAN_EQUAL "\xef\x94\xb2" // U+f532 +#define ICON_FA_GRIP "\xef\x96\x8d" // U+f58d +#define ICON_FA_GRIP_LINES "\xef\x9e\xa4" // U+f7a4 +#define ICON_FA_GRIP_LINES_VERTICAL "\xef\x9e\xa5" // U+f7a5 +#define ICON_FA_GRIP_VERTICAL "\xef\x96\x8e" // U+f58e +#define ICON_FA_GROUP_ARROWS_ROTATE "\xee\x93\xb6" // U+e4f6 +#define ICON_FA_GUARANI_SIGN "\xee\x86\x9a" // U+e19a +#define ICON_FA_GUITAR "\xef\x9e\xa6" // U+f7a6 +#define ICON_FA_GUN "\xee\x86\x9b" // U+e19b +#define ICON_FA_H "H" // U+0048 +#define ICON_FA_HAMMER "\xef\x9b\xa3" // U+f6e3 +#define ICON_FA_HAMSA "\xef\x99\xa5" // U+f665 +#define ICON_FA_HAND "\xef\x89\x96" // U+f256 +#define ICON_FA_HAND_BACK_FIST "\xef\x89\x95" // U+f255 +#define ICON_FA_HAND_DOTS "\xef\x91\xa1" // U+f461 +#define ICON_FA_HAND_FIST "\xef\x9b\x9e" // U+f6de +#define ICON_FA_HAND_HOLDING "\xef\x92\xbd" // U+f4bd +#define ICON_FA_HAND_HOLDING_DOLLAR "\xef\x93\x80" // U+f4c0 +#define ICON_FA_HAND_HOLDING_DROPLET "\xef\x93\x81" // U+f4c1 +#define ICON_FA_HAND_HOLDING_HAND "\xee\x93\xb7" // U+e4f7 +#define ICON_FA_HAND_HOLDING_HEART "\xef\x92\xbe" // U+f4be +#define ICON_FA_HAND_HOLDING_MEDICAL "\xee\x81\x9c" // U+e05c +#define ICON_FA_HAND_LIZARD "\xef\x89\x98" // U+f258 +#define ICON_FA_HAND_MIDDLE_FINGER "\xef\xa0\x86" // U+f806 +#define ICON_FA_HAND_PEACE "\xef\x89\x9b" // U+f25b +#define ICON_FA_HAND_POINT_DOWN "\xef\x82\xa7" // U+f0a7 +#define ICON_FA_HAND_POINT_LEFT "\xef\x82\xa5" // U+f0a5 +#define ICON_FA_HAND_POINT_RIGHT "\xef\x82\xa4" // U+f0a4 +#define ICON_FA_HAND_POINT_UP "\xef\x82\xa6" // U+f0a6 +#define ICON_FA_HAND_POINTER "\xef\x89\x9a" // U+f25a +#define ICON_FA_HAND_SCISSORS "\xef\x89\x97" // U+f257 +#define ICON_FA_HAND_SPARKLES "\xee\x81\x9d" // U+e05d +#define ICON_FA_HAND_SPOCK "\xef\x89\x99" // U+f259 +#define ICON_FA_HANDCUFFS "\xee\x93\xb8" // U+e4f8 +#define ICON_FA_HANDS "\xef\x8a\xa7" // U+f2a7 +#define ICON_FA_HANDS_ASL_INTERPRETING "\xef\x8a\xa3" // U+f2a3 +#define ICON_FA_HANDS_BOUND "\xee\x93\xb9" // U+e4f9 +#define ICON_FA_HANDS_BUBBLES "\xee\x81\x9e" // U+e05e +#define ICON_FA_HANDS_CLAPPING "\xee\x86\xa8" // U+e1a8 +#define ICON_FA_HANDS_HOLDING "\xef\x93\x82" // U+f4c2 +#define ICON_FA_HANDS_HOLDING_CHILD "\xee\x93\xba" // U+e4fa +#define ICON_FA_HANDS_HOLDING_CIRCLE "\xee\x93\xbb" // U+e4fb +#define ICON_FA_HANDS_PRAYING "\xef\x9a\x84" // U+f684 +#define ICON_FA_HANDSHAKE "\xef\x8a\xb5" // U+f2b5 +#define ICON_FA_HANDSHAKE_ANGLE "\xef\x93\x84" // U+f4c4 +#define ICON_FA_HANDSHAKE_SIMPLE "\xef\x93\x86" // U+f4c6 +#define ICON_FA_HANDSHAKE_SIMPLE_SLASH "\xee\x81\x9f" // U+e05f +#define ICON_FA_HANDSHAKE_SLASH "\xee\x81\xa0" // U+e060 +#define ICON_FA_HANUKIAH "\xef\x9b\xa6" // U+f6e6 +#define ICON_FA_HARD_DRIVE "\xef\x82\xa0" // U+f0a0 +#define ICON_FA_HASHTAG "#" // U+0023 +#define ICON_FA_HAT_COWBOY "\xef\xa3\x80" // U+f8c0 +#define ICON_FA_HAT_COWBOY_SIDE "\xef\xa3\x81" // U+f8c1 +#define ICON_FA_HAT_WIZARD "\xef\x9b\xa8" // U+f6e8 +#define ICON_FA_HEAD_SIDE_COUGH "\xee\x81\xa1" // U+e061 +#define ICON_FA_HEAD_SIDE_COUGH_SLASH "\xee\x81\xa2" // U+e062 +#define ICON_FA_HEAD_SIDE_MASK "\xee\x81\xa3" // U+e063 +#define ICON_FA_HEAD_SIDE_VIRUS "\xee\x81\xa4" // U+e064 +#define ICON_FA_HEADING "\xef\x87\x9c" // U+f1dc +#define ICON_FA_HEADPHONES "\xef\x80\xa5" // U+f025 +#define ICON_FA_HEADPHONES_SIMPLE "\xef\x96\x8f" // U+f58f +#define ICON_FA_HEADSET "\xef\x96\x90" // U+f590 +#define ICON_FA_HEART "\xef\x80\x84" // U+f004 +#define ICON_FA_HEART_CIRCLE_BOLT "\xee\x93\xbc" // U+e4fc +#define ICON_FA_HEART_CIRCLE_CHECK "\xee\x93\xbd" // U+e4fd +#define ICON_FA_HEART_CIRCLE_EXCLAMATION "\xee\x93\xbe" // U+e4fe +#define ICON_FA_HEART_CIRCLE_MINUS "\xee\x93\xbf" // U+e4ff +#define ICON_FA_HEART_CIRCLE_PLUS "\xee\x94\x80" // U+e500 +#define ICON_FA_HEART_CIRCLE_XMARK "\xee\x94\x81" // U+e501 +#define ICON_FA_HEART_CRACK "\xef\x9e\xa9" // U+f7a9 +#define ICON_FA_HEART_PULSE "\xef\x88\x9e" // U+f21e +#define ICON_FA_HELICOPTER "\xef\x94\xb3" // U+f533 +#define ICON_FA_HELICOPTER_SYMBOL "\xee\x94\x82" // U+e502 +#define ICON_FA_HELMET_SAFETY "\xef\xa0\x87" // U+f807 +#define ICON_FA_HELMET_UN "\xee\x94\x83" // U+e503 +#define ICON_FA_HIGHLIGHTER "\xef\x96\x91" // U+f591 +#define ICON_FA_HILL_AVALANCHE "\xee\x94\x87" // U+e507 +#define ICON_FA_HILL_ROCKSLIDE "\xee\x94\x88" // U+e508 +#define ICON_FA_HIPPO "\xef\x9b\xad" // U+f6ed +#define ICON_FA_HOCKEY_PUCK "\xef\x91\x93" // U+f453 +#define ICON_FA_HOLLY_BERRY "\xef\x9e\xaa" // U+f7aa +#define ICON_FA_HORSE "\xef\x9b\xb0" // U+f6f0 +#define ICON_FA_HORSE_HEAD "\xef\x9e\xab" // U+f7ab +#define ICON_FA_HOSPITAL "\xef\x83\xb8" // U+f0f8 +#define ICON_FA_HOSPITAL_USER "\xef\xa0\x8d" // U+f80d +#define ICON_FA_HOT_TUB_PERSON "\xef\x96\x93" // U+f593 +#define ICON_FA_HOTDOG "\xef\xa0\x8f" // U+f80f +#define ICON_FA_HOTEL "\xef\x96\x94" // U+f594 +#define ICON_FA_HOURGLASS "\xef\x89\x94" // U+f254 +#define ICON_FA_HOURGLASS_END "\xef\x89\x93" // U+f253 +#define ICON_FA_HOURGLASS_HALF "\xef\x89\x92" // U+f252 +#define ICON_FA_HOURGLASS_START "\xef\x89\x91" // U+f251 +#define ICON_FA_HOUSE "\xef\x80\x95" // U+f015 +#define ICON_FA_HOUSE_CHIMNEY "\xee\x8e\xaf" // U+e3af +#define ICON_FA_HOUSE_CHIMNEY_CRACK "\xef\x9b\xb1" // U+f6f1 +#define ICON_FA_HOUSE_CHIMNEY_MEDICAL "\xef\x9f\xb2" // U+f7f2 +#define ICON_FA_HOUSE_CHIMNEY_USER "\xee\x81\xa5" // U+e065 +#define ICON_FA_HOUSE_CHIMNEY_WINDOW "\xee\x80\x8d" // U+e00d +#define ICON_FA_HOUSE_CIRCLE_CHECK "\xee\x94\x89" // U+e509 +#define ICON_FA_HOUSE_CIRCLE_EXCLAMATION "\xee\x94\x8a" // U+e50a +#define ICON_FA_HOUSE_CIRCLE_XMARK "\xee\x94\x8b" // U+e50b +#define ICON_FA_HOUSE_CRACK "\xee\x8e\xb1" // U+e3b1 +#define ICON_FA_HOUSE_FIRE "\xee\x94\x8c" // U+e50c +#define ICON_FA_HOUSE_FLAG "\xee\x94\x8d" // U+e50d +#define ICON_FA_HOUSE_FLOOD_WATER "\xee\x94\x8e" // U+e50e +#define ICON_FA_HOUSE_FLOOD_WATER_CIRCLE_ARROW_RIGHT "\xee\x94\x8f" // U+e50f +#define ICON_FA_HOUSE_LAPTOP "\xee\x81\xa6" // U+e066 +#define ICON_FA_HOUSE_LOCK "\xee\x94\x90" // U+e510 +#define ICON_FA_HOUSE_MEDICAL "\xee\x8e\xb2" // U+e3b2 +#define ICON_FA_HOUSE_MEDICAL_CIRCLE_CHECK "\xee\x94\x91" // U+e511 +#define ICON_FA_HOUSE_MEDICAL_CIRCLE_EXCLAMATION "\xee\x94\x92" // U+e512 +#define ICON_FA_HOUSE_MEDICAL_CIRCLE_XMARK "\xee\x94\x93" // U+e513 +#define ICON_FA_HOUSE_MEDICAL_FLAG "\xee\x94\x94" // U+e514 +#define ICON_FA_HOUSE_SIGNAL "\xee\x80\x92" // U+e012 +#define ICON_FA_HOUSE_TSUNAMI "\xee\x94\x95" // U+e515 +#define ICON_FA_HOUSE_USER "\xee\x86\xb0" // U+e1b0 +#define ICON_FA_HRYVNIA_SIGN "\xef\x9b\xb2" // U+f6f2 +#define ICON_FA_HURRICANE "\xef\x9d\x91" // U+f751 +#define ICON_FA_I "I" // U+0049 +#define ICON_FA_I_CURSOR "\xef\x89\x86" // U+f246 +#define ICON_FA_ICE_CREAM "\xef\xa0\x90" // U+f810 +#define ICON_FA_ICICLES "\xef\x9e\xad" // U+f7ad +#define ICON_FA_ICONS "\xef\xa1\xad" // U+f86d +#define ICON_FA_ID_BADGE "\xef\x8b\x81" // U+f2c1 +#define ICON_FA_ID_CARD "\xef\x8b\x82" // U+f2c2 +#define ICON_FA_ID_CARD_CLIP "\xef\x91\xbf" // U+f47f +#define ICON_FA_IGLOO "\xef\x9e\xae" // U+f7ae +#define ICON_FA_IMAGE "\xef\x80\xbe" // U+f03e +#define ICON_FA_IMAGE_PORTRAIT "\xef\x8f\xa0" // U+f3e0 +#define ICON_FA_IMAGES "\xef\x8c\x82" // U+f302 +#define ICON_FA_INBOX "\xef\x80\x9c" // U+f01c +#define ICON_FA_INDENT "\xef\x80\xbc" // U+f03c +#define ICON_FA_INDIAN_RUPEE_SIGN "\xee\x86\xbc" // U+e1bc +#define ICON_FA_INDUSTRY "\xef\x89\xb5" // U+f275 +#define ICON_FA_INFINITY "\xef\x94\xb4" // U+f534 +#define ICON_FA_INFO "\xef\x84\xa9" // U+f129 +#define ICON_FA_ITALIC "\xef\x80\xb3" // U+f033 +#define ICON_FA_J "J" // U+004a +#define ICON_FA_JAR "\xee\x94\x96" // U+e516 +#define ICON_FA_JAR_WHEAT "\xee\x94\x97" // U+e517 +#define ICON_FA_JEDI "\xef\x99\xa9" // U+f669 +#define ICON_FA_JET_FIGHTER "\xef\x83\xbb" // U+f0fb +#define ICON_FA_JET_FIGHTER_UP "\xee\x94\x98" // U+e518 +#define ICON_FA_JOINT "\xef\x96\x95" // U+f595 +#define ICON_FA_JUG_DETERGENT "\xee\x94\x99" // U+e519 +#define ICON_FA_K "K" // U+004b +#define ICON_FA_KAABA "\xef\x99\xab" // U+f66b +#define ICON_FA_KEY "\xef\x82\x84" // U+f084 +#define ICON_FA_KEYBOARD "\xef\x84\x9c" // U+f11c +#define ICON_FA_KHANDA "\xef\x99\xad" // U+f66d +#define ICON_FA_KIP_SIGN "\xee\x87\x84" // U+e1c4 +#define ICON_FA_KIT_MEDICAL "\xef\x91\xb9" // U+f479 +#define ICON_FA_KITCHEN_SET "\xee\x94\x9a" // U+e51a +#define ICON_FA_KIWI_BIRD "\xef\x94\xb5" // U+f535 +#define ICON_FA_L "L" // U+004c +#define ICON_FA_LAND_MINE_ON "\xee\x94\x9b" // U+e51b +#define ICON_FA_LANDMARK "\xef\x99\xaf" // U+f66f +#define ICON_FA_LANDMARK_DOME "\xef\x9d\x92" // U+f752 +#define ICON_FA_LANDMARK_FLAG "\xee\x94\x9c" // U+e51c +#define ICON_FA_LANGUAGE "\xef\x86\xab" // U+f1ab +#define ICON_FA_LAPTOP "\xef\x84\x89" // U+f109 +#define ICON_FA_LAPTOP_CODE "\xef\x97\xbc" // U+f5fc +#define ICON_FA_LAPTOP_FILE "\xee\x94\x9d" // U+e51d +#define ICON_FA_LAPTOP_MEDICAL "\xef\xa0\x92" // U+f812 +#define ICON_FA_LARI_SIGN "\xee\x87\x88" // U+e1c8 +#define ICON_FA_LAYER_GROUP "\xef\x97\xbd" // U+f5fd +#define ICON_FA_LEAF "\xef\x81\xac" // U+f06c +#define ICON_FA_LEFT_LONG "\xef\x8c\x8a" // U+f30a +#define ICON_FA_LEFT_RIGHT "\xef\x8c\xb7" // U+f337 +#define ICON_FA_LEMON "\xef\x82\x94" // U+f094 +#define ICON_FA_LESS_THAN "<" // U+003c +#define ICON_FA_LESS_THAN_EQUAL "\xef\x94\xb7" // U+f537 +#define ICON_FA_LIFE_RING "\xef\x87\x8d" // U+f1cd +#define ICON_FA_LIGHTBULB "\xef\x83\xab" // U+f0eb +#define ICON_FA_LINES_LEANING "\xee\x94\x9e" // U+e51e +#define ICON_FA_LINK "\xef\x83\x81" // U+f0c1 +#define ICON_FA_LINK_SLASH "\xef\x84\xa7" // U+f127 +#define ICON_FA_LIRA_SIGN "\xef\x86\x95" // U+f195 +#define ICON_FA_LIST "\xef\x80\xba" // U+f03a +#define ICON_FA_LIST_CHECK "\xef\x82\xae" // U+f0ae +#define ICON_FA_LIST_OL "\xef\x83\x8b" // U+f0cb +#define ICON_FA_LIST_UL "\xef\x83\x8a" // U+f0ca +#define ICON_FA_LITECOIN_SIGN "\xee\x87\x93" // U+e1d3 +#define ICON_FA_LOCATION_ARROW "\xef\x84\xa4" // U+f124 +#define ICON_FA_LOCATION_CROSSHAIRS "\xef\x98\x81" // U+f601 +#define ICON_FA_LOCATION_DOT "\xef\x8f\x85" // U+f3c5 +#define ICON_FA_LOCATION_PIN "\xef\x81\x81" // U+f041 +#define ICON_FA_LOCATION_PIN_LOCK "\xee\x94\x9f" // U+e51f +#define ICON_FA_LOCK "\xef\x80\xa3" // U+f023 +#define ICON_FA_LOCK_OPEN "\xef\x8f\x81" // U+f3c1 +#define ICON_FA_LOCUST "\xee\x94\xa0" // U+e520 +#define ICON_FA_LUNGS "\xef\x98\x84" // U+f604 +#define ICON_FA_LUNGS_VIRUS "\xee\x81\xa7" // U+e067 +#define ICON_FA_M "M" // U+004d +#define ICON_FA_MAGNET "\xef\x81\xb6" // U+f076 +#define ICON_FA_MAGNIFYING_GLASS "\xef\x80\x82" // U+f002 +#define ICON_FA_MAGNIFYING_GLASS_ARROW_RIGHT "\xee\x94\xa1" // U+e521 +#define ICON_FA_MAGNIFYING_GLASS_CHART "\xee\x94\xa2" // U+e522 +#define ICON_FA_MAGNIFYING_GLASS_DOLLAR "\xef\x9a\x88" // U+f688 +#define ICON_FA_MAGNIFYING_GLASS_LOCATION "\xef\x9a\x89" // U+f689 +#define ICON_FA_MAGNIFYING_GLASS_MINUS "\xef\x80\x90" // U+f010 +#define ICON_FA_MAGNIFYING_GLASS_PLUS "\xef\x80\x8e" // U+f00e +#define ICON_FA_MANAT_SIGN "\xee\x87\x95" // U+e1d5 +#define ICON_FA_MAP "\xef\x89\xb9" // U+f279 +#define ICON_FA_MAP_LOCATION "\xef\x96\x9f" // U+f59f +#define ICON_FA_MAP_LOCATION_DOT "\xef\x96\xa0" // U+f5a0 +#define ICON_FA_MAP_PIN "\xef\x89\xb6" // U+f276 +#define ICON_FA_MARKER "\xef\x96\xa1" // U+f5a1 +#define ICON_FA_MARS "\xef\x88\xa2" // U+f222 +#define ICON_FA_MARS_AND_VENUS "\xef\x88\xa4" // U+f224 +#define ICON_FA_MARS_AND_VENUS_BURST "\xee\x94\xa3" // U+e523 +#define ICON_FA_MARS_DOUBLE "\xef\x88\xa7" // U+f227 +#define ICON_FA_MARS_STROKE "\xef\x88\xa9" // U+f229 +#define ICON_FA_MARS_STROKE_RIGHT "\xef\x88\xab" // U+f22b +#define ICON_FA_MARS_STROKE_UP "\xef\x88\xaa" // U+f22a +#define ICON_FA_MARTINI_GLASS "\xef\x95\xbb" // U+f57b +#define ICON_FA_MARTINI_GLASS_CITRUS "\xef\x95\xa1" // U+f561 +#define ICON_FA_MARTINI_GLASS_EMPTY "\xef\x80\x80" // U+f000 +#define ICON_FA_MASK "\xef\x9b\xba" // U+f6fa +#define ICON_FA_MASK_FACE "\xee\x87\x97" // U+e1d7 +#define ICON_FA_MASK_VENTILATOR "\xee\x94\xa4" // U+e524 +#define ICON_FA_MASKS_THEATER "\xef\x98\xb0" // U+f630 +#define ICON_FA_MATTRESS_PILLOW "\xee\x94\xa5" // U+e525 +#define ICON_FA_MAXIMIZE "\xef\x8c\x9e" // U+f31e +#define ICON_FA_MEDAL "\xef\x96\xa2" // U+f5a2 +#define ICON_FA_MEMORY "\xef\x94\xb8" // U+f538 +#define ICON_FA_MENORAH "\xef\x99\xb6" // U+f676 +#define ICON_FA_MERCURY "\xef\x88\xa3" // U+f223 +#define ICON_FA_MESSAGE "\xef\x89\xba" // U+f27a +#define ICON_FA_METEOR "\xef\x9d\x93" // U+f753 +#define ICON_FA_MICROCHIP "\xef\x8b\x9b" // U+f2db +#define ICON_FA_MICROPHONE "\xef\x84\xb0" // U+f130 +#define ICON_FA_MICROPHONE_LINES "\xef\x8f\x89" // U+f3c9 +#define ICON_FA_MICROPHONE_LINES_SLASH "\xef\x94\xb9" // U+f539 +#define ICON_FA_MICROPHONE_SLASH "\xef\x84\xb1" // U+f131 +#define ICON_FA_MICROSCOPE "\xef\x98\x90" // U+f610 +#define ICON_FA_MILL_SIGN "\xee\x87\xad" // U+e1ed +#define ICON_FA_MINIMIZE "\xef\x9e\x8c" // U+f78c +#define ICON_FA_MINUS "\xef\x81\xa8" // U+f068 +#define ICON_FA_MITTEN "\xef\x9e\xb5" // U+f7b5 +#define ICON_FA_MOBILE "\xef\x8f\x8e" // U+f3ce +#define ICON_FA_MOBILE_BUTTON "\xef\x84\x8b" // U+f10b +#define ICON_FA_MOBILE_RETRO "\xee\x94\xa7" // U+e527 +#define ICON_FA_MOBILE_SCREEN "\xef\x8f\x8f" // U+f3cf +#define ICON_FA_MOBILE_SCREEN_BUTTON "\xef\x8f\x8d" // U+f3cd +#define ICON_FA_MONEY_BILL "\xef\x83\x96" // U+f0d6 +#define ICON_FA_MONEY_BILL_1 "\xef\x8f\x91" // U+f3d1 +#define ICON_FA_MONEY_BILL_1_WAVE "\xef\x94\xbb" // U+f53b +#define ICON_FA_MONEY_BILL_TRANSFER "\xee\x94\xa8" // U+e528 +#define ICON_FA_MONEY_BILL_TREND_UP "\xee\x94\xa9" // U+e529 +#define ICON_FA_MONEY_BILL_WAVE "\xef\x94\xba" // U+f53a +#define ICON_FA_MONEY_BILL_WHEAT "\xee\x94\xaa" // U+e52a +#define ICON_FA_MONEY_BILLS "\xee\x87\xb3" // U+e1f3 +#define ICON_FA_MONEY_CHECK "\xef\x94\xbc" // U+f53c +#define ICON_FA_MONEY_CHECK_DOLLAR "\xef\x94\xbd" // U+f53d +#define ICON_FA_MONUMENT "\xef\x96\xa6" // U+f5a6 +#define ICON_FA_MOON "\xef\x86\x86" // U+f186 +#define ICON_FA_MORTAR_PESTLE "\xef\x96\xa7" // U+f5a7 +#define ICON_FA_MOSQUE "\xef\x99\xb8" // U+f678 +#define ICON_FA_MOSQUITO "\xee\x94\xab" // U+e52b +#define ICON_FA_MOSQUITO_NET "\xee\x94\xac" // U+e52c +#define ICON_FA_MOTORCYCLE "\xef\x88\x9c" // U+f21c +#define ICON_FA_MOUND "\xee\x94\xad" // U+e52d +#define ICON_FA_MOUNTAIN "\xef\x9b\xbc" // U+f6fc +#define ICON_FA_MOUNTAIN_CITY "\xee\x94\xae" // U+e52e +#define ICON_FA_MOUNTAIN_SUN "\xee\x94\xaf" // U+e52f +#define ICON_FA_MUG_HOT "\xef\x9e\xb6" // U+f7b6 +#define ICON_FA_MUG_SAUCER "\xef\x83\xb4" // U+f0f4 +#define ICON_FA_MUSIC "\xef\x80\x81" // U+f001 +#define ICON_FA_N "N" // U+004e +#define ICON_FA_NAIRA_SIGN "\xee\x87\xb6" // U+e1f6 +#define ICON_FA_NETWORK_WIRED "\xef\x9b\xbf" // U+f6ff +#define ICON_FA_NEUTER "\xef\x88\xac" // U+f22c +#define ICON_FA_NEWSPAPER "\xef\x87\xaa" // U+f1ea +#define ICON_FA_NOT_EQUAL "\xef\x94\xbe" // U+f53e +#define ICON_FA_NOTDEF "\xee\x87\xbe" // U+e1fe +#define ICON_FA_NOTE_STICKY "\xef\x89\x89" // U+f249 +#define ICON_FA_NOTES_MEDICAL "\xef\x92\x81" // U+f481 +#define ICON_FA_O "O" // U+004f +#define ICON_FA_OBJECT_GROUP "\xef\x89\x87" // U+f247 +#define ICON_FA_OBJECT_UNGROUP "\xef\x89\x88" // U+f248 +#define ICON_FA_OIL_CAN "\xef\x98\x93" // U+f613 +#define ICON_FA_OIL_WELL "\xee\x94\xb2" // U+e532 +#define ICON_FA_OM "\xef\x99\xb9" // U+f679 +#define ICON_FA_OTTER "\xef\x9c\x80" // U+f700 +#define ICON_FA_OUTDENT "\xef\x80\xbb" // U+f03b +#define ICON_FA_P "P" // U+0050 +#define ICON_FA_PAGER "\xef\xa0\x95" // U+f815 +#define ICON_FA_PAINT_ROLLER "\xef\x96\xaa" // U+f5aa +#define ICON_FA_PAINTBRUSH "\xef\x87\xbc" // U+f1fc +#define ICON_FA_PALETTE "\xef\x94\xbf" // U+f53f +#define ICON_FA_PALLET "\xef\x92\x82" // U+f482 +#define ICON_FA_PANORAMA "\xee\x88\x89" // U+e209 +#define ICON_FA_PAPER_PLANE "\xef\x87\x98" // U+f1d8 +#define ICON_FA_PAPERCLIP "\xef\x83\x86" // U+f0c6 +#define ICON_FA_PARACHUTE_BOX "\xef\x93\x8d" // U+f4cd +#define ICON_FA_PARAGRAPH "\xef\x87\x9d" // U+f1dd +#define ICON_FA_PASSPORT "\xef\x96\xab" // U+f5ab +#define ICON_FA_PASTE "\xef\x83\xaa" // U+f0ea +#define ICON_FA_PAUSE "\xef\x81\x8c" // U+f04c +#define ICON_FA_PAW "\xef\x86\xb0" // U+f1b0 +#define ICON_FA_PEACE "\xef\x99\xbc" // U+f67c +#define ICON_FA_PEN "\xef\x8c\x84" // U+f304 +#define ICON_FA_PEN_CLIP "\xef\x8c\x85" // U+f305 +#define ICON_FA_PEN_FANCY "\xef\x96\xac" // U+f5ac +#define ICON_FA_PEN_NIB "\xef\x96\xad" // U+f5ad +#define ICON_FA_PEN_RULER "\xef\x96\xae" // U+f5ae +#define ICON_FA_PEN_TO_SQUARE "\xef\x81\x84" // U+f044 +#define ICON_FA_PENCIL "\xef\x8c\x83" // U+f303 +#define ICON_FA_PEOPLE_ARROWS "\xee\x81\xa8" // U+e068 +#define ICON_FA_PEOPLE_CARRY_BOX "\xef\x93\x8e" // U+f4ce +#define ICON_FA_PEOPLE_GROUP "\xee\x94\xb3" // U+e533 +#define ICON_FA_PEOPLE_LINE "\xee\x94\xb4" // U+e534 +#define ICON_FA_PEOPLE_PULLING "\xee\x94\xb5" // U+e535 +#define ICON_FA_PEOPLE_ROBBERY "\xee\x94\xb6" // U+e536 +#define ICON_FA_PEOPLE_ROOF "\xee\x94\xb7" // U+e537 +#define ICON_FA_PEPPER_HOT "\xef\xa0\x96" // U+f816 +#define ICON_FA_PERCENT "%" // U+0025 +#define ICON_FA_PERSON "\xef\x86\x83" // U+f183 +#define ICON_FA_PERSON_ARROW_DOWN_TO_LINE "\xee\x94\xb8" // U+e538 +#define ICON_FA_PERSON_ARROW_UP_FROM_LINE "\xee\x94\xb9" // U+e539 +#define ICON_FA_PERSON_BIKING "\xef\xa1\x8a" // U+f84a +#define ICON_FA_PERSON_BOOTH "\xef\x9d\x96" // U+f756 +#define ICON_FA_PERSON_BREASTFEEDING "\xee\x94\xba" // U+e53a +#define ICON_FA_PERSON_BURST "\xee\x94\xbb" // U+e53b +#define ICON_FA_PERSON_CANE "\xee\x94\xbc" // U+e53c +#define ICON_FA_PERSON_CHALKBOARD "\xee\x94\xbd" // U+e53d +#define ICON_FA_PERSON_CIRCLE_CHECK "\xee\x94\xbe" // U+e53e +#define ICON_FA_PERSON_CIRCLE_EXCLAMATION "\xee\x94\xbf" // U+e53f +#define ICON_FA_PERSON_CIRCLE_MINUS "\xee\x95\x80" // U+e540 +#define ICON_FA_PERSON_CIRCLE_PLUS "\xee\x95\x81" // U+e541 +#define ICON_FA_PERSON_CIRCLE_QUESTION "\xee\x95\x82" // U+e542 +#define ICON_FA_PERSON_CIRCLE_XMARK "\xee\x95\x83" // U+e543 +#define ICON_FA_PERSON_DIGGING "\xef\xa1\x9e" // U+f85e +#define ICON_FA_PERSON_DOTS_FROM_LINE "\xef\x91\xb0" // U+f470 +#define ICON_FA_PERSON_DRESS "\xef\x86\x82" // U+f182 +#define ICON_FA_PERSON_DRESS_BURST "\xee\x95\x84" // U+e544 +#define ICON_FA_PERSON_DROWNING "\xee\x95\x85" // U+e545 +#define ICON_FA_PERSON_FALLING "\xee\x95\x86" // U+e546 +#define ICON_FA_PERSON_FALLING_BURST "\xee\x95\x87" // U+e547 +#define ICON_FA_PERSON_HALF_DRESS "\xee\x95\x88" // U+e548 +#define ICON_FA_PERSON_HARASSING "\xee\x95\x89" // U+e549 +#define ICON_FA_PERSON_HIKING "\xef\x9b\xac" // U+f6ec +#define ICON_FA_PERSON_MILITARY_POINTING "\xee\x95\x8a" // U+e54a +#define ICON_FA_PERSON_MILITARY_RIFLE "\xee\x95\x8b" // U+e54b +#define ICON_FA_PERSON_MILITARY_TO_PERSON "\xee\x95\x8c" // U+e54c +#define ICON_FA_PERSON_PRAYING "\xef\x9a\x83" // U+f683 +#define ICON_FA_PERSON_PREGNANT "\xee\x8c\x9e" // U+e31e +#define ICON_FA_PERSON_RAYS "\xee\x95\x8d" // U+e54d +#define ICON_FA_PERSON_RIFLE "\xee\x95\x8e" // U+e54e +#define ICON_FA_PERSON_RUNNING "\xef\x9c\x8c" // U+f70c +#define ICON_FA_PERSON_SHELTER "\xee\x95\x8f" // U+e54f +#define ICON_FA_PERSON_SKATING "\xef\x9f\x85" // U+f7c5 +#define ICON_FA_PERSON_SKIING "\xef\x9f\x89" // U+f7c9 +#define ICON_FA_PERSON_SKIING_NORDIC "\xef\x9f\x8a" // U+f7ca +#define ICON_FA_PERSON_SNOWBOARDING "\xef\x9f\x8e" // U+f7ce +#define ICON_FA_PERSON_SWIMMING "\xef\x97\x84" // U+f5c4 +#define ICON_FA_PERSON_THROUGH_WINDOW "\xee\x96\xa9" // U+e5a9 +#define ICON_FA_PERSON_WALKING "\xef\x95\x94" // U+f554 +#define ICON_FA_PERSON_WALKING_ARROW_LOOP_LEFT "\xee\x95\x91" // U+e551 +#define ICON_FA_PERSON_WALKING_ARROW_RIGHT "\xee\x95\x92" // U+e552 +#define ICON_FA_PERSON_WALKING_DASHED_LINE_ARROW_RIGHT "\xee\x95\x93" // U+e553 +#define ICON_FA_PERSON_WALKING_LUGGAGE "\xee\x95\x94" // U+e554 +#define ICON_FA_PERSON_WALKING_WITH_CANE "\xef\x8a\x9d" // U+f29d +#define ICON_FA_PESETA_SIGN "\xee\x88\xa1" // U+e221 +#define ICON_FA_PESO_SIGN "\xee\x88\xa2" // U+e222 +#define ICON_FA_PHONE "\xef\x82\x95" // U+f095 +#define ICON_FA_PHONE_FLIP "\xef\xa1\xb9" // U+f879 +#define ICON_FA_PHONE_SLASH "\xef\x8f\x9d" // U+f3dd +#define ICON_FA_PHONE_VOLUME "\xef\x8a\xa0" // U+f2a0 +#define ICON_FA_PHOTO_FILM "\xef\xa1\xbc" // U+f87c +#define ICON_FA_PIGGY_BANK "\xef\x93\x93" // U+f4d3 +#define ICON_FA_PILLS "\xef\x92\x84" // U+f484 +#define ICON_FA_PIZZA_SLICE "\xef\xa0\x98" // U+f818 +#define ICON_FA_PLACE_OF_WORSHIP "\xef\x99\xbf" // U+f67f +#define ICON_FA_PLANE "\xef\x81\xb2" // U+f072 +#define ICON_FA_PLANE_ARRIVAL "\xef\x96\xaf" // U+f5af +#define ICON_FA_PLANE_CIRCLE_CHECK "\xee\x95\x95" // U+e555 +#define ICON_FA_PLANE_CIRCLE_EXCLAMATION "\xee\x95\x96" // U+e556 +#define ICON_FA_PLANE_CIRCLE_XMARK "\xee\x95\x97" // U+e557 +#define ICON_FA_PLANE_DEPARTURE "\xef\x96\xb0" // U+f5b0 +#define ICON_FA_PLANE_LOCK "\xee\x95\x98" // U+e558 +#define ICON_FA_PLANE_SLASH "\xee\x81\xa9" // U+e069 +#define ICON_FA_PLANE_UP "\xee\x88\xad" // U+e22d +#define ICON_FA_PLANT_WILT "\xee\x96\xaa" // U+e5aa +#define ICON_FA_PLATE_WHEAT "\xee\x95\x9a" // U+e55a +#define ICON_FA_PLAY "\xef\x81\x8b" // U+f04b +#define ICON_FA_PLUG "\xef\x87\xa6" // U+f1e6 +#define ICON_FA_PLUG_CIRCLE_BOLT "\xee\x95\x9b" // U+e55b +#define ICON_FA_PLUG_CIRCLE_CHECK "\xee\x95\x9c" // U+e55c +#define ICON_FA_PLUG_CIRCLE_EXCLAMATION "\xee\x95\x9d" // U+e55d +#define ICON_FA_PLUG_CIRCLE_MINUS "\xee\x95\x9e" // U+e55e +#define ICON_FA_PLUG_CIRCLE_PLUS "\xee\x95\x9f" // U+e55f +#define ICON_FA_PLUG_CIRCLE_XMARK "\xee\x95\xa0" // U+e560 +#define ICON_FA_PLUS "+" // U+002b +#define ICON_FA_PLUS_MINUS "\xee\x90\xbc" // U+e43c +#define ICON_FA_PODCAST "\xef\x8b\x8e" // U+f2ce +#define ICON_FA_POO "\xef\x8b\xbe" // U+f2fe +#define ICON_FA_POO_STORM "\xef\x9d\x9a" // U+f75a +#define ICON_FA_POOP "\xef\x98\x99" // U+f619 +#define ICON_FA_POWER_OFF "\xef\x80\x91" // U+f011 +#define ICON_FA_PRESCRIPTION "\xef\x96\xb1" // U+f5b1 +#define ICON_FA_PRESCRIPTION_BOTTLE "\xef\x92\x85" // U+f485 +#define ICON_FA_PRESCRIPTION_BOTTLE_MEDICAL "\xef\x92\x86" // U+f486 +#define ICON_FA_PRINT "\xef\x80\xaf" // U+f02f +#define ICON_FA_PUMP_MEDICAL "\xee\x81\xaa" // U+e06a +#define ICON_FA_PUMP_SOAP "\xee\x81\xab" // U+e06b +#define ICON_FA_PUZZLE_PIECE "\xef\x84\xae" // U+f12e +#define ICON_FA_Q "Q" // U+0051 +#define ICON_FA_QRCODE "\xef\x80\xa9" // U+f029 +#define ICON_FA_QUESTION "?" // U+003f +#define ICON_FA_QUOTE_LEFT "\xef\x84\x8d" // U+f10d +#define ICON_FA_QUOTE_RIGHT "\xef\x84\x8e" // U+f10e +#define ICON_FA_R "R" // U+0052 +#define ICON_FA_RADIATION "\xef\x9e\xb9" // U+f7b9 +#define ICON_FA_RADIO "\xef\xa3\x97" // U+f8d7 +#define ICON_FA_RAINBOW "\xef\x9d\x9b" // U+f75b +#define ICON_FA_RANKING_STAR "\xee\x95\xa1" // U+e561 +#define ICON_FA_RECEIPT "\xef\x95\x83" // U+f543 +#define ICON_FA_RECORD_VINYL "\xef\xa3\x99" // U+f8d9 +#define ICON_FA_RECTANGLE_AD "\xef\x99\x81" // U+f641 +#define ICON_FA_RECTANGLE_LIST "\xef\x80\xa2" // U+f022 +#define ICON_FA_RECTANGLE_XMARK "\xef\x90\x90" // U+f410 +#define ICON_FA_RECYCLE "\xef\x86\xb8" // U+f1b8 +#define ICON_FA_REGISTERED "\xef\x89\x9d" // U+f25d +#define ICON_FA_REPEAT "\xef\x8d\xa3" // U+f363 +#define ICON_FA_REPLY "\xef\x8f\xa5" // U+f3e5 +#define ICON_FA_REPLY_ALL "\xef\x84\xa2" // U+f122 +#define ICON_FA_REPUBLICAN "\xef\x9d\x9e" // U+f75e +#define ICON_FA_RESTROOM "\xef\x9e\xbd" // U+f7bd +#define ICON_FA_RETWEET "\xef\x81\xb9" // U+f079 +#define ICON_FA_RIBBON "\xef\x93\x96" // U+f4d6 +#define ICON_FA_RIGHT_FROM_BRACKET "\xef\x8b\xb5" // U+f2f5 +#define ICON_FA_RIGHT_LEFT "\xef\x8d\xa2" // U+f362 +#define ICON_FA_RIGHT_LONG "\xef\x8c\x8b" // U+f30b +#define ICON_FA_RIGHT_TO_BRACKET "\xef\x8b\xb6" // U+f2f6 +#define ICON_FA_RING "\xef\x9c\x8b" // U+f70b +#define ICON_FA_ROAD "\xef\x80\x98" // U+f018 +#define ICON_FA_ROAD_BARRIER "\xee\x95\xa2" // U+e562 +#define ICON_FA_ROAD_BRIDGE "\xee\x95\xa3" // U+e563 +#define ICON_FA_ROAD_CIRCLE_CHECK "\xee\x95\xa4" // U+e564 +#define ICON_FA_ROAD_CIRCLE_EXCLAMATION "\xee\x95\xa5" // U+e565 +#define ICON_FA_ROAD_CIRCLE_XMARK "\xee\x95\xa6" // U+e566 +#define ICON_FA_ROAD_LOCK "\xee\x95\xa7" // U+e567 +#define ICON_FA_ROAD_SPIKES "\xee\x95\xa8" // U+e568 +#define ICON_FA_ROBOT "\xef\x95\x84" // U+f544 +#define ICON_FA_ROCKET "\xef\x84\xb5" // U+f135 +#define ICON_FA_ROTATE "\xef\x8b\xb1" // U+f2f1 +#define ICON_FA_ROTATE_LEFT "\xef\x8b\xaa" // U+f2ea +#define ICON_FA_ROTATE_RIGHT "\xef\x8b\xb9" // U+f2f9 +#define ICON_FA_ROUTE "\xef\x93\x97" // U+f4d7 +#define ICON_FA_RSS "\xef\x82\x9e" // U+f09e +#define ICON_FA_RUBLE_SIGN "\xef\x85\x98" // U+f158 +#define ICON_FA_RUG "\xee\x95\xa9" // U+e569 +#define ICON_FA_RULER "\xef\x95\x85" // U+f545 +#define ICON_FA_RULER_COMBINED "\xef\x95\x86" // U+f546 +#define ICON_FA_RULER_HORIZONTAL "\xef\x95\x87" // U+f547 +#define ICON_FA_RULER_VERTICAL "\xef\x95\x88" // U+f548 +#define ICON_FA_RUPEE_SIGN "\xef\x85\x96" // U+f156 +#define ICON_FA_RUPIAH_SIGN "\xee\x88\xbd" // U+e23d +#define ICON_FA_S "S" // U+0053 +#define ICON_FA_SACK_DOLLAR "\xef\xa0\x9d" // U+f81d +#define ICON_FA_SACK_XMARK "\xee\x95\xaa" // U+e56a +#define ICON_FA_SAILBOAT "\xee\x91\x85" // U+e445 +#define ICON_FA_SATELLITE "\xef\x9e\xbf" // U+f7bf +#define ICON_FA_SATELLITE_DISH "\xef\x9f\x80" // U+f7c0 +#define ICON_FA_SCALE_BALANCED "\xef\x89\x8e" // U+f24e +#define ICON_FA_SCALE_UNBALANCED "\xef\x94\x95" // U+f515 +#define ICON_FA_SCALE_UNBALANCED_FLIP "\xef\x94\x96" // U+f516 +#define ICON_FA_SCHOOL "\xef\x95\x89" // U+f549 +#define ICON_FA_SCHOOL_CIRCLE_CHECK "\xee\x95\xab" // U+e56b +#define ICON_FA_SCHOOL_CIRCLE_EXCLAMATION "\xee\x95\xac" // U+e56c +#define ICON_FA_SCHOOL_CIRCLE_XMARK "\xee\x95\xad" // U+e56d +#define ICON_FA_SCHOOL_FLAG "\xee\x95\xae" // U+e56e +#define ICON_FA_SCHOOL_LOCK "\xee\x95\xaf" // U+e56f +#define ICON_FA_SCISSORS "\xef\x83\x84" // U+f0c4 +#define ICON_FA_SCREWDRIVER "\xef\x95\x8a" // U+f54a +#define ICON_FA_SCREWDRIVER_WRENCH "\xef\x9f\x99" // U+f7d9 +#define ICON_FA_SCROLL "\xef\x9c\x8e" // U+f70e +#define ICON_FA_SCROLL_TORAH "\xef\x9a\xa0" // U+f6a0 +#define ICON_FA_SD_CARD "\xef\x9f\x82" // U+f7c2 +#define ICON_FA_SECTION "\xee\x91\x87" // U+e447 +#define ICON_FA_SEEDLING "\xef\x93\x98" // U+f4d8 +#define ICON_FA_SERVER "\xef\x88\xb3" // U+f233 +#define ICON_FA_SHAPES "\xef\x98\x9f" // U+f61f +#define ICON_FA_SHARE "\xef\x81\xa4" // U+f064 +#define ICON_FA_SHARE_FROM_SQUARE "\xef\x85\x8d" // U+f14d +#define ICON_FA_SHARE_NODES "\xef\x87\xa0" // U+f1e0 +#define ICON_FA_SHEET_PLASTIC "\xee\x95\xb1" // U+e571 +#define ICON_FA_SHEKEL_SIGN "\xef\x88\x8b" // U+f20b +#define ICON_FA_SHIELD "\xef\x84\xb2" // U+f132 +#define ICON_FA_SHIELD_CAT "\xee\x95\xb2" // U+e572 +#define ICON_FA_SHIELD_DOG "\xee\x95\xb3" // U+e573 +#define ICON_FA_SHIELD_HALVED "\xef\x8f\xad" // U+f3ed +#define ICON_FA_SHIELD_HEART "\xee\x95\xb4" // U+e574 +#define ICON_FA_SHIELD_VIRUS "\xee\x81\xac" // U+e06c +#define ICON_FA_SHIP "\xef\x88\x9a" // U+f21a +#define ICON_FA_SHIRT "\xef\x95\x93" // U+f553 +#define ICON_FA_SHOE_PRINTS "\xef\x95\x8b" // U+f54b +#define ICON_FA_SHOP "\xef\x95\x8f" // U+f54f +#define ICON_FA_SHOP_LOCK "\xee\x92\xa5" // U+e4a5 +#define ICON_FA_SHOP_SLASH "\xee\x81\xb0" // U+e070 +#define ICON_FA_SHOWER "\xef\x8b\x8c" // U+f2cc +#define ICON_FA_SHRIMP "\xee\x91\x88" // U+e448 +#define ICON_FA_SHUFFLE "\xef\x81\xb4" // U+f074 +#define ICON_FA_SHUTTLE_SPACE "\xef\x86\x97" // U+f197 +#define ICON_FA_SIGN_HANGING "\xef\x93\x99" // U+f4d9 +#define ICON_FA_SIGNAL "\xef\x80\x92" // U+f012 +#define ICON_FA_SIGNATURE "\xef\x96\xb7" // U+f5b7 +#define ICON_FA_SIGNS_POST "\xef\x89\xb7" // U+f277 +#define ICON_FA_SIM_CARD "\xef\x9f\x84" // U+f7c4 +#define ICON_FA_SINK "\xee\x81\xad" // U+e06d +#define ICON_FA_SITEMAP "\xef\x83\xa8" // U+f0e8 +#define ICON_FA_SKULL "\xef\x95\x8c" // U+f54c +#define ICON_FA_SKULL_CROSSBONES "\xef\x9c\x94" // U+f714 +#define ICON_FA_SLASH "\xef\x9c\x95" // U+f715 +#define ICON_FA_SLEIGH "\xef\x9f\x8c" // U+f7cc +#define ICON_FA_SLIDERS "\xef\x87\x9e" // U+f1de +#define ICON_FA_SMOG "\xef\x9d\x9f" // U+f75f +#define ICON_FA_SMOKING "\xef\x92\x8d" // U+f48d +#define ICON_FA_SNOWFLAKE "\xef\x8b\x9c" // U+f2dc +#define ICON_FA_SNOWMAN "\xef\x9f\x90" // U+f7d0 +#define ICON_FA_SNOWPLOW "\xef\x9f\x92" // U+f7d2 +#define ICON_FA_SOAP "\xee\x81\xae" // U+e06e +#define ICON_FA_SOCKS "\xef\x9a\x96" // U+f696 +#define ICON_FA_SOLAR_PANEL "\xef\x96\xba" // U+f5ba +#define ICON_FA_SORT "\xef\x83\x9c" // U+f0dc +#define ICON_FA_SORT_DOWN "\xef\x83\x9d" // U+f0dd +#define ICON_FA_SORT_UP "\xef\x83\x9e" // U+f0de +#define ICON_FA_SPA "\xef\x96\xbb" // U+f5bb +#define ICON_FA_SPAGHETTI_MONSTER_FLYING "\xef\x99\xbb" // U+f67b +#define ICON_FA_SPELL_CHECK "\xef\xa2\x91" // U+f891 +#define ICON_FA_SPIDER "\xef\x9c\x97" // U+f717 +#define ICON_FA_SPINNER "\xef\x84\x90" // U+f110 +#define ICON_FA_SPLOTCH "\xef\x96\xbc" // U+f5bc +#define ICON_FA_SPOON "\xef\x8b\xa5" // U+f2e5 +#define ICON_FA_SPRAY_CAN "\xef\x96\xbd" // U+f5bd +#define ICON_FA_SPRAY_CAN_SPARKLES "\xef\x97\x90" // U+f5d0 +#define ICON_FA_SQUARE "\xef\x83\x88" // U+f0c8 +#define ICON_FA_SQUARE_ARROW_UP_RIGHT "\xef\x85\x8c" // U+f14c +#define ICON_FA_SQUARE_CARET_DOWN "\xef\x85\x90" // U+f150 +#define ICON_FA_SQUARE_CARET_LEFT "\xef\x86\x91" // U+f191 +#define ICON_FA_SQUARE_CARET_RIGHT "\xef\x85\x92" // U+f152 +#define ICON_FA_SQUARE_CARET_UP "\xef\x85\x91" // U+f151 +#define ICON_FA_SQUARE_CHECK "\xef\x85\x8a" // U+f14a +#define ICON_FA_SQUARE_ENVELOPE "\xef\x86\x99" // U+f199 +#define ICON_FA_SQUARE_FULL "\xef\x91\x9c" // U+f45c +#define ICON_FA_SQUARE_H "\xef\x83\xbd" // U+f0fd +#define ICON_FA_SQUARE_MINUS "\xef\x85\x86" // U+f146 +#define ICON_FA_SQUARE_NFI "\xee\x95\xb6" // U+e576 +#define ICON_FA_SQUARE_PARKING "\xef\x95\x80" // U+f540 +#define ICON_FA_SQUARE_PEN "\xef\x85\x8b" // U+f14b +#define ICON_FA_SQUARE_PERSON_CONFINED "\xee\x95\xb7" // U+e577 +#define ICON_FA_SQUARE_PHONE "\xef\x82\x98" // U+f098 +#define ICON_FA_SQUARE_PHONE_FLIP "\xef\xa1\xbb" // U+f87b +#define ICON_FA_SQUARE_PLUS "\xef\x83\xbe" // U+f0fe +#define ICON_FA_SQUARE_POLL_HORIZONTAL "\xef\x9a\x82" // U+f682 +#define ICON_FA_SQUARE_POLL_VERTICAL "\xef\x9a\x81" // U+f681 +#define ICON_FA_SQUARE_ROOT_VARIABLE "\xef\x9a\x98" // U+f698 +#define ICON_FA_SQUARE_RSS "\xef\x85\x83" // U+f143 +#define ICON_FA_SQUARE_SHARE_NODES "\xef\x87\xa1" // U+f1e1 +#define ICON_FA_SQUARE_UP_RIGHT "\xef\x8d\xa0" // U+f360 +#define ICON_FA_SQUARE_VIRUS "\xee\x95\xb8" // U+e578 +#define ICON_FA_SQUARE_XMARK "\xef\x8b\x93" // U+f2d3 +#define ICON_FA_STAFF_SNAKE "\xee\x95\xb9" // U+e579 +#define ICON_FA_STAIRS "\xee\x8a\x89" // U+e289 +#define ICON_FA_STAMP "\xef\x96\xbf" // U+f5bf +#define ICON_FA_STAPLER "\xee\x96\xaf" // U+e5af +#define ICON_FA_STAR "\xef\x80\x85" // U+f005 +#define ICON_FA_STAR_AND_CRESCENT "\xef\x9a\x99" // U+f699 +#define ICON_FA_STAR_HALF "\xef\x82\x89" // U+f089 +#define ICON_FA_STAR_HALF_STROKE "\xef\x97\x80" // U+f5c0 +#define ICON_FA_STAR_OF_DAVID "\xef\x9a\x9a" // U+f69a +#define ICON_FA_STAR_OF_LIFE "\xef\x98\xa1" // U+f621 +#define ICON_FA_STERLING_SIGN "\xef\x85\x94" // U+f154 +#define ICON_FA_STETHOSCOPE "\xef\x83\xb1" // U+f0f1 +#define ICON_FA_STOP "\xef\x81\x8d" // U+f04d +#define ICON_FA_STOPWATCH "\xef\x8b\xb2" // U+f2f2 +#define ICON_FA_STOPWATCH_20 "\xee\x81\xaf" // U+e06f +#define ICON_FA_STORE "\xef\x95\x8e" // U+f54e +#define ICON_FA_STORE_SLASH "\xee\x81\xb1" // U+e071 +#define ICON_FA_STREET_VIEW "\xef\x88\x9d" // U+f21d +#define ICON_FA_STRIKETHROUGH "\xef\x83\x8c" // U+f0cc +#define ICON_FA_STROOPWAFEL "\xef\x95\x91" // U+f551 +#define ICON_FA_SUBSCRIPT "\xef\x84\xac" // U+f12c +#define ICON_FA_SUITCASE "\xef\x83\xb2" // U+f0f2 +#define ICON_FA_SUITCASE_MEDICAL "\xef\x83\xba" // U+f0fa +#define ICON_FA_SUITCASE_ROLLING "\xef\x97\x81" // U+f5c1 +#define ICON_FA_SUN "\xef\x86\x85" // U+f185 +#define ICON_FA_SUN_PLANT_WILT "\xee\x95\xba" // U+e57a +#define ICON_FA_SUPERSCRIPT "\xef\x84\xab" // U+f12b +#define ICON_FA_SWATCHBOOK "\xef\x97\x83" // U+f5c3 +#define ICON_FA_SYNAGOGUE "\xef\x9a\x9b" // U+f69b +#define ICON_FA_SYRINGE "\xef\x92\x8e" // U+f48e +#define ICON_FA_T "T" // U+0054 +#define ICON_FA_TABLE "\xef\x83\x8e" // U+f0ce +#define ICON_FA_TABLE_CELLS "\xef\x80\x8a" // U+f00a +#define ICON_FA_TABLE_CELLS_COLUMN_LOCK "\xee\x99\xb8" // U+e678 +#define ICON_FA_TABLE_CELLS_LARGE "\xef\x80\x89" // U+f009 +#define ICON_FA_TABLE_CELLS_ROW_LOCK "\xee\x99\xba" // U+e67a +#define ICON_FA_TABLE_COLUMNS "\xef\x83\x9b" // U+f0db +#define ICON_FA_TABLE_LIST "\xef\x80\x8b" // U+f00b +#define ICON_FA_TABLE_TENNIS_PADDLE_BALL "\xef\x91\x9d" // U+f45d +#define ICON_FA_TABLET "\xef\x8f\xbb" // U+f3fb +#define ICON_FA_TABLET_BUTTON "\xef\x84\x8a" // U+f10a +#define ICON_FA_TABLET_SCREEN_BUTTON "\xef\x8f\xba" // U+f3fa +#define ICON_FA_TABLETS "\xef\x92\x90" // U+f490 +#define ICON_FA_TACHOGRAPH_DIGITAL "\xef\x95\xa6" // U+f566 +#define ICON_FA_TAG "\xef\x80\xab" // U+f02b +#define ICON_FA_TAGS "\xef\x80\xac" // U+f02c +#define ICON_FA_TAPE "\xef\x93\x9b" // U+f4db +#define ICON_FA_TARP "\xee\x95\xbb" // U+e57b +#define ICON_FA_TARP_DROPLET "\xee\x95\xbc" // U+e57c +#define ICON_FA_TAXI "\xef\x86\xba" // U+f1ba +#define ICON_FA_TEETH "\xef\x98\xae" // U+f62e +#define ICON_FA_TEETH_OPEN "\xef\x98\xaf" // U+f62f +#define ICON_FA_TEMPERATURE_ARROW_DOWN "\xee\x80\xbf" // U+e03f +#define ICON_FA_TEMPERATURE_ARROW_UP "\xee\x81\x80" // U+e040 +#define ICON_FA_TEMPERATURE_EMPTY "\xef\x8b\x8b" // U+f2cb +#define ICON_FA_TEMPERATURE_FULL "\xef\x8b\x87" // U+f2c7 +#define ICON_FA_TEMPERATURE_HALF "\xef\x8b\x89" // U+f2c9 +#define ICON_FA_TEMPERATURE_HIGH "\xef\x9d\xa9" // U+f769 +#define ICON_FA_TEMPERATURE_LOW "\xef\x9d\xab" // U+f76b +#define ICON_FA_TEMPERATURE_QUARTER "\xef\x8b\x8a" // U+f2ca +#define ICON_FA_TEMPERATURE_THREE_QUARTERS "\xef\x8b\x88" // U+f2c8 +#define ICON_FA_TENGE_SIGN "\xef\x9f\x97" // U+f7d7 +#define ICON_FA_TENT "\xee\x95\xbd" // U+e57d +#define ICON_FA_TENT_ARROW_DOWN_TO_LINE "\xee\x95\xbe" // U+e57e +#define ICON_FA_TENT_ARROW_LEFT_RIGHT "\xee\x95\xbf" // U+e57f +#define ICON_FA_TENT_ARROW_TURN_LEFT "\xee\x96\x80" // U+e580 +#define ICON_FA_TENT_ARROWS_DOWN "\xee\x96\x81" // U+e581 +#define ICON_FA_TENTS "\xee\x96\x82" // U+e582 +#define ICON_FA_TERMINAL "\xef\x84\xa0" // U+f120 +#define ICON_FA_TEXT_HEIGHT "\xef\x80\xb4" // U+f034 +#define ICON_FA_TEXT_SLASH "\xef\xa1\xbd" // U+f87d +#define ICON_FA_TEXT_WIDTH "\xef\x80\xb5" // U+f035 +#define ICON_FA_THERMOMETER "\xef\x92\x91" // U+f491 +#define ICON_FA_THUMBS_DOWN "\xef\x85\xa5" // U+f165 +#define ICON_FA_THUMBS_UP "\xef\x85\xa4" // U+f164 +#define ICON_FA_THUMBTACK "\xef\x82\x8d" // U+f08d +#define ICON_FA_TICKET "\xef\x85\x85" // U+f145 +#define ICON_FA_TICKET_SIMPLE "\xef\x8f\xbf" // U+f3ff +#define ICON_FA_TIMELINE "\xee\x8a\x9c" // U+e29c +#define ICON_FA_TOGGLE_OFF "\xef\x88\x84" // U+f204 +#define ICON_FA_TOGGLE_ON "\xef\x88\x85" // U+f205 +#define ICON_FA_TOILET "\xef\x9f\x98" // U+f7d8 +#define ICON_FA_TOILET_PAPER "\xef\x9c\x9e" // U+f71e +#define ICON_FA_TOILET_PAPER_SLASH "\xee\x81\xb2" // U+e072 +#define ICON_FA_TOILET_PORTABLE "\xee\x96\x83" // U+e583 +#define ICON_FA_TOILETS_PORTABLE "\xee\x96\x84" // U+e584 +#define ICON_FA_TOOLBOX "\xef\x95\x92" // U+f552 +#define ICON_FA_TOOTH "\xef\x97\x89" // U+f5c9 +#define ICON_FA_TORII_GATE "\xef\x9a\xa1" // U+f6a1 +#define ICON_FA_TORNADO "\xef\x9d\xaf" // U+f76f +#define ICON_FA_TOWER_BROADCAST "\xef\x94\x99" // U+f519 +#define ICON_FA_TOWER_CELL "\xee\x96\x85" // U+e585 +#define ICON_FA_TOWER_OBSERVATION "\xee\x96\x86" // U+e586 +#define ICON_FA_TRACTOR "\xef\x9c\xa2" // U+f722 +#define ICON_FA_TRADEMARK "\xef\x89\x9c" // U+f25c +#define ICON_FA_TRAFFIC_LIGHT "\xef\x98\xb7" // U+f637 +#define ICON_FA_TRAILER "\xee\x81\x81" // U+e041 +#define ICON_FA_TRAIN "\xef\x88\xb8" // U+f238 +#define ICON_FA_TRAIN_SUBWAY "\xef\x88\xb9" // U+f239 +#define ICON_FA_TRAIN_TRAM "\xee\x96\xb4" // U+e5b4 +#define ICON_FA_TRANSGENDER "\xef\x88\xa5" // U+f225 +#define ICON_FA_TRASH "\xef\x87\xb8" // U+f1f8 +#define ICON_FA_TRASH_ARROW_UP "\xef\xa0\xa9" // U+f829 +#define ICON_FA_TRASH_CAN "\xef\x8b\xad" // U+f2ed +#define ICON_FA_TRASH_CAN_ARROW_UP "\xef\xa0\xaa" // U+f82a +#define ICON_FA_TREE "\xef\x86\xbb" // U+f1bb +#define ICON_FA_TREE_CITY "\xee\x96\x87" // U+e587 +#define ICON_FA_TRIANGLE_EXCLAMATION "\xef\x81\xb1" // U+f071 +#define ICON_FA_TROPHY "\xef\x82\x91" // U+f091 +#define ICON_FA_TROWEL "\xee\x96\x89" // U+e589 +#define ICON_FA_TROWEL_BRICKS "\xee\x96\x8a" // U+e58a +#define ICON_FA_TRUCK "\xef\x83\x91" // U+f0d1 +#define ICON_FA_TRUCK_ARROW_RIGHT "\xee\x96\x8b" // U+e58b +#define ICON_FA_TRUCK_DROPLET "\xee\x96\x8c" // U+e58c +#define ICON_FA_TRUCK_FAST "\xef\x92\x8b" // U+f48b +#define ICON_FA_TRUCK_FIELD "\xee\x96\x8d" // U+e58d +#define ICON_FA_TRUCK_FIELD_UN "\xee\x96\x8e" // U+e58e +#define ICON_FA_TRUCK_FRONT "\xee\x8a\xb7" // U+e2b7 +#define ICON_FA_TRUCK_MEDICAL "\xef\x83\xb9" // U+f0f9 +#define ICON_FA_TRUCK_MONSTER "\xef\x98\xbb" // U+f63b +#define ICON_FA_TRUCK_MOVING "\xef\x93\x9f" // U+f4df +#define ICON_FA_TRUCK_PICKUP "\xef\x98\xbc" // U+f63c +#define ICON_FA_TRUCK_PLANE "\xee\x96\x8f" // U+e58f +#define ICON_FA_TRUCK_RAMP_BOX "\xef\x93\x9e" // U+f4de +#define ICON_FA_TTY "\xef\x87\xa4" // U+f1e4 +#define ICON_FA_TURKISH_LIRA_SIGN "\xee\x8a\xbb" // U+e2bb +#define ICON_FA_TURN_DOWN "\xef\x8e\xbe" // U+f3be +#define ICON_FA_TURN_UP "\xef\x8e\xbf" // U+f3bf +#define ICON_FA_TV "\xef\x89\xac" // U+f26c +#define ICON_FA_U "U" // U+0055 +#define ICON_FA_UMBRELLA "\xef\x83\xa9" // U+f0e9 +#define ICON_FA_UMBRELLA_BEACH "\xef\x97\x8a" // U+f5ca +#define ICON_FA_UNDERLINE "\xef\x83\x8d" // U+f0cd +#define ICON_FA_UNIVERSAL_ACCESS "\xef\x8a\x9a" // U+f29a +#define ICON_FA_UNLOCK "\xef\x82\x9c" // U+f09c +#define ICON_FA_UNLOCK_KEYHOLE "\xef\x84\xbe" // U+f13e +#define ICON_FA_UP_DOWN "\xef\x8c\xb8" // U+f338 +#define ICON_FA_UP_DOWN_LEFT_RIGHT "\xef\x82\xb2" // U+f0b2 +#define ICON_FA_UP_LONG "\xef\x8c\x8c" // U+f30c +#define ICON_FA_UP_RIGHT_AND_DOWN_LEFT_FROM_CENTER "\xef\x90\xa4" // U+f424 +#define ICON_FA_UP_RIGHT_FROM_SQUARE "\xef\x8d\x9d" // U+f35d +#define ICON_FA_UPLOAD "\xef\x82\x93" // U+f093 +#define ICON_FA_USER "\xef\x80\x87" // U+f007 +#define ICON_FA_USER_ASTRONAUT "\xef\x93\xbb" // U+f4fb +#define ICON_FA_USER_CHECK "\xef\x93\xbc" // U+f4fc +#define ICON_FA_USER_CLOCK "\xef\x93\xbd" // U+f4fd +#define ICON_FA_USER_DOCTOR "\xef\x83\xb0" // U+f0f0 +#define ICON_FA_USER_GEAR "\xef\x93\xbe" // U+f4fe +#define ICON_FA_USER_GRADUATE "\xef\x94\x81" // U+f501 +#define ICON_FA_USER_GROUP "\xef\x94\x80" // U+f500 +#define ICON_FA_USER_INJURED "\xef\x9c\xa8" // U+f728 +#define ICON_FA_USER_LARGE "\xef\x90\x86" // U+f406 +#define ICON_FA_USER_LARGE_SLASH "\xef\x93\xba" // U+f4fa +#define ICON_FA_USER_LOCK "\xef\x94\x82" // U+f502 +#define ICON_FA_USER_MINUS "\xef\x94\x83" // U+f503 +#define ICON_FA_USER_NINJA "\xef\x94\x84" // U+f504 +#define ICON_FA_USER_NURSE "\xef\xa0\xaf" // U+f82f +#define ICON_FA_USER_PEN "\xef\x93\xbf" // U+f4ff +#define ICON_FA_USER_PLUS "\xef\x88\xb4" // U+f234 +#define ICON_FA_USER_SECRET "\xef\x88\x9b" // U+f21b +#define ICON_FA_USER_SHIELD "\xef\x94\x85" // U+f505 +#define ICON_FA_USER_SLASH "\xef\x94\x86" // U+f506 +#define ICON_FA_USER_TAG "\xef\x94\x87" // U+f507 +#define ICON_FA_USER_TIE "\xef\x94\x88" // U+f508 +#define ICON_FA_USER_XMARK "\xef\x88\xb5" // U+f235 +#define ICON_FA_USERS "\xef\x83\x80" // U+f0c0 +#define ICON_FA_USERS_BETWEEN_LINES "\xee\x96\x91" // U+e591 +#define ICON_FA_USERS_GEAR "\xef\x94\x89" // U+f509 +#define ICON_FA_USERS_LINE "\xee\x96\x92" // U+e592 +#define ICON_FA_USERS_RAYS "\xee\x96\x93" // U+e593 +#define ICON_FA_USERS_RECTANGLE "\xee\x96\x94" // U+e594 +#define ICON_FA_USERS_SLASH "\xee\x81\xb3" // U+e073 +#define ICON_FA_USERS_VIEWFINDER "\xee\x96\x95" // U+e595 +#define ICON_FA_UTENSILS "\xef\x8b\xa7" // U+f2e7 +#define ICON_FA_V "V" // U+0056 +#define ICON_FA_VAN_SHUTTLE "\xef\x96\xb6" // U+f5b6 +#define ICON_FA_VAULT "\xee\x8b\x85" // U+e2c5 +#define ICON_FA_VECTOR_SQUARE "\xef\x97\x8b" // U+f5cb +#define ICON_FA_VENUS "\xef\x88\xa1" // U+f221 +#define ICON_FA_VENUS_DOUBLE "\xef\x88\xa6" // U+f226 +#define ICON_FA_VENUS_MARS "\xef\x88\xa8" // U+f228 +#define ICON_FA_VEST "\xee\x82\x85" // U+e085 +#define ICON_FA_VEST_PATCHES "\xee\x82\x86" // U+e086 +#define ICON_FA_VIAL "\xef\x92\x92" // U+f492 +#define ICON_FA_VIAL_CIRCLE_CHECK "\xee\x96\x96" // U+e596 +#define ICON_FA_VIAL_VIRUS "\xee\x96\x97" // U+e597 +#define ICON_FA_VIALS "\xef\x92\x93" // U+f493 +#define ICON_FA_VIDEO "\xef\x80\xbd" // U+f03d +#define ICON_FA_VIDEO_SLASH "\xef\x93\xa2" // U+f4e2 +#define ICON_FA_VIHARA "\xef\x9a\xa7" // U+f6a7 +#define ICON_FA_VIRUS "\xee\x81\xb4" // U+e074 +#define ICON_FA_VIRUS_COVID "\xee\x92\xa8" // U+e4a8 +#define ICON_FA_VIRUS_COVID_SLASH "\xee\x92\xa9" // U+e4a9 +#define ICON_FA_VIRUS_SLASH "\xee\x81\xb5" // U+e075 +#define ICON_FA_VIRUSES "\xee\x81\xb6" // U+e076 +#define ICON_FA_VOICEMAIL "\xef\xa2\x97" // U+f897 +#define ICON_FA_VOLCANO "\xef\x9d\xb0" // U+f770 +#define ICON_FA_VOLLEYBALL "\xef\x91\x9f" // U+f45f +#define ICON_FA_VOLUME_HIGH "\xef\x80\xa8" // U+f028 +#define ICON_FA_VOLUME_LOW "\xef\x80\xa7" // U+f027 +#define ICON_FA_VOLUME_OFF "\xef\x80\xa6" // U+f026 +#define ICON_FA_VOLUME_XMARK "\xef\x9a\xa9" // U+f6a9 +#define ICON_FA_VR_CARDBOARD "\xef\x9c\xa9" // U+f729 +#define ICON_FA_W "W" // U+0057 +#define ICON_FA_WALKIE_TALKIE "\xef\xa3\xaf" // U+f8ef +#define ICON_FA_WALLET "\xef\x95\x95" // U+f555 +#define ICON_FA_WAND_MAGIC "\xef\x83\x90" // U+f0d0 +#define ICON_FA_WAND_MAGIC_SPARKLES "\xee\x8b\x8a" // U+e2ca +#define ICON_FA_WAND_SPARKLES "\xef\x9c\xab" // U+f72b +#define ICON_FA_WAREHOUSE "\xef\x92\x94" // U+f494 +#define ICON_FA_WATER "\xef\x9d\xb3" // U+f773 +#define ICON_FA_WATER_LADDER "\xef\x97\x85" // U+f5c5 +#define ICON_FA_WAVE_SQUARE "\xef\xa0\xbe" // U+f83e +#define ICON_FA_WEIGHT_HANGING "\xef\x97\x8d" // U+f5cd +#define ICON_FA_WEIGHT_SCALE "\xef\x92\x96" // U+f496 +#define ICON_FA_WHEAT_AWN "\xee\x8b\x8d" // U+e2cd +#define ICON_FA_WHEAT_AWN_CIRCLE_EXCLAMATION "\xee\x96\x98" // U+e598 +#define ICON_FA_WHEELCHAIR "\xef\x86\x93" // U+f193 +#define ICON_FA_WHEELCHAIR_MOVE "\xee\x8b\x8e" // U+e2ce +#define ICON_FA_WHISKEY_GLASS "\xef\x9e\xa0" // U+f7a0 +#define ICON_FA_WIFI "\xef\x87\xab" // U+f1eb +#define ICON_FA_WIND "\xef\x9c\xae" // U+f72e +#define ICON_FA_WINDOW_MAXIMIZE "\xef\x8b\x90" // U+f2d0 +#define ICON_FA_WINDOW_MINIMIZE "\xef\x8b\x91" // U+f2d1 +#define ICON_FA_WINDOW_RESTORE "\xef\x8b\x92" // U+f2d2 +#define ICON_FA_WINE_BOTTLE "\xef\x9c\xaf" // U+f72f +#define ICON_FA_WINE_GLASS "\xef\x93\xa3" // U+f4e3 +#define ICON_FA_WINE_GLASS_EMPTY "\xef\x97\x8e" // U+f5ce +#define ICON_FA_WON_SIGN "\xef\x85\x99" // U+f159 +#define ICON_FA_WORM "\xee\x96\x99" // U+e599 +#define ICON_FA_WRENCH "\xef\x82\xad" // U+f0ad +#define ICON_FA_X "X" // U+0058 +#define ICON_FA_X_RAY "\xef\x92\x97" // U+f497 +#define ICON_FA_XMARK "\xef\x80\x8d" // U+f00d +#define ICON_FA_XMARKS_LINES "\xee\x96\x9a" // U+e59a +#define ICON_FA_Y "Y" // U+0059 +#define ICON_FA_YEN_SIGN "\xef\x85\x97" // U+f157 +#define ICON_FA_YIN_YANG "\xef\x9a\xad" // U+f6ad +#define ICON_FA_Z "Z" // U+005a diff --git a/core/rend/boxart/boxart.cpp b/core/ui/boxart/boxart.cpp similarity index 93% rename from core/rend/boxart/boxart.cpp rename to core/ui/boxart/boxart.cpp index 6462d8799..72c4e4a2d 100644 --- a/core/rend/boxart/boxart.cpp +++ b/core/ui/boxart/boxart.cpp @@ -19,9 +19,24 @@ #include "boxart.h" #include "gamesdb.h" #include "../game_scanner.h" +#include "oslib/oslib.h" +#include "cfg/option.h" #include GameBoxart Boxart::getBoxart(const GameMedia& media) +{ + loadDatabase(); + GameBoxart boxart; + { + std::lock_guard guard(mutex); + auto it = games.find(media.fileName); + if (it != games.end()) + boxart = it->second; + } + return boxart; +} + +GameBoxart Boxart::getBoxartAndLoad(const GameMedia& media) { loadDatabase(); GameBoxart boxart; @@ -62,6 +77,7 @@ void Boxart::fetchBoxart() if (toFetch.empty()) return; fetching = std::async(std::launch::async, [this]() { + ThreadName _("BoxArt-scraper"); if (offlineScraper == nullptr) { offlineScraper = std::unique_ptr(new OfflineScraper()); @@ -130,13 +146,12 @@ void Boxart::fetchBoxart() } } } + saveDatabase(); }); } void Boxart::saveDatabase() { - if (fetching.valid()) - fetching.get(); if (!databaseDirty) return; std::string db_name = getSaveDirectory() + DB_NAME; @@ -199,3 +214,9 @@ void Boxart::loadDatabase() WARN_LOG(COMMON, "Corrupted database file: %s", e.what()); } } + +void Boxart::term() +{ + if (fetching.valid()) + fetching.get(); +} diff --git a/core/rend/boxart/boxart.h b/core/ui/boxart/boxart.h similarity index 95% rename from core/rend/boxart/boxart.h rename to core/ui/boxart/boxart.h index 77f964cc4..24bcc03b2 100644 --- a/core/rend/boxart/boxart.h +++ b/core/ui/boxart/boxart.h @@ -32,11 +32,13 @@ struct GameMedia; class Boxart { public: + GameBoxart getBoxartAndLoad(const GameMedia& media); GameBoxart getBoxart(const GameMedia& media); - void saveDatabase(); + void term(); private: void loadDatabase(); + void saveDatabase(); std::string getSaveDirectory() const { return get_writable_data_path("/boxart/"); } diff --git a/core/rend/boxart/gamesdb.cpp b/core/ui/boxart/gamesdb.cpp similarity index 94% rename from core/rend/boxart/gamesdb.cpp rename to core/ui/boxart/gamesdb.cpp index b15d40692..8a092d7d5 100644 --- a/core/rend/boxart/gamesdb.cpp +++ b/core/ui/boxart/gamesdb.cpp @@ -17,9 +17,8 @@ along with Flycast. If not, see . */ #include "gamesdb.h" -#include "http_client.h" +#include "oslib/http_client.h" #include "stdclass.h" -#include "oslib/oslib.h" #include "emulator.h" #define APIKEY "3fcc5e726a129924972be97abfd577ac5311f8f12398a9d9bcb5a377d4656fa8" @@ -74,9 +73,9 @@ void TheGamesDb::copyFile(const std::string& from, const std::string& to) json TheGamesDb::httpGet(const std::string& url) { - if (os_GetSeconds() < blackoutPeriod) + if (getTimeMs() < blackoutPeriod) throw std::runtime_error(""); - blackoutPeriod = 0.0; + blackoutPeriod = 0; DEBUG_LOG(COMMON, "TheGameDb: GET %s", url.c_str()); std::vector receivedData; @@ -84,9 +83,9 @@ json TheGamesDb::httpGet(const std::string& url) bool success = http::success(status); if (status == 403) // hit rate-limit cap - blackoutPeriod = os_GetSeconds() + 60.0; + blackoutPeriod = getTimeMs() + 60 * 1000; else if (!success) - blackoutPeriod = os_GetSeconds() + 1.0; + blackoutPeriod = getTimeMs() + 1000; if (!success || receivedData.empty()) throw std::runtime_error("http error"); @@ -226,12 +225,14 @@ void TheGamesDb::parseBoxart(GameBoxart& item, const json& j, int gameId) { copyFile(cached->second, filename); item.setBoxartPath(filename); + item.boxartUrl = url; } else { if (downloadImage(url, filename)) { item.setBoxartPath(filename); + item.boxartUrl = url; boxartCache[url] = filename; } } @@ -321,7 +322,8 @@ void TheGamesDb::scrape(GameBoxart& item) return; fetchPlatforms(); - if (!item.uniqueId.empty()) + // Ignore default disk ids used by kos and katana + if (!item.uniqueId.empty() && item.uniqueId != "T0000" && item.uniqueId != "T0000M") { std::string url = makeUrl("Games/ByGameUniqueID") + "&fields=overview,uids&include=boxart&filter%5Bplatform%5D=" + std::to_string(dreamcastPlatformId) + "&uid=" + http::urlEncode(item.uniqueId); @@ -379,7 +381,7 @@ void TheGamesDb::fetchByUids(std::vector& items) void TheGamesDb::scrape(std::vector& items) { - if (os_GetSeconds() < blackoutPeriod) + if (getTimeMs() < blackoutPeriod) throw std::runtime_error(""); blackoutPeriod = 0.0; @@ -394,8 +396,11 @@ void TheGamesDb::scrape(std::vector& items) else if (item.gamePath.empty()) { std::string localPath = makeUniqueFilename("dreamcast_logo_grey.png"); - if (downloadImage("https://flyinghead.github.io/flycast-builds/dreamcast_logo_grey.png", localPath)) + std::string biosArtUrl{ "https://flyinghead.github.io/flycast-builds/dreamcast_logo_grey.png" }; + if (downloadImage(biosArtUrl, localPath)) { item.setBoxartPath(localPath); + item.boxartUrl = biosArtUrl; + } } item.scraped = true; } diff --git a/core/rend/boxart/gamesdb.h b/core/ui/boxart/gamesdb.h similarity index 96% rename from core/rend/boxart/gamesdb.h rename to core/ui/boxart/gamesdb.h index bf9998bfc..4d8445971 100644 --- a/core/rend/boxart/gamesdb.h +++ b/core/ui/boxart/gamesdb.h @@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "scraper.h" #include "json.hpp" @@ -31,7 +32,7 @@ class TheGamesDb : public Scraper bool initialize(const std::string& saveDirectory) override; void scrape(GameBoxart& item) override; void scrape(std::vector& items) override; - ~TheGamesDb(); + ~TheGamesDb() override; private: void fetchPlatforms(); @@ -46,7 +47,7 @@ class TheGamesDb : public Scraper int dreamcastPlatformId = 0; int arcadePlatformId = 0; - double blackoutPeriod = 0.0; + u64 blackoutPeriod = 0; std::map boxartCache; // key: url, value: local file path }; diff --git a/core/rend/boxart/pvrparser.h b/core/ui/boxart/pvrparser.h similarity index 93% rename from core/rend/boxart/pvrparser.h rename to core/ui/boxart/pvrparser.h index 04590a6fd..cf713ac62 100644 --- a/core/rend/boxart/pvrparser.h +++ b/core/ui/boxart/pvrparser.h @@ -18,7 +18,8 @@ */ #pragma once #include "types.h" -#include "rend/TexCache.h" +#include "rend/texconv.h" +#include "hw/pvr/ta_structs.h" extern const u32 VQMipPoint[11]; extern const u32 OtherMipPoint[11]; @@ -40,7 +41,7 @@ enum PvrDataFormat { PvrSquareTwiddledMipmapsAlt = 0x12, }; -static bool pvrParse(const u8 *data, u32 len, u32& width, u32& height, std::vector& out) +static inline bool pvrParse(const u8 *data, u32 len, u32& width, u32& height, std::vector& out) { if (len < 16) return false; @@ -141,12 +142,12 @@ static bool pvrParse(const u8 *data, u32 len, u32& width, u32& height, std::vect p += (OtherMipPoint[texU] - 2) * 2; else if (imgType == PvrVQMipmaps) p += VQMipPoint[texU]; + else if (imgType == PvrVQ) + p += VQ_CODEBOOK_SIZE; u32 expectedSize = width * height; - if (imgType == PvrVQ || imgType == PvrVQMipmaps) { - expectedSize /= 4; // 4 pixels per byte - expectedSize += 256 * 4 * 2; // VQ codebook size - } + if (imgType == PvrVQ || imgType == PvrVQMipmaps) + expectedSize /= 4; // 4 pixels per byte else expectedSize *= 2; // 2 bytes per pixel if (end - p < expectedSize) diff --git a/core/rend/boxart/scraper.cpp b/core/ui/boxart/scraper.cpp similarity index 88% rename from core/rend/boxart/scraper.cpp rename to core/ui/boxart/scraper.cpp index 8ef760814..91d97513a 100644 --- a/core/rend/boxart/scraper.cpp +++ b/core/ui/boxart/scraper.cpp @@ -17,7 +17,7 @@ along with Flycast. If not, see . */ #include "scraper.h" -#include "http_client.h" +#include "oslib/http_client.h" #include "stdclass.h" #include "emulator.h" #include "imgread/common.h" @@ -25,6 +25,7 @@ #include "reios/reios.h" #include "pvrparser.h" #include +#include bool Scraper::downloadImage(const std::string& url, const std::string& localName) { @@ -60,10 +61,14 @@ bool Scraper::downloadImage(const std::string& url, const std::string& localName std::string Scraper::makeUniqueFilename(const std::string& url) { + static std::random_device randomDev; + static std::mt19937 mt(randomDev()); + static std::uniform_int_distribution dist(1, 1000000000); + std::string extension = get_file_extension(url); std::string path; do { - path = saveDirectory + std::to_string(rand()) + "." + extension; + path = saveDirectory + std::to_string(dist(mt)) + "." + extension; } while (file_exists(path)); return path; } @@ -85,7 +90,7 @@ void OfflineScraper::scrape(GameBoxart& item) } Disc *disc = nullptr; try { - disc = OpenDisc(item.gamePath.c_str()); + disc = OpenDisc(item.gamePath); if (disc == nullptr) WARN_LOG(COMMON, "Can't open disk %s", item.gamePath.c_str()); } catch (const std::runtime_error& e) { @@ -139,7 +144,19 @@ void OfflineScraper::scrape(GameBoxart& item) { stbi_flip_vertically_on_write(0); item.setBoxartPath(makeUniqueFilename("gdtex.png")); - stbi_write_png(item.boxartPath.c_str(), w, h, 4, out.data(), 0); + const auto& savefunc = [](void *context, void *data, int size) { + FILE *f = nowide::fopen((const char *)context, "wb"); + if (f == nullptr) + { + WARN_LOG(COMMON, "can't create local file %s: error %d", (const char *)context, errno); + } + else + { + fwrite(data, 1, size, f); + fclose(f); + } + }; + stbi_write_png_to_func(savefunc, (void *)item.boxartPath.c_str(), w, h, 4, out.data(), 0); } } } diff --git a/core/rend/boxart/scraper.h b/core/ui/boxart/scraper.h similarity index 96% rename from core/rend/boxart/scraper.h rename to core/ui/boxart/scraper.h index d6a8f81ce..321095500 100644 --- a/core/rend/boxart/scraper.h +++ b/core/ui/boxart/scraper.h @@ -38,6 +38,7 @@ struct GameBoxart std::string gamePath; std::string boxartPath; + std::string boxartUrl; bool parsed = false; bool scraped = false; @@ -56,6 +57,7 @@ struct GameBoxart { "release_date", releaseDate }, { "overview", overview }, { "boxart_path", boxartPath }, + { "boxart_url", boxartUrl }, { "parsed", parsed }, { "scraped", scraped }, }; @@ -84,6 +86,7 @@ struct GameBoxart loadProperty(releaseDate, j, "release_date"); loadProperty(overview, j, "overview"); loadProperty(boxartPath, j, "boxart_path"); + loadProperty(boxartUrl, j, "boxart_url"); loadProperty(parsed, j, "parsed"); loadProperty(scraped, j, "scraped"); } diff --git a/core/ui/discord.cpp b/core/ui/discord.cpp new file mode 100644 index 000000000..02ffd8dc1 --- /dev/null +++ b/core/ui/discord.cpp @@ -0,0 +1,127 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "types.h" +#include "emulator.h" +#include "cfg/option.h" +#include "gui.h" +#include "discord_rpc.h" +#include +#include + +#define FLYCAST_APPID "1212789289851559946" + +class DiscordPresence +{ +public: + DiscordPresence() + { + EventManager::listen(Event::Start, handleEmuEvent, this); + EventManager::listen(Event::Terminate, handleEmuEvent, this); + EventManager::listen(Event::Resume, handleEmuEvent, this); + EventManager::listen(Event::Network, handleEmuEvent, this); + } + + ~DiscordPresence() + { + shutdown(); + EventManager::unlisten(Event::Start, handleEmuEvent, this); + EventManager::unlisten(Event::Terminate, handleEmuEvent, this); + EventManager::unlisten(Event::Resume, handleEmuEvent, this); + EventManager::unlisten(Event::Network, handleEmuEvent, this); + } + +private: + void initialize() + { + if (!initialized) + Discord_Initialize(FLYCAST_APPID, nullptr, 0, nullptr); + initialized = true; + } + + void shutdown() + { + if (initialized) + Discord_Shutdown(); + initialized = false; + } + + void sendPresence() + { + initialize(); + DiscordRichPresence discordPresence{}; + discordPresence.state = settings.content.title.c_str(); + discordPresence.startTimestamp = startTimestamp; + std::string imageUrl = gui_getCurGameBoxartUrl(); + if (!imageUrl.empty()) + { + discordPresence.largeImageKey = imageUrl.c_str(); + discordPresence.largeImageText = settings.content.title.c_str(); + discordPresence.smallImageKey = "icon-512"; + discordPresence.smallImageText = "Flycast is a Dreamcast, Naomi and Atomiswave emulator"; + } + else + { + discordPresence.largeImageKey = "icon-512"; + discordPresence.largeImageText = "Flycast is a Dreamcast, Naomi and Atomiswave emulator"; + } + if (settings.network.online) + discordPresence.details = "Online"; + Discord_UpdatePresence(&discordPresence); + } + + static void handleEmuEvent(Event event, void *p) + { + if (settings.naomi.slave || settings.naomi.drivingSimSlave != 0) + return; + DiscordPresence *inst = (DiscordPresence *)p; + switch (event) + { + case Event::Start: + inst->startTimestamp = time(nullptr); + [[fallthrough]]; + case Event::Network: + if (config::DiscordPresence) + inst->sendPresence(); + break; + case Event::Resume: + if (config::DiscordPresence && !inst->initialized) + // Discord presence enabled + inst->sendPresence(); + else if (!config::DiscordPresence && inst->initialized) + { + // Discord presence disabled + Discord_ClearPresence(); + inst->shutdown(); + } + break; + case Event::Terminate: + if (inst->initialized) + Discord_ClearPresence(); + inst->startTimestamp = 0; + break; + default: + break; + } + } + + bool initialized = false; + int64_t startTimestamp = 0; +}; + +static DiscordPresence discordPresence; diff --git a/core/ui/game_scanner.cpp b/core/ui/game_scanner.cpp new file mode 100644 index 000000000..d56dd179e --- /dev/null +++ b/core/ui/game_scanner.cpp @@ -0,0 +1,177 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "game_scanner.h" +#include "stdclass.h" +#include "oslib/oslib.h" +#include "oslib/storage.h" +#include "cfg/option.h" + +static bool operator<(const GameMedia &left, const GameMedia &right) +{ + return left.name < right.name; +} + +void GameScanner::insert_game(const GameMedia& game) +{ + LockGuard _(mutex); + game_list.insert(std::upper_bound(game_list.begin(), game_list.end(), game), game); +} + +void GameScanner::insert_arcade_game(const GameMedia& game) +{ + arcade_game_list.insert(std::upper_bound(arcade_game_list.begin(), arcade_game_list.end(), game), game); +} + +void GameScanner::add_game_directory(const std::string& path) +{ + hostfs::DirectoryTree tree(path); + std::string emptyParentPath; + for (const hostfs::FileInfo& item : tree) + { + if (!running) + break; + + if (game_list.empty()) + { + // This won't work for android content uris + size_t slash = get_last_slash_pos(item.path); + std::string parentPath; + if (slash != 0 && slash != std::string::npos) + parentPath = item.path.substr(0, slash); + else + parentPath = item.path; + if (parentPath != emptyParentPath) + { + ++empty_folders_scanned; + emptyParentPath = parentPath; + if (empty_folders_scanned > 1000) + content_path_looks_incorrect = true; + } + } + else + { + content_path_looks_incorrect = false; + } + + if (item.name.substr(0, 2) == "._") + // Ignore Mac OS turds + continue; + std::string fileName(item.name); + std::string gameName(get_file_basename(item.name)); + std::string extension = get_file_extension(item.name); + if (extension == "zip" || extension == "7z") + { + string_tolower(gameName); + auto it = arcade_games.find(gameName); + if (it == arcade_games.end()) + continue; + gameName = it->second->description; + fileName = fileName + " (" + gameName + ")"; + insert_arcade_game(GameMedia{ fileName, item.path, item.name, gameName }); + continue; + } + else if (extension == "bin" || extension == "lst" || extension == "dat") + { + if (!config::HideLegacyNaomiRoms) + insert_arcade_game(GameMedia{ fileName, item.path, item.name, gameName }); + continue; + } + else if (extension == "chd" || extension == "gdi") + { + // Hide arcade gdroms + std::string basename = gameName; + string_tolower(basename); + if (arcade_gdroms.count(basename) != 0) + continue; + } + else if (extension != "cdi" && extension != "cue") + continue; + insert_game(GameMedia{ fileName, item.path, item.name, gameName }); + } +} + +void GameScanner::stop() +{ + LockGuard _(threadMutex); + running = false; + empty_folders_scanned = 0; + content_path_looks_incorrect = false; + if (scan_thread && scan_thread->joinable()) + scan_thread->join(); +} + +void GameScanner::fetch_game_list() +{ + LockGuard _(threadMutex); + if (scan_done || running) + return; + if (scan_thread && scan_thread->joinable()) + scan_thread->join(); + running = true; + scan_thread = std::make_unique([this]() + { + ThreadName _("GameScanner"); + if (arcade_games.empty()) + for (int gameid = 0; Games[gameid].name != nullptr; gameid++) + { + const Game *game = &Games[gameid]; + arcade_games[game->name] = game; + if (game->gdrom_name != nullptr) + arcade_gdroms.insert(game->gdrom_name); + } + { + LockGuard _(mutex); + game_list.clear(); + } + arcade_game_list.clear(); + for (const auto& path : config::ContentPath.get()) + { + try { + add_game_directory(path); + } catch (const hostfs::StorageException& e) { + // ignore + } + if (!running) + break; + } + std::string dcbios = hostfs::findFlash("dc_", "%bios.bin;%boot.bin"); + { + const std::vector& cdromDrives = hostfs::getCdromDrives(); + LockGuard _(mutex); + // CD-ROM devices + for (auto it = cdromDrives.rbegin(); it != cdromDrives.rend(); ++it) + { + std::string name; + if (it->substr(0, 4) == "\\\\.\\") + name = it->substr(4); + else + name = *it; + game_list.insert(game_list.begin(), { name, *it, name, "", true }); + } + // Dreamcast BIOS + if (!dcbios.empty()) + game_list.insert(game_list.begin(), { "Dreamcast BIOS" }); + // Arcade games + game_list.insert(game_list.end(), arcade_game_list.begin(), arcade_game_list.end()); + } + if (running) + scan_done = true; + running = false; + }); +} diff --git a/core/ui/game_scanner.h b/core/ui/game_scanner.h new file mode 100644 index 000000000..e92b17ddb --- /dev/null +++ b/core/ui/game_scanner.h @@ -0,0 +1,73 @@ +/* + Copyright 2020 flyinghead + + This file is part of flycast. + + flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + flycast 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 flycast. If not, see . + */ +#pragma once +#include "types.h" +#include "hw/naomi/naomi_roms.h" +#include +#include +#include +#include +#include +#include + +struct GameMedia +{ + std::string name; // Display name + std::string path; // Full path to rom. May be an encoded uri + std::string fileName; // Last component of the path, decoded + std::string gameName; // for arcade games only, description from the rom list + bool device = false; // Corresponds to a physical cdrom device +}; + +class GameScanner +{ + std::vector game_list; + std::vector arcade_game_list; + std::mutex mutex; + std::mutex threadMutex; + std::unique_ptr scan_thread; + bool scan_done = false; + bool running = false; + std::unordered_map arcade_games; + std::unordered_set arcade_gdroms; + using LockGuard = std::lock_guard; + + void insert_game(const GameMedia& game); + void insert_arcade_game(const GameMedia& game); + void add_game_directory(const std::string& path); + +public: + ~GameScanner() + { + stop(); + } + void refresh() + { + stop(); + scan_done = false; + } + + void stop(); + void fetch_game_list(); + + std::mutex& get_mutex() { return mutex; } + const std::vector& get_game_list() { return game_list; } + unsigned int empty_folders_scanned = 0; + bool content_path_looks_incorrect = false; +}; diff --git a/core/ui/gui.cpp b/core/ui/gui.cpp new file mode 100644 index 000000000..b8c028243 --- /dev/null +++ b/core/ui/gui.cpp @@ -0,0 +1,3899 @@ +/* + Copyright 2019 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#include "gui.h" +#include "rend/osd.h" +#include "cfg/cfg.h" +#include "hw/maple/maple_if.h" +#include "hw/maple/maple_devs.h" +#include "imgui.h" +#include "imgui_stdlib.h" +#include "network/net_handshake.h" +#include "network/ggpo.h" +#include "wsi/context.h" +#include "input/gamepad_device.h" +#include "gui_util.h" +#include "game_scanner.h" +#include "version.h" +#include "oslib/oslib.h" +#include "audio/audiostream.h" +#include "imgread/common.h" +#include "log/LogManager.h" +#include "emulator.h" +#include "mainui.h" +#include "lua/lua.h" +#include "gui_chat.h" +#include "imgui_driver.h" +#if FC_PROFILER +#include "implot.h" +#endif +#include "boxart/boxart.h" +#include "profiler/fc_profiler.h" +#include "hw/naomi/card_reader.h" +#include "oslib/resources.h" +#include "achievements/achievements.h" +#include "gui_achievements.h" +#include "IconsFontAwesome6.h" +#include "oslib/storage.h" +#include +#include "hw/pvr/Renderer_if.h" +#if defined(USE_SDL) +#include "sdl/sdl.h" +#endif + +#include "vgamepad.h" +#ifdef __ANDROID__ +#if HOST_CPU == CPU_ARM64 && USE_VULKAN +#include "rend/vulkan/adreno.h" +#endif +#endif + +#ifdef _WIN32 +#include +#else +#include +#endif +#include +#include + +static bool game_started; + +int insetLeft, insetRight, insetTop, insetBottom; +std::unique_ptr imguiDriver; + +static bool inited = false; +GuiState gui_state = GuiState::Main; +static bool commandLineStart; +static u32 mouseButtons; +static int mouseX, mouseY; +static float mouseWheel; +static std::string error_msg; +static bool error_msg_shown; +static std::string osd_message; +static u64 osd_message_end; +static std::mutex osd_message_mutex; +static void (*showOnScreenKeyboard)(bool show); +static bool keysUpNextFrame[512]; +static bool uiUserScaleUpdated; + +static void reset_vmus(); +void error_popup(); + +static GameScanner scanner; +static BackgroundGameLoader gameLoader; +static Boxart boxart; +static Chat chat; +static std::recursive_mutex guiMutex; +using LockGuard = std::lock_guard; + +ImFont *largeFont; +static Toast toast; +static ThreadRunner uiThreadRunner; + +static void emuEventCallback(Event event, void *) +{ + switch (event) + { + case Event::Resume: + game_started = true; + vgamepad::startGame(); + break; + case Event::Start: + GamepadDevice::load_system_mappings(); + break; + case Event::Terminate: + GamepadDevice::load_system_mappings(); + game_started = false; + break; + default: + break; + } +} + +void gui_init() +{ + if (inited) + return; + inited = true; + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); +#if FC_PROFILER + ImPlot::CreateContext(); +#endif + ImGuiIO& io = ImGui::GetIO(); + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + + io.IniFilename = NULL; + + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + EventManager::listen(Event::Resume, emuEventCallback); + EventManager::listen(Event::Start, emuEventCallback); + EventManager::listen(Event::Terminate, emuEventCallback); + ggpo::receiveChatMessages([](int playerNum, const std::string& msg) { chat.receive(playerNum, msg); }); +} + +static ImGuiKey keycodeToImGuiKey(u8 keycode) +{ + switch (keycode) + { + case 0x2B: return ImGuiKey_Tab; + case 0x50: return ImGuiKey_LeftArrow; + case 0x4F: return ImGuiKey_RightArrow; + case 0x52: return ImGuiKey_UpArrow; + case 0x51: return ImGuiKey_DownArrow; + case 0x4B: return ImGuiKey_PageUp; + case 0x4E: return ImGuiKey_PageDown; + case 0x4A: return ImGuiKey_Home; + case 0x4D: return ImGuiKey_End; + case 0x49: return ImGuiKey_Insert; + case 0x4C: return ImGuiKey_Delete; + case 0x2A: return ImGuiKey_Backspace; + case 0x2C: return ImGuiKey_Space; + case 0x28: return ImGuiKey_Enter; + case 0x29: return ImGuiKey_Escape; + case 0x04: return ImGuiKey_A; + case 0x06: return ImGuiKey_C; + case 0x19: return ImGuiKey_V; + case 0x1B: return ImGuiKey_X; + case 0x1C: return ImGuiKey_Y; + case 0x1D: return ImGuiKey_Z; + case 0xE0: + case 0xE4: + return ImGuiMod_Ctrl; + case 0xE1: + case 0xE5: + return ImGuiMod_Shift; + case 0xE3: + case 0xE7: + return ImGuiMod_Super; + default: return ImGuiKey_None; + } +} + +void gui_initFonts() +{ + static float uiScale; + + verify(inited); + uiThreadRunner.init(); + +#if !defined(TARGET_UWP) && !defined(__SWITCH__) + settings.display.uiScale = std::max(1.f, settings.display.dpi / 100.f * 0.75f); + // Limit scaling on small low-res screens + if (settings.display.width <= 640 || settings.display.height <= 480) + settings.display.uiScale = std::min(1.2f, settings.display.uiScale); +#endif + settings.display.uiScale *= config::UIScaling / 100.f; + if (settings.display.uiScale == uiScale && ImGui::GetIO().Fonts->IsBuilt()) + return; + uiScale = settings.display.uiScale; + + // Setup Dear ImGui style + ImGui::GetStyle() = ImGuiStyle{}; + ImGui::StyleColorsDark(); + ImGui::GetStyle().TabRounding = 0; + ImGui::GetStyle().ItemSpacing = ImVec2(8, 8); // from 8,4 + ImGui::GetStyle().ItemInnerSpacing = ImVec2(4, 6); // from 4,4 +#if defined(__ANDROID__) || defined(TARGET_IPHONE) || defined(__SWITCH__) + ImGui::GetStyle().TouchExtraPadding = ImVec2(1, 1); // from 0,0 +#endif + if (settings.display.uiScale > 1) + ImGui::GetStyle().ScaleAllSizes(settings.display.uiScale); + + static const ImWchar ranges[] = + { + 0x0020, 0xFFFF, // All chars + 0, + }; + + ImGuiIO& io = ImGui::GetIO(); + io.Fonts->Clear(); + largeFont = nullptr; + const float fontSize = uiScaled(17.f); + size_t dataSize; + std::unique_ptr data = resource::load("fonts/Roboto-Medium.ttf", dataSize); + verify(data != nullptr); + io.Fonts->AddFontFromMemoryTTF(data.release(), dataSize, fontSize, nullptr, ranges); + ImFontConfig font_cfg; + font_cfg.MergeMode = true; +#ifdef _WIN32 + u32 cp = GetACP(); + std::string fontDir = std::string(nowide::getenv("SYSTEMROOT")) + "\\Fonts\\"; + switch (cp) + { + case 932: // Japanese + { + font_cfg.FontNo = 2; // UIGothic + ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "msgothic.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); + font_cfg.FontNo = 2; // Meiryo UI + if (font == nullptr) + io.Fonts->AddFontFromFileTTF((fontDir + "Meiryo.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); + } + break; + case 949: // Korean + { + ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "Malgun.ttf").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); + if (font == nullptr) + { + font_cfg.FontNo = 2; // Dotum + io.Fonts->AddFontFromFileTTF((fontDir + "Gulim.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); + } + } + break; + case 950: // Traditional Chinese + { + font_cfg.FontNo = 1; // Microsoft JhengHei UI Regular + ImFont* font = io.Fonts->AddFontFromFileTTF((fontDir + "Msjh.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); + font_cfg.FontNo = 0; + if (font == nullptr) + io.Fonts->AddFontFromFileTTF((fontDir + "MSJH.ttf").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); + } + break; + case 936: // Simplified Chinese + io.Fonts->AddFontFromFileTTF((fontDir + "Simsun.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseSimplifiedOfficial()); + break; + default: + break; + } +#elif defined(__APPLE__) && !defined(TARGET_IPHONE) + std::string fontDir = std::string("/System/Library/Fonts/"); + + extern std::string os_Locale(); + std::string locale = os_Locale(); + + if (locale.find("ja") == 0) // Japanese + { + io.Fonts->AddFontFromFileTTF((fontDir + "ヒラギノ角ゴシック W4.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesJapanese()); + } + else if (locale.find("ko") == 0) // Korean + { + io.Fonts->AddFontFromFileTTF((fontDir + "AppleSDGothicNeo.ttc").c_str(), fontSize, &font_cfg, io.Fonts->GetGlyphRangesKorean()); + } + else if (locale.find("zh-Hant") == 0) // Traditional Chinese + { + io.Fonts->AddFontFromFileTTF((fontDir + "PingFang.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseTraditionalOfficial()); + } + else if (locale.find("zh-Hans") == 0) // Simplified Chinese + { + io.Fonts->AddFontFromFileTTF((fontDir + "PingFang.ttc").c_str(), fontSize, &font_cfg, GetGlyphRangesChineseSimplifiedOfficial()); + } +#elif defined(__ANDROID__) + if (getenv("FLYCAST_LOCALE") != nullptr) + { + const ImWchar *glyphRanges = nullptr; + std::string locale = getenv("FLYCAST_LOCALE"); + if (locale.find("ja") == 0) // Japanese + glyphRanges = io.Fonts->GetGlyphRangesJapanese(); + else if (locale.find("ko") == 0) // Korean + glyphRanges = io.Fonts->GetGlyphRangesKorean(); + else if (locale.find("zh_TW") == 0 + || locale.find("zh_HK") == 0) // Traditional Chinese + glyphRanges = GetGlyphRangesChineseTraditionalOfficial(); + else if (locale.find("zh_CN") == 0) // Simplified Chinese + glyphRanges = GetGlyphRangesChineseSimplifiedOfficial(); + + if (glyphRanges != nullptr) + io.Fonts->AddFontFromFileTTF("/system/fonts/NotoSansCJK-Regular.ttc", fontSize, &font_cfg, glyphRanges); + } + + // TODO Linux, iOS, ... +#endif + // Font Awesome symbols (added to default font) + data = resource::load("fonts/" FONT_ICON_FILE_NAME_FAS, dataSize); + verify(data != nullptr); + font_cfg.FontNo = 0; + static ImWchar faRanges[] = { ICON_MIN_FA, ICON_MAX_FA, 0 }; + io.Fonts->AddFontFromMemoryTTF(data.release(), dataSize, fontSize, &font_cfg, faRanges); + // Large font without Asian glyphs + data = resource::load("fonts/Roboto-Regular.ttf", dataSize); + verify(data != nullptr); + const float largeFontSize = uiScaled(21.f); + largeFont = io.Fonts->AddFontFromMemoryTTF(data.release(), dataSize, largeFontSize, nullptr, ranges); + + NOTICE_LOG(RENDERER, "Screen DPI is %.0f, size %d x %d. Scaling by %.2f", settings.display.dpi, settings.display.width, settings.display.height, settings.display.uiScale); + vgamepad::applyUiScale(); +} + +void gui_keyboard_input(u16 wc) +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.WantCaptureKeyboard) + io.AddInputCharacter(wc); +} + +void gui_keyboard_inputUTF8(const std::string& s) +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.WantCaptureKeyboard) + io.AddInputCharactersUTF8(s.c_str()); +} + +void gui_keyboard_key(u8 keyCode, bool pressed) +{ + if (!inited) + return; + ImGuiKey key = keycodeToImGuiKey(keyCode); + if (key == ImGuiKey_None) + return; + if (!pressed && ImGui::IsKeyDown(key)) + { + keysUpNextFrame[keyCode] = true; + return; + } + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(key, pressed); +} + +bool gui_keyboard_captured() +{ + ImGuiIO& io = ImGui::GetIO(); + return io.WantCaptureKeyboard; +} + +bool gui_mouse_captured() +{ + ImGuiIO& io = ImGui::GetIO(); + return io.WantCaptureMouse; +} + +void gui_set_mouse_position(int x, int y) +{ + mouseX = std::round(x * settings.display.pointScale); + mouseY = std::round(y * settings.display.pointScale); +} + +void gui_set_mouse_button(int button, bool pressed) +{ + if (pressed) + mouseButtons |= 1 << button; + else + mouseButtons &= ~(1 << button); +} + +void gui_set_mouse_wheel(float delta) +{ + mouseWheel += delta; +} + +static void gui_newFrame() +{ + imguiDriver->newFrame(); + ImGui::GetIO().DisplaySize.x = settings.display.width; + ImGui::GetIO().DisplaySize.y = settings.display.height; + + ImGuiIO& io = ImGui::GetIO(); + + if (mouseX < 0 || mouseX >= settings.display.width || mouseY < 0 || mouseY >= settings.display.height) + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + else + io.AddMousePosEvent(mouseX, mouseY); + static bool delayTouch; +#if defined(__ANDROID__) || defined(TARGET_IPHONE) || defined(__SWITCH__) + // Delay touch by one frame to allow widgets to be hovered before click + // This is required for widgets using ImGuiButtonFlags_AllowItemOverlap such as TabItem's + if (!delayTouch && (mouseButtons & (1 << 0)) != 0 && !io.MouseDown[ImGuiMouseButton_Left]) + delayTouch = true; + else + delayTouch = false; +#endif + if (io.WantCaptureMouse) + { + io.AddMouseWheelEvent(0, -mouseWheel / 16); + mouseWheel = 0; + } + if (!delayTouch) + io.AddMouseButtonEvent(ImGuiMouseButton_Left, (mouseButtons & (1 << 0)) != 0); + io.AddMouseButtonEvent(ImGuiMouseButton_Right, (mouseButtons & (1 << 1)) != 0); + io.AddMouseButtonEvent(ImGuiMouseButton_Middle, (mouseButtons & (1 << 2)) != 0); + io.AddMouseButtonEvent(3, (mouseButtons & (1 << 3)) != 0); + + // shows a popup navigation window even in game because of the OSD + //io.AddKeyEvent(ImGuiKey_GamepadFaceLeft, ((kcode[0] & DC_BTN_X) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadFaceRight, ((kcode[0] & DC_BTN_B) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadFaceUp, ((kcode[0] & DC_BTN_Y) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadFaceDown, ((kcode[0] & DC_BTN_A) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadDpadLeft, ((kcode[0] & DC_DPAD_LEFT) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadDpadRight, ((kcode[0] & DC_DPAD_RIGHT) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadDpadUp, ((kcode[0] & DC_DPAD_UP) == 0)); + io.AddKeyEvent(ImGuiKey_GamepadDpadDown, ((kcode[0] & DC_DPAD_DOWN) == 0)); + + float analog; + analog = joyx[0] < 0 ? -(float)joyx[0] / 32768.f : 0.f; + io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickLeft, analog > 0.1f, analog); + analog = joyx[0] > 0 ? (float)joyx[0] / 32768.f : 0.f; + io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickRight, analog > 0.1f, analog); + analog = joyy[0] < 0 ? -(float)joyy[0] / 32768.f : 0.f; + io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickUp, analog > 0.1f, analog); + analog = joyy[0] > 0 ? (float)joyy[0] / 32768.f : 0.f; + io.AddKeyAnalogEvent(ImGuiKey_GamepadLStickDown, analog > 0.1f, analog); + + ImGui::GetStyle().Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); + + if (showOnScreenKeyboard != nullptr) + showOnScreenKeyboard(io.WantTextInput); +#ifdef USE_SDL + else + { + if (io.WantTextInput && !SDL_IsTextInputActive()) + { + SDL_StartTextInput(); + } + else if (!io.WantTextInput && SDL_IsTextInputActive()) + { + SDL_StopTextInput(); + } + } +#endif +} + +static void delayedKeysUp() +{ + ImGuiIO& io = ImGui::GetIO(); + for (u32 i = 0; i < std::size(keysUpNextFrame); i++) + if (keysUpNextFrame[i]) + io.AddKeyEvent(keycodeToImGuiKey(i), false); + memset(keysUpNextFrame, 0, sizeof(keysUpNextFrame)); +} + +static void gui_endFrame(bool gui_open) +{ + imguiDriver->renderDrawData(ImGui::GetDrawData(), gui_open); + delayedKeysUp(); +} + +void gui_setOnScreenKeyboardCallback(void (*callback)(bool show)) +{ + showOnScreenKeyboard = callback; +} + +void gui_set_insets(int left, int right, int top, int bottom) +{ + insetLeft = left; + insetRight = right; + insetTop = top; + insetBottom = bottom; +} + +#if 0 +#include "oslib/timeseries.h" +#include +TimeSeries renderTimes; +TimeSeries vblankTimes; + +void gui_plot_render_time(int width, int height) +{ + std::vector v = renderTimes.data(); + ImGui::PlotLines("Render Times", v.data(), v.size(), 0, "", 0.0, 1.0 / 30.0, ImVec2(300, 50)); + ImGui::Text("StdDev: %.1f%%", renderTimes.stddev() * 100.f / 0.01666666667f); + v = vblankTimes.data(); + ImGui::PlotLines("VBlank", v.data(), v.size(), 0, "", 0.0, 1.0 / 30.0, ImVec2(300, 50)); + ImGui::Text("StdDev: %.1f%%", vblankTimes.stddev() * 100.f / 0.01666666667f); +} +#endif + +void gui_open_settings() +{ + const LockGuard lock(guiMutex); + if (gui_state == GuiState::Closed && !settings.naomi.slave) + { + if (!ggpo::active()) + { + if (achievements::canPause()) + { + vgamepad::hide(); + try { + emu.stop(); + gui_setState(GuiState::Commands); + } catch (const FlycastException& e) { + gui_stop_game(e.what()); + } + } + } + else + { + chat.toggle(); + } + } + else if (gui_state == GuiState::VJoyEdit) + { + vgamepad::pauseEditing(); + // iOS: force a touch up event to make up for the one eaten by the tap gesture recognizer + mouseButtons &= ~1; + gui_setState(GuiState::VJoyEditCommands); + } + else if (gui_state == GuiState::Loading) + { + gameLoader.cancel(); + } + else if (gui_state == GuiState::Commands) + { + gui_setState(GuiState::Closed); + GamepadDevice::load_system_mappings(); + emu.start(); + } +} + +void gui_start_game(const std::string& path) +{ + const LockGuard lock(guiMutex); + if (gui_state != GuiState::Main && gui_state != GuiState::Closed && gui_state != GuiState::Commands) + return; + emu.unloadGame(); + reset_vmus(); + chat.reset(); + + scanner.stop(); + gui_setState(GuiState::Loading); + gameLoader.load(path); +} + +void gui_stop_game(const std::string& message) +{ + const LockGuard lock(guiMutex); + if (!commandLineStart) + { + // Exit to main menu + emu.unloadGame(); + gui_setState(GuiState::Main); + reset_vmus(); + if (!message.empty()) + gui_error("Flycast has stopped.\n\n" + message); + } + else + { + if (!message.empty()) + ERROR_LOG(COMMON, "Flycast has stopped: %s", message.c_str()); + // Exit emulator + dc_exit(); + } +} + +static bool savestateAllowed() +{ + return !settings.content.path.empty() && !settings.network.online && !settings.naomi.multiboard; +} + +static void appendVectorData(void *context, void *data, int size) +{ + std::vector& v = *(std::vector *)context; + const u8 *bytes = (const u8 *)data; + v.insert(v.end(), bytes, bytes + size); +} + +static void getScreenshot(std::vector& data, int width = 0) +{ + data.clear(); + std::vector rawData; + int height = 0; + if (renderer == nullptr || !renderer->GetLastFrame(rawData, width, height)) + return; + stbi_flip_vertically_on_write(0); + stbi_write_png_to_func(appendVectorData, &data, width, height, 3, &rawData[0], 0); +} + +static void savestate() +{ + // TODO save state async: png compression, savestate file compression/write + std::vector pngData; + getScreenshot(pngData, 640); + dc_savestate(config::SavestateSlot, pngData.empty() ? nullptr : &pngData[0], pngData.size()); + ImguiStateTexture savestatePic; + savestatePic.invalidate(); +} + +static void gui_display_commands() +{ + fullScreenWindow(false); + ImGui::SetNextWindowBgAlpha(0.8f); + ImguiStyleVar _{ImGuiStyleVar_WindowBorderSize, 0}; + + ImGui::Begin("##commands", NULL, ImGuiWindowFlags_NoDecoration); + { + ImguiStyleVar _{ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)}; // left aligned + + float columnWidth = std::min(200.f, + (ImGui::GetContentRegionAvail().x - uiScaled(100 + 150) - ImGui::GetStyle().FramePadding.x * 2) + / 2 / uiScaled(1)); + float buttonWidth = 150.f; // not scaled + bool lowWidth = ImGui::GetContentRegionAvail().x < uiScaled(100 + buttonWidth * 3) + + ImGui::GetStyle().FramePadding.x * 2 + ImGui::GetStyle().ItemSpacing.x * 2; + if (lowWidth) + buttonWidth = std::min(150.f, + (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().FramePadding.x * 2 - ImGui::GetStyle().ItemSpacing.x * 2) + / 3 / uiScaled(1)); + bool lowHeight = ImGui::GetContentRegionAvail().y < uiScaled(100 + 50 * 2 + buttonWidth * 3 / 4) + ImGui::GetTextLineHeightWithSpacing() * 2 + + ImGui::GetStyle().ItemSpacing.y * 2 + ImGui::GetStyle().WindowPadding.y; + + GameMedia game; + game.path = settings.content.path; + game.fileName = settings.content.fileName; + GameBoxart art = boxart.getBoxart(game); + ImguiFileTexture tex(art.boxartPath); + // TODO use placeholder image if not available + tex.draw(ScaledVec2(100, 100)); + + ImGui::SameLine(); + if (!lowHeight) + { + ImGui::BeginChild("game_info", ScaledVec2(0, 100.f), ImGuiChildFlags_Border, ImGuiWindowFlags_None); + ImGui::PushFont(largeFont); + ImGui::Text("%s", art.name.c_str()); + ImGui::PopFont(); + { + ImguiStyleColor _(ImGuiCol_Text, ImVec4(0.75f, 0.75f, 0.75f, 1.f)); + ImGui::TextWrapped("%s", art.fileName.c_str()); + } + ImGui::EndChild(); + } + + if (lowWidth) { + ImGui::Columns(3, "buttons", false); + } + else + { + ImGui::Columns(4, "buttons", false); + ImGui::SetColumnWidth(0, uiScaled(100.f) + ImGui::GetStyle().ItemSpacing.x); + ImGui::SetColumnWidth(1, uiScaled(columnWidth)); + ImGui::SetColumnWidth(2, uiScaled(columnWidth)); + const ImVec2 vmuPos = ImGui::GetStyle().WindowPadding + ScaledVec2(0.f, 100.f) + + ImVec2(insetLeft, ImGui::GetStyle().ItemSpacing.y); + ImguiVmuTexture::displayVmus(vmuPos); + ImGui::NextColumn(); + } + ImguiStyleVar _1{ImGuiStyleVar_FramePadding, ScaledVec2(12.f, 3.f)}; + + // Resume + if (ImGui::Button(ICON_FA_PLAY " Resume", ScaledVec2(buttonWidth, 50))) + { + GamepadDevice::load_system_mappings(); + gui_setState(GuiState::Closed); + } + // Cheats + { + DisabledScope _{settings.network.online || settings.raHardcoreMode}; + + if (ImGui::Button(ICON_FA_MASK " Cheats", ScaledVec2(buttonWidth, 50)) && !settings.network.online) + gui_setState(GuiState::Cheats); + } + // Achievements + { + DisabledScope _{!achievements::isActive()}; + + if (ImGui::Button(ICON_FA_TROPHY " Achievements", ScaledVec2(buttonWidth, 50)) && achievements::isActive()) + gui_setState(GuiState::Achievements); + } + // Barcode + if (card_reader::barcodeAvailable()) + { + ImGui::Text("Barcode Card"); + char cardBuf[64] {}; + strncpy(cardBuf, card_reader::barcodeGetCard().c_str(), sizeof(cardBuf) - 1); + ImGui::SetNextItemWidth(uiScaled(buttonWidth)); + if (ImGui::InputText("##barcode", cardBuf, sizeof(cardBuf), ImGuiInputTextFlags_None, nullptr, nullptr)) + card_reader::barcodeSetCard(cardBuf); + } + + ImGui::NextColumn(); + + // Insert/Eject Disk + const char *disk_label = gdr::isOpen() ? ICON_FA_COMPACT_DISC " Insert Disk" : ICON_FA_COMPACT_DISC " Eject Disk"; + if (ImGui::Button(disk_label, ScaledVec2(buttonWidth, 50))) + { + if (gdr::isOpen()) { + gui_setState(GuiState::SelectDisk); + } + else { + emu.openGdrom(); + gui_setState(GuiState::Closed); + } + } + // Settings + if (ImGui::Button(ICON_FA_GEAR " Settings", ScaledVec2(buttonWidth, 50))) + gui_setState(GuiState::Settings); + + // Exit + if (ImGui::Button(commandLineStart ? ICON_FA_POWER_OFF " Exit" : ICON_FA_POWER_OFF " Close Game", ScaledVec2(buttonWidth, 50))) + gui_stop_game(); + + ImGui::NextColumn(); + { + DisabledScope _{!savestateAllowed()}; + ImguiStateTexture savestatePic; + time_t savestateDate = dc_getStateCreationDate(config::SavestateSlot); + + // Load State + { + DisabledScope _{settings.raHardcoreMode || savestateDate == 0}; + if (ImGui::Button(ICON_FA_CLOCK_ROTATE_LEFT " Load State", ScaledVec2(buttonWidth, 50)) && savestateAllowed()) + { + gui_setState(GuiState::Closed); + dc_loadstate(config::SavestateSlot); + } + } + + // Save State + if (ImGui::Button(ICON_FA_DOWNLOAD " Save State", ScaledVec2(buttonWidth, 50)) && savestateAllowed()) + { + gui_setState(GuiState::Closed); + savestate(); + } + + // Slot # + if (ImGui::ArrowButton("##prev-slot", ImGuiDir_Left)) + { + if (config::SavestateSlot == 0) + config::SavestateSlot = 9; + else + config::SavestateSlot--; + SaveSettings(); + } + std::string slot = "Slot " + std::to_string((int)config::SavestateSlot + 1); + float spacingW = (uiScaled(buttonWidth) - ImGui::GetFrameHeight() * 2 - ImGui::CalcTextSize(slot.c_str()).x) / 2; + ImGui::SameLine(0, spacingW); + ImGui::Text("%s", slot.c_str()); + ImGui::SameLine(0, spacingW); + if (ImGui::ArrowButton("##next-slot", ImGuiDir_Right)) + { + if (config::SavestateSlot == 9) + config::SavestateSlot = 0; + else + config::SavestateSlot++; + SaveSettings(); + } + { + ImVec4 gray(0.75f, 0.75f, 0.75f, 1.f); + if (savestateDate == 0) + ImGui::TextColored(gray, "Empty"); + else + ImGui::TextColored(gray, "%s", timeToISO8601(savestateDate).c_str()); + } + savestatePic.draw(ScaledVec2(buttonWidth, 0.f)); + } + + ImGui::Columns(1, nullptr, false); + } + ImGui::End(); +} + +inline static void header(const char *title) +{ + ImguiStyleVar _(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)); // Left + ImguiStyleVar _1(ImGuiStyleVar_DisabledAlpha, 1.0f); + ImGui::BeginDisabled(); + ImGui::ButtonEx(title, ImVec2(-1, 0)); + ImGui::EndDisabled(); +} + +const char *maple_device_types[] = +{ + "None", + "Sega Controller", + "Light Gun", + "Keyboard", + "Mouse", + "Twin Stick", + "Arcade/Ascii Stick", + "Maracas Controller", + "Fishing Controller", + "Pop'n Music controller", + "Racing Controller", + "Densha de Go! Controller", + "Full Controller", +// "Dreameye", +}; + +const char *maple_expansion_device_types[] = +{ + "None", + "Sega VMU", + "Vibration Pack", + "Microphone", +}; + +static const char *maple_device_name(MapleDeviceType type) +{ + switch (type) + { + case MDT_SegaController: + return maple_device_types[1]; + case MDT_LightGun: + return maple_device_types[2]; + case MDT_Keyboard: + return maple_device_types[3]; + case MDT_Mouse: + return maple_device_types[4]; + case MDT_TwinStick: + return maple_device_types[5]; + case MDT_AsciiStick: + return maple_device_types[6]; + case MDT_MaracasController: + return maple_device_types[7]; + case MDT_FishingController: + return maple_device_types[8]; + case MDT_PopnMusicController: + return maple_device_types[9]; + case MDT_RacingController: + return maple_device_types[10]; + case MDT_DenshaDeGoController: + return maple_device_types[11]; + case MDT_SegaControllerXL: + return maple_device_types[12]; + case MDT_Dreameye: +// return maple_device_types[13]; + case MDT_None: + default: + return maple_device_types[0]; + } +} + +static MapleDeviceType maple_device_type_from_index(int idx) +{ + switch (idx) + { + case 1: + return MDT_SegaController; + case 2: + return MDT_LightGun; + case 3: + return MDT_Keyboard; + case 4: + return MDT_Mouse; + case 5: + return MDT_TwinStick; + case 6: + return MDT_AsciiStick; + case 7: + return MDT_MaracasController; + case 8: + return MDT_FishingController; + case 9: + return MDT_PopnMusicController; + case 10: + return MDT_RacingController; + case 11: + return MDT_DenshaDeGoController; + case 12: + return MDT_SegaControllerXL; + case 13: + return MDT_Dreameye; + case 0: + default: + return MDT_None; + } +} + +static const char *maple_expansion_device_name(MapleDeviceType type) +{ + switch (type) + { + case MDT_SegaVMU: + return maple_expansion_device_types[1]; + case MDT_PurupuruPack: + return maple_expansion_device_types[2]; + case MDT_Microphone: + return maple_expansion_device_types[3]; + case MDT_None: + default: + return maple_expansion_device_types[0]; + } +} + +const char *maple_ports[] = { "None", "A", "B", "C", "D", "All" }; + +struct Mapping { + DreamcastKey key; + const char *name; +}; + +const Mapping dcButtons[] = { + { EMU_BTN_NONE, "Directions" }, + { DC_DPAD_UP, "Up" }, + { DC_DPAD_DOWN, "Down" }, + { DC_DPAD_LEFT, "Left" }, + { DC_DPAD_RIGHT, "Right" }, + + { DC_AXIS_UP, "Thumbstick Up" }, + { DC_AXIS_DOWN, "Thumbstick Down" }, + { DC_AXIS_LEFT, "Thumbstick Left" }, + { DC_AXIS_RIGHT, "Thumbstick Right" }, + + { DC_AXIS2_UP, "R.Thumbstick Up" }, + { DC_AXIS2_DOWN, "R.Thumbstick Down" }, + { DC_AXIS2_LEFT, "R.Thumbstick Left" }, + { DC_AXIS2_RIGHT, "R.Thumbstick Right" }, + + { DC_AXIS3_UP, "Axis 3 Up" }, + { DC_AXIS3_DOWN, "Axis 3 Down" }, + { DC_AXIS3_LEFT, "Axis 3 Left" }, + { DC_AXIS3_RIGHT, "Axis 3 Right" }, + + { DC_DPAD2_UP, "DPad2 Up" }, + { DC_DPAD2_DOWN, "DPad2 Down" }, + { DC_DPAD2_LEFT, "DPad2 Left" }, + { DC_DPAD2_RIGHT, "DPad2 Right" }, + + { EMU_BTN_NONE, "Buttons" }, + { DC_BTN_A, "A" }, + { DC_BTN_B, "B" }, + { DC_BTN_X, "X" }, + { DC_BTN_Y, "Y" }, + { DC_BTN_C, "C" }, + { DC_BTN_D, "D" }, + { DC_BTN_Z, "Z" }, + + { EMU_BTN_NONE, "Triggers" }, + { DC_AXIS_LT, "Left Trigger" }, + { DC_AXIS_RT, "Right Trigger" }, + { DC_AXIS_LT2, "Left Trigger 2" }, + { DC_AXIS_RT2, "Right Trigger 2" }, + + { EMU_BTN_NONE, "System Buttons" }, + { DC_BTN_START, "Start" }, + { DC_BTN_RELOAD, "Reload" }, + + { EMU_BTN_NONE, "Emulator" }, + { EMU_BTN_MENU, "Menu" }, + { EMU_BTN_ESCAPE, "Exit" }, + { EMU_BTN_FFORWARD, "Fast-forward" }, + { EMU_BTN_LOADSTATE, "Load State" }, + { EMU_BTN_SAVESTATE, "Save State" }, + { EMU_BTN_BYPASS_KB, "Bypass Emulated Keyboard" }, + { EMU_BTN_SCREENSHOT, "Save Screenshot" }, + + { EMU_BTN_NONE, nullptr } +}; + +const Mapping arcadeButtons[] = { + { EMU_BTN_NONE, "Directions" }, + { DC_DPAD_UP, "Up" }, + { DC_DPAD_DOWN, "Down" }, + { DC_DPAD_LEFT, "Left" }, + { DC_DPAD_RIGHT, "Right" }, + + { DC_AXIS_UP, "Thumbstick Up" }, + { DC_AXIS_DOWN, "Thumbstick Down" }, + { DC_AXIS_LEFT, "Thumbstick Left" }, + { DC_AXIS_RIGHT, "Thumbstick Right" }, + + { DC_AXIS2_UP, "R.Thumbstick Up" }, + { DC_AXIS2_DOWN, "R.Thumbstick Down" }, + { DC_AXIS2_LEFT, "R.Thumbstick Left" }, + { DC_AXIS2_RIGHT, "R.Thumbstick Right" }, + + { EMU_BTN_NONE, "Buttons" }, + { DC_BTN_A, "Button 1" }, + { DC_BTN_B, "Button 2" }, + { DC_BTN_C, "Button 3" }, + { DC_BTN_X, "Button 4" }, + { DC_BTN_Y, "Button 5" }, + { DC_BTN_Z, "Button 6" }, + { DC_DPAD2_LEFT, "Button 7" }, + { DC_DPAD2_RIGHT, "Button 8" }, +// { DC_DPAD2_RIGHT, "Button 9" }, // TODO + + { EMU_BTN_NONE, "Triggers" }, + { DC_AXIS_LT, "Left Trigger" }, + { DC_AXIS_RT, "Right Trigger" }, + { DC_AXIS_LT2, "Left Trigger 2" }, + { DC_AXIS_RT2, "Right Trigger 2" }, + + { EMU_BTN_NONE, "System Buttons" }, + { DC_BTN_START, "Start" }, + { DC_BTN_RELOAD, "Reload" }, + { DC_BTN_D, "Coin" }, + { DC_DPAD2_UP, "Service" }, + { DC_DPAD2_DOWN, "Test" }, + { DC_BTN_INSERT_CARD, "Insert Card" }, + + { EMU_BTN_NONE, "Emulator" }, + { EMU_BTN_MENU, "Menu" }, + { EMU_BTN_ESCAPE, "Exit" }, + { EMU_BTN_FFORWARD, "Fast-forward" }, + { EMU_BTN_LOADSTATE, "Load State" }, + { EMU_BTN_SAVESTATE, "Save State" }, + { EMU_BTN_BYPASS_KB, "Bypass Emulated Keyboard" }, + { EMU_BTN_SCREENSHOT, "Save Screenshot" }, + + { EMU_BTN_NONE, nullptr } +}; + +static MapleDeviceType maple_expansion_device_type_from_index(int idx) +{ + switch (idx) + { + case 1: + return MDT_SegaVMU; + case 2: + return MDT_PurupuruPack; + case 3: + return MDT_Microphone; + case 0: + default: + return MDT_None; + } +} + +static std::shared_ptr mapped_device; +static u32 mapped_code; +static bool analogAxis; +static bool positiveDirection; +static u64 map_start_time; +static bool arcade_button_mode; +static u32 gamepad_port; + +static void unmapControl(const std::shared_ptr& mapping, u32 gamepad_port, DreamcastKey key) +{ + mapping->clear_button(gamepad_port, key); + mapping->clear_axis(gamepad_port, key); +} + +static DreamcastKey getOppositeDirectionKey(DreamcastKey key) +{ + switch (key) + { + case DC_DPAD_UP: + return DC_DPAD_DOWN; + case DC_DPAD_DOWN: + return DC_DPAD_UP; + case DC_DPAD_LEFT: + return DC_DPAD_RIGHT; + case DC_DPAD_RIGHT: + return DC_DPAD_LEFT; + case DC_DPAD2_UP: + return DC_DPAD2_DOWN; + case DC_DPAD2_DOWN: + return DC_DPAD2_UP; + case DC_DPAD2_LEFT: + return DC_DPAD2_RIGHT; + case DC_DPAD2_RIGHT: + return DC_DPAD2_LEFT; + case DC_AXIS_UP: + return DC_AXIS_DOWN; + case DC_AXIS_DOWN: + return DC_AXIS_UP; + case DC_AXIS_LEFT: + return DC_AXIS_RIGHT; + case DC_AXIS_RIGHT: + return DC_AXIS_LEFT; + case DC_AXIS2_UP: + return DC_AXIS2_DOWN; + case DC_AXIS2_DOWN: + return DC_AXIS2_UP; + case DC_AXIS2_LEFT: + return DC_AXIS2_RIGHT; + case DC_AXIS2_RIGHT: + return DC_AXIS2_LEFT; + case DC_AXIS3_UP: + return DC_AXIS3_DOWN; + case DC_AXIS3_DOWN: + return DC_AXIS3_UP; + case DC_AXIS3_LEFT: + return DC_AXIS3_RIGHT; + case DC_AXIS3_RIGHT: + return DC_AXIS3_LEFT; + default: + return EMU_BTN_NONE; + } +} +static void detect_input_popup(const Mapping *mapping) +{ + ImVec2 padding = ScaledVec2(20, 20); + ImguiStyleVar _(ImGuiStyleVar_WindowPadding, padding); + ImguiStyleVar _1(ImGuiStyleVar_ItemSpacing, padding); + if (ImGui::BeginPopupModal("Map Control", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::Text("Waiting for control '%s'...", mapping->name); + u64 now = getTimeMs(); + ImGui::Text("Time out in %d s", (int)(5 - (now - map_start_time) / 1000)); + if (mapped_code != (u32)-1) + { + std::shared_ptr input_mapping = mapped_device->get_input_mapping(); + if (input_mapping != NULL) + { + unmapControl(input_mapping, gamepad_port, mapping->key); + if (analogAxis) + { + input_mapping->set_axis(gamepad_port, mapping->key, mapped_code, positiveDirection); + DreamcastKey opposite = getOppositeDirectionKey(mapping->key); + // Map the axis opposite direction to the corresponding opposite dc button or axis, + // but only if the opposite direction axis isn't used and the dc button or axis isn't mapped. + if (opposite != EMU_BTN_NONE + && input_mapping->get_axis_id(gamepad_port, mapped_code, !positiveDirection) == EMU_BTN_NONE + && input_mapping->get_axis_code(gamepad_port, opposite).first == (u32)-1 + && input_mapping->get_button_code(gamepad_port, opposite) == (u32)-1) + input_mapping->set_axis(gamepad_port, opposite, mapped_code, !positiveDirection); + } + else + input_mapping->set_button(gamepad_port, mapping->key, mapped_code); + } + mapped_device = NULL; + ImGui::CloseCurrentPopup(); + } + else if (now - map_start_time >= 5000) + { + mapped_device = NULL; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } +} + +static void displayLabelOrCode(const char *label, u32 code, const char *suffix = "") +{ + if (label != nullptr) + ImGui::Text("%s%s", label, suffix); + else + ImGui::Text("[%d]%s", code, suffix); +} + +static void displayMappedControl(const std::shared_ptr& gamepad, DreamcastKey key) +{ + std::shared_ptr input_mapping = gamepad->get_input_mapping(); + u32 code = input_mapping->get_button_code(gamepad_port, key); + if (code != (u32)-1) + { + displayLabelOrCode(gamepad->get_button_name(code), code); + return; + } + std::pair pair = input_mapping->get_axis_code(gamepad_port, key); + code = pair.first; + if (code != (u32)-1) + { + displayLabelOrCode(gamepad->get_axis_name(code), code, pair.second ? "+" : "-"); + return; + } +} + +static void controller_mapping_popup(const std::shared_ptr& gamepad) +{ + fullScreenWindow(true); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + if (ImGui::BeginPopupModal("Controller Mapping", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + const ImGuiStyle& style = ImGui::GetStyle(); + const float winWidth = ImGui::GetIO().DisplaySize.x - insetLeft - insetRight - (style.WindowBorderSize + style.WindowPadding.x) * 2; + const float col_width = (winWidth - style.GrabMinSize - style.ItemSpacing.x + - (ImGui::CalcTextSize("Map").x + style.FramePadding.x * 2.0f + style.ItemSpacing.x) + - (ImGui::CalcTextSize("Unmap").x + style.FramePadding.x * 2.0f + style.ItemSpacing.x)) / 2; + + static int map_system; + static int item_current_map_idx = 0; + static int last_item_current_map_idx = 2; + + std::shared_ptr input_mapping = gamepad->get_input_mapping(); + if (input_mapping == NULL || ImGui::Button("Done", ScaledVec2(100, 30))) + { + ImGui::CloseCurrentPopup(); + gamepad->save_mapping(map_system); + last_item_current_map_idx = 2; + ImGui::EndPopup(); + return; + } + ImGui::SetItemDefaultFocus(); + + float portWidth = 0; + if (gamepad->maple_port() == MAPLE_PORTS) + { + ImGui::SameLine(); + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, (uiScaled(30) - ImGui::GetFontSize()) / 2)); + portWidth = ImGui::CalcTextSize("AA").x + ImGui::GetStyle().ItemSpacing.x * 2.0f + ImGui::GetFontSize(); + ImGui::SetNextItemWidth(portWidth); + if (ImGui::BeginCombo("Port", maple_ports[gamepad_port + 1])) + { + for (u32 j = 0; j < MAPLE_PORTS; j++) + { + bool is_selected = gamepad_port == j; + if (ImGui::Selectable(maple_ports[j + 1], &is_selected)) + gamepad_port = j; + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + portWidth += ImGui::CalcTextSize("Port").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetStyle().FramePadding.x; + } + float comboWidth = ImGui::CalcTextSize("Dreamcast Controls").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.x * 4; + float gameConfigWidth = 0; + if (!settings.content.gameId.empty()) + gameConfigWidth = ImGui::CalcTextSize(gamepad->isPerGameMapping() ? "Delete Game Config" : "Make Game Config").x + ImGui::GetStyle().ItemSpacing.x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(0, ImGui::GetContentRegionAvail().x - comboWidth - gameConfigWidth - ImGui::GetStyle().ItemSpacing.x - uiScaled(100) * 2 - portWidth); + + ImGui::AlignTextToFramePadding(); + + if (!settings.content.gameId.empty()) + { + if (gamepad->isPerGameMapping()) + { + if (ImGui::Button("Delete Game Config", ScaledVec2(0, 30))) + { + gamepad->setPerGameMapping(false); + if (!gamepad->find_mapping(map_system)) + gamepad->resetMappingToDefault(arcade_button_mode, true); + } + } + else + { + if (ImGui::Button("Make Game Config", ScaledVec2(0, 30))) + gamepad->setPerGameMapping(true); + } + ImGui::SameLine(); + } + if (ImGui::Button("Reset...", ScaledVec2(100, 30))) + ImGui::OpenPopup("Confirm Reset"); + + { + ImguiStyleVar _(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20)); + if (ImGui::BeginPopupModal("Confirm Reset", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::Text("Are you sure you want to reset the mappings to default?"); + static bool hitbox; + if (arcade_button_mode) + { + ImGui::Text("Controller Type:"); + if (ImGui::RadioButton("Gamepad", !hitbox)) + hitbox = false; + ImGui::SameLine(); + if (ImGui::RadioButton("Arcade / Hit Box", hitbox)) + hitbox = true; + } + ImGui::NewLine(); + { + ImguiStyleVar _(ImGuiStyleVar_ItemSpacing, ImVec2(uiScaled(20), ImGui::GetStyle().ItemSpacing.y)); + ImguiStyleVar _1(ImGuiStyleVar_FramePadding, ScaledVec2(10, 10)); + if (ImGui::Button("Yes")) + { + gamepad->resetMappingToDefault(arcade_button_mode, !hitbox); + gamepad->save_mapping(map_system); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("No")) + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + + ImGui::SameLine(); + + const char* items[] = { "Dreamcast Controls", "Arcade Controls" }; + + if (last_item_current_map_idx == 2 && game_started) + // Select the right mappings for the current game + item_current_map_idx = settings.platform.isArcade() ? 1 : 0; + + // Here our selection data is an index. + + ImGui::SetNextItemWidth(comboWidth); + // Make the combo height the same as the Done and Reset buttons + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, (uiScaled(30) - ImGui::GetFontSize()) / 2)); + ImGui::Combo("##arcadeMode", &item_current_map_idx, items, IM_ARRAYSIZE(items)); + ImGui::PopStyleVar(); + if (last_item_current_map_idx != 2 && item_current_map_idx != last_item_current_map_idx) + { + gamepad->save_mapping(map_system); + } + const Mapping *systemMapping = dcButtons; + if (item_current_map_idx == 0) + { + arcade_button_mode = false; + map_system = DC_PLATFORM_DREAMCAST; + systemMapping = dcButtons; + } + else if (item_current_map_idx == 1) + { + arcade_button_mode = true; + map_system = DC_PLATFORM_NAOMI; + systemMapping = arcadeButtons; + } + + if (item_current_map_idx != last_item_current_map_idx) + { + if (!gamepad->find_mapping(map_system)) + if (map_system == DC_PLATFORM_DREAMCAST || !gamepad->find_mapping(DC_PLATFORM_DREAMCAST)) + gamepad->resetMappingToDefault(arcade_button_mode, true); + input_mapping = gamepad->get_input_mapping(); + + last_item_current_map_idx = item_current_map_idx; + } + + char key_id[32]; + + ImGui::BeginChild(ImGui::GetID("buttons"), ImVec2(0, 0), ImGuiChildFlags_FrameStyle, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NavFlattened); + + for (; systemMapping->name != nullptr; systemMapping++) + { + if (systemMapping->key == EMU_BTN_NONE) + { + ImGui::Columns(1, nullptr, false); + header(systemMapping->name); + ImGui::Columns(3, "bindings", false); + ImGui::SetColumnWidth(0, col_width); + ImGui::SetColumnWidth(1, col_width); + continue; + } + sprintf(key_id, "key_id%d", systemMapping->key); + ImguiID _(key_id); + + const char *game_btn_name = nullptr; + if (arcade_button_mode) + { + game_btn_name = GetCurrentGameButtonName(systemMapping->key); + if (game_btn_name == nullptr) + game_btn_name = GetCurrentGameAxisName(systemMapping->key); + } + if (game_btn_name != nullptr && game_btn_name[0] != '\0') + ImGui::Text("%s - %s", systemMapping->name, game_btn_name); + else + ImGui::Text("%s", systemMapping->name); + + ImGui::NextColumn(); + displayMappedControl(gamepad, systemMapping->key); + + ImGui::NextColumn(); + if (ImGui::Button("Map")) + { + map_start_time = getTimeMs(); + ImGui::OpenPopup("Map Control"); + mapped_device = gamepad; + mapped_code = -1; + gamepad->detectButtonOrAxisInput([](u32 code, bool analog, bool positive) + { + mapped_code = code; + analogAxis = analog; + positiveDirection = positive; + }); + } + detect_input_popup(systemMapping); + ImGui::SameLine(); + if (ImGui::Button("Unmap")) + { + input_mapping = gamepad->get_input_mapping(); + unmapControl(input_mapping, gamepad_port, systemMapping->key); + } + ImGui::NextColumn(); + } + ImGui::Columns(1, nullptr, false); + scrollWhenDraggingOnVoid(); + windowDragScroll(); + + ImGui::EndChild(); + error_popup(); + ImGui::EndPopup(); + } +} + +static void gamepadPngFileSelected(bool cancelled, std::string path) +{ + if (!cancelled) + gui_runOnUiThread([path]() { + vgamepad::loadImage(path); + }); +} + +static void gamepadSettingsPopup(const std::shared_ptr& gamepad) +{ + centerNextWindow(); + ImGui::SetNextWindowSize(min(ImGui::GetIO().DisplaySize, ScaledVec2(450.f, 300.f))); + + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + if (ImGui::BeginPopupModal("Gamepad Settings", NULL, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_DragScrolling)) + { + if (ImGui::Button("Done", ScaledVec2(100, 30))) + { + gamepad->save_mapping(); + // Update both console and arcade profile/mapping + int rumblePower = gamepad->get_rumble_power(); + float deadzone = gamepad->get_dead_zone(); + float saturation = gamepad->get_saturation(); + int otherPlatform = settings.platform.isConsole() ? DC_PLATFORM_NAOMI : DC_PLATFORM_DREAMCAST; + if (!gamepad->find_mapping(otherPlatform)) + if (otherPlatform == DC_PLATFORM_DREAMCAST || !gamepad->find_mapping(DC_PLATFORM_DREAMCAST)) + gamepad->resetMappingToDefault(otherPlatform != DC_PLATFORM_DREAMCAST, true); + std::shared_ptr mapping = gamepad->get_input_mapping(); + if (mapping != nullptr) + { + if (gamepad->is_rumble_enabled() && rumblePower != mapping->rumblePower) { + mapping->rumblePower = rumblePower; + mapping->set_dirty(); + } + if (gamepad->has_analog_stick()) + { + if (deadzone != mapping->dead_zone) { + mapping->dead_zone = deadzone; + mapping->set_dirty(); + } + if (saturation != mapping->saturation) { + mapping->saturation = saturation; + mapping->set_dirty(); + } + } + if (mapping->is_dirty()) + gamepad->save_mapping(otherPlatform); + } + gamepad->find_mapping(); + + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + return; + } + ImGui::NewLine(); + if (gamepad->is_virtual_gamepad()) + { + if (gamepad->is_rumble_enabled()) { + header("Haptic"); + OptionSlider("Power", config::VirtualGamepadVibration, 0, 100, "Haptic feedback power", "%d%%"); + } + header("View"); + OptionSlider("Transparency", config::VirtualGamepadTransparency, 0, 100, "Virtual gamepad buttons transparency", "%d%%"); + +#if defined(__ANDROID__) || defined(TARGET_IPHONE) + vgamepad::ImguiVGamepadTexture tex; + ImGui::Image(tex.getId(), ScaledVec2(300.f, 150.f), ImVec2(0, 1), ImVec2(1, 0)); +#endif + const char *gamepadPngTitle = "Select a PNG file"; + if (ImGui::Button("Choose Image...", ScaledVec2(150, 30))) +#ifdef __ANDROID__ + { + if (!hostfs::addStorage(false, false, gamepadPngTitle, gamepadPngFileSelected, "image/png")) + ImGui::OpenPopup(gamepadPngTitle); + } +#else + { + ImGui::OpenPopup(gamepadPngTitle); + } +#endif + ImGui::SameLine(); + if (ImGui::Button("Use Default", ScaledVec2(150, 30))) + vgamepad::loadImage(""); + + select_file_popup(gamepadPngTitle, [](bool cancelled, std::string selection) + { + gamepadPngFileSelected(cancelled, selection); + return true; + }, true, "png"); + } + else if (gamepad->is_rumble_enabled()) + { + header("Rumble"); + int power = gamepad->get_rumble_power(); + ImGui::SetNextItemWidth(uiScaled(300)); + if (ImGui::SliderInt("Power", &power, 0, 100, "%d%%")) + gamepad->set_rumble_power(power); + ImGui::SameLine(); + ShowHelpMarker("Rumble power"); + } + if (gamepad->has_analog_stick()) + { + header("Thumbsticks"); + int deadzone = std::round(gamepad->get_dead_zone() * 100.f); + ImGui::SetNextItemWidth(uiScaled(300)); + if (ImGui::SliderInt("Dead zone", &deadzone, 0, 100, "%d%%")) + gamepad->set_dead_zone(deadzone / 100.f); + ImGui::SameLine(); + ShowHelpMarker("Minimum deflection to register as input"); + int saturation = std::round(gamepad->get_saturation() * 100.f); + ImGui::SetNextItemWidth(uiScaled(300)); + if (ImGui::SliderInt("Saturation", &saturation, 50, 200, "%d%%")) + gamepad->set_saturation(saturation / 100.f); + ImGui::SameLine(); + ShowHelpMarker("Value sent to the game at 100% thumbstick deflection. " + "Values greater than 100% will saturate before full deflection of the thumbstick."); + } + scrollWhenDraggingOnVoid(); + windowDragScroll(); + ImGui::EndPopup(); + } +} + +void error_popup() +{ + if (!error_msg_shown && !error_msg.empty()) + { + ImVec2 padding = ScaledVec2(20, 20); + ImguiStyleVar _(ImGuiStyleVar_WindowPadding, padding); + ImguiStyleVar _1(ImGuiStyleVar_ItemSpacing, padding); + ImGui::OpenPopup("Error"); + if (ImGui::BeginPopupModal("Error", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar)) + { + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + uiScaled(400.f)); + ImGui::TextWrapped("%s", error_msg.c_str()); + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(16, 3)); + float currentwidth = ImGui::GetContentRegionAvail().x; + ImGui::SetCursorPosX((currentwidth - uiScaled(80.f)) / 2.f + ImGui::GetStyle().WindowPadding.x); + if (ImGui::Button("OK", ScaledVec2(80.f, 0))) + { + error_msg.clear(); + ImGui::CloseCurrentPopup(); + } + } + ImGui::SetItemDefaultFocus(); + ImGui::PopTextWrapPos(); + ImGui::EndPopup(); + } + error_msg_shown = true; + } +} + +static void contentpath_warning_popup() +{ + static bool show_contentpath_selection; + + if (scanner.content_path_looks_incorrect) + { + ImGui::OpenPopup("Incorrect Content Location?"); + if (ImGui::BeginPopupModal("Incorrect Content Location?", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + uiScaled(400.f)); + ImGui::TextWrapped(" Scanned %d folders but no game can be found! ", scanner.empty_folders_scanned); + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(16, 3)); + float currentwidth = ImGui::GetContentRegionAvail().x; + ImGui::SetCursorPosX((currentwidth - uiScaled(100.f)) / 2.f + ImGui::GetStyle().WindowPadding.x - uiScaled(55.f)); + if (ImGui::Button("Reselect", ScaledVec2(100.f, 0))) + { + scanner.content_path_looks_incorrect = false; + ImGui::CloseCurrentPopup(); + show_contentpath_selection = true; + } + + ImGui::SameLine(); + ImGui::SetCursorPosX((currentwidth - uiScaled(100.f)) / 2.f + ImGui::GetStyle().WindowPadding.x + uiScaled(55.f)); + if (ImGui::Button("Cancel", ScaledVec2(100.f, 0))) + { + scanner.content_path_looks_incorrect = false; + ImGui::CloseCurrentPopup(); + scanner.stop(); + config::ContentPath.get().clear(); + } + } + ImGui::SetItemDefaultFocus(); + ImGui::EndPopup(); + } + } + if (show_contentpath_selection) + { + scanner.stop(); + const char *title = "Select a Content Folder"; + ImGui::OpenPopup(title); + select_file_popup(title, [](bool cancelled, std::string selection) + { + show_contentpath_selection = false; + if (!cancelled) + { + config::ContentPath.get().clear(); + config::ContentPath.get().push_back(selection); + } + scanner.refresh(); + return true; + }); + } +} + +static void gui_debug_tab() +{ + header("Logging"); + { + LogManager *logManager = LogManager::GetInstance(); + for (LogTypes::LOG_TYPE type = LogTypes::AICA; type < LogTypes::NUMBER_OF_LOGS; type = (LogTypes::LOG_TYPE)(type + 1)) + { + bool enabled = logManager->IsEnabled(type, logManager->GetLogLevel()); + std::string name = std::string(logManager->GetShortName(type)) + " - " + logManager->GetFullName(type); + if (ImGui::Checkbox(name.c_str(), &enabled) && logManager->GetLogLevel() > LogTypes::LWARNING) { + logManager->SetEnable(type, enabled); + cfgSaveBool("log", logManager->GetShortName(type), enabled); + } + } + ImGui::Spacing(); + + static const char *levels[] = { "Notice", "Error", "Warning", "Info", "Debug" }; + if (ImGui::BeginCombo("Log Verbosity", levels[logManager->GetLogLevel() - 1], ImGuiComboFlags_None)) + { + for (std::size_t i = 0; i < std::size(levels); i++) + { + bool is_selected = logManager->GetLogLevel() - 1 == (int)i; + if (ImGui::Selectable(levels[i], &is_selected)) { + logManager->SetLogLevel((LogTypes::LOG_LEVELS)(i + 1)); + cfgSaveInt("log", "Verbosity", i + 1); + } + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + } +#if FC_PROFILER + ImGui::Spacing(); + header("Profiling"); + { + + OptionCheckbox("Enable", config::ProfilerEnabled, "Enable the profiler."); + if (!config::ProfilerEnabled) + { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); + } + OptionCheckbox("Display", config::ProfilerDrawToGUI, "Draw the profiler output in an overlay."); + OptionCheckbox("Output to terminal", config::ProfilerOutputTTY, "Write the profiler output to the terminal"); + // TODO frame warning time + if (!config::ProfilerEnabled) + { + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + } + } +#endif +} + +static void addContentPathCallback(const std::string& path) +{ + auto& contentPath = config::ContentPath.get(); + if (std::count(contentPath.begin(), contentPath.end(), path) == 0) + { + scanner.stop(); + contentPath.push_back(path); + if (gui_state == GuiState::Main) + // when adding content path from empty game list + SaveSettings(); + scanner.refresh(); + } +} + +static void addContentPath(bool start) +{ + const char *title = "Select a Content Folder"; + select_file_popup(title, [](bool cancelled, std::string selection) { + if (!cancelled) + addContentPathCallback(selection); + return true; + }); +#ifdef __ANDROID__ + if (start) + { + bool supported = hostfs::addStorage(true, false, title, [](bool cancelled, std::string selection) { + if (!cancelled) + addContentPathCallback(selection); + }); + if (!supported) + ImGui::OpenPopup(title); + } +#else + if (start) + ImGui::OpenPopup(title); +#endif +} + +static float calcComboWidth(const char *biggestLabel) { + return ImGui::CalcTextSize(biggestLabel).x + ImGui::GetStyle().FramePadding.x * 2.0f + ImGui::GetFrameHeight(); +} + +static void gui_settings_general() +{ + { + DisabledScope scope(settings.platform.isArcade()); + + const char *languages[] = { "Japanese", "English", "German", "French", "Spanish", "Italian", "Default" }; + OptionComboBox("Language", config::Language, languages, std::size(languages), + "The language as configured in the Dreamcast BIOS"); + + const char *broadcast[] = { "NTSC", "PAL", "PAL/M", "PAL/N", "Default" }; + OptionComboBox("Broadcast", config::Broadcast, broadcast, std::size(broadcast), + "TV broadcasting standard for non-VGA modes"); + } + + const char *consoleRegion[] = { "Japan", "USA", "Europe", "Default" }; + const char *arcadeRegion[] = { "Japan", "USA", "Export", "Korea" }; + const char **region = settings.platform.isArcade() ? arcadeRegion : consoleRegion; + OptionComboBox("Region", config::Region, region, std::size(consoleRegion), + "BIOS region"); + + const char *cable[] = { "VGA", "RGB Component", "TV Composite" }; + { + DisabledScope scope(config::Cable.isReadOnly() || settings.platform.isArcade()); + + const char *value = config::Cable == 0 ? cable[0] + : config::Cable > 0 && config::Cable <= (int)std::size(cable) ? cable[config::Cable - 1] + : "?"; + if (ImGui::BeginCombo("Cable", value, ImGuiComboFlags_None)) + { + for (int i = 0; i < IM_ARRAYSIZE(cable); i++) + { + bool is_selected = i == 0 ? config::Cable <= 1 : config::Cable - 1 == i; + if (ImGui::Selectable(cable[i], &is_selected)) + config::Cable = i == 0 ? 0 : i + 1; + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + ShowHelpMarker("Video connection type"); + } + +#if !defined(TARGET_IPHONE) + ImVec2 size; + size.x = 0.0f; + size.y = (ImGui::GetTextLineHeightWithSpacing() + ImGui::GetStyle().FramePadding.y * 2.f) + * (config::ContentPath.get().size() + 1); + + if (BeginListBox("Content Location", size, ImGuiWindowFlags_NavFlattened)) + { + int to_delete = -1; + for (u32 i = 0; i < config::ContentPath.get().size(); i++) + { + ImguiID _(config::ContentPath.get()[i].c_str()); + ImGui::AlignTextToFramePadding(); + float maxW = ImGui::GetContentRegionAvail().x - ImGui::CalcTextSize(ICON_FA_TRASH_CAN).x - ImGui::GetStyle().FramePadding.x * 2 + - ImGui::GetStyle().ItemSpacing.x; + std::string s = middleEllipsis(config::ContentPath.get()[i], maxW); + ImGui::Text("%s", s.c_str()); + ImGui::SameLine(0, maxW - ImGui::CalcTextSize(s.c_str()).x + ImGui::GetStyle().ItemSpacing.x); + if (ImGui::Button(ICON_FA_TRASH_CAN)) + to_delete = i; + } + + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(24, 3)); + const bool addContent = ImGui::Button("Add"); + addContentPath(addContent); + ImGui::SameLine(); + + if (ImGui::Button("Rescan Content")) + scanner.refresh(); + scrollWhenDraggingOnVoid(); + + ImGui::EndListBox(); + if (to_delete >= 0) + { + scanner.stop(); + config::ContentPath.get().erase(config::ContentPath.get().begin() + to_delete); + scanner.refresh(); + } + } + ImGui::SameLine(); + ShowHelpMarker("The folders where your games are stored"); + + size.y = ImGui::GetTextLineHeightWithSpacing() * 1.25f + ImGui::GetStyle().FramePadding.y * 2.0f; + +#if defined(__linux__) && !defined(__ANDROID__) + if (BeginListBox("Data Folder", size, ImGuiWindowFlags_NavFlattened)) + { + ImGui::AlignTextToFramePadding(); + float w = ImGui::GetContentRegionAvail().x - ImGui::GetStyle().FramePadding.x; + std::string s = middleEllipsis(get_writable_data_path(""), w); + ImGui::Text("%s", s.c_str()); + ImGui::EndListBox(); + } + ImGui::SameLine(); + ShowHelpMarker("The folder containing BIOS files, as well as saved VMUs and states"); +#else +#if defined(__ANDROID__) || defined(TARGET_MAC) + size.y += ImGui::GetTextLineHeightWithSpacing() * 1.25f; +#endif + if (BeginListBox("Home Folder", size, ImGuiWindowFlags_NavFlattened)) + { + ImGui::AlignTextToFramePadding(); + float w = ImGui::GetContentRegionAvail().x - ImGui::GetStyle().FramePadding.x; + std::string s = middleEllipsis(get_writable_config_path(""), w); + ImGui::Text("%s", s.c_str()); + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(24, 3)); +#ifdef __ANDROID__ + { + DisabledScope _(!config::UseSafFilePicker); + if (ImGui::Button("Import")) + hostfs::importHomeDirectory(); + ImGui::SameLine(); + if (ImGui::Button("Export")) + hostfs::exportHomeDirectory(); + } +#endif +#ifdef TARGET_MAC + if (ImGui::Button("Reveal in Finder")) + { + char temp[512]; + sprintf(temp, "open \"%s\"", get_writable_config_path("").c_str()); + system(temp); + } +#endif + ImGui::EndListBox(); + } + ImGui::SameLine(); + ShowHelpMarker("The folder where Flycast saves configuration files and VMUs. BIOS files should be in a subfolder named \"data\""); +#endif // !linux +#else // TARGET_IPHONE + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(24, 3)); + if (ImGui::Button("Rescan Content")) + scanner.refresh(); + } +#endif + + OptionCheckbox("Box Art Game List", config::BoxartDisplayMode, + "Display game cover art in the game list."); + OptionCheckbox("Fetch Box Art", config::FetchBoxart, + "Fetch cover images from TheGamesDB.net."); + if (OptionSlider("UI Scaling", config::UIScaling, 50, 200, "Adjust the size of UI elements and fonts.", "%d%%")) + uiUserScaleUpdated = true; + if (uiUserScaleUpdated) + { + ImGui::SameLine(); + if (ImGui::Button("Apply")) { + mainui_reinit(); + uiUserScaleUpdated = false; + } + } + + if (OptionCheckbox("Hide Legacy Naomi Roms", config::HideLegacyNaomiRoms, + "Hide .bin, .dat and .lst files from the content browser")) + scanner.refresh(); +#ifdef __ANDROID__ + OptionCheckbox("Use SAF File Picker", config::UseSafFilePicker, + "Use Android Storage Access Framework file picker to select folders and files. Ignored on Android 10 and later."); +#endif + + ImGui::Text("Automatic State:"); + OptionCheckbox("Load", config::AutoLoadState, + "Load the last saved state of the game when starting"); + ImGui::SameLine(); + OptionCheckbox("Save", config::AutoSaveState, + "Save the state of the game when stopping"); + OptionCheckbox("Naomi Free Play", config::ForceFreePlay, "Configure Naomi games in Free Play mode."); +#if USE_DISCORD + OptionCheckbox("Discord Presence", config::DiscordPresence, "Show which game you are playing on Discord"); +#endif +#ifdef USE_RACHIEVEMENTS + OptionCheckbox("Enable RetroAchievements", config::EnableAchievements, "Track your game achievements using RetroAchievements.org"); + { + DisabledScope _(!config::EnableAchievements); + ImGui::Indent(); + OptionCheckbox("Hardcore Mode", config::AchievementsHardcoreMode, + "Enable RetroAchievements hardcore mode. Using cheats and loading a state are not allowed in this mode."); + ImGui::InputText("Username", &config::AchievementsUserName.get(), + achievements::isLoggedOn() ? ImGuiInputTextFlags_ReadOnly : ImGuiInputTextFlags_None, nullptr, nullptr); + if (config::EnableAchievements) + { + static std::future futureLogin; + achievements::init(); + if (achievements::isLoggedOn()) + { + ImGui::Text("Authentication successful"); + if (futureLogin.valid()) + futureLogin.get(); + if (ImGui::Button("Logout", ScaledVec2(100, 0))) + achievements::logout(); + } + else + { + static char password[256]; + ImGui::InputText("Password", password, sizeof(password), ImGuiInputTextFlags_Password, nullptr, nullptr); + if (futureLogin.valid()) + { + if (futureLogin.wait_for(std::chrono::seconds::zero()) == std::future_status::timeout) { + ImGui::Text("Authenticating..."); + } + else + { + try { + futureLogin.get(); + } catch (const FlycastException& e) { + gui_error(e.what()); + } + } + } + { + DisabledScope _(config::AchievementsUserName.get().empty() || password[0] == '\0'); + if (ImGui::Button("Login", ScaledVec2(100, 0)) && !futureLogin.valid()) + { + futureLogin = achievements::login(config::AchievementsUserName.get().c_str(), password); + memset(password, 0, sizeof(password)); + } + } + } + } + ImGui::Unindent(); + } +#endif +} + +static void gui_settings_controls(bool& maple_devices_changed) +{ + header("Physical Devices"); + { + if (ImGui::BeginTable("physicalDevices", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings)) + { + ImGui::TableSetupColumn("System", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("Port", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed); + + const float portComboWidth = calcComboWidth("None"); + const ImVec4 gray{ 0.5f, 0.5f, 0.5f, 1.f }; + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::TextColored(gray, "System"); + + ImGui::TableSetColumnIndex(1); + ImGui::TextColored(gray, "Name"); + + ImGui::TableSetColumnIndex(2); + ImGui::TextColored(gray, "Port"); + + for (int i = 0; i < GamepadDevice::GetGamepadCount(); i++) + { + std::shared_ptr gamepad = GamepadDevice::GetGamepad(i); + if (!gamepad) + continue; + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", gamepad->api_name().c_str()); + + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", gamepad->name().c_str()); + + ImGui::TableSetColumnIndex(2); + char port_name[32]; + sprintf(port_name, "##mapleport%d", i); + ImguiID _(port_name); + ImGui::SetNextItemWidth(portComboWidth); + if (ImGui::BeginCombo(port_name, maple_ports[gamepad->maple_port() + 1])) + { + for (int j = -1; j < (int)std::size(maple_ports) - 1; j++) + { + bool is_selected = gamepad->maple_port() == j; + if (ImGui::Selectable(maple_ports[j + 1], &is_selected)) + gamepad->set_maple_port(j); + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + + ImGui::EndCombo(); + } + + ImGui::TableSetColumnIndex(3); + ImGui::SameLine(0, uiScaled(8)); + if (gamepad->remappable() && ImGui::Button("Map")) + { + gamepad_port = 0; + ImGui::OpenPopup("Controller Mapping"); + } + + controller_mapping_popup(gamepad); + +#if defined(__ANDROID__) || defined(TARGET_IPHONE) + if (gamepad->is_virtual_gamepad()) + { + if (ImGui::Button("Edit Layout")) + { + vgamepad::startEditing(); + gui_setState(GuiState::VJoyEdit); + } + } +#endif + if (gamepad->is_rumble_enabled() || gamepad->has_analog_stick() + || gamepad->is_virtual_gamepad()) + { + ImGui::SameLine(0, uiScaled(16)); + if (ImGui::Button("Settings")) + ImGui::OpenPopup("Gamepad Settings"); + gamepadSettingsPopup(gamepad); + } + } + ImGui::EndTable(); + } + } + + ImGui::Spacing(); + OptionSlider("Mouse sensitivity", config::MouseSensitivity, 1, 500); +#if defined(_WIN32) && !defined(TARGET_UWP) + OptionCheckbox("Use Raw Input", config::UseRawInput, "Supports multiple pointing devices (mice, light guns) and keyboards"); +#endif + + ImGui::Spacing(); + header("Dreamcast Devices"); + { + bool is_there_any_xhair = false; + if (ImGui::BeginTable("dreamcastDevices", 4, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings, + ImVec2(0, 0), uiScaled(8))) + { + const float mainComboWidth = calcComboWidth(maple_device_types[11]); // densha de go! controller + const float expComboWidth = calcComboWidth(maple_expansion_device_types[2]); // vibration pack + + for (int bus = 0; bus < MAPLE_PORTS; bus++) + { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Port %c", bus + 'A'); + + ImGui::TableSetColumnIndex(1); + char device_name[32]; + sprintf(device_name, "##device%d", bus); + float w = ImGui::CalcItemWidth() / 3; + ImGui::PushItemWidth(w); + ImGui::SetNextItemWidth(mainComboWidth); + if (ImGui::BeginCombo(device_name, maple_device_name(config::MapleMainDevices[bus]), ImGuiComboFlags_None)) + { + for (int i = 0; i < IM_ARRAYSIZE(maple_device_types); i++) + { + bool is_selected = config::MapleMainDevices[bus] == maple_device_type_from_index(i); + if (ImGui::Selectable(maple_device_types[i], &is_selected)) + { + config::MapleMainDevices[bus] = maple_device_type_from_index(i); + maple_devices_changed = true; + } + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + int port_count = 0; + switch (config::MapleMainDevices[bus]) { + case MDT_SegaController: + case MDT_SegaControllerXL: + port_count = 2; + break; + case MDT_LightGun: + case MDT_TwinStick: + case MDT_AsciiStick: + case MDT_RacingController: + port_count = 1; + break; + default: break; + } + for (int port = 0; port < port_count; port++) + { + ImGui::TableSetColumnIndex(2 + port); + sprintf(device_name, "##device%d.%d", bus, port + 1); + ImguiID _(device_name); + ImGui::SetNextItemWidth(expComboWidth); + if (ImGui::BeginCombo(device_name, maple_expansion_device_name(config::MapleExpansionDevices[bus][port]), ImGuiComboFlags_None)) + { + for (int i = 0; i < IM_ARRAYSIZE(maple_expansion_device_types); i++) + { + bool is_selected = config::MapleExpansionDevices[bus][port] == maple_expansion_device_type_from_index(i); + if (ImGui::Selectable(maple_expansion_device_types[i], &is_selected)) + { + config::MapleExpansionDevices[bus][port] = maple_expansion_device_type_from_index(i); + maple_devices_changed = true; + } + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + } + if (config::MapleMainDevices[bus] == MDT_LightGun) + { + ImGui::TableSetColumnIndex(3); + sprintf(device_name, "##device%d.xhair", bus); + ImguiID _(device_name); + u32 color = config::CrosshairColor[bus]; + float xhairColor[4] { + (color & 0xff) / 255.f, + ((color >> 8) & 0xff) / 255.f, + ((color >> 16) & 0xff) / 255.f, + ((color >> 24) & 0xff) / 255.f + }; + bool colorChanged = ImGui::ColorEdit4("Crosshair color", xhairColor, ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_AlphaPreviewHalf + | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoLabel); + ImGui::SameLine(); + bool enabled = color != 0; + if (ImGui::Checkbox("Crosshair", &enabled) || colorChanged) + { + if (enabled) + { + config::CrosshairColor[bus] = (u8)(std::round(xhairColor[0] * 255.f)) + | ((u8)(std::round(xhairColor[1] * 255.f)) << 8) + | ((u8)(std::round(xhairColor[2] * 255.f)) << 16) + | ((u8)(std::round(xhairColor[3] * 255.f)) << 24); + if (config::CrosshairColor[bus] == 0) + config::CrosshairColor[bus] = 0xC0FFFFFF; + } + else + { + config::CrosshairColor[bus] = 0; + } + } + is_there_any_xhair |= enabled; + } + ImGui::PopItemWidth(); + } + ImGui::EndTable(); + } + { + DisabledScope scope(!is_there_any_xhair); + OptionSlider("Crosshair Size", config::CrosshairSize, 10, 100); + } + OptionCheckbox("Per Game VMU A1", config::PerGameVmu, "When enabled, each game has its own VMU on port 1 of controller A."); + } +} + +static void gui_settings_video() +{ + int renderApi; + bool perPixel; + switch (config::RendererType) + { + default: + case RenderType::OpenGL: + renderApi = 0; + perPixel = false; + break; + case RenderType::OpenGL_OIT: + renderApi = 0; + perPixel = true; + break; + case RenderType::Vulkan: + renderApi = 1; + perPixel = false; + break; + case RenderType::Vulkan_OIT: + renderApi = 1; + perPixel = true; + break; + case RenderType::DirectX9: + renderApi = 2; + perPixel = false; + break; + case RenderType::DirectX11: + renderApi = 3; + perPixel = false; + break; + case RenderType::DirectX11_OIT: + renderApi = 3; + perPixel = true; + break; + } + + constexpr int apiCount = 0 + #ifdef USE_VULKAN + + 1 + #endif + #ifdef USE_DX9 + + 1 + #endif + #ifdef USE_OPENGL + + 1 + #endif + #ifdef USE_DX11 + + 1 + #endif + ; + + float innerSpacing = ImGui::GetStyle().ItemInnerSpacing.x; + if (apiCount > 1) + { + header("Graphics API"); + { + ImGui::Columns(apiCount, "renderApi", false); +#ifdef USE_OPENGL + ImGui::RadioButton("OpenGL", &renderApi, 0); + ImGui::NextColumn(); +#endif +#ifdef USE_VULKAN +#ifdef __APPLE__ + ImGui::RadioButton("Vulkan (Metal)", &renderApi, 1); + ImGui::SameLine(0, innerSpacing); + ShowHelpMarker("MoltenVK: An implementation of Vulkan that runs on Apple's Metal graphics framework"); +#else + ImGui::RadioButton("Vulkan", &renderApi, 1); +#endif // __APPLE__ + ImGui::NextColumn(); +#endif +#ifdef USE_DX9 + { + DisabledScope _(settings.platform.isNaomi2()); + ImGui::RadioButton("DirectX 9", &renderApi, 2); + ImGui::NextColumn(); + } +#endif +#ifdef USE_DX11 + ImGui::RadioButton("DirectX 11", &renderApi, 3); + ImGui::NextColumn(); +#endif + ImGui::Columns(1, nullptr, false); + } + } + header("Transparent Sorting"); + { + const bool has_per_pixel = GraphicsContext::Instance()->hasPerPixel(); + int renderer = perPixel ? 2 : config::PerStripSorting ? 1 : 0; + ImGui::Columns(has_per_pixel ? 3 : 2, "renderers", false); + ImGui::RadioButton("Per Triangle", &renderer, 0); + ImGui::SameLine(); + ShowHelpMarker("Sort transparent polygons per triangle. Fast but may produce graphical glitches"); + ImGui::NextColumn(); + ImGui::RadioButton("Per Strip", &renderer, 1); + ImGui::SameLine(); + ShowHelpMarker("Sort transparent polygons per strip. Faster but may produce graphical glitches"); + if (has_per_pixel) + { + ImGui::NextColumn(); + ImGui::RadioButton("Per Pixel", &renderer, 2); + ImGui::SameLine(); + ShowHelpMarker("Sort transparent polygons per pixel. Slower but accurate"); + } + ImGui::Columns(1, NULL, false); + switch (renderer) + { + case 0: + perPixel = false; + config::PerStripSorting.set(false); + break; + case 1: + perPixel = false; + config::PerStripSorting.set(true); + break; + case 2: + perPixel = true; + break; + } + } + ImGui::Spacing(); + + header("Rendering Options"); + { + const std::array scalings{ 0.5f, 1.f, 1.5f, 2.f, 2.5f, 3.f, 4.f, 4.5f, 5.f, 6.f, 7.f, 8.f, 9.f }; + const std::array scalingsText{ "Half", "Native", "x1.5", "x2", "x2.5", "x3", "x4", "x4.5", "x5", "x6", "x7", "x8", "x9" }; + std::array vres; + std::array resLabels; + u32 selected = 0; + for (u32 i = 0; i < scalings.size(); i++) + { + vres[i] = scalings[i] * 480; + if (vres[i] == config::RenderResolution) + selected = i; + if (!config::Widescreen) + resLabels[i] = std::to_string((int)(scalings[i] * 640)) + "x" + std::to_string((int)(scalings[i] * 480)); + else + resLabels[i] = std::to_string((int)(scalings[i] * 480 * 16 / 9)) + "x" + std::to_string((int)(scalings[i] * 480)); + resLabels[i] += " (" + scalingsText[i] + ")"; + } + + ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); + if (ImGui::BeginCombo("##Resolution", resLabels[selected].c_str(), ImGuiComboFlags_NoArrowButton)) + { + for (u32 i = 0; i < scalings.size(); i++) + { + bool is_selected = vres[i] == config::RenderResolution; + if (ImGui::Selectable(resLabels[i].c_str(), is_selected)) + config::RenderResolution = vres[i]; + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); + ImGui::SameLine(0, innerSpacing); + + if (ImGui::ArrowButton("##Decrease Res", ImGuiDir_Left)) + { + if (selected > 0) + config::RenderResolution = vres[selected - 1]; + } + ImGui::SameLine(0, innerSpacing); + if (ImGui::ArrowButton("##Increase Res", ImGuiDir_Right)) + { + if (selected < vres.size() - 1) + config::RenderResolution = vres[selected + 1]; + } + ImGui::SameLine(0, innerSpacing); + + ImGui::Text("Internal Resolution"); + ImGui::SameLine(); + ShowHelpMarker("Internal render resolution. Higher is better, but more demanding on the GPU. Values higher than your display resolution (but no more than double your display resolution) can be used for supersampling, which provides high-quality antialiasing without reducing sharpness."); + +#ifndef TARGET_IPHONE + OptionCheckbox("VSync", config::VSync, "Synchronizes the frame rate with the screen refresh rate. Recommended"); + if (isVulkan(config::RendererType)) + { + ImGui::Indent(); + { + DisabledScope scope(!config::VSync); + + OptionCheckbox("Duplicate frames", config::DupeFrames, "Duplicate frames on high refresh rate monitors (120 Hz and higher)"); + } + ImGui::Unindent(); + } +#endif + OptionCheckbox("Show VMU In-game", config::FloatVMUs, "Show the VMU LCD screens while in-game"); + OptionCheckbox("Full Framebuffer Emulation", config::EmulateFramebuffer, + "Fully accurate VRAM framebuffer emulation. Helps games that directly access the framebuffer for special effects. " + "Very slow and incompatible with upscaling and wide screen."); + OptionCheckbox("Load Custom Textures", config::CustomTextures, + "Load custom/high-res textures from data/textures/"); + } + ImGui::Spacing(); + header("Aspect Ratio"); + { + OptionCheckbox("Widescreen", config::Widescreen, + "Draw geometry outside of the normal 4:3 aspect ratio. May produce graphical glitches in the revealed areas.\nAspect Fit and shows the full 16:9 content."); + { + DisabledScope scope(!config::Widescreen); + + ImGui::Indent(); + OptionCheckbox("Super Widescreen", config::SuperWidescreen, + "Use the full width of the screen or window when its aspect ratio is greater than 16:9.\nAspect Fill and remove black bars."); + ImGui::Unindent(); + } + OptionCheckbox("Widescreen Game Cheats", config::WidescreenGameHacks, + "Modify the game so that it displays in 16:9 anamorphic format and use horizontal screen stretching. Only some games are supported."); + OptionSlider("Horizontal Stretching", config::ScreenStretching, 100, 250, + "Stretch the screen horizontally", "%d%%"); + OptionCheckbox("Rotate Screen 90°", config::Rotate90, "Rotate the screen 90° counterclockwise"); + } + if (perPixel) + { + ImGui::Spacing(); + header("Per Pixel Settings"); + + const std::array bufSizes{ 512_MB, 1_GB, 2_GB, 4_GB }; + const std::array bufSizesText{ "512 MB", "1 GB", "2 GB", "4 GB" }; + ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); + u32 selected = 0; + for (; selected < bufSizes.size(); selected++) + if (bufSizes[selected] == config::PixelBufferSize) + break; + if (selected == bufSizes.size()) + selected = 0; + if (ImGui::BeginCombo("##PixelBuffer", bufSizesText[selected].c_str(), ImGuiComboFlags_NoArrowButton)) + { + for (u32 i = 0; i < bufSizes.size(); i++) + { + bool is_selected = i == selected; + if (ImGui::Selectable(bufSizesText[i].c_str(), is_selected)) + config::PixelBufferSize = bufSizes[i]; + if (is_selected) { + ImGui::SetItemDefaultFocus(); + selected = i; + } + } + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); + ImGui::SameLine(0, innerSpacing); + + if (ImGui::ArrowButton("##Decrease BufSize", ImGuiDir_Left)) + { + if (selected > 0) + config::PixelBufferSize = bufSizes[selected - 1]; + } + ImGui::SameLine(0, innerSpacing); + if (ImGui::ArrowButton("##Increase BufSize", ImGuiDir_Right)) + { + if (selected < bufSizes.size() - 1) + config::PixelBufferSize = bufSizes[selected + 1]; + } + ImGui::SameLine(0, innerSpacing); + + ImGui::Text("Pixel Buffer Size"); + ImGui::SameLine(); + ShowHelpMarker("The size of the pixel buffer. May need to be increased when upscaling by a large factor."); + + OptionSlider("Maximum Layers", config::PerPixelLayers, 8, 128, + "Maximum number of transparent layers. May need to be increased for some complex scenes. Decreasing it may improve performance."); + } + ImGui::Spacing(); + header("Performance"); + { + ImGui::Text("Automatic Frame Skipping:"); + ImGui::Columns(3, "autoskip", false); + OptionRadioButton("Disabled", config::AutoSkipFrame, 0, "No frame skipping"); + ImGui::NextColumn(); + OptionRadioButton("Normal", config::AutoSkipFrame, 1, "Skip a frame when the GPU and CPU are both running slow"); + ImGui::NextColumn(); + OptionRadioButton("Maximum", config::AutoSkipFrame, 2, "Skip a frame when the GPU is running slow"); + ImGui::Columns(1, nullptr, false); + + OptionArrowButtons("Frame Skipping", config::SkipFrame, 0, 6, + "Number of frames to skip between two actually rendered frames"); + OptionCheckbox("Shadows", config::ModifierVolumes, + "Enable modifier volumes, usually used for shadows"); + OptionCheckbox("Fog", config::Fog, "Enable fog effects"); + } + ImGui::Spacing(); + header("Advanced"); + { + OptionCheckbox("Delay Frame Swapping", config::DelayFrameSwapping, + "Useful to avoid flashing screen or glitchy videos. Not recommended on slow platforms"); + OptionCheckbox("Fix Upscale Bleeding Edge", config::FixUpscaleBleedingEdge, + "Helps with texture bleeding case when upscaling. Disabling it can help if pixels are warping when upscaling in 2D games (MVC2, CVS, KOF, etc.)"); + OptionCheckbox("Native Depth Interpolation", config::NativeDepthInterpolation, + "Helps with texture corruption and depth issues on AMD GPUs. Can also help Intel GPUs in some cases."); + OptionCheckbox("Copy Rendered Textures to VRAM", config::RenderToTextureBuffer, + "Copy rendered-to textures back to VRAM. Slower but accurate"); + const std::array aniso{ 1, 2, 4, 8, 16 }; + const std::array anisoText{ "Disabled", "2x", "4x", "8x", "16x" }; + u32 afSelected = 0; + for (u32 i = 0; i < aniso.size(); i++) + { + if (aniso[i] == config::AnisotropicFiltering) + afSelected = i; + } + + ImGui::PushItemWidth(ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f); + if (ImGui::BeginCombo("##Anisotropic Filtering", anisoText[afSelected].c_str(), ImGuiComboFlags_NoArrowButton)) + { + for (u32 i = 0; i < aniso.size(); i++) + { + bool is_selected = aniso[i] == config::AnisotropicFiltering; + if (ImGui::Selectable(anisoText[i].c_str(), is_selected)) + config::AnisotropicFiltering = aniso[i]; + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + ImGui::PopItemWidth(); + ImGui::SameLine(0, innerSpacing); + + if (ImGui::ArrowButton("##Decrease Anisotropic Filtering", ImGuiDir_Left)) + { + if (afSelected > 0) + config::AnisotropicFiltering = aniso[afSelected - 1]; + } + ImGui::SameLine(0, innerSpacing); + if (ImGui::ArrowButton("##Increase Anisotropic Filtering", ImGuiDir_Right)) + { + if (afSelected < aniso.size() - 1) + config::AnisotropicFiltering = aniso[afSelected + 1]; + } + ImGui::SameLine(0, innerSpacing); + + ImGui::Text("Anisotropic Filtering"); + ImGui::SameLine(); + ShowHelpMarker("Higher values make textures viewed at oblique angles look sharper, but are more demanding on the GPU. This option only has a visible impact on mipmapped textures."); + + ImGui::Text("Texture Filtering:"); + ImGui::Columns(3, "textureFiltering", false); + OptionRadioButton("Default", config::TextureFiltering, 0, "Use the game's default texture filtering"); + ImGui::NextColumn(); + OptionRadioButton("Force Nearest-Neighbor", config::TextureFiltering, 1, "Force nearest-neighbor filtering for all textures. Crisper appearance, but may cause various rendering issues. This option usually does not affect performance."); + ImGui::NextColumn(); + OptionRadioButton("Force Linear", config::TextureFiltering, 2, "Force linear filtering for all textures. Smoother appearance, but may cause various rendering issues. This option usually does not affect performance."); + ImGui::Columns(1, nullptr, false); + + OptionCheckbox("Show FPS Counter", config::ShowFPS, "Show on-screen frame/sec counter"); + } + ImGui::Spacing(); + header("Texture Upscaling"); + { +#ifdef _OPENMP + OptionArrowButtons("Texture Upscaling", config::TextureUpscale, 1, 8, + "Upscale textures with the xBRZ algorithm. Only on fast platforms and for certain 2D games", "x%d"); + OptionSlider("Texture Max Size", config::MaxFilteredTextureSize, 8, 1024, + "Textures larger than this dimension squared will not be upscaled"); + OptionArrowButtons("Max Threads", config::MaxThreads, 1, 8, + "Maximum number of threads to use for texture upscaling. Recommended: number of physical cores minus one"); +#endif + } +#ifdef VIDEO_ROUTING +#ifdef __APPLE__ + header("Video Routing (Syphon)"); +#elif defined(_WIN32) + ((renderApi == 0) || (renderApi == 3)) ? header("Video Routing (Spout)") : header("Video Routing (Only available with OpenGL or DirectX 11)"); +#endif + { +#ifdef _WIN32 + DisabledScope scope(!((renderApi == 0) || (renderApi == 3))); +#endif + OptionCheckbox("Send video content to another program", config::VideoRouting, + "e.g. Route GPU texture to OBS Studio directly instead of using CPU intensive Display/Window Capture"); + + { + DisabledScope scope(!config::VideoRouting); + OptionCheckbox("Scale down before sending", config::VideoRoutingScale, "Could increase performance when sharing a smaller texture, YMMV"); + { + DisabledScope scope(!config::VideoRoutingScale); + static int vres = config::VideoRoutingVRes; + if (ImGui::InputInt("Output vertical resolution", &vres)) + { + config::VideoRoutingVRes = vres; + } + } + ImGui::Text("Output texture size: %d x %d", config::VideoRoutingScale ? config::VideoRoutingVRes * settings.display.width / settings.display.height : settings.display.width, config::VideoRoutingScale ? config::VideoRoutingVRes : settings.display.height); + } + } +#endif + + switch (renderApi) + { + case 0: + config::RendererType = perPixel ? RenderType::OpenGL_OIT : RenderType::OpenGL; + break; + case 1: + config::RendererType = perPixel ? RenderType::Vulkan_OIT : RenderType::Vulkan; + break; + case 2: + config::RendererType = RenderType::DirectX9; + break; + case 3: + config::RendererType = perPixel ? RenderType::DirectX11_OIT : RenderType::DirectX11; + break; + } +} + +static void gui_settings_audio() +{ + OptionCheckbox("Enable DSP", config::DSPEnabled, + "Enable the Dreamcast Digital Sound Processor. Only recommended on fast platforms"); + OptionCheckbox("Enable VMU Sounds", config::VmuSound, "Play VMU beeps when enabled."); + + if (OptionSlider("Volume Level", config::AudioVolume, 0, 100, "Adjust the emulator's audio level", "%d%%")) + { + config::AudioVolume.calcDbPower(); + }; +#ifdef __ANDROID__ + if (config::AudioBackend.get() == "auto" || config::AudioBackend.get() == "android") + OptionCheckbox("Automatic Latency", config::AutoLatency, + "Automatically set audio latency. Recommended"); +#endif + if (!config::AutoLatency + || (config::AudioBackend.get() != "auto" && config::AudioBackend.get() != "android")) + { + int latency = (int)roundf(config::AudioBufferSize * 1000.f / 44100.f); + ImGui::SliderInt("Latency", &latency, 12, 512, "%d ms"); + config::AudioBufferSize = (int)roundf(latency * 44100.f / 1000.f); + ImGui::SameLine(); + ShowHelpMarker("Sets the maximum audio latency. Not supported by all audio drivers."); + } + + AudioBackend *backend = nullptr; + std::string backend_name = config::AudioBackend; + if (backend_name != "auto") + { + backend = AudioBackend::getBackend(config::AudioBackend); + if (backend != nullptr) + backend_name = backend->slug; + } + + AudioBackend *current_backend = backend; + if (ImGui::BeginCombo("Audio Driver", backend_name.c_str(), ImGuiComboFlags_None)) + { + bool is_selected = (config::AudioBackend.get() == "auto"); + if (ImGui::Selectable("auto - Automatic driver selection", &is_selected)) + config::AudioBackend.set("auto"); + + for (u32 i = 0; i < AudioBackend::getCount(); i++) + { + backend = AudioBackend::getBackend(i); + is_selected = (config::AudioBackend.get() == backend->slug); + + if (is_selected) + current_backend = backend; + + if (ImGui::Selectable((backend->slug + " - " + backend->name).c_str(), &is_selected)) + config::AudioBackend.set(backend->slug); + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + ShowHelpMarker("The audio driver to use"); + + if (current_backend != nullptr) + { + // get backend specific options + int option_count; + const AudioBackend::Option *options = current_backend->getOptions(&option_count); + + for (int o = 0; o < option_count; o++) + { + std::string value = cfgLoadStr(current_backend->slug, options->name, ""); + + if (options->type == AudioBackend::Option::integer) + { + int val = stoi(value); + if (ImGui::SliderInt(options->caption.c_str(), &val, options->minValue, options->maxValue)) + { + std::string s = std::to_string(val); + cfgSaveStr(current_backend->slug, options->name, s); + } + } + else if (options->type == AudioBackend::Option::checkbox) + { + bool check = value == "1"; + if (ImGui::Checkbox(options->caption.c_str(), &check)) + cfgSaveStr(current_backend->slug, options->name, + check ? "1" : "0"); + } + else if (options->type == AudioBackend::Option::list) + { + if (ImGui::BeginCombo(options->caption.c_str(), value.c_str(), ImGuiComboFlags_None)) + { + bool is_selected = false; + for (const auto& cur : options->values) + { + is_selected = value == cur; + if (ImGui::Selectable(cur.c_str(), &is_selected)) + cfgSaveStr(current_backend->slug, options->name, cur); + + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + } + else { + WARN_LOG(RENDERER, "Unknown option"); + } + + options++; + } + } +} + +static void gui_settings_network() +{ + ImGuiStyle& style = ImGui::GetStyle(); + header("Network Type"); + { + DisabledScope scope(game_started); + + int netType = 0; + if (config::GGPOEnable) + netType = 1; + else if (config::NetworkEnable) + netType = 2; + else if (config::BattleCableEnable) + netType = 3; + ImGui::Columns(4, "networkType", false); + ImGui::RadioButton("Disabled##network", &netType, 0); + ImGui::NextColumn(); + ImGui::RadioButton("GGPO", &netType, 1); + ImGui::SameLine(0, style.ItemInnerSpacing.x); + ShowHelpMarker("Enable networking using GGPO"); + ImGui::NextColumn(); + ImGui::RadioButton("Naomi", &netType, 2); + ImGui::SameLine(0, style.ItemInnerSpacing.x); + ShowHelpMarker("Enable networking for supported Naomi and Atomiswave games"); + ImGui::NextColumn(); + ImGui::RadioButton("Battle Cable", &netType, 3); + ImGui::SameLine(0, style.ItemInnerSpacing.x); + ShowHelpMarker("Emulate the Taisen (Battle) null modem cable for games that support it"); + ImGui::Columns(1, nullptr, false); + + config::GGPOEnable = false; + config::NetworkEnable = false; + config::BattleCableEnable = false; + switch (netType) { + case 1: + config::GGPOEnable = true; + break; + case 2: + config::NetworkEnable = true; + break; + case 3: + config::BattleCableEnable = true; + break; + } + } + if (config::GGPOEnable || config::NetworkEnable || config::BattleCableEnable) { + ImGui::Spacing(); + header("Configuration"); + } + { + if (config::GGPOEnable) + { + config::NetworkEnable = false; + OptionCheckbox("Play as Player 1", config::ActAsServer, + "Deselect to play as player 2"); + ImGui::InputText("Peer", &config::NetworkServer.get(), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("Your peer IP address and optional port"); + OptionSlider("Frame Delay", config::GGPODelay, 0, 20, + "Sets Frame Delay, advisable for sessions with ping >100 ms"); + + ImGui::Text("Left Thumbstick:"); + OptionRadioButton("Disabled##analogaxis", config::GGPOAnalogAxes, 0, "Left thumbstick not used"); + ImGui::SameLine(); + OptionRadioButton("Horizontal", config::GGPOAnalogAxes, 1, "Use the left thumbstick horizontal axis only"); + ImGui::SameLine(); + OptionRadioButton("Full", config::GGPOAnalogAxes, 2, "Use the left thumbstick horizontal and vertical axes"); + + OptionCheckbox("Enable Chat", config::GGPOChat, "Open the chat window when a chat message is received"); + if (config::GGPOChat) + { + OptionCheckbox("Enable Chat Window Timeout", config::GGPOChatTimeoutToggle, "Automatically close chat window after 20 seconds"); + if (config::GGPOChatTimeoutToggle) + { + char chatTimeout[256]; + sprintf(chatTimeout, "%d", (int)config::GGPOChatTimeout); + ImGui::InputText("Chat Window Timeout (seconds)", chatTimeout, sizeof(chatTimeout), ImGuiInputTextFlags_CharsDecimal, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("Sets duration that chat window stays open after new message is received."); + config::GGPOChatTimeout.set(atoi(chatTimeout)); + } + } + OptionCheckbox("Network Statistics", config::NetworkStats, + "Display network statistics on screen"); + } + else if (config::NetworkEnable) + { + OptionCheckbox("Act as Server", config::ActAsServer, + "Create a local server for Naomi network games"); + if (!config::ActAsServer) + { + ImGui::InputText("Server", &config::NetworkServer.get(), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("The server to connect to. Leave blank to find a server automatically on the default port"); + } + char localPort[256]; + sprintf(localPort, "%d", (int)config::LocalPort); + ImGui::InputText("Local Port", localPort, sizeof(localPort), ImGuiInputTextFlags_CharsDecimal, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("The local UDP port to use"); + config::LocalPort.set(atoi(localPort)); + } + else if (config::BattleCableEnable) + { + ImGui::InputText("Peer", &config::NetworkServer.get(), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("The peer to connect to. Leave blank to find a player automatically on the default port"); + char localPort[256]; + sprintf(localPort, "%d", (int)config::LocalPort); + ImGui::InputText("Local Port", localPort, sizeof(localPort), ImGuiInputTextFlags_CharsDecimal, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("The local UDP port to use"); + config::LocalPort.set(atoi(localPort)); + } + } + ImGui::Spacing(); + header("Network Options"); + { + OptionCheckbox("Enable UPnP", config::EnableUPnP, "Automatically configure your network router for netplay"); + OptionCheckbox("Broadcast Digital Outputs", config::NetworkOutput, "Broadcast digital outputs and force-feedback state on TCP port 8000. " + "Compatible with the \"-output network\" MAME option. Arcade games only."); + { + DisabledScope scope(game_started); + + OptionCheckbox("Broadband Adapter Emulation", config::EmulateBBA, + "Emulate the Ethernet Broadband Adapter (BBA) instead of the Modem"); + } + } +#ifdef NAOMI_MULTIBOARD + ImGui::Spacing(); + header("Multiboard Screens"); + { + //OptionRadioButton("Disabled##multiboard", config::MultiboardSlaves, 0, "Multiboard disabled (when optional)"); + OptionRadioButton("1 (Twin)", config::MultiboardSlaves, 1, "One screen configuration (F355 Twin)"); + ImGui::SameLine(); + OptionRadioButton("3 (Deluxe)", config::MultiboardSlaves, 2, "Three screens configuration"); + } +#endif +} + +static void gui_settings_advanced() +{ +#if FEAT_SHREC != DYNAREC_NONE + header("CPU Mode"); + { + ImGui::Columns(2, "cpu_modes", false); + OptionRadioButton("Dynarec", config::DynarecEnabled, true, + "Use the dynamic recompiler. Recommended in most cases"); + ImGui::NextColumn(); + OptionRadioButton("Interpreter", config::DynarecEnabled, false, + "Use the interpreter. Very slow but may help in case of a dynarec problem"); + ImGui::Columns(1, NULL, false); + + OptionSlider("SH4 Clock", config::Sh4Clock, 100, 300, + "Over/Underclock the main SH4 CPU. Default is 200 MHz. Other values may crash, freeze or trigger unexpected nuclear reactions.", + "%d MHz"); + } + ImGui::Spacing(); +#endif + header("Other"); + { + OptionCheckbox("HLE BIOS", config::UseReios, "Force high-level BIOS emulation"); + OptionCheckbox("Multi-threaded emulation", config::ThreadedRendering, + "Run the emulated CPU and GPU on different threads"); +#ifndef __ANDROID + OptionCheckbox("Serial Console", config::SerialConsole, + "Dump the Dreamcast serial console to stdout"); +#endif + { + DisabledScope scope(game_started); + OptionCheckbox("Dreamcast 32MB RAM Mod", config::RamMod32MB, + "Enables 32MB RAM Mod for Dreamcast. May affect compatibility"); + } + OptionCheckbox("Dump Textures", config::DumpTextures, + "Dump all textures into data/texdump/"); + + bool logToFile = cfgLoadBool("log", "LogToFile", false); + bool newLogToFile = logToFile; + ImGui::Checkbox("Log to File", &newLogToFile); + if (logToFile != newLogToFile) + { + cfgSaveBool("log", "LogToFile", newLogToFile); + LogManager::Shutdown(); + LogManager::Init(); + } + ImGui::SameLine(); + ShowHelpMarker("Log debug information to flycast.log"); +#ifdef SENTRY_UPLOAD + OptionCheckbox("Automatically Report Crashes", config::UploadCrashLogs, + "Automatically upload crash reports to sentry.io to help in troubleshooting. No personal information is included."); +#endif + } + +#ifdef USE_LUA + header("Lua Scripting"); + { + ImGui::InputText("Lua Filename", &config::LuaFileName.get(), ImGuiInputTextFlags_CharsNoBlank, nullptr, nullptr); + ImGui::SameLine(); + ShowHelpMarker("Specify lua filename to use. Should be located in Flycast config folder. Defaults to flycast.lua when empty."); + } +#endif +} + +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 && USE_VULKAN +static bool driverDirty; + +static void customDriverCallback(bool cancelled, std::string selection) +{ + if (!cancelled) { + try { + uploadCustomGpuDriver(selection); + config::CustomGpuDriver = true; + driverDirty = true; + } catch (const FlycastException& e) { + gui_error(e.what()); + config::CustomGpuDriver = false; + } + } +} +#endif + +static void gui_settings_about() +{ + header("Flycast"); + { + ImGui::Text("Version: %s", GIT_VERSION); + ImGui::Text("Git Hash: %s", GIT_HASH); + ImGui::Text("Build Date: %s", BUILD_DATE); + } + ImGui::Spacing(); + header("Platform"); + { + ImGui::Text("CPU: %s", +#if HOST_CPU == CPU_X86 + "x86" +#elif HOST_CPU == CPU_ARM + "ARM" +#elif HOST_CPU == CPU_X64 + "x86/64" +#elif HOST_CPU == CPU_ARM64 + "ARM64" +#else + "Unknown" +#endif + ); + ImGui::Text("Operating System: %s", +#ifdef __ANDROID__ + "Android" +#elif defined(__unix__) + "Linux" +#elif defined(__APPLE__) +#ifdef TARGET_IPHONE + "iOS" +#else + "macOS" +#endif +#elif defined(TARGET_UWP) + "Windows Universal Platform" +#elif defined(_WIN32) + "Windows" +#elif defined(__SWITCH__) + "Switch" +#else + "Unknown" +#endif + ); +#ifdef TARGET_IPHONE + const char *getIosJitStatus(); + ImGui::Text("JIT Status: %s", getIosJitStatus()); +#endif + } + ImGui::Spacing(); + if (isOpenGL(config::RendererType)) + header("OpenGL"); + else if (isVulkan(config::RendererType)) + header("Vulkan"); + else if (isDirectX(config::RendererType)) + header("DirectX"); + ImGui::Text("Driver Name: %s", GraphicsContext::Instance()->getDriverName().c_str()); + ImGui::Text("Version: %s", GraphicsContext::Instance()->getDriverVersion().c_str()); + +#if defined(__ANDROID__) && HOST_CPU == CPU_ARM64 && USE_VULKAN + if (isVulkan(config::RendererType)) + { + const char *fileSelectTitle = "Select a custom GPU driver"; + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10)); + if (config::CustomGpuDriver) + { + std::string name, description, vendor, version; + if (getCustomGpuDriverInfo(name, description, vendor, version)) + { + ImGui::Text("Custom Driver:"); + ImGui::Indent(); + ImGui::Text("%s - %s", name.c_str(), description.c_str()); + ImGui::Text("%s - %s", vendor.c_str(), version.c_str()); + ImGui::Unindent(); + } + + if (ImGui::Button("Use Default Driver")) { + config::CustomGpuDriver = false; + ImGui::OpenPopup("Reset Vulkan"); + } + } + else if (ImGui::Button("Upload Custom Driver")) { + if (!hostfs::addStorage(false, false, fileSelectTitle, customDriverCallback)) + ImGui::OpenPopup(fileSelectTitle); + } + + if (driverDirty) { + ImGui::OpenPopup("Reset Vulkan"); + driverDirty = false; + } + + ImguiStyleVar _1(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20)); + if (ImGui::BeginPopupModal("Reset Vulkan", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar)) + { + ImGui::Text("Do you want to reset Vulkan to use new driver?"); + ImGui::NewLine(); + ImguiStyleVar _(ImGuiStyleVar_ItemSpacing, ImVec2(uiScaled(20), ImGui::GetStyle().ItemSpacing.y)); + ImguiStyleVar _1(ImGuiStyleVar_FramePadding, ScaledVec2(10, 10)); + if (ImGui::Button("Yes")) + { + mainui_reinit(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("No")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + } + select_file_popup(fileSelectTitle, [](bool cancelled, std::string selection) { + customDriverCallback(cancelled, selection); + return true; + }, true, "zip"); + } +#endif +} + +static void gui_display_settings() +{ + static bool maple_devices_changed; + + fullScreenWindow(false); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + + ImGui::Begin("Settings", NULL, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NoResize + | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse); + ImVec2 normal_padding = ImGui::GetStyle().FramePadding; + + if (ImGui::Button("Done", ScaledVec2(100, 30))) + { + if (uiUserScaleUpdated) + { + uiUserScaleUpdated = false; + mainui_reinit(); + } + if (game_started) + gui_setState(GuiState::Commands); + else + gui_setState(GuiState::Main); + if (maple_devices_changed) + { + maple_devices_changed = false; + if (game_started && settings.platform.isConsole()) + { + maple_ReconnectDevices(); + reset_vmus(); + } + } + SaveSettings(); + } + if (game_started) + { + ImGui::SameLine(); + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ImVec2(uiScaled(16), normal_padding.y)); + if (config::Settings::instance().hasPerGameConfig()) + { + if (ImGui::Button("Delete Game Config", ScaledVec2(0, 30))) + { + config::Settings::instance().setPerGameConfig(false); + config::Settings::instance().load(false); + loadGameSpecificSettings(); + } + } + else + { + if (ImGui::Button("Make Game Config", ScaledVec2(0, 30))) + config::Settings::instance().setPerGameConfig(true); + } + } + + if (ImGui::GetContentRegionAvail().x >= uiScaled(650.f)) + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(16, 6)); + else + // low width + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(4, 6)); + + if (ImGui::BeginTabBar("settings", ImGuiTabBarFlags_NoTooltip)) + { + if (ImGui::BeginTabItem(ICON_FA_TOOLBOX " General")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_general(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem(ICON_FA_GAMEPAD " Controls")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_controls(maple_devices_changed); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem(ICON_FA_DISPLAY " Video")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_video(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem(ICON_FA_MUSIC " Audio")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_audio(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem(ICON_FA_WIFI " Network")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_network(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem(ICON_FA_MICROCHIP " Advanced")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_advanced(); + ImGui::EndTabItem(); + } +#if !defined(NDEBUG) || defined(DEBUGFAST) || FC_PROFILER + if (ImGui::BeginTabItem(ICON_FA_BUG " Debug")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_debug_tab(); + ImGui::EndTabItem(); + } +#endif + if (ImGui::BeginTabItem(ICON_FA_CIRCLE_INFO " About")) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, normal_padding); + gui_settings_about(); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::PopStyleVar(); + + scrollWhenDraggingOnVoid(); + windowDragScroll(); + ImGui::End(); +} + +void os_notify(const char *msg, int durationMs, const char *details) +{ + if (gui_state != GuiState::Closed) + { + std::lock_guard _{osd_message_mutex}; + osd_message = msg; + osd_message_end = getTimeMs() + durationMs; + } + else { + toast.show(msg, details != nullptr ? details : "", durationMs); + } +} + +static std::string get_notification() +{ + std::lock_guard lock(osd_message_mutex); + if (!osd_message.empty() && getTimeMs() >= osd_message_end) + osd_message.clear(); + return osd_message; +} + +inline static void gui_display_demo() +{ + ImGui::ShowDemoWindow(); +} + +static void gameTooltip(const std::string& tip) +{ + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 25.0f); + ImGui::TextUnformatted(tip.c_str()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +static bool gameImageButton(ImguiTexture& texture, const std::string& tooltip, ImVec2 size, const std::string& gameName) +{ + bool pressed = texture.button("##imagebutton", size, gameName); + gameTooltip(tooltip); + + return pressed; +} + +#ifdef TARGET_UWP +void gui_load_game() +{ + using namespace Windows::Storage; + using namespace Concurrency; + + auto picker = ref new Pickers::FileOpenPicker(); + picker->ViewMode = Pickers::PickerViewMode::List; + + picker->FileTypeFilter->Append(".chd"); + picker->FileTypeFilter->Append(".gdi"); + picker->FileTypeFilter->Append(".cue"); + picker->FileTypeFilter->Append(".cdi"); + picker->FileTypeFilter->Append(".zip"); + picker->FileTypeFilter->Append(".7z"); + picker->FileTypeFilter->Append(".elf"); + if (!config::HideLegacyNaomiRoms) + { + picker->FileTypeFilter->Append(".bin"); + picker->FileTypeFilter->Append(".lst"); + picker->FileTypeFilter->Append(".dat"); + } + picker->SuggestedStartLocation = Pickers::PickerLocationId::DocumentsLibrary; + + create_task(picker->PickSingleFileAsync()).then([](StorageFile ^file) { + if (file) + { + NOTICE_LOG(COMMON, "Picked file: %S", file->Path->Data()); + nowide::stackstring path; + if (path.convert(file->Path->Data())) + gui_start_game(path.get()); + } + }); +} +#endif + +static void gui_display_content() +{ + fullScreenWindow(false); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_WindowBorderSize, 0); + + ImGui::Begin("##main", NULL, ImGuiWindowFlags_NoDecoration); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); + ImGui::AlignTextToFramePadding(); + ImGui::Indent(uiScaled(10)); + ImGui::Text("GAMES"); + ImGui::Unindent(uiScaled(10)); + + static ImGuiTextFilter filter; + const float settingsBtnW = iconButtonWidth(ICON_FA_GEAR, "Settings"); +#if !defined(__ANDROID__) && !defined(TARGET_IPHONE) && !defined(TARGET_UWP) && !defined(__SWITCH__) + ImGui::SameLine(0, uiScaled(32)); + filter.Draw("Filter", ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.x - uiScaled(32) + - settingsBtnW - ImGui::GetStyle().ItemSpacing.x); +#endif + if (gui_state != GuiState::SelectDisk) + { +#ifdef TARGET_UWP + ImGui::SameLine(ImGui::GetContentRegionMax().x - settingsBtnW + - ImGui::GetStyle().FramePadding.x * 2.0f - ImGui::GetStyle().ItemSpacing.x - ImGui::CalcTextSize("Load...").x); + if (ImGui::Button("Load...")) + gui_load_game(); + ImGui::SameLine(); +#elif defined(__SWITCH__) + ImGui::SameLine(ImGui::GetContentRegionMax().x - settingsBtnW + - ImGui::GetStyle().ItemSpacing.x - iconButtonWidth(ICON_FA_POWER_OFF, "Exit")); + if (iconButton(ICON_FA_POWER_OFF, "Exit")) + dc_exit(); + ImGui::SameLine(); +#else + ImGui::SameLine(ImGui::GetContentRegionMax().x - settingsBtnW); +#endif + if (iconButton(ICON_FA_GEAR, "Settings")) + gui_setState(GuiState::Settings); + } + else + { + ImGui::SameLine(ImGui::GetContentRegionMax().x + - ImGui::GetStyle().FramePadding.x * 2.0f - ImGui::CalcTextSize("Cancel").x); + if (ImGui::Button("Cancel")) + gui_setState(GuiState::Commands); + } + ImGui::PopStyleVar(); + + scanner.fetch_game_list(); + + // Only if Filter and Settings aren't focused... ImGui::SetNextWindowFocus(); + ImGui::BeginChild(ImGui::GetID("library"), ImVec2(0, 0), ImGuiChildFlags_Border, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NavFlattened); + { + const float totalWidth = ImGui::GetContentRegionMax().x - (!ImGui::GetCurrentWindow()->ScrollbarY ? ImGui::GetStyle().ScrollbarSize : 0); + const int itemsPerLine = std::max(totalWidth / (uiScaled(150) + ImGui::GetStyle().ItemSpacing.x), 1); + const float responsiveBoxSize = totalWidth / itemsPerLine - ImGui::GetStyle().FramePadding.x * 2; + const ImVec2 responsiveBoxVec2 = ImVec2(responsiveBoxSize, responsiveBoxSize); + + if (config::BoxartDisplayMode) + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f, 0.5f)); + else + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ScaledVec2(8, 20)); + + int counter = 0; + bool gameListEmpty = false; + { + scanner.get_mutex().lock(); + gameListEmpty = scanner.get_game_list().empty(); + for (const auto& game : scanner.get_game_list()) + { + if (gui_state == GuiState::SelectDisk) + { + std::string extension = get_file_extension(game.path); + if (!game.device && extension != "gdi" && extension != "chd" + && extension != "cdi" && extension != "cue") + // Only dreamcast disks + continue; + if (game.path.empty()) + // Dreamcast BIOS isn't a disk + continue; + } + std::string gameName = game.name; + GameBoxart art; + if (config::BoxartDisplayMode && !game.device) + { + art = boxart.getBoxartAndLoad(game); + gameName = art.name; + } + if (filter.PassFilter(gameName.c_str())) + { + ImguiID _(game.path.empty() ? "bios" : game.path); + bool pressed = false; + if (config::BoxartDisplayMode) + { + if (counter % itemsPerLine != 0) + ImGui::SameLine(); + counter++; + // Put the image inside a child window so we can detect when it's fully clipped and doesn't need to be loaded + if (ImGui::BeginChild("img", ImVec2(0, 0), ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY, ImGuiWindowFlags_NavFlattened)) + { + ImguiFileTexture tex(art.boxartPath); + pressed = gameImageButton(tex, game.name, responsiveBoxVec2, gameName); + } + ImGui::EndChild(); + } + else + { + pressed = ImGui::Selectable(gameName.c_str()); + } + if (pressed) + { + if (!config::BoxartDisplayMode) + art = boxart.getBoxart(game); + settings.content.title = art.name; + if (settings.content.title.empty() || settings.content.title == game.fileName) + settings.content.title = get_file_basename(game.fileName); + if (gui_state == GuiState::SelectDisk) + { + try { + emu.insertGdrom(game.path); + gui_setState(GuiState::Closed); + } catch (const FlycastException& e) { + gui_error(e.what()); + } + } + else + { + std::string gamePath(game.path); + scanner.get_mutex().unlock(); + gui_start_game(gamePath); + scanner.get_mutex().lock(); + break; + } + } + } + } + scanner.get_mutex().unlock(); + } + bool addContent = false; +#if !defined(TARGET_IPHONE) + if (gameListEmpty && gui_state != GuiState::SelectDisk) + { + const char *label = "Your game list is empty"; + // center horizontally + const float w = largeFont->CalcTextSizeA(largeFont->FontSize, FLT_MAX, -1.f, label).x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine((ImGui::GetContentRegionMax().x - w) / 2); + if (ImGui::BeginChild("empty", ImVec2(0, 0), ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY, ImGuiWindowFlags_NavFlattened)) + { + ImGui::PushFont(largeFont); + ImGui::NewLine(); + ImGui::Text("%s", label); + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); + addContent = ImGui::Button("Add Game Folder"); + ImGui::PopFont(); + } + ImGui::EndChild(); + } +#endif + ImGui::PopStyleVar(); + addContentPath(addContent); + } + scrollWhenDraggingOnVoid(); + windowDragScroll(); + ImGui::EndChild(); + ImGui::End(); + + contentpath_warning_popup(); +} + +static bool systemdir_selected_callback(bool cancelled, std::string selection) +{ + if (cancelled) + { + gui_setState(GuiState::Main); + return true; + } + selection += "/"; + + std::string data_path = selection + "data/"; + if (!file_exists(data_path)) + { + if (!make_directory(data_path)) + { + WARN_LOG(BOOT, "Cannot create 'data' directory: %s", data_path.c_str()); + gui_error("Invalid selection:\nFlycast cannot write to this folder."); + return false; + } + } + // We might be able to create a directory but not a file. Because ... android + // So let's test to be sure. + std::string testPath = data_path + "writetest.txt"; + FILE *file = fopen(testPath.c_str(), "w"); + if (file == nullptr) + { + WARN_LOG(BOOT, "Cannot write in the 'data' directory"); + gui_error("Invalid selection:\nFlycast cannot write to this folder."); + return false; + } + fclose(file); + unlink(testPath.c_str()); + + set_user_config_dir(selection); + add_system_data_dir(selection); + set_user_data_dir(data_path); + + if (cfgOpen()) + { + config::Settings::instance().load(false); + // Make sure the renderer type doesn't change mid-flight + config::RendererType = RenderType::OpenGL; + gui_setState(GuiState::Main); + if (config::ContentPath.get().empty()) + { + scanner.stop(); + config::ContentPath.get().push_back(selection); + } + SaveSettings(); + } + return true; +} + +static void gui_display_onboarding() +{ + const char *title = "Select Flycast Home Folder"; + ImGui::OpenPopup(title); + select_file_popup(title, &systemdir_selected_callback); +} + +static void drawBoxartBackground() +{ + GameMedia game; + game.path = settings.content.path; + game.fileName = settings.content.fileName; + GameBoxart art = boxart.getBoxart(game); + ImguiFileTexture tex(art.boxartPath); + ImDrawList *dl = ImGui::GetBackgroundDrawList(); + tex.draw(dl, ImVec2(0, 0), ImVec2(settings.display.width, settings.display.height), 1.f); +} + +static std::future networkStatus; + +static void gui_network_start() +{ + drawBoxartBackground(); + centerNextWindow(); + ImGui::SetNextWindowSize(ScaledVec2(330, 0)); + ImGui::SetNextWindowBgAlpha(0.8f); + ImguiStyleVar _1(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20)); + + ImGui::Begin("##network", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize); + + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10)); + ImGui::AlignTextToFramePadding(); + ImGui::SetCursorPosX(uiScaled(20.f)); + + if (networkStatus.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) + { + ImGui::Text("Starting..."); + try { + if (networkStatus.get()) + gui_setState(GuiState::Closed); + else + gui_stop_game(); + } catch (const FlycastException& e) { + gui_stop_game(e.what()); + } + } + else + { + ImGui::Text("Starting Network..."); + if (NetworkHandshake::instance->canStartNow()) + ImGui::Text("Press Start to start the game now."); + } + ImGui::Text("%s", get_notification().c_str()); + + float currentwidth = ImGui::GetContentRegionAvail().x; + ImGui::SetCursorPosX((currentwidth - uiScaled(100.f)) / 2.f + ImGui::GetStyle().WindowPadding.x); + if (ImGui::Button("Cancel", ScaledVec2(100.f, 0)) && NetworkHandshake::instance != nullptr) + { + NetworkHandshake::instance->stop(); + try { + networkStatus.get(); + } + catch (const FlycastException& e) { + } + gui_stop_game(); + } + ImGui::End(); + + if ((kcode[0] & DC_BTN_START) == 0 && NetworkHandshake::instance != nullptr) + NetworkHandshake::instance->startNow(); +} + +static void gui_display_loadscreen() +{ + drawBoxartBackground(); + centerNextWindow(); + ImGui::SetNextWindowSize(ScaledVec2(330, 0)); + ImGui::SetNextWindowBgAlpha(0.8f); + ImguiStyleVar _(ImGuiStyleVar_WindowPadding, ScaledVec2(20, 20)); + + if (ImGui::Begin("##loading", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize)) + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 10)); + ImGui::AlignTextToFramePadding(); + ImGui::SetCursorPosX(uiScaled(20.f)); + try { + const char *label = gameLoader.getProgress().label; + if (label == nullptr) + { + if (gameLoader.ready()) + label = "Starting..."; + else + label = "Loading..."; + } + + if (gameLoader.ready()) + { + if (NetworkHandshake::instance != nullptr) + { + networkStatus = NetworkHandshake::instance->start(); + gui_setState(GuiState::NetworkStart); + } + else + { + gui_setState(GuiState::Closed); + ImGui::Text("%s", label); + } + } + else + { + ImGui::Text("%s", label); + { + ImguiStyleColor _(ImGuiCol_PlotHistogram, ImVec4(0.557f, 0.268f, 0.965f, 1.f)); + ImGui::ProgressBar(gameLoader.getProgress().progress, ImVec2(-1, uiScaled(20.f)), ""); + } + + float currentwidth = ImGui::GetContentRegionAvail().x; + ImGui::SetCursorPosX((currentwidth - uiScaled(100.f)) / 2.f + ImGui::GetStyle().WindowPadding.x); + if (ImGui::Button("Cancel", ScaledVec2(100.f, 0))) + gameLoader.cancel(); + } + } catch (const FlycastException& ex) { + ERROR_LOG(BOOT, "%s", ex.what()); +#ifdef TEST_AUTOMATION + die("Game load failed"); +#endif + gui_stop_game(ex.what()); + } + } + ImGui::End(); +} + +void gui_display_ui() +{ + FC_PROFILE_SCOPE; + const LockGuard lock(guiMutex); + + if (gui_state == GuiState::Closed) + return; + if (gui_state == GuiState::Main) + { + if (!settings.content.path.empty() || settings.naomi.slave) + { +#ifndef __ANDROID__ + commandLineStart = true; +#endif + gui_start_game(settings.content.path); + return; + } + } + + gui_newFrame(); + ImGui::NewFrame(); + error_msg_shown = false; + bool gui_open = gui_is_open(); + + switch (gui_state) + { + case GuiState::Settings: + gui_display_settings(); + break; + case GuiState::Commands: + gui_display_commands(); + break; + case GuiState::Main: + //gui_display_demo(); + gui_display_content(); + break; + case GuiState::Closed: + break; + case GuiState::Onboarding: + gui_display_onboarding(); + break; + case GuiState::VJoyEdit: + vgamepad::draw(); + break; + case GuiState::VJoyEditCommands: + vgamepad::displayCommands(); + break; + case GuiState::SelectDisk: + gui_display_content(); + break; + case GuiState::Loading: + gui_display_loadscreen(); + break; + case GuiState::NetworkStart: + gui_network_start(); + break; + case GuiState::Cheats: + gui_cheats(); + break; + case GuiState::Achievements: +#ifdef USE_RACHIEVEMENTS + achievements::achievementList(); + break; +#endif + default: + die("Unknown UI state"); + break; + } + error_popup(); + ImGui::Render(); + gui_endFrame(gui_open); + uiThreadRunner.execTasks(); + ImguiFileTexture::resetLoadCount(); + + if (gui_state == GuiState::Closed) + emu.start(); +} + +static u64 LastFPSTime; +static int lastFrameCount = 0; +static float fps = -1; + +static std::string getFPSNotification() +{ + if (config::ShowFPS) + { + u64 now = getTimeMs(); + if (now - LastFPSTime >= 1000) { + fps = ((float)MainFrameCount - lastFrameCount) * 1000.f / (now - LastFPSTime); + LastFPSTime = now; + lastFrameCount = MainFrameCount; + } + if (fps >= 0.f && fps < 9999.f) { + char text[32]; + snprintf(text, sizeof(text), "F:%4.1f%s", fps, settings.input.fastForwardMode ? " >>" : ""); + + return std::string(text); + } + } + return std::string(settings.input.fastForwardMode ? ">>" : ""); +} + +void gui_draw_osd() +{ + gui_newFrame(); + ImGui::NewFrame(); + +#ifdef USE_RACHIEVEMENTS + if (!achievements::notifier.draw()) +#endif + if (!toast.draw()) + { + std::string message = getFPSNotification(); + if (!message.empty()) + { + const float maxW = uiScaled(640.f); + ImDrawList *dl = ImGui::GetForegroundDrawList(); + const ScaledVec2 padding(5.f, 5.f); + const ImVec2 size = largeFont->CalcTextSizeA(largeFont->FontSize, FLT_MAX, maxW, &message.front(), &message.back() + 1) + + padding * 2.f; + ImVec2 pos(insetLeft, ImGui::GetIO().DisplaySize.y - size.y); + constexpr float alpha = 0.7f; + const ImU32 bg_col = alphaOverride(0x00202020, alpha / 2.f); + dl->AddRectFilled(pos, pos + size, bg_col, 0.f); + pos += padding; + const ImU32 col = alphaOverride(0x0000FFFF, alpha); + dl->AddText(largeFont, largeFont->FontSize, pos, col, &message.front(), &message.back() + 1, maxW); + } + } + + if (ggpo::active()) + { + if (config::NetworkStats) + ggpo::displayStats(); + chat.display(); + } + if (!settings.raHardcoreMode) + lua::overlay(); + vgamepad::draw(); + ImGui::Render(); + uiThreadRunner.execTasks(); +} + +void gui_display_osd() +{ + gui_draw_osd(); + gui_endFrame(gui_is_open()); +} + +void gui_display_profiler() +{ +#if FC_PROFILER + gui_newFrame(); + ImGui::NewFrame(); + + ImGui::Begin("Profiler", NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoBackground); + + { + ImguiStyleColor _(ImGuiCol_Text, ImVec4(0.8f, 0.8f, 0.8f, 1.0f)); + + std::unique_lock lock(fc_profiler::ProfileThread::s_allThreadsLock); + + for(const fc_profiler::ProfileThread* profileThread : fc_profiler::ProfileThread::s_allThreads) + { + char text[256]; + std::snprintf(text, 256, "%.3f : Thread %s", (float)profileThread->cachedTime, profileThread->threadName.c_str()); + ImGui::TreeNode(text); + + ImGui::Indent(); + fc_profiler::drawGUI(profileThread->cachedResultTree); + ImGui::Unindent(); + } + } + + for (const fc_profiler::ProfileThread* profileThread : fc_profiler::ProfileThread::s_allThreads) + { + fc_profiler::drawGraph(*profileThread); + } + + ImGui::End(); + ImGui::Render(); + gui_endFrame(true); +#endif +} + +void gui_open_onboarding() +{ + gui_setState(GuiState::Onboarding); +} + +void gui_cancel_load() +{ + gameLoader.cancel(); +} + +void gui_term() +{ + if (inited) + { + inited = false; + scanner.stop(); + ImGui::DestroyContext(); + EventManager::unlisten(Event::Resume, emuEventCallback); + EventManager::unlisten(Event::Start, emuEventCallback); + EventManager::unlisten(Event::Terminate, emuEventCallback); + boxart.term(); + } +} + +void fatal_error(const char* text, ...) +{ + va_list args; + + char temp[2048]; + va_start(args, text); + vsnprintf(temp, sizeof(temp), text, args); + va_end(args); + ERROR_LOG(COMMON, "%s", temp); + + os_notify("Fatal Error", 20000, temp); +} + +extern bool subfolders_read; + +void gui_refresh_files() +{ + scanner.refresh(); + subfolders_read = false; +} + +static void reset_vmus() +{ + for (u32 i = 0; i < std::size(vmu_lcd_status); i++) + vmu_lcd_status[i] = false; +} + +void gui_error(const std::string& what) +{ + error_msg = what; +} + +void gui_loadState() +{ + const LockGuard lock(guiMutex); + if (gui_state == GuiState::Closed && savestateAllowed()) + { + try { + emu.stop(); + dc_loadstate(config::SavestateSlot); + emu.start(); + } catch (const FlycastException& e) { + gui_stop_game(e.what()); + } + } +} + +void gui_saveState(bool stopRestart) +{ + const LockGuard lock(guiMutex); + if ((gui_state == GuiState::Closed || !stopRestart) && savestateAllowed()) + { + try { + if (stopRestart) + emu.stop(); + savestate(); + if (stopRestart) + emu.start(); + } catch (const FlycastException& e) { + if (stopRestart) + gui_stop_game(e.what()); + else + WARN_LOG(COMMON, "gui_saveState: %s", e.what()); + } + } +} + +void gui_setState(GuiState newState) +{ + gui_state = newState; + if (newState == GuiState::Closed) + { + // If the game isn't rendering any frame, these flags won't be updated and keyboard/mouse input will be ignored. + // So we force them false here. They will be set in the next ImGUI::NewFrame() anyway + ImGuiIO& io = ImGui::GetIO(); + io.WantCaptureKeyboard = false; + io.WantCaptureMouse = false; + } +} + +std::string gui_getCurGameBoxartUrl() +{ + GameMedia game; + game.fileName = settings.content.fileName; + game.path = settings.content.path; + GameBoxart art = boxart.getBoxart(game); + return art.boxartUrl; +} + +void gui_runOnUiThread(std::function function) { + uiThreadRunner.runOnThread(function); +} + +void gui_takeScreenshot() +{ + if (!game_started) + return; + gui_runOnUiThread([]() { + std::string date = timeToISO8601(time(nullptr)); + std::replace(date.begin(), date.end(), '/', '-'); + std::replace(date.begin(), date.end(), ':', '-'); + std::string name = "Flycast-" + date + ".png"; + + std::vector data; + getScreenshot(data); + if (data.empty()) { + os_notify("No screenshot available", 2000); + } + else + { + try { + hostfs::saveScreenshot(name, data); + os_notify("Screenshot saved", 2000, name.c_str()); + } catch (const FlycastException& e) { + os_notify("Error saving screenshot", 5000, e.what()); + } + } + }); +} + +#ifdef TARGET_UWP +// Ugly but a good workaround for MS stupidity +// UWP doesn't allow the UI thread to wait on a thread/task. When an std::future is ready, it is possible +// that the task has not yet completed. Calling std::future::get() at this point will throw an exception +// AND destroy the std::future at the same time, rendering it invalid and discarding the future result. +bool __cdecl Concurrency::details::_Task_impl_base::_IsNonBlockingThread() { + return false; +} +#endif diff --git a/core/rend/gui.h b/core/ui/gui.h similarity index 86% rename from core/rend/gui.h rename to core/ui/gui.h index 6fbb503e6..a8026910a 100644 --- a/core/rend/gui.h +++ b/core/ui/gui.h @@ -20,12 +20,13 @@ #include "types.h" #include +#include void gui_init(); void gui_initFonts(); void gui_open_settings(); void gui_display_ui(); -void gui_display_notification(const char *msg, int duration); +void gui_draw_osd(); void gui_display_osd(); void gui_display_profiler(); void gui_open_onboarding(); @@ -47,9 +48,11 @@ void gui_stop_game(const std::string& message = ""); void gui_start_game(const std::string& path); void gui_error(const std::string& what); void gui_setOnScreenKeyboardCallback(void (*callback)(bool show)); -void gui_save(); void gui_loadState(); -void gui_saveState(); +void gui_saveState(bool stopRestart = true); +std::string gui_getCurGameBoxartUrl(); +void gui_takeScreenshot(); +void gui_runOnUiThread(std::function function); enum class GuiState { Closed, @@ -62,13 +65,16 @@ enum class GuiState { SelectDisk, Loading, NetworkStart, - Cheats + Cheats, + Achievements, }; extern GuiState gui_state; +void gui_setState(GuiState newState); + static inline bool gui_is_open() { - return gui_state != GuiState::Closed && gui_state != GuiState::VJoyEdit; + return gui_state != GuiState::Closed; } static inline bool gui_is_content_browser() { diff --git a/core/ui/gui_achievements.cpp b/core/ui/gui_achievements.cpp new file mode 100644 index 000000000..c60cf0a82 --- /dev/null +++ b/core/ui/gui_achievements.cpp @@ -0,0 +1,359 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#ifdef USE_RACHIEVEMENTS +#include "gui_achievements.h" +#include "gui.h" +#include "gui_util.h" +#include "imgui_driver.h" +#include "stdclass.h" +#include "achievements/achievements.h" +#include "IconsFontAwesome6.h" +#include +#include + +extern ImFont *largeFont; +extern int insetLeft; + +namespace achievements +{ + +Notification notifier; + +static constexpr u64 DISPLAY_TIME = 5000; +static constexpr u64 START_ANIM_TIME = 500; +static constexpr u64 END_ANIM_TIME = 1000; +static constexpr u64 NEVER_ENDS = 1000000000000; + +void Notification::notify(Type type, const std::string& image, const std::string& text1, + const std::string& text2, const std::string& text3) +{ + verify(type != Challenge && type != Leaderboard); + std::lock_guard _(mutex); + u64 now = getTimeMs(); + if (type == Progress) + { + if (!text1.empty()) + { + if (this->type == None) + { + // New progress + startTime = now; + endTime = NEVER_ENDS; + } + } + else + { + // Hide progress + endTime = now; + } + } + else { + startTime = now; + endTime = startTime + DISPLAY_TIME; + } + this->type = type; + this->image = { image }; + text[0] = text1; + text[1] = text2; + text[2] = text3; +} + +void Notification::showChallenge(const std::string& image) +{ + std::lock_guard _(mutex); + ImguiFileTexture texture{ image }; + if (std::find(challenges.begin(), challenges.end(), texture) != challenges.end()) + return; + challenges.push_back(texture); + if (this->type == None) + { + this->type = Challenge; + startTime = getTimeMs(); + endTime = NEVER_ENDS; + } +} + +void Notification::hideChallenge(const std::string& image) +{ + std::lock_guard _(mutex); + auto it = std::find(challenges.begin(), challenges.end(), image); + if (it == challenges.end()) + return; + challenges.erase(it); + if (this->type == Challenge && challenges.empty()) + endTime = getTimeMs(); +} + +void Notification::showLeaderboard(u32 id, const std::string& text) +{ + std::lock_guard _(mutex); + auto it = leaderboards.find(id); + if (it == leaderboards.end()) + { + if (leaderboards.empty()) + { + this->type = Leaderboard; + startTime = getTimeMs(); + endTime = NEVER_ENDS; + } + leaderboards[id] = text; + } + else { + it->second = text; + } +} + +void Notification::hideLeaderboard(u32 id) +{ + std::lock_guard _(mutex); + auto it = leaderboards.find(id); + if (it == leaderboards.end()) + return; + leaderboards.erase(it); + if (this->type == Leaderboard && leaderboards.empty()) + endTime = getTimeMs(); +} + +bool Notification::draw() +{ + std::lock_guard _(mutex); + if (type == None) + return false; + u64 now = getTimeMs(); + if (now > endTime + END_ANIM_TIME) + { + if (!leaderboards.empty()) + { + // Show current leaderboards + type = Leaderboard; + startTime = getTimeMs(); + endTime = NEVER_ENDS; + } + else if (!challenges.empty()) + { + // Show current challenge indicators + type = Challenge; + startTime = getTimeMs(); + endTime = NEVER_ENDS; + } + else + { + // Hide notification + type = None; + return false; + } + } + float alpha = 1.f; + if (now > endTime) + // Fade out + alpha = (std::cos((now - endTime) / (float)END_ANIM_TIME * (float)M_PI) + 1.f) / 2.f; + float animY = 0.f; + if (now - startTime < START_ANIM_TIME) + // Slide up + animY = (std::cos((now - startTime) / (float)START_ANIM_TIME * (float)M_PI) + 1.f) / 2.f; + + const ImVec2 padding = ImGui::GetStyle().WindowPadding; + ImDrawList *dl = ImGui::GetForegroundDrawList(); + const ImU32 bg_col = alphaOverride(ImGui::GetColorU32(ImGuiCol_WindowBg), alpha / 2.f); + const ImU32 borderCol = alphaOverride(ImGui::GetColorU32(ImGuiCol_Border), alpha); + if (type == Challenge) + { + const ScaledVec2 size(60.f, 60.f); + const float hspacing = ImGui::GetStyle().ItemSpacing.x; + ImVec2 totalSize = padding * 2 + size; + totalSize.x += (size.x + hspacing) * (challenges.size() - 1); + ImVec2 pos(insetLeft, ImGui::GetIO().DisplaySize.y - totalSize.y * (1.f - animY)); + dl->AddRectFilled(pos, pos + totalSize, bg_col, 0.f); + dl->AddRect(pos, pos + totalSize, borderCol, 0.f); + + pos += padding; + for (auto& img : challenges) { + img.draw(dl, pos, size, alpha); + pos.x += hspacing + size.x; + } + } + else if (type == Leaderboard) + { + ImFont *font = ImGui::GetFont(); + const ImVec2 padding = ImGui::GetStyle().FramePadding; + // iterate from the end + ImVec2 pos(insetLeft + padding.x, ImGui::GetIO().DisplaySize.y - padding.y); + for (auto it = leaderboards.rbegin(); it != leaderboards.rend(); ++it) + { + const std::string& text = it->second; + ImVec2 size = font->CalcTextSizeA(font->FontSize, FLT_MAX, -1.f, text.c_str()); + ImVec2 psize = size + padding * 2; + pos.y -= psize.y; + dl->AddRectFilled(pos, pos + psize, bg_col, 0.f); + ImVec2 tpos = pos + padding; + const ImU32 col = alphaOverride(0xffffff, alpha); + dl->AddText(font, font->FontSize, tpos, col, &text.front(), &text.back() + 1, FLT_MAX); + pos.y -= padding.y; + } + } + else + { + const float hspacing = ImGui::GetStyle().ItemSpacing.x; + const float vspacing = ImGui::GetStyle().ItemSpacing.y; + const ScaledVec2 imgSize = image.getId() != ImTextureID{} ? ScaledVec2(80.f, 80.f) : ScaledVec2(); + // text size + const float maxW = std::min(ImGui::GetIO().DisplaySize.x, uiScaled(640.f)) - padding.x + - (imgSize.x != 0.f ? imgSize.x + hspacing : padding.x); + ImFont *regularFont = ImGui::GetFont(); + ImVec2 textSize[3] {}; + ImVec2 totalSize(0.f, padding.y * 2); + for (size_t i = 0; i < std::size(text); i++) + { + if (text[i].empty()) + continue; + const ImFont *font = i == 0 ? largeFont : regularFont; + textSize[i] = font->CalcTextSizeA(font->FontSize, FLT_MAX, maxW, text[i].c_str()); + totalSize.x = std::max(totalSize.x, textSize[i].x); + totalSize.y += textSize[i].y; + } + float topMargin = 0.f; + // image / left padding + if (imgSize.x != 0.f) + { + if (totalSize.y < imgSize.y) + topMargin = (imgSize.y - totalSize.y) / 2.f; + totalSize.x += imgSize.x + hspacing; + totalSize.y = std::max(totalSize.y, imgSize.y); + } + else { + totalSize.x += padding.x; + } + // right padding + totalSize.x += padding.x; + // border + totalSize += ImVec2(2.f, 2.f); + // draw background, border + ImVec2 pos(insetLeft, ImGui::GetIO().DisplaySize.y - totalSize.y * (1.f - animY)); + dl->AddRectFilled(pos, pos + totalSize, bg_col, 0.f); + dl->AddRect(pos, pos + totalSize, borderCol, 0.f); + + // draw image and text + pos += ImVec2(1.f, 1.f); // border + if (imgSize.x != 0.f) { + image.draw(dl, pos, imgSize, alpha); + pos.x += imgSize.x + hspacing; + } + else { + pos.x += padding.x; + } + pos.y += topMargin; + for (size_t i = 0; i < std::size(text); i++) + { + if (text[i].empty()) + continue; + const ImFont *font = i == 0 ? largeFont : regularFont; + const ImU32 col = alphaOverride(i == 0 ? 0xffffff : 0x00ffff, alpha); + dl->AddText(font, font->FontSize, pos, col, &text[i].front(), &text[i].back() + 1, maxW); + pos.y += textSize[i].y + vspacing; + } + } + + return true; +} + +void achievementList() +{ + fullScreenWindow(false); + ImguiStyleVar _(ImGuiStyleVar_WindowBorderSize, 0); + + ImGui::Begin("##achievements", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize); + + { + float w = ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize("Close").x - ImGui::GetStyle().ItemSpacing.x * 2 - ImGui::GetStyle().WindowPadding.x + - uiScaled(80.f + 20.f * 2); // image width and button frame padding + Game game = getCurrentGame(); + ImguiFileTexture tex(game.image); + tex.draw(ScaledVec2(80.f, 80.f)); + ImGui::SameLine(); + ImGui::BeginChild("game_info", ImVec2(w, uiScaled(80.f)), ImGuiChildFlags_None, ImGuiWindowFlags_None); + ImGui::PushFont(largeFont); + ImGui::Text("%s", game.title.c_str()); + ImGui::PopFont(); + std::stringstream ss; + ss << "You have unlocked " << game.unlockedAchievements << " of " << game.totalAchievements + << " achievements and " << game.points << " of " << game.totalPoints << " points."; + { + ImguiStyleColor _(ImGuiCol_Text, ImVec4(0.75f, 0.75f, 0.75f, 1.f)); + ImGui::TextWrapped("%s", ss.str().c_str()); + } + if (settings.raHardcoreMode) + ImGui::Text("Hardcore Mode"); + ImGui::EndChild(); + + ImGui::SameLine(); + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); + if (ImGui::Button("Close")) + gui_setState(GuiState::Commands); + } + + // ImGuiWindowFlags_NavFlattened prevents the child window from getting the focus and thus the list can't be scrolled with a keyboard or gamepad. + if (ImGui::BeginChild(ImGui::GetID("ach_list"), ImVec2(0, 0), ImGuiChildFlags_Border, ImGuiWindowFlags_DragScrolling)) + { + std::vector achList = getAchievementList(); + int id = 0; + std::string category; + for (const auto& ach : achList) + { + if (ach.category != category) + { + category = ach.category; + ImGui::Indent(uiScaled(10)); + if (category == "Locked" || category == "Active Challenges" || category == "Almost There") + ImGui::Text(ICON_FA_LOCK); + else if (category == "Unlocked" || category == "Recently Unlocked") + ImGui::Text(ICON_FA_LOCK_OPEN); + ImGui::SameLine(); + ImGui::PushFont(largeFont); + ImGui::Text("%s", category.c_str()); + ImGui::PopFont(); + ImGui::Unindent(uiScaled(10)); + } + ImguiID _("achiev" + std::to_string(id++)); + ImguiFileTexture tex(ach.image); + tex.draw(ScaledVec2(80.f, 80.f)); + ImGui::SameLine(); + ImGui::BeginChild(ImGui::GetID("ach_item"), ImVec2(0, 0), ImGuiChildFlags_AutoResizeY, ImGuiWindowFlags_None); + ImGui::PushFont(largeFont); + ImGui::Text("%s", ach.title.c_str()); + ImGui::PopFont(); + + { + ImguiStyleColor _(ImGuiCol_Text, ImVec4(0.75f, 0.75f, 0.75f, 1.f)); + ImGui::TextWrapped("%s", ach.description.c_str()); + ImGui::TextWrapped("%s", ach.status.c_str()); + } + + scrollWhenDraggingOnVoid(); + ImGui::EndChild(); + } + } + scrollWhenDraggingOnVoid(); + windowDragScroll(); + + ImGui::EndChild(); + ImGui::End(); +} + +} // namespace achievements +#endif // USE_RACHIEVEMENTS diff --git a/core/ui/gui_achievements.h b/core/ui/gui_achievements.h new file mode 100644 index 000000000..c41587799 --- /dev/null +++ b/core/ui/gui_achievements.h @@ -0,0 +1,65 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "types.h" +#include "gui_util.h" +#include +#include +#include + +namespace achievements +{ + +class Notification +{ +public: + enum Type { + None, + Login, + GameLoaded, + Unlocked, + Progress, + Mastery, + Challenge, // internal use + Leaderboard, // internal use + Error + }; + void notify(Type type, const std::string& image, const std::string& text1, + const std::string& text2 = {}, const std::string& text3 = {}); + void showChallenge(const std::string& image); + void hideChallenge(const std::string& image); + void showLeaderboard(u32 id, const std::string& text); + void hideLeaderboard(u32 id); + bool draw(); + +private: + u64 startTime = 0; + u64 endTime = 0; + Type type = Type::None; + ImguiFileTexture image; + std::string text[3]; + std::mutex mutex; + std::vector challenges; + std::map leaderboards; +}; + +extern Notification notifier; + +void achievementList(); + +} diff --git a/core/rend/gui_chat.h b/core/ui/gui_chat.h similarity index 94% rename from core/rend/gui_chat.h rename to core/ui/gui_chat.h index 9f140b1f5..04fd4509e 100644 --- a/core/rend/gui_chat.h +++ b/core/ui/gui_chat.h @@ -19,7 +19,7 @@ #pragma once #include "types.h" #include "gui.h" -#include "imgui/imgui.h" +#include "imgui.h" #include "network/ggpo.h" #include @@ -78,8 +78,8 @@ class Chat if (!visible) return; - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_WindowBorderSize, 0); ImGui::SetNextWindowPos(ImVec2(settings.display.width / 2, settings.display.height) - ScaledVec2(200.f, 220.f), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ScaledVec2(400, 220), ImGuiCond_FirstUseEver); ImGui::SetNextWindowBgAlpha(0.7f); @@ -87,7 +87,7 @@ class Chat if (ImGui::Begin("Chat", &visible, ImGuiWindowFlags_NoScrollbar)) { ImGui::BeginChild(ImGui::GetID("log"), ImVec2(0, -ImGui::GetStyle().ItemSpacing.x - ImGui::GetFontSize() - ImGui::GetStyle().FramePadding.x * 2), - true, ImGuiWindowFlags_DragScrolling); + ImGuiChildFlags_Border, ImGuiWindowFlags_DragScrolling); ImGui::PushTextWrapPos(ImGui::GetContentRegionAvail().x); for (const auto& p : lines) ImGui::TextColored(p.first, "%s", p.second.c_str()); @@ -121,7 +121,6 @@ class Chat ImGui::SetItemDefaultFocus(); } ImGui::End(); - ImGui::PopStyleVar(2); } void receive(int playerNum, const std::string& msg) diff --git a/core/ui/gui_cheats.cpp b/core/ui/gui_cheats.cpp new file mode 100644 index 000000000..57a8ca346 --- /dev/null +++ b/core/ui/gui_cheats.cpp @@ -0,0 +1,145 @@ +/* + Copyright 2021 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "gui.h" +#include "imgui.h" +#include "gui_util.h" +#include "cheats.h" +#include "IconsFontAwesome6.h" +#ifdef __ANDROID__ +#include "oslib/storage.h" +#endif + +static void addCheat() +{ + static char cheatName[64]; + static char cheatCode[128]; + centerNextWindow(); + ImGui::SetNextWindowSize(min(ImGui::GetIO().DisplaySize, ScaledVec2(600.f, 400.f))); + ImguiStyleVar _(ImGuiStyleVar_WindowBorderSize, 1); + + if (ImGui::BeginPopupModal("addCheat", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar + | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize)) + { + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); + ImGui::AlignTextToFramePadding(); + ImGui::Indent(uiScaled(10)); + ImGui::Text("ADD CHEAT"); + + ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize("Cancel").x - ImGui::GetStyle().FramePadding.x * 4.f + - ImGui::CalcTextSize("OK").x - ImGui::GetStyle().ItemSpacing.x); + if (ImGui::Button("Cancel")) + ImGui::CloseCurrentPopup(); + ImGui::SameLine(); + if (ImGui::Button("OK")) + { + try { + cheatManager.addGameSharkCheat(cheatName, cheatCode); + ImGui::CloseCurrentPopup(); + cheatName[0] = 0; + cheatCode[0] = 0; + } catch (const FlycastException& e) { + gui_error(e.what()); + } + } + + ImGui::Unindent(uiScaled(10)); + } + + ImGui::BeginChild(ImGui::GetID("input"), ImVec2(0, 0), ImGuiChildFlags_Border, ImGuiWindowFlags_NavFlattened); + { + ImGui::InputText("Name", cheatName, sizeof(cheatName), 0, nullptr, nullptr); + ImGui::InputTextMultiline("Code", cheatCode, sizeof(cheatCode), ImVec2(0, ImGui::GetTextLineHeight() * 8), 0, nullptr, nullptr); + } + ImGui::EndChild(); + ImGui::EndPopup(); + } +} + +static void cheatFileSelected(bool cancelled, std::string path) +{ + if (!cancelled) + gui_runOnUiThread([path]() { + cheatManager.loadCheatFile(path); + }); +} + +void gui_cheats() +{ + fullScreenWindow(false); + ImguiStyleVar _(ImGuiStyleVar_WindowBorderSize, 0); + + ImGui::Begin("##main", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar + | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize); + + const char *title = "Select a cheat file"; + { + ImguiStyleVar _(ImGuiStyleVar_FramePadding, ScaledVec2(20, 8)); + ImGui::AlignTextToFramePadding(); + ImGui::Indent(uiScaled(10)); + ImGui::Text(ICON_FA_MASK " CHEATS"); + + ImGui::SameLine(ImGui::GetWindowContentRegionMax().x - ImGui::CalcTextSize("Add").x - ImGui::CalcTextSize("Close").x - ImGui::GetStyle().FramePadding.x * 6.f + - ImGui::CalcTextSize("Load").x - ImGui::GetStyle().ItemSpacing.x * 2); + if (ImGui::Button("Add")) + ImGui::OpenPopup("addCheat"); + addCheat(); + ImGui::SameLine(); +#ifdef __ANDROID__ + if (ImGui::Button("Load")) + { + if (!hostfs::addStorage(false, true, title, cheatFileSelected)) + ImGui::OpenPopup(title); + } +#else + if (ImGui::Button("Load")) + ImGui::OpenPopup(title); +#endif + + ImGui::SameLine(); + if (ImGui::Button("Close")) + gui_setState(GuiState::Commands); + + ImGui::Unindent(uiScaled(10)); + } + select_file_popup(title, [](bool cancelled, std::string selection) + { + cheatFileSelected(cancelled, selection); + return true; + }, true, "cht"); + + ImGui::BeginChild(ImGui::GetID("cheats"), ImVec2(0, 0), ImGuiChildFlags_Border, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NavFlattened); + { + if (cheatManager.cheatCount() == 0) + ImGui::Text("(No cheat loaded)"); + else + for (size_t i = 0; i < cheatManager.cheatCount(); i++) + { + ImguiID _(("cheat" + std::to_string(i)).c_str()); + bool v = cheatManager.cheatEnabled(i); + if (ImGui::Checkbox(cheatManager.cheatDescription(i).c_str(), &v)) + cheatManager.enableCheat(i, v); + } + } + scrollWhenDraggingOnVoid(); + windowDragScroll(); + + ImGui::EndChild(); + ImGui::End(); +} diff --git a/core/rend/gui_util.cpp b/core/ui/gui_util.cpp similarity index 75% rename from core/rend/gui_util.cpp rename to core/ui/gui_util.cpp index 2d894642e..ec60d6a67 100644 --- a/core/rend/gui_util.cpp +++ b/core/ui/gui_util.cpp @@ -25,10 +25,11 @@ #include "types.h" #include "stdclass.h" #include "oslib/storage.h" -#include "imgui/imgui.h" -#include "imgui/imgui_internal.h" -#define STBI_ONLY_JPEG -#define STBI_ONLY_PNG +#include "imgui_driver.h" +#include "imgui.h" +#include "imgui_internal.h" +#include "stdclass.h" +#include "rend/osd.h" #include static std::string select_current_directory = "**home**"; @@ -37,6 +38,7 @@ static std::vector folderFiles; bool subfolders_read; extern int insetLeft, insetRight, insetTop, insetBottom; +extern ImFont *largeFont; void error_popup(); namespace hostfs @@ -51,7 +53,8 @@ void select_file_popup(const char *prompt, StringCallback callback, bool selectFile, const std::string& selectExtension) { fullScreenWindow(true); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_FramePadding, ImVec2(4, 3)); // default if (ImGui::BeginPopup(prompt, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize )) { @@ -96,6 +99,15 @@ void select_file_popup(const char *prompt, StringCallback callback, std::sort(folderFiles.begin(), folderFiles.end()); subfolders_read = true; } + if (prompt != nullptr) { + ImguiStyleVar _(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)); // Left + ImguiStyleVar _1(ImGuiStyleVar_DisabledAlpha, 1.0f); + ImGui::BeginDisabled(); + ImGui::PushFont(largeFont); + ImGui::ButtonEx(prompt, ImVec2(-1, 0)); + ImGui::PopFont(); + ImGui::EndDisabled(); + } std::string title; if (!error_message.empty()) title = error_message; @@ -105,55 +117,52 @@ void select_file_popup(const char *prompt, StringCallback callback, title = select_current_directory; ImGui::Text("%s", title.c_str()); - ImGui::BeginChild(ImGui::GetID("dir_list"), ImVec2(0, - 30 * settings.display.uiScale - ImGui::GetStyle().ItemSpacing.y), - true, ImGuiWindowFlags_DragScrolling); - - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ScaledVec2(8, 20)); - - if (!select_current_directory.empty() && select_current_directory != "/") + ImGui::BeginChild(ImGui::GetID("dir_list"), ImVec2(0, - uiScaled(30) - ImGui::GetStyle().ItemSpacing.y), + ImGuiChildFlags_Border, ImGuiWindowFlags_DragScrolling | ImGuiWindowFlags_NavFlattened); { - if (ImGui::Selectable(".. Up to Parent Directory")) + ImguiStyleVar _(ImGuiStyleVar_ItemSpacing, ScaledVec2(8, 20)); + + if (!select_current_directory.empty() && select_current_directory != "/") { - subfolders_read = false; - select_current_directory = hostfs::storage().getParentPath(select_current_directory); + if (ImGui::Selectable(".. Up to Parent Folder")) + { + subfolders_read = false; + select_current_directory = hostfs::storage().getParentPath(select_current_directory); + } } - } - for (const auto& entry : subfolders) - { - if (ImGui::Selectable(entry.name.c_str())) + for (const auto& entry : subfolders) { - subfolders_read = false; - select_current_directory = entry.path; + if (ImGui::Selectable(entry.name.c_str())) + { + subfolders_read = false; + select_current_directory = entry.path; + } } + ImguiStyleColor _1(ImGuiCol_Text, { 1, 1, 1, selectFile ? 1.f : 0.3f }); + for (const auto& entry : folderFiles) + { + if (selectFile) + { + if (ImGui::Selectable(entry.name.c_str())) + { + subfolders_read = false; + if (callback(false, entry.path)) + ImGui::CloseCurrentPopup(); + } + } + else + { + ImGui::Text("%s", entry.name.c_str()); + } + } + scrollWhenDraggingOnVoid(); + windowDragScroll(); } - ImGui::PushStyleColor(ImGuiCol_Text, { 1, 1, 1, selectFile ? 1.f : 0.3f }); - for (const auto& entry : folderFiles) - { - if (selectFile) - { - if (ImGui::Selectable(entry.name.c_str())) - { - subfolders_read = false; - if (callback(false, entry.path)) - ImGui::CloseCurrentPopup(); - } - } - else - { - ImGui::Text("%s", entry.name.c_str()); - } - } - ImGui::PopStyleColor(); - - scrollWhenDraggingOnVoid(); - windowDragScroll(); - - ImGui::PopStyleVar(); ImGui::EndChild(); if (!selectFile) { - if (ImGui::Button("Select Current Directory", ScaledVec2(0, 30))) + if (ImGui::Button("Select Current Folder", ScaledVec2(0, 30))) { if (callback(false, select_current_directory)) { @@ -172,7 +181,6 @@ void select_file_popup(const char *prompt, StringCallback callback, error_popup(); ImGui::EndPopup(); } - ImGui::PopStyleVar(); } // See https://github.com/ocornut/imgui/issues/3379 @@ -495,7 +503,8 @@ bool OptionCheckbox(const char *name, config::Option& optio template bool OptionCheckbox(const char *name, config::Option& option, const char *help); template bool OptionCheckbox(const char *name, config::Option& option, const char *help); -bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help, const char *format) +template +bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help, const char *format) { bool valueChanged; { @@ -513,21 +522,30 @@ bool OptionSlider(const char *name, config::Option& option, int min, int ma } return valueChanged; } +template bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help, const char *format); +template bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help, const char *format); -bool OptionArrowButtons(const char *name, config::Option& option, int min, int max, const char *help) +bool OptionArrowButtons(const char *name, config::Option& option, int min, int max, const char *help, const char *format) { const float innerSpacing = ImGui::GetStyle().ItemInnerSpacing.x; - ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)); // Left - ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[ImGuiCol_FrameBg]); - float width = ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f; - std::string id = "##" + std::string(name); - ImGui::PushStyleVar(ImGuiStyleVar_DisabledAlpha, 1.0f); - ImGui::BeginDisabled(); - ImGui::ButtonEx((std::to_string((int)option) + id).c_str(), ImVec2(width, 0)); - ImGui::EndDisabled(); - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - ImGui::PopStyleVar(); + const std::string id = "##" + std::string(name); + { + ImguiStyleVar _(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)); // Left + ImguiStyleColor _1(ImGuiCol_Button, ImGui::GetStyle().Colors[ImGuiCol_FrameBg]); + const float width = ImGui::CalcItemWidth() - innerSpacing * 2.0f - ImGui::GetFrameHeight() * 2.0f; + ImguiStyleVar _2(ImGuiStyleVar_DisabledAlpha, 1.0f); + ImGui::BeginDisabled(); + int size = snprintf(nullptr, 0, format, (int)option); + std::string value; + if (size >= 0) + { + value.resize(size + 1); + snprintf(value.data(), size + 1, format, (int)option); + value.resize(size); + } + ImGui::ButtonEx((value + id).c_str(), ImVec2(width, 0)); + ImGui::EndDisabled(); + } ImGui::SameLine(0.0f, innerSpacing); ImGui::PushButtonRepeat(true); @@ -603,8 +621,8 @@ void fullScreenWindow(bool modal) { if (!modal) { - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); - ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); + ImguiStyleVar _(ImGuiStyleVar_WindowRounding, 0); + ImguiStyleVar _1(ImGuiStyleVar_WindowBorderSize, 0); if (insetLeft > 0) { @@ -634,7 +652,6 @@ void fullScreenWindow(bool modal) ImGui::Begin("##insetBottom", NULL, ImGuiWindowFlags_NoDecoration); ImGui::End(); } - ImGui::PopStyleVar(2); } ImGui::SetNextWindowPos(ImVec2(insetLeft, insetTop)); ImGui::SetNextWindowSize(ImVec2(ImGui::GetIO().DisplaySize.x - insetLeft - insetRight, ImGui::GetIO().DisplaySize.y - insetTop - insetBottom)); @@ -686,7 +703,81 @@ void windowDragScroll() } } -u8 *loadImage(const std::string& path, int& width, int& height) +static void setUV(float ar, ImVec2& uv0, ImVec2& uv1) +{ + uv0 = { 0.f, 0.f }; + uv1 = { 1.f, 1.f }; + if (ar > 1) + { + uv0.y = -(ar - 1) / 2; + uv1.y = 1 + (ar - 1) / 2; + } + else if (ar != 0) + { + ar = 1 / ar; + uv0.x = -(ar - 1) / 2; + uv1.x = 1 + (ar - 1) / 2; + } +} + +void ImguiTexture::draw(const ImVec2& size, const ImVec4& tint_col, const ImVec4& border_col) +{ + ImTextureID id = getId(); + if (id == ImTextureID{}) + ImGui::Dummy(size); + else + { + const float ar = imguiDriver->getAspectRatio(id); + ImVec2 drawSize(size); + if (size.x == 0.f) + drawSize.x = size.y * ar; + else if (size.y == 0.f) + drawSize.y = size.x / ar; + ImVec2 uv0, uv1; + setUV(ar / drawSize.x * drawSize.y, uv0, uv1); + ImGui::Image(id, drawSize, uv0, uv1, tint_col, border_col); + } +} + +void ImguiTexture::draw(ImDrawList *drawList, const ImVec2& pos, const ImVec2& size, float alpha) +{ + ImTextureID id = getId(); + if (id == ImTextureID{}) + return; + const float ar = imguiDriver->getAspectRatio(id); + ImVec2 uv0, uv1; + setUV(ar / size.x * size.y, uv0, uv1); + u32 col = alphaOverride(0xffffff, alpha); + drawList->AddImage(id, pos, pos + size, uv0, uv1, col); +} + +void ImguiTexture::draw(ImDrawList *drawList, const ImVec2& pos, const ImVec2& size, + const ImVec2& uv0, const ImVec2& uv1, const ImVec4& color) +{ + ImTextureID id = getId(); + if (id == ImTextureID{}) + return; + u32 col = ImGui::ColorConvertFloat4ToU32(color); + drawList->AddImage(id, pos, pos + size, uv0, uv1, col); +} + +bool ImguiTexture::button(const char* str_id, const ImVec2& image_size, const std::string& title, + const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImTextureID id = getId(); + if (id == ImTextureID{}) + return ImGui::Button(title.c_str(), image_size); + else + { + const float ar = imguiDriver->getAspectRatio(id); + const ImVec2 size = image_size - ImGui::GetStyle().FramePadding * 2; + ImVec2 uv0, uv1; + setUV(ar / size.x * size.y, uv0, uv1); + return ImGui::ImageButton(str_id, id, size, uv0, uv1, bg_col, tint_col); + } +} + +static u8 *loadImage(const std::string& path, int& width, int& height) { FILE *file = nowide::fopen(path.c_str(), "rb"); if (file == nullptr) @@ -698,3 +789,264 @@ u8 *loadImage(const std::string& path, int& width, int& height) std::fclose(file); return imgData; } + +int ImguiFileTexture::textureLoadCount; + +ImTextureID ImguiFileTexture::getId() +{ + if (path.empty()) + return {}; + ImTextureID id = imguiDriver->getTexture(path); + if (id == ImTextureID() && textureLoadCount < 10) + { + textureLoadCount++; + int width, height; + u8 *imgData = loadImage(path, width, height); + if (imgData != nullptr) + { + try { + id = imguiDriver->updateTextureAndAspectRatio(path, imgData, width, height, nearestSampling); + } catch (...) { + // vulkan can throw during resizing + } + free(imgData); + } + } + return id; +} + +std::future ImguiStateTexture::asyncLoad; + +bool ImguiStateTexture::exists() +{ + std::string path = hostfs::getSavestatePath(config::SavestateSlot, false); + return hostfs::storage().exists(path); +} + +ImTextureID ImguiStateTexture::getId() +{ + std::string path = hostfs::getSavestatePath(config::SavestateSlot, false); + ImTextureID texid = imguiDriver->getTexture(path); + if (texid != ImTextureID()) + return texid; + if (asyncLoad.valid()) + { + if (asyncLoad.wait_for(std::chrono::seconds::zero()) == std::future_status::timeout) + return {}; + LoadedPic loadedPic = asyncLoad.get(); + if (loadedPic.data != nullptr) + { + try { + texid = imguiDriver->updateTextureAndAspectRatio(path, loadedPic.data, loadedPic.width, loadedPic.height, nearestSampling); + } catch (...) { + // vulkan can throw during resizing + } + free(loadedPic.data); + } + return texid; + } + asyncLoad = std::async(std::launch::async, []() { + LoadedPic loadedPic{}; + // load savestate info + std::vector pngData; + dc_getStateScreenshot(config::SavestateSlot, pngData); + if (pngData.empty()) + return loadedPic; + + int channels; + stbi_set_flip_vertically_on_load(0); + loadedPic.data = stbi_load_from_memory(&pngData[0], pngData.size(), &loadedPic.width, &loadedPic.height, &channels, STBI_rgb_alpha); + + return loadedPic; + }); + return {}; +} + +void ImguiStateTexture::invalidate() +{ + if (imguiDriver) + { + std::string path = hostfs::getSavestatePath(config::SavestateSlot, false); + imguiDriver->deleteTexture(path); + } +} + +std::array ImguiVmuTexture::Vmus { 0, 1, 2, 3, 4, 5, 6, 7 }; +constexpr float VMU_WIDTH = 96.f; +constexpr float VMU_HEIGHT = 64.f; +constexpr float VMU_PADDING = 8.f; + +ImTextureID ImguiVmuTexture::getId() +{ + if (!vmu_lcd_status[index]) + return {}; + if (idPath.empty()) + idPath = ":vmu:" + std::to_string(index); + ImTextureID texid = imguiDriver->getTexture(idPath); + if (texid == ImTextureID() || vmuLastChanged != ::vmuLastChanged[index]) + { + try { + texid = imguiDriver->updateTexture(idPath, (const u8 *)vmu_lcd_data[index], 48, 32, true); + vmuLastChanged = ::vmuLastChanged[index]; + } catch (...) { + } + } + return texid; +} + +void ImguiVmuTexture::displayVmus(const ImVec2& pos) +{ + const ScaledVec2 size(VMU_WIDTH, VMU_HEIGHT); + const float padding = uiScaled(VMU_PADDING); + ImDrawList *dl = ImGui::GetForegroundDrawList(); + ImVec2 cpos(pos + ScaledVec2(2.f, 0)); // 96 pixels wide + 2 * 2 -> 100 + for (int i = 0; i < 8; i++) + { + if (!vmu_lcd_status[i]) + continue; + + ImTextureID texid = Vmus[i].getId(); + if (texid == ImTextureID()) + continue; + ImVec2 pos_b = cpos + size; + dl->AddImage(texid, cpos, pos_b, ImVec2(0, 1), ImVec2(1, 0), 0x80ffffff); + cpos.y += size.y + padding; + } +} + +// Custom version of ImGui::BeginListBox that allows passing window flags +bool BeginListBox(const char* label, const ImVec2& size_arg, ImGuiWindowFlags windowFlags) +{ + using namespace ImGui; + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + // Size default to hold ~7.25 items. + // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. + ImVec2 size = ImTrunc(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); + ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); + ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + g.NextItemData.ClearFlags(); + + if (!IsRectVisible(bb.Min, bb.Max)) + { + ItemSize(bb.GetSize(), style.FramePadding.y); + ItemAdd(bb, 0, &frame_bb); + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + // FIXME-OPT: We could omit the BeginGroup() if label_size.x == 0.0f but would need to omit the EndGroup() as well. + BeginGroup(); + if (label_size.x > 0.0f) + { + ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); + RenderText(label_pos, label); + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + } + + BeginChild(id, frame_bb.GetSize(), ImGuiChildFlags_FrameStyle, windowFlags); + return true; +} + +void Toast::show(const std::string& title, const std::string& message, u32 durationMs) +{ + const u64 now = getTimeMs(); + std::lock_guard _{mutex}; + // no start anim if still visible + if (now > endTime + END_ANIM_TIME) + startTime = getTimeMs(); + endTime = now + durationMs; + this->title = title; + this->message = message; +} + +bool Toast::draw() +{ + const u64 now = getTimeMs(); + std::lock_guard _{mutex}; + if (now > endTime + END_ANIM_TIME) { + title.clear(); + message.clear(); + } + if (title.empty() && message.empty()) + return false; + float alpha = 1.f; + if (now > endTime) + // Fade out + alpha = (std::cos((now - endTime) / (float)END_ANIM_TIME * (float)M_PI) + 1.f) / 2.f; + + const ImVec2 displaySize(ImGui::GetIO().DisplaySize); + const float maxW = std::min(uiScaled(640.f), displaySize.x); + ImFont *regularFont = ImGui::GetFont(); + const ImVec2 titleSize = title.empty() ? ImVec2() + : largeFont->CalcTextSizeA(largeFont->FontSize, FLT_MAX, maxW, &title.front(), &title.back() + 1); + const ImVec2 msgSize = message.empty() ? ImVec2() + : regularFont->CalcTextSizeA(regularFont->FontSize, FLT_MAX, maxW, &message.front(), &message.back() + 1); + const ScaledVec2 padding(5.f, 4.f); + const ScaledVec2 spacing(0.f, 2.f); + ImVec2 totalSize(std::max(titleSize.x, msgSize.x), titleSize.y + msgSize.y); + totalSize += padding * 2.f + spacing * (float)(!title.empty() && !message.empty()); + + ImVec2 pos(insetLeft, displaySize.y - totalSize.y); + if (now - startTime < START_ANIM_TIME) + // Slide up + pos.y += totalSize.y * (std::cos((now - startTime) / (float)START_ANIM_TIME * (float)M_PI) + 1.f) / 2.f; + ImDrawList *dl = ImGui::GetForegroundDrawList(); + const ImU32 bg_col = alphaOverride(ImGui::GetColorU32(ImGuiCol_WindowBg), alpha / 2.f); + dl->AddRectFilled(pos, pos + totalSize, bg_col, 0.f); + const ImU32 col = alphaOverride(ImGui::GetColorU32(ImGuiCol_Border), alpha); + dl->AddRect(pos, pos + totalSize, col, 0.f); + + pos += padding; + if (!title.empty()) + { + const ImU32 col = alphaOverride(ImGui::GetColorU32(ImGuiCol_Text), alpha); + dl->AddText(largeFont, largeFont->FontSize, pos, col, &title.front(), &title.back() + 1, maxW); + pos.y += spacing.y + titleSize.y; + } + if (!message.empty()) + { + const ImU32 col = alphaOverride(0xFF00FFFF, alpha); // yellow + dl->AddText(regularFont, regularFont->FontSize, pos, col, &message.front(), &message.back() + 1, maxW); + } + + return true; +} + +std::string middleEllipsis(const std::string& s, float width) +{ + float tw = ImGui::CalcTextSize(s.c_str()).x; + if (tw <= width) + return s; + std::string ellipsis; + char buf[5]; + ImTextCharToUtf8(buf, ImGui::GetFont()->EllipsisChar); + for (int i = 0; i < ImGui::GetFont()->EllipsisCharCount; i++) + ellipsis += buf; + + int l = s.length() / 2; + int d = l; + + while (true) + { + std::string ss = s.substr(0, l / 2) + ellipsis + s.substr(s.length() - l / 2 - (l & 1)); + tw = ImGui::CalcTextSize(ss.c_str()).x; + if (tw == width) + return ss; + d /= 2; + if (d == 0) + return ss; + if (tw > width) + l -= d; + else + l += d; + } +} diff --git a/core/ui/gui_util.h b/core/ui/gui_util.h new file mode 100644 index 000000000..02520f77f --- /dev/null +++ b/core/ui/gui_util.h @@ -0,0 +1,316 @@ +/* + Copyright 2019 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#pragma once + +#include "types.h" +#include "cfg/option.h" +#include "imgui.h" +#include "imgui_internal.h" +#include "gui.h" +#include "emulator.h" +#include "oslib/oslib.h" + +#include +#include +#include +#include +#include + +typedef bool (*StringCallback)(bool cancelled, std::string selection); + +void select_file_popup(const char *prompt, StringCallback callback, + bool selectFile = false, const std::string& extension = ""); + +void scrollWhenDraggingOnVoid(ImGuiMouseButton mouse_button = ImGuiMouseButton_Left); + +IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 7800 CJK Unified Ideographs from General Standard Chinese Characters +IMGUI_API const ImWchar* GetGlyphRangesChineseTraditionalOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 4700 CJK Unified Ideographs from Hong Kong's List of Graphemes of Commonly-Used Chinese Characters + +// Helper to display a little (?) mark which shows a tooltip when hovered. +void ShowHelpMarker(const char* desc); +template +bool OptionCheckbox(const char *name, config::Option& option, const char *help = nullptr); +template +bool OptionSlider(const char *name, config::Option& option, int min, int max, const char *help = nullptr, const char *format = nullptr); +template +bool OptionRadioButton(const char *name, config::Option& option, T value, const char *help = nullptr); +void OptionComboBox(const char *name, config::Option& option, const char *values[], int count, + const char *help = nullptr); +bool OptionArrowButtons(const char *name, config::Option& option, int min, int max, const char *help = nullptr, const char *format = "%d"); + +static inline void centerNextWindow() +{ + ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x / 2.f, ImGui::GetIO().DisplaySize.y / 2.f), + ImGuiCond_Always, ImVec2(0.5f, 0.5f)); +} + +void fullScreenWindow(bool modal); +void windowDragScroll(); + +class BackgroundGameLoader +{ +public: + void load(const std::string& path) + { + progress.reset(); + future = std::async(std::launch::async, [this, path] { + ThreadName _("GameLoader"); + emu.loadGame(path.c_str(), &progress); + }); + } + + void cancel() + { + if (progress.cancelled) + return; + progress.cancelled = true; + if (future.valid()) + try { + future.get(); + } catch (const FlycastException&) { + } + emu.unloadGame(); + gui_setState(GuiState::Main); + } + + bool ready() + { + if (!future.valid()) + return true; + if (future.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + future.get(); + return true; + } + return false; + } + + const LoadProgress& getProgress() const { + return progress; + } + +private: + LoadProgress progress; + std::future future; +}; + +static inline float uiScaled(float f) { + return f * settings.display.uiScale; +} + +struct ScaledVec2 : public ImVec2 +{ + ScaledVec2() + : ImVec2() {} + ScaledVec2(float x, float y) + : ImVec2(uiScaled(x), uiScaled(y)) {} +}; + +inline static ImVec2 min(const ImVec2& l, const ImVec2& r) { + return ImVec2(std::min(l.x, r.x), std::min(l.y, r.y)); +} + +class DisabledScope +{ +public: + DisabledScope(bool disabled) : disabled(disabled) + { + if (disabled) + { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); + } + } + ~DisabledScope() + { + if (disabled) + { + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + } + } + bool isDisabled() const { + return disabled; + } + +private: + bool disabled; +}; + +bool BeginListBox(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiWindowFlags windowFlags = 0); + +class ImguiID +{ +public: + ImguiID(const std::string& id) + : ImguiID(id.c_str()) {} + ImguiID(const char *id) { + ImGui::PushID(id); + } + ~ImguiID() { + ImGui::PopID(); + } +}; + +class ImguiStyleVar +{ +public: + ImguiStyleVar(ImGuiStyleVar idx, const ImVec2& val) { + ImGui::PushStyleVar(idx, val); + } + ImguiStyleVar(ImGuiStyleVar idx, float val) { + ImGui::PushStyleVar(idx, val); + } + ~ImguiStyleVar() { + ImGui::PopStyleVar(); + } +}; + +class ImguiStyleColor +{ +public: + ImguiStyleColor(ImGuiCol idx, const ImVec4& col) { + ImGui::PushStyleColor(idx, col); + } + ImguiStyleColor(ImGuiCol idx, ImU32 col) { + ImGui::PushStyleColor(idx, col); + } + ~ImguiStyleColor() { + ImGui::PopStyleColor(); + } +}; + +class ImguiTexture +{ +public: + void draw(const ImVec2& size, const ImVec4& tint_col = ImVec4(1, 1, 1, 1), + const ImVec4& border_col = ImVec4(0, 0, 0, 0)); + void draw(ImDrawList *drawList, const ImVec2& pos, const ImVec2& size, float alpha); + void draw(ImDrawList *drawList, const ImVec2& pos, const ImVec2& size, + const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& color = ImVec4(1, 1, 1, 1)); + bool button(const char* str_id, const ImVec2& image_size, const std::string& title = {}, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), + const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); + + operator ImTextureID() { + return getId(); + } + void setNearestSampling(bool nearestSampling) { + this->nearestSampling = nearestSampling; + } + + virtual ImTextureID getId() = 0; + virtual ~ImguiTexture() = default; + +protected: + bool nearestSampling = false; +}; + +class ImguiFileTexture : public ImguiTexture +{ +public: + ImguiFileTexture() = default; + ImguiFileTexture(const std::string& path) : ImguiTexture(), path(path) {} + + bool operator==(const ImguiFileTexture& other) const { + return other.path == path; + } + ImTextureID getId() override; + + static void resetLoadCount() { + textureLoadCount = 0; + } + +private: + std::string path; + static int textureLoadCount; +}; + +class ImguiStateTexture : public ImguiTexture +{ +public: + ImTextureID getId() override; + + bool exists(); + void invalidate(); + +private: + struct LoadedPic + { + u8 *data; + int width; + int height; + }; + static std::future asyncLoad; +}; + +class ImguiVmuTexture : public ImguiTexture +{ +public: + ImguiVmuTexture(int index = 0) : index(index) {} + + // draw all active vmus in a single column at the given position + static void displayVmus(const ImVec2& pos); + ImTextureID getId() override; + +private: + int index = 0; + std::string idPath; + u64 vmuLastChanged = 0; + + static std::array Vmus; +}; + +static inline bool iconButton(const char *icon, const std::string& label, const ImVec2& size = {}) +{ + ImguiStyleVar _{ImGuiStyleVar_ButtonTextAlign, ImVec2(0.f, 0.5f)}; // left aligned + std::string s(5 + label.size(), '\0'); + s.resize(sprintf(s.data(), "%s %s", icon, label.c_str())); + return ImGui::Button(s.c_str(), size); +} + +static inline float iconButtonWidth(const char *icon, const std::string& label) +{ + // TODO avoid doing stuff twice + std::string s(5 + label.size(), '\0'); + s.resize(sprintf(s.data(), "%s %s", icon, label.c_str())); + return ImGui::CalcTextSize(s.c_str()).x + ImGui::GetStyle().FramePadding.x * 2; +} + +static inline ImU32 alphaOverride(ImU32 color, float alpha) { + return (color & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); +} + +class Toast +{ +public: + void show(const std::string& title, const std::string& message, u32 durationMs); + bool draw(); + +private: + static constexpr u64 START_ANIM_TIME = 500; + static constexpr u64 END_ANIM_TIME = 1000; + + std::string title; + std::string message; + u64 startTime = 0; + u64 endTime = 0; + std::mutex mutex; +}; + +std::string middleEllipsis(const std::string& s, float width); diff --git a/core/rend/imgui_driver.h b/core/ui/imgui_driver.h similarity index 73% rename from core/rend/imgui_driver.h rename to core/ui/imgui_driver.h index f84f823cc..bc60b3a25 100644 --- a/core/rend/imgui_driver.h +++ b/core/ui/imgui_driver.h @@ -17,10 +17,11 @@ along with Flycast. If not, see . */ #pragma once -#include "imgui/imgui.h" +#include "imgui.h" #include "gui.h" #include #include +#include class ImGuiDriver { @@ -30,36 +31,43 @@ class ImGuiDriver } virtual ~ImGuiDriver() = default; + virtual void reset() { + aspectRatios.clear(); + } + virtual void newFrame() = 0; virtual void renderDrawData(ImDrawData* drawData, bool gui_open) = 0; - virtual void displayVmus() {} - virtual void displayCrosshairs() {} - virtual void present() = 0; virtual void setFrameRendered() {} virtual ImTextureID getTexture(const std::string& name) = 0; - virtual ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height) = 0; + virtual ImTextureID updateTexture(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) = 0; + virtual void deleteTexture(const std::string& name) = 0; - ImTextureID updateTextureAndAspectRatio(const std::string& name, const u8 *data, int width, int height) + ImTextureID updateTextureAndAspectRatio(const std::string& name, const u8 *data, int width, int height, bool nearestSampling) { - ImTextureID textureId = updateTexture(name, data, width, height); + ImTextureID textureId = updateTexture(name, data, width, height, nearestSampling); if (textureId != ImTextureID()) aspectRatios[textureId] = (float)width / height; return textureId; } - float getAspectRatio(ImTextureID textureId) { + float getAspectRatio(ImTextureID textureId) + { auto it = aspectRatios.find(textureId); if (it != aspectRatios.end()) return it->second; else - return 1; + return 1.f; + } + void updateAspectRatio(ImTextureID textureId, float aspectRatio) { + if (textureId != ImTextureID()) + aspectRatios[textureId] = aspectRatio; } private: - std::unordered_map aspectRatios; + std::unordered_map aspectRatios; // TODO move this out }; extern std::unique_ptr imguiDriver; diff --git a/core/rend/mainui.cpp b/core/ui/mainui.cpp similarity index 91% rename from core/rend/mainui.cpp rename to core/ui/mainui.cpp index b5b174be7..4b1ad55b5 100644 --- a/core/rend/mainui.cpp +++ b/core/ui/mainui.cpp @@ -34,21 +34,16 @@ static bool mainui_enabled; u32 MainFrameCount; static bool forceReinit; -void UpdateInputState(); - bool mainui_rend_frame() { FC_PROFILE_SCOPE; os_DoEvents(); - UpdateInputState(); + os_UpdateInputState(); - if (gui_is_open() || gui_state == GuiState::VJoyEdit) + if (gui_is_open()) { gui_display_ui(); - // TODO refactor android vjoy out of renderer - if (gui_state == GuiState::VJoyEdit && renderer != nullptr) - renderer->DrawOSD(true); #ifndef TARGET_IPHONE std::this_thread::sleep_for(std::chrono::milliseconds(16)); #endif @@ -83,9 +78,11 @@ void mainui_term() rend_term_renderer(); } -void mainui_loop() +void mainui_loop(bool forceStart) { - mainui_enabled = true; + ThreadName _("Flycast-rend"); + if (forceStart) + mainui_enabled = true; mainui_init(); RenderType currentRenderer = config::RendererType; @@ -117,6 +114,11 @@ void mainui_loop() mainui_term(); } +void mainui_start() +{ + mainui_enabled = true; +} + void mainui_stop() { mainui_enabled = false; diff --git a/core/rend/mainui.h b/core/ui/mainui.h similarity index 93% rename from core/rend/mainui.h rename to core/ui/mainui.h index b8183d084..f2bfb60de 100644 --- a/core/rend/mainui.h +++ b/core/ui/mainui.h @@ -24,6 +24,7 @@ extern u32 MainFrameCount; bool mainui_rend_frame(); void mainui_init(); void mainui_term(); -void mainui_loop(); +void mainui_loop(bool forceStart = true); +void mainui_start(); void mainui_stop(); void mainui_reinit(); diff --git a/core/ui/vgamepad.cpp b/core/ui/vgamepad.cpp new file mode 100644 index 000000000..adf0f5ea4 --- /dev/null +++ b/core/ui/vgamepad.cpp @@ -0,0 +1,953 @@ +/* + Copyright 2019 flyinghead + + This file is part of reicast. + + reicast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + reicast 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 reicast. If not, see . + */ +#if defined(__ANDROID__) || defined(TARGET_IPHONE) + +#include "vgamepad.h" +#include "gui.h" +#include "stdclass.h" +#include "imgui.h" +#include "rend/osd.h" +#include "imgui_driver.h" +#include "input/gamepad.h" +#include "input/gamepad_device.h" +#include "oslib/storage.h" +#include "oslib/resources.h" +#include "cfg/cfg.h" +#include "input/gamepad.h" +#include "input/mouse.h" +#include "hw/naomi/naomi_cart.h" +#include "hw/naomi/card_reader.h" +#include "hw/maple/maple_devs.h" +#include + +namespace vgamepad +{ +static void stopEditing(bool canceled); +static void loadLayout(); + +struct Control +{ + Control() = default; + Control(float x, float y, float w = 64.f, float h = 64.f) + : pos(x, y), size(w, h), uv0(0, 0), uv1(1, 1) {} + + ImVec2 pos; + ImVec2 size; + ImVec2 uv0; + ImVec2 uv1; + bool disabled = false; +}; +static Control Controls[_Count]; +static bool Visible = true; +static bool serviceMode; +static float AlphaTrans = 1.f; +static ImVec2 StickPos; // analog stick position [-1, 1] +constexpr char const *BTN_PATH = "picture/buttons.png"; +constexpr char const *BTN_PATH_ARCADE = "picture/buttons-arcade.png"; +constexpr char const *CFG_SECTION = "vgamepad"; + +void displayCommands() +{ + draw(); + centerNextWindow(); + + ImGui::Begin("##vgamepad", NULL, ImGuiWindowFlags_NoDecoration); + + if (ImGui::Button("Save", ScaledVec2(150, 50))) + { + stopEditing(false); + gui_setState(GuiState::Settings); + } + ImGui::SameLine(); + if (ImGui::Button("Reset", ScaledVec2(150, 50))) + { + resetEditing(); + startEditing(); + gui_setState(GuiState::VJoyEdit); + } + + ImGui::SameLine(); + if (ImGui::Button("Cancel", ScaledVec2(150, 50))) + { + stopEditing(true); + gui_setState(GuiState::Settings); + } + ImGui::End(); +} + +static const char *getButtonsResPath() { + return settings.platform.isConsole() ? BTN_PATH : BTN_PATH_ARCADE; +} + +static const char *getButtonsCfgName() { + return settings.platform.isConsole() ? "image" : "image_arcade"; +} + +static bool loadOSDButtons(const std::string& path) +{ + if (path.empty()) + return false; + FILE *file = hostfs::storage().openFile(path, "rb"); + if (file == nullptr) + return false; + + stbi_set_flip_vertically_on_load(1); + int width, height, n; + u8 *image_data = stbi_load_from_file(file, &width, &height, &n, STBI_rgb_alpha); + std::fclose(file); + if (image_data == nullptr) + return false; + try { + imguiDriver->updateTexture(getButtonsResPath(), image_data, width, height, false); + } catch (...) { + // vulkan can throw during resizing + } + free(image_data); + + return true; +} + +static ImTextureID loadOSDButtons() +{ + ImTextureID id{}; + // custom image + std::string path = cfgLoadStr(CFG_SECTION, getButtonsCfgName(), ""); + if (loadOSDButtons(path)) + return id; + if (settings.platform.isConsole()) + { + // legacy buttons.png in data folder + if (loadOSDButtons(get_readonly_data_path("buttons.png"))) + return id; + // also try the home folder (android) + if (loadOSDButtons(get_readonly_config_path("buttons.png"))) + return id; + } + // default in resource + size_t size; + std::unique_ptr data = resource::load(getButtonsResPath(), size); + stbi_set_flip_vertically_on_load(1); + int width, height, n; + u8 *image_data = stbi_load_from_memory(data.get(), (int)size, &width, &height, &n, STBI_rgb_alpha); + if (image_data != nullptr) + { + try { + id = imguiDriver->updateTexture(getButtonsResPath(), image_data, width, height, false); + } catch (...) { + // vulkan can throw during resizing + } + free(image_data); + } + return id; +} + +ImTextureID ImguiVGamepadTexture::getId() +{ + ImTextureID id = imguiDriver->getTexture(getButtonsResPath()); + if (id == ImTextureID()) + id = loadOSDButtons(); + + return id; +} + +constexpr float vjoy_tex[_Count][4] = { + // L + { 0, 0, 64, 64 }, + // U + { 64, 0, 64, 64 }, + // R + { 128, 0, 64, 64 }, + // D + { 192, 0, 64, 64 }, + // Y, btn3 + { 256, 0, 64, 64 }, + // X, btn2 + { 320, 0, 64, 64 }, + // B, btn1 + { 384, 0, 64, 64 }, + // A, btn0 + { 448, 0, 64, 64 }, + + // Start + { 0, 64, 64, 64 }, + // LT + { 64, 64, 90, 64 }, + // RT + { 154, 64, 90, 64 }, + // Analog + { 244, 64, 128, 128 }, + // Stick + { 372, 64, 64, 64 }, + // Fast forward + { 436, 64, 64, 64 }, + + // C, btn4 + { 0, 128, 64, 64 }, + // Z, btn5 + { 64, 128, 64, 64 }, + + // service mode + { 0, 192, 64, 64 }, + // insert card + { 64, 192, 64, 64 }, + + // Special controls + // service + { 128, 128, 64, 64 }, + // coin + { 384, 128, 64, 64 }, + // test + { 448, 128, 64, 64 }, +}; + +static ImVec2 coinUV0, coinUV1; +static ImVec2 serviceUV0, serviceUV1; +static ImVec2 testUV0, testUV1; + +constexpr float OSD_TEX_W = 512.f; +constexpr float OSD_TEX_H = 256.f; + +static void setUV() +{ + int i = 0; + + for (auto& control : Controls) + { + control.uv0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + control.uv0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + control.uv1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + control.uv1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + if (i >= _VisibleCount) + break; + } + serviceUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + serviceUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + serviceUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + serviceUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + coinUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + coinUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + coinUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + coinUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + testUV0.x = (vjoy_tex[i][0] + 1) / OSD_TEX_W; + testUV0.y = 1.f - (vjoy_tex[i][1] + 1) / OSD_TEX_H; + testUV1.x = (vjoy_tex[i][0] + vjoy_tex[i][2] - 1) / OSD_TEX_W; + testUV1.y = 1.f - (vjoy_tex[i][1] + vjoy_tex[i][3] - 1) / OSD_TEX_H; + i++; + +} +static OnLoad _(&setUV); + +void show() { + Visible = true; +} + +void hide() { + Visible = false; +} + +ControlId hitTest(float x, float y) +{ + for (const auto& control : Controls) + if (!control.disabled + && x >= control.pos.x && x < control.pos.x + control.size.x + && y >= control.pos.y && y < control.pos.y + control.size.y) + return static_cast(&control - &Controls[0]); + return None; +} + +static u32 buttonMap[_Count] { + DC_DPAD_LEFT, + DC_DPAD_UP, + DC_DPAD_RIGHT, + DC_DPAD_DOWN, + DC_BTN_X, + DC_BTN_Y, + DC_BTN_B, + DC_BTN_A, + DC_BTN_START, + DC_AXIS_LT, + DC_AXIS_RT, + 0, // not used: analog area + 0, // not used: analog stick + EMU_BTN_FFORWARD, + DC_BTN_Y, // button 4 + DC_BTN_Z, // button 5 + EMU_BTN_SRVMODE, + DC_BTN_INSERT_CARD, + DC_DPAD_LEFT | DC_DPAD_UP, + DC_DPAD_RIGHT | DC_DPAD_UP, + DC_DPAD_LEFT | DC_DPAD_DOWN, + DC_DPAD_RIGHT | DC_DPAD_DOWN, +}; + +void setButtonMap() +{ + const bool arcade = settings.platform.isArcade(); + if (serviceMode) + { + buttonMap[A] = DC_BTN_D; + buttonMap[B] = DC_DPAD2_UP; + buttonMap[X] = DC_DPAD2_DOWN; + } + else + { + buttonMap[A] = DC_BTN_A; + buttonMap[B] = DC_BTN_B; + buttonMap[X] = arcade ? DC_BTN_C : DC_BTN_X; + } + buttonMap[Y] = arcade ? DC_BTN_X : DC_BTN_Y; +} + +u32 controlToDcKey(ControlId control) +{ + if (control >= Left && control < _Count) + return buttonMap[control]; + else + return 0; +} + +void setAnalogStick(float x, float y) { + StickPos.x = x; + StickPos.y = y; +} + +float getControlWidth(ControlId control) { + return Controls[control].size.x; +} + +void toggleServiceMode() +{ + serviceMode = !serviceMode; + if (serviceMode) + { + Controls[A].disabled = false; + Controls[B].disabled = false; + Controls[X].disabled = false; + setButtonMap(); + } + else { + startGame(); + } +} + +static void drawButtonDim(ImDrawList *drawList, const Control& control, int state) +{ + if (control.disabled) + return; + float scale_h = settings.display.height / 480.f; + float offs_x = (settings.display.width - scale_h * 640.f) / 2.f; + ImVec2 pos = control.pos * scale_h; + ImVec2 size = control.size * scale_h; + pos.x += offs_x; + ControlId controlId = static_cast(&control - &Controls[0]); + if (controlId == AnalogStick) + pos += StickPos * size; + + float col = (0.5f - 0.25f * state / 255) * AlphaTrans; + float alpha = (100.f - config::VirtualGamepadTransparency) / 100.f * AlphaTrans; + ImVec4 color(col, col, col, alpha); + + const ImVec2* uv0 = &control.uv0; + const ImVec2* uv1 = &control.uv1; + if (serviceMode) + switch (controlId) + { + case A: + uv0 = &coinUV0; + uv1 = &coinUV1; + break; + case B: + uv0 = &serviceUV0; + uv1 = &serviceUV1; + break; + case X: + uv0 = &testUV0; + uv1 = &testUV1; + break; + default: + break; + } + + ImguiVGamepadTexture tex; + tex.draw(drawList, pos, size, *uv0, *uv1, color); +} + +static void drawButton(ImDrawList *drawList, const Control& control, bool state) { + drawButtonDim(drawList, control, state ? 0 : 255); +} + +void draw() +{ + if (Controls[Left].pos.x == 0.f) + { + loadLayout(); + if (Controls[Left].pos.x == 0.f) + // mark done + Controls[Left].pos.x = 1e-12f; + } + + ImDrawList *drawList = ImGui::GetBackgroundDrawList(); + drawButton(drawList, Controls[Left], kcode[0] & buttonMap[Left]); + drawButton(drawList, Controls[Up], kcode[0] & buttonMap[Up]); + drawButton(drawList, Controls[Right], kcode[0] & buttonMap[Right]); + drawButton(drawList, Controls[Down], kcode[0] & buttonMap[Down]); + + drawButton(drawList, Controls[X], kcode[0] & buttonMap[X]); + drawButton(drawList, Controls[Y], kcode[0] & buttonMap[Y]); + drawButton(drawList, Controls[B], kcode[0] & buttonMap[B]); + drawButton(drawList, Controls[A], kcode[0] & buttonMap[A]); + + drawButton(drawList, Controls[Start], kcode[0] & buttonMap[Start]); + + drawButtonDim(drawList, Controls[LeftTrigger], lt[0] >> 8); + + drawButtonDim(drawList, Controls[RightTrigger], rt[0] >> 8); + + drawButton(drawList, Controls[AnalogArea], true); + drawButton(drawList, Controls[AnalogStick], false); + + drawButton(drawList, Controls[FastForward], false); + + drawButton(drawList, Controls[Btn4], kcode[0] & buttonMap[Btn4]); + drawButton(drawList, Controls[Btn5], kcode[0] & buttonMap[Btn5]); + drawButton(drawList, Controls[ServiceMode], !serviceMode); + drawButton(drawList, Controls[InsertCard], kcode[0] & buttonMap[InsertCard]); + + AlphaTrans += ((float)Visible - AlphaTrans) / 2; +} + +static float getUIScale() { + // scale is 1.1 for a 320 dpi screen of height 750 + return 1.1f * 750.f / settings.display.height * settings.display.dpi / 320.f; +} + +struct LayoutElement +{ + const std::string name; + const float dx, dy; // default pos in dc coords, relative to sides (or middle if 0) + const float dw, dh; // default size in dc coords + + float x, y; // normalized coordinates [0, 1] + float w, h; // normalized coordinates [0, 1], scaled with uiScale + float scale; // user scale + + void load() + { + x = cfgLoadFloat(CFG_SECTION, name + "_x", x); + y = cfgLoadFloat(CFG_SECTION, name + "_y", y); + scale = cfgLoadFloat(CFG_SECTION, name + "_scale", scale); + } + void save() const + { + cfgSaveFloat(CFG_SECTION, name + "_x", x); + cfgSaveFloat(CFG_SECTION, name + "_y", y); + cfgSaveFloat(CFG_SECTION, name + "_scale", scale); + } + + bool hitTest(float nx, float ny) const { + return nx >= x && nx < x + w * scale + && ny >= y && ny < y + h * scale; + } + + void applyUiScale() + { + const float dcw = 480.f * (float)settings.display.width / settings.display.height; + const float uiscale = getUIScale(); + w = dw / dcw * uiscale; + h = dh / 480.f * uiscale; + } + + void reset() + { + applyUiScale(); + scale = 1.f; + const float dcw = 480.f * (float)settings.display.width / settings.display.height; + const float uiscale = getUIScale(); + if (dx == 0) + x = 0.5f - w / 2; + else if (dx > 0) + x = dx / dcw * uiscale; + else + x = 1.f - w + dx / dcw * uiscale; + if (dy == 0) + y = 0.5f - h / 2; + else if (dy > 0) + y = dy / 480.f * uiscale; + else + y = 1.f - h + dy / 480.f * uiscale; + } +}; +static LayoutElement Layout[] { + { "dpad", 32.f, -24.f, 192.f, 192.f }, + { "buttons", -24.f, -24.f, 192.f, 192.f }, + { "start", 0.f, -24.f, 64.f, 64.f }, + { "LT", -134.f,-240.f, 90.f, 64.f }, + { "RT", -32.f,-240.f, 90.f, 64.f }, + { "analog", 40.f,-320.f, 128.f, 128.f }, + { "fforward", -24.f, 24.f, 64.f, 64.f }, + + { "btn4", -24.f,-216.f, 64.f, 64.f }, + { "btn5", -152.f,-216.f, 64.f, 64.f }, + { "service", -24.f, 96.f, 64.f, 64.f }, + { "inscard", 40.f,-250.f, 64.f, 64.f }, +}; + +static void applyLayout() +{ + const float dcw = 480.f * (float)settings.display.width / settings.display.height; + const float dx = (dcw - 640.f) / 2; + const float uiscale = getUIScale(); + float x, y, scale; + + // DPad + x = Layout[Elem_DPad].x * dcw - dx; + y = Layout[Elem_DPad].y * 480.f; + scale = Layout[Elem_DPad].scale * uiscale; + Controls[Left].pos = { x + 0.f * scale, y + 64.f * scale }; + Controls[Up].pos = { x + 64.f * scale, y + 0.f * scale }; + Controls[Right].pos = { x + 128.f * scale, y + 64.f * scale }; + Controls[Down].pos = { x + 64.f * scale, y + 128.f * scale }; + for (int control = Left; control <= Down; control++) + Controls[control].size = { 64.f * scale, 64.f * scale }; + + Controls[LeftUp].pos = { x + 0.f * scale, y + 0.f * scale }; + Controls[LeftDown].pos = { x + 0.f * scale, y + 128.f * scale }; + Controls[RightUp].pos = { x + 128.f * scale, y + 0.f * scale }; + Controls[RightDown].pos = { x + 128.f * scale, y + 128.f * scale }; + for (int control = LeftUp; control <= RightDown; control++) + Controls[control].size = { 64.f * scale, 64.f * scale }; + + // Buttons + x = Layout[Elem_Buttons].x * dcw - dx; + y = Layout[Elem_Buttons].y * 480.f; + scale = Layout[Elem_Buttons].scale * uiscale; + Controls[X].pos = { x + 0.f * scale, y + 64.f * scale }; + Controls[Y].pos = { x + 64.f * scale, y + 0.f * scale }; + Controls[B].pos = { x + 128.f * scale, y + 64.f * scale }; + Controls[A].pos = { x + 64.f * scale, y + 128.f * scale }; + for (int control = X; control <= A; control++) + Controls[control].size = { 64.f * scale, 64.f * scale }; + + // Start + scale = Layout[Elem_Start].scale * uiscale; + Controls[Start].pos = { Layout[Elem_Start].x * dcw - dx, Layout[Elem_Start].y * 480.f }; + Controls[Start].size = { Layout[Elem_Start].dw * scale, Layout[Elem_Start].dh * scale }; + + // Left trigger + scale = Layout[Elem_LT].scale * uiscale; + Controls[LeftTrigger].pos = { Layout[Elem_LT].x * dcw - dx, Layout[Elem_LT].y * 480.f }; + Controls[LeftTrigger].size = { Layout[Elem_LT].dw * scale, Layout[Elem_LT].dh * scale }; + + // Right trigger + scale = Layout[Elem_RT].scale * uiscale; + Controls[RightTrigger].pos = { Layout[Elem_RT].x * dcw - dx, Layout[Elem_RT].y * 480.f }; + Controls[RightTrigger].size = { Layout[Elem_RT].dw * scale, Layout[Elem_RT].dh * scale }; + + // Analog + x = Layout[Elem_Analog].x * dcw - dx; + y = Layout[Elem_Analog].y * 480.f; + scale = Layout[Elem_Analog].scale * uiscale; + Controls[AnalogArea].pos = { x, y }; + Controls[AnalogArea].size = { Layout[Elem_Analog].dw * scale, Layout[Elem_Analog].dh * scale }; + Controls[AnalogStick].pos = { x + 32.f * scale, y + 32.f * scale }; + Controls[AnalogStick].size = { 64.f * scale, 64.f * scale }; + + // Fast forward + scale = Layout[Elem_FForward].scale * uiscale; + Controls[FastForward].pos = { Layout[Elem_FForward].x * dcw - dx, Layout[Elem_FForward].y * 480.f }; + Controls[FastForward].size = { Layout[Elem_FForward].dw * scale, Layout[Elem_FForward].dh * scale }; + + // ARCADE + // Button 4 + scale = Layout[Elem_Btn4].scale * uiscale; + Controls[Btn4].pos = { Layout[Elem_Btn4].x * dcw - dx, Layout[Elem_Btn4].y * 480.f }; + Controls[Btn4].size = { Layout[Elem_Btn4].dw * scale, Layout[Elem_Btn4].dh * scale }; + // Button 5 + scale = Layout[Elem_Btn5].scale * uiscale; + Controls[Btn5].pos = { Layout[Elem_Btn5].x * dcw - dx, Layout[Elem_Btn5].y * 480.f }; + Controls[Btn5].size = { Layout[Elem_Btn5].dw * scale, Layout[Elem_Btn5].dh * scale }; + + // Service Mode + scale = Layout[Elem_ServiceMode].scale * uiscale; + Controls[ServiceMode].pos = { Layout[Elem_ServiceMode].x * dcw - dx, Layout[Elem_ServiceMode].y * 480.f }; + Controls[ServiceMode].size = { Layout[Elem_ServiceMode].dw * scale, Layout[Elem_ServiceMode].dh * scale }; + + // Insert Card + scale = Layout[Elem_InsertCard].scale * uiscale; + Controls[InsertCard].pos = { Layout[Elem_InsertCard].x * dcw - dx, Layout[Elem_InsertCard].y * 480.f }; + Controls[InsertCard].size = { Layout[Elem_InsertCard].dw * scale, Layout[Elem_InsertCard].dh * scale }; +} + +void applyUiScale() { + for (auto& element : Layout) + element.applyUiScale(); +} + +static void loadLayout() +{ + for (auto& element : Layout) { + element.reset(); + element.load(); + } + applyLayout(); +} + +static void saveLayout() +{ + cfgSetAutoSave(false); + for (auto& element : Layout) + element.save(); + cfgSetAutoSave(false); +} + +static void resetLayout() +{ + for (auto& element : Layout) + element.reset(); + applyLayout(); +} + +Element layoutHitTest(float x, float y) +{ + for (const auto& element : Layout) + if (element.hitTest(x, y)) + return static_cast(&element - &Layout[0]); + return Elem_None; +} + +void translateElement(Element element, float dx, float dy) +{ + LayoutElement& e = Layout[element]; + e.x += dx; + e.y += dy; + applyLayout(); +} + +void scaleElement(Element element, float factor) +{ + LayoutElement& e = Layout[element]; + float dx = e.w * e.scale * (factor - 1.f) / 2.f; + float dy = e.h * e.scale * (factor - 1.f) / 2.f; + e.scale *= factor; + // keep centered + translateElement(element, -dx, -dy); +} + +void loadImage(const std::string& path) +{ + if (path.empty()) { + cfgSaveStr(CFG_SECTION, getButtonsCfgName(), ""); + loadOSDButtons(); + } + else if (loadOSDButtons(path)) { + cfgSaveStr(CFG_SECTION, getButtonsCfgName(), path); + } +} + +static void enableAllControls() +{ + for (auto& control : Controls) + control.disabled = false; +} + +static void disableControl(ControlId ctrlId) +{ +#ifdef TARGET_IPHONE + if (ctrlId == Up || ctrlId == Down) + // Needed to pause the emulator + return; +#endif + + Controls[ctrlId].disabled = true; + switch (ctrlId) + { + case Left: + Controls[LeftUp].disabled = true; + Controls[LeftDown].disabled = true; + break; + case Right: + Controls[RightUp].disabled = true; + Controls[RightDown].disabled = true; + break; + case Up: + Controls[LeftUp].disabled = true; + Controls[RightUp].disabled = true; + break; + case Down: + Controls[LeftDown].disabled = true; + Controls[RightDown].disabled = true; + break; + case AnalogArea: + case AnalogStick: + Controls[AnalogArea].disabled = true; + Controls[AnalogStick].disabled = true; + break; + default: + break; + } +} + +void startGame() +{ + enableAllControls(); + serviceMode = false; + setButtonMap(); + bool enableTouchMouse = false; + if (settings.platform.isConsole()) + { + disableControl(Btn4); + disableControl(Btn5); + disableControl(ServiceMode); + disableControl(InsertCard); + switch (config::MapleMainDevices[0]) + { + case MDT_LightGun: + enableTouchMouse = true; + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + disableControl(A); + disableControl(X); + disableControl(Y); + break; + case MDT_AsciiStick: + // TODO add CZ + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + break; + case MDT_PopnMusicController: + // TODO add C btn + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + break; + case MDT_RacingController: + disableControl(X); + disableControl(Y); + break; + default: + break; + } + } + else + { + // arcade game + if (!card_reader::readerAvailable()) + disableControl(InsertCard); + if (settings.platform.isAtomiswave()) { + disableControl(Btn5); + } + else if (settings.platform.isSystemSP()) + { + disableControl(Y); + disableControl(Btn4); + disableControl(Btn5); + } + if (NaomiGameInputs != nullptr) + { + bool fullAnalog = false; + bool rt = false; + bool lt = false; + for (const auto& axis : NaomiGameInputs->axes) + { + if (axis.name == nullptr) + break; + switch (axis.axis) + { + case 0: + case 1: + fullAnalog = true; + break; + case 4: + rt = true; + break; + case 5: + lt = true; + break; + } + } + if (!fullAnalog) + disableControl(AnalogArea); + if (!lt) + disableControl(LeftTrigger); + else + disableControl(Btn5); + if (!rt) + disableControl(RightTrigger); + else + disableControl(Btn4); + u32 usedButtons = 0; + for (const auto& button : NaomiGameInputs->buttons) + { + if (button.name == nullptr) + break; + usedButtons |= button.source; + } + if (settings.platform.isAtomiswave()) + { + // button order: A B X Y B4 + if ((usedButtons & AWAVE_BTN0_KEY) == 0 || settings.input.lightgunGame) + disableControl(A); + if ((usedButtons & AWAVE_BTN1_KEY) == 0) + disableControl(B); + if ((usedButtons & AWAVE_BTN2_KEY) == 0) + disableControl(X); + if ((usedButtons & AWAVE_BTN3_KEY) == 0) + disableControl(Y); + if ((usedButtons & AWAVE_BTN4_KEY) == 0) + disableControl(Btn4); + if ((usedButtons & AWAVE_UP_KEY) == 0) + disableControl(Up); + if ((usedButtons & AWAVE_DOWN_KEY) == 0) + disableControl(Down); + if ((usedButtons & AWAVE_LEFT_KEY) == 0) + disableControl(Left); + if ((usedButtons & AWAVE_RIGHT_KEY) == 0) + disableControl(Right); + if ((usedButtons & AWAVE_START_KEY) == 0) + disableControl(Start); + } + else if (settings.platform.isSystemSP()) + { + if ((usedButtons & DC_BTN_A) == 0) + disableControl(A); + if ((usedButtons & DC_BTN_B) == 0) + disableControl(B); + if ((usedButtons & DC_BTN_C) == 0) + disableControl(X); + if ((usedButtons & DC_DPAD_UP) == 0) + disableControl(Up); + if ((usedButtons & DC_DPAD_DOWN) == 0) + disableControl(Down); + if ((usedButtons & DC_DPAD_LEFT) == 0) + disableControl(Left); + if ((usedButtons & DC_DPAD_RIGHT) == 0) + disableControl(Right); + if ((usedButtons & DC_BTN_START) == 0) + disableControl(Start); + } + else + { + if ((usedButtons & NAOMI_BTN0_KEY) == 0 || settings.input.lightgunGame) + disableControl(A); + if ((usedButtons & (NAOMI_BTN1_KEY | NAOMI_RELOAD_KEY)) == 0) + disableControl(B); + else if (settings.input.lightgunGame + && (usedButtons & NAOMI_RELOAD_KEY) != 0 + && (usedButtons & NAOMI_BTN1_KEY) == 0) + // Remap button 1 to reload for lightgun games that need it + buttonMap[B] = DC_BTN_RELOAD; + if ((usedButtons & NAOMI_BTN2_KEY) == 0) + // C + disableControl(X); + if ((usedButtons & NAOMI_BTN3_KEY) == 0) + // X + disableControl(Y); + if ((usedButtons & NAOMI_BTN4_KEY) == 0) + // Y + disableControl(Btn4); + if ((usedButtons & NAOMI_BTN5_KEY) == 0) + // Z + disableControl(Btn5); + if ((usedButtons & NAOMI_UP_KEY) == 0) + disableControl(Up); + if ((usedButtons & NAOMI_DOWN_KEY) == 0) + disableControl(Down); + if ((usedButtons & NAOMI_LEFT_KEY) == 0) + disableControl(Left); + if ((usedButtons & NAOMI_RIGHT_KEY) == 0) + disableControl(Right); + if ((usedButtons & NAOMI_START_KEY) == 0) + disableControl(Start); + } + if (settings.input.lightgunGame) + enableTouchMouse = true; + } + else + { + if (settings.input.lightgunGame) + { + enableTouchMouse = true; + disableControl(A); + disableControl(X); + disableControl(Y); + disableControl(Btn4); + disableControl(Btn5); + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + disableControl(Up); + disableControl(Down); + disableControl(Left); + disableControl(Right); + } + else + { + // all analog games *should* have an input description + disableControl(AnalogArea); + disableControl(LeftTrigger); + disableControl(RightTrigger); + } + } + } + std::shared_ptr touchMouse = GamepadDevice::GetGamepad(); + if (touchMouse != nullptr) + { + if (enableTouchMouse) { + if (touchMouse->maple_port() == -1) + touchMouse->set_maple_port(0); + } + else { + if (touchMouse->maple_port() == 0) + touchMouse->set_maple_port(-1); + } + } +} + +void resetEditing() { + resetLayout(); +} + +void startEditing() +{ + enableAllControls(); + show(); + setEditMode(true); +} + +void pauseEditing() { + setEditMode(false); +} + +static void stopEditing(bool canceled) +{ + setEditMode(false); + if (canceled) + loadLayout(); + else + saveLayout(); +} + +} // namespace vgamepad + +#endif // __ANDROID__ || TARGET_IPHONE diff --git a/core/ui/vgamepad.h b/core/ui/vgamepad.h new file mode 100644 index 000000000..df5869802 --- /dev/null +++ b/core/ui/vgamepad.h @@ -0,0 +1,116 @@ +/* + Copyright 2019 flyinghead + + This file is part of reicast. + + reicast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + reicast 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 reicast. If not, see . + */ +#pragma once +#include "types.h" +#include "gui_util.h" + +namespace vgamepad +{ +enum ControlId +{ + None = -1, + Left, + Up, + Right, + Down, + X, + Y, + B, + A, + Start, + LeftTrigger, + RightTrigger, + AnalogArea, + AnalogStick, + FastForward, + + Btn4, + Btn5, + ServiceMode, + InsertCard, + + LeftUp, + RightUp, + LeftDown, + RightDown, + + _Count, + _VisibleCount = LeftUp, +}; + +enum Element +{ + Elem_None = -1, + Elem_DPad, + Elem_Buttons, + Elem_Start, + Elem_LT, + Elem_RT, + Elem_Analog, + Elem_FForward, + Elem_Btn4, + Elem_Btn5, + Elem_ServiceMode, + Elem_InsertCard, +}; + +class ImguiVGamepadTexture : public ImguiTexture +{ +public: + ImTextureID getId() override; +}; + +#if defined(__ANDROID__) || defined(TARGET_IPHONE) + +void show(); +void hide(); +void draw(); +void startEditing(); +void pauseEditing(); +void setEditMode(bool editing); +void resetEditing(); +void displayCommands(); +void loadImage(const std::string& path); +void startGame(); + +ControlId hitTest(float x, float y); +u32 controlToDcKey(ControlId control); +void setAnalogStick(float x, float y); +float getControlWidth(ControlId); +void toggleServiceMode(); + +void applyUiScale(); +Element layoutHitTest(float x, float y); +void translateElement(Element element, float dx, float dy); +void scaleElement(Element element, float factor); + +#else + +void show() {} +void hide() {} +void draw() {} +void startEditing() {} +void pauseEditing() {} +void displayCommands() {} +void applyUiScale() {} +void loadImage(const std::string& path) {} +void startGame() {} + +#endif +} // namespace vgamepad diff --git a/core/wsi/xgl.h b/core/util/shared_this.h similarity index 51% rename from core/wsi/xgl.h rename to core/util/shared_this.h index ac72b1c80..400f17c85 100644 --- a/core/wsi/xgl.h +++ b/core/util/shared_this.h @@ -1,7 +1,5 @@ /* - Created on: Oct 18, 2019 - - Copyright 2019 flyinghead + Copyright 2024 flyinghead This file is part of Flycast. @@ -19,28 +17,22 @@ along with Flycast. If not, see . */ #pragma once -#include -#include -#include -#include -#include "gl_context.h" +#include -class XGLGraphicsContext : public GLGraphicsContext +template +class SharedThis : public std::enable_shared_from_this { public: - ~XGLGraphicsContext() { term(); XFree(framebufferConfigs); } - - bool init(); - void term() override; - void swap(); - bool ChooseVisual(Display* x11Display, XVisualInfo** visual, int* depth); - -private: - GLXContext context; - GLXFBConfig* framebufferConfigs = nullptr; - PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT = nullptr; - int (*glXSwapIntervalMESA)(unsigned int interval) = nullptr; - bool swapOnVSync = false; -}; + using Ptr = std::shared_ptr; + + template + static Ptr create(Args&&... args) { + return Ptr(new T(std::forward(args)...)); + } -extern XGLGraphicsContext theGLContext; +protected: + using super = SharedThis; + + SharedThis() { + } +}; diff --git a/core/windows/clock.c b/core/windows/clock.c new file mode 100644 index 000000000..89b735406 --- /dev/null +++ b/core/windows/clock.c @@ -0,0 +1,287 @@ +// FIXME mingw-w64 commit https://sourceforge.net/p/mingw-w64/mingw-w64/ci/7b33798917a50cf023f1622eee8eba6d7874b796/ +// A constructor is now run to determine which win32 api is used for the CLOCK_REALTIME clock. +// But if a static variable calls clock_gettime in its constructor, it may call into a null function pointer. +// This is what happens with the discord-rpc library so until this is fixed, we stick to the working version. +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#if defined(__GNUC__) && !defined(__clang__) +#include +#include +#include +#include +#ifndef IN_WINPTHREAD +#define IN_WINPTHREAD 1 +#endif +#include "pthread.h" +#include "pthread_time.h" + +#define POW10_7 10000000 +#define POW10_9 1000000000 + +/* Number of 100ns-seconds between the beginning of the Windows epoch + * (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970) + */ +#define DELTA_EPOCH_IN_100NS INT64_C(116444736000000000) + +static WINPTHREADS_INLINE int lc_set_errno(int result) +{ + if (result != 0) { + errno = result; + return -1; + } + return 0; +} + +typedef void (WINAPI * GetSystemTimeAsFileTime_t)(LPFILETIME); +static GetSystemTimeAsFileTime_t GetSystemTimeAsFileTime_p /* = 0 */; + +static GetSystemTimeAsFileTime_t try_load_GetSystemPreciseTimeAsFileTime(void) +{ + /* Use GetSystemTimePreciseAsFileTime() if available (Windows 8 or later) */ + HMODULE mod = GetModuleHandle("kernel32.dll"); + GetSystemTimeAsFileTime_t get_time = NULL; + if (mod) + get_time = (GetSystemTimeAsFileTime_t)(intptr_t)GetProcAddress(mod, + "GetSystemTimePreciseAsFileTime"); /* <1us precision on Windows 10 */ + if (get_time == NULL) + get_time = GetSystemTimeAsFileTime; /* >15ms precision on Windows 10 */ + __atomic_store_n(&GetSystemTimeAsFileTime_p, get_time, __ATOMIC_RELAXED); + return get_time; +} + +static WINPTHREADS_INLINE GetSystemTimeAsFileTime_t load_GetSystemTimeBestAsFileTime(void) +{ + GetSystemTimeAsFileTime_t get_time = + __atomic_load_n(&GetSystemTimeAsFileTime_p, __ATOMIC_RELAXED); + if (get_time == NULL) + get_time = try_load_GetSystemPreciseTimeAsFileTime(); + return get_time; +} + +/** + * Get the resolution of the specified clock clock_id and + * stores it in the struct timespec pointed to by res. + * @param clock_id The clock_id argument is the identifier of the particular + * clock on which to act. The following clocks are supported: + *
+ *     CLOCK_REALTIME  System-wide real-time clock. Setting this clock
+ *                 requires appropriate privileges.
+ *     CLOCK_MONOTONIC Clock that cannot be set and represents monotonic
+ *                 time since some unspecified starting point.
+ *     CLOCK_PROCESS_CPUTIME_ID High-resolution per-process timer from the CPU.
+ *     CLOCK_THREAD_CPUTIME_ID  Thread-specific CPU-time clock.
+ * 
+ * @param res The pointer to a timespec structure to receive the time + * resolution. + * @return If the function succeeds, the return value is 0. + * If the function fails, the return value is -1, + * with errno set to indicate the error. + */ +int clock_getres(clockid_t clock_id, struct timespec *res) +{ + clockid_t id = clock_id; + + if (id == CLOCK_REALTIME && load_GetSystemTimeBestAsFileTime() == GetSystemTimeAsFileTime) + id = CLOCK_REALTIME_COARSE; /* GetSystemTimePreciseAsFileTime() not available */ + + switch(id) { + case CLOCK_REALTIME: + case CLOCK_MONOTONIC: + { + LARGE_INTEGER pf; + + if (QueryPerformanceFrequency(&pf) == 0) + return lc_set_errno(EINVAL); + + res->tv_sec = 0; + res->tv_nsec = (int) ((POW10_9 + (pf.QuadPart >> 1)) / pf.QuadPart); + if (res->tv_nsec < 1) + res->tv_nsec = 1; + + return 0; + } + + case CLOCK_REALTIME_COARSE: + case CLOCK_PROCESS_CPUTIME_ID: + case CLOCK_THREAD_CPUTIME_ID: + { + DWORD timeAdjustment, timeIncrement; + BOOL isTimeAdjustmentDisabled; + + (void) GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, &isTimeAdjustmentDisabled); + res->tv_sec = 0; + res->tv_nsec = timeIncrement * 100; + + return 0; + } + default: + break; + } + + return lc_set_errno(EINVAL); +} + +/** + * Get the time of the specified clock clock_id and stores it in the struct + * timespec pointed to by tp. + * @param clock_id The clock_id argument is the identifier of the particular + * clock on which to act. The following clocks are supported: + *
+ *     CLOCK_REALTIME  System-wide real-time clock. Setting this clock
+ *                 requires appropriate privileges.
+ *     CLOCK_MONOTONIC Clock that cannot be set and represents monotonic
+ *                 time since some unspecified starting point.
+ *     CLOCK_PROCESS_CPUTIME_ID High-resolution per-process timer from the CPU.
+ *     CLOCK_THREAD_CPUTIME_ID  Thread-specific CPU-time clock.
+ * 
+ * @param tp The pointer to a timespec structure to receive the time. + * @return If the function succeeds, the return value is 0. + * If the function fails, the return value is -1, + * with errno set to indicate the error. + */ +int clock_gettime(clockid_t clock_id, struct timespec *tp) +{ + unsigned __int64 t; + LARGE_INTEGER pf, pc; + union { + unsigned __int64 u64; + FILETIME ft; + } ct, et, kt, ut; + + switch(clock_id) { + case CLOCK_REALTIME: + { + load_GetSystemTimeBestAsFileTime()(&ct.ft); + t = ct.u64 - DELTA_EPOCH_IN_100NS; + tp->tv_sec = t / POW10_7; + tp->tv_nsec = ((int) (t % POW10_7)) * 100; + + return 0; + } + + case CLOCK_REALTIME_COARSE: + { + GetSystemTimeAsFileTime(&ct.ft); + t = ct.u64 - DELTA_EPOCH_IN_100NS; + tp->tv_sec = t / POW10_7; + tp->tv_nsec = ((int) (t % POW10_7)) * 100; + + return 0; + } + + case CLOCK_MONOTONIC: + { + if (QueryPerformanceFrequency(&pf) == 0) + return lc_set_errno(EINVAL); + + if (QueryPerformanceCounter(&pc) == 0) + return lc_set_errno(EINVAL); + + tp->tv_sec = pc.QuadPart / pf.QuadPart; + tp->tv_nsec = (int) (((pc.QuadPart % pf.QuadPart) * POW10_9 + (pf.QuadPart >> 1)) / pf.QuadPart); + if (tp->tv_nsec >= POW10_9) { + tp->tv_sec ++; + tp->tv_nsec -= POW10_9; + } + + return 0; + } + + case CLOCK_PROCESS_CPUTIME_ID: + { + if(0 == GetProcessTimes(GetCurrentProcess(), &ct.ft, &et.ft, &kt.ft, &ut.ft)) + return lc_set_errno(EINVAL); + t = kt.u64 + ut.u64; + tp->tv_sec = t / POW10_7; + tp->tv_nsec = ((int) (t % POW10_7)) * 100; + + return 0; + } + + case CLOCK_THREAD_CPUTIME_ID: + { + if(0 == GetThreadTimes(GetCurrentThread(), &ct.ft, &et.ft, &kt.ft, &ut.ft)) + return lc_set_errno(EINVAL); + t = kt.u64 + ut.u64; + tp->tv_sec = t / POW10_7; + tp->tv_nsec = ((int) (t % POW10_7)) * 100; + + return 0; + } + + default: + break; + } + + return lc_set_errno(EINVAL); +} + +/** + * Sleep for the specified time. + * @param clock_id This argument should always be CLOCK_REALTIME (0). + * @param flags 0 for relative sleep interval, others for absolute waking up. + * @param request The desired sleep interval or absolute waking up time. + * @param remain The remain amount of time to sleep. + * The current implemention just ignore it. + * @return If the function succeeds, the return value is 0. + * If the function fails, the return value is -1, + * with errno set to indicate the error. + */ +int clock_nanosleep(clockid_t clock_id, int flags, + const struct timespec *request, + struct timespec *remain) +{ + struct timespec tp; + + if (clock_id != CLOCK_REALTIME) + return lc_set_errno(EINVAL); + + if (flags == 0) + return nanosleep(request, remain); + + /* TIMER_ABSTIME = 1 */ + clock_gettime(CLOCK_REALTIME, &tp); + + tp.tv_sec = request->tv_sec - tp.tv_sec; + tp.tv_nsec = request->tv_nsec - tp.tv_nsec; + if (tp.tv_nsec < 0) { + tp.tv_nsec += POW10_9; + tp.tv_sec --; + } + + return nanosleep(&tp, remain); +} + +/** + * Set the time of the specified clock clock_id. + * @param clock_id This argument should always be CLOCK_REALTIME (0). + * @param tp The requested time. + * @return If the function succeeds, the return value is 0. + * If the function fails, the return value is -1, + * with errno set to indicate the error. + */ +int clock_settime(clockid_t clock_id, const struct timespec *tp) +{ + SYSTEMTIME st; + + union { + unsigned __int64 u64; + FILETIME ft; + } t; + + if (clock_id != CLOCK_REALTIME) + return lc_set_errno(EINVAL); + + t.u64 = tp->tv_sec * (__int64) POW10_7 + tp->tv_nsec / 100 + DELTA_EPOCH_IN_100NS; + if (FileTimeToSystemTime(&t.ft, &st) == 0) + return lc_set_errno(EINVAL); + + if (SetSystemTime(&st) == 0) + return lc_set_errno(EPERM); + + return 0; +} +#endif diff --git a/core/windows/fault_handler.cpp b/core/windows/fault_handler.cpp index f9dbbb4e2..babe160f8 100644 --- a/core/windows/fault_handler.cpp +++ b/core/windows/fault_handler.cpp @@ -27,31 +27,71 @@ static LONG (WINAPI *prevExceptionHandler)(EXCEPTION_POINTERS *ep); static void readContext(const EXCEPTION_POINTERS *ep, host_context_t &context) { -#if HOST_CPU == CPU_X86 - context.pc = ep->ContextRecord->Eip; - context.esp = ep->ContextRecord->Esp; - context.eax = ep->ContextRecord->Eax; - context.ecx = ep->ContextRecord->Ecx; -#elif HOST_CPU == CPU_X64 +#if defined(_M_AMD64) context.pc = ep->ContextRecord->Rip; context.rsp = ep->ContextRecord->Rsp; context.r9 = ep->ContextRecord->R9; context.rcx = ep->ContextRecord->Rcx; +#elif defined(_M_ARM) + context.pc = ep->ContextRecord->Pc; + context.reg[0] = ep->ContextRecord->R0; + context.reg[1] = ep->ContextRecord->R1; + context.reg[2] = ep->ContextRecord->R2; + context.reg[3] = ep->ContextRecord->R3; + context.reg[4] = ep->ContextRecord->R4; + context.reg[5] = ep->ContextRecord->R5; + context.reg[6] = ep->ContextRecord->R6; + context.reg[7] = ep->ContextRecord->R7; + context.reg[8] = ep->ContextRecord->R8; + context.reg[9] = ep->ContextRecord->R9; + context.reg[10] = ep->ContextRecord->R10; + context.reg[11] = ep->ContextRecord->R11; + context.reg[12] = ep->ContextRecord->R12; + context.reg[13] = ep->ContextRecord->Sp; + context.reg[14] = ep->ContextRecord->Lr; +#elif defined(_M_ARM64) + context.pc = ep->ContextRecord->Pc; + context.x0 = ep->ContextRecord->X0; +#elif defined(_M_IX86) + context.pc = ep->ContextRecord->Eip; + context.esp = ep->ContextRecord->Esp; + context.eax = ep->ContextRecord->Eax; + context.ecx = ep->ContextRecord->Ecx; #endif } static void writeContext(EXCEPTION_POINTERS *ep, const host_context_t &context) { -#if HOST_CPU == CPU_X86 - ep->ContextRecord->Eip = context.pc; - ep->ContextRecord->Esp = context.esp; - ep->ContextRecord->Eax = context.eax; - ep->ContextRecord->Ecx = context.ecx; -#elif HOST_CPU == CPU_X64 +#if defined(_M_AMD64) ep->ContextRecord->Rip = context.pc; ep->ContextRecord->Rsp = context.rsp; ep->ContextRecord->R9 = context.r9; ep->ContextRecord->Rcx = context.rcx; +#elif defined(_M_ARM) + ep->ContextRecord->Pc = context.pc; + ep->ContextRecord->R0 = context.reg[0]; + ep->ContextRecord->R1 = context.reg[1]; + ep->ContextRecord->R2 = context.reg[2]; + ep->ContextRecord->R3 = context.reg[3]; + ep->ContextRecord->R4 = context.reg[4]; + ep->ContextRecord->R5 = context.reg[5]; + ep->ContextRecord->R6 = context.reg[6]; + ep->ContextRecord->R7 = context.reg[7]; + ep->ContextRecord->R8 = context.reg[8]; + ep->ContextRecord->R9 = context.reg[9]; + ep->ContextRecord->R10 = context.reg[10]; + ep->ContextRecord->R11 = context.reg[11]; + ep->ContextRecord->R12 = context.reg[12]; + ep->ContextRecord->Sp = context.reg[13]; + ep->ContextRecord->Lr = context.reg[14]; +#elif defined(_M_ARM64) + ep->ContextRecord->Pc = context.pc; + ep->ContextRecord->X0 = context.x0; +#elif defined(_M_IX86) + ep->ContextRecord->Eip = context.pc; + ep->ContextRecord->Esp = context.esp; + ep->ContextRecord->Eax = context.eax; + ep->ContextRecord->Ecx = context.ecx; #endif } @@ -88,15 +128,17 @@ static LONG WINAPI exceptionHandler(EXCEPTION_POINTERS *ep) // texture protection in VRAM if (VramLockedWrite(address)) return EXCEPTION_CONTINUE_EXECUTION; +#if FEAT_SHREC == DYNAREC_JIT // FPCB jump table protection if (addrspace::bm_lockedWrite(address)) return EXCEPTION_CONTINUE_EXECUTION; +#endif host_context_t context; readContext(ep, context); #if FEAT_SHREC == DYNAREC_JIT // fast mem access rewriting - if (ngen_Rewrite(context, address)) + if (sh4Dynarec->rewrite(context, address)) { writeContext(ep, context); return EXCEPTION_CONTINUE_EXECUTION; @@ -129,18 +171,3 @@ void os_UninstallFaultHandler() #endif SetUnhandledExceptionFilter(prevExceptionHandler); } - -double os_GetSeconds() -{ - static double qpfd = []() { - LARGE_INTEGER qpf; - QueryPerformanceFrequency(&qpf); - return 1.0 / qpf.QuadPart; }(); - - LARGE_INTEGER time_now; - - QueryPerformanceCounter(&time_now); - static LARGE_INTEGER time_now_base = time_now; - - return (time_now.QuadPart - time_now_base.QuadPart) * qpfd; -} diff --git a/core/windows/rawinput.cpp b/core/windows/rawinput.cpp index fa2e18004..3414bde83 100644 --- a/core/windows/rawinput.cpp +++ b/core/windows/rawinput.cpp @@ -410,12 +410,9 @@ static void findDevices() deviceId = deviceId.substr(8); uniqueId = (device.dwType == RIM_TYPEMOUSE ? "raw_mouse_" : "raw_keyboard_") + deviceId; if (name.empty()) - { - name = deviceId; - if (name.length() > 17 && name.substr(0, 4) == "VID_" && name.substr(8, 5) == "&PID_") - name = name.substr(0, 17); - name = (device.dwType == RIM_TYPEMOUSE ? "Mouse " : "Keyboard ") + name; - } + name = device.dwType == RIM_TYPEMOUSE ? "Mouse" : "Keyboard"; + size_t hash = deviceId.find('#'); + name += " [" + deviceId.substr(0, hash) + "]"; } } uintptr_t handle = (uintptr_t)device.hDevice; diff --git a/core/windows/rawinput.h b/core/windows/rawinput.h index 1577264ac..6406e350e 100644 --- a/core/windows/rawinput.h +++ b/core/windows/rawinput.h @@ -16,9 +16,9 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ +#pragma once #include "build.h" #ifndef TARGET_UWP -#include "input/gamepad_device.h" #include "input/keyboard_device.h" #include "input/mouse.h" #include diff --git a/core/windows/unwind_info.cpp b/core/windows/unwind_info.cpp index c27b83a66..e3fb71b26 100644 --- a/core/windows/unwind_info.cpp +++ b/core/windows/unwind_info.cpp @@ -19,8 +19,8 @@ */ // Based on Asmjit unwind info registration and stack walking code for Windows, Linux and macOS // https://gist.github.com/dpjudas/925d5c4ffef90bd8114be3b465069fff -#ifdef _WIN64 -#include "oslib/oslib.h" +#include "oslib/unwind_info.h" +#ifdef _M_X64 #include #include #include @@ -58,9 +58,9 @@ void UnwindInfo::endProlog(u32 offset) codes.push_back(0); codes.push_back(0); std::reverse(codes.begin(), codes.end()); - codes[0] = 1 | (offset << 8); - codes[1] = (u8)codes.size() - 2; - if (codes.size() & 1) + codes[0] = 1 | (offset << 8); // version (1), flags (0) and prolog size (offset) + codes[1] = (u8)codes.size() - 2; // unwind codes count + if (codes.size() & 1) // table size must be even codes.push_back(0); } diff --git a/core/windows/win_keyboard.h b/core/windows/win_keyboard.h deleted file mode 100644 index 4897d6ebc..000000000 --- a/core/windows/win_keyboard.h +++ /dev/null @@ -1,151 +0,0 @@ -#pragma once -#include "input/keyboard_device.h" - -#include - -// Used to differentiate between main enter key and num keypad one -#define VK_NUMPAD_RETURN 0x0E - -class Win32KeyboardDevice : public KeyboardDevice -{ -public: - Win32KeyboardDevice(int maple_port) : KeyboardDevice(maple_port, "win32") - { - kb_map['A'] = 0x04; - kb_map['B'] = 0x05; - kb_map['C'] = 0x06; - kb_map['D'] = 0x07; - kb_map['E'] = 0x08; - kb_map['F'] = 0x09; - kb_map['G'] = 0x0A; - kb_map['H'] = 0x0B; - kb_map['I'] = 0x0C; - kb_map['J'] = 0x0D; - kb_map['K'] = 0x0E; - kb_map['L'] = 0x0F; - kb_map['M'] = 0x10; - kb_map['N'] = 0x11; - kb_map['O'] = 0x12; - kb_map['P'] = 0x13; - kb_map['Q'] = 0x14; - kb_map['R'] = 0x15; - kb_map['S'] = 0x16; - kb_map['T'] = 0x17; - kb_map['U'] = 0x18; - kb_map['V'] = 0x19; - kb_map['W'] = 0x1A; - kb_map['X'] = 0x1B; - kb_map['Y'] = 0x1C; - kb_map['Z'] = 0x1D; - - //1E-27 Number keys 1-0 - kb_map['1'] = 0x1E; - kb_map['2'] = 0x1F; - kb_map['3'] = 0x20; - kb_map['4'] = 0x21; - kb_map['5'] = 0x22; - kb_map['6'] = 0x23; - kb_map['7'] = 0x24; - kb_map['8'] = 0x25; - kb_map['9'] = 0x26; - kb_map['0'] = 0x27; - - kb_map[VK_RETURN] = 0x28; - kb_map[VK_ESCAPE] = 0x29; - kb_map[VK_BACK] = 0x2A; - kb_map[VK_TAB] = 0x2B; - kb_map[VK_SPACE] = 0x2C; - - kb_map[VK_OEM_MINUS] = 0x2D; // - - kb_map[VK_OEM_PLUS] = 0x2E; // = - kb_map[VK_OEM_4] = 0x2F; // [ - kb_map[VK_OEM_6] = 0x30; // ] - - kb_map[VK_OEM_5] = 0x31; // \ (US) unsure of keycode - - //32-34 "]", ";" and ":" (the 3 keys right of L) - kb_map[VK_OEM_8] = 0x32; // ~ (non-US) *,µ in FR layout - kb_map[VK_OEM_1] = 0x33; // ; - kb_map[VK_OEM_7] = 0x34; // ' - - //35 hankaku/zenkaku / kanji (top left) - kb_map[VK_OEM_3] = 0x35; // `~ (US) - - //36-38 ",", "." and "/" (the 3 keys right of M) - kb_map[VK_OEM_COMMA] = 0x36; - kb_map[VK_OEM_PERIOD] = 0x37; - kb_map[VK_OEM_2] = 0x38; - - // CAPSLOCK - kb_map[VK_CAPITAL] = 0x39; - - //3A-45 Function keys F1-F12 - for (int i = 0;i < 12; i++) - kb_map[VK_F1 + i] = 0x3A + i; - - //46-4E Control keys above cursor keys - kb_map[VK_SNAPSHOT] = 0x46; // Print Screen - kb_map[VK_SCROLL] = 0x47; // Scroll Lock - kb_map[VK_PAUSE] = 0x48; // Pause - kb_map[VK_INSERT] = 0x49; - kb_map[VK_HOME] = 0x4A; - kb_map[VK_PRIOR] = 0x4B; - kb_map[VK_DELETE] = 0x4C; - kb_map[VK_END] = 0x4D; - kb_map[VK_NEXT] = 0x4E; - - //4F-52 Cursor keys - kb_map[VK_RIGHT] = 0x4F; - kb_map[VK_LEFT] = 0x50; - kb_map[VK_DOWN] = 0x51; - kb_map[VK_UP] = 0x52; - - //53 Num Lock (Numeric keypad) - kb_map[VK_NUMLOCK] = 0x53; - //54 "/" (Numeric keypad) - kb_map[VK_DIVIDE] = 0x54; - //55 "*" (Numeric keypad) - kb_map[VK_MULTIPLY] = 0x55; - //56 "-" (Numeric keypad) - kb_map[VK_SUBTRACT] = 0x56; - //57 "+" (Numeric keypad) - kb_map[VK_ADD] = 0x57; - //58 Enter (Numeric keypad) - kb_map[VK_NUMPAD_RETURN] = 0x58; - //59-62 Number keys 1-0 (Numeric keypad) - kb_map[VK_NUMPAD1] = 0x59; - kb_map[VK_NUMPAD2] = 0x5A; - kb_map[VK_NUMPAD3] = 0x5B; - kb_map[VK_NUMPAD4] = 0x5C; - kb_map[VK_NUMPAD5] = 0x5D; - kb_map[VK_NUMPAD6] = 0x5E; - kb_map[VK_NUMPAD7] = 0x5F; - kb_map[VK_NUMPAD8] = 0x60; - kb_map[VK_NUMPAD9] = 0x61; - kb_map[VK_NUMPAD0] = 0x62; - //63 "." (Numeric keypad) - kb_map[VK_DECIMAL] = 0x63; - //64 #| (non-US) - //kb_map[94] = 0x64; - //65 S3 key - //66-A4 Not used - //A5-DF Reserved - kb_map[VK_CONTROL] = 0xE0; // Left Control - kb_map[VK_SHIFT] = 0xE1; // Left Shift - //E2 Left Alt - //E3 Left S1 - //E4 Right Control - //E5 Right Shift - //E6 Right Alt - //E7 Right S3 - //E8-FF Reserved - - } - - void input(u8 keycode, bool pressed) { - KeyboardDevice::input(kb_map[keycode], pressed, 0); - } - -private: - std::map kb_map; -}; diff --git a/core/windows/win_vmem.cpp b/core/windows/win_vmem.cpp index 71149c665..329c4affc 100644 --- a/core/windows/win_vmem.cpp +++ b/core/windows/win_vmem.cpp @@ -15,16 +15,20 @@ namespace virtmem bool region_lock(void *start, size_t len) { DWORD old; - if (!VirtualProtect(start, len, PAGE_READONLY, &old)) - die("VirtualProtect failed ..\n"); + if (!VirtualProtect(start, len, PAGE_READONLY, &old)) { + ERROR_LOG(VMEM, "VirtualProtect(%p, %x, RO) failed: %d", start, (u32)len, GetLastError()); + die("VirtualProtect(ro) failed"); + } return true; } bool region_unlock(void *start, size_t len) { DWORD old; - if (!VirtualProtect(start, len, PAGE_READWRITE, &old)) - die("VirtualProtect failed ..\n"); + if (!VirtualProtect(start, len, PAGE_READWRITE, &old)) { + ERROR_LOG(VMEM, "VirtualProtect(%p, %x, RW) failed: %d", start, (u32)len, GetLastError()); + die("VirtualProtect(rw) failed"); + } return true; } @@ -64,7 +68,7 @@ bool init(void **vmem_base_addr, void **sh4rcb_addr, size_t ramSize) mem_handle = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, (DWORD)ramSize, 0); // Now allocate the actual address space (it will be 64KB aligned on windows). - unsigned memsize = 512*1024*1024 + sizeof(Sh4RCB) + ARAM_SIZE_MAX; + unsigned memsize = 512_MB + sizeof(Sh4RCB) + ARAM_SIZE_MAX; base_alloc = (char*)mem_region_reserve(NULL, memsize); // Calculate pointers now @@ -162,7 +166,7 @@ static void *prepare_jit_block_template(size_t size, Mapper mapper) uintptr_t base_addr = reinterpret_cast(&init) & ~0xFFFFF; // Probably safe to assume reicast code is <200MB (today seems to be <16MB on every platform I've seen). - for (uintptr_t i = 0; i < 1800 * 1024 * 1024; i += 1024 * 1024) { // Some arbitrary step size. + for (uintptr_t i = 0; i < 1800_MB; i += 1_MB) { // Some arbitrary step size. uintptr_t try_addr_above = base_addr + i; uintptr_t try_addr_below = base_addr - i; @@ -268,9 +272,30 @@ void jit_set_exec(void* code, size_t size, bool enable) { #ifdef TARGET_UWP DWORD old; - if (!VirtualProtect(code, size, enable ? PAGE_EXECUTE_READ : PAGE_READWRITE, &old)) - die("VirtualProtect failed"); + if (!VirtualProtect(code, size, enable ? PAGE_EXECUTE_READ : PAGE_READWRITE, &old)) { + ERROR_LOG(VMEM, "VirtualProtect(%p, %x, %s) failed: %d", code, (u32)size, enable ? "RX" : "RW", GetLastError()); + die("VirtualProtect(rx/rw) failed"); + } #endif } +#if HOST_CPU == CPU_ARM64 || HOST_CPU == CPU_ARM +static void Arm_Arm64_CacheFlush(void *start, void *end) { + if (start == end) { + return; + } + + FlushInstructionCache(GetCurrentProcess(), start, (uintptr_t)end - (uintptr_t)start); +} + +void flush_cache(void *icache_start, void *icache_end, void *dcache_start, void *dcache_end) { + Arm_Arm64_CacheFlush(dcache_start, dcache_end); + + // Dont risk it and flush and invalidate icache&dcache for both ranges just in case. + if (icache_start != dcache_start) { + Arm_Arm64_CacheFlush(icache_start, icache_end); + } +} +#endif + } // namespace virtmem diff --git a/core/windows/winmain.cpp b/core/windows/winmain.cpp index a055aa22f..2ab7a1118 100644 --- a/core/windows/winmain.cpp +++ b/core/windows/winmain.cpp @@ -26,23 +26,16 @@ #include #include #include +#include "cfg/option.h" +#include "ui/gui.h" #endif #include "oslib/oslib.h" -#include "imgread/common.h" #include "stdclass.h" #include "cfg/cfg.h" -#include "win_keyboard.h" #include "log/LogManager.h" -#include "wsi/context.h" -#if defined(USE_SDL) #include "sdl/sdl.h" -#else -#include "xinput_gamepad.h" -#endif #include "emulator.h" -#include "rend/mainui.h" -#include "../shell/windows/resource.h" -#include "rawinput.h" +#include "ui/mainui.h" #include "oslib/directory.h" #ifdef USE_BREAKPAD #include "breakpad/client/windows/handler/exception_handler.h" @@ -50,189 +43,12 @@ #endif #include "profiler/fc_profiler.h" -#if defined(USE_SDL) || defined(DEF_CONSOLE) #include -#endif #include #include #include -#if !defined(USE_SDL) && !defined(DEF_CONSOLE) -static PCHAR* - commandLineToArgvA( - PCHAR CmdLine, - int* _argc - ) -{ - PCHAR* argv; - PCHAR _argv; - ULONG len; - ULONG argc; - CHAR a; - ULONG i, j; - - BOOLEAN in_QM; - BOOLEAN in_TEXT; - BOOLEAN in_SPACE; - - len = strlen(CmdLine); - i = ((len+2)/2)*sizeof(PVOID) + sizeof(PVOID); - - argv = (PCHAR*)GlobalAlloc(GMEM_FIXED, - i + (len+2)*sizeof(CHAR)); - - _argv = (PCHAR)(((PUCHAR)argv)+i); - - argc = 0; - argv[argc] = _argv; - in_QM = FALSE; - in_TEXT = FALSE; - in_SPACE = TRUE; - i = 0; - j = 0; - - while ((a = CmdLine[i]) != 0) - { - if(in_QM) - { - if(a == '\"') - { - in_QM = FALSE; - } - else - { - _argv[j] = a; - j++; - } - } - else - { - switch(a) - { - case '\"': - in_QM = TRUE; - in_TEXT = TRUE; - if(in_SPACE) { - argv[argc] = _argv+j; - argc++; - } - in_SPACE = FALSE; - break; - case ' ': - case '\t': - case '\n': - case '\r': - if(in_TEXT) - { - _argv[j] = '\0'; - j++; - } - in_TEXT = FALSE; - in_SPACE = TRUE; - break; - default: - in_TEXT = TRUE; - if(in_SPACE) - { - argv[argc] = _argv+j; - argc++; - } - _argv[j] = a; - j++; - in_SPACE = FALSE; - break; - } - } - i++; - } - _argv[j] = '\0'; - argv[argc] = NULL; - - (*_argc) = argc; - return argv; -} -#endif - -#ifndef USE_SDL - -static std::shared_ptr mouse; -static std::shared_ptr keyboard; -static bool mouseCaptured; -static POINT savedMousePos; -static bool gameRunning; - -static void captureMouse(bool); - -static void emuEventCallback(Event event, void *) -{ - static bool captureOn; - switch (event) - { - case Event::Pause: - captureOn = mouseCaptured; - captureMouse(false); - gameRunning = false; - break; - case Event::Resume: - gameRunning = true; - captureMouse(captureOn); - break; - default: - break; - } -} - -static void checkRawInput() -{ - if ((bool)config::UseRawInput != (bool)keyboard) - return; - if (config::UseRawInput) - { - GamepadDevice::Unregister(keyboard); - keyboard = nullptr;; - GamepadDevice::Unregister(mouse); - mouse = nullptr; - rawinput::init(); - } - else - { - rawinput::term(); - keyboard = std::make_shared(0); - GamepadDevice::Register(keyboard); - mouse = std::make_shared(); - GamepadDevice::Register(mouse); - } -} -#endif - -void os_SetupInput() -{ -#if defined(USE_SDL) - input_sdl_init(); -#else - XInputGamepadDevice::CreateDevices(); - EventManager::listen(Event::Pause, emuEventCallback); - EventManager::listen(Event::Resume, emuEventCallback); - checkRawInput(); -#endif -#ifndef TARGET_UWP - if (config::UseRawInput) - rawinput::init(); -#endif -} - -void os_TermInput() -{ -#if defined(USE_SDL) - input_sdl_quit(); -#endif -#ifndef TARGET_UWP - if (config::UseRawInput) - rawinput::term(); -#endif -} - static void setupPath() { #ifndef TARGET_UWP @@ -272,333 +88,6 @@ static void setupPath() #endif } -void UpdateInputState() -{ - FC_PROFILE_SCOPE; - -#if defined(USE_SDL) - input_sdl_handle(); -#else - for (int port = 0; port < 4; port++) - { - std::shared_ptr gamepad = XInputGamepadDevice::GetXInputDevice(port); - if (gamepad != nullptr) - gamepad->ReadInput(); - } -#endif -} - -#ifndef USE_SDL -static HWND hWnd; - -// Windows class name to register -#define WINDOW_CLASS "nilDC" -static int window_x, window_y; - -// Width and height of the window -#define DEFAULT_WINDOW_WIDTH 1280 -#define DEFAULT_WINDOW_HEIGHT 720 -static bool window_maximized = false; - -static void centerMouse() -{ - RECT rect; - GetWindowRect(hWnd, &rect); - SetCursorPos((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2); -} - -static void captureMouse(bool capture) -{ - if (hWnd == nullptr || !gameRunning) - return; - if (capture == mouseCaptured) - return; - - if (!capture) - { - os_SetWindowText(VER_EMUNAME); - mouseCaptured = false; - SetCursorPos(savedMousePos.x, savedMousePos.y); - while (ShowCursor(true) < 0) - ; - } - else - { - os_SetWindowText("Flycast - mouse capture"); - mouseCaptured = true; - GetCursorPos(&savedMousePos); - while (ShowCursor(false) >= 0) - ; - centerMouse(); - } -} - -static void toggleFullscreen(); - -static LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - /* - Here we are handling 2 system messages: screen saving and monitor power. - They are especially relevant on mobile devices. - */ - case WM_SYSCOMMAND: - { - switch (wParam) - { - case SC_SCREENSAVE: // Screensaver trying to start ? - case SC_MONITORPOWER: // Monitor trying to enter powersave ? - return 0; // Prevent this from happening - } - break; - } - // Handles the close message when a user clicks the quit icon of the window - case WM_CLOSE: - PostQuitMessage(0); - return 1; - - case WM_SIZE: - settings.display.width = LOWORD(lParam); - settings.display.height = HIWORD(lParam); - window_maximized = (wParam & SIZE_MAXIMIZED) != 0; - GraphicsContext::Instance()->resize(); - return 0; - - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - gui_set_mouse_position(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - checkRawInput(); - switch (message) - { - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - if (!mouseCaptured && !config::UseRawInput) - mouse->setButton(Mouse::LEFT_BUTTON, message == WM_LBUTTONDOWN); - gui_set_mouse_button(0, message == WM_LBUTTONDOWN); - break; - - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - if (!mouseCaptured && !config::UseRawInput) - mouse->setButton(Mouse::MIDDLE_BUTTON, message == WM_MBUTTONDOWN); - gui_set_mouse_button(2, message == WM_MBUTTONDOWN); - break; - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - if (!mouseCaptured && !config::UseRawInput) - mouse->setButton(Mouse::RIGHT_BUTTON, message == WM_RBUTTONDOWN); - gui_set_mouse_button(1, message == WM_RBUTTONDOWN); - break; - } - if (mouseCaptured) - break; - /* no break */ - case WM_MOUSEMOVE: - gui_set_mouse_position(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - checkRawInput(); - if (mouseCaptured) - // TODO relative mouse move if !rawinput - centerMouse(); - else if (!config::UseRawInput) - { - int xPos = GET_X_LPARAM(lParam); - int yPos = GET_Y_LPARAM(lParam); - mouse->setAbsPos(xPos, yPos, settings.display.width, settings.display.height); - - if (wParam & MK_LBUTTON) - mouse->setButton(Mouse::LEFT_BUTTON, true); - if (wParam & MK_MBUTTON) - mouse->setButton(Mouse::MIDDLE_BUTTON, true); - if (wParam & MK_RBUTTON) - mouse->setButton(Mouse::RIGHT_BUTTON, true); - } - if (message != WM_MOUSEMOVE) - return 0; - break; - case WM_MOUSEWHEEL: - gui_set_mouse_wheel(-(float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA * 16); - checkRawInput(); - if (!config::UseRawInput) - mouse->setWheel(-GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); - break; - - case WM_KEYDOWN: - case WM_KEYUP: - { - if (message == WM_KEYDOWN - && ((wParam == VK_CONTROL && GetAsyncKeyState(VK_LMENU) < 0) - || (wParam == VK_MENU && GetAsyncKeyState(VK_LCONTROL) < 0))) - { - captureMouse(!mouseCaptured); - break; - } - checkRawInput(); - if (!config::UseRawInput) - { - u8 keycode; - // bit 24 indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. - // (It also distinguishes between the main Return key and the numeric keypad Enter key) - // The value is 1 if it is an extended key; otherwise, it is 0. - if (wParam == VK_RETURN && ((lParam & (1 << 24)) != 0)) - keycode = VK_NUMPAD_RETURN; - else - keycode = wParam & 0xff; - keyboard->input(keycode, message == WM_KEYDOWN); - } - } - break; - - case WM_SYSKEYDOWN: - if (wParam == VK_RETURN) - { - if ((HIWORD(lParam) & KF_ALTDOWN)) - toggleFullscreen(); - } - else if (wParam == VK_CONTROL && (lParam & (1 << 24)) == 0 && GetAsyncKeyState(VK_LMENU) < 0) - { - captureMouse(!mouseCaptured); - } - break; - - case WM_CHAR: - gui_keyboard_input((u16)wParam); - return 0; - - default: - break; - } - - // Calls the default window procedure for messages we did not handle - return DefWindowProc(hWnd, message, wParam, lParam); -} - -static bool windowClassRegistered; - -void CreateMainWindow() -{ - if (hWnd != NULL) - return; - HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(0); - if (!windowClassRegistered) - { - WNDCLASS sWC; - sWC.style = CS_HREDRAW | CS_VREDRAW; - sWC.lpfnWndProc = WndProc2; - sWC.cbClsExtra = 0; - sWC.cbWndExtra = 0; - sWC.hInstance = hInstance; - sWC.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); - sWC.hCursor = LoadCursor(NULL, IDC_ARROW); - sWC.lpszMenuName = 0; - sWC.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); - sWC.lpszClassName = WINDOW_CLASS; - ATOM registerClass = RegisterClass(&sWC); - if (!registerClass) - MessageBox(0, "Failed to register the window class", "Error", MB_OK | MB_ICONEXCLAMATION); - else - windowClassRegistered = true; - settings.display.width = cfgLoadInt("window", "width", DEFAULT_WINDOW_WIDTH); - settings.display.height = cfgLoadInt("window", "height", DEFAULT_WINDOW_HEIGHT); - window_maximized = cfgLoadBool("window", "maximized", false); - } - - // Create the eglWindow - RECT sRect; - SetRect(&sRect, 0, 0, settings.display.width, settings.display.height); - AdjustWindowRectEx(&sRect, WS_OVERLAPPEDWINDOW, false, 0); - - hWnd = CreateWindow(WINDOW_CLASS, VER_EMUNAME, WS_VISIBLE | WS_OVERLAPPEDWINDOW | (window_maximized ? WS_MAXIMIZE : 0), - window_x, window_y, sRect.right - sRect.left, sRect.bottom - sRect.top, NULL, NULL, hInstance, NULL); - if (GraphicsContext::Instance() != nullptr) - GraphicsContext::Instance()->setWindow((void *)hWnd, (void *)GetDC((HWND)hWnd)); -} -#endif - -void os_CreateWindow() -{ -#if defined(USE_SDL) - sdl_window_create(); -#else - CreateMainWindow(); - initRenderApi((void *)hWnd, (void *)GetDC((HWND)hWnd)); -#endif // !USE_SDL -} - -#ifndef USE_SDL -static void destroyMainWindow() -{ - if (hWnd) - { - WINDOWPLACEMENT placement; - placement.length = sizeof(WINDOWPLACEMENT); - GetWindowPlacement(hWnd, &placement); - window_maximized = placement.showCmd == SW_SHOWMAXIMIZED; - window_x = placement.rcNormalPosition.left; - window_y = placement.rcNormalPosition.top; - DestroyWindow(hWnd); - hWnd = NULL; - } -} - -static void toggleFullscreen() -{ - static RECT rSaved; - static bool fullscreen=false; - - fullscreen = !fullscreen; - - - if (fullscreen) - { - GetWindowRect(hWnd, &rSaved); - - MONITORINFO mi = { sizeof(mi) }; - HMONITOR hmon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); - if (GetMonitorInfo(hmon, &mi)) { - - SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST); - SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); - - SetWindowPos(hWnd, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top, - mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, - SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_ASYNCWINDOWPOS); - } - } - else { - - SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST); - SetWindowLongPtr(hWnd, GWL_STYLE, WS_VISIBLE | WS_OVERLAPPEDWINDOW | (window_maximized ? WS_MAXIMIZE : 0)); - - SetWindowPos(hWnd, NULL, rSaved.left, rSaved.top, - rSaved.right - rSaved.left, rSaved.bottom - rSaved.top, - SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_ASYNCWINDOWPOS|SWP_NOZORDER); - } - -} - -HWND getNativeHwnd() -{ - return hWnd; -} -#endif - -void os_SetWindowText(const char* text) -{ -#if defined(USE_SDL) - sdl_window_set_text(text); -#else - if (GetWindowLongPtr(hWnd, GWL_STYLE) & WS_BORDER) - { - SetWindowText(hWnd, text); - } -#endif -} - static void reserveBottomMemory() { #if defined(_WIN64) && defined(_DEBUG) @@ -616,8 +105,7 @@ static void reserveBottomMemory() size_t totalReservation = 0; size_t numVAllocs = 0; size_t numHeapAllocs = 0; - size_t oneMB = 1024 * 1024; - for (size_t size = 256 * oneMB; size >= oneMB; size /= 2) + for (size_t size = 256_MB; size >= 1_MB; size /= 2) { for (;;) { @@ -640,7 +128,7 @@ static void reserveBottomMemory() // Now repeat the same process but making heap allocations, to use up // the already reserved heap blocks that are below the 4 GB line. HANDLE heap = GetProcessHeap(); - for (size_t blockSize = 64 * 1024; blockSize >= 16; blockSize /= 2) + for (size_t blockSize = 64_KB; blockSize >= 16; blockSize /= 2) { for (;;) { @@ -662,7 +150,7 @@ static void reserveBottomMemory() // Perversely enough the CRT doesn't use the process heap. Suck up // the memory the CRT heap has already reserved. - for (size_t blockSize = 64 * 1024; blockSize >= 16; blockSize /= 2) + for (size_t blockSize = 64_KB; blockSize >= 16; blockSize /= 2) { for (;;) { @@ -755,41 +243,6 @@ static bool dumpCallback(const wchar_t* dump_path, #endif #ifdef TARGET_UWP - -void gui_load_game() -{ - using namespace Windows::Storage; - using namespace Concurrency; - - auto picker = ref new Pickers::FileOpenPicker(); - picker->ViewMode = Pickers::PickerViewMode::List; - - picker->FileTypeFilter->Append(".chd"); - picker->FileTypeFilter->Append(".gdi"); - picker->FileTypeFilter->Append(".cue"); - picker->FileTypeFilter->Append(".cdi"); - picker->FileTypeFilter->Append(".zip"); - picker->FileTypeFilter->Append(".7z"); - picker->FileTypeFilter->Append(".elf"); - if (!config::HideLegacyNaomiRoms) - { - picker->FileTypeFilter->Append(".bin"); - picker->FileTypeFilter->Append(".lst"); - picker->FileTypeFilter->Append(".dat"); - } - picker->SuggestedStartLocation = Pickers::PickerLocationId::DocumentsLibrary; - - create_task(picker->PickSingleFileAsync()).then([](StorageFile ^file) { - if (file) - { - NOTICE_LOG(COMMON, "Picked file: %S", file->Path->Data()); - nowide::stackstring path; - if (path.convert(file->Path->Data())) - gui_start_game(path.get()); - } - }); -} - namespace nowide { FILE *fopen(char const *file_name, char const *mode) @@ -852,33 +305,10 @@ int remove(char const *name) } #endif -#ifdef USE_SDL int main(int argc, char* argv[]) { nowide::args _(argc, argv); -#elif defined(DEF_CONSOLE) -// DEF_CONSOLE allows you to override linker subsystem and therefore default console -// : pragma isn't pretty but def's are configurable -#pragma comment(linker, "/subsystem:console") - -int main(int argc, char** argv) -{ - nowide::args _(argc, argv); - -#else -#pragma comment(linker, "/subsystem:windows") - -int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShowCmd) -{ - wchar_t *cmd_line = GetCommandLineW(); - nowide::stackstring converter; - int argc = 0; - char **argv = nullptr; - if (converter.convert(cmd_line)) - argv = commandLineToArgvA(converter.get(), &argc); -#endif - #ifdef USE_BREAKPAD wchar_t tempDir[MAX_PATH + 1]; GetTempPathW(MAX_PATH + 1, tempDir); @@ -929,19 +359,6 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi mainui_loop(); -#ifdef USE_SDL - sdl_window_destroy(); -#else - termRenderApi(); - destroyMainWindow(); - cfgSaveBool("window", "maximized", window_maximized); - if (!window_maximized && settings.display.width != 0 && settings.display.height != 0) - { - cfgSaveInt("window", "width", settings.display.width); - cfgSaveInt("window", "height", settings.display.height); - } -#endif - flycast_term(); os_UninstallFaultHandler(); @@ -977,21 +394,33 @@ void os_DoEvents() void os_RunInstance(int argc, const char *argv[]) { - char exePath[MAX_PATH]; - GetModuleFileNameA(NULL, exePath, sizeof(exePath)); + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, std::size(exePath)); - std::string cmdLine(exePath); + std::wstring cmdLine = L'"' + std::wstring(exePath) + L'"'; for (int i = 0; i < argc; i++) { - cmdLine += ' '; - cmdLine += argv[i]; + nowide::wstackstring wname; + if (!wname.convert(argv[i])) { + WARN_LOG(BOOT, "Invalid argument: %s", argv[i]); + continue; + } + cmdLine += L" \""; + for (wchar_t *p = wname.get(); *p != L'\0'; p++) + { + cmdLine += *p; + if (*p == L'"') + // escape double quote + cmdLine += L'"'; + } + cmdLine += L'"'; } - STARTUPINFOA startupInfo{}; + STARTUPINFOW startupInfo{}; startupInfo.cb = sizeof(startupInfo); PROCESS_INFORMATION processInfo{}; - BOOL rc = CreateProcessA(exePath, (char *)cmdLine.c_str(), nullptr, nullptr, true, 0, nullptr, nullptr, &startupInfo, &processInfo); + BOOL rc = CreateProcessW(exePath, (wchar_t *)cmdLine.c_str(), nullptr, nullptr, true, 0, nullptr, nullptr, &startupInfo, &processInfo); if (rc) { CloseHandle(processInfo.hProcess); @@ -1002,3 +431,89 @@ void os_RunInstance(int argc, const char *argv[]) WARN_LOG(BOOT, "Cannot launch Flycast instance: error %d", GetLastError()); } } + +void os_SetThreadName(const char *name) +{ +#ifndef TARGET_UWP + nowide::wstackstring wname; + if (wname.convert(name)) + { + static HRESULT (*SetThreadDescription)(HANDLE, PCWSTR); + if (SetThreadDescription == nullptr) + { + // supported in Windows 10, version 1607 or Windows Server 2016 + HINSTANCE libh = LoadLibraryW(L"KernelBase.dll"); + if (libh != NULL) + SetThreadDescription = (HRESULT (*)(HANDLE, PCWSTR))GetProcAddress(libh, "SetThreadDescription"); + } + if (SetThreadDescription != nullptr) + SetThreadDescription(GetCurrentThread(), wname.get()); + } +#endif +} + +#ifdef VIDEO_ROUTING +#include "SpoutSender.h" +#include "SpoutDX.h" + +static SpoutSender* spoutSender; +static spoutDX* spoutDXSender; + +void os_VideoRoutingPublishFrameTexture(GLuint texID, GLuint texTarget, float w, float h) +{ + if (spoutSender == nullptr) + { + spoutSender = new SpoutSender(); + int boardID = cfgLoadInt("naomi", "BoardId", 0); + char buf[32] = { 0 }; + vsnprintf(buf, sizeof(buf), (boardID == 0 ? "Flycast - Video Content" : "Flycast - Video Content - %d"), std::va_list(&boardID)); + spoutSender->SetSenderName(buf); + } + spoutSender->SendTexture(texID, texTarget, w, h, true); +} + +void os_VideoRoutingTermGL() +{ + if (spoutSender) + { + spoutSender->ReleaseSender(); + spoutSender = nullptr; + } +} + +void os_VideoRoutingPublishFrameTexture(ID3D11Texture2D* pTexture) +{ + if (spoutDXSender == nullptr) + { + spoutDXSender = new spoutDX(); + ID3D11Resource* resource = nullptr; + HRESULT hr = pTexture->QueryInterface(__uuidof(ID3D11Resource), reinterpret_cast(&resource)); + if (SUCCEEDED(hr)) + { + ID3D11Device* pDevice = nullptr; + resource->GetDevice(&pDevice); + resource->Release(); + spoutDXSender->OpenDirectX11(pDevice); + pDevice->Release(); + int boardID = cfgLoadInt("naomi", "BoardId", 0); + char buf[32] = { 0 }; + vsnprintf(buf, sizeof(buf), (boardID == 0 ? "Flycast - Video Content" : "Flycast - Video Content - %d"), std::va_list(&boardID)); + spoutDXSender->SetSenderName(buf); + } + else + { + return; + } + } + spoutDXSender->SendTexture(pTexture); +} + +void os_VideoRoutingTermDX() +{ + if (spoutDXSender) + { + spoutDXSender->ReleaseSender(); + spoutDXSender = nullptr; + } +} +#endif diff --git a/core/windows/xinput_gamepad.h b/core/windows/xinput_gamepad.h deleted file mode 100644 index 873fc17d7..000000000 --- a/core/windows/xinput_gamepad.h +++ /dev/null @@ -1,221 +0,0 @@ -#include "input/gamepad_device.h" -#include "input/mouse.h" - -#include -#include - -class XInputMapping : public InputMapping -{ -public: - XInputMapping() - { - name = "XInput"; - set_button(DC_BTN_A, XINPUT_GAMEPAD_A); - set_button(DC_BTN_B, XINPUT_GAMEPAD_B); - set_button(DC_BTN_X, XINPUT_GAMEPAD_X); - set_button(DC_BTN_Y, XINPUT_GAMEPAD_Y); - set_button(DC_DPAD_UP, XINPUT_GAMEPAD_DPAD_UP); - set_button(DC_DPAD_DOWN, XINPUT_GAMEPAD_DPAD_DOWN); - set_button(DC_DPAD_LEFT, XINPUT_GAMEPAD_DPAD_LEFT); - set_button(DC_DPAD_RIGHT, XINPUT_GAMEPAD_DPAD_RIGHT); - set_button(DC_BTN_START, XINPUT_GAMEPAD_START); - set_button(DC_AXIS_LT, XINPUT_GAMEPAD_LEFT_SHOULDER); - set_button(DC_AXIS_RT, XINPUT_GAMEPAD_RIGHT_SHOULDER); - set_button(EMU_BTN_MENU, XINPUT_GAMEPAD_BACK); - set_axis(DC_AXIS_LT, 0, false); - set_axis(DC_AXIS_RT, 1, false); - set_axis(DC_AXIS_LEFT, 2, false); - set_axis(DC_AXIS_RIGHT, 2, true); - set_axis(DC_AXIS_UP, 3, true); - set_axis(DC_AXIS_DOWN, 3, false); - set_axis(DC_AXIS2_LEFT, 4, false); - set_axis(DC_AXIS2_RIGHT, 4, true); - set_axis(DC_AXIS2_UP, 5, true); - set_axis(DC_AXIS2_DOWN, 5, false); - dirty = false; - } -}; - -class XInputGamepadDevice : public GamepadDevice -{ -public: - XInputGamepadDevice(int maple_port, int xinput_port) - : GamepadDevice(maple_port, "xinput"), _xinput_port(xinput_port) - { - char buf[32]; - sprintf(buf, "xinput-%d", xinput_port + 1); - _unique_id = buf; - } - - std::shared_ptr getDefaultMapping() override { - return std::make_shared(); - } - - void ReadInput() - { - update_rumble(); - - XINPUT_STATE state; - - if (XInputGetState(_xinput_port, &state) == 0) - { - if (!input_mapper) - Open(); - u32 xbutton = state.Gamepad.wButtons; - u32 changes = xbutton ^ last_buttons_state; - - for (int i = 0; i < 16; i++) - if ((changes & (1 << i)) != 0) - gamepad_btn_input(1 << i, (xbutton & (1 << i)) != 0); - last_buttons_state = xbutton; - - if (state.Gamepad.bLeftTrigger != last_left_trigger) - { - gamepad_axis_input(0, (state.Gamepad.bLeftTrigger << 7) + (state.Gamepad.bLeftTrigger >> 1)); - last_left_trigger = state.Gamepad.bLeftTrigger; - } - if (state.Gamepad.bRightTrigger != last_right_trigger) - { - gamepad_axis_input(1, (state.Gamepad.bRightTrigger << 7) + (state.Gamepad.bRightTrigger >> 1)); - last_right_trigger = state.Gamepad.bRightTrigger; - } - if (state.Gamepad.sThumbLX != last_left_thumb_x) - { - gamepad_axis_input(2, state.Gamepad.sThumbLX); - last_left_thumb_x = state.Gamepad.sThumbLX; - } - if (state.Gamepad.sThumbLY != last_left_thumb_y) - { - gamepad_axis_input(3, state.Gamepad.sThumbLY); - last_left_thumb_y = state.Gamepad.sThumbLY; - } - if (state.Gamepad.sThumbRX != last_right_thumb_x) - { - gamepad_axis_input(4, state.Gamepad.sThumbRX); - last_right_thumb_x = state.Gamepad.sThumbRX; - } - if (state.Gamepad.sThumbRY != last_right_thumb_y) - { - gamepad_axis_input(5, state.Gamepad.sThumbRY); - last_right_thumb_y = state.Gamepad.sThumbRY; - } - } - else if (input_mapper) - { - INFO_LOG(INPUT, "xinput: Controller '%s' on port %d disconnected", _name.c_str(), _xinput_port); - GamepadDevice::Unregister(xinput_gamepads[_xinput_port]); - input_mapper.reset(); - last_buttons_state = 0; - last_left_trigger = 0; - last_right_trigger = 0; - last_left_thumb_x = 0; - last_left_thumb_y = 0; - last_right_thumb_x = 0; - last_right_thumb_y = 0; - } - } - void rumble(float power, float inclination, u32 duration_ms) override - { - vib_inclination = inclination * power; - vib_stop_time = os_GetSeconds() + duration_ms / 1000.0; - - do_rumble(power); - } - void update_rumble() override - { - if (vib_stop_time > 0) - { - int rem_time = (int)((vib_stop_time - os_GetSeconds()) * 1000.0); - if (rem_time <= 0) - { - vib_stop_time = 0; - do_rumble(0); - } - else if (vib_inclination > 0) - do_rumble(vib_inclination * rem_time); - } - } - - void Open() - { - JOYCAPS joycaps; - int rc = joyGetDevCaps(_xinput_port, &joycaps, sizeof(joycaps)); - if (rc != 0) - _name = "xinput" + std::to_string(_xinput_port); - else - _name = joycaps.szPname; - INFO_LOG(INPUT, "xinput: Opened controller '%s' on port %d", _name.c_str(), _xinput_port); - loadMapping(); - - GamepadDevice::Register(xinput_gamepads[_xinput_port]); - } - - static void CreateDevices() - { - for (int port = 0; port < XUSER_MAX_COUNT; port++) - xinput_gamepads[port] = std::make_shared(port, port); - } - static void CloseDevices() - { - for (int port = 0; port < XUSER_MAX_COUNT; port++) - GamepadDevice::Unregister(xinput_gamepads[port]); - } - - static std::shared_ptr GetXInputDevice(int port) - { - return xinput_gamepads[port]; - } - -protected: - void load_axis_min_max(u32 axis) - { - if (axis == 0 || axis == 1) - { - axis_ranges[axis] = 255; - axis_min_values[axis] = 0; - } - else - { - axis_ranges[axis] = 65535; - axis_min_values[axis] = -32768; - } - } - -private: - void do_rumble(float power) - { - XINPUT_VIBRATION vib; - - vib.wLeftMotorSpeed = (u16)(65535 * power); - vib.wRightMotorSpeed = (u16)(65535 * power); - - XInputSetState(_xinput_port, &vib); - } - - const int _xinput_port; - u32 last_buttons_state = 0; - u8 last_left_trigger = 0; - u8 last_right_trigger = 0; - s16 last_left_thumb_x = 0; - s16 last_left_thumb_y = 0; - s16 last_right_thumb_x = 0; - s16 last_right_thumb_y = 0; - double vib_stop_time; - float vib_inclination; - std::map axis_min_values; - std::map axis_ranges; - static std::vector> xinput_gamepads; -}; - -std::vector> XInputGamepadDevice::xinput_gamepads(XUSER_MAX_COUNT); - -class WinMouse : public Mouse -{ -public: - WinMouse() : Mouse("win32") - { - _unique_id = "win_mouse"; - loadMapping(); - } -}; - diff --git a/core/wsi/context.h b/core/wsi/context.h index ec1891f0f..c7529a18b 100644 --- a/core/wsi/context.h +++ b/core/wsi/context.h @@ -33,6 +33,7 @@ class GraphicsContext virtual void resize() {} virtual std::string getDriverName() = 0; virtual std::string getDriverVersion() = 0; + virtual bool isAMD() = 0; virtual bool hasPerPixel() { return false; } void setWindow(void *window, void *display = nullptr) { diff --git a/core/wsi/egl.cpp b/core/wsi/egl.cpp index c06d0bb5f..0ee2672a1 100644 --- a/core/wsi/egl.cpp +++ b/core/wsi/egl.cpp @@ -39,6 +39,13 @@ bool EGLGraphicsContext::makeCurrent() bool EGLGraphicsContext::init() { + int version = gladLoaderLoadEGL(EGL_NO_DISPLAY); + if (version == 0) { + ERROR_LOG(RENDERER, "Failed to load libEGL.so"); + return false; + } + NOTICE_LOG(RENDERER, "EGL version %d.%d", GLAD_VERSION_MAJOR(version), GLAD_VERSION_MINOR(version)); + //try to get a display display = eglGetDisplay((EGLNativeDisplayType)display); @@ -54,6 +61,8 @@ bool EGLGraphicsContext::init() return false; } + gladLoaderLoadEGL(display); + if (surface == EGL_NO_SURFACE) { EGLint pi32ConfigAttribs[] = { @@ -99,15 +108,15 @@ bool EGLGraphicsContext::init() } if (try_full_gl) { - EGLint contextAttrs[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, - EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR, EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR, + EGLint contextAttrs[] = { EGL_CONTEXT_MAJOR_VERSION, 3, + EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT, EGL_NONE }; context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttrs); if (context != EGL_NO_CONTEXT) { makeCurrent(); - if (gl3wInit()) - ERROR_LOG(RENDERER, "gl3wInit() failed"); + if (!gladLoadGL((GLADloadfunc) eglGetProcAddress)) + ERROR_LOG(RENDERER, "gladLoadGL() failed"); } } #endif @@ -129,22 +138,11 @@ bool EGLGraphicsContext::init() return false; } -#ifdef GLES -// EGL only supports runtime loading with android? TDB - load_gles_symbols(); -#else makeCurrent(); - if (gl3wInit()) - INFO_LOG(RENDERER, "gl3wInit() failed"); -#endif + if (!gladLoadGLES2((GLADloadfunc) eglGetProcAddress)) + ERROR_LOG(RENDERER, "gladLoadGLES2() failed"); } } - else if (glGetError == NULL) - { - // Needed when the context is not created here (Android java mode, iOS) - // Broken atm - load_gles_symbols(); - } if (!makeCurrent()) { @@ -171,13 +169,19 @@ bool EGLGraphicsContext::init() void EGLGraphicsContext::term() { preTerm(); - eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (context != EGL_NO_CONTEXT) - eglDestroyContext(display, context); - if (surface != EGL_NO_SURFACE) - eglDestroySurface(display, surface); + if (display != EGL_NO_DISPLAY) + { + eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (context != EGL_NO_CONTEXT) + eglDestroyContext(display, context); + + if (surface != EGL_NO_SURFACE) + eglDestroySurface(display, surface); + eglTerminate(display); + } context = EGL_NO_CONTEXT; surface = EGL_NO_SURFACE; diff --git a/core/wsi/egl.h b/core/wsi/egl.h index 1f74811db..972111c85 100644 --- a/core/wsi/egl.h +++ b/core/wsi/egl.h @@ -19,23 +19,15 @@ along with Flycast. If not, see . */ #pragma once -#include -#include -#ifndef GLES2 -#include "gl32funcs.h" -#else -extern "C" void load_gles_symbols(); -#endif #include "gl_context.h" #define USE_EGL -#include -#include +#include class EGLGraphicsContext : public GLGraphicsContext { public: - ~EGLGraphicsContext() { term(); } + ~EGLGraphicsContext() override { term(); } bool init(); void term() override; diff --git a/core/wsi/gl32funcs.c b/core/wsi/gl32funcs.c deleted file mode 100644 index 3a66d1d52..000000000 --- a/core/wsi/gl32funcs.c +++ /dev/null @@ -1,772 +0,0 @@ -/* - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#include -#include -#if defined(GLES3) && defined(__ANDROID__) -#include -#endif -#ifdef USE_SDL -#include -#else -#include -#endif -#include "gl32funcs.h" -#include "build.h" - -void load_gles_symbols() -{ -#ifdef GLES3 - for (int i = 0; rglgen_symbol_map[i].sym != NULL; i++) - { -#ifdef USE_SDL - *(void **)rglgen_symbol_map[i].ptr = SDL_GL_GetProcAddress(rglgen_symbol_map[i].sym); -#else -#if defined(__ANDROID__) - //try to load via dlsym -- older android (< 4.4?) can't load everything via eglGetProcAddress - *(void **)rglgen_symbol_map[i].ptr = (void*)dlsym(RTLD_DEFAULT, rglgen_symbol_map[i].sym); - if (*(void **)rglgen_symbol_map[i].ptr == NULL) -#endif - *(void **)rglgen_symbol_map[i].ptr = eglGetProcAddress(rglgen_symbol_map[i].sym); -#endif - } -#endif -} - -#define SYM(x) { "gl" #x, &(gl##x) } -const struct rglgen_sym_map rglgen_symbol_map[] = { - SYM(ActiveTexture), - SYM(AttachShader), - SYM(BindAttribLocation), - SYM(BindBuffer), - SYM(BindFramebuffer), - SYM(BindRenderbuffer), - SYM(BindTexture), - SYM(BlendColor), - SYM(BlendEquation), - SYM(BlendEquationSeparate), - SYM(BlendFunc), - SYM(BlendFuncSeparate), - SYM(BufferData), - SYM(BufferSubData), - SYM(CheckFramebufferStatus), - SYM(Clear), - SYM(ClearColor), - SYM(ClearDepthf), - SYM(ClearStencil), - SYM(ColorMask), - SYM(CompileShader), - SYM(CompressedTexImage2D), - SYM(CompressedTexSubImage2D), - SYM(CopyTexImage2D), - SYM(CopyTexSubImage2D), - SYM(CreateProgram), - SYM(CreateShader), - SYM(CullFace), - SYM(DeleteBuffers), - SYM(DeleteFramebuffers), - SYM(DeleteProgram), - SYM(DeleteRenderbuffers), - SYM(DeleteShader), - SYM(DeleteTextures), - SYM(DepthFunc), - SYM(DepthMask), - SYM(DepthRangef), - SYM(DetachShader), - SYM(Disable), - SYM(DisableVertexAttribArray), - SYM(DrawArrays), - SYM(DrawElements), - SYM(Enable), - SYM(EnableVertexAttribArray), - SYM(Finish), - SYM(Flush), - SYM(FramebufferRenderbuffer), - SYM(FramebufferTexture2D), - SYM(FrontFace), - SYM(GenBuffers), - SYM(GenerateMipmap), - SYM(GenFramebuffers), - SYM(GenRenderbuffers), - SYM(GenTextures), - SYM(GetActiveAttrib), - SYM(GetActiveUniform), - SYM(GetAttachedShaders), - SYM(GetAttribLocation), - SYM(GetBooleanv), - SYM(GetBufferParameteriv), - SYM(GetError), - SYM(GetFloatv), - SYM(GetFramebufferAttachmentParameteriv), - SYM(GetIntegerv), - SYM(GetProgramiv), - SYM(GetProgramInfoLog), - SYM(GetRenderbufferParameteriv), - SYM(GetShaderiv), - SYM(GetShaderInfoLog), - SYM(GetShaderPrecisionFormat), - SYM(GetShaderSource), - SYM(GetString), - SYM(GetTexParameterfv), - SYM(GetTexParameteriv), - SYM(GetUniformfv), - SYM(GetUniformiv), - SYM(GetUniformLocation), - SYM(GetVertexAttribfv), - SYM(GetVertexAttribiv), - SYM(GetVertexAttribPointerv), - SYM(Hint), - SYM(IsBuffer), - SYM(IsEnabled), - SYM(IsFramebuffer), - SYM(IsProgram), - SYM(IsRenderbuffer), - SYM(IsShader), - SYM(IsTexture), - SYM(LineWidth), - SYM(LinkProgram), - SYM(PixelStorei), - SYM(PolygonOffset), - SYM(ReadPixels), - SYM(ReleaseShaderCompiler), - SYM(RenderbufferStorage), - SYM(SampleCoverage), - SYM(Scissor), - SYM(ShaderBinary), - SYM(ShaderSource), - SYM(StencilFunc), - SYM(StencilFuncSeparate), - SYM(StencilMask), - SYM(StencilMaskSeparate), - SYM(StencilOp), - SYM(StencilOpSeparate), - SYM(TexImage2D), - SYM(TexParameterf), - SYM(TexParameterfv), - SYM(TexParameteri), - SYM(TexParameteriv), - SYM(TexSubImage2D), - SYM(Uniform1f), - SYM(Uniform1fv), - SYM(Uniform1i), - SYM(Uniform1iv), - SYM(Uniform2f), - SYM(Uniform2fv), - SYM(Uniform2i), - SYM(Uniform2iv), - SYM(Uniform3f), - SYM(Uniform3fv), - SYM(Uniform3i), - SYM(Uniform3iv), - SYM(Uniform4f), - SYM(Uniform4fv), - SYM(Uniform4i), - SYM(Uniform4iv), - SYM(UniformMatrix2fv), - SYM(UniformMatrix3fv), - SYM(UniformMatrix4fv), - SYM(UseProgram), - SYM(ValidateProgram), - SYM(VertexAttrib1f), - SYM(VertexAttrib1fv), - SYM(VertexAttrib2f), - SYM(VertexAttrib2fv), - SYM(VertexAttrib3f), - SYM(VertexAttrib3fv), - SYM(VertexAttrib4f), - SYM(VertexAttrib4fv), - SYM(VertexAttribPointer), - SYM(Viewport), - SYM(ReadBuffer), - SYM(DrawRangeElements), - SYM(TexImage3D), - SYM(TexSubImage3D), - SYM(CopyTexSubImage3D), - SYM(CompressedTexImage3D), - SYM(CompressedTexSubImage3D), - SYM(GenQueries), - SYM(DeleteQueries), - SYM(IsQuery), - SYM(BeginQuery), - SYM(EndQuery), - SYM(GetQueryiv), - SYM(GetQueryObjectuiv), - SYM(UnmapBuffer), - SYM(GetBufferPointerv), - SYM(DrawBuffers), - SYM(UniformMatrix2x3fv), - SYM(UniformMatrix3x2fv), - SYM(UniformMatrix2x4fv), - SYM(UniformMatrix4x2fv), - SYM(UniformMatrix3x4fv), - SYM(UniformMatrix4x3fv), - SYM(BlitFramebuffer), - SYM(RenderbufferStorageMultisample), - SYM(FramebufferTextureLayer), - SYM(MapBufferRange), - SYM(FlushMappedBufferRange), - SYM(BindVertexArray), - SYM(DeleteVertexArrays), - SYM(GenVertexArrays), - SYM(IsVertexArray), - SYM(GetIntegeri_v), - SYM(BeginTransformFeedback), - SYM(EndTransformFeedback), - SYM(BindBufferRange), - SYM(BindBufferBase), - SYM(TransformFeedbackVaryings), - SYM(GetTransformFeedbackVarying), - SYM(VertexAttribIPointer), - SYM(GetVertexAttribIiv), - SYM(GetVertexAttribIuiv), - SYM(VertexAttribI4i), - SYM(VertexAttribI4ui), - SYM(VertexAttribI4iv), - SYM(VertexAttribI4uiv), - SYM(GetUniformuiv), - SYM(GetFragDataLocation), - SYM(Uniform1ui), - SYM(Uniform2ui), - SYM(Uniform3ui), - SYM(Uniform4ui), - SYM(Uniform1uiv), - SYM(Uniform2uiv), - SYM(Uniform3uiv), - SYM(Uniform4uiv), - SYM(ClearBufferiv), - SYM(ClearBufferuiv), - SYM(ClearBufferfv), - SYM(ClearBufferfi), - SYM(GetStringi), - SYM(CopyBufferSubData), - SYM(GetUniformIndices), - SYM(GetActiveUniformsiv), - SYM(GetUniformBlockIndex), - SYM(GetActiveUniformBlockiv), - SYM(GetActiveUniformBlockName), - SYM(UniformBlockBinding), - SYM(DrawArraysInstanced), - SYM(DrawElementsInstanced), - SYM(FenceSync), - SYM(IsSync), - SYM(DeleteSync), - SYM(ClientWaitSync), - SYM(WaitSync), - SYM(GetInteger64v), - SYM(GetSynciv), - SYM(GetInteger64i_v), - SYM(GetBufferParameteri64v), - SYM(GenSamplers), - SYM(DeleteSamplers), - SYM(IsSampler), - SYM(BindSampler), - SYM(SamplerParameteri), - SYM(SamplerParameteriv), - SYM(SamplerParameterf), - SYM(SamplerParameterfv), - SYM(GetSamplerParameteriv), - SYM(GetSamplerParameterfv), - SYM(VertexAttribDivisor), - SYM(BindTransformFeedback), - SYM(DeleteTransformFeedbacks), - SYM(GenTransformFeedbacks), - SYM(IsTransformFeedback), - SYM(PauseTransformFeedback), - SYM(ResumeTransformFeedback), - SYM(GetProgramBinary), - SYM(ProgramBinary), - SYM(ProgramParameteri), - SYM(InvalidateFramebuffer), - SYM(InvalidateSubFramebuffer), - SYM(TexStorage2D), - SYM(TexStorage3D), - SYM(GetInternalformativ), - SYM(DispatchCompute), - SYM(DispatchComputeIndirect), - SYM(DrawArraysIndirect), - SYM(DrawElementsIndirect), - SYM(FramebufferParameteri), - SYM(GetFramebufferParameteriv), - SYM(GetProgramInterfaceiv), - SYM(GetProgramResourceIndex), - SYM(GetProgramResourceName), - SYM(GetProgramResourceiv), - SYM(GetProgramResourceLocation), - SYM(UseProgramStages), - SYM(ActiveShaderProgram), - SYM(CreateShaderProgramv), - SYM(BindProgramPipeline), - SYM(DeleteProgramPipelines), - SYM(GenProgramPipelines), - SYM(IsProgramPipeline), - SYM(GetProgramPipelineiv), - SYM(ProgramUniform1i), - SYM(ProgramUniform2i), - SYM(ProgramUniform3i), - SYM(ProgramUniform4i), - SYM(ProgramUniform1ui), - SYM(ProgramUniform2ui), - SYM(ProgramUniform3ui), - SYM(ProgramUniform4ui), - SYM(ProgramUniform1f), - SYM(ProgramUniform2f), - SYM(ProgramUniform3f), - SYM(ProgramUniform4f), - SYM(ProgramUniform1iv), - SYM(ProgramUniform2iv), - SYM(ProgramUniform3iv), - SYM(ProgramUniform4iv), - SYM(ProgramUniform1uiv), - SYM(ProgramUniform2uiv), - SYM(ProgramUniform3uiv), - SYM(ProgramUniform4uiv), - SYM(ProgramUniform1fv), - SYM(ProgramUniform2fv), - SYM(ProgramUniform3fv), - SYM(ProgramUniform4fv), - SYM(ProgramUniformMatrix2fv), - SYM(ProgramUniformMatrix3fv), - SYM(ProgramUniformMatrix4fv), - SYM(ProgramUniformMatrix2x3fv), - SYM(ProgramUniformMatrix3x2fv), - SYM(ProgramUniformMatrix2x4fv), - SYM(ProgramUniformMatrix4x2fv), - SYM(ProgramUniformMatrix3x4fv), - SYM(ProgramUniformMatrix4x3fv), - SYM(ValidateProgramPipeline), - SYM(GetProgramPipelineInfoLog), - SYM(BindImageTexture), - SYM(GetBooleani_v), - SYM(MemoryBarrier), - SYM(MemoryBarrierByRegion), - SYM(TexStorage2DMultisample), - SYM(GetMultisamplefv), - SYM(SampleMaski), - SYM(GetTexLevelParameteriv), - SYM(GetTexLevelParameterfv), - SYM(BindVertexBuffer), - SYM(VertexAttribFormat), - SYM(VertexAttribIFormat), - SYM(VertexAttribBinding), - SYM(VertexBindingDivisor), - SYM(BlendBarrier), - SYM(CopyImageSubData), - SYM(DebugMessageControl), - SYM(DebugMessageInsert), - SYM(DebugMessageCallback), - SYM(GetDebugMessageLog), - SYM(PushDebugGroup), - SYM(PopDebugGroup), - SYM(ObjectLabel), - SYM(GetObjectLabel), - SYM(ObjectPtrLabel), - SYM(GetObjectPtrLabel), - SYM(GetPointerv), - SYM(Enablei), - SYM(Disablei), - SYM(BlendEquationi), - SYM(BlendEquationSeparatei), - SYM(BlendFunci), - SYM(BlendFuncSeparatei), - SYM(ColorMaski), - SYM(IsEnabledi), - SYM(DrawElementsBaseVertex), - SYM(DrawRangeElementsBaseVertex), - SYM(DrawElementsInstancedBaseVertex), - SYM(FramebufferTexture), - SYM(PrimitiveBoundingBox), - SYM(GetGraphicsResetStatus), - SYM(ReadnPixels), - SYM(GetnUniformfv), - SYM(GetnUniformiv), - SYM(GetnUniformuiv), - SYM(MinSampleShading), - SYM(PatchParameteri), - SYM(TexParameterIiv), - SYM(TexParameterIuiv), - SYM(GetTexParameterIiv), - SYM(GetTexParameterIuiv), - SYM(SamplerParameterIiv), - SYM(SamplerParameterIuiv), - SYM(GetSamplerParameterIiv), - SYM(GetSamplerParameterIuiv), - SYM(TexBuffer), - SYM(TexBufferRange), - SYM(TexStorage3DMultisample), - - { NULL, NULL }, -}; -RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; -RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; -RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; -RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; -RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; -RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; -RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; -RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; -RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; -RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; -RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; -RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; -RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; -RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; -RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; -RGLSYMGLCLEARPROC __rglgen_glClear; -RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; -RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; -RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; -RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; -RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; -RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; -RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; -RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; -RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; -RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; -RGLSYMGLCULLFACEPROC __rglgen_glCullFace; -RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; -RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; -RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; -RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; -RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; -RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; -RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; -RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; -RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; -RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; -RGLSYMGLDISABLEPROC __rglgen_glDisable; -RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; -RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; -RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; -RGLSYMGLENABLEPROC __rglgen_glEnable; -RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; -RGLSYMGLFINISHPROC __rglgen_glFinish; -RGLSYMGLFLUSHPROC __rglgen_glFlush; -RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; -RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; -RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; -RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; -RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; -RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; -RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; -RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; -RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; -RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; -RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; -RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; -RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; -RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; -RGLSYMGLGETERRORPROC __rglgen_glGetError; -RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; -RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; -RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; -RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; -RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; -RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; -RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; -RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; -RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; -RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; -RGLSYMGLGETSTRINGPROC __rglgen_glGetString; -RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; -RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; -RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; -RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; -RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; -RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; -RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; -RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; -RGLSYMGLHINTPROC __rglgen_glHint; -RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; -RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; -RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; -RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; -RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; -RGLSYMGLISSHADERPROC __rglgen_glIsShader; -RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; -RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; -RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; -RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; -RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; -RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; -RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; -RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; -RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; -RGLSYMGLSCISSORPROC __rglgen_glScissor; -RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; -RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; -RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; -RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; -RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; -RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; -RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; -RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; -RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; -RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; -RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; -RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; -RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; -RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; -RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; -RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; -RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; -RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; -RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; -RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; -RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; -RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; -RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; -RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; -RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; -RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; -RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; -RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; -RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; -RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; -RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; -RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; -RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; -RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; -RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; -RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; -RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; -RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; -RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; -RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; -RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; -RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; -RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; -RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; -RGLSYMGLVIEWPORTPROC __rglgen_glViewport; -RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; -RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; -RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; -RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; -RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; -RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; -RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; -RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; -RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; -RGLSYMGLISQUERYPROC __rglgen_glIsQuery; -RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; -RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; -RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; -RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; -RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; -RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; -RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; -RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; -RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; -RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; -RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; -RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; -RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; -RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; -RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; -RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; -RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; -RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; -RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; -RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; -RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; -RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; -RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; -RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; -RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; -RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; -RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; -RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; -RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; -RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; -RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; -RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; -RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; -RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; -RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; -RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; -RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; -RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; -RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; -RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; -RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; -RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; -RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; -RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; -RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; -RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; -RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; -RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; -RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; -RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; -RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; -RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; -RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; -RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; -RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; -RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; -RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; -RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; -RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; -RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; -RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; -RGLSYMGLISSYNCPROC __rglgen_glIsSync; -RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; -RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; -RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; -RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; -RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; -RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; -RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; -RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; -RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; -RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; -RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; -RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; -RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; -RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; -RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; -RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; -RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; -RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; -RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; -RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; -RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; -RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; -RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; -RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; -RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; -RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; -RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; -RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; -RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; -RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; -RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; -RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; -RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; -RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; -RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; -RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; -RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; -RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; -RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; -RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; -RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; -RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; -RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; -RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; -RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; -RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; -RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; -RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; -RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; -RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; -RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; -RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; -RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; -RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; -RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; -RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; -RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; -RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; -RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; -RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; -RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; -RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; -RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; -RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; -RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; -RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; -RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; -RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; -RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; -RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; -RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; -RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; -RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; -RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; -RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; -RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; -RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; -RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; -RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; -RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; -RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; -RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; -RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; -RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; -RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; -RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; -RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; -RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; -RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; -RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; -RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; -RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; -RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; -RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; -RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; -RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; -RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; -RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; -RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; -RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; -RGLSYMGLBLENDBARRIERPROC __rglgen_glBlendBarrier; -RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; -RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; -RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; -RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; -RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; -RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; -RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; -RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; -RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; -RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; -RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; -RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; -RGLSYMGLENABLEIPROC __rglgen_glEnablei; -RGLSYMGLDISABLEIPROC __rglgen_glDisablei; -RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; -RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; -RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; -RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; -RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; -RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; -RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; -RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; -RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; -RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; -RGLSYMGLPRIMITIVEBOUNDINGBOXPROC __rglgen_glPrimitiveBoundingBox; -RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; -RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; -RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; -RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; -RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; -RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; -RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; -RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; -RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; -RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; -RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; -RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; -RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; -RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; -RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; -RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; -RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; -RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; - diff --git a/core/wsi/gl32funcs.h b/core/wsi/gl32funcs.h deleted file mode 100644 index 931914c9f..000000000 --- a/core/wsi/gl32funcs.h +++ /dev/null @@ -1,1112 +0,0 @@ -/* - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -void load_gles_symbols(); - -typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); -typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); - -typedef void (GL_APIENTRYP RGLSYMGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (GL_APIENTRYP RGLSYMGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP RGLSYMGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (GL_APIENTRYP RGLSYMGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (GL_APIENTRYP RGLSYMGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (GL_APIENTRYP RGLSYMGLBINDTEXTUREPROC) (GLenum target, GLuint texture); -typedef void (GL_APIENTRYP RGLSYMGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (GL_APIENTRYP RGLSYMGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); -typedef void (GL_APIENTRYP RGLSYMGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -typedef GLenum (GL_APIENTRYP RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLCLEARPROC) (GLbitfield mask); -typedef void (GL_APIENTRYP RGLSYMGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (GL_APIENTRYP RGLSYMGLCLEARDEPTHFPROC) (GLfloat d); -typedef void (GL_APIENTRYP RGLSYMGLCLEARSTENCILPROC) (GLint s); -typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GL_APIENTRYP RGLSYMGLCOMPILESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLuint (GL_APIENTRYP RGLSYMGLCREATEPROGRAMPROC) (void); -typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROC) (GLenum type); -typedef void (GL_APIENTRYP RGLSYMGLCULLFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (GL_APIENTRYP RGLSYMGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (GL_APIENTRYP RGLSYMGLDELETESHADERPROC) (GLuint shader); -typedef void (GL_APIENTRYP RGLSYMGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); -typedef void (GL_APIENTRYP RGLSYMGLDEPTHFUNCPROC) (GLenum func); -typedef void (GL_APIENTRYP RGLSYMGLDEPTHMASKPROC) (GLboolean flag); -typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (GL_APIENTRYP RGLSYMGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (GL_APIENTRYP RGLSYMGLDISABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); -typedef void (GL_APIENTRYP RGLSYMGLENABLEPROC) (GLenum cap); -typedef void (GL_APIENTRYP RGLSYMGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLFINISHPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLFLUSHPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GL_APIENTRYP RGLSYMGLFRONTFACEPROC) (GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef void (GL_APIENTRYP RGLSYMGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef void (GL_APIENTRYP RGLSYMGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (GL_APIENTRYP RGLSYMGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); -typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -typedef GLint (GL_APIENTRYP RGLSYMGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLenum (GL_APIENTRYP RGLSYMGLGETERRORPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLGETFLOATVPROC) (GLenum pname, GLfloat *data); -typedef void (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERVPROC) (GLenum pname, GLint *data); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP RGLSYMGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (GL_APIENTRYP RGLSYMGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef const GLubyte *(GL_APIENTRYP RGLSYMGLGETSTRINGPROC) (GLenum name); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef GLint (GL_APIENTRYP RGLSYMGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); -typedef void (GL_APIENTRYP RGLSYMGLHINTPROC) (GLenum target, GLenum mode); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISBUFFERPROC) (GLuint buffer); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDPROC) (GLenum cap); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISSHADERPROC) (GLuint shader); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISTEXTUREPROC) (GLuint texture); -typedef void (GL_APIENTRYP RGLSYMGLLINEWIDTHPROC) (GLfloat width); -typedef void (GL_APIENTRYP RGLSYMGLLINKPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLPIXELSTOREIPROC) (GLenum pname, GLint param); -typedef void (GL_APIENTRYP RGLSYMGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); -typedef void (GL_APIENTRYP RGLSYMGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLRELEASESHADERCOMPILERPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (GL_APIENTRYP RGLSYMGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); -typedef void (GL_APIENTRYP RGLSYMGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILMASKPROC) (GLuint mask); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); -typedef void (GL_APIENTRYP RGLSYMGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLREADBUFFERPROC) (GLenum src); -typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -typedef void (GL_APIENTRYP RGLSYMGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (GL_APIENTRYP RGLSYMGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISQUERYPROC) (GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLENDQUERYPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef GLboolean (GL_APIENTRYP RGLSYMGLUNMAPBUFFERPROC) (GLenum target); -typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); -typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GL_APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (GL_APIENTRYP RGLSYMGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (GL_APIENTRYP RGLSYMGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISVERTEXARRAYPROC) (GLuint array); -typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (GL_APIENTRYP RGLSYMGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (GL_APIENTRYP RGLSYMGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP RGLSYMGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (GL_APIENTRYP RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -typedef void (GL_APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef GLint (GL_APIENTRYP RGLSYMGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte *(GL_APIENTRYP RGLSYMGLGETSTRINGIPROC) (GLenum name, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GL_APIENTRYP RGLSYMGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef GLuint (GL_APIENTRYP RGLSYMGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (GL_APIENTRYP RGLSYMGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -typedef GLsync (GL_APIENTRYP RGLSYMGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISSYNCPROC) (GLsync sync); -typedef void (GL_APIENTRYP RGLSYMGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (GL_APIENTRYP RGLSYMGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP RGLSYMGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GL_APIENTRYP RGLSYMGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); -typedef void (GL_APIENTRYP RGLSYMGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (GL_APIENTRYP RGLSYMGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (GL_APIENTRYP RGLSYMGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (GL_APIENTRYP RGLSYMGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISSAMPLERPROC) (GLuint sampler); -typedef void (GL_APIENTRYP RGLSYMGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -typedef void (GL_APIENTRYP RGLSYMGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (GL_APIENTRYP RGLSYMGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (GL_APIENTRYP RGLSYMGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -typedef void (GL_APIENTRYP RGLSYMGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (GL_APIENTRYP RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (GL_APIENTRYP RGLSYMGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (GL_APIENTRYP RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (GL_APIENTRYP RGLSYMGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); -typedef void (GL_APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (GL_APIENTRYP RGLSYMGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (GL_APIENTRYP RGLSYMGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (GL_APIENTRYP RGLSYMGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (GL_APIENTRYP RGLSYMGLGETBOOLEANVPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (GL_APIENTRYP RGLSYMGLMEMORYBARRIERPROC) (GLbitfield barriers); -typedef void (GL_APIENTRYP RGLSYMGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (GL_APIENTRYP RGLSYMGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (GL_APIENTRYP RGLSYMGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -typedef void (GL_APIENTRYP RGLSYMGLBLENDBARRIERPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKPROC) (RGLGENGLDEBUGPROC callback, const void *userParam); -typedef GLuint (GL_APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (GL_APIENTRYP RGLSYMGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (GL_APIENTRYP RGLSYMGLPOPDEBUGGROUPPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (GL_APIENTRYP RGLSYMGLGETPOINTERVPROC) (GLenum pname, void **params); -typedef void (GL_APIENTRYP RGLSYMGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDISABLEIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); -typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSPROC) (void); -typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); - -#define glActiveTexture __rglgen_glActiveTexture -#define glAttachShader __rglgen_glAttachShader -#define glBindAttribLocation __rglgen_glBindAttribLocation -#define glBindBuffer __rglgen_glBindBuffer -#define glBindFramebuffer __rglgen_glBindFramebuffer -#define glBindRenderbuffer __rglgen_glBindRenderbuffer -#define glBindTexture __rglgen_glBindTexture -#define glBlendColor __rglgen_glBlendColor -#define glBlendEquation __rglgen_glBlendEquation -#define glBlendEquationSeparate __rglgen_glBlendEquationSeparate -#define glBlendFunc __rglgen_glBlendFunc -#define glBlendFuncSeparate __rglgen_glBlendFuncSeparate -#define glBufferData __rglgen_glBufferData -#define glBufferSubData __rglgen_glBufferSubData -#define glCheckFramebufferStatus __rglgen_glCheckFramebufferStatus -#define glClear __rglgen_glClear -#define glClearColor __rglgen_glClearColor -#define glClearDepthf __rglgen_glClearDepthf -#define glClearStencil __rglgen_glClearStencil -#define glColorMask __rglgen_glColorMask -#define glCompileShader __rglgen_glCompileShader -#define glCompressedTexImage2D __rglgen_glCompressedTexImage2D -#define glCompressedTexSubImage2D __rglgen_glCompressedTexSubImage2D -#define glCopyTexImage2D __rglgen_glCopyTexImage2D -#define glCopyTexSubImage2D __rglgen_glCopyTexSubImage2D -#define glCreateProgram __rglgen_glCreateProgram -#define glCreateShader __rglgen_glCreateShader -#define glCullFace __rglgen_glCullFace -#define glDeleteBuffers __rglgen_glDeleteBuffers -#define glDeleteFramebuffers __rglgen_glDeleteFramebuffers -#define glDeleteProgram __rglgen_glDeleteProgram -#define glDeleteRenderbuffers __rglgen_glDeleteRenderbuffers -#define glDeleteShader __rglgen_glDeleteShader -#define glDeleteTextures __rglgen_glDeleteTextures -#define glDepthFunc __rglgen_glDepthFunc -#define glDepthMask __rglgen_glDepthMask -#define glDepthRangef __rglgen_glDepthRangef -#define glDetachShader __rglgen_glDetachShader -#define glDisable __rglgen_glDisable -#define glDisableVertexAttribArray __rglgen_glDisableVertexAttribArray -#define glDrawArrays __rglgen_glDrawArrays -#define glDrawElements __rglgen_glDrawElements -#define glEnable __rglgen_glEnable -#define glEnableVertexAttribArray __rglgen_glEnableVertexAttribArray -#define glFinish __rglgen_glFinish -#define glFlush __rglgen_glFlush -#define glFramebufferRenderbuffer __rglgen_glFramebufferRenderbuffer -#define glFramebufferTexture2D __rglgen_glFramebufferTexture2D -#define glFrontFace __rglgen_glFrontFace -#define glGenBuffers __rglgen_glGenBuffers -#define glGenerateMipmap __rglgen_glGenerateMipmap -#define glGenFramebuffers __rglgen_glGenFramebuffers -#define glGenRenderbuffers __rglgen_glGenRenderbuffers -#define glGenTextures __rglgen_glGenTextures -#define glGetActiveAttrib __rglgen_glGetActiveAttrib -#define glGetActiveUniform __rglgen_glGetActiveUniform -#define glGetAttachedShaders __rglgen_glGetAttachedShaders -#define glGetAttribLocation __rglgen_glGetAttribLocation -#define glGetBooleanv __rglgen_glGetBooleanv -#define glGetBufferParameteriv __rglgen_glGetBufferParameteriv -#define glGetError __rglgen_glGetError -#define glGetFloatv __rglgen_glGetFloatv -#define glGetFramebufferAttachmentParameteriv __rglgen_glGetFramebufferAttachmentParameteriv -#define glGetIntegerv __rglgen_glGetIntegerv -#define glGetProgramiv __rglgen_glGetProgramiv -#define glGetProgramInfoLog __rglgen_glGetProgramInfoLog -#define glGetRenderbufferParameteriv __rglgen_glGetRenderbufferParameteriv -#define glGetShaderiv __rglgen_glGetShaderiv -#define glGetShaderInfoLog __rglgen_glGetShaderInfoLog -#define glGetShaderPrecisionFormat __rglgen_glGetShaderPrecisionFormat -#define glGetShaderSource __rglgen_glGetShaderSource -#define glGetString __rglgen_glGetString -#define glGetTexParameterfv __rglgen_glGetTexParameterfv -#define glGetTexParameteriv __rglgen_glGetTexParameteriv -#define glGetUniformfv __rglgen_glGetUniformfv -#define glGetUniformiv __rglgen_glGetUniformiv -#define glGetUniformLocation __rglgen_glGetUniformLocation -#define glGetVertexAttribfv __rglgen_glGetVertexAttribfv -#define glGetVertexAttribiv __rglgen_glGetVertexAttribiv -#define glGetVertexAttribPointerv __rglgen_glGetVertexAttribPointerv -#define glHint __rglgen_glHint -#define glIsBuffer __rglgen_glIsBuffer -#define glIsEnabled __rglgen_glIsEnabled -#define glIsFramebuffer __rglgen_glIsFramebuffer -#define glIsProgram __rglgen_glIsProgram -#define glIsRenderbuffer __rglgen_glIsRenderbuffer -#define glIsShader __rglgen_glIsShader -#define glIsTexture __rglgen_glIsTexture -#define glLineWidth __rglgen_glLineWidth -#define glLinkProgram __rglgen_glLinkProgram -#define glPixelStorei __rglgen_glPixelStorei -#define glPolygonOffset __rglgen_glPolygonOffset -#define glReadPixels __rglgen_glReadPixels -#define glReleaseShaderCompiler __rglgen_glReleaseShaderCompiler -#define glRenderbufferStorage __rglgen_glRenderbufferStorage -#define glSampleCoverage __rglgen_glSampleCoverage -#define glScissor __rglgen_glScissor -#define glShaderBinary __rglgen_glShaderBinary -#define glShaderSource __rglgen_glShaderSource -#define glStencilFunc __rglgen_glStencilFunc -#define glStencilFuncSeparate __rglgen_glStencilFuncSeparate -#define glStencilMask __rglgen_glStencilMask -#define glStencilMaskSeparate __rglgen_glStencilMaskSeparate -#define glStencilOp __rglgen_glStencilOp -#define glStencilOpSeparate __rglgen_glStencilOpSeparate -#define glTexImage2D __rglgen_glTexImage2D -#define glTexParameterf __rglgen_glTexParameterf -#define glTexParameterfv __rglgen_glTexParameterfv -#define glTexParameteri __rglgen_glTexParameteri -#define glTexParameteriv __rglgen_glTexParameteriv -#define glTexSubImage2D __rglgen_glTexSubImage2D -#define glUniform1f __rglgen_glUniform1f -#define glUniform1fv __rglgen_glUniform1fv -#define glUniform1i __rglgen_glUniform1i -#define glUniform1iv __rglgen_glUniform1iv -#define glUniform2f __rglgen_glUniform2f -#define glUniform2fv __rglgen_glUniform2fv -#define glUniform2i __rglgen_glUniform2i -#define glUniform2iv __rglgen_glUniform2iv -#define glUniform3f __rglgen_glUniform3f -#define glUniform3fv __rglgen_glUniform3fv -#define glUniform3i __rglgen_glUniform3i -#define glUniform3iv __rglgen_glUniform3iv -#define glUniform4f __rglgen_glUniform4f -#define glUniform4fv __rglgen_glUniform4fv -#define glUniform4i __rglgen_glUniform4i -#define glUniform4iv __rglgen_glUniform4iv -#define glUniformMatrix2fv __rglgen_glUniformMatrix2fv -#define glUniformMatrix3fv __rglgen_glUniformMatrix3fv -#define glUniformMatrix4fv __rglgen_glUniformMatrix4fv -#define glUseProgram __rglgen_glUseProgram -#define glValidateProgram __rglgen_glValidateProgram -#define glVertexAttrib1f __rglgen_glVertexAttrib1f -#define glVertexAttrib1fv __rglgen_glVertexAttrib1fv -#define glVertexAttrib2f __rglgen_glVertexAttrib2f -#define glVertexAttrib2fv __rglgen_glVertexAttrib2fv -#define glVertexAttrib3f __rglgen_glVertexAttrib3f -#define glVertexAttrib3fv __rglgen_glVertexAttrib3fv -#define glVertexAttrib4f __rglgen_glVertexAttrib4f -#define glVertexAttrib4fv __rglgen_glVertexAttrib4fv -#define glVertexAttribPointer __rglgen_glVertexAttribPointer -#define glViewport __rglgen_glViewport -#define glReadBuffer __rglgen_glReadBuffer -#define glDrawRangeElements __rglgen_glDrawRangeElements -#define glTexImage3D __rglgen_glTexImage3D -#define glTexSubImage3D __rglgen_glTexSubImage3D -#define glCopyTexSubImage3D __rglgen_glCopyTexSubImage3D -#define glCompressedTexImage3D __rglgen_glCompressedTexImage3D -#define glCompressedTexSubImage3D __rglgen_glCompressedTexSubImage3D -#define glGenQueries __rglgen_glGenQueries -#define glDeleteQueries __rglgen_glDeleteQueries -#define glIsQuery __rglgen_glIsQuery -#define glBeginQuery __rglgen_glBeginQuery -#define glEndQuery __rglgen_glEndQuery -#define glGetQueryiv __rglgen_glGetQueryiv -#define glGetQueryObjectuiv __rglgen_glGetQueryObjectuiv -#define glUnmapBuffer __rglgen_glUnmapBuffer -#define glGetBufferPointerv __rglgen_glGetBufferPointerv -#define glDrawBuffers __rglgen_glDrawBuffers -#define glUniformMatrix2x3fv __rglgen_glUniformMatrix2x3fv -#define glUniformMatrix3x2fv __rglgen_glUniformMatrix3x2fv -#define glUniformMatrix2x4fv __rglgen_glUniformMatrix2x4fv -#define glUniformMatrix4x2fv __rglgen_glUniformMatrix4x2fv -#define glUniformMatrix3x4fv __rglgen_glUniformMatrix3x4fv -#define glUniformMatrix4x3fv __rglgen_glUniformMatrix4x3fv -#define glBlitFramebuffer __rglgen_glBlitFramebuffer -#define glRenderbufferStorageMultisample __rglgen_glRenderbufferStorageMultisample -#define glFramebufferTextureLayer __rglgen_glFramebufferTextureLayer -#define glMapBufferRange __rglgen_glMapBufferRange -#define glFlushMappedBufferRange __rglgen_glFlushMappedBufferRange -#define glBindVertexArray __rglgen_glBindVertexArray -#define glDeleteVertexArrays __rglgen_glDeleteVertexArrays -#define glGenVertexArrays __rglgen_glGenVertexArrays -#define glIsVertexArray __rglgen_glIsVertexArray -#define glGetIntegeri_v __rglgen_glGetIntegeri_v -#define glBeginTransformFeedback __rglgen_glBeginTransformFeedback -#define glEndTransformFeedback __rglgen_glEndTransformFeedback -#define glBindBufferRange __rglgen_glBindBufferRange -#define glBindBufferBase __rglgen_glBindBufferBase -#define glTransformFeedbackVaryings __rglgen_glTransformFeedbackVaryings -#define glGetTransformFeedbackVarying __rglgen_glGetTransformFeedbackVarying -#define glVertexAttribIPointer __rglgen_glVertexAttribIPointer -#define glGetVertexAttribIiv __rglgen_glGetVertexAttribIiv -#define glGetVertexAttribIuiv __rglgen_glGetVertexAttribIuiv -#define glVertexAttribI4i __rglgen_glVertexAttribI4i -#define glVertexAttribI4ui __rglgen_glVertexAttribI4ui -#define glVertexAttribI4iv __rglgen_glVertexAttribI4iv -#define glVertexAttribI4uiv __rglgen_glVertexAttribI4uiv -#define glGetUniformuiv __rglgen_glGetUniformuiv -#define glGetFragDataLocation __rglgen_glGetFragDataLocation -#define glUniform1ui __rglgen_glUniform1ui -#define glUniform2ui __rglgen_glUniform2ui -#define glUniform3ui __rglgen_glUniform3ui -#define glUniform4ui __rglgen_glUniform4ui -#define glUniform1uiv __rglgen_glUniform1uiv -#define glUniform2uiv __rglgen_glUniform2uiv -#define glUniform3uiv __rglgen_glUniform3uiv -#define glUniform4uiv __rglgen_glUniform4uiv -#define glClearBufferiv __rglgen_glClearBufferiv -#define glClearBufferuiv __rglgen_glClearBufferuiv -#define glClearBufferfv __rglgen_glClearBufferfv -#define glClearBufferfi __rglgen_glClearBufferfi -#define glGetStringi __rglgen_glGetStringi -#define glCopyBufferSubData __rglgen_glCopyBufferSubData -#define glGetUniformIndices __rglgen_glGetUniformIndices -#define glGetActiveUniformsiv __rglgen_glGetActiveUniformsiv -#define glGetUniformBlockIndex __rglgen_glGetUniformBlockIndex -#define glGetActiveUniformBlockiv __rglgen_glGetActiveUniformBlockiv -#define glGetActiveUniformBlockName __rglgen_glGetActiveUniformBlockName -#define glUniformBlockBinding __rglgen_glUniformBlockBinding -#define glDrawArraysInstanced __rglgen_glDrawArraysInstanced -#define glDrawElementsInstanced __rglgen_glDrawElementsInstanced -#define glFenceSync __rglgen_glFenceSync -#define glIsSync __rglgen_glIsSync -#define glDeleteSync __rglgen_glDeleteSync -#define glClientWaitSync __rglgen_glClientWaitSync -#define glWaitSync __rglgen_glWaitSync -#define glGetInteger64v __rglgen_glGetInteger64v -#define glGetSynciv __rglgen_glGetSynciv -#define glGetInteger64i_v __rglgen_glGetInteger64i_v -#define glGetBufferParameteri64v __rglgen_glGetBufferParameteri64v -#define glGenSamplers __rglgen_glGenSamplers -#define glDeleteSamplers __rglgen_glDeleteSamplers -#define glIsSampler __rglgen_glIsSampler -#define glBindSampler __rglgen_glBindSampler -#define glSamplerParameteri __rglgen_glSamplerParameteri -#define glSamplerParameteriv __rglgen_glSamplerParameteriv -#define glSamplerParameterf __rglgen_glSamplerParameterf -#define glSamplerParameterfv __rglgen_glSamplerParameterfv -#define glGetSamplerParameteriv __rglgen_glGetSamplerParameteriv -#define glGetSamplerParameterfv __rglgen_glGetSamplerParameterfv -#define glVertexAttribDivisor __rglgen_glVertexAttribDivisor -#define glBindTransformFeedback __rglgen_glBindTransformFeedback -#define glDeleteTransformFeedbacks __rglgen_glDeleteTransformFeedbacks -#define glGenTransformFeedbacks __rglgen_glGenTransformFeedbacks -#define glIsTransformFeedback __rglgen_glIsTransformFeedback -#define glPauseTransformFeedback __rglgen_glPauseTransformFeedback -#define glResumeTransformFeedback __rglgen_glResumeTransformFeedback -#define glGetProgramBinary __rglgen_glGetProgramBinary -#define glProgramBinary __rglgen_glProgramBinary -#define glProgramParameteri __rglgen_glProgramParameteri -#define glInvalidateFramebuffer __rglgen_glInvalidateFramebuffer -#define glInvalidateSubFramebuffer __rglgen_glInvalidateSubFramebuffer -#define glTexStorage2D __rglgen_glTexStorage2D -#define glTexStorage3D __rglgen_glTexStorage3D -#define glGetInternalformativ __rglgen_glGetInternalformativ -#define glDispatchCompute __rglgen_glDispatchCompute -#define glDispatchComputeIndirect __rglgen_glDispatchComputeIndirect -#define glDrawArraysIndirect __rglgen_glDrawArraysIndirect -#define glDrawElementsIndirect __rglgen_glDrawElementsIndirect -#define glFramebufferParameteri __rglgen_glFramebufferParameteri -#define glGetFramebufferParameteriv __rglgen_glGetFramebufferParameteriv -#define glGetProgramInterfaceiv __rglgen_glGetProgramInterfaceiv -#define glGetProgramResourceIndex __rglgen_glGetProgramResourceIndex -#define glGetProgramResourceName __rglgen_glGetProgramResourceName -#define glGetProgramResourceiv __rglgen_glGetProgramResourceiv -#define glGetProgramResourceLocation __rglgen_glGetProgramResourceLocation -#define glUseProgramStages __rglgen_glUseProgramStages -#define glActiveShaderProgram __rglgen_glActiveShaderProgram -#define glCreateShaderProgramv __rglgen_glCreateShaderProgramv -#define glBindProgramPipeline __rglgen_glBindProgramPipeline -#define glDeleteProgramPipelines __rglgen_glDeleteProgramPipelines -#define glGenProgramPipelines __rglgen_glGenProgramPipelines -#define glIsProgramPipeline __rglgen_glIsProgramPipeline -#define glGetProgramPipelineiv __rglgen_glGetProgramPipelineiv -#define glProgramUniform1i __rglgen_glProgramUniform1i -#define glProgramUniform2i __rglgen_glProgramUniform2i -#define glProgramUniform3i __rglgen_glProgramUniform3i -#define glProgramUniform4i __rglgen_glProgramUniform4i -#define glProgramUniform1ui __rglgen_glProgramUniform1ui -#define glProgramUniform2ui __rglgen_glProgramUniform2ui -#define glProgramUniform3ui __rglgen_glProgramUniform3ui -#define glProgramUniform4ui __rglgen_glProgramUniform4ui -#define glProgramUniform1f __rglgen_glProgramUniform1f -#define glProgramUniform2f __rglgen_glProgramUniform2f -#define glProgramUniform3f __rglgen_glProgramUniform3f -#define glProgramUniform4f __rglgen_glProgramUniform4f -#define glProgramUniform1iv __rglgen_glProgramUniform1iv -#define glProgramUniform2iv __rglgen_glProgramUniform2iv -#define glProgramUniform3iv __rglgen_glProgramUniform3iv -#define glProgramUniform4iv __rglgen_glProgramUniform4iv -#define glProgramUniform1uiv __rglgen_glProgramUniform1uiv -#define glProgramUniform2uiv __rglgen_glProgramUniform2uiv -#define glProgramUniform3uiv __rglgen_glProgramUniform3uiv -#define glProgramUniform4uiv __rglgen_glProgramUniform4uiv -#define glProgramUniform1fv __rglgen_glProgramUniform1fv -#define glProgramUniform2fv __rglgen_glProgramUniform2fv -#define glProgramUniform3fv __rglgen_glProgramUniform3fv -#define glProgramUniform4fv __rglgen_glProgramUniform4fv -#define glProgramUniformMatrix2fv __rglgen_glProgramUniformMatrix2fv -#define glProgramUniformMatrix3fv __rglgen_glProgramUniformMatrix3fv -#define glProgramUniformMatrix4fv __rglgen_glProgramUniformMatrix4fv -#define glProgramUniformMatrix2x3fv __rglgen_glProgramUniformMatrix2x3fv -#define glProgramUniformMatrix3x2fv __rglgen_glProgramUniformMatrix3x2fv -#define glProgramUniformMatrix2x4fv __rglgen_glProgramUniformMatrix2x4fv -#define glProgramUniformMatrix4x2fv __rglgen_glProgramUniformMatrix4x2fv -#define glProgramUniformMatrix3x4fv __rglgen_glProgramUniformMatrix3x4fv -#define glProgramUniformMatrix4x3fv __rglgen_glProgramUniformMatrix4x3fv -#define glValidateProgramPipeline __rglgen_glValidateProgramPipeline -#define glGetProgramPipelineInfoLog __rglgen_glGetProgramPipelineInfoLog -#define glBindImageTexture __rglgen_glBindImageTexture -#define glGetBooleanv __rglgen_glGetBooleanv -#define glGetBooleani_v __rglgen_glGetBooleani_v -#define glMemoryBarrier __rglgen_glMemoryBarrier -#define glMemoryBarrierByRegion __rglgen_glMemoryBarrierByRegion -#define glTexStorage2DMultisample __rglgen_glTexStorage2DMultisample -#define glGetMultisamplefv __rglgen_glGetMultisamplefv -#define glSampleMaski __rglgen_glSampleMaski -#define glGetTexLevelParameteriv __rglgen_glGetTexLevelParameteriv -#define glGetTexLevelParameterfv __rglgen_glGetTexLevelParameterfv -#define glBindVertexBuffer __rglgen_glBindVertexBuffer -#define glVertexAttribFormat __rglgen_glVertexAttribFormat -#define glVertexAttribIFormat __rglgen_glVertexAttribIFormat -#define glVertexAttribBinding __rglgen_glVertexAttribBinding -#define glVertexBindingDivisor __rglgen_glVertexBindingDivisor -#define glBlendBarrier __rglgen_glBlendBarrier -#define glCopyImageSubData __rglgen_glCopyImageSubData -#define glDebugMessageControl __rglgen_glDebugMessageControl -#define glDebugMessageInsert __rglgen_glDebugMessageInsert -#define glDebugMessageCallback __rglgen_glDebugMessageCallback -#define glGetDebugMessageLog __rglgen_glGetDebugMessageLog -#define glPushDebugGroup __rglgen_glPushDebugGroup -#define glPopDebugGroup __rglgen_glPopDebugGroup -#define glObjectLabel __rglgen_glObjectLabel -#define glGetObjectLabel __rglgen_glGetObjectLabel -#define glObjectPtrLabel __rglgen_glObjectPtrLabel -#define glGetObjectPtrLabel __rglgen_glGetObjectPtrLabel -#define glGetPointerv __rglgen_glGetPointerv -#define glEnablei __rglgen_glEnablei -#define glDisablei __rglgen_glDisablei -#define glBlendEquationi __rglgen_glBlendEquationi -#define glBlendEquationSeparatei __rglgen_glBlendEquationSeparatei -#define glBlendFunci __rglgen_glBlendFunci -#define glBlendFuncSeparatei __rglgen_glBlendFuncSeparatei -#define glColorMaski __rglgen_glColorMaski -#define glIsEnabledi __rglgen_glIsEnabledi -#define glDrawElementsBaseVertex __rglgen_glDrawElementsBaseVertex -#define glDrawRangeElementsBaseVertex __rglgen_glDrawRangeElementsBaseVertex -#define glDrawElementsInstancedBaseVertex __rglgen_glDrawElementsInstancedBaseVertex -#define glFramebufferTexture __rglgen_glFramebufferTexture -#define glPrimitiveBoundingBox __rglgen_glPrimitiveBoundingBox -#define glGetGraphicsResetStatus __rglgen_glGetGraphicsResetStatus -#define glReadnPixels __rglgen_glReadnPixels -#define glGetnUniformfv __rglgen_glGetnUniformfv -#define glGetnUniformiv __rglgen_glGetnUniformiv -#define glGetnUniformuiv __rglgen_glGetnUniformuiv -#define glMinSampleShading __rglgen_glMinSampleShading -#define glPatchParameteri __rglgen_glPatchParameteri -#define glTexParameterIiv __rglgen_glTexParameterIiv -#define glTexParameterIuiv __rglgen_glTexParameterIuiv -#define glGetTexParameterIiv __rglgen_glGetTexParameterIiv -#define glGetTexParameterIuiv __rglgen_glGetTexParameterIuiv -#define glSamplerParameterIiv __rglgen_glSamplerParameterIiv -#define glSamplerParameterIuiv __rglgen_glSamplerParameterIuiv -#define glGetSamplerParameterIiv __rglgen_glGetSamplerParameterIiv -#define glGetSamplerParameterIuiv __rglgen_glGetSamplerParameterIuiv -#define glTexBuffer __rglgen_glTexBuffer -#define glTexBufferRange __rglgen_glTexBufferRange -#define glTexStorage3DMultisample __rglgen_glTexStorage3DMultisample - -extern RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; -extern RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; -extern RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; -extern RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; -extern RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; -extern RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; -extern RGLSYMGLBINDTEXTUREPROC __rglgen_glBindTexture; -extern RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; -extern RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; -extern RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; -extern RGLSYMGLBLENDFUNCPROC __rglgen_glBlendFunc; -extern RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; -extern RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; -extern RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; -extern RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; -extern RGLSYMGLCLEARPROC __rglgen_glClear; -extern RGLSYMGLCLEARCOLORPROC __rglgen_glClearColor; -extern RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; -extern RGLSYMGLCLEARSTENCILPROC __rglgen_glClearStencil; -extern RGLSYMGLCOLORMASKPROC __rglgen_glColorMask; -extern RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; -extern RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; -extern RGLSYMGLCOPYTEXIMAGE2DPROC __rglgen_glCopyTexImage2D; -extern RGLSYMGLCOPYTEXSUBIMAGE2DPROC __rglgen_glCopyTexSubImage2D; -extern RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; -extern RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; -extern RGLSYMGLCULLFACEPROC __rglgen_glCullFace; -extern RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; -extern RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; -extern RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; -extern RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; -extern RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; -extern RGLSYMGLDELETETEXTURESPROC __rglgen_glDeleteTextures; -extern RGLSYMGLDEPTHFUNCPROC __rglgen_glDepthFunc; -extern RGLSYMGLDEPTHMASKPROC __rglgen_glDepthMask; -extern RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; -extern RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; -extern RGLSYMGLDISABLEPROC __rglgen_glDisable; -extern RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; -extern RGLSYMGLDRAWARRAYSPROC __rglgen_glDrawArrays; -extern RGLSYMGLDRAWELEMENTSPROC __rglgen_glDrawElements; -extern RGLSYMGLENABLEPROC __rglgen_glEnable; -extern RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; -extern RGLSYMGLFINISHPROC __rglgen_glFinish; -extern RGLSYMGLFLUSHPROC __rglgen_glFlush; -extern RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; -extern RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; -extern RGLSYMGLFRONTFACEPROC __rglgen_glFrontFace; -extern RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; -extern RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; -extern RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; -extern RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; -extern RGLSYMGLGENTEXTURESPROC __rglgen_glGenTextures; -extern RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; -extern RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; -extern RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; -extern RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; -extern RGLSYMGLGETBOOLEANVPROC __rglgen_glGetBooleanv; -extern RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; -extern RGLSYMGLGETERRORPROC __rglgen_glGetError; -extern RGLSYMGLGETFLOATVPROC __rglgen_glGetFloatv; -extern RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; -extern RGLSYMGLGETINTEGERVPROC __rglgen_glGetIntegerv; -extern RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; -extern RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; -extern RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; -extern RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; -extern RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; -extern RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; -extern RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; -extern RGLSYMGLGETSTRINGPROC __rglgen_glGetString; -extern RGLSYMGLGETTEXPARAMETERFVPROC __rglgen_glGetTexParameterfv; -extern RGLSYMGLGETTEXPARAMETERIVPROC __rglgen_glGetTexParameteriv; -extern RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; -extern RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; -extern RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; -extern RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; -extern RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; -extern RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; -extern RGLSYMGLHINTPROC __rglgen_glHint; -extern RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; -extern RGLSYMGLISENABLEDPROC __rglgen_glIsEnabled; -extern RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; -extern RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; -extern RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; -extern RGLSYMGLISSHADERPROC __rglgen_glIsShader; -extern RGLSYMGLISTEXTUREPROC __rglgen_glIsTexture; -extern RGLSYMGLLINEWIDTHPROC __rglgen_glLineWidth; -extern RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; -extern RGLSYMGLPIXELSTOREIPROC __rglgen_glPixelStorei; -extern RGLSYMGLPOLYGONOFFSETPROC __rglgen_glPolygonOffset; -extern RGLSYMGLREADPIXELSPROC __rglgen_glReadPixels; -extern RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; -extern RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; -extern RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; -extern RGLSYMGLSCISSORPROC __rglgen_glScissor; -extern RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; -extern RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; -extern RGLSYMGLSTENCILFUNCPROC __rglgen_glStencilFunc; -extern RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; -extern RGLSYMGLSTENCILMASKPROC __rglgen_glStencilMask; -extern RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; -extern RGLSYMGLSTENCILOPPROC __rglgen_glStencilOp; -extern RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; -extern RGLSYMGLTEXIMAGE2DPROC __rglgen_glTexImage2D; -extern RGLSYMGLTEXPARAMETERFPROC __rglgen_glTexParameterf; -extern RGLSYMGLTEXPARAMETERFVPROC __rglgen_glTexParameterfv; -extern RGLSYMGLTEXPARAMETERIPROC __rglgen_glTexParameteri; -extern RGLSYMGLTEXPARAMETERIVPROC __rglgen_glTexParameteriv; -extern RGLSYMGLTEXSUBIMAGE2DPROC __rglgen_glTexSubImage2D; -extern RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; -extern RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; -extern RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; -extern RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; -extern RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; -extern RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; -extern RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; -extern RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; -extern RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; -extern RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; -extern RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; -extern RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; -extern RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; -extern RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; -extern RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; -extern RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; -extern RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; -extern RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; -extern RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; -extern RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; -extern RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; -extern RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; -extern RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; -extern RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; -extern RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; -extern RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; -extern RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; -extern RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; -extern RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; -extern RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; -extern RGLSYMGLVIEWPORTPROC __rglgen_glViewport; -extern RGLSYMGLREADBUFFERPROC __rglgen_glReadBuffer; -extern RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; -extern RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; -extern RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; -extern RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; -extern RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; -extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; -extern RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; -extern RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; -extern RGLSYMGLISQUERYPROC __rglgen_glIsQuery; -extern RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; -extern RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; -extern RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; -extern RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; -extern RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; -extern RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; -extern RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; -extern RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; -extern RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; -extern RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; -extern RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; -extern RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; -extern RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; -extern RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; -extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; -extern RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; -extern RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; -extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; -extern RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; -extern RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; -extern RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; -extern RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; -extern RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; -extern RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; -extern RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; -extern RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; -extern RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; -extern RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; -extern RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; -extern RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; -extern RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; -extern RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; -extern RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; -extern RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; -extern RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; -extern RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; -extern RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; -extern RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; -extern RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; -extern RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; -extern RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; -extern RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; -extern RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; -extern RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; -extern RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; -extern RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; -extern RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; -extern RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; -extern RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; -extern RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; -extern RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; -extern RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; -extern RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; -extern RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; -extern RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; -extern RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; -extern RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; -extern RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; -extern RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; -extern RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; -extern RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; -extern RGLSYMGLISSYNCPROC __rglgen_glIsSync; -extern RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; -extern RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; -extern RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; -extern RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; -extern RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; -extern RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; -extern RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; -extern RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; -extern RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; -extern RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; -extern RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; -extern RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; -extern RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; -extern RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; -extern RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; -extern RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; -extern RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; -extern RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; -extern RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; -extern RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; -extern RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; -extern RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; -extern RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; -extern RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; -extern RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; -extern RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; -extern RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; -extern RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; -extern RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; -extern RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; -extern RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; -extern RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; -extern RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; -extern RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; -extern RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; -extern RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; -extern RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; -extern RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; -extern RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; -extern RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; -extern RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; -extern RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; -extern RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; -extern RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; -extern RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; -extern RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; -extern RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; -extern RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; -extern RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; -extern RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; -extern RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; -extern RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; -extern RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; -extern RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; -extern RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; -extern RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; -extern RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; -extern RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; -extern RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; -extern RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; -extern RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; -extern RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; -extern RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; -extern RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; -extern RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; -extern RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; -extern RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; -extern RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; -extern RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; -extern RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; -extern RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; -extern RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; -extern RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; -extern RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; -extern RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; -extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; -extern RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; -extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; -extern RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; -extern RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; -extern RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; -extern RGLSYMGLMEMORYBARRIERBYREGIONPROC __rglgen_glMemoryBarrierByRegion; -extern RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; -extern RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; -extern RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; -extern RGLSYMGLGETTEXLEVELPARAMETERIVPROC __rglgen_glGetTexLevelParameteriv; -extern RGLSYMGLGETTEXLEVELPARAMETERFVPROC __rglgen_glGetTexLevelParameterfv; -extern RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; -extern RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; -extern RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; -extern RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; -extern RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; -extern RGLSYMGLBLENDBARRIERPROC __rglgen_glBlendBarrier; -extern RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; -extern RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; -extern RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; -extern RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; -extern RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; -extern RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; -extern RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; -extern RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; -extern RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; -extern RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; -extern RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; -extern RGLSYMGLGETPOINTERVPROC __rglgen_glGetPointerv; -extern RGLSYMGLENABLEIPROC __rglgen_glEnablei; -extern RGLSYMGLDISABLEIPROC __rglgen_glDisablei; -extern RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; -extern RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; -extern RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; -extern RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; -extern RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; -extern RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; -extern RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; -extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; -extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; -extern RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; -extern RGLSYMGLPRIMITIVEBOUNDINGBOXPROC __rglgen_glPrimitiveBoundingBox; -extern RGLSYMGLGETGRAPHICSRESETSTATUSPROC __rglgen_glGetGraphicsResetStatus; -extern RGLSYMGLREADNPIXELSPROC __rglgen_glReadnPixels; -extern RGLSYMGLGETNUNIFORMFVPROC __rglgen_glGetnUniformfv; -extern RGLSYMGLGETNUNIFORMIVPROC __rglgen_glGetnUniformiv; -extern RGLSYMGLGETNUNIFORMUIVPROC __rglgen_glGetnUniformuiv; -extern RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; -extern RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; -extern RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; -extern RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; -extern RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; -extern RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; -extern RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; -extern RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; -extern RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; -extern RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; -extern RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; -extern RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; -extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; - -struct rglgen_sym_map { const char *sym; void *ptr; }; -extern const struct rglgen_sym_map rglgen_symbol_map[]; -#ifdef __cplusplus -} -#endif diff --git a/core/wsi/gl_context.cpp b/core/wsi/gl_context.cpp index 3fff82f32..a95db1836 100644 --- a/core/wsi/gl_context.cpp +++ b/core/wsi/gl_context.cpp @@ -20,7 +20,11 @@ */ #include "gl_context.h" +#ifndef LIBRETRO #include "rend/gles/opengl_driver.h" +#endif + +#include void GLGraphicsContext::findGLVersion() { @@ -42,6 +46,16 @@ void GLGraphicsContext::findGLVersion() driverName = p != nullptr ? p : "unknown"; p = (const char *)glGetString(GL_VERSION); driverVersion = p != nullptr ? p : "unknown"; + p = (const char *)glGetString(GL_VENDOR); + std::string vendor = p != nullptr ? p : ""; + if (vendor.substr(0, 4) == "ATI ") + amd = true; + else if (driverName.find(" ATI ") != std::string::npos + || driverName.find(" AMD ") != std::string::npos) + // mesa + amd = true; + else + amd = false; } void GLGraphicsContext::postInit() diff --git a/core/wsi/gl_context.h b/core/wsi/gl_context.h index c63fd2502..0f1e2ae11 100644 --- a/core/wsi/gl_context.h +++ b/core/wsi/gl_context.h @@ -22,6 +22,10 @@ #include "types.h" #include "context.h" +#if defined(USE_OPENGL) && !defined(LIBRETRO) && !defined(TARGET_IPHONE) + #include +#endif + #ifdef TEST_AUTOMATION void do_swap_automation(); #else @@ -46,6 +50,9 @@ class GLGraphicsContext : public GraphicsContext std::string getDriverVersion() override { return driverVersion; } + bool isAMD() override { + return amd; + } void resetUIDriver(); bool hasPerPixel() override @@ -66,6 +73,7 @@ class GLGraphicsContext : public GraphicsContext bool _isGLES = false; std::string driverName; std::string driverVersion; + bool amd = false; }; #if defined(LIBRETRO) @@ -80,18 +88,10 @@ class GLGraphicsContext : public GraphicsContext #include "sdl.h" -#elif defined(GLES) || defined(__ANDROID__) || defined(__SWITCH__) +#elif defined(__ANDROID__) || defined(SUPPORT_X11) #include "egl.h" -#elif defined(_WIN32) - -#include "wgl.h" - -#elif defined(SUPPORT_X11) - -#include "xgl.h" - #else #error Unsupported window system diff --git a/core/wsi/libretro.h b/core/wsi/libretro.h index 3b1c8f737..b8530d439 100644 --- a/core/wsi/libretro.h +++ b/core/wsi/libretro.h @@ -50,8 +50,15 @@ class LibretroGraphicsContext : public GLGraphicsContext { public: - bool init() { findGLVersion(); return true; } - void term() override {} + bool init() { + postInit(); + return true; + } + + void term() override { + preTerm(); + } + void swap() {} }; diff --git a/core/wsi/osx.h b/core/wsi/osx.h index d40038f81..0e84c12d6 100644 --- a/core/wsi/osx.h +++ b/core/wsi/osx.h @@ -19,10 +19,10 @@ along with Flycast. If not, see . */ #pragma once -#if defined(TARGET_IPHONE) //apple-specific ogles3 headers +#if defined(TARGET_IPHONE) +#include "gl_context.h" #include #include -#include "gl_context.h" class OSXGraphicsContext : public GLGraphicsContext { diff --git a/core/wsi/sdl.cpp b/core/wsi/sdl.cpp index 4ef7854ba..dddc940a5 100644 --- a/core/wsi/sdl.cpp +++ b/core/wsi/sdl.cpp @@ -19,14 +19,13 @@ along with Flycast. If not, see . */ #if defined(USE_SDL) -#include -#include #include "gl_context.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "sdl/sdl.h" #include "cfg/option.h" -extern "C" int eglGetError(); +#include +#include SDLGLGraphicsContext theGLContext; @@ -100,23 +99,20 @@ bool SDLGLGraphicsContext::init() SDL_GL_SetSwapInterval(swapOnVSync ? swapInterval : 0); #ifdef GLES - load_gles_symbols(); -#elif !defined(__APPLE__) - if (gl3wInit() == -1 || !gl3wIsSupported(3, 0)) + if (gladLoadGLES2((GLADloadfunc)SDL_GL_GetProcAddress) == 0) + { + ERROR_LOG(RENDERER, "gladLoadGLES2 failed"); + return false; + } +#else + if (!gladLoadGL((GLADloadfunc) SDL_GL_GetProcAddress) || !GLAD_GL_VERSION_3_0) { - ERROR_LOG(RENDERER, "gl3wInit failed or GL 3.0 not supported"); + ERROR_LOG(RENDERER, "gladLoadGL failed or GL 3.0 not supported"); return false; } #endif postInit(); - -#ifdef TARGET_UWP - // Force link with libGLESv2.dll and libEGL.dll -#undef glGetError - glGetError(); - eglGetError(); -#endif - + return true; } diff --git a/core/wsi/sdl.h b/core/wsi/sdl.h index ed049b5e7..883b2e5b7 100644 --- a/core/wsi/sdl.h +++ b/core/wsi/sdl.h @@ -19,23 +19,10 @@ along with Flycast. If not, see . */ #pragma once -#include -#include "types.h" -#if defined(__APPLE__) && !defined(TARGET_IPHONE) -#include -#elif !defined(GLES) -#include -#else -#include -#include -#ifndef GLES2 -#include "gl32funcs.h" -#else -extern "C" void load_gles_symbols(); -#endif -#endif #include "gl_context.h" +#include + class SDLGLGraphicsContext : public GLGraphicsContext { public: diff --git a/core/wsi/wgl.cpp b/core/wsi/wgl.cpp deleted file mode 100644 index 97bcd5b2b..000000000 --- a/core/wsi/wgl.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - Created on: Oct 18, 2019 - - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#include "gl_context.h" -#include "types.h" - -#if defined(_WIN32) && !defined(USE_SDL) && !defined(LIBRETRO) -void CreateMainWindow(); - -WGLGraphicsContext theGLContext; - -PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; -PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; -PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; - -bool WGLGraphicsContext::init() -{ - if (ourOpenGLRenderingContext != NULL) - // Already initialized - return true; - - instance = this; - CreateMainWindow(); - PIXELFORMATDESCRIPTOR pfd = - { - sizeof(PIXELFORMATDESCRIPTOR), - 1, - PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags - PFD_TYPE_RGBA, //The kind of framebuffer. RGBA or palette. - 32, //Colordepth of the framebuffer. - 0, 0, 0, 0, 0, 0, - 0, - 0, - 0, - 0, 0, 0, 0, - 0, //Number of bits for the depthbuffer - 0, //Number of bits for the stencilbuffer - 0, //Number of Aux buffers in the framebuffer. - PFD_MAIN_PLANE, - 0, - 0, 0, 0 - }; - - int letWindowsChooseThisPixelFormat; - letWindowsChooseThisPixelFormat = ChoosePixelFormat((HDC)display, &pfd); - SetPixelFormat((HDC)display,letWindowsChooseThisPixelFormat, &pfd); - - HGLRC tempOpenGLContext = wglCreateContext((HDC)display); - wglMakeCurrent((HDC)display, tempOpenGLContext); - - wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB"); - if(!wglChoosePixelFormatARB) - return false; - - wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); - if(!wglCreateContextAttribsARB) - return false; - - wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); - if(!wglSwapIntervalEXT) - return false; - - int attribs[] = - { - WGL_CONTEXT_MAJOR_VERSION_ARB, 4, - WGL_CONTEXT_MINOR_VERSION_ARB, 3, - WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, - 0 - }; - - ourOpenGLRenderingContext = wglCreateContextAttribsARB((HDC)display, 0, attribs); - - if (!ourOpenGLRenderingContext) - { - INFO_LOG(RENDERER, "OpenGL 4.3 not supported"); - // Try Gl 3.1 - attribs[1] = 3; - attribs[3] = 1; - ourOpenGLRenderingContext = wglCreateContextAttribsARB((HDC)display, 0, attribs); - } - - bool rv = true; - - if (ourOpenGLRenderingContext) - wglMakeCurrent((HDC)display, ourOpenGLRenderingContext); - else - rv = false; - - wglDeleteContext(tempOpenGLContext); - - if (rv) { - rv = gl3wInit() != -1 && gl3wIsSupported(3, 1); - } - - RECT r; - GetClientRect((HWND)window, &r); - settings.display.width = r.right - r.left; - settings.display.height = r.bottom - r.top; - - if (rv) - postInit(); - - return rv; -} - -void WGLGraphicsContext::swap() -{ - do_swap_automation(); - wglSwapLayerBuffers((HDC)display, WGL_SWAP_MAIN_PLANE); -} - -void WGLGraphicsContext::term() -{ - preTerm(); - if (ourOpenGLRenderingContext != NULL) - { - wglMakeCurrent((HDC)display, NULL); - wglDeleteContext(ourOpenGLRenderingContext); - ourOpenGLRenderingContext = NULL; - } -} - -#endif diff --git a/core/wsi/wgl.h b/core/wsi/wgl.h deleted file mode 100644 index 64a5a6bf6..000000000 --- a/core/wsi/wgl.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - Created on: Oct 18, 2019 - - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#pragma once -#include -#include -#include "gl_context.h" - -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 - -#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 -#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 -#define WGL_CONTEXT_FLAGS_ARB 0x2094 -#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 -#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 -#define ERROR_INVALID_VERSION_ARB 0x2095 -#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 - -typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, - int *piFormats, UINT *nNumFormats); -typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList); -typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); - - -class WGLGraphicsContext : public GLGraphicsContext -{ -public: - bool init(); - void term() override; - void swap(); - -private: - HGLRC ourOpenGLRenderingContext = NULL; -}; - -extern WGLGraphicsContext theGLContext; diff --git a/core/wsi/xgl.cpp b/core/wsi/xgl.cpp deleted file mode 100644 index 186d7a49f..000000000 --- a/core/wsi/xgl.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - Created on: Oct 18, 2019 - - Copyright 2019 flyinghead - - This file is part of Flycast. - - Flycast 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 Foundation, either version 2 of the License, or - (at your option) any later version. - - Flycast 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 Flycast. If not, see . -*/ -#include "types.h" -#if defined(SUPPORT_X11) && !defined(USE_SDL) && !defined(LIBRETRO) -#include "gl_context.h" -#include "cfg/option.h" - -#ifndef GLX_CONTEXT_MAJOR_VERSION_ARB -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#endif -#ifndef GLX_CONTEXT_MINOR_VERSION_ARB -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#endif - -XGLGraphicsContext theGLContext; - -static int x11_error_handler(Display *, XErrorEvent *) -{ - return 0; -} - -bool XGLGraphicsContext::init() -{ - typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); - - instance = this; - glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0; - glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB((const GLubyte*)"glXCreateContextAttribsARB"); - verify(glXCreateContextAttribsARB != 0); - int context_attribs[] = - { - GLX_CONTEXT_MAJOR_VERSION_ARB, 4, - GLX_CONTEXT_MINOR_VERSION_ARB, 3, -#ifndef NDEBUG - GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB, -#endif - GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, - None - }; - int (*old_handler)(Display *, XErrorEvent *) = XSetErrorHandler(&x11_error_handler); - - context = glXCreateContextAttribsARB((Display *)display, *framebufferConfigs, 0, True, context_attribs); - if (!context) - { - INFO_LOG(RENDERER, "OpenGL 4.3 not supported"); - // Try GL 3.0 - context_attribs[1] = 3; - context_attribs[3] = 0; - context = glXCreateContextAttribsARB((Display *)display, *framebufferConfigs, 0, True, context_attribs); - if (!context) - { - ERROR_LOG(RENDERER, "OpenGL 3.0 not supported\n"); - return false; - } - } - XSetErrorHandler(old_handler); - XSync((Display *)display, False); - - glXMakeCurrent((Display *)display, (GLXDrawable)window, context); - - if (gl3wInit() == -1 || !gl3wIsSupported(3, 1)) - return false; - - Window win; - int temp; - unsigned int tempu; - XGetGeometry((Display *)display, (GLXDrawable)window, &win, &temp, &temp, (u32 *)&settings.display.width, (u32 *)&settings.display.height, &tempu, &tempu); - - swapOnVSync = config::VSync; - glXSwapIntervalMESA = (int (*)(unsigned))glXGetProcAddress((const GLubyte*)"glXSwapIntervalMESA"); - if (glXSwapIntervalMESA != nullptr) - glXSwapIntervalMESA((unsigned)swapOnVSync); - else - { - glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glXGetProcAddress((const GLubyte*)"glXSwapIntervalEXT"); - if (glXSwapIntervalEXT != nullptr) - glXSwapIntervalEXT((Display *)display, (GLXDrawable)window, (int)swapOnVSync); - } - - postInit(); - - return true; -} - -bool XGLGraphicsContext::ChooseVisual(Display* x11Display, XVisualInfo** visual, int* depth) -{ - // Get a matching FB config - static int visual_attribs[] = - { - GLX_X_RENDERABLE , True, - GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT, - GLX_RENDER_TYPE , GLX_RGBA_BIT, - GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR, - GLX_RED_SIZE , 8, - GLX_GREEN_SIZE , 8, - GLX_BLUE_SIZE , 8, - GLX_ALPHA_SIZE , 8, - GLX_DOUBLEBUFFER , True, - None - }; - - int glx_major, glx_minor; - - // FBConfigs were added in GLX version 1.3. - if (!glXQueryVersion(x11Display, &glx_major, &glx_minor) || - ((glx_major == 1) && (glx_minor < 3)) || (glx_major < 1)) - { - ERROR_LOG(RENDERER, "Invalid GLX version"); - return false; - } - const long x11Screen = XDefaultScreen(x11Display); - - int fbcount; - framebufferConfigs = glXChooseFBConfig(x11Display, x11Screen, visual_attribs, &fbcount); - if (framebufferConfigs == nullptr) - { - ERROR_LOG(RENDERER, "Failed to retrieve a framebuffer config"); - return false; - } - INFO_LOG(RENDERER, "Found %d matching FB configs.", fbcount); - - // Get a visual - XVisualInfo *vi = glXGetVisualFromFBConfig(x11Display, *framebufferConfigs); - INFO_LOG(RENDERER, "Chosen visual ID = 0x%lx", vi->visualid); - - *depth = vi->depth; - *visual = vi; - - return true; -} - -void XGLGraphicsContext::swap() -{ - do_swap_automation(); - if (swapOnVSync == (settings.input.fastForwardMode || !config::VSync)) - { - swapOnVSync = (!settings.input.fastForwardMode && config::VSync); - if (glXSwapIntervalMESA != nullptr) - glXSwapIntervalMESA((unsigned)swapOnVSync); - else if (glXSwapIntervalEXT != nullptr) - glXSwapIntervalEXT((Display *)display, (GLXDrawable)window, (int)swapOnVSync); - } - glXSwapBuffers((Display *)display, (GLXDrawable)window); - - Window win; - int temp; - unsigned int tempu; - XGetGeometry((Display *)display, (GLXDrawable)window, &win, &temp, &temp, (u32 *)&settings.display.width, (u32 *)&settings.display.height, &tempu, &tempu); -} - -void XGLGraphicsContext::term() -{ - preTerm(); - if (context) - { - glXMakeCurrent((Display *)display, None, NULL); - glXDestroyContext((Display *)display, context); - context = (GLXContext)0; - } -} - -#endif diff --git a/fonts/Roboto-Medium.ttf.zip b/fonts/Roboto-Medium.ttf.zip new file mode 100644 index 000000000..9b3f4ee2d Binary files /dev/null and b/fonts/Roboto-Medium.ttf.zip differ diff --git a/fonts/Roboto-Regular.ttf.zip b/fonts/Roboto-Regular.ttf.zip new file mode 100644 index 000000000..6bc0533e8 Binary files /dev/null and b/fonts/Roboto-Regular.ttf.zip differ diff --git a/fonts/biosfont.bin b/fonts/biosfont.bin deleted file mode 100644 index a53a260e3..000000000 Binary files a/fonts/biosfont.bin and /dev/null differ diff --git a/fonts/biosfont.bin.zip b/fonts/biosfont.bin.zip new file mode 100644 index 000000000..9bf112aaa Binary files /dev/null and b/fonts/biosfont.bin.zip differ diff --git a/fonts/fa-solid-900.ttf.zip b/fonts/fa-solid-900.ttf.zip new file mode 100644 index 000000000..449985a45 Binary files /dev/null and b/fonts/fa-solid-900.ttf.zip differ diff --git a/fonts/printer_ascii12x24.bin b/fonts/printer_ascii12x24.bin deleted file mode 100644 index ac977c3f4..000000000 Binary files a/fonts/printer_ascii12x24.bin and /dev/null differ diff --git a/fonts/printer_ascii12x24.bin.zip b/fonts/printer_ascii12x24.bin.zip new file mode 100644 index 000000000..bd473de49 Binary files /dev/null and b/fonts/printer_ascii12x24.bin.zip differ diff --git a/fonts/printer_ascii8x16.bin b/fonts/printer_ascii8x16.bin deleted file mode 100644 index 2083d5670..000000000 Binary files a/fonts/printer_ascii8x16.bin and /dev/null differ diff --git a/fonts/printer_ascii8x16.bin.zip b/fonts/printer_ascii8x16.bin.zip new file mode 100644 index 000000000..fa1b1294f Binary files /dev/null and b/fonts/printer_ascii8x16.bin.zip differ diff --git a/fonts/printer_kanji16x16.bin b/fonts/printer_kanji16x16.bin deleted file mode 100644 index c580d4d5f..000000000 Binary files a/fonts/printer_kanji16x16.bin and /dev/null differ diff --git a/fonts/printer_kanji16x16.bin.zip b/fonts/printer_kanji16x16.bin.zip new file mode 100644 index 000000000..d60430e4e Binary files /dev/null and b/fonts/printer_kanji16x16.bin.zip differ diff --git a/fonts/printer_kanji24x24.bin b/fonts/printer_kanji24x24.bin deleted file mode 100644 index e779563e0..000000000 Binary files a/fonts/printer_kanji24x24.bin and /dev/null differ diff --git a/fonts/printer_kanji24x24.bin.zip b/fonts/printer_kanji24x24.bin.zip new file mode 100644 index 000000000..031f6e73a Binary files /dev/null and b/fonts/printer_kanji24x24.bin.zip differ diff --git a/resources/flash/f355twin.nvmem.zip b/resources/flash/f355twin.nvmem.zip index 939399002..fb90cc14c 100644 Binary files a/resources/flash/f355twin.nvmem.zip and b/resources/flash/f355twin.nvmem.zip differ diff --git a/resources/flash/f355twn2.nvmem.zip b/resources/flash/f355twn2.nvmem.zip index 6816edc24..ef1d8bba0 100644 Binary files a/resources/flash/f355twn2.nvmem.zip and b/resources/flash/f355twn2.nvmem.zip differ diff --git a/resources/flash/magicpop.nvmem.zip b/resources/flash/magicpop.nvmem.zip new file mode 100644 index 000000000..1c06a5c71 Binary files /dev/null and b/resources/flash/magicpop.nvmem.zip differ diff --git a/resources/flash/ochaken.nvmem.zip b/resources/flash/ochaken.nvmem.zip new file mode 100644 index 000000000..bc48189ae Binary files /dev/null and b/resources/flash/ochaken.nvmem.zip differ diff --git a/resources/flash/puyomedal.nvmem.zip b/resources/flash/puyomedal.nvmem.zip new file mode 100644 index 000000000..c9ad2633e Binary files /dev/null and b/resources/flash/puyomedal.nvmem.zip differ diff --git a/resources/flash/unomedal.nvmem.zip b/resources/flash/unomedal.nvmem.zip new file mode 100644 index 000000000..bebbcab34 Binary files /dev/null and b/resources/flash/unomedal.nvmem.zip differ diff --git a/resources/flash/westdrmg.nvmem.zip b/resources/flash/westdrmg.nvmem.zip new file mode 100644 index 000000000..25a6a45ab Binary files /dev/null and b/resources/flash/westdrmg.nvmem.zip differ diff --git a/resources/picture/buttons-arcade.png b/resources/picture/buttons-arcade.png new file mode 100644 index 000000000..980212cff Binary files /dev/null and b/resources/picture/buttons-arcade.png differ diff --git a/resources/picture/buttons-arcade.svg b/resources/picture/buttons-arcade.svg new file mode 100644 index 000000000..db982d2ff --- /dev/null +++ b/resources/picture/buttons-arcade.svg @@ -0,0 +1,2279 @@ + + + +124356S$T111111LTRT diff --git a/shell/android-studio/flycast/src/main/assets/buttons.png b/resources/picture/buttons.png similarity index 100% rename from shell/android-studio/flycast/src/main/assets/buttons.png rename to resources/picture/buttons.png diff --git a/resources/picture/f355_print_template.png b/resources/picture/f355_print_template.png new file mode 100644 index 000000000..39189edef Binary files /dev/null and b/resources/picture/f355_print_template.png differ diff --git a/shell/android-studio/build.gradle b/shell/android-studio/build.gradle index 8c91de558..565f8c24e 100644 --- a/shell/android-studio/build.gradle +++ b/shell/android-studio/build.gradle @@ -1,9 +1,4 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.0.2' apply false - id 'com.android.library' version '8.0.2' apply false -} - -task clean(type: Delete) { - delete rootProject.buildDir +alias(libs.plugins.android.application) apply false } \ No newline at end of file diff --git a/shell/android-studio/flycast/build.gradle b/shell/android-studio/flycast/build.gradle index 745948043..042533a8c 100644 --- a/shell/android-studio/flycast/build.gradle +++ b/shell/android-studio/flycast/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.android.application' + alias(libs.plugins.android.application) } def getVersionName = { -> @@ -17,15 +17,15 @@ def getSentryUrl = { -> } android { - namespace 'com.reicast.emulator' - ndkVersion '23.1.7779620' - compileSdk 29 + namespace 'com.flycast.emulator' + ndkVersion '23.2.8568313' + compileSdk 34 defaultConfig { applicationId "com.flycast.emulator" minSdk 16 //noinspection ExpiredTargetSdkVersion - targetSdk 29 + targetSdk 34 versionCode 8 versionName getVersionName() vectorDrawables.useSupportLibrary = true @@ -43,19 +43,26 @@ android { // avoid Error: Google Play requires that apps target API level 31 or higher. abortOnError false } + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } signingConfigs { debug { storeFile file("../debug.keystore") } + release { + storeFile file("../playstore.jks") + storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD") + keyAlias 'uploadkey' + keyPassword System.getenv("ANDROID_KEYSTORE_PASSWORD") + } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.debug + signingConfig signingConfigs.release } } compileOptions { @@ -65,7 +72,7 @@ android { externalNativeBuild { cmake { path file('../../../CMakeLists.txt') - version '3.18.1' + version '3.22.1' } } packagingOptions { @@ -73,13 +80,22 @@ android { excludes += ['META-INF/DEPENDENCIES'] } } + packaging { + // This is necessary for libadrenotools custom driver loading + jniLibs.useLegacyPackaging = true + } } dependencies { - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'org.apache.commons:commons-lang3:3.12.0' - implementation 'org.apache.httpcomponents.client5:httpclient5:5.0.3' - implementation 'org.slf4j:slf4j-android:1.7.35' + implementation libs.appcompat + implementation libs.commons.lang3 + implementation libs.httpclient5 + implementation libs.slf4j.android implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: []) - implementation 'androidx.documentfile:documentfile:1.0.1' + implementation libs.documentfile + + androidTestImplementation 'androidx.test:runner:1.5.0' + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'androidx.test:core:1.5.0' + androidTestImplementation 'junit:junit:4.12' } diff --git a/shell/android-studio/flycast/libs/ouya-sdk.jar b/shell/android-studio/flycast/libs/ouya-sdk.jar deleted file mode 100644 index 12b1e4038..000000000 Binary files a/shell/android-studio/flycast/libs/ouya-sdk.jar and /dev/null differ diff --git a/shell/android-studio/flycast/proguard-rules.pro b/shell/android-studio/flycast/proguard-rules.pro index 550c7a078..6157de84f 100644 --- a/shell/android-studio/flycast/proguard-rules.pro +++ b/shell/android-studio/flycast/proguard-rules.pro @@ -20,7 +20,5 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile --keep class com.reicast.** {*;} --keepclassmembers class com.reicast.** {*;} -keep class com.flycast.** {*;} -keepclassmembers class com.flycast.** {*;} diff --git a/shell/android-studio/flycast/src/androidTest/java/com/flycast/emulator/AndroidStorageTest.java b/shell/android-studio/flycast/src/androidTest/java/com/flycast/emulator/AndroidStorageTest.java new file mode 100644 index 000000000..9a9519c67 --- /dev/null +++ b/shell/android-studio/flycast/src/androidTest/java/com/flycast/emulator/AndroidStorageTest.java @@ -0,0 +1,145 @@ +package com.flycast.emulator; + +import android.util.Log; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Arrays; + +import static org.junit.Assert.*; + +@RunWith(AndroidJUnit4.class) +public class AndroidStorageTest { + public static final String TREE_URI = "content://com.android.externalstorage.documents/tree/primary%3AFlycast%2FROMS"; + + @Test + public void test() { + ActivityScenario scenario = ActivityScenario.launch(NativeGLActivity.class); + scenario.onActivity(activity -> { + try { + // Configure storage + AndroidStorage storage = activity.getStorage(); + String rootUri = TREE_URI; + storage.setStorageDirectories(Arrays.asList(rootUri)); + + // Start test + // exists (root) + assertTrue(storage.exists(rootUri)); + // listContent (root) + FileInfo[] kids = storage.listContent(rootUri); + assertTrue(kids.length > 0); + // getFileInfo (root) + FileInfo info = storage.getFileInfo(rootUri); + assertEquals(info.getPath(), rootUri); + assertTrue(info.isDirectory()); + assertNotEquals(0, info.getUpdateTime()); + // getParentUri (root) + // fails on lollipop_mr1, could be because parent folder (/Flycast) is also allowed + assertEquals("", storage.getParentUri(rootUri)); + + boolean directoryDone = false; + boolean fileDone = false; + for (FileInfo file : kids) { + if (file.isDirectory() && !directoryDone) { + // getParentUri + String parentUri = storage.getParentUri(file.getPath()); + // FIXME fails because getParentUri returns a docId, not a treeId + //assertEquals(rootUri, parentUri); + + // getSubPath (from root) + String kidUri = storage.getSubPath(rootUri, file.getName()); + assertEquals(file.getPath(), kidUri); + + // exists (folder) + assertTrue(storage.exists(file.getPath())); + + // getFileInfo (folder) + info = storage.getFileInfo(file.getPath()); + assertEquals(file.getPath(), info.getPath()); + assertEquals(file.getName(), info.getName()); + assertTrue(info.isDirectory()); + assertNotEquals(0, info.getUpdateTime()); + assertTrue(info.isDirectory()); + + // listContent (from folder) + FileInfo[] gdkids = storage.listContent(file.getPath()); + assertTrue(gdkids.length > 0); + for (FileInfo sfile : gdkids) { + if (!sfile.isDirectory()) { + // openFile + int fd = storage.openFile(sfile.getPath(), "r"); + assertNotEquals(-1, fd); + // getSubPath (from folder) + String uri = storage.getSubPath(file.getPath(), sfile.getName()); + assertEquals(sfile.getPath(), uri); + // getParentUri (from file) + uri = storage.getParentUri(sfile.getPath()); + assertEquals(file.getPath(), uri); + // exists (doc) + assertTrue(storage.exists(sfile.getPath())); + // getFileInfo (doc) + info = storage.getFileInfo(sfile.getPath()); + assertEquals(info.getPath(), sfile.getPath()); + assertEquals(info.getName(), sfile.getName()); + assertEquals(info.isDirectory(), sfile.isDirectory()); + assertNotEquals(0, info.getUpdateTime()); + assertFalse(info.isDirectory()); + } else { + // getParentUri (from subfolder) + String uri = storage.getParentUri(sfile.getPath()); + assertEquals(file.getPath(), uri); + // exists (subfolder) + assertTrue(storage.exists(sfile.getPath())); + } + } + directoryDone = true; + } + if (!file.isDirectory() && !fileDone) { + // getParentUri + String parentUri = storage.getParentUri(file.getPath()); + // FIXME fails because getParentUri returns a docId, not a treeId + //assertEquals(rootUri, parentUri); + // getSubPath (from root) + String kidUri = storage.getSubPath(rootUri, file.getName()); + assertEquals(file.getPath(), kidUri); + // exists (file) + assertTrue(storage.exists(file.getPath())); + fileDone = true; + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + + //@Test + public void testLargeFolder() { + ActivityScenario scenario = ActivityScenario.launch(NativeGLActivity.class); + scenario.onActivity(activity -> { + try { + // Configure storage + AndroidStorage storage = activity.getStorage(); + String rootUri = TREE_URI; + storage.setStorageDirectories(Arrays.asList(rootUri)); + + // list content + String uri = storage.getSubPath(rootUri, "textures"); + uri = storage.getSubPath(uri, "T1401N"); + long t0 = System.currentTimeMillis(); + FileInfo[] kids = storage.listContent(uri); + Log.d("testLargeFolder", "Got " + kids.length + " in " + (System.currentTimeMillis() - t0) + " ms"); + // Got 2307 in 119910 ms !!! + // retrieving only uri in listContent: Got 2307 in 9007 ms + // retrieving uri+isDir: Got 2307 in 62281 ms + // manual listing: Got 2307 in 10212 ms + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } +} \ No newline at end of file diff --git a/shell/android-studio/flycast/src/main/AndroidManifest.xml b/shell/android-studio/flycast/src/main/AndroidManifest.xml index 63c30b1fd..845eefa90 100644 --- a/shell/android-studio/flycast/src/main/AndroidManifest.xml +++ b/shell/android-studio/flycast/src/main/AndroidManifest.xml @@ -1,4 +1,6 @@ - + + + android:requestLegacyExternalStorage="true" + android:allowBackup="false"> + android:name="com.flycast.emulator.MainActivity" + android:targetActivity="com.flycast.emulator.NativeGLActivity" + android:exported="true"> - diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java index f3771905d..5533e4482 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/AndroidStorage.java @@ -18,27 +18,39 @@ */ package com.flycast.emulator; -import android.annotation.SuppressLint; import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.ContentUris; import android.content.CursorLoader; +import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; +import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.provider.DocumentsContract; import android.provider.MediaStore; +import android.util.Log; import androidx.documentfile.provider.DocumentFile; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; import java.util.List; public class AndroidStorage { public static final int ADD_STORAGE_ACTIVITY_REQUEST = 15012010; + public static final int EXPORT_HOME_ACTIVITY_REQUEST = 15012011; + public static final int IMPORT_HOME_ACTIVITY_REQUEST = 15012012; private Activity activity; @@ -56,8 +68,10 @@ public void setStorageDirectories(List storageDirectories) { public native void init(); public native void addStorageCallback(String path); + public native void reloadConfig(); - public void onAddStorageResult(Intent data) { + public void onAddStorageResult(Intent data) + { Uri uri = data == null ? null : data.getData(); if (uri == null) { // Cancelled @@ -65,12 +79,35 @@ public void onAddStorageResult(Intent data) { } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - activity.getContentResolver().takePersistableUriPermission(uri, storageIntentPerms); - String realPath = getRealPath(uri); - if (realPath != null) - addStorageCallback(realPath); - else - addStorageCallback(uri.toString()); + { + try { + activity.getContentResolver().takePersistableUriPermission(uri, storageIntentPerms); + } catch (SecurityException e) { + Log.w("Flycast", "takePersistableUriPermission failed", e); + AlertDialog.Builder dlgAlert = new AlertDialog.Builder(activity); + dlgAlert.setMessage("Can't get permissions to access this folder.\nPlease select a different one."); + dlgAlert.setTitle("Storage Error"); + dlgAlert.setPositiveButton("Ok", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog,int id) { + addStorageCallback(null); + } + }); + dlgAlert.setIcon(android.R.drawable.ic_dialog_alert); + dlgAlert.setCancelable(false); + dlgAlert.create().show(); + return; + } + } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + String realPath = getRealPath(uri); + if (realPath != null) { + addStorageCallback(realPath); + return; + } + } + addStorageCallback(uri.toString()); } } @@ -79,19 +116,78 @@ public int openFile(String uri, String mode) throws FileNotFoundException { return pfd.detachFd(); } - public FileInfo[] listContent(String uri) { - DocumentFile docFile = DocumentFile.fromTreeUri(activity, Uri.parse(uri)); - DocumentFile kids[] = docFile.listFiles(); - FileInfo ret[] = new FileInfo[kids.length]; - for (int i = 0; i < kids.length; i++) { - ret[i] = new FileInfo(); - ret[i].setName(kids[i].getName()); - ret[i].setPath(kids[i].getUri().toString()); - ret[i].setDirectory(kids[i].isDirectory()); + public InputStream openInputStream(String uri) throws FileNotFoundException { + return activity.getContentResolver().openInputStream(Uri.parse(uri)); + } + public OutputStream openOutputStream(String parent, String name) throws FileNotFoundException { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + throw new UnsupportedOperationException("not supported"); + Uri uri = Uri.parse(parent); + String subpath = getSubPath(parent, name); + if (!exists(subpath)) { + String documentId; + if (DocumentsContract.isDocumentUri(activity, uri)) + documentId = DocumentsContract.getDocumentId(uri); + else + documentId = DocumentsContract.getTreeDocumentId(uri); + uri = DocumentsContract.buildDocumentUriUsingTree(uri, documentId); + uri = DocumentsContract.createDocument(activity.getContentResolver(), uri, + "application/octet-stream", name); + } + else { + uri = Uri.parse(subpath); } - return ret; + return activity.getContentResolver().openOutputStream(uri); } + public FileInfo[] listContent(String uri) + { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + throw new UnsupportedOperationException("listContent unsupported"); + Uri treeUri = Uri.parse(uri); + String documentId; + if (DocumentsContract.isDocumentUri(activity, treeUri)) + documentId = DocumentsContract.getDocumentId(treeUri); + else + documentId = DocumentsContract.getTreeDocumentId(treeUri); + Uri docUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId); + final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(docUri, + DocumentsContract.getDocumentId(docUri)); + final ArrayList results = new ArrayList<>(); + + Cursor c = null; + try { + final ContentResolver resolver = activity.getContentResolver(); + c = resolver.query(childrenUri, new String[] { + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_MIME_TYPE }, null, null, null); + while (c.moveToNext()) + { + final String childId = c.getString(0); + final Uri childUri = DocumentsContract.buildDocumentUriUsingTree(docUri, childId); + FileInfo info = new FileInfo(); + info.setPath(childUri.toString()); + info.setName(c.getString(1)); + info.setDirectory(DocumentsContract.Document.MIME_TYPE_DIR.equals(c.getString(2))); + results.add(info); + } + } catch (Exception e) { + Log.w("Flycast", "Failed query: " + e); + throw new RuntimeException(e); + } finally { + if (c != null) { + try { + c.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + return results.toArray(new FileInfo[results.size()]); + } + public String getParentUri(String uriString) throws FileNotFoundException { if (uriString.isEmpty()) return ""; @@ -102,8 +198,6 @@ public String getParentUri(String uriString) throws FileNotFoundException { List comps = path.getPath(); if (comps.size() > 1) return DocumentsContract.buildDocumentUriUsingTree(uri, comps.get(comps.size() - 2)).toString(); - else - return ""; } catch (IllegalArgumentException e) { // Happens for root storage uri: // DocumentsContract: Failed to find path: Invalid URI: content://com.android.externalstorage.documents/tree/primary%3AFlycast @@ -118,26 +212,35 @@ public String getParentUri(String uriString) throws FileNotFoundException { return uriString.substring(0, i); } - public String getSubPath(String reference, String relative) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - Uri refUri = Uri.parse(reference); - String docId = DocumentsContract.getDocumentId(refUri); - String ret; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) - ret = DocumentsContract.buildDocumentUriUsingTree(refUri, docId + "/" + relative).toString(); - else - ret = DocumentsContract.buildDocumentUri(refUri.getAuthority(), docId + "/" + relative).toString(); - return ret; - } - else { + public String getSubPath(String reference, String relative) + { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) throw new UnsupportedOperationException("getSubPath unsupported"); + Uri refUri = Uri.parse(reference); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + String docId; + if (DocumentsContract.isDocumentUri(activity, refUri)) + docId = DocumentsContract.getDocumentId(refUri); + else + docId = DocumentsContract.getTreeDocumentId(refUri); + return DocumentsContract.buildDocumentUriUsingTree(refUri, docId + "/" + relative).toString(); } + String docId = DocumentsContract.getDocumentId(refUri); + return DocumentsContract.buildDocumentUri(refUri.getAuthority(), docId + "/" + relative).toString(); } - public FileInfo getFileInfo(String uriString) throws FileNotFoundException { + public FileInfo getFileInfo(String uriString) throws FileNotFoundException + { Uri uri = Uri.parse(uriString); - DocumentFile docFile = DocumentFile.fromTreeUri(activity, uri); - if (!docFile.exists()) + // FIXME < Build.VERSION_CODES.LOLLIPOP + DocumentFile docFile = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (DocumentsContract.isDocumentUri(activity, uri)) + docFile = DocumentFile.fromSingleUri(activity, uri); + else + docFile = DocumentFile.fromTreeUri(activity, uri); + } + if (docFile == null || !docFile.exists()) throw new FileNotFoundException(uriString); FileInfo info = new FileInfo(); info.setPath(uriString); @@ -145,23 +248,95 @@ public FileInfo getFileInfo(String uriString) throws FileNotFoundException { info.setDirectory(docFile.isDirectory()); info.setSize(docFile.length()); info.setWritable(docFile.canWrite()); + info.setUpdateTime(docFile.lastModified() / 1000); return info; } - public void addStorage(boolean isDirectory, boolean writeAccess) { + public boolean exists(String uriString) + { + Uri uri = Uri.parse(uriString); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (!DocumentsContract.isDocumentUri(activity, uri)) + { + String documentId = DocumentsContract.getTreeDocumentId(uri); + uri = DocumentsContract.buildDocumentUriUsingTree(uri, documentId); + } + } + Cursor cursor = null; + try { + cursor = activity.getContentResolver().query(uri, new String[]{ DocumentsContract.Document.COLUMN_DISPLAY_NAME }, + null, null, null); + boolean ret = cursor != null && cursor.moveToNext(); + return ret; + } catch (Exception e) { + return false; + } finally { + if (cursor != null) + cursor.close(); + } + } + + public String mkdir(String parent, String name) throws FileNotFoundException + { + Uri parentUri = Uri.parse(parent); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (!DocumentsContract.isDocumentUri(activity, parentUri)) { + String documentId = DocumentsContract.getTreeDocumentId(parentUri); + parentUri = DocumentsContract.buildDocumentUriUsingTree(parentUri, documentId); + } + Uri newDirUri = DocumentsContract.createDocument(activity.getContentResolver(), parentUri, DocumentsContract.Document.MIME_TYPE_DIR, name); + return newDirUri.toString(); + } + File dir = new File(parent, name); + dir.mkdir(); + return dir.getAbsolutePath(); + } + + public boolean addStorage(boolean isDirectory, boolean writeAccess, String description, String mimeType) + { + if (isDirectory && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + return false; Intent intent = new Intent(isDirectory ? Intent.ACTION_OPEN_DOCUMENT_TREE : Intent.ACTION_OPEN_DOCUMENT); if (!isDirectory) { intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType("application/*"); - intent = Intent.createChooser(intent, "Select a cheat file"); - } - else { - intent = Intent.createChooser(intent, "Select a directory"); + if (!mimeType.isEmpty()) + intent.setType(mimeType); + else + intent.setType("application/*"); } + intent = Intent.createChooser(intent, description); storageIntentPerms = Intent.FLAG_GRANT_READ_URI_PERMISSION | (writeAccess ? Intent.FLAG_GRANT_WRITE_URI_PERMISSION : 0); intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | storageIntentPerms); - activity.startActivityForResult(intent, ADD_STORAGE_ACTIVITY_REQUEST); + try { + activity.startActivityForResult(intent, ADD_STORAGE_ACTIVITY_REQUEST); + } catch (ActivityNotFoundException aex) { + Log.w("flycast", "Unable to start file/folder picker", aex); + activity.runOnUiThread(new Runnable() { + public void run() { + String message; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + // Android 10+ requires SAF + message = "No appropriate file manager was found on your device.\n" + + "Please install a Storage Access Framework compatible file manager"; + else + message = "No appropriate file manager was found on your device.\n" + + "Please install a file manager or try to disable 'Use SAF File Picker' in the general settings"; + new AlertDialog.Builder(activity) + .setTitle("File Manager not found") + .setMessage(message) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + addStorageCallback(null); + } + }) + .show(); + } + }); + } + + return true; } private String getRealPath(final Uri uri) { @@ -173,14 +348,15 @@ private String getRealPath(final Uri uri) { // From https://github.com/HBiSoft/PickiT // Copyright (c) [2020] [HBiSoft] - @SuppressLint("NewApi") String getRealPathFromURI_API19(final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - if (isKitKat && (DocumentsContract.isDocumentUri(activity, uri) || DocumentsContract.isTreeUri(uri))) { - final boolean isTree = DocumentsContract.isTreeUri(uri); - if (isExternalStorageDocument(uri)) { + final boolean isTree = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && DocumentsContract.isTreeUri(uri); + if (isKitKat && (DocumentsContract.isDocumentUri(activity, uri) || isTree)) + { + if (isExternalStorageDocument(uri)) + { final String docId = isTree ? DocumentsContract.getTreeDocumentId(uri) : DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; @@ -388,4 +564,77 @@ String getRealPathFromURI_BelowAPI19(Uri contentUri) { cursor.close(); return result; } + + public void saveScreenshot(String name, byte data[]) + { + File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + File file = new File(path, name); + + try { + // Make sure the Pictures directory exists. + path.mkdirs(); + + OutputStream os = new FileOutputStream(file); + try { + os.write(data); + } catch (IOException e) { + try { os.close(); } catch (IOException e1) {} + file.delete(); + throw e; + } + os.close(); + + // Tell the media scanner about the new file so that it is + // immediately available to the user. + MediaScannerConnection.scanFile(activity, + new String[] { file.toString() }, null, null); + } catch (IOException e) { + // Unable to create file, likely because external storage is + // not currently mounted. + Log.w("flycast", "saveScreenshot: Error writing " + file, e); + throw new RuntimeException(e.getMessage()); + } + } + + public void exportHomeDirectory() + { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + intent = Intent.createChooser(intent, "Select an export folder"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + activity.startActivityForResult(intent, EXPORT_HOME_ACTIVITY_REQUEST); + } + + public void onExportHomeResult(Intent data) + { + Uri uri = data == null ? null : data.getData(); + if (uri == null) + // Cancelled + return; + HomeMover mover = new HomeMover(activity, this); + mover.copyHome(activity.getExternalFilesDir(null).toURI().toString(), uri.toString(), "Exporting home folder"); + } + + public void importHomeDirectory() + { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + intent = Intent.createChooser(intent, "Select an import folder"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + activity.startActivityForResult(intent, IMPORT_HOME_ACTIVITY_REQUEST); + } + + public void onImportHomeResult(Intent data) + { + Uri uri = data == null ? null : data.getData(); + if (uri == null) + // Cancelled + return; + HomeMover mover = new HomeMover(activity, this); + mover.setReloadConfigOnCompletion(true); + mover.copyHome(uri.toString(), activity.getExternalFilesDir(null).toURI().toString(), "Importing home folder"); + } + + public boolean requiresSafFilePicker() { + // Android 10+ requires ASS + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; + } } diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java similarity index 74% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java index 64e88b4b0..873a4334b 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/BaseGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/BaseGLActivity.java @@ -1,4 +1,4 @@ -package com.reicast.emulator; +package com.flycast.emulator; import android.Manifest; import android.app.Activity; @@ -26,23 +26,18 @@ import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; -import com.flycast.emulator.AndroidStorage; -import com.reicast.emulator.config.Config; -import com.reicast.emulator.emu.AudioBackend; -import com.reicast.emulator.emu.HttpClient; -import com.reicast.emulator.emu.JNIdc; -import com.reicast.emulator.periph.InputDeviceManager; -import com.reicast.emulator.periph.SipEmulator; +import com.flycast.emulator.config.Config; +import com.flycast.emulator.emu.AudioBackend; +import com.flycast.emulator.emu.HttpClient; +import com.flycast.emulator.emu.JNIdc; +import com.flycast.emulator.periph.InputDeviceManager; +import com.flycast.emulator.periph.SipEmulator; import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import tv.ouya.console.api.OuyaController; - import static android.content.res.Configuration.HARDKEYBOARDHIDDEN_NO; import static android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; @@ -54,7 +49,6 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. private static final int AUDIO_PERM_REQUEST = 1002; protected SharedPreferences prefs; - protected float[][] vjoy_d_cached; // Used for VJoy editing private AudioBackend audioBackend; protected Handler handler = new Handler(); private boolean audioPermissionRequested = false; @@ -69,6 +63,13 @@ public abstract class BaseGLActivity extends Activity implements ActivityCompat. protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (!(getApplicationContext() instanceof Emulator)) { + // app is in restricted mode, kill it + // See https://medium.com/@pablobaxter/what-happened-to-my-subclass-android-application-924c91bafcac + handler.post(() -> System.exit(0)); + finish(); + return; + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Set the navigation bar color to 0 to avoid left over when it fades out on Android 10 Window window = getWindow(); @@ -86,15 +87,18 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } prefs = PreferenceManager.getDefaultSharedPreferences(this); - Emulator app = (Emulator)getApplicationContext(); - app.getConfigurationPrefs(); Emulator.setCurrentActivity(this); - - OuyaController.init(this); new HttpClient().nativeInit(); - String home_directory = prefs.getString(Config.pref_home, ""); - String result = JNIdc.initEnvironment((Emulator)getApplicationContext(), getFilesDir().getAbsolutePath(), home_directory, + String homeDir = prefs.getString(Config.pref_home, ""); + // Check that home dir is valid + if (homeDir.isEmpty()) { + // home dir not set: use default + homeDir = getDefaultHomeDir(); + prefs.edit().putString(Config.pref_home, homeDir).apply(); + } + + String result = JNIdc.initEnvironment((Emulator)getApplicationContext(), getFilesDir().getAbsolutePath(), homeDir, Locale.getDefault().toString()); if (result != null) { AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); @@ -115,8 +119,19 @@ public void onClick(DialogInterface dialog,int id) { return; } Log.i("flycast", "Environment initialized"); + if ("marble".equals(Build.DEVICE) || "marblein".equals(Build.DEVICE) + || "garnet".equals(Build.DEVICE) || "XIG05".equals(Build.DEVICE)) + { + // Disable omp affinity for POCO F5 and Redmi Note 12 Turbo (marble, marblein) + // and Redmi Note 13 Pro 5G and POCO X6 5G (garnet, XIG05) + // because it crashes with ndk 27.1 / clang 18.x + // See https://github.com/android/ndk/issues/1180 + Log.i("flycast", "Disabling OpenMP thread affinity for device " + Build.DEVICE); + JNIdc.disableOmpAffinity(); + } + Emulator app = (Emulator)getApplicationContext(); + app.getConfigurationPrefs(); storage = new AndroidStorage(this); - installButtons(); setStorageDirectories(); boolean externalStorageLegacy = true; @@ -125,10 +140,11 @@ public void onClick(DialogInterface dialog,int id) { //Log.i("flycast", "External storage legacy: " + (externalStorageLegacy ? "preserved" : "lost")); } if (!storagePermissionGranted) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || !externalStorageLegacy) // No permission needed before Android 6 + // Permissions only needed in legacy external storage mode storagePermissionGranted = true; - else if (externalStorageLegacy) { + else { Log.i("flycast", "Asking for external storage permission"); ActivityCompat.requestPermissions(this, new String[]{ @@ -180,6 +196,11 @@ private void setStorageDirectories() JNIdc.setExternalStorageDirectories(pathList.toArray()); } + // Testing + public AndroidStorage getStorage() { + return storage; + } + @Override protected void onDestroy() { super.onDestroy(); @@ -248,40 +269,43 @@ private boolean showMenu() { private boolean processJoystickInput(MotionEvent event, int axis) { float v = event.getAxisValue(axis); - return InputDeviceManager.getInstance().joystickAxisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); + return InputDeviceManager.getInstance().axisEvent(event.getDeviceId(), axis, (int)Math.round(v * 32767.f)); } @Override public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK && event.getAction() == MotionEvent.ACTION_MOVE) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK + && event.getAction() == MotionEvent.ACTION_MOVE + && event.getDevice() != null) + { List axes = event.getDevice().getMotionRanges(); boolean rc = false; for (InputDevice.MotionRange range : axes) if (range.getAxis() == MotionEvent.AXIS_HAT_X) { float v = event.getAxisValue(MotionEvent.AXIS_HAT_X); if (v == -1.0) { - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, true); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); } else if (v == 1.0) { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, true); } else { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_LEFT, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_RIGHT, false); } } else if (range.getAxis() == MotionEvent.AXIS_HAT_Y) { float v = event.getAxisValue(MotionEvent.AXIS_HAT_Y); if (v == -1.0) { - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, true); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); } else if (v == 1.0) { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); - rc |= InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, true); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); + rc |= InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, true); } else { - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); - InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_UP, false); + InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), KeyEvent.KEYCODE_DPAD_DOWN, false); } } else @@ -305,7 +329,7 @@ else if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) == InputDevice.S @Override public boolean onKeyUp(int keyCode, KeyEvent event) { - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, false)) + if (InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), keyCode, false)) return true; if (hasKeyboard && InputDeviceManager.getInstance().keyboardEvent(keyCode, false)) return true; @@ -316,16 +340,15 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getRepeatCount() == 0) { if (keyCode == KeyEvent.KEYCODE_BACK) { - if (!JNIdc.guiIsOpen()) { - showMenu(); - return true; - } - else if (JNIdc.guiIsContentBrowser()) { + if (JNIdc.guiIsContentBrowser()) { finish(); - return true; } + else { + showMenu(); + } + return true; } - if (InputDeviceManager.getInstance().joystickButtonEvent(event.getDeviceId(), keyCode, true)) + if (InputDeviceManager.getInstance().buttonEvent(event.getDeviceId(), keyCode, true)) return true; if (hasKeyboard) { @@ -392,25 +415,17 @@ else if (requestCode == STORAGE_PERM_REQUEST) { } //setup mic - if (Emulator.micPluggedIn()) + if (InputDeviceManager.isMicPluggedIn()) requestRecordAudioPermission(); } } - private void installButtons() { - try { - InputStream in = Emulator.getAppContext().getAssets().open("buttons.png"); - - if (in != null) { - byte[] buf = new byte[in.available()]; - in.read(buf); - in.close(); - JNIdc.setButtons(buf); - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } + private String getDefaultHomeDir() { + File dir = getExternalFilesDir(null); + if (dir == null) + dir = getFilesDir(); + return dir.getAbsolutePath(); } // Called from native code @@ -428,9 +443,27 @@ public void run() { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == AndroidStorage.ADD_STORAGE_ACTIVITY_REQUEST) - storage.onAddStorageResult(data); + switch (requestCode) + { + case AndroidStorage.ADD_STORAGE_ACTIVITY_REQUEST: + storage.onAddStorageResult(data); + break; + case AndroidStorage.IMPORT_HOME_ACTIVITY_REQUEST: + storage.onImportHomeResult(data); + break; + case AndroidStorage.EXPORT_HOME_ACTIVITY_REQUEST: + storage.onExportHomeResult(data); + break; + } } private static native void register(BaseGLActivity activity); + + public String getNativeLibDir() { + return getApplicationContext().getApplicationInfo().nativeLibraryDir; + } + + public String getInternalFilesDir() { + return getFilesDir().getAbsolutePath(); + } } diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/Emulator.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java similarity index 62% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/Emulator.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java index e50803f99..5a089d2bf 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/Emulator.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/Emulator.java @@ -1,4 +1,4 @@ -package com.reicast.emulator; +package com.flycast.emulator; import android.app.Application; import android.content.Context; @@ -9,8 +9,9 @@ import androidx.appcompat.app.AppCompatDelegate; -import com.reicast.emulator.config.Config; -import com.reicast.emulator.emu.JNIdc; +import com.flycast.emulator.config.Config; +import com.flycast.emulator.emu.VGamepad; +import com.flycast.emulator.periph.InputDeviceManager; public class Emulator extends Application { private static Context context; @@ -18,32 +19,14 @@ public class Emulator extends Application { private WifiManager wifiManager = null; private WifiManager.MulticastLock multicastLock = null; - // see MapleDeviceType in hw/maple/maple_devs.h - public static final int MDT_Microphone = 2; - public static final int MDT_None = 8; - - public static int vibrationDuration = 20; - - public static int[] maple_devices = { - MDT_None, - MDT_None, - MDT_None, - MDT_None - }; - public static int[][] maple_expansion_devices = { - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - { MDT_None, MDT_None }, - }; + public static int vibrationPower = 80; /** * Load the settings from native code * */ public void getConfigurationPrefs() { - Emulator.vibrationDuration = JNIdc.getVirtualGamepadVibration(); - JNIdc.getControllers(maple_devices, maple_expansion_devices); + Emulator.vibrationPower = VGamepad.getVibrationPower(); } /** @@ -54,26 +37,17 @@ public void SaveAndroidSettings(String homeDirectory) { Log.i("flycast", "SaveAndroidSettings: saving preferences"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - Emulator.vibrationDuration = JNIdc.getVirtualGamepadVibration(); - JNIdc.getControllers(maple_devices, maple_expansion_devices); + Emulator.vibrationPower = VGamepad.getVibrationPower(); prefs.edit() .putString(Config.pref_home, homeDirectory).apply(); - if (micPluggedIn() && currentActivity instanceof BaseGLActivity) { + if (InputDeviceManager.isMicPluggedIn() && currentActivity instanceof BaseGLActivity) { + Log.i("flycast", "SaveAndroidSettings: MIC PLUGGED IN"); ((BaseGLActivity)currentActivity).requestRecordAudioPermission(); } } - public static boolean micPluggedIn() { - JNIdc.getControllers(maple_devices, maple_expansion_devices); - for (int[] maple_expansion_device : maple_expansion_devices) - if (maple_expansion_device[0] == MDT_Microphone - || maple_expansion_device[1] == MDT_Microphone) - return true; - return false; - } - @Override public void onCreate() { super.onCreate(); diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/FileBrowser.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileBrowser.java similarity index 98% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/FileBrowser.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileBrowser.java index cda1b285c..87e2376a9 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/FileBrowser.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileBrowser.java @@ -1,4 +1,4 @@ -package com.reicast.emulator; +package com.flycast.emulator; import org.apache.commons.lang3.StringUtils; diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileInfo.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileInfo.java index 5b036a33d..ba007f8aa 100644 --- a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileInfo.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/FileInfo.java @@ -59,9 +59,18 @@ public void setSize(long size) { this.size = size; } + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + String name; String path; boolean isDirectory; boolean isWritable; long size; + long updateTime; } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java new file mode 100644 index 000000000..0256f6d6f --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/HomeMover.java @@ -0,0 +1,244 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.net.Uri; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +public class HomeMover { + private Activity activity; + private AndroidStorage storage; + private StorageWrapper wrapper; + private boolean migrationThreadCancelled = false; + + private boolean reloadConfigOnCompletion = false; + + private class StorageWrapper + { + private File getFile(String path) { + Uri uri = Uri.parse(path); + if (uri.getScheme().equals("file")) + return new File(uri.getPath()); + else + return null; + } + public String getSubPath(String parent, String kid) + { + File f = getFile(parent); + if (f != null) + return new File(f, kid).toURI().toString(); + else { + try { + return storage.getSubPath(parent, kid); + } catch (RuntimeException e) { + return null; + } + } + } + + public FileInfo[] listContent(String folder) + { + File dir = getFile(folder); + if (dir != null) + { + File[] files = dir.listFiles(); + List ret = new ArrayList<>(files.length); + for (File f : files) { + FileInfo info = new FileInfo(); + info.setName(f.getName()); + info.setDirectory(f.isDirectory()); + info.setPath(f.toURI().toString()); + ret.add(info); + } + return ret.toArray(new FileInfo[ret.size()]); + } + else { + return storage.listContent(folder); + } + } + + public InputStream openInputStream(String path) throws FileNotFoundException { + File file = getFile(path); + if (file != null) + return new FileInputStream(file); + else + return storage.openInputStream(path); + } + + public OutputStream openOutputStream(String parent, String name) throws FileNotFoundException { + File file = getFile(parent); + if (file != null) + return new FileOutputStream(new File(file, name)); + else + return storage.openOutputStream(parent, name); + } + + public boolean exists(String path) { + if (path == null) + return false; + File file = getFile(path); + if (file != null) + return file.exists(); + else + return storage.exists(path); + } + + public String mkdir(String parent, String name) throws FileNotFoundException + { + File dir = getFile(parent); + if (dir != null) + { + File subfolder = new File(dir, name); + subfolder.mkdir(); + return subfolder.toURI().toString(); + } + else { + return storage.mkdir(parent, name); + } + } + } + + public HomeMover(Activity activity, AndroidStorage storage) { + this.activity = activity; + this.storage = storage; + this.wrapper = new StorageWrapper(); + } + + public void copyHome(String source, String dest, String message) + { + migrationThreadCancelled = false; + ProgressDialog progress = new ProgressDialog(activity); + progress.setTitle("Copying"); + progress.setMessage(message); + progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progress.setMax(1); + progress.setOnCancelListener(dialogInterface -> migrationThreadCancelled = true); + progress.show(); + + Thread thread = new Thread(new Runnable() { + private void copyFile(String path, String name, String toDir) + { + if (path == null) + return; + //Log.d("flycast", "Copying " + path + " to " + toDir); + try { + InputStream in = wrapper.openInputStream(path); + OutputStream out = wrapper.openOutputStream(toDir, name); + byte[] buf = new byte[8192]; + while (true) { + int len = in.read(buf); + if (len == -1) + break; + out.write(buf, 0, len); + } + out.close(); + in.close(); + } catch (Exception e) { + Log.e("flycast", "Error copying " + path, e); + } + } + + private void copyDir(String from, String toParent, String name) + { + //Log.d("flycast", "Copying folder " + from + " to " + toParent + " / " + name); + if (!wrapper.exists(from)) + return; + try { + String to = wrapper.getSubPath(toParent, name); + if (!wrapper.exists(to)) + to = wrapper.mkdir(toParent, name); + + FileInfo[] files = wrapper.listContent(from); + incrementMaxProgress(files.length); + for (FileInfo file : files) + { + if (migrationThreadCancelled) + break; + if (!file.isDirectory()) + copyFile(file.path, file.name, to); + else + copyDir(file.path, to, file.getName()); + incrementProgress(1); + } + } catch (Exception e) { + Log.e("flycast", "Error copying folder " + from, e); + } + } + + private void migrate() + { + incrementMaxProgress(3); + String path = wrapper.getSubPath(source, "emu.cfg"); + copyFile(path, "emu.cfg", dest); + if (migrationThreadCancelled) + return; + incrementProgress(1); + + String srcMappings = wrapper.getSubPath(source, "mappings"); + copyDir(srcMappings, dest, "mappings"); + if (migrationThreadCancelled) + return; + incrementProgress(1); + + String srcData = wrapper.getSubPath(source, "data"); + copyDir(srcData, dest, "data"); + incrementProgress(1); + } + + private void incrementMaxProgress(int max) { + activity.runOnUiThread(() -> { + progress.setMax(progress.getMax() + max); + }); + } + private void incrementProgress(int i) { + activity.runOnUiThread(() -> { + progress.incrementProgressBy(i); + }); + } + + @Override + public void run() + { + migrate(); + activity.runOnUiThread(() -> { + progress.dismiss(); + if (reloadConfigOnCompletion) + storage.reloadConfig(); + }); + } + }); + thread.start(); + } + + public void setReloadConfigOnCompletion(boolean reloadConfigOnCompletion) { + this.reloadConfigOnCompletion = reloadConfigOnCompletion; + } +} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/NativeGLActivity.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java similarity index 87% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/NativeGLActivity.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java index 8bb80cd2a..72bd5f74b 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/NativeGLActivity.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/NativeGLActivity.java @@ -1,4 +1,4 @@ -package com.reicast.emulator; +package com.flycast.emulator; import android.content.Context; import android.os.Bundle; @@ -16,10 +16,8 @@ import androidx.annotation.Nullable; -import com.reicast.emulator.emu.JNIdc; -import com.reicast.emulator.emu.NativeGLView; -import com.reicast.emulator.periph.InputDeviceManager; -import com.reicast.emulator.periph.VJoy; +import com.flycast.emulator.emu.NativeGLView; +import com.flycast.emulator.periph.InputDeviceManager; public final class NativeGLActivity extends BaseGLActivity { @@ -46,45 +44,38 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { @Override protected void doPause() { - mView.pause(); + if (mView != null) + mView.pause(); } @Override protected void doResume() { - mView.resume(); + if (mView != null) + mView.resume(); } @Override public boolean isSurfaceReady() { - return mView.isSurfaceReady(); + return mView != null && mView.isSurfaceReady(); } - // Called from native code - private void VJoyStartEditing() { - vjoy_d_cached = VJoy.readCustomVjoyValues(getApplicationContext()); - JNIdc.show_osd(); - mView.setEditVjoyMode(true); - } - // Called from native code - private void VJoyResetEditing() { - VJoy.resetCustomVjoyValues(getApplicationContext()); - mView.readCustomVjoyValues(); - mView.resetEditMode(); - handler.post(new Runnable() { - @Override + @Override + public void onGameStateChange(boolean started) { + super.onGameStateChange(started); + runOnUiThread(new Runnable() { public void run() { - mView.requestLayout(); + if (started) + mView.showVGamepad(); } }); } + // Called from native code - private void VJoyStopEditing(final boolean canceled) { + public void setVGamepadEditMode(boolean editing) { handler.post(new Runnable() { @Override public void run() { - if (canceled) - mView.restoreCustomVjoyValues(vjoy_d_cached); - mView.setEditVjoyMode(false); + mView.setVGamepadEditMode(editing); } }); } @@ -139,13 +130,11 @@ public void run() { } } - // Called from native code - public void showTextInput(int x, int y, int w, int h) { + private void showTextInput(int x, int y, int w, int h) { // Transfer the task to the main thread as a Runnable handler.post(new ShowTextInputTask(x, y, w, h)); } - // Called from native code public void hideTextInput() { Log.d("flycast", "hideTextInput " + (mTextEdit != null ? "mTextEdit != null" : "")); if (mTextEdit != null) { @@ -169,15 +158,22 @@ public void run() { } // Called from native code - public boolean isScreenKeyboardShown() { - if (mTextEdit == null) - return false; - - if (!mScreenKeyboardShown) - return false; - - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - return imm.isAcceptingText(); + public void showScreenKeyboard(boolean show) { + handler.post(new Runnable() { + @Override + public void run() { + if (!show && (mTextEdit == null || !mScreenKeyboardShown)) + return; + + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if (show != imm.isAcceptingText()) { + if (show) + showTextInput(0, 0, 16, 100); + else + hideTextInput(); + } + } + }); } } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/config/Config.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/config/Config.java new file mode 100644 index 000000000..ab59afc5f --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/config/Config.java @@ -0,0 +1,5 @@ +package com.flycast.emulator.config; + +public class Config { + public static final String pref_home = "home_directory"; +} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/AudioBackend.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/AudioBackend.java similarity index 98% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/AudioBackend.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/AudioBackend.java index 3654251f7..e88bee7b9 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/AudioBackend.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/AudioBackend.java @@ -1,4 +1,4 @@ -package com.reicast.emulator.emu; +package com.flycast.emulator.emu; import android.media.AudioFormat; import android.media.AudioManager; diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java new file mode 100644 index 000000000..1cad6c1a9 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/EditVirtualJoystickDelegate.java @@ -0,0 +1,113 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; + +import androidx.annotation.NonNull; + +public class EditVirtualJoystickDelegate implements TouchEventHandler +{ + private View view; + private ScaleGestureDetector scaleGestureDetector; + private int currentElement = -1; + private float lastX, lastY; + + public EditVirtualJoystickDelegate(View view) { + this.view = view; + scaleGestureDetector = new ScaleGestureDetector(view.getContext(), new EditVirtualJoystickDelegate.ScaleGestureListener()); + } + + @Override + public void stop() { + } + @Override + public void show() { + VGamepad.show(); + } + + @Override + public boolean onTouchEvent(MotionEvent event, int width, int height) + { + scaleGestureDetector.onTouchEvent(event); + if (scaleGestureDetector.isInProgress()) { + currentElement = -1; + return true; + } + + int actionMasked = event.getActionMasked(); + int actionIndex = event.getActionIndex(); + switch (actionMasked) + { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + currentElement = -1; + break; + + case MotionEvent.ACTION_DOWN: + lastX = event.getX(actionIndex) / view.getWidth(); + lastY = event.getY(actionIndex) / view.getHeight(); + currentElement = VGamepad.layoutHitTest(lastX, lastY); + return true; // must return true if we want the scale gesture detector to work + + case MotionEvent.ACTION_MOVE: + if (currentElement != -1 && event.getPointerCount() == 1) + { + float x = event.getX(actionIndex) / view.getWidth(); + float y = event.getY(actionIndex) / view.getHeight(); + VGamepad.translateElement(currentElement, x - lastX, y - lastY); + lastX = x; + lastY = y; + return true; + } + break; + + default: + break; + } + + return false; + } + + private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { + private int elemId = -1; + @Override + public boolean onScaleBegin(@NonNull ScaleGestureDetector detector) + { + elemId = VGamepad.layoutHitTest(detector.getFocusX() / view.getWidth(), detector.getFocusY() / view.getHeight()); + return elemId != -1; + } + + @Override + public boolean onScale(ScaleGestureDetector detector) + { + if (elemId == -1) + return false; + VGamepad.scaleElement(elemId, detector.getScaleFactor()); + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector detector) { + elemId = -1; + } + } +} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/HttpClient.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/HttpClient.java similarity index 74% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/HttpClient.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/HttpClient.java index 17deee0e0..f39a9ae9f 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/HttpClient.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/HttpClient.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ -package com.reicast.emulator.emu; +package com.flycast.emulator.emu; import android.util.Log; @@ -27,6 +27,7 @@ import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.io.entity.StringEntity; import java.io.ByteArrayOutputStream; import java.io.File; @@ -40,6 +41,8 @@ public class HttpClient { private CloseableHttpClient httpClient; + static { System.loadLibrary("flycast"); } + // Called from native code public int openUrl(String url_string, byte[][] content, String[] contentType) { @@ -77,6 +80,38 @@ public int openUrl(String url_string, byte[][] content, String[] contentType) return 500; } + public int post(String urlString, String payload, String contentType, byte[][] reply) { + try { + if (httpClient == null) + httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(urlString); + httpPost.setEntity(new StringEntity(payload, contentType != null ? ContentType.create(contentType) : ContentType.APPLICATION_FORM_URLENCODED)); + CloseableHttpResponse response = httpClient.execute(httpPost); + InputStream is = response.getEntity().getContent(); + + byte[] buffer = new byte[1024]; + int length; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + while ((length = is.read(buffer)) > 0) { + baos.write(buffer, 0, length); + } + is.close(); + baos.close(); + reply[0] = baos.toByteArray(); + + return response.getCode(); + } catch (MalformedURLException e) { + Log.e("flycast", "Malformed URL", e); + } catch (IOException e) { + Log.e("flycast", "I/O error", e); + } catch (SecurityException e) { + Log.e("flycast", "Security error", e); + } catch (Throwable t) { + Log.e("flycast", "Unknown error", t); + } + return 500; + } public int post(String urlString, String[] fieldNames, String[] fieldValues, String[] contentTypes) { try { diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/JNIdc.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java similarity index 64% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/JNIdc.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java index 5b66bfc7d..7a3a0eb5c 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/JNIdc.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/JNIdc.java @@ -1,9 +1,9 @@ -package com.reicast.emulator.emu; +package com.flycast.emulator.emu; import android.view.Surface; -import com.reicast.emulator.Emulator; -import com.reicast.emulator.periph.SipEmulator; +import com.flycast.emulator.Emulator; +import com.flycast.emulator.periph.SipEmulator; public final class JNIdc { @@ -15,15 +15,11 @@ public final class JNIdc public static native void pause(); public static native void resume(); public static native void stop(); + public static native void disableOmpAffinity(); public static native void rendinitNative(Surface surface, int w, int h); - public static native void vjoy(int id, float x, float y, float w, float h); - - public static native void getControllers(int[] controllers, int[][] peripherals); - public static native void setupMic(SipEmulator sip); - public static native int getVirtualGamepadVibration(); public static native void screenCharacteristics(float screenDpi, float refreshRate); public static native void guiOpenSettings(); @@ -31,10 +27,4 @@ public final class JNIdc public static native boolean guiIsContentBrowser(); public static native void guiSetInsets(int left, int right, int top, int bottom); - public static void show_osd() { - JNIdc.vjoy(14, 1, 0, 0, 0); - } - public static native void hideOsd(); - - public static native void setButtons(byte[] data); } diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/NativeGLView.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java similarity index 79% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/NativeGLView.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java index 171230508..739afdfd9 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/NativeGLView.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/NativeGLView.java @@ -1,4 +1,4 @@ -package com.reicast.emulator.emu; +package com.flycast.emulator.emu; import android.annotation.TargetApi; import android.content.Context; @@ -10,6 +10,7 @@ import android.util.Log; import android.view.Display; import android.view.DisplayCutout; +import android.view.InputDevice; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -17,17 +18,14 @@ import android.view.WindowInsets; import android.view.WindowManager; -import com.reicast.emulator.Emulator; -import com.reicast.emulator.periph.InputDeviceManager; +import com.flycast.emulator.BaseGLActivity; +import com.flycast.emulator.Emulator; +import com.flycast.emulator.periph.InputDeviceManager; public class NativeGLView extends SurfaceView implements SurfaceHolder.Callback { private boolean surfaceReady = false; private boolean paused = false; - VirtualJoystickDelegate vjoyDelegate; - - public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { - vjoyDelegate.restoreCustomVjoyValues(vjoy_d_cached); - } + private TouchEventHandler vjoyDelegate = null; public NativeGLView(Context context) { this(context, null); @@ -62,20 +60,21 @@ public void onSystemUiVisibilityChange(int visibility) { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - vjoyDelegate = new VirtualJoystickDelegate(this); + if (InputDeviceManager.getInstance().hasTouchscreen()) + vjoyDelegate = new VirtualJoystickDelegate(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - vjoyDelegate.stop(); + if (vjoyDelegate != null) + vjoyDelegate.stop(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - vjoyDelegate.layout(getWidth(), getHeight()); DisplayMetrics dm = getContext().getResources().getDisplayMetrics(); Display d; @@ -100,10 +99,6 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto } } - public void resetEditMode() { - vjoyDelegate.resetEditMode(); - } - @Override public boolean onTouchEvent(final MotionEvent event) { @@ -112,13 +107,13 @@ public boolean onTouchEvent(final MotionEvent event) InputDeviceManager.getInstance().mouseEvent(Math.round(event.getX()), Math.round(event.getY()), event.getButtonState()); return true; } - else + if (vjoyDelegate != null && (event.getSource() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) return vjoyDelegate.onTouchEvent(event, getWidth(), getHeight()); + return false; } @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { - } @Override @@ -126,7 +121,9 @@ public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int w, int h Log.i("flycast", "NativeGLView.surfaceChanged: " + w + "x" + h); surfaceReady = true; JNIdc.rendinitNative(surfaceHolder.getSurface(), w, h); - Emulator.getCurrentActivity().handleStateChange(false); + BaseGLActivity activity = Emulator.getCurrentActivity(); + if (activity != null) + activity.handleStateChange(false); } @Override @@ -134,7 +131,9 @@ public void surfaceDestroyed(SurfaceHolder surfaceHolder) { Log.i("flycast", "NativeGLView.surfaceDestroyed"); surfaceReady = false; JNIdc.rendinitNative(null, 0, 0); - Emulator.getCurrentActivity().handleStateChange(true); + BaseGLActivity activity = Emulator.getCurrentActivity(); + if (activity != null) + activity.handleStateChange(true); } public boolean isSurfaceReady() { @@ -174,11 +173,18 @@ public void onWindowFocusChanged(boolean hasFocus) { } } - public void readCustomVjoyValues() { - vjoyDelegate.readCustomVjoyValues(); + public void setVGamepadEditMode(boolean editing) + { + if (!InputDeviceManager.getInstance().hasTouchscreen()) + return; + if (editing && !(vjoyDelegate instanceof EditVirtualJoystickDelegate)) + vjoyDelegate = new EditVirtualJoystickDelegate(this); + else if (!editing && !(vjoyDelegate instanceof VirtualJoystickDelegate)) + vjoyDelegate = new VirtualJoystickDelegate(this); } - public void setEditVjoyMode(boolean editVjoyMode) { - vjoyDelegate.setEditVjoyMode(editVjoyMode); + public void showVGamepad() { + if (vjoyDelegate != null) + vjoyDelegate.show(); } } diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java new file mode 100644 index 000000000..40f351337 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/TouchEventHandler.java @@ -0,0 +1,27 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +import android.view.MotionEvent; + +public interface TouchEventHandler { + boolean onTouchEvent(MotionEvent event, int width, int height); + void stop(); + void show(); +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java new file mode 100644 index 000000000..4b85c8ce6 --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VGamepad.java @@ -0,0 +1,35 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +public class VGamepad +{ + static { System.loadLibrary("flycast"); } + + public static native int getVibrationPower(); + + public static native void show(); + public static native void hide(); + public static native int hitTest(float x, float y); + public static native float getControlWidth(int controlId); + + public static native int layoutHitTest(float x, float y); + public static native void scaleElement(int elemId, float scale); + public static native void translateElement(int elemId, float x, float y); +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java new file mode 100644 index 000000000..3ecae4bee --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/emu/VirtualJoystickDelegate.java @@ -0,0 +1,273 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator.emu; + +import android.content.Context; +import android.os.Handler; +import android.view.MotionEvent; +import android.view.View; + +import com.flycast.emulator.periph.InputDeviceManager; +import com.flycast.emulator.periph.VibratorThread; + +import java.util.HashMap; +import java.util.Map; + +public class VirtualJoystickDelegate implements TouchEventHandler +{ + private static final int CTLID_ANARING = 11; + private static final int CTLID_ANASTICK = 12; + + private VibratorThread vibratorThread; + private Handler handler = new Handler(); + private Runnable hideVGamepadRunnable = new Runnable() { + @Override + public void run() { + VGamepad.hide(); + } + }; + private Context context; + private View view; + private int joyPointerId = -1; + private float joyBiasX, joyBiasY; + private Map pidToControlId = new HashMap<>(); + private int mouseButtons = 0; + private int[] mousePos = { -32768, -32768 }; + private int mousePid = -1; + + public VirtualJoystickDelegate(View view) { + this.view = view; + this.context = view.getContext(); + + vibratorThread = VibratorThread.getInstance(); + } + + @Override + public void stop() { + vibratorThread.stopThread(); + vibratorThread = null; + } + + private boolean touchMouseEvent(MotionEvent event) + { + int actionMasked = event.getActionMasked(); + int actionIndex = event.getActionIndex(); + switch (actionMasked) + { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mousePid = -1; + mouseButtons = 0; + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); + return true; + + case MotionEvent.ACTION_POINTER_DOWN: + case MotionEvent.ACTION_DOWN: + if (mousePid == -1 || actionMasked == MotionEvent.ACTION_DOWN) + { + mousePid = event.getPointerId(actionIndex); + mousePos[0] = Math.round(event.getX(actionIndex)); + mousePos[1] = Math.round(event.getY(actionIndex)); + mouseButtons = MotionEvent.BUTTON_PRIMARY; // Mouse left button down + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); + return true; + } + return false; + + case MotionEvent.ACTION_MOVE: + for (int i = 0; i < event.getPointerCount(); i++) + { + if (event.getPointerId(i) == mousePid) { + mousePos[0] = Math.round(event.getX(i)); + mousePos[1] = Math.round(event.getY(i)); + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); + break; + } + } + break; + case MotionEvent.ACTION_POINTER_UP: + if (event.getPointerId(actionIndex) == mousePid) + { + mousePid = -1; + mousePos[0] = Math.round(event.getX(actionIndex)); + mousePos[1] = Math.round(event.getY(actionIndex)); + mouseButtons = 0; + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); + return true; + } + break; + default: + break; + } + + return false; + } + + static class Point + { + Point() { + this.x = 0.f; + this.y = 0.f; + } + Point(float x, float y) { + this.x = x; + this.y = y; + } + float x; + float y; + } + + static Point translateCoords(Point pos, Point size) + { + float hscale = 480.f / size.y; + Point p = new Point(); + p.y = pos.y * hscale; + p.x = (pos.x - (size.x - 640.f / hscale) / 2.f) * hscale; + return p; + } + + @Override + public boolean onTouchEvent(MotionEvent event, int width, int height) + { + if (JNIdc.guiIsOpen()) + return touchMouseEvent(event); + show(); + + int actionIndex = event.getActionIndex(); + switch (event.getActionMasked()) + { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + // Release all + pidToControlId.clear(); + joyPointerId = -1; + InputDeviceManager.getInstance().virtualReleaseAll(); + break; + + case MotionEvent.ACTION_DOWN: + // First release all + pidToControlId.clear(); + joyPointerId = -1; + InputDeviceManager.getInstance().virtualReleaseAll(); + // Release the mouse too + mousePid = -1; + mouseButtons = 0; + InputDeviceManager.getInstance().touchMouseEvent(mousePos[0], mousePos[1], mouseButtons); + // Then fall through + case MotionEvent.ACTION_POINTER_DOWN: + { + Point p = new Point(event.getX(actionIndex), event.getY(actionIndex)); + p = translateCoords(p, new Point(width, height)); + int control = VGamepad.hitTest(p.x, p.y); + if (control != -1) + { + int pid = event.getPointerId(actionIndex); + if (control == CTLID_ANARING || control == CTLID_ANASTICK) + { + if (joyPointerId == -1) + { + // Analog stick down + joyPointerId = pid; + joyBiasX = p.x; + joyBiasY = p.y; + InputDeviceManager.getInstance().virtualJoystick(0, 0); + return true; + } + } + else + { + // Button down + InputDeviceManager.getInstance().virtualButtonInput(control, true); + pidToControlId.put(pid, control); + vibratorThread.click(); + return true; + } + } + break; + } + + case MotionEvent.ACTION_MOVE: + for (int i = 0; i < event.getPointerCount(); i++) + { + int pid = event.getPointerId(i); + Point p = new Point(event.getX(i), event.getY(i)); + p = translateCoords(p, new Point(width, height)); + if (joyPointerId == pid) + { + // Analog stick + float dx = p.x - joyBiasX; + float dy = p.y - joyBiasY; + float sz = VGamepad.getControlWidth(CTLID_ANASTICK); + dx = Math.max(Math.min(1.f, dx / sz), -1.f); + dy = Math.max(Math.min(1.f, dy / sz), -1.f); + InputDeviceManager.getInstance().virtualJoystick(dx, dy); + continue; + } + // Buttons + int control = VGamepad.hitTest(p.x, p.y); + int oldControl = pidToControlId.containsKey(pid) ? pidToControlId.get(pid) : -1; + if (oldControl == control) + // same button still pressed, or none at all + continue; + if (oldControl != -1) { + // Previous button up + InputDeviceManager.getInstance().virtualButtonInput(oldControl, false); + pidToControlId.remove(pid); + } + if (control != -1 && control != CTLID_ANARING && control != CTLID_ANASTICK) + { + // New button down + InputDeviceManager.getInstance().virtualButtonInput(control, true); + pidToControlId.put(pid, control); + vibratorThread.click(); + } + } + break; + + case MotionEvent.ACTION_POINTER_UP: + { + int pid = event.getPointerId(actionIndex); + if (joyPointerId == pid) + { + // Analog up + InputDeviceManager.getInstance().virtualJoystick(0, 0); + joyPointerId = -1; + return true; + } + if (pidToControlId.containsKey(pid)) + { + // Button up + int controlId = pidToControlId.get(pid); + InputDeviceManager.getInstance().virtualButtonInput(controlId, false); + return true; + } + break; + } + } + return touchMouseEvent(event); + } + + @Override + public void show() + { + VGamepad.show(); + this.handler.removeCallbacks(hideVGamepadRunnable); + this.handler.postDelayed(hideVGamepadRunnable, 10000); + } +} diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java new file mode 100644 index 000000000..25850fc2a --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/InputDeviceManager.java @@ -0,0 +1,253 @@ +package com.flycast.emulator.periph; + +import android.content.Context; +import android.hardware.input.InputManager; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.view.InputDevice; + +import com.flycast.emulator.Emulator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang3.ArrayUtils; + +public final class InputDeviceManager implements InputManager.InputDeviceListener { + public static final int VIRTUAL_GAMEPAD_ID = 0x12345678; + + static { System.loadLibrary("flycast"); } + private static final InputDeviceManager INSTANCE = new InputDeviceManager(); + private InputManager inputManager; + private int maple_port = 0; + + private boolean hasTouchscreen = false; + + private static class VibrationParams { + float power; + float inclination; + long stopTime; + } + private Map vibParams = new HashMap<>(); + private Set knownDevices = new HashSet<>(); + + public InputDeviceManager() + { + init(); + } + + public void startListening(Context applicationContext) + { + maple_port = 0; + hasTouchscreen = applicationContext.getPackageManager().hasSystemFeature("android.hardware.touchscreen"); + if (hasTouchscreen) + joystickAdded(VIRTUAL_GAMEPAD_ID, null, 0, null, + null, null, getVibrator(VIRTUAL_GAMEPAD_ID) != null); + inputManager = (InputManager)applicationContext.getSystemService(Context.INPUT_SERVICE); + inputManager.registerInputDeviceListener(this, null); + } + + public void stopListening() + { + if (inputManager != null) { + inputManager.unregisterInputDeviceListener(this); + inputManager = null; + } + joystickRemoved(VIRTUAL_GAMEPAD_ID); + } + + @Override + public void onInputDeviceAdded(int i) { + } + + @Override + public void onInputDeviceRemoved(int i) { + if (maple_port > 0) + maple_port--; + joystickRemoved(i); + knownDevices.remove(i); + } + + @Override + public void onInputDeviceChanged(int i) { + } + + private Vibrator getVibrator(int i) { + if (i == VIRTUAL_GAMEPAD_ID) { + return (Vibrator)Emulator.getAppContext().getSystemService(Context.VIBRATOR_SERVICE); + } + else { + InputDevice device = InputDevice.getDevice(i); + if (device == null) + return null; + Vibrator vibrator = device.getVibrator(); + return vibrator.hasVibrator() ? vibrator : null; + } + } + + private void vibrate(Vibrator vibrator, long duration_ms, float power) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + int ipow = Math.min((int)(power * 255), 255); + if (ipow >= 1) + vibrator.vibrate(VibrationEffect.createOneShot(duration_ms, ipow)); + else + vibrator.cancel(); + } + else + vibrator.vibrate(duration_ms); + } + + // Called from native code + // returns false if the device has no vibrator + private boolean rumble(int i, float power, float inclination, int duration_ms) + { + Vibrator vibrator = getVibrator(i); + if (vibrator == null) + return false; + if (i == VIRTUAL_GAMEPAD_ID) { + if (Emulator.vibrationPower == 0) + return true; + power *= Emulator.vibrationPower / 100.f; + } + + VibrationParams params; + synchronized (this) { + params = vibParams.get(i); + if (params == null) { + params = new VibrationParams(); + vibParams.put(i, params); + } + } + if (power != 0) { + params.stopTime = System.currentTimeMillis() + duration_ms; + if (inclination > 0) + params.inclination = inclination * power; + else + params.inclination = 0; + } + params.power = power; + VibratorThread.getInstance().setVibrating(); + + return true; + } + + public boolean updateRumble() + { + List ids; + synchronized (this) { + ids = new ArrayList(vibParams.keySet()); + } + boolean active = false; + for (int id : ids) { + if (updateRumble(id)) + active = true; + } + return active; + } + + private boolean updateRumble(int i) + { + Vibrator vibrator = getVibrator(i); + VibrationParams params; + synchronized (this) { + params = vibParams.get(i); + } + if (vibrator == null || params == null) + return false; + long remTime = params.stopTime - System.currentTimeMillis(); + if (remTime <= 0 || params.power == 0) { + params.power = 0; + params.inclination = 0; + vibrator.cancel(); + return false; + } + if (params.inclination > 0) + vibrate(vibrator, remTime, params.inclination * remTime); + else + vibrate(vibrator, remTime, params.power); + return true; + } + + public void stopRumble() + { + List ids; + synchronized (this) { + ids = new ArrayList(vibParams.keySet()); + } + for (int id : ids) { + Vibrator vibrator = getVibrator(id); + if (vibrator != null) + vibrator.cancel(); + } + } + + public boolean hasTouchscreen() { + return hasTouchscreen; + } + + private boolean createDevice(int id) + { + if (id == 0) + return false; + if (knownDevices.contains(id)) + return true; + InputDevice device = InputDevice.getDevice(id); + if (device == null || (device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) != InputDevice.SOURCE_CLASS_BUTTON) + return false; + int port = 0; + if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { + port = this.maple_port == 3 ? 3 : this.maple_port++; + } + List axes = device.getMotionRanges(); + List fullAxes = new ArrayList<>(); + List halfAxes = new ArrayList<>(); + for (InputDevice.MotionRange range : axes) { + if (range.getMin() == 0) + halfAxes.add(range.getAxis()); + else + fullAxes.add(range.getAxis()); + } + joystickAdded(id, device.getName(), port, device.getDescriptor(), + ArrayUtils.toPrimitive(fullAxes.toArray(new Integer[0])), ArrayUtils.toPrimitive(halfAxes.toArray(new Integer[0])), + getVibrator(id) != null); + knownDevices.add(id); + return true; + } + public boolean buttonEvent(int id, int button, boolean pressed) + { + if (!createDevice(id)) + return false; + return joystickButtonEvent(id, button, pressed); + } + public boolean axisEvent(int id, int button, int value) + { + if (!createDevice(id)) + return false; + return joystickAxisEvent(id, button, value); + } + + public static InputDeviceManager getInstance() { + return INSTANCE; + } + + public native void init(); + public native void virtualReleaseAll(); + public native void virtualJoystick(float x, float y); + public native void virtualButtonInput(int key, boolean pressed); + private native boolean joystickButtonEvent(int id, int button, boolean pressed); + private native boolean joystickAxisEvent(int id, int button, int value); + public native void mouseEvent(int xpos, int ypos, int buttons); + public native void mouseScrollEvent(int scrollValue); + public native void touchMouseEvent(int xpos, int ypos, int buttons); + private native void joystickAdded(int id, String name, int maple_port, String uniqueId, int[] fullAxes, int[] halfAxes, boolean rumbleEnabled); + private native void joystickRemoved(int id); + public native boolean keyboardEvent(int key, boolean pressed); + public native void keyboardText(int c); + public static native boolean isMicPluggedIn(); +} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/SipEmulator.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/SipEmulator.java similarity index 98% rename from shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/SipEmulator.java rename to shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/SipEmulator.java index 2d9f9fc5a..e7ec3f3fc 100644 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/SipEmulator.java +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/SipEmulator.java @@ -1,4 +1,4 @@ -package com.reicast.emulator.periph; +package com.flycast.emulator.periph; import android.media.AudioFormat; import android.media.AudioRecord; diff --git a/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VibratorThread.java b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VibratorThread.java new file mode 100644 index 000000000..9b7068c7d --- /dev/null +++ b/shell/android-studio/flycast/src/main/java/com/flycast/emulator/periph/VibratorThread.java @@ -0,0 +1,155 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +package com.flycast.emulator.periph; + +import android.content.Context; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.view.InputDevice; + +import androidx.annotation.RequiresApi; + +import com.flycast.emulator.Emulator; + +public class VibratorThread extends Thread { + private boolean stopping = false; + private boolean click = false; + private long nextRumbleUpdate = 0; + @RequiresApi(Build.VERSION_CODES.O) + private VibrationEffect clickEffect = null; + int clickDuration = 0; + private static VibratorThread INSTANCE = null; + private static final int LEGACY_VIBRATION_DURATION = 20; // ms + + public static VibratorThread getInstance() { + synchronized (VibratorThread.class) { + if (INSTANCE == null) + INSTANCE = new VibratorThread(); + } + return INSTANCE; + } + + private VibratorThread() { + start(); + } + + private Vibrator getVibrator(int i) + { + if (i == InputDeviceManager.VIRTUAL_GAMEPAD_ID) { + if (Emulator.vibrationPower > 0) + return (Vibrator) Emulator.getAppContext().getSystemService(Context.VIBRATOR_SERVICE); + else + // vibration disabled + return null; + } + else { + InputDevice device = InputDevice.getDevice(i); + if (device == null) + return null; + Vibrator vibrator = device.getVibrator(); + return vibrator.hasVibrator() ? vibrator : null; + } + } + + @Override + public void run() + { + while (!stopping) + { + boolean doClick = false; + synchronized (this) { + try { + if (nextRumbleUpdate != 0) { + long waitTime = nextRumbleUpdate - System.currentTimeMillis(); + if (waitTime > 0) + this.wait(waitTime); + } + else { + this.wait(); + } + } catch (InterruptedException e) { + } + if (click) { + doClick = true; + click = false; + } + } + if (doClick) + doClick(); + if (nextRumbleUpdate != 0 && nextRumbleUpdate - System.currentTimeMillis() < 5) { + if (!InputDeviceManager.getInstance().updateRumble()) + nextRumbleUpdate = 0; + else + nextRumbleUpdate = System.currentTimeMillis() + 16667; + } + } + InputDeviceManager.getInstance().stopRumble(); + } + + public void stopThread() { + synchronized (this) { + stopping = true; + notify(); + } + try { + join(); + } catch (InterruptedException e) { + } + INSTANCE = null; + } + + public void click() { + if (Emulator.vibrationPower > 0) { + synchronized (this) { + click = true; + notify(); + } + } + } + + private void doClick() + { + Vibrator vibrator = getVibrator(InputDeviceManager.VIRTUAL_GAMEPAD_ID); + if (vibrator == null) + return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + { + if (clickEffect == null) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + clickEffect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_HEAVY_CLICK); + else + clickEffect = VibrationEffect.createOneShot(LEGACY_VIBRATION_DURATION, VibrationEffect.DEFAULT_AMPLITUDE); + } + vibrator.vibrate(clickEffect); + } else { + vibrator.vibrate(LEGACY_VIBRATION_DURATION); + } + } + + public void setVibrating() + { + // FIXME possible race condition + synchronized (this) { + nextRumbleUpdate = 1; + notify(); + } + } +} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/config/Config.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/config/Config.java deleted file mode 100644 index 11acbabf5..000000000 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/config/Config.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.reicast.emulator.config; - -public class Config { - public static final String pref_home = "home_directory"; - public static String git_issues = "https://github.com/flyinghead/flycast/issues/"; -} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/VirtualJoystickDelegate.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/VirtualJoystickDelegate.java deleted file mode 100644 index 489b52831..000000000 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/emu/VirtualJoystickDelegate.java +++ /dev/null @@ -1,461 +0,0 @@ -package com.reicast.emulator.emu; - -import android.content.Context; -import android.content.res.Configuration; -import android.os.Build; -import android.os.Handler; -import android.os.VibrationEffect; -import android.os.Vibrator; -import android.view.InputDevice; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; -import android.view.View; - -import com.reicast.emulator.Emulator; -import com.reicast.emulator.periph.InputDeviceManager; -import com.reicast.emulator.periph.VJoy; - -public class VirtualJoystickDelegate { - private VibratorThread vibratorThread; - - private boolean editVjoyMode = false; - private int selectedVjoyElement = VJoy.ELEM_NONE; - private ScaleGestureDetector scaleGestureDetector; - - private Handler handler = new Handler(); - private Runnable hideOsdRunnable = new Runnable() { - @Override - public void run() { - JNIdc.hideOsd(); - } - }; - - private float[][] vjoy_d_custom; - - private static final float[][] vjoy = VJoy.baseVJoy(); - - private Context context; - private View view; - - public VirtualJoystickDelegate(View view) { - this.view = view; - this.context = view.getContext(); - - vibratorThread = new VibratorThread(context); - vibratorThread.start(); - - readCustomVjoyValues(); - scaleGestureDetector = new ScaleGestureDetector(context, new OscOnScaleGestureListener()); - } - - public void stop() { - vibratorThread.stopVibrator(); - try { - vibratorThread.join(); - } catch (InterruptedException e) { - } - } - - public void readCustomVjoyValues() { - vjoy_d_custom = VJoy.readCustomVjoyValues(context); - } - - public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { - vjoy_d_custom = vjoy_d_cached; - VJoy.writeCustomVjoyValues(vjoy_d_cached, context); - - resetEditMode(); - view.requestLayout(); - } - - private void reset_analog() - { - - int j=11; - vjoy[j+1][0]=vjoy[j][0]+vjoy[j][2]/2-vjoy[j+1][2]/2; - vjoy[j+1][1]=vjoy[j][1]+vjoy[j][3]/2-vjoy[j+1][3]/2; - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1], vjoy[j+1][2], vjoy[j+1][3]); - } - - private int get_anal(int j, int axis) - { - return (int) (((vjoy[j+1][axis]+vjoy[j+1][axis+2]/2) - vjoy[j][axis] - vjoy[j][axis+2]/2)*254/vjoy[j][axis+2]); - } - - private float vbase(float p, float m, float scl) - { - return (int) ( m - (m -p)*scl); - } - - private float vbase(float p, float scl) - { - return (int) (p*scl ); - } - - private boolean isTablet() { - return (context.getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; - } - - public void layout(int width, int height) - { - //dcpx/cm = dcpx/px * px/cm - float magic = isTablet() ? 0.8f : 0.7f; - float scl = 480.0f / height * context.getResources().getDisplayMetrics().density * magic; - float scl_dc = height / 480.0f; - float tx = (width - 640.0f * scl_dc) / 2 / scl_dc; - - float a_x = -tx + 24 * scl; - float a_y = -24 * scl; - - // Not sure how this can happen - if (vjoy_d_custom == null) - return; - - float[][] vjoy_d = VJoy.getVjoy_d(vjoy_d_custom); - - for (int i=0;i vjoy[j][0] && x <= (vjoy[j][0] + vjoy[j][2])) - { - if (y > vjoy[j][1] && y <= (vjoy[j][1] + vjoy[j][3])) - { - if (vjoy[j][4] >= VJoy.BTN_RTRIG) { - // Not for analog - if (vjoy[j][5] == 0) - if (!editVjoyMode) { - vibratorThread.vibrate(); - } - vjoy[j][5] = 2; - } - - - if (vjoy[j][4] == VJoy.BTN_ANARING) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_ANALOG; - resetEditMode(); - } else { - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - anal_id = event.getPointerId(i); - } - } else if (vjoy[j][4] != VJoy.BTN_ANAPOINT) { - if (vjoy[j][4] == VJoy.BTN_LTRIG) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_LTRIG; - resetEditMode(); - } else { - left_trigger = 255; - lt_id = event.getPointerId(i); - } - } else if (vjoy[j][4] == VJoy.BTN_RTRIG) { - if (editVjoyMode) { - selectedVjoyElement = VJoy.ELEM_RTRIG; - resetEditMode(); - } else { - right_trigger = 255; - rt_id = event.getPointerId(i); - } - } else { - if (editVjoyMode) { - selectedVjoyElement = getElementIdFromButtonId(j); - resetEditMode(); - } else if (vjoy[j][4] == VJoy.key_CONT_FFORWARD) - fastForward = true; - else - rv &= ~(int)vjoy[j][4]; - } - } - } - } - } - } else { - if (x < vjoy[11][0]) - x = vjoy[11][0]; - else if (x > (vjoy[11][0] + vjoy[11][2])) - x = vjoy[11][0] + vjoy[11][2]; - - if (y < vjoy[11][1]) - y = vjoy[11][1]; - else if (y > (vjoy[11][1] + vjoy[11][3])) - y = vjoy[11][1] + vjoy[11][3]; - - int j = 11; - vjoy[j + 1][0] = x - vjoy[j + 1][2] / 2; - vjoy[j + 1][1] = y - vjoy[j + 1][3] / 2; - - JNIdc.vjoy(j + 1, vjoy[j + 1][0], vjoy[j + 1][1], vjoy[j + 1][2], vjoy[j + 1][3]); - - } - } - - for (int j = 0; j < vjoy.length; j++) { - if (vjoy[j][5] == 2) - vjoy[j][5] = 1; - else if (vjoy[j][5] == 1) - vjoy[j][5] = 0; - } - } - - switch(aid) - { - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - selectedVjoyElement = -1; - reset_analog(); - anal_id = -1; - rv = 0xFFFFFFFF; - fastForward = false; - right_trigger = 0; - left_trigger = 0; - lt_id = -1; - rt_id = -1; - for (int j= 0 ;j < vjoy.length; j++) - vjoy[j][5] = 0; - mouse_btns = 0; - break; - - case MotionEvent.ACTION_POINTER_UP: - if (event.getPointerId(event.getActionIndex())==anal_id) - { - reset_analog(); - anal_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==lt_id) - { - left_trigger = 0; - lt_id = -1; - } - else if (event.getPointerId(event.getActionIndex())==rt_id) - { - right_trigger = 0; - rt_id = -1; - } - break; - - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_DOWN: - if (event.getPointerCount() != 1) - { - mouse_btns = 0; - } - else - { - MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords(); - event.getPointerCoords(0, pointerCoords); - mouse_pos[0] = Math.round(pointerCoords.x); - mouse_pos[1] = Math.round(pointerCoords.y); - mouse_btns = MotionEvent.BUTTON_PRIMARY; // Mouse left button down - } - break; - - case MotionEvent.ACTION_MOVE: - if (event.getPointerCount() == 1) - { - MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords(); - event.getPointerCoords(0, pointerCoords); - mouse_pos[0] = Math.round(pointerCoords.x); - mouse_pos[1] = Math.round(pointerCoords.y); - } - break; - } - int joyx = get_anal(11, 0); - int joyy = get_anal(11, 1); - InputDeviceManager.getInstance().virtualGamepadEvent(rv, joyx, joyy, left_trigger, right_trigger, fastForward); - // Only register the mouse event if no virtual gamepad button is down - if ((!editVjoyMode && rv == 0xFFFFFFFF && left_trigger == 0 && right_trigger == 0 && joyx == 0 && joyy == 0 && !fastForward) - || JNIdc.guiIsOpen()) - InputDeviceManager.getInstance().mouseEvent(mouse_pos[0], mouse_pos[1], mouse_btns); - return(true); - } - - public void setEditVjoyMode(boolean editVjoyMode) { - this.editVjoyMode = editVjoyMode; - selectedVjoyElement = -1; - if (editVjoyMode) - this.handler.removeCallbacks(hideOsdRunnable); - resetEditMode(); - } - - private class OscOnScaleGestureListener extends - ScaleGestureDetector.SimpleOnScaleGestureListener { - - @Override - public boolean onScale(ScaleGestureDetector detector) { - if (editVjoyMode && selectedVjoyElement != -1) { - vjoy_d_custom[selectedVjoyElement][2] *= detector.getScaleFactor(); - view.requestLayout(); - - return true; - } - - return false; - } - - @Override - public void onScaleEnd(ScaleGestureDetector detector) { - selectedVjoyElement = -1; - } - } - - private class VibratorThread extends Thread - { - private Vibrator vibrator; - private boolean vibrate = false; - private boolean stopping = false; - - VibratorThread(Context context) { - vibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); - } - - @Override - public void run() { - while (!stopping) { - boolean doVibrate; - synchronized (this) { - doVibrate = false; - try { - this.wait(); - } catch (InterruptedException e) { - } - if (vibrate) { - doVibrate = true; - vibrate = false; - } - } - if (doVibrate) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - vibrator.vibrate(VibrationEffect.createOneShot(Emulator.vibrationDuration, VibrationEffect.DEFAULT_AMPLITUDE)); - } else { - vibrator.vibrate(Emulator.vibrationDuration); - } - } - } - } - - public void stopVibrator() { - synchronized (this) { - stopping = true; - notify(); - } - } - - public void vibrate() { - if (Emulator.vibrationDuration > 0) { - synchronized (this) { - vibrate = true; - notify(); - } - } - } - } -} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/InputDeviceManager.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/InputDeviceManager.java deleted file mode 100644 index ce58ddbd8..000000000 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/InputDeviceManager.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.reicast.emulator.periph; - -import android.content.Context; -import android.hardware.input.InputManager; -import android.os.Build; -import android.os.VibrationEffect; -import android.os.Vibrator; -import android.view.InputDevice; - -import com.reicast.emulator.Emulator; - -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.lang3.ArrayUtils; - -public final class InputDeviceManager implements InputManager.InputDeviceListener { - public static final int VIRTUAL_GAMEPAD_ID = 0x12345678; - - static { System.loadLibrary("flycast"); } - private static final InputDeviceManager INSTANCE = new InputDeviceManager(); - private InputManager inputManager; - private int maple_port = 0; - - public InputDeviceManager() - { - init(); - } - - public void startListening(Context applicationContext) - { - maple_port = 0; - if (applicationContext.getPackageManager().hasSystemFeature("android.hardware.touchscreen")) - joystickAdded(VIRTUAL_GAMEPAD_ID, "Virtual Gamepad", 0, "virtual_gamepad_uid", new int[0], new int[0]); - int[] ids = InputDevice.getDeviceIds(); - for (int id : ids) - onInputDeviceAdded(id); - inputManager = (InputManager)applicationContext.getSystemService(Context.INPUT_SERVICE); - inputManager.registerInputDeviceListener(this, null); - } - - public void stopListening() - { - if (inputManager != null) { - inputManager.unregisterInputDeviceListener(this); - inputManager = null; - } - joystickRemoved(VIRTUAL_GAMEPAD_ID); - } - - @Override - public void onInputDeviceAdded(int i) { - InputDevice device = InputDevice.getDevice(i); - if ((device.getSources() & InputDevice.SOURCE_CLASS_BUTTON) == InputDevice.SOURCE_CLASS_BUTTON) { - int port = 0; - if ((device.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { - port = this.maple_port == 3 ? 3 : this.maple_port++; - } - List axes = device.getMotionRanges(); - List fullAxes = new ArrayList<>(); - List halfAxes = new ArrayList<>(); - for (InputDevice.MotionRange range : axes) { - if (range.getMin() == 0) - halfAxes.add(range.getAxis()); - else - fullAxes.add(range.getAxis()); - } - joystickAdded(i, device.getName(), port, device.getDescriptor(), - ArrayUtils.toPrimitive(fullAxes.toArray(new Integer[0])), ArrayUtils.toPrimitive(halfAxes.toArray(new Integer[0]))); - } - } - - @Override - public void onInputDeviceRemoved(int i) { - if (maple_port > 0) - maple_port--; - joystickRemoved(i); - } - - @Override - public void onInputDeviceChanged(int i) { - } - - // Called from native code - private boolean rumble(int i, float power, float inclination, int duration_ms) { - Vibrator vibrator; - if (i == VIRTUAL_GAMEPAD_ID) { - vibrator = (Vibrator)Emulator.getAppContext().getSystemService(Context.VIBRATOR_SERVICE); - } - else { - InputDevice device = InputDevice.getDevice(i); - if (device == null) - return false; - vibrator = device.getVibrator(); - if (!vibrator.hasVibrator()) - return false; - } - - if (power == 0) { - vibrator.cancel(); - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - vibrator.vibrate(VibrationEffect.createOneShot(duration_ms, VibrationEffect.DEFAULT_AMPLITUDE)); - } else { - vibrator.vibrate(duration_ms); - } - } - - return true; - } - - public static InputDeviceManager getInstance() { - return INSTANCE; - } - - public native void init(); - public native void virtualGamepadEvent(int kcode, int joyx, int joyy, int lt, int rt, boolean fastForward); - public native boolean joystickButtonEvent(int id, int button, boolean pressed); - public native boolean joystickAxisEvent(int id, int button, int value); - public native void mouseEvent(int xpos, int ypos, int buttons); - public native void mouseScrollEvent(int scrollValue); - private native void joystickAdded(int id, String name, int maple_port, String uniqueId, int[] fullAxes, int[] halfAxes); - private native void joystickRemoved(int id); - public native boolean keyboardEvent(int key, boolean pressed); - public native void keyboardText(int c); -} diff --git a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/VJoy.java b/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/VJoy.java deleted file mode 100644 index 5d4690c38..000000000 --- a/shell/android-studio/flycast/src/main/java/com/reicast/emulator/periph/VJoy.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.reicast.emulator.periph; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -public class VJoy { - - public static final int key_CONT_C = 0x0001; - public static final int key_CONT_B = 0x0002; - public static final int key_CONT_A = 0x0004; - public static final int key_CONT_START = 0x0008; - public static final int key_CONT_DPAD_UP = 0x0010; - public static final int key_CONT_DPAD_DOWN = 0x0020; - public static final int key_CONT_DPAD_LEFT = 0x0040; - public static final int key_CONT_DPAD_RIGHT = 0x0080; - public static final int key_CONT_Y = 0x0200; - public static final int key_CONT_X = 0x0400; - public static final int key_CONT_FFORWARD = 0x3000002; - - public static final int BTN_LTRIG = -1; - public static final int BTN_RTRIG = -2; - public static final int BTN_ANARING = -3; - public static final int BTN_ANAPOINT = -4; - - public static final int ELEM_NONE = -1; - public static final int ELEM_DPAD = 0; - public static final int ELEM_BUTTONS = 1; - public static final int ELEM_START = 2; - public static final int ELEM_LTRIG = 3; - public static final int ELEM_RTRIG = 4; - public static final int ELEM_ANALOG = 5; - public static final int ELEM_FFORWARD = 6; - - public static int VJoyCount = 14; - - public static float[][] baseVJoy() { - return new float[][] { - new float[] { 24, 24+64, 64,64, key_CONT_DPAD_LEFT, 0}, - new float[] { 24+64, 24, 64,64, key_CONT_DPAD_UP, 0}, - new float[] { 24+128, 24+64, 64,64, key_CONT_DPAD_RIGHT, 0}, - new float[] { 24+64, 24+128, 64,64, key_CONT_DPAD_DOWN, 0}, - - new float[] { 440, 280+64, 64,64, key_CONT_X, 0}, - new float[] { 440+64, 280, 64,64, key_CONT_Y, 0}, - new float[] { 440+128, 280+64, 64,64, key_CONT_B, 0}, - new float[] { 440+64, 280+128,64,64, key_CONT_A, 0}, - - new float[] { 320-32, 360+32, 64,64, key_CONT_START, 0}, - - new float[] { 440, 200, 90,64, BTN_LTRIG, 0}, // LT - new float[] { 542, 200, 90,64, BTN_RTRIG, 0}, // RT - - new float[] { 0, 128+224,128,128,BTN_ANARING, 0}, // Analog ring - new float[] { 32, 128+256,64,64, BTN_ANAPOINT, 0}, // Analog point - - new float[] { 320-32, 12, 64,64, key_CONT_FFORWARD, 0}, // Fast-forward - - new float[] { 20, 288, 64,64, key_CONT_DPAD_LEFT|key_CONT_DPAD_UP, 0}, // DPad diagonals - new float[] { 20+128, 288, 64,64, key_CONT_DPAD_RIGHT|key_CONT_DPAD_UP, 0}, - new float[] { 20, 288+128,64,64, key_CONT_DPAD_LEFT|key_CONT_DPAD_DOWN, 0}, - new float[] { 20+128, 288+128,64,64, key_CONT_DPAD_RIGHT|key_CONT_DPAD_DOWN, 0}, - }; - } - - public static float[][] readCustomVjoyValues(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - return new float[][] { - // x-shift, y-shift, sizing-factor - new float[] { prefs.getFloat("touch_x_shift_dpad", 0), - prefs.getFloat("touch_y_shift_dpad", 0), - prefs.getFloat("touch_scale_dpad", 1) - }, // DPAD - new float[] { prefs.getFloat("touch_x_shift_buttons", 0), - prefs.getFloat("touch_y_shift_buttons", 0), - prefs.getFloat("touch_scale_buttons", 1) - }, // X, Y, B, A Buttons - new float[] { prefs.getFloat("touch_x_shift_start", 0), - prefs.getFloat("touch_y_shift_start", 0), - prefs.getFloat("touch_scale_start", 1) - }, // Start - new float[] { prefs.getFloat("touch_x_shift_left_trigger", 0), - prefs.getFloat("touch_y_shift_left_trigger", 0), - prefs.getFloat("touch_scale_left_trigger", 1) - }, // Left Trigger - new float[] { prefs.getFloat("touch_x_shift_right_trigger", 0), - prefs.getFloat("touch_y_shift_right_trigger", 0), - prefs.getFloat("touch_scale_right_trigger", 1) - }, // Right Trigger - new float[] { prefs.getFloat("touch_x_shift_analog", 0), - prefs.getFloat("touch_y_shift_analog", 0), - prefs.getFloat("touch_scale_analog", 1) - }, // Analog Stick - new float[] { prefs.getFloat("touch_x_shift_fforward", 0), - prefs.getFloat("touch_y_shift_fforward", 0), - prefs.getFloat("touch_scale_fforward", 1) - } // Fast-forward - }; - } - - public static float[][] getVjoy_d(float[][] vjoy_d_custom) { - return new float[][] { - // LEFT, UP, RIGHT, DOWN - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, - - // X, Y, B, A - new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, - new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], - 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, - - // START - new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], - 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, - - // LT, RT - new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], - 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, - new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], - 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, - - // Analog ring and point - new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], - 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2],-3}, - new float[] { 48+vjoy_d_custom[5][0], 24+64+vjoy_d_custom[5][1], - 64*vjoy_d_custom[5][2],64*vjoy_d_custom[5][2], -4}, - - // Fast-forward - new float[] { 320-32+vjoy_d_custom[6][0], 12+vjoy_d_custom[6][1], - 64*vjoy_d_custom[6][2],64*vjoy_d_custom[6][2], -5}, - - // DPad diagonals - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT|key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT|key_CONT_DPAD_UP}, - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT|key_CONT_DPAD_DOWN}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], - 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT|key_CONT_DPAD_DOWN}, - }; - } - - public static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).apply(); - prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).apply(); - prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).apply(); - prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).apply(); - prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).apply(); - prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).apply(); - prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).apply(); - prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).apply(); - prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).apply(); - prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).apply(); - prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).apply(); - prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).apply(); - prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).apply(); - - prefs.edit().putFloat("touch_x_shift_fforward", vjoy_d_custom[6][0]).apply(); - prefs.edit().putFloat("touch_y_shift_fforward", vjoy_d_custom[6][1]).apply(); - prefs.edit().putFloat("touch_scale_fforward", vjoy_d_custom[6][2]).apply(); - } - - public static void resetCustomVjoyValues(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - prefs.edit().remove("touch_x_shift_dpad").apply(); - prefs.edit().remove("touch_y_shift_dpad").apply(); - prefs.edit().remove("touch_scale_dpad").apply(); - - prefs.edit().remove("touch_x_shift_buttons").apply(); - prefs.edit().remove("touch_y_shift_buttons").apply(); - prefs.edit().remove("touch_scale_buttons").apply(); - - prefs.edit().remove("touch_x_shift_start").apply(); - prefs.edit().remove("touch_y_shift_start").apply(); - prefs.edit().remove("touch_scale_start").apply(); - - prefs.edit().remove("touch_x_shift_left_trigger").apply(); - prefs.edit().remove("touch_y_shift_left_trigger").apply(); - prefs.edit().remove("touch_scale_left_trigger").apply(); - - prefs.edit().remove("touch_x_shift_right_trigger").apply(); - prefs.edit().remove("touch_y_shift_right_trigger").apply(); - prefs.edit().remove("touch_scale_right_trigger").apply(); - - prefs.edit().remove("touch_x_shift_analog").apply(); - prefs.edit().remove("touch_y_shift_analog").apply(); - prefs.edit().remove("touch_scale_analog").apply(); - - prefs.edit().remove("touch_x_shift_fforward").apply(); - prefs.edit().remove("touch_y_shift_fforward").apply(); - prefs.edit().remove("touch_scale_fforward").apply(); - } -} diff --git a/shell/android-studio/flycast/src/main/jni/src/Android.cpp b/shell/android-studio/flycast/src/main/jni/src/Android.cpp index a8785b8cf..e4a250907 100644 --- a/shell/android-studio/flycast/src/main/jni/src/Android.cpp +++ b/shell/android-studio/flycast/src/main/jni/src/Android.cpp @@ -1,18 +1,14 @@ #include "types.h" -#include "hw/maple/maple_cfg.h" -#include "rend/osd.h" -#include "hw/maple/maple_devs.h" -#include "hw/maple/maple_if.h" #include "hw/naomi/naomi_cart.h" -#include "oslib/audiostream.h" +#include "audio/audiostream.h" #include "imgread/common.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "rend/osd.h" #include "cfg/cfg.h" #include "log/LogManager.h" #include "wsi/context.h" #include "emulator.h" -#include "rend/mainui.h" +#include "ui/mainui.h" #include "cfg/option.h" #include "stdclass.h" #include "oslib/oslib.h" @@ -21,6 +17,7 @@ #endif #include "jni_util.h" #include "android_storage.h" +#include "http_client.h" #include #include @@ -39,26 +36,12 @@ namespace jni thread_local JVMAttacher jvm_attacher; } -#include "android_gamepad.h" -#include "android_keyboard.h" -#include "http_client.h" - -extern "C" JNIEXPORT jint JNICALL Java_com_reicast_emulator_emu_JNIdc_getVirtualGamepadVibration(JNIEnv *env, jobject obj) -{ - return (jint)config::VirtualGamepadVibration; -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_screenCharacteristics(JNIEnv *env, jobject obj, jfloat screenDpi, jfloat refreshRate) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_screenCharacteristics(JNIEnv *env, jobject obj, jfloat screenDpi, jfloat refreshRate) { settings.display.dpi = screenDpi; settings.display.refreshRate = refreshRate; } -std::shared_ptr mouse; -std::shared_ptr keyboard; - -float vjoy_pos[15][8]; - static bool game_started; //stuff for saving prefs @@ -67,14 +50,10 @@ jmethodID saveAndroidSettingsMid; static ANativeWindow *g_window = 0; // Activity -static jobject g_activity; -static jmethodID VJoyStartEditingMID; -static jmethodID VJoyStopEditingMID; -static jmethodID VJoyResetEditingMID; -static jmethodID showTextInputMid; -static jmethodID hideTextInputMid; -static jmethodID isScreenKeyboardShownMid; +jobject g_activity; +extern jmethodID showScreenKeyboardMid; static jmethodID onGameStateChangeMid; +extern jmethodID setVGamepadEditModeMid; static void emuEventCallback(Event event, void *) { @@ -99,27 +78,8 @@ void os_DoEvents() { } -void os_CreateWindow() -{ -} - -void UpdateInputState() -{ -} - void common_linux_setup(); -void os_SetupInput() -{ -} -void os_TermInput() -{ -} - -void os_SetWindowText(char const *Text) -{ -} - #if defined(USE_BREAKPAD) static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { @@ -142,7 +102,7 @@ static google_breakpad::ExceptionHandler *exceptionHandler; #endif -extern "C" JNIEXPORT jstring JNICALL Java_com_reicast_emulator_emu_JNIdc_initEnvironment(JNIEnv *env, jobject obj, jobject emulator, jstring filesDirectory, jstring homeDirectory, jstring jlocale) +extern "C" JNIEXPORT jstring JNICALL Java_com_flycast_emulator_emu_JNIdc_initEnvironment(JNIEnv *env, jobject obj, jobject emulator, jstring filesDirectory, jstring homeDirectory, jstring jlocale) { bool first_init = false; @@ -211,7 +171,7 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_reicast_emulator_emu_JNIdc_initEnv else { static std::string crashPath; - static cThread uploadThread(uploadCrashThread, &crashPath); + static cThread uploadThread(uploadCrashThread, &crashPath, "SentryUpload"); crashPath = get_writable_config_path(""); uploadThread.Start(); } @@ -223,7 +183,12 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_reicast_emulator_emu_JNIdc_initEnv return NULL; } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setExternalStorageDirectories(JNIEnv *env, jobject obj, jobjectArray jpathList) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_disableOmpAffinity(JNIEnv *env, jobject obj) +{ + setenv("KMP_AFFINITY", "disabled", 1); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_setExternalStorageDirectories(JNIEnv *env, jobject obj, jobjectArray jpathList) { jni::ObjectArray pathList(jpathList, false); std::string paths; @@ -259,7 +224,7 @@ static bool stopEmu() return true; } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setGameUri(JNIEnv *env, jobject obj, jstring jfileName) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_setGameUri(JNIEnv *env, jobject obj, jstring jfileName) { std::string fileName = jni::String(jfileName, false).to_string(); if (!fileName.empty()) @@ -288,7 +253,7 @@ jmethodID audioInitMid; jmethodID audioTermMid; static jobject g_audioBackend; -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setupMic(JNIEnv *env,jobject obj,jobject sip) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_setupMic(JNIEnv *env,jobject obj,jobject sip) { sipemu = env->NewGlobalRef(sip); getmicdata = env->GetMethodID(env->GetObjectClass(sipemu),"getData","(I)[B"); @@ -296,7 +261,15 @@ extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setupMic(J stopRecordingMid = env->GetMethodID(env->GetObjectClass(sipemu),"stopRecording","()V"); } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_pause(JNIEnv *env,jobject obj) +static void *savestateThreadFunc(void *) +{ + dc_savestate(config::SavestateSlot); + return nullptr; +} + +static cThread savestateThread(savestateThreadFunc, nullptr, "Flycast-save"); + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_pause(JNIEnv *env,jobject obj) { if (config::GGPOEnable) { @@ -306,21 +279,25 @@ extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_pause(JNIE else if (game_started && stopEmu()) { game_started = true; // restart when resumed - if (config::AutoSaveState) - dc_savestate(config::SavestateSlot); + if (config::AutoSaveState) { + savestateThread.WaitToEnd(); + savestateThread.Start(); + } } - gui_save(); } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_resume(JNIEnv *env,jobject obj) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_resume(JNIEnv *env,jobject obj) { - if (game_started) + if (game_started) { + savestateThread.WaitToEnd(); emu.start(); + } } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_stop(JNIEnv *env,jobject obj) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_stop(JNIEnv *env,jobject obj) { stopEmu(); + savestateThread.WaitToEnd(); gui_stop_game(); } @@ -328,22 +305,22 @@ static void *render_thread_func(void *) { initRenderApi(g_window); - mainui_loop(); + mainui_loop(false); termRenderApi(); ANativeWindow_release(g_window); - g_window = NULL; + g_window = nullptr; - return NULL; + return nullptr; } -static cThread render_thread(render_thread_func, NULL); +static cThread render_thread(render_thread_func, nullptr, "Flycast-rend"); -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_rendinitNative(JNIEnv * env, jobject obj, jobject surface, jint width, jint height) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_rendinitNative(JNIEnv * env, jobject obj, jobject surface, jint width, jint height) { if (render_thread.thread.joinable()) { - if (surface == NULL) + if (surface == nullptr) { mainui_stop(); render_thread.WaitToEnd(); @@ -355,66 +332,30 @@ extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_rendinitNa mainui_reinit(); } } - else if (surface != NULL) + else if (surface != nullptr) { g_window = ANativeWindow_fromSurface(env, surface); + mainui_start(); render_thread.Start(); } } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_vjoy(JNIEnv * env, jobject obj,int id,float x, float y, float w, float h) -{ - if (id < std::size(vjoy_pos)) - { - vjoy_pos[id][0] = x; - vjoy_pos[id][1] = y; - vjoy_pos[id][2] = w; - vjoy_pos[id][3] = h; - } -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_hideOsd(JNIEnv * env, jobject obj) -{ - HideOSD(); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_getControllers(JNIEnv *env, jobject obj, jintArray controllers, jobjectArray peripherals) -{ - // might be called before JNIdc.initEnvironment() - if (g_jvm == NULL) - env->GetJavaVM(&g_jvm); - - jni::IntArray jcontrollers(controllers, false); - std::vector devs; - for (u32 i = 0; i < config::MapleMainDevices.size(); i++) - devs.push_back((MapleDeviceType)config::MapleMainDevices[i]); - jcontrollers.setData(devs.data()); - - jni::ObjectArray jperipherals(peripherals, false); - int obj_len = jperipherals.size(); - for (int i = 0; i < obj_len; ++i) - { - std::vector devs { (MapleDeviceType)config::MapleExpansionDevices[i][0], (MapleDeviceType)config::MapleExpansionDevices[i][1] }; - jperipherals[i].setData(devs.data()); - } -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_guiOpenSettings(JNIEnv *env, jobject obj) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_guiOpenSettings(JNIEnv *env, jobject obj) { gui_open_settings(); } -extern "C" JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsOpen(JNIEnv *env, jobject obj) +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_emu_JNIdc_guiIsOpen(JNIEnv *env, jobject obj) { return gui_is_open(); } -extern "C" JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_emu_JNIdc_guiIsContentBrowser(JNIEnv *env,jobject obj) +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_emu_JNIdc_guiIsContentBrowser(JNIEnv *env,jobject obj) { return gui_is_content_browser(); } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_guiSetInsets(JNIEnv *env, jobject obj, jint left, jint right, jint top, jint bottom) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_JNIdc_guiSetInsets(JNIEnv *env, jobject obj, jint left, jint right, jint top, jint bottom) { gui_set_insets(left, right, top, bottom); } @@ -469,7 +410,7 @@ class AndroidAudioBackend : AudioBackend }; static AndroidAudioBackend androidAudioBackend; -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_AudioBackend_setInstance(JNIEnv *env, jobject obj, jobject instance) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_AudioBackend_setInstance(JNIEnv *env, jobject obj, jobject instance) { if (g_audioBackend != nullptr) env->DeleteGlobalRef(g_audioBackend); @@ -505,139 +446,22 @@ void SaveAndroidSettings() jni::env()->CallVoidMethod(g_emulator, saveAndroidSettingsMid, (jstring)homeDirectory); } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_init(JNIEnv *env, jobject obj) -{ - input_device_manager = env->NewGlobalRef(obj); - input_device_manager_rumble = env->GetMethodID(env->GetObjectClass(obj), "rumble", "(IFFI)Z"); - // FIXME Don't connect it by default or any screen touch will register as button A press - mouse = std::make_shared(-1); - GamepadDevice::Register(mouse); - keyboard = std::make_shared(); - GamepadDevice::Register(keyboard); - gui_setOnScreenKeyboardCallback([](bool show) { - if (g_activity == nullptr) - return; - JNIEnv *env = jni::env(); - if (show != env->CallBooleanMethod(g_activity, isScreenKeyboardShownMid)) - { - INFO_LOG(INPUT, "show/hide keyboard %d", show); - if (show) - env->CallVoidMethod(g_activity, showTextInputMid, 0, 0, 16, 100); - else - env->CallVoidMethod(g_activity, hideTextInputMid); - } - }); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, jint id, jstring name, - jint maple_port, jstring junique_id, jintArray fullAxes, jintArray halfAxes) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_BaseGLActivity_register(JNIEnv *env, jobject obj, jobject activity) { - std::string joyname = jni::String(name, false); - std::string unique_id = jni::String(junique_id, false); - std::vector full = jni::IntArray(fullAxes, false); - std::vector half = jni::IntArray(halfAxes, false); - - std::shared_ptr gamepad = std::make_shared(maple_port, id, joyname.c_str(), unique_id.c_str(), full, half); - AndroidGamepadDevice::AddAndroidGamepad(gamepad); -} -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_joystickRemoved(JNIEnv *env, jobject obj, jint id) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != NULL) - AndroidGamepadDevice::RemoveAndroidGamepad(device); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_virtualGamepadEvent(JNIEnv *env, jobject obj, jint kcode, jint joyx, jint joyy, jint lt, jint rt, jboolean fastForward) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(AndroidGamepadDevice::VIRTUAL_GAMEPAD_ID); - if (device != NULL) - device->virtual_gamepad_event(kcode, joyx, joyy, lt, rt, fastForward); -} - -extern "C" JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_joystickButtonEvent(JNIEnv *env, jobject obj, jint id, jint key, jboolean pressed) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != NULL) - return device->gamepad_btn_input(key, pressed); - else - return false; - -} - -extern "C" JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_keyboardEvent(JNIEnv *env, jobject obj, jint key, jboolean pressed) -{ - keyboard->input(key, pressed); - return true; -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_keyboardText(JNIEnv *env, jobject obj, jint c) -{ - gui_keyboard_input((u16)c); -} - -static std::map, jint> previous_axis_values; - -extern "C" JNIEXPORT jboolean JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_joystickAxisEvent(JNIEnv *env, jobject obj, jint id, jint key, jint value) -{ - std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); - if (device != nullptr) - return device->gamepad_axis_input(key, value); - else - return false; -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_mouseEvent(JNIEnv *env, jobject obj, jint xpos, jint ypos, jint buttons) -{ - mouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); - mouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); - mouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); - mouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_periph_InputDeviceManager_mouseScrollEvent(JNIEnv *env, jobject obj, jint scrollValue) -{ - mouse->setWheel(scrollValue); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_BaseGLActivity_register(JNIEnv *env, jobject obj, jobject activity) -{ - if (g_activity != NULL) - { + if (g_activity != nullptr) { env->DeleteGlobalRef(g_activity); - g_activity = NULL; + g_activity = nullptr; } - if (activity != NULL) { + if (activity != nullptr) + { g_activity = env->NewGlobalRef(activity); - VJoyStartEditingMID = env->GetMethodID(env->GetObjectClass(activity), "VJoyStartEditing", "()V"); - VJoyStopEditingMID = env->GetMethodID(env->GetObjectClass(activity), "VJoyStopEditing", "(Z)V"); - VJoyResetEditingMID = env->GetMethodID(env->GetObjectClass(activity), "VJoyResetEditing", "()V"); - showTextInputMid = env->GetMethodID(env->GetObjectClass(activity), "showTextInput", "(IIII)V"); - hideTextInputMid = env->GetMethodID(env->GetObjectClass(activity), "hideTextInput", "()V"); - isScreenKeyboardShownMid = env->GetMethodID(env->GetObjectClass(activity), "isScreenKeyboardShown", "()Z"); - onGameStateChangeMid = env->GetMethodID(env->GetObjectClass(activity), "onGameStateChange", "(Z)V"); + jclass actClass = env->GetObjectClass(activity); + showScreenKeyboardMid = env->GetMethodID(actClass, "showScreenKeyboard", "(Z)V"); + onGameStateChangeMid = env->GetMethodID(actClass, "onGameStateChange", "(Z)V"); + setVGamepadEditModeMid = env->GetMethodID(actClass, "setVGamepadEditMode", "(Z)V"); } } -void vjoy_start_editing() -{ - jni::env()->CallVoidMethod(g_activity, VJoyStartEditingMID); -} - -void vjoy_reset_editing() -{ - jni::env()->CallVoidMethod(g_activity, VJoyResetEditingMID); -} - -void vjoy_stop_editing(bool canceled) -{ - jni::env()->CallVoidMethod(g_activity, VJoyStopEditingMID, canceled); -} - -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_JNIdc_setButtons(JNIEnv *env, jobject obj, jbyteArray data) -{ - DefaultOSDButtons = jni::ByteArray(data, false); -} - void enableNetworkBroadcast(bool enable) { JNIEnv *env = jni::env(); @@ -658,3 +482,30 @@ extern "C" void abort_message(const char* format, ...) ERROR_LOG(BOOT, "%s", buffer); abort(); } + +std::string getNativeLibraryPath() +{ + JNIEnv *env = jni::env(); + jmethodID getNativeLibDir = env->GetMethodID(env->GetObjectClass(g_activity), "getNativeLibDir", "()Ljava/lang/String;"); + jni::String nativeLibDir(jni::env()->CallObjectMethod(g_activity, getNativeLibDir)); + return nativeLibDir; +} + +std::string getFilesPath() +{ + JNIEnv *env = jni::env(); + jmethodID getInternalFilesDir = env->GetMethodID(env->GetObjectClass(g_activity), "getInternalFilesDir", "()Ljava/lang/String;"); + jni::String filesDir(jni::env()->CallObjectMethod(g_activity, getInternalFilesDir)); + return filesDir; +} + +void dc_exit() +{ + settings.content.path.clear(); + if (g_activity != nullptr) + { + JNIEnv *env = jni::env(); + jmethodID finishAffinity = env->GetMethodID(env->GetObjectClass(g_activity), "finishAffinity", "()V"); + jni::env()->CallVoidMethod(g_activity, finishAffinity); + } +} diff --git a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h index 159bf0b6b..9b9fd4801 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h +++ b/shell/android-studio/flycast/src/main/jni/src/android_gamepad.h @@ -20,6 +20,7 @@ #include "input/gamepad_device.h" #include "input/mouse.h" +#include "input/virtual_gamepad.h" #include "jni_util.h" #include @@ -97,25 +98,18 @@ class AndroidGamepadDevice : public GamepadDevice public: AndroidGamepadDevice(int maple_port, int id, const char *name, const char *unique_id, const std::vector& fullAxes, const std::vector& halfAxes) - : GamepadDevice(maple_port, "Android", id != VIRTUAL_GAMEPAD_ID), android_id(id), + : GamepadDevice(maple_port, "Android"), android_id(id), fullAxes(fullAxes), halfAxes(halfAxes) { _name = name; _unique_id = unique_id; INFO_LOG(INPUT, "Android: Opened joystick %d on port %d: '%s' descriptor '%s'", id, maple_port, _name.c_str(), _unique_id.c_str()); - if (id == VIRTUAL_GAMEPAD_ID) - { - input_mapper = std::make_shared(); - rumbleEnabled = true; - } - else - { - loadMapping(); - save_mapping(); - } + + loadMapping(); + save_mapping(); + hasAnalogStick = !fullAxes.empty(); } - ~AndroidGamepadDevice() override - { + ~AndroidGamepadDevice() override { INFO_LOG(INPUT, "Android: Joystick '%s' on port %d disconnected", _name.c_str(), maple_port()); } @@ -246,72 +240,15 @@ class AndroidGamepadDevice : public GamepadDevice GamepadDevice::Unregister(gamepad); }; - void virtual_gamepad_event(int kcode, int joyx, int joyy, int lt, int rt, bool fastForward) - { - // No virtual gamepad when the GUI is open: touch events only - if (gui_is_open()) - { - kcode = 0xffffffff; - joyx = joyy = rt = lt = 0; - } - if (settings.platform.isArcade()) - { - if (rt > 0) - { - if ((kcode & DC_BTN_A) == 0) - // RT + A -> D (coin) - kcode &= ~DC_BTN_D; - if ((kcode & DC_BTN_B) == 0) - // RT + B -> Service - kcode &= ~DC_DPAD2_UP; - if ((kcode & DC_BTN_X) == 0) - // RT + X -> Test - kcode &= ~DC_DPAD2_DOWN; - } - // arcade mapping: X -> btn2, Y -> btn3 - if ((kcode & DC_BTN_X) == 0) - { - kcode &= ~DC_BTN_C; - kcode |= DC_BTN_X; - } - if ((kcode & DC_BTN_Y) == 0) - { - kcode &= ~DC_BTN_X; - kcode |= DC_BTN_Y; - } - if (rt > 0) - // naomi btn4 - kcode &= ~DC_BTN_Y; - if (lt > 0) - // naomi btn5 - kcode &= ~DC_BTN_Z; - } - u32 changes = kcode ^ previous_kcode; - for (int i = 0; i < 32; i++) - if (changes & (1 << i)) - gamepad_btn_input(1 << i, (kcode & (1 << i)) == 0); - if (joyx >= 0) - gamepad_axis_input(DC_AXIS_RIGHT, joyx | (joyx << 8)); - else - gamepad_axis_input(DC_AXIS_LEFT, -joyx | (-joyx << 8)); - if (joyy >= 0) - gamepad_axis_input(DC_AXIS_DOWN, joyy | (joyy << 8)); - else - gamepad_axis_input(DC_AXIS_UP, -joyy | (-joyy << 8)); - gamepad_axis_input(DC_AXIS_LT, lt == 0 ? 0 : 0x7fff); - gamepad_axis_input(DC_AXIS_RT, rt == 0 ? 0 : 0x7fff); - previous_kcode = kcode; - if (fastForward != previousFastForward) - gamepad_btn_input(EMU_BTN_FFORWARD, fastForward); - previousFastForward = fastForward; - } - void rumble(float power, float inclination, u32 duration_ms) override { + power *= rumblePower / 100.f; jboolean has_vibrator = jni::env()->CallBooleanMethod(input_device_manager, input_device_manager_rumble, android_id, power, inclination, duration_ms); rumbleEnabled = has_vibrator; } - bool is_virtual_gamepad() override { return android_id == VIRTUAL_GAMEPAD_ID; } + void setRumbleEnabled(bool rumbleEnabled) { + this->rumbleEnabled = rumbleEnabled; + } bool hasHalfAxis(int axis) const { return std::find(halfAxes.begin(), halfAxes.end(), axis) != halfAxes.end(); } bool hasFullAxis(int axis) const { return std::find(fullAxes.begin(), fullAxes.end(), axis) != fullAxes.end(); } @@ -330,13 +267,9 @@ class AndroidGamepadDevice : public GamepadDevice input_mapper = std::make_shared>(*this); } - static const int VIRTUAL_GAMEPAD_ID = 0x12345678; // must match the Java definition - private: int android_id; static std::map> android_gamepads; - u32 previous_kcode = 0xffffffff; - bool previousFastForward = false; std::vector fullAxes; std::vector halfAxes; }; @@ -475,3 +408,19 @@ class AndroidMouse : public SystemMouse } }; +class AndroidVirtualGamepad : public VirtualGamepad +{ +public: + AndroidVirtualGamepad(bool rumbleEnabled) : VirtualGamepad("Flycast") { + this->rumbleEnabled = rumbleEnabled; + } + + void rumble(float power, float inclination, u32 duration_ms) override + { + power *= rumblePower / 100.f; + jboolean has_vibrator = jni::env()->CallBooleanMethod(input_device_manager, input_device_manager_rumble, GAMEPAD_ID, power, inclination, duration_ms); + rumbleEnabled = has_vibrator; + } + + static constexpr int GAMEPAD_ID = 0x12345678; // must match the Java definition +}; diff --git a/shell/android-studio/flycast/src/main/jni/src/android_input.cpp b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp new file mode 100644 index 000000000..9814a84f0 --- /dev/null +++ b/shell/android-studio/flycast/src/main/jni/src/android_input.cpp @@ -0,0 +1,235 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "android_gamepad.h" +#include "android_keyboard.h" +#include "ui/vgamepad.h" +#include "cfg/option.h" +#include "hw/maple/maple_if.h" + +std::shared_ptr mouse; +std::shared_ptr touchMouse; +std::shared_ptr keyboard; +std::shared_ptr virtualGamepad; + +extern jobject g_activity; +jmethodID showScreenKeyboardMid; +jmethodID setVGamepadEditModeMid; + +// +// VGamepad +// +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_getVibrationPower(JNIEnv *env, jobject obj) { + return (jint)config::VirtualGamepadVibration; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_show(JNIEnv * env, jobject obj) { + vgamepad::show(); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_hide(JNIEnv * env, jobject obj) { + vgamepad::hide(); +} + +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_hitTest(JNIEnv * env, jobject obj, + jfloat x, jfloat y) { + return vgamepad::hitTest(x, y); +} + +extern "C" JNIEXPORT jfloat JNICALL Java_com_flycast_emulator_emu_VGamepad_getControlWidth(JNIEnv * env, jobject obj, + jint controlId) { + return vgamepad::getControlWidth(static_cast(controlId)); +} + +extern "C" JNIEXPORT jint JNICALL Java_com_flycast_emulator_emu_VGamepad_layoutHitTest(JNIEnv * env, jobject obj, + jfloat x, jfloat y) { + return vgamepad::layoutHitTest(x, y); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_scaleElement(JNIEnv * env, jobject obj, + jint elemId, jfloat scale) { + vgamepad::scaleElement(static_cast(elemId), scale); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_VGamepad_translateElement(JNIEnv * env, jobject obj, + jint elemId, jfloat x, jfloat y) { + vgamepad::translateElement(static_cast(elemId), x, y); +} + +namespace vgamepad +{ + +void setEditMode(bool editing) { + jni::env()->CallVoidMethod(g_activity, setVGamepadEditModeMid, editing); +} + +} + +// +// InputDeviceManager +// +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_isMicPluggedIn(JNIEnv *env, jobject obj) +{ + for (const auto& devices : config::MapleExpansionDevices) + if (static_cast(devices[0]) == MDT_Microphone + || static_cast(devices[1]) == MDT_Microphone) + return true; + + return false; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_init(JNIEnv *env, jobject obj) +{ + input_device_manager = env->NewGlobalRef(obj); + input_device_manager_rumble = env->GetMethodID(env->GetObjectClass(obj), "rumble", "(IFFI)Z"); + gui_setOnScreenKeyboardCallback([](bool show) { + if (g_activity != nullptr) + jni::env()->CallVoidMethod(g_activity, showScreenKeyboardMid, show); + }); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAdded(JNIEnv *env, jobject obj, + jint id, jstring name, jint maple_port, jstring junique_id, jintArray fullAxes, jintArray halfAxes, jboolean hasRumble) +{ + if (id == 0) + return; + if (id == AndroidVirtualGamepad::GAMEPAD_ID) + { + virtualGamepad = std::make_shared(hasRumble); + GamepadDevice::Register(virtualGamepad); + touchMouse = std::make_shared(); + GamepadDevice::Register(touchMouse); + } + else + { + std::string joyname = jni::String(name, false); + std::string unique_id = jni::String(junique_id, false); + std::vector full = jni::IntArray(fullAxes, false); + std::vector half = jni::IntArray(halfAxes, false); + + std::shared_ptr gamepad = std::make_shared(maple_port, id, joyname.c_str(), unique_id.c_str(), full, half); + AndroidGamepadDevice::AddAndroidGamepad(gamepad); + gamepad->setRumbleEnabled(hasRumble); + } +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickRemoved(JNIEnv *env, jobject obj, + jint id) +{ + if (id == AndroidVirtualGamepad::GAMEPAD_ID) + { + GamepadDevice::Unregister(virtualGamepad); + virtualGamepad.reset(); + GamepadDevice::Unregister(touchMouse); + touchMouse.reset(); + } + else { + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device) + AndroidGamepadDevice::RemoveAndroidGamepad(device); + } +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualReleaseAll(JNIEnv *env, jobject obj) { + if (virtualGamepad) + virtualGamepad->releaseAll(); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualJoystick(JNIEnv *env, jobject obj, + jfloat x, jfloat y) { + if (virtualGamepad) + virtualGamepad->joystickInput(x, y); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_virtualButtonInput(JNIEnv *env, jobject obj, + jint controlId, jboolean pressed) { + if (virtualGamepad) + virtualGamepad->buttonInput(static_cast(controlId), pressed); +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickButtonEvent(JNIEnv *env, jobject obj, + jint id, jint key, jboolean pressed) +{ + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device != NULL) + return device->gamepad_btn_input(key, pressed); + else + return false; +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardEvent(JNIEnv *env, jobject obj, + jint key, jboolean pressed) +{ + if (keyboard == nullptr) { + keyboard = std::make_shared(); + GamepadDevice::Register(keyboard); + } + keyboard->input(key, pressed); + return true; +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_keyboardText(JNIEnv *env, jobject obj, + jint c) { + gui_keyboard_input((u16)c); +} + +static std::map, jint> previous_axis_values; + +extern "C" JNIEXPORT jboolean JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_joystickAxisEvent(JNIEnv *env, jobject obj, + jint id, jint key, jint value) +{ + std::shared_ptr device = AndroidGamepadDevice::GetAndroidGamepad(id); + if (device != nullptr) + return device->gamepad_axis_input(key, value); + else + return false; +} + +static void createMouse() +{ + if (mouse == nullptr) { + mouse = std::make_shared(touchMouse == nullptr ? 0 : 1); + GamepadDevice::Register(mouse); + } +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseEvent(JNIEnv *env, jobject obj, + jint xpos, jint ypos, jint buttons) +{ + createMouse(); + mouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); + mouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); + mouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); + mouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_mouseScrollEvent(JNIEnv *env, jobject obj, + jint scrollValue) +{ + createMouse(); + mouse->setWheel(scrollValue); +} + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_periph_InputDeviceManager_touchMouseEvent(JNIEnv *env, jobject obj, + jint xpos, jint ypos, jint buttons) +{ + touchMouse->setAbsPos(xpos, ypos, settings.display.width, settings.display.height); + touchMouse->setButton(Mouse::LEFT_BUTTON, (buttons & 1) != 0); + touchMouse->setButton(Mouse::RIGHT_BUTTON, (buttons & 2) != 0); + touchMouse->setButton(Mouse::MIDDLE_BUTTON, (buttons & 4) != 0); +} diff --git a/shell/android-studio/flycast/src/main/jni/src/android_keyboard.h b/shell/android-studio/flycast/src/main/jni/src/android_keyboard.h index 03c50fc52..f8bc27b83 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_keyboard.h +++ b/shell/android-studio/flycast/src/main/jni/src/android_keyboard.h @@ -18,6 +18,8 @@ */ #pragma once #include "input/keyboard_device.h" +#include "hw/naomi/card_reader.h" +#include const u8 AndroidKeycodes[] { /** Unknown key code. */ @@ -572,9 +574,152 @@ class AndroidKeyboard : public KeyboardDevice void input(int androidKeycode, bool pressed) { + if (card_reader::barcodeAvailable() && handleBarcodeScanner(androidKeycode, pressed)) + return; u8 keycode = 0; if (androidKeycode >= 0 && androidKeycode < std::size(AndroidKeycodes)) keycode = AndroidKeycodes[androidKeycode]; KeyboardDevice::input(keycode, pressed, 0); } + +private: + // All known card games use simple Code 39 barcodes. + // The barcode scanner should be configured to use HID-USB (act like a keyboard) + // and use '*' as preamble and terminator, which are the Code 39 start and stop characters. + // So disable the default terminator ('\n') and enable sending the Code 39 start and stop characters. + // Only US QWERTY layout is supported. + bool handleBarcodeScanner(int keycode, bool pressed) + { + static const std::unordered_map keymap { + { 0x3e, ' ' }, + { 0x10f, '*' }, // Shift-8 + { 0x45, '-' }, + { 0x38, '.' }, + { 0x10b, '$' }, // Shift-4 + { 0x4c, '/' }, + { 0x146, '+' }, // Shift-= + { 0x10c, '%' }, // Shift-5 + { 0x11d, 'A' }, + { 0x11e, 'B' }, + { 0x11f, 'C' }, + { 0x120, 'D' }, + { 0x121, 'E' }, + { 0x122, 'F' }, + { 0x123, 'G' }, + { 0x124, 'H' }, + { 0x125, 'I' }, + { 0x126, 'J' }, + { 0x127, 'K' }, + { 0x128, 'L' }, + { 0x129, 'M' }, + { 0x12a, 'N' }, + { 0x12b, 'O' }, + { 0x12c, 'P' }, + { 0x12d, 'Q' }, + { 0x12e, 'R' }, + { 0x12f, 'S' }, + { 0x130, 'T' }, + { 0x131, 'U' }, + { 0x132, 'V' }, + { 0x133, 'W' }, + { 0x134, 'X' }, + { 0x135, 'Y' }, + { 0x136, 'Z' }, + { 0x07, '0' }, + { 0x08, '1' }, + { 0x09, '2' }, + { 0x0a, '3' }, + { 0x0b, '4' }, + { 0x0c, '5' }, + { 0x0d, '6' }, + { 0x0e, '7' }, + { 0x0f, '8' }, + { 0x10, '9' }, + }; + + switch (keycode) + { + case 0x39: // alt left + if (pressed) + modifiers |= 4; + else + modifiers &= ~4; + return false; + case 0x3a: // alt right + if (pressed) + modifiers |= 8; + else + modifiers &= ~8; + return false; + case 0x3b: // shift left + case 0x3c: // shift right + if (pressed) + modifiers |= 1; + else + modifiers &= ~1; + return false; + case 0x71: // ctrl left + case 0x72: // ctrl right + if (pressed) + modifiers |= 2; + else + modifiers &= ~2; + return false; + + default: + break; + } + if (!pressed || (modifiers & ~1) != 0) + // Ignore key releases and unused modifiers + return false; + u16 k = keycode & 0xff; + if (modifiers & 1) + // shift + k |= 0x100; + + auto it = keymap.find(k); + if (it == keymap.end()) + { + if (!barcode.empty()) + { + INFO_LOG(INPUT, "Unrecognized barcode scancode %d mod 0x%x", keycode, modifiers); + barcode.clear(); + } + return false; + } + + u64 now = getTimeMs(); + if (!barcode.empty() && now - lastBarcodeTime >= 500) + { + INFO_LOG(INPUT, "Barcode timeout"); + barcode.clear(); + } + char c = it->second; + if (c == '*') + { + if (barcode.empty()) + { + DEBUG_LOG(INPUT, "Barcode start"); + barcode += '*'; + lastBarcodeTime = now; + } + else + { + card_reader::barcodeSetCard(barcode); + barcode.clear(); + card_reader::insertCard(0); + } + return true; + } + if (barcode.empty()) + return false; + + barcode += c; + lastBarcodeTime = now; + return true; + } + + int modifiers = 0; + std::string barcode; + u64 lastBarcodeTime = 0; }; diff --git a/shell/android-studio/flycast/src/main/jni/src/android_storage.h b/shell/android-studio/flycast/src/main/jni/src/android_storage.h index 165842996..14a9ce3b2 100644 --- a/shell/android-studio/flycast/src/main/jni/src/android_storage.h +++ b/shell/android-studio/flycast/src/main/jni/src/android_storage.h @@ -37,7 +37,12 @@ class AndroidStorage : public CustomStorage jgetParentUri = env->GetMethodID(clazz, "getParentUri", "(Ljava/lang/String;)Ljava/lang/String;"); jgetSubPath = env->GetMethodID(clazz, "getSubPath", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); jgetFileInfo = env->GetMethodID(clazz, "getFileInfo", "(Ljava/lang/String;)Lcom/flycast/emulator/FileInfo;"); - jaddStorage = env->GetMethodID(clazz, "addStorage", "(ZZ)V"); + jexists = env->GetMethodID(clazz, "exists", "(Ljava/lang/String;)Z"); + jaddStorage = env->GetMethodID(clazz, "addStorage", "(ZZLjava/lang/String;Ljava/lang/String;)Z"); + jsaveScreenshot = env->GetMethodID(clazz, "saveScreenshot", "(Ljava/lang/String;[B)V"); + jimportHomeDirectory = env->GetMethodID(clazz, "importHomeDirectory", "()V"); + jexportHomeDirectory = env->GetMethodID(clazz, "exportHomeDirectory", "()V"); + jrequiresSafFilePicker = env->GetMethodID(clazz, "requiresSafFilePicker", "()Z"); } bool isKnownPath(const std::string& path) override { @@ -118,11 +123,30 @@ class AndroidStorage : public CustomStorage return fromJavaFileInfo(jinfo); } - void addStorage(bool isDirectory, bool writeAccess, void (*callback)(bool cancelled, std::string selectedPath)) override + bool exists(const std::string& uri) override { - jni::env()->CallVoidMethod(jstorage, jaddStorage, isDirectory, writeAccess); + jni::String juri(uri); + bool ret = jni::env()->CallBooleanMethod(jstorage, jexists, (jstring)juri); + try { + checkException(); + return ret; + } catch (...) { + return false; + } + } + + bool addStorage(bool isDirectory, bool writeAccess, const std::string& description, + void (*callback)(bool cancelled, std::string selectedPath), const std::string& mimeType) override + { + if (!config::UseSafFilePicker && !jni::env()->CallBooleanMethod(jstorage, jrequiresSafFilePicker)) + return false; + jni::String jdesc(description); + jni::String jmimeType(mimeType); + bool ret = jni::env()->CallBooleanMethod(jstorage, jaddStorage, isDirectory, writeAccess, (jstring)jdesc, (jstring)jmimeType); checkException(); - addStorageCallback = callback; + if (ret) + addStorageCallback = callback; + return ret; } void doStorageCallback(jstring path) @@ -137,6 +161,25 @@ class AndroidStorage : public CustomStorage } } + void saveScreenshot(const std::string& name, const std::vector& data) + { + jni::String jname(name); + jni::ByteArray jdata(data.size()); + jdata.setData(&data[0]); + jni::env()->CallVoidMethod(jstorage, jsaveScreenshot, (jstring)jname, (jbyteArray)jdata); + checkException(); + } + + void importHomeDirectory() { + jni::env()->CallVoidMethod(jstorage, jimportHomeDirectory); + checkException(); + } + + void exportHomeDirectory() { + jni::env()->CallVoidMethod(jstorage, jexportHomeDirectory); + checkException(); + } + private: void checkException() { @@ -159,6 +202,7 @@ class AndroidStorage : public CustomStorage info.isDirectory = env->CallBooleanMethod(jinfo, jisDirectory); info.isWritable = env->CallBooleanMethod(jinfo, jisWritable); info.size = env->CallLongMethod(jinfo, jgetSize); + info.updateTime = env->CallLongMethod(jinfo, jgetUpdateTime); return info; } @@ -175,6 +219,7 @@ class AndroidStorage : public CustomStorage jisDirectory = env->GetMethodID(infoClass, "isDirectory", "()Z"); jisWritable = env->GetMethodID(infoClass, "isWritable", "()Z"); jgetSize = env->GetMethodID(infoClass, "getSize", "()J"); + jgetUpdateTime = env->GetMethodID(infoClass, "getUpdateTime", "()J"); } jobject jstorage; @@ -184,12 +229,18 @@ class AndroidStorage : public CustomStorage jmethodID jaddStorage; jmethodID jgetSubPath; jmethodID jgetFileInfo; + jmethodID jexists; + jmethodID jsaveScreenshot; + jmethodID jexportHomeDirectory; + jmethodID jimportHomeDirectory; + jmethodID jrequiresSafFilePicker; // FileInfo accessors lazily initialized to avoid having to load the class jmethodID jgetName = nullptr; jmethodID jgetPath = nullptr; jmethodID jisDirectory = nullptr; jmethodID jisWritable = nullptr; jmethodID jgetSize = nullptr; + jmethodID jgetUpdateTime = nullptr; void (*addStorageCallback)(bool cancelled, std::string selectedPath); }; @@ -201,6 +252,19 @@ Storage& customStorage() return *androidStorage; } +void saveScreenshot(const std::string& name, const std::vector& data) +{ + return static_cast(customStorage()).saveScreenshot(name, data); +} + +void importHomeDirectory() { + static_cast(customStorage()).importHomeDirectory(); +} + +void exportHomeDirectory() { + static_cast(customStorage()).exportHomeDirectory(); +} + } // namespace hostfs extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_AndroidStorage_addStorageCallback(JNIEnv *env, jobject obj, jstring path) @@ -212,3 +276,14 @@ extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_AndroidStorage_init( { static_cast(hostfs::customStorage()).init(env, jstorage); } + +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_AndroidStorage_reloadConfig(JNIEnv *env) +{ + if (cfgOpen()) + { + const RenderType render = config::RendererType; + config::Settings::instance().load(false); + // Make sure the renderer type doesn't change mid-flight + config::RendererType = render; + } +} diff --git a/shell/android-studio/flycast/src/main/jni/src/http_client.h b/shell/android-studio/flycast/src/main/jni/src/http_client.h index 83072c95e..924226220 100644 --- a/shell/android-studio/flycast/src/main/jni/src/http_client.h +++ b/shell/android-studio/flycast/src/main/jni/src/http_client.h @@ -17,7 +17,7 @@ along with Flycast. If not, see . */ #pragma once -#include "rend/boxart/http_client.h" +#include "oslib/http_client.h" #include "jni_util.h" namespace http { @@ -25,6 +25,7 @@ namespace http { static jobject HttpClient; static jmethodID openUrlMid; static jmethodID postMid; + static jmethodID postRawMid; void init() { } @@ -35,8 +36,10 @@ namespace http { jni::ObjectArray contentOut(1); jni::ObjectArray contentTypeOut(1); - int httpStatus = jni::env()->CallIntMethod(HttpClient, openUrlMid, (jstring)jurl, (jobjectArray)contentOut, - (jobjectArray)contentTypeOut); + int httpStatus = jni::env()->CallIntMethod(HttpClient, openUrlMid, + static_cast(jurl), + static_cast(contentOut), + static_cast(contentTypeOut)); content = contentOut[0]; contentType = contentTypeOut[0]; @@ -44,6 +47,23 @@ namespace http { return httpStatus; } + int post(const std::string &url, const char *payload, const char *contentType, std::vector& reply) + { + jni::String jurl(url); + jni::String jpayload(payload); + jni::String jcontentType(contentType); + jni::ObjectArray replyOut(1); + + int httpStatus = jni::env()->CallIntMethod(HttpClient, postRawMid, + static_cast(jurl), + static_cast(jpayload), + static_cast(jcontentType), + static_cast(replyOut)); + reply = replyOut[0]; + + return httpStatus; + } + int post(const std::string &url, const std::vector& fields) { jni::String jurl(url); @@ -58,7 +78,11 @@ namespace http { contentTypes.setAt(i, fields[i].contentType); } - int httpStatus = jni::env()->CallIntMethod(HttpClient, postMid, (jstring)jurl, (jobjectArray)names, (jobjectArray)values, (jobjectArray)contentTypes); + int httpStatus = jni::env()->CallIntMethod(HttpClient, postMid, + static_cast(jurl), + static_cast(names), + static_cast(values), + static_cast(contentTypes)); return httpStatus; } @@ -68,9 +92,10 @@ namespace http { } -extern "C" JNIEXPORT void JNICALL Java_com_reicast_emulator_emu_HttpClient_nativeInit(JNIEnv *env, jobject obj) +extern "C" JNIEXPORT void JNICALL Java_com_flycast_emulator_emu_HttpClient_nativeInit(JNIEnv *env, jobject obj) { http::HttpClient = env->NewGlobalRef(obj); http::openUrlMid = env->GetMethodID(env->GetObjectClass(obj), "openUrl", "(Ljava/lang/String;[[B[Ljava/lang/String;)I"); http::postMid = env->GetMethodID(env->GetObjectClass(obj), "post", "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)I"); + http::postRawMid = env->GetMethodID(env->GetObjectClass(obj), "post", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[[B)I"); } diff --git a/shell/android-studio/flycast/src/main/jni/src/jni_util.h b/shell/android-studio/flycast/src/main/jni/src/jni_util.h index 30f7d2436..73e57034d 100644 --- a/shell/android-studio/flycast/src/main/jni/src/jni_util.h +++ b/shell/android-studio/flycast/src/main/jni/src/jni_util.h @@ -107,7 +107,7 @@ class Object bool isNull() const { return object == nullptr; } operator jobject() const { return object; } - Class getClass() const; + inline Class getClass() const; template T globalRef() { @@ -249,99 +249,143 @@ class ObjectArray : public Array } }; -class ByteArray : public Array +class ByteArray; +class IntArray; +class ShortArray; +class BooleanArray; + +namespace detail { -public: - using jtype = jbyteArray; +// Use a traits type and specializations to define types needed in the base CRTP template. +template struct JniArrayTraits; +template <> struct JniArrayTraits { + using jtype = jbyteArray; + using ctype = u8; + using vtype = ctype; + static constexpr char const * JNISignature = "[B"; +}; +template <> struct JniArrayTraits { + using jtype = jintArray; + using ctype = int; + using vtype = ctype; + static constexpr char const * JNISignature = "[I"; +}; +template <> struct JniArrayTraits { + using jtype = jshortArray; + using ctype = short; + using vtype = ctype; + static constexpr char const * JNISignature = "[S"; +}; +template <> struct JniArrayTraits { + using jtype = jbooleanArray; + using ctype = bool; + using vtype = u8; // avoid std::vector abomination + static constexpr char const * JNISignature = "[Z"; +}; +} - ByteArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : Array(array, ownRef, globalRef) { } - ByteArray(ByteArray &&other) : Array(std::move(other)) {} - explicit ByteArray(size_t size) : ByteArray() { - object = env()->NewByteArray(size); - } +template +class PrimitiveArray : public Array +{ + using ctype = typename detail::JniArrayTraits::ctype; + using vtype = typename detail::JniArrayTraits::vtype; - ByteArray& operator=(const ByteArray& other) { - return (ByteArray&)Object::operator=(other); - } +public: + using jtype = typename detail::JniArrayTraits::jtype; - operator jbyteArray() const { return (jbyteArray)object; } + PrimitiveArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : Array(array, ownRef, globalRef) { } + PrimitiveArray(PrimitiveArray &&other) : Array(std::move(other)) {} - void getData(u8 *dst, size_t first = 0, size_t len = 0) const { + operator jtype() const { return static_cast(object); } + + void getData(ctype *dst, size_t first = 0, size_t len = 0) const + { if (len == 0) len = size(); if (len != 0) - env()->GetByteArrayRegion((jbyteArray)object, first, len, (jbyte *)dst); + static_cast(this)->getJavaArrayRegion(object, first, len, dst); } - void setData(const u8 *src, size_t first = 0, size_t len = 0) { + void setData(const ctype *src, size_t first = 0, size_t len = 0) + { if (len == 0) len = size(); - env()->SetByteArrayRegion((jbyteArray)object, first, len, (const jbyte *)src); + static_cast(this)->setJavaArrayRegion(object, first, len, src); } - operator std::vector() const + operator std::vector() const { - std::vector v; + std::vector v; v.resize(size()); - getData(v.data()); + getData(static_cast(v.data())); return v; } static Class getClass() { - return Class(env()->FindClass("[B")); + return Class(env()->FindClass(detail::JniArrayTraits::JNISignature)); } }; -class IntArray : public Array +class ByteArray : public PrimitiveArray { + using super = PrimitiveArray; + friend super; + public: - using jtype = jintArray; + ByteArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : super(array, ownRef, globalRef) { } + ByteArray(ByteArray &&other) : super(std::move(other)) {} + explicit ByteArray(size_t size) : ByteArray() { + object = env()->NewByteArray(size); + } - IntArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : Array(array, ownRef, globalRef) { } - IntArray(IntArray &&other) : Array(std::move(other)) {} - explicit IntArray(size_t size) : IntArray() { - object = env()->NewIntArray(size); + ByteArray& operator=(const ByteArray& other) { + return (ByteArray&)Object::operator=(other); } - IntArray& operator=(const IntArray& other) { - return (IntArray&)Object::operator=(other); +protected: + void getJavaArrayRegion(jobject object, size_t first, size_t len, u8 *dst) const { + env()->GetByteArrayRegion((jbyteArray)object, first, len, (jbyte *)dst); } - operator jintArray() const { return (jintArray)object; } + void setJavaArrayRegion(jobject object, size_t first, size_t len, const u8 *dst) { + env()->SetByteArrayRegion((jbyteArray)object, first, len, (const jbyte *)dst); + } +}; - void getData(int *dst, size_t first = 0, size_t len = 0) const { - if (len == 0) - len = size(); - if (len != 0) - env()->GetIntArrayRegion((jintArray)object, first, len, (jint *)dst); +class IntArray : public PrimitiveArray +{ + using super = PrimitiveArray; + friend super; + +public: + IntArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : super(array, ownRef, globalRef) { } + IntArray(IntArray &&other) : super(std::move(other)) {} + explicit IntArray(size_t size) : IntArray() { + object = env()->NewIntArray(size); } - void setData(const int *src, size_t first = 0, size_t len = 0) { - if (len == 0) - len = size(); - env()->SetIntArrayRegion((jintArray)object, first, len, (const jint *)src); + IntArray& operator=(const IntArray& other) { + return (IntArray&)Object::operator=(other); } - operator std::vector() const - { - std::vector v; - v.resize(size()); - getData(v.data()); - return v; +protected: + void getJavaArrayRegion(jobject object, size_t first, size_t len, int *dst) const { + env()->GetIntArrayRegion((jintArray)object, first, len, (jint *)dst); } - static Class getClass() { - return Class(env()->FindClass("[I")); + void setJavaArrayRegion(jobject object, size_t first, size_t len, const int *dst) { + env()->SetIntArrayRegion((jintArray)object, first, len, (const jint *)dst); } }; -class ShortArray : public Array +class ShortArray : public PrimitiveArray { -public: - using jtype = jshortArray; + using super = PrimitiveArray; + friend super; - ShortArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : Array(array, ownRef, globalRef) { } - ShortArray(ShortArray &&other) : Array(std::move(other)) {} +public: + ShortArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : super(array, ownRef, globalRef) { } + ShortArray(ShortArray &&other) : super(std::move(other)) {} explicit ShortArray(size_t size) : ShortArray() { object = env()->NewShortArray(size); } @@ -350,23 +394,39 @@ class ShortArray : public Array return (ShortArray&)Object::operator=(other); } - operator jshortArray() const { return (jshortArray)object; } +protected: + void getJavaArrayRegion(jobject object, size_t first, size_t len, short *dst) const { + env()->GetShortArrayRegion((jshortArray)object, first, len, (jshort *)dst); + } - void getData(short *dst, size_t first = 0, size_t len = 0) { - if (len == 0) - len = size(); - if (len != 0) - env()->GetShortArrayRegion((jshortArray)object, first, len, (jshort *)dst); + void setJavaArrayRegion(jobject object, size_t first, size_t len, const short *dst) { + env()->SetShortArrayRegion((jshortArray)object, first, len, (const jshort *)dst); } +}; - void setData(const short *src, size_t first = 0, size_t len = 0) { - if (len == 0) - len = size(); - env()->SetShortArrayRegion((jshortArray)object, first, len, (const jshort *)src); +class BooleanArray : public PrimitiveArray +{ + using super = PrimitiveArray; + friend super; + +public: + BooleanArray(jobject array = nullptr, bool ownRef = true, bool globalRef = false) : super(array, ownRef, globalRef) { } + BooleanArray(BooleanArray &&other) : super(std::move(other)) {} + explicit BooleanArray(size_t size) : BooleanArray() { + object = env()->NewBooleanArray(size); } - static Class getClass() { - return Class(env()->FindClass("[S")); + BooleanArray& operator=(const BooleanArray& other) { + return (BooleanArray&)Object::operator=(other); + } + +protected: + void getJavaArrayRegion(jobject object, size_t first, size_t len, bool *dst) const { + env()->GetBooleanArrayRegion((jbooleanArray)object, first, len, (jboolean *)dst); + } + + void setJavaArrayRegion(jobject object, size_t first, size_t len, const bool *dst) { + env()->SetBooleanArrayRegion((jbooleanArray)object, first, len, (const jboolean *)dst); } }; diff --git a/shell/android-studio/flycast/src/main/res/values/donottranslate.xml b/shell/android-studio/flycast/src/main/res/values/donottranslate.xml index 6f2308f72..97f137eb7 100644 --- a/shell/android-studio/flycast/src/main/res/values/donottranslate.xml +++ b/shell/android-studio/flycast/src/main/res/values/donottranslate.xml @@ -1,9 +1,3 @@ - Flycast - - reicast.com - - dreamcast - \ No newline at end of file diff --git a/shell/android-studio/gradle.properties b/shell/android-studio/gradle.properties index a03b35489..aaace3531 100644 --- a/shell/android-studio/gradle.properties +++ b/shell/android-studio/gradle.properties @@ -8,8 +8,8 @@ # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK @@ -19,3 +19,5 @@ android.useAndroidX=true # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true +# Don't uninstall the apk after running tests +android.injected.androidTest.leaveApksInstalledAfterRun=true diff --git a/shell/android-studio/gradle/libs.versions.toml b/shell/android-studio/gradle/libs.versions.toml new file mode 100644 index 000000000..64a4f0144 --- /dev/null +++ b/shell/android-studio/gradle/libs.versions.toml @@ -0,0 +1,17 @@ +[versions] +agp = "8.7.0" +appcompat = "1.3.1" +commonsLang3 = "3.12.0" +documentfile = "1.0.1" +httpclient5 = "5.0.3" +slf4jAndroid = "1.7.35" + +[libraries] +appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commonsLang3" } +documentfile = { module = "androidx.documentfile:documentfile", version.ref = "documentfile" } +httpclient5 = { module = "org.apache.httpcomponents.client5:httpclient5", version.ref = "httpclient5" } +slf4j-android = { module = "org.slf4j:slf4j-android", version.ref = "slf4jAndroid" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } diff --git a/shell/android-studio/gradle/wrapper/gradle-wrapper.properties b/shell/android-studio/gradle/wrapper/gradle-wrapper.properties index 9cec9b8c4..8a516d151 100644 --- a/shell/android-studio/gradle/wrapper/gradle-wrapper.properties +++ b/shell/android-studio/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jun 05 22:55:18 CEST 2023 +#Sat Oct 12 11:37:50 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/shell/android-studio/ic_launcher-web.png b/shell/android-studio/ic_launcher-web.png deleted file mode 100644 index 3fc7a9bba..000000000 Binary files a/shell/android-studio/ic_launcher-web.png and /dev/null differ diff --git a/shell/android-studio/icons/cd.pdn b/shell/android-studio/icons/cd.pdn deleted file mode 100644 index b618d47ae..000000000 Binary files a/shell/android-studio/icons/cd.pdn and /dev/null differ diff --git a/shell/android-studio/playstore.jks b/shell/android-studio/playstore.jks new file mode 100644 index 000000000..ec5e2a7fc Binary files /dev/null and b/shell/android-studio/playstore.jks differ diff --git a/shell/android-studio/psd/dark_texture.psd b/shell/android-studio/psd/dark_texture.psd deleted file mode 100644 index e8b70f427..000000000 Binary files a/shell/android-studio/psd/dark_texture.psd and /dev/null differ diff --git a/shell/android-studio/psd/disk_mipmap.psd b/shell/android-studio/psd/disk_mipmap.psd deleted file mode 100644 index f04647854..000000000 Binary files a/shell/android-studio/psd/disk_mipmap.psd and /dev/null differ diff --git a/shell/android-studio/psd/icon_drawable.psd b/shell/android-studio/psd/icon_drawable.psd deleted file mode 100644 index 4dfb75ec0..000000000 Binary files a/shell/android-studio/psd/icon_drawable.psd and /dev/null differ diff --git a/shell/android-studio/screenshots/TV/flycast-banner.png b/shell/android-studio/screenshots/TV/flycast-banner.png new file mode 100644 index 000000000..83a715057 Binary files /dev/null and b/shell/android-studio/screenshots/TV/flycast-banner.png differ diff --git a/shell/android-studio/screenshots/TV/tv_screenshot_cheevos.png b/shell/android-studio/screenshots/TV/tv_screenshot_cheevos.png new file mode 100644 index 000000000..7c2790f61 Binary files /dev/null and b/shell/android-studio/screenshots/TV/tv_screenshot_cheevos.png differ diff --git a/shell/android-studio/screenshots/TV/tv_screenshot_gameplay.png b/shell/android-studio/screenshots/TV/tv_screenshot_gameplay.png new file mode 100644 index 000000000..e07a9d5b9 Binary files /dev/null and b/shell/android-studio/screenshots/TV/tv_screenshot_gameplay.png differ diff --git a/shell/android-studio/screenshots/TV/tv_screenshot_library.png b/shell/android-studio/screenshots/TV/tv_screenshot_library.png new file mode 100644 index 000000000..bf49a7cfc Binary files /dev/null and b/shell/android-studio/screenshots/TV/tv_screenshot_library.png differ diff --git a/shell/android-studio/screenshots/TV/tv_screenshot_pausemenu.png b/shell/android-studio/screenshots/TV/tv_screenshot_pausemenu.png new file mode 100644 index 000000000..0a2cc83c0 Binary files /dev/null and b/shell/android-studio/screenshots/TV/tv_screenshot_pausemenu.png differ diff --git a/shell/android-studio/screenshots/TV/tv_screenshot_settings.png b/shell/android-studio/screenshots/TV/tv_screenshot_settings.png new file mode 100644 index 000000000..b5a4ed888 Binary files /dev/null and b/shell/android-studio/screenshots/TV/tv_screenshot_settings.png differ diff --git a/shell/android-studio/screenshots/screenshot_cheevos.png b/shell/android-studio/screenshots/screenshot_cheevos.png new file mode 100644 index 000000000..eaa8977ae Binary files /dev/null and b/shell/android-studio/screenshots/screenshot_cheevos.png differ diff --git a/shell/android-studio/screenshots/screenshot_gameplay.png b/shell/android-studio/screenshots/screenshot_gameplay.png new file mode 100644 index 000000000..cab762769 Binary files /dev/null and b/shell/android-studio/screenshots/screenshot_gameplay.png differ diff --git a/shell/android-studio/screenshots/screenshot_library.png b/shell/android-studio/screenshots/screenshot_library.png new file mode 100644 index 000000000..feb8fd294 Binary files /dev/null and b/shell/android-studio/screenshots/screenshot_library.png differ diff --git a/shell/android-studio/screenshots/screenshot_pausemenu.png b/shell/android-studio/screenshots/screenshot_pausemenu.png new file mode 100644 index 000000000..e04f296f5 Binary files /dev/null and b/shell/android-studio/screenshots/screenshot_pausemenu.png differ diff --git a/shell/android-studio/screenshots/screenshot_settings.png b/shell/android-studio/screenshots/screenshot_settings.png new file mode 100644 index 000000000..b14c47e1d Binary files /dev/null and b/shell/android-studio/screenshots/screenshot_settings.png differ diff --git a/shell/android-studio/settings.gradle b/shell/android-studio/settings.gradle index 3654d9115..f4b446937 100644 --- a/shell/android-studio/settings.gradle +++ b/shell/android-studio/settings.gradle @@ -1,6 +1,12 @@ pluginManagement { repositories { - google() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } mavenCentral() gradlePluginPortal() } diff --git a/shell/apple/common/http_client.mm b/shell/apple/common/http_client.mm index e1f411533..e577face7 100644 --- a/shell/apple/common/http_client.mm +++ b/shell/apple/common/http_client.mm @@ -17,7 +17,7 @@ along with Flycast. If not, see . */ #import -#include "rend/boxart/http_client.h" +#include "oslib/http_client.h" namespace http { @@ -46,6 +46,40 @@ int get(const std::string& url, std::vector& content, std::string& contentTy return [httpResponse statusCode]; } +int post(const std::string& url, const char *payload, const char *contentType, std::vector& reply) +{ + NSString *nsurl = [NSString stringWithCString:url.c_str() + encoding:[NSString defaultCStringEncoding]]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:nsurl]]; + [request setHTTPMethod:@"POST"]; + [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + [request setHTTPShouldHandleCookies:NO]; + + size_t payloadSize = strlen(payload); + [request setHTTPBody:[NSData dataWithBytes:payload length:payloadSize]]; + NSString *postLength = [NSString stringWithFormat:@"%ld", (unsigned long)payloadSize]; + [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; + NSString *nscontentType = contentType != nullptr ? [NSString stringWithCString:contentType + encoding:[NSString defaultCStringEncoding]] + : @"application/x-www-form-urlencoded"; + [request setValue:nscontentType forHTTPHeaderField:@"Content-Type"]; + + NSURLResponse *response = nil; + NSError *error = nil; + NSData *data = [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:&error]; + if (error != nil) + return 500; + + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + + reply.clear(); + reply.insert(reply.begin(), (const u8 *)[data bytes], (const u8 *)[data bytes] + [data length]); + + return [httpResponse statusCode]; +} + int post(const std::string& url, const std::vector& fields) { NSString *nsurl = [NSString stringWithCString:url.c_str() diff --git a/shell/apple/common/util.mm b/shell/apple/common/util.mm new file mode 100644 index 000000000..2e282aa60 --- /dev/null +++ b/shell/apple/common/util.mm @@ -0,0 +1,27 @@ +/* + Copyright 2023 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#import +#include "oslib/oslib.h" + +void os_SetThreadName(const char *name) +{ + NSString *nsname = [NSString stringWithCString:name + encoding:[NSString defaultCStringEncoding]]; + [[NSThread currentThread] setName:nsname]; +} diff --git a/shell/apple/emulator-ios/emulator/AppDelegate.mm b/shell/apple/emulator-ios/emulator/AppDelegate.mm index 65a3b78bf..34840d42a 100644 --- a/shell/apple/emulator-ios/emulator/AppDelegate.mm +++ b/shell/apple/emulator-ios/emulator/AppDelegate.mm @@ -23,10 +23,12 @@ #import "AppDelegate.h" #import +#include +#include #include "emulator.h" #include "log/LogManager.h" #include "cfg/option.h" -#include "rend/gui.h" +#include "ui/gui.h" static bool emulatorRunning; @@ -50,6 +52,11 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( if (error != nil) NSLog(@"AVAudioSession.setActive: %@", error); + if (getppid() != 1) { + /* Make LLDB ignore EXC_BAD_ACCESS for debugging */ + task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); + } + return YES; } @@ -73,7 +80,6 @@ - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - gui_save(); if (config::AutoSaveState && !settings.content.path.empty()) dc_savestate(config::SavestateSlot); } @@ -111,7 +117,6 @@ - (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url op } if ([url startAccessingSecurityScopedResource]) openedURL = url; - gui_state = GuiState::Closed; gui_start_game(url.fileSystemRepresentation); return true; diff --git a/shell/apple/emulator-ios/emulator/EditPadViewController.h b/shell/apple/emulator-ios/emulator/EditPadViewController.h new file mode 100644 index 000000000..b347b8eba --- /dev/null +++ b/shell/apple/emulator-ios/emulator/EditPadViewController.h @@ -0,0 +1,31 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#pragma once +#import + +@interface EditPadViewController : UIViewController + +- (void) showController:(UIView *)parentView; +- (void) hideController; +- (BOOL) isControllerVisible; +- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer; +- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer; +- (IBAction)handleTap:(UITapGestureRecognizer *)recognizer; + +@end diff --git a/shell/apple/emulator-ios/emulator/EditPadViewController.mm b/shell/apple/emulator-ios/emulator/EditPadViewController.mm new file mode 100644 index 000000000..58c803a6b --- /dev/null +++ b/shell/apple/emulator-ios/emulator/EditPadViewController.mm @@ -0,0 +1,131 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#import "EditPadViewController.h" +#include "types.h" +#include "ui/gui.h" +#include "ui/vgamepad.h" +#include "cfg/cfg.h" + +@interface EditPadViewController () { + vgamepad::Element currentControl; +} + +@end + +@implementation EditPadViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + currentControl = vgamepad::Elem_None; +} + +- (void)showController:(UIView *)parentView +{ + if (!cfgLoadBool("help", "EditPadTip", false)) + { + UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Help Tip" + message:@"Double tap to exit." + preferredStyle:UIAlertControllerStyleAlert]; + [self presentViewController:alert animated:YES completion:nil]; + UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault + handler:^(UIAlertAction * action) { + cfgSaveBool("help", "EditPadTip", true); + }]; + [alert addAction:defaultAction]; + } + [parentView addSubview:self.view]; +} + +- (void)hideController +{ + [self.view removeFromSuperview]; +} + +- (BOOL)isControllerVisible { + return self.view.window != nil; +} + +static void normalize(CGPoint& pos, const CGSize& size) { + pos.x /= size.width; + pos.y /= size.height; +} + +- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer +{ + CGPoint loc = [recognizer locationInView:self.view]; + normalize(loc, self.view.bounds.size); + switch (recognizer.state) + { + case UIGestureRecognizerStateBegan: + currentControl = vgamepad::layoutHitTest(loc.x, loc.y); + break; + case UIGestureRecognizerStateEnded: + currentControl = vgamepad::Elem_None; + break; + case UIGestureRecognizerStateChanged: + if (currentControl != vgamepad::Elem_None) + { + CGPoint translation = [recognizer translationInView:self.view]; + [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; + normalize(translation, self.view.bounds.size); + vgamepad::translateElement(currentControl, translation.x, translation.y); + } + break; + case UIGestureRecognizerStateCancelled: + currentControl = vgamepad::Elem_None; + break; + default: + break; + } +} + +- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer +{ + CGPoint loc = [recognizer locationInView:self.view]; + normalize(loc, self.view.bounds.size); + switch (recognizer.state) + { + case UIGestureRecognizerStateBegan: + currentControl = vgamepad::layoutHitTest(loc.x, loc.y); + break; + case UIGestureRecognizerStateChanged: + if (currentControl != vgamepad::Elem_None) + vgamepad::scaleElement(currentControl, recognizer.scale); + break; + case UIGestureRecognizerStateEnded: + currentControl = vgamepad::Elem_None; + break; + case UIGestureRecognizerStateCancelled: + currentControl = vgamepad::Elem_None; + break; + default: + break; + } + recognizer.scale = 1; +} + +- (IBAction)handleTap:(UITapGestureRecognizer *)recognizer +{ + if (recognizer.state == UIGestureRecognizerStateRecognized) + gui_open_settings(); +} + +@end + diff --git a/shell/apple/emulator-ios/emulator/EditPadViewController.xib b/shell/apple/emulator-ios/emulator/EditPadViewController.xib new file mode 100644 index 000000000..224cf0ac4 --- /dev/null +++ b/shell/apple/emulator-ios/emulator/EditPadViewController.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/apple/emulator-ios/emulator/EmulatorView.mm b/shell/apple/emulator-ios/emulator/EmulatorView.mm index e10491774..42a34aff0 100644 --- a/shell/apple/emulator-ios/emulator/EmulatorView.mm +++ b/shell/apple/emulator-ios/emulator/EmulatorView.mm @@ -20,17 +20,17 @@ #import "EmulatorView.h" #include "types.h" -#include "rend/gui.h" +#include "ui/gui.h" #include "ios_gamepad.h" @implementation EmulatorView { - std::shared_ptr mouse; + std::shared_ptr mouse; } - (void)didMoveToSuperview { [super didMoveToSuperview]; - mouse = std::make_shared(); + mouse = std::make_shared(); GamepadDevice::Register(mouse); } @@ -45,8 +45,7 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; { UITouch *touch = [touches anyObject]; [self touchLocation:touch]; - if (gui_is_open()) - mouse->setButton(Mouse::LEFT_BUTTON, true); + mouse->setButton(Mouse::LEFT_BUTTON, true); [super touchesBegan:touches withEvent:event]; } @@ -54,8 +53,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; { UITouch *touch = [touches anyObject]; [self touchLocation:touch]; - if (gui_is_open()) - mouse->setButton(Mouse::LEFT_BUTTON, false); + mouse->setButton(Mouse::LEFT_BUTTON, false); [super touchesEnded:touches withEvent:event]; } diff --git a/shell/apple/emulator-ios/emulator/FlycastViewController.mm b/shell/apple/emulator-ios/emulator/FlycastViewController.mm index 07cd93a42..bff71e870 100644 --- a/shell/apple/emulator-ios/emulator/FlycastViewController.mm +++ b/shell/apple/emulator-ios/emulator/FlycastViewController.mm @@ -29,11 +29,12 @@ #import #import "PadViewController.h" +#import "EditPadViewController.h" #import "EmulatorView.h" #include "types.h" #include "wsi/context.h" -#include "rend/mainui.h" +#include "ui/mainui.h" #include "emulator.h" #include "log/LogManager.h" #include "stdclass.h" @@ -43,7 +44,6 @@ #include "ios_mouse.h" #include "oslib/oslib.h" -//@import AltKit; #import "AltKit-Swift.h" static std::string iosJitStatus; @@ -54,8 +54,6 @@ std::map> IOSKeyboard::keyboards; std::map> IOSMouse::mice; -void common_linux_setup(); - static bool lockedPointer; static void updatePointerLock(Event event, void *) { @@ -94,6 +92,7 @@ static void updateAudioSession(Event event, void *) switch (config::MapleMainDevices[bus]) { case MDT_SegaController: + case MDT_SegaControllerXL: for (int port = 0; port < 2; port++) if (config::MapleExpansionDevices[bus][port] == MDT_Microphone) hasMicrophone = true; @@ -101,6 +100,7 @@ static void updateAudioSession(Event event, void *) case MDT_LightGun: case MDT_AsciiStick: case MDT_TwinStick: + case MDT_RacingController: if (config::MapleExpansionDevices[bus][0] == MDT_Microphone) hasMicrophone = true; break; @@ -149,6 +149,7 @@ @interface FlycastViewController () 10.0) + static u64 lastCheckTime; + if (!iosJitAuthorized && getTimeMs() - lastCheckTime > 10000) { [flycastViewController altKitStart]; - lastCheckTime = os_GetSeconds(); + lastCheckTime = getTimeMs(); } return iosJitStatus.c_str(); } + +namespace vgamepad +{ + +void setEditMode(bool editing) { + [flycastViewController setVGamepadEditMode:editing]; +} + +} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad.png b/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad.png deleted file mode 100644 index dddf84fdf..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad@2x.png deleted file mode 100644 index 247353558..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/ABXYPad@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/Contents.json deleted file mode 100644 index 7c836a94b..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/ABXYPad.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "ABXYPad.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "ABXYPad@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120-1.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120-1.png deleted file mode 100644 index d55a0f2ab..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120-1.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120.png index d55a0f2ab..059d06240 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/120.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/152.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/152.png index b59628218..322e42d9b 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/152.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/152.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/167.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/167.png index ad2fe3de1..a123f9a0b 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/167.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/167.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/180.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/180.png index a3c6a7818..7643d6059 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/180.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/180.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/20.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/20.png index 180fc6bbb..ecd0df4ab 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/20.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/20.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/29.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/29.png index 61d638f7d..631bcaed3 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/29.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/29.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-1.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-1.png deleted file mode 100644 index 0c034c788..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-1.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-2.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-2.png deleted file mode 100644 index 0c034c788..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40-2.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40.png index 0c034c788..126052c4d 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/40.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58-1.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58-1.png deleted file mode 100644 index 0703a3f43..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58-1.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58.png index 0703a3f43..e33f4d395 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/58.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/60.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/60.png index d029a8fd5..86ae1dd44 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/60.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/60.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/76.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/76.png index 14a5efabe..3652a6b20 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/76.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/76.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80-1.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80-1.png deleted file mode 100644 index 3bf870791..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80-1.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80.png index 3bf870791..49bcb190c 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/80.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/87.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/87.png index 134383fdb..c6c33b9f2 100644 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/87.png and b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/87.png differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/Contents.json index 694d83d00..65b74d7ef 100644 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,116 +1 @@ -{ - "images" : [ - { - "filename" : "40.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "60.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "58-1.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "87.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "80.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "120.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "120-1.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "20.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "40-1.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "58.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "40-2.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "80-1.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "76.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "152.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "167.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "appstore.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} \ No newline at end of file diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/appstore.png b/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/appstore.png deleted file mode 100644 index 412999c06..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/AppIcon.appiconset/appstore.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/Contents.json deleted file mode 100644 index 2c0bf7313..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "DPad.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "DPad@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad.png b/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad.png deleted file mode 100644 index 5bb8caa5b..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad@2x.png deleted file mode 100644 index e34e0163b..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/DPad.imageset/DPad@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/Contents.json deleted file mode 100644 index c0251f4cd..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "JoystickBackground.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "JoystickBackground@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground.png b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground.png deleted file mode 100644 index 2a251547c..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground@2x.png deleted file mode 100644 index 28e3cafb0..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickBackground.imageset/JoystickBackground@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/Contents.json deleted file mode 100644 index cd144d7f0..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "JoystickButton.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "JoystickButton@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton.png b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton.png deleted file mode 100644 index a58b1497c..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton@2x.png deleted file mode 100644 index f4cdd3624..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/JoystickButton.imageset/JoystickButton@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/Contents.json deleted file mode 100644 index b29609a2f..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "LTrigger.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "LTrigger@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger.png b/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger.png deleted file mode 100644 index f6ece7192..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger@2x.png deleted file mode 100644 index 8693da029..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/LTrigger.imageset/LTrigger@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/Contents.json deleted file mode 100644 index 49f44043a..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "RTrigger.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "RTrigger@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger.png b/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger.png deleted file mode 100644 index f81f14188..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger@2x.png deleted file mode 100644 index d932995c7..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/RTrigger.imageset/RTrigger@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Contents.json b/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Contents.json deleted file mode 100644 index 8d88e6bc9..000000000 --- a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "filename" : "Start.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Start@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start.png b/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start.png deleted file mode 100644 index e3ea5cc58..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start@2x.png b/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start@2x.png deleted file mode 100644 index 099c7371c..000000000 Binary files a/shell/apple/emulator-ios/emulator/Images.xcassets/Start.imageset/Start@2x.png and /dev/null differ diff --git a/shell/apple/emulator-ios/emulator/PadViewController.h b/shell/apple/emulator-ios/emulator/PadViewController.h index c6f6b93ca..74a33f5e9 100644 --- a/shell/apple/emulator-ios/emulator/PadViewController.h +++ b/shell/apple/emulator-ios/emulator/PadViewController.h @@ -24,11 +24,6 @@ @interface PadViewController : UIViewController -@property (weak, nonatomic) IBOutlet UIImageView *joystick; -@property (weak, nonatomic) IBOutlet UIImageView *joystickBackground; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *joyXConstraint; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint *joyYConstraint; - - (void) showController:(UIView *)parentView; - (void) hideController; - (BOOL) isControllerVisible; diff --git a/shell/apple/emulator-ios/emulator/PadViewController.mm b/shell/apple/emulator-ios/emulator/PadViewController.mm index 19f7d841a..fb649db40 100644 --- a/shell/apple/emulator-ios/emulator/PadViewController.mm +++ b/shell/apple/emulator-ios/emulator/PadViewController.mm @@ -23,12 +23,14 @@ #import "PadViewController.h" #include "ios_gamepad.h" #include "cfg/cfg.h" +#include "ui/vgamepad.h" @interface PadViewController () { UITouch *joyTouch; CGPoint joyBias; std::shared_ptr virtualGamepad; NSMutableDictionary *touchToButton; + NSTimer *hideTimer; } @end @@ -58,11 +60,13 @@ - (void)showController:(UIView *)parentView [alert addAction:defaultAction]; } [parentView addSubview:self.view]; + [self startHideTimer]; } - (void)hideController { - [self resetTouch]; + [self resetAnalog]; + [hideTimer invalidate]; [self.view removeFromSuperview]; } @@ -70,109 +74,146 @@ - (BOOL)isControllerVisible { return self.view.window != nil; } -- (void)resetTouch +-(void)startHideTimer +{ + [hideTimer invalidate]; + hideTimer = [NSTimer scheduledTimerWithTimeInterval:10 + target:self + selector:@selector(hideTimer) + userInfo:nil + repeats:NO]; + vgamepad::show(); +} + +-(void)hideTimer { + vgamepad::hide(); +} + +- (void)resetAnalog { joyTouch = nil; - self.joyXConstraint.constant = 0; - self.joyYConstraint.constant = 0; - virtualGamepad->gamepad_axis_input(IOS_AXIS_LX, 0); - virtualGamepad->gamepad_axis_input(IOS_AXIS_LY, 0); + virtualGamepad->joystickInput(0, 0); +} + +static CGPoint translateCoords(const CGPoint& pos, const CGSize& size) +{ + CGFloat hscale = 480.0 / size.height; + CGPoint p; + p.y = pos.y * hscale; + p.x = (pos.x - (size.width - 640.0 / hscale) / 2.0) * hscale; + return p; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; { - for (UITouch *touch in touches) { - if (joyTouch == nil) { - CGPoint loc = [touch locationInView:self.joystickBackground]; - if ([self.joystickBackground pointInside:loc withEvent:event]) { - joyTouch = touch; - joyBias = loc; - virtualGamepad->gamepad_axis_input(IOS_AXIS_LX, 0); - virtualGamepad->gamepad_axis_input(IOS_AXIS_LY, 0); - continue; - } - } + bool forwardEvent = true; + [self startHideTimer]; + for (UITouch *touch in touches) + { CGPoint point = [touch locationInView:self.view]; - UIView *touchedView = [self.view hitTest:point withEvent:nil]; + point = translateCoords(point, self.view.bounds.size); + vgamepad::ControlId control = vgamepad::hitTest(point.x, point.y); + if (joyTouch == nil && (control == vgamepad::AnalogArea || control == vgamepad::AnalogStick)) + { + [self resetAnalog]; + joyTouch = touch; + joyBias = point; + forwardEvent = false; + continue; + } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; - if (touchedView.tag != 0 && touchToButton[key] == nil) { - touchToButton[key] = touchedView; + if (control != vgamepad::None && control != vgamepad::AnalogArea + && control != vgamepad::AnalogStick && touchToButton[key] == nil) + { + touchToButton[key] = [NSNumber numberWithInt:control]; // button down - virtualGamepad->gamepad_btn_input((u32)touchedView.tag, true); + virtualGamepad->buttonInput(control, true); + forwardEvent = false; } } - [super touchesBegan:touches withEvent:event]; + if (forwardEvent) + [super touchesBegan:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; { - for (UITouch *touch in touches) { + bool forwardEvent = true; + for (UITouch *touch in touches) + { if (touch == joyTouch) { - [self resetTouch]; + [self resetAnalog]; + forwardEvent = false; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; - UIView *button = touchToButton[key]; - if (button != nil) { + NSNumber *control = touchToButton[key]; + if (control != nil) { [touchToButton removeObjectForKey:key]; // button up - virtualGamepad->gamepad_btn_input((u32)button.tag, false); + virtualGamepad->buttonInput(static_cast(control.intValue), false); + forwardEvent = false; } } - [super touchesEnded:touches withEvent:event]; + if (forwardEvent) + [super touchesEnded:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; { - for (UITouch *touch in touches) { - if (touch == joyTouch) { - CGPoint pos = [touch locationInView:[self joystickBackground]]; - pos.x -= joyBias.x; - pos.y -= joyBias.y; - pos.x = std::max(std::min(25.0, pos.x), -25.0); - pos.y = std::max(std::min(25.0, pos.y), -25.0); - self.joyXConstraint.constant = pos.x; - self.joyYConstraint.constant = pos.y; - virtualGamepad->gamepad_axis_input(IOS_AXIS_LX, (s8)std::round(pos.x * 32767.0 / 25.0)); - virtualGamepad->gamepad_axis_input(IOS_AXIS_LY, (s8)std::round(pos.y * 32767.0 / 25.0)); + bool forwardEvent = true; + [self startHideTimer]; + for (UITouch *touch in touches) + { + CGPoint point = [touch locationInView:self.view]; + point = translateCoords(point, self.view.bounds.size); + if (touch == joyTouch) + { + point.x -= joyBias.x; + point.y -= joyBias.y; + double sz = vgamepad::getControlWidth(vgamepad::AnalogStick); + point.x = std::max(std::min(1.0, point.x / sz), -1.0); + point.y = std::max(std::min(1.0, point.y / sz), -1.0); + virtualGamepad->joystickInput(point.x, point.y); + forwardEvent = false; continue; } - CGPoint point = [touch locationInView:self.view]; - UIView *touchedView = [self.view hitTest:point withEvent:nil]; + vgamepad::ControlId control = vgamepad::hitTest(point.x, point.y); NSValue *key = [NSValue valueWithPointer:(const void *)touch]; - UIView *button = touchToButton[key]; - if (button != nil && touchedView.tag != button.tag) { + NSNumber *prevControl = touchToButton[key]; + if (prevControl.intValue == control) + continue; + if (prevControl != nil && prevControl.intValue != vgamepad::None && prevControl.intValue != vgamepad::AnalogArea) { // button up - virtualGamepad->gamepad_btn_input((u32)button.tag, false); - touchToButton[key] = touchedView; - // button down - virtualGamepad->gamepad_btn_input((u32)touchedView.tag, true); - } - else if (button == nil && touchedView.tag != 0) - { - touchToButton[key] = touchedView; - // button down - virtualGamepad->gamepad_btn_input((u32)touchedView.tag, true); + virtualGamepad->buttonInput(static_cast(prevControl.intValue), false); } + // button down + virtualGamepad->buttonInput(control, true); + touchToButton[key] = [NSNumber numberWithInt:control]; + forwardEvent = false; } - [super touchesMoved:touches withEvent:event]; + if (forwardEvent) + [super touchesMoved:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; { + bool forwardEvent = true; for (UITouch *touch in touches) { if (touch == joyTouch) { - [self resetTouch]; + [self resetAnalog]; + forwardEvent = false; continue; } NSValue *key = [NSValue valueWithPointer:(const void *)touch]; - UIView *button = touchToButton[key]; - if (button != nil) { + NSNumber *control = touchToButton[key]; + if (control != nil) { [touchToButton removeObjectForKey:key]; // button up - virtualGamepad->gamepad_btn_input((u32)button.tag, false); + virtualGamepad->buttonInput(static_cast(control.intValue), false); + forwardEvent = false; } } - [super touchesCancelled:touches withEvent:event]; + if (forwardEvent) + [super touchesCancelled:touches withEvent:event]; } @end diff --git a/shell/apple/emulator-ios/emulator/PadViewController.xib b/shell/apple/emulator-ios/emulator/PadViewController.xib index 94a774c7a..6ccc8b085 100644 --- a/shell/apple/emulator-ios/emulator/PadViewController.xib +++ b/shell/apple/emulator-ios/emulator/PadViewController.xib @@ -10,214 +10,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shell/apple/emulator-ios/emulator/ios_gamepad.h b/shell/apple/emulator-ios/emulator/ios_gamepad.h index 5e4a4abd1..420132e5b 100644 --- a/shell/apple/emulator-ios/emulator/ios_gamepad.h +++ b/shell/apple/emulator-ios/emulator/ios_gamepad.h @@ -23,7 +23,8 @@ #include #include "input/gamepad_device.h" #include "input/mouse.h" -#include "rend/gui.h" +#include "input/virtual_gamepad.h" +#include "ui/gui.h" enum IOSButton { IOS_BTN_A = 1, @@ -49,11 +50,6 @@ enum IOSButton { IOS_BTN_PADDLE3, IOS_BTN_PADDLE4, IOS_BTN_TOUCHPAD, - - IOS_BTN_UP_RIGHT, - IOS_BTN_UP_LEFT, - IOS_BTN_DOWN_LEFT, - IOS_BTN_DOWN_RIGHT, }; enum IOSAxis { @@ -139,14 +135,14 @@ class DefaultIOSMapping : public InputMapping class IOSGamepad : public GamepadDevice { public: - IOSGamepad(int port, GCController *controller) : GamepadDevice(port, "iOS"), gcController(controller) + IOSGamepad(int port, GCController *controller, int index) : GamepadDevice(port, "iOS"), gcController(controller) { set_maple_port(port); if (gcController.vendorName != nullptr) _name = [gcController.vendorName UTF8String]; else _name = "MFi Gamepad"; - //_unique_id = ? + _unique_id = "ios-" + std::to_string(index); INFO_LOG(INPUT, "iOS: Opened joystick %d: '%s'", port, _name.c_str()); loadMapping(); @@ -229,7 +225,7 @@ class IOSGamepad : public GamepadDevice [gcController.extendedGamepad.rightThumbstick.yAxis setValueChangedHandler:^(GCControllerAxisInput *axis, float value) { gamepad_axis_input(IOS_AXIS_RY, (int)std::roundf(-32767.f * value)); }]; - + hasAnalogStick = true; } else { @@ -459,8 +455,9 @@ class IOSGamepad : public GamepadDevice return; if (controller.extendedGamepad == nullptr && controller.gamepad == nullptr) return; - int port = std::min((int)controllers.size(), 3); - controllers[controller] = std::make_shared(port, controller); + int index = (int)controllers.size(); + int port = std::min(index, 3); + controllers[controller] = std::make_shared(port, controller, index); GamepadDevice::Register(controllers[controller]); } @@ -484,118 +481,28 @@ class IOSGamepad : public GamepadDevice static std::map> controllers; }; -class IOSVirtualGamepad : public GamepadDevice +class IOSVirtualGamepad : public VirtualGamepad { public: - IOSVirtualGamepad() : GamepadDevice(0, "iOS", false) { - _name = "Virtual Gamepad"; - _unique_id = "ios-virtual-gamepad"; - input_mapper = getDefaultMapping(); + IOSVirtualGamepad() : VirtualGamepad("iOS") { } - bool is_virtual_gamepad() override { return true; } - - std::shared_ptr getDefaultMapping() override { - return std::make_shared>(); - } - - bool gamepad_btn_input(u32 code, bool pressed) override + bool handleButtonInput(u32& state, u32 key, bool pressed) override { - if (pressed) - buttonState |= 1 << code; - else - buttonState &= ~(1 << code); - switch (code) + if (!pressed + || (key != DC_DPAD_UP && key != DC_DPAD_DOWN && key != DC_DPAD_LEFT && key != DC_DPAD_RIGHT)) + return false; + if (((state | key) & (DC_DPAD_UP | DC_DPAD_DOWN)) == (DC_DPAD_UP | DC_DPAD_DOWN) + || ((state | key) & (DC_DPAD_LEFT | DC_DPAD_RIGHT)) == (DC_DPAD_LEFT | DC_DPAD_RIGHT)) { - case IOS_BTN_L2: - gamepad_axis_input(IOS_AXIS_L2, pressed ? 0x7fff : 0); - if (settings.platform.isArcade()) - GamepadDevice::gamepad_btn_input(IOS_BTN_L1, pressed); // Z, btn5 - return true; - case IOS_BTN_R2: - if (!pressed && maple_port() >= 0 && maple_port() <= 3) - kcode[maple_port()] |= DC_DPAD2_UP | DC_BTN_D | DC_DPAD2_DOWN; - gamepad_axis_input(IOS_AXIS_R2, pressed ? 0x7fff : 0); - if (settings.platform.isArcade()) - GamepadDevice::gamepad_btn_input(IOS_BTN_Y, pressed); // Y, btn4 - return true; - default: - if ((buttonState & ((1 << IOS_BTN_UP) | (1 << IOS_BTN_DOWN))) == ((1 << IOS_BTN_UP) | (1 << IOS_BTN_DOWN)) - || (buttonState & ((1 << IOS_BTN_LEFT) | (1 << IOS_BTN_RIGHT))) == ((1 << IOS_BTN_LEFT) | (1 << IOS_BTN_RIGHT))) - { - GamepadDevice::gamepad_btn_input(IOS_BTN_UP, false); - GamepadDevice::gamepad_btn_input(IOS_BTN_DOWN, false); - GamepadDevice::gamepad_btn_input(IOS_BTN_LEFT, false); - GamepadDevice::gamepad_btn_input(IOS_BTN_RIGHT, false); - buttonState = 0; - gui_open_settings(); - return true; - } - if (settings.platform.isArcade() && maple_port() >= 0 && maple_port() <= 3) - { - u32& keycode = kcode[maple_port()]; - if ((buttonState & (1 << IOS_BTN_R2)) != 0) - { - switch (code) { - case IOS_BTN_A: - // RT + A -> D (coin) - keycode = pressed ? keycode & ~DC_BTN_D : keycode | DC_BTN_D; - break; - case IOS_BTN_B: - // RT + B -> Service - keycode = pressed ? keycode & ~DC_DPAD2_UP : keycode | DC_DPAD2_UP; - break; - case IOS_BTN_X: - // RT + X -> Test - keycode = pressed ? keycode & ~DC_DPAD2_DOWN : keycode | DC_DPAD2_DOWN; - break; - default: - break; - } - } - // arcade mapping: X -> btn2, Y -> btn3 - if (code == IOS_BTN_X) - code = IOS_BTN_R1; // C, btn2 - if (code == IOS_BTN_Y) - code = IOS_BTN_X; // btn3 - } - switch (code) - { - case IOS_BTN_UP_RIGHT: - GamepadDevice::gamepad_btn_input(IOS_BTN_UP, pressed); - code = IOS_BTN_RIGHT; - break; - case IOS_BTN_DOWN_RIGHT: - GamepadDevice::gamepad_btn_input(IOS_BTN_DOWN, pressed); - code = IOS_BTN_RIGHT; - break; - case IOS_BTN_DOWN_LEFT: - GamepadDevice::gamepad_btn_input(IOS_BTN_DOWN, pressed); - code = IOS_BTN_LEFT; - break; - case IOS_BTN_UP_LEFT: - GamepadDevice::gamepad_btn_input(IOS_BTN_UP, pressed); - code = IOS_BTN_LEFT; - break; - default: - break; - } - - return GamepadDevice::gamepad_btn_input(code, pressed); + gamepad_btn_input(DC_DPAD_UP, false); + gamepad_btn_input(DC_DPAD_DOWN, false); + gamepad_btn_input(DC_DPAD_LEFT, false); + gamepad_btn_input(DC_DPAD_RIGHT, false); + state = 0; + gui_open_settings(); + return true; } + return false; } - -private: - u32 buttonState = 0; -}; - -class IOSTouchMouse : public SystemMouse -{ -public: - IOSTouchMouse() : SystemMouse("iOS") - { - _unique_id = "ios_mouse"; - _name = "Touchscreen (Mouse)"; - loadMapping(); - } }; diff --git a/shell/apple/emulator-ios/emulator/ios_keyboard.h b/shell/apple/emulator-ios/emulator/ios_keyboard.h index a91ebbbf0..9b15b8f3b 100644 --- a/shell/apple/emulator-ios/emulator/ios_keyboard.h +++ b/shell/apple/emulator-ios/emulator/ios_keyboard.h @@ -11,7 +11,7 @@ class API_AVAILABLE(ios(14.0)) IOSKeyboard : public KeyboardDevice { public: - IOSKeyboard(int port, GCKeyboard *keyboard) : KeyboardDevice(port, "iOS", false), gcKeyboard(keyboard) + IOSKeyboard(int port, GCKeyboard *keyboard) : KeyboardDevice(port, "iOS"), gcKeyboard(keyboard) { set_maple_port(port); loadMapping(); diff --git a/shell/apple/emulator-ios/emulator/ios_main.mm b/shell/apple/emulator-ios/emulator/ios_main.mm index a602d3e07..0c1fc8c02 100644 --- a/shell/apple/emulator-ios/emulator/ios_main.mm +++ b/shell/apple/emulator-ios/emulator/ios_main.mm @@ -18,10 +18,9 @@ along with Flycast. If not, see . */ #import - +#include "types.h" +#include #include -#include -#include int darw_printf(const char* text,...) { @@ -40,28 +39,22 @@ int darw_printf(const char* text,...) void os_DoEvents() { } -void os_SetWindowText(const char* t) { -} - -void os_CreateWindow() { - if (getppid() != 1) { - /* Make LLDB ignore EXC_BAD_ACCESS for debugging */ - task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); - } +std::string os_Locale(){ + return [[[NSLocale preferredLanguages] objectAtIndex:0] UTF8String]; } -void UpdateInputState() { +std::string os_PrecomposedString(std::string string){ + return [[[NSString stringWithUTF8String:string.c_str()] precomposedStringWithCanonicalMapping] UTF8String]; } -void os_SetupInput() { -} -void os_TermInput() { -} +namespace hostfs +{ -std::string os_Locale(){ - return [[[NSLocale preferredLanguages] objectAtIndex:0] UTF8String]; +void saveScreenshot(const std::string& name, const std::vector& data) +{ + NSData* imageData = [NSData dataWithBytes:&data[0] length:data.size()]; + UIImage* pngImage = [UIImage imageWithData:imageData]; + UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil); } -std::string os_PrecomposedString(std::string string){ - return [[[NSString stringWithUTF8String:string.c_str()] precomposedStringWithCanonicalMapping] UTF8String]; } diff --git a/shell/apple/emulator-ios/plist.in b/shell/apple/emulator-ios/plist.in index 5d7330ccc..e86c2f7cd 100644 --- a/shell/apple/emulator-ios/plist.in +++ b/shell/apple/emulator-ios/plist.in @@ -70,6 +70,8 @@ NSMicrophoneUsageDescription Flycast requires microphone access to emulate the Dreamcast microphone + NSPhotoLibraryAddUsageDescription + Flycast can save screenshots to your Photo library. UISupportsDocumentBrowser LSSupportsOpeningDocumentsInPlace diff --git a/shell/apple/emulator-osx/MacOSXBundleInfo.plist.in b/shell/apple/emulator-osx/MacOSXBundleInfo.plist.in index d6c384b05..2b700acc6 100644 --- a/shell/apple/emulator-osx/MacOSXBundleInfo.plist.in +++ b/shell/apple/emulator-osx/MacOSXBundleInfo.plist.in @@ -2,6 +2,22 @@ + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + chd + gdi + cdi + cue + zip + 7z + + CFBundleTypeRole + Viewer + + CFBundleDevelopmentRegion English CFBundleExecutable diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Contents.json b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Contents.json index 6896aba8a..30071d265 100644 --- a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Contents.json @@ -13,7 +13,7 @@ "size" : "16x16" }, { - "filename" : "Icon-32.png", + "filename" : "Icon-33.png", "idiom" : "mac", "scale" : "1x", "size" : "32x32" @@ -53,6 +53,7 @@ "size" : "512x512" }, { + "filename" : "Icon-1024.png", "idiom" : "mac", "scale" : "2x", "size" : "512x512" diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-1024.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-1024.png new file mode 100644 index 000000000..f7ccb5da6 Binary files /dev/null and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-1024.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-128.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-128.png index 73c17ebb1..ebd0df393 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-128.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-128.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-16.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-16.png index 5def623a8..f87188c57 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-16.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-16.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-256.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-256.png index 3dea29e17..a0a3b52ec 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-256.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-256.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-32.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-32.png index e156ea91c..7a7b0b953 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-32.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-32.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-33.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-33.png new file mode 100644 index 000000000..7a7b0b953 Binary files /dev/null and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-33.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-512.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-512.png index ee5b3ca28..483165c48 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-512.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-512.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-64.png b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-64.png index 65249c05e..6110c272a 100644 Binary files a/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-64.png and b/shell/apple/emulator-osx/emulator-osx/Images.xcassets/AppIcon.appiconset/Icon-64.png differ diff --git a/shell/apple/emulator-osx/emulator-osx/SDLMain.h b/shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.h similarity index 83% rename from shell/apple/emulator-osx/emulator-osx/SDLMain.h rename to shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.h index c908cafa4..634c96b7e 100644 --- a/shell/apple/emulator-osx/emulator-osx/SDLMain.h +++ b/shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.h @@ -9,7 +9,7 @@ #import -@interface SDLMain : NSObject +@interface SDLApplicationDelegate : NSObject @end #endif /* _SDLMain_h_ */ diff --git a/shell/apple/emulator-osx/emulator-osx/SDLMain.mm b/shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.mm similarity index 78% rename from shell/apple/emulator-osx/emulator-osx/SDLMain.mm rename to shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.mm index 7f95808ee..0b2dd71d0 100644 --- a/shell/apple/emulator-osx/emulator-osx/SDLMain.mm +++ b/shell/apple/emulator-osx/emulator-osx/SDLApplicationDelegate.mm @@ -5,10 +5,11 @@ Feel free to customize this file to suit your needs */ #include -#include "SDLMain.h" +#include "SDLApplicationDelegate.h" +#include "emulator.h" #include /* for MAXPATHLEN */ #include -#include "rend/gui.h" +#include "ui/gui.h" #include "oslib/oslib.h" #ifdef USE_BREAKPAD @@ -39,11 +40,6 @@ - (void)setAppleMenu:(NSMenu *)menu; } #endif /* SDL_USE_CPS */ -static int gArgc; -static char **gArgv; -static BOOL gFinderLaunch; -static BOOL gCalledAppMainline = FALSE; - static NSString *getApplicationName(void) { const NSDictionary *dict; @@ -73,24 +69,68 @@ - (void)quitAction:(id)sender SDL_PushEvent(&event); } +- (void)undoAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0x1D, true); // Z + gui_keyboard_key(0x1D, false); + gui_keyboard_key(0xE3, false); +} + +- (void)redoAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0xE1, true); // Shift + gui_keyboard_key(0x1D, true); // Z + gui_keyboard_key(0x1D, false); + gui_keyboard_key(0xE1, false); + gui_keyboard_key(0xE3, false); +} + +- (void)cutAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0x1B, true); // X + gui_keyboard_key(0x1B, false); + gui_keyboard_key(0xE3, false); +} + +- (void)copyAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0x06, true); // C + gui_keyboard_key(0x06, false); + gui_keyboard_key(0xE3, false); +} + +- (void)pasteAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0x19, true); // V + gui_keyboard_key(0x19, false); + gui_keyboard_key(0xE3, false); +} + +- (void)selectAllAction:(id)sender +{ + gui_keyboard_key(0xE3, true); // Cmd + gui_keyboard_key(0x04, true); // A + gui_keyboard_key(0x04, false); + gui_keyboard_key(0xE3, false); +} + + @end /* The main class of the application, the application's delegate */ -@implementation SDLMain +@implementation SDLApplicationDelegate /* Set the working directory to the .app's parent directory */ -- (void) setupWorkingDirectory:(BOOL)shouldChdir +- (void) setupWorkingDirectory { - if (shouldChdir) + if([[NSProcessInfo processInfo] environment][@"PWD"] == NULL && [[[NSFileManager defaultManager] currentDirectoryPath] isEqualToString:@"/"]) { - char parentdir[MAXPATHLEN]; - CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url); - if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) { - chdir(parentdir); /* chdir to the binary app's parent */ - } - CFRelease(url); - CFRelease(url2); + chdir([[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] cStringUsingEncoding:NSUTF8StringEncoding]); } } @@ -146,12 +186,26 @@ static void setApplicationMenu(void) [menuItem setSubmenu:appleMenu]; [[NSApp mainMenu] addItem:menuItem]; + NSMenuItem *editMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + NSMenu *editMenu = [[NSMenu alloc] initWithTitle:@"Edit"]; + [editMenu addItemWithTitle:@"Undo" action:@selector(undoAction:) keyEquivalent:@"z"]; + [editMenu addItemWithTitle:@"Redo" action:@selector(redoAction:) keyEquivalent:@"Z"]; + [editMenu addItem:[NSMenuItem separatorItem]]; + [editMenu addItemWithTitle:@"Cut" action:@selector(cutAction:) keyEquivalent:@"x"]; + [editMenu addItemWithTitle:@"Copy" action:@selector(copyAction:) keyEquivalent:@"c"]; + [editMenu addItemWithTitle:@"Paste" action:@selector(pasteAction:) keyEquivalent:@"v"]; + [editMenu addItemWithTitle:@"Select All" action:@selector(selectAllAction:) keyEquivalent:@"a"]; + [editMenuItem setSubmenu:editMenu]; + [[NSApp mainMenu] addItem:editMenuItem]; + /* Tell the application object that this is now the application menu */ [NSApp setAppleMenu:appleMenu]; /* Finally give up our references to the objects */ [appleMenu release]; [menuItem release]; + [editMenuItem release]; + [editMenu release]; } /* Create a window menu */ @@ -209,7 +263,7 @@ static void setupHelpMenu(void) static void CustomApplicationMain (int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - SDLMain *sdlMain; + SDLApplicationDelegate *appDelegate; /* Ensure the application object is initialised */ [NSApplication sharedApplication]; @@ -232,13 +286,13 @@ static void CustomApplicationMain (int argc, char **argv) setupHelpMenu(); /* needed for help menu */ /* Create SDLMain and make it the app delegate */ - sdlMain = [[SDLMain alloc] init]; - [NSApp setDelegate:sdlMain]; + appDelegate = [[SDLApplicationDelegate alloc] init]; + [NSApp setDelegate:appDelegate]; /* Start the main event loop */ [NSApp run]; - [sdlMain release]; + [appDelegate release]; [pool release]; } @@ -273,34 +327,10 @@ static bool dumpCallback(const char *dump_dir, const char *minidump_id, void *co */ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { - const char *temparg; - size_t arglen; - char *arg; - char **newargv; - - if (!gFinderLaunch) /* MacOS is passing command line args. */ - return FALSE; - - if (gCalledAppMainline) /* app has started, ignore this document. */ - return FALSE; - - temparg = [filename UTF8String]; - arglen = SDL_strlen(temparg) + 1; - arg = (char *) SDL_malloc(arglen); - if (arg == NULL) - return FALSE; - - newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); - if (newargv == NULL) - { - SDL_free(arg); - return FALSE; - } - gArgv = newargv; - - SDL_strlcpy(arg, temparg, arglen); - gArgv[gArgc++] = arg; - gArgv[gArgc] = NULL; + dispatch_async(dispatch_get_main_queue(), ^(){ + gui_start_game([filename cStringUsingEncoding:NSUTF8StringEncoding]); + }); + return TRUE; } @@ -316,11 +346,9 @@ - (void) applicationDidFinishLaunching: (NSNotification *) note int status; /* Set the working directory to the .app's parent directory */ - [self setupWorkingDirectory:gFinderLaunch]; + [self setupWorkingDirectory]; - /* Hand off to main application code */ - gCalledAppMainline = TRUE; - status = SDL_main (gArgc, gArgv); + status = SDL_main(NULL, NULL); /* We're done, thank you for playing */ exit(status); @@ -391,23 +419,6 @@ - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString /* Main entry point to executable - should *not* be SDL_main! */ int main (int argc, char **argv) { - /* Copy the arguments into a global variable */ - /* This is passed if we are launched by double-clicking */ - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - gArgv = (char **) SDL_malloc(sizeof (char *) * 2); - gArgv[0] = argv[0]; - gArgv[1] = NULL; - gArgc = 1; - gFinderLaunch = YES; - } else { - int i; - gArgc = argc; - gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); - for (i = 0; i <= argc; i++) - gArgv[i] = argv[i]; - gFinderLaunch = NO; - } - if (getppid() != 1) { /* Make LLDB ignore EXC_BAD_ACCESS for debugging */ task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); diff --git a/shell/apple/emulator-osx/emulator-osx/osx-main.mm b/shell/apple/emulator-osx/emulator-osx/osx-main.mm index 7c1fc44fa..8c7c3a7ab 100644 --- a/shell/apple/emulator-osx/emulator-osx/osx-main.mm +++ b/shell/apple/emulator-osx/emulator-osx/osx-main.mm @@ -13,6 +13,7 @@ #include #include "types.h" +#include "cfg/option.h" #include "log/LogManager.h" #if defined(USE_SDL) #include "sdl/sdl.h" @@ -20,7 +21,7 @@ #include "stdclass.h" #include "oslib/oslib.h" #include "emulator.h" -#include "rend/mainui.h" +#include "ui/mainui.h" #include int darw_printf(const char* text, ...) @@ -33,7 +34,10 @@ int darw_printf(const char* text, ...) va_end(args); NSString* log = [NSString stringWithCString:temp encoding: NSUTF8StringEncoding]; - if (getenv("TERM") == NULL) //Xcode console does not support colors + NSDictionary* env = [[NSProcessInfo processInfo] environment]; + static bool isXcode = [env[@"OS_ACTIVITY_DT_MODE"] boolValue] || [env[@"COMMAND_MODE"] isEqualToString:@"unix2003"] || [env[@"TERM"] isEqualToString:@"dumb"]; + + if (isXcode) // Xcode console does not support colors { log = [log stringByReplacingOccurrencesOfString:@"\x1b[0m" withString:@""]; log = [log stringByReplacingOccurrencesOfString:@"\x1b[92m" withString:@"ℹ️ "]; @@ -45,50 +49,13 @@ int darw_printf(const char* text, ...) return 0; } -void os_SetWindowText(const char * text) { - puts(text); -} - void os_DoEvents() { -} - -void UpdateInputState() { #if defined(USE_SDL) - input_sdl_handle(); + NSMenuItem *editMenuItem = [[NSApp mainMenu] itemAtIndex:1]; + [editMenuItem setEnabled:SDL_IsTextInputActive()]; #endif } -void os_CreateWindow() { -#ifdef DEBUG - int ret = task_set_exception_ports( - mach_task_self(), - EXC_MASK_BAD_ACCESS, - MACH_PORT_NULL, - EXCEPTION_DEFAULT, - 0); - - if (ret != KERN_SUCCESS) { - printf("task_set_exception_ports: %s\n", mach_error_string(ret)); - } -#endif - sdl_window_create(); -} - -void os_SetupInput() -{ -#if defined(USE_SDL) - input_sdl_init(); -#endif -} - -void os_TermInput() -{ -#if defined(USE_SDL) - input_sdl_quit(); -#endif -} - -void common_linux_setup(); static int emu_flycast_init(); static void emu_flycast_term() @@ -139,13 +106,33 @@ static void emu_flycast_term() CFRelease(mainBundle); emu_flycast_init(); + + int boardId = cfgLoadInt("naomi", "BoardId", 0); + if (boardId > 0) + { + NSString *label = @"S"; // Slave + if (config::MultiboardSlaves == 2) // 1 = Single, 2 = Deluxe + { + switch (boardId) { + case 1: + label = @"C"; // Center + break; + case 2: + label = @"L"; // Left + break; + case 3: + label = @"R"; // Right + } + } + [[NSApp dockTile] setBadgeLabel:label]; + } + #ifdef USE_BREAKPAD auto async = std::async(std::launch::async, uploadCrashes, "/tmp"); #endif mainui_loop(); - sdl_window_destroy(); emu_flycast_term(); os_UninstallFaultHandler(); @@ -155,7 +142,7 @@ static void emu_flycast_term() static int emu_flycast_init() { LogManager::Init(); - common_linux_setup(); + os_InstallFaultHandler(); NSArray *arguments = [[NSProcessInfo processInfo] arguments]; unsigned long argc = [arguments count]; char **argv = (char **)malloc(argc * sizeof(char*)); @@ -174,6 +161,19 @@ static int emu_flycast_init() for (unsigned long i = 0; i < paramCount; i++) free(argv[i]); free(argv); + +#if defined(DEBUG) || defined(DEBUGFAST) + int ret = task_set_exception_ports( + mach_task_self(), + EXC_MASK_BAD_ACCESS, + MACH_PORT_NULL, + EXCEPTION_DEFAULT, + 0); + + if (ret != KERN_SUCCESS) { + printf("task_set_exception_ports: %s\n", mach_error_string(ret)); + } +#endif return rc; } @@ -202,3 +202,69 @@ void os_RunInstance(int argc, const char *argv[]) die("execv failed"); } } + +#import +#import +#include "rend/vulkan/vulkan.h" +static SyphonOpenGLServer* syphonGLServer; +static SyphonMetalServer* syphonMtlServer; + +void os_VideoRoutingPublishFrameTexture(GLuint texID, GLuint texTarget, float w, float h) +{ + if (syphonGLServer == NULL) + { + int boardID = cfgLoadInt("naomi", "BoardId", 0); + syphonGLServer = [[SyphonOpenGLServer alloc] initWithName:[NSString stringWithFormat:(boardID == 0 ? @"Video Content" : @"Video Content - %d"), boardID] context:[SDL_GL_GetCurrentContext() CGLContextObj] options:nil]; + } + CGLLockContext([syphonGLServer context]); + [syphonGLServer publishFrameTexture:texID textureTarget:texTarget imageRegion:NSMakeRect(0, 0, w, h) textureDimensions:NSMakeSize(w, h) flipped:NO]; + CGLUnlockContext([syphonGLServer context]); +} + +void os_VideoRoutingTermGL() +{ + [syphonGLServer stop]; + [syphonGLServer release]; + syphonGLServer = NULL; +} + +void os_VideoRoutingPublishFrameTexture(const vk::Device& device, const vk::Image& image, const vk::Queue& queue, float x, float y, float w, float h) +{ + if (syphonMtlServer == NULL) + { + vk::ExportMetalDeviceInfoEXT deviceInfo; + auto objectsInfo = vk::ExportMetalObjectsInfoEXT(&deviceInfo); + device.exportMetalObjectsEXT(&objectsInfo); + + int boardID = cfgLoadInt("naomi", "BoardId", 0); + syphonMtlServer = [[SyphonMetalServer alloc] initWithName:[NSString stringWithFormat:(boardID == 0 ? @"Video Content" : @"Video Content - %d"), boardID] device:deviceInfo.mtlDevice options:nil]; + } + + auto textureInfo = vk::ExportMetalTextureInfoEXT(image); + auto commandInfo = vk::ExportMetalCommandQueueInfoEXT(queue); + commandInfo.pNext = &textureInfo; + auto objectsInfo = vk::ExportMetalObjectsInfoEXT(&commandInfo); + device.exportMetalObjectsEXT(&objectsInfo); + + auto commandBuffer = [commandInfo.mtlCommandQueue commandBufferWithUnretainedReferences]; + [syphonMtlServer publishFrameTexture:textureInfo.mtlTexture onCommandBuffer:commandBuffer imageRegion:NSMakeRect(x, y, w, h) flipped:YES]; + [commandBuffer commit]; +} + +void os_VideoRoutingTermVk() +{ + [syphonMtlServer stop]; + [syphonMtlServer release]; + syphonMtlServer = NULL; +} + +namespace hostfs +{ + +std::string getScreenshotsPath() +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSPicturesDirectory, NSUserDomainMask, YES); + return [[paths objectAtIndex:0] UTF8String]; +} + +} diff --git a/shell/apple/generate_xcode_project.command b/shell/apple/generate_xcode_project.command index 3843519ce..f96ea65c6 100755 --- a/shell/apple/generate_xcode_project.command +++ b/shell/apple/generate_xcode_project.command @@ -6,7 +6,11 @@ echo "2) iOS" read -p "Choose your target platform: " x if [ $x -eq 2 ]; then - option="-DCMAKE_SYSTEM_NAME=iOS" + if [ "$(uname -m)" = "arm64" ]; then + option="-DCMAKE_SYSTEM_NAME=iOS" + else + option="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" + fi lldbinitfolder="emulator-ios" echo 'Building iOS xcodeproj for debugging' echo 'Remove CODE_SIGNING_ALLOWED=NO in Build Settings if you are using your Apple Developer Certificate for signing' @@ -21,7 +25,7 @@ if [[ -z "${VULKAN_SDK}" ]]; then read -p "Type y to install Vulkan SDK: " v if [ $v == "y" ]; then curl https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.dmg -o vulkan-sdk.dmg - hdiutil attach ./vulkan-sdk.dmg + hdiutil attach ./vulkan-sdk.dmg -mountpoint /Volumes/VulkanSDK /Volumes/VulkanSDK/InstallVulkan.app/Contents/MacOS/InstallVulkan --root $HOME/VulkanSDK --accept-licenses --default-answer --confirm-command install hdiutil detach /Volumes/VulkanSDK rm ./vulkan-sdk.dmg @@ -31,8 +35,8 @@ if [[ -z "${VULKAN_SDK}" ]]; then fi fi -cmake -B build -DCMAKE_BUILD_TYPE=Release $option -DCMAKE_XCODE_GENERATE_SCHEME=YES -G "Xcode" +cmake -B build -DCMAKE_BUILD_TYPE=Release $option -DUSE_BREAKPAD=NO -DCMAKE_XCODE_GENERATE_SCHEME=YES -G "Xcode" nl=$'\n' -sed -i '' -E "s/launchStyle/customLLDBInitFile = \"\$(SRCROOT)\/shell\/apple\/\\${lldbinitfolder}\/LLDBInitFile\"\\${nl}launchStyle/g" build/flycast.xcodeproj/xcshareddata/xcschemes/flycast.xcscheme +/usr/bin/sed -i '' -E "s/launchStyle/customLLDBInitFile = \"\$(SRCROOT)\/shell\/apple\/\\${lldbinitfolder}\/LLDBInitFile\"\\${nl}launchStyle/g" build/flycast.xcodeproj/xcshareddata/xcschemes/flycast.xcscheme open build/flycast.xcodeproj diff --git a/shell/apple/icons/flycast-boot-peek.png b/shell/apple/icons/flycast-boot-peek.png new file mode 100644 index 000000000..ef5b393a5 Binary files /dev/null and b/shell/apple/icons/flycast-boot-peek.png differ diff --git a/shell/apple/icons/flycast-boot-peek.svg b/shell/apple/icons/flycast-boot-peek.svg new file mode 100644 index 000000000..db75e318a --- /dev/null +++ b/shell/apple/icons/flycast-boot-peek.svg @@ -0,0 +1,463 @@ + + + + + + image/svg+xml + + Icon-App-Name.iconset/icon_512x512@2x + + + + + Icon-App-Name.iconset/icon_512x512@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/apple/icons/flycast-menu-light-ios.png b/shell/apple/icons/flycast-menu-light-ios.png new file mode 100644 index 000000000..2d70e3382 Binary files /dev/null and b/shell/apple/icons/flycast-menu-light-ios.png differ diff --git a/shell/apple/icons/flycast-menu-light-ios.svg b/shell/apple/icons/flycast-menu-light-ios.svg new file mode 100644 index 000000000..c8f97af6a --- /dev/null +++ b/shell/apple/icons/flycast-menu-light-ios.svg @@ -0,0 +1,620 @@ + + + + + + image/svg+xml + + Icon-App-Name.iconset/icon_512x512@2x + + + + + Icon-App-Name.iconset/icon_512x512@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/apple/icons/flycast-menu-light-peek.png b/shell/apple/icons/flycast-menu-light-peek.png new file mode 100644 index 000000000..f7ccb5da6 Binary files /dev/null and b/shell/apple/icons/flycast-menu-light-peek.png differ diff --git a/shell/apple/icons/flycast-menu-light-peek.svg b/shell/apple/icons/flycast-menu-light-peek.svg new file mode 100644 index 000000000..9772ac9b0 --- /dev/null +++ b/shell/apple/icons/flycast-menu-light-peek.svg @@ -0,0 +1,658 @@ + + + + + + image/svg+xml + + Icon-App-Name.iconset/icon_512x512@2x + + + + + Icon-App-Name.iconset/icon_512x512@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/apple/icons/flycast-secret-peek.png b/shell/apple/icons/flycast-secret-peek.png new file mode 100644 index 000000000..0eee5e8ae Binary files /dev/null and b/shell/apple/icons/flycast-secret-peek.png differ diff --git a/shell/apple/icons/flycast-secret-peek.svg b/shell/apple/icons/flycast-secret-peek.svg new file mode 100644 index 000000000..5cb8b4703 --- /dev/null +++ b/shell/apple/icons/flycast-secret-peek.svg @@ -0,0 +1,828 @@ + + + + + + image/svg+xml + + Icon-App-Name.iconset/icon_512x512@2x + + + + + Icon-App-Name.iconset/icon_512x512@2x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shell/cmake/CMakeRC.cmake b/shell/cmake/CMakeRC.cmake index 5cad70537..6a5147ae3 100644 --- a/shell/cmake/CMakeRC.cmake +++ b/shell/cmake/CMakeRC.cmake @@ -34,7 +34,7 @@ endif() set(_version 2.0.0) -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.12) include(CMakeParseArguments) if(COMMAND cmrc_add_resource_library) diff --git a/shell/imgs/screenshot1.png b/shell/imgs/screenshot1.png index bbc14ae8b..2ef39f217 100644 Binary files a/shell/imgs/screenshot1.png and b/shell/imgs/screenshot1.png differ diff --git a/shell/imgs/screenshot2.png b/shell/imgs/screenshot2.png index 24dcd1116..ec26b6d8e 100644 Binary files a/shell/imgs/screenshot2.png and b/shell/imgs/screenshot2.png differ diff --git a/shell/imgs/screenshot3.png b/shell/imgs/screenshot3.png index abcf6dfc0..9c99d5c9e 100644 Binary files a/shell/imgs/screenshot3.png and b/shell/imgs/screenshot3.png differ diff --git a/shell/imgs/screenshot4.png b/shell/imgs/screenshot4.png index c833ac1b4..f72393c5b 100644 Binary files a/shell/imgs/screenshot4.png and b/shell/imgs/screenshot4.png differ diff --git a/shell/libretro/audiostream.cpp b/shell/libretro/audiostream.cpp index b27d7e495..197093b54 100644 --- a/shell/libretro/audiostream.cpp +++ b/shell/libretro/audiostream.cpp @@ -16,7 +16,7 @@ */ #include "types.h" #include "cfg/option.h" -#include "oslib/audiostream.h" +#include "audio/audiostream.h" #include "emulator.h" #include diff --git a/shell/libretro/libretro.cpp b/shell/libretro/libretro.cpp index 708c133cc..cc80eac56 100644 --- a/shell/libretro/libretro.cpp +++ b/shell/libretro/libretro.cpp @@ -27,6 +27,8 @@ #include #include #include "nswitch.h" +#elif defined(__linux__) || defined(__FreeBSD__) +#include #endif #include @@ -49,27 +51,31 @@ #include "emulator.h" #include "hw/sh4/sh4_mem.h" #include "hw/sh4/sh4_sched.h" -#include "hw/sh4/dyna/blockmanager.h" #include "keyboard_map.h" #include "hw/maple/maple_cfg.h" #include "hw/maple/maple_if.h" -#include "hw/maple/maple_cfg.h" -#include "hw/pvr/spg.h" +#include "hw/pvr/pvr_regs.h" +#include "hw/pvr/Renderer_if.h" #include "hw/naomi/naomi_cart.h" #include "hw/naomi/card_reader.h" -#include "imgread/common.h" #include "LogManager.h" #include "cheats.h" #include "rend/osd.h" #include "cfg/option.h" #include "version.h" -#include "rend/transform_matrix.h" +#include "oslib/oslib.h" constexpr char slash = path_default_slash_c(); #define RETRO_DEVICE_TWINSTICK RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 1 ) #define RETRO_DEVICE_TWINSTICK_SATURN RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 2 ) #define RETRO_DEVICE_ASCIISTICK RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 3 ) +#define RETRO_DEVICE_MARACAS RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 4 ) +#define RETRO_DEVICE_FISHING RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 5 ) +#define RETRO_DEVICE_POPNMUSIC RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 6 ) +#define RETRO_DEVICE_RACING RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 7 ) +#define RETRO_DEVICE_DENSHA RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 8 ) +#define RETRO_DEVICE_FULL_CONTROLLER RETRO_DEVICE_SUBCLASS( RETRO_DEVICE_JOYPAD, 9 ) #define RETRO_ENVIRONMENT_RETROARCH_START_BLOCK 0x800000 @@ -120,6 +126,9 @@ static bool platformIsDreamcast = true; static bool platformIsArcade = false; static bool threadedRenderingEnabled = true; static bool oitEnabled = false; +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) +static bool perPixelChecked = false; +#endif static bool autoSkipFrameEnabled = false; #ifdef _OPENMP static bool textureUpscaleEnabled = false; @@ -128,14 +137,14 @@ static bool vmuScreenSettingsShown = true; static bool lightgunSettingsShown = true; u32 kcode[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}; -u8 rt[4]; -u8 lt[4]; -u8 lt2[4]; -u8 rt2[4]; +u16 rt[4]; +u16 lt[4]; +u16 lt2[4]; +u16 rt2[4]; u32 vks[4]; -s8 joyx[4], joyy[4]; -s8 joyrx[4], joyry[4]; -s8 joy3x[4], joy3y[4]; +s16 joyx[4], joyy[4]; +s16 joyrx[4], joyry[4]; +s16 joy3x[4], joy3y[4]; // Mouse buttons // bit 0: Button C // bit 1: Right button (B) @@ -153,7 +162,6 @@ std::mutex relPosMutex; s32 mo_x_abs[4]; s32 mo_y_abs[4]; -static bool enable_purupuru = true; static u32 vib_stop_time[4]; static double vib_strength[4]; static double vib_delta[4]; @@ -189,7 +197,6 @@ static retro_rumble_interface rumble; static void refresh_devices(bool first_startup); static void init_disk_control_interface(); static bool read_m3u(const char *file); -void gui_display_notification(const char *msg, int duration); static void updateVibration(u32 port, float power, float inclination, u32 durationMs); static std::string game_data; @@ -198,7 +205,7 @@ static char game_dir[1024]; char game_dir_no_slash[1024]; char vmu_dir_no_slash[PATH_MAX]; char content_name[PATH_MAX]; -static char g_roms_dir[PATH_MAX]; +char g_roms_dir[PATH_MAX]; static std::mutex mtx_serialization; static bool gl_ctx_resetting = false; static bool is_dupe; @@ -214,7 +221,6 @@ static std::vector disk_paths; static std::vector disk_labels; static bool disc_tray_open = false; -void UpdateInputState(); static bool set_variable_visibility(void); void retro_set_video_refresh(retro_video_refresh_t cb) @@ -283,13 +289,18 @@ void retro_set_environment(retro_environment_t cb) { "Twin Stick", RETRO_DEVICE_TWINSTICK }, { "Saturn Twin-Stick", RETRO_DEVICE_TWINSTICK_SATURN }, { "Pointer", RETRO_DEVICE_POINTER }, - { 0 }, + { "Maracas", RETRO_DEVICE_MARACAS }, + { "Fishing Controller", RETRO_DEVICE_FISHING }, + { "Pop'n Music", RETRO_DEVICE_POPNMUSIC }, + { "Race Controller", RETRO_DEVICE_RACING }, + { "Densha de Go!", RETRO_DEVICE_DENSHA }, + { "Full Controller", RETRO_DEVICE_FULL_CONTROLLER }, }; static const struct retro_controller_info ports[] = { - { ports_default, 8 }, - { ports_default, 8 }, - { ports_default, 8 }, - { ports_default, 8 }, + { ports_default, std::size(ports_default) }, + { ports_default, std::size(ports_default) }, + { ports_default, std::size(ports_default) }, + { ports_default, std::size(ports_default) }, { 0 }, }; environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); @@ -339,6 +350,11 @@ void retro_init() if (!addrspace::reserve()) ERROR_LOG(VMEM, "Cannot reserve memory space"); +#if defined(__linux__) || defined(__FreeBSD__) + // SDL evdev keyboard driver installs a SIGSEGV signal handler by default, which replaces flycast's one. + // Make sure to avoid this if SDL is initialized after the core (which happens). + setenv("SDL_NO_SIGNAL_HANDLERS", "1", 1); +#endif os_InstallFaultHandler(); MapleConfigMap::UpdateVibration = updateVibration; @@ -406,6 +422,9 @@ static bool set_variable_visibility(void) option_display.visible = platformIsArcade; option_display.key = CORE_OPTION_NAME "_allow_service_buttons"; environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + option_display.visible = settings.platform.isNaomi(); + option_display.key = CORE_OPTION_NAME "_force_freeplay"; + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); // Show/hide Dreamcast options option_display.visible = platformIsDreamcast; @@ -423,10 +442,12 @@ static bool set_variable_visibility(void) environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); option_display.key = CORE_OPTION_NAME "_force_wince"; environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); - option_display.key = CORE_OPTION_NAME "_enable_purupuru"; - environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); option_display.key = CORE_OPTION_NAME "_per_content_vmus"; environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + option_display.key = CORE_OPTION_NAME "_dc_32mb_mod"; + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + option_display.key = CORE_OPTION_NAME "_vmu_sound"; + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); option_display.visible = platformIsDreamcast || settings.platform.isAtomiswave(); option_display.key = CORE_OPTION_NAME "_emulate_bba"; environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); @@ -513,7 +534,7 @@ static bool set_variable_visibility(void) bool textureUpscaleWasEnabled = textureUpscaleEnabled; textureUpscaleEnabled = false; var.key = CORE_OPTION_NAME "_texupscale"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && strcmp(var.value, "off")) + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && strcmp(var.value, "1")) textureUpscaleEnabled = true; if (first_run || (textureUpscaleEnabled != textureUpscaleWasEnabled)) @@ -543,6 +564,37 @@ static bool set_variable_visibility(void) updated = true; } + // Show/hide expansion slots options + if (devices_need_refresh) + { + for (int i = 0; i < 4; i++) + { + char key[64] = {0}; + option_display.key = key; + + // Show expansion slot 1 options only for DC with these devices + option_display.visible = platformIsDreamcast + && (config::MapleMainDevices[i] == MDT_SegaController + || config::MapleMainDevices[i] == MDT_LightGun + || config::MapleMainDevices[i] == MDT_TwinStick + || config::MapleMainDevices[i] == MDT_AsciiStick + || config::MapleMainDevices[i] == MDT_RacingController + || config::MapleMainDevices[i] == MDT_SegaControllerXL); + + snprintf(key, sizeof(key), CORE_OPTION_NAME "_device_port%d_slot1", i + 1); + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + + // Only the regular controller (and the XL version) has 2 expansion slots + option_display.visible = platformIsDreamcast + && (config::MapleMainDevices[i] == MDT_SegaController || config::MapleMainDevices[i] == MDT_SegaControllerXL); + + snprintf(key, sizeof(key), CORE_OPTION_NAME "_device_port%d_slot2", i + 1); + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + } + + updated = true; + } + // If categories are supported, no further action is required if (categoriesSupported) return updated; @@ -599,6 +651,9 @@ static bool set_variable_visibility(void) { option_display.visible = lightgunSettingsShown; + option_display.key = CORE_OPTION_NAME "_lightgun_crosshair_size_scaling"; + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display); + for (unsigned i = 0; i < 4; i++) { char key[256]; @@ -629,7 +684,7 @@ static void setGameGeometry(retro_game_geometry& geometry) void setAVInfo(retro_system_av_info& avinfo) { double sample_rate = 44100.0; - double fps = SPG_CONTROL.NTSC ? 59.94 : SPG_CONTROL.PAL ? 50.0 : 60.0; + double fps = SPG_CONTROL.isNTSC() ? 59.94 : SPG_CONTROL.isPAL() ? 50.0 : 60.0; setGameGeometry(avinfo.geometry); avinfo.timing.sample_rate = sample_rate; @@ -686,6 +741,7 @@ static void update_variables(bool first_startup) bool prevRotateScreen = rotate_screen; bool prevDetectVsyncSwapInterval = libretro_detect_vsync_swap_interval; bool emulateBba = config::EmulateBBA; + MapleDeviceType MapleExpansionDevicesPrev[2] = { MDT_None, MDT_None }; config::Settings::instance().setRetroEnvironment(environ_cb); config::Settings::instance().setOptionDefinitions(option_defs_us); config::Settings::instance().load(false); @@ -843,25 +899,6 @@ static void update_variables(bool first_startup) } } - var.key = CORE_OPTION_NAME "_enable_purupuru"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) - { - if (enable_purupuru != (strcmp("enabled", var.value) == 0) && settings.platform.isConsole()) - { - enable_purupuru = strcmp("enabled", var.value) == 0; - for (int i = 0; i < MAPLE_PORTS; i++) { - if (config::MapleMainDevices[i] == MDT_SegaController) - config::MapleExpansionDevices[i][1] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - else if (config::MapleMainDevices[i] == MDT_LightGun || config::MapleMainDevices[i] == MDT_TwinStick - || config::MapleMainDevices[i] == MDT_AsciiStick) - config::MapleExpansionDevices[i][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - } - - if (!first_startup) - maple_ReconnectDevices(); - } - } - var.key = CORE_OPTION_NAME "_analog_stick_deadzone"; var.value = NULL; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) @@ -894,12 +931,68 @@ static void update_variables(bool first_startup) else allow_service_buttons = false; + var.key = CORE_OPTION_NAME "_lightgun_crosshair_size_scaling"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + lightgun_crosshair_size = (float)LIGHTGUN_CROSSHAIR_SIZE * std::stof(var.value) / 100.f; + else + lightgun_crosshair_size = (float)LIGHTGUN_CROSSHAIR_SIZE; + char key[256]; key[0] = '\0'; var.key = key ; for (int i = 0 ; i < 4 ; i++) { + if (!first_startup && settings.platform.isConsole()) + { + MapleExpansionDevicesPrev[0] = config::MapleExpansionDevices[i][0]; + MapleExpansionDevicesPrev[1] = config::MapleExpansionDevices[i][1]; + + // Check slot options for these devices only, anything else has no slot + if (config::MapleMainDevices[i] == MDT_SegaController + || config::MapleMainDevices[i] == MDT_LightGun + || config::MapleMainDevices[i] == MDT_TwinStick + || config::MapleMainDevices[i] == MDT_AsciiStick + || config::MapleMainDevices[i] == MDT_RacingController + || config::MapleMainDevices[i] == MDT_SegaControllerXL) + { + for (int slot = 0; slot < 2; slot++) + { + // Only regular controller has a 2nd slot + if (slot == 1 && config::MapleMainDevices[i] != MDT_SegaController && config::MapleMainDevices[i] != MDT_SegaControllerXL) + { + config::MapleExpansionDevices[i][1] = MDT_None; + continue; + } + + snprintf(key, sizeof(key), CORE_OPTION_NAME "_device_port%d_slot%d", i + 1, slot + 1); + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (!strcmp("VMU", var.value)) + config::MapleExpansionDevices[i][slot] = MDT_SegaVMU; + else if (!strcmp("Purupuru", var.value)) + config::MapleExpansionDevices[i][slot] = MDT_PurupuruPack; + else if (!strcmp("None", var.value)) + config::MapleExpansionDevices[i][slot] = MDT_None; + } + else if (slot == 0) // Default to VMU in case the above is false somehow + config::MapleExpansionDevices[i][0] = MDT_SegaVMU; + else if (slot == 1) // Default to Purupuru + config::MapleExpansionDevices[i][1] = MDT_PurupuruPack; + } + } + else + { + config::MapleExpansionDevices[i][0] = MDT_None; + config::MapleExpansionDevices[i][1] = MDT_None; + } + + if (MapleExpansionDevicesPrev[0] != config::MapleExpansionDevices[i][0] + || MapleExpansionDevicesPrev[1] != config::MapleExpansionDevices[i][1]) + devices_need_refresh = true; + } + lightgun_params[i].offscreen = true; lightgun_params[i].x = 0; lightgun_params[i].y = 0; @@ -930,7 +1023,7 @@ static void update_variables(bool first_startup) | 0xff000000; vmu_lcd_status[i * 2] = false; - vmu_lcd_changed[i * 2] = true; + vmuLastChanged[i * 2] = getTimeMs(); vmu_screen_params[i].vmu_screen_position = UPPER_LEFT; vmu_screen_params[i].vmu_screen_size_mult = 1; vmu_screen_params[i].vmu_pixel_on_R = VMU_SCREEN_COLOR_MAP[VMU_DEFAULT_ON].r; @@ -943,7 +1036,8 @@ static void update_variables(bool first_startup) snprintf(key, sizeof(key), CORE_OPTION_NAME "_vmu%d_screen_display", i+1); - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && !strcmp("enabled", var.value) ) + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value && !strcmp("enabled", var.value) + && config::MapleExpansionDevices[i][0] == MDT_SegaVMU) vmu_lcd_status[i * 2] = true; snprintf(key, sizeof(key), CORE_OPTION_NAME "_vmu%d_screen_position", i+1); @@ -1083,7 +1177,7 @@ void retro_run() emu.start(); poll_cb(); - UpdateInputState(); + os_UpdateInputState(); bool fastforward = false; if (environ_cb(RETRO_ENVIRONMENT_GET_FASTFORWARDING, &fastforward)) settings.input.fastForwardMode = fastforward; @@ -1103,7 +1197,7 @@ void retro_run() } } catch (const FlycastException& e) { ERROR_LOG(COMMON, "%s", e.what()); - gui_display_notification(e.what(), 5000); + os_notify(e.what(), 5000); environ_cb(RETRO_ENVIRONMENT_SHUTDOWN, NULL); } @@ -1128,7 +1222,7 @@ static bool loadGame() emu.loadGame(game_data.c_str()); } catch (const FlycastException& e) { ERROR_LOG(BOOT, "%s", e.what()); - gui_display_notification(e.what(), 5000); + os_notify(e.what(), 5000); retro_unload_game(); return false; } @@ -1157,6 +1251,42 @@ void retro_reset() emu.start(); } +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) +void check_per_pixel_opt(void) +{ + // Check if per-pixel is supported, if not we hide the option + if (!GraphicsContext::Instance()->hasPerPixel()) + { + for (unsigned i = 0; option_defs_us[i].key != NULL; i++) + { + // Looking for the alpha sorting core option... + if (!strcmp(option_defs_us[i].key, CORE_OPTION_NAME "_alpha_sorting")) + { + for (unsigned j = 0; option_defs_us[i].values[j].value != NULL; j++) + { + // ... then for the per-pixel choice... + if (!strcmp(option_defs_us[i].values[j].value, "per-pixel (accurate)")) + { + // ... null it out... + option_defs_us[i].values[j] = { NULL, NULL }; + + // ... and finally refresh core options. + bool optionCategoriesSupported = false; + libretro_set_core_options(environ_cb, &optionCategoriesSupported); + categoriesSupported |= optionCategoriesSupported; + + break; + } + } + break; + } + } + NOTICE_LOG(RENDERER, "Current renderer does not support 'Per-Pixel' Alpha Sorting."); + } + perPixelChecked = true; +} +#endif + #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) static void context_reset() { @@ -1167,6 +1297,10 @@ static void context_reset() rend_term_renderer(); theGLContext.init(); rend_init_renderer(); +#ifdef HAVE_OIT + if (!perPixelChecked) + check_per_pixel_opt(); +#endif } static void context_destroy() @@ -1195,7 +1329,7 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) { /* JOYPAD_B */ DC_BTN_A, /* JOYPAD_Y */ DC_BTN_X, - /* JOYPAD_SELECT */ 0, + /* JOYPAD_SELECT */ DC_BTN_D, /* JOYPAD_START */ DC_BTN_START, /* JOYPAD_UP */ DC_DPAD_UP, /* JOYPAD_DOWN */ DC_DPAD_DOWN, @@ -1203,6 +1337,8 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) /* JOYPAD_RIGHT */ DC_DPAD_RIGHT, /* JOYPAD_A */ DC_BTN_B, /* JOYPAD_X */ DC_BTN_Y, + /* JOYPAD_L */ DC_BTN_C, + /* JOYPAD_R */ DC_BTN_Z, }; static const uint32_t dc_lg_joymap[] = @@ -1296,6 +1432,26 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) /* LIGHTGUN_RIGHT */ NAOMI_RIGHT_KEY, }; + static const uint32_t systemsp_joymap[] = + { + /* JOYPAD_B */ DC_BTN_A, + /* JOYPAD_Y */ DC_BTN_C, + /* JOYPAD_SELECT */ DC_BTN_D, // coin + /* JOYPAD_START */ DC_BTN_START, + /* JOYPAD_UP */ DC_DPAD_UP, + /* JOYPAD_DOWN */ DC_DPAD_DOWN, + /* JOYPAD_LEFT */ DC_DPAD_LEFT, + /* JOYPAD_RIGHT */ DC_DPAD_RIGHT, + /* JOYPAD_A */ DC_BTN_B, + /* JOYPAD_X */ 0, + /* JOYPAD_L */ 0, + /* JOYPAD_R */ 0, + /* JOYPAD_L2 */ 0, + /* JOYPAD_R2 */ 0, + /* JOYPAD_L3 */ DC_DPAD2_DOWN, // test + /* JOYPAD_R3 */ DC_DPAD2_UP, // service + }; + const uint32_t *joymap; size_t joymap_size; @@ -1354,6 +1510,11 @@ static uint32_t map_gamepad_button(unsigned device, unsigned id) } break; + case DC_PLATFORM_SYSTEMSP: + joymap = systemsp_joymap; + joymap_size = std::size(systemsp_joymap); + break; + default: return 0; } @@ -1405,7 +1566,7 @@ static const char *get_axis_name(unsigned index, const char *default_name) static void set_input_descriptors() { - struct retro_input_descriptor desc[22 * 4 + 1]; + struct retro_input_descriptor desc[100]; int descriptor_index = 0; if (settings.platform.isArcade()) { @@ -1540,40 +1701,40 @@ static void set_input_descriptors() desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }; desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L Trigger" }; desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R Trigger" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Analog X" }; desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Analog Y" }; break; case MDT_TwinStick: - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "L-Stick Left" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_UP, "L-Stick Up" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "L-Stick Down" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "L-Stick Right" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_B, "R-Stick Down" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_A, "R-Stick Right" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_X, "R-Stick Up" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_Y, "R-Stick Left" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_L, "L Turbo" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_R, "R Turbo" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L Trigger" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R Trigger" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Special" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "L-Stick Left" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "L-Stick Up" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "L-Stick Down" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "L-Stick Right" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "R-Stick Down" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "R-Stick Right" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "R-Stick Up" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "R-Stick Left" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L Turbo" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R Turbo" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L Trigger" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R Trigger" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Special" }; break; case MDT_AsciiStick: - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Stick Left" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Stick Up" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Stick Down" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Stick Right" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_X, "Y" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_L, "C" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_R, "Z" }; - desc[descriptor_index++] = { i, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Stick Left" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Stick Up" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Stick Down" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Stick Right" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Y" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "C" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Z" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; break; case MDT_LightGun: @@ -1586,6 +1747,96 @@ static void set_input_descriptors() desc[descriptor_index++] = { i, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_A, "B" }; break; + case MDT_MaracasController: + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A (R-Shake)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B (L-Shake)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "C (L-Button)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "D (R-Lost)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Z (R-Lost)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start (R-Button)" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Maraca 1 X pos." }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Maraca 1 Y pos." }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Maraca 2 X pos." }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Maraca 2 Y pos." }; + break; + + case MDT_FishingController: + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Y" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Reel handle output" }; // A1: Analog lever + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "Acc. sensor Z" }; // A2: Acc. sensor Z + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Analog X (L-R)" }; // A3: Analog key + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Analog Y (U-D)" }; // A4: Analog key + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Acc. sensor X" }; // A5: Acc. sensor X + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Acc. sensor Y" }; // A6: Acc. sensor Y + break; + + case MDT_PopnMusicController: + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "C" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "E" }; // A + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "F" }; // X + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "G" }; // B + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "H" }; // Y + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "I" }; // C + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + break; + + case MDT_RacingController: + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "+" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "-" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R-Axis" }; // A1: Analog lever + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L-Axis" }; // A2: Analog lever + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Wheel (L-R)" }; // A3: Analog key, also La, Ra + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Accelerator" }; // A5: Accelerator? + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Brake" }; // A6: Brake? + break; + + case MDT_DenshaDeGoController: + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Brake bit 3" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Brake bit 2" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Brake bit 1" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "Brake bit 0" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Master Control bit 2" }; // X + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Master Control bit 1" }; // Y + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Master Control bit 0" }; // Z + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "C" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "D" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + break; + + case MDT_SegaControllerXL: + // No DPad2 + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "A" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "B" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "Y" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "X" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "C" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "Z" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT,"D" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "L Trigger" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "R Trigger" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Analog X" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Analog Y" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "R. Analog X" }; + desc[descriptor_index++] = { i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "R. Analog Y" }; + break; + default: break; } @@ -1635,6 +1886,8 @@ static void retro_vk_context_reset() theVulkanContext.init((retro_hw_render_interface_vulkan *)vulkan); rend_term_renderer(); rend_init_renderer(); + if (!perPixelChecked) + check_per_pixel_opt(); } static void retro_vk_context_destroy() @@ -1769,6 +2022,8 @@ static void dx11_context_reset() else if (config::RendererType != RenderType::DirectX11_OIT) config::RendererType = RenderType::DirectX11; rend_init_renderer(); + if (!perPixelChecked) + check_per_pixel_opt(); } static void dx11_context_destroy() @@ -1808,7 +2063,7 @@ bool retro_load_game(const struct retro_game_info *game) if (environ_cb(RETRO_ENVIRONMENT_GET_JIT_CAPABLE, &can_jit) && !can_jit) { // jit is required both for performance and for audio. trying to run // without the jit will cause a crash. - gui_display_notification("Cannot run without JIT", 5000); + os_notify("Cannot run without JIT", 5000); return false; } #endif @@ -2014,13 +2269,7 @@ bool retro_load_game(const struct retro_game_info *game) setRotation(); - if (settings.content.gameId == "INITIAL D" - || settings.content.gameId == "INITIAL D Ver.2" - || settings.content.gameId == "INITIAL D Ver.3" - || settings.content.gameId == "INITIAL D CYCRAFT") - haveCardReader = true; - else - haveCardReader = false; + haveCardReader = card_reader::readerAvailable(); refresh_devices(true); // System may have changed - have to update hidden core options @@ -2117,7 +2366,7 @@ bool retro_unserialize(const void * data, size_t size) try { Deserializer deser(data, size); - dc_loadstate(deser); + emu.loadstate(deser); retro_audio_flush_buffer(); if (!first_run) emu.start(); @@ -2194,63 +2443,65 @@ void retro_set_controller_port_device(unsigned in_port, unsigned device) { case RETRO_DEVICE_JOYPAD: config::MapleMainDevices[in_port] = MDT_SegaController; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = MDT_SegaVMU; - config::MapleExpansionDevices[in_port][1] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - } break; case RETRO_DEVICE_TWINSTICK: case RETRO_DEVICE_TWINSTICK_SATURN: config::MapleMainDevices[in_port] = MDT_TwinStick; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } break; case RETRO_DEVICE_ASCIISTICK: config::MapleMainDevices[in_port] = MDT_AsciiStick; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } break; case RETRO_DEVICE_KEYBOARD: config::MapleMainDevices[in_port] = MDT_Keyboard; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = MDT_None; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } break; case RETRO_DEVICE_MOUSE: config::MapleMainDevices[in_port] = MDT_Mouse; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = MDT_None; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } break; case RETRO_DEVICE_LIGHTGUN: case RETRO_DEVICE_POINTER: config::MapleMainDevices[in_port] = MDT_LightGun; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = enable_purupuru ? MDT_PurupuruPack : MDT_SegaVMU; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } + break; + case RETRO_DEVICE_MARACAS: + config::MapleMainDevices[in_port] = MDT_MaracasController; + break; + case RETRO_DEVICE_FISHING: + config::MapleMainDevices[in_port] = MDT_FishingController; + break; + case RETRO_DEVICE_POPNMUSIC: + config::MapleMainDevices[in_port] = MDT_PopnMusicController; + break; + case RETRO_DEVICE_RACING: + config::MapleMainDevices[in_port] = MDT_RacingController; + break; + case RETRO_DEVICE_DENSHA: + config::MapleMainDevices[in_port] = MDT_DenshaDeGoController; + break; + case RETRO_DEVICE_FULL_CONTROLLER: + config::MapleMainDevices[in_port] = MDT_SegaControllerXL; break; default: config::MapleMainDevices[in_port] = MDT_None; - if (settings.platform.isConsole()) { - config::MapleExpansionDevices[in_port][0] = MDT_None; - config::MapleExpansionDevices[in_port][1] = MDT_None; - } break; } + + // To avoid refreshing input descriptors and core options 4 times on boot, + // let's do it only when all ports are initialized. + if (first_run) + for (int type : device_type) + if (type == -1) + return; + + set_input_descriptors(); + + // To refresh the expansion slots options and their visibility + if (settings.platform.isConsole()) + update_variables(false); } } static void refresh_devices(bool first_startup) { devices_need_refresh = false; - set_input_descriptors(); if (!first_startup) { @@ -2285,16 +2536,11 @@ void retro_rend_present() is_dupe = false; } -static uint32_t get_time_ms() -{ - return (uint32_t)(os_GetSeconds() * 1000.0); -} - static void get_analog_stick( retro_input_state_t input_state_cb, int player_index, int stick, - s8* p_analog_x, - s8* p_analog_y ) + s16* p_analog_x, + s16* p_analog_y ) { int analog_x, analog_y; analog_x = input_state_cb( player_index, RETRO_DEVICE_ANALOG, stick, RETRO_DEVICE_ID_ANALOG_X ); @@ -2332,8 +2578,8 @@ static void get_analog_stick( retro_input_state_t input_state_cb, } // output - *p_analog_x = (s8)(analog_x >> 8); - *p_analog_y = (s8)(analog_y >> 8); + *p_analog_x = analog_x; + *p_analog_y = analog_y; } static uint16_t apply_trigger_deadzone( uint16_t input ) @@ -2394,35 +2640,40 @@ static uint16_t get_analog_trigger( return trigger; } -static void setDeviceButtonState(u32 port, int deviceType, int btnId) +inline static void setDeviceButton(u32 port, uint32_t dc_key, bool is_down) { - uint32_t dc_key = map_gamepad_button(deviceType, btnId); - bool is_down = input_cb(port, deviceType, 0, btnId); if (is_down) kcode[port] &= ~dc_key; else kcode[port] |= dc_key; } +static void setDeviceButtonState(u32 port, int deviceType, int btnId) +{ + uint32_t dc_key = map_gamepad_button(deviceType, btnId); + bool is_down = input_cb(port, deviceType, 0, btnId); + setDeviceButton(port, dc_key, is_down); +} + static void setDeviceButtonStateFromBitmap(u32 bitmap, u32 port, int deviceType, int btnId) { uint32_t dc_key = map_gamepad_button(deviceType, btnId); bool is_down = bitmap & (1 << btnId); - if (is_down) - kcode[port] &= ~dc_key; - else - kcode[port] |= dc_key; + setDeviceButton(port, dc_key, is_down); } -// don't call map_gamepad_button, we supply the DC bit directly. -static void setDeviceButtonStateDirect(u32 bitmap, u32 port, int deviceType, int btnId, int dc_bit) +// Don't call map_gamepad_button, we supply the DC key directly. +static void setDeviceButtonStateDirect(u32 bitmap, u32 port, int btnId, uint32_t dc_key) { - uint32_t dc_key = 1 << dc_bit; - bool is_down = bitmap & (1 << btnId); - if (is_down) - kcode[port] &= ~dc_key; - else - kcode[port] |= dc_key; + bool is_down = bitmap & (1 << btnId); + setDeviceButton(port, dc_key, is_down); +} + +static void setDeviceButtonStateDirect2(u32 bitmap, u32 port, int btnId1, int btnId2, uint32_t dc_key) +{ + bool is_down = (bitmap & (1 << btnId1)) || + (bitmap & (1 << btnId2)); + setDeviceButton(port, dc_key, is_down); } static void updateMouseState(u32 port) @@ -2624,8 +2875,8 @@ static void UpdateInputStateNaomi(u32 port) get_analog_stick(input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &joyx[port], &joyy[port] ); get_analog_stick(input_cb, port, RETRO_DEVICE_INDEX_ANALOG_RIGHT, &joyrx[port], &joyry[port]); - lt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_L2) / 128; - rt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_R2) / 128; + lt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_L2) * 2; + rt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_R2) * 2; if (NaomiGameInputs != NULL) { @@ -2634,24 +2885,24 @@ static void UpdateInputStateNaomi(u32 port) if (NaomiGameInputs->axes[i].type == Half) { /* Note: - * - Analog stick axes have a range of [-128, 127] - * - Analog triggers have a range of [0, 255] */ + * - Analog stick axes have a range of [-32768, 32767] + * - Analog triggers have a range of [0, 65535] */ switch (NaomiGameInputs->axes[i].axis) { case 0: - /* Left stick X: [-128, 127] */ + /* Left stick X: [-32768, 32767] */ joyx[port] = std::max((int)joyx[port], 0) * 2; break; case 1: - /* Left stick Y: [-128, 127] */ + /* Left stick Y: [-32768, 32767] */ joyy[port] = std::max((int)joyy[port], 0) * 2; break; case 2: - /* Right stick X: [-128, 127] */ + /* Right stick X: [-32768, 32767] */ joyrx[port] = std::max((int)joyrx[port], 0) * 2; break; case 3: - /* Right stick Y: [-128, 127] */ + /* Right stick Y: [-32768, 32767] */ joyry[port] = std::max((int)joyry[port], 0) * 2; break; /* Case 4/5 correspond to right/left trigger. @@ -2715,6 +2966,20 @@ static void UpdateInputStateNaomi(u32 port) } } +static int16_t getBitmask(u32 port, int deviceType) +{ + int16_t ret = 0; + if (libretro_supports_bitmasks) + ret = input_cb(port, deviceType, 0, RETRO_DEVICE_ID_JOYPAD_MASK); + else + { + for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R3; ++id) + if (input_cb(port, deviceType, 0, id)) + ret |= (1 << id); + } + return ret; +} + static void UpdateInputState(u32 port) { if (gl_ctx_resetting) @@ -2727,120 +2992,79 @@ static void UpdateInputState(u32 port) } if (rumble.set_rumble_state != NULL && vib_stop_time[port] > 0) { - if (get_time_ms() >= vib_stop_time[port]) + if (getTimeMs() >= vib_stop_time[port]) { vib_stop_time[port] = 0; rumble.set_rumble_state(port, RETRO_RUMBLE_STRONG, 0); } else if (vib_delta[port] > 0.0) { - u32 rem_time = vib_stop_time[port] - get_time_ms(); + u32 rem_time = vib_stop_time[port] - getTimeMs(); rumble.set_rumble_state(port, RETRO_RUMBLE_STRONG, 65535 * vib_strength[port] * rem_time * vib_delta[port]); } } - + lightgun_params[port].offscreen = true; switch (config::MapleMainDevices[port]) { case MDT_SegaController: + case MDT_SegaControllerXL: { - int16_t ret = 0; - // - // -- buttons + int16_t ret = getBitmask(port, RETRO_DEVICE_JOYPAD); - if (libretro_supports_bitmasks) - ret = input_cb(port, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK); - else - { - for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R3; ++id) - if (input_cb(port, RETRO_DEVICE_JOYPAD, 0, id)) - ret |= (1 << id); - } - - for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_X; ++id) + // -- buttons + for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R; ++id) setDeviceButtonStateFromBitmap(ret, port, RETRO_DEVICE_JOYPAD, id); - // - // -- analog stick - - get_analog_stick( input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &(joyx[port]), &(joyy[port]) ); + // -- analog sticks + get_analog_stick(input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &joyx[port], &joyy[port]); + get_analog_stick(input_cb, port, RETRO_DEVICE_INDEX_ANALOG_RIGHT, &joyrx[port], &joyry[port]); - // // -- triggers - if ( digital_triggers ) { // -- digital left trigger if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_L2)) - lt[port]=0xFF; + lt[port] = 0xFFFF; else - lt[port]=0; + lt[port] = 0; // -- digital right trigger if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_R2)) - rt[port]=0xFF; + rt[port] = 0xFFFF; else - rt[port]=0; + rt[port] = 0; } else { // -- analog triggers - lt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_L2 ) / 128; - rt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_R2 ) / 128; + lt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_L2 ) * 2; + rt[port] = get_analog_trigger(ret, input_cb, port, RETRO_DEVICE_ID_JOYPAD_R2 ) * 2; } } break; case MDT_AsciiStick: { - int16_t ret = 0; - - if (libretro_supports_bitmasks) - ret = input_cb(port, RETRO_DEVICE_ASCIISTICK, 0, RETRO_DEVICE_ID_JOYPAD_MASK); - else - { - for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R3; ++id) - if (input_cb(port, RETRO_DEVICE_ASCIISTICK, 0, id)) - ret |= (1 << id); - } - + int16_t ret = getBitmask(port, RETRO_DEVICE_ASCIISTICK); kcode[port] = 0xFFFF; // active-low // stick - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_UP, 4 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_DOWN, 5 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_LEFT, 6 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_RIGHT, 7 ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_LEFT, DC_DPAD_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_RIGHT, DC_DPAD_RIGHT ); // buttons - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_B, 2 ); // A - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_A, 1 ); // B - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_Y, 10 ); // X - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_X, 9 ); // Y - - // Z - { - uint32_t dc_key = 1 << 8; // Z - bool is_down = (ret & (1 << RETRO_DEVICE_ID_JOYPAD_L )) || - (ret & (1 << RETRO_DEVICE_ID_JOYPAD_L2)); - if (is_down) - kcode[port] &= ~dc_key; - else - kcode[port] |= dc_key; - } - - // C - { - uint32_t dc_key = 1 << 0; // C - bool is_down = (ret & (1 << RETRO_DEVICE_ID_JOYPAD_R)) || - (ret & (1 << RETRO_DEVICE_ID_JOYPAD_R2)); - if (is_down) - kcode[port] &= ~dc_key; - else - kcode[port] |= dc_key; - } - - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ASCIISTICK, RETRO_DEVICE_ID_JOYPAD_START, 3 ); // Start + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_BTN_X ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_BTN_Y ); + setDeviceButtonStateDirect2(ret, port, RETRO_DEVICE_ID_JOYPAD_L, + RETRO_DEVICE_ID_JOYPAD_L2, DC_BTN_Z ); + setDeviceButtonStateDirect2(ret, port, RETRO_DEVICE_ID_JOYPAD_R, + RETRO_DEVICE_ID_JOYPAD_R2, DC_BTN_C ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); // unused inputs lt[port]=0; @@ -2853,7 +3077,6 @@ static void UpdateInputState(u32 port) case MDT_TwinStick: { int16_t ret = 0; - kcode[port] = 0xFFFF; // active-low if ( device_type[port] == RETRO_DEVICE_TWINSTICK_SATURN ) @@ -2869,34 +3092,27 @@ static void UpdateInputState(u32 port) // NOTE: the dc_bits below are the same, only the retro id values have been rearranged. - if (libretro_supports_bitmasks) - ret = input_cb(port, RETRO_DEVICE_TWINSTICK_SATURN, 0, RETRO_DEVICE_ID_JOYPAD_MASK); - else - { - for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R3; ++id) - if (input_cb(port, RETRO_DEVICE_TWINSTICK_SATURN, 0, id)) - ret |= (1 << id); - } + ret = getBitmask(port, RETRO_DEVICE_TWINSTICK_SATURN); // left-stick - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_UP, 4 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_DOWN, 5 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_LEFT, 6 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_RIGHT, 7 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_L2, 10 ); // left-trigger - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_R2, 9 ); // left-turbo + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_LEFT, DC_DPAD_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_RIGHT, DC_DPAD_RIGHT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L2, DC_BTN_X ); // left-trigger + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R2, DC_BTN_Y ); // left-turbo // right-stick - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_X, 12 ); // up - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_L, 15 ); // right - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_A, 13 ); // down - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_Y, 14 ); // left - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_B, 2 ); // right-trigger - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_R, 1 ); // right-turbo + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_DPAD2_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L, DC_DPAD2_RIGHT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_DPAD2_DOWN ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_DPAD2_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); // right-trigger + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R, DC_BTN_B ); // right-turbo // misc control - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_START, 3 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK_SATURN, RETRO_DEVICE_ID_JOYPAD_SELECT, 11 ); //D + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_SELECT, DC_BTN_D ); } else { @@ -2904,80 +3120,73 @@ static void UpdateInputState(u32 port) const int thresh = 11000; // about 33%, allows for 8-way movement - if (libretro_supports_bitmasks) - ret = input_cb(port, RETRO_DEVICE_TWINSTICK, 0, RETRO_DEVICE_ID_JOYPAD_MASK); - else - { - for (int id = RETRO_DEVICE_ID_JOYPAD_B; id <= RETRO_DEVICE_ID_JOYPAD_R3; ++id) - if (input_cb(port, RETRO_DEVICE_TWINSTICK, 0, id)) - ret |= (1 << id); - } + ret = getBitmask(port, RETRO_DEVICE_TWINSTICK); // LX analog = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X ); if ( analog < -thresh ) - kcode[port] &= ~( 1 << 6 ); // L + kcode[port] &= ~DC_DPAD_LEFT; else if ( analog > thresh ) - kcode[port] &= ~( 1 << 7 ); // R + kcode[port] &= ~DC_DPAD_RIGHT; else { // digital - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_LEFT, 6 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_RIGHT, 7 ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_LEFT, DC_DPAD_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_RIGHT, DC_DPAD_RIGHT ); } // LY analog = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y ); if ( analog < -thresh ) - kcode[port] &= ~( 1 << 4 ); // U + kcode[port] &= ~DC_DPAD_UP; else if ( analog > thresh ) - kcode[port] &= ~( 1 << 5 ); // D + kcode[port] &= ~DC_DPAD_DOWN; else { // digital - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_UP, 4 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_DOWN, 5 ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); } // RX analog = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X ); if ( analog < -thresh ) - kcode[port] &= ~( 1 << 14 ); // L + kcode[port] &= ~DC_DPAD2_LEFT; else if ( analog > thresh ) - kcode[port] &= ~( 1 << 15 ); // R + kcode[port] &= ~DC_DPAD2_RIGHT; else { // digital - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_Y, 14 ); // left - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_A, 15 ); // right + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_DPAD2_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_DPAD2_RIGHT ); } // RY analog = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y ); if ( analog < -thresh ) - kcode[port] &= ~( 1 << 12 ); // U + kcode[port] &= ~DC_DPAD2_UP; else if ( analog > thresh ) - kcode[port] &= ~( 1 << 13 ); // D + kcode[port] &= ~DC_DPAD2_DOWN; else { // digital - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_X, 12 ); // up - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_B, 13 ); // down + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_DPAD2_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_DPAD2_DOWN ); } // left-stick buttons - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_L2, 10 ); // left-trigger - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_L, 9 ); // left-turbo + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L2, DC_BTN_X ); // left-trigger + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L, DC_BTN_Y ); // left-turbo // right-stick buttons - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_R2, 2 ); // right-trigger - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_R, 1 ); // right-turbo + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R2, DC_BTN_A ); // right-trigger + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R, DC_BTN_B ); // right-turbo // misc control - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_START, 3 ); - setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_TWINSTICK, RETRO_DEVICE_ID_JOYPAD_SELECT, 11 ); //D + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_SELECT, DC_BTN_D ); } - + // unused inputs lt[port]=0; rt[port]=0; @@ -3058,12 +3267,133 @@ static void UpdateInputState(u32 port) updateMouseState(port); break; + case MDT_MaracasController: + { + int16_t ret = getBitmask(port, RETRO_DEVICE_MARACAS); + kcode[port] = 0xFFFF; // active-low + + // buttons + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); // Right maraca shake switch + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); // Left maraca shake switch + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_BTN_C ); // Left maraca button + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L, DC_BTN_D ); // Left maraca "lost" flag + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R, DC_BTN_Z ); // Right maraca "lost" flag + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); // Right maraca button + + // If we wanted to apply deadzone (which we don't want for maracas), we could use: + // get_analog_stick( input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &(joyx [port]), &(joyy [port]) ); + // get_analog_stick( input_cb, port, RETRO_DEVICE_INDEX_ANALOG_RIGHT, &(joyrx[port]), &(joyry[port]) ); + joyx [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X ); + joyy [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y ); + joyrx[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X ); + joyry[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y ); + + // unused inputs + lt[port]=0; + rt[port]=0; + } + break; + + case MDT_FishingController: + { + int16_t ret = getBitmask(port, RETRO_DEVICE_FISHING); + kcode[port] = 0xFFFF; // active-low + + // buttons + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_BTN_X ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_BTN_Y ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); + + // analog axes + get_analog_stick( input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &(joyx [port]), &(joyy [port]) ); // A3, A4: Analog keys (XY) + joyrx[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X ); // A5: Acc. sensor X + joyry[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y ); // A6: Acc. sensor Y + lt [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_BUTTON, RETRO_DEVICE_ID_JOYPAD_L2 ) * 2; // A2: Acc. sensor Z + rt [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_BUTTON, RETRO_DEVICE_ID_JOYPAD_R2 ) * 2; // A1: Analog lever + } + break; + + case MDT_PopnMusicController: + { + int16_t ret = getBitmask(port, RETRO_DEVICE_POPNMUSIC); + kcode[port] = 0xFFFF; // active-low + + // buttons + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_LEFT, DC_DPAD_LEFT ); // Pop'n A + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); // Pop'n B + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); // Pop'n C + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_RIGHT, DC_DPAD_RIGHT ); // Pop'n D + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); // Pop'n E + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_BTN_X ); // Pop'n F + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); // Pop'n G + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_BTN_Y ); // Pop'n H + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R, DC_BTN_C ); // Pop'n I + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); // Pop'n Start + + // unused inputs + lt[port]=0; + rt[port]=0; + joyx[port]=0; + joyy[port]=0; + } + break; + + case MDT_RacingController: + { + int16_t ret = getBitmask(port, RETRO_DEVICE_RACING); + kcode[port] = 0xFFFF; // active-low + + // buttons + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); + + // analog axes + get_analog_stick( input_cb, port, RETRO_DEVICE_INDEX_ANALOG_LEFT, &(joyx [port]), &(joyy [port]) ); // A3: Analog key; + rt [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_BUTTON, RETRO_DEVICE_ID_JOYPAD_R2 ) * 2; // A1: Analog lever + lt [port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_BUTTON, RETRO_DEVICE_ID_JOYPAD_L2 ) * 2; // A2: Analog lever + joyrx[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X ); // A5: Accelerator? + joyry[port] = input_cb( port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y ); // A6: Brake? + joyy [port] = 0; // A4: unused + } + break; + + case MDT_DenshaDeGoController: + { + int16_t ret = getBitmask(port, RETRO_DEVICE_DENSHA); + kcode[port] = 0xFFFF; // active-low + + // buttons + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_RIGHT, DC_DPAD_RIGHT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_LEFT, DC_DPAD_LEFT ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_DOWN, DC_DPAD_DOWN ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_UP, DC_DPAD_UP ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_Y, DC_BTN_X ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_X, DC_BTN_Y ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_R, DC_BTN_Z ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_B, DC_BTN_A ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_A, DC_BTN_B ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L, DC_BTN_C ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_L2, DC_BTN_D ); + setDeviceButtonStateDirect(ret, port, RETRO_DEVICE_ID_JOYPAD_START, DC_BTN_START ); + // unused inputs - actually, A1, A2, A5, A6 == FFh, A3, A4 == 0, but that is already set in maple_densha_controller... + //lt[port]=0; + //rt[port]=0; + //joyx[port]=0; + //joyy[port]=0; + } + break; + default: break; } } -void UpdateInputState() +void os_UpdateInputState() { UpdateInputState(0); UpdateInputState(1); @@ -3079,7 +3409,7 @@ static void updateVibration(u32 port, float power, float inclination, u32 durati vib_strength[port] = power; rumble.set_rumble_state(port, RETRO_RUMBLE_STRONG, (u16)(65535 * power)); - vib_stop_time[port] = get_time_ms() + durationMs; + vib_stop_time[port] = getTimeMs() + durationMs; vib_delta[port] = inclination; } @@ -3193,13 +3523,14 @@ static bool retro_set_eject_state(bool ejected) disc_tray_open = ejected; if (ejected) { - DiscOpenLid(); + emu.openGdrom(); return true; } else { try { - return DiscSwap(disk_paths[disk_index]); + emu.insertGdrom(disk_paths[disk_index]); + return true; } catch (const FlycastException& e) { ERROR_LOG(GDROM, "%s", e.what()); return false; @@ -3220,19 +3551,19 @@ static unsigned retro_get_image_index() static bool retro_set_image_index(unsigned index) { disk_index = index; - if (disk_index >= disk_paths.size()) - { - // No disk in drive - settings.content.path.clear(); - return true; - } - settings.content.path = disk_paths[index]; + try { + if (disk_index >= disk_paths.size()) + { + // No disk in drive + emu.insertGdrom(""); + return true; + } - if (disc_tray_open) - return true; + if (disc_tray_open) + return true; - try { - return DiscSwap(settings.content.path); + emu.insertGdrom(disk_paths[index]); + return true; } catch (const FlycastException& e) { ERROR_LOG(GDROM, "%s", e.what()); return false; @@ -3409,12 +3740,10 @@ static bool read_m3u(const char *file) return disk_index != 0; } -void gui_display_notification(const char *msg, int duration) +void os_notify(const char *msg, int durationMs, const char *details) { retro_message retromsg; retromsg.msg = msg; - retromsg.frames = duration / 17; + retromsg.frames = durationMs / 17; environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &retromsg); } - -void os_RunInstance(int argc, const char *argv[]) { } diff --git a/shell/libretro/libretro_core_options.h b/shell/libretro/libretro_core_options.h index 39b210af9..d60c61dae 100644 --- a/shell/libretro/libretro_core_options.h +++ b/shell/libretro/libretro_core_options.h @@ -94,6 +94,11 @@ struct retro_core_option_v2_category option_cats_us[] = { "Input", "Configure gamepad and light gun settings." }, + { + "expansions", + "Controller Expansion Slots", + "Select the device (VMU, rumble device) plugged in each controller expansion slot." + }, { "vmu", "Visual Memory Unit", @@ -184,25 +189,11 @@ struct retro_core_option_v2_definition option_defs_us[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - "Force Windows CE Mode", - NULL, - "Enable full MMU (Memory Management Unit) emulation and other settings for Windows CE games.", - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - "Allow NAOMI Service Buttons", + "Allow Arcade Service Buttons", NULL, - "Enables SERVICE button for NAOMI, to enter cabinet settings.", + "Enables SERVICE button for arcade games, to enter cabinet settings.", NULL, "system", { @@ -263,33 +254,33 @@ struct retro_core_option_v2_definition option_defs_us[] = { NULL, "video", { - { "320x240", NULL }, - { "640x480", NULL }, - { "800x600", NULL }, - { "960x720", NULL }, - { "1024x768", NULL }, - { "1280x960", NULL }, - { "1440x1080", NULL }, - { "1600x1200", NULL }, - { "1920x1440", NULL }, - { "2560x1920", NULL }, - { "2880x2160", NULL }, - { "3200x2400", NULL }, - { "3840x2880", NULL }, - { "4480x3360", NULL }, - { "5120x3840", NULL }, - { "5760x4320", NULL }, - { "6400x4800", NULL }, - { "7040x5280", NULL }, - { "7680x5760", NULL }, - { "8320x6240", NULL }, - { "8960x6720", NULL }, - { "9600x7200", NULL }, - { "10240x7680", NULL }, - { "10880x8160", NULL }, - { "11520x8640", NULL }, - { "12160x9120", NULL }, - { "12800x9600", NULL }, + { "320x240", "320x240 (Half)" }, + { "640x480", "640x480 (Native)" }, + { "800x600", "800x600 (x1.25)" }, + { "960x720", "960x720 (x1.5)" }, + { "1024x768", "1024x768 (x1.6)" }, + { "1280x960", "1280x960 (x2)" }, + { "1440x1080", "1440x1080 (x2.25)" }, + { "1600x1200", "1600x1200 (x2.5)" }, + { "1920x1440", "1920x1440 (x3)" }, + { "2560x1920", "2560x1920 (x4)" }, + { "2880x2160", "2880x2160 (x4.5)" }, + { "3200x2400", "3200x2400 (x5)" }, + { "3840x2880", "3840x2880 (x6)" }, + { "4480x3360", "4480x3360 (x7)" }, + { "5120x3840", "5120x3840 (x8)" }, + { "5760x4320", "5760x4320 (x9)" }, + { "6400x4800", "6400x4800 (x10)" }, + { "7040x5280", "7040x5280 (x11)" }, + { "7680x5760", "7680x5760 (x12)" }, + { "8320x6240", "8320x6240 (x13)" }, + { "8960x6720", "8960x6720 (x14)" }, + { "9600x7200", "9600x7200 (x15)" }, + { "10240x7680", "10240x7680 (x16)" }, + { "10880x8160", "10880x8160 (x17)" }, + { "11520x8640", "11520x8640 (x18)" }, + { "12160x9120", "12160x9120 (x19)" }, + { "12800x9600", "12800x9600 (x20)" }, { NULL, NULL }, }, #ifdef LOW_RES @@ -344,11 +335,11 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", "Alpha Sorting", NULL, - "", + "Select how the transparent polygons are sorted.", NULL, "video", { @@ -394,6 +385,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -428,11 +420,11 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", "Mipmapping", NULL, - "", + "When enabled textures will use smaller version of themselves when they appear farther away, it can increase performances and reduce shimmering.", NULL, "video", { @@ -514,7 +506,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -561,11 +553,11 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", "Texture Upscaling Max. Filtered Size", NULL, - "", + "Select a maximum size value for a texture to be upscaled, if the texture size is higher than the selected value then it will not be upscaled.", NULL, "video", { @@ -591,6 +583,20 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + "Fix Upscale Bleeding Edge", + NULL, + "Helps with texture bleeding case when upscaling. Disabling it can help if pixels are warping when upscaling in 2D games (MVC2, CVS, KOF, etc.)", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", "Threaded Rendering", @@ -689,6 +695,20 @@ struct retro_core_option_v2_definition option_defs_us[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + "Dreamcast 32MB RAM Mod", + NULL, + "Enables 32MB RAM Mod for Dreamcast. May affect compatibility", + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", "SH4 CPU under/overclock", @@ -746,7 +766,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { CORE_OPTION_NAME "_custom_textures", "Load Custom Textures", NULL, - "", + "Load custom textures located in the 'system/dc/textures//' folder.", NULL, "hacks", { @@ -756,11 +776,11 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", "Dump Textures", NULL, - "", + "Every time a new texture is used by the game, it will be saved as a .png file in the 'system/dc/texdump//' folder.", NULL, "hacks", { @@ -774,7 +794,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { CORE_OPTION_NAME "_analog_stick_deadzone", "Analog Stick Deadzone", NULL, - "", + "Select how far you have to push the analog stick before it starts being processed.", NULL, "input", { @@ -793,7 +813,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { CORE_OPTION_NAME "_trigger_deadzone", "Trigger Deadzone", NULL, - "", + "Select how much you have to press the trigger before it starts being processed.", NULL, "input", { @@ -812,7 +832,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { CORE_OPTION_NAME "_digital_triggers", "Digital Triggers", NULL, - "", + "When enabled the triggers will act as regular buttons, meaning they will be processed as either fully pressed or not pressed at all, with no in-between.", NULL, "input", { @@ -822,20 +842,6 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - "Purupuru Pack/Vibration Pack", - NULL, - "Enables controller force feedback.", - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", "Broadcast Digital Outputs", @@ -864,6 +870,44 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + "Gun Crosshair Size Scaling", + NULL, + "", + NULL, + "input", + { + { "50%", NULL }, + { "60%", NULL }, + { "70%", NULL }, + { "80%", NULL }, + { "90%", NULL }, + { "100%", NULL }, + { "110%", NULL }, + { "120%", NULL }, + { "130%", NULL }, + { "140%", NULL }, + { "150%", NULL }, + { "160%", NULL }, + { "170%", NULL }, + { "180%", NULL }, + { "190%", NULL }, + { "200%", NULL }, + { "210%", NULL }, + { "220%", NULL }, + { "230%", NULL }, + { "240%", NULL }, + { "250%", NULL }, + { "260%", NULL }, + { "270%", NULL }, + { "280%", NULL }, + { "290%", NULL }, + { "300%", NULL }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", "Gun Crosshair 1 Display", @@ -932,11 +976,131 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + "Device in Expansion Slot A1", + NULL, + "Select the device plugged in the expansion slot A1 (port A slot 1).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + "Device in Expansion Slot A2", + NULL, + "Select the device plugged in the expansion slot A2 (port A slot 2).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + "Device in Expansion Slot B1", + NULL, + "Select the device plugged in the expansion slot B1 (port B slot 1).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + "Device in Expansion Slot B2", + NULL, + "Select the device plugged in the expansion slot B2 (port B slot 2).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + "Device in Expansion Slot C1", + NULL, + "Select the device plugged in the expansion slot C1 (port C slot 1).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + "Device in Expansion Slot C2", + NULL, + "Select the device plugged in the expansion slot C2 (port C slot 2).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + "Device in Expansion Slot D1", + NULL, + "Select the device plugged in the expansion slot D1 (port D slot 1).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + "Device in Expansion Slot D2", + NULL, + "Select the device plugged in the expansion slot D2 (port D slot 2).", + NULL, + "expansions", + { + { "VMU", NULL }, + { "Purupuru", "Vibration Pack" }, + { "None", NULL }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", "Per-Game Visual Memory Units/Systems (VMU)", "Per-Game VMUs", - "When disabled, all games share 4 VMU save files (A1, B1, C1, D1) located in RetroArch's system directory. The 'VMU A1' setting creates a unique VMU 'A1' file in RetroArch's save directory for each game that is launched. The 'All VMUs' setting creates 4 unique VMU files (A1, B1, C1, D1) for each game that is launched.", + "When disabled, all games share up to 8 VMU save files (A1/A2/B1/B2/C1/C2/D1/D2) located in RetroArch's system folder.\nThe 'VMU A1' setting creates a unique VMU 'A1' file in RetroArch's save folder for each game that is launched.\nThe 'All VMUs' setting creates up to 8 unique VMU files (A1/A2/B1/B2/C1/C2/D1/D2) for each game that is launched.", NULL, "vmu", { @@ -1153,7 +1317,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "Lower Right", NULL }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", @@ -1304,7 +1468,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "Lower Right", NULL }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -1455,7 +1619,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { { "Lower Right", NULL }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -1603,7 +1767,7 @@ struct retro_core_options_v2 *options_intl[RETRO_LANGUAGE_LAST] = { &options_nl, /* RETRO_LANGUAGE_DUTCH */ &options_pt_br, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ &options_pt_pt, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ - &options_ru, /* RETRO_LANGUAGE_RUSSIAN */ + NULL, /* RETRO_LANGUAGE_RUSSIAN */ &options_ko, /* RETRO_LANGUAGE_KOREAN */ &options_cht, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ &options_chs, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ diff --git a/shell/libretro/libretro_core_options_intl.h b/shell/libretro/libretro_core_options_intl.h index a22267cae..10ce93b13 100644 --- a/shell/libretro/libretro_core_options_intl.h +++ b/shell/libretro/libretro_core_options_intl.h @@ -57,16 +57,18 @@ extern "C" { */ /* RETRO_LANGUAGE_AR */ -#define CATEGORY_SYSTEM_LABEL_AR NULL +#define CATEGORY_SYSTEM_LABEL_AR "نظام" #define CATEGORY_SYSTEM_INFO_0_AR NULL #define CATEGORY_VIDEO_LABEL_AR "فيديو" #define CATEGORY_VIDEO_INFO_0_AR NULL -#define CATEGORY_PERFORMANCE_LABEL_AR NULL +#define CATEGORY_PERFORMANCE_LABEL_AR "الأداء" #define CATEGORY_PERFORMANCE_INFO_0_AR NULL #define CATEGORY_HACKS_LABEL_AR NULL #define CATEGORY_HACKS_INFO_0_AR NULL #define CATEGORY_INPUT_LABEL_AR "الإدخال" #define CATEGORY_INPUT_INFO_0_AR NULL +#define CATEGORY_EXPANSIONS_LABEL_AR NULL +#define CATEGORY_EXPANSIONS_INFO_0_AR NULL #define CATEGORY_VMU_LABEL_AR NULL #define CATEGORY_VMU_INFO_0_AR NULL #define CORE_OPTION_NAME_REGION_LABEL_AR "المنطقة" @@ -88,8 +90,6 @@ extern "C" { #define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_AR NULL #define CORE_OPTION_NAME_ENABLE_DSP_LABEL_AR NULL #define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_AR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_AR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_AR NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_AR NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_AR NULL #define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_AR NULL @@ -141,6 +141,7 @@ extern "C" { #define OPTION_VAL_HORIZONTAL_AR NULL #define OPTION_VAL_VERTICAL_AR NULL #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_AR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_AR NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_AR NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_AR NULL #define OPTION_VAL_PER_PIXEL_ACCURATE_AR NULL @@ -157,6 +158,7 @@ extern "C" { #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_AR NULL #define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_AR NULL #define CORE_OPTION_NAME_MIPMAPPING_LABEL_AR NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_AR NULL #define CORE_OPTION_NAME_FOG_LABEL_AR NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_AR NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_AR NULL @@ -174,12 +176,15 @@ extern "C" { #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_AR NULL #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_AR NULL #define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_AR NULL -#define OPTION_VAL_2_O27_AR NULL +#define OPTION_VAL_2_O26_AR NULL #define OPTION_VAL_4_AR NULL #define OPTION_VAL_6_AR NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_AR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_AR NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_AR NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_AR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_AR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_AR NULL #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_AR NULL #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_AR NULL #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_AR NULL @@ -194,6 +199,8 @@ extern "C" { #define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_AR NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_AR NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_AR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_AR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_AR NULL #define CORE_OPTION_NAME_SH4CLOCK_LABEL_AR NULL #define CORE_OPTION_NAME_SH4CLOCK_INFO_0_AR NULL #define OPTION_VAL_100_AR NULL @@ -238,8 +245,11 @@ extern "C" { #define OPTION_VAL_490_AR NULL #define OPTION_VAL_500_AR NULL #define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_AR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_AR NULL #define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_AR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_AR NULL #define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_AR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_AR NULL #define OPTION_VAL_0_AR NULL #define OPTION_VAL_5_AR NULL #define OPTION_VAL_10_AR NULL @@ -248,13 +258,40 @@ extern "C" { #define OPTION_VAL_25_AR NULL #define OPTION_VAL_30_AR NULL #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_AR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_AR NULL #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_AR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_AR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_AR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_AR NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_AR NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_AR NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_AR NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_AR NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_AR NULL +#define OPTION_VAL_50_AR NULL +#define OPTION_VAL_60_AR NULL +#define OPTION_VAL_70_AR NULL +#define OPTION_VAL_80_AR NULL +#define OPTION_VAL_90_AR NULL +#define OPTION_VAL_100_O45_AR NULL +#define OPTION_VAL_110_O45_AR NULL +#define OPTION_VAL_120_O45_AR NULL +#define OPTION_VAL_130_O45_AR NULL +#define OPTION_VAL_140_O45_AR NULL +#define OPTION_VAL_150_O45_AR NULL +#define OPTION_VAL_160_O45_AR NULL +#define OPTION_VAL_170_O45_AR NULL +#define OPTION_VAL_180_O45_AR NULL +#define OPTION_VAL_190_O45_AR NULL +#define OPTION_VAL_200_O45_AR NULL +#define OPTION_VAL_210_O45_AR NULL +#define OPTION_VAL_220_O45_AR NULL +#define OPTION_VAL_230_O45_AR NULL +#define OPTION_VAL_240_O45_AR NULL +#define OPTION_VAL_250_O45_AR NULL +#define OPTION_VAL_260_O45_AR NULL +#define OPTION_VAL_270_O45_AR NULL +#define OPTION_VAL_280_O45_AR NULL +#define OPTION_VAL_290_O45_AR NULL +#define OPTION_VAL_300_O45_AR NULL #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_AR NULL #define OPTION_VAL_WHITE_AR NULL #define OPTION_VAL_RED_AR "أحمر" @@ -263,6 +300,25 @@ extern "C" { #define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_AR NULL #define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_AR NULL #define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_AR NULL +#define OPTION_VAL_VMU_AR NULL +#define OPTION_VAL_PURUPURU_AR NULL +#define OPTION_VAL_NONE_AR "لاشيء" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_AR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_AR NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_AR NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_AR NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_AR NULL @@ -313,12 +369,6 @@ extern "C" { #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_AR NULL #define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_AR NULL #define OPTION_VAL_40_AR NULL -#define OPTION_VAL_50_AR NULL -#define OPTION_VAL_60_AR NULL -#define OPTION_VAL_70_AR NULL -#define OPTION_VAL_80_AR NULL -#define OPTION_VAL_90_AR NULL -#define OPTION_VAL_100_O57_AR NULL #define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_AR NULL #define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_AR NULL #define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_AR NULL @@ -364,6 +414,11 @@ struct retro_core_option_v2_category option_cats_ar[] = { CATEGORY_INPUT_LABEL_AR, CATEGORY_INPUT_INFO_0_AR }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_AR, + CATEGORY_EXPANSIONS_INFO_0_AR + }, { "vmu", CATEGORY_VMU_LABEL_AR, @@ -453,20 +508,6 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_AR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_AR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_AR, @@ -613,11 +654,11 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_AR, NULL, "video", { @@ -663,6 +704,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -697,11 +739,11 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_AR, NULL, "video", { @@ -783,7 +825,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -823,18 +865,18 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_AR }, + { "2", OPTION_VAL_2_O26_AR }, { "4", OPTION_VAL_4_AR }, { "6", OPTION_VAL_6_AR }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_AR, NULL, "video", { @@ -860,6 +902,20 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_AR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_AR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_AR, @@ -958,6 +1014,20 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_AR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_AR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_AR, @@ -1015,7 +1085,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_AR, NULL, "hacks", { @@ -1025,11 +1095,11 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_AR, NULL, "hacks", { @@ -1043,7 +1113,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_AR, NULL, "input", { @@ -1062,7 +1132,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_AR, NULL, "input", { @@ -1081,7 +1151,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_AR, NULL, "input", { @@ -1091,20 +1161,6 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_AR, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_AR, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_AR, @@ -1133,6 +1189,44 @@ struct retro_core_option_v2_definition option_defs_ar[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_AR, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_AR }, + { "60%", OPTION_VAL_60_AR }, + { "70%", OPTION_VAL_70_AR }, + { "80%", OPTION_VAL_80_AR }, + { "90%", OPTION_VAL_90_AR }, + { "100%", OPTION_VAL_100_O45_AR }, + { "110%", OPTION_VAL_110_O45_AR }, + { "120%", OPTION_VAL_120_O45_AR }, + { "130%", OPTION_VAL_130_O45_AR }, + { "140%", OPTION_VAL_140_O45_AR }, + { "150%", OPTION_VAL_150_O45_AR }, + { "160%", OPTION_VAL_160_O45_AR }, + { "170%", OPTION_VAL_170_O45_AR }, + { "180%", OPTION_VAL_180_O45_AR }, + { "190%", OPTION_VAL_190_O45_AR }, + { "200%", OPTION_VAL_200_O45_AR }, + { "210%", OPTION_VAL_210_O45_AR }, + { "220%", OPTION_VAL_220_O45_AR }, + { "230%", OPTION_VAL_230_O45_AR }, + { "240%", OPTION_VAL_240_O45_AR }, + { "250%", OPTION_VAL_250_O45_AR }, + { "260%", OPTION_VAL_260_O45_AR }, + { "270%", OPTION_VAL_270_O45_AR }, + { "280%", OPTION_VAL_280_O45_AR }, + { "290%", OPTION_VAL_290_O45_AR }, + { "300%", OPTION_VAL_300_O45_AR }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_AR, @@ -1202,201 +1296,170 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_AR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_AR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_AR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_AR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_AR, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_AR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_AR }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_AR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_AR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_AR, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_AR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_AR, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_AR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_AR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_AR, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_AR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_AR, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_AR, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_AR, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_AR, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_AR, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_AR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_AR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_AR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_AR }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_AR, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_AR, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_AR }, - { "2x", OPTION_VAL_2_O27_AR }, - { "3x", OPTION_VAL_3X_AR }, - { "4x", OPTION_VAL_4_AR }, - { "5x", OPTION_VAL_5X_AR }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_AR, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_AR, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_AR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_AR }, - { "BLACK 02", OPTION_VAL_BLACK_02_AR }, - { "BLUE 03", OPTION_VAL_BLUE_AR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_AR }, - { "GREEN 05", OPTION_VAL_GREEN_AR }, - { "CYAN 06", OPTION_VAL_CYAN_06_AR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_AR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_AR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_AR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_AR }, - { "RED 11", OPTION_VAL_RED_AR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_AR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_AR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_AR }, - { "GRAY 15", OPTION_VAL_GRAY_15_AR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_AR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_AR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_AR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_AR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_AR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_AR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_AR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_AR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_AR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_AR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_AR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_AR }, - { "WHITE 28", OPTION_VAL_WHITE_AR }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_AR, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_AR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_AR, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_AR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_AR }, - { "BLACK 02", OPTION_VAL_BLACK_02_AR }, - { "BLUE 03", OPTION_VAL_BLUE_AR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_AR }, - { "GREEN 05", OPTION_VAL_GREEN_AR }, - { "CYAN 06", OPTION_VAL_CYAN_06_AR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_AR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_AR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_AR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_AR }, - { "RED 11", OPTION_VAL_RED_AR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_AR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_AR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_AR }, - { "GRAY 15", OPTION_VAL_GRAY_15_AR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_AR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_AR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_AR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_AR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_AR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_AR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_AR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_AR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_AR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_AR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_AR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_AR }, - { "WHITE 28", OPTION_VAL_WHITE_AR }, + { "VMU", OPTION_VAL_VMU_AR }, + { "Purupuru", OPTION_VAL_PURUPURU_AR }, + { "None", OPTION_VAL_NONE_AR }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_AR, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_AR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_AR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_AR, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_AR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_AR }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_AR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_AR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_AR, NULL, "vmu", { - { "10%", OPTION_VAL_10_AR }, - { "20%", OPTION_VAL_20_AR }, - { "30%", OPTION_VAL_30_AR }, - { "40%", OPTION_VAL_40_AR }, - { "50%", OPTION_VAL_50_AR }, - { "60%", OPTION_VAL_60_AR }, - { "70%", OPTION_VAL_70_AR }, - { "80%", OPTION_VAL_80_AR }, - { "90%", OPTION_VAL_90_AR }, - { "100%", OPTION_VAL_100_O57_AR }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_AR, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_AR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_AR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_AR, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_AR, NULL, "", NULL, @@ -1409,8 +1472,8 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_AR, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_AR, NULL, "", NULL, @@ -1425,15 +1488,15 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_AR, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_AR, NULL, "", NULL, "vmu", { { "1x", OPTION_VAL_1X_AR }, - { "2x", OPTION_VAL_2_O27_AR }, + { "2x", OPTION_VAL_2_O26_AR }, { "3x", OPTION_VAL_3X_AR }, { "4x", OPTION_VAL_4_AR }, { "5x", OPTION_VAL_5X_AR }, @@ -1442,8 +1505,159 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_AR, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_AR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_AR }, + { "BLACK 02", OPTION_VAL_BLACK_02_AR }, + { "BLUE 03", OPTION_VAL_BLUE_AR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_AR }, + { "GREEN 05", OPTION_VAL_GREEN_AR }, + { "CYAN 06", OPTION_VAL_CYAN_06_AR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_AR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_AR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_AR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_AR }, + { "RED 11", OPTION_VAL_RED_AR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_AR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_AR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_AR }, + { "GRAY 15", OPTION_VAL_GRAY_15_AR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_AR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_AR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_AR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_AR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_AR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_AR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_AR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_AR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_AR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_AR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_AR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_AR }, + { "WHITE 28", OPTION_VAL_WHITE_AR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_AR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_AR }, + { "BLACK 02", OPTION_VAL_BLACK_02_AR }, + { "BLUE 03", OPTION_VAL_BLUE_AR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_AR }, + { "GREEN 05", OPTION_VAL_GREEN_AR }, + { "CYAN 06", OPTION_VAL_CYAN_06_AR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_AR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_AR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_AR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_AR }, + { "RED 11", OPTION_VAL_RED_AR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_AR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_AR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_AR }, + { "GRAY 15", OPTION_VAL_GRAY_15_AR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_AR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_AR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_AR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_AR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_AR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_AR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_AR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_AR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_AR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_AR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_AR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_AR }, + { "WHITE 28", OPTION_VAL_WHITE_AR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_AR }, + { "20%", OPTION_VAL_20_AR }, + { "30%", OPTION_VAL_30_AR }, + { "40%", OPTION_VAL_40_AR }, + { "50%", OPTION_VAL_50_AR }, + { "60%", OPTION_VAL_60_AR }, + { "70%", OPTION_VAL_70_AR }, + { "80%", OPTION_VAL_80_AR }, + { "90%", OPTION_VAL_90_AR }, + { "100%", OPTION_VAL_100_O45_AR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_AR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_AR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_AR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_AR }, + { NULL, NULL }, + }, + "Upper Right", + }, + { + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_AR, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_AR }, + { "2x", OPTION_VAL_2_O26_AR }, + { "3x", OPTION_VAL_3X_AR }, + { "4x", OPTION_VAL_4_AR }, + { "5x", OPTION_VAL_5X_AR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_AR, NULL, "", NULL, @@ -1540,7 +1754,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "70%", OPTION_VAL_70_AR }, { "80%", OPTION_VAL_80_AR }, { "90%", OPTION_VAL_90_AR }, - { "100%", OPTION_VAL_100_O57_AR }, + { "100%", OPTION_VAL_100_O45_AR }, { NULL, NULL }, }, "100%", @@ -1573,7 +1787,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_AR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -1584,7 +1798,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "vmu", { { "1x", OPTION_VAL_1X_AR }, - { "2x", OPTION_VAL_2_O27_AR }, + { "2x", OPTION_VAL_2_O26_AR }, { "3x", OPTION_VAL_3X_AR }, { "4x", OPTION_VAL_4_AR }, { "5x", OPTION_VAL_5X_AR }, @@ -1691,7 +1905,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "70%", OPTION_VAL_70_AR }, { "80%", OPTION_VAL_80_AR }, { "90%", OPTION_VAL_90_AR }, - { "100%", OPTION_VAL_100_O57_AR }, + { "100%", OPTION_VAL_100_O45_AR }, { NULL, NULL }, }, "100%", @@ -1724,7 +1938,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_AR }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -1735,7 +1949,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { "vmu", { { "1x", OPTION_VAL_1X_AR }, - { "2x", OPTION_VAL_2_O27_AR }, + { "2x", OPTION_VAL_2_O26_AR }, { "3x", OPTION_VAL_3X_AR }, { "4x", OPTION_VAL_4_AR }, { "5x", OPTION_VAL_5X_AR }, @@ -1842,7 +2056,7 @@ struct retro_core_option_v2_definition option_defs_ar[] = { { "70%", OPTION_VAL_70_AR }, { "80%", OPTION_VAL_80_AR }, { "90%", OPTION_VAL_90_AR }, - { "100%", OPTION_VAL_100_O57_AR }, + { "100%", OPTION_VAL_100_O45_AR }, { NULL, NULL }, }, "100%", @@ -1866,6 +2080,8 @@ struct retro_core_options_v2 options_ar = { #define CATEGORY_HACKS_INFO_0_AST NULL #define CATEGORY_INPUT_LABEL_AST "Entrada" #define CATEGORY_INPUT_INFO_0_AST NULL +#define CATEGORY_EXPANSIONS_LABEL_AST NULL +#define CATEGORY_EXPANSIONS_INFO_0_AST NULL #define CATEGORY_VMU_LABEL_AST NULL #define CATEGORY_VMU_INFO_0_AST NULL #define CORE_OPTION_NAME_REGION_LABEL_AST "Rexón" @@ -1886,9 +2102,7 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_AST NULL #define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_AST NULL #define CORE_OPTION_NAME_ENABLE_DSP_LABEL_AST "Activar el DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_AST "Activa la emulación del procesador de señal dixital (DSP) d'audiu de Dreamcast. Ameyora la precisión del soníu xeneráu mas aumenta los requirimientos." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_AST "Forciar el mou de Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_AST "Activa la emulación completa de la unidá de xestión de memoria (MMU) y otros axustes pa los xuegos de Windows CE." +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_AST "Activa la emulación del procesador de señal dixital (DSP) d'audiu de Dreamcast. Ameyora la precisión del soníu xeneráu mas aumenta los requirimientos de rindimientu." #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_AST NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_AST NULL #define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_AST NULL @@ -1898,18 +2112,18 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_UPNP_LABEL_AST NULL #define CORE_OPTION_NAME_UPNP_INFO_0_AST NULL #define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_AST "Resolución interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_AST "Modifica la resolución del renderizáu." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_AST "Modifica la resolución de la renderización." #define OPTION_VAL_320X240_AST NULL #define OPTION_VAL_640X480_AST NULL -#define OPTION_VAL_800X600_AST NULL -#define OPTION_VAL_960X720_AST NULL -#define OPTION_VAL_1024X768_AST NULL +#define OPTION_VAL_800X600_AST "800x600 (x1,25)" +#define OPTION_VAL_960X720_AST "960x720 (x1,5)" +#define OPTION_VAL_1024X768_AST "1024x768 (x1,6)" #define OPTION_VAL_1280X960_AST NULL -#define OPTION_VAL_1440X1080_AST NULL -#define OPTION_VAL_1600X1200_AST NULL +#define OPTION_VAL_1440X1080_AST "1440x1080 (x2,25)" +#define OPTION_VAL_1600X1200_AST "1600x1200 (x2,5)" #define OPTION_VAL_1920X1440_AST NULL #define OPTION_VAL_2560X1920_AST NULL -#define OPTION_VAL_2880X2160_AST NULL +#define OPTION_VAL_2880X2160_AST "2880x2160 (x4,5)" #define OPTION_VAL_3200X2400_AST NULL #define OPTION_VAL_3840X2880_AST NULL #define OPTION_VAL_4480X3360_AST NULL @@ -1930,16 +2144,17 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_AST NULL #define OPTION_VAL_VGA_AST NULL #define OPTION_VAL_TV_RGB_AST NULL -#define OPTION_VAL_TV_COMPOSITE_AST "TV (Compuestu)" +#define OPTION_VAL_TV_COMPOSITE_AST "TV (compuestu)" #define CORE_OPTION_NAME_BROADCAST_LABEL_AST NULL #define OPTION_VAL_NTSC_AST NULL #define OPTION_VAL_PAL_AST NULL -#define OPTION_VAL_PAL_N_AST "PAL-N (Arxentina, Paraguái, Uruguái)" +#define OPTION_VAL_PAL_N_AST "PAL-N (Arxentina, Paraguái y Uruguái)" #define OPTION_VAL_PAL_M_AST "PAL-M (Brasil)" #define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_AST "Orientación de la pantalla" #define OPTION_VAL_HORIZONTAL_AST NULL #define OPTION_VAL_VERTICAL_AST NULL #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_AST NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_AST NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_AST NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_AST NULL #define OPTION_VAL_PER_PIXEL_ACCURATE_AST NULL @@ -1956,6 +2171,7 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_AST NULL #define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_AST NULL #define CORE_OPTION_NAME_MIPMAPPING_LABEL_AST NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_AST NULL #define CORE_OPTION_NAME_FOG_LABEL_AST "Efeutos de nublina" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_AST "Modificador del volume" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_AST NULL @@ -1969,16 +2185,19 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_AST NULL #define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_AST NULL #define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_AST NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_AST "Filtru del posprocesamientu de PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_AST NULL #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_AST NULL #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_AST NULL #define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_AST NULL -#define OPTION_VAL_2_O27_AST "x2" +#define OPTION_VAL_2_O26_AST "x2" #define OPTION_VAL_4_AST "x4" #define OPTION_VAL_6_AST "x6" #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_AST NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_AST NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_AST NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_AST NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_AST NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_AST NULL #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_AST NULL #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_AST NULL #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_AST NULL @@ -1993,6 +2212,8 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_AST NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_AST NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_AST "Aumenta la velocidá de carga de los GD-ROMs." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_AST NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_AST NULL #define CORE_OPTION_NAME_SH4CLOCK_LABEL_AST NULL #define CORE_OPTION_NAME_SH4CLOCK_INFO_0_AST NULL #define OPTION_VAL_100_AST NULL @@ -2037,8 +2258,11 @@ struct retro_core_options_v2 options_ar = { #define OPTION_VAL_490_AST NULL #define OPTION_VAL_500_AST NULL #define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_AST NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_AST NULL #define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_AST NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_AST NULL #define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_AST NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_AST NULL #define OPTION_VAL_0_AST NULL #define OPTION_VAL_5_AST NULL #define OPTION_VAL_10_AST NULL @@ -2047,13 +2271,40 @@ struct retro_core_options_v2 options_ar = { #define OPTION_VAL_25_AST NULL #define OPTION_VAL_30_AST NULL #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_AST NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_AST NULL #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_AST NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_AST NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_AST NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_AST NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_AST NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_AST NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_AST NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_AST NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_AST NULL +#define OPTION_VAL_50_AST NULL +#define OPTION_VAL_60_AST NULL +#define OPTION_VAL_70_AST NULL +#define OPTION_VAL_80_AST NULL +#define OPTION_VAL_90_AST NULL +#define OPTION_VAL_100_O45_AST NULL +#define OPTION_VAL_110_O45_AST NULL +#define OPTION_VAL_120_O45_AST NULL +#define OPTION_VAL_130_O45_AST NULL +#define OPTION_VAL_140_O45_AST NULL +#define OPTION_VAL_150_O45_AST NULL +#define OPTION_VAL_160_O45_AST NULL +#define OPTION_VAL_170_O45_AST NULL +#define OPTION_VAL_180_O45_AST NULL +#define OPTION_VAL_190_O45_AST NULL +#define OPTION_VAL_200_O45_AST NULL +#define OPTION_VAL_210_O45_AST NULL +#define OPTION_VAL_220_O45_AST NULL +#define OPTION_VAL_230_O45_AST NULL +#define OPTION_VAL_240_O45_AST NULL +#define OPTION_VAL_250_O45_AST NULL +#define OPTION_VAL_260_O45_AST NULL +#define OPTION_VAL_270_O45_AST NULL +#define OPTION_VAL_280_O45_AST NULL +#define OPTION_VAL_290_O45_AST NULL +#define OPTION_VAL_300_O45_AST NULL #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_AST NULL #define OPTION_VAL_WHITE_AST "Blancu" #define OPTION_VAL_RED_AST "Coloráu" @@ -2062,14 +2313,33 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_AST NULL #define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_AST NULL #define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_AST NULL +#define OPTION_VAL_VMU_AST NULL +#define OPTION_VAL_PURUPURU_AST NULL +#define OPTION_VAL_NONE_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_AST NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_AST NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_AST NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_AST NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_AST NULL #define OPTION_VAL_VMU_A1_AST NULL #define OPTION_VAL_ALL_VMUS_AST "Toles VMUs" #define CORE_OPTION_NAME_VMU_SOUND_LABEL_AST NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_AST NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_AST NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_AST "Soníos de la VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_AST "Cuando s'activa esta opción, reprodúcense los pitíos de la VMU." #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_AST NULL #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_AST NULL #define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_AST NULL @@ -2112,12 +2382,6 @@ struct retro_core_options_v2 options_ar = { #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_AST NULL #define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_AST NULL #define OPTION_VAL_40_AST NULL -#define OPTION_VAL_50_AST NULL -#define OPTION_VAL_60_AST NULL -#define OPTION_VAL_70_AST NULL -#define OPTION_VAL_80_AST NULL -#define OPTION_VAL_90_AST NULL -#define OPTION_VAL_100_O57_AST NULL #define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_AST NULL #define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_AST NULL #define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_AST NULL @@ -2163,6 +2427,11 @@ struct retro_core_option_v2_category option_cats_ast[] = { CATEGORY_INPUT_LABEL_AST, CATEGORY_INPUT_INFO_0_AST }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_AST, + CATEGORY_EXPANSIONS_INFO_0_AST + }, { "vmu", CATEGORY_VMU_LABEL_AST, @@ -2252,20 +2521,6 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_AST, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_AST, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_AST, @@ -2412,11 +2667,11 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_AST, NULL, "video", { @@ -2462,6 +2717,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -2496,11 +2752,11 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_AST, NULL, "video", { @@ -2582,7 +2838,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -2622,18 +2878,18 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_AST }, + { "2", OPTION_VAL_2_O26_AST }, { "4", OPTION_VAL_4_AST }, { "6", OPTION_VAL_6_AST }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_AST, NULL, "video", { @@ -2659,6 +2915,20 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_AST, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_AST, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_AST, @@ -2757,6 +3027,20 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_AST, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_AST, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_AST, @@ -2814,7 +3098,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_AST, NULL, "hacks", { @@ -2824,11 +3108,11 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_AST, NULL, "hacks", { @@ -2842,7 +3126,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_AST, NULL, "input", { @@ -2861,7 +3145,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_AST, NULL, "input", { @@ -2880,7 +3164,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_AST, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_AST, NULL, "input", { @@ -2890,20 +3174,6 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_AST, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_AST, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_AST, @@ -2932,6 +3202,44 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_AST, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_AST }, + { "60%", OPTION_VAL_60_AST }, + { "70%", OPTION_VAL_70_AST }, + { "80%", OPTION_VAL_80_AST }, + { "90%", OPTION_VAL_90_AST }, + { "100%", OPTION_VAL_100_O45_AST }, + { "110%", OPTION_VAL_110_O45_AST }, + { "120%", OPTION_VAL_120_O45_AST }, + { "130%", OPTION_VAL_130_O45_AST }, + { "140%", OPTION_VAL_140_O45_AST }, + { "150%", OPTION_VAL_150_O45_AST }, + { "160%", OPTION_VAL_160_O45_AST }, + { "170%", OPTION_VAL_170_O45_AST }, + { "180%", OPTION_VAL_180_O45_AST }, + { "190%", OPTION_VAL_190_O45_AST }, + { "200%", OPTION_VAL_200_O45_AST }, + { "210%", OPTION_VAL_210_O45_AST }, + { "220%", OPTION_VAL_220_O45_AST }, + { "230%", OPTION_VAL_230_O45_AST }, + { "240%", OPTION_VAL_240_O45_AST }, + { "250%", OPTION_VAL_250_O45_AST }, + { "260%", OPTION_VAL_260_O45_AST }, + { "270%", OPTION_VAL_270_O45_AST }, + { "280%", OPTION_VAL_280_O45_AST }, + { "290%", OPTION_VAL_290_O45_AST }, + { "300%", OPTION_VAL_300_O45_AST }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_AST, @@ -3000,6 +3308,126 @@ struct retro_core_option_v2_definition option_defs_ast[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_AST, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_AST, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_AST }, + { "Purupuru", OPTION_VAL_PURUPURU_AST }, + { "None", OPTION_VAL_NONE_AST }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_AST, @@ -3081,7 +3509,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "vmu", { { "1x", OPTION_VAL_1X_AST }, - { "2x", OPTION_VAL_2_O27_AST }, + { "2x", OPTION_VAL_2_O26_AST }, { "3x", OPTION_VAL_3X_AST }, { "4x", OPTION_VAL_4_AST }, { "5x", OPTION_VAL_5X_AST }, @@ -3188,7 +3616,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "70%", OPTION_VAL_70_AST }, { "80%", OPTION_VAL_80_AST }, { "90%", OPTION_VAL_90_AST }, - { "100%", OPTION_VAL_100_O57_AST }, + { "100%", OPTION_VAL_100_O45_AST }, { NULL, NULL }, }, "100%", @@ -3221,7 +3649,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_AST }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", @@ -3232,7 +3660,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "vmu", { { "1x", OPTION_VAL_1X_AST }, - { "2x", OPTION_VAL_2_O27_AST }, + { "2x", OPTION_VAL_2_O26_AST }, { "3x", OPTION_VAL_3X_AST }, { "4x", OPTION_VAL_4_AST }, { "5x", OPTION_VAL_5X_AST }, @@ -3339,7 +3767,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "70%", OPTION_VAL_70_AST }, { "80%", OPTION_VAL_80_AST }, { "90%", OPTION_VAL_90_AST }, - { "100%", OPTION_VAL_100_O57_AST }, + { "100%", OPTION_VAL_100_O45_AST }, { NULL, NULL }, }, "100%", @@ -3372,7 +3800,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_AST }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -3383,7 +3811,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "vmu", { { "1x", OPTION_VAL_1X_AST }, - { "2x", OPTION_VAL_2_O27_AST }, + { "2x", OPTION_VAL_2_O26_AST }, { "3x", OPTION_VAL_3X_AST }, { "4x", OPTION_VAL_4_AST }, { "5x", OPTION_VAL_5X_AST }, @@ -3490,7 +3918,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "70%", OPTION_VAL_70_AST }, { "80%", OPTION_VAL_80_AST }, { "90%", OPTION_VAL_90_AST }, - { "100%", OPTION_VAL_100_O57_AST }, + { "100%", OPTION_VAL_100_O45_AST }, { NULL, NULL }, }, "100%", @@ -3523,7 +3951,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_AST }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -3534,7 +3962,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { "vmu", { { "1x", OPTION_VAL_1X_AST }, - { "2x", OPTION_VAL_2_O27_AST }, + { "2x", OPTION_VAL_2_O26_AST }, { "3x", OPTION_VAL_3X_AST }, { "4x", OPTION_VAL_4_AST }, { "5x", OPTION_VAL_5X_AST }, @@ -3641,7 +4069,7 @@ struct retro_core_option_v2_definition option_defs_ast[] = { { "70%", OPTION_VAL_70_AST }, { "80%", OPTION_VAL_80_AST }, { "90%", OPTION_VAL_90_AST }, - { "100%", OPTION_VAL_100_O57_AST }, + { "100%", OPTION_VAL_100_O45_AST }, { NULL, NULL }, }, "100%", @@ -3655,51 +4083,51 @@ struct retro_core_options_v2 options_ast = { /* RETRO_LANGUAGE_BE */ -#define CATEGORY_SYSTEM_LABEL_BE NULL -#define CATEGORY_SYSTEM_INFO_0_BE NULL +#define CATEGORY_SYSTEM_LABEL_BE "Сістэма" +#define CATEGORY_SYSTEM_INFO_0_BE "Настройка рэгіёну, мовы, BIOS і асноўных параметраў абсталявання." #define CATEGORY_VIDEO_LABEL_BE "Відэа" -#define CATEGORY_VIDEO_INFO_0_BE NULL -#define CATEGORY_PERFORMANCE_LABEL_BE NULL -#define CATEGORY_PERFORMANCE_INFO_0_BE NULL -#define CATEGORY_HACKS_LABEL_BE NULL -#define CATEGORY_HACKS_INFO_0_BE NULL +#define CATEGORY_VIDEO_INFO_0_BE "Налады раздзялення, парадка-незалежнай празрыстасці і візуальных эфектаў." +#define CATEGORY_PERFORMANCE_LABEL_BE "Прадукцыйнасць" +#define CATEGORY_PERFORMANCE_INFO_0_BE "Настройкі шматпаточнага рэндэрынгу і пропуску кадраў." +#define CATEGORY_HACKS_LABEL_BE "Хакі эмуляцыі" +#define CATEGORY_HACKS_INFO_0_BE "Налады шырокафарматных чыт-кодаў, хуткасці загрузкі GD-ROM і замены тэкстураў." #define CATEGORY_INPUT_LABEL_BE "Увод" -#define CATEGORY_INPUT_INFO_0_BE NULL -#define CATEGORY_VMU_LABEL_BE NULL -#define CATEGORY_VMU_INFO_0_BE NULL +#define CATEGORY_INPUT_INFO_0_BE "Налады геймпада і светлавога пісталета." +#define CATEGORY_EXPANSIONS_LABEL_BE "Модулі пашырэння кантролераў" +#define CATEGORY_EXPANSIONS_INFO_0_BE "Выбар прылады (VMU, вібрапак), падлучанага да слотаў пашырэння кантролераў." +#define CATEGORY_VMU_LABEL_BE "Візуальныя карты памяці" +#define CATEGORY_VMU_INFO_0_BE "Настройкі файлаў захаванняў VMU для кожнай гульні і адлюстравання VMU на экране." #define CORE_OPTION_NAME_REGION_LABEL_BE "Рэгіён" -#define OPTION_VAL_JAPAN_BE NULL -#define OPTION_VAL_USA_BE NULL -#define OPTION_VAL_EUROPE_BE NULL -#define OPTION_VAL_DEFAULT_BE NULL +#define OPTION_VAL_JAPAN_BE "Японія" +#define OPTION_VAL_USA_BE "ЗША" +#define OPTION_VAL_EUROPE_BE "Еўропа" +#define OPTION_VAL_DEFAULT_BE "Прадвызначана" #define CORE_OPTION_NAME_LANGUAGE_LABEL_BE "Мова" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_BE NULL -#define OPTION_VAL_JAPANESE_BE NULL -#define OPTION_VAL_ENGLISH_BE NULL -#define OPTION_VAL_GERMAN_BE NULL -#define OPTION_VAL_FRENCH_BE NULL -#define OPTION_VAL_SPANISH_BE NULL -#define OPTION_VAL_ITALIAN_BE NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_BE NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_BE NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_BE NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_BE NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_BE NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_BE NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_BE NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_BE NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_BE NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_BE NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_BE NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_BE NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_BE NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_BE NULL -#define CORE_OPTION_NAME_UPNP_LABEL_BE NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_BE NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_BE NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_BE NULL -#define OPTION_VAL_320X240_BE NULL -#define OPTION_VAL_640X480_BE NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_BE "Выбар мовы, якая выкарыстоўваецца ў BIOS, а таксама ў любых гульнях з падтрымкай некалькіх моваў." +#define OPTION_VAL_JAPANESE_BE "Японская" +#define OPTION_VAL_ENGLISH_BE "Англійская" +#define OPTION_VAL_GERMAN_BE "Нямецкая" +#define OPTION_VAL_FRENCH_BE "Французская" +#define OPTION_VAL_SPANISH_BE "Іспанская" +#define OPTION_VAL_ITALIAN_BE "Італьянская" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_BE "Эмуляцыя BIOS (патрабуецца перазапуск)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_BE "Прымусова выкарыстоўваць высокаўзроўневую эмуляцыю BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_BE "Загружацца ў BIOS (патрабуецца перазапуск)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_BE "Загружацца непасрэдна ў меню Dreamcast BIOS." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_BE "Уключыць DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_BE "Уключае эмуляцыю гукавога DSP (лічбавага сігнальнага працэсара) Dreamcast. Паляпшае дакладнасць згенераванага гуку, але павялічвае сістэмныя патрабаванні." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_BE "Дазваляць сэрвісныя кнопкі аркадных гульняў" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_BE "Уключае кнопку SERVICE для ўваходу ў налады аўтаматаў аркадных гульняў." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_BE "Рэжым Free Play для гульняў NAOMI" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_BE "Змяняць наладкі манетызацыі для ўключэння бясплатнай гульні." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_BE "Эмуляцыя Broadband Adapter" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_BE "Эмуляваць замест мадэма шырокапалосны Ethernet-адаптар (патрабуецца перазапуск)" +#define CORE_OPTION_NAME_UPNP_LABEL_BE "Уключыць UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_BE "Выкарыстоўваць UPnP для аўтаматычнай наладкі вашага Інтэрнэт-роўтара для анлайн-гульняў." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_BE "Унутраная раздзяляльнасць" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_BE "Змяніць раздзяляльнасць рэндэрынгу." +#define OPTION_VAL_320X240_BE "320x240 (напалову)" +#define OPTION_VAL_640X480_BE "640x480 (родная)" #define OPTION_VAL_800X600_BE NULL #define OPTION_VAL_960X720_BE NULL #define OPTION_VAL_1024X768_BE NULL @@ -3725,216 +4153,266 @@ struct retro_core_options_v2 options_ast = { #define OPTION_VAL_11520X8640_BE NULL #define OPTION_VAL_12160X9120_BE NULL #define OPTION_VAL_12800X9600_BE NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_BE NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_BE NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_BE "Тып кабеля" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_BE "Тып выходнага сігналу. 'ТБ (кампазіт)' з'яўляецца найболей сумяшчальным." #define OPTION_VAL_VGA_BE NULL -#define OPTION_VAL_TV_RGB_BE NULL -#define OPTION_VAL_TV_COMPOSITE_BE NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_BE NULL +#define OPTION_VAL_TV_RGB_BE "ТБ (RGB)" +#define OPTION_VAL_TV_COMPOSITE_BE "ТБ (кампазітны)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_BE "Стандарт вяшчання" #define OPTION_VAL_NTSC_BE NULL -#define OPTION_VAL_PAL_BE NULL -#define OPTION_VAL_PAL_N_BE NULL -#define OPTION_VAL_PAL_M_BE NULL +#define OPTION_VAL_PAL_BE "PAL (свет)" +#define OPTION_VAL_PAL_N_BE "PAL-N (Аргенціна, Парагвай, Уругвай)" +#define OPTION_VAL_PAL_M_BE "PAL-M (Бразілія)" #define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_BE "Арыентацыя экрана" -#define OPTION_VAL_HORIZONTAL_BE NULL -#define OPTION_VAL_VERTICAL_BE NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_BE NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_BE NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_BE NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_BE NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_BE NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_BE NULL -#define OPTION_VAL_512MB_BE NULL -#define OPTION_VAL_1GB_BE NULL -#define OPTION_VAL_2GB_BE NULL -#define OPTION_VAL_4GB_BE NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_BE NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_BE NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_BE NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_BE NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_BE NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_BE NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_BE NULL -#define CORE_OPTION_NAME_FOG_LABEL_BE NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_BE NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_BE NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_BE NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_BE NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_BE NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_BE NULL -#define OPTION_VAL_1_BE NULL -#define OPTION_VAL_2_BE NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_BE NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_BE NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_BE NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_BE NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_BE NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_BE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_BE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_BE NULL -#define OPTION_VAL_2_O27_BE NULL +#define OPTION_VAL_HORIZONTAL_BE "Гарызантальная" +#define OPTION_VAL_VERTICAL_BE "Вертыкальная" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_BE "Альфа-сартаванне" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_BE "Выбар спосабу сартавання празрыстых палігонаў." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_BE "Па пластах (хуткая, найменш дакладная)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_BE "Па трыкутніках (стандартная)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_BE "Па пікселях (дакладная, самая павольная)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_BE "Памер назапашвальнага буфера пікселяў" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_BE "Вялікія значэнні могуць спатрэбіцца для правільнага адлюстравання высокіх раздзяленняў." +#define OPTION_VAL_512MB_BE "512 МБ" +#define OPTION_VAL_1GB_BE "1 ГБ" +#define OPTION_VAL_2GB_BE "2 ГБ" +#define OPTION_VAL_4GB_BE "4 ГБ" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_BE "Максімум празрыстых пластоў" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_BE "Для складаных сцэн могуць запатрабавацца больш высокія значэнні." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_BE "Поўная эмуляцыя фрэймбуфера" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_BE "Уключае поўную эмуляцыю кадравага буфера ў VRAM. Карысна для гульняў, якія наўпрост вырабляюць чытанне ці запіс фрэймбуфера ў VRAM. Пры ўключэнні ўнутранае раздзяленне будзе прымусова ўсталявана ў 640×480 і магчыма моцнае падзенне хуткасці." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_BE "Уключыць RTT буфер (рэндэру ў тэкстуру)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_BE "Капіюе адмаляваныя тэкстуры з GPU зваротна ў VRAM. Дадзеная настройка звычайна ўключана для гульняў, якія гэтага патрабуюць. Пры ўключэнні не выкарыстоўваецца маштабаванне рэндэрынгу тэкстураў і магчыма падзенне прадукцыйнасці." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_BE "Mip-тэкстураванне" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_BE "Можа павысіць прадукцыйнасць і знізіць мігаценне пры адлюстраванні на адлегласці паменшаных копій тэкстураў." +#define CORE_OPTION_NAME_FOG_LABEL_BE "Эфекты туману" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_BE "Мадыфікатар аб'ёму" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_BE "Функцыя графічнага працэсара Dreamcast, якая выкарыстоўваецца ў гульнях для адмалёўкі ценяў аб'ектаў. Па змаўчанні павінна быць уключана - уплыў на прадукцыйнасць звычайна мінімальны ці малазначны." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_BE "Анізатропнае фільтраванне" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_BE "Паляпшае якасць тэкстураў на паверхнях пад непрамымі кутамі агляду ў адносінах да камеры. Больш высокія значэнні падвышаюць патрабаванні да GPU. Змены налады ўступаюць у сілу пры перазапуску." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_BE "Згладжванне тэкстур" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_BE "Выбар метаду згладжвання тэкстураў. Выкарыстоўваецца для прымусовага фільтравання ўсіх тэкстураў, каб атрымаць больш дакладны (або згладжаны) малюнак. Любое значэнне, адрознае ад стандартнага можа прыводзіць да памылак рэндэрынгу. Для прымянення наладкі патрабуецца перазапуск." +#define OPTION_VAL_1_BE "Прымусова метадам бліжэйшага суседа" +#define OPTION_VAL_2_BE "Прымусова лінейнае" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_BE "Затрымліваць змену кадраў" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_BE "Дапамагае пазбегнуць мігацення экрана або скажэння заставак. Не рэкамендуецца на марудных платформах." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_BE "Вызначаць змену частаты кадраў" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_BE "Апавяшчаць франтэнд аб зменах унутранай частаты кадраў (напр. з 60 да 30 кад/хв). Паляпшае размеркаванне кадраў у гульнях з сталай частатой у 30 ці 20 кад/хв, але павінна быць выключана для гульняў з плывучым значэннем частаты кадраў (напр. Ecco the Dolphin, Unreal Tournament). Недаступна пры вкл. опцыі 'Аўтапропуск кадраў'." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_BE "Фільтр постапрацоўкі PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_BE "Робіць постапрацоўку выявы для імітацыі эфектаў, спецыфічных для GPU PowerVR2 і аналагавых відэасігналаў." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_BE "Апскейлінг тэкстур (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_BE "Паляпшае 2D піксель-арт з ручной адмалёўкай. Рэкамендуецца толькі для 2D-гульняў з піксельнай графікай." +#define OPTION_VAL_2_O26_BE NULL #define OPTION_VAL_4_BE NULL #define OPTION_VAL_6_BE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_BE NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_BE NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_BE NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_BE NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_BE NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_BE NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_BE NULL -#define OPTION_VAL_SOME_BE NULL -#define OPTION_VAL_MORE_BE NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_BE NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_BE NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_BE NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_BE NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_BE NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_BE NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_BE NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_BE NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_BE NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_BE NULL -#define OPTION_VAL_100_BE NULL -#define OPTION_VAL_110_BE NULL -#define OPTION_VAL_120_BE NULL -#define OPTION_VAL_130_BE NULL -#define OPTION_VAL_140_BE NULL -#define OPTION_VAL_150_BE NULL -#define OPTION_VAL_160_BE NULL -#define OPTION_VAL_170_BE NULL -#define OPTION_VAL_180_BE NULL -#define OPTION_VAL_190_BE NULL -#define OPTION_VAL_200_BE NULL -#define OPTION_VAL_210_BE NULL -#define OPTION_VAL_220_BE NULL -#define OPTION_VAL_230_BE NULL -#define OPTION_VAL_240_BE NULL -#define OPTION_VAL_250_BE NULL -#define OPTION_VAL_260_BE NULL -#define OPTION_VAL_270_BE NULL -#define OPTION_VAL_280_BE NULL -#define OPTION_VAL_290_BE NULL -#define OPTION_VAL_300_BE NULL -#define OPTION_VAL_310_BE NULL -#define OPTION_VAL_320_BE NULL -#define OPTION_VAL_330_BE NULL -#define OPTION_VAL_340_BE NULL -#define OPTION_VAL_350_BE NULL -#define OPTION_VAL_360_BE NULL -#define OPTION_VAL_370_BE NULL -#define OPTION_VAL_380_BE NULL -#define OPTION_VAL_390_BE NULL -#define OPTION_VAL_400_BE NULL -#define OPTION_VAL_410_BE NULL -#define OPTION_VAL_420_BE NULL -#define OPTION_VAL_430_BE NULL -#define OPTION_VAL_440_BE NULL -#define OPTION_VAL_450_BE NULL -#define OPTION_VAL_460_BE NULL -#define OPTION_VAL_470_BE NULL -#define OPTION_VAL_480_BE NULL -#define OPTION_VAL_490_BE NULL -#define OPTION_VAL_500_BE NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_BE NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_BE NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_BE NULL -#define OPTION_VAL_0_BE NULL -#define OPTION_VAL_5_BE NULL -#define OPTION_VAL_10_BE NULL -#define OPTION_VAL_15_BE NULL -#define OPTION_VAL_20_BE NULL -#define OPTION_VAL_25_BE NULL -#define OPTION_VAL_30_BE NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_BE NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_BE NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_BE NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_BE NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_BE NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_BE NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_BE NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_BE NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_BE NULL -#define OPTION_VAL_WHITE_BE NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_BE "Максімальны памер згладжаных тэкстураў пры апскейлінгу" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_BE "Ўстаноўка максімальнага памеру тэкстураў пры маштабаванні. Для тэкстураў з памерам больш зададзенага значэння маштабаванне не прымяняецца." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_BE "Натыўная глыбіня інтэрпаляцыі" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_BE "Дапамагае пры праблемах з глыбінёй і скажэннем тэкстураў на відэакартах AMD. У шэрагу выпадкаў таксама развязвае праблемы на відэакартах Intel." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_BE "Выпраўленне прасочвання пры апскейлінгу" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_BE "Дапамагае ў выпадку прасочвання тэкстураў пры маштабаванні. Адключэнне дапамагае выправіць скажэнні пікселяў пры апскейлінгу 2D-гульняў (MVC2, CVS, KOF і інш.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_BE "Рэндэрынг у асобным патоку" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_BE "Запускае графічны і цэнтральны працэсары ў розных патоках. Настойліва рэкамендуецца." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_BE "Аўтапропуск кадраў" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_BE "Аўтаматычна прапускаць кадры пры запаволенні эмулятара. Ужываецца толькі з уключанай опцыяй 'Рэндэрынг у асобным патоку'." +#define OPTION_VAL_SOME_BE "Звычайна" +#define OPTION_VAL_MORE_BE "Найбольшы" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_BE "Пропуск кадраў" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_BE "Устанаўлівае колькасць пропускаў кадраў паміж кадрамі якія адлюстроўваюцца." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_BE "Шырокаэкранныя чыт-коды (патрабуецца перазапуск)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_BE "Актывуе чыт-коды, якія дазваляюць адлюстроўваць некаторыя гульні ў фармаце шырокага экрана." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_BE "Шырокафарматны хак" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_BE "Адмалёўваць геаметрыю за межамі стандартных суадносін 4:3. Можа выклікаць скажэнні графікі ў пашыранай вобласці." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_BE "Хуткая загрузка GD-ROM (зніжае дакладнасць)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_BE "Паскарае загрузку GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_BE "Мод Dreamcast на 32 Мбайт АЗП" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_BE "Уключае мод для Dreamcast на 32 мегабайта АЗП. Можа ўплываць на сумяшчальнасць" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_BE "Разгон/запавольванне SH4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_BE "Змена стандартнай частаты працэсара SH4 у 200 Мгц. Зніжэнне частаты дапамагае для слабых платформаў. Разгон можа падвышаць частату кадраў у некаторых гульнях. Выкарыстоўвайце з асцярожнасцю." +#define OPTION_VAL_100_BE "100 МГц" +#define OPTION_VAL_110_BE "110 МГц" +#define OPTION_VAL_120_BE "120 МГц" +#define OPTION_VAL_130_BE "130 МГц" +#define OPTION_VAL_140_BE "140 МГц" +#define OPTION_VAL_150_BE "150 МГц" +#define OPTION_VAL_160_BE "160 МГц" +#define OPTION_VAL_170_BE "170 МГц" +#define OPTION_VAL_180_BE "180 МГц" +#define OPTION_VAL_190_BE "190 МГц" +#define OPTION_VAL_200_BE "200 МГц" +#define OPTION_VAL_210_BE "210 МГц" +#define OPTION_VAL_220_BE "220 МГц" +#define OPTION_VAL_230_BE "230 МГц" +#define OPTION_VAL_240_BE "240 МГц" +#define OPTION_VAL_250_BE "250 МГц" +#define OPTION_VAL_260_BE "260 МГц" +#define OPTION_VAL_270_BE "270 МГц" +#define OPTION_VAL_280_BE "280 МГц" +#define OPTION_VAL_290_BE "290 МГц" +#define OPTION_VAL_300_BE "300 МГц" +#define OPTION_VAL_310_BE "310 МГц" +#define OPTION_VAL_320_BE "320 МГц" +#define OPTION_VAL_330_BE "330 МГц" +#define OPTION_VAL_340_BE "340 МГц" +#define OPTION_VAL_350_BE "350 МГц" +#define OPTION_VAL_360_BE "360 МГц" +#define OPTION_VAL_370_BE "370 МГц" +#define OPTION_VAL_380_BE "380 МГц" +#define OPTION_VAL_390_BE "390 МГц" +#define OPTION_VAL_400_BE "400 МГц" +#define OPTION_VAL_410_BE "410 МГц" +#define OPTION_VAL_420_BE "420 МГц" +#define OPTION_VAL_430_BE "430 МГц" +#define OPTION_VAL_440_BE "440 МГц" +#define OPTION_VAL_450_BE "450 МГц" +#define OPTION_VAL_460_BE "460 МГц" +#define OPTION_VAL_470_BE "470 МГц" +#define OPTION_VAL_480_BE "480 МГц" +#define OPTION_VAL_490_BE "490 МГц" +#define OPTION_VAL_500_BE "500 МГц" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_BE "Загружаць карыстальніцкія тэкстуры" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_BE "Загружаць прыстасаваныя тэкстуры з тэчкі 'system/dc/textures//'." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_BE "Здымаць дамп тэкстур" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_BE "Пры кожным выкарыстанні гульнёй новай тэкстуры яна будзе захоўвацца ў файл .png у тэчцы 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_BE "Мёртвая зона аналагавага стыку" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_BE "Настройка велічыні адхілення аналагавага джойсціка для спрацоўвання." +#define OPTION_VAL_0_BE "0 %" +#define OPTION_VAL_5_BE "5 %" +#define OPTION_VAL_10_BE "10 %" +#define OPTION_VAL_15_BE "15 %" +#define OPTION_VAL_20_BE "20 %" +#define OPTION_VAL_25_BE "25 %" +#define OPTION_VAL_30_BE "30 %" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_BE "Мёртвая зона трыгераў" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_BE "Настройка ступені націску трыгераў для спрацоўвання." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_BE "Лічбавыя трыгеры" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_BE "Пры ўключэнні трыгеры будуць апрацоўвацца як стандартныя кнопкі, цалкам націснутыя ці не націснутыя, без прамежкавых палажэнняў." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_BE "Трансляваць лічбавыя сігналы" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_BE "Трансляваць падзеі лічбавага ўводу і стан вібрацыі ў TCP-порт 8000. Сумяшчальна з параметрам MAME \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_BE "Паказваць наладкі светлавога пісталета" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_BE "Уключае канфігурацыю параметраў прыцэла светлавога пісталета. Для прымянення наладкі патрабуецца пераключыць хуткае меню." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_BE "Маштабаванне прыцэлу пісталета" +#define OPTION_VAL_50_BE "50 %" +#define OPTION_VAL_60_BE "60 %" +#define OPTION_VAL_70_BE "70 %" +#define OPTION_VAL_80_BE "80 %" +#define OPTION_VAL_90_BE "90 %" +#define OPTION_VAL_100_O45_BE "100 %" +#define OPTION_VAL_110_O45_BE "110 %" +#define OPTION_VAL_120_O45_BE "120 %" +#define OPTION_VAL_130_O45_BE "130 %" +#define OPTION_VAL_140_O45_BE "140 %" +#define OPTION_VAL_150_O45_BE "150 %" +#define OPTION_VAL_160_O45_BE "160 %" +#define OPTION_VAL_170_O45_BE "170 %" +#define OPTION_VAL_180_O45_BE "180 %" +#define OPTION_VAL_190_O45_BE "190 %" +#define OPTION_VAL_200_O45_BE "200 %" +#define OPTION_VAL_210_O45_BE "210 %" +#define OPTION_VAL_220_O45_BE "220 %" +#define OPTION_VAL_230_O45_BE "230 %" +#define OPTION_VAL_240_O45_BE "240 %" +#define OPTION_VAL_250_O45_BE "250 %" +#define OPTION_VAL_260_O45_BE "260 %" +#define OPTION_VAL_270_O45_BE "270 %" +#define OPTION_VAL_280_O45_BE "280 %" +#define OPTION_VAL_290_O45_BE "290 %" +#define OPTION_VAL_300_O45_BE "300 %" +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_BE "Адлюстраванне прыцэла пісталета 1" +#define OPTION_VAL_WHITE_BE "Белы" #define OPTION_VAL_RED_BE "Чырвоная" #define OPTION_VAL_GREEN_BE "Зялёная" #define OPTION_VAL_BLUE_BE "Блакітная" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_BE NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_BE NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_BE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BE NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_BE "Адлюстраванне прыцэла пісталета 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_BE "Адлюстраванне прыцэла пісталета 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_BE "Адлюстраванне прыцэла пісталета 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_BE "Прылада ў слоце пашырэння A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння A1 (порт А слот 1)." +#define OPTION_VAL_VMU_BE NULL +#define OPTION_VAL_PURUPURU_BE "Вібрапак" +#define OPTION_VAL_NONE_BE "Няма" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_BE "Прылада ў слоце пашырэння A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння A2 (порт А слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_BE "Прылада ў слоце пашырэння B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння B1 (порт B слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_BE "Прылада ў слоце пашырэння B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння B2 (порт B слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_BE "Прылада ў слоце пашырэння C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння C1 (порт C слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_BE "Прылада ў слоце пашырэння C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння C2 (порт C слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_BE "Прылада ў слоце пашырэння D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння D1 (порт D слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_BE "Прылада ў слоце пашырэння D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_BE "Выбар прылады, уключанай у слот пашырэння D2 (порт D слот 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BE "Асобныя візуальныя карты памяці (VMU) для гульняў" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BE "VMU для кожнай гульні" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BE "Калі выключана, усе гульні выкарыстоўваюць да 8 файлаў захавання VMU (A1/A2/B1/B2/C1/C2/D1/D2), размешчаных у сістэмнай тэчцы RetroArch.\nНалада 'VMU A1' стварае на кожную запушчаную гульню ўнікальны файл VMU 'A1' у тэчцы захавання RetroArch.\nНалада 'Усе VMU' стварае да 8 унікальных файлаў VMU (A1/A2/B1/B2/C1/C2/D1/D2) на кожную запушчаную гульню." #define OPTION_VAL_VMU_A1_BE NULL -#define OPTION_VAL_ALL_VMUS_BE NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BE NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_BE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BE NULL -#define OPTION_VAL_UPPER_LEFT_BE NULL -#define OPTION_VAL_UPPER_RIGHT_BE NULL -#define OPTION_VAL_LOWER_LEFT_BE NULL -#define OPTION_VAL_LOWER_RIGHT_BE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BE NULL +#define OPTION_VAL_ALL_VMUS_BE "Усе VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_BE "Гукавыя сігналы візуальных карт памяці (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BE "Сігналы VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_BE "Уключае прайграванне сігналаў VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BE "Паказваць настройкі адлюстравання візуальных карт памяці (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BE "Паказваць наладкі адлюстравання VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BE "Уключае канфігурацыю памеру, становішча, колеру і бачнасці якая эмулюецца LCD-экранам VMU. Для прымянення наладкі патрабуецца пераключэнне хуткага меню." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BE "Паказаць экран VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BE "Палажэнне экрана VMU 1" +#define OPTION_VAL_UPPER_LEFT_BE "Зверху злева" +#define OPTION_VAL_UPPER_RIGHT_BE "Зверху справа" +#define OPTION_VAL_LOWER_LEFT_BE "Унізе злева" +#define OPTION_VAL_LOWER_RIGHT_BE "Унізе справа" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BE "Памер экрана VMU 1" #define OPTION_VAL_1X_BE NULL #define OPTION_VAL_3X_BE NULL #define OPTION_VAL_5X_BE NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BE NULL -#define OPTION_VAL_DEFAULT_ON_00_BE NULL -#define OPTION_VAL_DEFAULT_OFF_01_BE NULL -#define OPTION_VAL_BLACK_02_BE NULL -#define OPTION_VAL_LIGHT_BLUE_04_BE NULL -#define OPTION_VAL_CYAN_06_BE NULL -#define OPTION_VAL_CYAN_BLUE_07_BE NULL -#define OPTION_VAL_LIGHT_GREEN_08_BE NULL -#define OPTION_VAL_CYAN_GREEN_09_BE NULL -#define OPTION_VAL_LIGHT_CYAN_10_BE NULL -#define OPTION_VAL_PURPLE_12_BE NULL -#define OPTION_VAL_LIGHT_PURPLE_13_BE NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BE "Колер уключаных пікселяў VMU 1" +#define OPTION_VAL_DEFAULT_ON_00_BE "Па змаўчанні ЎКЛ" +#define OPTION_VAL_DEFAULT_OFF_01_BE "Па змаўчанні ВЫКЛ" +#define OPTION_VAL_BLACK_02_BE "Чорны" +#define OPTION_VAL_LIGHT_BLUE_04_BE "Светла-блакітны" +#define OPTION_VAL_CYAN_06_BE "Марской хвалі" +#define OPTION_VAL_CYAN_BLUE_07_BE "Блакітна-сіні" +#define OPTION_VAL_LIGHT_GREEN_08_BE "Светла-зялёны" +#define OPTION_VAL_CYAN_GREEN_09_BE "Блакітна-зялёны" +#define OPTION_VAL_LIGHT_CYAN_10_BE "Светла-блакітны" +#define OPTION_VAL_PURPLE_12_BE "Фіялетавы" +#define OPTION_VAL_LIGHT_PURPLE_13_BE "Светла-фіялетавы" #define OPTION_VAL_YELLOW_14_BE "Жоўтая" -#define OPTION_VAL_GRAY_15_BE NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_BE NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_BE NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_BE NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_BE NULL -#define OPTION_VAL_LIGHT_RED_2_20_BE NULL -#define OPTION_VAL_MAGENTA_21_BE NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_BE NULL -#define OPTION_VAL_LIGHT_ORANGE_23_BE NULL -#define OPTION_VAL_ORANGE_24_BE NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_BE NULL -#define OPTION_VAL_LIGHT_YELLOW_26_BE NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_BE NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BE NULL -#define OPTION_VAL_40_BE NULL -#define OPTION_VAL_50_BE NULL -#define OPTION_VAL_60_BE NULL -#define OPTION_VAL_70_BE NULL -#define OPTION_VAL_80_BE NULL -#define OPTION_VAL_90_BE NULL -#define OPTION_VAL_100_O57_BE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_BE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_BE NULL +#define OPTION_VAL_GRAY_15_BE "Шэры" +#define OPTION_VAL_LIGHT_PURPLE_2_16_BE "Светла-фіялетавы (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_BE "Светла-зялёны (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_BE "Светла-зялёны (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_BE "Светла-блакітны (2)" +#define OPTION_VAL_LIGHT_RED_2_20_BE "Светла-чырвоны (2)" +#define OPTION_VAL_MAGENTA_21_BE "Пурпурны" +#define OPTION_VAL_LIGHT_PURPLE_3_22_BE "Светла-фіялетавы (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_BE "Светла-аранжавы" +#define OPTION_VAL_ORANGE_24_BE "Аранжавы" +#define OPTION_VAL_LIGHT_PURPLE_4_25_BE "Светла-фіялетавы (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_BE "Светла-жоўты" +#define OPTION_VAL_LIGHT_YELLOW_2_27_BE "Светла-жоўты (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BE "Колер выключаных пікселяў VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BE "Бачнасць экрана VMU 1" +#define OPTION_VAL_40_BE "40 %" +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BE "Паказаць экран VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BE "Палажэнне экрана VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BE "Памер экрана VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BE "Колер уключаных пікселяў VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_BE "Колер выключаных пікселяў VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_BE "Бачнасць экрана VMU 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_BE "Паказаць экран VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_BE "Палажэнне экрана VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_BE "Памер экрана VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_BE "Колер уключаных пікселяў VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_BE "Колер выключаных пікселяў VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_BE "Бачнасць экрана VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_BE "Паказаць экран VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_BE "Палажэнне экрана VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_BE "Памер экрана VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_BE "Колер уключаных пікселяў VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_BE "Колер выключаных пікселяў VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_BE "Бачнасць экрана VMU 4" struct retro_core_option_v2_category option_cats_be[] = { { @@ -3962,6 +4440,11 @@ struct retro_core_option_v2_category option_cats_be[] = { CATEGORY_INPUT_LABEL_BE, CATEGORY_INPUT_INFO_0_BE }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_BE, + CATEGORY_EXPANSIONS_INFO_0_BE + }, { "vmu", CATEGORY_VMU_LABEL_BE, @@ -4051,20 +4534,6 @@ struct retro_core_option_v2_definition option_defs_be[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_BE, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_BE, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_BE, @@ -4211,11 +4680,11 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_BE, NULL, "video", { @@ -4261,6 +4730,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -4295,11 +4765,11 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_BE, NULL, "video", { @@ -4381,7 +4851,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -4421,18 +4891,18 @@ struct retro_core_option_v2_definition option_defs_be[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_BE }, + { "2", OPTION_VAL_2_O26_BE }, { "4", OPTION_VAL_4_BE }, { "6", OPTION_VAL_6_BE }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_BE, NULL, "video", { @@ -4458,6 +4928,20 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_BE, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_BE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_BE, @@ -4556,6 +5040,20 @@ struct retro_core_option_v2_definition option_defs_be[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_BE, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_BE, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_BE, @@ -4613,7 +5111,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_BE, NULL, "hacks", { @@ -4623,11 +5121,11 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_BE, NULL, "hacks", { @@ -4641,7 +5139,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_BE, NULL, "input", { @@ -4660,7 +5158,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_BE, NULL, "input", { @@ -4679,7 +5177,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_BE, NULL, "input", { @@ -4689,20 +5187,6 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_BE, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_BE, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_BE, @@ -4731,6 +5215,44 @@ struct retro_core_option_v2_definition option_defs_be[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_BE, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_BE }, + { "60%", OPTION_VAL_60_BE }, + { "70%", OPTION_VAL_70_BE }, + { "80%", OPTION_VAL_80_BE }, + { "90%", OPTION_VAL_90_BE }, + { "100%", OPTION_VAL_100_O45_BE }, + { "110%", OPTION_VAL_110_O45_BE }, + { "120%", OPTION_VAL_120_O45_BE }, + { "130%", OPTION_VAL_130_O45_BE }, + { "140%", OPTION_VAL_140_O45_BE }, + { "150%", OPTION_VAL_150_O45_BE }, + { "160%", OPTION_VAL_160_O45_BE }, + { "170%", OPTION_VAL_170_O45_BE }, + { "180%", OPTION_VAL_180_O45_BE }, + { "190%", OPTION_VAL_190_O45_BE }, + { "200%", OPTION_VAL_200_O45_BE }, + { "210%", OPTION_VAL_210_O45_BE }, + { "220%", OPTION_VAL_220_O45_BE }, + { "230%", OPTION_VAL_230_O45_BE }, + { "240%", OPTION_VAL_240_O45_BE }, + { "250%", OPTION_VAL_250_O45_BE }, + { "260%", OPTION_VAL_260_O45_BE }, + { "270%", OPTION_VAL_270_O45_BE }, + { "280%", OPTION_VAL_280_O45_BE }, + { "290%", OPTION_VAL_290_O45_BE }, + { "300%", OPTION_VAL_300_O45_BE }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_BE, @@ -4800,201 +5322,170 @@ struct retro_core_option_v2_definition option_defs_be[] = { "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BE, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_BE, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_BE, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_BE }, - { "All VMUs", OPTION_VAL_ALL_VMUS_BE }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_BE, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BE, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_BE, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_BE, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_BE, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BE, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_BE, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_BE, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BE, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_BE, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BE, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_BE, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_BE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_BE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_BE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_BE }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BE, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_BE, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_BE }, - { "2x", OPTION_VAL_2_O27_BE }, - { "3x", OPTION_VAL_3X_BE }, - { "4x", OPTION_VAL_4_BE }, - { "5x", OPTION_VAL_5X_BE }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BE, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_BE, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BE }, - { "BLACK 02", OPTION_VAL_BLACK_02_BE }, - { "BLUE 03", OPTION_VAL_BLUE_BE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BE }, - { "GREEN 05", OPTION_VAL_GREEN_BE }, - { "CYAN 06", OPTION_VAL_CYAN_06_BE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BE }, - { "RED 11", OPTION_VAL_RED_BE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_BE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_BE }, - { "GRAY 15", OPTION_VAL_GRAY_15_BE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_BE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BE }, - { "WHITE 28", OPTION_VAL_WHITE_BE }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BE, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_BE, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_BE, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BE }, - { "BLACK 02", OPTION_VAL_BLACK_02_BE }, - { "BLUE 03", OPTION_VAL_BLUE_BE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BE }, - { "GREEN 05", OPTION_VAL_GREEN_BE }, - { "CYAN 06", OPTION_VAL_CYAN_06_BE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BE }, - { "RED 11", OPTION_VAL_RED_BE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_BE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_BE }, - { "GRAY 15", OPTION_VAL_GRAY_15_BE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_BE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BE }, - { "WHITE 28", OPTION_VAL_WHITE_BE }, + { "VMU", OPTION_VAL_VMU_BE }, + { "Purupuru", OPTION_VAL_PURUPURU_BE }, + { "None", OPTION_VAL_NONE_BE }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BE, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BE, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_BE }, + { "All VMUs", OPTION_VAL_ALL_VMUS_BE }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_BE, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BE, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_BE, NULL, "vmu", { - { "10%", OPTION_VAL_10_BE }, - { "20%", OPTION_VAL_20_BE }, - { "30%", OPTION_VAL_30_BE }, - { "40%", OPTION_VAL_40_BE }, - { "50%", OPTION_VAL_50_BE }, - { "60%", OPTION_VAL_60_BE }, - { "70%", OPTION_VAL_70_BE }, - { "80%", OPTION_VAL_80_BE }, - { "90%", OPTION_VAL_90_BE }, - { "100%", OPTION_VAL_100_O57_BE }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BE, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BE, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BE, NULL, "", NULL, @@ -5007,8 +5498,8 @@ struct retro_core_option_v2_definition option_defs_be[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BE, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BE, NULL, "", NULL, @@ -5023,15 +5514,15 @@ struct retro_core_option_v2_definition option_defs_be[] = { "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BE, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BE, NULL, "", NULL, "vmu", { { "1x", OPTION_VAL_1X_BE }, - { "2x", OPTION_VAL_2_O27_BE }, + { "2x", OPTION_VAL_2_O26_BE }, { "3x", OPTION_VAL_3X_BE }, { "4x", OPTION_VAL_4_BE }, { "5x", OPTION_VAL_5X_BE }, @@ -5040,8 +5531,159 @@ struct retro_core_option_v2_definition option_defs_be[] = { "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BE, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BE }, + { "BLACK 02", OPTION_VAL_BLACK_02_BE }, + { "BLUE 03", OPTION_VAL_BLUE_BE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BE }, + { "GREEN 05", OPTION_VAL_GREEN_BE }, + { "CYAN 06", OPTION_VAL_CYAN_06_BE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BE }, + { "RED 11", OPTION_VAL_RED_BE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BE }, + { "GRAY 15", OPTION_VAL_GRAY_15_BE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BE }, + { "WHITE 28", OPTION_VAL_WHITE_BE }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BE }, + { "BLACK 02", OPTION_VAL_BLACK_02_BE }, + { "BLUE 03", OPTION_VAL_BLUE_BE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BE }, + { "GREEN 05", OPTION_VAL_GREEN_BE }, + { "CYAN 06", OPTION_VAL_CYAN_06_BE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BE }, + { "RED 11", OPTION_VAL_RED_BE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BE }, + { "GRAY 15", OPTION_VAL_GRAY_15_BE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BE }, + { "WHITE 28", OPTION_VAL_WHITE_BE }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_BE }, + { "20%", OPTION_VAL_20_BE }, + { "30%", OPTION_VAL_30_BE }, + { "40%", OPTION_VAL_40_BE }, + { "50%", OPTION_VAL_50_BE }, + { "60%", OPTION_VAL_60_BE }, + { "70%", OPTION_VAL_70_BE }, + { "80%", OPTION_VAL_80_BE }, + { "90%", OPTION_VAL_90_BE }, + { "100%", OPTION_VAL_100_O45_BE }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_BE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_BE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_BE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_BE }, + { NULL, NULL }, + }, + "Upper Right", + }, + { + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BE, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_BE }, + { "2x", OPTION_VAL_2_O26_BE }, + { "3x", OPTION_VAL_3X_BE }, + { "4x", OPTION_VAL_4_BE }, + { "5x", OPTION_VAL_5X_BE }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BE, NULL, "", NULL, @@ -5138,7 +5780,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "70%", OPTION_VAL_70_BE }, { "80%", OPTION_VAL_80_BE }, { "90%", OPTION_VAL_90_BE }, - { "100%", OPTION_VAL_100_O57_BE }, + { "100%", OPTION_VAL_100_O45_BE }, { NULL, NULL }, }, "100%", @@ -5171,7 +5813,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_BE }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -5182,7 +5824,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { "vmu", { { "1x", OPTION_VAL_1X_BE }, - { "2x", OPTION_VAL_2_O27_BE }, + { "2x", OPTION_VAL_2_O26_BE }, { "3x", OPTION_VAL_3X_BE }, { "4x", OPTION_VAL_4_BE }, { "5x", OPTION_VAL_5X_BE }, @@ -5289,7 +5931,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "70%", OPTION_VAL_70_BE }, { "80%", OPTION_VAL_80_BE }, { "90%", OPTION_VAL_90_BE }, - { "100%", OPTION_VAL_100_O57_BE }, + { "100%", OPTION_VAL_100_O45_BE }, { NULL, NULL }, }, "100%", @@ -5322,7 +5964,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_BE }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -5333,7 +5975,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { "vmu", { { "1x", OPTION_VAL_1X_BE }, - { "2x", OPTION_VAL_2_O27_BE }, + { "2x", OPTION_VAL_2_O26_BE }, { "3x", OPTION_VAL_3X_BE }, { "4x", OPTION_VAL_4_BE }, { "5x", OPTION_VAL_5X_BE }, @@ -5440,7 +6082,7 @@ struct retro_core_option_v2_definition option_defs_be[] = { { "70%", OPTION_VAL_70_BE }, { "80%", OPTION_VAL_80_BE }, { "90%", OPTION_VAL_90_BE }, - { "100%", OPTION_VAL_100_O57_BE }, + { "100%", OPTION_VAL_100_O45_BE }, { NULL, NULL }, }, "100%", @@ -5452,363 +6094,418 @@ struct retro_core_options_v2 options_be = { option_defs_be }; -/* RETRO_LANGUAGE_CA */ +/* RETRO_LANGUAGE_BG */ -#define CATEGORY_SYSTEM_LABEL_CA "Sistema" -#define CATEGORY_SYSTEM_INFO_0_CA NULL -#define CATEGORY_VIDEO_LABEL_CA "Vídeo" -#define CATEGORY_VIDEO_INFO_0_CA NULL -#define CATEGORY_PERFORMANCE_LABEL_CA "Rendiment" -#define CATEGORY_PERFORMANCE_INFO_0_CA NULL -#define CATEGORY_HACKS_LABEL_CA NULL -#define CATEGORY_HACKS_INFO_0_CA NULL -#define CATEGORY_INPUT_LABEL_CA "Dispositius de joc" -#define CATEGORY_INPUT_INFO_0_CA NULL -#define CATEGORY_VMU_LABEL_CA NULL -#define CATEGORY_VMU_INFO_0_CA NULL -#define CORE_OPTION_NAME_REGION_LABEL_CA "Regió" -#define OPTION_VAL_JAPAN_CA NULL -#define OPTION_VAL_USA_CA NULL -#define OPTION_VAL_EUROPE_CA NULL -#define OPTION_VAL_DEFAULT_CA NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_CA "Llengua" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CA NULL -#define OPTION_VAL_JAPANESE_CA NULL -#define OPTION_VAL_ENGLISH_CA NULL -#define OPTION_VAL_GERMAN_CA NULL -#define OPTION_VAL_FRENCH_CA NULL -#define OPTION_VAL_SPANISH_CA NULL -#define OPTION_VAL_ITALIAN_CA NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CA NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_CA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CA NULL -#define CORE_OPTION_NAME_UPNP_LABEL_CA NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_CA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CA "Resolució Interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CA NULL -#define OPTION_VAL_320X240_CA "320×240" -#define OPTION_VAL_640X480_CA "640×480" -#define OPTION_VAL_800X600_CA "800×600" -#define OPTION_VAL_960X720_CA "960×720" -#define OPTION_VAL_1024X768_CA "1024×768" -#define OPTION_VAL_1280X960_CA "1280×960" -#define OPTION_VAL_1440X1080_CA "1440×1080" -#define OPTION_VAL_1600X1200_CA "1600×1200" -#define OPTION_VAL_1920X1440_CA "1920×1440" -#define OPTION_VAL_2560X1920_CA "2560×1920" -#define OPTION_VAL_2880X2160_CA "2880×2160" -#define OPTION_VAL_3200X2400_CA "3200×2400" -#define OPTION_VAL_3840X2880_CA "3840×2880" -#define OPTION_VAL_4480X3360_CA "4480×3360" -#define OPTION_VAL_5120X3840_CA "5120×3840" -#define OPTION_VAL_5760X4320_CA "5760×4320" -#define OPTION_VAL_6400X4800_CA "6400×4800" -#define OPTION_VAL_7040X5280_CA "7040×5280" -#define OPTION_VAL_7680X5760_CA "7680×5760" -#define OPTION_VAL_8320X6240_CA "8320×6240" -#define OPTION_VAL_8960X6720_CA "8960×6720" -#define OPTION_VAL_9600X7200_CA "9600×7200" -#define OPTION_VAL_10240X7680_CA "10240×7680" -#define OPTION_VAL_10880X8160_CA "10880×8160" -#define OPTION_VAL_11520X8640_CA "11520×8640" -#define OPTION_VAL_12160X9120_CA "12160×9120" -#define OPTION_VAL_12800X9600_CA "12800×9600" -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CA NULL -#define OPTION_VAL_VGA_CA NULL -#define OPTION_VAL_TV_RGB_CA NULL -#define OPTION_VAL_TV_COMPOSITE_CA NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_CA NULL -#define OPTION_VAL_NTSC_CA NULL -#define OPTION_VAL_PAL_CA NULL -#define OPTION_VAL_PAL_N_CA NULL -#define OPTION_VAL_PAL_M_CA NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CA "Orientació de la pantalla" -#define OPTION_VAL_HORIZONTAL_CA NULL -#define OPTION_VAL_VERTICAL_CA NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CA NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CA NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_CA NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_CA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CA NULL -#define OPTION_VAL_512MB_CA NULL -#define OPTION_VAL_1GB_CA NULL -#define OPTION_VAL_2GB_CA NULL -#define OPTION_VAL_4GB_CA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CA NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CA NULL -#define CORE_OPTION_NAME_FOG_LABEL_CA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CA NULL -#define OPTION_VAL_1_CA NULL -#define OPTION_VAL_2_CA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CA NULL -#define OPTION_VAL_2_O27_CA NULL -#define OPTION_VAL_4_CA NULL -#define OPTION_VAL_6_CA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CA NULL -#define OPTION_VAL_SOME_CA NULL -#define OPTION_VAL_MORE_CA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CA NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CA NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CA NULL -#define OPTION_VAL_100_CA NULL -#define OPTION_VAL_110_CA NULL -#define OPTION_VAL_120_CA NULL -#define OPTION_VAL_130_CA NULL -#define OPTION_VAL_140_CA NULL -#define OPTION_VAL_150_CA NULL -#define OPTION_VAL_160_CA NULL -#define OPTION_VAL_170_CA NULL -#define OPTION_VAL_180_CA NULL -#define OPTION_VAL_190_CA NULL -#define OPTION_VAL_200_CA NULL -#define OPTION_VAL_210_CA NULL -#define OPTION_VAL_220_CA NULL -#define OPTION_VAL_230_CA NULL -#define OPTION_VAL_240_CA NULL -#define OPTION_VAL_250_CA NULL -#define OPTION_VAL_260_CA NULL -#define OPTION_VAL_270_CA NULL -#define OPTION_VAL_280_CA NULL -#define OPTION_VAL_290_CA NULL -#define OPTION_VAL_300_CA NULL -#define OPTION_VAL_310_CA NULL -#define OPTION_VAL_320_CA NULL -#define OPTION_VAL_330_CA NULL -#define OPTION_VAL_340_CA NULL -#define OPTION_VAL_350_CA NULL -#define OPTION_VAL_360_CA NULL -#define OPTION_VAL_370_CA NULL -#define OPTION_VAL_380_CA NULL -#define OPTION_VAL_390_CA NULL -#define OPTION_VAL_400_CA NULL -#define OPTION_VAL_410_CA NULL -#define OPTION_VAL_420_CA NULL -#define OPTION_VAL_430_CA NULL -#define OPTION_VAL_440_CA NULL -#define OPTION_VAL_450_CA NULL -#define OPTION_VAL_460_CA NULL -#define OPTION_VAL_470_CA NULL -#define OPTION_VAL_480_CA NULL -#define OPTION_VAL_490_CA NULL -#define OPTION_VAL_500_CA NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CA NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CA NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CA NULL -#define OPTION_VAL_0_CA NULL -#define OPTION_VAL_5_CA NULL -#define OPTION_VAL_10_CA NULL -#define OPTION_VAL_15_CA NULL -#define OPTION_VAL_20_CA NULL -#define OPTION_VAL_25_CA NULL -#define OPTION_VAL_30_CA NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CA NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CA NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CA NULL -#define OPTION_VAL_WHITE_CA NULL -#define OPTION_VAL_RED_CA NULL -#define OPTION_VAL_GREEN_CA NULL -#define OPTION_VAL_BLUE_CA NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CA NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CA NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CA NULL -#define OPTION_VAL_VMU_A1_CA NULL -#define OPTION_VAL_ALL_VMUS_CA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CA NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CA NULL -#define OPTION_VAL_UPPER_LEFT_CA NULL -#define OPTION_VAL_UPPER_RIGHT_CA NULL -#define OPTION_VAL_LOWER_LEFT_CA NULL -#define OPTION_VAL_LOWER_RIGHT_CA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CA NULL -#define OPTION_VAL_1X_CA NULL -#define OPTION_VAL_3X_CA NULL -#define OPTION_VAL_5X_CA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CA NULL -#define OPTION_VAL_DEFAULT_ON_00_CA NULL -#define OPTION_VAL_DEFAULT_OFF_01_CA NULL -#define OPTION_VAL_BLACK_02_CA NULL -#define OPTION_VAL_LIGHT_BLUE_04_CA NULL -#define OPTION_VAL_CYAN_06_CA NULL -#define OPTION_VAL_CYAN_BLUE_07_CA NULL -#define OPTION_VAL_LIGHT_GREEN_08_CA NULL -#define OPTION_VAL_CYAN_GREEN_09_CA NULL -#define OPTION_VAL_LIGHT_CYAN_10_CA NULL -#define OPTION_VAL_PURPLE_12_CA NULL -#define OPTION_VAL_LIGHT_PURPLE_13_CA NULL -#define OPTION_VAL_YELLOW_14_CA NULL -#define OPTION_VAL_GRAY_15_CA NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_CA NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_CA NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_CA NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_CA NULL -#define OPTION_VAL_LIGHT_RED_2_20_CA NULL -#define OPTION_VAL_MAGENTA_21_CA NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_CA NULL -#define OPTION_VAL_LIGHT_ORANGE_23_CA NULL -#define OPTION_VAL_ORANGE_24_CA NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_CA NULL -#define OPTION_VAL_LIGHT_YELLOW_26_CA NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_CA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CA NULL -#define OPTION_VAL_40_CA NULL -#define OPTION_VAL_50_CA NULL -#define OPTION_VAL_60_CA NULL -#define OPTION_VAL_70_CA NULL -#define OPTION_VAL_80_CA NULL -#define OPTION_VAL_90_CA NULL -#define OPTION_VAL_100_O57_CA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CA NULL +#define CATEGORY_SYSTEM_LABEL_BG NULL +#define CATEGORY_SYSTEM_INFO_0_BG NULL +#define CATEGORY_VIDEO_LABEL_BG "Видео" +#define CATEGORY_VIDEO_INFO_0_BG NULL +#define CATEGORY_PERFORMANCE_LABEL_BG NULL +#define CATEGORY_PERFORMANCE_INFO_0_BG NULL +#define CATEGORY_HACKS_LABEL_BG NULL +#define CATEGORY_HACKS_INFO_0_BG NULL +#define CATEGORY_INPUT_LABEL_BG "Вход" +#define CATEGORY_INPUT_INFO_0_BG NULL +#define CATEGORY_EXPANSIONS_LABEL_BG NULL +#define CATEGORY_EXPANSIONS_INFO_0_BG NULL +#define CATEGORY_VMU_LABEL_BG NULL +#define CATEGORY_VMU_INFO_0_BG NULL +#define CORE_OPTION_NAME_REGION_LABEL_BG NULL +#define OPTION_VAL_JAPAN_BG NULL +#define OPTION_VAL_USA_BG NULL +#define OPTION_VAL_EUROPE_BG NULL +#define OPTION_VAL_DEFAULT_BG NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_BG NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_BG NULL +#define OPTION_VAL_JAPANESE_BG NULL +#define OPTION_VAL_ENGLISH_BG NULL +#define OPTION_VAL_GERMAN_BG NULL +#define OPTION_VAL_FRENCH_BG NULL +#define OPTION_VAL_SPANISH_BG NULL +#define OPTION_VAL_ITALIAN_BG NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_BG NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_BG NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_BG NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_BG NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_BG NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_BG NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_BG NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_BG NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_BG NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_BG NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_BG NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_BG NULL +#define CORE_OPTION_NAME_UPNP_LABEL_BG NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_BG NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_BG NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_BG NULL +#define OPTION_VAL_320X240_BG NULL +#define OPTION_VAL_640X480_BG NULL +#define OPTION_VAL_800X600_BG NULL +#define OPTION_VAL_960X720_BG NULL +#define OPTION_VAL_1024X768_BG NULL +#define OPTION_VAL_1280X960_BG NULL +#define OPTION_VAL_1440X1080_BG NULL +#define OPTION_VAL_1600X1200_BG NULL +#define OPTION_VAL_1920X1440_BG NULL +#define OPTION_VAL_2560X1920_BG NULL +#define OPTION_VAL_2880X2160_BG NULL +#define OPTION_VAL_3200X2400_BG NULL +#define OPTION_VAL_3840X2880_BG NULL +#define OPTION_VAL_4480X3360_BG NULL +#define OPTION_VAL_5120X3840_BG NULL +#define OPTION_VAL_5760X4320_BG NULL +#define OPTION_VAL_6400X4800_BG NULL +#define OPTION_VAL_7040X5280_BG NULL +#define OPTION_VAL_7680X5760_BG NULL +#define OPTION_VAL_8320X6240_BG NULL +#define OPTION_VAL_8960X6720_BG NULL +#define OPTION_VAL_9600X7200_BG NULL +#define OPTION_VAL_10240X7680_BG NULL +#define OPTION_VAL_10880X8160_BG NULL +#define OPTION_VAL_11520X8640_BG NULL +#define OPTION_VAL_12160X9120_BG NULL +#define OPTION_VAL_12800X9600_BG NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_BG NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_BG NULL +#define OPTION_VAL_VGA_BG NULL +#define OPTION_VAL_TV_RGB_BG NULL +#define OPTION_VAL_TV_COMPOSITE_BG NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_BG NULL +#define OPTION_VAL_NTSC_BG NULL +#define OPTION_VAL_PAL_BG NULL +#define OPTION_VAL_PAL_N_BG NULL +#define OPTION_VAL_PAL_M_BG NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_BG NULL +#define OPTION_VAL_HORIZONTAL_BG NULL +#define OPTION_VAL_VERTICAL_BG NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_BG NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_BG NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_BG NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_BG NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_BG NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_BG NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_BG NULL +#define OPTION_VAL_512MB_BG NULL +#define OPTION_VAL_1GB_BG NULL +#define OPTION_VAL_2GB_BG NULL +#define OPTION_VAL_4GB_BG NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_BG NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_BG NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_BG NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_BG NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_BG NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_BG NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_BG NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_BG NULL +#define CORE_OPTION_NAME_FOG_LABEL_BG NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_BG NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_BG NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_BG NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_BG NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_BG NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_BG NULL +#define OPTION_VAL_1_BG NULL +#define OPTION_VAL_2_BG NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_BG NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_BG NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_BG NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_BG NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_BG NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_BG NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_BG NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_BG NULL +#define OPTION_VAL_2_O26_BG NULL +#define OPTION_VAL_4_BG NULL +#define OPTION_VAL_6_BG NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_BG NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_BG NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_BG NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_BG NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_BG NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_BG NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_BG NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_BG NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_BG NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_BG NULL +#define OPTION_VAL_SOME_BG NULL +#define OPTION_VAL_MORE_BG NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_BG NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_BG NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_BG NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_BG NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_BG NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_BG NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_BG NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_BG NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_BG NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_BG NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_BG NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_BG NULL +#define OPTION_VAL_100_BG NULL +#define OPTION_VAL_110_BG NULL +#define OPTION_VAL_120_BG NULL +#define OPTION_VAL_130_BG NULL +#define OPTION_VAL_140_BG NULL +#define OPTION_VAL_150_BG NULL +#define OPTION_VAL_160_BG NULL +#define OPTION_VAL_170_BG NULL +#define OPTION_VAL_180_BG NULL +#define OPTION_VAL_190_BG NULL +#define OPTION_VAL_200_BG NULL +#define OPTION_VAL_210_BG NULL +#define OPTION_VAL_220_BG NULL +#define OPTION_VAL_230_BG NULL +#define OPTION_VAL_240_BG NULL +#define OPTION_VAL_250_BG NULL +#define OPTION_VAL_260_BG NULL +#define OPTION_VAL_270_BG NULL +#define OPTION_VAL_280_BG NULL +#define OPTION_VAL_290_BG NULL +#define OPTION_VAL_300_BG NULL +#define OPTION_VAL_310_BG NULL +#define OPTION_VAL_320_BG NULL +#define OPTION_VAL_330_BG NULL +#define OPTION_VAL_340_BG NULL +#define OPTION_VAL_350_BG NULL +#define OPTION_VAL_360_BG NULL +#define OPTION_VAL_370_BG NULL +#define OPTION_VAL_380_BG NULL +#define OPTION_VAL_390_BG NULL +#define OPTION_VAL_400_BG NULL +#define OPTION_VAL_410_BG NULL +#define OPTION_VAL_420_BG NULL +#define OPTION_VAL_430_BG NULL +#define OPTION_VAL_440_BG NULL +#define OPTION_VAL_450_BG NULL +#define OPTION_VAL_460_BG NULL +#define OPTION_VAL_470_BG NULL +#define OPTION_VAL_480_BG NULL +#define OPTION_VAL_490_BG NULL +#define OPTION_VAL_500_BG NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_BG NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_BG NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_BG NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_BG NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_BG NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_BG NULL +#define OPTION_VAL_0_BG NULL +#define OPTION_VAL_5_BG NULL +#define OPTION_VAL_10_BG NULL +#define OPTION_VAL_15_BG NULL +#define OPTION_VAL_20_BG NULL +#define OPTION_VAL_25_BG NULL +#define OPTION_VAL_30_BG NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_BG NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_BG NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_BG NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_BG NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_BG NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_BG NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_BG NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_BG NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_BG NULL +#define OPTION_VAL_50_BG NULL +#define OPTION_VAL_60_BG NULL +#define OPTION_VAL_70_BG NULL +#define OPTION_VAL_80_BG NULL +#define OPTION_VAL_90_BG NULL +#define OPTION_VAL_100_O45_BG NULL +#define OPTION_VAL_110_O45_BG NULL +#define OPTION_VAL_120_O45_BG NULL +#define OPTION_VAL_130_O45_BG NULL +#define OPTION_VAL_140_O45_BG NULL +#define OPTION_VAL_150_O45_BG NULL +#define OPTION_VAL_160_O45_BG NULL +#define OPTION_VAL_170_O45_BG NULL +#define OPTION_VAL_180_O45_BG NULL +#define OPTION_VAL_190_O45_BG NULL +#define OPTION_VAL_200_O45_BG NULL +#define OPTION_VAL_210_O45_BG NULL +#define OPTION_VAL_220_O45_BG NULL +#define OPTION_VAL_230_O45_BG NULL +#define OPTION_VAL_240_O45_BG NULL +#define OPTION_VAL_250_O45_BG NULL +#define OPTION_VAL_260_O45_BG NULL +#define OPTION_VAL_270_O45_BG NULL +#define OPTION_VAL_280_O45_BG NULL +#define OPTION_VAL_290_O45_BG NULL +#define OPTION_VAL_300_O45_BG NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_BG NULL +#define OPTION_VAL_WHITE_BG NULL +#define OPTION_VAL_RED_BG NULL +#define OPTION_VAL_GREEN_BG NULL +#define OPTION_VAL_BLUE_BG NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_BG NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_BG NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_BG NULL +#define OPTION_VAL_VMU_BG NULL +#define OPTION_VAL_PURUPURU_BG NULL +#define OPTION_VAL_NONE_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_BG NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_BG NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BG NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BG NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BG NULL +#define OPTION_VAL_VMU_A1_BG NULL +#define OPTION_VAL_ALL_VMUS_BG NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BG NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_BG NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BG NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BG NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BG NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BG NULL +#define OPTION_VAL_UPPER_LEFT_BG NULL +#define OPTION_VAL_UPPER_RIGHT_BG NULL +#define OPTION_VAL_LOWER_LEFT_BG NULL +#define OPTION_VAL_LOWER_RIGHT_BG NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BG NULL +#define OPTION_VAL_1X_BG NULL +#define OPTION_VAL_3X_BG NULL +#define OPTION_VAL_5X_BG NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BG NULL +#define OPTION_VAL_DEFAULT_ON_00_BG NULL +#define OPTION_VAL_DEFAULT_OFF_01_BG NULL +#define OPTION_VAL_BLACK_02_BG NULL +#define OPTION_VAL_LIGHT_BLUE_04_BG NULL +#define OPTION_VAL_CYAN_06_BG NULL +#define OPTION_VAL_CYAN_BLUE_07_BG NULL +#define OPTION_VAL_LIGHT_GREEN_08_BG NULL +#define OPTION_VAL_CYAN_GREEN_09_BG NULL +#define OPTION_VAL_LIGHT_CYAN_10_BG NULL +#define OPTION_VAL_PURPLE_12_BG NULL +#define OPTION_VAL_LIGHT_PURPLE_13_BG NULL +#define OPTION_VAL_YELLOW_14_BG NULL +#define OPTION_VAL_GRAY_15_BG NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_BG NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_BG NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_BG NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_BG NULL +#define OPTION_VAL_LIGHT_RED_2_20_BG NULL +#define OPTION_VAL_MAGENTA_21_BG NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_BG NULL +#define OPTION_VAL_LIGHT_ORANGE_23_BG NULL +#define OPTION_VAL_ORANGE_24_BG NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_BG NULL +#define OPTION_VAL_LIGHT_YELLOW_26_BG NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_BG NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BG NULL +#define OPTION_VAL_40_BG NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_BG NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_BG NULL -struct retro_core_option_v2_category option_cats_ca[] = { +struct retro_core_option_v2_category option_cats_bg[] = { { "system", - CATEGORY_SYSTEM_LABEL_CA, - CATEGORY_SYSTEM_INFO_0_CA + CATEGORY_SYSTEM_LABEL_BG, + CATEGORY_SYSTEM_INFO_0_BG }, { "video", - CATEGORY_VIDEO_LABEL_CA, - CATEGORY_VIDEO_INFO_0_CA + CATEGORY_VIDEO_LABEL_BG, + CATEGORY_VIDEO_INFO_0_BG }, { "performance", - CATEGORY_PERFORMANCE_LABEL_CA, - CATEGORY_PERFORMANCE_INFO_0_CA + CATEGORY_PERFORMANCE_LABEL_BG, + CATEGORY_PERFORMANCE_INFO_0_BG }, { "hacks", - CATEGORY_HACKS_LABEL_CA, - CATEGORY_HACKS_INFO_0_CA + CATEGORY_HACKS_LABEL_BG, + CATEGORY_HACKS_INFO_0_BG }, { "input", - CATEGORY_INPUT_LABEL_CA, - CATEGORY_INPUT_INFO_0_CA + CATEGORY_INPUT_LABEL_BG, + CATEGORY_INPUT_INFO_0_BG + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_BG, + CATEGORY_EXPANSIONS_INFO_0_BG }, { "vmu", - CATEGORY_VMU_LABEL_CA, - CATEGORY_VMU_INFO_0_CA + CATEGORY_VMU_LABEL_BG, + CATEGORY_VMU_INFO_0_BG }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_ca[] = { +struct retro_core_option_v2_definition option_defs_bg[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_CA, + CORE_OPTION_NAME_REGION_LABEL_BG, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_CA }, - { "USA", OPTION_VAL_USA_CA }, - { "Europe", OPTION_VAL_EUROPE_CA }, - { "Default", OPTION_VAL_DEFAULT_CA }, + { "Japan", OPTION_VAL_JAPAN_BG }, + { "USA", OPTION_VAL_USA_BG }, + { "Europe", OPTION_VAL_EUROPE_BG }, + { "Default", OPTION_VAL_DEFAULT_BG }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_CA, + CORE_OPTION_NAME_LANGUAGE_LABEL_BG, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_CA, + CORE_OPTION_NAME_LANGUAGE_INFO_0_BG, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_CA }, - { "English", OPTION_VAL_ENGLISH_CA }, - { "German", OPTION_VAL_GERMAN_CA }, - { "French", OPTION_VAL_FRENCH_CA }, - { "Spanish", OPTION_VAL_SPANISH_CA }, - { "Italian", OPTION_VAL_ITALIAN_CA }, - { "Default", OPTION_VAL_DEFAULT_CA }, + { "Japanese", OPTION_VAL_JAPANESE_BG }, + { "English", OPTION_VAL_ENGLISH_BG }, + { "German", OPTION_VAL_GERMAN_BG }, + { "French", OPTION_VAL_FRENCH_BG }, + { "Spanish", OPTION_VAL_SPANISH_BG }, + { "Italian", OPTION_VAL_ITALIAN_BG }, + { "Default", OPTION_VAL_DEFAULT_BG }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_CA, + CORE_OPTION_NAME_HLE_BIOS_LABEL_BG, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_CA, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_BG, NULL, "system", { @@ -5820,9 +6517,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CA, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_BG, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CA, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_BG, NULL, "system", { @@ -5834,9 +6531,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_CA, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_BG, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CA, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_BG, NULL, "system", { @@ -5850,25 +6547,11 @@ struct retro_core_option_v2_definition option_defs_ca[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_CA, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_BG, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_BG, NULL, "system", { @@ -5880,9 +6563,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CA, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_BG, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CA, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_BG, NULL, "system", { @@ -5894,9 +6577,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_CA, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_BG, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CA, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_BG, NULL, "system", { @@ -5908,9 +6591,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_CA, + CORE_OPTION_NAME_UPNP_LABEL_BG, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_CA, + CORE_OPTION_NAME_UPNP_INFO_0_BG, NULL, "system", { @@ -5923,39 +6606,39 @@ struct retro_core_option_v2_definition option_defs_ca[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CA, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CA, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_CA }, - { "640x480", OPTION_VAL_640X480_CA }, - { "800x600", OPTION_VAL_800X600_CA }, - { "960x720", OPTION_VAL_960X720_CA }, - { "1024x768", OPTION_VAL_1024X768_CA }, - { "1280x960", OPTION_VAL_1280X960_CA }, - { "1440x1080", OPTION_VAL_1440X1080_CA }, - { "1600x1200", OPTION_VAL_1600X1200_CA }, - { "1920x1440", OPTION_VAL_1920X1440_CA }, - { "2560x1920", OPTION_VAL_2560X1920_CA }, - { "2880x2160", OPTION_VAL_2880X2160_CA }, - { "3200x2400", OPTION_VAL_3200X2400_CA }, - { "3840x2880", OPTION_VAL_3840X2880_CA }, - { "4480x3360", OPTION_VAL_4480X3360_CA }, - { "5120x3840", OPTION_VAL_5120X3840_CA }, - { "5760x4320", OPTION_VAL_5760X4320_CA }, - { "6400x4800", OPTION_VAL_6400X4800_CA }, - { "7040x5280", OPTION_VAL_7040X5280_CA }, - { "7680x5760", OPTION_VAL_7680X5760_CA }, - { "8320x6240", OPTION_VAL_8320X6240_CA }, - { "8960x6720", OPTION_VAL_8960X6720_CA }, - { "9600x7200", OPTION_VAL_9600X7200_CA }, - { "10240x7680", OPTION_VAL_10240X7680_CA }, - { "10880x8160", OPTION_VAL_10880X8160_CA }, - { "11520x8640", OPTION_VAL_11520X8640_CA }, - { "12160x9120", OPTION_VAL_12160X9120_CA }, - { "12800x9600", OPTION_VAL_12800X9600_CA }, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_BG, + NULL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_BG, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_BG }, + { "640x480", OPTION_VAL_640X480_BG }, + { "800x600", OPTION_VAL_800X600_BG }, + { "960x720", OPTION_VAL_960X720_BG }, + { "1024x768", OPTION_VAL_1024X768_BG }, + { "1280x960", OPTION_VAL_1280X960_BG }, + { "1440x1080", OPTION_VAL_1440X1080_BG }, + { "1600x1200", OPTION_VAL_1600X1200_BG }, + { "1920x1440", OPTION_VAL_1920X1440_BG }, + { "2560x1920", OPTION_VAL_2560X1920_BG }, + { "2880x2160", OPTION_VAL_2880X2160_BG }, + { "3200x2400", OPTION_VAL_3200X2400_BG }, + { "3840x2880", OPTION_VAL_3840X2880_BG }, + { "4480x3360", OPTION_VAL_4480X3360_BG }, + { "5120x3840", OPTION_VAL_5120X3840_BG }, + { "5760x4320", OPTION_VAL_5760X4320_BG }, + { "6400x4800", OPTION_VAL_6400X4800_BG }, + { "7040x5280", OPTION_VAL_7040X5280_BG }, + { "7680x5760", OPTION_VAL_7680X5760_BG }, + { "8320x6240", OPTION_VAL_8320X6240_BG }, + { "8960x6720", OPTION_VAL_8960X6720_BG }, + { "9600x7200", OPTION_VAL_9600X7200_BG }, + { "10240x7680", OPTION_VAL_10240X7680_BG }, + { "10880x8160", OPTION_VAL_10880X8160_BG }, + { "11520x8640", OPTION_VAL_11520X8640_BG }, + { "12160x9120", OPTION_VAL_12160X9120_BG }, + { "12800x9600", OPTION_VAL_12800X9600_BG }, { NULL, NULL }, }, #ifdef LOW_RES @@ -5966,62 +6649,62 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_CA, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_BG, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CA, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_BG, NULL, "video", { - { "VGA", OPTION_VAL_VGA_CA }, - { "TV (RGB)", OPTION_VAL_TV_RGB_CA }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CA }, + { "VGA", OPTION_VAL_VGA_BG }, + { "TV (RGB)", OPTION_VAL_TV_RGB_BG }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_BG }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_CA, + CORE_OPTION_NAME_BROADCAST_LABEL_BG, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_CA }, - { "PAL", OPTION_VAL_PAL_CA }, - { "PAL_N", OPTION_VAL_PAL_N_CA }, - { "PAL_M", OPTION_VAL_PAL_M_CA }, - { "Default", OPTION_VAL_DEFAULT_CA }, + { "NTSC", OPTION_VAL_NTSC_BG }, + { "PAL", OPTION_VAL_PAL_BG }, + { "PAL_N", OPTION_VAL_PAL_N_BG }, + { "PAL_M", OPTION_VAL_PAL_M_BG }, + { "Default", OPTION_VAL_DEFAULT_BG }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CA, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_BG, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_CA }, - { "vertical", OPTION_VAL_VERTICAL_CA }, + { "horizontal", OPTION_VAL_HORIZONTAL_BG }, + { "vertical", OPTION_VAL_VERTICAL_BG }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CA, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_BG, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CA }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CA }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_BG }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_BG }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CA }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_BG }, #endif { NULL, NULL }, }, @@ -6034,25 +6717,25 @@ struct retro_core_option_v2_definition option_defs_ca[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_BG, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_BG, NULL, "video", { - { "512MB", OPTION_VAL_512MB_CA }, - { "1GB", OPTION_VAL_1GB_CA }, - { "2GB", OPTION_VAL_2GB_CA }, - { "4GB", OPTION_VAL_4GB_CA }, + { "512MB", OPTION_VAL_512MB_BG }, + { "1GB", OPTION_VAL_1GB_BG }, + { "2GB", OPTION_VAL_2GB_BG }, + { "4GB", OPTION_VAL_4GB_BG }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_CA, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_BG, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CA, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_BG, NULL, "video", { @@ -6060,6 +6743,7 @@ struct retro_core_option_v2_definition option_defs_ca[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -6068,9 +6752,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_BG, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_BG, NULL, "video", { @@ -6082,9 +6766,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CA, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_BG, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CA, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_BG, NULL, "video", { @@ -6094,11 +6778,11 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_CA, + CORE_OPTION_NAME_MIPMAPPING_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_BG, NULL, "video", { @@ -6110,7 +6794,7 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_CA, + CORE_OPTION_NAME_FOG_LABEL_BG, NULL, "", NULL, @@ -6124,9 +6808,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_BG, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_BG, NULL, "video", { @@ -6138,9 +6822,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_BG, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_BG, NULL, "video", { @@ -6155,24 +6839,24 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CA, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_BG, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CA, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_BG, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_CA }, - { "1", OPTION_VAL_1_CA }, - { "2", OPTION_VAL_2_CA }, + { "0", OPTION_VAL_DEFAULT_BG }, + { "1", OPTION_VAL_1_BG }, + { "2", OPTION_VAL_2_BG }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_BG, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_BG, NULL, "video", { @@ -6180,13 +6864,13 @@ struct retro_core_option_v2_definition option_defs_ca[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_BG, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_BG, NULL, "video", { @@ -6198,9 +6882,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CA, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_BG, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CA, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_BG, NULL, "video", { @@ -6213,25 +6897,25 @@ struct retro_core_option_v2_definition option_defs_ca[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_CA, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_BG, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CA, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_BG, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_CA }, - { "4", OPTION_VAL_4_CA }, - { "6", OPTION_VAL_6_CA }, + { "2", OPTION_VAL_2_O26_BG }, + { "4", OPTION_VAL_4_BG }, + { "6", OPTION_VAL_6_BG }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CA, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_BG, NULL, "video", { @@ -6245,9 +6929,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_BG, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_BG, NULL, "video", { @@ -6257,11 +6941,25 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_BG, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_BG, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CA, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_BG, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CA, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_BG, NULL, "performance", { @@ -6273,15 +6971,15 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_BG, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_BG, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_CA }, - { "more", OPTION_VAL_MORE_CA }, + { "some", OPTION_VAL_SOME_BG }, + { "more", OPTION_VAL_MORE_BG }, { NULL, NULL }, }, #ifdef LOW_END @@ -6292,9 +6990,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CA, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_BG, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CA, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_BG, NULL, "performance", { @@ -6311,9 +7009,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_BG, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_BG, NULL, "hacks", { @@ -6325,9 +7023,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CA, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_BG, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CA, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_BG, NULL, "hacks", { @@ -6339,9 +7037,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_BG, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_BG, NULL, "hacks", { @@ -6355,64 +7053,78 @@ struct retro_core_option_v2_definition option_defs_ca[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_BG, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_BG, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_CA, + CORE_OPTION_NAME_SH4CLOCK_LABEL_BG, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_CA, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_BG, NULL, "hacks", { - { "100", OPTION_VAL_100_CA }, - { "110", OPTION_VAL_110_CA }, - { "120", OPTION_VAL_120_CA }, - { "130", OPTION_VAL_130_CA }, - { "140", OPTION_VAL_140_CA }, - { "150", OPTION_VAL_150_CA }, - { "160", OPTION_VAL_160_CA }, - { "170", OPTION_VAL_170_CA }, - { "180", OPTION_VAL_180_CA }, - { "190", OPTION_VAL_190_CA }, - { "200", OPTION_VAL_200_CA }, - { "210", OPTION_VAL_210_CA }, - { "220", OPTION_VAL_220_CA }, - { "230", OPTION_VAL_230_CA }, - { "240", OPTION_VAL_240_CA }, - { "250", OPTION_VAL_250_CA }, - { "260", OPTION_VAL_260_CA }, - { "270", OPTION_VAL_270_CA }, - { "280", OPTION_VAL_280_CA }, - { "290", OPTION_VAL_290_CA }, - { "300", OPTION_VAL_300_CA }, - { "310", OPTION_VAL_310_CA }, - { "320", OPTION_VAL_320_CA }, - { "330", OPTION_VAL_330_CA }, - { "340", OPTION_VAL_340_CA }, - { "350", OPTION_VAL_350_CA }, - { "360", OPTION_VAL_360_CA }, - { "370", OPTION_VAL_370_CA }, - { "380", OPTION_VAL_380_CA }, - { "390", OPTION_VAL_390_CA }, - { "400", OPTION_VAL_400_CA }, - { "410", OPTION_VAL_410_CA }, - { "420", OPTION_VAL_420_CA }, - { "430", OPTION_VAL_430_CA }, - { "440", OPTION_VAL_440_CA }, - { "450", OPTION_VAL_450_CA }, - { "460", OPTION_VAL_460_CA }, - { "470", OPTION_VAL_470_CA }, - { "480", OPTION_VAL_480_CA }, - { "490", OPTION_VAL_490_CA }, - { "500", OPTION_VAL_500_CA }, + { "100", OPTION_VAL_100_BG }, + { "110", OPTION_VAL_110_BG }, + { "120", OPTION_VAL_120_BG }, + { "130", OPTION_VAL_130_BG }, + { "140", OPTION_VAL_140_BG }, + { "150", OPTION_VAL_150_BG }, + { "160", OPTION_VAL_160_BG }, + { "170", OPTION_VAL_170_BG }, + { "180", OPTION_VAL_180_BG }, + { "190", OPTION_VAL_190_BG }, + { "200", OPTION_VAL_200_BG }, + { "210", OPTION_VAL_210_BG }, + { "220", OPTION_VAL_220_BG }, + { "230", OPTION_VAL_230_BG }, + { "240", OPTION_VAL_240_BG }, + { "250", OPTION_VAL_250_BG }, + { "260", OPTION_VAL_260_BG }, + { "270", OPTION_VAL_270_BG }, + { "280", OPTION_VAL_280_BG }, + { "290", OPTION_VAL_290_BG }, + { "300", OPTION_VAL_300_BG }, + { "310", OPTION_VAL_310_BG }, + { "320", OPTION_VAL_320_BG }, + { "330", OPTION_VAL_330_BG }, + { "340", OPTION_VAL_340_BG }, + { "350", OPTION_VAL_350_BG }, + { "360", OPTION_VAL_360_BG }, + { "370", OPTION_VAL_370_BG }, + { "380", OPTION_VAL_380_BG }, + { "390", OPTION_VAL_390_BG }, + { "400", OPTION_VAL_400_BG }, + { "410", OPTION_VAL_410_BG }, + { "420", OPTION_VAL_420_BG }, + { "430", OPTION_VAL_430_BG }, + { "440", OPTION_VAL_440_BG }, + { "450", OPTION_VAL_450_BG }, + { "460", OPTION_VAL_460_BG }, + { "470", OPTION_VAL_470_BG }, + { "480", OPTION_VAL_480_BG }, + { "490", OPTION_VAL_490_BG }, + { "500", OPTION_VAL_500_BG }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CA, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_BG, NULL, "hacks", { @@ -6422,11 +7134,11 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CA, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_BG, NULL, "hacks", { @@ -6438,47 +7150,47 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CA, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_BG, NULL, "input", { - { "0%", OPTION_VAL_0_CA }, - { "5%", OPTION_VAL_5_CA }, - { "10%", OPTION_VAL_10_CA }, - { "15%", OPTION_VAL_15_CA }, - { "20%", OPTION_VAL_20_CA }, - { "25%", OPTION_VAL_25_CA }, - { "30%", OPTION_VAL_30_CA }, + { "0%", OPTION_VAL_0_BG }, + { "5%", OPTION_VAL_5_BG }, + { "10%", OPTION_VAL_10_BG }, + { "15%", OPTION_VAL_15_BG }, + { "20%", OPTION_VAL_20_BG }, + { "25%", OPTION_VAL_25_BG }, + { "30%", OPTION_VAL_30_BG }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CA, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_BG, NULL, "input", { - { "0%", OPTION_VAL_0_CA }, - { "5%", OPTION_VAL_5_CA }, - { "10%", OPTION_VAL_10_CA }, - { "15%", OPTION_VAL_15_CA }, - { "20%", OPTION_VAL_20_CA }, - { "25%", OPTION_VAL_25_CA }, - { "30%", OPTION_VAL_30_CA }, + { "0%", OPTION_VAL_0_BG }, + { "5%", OPTION_VAL_5_BG }, + { "10%", OPTION_VAL_10_BG }, + { "15%", OPTION_VAL_15_BG }, + { "20%", OPTION_VAL_20_BG }, + { "25%", OPTION_VAL_25_BG }, + { "30%", OPTION_VAL_30_BG }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CA, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_BG, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_BG, NULL, "input", { @@ -6489,10 +7201,10 @@ struct retro_core_option_v2_definition option_defs_ca[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CA, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_BG, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CA, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_BG, NULL, "input", { @@ -6500,124 +7212,268 @@ struct retro_core_option_v2_definition option_defs_ca[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CA, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_BG, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CA, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_BG, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CA, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_BG, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CA, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_BG }, + { "60%", OPTION_VAL_60_BG }, + { "70%", OPTION_VAL_70_BG }, + { "80%", OPTION_VAL_80_BG }, + { "90%", OPTION_VAL_90_BG }, + { "100%", OPTION_VAL_100_O45_BG }, + { "110%", OPTION_VAL_110_O45_BG }, + { "120%", OPTION_VAL_120_O45_BG }, + { "130%", OPTION_VAL_130_O45_BG }, + { "140%", OPTION_VAL_140_O45_BG }, + { "150%", OPTION_VAL_150_O45_BG }, + { "160%", OPTION_VAL_160_O45_BG }, + { "170%", OPTION_VAL_170_O45_BG }, + { "180%", OPTION_VAL_180_O45_BG }, + { "190%", OPTION_VAL_190_O45_BG }, + { "200%", OPTION_VAL_200_O45_BG }, + { "210%", OPTION_VAL_210_O45_BG }, + { "220%", OPTION_VAL_220_O45_BG }, + { "230%", OPTION_VAL_230_O45_BG }, + { "240%", OPTION_VAL_240_O45_BG }, + { "250%", OPTION_VAL_250_O45_BG }, + { "260%", OPTION_VAL_260_O45_BG }, + { "270%", OPTION_VAL_270_O45_BG }, + { "280%", OPTION_VAL_280_O45_BG }, + { "290%", OPTION_VAL_290_O45_BG }, + { "300%", OPTION_VAL_300_O45_BG }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CA, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_BG, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CA }, - { "Red", OPTION_VAL_RED_CA }, - { "Green", OPTION_VAL_GREEN_CA }, - { "Blue", OPTION_VAL_BLUE_CA }, + { "White", OPTION_VAL_WHITE_BG }, + { "Red", OPTION_VAL_RED_BG }, + { "Green", OPTION_VAL_GREEN_BG }, + { "Blue", OPTION_VAL_BLUE_BG }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CA, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_BG, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CA }, - { "Red", OPTION_VAL_RED_CA }, - { "Green", OPTION_VAL_GREEN_CA }, - { "Blue", OPTION_VAL_BLUE_CA }, + { "White", OPTION_VAL_WHITE_BG }, + { "Red", OPTION_VAL_RED_BG }, + { "Green", OPTION_VAL_GREEN_BG }, + { "Blue", OPTION_VAL_BLUE_BG }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CA, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_BG, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CA }, - { "Red", OPTION_VAL_RED_CA }, - { "Green", OPTION_VAL_GREEN_CA }, - { "Blue", OPTION_VAL_BLUE_CA }, + { "White", OPTION_VAL_WHITE_BG }, + { "Red", OPTION_VAL_RED_BG }, + { "Green", OPTION_VAL_GREEN_BG }, + { "Blue", OPTION_VAL_BLUE_BG }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CA, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_BG, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CA }, - { "Red", OPTION_VAL_RED_CA }, - { "Green", OPTION_VAL_GREEN_CA }, - { "Blue", OPTION_VAL_BLUE_CA }, + { "White", OPTION_VAL_WHITE_BG }, + { "Red", OPTION_VAL_RED_BG }, + { "Green", OPTION_VAL_GREEN_BG }, + { "Blue", OPTION_VAL_BLUE_BG }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_BG, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_BG, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_BG }, + { "Purupuru", OPTION_VAL_PURUPURU_BG }, + { "None", OPTION_VAL_NONE_BG }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_BG, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_BG, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_BG, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_CA }, - { "All VMUs", OPTION_VAL_ALL_VMUS_CA }, + { "VMU A1", OPTION_VAL_VMU_A1_BG }, + { "All VMUs", OPTION_VAL_ALL_VMUS_BG }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_CA, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CA, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_CA, + CORE_OPTION_NAME_VMU_SOUND_LABEL_BG, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_BG, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_BG, NULL, "vmu", { @@ -6628,9 +7484,9 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_BG, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_BG, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_BG, NULL, "vmu", { @@ -6642,7 +7498,7 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CA, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_BG, NULL, "", NULL, @@ -6656,144 +7512,144 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CA, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_BG, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_BG }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_BG }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_BG }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_BG }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CA, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_BG, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CA }, - { "2x", OPTION_VAL_2_O27_CA }, - { "3x", OPTION_VAL_3X_CA }, - { "4x", OPTION_VAL_4_CA }, - { "5x", OPTION_VAL_5X_CA }, + { "1x", OPTION_VAL_1X_BG }, + { "2x", OPTION_VAL_2_O26_BG }, + { "3x", OPTION_VAL_3X_BG }, + { "4x", OPTION_VAL_4_BG }, + { "5x", OPTION_VAL_5X_BG }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CA, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_BG, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CA }, - { "20%", OPTION_VAL_20_CA }, - { "30%", OPTION_VAL_30_CA }, - { "40%", OPTION_VAL_40_CA }, - { "50%", OPTION_VAL_50_CA }, - { "60%", OPTION_VAL_60_CA }, - { "70%", OPTION_VAL_70_CA }, - { "80%", OPTION_VAL_80_CA }, - { "90%", OPTION_VAL_90_CA }, - { "100%", OPTION_VAL_100_O57_CA }, + { "10%", OPTION_VAL_10_BG }, + { "20%", OPTION_VAL_20_BG }, + { "30%", OPTION_VAL_30_BG }, + { "40%", OPTION_VAL_40_BG }, + { "50%", OPTION_VAL_50_BG }, + { "60%", OPTION_VAL_60_BG }, + { "70%", OPTION_VAL_70_BG }, + { "80%", OPTION_VAL_80_BG }, + { "90%", OPTION_VAL_90_BG }, + { "100%", OPTION_VAL_100_O45_BG }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CA, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_BG, NULL, "", NULL, @@ -6807,144 +7663,144 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CA, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_BG, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_BG }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_BG }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_BG }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_BG }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CA, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_BG, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CA }, - { "2x", OPTION_VAL_2_O27_CA }, - { "3x", OPTION_VAL_3X_CA }, - { "4x", OPTION_VAL_4_CA }, - { "5x", OPTION_VAL_5X_CA }, + { "1x", OPTION_VAL_1X_BG }, + { "2x", OPTION_VAL_2_O26_BG }, + { "3x", OPTION_VAL_3X_BG }, + { "4x", OPTION_VAL_4_BG }, + { "5x", OPTION_VAL_5X_BG }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CA, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_BG, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CA }, - { "20%", OPTION_VAL_20_CA }, - { "30%", OPTION_VAL_30_CA }, - { "40%", OPTION_VAL_40_CA }, - { "50%", OPTION_VAL_50_CA }, - { "60%", OPTION_VAL_60_CA }, - { "70%", OPTION_VAL_70_CA }, - { "80%", OPTION_VAL_80_CA }, - { "90%", OPTION_VAL_90_CA }, - { "100%", OPTION_VAL_100_O57_CA }, + { "10%", OPTION_VAL_10_BG }, + { "20%", OPTION_VAL_20_BG }, + { "30%", OPTION_VAL_30_BG }, + { "40%", OPTION_VAL_40_BG }, + { "50%", OPTION_VAL_50_BG }, + { "60%", OPTION_VAL_60_BG }, + { "70%", OPTION_VAL_70_BG }, + { "80%", OPTION_VAL_80_BG }, + { "90%", OPTION_VAL_90_BG }, + { "100%", OPTION_VAL_100_O45_BG }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CA, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_BG, NULL, "", NULL, @@ -6958,144 +7814,144 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CA, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_BG, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_BG }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_BG }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_BG }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_BG }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CA, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_BG, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CA }, - { "2x", OPTION_VAL_2_O27_CA }, - { "3x", OPTION_VAL_3X_CA }, - { "4x", OPTION_VAL_4_CA }, - { "5x", OPTION_VAL_5X_CA }, + { "1x", OPTION_VAL_1X_BG }, + { "2x", OPTION_VAL_2_O26_BG }, + { "3x", OPTION_VAL_3X_BG }, + { "4x", OPTION_VAL_4_BG }, + { "5x", OPTION_VAL_5X_BG }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CA, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_BG, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CA }, - { "20%", OPTION_VAL_20_CA }, - { "30%", OPTION_VAL_30_CA }, - { "40%", OPTION_VAL_40_CA }, - { "50%", OPTION_VAL_50_CA }, - { "60%", OPTION_VAL_60_CA }, - { "70%", OPTION_VAL_70_CA }, - { "80%", OPTION_VAL_80_CA }, - { "90%", OPTION_VAL_90_CA }, - { "100%", OPTION_VAL_100_O57_CA }, + { "10%", OPTION_VAL_10_BG }, + { "20%", OPTION_VAL_20_BG }, + { "30%", OPTION_VAL_30_BG }, + { "40%", OPTION_VAL_40_BG }, + { "50%", OPTION_VAL_50_BG }, + { "60%", OPTION_VAL_60_BG }, + { "70%", OPTION_VAL_70_BG }, + { "80%", OPTION_VAL_80_BG }, + { "90%", OPTION_VAL_90_BG }, + { "100%", OPTION_VAL_100_O45_BG }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CA, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_BG, NULL, "", NULL, @@ -7109,505 +7965,560 @@ struct retro_core_option_v2_definition option_defs_ca[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CA, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_BG, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_BG }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_BG }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_BG }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_BG }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CA, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_BG, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CA }, - { "2x", OPTION_VAL_2_O27_CA }, - { "3x", OPTION_VAL_3X_CA }, - { "4x", OPTION_VAL_4_CA }, - { "5x", OPTION_VAL_5X_CA }, + { "1x", OPTION_VAL_1X_BG }, + { "2x", OPTION_VAL_2_O26_BG }, + { "3x", OPTION_VAL_3X_BG }, + { "4x", OPTION_VAL_4_BG }, + { "5x", OPTION_VAL_5X_BG }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CA, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_BG, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_BG }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_BG }, + { "BLACK 02", OPTION_VAL_BLACK_02_BG }, + { "BLUE 03", OPTION_VAL_BLUE_BG }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_BG }, + { "GREEN 05", OPTION_VAL_GREEN_BG }, + { "CYAN 06", OPTION_VAL_CYAN_06_BG }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_BG }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_BG }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_BG }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_BG }, + { "RED 11", OPTION_VAL_RED_BG }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_BG }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_BG }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_BG }, + { "GRAY 15", OPTION_VAL_GRAY_15_BG }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_BG }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_BG }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_BG }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_BG }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_BG }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_BG }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_BG }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_BG }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_BG }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_BG }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_BG }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_BG }, + { "WHITE 28", OPTION_VAL_WHITE_BG }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_BG, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, - { NULL, NULL }, - }, - "DEFAULT_ON 00", - }, - { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, - { "BLACK 02", OPTION_VAL_BLACK_02_CA }, - { "BLUE 03", OPTION_VAL_BLUE_CA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, - { "GREEN 05", OPTION_VAL_GREEN_CA }, - { "CYAN 06", OPTION_VAL_CYAN_06_CA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, - { "RED 11", OPTION_VAL_RED_CA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, - { "GRAY 15", OPTION_VAL_GRAY_15_CA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, - { "WHITE 28", OPTION_VAL_WHITE_CA }, - { NULL, NULL }, - }, - "DEFAULT_OFF 01", - }, - { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CA, - NULL, - "", - NULL, - "vmu", - { - { "10%", OPTION_VAL_10_CA }, - { "20%", OPTION_VAL_20_CA }, - { "30%", OPTION_VAL_30_CA }, - { "40%", OPTION_VAL_40_CA }, - { "50%", OPTION_VAL_50_CA }, - { "60%", OPTION_VAL_60_CA }, - { "70%", OPTION_VAL_70_CA }, - { "80%", OPTION_VAL_80_CA }, - { "90%", OPTION_VAL_90_CA }, - { "100%", OPTION_VAL_100_O57_CA }, + { "10%", OPTION_VAL_10_BG }, + { "20%", OPTION_VAL_20_BG }, + { "30%", OPTION_VAL_30_BG }, + { "40%", OPTION_VAL_40_BG }, + { "50%", OPTION_VAL_50_BG }, + { "60%", OPTION_VAL_60_BG }, + { "70%", OPTION_VAL_70_BG }, + { "80%", OPTION_VAL_80_BG }, + { "90%", OPTION_VAL_90_BG }, + { "100%", OPTION_VAL_100_O45_BG }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_ca = { - option_cats_ca, - option_defs_ca +struct retro_core_options_v2 options_bg = { + option_cats_bg, + option_defs_bg }; -/* RETRO_LANGUAGE_CHS */ +/* RETRO_LANGUAGE_CA */ -#define CATEGORY_SYSTEM_LABEL_CHS "系统" -#define CATEGORY_SYSTEM_INFO_0_CHS NULL -#define CATEGORY_VIDEO_LABEL_CHS "视频" -#define CATEGORY_VIDEO_INFO_0_CHS NULL -#define CATEGORY_PERFORMANCE_LABEL_CHS "性能" -#define CATEGORY_PERFORMANCE_INFO_0_CHS NULL -#define CATEGORY_HACKS_LABEL_CHS "模拟修改" -#define CATEGORY_HACKS_INFO_0_CHS NULL -#define CATEGORY_INPUT_LABEL_CHS "输入" -#define CATEGORY_INPUT_INFO_0_CHS NULL -#define CATEGORY_VMU_LABEL_CHS NULL -#define CATEGORY_VMU_INFO_0_CHS NULL -#define CORE_OPTION_NAME_REGION_LABEL_CHS "区域" -#define OPTION_VAL_JAPAN_CHS "日本" -#define OPTION_VAL_USA_CHS NULL -#define OPTION_VAL_EUROPE_CHS "欧洲" -#define OPTION_VAL_DEFAULT_CHS "默认值" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_CHS "语言" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CHS NULL -#define OPTION_VAL_JAPANESE_CHS "日本历" -#define OPTION_VAL_ENGLISH_CHS "英语" -#define OPTION_VAL_GERMAN_CHS "德语" -#define OPTION_VAL_FRENCH_CHS "法语" -#define OPTION_VAL_SPANISH_CHS "西班牙语" -#define OPTION_VAL_ITALIAN_CHS "意大利语" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CHS NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHS NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHS NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHS NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_CHS NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CHS NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHS NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHS NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHS NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHS NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHS NULL -#define CORE_OPTION_NAME_UPNP_LABEL_CHS NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_CHS NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHS "内部分辨率" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHS NULL -#define OPTION_VAL_320X240_CHS NULL -#define OPTION_VAL_640X480_CHS NULL -#define OPTION_VAL_800X600_CHS NULL -#define OPTION_VAL_960X720_CHS NULL -#define OPTION_VAL_1024X768_CHS NULL -#define OPTION_VAL_1280X960_CHS NULL -#define OPTION_VAL_1440X1080_CHS NULL -#define OPTION_VAL_1600X1200_CHS NULL -#define OPTION_VAL_1920X1440_CHS NULL -#define OPTION_VAL_2560X1920_CHS NULL -#define OPTION_VAL_2880X2160_CHS NULL -#define OPTION_VAL_3200X2400_CHS NULL -#define OPTION_VAL_3840X2880_CHS NULL -#define OPTION_VAL_4480X3360_CHS NULL -#define OPTION_VAL_5120X3840_CHS NULL -#define OPTION_VAL_5760X4320_CHS NULL -#define OPTION_VAL_6400X4800_CHS NULL -#define OPTION_VAL_7040X5280_CHS NULL -#define OPTION_VAL_7680X5760_CHS NULL -#define OPTION_VAL_8320X6240_CHS NULL -#define OPTION_VAL_8960X6720_CHS NULL -#define OPTION_VAL_9600X7200_CHS NULL -#define OPTION_VAL_10240X7680_CHS NULL -#define OPTION_VAL_10880X8160_CHS NULL -#define OPTION_VAL_11520X8640_CHS NULL -#define OPTION_VAL_12160X9120_CHS NULL -#define OPTION_VAL_12800X9600_CHS NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHS NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHS NULL -#define OPTION_VAL_VGA_CHS NULL -#define OPTION_VAL_TV_RGB_CHS NULL -#define OPTION_VAL_TV_COMPOSITE_CHS NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_CHS NULL -#define OPTION_VAL_NTSC_CHS NULL -#define OPTION_VAL_PAL_CHS NULL -#define OPTION_VAL_PAL_N_CHS NULL -#define OPTION_VAL_PAL_M_CHS NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHS "屏幕方向" -#define OPTION_VAL_HORIZONTAL_CHS "水平" -#define OPTION_VAL_VERTICAL_CHS "垂直" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHS NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHS NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_CHS NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_CHS NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHS NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHS NULL -#define OPTION_VAL_512MB_CHS NULL -#define OPTION_VAL_1GB_CHS NULL -#define OPTION_VAL_2GB_CHS NULL -#define OPTION_VAL_4GB_CHS NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHS NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHS NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHS NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHS NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHS NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CHS NULL -#define CORE_OPTION_NAME_FOG_LABEL_CHS NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHS NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHS NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHS NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHS "纹理过滤" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHS NULL -#define OPTION_VAL_1_CHS NULL -#define OPTION_VAL_2_CHS NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHS NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHS NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHS NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHS NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHS NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHS NULL -#define OPTION_VAL_2_O27_CHS "2 倍" -#define OPTION_VAL_4_CHS "4 倍" -#define OPTION_VAL_6_CHS NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHS NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHS NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHS NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHS "多线程渲染" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHS NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHS NULL -#define OPTION_VAL_SOME_CHS "正常" -#define OPTION_VAL_MORE_CHS "最大" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHS NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHS NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHS NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHS NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHS NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHS NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CHS NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHS NULL -#define OPTION_VAL_100_CHS NULL -#define OPTION_VAL_110_CHS NULL -#define OPTION_VAL_120_CHS NULL -#define OPTION_VAL_130_CHS NULL -#define OPTION_VAL_140_CHS NULL -#define OPTION_VAL_150_CHS NULL -#define OPTION_VAL_160_CHS NULL -#define OPTION_VAL_170_CHS NULL -#define OPTION_VAL_180_CHS NULL -#define OPTION_VAL_190_CHS NULL -#define OPTION_VAL_200_CHS NULL -#define OPTION_VAL_210_CHS NULL -#define OPTION_VAL_220_CHS NULL -#define OPTION_VAL_230_CHS NULL -#define OPTION_VAL_240_CHS NULL -#define OPTION_VAL_250_CHS NULL -#define OPTION_VAL_260_CHS NULL -#define OPTION_VAL_270_CHS NULL -#define OPTION_VAL_280_CHS NULL -#define OPTION_VAL_290_CHS NULL -#define OPTION_VAL_300_CHS NULL -#define OPTION_VAL_310_CHS NULL -#define OPTION_VAL_320_CHS NULL -#define OPTION_VAL_330_CHS NULL -#define OPTION_VAL_340_CHS NULL -#define OPTION_VAL_350_CHS NULL -#define OPTION_VAL_360_CHS NULL -#define OPTION_VAL_370_CHS NULL -#define OPTION_VAL_380_CHS NULL -#define OPTION_VAL_390_CHS NULL -#define OPTION_VAL_400_CHS NULL -#define OPTION_VAL_410_CHS NULL -#define OPTION_VAL_420_CHS NULL -#define OPTION_VAL_430_CHS NULL -#define OPTION_VAL_440_CHS NULL -#define OPTION_VAL_450_CHS NULL -#define OPTION_VAL_460_CHS NULL -#define OPTION_VAL_470_CHS NULL -#define OPTION_VAL_480_CHS NULL -#define OPTION_VAL_490_CHS NULL -#define OPTION_VAL_500_CHS NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHS NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHS NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHS NULL -#define OPTION_VAL_0_CHS NULL -#define OPTION_VAL_5_CHS NULL -#define OPTION_VAL_10_CHS NULL -#define OPTION_VAL_15_CHS NULL -#define OPTION_VAL_20_CHS NULL -#define OPTION_VAL_25_CHS NULL -#define OPTION_VAL_30_CHS NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHS NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHS NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CHS NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CHS NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHS NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHS NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHS NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHS NULL -#define OPTION_VAL_WHITE_CHS "白色" -#define OPTION_VAL_RED_CHS "红色" -#define OPTION_VAL_GREEN_CHS "绿色" -#define OPTION_VAL_BLUE_CHS "蓝色" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHS NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHS NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHS NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHS NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHS NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHS NULL -#define OPTION_VAL_VMU_A1_CHS NULL -#define OPTION_VAL_ALL_VMUS_CHS NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHS NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHS NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHS NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHS NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHS NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHS NULL -#define OPTION_VAL_UPPER_LEFT_CHS NULL -#define OPTION_VAL_UPPER_RIGHT_CHS NULL -#define OPTION_VAL_LOWER_LEFT_CHS NULL -#define OPTION_VAL_LOWER_RIGHT_CHS NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHS NULL -#define OPTION_VAL_1X_CHS NULL -#define OPTION_VAL_3X_CHS NULL -#define OPTION_VAL_5X_CHS NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHS NULL -#define OPTION_VAL_DEFAULT_ON_00_CHS NULL -#define OPTION_VAL_DEFAULT_OFF_01_CHS NULL -#define OPTION_VAL_BLACK_02_CHS "浓体 (Black)" -#define OPTION_VAL_LIGHT_BLUE_04_CHS "浅蓝" -#define OPTION_VAL_CYAN_06_CHS "青色" -#define OPTION_VAL_CYAN_BLUE_07_CHS NULL -#define OPTION_VAL_LIGHT_GREEN_08_CHS "浅绿色" -#define OPTION_VAL_CYAN_GREEN_09_CHS NULL -#define OPTION_VAL_LIGHT_CYAN_10_CHS "浅青色" -#define OPTION_VAL_PURPLE_12_CHS "紫色" -#define OPTION_VAL_LIGHT_PURPLE_13_CHS NULL -#define OPTION_VAL_YELLOW_14_CHS "黄色" -#define OPTION_VAL_GRAY_15_CHS "灰" -#define OPTION_VAL_LIGHT_PURPLE_2_16_CHS NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_CHS NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_CHS NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_CHS NULL -#define OPTION_VAL_LIGHT_RED_2_20_CHS NULL -#define OPTION_VAL_MAGENTA_21_CHS "品红" -#define OPTION_VAL_LIGHT_PURPLE_3_22_CHS NULL -#define OPTION_VAL_LIGHT_ORANGE_23_CHS "浅橙色" -#define OPTION_VAL_ORANGE_24_CHS "奥朗日" -#define OPTION_VAL_LIGHT_PURPLE_4_25_CHS NULL -#define OPTION_VAL_LIGHT_YELLOW_26_CHS "淡黄色" -#define OPTION_VAL_LIGHT_YELLOW_2_27_CHS NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHS NULL -#define OPTION_VAL_40_CHS NULL -#define OPTION_VAL_50_CHS NULL -#define OPTION_VAL_60_CHS NULL -#define OPTION_VAL_70_CHS NULL -#define OPTION_VAL_80_CHS NULL -#define OPTION_VAL_90_CHS NULL -#define OPTION_VAL_100_O57_CHS NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHS NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHS NULL +#define CATEGORY_SYSTEM_LABEL_CA "Sistema" +#define CATEGORY_SYSTEM_INFO_0_CA NULL +#define CATEGORY_VIDEO_LABEL_CA "Vídeo" +#define CATEGORY_VIDEO_INFO_0_CA NULL +#define CATEGORY_PERFORMANCE_LABEL_CA "Rendiment" +#define CATEGORY_PERFORMANCE_INFO_0_CA NULL +#define CATEGORY_HACKS_LABEL_CA NULL +#define CATEGORY_HACKS_INFO_0_CA NULL +#define CATEGORY_INPUT_LABEL_CA "Entrada" +#define CATEGORY_INPUT_INFO_0_CA NULL +#define CATEGORY_EXPANSIONS_LABEL_CA NULL +#define CATEGORY_EXPANSIONS_INFO_0_CA NULL +#define CATEGORY_VMU_LABEL_CA NULL +#define CATEGORY_VMU_INFO_0_CA NULL +#define CORE_OPTION_NAME_REGION_LABEL_CA "Regió" +#define OPTION_VAL_JAPAN_CA "Japó" +#define OPTION_VAL_USA_CA NULL +#define OPTION_VAL_EUROPE_CA "Europa" +#define OPTION_VAL_DEFAULT_CA "Per defecte" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_CA "Llengua" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CA NULL +#define OPTION_VAL_JAPANESE_CA "Japonès" +#define OPTION_VAL_ENGLISH_CA "Anglès" +#define OPTION_VAL_GERMAN_CA "Alemany" +#define OPTION_VAL_FRENCH_CA "Francès" +#define OPTION_VAL_SPANISH_CA "Español" +#define OPTION_VAL_ITALIAN_CA "Italià" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CA NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CA NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CA "Habilitar DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CA NULL +#define CORE_OPTION_NAME_UPNP_LABEL_CA "Habilitat UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_CA NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CA "Resolució Interna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CA NULL +#define OPTION_VAL_320X240_CA "320 × 240 (50 %)" +#define OPTION_VAL_640X480_CA NULL +#define OPTION_VAL_800X600_CA NULL +#define OPTION_VAL_960X720_CA "960 × 720 (150 %)" +#define OPTION_VAL_1024X768_CA NULL +#define OPTION_VAL_1280X960_CA NULL +#define OPTION_VAL_1440X1080_CA NULL +#define OPTION_VAL_1600X1200_CA NULL +#define OPTION_VAL_1920X1440_CA "1920 × 1440 (300 %)" +#define OPTION_VAL_2560X1920_CA "2560 × 1920 (400 %)" +#define OPTION_VAL_2880X2160_CA NULL +#define OPTION_VAL_3200X2400_CA "3200 × 2400 (500 %)" +#define OPTION_VAL_3840X2880_CA "3840 × 2880 (600 %)" +#define OPTION_VAL_4480X3360_CA NULL +#define OPTION_VAL_5120X3840_CA NULL +#define OPTION_VAL_5760X4320_CA NULL +#define OPTION_VAL_6400X4800_CA NULL +#define OPTION_VAL_7040X5280_CA NULL +#define OPTION_VAL_7680X5760_CA NULL +#define OPTION_VAL_8320X6240_CA NULL +#define OPTION_VAL_8960X6720_CA NULL +#define OPTION_VAL_9600X7200_CA NULL +#define OPTION_VAL_10240X7680_CA NULL +#define OPTION_VAL_10880X8160_CA NULL +#define OPTION_VAL_11520X8640_CA NULL +#define OPTION_VAL_12160X9120_CA NULL +#define OPTION_VAL_12800X9600_CA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CA "Tipus de cable" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CA NULL +#define OPTION_VAL_VGA_CA NULL +#define OPTION_VAL_TV_RGB_CA NULL +#define OPTION_VAL_TV_COMPOSITE_CA NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_CA NULL +#define OPTION_VAL_NTSC_CA NULL +#define OPTION_VAL_PAL_CA "Pal (Mundial)" +#define OPTION_VAL_PAL_N_CA NULL +#define OPTION_VAL_PAL_M_CA NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CA "Orientació de la pantalla" +#define OPTION_VAL_HORIZONTAL_CA "Horitzontal" +#define OPTION_VAL_VERTICAL_CA NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CA "Ordenar per transparències" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CA NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CA NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_CA NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_CA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CA NULL +#define OPTION_VAL_512MB_CA "512 MB" +#define OPTION_VAL_1GB_CA "1 GB" +#define OPTION_VAL_2GB_CA "2 GB" +#define OPTION_VAL_4GB_CA "4 GB" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CA NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CA NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_CA NULL +#define CORE_OPTION_NAME_FOG_LABEL_CA "Efectes de boira" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CA NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CA NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CA "Filtratge de textures" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CA NULL +#define OPTION_VAL_1_CA NULL +#define OPTION_VAL_2_CA "Forçar lineal" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CA NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CA NULL +#define OPTION_VAL_2_O26_CA NULL +#define OPTION_VAL_4_CA NULL +#define OPTION_VAL_6_CA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CA NULL +#define OPTION_VAL_SOME_CA NULL +#define OPTION_VAL_MORE_CA "Màxim" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CA NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CA NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CA NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CA NULL +#define OPTION_VAL_100_CA NULL +#define OPTION_VAL_110_CA NULL +#define OPTION_VAL_120_CA NULL +#define OPTION_VAL_130_CA NULL +#define OPTION_VAL_140_CA NULL +#define OPTION_VAL_150_CA NULL +#define OPTION_VAL_160_CA NULL +#define OPTION_VAL_170_CA NULL +#define OPTION_VAL_180_CA NULL +#define OPTION_VAL_190_CA NULL +#define OPTION_VAL_200_CA NULL +#define OPTION_VAL_210_CA NULL +#define OPTION_VAL_220_CA NULL +#define OPTION_VAL_230_CA NULL +#define OPTION_VAL_240_CA NULL +#define OPTION_VAL_250_CA NULL +#define OPTION_VAL_260_CA NULL +#define OPTION_VAL_270_CA NULL +#define OPTION_VAL_280_CA NULL +#define OPTION_VAL_290_CA NULL +#define OPTION_VAL_300_CA NULL +#define OPTION_VAL_310_CA NULL +#define OPTION_VAL_320_CA NULL +#define OPTION_VAL_330_CA NULL +#define OPTION_VAL_340_CA NULL +#define OPTION_VAL_350_CA NULL +#define OPTION_VAL_360_CA NULL +#define OPTION_VAL_370_CA NULL +#define OPTION_VAL_380_CA NULL +#define OPTION_VAL_390_CA NULL +#define OPTION_VAL_400_CA NULL +#define OPTION_VAL_410_CA NULL +#define OPTION_VAL_420_CA NULL +#define OPTION_VAL_430_CA NULL +#define OPTION_VAL_440_CA NULL +#define OPTION_VAL_450_CA NULL +#define OPTION_VAL_460_CA NULL +#define OPTION_VAL_470_CA NULL +#define OPTION_VAL_480_CA NULL +#define OPTION_VAL_490_CA NULL +#define OPTION_VAL_500_CA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CA NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CA "Abocar textures" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CA NULL +#define OPTION_VAL_0_CA NULL +#define OPTION_VAL_5_CA NULL +#define OPTION_VAL_10_CA NULL +#define OPTION_VAL_15_CA NULL +#define OPTION_VAL_20_CA NULL +#define OPTION_VAL_25_CA NULL +#define OPTION_VAL_30_CA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CA NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CA NULL +#define OPTION_VAL_50_CA NULL +#define OPTION_VAL_60_CA NULL +#define OPTION_VAL_70_CA NULL +#define OPTION_VAL_80_CA NULL +#define OPTION_VAL_90_CA NULL +#define OPTION_VAL_100_O45_CA NULL +#define OPTION_VAL_110_O45_CA NULL +#define OPTION_VAL_120_O45_CA NULL +#define OPTION_VAL_130_O45_CA NULL +#define OPTION_VAL_140_O45_CA NULL +#define OPTION_VAL_150_O45_CA NULL +#define OPTION_VAL_160_O45_CA NULL +#define OPTION_VAL_170_O45_CA NULL +#define OPTION_VAL_180_O45_CA NULL +#define OPTION_VAL_190_O45_CA NULL +#define OPTION_VAL_200_O45_CA NULL +#define OPTION_VAL_210_O45_CA NULL +#define OPTION_VAL_220_O45_CA NULL +#define OPTION_VAL_230_O45_CA NULL +#define OPTION_VAL_240_O45_CA NULL +#define OPTION_VAL_250_O45_CA NULL +#define OPTION_VAL_260_O45_CA NULL +#define OPTION_VAL_270_O45_CA NULL +#define OPTION_VAL_280_O45_CA NULL +#define OPTION_VAL_290_O45_CA NULL +#define OPTION_VAL_300_O45_CA NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CA NULL +#define OPTION_VAL_WHITE_CA "Blanc" +#define OPTION_VAL_RED_CA "Vermell" +#define OPTION_VAL_GREEN_CA "Verd" +#define OPTION_VAL_BLUE_CA "Blau" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CA NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CA NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CA NULL +#define OPTION_VAL_VMU_CA NULL +#define OPTION_VAL_PURUPURU_CA NULL +#define OPTION_VAL_NONE_CA "Cap" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CA "VMUs individuals per cada joc" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CA NULL +#define OPTION_VAL_VMU_A1_CA NULL +#define OPTION_VAL_ALL_VMUS_CA "Totes les VMUs" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CA "Sons VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CA NULL +#define OPTION_VAL_UPPER_LEFT_CA "Superior esquerra" +#define OPTION_VAL_UPPER_RIGHT_CA "Superior dret" +#define OPTION_VAL_LOWER_LEFT_CA "Inferiro esquerra" +#define OPTION_VAL_LOWER_RIGHT_CA "Inferior dret" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CA NULL +#define OPTION_VAL_1X_CA NULL +#define OPTION_VAL_3X_CA NULL +#define OPTION_VAL_5X_CA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CA NULL +#define OPTION_VAL_DEFAULT_ON_00_CA "Activat per defecte" +#define OPTION_VAL_DEFAULT_OFF_01_CA "Desactivat per defecte" +#define OPTION_VAL_BLACK_02_CA "Negre" +#define OPTION_VAL_LIGHT_BLUE_04_CA "Blau clar" +#define OPTION_VAL_CYAN_06_CA "Cian" +#define OPTION_VAL_CYAN_BLUE_07_CA "Blau cian" +#define OPTION_VAL_LIGHT_GREEN_08_CA "Verd lluminós" +#define OPTION_VAL_CYAN_GREEN_09_CA "Verd cian" +#define OPTION_VAL_LIGHT_CYAN_10_CA "Cian clar" +#define OPTION_VAL_PURPLE_12_CA "Lila" +#define OPTION_VAL_LIGHT_PURPLE_13_CA "Lila clar" +#define OPTION_VAL_YELLOW_14_CA "Groc" +#define OPTION_VAL_GRAY_15_CA "Gris" +#define OPTION_VAL_LIGHT_PURPLE_2_16_CA NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_CA NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_CA NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_CA NULL +#define OPTION_VAL_LIGHT_RED_2_20_CA "Vermell clar (2)" +#define OPTION_VAL_MAGENTA_21_CA NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_CA NULL +#define OPTION_VAL_LIGHT_ORANGE_23_CA "Taronja clar" +#define OPTION_VAL_ORANGE_24_CA "Taronja" +#define OPTION_VAL_LIGHT_PURPLE_4_25_CA NULL +#define OPTION_VAL_LIGHT_YELLOW_26_CA "Groc clar" +#define OPTION_VAL_LIGHT_YELLOW_2_27_CA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CA NULL +#define OPTION_VAL_40_CA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CA NULL -struct retro_core_option_v2_category option_cats_chs[] = { +struct retro_core_option_v2_category option_cats_ca[] = { { "system", - CATEGORY_SYSTEM_LABEL_CHS, - CATEGORY_SYSTEM_INFO_0_CHS + CATEGORY_SYSTEM_LABEL_CA, + CATEGORY_SYSTEM_INFO_0_CA }, { "video", - CATEGORY_VIDEO_LABEL_CHS, - CATEGORY_VIDEO_INFO_0_CHS + CATEGORY_VIDEO_LABEL_CA, + CATEGORY_VIDEO_INFO_0_CA }, { "performance", - CATEGORY_PERFORMANCE_LABEL_CHS, - CATEGORY_PERFORMANCE_INFO_0_CHS + CATEGORY_PERFORMANCE_LABEL_CA, + CATEGORY_PERFORMANCE_INFO_0_CA }, { "hacks", - CATEGORY_HACKS_LABEL_CHS, - CATEGORY_HACKS_INFO_0_CHS + CATEGORY_HACKS_LABEL_CA, + CATEGORY_HACKS_INFO_0_CA }, { "input", - CATEGORY_INPUT_LABEL_CHS, - CATEGORY_INPUT_INFO_0_CHS + CATEGORY_INPUT_LABEL_CA, + CATEGORY_INPUT_INFO_0_CA + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_CA, + CATEGORY_EXPANSIONS_INFO_0_CA }, { "vmu", - CATEGORY_VMU_LABEL_CHS, - CATEGORY_VMU_INFO_0_CHS + CATEGORY_VMU_LABEL_CA, + CATEGORY_VMU_INFO_0_CA }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_chs[] = { +struct retro_core_option_v2_definition option_defs_ca[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_CHS, + CORE_OPTION_NAME_REGION_LABEL_CA, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_CHS }, - { "USA", OPTION_VAL_USA_CHS }, - { "Europe", OPTION_VAL_EUROPE_CHS }, - { "Default", OPTION_VAL_DEFAULT_CHS }, + { "Japan", OPTION_VAL_JAPAN_CA }, + { "USA", OPTION_VAL_USA_CA }, + { "Europe", OPTION_VAL_EUROPE_CA }, + { "Default", OPTION_VAL_DEFAULT_CA }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_CHS, + CORE_OPTION_NAME_LANGUAGE_LABEL_CA, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_CHS, + CORE_OPTION_NAME_LANGUAGE_INFO_0_CA, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_CHS }, - { "English", OPTION_VAL_ENGLISH_CHS }, - { "German", OPTION_VAL_GERMAN_CHS }, - { "French", OPTION_VAL_FRENCH_CHS }, - { "Spanish", OPTION_VAL_SPANISH_CHS }, - { "Italian", OPTION_VAL_ITALIAN_CHS }, - { "Default", OPTION_VAL_DEFAULT_CHS }, + { "Japanese", OPTION_VAL_JAPANESE_CA }, + { "English", OPTION_VAL_ENGLISH_CA }, + { "German", OPTION_VAL_GERMAN_CA }, + { "French", OPTION_VAL_FRENCH_CA }, + { "Spanish", OPTION_VAL_SPANISH_CA }, + { "Italian", OPTION_VAL_ITALIAN_CA }, + { "Default", OPTION_VAL_DEFAULT_CA }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_CHS, + CORE_OPTION_NAME_HLE_BIOS_LABEL_CA, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHS, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_CA, NULL, "system", { @@ -7619,9 +8530,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHS, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CA, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHS, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CA, NULL, "system", { @@ -7633,9 +8544,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHS, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_CA, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHS, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CA, NULL, "system", { @@ -7649,25 +8560,11 @@ struct retro_core_option_v2_definition option_defs_chs[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_CHS, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CHS, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHS, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CA, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHS, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CA, NULL, "system", { @@ -7679,9 +8576,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHS, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CA, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHS, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CA, NULL, "system", { @@ -7693,9 +8590,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHS, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_CA, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHS, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CA, NULL, "system", { @@ -7707,9 +8604,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_CHS, + CORE_OPTION_NAME_UPNP_LABEL_CA, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_CHS, + CORE_OPTION_NAME_UPNP_INFO_0_CA, NULL, "system", { @@ -7722,39 +8619,39 @@ struct retro_core_option_v2_definition option_defs_chs[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHS, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CA, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHS, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CA, NULL, "video", { - { "320x240", OPTION_VAL_320X240_CHS }, - { "640x480", OPTION_VAL_640X480_CHS }, - { "800x600", OPTION_VAL_800X600_CHS }, - { "960x720", OPTION_VAL_960X720_CHS }, - { "1024x768", OPTION_VAL_1024X768_CHS }, - { "1280x960", OPTION_VAL_1280X960_CHS }, - { "1440x1080", OPTION_VAL_1440X1080_CHS }, - { "1600x1200", OPTION_VAL_1600X1200_CHS }, - { "1920x1440", OPTION_VAL_1920X1440_CHS }, - { "2560x1920", OPTION_VAL_2560X1920_CHS }, - { "2880x2160", OPTION_VAL_2880X2160_CHS }, - { "3200x2400", OPTION_VAL_3200X2400_CHS }, - { "3840x2880", OPTION_VAL_3840X2880_CHS }, - { "4480x3360", OPTION_VAL_4480X3360_CHS }, - { "5120x3840", OPTION_VAL_5120X3840_CHS }, - { "5760x4320", OPTION_VAL_5760X4320_CHS }, - { "6400x4800", OPTION_VAL_6400X4800_CHS }, - { "7040x5280", OPTION_VAL_7040X5280_CHS }, - { "7680x5760", OPTION_VAL_7680X5760_CHS }, - { "8320x6240", OPTION_VAL_8320X6240_CHS }, - { "8960x6720", OPTION_VAL_8960X6720_CHS }, - { "9600x7200", OPTION_VAL_9600X7200_CHS }, - { "10240x7680", OPTION_VAL_10240X7680_CHS }, - { "10880x8160", OPTION_VAL_10880X8160_CHS }, - { "11520x8640", OPTION_VAL_11520X8640_CHS }, - { "12160x9120", OPTION_VAL_12160X9120_CHS }, - { "12800x9600", OPTION_VAL_12800X9600_CHS }, + { "320x240", OPTION_VAL_320X240_CA }, + { "640x480", OPTION_VAL_640X480_CA }, + { "800x600", OPTION_VAL_800X600_CA }, + { "960x720", OPTION_VAL_960X720_CA }, + { "1024x768", OPTION_VAL_1024X768_CA }, + { "1280x960", OPTION_VAL_1280X960_CA }, + { "1440x1080", OPTION_VAL_1440X1080_CA }, + { "1600x1200", OPTION_VAL_1600X1200_CA }, + { "1920x1440", OPTION_VAL_1920X1440_CA }, + { "2560x1920", OPTION_VAL_2560X1920_CA }, + { "2880x2160", OPTION_VAL_2880X2160_CA }, + { "3200x2400", OPTION_VAL_3200X2400_CA }, + { "3840x2880", OPTION_VAL_3840X2880_CA }, + { "4480x3360", OPTION_VAL_4480X3360_CA }, + { "5120x3840", OPTION_VAL_5120X3840_CA }, + { "5760x4320", OPTION_VAL_5760X4320_CA }, + { "6400x4800", OPTION_VAL_6400X4800_CA }, + { "7040x5280", OPTION_VAL_7040X5280_CA }, + { "7680x5760", OPTION_VAL_7680X5760_CA }, + { "8320x6240", OPTION_VAL_8320X6240_CA }, + { "8960x6720", OPTION_VAL_8960X6720_CA }, + { "9600x7200", OPTION_VAL_9600X7200_CA }, + { "10240x7680", OPTION_VAL_10240X7680_CA }, + { "10880x8160", OPTION_VAL_10880X8160_CA }, + { "11520x8640", OPTION_VAL_11520X8640_CA }, + { "12160x9120", OPTION_VAL_12160X9120_CA }, + { "12800x9600", OPTION_VAL_12800X9600_CA }, { NULL, NULL }, }, #ifdef LOW_RES @@ -7765,62 +8662,62 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHS, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_CA, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHS, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CA, NULL, "video", { - { "VGA", OPTION_VAL_VGA_CHS }, - { "TV (RGB)", OPTION_VAL_TV_RGB_CHS }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CHS }, + { "VGA", OPTION_VAL_VGA_CA }, + { "TV (RGB)", OPTION_VAL_TV_RGB_CA }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CA }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_CHS, + CORE_OPTION_NAME_BROADCAST_LABEL_CA, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_CHS }, - { "PAL", OPTION_VAL_PAL_CHS }, - { "PAL_N", OPTION_VAL_PAL_N_CHS }, - { "PAL_M", OPTION_VAL_PAL_M_CHS }, - { "Default", OPTION_VAL_DEFAULT_CHS }, + { "NTSC", OPTION_VAL_NTSC_CA }, + { "PAL", OPTION_VAL_PAL_CA }, + { "PAL_N", OPTION_VAL_PAL_N_CA }, + { "PAL_M", OPTION_VAL_PAL_M_CA }, + { "Default", OPTION_VAL_DEFAULT_CA }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHS, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CA, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_CHS }, - { "vertical", OPTION_VAL_VERTICAL_CHS }, + { "horizontal", OPTION_VAL_HORIZONTAL_CA }, + { "vertical", OPTION_VAL_VERTICAL_CA }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHS, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CA, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHS }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CHS }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CA }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CA }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CHS }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CA }, #endif { NULL, NULL }, }, @@ -7833,25 +8730,25 @@ struct retro_core_option_v2_definition option_defs_chs[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHS, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CA, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHS, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CA, NULL, "video", { - { "512MB", OPTION_VAL_512MB_CHS }, - { "1GB", OPTION_VAL_1GB_CHS }, - { "2GB", OPTION_VAL_2GB_CHS }, - { "4GB", OPTION_VAL_4GB_CHS }, + { "512MB", OPTION_VAL_512MB_CA }, + { "1GB", OPTION_VAL_1GB_CA }, + { "2GB", OPTION_VAL_2GB_CA }, + { "4GB", OPTION_VAL_4GB_CA }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHS, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_CA, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHS, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CA, NULL, "video", { @@ -7859,6 +8756,7 @@ struct retro_core_option_v2_definition option_defs_chs[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -7867,9 +8765,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHS, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CA, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHS, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CA, NULL, "video", { @@ -7881,9 +8779,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHS, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CA, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHS, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CA, NULL, "video", { @@ -7893,11 +8791,11 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_CHS, + CORE_OPTION_NAME_MIPMAPPING_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_CA, NULL, "video", { @@ -7909,7 +8807,7 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_CHS, + CORE_OPTION_NAME_FOG_LABEL_CA, NULL, "", NULL, @@ -7923,9 +8821,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHS, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CA, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHS, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CA, NULL, "video", { @@ -7937,9 +8835,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHS, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CA, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHS, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CA, NULL, "video", { @@ -7954,24 +8852,24 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHS, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CA, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHS, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CA, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_CHS }, - { "1", OPTION_VAL_1_CHS }, - { "2", OPTION_VAL_2_CHS }, + { "0", OPTION_VAL_DEFAULT_CA }, + { "1", OPTION_VAL_1_CA }, + { "2", OPTION_VAL_2_CA }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHS, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CA, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHS, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CA, NULL, "video", { @@ -7979,13 +8877,13 @@ struct retro_core_option_v2_definition option_defs_chs[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHS, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CA, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHS, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CA, NULL, "video", { @@ -7997,9 +8895,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHS, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CA, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHS, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CA, NULL, "video", { @@ -8012,25 +8910,25 @@ struct retro_core_option_v2_definition option_defs_chs[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHS, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_CA, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHS, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CA, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_CHS }, - { "4", OPTION_VAL_4_CHS }, - { "6", OPTION_VAL_6_CHS }, + { "2", OPTION_VAL_2_O26_CA }, + { "4", OPTION_VAL_4_CA }, + { "6", OPTION_VAL_6_CA }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHS, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CA, NULL, "video", { @@ -8044,9 +8942,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHS, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CA, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHS, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CA, NULL, "video", { @@ -8056,11 +8954,25 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CA, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHS, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CA, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHS, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CA, NULL, "performance", { @@ -8072,15 +8984,15 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHS, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CA, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHS, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CA, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_CHS }, - { "more", OPTION_VAL_MORE_CHS }, + { "some", OPTION_VAL_SOME_CA }, + { "more", OPTION_VAL_MORE_CA }, { NULL, NULL }, }, #ifdef LOW_END @@ -8091,9 +9003,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHS, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CA, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHS, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CA, NULL, "performance", { @@ -8110,9 +9022,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHS, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CA, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHS, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CA, NULL, "hacks", { @@ -8124,9 +9036,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHS, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CA, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHS, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CA, NULL, "hacks", { @@ -8138,9 +9050,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHS, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CA, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHS, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CA, NULL, "hacks", { @@ -8154,64 +9066,78 @@ struct retro_core_option_v2_definition option_defs_chs[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CA, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CA, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_CHS, + CORE_OPTION_NAME_SH4CLOCK_LABEL_CA, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHS, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_CA, NULL, "hacks", { - { "100", OPTION_VAL_100_CHS }, - { "110", OPTION_VAL_110_CHS }, - { "120", OPTION_VAL_120_CHS }, - { "130", OPTION_VAL_130_CHS }, - { "140", OPTION_VAL_140_CHS }, - { "150", OPTION_VAL_150_CHS }, - { "160", OPTION_VAL_160_CHS }, - { "170", OPTION_VAL_170_CHS }, - { "180", OPTION_VAL_180_CHS }, - { "190", OPTION_VAL_190_CHS }, - { "200", OPTION_VAL_200_CHS }, - { "210", OPTION_VAL_210_CHS }, - { "220", OPTION_VAL_220_CHS }, - { "230", OPTION_VAL_230_CHS }, - { "240", OPTION_VAL_240_CHS }, - { "250", OPTION_VAL_250_CHS }, - { "260", OPTION_VAL_260_CHS }, - { "270", OPTION_VAL_270_CHS }, - { "280", OPTION_VAL_280_CHS }, - { "290", OPTION_VAL_290_CHS }, - { "300", OPTION_VAL_300_CHS }, - { "310", OPTION_VAL_310_CHS }, - { "320", OPTION_VAL_320_CHS }, - { "330", OPTION_VAL_330_CHS }, - { "340", OPTION_VAL_340_CHS }, - { "350", OPTION_VAL_350_CHS }, - { "360", OPTION_VAL_360_CHS }, - { "370", OPTION_VAL_370_CHS }, - { "380", OPTION_VAL_380_CHS }, - { "390", OPTION_VAL_390_CHS }, - { "400", OPTION_VAL_400_CHS }, - { "410", OPTION_VAL_410_CHS }, - { "420", OPTION_VAL_420_CHS }, - { "430", OPTION_VAL_430_CHS }, - { "440", OPTION_VAL_440_CHS }, - { "450", OPTION_VAL_450_CHS }, - { "460", OPTION_VAL_460_CHS }, - { "470", OPTION_VAL_470_CHS }, - { "480", OPTION_VAL_480_CHS }, - { "490", OPTION_VAL_490_CHS }, - { "500", OPTION_VAL_500_CHS }, + { "100", OPTION_VAL_100_CA }, + { "110", OPTION_VAL_110_CA }, + { "120", OPTION_VAL_120_CA }, + { "130", OPTION_VAL_130_CA }, + { "140", OPTION_VAL_140_CA }, + { "150", OPTION_VAL_150_CA }, + { "160", OPTION_VAL_160_CA }, + { "170", OPTION_VAL_170_CA }, + { "180", OPTION_VAL_180_CA }, + { "190", OPTION_VAL_190_CA }, + { "200", OPTION_VAL_200_CA }, + { "210", OPTION_VAL_210_CA }, + { "220", OPTION_VAL_220_CA }, + { "230", OPTION_VAL_230_CA }, + { "240", OPTION_VAL_240_CA }, + { "250", OPTION_VAL_250_CA }, + { "260", OPTION_VAL_260_CA }, + { "270", OPTION_VAL_270_CA }, + { "280", OPTION_VAL_280_CA }, + { "290", OPTION_VAL_290_CA }, + { "300", OPTION_VAL_300_CA }, + { "310", OPTION_VAL_310_CA }, + { "320", OPTION_VAL_320_CA }, + { "330", OPTION_VAL_330_CA }, + { "340", OPTION_VAL_340_CA }, + { "350", OPTION_VAL_350_CA }, + { "360", OPTION_VAL_360_CA }, + { "370", OPTION_VAL_370_CA }, + { "380", OPTION_VAL_380_CA }, + { "390", OPTION_VAL_390_CA }, + { "400", OPTION_VAL_400_CA }, + { "410", OPTION_VAL_410_CA }, + { "420", OPTION_VAL_420_CA }, + { "430", OPTION_VAL_430_CA }, + { "440", OPTION_VAL_440_CA }, + { "450", OPTION_VAL_450_CA }, + { "460", OPTION_VAL_460_CA }, + { "470", OPTION_VAL_470_CA }, + { "480", OPTION_VAL_480_CA }, + { "490", OPTION_VAL_490_CA }, + { "500", OPTION_VAL_500_CA }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHS, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CA, NULL, "hacks", { @@ -8221,11 +9147,11 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHS, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CA, NULL, "hacks", { @@ -8237,47 +9163,47 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHS, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CA, NULL, "input", { - { "0%", OPTION_VAL_0_CHS }, - { "5%", OPTION_VAL_5_CHS }, - { "10%", OPTION_VAL_10_CHS }, - { "15%", OPTION_VAL_15_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "25%", OPTION_VAL_25_CHS }, - { "30%", OPTION_VAL_30_CHS }, + { "0%", OPTION_VAL_0_CA }, + { "5%", OPTION_VAL_5_CA }, + { "10%", OPTION_VAL_10_CA }, + { "15%", OPTION_VAL_15_CA }, + { "20%", OPTION_VAL_20_CA }, + { "25%", OPTION_VAL_25_CA }, + { "30%", OPTION_VAL_30_CA }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHS, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CA, NULL, "input", { - { "0%", OPTION_VAL_0_CHS }, - { "5%", OPTION_VAL_5_CHS }, - { "10%", OPTION_VAL_10_CHS }, - { "15%", OPTION_VAL_15_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "25%", OPTION_VAL_25_CHS }, - { "30%", OPTION_VAL_30_CHS }, + { "0%", OPTION_VAL_0_CA }, + { "5%", OPTION_VAL_5_CA }, + { "10%", OPTION_VAL_10_CA }, + { "15%", OPTION_VAL_15_CA }, + { "20%", OPTION_VAL_20_CA }, + { "25%", OPTION_VAL_25_CA }, + { "30%", OPTION_VAL_30_CA }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHS, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CA, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CA, NULL, "input", { @@ -8288,10 +9214,10 @@ struct retro_core_option_v2_definition option_defs_chs[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CHS, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CA, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CHS, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CA, NULL, "input", { @@ -8299,124 +9225,268 @@ struct retro_core_option_v2_definition option_defs_chs[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHS, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CA, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHS, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CA, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHS, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CA, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHS, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_CA }, + { "60%", OPTION_VAL_60_CA }, + { "70%", OPTION_VAL_70_CA }, + { "80%", OPTION_VAL_80_CA }, + { "90%", OPTION_VAL_90_CA }, + { "100%", OPTION_VAL_100_O45_CA }, + { "110%", OPTION_VAL_110_O45_CA }, + { "120%", OPTION_VAL_120_O45_CA }, + { "130%", OPTION_VAL_130_O45_CA }, + { "140%", OPTION_VAL_140_O45_CA }, + { "150%", OPTION_VAL_150_O45_CA }, + { "160%", OPTION_VAL_160_O45_CA }, + { "170%", OPTION_VAL_170_O45_CA }, + { "180%", OPTION_VAL_180_O45_CA }, + { "190%", OPTION_VAL_190_O45_CA }, + { "200%", OPTION_VAL_200_O45_CA }, + { "210%", OPTION_VAL_210_O45_CA }, + { "220%", OPTION_VAL_220_O45_CA }, + { "230%", OPTION_VAL_230_O45_CA }, + { "240%", OPTION_VAL_240_O45_CA }, + { "250%", OPTION_VAL_250_O45_CA }, + { "260%", OPTION_VAL_260_O45_CA }, + { "270%", OPTION_VAL_270_O45_CA }, + { "280%", OPTION_VAL_280_O45_CA }, + { "290%", OPTION_VAL_290_O45_CA }, + { "300%", OPTION_VAL_300_O45_CA }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHS, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHS }, - { "Red", OPTION_VAL_RED_CHS }, - { "Green", OPTION_VAL_GREEN_CHS }, - { "Blue", OPTION_VAL_BLUE_CHS }, + { "White", OPTION_VAL_WHITE_CA }, + { "Red", OPTION_VAL_RED_CA }, + { "Green", OPTION_VAL_GREEN_CA }, + { "Blue", OPTION_VAL_BLUE_CA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHS, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHS }, - { "Red", OPTION_VAL_RED_CHS }, - { "Green", OPTION_VAL_GREEN_CHS }, - { "Blue", OPTION_VAL_BLUE_CHS }, + { "White", OPTION_VAL_WHITE_CA }, + { "Red", OPTION_VAL_RED_CA }, + { "Green", OPTION_VAL_GREEN_CA }, + { "Blue", OPTION_VAL_BLUE_CA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHS, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHS }, - { "Red", OPTION_VAL_RED_CHS }, - { "Green", OPTION_VAL_GREEN_CHS }, - { "Blue", OPTION_VAL_BLUE_CHS }, + { "White", OPTION_VAL_WHITE_CA }, + { "Red", OPTION_VAL_RED_CA }, + { "Green", OPTION_VAL_GREEN_CA }, + { "Blue", OPTION_VAL_BLUE_CA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHS, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHS }, - { "Red", OPTION_VAL_RED_CHS }, - { "Green", OPTION_VAL_GREEN_CHS }, - { "Blue", OPTION_VAL_BLUE_CHS }, + { "White", OPTION_VAL_WHITE_CA }, + { "Red", OPTION_VAL_RED_CA }, + { "Green", OPTION_VAL_GREEN_CA }, + { "Blue", OPTION_VAL_BLUE_CA }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CA }, + { "Purupuru", OPTION_VAL_PURUPURU_CA }, + { "None", OPTION_VAL_NONE_CA }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHS, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHS, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHS, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CA, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_CHS }, - { "All VMUs", OPTION_VAL_ALL_VMUS_CHS }, + { "VMU A1", OPTION_VAL_VMU_A1_CA }, + { "All VMUs", OPTION_VAL_ALL_VMUS_CA }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_CHS, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHS, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHS, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CA, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CA, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_CA, NULL, "vmu", { @@ -8427,9 +9497,9 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHS, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHS, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHS, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CA, NULL, "vmu", { @@ -8441,7 +9511,7 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHS, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CA, NULL, "", NULL, @@ -8455,144 +9525,144 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHS, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHS, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHS }, - { "2x", OPTION_VAL_2_O27_CHS }, - { "3x", OPTION_VAL_3X_CHS }, - { "4x", OPTION_VAL_4_CHS }, - { "5x", OPTION_VAL_5X_CHS }, + { "1x", OPTION_VAL_1X_CA }, + { "2x", OPTION_VAL_2_O26_CA }, + { "3x", OPTION_VAL_3X_CA }, + { "4x", OPTION_VAL_4_CA }, + { "5x", OPTION_VAL_5X_CA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHS, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "30%", OPTION_VAL_30_CHS }, - { "40%", OPTION_VAL_40_CHS }, - { "50%", OPTION_VAL_50_CHS }, - { "60%", OPTION_VAL_60_CHS }, - { "70%", OPTION_VAL_70_CHS }, - { "80%", OPTION_VAL_80_CHS }, - { "90%", OPTION_VAL_90_CHS }, - { "100%", OPTION_VAL_100_O57_CHS }, + { "10%", OPTION_VAL_10_CA }, + { "20%", OPTION_VAL_20_CA }, + { "30%", OPTION_VAL_30_CA }, + { "40%", OPTION_VAL_40_CA }, + { "50%", OPTION_VAL_50_CA }, + { "60%", OPTION_VAL_60_CA }, + { "70%", OPTION_VAL_70_CA }, + { "80%", OPTION_VAL_80_CA }, + { "90%", OPTION_VAL_90_CA }, + { "100%", OPTION_VAL_100_O45_CA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHS, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CA, NULL, "", NULL, @@ -8606,144 +9676,144 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHS, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHS, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHS }, - { "2x", OPTION_VAL_2_O27_CHS }, - { "3x", OPTION_VAL_3X_CHS }, - { "4x", OPTION_VAL_4_CHS }, - { "5x", OPTION_VAL_5X_CHS }, + { "1x", OPTION_VAL_1X_CA }, + { "2x", OPTION_VAL_2_O26_CA }, + { "3x", OPTION_VAL_3X_CA }, + { "4x", OPTION_VAL_4_CA }, + { "5x", OPTION_VAL_5X_CA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHS, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "30%", OPTION_VAL_30_CHS }, - { "40%", OPTION_VAL_40_CHS }, - { "50%", OPTION_VAL_50_CHS }, - { "60%", OPTION_VAL_60_CHS }, - { "70%", OPTION_VAL_70_CHS }, - { "80%", OPTION_VAL_80_CHS }, - { "90%", OPTION_VAL_90_CHS }, - { "100%", OPTION_VAL_100_O57_CHS }, + { "10%", OPTION_VAL_10_CA }, + { "20%", OPTION_VAL_20_CA }, + { "30%", OPTION_VAL_30_CA }, + { "40%", OPTION_VAL_40_CA }, + { "50%", OPTION_VAL_50_CA }, + { "60%", OPTION_VAL_60_CA }, + { "70%", OPTION_VAL_70_CA }, + { "80%", OPTION_VAL_80_CA }, + { "90%", OPTION_VAL_90_CA }, + { "100%", OPTION_VAL_100_O45_CA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHS, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CA, NULL, "", NULL, @@ -8757,144 +9827,144 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHS, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHS, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHS }, - { "2x", OPTION_VAL_2_O27_CHS }, - { "3x", OPTION_VAL_3X_CHS }, - { "4x", OPTION_VAL_4_CHS }, - { "5x", OPTION_VAL_5X_CHS }, + { "1x", OPTION_VAL_1X_CA }, + { "2x", OPTION_VAL_2_O26_CA }, + { "3x", OPTION_VAL_3X_CA }, + { "4x", OPTION_VAL_4_CA }, + { "5x", OPTION_VAL_5X_CA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHS, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "30%", OPTION_VAL_30_CHS }, - { "40%", OPTION_VAL_40_CHS }, - { "50%", OPTION_VAL_50_CHS }, - { "60%", OPTION_VAL_60_CHS }, - { "70%", OPTION_VAL_70_CHS }, - { "80%", OPTION_VAL_80_CHS }, - { "90%", OPTION_VAL_90_CHS }, - { "100%", OPTION_VAL_100_O57_CHS }, + { "10%", OPTION_VAL_10_CA }, + { "20%", OPTION_VAL_20_CA }, + { "30%", OPTION_VAL_30_CA }, + { "40%", OPTION_VAL_40_CA }, + { "50%", OPTION_VAL_50_CA }, + { "60%", OPTION_VAL_60_CA }, + { "70%", OPTION_VAL_70_CA }, + { "80%", OPTION_VAL_80_CA }, + { "90%", OPTION_VAL_90_CA }, + { "100%", OPTION_VAL_100_O45_CA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHS, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CA, NULL, "", NULL, @@ -8908,505 +9978,560 @@ struct retro_core_option_v2_definition option_defs_chs[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHS, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CA }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHS, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHS }, - { "2x", OPTION_VAL_2_O27_CHS }, - { "3x", OPTION_VAL_3X_CHS }, - { "4x", OPTION_VAL_4_CHS }, - { "5x", OPTION_VAL_5X_CHS }, + { "1x", OPTION_VAL_1X_CA }, + { "2x", OPTION_VAL_2_O26_CA }, + { "3x", OPTION_VAL_3X_CA }, + { "4x", OPTION_VAL_4_CA }, + { "5x", OPTION_VAL_5X_CA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHS, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, - { "BLUE 03", OPTION_VAL_BLUE_CHS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, - { "GREEN 05", OPTION_VAL_GREEN_CHS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, - { "RED 11", OPTION_VAL_RED_CHS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, - { "WHITE 28", OPTION_VAL_WHITE_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CA }, + { "BLACK 02", OPTION_VAL_BLACK_02_CA }, + { "BLUE 03", OPTION_VAL_BLUE_CA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CA }, + { "GREEN 05", OPTION_VAL_GREEN_CA }, + { "CYAN 06", OPTION_VAL_CYAN_06_CA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CA }, + { "RED 11", OPTION_VAL_RED_CA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CA }, + { "GRAY 15", OPTION_VAL_GRAY_15_CA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CA }, + { "WHITE 28", OPTION_VAL_WHITE_CA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHS, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHS }, - { "20%", OPTION_VAL_20_CHS }, - { "30%", OPTION_VAL_30_CHS }, - { "40%", OPTION_VAL_40_CHS }, - { "50%", OPTION_VAL_50_CHS }, - { "60%", OPTION_VAL_60_CHS }, - { "70%", OPTION_VAL_70_CHS }, - { "80%", OPTION_VAL_80_CHS }, - { "90%", OPTION_VAL_90_CHS }, - { "100%", OPTION_VAL_100_O57_CHS }, + { "10%", OPTION_VAL_10_CA }, + { "20%", OPTION_VAL_20_CA }, + { "30%", OPTION_VAL_30_CA }, + { "40%", OPTION_VAL_40_CA }, + { "50%", OPTION_VAL_50_CA }, + { "60%", OPTION_VAL_60_CA }, + { "70%", OPTION_VAL_70_CA }, + { "80%", OPTION_VAL_80_CA }, + { "90%", OPTION_VAL_90_CA }, + { "100%", OPTION_VAL_100_O45_CA }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_chs = { - option_cats_chs, - option_defs_chs +struct retro_core_options_v2 options_ca = { + option_cats_ca, + option_defs_ca }; -/* RETRO_LANGUAGE_CHT */ +/* RETRO_LANGUAGE_CHS */ -#define CATEGORY_SYSTEM_LABEL_CHT "系統" -#define CATEGORY_SYSTEM_INFO_0_CHT NULL -#define CATEGORY_VIDEO_LABEL_CHT "顯示" -#define CATEGORY_VIDEO_INFO_0_CHT "變更解析度、渲染透明度和視覺效果的設定。" -#define CATEGORY_PERFORMANCE_LABEL_CHT "效能" -#define CATEGORY_PERFORMANCE_INFO_0_CHT NULL -#define CATEGORY_HACKS_LABEL_CHT "進階" -#define CATEGORY_HACKS_INFO_0_CHT NULL -#define CATEGORY_INPUT_LABEL_CHT "輸入" -#define CATEGORY_INPUT_INFO_0_CHT NULL -#define CATEGORY_VMU_LABEL_CHT NULL -#define CATEGORY_VMU_INFO_0_CHT NULL -#define CORE_OPTION_NAME_REGION_LABEL_CHT "發售地" -#define OPTION_VAL_JAPAN_CHT NULL -#define OPTION_VAL_USA_CHT NULL -#define OPTION_VAL_EUROPE_CHT NULL -#define OPTION_VAL_DEFAULT_CHT "預設" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_CHT "語言" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CHT NULL -#define OPTION_VAL_JAPANESE_CHT "日語" -#define OPTION_VAL_ENGLISH_CHT "英語" -#define OPTION_VAL_GERMAN_CHT "德語" -#define OPTION_VAL_FRENCH_CHT "法語" -#define OPTION_VAL_SPANISH_CHT "西班牙語" -#define OPTION_VAL_ITALIAN_CHT "意大利語" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CHT NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHT NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHT NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHT NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_CHT NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CHT NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHT NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHT NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHT NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHT NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHT NULL -#define CORE_OPTION_NAME_UPNP_LABEL_CHT NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_CHT NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHT "內部解析度" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHT NULL -#define OPTION_VAL_320X240_CHT NULL -#define OPTION_VAL_640X480_CHT NULL -#define OPTION_VAL_800X600_CHT NULL -#define OPTION_VAL_960X720_CHT NULL -#define OPTION_VAL_1024X768_CHT NULL -#define OPTION_VAL_1280X960_CHT NULL -#define OPTION_VAL_1440X1080_CHT NULL -#define OPTION_VAL_1600X1200_CHT NULL -#define OPTION_VAL_1920X1440_CHT NULL -#define OPTION_VAL_2560X1920_CHT NULL -#define OPTION_VAL_2880X2160_CHT NULL -#define OPTION_VAL_3200X2400_CHT NULL -#define OPTION_VAL_3840X2880_CHT NULL -#define OPTION_VAL_4480X3360_CHT NULL -#define OPTION_VAL_5120X3840_CHT NULL -#define OPTION_VAL_5760X4320_CHT NULL -#define OPTION_VAL_6400X4800_CHT NULL -#define OPTION_VAL_7040X5280_CHT NULL -#define OPTION_VAL_7680X5760_CHT NULL -#define OPTION_VAL_8320X6240_CHT NULL -#define OPTION_VAL_8960X6720_CHT NULL -#define OPTION_VAL_9600X7200_CHT NULL -#define OPTION_VAL_10240X7680_CHT NULL -#define OPTION_VAL_10880X8160_CHT NULL -#define OPTION_VAL_11520X8640_CHT NULL -#define OPTION_VAL_12160X9120_CHT NULL -#define OPTION_VAL_12800X9600_CHT NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHT NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHT NULL -#define OPTION_VAL_VGA_CHT NULL -#define OPTION_VAL_TV_RGB_CHT NULL -#define OPTION_VAL_TV_COMPOSITE_CHT NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_CHT NULL -#define OPTION_VAL_NTSC_CHT NULL -#define OPTION_VAL_PAL_CHT NULL -#define OPTION_VAL_PAL_N_CHT NULL -#define OPTION_VAL_PAL_M_CHT NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHT "螢幕顯示方向" -#define OPTION_VAL_HORIZONTAL_CHT NULL -#define OPTION_VAL_VERTICAL_CHT NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHT NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHT NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_CHT NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_CHT NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHT NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHT NULL -#define OPTION_VAL_512MB_CHT NULL -#define OPTION_VAL_1GB_CHT NULL -#define OPTION_VAL_2GB_CHT NULL -#define OPTION_VAL_4GB_CHT NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHT NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHT NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHT NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHT NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHT NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CHT NULL -#define CORE_OPTION_NAME_FOG_LABEL_CHT NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHT NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHT NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHT NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHT "材質過濾" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHT NULL -#define OPTION_VAL_1_CHT NULL -#define OPTION_VAL_2_CHT NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHT NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHT NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHT NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHT NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHT NULL -#define OPTION_VAL_2_O27_CHT "2倍" -#define OPTION_VAL_4_CHT "4倍" -#define OPTION_VAL_6_CHT "6倍" -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHT NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHT NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHT NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHT NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHT NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHT NULL -#define OPTION_VAL_SOME_CHT "正常" -#define OPTION_VAL_MORE_CHT NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHT NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHT NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHT NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHT NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHT NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHT NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CHT NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHT NULL -#define OPTION_VAL_100_CHT NULL -#define OPTION_VAL_110_CHT NULL -#define OPTION_VAL_120_CHT NULL -#define OPTION_VAL_130_CHT NULL -#define OPTION_VAL_140_CHT NULL -#define OPTION_VAL_150_CHT NULL -#define OPTION_VAL_160_CHT NULL -#define OPTION_VAL_170_CHT NULL -#define OPTION_VAL_180_CHT NULL -#define OPTION_VAL_190_CHT NULL -#define OPTION_VAL_200_CHT NULL -#define OPTION_VAL_210_CHT NULL -#define OPTION_VAL_220_CHT NULL -#define OPTION_VAL_230_CHT NULL -#define OPTION_VAL_240_CHT NULL -#define OPTION_VAL_250_CHT NULL -#define OPTION_VAL_260_CHT NULL -#define OPTION_VAL_270_CHT NULL -#define OPTION_VAL_280_CHT NULL -#define OPTION_VAL_290_CHT NULL -#define OPTION_VAL_300_CHT NULL -#define OPTION_VAL_310_CHT NULL -#define OPTION_VAL_320_CHT NULL -#define OPTION_VAL_330_CHT NULL -#define OPTION_VAL_340_CHT NULL -#define OPTION_VAL_350_CHT NULL -#define OPTION_VAL_360_CHT NULL -#define OPTION_VAL_370_CHT NULL -#define OPTION_VAL_380_CHT NULL -#define OPTION_VAL_390_CHT NULL -#define OPTION_VAL_400_CHT NULL -#define OPTION_VAL_410_CHT NULL -#define OPTION_VAL_420_CHT NULL -#define OPTION_VAL_430_CHT NULL -#define OPTION_VAL_440_CHT NULL -#define OPTION_VAL_450_CHT NULL -#define OPTION_VAL_460_CHT NULL -#define OPTION_VAL_470_CHT NULL -#define OPTION_VAL_480_CHT NULL -#define OPTION_VAL_490_CHT NULL -#define OPTION_VAL_500_CHT NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHT NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHT NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHT NULL -#define OPTION_VAL_0_CHT NULL -#define OPTION_VAL_5_CHT NULL -#define OPTION_VAL_10_CHT NULL -#define OPTION_VAL_15_CHT NULL -#define OPTION_VAL_20_CHT NULL -#define OPTION_VAL_25_CHT NULL -#define OPTION_VAL_30_CHT NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHT NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHT NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CHT NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CHT NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHT NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHT NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHT NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHT NULL -#define OPTION_VAL_WHITE_CHT "白色" -#define OPTION_VAL_RED_CHT "紅色" -#define OPTION_VAL_GREEN_CHT "綠色" -#define OPTION_VAL_BLUE_CHT "藍色" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHT NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHT NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHT NULL -#define OPTION_VAL_VMU_A1_CHT NULL -#define OPTION_VAL_ALL_VMUS_CHT NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHT NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHT NULL -#define OPTION_VAL_UPPER_LEFT_CHT NULL -#define OPTION_VAL_UPPER_RIGHT_CHT NULL -#define OPTION_VAL_LOWER_LEFT_CHT NULL -#define OPTION_VAL_LOWER_RIGHT_CHT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHT NULL -#define OPTION_VAL_1X_CHT "1倍" -#define OPTION_VAL_3X_CHT "3倍" -#define OPTION_VAL_5X_CHT "5倍" -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHT NULL -#define OPTION_VAL_DEFAULT_ON_00_CHT NULL -#define OPTION_VAL_DEFAULT_OFF_01_CHT NULL -#define OPTION_VAL_BLACK_02_CHT "黑色" -#define OPTION_VAL_LIGHT_BLUE_04_CHT "淺藍色" -#define OPTION_VAL_CYAN_06_CHT "青色" -#define OPTION_VAL_CYAN_BLUE_07_CHT "青藍色" -#define OPTION_VAL_LIGHT_GREEN_08_CHT "淺綠色" -#define OPTION_VAL_CYAN_GREEN_09_CHT "青綠色" -#define OPTION_VAL_LIGHT_CYAN_10_CHT "淺青色" -#define OPTION_VAL_PURPLE_12_CHT "紫色" -#define OPTION_VAL_LIGHT_PURPLE_13_CHT "淺紫色" -#define OPTION_VAL_YELLOW_14_CHT "黃色" -#define OPTION_VAL_GRAY_15_CHT "灰色" -#define OPTION_VAL_LIGHT_PURPLE_2_16_CHT "淺紫色 (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_CHT "淺綠色 (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_CHT "淺綠色 (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_CHT "淺青色 (2)" -#define OPTION_VAL_LIGHT_RED_2_20_CHT "淡紅色 (2)" -#define OPTION_VAL_MAGENTA_21_CHT "洋紅色" -#define OPTION_VAL_LIGHT_PURPLE_3_22_CHT "淺紫色 (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_CHT "淺橘色" -#define OPTION_VAL_ORANGE_24_CHT "橙色" -#define OPTION_VAL_LIGHT_PURPLE_4_25_CHT "淺紫色 (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_CHT "淡黃色" -#define OPTION_VAL_LIGHT_YELLOW_2_27_CHT "淡黃色 (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHT NULL -#define OPTION_VAL_40_CHT NULL -#define OPTION_VAL_50_CHT NULL -#define OPTION_VAL_60_CHT NULL -#define OPTION_VAL_70_CHT NULL -#define OPTION_VAL_80_CHT NULL -#define OPTION_VAL_90_CHT NULL -#define OPTION_VAL_100_O57_CHT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHT NULL +#define CATEGORY_SYSTEM_LABEL_CHS "系统" +#define CATEGORY_SYSTEM_INFO_0_CHS "配置区域, 语言, BIOS和基础硬件设置." +#define CATEGORY_VIDEO_LABEL_CHS "视频" +#define CATEGORY_VIDEO_INFO_0_CHS "配置分辨率, 与顺序无关的透明度和视觉效果." +#define CATEGORY_PERFORMANCE_LABEL_CHS "性能" +#define CATEGORY_PERFORMANCE_INFO_0_CHS "配置线程渲染和跳帧设置." +#define CATEGORY_HACKS_LABEL_CHS "模拟修改" +#define CATEGORY_HACKS_INFO_0_CHS "配置宽屏覆盖, GD-ROM 加载速度和纹理替换设置." +#define CATEGORY_INPUT_LABEL_CHS "输入" +#define CATEGORY_INPUT_INFO_0_CHS "配置游戏手柄和光枪." +#define CATEGORY_EXPANSIONS_LABEL_CHS "控制器扩展槽" +#define CATEGORY_EXPANSIONS_INFO_0_CHS "选择插入每个控制器扩展槽的设备 (VMU, 震动设备)." +#define CATEGORY_VMU_LABEL_CHS "VMU 记忆卡掌机" +#define CATEGORY_VMU_INFO_0_CHS "配置每个游戏的 VMU 保存文件和屏幕上 VMU 的可见性." +#define CORE_OPTION_NAME_REGION_LABEL_CHS "区域" +#define OPTION_VAL_JAPAN_CHS "日本" +#define OPTION_VAL_USA_CHS "美国" +#define OPTION_VAL_EUROPE_CHS "欧洲" +#define OPTION_VAL_DEFAULT_CHS "默认值" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_CHS "语言" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CHS "改变 BIOS 和任何包含多语言游戏所使用的语言." +#define OPTION_VAL_JAPANESE_CHS "日语" +#define OPTION_VAL_ENGLISH_CHS "英语" +#define OPTION_VAL_GERMAN_CHS "德语" +#define OPTION_VAL_FRENCH_CHS "法语" +#define OPTION_VAL_SPANISH_CHS "西班牙语" +#define OPTION_VAL_ITALIAN_CHS "意大利语" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CHS "HLE BIOS (需要重启)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHS "强制使用高级模拟 BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHS "启动 BIOS (需要重启)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHS "启动进入 Dreamcast BIOS 菜单." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHS "启用 DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHS "启用模拟器 Dreamcast 音频 DSP (数字信号处理器). 提高生成声音的精确性, 但相应增加了性能需求." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHS "允许街机服务按钮\"" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHS "启用街机游戏服务按钮, 进入机柜设置." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHS "NAOMI 游戏设置为免费游戏" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHS "修改游戏的硬币设置为免费游戏." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHS "模拟宽带适配器" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHS "模拟以太网宽带适配器而不是调制解调器. (需要重启)" +#define CORE_OPTION_NAME_UPNP_LABEL_CHS "启用 UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_CHS "使用 UPnP 自动配置您的网络路由器进行在线游戏." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHS "内部分辨率" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHS "修改渲染分辨率." +#define OPTION_VAL_320X240_CHS "320x240 (1/2)" +#define OPTION_VAL_640X480_CHS "640x480 (原生)" +#define OPTION_VAL_800X600_CHS NULL +#define OPTION_VAL_960X720_CHS NULL +#define OPTION_VAL_1024X768_CHS NULL +#define OPTION_VAL_1280X960_CHS NULL +#define OPTION_VAL_1440X1080_CHS NULL +#define OPTION_VAL_1600X1200_CHS NULL +#define OPTION_VAL_1920X1440_CHS NULL +#define OPTION_VAL_2560X1920_CHS NULL +#define OPTION_VAL_2880X2160_CHS NULL +#define OPTION_VAL_3200X2400_CHS NULL +#define OPTION_VAL_3840X2880_CHS NULL +#define OPTION_VAL_4480X3360_CHS NULL +#define OPTION_VAL_5120X3840_CHS NULL +#define OPTION_VAL_5760X4320_CHS NULL +#define OPTION_VAL_6400X4800_CHS NULL +#define OPTION_VAL_7040X5280_CHS NULL +#define OPTION_VAL_7680X5760_CHS NULL +#define OPTION_VAL_8320X6240_CHS NULL +#define OPTION_VAL_8960X6720_CHS NULL +#define OPTION_VAL_9600X7200_CHS NULL +#define OPTION_VAL_10240X7680_CHS NULL +#define OPTION_VAL_10880X8160_CHS NULL +#define OPTION_VAL_11520X8640_CHS NULL +#define OPTION_VAL_12160X9120_CHS NULL +#define OPTION_VAL_12800X9600_CHS NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHS "线缆类型" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHS "输出信号类型. 最广泛支持的 '电视 (复合端子)'." +#define OPTION_VAL_VGA_CHS NULL +#define OPTION_VAL_TV_RGB_CHS NULL +#define OPTION_VAL_TV_COMPOSITE_CHS "TV (复合端子)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_CHS "电视标准制式" +#define OPTION_VAL_NTSC_CHS NULL +#define OPTION_VAL_PAL_CHS "PAL (全球)" +#define OPTION_VAL_PAL_N_CHS "PAL-N (阿根廷, 巴拉圭, 乌拉圭)" +#define OPTION_VAL_PAL_M_CHS "PAL-M (巴西)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHS "屏幕方向" +#define OPTION_VAL_HORIZONTAL_CHS "水平" +#define OPTION_VAL_VERTICAL_CHS "垂直" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHS "透明排序" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CHS "选择透明多边形的排序方式." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHS "条形 (快速, 最不精确)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_CHS "三角形 (正常)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_CHS "像素 (最慢, 精确)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHS "累积像素缓存大小" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHS "为了正确输出更高分辨率可能需要更高的值." +#define OPTION_VAL_512MB_CHS NULL +#define OPTION_VAL_1GB_CHS NULL +#define OPTION_VAL_2GB_CHS NULL +#define OPTION_VAL_4GB_CHS NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHS "最大透明层数" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHS "复杂场景可能需要更高的数值." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHS "全帧缓存仿真" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHS "在 VRAM 中启用全帧缓存仿真. 对于在 VRAM 上直接读取或写入帧缓存的游戏非常有用. 启用后, 内部分辨率将强制设置为 640x480, 性能可能会受到影响." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHS "启用 RTT (纹理渲染) 缓存" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHS "将渲染的纹理从 GPU 复制回 VRAM. 游戏需要支持此选项才能启用. 启用时, 纹理渲染放大将被禁用, 性能可能会受到影响." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CHS "纹理映射" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_CHS "启用纹理后, 当纹理出现在较远的地方时就会使用较小版本的纹理, 这可以提高性能并减少闪烁." +#define CORE_OPTION_NAME_FOG_LABEL_CHS "雾化效果" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHS "体积编辑" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHS "Dreamcast GPU 的功能, 通常被游戏用来绘制阴影对象. 一般情况下应该启用该功能 - 对性能的影响很小可以忽略不计." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHS "各向异性过滤" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHS "可以使倾斜的表面纹理更清晰, 对 GPU 有较高的要求. 重新启动后生效." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHS "纹理过滤" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHS "可以在所有纹理上强制使用某种纹理过滤模式. 以获得比默认模式更清晰 (更平滑) 的画面. 重新启动后生效." +#define OPTION_VAL_1_CHS "强制最近邻" +#define OPTION_VAL_2_CHS "线性过滤" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHS "切换延迟帧" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHS "对避免闪屏或视频故障很有用. 不建议在低阶平台上使用." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHS "检测帧率变化" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHS "当内部帧率改变时通知前端 (例如从60fps到30fps). 改善锁定的30fps或20fps游戏运行时的帧速率, 但对于未锁定 (不稳定) 帧速率的游戏应禁用 (例如 Ecco the Dolphin, Unreal Tournament). 注意: 当 '自动跳帧' 启用时不可用." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHS "PowerVR2 后处理滤镜" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHS "对渲染的图像进行后处理以模拟 PowerVR2 GPU 的特有视频信号效果." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHS "纹理升频 (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHS "增强手绘 2D 像素艺术图形. 仅适用于 2D 像素化游戏." +#define OPTION_VAL_2_O26_CHS "2倍" +#define OPTION_VAL_4_CHS "4倍" +#define OPTION_VAL_6_CHS "6倍" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHS "纹理升频最大值. 过滤大小" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CHS "为纹理升频选择一个最大尺寸值, 如果纹理尺寸大于所选值则不会升频." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHS "原生位深插值" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHS "解决 AMD GPU 的纹理损坏和位深问题. 某些情况下也适用英特尔 GPU." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CHS "修复升频时边缘出血" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CHS "有助于解决升频时纹理出血的问题. 在 2D 游戏 (例如: MVC2, CVS, KOF 等等) 中, 如果升频时像素出现扭曲, 应该禁用该功能" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHS "多线程渲染" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHS "在不同的线程上运行 GPU 和 CPU. 强烈推荐." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHS "自动跳帧" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHS "当游戏仿真运行缓慢时自动跳帧. 注意: 这个设置必须启用 '线程渲染' 选项." +#define OPTION_VAL_SOME_CHS "正常" +#define OPTION_VAL_MORE_CHS "最大" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHS "跳帧" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHS "设置两个实际渲染帧之间跳过的帧数." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHS "宽屏作弊 (需要重启)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHS "激活宽屏作弊可以修改某些游戏以宽屏格式显示.\"" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHS "宽屏增强" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHS "在正常的 4:3 宽高比之外绘制几何图形. 可能在显示区域产生图形故障." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHS "GD-ROM 快速读盘 (不精确)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHS "加快 GD-ROM 读取速度." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CHS "Dreamcast 32MB 内存模块" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CHS "启用 Dreamcast 32MB 内存模块. 可能会影响兼容性" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CHS "SH4 CPU 解锁/超频" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHS "改变默认 SH4 主 CPU 时钟到 200 MHz. 解锁可能拖慢平台速度. 超频可能会增加某些游戏的帧率. 谨慎使用." +#define OPTION_VAL_100_CHS NULL +#define OPTION_VAL_110_CHS NULL +#define OPTION_VAL_120_CHS NULL +#define OPTION_VAL_130_CHS NULL +#define OPTION_VAL_140_CHS NULL +#define OPTION_VAL_150_CHS NULL +#define OPTION_VAL_160_CHS NULL +#define OPTION_VAL_170_CHS NULL +#define OPTION_VAL_180_CHS NULL +#define OPTION_VAL_190_CHS NULL +#define OPTION_VAL_200_CHS NULL +#define OPTION_VAL_210_CHS NULL +#define OPTION_VAL_220_CHS NULL +#define OPTION_VAL_230_CHS NULL +#define OPTION_VAL_240_CHS NULL +#define OPTION_VAL_250_CHS NULL +#define OPTION_VAL_260_CHS NULL +#define OPTION_VAL_270_CHS NULL +#define OPTION_VAL_280_CHS NULL +#define OPTION_VAL_290_CHS NULL +#define OPTION_VAL_300_CHS NULL +#define OPTION_VAL_310_CHS NULL +#define OPTION_VAL_320_CHS NULL +#define OPTION_VAL_330_CHS NULL +#define OPTION_VAL_340_CHS NULL +#define OPTION_VAL_350_CHS NULL +#define OPTION_VAL_360_CHS NULL +#define OPTION_VAL_370_CHS NULL +#define OPTION_VAL_380_CHS NULL +#define OPTION_VAL_390_CHS NULL +#define OPTION_VAL_400_CHS NULL +#define OPTION_VAL_410_CHS NULL +#define OPTION_VAL_420_CHS NULL +#define OPTION_VAL_430_CHS NULL +#define OPTION_VAL_440_CHS NULL +#define OPTION_VAL_450_CHS NULL +#define OPTION_VAL_460_CHS NULL +#define OPTION_VAL_470_CHS NULL +#define OPTION_VAL_480_CHS NULL +#define OPTION_VAL_490_CHS NULL +#define OPTION_VAL_500_CHS NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHS "加载自定义纹理" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CHS "加载位于 'system/dc/textures//' 文件夹中的自定义纹理." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHS "转储纹理" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CHS "每次游戏使用新纹理时, 都会以 .png 文件的形式保存在 'system/dc/texdump//' 文件夹中." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHS "摇杆死区" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CHS "选择要按多少次模拟摇杆才开始运行." +#define OPTION_VAL_0_CHS NULL +#define OPTION_VAL_5_CHS NULL +#define OPTION_VAL_10_CHS NULL +#define OPTION_VAL_15_CHS NULL +#define OPTION_VAL_20_CHS NULL +#define OPTION_VAL_25_CHS NULL +#define OPTION_VAL_30_CHS NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHS "扳机死区" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CHS "选择要按多少次扳机才开始运行." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHS "数字扳机" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CHS "启用后, 扳机像普通按钮一样运行为完全按下或未按下, 键程没有任何区别." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHS "输出数字制式" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHS "在 TCP 端口 8000 上输出数字制式和强制反馈. 兼容 \"-output network\" MAME 选项." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHS "光枪显示设置" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHS "启用光枪准星显示配置选项. 注意: 可能需要切换快捷菜单此设置才生效." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CHS "光枪准星缩放大小" +#define OPTION_VAL_50_CHS NULL +#define OPTION_VAL_60_CHS NULL +#define OPTION_VAL_70_CHS NULL +#define OPTION_VAL_80_CHS NULL +#define OPTION_VAL_90_CHS NULL +#define OPTION_VAL_100_O45_CHS NULL +#define OPTION_VAL_110_O45_CHS NULL +#define OPTION_VAL_120_O45_CHS NULL +#define OPTION_VAL_130_O45_CHS NULL +#define OPTION_VAL_140_O45_CHS NULL +#define OPTION_VAL_150_O45_CHS NULL +#define OPTION_VAL_160_O45_CHS NULL +#define OPTION_VAL_170_O45_CHS NULL +#define OPTION_VAL_180_O45_CHS NULL +#define OPTION_VAL_190_O45_CHS NULL +#define OPTION_VAL_200_O45_CHS NULL +#define OPTION_VAL_210_O45_CHS NULL +#define OPTION_VAL_220_O45_CHS NULL +#define OPTION_VAL_230_O45_CHS NULL +#define OPTION_VAL_240_O45_CHS NULL +#define OPTION_VAL_250_O45_CHS NULL +#define OPTION_VAL_260_O45_CHS NULL +#define OPTION_VAL_270_O45_CHS NULL +#define OPTION_VAL_280_O45_CHS NULL +#define OPTION_VAL_290_O45_CHS NULL +#define OPTION_VAL_300_O45_CHS NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHS "光枪准星 1 显示" +#define OPTION_VAL_WHITE_CHS "白色" +#define OPTION_VAL_RED_CHS "红色" +#define OPTION_VAL_GREEN_CHS "绿色" +#define OPTION_VAL_BLUE_CHS "蓝色" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHS "光枪准星 2 显示" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHS "光枪准星 3 显示" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHS "光枪准星 4 显示" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CHS "扩展槽 A1 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CHS "选择插入扩展槽 A1 (端口 A 槽位 1) 的设备." +#define OPTION_VAL_VMU_CHS NULL +#define OPTION_VAL_PURUPURU_CHS "震动包" +#define OPTION_VAL_NONE_CHS "无" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CHS "扩展槽 A2 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CHS "选择插入扩展槽 A2 (端口 A 槽位 2) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CHS "扩展槽 B1 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CHS "选择插入扩展槽 B1 (端口 B 槽位 1) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CHS "扩展槽 B2 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CHS "选择插入扩展槽 B2 (端口 B 槽位 2) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CHS "扩展槽 C1 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CHS "选择插入扩展槽 C1 (端口 C 槽位 1) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CHS "扩展槽 C2 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CHS "选择插入扩展槽 C2 (端口 C 槽位 2) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CHS "扩展槽 D1 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CHS "选择插入扩展槽 D1 (端口 D 槽位 1) 的设备." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CHS "扩展槽 D2 中的设备" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CHS "选择插入扩展槽 D2 (端口 D 槽位 2) 的设备." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHS "每个游戏的记忆卡掌机/系统 (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHS "每个游戏 VMU" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHS "禁用时, 所有游戏共享位于 RetroArch 系统目录中的 8 个 VMU 存档文件 (A1/A2/B1/B2/C1/C2/D1/D2).\n'VMU A1' 为每个启动的游戏在 RetroArch 存档目录中创建一个 VMU 'A1' 存档文件.\n'全部 VMU' 为每个启动的游戏创建 8 个 VMU 存档文件 (A1/A2/B1/B2/C1/C2/D1/D2)." +#define OPTION_VAL_VMU_A1_CHS NULL +#define OPTION_VAL_ALL_VMUS_CHS "全部 VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CHS "Visual Memory Units/系统 (VMU) 声音" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHS "VMU 声音" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHS "启用时, 将播放 VMU 游玩音效." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHS "显示记忆卡掌机/显示设置系统 (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHS "展示 VMU 显示设置" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHS "启用配置并模拟 VMU LCD 屏幕的可见性, 大小, 位置和颜色. 注意: 可能需要切换快捷菜单此设置才生效." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHS "VMU 屏幕 1 显示" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHS "VMU 屏幕 1 位置" +#define OPTION_VAL_UPPER_LEFT_CHS "左上角" +#define OPTION_VAL_UPPER_RIGHT_CHS "右上角" +#define OPTION_VAL_LOWER_LEFT_CHS "左下角" +#define OPTION_VAL_LOWER_RIGHT_CHS "右下角" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHS "VMU 屏幕 1 大小" +#define OPTION_VAL_1X_CHS "1倍" +#define OPTION_VAL_3X_CHS "3倍" +#define OPTION_VAL_5X_CHS "5倍" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHS "VMU 屏幕 1 背景像素颜色" +#define OPTION_VAL_DEFAULT_ON_00_CHS "默认打开" +#define OPTION_VAL_DEFAULT_OFF_01_CHS "默认关闭" +#define OPTION_VAL_BLACK_02_CHS "黑色" +#define OPTION_VAL_LIGHT_BLUE_04_CHS "浅蓝色" +#define OPTION_VAL_CYAN_06_CHS "青色" +#define OPTION_VAL_CYAN_BLUE_07_CHS "青蓝色" +#define OPTION_VAL_LIGHT_GREEN_08_CHS "浅绿色" +#define OPTION_VAL_CYAN_GREEN_09_CHS "青绿色" +#define OPTION_VAL_LIGHT_CYAN_10_CHS "浅青色" +#define OPTION_VAL_PURPLE_12_CHS "紫色" +#define OPTION_VAL_LIGHT_PURPLE_13_CHS "紫色" +#define OPTION_VAL_YELLOW_14_CHS "黄色" +#define OPTION_VAL_GRAY_15_CHS "灰色" +#define OPTION_VAL_LIGHT_PURPLE_2_16_CHS "浅紫色 (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_CHS "浅绿色 (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_CHS "浅绿色 (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_CHS "浅青色 (2)" +#define OPTION_VAL_LIGHT_RED_2_20_CHS "浅红色 (2)" +#define OPTION_VAL_MAGENTA_21_CHS "品红色" +#define OPTION_VAL_LIGHT_PURPLE_3_22_CHS "浅紫色 (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_CHS "浅橙色" +#define OPTION_VAL_ORANGE_24_CHS "橙色" +#define OPTION_VAL_LIGHT_PURPLE_4_25_CHS "浅紫色 (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_CHS "浅黄色" +#define OPTION_VAL_LIGHT_YELLOW_2_27_CHS "浅黄色 (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHS "VMU 屏幕 1 前景像素颜色" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHS "VMU 屏幕 1 不透明度" +#define OPTION_VAL_40_CHS NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHS "VMU 屏幕 2 显示" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHS "VMU 屏幕 2 位置" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHS "VMU 屏幕 2 大小" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHS "VMU 屏幕 2 背景像素颜色" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHS "VMU 屏幕 2 前景像素颜色" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHS "VMU 屏幕 2 不透明度" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHS "VMU 屏幕 3 显示" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHS "VMU 屏幕 3 位置" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHS "VMU 屏幕 3 大小" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHS "VMU 屏幕 3 背景像素颜色" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHS "VMU 屏幕 3 前景像素颜色" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHS "VMU 屏幕 3 不透明度" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHS "VMU 屏幕 4 显示" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHS "VMU 屏幕 4 位置" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHS "VMU 屏幕 4 大小" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHS "VMU 屏幕 4 背景像素颜色" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHS "VMU 屏幕 4 前景像素颜色" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHS "VMU 屏幕 4 不透明度" -struct retro_core_option_v2_category option_cats_cht[] = { +struct retro_core_option_v2_category option_cats_chs[] = { { "system", - CATEGORY_SYSTEM_LABEL_CHT, - CATEGORY_SYSTEM_INFO_0_CHT + CATEGORY_SYSTEM_LABEL_CHS, + CATEGORY_SYSTEM_INFO_0_CHS }, { "video", - CATEGORY_VIDEO_LABEL_CHT, - CATEGORY_VIDEO_INFO_0_CHT + CATEGORY_VIDEO_LABEL_CHS, + CATEGORY_VIDEO_INFO_0_CHS }, { "performance", - CATEGORY_PERFORMANCE_LABEL_CHT, - CATEGORY_PERFORMANCE_INFO_0_CHT + CATEGORY_PERFORMANCE_LABEL_CHS, + CATEGORY_PERFORMANCE_INFO_0_CHS }, { "hacks", - CATEGORY_HACKS_LABEL_CHT, - CATEGORY_HACKS_INFO_0_CHT + CATEGORY_HACKS_LABEL_CHS, + CATEGORY_HACKS_INFO_0_CHS }, { "input", - CATEGORY_INPUT_LABEL_CHT, - CATEGORY_INPUT_INFO_0_CHT + CATEGORY_INPUT_LABEL_CHS, + CATEGORY_INPUT_INFO_0_CHS + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_CHS, + CATEGORY_EXPANSIONS_INFO_0_CHS }, { "vmu", - CATEGORY_VMU_LABEL_CHT, - CATEGORY_VMU_INFO_0_CHT + CATEGORY_VMU_LABEL_CHS, + CATEGORY_VMU_INFO_0_CHS }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_cht[] = { +struct retro_core_option_v2_definition option_defs_chs[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_CHT, + CORE_OPTION_NAME_REGION_LABEL_CHS, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_CHT }, - { "USA", OPTION_VAL_USA_CHT }, - { "Europe", OPTION_VAL_EUROPE_CHT }, - { "Default", OPTION_VAL_DEFAULT_CHT }, + { "Japan", OPTION_VAL_JAPAN_CHS }, + { "USA", OPTION_VAL_USA_CHS }, + { "Europe", OPTION_VAL_EUROPE_CHS }, + { "Default", OPTION_VAL_DEFAULT_CHS }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_CHT, + CORE_OPTION_NAME_LANGUAGE_LABEL_CHS, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_CHT, + CORE_OPTION_NAME_LANGUAGE_INFO_0_CHS, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_CHT }, - { "English", OPTION_VAL_ENGLISH_CHT }, - { "German", OPTION_VAL_GERMAN_CHT }, - { "French", OPTION_VAL_FRENCH_CHT }, - { "Spanish", OPTION_VAL_SPANISH_CHT }, - { "Italian", OPTION_VAL_ITALIAN_CHT }, - { "Default", OPTION_VAL_DEFAULT_CHT }, + { "Japanese", OPTION_VAL_JAPANESE_CHS }, + { "English", OPTION_VAL_ENGLISH_CHS }, + { "German", OPTION_VAL_GERMAN_CHS }, + { "French", OPTION_VAL_FRENCH_CHS }, + { "Spanish", OPTION_VAL_SPANISH_CHS }, + { "Italian", OPTION_VAL_ITALIAN_CHS }, + { "Default", OPTION_VAL_DEFAULT_CHS }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_CHT, + CORE_OPTION_NAME_HLE_BIOS_LABEL_CHS, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHT, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHS, NULL, "system", { @@ -9418,9 +10543,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHT, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHS, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHT, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHS, NULL, "system", { @@ -9432,9 +10557,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHT, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHS, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHT, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHS, NULL, "system", { @@ -9448,25 +10573,11 @@ struct retro_core_option_v2_definition option_defs_cht[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_CHT, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CHT, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHS, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHS, NULL, "system", { @@ -9478,9 +10589,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHT, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHS, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHT, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHS, NULL, "system", { @@ -9492,9 +10603,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHT, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHS, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHT, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHS, NULL, "system", { @@ -9506,9 +10617,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_CHT, + CORE_OPTION_NAME_UPNP_LABEL_CHS, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_CHT, + CORE_OPTION_NAME_UPNP_INFO_0_CHS, NULL, "system", { @@ -9521,39 +10632,39 @@ struct retro_core_option_v2_definition option_defs_cht[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHS, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHS, NULL, "video", { - { "320x240", OPTION_VAL_320X240_CHT }, - { "640x480", OPTION_VAL_640X480_CHT }, - { "800x600", OPTION_VAL_800X600_CHT }, - { "960x720", OPTION_VAL_960X720_CHT }, - { "1024x768", OPTION_VAL_1024X768_CHT }, - { "1280x960", OPTION_VAL_1280X960_CHT }, - { "1440x1080", OPTION_VAL_1440X1080_CHT }, - { "1600x1200", OPTION_VAL_1600X1200_CHT }, - { "1920x1440", OPTION_VAL_1920X1440_CHT }, - { "2560x1920", OPTION_VAL_2560X1920_CHT }, - { "2880x2160", OPTION_VAL_2880X2160_CHT }, - { "3200x2400", OPTION_VAL_3200X2400_CHT }, - { "3840x2880", OPTION_VAL_3840X2880_CHT }, - { "4480x3360", OPTION_VAL_4480X3360_CHT }, - { "5120x3840", OPTION_VAL_5120X3840_CHT }, - { "5760x4320", OPTION_VAL_5760X4320_CHT }, - { "6400x4800", OPTION_VAL_6400X4800_CHT }, - { "7040x5280", OPTION_VAL_7040X5280_CHT }, - { "7680x5760", OPTION_VAL_7680X5760_CHT }, - { "8320x6240", OPTION_VAL_8320X6240_CHT }, - { "8960x6720", OPTION_VAL_8960X6720_CHT }, - { "9600x7200", OPTION_VAL_9600X7200_CHT }, - { "10240x7680", OPTION_VAL_10240X7680_CHT }, - { "10880x8160", OPTION_VAL_10880X8160_CHT }, - { "11520x8640", OPTION_VAL_11520X8640_CHT }, - { "12160x9120", OPTION_VAL_12160X9120_CHT }, - { "12800x9600", OPTION_VAL_12800X9600_CHT }, + { "320x240", OPTION_VAL_320X240_CHS }, + { "640x480", OPTION_VAL_640X480_CHS }, + { "800x600", OPTION_VAL_800X600_CHS }, + { "960x720", OPTION_VAL_960X720_CHS }, + { "1024x768", OPTION_VAL_1024X768_CHS }, + { "1280x960", OPTION_VAL_1280X960_CHS }, + { "1440x1080", OPTION_VAL_1440X1080_CHS }, + { "1600x1200", OPTION_VAL_1600X1200_CHS }, + { "1920x1440", OPTION_VAL_1920X1440_CHS }, + { "2560x1920", OPTION_VAL_2560X1920_CHS }, + { "2880x2160", OPTION_VAL_2880X2160_CHS }, + { "3200x2400", OPTION_VAL_3200X2400_CHS }, + { "3840x2880", OPTION_VAL_3840X2880_CHS }, + { "4480x3360", OPTION_VAL_4480X3360_CHS }, + { "5120x3840", OPTION_VAL_5120X3840_CHS }, + { "5760x4320", OPTION_VAL_5760X4320_CHS }, + { "6400x4800", OPTION_VAL_6400X4800_CHS }, + { "7040x5280", OPTION_VAL_7040X5280_CHS }, + { "7680x5760", OPTION_VAL_7680X5760_CHS }, + { "8320x6240", OPTION_VAL_8320X6240_CHS }, + { "8960x6720", OPTION_VAL_8960X6720_CHS }, + { "9600x7200", OPTION_VAL_9600X7200_CHS }, + { "10240x7680", OPTION_VAL_10240X7680_CHS }, + { "10880x8160", OPTION_VAL_10880X8160_CHS }, + { "11520x8640", OPTION_VAL_11520X8640_CHS }, + { "12160x9120", OPTION_VAL_12160X9120_CHS }, + { "12800x9600", OPTION_VAL_12800X9600_CHS }, { NULL, NULL }, }, #ifdef LOW_RES @@ -9564,62 +10675,62 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHT, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHS, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHT, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHS, NULL, "video", { - { "VGA", OPTION_VAL_VGA_CHT }, - { "TV (RGB)", OPTION_VAL_TV_RGB_CHT }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CHT }, + { "VGA", OPTION_VAL_VGA_CHS }, + { "TV (RGB)", OPTION_VAL_TV_RGB_CHS }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CHS }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_CHT, + CORE_OPTION_NAME_BROADCAST_LABEL_CHS, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_CHT }, - { "PAL", OPTION_VAL_PAL_CHT }, - { "PAL_N", OPTION_VAL_PAL_N_CHT }, - { "PAL_M", OPTION_VAL_PAL_M_CHT }, - { "Default", OPTION_VAL_DEFAULT_CHT }, + { "NTSC", OPTION_VAL_NTSC_CHS }, + { "PAL", OPTION_VAL_PAL_CHS }, + { "PAL_N", OPTION_VAL_PAL_N_CHS }, + { "PAL_M", OPTION_VAL_PAL_M_CHS }, + { "Default", OPTION_VAL_DEFAULT_CHS }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHT, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHS, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_CHT }, - { "vertical", OPTION_VAL_VERTICAL_CHT }, + { "horizontal", OPTION_VAL_HORIZONTAL_CHS }, + { "vertical", OPTION_VAL_VERTICAL_CHS }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHT, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CHS, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHT }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CHT }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHS }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CHS }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CHT }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CHS }, #endif { NULL, NULL }, }, @@ -9632,25 +10743,25 @@ struct retro_core_option_v2_definition option_defs_cht[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHS, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHS, NULL, "video", { - { "512MB", OPTION_VAL_512MB_CHT }, - { "1GB", OPTION_VAL_1GB_CHT }, - { "2GB", OPTION_VAL_2GB_CHT }, - { "4GB", OPTION_VAL_4GB_CHT }, + { "512MB", OPTION_VAL_512MB_CHS }, + { "1GB", OPTION_VAL_1GB_CHS }, + { "2GB", OPTION_VAL_2GB_CHS }, + { "4GB", OPTION_VAL_4GB_CHS }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHT, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHS, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHT, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHS, NULL, "video", { @@ -9658,6 +10769,7 @@ struct retro_core_option_v2_definition option_defs_cht[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -9666,9 +10778,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHS, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHS, NULL, "video", { @@ -9680,9 +10792,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHT, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHS, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHT, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHS, NULL, "video", { @@ -9692,11 +10804,11 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_CHT, + CORE_OPTION_NAME_MIPMAPPING_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_CHS, NULL, "video", { @@ -9708,7 +10820,7 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_CHT, + CORE_OPTION_NAME_FOG_LABEL_CHS, NULL, "", NULL, @@ -9722,9 +10834,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHS, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHS, NULL, "video", { @@ -9736,9 +10848,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHS, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHS, NULL, "video", { @@ -9753,24 +10865,24 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHT, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHS, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHT, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHS, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_CHT }, - { "1", OPTION_VAL_1_CHT }, - { "2", OPTION_VAL_2_CHT }, + { "0", OPTION_VAL_DEFAULT_CHS }, + { "1", OPTION_VAL_1_CHS }, + { "2", OPTION_VAL_2_CHS }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHS, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHS, NULL, "video", { @@ -9778,13 +10890,13 @@ struct retro_core_option_v2_definition option_defs_cht[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHS, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHS, NULL, "video", { @@ -9796,9 +10908,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHT, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHS, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHT, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHS, NULL, "video", { @@ -9811,25 +10923,25 @@ struct retro_core_option_v2_definition option_defs_cht[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHT, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHS, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHT, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHS, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_CHT }, - { "4", OPTION_VAL_4_CHT }, - { "6", OPTION_VAL_6_CHT }, + { "2", OPTION_VAL_2_O26_CHS }, + { "4", OPTION_VAL_4_CHS }, + { "6", OPTION_VAL_6_CHS }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHT, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CHS, NULL, "video", { @@ -9843,9 +10955,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHS, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHS, NULL, "video", { @@ -9855,11 +10967,25 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CHS, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CHS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHT, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHS, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHT, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHS, NULL, "performance", { @@ -9871,15 +10997,15 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHS, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHS, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_CHT }, - { "more", OPTION_VAL_MORE_CHT }, + { "some", OPTION_VAL_SOME_CHS }, + { "more", OPTION_VAL_MORE_CHS }, { NULL, NULL }, }, #ifdef LOW_END @@ -9890,9 +11016,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHT, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHS, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHT, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHS, NULL, "performance", { @@ -9909,9 +11035,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHS, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHS, NULL, "hacks", { @@ -9923,9 +11049,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHT, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHS, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHT, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHS, NULL, "hacks", { @@ -9937,9 +11063,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHS, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHS, NULL, "hacks", { @@ -9953,64 +11079,78 @@ struct retro_core_option_v2_definition option_defs_cht[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CHS, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_CHT, + CORE_OPTION_NAME_SH4CLOCK_LABEL_CHS, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHT, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHS, NULL, "hacks", { - { "100", OPTION_VAL_100_CHT }, - { "110", OPTION_VAL_110_CHT }, - { "120", OPTION_VAL_120_CHT }, - { "130", OPTION_VAL_130_CHT }, - { "140", OPTION_VAL_140_CHT }, - { "150", OPTION_VAL_150_CHT }, - { "160", OPTION_VAL_160_CHT }, - { "170", OPTION_VAL_170_CHT }, - { "180", OPTION_VAL_180_CHT }, - { "190", OPTION_VAL_190_CHT }, - { "200", OPTION_VAL_200_CHT }, - { "210", OPTION_VAL_210_CHT }, - { "220", OPTION_VAL_220_CHT }, - { "230", OPTION_VAL_230_CHT }, - { "240", OPTION_VAL_240_CHT }, - { "250", OPTION_VAL_250_CHT }, - { "260", OPTION_VAL_260_CHT }, - { "270", OPTION_VAL_270_CHT }, - { "280", OPTION_VAL_280_CHT }, - { "290", OPTION_VAL_290_CHT }, - { "300", OPTION_VAL_300_CHT }, - { "310", OPTION_VAL_310_CHT }, - { "320", OPTION_VAL_320_CHT }, - { "330", OPTION_VAL_330_CHT }, - { "340", OPTION_VAL_340_CHT }, - { "350", OPTION_VAL_350_CHT }, - { "360", OPTION_VAL_360_CHT }, - { "370", OPTION_VAL_370_CHT }, - { "380", OPTION_VAL_380_CHT }, - { "390", OPTION_VAL_390_CHT }, - { "400", OPTION_VAL_400_CHT }, - { "410", OPTION_VAL_410_CHT }, - { "420", OPTION_VAL_420_CHT }, - { "430", OPTION_VAL_430_CHT }, - { "440", OPTION_VAL_440_CHT }, - { "450", OPTION_VAL_450_CHT }, - { "460", OPTION_VAL_460_CHT }, - { "470", OPTION_VAL_470_CHT }, - { "480", OPTION_VAL_480_CHT }, - { "490", OPTION_VAL_490_CHT }, - { "500", OPTION_VAL_500_CHT }, + { "100", OPTION_VAL_100_CHS }, + { "110", OPTION_VAL_110_CHS }, + { "120", OPTION_VAL_120_CHS }, + { "130", OPTION_VAL_130_CHS }, + { "140", OPTION_VAL_140_CHS }, + { "150", OPTION_VAL_150_CHS }, + { "160", OPTION_VAL_160_CHS }, + { "170", OPTION_VAL_170_CHS }, + { "180", OPTION_VAL_180_CHS }, + { "190", OPTION_VAL_190_CHS }, + { "200", OPTION_VAL_200_CHS }, + { "210", OPTION_VAL_210_CHS }, + { "220", OPTION_VAL_220_CHS }, + { "230", OPTION_VAL_230_CHS }, + { "240", OPTION_VAL_240_CHS }, + { "250", OPTION_VAL_250_CHS }, + { "260", OPTION_VAL_260_CHS }, + { "270", OPTION_VAL_270_CHS }, + { "280", OPTION_VAL_280_CHS }, + { "290", OPTION_VAL_290_CHS }, + { "300", OPTION_VAL_300_CHS }, + { "310", OPTION_VAL_310_CHS }, + { "320", OPTION_VAL_320_CHS }, + { "330", OPTION_VAL_330_CHS }, + { "340", OPTION_VAL_340_CHS }, + { "350", OPTION_VAL_350_CHS }, + { "360", OPTION_VAL_360_CHS }, + { "370", OPTION_VAL_370_CHS }, + { "380", OPTION_VAL_380_CHS }, + { "390", OPTION_VAL_390_CHS }, + { "400", OPTION_VAL_400_CHS }, + { "410", OPTION_VAL_410_CHS }, + { "420", OPTION_VAL_420_CHS }, + { "430", OPTION_VAL_430_CHS }, + { "440", OPTION_VAL_440_CHS }, + { "450", OPTION_VAL_450_CHS }, + { "460", OPTION_VAL_460_CHS }, + { "470", OPTION_VAL_470_CHS }, + { "480", OPTION_VAL_480_CHS }, + { "490", OPTION_VAL_490_CHS }, + { "500", OPTION_VAL_500_CHS }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHT, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CHS, NULL, "hacks", { @@ -10020,11 +11160,11 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHT, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CHS, NULL, "hacks", { @@ -10036,47 +11176,47 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHT, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CHS, NULL, "input", { - { "0%", OPTION_VAL_0_CHT }, - { "5%", OPTION_VAL_5_CHT }, - { "10%", OPTION_VAL_10_CHT }, - { "15%", OPTION_VAL_15_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "25%", OPTION_VAL_25_CHT }, - { "30%", OPTION_VAL_30_CHT }, + { "0%", OPTION_VAL_0_CHS }, + { "5%", OPTION_VAL_5_CHS }, + { "10%", OPTION_VAL_10_CHS }, + { "15%", OPTION_VAL_15_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "25%", OPTION_VAL_25_CHS }, + { "30%", OPTION_VAL_30_CHS }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHT, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CHS, NULL, "input", { - { "0%", OPTION_VAL_0_CHT }, - { "5%", OPTION_VAL_5_CHT }, - { "10%", OPTION_VAL_10_CHT }, - { "15%", OPTION_VAL_15_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "25%", OPTION_VAL_25_CHT }, - { "30%", OPTION_VAL_30_CHT }, + { "0%", OPTION_VAL_0_CHS }, + { "5%", OPTION_VAL_5_CHS }, + { "10%", OPTION_VAL_10_CHS }, + { "15%", OPTION_VAL_15_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "25%", OPTION_VAL_25_CHS }, + { "30%", OPTION_VAL_30_CHS }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHT, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHS, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CHS, NULL, "input", { @@ -10087,10 +11227,10 @@ struct retro_core_option_v2_definition option_defs_cht[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CHT, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHS, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CHT, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHS, NULL, "input", { @@ -10098,124 +11238,268 @@ struct retro_core_option_v2_definition option_defs_cht[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHT, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHS, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHT, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHS, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHT, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CHS, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHT, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_CHS }, + { "60%", OPTION_VAL_60_CHS }, + { "70%", OPTION_VAL_70_CHS }, + { "80%", OPTION_VAL_80_CHS }, + { "90%", OPTION_VAL_90_CHS }, + { "100%", OPTION_VAL_100_O45_CHS }, + { "110%", OPTION_VAL_110_O45_CHS }, + { "120%", OPTION_VAL_120_O45_CHS }, + { "130%", OPTION_VAL_130_O45_CHS }, + { "140%", OPTION_VAL_140_O45_CHS }, + { "150%", OPTION_VAL_150_O45_CHS }, + { "160%", OPTION_VAL_160_O45_CHS }, + { "170%", OPTION_VAL_170_O45_CHS }, + { "180%", OPTION_VAL_180_O45_CHS }, + { "190%", OPTION_VAL_190_O45_CHS }, + { "200%", OPTION_VAL_200_O45_CHS }, + { "210%", OPTION_VAL_210_O45_CHS }, + { "220%", OPTION_VAL_220_O45_CHS }, + { "230%", OPTION_VAL_230_O45_CHS }, + { "240%", OPTION_VAL_240_O45_CHS }, + { "250%", OPTION_VAL_250_O45_CHS }, + { "260%", OPTION_VAL_260_O45_CHS }, + { "270%", OPTION_VAL_270_O45_CHS }, + { "280%", OPTION_VAL_280_O45_CHS }, + { "290%", OPTION_VAL_290_O45_CHS }, + { "300%", OPTION_VAL_300_O45_CHS }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHT, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHT }, - { "Red", OPTION_VAL_RED_CHT }, - { "Green", OPTION_VAL_GREEN_CHT }, - { "Blue", OPTION_VAL_BLUE_CHT }, + { "White", OPTION_VAL_WHITE_CHS }, + { "Red", OPTION_VAL_RED_CHS }, + { "Green", OPTION_VAL_GREEN_CHS }, + { "Blue", OPTION_VAL_BLUE_CHS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHT, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHT }, - { "Red", OPTION_VAL_RED_CHT }, - { "Green", OPTION_VAL_GREEN_CHT }, - { "Blue", OPTION_VAL_BLUE_CHT }, + { "White", OPTION_VAL_WHITE_CHS }, + { "Red", OPTION_VAL_RED_CHS }, + { "Green", OPTION_VAL_GREEN_CHS }, + { "Blue", OPTION_VAL_BLUE_CHS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHT, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHT }, - { "Red", OPTION_VAL_RED_CHT }, - { "Green", OPTION_VAL_GREEN_CHT }, - { "Blue", OPTION_VAL_BLUE_CHT }, + { "White", OPTION_VAL_WHITE_CHS }, + { "Red", OPTION_VAL_RED_CHS }, + { "Green", OPTION_VAL_GREEN_CHS }, + { "Blue", OPTION_VAL_BLUE_CHS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHT, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CHT }, - { "Red", OPTION_VAL_RED_CHT }, - { "Green", OPTION_VAL_GREEN_CHT }, - { "Blue", OPTION_VAL_BLUE_CHT }, + { "White", OPTION_VAL_WHITE_CHS }, + { "Red", OPTION_VAL_RED_CHS }, + { "Green", OPTION_VAL_GREEN_CHS }, + { "Blue", OPTION_VAL_BLUE_CHS }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CHS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CHS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CHS }, + { "Purupuru", OPTION_VAL_PURUPURU_CHS }, + { "None", OPTION_VAL_NONE_CHS }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHS, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHS, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHS, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_CHT }, - { "All VMUs", OPTION_VAL_ALL_VMUS_CHT }, + { "VMU A1", OPTION_VAL_VMU_A1_CHS }, + { "All VMUs", OPTION_VAL_ALL_VMUS_CHS }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_CHT, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHT, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CHS, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHS, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHS, NULL, "vmu", { @@ -10226,9 +11510,9 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHS, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHS, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHS, NULL, "vmu", { @@ -10240,7 +11524,7 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHT, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHS, NULL, "", NULL, @@ -10254,144 +11538,144 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHT, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHT, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHT }, - { "2x", OPTION_VAL_2_O27_CHT }, - { "3x", OPTION_VAL_3X_CHT }, - { "4x", OPTION_VAL_4_CHT }, - { "5x", OPTION_VAL_5X_CHT }, + { "1x", OPTION_VAL_1X_CHS }, + { "2x", OPTION_VAL_2_O26_CHS }, + { "3x", OPTION_VAL_3X_CHS }, + { "4x", OPTION_VAL_4_CHS }, + { "5x", OPTION_VAL_5X_CHS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHT, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "30%", OPTION_VAL_30_CHT }, - { "40%", OPTION_VAL_40_CHT }, - { "50%", OPTION_VAL_50_CHT }, - { "60%", OPTION_VAL_60_CHT }, - { "70%", OPTION_VAL_70_CHT }, - { "80%", OPTION_VAL_80_CHT }, - { "90%", OPTION_VAL_90_CHT }, - { "100%", OPTION_VAL_100_O57_CHT }, + { "10%", OPTION_VAL_10_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "30%", OPTION_VAL_30_CHS }, + { "40%", OPTION_VAL_40_CHS }, + { "50%", OPTION_VAL_50_CHS }, + { "60%", OPTION_VAL_60_CHS }, + { "70%", OPTION_VAL_70_CHS }, + { "80%", OPTION_VAL_80_CHS }, + { "90%", OPTION_VAL_90_CHS }, + { "100%", OPTION_VAL_100_O45_CHS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHT, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHS, NULL, "", NULL, @@ -10405,144 +11689,144 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHT, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHT, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHT }, - { "2x", OPTION_VAL_2_O27_CHT }, - { "3x", OPTION_VAL_3X_CHT }, - { "4x", OPTION_VAL_4_CHT }, - { "5x", OPTION_VAL_5X_CHT }, + { "1x", OPTION_VAL_1X_CHS }, + { "2x", OPTION_VAL_2_O26_CHS }, + { "3x", OPTION_VAL_3X_CHS }, + { "4x", OPTION_VAL_4_CHS }, + { "5x", OPTION_VAL_5X_CHS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHT, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "30%", OPTION_VAL_30_CHT }, - { "40%", OPTION_VAL_40_CHT }, - { "50%", OPTION_VAL_50_CHT }, - { "60%", OPTION_VAL_60_CHT }, - { "70%", OPTION_VAL_70_CHT }, - { "80%", OPTION_VAL_80_CHT }, - { "90%", OPTION_VAL_90_CHT }, - { "100%", OPTION_VAL_100_O57_CHT }, + { "10%", OPTION_VAL_10_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "30%", OPTION_VAL_30_CHS }, + { "40%", OPTION_VAL_40_CHS }, + { "50%", OPTION_VAL_50_CHS }, + { "60%", OPTION_VAL_60_CHS }, + { "70%", OPTION_VAL_70_CHS }, + { "80%", OPTION_VAL_80_CHS }, + { "90%", OPTION_VAL_90_CHS }, + { "100%", OPTION_VAL_100_O45_CHS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHT, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHS, NULL, "", NULL, @@ -10556,144 +11840,144 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHT, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHT, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHT }, - { "2x", OPTION_VAL_2_O27_CHT }, - { "3x", OPTION_VAL_3X_CHT }, - { "4x", OPTION_VAL_4_CHT }, - { "5x", OPTION_VAL_5X_CHT }, + { "1x", OPTION_VAL_1X_CHS }, + { "2x", OPTION_VAL_2_O26_CHS }, + { "3x", OPTION_VAL_3X_CHS }, + { "4x", OPTION_VAL_4_CHS }, + { "5x", OPTION_VAL_5X_CHS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHT, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "30%", OPTION_VAL_30_CHT }, - { "40%", OPTION_VAL_40_CHT }, - { "50%", OPTION_VAL_50_CHT }, - { "60%", OPTION_VAL_60_CHT }, - { "70%", OPTION_VAL_70_CHT }, - { "80%", OPTION_VAL_80_CHT }, - { "90%", OPTION_VAL_90_CHT }, - { "100%", OPTION_VAL_100_O57_CHT }, + { "10%", OPTION_VAL_10_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "30%", OPTION_VAL_30_CHS }, + { "40%", OPTION_VAL_40_CHS }, + { "50%", OPTION_VAL_50_CHS }, + { "60%", OPTION_VAL_60_CHS }, + { "70%", OPTION_VAL_70_CHS }, + { "80%", OPTION_VAL_80_CHS }, + { "90%", OPTION_VAL_90_CHS }, + { "100%", OPTION_VAL_100_O45_CHS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHT, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHS, NULL, "", NULL, @@ -10707,505 +11991,560 @@ struct retro_core_option_v2_definition option_defs_cht[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHT, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHS }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHT, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CHT }, - { "2x", OPTION_VAL_2_O27_CHT }, - { "3x", OPTION_VAL_3X_CHT }, - { "4x", OPTION_VAL_4_CHT }, - { "5x", OPTION_VAL_5X_CHT }, + { "1x", OPTION_VAL_1X_CHS }, + { "2x", OPTION_VAL_2_O26_CHS }, + { "3x", OPTION_VAL_3X_CHS }, + { "4x", OPTION_VAL_4_CHS }, + { "5x", OPTION_VAL_5X_CHS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHT, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, - { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, - { "BLUE 03", OPTION_VAL_BLUE_CHT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, - { "GREEN 05", OPTION_VAL_GREEN_CHT }, - { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, - { "RED 11", OPTION_VAL_RED_CHT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, - { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, - { "WHITE 28", OPTION_VAL_WHITE_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHS }, + { "BLUE 03", OPTION_VAL_BLUE_CHS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHS }, + { "GREEN 05", OPTION_VAL_GREEN_CHS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHS }, + { "RED 11", OPTION_VAL_RED_CHS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHS }, + { "WHITE 28", OPTION_VAL_WHITE_CHS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHT, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CHT }, - { "20%", OPTION_VAL_20_CHT }, - { "30%", OPTION_VAL_30_CHT }, - { "40%", OPTION_VAL_40_CHT }, - { "50%", OPTION_VAL_50_CHT }, - { "60%", OPTION_VAL_60_CHT }, - { "70%", OPTION_VAL_70_CHT }, - { "80%", OPTION_VAL_80_CHT }, - { "90%", OPTION_VAL_90_CHT }, - { "100%", OPTION_VAL_100_O57_CHT }, + { "10%", OPTION_VAL_10_CHS }, + { "20%", OPTION_VAL_20_CHS }, + { "30%", OPTION_VAL_30_CHS }, + { "40%", OPTION_VAL_40_CHS }, + { "50%", OPTION_VAL_50_CHS }, + { "60%", OPTION_VAL_60_CHS }, + { "70%", OPTION_VAL_70_CHS }, + { "80%", OPTION_VAL_80_CHS }, + { "90%", OPTION_VAL_90_CHS }, + { "100%", OPTION_VAL_100_O45_CHS }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_cht = { - option_cats_cht, - option_defs_cht +struct retro_core_options_v2 options_chs = { + option_cats_chs, + option_defs_chs }; -/* RETRO_LANGUAGE_CS */ - -#define CATEGORY_SYSTEM_LABEL_CS "Systém" -#define CATEGORY_SYSTEM_INFO_0_CS "Konfigurace regionu, jazyka, systému BIOS a základního nastavení hardwaru." -#define CATEGORY_VIDEO_LABEL_CS NULL -#define CATEGORY_VIDEO_INFO_0_CS "Konfigurace rozlišení, nastavení průhlednosti a vizuálních efektů nezávislých na pořadí." -#define CATEGORY_PERFORMANCE_LABEL_CS "Výkon" -#define CATEGORY_PERFORMANCE_INFO_0_CS "Konfigurace nastavení vykreslování ve vláknech a přeskakování snímků." -#define CATEGORY_HACKS_LABEL_CS NULL -#define CATEGORY_HACKS_INFO_0_CS "Konfigurace přepisu širokoúhlého zobrazení, rychlosti načítání GD-ROM a nastavení výměny textur." -#define CATEGORY_INPUT_LABEL_CS "Vstup" -#define CATEGORY_INPUT_INFO_0_CS "Konfigurace nastavení gamepadu a světelné pistole." -#define CATEGORY_VMU_LABEL_CS "Jednotka Vizuální Paměti" -#define CATEGORY_VMU_INFO_0_CS "Konfigurace ukládacích souborů VMU pro jednotlivé hry a nastavení viditelnosti VMU na obrazovce." -#define CORE_OPTION_NAME_REGION_LABEL_CS NULL -#define OPTION_VAL_JAPAN_CS "Japonsko" -#define OPTION_VAL_USA_CS NULL -#define OPTION_VAL_EUROPE_CS "Evropa" -#define OPTION_VAL_DEFAULT_CS "Výchozí" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_CS "Jazyk" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CS "Změní jazyk používaný systémem BIOS a všemi hrami, které obsahují více jazyků." -#define OPTION_VAL_JAPANESE_CS "Japonština" -#define OPTION_VAL_ENGLISH_CS "Angličtina" -#define OPTION_VAL_GERMAN_CS "Němčina" -#define OPTION_VAL_FRENCH_CS "Francouzština" -#define OPTION_VAL_SPANISH_CS "Španělština" -#define OPTION_VAL_ITALIAN_CS "Italský" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CS "HLE BIOS (nutný restart)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CS "Vynucení použití vysokoúrovňové emulace systému BIOS." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CS "Nabootovat Bios (Nutný Restart)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CS "Spustit přímo do menu Dreamcast BIOS." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CS "Povolit DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CS "Umožňuje emulaci zvukového DSP (digitálního signálového procesoru) konzole Dreamcast. Zlepšuje přesnost generovaného zvuku, ale zvyšuje nároky na výkon." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_CS "Vynutit Režim Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CS "Povolte úplnou emulaci jednotky MMU (Memory Management Unit) a další nastavení pro hry pro Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CS "Povolení servisních tlačítek NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CS "Povolí tlačítko SERVIS pro NAOMI, abyste mohli vstoupit do nastavení skříně." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CS "Nastavení her NAOMI na volné hraní" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CS "Upravte nastavení mincí ve hře na volnou hru." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CS "Emulace širokopásmového adaptéru" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CS "Místo modemu emulujte širokopásmový adaptér ethernetu. (nutný restart)" -#define CORE_OPTION_NAME_UPNP_LABEL_CS "Povolit UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_CS "Pomocí UPnP můžete automaticky nakonfigurovat svůj internetový směrovač pro online hry." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CS "Vnitřní Rozlišení" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CS "Úprava Rozlišení Vykreslování." -#define OPTION_VAL_320X240_CS NULL -#define OPTION_VAL_640X480_CS NULL -#define OPTION_VAL_800X600_CS NULL -#define OPTION_VAL_960X720_CS NULL -#define OPTION_VAL_1024X768_CS NULL -#define OPTION_VAL_1280X960_CS NULL -#define OPTION_VAL_1440X1080_CS NULL -#define OPTION_VAL_1600X1200_CS NULL -#define OPTION_VAL_1920X1440_CS NULL -#define OPTION_VAL_2560X1920_CS NULL -#define OPTION_VAL_2880X2160_CS NULL -#define OPTION_VAL_3200X2400_CS NULL -#define OPTION_VAL_3840X2880_CS NULL -#define OPTION_VAL_4480X3360_CS NULL -#define OPTION_VAL_5120X3840_CS NULL -#define OPTION_VAL_5760X4320_CS NULL -#define OPTION_VAL_6400X4800_CS NULL -#define OPTION_VAL_7040X5280_CS NULL -#define OPTION_VAL_7680X5760_CS NULL -#define OPTION_VAL_8320X6240_CS NULL -#define OPTION_VAL_8960X6720_CS NULL -#define OPTION_VAL_9600X7200_CS NULL -#define OPTION_VAL_10240X7680_CS NULL -#define OPTION_VAL_10880X8160_CS NULL -#define OPTION_VAL_11520X8640_CS NULL -#define OPTION_VAL_12160X9120_CS NULL -#define OPTION_VAL_12800X9600_CS NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CS "Typ Kabelu" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CS "Typ výstupního signálu. Nejvíce podporovaný je 'TV (Kompozitní)'." -#define OPTION_VAL_VGA_CS NULL -#define OPTION_VAL_TV_RGB_CS NULL -#define OPTION_VAL_TV_COMPOSITE_CS "TV (Kompozitní)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_CS "Standardní Vysílání" -#define OPTION_VAL_NTSC_CS NULL -#define OPTION_VAL_PAL_CS "PAL (Svět)" -#define OPTION_VAL_PAL_N_CS NULL -#define OPTION_VAL_PAL_M_CS "PAL-M (Brazílie)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CS "Orientace Obrazovky" -#define OPTION_VAL_HORIZONTAL_CS "Horizontální" -#define OPTION_VAL_VERTICAL_CS "Vertikální" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CS "Třídění Alpha" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CS "Per-Strip (rychlé, nejméně přesné)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_CS "Per-Triangle (normální)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_CS "Per-Pixel (přesné, ale nejpomalejší)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CS "Velikost akumulační vyrovnávací paměti pixelů" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CS "Pro správný výstup ve vyšších rozlišeních mohou být nutné vyšší hodnoty." -#define OPTION_VAL_512MB_CS NULL -#define OPTION_VAL_1GB_CS NULL -#define OPTION_VAL_2GB_CS NULL -#define OPTION_VAL_4GB_CS NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CS "Maximální počet průhledných vrstev" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CS "U složitých scén mohou být nutné vyšší hodnoty." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CS "Úplná emulace framebufferu" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CS "Povolení úplné emulace framebufferu v paměti VRAM. To je užitečné pro hry, které přímo čtou nebo zapisují framebuffer do VRAM. Pokud je tato funkce povolena, interní rozlišení je vynuceno na 640x480 a může dojít k výraznému snížení výkonu." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CS "Povolení Vyrovnávací Paměti RTT (Render To Texture)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CS "Kopírování vykreslených textur z GPU zpět do VRAM. Tato možnost je obvykle povolena u her, které ji vyžadují. Pokud je povolena, je vypnuto zvyšování rozlišení vykreslovaných textur a může dojít ke snížení výkonu." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CS "Mipmapování" -#define CORE_OPTION_NAME_FOG_LABEL_CS "Efekty Mlhy" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CS "Modifikátor Hlasitosti" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CS "Funkce grafického procesoru Dreamcast, která se obvykle používá ve hrách ke kreslení stínů objektů. Tato funkce by měla být normálně povolena - dopad na výkon je obvykle minimální až zanedbatelný." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CS "Anizotropní Filtrování" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CS "Vylepšete kvalitu textur na površích, které jsou vůči kameře pod šikmým úhlem pohledu. Vyšší hodnoty jsou náročnější na grafický procesor. Změny tohoto nastavení se uplatní až po restartu." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CS "Filtrování Textur" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CS "Režim filtrování textur, který se má použít. Tento parametr lze použít k vynucení určitého režimu filtrování textur na všech texturách, abyste dosáhli ostřejšího (nebo hladšího) vzhledu než ve výchozím nastavení. Jiné hodnoty než výchozí mohou způsobit různé problémy s vykreslováním. Změny tohoto nastavení se uplatní až po restartu." -#define OPTION_VAL_1_CS "Vynucený Nearest-Neighbor" -#define OPTION_VAL_2_CS "Vynucený lineární" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CS "Výměna Zpožděných Snímků" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CS "Je užitečné vyhnout se blikajícím obrazovkám nebo poruchovým videím. Nedoporučuje se na pomalých platformách." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CS "Detekce změn snímkové frekvence" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CS "Upozornit frontend při změně interní snímkové frekvence (např. z 60 fps na 30 fps). Zlepšuje snímkovou frekvenci ve hrách, které běží s uzamčenou snímkovou frekvencí 30 fps nebo 20 fps, ale měl by být vypnut pro hry s odemčenou (nestabilní) snímkovou frekvencí (např. Ecco the Dolphin, Unreal Tournament). Poznámka: Není k dispozici, pokud je povoleno 'Automatické přeskakování snímků'." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CS "Postprocesní Filtr PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CS "Následné zpracování vykresleného obrazu pro simulaci efektů specifických pro grafický procesor PowerVR2 a analogové video signály." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CS "Vylepšení Textur (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CS "Vylepšete ručně kreslenou 2D pixelovou grafiku. Mělo by se používat pouze ve 2D pixelových hrách." -#define OPTION_VAL_2_O27_CS NULL -#define OPTION_VAL_4_CS NULL -#define OPTION_VAL_6_CS NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CS "Zvýšení Rozlišení Textur Max. Filtrovaná Velikost" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CS "Nativní interpolace hloubky" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CS "Pomáhá řešit problémy s poškozením textur a hloubkou na grafických procesorech AMD. V některých případech může pomoci i GPU Intel." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CS "Vykreslování Vláken" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CS "Spouští GPU a CPU v různých vláknech. Důrazně doporučujeme." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CS "Automatické Přeskočení Snímků" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CS "Automatické přeskakování snímků při pomalém běhu emulátoru. Poznámka: Toto nastavení platí pouze tehdy, když je povoleno 'Vláknové Vykreslování'." -#define OPTION_VAL_SOME_CS "Normální" -#define OPTION_VAL_MORE_CS "Maximální" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CS "Přeskočení Snímků" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CS "Nastaví počet snímků, které se mají přeskočit mezi jednotlivými zobrazenými snímky." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CS "Širokoúhlé Cheaty (Nutný Restart)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CS "Aktivuje cheaty, které umožňují zobrazení některých her v širokoúhlém formátu." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CS "Hack Širokoúhleho Obrazu" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CS "Kreslení geometrie mimo běžný poměr stran 4:3. Může způsobit grafické závady v odhalených oblastech." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CS "Rychlé Načítání GD-ROM (nepřesné)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CS "Zrychluje načítání GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CS "Podtaktování/přetaktování procesoru SH4" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CS "Změňte takt hlavního procesoru SH4 z výchozích 200 MHz. Podtaktování může pomoci pomalým platformám. Přetaktování může u některých her zvýšit snímkovou frekvenci. Používejte s opatrností." -#define OPTION_VAL_100_CS NULL -#define OPTION_VAL_110_CS NULL -#define OPTION_VAL_120_CS NULL -#define OPTION_VAL_130_CS NULL -#define OPTION_VAL_140_CS NULL -#define OPTION_VAL_150_CS NULL -#define OPTION_VAL_160_CS NULL -#define OPTION_VAL_170_CS NULL -#define OPTION_VAL_180_CS NULL -#define OPTION_VAL_190_CS NULL -#define OPTION_VAL_200_CS NULL -#define OPTION_VAL_210_CS NULL -#define OPTION_VAL_220_CS NULL -#define OPTION_VAL_230_CS NULL -#define OPTION_VAL_240_CS NULL -#define OPTION_VAL_250_CS NULL -#define OPTION_VAL_260_CS NULL -#define OPTION_VAL_270_CS NULL -#define OPTION_VAL_280_CS NULL -#define OPTION_VAL_290_CS NULL -#define OPTION_VAL_300_CS NULL -#define OPTION_VAL_310_CS NULL -#define OPTION_VAL_320_CS NULL -#define OPTION_VAL_330_CS NULL -#define OPTION_VAL_340_CS NULL -#define OPTION_VAL_350_CS NULL -#define OPTION_VAL_360_CS NULL -#define OPTION_VAL_370_CS NULL -#define OPTION_VAL_380_CS NULL -#define OPTION_VAL_390_CS NULL -#define OPTION_VAL_400_CS NULL -#define OPTION_VAL_410_CS NULL -#define OPTION_VAL_420_CS NULL -#define OPTION_VAL_430_CS NULL -#define OPTION_VAL_440_CS NULL -#define OPTION_VAL_450_CS NULL -#define OPTION_VAL_460_CS NULL -#define OPTION_VAL_470_CS NULL -#define OPTION_VAL_480_CS NULL -#define OPTION_VAL_490_CS NULL -#define OPTION_VAL_500_CS NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CS "Načíst Vlastní Textury" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CS "Skladiště Textur" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CS "Analogova Páčka Mrtvé Zóny" -#define OPTION_VAL_0_CS NULL -#define OPTION_VAL_5_CS NULL -#define OPTION_VAL_10_CS NULL -#define OPTION_VAL_15_CS NULL -#define OPTION_VAL_20_CS NULL -#define OPTION_VAL_25_CS NULL -#define OPTION_VAL_30_CS NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CS "Spouštěč Mrtvé Zóny" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CS "Digitální Spouštěče" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CS "Purupuru Pack/Vibrační Balíček" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CS "Povoluje silovou zpětnou vazbu regulátoru." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CS "Digitální výstupy pro vysílání" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CS "Vysílání digitálních výstupů a stavu vynucene zpětné vazby na portu TCP 8000. Kompatibilní s volbou MAME \"-výstupní síť\"." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CS "Zobrazit Nastavení Světelné Pistole" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CS "Povolení konfigurace možností zobrazení zaměřovacího kříže světelné pistole. POZNÁMKA: Aby se toto nastavení projevilo, může být nutné přepnout rychlou nabídku." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 1" -#define OPTION_VAL_WHITE_CS "Bílá" -#define OPTION_VAL_RED_CS "Červený" -#define OPTION_VAL_GREEN_CS "Zelený" -#define OPTION_VAL_BLUE_CS "Modrý" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CS "Vizuální Paměťové Jednotky/Systémy pro Jednotlivé Hry (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CS "VMUs Na-Hru" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CS "Pokud je tato funkce vypnuta, všechny hry sdílejí 4 ukládací soubory VMU (A1, B1, C1, D1) umístěné v systémovém adresáři aplikace RetroArch. Nastavení 'VMU A1' vytvoří v adresáři ukládání aplikace RetroArch pro každou spuštěnou hru jedinečný soubor VMU 'A1'. Nastavení 'All VMUs' Všechny VMU vytvoří 4 jedinečné soubory VMU (A1, B1, C1, D1) pro každou spuštěnou hru." -#define OPTION_VAL_VMU_A1_CS NULL -#define OPTION_VAL_ALL_VMUS_CS NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CS "Vizuální paměťové jednotky/systémy (VMU) Zvuky" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CS "Zvuky VMU" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CS "Pokud je tato funkce povolena, přehrávají se zvukové signály VMU." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CS "Zobrazit Nastavení Displeje Vizuální Paměťové Jednotky/Systému (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CS "Zobrazit Nastavení VMU Displeje" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CS "Umožňuje konfiguraci viditelnosti, velikosti, polohy a barvy obrazovky LCD emulovaného VMU. POZNÁMKA: Může být nutné přepnout Rychlé Menu, aby se toto nastavení projevilo." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 1" -#define OPTION_VAL_UPPER_LEFT_CS "Vlevo Nahoře" -#define OPTION_VAL_UPPER_RIGHT_CS "Vpravo Nahoře" -#define OPTION_VAL_LOWER_LEFT_CS "Vlevo Dole" -#define OPTION_VAL_LOWER_RIGHT_CS "Vpravo Dole" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 1" -#define OPTION_VAL_1X_CS NULL -#define OPTION_VAL_3X_CS NULL -#define OPTION_VAL_5X_CS NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 1" -#define OPTION_VAL_DEFAULT_ON_00_CS "Výchozí ON" -#define OPTION_VAL_DEFAULT_OFF_01_CS "Výchozí OFF" -#define OPTION_VAL_BLACK_02_CS "Černá" -#define OPTION_VAL_LIGHT_BLUE_04_CS "Světle Modrá" -#define OPTION_VAL_CYAN_06_CS "Azurová" -#define OPTION_VAL_CYAN_BLUE_07_CS "Azurově Modrá" -#define OPTION_VAL_LIGHT_GREEN_08_CS "Světle Zelená" -#define OPTION_VAL_CYAN_GREEN_09_CS "Azurově Zelená" -#define OPTION_VAL_LIGHT_CYAN_10_CS "Světle Azurová" -#define OPTION_VAL_PURPLE_12_CS "Fialová" -#define OPTION_VAL_LIGHT_PURPLE_13_CS "Světle Fialová" -#define OPTION_VAL_YELLOW_14_CS "Žlutá" -#define OPTION_VAL_GRAY_15_CS "Šedá" -#define OPTION_VAL_LIGHT_PURPLE_2_16_CS "Světle Fialová (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_CS "Světle Zelená (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_CS "Světle Zelená (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_CS "Světle Azurová (2)" -#define OPTION_VAL_LIGHT_RED_2_20_CS "Světle Červená (2)" -#define OPTION_VAL_MAGENTA_21_CS "Purpurová" -#define OPTION_VAL_LIGHT_PURPLE_3_22_CS "Světle Fialová (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_CS "Světle Oranžová" -#define OPTION_VAL_ORANGE_24_CS "Oranžová" -#define OPTION_VAL_LIGHT_PURPLE_4_25_CS "Světle Fialová (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_CS "Světle Žlutá" -#define OPTION_VAL_LIGHT_YELLOW_2_27_CS "Světle Žlutá (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 1" -#define OPTION_VAL_40_CS NULL -#define OPTION_VAL_50_CS NULL -#define OPTION_VAL_60_CS NULL -#define OPTION_VAL_70_CS NULL -#define OPTION_VAL_80_CS NULL -#define OPTION_VAL_90_CS NULL -#define OPTION_VAL_100_O57_CS NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 4" +/* RETRO_LANGUAGE_CHT */ -struct retro_core_option_v2_category option_cats_cs[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_CS, - CATEGORY_SYSTEM_INFO_0_CS - }, - { - "video", - CATEGORY_VIDEO_LABEL_CS, - CATEGORY_VIDEO_INFO_0_CS +#define CATEGORY_SYSTEM_LABEL_CHT "系統" +#define CATEGORY_SYSTEM_INFO_0_CHT NULL +#define CATEGORY_VIDEO_LABEL_CHT "顯示" +#define CATEGORY_VIDEO_INFO_0_CHT "變更解析度、渲染透明度和視覺效果的設定。" +#define CATEGORY_PERFORMANCE_LABEL_CHT "效能" +#define CATEGORY_PERFORMANCE_INFO_0_CHT NULL +#define CATEGORY_HACKS_LABEL_CHT "進階" +#define CATEGORY_HACKS_INFO_0_CHT NULL +#define CATEGORY_INPUT_LABEL_CHT "輸入" +#define CATEGORY_INPUT_INFO_0_CHT NULL +#define CATEGORY_EXPANSIONS_LABEL_CHT NULL +#define CATEGORY_EXPANSIONS_INFO_0_CHT NULL +#define CATEGORY_VMU_LABEL_CHT NULL +#define CATEGORY_VMU_INFO_0_CHT NULL +#define CORE_OPTION_NAME_REGION_LABEL_CHT "發售地" +#define OPTION_VAL_JAPAN_CHT NULL +#define OPTION_VAL_USA_CHT NULL +#define OPTION_VAL_EUROPE_CHT NULL +#define OPTION_VAL_DEFAULT_CHT "預設" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_CHT "語言" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CHT NULL +#define OPTION_VAL_JAPANESE_CHT "日語" +#define OPTION_VAL_ENGLISH_CHT "英語" +#define OPTION_VAL_GERMAN_CHT "德語" +#define OPTION_VAL_FRENCH_CHT "法語" +#define OPTION_VAL_SPANISH_CHT "西班牙語" +#define OPTION_VAL_ITALIAN_CHT "意大利語" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CHT NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHT NULL +#define CORE_OPTION_NAME_UPNP_LABEL_CHT NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_CHT NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHT "內部解析度" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHT NULL +#define OPTION_VAL_320X240_CHT NULL +#define OPTION_VAL_640X480_CHT NULL +#define OPTION_VAL_800X600_CHT NULL +#define OPTION_VAL_960X720_CHT NULL +#define OPTION_VAL_1024X768_CHT NULL +#define OPTION_VAL_1280X960_CHT NULL +#define OPTION_VAL_1440X1080_CHT NULL +#define OPTION_VAL_1600X1200_CHT NULL +#define OPTION_VAL_1920X1440_CHT NULL +#define OPTION_VAL_2560X1920_CHT NULL +#define OPTION_VAL_2880X2160_CHT NULL +#define OPTION_VAL_3200X2400_CHT NULL +#define OPTION_VAL_3840X2880_CHT NULL +#define OPTION_VAL_4480X3360_CHT NULL +#define OPTION_VAL_5120X3840_CHT NULL +#define OPTION_VAL_5760X4320_CHT NULL +#define OPTION_VAL_6400X4800_CHT NULL +#define OPTION_VAL_7040X5280_CHT NULL +#define OPTION_VAL_7680X5760_CHT NULL +#define OPTION_VAL_8320X6240_CHT NULL +#define OPTION_VAL_8960X6720_CHT NULL +#define OPTION_VAL_9600X7200_CHT NULL +#define OPTION_VAL_10240X7680_CHT NULL +#define OPTION_VAL_10880X8160_CHT NULL +#define OPTION_VAL_11520X8640_CHT NULL +#define OPTION_VAL_12160X9120_CHT NULL +#define OPTION_VAL_12800X9600_CHT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHT NULL +#define OPTION_VAL_VGA_CHT NULL +#define OPTION_VAL_TV_RGB_CHT NULL +#define OPTION_VAL_TV_COMPOSITE_CHT NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_CHT NULL +#define OPTION_VAL_NTSC_CHT NULL +#define OPTION_VAL_PAL_CHT NULL +#define OPTION_VAL_PAL_N_CHT NULL +#define OPTION_VAL_PAL_M_CHT NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHT "螢幕顯示方向" +#define OPTION_VAL_HORIZONTAL_CHT NULL +#define OPTION_VAL_VERTICAL_CHT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CHT NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHT NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_CHT NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_CHT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHT NULL +#define OPTION_VAL_512MB_CHT NULL +#define OPTION_VAL_1GB_CHT NULL +#define OPTION_VAL_2GB_CHT NULL +#define OPTION_VAL_4GB_CHT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHT NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CHT NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_FOG_LABEL_CHT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHT "材質過濾" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHT NULL +#define OPTION_VAL_1_CHT NULL +#define OPTION_VAL_2_CHT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHT NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHT NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHT NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHT NULL +#define OPTION_VAL_2_O26_CHT "2倍" +#define OPTION_VAL_4_CHT "4倍" +#define OPTION_VAL_6_CHT "6倍" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CHT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CHT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CHT NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHT NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHT NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHT NULL +#define OPTION_VAL_SOME_CHT "正常" +#define OPTION_VAL_MORE_CHT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CHT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CHT NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CHT NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHT NULL +#define OPTION_VAL_100_CHT NULL +#define OPTION_VAL_110_CHT NULL +#define OPTION_VAL_120_CHT NULL +#define OPTION_VAL_130_CHT NULL +#define OPTION_VAL_140_CHT NULL +#define OPTION_VAL_150_CHT NULL +#define OPTION_VAL_160_CHT NULL +#define OPTION_VAL_170_CHT NULL +#define OPTION_VAL_180_CHT NULL +#define OPTION_VAL_190_CHT NULL +#define OPTION_VAL_200_CHT NULL +#define OPTION_VAL_210_CHT NULL +#define OPTION_VAL_220_CHT NULL +#define OPTION_VAL_230_CHT NULL +#define OPTION_VAL_240_CHT NULL +#define OPTION_VAL_250_CHT NULL +#define OPTION_VAL_260_CHT NULL +#define OPTION_VAL_270_CHT NULL +#define OPTION_VAL_280_CHT NULL +#define OPTION_VAL_290_CHT NULL +#define OPTION_VAL_300_CHT NULL +#define OPTION_VAL_310_CHT NULL +#define OPTION_VAL_320_CHT NULL +#define OPTION_VAL_330_CHT NULL +#define OPTION_VAL_340_CHT NULL +#define OPTION_VAL_350_CHT NULL +#define OPTION_VAL_360_CHT NULL +#define OPTION_VAL_370_CHT NULL +#define OPTION_VAL_380_CHT NULL +#define OPTION_VAL_390_CHT NULL +#define OPTION_VAL_400_CHT NULL +#define OPTION_VAL_410_CHT NULL +#define OPTION_VAL_420_CHT NULL +#define OPTION_VAL_430_CHT NULL +#define OPTION_VAL_440_CHT NULL +#define OPTION_VAL_450_CHT NULL +#define OPTION_VAL_460_CHT NULL +#define OPTION_VAL_470_CHT NULL +#define OPTION_VAL_480_CHT NULL +#define OPTION_VAL_490_CHT NULL +#define OPTION_VAL_500_CHT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CHT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CHT NULL +#define OPTION_VAL_0_CHT NULL +#define OPTION_VAL_5_CHT NULL +#define OPTION_VAL_10_CHT NULL +#define OPTION_VAL_15_CHT NULL +#define OPTION_VAL_20_CHT NULL +#define OPTION_VAL_25_CHT NULL +#define OPTION_VAL_30_CHT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CHT NULL +#define OPTION_VAL_50_CHT NULL +#define OPTION_VAL_60_CHT NULL +#define OPTION_VAL_70_CHT NULL +#define OPTION_VAL_80_CHT NULL +#define OPTION_VAL_90_CHT NULL +#define OPTION_VAL_100_O45_CHT NULL +#define OPTION_VAL_110_O45_CHT NULL +#define OPTION_VAL_120_O45_CHT NULL +#define OPTION_VAL_130_O45_CHT NULL +#define OPTION_VAL_140_O45_CHT NULL +#define OPTION_VAL_150_O45_CHT NULL +#define OPTION_VAL_160_O45_CHT NULL +#define OPTION_VAL_170_O45_CHT NULL +#define OPTION_VAL_180_O45_CHT NULL +#define OPTION_VAL_190_O45_CHT NULL +#define OPTION_VAL_200_O45_CHT NULL +#define OPTION_VAL_210_O45_CHT NULL +#define OPTION_VAL_220_O45_CHT NULL +#define OPTION_VAL_230_O45_CHT NULL +#define OPTION_VAL_240_O45_CHT NULL +#define OPTION_VAL_250_O45_CHT NULL +#define OPTION_VAL_260_O45_CHT NULL +#define OPTION_VAL_270_O45_CHT NULL +#define OPTION_VAL_280_O45_CHT NULL +#define OPTION_VAL_290_O45_CHT NULL +#define OPTION_VAL_300_O45_CHT NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHT NULL +#define OPTION_VAL_WHITE_CHT "白色" +#define OPTION_VAL_RED_CHT "紅色" +#define OPTION_VAL_GREEN_CHT "綠色" +#define OPTION_VAL_BLUE_CHT "藍色" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHT NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHT NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CHT NULL +#define OPTION_VAL_VMU_CHT NULL +#define OPTION_VAL_PURUPURU_CHT NULL +#define OPTION_VAL_NONE_CHT "無" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CHT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CHT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHT NULL +#define OPTION_VAL_VMU_A1_CHT NULL +#define OPTION_VAL_ALL_VMUS_CHT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHT NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHT NULL +#define OPTION_VAL_UPPER_LEFT_CHT NULL +#define OPTION_VAL_UPPER_RIGHT_CHT NULL +#define OPTION_VAL_LOWER_LEFT_CHT NULL +#define OPTION_VAL_LOWER_RIGHT_CHT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHT NULL +#define OPTION_VAL_1X_CHT "1倍" +#define OPTION_VAL_3X_CHT "3倍" +#define OPTION_VAL_5X_CHT "5倍" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHT NULL +#define OPTION_VAL_DEFAULT_ON_00_CHT NULL +#define OPTION_VAL_DEFAULT_OFF_01_CHT NULL +#define OPTION_VAL_BLACK_02_CHT "黑色" +#define OPTION_VAL_LIGHT_BLUE_04_CHT "淺藍色" +#define OPTION_VAL_CYAN_06_CHT "青色" +#define OPTION_VAL_CYAN_BLUE_07_CHT "青藍色" +#define OPTION_VAL_LIGHT_GREEN_08_CHT "淺綠色" +#define OPTION_VAL_CYAN_GREEN_09_CHT "青綠色" +#define OPTION_VAL_LIGHT_CYAN_10_CHT "淺青色" +#define OPTION_VAL_PURPLE_12_CHT "紫色" +#define OPTION_VAL_LIGHT_PURPLE_13_CHT "淺紫色" +#define OPTION_VAL_YELLOW_14_CHT "黃色" +#define OPTION_VAL_GRAY_15_CHT "灰色" +#define OPTION_VAL_LIGHT_PURPLE_2_16_CHT "淺紫色 (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_CHT "淺綠色 (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_CHT "淺綠色 (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_CHT "淺青色 (2)" +#define OPTION_VAL_LIGHT_RED_2_20_CHT "淡紅色 (2)" +#define OPTION_VAL_MAGENTA_21_CHT "洋紅色" +#define OPTION_VAL_LIGHT_PURPLE_3_22_CHT "淺紫色 (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_CHT "淺橘色" +#define OPTION_VAL_ORANGE_24_CHT "橙色" +#define OPTION_VAL_LIGHT_PURPLE_4_25_CHT "淺紫色 (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_CHT "淡黃色" +#define OPTION_VAL_LIGHT_YELLOW_2_27_CHT "淡黃色 (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHT NULL +#define OPTION_VAL_40_CHT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHT NULL + +struct retro_core_option_v2_category option_cats_cht[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CHT, + CATEGORY_SYSTEM_INFO_0_CHT + }, + { + "video", + CATEGORY_VIDEO_LABEL_CHT, + CATEGORY_VIDEO_INFO_0_CHT }, { "performance", - CATEGORY_PERFORMANCE_LABEL_CS, - CATEGORY_PERFORMANCE_INFO_0_CS + CATEGORY_PERFORMANCE_LABEL_CHT, + CATEGORY_PERFORMANCE_INFO_0_CHT }, { "hacks", - CATEGORY_HACKS_LABEL_CS, - CATEGORY_HACKS_INFO_0_CS + CATEGORY_HACKS_LABEL_CHT, + CATEGORY_HACKS_INFO_0_CHT }, { "input", - CATEGORY_INPUT_LABEL_CS, - CATEGORY_INPUT_INFO_0_CS + CATEGORY_INPUT_LABEL_CHT, + CATEGORY_INPUT_INFO_0_CHT + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_CHT, + CATEGORY_EXPANSIONS_INFO_0_CHT }, { "vmu", - CATEGORY_VMU_LABEL_CS, - CATEGORY_VMU_INFO_0_CS + CATEGORY_VMU_LABEL_CHT, + CATEGORY_VMU_INFO_0_CHT }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_cs[] = { +struct retro_core_option_v2_definition option_defs_cht[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_CS, + CORE_OPTION_NAME_REGION_LABEL_CHT, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_CS }, - { "USA", OPTION_VAL_USA_CS }, - { "Europe", OPTION_VAL_EUROPE_CS }, - { "Default", OPTION_VAL_DEFAULT_CS }, + { "Japan", OPTION_VAL_JAPAN_CHT }, + { "USA", OPTION_VAL_USA_CHT }, + { "Europe", OPTION_VAL_EUROPE_CHT }, + { "Default", OPTION_VAL_DEFAULT_CHT }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_CS, + CORE_OPTION_NAME_LANGUAGE_LABEL_CHT, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_CS, + CORE_OPTION_NAME_LANGUAGE_INFO_0_CHT, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_CS }, - { "English", OPTION_VAL_ENGLISH_CS }, - { "German", OPTION_VAL_GERMAN_CS }, - { "French", OPTION_VAL_FRENCH_CS }, - { "Spanish", OPTION_VAL_SPANISH_CS }, - { "Italian", OPTION_VAL_ITALIAN_CS }, - { "Default", OPTION_VAL_DEFAULT_CS }, + { "Japanese", OPTION_VAL_JAPANESE_CHT }, + { "English", OPTION_VAL_ENGLISH_CHT }, + { "German", OPTION_VAL_GERMAN_CHT }, + { "French", OPTION_VAL_FRENCH_CHT }, + { "Spanish", OPTION_VAL_SPANISH_CHT }, + { "Italian", OPTION_VAL_ITALIAN_CHT }, + { "Default", OPTION_VAL_DEFAULT_CHT }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_CS, + CORE_OPTION_NAME_HLE_BIOS_LABEL_CHT, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_CS, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_CHT, NULL, "system", { @@ -11217,9 +12556,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CS, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CHT, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CS, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CHT, NULL, "system", { @@ -11231,9 +12570,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_CS, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_CHT, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CS, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CHT, NULL, "system", { @@ -11247,25 +12586,11 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_CS, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CS, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CS, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CHT, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CS, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CHT, NULL, "system", { @@ -11277,9 +12602,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CS, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CHT, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CS, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CHT, NULL, "system", { @@ -11291,9 +12616,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_CS, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_CHT, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CS, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CHT, NULL, "system", { @@ -11305,9 +12630,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_CS, + CORE_OPTION_NAME_UPNP_LABEL_CHT, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_CS, + CORE_OPTION_NAME_UPNP_INFO_0_CHT, NULL, "system", { @@ -11320,39 +12645,39 @@ struct retro_core_option_v2_definition option_defs_cs[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CS, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CHT, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CS, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CHT, NULL, "video", { - { "320x240", OPTION_VAL_320X240_CS }, - { "640x480", OPTION_VAL_640X480_CS }, - { "800x600", OPTION_VAL_800X600_CS }, - { "960x720", OPTION_VAL_960X720_CS }, - { "1024x768", OPTION_VAL_1024X768_CS }, - { "1280x960", OPTION_VAL_1280X960_CS }, - { "1440x1080", OPTION_VAL_1440X1080_CS }, - { "1600x1200", OPTION_VAL_1600X1200_CS }, - { "1920x1440", OPTION_VAL_1920X1440_CS }, - { "2560x1920", OPTION_VAL_2560X1920_CS }, - { "2880x2160", OPTION_VAL_2880X2160_CS }, - { "3200x2400", OPTION_VAL_3200X2400_CS }, - { "3840x2880", OPTION_VAL_3840X2880_CS }, - { "4480x3360", OPTION_VAL_4480X3360_CS }, - { "5120x3840", OPTION_VAL_5120X3840_CS }, - { "5760x4320", OPTION_VAL_5760X4320_CS }, - { "6400x4800", OPTION_VAL_6400X4800_CS }, - { "7040x5280", OPTION_VAL_7040X5280_CS }, - { "7680x5760", OPTION_VAL_7680X5760_CS }, - { "8320x6240", OPTION_VAL_8320X6240_CS }, - { "8960x6720", OPTION_VAL_8960X6720_CS }, - { "9600x7200", OPTION_VAL_9600X7200_CS }, - { "10240x7680", OPTION_VAL_10240X7680_CS }, - { "10880x8160", OPTION_VAL_10880X8160_CS }, - { "11520x8640", OPTION_VAL_11520X8640_CS }, - { "12160x9120", OPTION_VAL_12160X9120_CS }, - { "12800x9600", OPTION_VAL_12800X9600_CS }, + { "320x240", OPTION_VAL_320X240_CHT }, + { "640x480", OPTION_VAL_640X480_CHT }, + { "800x600", OPTION_VAL_800X600_CHT }, + { "960x720", OPTION_VAL_960X720_CHT }, + { "1024x768", OPTION_VAL_1024X768_CHT }, + { "1280x960", OPTION_VAL_1280X960_CHT }, + { "1440x1080", OPTION_VAL_1440X1080_CHT }, + { "1600x1200", OPTION_VAL_1600X1200_CHT }, + { "1920x1440", OPTION_VAL_1920X1440_CHT }, + { "2560x1920", OPTION_VAL_2560X1920_CHT }, + { "2880x2160", OPTION_VAL_2880X2160_CHT }, + { "3200x2400", OPTION_VAL_3200X2400_CHT }, + { "3840x2880", OPTION_VAL_3840X2880_CHT }, + { "4480x3360", OPTION_VAL_4480X3360_CHT }, + { "5120x3840", OPTION_VAL_5120X3840_CHT }, + { "5760x4320", OPTION_VAL_5760X4320_CHT }, + { "6400x4800", OPTION_VAL_6400X4800_CHT }, + { "7040x5280", OPTION_VAL_7040X5280_CHT }, + { "7680x5760", OPTION_VAL_7680X5760_CHT }, + { "8320x6240", OPTION_VAL_8320X6240_CHT }, + { "8960x6720", OPTION_VAL_8960X6720_CHT }, + { "9600x7200", OPTION_VAL_9600X7200_CHT }, + { "10240x7680", OPTION_VAL_10240X7680_CHT }, + { "10880x8160", OPTION_VAL_10880X8160_CHT }, + { "11520x8640", OPTION_VAL_11520X8640_CHT }, + { "12160x9120", OPTION_VAL_12160X9120_CHT }, + { "12800x9600", OPTION_VAL_12800X9600_CHT }, { NULL, NULL }, }, #ifdef LOW_RES @@ -11363,62 +12688,62 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_CS, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_CHT, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CS, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CHT, NULL, "video", { - { "VGA", OPTION_VAL_VGA_CS }, - { "TV (RGB)", OPTION_VAL_TV_RGB_CS }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CS }, + { "VGA", OPTION_VAL_VGA_CHT }, + { "TV (RGB)", OPTION_VAL_TV_RGB_CHT }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CHT }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_CS, + CORE_OPTION_NAME_BROADCAST_LABEL_CHT, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_CS }, - { "PAL", OPTION_VAL_PAL_CS }, - { "PAL_N", OPTION_VAL_PAL_N_CS }, - { "PAL_M", OPTION_VAL_PAL_M_CS }, - { "Default", OPTION_VAL_DEFAULT_CS }, + { "NTSC", OPTION_VAL_NTSC_CHT }, + { "PAL", OPTION_VAL_PAL_CHT }, + { "PAL_N", OPTION_VAL_PAL_N_CHT }, + { "PAL_M", OPTION_VAL_PAL_M_CHT }, + { "Default", OPTION_VAL_DEFAULT_CHT }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CS, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CHT, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_CS }, - { "vertical", OPTION_VAL_VERTICAL_CS }, + { "horizontal", OPTION_VAL_HORIZONTAL_CHT }, + { "vertical", OPTION_VAL_VERTICAL_CHT }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CS, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CHT, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CS }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CS }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CHT }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CHT }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CS }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CHT }, #endif { NULL, NULL }, }, @@ -11431,25 +12756,25 @@ struct retro_core_option_v2_definition option_defs_cs[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CS, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CHT, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CS, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CHT, NULL, "video", { - { "512MB", OPTION_VAL_512MB_CS }, - { "1GB", OPTION_VAL_1GB_CS }, - { "2GB", OPTION_VAL_2GB_CS }, - { "4GB", OPTION_VAL_4GB_CS }, + { "512MB", OPTION_VAL_512MB_CHT }, + { "1GB", OPTION_VAL_1GB_CHT }, + { "2GB", OPTION_VAL_2GB_CHT }, + { "4GB", OPTION_VAL_4GB_CHT }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_CS, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_CHT, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CS, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CHT, NULL, "video", { @@ -11457,6 +12782,7 @@ struct retro_core_option_v2_definition option_defs_cs[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -11465,9 +12791,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CS, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CHT, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CS, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CHT, NULL, "video", { @@ -11479,9 +12805,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CS, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CHT, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CS, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CHT, NULL, "video", { @@ -11491,11 +12817,11 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_CS, + CORE_OPTION_NAME_MIPMAPPING_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_CHT, NULL, "video", { @@ -11507,7 +12833,7 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_CS, + CORE_OPTION_NAME_FOG_LABEL_CHT, NULL, "", NULL, @@ -11521,9 +12847,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CS, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CHT, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CS, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CHT, NULL, "video", { @@ -11535,9 +12861,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CS, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CHT, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CS, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CHT, NULL, "video", { @@ -11552,24 +12878,24 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CS, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CHT, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CS, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CHT, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_CS }, - { "1", OPTION_VAL_1_CS }, - { "2", OPTION_VAL_2_CS }, + { "0", OPTION_VAL_DEFAULT_CHT }, + { "1", OPTION_VAL_1_CHT }, + { "2", OPTION_VAL_2_CHT }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CS, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CHT, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CS, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CHT, NULL, "video", { @@ -11577,13 +12903,13 @@ struct retro_core_option_v2_definition option_defs_cs[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CS, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CHT, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CS, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CHT, NULL, "video", { @@ -11595,9 +12921,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CS, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CHT, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CS, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CHT, NULL, "video", { @@ -11610,25 +12936,25 @@ struct retro_core_option_v2_definition option_defs_cs[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_CS, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_CHT, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CS, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CHT, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_CS }, - { "4", OPTION_VAL_4_CS }, - { "6", OPTION_VAL_6_CS }, + { "2", OPTION_VAL_2_O26_CHT }, + { "4", OPTION_VAL_4_CHT }, + { "6", OPTION_VAL_6_CHT }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CS, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CHT, NULL, "video", { @@ -11642,9 +12968,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CS, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CHT, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CS, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CHT, NULL, "video", { @@ -11654,11 +12980,25 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CHT, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CHT, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CS, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CHT, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CS, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CHT, NULL, "performance", { @@ -11670,15 +13010,15 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CS, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CHT, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CS, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CHT, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_CS }, - { "more", OPTION_VAL_MORE_CS }, + { "some", OPTION_VAL_SOME_CHT }, + { "more", OPTION_VAL_MORE_CHT }, { NULL, NULL }, }, #ifdef LOW_END @@ -11689,9 +13029,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CS, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CHT, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CS, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CHT, NULL, "performance", { @@ -11708,9 +13048,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CS, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CHT, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CS, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CHT, NULL, "hacks", { @@ -11722,9 +13062,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CS, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CHT, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CS, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CHT, NULL, "hacks", { @@ -11736,9 +13076,9 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CS, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CHT, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CS, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CHT, NULL, "hacks", { @@ -11752,64 +13092,78 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CHT, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CHT, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_CS, + CORE_OPTION_NAME_SH4CLOCK_LABEL_CHT, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_CS, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_CHT, NULL, "hacks", { - { "100", OPTION_VAL_100_CS }, - { "110", OPTION_VAL_110_CS }, - { "120", OPTION_VAL_120_CS }, - { "130", OPTION_VAL_130_CS }, - { "140", OPTION_VAL_140_CS }, - { "150", OPTION_VAL_150_CS }, - { "160", OPTION_VAL_160_CS }, - { "170", OPTION_VAL_170_CS }, - { "180", OPTION_VAL_180_CS }, - { "190", OPTION_VAL_190_CS }, - { "200", OPTION_VAL_200_CS }, - { "210", OPTION_VAL_210_CS }, - { "220", OPTION_VAL_220_CS }, - { "230", OPTION_VAL_230_CS }, - { "240", OPTION_VAL_240_CS }, - { "250", OPTION_VAL_250_CS }, - { "260", OPTION_VAL_260_CS }, - { "270", OPTION_VAL_270_CS }, - { "280", OPTION_VAL_280_CS }, - { "290", OPTION_VAL_290_CS }, - { "300", OPTION_VAL_300_CS }, - { "310", OPTION_VAL_310_CS }, - { "320", OPTION_VAL_320_CS }, - { "330", OPTION_VAL_330_CS }, - { "340", OPTION_VAL_340_CS }, - { "350", OPTION_VAL_350_CS }, - { "360", OPTION_VAL_360_CS }, - { "370", OPTION_VAL_370_CS }, - { "380", OPTION_VAL_380_CS }, - { "390", OPTION_VAL_390_CS }, - { "400", OPTION_VAL_400_CS }, - { "410", OPTION_VAL_410_CS }, - { "420", OPTION_VAL_420_CS }, - { "430", OPTION_VAL_430_CS }, - { "440", OPTION_VAL_440_CS }, - { "450", OPTION_VAL_450_CS }, - { "460", OPTION_VAL_460_CS }, - { "470", OPTION_VAL_470_CS }, - { "480", OPTION_VAL_480_CS }, - { "490", OPTION_VAL_490_CS }, - { "500", OPTION_VAL_500_CS }, + { "100", OPTION_VAL_100_CHT }, + { "110", OPTION_VAL_110_CHT }, + { "120", OPTION_VAL_120_CHT }, + { "130", OPTION_VAL_130_CHT }, + { "140", OPTION_VAL_140_CHT }, + { "150", OPTION_VAL_150_CHT }, + { "160", OPTION_VAL_160_CHT }, + { "170", OPTION_VAL_170_CHT }, + { "180", OPTION_VAL_180_CHT }, + { "190", OPTION_VAL_190_CHT }, + { "200", OPTION_VAL_200_CHT }, + { "210", OPTION_VAL_210_CHT }, + { "220", OPTION_VAL_220_CHT }, + { "230", OPTION_VAL_230_CHT }, + { "240", OPTION_VAL_240_CHT }, + { "250", OPTION_VAL_250_CHT }, + { "260", OPTION_VAL_260_CHT }, + { "270", OPTION_VAL_270_CHT }, + { "280", OPTION_VAL_280_CHT }, + { "290", OPTION_VAL_290_CHT }, + { "300", OPTION_VAL_300_CHT }, + { "310", OPTION_VAL_310_CHT }, + { "320", OPTION_VAL_320_CHT }, + { "330", OPTION_VAL_330_CHT }, + { "340", OPTION_VAL_340_CHT }, + { "350", OPTION_VAL_350_CHT }, + { "360", OPTION_VAL_360_CHT }, + { "370", OPTION_VAL_370_CHT }, + { "380", OPTION_VAL_380_CHT }, + { "390", OPTION_VAL_390_CHT }, + { "400", OPTION_VAL_400_CHT }, + { "410", OPTION_VAL_410_CHT }, + { "420", OPTION_VAL_420_CHT }, + { "430", OPTION_VAL_430_CHT }, + { "440", OPTION_VAL_440_CHT }, + { "450", OPTION_VAL_450_CHT }, + { "460", OPTION_VAL_460_CHT }, + { "470", OPTION_VAL_470_CHT }, + { "480", OPTION_VAL_480_CHT }, + { "490", OPTION_VAL_490_CHT }, + { "500", OPTION_VAL_500_CHT }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CS, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CHT, NULL, "hacks", { @@ -11819,11 +13173,11 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CS, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CHT, NULL, "hacks", { @@ -11835,47 +13189,47 @@ struct retro_core_option_v2_definition option_defs_cs[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CS, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CHT, NULL, "input", { - { "0%", OPTION_VAL_0_CS }, - { "5%", OPTION_VAL_5_CS }, - { "10%", OPTION_VAL_10_CS }, - { "15%", OPTION_VAL_15_CS }, - { "20%", OPTION_VAL_20_CS }, - { "25%", OPTION_VAL_25_CS }, - { "30%", OPTION_VAL_30_CS }, + { "0%", OPTION_VAL_0_CHT }, + { "5%", OPTION_VAL_5_CHT }, + { "10%", OPTION_VAL_10_CHT }, + { "15%", OPTION_VAL_15_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "25%", OPTION_VAL_25_CHT }, + { "30%", OPTION_VAL_30_CHT }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CS, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CHT, NULL, "input", { - { "0%", OPTION_VAL_0_CS }, - { "5%", OPTION_VAL_5_CS }, - { "10%", OPTION_VAL_10_CS }, - { "15%", OPTION_VAL_15_CS }, - { "20%", OPTION_VAL_20_CS }, - { "25%", OPTION_VAL_25_CS }, - { "30%", OPTION_VAL_30_CS }, + { "0%", OPTION_VAL_0_CHT }, + { "5%", OPTION_VAL_5_CHT }, + { "10%", OPTION_VAL_10_CHT }, + { "15%", OPTION_VAL_15_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "25%", OPTION_VAL_25_CHT }, + { "30%", OPTION_VAL_30_CHT }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CS, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CHT, NULL, "input", { @@ -11886,10 +13240,10 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CS, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CHT, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CS, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CHT, NULL, "input", { @@ -11897,300 +13251,293 @@ struct retro_core_option_v2_definition option_defs_cs[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CS, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CHT, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CS, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CHT, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CS, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CHT, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CS, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_CHT }, + { "60%", OPTION_VAL_60_CHT }, + { "70%", OPTION_VAL_70_CHT }, + { "80%", OPTION_VAL_80_CHT }, + { "90%", OPTION_VAL_90_CHT }, + { "100%", OPTION_VAL_100_O45_CHT }, + { "110%", OPTION_VAL_110_O45_CHT }, + { "120%", OPTION_VAL_120_O45_CHT }, + { "130%", OPTION_VAL_130_O45_CHT }, + { "140%", OPTION_VAL_140_O45_CHT }, + { "150%", OPTION_VAL_150_O45_CHT }, + { "160%", OPTION_VAL_160_O45_CHT }, + { "170%", OPTION_VAL_170_O45_CHT }, + { "180%", OPTION_VAL_180_O45_CHT }, + { "190%", OPTION_VAL_190_O45_CHT }, + { "200%", OPTION_VAL_200_O45_CHT }, + { "210%", OPTION_VAL_210_O45_CHT }, + { "220%", OPTION_VAL_220_O45_CHT }, + { "230%", OPTION_VAL_230_O45_CHT }, + { "240%", OPTION_VAL_240_O45_CHT }, + { "250%", OPTION_VAL_250_O45_CHT }, + { "260%", OPTION_VAL_260_O45_CHT }, + { "270%", OPTION_VAL_270_O45_CHT }, + { "280%", OPTION_VAL_280_O45_CHT }, + { "290%", OPTION_VAL_290_O45_CHT }, + { "300%", OPTION_VAL_300_O45_CHT }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CS, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CHT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CS }, - { "Red", OPTION_VAL_RED_CS }, - { "Green", OPTION_VAL_GREEN_CS }, - { "Blue", OPTION_VAL_BLUE_CS }, + { "White", OPTION_VAL_WHITE_CHT }, + { "Red", OPTION_VAL_RED_CHT }, + { "Green", OPTION_VAL_GREEN_CHT }, + { "Blue", OPTION_VAL_BLUE_CHT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CS, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CHT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CS }, - { "Red", OPTION_VAL_RED_CS }, - { "Green", OPTION_VAL_GREEN_CS }, - { "Blue", OPTION_VAL_BLUE_CS }, + { "White", OPTION_VAL_WHITE_CHT }, + { "Red", OPTION_VAL_RED_CHT }, + { "Green", OPTION_VAL_GREEN_CHT }, + { "Blue", OPTION_VAL_BLUE_CHT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CS, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CHT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CS }, - { "Red", OPTION_VAL_RED_CS }, - { "Green", OPTION_VAL_GREEN_CS }, - { "Blue", OPTION_VAL_BLUE_CS }, + { "White", OPTION_VAL_WHITE_CHT }, + { "Red", OPTION_VAL_RED_CHT }, + { "Green", OPTION_VAL_GREEN_CHT }, + { "Blue", OPTION_VAL_BLUE_CHT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CS, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CHT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CS }, - { "Red", OPTION_VAL_RED_CS }, - { "Green", OPTION_VAL_GREEN_CS }, - { "Blue", OPTION_VAL_BLUE_CS }, + { "White", OPTION_VAL_WHITE_CHT }, + { "Red", OPTION_VAL_RED_CHT }, + { "Green", OPTION_VAL_GREEN_CHT }, + { "Blue", OPTION_VAL_BLUE_CHT }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CS, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CS, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CS, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CHT, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CHT, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_CS }, - { "All VMUs", OPTION_VAL_ALL_VMUS_CS }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_CS, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CS, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_CS, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CHT, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CHT, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CS, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CS, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CS, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CHT, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CHT, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CS, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CHT, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CS, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CHT, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CS, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CHT, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_CS }, - { "2x", OPTION_VAL_2_O27_CS }, - { "3x", OPTION_VAL_3X_CS }, - { "4x", OPTION_VAL_4_CS }, - { "5x", OPTION_VAL_5X_CS }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CS, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CHT, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CS, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CHT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CHT, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "VMU", OPTION_VAL_VMU_CHT }, + { "Purupuru", OPTION_VAL_PURUPURU_CHT }, + { "None", OPTION_VAL_NONE_CHT }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CS, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CHT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CHT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CHT, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_CHT }, + { "All VMUs", OPTION_VAL_ALL_VMUS_CHT }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_CHT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CHT, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_CHT, NULL, "vmu", { - { "10%", OPTION_VAL_10_CS }, - { "20%", OPTION_VAL_20_CS }, - { "30%", OPTION_VAL_30_CS }, - { "40%", OPTION_VAL_40_CS }, - { "50%", OPTION_VAL_50_CS }, - { "60%", OPTION_VAL_60_CS }, - { "70%", OPTION_VAL_70_CS }, - { "80%", OPTION_VAL_80_CS }, - { "90%", OPTION_VAL_90_CS }, - { "100%", OPTION_VAL_100_O57_CS }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CS, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CHT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CHT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CHT, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CHT, NULL, "", NULL, @@ -12203,145 +13550,145 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CS, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CHT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CS, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CHT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CS }, - { "2x", OPTION_VAL_2_O27_CS }, - { "3x", OPTION_VAL_3X_CS }, - { "4x", OPTION_VAL_4_CS }, - { "5x", OPTION_VAL_5X_CS }, + { "1x", OPTION_VAL_1X_CHT }, + { "2x", OPTION_VAL_2_O26_CHT }, + { "3x", OPTION_VAL_3X_CHT }, + { "4x", OPTION_VAL_4_CHT }, + { "5x", OPTION_VAL_5X_CHT }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CS, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CHT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CS }, - { "20%", OPTION_VAL_20_CS }, - { "30%", OPTION_VAL_30_CS }, - { "40%", OPTION_VAL_40_CS }, - { "50%", OPTION_VAL_50_CS }, - { "60%", OPTION_VAL_60_CS }, - { "70%", OPTION_VAL_70_CS }, - { "80%", OPTION_VAL_80_CS }, - { "90%", OPTION_VAL_90_CS }, - { "100%", OPTION_VAL_100_O57_CS }, + { "10%", OPTION_VAL_10_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "30%", OPTION_VAL_30_CHT }, + { "40%", OPTION_VAL_40_CHT }, + { "50%", OPTION_VAL_50_CHT }, + { "60%", OPTION_VAL_60_CHT }, + { "70%", OPTION_VAL_70_CHT }, + { "80%", OPTION_VAL_80_CHT }, + { "90%", OPTION_VAL_90_CHT }, + { "100%", OPTION_VAL_100_O45_CHT }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CS, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CHT, NULL, "", NULL, @@ -12354,145 +13701,145 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CS, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CHT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CS, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CHT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CS }, - { "2x", OPTION_VAL_2_O27_CS }, - { "3x", OPTION_VAL_3X_CS }, - { "4x", OPTION_VAL_4_CS }, - { "5x", OPTION_VAL_5X_CS }, + { "1x", OPTION_VAL_1X_CHT }, + { "2x", OPTION_VAL_2_O26_CHT }, + { "3x", OPTION_VAL_3X_CHT }, + { "4x", OPTION_VAL_4_CHT }, + { "5x", OPTION_VAL_5X_CHT }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CS, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CHT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CS }, - { "20%", OPTION_VAL_20_CS }, - { "30%", OPTION_VAL_30_CS }, - { "40%", OPTION_VAL_40_CS }, - { "50%", OPTION_VAL_50_CS }, - { "60%", OPTION_VAL_60_CS }, - { "70%", OPTION_VAL_70_CS }, - { "80%", OPTION_VAL_80_CS }, - { "90%", OPTION_VAL_90_CS }, - { "100%", OPTION_VAL_100_O57_CS }, + { "10%", OPTION_VAL_10_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "30%", OPTION_VAL_30_CHT }, + { "40%", OPTION_VAL_40_CHT }, + { "50%", OPTION_VAL_50_CHT }, + { "60%", OPTION_VAL_60_CHT }, + { "70%", OPTION_VAL_70_CHT }, + { "80%", OPTION_VAL_80_CHT }, + { "90%", OPTION_VAL_90_CHT }, + { "100%", OPTION_VAL_100_O45_CHT }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CS, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CHT, NULL, "", NULL, @@ -12505,784 +13852,728 @@ struct retro_core_option_v2_definition option_defs_cs[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CS, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CHT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CS, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CHT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CS }, - { "2x", OPTION_VAL_2_O27_CS }, - { "3x", OPTION_VAL_3X_CS }, - { "4x", OPTION_VAL_4_CS }, - { "5x", OPTION_VAL_5X_CS }, + { "1x", OPTION_VAL_1X_CHT }, + { "2x", OPTION_VAL_2_O26_CHT }, + { "3x", OPTION_VAL_3X_CHT }, + { "4x", OPTION_VAL_4_CHT }, + { "5x", OPTION_VAL_5X_CHT }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CS, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CHT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, - { "BLACK 02", OPTION_VAL_BLACK_02_CS }, - { "BLUE 03", OPTION_VAL_BLUE_CS }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, - { "GREEN 05", OPTION_VAL_GREEN_CS }, - { "CYAN 06", OPTION_VAL_CYAN_06_CS }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, - { "RED 11", OPTION_VAL_RED_CS }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, - { "GRAY 15", OPTION_VAL_GRAY_15_CS }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, - { "WHITE 28", OPTION_VAL_WHITE_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CS, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CHT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CS }, - { "20%", OPTION_VAL_20_CS }, - { "30%", OPTION_VAL_30_CS }, - { "40%", OPTION_VAL_40_CS }, - { "50%", OPTION_VAL_50_CS }, - { "60%", OPTION_VAL_60_CS }, - { "70%", OPTION_VAL_70_CS }, - { "80%", OPTION_VAL_80_CS }, - { "90%", OPTION_VAL_90_CS }, - { "100%", OPTION_VAL_100_O57_CS }, + { "10%", OPTION_VAL_10_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "30%", OPTION_VAL_30_CHT }, + { "40%", OPTION_VAL_40_CHT }, + { "50%", OPTION_VAL_50_CHT }, + { "60%", OPTION_VAL_60_CHT }, + { "70%", OPTION_VAL_70_CHT }, + { "80%", OPTION_VAL_80_CHT }, + { "90%", OPTION_VAL_90_CHT }, + { "100%", OPTION_VAL_100_O45_CHT }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_cs = { - option_cats_cs, - option_defs_cs -}; - -/* RETRO_LANGUAGE_CY */ - -#define CATEGORY_SYSTEM_LABEL_CY NULL -#define CATEGORY_SYSTEM_INFO_0_CY NULL -#define CATEGORY_VIDEO_LABEL_CY NULL -#define CATEGORY_VIDEO_INFO_0_CY NULL -#define CATEGORY_PERFORMANCE_LABEL_CY NULL -#define CATEGORY_PERFORMANCE_INFO_0_CY NULL -#define CATEGORY_HACKS_LABEL_CY NULL -#define CATEGORY_HACKS_INFO_0_CY NULL -#define CATEGORY_INPUT_LABEL_CY "Mewnbwn" -#define CATEGORY_INPUT_INFO_0_CY NULL -#define CATEGORY_VMU_LABEL_CY NULL -#define CATEGORY_VMU_INFO_0_CY NULL -#define CORE_OPTION_NAME_REGION_LABEL_CY NULL -#define OPTION_VAL_JAPAN_CY NULL -#define OPTION_VAL_USA_CY NULL -#define OPTION_VAL_EUROPE_CY NULL -#define OPTION_VAL_DEFAULT_CY NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_CY NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CY NULL -#define OPTION_VAL_JAPANESE_CY NULL -#define OPTION_VAL_ENGLISH_CY NULL -#define OPTION_VAL_GERMAN_CY NULL -#define OPTION_VAL_FRENCH_CY NULL -#define OPTION_VAL_SPANISH_CY NULL -#define OPTION_VAL_ITALIAN_CY NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CY NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CY NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CY NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CY NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CY NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CY NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_CY NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CY NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CY NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CY NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CY NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CY NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CY NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CY NULL -#define CORE_OPTION_NAME_UPNP_LABEL_CY NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_CY NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CY NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CY NULL -#define OPTION_VAL_320X240_CY NULL -#define OPTION_VAL_640X480_CY NULL -#define OPTION_VAL_800X600_CY NULL -#define OPTION_VAL_960X720_CY NULL -#define OPTION_VAL_1024X768_CY NULL -#define OPTION_VAL_1280X960_CY NULL -#define OPTION_VAL_1440X1080_CY NULL -#define OPTION_VAL_1600X1200_CY NULL -#define OPTION_VAL_1920X1440_CY NULL -#define OPTION_VAL_2560X1920_CY NULL -#define OPTION_VAL_2880X2160_CY NULL -#define OPTION_VAL_3200X2400_CY NULL -#define OPTION_VAL_3840X2880_CY NULL -#define OPTION_VAL_4480X3360_CY NULL -#define OPTION_VAL_5120X3840_CY NULL -#define OPTION_VAL_5760X4320_CY NULL -#define OPTION_VAL_6400X4800_CY NULL -#define OPTION_VAL_7040X5280_CY NULL -#define OPTION_VAL_7680X5760_CY NULL -#define OPTION_VAL_8320X6240_CY NULL -#define OPTION_VAL_8960X6720_CY NULL -#define OPTION_VAL_9600X7200_CY NULL -#define OPTION_VAL_10240X7680_CY NULL -#define OPTION_VAL_10880X8160_CY NULL -#define OPTION_VAL_11520X8640_CY NULL -#define OPTION_VAL_12160X9120_CY NULL -#define OPTION_VAL_12800X9600_CY NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CY NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CY NULL -#define OPTION_VAL_VGA_CY NULL -#define OPTION_VAL_TV_RGB_CY NULL -#define OPTION_VAL_TV_COMPOSITE_CY NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_CY NULL -#define OPTION_VAL_NTSC_CY NULL -#define OPTION_VAL_PAL_CY NULL -#define OPTION_VAL_PAL_N_CY NULL -#define OPTION_VAL_PAL_M_CY NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CY NULL -#define OPTION_VAL_HORIZONTAL_CY NULL -#define OPTION_VAL_VERTICAL_CY NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CY NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CY NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_CY NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_CY NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CY NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CY NULL -#define OPTION_VAL_512MB_CY NULL -#define OPTION_VAL_1GB_CY NULL -#define OPTION_VAL_2GB_CY NULL -#define OPTION_VAL_4GB_CY NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CY NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CY NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CY NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CY NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CY NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CY NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CY NULL -#define CORE_OPTION_NAME_FOG_LABEL_CY NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CY NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CY NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CY NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CY NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CY NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CY NULL -#define OPTION_VAL_1_CY NULL -#define OPTION_VAL_2_CY NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CY NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CY NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CY NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CY NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CY NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CY NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CY NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CY NULL -#define OPTION_VAL_2_O27_CY NULL -#define OPTION_VAL_4_CY NULL -#define OPTION_VAL_6_CY NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CY NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CY NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CY NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CY NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CY NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CY NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CY NULL -#define OPTION_VAL_SOME_CY NULL -#define OPTION_VAL_MORE_CY NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CY NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CY NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CY NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CY NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CY NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CY NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CY NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CY NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CY NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CY NULL -#define OPTION_VAL_100_CY NULL -#define OPTION_VAL_110_CY NULL -#define OPTION_VAL_120_CY NULL -#define OPTION_VAL_130_CY NULL -#define OPTION_VAL_140_CY NULL -#define OPTION_VAL_150_CY NULL -#define OPTION_VAL_160_CY NULL -#define OPTION_VAL_170_CY NULL -#define OPTION_VAL_180_CY NULL -#define OPTION_VAL_190_CY NULL -#define OPTION_VAL_200_CY NULL -#define OPTION_VAL_210_CY NULL -#define OPTION_VAL_220_CY NULL -#define OPTION_VAL_230_CY NULL -#define OPTION_VAL_240_CY NULL -#define OPTION_VAL_250_CY NULL -#define OPTION_VAL_260_CY NULL -#define OPTION_VAL_270_CY NULL -#define OPTION_VAL_280_CY NULL -#define OPTION_VAL_290_CY NULL -#define OPTION_VAL_300_CY NULL -#define OPTION_VAL_310_CY NULL -#define OPTION_VAL_320_CY NULL -#define OPTION_VAL_330_CY NULL -#define OPTION_VAL_340_CY NULL -#define OPTION_VAL_350_CY NULL -#define OPTION_VAL_360_CY NULL -#define OPTION_VAL_370_CY NULL -#define OPTION_VAL_380_CY NULL -#define OPTION_VAL_390_CY NULL -#define OPTION_VAL_400_CY NULL -#define OPTION_VAL_410_CY NULL -#define OPTION_VAL_420_CY NULL -#define OPTION_VAL_430_CY NULL -#define OPTION_VAL_440_CY NULL -#define OPTION_VAL_450_CY NULL -#define OPTION_VAL_460_CY NULL -#define OPTION_VAL_470_CY NULL -#define OPTION_VAL_480_CY NULL -#define OPTION_VAL_490_CY NULL -#define OPTION_VAL_500_CY NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CY NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CY NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CY NULL -#define OPTION_VAL_0_CY NULL -#define OPTION_VAL_5_CY NULL -#define OPTION_VAL_10_CY NULL -#define OPTION_VAL_15_CY NULL -#define OPTION_VAL_20_CY NULL -#define OPTION_VAL_25_CY NULL -#define OPTION_VAL_30_CY NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CY NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CY NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CY NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CY NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CY NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CY NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CY NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CY NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CY NULL -#define OPTION_VAL_WHITE_CY NULL -#define OPTION_VAL_RED_CY "Coch" -#define OPTION_VAL_GREEN_CY NULL -#define OPTION_VAL_BLUE_CY NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CY NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CY NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CY NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CY NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CY NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CY NULL -#define OPTION_VAL_VMU_A1_CY NULL -#define OPTION_VAL_ALL_VMUS_CY NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CY NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CY NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CY NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CY NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CY NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CY NULL -#define OPTION_VAL_UPPER_LEFT_CY NULL -#define OPTION_VAL_UPPER_RIGHT_CY NULL -#define OPTION_VAL_LOWER_LEFT_CY NULL -#define OPTION_VAL_LOWER_RIGHT_CY NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CY NULL -#define OPTION_VAL_1X_CY NULL -#define OPTION_VAL_3X_CY NULL -#define OPTION_VAL_5X_CY NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CY NULL -#define OPTION_VAL_DEFAULT_ON_00_CY NULL -#define OPTION_VAL_DEFAULT_OFF_01_CY NULL -#define OPTION_VAL_BLACK_02_CY NULL -#define OPTION_VAL_LIGHT_BLUE_04_CY NULL -#define OPTION_VAL_CYAN_06_CY NULL -#define OPTION_VAL_CYAN_BLUE_07_CY NULL -#define OPTION_VAL_LIGHT_GREEN_08_CY NULL -#define OPTION_VAL_CYAN_GREEN_09_CY NULL -#define OPTION_VAL_LIGHT_CYAN_10_CY NULL -#define OPTION_VAL_PURPLE_12_CY NULL -#define OPTION_VAL_LIGHT_PURPLE_13_CY NULL -#define OPTION_VAL_YELLOW_14_CY NULL -#define OPTION_VAL_GRAY_15_CY NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_CY NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_CY NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_CY NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_CY NULL -#define OPTION_VAL_LIGHT_RED_2_20_CY NULL -#define OPTION_VAL_MAGENTA_21_CY NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_CY NULL -#define OPTION_VAL_LIGHT_ORANGE_23_CY NULL -#define OPTION_VAL_ORANGE_24_CY NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_CY NULL -#define OPTION_VAL_LIGHT_YELLOW_26_CY NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_CY NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CY NULL -#define OPTION_VAL_40_CY NULL -#define OPTION_VAL_50_CY NULL -#define OPTION_VAL_60_CY NULL -#define OPTION_VAL_70_CY NULL -#define OPTION_VAL_80_CY NULL -#define OPTION_VAL_90_CY NULL -#define OPTION_VAL_100_O57_CY NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CY NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CY NULL - -struct retro_core_option_v2_category option_cats_cy[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_CY, - CATEGORY_SYSTEM_INFO_0_CY - }, - { - "video", - CATEGORY_VIDEO_LABEL_CY, - CATEGORY_VIDEO_INFO_0_CY - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_CY, - CATEGORY_PERFORMANCE_INFO_0_CY - }, - { - "hacks", - CATEGORY_HACKS_LABEL_CY, - CATEGORY_HACKS_INFO_0_CY - }, - { - "input", - CATEGORY_INPUT_LABEL_CY, - CATEGORY_INPUT_INFO_0_CY - }, - { - "vmu", - CATEGORY_VMU_LABEL_CY, - CATEGORY_VMU_INFO_0_CY - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_cy[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_CY, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CHT, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_CY }, - { "USA", OPTION_VAL_USA_CY }, - { "Europe", OPTION_VAL_EUROPE_CY }, - { "Default", OPTION_VAL_DEFAULT_CY }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_CY, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_CY, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_CY }, - { "English", OPTION_VAL_ENGLISH_CY }, - { "German", OPTION_VAL_GERMAN_CY }, - { "French", OPTION_VAL_FRENCH_CY }, - { "Spanish", OPTION_VAL_SPANISH_CY }, - { "Italian", OPTION_VAL_ITALIAN_CY }, - { "Default", OPTION_VAL_DEFAULT_CY }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_CY, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_CY, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CY, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CY, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_CY, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CY, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_CY, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CHT, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_CY, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CHT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CHT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CHT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CHT }, { NULL, NULL }, }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CY, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CHT, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CY, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_CHT }, + { "2x", OPTION_VAL_2_O26_CHT }, + { "3x", OPTION_VAL_3X_CHT }, + { "4x", OPTION_VAL_4_CHT }, + { "5x", OPTION_VAL_5X_CHT }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CY, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CHT, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CY, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, - "enabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_CY, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CHT, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CY, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CHT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CHT }, + { "BLACK 02", OPTION_VAL_BLACK_02_CHT }, + { "BLUE 03", OPTION_VAL_BLUE_CHT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CHT }, + { "GREEN 05", OPTION_VAL_GREEN_CHT }, + { "CYAN 06", OPTION_VAL_CYAN_06_CHT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CHT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CHT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CHT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CHT }, + { "RED 11", OPTION_VAL_RED_CHT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CHT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CHT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CHT }, + { "GRAY 15", OPTION_VAL_GRAY_15_CHT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CHT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CHT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CHT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CHT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CHT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CHT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CHT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CHT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CHT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CHT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CHT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CHT }, + { "WHITE 28", OPTION_VAL_WHITE_CHT }, { NULL, NULL }, }, - "disabled", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_CY, + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CHT, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_CY, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_CHT }, + { "20%", OPTION_VAL_20_CHT }, + { "30%", OPTION_VAL_30_CHT }, + { "40%", OPTION_VAL_40_CHT }, + { "50%", OPTION_VAL_50_CHT }, + { "60%", OPTION_VAL_60_CHT }, + { "70%", OPTION_VAL_70_CHT }, + { "80%", OPTION_VAL_80_CHT }, + { "90%", OPTION_VAL_90_CHT }, + { "100%", OPTION_VAL_100_O45_CHT }, + { NULL, NULL }, }, - "enabled", + "100%", }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_cht = { + option_cats_cht, + option_defs_cht +}; - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CY, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CY, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_CY }, - { "640x480", OPTION_VAL_640X480_CY }, - { "800x600", OPTION_VAL_800X600_CY }, - { "960x720", OPTION_VAL_960X720_CY }, - { "1024x768", OPTION_VAL_1024X768_CY }, - { "1280x960", OPTION_VAL_1280X960_CY }, - { "1440x1080", OPTION_VAL_1440X1080_CY }, - { "1600x1200", OPTION_VAL_1600X1200_CY }, - { "1920x1440", OPTION_VAL_1920X1440_CY }, - { "2560x1920", OPTION_VAL_2560X1920_CY }, - { "2880x2160", OPTION_VAL_2880X2160_CY }, - { "3200x2400", OPTION_VAL_3200X2400_CY }, - { "3840x2880", OPTION_VAL_3840X2880_CY }, - { "4480x3360", OPTION_VAL_4480X3360_CY }, - { "5120x3840", OPTION_VAL_5120X3840_CY }, - { "5760x4320", OPTION_VAL_5760X4320_CY }, - { "6400x4800", OPTION_VAL_6400X4800_CY }, - { "7040x5280", OPTION_VAL_7040X5280_CY }, - { "7680x5760", OPTION_VAL_7680X5760_CY }, - { "8320x6240", OPTION_VAL_8320X6240_CY }, - { "8960x6720", OPTION_VAL_8960X6720_CY }, - { "9600x7200", OPTION_VAL_9600X7200_CY }, - { "10240x7680", OPTION_VAL_10240X7680_CY }, - { "10880x8160", OPTION_VAL_10880X8160_CY }, - { "11520x8640", OPTION_VAL_11520X8640_CY }, - { "12160x9120", OPTION_VAL_12160X9120_CY }, - { "12800x9600", OPTION_VAL_12800X9600_CY }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif +/* RETRO_LANGUAGE_CS */ + +#define CATEGORY_SYSTEM_LABEL_CS "Systém" +#define CATEGORY_SYSTEM_INFO_0_CS "Konfigurace regionu, jazyka, systému BIOS a základního nastavení hardwaru." +#define CATEGORY_VIDEO_LABEL_CS NULL +#define CATEGORY_VIDEO_INFO_0_CS "Konfigurace rozlišení, nastavení průhlednosti a vizuálních efektů nezávislých na pořadí." +#define CATEGORY_PERFORMANCE_LABEL_CS "Výkon" +#define CATEGORY_PERFORMANCE_INFO_0_CS "Konfigurace nastavení vykreslování ve vláknech a přeskakování snímků." +#define CATEGORY_HACKS_LABEL_CS NULL +#define CATEGORY_HACKS_INFO_0_CS "Konfigurace přepisu širokoúhlého zobrazení, rychlosti načítání GD-ROM a nastavení výměny textur." +#define CATEGORY_INPUT_LABEL_CS "Vstup" +#define CATEGORY_INPUT_INFO_0_CS "Konfigurace nastavení gamepadu a světelné pistole." +#define CATEGORY_EXPANSIONS_LABEL_CS NULL +#define CATEGORY_EXPANSIONS_INFO_0_CS NULL +#define CATEGORY_VMU_LABEL_CS "Jednotka Vizuální Paměti" +#define CATEGORY_VMU_INFO_0_CS "Konfigurace ukládacích souborů VMU pro jednotlivé hry a nastavení viditelnosti VMU na obrazovce." +#define CORE_OPTION_NAME_REGION_LABEL_CS NULL +#define OPTION_VAL_JAPAN_CS "Japonsko" +#define OPTION_VAL_USA_CS NULL +#define OPTION_VAL_EUROPE_CS "Evropa" +#define OPTION_VAL_DEFAULT_CS "Výchozí" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_CS "Jazyk" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CS "Změní jazyk používaný systémem BIOS a všemi hrami, které obsahují více jazyků." +#define OPTION_VAL_JAPANESE_CS "Japonština" +#define OPTION_VAL_ENGLISH_CS "Angličtina" +#define OPTION_VAL_GERMAN_CS "Němčina" +#define OPTION_VAL_FRENCH_CS "Francouzština" +#define OPTION_VAL_SPANISH_CS "Španělština" +#define OPTION_VAL_ITALIAN_CS "Italský" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CS "HLE BIOS (nutný restart)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CS "Vynucení použití vysokoúrovňové emulace systému BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CS "Nabootovat Bios (Nutný Restart)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CS "Spustit přímo do menu Dreamcast BIOS." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CS "Povolit DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CS "Umožňuje emulaci zvukového DSP (digitálního signálového procesoru) konzole Dreamcast. Zlepšuje přesnost generovaného zvuku, ale zvyšuje nároky na výkon." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CS NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CS NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CS "Nastavení her NAOMI na volné hraní" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CS "Upravte nastavení mincí ve hře na volnou hru." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CS "Emulace širokopásmového adaptéru" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CS "Místo modemu emulujte širokopásmový adaptér ethernetu. (nutný restart)" +#define CORE_OPTION_NAME_UPNP_LABEL_CS "Povolit UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_CS "Pomocí UPnP můžete automaticky nakonfigurovat svůj internetový směrovač pro online hry." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CS "Vnitřní rozlišení" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CS "Úprava Rozlišení Vykreslování." +#define OPTION_VAL_320X240_CS "320x240 (Poloviční)" +#define OPTION_VAL_640X480_CS NULL +#define OPTION_VAL_800X600_CS NULL +#define OPTION_VAL_960X720_CS NULL +#define OPTION_VAL_1024X768_CS NULL +#define OPTION_VAL_1280X960_CS NULL +#define OPTION_VAL_1440X1080_CS NULL +#define OPTION_VAL_1600X1200_CS NULL +#define OPTION_VAL_1920X1440_CS NULL +#define OPTION_VAL_2560X1920_CS NULL +#define OPTION_VAL_2880X2160_CS NULL +#define OPTION_VAL_3200X2400_CS NULL +#define OPTION_VAL_3840X2880_CS NULL +#define OPTION_VAL_4480X3360_CS NULL +#define OPTION_VAL_5120X3840_CS NULL +#define OPTION_VAL_5760X4320_CS NULL +#define OPTION_VAL_6400X4800_CS NULL +#define OPTION_VAL_7040X5280_CS NULL +#define OPTION_VAL_7680X5760_CS NULL +#define OPTION_VAL_8320X6240_CS NULL +#define OPTION_VAL_8960X6720_CS NULL +#define OPTION_VAL_9600X7200_CS NULL +#define OPTION_VAL_10240X7680_CS NULL +#define OPTION_VAL_10880X8160_CS NULL +#define OPTION_VAL_11520X8640_CS NULL +#define OPTION_VAL_12160X9120_CS NULL +#define OPTION_VAL_12800X9600_CS NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CS "Typ Kabelu" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CS "Typ výstupního signálu. Nejvíce podporovaný je 'TV (Kompozitní)'." +#define OPTION_VAL_VGA_CS NULL +#define OPTION_VAL_TV_RGB_CS NULL +#define OPTION_VAL_TV_COMPOSITE_CS "TV (Kompozitní)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_CS "Standardní Vysílání" +#define OPTION_VAL_NTSC_CS NULL +#define OPTION_VAL_PAL_CS "PAL (Svět)" +#define OPTION_VAL_PAL_N_CS NULL +#define OPTION_VAL_PAL_M_CS "PAL-M (Brazílie)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CS "Orientace obrazovky" +#define OPTION_VAL_HORIZONTAL_CS "Horizontální" +#define OPTION_VAL_VERTICAL_CS "Vertikální" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CS "Třídění Alpha" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CS NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CS "Per-Strip (rychlé, nejméně přesné)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_CS "Per-Triangle (normální)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_CS "Per-Pixel (přesné, ale nejpomalejší)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CS "Velikost akumulační vyrovnávací paměti pixelů" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CS "Pro správný výstup ve vyšších rozlišeních mohou být nutné vyšší hodnoty." +#define OPTION_VAL_512MB_CS NULL +#define OPTION_VAL_1GB_CS NULL +#define OPTION_VAL_2GB_CS NULL +#define OPTION_VAL_4GB_CS NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CS "Maximální počet průhledných vrstev" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CS "U složitých scén mohou být nutné vyšší hodnoty." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CS "Úplná emulace framebufferu" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CS "Povolení úplné emulace framebufferu v paměti VRAM. To je užitečné pro hry, které přímo čtou nebo zapisují framebuffer do VRAM. Pokud je tato funkce povolena, interní rozlišení je vynuceno na 640x480 a může dojít k výraznému snížení výkonu." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CS "Povolení Vyrovnávací Paměti RTT (Render To Texture)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CS "Kopírování vykreslených textur z GPU zpět do VRAM. Tato možnost je obvykle povolena u her, které ji vyžadují. Pokud je povolena, je vypnuto zvyšování rozlišení vykreslovaných textur a může dojít ke snížení výkonu." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CS "Mipmapování" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_CS NULL +#define CORE_OPTION_NAME_FOG_LABEL_CS "Efekty Mlhy" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CS "Modifikátor Hlasitosti" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CS "Funkce grafického procesoru Dreamcast, která se obvykle používá ve hrách ke kreslení stínů objektů. Tato funkce by měla být normálně povolena - dopad na výkon je obvykle minimální až zanedbatelný." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CS "Anizotropní Filtrování" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CS "Vylepšete kvalitu textur na površích, které jsou vůči kameře pod šikmým úhlem pohledu. Vyšší hodnoty jsou náročnější na grafický procesor. Změny tohoto nastavení se uplatní až po restartu." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CS "Filtrování textur" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CS "Režim filtrování textur, který se má použít. Tento parametr lze použít k vynucení určitého režimu filtrování textur na všech texturách, abyste dosáhli ostřejšího (nebo hladšího) vzhledu než ve výchozím nastavení. Jiné hodnoty než výchozí mohou způsobit různé problémy s vykreslováním. Změny tohoto nastavení se uplatní až po restartu." +#define OPTION_VAL_1_CS "Vynucený Nearest-Neighbor" +#define OPTION_VAL_2_CS "Vynucený lineární" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CS "Výměna Zpožděných Snímků" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CS "Je užitečné vyhnout se blikajícím obrazovkám nebo poruchovým videím. Nedoporučuje se na pomalých platformách." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CS "Detekce změn snímkové frekvence" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CS "Upozornit frontend při změně interní snímkové frekvence (např. z 60 fps na 30 fps). Zlepšuje snímkovou frekvenci ve hrách, které běží s uzamčenou snímkovou frekvencí 30 fps nebo 20 fps, ale měl by být vypnut pro hry s odemčenou (nestabilní) snímkovou frekvencí (např. Ecco the Dolphin, Unreal Tournament). Poznámka: Není k dispozici, pokud je povoleno 'Automatické přeskakování snímků'." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CS "Postprocesní Filtr PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CS "Následné zpracování vykresleného obrazu pro simulaci efektů specifických pro grafický procesor PowerVR2 a analogové video signály." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CS "Vylepšení Textur (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CS "Vylepšete ručně kreslenou 2D pixelovou grafiku. Mělo by se používat pouze ve 2D pixelových hrách." +#define OPTION_VAL_2_O26_CS NULL +#define OPTION_VAL_4_CS NULL +#define OPTION_VAL_6_CS NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CS "Zvýšení Rozlišení Textur Max. Filtrovaná Velikost" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CS NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CS "Nativní interpolace hloubky" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CS "Pomáhá řešit problémy s poškozením textur a hloubkou na grafických procesorech AMD. V některých případech může pomoci i GPU Intel." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CS NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CS NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CS "Vykreslování Vláken" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CS "Spouští GPU a CPU v různých vláknech. Důrazně doporučujeme." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CS "Automatické Přeskočení Snímků" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CS "Automatické přeskakování snímků při pomalém běhu emulátoru. Poznámka: Toto nastavení platí pouze tehdy, když je povoleno 'Vláknové Vykreslování'." +#define OPTION_VAL_SOME_CS "Normální" +#define OPTION_VAL_MORE_CS "Maximální" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CS "Přeskočení Snímků" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CS "Nastaví počet snímků, které se mají přeskočit mezi jednotlivými zobrazenými snímky." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CS "Širokoúhlé Cheaty (Nutný Restart)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CS "Aktivuje cheaty, které umožňují zobrazení některých her v širokoúhlém formátu." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CS "Hack Širokoúhleho Obrazu" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CS "Kreslení geometrie mimo běžný poměr stran 4:3. Může způsobit grafické závady v odhalených oblastech." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CS "Rychlé Načítání GD-ROM (nepřesné)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CS "Zrychluje načítání GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CS NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CS "Povoluje 32MB RAM Mod pro Dreamcast. Může ovlivnit kompatibilitu" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CS "Podtaktování/přetaktování procesoru SH4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CS "Změňte takt hlavního procesoru SH4 z výchozích 200 MHz. Podtaktování může pomoci pomalým platformám. Přetaktování může u některých her zvýšit snímkovou frekvenci. Používejte s opatrností." +#define OPTION_VAL_100_CS NULL +#define OPTION_VAL_110_CS NULL +#define OPTION_VAL_120_CS NULL +#define OPTION_VAL_130_CS NULL +#define OPTION_VAL_140_CS NULL +#define OPTION_VAL_150_CS NULL +#define OPTION_VAL_160_CS NULL +#define OPTION_VAL_170_CS NULL +#define OPTION_VAL_180_CS NULL +#define OPTION_VAL_190_CS NULL +#define OPTION_VAL_200_CS NULL +#define OPTION_VAL_210_CS NULL +#define OPTION_VAL_220_CS NULL +#define OPTION_VAL_230_CS NULL +#define OPTION_VAL_240_CS NULL +#define OPTION_VAL_250_CS NULL +#define OPTION_VAL_260_CS NULL +#define OPTION_VAL_270_CS NULL +#define OPTION_VAL_280_CS NULL +#define OPTION_VAL_290_CS NULL +#define OPTION_VAL_300_CS NULL +#define OPTION_VAL_310_CS NULL +#define OPTION_VAL_320_CS NULL +#define OPTION_VAL_330_CS NULL +#define OPTION_VAL_340_CS NULL +#define OPTION_VAL_350_CS NULL +#define OPTION_VAL_360_CS NULL +#define OPTION_VAL_370_CS NULL +#define OPTION_VAL_380_CS NULL +#define OPTION_VAL_390_CS NULL +#define OPTION_VAL_400_CS NULL +#define OPTION_VAL_410_CS NULL +#define OPTION_VAL_420_CS NULL +#define OPTION_VAL_430_CS NULL +#define OPTION_VAL_440_CS NULL +#define OPTION_VAL_450_CS NULL +#define OPTION_VAL_460_CS NULL +#define OPTION_VAL_470_CS NULL +#define OPTION_VAL_480_CS NULL +#define OPTION_VAL_490_CS NULL +#define OPTION_VAL_500_CS NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CS "Načíst Vlastní Textury" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CS NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CS "Skladiště Textur" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CS NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CS "Analogova Páčka Mrtvé Zóny" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CS NULL +#define OPTION_VAL_0_CS NULL +#define OPTION_VAL_5_CS NULL +#define OPTION_VAL_10_CS NULL +#define OPTION_VAL_15_CS NULL +#define OPTION_VAL_20_CS NULL +#define OPTION_VAL_25_CS NULL +#define OPTION_VAL_30_CS NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CS "Spouštěč Mrtvé Zóny" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CS NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CS "Digitální Spouštěče" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CS NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CS "Digitální výstupy pro vysílání" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CS "Vysílání digitálních výstupů a stavu vynucene zpětné vazby na portu TCP 8000. Kompatibilní s volbou MAME \"-výstupní síť\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CS "Zobrazit Nastavení Světelné Pistole" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CS "Povolení konfigurace možností zobrazení zaměřovacího kříže světelné pistole. POZNÁMKA: Aby se toto nastavení projevilo, může být nutné přepnout rychlou nabídku." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CS "Měřítko velikosti zaměřovacího kříže zbraně" +#define OPTION_VAL_50_CS NULL +#define OPTION_VAL_60_CS NULL +#define OPTION_VAL_70_CS NULL +#define OPTION_VAL_80_CS NULL +#define OPTION_VAL_90_CS NULL +#define OPTION_VAL_100_O45_CS NULL +#define OPTION_VAL_110_O45_CS NULL +#define OPTION_VAL_120_O45_CS NULL +#define OPTION_VAL_130_O45_CS NULL +#define OPTION_VAL_140_O45_CS NULL +#define OPTION_VAL_150_O45_CS NULL +#define OPTION_VAL_160_O45_CS NULL +#define OPTION_VAL_170_O45_CS NULL +#define OPTION_VAL_180_O45_CS NULL +#define OPTION_VAL_190_O45_CS NULL +#define OPTION_VAL_200_O45_CS NULL +#define OPTION_VAL_210_O45_CS NULL +#define OPTION_VAL_220_O45_CS NULL +#define OPTION_VAL_230_O45_CS NULL +#define OPTION_VAL_240_O45_CS NULL +#define OPTION_VAL_250_O45_CS NULL +#define OPTION_VAL_260_O45_CS NULL +#define OPTION_VAL_270_O45_CS NULL +#define OPTION_VAL_280_O45_CS NULL +#define OPTION_VAL_290_O45_CS NULL +#define OPTION_VAL_300_O45_CS NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 1" +#define OPTION_VAL_WHITE_CS "Bílá" +#define OPTION_VAL_RED_CS "Červený" +#define OPTION_VAL_GREEN_CS "Zelený" +#define OPTION_VAL_BLUE_CS "Modrý" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CS "Zobrazení Kříže Zbraně 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CS NULL +#define OPTION_VAL_VMU_CS NULL +#define OPTION_VAL_PURUPURU_CS NULL +#define OPTION_VAL_NONE_CS "Žádné" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CS NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CS NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CS "Vizuální Paměťové Jednotky/Systémy pro Jednotlivé Hry (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CS "VMUs Na-Hru" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CS NULL +#define OPTION_VAL_VMU_A1_CS NULL +#define OPTION_VAL_ALL_VMUS_CS NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CS "Vizuální paměťové jednotky/systémy (VMU) Zvuky" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CS "Zvuky VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CS "Pokud je tato funkce povolena, přehrávají se zvukové signály VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CS "Zobrazit Nastavení Displeje Vizuální Paměťové Jednotky/Systému (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CS "Zobrazit Nastavení VMU Displeje" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CS "Umožňuje konfiguraci viditelnosti, velikosti, polohy a barvy obrazovky LCD emulovaného VMU. POZNÁMKA: Může být nutné přepnout Rychlé Menu, aby se toto nastavení projevilo." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 1" +#define OPTION_VAL_UPPER_LEFT_CS "Vlevo Nahoře" +#define OPTION_VAL_UPPER_RIGHT_CS "Vpravo Nahoře" +#define OPTION_VAL_LOWER_LEFT_CS "Vlevo Dole" +#define OPTION_VAL_LOWER_RIGHT_CS "Vpravo Dole" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 1" +#define OPTION_VAL_1X_CS NULL +#define OPTION_VAL_3X_CS NULL +#define OPTION_VAL_5X_CS NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 1" +#define OPTION_VAL_DEFAULT_ON_00_CS "Výchozí ON" +#define OPTION_VAL_DEFAULT_OFF_01_CS "Výchozí OFF" +#define OPTION_VAL_BLACK_02_CS "Černá" +#define OPTION_VAL_LIGHT_BLUE_04_CS "Světle Modrá" +#define OPTION_VAL_CYAN_06_CS "Azurová" +#define OPTION_VAL_CYAN_BLUE_07_CS "Azurově Modrá" +#define OPTION_VAL_LIGHT_GREEN_08_CS "Světle Zelená" +#define OPTION_VAL_CYAN_GREEN_09_CS "Azurově Zelená" +#define OPTION_VAL_LIGHT_CYAN_10_CS "Světle Azurová" +#define OPTION_VAL_PURPLE_12_CS "Fialová" +#define OPTION_VAL_LIGHT_PURPLE_13_CS "Světle Fialová" +#define OPTION_VAL_YELLOW_14_CS "Žlutá" +#define OPTION_VAL_GRAY_15_CS "Šedá" +#define OPTION_VAL_LIGHT_PURPLE_2_16_CS "Světle Fialová (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_CS "Světle Zelená (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_CS "Světle Zelená (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_CS "Světle Azurová (2)" +#define OPTION_VAL_LIGHT_RED_2_20_CS "Světle Červená (2)" +#define OPTION_VAL_MAGENTA_21_CS "Purpurová" +#define OPTION_VAL_LIGHT_PURPLE_3_22_CS "Světle Fialová (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_CS "Světle Oranžová" +#define OPTION_VAL_ORANGE_24_CS "Oranžová" +#define OPTION_VAL_LIGHT_PURPLE_4_25_CS "Světle Fialová (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_CS "Světle Žlutá" +#define OPTION_VAL_LIGHT_YELLOW_2_27_CS "Světle Žlutá (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 1" +#define OPTION_VAL_40_CS NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CS "Displej Obrazovky VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CS "Pozice Obrazovky VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CS "Velikost Obrazovky VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CS "Zapnout Barvu Pixelu Obrazovky VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CS "Vypnout Barvu Pixelu Obrazovky VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CS "Průhlednost Obrazovky VMU 4" + +struct retro_core_option_v2_category option_cats_cs[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CS, + CATEGORY_SYSTEM_INFO_0_CS }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_CY, - NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CY, - NULL, "video", - { - { "VGA", OPTION_VAL_VGA_CY }, - { "TV (RGB)", OPTION_VAL_TV_RGB_CY }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CY }, - { NULL, NULL }, - }, - "TV (Composite)", + CATEGORY_VIDEO_LABEL_CS, + CATEGORY_VIDEO_INFO_0_CS }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_CY, - NULL, - "", - NULL, - "video", - { - { "NTSC", OPTION_VAL_NTSC_CY }, - { "PAL", OPTION_VAL_PAL_CY }, - { "PAL_N", OPTION_VAL_PAL_N_CY }, - { "PAL_M", OPTION_VAL_PAL_M_CY }, - { "Default", OPTION_VAL_DEFAULT_CY }, - { NULL, NULL }, - }, - "NTSC", + "performance", + CATEGORY_PERFORMANCE_LABEL_CS, + CATEGORY_PERFORMANCE_INFO_0_CS }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CY, - NULL, - "", - NULL, - "video", - { - { "horizontal", OPTION_VAL_HORIZONTAL_CY }, - { "vertical", OPTION_VAL_VERTICAL_CY }, - { NULL, NULL }, - }, - "horizontal", + "hacks", + CATEGORY_HACKS_LABEL_CS, + CATEGORY_HACKS_INFO_0_CS }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CY, - NULL, - "", - NULL, - "video", - { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CY }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CY }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CY }, -#endif - { NULL, NULL }, - }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + { + "input", + CATEGORY_INPUT_LABEL_CS, + CATEGORY_INPUT_INFO_0_CS }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CY, + "expansions", + CATEGORY_EXPANSIONS_LABEL_CS, + CATEGORY_EXPANSIONS_INFO_0_CS + }, + { + "vmu", + CATEGORY_VMU_LABEL_CS, + CATEGORY_VMU_INFO_0_CS + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_cs[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_CS, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CY, + "", NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_CY }, - { "1GB", OPTION_VAL_1GB_CY }, - { "2GB", OPTION_VAL_2GB_CY }, - { "4GB", OPTION_VAL_4GB_CY }, + { "Japan", OPTION_VAL_JAPAN_CS }, + { "USA", OPTION_VAL_USA_CS }, + { "Europe", OPTION_VAL_EUROPE_CS }, + { "Default", OPTION_VAL_DEFAULT_CS }, { NULL, NULL }, }, - "512MB", + "USA", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_CY, + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_CS, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CY, + CORE_OPTION_NAME_LANGUAGE_INFO_0_CS, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "Japanese", OPTION_VAL_JAPANESE_CS }, + { "English", OPTION_VAL_ENGLISH_CS }, + { "German", OPTION_VAL_GERMAN_CS }, + { "French", OPTION_VAL_FRENCH_CS }, + { "Spanish", OPTION_VAL_SPANISH_CS }, + { "Italian", OPTION_VAL_ITALIAN_CS }, + { "Default", OPTION_VAL_DEFAULT_CS }, { NULL, NULL }, }, - "32", + "English", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CY, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_CS, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CY, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_CS, NULL, - "video", + "system", { - { "disabled", NULL }, + { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { NULL, NULL}, }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CY, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CS, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CY, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CS, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -13290,41 +14581,45 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_CY, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CS, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END + "disabled", +#else "enabled", +#endif }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_CY, + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CS, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CY, + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CS, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CY, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CS, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -13333,56 +14628,301 @@ struct retro_core_option_v2_definition option_defs_cy[] = { "enabled", }, { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CY, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_CS, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CY, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CS, NULL, - "video", + "system", { - { "off", "disabled" }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "4", + "disabled", }, { - CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CY, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_CS, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CY, + CORE_OPTION_NAME_UPNP_INFO_0_CS, NULL, - "video", + "system", { - { "0", OPTION_VAL_DEFAULT_CY }, - { "1", OPTION_VAL_1_CY }, - { "2", OPTION_VAL_2_CY }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "0", + "enabled", }, + { - CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CY, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CS, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CY, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CS, NULL, "video", { - { "disabled", NULL }, + { "320x240", OPTION_VAL_320X240_CS }, + { "640x480", OPTION_VAL_640X480_CS }, + { "800x600", OPTION_VAL_800X600_CS }, + { "960x720", OPTION_VAL_960X720_CS }, + { "1024x768", OPTION_VAL_1024X768_CS }, + { "1280x960", OPTION_VAL_1280X960_CS }, + { "1440x1080", OPTION_VAL_1440X1080_CS }, + { "1600x1200", OPTION_VAL_1600X1200_CS }, + { "1920x1440", OPTION_VAL_1920X1440_CS }, + { "2560x1920", OPTION_VAL_2560X1920_CS }, + { "2880x2160", OPTION_VAL_2880X2160_CS }, + { "3200x2400", OPTION_VAL_3200X2400_CS }, + { "3840x2880", OPTION_VAL_3840X2880_CS }, + { "4480x3360", OPTION_VAL_4480X3360_CS }, + { "5120x3840", OPTION_VAL_5120X3840_CS }, + { "5760x4320", OPTION_VAL_5760X4320_CS }, + { "6400x4800", OPTION_VAL_6400X4800_CS }, + { "7040x5280", OPTION_VAL_7040X5280_CS }, + { "7680x5760", OPTION_VAL_7680X5760_CS }, + { "8320x6240", OPTION_VAL_8320X6240_CS }, + { "8960x6720", OPTION_VAL_8960X6720_CS }, + { "9600x7200", OPTION_VAL_9600X7200_CS }, + { "10240x7680", OPTION_VAL_10240X7680_CS }, + { "10880x8160", OPTION_VAL_10880X8160_CS }, + { "11520x8640", OPTION_VAL_11520X8640_CS }, + { "12160x9120", OPTION_VAL_12160X9120_CS }, + { "12800x9600", OPTION_VAL_12800X9600_CS }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_CS, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CS, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_CS }, + { "TV (RGB)", OPTION_VAL_TV_RGB_CS }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CS }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_CS, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_CS }, + { "PAL", OPTION_VAL_PAL_CS }, + { "PAL_N", OPTION_VAL_PAL_N_CS }, + { "PAL_M", OPTION_VAL_PAL_M_CS }, + { "Default", OPTION_VAL_DEFAULT_CS }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CS, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_CS }, + { "vertical", OPTION_VAL_VERTICAL_CS }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CS, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CS, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CS }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CS }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CS }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CS, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CS, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_CS }, + { "1GB", OPTION_VAL_1GB_CS }, + { "2GB", OPTION_VAL_2GB_CS }, + { "4GB", OPTION_VAL_4GB_CS }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_CS, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CS, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CS, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, "disabled", }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CS, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_CS, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_CS, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CS, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CS, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CS, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CS, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CS, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_CS }, + { "1", OPTION_VAL_1_CS }, + { "2", OPTION_VAL_2_CS }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CS, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CY, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CS, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CY, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CS, NULL, "video", { @@ -13394,9 +14934,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CY, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CS, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CY, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CS, NULL, "video", { @@ -13409,25 +14949,25 @@ struct retro_core_option_v2_definition option_defs_cy[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_CY, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_CS, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CY, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CS, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_CY }, - { "4", OPTION_VAL_4_CY }, - { "6", OPTION_VAL_6_CY }, + { "2", OPTION_VAL_2_O26_CS }, + { "4", OPTION_VAL_4_CS }, + { "6", OPTION_VAL_6_CS }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CY, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CS, NULL, "video", { @@ -13441,9 +14981,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CY, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CS, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CY, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CS, NULL, "video", { @@ -13453,11 +14993,25 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CS, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CS, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CY, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CS, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CY, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CS, NULL, "performance", { @@ -13469,15 +15023,15 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CY, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CS, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CY, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CS, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_CY }, - { "more", OPTION_VAL_MORE_CY }, + { "some", OPTION_VAL_SOME_CS }, + { "more", OPTION_VAL_MORE_CS }, { NULL, NULL }, }, #ifdef LOW_END @@ -13488,9 +15042,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CY, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CS, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CY, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CS, NULL, "performance", { @@ -13507,9 +15061,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CY, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CS, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CY, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CS, NULL, "hacks", { @@ -13521,9 +15075,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CY, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CS, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CY, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CS, NULL, "hacks", { @@ -13535,9 +15089,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CY, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CS, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CY, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CS, NULL, "hacks", { @@ -13551,64 +15105,78 @@ struct retro_core_option_v2_definition option_defs_cy[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CS, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CS, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_CY, + CORE_OPTION_NAME_SH4CLOCK_LABEL_CS, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_CY, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_CS, NULL, "hacks", { - { "100", OPTION_VAL_100_CY }, - { "110", OPTION_VAL_110_CY }, - { "120", OPTION_VAL_120_CY }, - { "130", OPTION_VAL_130_CY }, - { "140", OPTION_VAL_140_CY }, - { "150", OPTION_VAL_150_CY }, - { "160", OPTION_VAL_160_CY }, - { "170", OPTION_VAL_170_CY }, - { "180", OPTION_VAL_180_CY }, - { "190", OPTION_VAL_190_CY }, - { "200", OPTION_VAL_200_CY }, - { "210", OPTION_VAL_210_CY }, - { "220", OPTION_VAL_220_CY }, - { "230", OPTION_VAL_230_CY }, - { "240", OPTION_VAL_240_CY }, - { "250", OPTION_VAL_250_CY }, - { "260", OPTION_VAL_260_CY }, - { "270", OPTION_VAL_270_CY }, - { "280", OPTION_VAL_280_CY }, - { "290", OPTION_VAL_290_CY }, - { "300", OPTION_VAL_300_CY }, - { "310", OPTION_VAL_310_CY }, - { "320", OPTION_VAL_320_CY }, - { "330", OPTION_VAL_330_CY }, - { "340", OPTION_VAL_340_CY }, - { "350", OPTION_VAL_350_CY }, - { "360", OPTION_VAL_360_CY }, - { "370", OPTION_VAL_370_CY }, - { "380", OPTION_VAL_380_CY }, - { "390", OPTION_VAL_390_CY }, - { "400", OPTION_VAL_400_CY }, - { "410", OPTION_VAL_410_CY }, - { "420", OPTION_VAL_420_CY }, - { "430", OPTION_VAL_430_CY }, - { "440", OPTION_VAL_440_CY }, - { "450", OPTION_VAL_450_CY }, - { "460", OPTION_VAL_460_CY }, - { "470", OPTION_VAL_470_CY }, - { "480", OPTION_VAL_480_CY }, - { "490", OPTION_VAL_490_CY }, - { "500", OPTION_VAL_500_CY }, + { "100", OPTION_VAL_100_CS }, + { "110", OPTION_VAL_110_CS }, + { "120", OPTION_VAL_120_CS }, + { "130", OPTION_VAL_130_CS }, + { "140", OPTION_VAL_140_CS }, + { "150", OPTION_VAL_150_CS }, + { "160", OPTION_VAL_160_CS }, + { "170", OPTION_VAL_170_CS }, + { "180", OPTION_VAL_180_CS }, + { "190", OPTION_VAL_190_CS }, + { "200", OPTION_VAL_200_CS }, + { "210", OPTION_VAL_210_CS }, + { "220", OPTION_VAL_220_CS }, + { "230", OPTION_VAL_230_CS }, + { "240", OPTION_VAL_240_CS }, + { "250", OPTION_VAL_250_CS }, + { "260", OPTION_VAL_260_CS }, + { "270", OPTION_VAL_270_CS }, + { "280", OPTION_VAL_280_CS }, + { "290", OPTION_VAL_290_CS }, + { "300", OPTION_VAL_300_CS }, + { "310", OPTION_VAL_310_CS }, + { "320", OPTION_VAL_320_CS }, + { "330", OPTION_VAL_330_CS }, + { "340", OPTION_VAL_340_CS }, + { "350", OPTION_VAL_350_CS }, + { "360", OPTION_VAL_360_CS }, + { "370", OPTION_VAL_370_CS }, + { "380", OPTION_VAL_380_CS }, + { "390", OPTION_VAL_390_CS }, + { "400", OPTION_VAL_400_CS }, + { "410", OPTION_VAL_410_CS }, + { "420", OPTION_VAL_420_CS }, + { "430", OPTION_VAL_430_CS }, + { "440", OPTION_VAL_440_CS }, + { "450", OPTION_VAL_450_CS }, + { "460", OPTION_VAL_460_CS }, + { "470", OPTION_VAL_470_CS }, + { "480", OPTION_VAL_480_CS }, + { "490", OPTION_VAL_490_CS }, + { "500", OPTION_VAL_500_CS }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CY, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CS, NULL, "hacks", { @@ -13618,11 +15186,11 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CY, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CS, NULL, "hacks", { @@ -13634,47 +15202,47 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CY, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CS, NULL, "input", { - { "0%", OPTION_VAL_0_CY }, - { "5%", OPTION_VAL_5_CY }, - { "10%", OPTION_VAL_10_CY }, - { "15%", OPTION_VAL_15_CY }, - { "20%", OPTION_VAL_20_CY }, - { "25%", OPTION_VAL_25_CY }, - { "30%", OPTION_VAL_30_CY }, + { "0%", OPTION_VAL_0_CS }, + { "5%", OPTION_VAL_5_CS }, + { "10%", OPTION_VAL_10_CS }, + { "15%", OPTION_VAL_15_CS }, + { "20%", OPTION_VAL_20_CS }, + { "25%", OPTION_VAL_25_CS }, + { "30%", OPTION_VAL_30_CS }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CY, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CS, NULL, "input", { - { "0%", OPTION_VAL_0_CY }, - { "5%", OPTION_VAL_5_CY }, - { "10%", OPTION_VAL_10_CY }, - { "15%", OPTION_VAL_15_CY }, - { "20%", OPTION_VAL_20_CY }, - { "25%", OPTION_VAL_25_CY }, - { "30%", OPTION_VAL_30_CY }, + { "0%", OPTION_VAL_0_CS }, + { "5%", OPTION_VAL_5_CS }, + { "10%", OPTION_VAL_10_CS }, + { "15%", OPTION_VAL_15_CS }, + { "20%", OPTION_VAL_20_CS }, + { "25%", OPTION_VAL_25_CS }, + { "30%", OPTION_VAL_30_CS }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CY, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CS, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CS, NULL, "input", { @@ -13685,10 +15253,10 @@ struct retro_core_option_v2_definition option_defs_cy[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_CY, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CS, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_CY, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CS, NULL, "input", { @@ -13696,124 +15264,268 @@ struct retro_core_option_v2_definition option_defs_cy[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CY, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CS, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CY, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CS, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CY, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CS, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CY, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_CS }, + { "60%", OPTION_VAL_60_CS }, + { "70%", OPTION_VAL_70_CS }, + { "80%", OPTION_VAL_80_CS }, + { "90%", OPTION_VAL_90_CS }, + { "100%", OPTION_VAL_100_O45_CS }, + { "110%", OPTION_VAL_110_O45_CS }, + { "120%", OPTION_VAL_120_O45_CS }, + { "130%", OPTION_VAL_130_O45_CS }, + { "140%", OPTION_VAL_140_O45_CS }, + { "150%", OPTION_VAL_150_O45_CS }, + { "160%", OPTION_VAL_160_O45_CS }, + { "170%", OPTION_VAL_170_O45_CS }, + { "180%", OPTION_VAL_180_O45_CS }, + { "190%", OPTION_VAL_190_O45_CS }, + { "200%", OPTION_VAL_200_O45_CS }, + { "210%", OPTION_VAL_210_O45_CS }, + { "220%", OPTION_VAL_220_O45_CS }, + { "230%", OPTION_VAL_230_O45_CS }, + { "240%", OPTION_VAL_240_O45_CS }, + { "250%", OPTION_VAL_250_O45_CS }, + { "260%", OPTION_VAL_260_O45_CS }, + { "270%", OPTION_VAL_270_O45_CS }, + { "280%", OPTION_VAL_280_O45_CS }, + { "290%", OPTION_VAL_290_O45_CS }, + { "300%", OPTION_VAL_300_O45_CS }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CY, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CY }, - { "Red", OPTION_VAL_RED_CY }, - { "Green", OPTION_VAL_GREEN_CY }, - { "Blue", OPTION_VAL_BLUE_CY }, + { "White", OPTION_VAL_WHITE_CS }, + { "Red", OPTION_VAL_RED_CS }, + { "Green", OPTION_VAL_GREEN_CS }, + { "Blue", OPTION_VAL_BLUE_CS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CY, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CY }, - { "Red", OPTION_VAL_RED_CY }, - { "Green", OPTION_VAL_GREEN_CY }, - { "Blue", OPTION_VAL_BLUE_CY }, + { "White", OPTION_VAL_WHITE_CS }, + { "Red", OPTION_VAL_RED_CS }, + { "Green", OPTION_VAL_GREEN_CS }, + { "Blue", OPTION_VAL_BLUE_CS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CY, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CY }, - { "Red", OPTION_VAL_RED_CY }, - { "Green", OPTION_VAL_GREEN_CY }, - { "Blue", OPTION_VAL_BLUE_CY }, + { "White", OPTION_VAL_WHITE_CS }, + { "Red", OPTION_VAL_RED_CS }, + { "Green", OPTION_VAL_GREEN_CS }, + { "Blue", OPTION_VAL_BLUE_CS }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CY, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CS, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_CY }, - { "Red", OPTION_VAL_RED_CY }, - { "Green", OPTION_VAL_GREEN_CY }, - { "Blue", OPTION_VAL_BLUE_CY }, + { "White", OPTION_VAL_WHITE_CS }, + { "Red", OPTION_VAL_RED_CS }, + { "Green", OPTION_VAL_GREEN_CS }, + { "Blue", OPTION_VAL_BLUE_CS }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CS, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CS, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_CS }, + { "Purupuru", OPTION_VAL_PURUPURU_CS }, + { "None", OPTION_VAL_NONE_CS }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CY, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CY, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CY, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CS, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CS, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CS, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_CY }, - { "All VMUs", OPTION_VAL_ALL_VMUS_CY }, + { "VMU A1", OPTION_VAL_VMU_A1_CS }, + { "All VMUs", OPTION_VAL_ALL_VMUS_CS }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_CY, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CY, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_CY, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CS, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CS, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_CS, NULL, "vmu", { @@ -13824,9 +15536,9 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CY, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CY, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CY, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CS, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CS, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CS, NULL, "vmu", { @@ -13838,7 +15550,7 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CY, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CS, NULL, "", NULL, @@ -13852,144 +15564,144 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CY, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CY, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CY }, - { "2x", OPTION_VAL_2_O27_CY }, - { "3x", OPTION_VAL_3X_CY }, - { "4x", OPTION_VAL_4_CY }, - { "5x", OPTION_VAL_5X_CY }, + { "1x", OPTION_VAL_1X_CS }, + { "2x", OPTION_VAL_2_O26_CS }, + { "3x", OPTION_VAL_3X_CS }, + { "4x", OPTION_VAL_4_CS }, + { "5x", OPTION_VAL_5X_CS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CY, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CY }, - { "20%", OPTION_VAL_20_CY }, - { "30%", OPTION_VAL_30_CY }, - { "40%", OPTION_VAL_40_CY }, - { "50%", OPTION_VAL_50_CY }, - { "60%", OPTION_VAL_60_CY }, - { "70%", OPTION_VAL_70_CY }, - { "80%", OPTION_VAL_80_CY }, - { "90%", OPTION_VAL_90_CY }, - { "100%", OPTION_VAL_100_O57_CY }, + { "10%", OPTION_VAL_10_CS }, + { "20%", OPTION_VAL_20_CS }, + { "30%", OPTION_VAL_30_CS }, + { "40%", OPTION_VAL_40_CS }, + { "50%", OPTION_VAL_50_CS }, + { "60%", OPTION_VAL_60_CS }, + { "70%", OPTION_VAL_70_CS }, + { "80%", OPTION_VAL_80_CS }, + { "90%", OPTION_VAL_90_CS }, + { "100%", OPTION_VAL_100_O45_CS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CY, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CS, NULL, "", NULL, @@ -14003,144 +15715,144 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CY, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CY, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CY }, - { "2x", OPTION_VAL_2_O27_CY }, - { "3x", OPTION_VAL_3X_CY }, - { "4x", OPTION_VAL_4_CY }, - { "5x", OPTION_VAL_5X_CY }, + { "1x", OPTION_VAL_1X_CS }, + { "2x", OPTION_VAL_2_O26_CS }, + { "3x", OPTION_VAL_3X_CS }, + { "4x", OPTION_VAL_4_CS }, + { "5x", OPTION_VAL_5X_CS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CY, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CY }, - { "20%", OPTION_VAL_20_CY }, - { "30%", OPTION_VAL_30_CY }, - { "40%", OPTION_VAL_40_CY }, - { "50%", OPTION_VAL_50_CY }, - { "60%", OPTION_VAL_60_CY }, - { "70%", OPTION_VAL_70_CY }, - { "80%", OPTION_VAL_80_CY }, - { "90%", OPTION_VAL_90_CY }, - { "100%", OPTION_VAL_100_O57_CY }, + { "10%", OPTION_VAL_10_CS }, + { "20%", OPTION_VAL_20_CS }, + { "30%", OPTION_VAL_30_CS }, + { "40%", OPTION_VAL_40_CS }, + { "50%", OPTION_VAL_50_CS }, + { "60%", OPTION_VAL_60_CS }, + { "70%", OPTION_VAL_70_CS }, + { "80%", OPTION_VAL_80_CS }, + { "90%", OPTION_VAL_90_CS }, + { "100%", OPTION_VAL_100_O45_CS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CY, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CS, NULL, "", NULL, @@ -14154,144 +15866,144 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CY, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CY, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CY }, - { "2x", OPTION_VAL_2_O27_CY }, - { "3x", OPTION_VAL_3X_CY }, - { "4x", OPTION_VAL_4_CY }, - { "5x", OPTION_VAL_5X_CY }, + { "1x", OPTION_VAL_1X_CS }, + { "2x", OPTION_VAL_2_O26_CS }, + { "3x", OPTION_VAL_3X_CS }, + { "4x", OPTION_VAL_4_CS }, + { "5x", OPTION_VAL_5X_CS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CY, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CY }, - { "20%", OPTION_VAL_20_CY }, - { "30%", OPTION_VAL_30_CY }, - { "40%", OPTION_VAL_40_CY }, - { "50%", OPTION_VAL_50_CY }, - { "60%", OPTION_VAL_60_CY }, - { "70%", OPTION_VAL_70_CY }, - { "80%", OPTION_VAL_80_CY }, - { "90%", OPTION_VAL_90_CY }, - { "100%", OPTION_VAL_100_O57_CY }, + { "10%", OPTION_VAL_10_CS }, + { "20%", OPTION_VAL_20_CS }, + { "30%", OPTION_VAL_30_CS }, + { "40%", OPTION_VAL_40_CS }, + { "50%", OPTION_VAL_50_CS }, + { "60%", OPTION_VAL_60_CS }, + { "70%", OPTION_VAL_70_CS }, + { "80%", OPTION_VAL_80_CS }, + { "90%", OPTION_VAL_90_CS }, + { "100%", OPTION_VAL_100_O45_CS }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CY, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CS, NULL, "", NULL, @@ -14305,505 +16017,560 @@ struct retro_core_option_v2_definition option_defs_cy[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CY, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CS, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CS }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CS }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CS }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CS }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CY, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CS, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_CY }, - { "2x", OPTION_VAL_2_O27_CY }, - { "3x", OPTION_VAL_3X_CY }, - { "4x", OPTION_VAL_4_CY }, - { "5x", OPTION_VAL_5X_CY }, + { "1x", OPTION_VAL_1X_CS }, + { "2x", OPTION_VAL_2_O26_CS }, + { "3x", OPTION_VAL_3X_CS }, + { "4x", OPTION_VAL_4_CS }, + { "5x", OPTION_VAL_5X_CS }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CY, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CS, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, - { "BLACK 02", OPTION_VAL_BLACK_02_CY }, - { "BLUE 03", OPTION_VAL_BLUE_CY }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, - { "GREEN 05", OPTION_VAL_GREEN_CY }, - { "CYAN 06", OPTION_VAL_CYAN_06_CY }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, - { "RED 11", OPTION_VAL_RED_CY }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, - { "GRAY 15", OPTION_VAL_GRAY_15_CY }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, - { "WHITE 28", OPTION_VAL_WHITE_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CS }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CS }, + { "BLACK 02", OPTION_VAL_BLACK_02_CS }, + { "BLUE 03", OPTION_VAL_BLUE_CS }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CS }, + { "GREEN 05", OPTION_VAL_GREEN_CS }, + { "CYAN 06", OPTION_VAL_CYAN_06_CS }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CS }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CS }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CS }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CS }, + { "RED 11", OPTION_VAL_RED_CS }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CS }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CS }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CS }, + { "GRAY 15", OPTION_VAL_GRAY_15_CS }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CS }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CS }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CS }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CS }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CS }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CS }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CS }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CS }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CS }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CS }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CS }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CS }, + { "WHITE 28", OPTION_VAL_WHITE_CS }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CY, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CS, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_CY }, - { "20%", OPTION_VAL_20_CY }, - { "30%", OPTION_VAL_30_CY }, - { "40%", OPTION_VAL_40_CY }, - { "50%", OPTION_VAL_50_CY }, - { "60%", OPTION_VAL_60_CY }, - { "70%", OPTION_VAL_70_CY }, - { "80%", OPTION_VAL_80_CY }, - { "90%", OPTION_VAL_90_CY }, - { "100%", OPTION_VAL_100_O57_CY }, + { "10%", OPTION_VAL_10_CS }, + { "20%", OPTION_VAL_20_CS }, + { "30%", OPTION_VAL_30_CS }, + { "40%", OPTION_VAL_40_CS }, + { "50%", OPTION_VAL_50_CS }, + { "60%", OPTION_VAL_60_CS }, + { "70%", OPTION_VAL_70_CS }, + { "80%", OPTION_VAL_80_CS }, + { "90%", OPTION_VAL_90_CS }, + { "100%", OPTION_VAL_100_O45_CS }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_cy = { - option_cats_cy, - option_defs_cy +struct retro_core_options_v2 options_cs = { + option_cats_cs, + option_defs_cs }; -/* RETRO_LANGUAGE_DA */ - -#define CATEGORY_SYSTEM_LABEL_DA NULL -#define CATEGORY_SYSTEM_INFO_0_DA NULL -#define CATEGORY_VIDEO_LABEL_DA NULL -#define CATEGORY_VIDEO_INFO_0_DA NULL -#define CATEGORY_PERFORMANCE_LABEL_DA NULL -#define CATEGORY_PERFORMANCE_INFO_0_DA NULL -#define CATEGORY_HACKS_LABEL_DA NULL -#define CATEGORY_HACKS_INFO_0_DA NULL -#define CATEGORY_INPUT_LABEL_DA NULL -#define CATEGORY_INPUT_INFO_0_DA NULL -#define CATEGORY_VMU_LABEL_DA NULL -#define CATEGORY_VMU_INFO_0_DA NULL -#define CORE_OPTION_NAME_REGION_LABEL_DA NULL -#define OPTION_VAL_JAPAN_DA NULL -#define OPTION_VAL_USA_DA NULL -#define OPTION_VAL_EUROPE_DA NULL -#define OPTION_VAL_DEFAULT_DA NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_DA NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_DA NULL -#define OPTION_VAL_JAPANESE_DA NULL -#define OPTION_VAL_ENGLISH_DA NULL -#define OPTION_VAL_GERMAN_DA NULL -#define OPTION_VAL_FRENCH_DA NULL -#define OPTION_VAL_SPANISH_DA NULL -#define OPTION_VAL_ITALIAN_DA NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_DA NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_DA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_DA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_DA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_DA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_DA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DA NULL -#define CORE_OPTION_NAME_UPNP_LABEL_DA NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_DA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DA NULL -#define OPTION_VAL_320X240_DA NULL -#define OPTION_VAL_640X480_DA NULL -#define OPTION_VAL_800X600_DA NULL -#define OPTION_VAL_960X720_DA NULL -#define OPTION_VAL_1024X768_DA NULL -#define OPTION_VAL_1280X960_DA NULL -#define OPTION_VAL_1440X1080_DA NULL -#define OPTION_VAL_1600X1200_DA NULL -#define OPTION_VAL_1920X1440_DA NULL -#define OPTION_VAL_2560X1920_DA NULL -#define OPTION_VAL_2880X2160_DA NULL -#define OPTION_VAL_3200X2400_DA NULL -#define OPTION_VAL_3840X2880_DA NULL -#define OPTION_VAL_4480X3360_DA NULL -#define OPTION_VAL_5120X3840_DA NULL -#define OPTION_VAL_5760X4320_DA NULL -#define OPTION_VAL_6400X4800_DA NULL -#define OPTION_VAL_7040X5280_DA NULL -#define OPTION_VAL_7680X5760_DA NULL -#define OPTION_VAL_8320X6240_DA NULL -#define OPTION_VAL_8960X6720_DA NULL -#define OPTION_VAL_9600X7200_DA NULL -#define OPTION_VAL_10240X7680_DA NULL -#define OPTION_VAL_10880X8160_DA NULL -#define OPTION_VAL_11520X8640_DA NULL -#define OPTION_VAL_12160X9120_DA NULL -#define OPTION_VAL_12800X9600_DA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_DA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DA NULL -#define OPTION_VAL_VGA_DA NULL -#define OPTION_VAL_TV_RGB_DA NULL -#define OPTION_VAL_TV_COMPOSITE_DA NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_DA NULL -#define OPTION_VAL_NTSC_DA NULL -#define OPTION_VAL_PAL_DA NULL -#define OPTION_VAL_PAL_N_DA NULL -#define OPTION_VAL_PAL_M_DA NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DA NULL -#define OPTION_VAL_HORIZONTAL_DA NULL -#define OPTION_VAL_VERTICAL_DA NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DA NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DA NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_DA NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_DA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DA NULL -#define OPTION_VAL_512MB_DA NULL -#define OPTION_VAL_1GB_DA NULL -#define OPTION_VAL_2GB_DA NULL -#define OPTION_VAL_4GB_DA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_DA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DA NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_DA NULL -#define CORE_OPTION_NAME_FOG_LABEL_DA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DA NULL -#define OPTION_VAL_1_DA NULL -#define OPTION_VAL_2_DA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_DA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DA NULL -#define OPTION_VAL_2_O27_DA NULL -#define OPTION_VAL_4_DA NULL -#define OPTION_VAL_6_DA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DA NULL -#define OPTION_VAL_SOME_DA NULL -#define OPTION_VAL_MORE_DA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DA NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_DA NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_DA NULL -#define OPTION_VAL_100_DA NULL -#define OPTION_VAL_110_DA NULL -#define OPTION_VAL_120_DA NULL -#define OPTION_VAL_130_DA NULL -#define OPTION_VAL_140_DA NULL -#define OPTION_VAL_150_DA NULL -#define OPTION_VAL_160_DA NULL -#define OPTION_VAL_170_DA NULL -#define OPTION_VAL_180_DA NULL -#define OPTION_VAL_190_DA NULL -#define OPTION_VAL_200_DA NULL -#define OPTION_VAL_210_DA NULL -#define OPTION_VAL_220_DA NULL -#define OPTION_VAL_230_DA NULL -#define OPTION_VAL_240_DA NULL -#define OPTION_VAL_250_DA NULL -#define OPTION_VAL_260_DA NULL -#define OPTION_VAL_270_DA NULL -#define OPTION_VAL_280_DA NULL -#define OPTION_VAL_290_DA NULL -#define OPTION_VAL_300_DA NULL -#define OPTION_VAL_310_DA NULL -#define OPTION_VAL_320_DA NULL -#define OPTION_VAL_330_DA NULL -#define OPTION_VAL_340_DA NULL -#define OPTION_VAL_350_DA NULL -#define OPTION_VAL_360_DA NULL -#define OPTION_VAL_370_DA NULL -#define OPTION_VAL_380_DA NULL -#define OPTION_VAL_390_DA NULL -#define OPTION_VAL_400_DA NULL -#define OPTION_VAL_410_DA NULL -#define OPTION_VAL_420_DA NULL -#define OPTION_VAL_430_DA NULL -#define OPTION_VAL_440_DA NULL -#define OPTION_VAL_450_DA NULL -#define OPTION_VAL_460_DA NULL -#define OPTION_VAL_470_DA NULL -#define OPTION_VAL_480_DA NULL -#define OPTION_VAL_490_DA NULL -#define OPTION_VAL_500_DA NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DA NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DA NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DA NULL -#define OPTION_VAL_0_DA NULL -#define OPTION_VAL_5_DA NULL -#define OPTION_VAL_10_DA NULL -#define OPTION_VAL_15_DA NULL -#define OPTION_VAL_20_DA NULL -#define OPTION_VAL_25_DA NULL -#define OPTION_VAL_30_DA NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DA NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_DA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_DA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DA NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DA NULL -#define OPTION_VAL_WHITE_DA NULL -#define OPTION_VAL_RED_DA NULL -#define OPTION_VAL_GREEN_DA NULL -#define OPTION_VAL_BLUE_DA NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DA NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DA NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DA NULL -#define OPTION_VAL_VMU_A1_DA NULL -#define OPTION_VAL_ALL_VMUS_DA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DA NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_DA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DA NULL -#define OPTION_VAL_UPPER_LEFT_DA NULL -#define OPTION_VAL_UPPER_RIGHT_DA NULL -#define OPTION_VAL_LOWER_LEFT_DA NULL -#define OPTION_VAL_LOWER_RIGHT_DA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DA NULL -#define OPTION_VAL_1X_DA NULL -#define OPTION_VAL_3X_DA NULL -#define OPTION_VAL_5X_DA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DA NULL -#define OPTION_VAL_DEFAULT_ON_00_DA NULL -#define OPTION_VAL_DEFAULT_OFF_01_DA NULL -#define OPTION_VAL_BLACK_02_DA NULL -#define OPTION_VAL_LIGHT_BLUE_04_DA NULL -#define OPTION_VAL_CYAN_06_DA NULL -#define OPTION_VAL_CYAN_BLUE_07_DA NULL -#define OPTION_VAL_LIGHT_GREEN_08_DA NULL -#define OPTION_VAL_CYAN_GREEN_09_DA NULL -#define OPTION_VAL_LIGHT_CYAN_10_DA NULL -#define OPTION_VAL_PURPLE_12_DA NULL -#define OPTION_VAL_LIGHT_PURPLE_13_DA NULL -#define OPTION_VAL_YELLOW_14_DA NULL -#define OPTION_VAL_GRAY_15_DA NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_DA NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_DA NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_DA NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_DA NULL -#define OPTION_VAL_LIGHT_RED_2_20_DA NULL -#define OPTION_VAL_MAGENTA_21_DA NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_DA NULL -#define OPTION_VAL_LIGHT_ORANGE_23_DA NULL -#define OPTION_VAL_ORANGE_24_DA NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_DA NULL -#define OPTION_VAL_LIGHT_YELLOW_26_DA NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_DA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DA NULL -#define OPTION_VAL_40_DA NULL -#define OPTION_VAL_50_DA NULL -#define OPTION_VAL_60_DA NULL -#define OPTION_VAL_70_DA NULL -#define OPTION_VAL_80_DA NULL -#define OPTION_VAL_90_DA NULL -#define OPTION_VAL_100_O57_DA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DA NULL +/* RETRO_LANGUAGE_CY */ -struct retro_core_option_v2_category option_cats_da[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_DA, - CATEGORY_SYSTEM_INFO_0_DA +#define CATEGORY_SYSTEM_LABEL_CY NULL +#define CATEGORY_SYSTEM_INFO_0_CY NULL +#define CATEGORY_VIDEO_LABEL_CY NULL +#define CATEGORY_VIDEO_INFO_0_CY NULL +#define CATEGORY_PERFORMANCE_LABEL_CY NULL +#define CATEGORY_PERFORMANCE_INFO_0_CY NULL +#define CATEGORY_HACKS_LABEL_CY NULL +#define CATEGORY_HACKS_INFO_0_CY NULL +#define CATEGORY_INPUT_LABEL_CY "Mewnbwn" +#define CATEGORY_INPUT_INFO_0_CY NULL +#define CATEGORY_EXPANSIONS_LABEL_CY NULL +#define CATEGORY_EXPANSIONS_INFO_0_CY NULL +#define CATEGORY_VMU_LABEL_CY NULL +#define CATEGORY_VMU_INFO_0_CY NULL +#define CORE_OPTION_NAME_REGION_LABEL_CY NULL +#define OPTION_VAL_JAPAN_CY NULL +#define OPTION_VAL_USA_CY NULL +#define OPTION_VAL_EUROPE_CY NULL +#define OPTION_VAL_DEFAULT_CY NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_CY NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_CY NULL +#define OPTION_VAL_JAPANESE_CY NULL +#define OPTION_VAL_ENGLISH_CY NULL +#define OPTION_VAL_GERMAN_CY NULL +#define OPTION_VAL_FRENCH_CY NULL +#define OPTION_VAL_SPANISH_CY NULL +#define OPTION_VAL_ITALIAN_CY NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_CY NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_CY NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CY NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CY NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_CY NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CY NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CY NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CY NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CY NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CY NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_CY NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CY NULL +#define CORE_OPTION_NAME_UPNP_LABEL_CY NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_CY NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CY NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CY NULL +#define OPTION_VAL_320X240_CY NULL +#define OPTION_VAL_640X480_CY NULL +#define OPTION_VAL_800X600_CY NULL +#define OPTION_VAL_960X720_CY NULL +#define OPTION_VAL_1024X768_CY NULL +#define OPTION_VAL_1280X960_CY NULL +#define OPTION_VAL_1440X1080_CY NULL +#define OPTION_VAL_1600X1200_CY NULL +#define OPTION_VAL_1920X1440_CY NULL +#define OPTION_VAL_2560X1920_CY NULL +#define OPTION_VAL_2880X2160_CY NULL +#define OPTION_VAL_3200X2400_CY NULL +#define OPTION_VAL_3840X2880_CY NULL +#define OPTION_VAL_4480X3360_CY NULL +#define OPTION_VAL_5120X3840_CY NULL +#define OPTION_VAL_5760X4320_CY NULL +#define OPTION_VAL_6400X4800_CY NULL +#define OPTION_VAL_7040X5280_CY NULL +#define OPTION_VAL_7680X5760_CY NULL +#define OPTION_VAL_8320X6240_CY NULL +#define OPTION_VAL_8960X6720_CY NULL +#define OPTION_VAL_9600X7200_CY NULL +#define OPTION_VAL_10240X7680_CY NULL +#define OPTION_VAL_10880X8160_CY NULL +#define OPTION_VAL_11520X8640_CY NULL +#define OPTION_VAL_12160X9120_CY NULL +#define OPTION_VAL_12800X9600_CY NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_CY NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CY NULL +#define OPTION_VAL_VGA_CY NULL +#define OPTION_VAL_TV_RGB_CY NULL +#define OPTION_VAL_TV_COMPOSITE_CY NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_CY NULL +#define OPTION_VAL_NTSC_CY NULL +#define OPTION_VAL_PAL_CY NULL +#define OPTION_VAL_PAL_N_CY NULL +#define OPTION_VAL_PAL_M_CY NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CY NULL +#define OPTION_VAL_HORIZONTAL_CY NULL +#define OPTION_VAL_VERTICAL_CY NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CY NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CY NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CY NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_CY NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_CY NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CY NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CY NULL +#define OPTION_VAL_512MB_CY NULL +#define OPTION_VAL_1GB_CY NULL +#define OPTION_VAL_2GB_CY NULL +#define OPTION_VAL_4GB_CY NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_CY NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CY NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CY NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CY NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CY NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CY NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_CY NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_CY NULL +#define CORE_OPTION_NAME_FOG_LABEL_CY NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CY NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CY NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CY NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CY NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CY NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CY NULL +#define OPTION_VAL_1_CY NULL +#define OPTION_VAL_2_CY NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CY NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CY NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CY NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CY NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CY NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CY NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_CY NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CY NULL +#define OPTION_VAL_2_O26_CY NULL +#define OPTION_VAL_4_CY NULL +#define OPTION_VAL_6_CY NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CY NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CY NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CY NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CY NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CY NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CY NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CY NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CY NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CY NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CY NULL +#define OPTION_VAL_SOME_CY NULL +#define OPTION_VAL_MORE_CY NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CY NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CY NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CY NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CY NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CY NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CY NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CY NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CY NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CY NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CY NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_CY NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_CY NULL +#define OPTION_VAL_100_CY NULL +#define OPTION_VAL_110_CY NULL +#define OPTION_VAL_120_CY NULL +#define OPTION_VAL_130_CY NULL +#define OPTION_VAL_140_CY NULL +#define OPTION_VAL_150_CY NULL +#define OPTION_VAL_160_CY NULL +#define OPTION_VAL_170_CY NULL +#define OPTION_VAL_180_CY NULL +#define OPTION_VAL_190_CY NULL +#define OPTION_VAL_200_CY NULL +#define OPTION_VAL_210_CY NULL +#define OPTION_VAL_220_CY NULL +#define OPTION_VAL_230_CY NULL +#define OPTION_VAL_240_CY NULL +#define OPTION_VAL_250_CY NULL +#define OPTION_VAL_260_CY NULL +#define OPTION_VAL_270_CY NULL +#define OPTION_VAL_280_CY NULL +#define OPTION_VAL_290_CY NULL +#define OPTION_VAL_300_CY NULL +#define OPTION_VAL_310_CY NULL +#define OPTION_VAL_320_CY NULL +#define OPTION_VAL_330_CY NULL +#define OPTION_VAL_340_CY NULL +#define OPTION_VAL_350_CY NULL +#define OPTION_VAL_360_CY NULL +#define OPTION_VAL_370_CY NULL +#define OPTION_VAL_380_CY NULL +#define OPTION_VAL_390_CY NULL +#define OPTION_VAL_400_CY NULL +#define OPTION_VAL_410_CY NULL +#define OPTION_VAL_420_CY NULL +#define OPTION_VAL_430_CY NULL +#define OPTION_VAL_440_CY NULL +#define OPTION_VAL_450_CY NULL +#define OPTION_VAL_460_CY NULL +#define OPTION_VAL_470_CY NULL +#define OPTION_VAL_480_CY NULL +#define OPTION_VAL_490_CY NULL +#define OPTION_VAL_500_CY NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CY NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CY NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CY NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CY NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CY NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CY NULL +#define OPTION_VAL_0_CY NULL +#define OPTION_VAL_5_CY NULL +#define OPTION_VAL_10_CY NULL +#define OPTION_VAL_15_CY NULL +#define OPTION_VAL_20_CY NULL +#define OPTION_VAL_25_CY NULL +#define OPTION_VAL_30_CY NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CY NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CY NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CY NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CY NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CY NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CY NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CY NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CY NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CY NULL +#define OPTION_VAL_50_CY NULL +#define OPTION_VAL_60_CY NULL +#define OPTION_VAL_70_CY NULL +#define OPTION_VAL_80_CY NULL +#define OPTION_VAL_90_CY NULL +#define OPTION_VAL_100_O45_CY NULL +#define OPTION_VAL_110_O45_CY NULL +#define OPTION_VAL_120_O45_CY NULL +#define OPTION_VAL_130_O45_CY NULL +#define OPTION_VAL_140_O45_CY NULL +#define OPTION_VAL_150_O45_CY NULL +#define OPTION_VAL_160_O45_CY NULL +#define OPTION_VAL_170_O45_CY NULL +#define OPTION_VAL_180_O45_CY NULL +#define OPTION_VAL_190_O45_CY NULL +#define OPTION_VAL_200_O45_CY NULL +#define OPTION_VAL_210_O45_CY NULL +#define OPTION_VAL_220_O45_CY NULL +#define OPTION_VAL_230_O45_CY NULL +#define OPTION_VAL_240_O45_CY NULL +#define OPTION_VAL_250_O45_CY NULL +#define OPTION_VAL_260_O45_CY NULL +#define OPTION_VAL_270_O45_CY NULL +#define OPTION_VAL_280_O45_CY NULL +#define OPTION_VAL_290_O45_CY NULL +#define OPTION_VAL_300_O45_CY NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CY NULL +#define OPTION_VAL_WHITE_CY NULL +#define OPTION_VAL_RED_CY "Coch" +#define OPTION_VAL_GREEN_CY NULL +#define OPTION_VAL_BLUE_CY NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CY NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CY NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CY NULL +#define OPTION_VAL_VMU_CY NULL +#define OPTION_VAL_PURUPURU_CY NULL +#define OPTION_VAL_NONE_CY "Dim" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CY NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CY NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CY NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CY NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CY NULL +#define OPTION_VAL_VMU_A1_CY NULL +#define OPTION_VAL_ALL_VMUS_CY NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CY NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_CY NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CY NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CY NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CY NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CY NULL +#define OPTION_VAL_UPPER_LEFT_CY NULL +#define OPTION_VAL_UPPER_RIGHT_CY NULL +#define OPTION_VAL_LOWER_LEFT_CY NULL +#define OPTION_VAL_LOWER_RIGHT_CY NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CY NULL +#define OPTION_VAL_1X_CY NULL +#define OPTION_VAL_3X_CY NULL +#define OPTION_VAL_5X_CY NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CY NULL +#define OPTION_VAL_DEFAULT_ON_00_CY NULL +#define OPTION_VAL_DEFAULT_OFF_01_CY NULL +#define OPTION_VAL_BLACK_02_CY NULL +#define OPTION_VAL_LIGHT_BLUE_04_CY NULL +#define OPTION_VAL_CYAN_06_CY NULL +#define OPTION_VAL_CYAN_BLUE_07_CY NULL +#define OPTION_VAL_LIGHT_GREEN_08_CY NULL +#define OPTION_VAL_CYAN_GREEN_09_CY NULL +#define OPTION_VAL_LIGHT_CYAN_10_CY NULL +#define OPTION_VAL_PURPLE_12_CY NULL +#define OPTION_VAL_LIGHT_PURPLE_13_CY NULL +#define OPTION_VAL_YELLOW_14_CY NULL +#define OPTION_VAL_GRAY_15_CY NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_CY NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_CY NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_CY NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_CY NULL +#define OPTION_VAL_LIGHT_RED_2_20_CY NULL +#define OPTION_VAL_MAGENTA_21_CY NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_CY NULL +#define OPTION_VAL_LIGHT_ORANGE_23_CY NULL +#define OPTION_VAL_ORANGE_24_CY NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_CY NULL +#define OPTION_VAL_LIGHT_YELLOW_26_CY NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_CY NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CY NULL +#define OPTION_VAL_40_CY NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CY NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CY NULL + +struct retro_core_option_v2_category option_cats_cy[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_CY, + CATEGORY_SYSTEM_INFO_0_CY }, { "video", - CATEGORY_VIDEO_LABEL_DA, - CATEGORY_VIDEO_INFO_0_DA + CATEGORY_VIDEO_LABEL_CY, + CATEGORY_VIDEO_INFO_0_CY }, { "performance", - CATEGORY_PERFORMANCE_LABEL_DA, - CATEGORY_PERFORMANCE_INFO_0_DA + CATEGORY_PERFORMANCE_LABEL_CY, + CATEGORY_PERFORMANCE_INFO_0_CY }, { "hacks", - CATEGORY_HACKS_LABEL_DA, - CATEGORY_HACKS_INFO_0_DA + CATEGORY_HACKS_LABEL_CY, + CATEGORY_HACKS_INFO_0_CY }, { "input", - CATEGORY_INPUT_LABEL_DA, - CATEGORY_INPUT_INFO_0_DA + CATEGORY_INPUT_LABEL_CY, + CATEGORY_INPUT_INFO_0_CY + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_CY, + CATEGORY_EXPANSIONS_INFO_0_CY }, { "vmu", - CATEGORY_VMU_LABEL_DA, - CATEGORY_VMU_INFO_0_DA + CATEGORY_VMU_LABEL_CY, + CATEGORY_VMU_INFO_0_CY }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_da[] = { +struct retro_core_option_v2_definition option_defs_cy[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_DA, + CORE_OPTION_NAME_REGION_LABEL_CY, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_DA }, - { "USA", OPTION_VAL_USA_DA }, - { "Europe", OPTION_VAL_EUROPE_DA }, - { "Default", OPTION_VAL_DEFAULT_DA }, + { "Japan", OPTION_VAL_JAPAN_CY }, + { "USA", OPTION_VAL_USA_CY }, + { "Europe", OPTION_VAL_EUROPE_CY }, + { "Default", OPTION_VAL_DEFAULT_CY }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_DA, + CORE_OPTION_NAME_LANGUAGE_LABEL_CY, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_DA, + CORE_OPTION_NAME_LANGUAGE_INFO_0_CY, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_DA }, - { "English", OPTION_VAL_ENGLISH_DA }, - { "German", OPTION_VAL_GERMAN_DA }, - { "French", OPTION_VAL_FRENCH_DA }, - { "Spanish", OPTION_VAL_SPANISH_DA }, - { "Italian", OPTION_VAL_ITALIAN_DA }, - { "Default", OPTION_VAL_DEFAULT_DA }, + { "Japanese", OPTION_VAL_JAPANESE_CY }, + { "English", OPTION_VAL_ENGLISH_CY }, + { "German", OPTION_VAL_GERMAN_CY }, + { "French", OPTION_VAL_FRENCH_CY }, + { "Spanish", OPTION_VAL_SPANISH_CY }, + { "Italian", OPTION_VAL_ITALIAN_CY }, + { "Default", OPTION_VAL_DEFAULT_CY }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_DA, + CORE_OPTION_NAME_HLE_BIOS_LABEL_CY, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_DA, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_CY, NULL, "system", { @@ -14815,9 +16582,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DA, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_CY, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DA, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_CY, NULL, "system", { @@ -14829,9 +16596,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_DA, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_CY, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DA, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_CY, NULL, "system", { @@ -14845,25 +16612,11 @@ struct retro_core_option_v2_definition option_defs_da[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_DA, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_DA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_CY, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_CY, NULL, "system", { @@ -14875,9 +16628,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DA, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_CY, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DA, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_CY, NULL, "system", { @@ -14889,9 +16642,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_DA, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_CY, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DA, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_CY, NULL, "system", { @@ -14903,9 +16656,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_DA, + CORE_OPTION_NAME_UPNP_LABEL_CY, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_DA, + CORE_OPTION_NAME_UPNP_INFO_0_CY, NULL, "system", { @@ -14918,39 +16671,39 @@ struct retro_core_option_v2_definition option_defs_da[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_CY, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_CY, NULL, "video", { - { "320x240", OPTION_VAL_320X240_DA }, - { "640x480", OPTION_VAL_640X480_DA }, - { "800x600", OPTION_VAL_800X600_DA }, - { "960x720", OPTION_VAL_960X720_DA }, - { "1024x768", OPTION_VAL_1024X768_DA }, - { "1280x960", OPTION_VAL_1280X960_DA }, - { "1440x1080", OPTION_VAL_1440X1080_DA }, - { "1600x1200", OPTION_VAL_1600X1200_DA }, - { "1920x1440", OPTION_VAL_1920X1440_DA }, - { "2560x1920", OPTION_VAL_2560X1920_DA }, - { "2880x2160", OPTION_VAL_2880X2160_DA }, - { "3200x2400", OPTION_VAL_3200X2400_DA }, - { "3840x2880", OPTION_VAL_3840X2880_DA }, - { "4480x3360", OPTION_VAL_4480X3360_DA }, - { "5120x3840", OPTION_VAL_5120X3840_DA }, - { "5760x4320", OPTION_VAL_5760X4320_DA }, - { "6400x4800", OPTION_VAL_6400X4800_DA }, - { "7040x5280", OPTION_VAL_7040X5280_DA }, - { "7680x5760", OPTION_VAL_7680X5760_DA }, - { "8320x6240", OPTION_VAL_8320X6240_DA }, - { "8960x6720", OPTION_VAL_8960X6720_DA }, - { "9600x7200", OPTION_VAL_9600X7200_DA }, - { "10240x7680", OPTION_VAL_10240X7680_DA }, - { "10880x8160", OPTION_VAL_10880X8160_DA }, - { "11520x8640", OPTION_VAL_11520X8640_DA }, - { "12160x9120", OPTION_VAL_12160X9120_DA }, - { "12800x9600", OPTION_VAL_12800X9600_DA }, + { "320x240", OPTION_VAL_320X240_CY }, + { "640x480", OPTION_VAL_640X480_CY }, + { "800x600", OPTION_VAL_800X600_CY }, + { "960x720", OPTION_VAL_960X720_CY }, + { "1024x768", OPTION_VAL_1024X768_CY }, + { "1280x960", OPTION_VAL_1280X960_CY }, + { "1440x1080", OPTION_VAL_1440X1080_CY }, + { "1600x1200", OPTION_VAL_1600X1200_CY }, + { "1920x1440", OPTION_VAL_1920X1440_CY }, + { "2560x1920", OPTION_VAL_2560X1920_CY }, + { "2880x2160", OPTION_VAL_2880X2160_CY }, + { "3200x2400", OPTION_VAL_3200X2400_CY }, + { "3840x2880", OPTION_VAL_3840X2880_CY }, + { "4480x3360", OPTION_VAL_4480X3360_CY }, + { "5120x3840", OPTION_VAL_5120X3840_CY }, + { "5760x4320", OPTION_VAL_5760X4320_CY }, + { "6400x4800", OPTION_VAL_6400X4800_CY }, + { "7040x5280", OPTION_VAL_7040X5280_CY }, + { "7680x5760", OPTION_VAL_7680X5760_CY }, + { "8320x6240", OPTION_VAL_8320X6240_CY }, + { "8960x6720", OPTION_VAL_8960X6720_CY }, + { "9600x7200", OPTION_VAL_9600X7200_CY }, + { "10240x7680", OPTION_VAL_10240X7680_CY }, + { "10880x8160", OPTION_VAL_10880X8160_CY }, + { "11520x8640", OPTION_VAL_11520X8640_CY }, + { "12160x9120", OPTION_VAL_12160X9120_CY }, + { "12800x9600", OPTION_VAL_12800X9600_CY }, { NULL, NULL }, }, #ifdef LOW_RES @@ -14961,62 +16714,62 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_DA, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_CY, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DA, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_CY, NULL, "video", { - { "VGA", OPTION_VAL_VGA_DA }, - { "TV (RGB)", OPTION_VAL_TV_RGB_DA }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_DA }, + { "VGA", OPTION_VAL_VGA_CY }, + { "TV (RGB)", OPTION_VAL_TV_RGB_CY }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_CY }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_DA, + CORE_OPTION_NAME_BROADCAST_LABEL_CY, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_DA }, - { "PAL", OPTION_VAL_PAL_DA }, - { "PAL_N", OPTION_VAL_PAL_N_DA }, - { "PAL_M", OPTION_VAL_PAL_M_DA }, - { "Default", OPTION_VAL_DEFAULT_DA }, + { "NTSC", OPTION_VAL_NTSC_CY }, + { "PAL", OPTION_VAL_PAL_CY }, + { "PAL_N", OPTION_VAL_PAL_N_CY }, + { "PAL_M", OPTION_VAL_PAL_M_CY }, + { "Default", OPTION_VAL_DEFAULT_CY }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DA, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_CY, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_DA }, - { "vertical", OPTION_VAL_VERTICAL_DA }, + { "horizontal", OPTION_VAL_HORIZONTAL_CY }, + { "vertical", OPTION_VAL_VERTICAL_CY }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DA, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_CY, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DA }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_DA }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_CY }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_CY }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_DA }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_CY }, #endif { NULL, NULL }, }, @@ -15029,25 +16782,25 @@ struct retro_core_option_v2_definition option_defs_da[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_CY, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_CY, NULL, "video", { - { "512MB", OPTION_VAL_512MB_DA }, - { "1GB", OPTION_VAL_1GB_DA }, - { "2GB", OPTION_VAL_2GB_DA }, - { "4GB", OPTION_VAL_4GB_DA }, + { "512MB", OPTION_VAL_512MB_CY }, + { "1GB", OPTION_VAL_1GB_CY }, + { "2GB", OPTION_VAL_2GB_CY }, + { "4GB", OPTION_VAL_4GB_CY }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_DA, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_CY, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DA, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_CY, NULL, "video", { @@ -15055,6 +16808,7 @@ struct retro_core_option_v2_definition option_defs_da[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -15063,9 +16817,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_CY, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_CY, NULL, "video", { @@ -15077,9 +16831,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DA, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_CY, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DA, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_CY, NULL, "video", { @@ -15089,11 +16843,11 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_DA, + CORE_OPTION_NAME_MIPMAPPING_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_CY, NULL, "video", { @@ -15105,7 +16859,7 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_DA, + CORE_OPTION_NAME_FOG_LABEL_CY, NULL, "", NULL, @@ -15119,9 +16873,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_CY, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_CY, NULL, "video", { @@ -15133,9 +16887,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_CY, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_CY, NULL, "video", { @@ -15150,24 +16904,24 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DA, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_CY, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DA, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_CY, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_DA }, - { "1", OPTION_VAL_1_DA }, - { "2", OPTION_VAL_2_DA }, + { "0", OPTION_VAL_DEFAULT_CY }, + { "1", OPTION_VAL_1_CY }, + { "2", OPTION_VAL_2_CY }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_CY, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_CY, NULL, "video", { @@ -15175,13 +16929,13 @@ struct retro_core_option_v2_definition option_defs_da[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_CY, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_CY, NULL, "video", { @@ -15193,9 +16947,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DA, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_CY, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DA, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_CY, NULL, "video", { @@ -15208,25 +16962,25 @@ struct retro_core_option_v2_definition option_defs_da[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_DA, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_CY, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DA, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_CY, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_DA }, - { "4", OPTION_VAL_4_DA }, - { "6", OPTION_VAL_6_DA }, + { "2", OPTION_VAL_2_O26_CY }, + { "4", OPTION_VAL_4_CY }, + { "6", OPTION_VAL_6_CY }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DA, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_CY, NULL, "video", { @@ -15240,9 +16994,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_CY, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_CY, NULL, "video", { @@ -15252,11 +17006,25 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_CY, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_CY, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DA, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_CY, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DA, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_CY, NULL, "performance", { @@ -15268,15 +17036,15 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_CY, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_CY, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_DA }, - { "more", OPTION_VAL_MORE_DA }, + { "some", OPTION_VAL_SOME_CY }, + { "more", OPTION_VAL_MORE_CY }, { NULL, NULL }, }, #ifdef LOW_END @@ -15287,9 +17055,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DA, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_CY, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DA, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_CY, NULL, "performance", { @@ -15306,9 +17074,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_CY, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_CY, NULL, "hacks", { @@ -15320,9 +17088,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DA, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_CY, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DA, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_CY, NULL, "hacks", { @@ -15334,9 +17102,9 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_CY, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_CY, NULL, "hacks", { @@ -15350,64 +17118,78 @@ struct retro_core_option_v2_definition option_defs_da[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_CY, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_CY, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_DA, + CORE_OPTION_NAME_SH4CLOCK_LABEL_CY, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_DA, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_CY, NULL, "hacks", { - { "100", OPTION_VAL_100_DA }, - { "110", OPTION_VAL_110_DA }, - { "120", OPTION_VAL_120_DA }, - { "130", OPTION_VAL_130_DA }, - { "140", OPTION_VAL_140_DA }, - { "150", OPTION_VAL_150_DA }, - { "160", OPTION_VAL_160_DA }, - { "170", OPTION_VAL_170_DA }, - { "180", OPTION_VAL_180_DA }, - { "190", OPTION_VAL_190_DA }, - { "200", OPTION_VAL_200_DA }, - { "210", OPTION_VAL_210_DA }, - { "220", OPTION_VAL_220_DA }, - { "230", OPTION_VAL_230_DA }, - { "240", OPTION_VAL_240_DA }, - { "250", OPTION_VAL_250_DA }, - { "260", OPTION_VAL_260_DA }, - { "270", OPTION_VAL_270_DA }, - { "280", OPTION_VAL_280_DA }, - { "290", OPTION_VAL_290_DA }, - { "300", OPTION_VAL_300_DA }, - { "310", OPTION_VAL_310_DA }, - { "320", OPTION_VAL_320_DA }, - { "330", OPTION_VAL_330_DA }, - { "340", OPTION_VAL_340_DA }, - { "350", OPTION_VAL_350_DA }, - { "360", OPTION_VAL_360_DA }, - { "370", OPTION_VAL_370_DA }, - { "380", OPTION_VAL_380_DA }, - { "390", OPTION_VAL_390_DA }, - { "400", OPTION_VAL_400_DA }, - { "410", OPTION_VAL_410_DA }, - { "420", OPTION_VAL_420_DA }, - { "430", OPTION_VAL_430_DA }, - { "440", OPTION_VAL_440_DA }, - { "450", OPTION_VAL_450_DA }, - { "460", OPTION_VAL_460_DA }, - { "470", OPTION_VAL_470_DA }, - { "480", OPTION_VAL_480_DA }, - { "490", OPTION_VAL_490_DA }, - { "500", OPTION_VAL_500_DA }, + { "100", OPTION_VAL_100_CY }, + { "110", OPTION_VAL_110_CY }, + { "120", OPTION_VAL_120_CY }, + { "130", OPTION_VAL_130_CY }, + { "140", OPTION_VAL_140_CY }, + { "150", OPTION_VAL_150_CY }, + { "160", OPTION_VAL_160_CY }, + { "170", OPTION_VAL_170_CY }, + { "180", OPTION_VAL_180_CY }, + { "190", OPTION_VAL_190_CY }, + { "200", OPTION_VAL_200_CY }, + { "210", OPTION_VAL_210_CY }, + { "220", OPTION_VAL_220_CY }, + { "230", OPTION_VAL_230_CY }, + { "240", OPTION_VAL_240_CY }, + { "250", OPTION_VAL_250_CY }, + { "260", OPTION_VAL_260_CY }, + { "270", OPTION_VAL_270_CY }, + { "280", OPTION_VAL_280_CY }, + { "290", OPTION_VAL_290_CY }, + { "300", OPTION_VAL_300_CY }, + { "310", OPTION_VAL_310_CY }, + { "320", OPTION_VAL_320_CY }, + { "330", OPTION_VAL_330_CY }, + { "340", OPTION_VAL_340_CY }, + { "350", OPTION_VAL_350_CY }, + { "360", OPTION_VAL_360_CY }, + { "370", OPTION_VAL_370_CY }, + { "380", OPTION_VAL_380_CY }, + { "390", OPTION_VAL_390_CY }, + { "400", OPTION_VAL_400_CY }, + { "410", OPTION_VAL_410_CY }, + { "420", OPTION_VAL_420_CY }, + { "430", OPTION_VAL_430_CY }, + { "440", OPTION_VAL_440_CY }, + { "450", OPTION_VAL_450_CY }, + { "460", OPTION_VAL_460_CY }, + { "470", OPTION_VAL_470_CY }, + { "480", OPTION_VAL_480_CY }, + { "490", OPTION_VAL_490_CY }, + { "500", OPTION_VAL_500_CY }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DA, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_CY, NULL, "hacks", { @@ -15417,11 +17199,11 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DA, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_CY, NULL, "hacks", { @@ -15433,47 +17215,47 @@ struct retro_core_option_v2_definition option_defs_da[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DA, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_CY, NULL, "input", { - { "0%", OPTION_VAL_0_DA }, - { "5%", OPTION_VAL_5_DA }, - { "10%", OPTION_VAL_10_DA }, - { "15%", OPTION_VAL_15_DA }, - { "20%", OPTION_VAL_20_DA }, - { "25%", OPTION_VAL_25_DA }, - { "30%", OPTION_VAL_30_DA }, + { "0%", OPTION_VAL_0_CY }, + { "5%", OPTION_VAL_5_CY }, + { "10%", OPTION_VAL_10_CY }, + { "15%", OPTION_VAL_15_CY }, + { "20%", OPTION_VAL_20_CY }, + { "25%", OPTION_VAL_25_CY }, + { "30%", OPTION_VAL_30_CY }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DA, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_CY, NULL, "input", { - { "0%", OPTION_VAL_0_DA }, - { "5%", OPTION_VAL_5_DA }, - { "10%", OPTION_VAL_10_DA }, - { "15%", OPTION_VAL_15_DA }, - { "20%", OPTION_VAL_20_DA }, - { "25%", OPTION_VAL_25_DA }, - { "30%", OPTION_VAL_30_DA }, + { "0%", OPTION_VAL_0_CY }, + { "5%", OPTION_VAL_5_CY }, + { "10%", OPTION_VAL_10_CY }, + { "15%", OPTION_VAL_15_CY }, + { "20%", OPTION_VAL_20_CY }, + { "25%", OPTION_VAL_25_CY }, + { "30%", OPTION_VAL_30_CY }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DA, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_CY, NULL, "input", { @@ -15484,10 +17266,10 @@ struct retro_core_option_v2_definition option_defs_da[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_DA, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_CY, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_DA, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_CY, NULL, "input", { @@ -15495,300 +17277,293 @@ struct retro_core_option_v2_definition option_defs_da[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DA, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_CY, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DA, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_CY, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DA, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_CY, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DA, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_CY }, + { "60%", OPTION_VAL_60_CY }, + { "70%", OPTION_VAL_70_CY }, + { "80%", OPTION_VAL_80_CY }, + { "90%", OPTION_VAL_90_CY }, + { "100%", OPTION_VAL_100_O45_CY }, + { "110%", OPTION_VAL_110_O45_CY }, + { "120%", OPTION_VAL_120_O45_CY }, + { "130%", OPTION_VAL_130_O45_CY }, + { "140%", OPTION_VAL_140_O45_CY }, + { "150%", OPTION_VAL_150_O45_CY }, + { "160%", OPTION_VAL_160_O45_CY }, + { "170%", OPTION_VAL_170_O45_CY }, + { "180%", OPTION_VAL_180_O45_CY }, + { "190%", OPTION_VAL_190_O45_CY }, + { "200%", OPTION_VAL_200_O45_CY }, + { "210%", OPTION_VAL_210_O45_CY }, + { "220%", OPTION_VAL_220_O45_CY }, + { "230%", OPTION_VAL_230_O45_CY }, + { "240%", OPTION_VAL_240_O45_CY }, + { "250%", OPTION_VAL_250_O45_CY }, + { "260%", OPTION_VAL_260_O45_CY }, + { "270%", OPTION_VAL_270_O45_CY }, + { "280%", OPTION_VAL_280_O45_CY }, + { "290%", OPTION_VAL_290_O45_CY }, + { "300%", OPTION_VAL_300_O45_CY }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DA, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_CY, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DA }, - { "Red", OPTION_VAL_RED_DA }, - { "Green", OPTION_VAL_GREEN_DA }, - { "Blue", OPTION_VAL_BLUE_DA }, + { "White", OPTION_VAL_WHITE_CY }, + { "Red", OPTION_VAL_RED_CY }, + { "Green", OPTION_VAL_GREEN_CY }, + { "Blue", OPTION_VAL_BLUE_CY }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DA, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_CY, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DA }, - { "Red", OPTION_VAL_RED_DA }, - { "Green", OPTION_VAL_GREEN_DA }, - { "Blue", OPTION_VAL_BLUE_DA }, + { "White", OPTION_VAL_WHITE_CY }, + { "Red", OPTION_VAL_RED_CY }, + { "Green", OPTION_VAL_GREEN_CY }, + { "Blue", OPTION_VAL_BLUE_CY }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DA, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_CY, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DA }, - { "Red", OPTION_VAL_RED_DA }, - { "Green", OPTION_VAL_GREEN_DA }, - { "Blue", OPTION_VAL_BLUE_DA }, + { "White", OPTION_VAL_WHITE_CY }, + { "Red", OPTION_VAL_RED_CY }, + { "Green", OPTION_VAL_GREEN_CY }, + { "Blue", OPTION_VAL_BLUE_CY }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DA, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_CY, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DA }, - { "Red", OPTION_VAL_RED_DA }, - { "Green", OPTION_VAL_GREEN_DA }, - { "Blue", OPTION_VAL_BLUE_DA }, + { "White", OPTION_VAL_WHITE_CY }, + { "Red", OPTION_VAL_RED_CY }, + { "Green", OPTION_VAL_GREEN_CY }, + { "Blue", OPTION_VAL_BLUE_CY }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DA, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_CY, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_CY, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_DA }, - { "All VMUs", OPTION_VAL_ALL_VMUS_DA }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_DA, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DA, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_DA, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_CY, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_CY, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DA, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_CY, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_CY, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DA, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_CY, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DA, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_CY, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DA, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_CY, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_DA }, - { "2x", OPTION_VAL_2_O27_DA }, - { "3x", OPTION_VAL_3X_DA }, - { "4x", OPTION_VAL_4_DA }, - { "5x", OPTION_VAL_5X_DA }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DA, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_CY, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DA, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_CY, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_CY, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "VMU", OPTION_VAL_VMU_CY }, + { "Purupuru", OPTION_VAL_PURUPURU_CY }, + { "None", OPTION_VAL_NONE_CY }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DA, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CY, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_CY, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_CY, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_CY }, + { "All VMUs", OPTION_VAL_ALL_VMUS_CY }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_CY, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_CY, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_CY, NULL, "vmu", { - { "10%", OPTION_VAL_10_DA }, - { "20%", OPTION_VAL_20_DA }, - { "30%", OPTION_VAL_30_DA }, - { "40%", OPTION_VAL_40_DA }, - { "50%", OPTION_VAL_50_DA }, - { "60%", OPTION_VAL_60_DA }, - { "70%", OPTION_VAL_70_DA }, - { "80%", OPTION_VAL_80_DA }, - { "90%", OPTION_VAL_90_DA }, - { "100%", OPTION_VAL_100_O57_DA }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DA, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CY, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_CY, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_CY, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_CY, NULL, "", NULL, @@ -15801,145 +17576,145 @@ struct retro_core_option_v2_definition option_defs_da[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DA, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_CY, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DA, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_CY, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DA }, - { "2x", OPTION_VAL_2_O27_DA }, - { "3x", OPTION_VAL_3X_DA }, - { "4x", OPTION_VAL_4_DA }, - { "5x", OPTION_VAL_5X_DA }, + { "1x", OPTION_VAL_1X_CY }, + { "2x", OPTION_VAL_2_O26_CY }, + { "3x", OPTION_VAL_3X_CY }, + { "4x", OPTION_VAL_4_CY }, + { "5x", OPTION_VAL_5X_CY }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DA, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_CY, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DA }, - { "20%", OPTION_VAL_20_DA }, - { "30%", OPTION_VAL_30_DA }, - { "40%", OPTION_VAL_40_DA }, - { "50%", OPTION_VAL_50_DA }, - { "60%", OPTION_VAL_60_DA }, - { "70%", OPTION_VAL_70_DA }, - { "80%", OPTION_VAL_80_DA }, - { "90%", OPTION_VAL_90_DA }, - { "100%", OPTION_VAL_100_O57_DA }, + { "10%", OPTION_VAL_10_CY }, + { "20%", OPTION_VAL_20_CY }, + { "30%", OPTION_VAL_30_CY }, + { "40%", OPTION_VAL_40_CY }, + { "50%", OPTION_VAL_50_CY }, + { "60%", OPTION_VAL_60_CY }, + { "70%", OPTION_VAL_70_CY }, + { "80%", OPTION_VAL_80_CY }, + { "90%", OPTION_VAL_90_CY }, + { "100%", OPTION_VAL_100_O45_CY }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DA, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_CY, NULL, "", NULL, @@ -15952,145 +17727,145 @@ struct retro_core_option_v2_definition option_defs_da[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DA, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_CY, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DA, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_CY, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DA }, - { "2x", OPTION_VAL_2_O27_DA }, - { "3x", OPTION_VAL_3X_DA }, - { "4x", OPTION_VAL_4_DA }, - { "5x", OPTION_VAL_5X_DA }, + { "1x", OPTION_VAL_1X_CY }, + { "2x", OPTION_VAL_2_O26_CY }, + { "3x", OPTION_VAL_3X_CY }, + { "4x", OPTION_VAL_4_CY }, + { "5x", OPTION_VAL_5X_CY }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DA, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_CY, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DA }, - { "20%", OPTION_VAL_20_DA }, - { "30%", OPTION_VAL_30_DA }, - { "40%", OPTION_VAL_40_DA }, - { "50%", OPTION_VAL_50_DA }, - { "60%", OPTION_VAL_60_DA }, - { "70%", OPTION_VAL_70_DA }, - { "80%", OPTION_VAL_80_DA }, - { "90%", OPTION_VAL_90_DA }, - { "100%", OPTION_VAL_100_O57_DA }, + { "10%", OPTION_VAL_10_CY }, + { "20%", OPTION_VAL_20_CY }, + { "30%", OPTION_VAL_30_CY }, + { "40%", OPTION_VAL_40_CY }, + { "50%", OPTION_VAL_50_CY }, + { "60%", OPTION_VAL_60_CY }, + { "70%", OPTION_VAL_70_CY }, + { "80%", OPTION_VAL_80_CY }, + { "90%", OPTION_VAL_90_CY }, + { "100%", OPTION_VAL_100_O45_CY }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DA, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_CY, NULL, "", NULL, @@ -16103,784 +17878,760 @@ struct retro_core_option_v2_definition option_defs_da[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DA, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_CY, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DA, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_CY, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DA }, - { "2x", OPTION_VAL_2_O27_DA }, - { "3x", OPTION_VAL_3X_DA }, - { "4x", OPTION_VAL_4_DA }, - { "5x", OPTION_VAL_5X_DA }, + { "1x", OPTION_VAL_1X_CY }, + { "2x", OPTION_VAL_2_O26_CY }, + { "3x", OPTION_VAL_3X_CY }, + { "4x", OPTION_VAL_4_CY }, + { "5x", OPTION_VAL_5X_CY }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DA, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_CY, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, - { "BLACK 02", OPTION_VAL_BLACK_02_DA }, - { "BLUE 03", OPTION_VAL_BLUE_DA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, - { "GREEN 05", OPTION_VAL_GREEN_DA }, - { "CYAN 06", OPTION_VAL_CYAN_06_DA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, - { "RED 11", OPTION_VAL_RED_DA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, - { "GRAY 15", OPTION_VAL_GRAY_15_DA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, - { "WHITE 28", OPTION_VAL_WHITE_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DA, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_CY, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DA }, - { "20%", OPTION_VAL_20_DA }, - { "30%", OPTION_VAL_30_DA }, - { "40%", OPTION_VAL_40_DA }, - { "50%", OPTION_VAL_50_DA }, - { "60%", OPTION_VAL_60_DA }, - { "70%", OPTION_VAL_70_DA }, - { "80%", OPTION_VAL_80_DA }, - { "90%", OPTION_VAL_90_DA }, - { "100%", OPTION_VAL_100_O57_DA }, + { "10%", OPTION_VAL_10_CY }, + { "20%", OPTION_VAL_20_CY }, + { "30%", OPTION_VAL_30_CY }, + { "40%", OPTION_VAL_40_CY }, + { "50%", OPTION_VAL_50_CY }, + { "60%", OPTION_VAL_60_CY }, + { "70%", OPTION_VAL_70_CY }, + { "80%", OPTION_VAL_80_CY }, + { "90%", OPTION_VAL_90_CY }, + { "100%", OPTION_VAL_100_O45_CY }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_da = { - option_cats_da, - option_defs_da -}; - -/* RETRO_LANGUAGE_DE */ - -#define CATEGORY_SYSTEM_LABEL_DE NULL -#define CATEGORY_SYSTEM_INFO_0_DE "Region, Sprache, BIOS und Basis-Hardware-Einstellungen konfigurieren." -#define CATEGORY_VIDEO_LABEL_DE NULL -#define CATEGORY_VIDEO_INFO_0_DE "Einstellungen für Auflösung, reihenfolgeunabhängige Transparenz und visuelle Effekte konfigurieren." -#define CATEGORY_PERFORMANCE_LABEL_DE "Leistung" -#define CATEGORY_PERFORMANCE_INFO_0_DE "Einstellungen für Threaded Rendering und Bilder überspringen ändern." -#define CATEGORY_HACKS_LABEL_DE "Emulations-Hacks" -#define CATEGORY_HACKS_INFO_0_DE "Breitbildüberschreibungen, GD-ROM-Ladegeschwindigkeit und Texturaustauscheinstellungen konfigurieren." -#define CATEGORY_INPUT_LABEL_DE "Eingabe" -#define CATEGORY_INPUT_INFO_0_DE "Gamepad- und Lightgun-Einstellungen konfigurieren." -#define CATEGORY_VMU_LABEL_DE NULL -#define CATEGORY_VMU_INFO_0_DE "Konfiguriert die VMU-Speicherdateien pro Spiel und die VMU-Sichtbarkeitseinstellungen auf dem Bildschirm." -#define CORE_OPTION_NAME_REGION_LABEL_DE NULL -#define OPTION_VAL_JAPAN_DE NULL -#define OPTION_VAL_USA_DE NULL -#define OPTION_VAL_EUROPE_DE "Europa" -#define OPTION_VAL_DEFAULT_DE "Standard" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_DE "Sprache" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_DE "Ändert die Sprache, die vom BIOS und von Spielen verwendet wird, die mehrere Sprachen enthalten." -#define OPTION_VAL_JAPANESE_DE "Japanisch" -#define OPTION_VAL_ENGLISH_DE "Englisch" -#define OPTION_VAL_GERMAN_DE "Deutsch" -#define OPTION_VAL_FRENCH_DE "Französisch" -#define OPTION_VAL_SPANISH_DE "Spanisch" -#define OPTION_VAL_ITALIAN_DE "Italienisch" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_DE "HLE BIOS (Neustart erforderlich)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_DE "Erzwingt die Verwendung von High-Level-Emulation-BIOS." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DE "BIOS starten (Neustart erforderlich)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DE "Direkt ins Dreamcast-BIOS-Menü starten." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_DE "DSP aktivieren" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DE "Aktiviert Emulation von DSP des Dreamcasts (digitaler Signalprozessor). Verbessert die Genauigkeit des erzeugten Klanges, erhöht aber die Leistungsanforderungen." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_DE "Windows-CE-Modus erzwingen" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_DE "Vollständige Emulation für MMU (Memory Management Unit) aktivieren und weitere Einstellungen für Windows-CE-Spiele." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DE "NAOMI-Servicetasten erlauben" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DE "Aktiviert den SERVICE-Knopf für NAOMI, um die Automateneinstellungen aufzurufen." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DE "NAOMI-Spiele auf kostenloses Spiel setzen" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DE "Ändert die Münzeinstellungen des Spiels zu kostenlos." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_DE "Breitbandadapter-Emulation" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DE "Den Ethernet-Breitbandadapter anstelle des Modems emulieren. (Neustart erforderlich)" -#define CORE_OPTION_NAME_UPNP_LABEL_DE "UPnP aktivieren" -#define CORE_OPTION_NAME_UPNP_INFO_0_DE "Verwendet UPnP, um den Internetrouter automatisch für Onlinespiele zu konfigurieren." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DE "Interne Auflösung" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DE "Rendering-Auflösung ändern." -#define OPTION_VAL_320X240_DE "320 × 240" -#define OPTION_VAL_640X480_DE "640 × 480" -#define OPTION_VAL_800X600_DE "800 × 600" -#define OPTION_VAL_960X720_DE "960 × 720" -#define OPTION_VAL_1024X768_DE "1024 × 768" -#define OPTION_VAL_1280X960_DE "1280 × 960" -#define OPTION_VAL_1440X1080_DE "1440 × 1080" -#define OPTION_VAL_1600X1200_DE "1600 × 1200" -#define OPTION_VAL_1920X1440_DE "1920 × 1440" -#define OPTION_VAL_2560X1920_DE "2560 × 1920" -#define OPTION_VAL_2880X2160_DE "2880 × 2160" -#define OPTION_VAL_3200X2400_DE "3200 × 2400" -#define OPTION_VAL_3840X2880_DE "3840 × 2880" -#define OPTION_VAL_4480X3360_DE "4480 × 3360" -#define OPTION_VAL_5120X3840_DE "5120 × 3840" -#define OPTION_VAL_5760X4320_DE "5760 × 4320" -#define OPTION_VAL_6400X4800_DE "6400 × 4800" -#define OPTION_VAL_7040X5280_DE "7040 × 5280" -#define OPTION_VAL_7680X5760_DE "7680 x 5760" -#define OPTION_VAL_8320X6240_DE "8320 × 6240" -#define OPTION_VAL_8960X6720_DE "8960 × 6720" -#define OPTION_VAL_9600X7200_DE "9600 × 7200" -#define OPTION_VAL_10240X7680_DE "10240 × 7680" -#define OPTION_VAL_10880X8160_DE "10880 × 8160" -#define OPTION_VAL_11520X8640_DE "11520 × 8640" -#define OPTION_VAL_12160X9120_DE "12160 × 9120" -#define OPTION_VAL_12800X9600_DE "12800 × 9600" -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_DE "Kabeltyp" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DE "Das Ausgabesignalkabel: „TV (Composite)“ ist das am weitesten unterstützte." -#define OPTION_VAL_VGA_DE NULL -#define OPTION_VAL_TV_RGB_DE NULL -#define OPTION_VAL_TV_COMPOSITE_DE NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_DE "Ausgabe-Regions-Standard" -#define OPTION_VAL_NTSC_DE NULL -#define OPTION_VAL_PAL_DE "PAL (Welt)" -#define OPTION_VAL_PAL_N_DE "PAL-N (Argentinien, Paraguay, Uruguay)" -#define OPTION_VAL_PAL_M_DE "PAL-M (Brasilien)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DE "Bildschirmausrichtung" -#define OPTION_VAL_HORIZONTAL_DE NULL -#define OPTION_VAL_VERTICAL_DE "Vertikal" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DE "Alpha-Sortierung" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DE "Pro-Streifen (schnell, am wenigsten genau)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_DE "Pro-Dreieck (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_DE "Pro-Pixel (genau, aber langsamer)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DE "Anhäufung Pixel Puffergröße" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DE "Für eine korrekte Ausgabe höherer Auflösungen sind möglicherweise höhere Werte erforderlich." -#define OPTION_VAL_512MB_DE "512 MB" -#define OPTION_VAL_1GB_DE "1 GB" -#define OPTION_VAL_2GB_DE "2 GB" -#define OPTION_VAL_4GB_DE "4 GB" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_DE "Maximale transparente Ebenen" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DE "Höhere Werte könnten für komplexe Szenen erforderlich sein." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DE "Vollständige Bildspeicheremulation" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DE "Vollständige Bildspeicheremulation in VRAM aktivieren. Dies ist für Spiele nützlich, die den Bildspeicher direkt in VRAM lesen oder schreiben. Wenn aktiviert, wird die interne Auflösung auf 640×480 erzwungen und die Leistung kann stark beeinträchtigt werden." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DE "RTT-Puffer (Render-To-Texture) erlauben" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DE "Kopiert gerenderte Texturen zurück von der GPU in VRAM. Diese Option ist normalerweise für Spiele aktiviert, die dies erfordern. Wenn aktiviert, ist das Hochskalieren von Texturen deaktiviert und die Leistung kann beeinträchtigt werden." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_DE NULL -#define CORE_OPTION_NAME_FOG_LABEL_DE "Nebeleffekte" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DE "Volumen-Modifizierer" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DE "Eine Dreamcast-GPU-Funktion, die typischerweise von Spielen benutzt wird, um Objektschatten zu zeichnen. Normalerweise sollte dies aktiviert werden – der Leistungsverlust ist in der Regel minimal bis vernachlässigbar." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DE "Anisotropes Filtern" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DE "Verbessert die Qualität der Texturen auf Oberflächen, die in schrägen Blickwinkeln gegenüber der Kamera liegen. Höhere Werte sind anspruchsvoller für die GPU. Änderungen an dieser Einstellung gelten erst nach einem Neustart." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DE "Texturfilterung" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DE "Der zu verwendende Texturfiltermodus. Dies kann verwendet werden, um einen bestimmten Texturfiltermodus für alle Texturen zu erzwingen, um ein klareres (oder glatteres) Erscheinungsbild als Standard zu erhalten. Andere Werte als Standardwerte können zu verschiedenen Rendering-Problemen führen. Änderungen an dieser Einstellung werden nur nach einem Neustart angewendet." -#define OPTION_VAL_1_DE "Nächste-Nachbarn erzwingen" -#define OPTION_VAL_2_DE "Linear erzwingen" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DE "Bildaustausch verzögern" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DE "Nützlich, um flackernden Bildschirm oder fehlerhafte Videos zu vermeiden. Nicht empfohlen auf langsamen Plattformen." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DE "Änderungen der Bildrate erkennen" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DE "Benachrichtigt das Frontend, wenn sich die interne Bildrate ändert (z. B. von 60 fps auf 30 fps). Verbessert das Bildtempo in Spielen, die mit gesperrten 30 bps oder 20 bps laufen, sollte aber für Spiele mit entsperrten (instabilen) Bildraten deaktiviert sein (z. B. Ecco the Dolphin, Unreal Tournament). Hinweis: Nicht verfügbar, wenn „Automatisches Bilder überspringen“ aktiviert ist." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DE "PowerVR2-Nachbearbeitungsfilter" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DE "Nachbearbeitung des gerenderten Bildes zur Simulation von Effekten speziell für PowerVR2-GPU und analoge Videosignale." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_DE "Texturen hochskalieren (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DE "Verbessert handgezeichnete 2D-Pixelgrafiken. Sollte nur mit 2D-Pixelspielen verwendet werden." -#define OPTION_VAL_2_O27_DE "2×" -#define OPTION_VAL_4_DE "4×" -#define OPTION_VAL_6_DE "6×" -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DE "Texturhochskalierung Max. gefilterte Größe" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DE "Native Tiefeninterpolation" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DE "Hilft bei Texturfehlern und tieferen Problemen mit AMD GPUs. Kann auch Intel GPUs in einigen Fällen helfen." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DE NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DE "Führt die GPU und CPU in verschiedenen Prozessen aus. Sehr empfohlen." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DE "Automatisches Bilder überspringen" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DE "Überspringt Bilder automatisch, wenn der Emulator langsam läuft. Hinweis: Diese Einstellung gilt nur, wenn 'Threaded Rendering' aktiviert ist." -#define OPTION_VAL_SOME_DE NULL -#define OPTION_VAL_MORE_DE NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DE "Bilder überspringen" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DE "Legt die Anzahl der Bilder fest, die zwischen jedem angezeigten Bild übersprungen werden sollen." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DE "Breitbild-Cheats (Neustart erforderlich)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DE "Aktiviert Cheats, mit denen bestimmte Spiele im Breitbildformat angezeigt werden können." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DE "Breitbildmodus-Hack" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DE "Zeichnet Geometrie außerhalb des normalen 4:3-Seitenverhältnisses. Kann grafische Fehler in den aufgedeckten Bereichen erzeugen." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DE "GD-ROM schnelles Laden (ungenau)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DE "Beschleunigt das Laden von GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_DE "SH4 CPU unter-/übertakten" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_DE "Ändert den Haupt-CPU-Takt des SH4 statt der standardmäßigen 200 MHz. Untertakten kann bei langsamen Plattformen helfen. Übertakten kann die Bildrate für einige Spiele erhöhen. Mit Vorsicht verwenden." -#define OPTION_VAL_100_DE NULL -#define OPTION_VAL_110_DE NULL -#define OPTION_VAL_120_DE NULL -#define OPTION_VAL_130_DE NULL -#define OPTION_VAL_140_DE NULL -#define OPTION_VAL_150_DE NULL -#define OPTION_VAL_160_DE NULL -#define OPTION_VAL_170_DE NULL -#define OPTION_VAL_180_DE NULL -#define OPTION_VAL_190_DE NULL -#define OPTION_VAL_200_DE NULL -#define OPTION_VAL_210_DE NULL -#define OPTION_VAL_220_DE NULL -#define OPTION_VAL_230_DE NULL -#define OPTION_VAL_240_DE NULL -#define OPTION_VAL_250_DE NULL -#define OPTION_VAL_260_DE NULL -#define OPTION_VAL_270_DE NULL -#define OPTION_VAL_280_DE NULL -#define OPTION_VAL_290_DE NULL -#define OPTION_VAL_300_DE NULL -#define OPTION_VAL_310_DE NULL -#define OPTION_VAL_320_DE NULL -#define OPTION_VAL_330_DE NULL -#define OPTION_VAL_340_DE NULL -#define OPTION_VAL_350_DE NULL -#define OPTION_VAL_360_DE NULL -#define OPTION_VAL_370_DE NULL -#define OPTION_VAL_380_DE NULL -#define OPTION_VAL_390_DE NULL -#define OPTION_VAL_400_DE NULL -#define OPTION_VAL_410_DE NULL -#define OPTION_VAL_420_DE NULL -#define OPTION_VAL_430_DE NULL -#define OPTION_VAL_440_DE NULL -#define OPTION_VAL_450_DE NULL -#define OPTION_VAL_460_DE NULL -#define OPTION_VAL_470_DE NULL -#define OPTION_VAL_480_DE NULL -#define OPTION_VAL_490_DE NULL -#define OPTION_VAL_500_DE NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DE "Eigene Texturen laden" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DE "Texturen dumpen" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DE "Analog-Stick Totzone" -#define OPTION_VAL_0_DE "0 %" -#define OPTION_VAL_5_DE "5 %" -#define OPTION_VAL_10_DE "10 %" -#define OPTION_VAL_15_DE "15 %" -#define OPTION_VAL_20_DE "20 %" -#define OPTION_VAL_25_DE "25 %" -#define OPTION_VAL_30_DE "30 %" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DE "Trigger Totzone" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DE "Digitale Trigger" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_DE NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_DE "Aktiviert das Vibrieren des Controllers." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DE "Digitale Ausgänge übertragen" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DE "Digitale Ausgänge und Force-Feedback-Status auf TCP-Port 8000 übertragen. Kompatibel mit der MAME-Option „-output network“." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DE "Lightgun-Einstellungen anzeigen" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DE "Aktiviert die Konfiguration der Lightgun-Fadenkreuz-Anzeigeoptionen. HINWEIS: Schnellmenü muss eingeschaltet sein, damit diese Einstellung wirksam wird." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DE "Pistolen Fadenkreuz 1 anzeigen" -#define OPTION_VAL_WHITE_DE "Weiß" -#define OPTION_VAL_RED_DE "Rot" -#define OPTION_VAL_GREEN_DE "Grün" -#define OPTION_VAL_BLUE_DE "Blau" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DE "Pistolen Fadenkreuz 2 anzeigen" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DE "Pistolen Fadenkreuz 3 anzeigen" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DE "Pistolen Fadenkreuz 4 anzeigen" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DE "Visual Memory Units/Systeme (VMU) pro Spiel" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DE "VMUs pro Spiel" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DE "Wenn deaktiviert, teilen alle Spiele 4 VMU-Speicherdateien (A1, B1, C1, D1) im Systemverzeichnis von RetroArch. Die Einstellung „VMU A1“ erzeugt für jedes Spiel, das gestartet wird, eine einzigartige VMU-„A1“-Datei im Speicherverzeichnis von RetroArch. Die Einstellung „Alle VMUs“ erzeugt 4 einzigartige VMU-Dateien (A1, B1, C1, D1) für jedes Spiel, das gestartet wird." -#define OPTION_VAL_VMU_A1_DE NULL -#define OPTION_VAL_ALL_VMUS_DE "Alle VMUs" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_DE NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DE NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_DE "Wenn aktiviert, werden VMU-Signaltöne abgespielt." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DE "Visual Memory Unit/System (VMU) Anzeigeeinstellungen anzeigen" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DE "VMU-Bildschirmeinstellungen anzeigen" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DE "Konfiguration von emulierten VMU LCD-Bildschirmen über Sichtbarkeit, Größe, Position und Farbe aktivieren. HINWEIS: Das Schnellmenü muss aktiviert sein, damit diese Einstellung wirksam wird." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 1" -#define OPTION_VAL_UPPER_LEFT_DE "Oben links" -#define OPTION_VAL_UPPER_RIGHT_DE "Oben rechts" -#define OPTION_VAL_LOWER_LEFT_DE "Unten links" -#define OPTION_VAL_LOWER_RIGHT_DE "Unten rechts" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 1" -#define OPTION_VAL_1X_DE "1×" -#define OPTION_VAL_3X_DE "3×" -#define OPTION_VAL_5X_DE "5×" -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe VMU-Bildschirm 1" -#define OPTION_VAL_DEFAULT_ON_00_DE "Standard EIN" -#define OPTION_VAL_DEFAULT_OFF_01_DE "Standard AUS" -#define OPTION_VAL_BLACK_02_DE "Schwarz" -#define OPTION_VAL_LIGHT_BLUE_04_DE "Hellblau" -#define OPTION_VAL_CYAN_06_DE NULL -#define OPTION_VAL_CYAN_BLUE_07_DE "Zyanblau" -#define OPTION_VAL_LIGHT_GREEN_08_DE "Hellgrün" -#define OPTION_VAL_CYAN_GREEN_09_DE "Zyangrün" -#define OPTION_VAL_LIGHT_CYAN_10_DE "Hellzyan" -#define OPTION_VAL_PURPLE_12_DE "Lila" -#define OPTION_VAL_LIGHT_PURPLE_13_DE "Hellviolett" -#define OPTION_VAL_YELLOW_14_DE "Gelb" -#define OPTION_VAL_GRAY_15_DE "Grau" -#define OPTION_VAL_LIGHT_PURPLE_2_16_DE "Hellviolett (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_DE "Hellgrün (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_DE "Hellgrün (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_DE "Hellzyan (2)" -#define OPTION_VAL_LIGHT_RED_2_20_DE "Hellrot (2)" -#define OPTION_VAL_MAGENTA_21_DE NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_DE "Hellviolett (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_DE "Hellorange" -#define OPTION_VAL_ORANGE_24_DE NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_DE "Hellviolett (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_DE "Hellgelb" -#define OPTION_VAL_LIGHT_YELLOW_2_27_DE "Hellgelb (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 1" -#define OPTION_VAL_40_DE "40 %" -#define OPTION_VAL_50_DE "50 %" -#define OPTION_VAL_60_DE "60 %" -#define OPTION_VAL_70_DE "70 %" -#define OPTION_VAL_80_DE "80 %" -#define OPTION_VAL_90_DE "90 %" -#define OPTION_VAL_100_O57_DE "100 %" -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 4" - -struct retro_core_option_v2_category option_cats_de[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_DE, - CATEGORY_SYSTEM_INFO_0_DE - }, - { - "video", - CATEGORY_VIDEO_LABEL_DE, - CATEGORY_VIDEO_INFO_0_DE - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_DE, - CATEGORY_PERFORMANCE_INFO_0_DE - }, - { - "hacks", - CATEGORY_HACKS_LABEL_DE, - CATEGORY_HACKS_INFO_0_DE - }, - { - "input", - CATEGORY_INPUT_LABEL_DE, - CATEGORY_INPUT_INFO_0_DE - }, - { - "vmu", - CATEGORY_VMU_LABEL_DE, - CATEGORY_VMU_INFO_0_DE - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_de[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_DE, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_CY, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_DE }, - { "USA", OPTION_VAL_USA_DE }, - { "Europe", OPTION_VAL_EUROPE_DE }, - { "Default", OPTION_VAL_DEFAULT_DE }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_DE, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_DE, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_DE }, - { "English", OPTION_VAL_ENGLISH_DE }, - { "German", OPTION_VAL_GERMAN_DE }, - { "French", OPTION_VAL_FRENCH_DE }, - { "Spanish", OPTION_VAL_SPANISH_DE }, - { "Italian", OPTION_VAL_ITALIAN_DE }, - { "Default", OPTION_VAL_DEFAULT_DE }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_DE, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_DE, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DE, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DE, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_DE, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DE, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_DE, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_CY, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_DE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_CY }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_CY }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_CY }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_CY }, { NULL, NULL }, }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DE, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_CY, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_CY }, + { "2x", OPTION_VAL_2_O26_CY }, + { "3x", OPTION_VAL_3X_CY }, + { "4x", OPTION_VAL_4_CY }, + { "5x", OPTION_VAL_5X_CY }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DE, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_CY, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, - "enabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_DE, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_CY, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_CY }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_CY }, + { "BLACK 02", OPTION_VAL_BLACK_02_CY }, + { "BLUE 03", OPTION_VAL_BLUE_CY }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_CY }, + { "GREEN 05", OPTION_VAL_GREEN_CY }, + { "CYAN 06", OPTION_VAL_CYAN_06_CY }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_CY }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_CY }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_CY }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_CY }, + { "RED 11", OPTION_VAL_RED_CY }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_CY }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_CY }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_CY }, + { "GRAY 15", OPTION_VAL_GRAY_15_CY }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_CY }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_CY }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_CY }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_CY }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_CY }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_CY }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_CY }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_CY }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_CY }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_CY }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_CY }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_CY }, + { "WHITE 28", OPTION_VAL_WHITE_CY }, { NULL, NULL }, }, - "disabled", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_DE, + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_CY, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_DE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_CY }, + { "20%", OPTION_VAL_20_CY }, + { "30%", OPTION_VAL_30_CY }, + { "40%", OPTION_VAL_40_CY }, + { "50%", OPTION_VAL_50_CY }, + { "60%", OPTION_VAL_60_CY }, + { "70%", OPTION_VAL_70_CY }, + { "80%", OPTION_VAL_80_CY }, + { "90%", OPTION_VAL_90_CY }, + { "100%", OPTION_VAL_100_O45_CY }, + { NULL, NULL }, }, - "enabled", + "100%", }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_cy = { + option_cats_cy, + option_defs_cy +}; - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DE, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DE, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_DE }, - { "640x480", OPTION_VAL_640X480_DE }, - { "800x600", OPTION_VAL_800X600_DE }, - { "960x720", OPTION_VAL_960X720_DE }, - { "1024x768", OPTION_VAL_1024X768_DE }, - { "1280x960", OPTION_VAL_1280X960_DE }, - { "1440x1080", OPTION_VAL_1440X1080_DE }, - { "1600x1200", OPTION_VAL_1600X1200_DE }, - { "1920x1440", OPTION_VAL_1920X1440_DE }, - { "2560x1920", OPTION_VAL_2560X1920_DE }, - { "2880x2160", OPTION_VAL_2880X2160_DE }, - { "3200x2400", OPTION_VAL_3200X2400_DE }, - { "3840x2880", OPTION_VAL_3840X2880_DE }, - { "4480x3360", OPTION_VAL_4480X3360_DE }, - { "5120x3840", OPTION_VAL_5120X3840_DE }, - { "5760x4320", OPTION_VAL_5760X4320_DE }, - { "6400x4800", OPTION_VAL_6400X4800_DE }, - { "7040x5280", OPTION_VAL_7040X5280_DE }, - { "7680x5760", OPTION_VAL_7680X5760_DE }, - { "8320x6240", OPTION_VAL_8320X6240_DE }, - { "8960x6720", OPTION_VAL_8960X6720_DE }, - { "9600x7200", OPTION_VAL_9600X7200_DE }, - { "10240x7680", OPTION_VAL_10240X7680_DE }, - { "10880x8160", OPTION_VAL_10880X8160_DE }, - { "11520x8640", OPTION_VAL_11520X8640_DE }, - { "12160x9120", OPTION_VAL_12160X9120_DE }, - { "12800x9600", OPTION_VAL_12800X9600_DE }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif - }, - { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_DE, - NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DE, - NULL, - "video", - { - { "VGA", OPTION_VAL_VGA_DE }, - { "TV (RGB)", OPTION_VAL_TV_RGB_DE }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_DE }, - { NULL, NULL }, - }, - "TV (Composite)", +/* RETRO_LANGUAGE_DA */ + +#define CATEGORY_SYSTEM_LABEL_DA NULL +#define CATEGORY_SYSTEM_INFO_0_DA NULL +#define CATEGORY_VIDEO_LABEL_DA NULL +#define CATEGORY_VIDEO_INFO_0_DA NULL +#define CATEGORY_PERFORMANCE_LABEL_DA NULL +#define CATEGORY_PERFORMANCE_INFO_0_DA NULL +#define CATEGORY_HACKS_LABEL_DA NULL +#define CATEGORY_HACKS_INFO_0_DA NULL +#define CATEGORY_INPUT_LABEL_DA NULL +#define CATEGORY_INPUT_INFO_0_DA NULL +#define CATEGORY_EXPANSIONS_LABEL_DA NULL +#define CATEGORY_EXPANSIONS_INFO_0_DA NULL +#define CATEGORY_VMU_LABEL_DA NULL +#define CATEGORY_VMU_INFO_0_DA NULL +#define CORE_OPTION_NAME_REGION_LABEL_DA NULL +#define OPTION_VAL_JAPAN_DA NULL +#define OPTION_VAL_USA_DA NULL +#define OPTION_VAL_EUROPE_DA NULL +#define OPTION_VAL_DEFAULT_DA NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_DA NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_DA NULL +#define OPTION_VAL_JAPANESE_DA NULL +#define OPTION_VAL_ENGLISH_DA NULL +#define OPTION_VAL_GERMAN_DA NULL +#define OPTION_VAL_FRENCH_DA NULL +#define OPTION_VAL_SPANISH_DA NULL +#define OPTION_VAL_ITALIAN_DA NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_DA NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_DA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DA NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_DA NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_DA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DA NULL +#define CORE_OPTION_NAME_UPNP_LABEL_DA NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_DA NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DA NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DA NULL +#define OPTION_VAL_320X240_DA NULL +#define OPTION_VAL_640X480_DA NULL +#define OPTION_VAL_800X600_DA NULL +#define OPTION_VAL_960X720_DA NULL +#define OPTION_VAL_1024X768_DA NULL +#define OPTION_VAL_1280X960_DA NULL +#define OPTION_VAL_1440X1080_DA NULL +#define OPTION_VAL_1600X1200_DA NULL +#define OPTION_VAL_1920X1440_DA NULL +#define OPTION_VAL_2560X1920_DA NULL +#define OPTION_VAL_2880X2160_DA NULL +#define OPTION_VAL_3200X2400_DA NULL +#define OPTION_VAL_3840X2880_DA NULL +#define OPTION_VAL_4480X3360_DA NULL +#define OPTION_VAL_5120X3840_DA NULL +#define OPTION_VAL_5760X4320_DA NULL +#define OPTION_VAL_6400X4800_DA NULL +#define OPTION_VAL_7040X5280_DA NULL +#define OPTION_VAL_7680X5760_DA NULL +#define OPTION_VAL_8320X6240_DA NULL +#define OPTION_VAL_8960X6720_DA NULL +#define OPTION_VAL_9600X7200_DA NULL +#define OPTION_VAL_10240X7680_DA NULL +#define OPTION_VAL_10880X8160_DA NULL +#define OPTION_VAL_11520X8640_DA NULL +#define OPTION_VAL_12160X9120_DA NULL +#define OPTION_VAL_12800X9600_DA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_DA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DA NULL +#define OPTION_VAL_VGA_DA NULL +#define OPTION_VAL_TV_RGB_DA NULL +#define OPTION_VAL_TV_COMPOSITE_DA NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_DA NULL +#define OPTION_VAL_NTSC_DA NULL +#define OPTION_VAL_PAL_DA NULL +#define OPTION_VAL_PAL_N_DA NULL +#define OPTION_VAL_PAL_M_DA NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DA NULL +#define OPTION_VAL_HORIZONTAL_DA NULL +#define OPTION_VAL_VERTICAL_DA NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DA NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_DA NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DA NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_DA NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_DA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DA NULL +#define OPTION_VAL_512MB_DA NULL +#define OPTION_VAL_1GB_DA NULL +#define OPTION_VAL_2GB_DA NULL +#define OPTION_VAL_4GB_DA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_DA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DA NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_DA NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_DA NULL +#define CORE_OPTION_NAME_FOG_LABEL_DA NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DA NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DA NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DA NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DA NULL +#define OPTION_VAL_1_DA NULL +#define OPTION_VAL_2_DA NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DA NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_DA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DA NULL +#define OPTION_VAL_2_O26_DA NULL +#define OPTION_VAL_4_DA NULL +#define OPTION_VAL_6_DA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_DA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_DA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_DA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DA NULL +#define OPTION_VAL_SOME_DA NULL +#define OPTION_VAL_MORE_DA NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DA NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_DA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_DA NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_DA NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_DA NULL +#define OPTION_VAL_100_DA NULL +#define OPTION_VAL_110_DA NULL +#define OPTION_VAL_120_DA NULL +#define OPTION_VAL_130_DA NULL +#define OPTION_VAL_140_DA NULL +#define OPTION_VAL_150_DA NULL +#define OPTION_VAL_160_DA NULL +#define OPTION_VAL_170_DA NULL +#define OPTION_VAL_180_DA NULL +#define OPTION_VAL_190_DA NULL +#define OPTION_VAL_200_DA NULL +#define OPTION_VAL_210_DA NULL +#define OPTION_VAL_220_DA NULL +#define OPTION_VAL_230_DA NULL +#define OPTION_VAL_240_DA NULL +#define OPTION_VAL_250_DA NULL +#define OPTION_VAL_260_DA NULL +#define OPTION_VAL_270_DA NULL +#define OPTION_VAL_280_DA NULL +#define OPTION_VAL_290_DA NULL +#define OPTION_VAL_300_DA NULL +#define OPTION_VAL_310_DA NULL +#define OPTION_VAL_320_DA NULL +#define OPTION_VAL_330_DA NULL +#define OPTION_VAL_340_DA NULL +#define OPTION_VAL_350_DA NULL +#define OPTION_VAL_360_DA NULL +#define OPTION_VAL_370_DA NULL +#define OPTION_VAL_380_DA NULL +#define OPTION_VAL_390_DA NULL +#define OPTION_VAL_400_DA NULL +#define OPTION_VAL_410_DA NULL +#define OPTION_VAL_420_DA NULL +#define OPTION_VAL_430_DA NULL +#define OPTION_VAL_440_DA NULL +#define OPTION_VAL_450_DA NULL +#define OPTION_VAL_460_DA NULL +#define OPTION_VAL_470_DA NULL +#define OPTION_VAL_480_DA NULL +#define OPTION_VAL_490_DA NULL +#define OPTION_VAL_500_DA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_DA NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DA NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_DA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_DA NULL +#define OPTION_VAL_0_DA NULL +#define OPTION_VAL_5_DA NULL +#define OPTION_VAL_10_DA NULL +#define OPTION_VAL_15_DA NULL +#define OPTION_VAL_20_DA NULL +#define OPTION_VAL_25_DA NULL +#define OPTION_VAL_30_DA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_DA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_DA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DA NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_DA NULL +#define OPTION_VAL_50_DA NULL +#define OPTION_VAL_60_DA NULL +#define OPTION_VAL_70_DA NULL +#define OPTION_VAL_80_DA NULL +#define OPTION_VAL_90_DA NULL +#define OPTION_VAL_100_O45_DA NULL +#define OPTION_VAL_110_O45_DA NULL +#define OPTION_VAL_120_O45_DA NULL +#define OPTION_VAL_130_O45_DA NULL +#define OPTION_VAL_140_O45_DA NULL +#define OPTION_VAL_150_O45_DA NULL +#define OPTION_VAL_160_O45_DA NULL +#define OPTION_VAL_170_O45_DA NULL +#define OPTION_VAL_180_O45_DA NULL +#define OPTION_VAL_190_O45_DA NULL +#define OPTION_VAL_200_O45_DA NULL +#define OPTION_VAL_210_O45_DA NULL +#define OPTION_VAL_220_O45_DA NULL +#define OPTION_VAL_230_O45_DA NULL +#define OPTION_VAL_240_O45_DA NULL +#define OPTION_VAL_250_O45_DA NULL +#define OPTION_VAL_260_O45_DA NULL +#define OPTION_VAL_270_O45_DA NULL +#define OPTION_VAL_280_O45_DA NULL +#define OPTION_VAL_290_O45_DA NULL +#define OPTION_VAL_300_O45_DA NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DA NULL +#define OPTION_VAL_WHITE_DA NULL +#define OPTION_VAL_RED_DA NULL +#define OPTION_VAL_GREEN_DA NULL +#define OPTION_VAL_BLUE_DA NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DA NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DA NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_DA NULL +#define OPTION_VAL_VMU_DA NULL +#define OPTION_VAL_PURUPURU_DA NULL +#define OPTION_VAL_NONE_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_DA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_DA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DA NULL +#define OPTION_VAL_VMU_A1_DA NULL +#define OPTION_VAL_ALL_VMUS_DA NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DA NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_DA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DA NULL +#define OPTION_VAL_UPPER_LEFT_DA NULL +#define OPTION_VAL_UPPER_RIGHT_DA NULL +#define OPTION_VAL_LOWER_LEFT_DA NULL +#define OPTION_VAL_LOWER_RIGHT_DA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DA NULL +#define OPTION_VAL_1X_DA NULL +#define OPTION_VAL_3X_DA NULL +#define OPTION_VAL_5X_DA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DA NULL +#define OPTION_VAL_DEFAULT_ON_00_DA NULL +#define OPTION_VAL_DEFAULT_OFF_01_DA NULL +#define OPTION_VAL_BLACK_02_DA NULL +#define OPTION_VAL_LIGHT_BLUE_04_DA NULL +#define OPTION_VAL_CYAN_06_DA NULL +#define OPTION_VAL_CYAN_BLUE_07_DA NULL +#define OPTION_VAL_LIGHT_GREEN_08_DA NULL +#define OPTION_VAL_CYAN_GREEN_09_DA NULL +#define OPTION_VAL_LIGHT_CYAN_10_DA NULL +#define OPTION_VAL_PURPLE_12_DA NULL +#define OPTION_VAL_LIGHT_PURPLE_13_DA NULL +#define OPTION_VAL_YELLOW_14_DA NULL +#define OPTION_VAL_GRAY_15_DA NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_DA NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_DA NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_DA NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_DA NULL +#define OPTION_VAL_LIGHT_RED_2_20_DA NULL +#define OPTION_VAL_MAGENTA_21_DA NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_DA NULL +#define OPTION_VAL_LIGHT_ORANGE_23_DA NULL +#define OPTION_VAL_ORANGE_24_DA NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_DA NULL +#define OPTION_VAL_LIGHT_YELLOW_26_DA NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_DA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DA NULL +#define OPTION_VAL_40_DA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DA NULL + +struct retro_core_option_v2_category option_cats_da[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_DA, + CATEGORY_SYSTEM_INFO_0_DA }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_DE, - NULL, - "", - NULL, "video", - { - { "NTSC", OPTION_VAL_NTSC_DE }, - { "PAL", OPTION_VAL_PAL_DE }, - { "PAL_N", OPTION_VAL_PAL_N_DE }, - { "PAL_M", OPTION_VAL_PAL_M_DE }, - { "Default", OPTION_VAL_DEFAULT_DE }, - { NULL, NULL }, - }, - "NTSC", + CATEGORY_VIDEO_LABEL_DA, + CATEGORY_VIDEO_INFO_0_DA }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DE, + "performance", + CATEGORY_PERFORMANCE_LABEL_DA, + CATEGORY_PERFORMANCE_INFO_0_DA + }, + { + "hacks", + CATEGORY_HACKS_LABEL_DA, + CATEGORY_HACKS_INFO_0_DA + }, + { + "input", + CATEGORY_INPUT_LABEL_DA, + CATEGORY_INPUT_INFO_0_DA + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_DA, + CATEGORY_EXPANSIONS_INFO_0_DA + }, + { + "vmu", + CATEGORY_VMU_LABEL_DA, + CATEGORY_VMU_INFO_0_DA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_da[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_DA, NULL, "", NULL, - "video", + "system", { - { "horizontal", OPTION_VAL_HORIZONTAL_DE }, - { "vertical", OPTION_VAL_VERTICAL_DE }, + { "Japan", OPTION_VAL_JAPAN_DA }, + { "USA", OPTION_VAL_USA_DA }, + { "Europe", OPTION_VAL_EUROPE_DA }, + { "Default", OPTION_VAL_DEFAULT_DA }, { NULL, NULL }, }, - "horizontal", + "USA", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DE, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_LANGUAGE_INFO_0_DA, NULL, - "video", + "system", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DE }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_DE }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_DE }, -#endif + { "Japanese", OPTION_VAL_JAPANESE_DA }, + { "English", OPTION_VAL_ENGLISH_DA }, + { "German", OPTION_VAL_GERMAN_DA }, + { "French", OPTION_VAL_FRENCH_DA }, + { "Spanish", OPTION_VAL_SPANISH_DA }, + { "Italian", OPTION_VAL_ITALIAN_DA }, + { "Default", OPTION_VAL_DEFAULT_DA }, { NULL, NULL }, }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + "English", }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DE, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_DA, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DE, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_DA, NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_DE }, - { "1GB", OPTION_VAL_1GB_DE }, - { "2GB", OPTION_VAL_2GB_DE }, - { "4GB", OPTION_VAL_4GB_DE }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, }, - "512MB", + "disabled", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_DE, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DA, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DE, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DA, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "32", + "disabled", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DE, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_DA, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DE, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DE, + { + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DA, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DE, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -16888,13 +18639,13 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_DE, + { + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -16903,26 +18654,26 @@ struct retro_core_option_v2_definition option_defs_de[] = { "enabled", }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_DE, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DE, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_DA, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DE, + CORE_OPTION_NAME_UPNP_INFO_0_DA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -16930,43 +18681,172 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, "enabled", }, + { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DE, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DA, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DE, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DA, NULL, "video", { - { "off", "disabled" }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, + { "320x240", OPTION_VAL_320X240_DA }, + { "640x480", OPTION_VAL_640X480_DA }, + { "800x600", OPTION_VAL_800X600_DA }, + { "960x720", OPTION_VAL_960X720_DA }, + { "1024x768", OPTION_VAL_1024X768_DA }, + { "1280x960", OPTION_VAL_1280X960_DA }, + { "1440x1080", OPTION_VAL_1440X1080_DA }, + { "1600x1200", OPTION_VAL_1600X1200_DA }, + { "1920x1440", OPTION_VAL_1920X1440_DA }, + { "2560x1920", OPTION_VAL_2560X1920_DA }, + { "2880x2160", OPTION_VAL_2880X2160_DA }, + { "3200x2400", OPTION_VAL_3200X2400_DA }, + { "3840x2880", OPTION_VAL_3840X2880_DA }, + { "4480x3360", OPTION_VAL_4480X3360_DA }, + { "5120x3840", OPTION_VAL_5120X3840_DA }, + { "5760x4320", OPTION_VAL_5760X4320_DA }, + { "6400x4800", OPTION_VAL_6400X4800_DA }, + { "7040x5280", OPTION_VAL_7040X5280_DA }, + { "7680x5760", OPTION_VAL_7680X5760_DA }, + { "8320x6240", OPTION_VAL_8320X6240_DA }, + { "8960x6720", OPTION_VAL_8960X6720_DA }, + { "9600x7200", OPTION_VAL_9600X7200_DA }, + { "10240x7680", OPTION_VAL_10240X7680_DA }, + { "10880x8160", OPTION_VAL_10880X8160_DA }, + { "11520x8640", OPTION_VAL_11520X8640_DA }, + { "12160x9120", OPTION_VAL_12160X9120_DA }, + { "12800x9600", OPTION_VAL_12800X9600_DA }, { NULL, NULL }, }, - "4", +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif }, { - CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DE, + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_DA, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DE, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DA, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_DE }, - { "1", OPTION_VAL_1_DE }, - { "2", OPTION_VAL_2_DE }, + { "VGA", OPTION_VAL_VGA_DA }, + { "TV (RGB)", OPTION_VAL_TV_RGB_DA }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_DA }, { NULL, NULL }, }, - "0", + "TV (Composite)", }, { - CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DE, + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_DA, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DE, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_DA }, + { "PAL", OPTION_VAL_PAL_DA }, + { "PAL_N", OPTION_VAL_PAL_N_DA }, + { "PAL_M", OPTION_VAL_PAL_M_DA }, + { "Default", OPTION_VAL_DEFAULT_DA }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DA, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_DA }, + { "vertical", OPTION_VAL_VERTICAL_DA }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DA, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_DA, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DA }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_DA }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_DA }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DA, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DA, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_DA }, + { "1GB", OPTION_VAL_1GB_DA }, + { "2GB", OPTION_VAL_2GB_DA }, + { "4GB", OPTION_VAL_4GB_DA }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_DA, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DA, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DA, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DA, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DA, NULL, "video", { @@ -16976,11 +18856,99 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_DA, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_DA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_DA, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DA, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DA, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DA, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DA, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DA, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_DA }, + { "1", OPTION_VAL_1_DA }, + { "2", OPTION_VAL_2_DA }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DA, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DE, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DA, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DE, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DA, NULL, "video", { @@ -16992,9 +18960,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DE, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DA, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DE, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DA, NULL, "video", { @@ -17007,25 +18975,25 @@ struct retro_core_option_v2_definition option_defs_de[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_DE, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_DA, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DE, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DA, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_DE }, - { "4", OPTION_VAL_4_DE }, - { "6", OPTION_VAL_6_DE }, + { "2", OPTION_VAL_2_O26_DA }, + { "4", OPTION_VAL_4_DA }, + { "6", OPTION_VAL_6_DA }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DE, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_DA, NULL, "video", { @@ -17039,9 +19007,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DE, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DA, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DE, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DA, NULL, "video", { @@ -17051,11 +19019,25 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_DA, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_DA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DE, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DA, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DE, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DA, NULL, "performance", { @@ -17067,15 +19049,15 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DE, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DA, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DE, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DA, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_DE }, - { "more", OPTION_VAL_MORE_DE }, + { "some", OPTION_VAL_SOME_DA }, + { "more", OPTION_VAL_MORE_DA }, { NULL, NULL }, }, #ifdef LOW_END @@ -17086,9 +19068,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DE, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DA, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DE, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DA, NULL, "performance", { @@ -17105,9 +19087,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DE, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DA, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DE, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DA, NULL, "hacks", { @@ -17119,9 +19101,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DE, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DA, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DE, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DA, NULL, "hacks", { @@ -17133,9 +19115,9 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DE, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DA, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DE, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DA, NULL, "hacks", { @@ -17149,64 +19131,78 @@ struct retro_core_option_v2_definition option_defs_de[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_DA, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_DA, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_DE, + CORE_OPTION_NAME_SH4CLOCK_LABEL_DA, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_DE, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_DA, NULL, "hacks", { - { "100", OPTION_VAL_100_DE }, - { "110", OPTION_VAL_110_DE }, - { "120", OPTION_VAL_120_DE }, - { "130", OPTION_VAL_130_DE }, - { "140", OPTION_VAL_140_DE }, - { "150", OPTION_VAL_150_DE }, - { "160", OPTION_VAL_160_DE }, - { "170", OPTION_VAL_170_DE }, - { "180", OPTION_VAL_180_DE }, - { "190", OPTION_VAL_190_DE }, - { "200", OPTION_VAL_200_DE }, - { "210", OPTION_VAL_210_DE }, - { "220", OPTION_VAL_220_DE }, - { "230", OPTION_VAL_230_DE }, - { "240", OPTION_VAL_240_DE }, - { "250", OPTION_VAL_250_DE }, - { "260", OPTION_VAL_260_DE }, - { "270", OPTION_VAL_270_DE }, - { "280", OPTION_VAL_280_DE }, - { "290", OPTION_VAL_290_DE }, - { "300", OPTION_VAL_300_DE }, - { "310", OPTION_VAL_310_DE }, - { "320", OPTION_VAL_320_DE }, - { "330", OPTION_VAL_330_DE }, - { "340", OPTION_VAL_340_DE }, - { "350", OPTION_VAL_350_DE }, - { "360", OPTION_VAL_360_DE }, - { "370", OPTION_VAL_370_DE }, - { "380", OPTION_VAL_380_DE }, - { "390", OPTION_VAL_390_DE }, - { "400", OPTION_VAL_400_DE }, - { "410", OPTION_VAL_410_DE }, - { "420", OPTION_VAL_420_DE }, - { "430", OPTION_VAL_430_DE }, - { "440", OPTION_VAL_440_DE }, - { "450", OPTION_VAL_450_DE }, - { "460", OPTION_VAL_460_DE }, - { "470", OPTION_VAL_470_DE }, - { "480", OPTION_VAL_480_DE }, - { "490", OPTION_VAL_490_DE }, - { "500", OPTION_VAL_500_DE }, + { "100", OPTION_VAL_100_DA }, + { "110", OPTION_VAL_110_DA }, + { "120", OPTION_VAL_120_DA }, + { "130", OPTION_VAL_130_DA }, + { "140", OPTION_VAL_140_DA }, + { "150", OPTION_VAL_150_DA }, + { "160", OPTION_VAL_160_DA }, + { "170", OPTION_VAL_170_DA }, + { "180", OPTION_VAL_180_DA }, + { "190", OPTION_VAL_190_DA }, + { "200", OPTION_VAL_200_DA }, + { "210", OPTION_VAL_210_DA }, + { "220", OPTION_VAL_220_DA }, + { "230", OPTION_VAL_230_DA }, + { "240", OPTION_VAL_240_DA }, + { "250", OPTION_VAL_250_DA }, + { "260", OPTION_VAL_260_DA }, + { "270", OPTION_VAL_270_DA }, + { "280", OPTION_VAL_280_DA }, + { "290", OPTION_VAL_290_DA }, + { "300", OPTION_VAL_300_DA }, + { "310", OPTION_VAL_310_DA }, + { "320", OPTION_VAL_320_DA }, + { "330", OPTION_VAL_330_DA }, + { "340", OPTION_VAL_340_DA }, + { "350", OPTION_VAL_350_DA }, + { "360", OPTION_VAL_360_DA }, + { "370", OPTION_VAL_370_DA }, + { "380", OPTION_VAL_380_DA }, + { "390", OPTION_VAL_390_DA }, + { "400", OPTION_VAL_400_DA }, + { "410", OPTION_VAL_410_DA }, + { "420", OPTION_VAL_420_DA }, + { "430", OPTION_VAL_430_DA }, + { "440", OPTION_VAL_440_DA }, + { "450", OPTION_VAL_450_DA }, + { "460", OPTION_VAL_460_DA }, + { "470", OPTION_VAL_470_DA }, + { "480", OPTION_VAL_480_DA }, + { "490", OPTION_VAL_490_DA }, + { "500", OPTION_VAL_500_DA }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DE, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_DA, NULL, "hacks", { @@ -17216,11 +19212,11 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DE, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_DA, NULL, "hacks", { @@ -17232,47 +19228,47 @@ struct retro_core_option_v2_definition option_defs_de[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DE, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_DA, NULL, "input", { - { "0%", OPTION_VAL_0_DE }, - { "5%", OPTION_VAL_5_DE }, - { "10%", OPTION_VAL_10_DE }, - { "15%", OPTION_VAL_15_DE }, - { "20%", OPTION_VAL_20_DE }, - { "25%", OPTION_VAL_25_DE }, - { "30%", OPTION_VAL_30_DE }, + { "0%", OPTION_VAL_0_DA }, + { "5%", OPTION_VAL_5_DA }, + { "10%", OPTION_VAL_10_DA }, + { "15%", OPTION_VAL_15_DA }, + { "20%", OPTION_VAL_20_DA }, + { "25%", OPTION_VAL_25_DA }, + { "30%", OPTION_VAL_30_DA }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DE, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_DA, NULL, "input", { - { "0%", OPTION_VAL_0_DE }, - { "5%", OPTION_VAL_5_DE }, - { "10%", OPTION_VAL_10_DE }, - { "15%", OPTION_VAL_15_DE }, - { "20%", OPTION_VAL_20_DE }, - { "25%", OPTION_VAL_25_DE }, - { "30%", OPTION_VAL_30_DE }, + { "0%", OPTION_VAL_0_DA }, + { "5%", OPTION_VAL_5_DA }, + { "10%", OPTION_VAL_10_DA }, + { "15%", OPTION_VAL_15_DA }, + { "20%", OPTION_VAL_20_DA }, + { "25%", OPTION_VAL_25_DA }, + { "30%", OPTION_VAL_30_DA }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DE, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_DA, NULL, "input", { @@ -17283,10 +19279,10 @@ struct retro_core_option_v2_definition option_defs_de[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_DE, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DA, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_DE, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DA, NULL, "input", { @@ -17294,300 +19290,293 @@ struct retro_core_option_v2_definition option_defs_de[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DE, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DA, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DE, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DA, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DE, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_DA, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DE, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_DA }, + { "60%", OPTION_VAL_60_DA }, + { "70%", OPTION_VAL_70_DA }, + { "80%", OPTION_VAL_80_DA }, + { "90%", OPTION_VAL_90_DA }, + { "100%", OPTION_VAL_100_O45_DA }, + { "110%", OPTION_VAL_110_O45_DA }, + { "120%", OPTION_VAL_120_O45_DA }, + { "130%", OPTION_VAL_130_O45_DA }, + { "140%", OPTION_VAL_140_O45_DA }, + { "150%", OPTION_VAL_150_O45_DA }, + { "160%", OPTION_VAL_160_O45_DA }, + { "170%", OPTION_VAL_170_O45_DA }, + { "180%", OPTION_VAL_180_O45_DA }, + { "190%", OPTION_VAL_190_O45_DA }, + { "200%", OPTION_VAL_200_O45_DA }, + { "210%", OPTION_VAL_210_O45_DA }, + { "220%", OPTION_VAL_220_O45_DA }, + { "230%", OPTION_VAL_230_O45_DA }, + { "240%", OPTION_VAL_240_O45_DA }, + { "250%", OPTION_VAL_250_O45_DA }, + { "260%", OPTION_VAL_260_O45_DA }, + { "270%", OPTION_VAL_270_O45_DA }, + { "280%", OPTION_VAL_280_O45_DA }, + { "290%", OPTION_VAL_290_O45_DA }, + { "300%", OPTION_VAL_300_O45_DA }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DE, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DE }, - { "Red", OPTION_VAL_RED_DE }, - { "Green", OPTION_VAL_GREEN_DE }, - { "Blue", OPTION_VAL_BLUE_DE }, + { "White", OPTION_VAL_WHITE_DA }, + { "Red", OPTION_VAL_RED_DA }, + { "Green", OPTION_VAL_GREEN_DA }, + { "Blue", OPTION_VAL_BLUE_DA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DE, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DE }, - { "Red", OPTION_VAL_RED_DE }, - { "Green", OPTION_VAL_GREEN_DE }, - { "Blue", OPTION_VAL_BLUE_DE }, + { "White", OPTION_VAL_WHITE_DA }, + { "Red", OPTION_VAL_RED_DA }, + { "Green", OPTION_VAL_GREEN_DA }, + { "Blue", OPTION_VAL_BLUE_DA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DE, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DE }, - { "Red", OPTION_VAL_RED_DE }, - { "Green", OPTION_VAL_GREEN_DE }, - { "Blue", OPTION_VAL_BLUE_DE }, + { "White", OPTION_VAL_WHITE_DA }, + { "Red", OPTION_VAL_RED_DA }, + { "Green", OPTION_VAL_GREEN_DA }, + { "Blue", OPTION_VAL_BLUE_DA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DE, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_DE }, - { "Red", OPTION_VAL_RED_DE }, - { "Green", OPTION_VAL_GREEN_DE }, - { "Blue", OPTION_VAL_BLUE_DE }, + { "White", OPTION_VAL_WHITE_DA }, + { "Red", OPTION_VAL_RED_DA }, + { "Green", OPTION_VAL_GREEN_DA }, + { "Blue", OPTION_VAL_BLUE_DA }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DE, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_DA, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_DA, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_DE }, - { "All VMUs", OPTION_VAL_ALL_VMUS_DE }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_DE, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DE, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_DE, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_DA, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_DA, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DE, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_DA, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_DA, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DE, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_DA, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DE, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_DA, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DE, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_DA, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_DE }, - { "2x", OPTION_VAL_2_O27_DE }, - { "3x", OPTION_VAL_3X_DE }, - { "4x", OPTION_VAL_4_DE }, - { "5x", OPTION_VAL_5X_DE }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DE, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_DA, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DE, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_DA, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_DA, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "VMU", OPTION_VAL_VMU_DA }, + { "Purupuru", OPTION_VAL_PURUPURU_DA }, + { "None", OPTION_VAL_NONE_DA }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DE, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DA, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_DA }, + { "All VMUs", OPTION_VAL_ALL_VMUS_DA }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_DA, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DA, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_DA, NULL, "vmu", { - { "10%", OPTION_VAL_10_DE }, - { "20%", OPTION_VAL_20_DE }, - { "30%", OPTION_VAL_30_DE }, - { "40%", OPTION_VAL_40_DE }, - { "50%", OPTION_VAL_50_DE }, - { "60%", OPTION_VAL_60_DE }, - { "70%", OPTION_VAL_70_DE }, - { "80%", OPTION_VAL_80_DE }, - { "90%", OPTION_VAL_90_DE }, - { "100%", OPTION_VAL_100_O57_DE }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DE, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DA, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DA, NULL, "", NULL, @@ -17600,145 +19589,145 @@ struct retro_core_option_v2_definition option_defs_de[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DE, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DE, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DE }, - { "2x", OPTION_VAL_2_O27_DE }, - { "3x", OPTION_VAL_3X_DE }, - { "4x", OPTION_VAL_4_DE }, - { "5x", OPTION_VAL_5X_DE }, + { "1x", OPTION_VAL_1X_DA }, + { "2x", OPTION_VAL_2_O26_DA }, + { "3x", OPTION_VAL_3X_DA }, + { "4x", OPTION_VAL_4_DA }, + { "5x", OPTION_VAL_5X_DA }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DE, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DE }, - { "20%", OPTION_VAL_20_DE }, - { "30%", OPTION_VAL_30_DE }, - { "40%", OPTION_VAL_40_DE }, - { "50%", OPTION_VAL_50_DE }, - { "60%", OPTION_VAL_60_DE }, - { "70%", OPTION_VAL_70_DE }, - { "80%", OPTION_VAL_80_DE }, - { "90%", OPTION_VAL_90_DE }, - { "100%", OPTION_VAL_100_O57_DE }, + { "10%", OPTION_VAL_10_DA }, + { "20%", OPTION_VAL_20_DA }, + { "30%", OPTION_VAL_30_DA }, + { "40%", OPTION_VAL_40_DA }, + { "50%", OPTION_VAL_50_DA }, + { "60%", OPTION_VAL_60_DA }, + { "70%", OPTION_VAL_70_DA }, + { "80%", OPTION_VAL_80_DA }, + { "90%", OPTION_VAL_90_DA }, + { "100%", OPTION_VAL_100_O45_DA }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DE, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DA, NULL, "", NULL, @@ -17751,145 +19740,145 @@ struct retro_core_option_v2_definition option_defs_de[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DE, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DE, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DE }, - { "2x", OPTION_VAL_2_O27_DE }, - { "3x", OPTION_VAL_3X_DE }, - { "4x", OPTION_VAL_4_DE }, - { "5x", OPTION_VAL_5X_DE }, + { "1x", OPTION_VAL_1X_DA }, + { "2x", OPTION_VAL_2_O26_DA }, + { "3x", OPTION_VAL_3X_DA }, + { "4x", OPTION_VAL_4_DA }, + { "5x", OPTION_VAL_5X_DA }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DE, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DE }, - { "20%", OPTION_VAL_20_DE }, - { "30%", OPTION_VAL_30_DE }, - { "40%", OPTION_VAL_40_DE }, - { "50%", OPTION_VAL_50_DE }, - { "60%", OPTION_VAL_60_DE }, - { "70%", OPTION_VAL_70_DE }, - { "80%", OPTION_VAL_80_DE }, - { "90%", OPTION_VAL_90_DE }, - { "100%", OPTION_VAL_100_O57_DE }, + { "10%", OPTION_VAL_10_DA }, + { "20%", OPTION_VAL_20_DA }, + { "30%", OPTION_VAL_30_DA }, + { "40%", OPTION_VAL_40_DA }, + { "50%", OPTION_VAL_50_DA }, + { "60%", OPTION_VAL_60_DA }, + { "70%", OPTION_VAL_70_DA }, + { "80%", OPTION_VAL_80_DA }, + { "90%", OPTION_VAL_90_DA }, + { "100%", OPTION_VAL_100_O45_DA }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DE, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DA, NULL, "", NULL, @@ -17902,534 +19891,726 @@ struct retro_core_option_v2_definition option_defs_de[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DE, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DE, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_DE }, - { "2x", OPTION_VAL_2_O27_DE }, - { "3x", OPTION_VAL_3X_DE }, - { "4x", OPTION_VAL_4_DE }, - { "5x", OPTION_VAL_5X_DE }, + { "1x", OPTION_VAL_1X_DA }, + { "2x", OPTION_VAL_2_O26_DA }, + { "3x", OPTION_VAL_3X_DA }, + { "4x", OPTION_VAL_4_DA }, + { "5x", OPTION_VAL_5X_DA }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DE, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, - { "BLACK 02", OPTION_VAL_BLACK_02_DE }, - { "BLUE 03", OPTION_VAL_BLUE_DE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, - { "GREEN 05", OPTION_VAL_GREEN_DE }, - { "CYAN 06", OPTION_VAL_CYAN_06_DE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, - { "RED 11", OPTION_VAL_RED_DE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, - { "GRAY 15", OPTION_VAL_GRAY_15_DE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, - { "WHITE 28", OPTION_VAL_WHITE_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DE, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_DE }, - { "20%", OPTION_VAL_20_DE }, - { "30%", OPTION_VAL_30_DE }, - { "40%", OPTION_VAL_40_DE }, - { "50%", OPTION_VAL_50_DE }, - { "60%", OPTION_VAL_60_DE }, - { "70%", OPTION_VAL_70_DE }, - { "80%", OPTION_VAL_80_DE }, - { "90%", OPTION_VAL_90_DE }, - { "100%", OPTION_VAL_100_O57_DE }, + { "10%", OPTION_VAL_10_DA }, + { "20%", OPTION_VAL_20_DA }, + { "30%", OPTION_VAL_30_DA }, + { "40%", OPTION_VAL_40_DA }, + { "50%", OPTION_VAL_50_DA }, + { "60%", OPTION_VAL_60_DA }, + { "70%", OPTION_VAL_70_DA }, + { "80%", OPTION_VAL_80_DA }, + { "90%", OPTION_VAL_90_DA }, + { "100%", OPTION_VAL_100_O45_DA }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_de = { - option_cats_de, - option_defs_de -}; - -/* RETRO_LANGUAGE_EL */ - -#define CATEGORY_SYSTEM_LABEL_EL "Σύστημα" -#define CATEGORY_SYSTEM_INFO_0_EL NULL -#define CATEGORY_VIDEO_LABEL_EL "Οδηγός Βίντεο" -#define CATEGORY_VIDEO_INFO_0_EL NULL -#define CATEGORY_PERFORMANCE_LABEL_EL "Επίδοση" -#define CATEGORY_PERFORMANCE_INFO_0_EL NULL -#define CATEGORY_HACKS_LABEL_EL NULL -#define CATEGORY_HACKS_INFO_0_EL NULL -#define CATEGORY_INPUT_LABEL_EL "Οδηγός Εισαγωγής" -#define CATEGORY_INPUT_INFO_0_EL NULL -#define CATEGORY_VMU_LABEL_EL NULL -#define CATEGORY_VMU_INFO_0_EL NULL -#define CORE_OPTION_NAME_REGION_LABEL_EL "Περιοχή" -#define OPTION_VAL_JAPAN_EL NULL -#define OPTION_VAL_USA_EL NULL -#define OPTION_VAL_EUROPE_EL NULL -#define OPTION_VAL_DEFAULT_EL "Προκαθορισμένο" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_EL "Γλώσσα" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EL NULL -#define OPTION_VAL_JAPANESE_EL "Ιαπωνικά" -#define OPTION_VAL_ENGLISH_EL "Αγγλικά" -#define OPTION_VAL_GERMAN_EL "Γερμανός" -#define OPTION_VAL_FRENCH_EL "Γαλλική γλώσσα" -#define OPTION_VAL_SPANISH_EL "Ισπανικά" -#define OPTION_VAL_ITALIAN_EL "Ιταλικά" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EL NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_EL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EL NULL -#define CORE_OPTION_NAME_UPNP_LABEL_EL NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_EL NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EL NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EL NULL -#define OPTION_VAL_320X240_EL NULL -#define OPTION_VAL_640X480_EL NULL -#define OPTION_VAL_800X600_EL NULL -#define OPTION_VAL_960X720_EL NULL -#define OPTION_VAL_1024X768_EL NULL -#define OPTION_VAL_1280X960_EL NULL -#define OPTION_VAL_1440X1080_EL NULL -#define OPTION_VAL_1600X1200_EL NULL -#define OPTION_VAL_1920X1440_EL NULL -#define OPTION_VAL_2560X1920_EL NULL -#define OPTION_VAL_2880X2160_EL NULL -#define OPTION_VAL_3200X2400_EL NULL -#define OPTION_VAL_3840X2880_EL NULL -#define OPTION_VAL_4480X3360_EL NULL -#define OPTION_VAL_5120X3840_EL NULL -#define OPTION_VAL_5760X4320_EL NULL -#define OPTION_VAL_6400X4800_EL NULL -#define OPTION_VAL_7040X5280_EL NULL -#define OPTION_VAL_7680X5760_EL NULL -#define OPTION_VAL_8320X6240_EL NULL -#define OPTION_VAL_8960X6720_EL NULL -#define OPTION_VAL_9600X7200_EL NULL -#define OPTION_VAL_10240X7680_EL NULL -#define OPTION_VAL_10880X8160_EL NULL -#define OPTION_VAL_11520X8640_EL NULL -#define OPTION_VAL_12160X9120_EL NULL -#define OPTION_VAL_12800X9600_EL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EL NULL -#define OPTION_VAL_VGA_EL NULL -#define OPTION_VAL_TV_RGB_EL NULL -#define OPTION_VAL_TV_COMPOSITE_EL NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_EL NULL -#define OPTION_VAL_NTSC_EL NULL -#define OPTION_VAL_PAL_EL NULL -#define OPTION_VAL_PAL_N_EL NULL -#define OPTION_VAL_PAL_M_EL NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EL "Περιστροφή οθόνης" -#define OPTION_VAL_HORIZONTAL_EL NULL -#define OPTION_VAL_VERTICAL_EL NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EL NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EL NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_EL NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_EL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EL NULL -#define OPTION_VAL_512MB_EL NULL -#define OPTION_VAL_1GB_EL NULL -#define OPTION_VAL_2GB_EL NULL -#define OPTION_VAL_4GB_EL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EL NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EL NULL -#define CORE_OPTION_NAME_FOG_LABEL_EL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EL NULL -#define OPTION_VAL_1_EL NULL -#define OPTION_VAL_2_EL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EL NULL -#define OPTION_VAL_2_O27_EL NULL -#define OPTION_VAL_4_EL NULL -#define OPTION_VAL_6_EL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EL NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EL NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EL NULL -#define OPTION_VAL_SOME_EL "Φυσιολογικά" -#define OPTION_VAL_MORE_EL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EL NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EL NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EL NULL -#define OPTION_VAL_100_EL NULL -#define OPTION_VAL_110_EL NULL -#define OPTION_VAL_120_EL NULL -#define OPTION_VAL_130_EL NULL -#define OPTION_VAL_140_EL NULL -#define OPTION_VAL_150_EL NULL -#define OPTION_VAL_160_EL NULL -#define OPTION_VAL_170_EL NULL -#define OPTION_VAL_180_EL NULL -#define OPTION_VAL_190_EL NULL -#define OPTION_VAL_200_EL NULL -#define OPTION_VAL_210_EL NULL -#define OPTION_VAL_220_EL NULL -#define OPTION_VAL_230_EL NULL -#define OPTION_VAL_240_EL NULL -#define OPTION_VAL_250_EL NULL -#define OPTION_VAL_260_EL NULL -#define OPTION_VAL_270_EL NULL -#define OPTION_VAL_280_EL NULL -#define OPTION_VAL_290_EL NULL -#define OPTION_VAL_300_EL NULL -#define OPTION_VAL_310_EL NULL -#define OPTION_VAL_320_EL NULL -#define OPTION_VAL_330_EL NULL -#define OPTION_VAL_340_EL NULL -#define OPTION_VAL_350_EL NULL -#define OPTION_VAL_360_EL NULL -#define OPTION_VAL_370_EL NULL -#define OPTION_VAL_380_EL NULL -#define OPTION_VAL_390_EL NULL -#define OPTION_VAL_400_EL NULL -#define OPTION_VAL_410_EL NULL -#define OPTION_VAL_420_EL NULL -#define OPTION_VAL_430_EL NULL -#define OPTION_VAL_440_EL NULL -#define OPTION_VAL_450_EL NULL -#define OPTION_VAL_460_EL NULL -#define OPTION_VAL_470_EL NULL -#define OPTION_VAL_480_EL NULL -#define OPTION_VAL_490_EL NULL -#define OPTION_VAL_500_EL NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EL NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EL NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EL NULL -#define OPTION_VAL_0_EL NULL -#define OPTION_VAL_5_EL NULL -#define OPTION_VAL_10_EL NULL -#define OPTION_VAL_15_EL NULL -#define OPTION_VAL_20_EL NULL -#define OPTION_VAL_25_EL NULL -#define OPTION_VAL_30_EL NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EL NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EL NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EL NULL -#define OPTION_VAL_WHITE_EL NULL -#define OPTION_VAL_RED_EL "Κόκκινο" -#define OPTION_VAL_GREEN_EL "Πράσινο" -#define OPTION_VAL_BLUE_EL "Μπλε" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EL NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EL NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EL NULL -#define OPTION_VAL_VMU_A1_EL NULL -#define OPTION_VAL_ALL_VMUS_EL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EL NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EL NULL -#define OPTION_VAL_UPPER_LEFT_EL NULL -#define OPTION_VAL_UPPER_RIGHT_EL NULL -#define OPTION_VAL_LOWER_LEFT_EL NULL -#define OPTION_VAL_LOWER_RIGHT_EL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EL NULL -#define OPTION_VAL_1X_EL NULL -#define OPTION_VAL_3X_EL NULL -#define OPTION_VAL_5X_EL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EL NULL -#define OPTION_VAL_DEFAULT_ON_00_EL NULL -#define OPTION_VAL_DEFAULT_OFF_01_EL NULL -#define OPTION_VAL_BLACK_02_EL NULL -#define OPTION_VAL_LIGHT_BLUE_04_EL NULL -#define OPTION_VAL_CYAN_06_EL NULL -#define OPTION_VAL_CYAN_BLUE_07_EL NULL -#define OPTION_VAL_LIGHT_GREEN_08_EL NULL -#define OPTION_VAL_CYAN_GREEN_09_EL NULL -#define OPTION_VAL_LIGHT_CYAN_10_EL NULL -#define OPTION_VAL_PURPLE_12_EL NULL -#define OPTION_VAL_LIGHT_PURPLE_13_EL NULL -#define OPTION_VAL_YELLOW_14_EL "Κίτρινο" -#define OPTION_VAL_GRAY_15_EL NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_EL NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_EL NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_EL NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_EL NULL -#define OPTION_VAL_LIGHT_RED_2_20_EL NULL -#define OPTION_VAL_MAGENTA_21_EL NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_EL NULL -#define OPTION_VAL_LIGHT_ORANGE_23_EL NULL -#define OPTION_VAL_ORANGE_24_EL NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_EL NULL -#define OPTION_VAL_LIGHT_YELLOW_26_EL NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_EL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EL NULL -#define OPTION_VAL_40_EL NULL -#define OPTION_VAL_50_EL NULL -#define OPTION_VAL_60_EL NULL -#define OPTION_VAL_70_EL NULL -#define OPTION_VAL_80_EL "το 80%" -#define OPTION_VAL_90_EL NULL -#define OPTION_VAL_100_O57_EL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EL NULL - -struct retro_core_option_v2_category option_cats_el[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_EL, - CATEGORY_SYSTEM_INFO_0_EL - }, - { - "video", - CATEGORY_VIDEO_LABEL_EL, - CATEGORY_VIDEO_INFO_0_EL - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_EL, - CATEGORY_PERFORMANCE_INFO_0_EL - }, - { - "hacks", - CATEGORY_HACKS_LABEL_EL, - CATEGORY_HACKS_INFO_0_EL - }, - { - "input", - CATEGORY_INPUT_LABEL_EL, - CATEGORY_INPUT_INFO_0_EL - }, - { - "vmu", - CATEGORY_VMU_LABEL_EL, - CATEGORY_VMU_INFO_0_EL - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_el[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_EL, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DA, NULL, "", NULL, - "system", + "vmu", { - { "Japan", OPTION_VAL_JAPAN_EL }, - { "USA", OPTION_VAL_USA_EL }, - { "Europe", OPTION_VAL_EUROPE_EL }, - { "Default", OPTION_VAL_DEFAULT_EL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "USA", + "disabled", }, { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_EL, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DA, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_EL, + "", NULL, - "system", + "vmu", { - { "Japanese", OPTION_VAL_JAPANESE_EL }, - { "English", OPTION_VAL_ENGLISH_EL }, - { "German", OPTION_VAL_GERMAN_EL }, - { "French", OPTION_VAL_FRENCH_EL }, - { "Spanish", OPTION_VAL_SPANISH_EL }, - { "Italian", OPTION_VAL_ITALIAN_EL }, - { "Default", OPTION_VAL_DEFAULT_EL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DA }, { NULL, NULL }, }, - "English", + "Lower Right", }, { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_EL, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DA, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_EL, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, + { "1x", OPTION_VAL_1X_DA }, + { "2x", OPTION_VAL_2_O26_DA }, + { "3x", OPTION_VAL_3X_DA }, + { "4x", OPTION_VAL_4_DA }, + { "5x", OPTION_VAL_5X_DA }, + { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EL, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DA, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DA, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DA }, + { "BLACK 02", OPTION_VAL_BLACK_02_DA }, + { "BLUE 03", OPTION_VAL_BLUE_DA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DA }, + { "GREEN 05", OPTION_VAL_GREEN_DA }, + { "CYAN 06", OPTION_VAL_CYAN_06_DA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DA }, + { "RED 11", OPTION_VAL_RED_DA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DA }, + { "GRAY 15", OPTION_VAL_GRAY_15_DA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DA }, + { "WHITE 28", OPTION_VAL_WHITE_DA }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DA, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_DA }, + { "20%", OPTION_VAL_20_DA }, + { "30%", OPTION_VAL_30_DA }, + { "40%", OPTION_VAL_40_DA }, + { "50%", OPTION_VAL_50_DA }, + { "60%", OPTION_VAL_60_DA }, + { "70%", OPTION_VAL_70_DA }, + { "80%", OPTION_VAL_80_DA }, + { "90%", OPTION_VAL_90_DA }, + { "100%", OPTION_VAL_100_O45_DA }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_da = { + option_cats_da, + option_defs_da +}; + +/* RETRO_LANGUAGE_DE */ + +#define CATEGORY_SYSTEM_LABEL_DE NULL +#define CATEGORY_SYSTEM_INFO_0_DE "Region, Sprache, BIOS und Basis-Hardware-Einstellungen konfigurieren." +#define CATEGORY_VIDEO_LABEL_DE NULL +#define CATEGORY_VIDEO_INFO_0_DE "Einstellungen für Auflösung, reihenfolgeunabhängige Transparenz und visuelle Effekte konfigurieren." +#define CATEGORY_PERFORMANCE_LABEL_DE "Leistung" +#define CATEGORY_PERFORMANCE_INFO_0_DE "Einstellungen für Threaded Rendering und Bilder überspringen ändern." +#define CATEGORY_HACKS_LABEL_DE "Emulations-Hacks" +#define CATEGORY_HACKS_INFO_0_DE "Breitbildüberschreibungen, GD-ROM-Ladegeschwindigkeit und Texturaustauscheinstellungen konfigurieren." +#define CATEGORY_INPUT_LABEL_DE "Eingabe" +#define CATEGORY_INPUT_INFO_0_DE "Gamepad- und Lightgun-Einstellungen konfigurieren." +#define CATEGORY_EXPANSIONS_LABEL_DE "Controllererweiterungsslots" +#define CATEGORY_EXPANSIONS_INFO_0_DE "Das Gerät (VMU, Rumpelgerät) auswählen, das am jeweiligen Controllererweiterungsslot angeschlossen ist." +#define CATEGORY_VMU_LABEL_DE NULL +#define CATEGORY_VMU_INFO_0_DE "Konfiguriert die VMU-Speicherdateien pro Spiel und die VMU-Sichtbarkeitseinstellungen auf dem Bildschirm." +#define CORE_OPTION_NAME_REGION_LABEL_DE NULL +#define OPTION_VAL_JAPAN_DE NULL +#define OPTION_VAL_USA_DE NULL +#define OPTION_VAL_EUROPE_DE "Europa" +#define OPTION_VAL_DEFAULT_DE "Standard" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_DE "Sprache" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_DE "Ändert die Sprache, die vom BIOS und von Spielen verwendet wird, die mehrere Sprachen enthalten." +#define OPTION_VAL_JAPANESE_DE "Japanisch" +#define OPTION_VAL_ENGLISH_DE "Englisch" +#define OPTION_VAL_GERMAN_DE "Deutsch" +#define OPTION_VAL_FRENCH_DE "Französisch" +#define OPTION_VAL_SPANISH_DE "Spanisch" +#define OPTION_VAL_ITALIAN_DE "Italienisch" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_DE "HLE BIOS (Neustart erforderlich)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_DE "Erzwingt die Verwendung von High-Level-Emulation-BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DE "BIOS starten (Neustart erforderlich)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DE "Direkt ins Dreamcast-BIOS-Menü starten." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_DE "DSP aktivieren" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DE "Aktiviert Emulation von DSP des Dreamcasts (digitaler Signalprozessor). Verbessert die Genauigkeit des erzeugten Klanges, erhöht aber die Leistungsanforderungen." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DE "Arcade-Servicetasten erlauben" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DE "Aktiviert den SERVICE-Knopf für Arcadespiele, um die Cabineteinstellungen aufzurufen." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DE "NAOMI-Spiele auf kostenloses Spiel setzen" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DE "Ändert die Münzeinstellungen des Spiels zu kostenlos." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_DE "Breitbandadapter-Emulation" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DE "Den Ethernet-Breitbandadapter anstelle des Modems emulieren. (Neustart erforderlich)" +#define CORE_OPTION_NAME_UPNP_LABEL_DE "UPnP aktivieren" +#define CORE_OPTION_NAME_UPNP_INFO_0_DE "Verwendet UPnP, um den Internetrouter automatisch für Onlinespiele zu konfigurieren." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DE "Interne Auflösung" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DE "Rendering-Auflösung ändern." +#define OPTION_VAL_320X240_DE "320×240 (Halb)" +#define OPTION_VAL_640X480_DE "640×480 (Nativ)" +#define OPTION_VAL_800X600_DE "800×600 (×1,25)" +#define OPTION_VAL_960X720_DE "960×720 (×1,5)" +#define OPTION_VAL_1024X768_DE "1024×768 (×1,6)" +#define OPTION_VAL_1280X960_DE "1280×960 (×2)" +#define OPTION_VAL_1440X1080_DE "1440×1080 (×2,25)" +#define OPTION_VAL_1600X1200_DE "1600×1200 (×2,5)" +#define OPTION_VAL_1920X1440_DE "1920×1440 (×3)" +#define OPTION_VAL_2560X1920_DE "2560×1920 (×4)" +#define OPTION_VAL_2880X2160_DE "2880×2160 (×4,5)" +#define OPTION_VAL_3200X2400_DE "3200×2400 (×5)" +#define OPTION_VAL_3840X2880_DE "3840×2880 (×6)" +#define OPTION_VAL_4480X3360_DE "4480×3360 (×7)" +#define OPTION_VAL_5120X3840_DE "5120×3840 (×8)" +#define OPTION_VAL_5760X4320_DE "5760×4320 (×9)" +#define OPTION_VAL_6400X4800_DE "6400×4800 (×10)" +#define OPTION_VAL_7040X5280_DE "7040×5280 (×11)" +#define OPTION_VAL_7680X5760_DE "7680×5760 (×12)" +#define OPTION_VAL_8320X6240_DE "8320×6240 (×13)" +#define OPTION_VAL_8960X6720_DE "8960×6720 (×14)" +#define OPTION_VAL_9600X7200_DE "9600×7200 (×15)" +#define OPTION_VAL_10240X7680_DE "10240×7680 (×6)" +#define OPTION_VAL_10880X8160_DE "10880×8160 (×17)" +#define OPTION_VAL_11520X8640_DE "11520×8640 (×18)" +#define OPTION_VAL_12160X9120_DE "12160×9120 (×19)" +#define OPTION_VAL_12800X9600_DE "12800×9600 (×20)" +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_DE "Kabeltyp" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DE "Das Ausgabesignalkabel: „TV (Composite)“ ist das am weitesten unterstützte." +#define OPTION_VAL_VGA_DE NULL +#define OPTION_VAL_TV_RGB_DE NULL +#define OPTION_VAL_TV_COMPOSITE_DE NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_DE "Ausgabe-Regions-Standard" +#define OPTION_VAL_NTSC_DE NULL +#define OPTION_VAL_PAL_DE "PAL (Welt)" +#define OPTION_VAL_PAL_N_DE "PAL-N (Argentinien, Paraguay, Uruguay)" +#define OPTION_VAL_PAL_M_DE "PAL-M (Brasilien)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DE "Bildschirmausrichtung" +#define OPTION_VAL_HORIZONTAL_DE NULL +#define OPTION_VAL_VERTICAL_DE "Vertikal" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DE "Alpha-Sortierung" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_DE "Wählen, wie die transparenten Polygone sortiert werden." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DE "Pro-Streifen (schnell, am wenigsten genau)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_DE "Pro-Dreieck (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_DE "Pro-Pixel (genau, aber langsamer)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DE "Anhäufung Pixel Puffergröße" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DE "Für eine korrekte Ausgabe höherer Auflösungen sind möglicherweise höhere Werte erforderlich." +#define OPTION_VAL_512MB_DE "512 MB" +#define OPTION_VAL_1GB_DE "1 GB" +#define OPTION_VAL_2GB_DE "2 GB" +#define OPTION_VAL_4GB_DE "4 GB" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_DE "Maximale transparente Ebenen" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DE "Höhere Werte könnten für komplexe Szenen erforderlich sein." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DE "Vollständige Bildspeicheremulation" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DE "Vollständige Bildspeicheremulation in VRAM aktivieren. Dies ist für Spiele nützlich, die den Bildspeicher direkt in VRAM lesen oder schreiben. Wenn aktiviert, wird die interne Auflösung auf 640×480 erzwungen und die Leistung kann stark beeinträchtigt werden." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DE "RTT-Puffer (Render-To-Texture) erlauben" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DE "Kopiert gerenderte Texturen zurück von der GPU in VRAM. Diese Option ist normalerweise für Spiele aktiviert, die dies erfordern. Wenn aktiviert, ist das Hochskalieren von Texturen deaktiviert und die Leistung kann beeinträchtigt werden." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_DE NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_DE "Wenn aktivierte Texturen eine kleinere Version von sich selbst verwenden, sofern sie weiter entfernt erscheinen, kann dies die Leistung erhöhen und das Schimmern verringern." +#define CORE_OPTION_NAME_FOG_LABEL_DE "Nebeleffekte" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DE "Volumen-Modifizierer" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DE "Eine Dreamcast-GPU-Funktion, die typischerweise von Spielen benutzt wird, um Objektschatten zu zeichnen. Normalerweise sollte dies aktiviert werden – der Leistungsverlust ist in der Regel minimal bis vernachlässigbar." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DE "Anisotropes Filtern" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DE "Verbessert die Qualität der Texturen auf Oberflächen, die in schrägen Blickwinkeln gegenüber der Kamera liegen. Höhere Werte sind anspruchsvoller für die GPU. Änderungen an dieser Einstellung gelten erst nach einem Neustart." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DE "Texturfilterung" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DE "Der zu verwendende Texturfiltermodus. Dies kann verwendet werden, um einen bestimmten Texturfiltermodus für alle Texturen zu erzwingen, um ein klareres (oder glatteres) Erscheinungsbild als Standard zu erhalten. Andere Werte als Standardwerte können zu verschiedenen Rendering-Problemen führen. Änderungen an dieser Einstellung werden nur nach einem Neustart angewendet." +#define OPTION_VAL_1_DE "Nächste-Nachbarn erzwingen" +#define OPTION_VAL_2_DE "Linear erzwingen" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DE "Bildaustausch verzögern" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DE "Nützlich, um flackernden Bildschirm oder fehlerhafte Videos zu vermeiden. Nicht empfohlen auf langsamen Plattformen." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DE "Änderungen der Bildrate erkennen" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DE "Benachrichtigt das Frontend, wenn sich die interne Bildrate ändert (z. B. von 60 fps auf 30 fps). Verbessert das Bildtempo in Spielen, die mit gesperrten 30 bps oder 20 bps laufen, sollte aber für Spiele mit entsperrten (instabilen) Bildraten deaktiviert sein (z. B. Ecco the Dolphin, Unreal Tournament). Hinweis: Nicht verfügbar, wenn „Automatisches Bilder überspringen“ aktiviert ist." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DE "PowerVR2-Nachbearbeitungsfilter" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DE "Nachbearbeitung des gerenderten Bildes zur Simulation von Effekten speziell für PowerVR2-GPU und analoge Videosignale." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_DE "Texturen hochskalieren (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DE "Verbessert handgezeichnete 2D-Pixelgrafiken. Sollte nur mit 2D-Pixelspielen verwendet werden." +#define OPTION_VAL_2_O26_DE NULL +#define OPTION_VAL_4_DE "4×" +#define OPTION_VAL_6_DE "6×" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DE "Texturhochskalierung Max. gefilterte Größe" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_DE "Einen Maximalwert für die Größe einer hochzuskalierenden Textur auswählen. Wenn die Texturgröße größer als der ausgewählte Wert ist, wird sie nicht hochskaliert." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DE "Native Tiefeninterpolation" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DE "Hilft bei Texturfehlern und tieferen Problemen mit AMD GPUs. Kann auch Intel GPUs in einigen Fällen helfen." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_DE "Ausfransende Kanten beim Hochskalieren beheben" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_DE "Hilft im Fall von Texture Bleeding beim Hochskalieren. Ein Deaktivieren kann helfen, wenn in 2D-Spielen Pixel beim Hochskalieren verformt werden (MVC2, CVS, KOF usw.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DE NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DE "Führt die GPU und CPU in verschiedenen Prozessen aus. Sehr empfohlen." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DE "Automatisches Bilder überspringen" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DE "Überspringt Bilder automatisch, wenn der Emulator langsam läuft. Hinweis: Diese Einstellung gilt nur, wenn 'Threaded Rendering' aktiviert ist." +#define OPTION_VAL_SOME_DE NULL +#define OPTION_VAL_MORE_DE NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DE "Bilder überspringen" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DE "Legt die Anzahl der Bilder fest, die zwischen jedem angezeigten Bild übersprungen werden sollen." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DE "Breitbild-Cheats (Neustart erforderlich)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DE "Aktiviert Cheats, mit denen bestimmte Spiele im Breitbildformat angezeigt werden können." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DE "Breitbildmodus-Hack" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DE "Zeichnet Geometrie außerhalb des normalen 4:3-Seitenverhältnisses. Kann grafische Fehler in den aufgedeckten Bereichen erzeugen." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DE "GD-ROM schnelles Laden (ungenau)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DE "Beschleunigt das Laden von GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_DE "Dreamcast 32 MB RAM Mod" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_DE "Aktiviert 32 MB RAM Mod für Dreamcast.Kann die Kompatibilität beeinflussen" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_DE "SH4 CPU unter-/übertakten" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_DE "Ändert den Haupt-CPU-Takt des SH4 statt der standardmäßigen 200 MHz. Untertakten kann bei langsamen Plattformen helfen. Übertakten kann die Bildrate für einige Spiele erhöhen. Mit Vorsicht verwenden." +#define OPTION_VAL_100_DE NULL +#define OPTION_VAL_110_DE NULL +#define OPTION_VAL_120_DE NULL +#define OPTION_VAL_130_DE NULL +#define OPTION_VAL_140_DE NULL +#define OPTION_VAL_150_DE NULL +#define OPTION_VAL_160_DE NULL +#define OPTION_VAL_170_DE NULL +#define OPTION_VAL_180_DE NULL +#define OPTION_VAL_190_DE NULL +#define OPTION_VAL_200_DE NULL +#define OPTION_VAL_210_DE NULL +#define OPTION_VAL_220_DE NULL +#define OPTION_VAL_230_DE NULL +#define OPTION_VAL_240_DE NULL +#define OPTION_VAL_250_DE NULL +#define OPTION_VAL_260_DE NULL +#define OPTION_VAL_270_DE NULL +#define OPTION_VAL_280_DE NULL +#define OPTION_VAL_290_DE NULL +#define OPTION_VAL_300_DE NULL +#define OPTION_VAL_310_DE NULL +#define OPTION_VAL_320_DE NULL +#define OPTION_VAL_330_DE NULL +#define OPTION_VAL_340_DE NULL +#define OPTION_VAL_350_DE NULL +#define OPTION_VAL_360_DE NULL +#define OPTION_VAL_370_DE NULL +#define OPTION_VAL_380_DE NULL +#define OPTION_VAL_390_DE NULL +#define OPTION_VAL_400_DE NULL +#define OPTION_VAL_410_DE NULL +#define OPTION_VAL_420_DE NULL +#define OPTION_VAL_430_DE NULL +#define OPTION_VAL_440_DE NULL +#define OPTION_VAL_450_DE NULL +#define OPTION_VAL_460_DE NULL +#define OPTION_VAL_470_DE NULL +#define OPTION_VAL_480_DE NULL +#define OPTION_VAL_490_DE NULL +#define OPTION_VAL_500_DE NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DE "Eigene Texturen laden" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_DE "Benutzerdefinierte Texturen aus dem Ordner „system/dc/textures//“ laden." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DE "Texturen dumpen" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_DE "Jedes Mal, wenn eine neue Textur vom Spiel verwendet wird, wird sie als .png-Datei im Ordner „system/dc/texdump//“ gespeichert." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DE "Analog-Stick Totzone" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_DE "Auswählen, wie weit der analogen Stick gedrückt werden muss, bevor er verarbeitet wird." +#define OPTION_VAL_0_DE "0 %" +#define OPTION_VAL_5_DE "5 %" +#define OPTION_VAL_10_DE "10 %" +#define OPTION_VAL_15_DE "15 %" +#define OPTION_VAL_20_DE "20 %" +#define OPTION_VAL_25_DE "25 %" +#define OPTION_VAL_30_DE "30 %" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DE "Trigger Totzone" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_DE "Auswählen, wie stark der Abzug gedrückt werden muss, bevor er verarbeitet wird." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DE "Digitale Trigger" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_DE "Wenn aktiviert, reagiert ein Abzug wie eine normale Taste, d. h. entweder als vollständig gedrückt oder gar nicht gedrückt, ohne dass es ein Dazwischen gibt." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DE "Digitale Ausgänge übertragen" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DE "Digitale Ausgänge und Force-Feedback-Status auf TCP-Port 8000 übertragen. Kompatibel mit der MAME-Option „-output network“." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DE "Lightgun-Einstellungen anzeigen" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DE "Aktiviert die Konfiguration der Lightgun-Fadenkreuz-Anzeigeoptionen. HINWEIS: Schnellmenü muss eingeschaltet sein, damit diese Einstellung wirksam wird." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_DE "Skalierung der Fadenkreuzgröße" +#define OPTION_VAL_50_DE "50 %" +#define OPTION_VAL_60_DE "60 %" +#define OPTION_VAL_70_DE "70 %" +#define OPTION_VAL_80_DE "80 %" +#define OPTION_VAL_90_DE "90 %" +#define OPTION_VAL_100_O45_DE "100 %" +#define OPTION_VAL_110_O45_DE "110 %" +#define OPTION_VAL_120_O45_DE "120 %" +#define OPTION_VAL_130_O45_DE "130 %" +#define OPTION_VAL_140_O45_DE "140 %" +#define OPTION_VAL_150_O45_DE "150 %" +#define OPTION_VAL_160_O45_DE "160 %" +#define OPTION_VAL_170_O45_DE "170 %" +#define OPTION_VAL_180_O45_DE "180 %" +#define OPTION_VAL_190_O45_DE "190 %" +#define OPTION_VAL_200_O45_DE "200 %" +#define OPTION_VAL_210_O45_DE "210 %" +#define OPTION_VAL_220_O45_DE "220 %" +#define OPTION_VAL_230_O45_DE "230 %" +#define OPTION_VAL_240_O45_DE "240 %" +#define OPTION_VAL_250_O45_DE "250 %" +#define OPTION_VAL_260_O45_DE "260 %" +#define OPTION_VAL_270_O45_DE "270 %" +#define OPTION_VAL_280_O45_DE "280 %" +#define OPTION_VAL_290_O45_DE "290 %" +#define OPTION_VAL_300_O45_DE "300 %" +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DE "Anzeige Pistolen-Fadenkreuz 1" +#define OPTION_VAL_WHITE_DE "Weiß" +#define OPTION_VAL_RED_DE "Rot" +#define OPTION_VAL_GREEN_DE "Grün" +#define OPTION_VAL_BLUE_DE "Blau" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DE "Anzeige Pistolen-Fadenkreuz 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DE "Anzeige Pistolen-Fadenkreuz 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DE "Anzeige Pistolen-Fadenkreuz 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_DE "Gerät im Erweiterungsslot A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot A1 angeschlossen ist (Port A Slot 1)." +#define OPTION_VAL_VMU_DE NULL +#define OPTION_VAL_PURUPURU_DE "Vibrationspaket" +#define OPTION_VAL_NONE_DE "Nein" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_DE "Gerät im Erweiterungsslot A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot A2 angeschlossen ist (Port A Slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_DE "Gerät im Erweiterungsslot B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot B1 angeschlossen ist (Port B Slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_DE "Gerät im Erweiterungsslot B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot B2 angeschlossen ist (Port B Slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_DE "Gerät im Erweiterungsslot C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot C1 angeschlossen ist (Port C Slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_DE "Gerät im Erweiterungsslot C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot C2 angeschlossen ist (Port C Slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_DE "Gerät im Erweiterungsslot D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot D1 angeschlossen ist (Port D Slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_DE "Gerät im Erweiterungsslot D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_DE "Das Gerät auswählen, das im Erweiterungsslot D2 angeschlossen ist (Port D Slot 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DE "Visual Memory Units/Systeme (VMU) pro Spiel" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DE "VMUs pro Spiel" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DE "Wenn deaktiviert, teilen alle Spiele bis zu 8 VMU-Speicherdateien (A1/A2/B1/B2/C1/C2/D1/D2) im Systemverzeichnis von RetroArch.\nDie Einstellung „VMU A1“ erzeugt für jedes Spiel, das gestartet wird, eine einzigartige VMU-„A1“-Datei im Speicherverzeichnis von RetroArch.\nDie Einstellung „Alle VMUs“ erzeugt bis zu 8 einzigartige VMU-Dateien (A1/A2/B1/B2/C1/C2/D1/D2) für jedes Spiel, das gestartet wird." +#define OPTION_VAL_VMU_A1_DE NULL +#define OPTION_VAL_ALL_VMUS_DE "Alle VMUs" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_DE NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DE NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_DE "Wenn aktiviert, werden VMU-Signaltöne abgespielt." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DE "Visual Memory Unit/System (VMU) Anzeigeeinstellungen anzeigen" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DE "VMU-Bildschirmeinstellungen anzeigen" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DE "Konfiguration von emulierten VMU LCD-Bildschirmen über Sichtbarkeit, Größe, Position und Farbe aktivieren. HINWEIS: Das Schnellmenü muss aktiviert sein, damit diese Einstellung wirksam wird." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 1" +#define OPTION_VAL_UPPER_LEFT_DE "Oben links" +#define OPTION_VAL_UPPER_RIGHT_DE "Oben rechts" +#define OPTION_VAL_LOWER_LEFT_DE "Unten links" +#define OPTION_VAL_LOWER_RIGHT_DE "Unten rechts" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 1" +#define OPTION_VAL_1X_DE "1×" +#define OPTION_VAL_3X_DE "3×" +#define OPTION_VAL_5X_DE "5×" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe VMU-Bildschirm 1" +#define OPTION_VAL_DEFAULT_ON_00_DE "Standard EIN" +#define OPTION_VAL_DEFAULT_OFF_01_DE "Standard AUS" +#define OPTION_VAL_BLACK_02_DE "Schwarz" +#define OPTION_VAL_LIGHT_BLUE_04_DE "Hellblau" +#define OPTION_VAL_CYAN_06_DE NULL +#define OPTION_VAL_CYAN_BLUE_07_DE "Zyanblau" +#define OPTION_VAL_LIGHT_GREEN_08_DE "Hellgrün" +#define OPTION_VAL_CYAN_GREEN_09_DE "Zyangrün" +#define OPTION_VAL_LIGHT_CYAN_10_DE "Hellzyan" +#define OPTION_VAL_PURPLE_12_DE "Lila" +#define OPTION_VAL_LIGHT_PURPLE_13_DE "Hellviolett" +#define OPTION_VAL_YELLOW_14_DE "Gelb" +#define OPTION_VAL_GRAY_15_DE "Grau" +#define OPTION_VAL_LIGHT_PURPLE_2_16_DE "Hellviolett (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_DE "Hellgrün (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_DE "Hellgrün (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_DE "Hellzyan (2)" +#define OPTION_VAL_LIGHT_RED_2_20_DE "Hellrot (2)" +#define OPTION_VAL_MAGENTA_21_DE NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_DE "Hellviolett (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_DE "Hellorange" +#define OPTION_VAL_ORANGE_24_DE NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_DE "Hellviolett (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_DE "Hellgelb" +#define OPTION_VAL_LIGHT_YELLOW_2_27_DE "Hellgelb (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 1" +#define OPTION_VAL_40_DE "40 %" +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DE "Anzeige VMU-Bildschirm 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DE "Position VMU-Bildschirm 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DE "Größe VMU-Bildschirm 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DE "Pixel-an-Farbe Bildschirm 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DE "Pixel-aus-Farbe VMU-Bildschirm 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DE "Deckkraft VMU-Bildschirm 4" + +struct retro_core_option_v2_category option_cats_de[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_DE, + CATEGORY_SYSTEM_INFO_0_DE + }, + { + "video", + CATEGORY_VIDEO_LABEL_DE, + CATEGORY_VIDEO_INFO_0_DE + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_DE, + CATEGORY_PERFORMANCE_INFO_0_DE + }, + { + "hacks", + CATEGORY_HACKS_LABEL_DE, + CATEGORY_HACKS_INFO_0_DE + }, + { + "input", + CATEGORY_INPUT_LABEL_DE, + CATEGORY_INPUT_INFO_0_DE + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_DE, + CATEGORY_EXPANSIONS_INFO_0_DE + }, + { + "vmu", + CATEGORY_VMU_LABEL_DE, + CATEGORY_VMU_INFO_0_DE + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_de[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_DE, + NULL, + "", NULL, "system", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Japan", OPTION_VAL_JAPAN_DE }, + { "USA", OPTION_VAL_USA_DE }, + { "Europe", OPTION_VAL_EUROPE_DE }, + { "Default", OPTION_VAL_DEFAULT_DE }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_DE, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_DE, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_DE }, + { "English", OPTION_VAL_ENGLISH_DE }, + { "German", OPTION_VAL_GERMAN_DE }, + { "French", OPTION_VAL_FRENCH_DE }, + { "Spanish", OPTION_VAL_SPANISH_DE }, + { "Italian", OPTION_VAL_ITALIAN_DE }, + { "Default", OPTION_VAL_DEFAULT_DE }, { NULL, NULL }, }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_DE, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_DE, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, "disabled", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_EL, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_DE, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_DE, NULL, "system", { @@ -18437,17 +20618,13 @@ struct retro_core_option_v2_definition option_defs_el[] = { { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_EL, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_DE, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_DE, NULL, "system", { @@ -18455,13 +20632,17 @@ struct retro_core_option_v2_definition option_defs_el[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_DE, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_DE, NULL, "system", { @@ -18473,9 +20654,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EL, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_DE, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_DE, NULL, "system", { @@ -18487,9 +20668,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_EL, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_DE, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_DE, NULL, "system", { @@ -18501,9 +20682,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_EL, + CORE_OPTION_NAME_UPNP_LABEL_DE, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_EL, + CORE_OPTION_NAME_UPNP_INFO_0_DE, NULL, "system", { @@ -18516,105 +20697,105 @@ struct retro_core_option_v2_definition option_defs_el[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EL, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EL, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_EL }, - { "640x480", OPTION_VAL_640X480_EL }, - { "800x600", OPTION_VAL_800X600_EL }, - { "960x720", OPTION_VAL_960X720_EL }, - { "1024x768", OPTION_VAL_1024X768_EL }, - { "1280x960", OPTION_VAL_1280X960_EL }, - { "1440x1080", OPTION_VAL_1440X1080_EL }, - { "1600x1200", OPTION_VAL_1600X1200_EL }, - { "1920x1440", OPTION_VAL_1920X1440_EL }, - { "2560x1920", OPTION_VAL_2560X1920_EL }, - { "2880x2160", OPTION_VAL_2880X2160_EL }, - { "3200x2400", OPTION_VAL_3200X2400_EL }, - { "3840x2880", OPTION_VAL_3840X2880_EL }, - { "4480x3360", OPTION_VAL_4480X3360_EL }, - { "5120x3840", OPTION_VAL_5120X3840_EL }, - { "5760x4320", OPTION_VAL_5760X4320_EL }, - { "6400x4800", OPTION_VAL_6400X4800_EL }, - { "7040x5280", OPTION_VAL_7040X5280_EL }, - { "7680x5760", OPTION_VAL_7680X5760_EL }, - { "8320x6240", OPTION_VAL_8320X6240_EL }, - { "8960x6720", OPTION_VAL_8960X6720_EL }, - { "9600x7200", OPTION_VAL_9600X7200_EL }, - { "10240x7680", OPTION_VAL_10240X7680_EL }, - { "10880x8160", OPTION_VAL_10880X8160_EL }, - { "11520x8640", OPTION_VAL_11520X8640_EL }, - { "12160x9120", OPTION_VAL_12160X9120_EL }, - { "12800x9600", OPTION_VAL_12800X9600_EL }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif - }, - { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_EL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_DE, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_DE, NULL, "video", { - { "VGA", OPTION_VAL_VGA_EL }, - { "TV (RGB)", OPTION_VAL_TV_RGB_EL }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EL }, + { "320x240", OPTION_VAL_320X240_DE }, + { "640x480", OPTION_VAL_640X480_DE }, + { "800x600", OPTION_VAL_800X600_DE }, + { "960x720", OPTION_VAL_960X720_DE }, + { "1024x768", OPTION_VAL_1024X768_DE }, + { "1280x960", OPTION_VAL_1280X960_DE }, + { "1440x1080", OPTION_VAL_1440X1080_DE }, + { "1600x1200", OPTION_VAL_1600X1200_DE }, + { "1920x1440", OPTION_VAL_1920X1440_DE }, + { "2560x1920", OPTION_VAL_2560X1920_DE }, + { "2880x2160", OPTION_VAL_2880X2160_DE }, + { "3200x2400", OPTION_VAL_3200X2400_DE }, + { "3840x2880", OPTION_VAL_3840X2880_DE }, + { "4480x3360", OPTION_VAL_4480X3360_DE }, + { "5120x3840", OPTION_VAL_5120X3840_DE }, + { "5760x4320", OPTION_VAL_5760X4320_DE }, + { "6400x4800", OPTION_VAL_6400X4800_DE }, + { "7040x5280", OPTION_VAL_7040X5280_DE }, + { "7680x5760", OPTION_VAL_7680X5760_DE }, + { "8320x6240", OPTION_VAL_8320X6240_DE }, + { "8960x6720", OPTION_VAL_8960X6720_DE }, + { "9600x7200", OPTION_VAL_9600X7200_DE }, + { "10240x7680", OPTION_VAL_10240X7680_DE }, + { "10880x8160", OPTION_VAL_10880X8160_DE }, + { "11520x8640", OPTION_VAL_11520X8640_DE }, + { "12160x9120", OPTION_VAL_12160X9120_DE }, + { "12800x9600", OPTION_VAL_12800X9600_DE }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_DE, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_DE, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_DE }, + { "TV (RGB)", OPTION_VAL_TV_RGB_DE }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_DE }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_EL, + CORE_OPTION_NAME_BROADCAST_LABEL_DE, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_EL }, - { "PAL", OPTION_VAL_PAL_EL }, - { "PAL_N", OPTION_VAL_PAL_N_EL }, - { "PAL_M", OPTION_VAL_PAL_M_EL }, - { "Default", OPTION_VAL_DEFAULT_EL }, + { "NTSC", OPTION_VAL_NTSC_DE }, + { "PAL", OPTION_VAL_PAL_DE }, + { "PAL_N", OPTION_VAL_PAL_N_DE }, + { "PAL_M", OPTION_VAL_PAL_M_DE }, + { "Default", OPTION_VAL_DEFAULT_DE }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EL, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_DE, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_EL }, - { "vertical", OPTION_VAL_VERTICAL_EL }, + { "horizontal", OPTION_VAL_HORIZONTAL_DE }, + { "vertical", OPTION_VAL_VERTICAL_DE }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EL, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_DE, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EL }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EL }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_DE }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_DE }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EL }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_DE }, #endif { NULL, NULL }, }, @@ -18627,25 +20808,25 @@ struct retro_core_option_v2_definition option_defs_el[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_DE, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_DE, NULL, "video", { - { "512MB", OPTION_VAL_512MB_EL }, - { "1GB", OPTION_VAL_1GB_EL }, - { "2GB", OPTION_VAL_2GB_EL }, - { "4GB", OPTION_VAL_4GB_EL }, + { "512MB", OPTION_VAL_512MB_DE }, + { "1GB", OPTION_VAL_1GB_DE }, + { "2GB", OPTION_VAL_2GB_DE }, + { "4GB", OPTION_VAL_4GB_DE }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_EL, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_DE, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_DE, NULL, "video", { @@ -18653,6 +20834,7 @@ struct retro_core_option_v2_definition option_defs_el[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -18661,9 +20843,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_DE, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_DE, NULL, "video", { @@ -18675,9 +20857,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EL, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_DE, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_DE, NULL, "video", { @@ -18687,11 +20869,11 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_EL, + CORE_OPTION_NAME_MIPMAPPING_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_DE, NULL, "video", { @@ -18703,7 +20885,7 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_EL, + CORE_OPTION_NAME_FOG_LABEL_DE, NULL, "", NULL, @@ -18717,9 +20899,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_DE, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_DE, NULL, "video", { @@ -18731,9 +20913,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_DE, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_DE, NULL, "video", { @@ -18748,24 +20930,24 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EL, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_DE, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_DE, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_EL }, - { "1", OPTION_VAL_1_EL }, - { "2", OPTION_VAL_2_EL }, + { "0", OPTION_VAL_DEFAULT_DE }, + { "1", OPTION_VAL_1_DE }, + { "2", OPTION_VAL_2_DE }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_DE, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_DE, NULL, "video", { @@ -18773,13 +20955,13 @@ struct retro_core_option_v2_definition option_defs_el[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_DE, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_DE, NULL, "video", { @@ -18791,9 +20973,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EL, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_DE, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_DE, NULL, "video", { @@ -18806,25 +20988,25 @@ struct retro_core_option_v2_definition option_defs_el[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_EL, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_DE, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_DE, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_EL }, - { "4", OPTION_VAL_4_EL }, - { "6", OPTION_VAL_6_EL }, + { "2", OPTION_VAL_2_O26_DE }, + { "4", OPTION_VAL_4_DE }, + { "6", OPTION_VAL_6_DE }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_DE, NULL, "video", { @@ -18838,9 +21020,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_DE, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_DE, NULL, "video", { @@ -18850,11 +21032,25 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_DE, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_DE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EL, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_DE, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_DE, NULL, "performance", { @@ -18866,15 +21062,15 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_DE, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_DE, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_EL }, - { "more", OPTION_VAL_MORE_EL }, + { "some", OPTION_VAL_SOME_DE }, + { "more", OPTION_VAL_MORE_DE }, { NULL, NULL }, }, #ifdef LOW_END @@ -18885,9 +21081,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EL, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_DE, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_DE, NULL, "performance", { @@ -18904,9 +21100,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_DE, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_DE, NULL, "hacks", { @@ -18918,9 +21114,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EL, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_DE, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_DE, NULL, "hacks", { @@ -18932,9 +21128,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_DE, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_DE, NULL, "hacks", { @@ -18948,64 +21144,78 @@ struct retro_core_option_v2_definition option_defs_el[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_DE, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_DE, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_EL, + CORE_OPTION_NAME_SH4CLOCK_LABEL_DE, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_EL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_DE, NULL, "hacks", { - { "100", OPTION_VAL_100_EL }, - { "110", OPTION_VAL_110_EL }, - { "120", OPTION_VAL_120_EL }, - { "130", OPTION_VAL_130_EL }, - { "140", OPTION_VAL_140_EL }, - { "150", OPTION_VAL_150_EL }, - { "160", OPTION_VAL_160_EL }, - { "170", OPTION_VAL_170_EL }, - { "180", OPTION_VAL_180_EL }, - { "190", OPTION_VAL_190_EL }, - { "200", OPTION_VAL_200_EL }, - { "210", OPTION_VAL_210_EL }, - { "220", OPTION_VAL_220_EL }, - { "230", OPTION_VAL_230_EL }, - { "240", OPTION_VAL_240_EL }, - { "250", OPTION_VAL_250_EL }, - { "260", OPTION_VAL_260_EL }, - { "270", OPTION_VAL_270_EL }, - { "280", OPTION_VAL_280_EL }, - { "290", OPTION_VAL_290_EL }, - { "300", OPTION_VAL_300_EL }, - { "310", OPTION_VAL_310_EL }, - { "320", OPTION_VAL_320_EL }, - { "330", OPTION_VAL_330_EL }, - { "340", OPTION_VAL_340_EL }, - { "350", OPTION_VAL_350_EL }, - { "360", OPTION_VAL_360_EL }, - { "370", OPTION_VAL_370_EL }, - { "380", OPTION_VAL_380_EL }, - { "390", OPTION_VAL_390_EL }, - { "400", OPTION_VAL_400_EL }, - { "410", OPTION_VAL_410_EL }, - { "420", OPTION_VAL_420_EL }, - { "430", OPTION_VAL_430_EL }, - { "440", OPTION_VAL_440_EL }, - { "450", OPTION_VAL_450_EL }, - { "460", OPTION_VAL_460_EL }, - { "470", OPTION_VAL_470_EL }, - { "480", OPTION_VAL_480_EL }, - { "490", OPTION_VAL_490_EL }, - { "500", OPTION_VAL_500_EL }, + { "100", OPTION_VAL_100_DE }, + { "110", OPTION_VAL_110_DE }, + { "120", OPTION_VAL_120_DE }, + { "130", OPTION_VAL_130_DE }, + { "140", OPTION_VAL_140_DE }, + { "150", OPTION_VAL_150_DE }, + { "160", OPTION_VAL_160_DE }, + { "170", OPTION_VAL_170_DE }, + { "180", OPTION_VAL_180_DE }, + { "190", OPTION_VAL_190_DE }, + { "200", OPTION_VAL_200_DE }, + { "210", OPTION_VAL_210_DE }, + { "220", OPTION_VAL_220_DE }, + { "230", OPTION_VAL_230_DE }, + { "240", OPTION_VAL_240_DE }, + { "250", OPTION_VAL_250_DE }, + { "260", OPTION_VAL_260_DE }, + { "270", OPTION_VAL_270_DE }, + { "280", OPTION_VAL_280_DE }, + { "290", OPTION_VAL_290_DE }, + { "300", OPTION_VAL_300_DE }, + { "310", OPTION_VAL_310_DE }, + { "320", OPTION_VAL_320_DE }, + { "330", OPTION_VAL_330_DE }, + { "340", OPTION_VAL_340_DE }, + { "350", OPTION_VAL_350_DE }, + { "360", OPTION_VAL_360_DE }, + { "370", OPTION_VAL_370_DE }, + { "380", OPTION_VAL_380_DE }, + { "390", OPTION_VAL_390_DE }, + { "400", OPTION_VAL_400_DE }, + { "410", OPTION_VAL_410_DE }, + { "420", OPTION_VAL_420_DE }, + { "430", OPTION_VAL_430_DE }, + { "440", OPTION_VAL_440_DE }, + { "450", OPTION_VAL_450_DE }, + { "460", OPTION_VAL_460_DE }, + { "470", OPTION_VAL_470_DE }, + { "480", OPTION_VAL_480_DE }, + { "490", OPTION_VAL_490_DE }, + { "500", OPTION_VAL_500_DE }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_DE, NULL, "hacks", { @@ -19015,11 +21225,11 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EL, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_DE, NULL, "hacks", { @@ -19031,47 +21241,47 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_DE, NULL, "input", { - { "0%", OPTION_VAL_0_EL }, - { "5%", OPTION_VAL_5_EL }, - { "10%", OPTION_VAL_10_EL }, - { "15%", OPTION_VAL_15_EL }, - { "20%", OPTION_VAL_20_EL }, - { "25%", OPTION_VAL_25_EL }, - { "30%", OPTION_VAL_30_EL }, + { "0%", OPTION_VAL_0_DE }, + { "5%", OPTION_VAL_5_DE }, + { "10%", OPTION_VAL_10_DE }, + { "15%", OPTION_VAL_15_DE }, + { "20%", OPTION_VAL_20_DE }, + { "25%", OPTION_VAL_25_DE }, + { "30%", OPTION_VAL_30_DE }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_DE, NULL, "input", { - { "0%", OPTION_VAL_0_EL }, - { "5%", OPTION_VAL_5_EL }, - { "10%", OPTION_VAL_10_EL }, - { "15%", OPTION_VAL_15_EL }, - { "20%", OPTION_VAL_20_EL }, - { "25%", OPTION_VAL_25_EL }, - { "30%", OPTION_VAL_30_EL }, + { "0%", OPTION_VAL_0_DE }, + { "5%", OPTION_VAL_5_DE }, + { "10%", OPTION_VAL_10_DE }, + { "15%", OPTION_VAL_15_DE }, + { "20%", OPTION_VAL_20_DE }, + { "25%", OPTION_VAL_25_DE }, + { "30%", OPTION_VAL_30_DE }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_DE, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_DE, NULL, "input", { @@ -19082,10 +21292,10 @@ struct retro_core_option_v2_definition option_defs_el[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EL, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_DE, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_DE, NULL, "input", { @@ -19093,124 +21303,268 @@ struct retro_core_option_v2_definition option_defs_el[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EL, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_DE, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_DE, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EL, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_DE, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EL, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_DE }, + { "60%", OPTION_VAL_60_DE }, + { "70%", OPTION_VAL_70_DE }, + { "80%", OPTION_VAL_80_DE }, + { "90%", OPTION_VAL_90_DE }, + { "100%", OPTION_VAL_100_O45_DE }, + { "110%", OPTION_VAL_110_O45_DE }, + { "120%", OPTION_VAL_120_O45_DE }, + { "130%", OPTION_VAL_130_O45_DE }, + { "140%", OPTION_VAL_140_O45_DE }, + { "150%", OPTION_VAL_150_O45_DE }, + { "160%", OPTION_VAL_160_O45_DE }, + { "170%", OPTION_VAL_170_O45_DE }, + { "180%", OPTION_VAL_180_O45_DE }, + { "190%", OPTION_VAL_190_O45_DE }, + { "200%", OPTION_VAL_200_O45_DE }, + { "210%", OPTION_VAL_210_O45_DE }, + { "220%", OPTION_VAL_220_O45_DE }, + { "230%", OPTION_VAL_230_O45_DE }, + { "240%", OPTION_VAL_240_O45_DE }, + { "250%", OPTION_VAL_250_O45_DE }, + { "260%", OPTION_VAL_260_O45_DE }, + { "270%", OPTION_VAL_270_O45_DE }, + { "280%", OPTION_VAL_280_O45_DE }, + { "290%", OPTION_VAL_290_O45_DE }, + { "300%", OPTION_VAL_300_O45_DE }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EL, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_DE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EL }, - { "Red", OPTION_VAL_RED_EL }, - { "Green", OPTION_VAL_GREEN_EL }, - { "Blue", OPTION_VAL_BLUE_EL }, + { "White", OPTION_VAL_WHITE_DE }, + { "Red", OPTION_VAL_RED_DE }, + { "Green", OPTION_VAL_GREEN_DE }, + { "Blue", OPTION_VAL_BLUE_DE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EL, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_DE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EL }, - { "Red", OPTION_VAL_RED_EL }, - { "Green", OPTION_VAL_GREEN_EL }, - { "Blue", OPTION_VAL_BLUE_EL }, + { "White", OPTION_VAL_WHITE_DE }, + { "Red", OPTION_VAL_RED_DE }, + { "Green", OPTION_VAL_GREEN_DE }, + { "Blue", OPTION_VAL_BLUE_DE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EL, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_DE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EL }, - { "Red", OPTION_VAL_RED_EL }, - { "Green", OPTION_VAL_GREEN_EL }, - { "Blue", OPTION_VAL_BLUE_EL }, + { "White", OPTION_VAL_WHITE_DE }, + { "Red", OPTION_VAL_RED_DE }, + { "Green", OPTION_VAL_GREEN_DE }, + { "Blue", OPTION_VAL_BLUE_DE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EL, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_DE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EL }, - { "Red", OPTION_VAL_RED_EL }, - { "Green", OPTION_VAL_GREEN_EL }, - { "Blue", OPTION_VAL_BLUE_EL }, + { "White", OPTION_VAL_WHITE_DE }, + { "Red", OPTION_VAL_RED_DE }, + { "Green", OPTION_VAL_GREEN_DE }, + { "Blue", OPTION_VAL_BLUE_DE }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_DE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_DE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_DE }, + { "Purupuru", OPTION_VAL_PURUPURU_DE }, + { "None", OPTION_VAL_NONE_DE }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_DE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_DE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_DE, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_EL }, - { "All VMUs", OPTION_VAL_ALL_VMUS_EL }, + { "VMU A1", OPTION_VAL_VMU_A1_DE }, + { "All VMUs", OPTION_VAL_ALL_VMUS_DE }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_EL, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EL, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_EL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_DE, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_DE, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_DE, NULL, "vmu", { @@ -19221,9 +21575,9 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_DE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_DE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_DE, NULL, "vmu", { @@ -19235,7 +21589,7 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EL, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_DE, NULL, "", NULL, @@ -19249,144 +21603,144 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EL, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_DE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EL, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_DE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EL }, - { "2x", OPTION_VAL_2_O27_EL }, - { "3x", OPTION_VAL_3X_EL }, - { "4x", OPTION_VAL_4_EL }, - { "5x", OPTION_VAL_5X_EL }, + { "1x", OPTION_VAL_1X_DE }, + { "2x", OPTION_VAL_2_O26_DE }, + { "3x", OPTION_VAL_3X_DE }, + { "4x", OPTION_VAL_4_DE }, + { "5x", OPTION_VAL_5X_DE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EL, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_DE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EL }, - { "20%", OPTION_VAL_20_EL }, - { "30%", OPTION_VAL_30_EL }, - { "40%", OPTION_VAL_40_EL }, - { "50%", OPTION_VAL_50_EL }, - { "60%", OPTION_VAL_60_EL }, - { "70%", OPTION_VAL_70_EL }, - { "80%", OPTION_VAL_80_EL }, - { "90%", OPTION_VAL_90_EL }, - { "100%", OPTION_VAL_100_O57_EL }, + { "10%", OPTION_VAL_10_DE }, + { "20%", OPTION_VAL_20_DE }, + { "30%", OPTION_VAL_30_DE }, + { "40%", OPTION_VAL_40_DE }, + { "50%", OPTION_VAL_50_DE }, + { "60%", OPTION_VAL_60_DE }, + { "70%", OPTION_VAL_70_DE }, + { "80%", OPTION_VAL_80_DE }, + { "90%", OPTION_VAL_90_DE }, + { "100%", OPTION_VAL_100_O45_DE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EL, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_DE, NULL, "", NULL, @@ -19400,144 +21754,144 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EL, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_DE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EL, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_DE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EL }, - { "2x", OPTION_VAL_2_O27_EL }, - { "3x", OPTION_VAL_3X_EL }, - { "4x", OPTION_VAL_4_EL }, - { "5x", OPTION_VAL_5X_EL }, + { "1x", OPTION_VAL_1X_DE }, + { "2x", OPTION_VAL_2_O26_DE }, + { "3x", OPTION_VAL_3X_DE }, + { "4x", OPTION_VAL_4_DE }, + { "5x", OPTION_VAL_5X_DE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EL, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_DE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EL }, - { "20%", OPTION_VAL_20_EL }, - { "30%", OPTION_VAL_30_EL }, - { "40%", OPTION_VAL_40_EL }, - { "50%", OPTION_VAL_50_EL }, - { "60%", OPTION_VAL_60_EL }, - { "70%", OPTION_VAL_70_EL }, - { "80%", OPTION_VAL_80_EL }, - { "90%", OPTION_VAL_90_EL }, - { "100%", OPTION_VAL_100_O57_EL }, + { "10%", OPTION_VAL_10_DE }, + { "20%", OPTION_VAL_20_DE }, + { "30%", OPTION_VAL_30_DE }, + { "40%", OPTION_VAL_40_DE }, + { "50%", OPTION_VAL_50_DE }, + { "60%", OPTION_VAL_60_DE }, + { "70%", OPTION_VAL_70_DE }, + { "80%", OPTION_VAL_80_DE }, + { "90%", OPTION_VAL_90_DE }, + { "100%", OPTION_VAL_100_O45_DE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EL, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_DE, NULL, "", NULL, @@ -19551,144 +21905,144 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EL, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_DE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EL, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_DE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EL }, - { "2x", OPTION_VAL_2_O27_EL }, - { "3x", OPTION_VAL_3X_EL }, - { "4x", OPTION_VAL_4_EL }, - { "5x", OPTION_VAL_5X_EL }, + { "1x", OPTION_VAL_1X_DE }, + { "2x", OPTION_VAL_2_O26_DE }, + { "3x", OPTION_VAL_3X_DE }, + { "4x", OPTION_VAL_4_DE }, + { "5x", OPTION_VAL_5X_DE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EL, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_DE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EL }, - { "20%", OPTION_VAL_20_EL }, - { "30%", OPTION_VAL_30_EL }, - { "40%", OPTION_VAL_40_EL }, - { "50%", OPTION_VAL_50_EL }, - { "60%", OPTION_VAL_60_EL }, - { "70%", OPTION_VAL_70_EL }, - { "80%", OPTION_VAL_80_EL }, - { "90%", OPTION_VAL_90_EL }, - { "100%", OPTION_VAL_100_O57_EL }, + { "10%", OPTION_VAL_10_DE }, + { "20%", OPTION_VAL_20_DE }, + { "30%", OPTION_VAL_30_DE }, + { "40%", OPTION_VAL_40_DE }, + { "50%", OPTION_VAL_50_DE }, + { "60%", OPTION_VAL_60_DE }, + { "70%", OPTION_VAL_70_DE }, + { "80%", OPTION_VAL_80_DE }, + { "90%", OPTION_VAL_90_DE }, + { "100%", OPTION_VAL_100_O45_DE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EL, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_DE, NULL, "", NULL, @@ -19702,565 +22056,606 @@ struct retro_core_option_v2_definition option_defs_el[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EL, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_DE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_DE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_DE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_DE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_DE }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EL, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_DE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EL }, - { "2x", OPTION_VAL_2_O27_EL }, - { "3x", OPTION_VAL_3X_EL }, - { "4x", OPTION_VAL_4_EL }, - { "5x", OPTION_VAL_5X_EL }, + { "1x", OPTION_VAL_1X_DE }, + { "2x", OPTION_VAL_2_O26_DE }, + { "3x", OPTION_VAL_3X_DE }, + { "4x", OPTION_VAL_4_DE }, + { "5x", OPTION_VAL_5X_DE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EL, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_DE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, - { "BLACK 02", OPTION_VAL_BLACK_02_EL }, - { "BLUE 03", OPTION_VAL_BLUE_EL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, - { "GREEN 05", OPTION_VAL_GREEN_EL }, - { "CYAN 06", OPTION_VAL_CYAN_06_EL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, - { "RED 11", OPTION_VAL_RED_EL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, - { "GRAY 15", OPTION_VAL_GRAY_15_EL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, - { "WHITE 28", OPTION_VAL_WHITE_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_DE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_DE }, + { "BLACK 02", OPTION_VAL_BLACK_02_DE }, + { "BLUE 03", OPTION_VAL_BLUE_DE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_DE }, + { "GREEN 05", OPTION_VAL_GREEN_DE }, + { "CYAN 06", OPTION_VAL_CYAN_06_DE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_DE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_DE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_DE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_DE }, + { "RED 11", OPTION_VAL_RED_DE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_DE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_DE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_DE }, + { "GRAY 15", OPTION_VAL_GRAY_15_DE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_DE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_DE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_DE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_DE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_DE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_DE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_DE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_DE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_DE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_DE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_DE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_DE }, + { "WHITE 28", OPTION_VAL_WHITE_DE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EL, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_DE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EL }, - { "20%", OPTION_VAL_20_EL }, - { "30%", OPTION_VAL_30_EL }, - { "40%", OPTION_VAL_40_EL }, - { "50%", OPTION_VAL_50_EL }, - { "60%", OPTION_VAL_60_EL }, - { "70%", OPTION_VAL_70_EL }, - { "80%", OPTION_VAL_80_EL }, - { "90%", OPTION_VAL_90_EL }, - { "100%", OPTION_VAL_100_O57_EL }, + { "10%", OPTION_VAL_10_DE }, + { "20%", OPTION_VAL_20_DE }, + { "30%", OPTION_VAL_30_DE }, + { "40%", OPTION_VAL_40_DE }, + { "50%", OPTION_VAL_50_DE }, + { "60%", OPTION_VAL_60_DE }, + { "70%", OPTION_VAL_70_DE }, + { "80%", OPTION_VAL_80_DE }, + { "90%", OPTION_VAL_90_DE }, + { "100%", OPTION_VAL_100_O45_DE }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_el = { - option_cats_el, - option_defs_el +struct retro_core_options_v2 options_de = { + option_cats_de, + option_defs_de }; -/* RETRO_LANGUAGE_EN */ - -#define CATEGORY_SYSTEM_LABEL_EN NULL -#define CATEGORY_SYSTEM_INFO_0_EN NULL -#define CATEGORY_VIDEO_LABEL_EN NULL -#define CATEGORY_VIDEO_INFO_0_EN NULL -#define CATEGORY_PERFORMANCE_LABEL_EN NULL -#define CATEGORY_PERFORMANCE_INFO_0_EN NULL -#define CATEGORY_HACKS_LABEL_EN NULL -#define CATEGORY_HACKS_INFO_0_EN NULL -#define CATEGORY_INPUT_LABEL_EN NULL -#define CATEGORY_INPUT_INFO_0_EN NULL -#define CATEGORY_VMU_LABEL_EN NULL -#define CATEGORY_VMU_INFO_0_EN NULL -#define CORE_OPTION_NAME_REGION_LABEL_EN NULL -#define OPTION_VAL_JAPAN_EN NULL -#define OPTION_VAL_USA_EN NULL -#define OPTION_VAL_EUROPE_EN NULL -#define OPTION_VAL_DEFAULT_EN NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_EN NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EN NULL -#define OPTION_VAL_JAPANESE_EN NULL -#define OPTION_VAL_ENGLISH_EN NULL -#define OPTION_VAL_GERMAN_EN NULL -#define OPTION_VAL_FRENCH_EN NULL -#define OPTION_VAL_SPANISH_EN NULL -#define OPTION_VAL_ITALIAN_EN NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EN NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EN NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EN NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EN NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EN NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EN NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_EN NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EN NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EN NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EN NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EN NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EN NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EN NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EN "Emulate the Ethernet broadband adapter instead of the modem. (Restart Required)" -#define CORE_OPTION_NAME_UPNP_LABEL_EN NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_EN NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EN NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EN NULL -#define OPTION_VAL_320X240_EN NULL -#define OPTION_VAL_640X480_EN NULL -#define OPTION_VAL_800X600_EN NULL -#define OPTION_VAL_960X720_EN NULL -#define OPTION_VAL_1024X768_EN NULL -#define OPTION_VAL_1280X960_EN NULL -#define OPTION_VAL_1440X1080_EN NULL -#define OPTION_VAL_1600X1200_EN NULL -#define OPTION_VAL_1920X1440_EN NULL -#define OPTION_VAL_2560X1920_EN NULL -#define OPTION_VAL_2880X2160_EN NULL -#define OPTION_VAL_3200X2400_EN NULL -#define OPTION_VAL_3840X2880_EN NULL -#define OPTION_VAL_4480X3360_EN NULL -#define OPTION_VAL_5120X3840_EN NULL -#define OPTION_VAL_5760X4320_EN NULL -#define OPTION_VAL_6400X4800_EN NULL -#define OPTION_VAL_7040X5280_EN NULL -#define OPTION_VAL_7680X5760_EN NULL -#define OPTION_VAL_8320X6240_EN NULL -#define OPTION_VAL_8960X6720_EN NULL -#define OPTION_VAL_9600X7200_EN NULL -#define OPTION_VAL_10240X7680_EN NULL -#define OPTION_VAL_10880X8160_EN NULL -#define OPTION_VAL_11520X8640_EN NULL -#define OPTION_VAL_12160X9120_EN NULL -#define OPTION_VAL_12800X9600_EN NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EN NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EN NULL -#define OPTION_VAL_VGA_EN NULL -#define OPTION_VAL_TV_RGB_EN NULL -#define OPTION_VAL_TV_COMPOSITE_EN NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_EN NULL -#define OPTION_VAL_NTSC_EN NULL -#define OPTION_VAL_PAL_EN NULL -#define OPTION_VAL_PAL_N_EN NULL -#define OPTION_VAL_PAL_M_EN NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EN NULL -#define OPTION_VAL_HORIZONTAL_EN NULL -#define OPTION_VAL_VERTICAL_EN NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EN NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EN NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_EN NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_EN NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EN NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EN NULL -#define OPTION_VAL_512MB_EN NULL -#define OPTION_VAL_1GB_EN NULL -#define OPTION_VAL_2GB_EN NULL -#define OPTION_VAL_4GB_EN NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EN NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EN NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EN "Full frame-buffer emulation" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EN "Enable full frame-buffer emulation in VRAM. This is useful for games that directly read or write the frame-buffer in VRAM. When enabled, Internal Resolution is forced to 640x480 and performance may be severely impacted." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EN NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EN NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EN NULL -#define CORE_OPTION_NAME_FOG_LABEL_EN NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EN NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EN NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EN NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EN NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EN NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EN NULL -#define OPTION_VAL_1_EN "Force Nearest-Neighbour" -#define OPTION_VAL_2_EN NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EN NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EN NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EN NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EN "Notify front-end when internal frame rate changes (e.g. from 60 fps to 30 fps). Improves frame pacing in games that run at a locked 30 fps or 20 fps, but should be disabled for games with unlocked (unstable) frame rates (e.g. Ecco the Dolphin, Unreal Tournament). Note: Unavailable when 'Auto Skip Frame' is enabled." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EN NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EN "Post-process the rendered image to simulate effects specific to the PowerVR2 GPU and analogue video signals." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EN NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EN NULL -#define OPTION_VAL_2_O27_EN NULL -#define OPTION_VAL_4_EN NULL -#define OPTION_VAL_6_EN NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EN "Texture Upscaling Maximum Filtered Size" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EN NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EN NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EN NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EN NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EN NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EN NULL -#define OPTION_VAL_SOME_EN NULL -#define OPTION_VAL_MORE_EN NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EN NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EN NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EN NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EN NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EN NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EN NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EN NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EN NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EN NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EN NULL -#define OPTION_VAL_100_EN NULL -#define OPTION_VAL_110_EN NULL -#define OPTION_VAL_120_EN NULL -#define OPTION_VAL_130_EN NULL -#define OPTION_VAL_140_EN NULL -#define OPTION_VAL_150_EN NULL -#define OPTION_VAL_160_EN NULL -#define OPTION_VAL_170_EN NULL -#define OPTION_VAL_180_EN NULL -#define OPTION_VAL_190_EN NULL -#define OPTION_VAL_200_EN NULL -#define OPTION_VAL_210_EN NULL -#define OPTION_VAL_220_EN NULL -#define OPTION_VAL_230_EN NULL -#define OPTION_VAL_240_EN NULL -#define OPTION_VAL_250_EN NULL -#define OPTION_VAL_260_EN NULL -#define OPTION_VAL_270_EN NULL -#define OPTION_VAL_280_EN NULL -#define OPTION_VAL_290_EN NULL -#define OPTION_VAL_300_EN NULL -#define OPTION_VAL_310_EN NULL -#define OPTION_VAL_320_EN NULL -#define OPTION_VAL_330_EN NULL -#define OPTION_VAL_340_EN NULL -#define OPTION_VAL_350_EN NULL -#define OPTION_VAL_360_EN NULL -#define OPTION_VAL_370_EN NULL -#define OPTION_VAL_380_EN NULL -#define OPTION_VAL_390_EN NULL -#define OPTION_VAL_400_EN NULL -#define OPTION_VAL_410_EN NULL -#define OPTION_VAL_420_EN NULL -#define OPTION_VAL_430_EN NULL -#define OPTION_VAL_440_EN NULL -#define OPTION_VAL_450_EN NULL -#define OPTION_VAL_460_EN NULL -#define OPTION_VAL_470_EN NULL -#define OPTION_VAL_480_EN NULL -#define OPTION_VAL_490_EN NULL -#define OPTION_VAL_500_EN NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EN NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EN NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EN "Analogue Stick Dead-zone" -#define OPTION_VAL_0_EN NULL -#define OPTION_VAL_5_EN NULL -#define OPTION_VAL_10_EN NULL -#define OPTION_VAL_15_EN NULL -#define OPTION_VAL_20_EN NULL -#define OPTION_VAL_25_EN NULL -#define OPTION_VAL_30_EN NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EN "Trigger Dead-zone" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EN NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EN NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EN NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EN NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EN NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EN NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EN "Enable configuration of light gun cross-hair display options. NOTE: Quick Menu may need to be toggled for this setting to take effect." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EN NULL -#define OPTION_VAL_WHITE_EN NULL -#define OPTION_VAL_RED_EN NULL -#define OPTION_VAL_GREEN_EN NULL -#define OPTION_VAL_BLUE_EN NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EN NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EN NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EN NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EN NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EN NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EN NULL -#define OPTION_VAL_VMU_A1_EN NULL -#define OPTION_VAL_ALL_VMUS_EN NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EN NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EN NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EN NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EN NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EN "Enable configuration of emulated VMU LCD screen visibility, size, position and colour. NOTE: Quick Menu may need to be toggled for this setting to take effect." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EN NULL -#define OPTION_VAL_UPPER_LEFT_EN NULL -#define OPTION_VAL_UPPER_RIGHT_EN NULL -#define OPTION_VAL_LOWER_LEFT_EN NULL -#define OPTION_VAL_LOWER_RIGHT_EN NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EN NULL -#define OPTION_VAL_1X_EN NULL -#define OPTION_VAL_3X_EN NULL -#define OPTION_VAL_5X_EN NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EN NULL -#define OPTION_VAL_DEFAULT_ON_00_EN NULL -#define OPTION_VAL_DEFAULT_OFF_01_EN NULL -#define OPTION_VAL_BLACK_02_EN NULL -#define OPTION_VAL_LIGHT_BLUE_04_EN NULL -#define OPTION_VAL_CYAN_06_EN NULL -#define OPTION_VAL_CYAN_BLUE_07_EN NULL -#define OPTION_VAL_LIGHT_GREEN_08_EN NULL -#define OPTION_VAL_CYAN_GREEN_09_EN NULL -#define OPTION_VAL_LIGHT_CYAN_10_EN NULL -#define OPTION_VAL_PURPLE_12_EN NULL -#define OPTION_VAL_LIGHT_PURPLE_13_EN NULL -#define OPTION_VAL_YELLOW_14_EN NULL -#define OPTION_VAL_GRAY_15_EN "Grey" -#define OPTION_VAL_LIGHT_PURPLE_2_16_EN NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_EN NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_EN NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_EN NULL -#define OPTION_VAL_LIGHT_RED_2_20_EN NULL -#define OPTION_VAL_MAGENTA_21_EN NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_EN NULL -#define OPTION_VAL_LIGHT_ORANGE_23_EN NULL -#define OPTION_VAL_ORANGE_24_EN NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_EN NULL -#define OPTION_VAL_LIGHT_YELLOW_26_EN NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_EN NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EN NULL -#define OPTION_VAL_40_EN NULL -#define OPTION_VAL_50_EN NULL -#define OPTION_VAL_60_EN NULL -#define OPTION_VAL_70_EN NULL -#define OPTION_VAL_80_EN NULL -#define OPTION_VAL_90_EN NULL -#define OPTION_VAL_100_O57_EN NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EN NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EN NULL +/* RETRO_LANGUAGE_EL */ -struct retro_core_option_v2_category option_cats_en[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_EN, - CATEGORY_SYSTEM_INFO_0_EN - }, - { - "video", - CATEGORY_VIDEO_LABEL_EN, - CATEGORY_VIDEO_INFO_0_EN - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_EN, - CATEGORY_PERFORMANCE_INFO_0_EN - }, - { - "hacks", - CATEGORY_HACKS_LABEL_EN, - CATEGORY_HACKS_INFO_0_EN - }, - { - "input", - CATEGORY_INPUT_LABEL_EN, - CATEGORY_INPUT_INFO_0_EN - }, - { - "vmu", - CATEGORY_VMU_LABEL_EN, - CATEGORY_VMU_INFO_0_EN - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_en[] = { - { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_EN, - NULL, - "", - NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_EN }, - { "USA", OPTION_VAL_USA_EN }, - { "Europe", OPTION_VAL_EUROPE_EN }, - { "Default", OPTION_VAL_DEFAULT_EN }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_EN, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_EN, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_EN }, - { "English", OPTION_VAL_ENGLISH_EN }, - { "German", OPTION_VAL_GERMAN_EN }, - { "French", OPTION_VAL_FRENCH_EN }, - { "Spanish", OPTION_VAL_SPANISH_EN }, - { "Italian", OPTION_VAL_ITALIAN_EN }, - { "Default", OPTION_VAL_DEFAULT_EN }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_EN, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_EN, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EN, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EN, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_EN, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EN, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif - }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_EN, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EN, - NULL, +#define CATEGORY_SYSTEM_LABEL_EL "Σύστημα" +#define CATEGORY_SYSTEM_INFO_0_EL NULL +#define CATEGORY_VIDEO_LABEL_EL "Οδηγός Βίντεο" +#define CATEGORY_VIDEO_INFO_0_EL NULL +#define CATEGORY_PERFORMANCE_LABEL_EL "Επίδοση" +#define CATEGORY_PERFORMANCE_INFO_0_EL NULL +#define CATEGORY_HACKS_LABEL_EL NULL +#define CATEGORY_HACKS_INFO_0_EL NULL +#define CATEGORY_INPUT_LABEL_EL "Οδηγός Εισαγωγής" +#define CATEGORY_INPUT_INFO_0_EL NULL +#define CATEGORY_EXPANSIONS_LABEL_EL NULL +#define CATEGORY_EXPANSIONS_INFO_0_EL NULL +#define CATEGORY_VMU_LABEL_EL NULL +#define CATEGORY_VMU_INFO_0_EL NULL +#define CORE_OPTION_NAME_REGION_LABEL_EL "Περιοχή" +#define OPTION_VAL_JAPAN_EL NULL +#define OPTION_VAL_USA_EL NULL +#define OPTION_VAL_EUROPE_EL NULL +#define OPTION_VAL_DEFAULT_EL "Προκαθορισμένο" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_EL "Γλώσσα" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EL NULL +#define OPTION_VAL_JAPANESE_EL "Ιαπωνικά" +#define OPTION_VAL_ENGLISH_EL "Αγγλικά" +#define OPTION_VAL_GERMAN_EL "Γερμανός" +#define OPTION_VAL_FRENCH_EL "Γαλλική γλώσσα" +#define OPTION_VAL_SPANISH_EL "Ισπανικά" +#define OPTION_VAL_ITALIAN_EL "Ιταλικά" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EL NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EL NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EL NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EL NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EL NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EL NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EL NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EL NULL +#define CORE_OPTION_NAME_UPNP_LABEL_EL NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_EL NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EL NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EL NULL +#define OPTION_VAL_320X240_EL NULL +#define OPTION_VAL_640X480_EL NULL +#define OPTION_VAL_800X600_EL NULL +#define OPTION_VAL_960X720_EL NULL +#define OPTION_VAL_1024X768_EL NULL +#define OPTION_VAL_1280X960_EL NULL +#define OPTION_VAL_1440X1080_EL NULL +#define OPTION_VAL_1600X1200_EL NULL +#define OPTION_VAL_1920X1440_EL NULL +#define OPTION_VAL_2560X1920_EL NULL +#define OPTION_VAL_2880X2160_EL NULL +#define OPTION_VAL_3200X2400_EL NULL +#define OPTION_VAL_3840X2880_EL NULL +#define OPTION_VAL_4480X3360_EL NULL +#define OPTION_VAL_5120X3840_EL NULL +#define OPTION_VAL_5760X4320_EL NULL +#define OPTION_VAL_6400X4800_EL NULL +#define OPTION_VAL_7040X5280_EL NULL +#define OPTION_VAL_7680X5760_EL NULL +#define OPTION_VAL_8320X6240_EL NULL +#define OPTION_VAL_8960X6720_EL NULL +#define OPTION_VAL_9600X7200_EL NULL +#define OPTION_VAL_10240X7680_EL NULL +#define OPTION_VAL_10880X8160_EL NULL +#define OPTION_VAL_11520X8640_EL NULL +#define OPTION_VAL_12160X9120_EL NULL +#define OPTION_VAL_12800X9600_EL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EL NULL +#define OPTION_VAL_VGA_EL NULL +#define OPTION_VAL_TV_RGB_EL NULL +#define OPTION_VAL_TV_COMPOSITE_EL NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_EL NULL +#define OPTION_VAL_NTSC_EL NULL +#define OPTION_VAL_PAL_EL NULL +#define OPTION_VAL_PAL_N_EL NULL +#define OPTION_VAL_PAL_M_EL NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EL "Περιστροφή οθόνης" +#define OPTION_VAL_HORIZONTAL_EL NULL +#define OPTION_VAL_VERTICAL_EL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EL NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EL NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_EL NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_EL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EL NULL +#define OPTION_VAL_512MB_EL NULL +#define OPTION_VAL_1GB_EL NULL +#define OPTION_VAL_2GB_EL NULL +#define OPTION_VAL_4GB_EL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EL NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EL NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EL NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EL NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_EL NULL +#define CORE_OPTION_NAME_FOG_LABEL_EL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EL NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EL NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EL NULL +#define OPTION_VAL_1_EL NULL +#define OPTION_VAL_2_EL NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EL NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EL NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EL NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EL NULL +#define OPTION_VAL_2_O26_EL NULL +#define OPTION_VAL_4_EL NULL +#define OPTION_VAL_6_EL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EL NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EL NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EL NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EL NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EL NULL +#define OPTION_VAL_SOME_EL "Φυσιολογικά" +#define OPTION_VAL_MORE_EL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EL NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EL NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EL NULL +#define OPTION_VAL_100_EL NULL +#define OPTION_VAL_110_EL NULL +#define OPTION_VAL_120_EL NULL +#define OPTION_VAL_130_EL NULL +#define OPTION_VAL_140_EL NULL +#define OPTION_VAL_150_EL NULL +#define OPTION_VAL_160_EL NULL +#define OPTION_VAL_170_EL NULL +#define OPTION_VAL_180_EL NULL +#define OPTION_VAL_190_EL NULL +#define OPTION_VAL_200_EL NULL +#define OPTION_VAL_210_EL NULL +#define OPTION_VAL_220_EL NULL +#define OPTION_VAL_230_EL NULL +#define OPTION_VAL_240_EL NULL +#define OPTION_VAL_250_EL NULL +#define OPTION_VAL_260_EL NULL +#define OPTION_VAL_270_EL NULL +#define OPTION_VAL_280_EL NULL +#define OPTION_VAL_290_EL NULL +#define OPTION_VAL_300_EL NULL +#define OPTION_VAL_310_EL NULL +#define OPTION_VAL_320_EL NULL +#define OPTION_VAL_330_EL NULL +#define OPTION_VAL_340_EL NULL +#define OPTION_VAL_350_EL NULL +#define OPTION_VAL_360_EL NULL +#define OPTION_VAL_370_EL NULL +#define OPTION_VAL_380_EL NULL +#define OPTION_VAL_390_EL NULL +#define OPTION_VAL_400_EL NULL +#define OPTION_VAL_410_EL NULL +#define OPTION_VAL_420_EL NULL +#define OPTION_VAL_430_EL NULL +#define OPTION_VAL_440_EL NULL +#define OPTION_VAL_450_EL NULL +#define OPTION_VAL_460_EL NULL +#define OPTION_VAL_470_EL NULL +#define OPTION_VAL_480_EL NULL +#define OPTION_VAL_490_EL NULL +#define OPTION_VAL_500_EL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EL NULL +#define OPTION_VAL_0_EL NULL +#define OPTION_VAL_5_EL NULL +#define OPTION_VAL_10_EL NULL +#define OPTION_VAL_15_EL NULL +#define OPTION_VAL_20_EL NULL +#define OPTION_VAL_25_EL NULL +#define OPTION_VAL_30_EL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EL NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EL NULL +#define OPTION_VAL_50_EL NULL +#define OPTION_VAL_60_EL NULL +#define OPTION_VAL_70_EL NULL +#define OPTION_VAL_80_EL "το 80%" +#define OPTION_VAL_90_EL NULL +#define OPTION_VAL_100_O45_EL NULL +#define OPTION_VAL_110_O45_EL NULL +#define OPTION_VAL_120_O45_EL NULL +#define OPTION_VAL_130_O45_EL NULL +#define OPTION_VAL_140_O45_EL NULL +#define OPTION_VAL_150_O45_EL NULL +#define OPTION_VAL_160_O45_EL NULL +#define OPTION_VAL_170_O45_EL NULL +#define OPTION_VAL_180_O45_EL NULL +#define OPTION_VAL_190_O45_EL NULL +#define OPTION_VAL_200_O45_EL NULL +#define OPTION_VAL_210_O45_EL NULL +#define OPTION_VAL_220_O45_EL NULL +#define OPTION_VAL_230_O45_EL NULL +#define OPTION_VAL_240_O45_EL NULL +#define OPTION_VAL_250_O45_EL NULL +#define OPTION_VAL_260_O45_EL NULL +#define OPTION_VAL_270_O45_EL NULL +#define OPTION_VAL_280_O45_EL NULL +#define OPTION_VAL_290_O45_EL NULL +#define OPTION_VAL_300_O45_EL NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EL NULL +#define OPTION_VAL_WHITE_EL NULL +#define OPTION_VAL_RED_EL "Κόκκινο" +#define OPTION_VAL_GREEN_EL "Πράσινο" +#define OPTION_VAL_BLUE_EL "Μπλε" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EL NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EL NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EL NULL +#define OPTION_VAL_VMU_EL NULL +#define OPTION_VAL_PURUPURU_EL NULL +#define OPTION_VAL_NONE_EL "Κανείς" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EL NULL +#define OPTION_VAL_VMU_A1_EL NULL +#define OPTION_VAL_ALL_VMUS_EL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EL NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EL NULL +#define OPTION_VAL_UPPER_LEFT_EL NULL +#define OPTION_VAL_UPPER_RIGHT_EL NULL +#define OPTION_VAL_LOWER_LEFT_EL NULL +#define OPTION_VAL_LOWER_RIGHT_EL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EL NULL +#define OPTION_VAL_1X_EL NULL +#define OPTION_VAL_3X_EL NULL +#define OPTION_VAL_5X_EL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EL NULL +#define OPTION_VAL_DEFAULT_ON_00_EL NULL +#define OPTION_VAL_DEFAULT_OFF_01_EL NULL +#define OPTION_VAL_BLACK_02_EL NULL +#define OPTION_VAL_LIGHT_BLUE_04_EL NULL +#define OPTION_VAL_CYAN_06_EL NULL +#define OPTION_VAL_CYAN_BLUE_07_EL NULL +#define OPTION_VAL_LIGHT_GREEN_08_EL NULL +#define OPTION_VAL_CYAN_GREEN_09_EL NULL +#define OPTION_VAL_LIGHT_CYAN_10_EL NULL +#define OPTION_VAL_PURPLE_12_EL NULL +#define OPTION_VAL_LIGHT_PURPLE_13_EL NULL +#define OPTION_VAL_YELLOW_14_EL "Κίτρινο" +#define OPTION_VAL_GRAY_15_EL NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_EL NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_EL NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_EL NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_EL NULL +#define OPTION_VAL_LIGHT_RED_2_20_EL NULL +#define OPTION_VAL_MAGENTA_21_EL NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_EL NULL +#define OPTION_VAL_LIGHT_ORANGE_23_EL NULL +#define OPTION_VAL_ORANGE_24_EL NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_EL NULL +#define OPTION_VAL_LIGHT_YELLOW_26_EL NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_EL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EL NULL +#define OPTION_VAL_40_EL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EL NULL + +struct retro_core_option_v2_category option_cats_el[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_EL, + CATEGORY_SYSTEM_INFO_0_EL + }, + { + "video", + CATEGORY_VIDEO_LABEL_EL, + CATEGORY_VIDEO_INFO_0_EL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_EL, + CATEGORY_PERFORMANCE_INFO_0_EL + }, + { + "hacks", + CATEGORY_HACKS_LABEL_EL, + CATEGORY_HACKS_INFO_0_EL + }, + { + "input", + CATEGORY_INPUT_LABEL_EL, + CATEGORY_INPUT_INFO_0_EL + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_EL, + CATEGORY_EXPANSIONS_INFO_0_EL + }, + { + "vmu", + CATEGORY_VMU_LABEL_EL, + CATEGORY_VMU_INFO_0_EL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_el[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_EL, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_EL }, + { "USA", OPTION_VAL_USA_EL }, + { "Europe", OPTION_VAL_EUROPE_EL }, + { "Default", OPTION_VAL_DEFAULT_EL }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_EL, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_EL, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_EL }, + { "English", OPTION_VAL_ENGLISH_EL }, + { "German", OPTION_VAL_GERMAN_EL }, + { "French", OPTION_VAL_FRENCH_EL }, + { "Spanish", OPTION_VAL_SPANISH_EL }, + { "Italian", OPTION_VAL_ITALIAN_EL }, + { "Default", OPTION_VAL_DEFAULT_EL }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_EL, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_EL, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EL, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EL, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_EL, + NULL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EL, + NULL, "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EN, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EL, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EN, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EL, NULL, "system", { @@ -20272,9 +22667,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EN, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EL, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EN, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EL, NULL, "system", { @@ -20286,9 +22681,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_EN, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_EL, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EN, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EL, NULL, "system", { @@ -20300,9 +22695,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_EN, + CORE_OPTION_NAME_UPNP_LABEL_EL, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_EN, + CORE_OPTION_NAME_UPNP_INFO_0_EL, NULL, "system", { @@ -20315,39 +22710,39 @@ struct retro_core_option_v2_definition option_defs_en[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EN, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EL, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EN, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EL, NULL, "video", { - { "320x240", OPTION_VAL_320X240_EN }, - { "640x480", OPTION_VAL_640X480_EN }, - { "800x600", OPTION_VAL_800X600_EN }, - { "960x720", OPTION_VAL_960X720_EN }, - { "1024x768", OPTION_VAL_1024X768_EN }, - { "1280x960", OPTION_VAL_1280X960_EN }, - { "1440x1080", OPTION_VAL_1440X1080_EN }, - { "1600x1200", OPTION_VAL_1600X1200_EN }, - { "1920x1440", OPTION_VAL_1920X1440_EN }, - { "2560x1920", OPTION_VAL_2560X1920_EN }, - { "2880x2160", OPTION_VAL_2880X2160_EN }, - { "3200x2400", OPTION_VAL_3200X2400_EN }, - { "3840x2880", OPTION_VAL_3840X2880_EN }, - { "4480x3360", OPTION_VAL_4480X3360_EN }, - { "5120x3840", OPTION_VAL_5120X3840_EN }, - { "5760x4320", OPTION_VAL_5760X4320_EN }, - { "6400x4800", OPTION_VAL_6400X4800_EN }, - { "7040x5280", OPTION_VAL_7040X5280_EN }, - { "7680x5760", OPTION_VAL_7680X5760_EN }, - { "8320x6240", OPTION_VAL_8320X6240_EN }, - { "8960x6720", OPTION_VAL_8960X6720_EN }, - { "9600x7200", OPTION_VAL_9600X7200_EN }, - { "10240x7680", OPTION_VAL_10240X7680_EN }, - { "10880x8160", OPTION_VAL_10880X8160_EN }, - { "11520x8640", OPTION_VAL_11520X8640_EN }, - { "12160x9120", OPTION_VAL_12160X9120_EN }, - { "12800x9600", OPTION_VAL_12800X9600_EN }, + { "320x240", OPTION_VAL_320X240_EL }, + { "640x480", OPTION_VAL_640X480_EL }, + { "800x600", OPTION_VAL_800X600_EL }, + { "960x720", OPTION_VAL_960X720_EL }, + { "1024x768", OPTION_VAL_1024X768_EL }, + { "1280x960", OPTION_VAL_1280X960_EL }, + { "1440x1080", OPTION_VAL_1440X1080_EL }, + { "1600x1200", OPTION_VAL_1600X1200_EL }, + { "1920x1440", OPTION_VAL_1920X1440_EL }, + { "2560x1920", OPTION_VAL_2560X1920_EL }, + { "2880x2160", OPTION_VAL_2880X2160_EL }, + { "3200x2400", OPTION_VAL_3200X2400_EL }, + { "3840x2880", OPTION_VAL_3840X2880_EL }, + { "4480x3360", OPTION_VAL_4480X3360_EL }, + { "5120x3840", OPTION_VAL_5120X3840_EL }, + { "5760x4320", OPTION_VAL_5760X4320_EL }, + { "6400x4800", OPTION_VAL_6400X4800_EL }, + { "7040x5280", OPTION_VAL_7040X5280_EL }, + { "7680x5760", OPTION_VAL_7680X5760_EL }, + { "8320x6240", OPTION_VAL_8320X6240_EL }, + { "8960x6720", OPTION_VAL_8960X6720_EL }, + { "9600x7200", OPTION_VAL_9600X7200_EL }, + { "10240x7680", OPTION_VAL_10240X7680_EL }, + { "10880x8160", OPTION_VAL_10880X8160_EL }, + { "11520x8640", OPTION_VAL_11520X8640_EL }, + { "12160x9120", OPTION_VAL_12160X9120_EL }, + { "12800x9600", OPTION_VAL_12800X9600_EL }, { NULL, NULL }, }, #ifdef LOW_RES @@ -20358,62 +22753,62 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_EN, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_EL, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EN, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EL, NULL, "video", { - { "VGA", OPTION_VAL_VGA_EN }, - { "TV (RGB)", OPTION_VAL_TV_RGB_EN }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EN }, + { "VGA", OPTION_VAL_VGA_EL }, + { "TV (RGB)", OPTION_VAL_TV_RGB_EL }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EL }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_EN, + CORE_OPTION_NAME_BROADCAST_LABEL_EL, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_EN }, - { "PAL", OPTION_VAL_PAL_EN }, - { "PAL_N", OPTION_VAL_PAL_N_EN }, - { "PAL_M", OPTION_VAL_PAL_M_EN }, - { "Default", OPTION_VAL_DEFAULT_EN }, + { "NTSC", OPTION_VAL_NTSC_EL }, + { "PAL", OPTION_VAL_PAL_EL }, + { "PAL_N", OPTION_VAL_PAL_N_EL }, + { "PAL_M", OPTION_VAL_PAL_M_EL }, + { "Default", OPTION_VAL_DEFAULT_EL }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EN, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EL, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_EN }, - { "vertical", OPTION_VAL_VERTICAL_EN }, + { "horizontal", OPTION_VAL_HORIZONTAL_EL }, + { "vertical", OPTION_VAL_VERTICAL_EL }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EN, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EL, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EN }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EN }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EL }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EL }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EN }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EL }, #endif { NULL, NULL }, }, @@ -20426,25 +22821,25 @@ struct retro_core_option_v2_definition option_defs_en[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EN, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EL, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EN, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EL, NULL, "video", { - { "512MB", OPTION_VAL_512MB_EN }, - { "1GB", OPTION_VAL_1GB_EN }, - { "2GB", OPTION_VAL_2GB_EN }, - { "4GB", OPTION_VAL_4GB_EN }, + { "512MB", OPTION_VAL_512MB_EL }, + { "1GB", OPTION_VAL_1GB_EL }, + { "2GB", OPTION_VAL_2GB_EL }, + { "4GB", OPTION_VAL_4GB_EL }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_EN, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_EL, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EN, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EL, NULL, "video", { @@ -20452,6 +22847,7 @@ struct retro_core_option_v2_definition option_defs_en[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -20460,9 +22856,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EN, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EL, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EN, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EL, NULL, "video", { @@ -20474,9 +22870,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EN, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EL, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EN, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EL, NULL, "video", { @@ -20486,11 +22882,11 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_EN, + CORE_OPTION_NAME_MIPMAPPING_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_EL, NULL, "video", { @@ -20502,7 +22898,7 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_EN, + CORE_OPTION_NAME_FOG_LABEL_EL, NULL, "", NULL, @@ -20516,9 +22912,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EN, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EL, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EN, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EL, NULL, "video", { @@ -20530,9 +22926,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EN, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EL, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EN, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EL, NULL, "video", { @@ -20547,24 +22943,24 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EN, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EL, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EN, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EL, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_EN }, - { "1", OPTION_VAL_1_EN }, - { "2", OPTION_VAL_2_EN }, + { "0", OPTION_VAL_DEFAULT_EL }, + { "1", OPTION_VAL_1_EL }, + { "2", OPTION_VAL_2_EL }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EN, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EL, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EN, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EL, NULL, "video", { @@ -20572,13 +22968,13 @@ struct retro_core_option_v2_definition option_defs_en[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EN, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EL, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EN, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EL, NULL, "video", { @@ -20590,9 +22986,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EN, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EL, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EN, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EL, NULL, "video", { @@ -20605,25 +23001,25 @@ struct retro_core_option_v2_definition option_defs_en[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_EN, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_EL, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EN, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EL, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_EN }, - { "4", OPTION_VAL_4_EN }, - { "6", OPTION_VAL_6_EN }, + { "2", OPTION_VAL_2_O26_EL }, + { "4", OPTION_VAL_4_EL }, + { "6", OPTION_VAL_6_EL }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EN, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EL, NULL, "video", { @@ -20637,9 +23033,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EN, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EL, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EN, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EL, NULL, "video", { @@ -20649,11 +23045,25 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EL, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EL, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EN, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EL, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EN, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EL, NULL, "performance", { @@ -20665,15 +23075,15 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EN, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EL, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EN, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EL, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_EN }, - { "more", OPTION_VAL_MORE_EN }, + { "some", OPTION_VAL_SOME_EL }, + { "more", OPTION_VAL_MORE_EL }, { NULL, NULL }, }, #ifdef LOW_END @@ -20684,9 +23094,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EN, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EL, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EN, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EL, NULL, "performance", { @@ -20703,9 +23113,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EN, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EL, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EN, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EL, NULL, "hacks", { @@ -20717,9 +23127,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EN, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EL, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EN, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EL, NULL, "hacks", { @@ -20731,9 +23141,9 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EN, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EL, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EN, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EL, NULL, "hacks", { @@ -20747,64 +23157,78 @@ struct retro_core_option_v2_definition option_defs_en[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EL, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EL, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_EN, + CORE_OPTION_NAME_SH4CLOCK_LABEL_EL, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_EN, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_EL, NULL, "hacks", { - { "100", OPTION_VAL_100_EN }, - { "110", OPTION_VAL_110_EN }, - { "120", OPTION_VAL_120_EN }, - { "130", OPTION_VAL_130_EN }, - { "140", OPTION_VAL_140_EN }, - { "150", OPTION_VAL_150_EN }, - { "160", OPTION_VAL_160_EN }, - { "170", OPTION_VAL_170_EN }, - { "180", OPTION_VAL_180_EN }, - { "190", OPTION_VAL_190_EN }, - { "200", OPTION_VAL_200_EN }, - { "210", OPTION_VAL_210_EN }, - { "220", OPTION_VAL_220_EN }, - { "230", OPTION_VAL_230_EN }, - { "240", OPTION_VAL_240_EN }, - { "250", OPTION_VAL_250_EN }, - { "260", OPTION_VAL_260_EN }, - { "270", OPTION_VAL_270_EN }, - { "280", OPTION_VAL_280_EN }, - { "290", OPTION_VAL_290_EN }, - { "300", OPTION_VAL_300_EN }, - { "310", OPTION_VAL_310_EN }, - { "320", OPTION_VAL_320_EN }, - { "330", OPTION_VAL_330_EN }, - { "340", OPTION_VAL_340_EN }, - { "350", OPTION_VAL_350_EN }, - { "360", OPTION_VAL_360_EN }, - { "370", OPTION_VAL_370_EN }, - { "380", OPTION_VAL_380_EN }, - { "390", OPTION_VAL_390_EN }, - { "400", OPTION_VAL_400_EN }, - { "410", OPTION_VAL_410_EN }, - { "420", OPTION_VAL_420_EN }, - { "430", OPTION_VAL_430_EN }, - { "440", OPTION_VAL_440_EN }, - { "450", OPTION_VAL_450_EN }, - { "460", OPTION_VAL_460_EN }, - { "470", OPTION_VAL_470_EN }, - { "480", OPTION_VAL_480_EN }, - { "490", OPTION_VAL_490_EN }, - { "500", OPTION_VAL_500_EN }, + { "100", OPTION_VAL_100_EL }, + { "110", OPTION_VAL_110_EL }, + { "120", OPTION_VAL_120_EL }, + { "130", OPTION_VAL_130_EL }, + { "140", OPTION_VAL_140_EL }, + { "150", OPTION_VAL_150_EL }, + { "160", OPTION_VAL_160_EL }, + { "170", OPTION_VAL_170_EL }, + { "180", OPTION_VAL_180_EL }, + { "190", OPTION_VAL_190_EL }, + { "200", OPTION_VAL_200_EL }, + { "210", OPTION_VAL_210_EL }, + { "220", OPTION_VAL_220_EL }, + { "230", OPTION_VAL_230_EL }, + { "240", OPTION_VAL_240_EL }, + { "250", OPTION_VAL_250_EL }, + { "260", OPTION_VAL_260_EL }, + { "270", OPTION_VAL_270_EL }, + { "280", OPTION_VAL_280_EL }, + { "290", OPTION_VAL_290_EL }, + { "300", OPTION_VAL_300_EL }, + { "310", OPTION_VAL_310_EL }, + { "320", OPTION_VAL_320_EL }, + { "330", OPTION_VAL_330_EL }, + { "340", OPTION_VAL_340_EL }, + { "350", OPTION_VAL_350_EL }, + { "360", OPTION_VAL_360_EL }, + { "370", OPTION_VAL_370_EL }, + { "380", OPTION_VAL_380_EL }, + { "390", OPTION_VAL_390_EL }, + { "400", OPTION_VAL_400_EL }, + { "410", OPTION_VAL_410_EL }, + { "420", OPTION_VAL_420_EL }, + { "430", OPTION_VAL_430_EL }, + { "440", OPTION_VAL_440_EL }, + { "450", OPTION_VAL_450_EL }, + { "460", OPTION_VAL_460_EL }, + { "470", OPTION_VAL_470_EL }, + { "480", OPTION_VAL_480_EL }, + { "490", OPTION_VAL_490_EL }, + { "500", OPTION_VAL_500_EL }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EN, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EL, NULL, "hacks", { @@ -20814,11 +23238,11 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EN, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EL, NULL, "hacks", { @@ -20830,47 +23254,47 @@ struct retro_core_option_v2_definition option_defs_en[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EN, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EL, NULL, "input", { - { "0%", OPTION_VAL_0_EN }, - { "5%", OPTION_VAL_5_EN }, - { "10%", OPTION_VAL_10_EN }, - { "15%", OPTION_VAL_15_EN }, - { "20%", OPTION_VAL_20_EN }, - { "25%", OPTION_VAL_25_EN }, - { "30%", OPTION_VAL_30_EN }, + { "0%", OPTION_VAL_0_EL }, + { "5%", OPTION_VAL_5_EL }, + { "10%", OPTION_VAL_10_EL }, + { "15%", OPTION_VAL_15_EL }, + { "20%", OPTION_VAL_20_EL }, + { "25%", OPTION_VAL_25_EL }, + { "30%", OPTION_VAL_30_EL }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EN, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EL, NULL, "input", { - { "0%", OPTION_VAL_0_EN }, - { "5%", OPTION_VAL_5_EN }, - { "10%", OPTION_VAL_10_EN }, - { "15%", OPTION_VAL_15_EN }, - { "20%", OPTION_VAL_20_EN }, - { "25%", OPTION_VAL_25_EN }, - { "30%", OPTION_VAL_30_EN }, + { "0%", OPTION_VAL_0_EL }, + { "5%", OPTION_VAL_5_EL }, + { "10%", OPTION_VAL_10_EL }, + { "15%", OPTION_VAL_15_EL }, + { "20%", OPTION_VAL_20_EL }, + { "25%", OPTION_VAL_25_EL }, + { "30%", OPTION_VAL_30_EL }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EN, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EL, NULL, "input", { @@ -20881,10 +23305,10 @@ struct retro_core_option_v2_definition option_defs_en[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EN, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EL, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EN, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EL, NULL, "input", { @@ -20892,451 +23316,444 @@ struct retro_core_option_v2_definition option_defs_en[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EN, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EL, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EN, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EL, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EN, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EL, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EN, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_EL }, + { "60%", OPTION_VAL_60_EL }, + { "70%", OPTION_VAL_70_EL }, + { "80%", OPTION_VAL_80_EL }, + { "90%", OPTION_VAL_90_EL }, + { "100%", OPTION_VAL_100_O45_EL }, + { "110%", OPTION_VAL_110_O45_EL }, + { "120%", OPTION_VAL_120_O45_EL }, + { "130%", OPTION_VAL_130_O45_EL }, + { "140%", OPTION_VAL_140_O45_EL }, + { "150%", OPTION_VAL_150_O45_EL }, + { "160%", OPTION_VAL_160_O45_EL }, + { "170%", OPTION_VAL_170_O45_EL }, + { "180%", OPTION_VAL_180_O45_EL }, + { "190%", OPTION_VAL_190_O45_EL }, + { "200%", OPTION_VAL_200_O45_EL }, + { "210%", OPTION_VAL_210_O45_EL }, + { "220%", OPTION_VAL_220_O45_EL }, + { "230%", OPTION_VAL_230_O45_EL }, + { "240%", OPTION_VAL_240_O45_EL }, + { "250%", OPTION_VAL_250_O45_EL }, + { "260%", OPTION_VAL_260_O45_EL }, + { "270%", OPTION_VAL_270_O45_EL }, + { "280%", OPTION_VAL_280_O45_EL }, + { "290%", OPTION_VAL_290_O45_EL }, + { "300%", OPTION_VAL_300_O45_EL }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EN, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EN }, - { "Red", OPTION_VAL_RED_EN }, - { "Green", OPTION_VAL_GREEN_EN }, - { "Blue", OPTION_VAL_BLUE_EN }, + { "White", OPTION_VAL_WHITE_EL }, + { "Red", OPTION_VAL_RED_EL }, + { "Green", OPTION_VAL_GREEN_EL }, + { "Blue", OPTION_VAL_BLUE_EL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EN, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EN }, - { "Red", OPTION_VAL_RED_EN }, - { "Green", OPTION_VAL_GREEN_EN }, - { "Blue", OPTION_VAL_BLUE_EN }, + { "White", OPTION_VAL_WHITE_EL }, + { "Red", OPTION_VAL_RED_EL }, + { "Green", OPTION_VAL_GREEN_EL }, + { "Blue", OPTION_VAL_BLUE_EL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EN, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EN }, - { "Red", OPTION_VAL_RED_EN }, - { "Green", OPTION_VAL_GREEN_EN }, - { "Blue", OPTION_VAL_BLUE_EN }, + { "White", OPTION_VAL_WHITE_EL }, + { "Red", OPTION_VAL_RED_EL }, + { "Green", OPTION_VAL_GREEN_EL }, + { "Blue", OPTION_VAL_BLUE_EL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EN, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EN }, - { "Red", OPTION_VAL_RED_EN }, - { "Green", OPTION_VAL_GREEN_EN }, - { "Blue", OPTION_VAL_BLUE_EN }, + { "White", OPTION_VAL_WHITE_EL }, + { "Red", OPTION_VAL_RED_EL }, + { "Green", OPTION_VAL_GREEN_EL }, + { "Blue", OPTION_VAL_BLUE_EL }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EN, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EN, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EN, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EL, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EL, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_EN }, - { "All VMUs", OPTION_VAL_ALL_VMUS_EN }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_EN, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EN, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_EN, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EL, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EL, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EN, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EN, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EN, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EL, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EL, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EN, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EL, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EN, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EL, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EN, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EL, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_EN }, - { "2x", OPTION_VAL_2_O27_EN }, - { "3x", OPTION_VAL_3X_EN }, - { "4x", OPTION_VAL_4_EN }, - { "5x", OPTION_VAL_5X_EN }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EN, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EL, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EN, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EL, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "VMU", OPTION_VAL_VMU_EL }, + { "Purupuru", OPTION_VAL_PURUPURU_EL }, + { "None", OPTION_VAL_NONE_EL }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EN, - NULL, - "", + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EL, NULL, "vmu", { - { "10%", OPTION_VAL_10_EN }, - { "20%", OPTION_VAL_20_EN }, - { "30%", OPTION_VAL_30_EN }, - { "40%", OPTION_VAL_40_EN }, - { "50%", OPTION_VAL_50_EN }, - { "60%", OPTION_VAL_60_EN }, - { "70%", OPTION_VAL_70_EN }, - { "80%", OPTION_VAL_80_EN }, - { "90%", OPTION_VAL_90_EN }, - { "100%", OPTION_VAL_100_O57_EN }, - { NULL, NULL }, + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_EL }, + { "All VMUs", OPTION_VAL_ALL_VMUS_EL }, + { NULL, NULL}, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EN, - NULL, - "", + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_EL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EL, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_EL, NULL, "vmu", { { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "enabled", NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EN, - NULL, - "", + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EL, NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, - { NULL, NULL }, + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "Upper Left", + "disabled" }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EN, + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EN }, - { "2x", OPTION_VAL_2_O27_EN }, - { "3x", OPTION_VAL_3X_EN }, - { "4x", OPTION_VAL_4_EN }, - { "5x", OPTION_VAL_5X_EN }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "1x", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, + { NULL, NULL }, + }, + "Upper Left", + }, + { + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EL, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_EL }, + { "2x", OPTION_VAL_2_O26_EL }, + { "3x", OPTION_VAL_3X_EL }, + { "4x", OPTION_VAL_4_EL }, + { "5x", OPTION_VAL_5X_EL }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EL, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EN, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EN }, - { "20%", OPTION_VAL_20_EN }, - { "30%", OPTION_VAL_30_EN }, - { "40%", OPTION_VAL_40_EN }, - { "50%", OPTION_VAL_50_EN }, - { "60%", OPTION_VAL_60_EN }, - { "70%", OPTION_VAL_70_EN }, - { "80%", OPTION_VAL_80_EN }, - { "90%", OPTION_VAL_90_EN }, - { "100%", OPTION_VAL_100_O57_EN }, + { "10%", OPTION_VAL_10_EL }, + { "20%", OPTION_VAL_20_EL }, + { "30%", OPTION_VAL_30_EL }, + { "40%", OPTION_VAL_40_EL }, + { "50%", OPTION_VAL_50_EL }, + { "60%", OPTION_VAL_60_EL }, + { "70%", OPTION_VAL_70_EL }, + { "80%", OPTION_VAL_80_EL }, + { "90%", OPTION_VAL_90_EL }, + { "100%", OPTION_VAL_100_O45_EL }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EN, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EL, NULL, "", NULL, @@ -21349,145 +23766,145 @@ struct retro_core_option_v2_definition option_defs_en[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EN, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EN, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EN }, - { "2x", OPTION_VAL_2_O27_EN }, - { "3x", OPTION_VAL_3X_EN }, - { "4x", OPTION_VAL_4_EN }, - { "5x", OPTION_VAL_5X_EN }, + { "1x", OPTION_VAL_1X_EL }, + { "2x", OPTION_VAL_2_O26_EL }, + { "3x", OPTION_VAL_3X_EL }, + { "4x", OPTION_VAL_4_EL }, + { "5x", OPTION_VAL_5X_EL }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EN, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EN }, - { "20%", OPTION_VAL_20_EN }, - { "30%", OPTION_VAL_30_EN }, - { "40%", OPTION_VAL_40_EN }, - { "50%", OPTION_VAL_50_EN }, - { "60%", OPTION_VAL_60_EN }, - { "70%", OPTION_VAL_70_EN }, - { "80%", OPTION_VAL_80_EN }, - { "90%", OPTION_VAL_90_EN }, - { "100%", OPTION_VAL_100_O57_EN }, + { "10%", OPTION_VAL_10_EL }, + { "20%", OPTION_VAL_20_EL }, + { "30%", OPTION_VAL_30_EL }, + { "40%", OPTION_VAL_40_EL }, + { "50%", OPTION_VAL_50_EL }, + { "60%", OPTION_VAL_60_EL }, + { "70%", OPTION_VAL_70_EL }, + { "80%", OPTION_VAL_80_EL }, + { "90%", OPTION_VAL_90_EL }, + { "100%", OPTION_VAL_100_O45_EL }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EN, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EL, NULL, "", NULL, @@ -21500,522 +23917,149 @@ struct retro_core_option_v2_definition option_defs_en[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EN, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EN, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EN }, - { "2x", OPTION_VAL_2_O27_EN }, - { "3x", OPTION_VAL_3X_EN }, - { "4x", OPTION_VAL_4_EN }, - { "5x", OPTION_VAL_5X_EN }, + { "1x", OPTION_VAL_1X_EL }, + { "2x", OPTION_VAL_2_O26_EL }, + { "3x", OPTION_VAL_3X_EL }, + { "4x", OPTION_VAL_4_EL }, + { "5x", OPTION_VAL_5X_EL }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EN, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, - { "BLACK 02", OPTION_VAL_BLACK_02_EN }, - { "BLUE 03", OPTION_VAL_BLUE_EN }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, - { "GREEN 05", OPTION_VAL_GREEN_EN }, - { "CYAN 06", OPTION_VAL_CYAN_06_EN }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, - { "RED 11", OPTION_VAL_RED_EN }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, - { "GRAY 15", OPTION_VAL_GRAY_15_EN }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, - { "WHITE 28", OPTION_VAL_WHITE_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EN, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EN }, - { "20%", OPTION_VAL_20_EN }, - { "30%", OPTION_VAL_30_EN }, - { "40%", OPTION_VAL_40_EN }, - { "50%", OPTION_VAL_50_EN }, - { "60%", OPTION_VAL_60_EN }, - { "70%", OPTION_VAL_70_EN }, - { "80%", OPTION_VAL_80_EN }, - { "90%", OPTION_VAL_90_EN }, - { "100%", OPTION_VAL_100_O57_EN }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_EL }, + { "20%", OPTION_VAL_20_EL }, + { "30%", OPTION_VAL_30_EL }, + { "40%", OPTION_VAL_40_EL }, + { "50%", OPTION_VAL_50_EL }, + { "60%", OPTION_VAL_60_EL }, + { "70%", OPTION_VAL_70_EL }, + { "80%", OPTION_VAL_80_EL }, + { "90%", OPTION_VAL_90_EL }, + { "100%", OPTION_VAL_100_O45_EL }, + { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_en = { - option_cats_en, - option_defs_en -}; - -/* RETRO_LANGUAGE_EO */ - -#define CATEGORY_SYSTEM_LABEL_EO NULL -#define CATEGORY_SYSTEM_INFO_0_EO NULL -#define CATEGORY_VIDEO_LABEL_EO "Video Driver" -#define CATEGORY_VIDEO_INFO_0_EO NULL -#define CATEGORY_PERFORMANCE_LABEL_EO NULL -#define CATEGORY_PERFORMANCE_INFO_0_EO NULL -#define CATEGORY_HACKS_LABEL_EO NULL -#define CATEGORY_HACKS_INFO_0_EO NULL -#define CATEGORY_INPUT_LABEL_EO "Input Driver" -#define CATEGORY_INPUT_INFO_0_EO NULL -#define CATEGORY_VMU_LABEL_EO NULL -#define CATEGORY_VMU_INFO_0_EO NULL -#define CORE_OPTION_NAME_REGION_LABEL_EO NULL -#define OPTION_VAL_JAPAN_EO NULL -#define OPTION_VAL_USA_EO NULL -#define OPTION_VAL_EUROPE_EO NULL -#define OPTION_VAL_DEFAULT_EO NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_EO NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EO NULL -#define OPTION_VAL_JAPANESE_EO NULL -#define OPTION_VAL_ENGLISH_EO NULL -#define OPTION_VAL_GERMAN_EO NULL -#define OPTION_VAL_FRENCH_EO NULL -#define OPTION_VAL_SPANISH_EO NULL -#define OPTION_VAL_ITALIAN_EO NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EO NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EO NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EO NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EO NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EO NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EO NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_EO NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EO NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EO NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EO NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EO NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EO NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EO NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EO NULL -#define CORE_OPTION_NAME_UPNP_LABEL_EO NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_EO NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EO "Interna Rezolucio" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EO NULL -#define OPTION_VAL_320X240_EO NULL -#define OPTION_VAL_640X480_EO NULL -#define OPTION_VAL_800X600_EO NULL -#define OPTION_VAL_960X720_EO NULL -#define OPTION_VAL_1024X768_EO NULL -#define OPTION_VAL_1280X960_EO NULL -#define OPTION_VAL_1440X1080_EO NULL -#define OPTION_VAL_1600X1200_EO NULL -#define OPTION_VAL_1920X1440_EO NULL -#define OPTION_VAL_2560X1920_EO NULL -#define OPTION_VAL_2880X2160_EO NULL -#define OPTION_VAL_3200X2400_EO NULL -#define OPTION_VAL_3840X2880_EO NULL -#define OPTION_VAL_4480X3360_EO NULL -#define OPTION_VAL_5120X3840_EO NULL -#define OPTION_VAL_5760X4320_EO NULL -#define OPTION_VAL_6400X4800_EO NULL -#define OPTION_VAL_7040X5280_EO NULL -#define OPTION_VAL_7680X5760_EO NULL -#define OPTION_VAL_8320X6240_EO NULL -#define OPTION_VAL_8960X6720_EO NULL -#define OPTION_VAL_9600X7200_EO NULL -#define OPTION_VAL_10240X7680_EO NULL -#define OPTION_VAL_10880X8160_EO NULL -#define OPTION_VAL_11520X8640_EO NULL -#define OPTION_VAL_12160X9120_EO NULL -#define OPTION_VAL_12800X9600_EO NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EO NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EO NULL -#define OPTION_VAL_VGA_EO NULL -#define OPTION_VAL_TV_RGB_EO NULL -#define OPTION_VAL_TV_COMPOSITE_EO NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_EO NULL -#define OPTION_VAL_NTSC_EO NULL -#define OPTION_VAL_PAL_EO NULL -#define OPTION_VAL_PAL_N_EO NULL -#define OPTION_VAL_PAL_M_EO NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EO NULL -#define OPTION_VAL_HORIZONTAL_EO NULL -#define OPTION_VAL_VERTICAL_EO NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EO NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EO NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_EO NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_EO NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EO NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EO NULL -#define OPTION_VAL_512MB_EO NULL -#define OPTION_VAL_1GB_EO NULL -#define OPTION_VAL_2GB_EO NULL -#define OPTION_VAL_4GB_EO NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EO NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EO NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EO NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EO NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EO NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EO NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EO NULL -#define CORE_OPTION_NAME_FOG_LABEL_EO NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EO NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EO NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EO NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EO NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EO NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EO NULL -#define OPTION_VAL_1_EO NULL -#define OPTION_VAL_2_EO NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EO NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EO NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EO NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EO NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EO NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EO NULL -#define OPTION_VAL_2_O27_EO NULL -#define OPTION_VAL_4_EO NULL -#define OPTION_VAL_6_EO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EO NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EO NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EO NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EO NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EO NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EO NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EO NULL -#define OPTION_VAL_SOME_EO NULL -#define OPTION_VAL_MORE_EO NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EO NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EO NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EO NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EO NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EO NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EO NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EO NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EO NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EO NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EO NULL -#define OPTION_VAL_100_EO NULL -#define OPTION_VAL_110_EO NULL -#define OPTION_VAL_120_EO NULL -#define OPTION_VAL_130_EO NULL -#define OPTION_VAL_140_EO NULL -#define OPTION_VAL_150_EO NULL -#define OPTION_VAL_160_EO NULL -#define OPTION_VAL_170_EO NULL -#define OPTION_VAL_180_EO NULL -#define OPTION_VAL_190_EO NULL -#define OPTION_VAL_200_EO NULL -#define OPTION_VAL_210_EO NULL -#define OPTION_VAL_220_EO NULL -#define OPTION_VAL_230_EO NULL -#define OPTION_VAL_240_EO NULL -#define OPTION_VAL_250_EO NULL -#define OPTION_VAL_260_EO NULL -#define OPTION_VAL_270_EO NULL -#define OPTION_VAL_280_EO NULL -#define OPTION_VAL_290_EO NULL -#define OPTION_VAL_300_EO NULL -#define OPTION_VAL_310_EO NULL -#define OPTION_VAL_320_EO NULL -#define OPTION_VAL_330_EO NULL -#define OPTION_VAL_340_EO NULL -#define OPTION_VAL_350_EO NULL -#define OPTION_VAL_360_EO NULL -#define OPTION_VAL_370_EO NULL -#define OPTION_VAL_380_EO NULL -#define OPTION_VAL_390_EO NULL -#define OPTION_VAL_400_EO NULL -#define OPTION_VAL_410_EO NULL -#define OPTION_VAL_420_EO NULL -#define OPTION_VAL_430_EO NULL -#define OPTION_VAL_440_EO NULL -#define OPTION_VAL_450_EO NULL -#define OPTION_VAL_460_EO NULL -#define OPTION_VAL_470_EO NULL -#define OPTION_VAL_480_EO NULL -#define OPTION_VAL_490_EO NULL -#define OPTION_VAL_500_EO NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EO NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EO NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EO NULL -#define OPTION_VAL_0_EO NULL -#define OPTION_VAL_5_EO NULL -#define OPTION_VAL_10_EO NULL -#define OPTION_VAL_15_EO NULL -#define OPTION_VAL_20_EO NULL -#define OPTION_VAL_25_EO NULL -#define OPTION_VAL_30_EO NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EO NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EO NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EO NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EO NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EO NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EO NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EO NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EO NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EO NULL -#define OPTION_VAL_WHITE_EO NULL -#define OPTION_VAL_RED_EO NULL -#define OPTION_VAL_GREEN_EO NULL -#define OPTION_VAL_BLUE_EO NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EO NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EO NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EO NULL -#define OPTION_VAL_VMU_A1_EO NULL -#define OPTION_VAL_ALL_VMUS_EO NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EO NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EO NULL -#define OPTION_VAL_UPPER_LEFT_EO NULL -#define OPTION_VAL_UPPER_RIGHT_EO NULL -#define OPTION_VAL_LOWER_LEFT_EO NULL -#define OPTION_VAL_LOWER_RIGHT_EO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EO NULL -#define OPTION_VAL_1X_EO NULL -#define OPTION_VAL_3X_EO NULL -#define OPTION_VAL_5X_EO NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EO NULL -#define OPTION_VAL_DEFAULT_ON_00_EO NULL -#define OPTION_VAL_DEFAULT_OFF_01_EO NULL -#define OPTION_VAL_BLACK_02_EO NULL -#define OPTION_VAL_LIGHT_BLUE_04_EO NULL -#define OPTION_VAL_CYAN_06_EO NULL -#define OPTION_VAL_CYAN_BLUE_07_EO NULL -#define OPTION_VAL_LIGHT_GREEN_08_EO NULL -#define OPTION_VAL_CYAN_GREEN_09_EO NULL -#define OPTION_VAL_LIGHT_CYAN_10_EO NULL -#define OPTION_VAL_PURPLE_12_EO NULL -#define OPTION_VAL_LIGHT_PURPLE_13_EO NULL -#define OPTION_VAL_YELLOW_14_EO NULL -#define OPTION_VAL_GRAY_15_EO NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_EO NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_EO NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_EO NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_EO NULL -#define OPTION_VAL_LIGHT_RED_2_20_EO NULL -#define OPTION_VAL_MAGENTA_21_EO NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_EO NULL -#define OPTION_VAL_LIGHT_ORANGE_23_EO NULL -#define OPTION_VAL_ORANGE_24_EO NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_EO NULL -#define OPTION_VAL_LIGHT_YELLOW_26_EO NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_EO NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EO NULL -#define OPTION_VAL_40_EO NULL -#define OPTION_VAL_50_EO NULL -#define OPTION_VAL_60_EO NULL -#define OPTION_VAL_70_EO NULL -#define OPTION_VAL_80_EO NULL -#define OPTION_VAL_90_EO NULL -#define OPTION_VAL_100_O57_EO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EO NULL - -struct retro_core_option_v2_category option_cats_eo[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_EO, - CATEGORY_SYSTEM_INFO_0_EO - }, - { - "video", - CATEGORY_VIDEO_LABEL_EO, - CATEGORY_VIDEO_INFO_0_EO - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_EO, - CATEGORY_PERFORMANCE_INFO_0_EO - }, - { - "hacks", - CATEGORY_HACKS_LABEL_EO, - CATEGORY_HACKS_INFO_0_EO - }, - { - "input", - CATEGORY_INPUT_LABEL_EO, - CATEGORY_INPUT_INFO_0_EO - }, { - "vmu", - CATEGORY_VMU_LABEL_EO, - CATEGORY_VMU_INFO_0_EO - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_eo[] = { - { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_EO, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EL, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_EO }, - { "USA", OPTION_VAL_USA_EO }, - { "Europe", OPTION_VAL_EUROPE_EO }, - { "Default", OPTION_VAL_DEFAULT_EO }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_EO, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_EO, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_EO }, - { "English", OPTION_VAL_ENGLISH_EO }, - { "German", OPTION_VAL_GERMAN_EO }, - { "French", OPTION_VAL_FRENCH_EO }, - { "Spanish", OPTION_VAL_SPANISH_EO }, - { "Italian", OPTION_VAL_ITALIAN_EO }, - { "Default", OPTION_VAL_DEFAULT_EO }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_EO, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_EO, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EO, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EO, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, @@ -22024,246 +24068,637 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_EO, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EL, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EL }, { NULL, NULL }, }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif + "Lower Right", }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_EO, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EL, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_EO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_EL }, + { "2x", OPTION_VAL_2_O26_EL }, + { "3x", OPTION_VAL_3X_EL }, + { "4x", OPTION_VAL_4_EL }, + { "5x", OPTION_VAL_5X_EL }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EO, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EL, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, - "disabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EO, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EL, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EL }, + { "BLACK 02", OPTION_VAL_BLACK_02_EL }, + { "BLUE 03", OPTION_VAL_BLUE_EL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EL }, + { "GREEN 05", OPTION_VAL_GREEN_EL }, + { "CYAN 06", OPTION_VAL_CYAN_06_EL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EL }, + { "RED 11", OPTION_VAL_RED_EL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EL }, + { "GRAY 15", OPTION_VAL_GRAY_15_EL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EL }, + { "WHITE 28", OPTION_VAL_WHITE_EL }, { NULL, NULL }, }, - "enabled", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_EO, + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EL, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_EO, - NULL, - CORE_OPTION_NAME_UPNP_INFO_0_EO, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_EL }, + { "20%", OPTION_VAL_20_EL }, + { "30%", OPTION_VAL_30_EL }, + { "40%", OPTION_VAL_40_EL }, + { "50%", OPTION_VAL_50_EL }, + { "60%", OPTION_VAL_60_EL }, + { "70%", OPTION_VAL_70_EL }, + { "80%", OPTION_VAL_80_EL }, + { "90%", OPTION_VAL_90_EL }, + { "100%", OPTION_VAL_100_O45_EL }, + { NULL, NULL }, }, - "enabled", + "100%", }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_el = { + option_cats_el, + option_defs_el +}; + +/* RETRO_LANGUAGE_EN */ + +#define CATEGORY_SYSTEM_LABEL_EN NULL +#define CATEGORY_SYSTEM_INFO_0_EN NULL +#define CATEGORY_VIDEO_LABEL_EN NULL +#define CATEGORY_VIDEO_INFO_0_EN NULL +#define CATEGORY_PERFORMANCE_LABEL_EN NULL +#define CATEGORY_PERFORMANCE_INFO_0_EN NULL +#define CATEGORY_HACKS_LABEL_EN NULL +#define CATEGORY_HACKS_INFO_0_EN NULL +#define CATEGORY_INPUT_LABEL_EN NULL +#define CATEGORY_INPUT_INFO_0_EN NULL +#define CATEGORY_EXPANSIONS_LABEL_EN NULL +#define CATEGORY_EXPANSIONS_INFO_0_EN NULL +#define CATEGORY_VMU_LABEL_EN NULL +#define CATEGORY_VMU_INFO_0_EN NULL +#define CORE_OPTION_NAME_REGION_LABEL_EN NULL +#define OPTION_VAL_JAPAN_EN NULL +#define OPTION_VAL_USA_EN NULL +#define OPTION_VAL_EUROPE_EN NULL +#define OPTION_VAL_DEFAULT_EN NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_EN NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EN NULL +#define OPTION_VAL_JAPANESE_EN NULL +#define OPTION_VAL_ENGLISH_EN NULL +#define OPTION_VAL_GERMAN_EN NULL +#define OPTION_VAL_FRENCH_EN NULL +#define OPTION_VAL_SPANISH_EN NULL +#define OPTION_VAL_ITALIAN_EN NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EN NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EN NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EN NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EN NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EN NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EN NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EN NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EN NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EN NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EN NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EN NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EN "Emulate the Ethernet broadband adapter instead of the modem. (Restart Required)" +#define CORE_OPTION_NAME_UPNP_LABEL_EN NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_EN NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EN NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EN NULL +#define OPTION_VAL_320X240_EN NULL +#define OPTION_VAL_640X480_EN NULL +#define OPTION_VAL_800X600_EN NULL +#define OPTION_VAL_960X720_EN NULL +#define OPTION_VAL_1024X768_EN NULL +#define OPTION_VAL_1280X960_EN NULL +#define OPTION_VAL_1440X1080_EN NULL +#define OPTION_VAL_1600X1200_EN NULL +#define OPTION_VAL_1920X1440_EN NULL +#define OPTION_VAL_2560X1920_EN NULL +#define OPTION_VAL_2880X2160_EN NULL +#define OPTION_VAL_3200X2400_EN NULL +#define OPTION_VAL_3840X2880_EN NULL +#define OPTION_VAL_4480X3360_EN NULL +#define OPTION_VAL_5120X3840_EN NULL +#define OPTION_VAL_5760X4320_EN NULL +#define OPTION_VAL_6400X4800_EN NULL +#define OPTION_VAL_7040X5280_EN NULL +#define OPTION_VAL_7680X5760_EN NULL +#define OPTION_VAL_8320X6240_EN NULL +#define OPTION_VAL_8960X6720_EN NULL +#define OPTION_VAL_9600X7200_EN NULL +#define OPTION_VAL_10240X7680_EN NULL +#define OPTION_VAL_10880X8160_EN NULL +#define OPTION_VAL_11520X8640_EN NULL +#define OPTION_VAL_12160X9120_EN NULL +#define OPTION_VAL_12800X9600_EN NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EN NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EN NULL +#define OPTION_VAL_VGA_EN NULL +#define OPTION_VAL_TV_RGB_EN NULL +#define OPTION_VAL_TV_COMPOSITE_EN NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_EN NULL +#define OPTION_VAL_NTSC_EN NULL +#define OPTION_VAL_PAL_EN NULL +#define OPTION_VAL_PAL_N_EN NULL +#define OPTION_VAL_PAL_M_EN NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EN NULL +#define OPTION_VAL_HORIZONTAL_EN NULL +#define OPTION_VAL_VERTICAL_EN NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EN NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EN NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EN NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_EN NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_EN NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EN NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EN NULL +#define OPTION_VAL_512MB_EN NULL +#define OPTION_VAL_1GB_EN NULL +#define OPTION_VAL_2GB_EN NULL +#define OPTION_VAL_4GB_EN NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EN NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EN NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EN "Full frame-buffer emulation" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EN "Enable full frame-buffer emulation in VRAM. This is useful for games that directly read or write the frame-buffer in VRAM. When enabled, Internal Resolution is forced to 640x480 and performance may be severely impacted." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EN NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EN NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EN NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_EN NULL +#define CORE_OPTION_NAME_FOG_LABEL_EN NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EN NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EN NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EN NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EN NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EN NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EN NULL +#define OPTION_VAL_1_EN "Force Nearest-Neighbour" +#define OPTION_VAL_2_EN NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EN NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EN NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EN NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EN "Notify front-end when internal frame rate changes (e.g. from 60 fps to 30 fps). Improves frame pacing in games that run at a locked 30 fps or 20 fps, but should be disabled for games with unlocked (unstable) frame rates (e.g. Ecco the Dolphin, Unreal Tournament). Note: Unavailable when 'Auto Skip Frame' is enabled." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EN NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EN "Post-process the rendered image to simulate effects specific to the PowerVR2 GPU and analogue video signals." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EN NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EN NULL +#define OPTION_VAL_2_O26_EN NULL +#define OPTION_VAL_4_EN NULL +#define OPTION_VAL_6_EN NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EN "Texture Upscaling Maximum Filtered Size" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EN NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EN NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EN NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EN NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EN NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EN NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EN NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EN NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EN NULL +#define OPTION_VAL_SOME_EN NULL +#define OPTION_VAL_MORE_EN NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EN NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EN NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EN NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EN NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EN NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EN NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EN NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EN NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EN NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EN NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EN NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EN NULL +#define OPTION_VAL_100_EN NULL +#define OPTION_VAL_110_EN NULL +#define OPTION_VAL_120_EN NULL +#define OPTION_VAL_130_EN NULL +#define OPTION_VAL_140_EN NULL +#define OPTION_VAL_150_EN NULL +#define OPTION_VAL_160_EN NULL +#define OPTION_VAL_170_EN NULL +#define OPTION_VAL_180_EN NULL +#define OPTION_VAL_190_EN NULL +#define OPTION_VAL_200_EN NULL +#define OPTION_VAL_210_EN NULL +#define OPTION_VAL_220_EN NULL +#define OPTION_VAL_230_EN NULL +#define OPTION_VAL_240_EN NULL +#define OPTION_VAL_250_EN NULL +#define OPTION_VAL_260_EN NULL +#define OPTION_VAL_270_EN NULL +#define OPTION_VAL_280_EN NULL +#define OPTION_VAL_290_EN NULL +#define OPTION_VAL_300_EN NULL +#define OPTION_VAL_310_EN NULL +#define OPTION_VAL_320_EN NULL +#define OPTION_VAL_330_EN NULL +#define OPTION_VAL_340_EN NULL +#define OPTION_VAL_350_EN NULL +#define OPTION_VAL_360_EN NULL +#define OPTION_VAL_370_EN NULL +#define OPTION_VAL_380_EN NULL +#define OPTION_VAL_390_EN NULL +#define OPTION_VAL_400_EN NULL +#define OPTION_VAL_410_EN NULL +#define OPTION_VAL_420_EN NULL +#define OPTION_VAL_430_EN NULL +#define OPTION_VAL_440_EN NULL +#define OPTION_VAL_450_EN NULL +#define OPTION_VAL_460_EN NULL +#define OPTION_VAL_470_EN NULL +#define OPTION_VAL_480_EN NULL +#define OPTION_VAL_490_EN NULL +#define OPTION_VAL_500_EN NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EN NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EN NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EN NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EN NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EN "Analogue Stick Dead-zone" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EN "Select how far you have to push the analogue stick before it starts being processed." +#define OPTION_VAL_0_EN NULL +#define OPTION_VAL_5_EN NULL +#define OPTION_VAL_10_EN NULL +#define OPTION_VAL_15_EN NULL +#define OPTION_VAL_20_EN NULL +#define OPTION_VAL_25_EN NULL +#define OPTION_VAL_30_EN NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EN "Trigger Dead-zone" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EN NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EN NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EN NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EN NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EN NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EN NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EN "Enable configuration of light gun cross-hair display options. NOTE: Quick Menu may need to be toggled for this setting to take effect." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EN NULL +#define OPTION_VAL_50_EN NULL +#define OPTION_VAL_60_EN NULL +#define OPTION_VAL_70_EN NULL +#define OPTION_VAL_80_EN NULL +#define OPTION_VAL_90_EN NULL +#define OPTION_VAL_100_O45_EN NULL +#define OPTION_VAL_110_O45_EN NULL +#define OPTION_VAL_120_O45_EN NULL +#define OPTION_VAL_130_O45_EN NULL +#define OPTION_VAL_140_O45_EN NULL +#define OPTION_VAL_150_O45_EN NULL +#define OPTION_VAL_160_O45_EN NULL +#define OPTION_VAL_170_O45_EN NULL +#define OPTION_VAL_180_O45_EN NULL +#define OPTION_VAL_190_O45_EN NULL +#define OPTION_VAL_200_O45_EN NULL +#define OPTION_VAL_210_O45_EN NULL +#define OPTION_VAL_220_O45_EN NULL +#define OPTION_VAL_230_O45_EN NULL +#define OPTION_VAL_240_O45_EN NULL +#define OPTION_VAL_250_O45_EN NULL +#define OPTION_VAL_260_O45_EN NULL +#define OPTION_VAL_270_O45_EN NULL +#define OPTION_VAL_280_O45_EN NULL +#define OPTION_VAL_290_O45_EN NULL +#define OPTION_VAL_300_O45_EN NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EN NULL +#define OPTION_VAL_WHITE_EN NULL +#define OPTION_VAL_RED_EN NULL +#define OPTION_VAL_GREEN_EN NULL +#define OPTION_VAL_BLUE_EN NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EN NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EN NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EN NULL +#define OPTION_VAL_VMU_EN NULL +#define OPTION_VAL_PURUPURU_EN NULL +#define OPTION_VAL_NONE_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EN NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EN NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EN NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EN NULL +#define OPTION_VAL_VMU_A1_EN NULL +#define OPTION_VAL_ALL_VMUS_EN NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EN NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EN NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EN NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EN NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EN "Enable configuration of emulated VMU LCD screen visibility, size, position and colour. NOTE: Quick Menu may need to be toggled for this setting to take effect." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EN NULL +#define OPTION_VAL_UPPER_LEFT_EN NULL +#define OPTION_VAL_UPPER_RIGHT_EN NULL +#define OPTION_VAL_LOWER_LEFT_EN NULL +#define OPTION_VAL_LOWER_RIGHT_EN NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EN NULL +#define OPTION_VAL_1X_EN NULL +#define OPTION_VAL_3X_EN NULL +#define OPTION_VAL_5X_EN NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EN NULL +#define OPTION_VAL_DEFAULT_ON_00_EN NULL +#define OPTION_VAL_DEFAULT_OFF_01_EN NULL +#define OPTION_VAL_BLACK_02_EN NULL +#define OPTION_VAL_LIGHT_BLUE_04_EN NULL +#define OPTION_VAL_CYAN_06_EN NULL +#define OPTION_VAL_CYAN_BLUE_07_EN NULL +#define OPTION_VAL_LIGHT_GREEN_08_EN NULL +#define OPTION_VAL_CYAN_GREEN_09_EN NULL +#define OPTION_VAL_LIGHT_CYAN_10_EN NULL +#define OPTION_VAL_PURPLE_12_EN NULL +#define OPTION_VAL_LIGHT_PURPLE_13_EN NULL +#define OPTION_VAL_YELLOW_14_EN NULL +#define OPTION_VAL_GRAY_15_EN "Grey" +#define OPTION_VAL_LIGHT_PURPLE_2_16_EN NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_EN NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_EN NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_EN NULL +#define OPTION_VAL_LIGHT_RED_2_20_EN NULL +#define OPTION_VAL_MAGENTA_21_EN NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_EN NULL +#define OPTION_VAL_LIGHT_ORANGE_23_EN NULL +#define OPTION_VAL_ORANGE_24_EN NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_EN NULL +#define OPTION_VAL_LIGHT_YELLOW_26_EN NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_EN NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EN NULL +#define OPTION_VAL_40_EN NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EN NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EN NULL +struct retro_core_option_v2_category option_cats_en[] = { { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EO, + "system", + CATEGORY_SYSTEM_LABEL_EN, + CATEGORY_SYSTEM_INFO_0_EN + }, + { + "video", + CATEGORY_VIDEO_LABEL_EN, + CATEGORY_VIDEO_INFO_0_EN + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_EN, + CATEGORY_PERFORMANCE_INFO_0_EN + }, + { + "hacks", + CATEGORY_HACKS_LABEL_EN, + CATEGORY_HACKS_INFO_0_EN + }, + { + "input", + CATEGORY_INPUT_LABEL_EN, + CATEGORY_INPUT_INFO_0_EN + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_EN, + CATEGORY_EXPANSIONS_INFO_0_EN + }, + { + "vmu", + CATEGORY_VMU_LABEL_EN, + CATEGORY_VMU_INFO_0_EN + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_en[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_EN, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EO, + "", NULL, - "video", + "system", { - { "320x240", OPTION_VAL_320X240_EO }, - { "640x480", OPTION_VAL_640X480_EO }, - { "800x600", OPTION_VAL_800X600_EO }, - { "960x720", OPTION_VAL_960X720_EO }, - { "1024x768", OPTION_VAL_1024X768_EO }, - { "1280x960", OPTION_VAL_1280X960_EO }, - { "1440x1080", OPTION_VAL_1440X1080_EO }, - { "1600x1200", OPTION_VAL_1600X1200_EO }, - { "1920x1440", OPTION_VAL_1920X1440_EO }, - { "2560x1920", OPTION_VAL_2560X1920_EO }, - { "2880x2160", OPTION_VAL_2880X2160_EO }, - { "3200x2400", OPTION_VAL_3200X2400_EO }, - { "3840x2880", OPTION_VAL_3840X2880_EO }, - { "4480x3360", OPTION_VAL_4480X3360_EO }, - { "5120x3840", OPTION_VAL_5120X3840_EO }, - { "5760x4320", OPTION_VAL_5760X4320_EO }, - { "6400x4800", OPTION_VAL_6400X4800_EO }, - { "7040x5280", OPTION_VAL_7040X5280_EO }, - { "7680x5760", OPTION_VAL_7680X5760_EO }, - { "8320x6240", OPTION_VAL_8320X6240_EO }, - { "8960x6720", OPTION_VAL_8960X6720_EO }, - { "9600x7200", OPTION_VAL_9600X7200_EO }, - { "10240x7680", OPTION_VAL_10240X7680_EO }, - { "10880x8160", OPTION_VAL_10880X8160_EO }, - { "11520x8640", OPTION_VAL_11520X8640_EO }, - { "12160x9120", OPTION_VAL_12160X9120_EO }, - { "12800x9600", OPTION_VAL_12800X9600_EO }, + { "Japan", OPTION_VAL_JAPAN_EN }, + { "USA", OPTION_VAL_USA_EN }, + { "Europe", OPTION_VAL_EUROPE_EN }, + { "Default", OPTION_VAL_DEFAULT_EN }, { NULL, NULL }, }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif + "USA", }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_EO, + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_EN, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EO, + CORE_OPTION_NAME_LANGUAGE_INFO_0_EN, NULL, - "video", + "system", { - { "VGA", OPTION_VAL_VGA_EO }, - { "TV (RGB)", OPTION_VAL_TV_RGB_EO }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EO }, + { "Japanese", OPTION_VAL_JAPANESE_EN }, + { "English", OPTION_VAL_ENGLISH_EN }, + { "German", OPTION_VAL_GERMAN_EN }, + { "French", OPTION_VAL_FRENCH_EN }, + { "Spanish", OPTION_VAL_SPANISH_EN }, + { "Italian", OPTION_VAL_ITALIAN_EN }, + { "Default", OPTION_VAL_DEFAULT_EN }, { NULL, NULL }, }, - "TV (Composite)", + "English", }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_EO, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_HLE_BIOS_INFO_0_EN, NULL, - "video", + "system", { - { "NTSC", OPTION_VAL_NTSC_EO }, - { "PAL", OPTION_VAL_PAL_EO }, - { "PAL_N", OPTION_VAL_PAL_N_EO }, - { "PAL_M", OPTION_VAL_PAL_M_EO }, - { "Default", OPTION_VAL_DEFAULT_EO }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, }, - "NTSC", + "disabled", }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EO, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EN, NULL, - "video", + "system", { - { "horizontal", OPTION_VAL_HORIZONTAL_EO }, - { "vertical", OPTION_VAL_VERTICAL_EO }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "horizontal", + "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EO, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EN, NULL, - "video", + "system", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EO }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EO }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EO }, -#endif + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", +#ifdef LOW_END + "disabled", #else - "per-triangle (normal)", + "enabled", #endif }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EO, + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EN, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EO, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EN, NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_EO }, - { "1GB", OPTION_VAL_1GB_EO }, - { "2GB", OPTION_VAL_2GB_EO }, - { "4GB", OPTION_VAL_4GB_EO }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "512MB", + "disabled", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_EO, + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EN, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EO, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EN, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "32", + "enabled", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EO, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_EN, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EO, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EN, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -22271,11 +24706,172 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EO, + { + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_EN, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EO, + CORE_OPTION_NAME_UPNP_INFO_0_EN, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + + { + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EN, + NULL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EN, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_EN }, + { "640x480", OPTION_VAL_640X480_EN }, + { "800x600", OPTION_VAL_800X600_EN }, + { "960x720", OPTION_VAL_960X720_EN }, + { "1024x768", OPTION_VAL_1024X768_EN }, + { "1280x960", OPTION_VAL_1280X960_EN }, + { "1440x1080", OPTION_VAL_1440X1080_EN }, + { "1600x1200", OPTION_VAL_1600X1200_EN }, + { "1920x1440", OPTION_VAL_1920X1440_EN }, + { "2560x1920", OPTION_VAL_2560X1920_EN }, + { "2880x2160", OPTION_VAL_2880X2160_EN }, + { "3200x2400", OPTION_VAL_3200X2400_EN }, + { "3840x2880", OPTION_VAL_3840X2880_EN }, + { "4480x3360", OPTION_VAL_4480X3360_EN }, + { "5120x3840", OPTION_VAL_5120X3840_EN }, + { "5760x4320", OPTION_VAL_5760X4320_EN }, + { "6400x4800", OPTION_VAL_6400X4800_EN }, + { "7040x5280", OPTION_VAL_7040X5280_EN }, + { "7680x5760", OPTION_VAL_7680X5760_EN }, + { "8320x6240", OPTION_VAL_8320X6240_EN }, + { "8960x6720", OPTION_VAL_8960X6720_EN }, + { "9600x7200", OPTION_VAL_9600X7200_EN }, + { "10240x7680", OPTION_VAL_10240X7680_EN }, + { "10880x8160", OPTION_VAL_10880X8160_EN }, + { "11520x8640", OPTION_VAL_11520X8640_EN }, + { "12160x9120", OPTION_VAL_12160X9120_EN }, + { "12800x9600", OPTION_VAL_12800X9600_EN }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_EN, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EN, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_EN }, + { "TV (RGB)", OPTION_VAL_TV_RGB_EN }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EN }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_EN, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_EN }, + { "PAL", OPTION_VAL_PAL_EN }, + { "PAL_N", OPTION_VAL_PAL_N_EN }, + { "PAL_M", OPTION_VAL_PAL_M_EN }, + { "Default", OPTION_VAL_DEFAULT_EN }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EN, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_EN }, + { "vertical", OPTION_VAL_VERTICAL_EN }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EN, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EN, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EN }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EN }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EN }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EN, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EN, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_EN }, + { "1GB", OPTION_VAL_1GB_EN }, + { "2GB", OPTION_VAL_2GB_EN }, + { "4GB", OPTION_VAL_4GB_EN }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_EN, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EN, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EN, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EN, NULL, "video", { @@ -22286,10 +24882,24 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EN, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EN, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_EO, + CORE_OPTION_NAME_MIPMAPPING_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_EN, NULL, "video", { @@ -22301,7 +24911,7 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_EO, + CORE_OPTION_NAME_FOG_LABEL_EN, NULL, "", NULL, @@ -22315,9 +24925,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EN, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EN, NULL, "video", { @@ -22329,9 +24939,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EN, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EN, NULL, "video", { @@ -22346,24 +24956,24 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EO, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EN, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EO, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EN, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_EO }, - { "1", OPTION_VAL_1_EO }, - { "2", OPTION_VAL_2_EO }, + { "0", OPTION_VAL_DEFAULT_EN }, + { "1", OPTION_VAL_1_EN }, + { "2", OPTION_VAL_2_EN }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EN, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EN, NULL, "video", { @@ -22371,13 +24981,13 @@ struct retro_core_option_v2_definition option_defs_eo[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EN, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EN, NULL, "video", { @@ -22389,9 +24999,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EO, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EN, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EO, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EN, NULL, "video", { @@ -22404,25 +25014,25 @@ struct retro_core_option_v2_definition option_defs_eo[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_EO, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_EN, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EO, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EN, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_EO }, - { "4", OPTION_VAL_4_EO }, - { "6", OPTION_VAL_6_EO }, + { "2", OPTION_VAL_2_O26_EN }, + { "4", OPTION_VAL_4_EN }, + { "6", OPTION_VAL_6_EN }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EO, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EN, NULL, "video", { @@ -22436,9 +25046,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EN, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EN, NULL, "video", { @@ -22448,11 +25058,25 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EN, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EN, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EO, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EN, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EO, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EN, NULL, "performance", { @@ -22464,15 +25088,15 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EN, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EN, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_EO }, - { "more", OPTION_VAL_MORE_EO }, + { "some", OPTION_VAL_SOME_EN }, + { "more", OPTION_VAL_MORE_EN }, { NULL, NULL }, }, #ifdef LOW_END @@ -22483,9 +25107,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EO, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EN, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EO, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EN, NULL, "performance", { @@ -22502,9 +25126,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EN, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EN, NULL, "hacks", { @@ -22516,9 +25140,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EO, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EN, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EO, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EN, NULL, "hacks", { @@ -22530,9 +25154,9 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EN, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EN, NULL, "hacks", { @@ -22546,64 +25170,78 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EN, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EN, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_EO, + CORE_OPTION_NAME_SH4CLOCK_LABEL_EN, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_EO, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_EN, NULL, "hacks", { - { "100", OPTION_VAL_100_EO }, - { "110", OPTION_VAL_110_EO }, - { "120", OPTION_VAL_120_EO }, - { "130", OPTION_VAL_130_EO }, - { "140", OPTION_VAL_140_EO }, - { "150", OPTION_VAL_150_EO }, - { "160", OPTION_VAL_160_EO }, - { "170", OPTION_VAL_170_EO }, - { "180", OPTION_VAL_180_EO }, - { "190", OPTION_VAL_190_EO }, - { "200", OPTION_VAL_200_EO }, - { "210", OPTION_VAL_210_EO }, - { "220", OPTION_VAL_220_EO }, - { "230", OPTION_VAL_230_EO }, - { "240", OPTION_VAL_240_EO }, - { "250", OPTION_VAL_250_EO }, - { "260", OPTION_VAL_260_EO }, - { "270", OPTION_VAL_270_EO }, - { "280", OPTION_VAL_280_EO }, - { "290", OPTION_VAL_290_EO }, - { "300", OPTION_VAL_300_EO }, - { "310", OPTION_VAL_310_EO }, - { "320", OPTION_VAL_320_EO }, - { "330", OPTION_VAL_330_EO }, - { "340", OPTION_VAL_340_EO }, - { "350", OPTION_VAL_350_EO }, - { "360", OPTION_VAL_360_EO }, - { "370", OPTION_VAL_370_EO }, - { "380", OPTION_VAL_380_EO }, - { "390", OPTION_VAL_390_EO }, - { "400", OPTION_VAL_400_EO }, - { "410", OPTION_VAL_410_EO }, - { "420", OPTION_VAL_420_EO }, - { "430", OPTION_VAL_430_EO }, - { "440", OPTION_VAL_440_EO }, - { "450", OPTION_VAL_450_EO }, - { "460", OPTION_VAL_460_EO }, - { "470", OPTION_VAL_470_EO }, - { "480", OPTION_VAL_480_EO }, - { "490", OPTION_VAL_490_EO }, - { "500", OPTION_VAL_500_EO }, + { "100", OPTION_VAL_100_EN }, + { "110", OPTION_VAL_110_EN }, + { "120", OPTION_VAL_120_EN }, + { "130", OPTION_VAL_130_EN }, + { "140", OPTION_VAL_140_EN }, + { "150", OPTION_VAL_150_EN }, + { "160", OPTION_VAL_160_EN }, + { "170", OPTION_VAL_170_EN }, + { "180", OPTION_VAL_180_EN }, + { "190", OPTION_VAL_190_EN }, + { "200", OPTION_VAL_200_EN }, + { "210", OPTION_VAL_210_EN }, + { "220", OPTION_VAL_220_EN }, + { "230", OPTION_VAL_230_EN }, + { "240", OPTION_VAL_240_EN }, + { "250", OPTION_VAL_250_EN }, + { "260", OPTION_VAL_260_EN }, + { "270", OPTION_VAL_270_EN }, + { "280", OPTION_VAL_280_EN }, + { "290", OPTION_VAL_290_EN }, + { "300", OPTION_VAL_300_EN }, + { "310", OPTION_VAL_310_EN }, + { "320", OPTION_VAL_320_EN }, + { "330", OPTION_VAL_330_EN }, + { "340", OPTION_VAL_340_EN }, + { "350", OPTION_VAL_350_EN }, + { "360", OPTION_VAL_360_EN }, + { "370", OPTION_VAL_370_EN }, + { "380", OPTION_VAL_380_EN }, + { "390", OPTION_VAL_390_EN }, + { "400", OPTION_VAL_400_EN }, + { "410", OPTION_VAL_410_EN }, + { "420", OPTION_VAL_420_EN }, + { "430", OPTION_VAL_430_EN }, + { "440", OPTION_VAL_440_EN }, + { "450", OPTION_VAL_450_EN }, + { "460", OPTION_VAL_460_EN }, + { "470", OPTION_VAL_470_EN }, + { "480", OPTION_VAL_480_EN }, + { "490", OPTION_VAL_490_EN }, + { "500", OPTION_VAL_500_EN }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EO, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EN, NULL, "hacks", { @@ -22613,11 +25251,11 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EO, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EN, NULL, "hacks", { @@ -22629,47 +25267,47 @@ struct retro_core_option_v2_definition option_defs_eo[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EO, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EN, NULL, "input", { - { "0%", OPTION_VAL_0_EO }, - { "5%", OPTION_VAL_5_EO }, - { "10%", OPTION_VAL_10_EO }, - { "15%", OPTION_VAL_15_EO }, - { "20%", OPTION_VAL_20_EO }, - { "25%", OPTION_VAL_25_EO }, - { "30%", OPTION_VAL_30_EO }, + { "0%", OPTION_VAL_0_EN }, + { "5%", OPTION_VAL_5_EN }, + { "10%", OPTION_VAL_10_EN }, + { "15%", OPTION_VAL_15_EN }, + { "20%", OPTION_VAL_20_EN }, + { "25%", OPTION_VAL_25_EN }, + { "30%", OPTION_VAL_30_EN }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EO, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EN, NULL, "input", { - { "0%", OPTION_VAL_0_EO }, - { "5%", OPTION_VAL_5_EO }, - { "10%", OPTION_VAL_10_EO }, - { "15%", OPTION_VAL_15_EO }, - { "20%", OPTION_VAL_20_EO }, - { "25%", OPTION_VAL_25_EO }, - { "30%", OPTION_VAL_30_EO }, + { "0%", OPTION_VAL_0_EN }, + { "5%", OPTION_VAL_5_EN }, + { "10%", OPTION_VAL_10_EN }, + { "15%", OPTION_VAL_15_EN }, + { "20%", OPTION_VAL_20_EN }, + { "25%", OPTION_VAL_25_EN }, + { "30%", OPTION_VAL_30_EN }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EO, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EN, NULL, "input", { @@ -22680,10 +25318,10 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_EO, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EN, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_EO, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EN, NULL, "input", { @@ -22691,300 +25329,293 @@ struct retro_core_option_v2_definition option_defs_eo[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EO, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EN, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EO, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EN, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EO, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EN, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EO, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_EN }, + { "60%", OPTION_VAL_60_EN }, + { "70%", OPTION_VAL_70_EN }, + { "80%", OPTION_VAL_80_EN }, + { "90%", OPTION_VAL_90_EN }, + { "100%", OPTION_VAL_100_O45_EN }, + { "110%", OPTION_VAL_110_O45_EN }, + { "120%", OPTION_VAL_120_O45_EN }, + { "130%", OPTION_VAL_130_O45_EN }, + { "140%", OPTION_VAL_140_O45_EN }, + { "150%", OPTION_VAL_150_O45_EN }, + { "160%", OPTION_VAL_160_O45_EN }, + { "170%", OPTION_VAL_170_O45_EN }, + { "180%", OPTION_VAL_180_O45_EN }, + { "190%", OPTION_VAL_190_O45_EN }, + { "200%", OPTION_VAL_200_O45_EN }, + { "210%", OPTION_VAL_210_O45_EN }, + { "220%", OPTION_VAL_220_O45_EN }, + { "230%", OPTION_VAL_230_O45_EN }, + { "240%", OPTION_VAL_240_O45_EN }, + { "250%", OPTION_VAL_250_O45_EN }, + { "260%", OPTION_VAL_260_O45_EN }, + { "270%", OPTION_VAL_270_O45_EN }, + { "280%", OPTION_VAL_280_O45_EN }, + { "290%", OPTION_VAL_290_O45_EN }, + { "300%", OPTION_VAL_300_O45_EN }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EO, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EN, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EO }, - { "Red", OPTION_VAL_RED_EO }, - { "Green", OPTION_VAL_GREEN_EO }, - { "Blue", OPTION_VAL_BLUE_EO }, + { "White", OPTION_VAL_WHITE_EN }, + { "Red", OPTION_VAL_RED_EN }, + { "Green", OPTION_VAL_GREEN_EN }, + { "Blue", OPTION_VAL_BLUE_EN }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EO, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EN, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EO }, - { "Red", OPTION_VAL_RED_EO }, - { "Green", OPTION_VAL_GREEN_EO }, - { "Blue", OPTION_VAL_BLUE_EO }, + { "White", OPTION_VAL_WHITE_EN }, + { "Red", OPTION_VAL_RED_EN }, + { "Green", OPTION_VAL_GREEN_EN }, + { "Blue", OPTION_VAL_BLUE_EN }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EO, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EN, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EO }, - { "Red", OPTION_VAL_RED_EO }, - { "Green", OPTION_VAL_GREEN_EO }, - { "Blue", OPTION_VAL_BLUE_EO }, + { "White", OPTION_VAL_WHITE_EN }, + { "Red", OPTION_VAL_RED_EN }, + { "Green", OPTION_VAL_GREEN_EN }, + { "Blue", OPTION_VAL_BLUE_EN }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EO, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EN, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_EO }, - { "Red", OPTION_VAL_RED_EO }, - { "Green", OPTION_VAL_GREEN_EO }, - { "Blue", OPTION_VAL_BLUE_EO }, + { "White", OPTION_VAL_WHITE_EN }, + { "Red", OPTION_VAL_RED_EN }, + { "Green", OPTION_VAL_GREEN_EN }, + { "Blue", OPTION_VAL_BLUE_EN }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EO, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EN, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EN, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_EO }, - { "All VMUs", OPTION_VAL_ALL_VMUS_EO }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_EO, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EO, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_EO, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EN, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EN, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EO, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EN, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EN, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EO, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EN, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EO, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EN, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EO, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EN, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_EO }, - { "2x", OPTION_VAL_2_O27_EO }, - { "3x", OPTION_VAL_3X_EO }, - { "4x", OPTION_VAL_4_EO }, - { "5x", OPTION_VAL_5X_EO }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EO, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EN, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EO, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EN, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EN, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "VMU", OPTION_VAL_VMU_EN }, + { "Purupuru", OPTION_VAL_PURUPURU_EN }, + { "None", OPTION_VAL_NONE_EN }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EO, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EN, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EN, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EN, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_EN }, + { "All VMUs", OPTION_VAL_ALL_VMUS_EN }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_EN, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EN, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_EN, NULL, "vmu", { - { "10%", OPTION_VAL_10_EO }, - { "20%", OPTION_VAL_20_EO }, - { "30%", OPTION_VAL_30_EO }, - { "40%", OPTION_VAL_40_EO }, - { "50%", OPTION_VAL_50_EO }, - { "60%", OPTION_VAL_60_EO }, - { "70%", OPTION_VAL_70_EO }, - { "80%", OPTION_VAL_80_EO }, - { "90%", OPTION_VAL_90_EO }, - { "100%", OPTION_VAL_100_O57_EO }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EO, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EN, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EN, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EN, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EN, NULL, "", NULL, @@ -22997,145 +25628,145 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EO, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EN, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EO, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EN, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EO }, - { "2x", OPTION_VAL_2_O27_EO }, - { "3x", OPTION_VAL_3X_EO }, - { "4x", OPTION_VAL_4_EO }, - { "5x", OPTION_VAL_5X_EO }, + { "1x", OPTION_VAL_1X_EN }, + { "2x", OPTION_VAL_2_O26_EN }, + { "3x", OPTION_VAL_3X_EN }, + { "4x", OPTION_VAL_4_EN }, + { "5x", OPTION_VAL_5X_EN }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EO, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EN, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EO }, - { "20%", OPTION_VAL_20_EO }, - { "30%", OPTION_VAL_30_EO }, - { "40%", OPTION_VAL_40_EO }, - { "50%", OPTION_VAL_50_EO }, - { "60%", OPTION_VAL_60_EO }, - { "70%", OPTION_VAL_70_EO }, - { "80%", OPTION_VAL_80_EO }, - { "90%", OPTION_VAL_90_EO }, - { "100%", OPTION_VAL_100_O57_EO }, + { "10%", OPTION_VAL_10_EN }, + { "20%", OPTION_VAL_20_EN }, + { "30%", OPTION_VAL_30_EN }, + { "40%", OPTION_VAL_40_EN }, + { "50%", OPTION_VAL_50_EN }, + { "60%", OPTION_VAL_60_EN }, + { "70%", OPTION_VAL_70_EN }, + { "80%", OPTION_VAL_80_EN }, + { "90%", OPTION_VAL_90_EN }, + { "100%", OPTION_VAL_100_O45_EN }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EO, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EN, NULL, "", NULL, @@ -23148,145 +25779,145 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EO, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EN, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EO, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EN, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EO }, - { "2x", OPTION_VAL_2_O27_EO }, - { "3x", OPTION_VAL_3X_EO }, - { "4x", OPTION_VAL_4_EO }, - { "5x", OPTION_VAL_5X_EO }, + { "1x", OPTION_VAL_1X_EN }, + { "2x", OPTION_VAL_2_O26_EN }, + { "3x", OPTION_VAL_3X_EN }, + { "4x", OPTION_VAL_4_EN }, + { "5x", OPTION_VAL_5X_EN }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EO, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EN, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EO }, - { "20%", OPTION_VAL_20_EO }, - { "30%", OPTION_VAL_30_EO }, - { "40%", OPTION_VAL_40_EO }, - { "50%", OPTION_VAL_50_EO }, - { "60%", OPTION_VAL_60_EO }, - { "70%", OPTION_VAL_70_EO }, - { "80%", OPTION_VAL_80_EO }, - { "90%", OPTION_VAL_90_EO }, - { "100%", OPTION_VAL_100_O57_EO }, + { "10%", OPTION_VAL_10_EN }, + { "20%", OPTION_VAL_20_EN }, + { "30%", OPTION_VAL_30_EN }, + { "40%", OPTION_VAL_40_EN }, + { "50%", OPTION_VAL_50_EN }, + { "60%", OPTION_VAL_60_EN }, + { "70%", OPTION_VAL_70_EN }, + { "80%", OPTION_VAL_80_EN }, + { "90%", OPTION_VAL_90_EN }, + { "100%", OPTION_VAL_100_O45_EN }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EO, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EN, NULL, "", NULL, @@ -23299,552 +25930,740 @@ struct retro_core_option_v2_definition option_defs_eo[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EO, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EN, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EO, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EN, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_EO }, - { "2x", OPTION_VAL_2_O27_EO }, - { "3x", OPTION_VAL_3X_EO }, - { "4x", OPTION_VAL_4_EO }, - { "5x", OPTION_VAL_5X_EO }, + { "1x", OPTION_VAL_1X_EN }, + { "2x", OPTION_VAL_2_O26_EN }, + { "3x", OPTION_VAL_3X_EN }, + { "4x", OPTION_VAL_4_EN }, + { "5x", OPTION_VAL_5X_EN }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EO, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EN, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, - { "BLACK 02", OPTION_VAL_BLACK_02_EO }, - { "BLUE 03", OPTION_VAL_BLUE_EO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, - { "GREEN 05", OPTION_VAL_GREEN_EO }, - { "CYAN 06", OPTION_VAL_CYAN_06_EO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, - { "RED 11", OPTION_VAL_RED_EO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, - { "GRAY 15", OPTION_VAL_GRAY_15_EO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, - { "WHITE 28", OPTION_VAL_WHITE_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EO, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EN, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_EO }, - { "20%", OPTION_VAL_20_EO }, - { "30%", OPTION_VAL_30_EO }, - { "40%", OPTION_VAL_40_EO }, - { "50%", OPTION_VAL_50_EO }, - { "60%", OPTION_VAL_60_EO }, - { "70%", OPTION_VAL_70_EO }, - { "80%", OPTION_VAL_80_EO }, - { "90%", OPTION_VAL_90_EO }, - { "100%", OPTION_VAL_100_O57_EO }, + { "10%", OPTION_VAL_10_EN }, + { "20%", OPTION_VAL_20_EN }, + { "30%", OPTION_VAL_30_EN }, + { "40%", OPTION_VAL_40_EN }, + { "50%", OPTION_VAL_50_EN }, + { "60%", OPTION_VAL_60_EN }, + { "70%", OPTION_VAL_70_EN }, + { "80%", OPTION_VAL_80_EN }, + { "90%", OPTION_VAL_90_EN }, + { "100%", OPTION_VAL_100_O45_EN }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_eo = { - option_cats_eo, - option_defs_eo -}; - -/* RETRO_LANGUAGE_ES */ - -#define CATEGORY_SYSTEM_LABEL_ES "Sistema" -#define CATEGORY_SYSTEM_INFO_0_ES "Cambia los ajustes de región, idioma, BIOS y del hardware base." -#define CATEGORY_VIDEO_LABEL_ES "Vídeo" -#define CATEGORY_VIDEO_INFO_0_ES "Cambia los ajustes de resolución, las transparencias independientes del orden y los efectos visuales." -#define CATEGORY_PERFORMANCE_LABEL_ES "Rendimiento" -#define CATEGORY_PERFORMANCE_INFO_0_ES "Configura los ajustes del renderizado multihilo y la omisión de fotogramas." -#define CATEGORY_HACKS_LABEL_ES "Arreglos de emulación" -#define CATEGORY_HACKS_INFO_0_ES "Cambia los ajustes de forzado de imagen panorámica, la velocidad de carga de GD-ROM y la sustitución de texturas." -#define CATEGORY_INPUT_LABEL_ES "Entrada" -#define CATEGORY_INPUT_INFO_0_ES "Cambia los ajustes de los mandos y las pistolas de luz." -#define CATEGORY_VMU_LABEL_ES "Visual Memory" -#define CATEGORY_VMU_INFO_0_ES "Cambia los ajustes de los archivos de VMU individuales para cada juego y la visibilidad en pantalla de las mismas." -#define CORE_OPTION_NAME_REGION_LABEL_ES "Región" -#define OPTION_VAL_JAPAN_ES "Japón" -#define OPTION_VAL_USA_ES "Estados Unidos" -#define OPTION_VAL_EUROPE_ES "Europa" -#define OPTION_VAL_DEFAULT_ES "Valor predeterminado" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_ES "Idioma" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_ES "Cambia el idioma que utilizará la BIOS y cualquier juego que contenga varios idiomas." -#define OPTION_VAL_JAPANESE_ES "Japonés" -#define OPTION_VAL_ENGLISH_ES "Inglés" -#define OPTION_VAL_GERMAN_ES "Alemán" -#define OPTION_VAL_FRENCH_ES "Francés" -#define OPTION_VAL_SPANISH_ES "Español" -#define OPTION_VAL_ITALIAN_ES "Italiano" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_ES "BIOS HLE (es necesario reiniciar)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ES "Fuerza el uso de una BIOS creada con emulación de alto nivel." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ES "Arrancar desde la BIOS (es necesario reiniciar)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ES "Arranca directamente el menú de la BIOS de Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_ES "Activar DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ES "Habilita la emulación del DSP (procesador de señales digitales) de audio de Dreamcast. Mejora la precisión del sonido generado a costa de aumentar los requisitos." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_ES "Forzar el modo Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_ES "Permite emular por completo la MMU (unidad de gestión de memoria) y otros elementos necesarios para los juegos compatibles con Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ES "Activar botones de servicio de NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ES "Activa el botón SERVICE de la placa NAOMI para acceder a la configuración del mueble." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ES "Partidas gratuitas en NAOMI" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ES "Modifica la configuración de monedas del juego a partidas gratuitas." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_ES "Emulación del Broadband Adapter (BBA)" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ES "Emula el adaptador de banda ancha por Ethernet en lugar del módem (es necesario reiniciar)." -#define CORE_OPTION_NAME_UPNP_LABEL_ES "Activar UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_ES "Utiliza UPnP para configurar automáticamente tu router/enrutador de Internet para poder conectarte a juegos online." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ES "Resolución interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ES "Modifica la resolución de renderizado." -#define OPTION_VAL_320X240_ES "320 × 240" -#define OPTION_VAL_640X480_ES "640 × 480" -#define OPTION_VAL_800X600_ES "800 × 600" -#define OPTION_VAL_960X720_ES "960 × 720" -#define OPTION_VAL_1024X768_ES "1024 × 768" -#define OPTION_VAL_1280X960_ES "1280 × 960" -#define OPTION_VAL_1440X1080_ES "1440 × 1080" -#define OPTION_VAL_1600X1200_ES "1600 × 1200" -#define OPTION_VAL_1920X1440_ES "1920 × 1440" -#define OPTION_VAL_2560X1920_ES "2560 × 1920" -#define OPTION_VAL_2880X2160_ES "2880 × 2160" -#define OPTION_VAL_3200X2400_ES "3200 × 2400" -#define OPTION_VAL_3840X2880_ES "3840 × 2880" -#define OPTION_VAL_4480X3360_ES "4480 × 3360" -#define OPTION_VAL_5120X3840_ES "5120 × 3840" -#define OPTION_VAL_5760X4320_ES "5760 × 4320" -#define OPTION_VAL_6400X4800_ES "6400 × 4800" -#define OPTION_VAL_7040X5280_ES "7040 × 5280" -#define OPTION_VAL_7680X5760_ES "7680 × 5760" -#define OPTION_VAL_8320X6240_ES "8320 × 6240" -#define OPTION_VAL_8960X6720_ES "8960 × 6720" -#define OPTION_VAL_9600X7200_ES "9600 × 7200" -#define OPTION_VAL_10240X7680_ES "10240 × 7680" -#define OPTION_VAL_10880X8160_ES "10880 × 8160" -#define OPTION_VAL_11520X8640_ES "11520 × 8640" -#define OPTION_VAL_12160X9120_ES "12160 × 9120" -#define OPTION_VAL_12800X9600_ES "12800 × 9600" -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_ES "Tipo de cable" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ES "El tipo de señal de salida de la imagen. «TV (Compuesto)» es el formato más compatible de todos." -#define OPTION_VAL_VGA_ES NULL -#define OPTION_VAL_TV_RGB_ES NULL -#define OPTION_VAL_TV_COMPOSITE_ES "TV (Compuesto)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_ES "Estándar de transmisión" -#define OPTION_VAL_NTSC_ES NULL -#define OPTION_VAL_PAL_ES "PAL (Resto del mundo)" -#define OPTION_VAL_PAL_N_ES NULL -#define OPTION_VAL_PAL_M_ES "PAL-M (Brasil)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ES "Orientación de pantalla" -#define OPTION_VAL_HORIZONTAL_ES NULL -#define OPTION_VAL_VERTICAL_ES NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ES "Ordenación de transparencias" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ES "Por bandas (rápida, menos precisa)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_ES "Por triángulos (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_ES "Por píxeles (precisa, pero lenta)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ES "Tamaño del búfer de acumulación de píxeles" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ES "Es posible que sea necesario un valor alto para que la imagen se muestre bien a resoluciones superiores a la nativa." -#define OPTION_VAL_512MB_ES "512 MB" -#define OPTION_VAL_1GB_ES "1 GB" -#define OPTION_VAL_2GB_ES "2 GB" -#define OPTION_VAL_4GB_ES "4 GB" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_ES "N.º máximo de capas transparentes" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ES "Las escenas más complejas podrían necesitar un valor más alto." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ES "Emulación completa del framebuffer" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ES "Activa la emulación completa del framebuffer dentro de la VRAM. Ideal para aquellos juegos que lean o escriban directamente al framebuffer en la VRAM. Al activar esta opción, se forzará una resolución interna de 640 × 480 y el rendimiento podría verse gravemente afectado." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ES "Activar el búfer RTT (renderizado a texturas)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ES "Copia las texturas renderizadas en la GPU de vuelta a la VRAM. Esta opción suele dejarse activada para aquellos juegos que la requieran. Al activar esta opción, se desactivará el escalado de texturas y el rendimiento podría verse afectado." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_ES "«Mipmapping»" -#define CORE_OPTION_NAME_FOG_LABEL_ES "Efectos de niebla" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ES "Modificador de volúmenes" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ES "Una característica de la GPU de Dreamcast que suelen utilizar los juegos para dibujar las sombras de objetos. Esta opción debe activarse por norma general; apenas afecta al rendimiento." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ES "Filtrado anisotrópico" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ES "Mejora la calidad de las texturas en aquellas superficies que se encuentren en un ángulo oblicuo respecto a la cámara. Un valor muy alto necesitará de mayores recursos de la GPU. Es necesario reiniciar para aplicar los cambios en este ajuste." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ES "Filtrado de texturas" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ES "Indica el modo de filtrado de texturas que se utilizará. Puede utilizarse para forzar un modo de filtrado concreto en todas las texturas con el fin de conseguir un aspecto más definido (o suavizado) que el valor predeterminado. Cualquier valor que no sea el predeterminado puede provocar problemas de renderizado. Es necesario reiniciar para aplicar los cambios en este ajuste." -#define OPTION_VAL_1_ES "Forzar vecino más cercano" -#define OPTION_VAL_2_ES "Forzar lineal" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ES "Retrasar cambio de fotogramas" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ES "Ideal para evitar parpadeos constantes o vídeos con fallos gráficos. No se recomienda su uso en plataformas lentas." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ES "Detectar cambios en la frecuencia de actualización" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ES "Informa en el front-end cuando cambie la frecuencia de actualización interna (p. ej.: de 60 a 30 FPS). Mejora la cadencia de fotogramas en aquellos juegos que se ejecuten a 30 o 20 FPS fijos, pero esta opción debería desactivarse en aquellos juegos con frecuencias de fotogramas desbloqueadas (es decir, inestables, p. ej.: Ecco the Dolphin, Unreal Tournament...). NOTA: esta opción no estará disponible si se activa Omisión automática de fotogramas." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ES "Filtro de posprocesamiento del PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ES "Posprocesa la imagen renderizada para simular los efectos dedicados de la GPU PowerVR2 y las señales de vídeo analógico." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_ES "Reescalado de texturas (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ES "Mejora los gráficos 2D de corte «pixel art» dibujado a mano. Utilizar solo con juegos en 2D pixelado." -#define OPTION_VAL_2_O27_ES NULL -#define OPTION_VAL_4_ES NULL -#define OPTION_VAL_6_ES NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ES "Tamaño máximo del escalado de texturas" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ES "Interpolación nativa de profundidad" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ES "Mitiga la corrupción de texturas y los problemas de profundidad en GPU de AMD. En algunos casos podría ayudar también en GPU de Intel." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ES "Renderizado multihilo" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ES "Ejecuta la GPU y la CPU en hilos distintos. Muy recomendado." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ES "Omisión automática de fotogramas" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ES "Omite fotogramas de forma automática cuando el emulador se esté ejecutando lentamente. Nota: este ajuste solo surtirá efecto cuando la opción «Renderizado multihilo» esté activada." -#define OPTION_VAL_SOME_ES NULL -#define OPTION_VAL_MORE_ES "Valor máximo" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ES "Omisión de fotogramas" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ES "Establece la cantidad de fotogramas que se omitirán tras cada fotograma que se muestre." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ES "Trucos para pantallas panorámicas (es necesario reiniciar)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ES "Activa los trucos que permiten a ciertos juegos mostrarse en formato panorámico." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ES "Arreglo para pantallas panorámicas" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ES "Dibuja la geometría más allá de la relación de aspecto normal de 4:3. Puede producir fallos gráficos en las zonas reveladas." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ES "Lectura rápida de GD-ROM (inexacta)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ES "Acelera la carga de los GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_ES "Velocidad de la CPU SH4" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_ES "Cambia la velocidad de reloj de la CPU SH4 principal de los 200 MHz. Una bajada de velocidad podría ayudar a plataformas lentas. Una subida podría acelerar la velocidad de fotogramas en ciertos juegos. Utilizar con precaución." -#define OPTION_VAL_100_ES "100 MHz" -#define OPTION_VAL_110_ES "110 MHz" -#define OPTION_VAL_120_ES "120 MHz" -#define OPTION_VAL_130_ES "130 MHz" -#define OPTION_VAL_140_ES "140 MHz" -#define OPTION_VAL_150_ES "150 MHz" -#define OPTION_VAL_160_ES "160 MHz" -#define OPTION_VAL_170_ES "170 MHz" -#define OPTION_VAL_180_ES "180 MHz" -#define OPTION_VAL_190_ES "190 MHz" -#define OPTION_VAL_200_ES "200 MHz" -#define OPTION_VAL_210_ES "210 MHz" -#define OPTION_VAL_220_ES "220 MHz" -#define OPTION_VAL_230_ES "230 MHz" -#define OPTION_VAL_240_ES "240 MHz" -#define OPTION_VAL_250_ES "250 MHz" -#define OPTION_VAL_260_ES "260 MHz" -#define OPTION_VAL_270_ES "270 MHz" -#define OPTION_VAL_280_ES "280 MHz" -#define OPTION_VAL_290_ES "290 MHz" -#define OPTION_VAL_300_ES "300 MHz" -#define OPTION_VAL_310_ES "310 MHz" -#define OPTION_VAL_320_ES "320 MHz" -#define OPTION_VAL_330_ES "330 MHz" -#define OPTION_VAL_340_ES "340 MHz" -#define OPTION_VAL_350_ES "350 MHz" -#define OPTION_VAL_360_ES "360 MHz" -#define OPTION_VAL_370_ES "370 MHz" -#define OPTION_VAL_380_ES "380 MHz" -#define OPTION_VAL_390_ES "390 MHz" -#define OPTION_VAL_400_ES "400 MHz" -#define OPTION_VAL_410_ES "410 MHz" -#define OPTION_VAL_420_ES "420 MHz" -#define OPTION_VAL_430_ES "430 MHz" -#define OPTION_VAL_440_ES "440 MHz" -#define OPTION_VAL_450_ES "450 MHz" -#define OPTION_VAL_460_ES "460 MHz" -#define OPTION_VAL_470_ES "470 MHz" -#define OPTION_VAL_480_ES "480 MHz" -#define OPTION_VAL_490_ES "490 MHz" -#define OPTION_VAL_500_ES "500 MHz" -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ES "Cargar texturas personalizadas" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ES "Volcar texturas" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ES "Zona muerta del stick analógico" -#define OPTION_VAL_0_ES "0 %" -#define OPTION_VAL_5_ES "5 %" -#define OPTION_VAL_10_ES "10 %" -#define OPTION_VAL_15_ES "15 %" -#define OPTION_VAL_20_ES "20 %" -#define OPTION_VAL_25_ES "25 %" -#define OPTION_VAL_30_ES "30 %" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ES "Zona muerta de los gatillos" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ES "Gatillos digitales" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_ES "Puru Puru/Vibration Pack (Vibración)" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_ES "Activa la vibración del mando." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ES "Transmitir salidas digitales" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ES "Transmite las salidas digitales y el estado de la vibración al puerto TCP 8000. Compatible con la opción de MAME «-output network»." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ES "Mostrar ajustes de las pistolas de luz" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ES "Permite configurar los puntos de mira de las pistolas de luz. NOTA: es necesario salir y volver a entrar del menú rápido para que el cambio surta efecto." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 1" -#define OPTION_VAL_WHITE_ES "Blanco" -#define OPTION_VAL_RED_ES "Rojo" -#define OPTION_VAL_GREEN_ES "Verde" -#define OPTION_VAL_BLUE_ES "Azul" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ES "Separar Visual Memory (VMU) por juego" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ES "VMUs individuales para cada juego" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ES "Al desactivar esta opción, todos los juegos compartirán cuatro archivos de guardado de VMU (A1, B1, C1 y D1) que se encontrarán en el directorio del sistema de RetroArch. El ajuste «VMU A1» creará un archivo único de la VMU A1 en el directorio de guardados de RetroArch para cada juego que se ejecute. «Todas las VMU» creará cuatro archivos VMU únicos (A1, B1, C1 y D1) para cada juego que se ejecute." -#define OPTION_VAL_VMU_A1_ES NULL -#define OPTION_VAL_ALL_VMUS_ES "Todas las VMUs" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_ES "Sonidos de las Visual Memory (VMU)" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ES "Sonidos de Visual Memory/VMU" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_ES "Al activar esta opción, se reproducirán los pitidos de las Visual Memory/VMU." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ES "Mostrar ajustes de visualización de las Visual Memory (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ES "Mostrar ajustes de visualización de las VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ES "Permite configurar la visibilidad, tamaño, posición y color de las pantallas LCD emuladas de las VMU. NOTA: es necesario salir y volver a entrar del menú rápido para que el cambio surta efecto." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 1" -#define OPTION_VAL_UPPER_LEFT_ES "Esquina superior izquierda" -#define OPTION_VAL_UPPER_RIGHT_ES "Esquina superior derecha" -#define OPTION_VAL_LOWER_LEFT_ES "Esquina inferior izquierda" -#define OPTION_VAL_LOWER_RIGHT_ES "Esquina interior derecha" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 1" -#define OPTION_VAL_1X_ES NULL -#define OPTION_VAL_3X_ES NULL -#define OPTION_VAL_5X_ES NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 1" -#define OPTION_VAL_DEFAULT_ON_00_ES "Predeterminado (encendido)" -#define OPTION_VAL_DEFAULT_OFF_01_ES "Predeterminado (apagado)" -#define OPTION_VAL_BLACK_02_ES "Negro" -#define OPTION_VAL_LIGHT_BLUE_04_ES "Azul claro" -#define OPTION_VAL_CYAN_06_ES "Cian" -#define OPTION_VAL_CYAN_BLUE_07_ES "Azul celeste" -#define OPTION_VAL_LIGHT_GREEN_08_ES "Verde claro" -#define OPTION_VAL_CYAN_GREEN_09_ES "Verde cian" -#define OPTION_VAL_LIGHT_CYAN_10_ES "Cian claro" -#define OPTION_VAL_PURPLE_12_ES "Violeta" -#define OPTION_VAL_LIGHT_PURPLE_13_ES "Violeta claro" -#define OPTION_VAL_YELLOW_14_ES "Amarillo" -#define OPTION_VAL_GRAY_15_ES "Gris" -#define OPTION_VAL_LIGHT_PURPLE_2_16_ES "Violeta claro (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_ES "Verde claro (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_ES "Verde claro (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_ES "Cian claro (2)" -#define OPTION_VAL_LIGHT_RED_2_20_ES "Rojo claro (2)" -#define OPTION_VAL_MAGENTA_21_ES NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_ES "Violeta claro (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_ES "Naranja claro" -#define OPTION_VAL_ORANGE_24_ES "Naranja" -#define OPTION_VAL_LIGHT_PURPLE_4_25_ES "Violeta claro (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_ES "Amarillo claro" -#define OPTION_VAL_LIGHT_YELLOW_2_27_ES "Amarillo claro (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 1" -#define OPTION_VAL_40_ES "40 %" -#define OPTION_VAL_50_ES "50 %" -#define OPTION_VAL_60_ES "60 %" -#define OPTION_VAL_70_ES "70 %" -#define OPTION_VAL_80_ES "80 %" -#define OPTION_VAL_90_ES "90 %" -#define OPTION_VAL_100_O57_ES "100 %" -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 4" - -struct retro_core_option_v2_category option_cats_es[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_ES, - CATEGORY_SYSTEM_INFO_0_ES - }, - { - "video", - CATEGORY_VIDEO_LABEL_ES, - CATEGORY_VIDEO_INFO_0_ES - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_ES, - CATEGORY_PERFORMANCE_INFO_0_ES - }, - { - "hacks", - CATEGORY_HACKS_LABEL_ES, - CATEGORY_HACKS_INFO_0_ES - }, - { - "input", - CATEGORY_INPUT_LABEL_ES, - CATEGORY_INPUT_INFO_0_ES - }, - { - "vmu", - CATEGORY_VMU_LABEL_ES, - CATEGORY_VMU_INFO_0_ES - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_es[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_ES, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EN, NULL, "", NULL, - "system", + "vmu", { - { "Japan", OPTION_VAL_JAPAN_ES }, - { "USA", OPTION_VAL_USA_ES }, - { "Europe", OPTION_VAL_EUROPE_ES }, - { "Default", OPTION_VAL_DEFAULT_ES }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "USA", + "disabled", }, { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_ES, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EN, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_ES, + "", NULL, - "system", + "vmu", { - { "Japanese", OPTION_VAL_JAPANESE_ES }, - { "English", OPTION_VAL_ENGLISH_ES }, - { "German", OPTION_VAL_GERMAN_ES }, - { "French", OPTION_VAL_FRENCH_ES }, - { "Spanish", OPTION_VAL_SPANISH_ES }, - { "Italian", OPTION_VAL_ITALIAN_ES }, - { "Default", OPTION_VAL_DEFAULT_ES }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EN }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EN }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EN }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EN }, { NULL, NULL }, }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_ES, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_ES, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ES, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EN, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ES, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_EN }, + { "2x", OPTION_VAL_2_O26_EN }, + { "3x", OPTION_VAL_3X_EN }, + { "4x", OPTION_VAL_4_EN }, + { "5x", OPTION_VAL_5X_EN }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_ES, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EN, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ES, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, { NULL, NULL }, }, -#ifdef LOW_END + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EN, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EN }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EN }, + { "BLACK 02", OPTION_VAL_BLACK_02_EN }, + { "BLUE 03", OPTION_VAL_BLUE_EN }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EN }, + { "GREEN 05", OPTION_VAL_GREEN_EN }, + { "CYAN 06", OPTION_VAL_CYAN_06_EN }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EN }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EN }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EN }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EN }, + { "RED 11", OPTION_VAL_RED_EN }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EN }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EN }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EN }, + { "GRAY 15", OPTION_VAL_GRAY_15_EN }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EN }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EN }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EN }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EN }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EN }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EN }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EN }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EN }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EN }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EN }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EN }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EN }, + { "WHITE 28", OPTION_VAL_WHITE_EN }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EN, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_EN }, + { "20%", OPTION_VAL_20_EN }, + { "30%", OPTION_VAL_30_EN }, + { "40%", OPTION_VAL_40_EN }, + { "50%", OPTION_VAL_50_EN }, + { "60%", OPTION_VAL_60_EN }, + { "70%", OPTION_VAL_70_EN }, + { "80%", OPTION_VAL_80_EN }, + { "90%", OPTION_VAL_90_EN }, + { "100%", OPTION_VAL_100_O45_EN }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_en = { + option_cats_en, + option_defs_en +}; + +/* RETRO_LANGUAGE_EO */ + +#define CATEGORY_SYSTEM_LABEL_EO NULL +#define CATEGORY_SYSTEM_INFO_0_EO NULL +#define CATEGORY_VIDEO_LABEL_EO "Video Driver" +#define CATEGORY_VIDEO_INFO_0_EO NULL +#define CATEGORY_PERFORMANCE_LABEL_EO NULL +#define CATEGORY_PERFORMANCE_INFO_0_EO NULL +#define CATEGORY_HACKS_LABEL_EO NULL +#define CATEGORY_HACKS_INFO_0_EO NULL +#define CATEGORY_INPUT_LABEL_EO "Input Driver" +#define CATEGORY_INPUT_INFO_0_EO NULL +#define CATEGORY_EXPANSIONS_LABEL_EO NULL +#define CATEGORY_EXPANSIONS_INFO_0_EO NULL +#define CATEGORY_VMU_LABEL_EO NULL +#define CATEGORY_VMU_INFO_0_EO NULL +#define CORE_OPTION_NAME_REGION_LABEL_EO NULL +#define OPTION_VAL_JAPAN_EO NULL +#define OPTION_VAL_USA_EO NULL +#define OPTION_VAL_EUROPE_EO NULL +#define OPTION_VAL_DEFAULT_EO NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_EO NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_EO NULL +#define OPTION_VAL_JAPANESE_EO NULL +#define OPTION_VAL_ENGLISH_EO NULL +#define OPTION_VAL_GERMAN_EO NULL +#define OPTION_VAL_FRENCH_EO NULL +#define OPTION_VAL_SPANISH_EO NULL +#define OPTION_VAL_ITALIAN_EO NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_EO NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_EO NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EO NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EO NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_EO NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EO NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EO NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EO NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EO NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EO NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_EO NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EO NULL +#define CORE_OPTION_NAME_UPNP_LABEL_EO NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_EO NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EO "Interna Rezolucio" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EO NULL +#define OPTION_VAL_320X240_EO NULL +#define OPTION_VAL_640X480_EO NULL +#define OPTION_VAL_800X600_EO NULL +#define OPTION_VAL_960X720_EO NULL +#define OPTION_VAL_1024X768_EO NULL +#define OPTION_VAL_1280X960_EO NULL +#define OPTION_VAL_1440X1080_EO NULL +#define OPTION_VAL_1600X1200_EO NULL +#define OPTION_VAL_1920X1440_EO NULL +#define OPTION_VAL_2560X1920_EO NULL +#define OPTION_VAL_2880X2160_EO NULL +#define OPTION_VAL_3200X2400_EO NULL +#define OPTION_VAL_3840X2880_EO NULL +#define OPTION_VAL_4480X3360_EO NULL +#define OPTION_VAL_5120X3840_EO NULL +#define OPTION_VAL_5760X4320_EO NULL +#define OPTION_VAL_6400X4800_EO NULL +#define OPTION_VAL_7040X5280_EO NULL +#define OPTION_VAL_7680X5760_EO NULL +#define OPTION_VAL_8320X6240_EO NULL +#define OPTION_VAL_8960X6720_EO NULL +#define OPTION_VAL_9600X7200_EO NULL +#define OPTION_VAL_10240X7680_EO NULL +#define OPTION_VAL_10880X8160_EO NULL +#define OPTION_VAL_11520X8640_EO NULL +#define OPTION_VAL_12160X9120_EO NULL +#define OPTION_VAL_12800X9600_EO NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_EO NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EO NULL +#define OPTION_VAL_VGA_EO NULL +#define OPTION_VAL_TV_RGB_EO NULL +#define OPTION_VAL_TV_COMPOSITE_EO NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_EO NULL +#define OPTION_VAL_NTSC_EO NULL +#define OPTION_VAL_PAL_EO NULL +#define OPTION_VAL_PAL_N_EO NULL +#define OPTION_VAL_PAL_M_EO NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EO NULL +#define OPTION_VAL_HORIZONTAL_EO NULL +#define OPTION_VAL_VERTICAL_EO NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EO NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EO NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EO NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_EO NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_EO NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EO NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EO NULL +#define OPTION_VAL_512MB_EO NULL +#define OPTION_VAL_1GB_EO NULL +#define OPTION_VAL_2GB_EO NULL +#define OPTION_VAL_4GB_EO NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_EO NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EO NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EO NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EO NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EO NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EO NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_EO NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_EO NULL +#define CORE_OPTION_NAME_FOG_LABEL_EO NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EO NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EO NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EO NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EO NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EO NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EO NULL +#define OPTION_VAL_1_EO NULL +#define OPTION_VAL_2_EO NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EO NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EO NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EO NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EO NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EO NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_EO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EO NULL +#define OPTION_VAL_2_O26_EO NULL +#define OPTION_VAL_4_EO NULL +#define OPTION_VAL_6_EO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EO NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EO NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EO NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EO NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EO NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EO NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EO NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EO NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EO NULL +#define OPTION_VAL_SOME_EO NULL +#define OPTION_VAL_MORE_EO NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EO NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EO NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EO NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EO NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EO NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EO NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EO NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EO NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EO NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EO NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_EO NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_EO NULL +#define OPTION_VAL_100_EO NULL +#define OPTION_VAL_110_EO NULL +#define OPTION_VAL_120_EO NULL +#define OPTION_VAL_130_EO NULL +#define OPTION_VAL_140_EO NULL +#define OPTION_VAL_150_EO NULL +#define OPTION_VAL_160_EO NULL +#define OPTION_VAL_170_EO NULL +#define OPTION_VAL_180_EO NULL +#define OPTION_VAL_190_EO NULL +#define OPTION_VAL_200_EO NULL +#define OPTION_VAL_210_EO NULL +#define OPTION_VAL_220_EO NULL +#define OPTION_VAL_230_EO NULL +#define OPTION_VAL_240_EO NULL +#define OPTION_VAL_250_EO NULL +#define OPTION_VAL_260_EO NULL +#define OPTION_VAL_270_EO NULL +#define OPTION_VAL_280_EO NULL +#define OPTION_VAL_290_EO NULL +#define OPTION_VAL_300_EO NULL +#define OPTION_VAL_310_EO NULL +#define OPTION_VAL_320_EO NULL +#define OPTION_VAL_330_EO NULL +#define OPTION_VAL_340_EO NULL +#define OPTION_VAL_350_EO NULL +#define OPTION_VAL_360_EO NULL +#define OPTION_VAL_370_EO NULL +#define OPTION_VAL_380_EO NULL +#define OPTION_VAL_390_EO NULL +#define OPTION_VAL_400_EO NULL +#define OPTION_VAL_410_EO NULL +#define OPTION_VAL_420_EO NULL +#define OPTION_VAL_430_EO NULL +#define OPTION_VAL_440_EO NULL +#define OPTION_VAL_450_EO NULL +#define OPTION_VAL_460_EO NULL +#define OPTION_VAL_470_EO NULL +#define OPTION_VAL_480_EO NULL +#define OPTION_VAL_490_EO NULL +#define OPTION_VAL_500_EO NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EO NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EO NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EO NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EO NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EO NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EO NULL +#define OPTION_VAL_0_EO NULL +#define OPTION_VAL_5_EO NULL +#define OPTION_VAL_10_EO NULL +#define OPTION_VAL_15_EO NULL +#define OPTION_VAL_20_EO NULL +#define OPTION_VAL_25_EO NULL +#define OPTION_VAL_30_EO NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EO NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EO NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EO NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EO NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EO NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EO NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EO NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EO NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EO NULL +#define OPTION_VAL_50_EO NULL +#define OPTION_VAL_60_EO NULL +#define OPTION_VAL_70_EO NULL +#define OPTION_VAL_80_EO NULL +#define OPTION_VAL_90_EO NULL +#define OPTION_VAL_100_O45_EO NULL +#define OPTION_VAL_110_O45_EO NULL +#define OPTION_VAL_120_O45_EO NULL +#define OPTION_VAL_130_O45_EO NULL +#define OPTION_VAL_140_O45_EO NULL +#define OPTION_VAL_150_O45_EO NULL +#define OPTION_VAL_160_O45_EO NULL +#define OPTION_VAL_170_O45_EO NULL +#define OPTION_VAL_180_O45_EO NULL +#define OPTION_VAL_190_O45_EO NULL +#define OPTION_VAL_200_O45_EO NULL +#define OPTION_VAL_210_O45_EO NULL +#define OPTION_VAL_220_O45_EO NULL +#define OPTION_VAL_230_O45_EO NULL +#define OPTION_VAL_240_O45_EO NULL +#define OPTION_VAL_250_O45_EO NULL +#define OPTION_VAL_260_O45_EO NULL +#define OPTION_VAL_270_O45_EO NULL +#define OPTION_VAL_280_O45_EO NULL +#define OPTION_VAL_290_O45_EO NULL +#define OPTION_VAL_300_O45_EO NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EO NULL +#define OPTION_VAL_WHITE_EO NULL +#define OPTION_VAL_RED_EO NULL +#define OPTION_VAL_GREEN_EO NULL +#define OPTION_VAL_BLUE_EO NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EO NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EO NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EO NULL +#define OPTION_VAL_VMU_EO NULL +#define OPTION_VAL_PURUPURU_EO NULL +#define OPTION_VAL_NONE_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EO NULL +#define OPTION_VAL_VMU_A1_EO NULL +#define OPTION_VAL_ALL_VMUS_EO NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EO NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_EO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EO NULL +#define OPTION_VAL_UPPER_LEFT_EO NULL +#define OPTION_VAL_UPPER_RIGHT_EO NULL +#define OPTION_VAL_LOWER_LEFT_EO NULL +#define OPTION_VAL_LOWER_RIGHT_EO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EO NULL +#define OPTION_VAL_1X_EO NULL +#define OPTION_VAL_3X_EO NULL +#define OPTION_VAL_5X_EO NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EO NULL +#define OPTION_VAL_DEFAULT_ON_00_EO NULL +#define OPTION_VAL_DEFAULT_OFF_01_EO NULL +#define OPTION_VAL_BLACK_02_EO NULL +#define OPTION_VAL_LIGHT_BLUE_04_EO NULL +#define OPTION_VAL_CYAN_06_EO NULL +#define OPTION_VAL_CYAN_BLUE_07_EO NULL +#define OPTION_VAL_LIGHT_GREEN_08_EO NULL +#define OPTION_VAL_CYAN_GREEN_09_EO NULL +#define OPTION_VAL_LIGHT_CYAN_10_EO NULL +#define OPTION_VAL_PURPLE_12_EO NULL +#define OPTION_VAL_LIGHT_PURPLE_13_EO NULL +#define OPTION_VAL_YELLOW_14_EO NULL +#define OPTION_VAL_GRAY_15_EO NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_EO NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_EO NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_EO NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_EO NULL +#define OPTION_VAL_LIGHT_RED_2_20_EO NULL +#define OPTION_VAL_MAGENTA_21_EO NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_EO NULL +#define OPTION_VAL_LIGHT_ORANGE_23_EO NULL +#define OPTION_VAL_ORANGE_24_EO NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_EO NULL +#define OPTION_VAL_LIGHT_YELLOW_26_EO NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_EO NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EO NULL +#define OPTION_VAL_40_EO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EO NULL + +struct retro_core_option_v2_category option_cats_eo[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_EO, + CATEGORY_SYSTEM_INFO_0_EO + }, + { + "video", + CATEGORY_VIDEO_LABEL_EO, + CATEGORY_VIDEO_INFO_0_EO + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_EO, + CATEGORY_PERFORMANCE_INFO_0_EO + }, + { + "hacks", + CATEGORY_HACKS_LABEL_EO, + CATEGORY_HACKS_INFO_0_EO + }, + { + "input", + CATEGORY_INPUT_LABEL_EO, + CATEGORY_INPUT_INFO_0_EO + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_EO, + CATEGORY_EXPANSIONS_INFO_0_EO + }, + { + "vmu", + CATEGORY_VMU_LABEL_EO, + CATEGORY_VMU_INFO_0_EO + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_eo[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_EO, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_EO }, + { "USA", OPTION_VAL_USA_EO }, + { "Europe", OPTION_VAL_EUROPE_EO }, + { "Default", OPTION_VAL_DEFAULT_EO }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_EO, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_EO, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_EO }, + { "English", OPTION_VAL_ENGLISH_EO }, + { "German", OPTION_VAL_GERMAN_EO }, + { "French", OPTION_VAL_FRENCH_EO }, + { "Spanish", OPTION_VAL_SPANISH_EO }, + { "Italian", OPTION_VAL_ITALIAN_EO }, + { "Default", OPTION_VAL_DEFAULT_EO }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_EO, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_EO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_ES, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_EO, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_EO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_EO, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_ES, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_EO, NULL, "system", { @@ -23852,13 +26671,17 @@ struct retro_core_option_v2_definition option_defs_es[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ES, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_EO, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ES, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_EO, NULL, "system", { @@ -23870,9 +26693,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ES, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_EO, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ES, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_EO, NULL, "system", { @@ -23884,9 +26707,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_ES, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_EO, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ES, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_EO, NULL, "system", { @@ -23898,9 +26721,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_ES, + CORE_OPTION_NAME_UPNP_LABEL_EO, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_ES, + CORE_OPTION_NAME_UPNP_INFO_0_EO, NULL, "system", { @@ -23913,39 +26736,39 @@ struct retro_core_option_v2_definition option_defs_es[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ES, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_EO, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ES, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_EO, NULL, "video", { - { "320x240", OPTION_VAL_320X240_ES }, - { "640x480", OPTION_VAL_640X480_ES }, - { "800x600", OPTION_VAL_800X600_ES }, - { "960x720", OPTION_VAL_960X720_ES }, - { "1024x768", OPTION_VAL_1024X768_ES }, - { "1280x960", OPTION_VAL_1280X960_ES }, - { "1440x1080", OPTION_VAL_1440X1080_ES }, - { "1600x1200", OPTION_VAL_1600X1200_ES }, - { "1920x1440", OPTION_VAL_1920X1440_ES }, - { "2560x1920", OPTION_VAL_2560X1920_ES }, - { "2880x2160", OPTION_VAL_2880X2160_ES }, - { "3200x2400", OPTION_VAL_3200X2400_ES }, - { "3840x2880", OPTION_VAL_3840X2880_ES }, - { "4480x3360", OPTION_VAL_4480X3360_ES }, - { "5120x3840", OPTION_VAL_5120X3840_ES }, - { "5760x4320", OPTION_VAL_5760X4320_ES }, - { "6400x4800", OPTION_VAL_6400X4800_ES }, - { "7040x5280", OPTION_VAL_7040X5280_ES }, - { "7680x5760", OPTION_VAL_7680X5760_ES }, - { "8320x6240", OPTION_VAL_8320X6240_ES }, - { "8960x6720", OPTION_VAL_8960X6720_ES }, - { "9600x7200", OPTION_VAL_9600X7200_ES }, - { "10240x7680", OPTION_VAL_10240X7680_ES }, - { "10880x8160", OPTION_VAL_10880X8160_ES }, - { "11520x8640", OPTION_VAL_11520X8640_ES }, - { "12160x9120", OPTION_VAL_12160X9120_ES }, - { "12800x9600", OPTION_VAL_12800X9600_ES }, + { "320x240", OPTION_VAL_320X240_EO }, + { "640x480", OPTION_VAL_640X480_EO }, + { "800x600", OPTION_VAL_800X600_EO }, + { "960x720", OPTION_VAL_960X720_EO }, + { "1024x768", OPTION_VAL_1024X768_EO }, + { "1280x960", OPTION_VAL_1280X960_EO }, + { "1440x1080", OPTION_VAL_1440X1080_EO }, + { "1600x1200", OPTION_VAL_1600X1200_EO }, + { "1920x1440", OPTION_VAL_1920X1440_EO }, + { "2560x1920", OPTION_VAL_2560X1920_EO }, + { "2880x2160", OPTION_VAL_2880X2160_EO }, + { "3200x2400", OPTION_VAL_3200X2400_EO }, + { "3840x2880", OPTION_VAL_3840X2880_EO }, + { "4480x3360", OPTION_VAL_4480X3360_EO }, + { "5120x3840", OPTION_VAL_5120X3840_EO }, + { "5760x4320", OPTION_VAL_5760X4320_EO }, + { "6400x4800", OPTION_VAL_6400X4800_EO }, + { "7040x5280", OPTION_VAL_7040X5280_EO }, + { "7680x5760", OPTION_VAL_7680X5760_EO }, + { "8320x6240", OPTION_VAL_8320X6240_EO }, + { "8960x6720", OPTION_VAL_8960X6720_EO }, + { "9600x7200", OPTION_VAL_9600X7200_EO }, + { "10240x7680", OPTION_VAL_10240X7680_EO }, + { "10880x8160", OPTION_VAL_10880X8160_EO }, + { "11520x8640", OPTION_VAL_11520X8640_EO }, + { "12160x9120", OPTION_VAL_12160X9120_EO }, + { "12800x9600", OPTION_VAL_12800X9600_EO }, { NULL, NULL }, }, #ifdef LOW_RES @@ -23956,62 +26779,62 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_ES, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_EO, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ES, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_EO, NULL, "video", { - { "VGA", OPTION_VAL_VGA_ES }, - { "TV (RGB)", OPTION_VAL_TV_RGB_ES }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_ES }, + { "VGA", OPTION_VAL_VGA_EO }, + { "TV (RGB)", OPTION_VAL_TV_RGB_EO }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_EO }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_ES, + CORE_OPTION_NAME_BROADCAST_LABEL_EO, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_ES }, - { "PAL", OPTION_VAL_PAL_ES }, - { "PAL_N", OPTION_VAL_PAL_N_ES }, - { "PAL_M", OPTION_VAL_PAL_M_ES }, - { "Default", OPTION_VAL_DEFAULT_ES }, + { "NTSC", OPTION_VAL_NTSC_EO }, + { "PAL", OPTION_VAL_PAL_EO }, + { "PAL_N", OPTION_VAL_PAL_N_EO }, + { "PAL_M", OPTION_VAL_PAL_M_EO }, + { "Default", OPTION_VAL_DEFAULT_EO }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ES, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_EO, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_ES }, - { "vertical", OPTION_VAL_VERTICAL_ES }, + { "horizontal", OPTION_VAL_HORIZONTAL_EO }, + { "vertical", OPTION_VAL_VERTICAL_EO }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ES, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_EO, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ES }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_ES }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_EO }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_EO }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_ES }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_EO }, #endif { NULL, NULL }, }, @@ -24024,25 +26847,25 @@ struct retro_core_option_v2_definition option_defs_es[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ES, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_EO, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ES, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_EO, NULL, "video", { - { "512MB", OPTION_VAL_512MB_ES }, - { "1GB", OPTION_VAL_1GB_ES }, - { "2GB", OPTION_VAL_2GB_ES }, - { "4GB", OPTION_VAL_4GB_ES }, + { "512MB", OPTION_VAL_512MB_EO }, + { "1GB", OPTION_VAL_1GB_EO }, + { "2GB", OPTION_VAL_2GB_EO }, + { "4GB", OPTION_VAL_4GB_EO }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_ES, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_EO, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ES, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_EO, NULL, "video", { @@ -24050,6 +26873,7 @@ struct retro_core_option_v2_definition option_defs_es[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -24058,9 +26882,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ES, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_EO, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ES, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_EO, NULL, "video", { @@ -24072,9 +26896,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ES, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_EO, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ES, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_EO, NULL, "video", { @@ -24084,11 +26908,11 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_ES, + CORE_OPTION_NAME_MIPMAPPING_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_EO, NULL, "video", { @@ -24100,7 +26924,7 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_ES, + CORE_OPTION_NAME_FOG_LABEL_EO, NULL, "", NULL, @@ -24114,9 +26938,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ES, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_EO, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ES, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_EO, NULL, "video", { @@ -24128,9 +26952,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ES, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_EO, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ES, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_EO, NULL, "video", { @@ -24145,24 +26969,24 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ES, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_EO, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ES, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_EO, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_ES }, - { "1", OPTION_VAL_1_ES }, - { "2", OPTION_VAL_2_ES }, + { "0", OPTION_VAL_DEFAULT_EO }, + { "1", OPTION_VAL_1_EO }, + { "2", OPTION_VAL_2_EO }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ES, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_EO, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ES, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_EO, NULL, "video", { @@ -24170,13 +26994,13 @@ struct retro_core_option_v2_definition option_defs_es[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ES, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_EO, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ES, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_EO, NULL, "video", { @@ -24188,9 +27012,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ES, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_EO, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ES, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_EO, NULL, "video", { @@ -24203,25 +27027,25 @@ struct retro_core_option_v2_definition option_defs_es[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_ES, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_EO, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ES, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_EO, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_ES }, - { "4", OPTION_VAL_4_ES }, - { "6", OPTION_VAL_6_ES }, + { "2", OPTION_VAL_2_O26_EO }, + { "4", OPTION_VAL_4_EO }, + { "6", OPTION_VAL_6_EO }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ES, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_EO, NULL, "video", { @@ -24235,9 +27059,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ES, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_EO, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ES, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_EO, NULL, "video", { @@ -24247,11 +27071,25 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_EO, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_EO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ES, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_EO, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ES, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_EO, NULL, "performance", { @@ -24263,15 +27101,15 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ES, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_EO, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ES, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_EO, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_ES }, - { "more", OPTION_VAL_MORE_ES }, + { "some", OPTION_VAL_SOME_EO }, + { "more", OPTION_VAL_MORE_EO }, { NULL, NULL }, }, #ifdef LOW_END @@ -24282,9 +27120,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ES, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_EO, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ES, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_EO, NULL, "performance", { @@ -24301,9 +27139,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ES, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_EO, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ES, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_EO, NULL, "hacks", { @@ -24315,9 +27153,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ES, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_EO, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ES, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_EO, NULL, "hacks", { @@ -24329,9 +27167,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ES, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_EO, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ES, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_EO, NULL, "hacks", { @@ -24345,64 +27183,78 @@ struct retro_core_option_v2_definition option_defs_es[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_EO, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_EO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_ES, + CORE_OPTION_NAME_SH4CLOCK_LABEL_EO, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_ES, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_EO, NULL, "hacks", { - { "100", OPTION_VAL_100_ES }, - { "110", OPTION_VAL_110_ES }, - { "120", OPTION_VAL_120_ES }, - { "130", OPTION_VAL_130_ES }, - { "140", OPTION_VAL_140_ES }, - { "150", OPTION_VAL_150_ES }, - { "160", OPTION_VAL_160_ES }, - { "170", OPTION_VAL_170_ES }, - { "180", OPTION_VAL_180_ES }, - { "190", OPTION_VAL_190_ES }, - { "200", OPTION_VAL_200_ES }, - { "210", OPTION_VAL_210_ES }, - { "220", OPTION_VAL_220_ES }, - { "230", OPTION_VAL_230_ES }, - { "240", OPTION_VAL_240_ES }, - { "250", OPTION_VAL_250_ES }, - { "260", OPTION_VAL_260_ES }, - { "270", OPTION_VAL_270_ES }, - { "280", OPTION_VAL_280_ES }, - { "290", OPTION_VAL_290_ES }, - { "300", OPTION_VAL_300_ES }, - { "310", OPTION_VAL_310_ES }, - { "320", OPTION_VAL_320_ES }, - { "330", OPTION_VAL_330_ES }, - { "340", OPTION_VAL_340_ES }, - { "350", OPTION_VAL_350_ES }, - { "360", OPTION_VAL_360_ES }, - { "370", OPTION_VAL_370_ES }, - { "380", OPTION_VAL_380_ES }, - { "390", OPTION_VAL_390_ES }, - { "400", OPTION_VAL_400_ES }, - { "410", OPTION_VAL_410_ES }, - { "420", OPTION_VAL_420_ES }, - { "430", OPTION_VAL_430_ES }, - { "440", OPTION_VAL_440_ES }, - { "450", OPTION_VAL_450_ES }, - { "460", OPTION_VAL_460_ES }, - { "470", OPTION_VAL_470_ES }, - { "480", OPTION_VAL_480_ES }, - { "490", OPTION_VAL_490_ES }, - { "500", OPTION_VAL_500_ES }, + { "100", OPTION_VAL_100_EO }, + { "110", OPTION_VAL_110_EO }, + { "120", OPTION_VAL_120_EO }, + { "130", OPTION_VAL_130_EO }, + { "140", OPTION_VAL_140_EO }, + { "150", OPTION_VAL_150_EO }, + { "160", OPTION_VAL_160_EO }, + { "170", OPTION_VAL_170_EO }, + { "180", OPTION_VAL_180_EO }, + { "190", OPTION_VAL_190_EO }, + { "200", OPTION_VAL_200_EO }, + { "210", OPTION_VAL_210_EO }, + { "220", OPTION_VAL_220_EO }, + { "230", OPTION_VAL_230_EO }, + { "240", OPTION_VAL_240_EO }, + { "250", OPTION_VAL_250_EO }, + { "260", OPTION_VAL_260_EO }, + { "270", OPTION_VAL_270_EO }, + { "280", OPTION_VAL_280_EO }, + { "290", OPTION_VAL_290_EO }, + { "300", OPTION_VAL_300_EO }, + { "310", OPTION_VAL_310_EO }, + { "320", OPTION_VAL_320_EO }, + { "330", OPTION_VAL_330_EO }, + { "340", OPTION_VAL_340_EO }, + { "350", OPTION_VAL_350_EO }, + { "360", OPTION_VAL_360_EO }, + { "370", OPTION_VAL_370_EO }, + { "380", OPTION_VAL_380_EO }, + { "390", OPTION_VAL_390_EO }, + { "400", OPTION_VAL_400_EO }, + { "410", OPTION_VAL_410_EO }, + { "420", OPTION_VAL_420_EO }, + { "430", OPTION_VAL_430_EO }, + { "440", OPTION_VAL_440_EO }, + { "450", OPTION_VAL_450_EO }, + { "460", OPTION_VAL_460_EO }, + { "470", OPTION_VAL_470_EO }, + { "480", OPTION_VAL_480_EO }, + { "490", OPTION_VAL_490_EO }, + { "500", OPTION_VAL_500_EO }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ES, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_EO, NULL, "hacks", { @@ -24412,11 +27264,11 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ES, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_EO, NULL, "hacks", { @@ -24428,47 +27280,47 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ES, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_EO, NULL, "input", { - { "0%", OPTION_VAL_0_ES }, - { "5%", OPTION_VAL_5_ES }, - { "10%", OPTION_VAL_10_ES }, - { "15%", OPTION_VAL_15_ES }, - { "20%", OPTION_VAL_20_ES }, - { "25%", OPTION_VAL_25_ES }, - { "30%", OPTION_VAL_30_ES }, + { "0%", OPTION_VAL_0_EO }, + { "5%", OPTION_VAL_5_EO }, + { "10%", OPTION_VAL_10_EO }, + { "15%", OPTION_VAL_15_EO }, + { "20%", OPTION_VAL_20_EO }, + { "25%", OPTION_VAL_25_EO }, + { "30%", OPTION_VAL_30_EO }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ES, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_EO, NULL, "input", { - { "0%", OPTION_VAL_0_ES }, - { "5%", OPTION_VAL_5_ES }, - { "10%", OPTION_VAL_10_ES }, - { "15%", OPTION_VAL_15_ES }, - { "20%", OPTION_VAL_20_ES }, - { "25%", OPTION_VAL_25_ES }, - { "30%", OPTION_VAL_30_ES }, + { "0%", OPTION_VAL_0_EO }, + { "5%", OPTION_VAL_5_EO }, + { "10%", OPTION_VAL_10_EO }, + { "15%", OPTION_VAL_15_EO }, + { "20%", OPTION_VAL_20_EO }, + { "25%", OPTION_VAL_25_EO }, + { "30%", OPTION_VAL_30_EO }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ES, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_EO, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_EO, NULL, "input", { @@ -24479,10 +27331,10 @@ struct retro_core_option_v2_definition option_defs_es[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_ES, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_EO, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_ES, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_EO, NULL, "input", { @@ -24490,124 +27342,268 @@ struct retro_core_option_v2_definition option_defs_es[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ES, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_EO, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ES, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_EO, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ES, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_EO, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ES, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_EO }, + { "60%", OPTION_VAL_60_EO }, + { "70%", OPTION_VAL_70_EO }, + { "80%", OPTION_VAL_80_EO }, + { "90%", OPTION_VAL_90_EO }, + { "100%", OPTION_VAL_100_O45_EO }, + { "110%", OPTION_VAL_110_O45_EO }, + { "120%", OPTION_VAL_120_O45_EO }, + { "130%", OPTION_VAL_130_O45_EO }, + { "140%", OPTION_VAL_140_O45_EO }, + { "150%", OPTION_VAL_150_O45_EO }, + { "160%", OPTION_VAL_160_O45_EO }, + { "170%", OPTION_VAL_170_O45_EO }, + { "180%", OPTION_VAL_180_O45_EO }, + { "190%", OPTION_VAL_190_O45_EO }, + { "200%", OPTION_VAL_200_O45_EO }, + { "210%", OPTION_VAL_210_O45_EO }, + { "220%", OPTION_VAL_220_O45_EO }, + { "230%", OPTION_VAL_230_O45_EO }, + { "240%", OPTION_VAL_240_O45_EO }, + { "250%", OPTION_VAL_250_O45_EO }, + { "260%", OPTION_VAL_260_O45_EO }, + { "270%", OPTION_VAL_270_O45_EO }, + { "280%", OPTION_VAL_280_O45_EO }, + { "290%", OPTION_VAL_290_O45_EO }, + { "300%", OPTION_VAL_300_O45_EO }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ES, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_EO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ES }, - { "Red", OPTION_VAL_RED_ES }, - { "Green", OPTION_VAL_GREEN_ES }, - { "Blue", OPTION_VAL_BLUE_ES }, + { "White", OPTION_VAL_WHITE_EO }, + { "Red", OPTION_VAL_RED_EO }, + { "Green", OPTION_VAL_GREEN_EO }, + { "Blue", OPTION_VAL_BLUE_EO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ES, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_EO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ES }, - { "Red", OPTION_VAL_RED_ES }, - { "Green", OPTION_VAL_GREEN_ES }, - { "Blue", OPTION_VAL_BLUE_ES }, + { "White", OPTION_VAL_WHITE_EO }, + { "Red", OPTION_VAL_RED_EO }, + { "Green", OPTION_VAL_GREEN_EO }, + { "Blue", OPTION_VAL_BLUE_EO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ES, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_EO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ES }, - { "Red", OPTION_VAL_RED_ES }, - { "Green", OPTION_VAL_GREEN_ES }, - { "Blue", OPTION_VAL_BLUE_ES }, + { "White", OPTION_VAL_WHITE_EO }, + { "Red", OPTION_VAL_RED_EO }, + { "Green", OPTION_VAL_GREEN_EO }, + { "Blue", OPTION_VAL_BLUE_EO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ES, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_EO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ES }, - { "Red", OPTION_VAL_RED_ES }, - { "Green", OPTION_VAL_GREEN_ES }, - { "Blue", OPTION_VAL_BLUE_ES }, + { "White", OPTION_VAL_WHITE_EO }, + { "Red", OPTION_VAL_RED_EO }, + { "Green", OPTION_VAL_GREEN_EO }, + { "Blue", OPTION_VAL_BLUE_EO }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_EO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_EO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_EO }, + { "Purupuru", OPTION_VAL_PURUPURU_EO }, + { "None", OPTION_VAL_NONE_EO }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ES, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ES, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ES, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_EO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_EO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_EO, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_ES }, - { "All VMUs", OPTION_VAL_ALL_VMUS_ES }, + { "VMU A1", OPTION_VAL_VMU_A1_EO }, + { "All VMUs", OPTION_VAL_ALL_VMUS_EO }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_ES, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ES, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_ES, + CORE_OPTION_NAME_VMU_SOUND_LABEL_EO, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_EO, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_EO, NULL, "vmu", { @@ -24618,9 +27614,9 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ES, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ES, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ES, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_EO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_EO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_EO, NULL, "vmu", { @@ -24632,7 +27628,7 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ES, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_EO, NULL, "", NULL, @@ -24646,144 +27642,144 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ES, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_EO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ES, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_EO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ES }, - { "2x", OPTION_VAL_2_O27_ES }, - { "3x", OPTION_VAL_3X_ES }, - { "4x", OPTION_VAL_4_ES }, - { "5x", OPTION_VAL_5X_ES }, - { NULL, NULL }, - }, + { "1x", OPTION_VAL_1X_EO }, + { "2x", OPTION_VAL_2_O26_EO }, + { "3x", OPTION_VAL_3X_EO }, + { "4x", OPTION_VAL_4_EO }, + { "5x", OPTION_VAL_5X_EO }, + { NULL, NULL }, + }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ES, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_EO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ES }, - { "20%", OPTION_VAL_20_ES }, - { "30%", OPTION_VAL_30_ES }, - { "40%", OPTION_VAL_40_ES }, - { "50%", OPTION_VAL_50_ES }, - { "60%", OPTION_VAL_60_ES }, - { "70%", OPTION_VAL_70_ES }, - { "80%", OPTION_VAL_80_ES }, - { "90%", OPTION_VAL_90_ES }, - { "100%", OPTION_VAL_100_O57_ES }, + { "10%", OPTION_VAL_10_EO }, + { "20%", OPTION_VAL_20_EO }, + { "30%", OPTION_VAL_30_EO }, + { "40%", OPTION_VAL_40_EO }, + { "50%", OPTION_VAL_50_EO }, + { "60%", OPTION_VAL_60_EO }, + { "70%", OPTION_VAL_70_EO }, + { "80%", OPTION_VAL_80_EO }, + { "90%", OPTION_VAL_90_EO }, + { "100%", OPTION_VAL_100_O45_EO }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ES, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_EO, NULL, "", NULL, @@ -24797,144 +27793,144 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ES, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_EO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ES, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_EO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ES }, - { "2x", OPTION_VAL_2_O27_ES }, - { "3x", OPTION_VAL_3X_ES }, - { "4x", OPTION_VAL_4_ES }, - { "5x", OPTION_VAL_5X_ES }, + { "1x", OPTION_VAL_1X_EO }, + { "2x", OPTION_VAL_2_O26_EO }, + { "3x", OPTION_VAL_3X_EO }, + { "4x", OPTION_VAL_4_EO }, + { "5x", OPTION_VAL_5X_EO }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ES, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_EO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ES }, - { "20%", OPTION_VAL_20_ES }, - { "30%", OPTION_VAL_30_ES }, - { "40%", OPTION_VAL_40_ES }, - { "50%", OPTION_VAL_50_ES }, - { "60%", OPTION_VAL_60_ES }, - { "70%", OPTION_VAL_70_ES }, - { "80%", OPTION_VAL_80_ES }, - { "90%", OPTION_VAL_90_ES }, - { "100%", OPTION_VAL_100_O57_ES }, + { "10%", OPTION_VAL_10_EO }, + { "20%", OPTION_VAL_20_EO }, + { "30%", OPTION_VAL_30_EO }, + { "40%", OPTION_VAL_40_EO }, + { "50%", OPTION_VAL_50_EO }, + { "60%", OPTION_VAL_60_EO }, + { "70%", OPTION_VAL_70_EO }, + { "80%", OPTION_VAL_80_EO }, + { "90%", OPTION_VAL_90_EO }, + { "100%", OPTION_VAL_100_O45_EO }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ES, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_EO, NULL, "", NULL, @@ -24948,144 +27944,144 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ES, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_EO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ES, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_EO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ES }, - { "2x", OPTION_VAL_2_O27_ES }, - { "3x", OPTION_VAL_3X_ES }, - { "4x", OPTION_VAL_4_ES }, - { "5x", OPTION_VAL_5X_ES }, + { "1x", OPTION_VAL_1X_EO }, + { "2x", OPTION_VAL_2_O26_EO }, + { "3x", OPTION_VAL_3X_EO }, + { "4x", OPTION_VAL_4_EO }, + { "5x", OPTION_VAL_5X_EO }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ES, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_EO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ES }, - { "20%", OPTION_VAL_20_ES }, - { "30%", OPTION_VAL_30_ES }, - { "40%", OPTION_VAL_40_ES }, - { "50%", OPTION_VAL_50_ES }, - { "60%", OPTION_VAL_60_ES }, - { "70%", OPTION_VAL_70_ES }, - { "80%", OPTION_VAL_80_ES }, - { "90%", OPTION_VAL_90_ES }, - { "100%", OPTION_VAL_100_O57_ES }, + { "10%", OPTION_VAL_10_EO }, + { "20%", OPTION_VAL_20_EO }, + { "30%", OPTION_VAL_30_EO }, + { "40%", OPTION_VAL_40_EO }, + { "50%", OPTION_VAL_50_EO }, + { "60%", OPTION_VAL_60_EO }, + { "70%", OPTION_VAL_70_EO }, + { "80%", OPTION_VAL_80_EO }, + { "90%", OPTION_VAL_90_EO }, + { "100%", OPTION_VAL_100_O45_EO }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ES, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_EO, NULL, "", NULL, @@ -25099,551 +28095,588 @@ struct retro_core_option_v2_definition option_defs_es[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ES, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_EO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_EO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_EO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_EO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_EO }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ES, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_EO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ES }, - { "2x", OPTION_VAL_2_O27_ES }, - { "3x", OPTION_VAL_3X_ES }, - { "4x", OPTION_VAL_4_ES }, - { "5x", OPTION_VAL_5X_ES }, + { "1x", OPTION_VAL_1X_EO }, + { "2x", OPTION_VAL_2_O26_EO }, + { "3x", OPTION_VAL_3X_EO }, + { "4x", OPTION_VAL_4_EO }, + { "5x", OPTION_VAL_5X_EO }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ES, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_EO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, - { "BLACK 02", OPTION_VAL_BLACK_02_ES }, - { "BLUE 03", OPTION_VAL_BLUE_ES }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, - { "GREEN 05", OPTION_VAL_GREEN_ES }, - { "CYAN 06", OPTION_VAL_CYAN_06_ES }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, - { "RED 11", OPTION_VAL_RED_ES }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, - { "GRAY 15", OPTION_VAL_GRAY_15_ES }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, - { "WHITE 28", OPTION_VAL_WHITE_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_EO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_EO }, + { "BLACK 02", OPTION_VAL_BLACK_02_EO }, + { "BLUE 03", OPTION_VAL_BLUE_EO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_EO }, + { "GREEN 05", OPTION_VAL_GREEN_EO }, + { "CYAN 06", OPTION_VAL_CYAN_06_EO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_EO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_EO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_EO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_EO }, + { "RED 11", OPTION_VAL_RED_EO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_EO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_EO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_EO }, + { "GRAY 15", OPTION_VAL_GRAY_15_EO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_EO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_EO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_EO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_EO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_EO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_EO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_EO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_EO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_EO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_EO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_EO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_EO }, + { "WHITE 28", OPTION_VAL_WHITE_EO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ES, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_EO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ES }, - { "20%", OPTION_VAL_20_ES }, - { "30%", OPTION_VAL_30_ES }, - { "40%", OPTION_VAL_40_ES }, - { "50%", OPTION_VAL_50_ES }, - { "60%", OPTION_VAL_60_ES }, - { "70%", OPTION_VAL_70_ES }, - { "80%", OPTION_VAL_80_ES }, - { "90%", OPTION_VAL_90_ES }, - { "100%", OPTION_VAL_100_O57_ES }, + { "10%", OPTION_VAL_10_EO }, + { "20%", OPTION_VAL_20_EO }, + { "30%", OPTION_VAL_30_EO }, + { "40%", OPTION_VAL_40_EO }, + { "50%", OPTION_VAL_50_EO }, + { "60%", OPTION_VAL_60_EO }, + { "70%", OPTION_VAL_70_EO }, + { "80%", OPTION_VAL_80_EO }, + { "90%", OPTION_VAL_90_EO }, + { "100%", OPTION_VAL_100_O45_EO }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_es = { - option_cats_es, - option_defs_es +struct retro_core_options_v2 options_eo = { + option_cats_eo, + option_defs_eo }; -/* RETRO_LANGUAGE_FA */ - -#define CATEGORY_SYSTEM_LABEL_FA "سیستم" -#define CATEGORY_SYSTEM_INFO_0_FA NULL -#define CATEGORY_VIDEO_LABEL_FA "ویدیو" -#define CATEGORY_VIDEO_INFO_0_FA NULL -#define CATEGORY_PERFORMANCE_LABEL_FA "عملکرد" -#define CATEGORY_PERFORMANCE_INFO_0_FA NULL -#define CATEGORY_HACKS_LABEL_FA NULL -#define CATEGORY_HACKS_INFO_0_FA NULL -#define CATEGORY_INPUT_LABEL_FA "داده" -#define CATEGORY_INPUT_INFO_0_FA NULL -#define CATEGORY_VMU_LABEL_FA NULL -#define CATEGORY_VMU_INFO_0_FA NULL -#define CORE_OPTION_NAME_REGION_LABEL_FA "منطقه" -#define OPTION_VAL_JAPAN_FA NULL -#define OPTION_VAL_USA_FA NULL -#define OPTION_VAL_EUROPE_FA NULL -#define OPTION_VAL_DEFAULT_FA NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_FA "زبان" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FA NULL -#define OPTION_VAL_JAPANESE_FA NULL -#define OPTION_VAL_ENGLISH_FA NULL -#define OPTION_VAL_GERMAN_FA NULL -#define OPTION_VAL_FRENCH_FA NULL -#define OPTION_VAL_SPANISH_FA NULL -#define OPTION_VAL_ITALIAN_FA NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FA NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_FA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FA NULL -#define CORE_OPTION_NAME_UPNP_LABEL_FA NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_FA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FA NULL -#define OPTION_VAL_320X240_FA NULL -#define OPTION_VAL_640X480_FA NULL -#define OPTION_VAL_800X600_FA NULL -#define OPTION_VAL_960X720_FA NULL -#define OPTION_VAL_1024X768_FA NULL -#define OPTION_VAL_1280X960_FA NULL -#define OPTION_VAL_1440X1080_FA NULL -#define OPTION_VAL_1600X1200_FA NULL -#define OPTION_VAL_1920X1440_FA NULL -#define OPTION_VAL_2560X1920_FA NULL -#define OPTION_VAL_2880X2160_FA NULL -#define OPTION_VAL_3200X2400_FA NULL -#define OPTION_VAL_3840X2880_FA NULL -#define OPTION_VAL_4480X3360_FA NULL -#define OPTION_VAL_5120X3840_FA NULL -#define OPTION_VAL_5760X4320_FA NULL -#define OPTION_VAL_6400X4800_FA NULL -#define OPTION_VAL_7040X5280_FA NULL -#define OPTION_VAL_7680X5760_FA NULL -#define OPTION_VAL_8320X6240_FA NULL -#define OPTION_VAL_8960X6720_FA NULL -#define OPTION_VAL_9600X7200_FA NULL -#define OPTION_VAL_10240X7680_FA NULL -#define OPTION_VAL_10880X8160_FA NULL -#define OPTION_VAL_11520X8640_FA NULL -#define OPTION_VAL_12160X9120_FA NULL -#define OPTION_VAL_12800X9600_FA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FA NULL -#define OPTION_VAL_VGA_FA NULL -#define OPTION_VAL_TV_RGB_FA NULL -#define OPTION_VAL_TV_COMPOSITE_FA NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_FA NULL -#define OPTION_VAL_NTSC_FA NULL -#define OPTION_VAL_PAL_FA NULL -#define OPTION_VAL_PAL_N_FA NULL -#define OPTION_VAL_PAL_M_FA NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FA "جهت صفحه نمایش" -#define OPTION_VAL_HORIZONTAL_FA NULL -#define OPTION_VAL_VERTICAL_FA NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FA NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FA NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_FA NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_FA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FA NULL -#define OPTION_VAL_512MB_FA NULL -#define OPTION_VAL_1GB_FA NULL -#define OPTION_VAL_2GB_FA NULL -#define OPTION_VAL_4GB_FA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FA NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FA NULL -#define CORE_OPTION_NAME_FOG_LABEL_FA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FA NULL -#define OPTION_VAL_1_FA NULL -#define OPTION_VAL_2_FA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FA NULL -#define OPTION_VAL_2_O27_FA NULL -#define OPTION_VAL_4_FA NULL -#define OPTION_VAL_6_FA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FA NULL -#define OPTION_VAL_SOME_FA NULL -#define OPTION_VAL_MORE_FA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FA NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FA NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FA NULL -#define OPTION_VAL_100_FA NULL -#define OPTION_VAL_110_FA NULL -#define OPTION_VAL_120_FA NULL -#define OPTION_VAL_130_FA NULL -#define OPTION_VAL_140_FA NULL -#define OPTION_VAL_150_FA NULL -#define OPTION_VAL_160_FA NULL -#define OPTION_VAL_170_FA NULL -#define OPTION_VAL_180_FA NULL -#define OPTION_VAL_190_FA NULL -#define OPTION_VAL_200_FA NULL -#define OPTION_VAL_210_FA NULL -#define OPTION_VAL_220_FA NULL -#define OPTION_VAL_230_FA NULL -#define OPTION_VAL_240_FA NULL -#define OPTION_VAL_250_FA NULL -#define OPTION_VAL_260_FA NULL -#define OPTION_VAL_270_FA NULL -#define OPTION_VAL_280_FA NULL -#define OPTION_VAL_290_FA NULL -#define OPTION_VAL_300_FA NULL -#define OPTION_VAL_310_FA NULL -#define OPTION_VAL_320_FA NULL -#define OPTION_VAL_330_FA NULL -#define OPTION_VAL_340_FA NULL -#define OPTION_VAL_350_FA NULL -#define OPTION_VAL_360_FA NULL -#define OPTION_VAL_370_FA NULL -#define OPTION_VAL_380_FA NULL -#define OPTION_VAL_390_FA NULL -#define OPTION_VAL_400_FA NULL -#define OPTION_VAL_410_FA NULL -#define OPTION_VAL_420_FA NULL -#define OPTION_VAL_430_FA NULL -#define OPTION_VAL_440_FA NULL -#define OPTION_VAL_450_FA NULL -#define OPTION_VAL_460_FA NULL -#define OPTION_VAL_470_FA NULL -#define OPTION_VAL_480_FA NULL -#define OPTION_VAL_490_FA NULL -#define OPTION_VAL_500_FA NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FA NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FA NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FA NULL -#define OPTION_VAL_0_FA NULL -#define OPTION_VAL_5_FA NULL -#define OPTION_VAL_10_FA NULL -#define OPTION_VAL_15_FA NULL -#define OPTION_VAL_20_FA NULL -#define OPTION_VAL_25_FA NULL -#define OPTION_VAL_30_FA NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FA NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FA NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FA NULL -#define OPTION_VAL_WHITE_FA NULL -#define OPTION_VAL_RED_FA NULL -#define OPTION_VAL_GREEN_FA NULL -#define OPTION_VAL_BLUE_FA NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FA NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FA NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FA NULL -#define OPTION_VAL_VMU_A1_FA NULL -#define OPTION_VAL_ALL_VMUS_FA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FA NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FA NULL -#define OPTION_VAL_UPPER_LEFT_FA NULL -#define OPTION_VAL_UPPER_RIGHT_FA NULL -#define OPTION_VAL_LOWER_LEFT_FA NULL -#define OPTION_VAL_LOWER_RIGHT_FA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FA NULL -#define OPTION_VAL_1X_FA NULL -#define OPTION_VAL_3X_FA NULL -#define OPTION_VAL_5X_FA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FA NULL -#define OPTION_VAL_DEFAULT_ON_00_FA NULL -#define OPTION_VAL_DEFAULT_OFF_01_FA NULL -#define OPTION_VAL_BLACK_02_FA NULL -#define OPTION_VAL_LIGHT_BLUE_04_FA NULL -#define OPTION_VAL_CYAN_06_FA NULL -#define OPTION_VAL_CYAN_BLUE_07_FA NULL -#define OPTION_VAL_LIGHT_GREEN_08_FA NULL -#define OPTION_VAL_CYAN_GREEN_09_FA NULL -#define OPTION_VAL_LIGHT_CYAN_10_FA NULL -#define OPTION_VAL_PURPLE_12_FA NULL -#define OPTION_VAL_LIGHT_PURPLE_13_FA NULL -#define OPTION_VAL_YELLOW_14_FA NULL -#define OPTION_VAL_GRAY_15_FA NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_FA NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_FA NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_FA NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_FA NULL -#define OPTION_VAL_LIGHT_RED_2_20_FA NULL -#define OPTION_VAL_MAGENTA_21_FA NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_FA NULL -#define OPTION_VAL_LIGHT_ORANGE_23_FA NULL -#define OPTION_VAL_ORANGE_24_FA NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_FA NULL -#define OPTION_VAL_LIGHT_YELLOW_26_FA NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_FA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FA NULL -#define OPTION_VAL_40_FA NULL -#define OPTION_VAL_50_FA NULL -#define OPTION_VAL_60_FA NULL -#define OPTION_VAL_70_FA NULL -#define OPTION_VAL_80_FA NULL -#define OPTION_VAL_90_FA NULL -#define OPTION_VAL_100_O57_FA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FA NULL +/* RETRO_LANGUAGE_ES */ -struct retro_core_option_v2_category option_cats_fa[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_FA, - CATEGORY_SYSTEM_INFO_0_FA - }, - { - "video", - CATEGORY_VIDEO_LABEL_FA, - CATEGORY_VIDEO_INFO_0_FA - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_FA, - CATEGORY_PERFORMANCE_INFO_0_FA - }, - { - "hacks", - CATEGORY_HACKS_LABEL_FA, - CATEGORY_HACKS_INFO_0_FA - }, - { - "input", - CATEGORY_INPUT_LABEL_FA, - CATEGORY_INPUT_INFO_0_FA - }, - { - "vmu", - CATEGORY_VMU_LABEL_FA, - CATEGORY_VMU_INFO_0_FA - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_fa[] = { - { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_FA, - NULL, - "", - NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_FA }, - { "USA", OPTION_VAL_USA_FA }, - { "Europe", OPTION_VAL_EUROPE_FA }, - { "Default", OPTION_VAL_DEFAULT_FA }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_FA, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_FA, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_FA }, - { "English", OPTION_VAL_ENGLISH_FA }, - { "German", OPTION_VAL_GERMAN_FA }, - { "French", OPTION_VAL_FRENCH_FA }, - { "Spanish", OPTION_VAL_SPANISH_FA }, - { "Italian", OPTION_VAL_ITALIAN_FA }, - { "Default", OPTION_VAL_DEFAULT_FA }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_FA, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_FA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FA, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_FA, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif - }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_FA, +#define CATEGORY_SYSTEM_LABEL_ES "Sistema" +#define CATEGORY_SYSTEM_INFO_0_ES "Cambia los ajustes de región, idioma, BIOS y del hardware base." +#define CATEGORY_VIDEO_LABEL_ES "Vídeo" +#define CATEGORY_VIDEO_INFO_0_ES "Cambia los ajustes de resolución, las transparencias independientes del orden y los efectos visuales." +#define CATEGORY_PERFORMANCE_LABEL_ES "Rendimiento" +#define CATEGORY_PERFORMANCE_INFO_0_ES "Configura los ajustes del renderizado multihilo y la omisión de fotogramas." +#define CATEGORY_HACKS_LABEL_ES "Arreglos de emulación" +#define CATEGORY_HACKS_INFO_0_ES "Cambia los ajustes de forzado de imagen panorámica, la velocidad de carga de GD-ROM y la sustitución de texturas." +#define CATEGORY_INPUT_LABEL_ES "Entrada" +#define CATEGORY_INPUT_INFO_0_ES "Cambia los ajustes de los mandos y las pistolas de luz." +#define CATEGORY_EXPANSIONS_LABEL_ES "Puertos de expansión de los mandos" +#define CATEGORY_EXPANSIONS_INFO_0_ES "Selecciona el dispositivo (Visual Memory/VMU/vibración) que irá conectado en cada puerto de expansión." +#define CATEGORY_VMU_LABEL_ES "Visual Memory" +#define CATEGORY_VMU_INFO_0_ES "Cambia los ajustes de los archivos de VMU individuales para cada juego y la visibilidad en pantalla de las mismas." +#define CORE_OPTION_NAME_REGION_LABEL_ES "Región" +#define OPTION_VAL_JAPAN_ES "Japón" +#define OPTION_VAL_USA_ES "Estados Unidos" +#define OPTION_VAL_EUROPE_ES "Europa" +#define OPTION_VAL_DEFAULT_ES "Valor predeterminado" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_ES "Idioma" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_ES "Cambia el idioma que utilizará la BIOS y cualquier juego que contenga varios idiomas." +#define OPTION_VAL_JAPANESE_ES "Japonés" +#define OPTION_VAL_ENGLISH_ES "Inglés" +#define OPTION_VAL_GERMAN_ES "Alemán" +#define OPTION_VAL_FRENCH_ES "Francés" +#define OPTION_VAL_SPANISH_ES "Español" +#define OPTION_VAL_ITALIAN_ES "Italiano" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_ES "BIOS HLE (es necesario reiniciar)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ES "Fuerza el uso de una BIOS creada con emulación de alto nivel." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ES "Arrancar desde la BIOS (es necesario reiniciar)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ES "Arranca directamente el menú de la BIOS de Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_ES "Activar DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ES "Habilita la emulación del DSP (procesador de señales digitales) de audio de Dreamcast. Mejora la precisión del sonido generado a costa de aumentar los requisitos." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ES "Activar botones de servicio de arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ES "Activa el botón SERVICE para los juegos para recreativas/arcades, con el que acceder a la configuración del mueble." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ES "Partidas gratuitas en NAOMI" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ES "Modifica la configuración de monedas del juego a partidas gratuitas." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_ES "Emulación del Broadband Adapter (BBA)" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ES "Emula el adaptador de banda ancha por Ethernet en lugar del módem (es necesario reiniciar)." +#define CORE_OPTION_NAME_UPNP_LABEL_ES "Activar UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_ES "Utiliza UPnP para configurar automáticamente tu router/enrutador de Internet para poder conectarte a juegos online." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ES "Resolución interna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ES "Modifica la resolución de renderizado." +#define OPTION_VAL_320X240_ES "320 × 240 (50 %)" +#define OPTION_VAL_640X480_ES "640 × 480 (nativa)" +#define OPTION_VAL_800X600_ES "800 × 600 (125 %)" +#define OPTION_VAL_960X720_ES "960 × 720 (150 %)" +#define OPTION_VAL_1024X768_ES "1024 × 768 (160 %)" +#define OPTION_VAL_1280X960_ES "1280 × 960 (200 %)" +#define OPTION_VAL_1440X1080_ES "1440 × 1080 (225 %)" +#define OPTION_VAL_1600X1200_ES "1600 × 1200 (250 %)" +#define OPTION_VAL_1920X1440_ES "1920 × 1440 (300 %)" +#define OPTION_VAL_2560X1920_ES "2560 × 1920 (400 %)" +#define OPTION_VAL_2880X2160_ES "2880 × 2160 (450 %)" +#define OPTION_VAL_3200X2400_ES "3200 × 2400 (500 %)" +#define OPTION_VAL_3840X2880_ES "3840 × 2880 (600 %)" +#define OPTION_VAL_4480X3360_ES "4480 × 3360 (700 %)" +#define OPTION_VAL_5120X3840_ES "5120 × 3840 (800 %)" +#define OPTION_VAL_5760X4320_ES "5760 × 4320 (900 %)" +#define OPTION_VAL_6400X4800_ES "6400 × 4800 (1000 %)" +#define OPTION_VAL_7040X5280_ES "7040 × 5280 (1100 %)" +#define OPTION_VAL_7680X5760_ES "7680 × 5760 (1200 %)" +#define OPTION_VAL_8320X6240_ES "8320 × 6240 (1300 %)" +#define OPTION_VAL_8960X6720_ES "8960 × 6720 (1400 %)" +#define OPTION_VAL_9600X7200_ES "9600 × 7200 (1500 %)" +#define OPTION_VAL_10240X7680_ES "10240 × 7680 (1600 %)" +#define OPTION_VAL_10880X8160_ES "10880 × 8160 (1700 %)" +#define OPTION_VAL_11520X8640_ES "11520 × 8640 (1800 %)" +#define OPTION_VAL_12160X9120_ES "12160 × 9120 (1900 %)" +#define OPTION_VAL_12800X9600_ES "12800 × 9600 (2000 %)" +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_ES "Tipo de cable" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ES "El tipo de señal de salida de la imagen. «TV (Compuesto)» es el formato más compatible de todos." +#define OPTION_VAL_VGA_ES NULL +#define OPTION_VAL_TV_RGB_ES NULL +#define OPTION_VAL_TV_COMPOSITE_ES "TV (Compuesto)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_ES "Estándar de transmisión" +#define OPTION_VAL_NTSC_ES NULL +#define OPTION_VAL_PAL_ES "PAL (Resto del mundo)" +#define OPTION_VAL_PAL_N_ES NULL +#define OPTION_VAL_PAL_M_ES "PAL-M (Brasil)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ES "Orientación de pantalla" +#define OPTION_VAL_HORIZONTAL_ES NULL +#define OPTION_VAL_VERTICAL_ES NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ES "Ordenación de transparencias" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_ES "Selecciona el orden de dibujado de los polígonos transparentes." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ES "Por bandas (rápida, menos precisa)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_ES "Por triángulos (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_ES "Por píxeles (precisa, pero lenta)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ES "Tamaño del búfer de acumulación de píxeles" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ES "Es posible que sea necesario un valor alto para que la imagen se muestre bien a resoluciones superiores a la nativa." +#define OPTION_VAL_512MB_ES "512 MB" +#define OPTION_VAL_1GB_ES "1 GB" +#define OPTION_VAL_2GB_ES "2 GB" +#define OPTION_VAL_4GB_ES "4 GB" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_ES "N.º máximo de capas transparentes" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ES "Las escenas más complejas podrían necesitar un valor más alto." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ES "Emulación completa del framebuffer" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ES "Activa la emulación completa del framebuffer dentro de la VRAM. Ideal para aquellos juegos que lean o escriban directamente al framebuffer en la VRAM. Al activar esta opción, se forzará una resolución interna de 640 × 480 y el rendimiento podría verse gravemente afectado." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ES "Activar el búfer RTT (renderizado a texturas)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ES "Copia las texturas renderizadas en la GPU de vuelta a la VRAM. Esta opción suele dejarse activada para aquellos juegos que la requieran. Al activar esta opción, se desactivará el escalado de texturas y el rendimiento podría verse afectado." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_ES "«Mipmapping»" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_ES "Al activar esta opción, las texturas mostrarán una versión con un tamaño más reducido cuanto más lejos estén de la pantalla. Puede mejorar el rendimiento y reducir los efectos de distorsión." +#define CORE_OPTION_NAME_FOG_LABEL_ES "Efectos de niebla" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ES "Modificador de volúmenes" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ES "Una característica de la GPU de Dreamcast que suelen utilizar los juegos para dibujar las sombras de objetos. Esta opción debe activarse por norma general; apenas afecta al rendimiento." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ES "Filtrado anisotrópico" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ES "Mejora la calidad de las texturas en aquellas superficies que se encuentren en un ángulo oblicuo respecto a la cámara. Un valor muy alto necesitará de mayores recursos de la GPU. Es necesario reiniciar para aplicar los cambios en este ajuste." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ES "Filtrado de texturas" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ES "Indica el modo de filtrado de texturas que se utilizará. Puede utilizarse para forzar un modo de filtrado concreto en todas las texturas con el fin de conseguir un aspecto más definido (o suavizado) que el valor predeterminado. Cualquier valor que no sea el predeterminado puede provocar problemas de renderizado. Es necesario reiniciar para aplicar los cambios en este ajuste." +#define OPTION_VAL_1_ES "Forzar vecino más cercano" +#define OPTION_VAL_2_ES "Forzar lineal" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ES "Retrasar cambio de fotogramas" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ES "Ideal para evitar parpadeos constantes o vídeos con fallos gráficos. No se recomienda su uso en plataformas lentas." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ES "Detectar cambios en la frecuencia de actualización" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ES "Informa en el front-end cuando cambie la frecuencia de actualización interna (p. ej.: de 60 a 30 FPS). Mejora la cadencia de fotogramas en aquellos juegos que se ejecuten a 30 o 20 FPS fijos, pero esta opción debería desactivarse en aquellos juegos con frecuencias de fotogramas desbloqueadas (es decir, inestables, p. ej.: Ecco the Dolphin, Unreal Tournament...). NOTA: esta opción no estará disponible si se activa Omisión automática de fotogramas." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ES "Filtro de posprocesamiento del PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ES "Posprocesa la imagen renderizada para simular los efectos dedicados de la GPU PowerVR2 y las señales de vídeo analógico." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_ES "Reescalado de texturas (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ES "Mejora los gráficos 2D de corte «pixel art» dibujado a mano. Utilizar solo con juegos en 2D pixelado." +#define OPTION_VAL_2_O26_ES NULL +#define OPTION_VAL_4_ES NULL +#define OPTION_VAL_6_ES NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ES "Tamaño máximo del escalado de texturas" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_ES "Selecciona un tamaño máximo para el escalado de texturas. Si el tamaño de una textura es superior al valor seleccionado, no se reescalará." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ES "Interpolación nativa de profundidad" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ES "Mitiga la corrupción de texturas y los problemas de profundidad en GPU de AMD. En algunos casos podría ayudar también en GPU de Intel." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_ES "Corregir sangrado de bordes al escalar" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_ES "Ayuda cuando las texturas muestren bordes sangrados al escalarlas. Desactivar esta opción puede ser útil si hay distorsión de píxeles al escalar juegos 2D (MVC2, CVS, KOF, etcétera)." +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ES "Renderizado multihilo" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ES "Ejecuta la GPU y la CPU en hilos distintos. Muy recomendado." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ES "Omisión automática de fotogramas" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ES "Omite fotogramas de forma automática cuando el emulador se esté ejecutando lentamente. Nota: este ajuste solo surtirá efecto cuando la opción «Renderizado multihilo» esté activada." +#define OPTION_VAL_SOME_ES NULL +#define OPTION_VAL_MORE_ES "Valor máximo" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ES "Omisión de fotogramas" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ES "Establece la cantidad de fotogramas que se omitirán tras cada fotograma que se muestre." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ES "Trucos para pantallas panorámicas (es necesario reiniciar)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ES "Activa los trucos que permiten a ciertos juegos mostrarse en formato panorámico." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ES "Arreglo para pantallas panorámicas" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ES "Dibuja la geometría más allá de la relación de aspecto normal de 4:3. Puede producir fallos gráficos en las zonas reveladas." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ES "Lectura rápida de GD-ROM (inexacta)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ES "Acelera la carga de los GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_ES "Mod de 32 MB de RAM para Dreamcast" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_ES "Activa el mod de 32 MB de RAM para Dreamcast. Podría afectar a la compatibilidad." +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_ES "Velocidad de la CPU SH4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_ES "Cambia la velocidad de reloj de la CPU SH4 principal de los 200 MHz predeterminados. Una bajada de velocidad podría ayudar a plataformas lentas. Una subida podría acelerar la velocidad de fotogramas en ciertos juegos. Utilizar con precaución." +#define OPTION_VAL_100_ES "100 MHz" +#define OPTION_VAL_110_ES "110 MHz" +#define OPTION_VAL_120_ES "120 MHz" +#define OPTION_VAL_130_ES "130 MHz" +#define OPTION_VAL_140_ES "140 MHz" +#define OPTION_VAL_150_ES "150 MHz" +#define OPTION_VAL_160_ES "160 MHz" +#define OPTION_VAL_170_ES "170 MHz" +#define OPTION_VAL_180_ES "180 MHz" +#define OPTION_VAL_190_ES "190 MHz" +#define OPTION_VAL_200_ES "200 MHz" +#define OPTION_VAL_210_ES "210 MHz" +#define OPTION_VAL_220_ES "220 MHz" +#define OPTION_VAL_230_ES "230 MHz" +#define OPTION_VAL_240_ES "240 MHz" +#define OPTION_VAL_250_ES "250 MHz" +#define OPTION_VAL_260_ES "260 MHz" +#define OPTION_VAL_270_ES "270 MHz" +#define OPTION_VAL_280_ES "280 MHz" +#define OPTION_VAL_290_ES "290 MHz" +#define OPTION_VAL_300_ES "300 MHz" +#define OPTION_VAL_310_ES "310 MHz" +#define OPTION_VAL_320_ES "320 MHz" +#define OPTION_VAL_330_ES "330 MHz" +#define OPTION_VAL_340_ES "340 MHz" +#define OPTION_VAL_350_ES "350 MHz" +#define OPTION_VAL_360_ES "360 MHz" +#define OPTION_VAL_370_ES "370 MHz" +#define OPTION_VAL_380_ES "380 MHz" +#define OPTION_VAL_390_ES "390 MHz" +#define OPTION_VAL_400_ES "400 MHz" +#define OPTION_VAL_410_ES "410 MHz" +#define OPTION_VAL_420_ES "420 MHz" +#define OPTION_VAL_430_ES "430 MHz" +#define OPTION_VAL_440_ES "440 MHz" +#define OPTION_VAL_450_ES "450 MHz" +#define OPTION_VAL_460_ES "460 MHz" +#define OPTION_VAL_470_ES "470 MHz" +#define OPTION_VAL_480_ES "480 MHz" +#define OPTION_VAL_490_ES "490 MHz" +#define OPTION_VAL_500_ES "500 MHz" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ES "Cargar texturas personalizadas" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_ES "Carga las texturas personalizadas que se encuentren en la carpeta «system/dc/textures//»." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ES "Volcar texturas" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_ES "Cada vez que aparezca una textura nueva en el juego, se guardará en formato .PNG dentro de la carpeta «system/dc/texdump//»." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ES "Zona muerta del stick analógico" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_ES "Selecciona la distancia a partir de la cual se empezará a reconocer el movimiento del stick analógico." +#define OPTION_VAL_0_ES "0 %" +#define OPTION_VAL_5_ES "5 %" +#define OPTION_VAL_10_ES "10 %" +#define OPTION_VAL_15_ES "15 %" +#define OPTION_VAL_20_ES "20 %" +#define OPTION_VAL_25_ES "25 %" +#define OPTION_VAL_30_ES "30 %" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ES "Zona muerta de los gatillos" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_ES "Selecciona la distancia a partir de la cual se empezará a reconocer la pulsación del gatillo." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ES "Gatillos digitales" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_ES "Al activar esta opción, los gatillos funcionarán como botones normales, lo que significa que se procesarán como o pulsados por completo o sin pulsar, sin término medio." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ES "Transmitir salidas digitales" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ES "Transmite las salidas digitales y el estado de la vibración al puerto TCP 8000. Compatible con la opción de MAME «-output network»." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ES "Mostrar ajustes de las pistolas de luz" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ES "Permite configurar los puntos de mira de las pistolas de luz. NOTA: es necesario salir y volver a entrar del menú rápido para que el cambio surta efecto." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_ES "Escala del punto de mira de la pistola" +#define OPTION_VAL_50_ES "50 %" +#define OPTION_VAL_60_ES "60 %" +#define OPTION_VAL_70_ES "70 %" +#define OPTION_VAL_80_ES "80 %" +#define OPTION_VAL_90_ES "90 %" +#define OPTION_VAL_100_O45_ES "100 %" +#define OPTION_VAL_110_O45_ES "110 %" +#define OPTION_VAL_120_O45_ES "120 %" +#define OPTION_VAL_130_O45_ES "130 %" +#define OPTION_VAL_140_O45_ES "140 %" +#define OPTION_VAL_150_O45_ES "150 %" +#define OPTION_VAL_160_O45_ES "160 %" +#define OPTION_VAL_170_O45_ES "170 %" +#define OPTION_VAL_180_O45_ES "180 %" +#define OPTION_VAL_190_O45_ES "190 %" +#define OPTION_VAL_200_O45_ES "200 %" +#define OPTION_VAL_210_O45_ES "210 %" +#define OPTION_VAL_220_O45_ES "220 %" +#define OPTION_VAL_230_O45_ES "230 %" +#define OPTION_VAL_240_O45_ES "240 %" +#define OPTION_VAL_250_O45_ES "250 %" +#define OPTION_VAL_260_O45_ES "260 %" +#define OPTION_VAL_270_O45_ES "270 %" +#define OPTION_VAL_280_O45_ES "280 %" +#define OPTION_VAL_290_O45_ES "290 %" +#define OPTION_VAL_300_O45_ES "300 %" +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 1" +#define OPTION_VAL_WHITE_ES "Blanco" +#define OPTION_VAL_RED_ES "Rojo" +#define OPTION_VAL_GREEN_ES "Verde" +#define OPTION_VAL_BLUE_ES "Azul" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ES "Mostrar punto de mira del arma 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_ES "Dispositivo del puerto de expansión A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión A1 (puerto de mando A, ranura 1)." +#define OPTION_VAL_VMU_ES "Visual Memory (VMU)" +#define OPTION_VAL_PURUPURU_ES "Vibration Pack (vibración)" +#define OPTION_VAL_NONE_ES "No compartir" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_ES "Dispositivo del puerto de expansión A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión A2 (puerto de mando A, ranura 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_ES "Dispositivo del puerto de expansión B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión B1 (puerto de mando B, ranura 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_ES "Dispositivo del puerto de expansión B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión B2 (puerto de mando B, ranura 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_ES "Dispositivo del puerto de expansión C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión C1 (puerto de mando C, ranura 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_ES "Dispositivo del puerto de expansión C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión C2 (puerto de mando C, ranura 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_ES "Dispositivo del puerto de expansión D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión D1 (puerto de mando D, ranura 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_ES "Dispositivo del puerto de expansión D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_ES "Selecciona el dispositivo conectado al puerto de expansión D2 (puerto de mando D, ranura 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ES "Separar Visual Memory (VMU) por juego" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ES "VMUs individuales para cada juego" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ES "Al desactivar esta opción, todos los juegos compartirán ocho archivos de guardado de VMU (A1/A2/B1/B2/C1/C2/D1/D2) que se encontrarán en la carpeta del sistema de RetroArch.\nEl ajuste «VMU A1» creará un archivo único de la VMU A1 en la carpeta de guardados de RetroArch para cada juego que se ejecute.\n«Todas las VMU» creará ocho archivos VMU únicos (A1/A2/B1/B2/C1/C2/D1/D2) para cada juego que se ejecute." +#define OPTION_VAL_VMU_A1_ES NULL +#define OPTION_VAL_ALL_VMUS_ES "Todas las VMUs" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_ES "Sonidos de las Visual Memory (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ES "Sonidos de Visual Memory/VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_ES "Al activar esta opción, se reproducirán los pitidos de las Visual Memory/VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ES "Mostrar ajustes de visualización de las Visual Memory (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ES "Mostrar ajustes de visualización de las VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ES "Permite configurar la visibilidad, tamaño, posición y color de las pantallas LCD emuladas de las VMU. NOTA: es necesario salir y volver a entrar del menú rápido para que el cambio surta efecto." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 1" +#define OPTION_VAL_UPPER_LEFT_ES "Esquina superior izquierda" +#define OPTION_VAL_UPPER_RIGHT_ES "Esquina superior derecha" +#define OPTION_VAL_LOWER_LEFT_ES "Esquina inferior izquierda" +#define OPTION_VAL_LOWER_RIGHT_ES "Esquina interior derecha" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 1" +#define OPTION_VAL_1X_ES NULL +#define OPTION_VAL_3X_ES NULL +#define OPTION_VAL_5X_ES NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 1" +#define OPTION_VAL_DEFAULT_ON_00_ES "Predeterminado (encendido)" +#define OPTION_VAL_DEFAULT_OFF_01_ES "Predeterminado (apagado)" +#define OPTION_VAL_BLACK_02_ES "Negro" +#define OPTION_VAL_LIGHT_BLUE_04_ES "Azul claro" +#define OPTION_VAL_CYAN_06_ES "Cian" +#define OPTION_VAL_CYAN_BLUE_07_ES "Azul celeste" +#define OPTION_VAL_LIGHT_GREEN_08_ES "Verde claro" +#define OPTION_VAL_CYAN_GREEN_09_ES "Verde cian" +#define OPTION_VAL_LIGHT_CYAN_10_ES "Cian claro" +#define OPTION_VAL_PURPLE_12_ES "Violeta" +#define OPTION_VAL_LIGHT_PURPLE_13_ES "Violeta claro" +#define OPTION_VAL_YELLOW_14_ES "Amarillo" +#define OPTION_VAL_GRAY_15_ES "Gris" +#define OPTION_VAL_LIGHT_PURPLE_2_16_ES "Violeta claro (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_ES "Verde claro (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_ES "Verde claro (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_ES "Cian claro (2)" +#define OPTION_VAL_LIGHT_RED_2_20_ES "Rojo claro (2)" +#define OPTION_VAL_MAGENTA_21_ES NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_ES "Violeta claro (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_ES "Naranja claro" +#define OPTION_VAL_ORANGE_24_ES "Naranja" +#define OPTION_VAL_LIGHT_PURPLE_4_25_ES "Violeta claro (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_ES "Amarillo claro" +#define OPTION_VAL_LIGHT_YELLOW_2_27_ES "Amarillo claro (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 1" +#define OPTION_VAL_40_ES "40 %" +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ES "Pantalla de la VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ES "Posición de la pantalla de la VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ES "Tamaño de la pantalla de la VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ES "Color de píxeles encendidos de la VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ES "Color de píxeles apagados de la VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ES "Opacidad de la pantalla de la VMU 4" + +struct retro_core_option_v2_category option_cats_es[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_ES, + CATEGORY_SYSTEM_INFO_0_ES + }, + { + "video", + CATEGORY_VIDEO_LABEL_ES, + CATEGORY_VIDEO_INFO_0_ES + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_ES, + CATEGORY_PERFORMANCE_INFO_0_ES + }, + { + "hacks", + CATEGORY_HACKS_LABEL_ES, + CATEGORY_HACKS_INFO_0_ES + }, + { + "input", + CATEGORY_INPUT_LABEL_ES, + CATEGORY_INPUT_INFO_0_ES + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_ES, + CATEGORY_EXPANSIONS_INFO_0_ES + }, + { + "vmu", + CATEGORY_VMU_LABEL_ES, + CATEGORY_VMU_INFO_0_ES + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_es[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_ES, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_ES }, + { "USA", OPTION_VAL_USA_ES }, + { "Europe", OPTION_VAL_EUROPE_ES }, + { "Default", OPTION_VAL_DEFAULT_ES }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_ES, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_ES, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_ES }, + { "English", OPTION_VAL_ENGLISH_ES }, + { "German", OPTION_VAL_GERMAN_ES }, + { "French", OPTION_VAL_FRENCH_ES }, + { "Spanish", OPTION_VAL_SPANISH_ES }, + { "Italian", OPTION_VAL_ITALIAN_ES }, + { "Default", OPTION_VAL_DEFAULT_ES }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_ES, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_ES, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FA, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ES, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ES, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_ES, + NULL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ES, NULL, "system", { @@ -25651,13 +28684,17 @@ struct retro_core_option_v2_definition option_defs_fa[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ES, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ES, NULL, "system", { @@ -25669,9 +28706,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FA, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ES, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FA, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ES, NULL, "system", { @@ -25683,9 +28720,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_FA, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_ES, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FA, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ES, NULL, "system", { @@ -25697,9 +28734,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_FA, + CORE_OPTION_NAME_UPNP_LABEL_ES, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_FA, + CORE_OPTION_NAME_UPNP_INFO_0_ES, NULL, "system", { @@ -25712,39 +28749,39 @@ struct retro_core_option_v2_definition option_defs_fa[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ES, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ES, NULL, "video", { - { "320x240", OPTION_VAL_320X240_FA }, - { "640x480", OPTION_VAL_640X480_FA }, - { "800x600", OPTION_VAL_800X600_FA }, - { "960x720", OPTION_VAL_960X720_FA }, - { "1024x768", OPTION_VAL_1024X768_FA }, - { "1280x960", OPTION_VAL_1280X960_FA }, - { "1440x1080", OPTION_VAL_1440X1080_FA }, - { "1600x1200", OPTION_VAL_1600X1200_FA }, - { "1920x1440", OPTION_VAL_1920X1440_FA }, - { "2560x1920", OPTION_VAL_2560X1920_FA }, - { "2880x2160", OPTION_VAL_2880X2160_FA }, - { "3200x2400", OPTION_VAL_3200X2400_FA }, - { "3840x2880", OPTION_VAL_3840X2880_FA }, - { "4480x3360", OPTION_VAL_4480X3360_FA }, - { "5120x3840", OPTION_VAL_5120X3840_FA }, - { "5760x4320", OPTION_VAL_5760X4320_FA }, - { "6400x4800", OPTION_VAL_6400X4800_FA }, - { "7040x5280", OPTION_VAL_7040X5280_FA }, - { "7680x5760", OPTION_VAL_7680X5760_FA }, - { "8320x6240", OPTION_VAL_8320X6240_FA }, - { "8960x6720", OPTION_VAL_8960X6720_FA }, - { "9600x7200", OPTION_VAL_9600X7200_FA }, - { "10240x7680", OPTION_VAL_10240X7680_FA }, - { "10880x8160", OPTION_VAL_10880X8160_FA }, - { "11520x8640", OPTION_VAL_11520X8640_FA }, - { "12160x9120", OPTION_VAL_12160X9120_FA }, - { "12800x9600", OPTION_VAL_12800X9600_FA }, + { "320x240", OPTION_VAL_320X240_ES }, + { "640x480", OPTION_VAL_640X480_ES }, + { "800x600", OPTION_VAL_800X600_ES }, + { "960x720", OPTION_VAL_960X720_ES }, + { "1024x768", OPTION_VAL_1024X768_ES }, + { "1280x960", OPTION_VAL_1280X960_ES }, + { "1440x1080", OPTION_VAL_1440X1080_ES }, + { "1600x1200", OPTION_VAL_1600X1200_ES }, + { "1920x1440", OPTION_VAL_1920X1440_ES }, + { "2560x1920", OPTION_VAL_2560X1920_ES }, + { "2880x2160", OPTION_VAL_2880X2160_ES }, + { "3200x2400", OPTION_VAL_3200X2400_ES }, + { "3840x2880", OPTION_VAL_3840X2880_ES }, + { "4480x3360", OPTION_VAL_4480X3360_ES }, + { "5120x3840", OPTION_VAL_5120X3840_ES }, + { "5760x4320", OPTION_VAL_5760X4320_ES }, + { "6400x4800", OPTION_VAL_6400X4800_ES }, + { "7040x5280", OPTION_VAL_7040X5280_ES }, + { "7680x5760", OPTION_VAL_7680X5760_ES }, + { "8320x6240", OPTION_VAL_8320X6240_ES }, + { "8960x6720", OPTION_VAL_8960X6720_ES }, + { "9600x7200", OPTION_VAL_9600X7200_ES }, + { "10240x7680", OPTION_VAL_10240X7680_ES }, + { "10880x8160", OPTION_VAL_10880X8160_ES }, + { "11520x8640", OPTION_VAL_11520X8640_ES }, + { "12160x9120", OPTION_VAL_12160X9120_ES }, + { "12800x9600", OPTION_VAL_12800X9600_ES }, { NULL, NULL }, }, #ifdef LOW_RES @@ -25755,62 +28792,62 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_FA, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_ES, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FA, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ES, NULL, "video", { - { "VGA", OPTION_VAL_VGA_FA }, - { "TV (RGB)", OPTION_VAL_TV_RGB_FA }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FA }, + { "VGA", OPTION_VAL_VGA_ES }, + { "TV (RGB)", OPTION_VAL_TV_RGB_ES }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_ES }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_FA, + CORE_OPTION_NAME_BROADCAST_LABEL_ES, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_FA }, - { "PAL", OPTION_VAL_PAL_FA }, - { "PAL_N", OPTION_VAL_PAL_N_FA }, - { "PAL_M", OPTION_VAL_PAL_M_FA }, - { "Default", OPTION_VAL_DEFAULT_FA }, + { "NTSC", OPTION_VAL_NTSC_ES }, + { "PAL", OPTION_VAL_PAL_ES }, + { "PAL_N", OPTION_VAL_PAL_N_ES }, + { "PAL_M", OPTION_VAL_PAL_M_ES }, + { "Default", OPTION_VAL_DEFAULT_ES }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FA, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ES, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_FA }, - { "vertical", OPTION_VAL_VERTICAL_FA }, + { "horizontal", OPTION_VAL_HORIZONTAL_ES }, + { "vertical", OPTION_VAL_VERTICAL_ES }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FA, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_ES, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FA }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FA }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ES }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_ES }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FA }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_ES }, #endif { NULL, NULL }, }, @@ -25823,25 +28860,25 @@ struct retro_core_option_v2_definition option_defs_fa[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ES, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ES, NULL, "video", { - { "512MB", OPTION_VAL_512MB_FA }, - { "1GB", OPTION_VAL_1GB_FA }, - { "2GB", OPTION_VAL_2GB_FA }, - { "4GB", OPTION_VAL_4GB_FA }, + { "512MB", OPTION_VAL_512MB_ES }, + { "1GB", OPTION_VAL_1GB_ES }, + { "2GB", OPTION_VAL_2GB_ES }, + { "4GB", OPTION_VAL_4GB_ES }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_FA, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_ES, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FA, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ES, NULL, "video", { @@ -25849,6 +28886,7 @@ struct retro_core_option_v2_definition option_defs_fa[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -25857,9 +28895,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ES, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ES, NULL, "video", { @@ -25871,9 +28909,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FA, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ES, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FA, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ES, NULL, "video", { @@ -25883,11 +28921,11 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_FA, + CORE_OPTION_NAME_MIPMAPPING_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_ES, NULL, "video", { @@ -25899,7 +28937,7 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_FA, + CORE_OPTION_NAME_FOG_LABEL_ES, NULL, "", NULL, @@ -25913,9 +28951,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ES, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ES, NULL, "video", { @@ -25927,9 +28965,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ES, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ES, NULL, "video", { @@ -25944,24 +28982,24 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FA, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ES, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FA, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ES, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_FA }, - { "1", OPTION_VAL_1_FA }, - { "2", OPTION_VAL_2_FA }, + { "0", OPTION_VAL_DEFAULT_ES }, + { "1", OPTION_VAL_1_ES }, + { "2", OPTION_VAL_2_ES }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ES, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ES, NULL, "video", { @@ -25969,13 +29007,13 @@ struct retro_core_option_v2_definition option_defs_fa[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ES, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ES, NULL, "video", { @@ -25987,9 +29025,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FA, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ES, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FA, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ES, NULL, "video", { @@ -26002,25 +29040,25 @@ struct retro_core_option_v2_definition option_defs_fa[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_FA, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_ES, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FA, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ES, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_FA }, - { "4", OPTION_VAL_4_FA }, - { "6", OPTION_VAL_6_FA }, + { "2", OPTION_VAL_2_O26_ES }, + { "4", OPTION_VAL_4_ES }, + { "6", OPTION_VAL_6_ES }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FA, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_ES, NULL, "video", { @@ -26034,9 +29072,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ES, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ES, NULL, "video", { @@ -26046,11 +29084,25 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_ES, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_ES, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FA, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ES, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FA, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ES, NULL, "performance", { @@ -26062,15 +29114,15 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ES, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ES, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_FA }, - { "more", OPTION_VAL_MORE_FA }, + { "some", OPTION_VAL_SOME_ES }, + { "more", OPTION_VAL_MORE_ES }, { NULL, NULL }, }, #ifdef LOW_END @@ -26081,9 +29133,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FA, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ES, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FA, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ES, NULL, "performance", { @@ -26100,9 +29152,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ES, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ES, NULL, "hacks", { @@ -26114,9 +29166,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FA, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ES, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FA, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ES, NULL, "hacks", { @@ -26128,9 +29180,9 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ES, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ES, NULL, "hacks", { @@ -26144,64 +29196,78 @@ struct retro_core_option_v2_definition option_defs_fa[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_ES, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_ES, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_FA, + CORE_OPTION_NAME_SH4CLOCK_LABEL_ES, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_FA, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_ES, NULL, "hacks", { - { "100", OPTION_VAL_100_FA }, - { "110", OPTION_VAL_110_FA }, - { "120", OPTION_VAL_120_FA }, - { "130", OPTION_VAL_130_FA }, - { "140", OPTION_VAL_140_FA }, - { "150", OPTION_VAL_150_FA }, - { "160", OPTION_VAL_160_FA }, - { "170", OPTION_VAL_170_FA }, - { "180", OPTION_VAL_180_FA }, - { "190", OPTION_VAL_190_FA }, - { "200", OPTION_VAL_200_FA }, - { "210", OPTION_VAL_210_FA }, - { "220", OPTION_VAL_220_FA }, - { "230", OPTION_VAL_230_FA }, - { "240", OPTION_VAL_240_FA }, - { "250", OPTION_VAL_250_FA }, - { "260", OPTION_VAL_260_FA }, - { "270", OPTION_VAL_270_FA }, - { "280", OPTION_VAL_280_FA }, - { "290", OPTION_VAL_290_FA }, - { "300", OPTION_VAL_300_FA }, - { "310", OPTION_VAL_310_FA }, - { "320", OPTION_VAL_320_FA }, - { "330", OPTION_VAL_330_FA }, - { "340", OPTION_VAL_340_FA }, - { "350", OPTION_VAL_350_FA }, - { "360", OPTION_VAL_360_FA }, - { "370", OPTION_VAL_370_FA }, - { "380", OPTION_VAL_380_FA }, - { "390", OPTION_VAL_390_FA }, - { "400", OPTION_VAL_400_FA }, - { "410", OPTION_VAL_410_FA }, - { "420", OPTION_VAL_420_FA }, - { "430", OPTION_VAL_430_FA }, - { "440", OPTION_VAL_440_FA }, - { "450", OPTION_VAL_450_FA }, - { "460", OPTION_VAL_460_FA }, - { "470", OPTION_VAL_470_FA }, - { "480", OPTION_VAL_480_FA }, - { "490", OPTION_VAL_490_FA }, - { "500", OPTION_VAL_500_FA }, + { "100", OPTION_VAL_100_ES }, + { "110", OPTION_VAL_110_ES }, + { "120", OPTION_VAL_120_ES }, + { "130", OPTION_VAL_130_ES }, + { "140", OPTION_VAL_140_ES }, + { "150", OPTION_VAL_150_ES }, + { "160", OPTION_VAL_160_ES }, + { "170", OPTION_VAL_170_ES }, + { "180", OPTION_VAL_180_ES }, + { "190", OPTION_VAL_190_ES }, + { "200", OPTION_VAL_200_ES }, + { "210", OPTION_VAL_210_ES }, + { "220", OPTION_VAL_220_ES }, + { "230", OPTION_VAL_230_ES }, + { "240", OPTION_VAL_240_ES }, + { "250", OPTION_VAL_250_ES }, + { "260", OPTION_VAL_260_ES }, + { "270", OPTION_VAL_270_ES }, + { "280", OPTION_VAL_280_ES }, + { "290", OPTION_VAL_290_ES }, + { "300", OPTION_VAL_300_ES }, + { "310", OPTION_VAL_310_ES }, + { "320", OPTION_VAL_320_ES }, + { "330", OPTION_VAL_330_ES }, + { "340", OPTION_VAL_340_ES }, + { "350", OPTION_VAL_350_ES }, + { "360", OPTION_VAL_360_ES }, + { "370", OPTION_VAL_370_ES }, + { "380", OPTION_VAL_380_ES }, + { "390", OPTION_VAL_390_ES }, + { "400", OPTION_VAL_400_ES }, + { "410", OPTION_VAL_410_ES }, + { "420", OPTION_VAL_420_ES }, + { "430", OPTION_VAL_430_ES }, + { "440", OPTION_VAL_440_ES }, + { "450", OPTION_VAL_450_ES }, + { "460", OPTION_VAL_460_ES }, + { "470", OPTION_VAL_470_ES }, + { "480", OPTION_VAL_480_ES }, + { "490", OPTION_VAL_490_ES }, + { "500", OPTION_VAL_500_ES }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FA, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_ES, NULL, "hacks", { @@ -26211,11 +29277,11 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FA, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_ES, NULL, "hacks", { @@ -26227,47 +29293,47 @@ struct retro_core_option_v2_definition option_defs_fa[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FA, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_ES, NULL, "input", { - { "0%", OPTION_VAL_0_FA }, - { "5%", OPTION_VAL_5_FA }, - { "10%", OPTION_VAL_10_FA }, - { "15%", OPTION_VAL_15_FA }, - { "20%", OPTION_VAL_20_FA }, - { "25%", OPTION_VAL_25_FA }, - { "30%", OPTION_VAL_30_FA }, + { "0%", OPTION_VAL_0_ES }, + { "5%", OPTION_VAL_5_ES }, + { "10%", OPTION_VAL_10_ES }, + { "15%", OPTION_VAL_15_ES }, + { "20%", OPTION_VAL_20_ES }, + { "25%", OPTION_VAL_25_ES }, + { "30%", OPTION_VAL_30_ES }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FA, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_ES, NULL, "input", { - { "0%", OPTION_VAL_0_FA }, - { "5%", OPTION_VAL_5_FA }, - { "10%", OPTION_VAL_10_FA }, - { "15%", OPTION_VAL_15_FA }, - { "20%", OPTION_VAL_20_FA }, - { "25%", OPTION_VAL_25_FA }, - { "30%", OPTION_VAL_30_FA }, + { "0%", OPTION_VAL_0_ES }, + { "5%", OPTION_VAL_5_ES }, + { "10%", OPTION_VAL_10_ES }, + { "15%", OPTION_VAL_15_ES }, + { "20%", OPTION_VAL_20_ES }, + { "25%", OPTION_VAL_25_ES }, + { "30%", OPTION_VAL_30_ES }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FA, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_ES, NULL, "input", { @@ -26278,10 +29344,10 @@ struct retro_core_option_v2_definition option_defs_fa[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FA, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ES, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FA, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ES, NULL, "input", { @@ -26289,300 +29355,293 @@ struct retro_core_option_v2_definition option_defs_fa[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FA, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ES, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FA, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ES, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FA, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_ES, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FA, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_ES }, + { "60%", OPTION_VAL_60_ES }, + { "70%", OPTION_VAL_70_ES }, + { "80%", OPTION_VAL_80_ES }, + { "90%", OPTION_VAL_90_ES }, + { "100%", OPTION_VAL_100_O45_ES }, + { "110%", OPTION_VAL_110_O45_ES }, + { "120%", OPTION_VAL_120_O45_ES }, + { "130%", OPTION_VAL_130_O45_ES }, + { "140%", OPTION_VAL_140_O45_ES }, + { "150%", OPTION_VAL_150_O45_ES }, + { "160%", OPTION_VAL_160_O45_ES }, + { "170%", OPTION_VAL_170_O45_ES }, + { "180%", OPTION_VAL_180_O45_ES }, + { "190%", OPTION_VAL_190_O45_ES }, + { "200%", OPTION_VAL_200_O45_ES }, + { "210%", OPTION_VAL_210_O45_ES }, + { "220%", OPTION_VAL_220_O45_ES }, + { "230%", OPTION_VAL_230_O45_ES }, + { "240%", OPTION_VAL_240_O45_ES }, + { "250%", OPTION_VAL_250_O45_ES }, + { "260%", OPTION_VAL_260_O45_ES }, + { "270%", OPTION_VAL_270_O45_ES }, + { "280%", OPTION_VAL_280_O45_ES }, + { "290%", OPTION_VAL_290_O45_ES }, + { "300%", OPTION_VAL_300_O45_ES }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FA, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ES, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FA }, - { "Red", OPTION_VAL_RED_FA }, - { "Green", OPTION_VAL_GREEN_FA }, - { "Blue", OPTION_VAL_BLUE_FA }, + { "White", OPTION_VAL_WHITE_ES }, + { "Red", OPTION_VAL_RED_ES }, + { "Green", OPTION_VAL_GREEN_ES }, + { "Blue", OPTION_VAL_BLUE_ES }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FA, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ES, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FA }, - { "Red", OPTION_VAL_RED_FA }, - { "Green", OPTION_VAL_GREEN_FA }, - { "Blue", OPTION_VAL_BLUE_FA }, + { "White", OPTION_VAL_WHITE_ES }, + { "Red", OPTION_VAL_RED_ES }, + { "Green", OPTION_VAL_GREEN_ES }, + { "Blue", OPTION_VAL_BLUE_ES }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FA, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ES, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FA }, - { "Red", OPTION_VAL_RED_FA }, - { "Green", OPTION_VAL_GREEN_FA }, - { "Blue", OPTION_VAL_BLUE_FA }, + { "White", OPTION_VAL_WHITE_ES }, + { "Red", OPTION_VAL_RED_ES }, + { "Green", OPTION_VAL_GREEN_ES }, + { "Blue", OPTION_VAL_BLUE_ES }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FA, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ES, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FA }, - { "Red", OPTION_VAL_RED_FA }, - { "Green", OPTION_VAL_GREEN_FA }, - { "Blue", OPTION_VAL_BLUE_FA }, + { "White", OPTION_VAL_WHITE_ES }, + { "Red", OPTION_VAL_RED_ES }, + { "Green", OPTION_VAL_GREEN_ES }, + { "Blue", OPTION_VAL_BLUE_ES }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FA, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_ES, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_ES, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_FA }, - { "All VMUs", OPTION_VAL_ALL_VMUS_FA }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_FA, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FA, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_FA, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_ES, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_ES, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FA, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_ES, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_ES, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FA, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_ES, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FA, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_ES, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FA, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_ES, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_FA }, - { "2x", OPTION_VAL_2_O27_FA }, - { "3x", OPTION_VAL_3X_FA }, - { "4x", OPTION_VAL_4_FA }, - { "5x", OPTION_VAL_5X_FA }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FA, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_ES, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FA, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_ES, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_ES, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "VMU", OPTION_VAL_VMU_ES }, + { "Purupuru", OPTION_VAL_PURUPURU_ES }, + { "None", OPTION_VAL_NONE_ES }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FA, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ES, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ES, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ES, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_ES }, + { "All VMUs", OPTION_VAL_ALL_VMUS_ES }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_ES, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ES, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_ES, NULL, "vmu", { - { "10%", OPTION_VAL_10_FA }, - { "20%", OPTION_VAL_20_FA }, - { "30%", OPTION_VAL_30_FA }, - { "40%", OPTION_VAL_40_FA }, - { "50%", OPTION_VAL_50_FA }, - { "60%", OPTION_VAL_60_FA }, - { "70%", OPTION_VAL_70_FA }, - { "80%", OPTION_VAL_80_FA }, - { "90%", OPTION_VAL_90_FA }, - { "100%", OPTION_VAL_100_O57_FA }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FA, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ES, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ES, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ES, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ES, NULL, "", NULL, @@ -26595,145 +29654,145 @@ struct retro_core_option_v2_definition option_defs_fa[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FA, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ES, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FA, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ES, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FA }, - { "2x", OPTION_VAL_2_O27_FA }, - { "3x", OPTION_VAL_3X_FA }, - { "4x", OPTION_VAL_4_FA }, - { "5x", OPTION_VAL_5X_FA }, + { "1x", OPTION_VAL_1X_ES }, + { "2x", OPTION_VAL_2_O26_ES }, + { "3x", OPTION_VAL_3X_ES }, + { "4x", OPTION_VAL_4_ES }, + { "5x", OPTION_VAL_5X_ES }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FA, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ES, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FA }, - { "20%", OPTION_VAL_20_FA }, - { "30%", OPTION_VAL_30_FA }, - { "40%", OPTION_VAL_40_FA }, - { "50%", OPTION_VAL_50_FA }, - { "60%", OPTION_VAL_60_FA }, - { "70%", OPTION_VAL_70_FA }, - { "80%", OPTION_VAL_80_FA }, - { "90%", OPTION_VAL_90_FA }, - { "100%", OPTION_VAL_100_O57_FA }, + { "10%", OPTION_VAL_10_ES }, + { "20%", OPTION_VAL_20_ES }, + { "30%", OPTION_VAL_30_ES }, + { "40%", OPTION_VAL_40_ES }, + { "50%", OPTION_VAL_50_ES }, + { "60%", OPTION_VAL_60_ES }, + { "70%", OPTION_VAL_70_ES }, + { "80%", OPTION_VAL_80_ES }, + { "90%", OPTION_VAL_90_ES }, + { "100%", OPTION_VAL_100_O45_ES }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FA, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ES, NULL, "", NULL, @@ -26746,145 +29805,145 @@ struct retro_core_option_v2_definition option_defs_fa[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FA, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ES, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FA, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ES, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FA }, - { "2x", OPTION_VAL_2_O27_FA }, - { "3x", OPTION_VAL_3X_FA }, - { "4x", OPTION_VAL_4_FA }, - { "5x", OPTION_VAL_5X_FA }, + { "1x", OPTION_VAL_1X_ES }, + { "2x", OPTION_VAL_2_O26_ES }, + { "3x", OPTION_VAL_3X_ES }, + { "4x", OPTION_VAL_4_ES }, + { "5x", OPTION_VAL_5X_ES }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FA, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ES, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FA }, - { "20%", OPTION_VAL_20_FA }, - { "30%", OPTION_VAL_30_FA }, - { "40%", OPTION_VAL_40_FA }, - { "50%", OPTION_VAL_50_FA }, - { "60%", OPTION_VAL_60_FA }, - { "70%", OPTION_VAL_70_FA }, - { "80%", OPTION_VAL_80_FA }, - { "90%", OPTION_VAL_90_FA }, - { "100%", OPTION_VAL_100_O57_FA }, + { "10%", OPTION_VAL_10_ES }, + { "20%", OPTION_VAL_20_ES }, + { "30%", OPTION_VAL_30_ES }, + { "40%", OPTION_VAL_40_ES }, + { "50%", OPTION_VAL_50_ES }, + { "60%", OPTION_VAL_60_ES }, + { "70%", OPTION_VAL_70_ES }, + { "80%", OPTION_VAL_80_ES }, + { "90%", OPTION_VAL_90_ES }, + { "100%", OPTION_VAL_100_O45_ES }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FA, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ES, NULL, "", NULL, @@ -26897,784 +29956,728 @@ struct retro_core_option_v2_definition option_defs_fa[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FA, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ES, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FA, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ES, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FA }, - { "2x", OPTION_VAL_2_O27_FA }, - { "3x", OPTION_VAL_3X_FA }, - { "4x", OPTION_VAL_4_FA }, - { "5x", OPTION_VAL_5X_FA }, + { "1x", OPTION_VAL_1X_ES }, + { "2x", OPTION_VAL_2_O26_ES }, + { "3x", OPTION_VAL_3X_ES }, + { "4x", OPTION_VAL_4_ES }, + { "5x", OPTION_VAL_5X_ES }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FA, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ES, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, - { "BLACK 02", OPTION_VAL_BLACK_02_FA }, - { "BLUE 03", OPTION_VAL_BLUE_FA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, - { "GREEN 05", OPTION_VAL_GREEN_FA }, - { "CYAN 06", OPTION_VAL_CYAN_06_FA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, - { "RED 11", OPTION_VAL_RED_FA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, - { "GRAY 15", OPTION_VAL_GRAY_15_FA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, - { "WHITE 28", OPTION_VAL_WHITE_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FA, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ES, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FA }, - { "20%", OPTION_VAL_20_FA }, - { "30%", OPTION_VAL_30_FA }, - { "40%", OPTION_VAL_40_FA }, - { "50%", OPTION_VAL_50_FA }, - { "60%", OPTION_VAL_60_FA }, - { "70%", OPTION_VAL_70_FA }, - { "80%", OPTION_VAL_80_FA }, - { "90%", OPTION_VAL_90_FA }, - { "100%", OPTION_VAL_100_O57_FA }, + { "10%", OPTION_VAL_10_ES }, + { "20%", OPTION_VAL_20_ES }, + { "30%", OPTION_VAL_30_ES }, + { "40%", OPTION_VAL_40_ES }, + { "50%", OPTION_VAL_50_ES }, + { "60%", OPTION_VAL_60_ES }, + { "70%", OPTION_VAL_70_ES }, + { "80%", OPTION_VAL_80_ES }, + { "90%", OPTION_VAL_90_ES }, + { "100%", OPTION_VAL_100_O45_ES }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_fa = { - option_cats_fa, - option_defs_fa -}; - -/* RETRO_LANGUAGE_FI */ - -#define CATEGORY_SYSTEM_LABEL_FI "Järjestelmä" -#define CATEGORY_SYSTEM_INFO_0_FI NULL -#define CATEGORY_VIDEO_LABEL_FI NULL -#define CATEGORY_VIDEO_INFO_0_FI NULL -#define CATEGORY_PERFORMANCE_LABEL_FI "Suorituskyky" -#define CATEGORY_PERFORMANCE_INFO_0_FI NULL -#define CATEGORY_HACKS_LABEL_FI "Emulointikikat" -#define CATEGORY_HACKS_INFO_0_FI NULL -#define CATEGORY_INPUT_LABEL_FI "Syöte" -#define CATEGORY_INPUT_INFO_0_FI NULL -#define CATEGORY_VMU_LABEL_FI NULL -#define CATEGORY_VMU_INFO_0_FI NULL -#define CORE_OPTION_NAME_REGION_LABEL_FI "Alue" -#define OPTION_VAL_JAPAN_FI NULL -#define OPTION_VAL_USA_FI NULL -#define OPTION_VAL_EUROPE_FI "Eurooppa" -#define OPTION_VAL_DEFAULT_FI "Oletus" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_FI "Kieli" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FI NULL -#define OPTION_VAL_JAPANESE_FI NULL -#define OPTION_VAL_ENGLISH_FI NULL -#define OPTION_VAL_GERMAN_FI NULL -#define OPTION_VAL_FRENCH_FI NULL -#define OPTION_VAL_SPANISH_FI NULL -#define OPTION_VAL_ITALIAN_FI NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FI NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FI NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FI "Käynnistä BIOS:iin (Uudelleenkäynnistys vaaditaan)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FI "Käynnistä suoraan Dreamcastin BIOS-valikkoon." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FI "Käytä DSP:tä" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FI NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_FI "Pakota Windows CE -tila" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FI NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FI NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FI NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FI NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FI NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FI "Laajakaista-adapterin emulaatio" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FI NULL -#define CORE_OPTION_NAME_UPNP_LABEL_FI "Käytä UPnP:tä" -#define CORE_OPTION_NAME_UPNP_INFO_0_FI "Käytä UPnP:tä Internet-reitittimen määrittämiseksi verkkopelejä varten." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FI "Sisäinen resoluutio" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FI NULL -#define OPTION_VAL_320X240_FI NULL -#define OPTION_VAL_640X480_FI NULL -#define OPTION_VAL_800X600_FI NULL -#define OPTION_VAL_960X720_FI NULL -#define OPTION_VAL_1024X768_FI NULL -#define OPTION_VAL_1280X960_FI NULL -#define OPTION_VAL_1440X1080_FI NULL -#define OPTION_VAL_1600X1200_FI NULL -#define OPTION_VAL_1920X1440_FI NULL -#define OPTION_VAL_2560X1920_FI NULL -#define OPTION_VAL_2880X2160_FI NULL -#define OPTION_VAL_3200X2400_FI NULL -#define OPTION_VAL_3840X2880_FI NULL -#define OPTION_VAL_4480X3360_FI NULL -#define OPTION_VAL_5120X3840_FI NULL -#define OPTION_VAL_5760X4320_FI NULL -#define OPTION_VAL_6400X4800_FI NULL -#define OPTION_VAL_7040X5280_FI NULL -#define OPTION_VAL_7680X5760_FI NULL -#define OPTION_VAL_8320X6240_FI NULL -#define OPTION_VAL_8960X6720_FI NULL -#define OPTION_VAL_9600X7200_FI NULL -#define OPTION_VAL_10240X7680_FI NULL -#define OPTION_VAL_10880X8160_FI NULL -#define OPTION_VAL_11520X8640_FI NULL -#define OPTION_VAL_12160X9120_FI NULL -#define OPTION_VAL_12800X9600_FI NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FI "Kaapelin tyyppi" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FI NULL -#define OPTION_VAL_VGA_FI NULL -#define OPTION_VAL_TV_RGB_FI NULL -#define OPTION_VAL_TV_COMPOSITE_FI NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_FI NULL -#define OPTION_VAL_NTSC_FI NULL -#define OPTION_VAL_PAL_FI NULL -#define OPTION_VAL_PAL_N_FI "PAL-N (Argentiina, Paraguay, Uruguay)" -#define OPTION_VAL_PAL_M_FI "PAL-M (Brasilia)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FI "Näytön suunta" -#define OPTION_VAL_HORIZONTAL_FI NULL -#define OPTION_VAL_VERTICAL_FI NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FI NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FI NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_FI NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_FI NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FI NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FI NULL -#define OPTION_VAL_512MB_FI "512 Mt" -#define OPTION_VAL_1GB_FI "1 Gt" -#define OPTION_VAL_2GB_FI "2 Gt" -#define OPTION_VAL_4GB_FI "4 Gt" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FI NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FI NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FI NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FI NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FI NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FI NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FI NULL -#define CORE_OPTION_NAME_FOG_LABEL_FI "Sumutehosteet" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FI NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FI NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FI "Anisotrooppinen suodatus" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FI NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FI "Tekstuurisuodatus" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FI NULL -#define OPTION_VAL_1_FI NULL -#define OPTION_VAL_2_FI NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FI NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FI NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FI NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FI NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FI "PowerVR2-jälkikäsittelysuodatin" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FI NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FI "Tekstuurin yliskaalaus (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FI NULL -#define OPTION_VAL_2_O27_FI NULL -#define OPTION_VAL_4_FI NULL -#define OPTION_VAL_6_FI NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FI NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FI NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FI NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FI "Säikeistetty renderöinti" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FI NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FI NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FI NULL -#define OPTION_VAL_SOME_FI "Normaali" -#define OPTION_VAL_MORE_FI NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FI NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FI NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FI NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FI NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FI NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FI NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FI NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FI NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FI "SH4-suorittimen ali-/ylikellotus" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FI NULL -#define OPTION_VAL_100_FI NULL -#define OPTION_VAL_110_FI NULL -#define OPTION_VAL_120_FI NULL -#define OPTION_VAL_130_FI NULL -#define OPTION_VAL_140_FI NULL -#define OPTION_VAL_150_FI NULL -#define OPTION_VAL_160_FI NULL -#define OPTION_VAL_170_FI NULL -#define OPTION_VAL_180_FI NULL -#define OPTION_VAL_190_FI NULL -#define OPTION_VAL_200_FI NULL -#define OPTION_VAL_210_FI NULL -#define OPTION_VAL_220_FI NULL -#define OPTION_VAL_230_FI NULL -#define OPTION_VAL_240_FI NULL -#define OPTION_VAL_250_FI NULL -#define OPTION_VAL_260_FI NULL -#define OPTION_VAL_270_FI NULL -#define OPTION_VAL_280_FI NULL -#define OPTION_VAL_290_FI NULL -#define OPTION_VAL_300_FI NULL -#define OPTION_VAL_310_FI NULL -#define OPTION_VAL_320_FI NULL -#define OPTION_VAL_330_FI NULL -#define OPTION_VAL_340_FI NULL -#define OPTION_VAL_350_FI NULL -#define OPTION_VAL_360_FI NULL -#define OPTION_VAL_370_FI NULL -#define OPTION_VAL_380_FI NULL -#define OPTION_VAL_390_FI NULL -#define OPTION_VAL_400_FI NULL -#define OPTION_VAL_410_FI NULL -#define OPTION_VAL_420_FI NULL -#define OPTION_VAL_430_FI NULL -#define OPTION_VAL_440_FI NULL -#define OPTION_VAL_450_FI NULL -#define OPTION_VAL_460_FI NULL -#define OPTION_VAL_470_FI NULL -#define OPTION_VAL_480_FI NULL -#define OPTION_VAL_490_FI NULL -#define OPTION_VAL_500_FI NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FI NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FI NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FI NULL -#define OPTION_VAL_0_FI "0 %" -#define OPTION_VAL_5_FI "5 %" -#define OPTION_VAL_10_FI "10 %" -#define OPTION_VAL_15_FI "15 %" -#define OPTION_VAL_20_FI "20 %" -#define OPTION_VAL_25_FI "25 %" -#define OPTION_VAL_30_FI "30 %" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FI NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FI NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FI NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FI NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FI NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FI NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FI "Näytä valoaseen asetukset" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FI NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FI NULL -#define OPTION_VAL_WHITE_FI "Valkoinen" -#define OPTION_VAL_RED_FI "Punainen" -#define OPTION_VAL_GREEN_FI "Vihreä" -#define OPTION_VAL_BLUE_FI "Sininen" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FI NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FI NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FI NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FI NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FI NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FI NULL -#define OPTION_VAL_VMU_A1_FI NULL -#define OPTION_VAL_ALL_VMUS_FI NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FI "VMU-äänet" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FI "Kun käytössä, VMU-piippaukset toistetaan." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FI NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FI NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FI NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FI NULL -#define OPTION_VAL_UPPER_LEFT_FI "Ylävasen" -#define OPTION_VAL_UPPER_RIGHT_FI "Yläoikea" -#define OPTION_VAL_LOWER_LEFT_FI "Alavasen" -#define OPTION_VAL_LOWER_RIGHT_FI "Alaoikea" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FI NULL -#define OPTION_VAL_1X_FI NULL -#define OPTION_VAL_3X_FI NULL -#define OPTION_VAL_5X_FI NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FI NULL -#define OPTION_VAL_DEFAULT_ON_00_FI NULL -#define OPTION_VAL_DEFAULT_OFF_01_FI NULL -#define OPTION_VAL_BLACK_02_FI "Musta" -#define OPTION_VAL_LIGHT_BLUE_04_FI "Vaaleansininen" -#define OPTION_VAL_CYAN_06_FI "Syaani" -#define OPTION_VAL_CYAN_BLUE_07_FI "Turkoosi sininen" -#define OPTION_VAL_LIGHT_GREEN_08_FI "Vaaleanvihreä" -#define OPTION_VAL_CYAN_GREEN_09_FI "Syaani vihreä" -#define OPTION_VAL_LIGHT_CYAN_10_FI NULL -#define OPTION_VAL_PURPLE_12_FI "Violetti" -#define OPTION_VAL_LIGHT_PURPLE_13_FI NULL -#define OPTION_VAL_YELLOW_14_FI "Keltainen" -#define OPTION_VAL_GRAY_15_FI "Harmaa" -#define OPTION_VAL_LIGHT_PURPLE_2_16_FI NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_FI NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_FI NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_FI NULL -#define OPTION_VAL_LIGHT_RED_2_20_FI NULL -#define OPTION_VAL_MAGENTA_21_FI NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_FI NULL -#define OPTION_VAL_LIGHT_ORANGE_23_FI NULL -#define OPTION_VAL_ORANGE_24_FI "Oranssi" -#define OPTION_VAL_LIGHT_PURPLE_4_25_FI NULL -#define OPTION_VAL_LIGHT_YELLOW_26_FI NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_FI NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FI NULL -#define OPTION_VAL_40_FI "40 %" -#define OPTION_VAL_50_FI "50 %" -#define OPTION_VAL_60_FI "60 %" -#define OPTION_VAL_70_FI "70 %" -#define OPTION_VAL_80_FI "80 %" -#define OPTION_VAL_90_FI "90 %" -#define OPTION_VAL_100_O57_FI "100 %" -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FI NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FI NULL - -struct retro_core_option_v2_category option_cats_fi[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_FI, - CATEGORY_SYSTEM_INFO_0_FI - }, - { - "video", - CATEGORY_VIDEO_LABEL_FI, - CATEGORY_VIDEO_INFO_0_FI - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_FI, - CATEGORY_PERFORMANCE_INFO_0_FI - }, - { - "hacks", - CATEGORY_HACKS_LABEL_FI, - CATEGORY_HACKS_INFO_0_FI - }, { - "input", - CATEGORY_INPUT_LABEL_FI, - CATEGORY_INPUT_INFO_0_FI - }, - { - "vmu", - CATEGORY_VMU_LABEL_FI, - CATEGORY_VMU_INFO_0_FI - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_fi[] = { - { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_FI, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ES, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_FI }, - { "USA", OPTION_VAL_USA_FI }, - { "Europe", OPTION_VAL_EUROPE_FI }, - { "Default", OPTION_VAL_DEFAULT_FI }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_FI, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_FI, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_FI }, - { "English", OPTION_VAL_ENGLISH_FI }, - { "German", OPTION_VAL_GERMAN_FI }, - { "French", OPTION_VAL_FRENCH_FI }, - { "Spanish", OPTION_VAL_SPANISH_FI }, - { "Italian", OPTION_VAL_ITALIAN_FI }, - { "Default", OPTION_VAL_DEFAULT_FI }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_FI, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_FI, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FI, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FI, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_FI, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FI, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_FI, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ES, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FI, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ES }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ES }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ES }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ES }, { NULL, NULL }, }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FI, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ES, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FI, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_ES }, + { "2x", OPTION_VAL_2_O26_ES }, + { "3x", OPTION_VAL_3X_ES }, + { "4x", OPTION_VAL_4_ES }, + { "5x", OPTION_VAL_5X_ES }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FI, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ES, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FI, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, - "enabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_FI, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ES, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FI, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ES }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ES }, + { "BLACK 02", OPTION_VAL_BLACK_02_ES }, + { "BLUE 03", OPTION_VAL_BLUE_ES }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ES }, + { "GREEN 05", OPTION_VAL_GREEN_ES }, + { "CYAN 06", OPTION_VAL_CYAN_06_ES }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ES }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ES }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ES }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ES }, + { "RED 11", OPTION_VAL_RED_ES }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ES }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ES }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ES }, + { "GRAY 15", OPTION_VAL_GRAY_15_ES }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ES }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ES }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ES }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ES }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ES }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ES }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ES }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ES }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ES }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ES }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ES }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ES }, + { "WHITE 28", OPTION_VAL_WHITE_ES }, { NULL, NULL }, }, - "disabled", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_FI, + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ES, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_FI, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_ES }, + { "20%", OPTION_VAL_20_ES }, + { "30%", OPTION_VAL_30_ES }, + { "40%", OPTION_VAL_40_ES }, + { "50%", OPTION_VAL_50_ES }, + { "60%", OPTION_VAL_60_ES }, + { "70%", OPTION_VAL_70_ES }, + { "80%", OPTION_VAL_80_ES }, + { "90%", OPTION_VAL_90_ES }, + { "100%", OPTION_VAL_100_O45_ES }, + { NULL, NULL }, }, - "enabled", + "100%", }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_es = { + option_cats_es, + option_defs_es +}; - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FI, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FI, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_FI }, - { "640x480", OPTION_VAL_640X480_FI }, - { "800x600", OPTION_VAL_800X600_FI }, - { "960x720", OPTION_VAL_960X720_FI }, - { "1024x768", OPTION_VAL_1024X768_FI }, - { "1280x960", OPTION_VAL_1280X960_FI }, - { "1440x1080", OPTION_VAL_1440X1080_FI }, - { "1600x1200", OPTION_VAL_1600X1200_FI }, - { "1920x1440", OPTION_VAL_1920X1440_FI }, - { "2560x1920", OPTION_VAL_2560X1920_FI }, - { "2880x2160", OPTION_VAL_2880X2160_FI }, - { "3200x2400", OPTION_VAL_3200X2400_FI }, - { "3840x2880", OPTION_VAL_3840X2880_FI }, - { "4480x3360", OPTION_VAL_4480X3360_FI }, - { "5120x3840", OPTION_VAL_5120X3840_FI }, - { "5760x4320", OPTION_VAL_5760X4320_FI }, - { "6400x4800", OPTION_VAL_6400X4800_FI }, - { "7040x5280", OPTION_VAL_7040X5280_FI }, - { "7680x5760", OPTION_VAL_7680X5760_FI }, - { "8320x6240", OPTION_VAL_8320X6240_FI }, - { "8960x6720", OPTION_VAL_8960X6720_FI }, - { "9600x7200", OPTION_VAL_9600X7200_FI }, - { "10240x7680", OPTION_VAL_10240X7680_FI }, - { "10880x8160", OPTION_VAL_10880X8160_FI }, - { "11520x8640", OPTION_VAL_11520X8640_FI }, - { "12160x9120", OPTION_VAL_12160X9120_FI }, - { "12800x9600", OPTION_VAL_12800X9600_FI }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif +/* RETRO_LANGUAGE_FA */ + +#define CATEGORY_SYSTEM_LABEL_FA "سیستم" +#define CATEGORY_SYSTEM_INFO_0_FA NULL +#define CATEGORY_VIDEO_LABEL_FA "ویدیو" +#define CATEGORY_VIDEO_INFO_0_FA NULL +#define CATEGORY_PERFORMANCE_LABEL_FA "عملکرد" +#define CATEGORY_PERFORMANCE_INFO_0_FA NULL +#define CATEGORY_HACKS_LABEL_FA NULL +#define CATEGORY_HACKS_INFO_0_FA NULL +#define CATEGORY_INPUT_LABEL_FA "داده" +#define CATEGORY_INPUT_INFO_0_FA NULL +#define CATEGORY_EXPANSIONS_LABEL_FA NULL +#define CATEGORY_EXPANSIONS_INFO_0_FA NULL +#define CATEGORY_VMU_LABEL_FA NULL +#define CATEGORY_VMU_INFO_0_FA NULL +#define CORE_OPTION_NAME_REGION_LABEL_FA "منطقه" +#define OPTION_VAL_JAPAN_FA "ژاپن" +#define OPTION_VAL_USA_FA "ایالات متحده آمریکا" +#define OPTION_VAL_EUROPE_FA "اروپا" +#define OPTION_VAL_DEFAULT_FA "پیش‌فرض" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_FA "زبان" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FA NULL +#define OPTION_VAL_JAPANESE_FA "ژاپنی" +#define OPTION_VAL_ENGLISH_FA "انگلیسی" +#define OPTION_VAL_GERMAN_FA "آلمانی" +#define OPTION_VAL_FRENCH_FA "فرانسوی" +#define OPTION_VAL_SPANISH_FA "اسپانیایی" +#define OPTION_VAL_ITALIAN_FA "ایتالیایی" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FA NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FA NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FA NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FA NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FA NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FA NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FA NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FA NULL +#define CORE_OPTION_NAME_UPNP_LABEL_FA NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_FA NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FA NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FA NULL +#define OPTION_VAL_320X240_FA NULL +#define OPTION_VAL_640X480_FA NULL +#define OPTION_VAL_800X600_FA NULL +#define OPTION_VAL_960X720_FA NULL +#define OPTION_VAL_1024X768_FA NULL +#define OPTION_VAL_1280X960_FA NULL +#define OPTION_VAL_1440X1080_FA NULL +#define OPTION_VAL_1600X1200_FA NULL +#define OPTION_VAL_1920X1440_FA NULL +#define OPTION_VAL_2560X1920_FA NULL +#define OPTION_VAL_2880X2160_FA NULL +#define OPTION_VAL_3200X2400_FA NULL +#define OPTION_VAL_3840X2880_FA NULL +#define OPTION_VAL_4480X3360_FA NULL +#define OPTION_VAL_5120X3840_FA NULL +#define OPTION_VAL_5760X4320_FA NULL +#define OPTION_VAL_6400X4800_FA NULL +#define OPTION_VAL_7040X5280_FA NULL +#define OPTION_VAL_7680X5760_FA NULL +#define OPTION_VAL_8320X6240_FA NULL +#define OPTION_VAL_8960X6720_FA NULL +#define OPTION_VAL_9600X7200_FA NULL +#define OPTION_VAL_10240X7680_FA NULL +#define OPTION_VAL_10880X8160_FA NULL +#define OPTION_VAL_11520X8640_FA NULL +#define OPTION_VAL_12160X9120_FA NULL +#define OPTION_VAL_12800X9600_FA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FA NULL +#define OPTION_VAL_VGA_FA NULL +#define OPTION_VAL_TV_RGB_FA NULL +#define OPTION_VAL_TV_COMPOSITE_FA NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_FA NULL +#define OPTION_VAL_NTSC_FA NULL +#define OPTION_VAL_PAL_FA NULL +#define OPTION_VAL_PAL_N_FA NULL +#define OPTION_VAL_PAL_M_FA NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FA "جهت صفحه نمایش" +#define OPTION_VAL_HORIZONTAL_FA NULL +#define OPTION_VAL_VERTICAL_FA NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FA NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FA NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FA NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_FA NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_FA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FA NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FA NULL +#define OPTION_VAL_512MB_FA NULL +#define OPTION_VAL_1GB_FA NULL +#define OPTION_VAL_2GB_FA NULL +#define OPTION_VAL_4GB_FA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FA NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FA NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FA NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FA NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_FA NULL +#define CORE_OPTION_NAME_FOG_LABEL_FA NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FA NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FA NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FA NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FA NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FA NULL +#define OPTION_VAL_1_FA NULL +#define OPTION_VAL_2_FA NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FA NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FA NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FA NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FA NULL +#define OPTION_VAL_2_O26_FA NULL +#define OPTION_VAL_4_FA NULL +#define OPTION_VAL_6_FA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FA NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FA NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FA NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FA NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FA NULL +#define OPTION_VAL_SOME_FA NULL +#define OPTION_VAL_MORE_FA NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FA NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FA NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FA NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FA NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FA NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FA NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FA NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FA NULL +#define OPTION_VAL_100_FA NULL +#define OPTION_VAL_110_FA NULL +#define OPTION_VAL_120_FA NULL +#define OPTION_VAL_130_FA NULL +#define OPTION_VAL_140_FA NULL +#define OPTION_VAL_150_FA NULL +#define OPTION_VAL_160_FA NULL +#define OPTION_VAL_170_FA NULL +#define OPTION_VAL_180_FA NULL +#define OPTION_VAL_190_FA NULL +#define OPTION_VAL_200_FA NULL +#define OPTION_VAL_210_FA NULL +#define OPTION_VAL_220_FA NULL +#define OPTION_VAL_230_FA NULL +#define OPTION_VAL_240_FA NULL +#define OPTION_VAL_250_FA NULL +#define OPTION_VAL_260_FA NULL +#define OPTION_VAL_270_FA NULL +#define OPTION_VAL_280_FA NULL +#define OPTION_VAL_290_FA NULL +#define OPTION_VAL_300_FA NULL +#define OPTION_VAL_310_FA NULL +#define OPTION_VAL_320_FA NULL +#define OPTION_VAL_330_FA NULL +#define OPTION_VAL_340_FA NULL +#define OPTION_VAL_350_FA NULL +#define OPTION_VAL_360_FA NULL +#define OPTION_VAL_370_FA NULL +#define OPTION_VAL_380_FA NULL +#define OPTION_VAL_390_FA NULL +#define OPTION_VAL_400_FA NULL +#define OPTION_VAL_410_FA NULL +#define OPTION_VAL_420_FA NULL +#define OPTION_VAL_430_FA NULL +#define OPTION_VAL_440_FA NULL +#define OPTION_VAL_450_FA NULL +#define OPTION_VAL_460_FA NULL +#define OPTION_VAL_470_FA NULL +#define OPTION_VAL_480_FA NULL +#define OPTION_VAL_490_FA NULL +#define OPTION_VAL_500_FA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FA NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FA NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FA NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FA NULL +#define OPTION_VAL_0_FA NULL +#define OPTION_VAL_5_FA NULL +#define OPTION_VAL_10_FA NULL +#define OPTION_VAL_15_FA NULL +#define OPTION_VAL_20_FA NULL +#define OPTION_VAL_25_FA NULL +#define OPTION_VAL_30_FA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FA NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FA NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FA NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FA NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FA NULL +#define OPTION_VAL_50_FA NULL +#define OPTION_VAL_60_FA NULL +#define OPTION_VAL_70_FA NULL +#define OPTION_VAL_80_FA NULL +#define OPTION_VAL_90_FA NULL +#define OPTION_VAL_100_O45_FA NULL +#define OPTION_VAL_110_O45_FA NULL +#define OPTION_VAL_120_O45_FA NULL +#define OPTION_VAL_130_O45_FA NULL +#define OPTION_VAL_140_O45_FA NULL +#define OPTION_VAL_150_O45_FA NULL +#define OPTION_VAL_160_O45_FA NULL +#define OPTION_VAL_170_O45_FA NULL +#define OPTION_VAL_180_O45_FA NULL +#define OPTION_VAL_190_O45_FA NULL +#define OPTION_VAL_200_O45_FA NULL +#define OPTION_VAL_210_O45_FA NULL +#define OPTION_VAL_220_O45_FA NULL +#define OPTION_VAL_230_O45_FA NULL +#define OPTION_VAL_240_O45_FA NULL +#define OPTION_VAL_250_O45_FA NULL +#define OPTION_VAL_260_O45_FA NULL +#define OPTION_VAL_270_O45_FA NULL +#define OPTION_VAL_280_O45_FA NULL +#define OPTION_VAL_290_O45_FA NULL +#define OPTION_VAL_300_O45_FA NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FA NULL +#define OPTION_VAL_WHITE_FA NULL +#define OPTION_VAL_RED_FA NULL +#define OPTION_VAL_GREEN_FA NULL +#define OPTION_VAL_BLUE_FA NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FA NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FA NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FA NULL +#define OPTION_VAL_VMU_FA NULL +#define OPTION_VAL_PURUPURU_FA NULL +#define OPTION_VAL_NONE_FA "هیچکدام" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FA NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FA NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FA NULL +#define OPTION_VAL_VMU_A1_FA NULL +#define OPTION_VAL_ALL_VMUS_FA NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FA NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FA NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FA NULL +#define OPTION_VAL_UPPER_LEFT_FA NULL +#define OPTION_VAL_UPPER_RIGHT_FA NULL +#define OPTION_VAL_LOWER_LEFT_FA NULL +#define OPTION_VAL_LOWER_RIGHT_FA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FA NULL +#define OPTION_VAL_1X_FA NULL +#define OPTION_VAL_3X_FA NULL +#define OPTION_VAL_5X_FA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FA NULL +#define OPTION_VAL_DEFAULT_ON_00_FA NULL +#define OPTION_VAL_DEFAULT_OFF_01_FA NULL +#define OPTION_VAL_BLACK_02_FA NULL +#define OPTION_VAL_LIGHT_BLUE_04_FA NULL +#define OPTION_VAL_CYAN_06_FA NULL +#define OPTION_VAL_CYAN_BLUE_07_FA NULL +#define OPTION_VAL_LIGHT_GREEN_08_FA NULL +#define OPTION_VAL_CYAN_GREEN_09_FA NULL +#define OPTION_VAL_LIGHT_CYAN_10_FA NULL +#define OPTION_VAL_PURPLE_12_FA NULL +#define OPTION_VAL_LIGHT_PURPLE_13_FA NULL +#define OPTION_VAL_YELLOW_14_FA NULL +#define OPTION_VAL_GRAY_15_FA NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_FA NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_FA NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_FA NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_FA NULL +#define OPTION_VAL_LIGHT_RED_2_20_FA NULL +#define OPTION_VAL_MAGENTA_21_FA NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_FA NULL +#define OPTION_VAL_LIGHT_ORANGE_23_FA NULL +#define OPTION_VAL_ORANGE_24_FA NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_FA NULL +#define OPTION_VAL_LIGHT_YELLOW_26_FA NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_FA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FA NULL +#define OPTION_VAL_40_FA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FA NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FA NULL + +struct retro_core_option_v2_category option_cats_fa[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FA, + CATEGORY_SYSTEM_INFO_0_FA }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_FI, - NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FI, - NULL, "video", - { - { "VGA", OPTION_VAL_VGA_FI }, - { "TV (RGB)", OPTION_VAL_TV_RGB_FI }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FI }, - { NULL, NULL }, - }, - "TV (Composite)", + CATEGORY_VIDEO_LABEL_FA, + CATEGORY_VIDEO_INFO_0_FA }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_FI, - NULL, - "", - NULL, - "video", - { - { "NTSC", OPTION_VAL_NTSC_FI }, - { "PAL", OPTION_VAL_PAL_FI }, - { "PAL_N", OPTION_VAL_PAL_N_FI }, - { "PAL_M", OPTION_VAL_PAL_M_FI }, - { "Default", OPTION_VAL_DEFAULT_FI }, - { NULL, NULL }, - }, - "NTSC", + "performance", + CATEGORY_PERFORMANCE_LABEL_FA, + CATEGORY_PERFORMANCE_INFO_0_FA }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FI, - NULL, - "", - NULL, - "video", - { - { "horizontal", OPTION_VAL_HORIZONTAL_FI }, - { "vertical", OPTION_VAL_VERTICAL_FI }, - { NULL, NULL }, - }, - "horizontal", + "hacks", + CATEGORY_HACKS_LABEL_FA, + CATEGORY_HACKS_INFO_0_FA }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FI, - NULL, - "", - NULL, - "video", - { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FI }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FI }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FI }, -#endif - { NULL, NULL }, - }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + { + "input", + CATEGORY_INPUT_LABEL_FA, + CATEGORY_INPUT_INFO_0_FA }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FI, + "expansions", + CATEGORY_EXPANSIONS_LABEL_FA, + CATEGORY_EXPANSIONS_INFO_0_FA + }, + { + "vmu", + CATEGORY_VMU_LABEL_FA, + CATEGORY_VMU_INFO_0_FA + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fa[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_FA, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FI, + "", NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_FI }, - { "1GB", OPTION_VAL_1GB_FI }, - { "2GB", OPTION_VAL_2GB_FI }, - { "4GB", OPTION_VAL_4GB_FI }, + { "Japan", OPTION_VAL_JAPAN_FA }, + { "USA", OPTION_VAL_USA_FA }, + { "Europe", OPTION_VAL_EUROPE_FA }, + { "Default", OPTION_VAL_DEFAULT_FA }, { NULL, NULL }, }, - "512MB", + "USA", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_FI, + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_FA, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FI, + CORE_OPTION_NAME_LANGUAGE_INFO_0_FA, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "Japanese", OPTION_VAL_JAPANESE_FA }, + { "English", OPTION_VAL_ENGLISH_FA }, + { "German", OPTION_VAL_GERMAN_FA }, + { "French", OPTION_VAL_FRENCH_FA }, + { "Spanish", OPTION_VAL_SPANISH_FA }, + { "Italian", OPTION_VAL_ITALIAN_FA }, + { "Default", OPTION_VAL_DEFAULT_FA }, { NULL, NULL }, }, - "32", + "English", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FI, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_FA, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FI, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_FA, NULL, - "video", + "system", { - { "disabled", NULL }, + { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { NULL, NULL}, }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FI, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FA, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FI, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -27682,41 +30685,45 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_FI, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END + "disabled", +#else "enabled", +#endif }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_FI, + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FI, + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FA, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FI, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -27725,70 +30732,315 @@ struct retro_core_option_v2_definition option_defs_fi[] = { "enabled", }, { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FI, - NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FI, - NULL, - "video", - { - { "off", "disabled" }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, - { NULL, NULL }, - }, - "4", - }, - { - CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FI, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_FA, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FI, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FA, NULL, - "video", + "system", { - { "0", OPTION_VAL_DEFAULT_FI }, - { "1", OPTION_VAL_1_FI }, - { "2", OPTION_VAL_2_FI }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "0", + "disabled", }, { - CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FI, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_FA, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FI, + CORE_OPTION_NAME_UPNP_INFO_0_FA, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, + { - CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FI, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FA, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FI, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FA, NULL, "video", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "320x240", OPTION_VAL_320X240_FA }, + { "640x480", OPTION_VAL_640X480_FA }, + { "800x600", OPTION_VAL_800X600_FA }, + { "960x720", OPTION_VAL_960X720_FA }, + { "1024x768", OPTION_VAL_1024X768_FA }, + { "1280x960", OPTION_VAL_1280X960_FA }, + { "1440x1080", OPTION_VAL_1440X1080_FA }, + { "1600x1200", OPTION_VAL_1600X1200_FA }, + { "1920x1440", OPTION_VAL_1920X1440_FA }, + { "2560x1920", OPTION_VAL_2560X1920_FA }, + { "2880x2160", OPTION_VAL_2880X2160_FA }, + { "3200x2400", OPTION_VAL_3200X2400_FA }, + { "3840x2880", OPTION_VAL_3840X2880_FA }, + { "4480x3360", OPTION_VAL_4480X3360_FA }, + { "5120x3840", OPTION_VAL_5120X3840_FA }, + { "5760x4320", OPTION_VAL_5760X4320_FA }, + { "6400x4800", OPTION_VAL_6400X4800_FA }, + { "7040x5280", OPTION_VAL_7040X5280_FA }, + { "7680x5760", OPTION_VAL_7680X5760_FA }, + { "8320x6240", OPTION_VAL_8320X6240_FA }, + { "8960x6720", OPTION_VAL_8960X6720_FA }, + { "9600x7200", OPTION_VAL_9600X7200_FA }, + { "10240x7680", OPTION_VAL_10240X7680_FA }, + { "10880x8160", OPTION_VAL_10880X8160_FA }, + { "11520x8640", OPTION_VAL_11520X8640_FA }, + { "12160x9120", OPTION_VAL_12160X9120_FA }, + { "12800x9600", OPTION_VAL_12800X9600_FA }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_FA, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FA, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_FA }, + { "TV (RGB)", OPTION_VAL_TV_RGB_FA }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FA }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_FA, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_FA }, + { "PAL", OPTION_VAL_PAL_FA }, + { "PAL_N", OPTION_VAL_PAL_N_FA }, + { "PAL_M", OPTION_VAL_PAL_M_FA }, + { "Default", OPTION_VAL_DEFAULT_FA }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FA, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_FA }, + { "vertical", OPTION_VAL_VERTICAL_FA }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FA, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FA, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FA }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FA }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FA }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FA, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FA, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_FA }, + { "1GB", OPTION_VAL_1GB_FA }, + { "2GB", OPTION_VAL_2GB_FA }, + { "4GB", OPTION_VAL_4GB_FA }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_FA, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FA, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FA, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FA, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_FA, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_FA, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FA, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FA, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FA, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FA, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FA, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_FA }, + { "1", OPTION_VAL_1_FA }, + { "2", OPTION_VAL_2_FA }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FA, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_detect_vsync_swap_interval", + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FA, + NULL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FI, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FA, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FI, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FA, NULL, "video", { @@ -27801,25 +31053,25 @@ struct retro_core_option_v2_definition option_defs_fi[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_FI, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_FA, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FI, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FA, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_FI }, - { "4", OPTION_VAL_4_FI }, - { "6", OPTION_VAL_6_FI }, + { "2", OPTION_VAL_2_O26_FA }, + { "4", OPTION_VAL_4_FA }, + { "6", OPTION_VAL_6_FA }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FI, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FA, NULL, "video", { @@ -27833,9 +31085,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FI, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FA, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FI, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FA, NULL, "video", { @@ -27845,11 +31097,25 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FA, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FI, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FA, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FI, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FA, NULL, "performance", { @@ -27861,15 +31127,15 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FI, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FA, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FI, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FA, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_FI }, - { "more", OPTION_VAL_MORE_FI }, + { "some", OPTION_VAL_SOME_FA }, + { "more", OPTION_VAL_MORE_FA }, { NULL, NULL }, }, #ifdef LOW_END @@ -27880,9 +31146,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FI, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FA, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FI, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FA, NULL, "performance", { @@ -27899,9 +31165,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FI, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FA, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FI, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FA, NULL, "hacks", { @@ -27913,9 +31179,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FI, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FA, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FI, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FA, NULL, "hacks", { @@ -27927,9 +31193,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FI, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FA, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FI, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FA, NULL, "hacks", { @@ -27943,64 +31209,78 @@ struct retro_core_option_v2_definition option_defs_fi[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FA, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FA, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_FI, + CORE_OPTION_NAME_SH4CLOCK_LABEL_FA, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_FI, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_FA, NULL, "hacks", { - { "100", OPTION_VAL_100_FI }, - { "110", OPTION_VAL_110_FI }, - { "120", OPTION_VAL_120_FI }, - { "130", OPTION_VAL_130_FI }, - { "140", OPTION_VAL_140_FI }, - { "150", OPTION_VAL_150_FI }, - { "160", OPTION_VAL_160_FI }, - { "170", OPTION_VAL_170_FI }, - { "180", OPTION_VAL_180_FI }, - { "190", OPTION_VAL_190_FI }, - { "200", OPTION_VAL_200_FI }, - { "210", OPTION_VAL_210_FI }, - { "220", OPTION_VAL_220_FI }, - { "230", OPTION_VAL_230_FI }, - { "240", OPTION_VAL_240_FI }, - { "250", OPTION_VAL_250_FI }, - { "260", OPTION_VAL_260_FI }, - { "270", OPTION_VAL_270_FI }, - { "280", OPTION_VAL_280_FI }, - { "290", OPTION_VAL_290_FI }, - { "300", OPTION_VAL_300_FI }, - { "310", OPTION_VAL_310_FI }, - { "320", OPTION_VAL_320_FI }, - { "330", OPTION_VAL_330_FI }, - { "340", OPTION_VAL_340_FI }, - { "350", OPTION_VAL_350_FI }, - { "360", OPTION_VAL_360_FI }, - { "370", OPTION_VAL_370_FI }, - { "380", OPTION_VAL_380_FI }, - { "390", OPTION_VAL_390_FI }, - { "400", OPTION_VAL_400_FI }, - { "410", OPTION_VAL_410_FI }, - { "420", OPTION_VAL_420_FI }, - { "430", OPTION_VAL_430_FI }, - { "440", OPTION_VAL_440_FI }, - { "450", OPTION_VAL_450_FI }, - { "460", OPTION_VAL_460_FI }, - { "470", OPTION_VAL_470_FI }, - { "480", OPTION_VAL_480_FI }, - { "490", OPTION_VAL_490_FI }, - { "500", OPTION_VAL_500_FI }, + { "100", OPTION_VAL_100_FA }, + { "110", OPTION_VAL_110_FA }, + { "120", OPTION_VAL_120_FA }, + { "130", OPTION_VAL_130_FA }, + { "140", OPTION_VAL_140_FA }, + { "150", OPTION_VAL_150_FA }, + { "160", OPTION_VAL_160_FA }, + { "170", OPTION_VAL_170_FA }, + { "180", OPTION_VAL_180_FA }, + { "190", OPTION_VAL_190_FA }, + { "200", OPTION_VAL_200_FA }, + { "210", OPTION_VAL_210_FA }, + { "220", OPTION_VAL_220_FA }, + { "230", OPTION_VAL_230_FA }, + { "240", OPTION_VAL_240_FA }, + { "250", OPTION_VAL_250_FA }, + { "260", OPTION_VAL_260_FA }, + { "270", OPTION_VAL_270_FA }, + { "280", OPTION_VAL_280_FA }, + { "290", OPTION_VAL_290_FA }, + { "300", OPTION_VAL_300_FA }, + { "310", OPTION_VAL_310_FA }, + { "320", OPTION_VAL_320_FA }, + { "330", OPTION_VAL_330_FA }, + { "340", OPTION_VAL_340_FA }, + { "350", OPTION_VAL_350_FA }, + { "360", OPTION_VAL_360_FA }, + { "370", OPTION_VAL_370_FA }, + { "380", OPTION_VAL_380_FA }, + { "390", OPTION_VAL_390_FA }, + { "400", OPTION_VAL_400_FA }, + { "410", OPTION_VAL_410_FA }, + { "420", OPTION_VAL_420_FA }, + { "430", OPTION_VAL_430_FA }, + { "440", OPTION_VAL_440_FA }, + { "450", OPTION_VAL_450_FA }, + { "460", OPTION_VAL_460_FA }, + { "470", OPTION_VAL_470_FA }, + { "480", OPTION_VAL_480_FA }, + { "490", OPTION_VAL_490_FA }, + { "500", OPTION_VAL_500_FA }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FI, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FA, NULL, "hacks", { @@ -28010,11 +31290,11 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FI, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FA, NULL, "hacks", { @@ -28026,47 +31306,47 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FI, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FA, NULL, "input", { - { "0%", OPTION_VAL_0_FI }, - { "5%", OPTION_VAL_5_FI }, - { "10%", OPTION_VAL_10_FI }, - { "15%", OPTION_VAL_15_FI }, - { "20%", OPTION_VAL_20_FI }, - { "25%", OPTION_VAL_25_FI }, - { "30%", OPTION_VAL_30_FI }, + { "0%", OPTION_VAL_0_FA }, + { "5%", OPTION_VAL_5_FA }, + { "10%", OPTION_VAL_10_FA }, + { "15%", OPTION_VAL_15_FA }, + { "20%", OPTION_VAL_20_FA }, + { "25%", OPTION_VAL_25_FA }, + { "30%", OPTION_VAL_30_FA }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FI, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FA, NULL, "input", { - { "0%", OPTION_VAL_0_FI }, - { "5%", OPTION_VAL_5_FI }, - { "10%", OPTION_VAL_10_FI }, - { "15%", OPTION_VAL_15_FI }, - { "20%", OPTION_VAL_20_FI }, - { "25%", OPTION_VAL_25_FI }, - { "30%", OPTION_VAL_30_FI }, + { "0%", OPTION_VAL_0_FA }, + { "5%", OPTION_VAL_5_FA }, + { "10%", OPTION_VAL_10_FA }, + { "15%", OPTION_VAL_15_FA }, + { "20%", OPTION_VAL_20_FA }, + { "25%", OPTION_VAL_25_FA }, + { "30%", OPTION_VAL_30_FA }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FI, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FA, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FA, NULL, "input", { @@ -28077,10 +31357,10 @@ struct retro_core_option_v2_definition option_defs_fi[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FI, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FA, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FI, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FA, NULL, "input", { @@ -28088,124 +31368,268 @@ struct retro_core_option_v2_definition option_defs_fi[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FI, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FA, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FI, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FA, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FI, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FA, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FI, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_FA }, + { "60%", OPTION_VAL_60_FA }, + { "70%", OPTION_VAL_70_FA }, + { "80%", OPTION_VAL_80_FA }, + { "90%", OPTION_VAL_90_FA }, + { "100%", OPTION_VAL_100_O45_FA }, + { "110%", OPTION_VAL_110_O45_FA }, + { "120%", OPTION_VAL_120_O45_FA }, + { "130%", OPTION_VAL_130_O45_FA }, + { "140%", OPTION_VAL_140_O45_FA }, + { "150%", OPTION_VAL_150_O45_FA }, + { "160%", OPTION_VAL_160_O45_FA }, + { "170%", OPTION_VAL_170_O45_FA }, + { "180%", OPTION_VAL_180_O45_FA }, + { "190%", OPTION_VAL_190_O45_FA }, + { "200%", OPTION_VAL_200_O45_FA }, + { "210%", OPTION_VAL_210_O45_FA }, + { "220%", OPTION_VAL_220_O45_FA }, + { "230%", OPTION_VAL_230_O45_FA }, + { "240%", OPTION_VAL_240_O45_FA }, + { "250%", OPTION_VAL_250_O45_FA }, + { "260%", OPTION_VAL_260_O45_FA }, + { "270%", OPTION_VAL_270_O45_FA }, + { "280%", OPTION_VAL_280_O45_FA }, + { "290%", OPTION_VAL_290_O45_FA }, + { "300%", OPTION_VAL_300_O45_FA }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FI, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FI }, - { "Red", OPTION_VAL_RED_FI }, - { "Green", OPTION_VAL_GREEN_FI }, - { "Blue", OPTION_VAL_BLUE_FI }, + { "White", OPTION_VAL_WHITE_FA }, + { "Red", OPTION_VAL_RED_FA }, + { "Green", OPTION_VAL_GREEN_FA }, + { "Blue", OPTION_VAL_BLUE_FA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FI, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FI }, - { "Red", OPTION_VAL_RED_FI }, - { "Green", OPTION_VAL_GREEN_FI }, - { "Blue", OPTION_VAL_BLUE_FI }, + { "White", OPTION_VAL_WHITE_FA }, + { "Red", OPTION_VAL_RED_FA }, + { "Green", OPTION_VAL_GREEN_FA }, + { "Blue", OPTION_VAL_BLUE_FA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FI, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FI }, - { "Red", OPTION_VAL_RED_FI }, - { "Green", OPTION_VAL_GREEN_FI }, - { "Blue", OPTION_VAL_BLUE_FI }, + { "White", OPTION_VAL_WHITE_FA }, + { "Red", OPTION_VAL_RED_FA }, + { "Green", OPTION_VAL_GREEN_FA }, + { "Blue", OPTION_VAL_BLUE_FA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FI, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FI }, - { "Red", OPTION_VAL_RED_FI }, - { "Green", OPTION_VAL_GREEN_FI }, - { "Blue", OPTION_VAL_BLUE_FI }, + { "White", OPTION_VAL_WHITE_FA }, + { "Red", OPTION_VAL_RED_FA }, + { "Green", OPTION_VAL_GREEN_FA }, + { "Blue", OPTION_VAL_BLUE_FA }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_FA }, + { "Purupuru", OPTION_VAL_PURUPURU_FA }, + { "None", OPTION_VAL_NONE_FA }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FI, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FI, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FI, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FA, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_FI }, - { "All VMUs", OPTION_VAL_ALL_VMUS_FI }, + { "VMU A1", OPTION_VAL_VMU_A1_FA }, + { "All VMUs", OPTION_VAL_ALL_VMUS_FA }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_FI, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FI, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_FI, + CORE_OPTION_NAME_VMU_SOUND_LABEL_FA, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FA, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_FA, NULL, "vmu", { @@ -28216,9 +31640,9 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FI, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FI, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FI, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FA, NULL, "vmu", { @@ -28230,7 +31654,7 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FI, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FA, NULL, "", NULL, @@ -28244,144 +31668,144 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FI, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FI, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FI }, - { "2x", OPTION_VAL_2_O27_FI }, - { "3x", OPTION_VAL_3X_FI }, - { "4x", OPTION_VAL_4_FI }, - { "5x", OPTION_VAL_5X_FI }, + { "1x", OPTION_VAL_1X_FA }, + { "2x", OPTION_VAL_2_O26_FA }, + { "3x", OPTION_VAL_3X_FA }, + { "4x", OPTION_VAL_4_FA }, + { "5x", OPTION_VAL_5X_FA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FI, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FI }, - { "20%", OPTION_VAL_20_FI }, - { "30%", OPTION_VAL_30_FI }, - { "40%", OPTION_VAL_40_FI }, - { "50%", OPTION_VAL_50_FI }, - { "60%", OPTION_VAL_60_FI }, - { "70%", OPTION_VAL_70_FI }, - { "80%", OPTION_VAL_80_FI }, - { "90%", OPTION_VAL_90_FI }, - { "100%", OPTION_VAL_100_O57_FI }, + { "10%", OPTION_VAL_10_FA }, + { "20%", OPTION_VAL_20_FA }, + { "30%", OPTION_VAL_30_FA }, + { "40%", OPTION_VAL_40_FA }, + { "50%", OPTION_VAL_50_FA }, + { "60%", OPTION_VAL_60_FA }, + { "70%", OPTION_VAL_70_FA }, + { "80%", OPTION_VAL_80_FA }, + { "90%", OPTION_VAL_90_FA }, + { "100%", OPTION_VAL_100_O45_FA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FI, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FA, NULL, "", NULL, @@ -28395,144 +31819,144 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FI, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FI, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FI }, - { "2x", OPTION_VAL_2_O27_FI }, - { "3x", OPTION_VAL_3X_FI }, - { "4x", OPTION_VAL_4_FI }, - { "5x", OPTION_VAL_5X_FI }, + { "1x", OPTION_VAL_1X_FA }, + { "2x", OPTION_VAL_2_O26_FA }, + { "3x", OPTION_VAL_3X_FA }, + { "4x", OPTION_VAL_4_FA }, + { "5x", OPTION_VAL_5X_FA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FI, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FI }, - { "20%", OPTION_VAL_20_FI }, - { "30%", OPTION_VAL_30_FI }, - { "40%", OPTION_VAL_40_FI }, - { "50%", OPTION_VAL_50_FI }, - { "60%", OPTION_VAL_60_FI }, - { "70%", OPTION_VAL_70_FI }, - { "80%", OPTION_VAL_80_FI }, - { "90%", OPTION_VAL_90_FI }, - { "100%", OPTION_VAL_100_O57_FI }, + { "10%", OPTION_VAL_10_FA }, + { "20%", OPTION_VAL_20_FA }, + { "30%", OPTION_VAL_30_FA }, + { "40%", OPTION_VAL_40_FA }, + { "50%", OPTION_VAL_50_FA }, + { "60%", OPTION_VAL_60_FA }, + { "70%", OPTION_VAL_70_FA }, + { "80%", OPTION_VAL_80_FA }, + { "90%", OPTION_VAL_90_FA }, + { "100%", OPTION_VAL_100_O45_FA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FI, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FA, NULL, "", NULL, @@ -28546,144 +31970,144 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FI, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FI, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FI }, - { "2x", OPTION_VAL_2_O27_FI }, - { "3x", OPTION_VAL_3X_FI }, - { "4x", OPTION_VAL_4_FI }, - { "5x", OPTION_VAL_5X_FI }, + { "1x", OPTION_VAL_1X_FA }, + { "2x", OPTION_VAL_2_O26_FA }, + { "3x", OPTION_VAL_3X_FA }, + { "4x", OPTION_VAL_4_FA }, + { "5x", OPTION_VAL_5X_FA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FI, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FI }, - { "20%", OPTION_VAL_20_FI }, - { "30%", OPTION_VAL_30_FI }, - { "40%", OPTION_VAL_40_FI }, - { "50%", OPTION_VAL_50_FI }, - { "60%", OPTION_VAL_60_FI }, - { "70%", OPTION_VAL_70_FI }, - { "80%", OPTION_VAL_80_FI }, - { "90%", OPTION_VAL_90_FI }, - { "100%", OPTION_VAL_100_O57_FI }, + { "10%", OPTION_VAL_10_FA }, + { "20%", OPTION_VAL_20_FA }, + { "30%", OPTION_VAL_30_FA }, + { "40%", OPTION_VAL_40_FA }, + { "50%", OPTION_VAL_50_FA }, + { "60%", OPTION_VAL_60_FA }, + { "70%", OPTION_VAL_70_FA }, + { "80%", OPTION_VAL_80_FA }, + { "90%", OPTION_VAL_90_FA }, + { "100%", OPTION_VAL_100_O45_FA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FI, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FA, NULL, "", NULL, @@ -28697,505 +32121,560 @@ struct retro_core_option_v2_definition option_defs_fi[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FI, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FA }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FI, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FI }, - { "2x", OPTION_VAL_2_O27_FI }, - { "3x", OPTION_VAL_3X_FI }, - { "4x", OPTION_VAL_4_FI }, - { "5x", OPTION_VAL_5X_FI }, + { "1x", OPTION_VAL_1X_FA }, + { "2x", OPTION_VAL_2_O26_FA }, + { "3x", OPTION_VAL_3X_FA }, + { "4x", OPTION_VAL_4_FA }, + { "5x", OPTION_VAL_5X_FA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FI, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, - { "BLACK 02", OPTION_VAL_BLACK_02_FI }, - { "BLUE 03", OPTION_VAL_BLUE_FI }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, - { "GREEN 05", OPTION_VAL_GREEN_FI }, - { "CYAN 06", OPTION_VAL_CYAN_06_FI }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, - { "RED 11", OPTION_VAL_RED_FI }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, - { "GRAY 15", OPTION_VAL_GRAY_15_FI }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, - { "WHITE 28", OPTION_VAL_WHITE_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FA }, + { "BLACK 02", OPTION_VAL_BLACK_02_FA }, + { "BLUE 03", OPTION_VAL_BLUE_FA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FA }, + { "GREEN 05", OPTION_VAL_GREEN_FA }, + { "CYAN 06", OPTION_VAL_CYAN_06_FA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FA }, + { "RED 11", OPTION_VAL_RED_FA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FA }, + { "GRAY 15", OPTION_VAL_GRAY_15_FA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FA }, + { "WHITE 28", OPTION_VAL_WHITE_FA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FI, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FI }, - { "20%", OPTION_VAL_20_FI }, - { "30%", OPTION_VAL_30_FI }, - { "40%", OPTION_VAL_40_FI }, - { "50%", OPTION_VAL_50_FI }, - { "60%", OPTION_VAL_60_FI }, - { "70%", OPTION_VAL_70_FI }, - { "80%", OPTION_VAL_80_FI }, - { "90%", OPTION_VAL_90_FI }, - { "100%", OPTION_VAL_100_O57_FI }, + { "10%", OPTION_VAL_10_FA }, + { "20%", OPTION_VAL_20_FA }, + { "30%", OPTION_VAL_30_FA }, + { "40%", OPTION_VAL_40_FA }, + { "50%", OPTION_VAL_50_FA }, + { "60%", OPTION_VAL_60_FA }, + { "70%", OPTION_VAL_70_FA }, + { "80%", OPTION_VAL_80_FA }, + { "90%", OPTION_VAL_90_FA }, + { "100%", OPTION_VAL_100_O45_FA }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_fi = { - option_cats_fi, - option_defs_fi +struct retro_core_options_v2 options_fa = { + option_cats_fa, + option_defs_fa }; -/* RETRO_LANGUAGE_FR */ - -#define CATEGORY_SYSTEM_LABEL_FR "Système" -#define CATEGORY_SYSTEM_INFO_0_FR "Configurer les réglages de région, de langue, du BIOS et du matériel de base." -#define CATEGORY_VIDEO_LABEL_FR "Vidéo" -#define CATEGORY_VIDEO_INFO_0_FR "Configurez les réglages de résolution, de transparence indépendante de l'ordre et des effets visuels." -#define CATEGORY_PERFORMANCE_LABEL_FR "Performances" -#define CATEGORY_PERFORMANCE_INFO_0_FR "Configurer les réglages de rendu et de saut d'images." -#define CATEGORY_HACKS_LABEL_FR "Hacks d'émulation" -#define CATEGORY_HACKS_INFO_0_FR "Configurez les réglages de remplacements pour écrans larges, de vitesse de chargement des GD-ROM et de remplacement de textures." -#define CATEGORY_INPUT_LABEL_FR "Entrées" -#define CATEGORY_INPUT_INFO_0_FR "Configurer les réglages des manettes et pistolets." -#define CATEGORY_VMU_LABEL_FR "Unité de mémoire visuelle (VMU)" -#define CATEGORY_VMU_INFO_0_FR "Configurer les réglages de fichiers de sauvegarde VMU par jeu et de visibilité des VMU à l'écran." -#define CORE_OPTION_NAME_REGION_LABEL_FR "Région" -#define OPTION_VAL_JAPAN_FR "Japon" -#define OPTION_VAL_USA_FR "États-Unis" -#define OPTION_VAL_EUROPE_FR NULL -#define OPTION_VAL_DEFAULT_FR "Par défaut" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_FR "Langue " -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FR "Modifie la langue utilisée par le BIOS et par tous les jeux qui contiennent plusieurs langues." -#define OPTION_VAL_JAPANESE_FR "Japonais" -#define OPTION_VAL_ENGLISH_FR "Anglais" -#define OPTION_VAL_GERMAN_FR "Allemand" -#define OPTION_VAL_FRENCH_FR "Français" -#define OPTION_VAL_SPANISH_FR "Espagnol" -#define OPTION_VAL_ITALIAN_FR "Italien" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FR "BIOS HLE (Redémarrage requis)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FR "Forcer l'utilisation d'un BIOS en émulation de haut niveau." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FR "Démarrer sur le BIOS (Redémarrage requis)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FR "Démarrer directement sur le menu BIOS Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FR "Activer le DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FR "Active l'émulation du DSP audio de la Dreamcast (processeur de signal numérique). Améliore la précision du son généré, mais augmente les exigences de performances." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_FR "Forcer le mode Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FR "Activer l'émulation MMU (unité de gestion mémoire) complète et d'autres réglages pour les jeux Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FR "Autoriser les boutons de service NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FR "Active le bouton SERVICE pour NAOMI, pour entrer dans les paramètres de la borne." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FR "Définir les jeux NAOMI en Free Play" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FR "Modifier les réglages de pièces du jeu en mode gratuit." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FR "Émulation de l'adaptateur haut débit" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FR "Émuler l'adaptateur haut débit Ethernet au lieu du modem. (Redémarrage requis)" -#define CORE_OPTION_NAME_UPNP_LABEL_FR "Activer l'UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_FR "Utilisez l'UPnP pour configurer automatiquement votre routeur Internet pour les jeux en ligne." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FR "Résolution interne" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FR "Modifier la résolution de rendu." -#define OPTION_VAL_320X240_FR NULL -#define OPTION_VAL_640X480_FR NULL -#define OPTION_VAL_800X600_FR NULL -#define OPTION_VAL_960X720_FR NULL -#define OPTION_VAL_1024X768_FR NULL -#define OPTION_VAL_1280X960_FR NULL -#define OPTION_VAL_1440X1080_FR NULL -#define OPTION_VAL_1600X1200_FR NULL -#define OPTION_VAL_1920X1440_FR NULL -#define OPTION_VAL_2560X1920_FR NULL -#define OPTION_VAL_2880X2160_FR NULL -#define OPTION_VAL_3200X2400_FR NULL -#define OPTION_VAL_3840X2880_FR NULL -#define OPTION_VAL_4480X3360_FR NULL -#define OPTION_VAL_5120X3840_FR NULL -#define OPTION_VAL_5760X4320_FR NULL -#define OPTION_VAL_6400X4800_FR NULL -#define OPTION_VAL_7040X5280_FR NULL -#define OPTION_VAL_7680X5760_FR NULL -#define OPTION_VAL_8320X6240_FR NULL -#define OPTION_VAL_8960X6720_FR NULL -#define OPTION_VAL_9600X7200_FR NULL -#define OPTION_VAL_10240X7680_FR NULL -#define OPTION_VAL_10880X8160_FR NULL -#define OPTION_VAL_11520X8640_FR NULL -#define OPTION_VAL_12160X9120_FR NULL -#define OPTION_VAL_12800X9600_FR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FR "Type de câble" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FR "Le type de signal de sortie. 'TV (Composite)' est le plus largement pris en charge." -#define OPTION_VAL_VGA_FR NULL -#define OPTION_VAL_TV_RGB_FR "TV (RVB)" -#define OPTION_VAL_TV_COMPOSITE_FR NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_FR "Standard de diffusion" -#define OPTION_VAL_NTSC_FR NULL -#define OPTION_VAL_PAL_FR "PAL (Monde)" -#define OPTION_VAL_PAL_N_FR "PAL-N (Argentine, Paraguay, Uruguay)" -#define OPTION_VAL_PAL_M_FR "PAL-M (Brésil)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FR "Orientation de l'écran" -#define OPTION_VAL_HORIZONTAL_FR "Horizontale" -#define OPTION_VAL_VERTICAL_FR "Verticale" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FR "Tri alpha" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FR "Par bande (rapide, moins précis)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_FR "Par triangle (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_FR "Par pixel (précis, mais le plus lent)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FR "Taille du tampon d'accumulation des pixels" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FR "Des valeurs plus élevées peuvent être requises pour que les résolutions plus élevées s'affichent correctement." -#define OPTION_VAL_512MB_FR "512 Mo" -#define OPTION_VAL_1GB_FR "1 Go" -#define OPTION_VAL_2GB_FR "2 Go" -#define OPTION_VAL_4GB_FR "4 Go" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FR "Calques transparents maximum" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FR "Des valeurs plus élevées peuvent être requises pour les scènes complexes." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FR "Émulation complète du framebuffer" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FR "Active l'émulation complète du framebuffer dans la VRAM. Ceci est utile pour les jeux qui lisent ou écrivent directement le framebuffer dans la VRAM. Lorsque cette option est activée, la résolution interne est forcée à 640x480 et les performances peuvent être sévèrement affectées." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FR "Activer la mémoire tampon du RTT (rendu vers texture)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FR "Copier les textures rendues depuis le processeur graphique vers la VRAM. Cette option est normalement activée pour les jeux qui en ont besoin. Lorsque cette option est activée, la mise à l'échelle du rendu des textures est désactivée et les performances peuvent être impactées." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FR NULL -#define CORE_OPTION_NAME_FOG_LABEL_FR "Effets de brouillard" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FR "Modificateur du volume" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FR "Une fonctionnalité du processeur graphique de la Dreamcast qui est généralement utilisée par les jeux pour le rendu des ombres d'objets. Cette option devrait normalement être activée — l'impact sur les performances va généralement de minimal à négligeable." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FR "Filtrage anisotrope" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FR "Améliore la qualité des textures sur les surfaces qui sont à des angles de vue obliques par rapport à la caméra. Des valeurs plus élevées sont plus exigeantes sur le processeur graphique. Les modifications de ce réglage ne sont appliqués qu'après redémarrage." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FR "Filtrage des textures" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FR "Le mode de filtrage des textures à utiliser. Cela peut être utilisé pour forcer un certain mode de filtrage de texture sur toutes les textures pour obtenir une apparence plus nette (ou plus lisse) que par défaut. Les valeurs autres que celles par défaut peuvent causer divers problèmes de rendu. Les modifications de ce réglage ne sont appliquées qu'après redémarrage." -#define OPTION_VAL_1_FR "Forcer au plus proche" -#define OPTION_VAL_2_FR "Forcer linéaire" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FR "Retarder l'échange d'images" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FR "Utile pour éviter les écrans clignotants ou les vidéos buggées. Non recommandé sur les plates-formes lentes." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FR "Détecter les changements de fréquence d'images" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FR "Notifier l'interface lorsque la fréquence d’images interne change (par exemple, de 60 i/s à 30 i/s). Améliore la cadence des images dans les jeux qui fonctionnent à 30 i/s ou 20 i/s, mais devrait être désactivé pour les jeux avec des fréquences d'images (non stables) déverrouillées (Ecco the Dolphin, Unreal Tournament par exemple). Remarque : Indisponible lorsque 'Saut d'images automatique' est activé." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FR "Filtre de post-traitement PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FR "Post-traitement de l'image rendue pour simuler les effets spécifiques au processeur graphique PowerVR2 et aux signaux vidéo analogiques." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FR "Agrandissement des textures (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FR "Améliorer les graphismes en pixels 2D dessinés à la main. Devrait être utilisé uniquement avec les jeux en 2D pixelisés." -#define OPTION_VAL_2_O27_FR "x2" -#define OPTION_VAL_4_FR "x4" -#define OPTION_VAL_6_FR "x6" -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FR "Facteur maximal du filtre d'agrandissement de textures" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FR "Interpolation de profondeur native" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FR "Aide pour la corruption de textures et les problèmes de profondeur sur les processeurs graphiques AMD. Peut aussi aider les processeurs graphiques Intel dans certains cas." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FR "Rendu sur plusieurs fils d'exécution" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FR "Fais tourner le processeur graphique et le processeur sur différents fils d'exécution. Fortement recommandé." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FR "Saut d'images automatique" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FR "Sauter automatiquement des images lorsque l'émulateur s'exécute lentement. Remarque : Cette option ne s'applique que lorsque 'Rendu sur plusieurs fils d'exécution' est activé." -#define OPTION_VAL_SOME_FR NULL -#define OPTION_VAL_MORE_FR "Maximal" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FR "Saut d'images" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FR "Définit le nombre d'images à sauter entre chaque image affichée." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FR "Cheats d'écran large (Redémarrage requis)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FR "Active les cheats qui permettent à certains jeux de s'afficher au format écran large." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FR "Hack d'écran large" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FR "Afficher un rendu de la géométrie en dehors du rapport d'aspect normal de 4:3. Peut produire des bugs graphiques dans les zones révélées." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FR "Chargement rapide des GD-ROM (inexact)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FR "Accélère le chargement des GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FR "Under/overclock processeur du SH4" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FR "Modifie la fréquence d'horloge du processeur principal du SH4 cadencé par défaut à 200 MHz. La diminuer peut aider les plates-formes lentes. L'augmenter peut améliorer la fréquence d'images pour certains jeux. À utiliser avec prudence." -#define OPTION_VAL_100_FR NULL -#define OPTION_VAL_110_FR NULL -#define OPTION_VAL_120_FR NULL -#define OPTION_VAL_130_FR NULL -#define OPTION_VAL_140_FR NULL -#define OPTION_VAL_150_FR NULL -#define OPTION_VAL_160_FR NULL -#define OPTION_VAL_170_FR NULL -#define OPTION_VAL_180_FR NULL -#define OPTION_VAL_190_FR NULL -#define OPTION_VAL_200_FR NULL -#define OPTION_VAL_210_FR NULL -#define OPTION_VAL_220_FR NULL -#define OPTION_VAL_230_FR NULL -#define OPTION_VAL_240_FR NULL -#define OPTION_VAL_250_FR NULL -#define OPTION_VAL_260_FR NULL -#define OPTION_VAL_270_FR NULL -#define OPTION_VAL_280_FR NULL -#define OPTION_VAL_290_FR NULL -#define OPTION_VAL_300_FR NULL -#define OPTION_VAL_310_FR NULL -#define OPTION_VAL_320_FR NULL -#define OPTION_VAL_330_FR NULL -#define OPTION_VAL_340_FR NULL -#define OPTION_VAL_350_FR NULL -#define OPTION_VAL_360_FR NULL -#define OPTION_VAL_370_FR NULL -#define OPTION_VAL_380_FR NULL -#define OPTION_VAL_390_FR NULL -#define OPTION_VAL_400_FR NULL -#define OPTION_VAL_410_FR NULL -#define OPTION_VAL_420_FR NULL -#define OPTION_VAL_430_FR NULL -#define OPTION_VAL_440_FR NULL -#define OPTION_VAL_450_FR NULL -#define OPTION_VAL_460_FR NULL -#define OPTION_VAL_470_FR NULL -#define OPTION_VAL_480_FR NULL -#define OPTION_VAL_490_FR NULL -#define OPTION_VAL_500_FR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FR "Charger les textures personnalisées" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FR "Importer les textures" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FR "Deadzone du stick analogique" -#define OPTION_VAL_0_FR NULL -#define OPTION_VAL_5_FR NULL -#define OPTION_VAL_10_FR NULL -#define OPTION_VAL_15_FR NULL -#define OPTION_VAL_20_FR NULL -#define OPTION_VAL_25_FR NULL -#define OPTION_VAL_30_FR NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FR "Deadzone des gâchettes" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FR "Gâchettes numériques" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FR "Pack Puru Puru/vibration" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FR "Active le retour de force de la manette." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FR "Diffuser les sorties numériques" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FR "Diffuser les sorties numériques et l'état du retour de force sur le port TCP 8000. Compatible avec l'option de MAME \"-output network\" ." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FR "Afficher les réglages du pistolet" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FR "Activer la configuration des options d'affichage du viseur des pistolets. REMARQUE : le menu rapide devrait être réouvert pour que ce paramètre prenne effet." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 1" -#define OPTION_VAL_WHITE_FR "Blanc" -#define OPTION_VAL_RED_FR "Rouge" -#define OPTION_VAL_GREEN_FR "Vert" -#define OPTION_VAL_BLUE_FR "Bleu" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FR "Unités/systèmes de mémoire visuelle par jeu (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FR "VMU par jeu" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FR "Lorsque cette option est désactivée, tous les jeux partagent 4 fichiers de sauvegarde VMU (A1, B1, C1, D1) situés dans le dossier system de RetroArch. Le réglage 'VMU A1' crée un fichier VMU 'A1' unique dans le dossier de sauvegarde de RetroArch pour chaque jeu qui est lancé. Le paramètre 'Toutes les VMU' crée 4 fichiers VMU uniques (A1, B1, C1, D1) pour chaque jeu qui est lancé." -#define OPTION_VAL_VMU_A1_FR NULL -#define OPTION_VAL_ALL_VMUS_FR "Tous les VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FR "Sons des unités/systèmes de mémoire visuelle (VMU)" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FR "Sons des VMU" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FR "Si cette option est activée, les bips des VMU sont joués." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FR "Afficher les réglage d'affichage de l'unité/système de mémoire visuelle (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FR "Afficher les réglages d'affichage du VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FR "Activer la configuration de la visibilité, de la taille, de la position et de la couleur de l'écran du VMU émulé. REMARQUE : Le menu rapide devrait être réouvert pour que ce réglage prenne effet." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 1" -#define OPTION_VAL_UPPER_LEFT_FR "En haut à gauche" -#define OPTION_VAL_UPPER_RIGHT_FR "En haut à droite" -#define OPTION_VAL_LOWER_LEFT_FR "En bas à gauche" -#define OPTION_VAL_LOWER_RIGHT_FR "En bas à droite" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 1" -#define OPTION_VAL_1X_FR "x1" -#define OPTION_VAL_3X_FR "x3" -#define OPTION_VAL_5X_FR "x5" -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 1" -#define OPTION_VAL_DEFAULT_ON_00_FR "Par défaut activé" -#define OPTION_VAL_DEFAULT_OFF_01_FR "Par défaut désactivé" -#define OPTION_VAL_BLACK_02_FR "Noire" -#define OPTION_VAL_LIGHT_BLUE_04_FR "Bleu clair" -#define OPTION_VAL_CYAN_06_FR NULL -#define OPTION_VAL_CYAN_BLUE_07_FR "Bleu cyan" -#define OPTION_VAL_LIGHT_GREEN_08_FR "Vert clair" -#define OPTION_VAL_CYAN_GREEN_09_FR "Vert cyan" -#define OPTION_VAL_LIGHT_CYAN_10_FR "Cyan clair" -#define OPTION_VAL_PURPLE_12_FR "Violette" -#define OPTION_VAL_LIGHT_PURPLE_13_FR "Violet clair" -#define OPTION_VAL_YELLOW_14_FR "Jaune" -#define OPTION_VAL_GRAY_15_FR "Grise" -#define OPTION_VAL_LIGHT_PURPLE_2_16_FR "Violet clair (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_FR "Vert clair (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_FR "Vert clair (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_FR "Cyan clair (2)" -#define OPTION_VAL_LIGHT_RED_2_20_FR "Rouge clair (2)" -#define OPTION_VAL_MAGENTA_21_FR NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_FR "Violet clair (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_FR "Orange clair" -#define OPTION_VAL_ORANGE_24_FR NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_FR "Violet clair (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_FR "Jaune clair" -#define OPTION_VAL_LIGHT_YELLOW_2_27_FR "Jaune clair (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 1" -#define OPTION_VAL_40_FR NULL -#define OPTION_VAL_50_FR NULL -#define OPTION_VAL_60_FR NULL -#define OPTION_VAL_70_FR NULL -#define OPTION_VAL_80_FR NULL -#define OPTION_VAL_90_FR NULL -#define OPTION_VAL_100_O57_FR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 4" +/* RETRO_LANGUAGE_FI */ -struct retro_core_option_v2_category option_cats_fr[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_FR, - CATEGORY_SYSTEM_INFO_0_FR - }, - { - "video", - CATEGORY_VIDEO_LABEL_FR, - CATEGORY_VIDEO_INFO_0_FR - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_FR, - CATEGORY_PERFORMANCE_INFO_0_FR - }, - { - "hacks", - CATEGORY_HACKS_LABEL_FR, - CATEGORY_HACKS_INFO_0_FR - }, - { - "input", - CATEGORY_INPUT_LABEL_FR, - CATEGORY_INPUT_INFO_0_FR +#define CATEGORY_SYSTEM_LABEL_FI "Järjestelmä" +#define CATEGORY_SYSTEM_INFO_0_FI NULL +#define CATEGORY_VIDEO_LABEL_FI NULL +#define CATEGORY_VIDEO_INFO_0_FI NULL +#define CATEGORY_PERFORMANCE_LABEL_FI "Suorituskyky" +#define CATEGORY_PERFORMANCE_INFO_0_FI NULL +#define CATEGORY_HACKS_LABEL_FI "Emulointikikat" +#define CATEGORY_HACKS_INFO_0_FI "Määritä laajakuvaohituksen, GD-ROM-latausnopeuden ja tekstuurikorvauksen asetukset." +#define CATEGORY_INPUT_LABEL_FI "Syöte" +#define CATEGORY_INPUT_INFO_0_FI NULL +#define CATEGORY_EXPANSIONS_LABEL_FI NULL +#define CATEGORY_EXPANSIONS_INFO_0_FI NULL +#define CATEGORY_VMU_LABEL_FI NULL +#define CATEGORY_VMU_INFO_0_FI NULL +#define CORE_OPTION_NAME_REGION_LABEL_FI "Alue" +#define OPTION_VAL_JAPAN_FI NULL +#define OPTION_VAL_USA_FI NULL +#define OPTION_VAL_EUROPE_FI "Eurooppa" +#define OPTION_VAL_DEFAULT_FI "Oletus" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_FI "Kieli" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FI NULL +#define OPTION_VAL_JAPANESE_FI NULL +#define OPTION_VAL_ENGLISH_FI NULL +#define OPTION_VAL_GERMAN_FI NULL +#define OPTION_VAL_FRENCH_FI NULL +#define OPTION_VAL_SPANISH_FI NULL +#define OPTION_VAL_ITALIAN_FI NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FI NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FI NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FI "Käynnistä BIOS:iin (Uudelleenkäynnistys vaaditaan)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FI "Käynnistä suoraan Dreamcastin BIOS-valikkoon." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FI "Käytä DSP:tä" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FI NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FI NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FI NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FI NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FI NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FI "Laajakaista-adapterin emulaatio" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FI NULL +#define CORE_OPTION_NAME_UPNP_LABEL_FI "Käytä UPnP:tä" +#define CORE_OPTION_NAME_UPNP_INFO_0_FI "Käytä UPnP:tä Internet-reitittimen määrittämiseksi verkkopelejä varten." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FI "Sisäinen resoluutio" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FI "Muokkaa renderöintitarkkuutta." +#define OPTION_VAL_320X240_FI "320x240 (Puolikas)" +#define OPTION_VAL_640X480_FI "640x480 (Natiivi)" +#define OPTION_VAL_800X600_FI NULL +#define OPTION_VAL_960X720_FI NULL +#define OPTION_VAL_1024X768_FI NULL +#define OPTION_VAL_1280X960_FI NULL +#define OPTION_VAL_1440X1080_FI NULL +#define OPTION_VAL_1600X1200_FI NULL +#define OPTION_VAL_1920X1440_FI NULL +#define OPTION_VAL_2560X1920_FI NULL +#define OPTION_VAL_2880X2160_FI NULL +#define OPTION_VAL_3200X2400_FI NULL +#define OPTION_VAL_3840X2880_FI NULL +#define OPTION_VAL_4480X3360_FI NULL +#define OPTION_VAL_5120X3840_FI NULL +#define OPTION_VAL_5760X4320_FI NULL +#define OPTION_VAL_6400X4800_FI NULL +#define OPTION_VAL_7040X5280_FI NULL +#define OPTION_VAL_7680X5760_FI NULL +#define OPTION_VAL_8320X6240_FI NULL +#define OPTION_VAL_8960X6720_FI NULL +#define OPTION_VAL_9600X7200_FI NULL +#define OPTION_VAL_10240X7680_FI NULL +#define OPTION_VAL_10880X8160_FI NULL +#define OPTION_VAL_11520X8640_FI NULL +#define OPTION_VAL_12160X9120_FI NULL +#define OPTION_VAL_12800X9600_FI NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FI "Kaapelin tyyppi" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FI NULL +#define OPTION_VAL_VGA_FI NULL +#define OPTION_VAL_TV_RGB_FI NULL +#define OPTION_VAL_TV_COMPOSITE_FI NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_FI NULL +#define OPTION_VAL_NTSC_FI NULL +#define OPTION_VAL_PAL_FI NULL +#define OPTION_VAL_PAL_N_FI "PAL-N (Argentiina, Paraguay, Uruguay)" +#define OPTION_VAL_PAL_M_FI "PAL-M (Brasilia)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FI "Näytön suunta" +#define OPTION_VAL_HORIZONTAL_FI NULL +#define OPTION_VAL_VERTICAL_FI NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FI NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FI NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FI NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_FI NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_FI NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FI NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FI NULL +#define OPTION_VAL_512MB_FI "512 Mt" +#define OPTION_VAL_1GB_FI "1 Gt" +#define OPTION_VAL_2GB_FI "2 Gt" +#define OPTION_VAL_4GB_FI "4 Gt" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FI NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FI NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FI NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FI NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FI NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FI NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FI NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_FI NULL +#define CORE_OPTION_NAME_FOG_LABEL_FI "Sumutehosteet" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FI NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FI NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FI "Anisotrooppinen suodatus" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FI NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FI "Tekstuurisuodatus" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FI NULL +#define OPTION_VAL_1_FI NULL +#define OPTION_VAL_2_FI NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FI NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FI NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FI NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FI NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FI "PowerVR2-jälkikäsittelysuodatin" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FI NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FI "Tekstuurin yliskaalaus (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FI NULL +#define OPTION_VAL_2_O26_FI NULL +#define OPTION_VAL_4_FI NULL +#define OPTION_VAL_6_FI NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FI NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FI NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FI NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FI NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FI NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FI NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FI "Säikeistetty renderöinti" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FI NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FI NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FI NULL +#define OPTION_VAL_SOME_FI "Normaali" +#define OPTION_VAL_MORE_FI NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FI NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FI NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FI NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FI NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FI NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FI NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FI NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FI NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FI NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FI NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FI "SH4-suorittimen ali-/ylikellotus" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FI NULL +#define OPTION_VAL_100_FI NULL +#define OPTION_VAL_110_FI NULL +#define OPTION_VAL_120_FI NULL +#define OPTION_VAL_130_FI NULL +#define OPTION_VAL_140_FI NULL +#define OPTION_VAL_150_FI NULL +#define OPTION_VAL_160_FI NULL +#define OPTION_VAL_170_FI NULL +#define OPTION_VAL_180_FI NULL +#define OPTION_VAL_190_FI NULL +#define OPTION_VAL_200_FI NULL +#define OPTION_VAL_210_FI NULL +#define OPTION_VAL_220_FI NULL +#define OPTION_VAL_230_FI NULL +#define OPTION_VAL_240_FI NULL +#define OPTION_VAL_250_FI NULL +#define OPTION_VAL_260_FI NULL +#define OPTION_VAL_270_FI NULL +#define OPTION_VAL_280_FI NULL +#define OPTION_VAL_290_FI NULL +#define OPTION_VAL_300_FI NULL +#define OPTION_VAL_310_FI NULL +#define OPTION_VAL_320_FI NULL +#define OPTION_VAL_330_FI NULL +#define OPTION_VAL_340_FI NULL +#define OPTION_VAL_350_FI NULL +#define OPTION_VAL_360_FI NULL +#define OPTION_VAL_370_FI NULL +#define OPTION_VAL_380_FI NULL +#define OPTION_VAL_390_FI NULL +#define OPTION_VAL_400_FI NULL +#define OPTION_VAL_410_FI NULL +#define OPTION_VAL_420_FI NULL +#define OPTION_VAL_430_FI NULL +#define OPTION_VAL_440_FI NULL +#define OPTION_VAL_450_FI NULL +#define OPTION_VAL_460_FI NULL +#define OPTION_VAL_470_FI NULL +#define OPTION_VAL_480_FI NULL +#define OPTION_VAL_490_FI NULL +#define OPTION_VAL_500_FI NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FI NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FI NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FI NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FI NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FI NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FI NULL +#define OPTION_VAL_0_FI "0 %" +#define OPTION_VAL_5_FI "5 %" +#define OPTION_VAL_10_FI "10 %" +#define OPTION_VAL_15_FI "15 %" +#define OPTION_VAL_20_FI "20 %" +#define OPTION_VAL_25_FI "25 %" +#define OPTION_VAL_30_FI "30 %" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FI NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FI NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FI NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FI NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FI NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FI NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FI "Näytä valoaseen asetukset" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FI NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FI "Aseen tähtäimen koko" +#define OPTION_VAL_50_FI "50 %" +#define OPTION_VAL_60_FI "60 %" +#define OPTION_VAL_70_FI "70 %" +#define OPTION_VAL_80_FI "80 %" +#define OPTION_VAL_90_FI "90 %" +#define OPTION_VAL_100_O45_FI "100 %" +#define OPTION_VAL_110_O45_FI "110 %" +#define OPTION_VAL_120_O45_FI "120 %" +#define OPTION_VAL_130_O45_FI "130 %" +#define OPTION_VAL_140_O45_FI "140 %" +#define OPTION_VAL_150_O45_FI "150 %" +#define OPTION_VAL_160_O45_FI "160 %" +#define OPTION_VAL_170_O45_FI "170 %" +#define OPTION_VAL_180_O45_FI "180 %" +#define OPTION_VAL_190_O45_FI "190 %" +#define OPTION_VAL_200_O45_FI "200 %" +#define OPTION_VAL_210_O45_FI "210 %" +#define OPTION_VAL_220_O45_FI "220 %" +#define OPTION_VAL_230_O45_FI "230 %" +#define OPTION_VAL_240_O45_FI "240 %" +#define OPTION_VAL_250_O45_FI "250 %" +#define OPTION_VAL_260_O45_FI "260 %" +#define OPTION_VAL_270_O45_FI "270 %" +#define OPTION_VAL_280_O45_FI "280 %" +#define OPTION_VAL_290_O45_FI "290 %" +#define OPTION_VAL_300_O45_FI "300 %" +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FI NULL +#define OPTION_VAL_WHITE_FI "Valkoinen" +#define OPTION_VAL_RED_FI "Punainen" +#define OPTION_VAL_GREEN_FI "Vihreä" +#define OPTION_VAL_BLUE_FI "Sininen" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FI NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FI NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FI NULL +#define OPTION_VAL_VMU_FI NULL +#define OPTION_VAL_PURUPURU_FI NULL +#define OPTION_VAL_NONE_FI "Ei mitään" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FI NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FI NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FI NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FI NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FI NULL +#define OPTION_VAL_VMU_A1_FI NULL +#define OPTION_VAL_ALL_VMUS_FI NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FI "VMU-äänet" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FI "Kun käytössä, VMU-piippaukset toistetaan." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FI NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FI NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FI NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FI NULL +#define OPTION_VAL_UPPER_LEFT_FI "Ylävasen" +#define OPTION_VAL_UPPER_RIGHT_FI "Yläoikea" +#define OPTION_VAL_LOWER_LEFT_FI "Alavasen" +#define OPTION_VAL_LOWER_RIGHT_FI "Alaoikea" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FI NULL +#define OPTION_VAL_1X_FI NULL +#define OPTION_VAL_3X_FI NULL +#define OPTION_VAL_5X_FI NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FI NULL +#define OPTION_VAL_DEFAULT_ON_00_FI NULL +#define OPTION_VAL_DEFAULT_OFF_01_FI NULL +#define OPTION_VAL_BLACK_02_FI "Musta" +#define OPTION_VAL_LIGHT_BLUE_04_FI "Vaaleansininen" +#define OPTION_VAL_CYAN_06_FI "Syaani" +#define OPTION_VAL_CYAN_BLUE_07_FI "Turkoosi sininen" +#define OPTION_VAL_LIGHT_GREEN_08_FI "Vaaleanvihreä" +#define OPTION_VAL_CYAN_GREEN_09_FI "Syaani vihreä" +#define OPTION_VAL_LIGHT_CYAN_10_FI NULL +#define OPTION_VAL_PURPLE_12_FI "Violetti" +#define OPTION_VAL_LIGHT_PURPLE_13_FI NULL +#define OPTION_VAL_YELLOW_14_FI "Keltainen" +#define OPTION_VAL_GRAY_15_FI "Harmaa" +#define OPTION_VAL_LIGHT_PURPLE_2_16_FI NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_FI NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_FI NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_FI NULL +#define OPTION_VAL_LIGHT_RED_2_20_FI NULL +#define OPTION_VAL_MAGENTA_21_FI NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_FI NULL +#define OPTION_VAL_LIGHT_ORANGE_23_FI NULL +#define OPTION_VAL_ORANGE_24_FI "Oranssi" +#define OPTION_VAL_LIGHT_PURPLE_4_25_FI NULL +#define OPTION_VAL_LIGHT_YELLOW_26_FI NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_FI NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FI NULL +#define OPTION_VAL_40_FI "40 %" +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FI NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FI NULL + +struct retro_core_option_v2_category option_cats_fi[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FI, + CATEGORY_SYSTEM_INFO_0_FI + }, + { + "video", + CATEGORY_VIDEO_LABEL_FI, + CATEGORY_VIDEO_INFO_0_FI + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_FI, + CATEGORY_PERFORMANCE_INFO_0_FI + }, + { + "hacks", + CATEGORY_HACKS_LABEL_FI, + CATEGORY_HACKS_INFO_0_FI + }, + { + "input", + CATEGORY_INPUT_LABEL_FI, + CATEGORY_INPUT_INFO_0_FI + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_FI, + CATEGORY_EXPANSIONS_INFO_0_FI }, { "vmu", - CATEGORY_VMU_LABEL_FR, - CATEGORY_VMU_INFO_0_FR + CATEGORY_VMU_LABEL_FI, + CATEGORY_VMU_INFO_0_FI }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_fr[] = { +struct retro_core_option_v2_definition option_defs_fi[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_FR, + CORE_OPTION_NAME_REGION_LABEL_FI, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_FR }, - { "USA", OPTION_VAL_USA_FR }, - { "Europe", OPTION_VAL_EUROPE_FR }, - { "Default", OPTION_VAL_DEFAULT_FR }, + { "Japan", OPTION_VAL_JAPAN_FI }, + { "USA", OPTION_VAL_USA_FI }, + { "Europe", OPTION_VAL_EUROPE_FI }, + { "Default", OPTION_VAL_DEFAULT_FI }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_FR, + CORE_OPTION_NAME_LANGUAGE_LABEL_FI, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_FR, + CORE_OPTION_NAME_LANGUAGE_INFO_0_FI, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_FR }, - { "English", OPTION_VAL_ENGLISH_FR }, - { "German", OPTION_VAL_GERMAN_FR }, - { "French", OPTION_VAL_FRENCH_FR }, - { "Spanish", OPTION_VAL_SPANISH_FR }, - { "Italian", OPTION_VAL_ITALIAN_FR }, - { "Default", OPTION_VAL_DEFAULT_FR }, + { "Japanese", OPTION_VAL_JAPANESE_FI }, + { "English", OPTION_VAL_ENGLISH_FI }, + { "German", OPTION_VAL_GERMAN_FI }, + { "French", OPTION_VAL_FRENCH_FI }, + { "Spanish", OPTION_VAL_SPANISH_FI }, + { "Italian", OPTION_VAL_ITALIAN_FI }, + { "Default", OPTION_VAL_DEFAULT_FI }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_FR, + CORE_OPTION_NAME_HLE_BIOS_LABEL_FI, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_FR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_FI, NULL, "system", { @@ -29207,9 +32686,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FR, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FI, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FI, NULL, "system", { @@ -29221,9 +32700,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_FR, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_FI, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FI, NULL, "system", { @@ -29237,25 +32716,11 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_FR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_FR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FI, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FI, NULL, "system", { @@ -29267,9 +32732,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FR, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FI, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FR, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FI, NULL, "system", { @@ -29281,9 +32746,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_FR, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_FI, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FR, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FI, NULL, "system", { @@ -29295,9 +32760,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_FR, + CORE_OPTION_NAME_UPNP_LABEL_FI, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_FR, + CORE_OPTION_NAME_UPNP_INFO_0_FI, NULL, "system", { @@ -29310,39 +32775,39 @@ struct retro_core_option_v2_definition option_defs_fr[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FI, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FI, NULL, "video", { - { "320x240", OPTION_VAL_320X240_FR }, - { "640x480", OPTION_VAL_640X480_FR }, - { "800x600", OPTION_VAL_800X600_FR }, - { "960x720", OPTION_VAL_960X720_FR }, - { "1024x768", OPTION_VAL_1024X768_FR }, - { "1280x960", OPTION_VAL_1280X960_FR }, - { "1440x1080", OPTION_VAL_1440X1080_FR }, - { "1600x1200", OPTION_VAL_1600X1200_FR }, - { "1920x1440", OPTION_VAL_1920X1440_FR }, - { "2560x1920", OPTION_VAL_2560X1920_FR }, - { "2880x2160", OPTION_VAL_2880X2160_FR }, - { "3200x2400", OPTION_VAL_3200X2400_FR }, - { "3840x2880", OPTION_VAL_3840X2880_FR }, - { "4480x3360", OPTION_VAL_4480X3360_FR }, - { "5120x3840", OPTION_VAL_5120X3840_FR }, - { "5760x4320", OPTION_VAL_5760X4320_FR }, - { "6400x4800", OPTION_VAL_6400X4800_FR }, - { "7040x5280", OPTION_VAL_7040X5280_FR }, - { "7680x5760", OPTION_VAL_7680X5760_FR }, - { "8320x6240", OPTION_VAL_8320X6240_FR }, - { "8960x6720", OPTION_VAL_8960X6720_FR }, - { "9600x7200", OPTION_VAL_9600X7200_FR }, - { "10240x7680", OPTION_VAL_10240X7680_FR }, - { "10880x8160", OPTION_VAL_10880X8160_FR }, - { "11520x8640", OPTION_VAL_11520X8640_FR }, - { "12160x9120", OPTION_VAL_12160X9120_FR }, - { "12800x9600", OPTION_VAL_12800X9600_FR }, + { "320x240", OPTION_VAL_320X240_FI }, + { "640x480", OPTION_VAL_640X480_FI }, + { "800x600", OPTION_VAL_800X600_FI }, + { "960x720", OPTION_VAL_960X720_FI }, + { "1024x768", OPTION_VAL_1024X768_FI }, + { "1280x960", OPTION_VAL_1280X960_FI }, + { "1440x1080", OPTION_VAL_1440X1080_FI }, + { "1600x1200", OPTION_VAL_1600X1200_FI }, + { "1920x1440", OPTION_VAL_1920X1440_FI }, + { "2560x1920", OPTION_VAL_2560X1920_FI }, + { "2880x2160", OPTION_VAL_2880X2160_FI }, + { "3200x2400", OPTION_VAL_3200X2400_FI }, + { "3840x2880", OPTION_VAL_3840X2880_FI }, + { "4480x3360", OPTION_VAL_4480X3360_FI }, + { "5120x3840", OPTION_VAL_5120X3840_FI }, + { "5760x4320", OPTION_VAL_5760X4320_FI }, + { "6400x4800", OPTION_VAL_6400X4800_FI }, + { "7040x5280", OPTION_VAL_7040X5280_FI }, + { "7680x5760", OPTION_VAL_7680X5760_FI }, + { "8320x6240", OPTION_VAL_8320X6240_FI }, + { "8960x6720", OPTION_VAL_8960X6720_FI }, + { "9600x7200", OPTION_VAL_9600X7200_FI }, + { "10240x7680", OPTION_VAL_10240X7680_FI }, + { "10880x8160", OPTION_VAL_10880X8160_FI }, + { "11520x8640", OPTION_VAL_11520X8640_FI }, + { "12160x9120", OPTION_VAL_12160X9120_FI }, + { "12800x9600", OPTION_VAL_12800X9600_FI }, { NULL, NULL }, }, #ifdef LOW_RES @@ -29353,62 +32818,62 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_FR, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_FI, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FR, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FI, NULL, "video", { - { "VGA", OPTION_VAL_VGA_FR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_FR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FR }, + { "VGA", OPTION_VAL_VGA_FI }, + { "TV (RGB)", OPTION_VAL_TV_RGB_FI }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FI }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_FR, + CORE_OPTION_NAME_BROADCAST_LABEL_FI, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_FR }, - { "PAL", OPTION_VAL_PAL_FR }, - { "PAL_N", OPTION_VAL_PAL_N_FR }, - { "PAL_M", OPTION_VAL_PAL_M_FR }, - { "Default", OPTION_VAL_DEFAULT_FR }, + { "NTSC", OPTION_VAL_NTSC_FI }, + { "PAL", OPTION_VAL_PAL_FI }, + { "PAL_N", OPTION_VAL_PAL_N_FI }, + { "PAL_M", OPTION_VAL_PAL_M_FI }, + { "Default", OPTION_VAL_DEFAULT_FI }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FR, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FI, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_FR }, - { "vertical", OPTION_VAL_VERTICAL_FR }, + { "horizontal", OPTION_VAL_HORIZONTAL_FI }, + { "vertical", OPTION_VAL_VERTICAL_FI }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FR, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FI, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FR }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FI }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FI }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FR }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FI }, #endif { NULL, NULL }, }, @@ -29421,25 +32886,25 @@ struct retro_core_option_v2_definition option_defs_fr[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FI, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FI, NULL, "video", { - { "512MB", OPTION_VAL_512MB_FR }, - { "1GB", OPTION_VAL_1GB_FR }, - { "2GB", OPTION_VAL_2GB_FR }, - { "4GB", OPTION_VAL_4GB_FR }, + { "512MB", OPTION_VAL_512MB_FI }, + { "1GB", OPTION_VAL_1GB_FI }, + { "2GB", OPTION_VAL_2GB_FI }, + { "4GB", OPTION_VAL_4GB_FI }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_FR, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_FI, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FR, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FI, NULL, "video", { @@ -29447,6 +32912,7 @@ struct retro_core_option_v2_definition option_defs_fr[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -29455,9 +32921,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FI, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FI, NULL, "video", { @@ -29469,9 +32935,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FR, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FI, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FR, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FI, NULL, "video", { @@ -29481,11 +32947,11 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_FR, + CORE_OPTION_NAME_MIPMAPPING_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_FI, NULL, "video", { @@ -29497,7 +32963,7 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_FR, + CORE_OPTION_NAME_FOG_LABEL_FI, NULL, "", NULL, @@ -29511,9 +32977,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FI, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FI, NULL, "video", { @@ -29525,9 +32991,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FI, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FI, NULL, "video", { @@ -29542,24 +33008,24 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FI, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FI, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_FR }, - { "1", OPTION_VAL_1_FR }, - { "2", OPTION_VAL_2_FR }, + { "0", OPTION_VAL_DEFAULT_FI }, + { "1", OPTION_VAL_1_FI }, + { "2", OPTION_VAL_2_FI }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FI, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FI, NULL, "video", { @@ -29567,13 +33033,13 @@ struct retro_core_option_v2_definition option_defs_fr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FI, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FI, NULL, "video", { @@ -29585,9 +33051,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FI, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FI, NULL, "video", { @@ -29600,25 +33066,25 @@ struct retro_core_option_v2_definition option_defs_fr[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_FR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_FI, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FI, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_FR }, - { "4", OPTION_VAL_4_FR }, - { "6", OPTION_VAL_6_FR }, + { "2", OPTION_VAL_2_O26_FI }, + { "4", OPTION_VAL_4_FI }, + { "6", OPTION_VAL_6_FI }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FI, NULL, "video", { @@ -29632,9 +33098,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FI, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FI, NULL, "video", { @@ -29644,11 +33110,25 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FI, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FI, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FI, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FI, NULL, "performance", { @@ -29660,15 +33140,15 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FI, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FI, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_FR }, - { "more", OPTION_VAL_MORE_FR }, + { "some", OPTION_VAL_SOME_FI }, + { "more", OPTION_VAL_MORE_FI }, { NULL, NULL }, }, #ifdef LOW_END @@ -29679,9 +33159,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FI, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FI, NULL, "performance", { @@ -29698,9 +33178,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FI, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FI, NULL, "hacks", { @@ -29712,9 +33192,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FI, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FI, NULL, "hacks", { @@ -29726,9 +33206,9 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FI, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FI, NULL, "hacks", { @@ -29742,64 +33222,78 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FI, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FI, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_FR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_FI, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_FR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_FI, NULL, "hacks", { - { "100", OPTION_VAL_100_FR }, - { "110", OPTION_VAL_110_FR }, - { "120", OPTION_VAL_120_FR }, - { "130", OPTION_VAL_130_FR }, - { "140", OPTION_VAL_140_FR }, - { "150", OPTION_VAL_150_FR }, - { "160", OPTION_VAL_160_FR }, - { "170", OPTION_VAL_170_FR }, - { "180", OPTION_VAL_180_FR }, - { "190", OPTION_VAL_190_FR }, - { "200", OPTION_VAL_200_FR }, - { "210", OPTION_VAL_210_FR }, - { "220", OPTION_VAL_220_FR }, - { "230", OPTION_VAL_230_FR }, - { "240", OPTION_VAL_240_FR }, - { "250", OPTION_VAL_250_FR }, - { "260", OPTION_VAL_260_FR }, - { "270", OPTION_VAL_270_FR }, - { "280", OPTION_VAL_280_FR }, - { "290", OPTION_VAL_290_FR }, - { "300", OPTION_VAL_300_FR }, - { "310", OPTION_VAL_310_FR }, - { "320", OPTION_VAL_320_FR }, - { "330", OPTION_VAL_330_FR }, - { "340", OPTION_VAL_340_FR }, - { "350", OPTION_VAL_350_FR }, - { "360", OPTION_VAL_360_FR }, - { "370", OPTION_VAL_370_FR }, - { "380", OPTION_VAL_380_FR }, - { "390", OPTION_VAL_390_FR }, - { "400", OPTION_VAL_400_FR }, - { "410", OPTION_VAL_410_FR }, - { "420", OPTION_VAL_420_FR }, - { "430", OPTION_VAL_430_FR }, - { "440", OPTION_VAL_440_FR }, - { "450", OPTION_VAL_450_FR }, - { "460", OPTION_VAL_460_FR }, - { "470", OPTION_VAL_470_FR }, - { "480", OPTION_VAL_480_FR }, - { "490", OPTION_VAL_490_FR }, - { "500", OPTION_VAL_500_FR }, + { "100", OPTION_VAL_100_FI }, + { "110", OPTION_VAL_110_FI }, + { "120", OPTION_VAL_120_FI }, + { "130", OPTION_VAL_130_FI }, + { "140", OPTION_VAL_140_FI }, + { "150", OPTION_VAL_150_FI }, + { "160", OPTION_VAL_160_FI }, + { "170", OPTION_VAL_170_FI }, + { "180", OPTION_VAL_180_FI }, + { "190", OPTION_VAL_190_FI }, + { "200", OPTION_VAL_200_FI }, + { "210", OPTION_VAL_210_FI }, + { "220", OPTION_VAL_220_FI }, + { "230", OPTION_VAL_230_FI }, + { "240", OPTION_VAL_240_FI }, + { "250", OPTION_VAL_250_FI }, + { "260", OPTION_VAL_260_FI }, + { "270", OPTION_VAL_270_FI }, + { "280", OPTION_VAL_280_FI }, + { "290", OPTION_VAL_290_FI }, + { "300", OPTION_VAL_300_FI }, + { "310", OPTION_VAL_310_FI }, + { "320", OPTION_VAL_320_FI }, + { "330", OPTION_VAL_330_FI }, + { "340", OPTION_VAL_340_FI }, + { "350", OPTION_VAL_350_FI }, + { "360", OPTION_VAL_360_FI }, + { "370", OPTION_VAL_370_FI }, + { "380", OPTION_VAL_380_FI }, + { "390", OPTION_VAL_390_FI }, + { "400", OPTION_VAL_400_FI }, + { "410", OPTION_VAL_410_FI }, + { "420", OPTION_VAL_420_FI }, + { "430", OPTION_VAL_430_FI }, + { "440", OPTION_VAL_440_FI }, + { "450", OPTION_VAL_450_FI }, + { "460", OPTION_VAL_460_FI }, + { "470", OPTION_VAL_470_FI }, + { "480", OPTION_VAL_480_FI }, + { "490", OPTION_VAL_490_FI }, + { "500", OPTION_VAL_500_FI }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FI, NULL, "hacks", { @@ -29809,11 +33303,11 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FI, NULL, "hacks", { @@ -29825,47 +33319,47 @@ struct retro_core_option_v2_definition option_defs_fr[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FI, NULL, "input", { - { "0%", OPTION_VAL_0_FR }, - { "5%", OPTION_VAL_5_FR }, - { "10%", OPTION_VAL_10_FR }, - { "15%", OPTION_VAL_15_FR }, - { "20%", OPTION_VAL_20_FR }, - { "25%", OPTION_VAL_25_FR }, - { "30%", OPTION_VAL_30_FR }, + { "0%", OPTION_VAL_0_FI }, + { "5%", OPTION_VAL_5_FI }, + { "10%", OPTION_VAL_10_FI }, + { "15%", OPTION_VAL_15_FI }, + { "20%", OPTION_VAL_20_FI }, + { "25%", OPTION_VAL_25_FI }, + { "30%", OPTION_VAL_30_FI }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FR, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FI, NULL, "input", { - { "0%", OPTION_VAL_0_FR }, - { "5%", OPTION_VAL_5_FR }, - { "10%", OPTION_VAL_10_FR }, - { "15%", OPTION_VAL_15_FR }, - { "20%", OPTION_VAL_20_FR }, - { "25%", OPTION_VAL_25_FR }, - { "30%", OPTION_VAL_30_FR }, + { "0%", OPTION_VAL_0_FI }, + { "5%", OPTION_VAL_5_FI }, + { "10%", OPTION_VAL_10_FI }, + { "15%", OPTION_VAL_15_FI }, + { "20%", OPTION_VAL_20_FI }, + { "25%", OPTION_VAL_25_FI }, + { "30%", OPTION_VAL_30_FI }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FR, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FI, NULL, "input", { @@ -29876,10 +33370,10 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_FR, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FI, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_FR, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FI, NULL, "input", { @@ -29887,300 +33381,293 @@ struct retro_core_option_v2_definition option_defs_fr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FR, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FI, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FI, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FR, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FI, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FR, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_FI }, + { "60%", OPTION_VAL_60_FI }, + { "70%", OPTION_VAL_70_FI }, + { "80%", OPTION_VAL_80_FI }, + { "90%", OPTION_VAL_90_FI }, + { "100%", OPTION_VAL_100_O45_FI }, + { "110%", OPTION_VAL_110_O45_FI }, + { "120%", OPTION_VAL_120_O45_FI }, + { "130%", OPTION_VAL_130_O45_FI }, + { "140%", OPTION_VAL_140_O45_FI }, + { "150%", OPTION_VAL_150_O45_FI }, + { "160%", OPTION_VAL_160_O45_FI }, + { "170%", OPTION_VAL_170_O45_FI }, + { "180%", OPTION_VAL_180_O45_FI }, + { "190%", OPTION_VAL_190_O45_FI }, + { "200%", OPTION_VAL_200_O45_FI }, + { "210%", OPTION_VAL_210_O45_FI }, + { "220%", OPTION_VAL_220_O45_FI }, + { "230%", OPTION_VAL_230_O45_FI }, + { "240%", OPTION_VAL_240_O45_FI }, + { "250%", OPTION_VAL_250_O45_FI }, + { "260%", OPTION_VAL_260_O45_FI }, + { "270%", OPTION_VAL_270_O45_FI }, + { "280%", OPTION_VAL_280_O45_FI }, + { "290%", OPTION_VAL_290_O45_FI }, + { "300%", OPTION_VAL_300_O45_FI }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FR, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FI, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FR }, - { "Red", OPTION_VAL_RED_FR }, - { "Green", OPTION_VAL_GREEN_FR }, - { "Blue", OPTION_VAL_BLUE_FR }, + { "White", OPTION_VAL_WHITE_FI }, + { "Red", OPTION_VAL_RED_FI }, + { "Green", OPTION_VAL_GREEN_FI }, + { "Blue", OPTION_VAL_BLUE_FI }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FR, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FI, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FR }, - { "Red", OPTION_VAL_RED_FR }, - { "Green", OPTION_VAL_GREEN_FR }, - { "Blue", OPTION_VAL_BLUE_FR }, + { "White", OPTION_VAL_WHITE_FI }, + { "Red", OPTION_VAL_RED_FI }, + { "Green", OPTION_VAL_GREEN_FI }, + { "Blue", OPTION_VAL_BLUE_FI }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FR, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FI, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FR }, - { "Red", OPTION_VAL_RED_FR }, - { "Green", OPTION_VAL_GREEN_FR }, - { "Blue", OPTION_VAL_BLUE_FR }, + { "White", OPTION_VAL_WHITE_FI }, + { "Red", OPTION_VAL_RED_FI }, + { "Green", OPTION_VAL_GREEN_FI }, + { "Blue", OPTION_VAL_BLUE_FI }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FR, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FI, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_FR }, - { "Red", OPTION_VAL_RED_FR }, - { "Green", OPTION_VAL_GREEN_FR }, - { "Blue", OPTION_VAL_BLUE_FR }, + { "White", OPTION_VAL_WHITE_FI }, + { "Red", OPTION_VAL_RED_FI }, + { "Green", OPTION_VAL_GREEN_FI }, + { "Blue", OPTION_VAL_BLUE_FI }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FI, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FI, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_FR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_FR }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_FR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_FR, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FI, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FI, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FR, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FI, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FI, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FR, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FI, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FR, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FI, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FR, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FI, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_FR }, - { "2x", OPTION_VAL_2_O27_FR }, - { "3x", OPTION_VAL_3X_FR }, - { "4x", OPTION_VAL_4_FR }, - { "5x", OPTION_VAL_5X_FR }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FR, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FI, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FR, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FI, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FI, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "VMU", OPTION_VAL_VMU_FI }, + { "Purupuru", OPTION_VAL_PURUPURU_FI }, + { "None", OPTION_VAL_NONE_FI }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FR, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FI, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FI, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FI, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_FI }, + { "All VMUs", OPTION_VAL_ALL_VMUS_FI }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_FI, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FI, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_FI, NULL, "vmu", { - { "10%", OPTION_VAL_10_FR }, - { "20%", OPTION_VAL_20_FR }, - { "30%", OPTION_VAL_30_FR }, - { "40%", OPTION_VAL_40_FR }, - { "50%", OPTION_VAL_50_FR }, - { "60%", OPTION_VAL_60_FR }, - { "70%", OPTION_VAL_70_FR }, - { "80%", OPTION_VAL_80_FR }, - { "90%", OPTION_VAL_90_FR }, - { "100%", OPTION_VAL_100_O57_FR }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FR, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FI, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FI, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FI, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FI, NULL, "", NULL, @@ -30193,145 +33680,145 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FR, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FI, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FR, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FI, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FR }, - { "2x", OPTION_VAL_2_O27_FR }, - { "3x", OPTION_VAL_3X_FR }, - { "4x", OPTION_VAL_4_FR }, - { "5x", OPTION_VAL_5X_FR }, + { "1x", OPTION_VAL_1X_FI }, + { "2x", OPTION_VAL_2_O26_FI }, + { "3x", OPTION_VAL_3X_FI }, + { "4x", OPTION_VAL_4_FI }, + { "5x", OPTION_VAL_5X_FI }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FR, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FI, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FR }, - { "20%", OPTION_VAL_20_FR }, - { "30%", OPTION_VAL_30_FR }, - { "40%", OPTION_VAL_40_FR }, - { "50%", OPTION_VAL_50_FR }, - { "60%", OPTION_VAL_60_FR }, - { "70%", OPTION_VAL_70_FR }, - { "80%", OPTION_VAL_80_FR }, - { "90%", OPTION_VAL_90_FR }, - { "100%", OPTION_VAL_100_O57_FR }, + { "10%", OPTION_VAL_10_FI }, + { "20%", OPTION_VAL_20_FI }, + { "30%", OPTION_VAL_30_FI }, + { "40%", OPTION_VAL_40_FI }, + { "50%", OPTION_VAL_50_FI }, + { "60%", OPTION_VAL_60_FI }, + { "70%", OPTION_VAL_70_FI }, + { "80%", OPTION_VAL_80_FI }, + { "90%", OPTION_VAL_90_FI }, + { "100%", OPTION_VAL_100_O45_FI }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FR, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FI, NULL, "", NULL, @@ -30344,145 +33831,145 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FR, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FI, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FR, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FI, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FR }, - { "2x", OPTION_VAL_2_O27_FR }, - { "3x", OPTION_VAL_3X_FR }, - { "4x", OPTION_VAL_4_FR }, - { "5x", OPTION_VAL_5X_FR }, + { "1x", OPTION_VAL_1X_FI }, + { "2x", OPTION_VAL_2_O26_FI }, + { "3x", OPTION_VAL_3X_FI }, + { "4x", OPTION_VAL_4_FI }, + { "5x", OPTION_VAL_5X_FI }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FR, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FI, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FR }, - { "20%", OPTION_VAL_20_FR }, - { "30%", OPTION_VAL_30_FR }, - { "40%", OPTION_VAL_40_FR }, - { "50%", OPTION_VAL_50_FR }, - { "60%", OPTION_VAL_60_FR }, - { "70%", OPTION_VAL_70_FR }, - { "80%", OPTION_VAL_80_FR }, - { "90%", OPTION_VAL_90_FR }, - { "100%", OPTION_VAL_100_O57_FR }, + { "10%", OPTION_VAL_10_FI }, + { "20%", OPTION_VAL_20_FI }, + { "30%", OPTION_VAL_30_FI }, + { "40%", OPTION_VAL_40_FI }, + { "50%", OPTION_VAL_50_FI }, + { "60%", OPTION_VAL_60_FI }, + { "70%", OPTION_VAL_70_FI }, + { "80%", OPTION_VAL_80_FI }, + { "90%", OPTION_VAL_90_FI }, + { "100%", OPTION_VAL_100_O45_FI }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FR, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FI, NULL, "", NULL, @@ -30495,596 +33982,149 @@ struct retro_core_option_v2_definition option_defs_fr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FR, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FI, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FR, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FI, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_FR }, - { "2x", OPTION_VAL_2_O27_FR }, - { "3x", OPTION_VAL_3X_FR }, - { "4x", OPTION_VAL_4_FR }, - { "5x", OPTION_VAL_5X_FR }, + { "1x", OPTION_VAL_1X_FI }, + { "2x", OPTION_VAL_2_O26_FI }, + { "3x", OPTION_VAL_3X_FI }, + { "4x", OPTION_VAL_4_FI }, + { "5x", OPTION_VAL_5X_FI }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FR, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FI, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, - { "BLACK 02", OPTION_VAL_BLACK_02_FR }, - { "BLUE 03", OPTION_VAL_BLUE_FR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, - { "GREEN 05", OPTION_VAL_GREEN_FR }, - { "CYAN 06", OPTION_VAL_CYAN_06_FR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, - { "RED 11", OPTION_VAL_RED_FR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, - { "GRAY 15", OPTION_VAL_GRAY_15_FR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, - { "WHITE 28", OPTION_VAL_WHITE_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FR, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FI, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_FR }, - { "20%", OPTION_VAL_20_FR }, - { "30%", OPTION_VAL_30_FR }, - { "40%", OPTION_VAL_40_FR }, - { "50%", OPTION_VAL_50_FR }, - { "60%", OPTION_VAL_60_FR }, - { "70%", OPTION_VAL_70_FR }, - { "80%", OPTION_VAL_80_FR }, - { "90%", OPTION_VAL_90_FR }, - { "100%", OPTION_VAL_100_O57_FR }, + { "10%", OPTION_VAL_10_FI }, + { "20%", OPTION_VAL_20_FI }, + { "30%", OPTION_VAL_30_FI }, + { "40%", OPTION_VAL_40_FI }, + { "50%", OPTION_VAL_50_FI }, + { "60%", OPTION_VAL_60_FI }, + { "70%", OPTION_VAL_70_FI }, + { "80%", OPTION_VAL_80_FI }, + { "90%", OPTION_VAL_90_FI }, + { "100%", OPTION_VAL_100_O45_FI }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_fr = { - option_cats_fr, - option_defs_fr -}; - -/* RETRO_LANGUAGE_GL */ - -#define CATEGORY_SYSTEM_LABEL_GL NULL -#define CATEGORY_SYSTEM_INFO_0_GL NULL -#define CATEGORY_VIDEO_LABEL_GL "Vídeo" -#define CATEGORY_VIDEO_INFO_0_GL NULL -#define CATEGORY_PERFORMANCE_LABEL_GL NULL -#define CATEGORY_PERFORMANCE_INFO_0_GL NULL -#define CATEGORY_HACKS_LABEL_GL "Hacks de emulación" -#define CATEGORY_HACKS_INFO_0_GL NULL -#define CATEGORY_INPUT_LABEL_GL "Entrada" -#define CATEGORY_INPUT_INFO_0_GL NULL -#define CATEGORY_VMU_LABEL_GL NULL -#define CATEGORY_VMU_INFO_0_GL NULL -#define CORE_OPTION_NAME_REGION_LABEL_GL NULL -#define OPTION_VAL_JAPAN_GL NULL -#define OPTION_VAL_USA_GL NULL -#define OPTION_VAL_EUROPE_GL NULL -#define OPTION_VAL_DEFAULT_GL NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_GL NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_GL NULL -#define OPTION_VAL_JAPANESE_GL NULL -#define OPTION_VAL_ENGLISH_GL NULL -#define OPTION_VAL_GERMAN_GL NULL -#define OPTION_VAL_FRENCH_GL NULL -#define OPTION_VAL_SPANISH_GL NULL -#define OPTION_VAL_ITALIAN_GL NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_GL NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_GL "Forza o uso de emulación BIOS de alto nivel." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_GL "Arranca na BIOS (requírese reiniciar)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_GL "Arranca directamente no menú da BIOS de Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_GL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_GL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_GL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_GL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_GL "Permite os botóns de servizo Naomi" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_GL "Activa o botón SERVIZO para NAOMI, para entrar nas opcións da recreativa." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_GL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_GL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_GL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_GL NULL -#define CORE_OPTION_NAME_UPNP_LABEL_GL NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_GL NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_GL "Resolución interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_GL "Modificar a resolución do renderizado." -#define OPTION_VAL_320X240_GL NULL -#define OPTION_VAL_640X480_GL NULL -#define OPTION_VAL_800X600_GL NULL -#define OPTION_VAL_960X720_GL NULL -#define OPTION_VAL_1024X768_GL NULL -#define OPTION_VAL_1280X960_GL NULL -#define OPTION_VAL_1440X1080_GL NULL -#define OPTION_VAL_1600X1200_GL NULL -#define OPTION_VAL_1920X1440_GL NULL -#define OPTION_VAL_2560X1920_GL NULL -#define OPTION_VAL_2880X2160_GL NULL -#define OPTION_VAL_3200X2400_GL NULL -#define OPTION_VAL_3840X2880_GL NULL -#define OPTION_VAL_4480X3360_GL NULL -#define OPTION_VAL_5120X3840_GL NULL -#define OPTION_VAL_5760X4320_GL NULL -#define OPTION_VAL_6400X4800_GL NULL -#define OPTION_VAL_7040X5280_GL NULL -#define OPTION_VAL_7680X5760_GL NULL -#define OPTION_VAL_8320X6240_GL NULL -#define OPTION_VAL_8960X6720_GL NULL -#define OPTION_VAL_9600X7200_GL NULL -#define OPTION_VAL_10240X7680_GL NULL -#define OPTION_VAL_10880X8160_GL NULL -#define OPTION_VAL_11520X8640_GL NULL -#define OPTION_VAL_12160X9120_GL NULL -#define OPTION_VAL_12800X9600_GL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_GL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_GL NULL -#define OPTION_VAL_VGA_GL NULL -#define OPTION_VAL_TV_RGB_GL NULL -#define OPTION_VAL_TV_COMPOSITE_GL NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_GL NULL -#define OPTION_VAL_NTSC_GL NULL -#define OPTION_VAL_PAL_GL NULL -#define OPTION_VAL_PAL_N_GL NULL -#define OPTION_VAL_PAL_M_GL NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_GL "Orientación da Pantalla" -#define OPTION_VAL_HORIZONTAL_GL NULL -#define OPTION_VAL_VERTICAL_GL NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_GL "Clasificación Alpha" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_GL "Por franxa (rápido, menos preciso)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_GL "Por triángulo (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_GL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_GL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_GL "É posible que se precisen valores máis altos para que as resolucións máis altas saian correctamente." -#define OPTION_VAL_512MB_GL NULL -#define OPTION_VAL_1GB_GL NULL -#define OPTION_VAL_2GB_GL NULL -#define OPTION_VAL_4GB_GL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_GL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_GL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_GL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_GL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_GL "Activa o buffer RTT (Render To Texture)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_GL NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_GL NULL -#define CORE_OPTION_NAME_FOG_LABEL_GL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_GL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_GL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_GL "Filtrado anisotrópico" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_GL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_GL "Filtrado de Texturas" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_GL NULL -#define OPTION_VAL_1_GL NULL -#define OPTION_VAL_2_GL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_GL "Intercambio de fotogramas con retardo" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_GL "Útil para evitar o parpadeo nas pantallas ou os vídeos con fallos. Non recomendado en plataformas lentas." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_GL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_GL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_GL "Filtrado de postprocesado PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_GL "Postproceso da imaxe renderizada para simular efectos específicos da PowerVR2 GPU e os sinais analóxicos de vídeo." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_GL "Aumento das texturas (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_GL "Millora dos gráficos 2D pixel art debuxados a man. Só se debería usar con xogos pixelados en 2D." -#define OPTION_VAL_2_O27_GL NULL -#define OPTION_VAL_4_GL NULL -#define OPTION_VAL_6_GL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_GL "Aumento da escala das texturas. Tamaño filtrado" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_GL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_GL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_GL "Renderizado de fíos" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_GL "Fai funcionar a GPU e a CPU en fíos diferentes. Altamente recomendado." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_GL "Salto de fotograma automático" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_GL "Automáticamente salta fotogramas cando o emulador está correndo lento. Nota: Esta opción só se aplica cando 'Renderizado por fíos' está activado." -#define OPTION_VAL_SOME_GL NULL -#define OPTION_VAL_MORE_GL "Máximo" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_GL "Salto de fotogramas" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_GL "Especifica o número de fotogramas para saltar entre cada fotograma que é mostrado." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_GL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_GL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_GL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_GL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_GL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_GL NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_GL NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_GL NULL -#define OPTION_VAL_100_GL NULL -#define OPTION_VAL_110_GL NULL -#define OPTION_VAL_120_GL NULL -#define OPTION_VAL_130_GL NULL -#define OPTION_VAL_140_GL NULL -#define OPTION_VAL_150_GL NULL -#define OPTION_VAL_160_GL NULL -#define OPTION_VAL_170_GL NULL -#define OPTION_VAL_180_GL NULL -#define OPTION_VAL_190_GL NULL -#define OPTION_VAL_200_GL NULL -#define OPTION_VAL_210_GL NULL -#define OPTION_VAL_220_GL NULL -#define OPTION_VAL_230_GL NULL -#define OPTION_VAL_240_GL NULL -#define OPTION_VAL_250_GL NULL -#define OPTION_VAL_260_GL NULL -#define OPTION_VAL_270_GL NULL -#define OPTION_VAL_280_GL NULL -#define OPTION_VAL_290_GL NULL -#define OPTION_VAL_300_GL NULL -#define OPTION_VAL_310_GL NULL -#define OPTION_VAL_320_GL NULL -#define OPTION_VAL_330_GL NULL -#define OPTION_VAL_340_GL NULL -#define OPTION_VAL_350_GL NULL -#define OPTION_VAL_360_GL NULL -#define OPTION_VAL_370_GL NULL -#define OPTION_VAL_380_GL NULL -#define OPTION_VAL_390_GL NULL -#define OPTION_VAL_400_GL NULL -#define OPTION_VAL_410_GL NULL -#define OPTION_VAL_420_GL NULL -#define OPTION_VAL_430_GL NULL -#define OPTION_VAL_440_GL NULL -#define OPTION_VAL_450_GL NULL -#define OPTION_VAL_460_GL NULL -#define OPTION_VAL_470_GL NULL -#define OPTION_VAL_480_GL NULL -#define OPTION_VAL_490_GL NULL -#define OPTION_VAL_500_GL NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_GL "Carga as texturas personalizadas" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_GL "Texturas de volcado" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_GL NULL -#define OPTION_VAL_0_GL NULL -#define OPTION_VAL_5_GL NULL -#define OPTION_VAL_10_GL NULL -#define OPTION_VAL_15_GL NULL -#define OPTION_VAL_20_GL NULL -#define OPTION_VAL_25_GL NULL -#define OPTION_VAL_30_GL NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_GL NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_GL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_GL "Pack Purupuru/Pack de vibración" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_GL "Activa a retroalimentación de forza do controlador." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_GL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_GL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_GL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_GL NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_GL NULL -#define OPTION_VAL_WHITE_GL "Branco" -#define OPTION_VAL_RED_GL "Vermello" -#define OPTION_VAL_GREEN_GL "Verde" -#define OPTION_VAL_BLUE_GL "Azul" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_GL NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_GL NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_GL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_GL "Unidades/sistemas de memoria visual (VMU) por xogo" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_GL "VMUs por xogo" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_GL "Cando se desactiva, todos os xogos comparten 4 arquivos de gardado VMU (A1, B1, C1, D1) localizados no directorio do sistema de RetroArch. O axuste \"VMU A1\" crea un único arquivo VMU \"A1\" no directorio de gardado de RetroArch para cada xogo que se inicie. A opción \"Todas as VMU\" crea 4 arquivos VMU únicos (A1, B1, C1, D1) para cada xogo que se inicie." -#define OPTION_VAL_VMU_A1_GL NULL -#define OPTION_VAL_ALL_VMUS_GL "Todas as VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_GL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_GL NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_GL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_GL "Amosa as opcións de pantalla da Unidade/Sistema de Memoria visual (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_GL "Amosa as opcións de pantalla da VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_GL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_GL "Pantalla 1 da VMU" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_GL "Posición da pantalla 1 VMU" -#define OPTION_VAL_UPPER_LEFT_GL "Superior esquerda" -#define OPTION_VAL_UPPER_RIGHT_GL "Superior dereita" -#define OPTION_VAL_LOWER_LEFT_GL "Inferior esquerda" -#define OPTION_VAL_LOWER_RIGHT_GL "Inferior dereita" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 1 VMU" -#define OPTION_VAL_1X_GL NULL -#define OPTION_VAL_3X_GL NULL -#define OPTION_VAL_5X_GL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 1 VMU" -#define OPTION_VAL_DEFAULT_ON_00_GL "Por defecto activado" -#define OPTION_VAL_DEFAULT_OFF_01_GL "Por defecto desactivado" -#define OPTION_VAL_BLACK_02_GL "Negro" -#define OPTION_VAL_LIGHT_BLUE_04_GL "Azul claro" -#define OPTION_VAL_CYAN_06_GL "Azul ceo" -#define OPTION_VAL_CYAN_BLUE_07_GL "Cián" -#define OPTION_VAL_LIGHT_GREEN_08_GL "Verde claro" -#define OPTION_VAL_CYAN_GREEN_09_GL "Cián Verde" -#define OPTION_VAL_LIGHT_CYAN_10_GL "Cián claro" -#define OPTION_VAL_PURPLE_12_GL "Malva" -#define OPTION_VAL_LIGHT_PURPLE_13_GL "Malva claro" -#define OPTION_VAL_YELLOW_14_GL "Amarelo" -#define OPTION_VAL_GRAY_15_GL "Gris" -#define OPTION_VAL_LIGHT_PURPLE_2_16_GL "Malva claro (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_GL "Verde claro (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_GL "Verde claro (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_GL "Cián claro (2)" -#define OPTION_VAL_LIGHT_RED_2_20_GL "Vermello claro (2)" -#define OPTION_VAL_MAGENTA_21_GL "Maxenta" -#define OPTION_VAL_LIGHT_PURPLE_3_22_GL "Malva claro (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_GL "Laranxa claro" -#define OPTION_VAL_ORANGE_24_GL "Laranxa" -#define OPTION_VAL_LIGHT_PURPLE_4_25_GL "Malva claro (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_GL "Amarelo claro" -#define OPTION_VAL_LIGHT_YELLOW_2_27_GL "Amarelo claro (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 1 VMU" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 1 VMU" -#define OPTION_VAL_40_GL NULL -#define OPTION_VAL_50_GL NULL -#define OPTION_VAL_60_GL NULL -#define OPTION_VAL_70_GL NULL -#define OPTION_VAL_80_GL NULL -#define OPTION_VAL_90_GL NULL -#define OPTION_VAL_100_O57_GL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_GL "Pantalla 2 da VMU" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_GL "Posición da pantalla 2 VMU" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 2 VMU" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 2 VMU" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 2 VMU" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 2 VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_GL "Pantalla 3 da VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_GL "Posición da pantalla 3 VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 3 VMU" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 3 VMU" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 3 VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 3 VMU" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_GL "Pantalla 4 da VMU" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_GL "Posición da pantalla 4 VMU" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 4 VMU" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 4 VMU" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 4 VMU" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 4 VMU" - -struct retro_core_option_v2_category option_cats_gl[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_GL, - CATEGORY_SYSTEM_INFO_0_GL - }, - { - "video", - CATEGORY_VIDEO_LABEL_GL, - CATEGORY_VIDEO_INFO_0_GL - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_GL, - CATEGORY_PERFORMANCE_INFO_0_GL - }, - { - "hacks", - CATEGORY_HACKS_LABEL_GL, - CATEGORY_HACKS_INFO_0_GL - }, - { - "input", - CATEGORY_INPUT_LABEL_GL, - CATEGORY_INPUT_INFO_0_GL - }, - { - "vmu", - CATEGORY_VMU_LABEL_GL, - CATEGORY_VMU_INFO_0_GL - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_gl[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_GL, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FI, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_GL }, - { "USA", OPTION_VAL_USA_GL }, - { "Europe", OPTION_VAL_EUROPE_GL }, - { "Default", OPTION_VAL_DEFAULT_GL }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_GL, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_GL, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_GL }, - { "English", OPTION_VAL_ENGLISH_GL }, - { "German", OPTION_VAL_GERMAN_GL }, - { "French", OPTION_VAL_FRENCH_GL }, - { "Spanish", OPTION_VAL_SPANISH_GL }, - { "Italian", OPTION_VAL_ITALIAN_GL }, - { "Default", OPTION_VAL_DEFAULT_GL }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_GL, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_GL, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_GL, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif - }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_GL, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_GL, - NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_GL, - NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, - { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_GL, - NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_GL, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, @@ -31093,186 +34133,577 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", }, { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_GL, - NULL, - CORE_OPTION_NAME_UPNP_INFO_0_GL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, - - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_GL, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FI, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_GL, + "", NULL, - "video", + "vmu", { - { "320x240", OPTION_VAL_320X240_GL }, - { "640x480", OPTION_VAL_640X480_GL }, - { "800x600", OPTION_VAL_800X600_GL }, - { "960x720", OPTION_VAL_960X720_GL }, - { "1024x768", OPTION_VAL_1024X768_GL }, - { "1280x960", OPTION_VAL_1280X960_GL }, - { "1440x1080", OPTION_VAL_1440X1080_GL }, - { "1600x1200", OPTION_VAL_1600X1200_GL }, - { "1920x1440", OPTION_VAL_1920X1440_GL }, - { "2560x1920", OPTION_VAL_2560X1920_GL }, - { "2880x2160", OPTION_VAL_2880X2160_GL }, - { "3200x2400", OPTION_VAL_3200X2400_GL }, - { "3840x2880", OPTION_VAL_3840X2880_GL }, - { "4480x3360", OPTION_VAL_4480X3360_GL }, - { "5120x3840", OPTION_VAL_5120X3840_GL }, - { "5760x4320", OPTION_VAL_5760X4320_GL }, - { "6400x4800", OPTION_VAL_6400X4800_GL }, - { "7040x5280", OPTION_VAL_7040X5280_GL }, - { "7680x5760", OPTION_VAL_7680X5760_GL }, - { "8320x6240", OPTION_VAL_8320X6240_GL }, - { "8960x6720", OPTION_VAL_8960X6720_GL }, - { "9600x7200", OPTION_VAL_9600X7200_GL }, - { "10240x7680", OPTION_VAL_10240X7680_GL }, - { "10880x8160", OPTION_VAL_10880X8160_GL }, - { "11520x8640", OPTION_VAL_11520X8640_GL }, - { "12160x9120", OPTION_VAL_12160X9120_GL }, - { "12800x9600", OPTION_VAL_12800X9600_GL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FI }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FI }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FI }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FI }, { NULL, NULL }, }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif + "Lower Right", }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_GL, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FI, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_GL, + "", NULL, - "video", + "vmu", { - { "VGA", OPTION_VAL_VGA_GL }, - { "TV (RGB)", OPTION_VAL_TV_RGB_GL }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_GL }, + { "1x", OPTION_VAL_1X_FI }, + { "2x", OPTION_VAL_2_O26_FI }, + { "3x", OPTION_VAL_3X_FI }, + { "4x", OPTION_VAL_4_FI }, + { "5x", OPTION_VAL_5X_FI }, { NULL, NULL }, }, - "TV (Composite)", + "1x", }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_GL, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FI, NULL, "", NULL, - "video", + "vmu", { - { "NTSC", OPTION_VAL_NTSC_GL }, - { "PAL", OPTION_VAL_PAL_GL }, - { "PAL_N", OPTION_VAL_PAL_N_GL }, - { "PAL_M", OPTION_VAL_PAL_M_GL }, - { "Default", OPTION_VAL_DEFAULT_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, - "NTSC", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_GL, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FI, NULL, "", NULL, - "video", + "vmu", { - { "horizontal", OPTION_VAL_HORIZONTAL_GL }, - { "vertical", OPTION_VAL_VERTICAL_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FI }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FI }, + { "BLACK 02", OPTION_VAL_BLACK_02_FI }, + { "BLUE 03", OPTION_VAL_BLUE_FI }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FI }, + { "GREEN 05", OPTION_VAL_GREEN_FI }, + { "CYAN 06", OPTION_VAL_CYAN_06_FI }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FI }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FI }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FI }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FI }, + { "RED 11", OPTION_VAL_RED_FI }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FI }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FI }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FI }, + { "GRAY 15", OPTION_VAL_GRAY_15_FI }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FI }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FI }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FI }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FI }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FI }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FI }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FI }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FI }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FI }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FI }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FI }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FI }, + { "WHITE 28", OPTION_VAL_WHITE_FI }, { NULL, NULL }, }, - "horizontal", + "DEFAULT_OFF 01", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_GL, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FI, NULL, "", NULL, - "video", + "vmu", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_GL }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_GL }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_GL }, -#endif - { NULL, NULL }, + { "10%", OPTION_VAL_10_FI }, + { "20%", OPTION_VAL_20_FI }, + { "30%", OPTION_VAL_30_FI }, + { "40%", OPTION_VAL_40_FI }, + { "50%", OPTION_VAL_50_FI }, + { "60%", OPTION_VAL_60_FI }, + { "70%", OPTION_VAL_70_FI }, + { "80%", OPTION_VAL_80_FI }, + { "90%", OPTION_VAL_90_FI }, + { "100%", OPTION_VAL_100_O45_FI }, + { NULL, NULL }, }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + "100%", }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_GL, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_fi = { + option_cats_fi, + option_defs_fi +}; + +/* RETRO_LANGUAGE_FR */ + +#define CATEGORY_SYSTEM_LABEL_FR "Système" +#define CATEGORY_SYSTEM_INFO_0_FR "Configurer les réglages de région, de langue, du BIOS et du matériel de base." +#define CATEGORY_VIDEO_LABEL_FR "Vidéo" +#define CATEGORY_VIDEO_INFO_0_FR "Configurez les réglages de résolution, de transparence indépendante de l'ordre et des effets visuels." +#define CATEGORY_PERFORMANCE_LABEL_FR "Performances" +#define CATEGORY_PERFORMANCE_INFO_0_FR "Configurer les réglages de rendu et de saut d'images." +#define CATEGORY_HACKS_LABEL_FR "Hacks d'émulation" +#define CATEGORY_HACKS_INFO_0_FR "Configurez les réglages de remplacements pour écrans larges, de vitesse de chargement des GD-ROM et de remplacement de textures." +#define CATEGORY_INPUT_LABEL_FR "Entrées" +#define CATEGORY_INPUT_INFO_0_FR "Configurer les réglages des manettes et pistolets." +#define CATEGORY_EXPANSIONS_LABEL_FR "Ports d'extension de la manette" +#define CATEGORY_EXPANSIONS_INFO_0_FR "Sélectionnez le périphérique (VMU, dispositif de vibration) branché dans chaque emplacement d'extension de la manette." +#define CATEGORY_VMU_LABEL_FR "Unité de mémoire visuelle (VMU)" +#define CATEGORY_VMU_INFO_0_FR "Configurer les réglages de fichiers de sauvegarde VMU par jeu et de visibilité des VMU à l'écran." +#define CORE_OPTION_NAME_REGION_LABEL_FR "Région" +#define OPTION_VAL_JAPAN_FR "Japon" +#define OPTION_VAL_USA_FR "États-Unis" +#define OPTION_VAL_EUROPE_FR NULL +#define OPTION_VAL_DEFAULT_FR "Par défaut" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_FR "Langue " +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_FR "Modifie la langue utilisée par le BIOS et par tous les jeux qui contiennent plusieurs langues." +#define OPTION_VAL_JAPANESE_FR "Japonais" +#define OPTION_VAL_ENGLISH_FR "Anglais" +#define OPTION_VAL_GERMAN_FR "Allemand" +#define OPTION_VAL_FRENCH_FR "Français" +#define OPTION_VAL_SPANISH_FR "Espagnol" +#define OPTION_VAL_ITALIAN_FR "Italien" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_FR "BIOS HLE (Redémarrage requis)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_FR "Forcer l'utilisation d'un BIOS en émulation de haut niveau." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FR "Démarrer sur le BIOS (Redémarrage requis)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FR "Démarrer directement sur le menu BIOS Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_FR "Activer le DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FR "Active l'émulation du DSP audio de la Dreamcast (processeur de signal numérique). Améliore la précision du son généré, mais augmente les exigences de performances." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FR "Autoriser les boutons de service d'arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FR "Active le bouton SERVICE pour les jeux d'arcade, pour entrer dans les paramètres de la borne." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FR "Définir les jeux NAOMI en Free Play" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FR "Modifier les réglages de pièces du jeu en mode gratuit." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_FR "Émulation de l'adaptateur haut débit" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FR "Émuler l'adaptateur haut débit Ethernet au lieu du modem. (Redémarrage requis)" +#define CORE_OPTION_NAME_UPNP_LABEL_FR "Activer l'UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_FR "Utilisez l'UPnP pour configurer automatiquement votre routeur Internet pour les jeux en ligne." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FR "Résolution interne" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FR "Modifier la résolution de rendu." +#define OPTION_VAL_320X240_FR "320x240 (Moitié)" +#define OPTION_VAL_640X480_FR "640x480 (Natif)" +#define OPTION_VAL_800X600_FR "800x600 (1,25x)" +#define OPTION_VAL_960X720_FR "960x720 (1,5x)" +#define OPTION_VAL_1024X768_FR "1024x768 (1,6x)" +#define OPTION_VAL_1280X960_FR "1280x960 (2x)" +#define OPTION_VAL_1440X1080_FR "1440x1080 (2,25x)" +#define OPTION_VAL_1600X1200_FR "1600x1200 (2,5x)" +#define OPTION_VAL_1920X1440_FR "1920x1440 (3x)" +#define OPTION_VAL_2560X1920_FR "2560x1920 (4x)" +#define OPTION_VAL_2880X2160_FR "2880x2160 (4,5x)" +#define OPTION_VAL_3200X2400_FR "3200x2400 (5x)" +#define OPTION_VAL_3840X2880_FR "3840x2880 (6x)" +#define OPTION_VAL_4480X3360_FR "4480x3360 (7x)" +#define OPTION_VAL_5120X3840_FR "5120x3840 (8x)" +#define OPTION_VAL_5760X4320_FR "5760x4320 (9x)" +#define OPTION_VAL_6400X4800_FR "6400x4800 (10x)" +#define OPTION_VAL_7040X5280_FR "7040x5280 (11x)" +#define OPTION_VAL_7680X5760_FR "7680x5760 (12x)" +#define OPTION_VAL_8320X6240_FR "8320x6240 (13x)" +#define OPTION_VAL_8960X6720_FR "8960x6720 (14x)" +#define OPTION_VAL_9600X7200_FR "9600x7200 (15x)" +#define OPTION_VAL_10240X7680_FR "10240x7680 (16x)" +#define OPTION_VAL_10880X8160_FR "10880x8160 (17x)" +#define OPTION_VAL_11520X8640_FR "11520x8640 (18x)" +#define OPTION_VAL_12160X9120_FR "12160x9120 (19x)" +#define OPTION_VAL_12800X9600_FR "12800x9600 (20x)" +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_FR "Type de câble" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FR "Le type de signal de sortie. 'TV (Composite)' est le plus largement pris en charge." +#define OPTION_VAL_VGA_FR NULL +#define OPTION_VAL_TV_RGB_FR "TV (RVB)" +#define OPTION_VAL_TV_COMPOSITE_FR NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_FR "Standard de diffusion" +#define OPTION_VAL_NTSC_FR NULL +#define OPTION_VAL_PAL_FR "PAL (Monde)" +#define OPTION_VAL_PAL_N_FR "PAL-N (Argentine, Paraguay, Uruguay)" +#define OPTION_VAL_PAL_M_FR "PAL-M (Brésil)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FR "Orientation de l'écran" +#define OPTION_VAL_HORIZONTAL_FR "Horizontale" +#define OPTION_VAL_VERTICAL_FR "Verticale" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FR "Tri alpha" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FR "Sélectionner comment les polygones transparents sont triés." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FR "Par bande (rapide, moins précis)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_FR "Par triangle (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_FR "Par pixel (précis, mais le plus lent)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FR "Taille du tampon d'accumulation des pixels" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FR "Des valeurs plus élevées peuvent être requises pour que les résolutions plus élevées s'affichent correctement." +#define OPTION_VAL_512MB_FR "512 Mo" +#define OPTION_VAL_1GB_FR "1 Go" +#define OPTION_VAL_2GB_FR "2 Go" +#define OPTION_VAL_4GB_FR "4 Go" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_FR "Calques transparents maximum" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FR "Des valeurs plus élevées peuvent être requises pour les scènes complexes." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FR "Émulation complète du framebuffer" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FR "Active l'émulation complète du framebuffer dans la VRAM. Ceci est utile pour les jeux qui lisent ou écrivent directement le framebuffer dans la VRAM. Lorsque cette option est activée, la résolution interne est forcée à 640x480 et les performances peuvent être sévèrement affectées." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FR "Activer la mémoire tampon du RTT (rendu vers texture)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FR "Copier les textures rendues depuis le processeur graphique vers la VRAM. Cette option est normalement activée pour les jeux qui en ont besoin. Lorsque cette option est activée, la mise à l'échelle du rendu des textures est désactivée et les performances peuvent être impactées." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_FR NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_FR "Lorsque cette option est activée, les textures utilisent une version plus petite d'elles-mêmes lorsqu'elles apparaissent plus loin, cela peut augmenter les performances et réduire le scintillement." +#define CORE_OPTION_NAME_FOG_LABEL_FR "Effets de brouillard" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FR "Modificateur du volume" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FR "Une fonctionnalité du processeur graphique de la Dreamcast qui est généralement utilisée par les jeux pour le rendu des ombres d'objets. Cette option devrait normalement être activée — l'impact sur les performances va généralement de minimal à négligeable." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FR "Filtrage anisotrope" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FR "Améliore la qualité des textures sur les surfaces qui sont à des angles de vue obliques par rapport à la caméra. Des valeurs plus élevées sont plus exigeantes sur le processeur graphique. Les modifications de ce réglage ne sont appliqués qu'après redémarrage." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FR "Filtrage des textures" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FR "Le mode de filtrage des textures à utiliser. Cela peut être utilisé pour forcer un certain mode de filtrage de texture sur toutes les textures pour obtenir une apparence plus nette (ou plus lisse) que par défaut. Les valeurs autres que celles par défaut peuvent causer divers problèmes de rendu. Les modifications de ce réglage ne sont appliquées qu'après redémarrage." +#define OPTION_VAL_1_FR "Forcer au plus proche" +#define OPTION_VAL_2_FR "Forcer linéaire" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FR "Retarder l'échange d'images" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FR "Utile pour éviter les écrans clignotants ou les vidéos buggées. Non recommandé sur les plates-formes lentes." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FR "Détecter les changements de fréquence d'images" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FR "Notifier l'interface lorsque la fréquence d’images interne change (par exemple, de 60 i/s à 30 i/s). Améliore la cadence des images dans les jeux qui fonctionnent à 30 i/s ou 20 i/s, mais devrait être désactivé pour les jeux avec des fréquences d'images (non stables) déverrouillées (Ecco the Dolphin, Unreal Tournament par exemple). Remarque : Indisponible lorsque 'Saut d'images automatique' est activé." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FR "Filtre de post-traitement PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FR "Post-traitement de l'image rendue pour simuler les effets spécifiques au processeur graphique PowerVR2 et aux signaux vidéo analogiques." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_FR "Agrandissement des textures (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FR "Améliorer les graphismes en pixels 2D dessinés à la main. Devrait être utilisé uniquement avec les jeux en 2D pixelisés." +#define OPTION_VAL_2_O26_FR "x2" +#define OPTION_VAL_4_FR "x4" +#define OPTION_VAL_6_FR "x6" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FR "Facteur maximal du filtre d'agrandissement de textures" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FR "Sélectionner une valeur de taille maximale pour les textures à agrandir, si la taille de la texture est supérieure à la valeur sélectionnée, elle ne sera pas redimensionnée." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FR "Interpolation de profondeur native" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FR "Aide pour la corruption de textures et les problèmes de profondeur sur les processeurs graphiques AMD. Peut aussi aider les processeurs graphiques Intel dans certains cas." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FR "Corriger les bords débordant à l'agrandissement" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FR "Aide avec le cas de débordement de textures lors de l'agrandissement. Désactiver cette option peut aider si les pixels se déforment lors de l'agrandissement dans les jeux 2D (MVC2, CVS, KOF, etc.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FR "Rendu sur plusieurs fils d'exécution" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FR "Fais tourner le processeur graphique et le processeur sur différents fils d'exécution. Fortement recommandé." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FR "Saut d'images automatique" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FR "Sauter automatiquement des images lorsque l'émulateur s'exécute lentement. Remarque : Cette option ne s'applique que lorsque 'Rendu sur plusieurs fils d'exécution' est activé." +#define OPTION_VAL_SOME_FR NULL +#define OPTION_VAL_MORE_FR "Maximal" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FR "Saut d'images" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FR "Définit le nombre d'images à sauter entre chaque image affichée." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FR "Cheats d'écran large (Redémarrage requis)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FR "Active les cheats qui permettent à certains jeux de s'afficher au format écran large." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FR "Hack d'écran large" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FR "Afficher un rendu de la géométrie en dehors du rapport d'aspect normal de 4:3. Peut produire des bugs graphiques dans les zones révélées." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FR "Chargement rapide des GD-ROM (inexact)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FR "Accélère le chargement des GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FR "Mod RAM Dreamcast 32 Mo" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FR "Active le mod RAM 32 Mo pour Dreamcast. Peut affecter la compatibilité" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_FR "Under/overclock processeur du SH4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_FR "Modifie la fréquence d'horloge du processeur principal du SH4 cadencé par défaut à 200 MHz. La diminuer peut aider les plates-formes lentes. L'augmenter peut améliorer la fréquence d'images pour certains jeux. À utiliser avec prudence." +#define OPTION_VAL_100_FR NULL +#define OPTION_VAL_110_FR NULL +#define OPTION_VAL_120_FR NULL +#define OPTION_VAL_130_FR NULL +#define OPTION_VAL_140_FR NULL +#define OPTION_VAL_150_FR NULL +#define OPTION_VAL_160_FR NULL +#define OPTION_VAL_170_FR NULL +#define OPTION_VAL_180_FR NULL +#define OPTION_VAL_190_FR NULL +#define OPTION_VAL_200_FR NULL +#define OPTION_VAL_210_FR NULL +#define OPTION_VAL_220_FR NULL +#define OPTION_VAL_230_FR NULL +#define OPTION_VAL_240_FR NULL +#define OPTION_VAL_250_FR NULL +#define OPTION_VAL_260_FR NULL +#define OPTION_VAL_270_FR NULL +#define OPTION_VAL_280_FR NULL +#define OPTION_VAL_290_FR NULL +#define OPTION_VAL_300_FR NULL +#define OPTION_VAL_310_FR NULL +#define OPTION_VAL_320_FR NULL +#define OPTION_VAL_330_FR NULL +#define OPTION_VAL_340_FR NULL +#define OPTION_VAL_350_FR NULL +#define OPTION_VAL_360_FR NULL +#define OPTION_VAL_370_FR NULL +#define OPTION_VAL_380_FR NULL +#define OPTION_VAL_390_FR NULL +#define OPTION_VAL_400_FR NULL +#define OPTION_VAL_410_FR NULL +#define OPTION_VAL_420_FR NULL +#define OPTION_VAL_430_FR NULL +#define OPTION_VAL_440_FR NULL +#define OPTION_VAL_450_FR NULL +#define OPTION_VAL_460_FR NULL +#define OPTION_VAL_470_FR NULL +#define OPTION_VAL_480_FR NULL +#define OPTION_VAL_490_FR NULL +#define OPTION_VAL_500_FR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FR "Charger les textures personnalisées" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FR "Charger les textures personnalisées situées dans le dossier 'system/dc/textures//'." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FR "Importer les textures" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FR "Chaque fois qu'une nouvelle texture est utilisée par le jeu, elle sera sauvegardée en tant que fichier .png dans le dossier 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FR "Deadzone du stick analogique" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FR "Sélectionner la distance à laquelle vous devez pousser le stick analogique avant que ne commence son traitement." +#define OPTION_VAL_0_FR NULL +#define OPTION_VAL_5_FR NULL +#define OPTION_VAL_10_FR NULL +#define OPTION_VAL_15_FR NULL +#define OPTION_VAL_20_FR NULL +#define OPTION_VAL_25_FR NULL +#define OPTION_VAL_30_FR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FR "Deadzone des gâchettes" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FR "Sélectionner combien vous devez appuyer sur la gâchette avant que ne commence son traitement." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FR "Gâchettes numériques" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FR "Lorsque cette option est activée, les gâchettes agiront comme des touches normales, ce qui signifie qu'elles seront traités comme étant entièrement pressées ou pas du tout, sans aucun intermédiaire." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FR "Diffuser les sorties numériques" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FR "Diffuser les sorties numériques et l'état du retour de force sur le port TCP 8000. Compatible avec l'option de MAME \"-output network\" ." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FR "Afficher les réglages du pistolet" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FR "Activer la configuration des options d'affichage du viseur des pistolets. REMARQUE : le menu rapide devrait être réouvert pour que ce paramètre prenne effet." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FR "Mise à l'échelle du viseur de pistolet" +#define OPTION_VAL_50_FR NULL +#define OPTION_VAL_60_FR NULL +#define OPTION_VAL_70_FR NULL +#define OPTION_VAL_80_FR NULL +#define OPTION_VAL_90_FR NULL +#define OPTION_VAL_100_O45_FR NULL +#define OPTION_VAL_110_O45_FR NULL +#define OPTION_VAL_120_O45_FR NULL +#define OPTION_VAL_130_O45_FR NULL +#define OPTION_VAL_140_O45_FR NULL +#define OPTION_VAL_150_O45_FR NULL +#define OPTION_VAL_160_O45_FR NULL +#define OPTION_VAL_170_O45_FR NULL +#define OPTION_VAL_180_O45_FR NULL +#define OPTION_VAL_190_O45_FR NULL +#define OPTION_VAL_200_O45_FR NULL +#define OPTION_VAL_210_O45_FR NULL +#define OPTION_VAL_220_O45_FR NULL +#define OPTION_VAL_230_O45_FR NULL +#define OPTION_VAL_240_O45_FR NULL +#define OPTION_VAL_250_O45_FR NULL +#define OPTION_VAL_260_O45_FR NULL +#define OPTION_VAL_270_O45_FR NULL +#define OPTION_VAL_280_O45_FR NULL +#define OPTION_VAL_290_O45_FR NULL +#define OPTION_VAL_300_O45_FR NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 1" +#define OPTION_VAL_WHITE_FR "Blanc" +#define OPTION_VAL_RED_FR "Rouge" +#define OPTION_VAL_GREEN_FR "Vert" +#define OPTION_VAL_BLUE_FR "Bleu" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FR "Afficher le viseur du pistolet 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FR "Périphérique dans le port d'extension A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension A1 (port A emplacement 1)." +#define OPTION_VAL_VMU_FR NULL +#define OPTION_VAL_PURUPURU_FR NULL +#define OPTION_VAL_NONE_FR "Ne pas partager" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FR "Périphérique dans le port d'extension A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension A2 (port A emplacement 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FR "Périphérique dans le port d'extension B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension B1 (port B emplacement 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FR "Périphérique dans le port d'extension B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension B2 (port B emplacement 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FR "Périphérique dans le port d'extension C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension C1 (port C emplacement 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FR "Périphérique dans le port d'extension C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension C2 (port C emplacement 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FR "Périphérique dans le port d'extension D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension D1 (port D emplacement 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FR "Périphérique dans le port d'extension D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FR "Sélectionner le périphérique branché dans le port d'extension D2 (port D emplacement 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FR "Unités/systèmes de mémoire visuelle par jeu (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FR "VMU par jeu" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FR "Lorsque cette option est désactivée, tous les jeux partagent jusqu'à 8 fichiers de sauvegarde VMU (A1/A2/B1/B2/C1/D1/D1/D2) situés dans le dossier system de RetroArch.\nLe réglage 'VMU A1' crée un fichier VMU 'A1' unique dans le dossier de sauvegarde de RetroArch pour chaque jeu qui est lancé.\nLe réglage 'Toutes les VMU' crée jusqu'à 8 fichiers VMU uniques (A1/A2/B1/B2/C1/C2/D1/D2) pour chaque jeu qui est lancé." +#define OPTION_VAL_VMU_A1_FR NULL +#define OPTION_VAL_ALL_VMUS_FR "Tous les VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_FR "Sons des unités/systèmes de mémoire visuelle (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FR "Sons des VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_FR "Si cette option est activée, les bips des VMU sont joués." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FR "Afficher les réglage d'affichage de l'unité/système de mémoire visuelle (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FR "Afficher les réglages d'affichage du VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FR "Activer la configuration de la visibilité, de la taille, de la position et de la couleur de l'écran du VMU émulé. REMARQUE : Le menu rapide devrait être réouvert pour que ce réglage prenne effet." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 1" +#define OPTION_VAL_UPPER_LEFT_FR "En haut à gauche" +#define OPTION_VAL_UPPER_RIGHT_FR "En haut à droite" +#define OPTION_VAL_LOWER_LEFT_FR "En bas à gauche" +#define OPTION_VAL_LOWER_RIGHT_FR "En bas à droite" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 1" +#define OPTION_VAL_1X_FR "x1" +#define OPTION_VAL_3X_FR "x3" +#define OPTION_VAL_5X_FR "x5" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 1" +#define OPTION_VAL_DEFAULT_ON_00_FR "Par défaut activé" +#define OPTION_VAL_DEFAULT_OFF_01_FR "Par défaut désactivé" +#define OPTION_VAL_BLACK_02_FR "Noire" +#define OPTION_VAL_LIGHT_BLUE_04_FR "Bleu clair" +#define OPTION_VAL_CYAN_06_FR NULL +#define OPTION_VAL_CYAN_BLUE_07_FR "Bleu cyan" +#define OPTION_VAL_LIGHT_GREEN_08_FR "Vert clair" +#define OPTION_VAL_CYAN_GREEN_09_FR "Vert cyan" +#define OPTION_VAL_LIGHT_CYAN_10_FR "Cyan clair" +#define OPTION_VAL_PURPLE_12_FR "Violette" +#define OPTION_VAL_LIGHT_PURPLE_13_FR "Violet clair" +#define OPTION_VAL_YELLOW_14_FR "Jaune" +#define OPTION_VAL_GRAY_15_FR "Grise" +#define OPTION_VAL_LIGHT_PURPLE_2_16_FR "Violet clair (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_FR "Vert clair (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_FR "Vert clair (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_FR "Cyan clair (2)" +#define OPTION_VAL_LIGHT_RED_2_20_FR "Rouge clair (2)" +#define OPTION_VAL_MAGENTA_21_FR NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_FR "Violet clair (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_FR "Orange clair" +#define OPTION_VAL_ORANGE_24_FR NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_FR "Violet clair (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_FR "Jaune clair" +#define OPTION_VAL_LIGHT_YELLOW_2_27_FR "Jaune clair (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 1" +#define OPTION_VAL_40_FR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FR "Affichage de l'écran du VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FR "Position de l'écran du VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FR "Taille de l'écran du VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FR "Couleur des pixels allumés de l'écran du VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FR "Couleur des pixels éteints de l'écran du VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FR "Opacité de l'écran du VMU 4" + +struct retro_core_option_v2_category option_cats_fr[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_FR, + CATEGORY_SYSTEM_INFO_0_FR + }, + { + "video", + CATEGORY_VIDEO_LABEL_FR, + CATEGORY_VIDEO_INFO_0_FR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_FR, + CATEGORY_PERFORMANCE_INFO_0_FR + }, + { + "hacks", + CATEGORY_HACKS_LABEL_FR, + CATEGORY_HACKS_INFO_0_FR + }, + { + "input", + CATEGORY_INPUT_LABEL_FR, + CATEGORY_INPUT_INFO_0_FR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_FR, + CATEGORY_EXPANSIONS_INFO_0_FR + }, + { + "vmu", + CATEGORY_VMU_LABEL_FR, + CATEGORY_VMU_INFO_0_FR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_fr[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_FR, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_GL, + "", NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_GL }, - { "1GB", OPTION_VAL_1GB_GL }, - { "2GB", OPTION_VAL_2GB_GL }, - { "4GB", OPTION_VAL_4GB_GL }, + { "Japan", OPTION_VAL_JAPAN_FR }, + { "USA", OPTION_VAL_USA_FR }, + { "Europe", OPTION_VAL_EUROPE_FR }, + { "Default", OPTION_VAL_DEFAULT_FR }, { NULL, NULL }, }, - "512MB", + "USA", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_GL, + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_FR, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_GL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_FR, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "Japanese", OPTION_VAL_JAPANESE_FR }, + { "English", OPTION_VAL_ENGLISH_FR }, + { "German", OPTION_VAL_GERMAN_FR }, + { "French", OPTION_VAL_FRENCH_FR }, + { "Spanish", OPTION_VAL_SPANISH_FR }, + { "Italian", OPTION_VAL_ITALIAN_FR }, + { "Default", OPTION_VAL_DEFAULT_FR }, { NULL, NULL }, }, - "32", + "English", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_GL, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_FR, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_GL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_FR, NULL, - "video", + "system", { - { "disabled", NULL }, + { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { NULL, NULL}, }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_GL, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_FR, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_GL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_FR, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -31280,41 +34711,45 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_GL, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_FR, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END + "disabled", +#else "enabled", +#endif }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_GL, + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_FR, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_GL, + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_FR, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_GL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_FR, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -31323,117 +34758,362 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "enabled", }, { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_GL, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_FR, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_GL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_FR, NULL, - "video", + "system", { - { "off", "disabled" }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "4", + "disabled", }, { - CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_GL, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_FR, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_GL, + CORE_OPTION_NAME_UPNP_INFO_0_FR, NULL, - "video", + "system", { - { "0", OPTION_VAL_DEFAULT_GL }, - { "1", OPTION_VAL_1_GL }, - { "2", OPTION_VAL_2_GL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "0", + "enabled", }, + { - CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_GL, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_FR, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_GL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_FR, NULL, "video", { - { "disabled", NULL }, - { "enabled", NULL }, + { "320x240", OPTION_VAL_320X240_FR }, + { "640x480", OPTION_VAL_640X480_FR }, + { "800x600", OPTION_VAL_800X600_FR }, + { "960x720", OPTION_VAL_960X720_FR }, + { "1024x768", OPTION_VAL_1024X768_FR }, + { "1280x960", OPTION_VAL_1280X960_FR }, + { "1440x1080", OPTION_VAL_1440X1080_FR }, + { "1600x1200", OPTION_VAL_1600X1200_FR }, + { "1920x1440", OPTION_VAL_1920X1440_FR }, + { "2560x1920", OPTION_VAL_2560X1920_FR }, + { "2880x2160", OPTION_VAL_2880X2160_FR }, + { "3200x2400", OPTION_VAL_3200X2400_FR }, + { "3840x2880", OPTION_VAL_3840X2880_FR }, + { "4480x3360", OPTION_VAL_4480X3360_FR }, + { "5120x3840", OPTION_VAL_5120X3840_FR }, + { "5760x4320", OPTION_VAL_5760X4320_FR }, + { "6400x4800", OPTION_VAL_6400X4800_FR }, + { "7040x5280", OPTION_VAL_7040X5280_FR }, + { "7680x5760", OPTION_VAL_7680X5760_FR }, + { "8320x6240", OPTION_VAL_8320X6240_FR }, + { "8960x6720", OPTION_VAL_8960X6720_FR }, + { "9600x7200", OPTION_VAL_9600X7200_FR }, + { "10240x7680", OPTION_VAL_10240X7680_FR }, + { "10880x8160", OPTION_VAL_10880X8160_FR }, + { "11520x8640", OPTION_VAL_11520X8640_FR }, + { "12160x9120", OPTION_VAL_12160X9120_FR }, + { "12800x9600", OPTION_VAL_12800X9600_FR }, { NULL, NULL }, }, - "disabled", +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif }, { - CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_GL, + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_FR, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_GL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_FR, NULL, "video", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VGA", OPTION_VAL_VGA_FR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_FR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_FR }, { NULL, NULL }, }, - "disabled", + "TV (Composite)", }, { - CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_GL, + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_FR, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_GL, + "", NULL, "video", { - { "disabled", NULL }, - { "enabled", NULL }, + { "NTSC", OPTION_VAL_NTSC_FR }, + { "PAL", OPTION_VAL_PAL_FR }, + { "PAL_N", OPTION_VAL_PAL_N_FR }, + { "PAL_M", OPTION_VAL_PAL_M_FR }, + { "Default", OPTION_VAL_DEFAULT_FR }, { NULL, NULL }, }, - "disabled", + "NTSC", }, -#ifdef _OPENMP { - CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_GL, + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_FR, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_GL, + "", NULL, "video", { - { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_GL }, - { "4", OPTION_VAL_4_GL }, - { "6", OPTION_VAL_6_GL }, + { "horizontal", OPTION_VAL_HORIZONTAL_FR }, + { "vertical", OPTION_VAL_VERTICAL_FR }, { NULL, NULL }, }, - "1", + "horizontal", }, - {/* TODO: needs clarification */ - CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_GL, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_FR, NULL, "video", { - { "256", NULL }, - { "512", NULL }, - { "1024", NULL }, - { NULL, NULL }, - }, - "256", - }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_FR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_FR }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_FR }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_FR, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_FR, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_FR }, + { "1GB", OPTION_VAL_1GB_FR }, + { "2GB", OPTION_VAL_2GB_FR }, + { "4GB", OPTION_VAL_4GB_FR }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_FR, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_FR, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_FR, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_FR, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_FR, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_FR, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_FR, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_FR, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_FR, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_FR, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_FR, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_FR }, + { "1", OPTION_VAL_1_FR }, + { "2", OPTION_VAL_2_FR }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_FR, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_detect_vsync_swap_interval", + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_FR, + NULL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_pvr2_filtering", + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_FR, + NULL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, +#ifdef _OPENMP + { + CORE_OPTION_NAME "_texupscale", + CORE_OPTION_NAME_TEXUPSCALE_LABEL_FR, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_FR, + NULL, + "video", + { + { "1", "disabled" }, + { "2", OPTION_VAL_2_O26_FR }, + { "4", OPTION_VAL_4_FR }, + { "6", OPTION_VAL_6_FR }, + { NULL, NULL }, + }, + "1", + }, + { + CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_FR, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_FR, + NULL, + "video", + { + { "256", NULL }, + { "512", NULL }, + { "1024", NULL }, + { NULL, NULL }, + }, + "256", + }, #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_GL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_FR, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_GL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_FR, NULL, "video", { @@ -31443,11 +35123,25 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_FR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_FR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_GL, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_FR, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_GL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_FR, NULL, "performance", { @@ -31459,15 +35153,15 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_GL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_FR, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_GL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_FR, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_GL }, - { "more", OPTION_VAL_MORE_GL }, + { "some", OPTION_VAL_SOME_FR }, + { "more", OPTION_VAL_MORE_FR }, { NULL, NULL }, }, #ifdef LOW_END @@ -31478,9 +35172,9 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_GL, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_FR, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_GL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_FR, NULL, "performance", { @@ -31497,9 +35191,9 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_GL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_FR, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_GL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_FR, NULL, "hacks", { @@ -31511,9 +35205,9 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_GL, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_FR, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_GL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_FR, NULL, "hacks", { @@ -31525,9 +35219,9 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_GL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_FR, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_GL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_FR, NULL, "hacks", { @@ -31541,64 +35235,78 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_FR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_FR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_GL, + CORE_OPTION_NAME_SH4CLOCK_LABEL_FR, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_GL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_FR, NULL, "hacks", { - { "100", OPTION_VAL_100_GL }, - { "110", OPTION_VAL_110_GL }, - { "120", OPTION_VAL_120_GL }, - { "130", OPTION_VAL_130_GL }, - { "140", OPTION_VAL_140_GL }, - { "150", OPTION_VAL_150_GL }, - { "160", OPTION_VAL_160_GL }, - { "170", OPTION_VAL_170_GL }, - { "180", OPTION_VAL_180_GL }, - { "190", OPTION_VAL_190_GL }, - { "200", OPTION_VAL_200_GL }, - { "210", OPTION_VAL_210_GL }, - { "220", OPTION_VAL_220_GL }, - { "230", OPTION_VAL_230_GL }, - { "240", OPTION_VAL_240_GL }, - { "250", OPTION_VAL_250_GL }, - { "260", OPTION_VAL_260_GL }, - { "270", OPTION_VAL_270_GL }, - { "280", OPTION_VAL_280_GL }, - { "290", OPTION_VAL_290_GL }, - { "300", OPTION_VAL_300_GL }, - { "310", OPTION_VAL_310_GL }, - { "320", OPTION_VAL_320_GL }, - { "330", OPTION_VAL_330_GL }, - { "340", OPTION_VAL_340_GL }, - { "350", OPTION_VAL_350_GL }, - { "360", OPTION_VAL_360_GL }, - { "370", OPTION_VAL_370_GL }, - { "380", OPTION_VAL_380_GL }, - { "390", OPTION_VAL_390_GL }, - { "400", OPTION_VAL_400_GL }, - { "410", OPTION_VAL_410_GL }, - { "420", OPTION_VAL_420_GL }, - { "430", OPTION_VAL_430_GL }, - { "440", OPTION_VAL_440_GL }, - { "450", OPTION_VAL_450_GL }, - { "460", OPTION_VAL_460_GL }, - { "470", OPTION_VAL_470_GL }, - { "480", OPTION_VAL_480_GL }, - { "490", OPTION_VAL_490_GL }, - { "500", OPTION_VAL_500_GL }, + { "100", OPTION_VAL_100_FR }, + { "110", OPTION_VAL_110_FR }, + { "120", OPTION_VAL_120_FR }, + { "130", OPTION_VAL_130_FR }, + { "140", OPTION_VAL_140_FR }, + { "150", OPTION_VAL_150_FR }, + { "160", OPTION_VAL_160_FR }, + { "170", OPTION_VAL_170_FR }, + { "180", OPTION_VAL_180_FR }, + { "190", OPTION_VAL_190_FR }, + { "200", OPTION_VAL_200_FR }, + { "210", OPTION_VAL_210_FR }, + { "220", OPTION_VAL_220_FR }, + { "230", OPTION_VAL_230_FR }, + { "240", OPTION_VAL_240_FR }, + { "250", OPTION_VAL_250_FR }, + { "260", OPTION_VAL_260_FR }, + { "270", OPTION_VAL_270_FR }, + { "280", OPTION_VAL_280_FR }, + { "290", OPTION_VAL_290_FR }, + { "300", OPTION_VAL_300_FR }, + { "310", OPTION_VAL_310_FR }, + { "320", OPTION_VAL_320_FR }, + { "330", OPTION_VAL_330_FR }, + { "340", OPTION_VAL_340_FR }, + { "350", OPTION_VAL_350_FR }, + { "360", OPTION_VAL_360_FR }, + { "370", OPTION_VAL_370_FR }, + { "380", OPTION_VAL_380_FR }, + { "390", OPTION_VAL_390_FR }, + { "400", OPTION_VAL_400_FR }, + { "410", OPTION_VAL_410_FR }, + { "420", OPTION_VAL_420_FR }, + { "430", OPTION_VAL_430_FR }, + { "440", OPTION_VAL_440_FR }, + { "450", OPTION_VAL_450_FR }, + { "460", OPTION_VAL_460_FR }, + { "470", OPTION_VAL_470_FR }, + { "480", OPTION_VAL_480_FR }, + { "490", OPTION_VAL_490_FR }, + { "500", OPTION_VAL_500_FR }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_GL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_FR, NULL, "hacks", { @@ -31608,11 +35316,11 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_GL, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_FR, NULL, "hacks", { @@ -31624,47 +35332,47 @@ struct retro_core_option_v2_definition option_defs_gl[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_GL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_FR, NULL, "input", { - { "0%", OPTION_VAL_0_GL }, - { "5%", OPTION_VAL_5_GL }, - { "10%", OPTION_VAL_10_GL }, - { "15%", OPTION_VAL_15_GL }, - { "20%", OPTION_VAL_20_GL }, - { "25%", OPTION_VAL_25_GL }, - { "30%", OPTION_VAL_30_GL }, + { "0%", OPTION_VAL_0_FR }, + { "5%", OPTION_VAL_5_FR }, + { "10%", OPTION_VAL_10_FR }, + { "15%", OPTION_VAL_15_FR }, + { "20%", OPTION_VAL_20_FR }, + { "25%", OPTION_VAL_25_FR }, + { "30%", OPTION_VAL_30_FR }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_GL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_FR, NULL, "input", { - { "0%", OPTION_VAL_0_GL }, - { "5%", OPTION_VAL_5_GL }, - { "10%", OPTION_VAL_10_GL }, - { "15%", OPTION_VAL_15_GL }, - { "20%", OPTION_VAL_20_GL }, - { "25%", OPTION_VAL_25_GL }, - { "30%", OPTION_VAL_30_GL }, + { "0%", OPTION_VAL_0_FR }, + { "5%", OPTION_VAL_5_FR }, + { "10%", OPTION_VAL_10_FR }, + { "15%", OPTION_VAL_15_FR }, + { "20%", OPTION_VAL_20_FR }, + { "25%", OPTION_VAL_25_FR }, + { "30%", OPTION_VAL_30_FR }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_GL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_FR, NULL, "input", { @@ -31675,10 +35383,10 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_GL, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_FR, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_GL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_FR, NULL, "input", { @@ -31686,300 +35394,293 @@ struct retro_core_option_v2_definition option_defs_gl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_GL, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_FR, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_GL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_FR, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_GL, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_FR, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_GL, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_FR }, + { "60%", OPTION_VAL_60_FR }, + { "70%", OPTION_VAL_70_FR }, + { "80%", OPTION_VAL_80_FR }, + { "90%", OPTION_VAL_90_FR }, + { "100%", OPTION_VAL_100_O45_FR }, + { "110%", OPTION_VAL_110_O45_FR }, + { "120%", OPTION_VAL_120_O45_FR }, + { "130%", OPTION_VAL_130_O45_FR }, + { "140%", OPTION_VAL_140_O45_FR }, + { "150%", OPTION_VAL_150_O45_FR }, + { "160%", OPTION_VAL_160_O45_FR }, + { "170%", OPTION_VAL_170_O45_FR }, + { "180%", OPTION_VAL_180_O45_FR }, + { "190%", OPTION_VAL_190_O45_FR }, + { "200%", OPTION_VAL_200_O45_FR }, + { "210%", OPTION_VAL_210_O45_FR }, + { "220%", OPTION_VAL_220_O45_FR }, + { "230%", OPTION_VAL_230_O45_FR }, + { "240%", OPTION_VAL_240_O45_FR }, + { "250%", OPTION_VAL_250_O45_FR }, + { "260%", OPTION_VAL_260_O45_FR }, + { "270%", OPTION_VAL_270_O45_FR }, + { "280%", OPTION_VAL_280_O45_FR }, + { "290%", OPTION_VAL_290_O45_FR }, + { "300%", OPTION_VAL_300_O45_FR }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_GL, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_FR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_GL }, - { "Red", OPTION_VAL_RED_GL }, - { "Green", OPTION_VAL_GREEN_GL }, - { "Blue", OPTION_VAL_BLUE_GL }, + { "White", OPTION_VAL_WHITE_FR }, + { "Red", OPTION_VAL_RED_FR }, + { "Green", OPTION_VAL_GREEN_FR }, + { "Blue", OPTION_VAL_BLUE_FR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_GL, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_FR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_GL }, - { "Red", OPTION_VAL_RED_GL }, - { "Green", OPTION_VAL_GREEN_GL }, - { "Blue", OPTION_VAL_BLUE_GL }, + { "White", OPTION_VAL_WHITE_FR }, + { "Red", OPTION_VAL_RED_FR }, + { "Green", OPTION_VAL_GREEN_FR }, + { "Blue", OPTION_VAL_BLUE_FR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_GL, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_FR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_GL }, - { "Red", OPTION_VAL_RED_GL }, - { "Green", OPTION_VAL_GREEN_GL }, - { "Blue", OPTION_VAL_BLUE_GL }, + { "White", OPTION_VAL_WHITE_FR }, + { "Red", OPTION_VAL_RED_FR }, + { "Green", OPTION_VAL_GREEN_FR }, + { "Blue", OPTION_VAL_BLUE_FR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_GL, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_FR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_GL }, - { "Red", OPTION_VAL_RED_GL }, - { "Green", OPTION_VAL_GREEN_GL }, - { "Blue", OPTION_VAL_BLUE_GL }, + { "White", OPTION_VAL_WHITE_FR }, + { "Red", OPTION_VAL_RED_FR }, + { "Green", OPTION_VAL_GREEN_FR }, + { "Blue", OPTION_VAL_BLUE_FR }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_GL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_GL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_GL, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_FR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_FR, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_GL }, - { "All VMUs", OPTION_VAL_ALL_VMUS_GL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_GL, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_GL, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_GL, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_FR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_FR, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_GL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_GL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_GL, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_FR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_FR, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_GL, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_FR, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_GL, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_FR, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_GL, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_FR, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_GL }, - { "2x", OPTION_VAL_2_O27_GL }, - { "3x", OPTION_VAL_3X_GL }, - { "4x", OPTION_VAL_4_GL }, - { "5x", OPTION_VAL_5X_GL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_GL, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_FR, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_GL, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_FR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_FR, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "VMU", OPTION_VAL_VMU_FR }, + { "Purupuru", OPTION_VAL_PURUPURU_FR }, + { "None", OPTION_VAL_NONE_FR }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_GL, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_FR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_FR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_FR, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_FR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_FR }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_FR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_FR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_FR, NULL, "vmu", { - { "10%", OPTION_VAL_10_GL }, - { "20%", OPTION_VAL_20_GL }, - { "30%", OPTION_VAL_30_GL }, - { "40%", OPTION_VAL_40_GL }, - { "50%", OPTION_VAL_50_GL }, - { "60%", OPTION_VAL_60_GL }, - { "70%", OPTION_VAL_70_GL }, - { "80%", OPTION_VAL_80_GL }, - { "90%", OPTION_VAL_90_GL }, - { "100%", OPTION_VAL_100_O57_GL }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_GL, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_FR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_FR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_FR, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_FR, NULL, "", NULL, @@ -31992,145 +35693,145 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_GL, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_FR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_GL, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_FR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_GL }, - { "2x", OPTION_VAL_2_O27_GL }, - { "3x", OPTION_VAL_3X_GL }, - { "4x", OPTION_VAL_4_GL }, - { "5x", OPTION_VAL_5X_GL }, + { "1x", OPTION_VAL_1X_FR }, + { "2x", OPTION_VAL_2_O26_FR }, + { "3x", OPTION_VAL_3X_FR }, + { "4x", OPTION_VAL_4_FR }, + { "5x", OPTION_VAL_5X_FR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_GL, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_FR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_GL }, - { "20%", OPTION_VAL_20_GL }, - { "30%", OPTION_VAL_30_GL }, - { "40%", OPTION_VAL_40_GL }, - { "50%", OPTION_VAL_50_GL }, - { "60%", OPTION_VAL_60_GL }, - { "70%", OPTION_VAL_70_GL }, - { "80%", OPTION_VAL_80_GL }, - { "90%", OPTION_VAL_90_GL }, - { "100%", OPTION_VAL_100_O57_GL }, + { "10%", OPTION_VAL_10_FR }, + { "20%", OPTION_VAL_20_FR }, + { "30%", OPTION_VAL_30_FR }, + { "40%", OPTION_VAL_40_FR }, + { "50%", OPTION_VAL_50_FR }, + { "60%", OPTION_VAL_60_FR }, + { "70%", OPTION_VAL_70_FR }, + { "80%", OPTION_VAL_80_FR }, + { "90%", OPTION_VAL_90_FR }, + { "100%", OPTION_VAL_100_O45_FR }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_GL, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_FR, NULL, "", NULL, @@ -32143,145 +35844,145 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_GL, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_FR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_GL, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_FR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_GL }, - { "2x", OPTION_VAL_2_O27_GL }, - { "3x", OPTION_VAL_3X_GL }, - { "4x", OPTION_VAL_4_GL }, - { "5x", OPTION_VAL_5X_GL }, + { "1x", OPTION_VAL_1X_FR }, + { "2x", OPTION_VAL_2_O26_FR }, + { "3x", OPTION_VAL_3X_FR }, + { "4x", OPTION_VAL_4_FR }, + { "5x", OPTION_VAL_5X_FR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_GL, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_FR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_GL }, - { "20%", OPTION_VAL_20_GL }, - { "30%", OPTION_VAL_30_GL }, - { "40%", OPTION_VAL_40_GL }, - { "50%", OPTION_VAL_50_GL }, - { "60%", OPTION_VAL_60_GL }, - { "70%", OPTION_VAL_70_GL }, - { "80%", OPTION_VAL_80_GL }, - { "90%", OPTION_VAL_90_GL }, - { "100%", OPTION_VAL_100_O57_GL }, + { "10%", OPTION_VAL_10_FR }, + { "20%", OPTION_VAL_20_FR }, + { "30%", OPTION_VAL_30_FR }, + { "40%", OPTION_VAL_40_FR }, + { "50%", OPTION_VAL_50_FR }, + { "60%", OPTION_VAL_60_FR }, + { "70%", OPTION_VAL_70_FR }, + { "80%", OPTION_VAL_80_FR }, + { "90%", OPTION_VAL_90_FR }, + { "100%", OPTION_VAL_100_O45_FR }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_GL, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_FR, NULL, "", NULL, @@ -32294,534 +35995,726 @@ struct retro_core_option_v2_definition option_defs_gl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_GL, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_FR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_GL, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_FR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_GL }, - { "2x", OPTION_VAL_2_O27_GL }, - { "3x", OPTION_VAL_3X_GL }, - { "4x", OPTION_VAL_4_GL }, - { "5x", OPTION_VAL_5X_GL }, + { "1x", OPTION_VAL_1X_FR }, + { "2x", OPTION_VAL_2_O26_FR }, + { "3x", OPTION_VAL_3X_FR }, + { "4x", OPTION_VAL_4_FR }, + { "5x", OPTION_VAL_5X_FR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_GL, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_FR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, - { "BLACK 02", OPTION_VAL_BLACK_02_GL }, - { "BLUE 03", OPTION_VAL_BLUE_GL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, - { "GREEN 05", OPTION_VAL_GREEN_GL }, - { "CYAN 06", OPTION_VAL_CYAN_06_GL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, - { "RED 11", OPTION_VAL_RED_GL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, - { "GRAY 15", OPTION_VAL_GRAY_15_GL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, - { "WHITE 28", OPTION_VAL_WHITE_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_GL, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_FR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_GL }, - { "20%", OPTION_VAL_20_GL }, - { "30%", OPTION_VAL_30_GL }, - { "40%", OPTION_VAL_40_GL }, - { "50%", OPTION_VAL_50_GL }, - { "60%", OPTION_VAL_60_GL }, - { "70%", OPTION_VAL_70_GL }, - { "80%", OPTION_VAL_80_GL }, - { "90%", OPTION_VAL_90_GL }, - { "100%", OPTION_VAL_100_O57_GL }, + { "10%", OPTION_VAL_10_FR }, + { "20%", OPTION_VAL_20_FR }, + { "30%", OPTION_VAL_30_FR }, + { "40%", OPTION_VAL_40_FR }, + { "50%", OPTION_VAL_50_FR }, + { "60%", OPTION_VAL_60_FR }, + { "70%", OPTION_VAL_70_FR }, + { "80%", OPTION_VAL_80_FR }, + { "90%", OPTION_VAL_90_FR }, + { "100%", OPTION_VAL_100_O45_FR }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_gl = { - option_cats_gl, - option_defs_gl -}; - -/* RETRO_LANGUAGE_HE */ - -#define CATEGORY_SYSTEM_LABEL_HE NULL -#define CATEGORY_SYSTEM_INFO_0_HE NULL -#define CATEGORY_VIDEO_LABEL_HE "וידאו" -#define CATEGORY_VIDEO_INFO_0_HE NULL -#define CATEGORY_PERFORMANCE_LABEL_HE NULL -#define CATEGORY_PERFORMANCE_INFO_0_HE NULL -#define CATEGORY_HACKS_LABEL_HE NULL -#define CATEGORY_HACKS_INFO_0_HE NULL -#define CATEGORY_INPUT_LABEL_HE "קלט" -#define CATEGORY_INPUT_INFO_0_HE NULL -#define CATEGORY_VMU_LABEL_HE NULL -#define CATEGORY_VMU_INFO_0_HE NULL -#define CORE_OPTION_NAME_REGION_LABEL_HE NULL -#define OPTION_VAL_JAPAN_HE NULL -#define OPTION_VAL_USA_HE NULL -#define OPTION_VAL_EUROPE_HE NULL -#define OPTION_VAL_DEFAULT_HE NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_HE NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HE NULL -#define OPTION_VAL_JAPANESE_HE NULL -#define OPTION_VAL_ENGLISH_HE NULL -#define OPTION_VAL_GERMAN_HE NULL -#define OPTION_VAL_FRENCH_HE NULL -#define OPTION_VAL_SPANISH_HE NULL -#define OPTION_VAL_ITALIAN_HE NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HE NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HE NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HE NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HE NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HE NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HE NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_HE NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HE NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HE NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HE NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HE NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HE NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HE NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HE NULL -#define CORE_OPTION_NAME_UPNP_LABEL_HE NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_HE NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HE NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HE NULL -#define OPTION_VAL_320X240_HE NULL -#define OPTION_VAL_640X480_HE NULL -#define OPTION_VAL_800X600_HE NULL -#define OPTION_VAL_960X720_HE NULL -#define OPTION_VAL_1024X768_HE NULL -#define OPTION_VAL_1280X960_HE NULL -#define OPTION_VAL_1440X1080_HE NULL -#define OPTION_VAL_1600X1200_HE NULL -#define OPTION_VAL_1920X1440_HE NULL -#define OPTION_VAL_2560X1920_HE NULL -#define OPTION_VAL_2880X2160_HE NULL -#define OPTION_VAL_3200X2400_HE NULL -#define OPTION_VAL_3840X2880_HE NULL -#define OPTION_VAL_4480X3360_HE NULL -#define OPTION_VAL_5120X3840_HE NULL -#define OPTION_VAL_5760X4320_HE NULL -#define OPTION_VAL_6400X4800_HE NULL -#define OPTION_VAL_7040X5280_HE NULL -#define OPTION_VAL_7680X5760_HE NULL -#define OPTION_VAL_8320X6240_HE NULL -#define OPTION_VAL_8960X6720_HE NULL -#define OPTION_VAL_9600X7200_HE NULL -#define OPTION_VAL_10240X7680_HE NULL -#define OPTION_VAL_10880X8160_HE NULL -#define OPTION_VAL_11520X8640_HE NULL -#define OPTION_VAL_12160X9120_HE NULL -#define OPTION_VAL_12800X9600_HE NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HE NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HE NULL -#define OPTION_VAL_VGA_HE NULL -#define OPTION_VAL_TV_RGB_HE NULL -#define OPTION_VAL_TV_COMPOSITE_HE NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_HE NULL -#define OPTION_VAL_NTSC_HE NULL -#define OPTION_VAL_PAL_HE NULL -#define OPTION_VAL_PAL_N_HE NULL -#define OPTION_VAL_PAL_M_HE NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HE NULL -#define OPTION_VAL_HORIZONTAL_HE NULL -#define OPTION_VAL_VERTICAL_HE NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HE NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HE NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_HE NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_HE NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HE NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HE NULL -#define OPTION_VAL_512MB_HE NULL -#define OPTION_VAL_1GB_HE NULL -#define OPTION_VAL_2GB_HE NULL -#define OPTION_VAL_4GB_HE NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HE NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HE NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HE NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HE NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HE NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HE NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HE NULL -#define CORE_OPTION_NAME_FOG_LABEL_HE NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HE NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HE NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HE NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HE NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HE NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HE NULL -#define OPTION_VAL_1_HE NULL -#define OPTION_VAL_2_HE NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HE NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HE NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HE NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HE NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HE NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HE NULL -#define OPTION_VAL_2_O27_HE NULL -#define OPTION_VAL_4_HE NULL -#define OPTION_VAL_6_HE NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HE NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HE NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HE NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HE NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HE NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HE NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HE NULL -#define OPTION_VAL_SOME_HE NULL -#define OPTION_VAL_MORE_HE NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HE NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HE NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HE NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HE NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HE NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HE NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HE NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HE NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HE NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HE NULL -#define OPTION_VAL_100_HE NULL -#define OPTION_VAL_110_HE NULL -#define OPTION_VAL_120_HE NULL -#define OPTION_VAL_130_HE NULL -#define OPTION_VAL_140_HE NULL -#define OPTION_VAL_150_HE NULL -#define OPTION_VAL_160_HE NULL -#define OPTION_VAL_170_HE NULL -#define OPTION_VAL_180_HE NULL -#define OPTION_VAL_190_HE NULL -#define OPTION_VAL_200_HE NULL -#define OPTION_VAL_210_HE NULL -#define OPTION_VAL_220_HE NULL -#define OPTION_VAL_230_HE NULL -#define OPTION_VAL_240_HE NULL -#define OPTION_VAL_250_HE NULL -#define OPTION_VAL_260_HE NULL -#define OPTION_VAL_270_HE NULL -#define OPTION_VAL_280_HE NULL -#define OPTION_VAL_290_HE NULL -#define OPTION_VAL_300_HE NULL -#define OPTION_VAL_310_HE NULL -#define OPTION_VAL_320_HE NULL -#define OPTION_VAL_330_HE NULL -#define OPTION_VAL_340_HE NULL -#define OPTION_VAL_350_HE NULL -#define OPTION_VAL_360_HE NULL -#define OPTION_VAL_370_HE NULL -#define OPTION_VAL_380_HE NULL -#define OPTION_VAL_390_HE NULL -#define OPTION_VAL_400_HE NULL -#define OPTION_VAL_410_HE NULL -#define OPTION_VAL_420_HE NULL -#define OPTION_VAL_430_HE NULL -#define OPTION_VAL_440_HE NULL -#define OPTION_VAL_450_HE NULL -#define OPTION_VAL_460_HE NULL -#define OPTION_VAL_470_HE NULL -#define OPTION_VAL_480_HE NULL -#define OPTION_VAL_490_HE NULL -#define OPTION_VAL_500_HE NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HE NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HE NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HE NULL -#define OPTION_VAL_0_HE NULL -#define OPTION_VAL_5_HE NULL -#define OPTION_VAL_10_HE NULL -#define OPTION_VAL_15_HE NULL -#define OPTION_VAL_20_HE NULL -#define OPTION_VAL_25_HE NULL -#define OPTION_VAL_30_HE NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HE NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HE NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HE NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HE NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HE NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HE NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HE NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HE NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HE NULL -#define OPTION_VAL_WHITE_HE NULL -#define OPTION_VAL_RED_HE NULL -#define OPTION_VAL_GREEN_HE NULL -#define OPTION_VAL_BLUE_HE NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HE NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HE NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HE NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HE NULL -#define OPTION_VAL_VMU_A1_HE NULL -#define OPTION_VAL_ALL_VMUS_HE NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HE NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HE NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HE NULL -#define OPTION_VAL_UPPER_LEFT_HE NULL -#define OPTION_VAL_UPPER_RIGHT_HE NULL -#define OPTION_VAL_LOWER_LEFT_HE NULL -#define OPTION_VAL_LOWER_RIGHT_HE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HE NULL -#define OPTION_VAL_1X_HE NULL -#define OPTION_VAL_3X_HE NULL -#define OPTION_VAL_5X_HE NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HE NULL -#define OPTION_VAL_DEFAULT_ON_00_HE NULL -#define OPTION_VAL_DEFAULT_OFF_01_HE NULL -#define OPTION_VAL_BLACK_02_HE NULL -#define OPTION_VAL_LIGHT_BLUE_04_HE NULL -#define OPTION_VAL_CYAN_06_HE NULL -#define OPTION_VAL_CYAN_BLUE_07_HE NULL -#define OPTION_VAL_LIGHT_GREEN_08_HE NULL -#define OPTION_VAL_CYAN_GREEN_09_HE NULL -#define OPTION_VAL_LIGHT_CYAN_10_HE NULL -#define OPTION_VAL_PURPLE_12_HE NULL -#define OPTION_VAL_LIGHT_PURPLE_13_HE NULL -#define OPTION_VAL_YELLOW_14_HE NULL -#define OPTION_VAL_GRAY_15_HE NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_HE NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_HE NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_HE NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_HE NULL -#define OPTION_VAL_LIGHT_RED_2_20_HE NULL -#define OPTION_VAL_MAGENTA_21_HE NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_HE NULL -#define OPTION_VAL_LIGHT_ORANGE_23_HE NULL -#define OPTION_VAL_ORANGE_24_HE NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_HE NULL -#define OPTION_VAL_LIGHT_YELLOW_26_HE NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_HE NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HE NULL -#define OPTION_VAL_40_HE NULL -#define OPTION_VAL_50_HE NULL -#define OPTION_VAL_60_HE NULL -#define OPTION_VAL_70_HE NULL -#define OPTION_VAL_80_HE NULL -#define OPTION_VAL_90_HE NULL -#define OPTION_VAL_100_O57_HE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HE NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HE NULL - -struct retro_core_option_v2_category option_cats_he[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_HE, - CATEGORY_SYSTEM_INFO_0_HE - }, - { - "video", - CATEGORY_VIDEO_LABEL_HE, - CATEGORY_VIDEO_INFO_0_HE - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_HE, - CATEGORY_PERFORMANCE_INFO_0_HE - }, - { - "hacks", - CATEGORY_HACKS_LABEL_HE, - CATEGORY_HACKS_INFO_0_HE - }, - { - "input", - CATEGORY_INPUT_LABEL_HE, - CATEGORY_INPUT_INFO_0_HE - }, - { - "vmu", - CATEGORY_VMU_LABEL_HE, - CATEGORY_VMU_INFO_0_HE - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_he[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_HE, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_FR, NULL, "", NULL, - "system", + "vmu", { - { "Japan", OPTION_VAL_JAPAN_HE }, - { "USA", OPTION_VAL_USA_HE }, - { "Europe", OPTION_VAL_EUROPE_HE }, - { "Default", OPTION_VAL_DEFAULT_HE }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "USA", + "disabled", }, { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_HE, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_FR, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_HE, + "", NULL, - "system", + "vmu", { - { "Japanese", OPTION_VAL_JAPANESE_HE }, - { "English", OPTION_VAL_ENGLISH_HE }, - { "German", OPTION_VAL_GERMAN_HE }, - { "French", OPTION_VAL_FRENCH_HE }, - { "Spanish", OPTION_VAL_SPANISH_HE }, - { "Italian", OPTION_VAL_ITALIAN_HE }, - { "Default", OPTION_VAL_DEFAULT_HE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_FR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_FR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_FR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_FR }, { NULL, NULL }, }, - "English", + "Lower Right", }, { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_HE, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_FR, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_HE, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, + { "1x", OPTION_VAL_1X_FR }, + { "2x", OPTION_VAL_2_O26_FR }, + { "3x", OPTION_VAL_3X_FR }, + { "4x", OPTION_VAL_4_FR }, + { "5x", OPTION_VAL_5X_FR }, + { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HE, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_FR, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HE, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_FR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_FR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_FR }, + { "BLACK 02", OPTION_VAL_BLACK_02_FR }, + { "BLUE 03", OPTION_VAL_BLUE_FR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_FR }, + { "GREEN 05", OPTION_VAL_GREEN_FR }, + { "CYAN 06", OPTION_VAL_CYAN_06_FR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_FR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_FR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_FR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_FR }, + { "RED 11", OPTION_VAL_RED_FR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_FR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_FR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_FR }, + { "GRAY 15", OPTION_VAL_GRAY_15_FR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_FR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_FR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_FR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_FR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_FR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_FR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_FR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_FR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_FR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_FR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_FR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_FR }, + { "WHITE 28", OPTION_VAL_WHITE_FR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_FR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_FR }, + { "20%", OPTION_VAL_20_FR }, + { "30%", OPTION_VAL_30_FR }, + { "40%", OPTION_VAL_40_FR }, + { "50%", OPTION_VAL_50_FR }, + { "60%", OPTION_VAL_60_FR }, + { "70%", OPTION_VAL_70_FR }, + { "80%", OPTION_VAL_80_FR }, + { "90%", OPTION_VAL_90_FR }, + { "100%", OPTION_VAL_100_O45_FR }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_fr = { + option_cats_fr, + option_defs_fr +}; + +/* RETRO_LANGUAGE_GL */ + +#define CATEGORY_SYSTEM_LABEL_GL "Sistema" +#define CATEGORY_SYSTEM_INFO_0_GL "Configure a rexión, o idioma, a BIOS e a configuración do hardware base." +#define CATEGORY_VIDEO_LABEL_GL "Vídeo" +#define CATEGORY_VIDEO_INFO_0_GL "Configure a resolución, a transparencia independente da orde e os axustes de efectos visuais." +#define CATEGORY_PERFORMANCE_LABEL_GL "Rendemento" +#define CATEGORY_PERFORMANCE_INFO_0_GL "Configure as opcións de renderizado en fíos e omitir marcos." +#define CATEGORY_HACKS_LABEL_GL "Hacks de emulación" +#define CATEGORY_HACKS_INFO_0_GL "Configura substitucións de pantalla panorámica, velocidade de carga de GD-ROM e configuración de substitución de texturas." +#define CATEGORY_INPUT_LABEL_GL "Entrada" +#define CATEGORY_INPUT_INFO_0_GL "Configura a configuración do gamepad e da pistola lixeira." +#define CATEGORY_EXPANSIONS_LABEL_GL "Ranuras de expansión do controlador" +#define CATEGORY_EXPANSIONS_INFO_0_GL "Seleccione o dispositivo (VMU, dispositivo rumble) conectado a cada ranura de expansión do controlador." +#define CATEGORY_VMU_LABEL_GL "Unidade de Memoria Visual" +#define CATEGORY_VMU_INFO_0_GL "Configura os ficheiros de gardar VMU por xogo e os axustes de visibilidade da VMU en pantalla." +#define CORE_OPTION_NAME_REGION_LABEL_GL "Rexión" +#define OPTION_VAL_JAPAN_GL "Xapón" +#define OPTION_VAL_USA_GL NULL +#define OPTION_VAL_EUROPE_GL "Europa" +#define OPTION_VAL_DEFAULT_GL "Por defecto" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_GL "Idioma" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_GL "Cambia o idioma que usa a BIOS e os xogos que conteñan varios idiomas." +#define OPTION_VAL_JAPANESE_GL "Xaponés" +#define OPTION_VAL_ENGLISH_GL "Inglés" +#define OPTION_VAL_GERMAN_GL "Alemán" +#define OPTION_VAL_FRENCH_GL "Francés" +#define OPTION_VAL_SPANISH_GL "Español" +#define OPTION_VAL_ITALIAN_GL "Italiano" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_GL "BIOS HLE (reinicio necesario)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_GL "Forza o uso de emulación BIOS de alto nivel." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_GL "Arranca na BIOS (requírese reiniciar)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_GL "Arranca directamente no menú da BIOS de Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_GL "Activar DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_GL "Activa a emulación do DSP de audio (procesador de sinal dixital) do Dreamcast. Mellora a precisión do son xerado, pero aumenta os requisitos de rendemento." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_GL "Permitir botóns de servizo de Arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_GL "Activa o botón SERVICE para xogos de arcade para entrar na configuración do armario." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_GL "Configura NAOMI Games Para Xogar de Balde" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_GL "Modifica a configuración de moedas do xogo para xogar libremente." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_GL "Emulación de adaptador de banda ancha" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_GL "Emule o adaptador de banda ancha ethernet en lugar do módem. (Reiniciar obrigatorio)" +#define CORE_OPTION_NAME_UPNP_LABEL_GL "Activar UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_GL "Use UPnP para configurar automaticamente o seu enrutador de Internet para xogos en liña." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_GL "Resolución interna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_GL "Modificar a resolución do renderizado." +#define OPTION_VAL_320X240_GL "320 x 240 (a metade)" +#define OPTION_VAL_640X480_GL "640 x 480 (nativo)" +#define OPTION_VAL_800X600_GL NULL +#define OPTION_VAL_960X720_GL NULL +#define OPTION_VAL_1024X768_GL NULL +#define OPTION_VAL_1280X960_GL NULL +#define OPTION_VAL_1440X1080_GL NULL +#define OPTION_VAL_1600X1200_GL NULL +#define OPTION_VAL_1920X1440_GL NULL +#define OPTION_VAL_2560X1920_GL NULL +#define OPTION_VAL_2880X2160_GL NULL +#define OPTION_VAL_3200X2400_GL NULL +#define OPTION_VAL_3840X2880_GL NULL +#define OPTION_VAL_4480X3360_GL NULL +#define OPTION_VAL_5120X3840_GL NULL +#define OPTION_VAL_5760X4320_GL NULL +#define OPTION_VAL_6400X4800_GL NULL +#define OPTION_VAL_7040X5280_GL NULL +#define OPTION_VAL_7680X5760_GL NULL +#define OPTION_VAL_8320X6240_GL NULL +#define OPTION_VAL_8960X6720_GL NULL +#define OPTION_VAL_9600X7200_GL NULL +#define OPTION_VAL_10240X7680_GL NULL +#define OPTION_VAL_10880X8160_GL NULL +#define OPTION_VAL_11520X8640_GL NULL +#define OPTION_VAL_12160X9120_GL NULL +#define OPTION_VAL_12800X9600_GL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_GL "Tipo de cable" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_GL "O tipo de sinal de saída. 'TV (Composite)' é o máis soportado." +#define OPTION_VAL_VGA_GL NULL +#define OPTION_VAL_TV_RGB_GL NULL +#define OPTION_VAL_TV_COMPOSITE_GL "TV (composto)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_GL "Estándar de emisión" +#define OPTION_VAL_NTSC_GL NULL +#define OPTION_VAL_PAL_GL "PAL (Mundo)" +#define OPTION_VAL_PAL_N_GL "PAL-N (Arxentina, Paraguai, Uruguai)" +#define OPTION_VAL_PAL_M_GL "PAL-M (Brasil)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_GL "Orientación da Pantalla" +#define OPTION_VAL_HORIZONTAL_GL NULL +#define OPTION_VAL_VERTICAL_GL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_GL "Clasificación Alpha" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_GL "Seleccione como se ordenan os polígonos transparentes." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_GL "Por franxa (rápido, menos preciso)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_GL "Por triángulo (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_GL "Por píxel (preciso, pero máis lento)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_GL "Tamaño do búfer de píxeles de acumulación" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_GL "É posible que se precisen valores máis altos para que as resolucións máis altas saian correctamente." +#define OPTION_VAL_512MB_GL NULL +#define OPTION_VAL_1GB_GL NULL +#define OPTION_VAL_2GB_GL NULL +#define OPTION_VAL_4GB_GL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_GL "Máximo de capas transparentes" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_GL "Poden ser necesarios valores máis altos para escenas complexas." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_GL "Emulación completa de framebuffer" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_GL "Activa a emulación completa de framebuffer na VRAM. Isto é útil para xogos que len ou escriben directamente o framebuffer na VRAM. Cando está activada, a resolución interna é obrigada a 640 x 480 e o rendemento pode verse gravemente afectado." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_GL "Activa o buffer RTT (Render To Texture)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_GL "Copia texturas renderizadas de volta da GPU á VRAM. Esta opción normalmente está habilitada para xogos que o requiran. Cando se activa, a ampliación da renderización de texturas está desactivada e o rendemento pode verse afectado." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_GL "Mapeo mip" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_GL "Cando as texturas activadas usarán unha versión máis pequena de si mesmas cando aparezan máis lonxe, pode aumentar o rendemento e reducir o brillo." +#define CORE_OPTION_NAME_FOG_LABEL_GL "Efectos néboa" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_GL "Modificador de volume" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_GL "Unha función GPU de Dreamcast que normalmente usan os xogos para debuxar sombras de obxectos. Normalmente debería estar activado: o impacto no rendemento adoita ser mínimo ou insignificante." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_GL "Filtrado anisotrópico" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_GL "Mellora a calidade das texturas en superficies que están en ángulos de visión oblicuos con respecto á cámara. Os valores máis altos son máis esixentes na GPU. Os cambios nesta configuración só se aplican despois de reiniciar." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_GL "Filtrado de Texturas" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_GL "O modo de filtrado de texturas a usar. Isto pódese usar para forzar un determinado modo de filtrado de texturas en todas as texturas para obter unha aparencia máis nítida (ou máis suave) que a predeterminada. Os valores distintos do predeterminado poden causar varios problemas de renderización. Os cambios nesta configuración só se aplican despois de reiniciar." +#define OPTION_VAL_1_GL "Forza: Veciño máis próximo" +#define OPTION_VAL_2_GL "Forza lineal" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_GL "Intercambio de fotogramas con retardo" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_GL "Útil para evitar o parpadeo nas pantallas ou os vídeos con fallos. Non recomendado en plataformas lentas." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_GL "Detectar cambios na taxa de Fotogramas" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_GL "Notificar a interface cando cambie a velocidade de fotogramas interna (por exemplo, de 60 fps a 30 fps). Mellora o ritmo de cadros nos xogos que se executan a 30 ou 20 fps bloqueados, pero que debería desactivarse para xogos con velocidades de cadros desbloqueadas (inestables) (por exemplo, Ecco the Dolphin, Unreal Tournament). Nota: Non está dispoñible cando se activa \"Saltar marco automático\"." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_GL "Filtrado de postprocesado PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_GL "Postproceso da imaxe renderizada para simular efectos específicos da PowerVR2 GPU e os sinais analóxicos de vídeo." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_GL "Aumento das texturas (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_GL "Millora dos gráficos 2D pixel art debuxados a man. Só se debería usar con xogos pixelados en 2D." +#define OPTION_VAL_2_O26_GL NULL +#define OPTION_VAL_4_GL NULL +#define OPTION_VAL_6_GL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_GL "Aumento da escala das texturas. Tamaño filtrado" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_GL "Seleccione un valor de tamaño máximo para unha textura a escalar, se o tamaño da textura é superior ao valor seleccionado, non se ampliará." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_GL "Interpolación de profundidade nativa" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_GL "Axuda coa corrupción da textura e os problemas de profundidade nas GPU AMD. Tamén pode axudar ás GPU Intel nalgúns casos." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_GL "Corrixir Bleeding Edge de luxo" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_GL "Axuda co caso de sangramento da textura ao aumentar a escala. Desactivalo pode axudar se os píxeles se deforman ao aumentar a escala en xogos en 2D (MVC2, CVS, KOF, etc.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_GL "Renderizado de fíos" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_GL "Fai funcionar a GPU e a CPU en fíos diferentes. Altamente recomendado." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_GL "Salto de fotograma automático" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_GL "Automáticamente salta fotogramas cando o emulador está correndo lento. Nota: Esta opción só se aplica cando 'Renderizado por fíos' está activado." +#define OPTION_VAL_SOME_GL NULL +#define OPTION_VAL_MORE_GL "Máximo" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_GL "Salto de fotogramas" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_GL "Especifica o número de fotogramas para saltar entre cada fotograma que é mostrado." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_GL "Trucos de pantalla ancha (necesario reiniciar)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_GL "Activa trucos que permiten que determinados xogos se mostren en formato de pantalla panorámica." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_GL "Corte de pantalla ancha" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_GL "Debuxa xeometría fóra da relación de aspecto normal de 4:3. Pode producir fallas gráficas nas áreas reveladas." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_GL "Carga rápida de GD-ROM (inexacta)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_GL "Acelera a carga de GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_GL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_GL "Activa 32 MB de RAM Mod para Dreamcast. Pode afectar á compatibilidade" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_GL "CPU SH4 under/overclock" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_GL "Cambia o reloxo da CPU principal do SH4 dos 200 MHz predeterminados. O underclocking pode axudar a ralentizar as plataformas. O overclocking pode aumentar a velocidade de fotogramas nalgúns xogos. Use con precaución." +#define OPTION_VAL_100_GL NULL +#define OPTION_VAL_110_GL NULL +#define OPTION_VAL_120_GL NULL +#define OPTION_VAL_130_GL NULL +#define OPTION_VAL_140_GL NULL +#define OPTION_VAL_150_GL NULL +#define OPTION_VAL_160_GL NULL +#define OPTION_VAL_170_GL NULL +#define OPTION_VAL_180_GL NULL +#define OPTION_VAL_190_GL NULL +#define OPTION_VAL_200_GL NULL +#define OPTION_VAL_210_GL NULL +#define OPTION_VAL_220_GL NULL +#define OPTION_VAL_230_GL NULL +#define OPTION_VAL_240_GL NULL +#define OPTION_VAL_250_GL NULL +#define OPTION_VAL_260_GL NULL +#define OPTION_VAL_270_GL NULL +#define OPTION_VAL_280_GL NULL +#define OPTION_VAL_290_GL NULL +#define OPTION_VAL_300_GL NULL +#define OPTION_VAL_310_GL NULL +#define OPTION_VAL_320_GL NULL +#define OPTION_VAL_330_GL NULL +#define OPTION_VAL_340_GL NULL +#define OPTION_VAL_350_GL NULL +#define OPTION_VAL_360_GL NULL +#define OPTION_VAL_370_GL NULL +#define OPTION_VAL_380_GL NULL +#define OPTION_VAL_390_GL NULL +#define OPTION_VAL_400_GL NULL +#define OPTION_VAL_410_GL NULL +#define OPTION_VAL_420_GL NULL +#define OPTION_VAL_430_GL NULL +#define OPTION_VAL_440_GL NULL +#define OPTION_VAL_450_GL NULL +#define OPTION_VAL_460_GL NULL +#define OPTION_VAL_470_GL NULL +#define OPTION_VAL_480_GL NULL +#define OPTION_VAL_490_GL NULL +#define OPTION_VAL_500_GL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_GL "Carga as texturas personalizadas" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_GL "Carga texturas personalizadas situadas no cartafol \"system/dc/textures//\"." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_GL "Texturas de volcado" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_GL "Cada vez que o xogo use unha textura nova, gardarase como ficheiro .png no cartafol 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_GL "Zona morta stick analóxico" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_GL "Selecciona ata onde tes que empuxar o stick analóxico antes de que comece a procesarse." +#define OPTION_VAL_0_GL NULL +#define OPTION_VAL_5_GL NULL +#define OPTION_VAL_10_GL NULL +#define OPTION_VAL_15_GL NULL +#define OPTION_VAL_20_GL NULL +#define OPTION_VAL_25_GL NULL +#define OPTION_VAL_30_GL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_GL "Activar zona morta" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_GL "Seleccione canto ten que premer o gatillo antes de comezar a procesarse." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_GL "Disparadores dixitais" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_GL "Cando estean activados, os disparadores actuarán como botóns normais, o que significa que se procesarán como totalmente presionados ou sen presionar nada, sen intermediarios." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_GL "Saídas dixitais de emisión" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_GL "Saídas dixitais de transmisión e estado de retroalimentación forzada no porto TCP 8000. Compatible coa opción MAME \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_GL "Mostrar a configuración da arma lixeira" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_GL "Activa a configuración das opcións de visualización do punto de mira de pistola lixeira. NOTA: É posible que teña que cambiar o menú rápido para que esta configuración teña efecto." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_GL "Escala do tamaño da mira de pistola" +#define OPTION_VAL_50_GL NULL +#define OPTION_VAL_60_GL NULL +#define OPTION_VAL_70_GL NULL +#define OPTION_VAL_80_GL NULL +#define OPTION_VAL_90_GL NULL +#define OPTION_VAL_100_O45_GL NULL +#define OPTION_VAL_110_O45_GL NULL +#define OPTION_VAL_120_O45_GL NULL +#define OPTION_VAL_130_O45_GL NULL +#define OPTION_VAL_140_O45_GL NULL +#define OPTION_VAL_150_O45_GL NULL +#define OPTION_VAL_160_O45_GL NULL +#define OPTION_VAL_170_O45_GL NULL +#define OPTION_VAL_180_O45_GL NULL +#define OPTION_VAL_190_O45_GL NULL +#define OPTION_VAL_200_O45_GL NULL +#define OPTION_VAL_210_O45_GL NULL +#define OPTION_VAL_220_O45_GL NULL +#define OPTION_VAL_230_O45_GL NULL +#define OPTION_VAL_240_O45_GL NULL +#define OPTION_VAL_250_O45_GL NULL +#define OPTION_VAL_260_O45_GL NULL +#define OPTION_VAL_270_O45_GL NULL +#define OPTION_VAL_280_O45_GL NULL +#define OPTION_VAL_290_O45_GL NULL +#define OPTION_VAL_300_O45_GL NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_GL "Pantalla Gun Crosshair 1" +#define OPTION_VAL_WHITE_GL "Branco" +#define OPTION_VAL_RED_GL "Vermello" +#define OPTION_VAL_GREEN_GL "Verde" +#define OPTION_VAL_BLUE_GL "Azul" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_GL "Pantalla Gun Crosshair 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_GL "Pantalla Gun Crosshair 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_GL "Pantalla Gun Crosshair 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_GL "Dispositivo no ranura de expansión A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión A1 (porto A slot 1)." +#define OPTION_VAL_VMU_GL NULL +#define OPTION_VAL_PURUPURU_GL "Paquete de vibracións" +#define OPTION_VAL_NONE_GL "Ningún" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_GL "Dispositivo no slot de expansión A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión A2 (porto A slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_GL "Dispositivo no slot de expansión B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión B1 (port B slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_GL "Dispositivo no slot de expansión B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_GL "Seleccione o dispositivo conectado á ranura de expansión B2 (rañura do porto B 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_GL "Dispositivo no slot de expansión C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión C1 (port C slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_GL "Dispositivo no slot de expansión C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión C2 (port C slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_GL "Dispositivo na ranura de expansión D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión D1 (port D1 slot)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_GL "Dispositivo na ranura de expansión D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_GL "Seleccione o dispositivo conectado ao slot de expansión D2 (port D2 slot)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_GL "Unidades/sistemas de memoria visual (VMU) por xogo" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_GL "VMUs por xogo" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_GL "Cando está desactivado, todos os xogos comparten até 8 arquivos de gardado VMU (A1/A2/B1/B2/C1/C2/D1/D2) situados na carpeta do sistema de RetroArch.\nA configuración 'VMU A1' crea un arquivo VMU 'A1' único na carpeta de gardado de RetroArch para cada xogo que se lanza.\nA configuración 'Todos os VMUs' crea até 8 arquivos VMU únicos (A1/A2/B1/B2/C1/C2/D1/D2) para cada xogo que se lanza." +#define OPTION_VAL_VMU_A1_GL NULL +#define OPTION_VAL_ALL_VMUS_GL "Todas as VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_GL "Sons de sistemas/unidades de memoria visual (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_GL "Sons VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_GL "Cando está activado, reprodúcense os pitidos VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_GL "Amosa as opcións de pantalla da Unidade/Sistema de Memoria visual (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_GL "Amosa as opcións de pantalla da VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_GL "Activa a configuración da visibilidade, tamaño, posición e cor da pantalla LCD VMU emulada. NOTA: É posible que teña que cambiar o menú rápido para que esta configuración teña efecto." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_GL "Pantalla 1 da VMU" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_GL "Posición da pantalla 1 VMU" +#define OPTION_VAL_UPPER_LEFT_GL "Superior esquerda" +#define OPTION_VAL_UPPER_RIGHT_GL "Superior dereita" +#define OPTION_VAL_LOWER_LEFT_GL "Inferior esquerda" +#define OPTION_VAL_LOWER_RIGHT_GL "Inferior dereita" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 1 VMU" +#define OPTION_VAL_1X_GL NULL +#define OPTION_VAL_3X_GL NULL +#define OPTION_VAL_5X_GL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 1 VMU" +#define OPTION_VAL_DEFAULT_ON_00_GL "Por defecto activado" +#define OPTION_VAL_DEFAULT_OFF_01_GL "Por defecto desactivado" +#define OPTION_VAL_BLACK_02_GL "Negro" +#define OPTION_VAL_LIGHT_BLUE_04_GL "Azul claro" +#define OPTION_VAL_CYAN_06_GL "Azul ceo" +#define OPTION_VAL_CYAN_BLUE_07_GL "Cián" +#define OPTION_VAL_LIGHT_GREEN_08_GL "Verde claro" +#define OPTION_VAL_CYAN_GREEN_09_GL "Cián Verde" +#define OPTION_VAL_LIGHT_CYAN_10_GL "Cián claro" +#define OPTION_VAL_PURPLE_12_GL "Malva" +#define OPTION_VAL_LIGHT_PURPLE_13_GL "Malva claro" +#define OPTION_VAL_YELLOW_14_GL "Amarelo" +#define OPTION_VAL_GRAY_15_GL "Gris" +#define OPTION_VAL_LIGHT_PURPLE_2_16_GL "Malva claro (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_GL "Verde claro (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_GL "Verde claro (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_GL "Cián claro (2)" +#define OPTION_VAL_LIGHT_RED_2_20_GL "Vermello claro (2)" +#define OPTION_VAL_MAGENTA_21_GL "Maxenta" +#define OPTION_VAL_LIGHT_PURPLE_3_22_GL "Malva claro (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_GL "Laranxa claro" +#define OPTION_VAL_ORANGE_24_GL "Laranxa" +#define OPTION_VAL_LIGHT_PURPLE_4_25_GL "Malva claro (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_GL "Amarelo claro" +#define OPTION_VAL_LIGHT_YELLOW_2_27_GL "Amarelo claro (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 1 VMU" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 1 VMU" +#define OPTION_VAL_40_GL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_GL "Pantalla 2 da VMU" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_GL "Posición da pantalla 2 VMU" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 2 VMU" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 2 VMU" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 2 VMU" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 2 VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_GL "Pantalla 3 da VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_GL "Posición da pantalla 3 VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 3 VMU" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 3 VMU" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 3 VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 3 VMU" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_GL "Pantalla 4 da VMU" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_GL "Posición da pantalla 4 VMU" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_GL "Tamaño da pantalla 4 VMU" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_GL "Activar pixel en cor na pantalla 4 VMU" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_GL "Desactivar píxel en cor na pantalla 4 VMU" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_GL "Opacidade da pantalla 4 VMU" + +struct retro_core_option_v2_category option_cats_gl[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_GL, + CATEGORY_SYSTEM_INFO_0_GL + }, + { + "video", + CATEGORY_VIDEO_LABEL_GL, + CATEGORY_VIDEO_INFO_0_GL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_GL, + CATEGORY_PERFORMANCE_INFO_0_GL + }, + { + "hacks", + CATEGORY_HACKS_LABEL_GL, + CATEGORY_HACKS_INFO_0_GL + }, + { + "input", + CATEGORY_INPUT_LABEL_GL, + CATEGORY_INPUT_INFO_0_GL + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_GL, + CATEGORY_EXPANSIONS_INFO_0_GL + }, + { + "vmu", + CATEGORY_VMU_LABEL_GL, + CATEGORY_VMU_INFO_0_GL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_gl[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_GL, + NULL, + "", NULL, "system", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Japan", OPTION_VAL_JAPAN_GL }, + { "USA", OPTION_VAL_USA_GL }, + { "Europe", OPTION_VAL_EUROPE_GL }, + { "Default", OPTION_VAL_DEFAULT_GL }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_GL, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_GL, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_GL }, + { "English", OPTION_VAL_ENGLISH_GL }, + { "German", OPTION_VAL_GERMAN_GL }, + { "French", OPTION_VAL_FRENCH_GL }, + { "Spanish", OPTION_VAL_SPANISH_GL }, + { "Italian", OPTION_VAL_ITALIAN_GL }, + { "Default", OPTION_VAL_DEFAULT_GL }, { NULL, NULL }, }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_GL, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_GL, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, "disabled", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_HE, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_GL, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HE, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_GL, NULL, "system", { @@ -32829,17 +36722,13 @@ struct retro_core_option_v2_definition option_defs_he[] = { { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_HE, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_GL, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HE, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_GL, NULL, "system", { @@ -32847,13 +36736,17 @@ struct retro_core_option_v2_definition option_defs_he[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HE, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_GL, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HE, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_GL, NULL, "system", { @@ -32865,9 +36758,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HE, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_GL, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HE, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_GL, NULL, "system", { @@ -32879,9 +36772,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_HE, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_GL, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HE, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_GL, NULL, "system", { @@ -32893,9 +36786,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_HE, + CORE_OPTION_NAME_UPNP_LABEL_GL, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_HE, + CORE_OPTION_NAME_UPNP_INFO_0_GL, NULL, "system", { @@ -32908,39 +36801,39 @@ struct retro_core_option_v2_definition option_defs_he[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HE, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_GL, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HE, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_GL, NULL, "video", { - { "320x240", OPTION_VAL_320X240_HE }, - { "640x480", OPTION_VAL_640X480_HE }, - { "800x600", OPTION_VAL_800X600_HE }, - { "960x720", OPTION_VAL_960X720_HE }, - { "1024x768", OPTION_VAL_1024X768_HE }, - { "1280x960", OPTION_VAL_1280X960_HE }, - { "1440x1080", OPTION_VAL_1440X1080_HE }, - { "1600x1200", OPTION_VAL_1600X1200_HE }, - { "1920x1440", OPTION_VAL_1920X1440_HE }, - { "2560x1920", OPTION_VAL_2560X1920_HE }, - { "2880x2160", OPTION_VAL_2880X2160_HE }, - { "3200x2400", OPTION_VAL_3200X2400_HE }, - { "3840x2880", OPTION_VAL_3840X2880_HE }, - { "4480x3360", OPTION_VAL_4480X3360_HE }, - { "5120x3840", OPTION_VAL_5120X3840_HE }, - { "5760x4320", OPTION_VAL_5760X4320_HE }, - { "6400x4800", OPTION_VAL_6400X4800_HE }, - { "7040x5280", OPTION_VAL_7040X5280_HE }, - { "7680x5760", OPTION_VAL_7680X5760_HE }, - { "8320x6240", OPTION_VAL_8320X6240_HE }, - { "8960x6720", OPTION_VAL_8960X6720_HE }, - { "9600x7200", OPTION_VAL_9600X7200_HE }, - { "10240x7680", OPTION_VAL_10240X7680_HE }, - { "10880x8160", OPTION_VAL_10880X8160_HE }, - { "11520x8640", OPTION_VAL_11520X8640_HE }, - { "12160x9120", OPTION_VAL_12160X9120_HE }, - { "12800x9600", OPTION_VAL_12800X9600_HE }, + { "320x240", OPTION_VAL_320X240_GL }, + { "640x480", OPTION_VAL_640X480_GL }, + { "800x600", OPTION_VAL_800X600_GL }, + { "960x720", OPTION_VAL_960X720_GL }, + { "1024x768", OPTION_VAL_1024X768_GL }, + { "1280x960", OPTION_VAL_1280X960_GL }, + { "1440x1080", OPTION_VAL_1440X1080_GL }, + { "1600x1200", OPTION_VAL_1600X1200_GL }, + { "1920x1440", OPTION_VAL_1920X1440_GL }, + { "2560x1920", OPTION_VAL_2560X1920_GL }, + { "2880x2160", OPTION_VAL_2880X2160_GL }, + { "3200x2400", OPTION_VAL_3200X2400_GL }, + { "3840x2880", OPTION_VAL_3840X2880_GL }, + { "4480x3360", OPTION_VAL_4480X3360_GL }, + { "5120x3840", OPTION_VAL_5120X3840_GL }, + { "5760x4320", OPTION_VAL_5760X4320_GL }, + { "6400x4800", OPTION_VAL_6400X4800_GL }, + { "7040x5280", OPTION_VAL_7040X5280_GL }, + { "7680x5760", OPTION_VAL_7680X5760_GL }, + { "8320x6240", OPTION_VAL_8320X6240_GL }, + { "8960x6720", OPTION_VAL_8960X6720_GL }, + { "9600x7200", OPTION_VAL_9600X7200_GL }, + { "10240x7680", OPTION_VAL_10240X7680_GL }, + { "10880x8160", OPTION_VAL_10880X8160_GL }, + { "11520x8640", OPTION_VAL_11520X8640_GL }, + { "12160x9120", OPTION_VAL_12160X9120_GL }, + { "12800x9600", OPTION_VAL_12800X9600_GL }, { NULL, NULL }, }, #ifdef LOW_RES @@ -32951,62 +36844,62 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_HE, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_GL, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HE, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_GL, NULL, "video", { - { "VGA", OPTION_VAL_VGA_HE }, - { "TV (RGB)", OPTION_VAL_TV_RGB_HE }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HE }, + { "VGA", OPTION_VAL_VGA_GL }, + { "TV (RGB)", OPTION_VAL_TV_RGB_GL }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_GL }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_HE, + CORE_OPTION_NAME_BROADCAST_LABEL_GL, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_HE }, - { "PAL", OPTION_VAL_PAL_HE }, - { "PAL_N", OPTION_VAL_PAL_N_HE }, - { "PAL_M", OPTION_VAL_PAL_M_HE }, - { "Default", OPTION_VAL_DEFAULT_HE }, + { "NTSC", OPTION_VAL_NTSC_GL }, + { "PAL", OPTION_VAL_PAL_GL }, + { "PAL_N", OPTION_VAL_PAL_N_GL }, + { "PAL_M", OPTION_VAL_PAL_M_GL }, + { "Default", OPTION_VAL_DEFAULT_GL }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HE, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_GL, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_HE }, - { "vertical", OPTION_VAL_VERTICAL_HE }, + { "horizontal", OPTION_VAL_HORIZONTAL_GL }, + { "vertical", OPTION_VAL_VERTICAL_GL }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HE, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_GL, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HE }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HE }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_GL }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_GL }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HE }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_GL }, #endif { NULL, NULL }, }, @@ -33019,25 +36912,25 @@ struct retro_core_option_v2_definition option_defs_he[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HE, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_GL, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HE, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_GL, NULL, "video", { - { "512MB", OPTION_VAL_512MB_HE }, - { "1GB", OPTION_VAL_1GB_HE }, - { "2GB", OPTION_VAL_2GB_HE }, - { "4GB", OPTION_VAL_4GB_HE }, + { "512MB", OPTION_VAL_512MB_GL }, + { "1GB", OPTION_VAL_1GB_GL }, + { "2GB", OPTION_VAL_2GB_GL }, + { "4GB", OPTION_VAL_4GB_GL }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_HE, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_GL, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HE, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_GL, NULL, "video", { @@ -33045,6 +36938,7 @@ struct retro_core_option_v2_definition option_defs_he[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -33053,9 +36947,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HE, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_GL, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HE, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_GL, NULL, "video", { @@ -33067,9 +36961,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HE, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_GL, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HE, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_GL, NULL, "video", { @@ -33079,11 +36973,11 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_HE, + CORE_OPTION_NAME_MIPMAPPING_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_GL, NULL, "video", { @@ -33095,7 +36989,7 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_HE, + CORE_OPTION_NAME_FOG_LABEL_GL, NULL, "", NULL, @@ -33109,9 +37003,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HE, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_GL, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HE, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_GL, NULL, "video", { @@ -33123,9 +37017,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HE, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_GL, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HE, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_GL, NULL, "video", { @@ -33140,24 +37034,24 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HE, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_GL, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HE, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_GL, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_HE }, - { "1", OPTION_VAL_1_HE }, - { "2", OPTION_VAL_2_HE }, + { "0", OPTION_VAL_DEFAULT_GL }, + { "1", OPTION_VAL_1_GL }, + { "2", OPTION_VAL_2_GL }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HE, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_GL, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HE, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_GL, NULL, "video", { @@ -33165,13 +37059,13 @@ struct retro_core_option_v2_definition option_defs_he[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HE, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_GL, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HE, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_GL, NULL, "video", { @@ -33183,9 +37077,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HE, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_GL, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HE, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_GL, NULL, "video", { @@ -33198,25 +37092,25 @@ struct retro_core_option_v2_definition option_defs_he[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_HE, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_GL, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HE, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_GL, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_HE }, - { "4", OPTION_VAL_4_HE }, - { "6", OPTION_VAL_6_HE }, + { "2", OPTION_VAL_2_O26_GL }, + { "4", OPTION_VAL_4_GL }, + { "6", OPTION_VAL_6_GL }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HE, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_GL, NULL, "video", { @@ -33230,9 +37124,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HE, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_GL, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HE, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_GL, NULL, "video", { @@ -33242,11 +37136,25 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_GL, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_GL, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HE, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_GL, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HE, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_GL, NULL, "performance", { @@ -33258,15 +37166,15 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HE, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_GL, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HE, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_GL, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_HE }, - { "more", OPTION_VAL_MORE_HE }, + { "some", OPTION_VAL_SOME_GL }, + { "more", OPTION_VAL_MORE_GL }, { NULL, NULL }, }, #ifdef LOW_END @@ -33277,9 +37185,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HE, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_GL, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HE, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_GL, NULL, "performance", { @@ -33296,9 +37204,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HE, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_GL, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HE, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_GL, NULL, "hacks", { @@ -33310,9 +37218,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HE, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_GL, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HE, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_GL, NULL, "hacks", { @@ -33324,9 +37232,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HE, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_GL, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HE, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_GL, NULL, "hacks", { @@ -33340,64 +37248,78 @@ struct retro_core_option_v2_definition option_defs_he[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_GL, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_GL, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_HE, + CORE_OPTION_NAME_SH4CLOCK_LABEL_GL, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_HE, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_GL, NULL, "hacks", { - { "100", OPTION_VAL_100_HE }, - { "110", OPTION_VAL_110_HE }, - { "120", OPTION_VAL_120_HE }, - { "130", OPTION_VAL_130_HE }, - { "140", OPTION_VAL_140_HE }, - { "150", OPTION_VAL_150_HE }, - { "160", OPTION_VAL_160_HE }, - { "170", OPTION_VAL_170_HE }, - { "180", OPTION_VAL_180_HE }, - { "190", OPTION_VAL_190_HE }, - { "200", OPTION_VAL_200_HE }, - { "210", OPTION_VAL_210_HE }, - { "220", OPTION_VAL_220_HE }, - { "230", OPTION_VAL_230_HE }, - { "240", OPTION_VAL_240_HE }, - { "250", OPTION_VAL_250_HE }, - { "260", OPTION_VAL_260_HE }, - { "270", OPTION_VAL_270_HE }, - { "280", OPTION_VAL_280_HE }, - { "290", OPTION_VAL_290_HE }, - { "300", OPTION_VAL_300_HE }, - { "310", OPTION_VAL_310_HE }, - { "320", OPTION_VAL_320_HE }, - { "330", OPTION_VAL_330_HE }, - { "340", OPTION_VAL_340_HE }, - { "350", OPTION_VAL_350_HE }, - { "360", OPTION_VAL_360_HE }, - { "370", OPTION_VAL_370_HE }, - { "380", OPTION_VAL_380_HE }, - { "390", OPTION_VAL_390_HE }, - { "400", OPTION_VAL_400_HE }, - { "410", OPTION_VAL_410_HE }, - { "420", OPTION_VAL_420_HE }, - { "430", OPTION_VAL_430_HE }, - { "440", OPTION_VAL_440_HE }, - { "450", OPTION_VAL_450_HE }, - { "460", OPTION_VAL_460_HE }, - { "470", OPTION_VAL_470_HE }, - { "480", OPTION_VAL_480_HE }, - { "490", OPTION_VAL_490_HE }, - { "500", OPTION_VAL_500_HE }, + { "100", OPTION_VAL_100_GL }, + { "110", OPTION_VAL_110_GL }, + { "120", OPTION_VAL_120_GL }, + { "130", OPTION_VAL_130_GL }, + { "140", OPTION_VAL_140_GL }, + { "150", OPTION_VAL_150_GL }, + { "160", OPTION_VAL_160_GL }, + { "170", OPTION_VAL_170_GL }, + { "180", OPTION_VAL_180_GL }, + { "190", OPTION_VAL_190_GL }, + { "200", OPTION_VAL_200_GL }, + { "210", OPTION_VAL_210_GL }, + { "220", OPTION_VAL_220_GL }, + { "230", OPTION_VAL_230_GL }, + { "240", OPTION_VAL_240_GL }, + { "250", OPTION_VAL_250_GL }, + { "260", OPTION_VAL_260_GL }, + { "270", OPTION_VAL_270_GL }, + { "280", OPTION_VAL_280_GL }, + { "290", OPTION_VAL_290_GL }, + { "300", OPTION_VAL_300_GL }, + { "310", OPTION_VAL_310_GL }, + { "320", OPTION_VAL_320_GL }, + { "330", OPTION_VAL_330_GL }, + { "340", OPTION_VAL_340_GL }, + { "350", OPTION_VAL_350_GL }, + { "360", OPTION_VAL_360_GL }, + { "370", OPTION_VAL_370_GL }, + { "380", OPTION_VAL_380_GL }, + { "390", OPTION_VAL_390_GL }, + { "400", OPTION_VAL_400_GL }, + { "410", OPTION_VAL_410_GL }, + { "420", OPTION_VAL_420_GL }, + { "430", OPTION_VAL_430_GL }, + { "440", OPTION_VAL_440_GL }, + { "450", OPTION_VAL_450_GL }, + { "460", OPTION_VAL_460_GL }, + { "470", OPTION_VAL_470_GL }, + { "480", OPTION_VAL_480_GL }, + { "490", OPTION_VAL_490_GL }, + { "500", OPTION_VAL_500_GL }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HE, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_GL, NULL, "hacks", { @@ -33407,11 +37329,11 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HE, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_GL, NULL, "hacks", { @@ -33423,47 +37345,47 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HE, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_GL, NULL, "input", { - { "0%", OPTION_VAL_0_HE }, - { "5%", OPTION_VAL_5_HE }, - { "10%", OPTION_VAL_10_HE }, - { "15%", OPTION_VAL_15_HE }, - { "20%", OPTION_VAL_20_HE }, - { "25%", OPTION_VAL_25_HE }, - { "30%", OPTION_VAL_30_HE }, + { "0%", OPTION_VAL_0_GL }, + { "5%", OPTION_VAL_5_GL }, + { "10%", OPTION_VAL_10_GL }, + { "15%", OPTION_VAL_15_GL }, + { "20%", OPTION_VAL_20_GL }, + { "25%", OPTION_VAL_25_GL }, + { "30%", OPTION_VAL_30_GL }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HE, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_GL, NULL, "input", { - { "0%", OPTION_VAL_0_HE }, - { "5%", OPTION_VAL_5_HE }, - { "10%", OPTION_VAL_10_HE }, - { "15%", OPTION_VAL_15_HE }, - { "20%", OPTION_VAL_20_HE }, - { "25%", OPTION_VAL_25_HE }, - { "30%", OPTION_VAL_30_HE }, + { "0%", OPTION_VAL_0_GL }, + { "5%", OPTION_VAL_5_GL }, + { "10%", OPTION_VAL_10_GL }, + { "15%", OPTION_VAL_15_GL }, + { "20%", OPTION_VAL_20_GL }, + { "25%", OPTION_VAL_25_GL }, + { "30%", OPTION_VAL_30_GL }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HE, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_GL, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_GL, NULL, "input", { @@ -33474,10 +37396,10 @@ struct retro_core_option_v2_definition option_defs_he[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HE, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_GL, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HE, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_GL, NULL, "input", { @@ -33485,124 +37407,268 @@ struct retro_core_option_v2_definition option_defs_he[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HE, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_GL, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HE, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_GL, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HE, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_GL, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HE, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_GL }, + { "60%", OPTION_VAL_60_GL }, + { "70%", OPTION_VAL_70_GL }, + { "80%", OPTION_VAL_80_GL }, + { "90%", OPTION_VAL_90_GL }, + { "100%", OPTION_VAL_100_O45_GL }, + { "110%", OPTION_VAL_110_O45_GL }, + { "120%", OPTION_VAL_120_O45_GL }, + { "130%", OPTION_VAL_130_O45_GL }, + { "140%", OPTION_VAL_140_O45_GL }, + { "150%", OPTION_VAL_150_O45_GL }, + { "160%", OPTION_VAL_160_O45_GL }, + { "170%", OPTION_VAL_170_O45_GL }, + { "180%", OPTION_VAL_180_O45_GL }, + { "190%", OPTION_VAL_190_O45_GL }, + { "200%", OPTION_VAL_200_O45_GL }, + { "210%", OPTION_VAL_210_O45_GL }, + { "220%", OPTION_VAL_220_O45_GL }, + { "230%", OPTION_VAL_230_O45_GL }, + { "240%", OPTION_VAL_240_O45_GL }, + { "250%", OPTION_VAL_250_O45_GL }, + { "260%", OPTION_VAL_260_O45_GL }, + { "270%", OPTION_VAL_270_O45_GL }, + { "280%", OPTION_VAL_280_O45_GL }, + { "290%", OPTION_VAL_290_O45_GL }, + { "300%", OPTION_VAL_300_O45_GL }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HE, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_GL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HE }, - { "Red", OPTION_VAL_RED_HE }, - { "Green", OPTION_VAL_GREEN_HE }, - { "Blue", OPTION_VAL_BLUE_HE }, + { "White", OPTION_VAL_WHITE_GL }, + { "Red", OPTION_VAL_RED_GL }, + { "Green", OPTION_VAL_GREEN_GL }, + { "Blue", OPTION_VAL_BLUE_GL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HE, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_GL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HE }, - { "Red", OPTION_VAL_RED_HE }, - { "Green", OPTION_VAL_GREEN_HE }, - { "Blue", OPTION_VAL_BLUE_HE }, + { "White", OPTION_VAL_WHITE_GL }, + { "Red", OPTION_VAL_RED_GL }, + { "Green", OPTION_VAL_GREEN_GL }, + { "Blue", OPTION_VAL_BLUE_GL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HE, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_GL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HE }, - { "Red", OPTION_VAL_RED_HE }, - { "Green", OPTION_VAL_GREEN_HE }, - { "Blue", OPTION_VAL_BLUE_HE }, + { "White", OPTION_VAL_WHITE_GL }, + { "Red", OPTION_VAL_RED_GL }, + { "Green", OPTION_VAL_GREEN_GL }, + { "Blue", OPTION_VAL_BLUE_GL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HE, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_GL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HE }, - { "Red", OPTION_VAL_RED_HE }, - { "Green", OPTION_VAL_GREEN_HE }, - { "Blue", OPTION_VAL_BLUE_HE }, + { "White", OPTION_VAL_WHITE_GL }, + { "Red", OPTION_VAL_RED_GL }, + { "Green", OPTION_VAL_GREEN_GL }, + { "Blue", OPTION_VAL_BLUE_GL }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_GL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_GL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_GL }, + { "Purupuru", OPTION_VAL_PURUPURU_GL }, + { "None", OPTION_VAL_NONE_GL }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HE, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_GL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_GL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_GL, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_HE }, - { "All VMUs", OPTION_VAL_ALL_VMUS_HE }, + { "VMU A1", OPTION_VAL_VMU_A1_GL }, + { "All VMUs", OPTION_VAL_ALL_VMUS_GL }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_HE, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HE, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_HE, + CORE_OPTION_NAME_VMU_SOUND_LABEL_GL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_GL, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_GL, NULL, "vmu", { @@ -33613,9 +37679,9 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HE, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_GL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_GL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_GL, NULL, "vmu", { @@ -33627,7 +37693,7 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HE, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_GL, NULL, "", NULL, @@ -33641,144 +37707,144 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HE, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_GL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HE, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_GL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HE }, - { "2x", OPTION_VAL_2_O27_HE }, - { "3x", OPTION_VAL_3X_HE }, - { "4x", OPTION_VAL_4_HE }, - { "5x", OPTION_VAL_5X_HE }, + { "1x", OPTION_VAL_1X_GL }, + { "2x", OPTION_VAL_2_O26_GL }, + { "3x", OPTION_VAL_3X_GL }, + { "4x", OPTION_VAL_4_GL }, + { "5x", OPTION_VAL_5X_GL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HE, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_GL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HE }, - { "20%", OPTION_VAL_20_HE }, - { "30%", OPTION_VAL_30_HE }, - { "40%", OPTION_VAL_40_HE }, - { "50%", OPTION_VAL_50_HE }, - { "60%", OPTION_VAL_60_HE }, - { "70%", OPTION_VAL_70_HE }, - { "80%", OPTION_VAL_80_HE }, - { "90%", OPTION_VAL_90_HE }, - { "100%", OPTION_VAL_100_O57_HE }, + { "10%", OPTION_VAL_10_GL }, + { "20%", OPTION_VAL_20_GL }, + { "30%", OPTION_VAL_30_GL }, + { "40%", OPTION_VAL_40_GL }, + { "50%", OPTION_VAL_50_GL }, + { "60%", OPTION_VAL_60_GL }, + { "70%", OPTION_VAL_70_GL }, + { "80%", OPTION_VAL_80_GL }, + { "90%", OPTION_VAL_90_GL }, + { "100%", OPTION_VAL_100_O45_GL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HE, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_GL, NULL, "", NULL, @@ -33792,144 +37858,144 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HE, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_GL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HE, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_GL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HE }, - { "2x", OPTION_VAL_2_O27_HE }, - { "3x", OPTION_VAL_3X_HE }, - { "4x", OPTION_VAL_4_HE }, - { "5x", OPTION_VAL_5X_HE }, + { "1x", OPTION_VAL_1X_GL }, + { "2x", OPTION_VAL_2_O26_GL }, + { "3x", OPTION_VAL_3X_GL }, + { "4x", OPTION_VAL_4_GL }, + { "5x", OPTION_VAL_5X_GL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HE, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_GL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HE }, - { "20%", OPTION_VAL_20_HE }, - { "30%", OPTION_VAL_30_HE }, - { "40%", OPTION_VAL_40_HE }, - { "50%", OPTION_VAL_50_HE }, - { "60%", OPTION_VAL_60_HE }, - { "70%", OPTION_VAL_70_HE }, - { "80%", OPTION_VAL_80_HE }, - { "90%", OPTION_VAL_90_HE }, - { "100%", OPTION_VAL_100_O57_HE }, + { "10%", OPTION_VAL_10_GL }, + { "20%", OPTION_VAL_20_GL }, + { "30%", OPTION_VAL_30_GL }, + { "40%", OPTION_VAL_40_GL }, + { "50%", OPTION_VAL_50_GL }, + { "60%", OPTION_VAL_60_GL }, + { "70%", OPTION_VAL_70_GL }, + { "80%", OPTION_VAL_80_GL }, + { "90%", OPTION_VAL_90_GL }, + { "100%", OPTION_VAL_100_O45_GL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HE, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_GL, NULL, "", NULL, @@ -33943,144 +38009,144 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HE, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_GL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HE, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_GL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HE }, - { "2x", OPTION_VAL_2_O27_HE }, - { "3x", OPTION_VAL_3X_HE }, - { "4x", OPTION_VAL_4_HE }, - { "5x", OPTION_VAL_5X_HE }, + { "1x", OPTION_VAL_1X_GL }, + { "2x", OPTION_VAL_2_O26_GL }, + { "3x", OPTION_VAL_3X_GL }, + { "4x", OPTION_VAL_4_GL }, + { "5x", OPTION_VAL_5X_GL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HE, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_GL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HE }, - { "20%", OPTION_VAL_20_HE }, - { "30%", OPTION_VAL_30_HE }, - { "40%", OPTION_VAL_40_HE }, - { "50%", OPTION_VAL_50_HE }, - { "60%", OPTION_VAL_60_HE }, - { "70%", OPTION_VAL_70_HE }, - { "80%", OPTION_VAL_80_HE }, - { "90%", OPTION_VAL_90_HE }, - { "100%", OPTION_VAL_100_O57_HE }, + { "10%", OPTION_VAL_10_GL }, + { "20%", OPTION_VAL_20_GL }, + { "30%", OPTION_VAL_30_GL }, + { "40%", OPTION_VAL_40_GL }, + { "50%", OPTION_VAL_50_GL }, + { "60%", OPTION_VAL_60_GL }, + { "70%", OPTION_VAL_70_GL }, + { "80%", OPTION_VAL_80_GL }, + { "90%", OPTION_VAL_90_GL }, + { "100%", OPTION_VAL_100_O45_GL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HE, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_GL, NULL, "", NULL, @@ -34094,783 +38160,608 @@ struct retro_core_option_v2_definition option_defs_he[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HE, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_GL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_GL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_GL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_GL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_GL }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HE, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_GL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HE }, - { "2x", OPTION_VAL_2_O27_HE }, - { "3x", OPTION_VAL_3X_HE }, - { "4x", OPTION_VAL_4_HE }, - { "5x", OPTION_VAL_5X_HE }, + { "1x", OPTION_VAL_1X_GL }, + { "2x", OPTION_VAL_2_O26_GL }, + { "3x", OPTION_VAL_3X_GL }, + { "4x", OPTION_VAL_4_GL }, + { "5x", OPTION_VAL_5X_GL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HE, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_GL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, - { "BLACK 02", OPTION_VAL_BLACK_02_HE }, - { "BLUE 03", OPTION_VAL_BLUE_HE }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, - { "GREEN 05", OPTION_VAL_GREEN_HE }, - { "CYAN 06", OPTION_VAL_CYAN_06_HE }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, - { "RED 11", OPTION_VAL_RED_HE }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, - { "GRAY 15", OPTION_VAL_GRAY_15_HE }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, - { "WHITE 28", OPTION_VAL_WHITE_HE }, - { NULL, NULL }, - }, - "DEFAULT_OFF 01", - }, - { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HE, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_GL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_GL }, + { "BLACK 02", OPTION_VAL_BLACK_02_GL }, + { "BLUE 03", OPTION_VAL_BLUE_GL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_GL }, + { "GREEN 05", OPTION_VAL_GREEN_GL }, + { "CYAN 06", OPTION_VAL_CYAN_06_GL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_GL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_GL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_GL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_GL }, + { "RED 11", OPTION_VAL_RED_GL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_GL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_GL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_GL }, + { "GRAY 15", OPTION_VAL_GRAY_15_GL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_GL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_GL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_GL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_GL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_GL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_GL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_GL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_GL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_GL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_GL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_GL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_GL }, + { "WHITE 28", OPTION_VAL_WHITE_GL }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_GL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HE }, - { "20%", OPTION_VAL_20_HE }, - { "30%", OPTION_VAL_30_HE }, - { "40%", OPTION_VAL_40_HE }, - { "50%", OPTION_VAL_50_HE }, - { "60%", OPTION_VAL_60_HE }, - { "70%", OPTION_VAL_70_HE }, - { "80%", OPTION_VAL_80_HE }, - { "90%", OPTION_VAL_90_HE }, - { "100%", OPTION_VAL_100_O57_HE }, + { "10%", OPTION_VAL_10_GL }, + { "20%", OPTION_VAL_20_GL }, + { "30%", OPTION_VAL_30_GL }, + { "40%", OPTION_VAL_40_GL }, + { "50%", OPTION_VAL_50_GL }, + { "60%", OPTION_VAL_60_GL }, + { "70%", OPTION_VAL_70_GL }, + { "80%", OPTION_VAL_80_GL }, + { "90%", OPTION_VAL_90_GL }, + { "100%", OPTION_VAL_100_O45_GL }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_he = { - option_cats_he, - option_defs_he +struct retro_core_options_v2 options_gl = { + option_cats_gl, + option_defs_gl }; -/* RETRO_LANGUAGE_HR */ - -#define CATEGORY_SYSTEM_LABEL_HR NULL -#define CATEGORY_SYSTEM_INFO_0_HR NULL -#define CATEGORY_VIDEO_LABEL_HR NULL -#define CATEGORY_VIDEO_INFO_0_HR NULL -#define CATEGORY_PERFORMANCE_LABEL_HR NULL -#define CATEGORY_PERFORMANCE_INFO_0_HR NULL -#define CATEGORY_HACKS_LABEL_HR NULL -#define CATEGORY_HACKS_INFO_0_HR NULL -#define CATEGORY_INPUT_LABEL_HR NULL -#define CATEGORY_INPUT_INFO_0_HR NULL -#define CATEGORY_VMU_LABEL_HR NULL -#define CATEGORY_VMU_INFO_0_HR NULL -#define CORE_OPTION_NAME_REGION_LABEL_HR "Regija" -#define OPTION_VAL_JAPAN_HR NULL -#define OPTION_VAL_USA_HR NULL -#define OPTION_VAL_EUROPE_HR NULL -#define OPTION_VAL_DEFAULT_HR NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_HR "Jezik" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HR NULL -#define OPTION_VAL_JAPANESE_HR NULL -#define OPTION_VAL_ENGLISH_HR NULL -#define OPTION_VAL_GERMAN_HR NULL -#define OPTION_VAL_FRENCH_HR NULL -#define OPTION_VAL_SPANISH_HR NULL -#define OPTION_VAL_ITALIAN_HR NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HR NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_HR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HR NULL -#define CORE_OPTION_NAME_UPNP_LABEL_HR NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_HR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HR NULL -#define OPTION_VAL_320X240_HR NULL -#define OPTION_VAL_640X480_HR NULL -#define OPTION_VAL_800X600_HR NULL -#define OPTION_VAL_960X720_HR NULL -#define OPTION_VAL_1024X768_HR NULL -#define OPTION_VAL_1280X960_HR NULL -#define OPTION_VAL_1440X1080_HR NULL -#define OPTION_VAL_1600X1200_HR NULL -#define OPTION_VAL_1920X1440_HR NULL -#define OPTION_VAL_2560X1920_HR NULL -#define OPTION_VAL_2880X2160_HR NULL -#define OPTION_VAL_3200X2400_HR NULL -#define OPTION_VAL_3840X2880_HR NULL -#define OPTION_VAL_4480X3360_HR NULL -#define OPTION_VAL_5120X3840_HR NULL -#define OPTION_VAL_5760X4320_HR NULL -#define OPTION_VAL_6400X4800_HR NULL -#define OPTION_VAL_7040X5280_HR NULL -#define OPTION_VAL_7680X5760_HR NULL -#define OPTION_VAL_8320X6240_HR NULL -#define OPTION_VAL_8960X6720_HR NULL -#define OPTION_VAL_9600X7200_HR NULL -#define OPTION_VAL_10240X7680_HR NULL -#define OPTION_VAL_10880X8160_HR NULL -#define OPTION_VAL_11520X8640_HR NULL -#define OPTION_VAL_12160X9120_HR NULL -#define OPTION_VAL_12800X9600_HR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HR NULL -#define OPTION_VAL_VGA_HR NULL -#define OPTION_VAL_TV_RGB_HR NULL -#define OPTION_VAL_TV_COMPOSITE_HR NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_HR NULL -#define OPTION_VAL_NTSC_HR NULL -#define OPTION_VAL_PAL_HR NULL -#define OPTION_VAL_PAL_N_HR NULL -#define OPTION_VAL_PAL_M_HR NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HR NULL -#define OPTION_VAL_HORIZONTAL_HR NULL -#define OPTION_VAL_VERTICAL_HR NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HR NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HR NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_HR NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_HR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HR NULL -#define OPTION_VAL_512MB_HR NULL -#define OPTION_VAL_1GB_HR NULL -#define OPTION_VAL_2GB_HR NULL -#define OPTION_VAL_4GB_HR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HR NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HR NULL -#define CORE_OPTION_NAME_FOG_LABEL_HR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HR NULL -#define OPTION_VAL_1_HR NULL -#define OPTION_VAL_2_HR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HR NULL -#define OPTION_VAL_2_O27_HR NULL -#define OPTION_VAL_4_HR NULL -#define OPTION_VAL_6_HR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HR NULL -#define OPTION_VAL_SOME_HR NULL -#define OPTION_VAL_MORE_HR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HR NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HR NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HR NULL -#define OPTION_VAL_100_HR NULL -#define OPTION_VAL_110_HR NULL -#define OPTION_VAL_120_HR NULL -#define OPTION_VAL_130_HR NULL -#define OPTION_VAL_140_HR NULL -#define OPTION_VAL_150_HR NULL -#define OPTION_VAL_160_HR NULL -#define OPTION_VAL_170_HR NULL -#define OPTION_VAL_180_HR NULL -#define OPTION_VAL_190_HR NULL -#define OPTION_VAL_200_HR NULL -#define OPTION_VAL_210_HR NULL -#define OPTION_VAL_220_HR NULL -#define OPTION_VAL_230_HR NULL -#define OPTION_VAL_240_HR NULL -#define OPTION_VAL_250_HR NULL -#define OPTION_VAL_260_HR NULL -#define OPTION_VAL_270_HR NULL -#define OPTION_VAL_280_HR NULL -#define OPTION_VAL_290_HR NULL -#define OPTION_VAL_300_HR NULL -#define OPTION_VAL_310_HR NULL -#define OPTION_VAL_320_HR NULL -#define OPTION_VAL_330_HR NULL -#define OPTION_VAL_340_HR NULL -#define OPTION_VAL_350_HR NULL -#define OPTION_VAL_360_HR NULL -#define OPTION_VAL_370_HR NULL -#define OPTION_VAL_380_HR NULL -#define OPTION_VAL_390_HR NULL -#define OPTION_VAL_400_HR NULL -#define OPTION_VAL_410_HR NULL -#define OPTION_VAL_420_HR NULL -#define OPTION_VAL_430_HR NULL -#define OPTION_VAL_440_HR NULL -#define OPTION_VAL_450_HR NULL -#define OPTION_VAL_460_HR NULL -#define OPTION_VAL_470_HR NULL -#define OPTION_VAL_480_HR NULL -#define OPTION_VAL_490_HR NULL -#define OPTION_VAL_500_HR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HR NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HR NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HR NULL -#define OPTION_VAL_0_HR NULL -#define OPTION_VAL_5_HR NULL -#define OPTION_VAL_10_HR NULL -#define OPTION_VAL_15_HR NULL -#define OPTION_VAL_20_HR NULL -#define OPTION_VAL_25_HR NULL -#define OPTION_VAL_30_HR NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HR NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HR NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HR NULL -#define OPTION_VAL_WHITE_HR NULL -#define OPTION_VAL_RED_HR NULL -#define OPTION_VAL_GREEN_HR NULL -#define OPTION_VAL_BLUE_HR NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HR NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HR NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HR NULL -#define OPTION_VAL_VMU_A1_HR NULL -#define OPTION_VAL_ALL_VMUS_HR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HR NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HR NULL -#define OPTION_VAL_UPPER_LEFT_HR NULL -#define OPTION_VAL_UPPER_RIGHT_HR NULL -#define OPTION_VAL_LOWER_LEFT_HR NULL -#define OPTION_VAL_LOWER_RIGHT_HR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HR NULL -#define OPTION_VAL_1X_HR NULL -#define OPTION_VAL_3X_HR NULL -#define OPTION_VAL_5X_HR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HR NULL -#define OPTION_VAL_DEFAULT_ON_00_HR NULL -#define OPTION_VAL_DEFAULT_OFF_01_HR NULL -#define OPTION_VAL_BLACK_02_HR NULL -#define OPTION_VAL_LIGHT_BLUE_04_HR NULL -#define OPTION_VAL_CYAN_06_HR NULL -#define OPTION_VAL_CYAN_BLUE_07_HR NULL -#define OPTION_VAL_LIGHT_GREEN_08_HR NULL -#define OPTION_VAL_CYAN_GREEN_09_HR NULL -#define OPTION_VAL_LIGHT_CYAN_10_HR NULL -#define OPTION_VAL_PURPLE_12_HR NULL -#define OPTION_VAL_LIGHT_PURPLE_13_HR NULL -#define OPTION_VAL_YELLOW_14_HR NULL -#define OPTION_VAL_GRAY_15_HR NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_HR NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_HR NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_HR NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_HR NULL -#define OPTION_VAL_LIGHT_RED_2_20_HR NULL -#define OPTION_VAL_MAGENTA_21_HR NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_HR NULL -#define OPTION_VAL_LIGHT_ORANGE_23_HR NULL -#define OPTION_VAL_ORANGE_24_HR NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_HR NULL -#define OPTION_VAL_LIGHT_YELLOW_26_HR NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_HR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HR NULL -#define OPTION_VAL_40_HR NULL -#define OPTION_VAL_50_HR NULL -#define OPTION_VAL_60_HR NULL -#define OPTION_VAL_70_HR NULL -#define OPTION_VAL_80_HR NULL -#define OPTION_VAL_90_HR NULL -#define OPTION_VAL_100_O57_HR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HR NULL +/* RETRO_LANGUAGE_HE */ -struct retro_core_option_v2_category option_cats_hr[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_HR, - CATEGORY_SYSTEM_INFO_0_HR - }, - { - "video", - CATEGORY_VIDEO_LABEL_HR, - CATEGORY_VIDEO_INFO_0_HR - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_HR, - CATEGORY_PERFORMANCE_INFO_0_HR - }, - { - "hacks", - CATEGORY_HACKS_LABEL_HR, - CATEGORY_HACKS_INFO_0_HR - }, - { - "input", - CATEGORY_INPUT_LABEL_HR, - CATEGORY_INPUT_INFO_0_HR - }, - { - "vmu", - CATEGORY_VMU_LABEL_HR, - CATEGORY_VMU_INFO_0_HR - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_hr[] = { - { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_HR, - NULL, - "", - NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_HR }, - { "USA", OPTION_VAL_USA_HR }, - { "Europe", OPTION_VAL_EUROPE_HR }, - { "Default", OPTION_VAL_DEFAULT_HR }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_HR, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_HR, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_HR }, - { "English", OPTION_VAL_ENGLISH_HR }, - { "German", OPTION_VAL_GERMAN_HR }, - { "French", OPTION_VAL_FRENCH_HR }, - { "Spanish", OPTION_VAL_SPANISH_HR }, - { "Italian", OPTION_VAL_ITALIAN_HR }, - { "Default", OPTION_VAL_DEFAULT_HR }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_HR, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HR, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_HR, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif - }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_HR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HR, - NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HR, - NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, - { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_HR, - NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_HR, - NULL, - CORE_OPTION_NAME_UPNP_INFO_0_HR, - NULL, +#define CATEGORY_SYSTEM_LABEL_HE NULL +#define CATEGORY_SYSTEM_INFO_0_HE NULL +#define CATEGORY_VIDEO_LABEL_HE "וידאו" +#define CATEGORY_VIDEO_INFO_0_HE NULL +#define CATEGORY_PERFORMANCE_LABEL_HE NULL +#define CATEGORY_PERFORMANCE_INFO_0_HE NULL +#define CATEGORY_HACKS_LABEL_HE NULL +#define CATEGORY_HACKS_INFO_0_HE NULL +#define CATEGORY_INPUT_LABEL_HE "קלט" +#define CATEGORY_INPUT_INFO_0_HE NULL +#define CATEGORY_EXPANSIONS_LABEL_HE NULL +#define CATEGORY_EXPANSIONS_INFO_0_HE NULL +#define CATEGORY_VMU_LABEL_HE NULL +#define CATEGORY_VMU_INFO_0_HE NULL +#define CORE_OPTION_NAME_REGION_LABEL_HE NULL +#define OPTION_VAL_JAPAN_HE NULL +#define OPTION_VAL_USA_HE NULL +#define OPTION_VAL_EUROPE_HE NULL +#define OPTION_VAL_DEFAULT_HE NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_HE NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HE NULL +#define OPTION_VAL_JAPANESE_HE NULL +#define OPTION_VAL_ENGLISH_HE NULL +#define OPTION_VAL_GERMAN_HE NULL +#define OPTION_VAL_FRENCH_HE NULL +#define OPTION_VAL_SPANISH_HE NULL +#define OPTION_VAL_ITALIAN_HE NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HE NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HE NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HE NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HE NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HE NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HE NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HE NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HE NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HE NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HE NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HE NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HE NULL +#define CORE_OPTION_NAME_UPNP_LABEL_HE NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_HE NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HE NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HE NULL +#define OPTION_VAL_320X240_HE NULL +#define OPTION_VAL_640X480_HE NULL +#define OPTION_VAL_800X600_HE NULL +#define OPTION_VAL_960X720_HE NULL +#define OPTION_VAL_1024X768_HE NULL +#define OPTION_VAL_1280X960_HE NULL +#define OPTION_VAL_1440X1080_HE NULL +#define OPTION_VAL_1600X1200_HE NULL +#define OPTION_VAL_1920X1440_HE NULL +#define OPTION_VAL_2560X1920_HE NULL +#define OPTION_VAL_2880X2160_HE NULL +#define OPTION_VAL_3200X2400_HE NULL +#define OPTION_VAL_3840X2880_HE NULL +#define OPTION_VAL_4480X3360_HE NULL +#define OPTION_VAL_5120X3840_HE NULL +#define OPTION_VAL_5760X4320_HE NULL +#define OPTION_VAL_6400X4800_HE NULL +#define OPTION_VAL_7040X5280_HE NULL +#define OPTION_VAL_7680X5760_HE NULL +#define OPTION_VAL_8320X6240_HE NULL +#define OPTION_VAL_8960X6720_HE NULL +#define OPTION_VAL_9600X7200_HE NULL +#define OPTION_VAL_10240X7680_HE NULL +#define OPTION_VAL_10880X8160_HE NULL +#define OPTION_VAL_11520X8640_HE NULL +#define OPTION_VAL_12160X9120_HE NULL +#define OPTION_VAL_12800X9600_HE NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HE NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HE NULL +#define OPTION_VAL_VGA_HE NULL +#define OPTION_VAL_TV_RGB_HE NULL +#define OPTION_VAL_TV_COMPOSITE_HE NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_HE NULL +#define OPTION_VAL_NTSC_HE NULL +#define OPTION_VAL_PAL_HE NULL +#define OPTION_VAL_PAL_N_HE NULL +#define OPTION_VAL_PAL_M_HE NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HE NULL +#define OPTION_VAL_HORIZONTAL_HE NULL +#define OPTION_VAL_VERTICAL_HE NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HE NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HE NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HE NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_HE NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_HE NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HE NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HE NULL +#define OPTION_VAL_512MB_HE NULL +#define OPTION_VAL_1GB_HE NULL +#define OPTION_VAL_2GB_HE NULL +#define OPTION_VAL_4GB_HE NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HE NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HE NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HE NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HE NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HE NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HE NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HE NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_HE NULL +#define CORE_OPTION_NAME_FOG_LABEL_HE NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HE NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HE NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HE NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HE NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HE NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HE NULL +#define OPTION_VAL_1_HE NULL +#define OPTION_VAL_2_HE NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HE NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HE NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HE NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HE NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HE NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HE NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HE NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HE NULL +#define OPTION_VAL_2_O26_HE NULL +#define OPTION_VAL_4_HE NULL +#define OPTION_VAL_6_HE NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HE NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HE NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HE NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HE NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HE NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HE NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HE NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HE NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HE NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HE NULL +#define OPTION_VAL_SOME_HE NULL +#define OPTION_VAL_MORE_HE NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HE NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HE NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HE NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HE NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HE NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HE NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HE NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HE NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HE NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HE NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HE NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HE NULL +#define OPTION_VAL_100_HE NULL +#define OPTION_VAL_110_HE NULL +#define OPTION_VAL_120_HE NULL +#define OPTION_VAL_130_HE NULL +#define OPTION_VAL_140_HE NULL +#define OPTION_VAL_150_HE NULL +#define OPTION_VAL_160_HE NULL +#define OPTION_VAL_170_HE NULL +#define OPTION_VAL_180_HE NULL +#define OPTION_VAL_190_HE NULL +#define OPTION_VAL_200_HE NULL +#define OPTION_VAL_210_HE NULL +#define OPTION_VAL_220_HE NULL +#define OPTION_VAL_230_HE NULL +#define OPTION_VAL_240_HE NULL +#define OPTION_VAL_250_HE NULL +#define OPTION_VAL_260_HE NULL +#define OPTION_VAL_270_HE NULL +#define OPTION_VAL_280_HE NULL +#define OPTION_VAL_290_HE NULL +#define OPTION_VAL_300_HE NULL +#define OPTION_VAL_310_HE NULL +#define OPTION_VAL_320_HE NULL +#define OPTION_VAL_330_HE NULL +#define OPTION_VAL_340_HE NULL +#define OPTION_VAL_350_HE NULL +#define OPTION_VAL_360_HE NULL +#define OPTION_VAL_370_HE NULL +#define OPTION_VAL_380_HE NULL +#define OPTION_VAL_390_HE NULL +#define OPTION_VAL_400_HE NULL +#define OPTION_VAL_410_HE NULL +#define OPTION_VAL_420_HE NULL +#define OPTION_VAL_430_HE NULL +#define OPTION_VAL_440_HE NULL +#define OPTION_VAL_450_HE NULL +#define OPTION_VAL_460_HE NULL +#define OPTION_VAL_470_HE NULL +#define OPTION_VAL_480_HE NULL +#define OPTION_VAL_490_HE NULL +#define OPTION_VAL_500_HE NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HE NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HE NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HE NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HE NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HE NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HE NULL +#define OPTION_VAL_0_HE NULL +#define OPTION_VAL_5_HE NULL +#define OPTION_VAL_10_HE NULL +#define OPTION_VAL_15_HE NULL +#define OPTION_VAL_20_HE NULL +#define OPTION_VAL_25_HE NULL +#define OPTION_VAL_30_HE NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HE NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HE NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HE NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HE NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HE NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HE NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HE NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HE NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HE NULL +#define OPTION_VAL_50_HE NULL +#define OPTION_VAL_60_HE NULL +#define OPTION_VAL_70_HE NULL +#define OPTION_VAL_80_HE NULL +#define OPTION_VAL_90_HE NULL +#define OPTION_VAL_100_O45_HE NULL +#define OPTION_VAL_110_O45_HE NULL +#define OPTION_VAL_120_O45_HE NULL +#define OPTION_VAL_130_O45_HE NULL +#define OPTION_VAL_140_O45_HE NULL +#define OPTION_VAL_150_O45_HE NULL +#define OPTION_VAL_160_O45_HE NULL +#define OPTION_VAL_170_O45_HE NULL +#define OPTION_VAL_180_O45_HE NULL +#define OPTION_VAL_190_O45_HE NULL +#define OPTION_VAL_200_O45_HE NULL +#define OPTION_VAL_210_O45_HE NULL +#define OPTION_VAL_220_O45_HE NULL +#define OPTION_VAL_230_O45_HE NULL +#define OPTION_VAL_240_O45_HE NULL +#define OPTION_VAL_250_O45_HE NULL +#define OPTION_VAL_260_O45_HE NULL +#define OPTION_VAL_270_O45_HE NULL +#define OPTION_VAL_280_O45_HE NULL +#define OPTION_VAL_290_O45_HE NULL +#define OPTION_VAL_300_O45_HE NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HE NULL +#define OPTION_VAL_WHITE_HE NULL +#define OPTION_VAL_RED_HE NULL +#define OPTION_VAL_GREEN_HE NULL +#define OPTION_VAL_BLUE_HE NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HE NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HE NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HE NULL +#define OPTION_VAL_VMU_HE NULL +#define OPTION_VAL_PURUPURU_HE NULL +#define OPTION_VAL_NONE_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HE NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HE NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HE NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HE NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HE NULL +#define OPTION_VAL_VMU_A1_HE NULL +#define OPTION_VAL_ALL_VMUS_HE NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HE NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HE NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HE NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HE NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HE NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HE NULL +#define OPTION_VAL_UPPER_LEFT_HE NULL +#define OPTION_VAL_UPPER_RIGHT_HE NULL +#define OPTION_VAL_LOWER_LEFT_HE NULL +#define OPTION_VAL_LOWER_RIGHT_HE NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HE NULL +#define OPTION_VAL_1X_HE NULL +#define OPTION_VAL_3X_HE NULL +#define OPTION_VAL_5X_HE NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HE NULL +#define OPTION_VAL_DEFAULT_ON_00_HE NULL +#define OPTION_VAL_DEFAULT_OFF_01_HE NULL +#define OPTION_VAL_BLACK_02_HE NULL +#define OPTION_VAL_LIGHT_BLUE_04_HE NULL +#define OPTION_VAL_CYAN_06_HE NULL +#define OPTION_VAL_CYAN_BLUE_07_HE NULL +#define OPTION_VAL_LIGHT_GREEN_08_HE NULL +#define OPTION_VAL_CYAN_GREEN_09_HE NULL +#define OPTION_VAL_LIGHT_CYAN_10_HE NULL +#define OPTION_VAL_PURPLE_12_HE NULL +#define OPTION_VAL_LIGHT_PURPLE_13_HE NULL +#define OPTION_VAL_YELLOW_14_HE NULL +#define OPTION_VAL_GRAY_15_HE NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_HE NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_HE NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_HE NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_HE NULL +#define OPTION_VAL_LIGHT_RED_2_20_HE NULL +#define OPTION_VAL_MAGENTA_21_HE NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_HE NULL +#define OPTION_VAL_LIGHT_ORANGE_23_HE NULL +#define OPTION_VAL_ORANGE_24_HE NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_HE NULL +#define OPTION_VAL_LIGHT_YELLOW_26_HE NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_HE NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HE NULL +#define OPTION_VAL_40_HE NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HE NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HE NULL + +struct retro_core_option_v2_category option_cats_he[] = { + { "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", + CATEGORY_SYSTEM_LABEL_HE, + CATEGORY_SYSTEM_INFO_0_HE }, - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HR, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HR, - NULL, "video", - { - { "320x240", OPTION_VAL_320X240_HR }, - { "640x480", OPTION_VAL_640X480_HR }, - { "800x600", OPTION_VAL_800X600_HR }, - { "960x720", OPTION_VAL_960X720_HR }, - { "1024x768", OPTION_VAL_1024X768_HR }, - { "1280x960", OPTION_VAL_1280X960_HR }, - { "1440x1080", OPTION_VAL_1440X1080_HR }, - { "1600x1200", OPTION_VAL_1600X1200_HR }, - { "1920x1440", OPTION_VAL_1920X1440_HR }, - { "2560x1920", OPTION_VAL_2560X1920_HR }, - { "2880x2160", OPTION_VAL_2880X2160_HR }, - { "3200x2400", OPTION_VAL_3200X2400_HR }, - { "3840x2880", OPTION_VAL_3840X2880_HR }, - { "4480x3360", OPTION_VAL_4480X3360_HR }, - { "5120x3840", OPTION_VAL_5120X3840_HR }, - { "5760x4320", OPTION_VAL_5760X4320_HR }, - { "6400x4800", OPTION_VAL_6400X4800_HR }, - { "7040x5280", OPTION_VAL_7040X5280_HR }, - { "7680x5760", OPTION_VAL_7680X5760_HR }, - { "8320x6240", OPTION_VAL_8320X6240_HR }, - { "8960x6720", OPTION_VAL_8960X6720_HR }, - { "9600x7200", OPTION_VAL_9600X7200_HR }, - { "10240x7680", OPTION_VAL_10240X7680_HR }, - { "10880x8160", OPTION_VAL_10880X8160_HR }, - { "11520x8640", OPTION_VAL_11520X8640_HR }, - { "12160x9120", OPTION_VAL_12160X9120_HR }, - { "12800x9600", OPTION_VAL_12800X9600_HR }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif + CATEGORY_VIDEO_LABEL_HE, + CATEGORY_VIDEO_INFO_0_HE }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_HR, - NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HR, - NULL, - "video", - { - { "VGA", OPTION_VAL_VGA_HR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_HR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HR }, - { NULL, NULL }, - }, - "TV (Composite)", + "performance", + CATEGORY_PERFORMANCE_LABEL_HE, + CATEGORY_PERFORMANCE_INFO_0_HE }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_HR, - NULL, - "", - NULL, - "video", - { - { "NTSC", OPTION_VAL_NTSC_HR }, - { "PAL", OPTION_VAL_PAL_HR }, - { "PAL_N", OPTION_VAL_PAL_N_HR }, - { "PAL_M", OPTION_VAL_PAL_M_HR }, - { "Default", OPTION_VAL_DEFAULT_HR }, - { NULL, NULL }, - }, - "NTSC", + "hacks", + CATEGORY_HACKS_LABEL_HE, + CATEGORY_HACKS_INFO_0_HE }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HR, + "input", + CATEGORY_INPUT_LABEL_HE, + CATEGORY_INPUT_INFO_0_HE + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_HE, + CATEGORY_EXPANSIONS_INFO_0_HE + }, + { + "vmu", + CATEGORY_VMU_LABEL_HE, + CATEGORY_VMU_INFO_0_HE + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_he[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_HE, NULL, "", NULL, - "video", + "system", { - { "horizontal", OPTION_VAL_HORIZONTAL_HR }, - { "vertical", OPTION_VAL_VERTICAL_HR }, + { "Japan", OPTION_VAL_JAPAN_HE }, + { "USA", OPTION_VAL_USA_HE }, + { "Europe", OPTION_VAL_EUROPE_HE }, + { "Default", OPTION_VAL_DEFAULT_HE }, { NULL, NULL }, }, - "horizontal", + "USA", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HR, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_LANGUAGE_INFO_0_HE, NULL, - "video", + "system", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HR }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HR }, -#endif + { "Japanese", OPTION_VAL_JAPANESE_HE }, + { "English", OPTION_VAL_ENGLISH_HE }, + { "German", OPTION_VAL_GERMAN_HE }, + { "French", OPTION_VAL_FRENCH_HE }, + { "Spanish", OPTION_VAL_SPANISH_HE }, + { "Italian", OPTION_VAL_ITALIAN_HE }, + { "Default", OPTION_VAL_DEFAULT_HE }, { NULL, NULL }, }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + "English", }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HR, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_HE, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_HE, NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_HR }, - { "1GB", OPTION_VAL_1GB_HR }, - { "2GB", OPTION_VAL_2GB_HR }, - { "4GB", OPTION_VAL_4GB_HR }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, }, - "512MB", + "disabled", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_HR, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HE, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HE, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "32", + "disabled", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HR, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_HE, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HE, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HR, + { + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HE, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HE, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -34878,13 +38769,13 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_HR, + { + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HE, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -34893,26 +38784,26 @@ struct retro_core_option_v2_definition option_defs_hr[] = { "enabled", }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_HR, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HE, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HR, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_HE, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HR, + CORE_OPTION_NAME_UPNP_INFO_0_HE, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -34920,11 +38811,228 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, "enabled", }, + { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HR, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HE, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HE, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_HE }, + { "640x480", OPTION_VAL_640X480_HE }, + { "800x600", OPTION_VAL_800X600_HE }, + { "960x720", OPTION_VAL_960X720_HE }, + { "1024x768", OPTION_VAL_1024X768_HE }, + { "1280x960", OPTION_VAL_1280X960_HE }, + { "1440x1080", OPTION_VAL_1440X1080_HE }, + { "1600x1200", OPTION_VAL_1600X1200_HE }, + { "1920x1440", OPTION_VAL_1920X1440_HE }, + { "2560x1920", OPTION_VAL_2560X1920_HE }, + { "2880x2160", OPTION_VAL_2880X2160_HE }, + { "3200x2400", OPTION_VAL_3200X2400_HE }, + { "3840x2880", OPTION_VAL_3840X2880_HE }, + { "4480x3360", OPTION_VAL_4480X3360_HE }, + { "5120x3840", OPTION_VAL_5120X3840_HE }, + { "5760x4320", OPTION_VAL_5760X4320_HE }, + { "6400x4800", OPTION_VAL_6400X4800_HE }, + { "7040x5280", OPTION_VAL_7040X5280_HE }, + { "7680x5760", OPTION_VAL_7680X5760_HE }, + { "8320x6240", OPTION_VAL_8320X6240_HE }, + { "8960x6720", OPTION_VAL_8960X6720_HE }, + { "9600x7200", OPTION_VAL_9600X7200_HE }, + { "10240x7680", OPTION_VAL_10240X7680_HE }, + { "10880x8160", OPTION_VAL_10880X8160_HE }, + { "11520x8640", OPTION_VAL_11520X8640_HE }, + { "12160x9120", OPTION_VAL_12160X9120_HE }, + { "12800x9600", OPTION_VAL_12800X9600_HE }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_HE, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HE, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_HE }, + { "TV (RGB)", OPTION_VAL_TV_RGB_HE }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HE }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_HE, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_HE }, + { "PAL", OPTION_VAL_PAL_HE }, + { "PAL_N", OPTION_VAL_PAL_N_HE }, + { "PAL_M", OPTION_VAL_PAL_M_HE }, + { "Default", OPTION_VAL_DEFAULT_HE }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HE, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_HE }, + { "vertical", OPTION_VAL_VERTICAL_HE }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HE, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HE, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HE }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HE }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HE }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HE, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HE, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_HE }, + { "1GB", OPTION_VAL_1GB_HE }, + { "2GB", OPTION_VAL_2GB_HE }, + { "4GB", OPTION_VAL_4GB_HE }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_HE, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HE, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HE, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HE, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_HE, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_HE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_HE, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HE, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HE, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HE, NULL, "video", { @@ -34939,24 +39047,24 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HE, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HE, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_HR }, - { "1", OPTION_VAL_1_HR }, - { "2", OPTION_VAL_2_HR }, + { "0", OPTION_VAL_DEFAULT_HE }, + { "1", OPTION_VAL_1_HE }, + { "2", OPTION_VAL_2_HE }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HE, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HE, NULL, "video", { @@ -34964,13 +39072,13 @@ struct retro_core_option_v2_definition option_defs_hr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HE, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HE, NULL, "video", { @@ -34982,9 +39090,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HE, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HE, NULL, "video", { @@ -34997,25 +39105,25 @@ struct retro_core_option_v2_definition option_defs_hr[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_HR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_HE, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HE, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_HR }, - { "4", OPTION_VAL_4_HR }, - { "6", OPTION_VAL_6_HR }, + { "2", OPTION_VAL_2_O26_HE }, + { "4", OPTION_VAL_4_HE }, + { "6", OPTION_VAL_6_HE }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HE, NULL, "video", { @@ -35029,9 +39137,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HE, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HE, NULL, "video", { @@ -35041,11 +39149,25 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HE, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HE, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HE, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HE, NULL, "performance", { @@ -35057,15 +39179,15 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HE, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HE, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_HR }, - { "more", OPTION_VAL_MORE_HR }, + { "some", OPTION_VAL_SOME_HE }, + { "more", OPTION_VAL_MORE_HE }, { NULL, NULL }, }, #ifdef LOW_END @@ -35076,9 +39198,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HE, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HE, NULL, "performance", { @@ -35095,9 +39217,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HE, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HE, NULL, "hacks", { @@ -35109,9 +39231,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HE, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HE, NULL, "hacks", { @@ -35123,9 +39245,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HE, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HE, NULL, "hacks", { @@ -35139,64 +39261,78 @@ struct retro_core_option_v2_definition option_defs_hr[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HE, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HE, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_HR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_HE, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_HR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_HE, NULL, "hacks", { - { "100", OPTION_VAL_100_HR }, - { "110", OPTION_VAL_110_HR }, - { "120", OPTION_VAL_120_HR }, - { "130", OPTION_VAL_130_HR }, - { "140", OPTION_VAL_140_HR }, - { "150", OPTION_VAL_150_HR }, - { "160", OPTION_VAL_160_HR }, - { "170", OPTION_VAL_170_HR }, - { "180", OPTION_VAL_180_HR }, - { "190", OPTION_VAL_190_HR }, - { "200", OPTION_VAL_200_HR }, - { "210", OPTION_VAL_210_HR }, - { "220", OPTION_VAL_220_HR }, - { "230", OPTION_VAL_230_HR }, - { "240", OPTION_VAL_240_HR }, - { "250", OPTION_VAL_250_HR }, - { "260", OPTION_VAL_260_HR }, - { "270", OPTION_VAL_270_HR }, - { "280", OPTION_VAL_280_HR }, - { "290", OPTION_VAL_290_HR }, - { "300", OPTION_VAL_300_HR }, - { "310", OPTION_VAL_310_HR }, - { "320", OPTION_VAL_320_HR }, - { "330", OPTION_VAL_330_HR }, - { "340", OPTION_VAL_340_HR }, - { "350", OPTION_VAL_350_HR }, - { "360", OPTION_VAL_360_HR }, - { "370", OPTION_VAL_370_HR }, - { "380", OPTION_VAL_380_HR }, - { "390", OPTION_VAL_390_HR }, - { "400", OPTION_VAL_400_HR }, - { "410", OPTION_VAL_410_HR }, - { "420", OPTION_VAL_420_HR }, - { "430", OPTION_VAL_430_HR }, - { "440", OPTION_VAL_440_HR }, - { "450", OPTION_VAL_450_HR }, - { "460", OPTION_VAL_460_HR }, - { "470", OPTION_VAL_470_HR }, - { "480", OPTION_VAL_480_HR }, - { "490", OPTION_VAL_490_HR }, - { "500", OPTION_VAL_500_HR }, + { "100", OPTION_VAL_100_HE }, + { "110", OPTION_VAL_110_HE }, + { "120", OPTION_VAL_120_HE }, + { "130", OPTION_VAL_130_HE }, + { "140", OPTION_VAL_140_HE }, + { "150", OPTION_VAL_150_HE }, + { "160", OPTION_VAL_160_HE }, + { "170", OPTION_VAL_170_HE }, + { "180", OPTION_VAL_180_HE }, + { "190", OPTION_VAL_190_HE }, + { "200", OPTION_VAL_200_HE }, + { "210", OPTION_VAL_210_HE }, + { "220", OPTION_VAL_220_HE }, + { "230", OPTION_VAL_230_HE }, + { "240", OPTION_VAL_240_HE }, + { "250", OPTION_VAL_250_HE }, + { "260", OPTION_VAL_260_HE }, + { "270", OPTION_VAL_270_HE }, + { "280", OPTION_VAL_280_HE }, + { "290", OPTION_VAL_290_HE }, + { "300", OPTION_VAL_300_HE }, + { "310", OPTION_VAL_310_HE }, + { "320", OPTION_VAL_320_HE }, + { "330", OPTION_VAL_330_HE }, + { "340", OPTION_VAL_340_HE }, + { "350", OPTION_VAL_350_HE }, + { "360", OPTION_VAL_360_HE }, + { "370", OPTION_VAL_370_HE }, + { "380", OPTION_VAL_380_HE }, + { "390", OPTION_VAL_390_HE }, + { "400", OPTION_VAL_400_HE }, + { "410", OPTION_VAL_410_HE }, + { "420", OPTION_VAL_420_HE }, + { "430", OPTION_VAL_430_HE }, + { "440", OPTION_VAL_440_HE }, + { "450", OPTION_VAL_450_HE }, + { "460", OPTION_VAL_460_HE }, + { "470", OPTION_VAL_470_HE }, + { "480", OPTION_VAL_480_HE }, + { "490", OPTION_VAL_490_HE }, + { "500", OPTION_VAL_500_HE }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HE, NULL, "hacks", { @@ -35206,11 +39342,11 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HE, NULL, "hacks", { @@ -35222,47 +39358,47 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HE, NULL, "input", { - { "0%", OPTION_VAL_0_HR }, - { "5%", OPTION_VAL_5_HR }, - { "10%", OPTION_VAL_10_HR }, - { "15%", OPTION_VAL_15_HR }, - { "20%", OPTION_VAL_20_HR }, - { "25%", OPTION_VAL_25_HR }, - { "30%", OPTION_VAL_30_HR }, + { "0%", OPTION_VAL_0_HE }, + { "5%", OPTION_VAL_5_HE }, + { "10%", OPTION_VAL_10_HE }, + { "15%", OPTION_VAL_15_HE }, + { "20%", OPTION_VAL_20_HE }, + { "25%", OPTION_VAL_25_HE }, + { "30%", OPTION_VAL_30_HE }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HR, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HE, NULL, "input", { - { "0%", OPTION_VAL_0_HR }, - { "5%", OPTION_VAL_5_HR }, - { "10%", OPTION_VAL_10_HR }, - { "15%", OPTION_VAL_15_HR }, - { "20%", OPTION_VAL_20_HR }, - { "25%", OPTION_VAL_25_HR }, - { "30%", OPTION_VAL_30_HR }, + { "0%", OPTION_VAL_0_HE }, + { "5%", OPTION_VAL_5_HE }, + { "10%", OPTION_VAL_10_HE }, + { "15%", OPTION_VAL_15_HE }, + { "20%", OPTION_VAL_20_HE }, + { "25%", OPTION_VAL_25_HE }, + { "30%", OPTION_VAL_30_HE }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HR, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HE, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HE, NULL, "input", { @@ -35273,10 +39409,10 @@ struct retro_core_option_v2_definition option_defs_hr[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HR, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HE, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HR, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HE, NULL, "input", { @@ -35284,124 +39420,268 @@ struct retro_core_option_v2_definition option_defs_hr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HR, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HE, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HE, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HR, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HE, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HR, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_HE }, + { "60%", OPTION_VAL_60_HE }, + { "70%", OPTION_VAL_70_HE }, + { "80%", OPTION_VAL_80_HE }, + { "90%", OPTION_VAL_90_HE }, + { "100%", OPTION_VAL_100_O45_HE }, + { "110%", OPTION_VAL_110_O45_HE }, + { "120%", OPTION_VAL_120_O45_HE }, + { "130%", OPTION_VAL_130_O45_HE }, + { "140%", OPTION_VAL_140_O45_HE }, + { "150%", OPTION_VAL_150_O45_HE }, + { "160%", OPTION_VAL_160_O45_HE }, + { "170%", OPTION_VAL_170_O45_HE }, + { "180%", OPTION_VAL_180_O45_HE }, + { "190%", OPTION_VAL_190_O45_HE }, + { "200%", OPTION_VAL_200_O45_HE }, + { "210%", OPTION_VAL_210_O45_HE }, + { "220%", OPTION_VAL_220_O45_HE }, + { "230%", OPTION_VAL_230_O45_HE }, + { "240%", OPTION_VAL_240_O45_HE }, + { "250%", OPTION_VAL_250_O45_HE }, + { "260%", OPTION_VAL_260_O45_HE }, + { "270%", OPTION_VAL_270_O45_HE }, + { "280%", OPTION_VAL_280_O45_HE }, + { "290%", OPTION_VAL_290_O45_HE }, + { "300%", OPTION_VAL_300_O45_HE }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HR, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HR }, - { "Red", OPTION_VAL_RED_HR }, - { "Green", OPTION_VAL_GREEN_HR }, - { "Blue", OPTION_VAL_BLUE_HR }, + { "White", OPTION_VAL_WHITE_HE }, + { "Red", OPTION_VAL_RED_HE }, + { "Green", OPTION_VAL_GREEN_HE }, + { "Blue", OPTION_VAL_BLUE_HE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HR, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HR }, - { "Red", OPTION_VAL_RED_HR }, - { "Green", OPTION_VAL_GREEN_HR }, - { "Blue", OPTION_VAL_BLUE_HR }, + { "White", OPTION_VAL_WHITE_HE }, + { "Red", OPTION_VAL_RED_HE }, + { "Green", OPTION_VAL_GREEN_HE }, + { "Blue", OPTION_VAL_BLUE_HE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HR, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HR }, - { "Red", OPTION_VAL_RED_HR }, - { "Green", OPTION_VAL_GREEN_HR }, - { "Blue", OPTION_VAL_BLUE_HR }, + { "White", OPTION_VAL_WHITE_HE }, + { "Red", OPTION_VAL_RED_HE }, + { "Green", OPTION_VAL_GREEN_HE }, + { "Blue", OPTION_VAL_BLUE_HE }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HR, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HE, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HR }, - { "Red", OPTION_VAL_RED_HR }, - { "Green", OPTION_VAL_GREEN_HR }, - { "Blue", OPTION_VAL_BLUE_HR }, + { "White", OPTION_VAL_WHITE_HE }, + { "Red", OPTION_VAL_RED_HE }, + { "Green", OPTION_VAL_GREEN_HE }, + { "Blue", OPTION_VAL_BLUE_HE }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HE, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HE, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_HR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_HR }, + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HE, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HE, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_HE }, + { "Purupuru", OPTION_VAL_PURUPURU_HE }, + { "None", OPTION_VAL_NONE_HE }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HE, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HE, + NULL, + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_HE }, + { "All VMUs", OPTION_VAL_ALL_VMUS_HE }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_HR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_HR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_HE, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HE, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_HE, NULL, "vmu", { @@ -35412,9 +39692,9 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HE, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HE, NULL, "vmu", { @@ -35426,7 +39706,7 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HR, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HE, NULL, "", NULL, @@ -35440,144 +39720,144 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HR, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HR, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HR }, - { "2x", OPTION_VAL_2_O27_HR }, - { "3x", OPTION_VAL_3X_HR }, - { "4x", OPTION_VAL_4_HR }, - { "5x", OPTION_VAL_5X_HR }, + { "1x", OPTION_VAL_1X_HE }, + { "2x", OPTION_VAL_2_O26_HE }, + { "3x", OPTION_VAL_3X_HE }, + { "4x", OPTION_VAL_4_HE }, + { "5x", OPTION_VAL_5X_HE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HR, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HR }, - { "20%", OPTION_VAL_20_HR }, - { "30%", OPTION_VAL_30_HR }, - { "40%", OPTION_VAL_40_HR }, - { "50%", OPTION_VAL_50_HR }, - { "60%", OPTION_VAL_60_HR }, - { "70%", OPTION_VAL_70_HR }, - { "80%", OPTION_VAL_80_HR }, - { "90%", OPTION_VAL_90_HR }, - { "100%", OPTION_VAL_100_O57_HR }, + { "10%", OPTION_VAL_10_HE }, + { "20%", OPTION_VAL_20_HE }, + { "30%", OPTION_VAL_30_HE }, + { "40%", OPTION_VAL_40_HE }, + { "50%", OPTION_VAL_50_HE }, + { "60%", OPTION_VAL_60_HE }, + { "70%", OPTION_VAL_70_HE }, + { "80%", OPTION_VAL_80_HE }, + { "90%", OPTION_VAL_90_HE }, + { "100%", OPTION_VAL_100_O45_HE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HR, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HE, NULL, "", NULL, @@ -35591,144 +39871,144 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HR, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HR, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HR }, - { "2x", OPTION_VAL_2_O27_HR }, - { "3x", OPTION_VAL_3X_HR }, - { "4x", OPTION_VAL_4_HR }, - { "5x", OPTION_VAL_5X_HR }, + { "1x", OPTION_VAL_1X_HE }, + { "2x", OPTION_VAL_2_O26_HE }, + { "3x", OPTION_VAL_3X_HE }, + { "4x", OPTION_VAL_4_HE }, + { "5x", OPTION_VAL_5X_HE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HR, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HR }, - { "20%", OPTION_VAL_20_HR }, - { "30%", OPTION_VAL_30_HR }, - { "40%", OPTION_VAL_40_HR }, - { "50%", OPTION_VAL_50_HR }, - { "60%", OPTION_VAL_60_HR }, - { "70%", OPTION_VAL_70_HR }, - { "80%", OPTION_VAL_80_HR }, - { "90%", OPTION_VAL_90_HR }, - { "100%", OPTION_VAL_100_O57_HR }, + { "10%", OPTION_VAL_10_HE }, + { "20%", OPTION_VAL_20_HE }, + { "30%", OPTION_VAL_30_HE }, + { "40%", OPTION_VAL_40_HE }, + { "50%", OPTION_VAL_50_HE }, + { "60%", OPTION_VAL_60_HE }, + { "70%", OPTION_VAL_70_HE }, + { "80%", OPTION_VAL_80_HE }, + { "90%", OPTION_VAL_90_HE }, + { "100%", OPTION_VAL_100_O45_HE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HR, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HE, NULL, "", NULL, @@ -35742,144 +40022,144 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HR, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HR, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HR }, - { "2x", OPTION_VAL_2_O27_HR }, - { "3x", OPTION_VAL_3X_HR }, - { "4x", OPTION_VAL_4_HR }, - { "5x", OPTION_VAL_5X_HR }, + { "1x", OPTION_VAL_1X_HE }, + { "2x", OPTION_VAL_2_O26_HE }, + { "3x", OPTION_VAL_3X_HE }, + { "4x", OPTION_VAL_4_HE }, + { "5x", OPTION_VAL_5X_HE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HR, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HR }, - { "20%", OPTION_VAL_20_HR }, - { "30%", OPTION_VAL_30_HR }, - { "40%", OPTION_VAL_40_HR }, - { "50%", OPTION_VAL_50_HR }, - { "60%", OPTION_VAL_60_HR }, - { "70%", OPTION_VAL_70_HR }, - { "80%", OPTION_VAL_80_HR }, - { "90%", OPTION_VAL_90_HR }, - { "100%", OPTION_VAL_100_O57_HR }, + { "10%", OPTION_VAL_10_HE }, + { "20%", OPTION_VAL_20_HE }, + { "30%", OPTION_VAL_30_HE }, + { "40%", OPTION_VAL_40_HE }, + { "50%", OPTION_VAL_50_HE }, + { "60%", OPTION_VAL_60_HE }, + { "70%", OPTION_VAL_70_HE }, + { "80%", OPTION_VAL_80_HE }, + { "90%", OPTION_VAL_90_HE }, + { "100%", OPTION_VAL_100_O45_HE }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HR, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HE, NULL, "", NULL, @@ -35893,505 +40173,560 @@ struct retro_core_option_v2_definition option_defs_hr[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HR, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HE, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HE }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HE }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HE }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HE }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HR, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HE, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HR }, - { "2x", OPTION_VAL_2_O27_HR }, - { "3x", OPTION_VAL_3X_HR }, - { "4x", OPTION_VAL_4_HR }, - { "5x", OPTION_VAL_5X_HR }, + { "1x", OPTION_VAL_1X_HE }, + { "2x", OPTION_VAL_2_O26_HE }, + { "3x", OPTION_VAL_3X_HE }, + { "4x", OPTION_VAL_4_HE }, + { "5x", OPTION_VAL_5X_HE }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HR, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HE, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, - { "BLACK 02", OPTION_VAL_BLACK_02_HR }, - { "BLUE 03", OPTION_VAL_BLUE_HR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, - { "GREEN 05", OPTION_VAL_GREEN_HR }, - { "CYAN 06", OPTION_VAL_CYAN_06_HR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, - { "RED 11", OPTION_VAL_RED_HR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, - { "GRAY 15", OPTION_VAL_GRAY_15_HR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, - { "WHITE 28", OPTION_VAL_WHITE_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HE }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HE }, + { "BLACK 02", OPTION_VAL_BLACK_02_HE }, + { "BLUE 03", OPTION_VAL_BLUE_HE }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HE }, + { "GREEN 05", OPTION_VAL_GREEN_HE }, + { "CYAN 06", OPTION_VAL_CYAN_06_HE }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HE }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HE }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HE }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HE }, + { "RED 11", OPTION_VAL_RED_HE }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HE }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HE }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HE }, + { "GRAY 15", OPTION_VAL_GRAY_15_HE }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HE }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HE }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HE }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HE }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HE }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HE }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HE }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HE }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HE }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HE }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HE }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HE }, + { "WHITE 28", OPTION_VAL_WHITE_HE }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HR, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HE, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HR }, - { "20%", OPTION_VAL_20_HR }, - { "30%", OPTION_VAL_30_HR }, - { "40%", OPTION_VAL_40_HR }, - { "50%", OPTION_VAL_50_HR }, - { "60%", OPTION_VAL_60_HR }, - { "70%", OPTION_VAL_70_HR }, - { "80%", OPTION_VAL_80_HR }, - { "90%", OPTION_VAL_90_HR }, - { "100%", OPTION_VAL_100_O57_HR }, + { "10%", OPTION_VAL_10_HE }, + { "20%", OPTION_VAL_20_HE }, + { "30%", OPTION_VAL_30_HE }, + { "40%", OPTION_VAL_40_HE }, + { "50%", OPTION_VAL_50_HE }, + { "60%", OPTION_VAL_60_HE }, + { "70%", OPTION_VAL_70_HE }, + { "80%", OPTION_VAL_80_HE }, + { "90%", OPTION_VAL_90_HE }, + { "100%", OPTION_VAL_100_O45_HE }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_hr = { - option_cats_hr, - option_defs_hr +struct retro_core_options_v2 options_he = { + option_cats_he, + option_defs_he }; -/* RETRO_LANGUAGE_HU */ - -#define CATEGORY_SYSTEM_LABEL_HU "Rendszer" -#define CATEGORY_SYSTEM_INFO_0_HU "A régió, nyelv, BIOS, és a hardveralap beállításai." -#define CATEGORY_VIDEO_LABEL_HU "Kép" -#define CATEGORY_VIDEO_INFO_0_HU "A felbontás, sorrendfüggetlen átlátszóság, és vizuális effektek beállításai." -#define CATEGORY_PERFORMANCE_LABEL_HU "Teljesítmény" -#define CATEGORY_PERFORMANCE_INFO_0_HU "A többszálas megjelenítés és képkockakihagyás beállításai." -#define CATEGORY_HACKS_LABEL_HU "Emulációs trükkök" -#define CATEGORY_HACKS_INFO_0_HU "A szélesvásznú módosítások, GD-ROM betöltés sebessége, és a textúracserék beállításai." -#define CATEGORY_INPUT_LABEL_HU "Bemenet" -#define CATEGORY_INPUT_INFO_0_HU "A kontroller és fénypisztoly beállításai." -#define CATEGORY_VMU_LABEL_HU NULL -#define CATEGORY_VMU_INFO_0_HU "A játékonkénti VMU mentések és a képernyőn látható VMU beállításai." -#define CORE_OPTION_NAME_REGION_LABEL_HU "Régió" -#define OPTION_VAL_JAPAN_HU "Japán" -#define OPTION_VAL_USA_HU NULL -#define OPTION_VAL_EUROPE_HU "Európa" -#define OPTION_VAL_DEFAULT_HU "Alapértelmezett" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_HU "Nyelv" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HU "A nyelv, amelyet a BIOS és a több nyelvet tartalmazó játékok használnak." -#define OPTION_VAL_JAPANESE_HU "japán" -#define OPTION_VAL_ENGLISH_HU "angol" -#define OPTION_VAL_GERMAN_HU "német" -#define OPTION_VAL_FRENCH_HU "francia" -#define OPTION_VAL_SPANISH_HU "spanyol" -#define OPTION_VAL_ITALIAN_HU "olasz" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HU "HLE BIOS (újraindítás szükséges)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HU "Mindenképp a magas szinten emulált BIOS használata." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HU "Indítás BIOS-ban (újraindítás szükséges)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HU "Belépés a Dreamcast BIOS menüjébe rögtön Indításkor." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HU "DSP engedélyezése" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HU "A Dreamcast DSP (digitális jelfeldolgozó) emulálásának engedélyezése. Javítja a generált hang pontosságát, de megnöveli a teljesítményigényt." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_HU "Mindenképp Windows CE mód" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HU "A teljes MMU (Memory Management Unit) emulálása és egyéb beállítások Windows CE játékokhoz." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HU "NAOMI szervizgombok engedélyezése" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HU "A NAOMI szervizgombjának engedélyezése, a kabinet beállításaihoz." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HU "Ingyen játék a NAOMI játékokhoz" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HU "Az érmebeállítások ingyen játékra állítása." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU "Szélessávú adapter emulálása" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU "Modem helyett a szélessávú Ethernet adapter emulálása. (Újraindítás szükséges.)" -#define CORE_OPTION_NAME_UPNP_LABEL_HU "UPnP engedélyezése" -#define CORE_OPTION_NAME_UPNP_INFO_0_HU "Az internetre csatlakozó router automatikus konfigurálása az online játékokhoz UPnP-n keresztül." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HU "Belső felbontás" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HU "A képelőállítás felbontása." -#define OPTION_VAL_320X240_HU NULL -#define OPTION_VAL_640X480_HU NULL -#define OPTION_VAL_800X600_HU NULL -#define OPTION_VAL_960X720_HU NULL -#define OPTION_VAL_1024X768_HU NULL -#define OPTION_VAL_1280X960_HU NULL -#define OPTION_VAL_1440X1080_HU NULL -#define OPTION_VAL_1600X1200_HU NULL -#define OPTION_VAL_1920X1440_HU NULL -#define OPTION_VAL_2560X1920_HU NULL -#define OPTION_VAL_2880X2160_HU NULL -#define OPTION_VAL_3200X2400_HU NULL -#define OPTION_VAL_3840X2880_HU NULL -#define OPTION_VAL_4480X3360_HU NULL -#define OPTION_VAL_5120X3840_HU NULL -#define OPTION_VAL_5760X4320_HU NULL -#define OPTION_VAL_6400X4800_HU NULL -#define OPTION_VAL_7040X5280_HU NULL -#define OPTION_VAL_7680X5760_HU NULL -#define OPTION_VAL_8320X6240_HU NULL -#define OPTION_VAL_8960X6720_HU NULL -#define OPTION_VAL_9600X7200_HU NULL -#define OPTION_VAL_10240X7680_HU NULL -#define OPTION_VAL_10880X8160_HU NULL -#define OPTION_VAL_11520X8640_HU NULL -#define OPTION_VAL_12160X9120_HU NULL -#define OPTION_VAL_12800X9600_HU NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HU "Kábel típusa" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HU "A kimenő jel típusa. A \"TV (kompozit)\" támogatása a legelterjedtebb." -#define OPTION_VAL_VGA_HU NULL -#define OPTION_VAL_TV_RGB_HU NULL -#define OPTION_VAL_TV_COMPOSITE_HU "TV (kompozit)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_HU "Műsorszórási szabvány" -#define OPTION_VAL_NTSC_HU NULL -#define OPTION_VAL_PAL_HU "PAL (Világszerte)" -#define OPTION_VAL_PAL_N_HU NULL -#define OPTION_VAL_PAL_M_HU NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HU "Képernyő tájolása" -#define OPTION_VAL_HORIZONTAL_HU "Vízszintes" -#define OPTION_VAL_VERTICAL_HU "Függőleges" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HU "Alfa rendezés" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HU "Per-strip (gyors, legkevésbé pontos)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_HU "Per-triangle (normál)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_HU "Per-pixel (pontos, de a leglassabb)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HU "Pixel gyűjtőbuffer mérete" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HU "Magasabb felbontások helyes visszaadásához nagyobb értékek kellhetnek." -#define OPTION_VAL_512MB_HU NULL -#define OPTION_VAL_1GB_HU NULL -#define OPTION_VAL_2GB_HU NULL -#define OPTION_VAL_4GB_HU NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HU "Átlátszó rétegek maximális száma" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HU "Összetett jelenetekhez nagyobb értékekre lehet szükség." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HU "Teljes framebuffer emuláció" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HU "A VRAM framebuffer teljes emulálásának engedélyezése. Olyan játékokhoz hasznos, amelyek közvetlenül a VRAM-ban írják vagy olvassák a framebuffert. Bekapcsolva a belső felbontás mindenképpen 640x480 lesz és a teljesítmény erősen visszaeshet." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HU "RTT (Render to texture) puffer engedélyezése" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU "Az előállított textúrák visszamásolása a GPU-ból a VRAM-ba. Ez a lehetőség rendszerint be van kapcsolva azoknál a játékoknál, amelyek igénylik. Bekapcsolt állapotban a textúra előállítás felméretezése kikapcsol, és hatással lehet a teljesítményre." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HU NULL -#define CORE_OPTION_NAME_FOG_LABEL_HU "Köd effekt" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HU "Térfogatmódosító" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HU "A Dreamcast GPU-jának egy szolgáltatása, amit a játékok rendszerint tárgyak árnyékának megrajzolásához használnak. Normál esetben legyen bekapcsolva, hatása a teljesítményre rendszerint minimális vagy elhanyagolható." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HU "Anizotróp szûrés" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HU "Minőségjavítás azokon a felületi textúrákon, amik a kamerához képest rézsútosan helyezkednek el. Nagyobb érték jobban terheli a GPU-t. A változtatás csak újraindítás után lép életbe." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HU "Textúraszűrés" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HU "A textúraszűrés módja. Ezzel lehet egy bizonyos textúraszűrési módot rákényszeríteni minden textúrára, hogy az alapértelmezésnél élesebb (vagy simább) megjelenésük legyen. Az alapértelmezettől eltérő értékek különféle megjelenítési hibákat okozhatnak. A változások csak újraindítás után lépnek életbe." -#define OPTION_VAL_1_HU "Mindenképp Nearest-Neighbor" -#define OPTION_VAL_2_HU "Mindenképp lineáris" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HU "Képkockacsere késleltetése" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HU "A villódzó képernyőt vagy hibás mozgóképet segít elkerülni. Lassú platformokon nem ajánlott." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HU "Képkockasebesség változásainak érzékelése" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HU "A frontend értesítése, amikor a belső képsebesség megváltozik (pl. 60 fps-ről 30 fps-re). Javítja a megjelenítés ütemét olyan játékoknál, amelyek fix 20 vagy 30 fps-sel futnak, de legyen kikapcsolva nem rögzített (instabil) képsebességű játékoknál (pl. Ecco the Dolphin, Unreal Tournament). Figyelem: nem elérhető, ha az automatikus képkocka kihagyás be van kapcsolva." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HU "PowerVR2 utófeldolgozó szűrő" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HU "Az előállított kép utófeldolgozása a PowerVR2 GPU és az analóg videojelek egyedi effektjeinek szimulálásához." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HU "Textúra felméretezés (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HU "A kézzel rajzolt 2D pixel art grafikák feljavítása. Csak a 2D pixelgrafikus játékokhoz ajánlott." -#define OPTION_VAL_2_O27_HU NULL -#define OPTION_VAL_4_HU NULL -#define OPTION_VAL_6_HU NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HU "Textúra felméretezés maximális szűrt mérete" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HU "Natív mélységi interpoláció" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HU "Segíthet a textúrahibákon és mélységi problémákon AMD GPU-k, vagy néhány esetben Intel GPU-k használatakor is." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HU "Többszálas képelőállítás" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HU "A CPU és GPU külön szálon futnak. Erősen ajánlott." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HU "Automatikus képkocka kihagyás" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HU "Képkockák automatikus kihagyása, ha az emulátor lassan fut. Figyelem: csak akkor érvényes, ha a többszálas képelőállítás engedélyezett." -#define OPTION_VAL_SOME_HU "Normál" -#define OPTION_VAL_MORE_HU "Maximális" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HU "Képkocka kihagyás" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HU "Két megjelenített képkocka közt ennyi képkocka eldobása." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HU "Szélesvásznú csalások (újraindítás szükséges)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HU "Csalások alkalmazása, amelyekkel bizonyos játékok szélesvásznú formátumban jelennek meg." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HU "Szélesvásznú trükk" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HU "A normál 4:3-as képarányon kívüli geometria felrajzolása. Grafikai hibákat tartalmazhat az így megjelenített területeken." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HU "GD-ROM gyorstöltés (pontatlan)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HU "A GD-ROM betöltésének felgyorsítása." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HU NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HU NULL -#define OPTION_VAL_100_HU NULL -#define OPTION_VAL_110_HU NULL -#define OPTION_VAL_120_HU NULL -#define OPTION_VAL_130_HU NULL -#define OPTION_VAL_140_HU NULL -#define OPTION_VAL_150_HU NULL -#define OPTION_VAL_160_HU NULL -#define OPTION_VAL_170_HU NULL -#define OPTION_VAL_180_HU NULL -#define OPTION_VAL_190_HU NULL -#define OPTION_VAL_200_HU NULL -#define OPTION_VAL_210_HU NULL -#define OPTION_VAL_220_HU NULL -#define OPTION_VAL_230_HU NULL -#define OPTION_VAL_240_HU NULL -#define OPTION_VAL_250_HU NULL -#define OPTION_VAL_260_HU NULL -#define OPTION_VAL_270_HU NULL -#define OPTION_VAL_280_HU NULL -#define OPTION_VAL_290_HU NULL -#define OPTION_VAL_300_HU NULL -#define OPTION_VAL_310_HU NULL -#define OPTION_VAL_320_HU NULL -#define OPTION_VAL_330_HU NULL -#define OPTION_VAL_340_HU NULL -#define OPTION_VAL_350_HU NULL -#define OPTION_VAL_360_HU NULL -#define OPTION_VAL_370_HU NULL -#define OPTION_VAL_380_HU NULL -#define OPTION_VAL_390_HU NULL -#define OPTION_VAL_400_HU NULL -#define OPTION_VAL_410_HU NULL -#define OPTION_VAL_420_HU NULL -#define OPTION_VAL_430_HU NULL -#define OPTION_VAL_440_HU NULL -#define OPTION_VAL_450_HU NULL -#define OPTION_VAL_460_HU NULL -#define OPTION_VAL_470_HU NULL -#define OPTION_VAL_480_HU NULL -#define OPTION_VAL_490_HU NULL -#define OPTION_VAL_500_HU NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HU "Egyedi textúrák betöltése" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HU "Textúrák lementése" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HU "Analóg kar holtsávja" -#define OPTION_VAL_0_HU NULL -#define OPTION_VAL_5_HU NULL -#define OPTION_VAL_10_HU NULL -#define OPTION_VAL_15_HU NULL -#define OPTION_VAL_20_HU NULL -#define OPTION_VAL_25_HU NULL -#define OPTION_VAL_30_HU NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HU "Ravasz holtsávja" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HU "Digitális ravasz" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HU "Purupuru csomag / Vibrációs csomag" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HU "A kontroller erővisszacsatolásának engedélyezése." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HU "Digitális kimenetek sugárzása" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HU "A digitális kimenetek és az erővisszacsatolás állapotának közzététele a 8000-es TCP porton. Kompatibilis a MAME \"-output network\" opciójával." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU "Fénypisztoly beállítások megjelenítése" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU "A fénypisztoly célkereszt megjelenítés beállításai. Figyelem: a változtatás életbelépéséhez újra be kell lépni a gyorsmenübe." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU "1. fénypisztoly célkeresztjének megjelenítése" -#define OPTION_VAL_WHITE_HU "Fehér" -#define OPTION_VAL_RED_HU "Vörös" -#define OPTION_VAL_GREEN_HU "Zöld" -#define OPTION_VAL_BLUE_HU "Kék" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU "2. fénypisztoly célkeresztjének megjelenítése" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU "3. fénypisztoly célkeresztjének megjelenítése" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU "4. fénypisztoly célkeresztjének megjelenítése" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU "Játékonként külön Visual Memory Unit/System (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU "Játékonként külön VMU" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU "Kikapcsolva minden játék ugyanazt a 4 VMU mentés fájlt (A1, B1, C1, D1) használja a RetroArch rendszerkönyvtárban. \"VMU A1\" beállításnál minden elindított játéknak külön VMU \"A1\" fájlt hoz létre. \"Minden VMU\" beállításnál minden elindított játéknak négy külön VMU fájlt (A1, B1, C1, D1) hoz létre." -#define OPTION_VAL_VMU_A1_HU NULL -#define OPTION_VAL_ALL_VMUS_HU "Minden VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HU NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HU NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HU NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU "Visual Memory Unit/System (VMU) megjelenítési beállítások jelenjenek meg" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU "VMU megjelenítési beállítások jelenjenek meg" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU "Az emulált VMU LCD képernyő láthatósági, méret, helyzet, és szín beállításainak engedélyezése. Figyelem: a gyorsmenüt ki-be kell kapcsolni, hogy ez a beállítás érvényre jusson." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU "VMU 1 képernyő megjelenítése" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU "VMU 1 képernyő helyzete" -#define OPTION_VAL_UPPER_LEFT_HU "Bal felső" -#define OPTION_VAL_UPPER_RIGHT_HU "Jobb felső" -#define OPTION_VAL_LOWER_LEFT_HU "Bal alsó" -#define OPTION_VAL_LOWER_RIGHT_HU "Jobb alsó" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU "VMU 1 képernyő mérete" -#define OPTION_VAL_1X_HU NULL -#define OPTION_VAL_3X_HU NULL -#define OPTION_VAL_5X_HU NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU "VMU 1 képernyő bekapcsolt pixel színe" -#define OPTION_VAL_DEFAULT_ON_00_HU "Alapértelmezésben bekapcsolva" -#define OPTION_VAL_DEFAULT_OFF_01_HU "Alapértelmezésben kikapcsolva" -#define OPTION_VAL_BLACK_02_HU "Fekete" -#define OPTION_VAL_LIGHT_BLUE_04_HU "Világoskék" -#define OPTION_VAL_CYAN_06_HU "Ciánkék" -#define OPTION_VAL_CYAN_BLUE_07_HU "Ciánkék" -#define OPTION_VAL_LIGHT_GREEN_08_HU "Világoszöld" -#define OPTION_VAL_CYAN_GREEN_09_HU "Ciánzöld" -#define OPTION_VAL_LIGHT_CYAN_10_HU "Világos ciánkék" -#define OPTION_VAL_PURPLE_12_HU "Lila" -#define OPTION_VAL_LIGHT_PURPLE_13_HU "Világoslila" -#define OPTION_VAL_YELLOW_14_HU "Sárga" -#define OPTION_VAL_GRAY_15_HU "Szürke" -#define OPTION_VAL_LIGHT_PURPLE_2_16_HU "Világoslila (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_HU "Világoszöld (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_HU "Világoszöld (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_HU "Világos ciánkék (2)" -#define OPTION_VAL_LIGHT_RED_2_20_HU "Világospiros (2)" -#define OPTION_VAL_MAGENTA_21_HU "Bíbor" -#define OPTION_VAL_LIGHT_PURPLE_3_22_HU "Világoslila (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_HU "Világos narancs" -#define OPTION_VAL_ORANGE_24_HU "Narancssárga" -#define OPTION_VAL_LIGHT_PURPLE_4_25_HU "Világoslila (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_HU "Halványsárga" -#define OPTION_VAL_LIGHT_YELLOW_2_27_HU "Halványsárga (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU "VMU 1 képernyő kikapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU "VMU 1 képernyő átlátszatlansága" -#define OPTION_VAL_40_HU NULL -#define OPTION_VAL_50_HU NULL -#define OPTION_VAL_60_HU NULL -#define OPTION_VAL_70_HU NULL -#define OPTION_VAL_80_HU NULL -#define OPTION_VAL_90_HU NULL -#define OPTION_VAL_100_O57_HU NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU "VMU 2 képernyő megjelenítése" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU "VMU 2 képernyő helyzete" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU "VMU 2 képernyő mérete" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU "VMU 2 képernyő bekapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU "VMU 2 képernyő kikapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU "VMU 2 képernyő átlátszatlansága" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU "VMU 3 képernyő megjelenítése" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU "VMU 3 képernyő helyzete" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU "VMU 3 képernyő mérete" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU "VMU 3 képernyő bekapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU "VMU 3 képernyő kikapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU "VMU 3 képernyő átlátszatlansága" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU "VMU 4 képernyő megjelenítése" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU "VMU 4 képernyő helyzete" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU "VMU 4 képernyő mérete" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU "VMU 4 képernyő bekapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU "VMU 4 képernyő kikapcsolt pixel színe" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU "VMU 4 képernyő átlátszatlansága" +/* RETRO_LANGUAGE_HR */ -struct retro_core_option_v2_category option_cats_hu[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_HU, - CATEGORY_SYSTEM_INFO_0_HU - }, - { - "video", - CATEGORY_VIDEO_LABEL_HU, - CATEGORY_VIDEO_INFO_0_HU - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_HU, - CATEGORY_PERFORMANCE_INFO_0_HU - }, - { - "hacks", - CATEGORY_HACKS_LABEL_HU, - CATEGORY_HACKS_INFO_0_HU - }, - { - "input", - CATEGORY_INPUT_LABEL_HU, - CATEGORY_INPUT_INFO_0_HU +#define CATEGORY_SYSTEM_LABEL_HR NULL +#define CATEGORY_SYSTEM_INFO_0_HR NULL +#define CATEGORY_VIDEO_LABEL_HR NULL +#define CATEGORY_VIDEO_INFO_0_HR NULL +#define CATEGORY_PERFORMANCE_LABEL_HR NULL +#define CATEGORY_PERFORMANCE_INFO_0_HR NULL +#define CATEGORY_HACKS_LABEL_HR NULL +#define CATEGORY_HACKS_INFO_0_HR NULL +#define CATEGORY_INPUT_LABEL_HR NULL +#define CATEGORY_INPUT_INFO_0_HR NULL +#define CATEGORY_EXPANSIONS_LABEL_HR NULL +#define CATEGORY_EXPANSIONS_INFO_0_HR NULL +#define CATEGORY_VMU_LABEL_HR NULL +#define CATEGORY_VMU_INFO_0_HR NULL +#define CORE_OPTION_NAME_REGION_LABEL_HR "Regija" +#define OPTION_VAL_JAPAN_HR NULL +#define OPTION_VAL_USA_HR NULL +#define OPTION_VAL_EUROPE_HR NULL +#define OPTION_VAL_DEFAULT_HR NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_HR "Jezik" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HR NULL +#define OPTION_VAL_JAPANESE_HR NULL +#define OPTION_VAL_ENGLISH_HR NULL +#define OPTION_VAL_GERMAN_HR NULL +#define OPTION_VAL_FRENCH_HR NULL +#define OPTION_VAL_SPANISH_HR NULL +#define OPTION_VAL_ITALIAN_HR NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HR NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HR NULL +#define CORE_OPTION_NAME_UPNP_LABEL_HR NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_HR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HR NULL +#define OPTION_VAL_320X240_HR NULL +#define OPTION_VAL_640X480_HR NULL +#define OPTION_VAL_800X600_HR NULL +#define OPTION_VAL_960X720_HR NULL +#define OPTION_VAL_1024X768_HR NULL +#define OPTION_VAL_1280X960_HR NULL +#define OPTION_VAL_1440X1080_HR NULL +#define OPTION_VAL_1600X1200_HR NULL +#define OPTION_VAL_1920X1440_HR NULL +#define OPTION_VAL_2560X1920_HR NULL +#define OPTION_VAL_2880X2160_HR NULL +#define OPTION_VAL_3200X2400_HR NULL +#define OPTION_VAL_3840X2880_HR NULL +#define OPTION_VAL_4480X3360_HR NULL +#define OPTION_VAL_5120X3840_HR NULL +#define OPTION_VAL_5760X4320_HR NULL +#define OPTION_VAL_6400X4800_HR NULL +#define OPTION_VAL_7040X5280_HR NULL +#define OPTION_VAL_7680X5760_HR NULL +#define OPTION_VAL_8320X6240_HR NULL +#define OPTION_VAL_8960X6720_HR NULL +#define OPTION_VAL_9600X7200_HR NULL +#define OPTION_VAL_10240X7680_HR NULL +#define OPTION_VAL_10880X8160_HR NULL +#define OPTION_VAL_11520X8640_HR NULL +#define OPTION_VAL_12160X9120_HR NULL +#define OPTION_VAL_12800X9600_HR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HR NULL +#define OPTION_VAL_VGA_HR NULL +#define OPTION_VAL_TV_RGB_HR NULL +#define OPTION_VAL_TV_COMPOSITE_HR NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_HR NULL +#define OPTION_VAL_NTSC_HR NULL +#define OPTION_VAL_PAL_HR NULL +#define OPTION_VAL_PAL_N_HR NULL +#define OPTION_VAL_PAL_M_HR NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HR NULL +#define OPTION_VAL_HORIZONTAL_HR NULL +#define OPTION_VAL_VERTICAL_HR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HR NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HR NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_HR NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_HR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HR NULL +#define OPTION_VAL_512MB_HR NULL +#define OPTION_VAL_1GB_HR NULL +#define OPTION_VAL_2GB_HR NULL +#define OPTION_VAL_4GB_HR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HR NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HR NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_HR NULL +#define CORE_OPTION_NAME_FOG_LABEL_HR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HR NULL +#define OPTION_VAL_1_HR NULL +#define OPTION_VAL_2_HR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HR NULL +#define OPTION_VAL_2_O26_HR NULL +#define OPTION_VAL_4_HR NULL +#define OPTION_VAL_6_HR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HR NULL +#define OPTION_VAL_SOME_HR NULL +#define OPTION_VAL_MORE_HR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HR NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HR NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HR NULL +#define OPTION_VAL_100_HR NULL +#define OPTION_VAL_110_HR NULL +#define OPTION_VAL_120_HR NULL +#define OPTION_VAL_130_HR NULL +#define OPTION_VAL_140_HR NULL +#define OPTION_VAL_150_HR NULL +#define OPTION_VAL_160_HR NULL +#define OPTION_VAL_170_HR NULL +#define OPTION_VAL_180_HR NULL +#define OPTION_VAL_190_HR NULL +#define OPTION_VAL_200_HR NULL +#define OPTION_VAL_210_HR NULL +#define OPTION_VAL_220_HR NULL +#define OPTION_VAL_230_HR NULL +#define OPTION_VAL_240_HR NULL +#define OPTION_VAL_250_HR NULL +#define OPTION_VAL_260_HR NULL +#define OPTION_VAL_270_HR NULL +#define OPTION_VAL_280_HR NULL +#define OPTION_VAL_290_HR NULL +#define OPTION_VAL_300_HR NULL +#define OPTION_VAL_310_HR NULL +#define OPTION_VAL_320_HR NULL +#define OPTION_VAL_330_HR NULL +#define OPTION_VAL_340_HR NULL +#define OPTION_VAL_350_HR NULL +#define OPTION_VAL_360_HR NULL +#define OPTION_VAL_370_HR NULL +#define OPTION_VAL_380_HR NULL +#define OPTION_VAL_390_HR NULL +#define OPTION_VAL_400_HR NULL +#define OPTION_VAL_410_HR NULL +#define OPTION_VAL_420_HR NULL +#define OPTION_VAL_430_HR NULL +#define OPTION_VAL_440_HR NULL +#define OPTION_VAL_450_HR NULL +#define OPTION_VAL_460_HR NULL +#define OPTION_VAL_470_HR NULL +#define OPTION_VAL_480_HR NULL +#define OPTION_VAL_490_HR NULL +#define OPTION_VAL_500_HR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HR NULL +#define OPTION_VAL_0_HR NULL +#define OPTION_VAL_5_HR NULL +#define OPTION_VAL_10_HR NULL +#define OPTION_VAL_15_HR NULL +#define OPTION_VAL_20_HR NULL +#define OPTION_VAL_25_HR NULL +#define OPTION_VAL_30_HR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HR NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HR NULL +#define OPTION_VAL_50_HR NULL +#define OPTION_VAL_60_HR NULL +#define OPTION_VAL_70_HR NULL +#define OPTION_VAL_80_HR NULL +#define OPTION_VAL_90_HR NULL +#define OPTION_VAL_100_O45_HR NULL +#define OPTION_VAL_110_O45_HR NULL +#define OPTION_VAL_120_O45_HR NULL +#define OPTION_VAL_130_O45_HR NULL +#define OPTION_VAL_140_O45_HR NULL +#define OPTION_VAL_150_O45_HR NULL +#define OPTION_VAL_160_O45_HR NULL +#define OPTION_VAL_170_O45_HR NULL +#define OPTION_VAL_180_O45_HR NULL +#define OPTION_VAL_190_O45_HR NULL +#define OPTION_VAL_200_O45_HR NULL +#define OPTION_VAL_210_O45_HR NULL +#define OPTION_VAL_220_O45_HR NULL +#define OPTION_VAL_230_O45_HR NULL +#define OPTION_VAL_240_O45_HR NULL +#define OPTION_VAL_250_O45_HR NULL +#define OPTION_VAL_260_O45_HR NULL +#define OPTION_VAL_270_O45_HR NULL +#define OPTION_VAL_280_O45_HR NULL +#define OPTION_VAL_290_O45_HR NULL +#define OPTION_VAL_300_O45_HR NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HR NULL +#define OPTION_VAL_WHITE_HR NULL +#define OPTION_VAL_RED_HR NULL +#define OPTION_VAL_GREEN_HR NULL +#define OPTION_VAL_BLUE_HR NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HR NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HR NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HR NULL +#define OPTION_VAL_VMU_HR NULL +#define OPTION_VAL_PURUPURU_HR NULL +#define OPTION_VAL_NONE_HR "Ništa" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HR NULL +#define OPTION_VAL_VMU_A1_HR NULL +#define OPTION_VAL_ALL_VMUS_HR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HR NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HR NULL +#define OPTION_VAL_UPPER_LEFT_HR NULL +#define OPTION_VAL_UPPER_RIGHT_HR NULL +#define OPTION_VAL_LOWER_LEFT_HR NULL +#define OPTION_VAL_LOWER_RIGHT_HR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HR NULL +#define OPTION_VAL_1X_HR NULL +#define OPTION_VAL_3X_HR NULL +#define OPTION_VAL_5X_HR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HR NULL +#define OPTION_VAL_DEFAULT_ON_00_HR NULL +#define OPTION_VAL_DEFAULT_OFF_01_HR NULL +#define OPTION_VAL_BLACK_02_HR NULL +#define OPTION_VAL_LIGHT_BLUE_04_HR NULL +#define OPTION_VAL_CYAN_06_HR NULL +#define OPTION_VAL_CYAN_BLUE_07_HR NULL +#define OPTION_VAL_LIGHT_GREEN_08_HR NULL +#define OPTION_VAL_CYAN_GREEN_09_HR NULL +#define OPTION_VAL_LIGHT_CYAN_10_HR NULL +#define OPTION_VAL_PURPLE_12_HR NULL +#define OPTION_VAL_LIGHT_PURPLE_13_HR NULL +#define OPTION_VAL_YELLOW_14_HR NULL +#define OPTION_VAL_GRAY_15_HR NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_HR NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_HR NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_HR NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_HR NULL +#define OPTION_VAL_LIGHT_RED_2_20_HR NULL +#define OPTION_VAL_MAGENTA_21_HR NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_HR NULL +#define OPTION_VAL_LIGHT_ORANGE_23_HR NULL +#define OPTION_VAL_ORANGE_24_HR NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_HR NULL +#define OPTION_VAL_LIGHT_YELLOW_26_HR NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_HR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HR NULL +#define OPTION_VAL_40_HR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HR NULL + +struct retro_core_option_v2_category option_cats_hr[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_HR, + CATEGORY_SYSTEM_INFO_0_HR + }, + { + "video", + CATEGORY_VIDEO_LABEL_HR, + CATEGORY_VIDEO_INFO_0_HR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_HR, + CATEGORY_PERFORMANCE_INFO_0_HR + }, + { + "hacks", + CATEGORY_HACKS_LABEL_HR, + CATEGORY_HACKS_INFO_0_HR + }, + { + "input", + CATEGORY_INPUT_LABEL_HR, + CATEGORY_INPUT_INFO_0_HR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_HR, + CATEGORY_EXPANSIONS_INFO_0_HR }, { "vmu", - CATEGORY_VMU_LABEL_HU, - CATEGORY_VMU_INFO_0_HU + CATEGORY_VMU_LABEL_HR, + CATEGORY_VMU_INFO_0_HR }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_hu[] = { +struct retro_core_option_v2_definition option_defs_hr[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_HU, + CORE_OPTION_NAME_REGION_LABEL_HR, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_HU }, - { "USA", OPTION_VAL_USA_HU }, - { "Europe", OPTION_VAL_EUROPE_HU }, - { "Default", OPTION_VAL_DEFAULT_HU }, + { "Japan", OPTION_VAL_JAPAN_HR }, + { "USA", OPTION_VAL_USA_HR }, + { "Europe", OPTION_VAL_EUROPE_HR }, + { "Default", OPTION_VAL_DEFAULT_HR }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_HU, + CORE_OPTION_NAME_LANGUAGE_LABEL_HR, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_HU, + CORE_OPTION_NAME_LANGUAGE_INFO_0_HR, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_HU }, - { "English", OPTION_VAL_ENGLISH_HU }, - { "German", OPTION_VAL_GERMAN_HU }, - { "French", OPTION_VAL_FRENCH_HU }, - { "Spanish", OPTION_VAL_SPANISH_HU }, - { "Italian", OPTION_VAL_ITALIAN_HU }, - { "Default", OPTION_VAL_DEFAULT_HU }, + { "Japanese", OPTION_VAL_JAPANESE_HR }, + { "English", OPTION_VAL_ENGLISH_HR }, + { "German", OPTION_VAL_GERMAN_HR }, + { "French", OPTION_VAL_FRENCH_HR }, + { "Spanish", OPTION_VAL_SPANISH_HR }, + { "Italian", OPTION_VAL_ITALIAN_HR }, + { "Default", OPTION_VAL_DEFAULT_HR }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_HU, + CORE_OPTION_NAME_HLE_BIOS_LABEL_HR, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_HU, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_HR, NULL, "system", { @@ -36403,9 +40738,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HU, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HR, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HU, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HR, NULL, "system", { @@ -36417,9 +40752,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_HU, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_HR, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HU, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HR, NULL, "system", { @@ -36433,25 +40768,11 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_HU, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_HU, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HU, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HR, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HU, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HR, NULL, "system", { @@ -36463,9 +40784,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HU, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HR, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HU, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HR, NULL, "system", { @@ -36477,9 +40798,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_HR, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HR, NULL, "system", { @@ -36491,9 +40812,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_HU, + CORE_OPTION_NAME_UPNP_LABEL_HR, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_HU, + CORE_OPTION_NAME_UPNP_INFO_0_HR, NULL, "system", { @@ -36506,39 +40827,39 @@ struct retro_core_option_v2_definition option_defs_hu[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HU, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HR, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HU, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HR, NULL, "video", { - { "320x240", OPTION_VAL_320X240_HU }, - { "640x480", OPTION_VAL_640X480_HU }, - { "800x600", OPTION_VAL_800X600_HU }, - { "960x720", OPTION_VAL_960X720_HU }, - { "1024x768", OPTION_VAL_1024X768_HU }, - { "1280x960", OPTION_VAL_1280X960_HU }, - { "1440x1080", OPTION_VAL_1440X1080_HU }, - { "1600x1200", OPTION_VAL_1600X1200_HU }, - { "1920x1440", OPTION_VAL_1920X1440_HU }, - { "2560x1920", OPTION_VAL_2560X1920_HU }, - { "2880x2160", OPTION_VAL_2880X2160_HU }, - { "3200x2400", OPTION_VAL_3200X2400_HU }, - { "3840x2880", OPTION_VAL_3840X2880_HU }, - { "4480x3360", OPTION_VAL_4480X3360_HU }, - { "5120x3840", OPTION_VAL_5120X3840_HU }, - { "5760x4320", OPTION_VAL_5760X4320_HU }, - { "6400x4800", OPTION_VAL_6400X4800_HU }, - { "7040x5280", OPTION_VAL_7040X5280_HU }, - { "7680x5760", OPTION_VAL_7680X5760_HU }, - { "8320x6240", OPTION_VAL_8320X6240_HU }, - { "8960x6720", OPTION_VAL_8960X6720_HU }, - { "9600x7200", OPTION_VAL_9600X7200_HU }, - { "10240x7680", OPTION_VAL_10240X7680_HU }, - { "10880x8160", OPTION_VAL_10880X8160_HU }, - { "11520x8640", OPTION_VAL_11520X8640_HU }, - { "12160x9120", OPTION_VAL_12160X9120_HU }, - { "12800x9600", OPTION_VAL_12800X9600_HU }, + { "320x240", OPTION_VAL_320X240_HR }, + { "640x480", OPTION_VAL_640X480_HR }, + { "800x600", OPTION_VAL_800X600_HR }, + { "960x720", OPTION_VAL_960X720_HR }, + { "1024x768", OPTION_VAL_1024X768_HR }, + { "1280x960", OPTION_VAL_1280X960_HR }, + { "1440x1080", OPTION_VAL_1440X1080_HR }, + { "1600x1200", OPTION_VAL_1600X1200_HR }, + { "1920x1440", OPTION_VAL_1920X1440_HR }, + { "2560x1920", OPTION_VAL_2560X1920_HR }, + { "2880x2160", OPTION_VAL_2880X2160_HR }, + { "3200x2400", OPTION_VAL_3200X2400_HR }, + { "3840x2880", OPTION_VAL_3840X2880_HR }, + { "4480x3360", OPTION_VAL_4480X3360_HR }, + { "5120x3840", OPTION_VAL_5120X3840_HR }, + { "5760x4320", OPTION_VAL_5760X4320_HR }, + { "6400x4800", OPTION_VAL_6400X4800_HR }, + { "7040x5280", OPTION_VAL_7040X5280_HR }, + { "7680x5760", OPTION_VAL_7680X5760_HR }, + { "8320x6240", OPTION_VAL_8320X6240_HR }, + { "8960x6720", OPTION_VAL_8960X6720_HR }, + { "9600x7200", OPTION_VAL_9600X7200_HR }, + { "10240x7680", OPTION_VAL_10240X7680_HR }, + { "10880x8160", OPTION_VAL_10880X8160_HR }, + { "11520x8640", OPTION_VAL_11520X8640_HR }, + { "12160x9120", OPTION_VAL_12160X9120_HR }, + { "12800x9600", OPTION_VAL_12800X9600_HR }, { NULL, NULL }, }, #ifdef LOW_RES @@ -36549,62 +40870,62 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_HU, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_HR, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HU, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HR, NULL, "video", { - { "VGA", OPTION_VAL_VGA_HU }, - { "TV (RGB)", OPTION_VAL_TV_RGB_HU }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HU }, + { "VGA", OPTION_VAL_VGA_HR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_HR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HR }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_HU, + CORE_OPTION_NAME_BROADCAST_LABEL_HR, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_HU }, - { "PAL", OPTION_VAL_PAL_HU }, - { "PAL_N", OPTION_VAL_PAL_N_HU }, - { "PAL_M", OPTION_VAL_PAL_M_HU }, - { "Default", OPTION_VAL_DEFAULT_HU }, + { "NTSC", OPTION_VAL_NTSC_HR }, + { "PAL", OPTION_VAL_PAL_HR }, + { "PAL_N", OPTION_VAL_PAL_N_HR }, + { "PAL_M", OPTION_VAL_PAL_M_HR }, + { "Default", OPTION_VAL_DEFAULT_HR }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HU, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HR, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_HU }, - { "vertical", OPTION_VAL_VERTICAL_HU }, + { "horizontal", OPTION_VAL_HORIZONTAL_HR }, + { "vertical", OPTION_VAL_VERTICAL_HR }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HU, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HR, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HU }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HU }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HR }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HU }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HR }, #endif { NULL, NULL }, }, @@ -36617,25 +40938,25 @@ struct retro_core_option_v2_definition option_defs_hu[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HU, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HR, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HU, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HR, NULL, "video", { - { "512MB", OPTION_VAL_512MB_HU }, - { "1GB", OPTION_VAL_1GB_HU }, - { "2GB", OPTION_VAL_2GB_HU }, - { "4GB", OPTION_VAL_4GB_HU }, + { "512MB", OPTION_VAL_512MB_HR }, + { "1GB", OPTION_VAL_1GB_HR }, + { "2GB", OPTION_VAL_2GB_HR }, + { "4GB", OPTION_VAL_4GB_HR }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_HU, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_HR, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HU, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HR, NULL, "video", { @@ -36643,6 +40964,7 @@ struct retro_core_option_v2_definition option_defs_hu[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -36651,9 +40973,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HU, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HR, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HU, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HR, NULL, "video", { @@ -36665,9 +40987,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HU, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HR, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HR, NULL, "video", { @@ -36677,11 +40999,11 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_HU, + CORE_OPTION_NAME_MIPMAPPING_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_HR, NULL, "video", { @@ -36693,7 +41015,7 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_HU, + CORE_OPTION_NAME_FOG_LABEL_HR, NULL, "", NULL, @@ -36707,9 +41029,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HU, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HR, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HU, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HR, NULL, "video", { @@ -36721,9 +41043,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HU, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HR, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HU, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HR, NULL, "video", { @@ -36738,24 +41060,24 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HU, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HR, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HU, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HR, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_HU }, - { "1", OPTION_VAL_1_HU }, - { "2", OPTION_VAL_2_HU }, + { "0", OPTION_VAL_DEFAULT_HR }, + { "1", OPTION_VAL_1_HR }, + { "2", OPTION_VAL_2_HR }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HU, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HR, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HU, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HR, NULL, "video", { @@ -36763,13 +41085,13 @@ struct retro_core_option_v2_definition option_defs_hu[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HU, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HR, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HU, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HR, NULL, "video", { @@ -36781,9 +41103,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HU, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HR, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HU, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HR, NULL, "video", { @@ -36796,25 +41118,25 @@ struct retro_core_option_v2_definition option_defs_hu[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_HU, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_HR, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HU, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HR, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_HU }, - { "4", OPTION_VAL_4_HU }, - { "6", OPTION_VAL_6_HU }, + { "2", OPTION_VAL_2_O26_HR }, + { "4", OPTION_VAL_4_HR }, + { "6", OPTION_VAL_6_HR }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HU, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HR, NULL, "video", { @@ -36828,9 +41150,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HU, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HR, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HU, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HR, NULL, "video", { @@ -36840,11 +41162,25 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HU, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HR, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HU, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HR, NULL, "performance", { @@ -36856,15 +41192,15 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HU, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HR, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HU, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HR, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_HU }, - { "more", OPTION_VAL_MORE_HU }, + { "some", OPTION_VAL_SOME_HR }, + { "more", OPTION_VAL_MORE_HR }, { NULL, NULL }, }, #ifdef LOW_END @@ -36875,9 +41211,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HU, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HR, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HU, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HR, NULL, "performance", { @@ -36894,9 +41230,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HU, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HR, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HU, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HR, NULL, "hacks", { @@ -36908,9 +41244,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HU, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HR, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HU, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HR, NULL, "hacks", { @@ -36922,9 +41258,9 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HU, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HR, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HU, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HR, NULL, "hacks", { @@ -36938,64 +41274,78 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_HU, + CORE_OPTION_NAME_SH4CLOCK_LABEL_HR, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_HU, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_HR, NULL, "hacks", { - { "100", OPTION_VAL_100_HU }, - { "110", OPTION_VAL_110_HU }, - { "120", OPTION_VAL_120_HU }, - { "130", OPTION_VAL_130_HU }, - { "140", OPTION_VAL_140_HU }, - { "150", OPTION_VAL_150_HU }, - { "160", OPTION_VAL_160_HU }, - { "170", OPTION_VAL_170_HU }, - { "180", OPTION_VAL_180_HU }, - { "190", OPTION_VAL_190_HU }, - { "200", OPTION_VAL_200_HU }, - { "210", OPTION_VAL_210_HU }, - { "220", OPTION_VAL_220_HU }, - { "230", OPTION_VAL_230_HU }, - { "240", OPTION_VAL_240_HU }, - { "250", OPTION_VAL_250_HU }, - { "260", OPTION_VAL_260_HU }, - { "270", OPTION_VAL_270_HU }, - { "280", OPTION_VAL_280_HU }, - { "290", OPTION_VAL_290_HU }, - { "300", OPTION_VAL_300_HU }, - { "310", OPTION_VAL_310_HU }, - { "320", OPTION_VAL_320_HU }, - { "330", OPTION_VAL_330_HU }, - { "340", OPTION_VAL_340_HU }, - { "350", OPTION_VAL_350_HU }, - { "360", OPTION_VAL_360_HU }, - { "370", OPTION_VAL_370_HU }, - { "380", OPTION_VAL_380_HU }, - { "390", OPTION_VAL_390_HU }, - { "400", OPTION_VAL_400_HU }, - { "410", OPTION_VAL_410_HU }, - { "420", OPTION_VAL_420_HU }, - { "430", OPTION_VAL_430_HU }, - { "440", OPTION_VAL_440_HU }, - { "450", OPTION_VAL_450_HU }, - { "460", OPTION_VAL_460_HU }, - { "470", OPTION_VAL_470_HU }, - { "480", OPTION_VAL_480_HU }, - { "490", OPTION_VAL_490_HU }, - { "500", OPTION_VAL_500_HU }, + { "100", OPTION_VAL_100_HR }, + { "110", OPTION_VAL_110_HR }, + { "120", OPTION_VAL_120_HR }, + { "130", OPTION_VAL_130_HR }, + { "140", OPTION_VAL_140_HR }, + { "150", OPTION_VAL_150_HR }, + { "160", OPTION_VAL_160_HR }, + { "170", OPTION_VAL_170_HR }, + { "180", OPTION_VAL_180_HR }, + { "190", OPTION_VAL_190_HR }, + { "200", OPTION_VAL_200_HR }, + { "210", OPTION_VAL_210_HR }, + { "220", OPTION_VAL_220_HR }, + { "230", OPTION_VAL_230_HR }, + { "240", OPTION_VAL_240_HR }, + { "250", OPTION_VAL_250_HR }, + { "260", OPTION_VAL_260_HR }, + { "270", OPTION_VAL_270_HR }, + { "280", OPTION_VAL_280_HR }, + { "290", OPTION_VAL_290_HR }, + { "300", OPTION_VAL_300_HR }, + { "310", OPTION_VAL_310_HR }, + { "320", OPTION_VAL_320_HR }, + { "330", OPTION_VAL_330_HR }, + { "340", OPTION_VAL_340_HR }, + { "350", OPTION_VAL_350_HR }, + { "360", OPTION_VAL_360_HR }, + { "370", OPTION_VAL_370_HR }, + { "380", OPTION_VAL_380_HR }, + { "390", OPTION_VAL_390_HR }, + { "400", OPTION_VAL_400_HR }, + { "410", OPTION_VAL_410_HR }, + { "420", OPTION_VAL_420_HR }, + { "430", OPTION_VAL_430_HR }, + { "440", OPTION_VAL_440_HR }, + { "450", OPTION_VAL_450_HR }, + { "460", OPTION_VAL_460_HR }, + { "470", OPTION_VAL_470_HR }, + { "480", OPTION_VAL_480_HR }, + { "490", OPTION_VAL_490_HR }, + { "500", OPTION_VAL_500_HR }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HU, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HR, NULL, "hacks", { @@ -37005,11 +41355,11 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HU, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HR, NULL, "hacks", { @@ -37021,47 +41371,47 @@ struct retro_core_option_v2_definition option_defs_hu[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HU, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HR, NULL, "input", { - { "0%", OPTION_VAL_0_HU }, - { "5%", OPTION_VAL_5_HU }, - { "10%", OPTION_VAL_10_HU }, - { "15%", OPTION_VAL_15_HU }, - { "20%", OPTION_VAL_20_HU }, - { "25%", OPTION_VAL_25_HU }, - { "30%", OPTION_VAL_30_HU }, + { "0%", OPTION_VAL_0_HR }, + { "5%", OPTION_VAL_5_HR }, + { "10%", OPTION_VAL_10_HR }, + { "15%", OPTION_VAL_15_HR }, + { "20%", OPTION_VAL_20_HR }, + { "25%", OPTION_VAL_25_HR }, + { "30%", OPTION_VAL_30_HR }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HU, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HR, NULL, "input", { - { "0%", OPTION_VAL_0_HU }, - { "5%", OPTION_VAL_5_HU }, - { "10%", OPTION_VAL_10_HU }, - { "15%", OPTION_VAL_15_HU }, - { "20%", OPTION_VAL_20_HU }, - { "25%", OPTION_VAL_25_HU }, - { "30%", OPTION_VAL_30_HU }, + { "0%", OPTION_VAL_0_HR }, + { "5%", OPTION_VAL_5_HR }, + { "10%", OPTION_VAL_10_HR }, + { "15%", OPTION_VAL_15_HR }, + { "20%", OPTION_VAL_20_HR }, + { "25%", OPTION_VAL_25_HR }, + { "30%", OPTION_VAL_30_HR }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HU, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HR, NULL, "input", { @@ -37072,10 +41422,10 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_HU, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HR, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_HU, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HR, NULL, "input", { @@ -37083,300 +41433,293 @@ struct retro_core_option_v2_definition option_defs_hu[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HU, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HR, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HU, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HR, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HR, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_HR }, + { "60%", OPTION_VAL_60_HR }, + { "70%", OPTION_VAL_70_HR }, + { "80%", OPTION_VAL_80_HR }, + { "90%", OPTION_VAL_90_HR }, + { "100%", OPTION_VAL_100_O45_HR }, + { "110%", OPTION_VAL_110_O45_HR }, + { "120%", OPTION_VAL_120_O45_HR }, + { "130%", OPTION_VAL_130_O45_HR }, + { "140%", OPTION_VAL_140_O45_HR }, + { "150%", OPTION_VAL_150_O45_HR }, + { "160%", OPTION_VAL_160_O45_HR }, + { "170%", OPTION_VAL_170_O45_HR }, + { "180%", OPTION_VAL_180_O45_HR }, + { "190%", OPTION_VAL_190_O45_HR }, + { "200%", OPTION_VAL_200_O45_HR }, + { "210%", OPTION_VAL_210_O45_HR }, + { "220%", OPTION_VAL_220_O45_HR }, + { "230%", OPTION_VAL_230_O45_HR }, + { "240%", OPTION_VAL_240_O45_HR }, + { "250%", OPTION_VAL_250_O45_HR }, + { "260%", OPTION_VAL_260_O45_HR }, + { "270%", OPTION_VAL_270_O45_HR }, + { "280%", OPTION_VAL_280_O45_HR }, + { "290%", OPTION_VAL_290_O45_HR }, + { "300%", OPTION_VAL_300_O45_HR }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HU }, - { "Red", OPTION_VAL_RED_HU }, - { "Green", OPTION_VAL_GREEN_HU }, - { "Blue", OPTION_VAL_BLUE_HU }, + { "White", OPTION_VAL_WHITE_HR }, + { "Red", OPTION_VAL_RED_HR }, + { "Green", OPTION_VAL_GREEN_HR }, + { "Blue", OPTION_VAL_BLUE_HR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HU }, - { "Red", OPTION_VAL_RED_HU }, - { "Green", OPTION_VAL_GREEN_HU }, - { "Blue", OPTION_VAL_BLUE_HU }, + { "White", OPTION_VAL_WHITE_HR }, + { "Red", OPTION_VAL_RED_HR }, + { "Green", OPTION_VAL_GREEN_HR }, + { "Blue", OPTION_VAL_BLUE_HR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HU }, - { "Red", OPTION_VAL_RED_HU }, - { "Green", OPTION_VAL_GREEN_HU }, - { "Blue", OPTION_VAL_BLUE_HU }, + { "White", OPTION_VAL_WHITE_HR }, + { "Red", OPTION_VAL_RED_HR }, + { "Green", OPTION_VAL_GREEN_HR }, + { "Blue", OPTION_VAL_BLUE_HR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_HU }, - { "Red", OPTION_VAL_RED_HU }, - { "Green", OPTION_VAL_GREEN_HU }, - { "Blue", OPTION_VAL_BLUE_HU }, + { "White", OPTION_VAL_WHITE_HR }, + { "Red", OPTION_VAL_RED_HR }, + { "Green", OPTION_VAL_GREEN_HR }, + { "Blue", OPTION_VAL_BLUE_HR }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HR, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_HU }, - { "All VMUs", OPTION_VAL_ALL_VMUS_HU }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_HU, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HU, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_HU, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HR, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HR, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HR, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HR, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HR, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HR, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_HU }, - { "2x", OPTION_VAL_2_O27_HU }, - { "3x", OPTION_VAL_3X_HU }, - { "4x", OPTION_VAL_4_HU }, - { "5x", OPTION_VAL_5X_HU }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HR, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HR, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "VMU", OPTION_VAL_VMU_HR }, + { "Purupuru", OPTION_VAL_PURUPURU_HR }, + { "None", OPTION_VAL_NONE_HR }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HR, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_HR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_HR }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_HR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_HR, NULL, "vmu", { - { "10%", OPTION_VAL_10_HU }, - { "20%", OPTION_VAL_20_HU }, - { "30%", OPTION_VAL_30_HU }, - { "40%", OPTION_VAL_40_HU }, - { "50%", OPTION_VAL_50_HU }, - { "60%", OPTION_VAL_60_HU }, - { "70%", OPTION_VAL_70_HU }, - { "80%", OPTION_VAL_80_HU }, - { "90%", OPTION_VAL_90_HU }, - { "100%", OPTION_VAL_100_O57_HU }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HR, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HR, NULL, "", NULL, @@ -37389,145 +41732,145 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HU }, - { "2x", OPTION_VAL_2_O27_HU }, - { "3x", OPTION_VAL_3X_HU }, - { "4x", OPTION_VAL_4_HU }, - { "5x", OPTION_VAL_5X_HU }, + { "1x", OPTION_VAL_1X_HR }, + { "2x", OPTION_VAL_2_O26_HR }, + { "3x", OPTION_VAL_3X_HR }, + { "4x", OPTION_VAL_4_HR }, + { "5x", OPTION_VAL_5X_HR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HU }, - { "20%", OPTION_VAL_20_HU }, - { "30%", OPTION_VAL_30_HU }, - { "40%", OPTION_VAL_40_HU }, - { "50%", OPTION_VAL_50_HU }, - { "60%", OPTION_VAL_60_HU }, - { "70%", OPTION_VAL_70_HU }, - { "80%", OPTION_VAL_80_HU }, - { "90%", OPTION_VAL_90_HU }, - { "100%", OPTION_VAL_100_O57_HU }, + { "10%", OPTION_VAL_10_HR }, + { "20%", OPTION_VAL_20_HR }, + { "30%", OPTION_VAL_30_HR }, + { "40%", OPTION_VAL_40_HR }, + { "50%", OPTION_VAL_50_HR }, + { "60%", OPTION_VAL_60_HR }, + { "70%", OPTION_VAL_70_HR }, + { "80%", OPTION_VAL_80_HR }, + { "90%", OPTION_VAL_90_HR }, + { "100%", OPTION_VAL_100_O45_HR }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HR, NULL, "", NULL, @@ -37540,145 +41883,145 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HU }, - { "2x", OPTION_VAL_2_O27_HU }, - { "3x", OPTION_VAL_3X_HU }, - { "4x", OPTION_VAL_4_HU }, - { "5x", OPTION_VAL_5X_HU }, + { "1x", OPTION_VAL_1X_HR }, + { "2x", OPTION_VAL_2_O26_HR }, + { "3x", OPTION_VAL_3X_HR }, + { "4x", OPTION_VAL_4_HR }, + { "5x", OPTION_VAL_5X_HR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HU }, - { "20%", OPTION_VAL_20_HU }, - { "30%", OPTION_VAL_30_HU }, - { "40%", OPTION_VAL_40_HU }, - { "50%", OPTION_VAL_50_HU }, - { "60%", OPTION_VAL_60_HU }, - { "70%", OPTION_VAL_70_HU }, - { "80%", OPTION_VAL_80_HU }, - { "90%", OPTION_VAL_90_HU }, - { "100%", OPTION_VAL_100_O57_HU }, + { "10%", OPTION_VAL_10_HR }, + { "20%", OPTION_VAL_20_HR }, + { "30%", OPTION_VAL_30_HR }, + { "40%", OPTION_VAL_40_HR }, + { "50%", OPTION_VAL_50_HR }, + { "60%", OPTION_VAL_60_HR }, + { "70%", OPTION_VAL_70_HR }, + { "80%", OPTION_VAL_80_HR }, + { "90%", OPTION_VAL_90_HR }, + { "100%", OPTION_VAL_100_O45_HR }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HR, NULL, "", NULL, @@ -37691,784 +42034,760 @@ struct retro_core_option_v2_definition option_defs_hu[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_HU }, - { "2x", OPTION_VAL_2_O27_HU }, - { "3x", OPTION_VAL_3X_HU }, - { "4x", OPTION_VAL_4_HU }, - { "5x", OPTION_VAL_5X_HU }, + { "1x", OPTION_VAL_1X_HR }, + { "2x", OPTION_VAL_2_O26_HR }, + { "3x", OPTION_VAL_3X_HR }, + { "4x", OPTION_VAL_4_HR }, + { "5x", OPTION_VAL_5X_HR }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, - { "BLACK 02", OPTION_VAL_BLACK_02_HU }, - { "BLUE 03", OPTION_VAL_BLUE_HU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, - { "GREEN 05", OPTION_VAL_GREEN_HU }, - { "CYAN 06", OPTION_VAL_CYAN_06_HU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, - { "RED 11", OPTION_VAL_RED_HU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, - { "GRAY 15", OPTION_VAL_GRAY_15_HU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, - { "WHITE 28", OPTION_VAL_WHITE_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_HU }, - { "20%", OPTION_VAL_20_HU }, - { "30%", OPTION_VAL_30_HU }, - { "40%", OPTION_VAL_40_HU }, - { "50%", OPTION_VAL_50_HU }, - { "60%", OPTION_VAL_60_HU }, - { "70%", OPTION_VAL_70_HU }, - { "80%", OPTION_VAL_80_HU }, - { "90%", OPTION_VAL_90_HU }, - { "100%", OPTION_VAL_100_O57_HU }, + { "10%", OPTION_VAL_10_HR }, + { "20%", OPTION_VAL_20_HR }, + { "30%", OPTION_VAL_30_HR }, + { "40%", OPTION_VAL_40_HR }, + { "50%", OPTION_VAL_50_HR }, + { "60%", OPTION_VAL_60_HR }, + { "70%", OPTION_VAL_70_HR }, + { "80%", OPTION_VAL_80_HR }, + { "90%", OPTION_VAL_90_HR }, + { "100%", OPTION_VAL_100_O45_HR }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_hu = { - option_cats_hu, - option_defs_hu -}; - -/* RETRO_LANGUAGE_ID */ - -#define CATEGORY_SYSTEM_LABEL_ID "Sistem" -#define CATEGORY_SYSTEM_INFO_0_ID NULL -#define CATEGORY_VIDEO_LABEL_ID NULL -#define CATEGORY_VIDEO_INFO_0_ID NULL -#define CATEGORY_PERFORMANCE_LABEL_ID "Kinerja" -#define CATEGORY_PERFORMANCE_INFO_0_ID NULL -#define CATEGORY_HACKS_LABEL_ID "Peretasan Emulasi" -#define CATEGORY_HACKS_INFO_0_ID NULL -#define CATEGORY_INPUT_LABEL_ID "Masukan" -#define CATEGORY_INPUT_INFO_0_ID NULL -#define CATEGORY_VMU_LABEL_ID NULL -#define CATEGORY_VMU_INFO_0_ID NULL -#define CORE_OPTION_NAME_REGION_LABEL_ID "Daerah" -#define OPTION_VAL_JAPAN_ID "Jepang" -#define OPTION_VAL_USA_ID NULL -#define OPTION_VAL_EUROPE_ID "Eropa" -#define OPTION_VAL_DEFAULT_ID NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_ID "Bahasa" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_ID NULL -#define OPTION_VAL_JAPANESE_ID "Bahasa Jepang" -#define OPTION_VAL_ENGLISH_ID "Bahasa Inggris" -#define OPTION_VAL_GERMAN_ID "Bahasa Jerman" -#define OPTION_VAL_FRENCH_ID "Bahasa Perancis" -#define OPTION_VAL_SPANISH_ID "Bahasa Spanyol" -#define OPTION_VAL_ITALIAN_ID "Bahasa Itali" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_ID NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID "Paksa penggunaan BIOS emulasi tingkat tinggi." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID "Boot ke BIOS (Perlu Dimulai Ulang)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ID "Boot langsung ke menu BIOS Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_ID "Aktifkan DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ID "Aktifkan emulasi DSP audio Dreamcast (pengolah sinyal digital). Perbaiki akurasi suara yang dihasilakan, tetapi tingkatkan persyaratan kinerja." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_ID NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_ID NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ID NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ID NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ID NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ID NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_ID NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ID NULL -#define CORE_OPTION_NAME_UPNP_LABEL_ID NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_ID NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ID NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ID "Modifikasi resolusi pelukisan." -#define OPTION_VAL_320X240_ID NULL -#define OPTION_VAL_640X480_ID NULL -#define OPTION_VAL_800X600_ID NULL -#define OPTION_VAL_960X720_ID NULL -#define OPTION_VAL_1024X768_ID NULL -#define OPTION_VAL_1280X960_ID NULL -#define OPTION_VAL_1440X1080_ID NULL -#define OPTION_VAL_1600X1200_ID NULL -#define OPTION_VAL_1920X1440_ID NULL -#define OPTION_VAL_2560X1920_ID NULL -#define OPTION_VAL_2880X2160_ID NULL -#define OPTION_VAL_3200X2400_ID NULL -#define OPTION_VAL_3840X2880_ID NULL -#define OPTION_VAL_4480X3360_ID NULL -#define OPTION_VAL_5120X3840_ID NULL -#define OPTION_VAL_5760X4320_ID NULL -#define OPTION_VAL_6400X4800_ID NULL -#define OPTION_VAL_7040X5280_ID NULL -#define OPTION_VAL_7680X5760_ID NULL -#define OPTION_VAL_8320X6240_ID NULL -#define OPTION_VAL_8960X6720_ID NULL -#define OPTION_VAL_9600X7200_ID NULL -#define OPTION_VAL_10240X7680_ID NULL -#define OPTION_VAL_10880X8160_ID NULL -#define OPTION_VAL_11520X8640_ID NULL -#define OPTION_VAL_12160X9120_ID NULL -#define OPTION_VAL_12800X9600_ID NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_ID NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ID NULL -#define OPTION_VAL_VGA_ID NULL -#define OPTION_VAL_TV_RGB_ID NULL -#define OPTION_VAL_TV_COMPOSITE_ID NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_ID NULL -#define OPTION_VAL_NTSC_ID NULL -#define OPTION_VAL_PAL_ID NULL -#define OPTION_VAL_PAL_N_ID NULL -#define OPTION_VAL_PAL_M_ID NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID "Orientasi Layar" -#define OPTION_VAL_HORIZONTAL_ID NULL -#define OPTION_VAL_VERTICAL_ID "Vertikal" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_ID NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_ID NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ID NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ID "Mungkin perlu nilai yang lebih besar agar resolusi yang lebih besar terlihat benar." -#define OPTION_VAL_512MB_ID NULL -#define OPTION_VAL_1GB_ID NULL -#define OPTION_VAL_2GB_ID NULL -#define OPTION_VAL_4GB_ID NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_ID NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ID NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ID NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ID NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ID "Mengaktifkan Penyangga RTT (Lukis Ke Tekstur)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ID NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_ID NULL -#define CORE_OPTION_NAME_FOG_LABEL_ID NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ID NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ID NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ID "Pemfilteran Anisotropik" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ID NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ID NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ID NULL -#define OPTION_VAL_1_ID NULL -#define OPTION_VAL_2_ID NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ID NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ID NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ID NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ID NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ID "Filter Pasca-pengolahan PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ID "Pasca-olah gambar yang dilukiskan untuk menyimulasikan efek dengan spesifik ke GPU PowerVR2 dan sinyal video analog." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_ID "Penskalaan Naik Tekstur (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ID "Tingkatkan grafis seni piksel 2D tulisan tangan. Hanya bisa digunakan di pemainan terpikselisasi 2D." -#define OPTION_VAL_2_O27_ID NULL -#define OPTION_VAL_4_ID NULL -#define OPTION_VAL_6_ID NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ID "Ukuran Terfilter Maks. Penskalaan Naik" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ID NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ID NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ID NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ID "Jalankan GPU dan CPU pada Thread berbeda. Sangat direkomendasikan." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ID NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ID NULL -#define OPTION_VAL_SOME_ID NULL -#define OPTION_VAL_MORE_ID NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ID NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ID NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ID NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ID NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ID NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ID NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ID NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ID NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_ID NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_ID NULL -#define OPTION_VAL_100_ID NULL -#define OPTION_VAL_110_ID NULL -#define OPTION_VAL_120_ID NULL -#define OPTION_VAL_130_ID NULL -#define OPTION_VAL_140_ID NULL -#define OPTION_VAL_150_ID NULL -#define OPTION_VAL_160_ID NULL -#define OPTION_VAL_170_ID NULL -#define OPTION_VAL_180_ID NULL -#define OPTION_VAL_190_ID NULL -#define OPTION_VAL_200_ID NULL -#define OPTION_VAL_210_ID NULL -#define OPTION_VAL_220_ID NULL -#define OPTION_VAL_230_ID NULL -#define OPTION_VAL_240_ID NULL -#define OPTION_VAL_250_ID NULL -#define OPTION_VAL_260_ID NULL -#define OPTION_VAL_270_ID NULL -#define OPTION_VAL_280_ID NULL -#define OPTION_VAL_290_ID NULL -#define OPTION_VAL_300_ID NULL -#define OPTION_VAL_310_ID NULL -#define OPTION_VAL_320_ID NULL -#define OPTION_VAL_330_ID NULL -#define OPTION_VAL_340_ID NULL -#define OPTION_VAL_350_ID NULL -#define OPTION_VAL_360_ID NULL -#define OPTION_VAL_370_ID NULL -#define OPTION_VAL_380_ID NULL -#define OPTION_VAL_390_ID NULL -#define OPTION_VAL_400_ID NULL -#define OPTION_VAL_410_ID NULL -#define OPTION_VAL_420_ID NULL -#define OPTION_VAL_430_ID NULL -#define OPTION_VAL_440_ID NULL -#define OPTION_VAL_450_ID NULL -#define OPTION_VAL_460_ID NULL -#define OPTION_VAL_470_ID NULL -#define OPTION_VAL_480_ID NULL -#define OPTION_VAL_490_ID NULL -#define OPTION_VAL_500_ID NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ID NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ID NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ID NULL -#define OPTION_VAL_0_ID NULL -#define OPTION_VAL_5_ID NULL -#define OPTION_VAL_10_ID NULL -#define OPTION_VAL_15_ID NULL -#define OPTION_VAL_20_ID NULL -#define OPTION_VAL_25_ID NULL -#define OPTION_VAL_30_ID NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ID "Pemicu Deadzone" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ID "Pemicu Digital" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_ID NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_ID NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ID NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ID NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ID NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ID NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ID NULL -#define OPTION_VAL_WHITE_ID NULL -#define OPTION_VAL_RED_ID NULL -#define OPTION_VAL_GREEN_ID NULL -#define OPTION_VAL_BLUE_ID NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ID NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ID NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ID NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ID NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ID NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ID NULL -#define OPTION_VAL_VMU_A1_ID NULL -#define OPTION_VAL_ALL_VMUS_ID NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ID NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_ID NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ID NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ID NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID NULL -#define OPTION_VAL_UPPER_LEFT_ID "Kiri Atas" -#define OPTION_VAL_UPPER_RIGHT_ID "Kanan Atas" -#define OPTION_VAL_LOWER_LEFT_ID "Kiri Bawah" -#define OPTION_VAL_LOWER_RIGHT_ID "Kanan Bawah" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID NULL -#define OPTION_VAL_1X_ID NULL -#define OPTION_VAL_3X_ID NULL -#define OPTION_VAL_5X_ID NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ID NULL -#define OPTION_VAL_DEFAULT_ON_00_ID NULL -#define OPTION_VAL_DEFAULT_OFF_01_ID NULL -#define OPTION_VAL_BLACK_02_ID NULL -#define OPTION_VAL_LIGHT_BLUE_04_ID NULL -#define OPTION_VAL_CYAN_06_ID NULL -#define OPTION_VAL_CYAN_BLUE_07_ID NULL -#define OPTION_VAL_LIGHT_GREEN_08_ID NULL -#define OPTION_VAL_CYAN_GREEN_09_ID NULL -#define OPTION_VAL_LIGHT_CYAN_10_ID NULL -#define OPTION_VAL_PURPLE_12_ID NULL -#define OPTION_VAL_LIGHT_PURPLE_13_ID NULL -#define OPTION_VAL_YELLOW_14_ID NULL -#define OPTION_VAL_GRAY_15_ID NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_ID NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_ID NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_ID NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_ID NULL -#define OPTION_VAL_LIGHT_RED_2_20_ID NULL -#define OPTION_VAL_MAGENTA_21_ID NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_ID NULL -#define OPTION_VAL_LIGHT_ORANGE_23_ID NULL -#define OPTION_VAL_ORANGE_24_ID NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_ID NULL -#define OPTION_VAL_LIGHT_YELLOW_26_ID NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_ID NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ID NULL -#define OPTION_VAL_40_ID NULL -#define OPTION_VAL_50_ID NULL -#define OPTION_VAL_60_ID NULL -#define OPTION_VAL_70_ID NULL -#define OPTION_VAL_80_ID NULL -#define OPTION_VAL_90_ID NULL -#define OPTION_VAL_100_O57_ID NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ID NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ID NULL - -struct retro_core_option_v2_category option_cats_id[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_ID, - CATEGORY_SYSTEM_INFO_0_ID - }, - { - "video", - CATEGORY_VIDEO_LABEL_ID, - CATEGORY_VIDEO_INFO_0_ID - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_ID, - CATEGORY_PERFORMANCE_INFO_0_ID - }, - { - "hacks", - CATEGORY_HACKS_LABEL_ID, - CATEGORY_HACKS_INFO_0_ID - }, - { - "input", - CATEGORY_INPUT_LABEL_ID, - CATEGORY_INPUT_INFO_0_ID - }, - { - "vmu", - CATEGORY_VMU_LABEL_ID, - CATEGORY_VMU_INFO_0_ID - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_id[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_ID, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HR, NULL, "", NULL, - "system", - { - { "Japan", OPTION_VAL_JAPAN_ID }, - { "USA", OPTION_VAL_USA_ID }, - { "Europe", OPTION_VAL_EUROPE_ID }, - { "Default", OPTION_VAL_DEFAULT_ID }, - { NULL, NULL }, - }, - "USA", - }, - { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_ID, - NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_ID, - NULL, - "system", - { - { "Japanese", OPTION_VAL_JAPANESE_ID }, - { "English", OPTION_VAL_ENGLISH_ID }, - { "German", OPTION_VAL_GERMAN_ID }, - { "French", OPTION_VAL_FRENCH_ID }, - { "Spanish", OPTION_VAL_SPANISH_ID }, - { "Italian", OPTION_VAL_ITALIAN_ID }, - { "Default", OPTION_VAL_DEFAULT_ID }, - { NULL, NULL }, - }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_ID, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID, - NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ID, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_ID, - NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ID, - NULL, - "system", + "vmu", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_ID, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HR, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_ID, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HR }, { NULL, NULL }, }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ID, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HR, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ID, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_HR }, + { "2x", OPTION_VAL_2_O26_HR }, + { "3x", OPTION_VAL_3X_HR }, + { "4x", OPTION_VAL_4_HR }, + { "5x", OPTION_VAL_5X_HR }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ID, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HR, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ID, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, - "enabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_ID, + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HR, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ID, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HR }, + { "BLACK 02", OPTION_VAL_BLACK_02_HR }, + { "BLUE 03", OPTION_VAL_BLUE_HR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HR }, + { "GREEN 05", OPTION_VAL_GREEN_HR }, + { "CYAN 06", OPTION_VAL_CYAN_06_HR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HR }, + { "RED 11", OPTION_VAL_RED_HR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HR }, + { "GRAY 15", OPTION_VAL_GRAY_15_HR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HR }, + { "WHITE 28", OPTION_VAL_WHITE_HR }, { NULL, NULL }, }, - "disabled", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_ID, + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HR, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_ID, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_HR }, + { "20%", OPTION_VAL_20_HR }, + { "30%", OPTION_VAL_30_HR }, + { "40%", OPTION_VAL_40_HR }, + { "50%", OPTION_VAL_50_HR }, + { "60%", OPTION_VAL_60_HR }, + { "70%", OPTION_VAL_70_HR }, + { "80%", OPTION_VAL_80_HR }, + { "90%", OPTION_VAL_90_HR }, + { "100%", OPTION_VAL_100_O45_HR }, + { NULL, NULL }, }, - "enabled", + "100%", }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_hr = { + option_cats_hr, + option_defs_hr +}; - { - CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ID, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ID, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_ID }, - { "640x480", OPTION_VAL_640X480_ID }, - { "800x600", OPTION_VAL_800X600_ID }, - { "960x720", OPTION_VAL_960X720_ID }, - { "1024x768", OPTION_VAL_1024X768_ID }, - { "1280x960", OPTION_VAL_1280X960_ID }, - { "1440x1080", OPTION_VAL_1440X1080_ID }, - { "1600x1200", OPTION_VAL_1600X1200_ID }, - { "1920x1440", OPTION_VAL_1920X1440_ID }, - { "2560x1920", OPTION_VAL_2560X1920_ID }, - { "2880x2160", OPTION_VAL_2880X2160_ID }, - { "3200x2400", OPTION_VAL_3200X2400_ID }, - { "3840x2880", OPTION_VAL_3840X2880_ID }, - { "4480x3360", OPTION_VAL_4480X3360_ID }, - { "5120x3840", OPTION_VAL_5120X3840_ID }, - { "5760x4320", OPTION_VAL_5760X4320_ID }, - { "6400x4800", OPTION_VAL_6400X4800_ID }, - { "7040x5280", OPTION_VAL_7040X5280_ID }, - { "7680x5760", OPTION_VAL_7680X5760_ID }, - { "8320x6240", OPTION_VAL_8320X6240_ID }, - { "8960x6720", OPTION_VAL_8960X6720_ID }, - { "9600x7200", OPTION_VAL_9600X7200_ID }, - { "10240x7680", OPTION_VAL_10240X7680_ID }, - { "10880x8160", OPTION_VAL_10880X8160_ID }, - { "11520x8640", OPTION_VAL_11520X8640_ID }, - { "12160x9120", OPTION_VAL_12160X9120_ID }, - { "12800x9600", OPTION_VAL_12800X9600_ID }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif +/* RETRO_LANGUAGE_HU */ + +#define CATEGORY_SYSTEM_LABEL_HU "Rendszer" +#define CATEGORY_SYSTEM_INFO_0_HU "A régió, nyelv, BIOS, és a hardveralap beállításai." +#define CATEGORY_VIDEO_LABEL_HU "Kép" +#define CATEGORY_VIDEO_INFO_0_HU "A felbontás, sorrendfüggetlen átlátszóság, és vizuális effektek beállításai." +#define CATEGORY_PERFORMANCE_LABEL_HU "Teljesítmény" +#define CATEGORY_PERFORMANCE_INFO_0_HU "A többszálas megjelenítés és képkockakihagyás beállításai." +#define CATEGORY_HACKS_LABEL_HU "Emulációs trükkök" +#define CATEGORY_HACKS_INFO_0_HU "A szélesvásznú módosítások, GD-ROM betöltés sebessége, és a textúracserék beállításai." +#define CATEGORY_INPUT_LABEL_HU "Bemenet" +#define CATEGORY_INPUT_INFO_0_HU "A kontroller és fénypisztoly beállításai." +#define CATEGORY_EXPANSIONS_LABEL_HU "Kontroller bővítőhelyek" +#define CATEGORY_EXPANSIONS_INFO_0_HU "Az egyes kontroller bővítőhelyekbe csatlakoztatott eszköz (VMU, rezgő eszköz)." +#define CATEGORY_VMU_LABEL_HU NULL +#define CATEGORY_VMU_INFO_0_HU "A játékonkénti VMU mentések és a képernyőn látható VMU beállításai." +#define CORE_OPTION_NAME_REGION_LABEL_HU "Régió" +#define OPTION_VAL_JAPAN_HU "Japán" +#define OPTION_VAL_USA_HU NULL +#define OPTION_VAL_EUROPE_HU "Európa" +#define OPTION_VAL_DEFAULT_HU "Alapértelmezett" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_HU "Nyelv" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_HU "A nyelv, amelyet a BIOS és a több nyelvet tartalmazó játékok használnak." +#define OPTION_VAL_JAPANESE_HU "japán" +#define OPTION_VAL_ENGLISH_HU "angol" +#define OPTION_VAL_GERMAN_HU "német" +#define OPTION_VAL_FRENCH_HU "francia" +#define OPTION_VAL_SPANISH_HU "spanyol" +#define OPTION_VAL_ITALIAN_HU "olasz" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_HU "HLE BIOS (újraindítás szükséges)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_HU "Mindenképp a magas szinten emulált BIOS használata." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HU "Indítás BIOS-ban (újraindítás szükséges)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HU "Belépés a Dreamcast BIOS menüjébe rögtön Indításkor." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_HU "DSP engedélyezése" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HU "A Dreamcast DSP (digitális jelfeldolgozó) emulálásának engedélyezése. Javítja a generált hang pontosságát, de megnöveli a teljesítményigényt." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HU "Játéktermi szervizgombok engedélyezése" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HU "A játéktermi SERVICE gomb engedélyezése, a játékgép beállításaihoz." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HU "Ingyen játék a NAOMI játékokhoz" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HU "Az érmebeállítások ingyen játékra állítása." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU "Szélessávú adapter emulálása" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU "Modem helyett a szélessávú Ethernet adapter emulálása. (Újraindítás szükséges.)" +#define CORE_OPTION_NAME_UPNP_LABEL_HU "UPnP engedélyezése" +#define CORE_OPTION_NAME_UPNP_INFO_0_HU "Az internetre csatlakozó router automatikus konfigurálása az online játékokhoz UPnP-n keresztül." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HU "Belső felbontás" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HU "A képelőállítás felbontása." +#define OPTION_VAL_320X240_HU "320x240 (Felezett)" +#define OPTION_VAL_640X480_HU "640x480 (Eredeti)" +#define OPTION_VAL_800X600_HU NULL +#define OPTION_VAL_960X720_HU NULL +#define OPTION_VAL_1024X768_HU NULL +#define OPTION_VAL_1280X960_HU NULL +#define OPTION_VAL_1440X1080_HU NULL +#define OPTION_VAL_1600X1200_HU NULL +#define OPTION_VAL_1920X1440_HU NULL +#define OPTION_VAL_2560X1920_HU NULL +#define OPTION_VAL_2880X2160_HU NULL +#define OPTION_VAL_3200X2400_HU NULL +#define OPTION_VAL_3840X2880_HU NULL +#define OPTION_VAL_4480X3360_HU NULL +#define OPTION_VAL_5120X3840_HU NULL +#define OPTION_VAL_5760X4320_HU NULL +#define OPTION_VAL_6400X4800_HU NULL +#define OPTION_VAL_7040X5280_HU NULL +#define OPTION_VAL_7680X5760_HU NULL +#define OPTION_VAL_8320X6240_HU NULL +#define OPTION_VAL_8960X6720_HU NULL +#define OPTION_VAL_9600X7200_HU NULL +#define OPTION_VAL_10240X7680_HU NULL +#define OPTION_VAL_10880X8160_HU NULL +#define OPTION_VAL_11520X8640_HU NULL +#define OPTION_VAL_12160X9120_HU NULL +#define OPTION_VAL_12800X9600_HU NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_HU "Kábel típusa" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HU "A kimenő jel típusa. A \"TV (kompozit)\" támogatása a legelterjedtebb." +#define OPTION_VAL_VGA_HU NULL +#define OPTION_VAL_TV_RGB_HU NULL +#define OPTION_VAL_TV_COMPOSITE_HU "TV (kompozit)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_HU "Műsorszórási szabvány" +#define OPTION_VAL_NTSC_HU NULL +#define OPTION_VAL_PAL_HU "PAL (Világszerte)" +#define OPTION_VAL_PAL_N_HU NULL +#define OPTION_VAL_PAL_M_HU NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HU "Képernyő tájolása" +#define OPTION_VAL_HORIZONTAL_HU "Vízszintes" +#define OPTION_VAL_VERTICAL_HU "Függőleges" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HU "Alfa rendezés" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HU "Az átlátszó poligonok rendezése." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HU "Per-strip (gyors, legkevésbé pontos)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_HU "Per-triangle (normál)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_HU "Per-pixel (pontos, de a leglassabb)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HU "Pixel gyűjtőbuffer mérete" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HU "Magasabb felbontások helyes visszaadásához nagyobb értékek kellhetnek." +#define OPTION_VAL_512MB_HU NULL +#define OPTION_VAL_1GB_HU NULL +#define OPTION_VAL_2GB_HU NULL +#define OPTION_VAL_4GB_HU NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_HU "Átlátszó rétegek maximális száma" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HU "Összetett jelenetekhez nagyobb értékekre lehet szükség." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HU "Teljes framebuffer emuláció" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HU "A VRAM framebuffer teljes emulálásának engedélyezése. Olyan játékokhoz hasznos, amelyek közvetlenül a VRAM-ban írják vagy olvassák a framebuffert. Bekapcsolva a belső felbontás mindenképpen 640x480 lesz és a teljesítmény erősen visszaeshet." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HU "RTT (Render to texture) puffer engedélyezése" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU "Az előállított textúrák visszamásolása a GPU-ból a VRAM-ba. Ez a lehetőség rendszerint be van kapcsolva azoknál a játékoknál, amelyek igénylik. Bekapcsolt állapotban a textúra előállítás felméretezése kikapcsol, és hatással lehet a teljesítményre." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_HU NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_HU "Bekapcsolva a textúrák saját maguk kisebb változatát használják, amikor távolabb tűnnek fel. Javítja a teljesítményt és csökkenti a remegést." +#define CORE_OPTION_NAME_FOG_LABEL_HU "Köd effekt" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HU "Térfogatmódosító" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HU "A Dreamcast GPU-jának egy szolgáltatása, amit a játékok rendszerint tárgyak árnyékának megrajzolásához használnak. Normál esetben legyen bekapcsolva, hatása a teljesítményre rendszerint minimális vagy elhanyagolható." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HU "Anizotróp szûrés" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HU "Minőségjavítás azokon a felületi textúrákon, amik a kamerához képest rézsútosan helyezkednek el. Nagyobb érték jobban terheli a GPU-t. A változtatás csak újraindítás után lép életbe." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HU "Textúraszűrés" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HU "A textúraszűrés módja. Ezzel lehet egy bizonyos textúraszűrési módot rákényszeríteni minden textúrára, hogy az alapértelmezésnél élesebb (vagy simább) megjelenésük legyen. Az alapértelmezettől eltérő értékek különféle megjelenítési hibákat okozhatnak. A változások csak újraindítás után lépnek életbe." +#define OPTION_VAL_1_HU "Mindenképp Nearest-Neighbor" +#define OPTION_VAL_2_HU "Mindenképp lineáris" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HU "Képkockacsere késleltetése" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HU "A villódzó képernyőt vagy hibás mozgóképet segít elkerülni. Lassú platformokon nem ajánlott." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HU "Képkockasebesség változásainak érzékelése" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HU "A frontend értesítése, amikor a belső képsebesség megváltozik (pl. 60 fps-ről 30 fps-re). Javítja a megjelenítés ütemét olyan játékoknál, amelyek fix 20 vagy 30 fps-sel futnak, de legyen kikapcsolva nem rögzített (instabil) képsebességű játékoknál (pl. Ecco the Dolphin, Unreal Tournament). Figyelem: nem elérhető, ha az automatikus képkocka kihagyás be van kapcsolva." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HU "PowerVR2 utófeldolgozó szűrő" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HU "Az előállított kép utófeldolgozása a PowerVR2 GPU és az analóg videojelek egyedi effektjeinek szimulálásához." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_HU "Textúra felméretezés (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HU "A kézzel rajzolt 2D pixel art grafikák feljavítása. Csak a 2D pixelgrafikus játékokhoz ajánlott." +#define OPTION_VAL_2_O26_HU NULL +#define OPTION_VAL_4_HU NULL +#define OPTION_VAL_6_HU NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HU "Textúra felméretezés maximális szűrt mérete" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HU "A textúra legnagyobb mérete felméretezéshez. Ha a textúra mérete nagyobb, mint az itt kiválasztott, nem lesz felméretezve." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HU "Natív mélységi interpoláció" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HU "Segíthet a textúrahibákon és mélységi problémákon AMD GPU-k, vagy néhány esetben Intel GPU-k használatakor is." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HU "Felméretezés széleinek javítása" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HU "Segít a textúrák túlcsordulásán felméretezéskor. Kikapcsolva segíthet a 2D játékok (MVC2, CVS, KOF stb.) felméretezésekor jelentkező pixeltorzuláson." +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HU "Többszálas képelőállítás" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HU "A CPU és GPU külön szálon futnak. Erősen ajánlott." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HU "Automatikus képkocka kihagyás" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HU "Képkockák automatikus kihagyása, ha az emulátor lassan fut. Figyelem: csak akkor érvényes, ha a többszálas képelőállítás engedélyezett." +#define OPTION_VAL_SOME_HU "Normál" +#define OPTION_VAL_MORE_HU "Maximális" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HU "Képkocka kihagyás" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HU "Két megjelenített képkocka közt ennyi képkocka eldobása." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HU "Szélesvásznú csalások (újraindítás szükséges)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HU "Csalások alkalmazása, amelyekkel bizonyos játékok szélesvásznú formátumban jelennek meg." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HU "Szélesvásznú trükk" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HU "A normál 4:3-as képarányon kívüli geometria felrajzolása. Grafikai hibákat tartalmazhat az így megjelenített területeken." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HU "GD-ROM gyorstöltés (pontatlan)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HU "A GD-ROM betöltésének felgyorsítása." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HU NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HU "A Dreamcast 32 MB-os RAM módosítása. Hatással lehet a kompatibilitásra" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_HU "SH4 CPU alul/túlhajtás" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_HU "Az SH4 fő CPU órajelének átállítása az alapértelmezett 200 Mhz-ről. Az alulhajtás segíthet lassú platformokon, a túlhajtás növelheti a képsebességet néhány játéknál. Óvatos használatra." +#define OPTION_VAL_100_HU NULL +#define OPTION_VAL_110_HU NULL +#define OPTION_VAL_120_HU NULL +#define OPTION_VAL_130_HU NULL +#define OPTION_VAL_140_HU NULL +#define OPTION_VAL_150_HU NULL +#define OPTION_VAL_160_HU NULL +#define OPTION_VAL_170_HU NULL +#define OPTION_VAL_180_HU NULL +#define OPTION_VAL_190_HU NULL +#define OPTION_VAL_200_HU NULL +#define OPTION_VAL_210_HU NULL +#define OPTION_VAL_220_HU NULL +#define OPTION_VAL_230_HU NULL +#define OPTION_VAL_240_HU NULL +#define OPTION_VAL_250_HU NULL +#define OPTION_VAL_260_HU NULL +#define OPTION_VAL_270_HU NULL +#define OPTION_VAL_280_HU NULL +#define OPTION_VAL_290_HU NULL +#define OPTION_VAL_300_HU NULL +#define OPTION_VAL_310_HU NULL +#define OPTION_VAL_320_HU NULL +#define OPTION_VAL_330_HU NULL +#define OPTION_VAL_340_HU NULL +#define OPTION_VAL_350_HU NULL +#define OPTION_VAL_360_HU NULL +#define OPTION_VAL_370_HU NULL +#define OPTION_VAL_380_HU NULL +#define OPTION_VAL_390_HU NULL +#define OPTION_VAL_400_HU NULL +#define OPTION_VAL_410_HU NULL +#define OPTION_VAL_420_HU NULL +#define OPTION_VAL_430_HU NULL +#define OPTION_VAL_440_HU NULL +#define OPTION_VAL_450_HU NULL +#define OPTION_VAL_460_HU NULL +#define OPTION_VAL_470_HU NULL +#define OPTION_VAL_480_HU NULL +#define OPTION_VAL_490_HU NULL +#define OPTION_VAL_500_HU NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HU "Egyedi textúrák betöltése" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HU "Egyedi textúrák betöltése a 'system/dc/textures//' mappából." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HU "Textúrák lementése" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HU "A textúrák lementése .png fájlként a 'system/dc/texdump//' mappába, amint a játék új textúrát használ." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HU "Analóg kar holtsávja" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HU "Az analóg kart ilyen mértékben kell elmozdítani ahhoz, hogy hatása legyen." +#define OPTION_VAL_0_HU NULL +#define OPTION_VAL_5_HU NULL +#define OPTION_VAL_10_HU NULL +#define OPTION_VAL_15_HU NULL +#define OPTION_VAL_20_HU NULL +#define OPTION_VAL_25_HU NULL +#define OPTION_VAL_30_HU NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HU "Ravasz holtsávja" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HU "A ravaszt ilyen mértékben kell elmozdítani ahhoz, hogy hatása legyen." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HU "Digitális ravasz" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HU "Bekapcsolva a ravaszok normális gombokként működnek, teljesen vagy egyáltalán nem lenyomott állapotot visszaadva, köztes érték nélkül." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HU "Digitális kimenetek sugárzása" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HU "A digitális kimenetek és az erővisszacsatolás állapotának közzététele a 8000-es TCP porton. Kompatibilis a MAME \"-output network\" opciójával." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU "Fénypisztoly beállítások megjelenítése" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU "A fénypisztoly célkereszt megjelenítés beállításai. Figyelem: a változtatás életbelépéséhez újra be kell lépni a gyorsmenübe." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HU "A fénypisztoly célkeresztjének méretezése" +#define OPTION_VAL_50_HU NULL +#define OPTION_VAL_60_HU NULL +#define OPTION_VAL_70_HU NULL +#define OPTION_VAL_80_HU NULL +#define OPTION_VAL_90_HU NULL +#define OPTION_VAL_100_O45_HU NULL +#define OPTION_VAL_110_O45_HU NULL +#define OPTION_VAL_120_O45_HU NULL +#define OPTION_VAL_130_O45_HU NULL +#define OPTION_VAL_140_O45_HU NULL +#define OPTION_VAL_150_O45_HU NULL +#define OPTION_VAL_160_O45_HU NULL +#define OPTION_VAL_170_O45_HU NULL +#define OPTION_VAL_180_O45_HU NULL +#define OPTION_VAL_190_O45_HU NULL +#define OPTION_VAL_200_O45_HU NULL +#define OPTION_VAL_210_O45_HU NULL +#define OPTION_VAL_220_O45_HU NULL +#define OPTION_VAL_230_O45_HU NULL +#define OPTION_VAL_240_O45_HU NULL +#define OPTION_VAL_250_O45_HU NULL +#define OPTION_VAL_260_O45_HU NULL +#define OPTION_VAL_270_O45_HU NULL +#define OPTION_VAL_280_O45_HU NULL +#define OPTION_VAL_290_O45_HU NULL +#define OPTION_VAL_300_O45_HU NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU "1. fénypisztoly célkeresztjének megjelenítése" +#define OPTION_VAL_WHITE_HU "Fehér" +#define OPTION_VAL_RED_HU "Vörös" +#define OPTION_VAL_GREEN_HU "Zöld" +#define OPTION_VAL_BLUE_HU "Kék" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU "2. fénypisztoly célkeresztjének megjelenítése" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU "3. fénypisztoly célkeresztjének megjelenítése" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU "4. fénypisztoly célkeresztjének megjelenítése" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HU "Az A1 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HU "Az A1 bővítőhelybe csatlakoztatott eszköz (A csatlakozó, 1. hely)." +#define OPTION_VAL_VMU_HU NULL +#define OPTION_VAL_PURUPURU_HU NULL +#define OPTION_VAL_NONE_HU "Nincs" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HU "Az A2 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HU "Az A2 bővítőhelybe csatlakoztatott eszköz (A csatlakozó, 2. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HU "A B1 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HU "A B1 bővítőhelybe csatlakoztatott eszköz (B csatlakozó, 1. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HU "A B2 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HU "A B2 bővítőhelybe csatlakoztatott eszköz (B csatlakozó, 2. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HU "A C1 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HU "A C1 bővítőhelybe csatlakoztatott eszköz (C csatlakozó, 1. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HU "A C2 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HU "A C2 bővítőhelybe csatlakoztatott eszköz (C csatlakozó, 2. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HU "A D1 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HU "A D1 bővítőhelybe csatlakoztatott eszköz (D csatlakozó, 1. hely)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HU "A D2 bővítőhelyen található eszköz" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HU "A D2 bővítőhelybe csatlakoztatott eszköz (D csatlakozó, 2. hely)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU "Játékonként külön Visual Memory Unit/System (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU "Játékonként külön VMU" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU "Kikapcsolva minden játék ugyanazt a legfeljebb 8 VMU mentés fájlt (A1/A2/B1/B2/C1/C2/D1/D2) használja a RetroArch rendszerkönyvtárban.\n\"VMU A1\" beállításnál minden elindított játéknak külön VMU \"A1\" fájlt hoz létre.\n\"Minden VMU\" beállításnál minden elindított játéknak legfeljebb 8 külön VMU fájlt (A1/A2/B1/B2/C1/C2/D1/D2) hoz létre." +#define OPTION_VAL_VMU_A1_HU NULL +#define OPTION_VAL_ALL_VMUS_HU "Minden VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_HU "A Visual Memory Unit / System (VMU) hangjai" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HU "VMU hangok" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_HU "Bekapcsolva a VMU csipogása is hallható." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU "Visual Memory Unit/System (VMU) megjelenítési beállítások jelenjenek meg" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU "VMU megjelenítési beállítások jelenjenek meg" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU "Az emulált VMU LCD képernyő láthatósági, méret, helyzet, és szín beállításainak engedélyezése. Figyelem: a gyorsmenüt ki-be kell kapcsolni, hogy ez a beállítás érvényre jusson." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU "VMU 1 képernyő megjelenítése" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU "VMU 1 képernyő helyzete" +#define OPTION_VAL_UPPER_LEFT_HU "Bal felső" +#define OPTION_VAL_UPPER_RIGHT_HU "Jobb felső" +#define OPTION_VAL_LOWER_LEFT_HU "Bal alsó" +#define OPTION_VAL_LOWER_RIGHT_HU "Jobb alsó" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU "VMU 1 képernyő mérete" +#define OPTION_VAL_1X_HU NULL +#define OPTION_VAL_3X_HU NULL +#define OPTION_VAL_5X_HU NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU "VMU 1 képernyő bekapcsolt pixel színe" +#define OPTION_VAL_DEFAULT_ON_00_HU "Alapértelmezésben bekapcsolva" +#define OPTION_VAL_DEFAULT_OFF_01_HU "Alapértelmezésben kikapcsolva" +#define OPTION_VAL_BLACK_02_HU "Fekete" +#define OPTION_VAL_LIGHT_BLUE_04_HU "Világoskék" +#define OPTION_VAL_CYAN_06_HU "Ciánkék" +#define OPTION_VAL_CYAN_BLUE_07_HU "Ciánkék" +#define OPTION_VAL_LIGHT_GREEN_08_HU "Világoszöld" +#define OPTION_VAL_CYAN_GREEN_09_HU "Ciánzöld" +#define OPTION_VAL_LIGHT_CYAN_10_HU "Világos ciánkék" +#define OPTION_VAL_PURPLE_12_HU "Lila" +#define OPTION_VAL_LIGHT_PURPLE_13_HU "Világoslila" +#define OPTION_VAL_YELLOW_14_HU "Sárga" +#define OPTION_VAL_GRAY_15_HU "Szürke" +#define OPTION_VAL_LIGHT_PURPLE_2_16_HU "Világoslila (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_HU "Világoszöld (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_HU "Világoszöld (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_HU "Világos ciánkék (2)" +#define OPTION_VAL_LIGHT_RED_2_20_HU "Világospiros (2)" +#define OPTION_VAL_MAGENTA_21_HU "Bíbor" +#define OPTION_VAL_LIGHT_PURPLE_3_22_HU "Világoslila (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_HU "Világos narancs" +#define OPTION_VAL_ORANGE_24_HU "Narancssárga" +#define OPTION_VAL_LIGHT_PURPLE_4_25_HU "Világoslila (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_HU "Halványsárga" +#define OPTION_VAL_LIGHT_YELLOW_2_27_HU "Halványsárga (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU "VMU 1 képernyő kikapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU "VMU 1 képernyő átlátszatlansága" +#define OPTION_VAL_40_HU NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU "VMU 2 képernyő megjelenítése" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU "VMU 2 képernyő helyzete" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU "VMU 2 képernyő mérete" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU "VMU 2 képernyő bekapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU "VMU 2 képernyő kikapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU "VMU 2 képernyő átlátszatlansága" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU "VMU 3 képernyő megjelenítése" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU "VMU 3 képernyő helyzete" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU "VMU 3 képernyő mérete" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU "VMU 3 képernyő bekapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU "VMU 3 képernyő kikapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU "VMU 3 képernyő átlátszatlansága" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU "VMU 4 képernyő megjelenítése" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU "VMU 4 képernyő helyzete" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU "VMU 4 képernyő mérete" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU "VMU 4 képernyő bekapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU "VMU 4 képernyő kikapcsolt pixel színe" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU "VMU 4 képernyő átlátszatlansága" + +struct retro_core_option_v2_category option_cats_hu[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_HU, + CATEGORY_SYSTEM_INFO_0_HU }, { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_ID, - NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ID, - NULL, "video", - { - { "VGA", OPTION_VAL_VGA_ID }, - { "TV (RGB)", OPTION_VAL_TV_RGB_ID }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_ID }, - { NULL, NULL }, - }, - "TV (Composite)", + CATEGORY_VIDEO_LABEL_HU, + CATEGORY_VIDEO_INFO_0_HU }, { - CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_ID, - NULL, - "", - NULL, - "video", - { - { "NTSC", OPTION_VAL_NTSC_ID }, - { "PAL", OPTION_VAL_PAL_ID }, - { "PAL_N", OPTION_VAL_PAL_N_ID }, - { "PAL_M", OPTION_VAL_PAL_M_ID }, - { "Default", OPTION_VAL_DEFAULT_ID }, - { NULL, NULL }, - }, - "NTSC", + "performance", + CATEGORY_PERFORMANCE_LABEL_HU, + CATEGORY_PERFORMANCE_INFO_0_HU }, { - CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID, + "hacks", + CATEGORY_HACKS_LABEL_HU, + CATEGORY_HACKS_INFO_0_HU + }, + { + "input", + CATEGORY_INPUT_LABEL_HU, + CATEGORY_INPUT_INFO_0_HU + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_HU, + CATEGORY_EXPANSIONS_INFO_0_HU + }, + { + "vmu", + CATEGORY_VMU_LABEL_HU, + CATEGORY_VMU_INFO_0_HU + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_hu[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_HU, NULL, "", NULL, - "video", + "system", { - { "horizontal", OPTION_VAL_HORIZONTAL_ID }, - { "vertical", OPTION_VAL_VERTICAL_ID }, + { "Japan", OPTION_VAL_JAPAN_HU }, + { "USA", OPTION_VAL_USA_HU }, + { "Europe", OPTION_VAL_EUROPE_HU }, + { "Default", OPTION_VAL_DEFAULT_HU }, { NULL, NULL }, }, - "horizontal", + "USA", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_LANGUAGE_INFO_0_HU, NULL, - "video", + "system", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_ID }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_ID }, -#endif + { "Japanese", OPTION_VAL_JAPANESE_HU }, + { "English", OPTION_VAL_ENGLISH_HU }, + { "German", OPTION_VAL_GERMAN_HU }, + { "French", OPTION_VAL_FRENCH_HU }, + { "Spanish", OPTION_VAL_SPANISH_HU }, + { "Italian", OPTION_VAL_ITALIAN_HU }, + { "Default", OPTION_VAL_DEFAULT_HU }, { NULL, NULL }, }, -#if defined(LOW_END) - "per-strip (fast, least accurate)", -#else - "per-triangle (normal)", -#endif + "English", }, -#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { - CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ID, + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_HU, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ID, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_HU, NULL, - "video", + "system", { - { "512MB", OPTION_VAL_512MB_ID }, - { "1GB", OPTION_VAL_1GB_ID }, - { "2GB", OPTION_VAL_2GB_ID }, - { "4GB", OPTION_VAL_4GB_ID }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, }, - "512MB", + "disabled", }, { - CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_ID, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_HU, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ID, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_HU, NULL, - "video", + "system", { - { "8", NULL }, - { "16", NULL }, - { "32", NULL }, - { "64", NULL }, - { "128", NULL }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "32", + "disabled", }, -#endif { - CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ID, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_HU, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ID, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_HU, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ID, + { + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_HU, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ID, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_HU, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -38476,13 +42795,13 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, "disabled", }, - {/* TODO: needs explanation */ - CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_ID, + { + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_HU, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -38491,26 +42810,26 @@ struct retro_core_option_v2_definition option_defs_id[] = { "enabled", }, { - CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_ID, + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_HU, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ID, + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_HU, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ID, + CORE_OPTION_NAME_UPNP_INFO_0_HU, NULL, - "video", + "system", { { "disabled", NULL }, { "enabled", NULL }, @@ -38518,43 +42837,172 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, "enabled", }, + { - CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ID, + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_HU, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ID, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_HU, NULL, "video", { - { "off", "disabled" }, - { "2", NULL }, - { "4", NULL }, - { "8", NULL }, - { "16", NULL }, + { "320x240", OPTION_VAL_320X240_HU }, + { "640x480", OPTION_VAL_640X480_HU }, + { "800x600", OPTION_VAL_800X600_HU }, + { "960x720", OPTION_VAL_960X720_HU }, + { "1024x768", OPTION_VAL_1024X768_HU }, + { "1280x960", OPTION_VAL_1280X960_HU }, + { "1440x1080", OPTION_VAL_1440X1080_HU }, + { "1600x1200", OPTION_VAL_1600X1200_HU }, + { "1920x1440", OPTION_VAL_1920X1440_HU }, + { "2560x1920", OPTION_VAL_2560X1920_HU }, + { "2880x2160", OPTION_VAL_2880X2160_HU }, + { "3200x2400", OPTION_VAL_3200X2400_HU }, + { "3840x2880", OPTION_VAL_3840X2880_HU }, + { "4480x3360", OPTION_VAL_4480X3360_HU }, + { "5120x3840", OPTION_VAL_5120X3840_HU }, + { "5760x4320", OPTION_VAL_5760X4320_HU }, + { "6400x4800", OPTION_VAL_6400X4800_HU }, + { "7040x5280", OPTION_VAL_7040X5280_HU }, + { "7680x5760", OPTION_VAL_7680X5760_HU }, + { "8320x6240", OPTION_VAL_8320X6240_HU }, + { "8960x6720", OPTION_VAL_8960X6720_HU }, + { "9600x7200", OPTION_VAL_9600X7200_HU }, + { "10240x7680", OPTION_VAL_10240X7680_HU }, + { "10880x8160", OPTION_VAL_10880X8160_HU }, + { "11520x8640", OPTION_VAL_11520X8640_HU }, + { "12160x9120", OPTION_VAL_12160X9120_HU }, + { "12800x9600", OPTION_VAL_12800X9600_HU }, { NULL, NULL }, }, - "4", +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif }, { - CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ID, + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_HU, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ID, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_HU, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_ID }, - { "1", OPTION_VAL_1_ID }, - { "2", OPTION_VAL_2_ID }, + { "VGA", OPTION_VAL_VGA_HU }, + { "TV (RGB)", OPTION_VAL_TV_RGB_HU }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_HU }, { NULL, NULL }, }, - "0", + "TV (Composite)", }, { - CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ID, + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_HU, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ID, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_HU }, + { "PAL", OPTION_VAL_PAL_HU }, + { "PAL_N", OPTION_VAL_PAL_N_HU }, + { "PAL_M", OPTION_VAL_PAL_M_HU }, + { "Default", OPTION_VAL_DEFAULT_HU }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_HU, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_HU }, + { "vertical", OPTION_VAL_VERTICAL_HU }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_HU, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_HU, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_HU }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_HU }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_HU }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_HU, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_HU, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_HU }, + { "1GB", OPTION_VAL_1GB_HU }, + { "2GB", OPTION_VAL_2GB_HU }, + { "4GB", OPTION_VAL_4GB_HU }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_HU, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_HU, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_HU, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_HU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_HU, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_HU, NULL, "video", { @@ -38564,11 +43012,99 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_HU, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_HU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_HU, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_HU, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_HU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_HU, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_HU, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_HU, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_HU, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_HU }, + { "1", OPTION_VAL_1_HU }, + { "2", OPTION_VAL_2_HU }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_HU, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_HU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ID, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_HU, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ID, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_HU, NULL, "video", { @@ -38580,9 +43116,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ID, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_HU, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ID, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_HU, NULL, "video", { @@ -38595,25 +43131,25 @@ struct retro_core_option_v2_definition option_defs_id[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_ID, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_HU, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ID, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_HU, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_ID }, - { "4", OPTION_VAL_4_ID }, - { "6", OPTION_VAL_6_ID }, + { "2", OPTION_VAL_2_O26_HU }, + { "4", OPTION_VAL_4_HU }, + { "6", OPTION_VAL_6_HU }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ID, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_HU, NULL, "video", { @@ -38627,9 +43163,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ID, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_HU, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ID, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_HU, NULL, "video", { @@ -38639,11 +43175,25 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_HU, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_HU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ID, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_HU, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ID, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_HU, NULL, "performance", { @@ -38655,15 +43205,15 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ID, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_HU, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ID, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_HU, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_ID }, - { "more", OPTION_VAL_MORE_ID }, + { "some", OPTION_VAL_SOME_HU }, + { "more", OPTION_VAL_MORE_HU }, { NULL, NULL }, }, #ifdef LOW_END @@ -38674,9 +43224,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ID, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_HU, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ID, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_HU, NULL, "performance", { @@ -38693,9 +43243,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ID, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_HU, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ID, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_HU, NULL, "hacks", { @@ -38707,9 +43257,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ID, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_HU, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ID, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_HU, NULL, "hacks", { @@ -38721,9 +43271,9 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ID, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_HU, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ID, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_HU, NULL, "hacks", { @@ -38737,64 +43287,78 @@ struct retro_core_option_v2_definition option_defs_id[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_HU, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_HU, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_ID, + CORE_OPTION_NAME_SH4CLOCK_LABEL_HU, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_ID, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_HU, NULL, "hacks", { - { "100", OPTION_VAL_100_ID }, - { "110", OPTION_VAL_110_ID }, - { "120", OPTION_VAL_120_ID }, - { "130", OPTION_VAL_130_ID }, - { "140", OPTION_VAL_140_ID }, - { "150", OPTION_VAL_150_ID }, - { "160", OPTION_VAL_160_ID }, - { "170", OPTION_VAL_170_ID }, - { "180", OPTION_VAL_180_ID }, - { "190", OPTION_VAL_190_ID }, - { "200", OPTION_VAL_200_ID }, - { "210", OPTION_VAL_210_ID }, - { "220", OPTION_VAL_220_ID }, - { "230", OPTION_VAL_230_ID }, - { "240", OPTION_VAL_240_ID }, - { "250", OPTION_VAL_250_ID }, - { "260", OPTION_VAL_260_ID }, - { "270", OPTION_VAL_270_ID }, - { "280", OPTION_VAL_280_ID }, - { "290", OPTION_VAL_290_ID }, - { "300", OPTION_VAL_300_ID }, - { "310", OPTION_VAL_310_ID }, - { "320", OPTION_VAL_320_ID }, - { "330", OPTION_VAL_330_ID }, - { "340", OPTION_VAL_340_ID }, - { "350", OPTION_VAL_350_ID }, - { "360", OPTION_VAL_360_ID }, - { "370", OPTION_VAL_370_ID }, - { "380", OPTION_VAL_380_ID }, - { "390", OPTION_VAL_390_ID }, - { "400", OPTION_VAL_400_ID }, - { "410", OPTION_VAL_410_ID }, - { "420", OPTION_VAL_420_ID }, - { "430", OPTION_VAL_430_ID }, - { "440", OPTION_VAL_440_ID }, - { "450", OPTION_VAL_450_ID }, - { "460", OPTION_VAL_460_ID }, - { "470", OPTION_VAL_470_ID }, - { "480", OPTION_VAL_480_ID }, - { "490", OPTION_VAL_490_ID }, - { "500", OPTION_VAL_500_ID }, + { "100", OPTION_VAL_100_HU }, + { "110", OPTION_VAL_110_HU }, + { "120", OPTION_VAL_120_HU }, + { "130", OPTION_VAL_130_HU }, + { "140", OPTION_VAL_140_HU }, + { "150", OPTION_VAL_150_HU }, + { "160", OPTION_VAL_160_HU }, + { "170", OPTION_VAL_170_HU }, + { "180", OPTION_VAL_180_HU }, + { "190", OPTION_VAL_190_HU }, + { "200", OPTION_VAL_200_HU }, + { "210", OPTION_VAL_210_HU }, + { "220", OPTION_VAL_220_HU }, + { "230", OPTION_VAL_230_HU }, + { "240", OPTION_VAL_240_HU }, + { "250", OPTION_VAL_250_HU }, + { "260", OPTION_VAL_260_HU }, + { "270", OPTION_VAL_270_HU }, + { "280", OPTION_VAL_280_HU }, + { "290", OPTION_VAL_290_HU }, + { "300", OPTION_VAL_300_HU }, + { "310", OPTION_VAL_310_HU }, + { "320", OPTION_VAL_320_HU }, + { "330", OPTION_VAL_330_HU }, + { "340", OPTION_VAL_340_HU }, + { "350", OPTION_VAL_350_HU }, + { "360", OPTION_VAL_360_HU }, + { "370", OPTION_VAL_370_HU }, + { "380", OPTION_VAL_380_HU }, + { "390", OPTION_VAL_390_HU }, + { "400", OPTION_VAL_400_HU }, + { "410", OPTION_VAL_410_HU }, + { "420", OPTION_VAL_420_HU }, + { "430", OPTION_VAL_430_HU }, + { "440", OPTION_VAL_440_HU }, + { "450", OPTION_VAL_450_HU }, + { "460", OPTION_VAL_460_HU }, + { "470", OPTION_VAL_470_HU }, + { "480", OPTION_VAL_480_HU }, + { "490", OPTION_VAL_490_HU }, + { "500", OPTION_VAL_500_HU }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ID, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_HU, NULL, "hacks", { @@ -38804,11 +43368,11 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ID, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_HU, NULL, "hacks", { @@ -38820,47 +43384,47 @@ struct retro_core_option_v2_definition option_defs_id[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ID, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_HU, NULL, "input", { - { "0%", OPTION_VAL_0_ID }, - { "5%", OPTION_VAL_5_ID }, - { "10%", OPTION_VAL_10_ID }, - { "15%", OPTION_VAL_15_ID }, - { "20%", OPTION_VAL_20_ID }, - { "25%", OPTION_VAL_25_ID }, - { "30%", OPTION_VAL_30_ID }, + { "0%", OPTION_VAL_0_HU }, + { "5%", OPTION_VAL_5_HU }, + { "10%", OPTION_VAL_10_HU }, + { "15%", OPTION_VAL_15_HU }, + { "20%", OPTION_VAL_20_HU }, + { "25%", OPTION_VAL_25_HU }, + { "30%", OPTION_VAL_30_HU }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ID, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_HU, NULL, "input", { - { "0%", OPTION_VAL_0_ID }, - { "5%", OPTION_VAL_5_ID }, - { "10%", OPTION_VAL_10_ID }, - { "15%", OPTION_VAL_15_ID }, - { "20%", OPTION_VAL_20_ID }, - { "25%", OPTION_VAL_25_ID }, - { "30%", OPTION_VAL_30_ID }, + { "0%", OPTION_VAL_0_HU }, + { "5%", OPTION_VAL_5_HU }, + { "10%", OPTION_VAL_10_HU }, + { "15%", OPTION_VAL_15_HU }, + { "20%", OPTION_VAL_20_HU }, + { "25%", OPTION_VAL_25_HU }, + { "30%", OPTION_VAL_30_HU }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ID, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_HU, NULL, "input", { @@ -38871,10 +43435,10 @@ struct retro_core_option_v2_definition option_defs_id[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_ID, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_HU, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_ID, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_HU, NULL, "input", { @@ -38882,300 +43446,293 @@ struct retro_core_option_v2_definition option_defs_id[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ID, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_HU, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ID, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_HU, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ID, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_HU, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ID, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_HU }, + { "60%", OPTION_VAL_60_HU }, + { "70%", OPTION_VAL_70_HU }, + { "80%", OPTION_VAL_80_HU }, + { "90%", OPTION_VAL_90_HU }, + { "100%", OPTION_VAL_100_O45_HU }, + { "110%", OPTION_VAL_110_O45_HU }, + { "120%", OPTION_VAL_120_O45_HU }, + { "130%", OPTION_VAL_130_O45_HU }, + { "140%", OPTION_VAL_140_O45_HU }, + { "150%", OPTION_VAL_150_O45_HU }, + { "160%", OPTION_VAL_160_O45_HU }, + { "170%", OPTION_VAL_170_O45_HU }, + { "180%", OPTION_VAL_180_O45_HU }, + { "190%", OPTION_VAL_190_O45_HU }, + { "200%", OPTION_VAL_200_O45_HU }, + { "210%", OPTION_VAL_210_O45_HU }, + { "220%", OPTION_VAL_220_O45_HU }, + { "230%", OPTION_VAL_230_O45_HU }, + { "240%", OPTION_VAL_240_O45_HU }, + { "250%", OPTION_VAL_250_O45_HU }, + { "260%", OPTION_VAL_260_O45_HU }, + { "270%", OPTION_VAL_270_O45_HU }, + { "280%", OPTION_VAL_280_O45_HU }, + { "290%", OPTION_VAL_290_O45_HU }, + { "300%", OPTION_VAL_300_O45_HU }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ID, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_HU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ID }, - { "Red", OPTION_VAL_RED_ID }, - { "Green", OPTION_VAL_GREEN_ID }, - { "Blue", OPTION_VAL_BLUE_ID }, + { "White", OPTION_VAL_WHITE_HU }, + { "Red", OPTION_VAL_RED_HU }, + { "Green", OPTION_VAL_GREEN_HU }, + { "Blue", OPTION_VAL_BLUE_HU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ID, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_HU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ID }, - { "Red", OPTION_VAL_RED_ID }, - { "Green", OPTION_VAL_GREEN_ID }, - { "Blue", OPTION_VAL_BLUE_ID }, + { "White", OPTION_VAL_WHITE_HU }, + { "Red", OPTION_VAL_RED_HU }, + { "Green", OPTION_VAL_GREEN_HU }, + { "Blue", OPTION_VAL_BLUE_HU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ID, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_HU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ID }, - { "Red", OPTION_VAL_RED_ID }, - { "Green", OPTION_VAL_GREEN_ID }, - { "Blue", OPTION_VAL_BLUE_ID }, + { "White", OPTION_VAL_WHITE_HU }, + { "Red", OPTION_VAL_RED_HU }, + { "Green", OPTION_VAL_GREEN_HU }, + { "Blue", OPTION_VAL_BLUE_HU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ID, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_HU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_ID }, - { "Red", OPTION_VAL_RED_ID }, - { "Green", OPTION_VAL_GREEN_ID }, - { "Blue", OPTION_VAL_BLUE_ID }, + { "White", OPTION_VAL_WHITE_HU }, + { "Red", OPTION_VAL_RED_HU }, + { "Green", OPTION_VAL_GREEN_HU }, + { "Blue", OPTION_VAL_BLUE_HU }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ID, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ID, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ID, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_HU, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_HU, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_ID }, - { "All VMUs", OPTION_VAL_ALL_VMUS_ID }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_ID, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ID, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_ID, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_HU, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_HU, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ID, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ID, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_HU, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_HU, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_HU, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_HU, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_HU, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_ID }, - { "2x", OPTION_VAL_2_O27_ID }, - { "3x", OPTION_VAL_3X_ID }, - { "4x", OPTION_VAL_4_ID }, - { "5x", OPTION_VAL_5X_ID }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ID, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_HU, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ID, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_HU, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_HU, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "VMU", OPTION_VAL_VMU_HU }, + { "Purupuru", OPTION_VAL_PURUPURU_HU }, + { "None", OPTION_VAL_NONE_HU }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ID, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_HU, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_HU, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_HU, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_HU }, + { "All VMUs", OPTION_VAL_ALL_VMUS_HU }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_HU, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_HU, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_HU, NULL, "vmu", { - { "10%", OPTION_VAL_10_ID }, - { "20%", OPTION_VAL_20_ID }, - { "30%", OPTION_VAL_30_ID }, - { "40%", OPTION_VAL_40_ID }, - { "50%", OPTION_VAL_50_ID }, - { "60%", OPTION_VAL_60_ID }, - { "70%", OPTION_VAL_70_ID }, - { "80%", OPTION_VAL_80_ID }, - { "90%", OPTION_VAL_90_ID }, - { "100%", OPTION_VAL_100_O57_ID }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ID, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_HU, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_HU, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_HU, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_HU, NULL, "", NULL, @@ -39188,145 +43745,145 @@ struct retro_core_option_v2_definition option_defs_id[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ID, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_HU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ID, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_HU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ID }, - { "2x", OPTION_VAL_2_O27_ID }, - { "3x", OPTION_VAL_3X_ID }, - { "4x", OPTION_VAL_4_ID }, - { "5x", OPTION_VAL_5X_ID }, + { "1x", OPTION_VAL_1X_HU }, + { "2x", OPTION_VAL_2_O26_HU }, + { "3x", OPTION_VAL_3X_HU }, + { "4x", OPTION_VAL_4_HU }, + { "5x", OPTION_VAL_5X_HU }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ID, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_HU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ID }, - { "20%", OPTION_VAL_20_ID }, - { "30%", OPTION_VAL_30_ID }, - { "40%", OPTION_VAL_40_ID }, - { "50%", OPTION_VAL_50_ID }, - { "60%", OPTION_VAL_60_ID }, - { "70%", OPTION_VAL_70_ID }, - { "80%", OPTION_VAL_80_ID }, - { "90%", OPTION_VAL_90_ID }, - { "100%", OPTION_VAL_100_O57_ID }, + { "10%", OPTION_VAL_10_HU }, + { "20%", OPTION_VAL_20_HU }, + { "30%", OPTION_VAL_30_HU }, + { "40%", OPTION_VAL_40_HU }, + { "50%", OPTION_VAL_50_HU }, + { "60%", OPTION_VAL_60_HU }, + { "70%", OPTION_VAL_70_HU }, + { "80%", OPTION_VAL_80_HU }, + { "90%", OPTION_VAL_90_HU }, + { "100%", OPTION_VAL_100_O45_HU }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ID, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_HU, NULL, "", NULL, @@ -39339,145 +43896,145 @@ struct retro_core_option_v2_definition option_defs_id[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ID, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_HU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ID, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_HU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ID }, - { "2x", OPTION_VAL_2_O27_ID }, - { "3x", OPTION_VAL_3X_ID }, - { "4x", OPTION_VAL_4_ID }, - { "5x", OPTION_VAL_5X_ID }, + { "1x", OPTION_VAL_1X_HU }, + { "2x", OPTION_VAL_2_O26_HU }, + { "3x", OPTION_VAL_3X_HU }, + { "4x", OPTION_VAL_4_HU }, + { "5x", OPTION_VAL_5X_HU }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ID, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_HU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ID }, - { "20%", OPTION_VAL_20_ID }, - { "30%", OPTION_VAL_30_ID }, - { "40%", OPTION_VAL_40_ID }, - { "50%", OPTION_VAL_50_ID }, - { "60%", OPTION_VAL_60_ID }, - { "70%", OPTION_VAL_70_ID }, - { "80%", OPTION_VAL_80_ID }, - { "90%", OPTION_VAL_90_ID }, - { "100%", OPTION_VAL_100_O57_ID }, + { "10%", OPTION_VAL_10_HU }, + { "20%", OPTION_VAL_20_HU }, + { "30%", OPTION_VAL_30_HU }, + { "40%", OPTION_VAL_40_HU }, + { "50%", OPTION_VAL_50_HU }, + { "60%", OPTION_VAL_60_HU }, + { "70%", OPTION_VAL_70_HU }, + { "80%", OPTION_VAL_80_HU }, + { "90%", OPTION_VAL_90_HU }, + { "100%", OPTION_VAL_100_O45_HU }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ID, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_HU, NULL, "", NULL, @@ -39490,534 +44047,726 @@ struct retro_core_option_v2_definition option_defs_id[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ID, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_HU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ID, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_HU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_ID }, - { "2x", OPTION_VAL_2_O27_ID }, - { "3x", OPTION_VAL_3X_ID }, - { "4x", OPTION_VAL_4_ID }, - { "5x", OPTION_VAL_5X_ID }, + { "1x", OPTION_VAL_1X_HU }, + { "2x", OPTION_VAL_2_O26_HU }, + { "3x", OPTION_VAL_3X_HU }, + { "4x", OPTION_VAL_4_HU }, + { "5x", OPTION_VAL_5X_HU }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ID, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_HU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, - { "BLACK 02", OPTION_VAL_BLACK_02_ID }, - { "BLUE 03", OPTION_VAL_BLUE_ID }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, - { "GREEN 05", OPTION_VAL_GREEN_ID }, - { "CYAN 06", OPTION_VAL_CYAN_06_ID }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, - { "RED 11", OPTION_VAL_RED_ID }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, - { "GRAY 15", OPTION_VAL_GRAY_15_ID }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, - { "WHITE 28", OPTION_VAL_WHITE_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ID, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_HU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_ID }, - { "20%", OPTION_VAL_20_ID }, - { "30%", OPTION_VAL_30_ID }, - { "40%", OPTION_VAL_40_ID }, - { "50%", OPTION_VAL_50_ID }, - { "60%", OPTION_VAL_60_ID }, - { "70%", OPTION_VAL_70_ID }, - { "80%", OPTION_VAL_80_ID }, - { "90%", OPTION_VAL_90_ID }, - { "100%", OPTION_VAL_100_O57_ID }, + { "10%", OPTION_VAL_10_HU }, + { "20%", OPTION_VAL_20_HU }, + { "30%", OPTION_VAL_30_HU }, + { "40%", OPTION_VAL_40_HU }, + { "50%", OPTION_VAL_50_HU }, + { "60%", OPTION_VAL_60_HU }, + { "70%", OPTION_VAL_70_HU }, + { "80%", OPTION_VAL_80_HU }, + { "90%", OPTION_VAL_90_HU }, + { "100%", OPTION_VAL_100_O45_HU }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_id = { - option_cats_id, - option_defs_id -}; - -/* RETRO_LANGUAGE_IT */ - -#define CATEGORY_SYSTEM_LABEL_IT "Sistema" -#define CATEGORY_SYSTEM_INFO_0_IT "Configurare la regione, la lingua, il BIOS e le impostazioni hardware di base." -#define CATEGORY_VIDEO_LABEL_IT NULL -#define CATEGORY_VIDEO_INFO_0_IT "Configurare la risoluzione, la trasparenza indipendente dall'ordine e le impostazioni degli effetti visivi." -#define CATEGORY_PERFORMANCE_LABEL_IT "Prestazioni" -#define CATEGORY_PERFORMANCE_INFO_0_IT "Configurare il rendering filettato e le impostazioni del salto di fotogramma." -#define CATEGORY_HACKS_LABEL_IT "Hack di Emulazione" -#define CATEGORY_HACKS_INFO_0_IT "Configura override widescreen, velocità di caricamento GD-ROM e impostazioni di sostituzione texture." -#define CATEGORY_INPUT_LABEL_IT NULL -#define CATEGORY_INPUT_INFO_0_IT "Configura impostazioni gamepad e pistola ottica." -#define CATEGORY_VMU_LABEL_IT "Unità Memoria Visiva" -#define CATEGORY_VMU_INFO_0_IT "Configura i file VMU per gioco e le impostazioni di visibilità VMU sullo schermo." -#define CORE_OPTION_NAME_REGION_LABEL_IT "Regione" -#define OPTION_VAL_JAPAN_IT "Giappone" -#define OPTION_VAL_USA_IT NULL -#define OPTION_VAL_EUROPE_IT "Europa" -#define OPTION_VAL_DEFAULT_IT "Predefinito" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_IT "Lingua" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_IT "Cambia la lingua usata dal BIOS e da qualsiasi gioco che contenga più lingue." -#define OPTION_VAL_JAPANESE_IT "Giapponese" -#define OPTION_VAL_ENGLISH_IT "Inglese" -#define OPTION_VAL_GERMAN_IT "Tedesco" -#define OPTION_VAL_FRENCH_IT "Francese" -#define OPTION_VAL_SPANISH_IT "Spagnolo" -#define OPTION_VAL_ITALIAN_IT "Italiano" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_IT "HLE BIOS (Riavvio Richiesto)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_IT "Forza l'uso di BIOS di emulazione di alto livello." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_IT "Avvio in BIOS (Riavvio richiesto)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_IT "Avviare direttamente nel menu BIOS Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_IT "Abilita DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_IT "Abilita l'emulazione del DSP audio di Dreamcast (processore di segnale digitale). Migliora l'accuratezza del suono generato, ma aumenta i requisiti di prestazioni." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_IT "Forza Modalità Windows Ce" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_IT "Abilita l'emulazione di MMU (Memory Management Unit) e altre impostazioni per i giochi Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_IT "Consenti I Pulsanti Di Servizio NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_IT "Abilita il pulsante SERVICE per NAOMI, per inserire le impostazioni del cabinato." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_IT "Imposta giochi NAOMI a Free Play" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_IT "Modificare le impostazioni del gioco per free play." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_IT "Emulazione Adattatore A banda larga" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_IT "Emulare l'adattatore a banda larga ethernet invece del modem. (Riavvio richiesto)" -#define CORE_OPTION_NAME_UPNP_LABEL_IT "Abilita UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_IT "Usa UPnP per configurare automaticamente il router Internet per i giochi online." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_IT "Risoluzione Interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_IT "Modificare la risoluzione di rendering." -#define OPTION_VAL_320X240_IT NULL -#define OPTION_VAL_640X480_IT NULL -#define OPTION_VAL_800X600_IT NULL -#define OPTION_VAL_960X720_IT NULL -#define OPTION_VAL_1024X768_IT NULL -#define OPTION_VAL_1280X960_IT NULL -#define OPTION_VAL_1440X1080_IT NULL -#define OPTION_VAL_1600X1200_IT NULL -#define OPTION_VAL_1920X1440_IT NULL -#define OPTION_VAL_2560X1920_IT NULL -#define OPTION_VAL_2880X2160_IT NULL -#define OPTION_VAL_3200X2400_IT NULL -#define OPTION_VAL_3840X2880_IT NULL -#define OPTION_VAL_4480X3360_IT NULL -#define OPTION_VAL_5120X3840_IT NULL -#define OPTION_VAL_5760X4320_IT NULL -#define OPTION_VAL_6400X4800_IT NULL -#define OPTION_VAL_7040X5280_IT NULL -#define OPTION_VAL_7680X5760_IT NULL -#define OPTION_VAL_8320X6240_IT NULL -#define OPTION_VAL_8960X6720_IT NULL -#define OPTION_VAL_9600X7200_IT NULL -#define OPTION_VAL_10240X7680_IT NULL -#define OPTION_VAL_10880X8160_IT NULL -#define OPTION_VAL_11520X8640_IT NULL -#define OPTION_VAL_12160X9120_IT NULL -#define OPTION_VAL_12800X9600_IT NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_IT "Tipo Di Cavo" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_IT "Il tipo di segnale di uscita. 'TV (Composito)' è il più ampiamente supportato." -#define OPTION_VAL_VGA_IT NULL -#define OPTION_VAL_TV_RGB_IT NULL -#define OPTION_VAL_TV_COMPOSITE_IT "TV (Composto)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_IT "Standard di trasmissione" -#define OPTION_VAL_NTSC_IT NULL -#define OPTION_VAL_PAL_IT "PAL (Mondo)" -#define OPTION_VAL_PAL_N_IT NULL -#define OPTION_VAL_PAL_M_IT "PAL-M (Brasile)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_IT "Orientamento Schermo" -#define OPTION_VAL_HORIZONTAL_IT "Orizzontale" -#define OPTION_VAL_VERTICAL_IT "Verticale" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_IT "Ordinamento Alfa" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_IT "Per-Strip (veloce, meno preciso)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_IT "Per-Triangolo (normale)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_IT "Per-Pixel (preciso, ma più lento)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_IT "Dimensione di accumulo del Buffer Pixel" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_IT "Potrebbero essere necessari valori più alti per ottenere risoluzioni più elevate in uscita correttamente." -#define OPTION_VAL_512MB_IT NULL -#define OPTION_VAL_1GB_IT NULL -#define OPTION_VAL_2GB_IT NULL -#define OPTION_VAL_4GB_IT NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_IT "Strati trasparenti massimi" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_IT "Potrebbero essere necessari valori più elevati per scene complesse." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_IT "Emulazione framebuffer completa" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_IT "Abilita l'emulazione completa del framebuffer in VRAM. Ciò è utile per i giochi che leggono o scrivono direttamente il framebuffer in VRAM. Se abilitata, la risoluzione interna è costretta a 640x480 e le prestazioni possono essere gravemente colpite." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_IT "Abilita Buffer RTT (Render To Texture)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_IT "Copia le texture renderizzate dalla GPU a VRAM. Questa opzione è normalmente abilitata per i giochi che lo richiedono. Se abilitata, il rendering delle texture è disabilitato e le prestazioni potrebbero essere influenzate." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_IT NULL -#define CORE_OPTION_NAME_FOG_LABEL_IT "Effetti Nebbia" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_IT "Modificatore del Volume" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_IT "Una funzionalità della GPU Dreamcast che viene tipicamente utilizzata dai giochi per disegnare ombre degli oggetti. Questo dovrebbe normalmente essere abilitato - l'impatto delle prestazioni di solito è minimo o trascurabile." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_IT "Filtro Anisotropico" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_IT "Migliorare la qualità delle texture su superfici che sono ad angoli obliqui rispetto alla fotocamera. Valori più alti sono più impegnativi per la GPU. Le modifiche a questa impostazione si applicano solo dopo il riavvio." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_IT "Filtro Texture" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_IT "La modalità di filtraggio delle texture da usare. Questo può essere usato per forzare una certa modalità di filtraggio delle texture su tutte le texture per ottenere un aspetto più nitido (o più liscio) di quello predefinito. Valori diversi da quelli predefiniti possono causare vari problemi di rendering. Le modifiche a questa impostazione si applicano solo dopo il riavvio." -#define OPTION_VAL_1_IT "Forza il Vicino più Vicino" -#define OPTION_VAL_2_IT "Forza Lineare" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_IT "Ritardo Scambio fotogrammi" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_IT "Utile per evitare di lampeggiare schermi o video glitchati. Sconsigliato su piattaforme lente." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_IT "Rileva Modifiche Frame Rate" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_IT "Notificare il frontend quando il frame rate interno cambia (ad esempio da 60 fps a 30 fps). Migliora il ritmo dei fotogrammi nei giochi che girano a un bloccato 30 fps o 20 fps, ma dovrebbe essere disabilitato per i giochi con frame rate sbloccati (instabili) (e.. Ecco il delfino, torneo irreale). Nota: non disponibile quando 'Auto Salta Frame' è abilitato." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_IT "Filtro Di Post-Elaborazione PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_IT "Post-elaborare l'immagine renderizzata per simulare effetti specifici alla GPU PowerVR2 e segnali video analogici." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_IT "Miglioramento Della Texture (xbrz)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_IT "Migliora la grafica grafica grafica a pixel 2D disegnata a mano. Dovrebbe essere usata solo con giochi in pixel 2D." -#define OPTION_VAL_2_O27_IT NULL -#define OPTION_VAL_4_IT NULL -#define OPTION_VAL_6_IT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_IT "Miglioramento Texture Dimensione Massima Filtrata" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_IT "Interpolazione Di Profondità Nativa" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_IT "Aiuta con la corruzione della texture e problemi di profondità sulle GPU AMD. Può anche aiutare le GPU Intel in alcuni casi." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_IT "Rendering Filettato" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_IT "Esegue la GPU e la CPU su diversi thread. Altamente raccomandato." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_IT "Auto Salto Fotogrammi" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_IT "Salta automaticamente i fotogrammi quando l'emulatore è lento. Nota: questa impostazione si applica solo quando il Rendering Threaded è abilitato." -#define OPTION_VAL_SOME_IT "Normale" -#define OPTION_VAL_MORE_IT "Massimo" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_IT "Salto fotogrammi" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_IT "Imposta il numero di fotogrammi da saltare tra ogni fotogramma visualizzato." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_IT "Trucchi Widescreen (Riavvio Richiesto)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_IT "Attiva i trucchi che permettono ad alcuni giochi di visualizzare in formato widescreen." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_IT "Hack Widescreen" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_IT "Disegnare la geometria al di fuori del normale rapporto di aspetto 4:3. Può produrre difetti grafici nelle aree rivelate." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_IT "Caricamento Veloce GD-ROM (inaccurato)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_IT "Accelera il caricamento di GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_IT "CPU SH4 sotto/overclock" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_IT "Cambia l'orologio principale della CPU SH4 da 200 MHz predefinito. Underclocking può aiutare le piattaforme lente. L'overclocking può aumentare il frame rate per alcuni giochi. Usare con cautela." -#define OPTION_VAL_100_IT NULL -#define OPTION_VAL_110_IT NULL -#define OPTION_VAL_120_IT NULL -#define OPTION_VAL_130_IT NULL -#define OPTION_VAL_140_IT NULL -#define OPTION_VAL_150_IT NULL -#define OPTION_VAL_160_IT NULL -#define OPTION_VAL_170_IT NULL -#define OPTION_VAL_180_IT NULL -#define OPTION_VAL_190_IT NULL -#define OPTION_VAL_200_IT NULL -#define OPTION_VAL_210_IT NULL -#define OPTION_VAL_220_IT NULL -#define OPTION_VAL_230_IT NULL -#define OPTION_VAL_240_IT NULL -#define OPTION_VAL_250_IT NULL -#define OPTION_VAL_260_IT NULL -#define OPTION_VAL_270_IT NULL -#define OPTION_VAL_280_IT NULL -#define OPTION_VAL_290_IT NULL -#define OPTION_VAL_300_IT NULL -#define OPTION_VAL_310_IT NULL -#define OPTION_VAL_320_IT NULL -#define OPTION_VAL_330_IT NULL -#define OPTION_VAL_340_IT NULL -#define OPTION_VAL_350_IT NULL -#define OPTION_VAL_360_IT NULL -#define OPTION_VAL_370_IT NULL -#define OPTION_VAL_380_IT NULL -#define OPTION_VAL_390_IT NULL -#define OPTION_VAL_400_IT NULL -#define OPTION_VAL_410_IT NULL -#define OPTION_VAL_420_IT NULL -#define OPTION_VAL_430_IT NULL -#define OPTION_VAL_440_IT NULL -#define OPTION_VAL_450_IT NULL -#define OPTION_VAL_460_IT NULL -#define OPTION_VAL_470_IT NULL -#define OPTION_VAL_480_IT NULL -#define OPTION_VAL_490_IT NULL -#define OPTION_VAL_500_IT NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_IT "Carica Texture Personalizzate" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_IT "Scarica Texture" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_IT "Zona morta dello sticl analogico" -#define OPTION_VAL_0_IT NULL -#define OPTION_VAL_5_IT NULL -#define OPTION_VAL_10_IT NULL -#define OPTION_VAL_15_IT NULL -#define OPTION_VAL_20_IT NULL -#define OPTION_VAL_25_IT NULL -#define OPTION_VAL_30_IT NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_IT "Zona morta dei trigger" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_IT "Trigger Digitali" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_IT "Pacchetto/Vibrazione Purupuru" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_IT "Attiva al vibrazione del controller." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_IT "Uscite di trasmissione digitale" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_IT "Trasmissione di uscite digitali e stato di forza-feedback sulla porta TCP 8000. Compatibile con l'opzione MAME \"-output network\"." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_IT "Mostra Impostazioni Pistola Ottica" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_IT "Abilita la configurazione delle opzioni di visualizzazione di una pistola leggera. NOTA: potrebbe essere necessario attivare il menu rapido perché questa impostazione abbia effetto." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 1" -#define OPTION_VAL_WHITE_IT "Bianco" -#define OPTION_VAL_RED_IT "Rosso" -#define OPTION_VAL_GREEN_IT "Verde" -#define OPTION_VAL_BLUE_IT "Blu" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_IT "Visual Memory Units/Sistemi per Gioco (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_IT "VMU per gioco" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_IT "Quando disabilitato, tutti i giochi condividono 4 file VMU salvati (A1, B1, C1, D1) situati nella directory di sistema di RetroArch. L'impostazione 'VMU A1' crea un unico file VMU 'A1' nella directory di salvataggio di RetroArch, per ogni gioco che viene lanciato. L'impostazione 'All VMUs' crea 4 file VMU unici (A1, B1, C1, D1) per ogni gioco che viene lanciato." -#define OPTION_VAL_VMU_A1_IT NULL -#define OPTION_VAL_ALL_VMUS_IT "Tutte Le VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_IT "Suoni Delle Unità Di Memoria Visiva/Sistemi (VMU)" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_IT "Suoni VMU" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_IT "Se abilitato, vengono riprodotti i segnali acustici VMU." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_IT "Mostra Le Impostazioni Di Visualizzazione della Visual Memory Unit/System (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_IT "Mostra Impostazioni Di Visualizzazione VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_IT "Abilita la configurazione dello schermo LCD VMU emulato, la dimensione, la posizione e il colore. NOTA: potrebbe essere necessario attivare il menu rapido affinché questa impostazione abbia effetto." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_IT "Posizione VMU Schermo 1" -#define OPTION_VAL_UPPER_LEFT_IT "In Alto a Sinistra" -#define OPTION_VAL_UPPER_RIGHT_IT "In Alto a Destra" -#define OPTION_VAL_LOWER_LEFT_IT "In Basso a Sinistra" -#define OPTION_VAL_LOWER_RIGHT_IT "In Basso a Destra" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_IT "Dimensione VMU Schermo 1" -#define OPTION_VAL_1X_IT NULL -#define OPTION_VAL_3X_IT NULL -#define OPTION_VAL_5X_IT NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_IT "Schermo VMU 1 Pixel Su Colore" -#define OPTION_VAL_DEFAULT_ON_00_IT "Predefinito ON" -#define OPTION_VAL_DEFAULT_OFF_01_IT "Predefinito OFF" -#define OPTION_VAL_BLACK_02_IT "Nero" -#define OPTION_VAL_LIGHT_BLUE_04_IT "Azzurro" -#define OPTION_VAL_CYAN_06_IT "Ciano" -#define OPTION_VAL_CYAN_BLUE_07_IT "Blu Ciano" -#define OPTION_VAL_LIGHT_GREEN_08_IT "Verde Chiaro" -#define OPTION_VAL_CYAN_GREEN_09_IT "Verde Ciano" -#define OPTION_VAL_LIGHT_CYAN_10_IT "Ciano Chiaro" -#define OPTION_VAL_PURPLE_12_IT "Viola" -#define OPTION_VAL_LIGHT_PURPLE_13_IT "Viola Chiaro" -#define OPTION_VAL_YELLOW_14_IT "Giallo" -#define OPTION_VAL_GRAY_15_IT "Grigio" -#define OPTION_VAL_LIGHT_PURPLE_2_16_IT "Viola Chiaro (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_IT "Verde Chiaro (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_IT "Verde Chiaro (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_IT "Ciano Chiaro (2)" -#define OPTION_VAL_LIGHT_RED_2_20_IT "Rosso Chiaro (2)" -#define OPTION_VAL_MAGENTA_21_IT NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_IT "Viola Chiaro (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_IT "Arancione Chiaro" -#define OPTION_VAL_ORANGE_24_IT "Arancione" -#define OPTION_VAL_LIGHT_PURPLE_4_25_IT "Viola Chiaro (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_IT "Giallo Chiaro" -#define OPTION_VAL_LIGHT_YELLOW_2_27_IT "Giallo Chiaro (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_IT "Colore Vmu Schermo 1 Pixel Off" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_IT "Opacità VMU Screen 1" -#define OPTION_VAL_40_IT NULL -#define OPTION_VAL_50_IT NULL -#define OPTION_VAL_60_IT NULL -#define OPTION_VAL_70_IT NULL -#define OPTION_VAL_80_IT NULL -#define OPTION_VAL_90_IT NULL -#define OPTION_VAL_100_O57_IT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_IT "Posizione VMU Schermo 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_IT "Dimensione VMU Schermo 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_IT "Colore VMU Schermo 2 Pixel On" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_IT "Colore VMU Schermo 2 Pixel Off" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_IT "Opacità VMU Schermo 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo 3 VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_IT "Posizione Schermo 3 VMU" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_IT "Dimensione Schermo 3 VMU" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_IT "Colore su Pixel Schermo VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_IT "Colore Pixel Off Schermo VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_IT "Opacità Schermo VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_IT "Posizione Schermo VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_IT "Dimensione Schermo VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_IT "Colore Pixel On Schermo VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_IT "Colore Pixel Off Schermo VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_IT "Opacità Schermo VMU 4" - -struct retro_core_option_v2_category option_cats_it[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_IT, - CATEGORY_SYSTEM_INFO_0_IT - }, - { - "video", - CATEGORY_VIDEO_LABEL_IT, - CATEGORY_VIDEO_INFO_0_IT - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_IT, - CATEGORY_PERFORMANCE_INFO_0_IT - }, - { - "hacks", - CATEGORY_HACKS_LABEL_IT, - CATEGORY_HACKS_INFO_0_IT - }, - { - "input", - CATEGORY_INPUT_LABEL_IT, - CATEGORY_INPUT_INFO_0_IT - }, - { - "vmu", - CATEGORY_VMU_LABEL_IT, - CATEGORY_VMU_INFO_0_IT - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_it[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_IT, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_HU, NULL, "", NULL, - "system", + "vmu", { - { "Japan", OPTION_VAL_JAPAN_IT }, - { "USA", OPTION_VAL_USA_IT }, - { "Europe", OPTION_VAL_EUROPE_IT }, - { "Default", OPTION_VAL_DEFAULT_IT }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "USA", + "disabled", }, { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_IT, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_HU, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_IT, + "", NULL, - "system", + "vmu", { - { "Japanese", OPTION_VAL_JAPANESE_IT }, - { "English", OPTION_VAL_ENGLISH_IT }, - { "German", OPTION_VAL_GERMAN_IT }, - { "French", OPTION_VAL_FRENCH_IT }, - { "Spanish", OPTION_VAL_SPANISH_IT }, - { "Italian", OPTION_VAL_ITALIAN_IT }, - { "Default", OPTION_VAL_DEFAULT_IT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_HU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_HU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_HU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_HU }, { NULL, NULL }, }, - "English", + "Lower Right", }, { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_IT, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_HU, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_IT, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, + { "1x", OPTION_VAL_1X_HU }, + { "2x", OPTION_VAL_2_O26_HU }, + { "3x", OPTION_VAL_3X_HU }, + { "4x", OPTION_VAL_4_HU }, + { "5x", OPTION_VAL_5X_HU }, + { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_IT, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_HU, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_IT, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_HU, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_HU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_HU }, + { "BLACK 02", OPTION_VAL_BLACK_02_HU }, + { "BLUE 03", OPTION_VAL_BLUE_HU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_HU }, + { "GREEN 05", OPTION_VAL_GREEN_HU }, + { "CYAN 06", OPTION_VAL_CYAN_06_HU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_HU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_HU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_HU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_HU }, + { "RED 11", OPTION_VAL_RED_HU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_HU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_HU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_HU }, + { "GRAY 15", OPTION_VAL_GRAY_15_HU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_HU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_HU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_HU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_HU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_HU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_HU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_HU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_HU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_HU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_HU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_HU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_HU }, + { "WHITE 28", OPTION_VAL_WHITE_HU }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_HU, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_HU }, + { "20%", OPTION_VAL_20_HU }, + { "30%", OPTION_VAL_30_HU }, + { "40%", OPTION_VAL_40_HU }, + { "50%", OPTION_VAL_50_HU }, + { "60%", OPTION_VAL_60_HU }, + { "70%", OPTION_VAL_70_HU }, + { "80%", OPTION_VAL_80_HU }, + { "90%", OPTION_VAL_90_HU }, + { "100%", OPTION_VAL_100_O45_HU }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_hu = { + option_cats_hu, + option_defs_hu +}; + +/* RETRO_LANGUAGE_ID */ + +#define CATEGORY_SYSTEM_LABEL_ID "Sistem" +#define CATEGORY_SYSTEM_INFO_0_ID "Menyetel daerah, bahasa, BIOS, dan pengaturan peranti keras dasar." +#define CATEGORY_VIDEO_LABEL_ID NULL +#define CATEGORY_VIDEO_INFO_0_ID NULL +#define CATEGORY_PERFORMANCE_LABEL_ID "Kinerja" +#define CATEGORY_PERFORMANCE_INFO_0_ID NULL +#define CATEGORY_HACKS_LABEL_ID "Peretasan Emulasi" +#define CATEGORY_HACKS_INFO_0_ID NULL +#define CATEGORY_INPUT_LABEL_ID "Masukan" +#define CATEGORY_INPUT_INFO_0_ID NULL +#define CATEGORY_EXPANSIONS_LABEL_ID NULL +#define CATEGORY_EXPANSIONS_INFO_0_ID NULL +#define CATEGORY_VMU_LABEL_ID NULL +#define CATEGORY_VMU_INFO_0_ID NULL +#define CORE_OPTION_NAME_REGION_LABEL_ID "Daerah" +#define OPTION_VAL_JAPAN_ID "Jepang" +#define OPTION_VAL_USA_ID NULL +#define OPTION_VAL_EUROPE_ID "Eropa" +#define OPTION_VAL_DEFAULT_ID NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_ID "Bahasa" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_ID NULL +#define OPTION_VAL_JAPANESE_ID "Bahasa Jepang" +#define OPTION_VAL_ENGLISH_ID "Bahasa Inggris" +#define OPTION_VAL_GERMAN_ID "Bahasa Jerman" +#define OPTION_VAL_FRENCH_ID "Bahasa Perancis" +#define OPTION_VAL_SPANISH_ID "Bahasa Spanyol" +#define OPTION_VAL_ITALIAN_ID "Bahasa Itali" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_ID "BIOS HLE (Perlu Mulai Ulang)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID "Paksa penggunaan BIOS emulasi tingkat tinggi." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID "Nyala ke BIOS (Perlu Mulai Ulang)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ID "Boot langsung ke menu BIOS Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_ID "Aktifkan DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ID "Aktifkan emulasi DSP audio Dreamcast (pengolah sinyal digital). Perbaiki akurasi suara yang dihasilakan, tetapi tingkatkan persyaratan kinerja." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ID NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ID NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ID NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ID NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_ID NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ID "Mengemulasi adapter pita lebar eternet dan bukan modem. (Perlu Mulai Ulang)" +#define CORE_OPTION_NAME_UPNP_LABEL_ID NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_ID NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ID "Resolusi Internal" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ID "Modifikasi resolusi render." +#define OPTION_VAL_320X240_ID NULL +#define OPTION_VAL_640X480_ID "640x480 (Lokal)" +#define OPTION_VAL_800X600_ID NULL +#define OPTION_VAL_960X720_ID NULL +#define OPTION_VAL_1024X768_ID NULL +#define OPTION_VAL_1280X960_ID NULL +#define OPTION_VAL_1440X1080_ID NULL +#define OPTION_VAL_1600X1200_ID NULL +#define OPTION_VAL_1920X1440_ID NULL +#define OPTION_VAL_2560X1920_ID NULL +#define OPTION_VAL_2880X2160_ID NULL +#define OPTION_VAL_3200X2400_ID NULL +#define OPTION_VAL_3840X2880_ID NULL +#define OPTION_VAL_4480X3360_ID NULL +#define OPTION_VAL_5120X3840_ID NULL +#define OPTION_VAL_5760X4320_ID NULL +#define OPTION_VAL_6400X4800_ID NULL +#define OPTION_VAL_7040X5280_ID NULL +#define OPTION_VAL_7680X5760_ID NULL +#define OPTION_VAL_8320X6240_ID NULL +#define OPTION_VAL_8960X6720_ID NULL +#define OPTION_VAL_9600X7200_ID NULL +#define OPTION_VAL_10240X7680_ID NULL +#define OPTION_VAL_10880X8160_ID NULL +#define OPTION_VAL_11520X8640_ID NULL +#define OPTION_VAL_12160X9120_ID NULL +#define OPTION_VAL_12800X9600_ID NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_ID NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ID NULL +#define OPTION_VAL_VGA_ID NULL +#define OPTION_VAL_TV_RGB_ID NULL +#define OPTION_VAL_TV_COMPOSITE_ID NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_ID NULL +#define OPTION_VAL_NTSC_ID NULL +#define OPTION_VAL_PAL_ID NULL +#define OPTION_VAL_PAL_N_ID NULL +#define OPTION_VAL_PAL_M_ID NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID "Orientasi Layar" +#define OPTION_VAL_HORIZONTAL_ID NULL +#define OPTION_VAL_VERTICAL_ID "Vertikal" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_ID NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_ID NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_ID NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ID NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ID "Mungkin perlu nilai yang lebih besar agar resolusi yang lebih besar terlihat benar." +#define OPTION_VAL_512MB_ID NULL +#define OPTION_VAL_1GB_ID NULL +#define OPTION_VAL_2GB_ID NULL +#define OPTION_VAL_4GB_ID NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_ID NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ID NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ID NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ID NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ID "Mengaktifkan Dapar RTT (Render Ke Tekstur)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ID NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_ID NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_ID NULL +#define CORE_OPTION_NAME_FOG_LABEL_ID NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ID NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ID NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ID "Penyaringan Anisotropic" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ID "Meningkatkan mutu tekstur permukaan yang bersudut pandang serong di mata kamera. Opsi nilai tinggi lebih menguras GPU. Perubahan ini hanya berlaku setelah dimulai ulang." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ID "Penyaringan Tekstur" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ID "Pilihan mode saring tekstur. Ini dapat memaksa mode saring tekstur tertentu pada semua tekstur agar berpenampilan lebih tajam (atau mulus) dibandingkan Bawaan. Opsi nilai selain Bawaan mungkin akan muncul masalah visual. Perubahan ini hanya berlaku setelah dimulai ulang." +#define OPTION_VAL_1_ID NULL +#define OPTION_VAL_2_ID NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ID NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ID NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ID NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ID NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ID "Saring Pasca-pengolahan PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ID "Memasca-olah gambar yang di-render untuk meniru efek seperti di GPU PowerVR2 dan sinyal video analog." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_ID "Penskalaan Naik Tekstur (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ID "Meningkatkan grafis seni piksel 2D karya tangan. Hanya bisa digunakan di pemainan piksel 2D." +#define OPTION_VAL_2_O26_ID NULL +#define OPTION_VAL_4_ID NULL +#define OPTION_VAL_6_ID NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ID "Ukuran Saring Maks. Tekstur Naik Skala" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_ID NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ID NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ID NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_ID NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_ID NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ID "Perenderan Berutas" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ID "Jalankan GPU dan CPU pada Thread berbeda. Sangat direkomendasikan." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ID NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ID NULL +#define OPTION_VAL_SOME_ID NULL +#define OPTION_VAL_MORE_ID NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ID NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ID NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ID "Cheat Layar Lebar (Perlu Mulai Ulang)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ID NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ID NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ID NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ID NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ID NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_ID NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_ID NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_ID NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_ID NULL +#define OPTION_VAL_100_ID NULL +#define OPTION_VAL_110_ID NULL +#define OPTION_VAL_120_ID NULL +#define OPTION_VAL_130_ID NULL +#define OPTION_VAL_140_ID NULL +#define OPTION_VAL_150_ID NULL +#define OPTION_VAL_160_ID NULL +#define OPTION_VAL_170_ID NULL +#define OPTION_VAL_180_ID NULL +#define OPTION_VAL_190_ID NULL +#define OPTION_VAL_200_ID NULL +#define OPTION_VAL_210_ID NULL +#define OPTION_VAL_220_ID NULL +#define OPTION_VAL_230_ID NULL +#define OPTION_VAL_240_ID NULL +#define OPTION_VAL_250_ID NULL +#define OPTION_VAL_260_ID NULL +#define OPTION_VAL_270_ID NULL +#define OPTION_VAL_280_ID NULL +#define OPTION_VAL_290_ID NULL +#define OPTION_VAL_300_ID NULL +#define OPTION_VAL_310_ID NULL +#define OPTION_VAL_320_ID NULL +#define OPTION_VAL_330_ID NULL +#define OPTION_VAL_340_ID NULL +#define OPTION_VAL_350_ID NULL +#define OPTION_VAL_360_ID NULL +#define OPTION_VAL_370_ID NULL +#define OPTION_VAL_380_ID NULL +#define OPTION_VAL_390_ID NULL +#define OPTION_VAL_400_ID NULL +#define OPTION_VAL_410_ID NULL +#define OPTION_VAL_420_ID NULL +#define OPTION_VAL_430_ID NULL +#define OPTION_VAL_440_ID NULL +#define OPTION_VAL_450_ID NULL +#define OPTION_VAL_460_ID NULL +#define OPTION_VAL_470_ID NULL +#define OPTION_VAL_480_ID NULL +#define OPTION_VAL_490_ID NULL +#define OPTION_VAL_500_ID NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ID NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_ID NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ID "Dump Tekstur" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_ID NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ID NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_ID NULL +#define OPTION_VAL_0_ID NULL +#define OPTION_VAL_5_ID NULL +#define OPTION_VAL_10_ID NULL +#define OPTION_VAL_15_ID NULL +#define OPTION_VAL_20_ID NULL +#define OPTION_VAL_25_ID NULL +#define OPTION_VAL_30_ID NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ID "Pemicu Deadzone" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_ID NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ID "Pemicu Digital" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_ID NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ID NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ID NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ID NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ID NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_ID NULL +#define OPTION_VAL_50_ID NULL +#define OPTION_VAL_60_ID NULL +#define OPTION_VAL_70_ID NULL +#define OPTION_VAL_80_ID NULL +#define OPTION_VAL_90_ID NULL +#define OPTION_VAL_100_O45_ID NULL +#define OPTION_VAL_110_O45_ID NULL +#define OPTION_VAL_120_O45_ID NULL +#define OPTION_VAL_130_O45_ID NULL +#define OPTION_VAL_140_O45_ID NULL +#define OPTION_VAL_150_O45_ID NULL +#define OPTION_VAL_160_O45_ID NULL +#define OPTION_VAL_170_O45_ID NULL +#define OPTION_VAL_180_O45_ID NULL +#define OPTION_VAL_190_O45_ID NULL +#define OPTION_VAL_200_O45_ID NULL +#define OPTION_VAL_210_O45_ID NULL +#define OPTION_VAL_220_O45_ID NULL +#define OPTION_VAL_230_O45_ID NULL +#define OPTION_VAL_240_O45_ID NULL +#define OPTION_VAL_250_O45_ID NULL +#define OPTION_VAL_260_O45_ID NULL +#define OPTION_VAL_270_O45_ID NULL +#define OPTION_VAL_280_O45_ID NULL +#define OPTION_VAL_290_O45_ID NULL +#define OPTION_VAL_300_O45_ID NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ID NULL +#define OPTION_VAL_WHITE_ID "Putih" +#define OPTION_VAL_RED_ID NULL +#define OPTION_VAL_GREEN_ID NULL +#define OPTION_VAL_BLUE_ID NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ID NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ID NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_ID NULL +#define OPTION_VAL_VMU_ID NULL +#define OPTION_VAL_PURUPURU_ID NULL +#define OPTION_VAL_NONE_ID "Tak ada" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_ID NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_ID NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ID NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ID NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ID NULL +#define OPTION_VAL_VMU_A1_ID NULL +#define OPTION_VAL_ALL_VMUS_ID NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ID NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_ID NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ID NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ID NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID NULL +#define OPTION_VAL_UPPER_LEFT_ID "Kiri Atas" +#define OPTION_VAL_UPPER_RIGHT_ID "Kanan Atas" +#define OPTION_VAL_LOWER_LEFT_ID "Kiri Bawah" +#define OPTION_VAL_LOWER_RIGHT_ID "Kanan Bawah" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID NULL +#define OPTION_VAL_1X_ID NULL +#define OPTION_VAL_3X_ID NULL +#define OPTION_VAL_5X_ID NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ID NULL +#define OPTION_VAL_DEFAULT_ON_00_ID NULL +#define OPTION_VAL_DEFAULT_OFF_01_ID NULL +#define OPTION_VAL_BLACK_02_ID "Hitam" +#define OPTION_VAL_LIGHT_BLUE_04_ID NULL +#define OPTION_VAL_CYAN_06_ID NULL +#define OPTION_VAL_CYAN_BLUE_07_ID NULL +#define OPTION_VAL_LIGHT_GREEN_08_ID NULL +#define OPTION_VAL_CYAN_GREEN_09_ID NULL +#define OPTION_VAL_LIGHT_CYAN_10_ID NULL +#define OPTION_VAL_PURPLE_12_ID "Ungu" +#define OPTION_VAL_LIGHT_PURPLE_13_ID NULL +#define OPTION_VAL_YELLOW_14_ID NULL +#define OPTION_VAL_GRAY_15_ID NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_ID NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_ID NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_ID NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_ID NULL +#define OPTION_VAL_LIGHT_RED_2_20_ID NULL +#define OPTION_VAL_MAGENTA_21_ID NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_ID NULL +#define OPTION_VAL_LIGHT_ORANGE_23_ID NULL +#define OPTION_VAL_ORANGE_24_ID "Oranye" +#define OPTION_VAL_LIGHT_PURPLE_4_25_ID NULL +#define OPTION_VAL_LIGHT_YELLOW_26_ID NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_ID NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ID NULL +#define OPTION_VAL_40_ID NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ID NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ID NULL + +struct retro_core_option_v2_category option_cats_id[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_ID, + CATEGORY_SYSTEM_INFO_0_ID + }, + { + "video", + CATEGORY_VIDEO_LABEL_ID, + CATEGORY_VIDEO_INFO_0_ID + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_ID, + CATEGORY_PERFORMANCE_INFO_0_ID + }, + { + "hacks", + CATEGORY_HACKS_LABEL_ID, + CATEGORY_HACKS_INFO_0_ID + }, + { + "input", + CATEGORY_INPUT_LABEL_ID, + CATEGORY_INPUT_INFO_0_ID + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_ID, + CATEGORY_EXPANSIONS_INFO_0_ID + }, + { + "vmu", + CATEGORY_VMU_LABEL_ID, + CATEGORY_VMU_INFO_0_ID + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_id[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_ID, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_ID }, + { "USA", OPTION_VAL_USA_ID }, + { "Europe", OPTION_VAL_EUROPE_ID }, + { "Default", OPTION_VAL_DEFAULT_ID }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_ID, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_ID, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_ID }, + { "English", OPTION_VAL_ENGLISH_ID }, + { "German", OPTION_VAL_GERMAN_ID }, + { "French", OPTION_VAL_FRENCH_ID }, + { "Spanish", OPTION_VAL_SPANISH_ID }, + { "Italian", OPTION_VAL_ITALIAN_ID }, + { "Default", OPTION_VAL_DEFAULT_ID }, { NULL, NULL }, }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_ID, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_ID, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, "disabled", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_IT, + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_ID, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_IT, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_ID, NULL, "system", { @@ -40025,17 +44774,13 @@ struct retro_core_option_v2_definition option_defs_it[] = { { "enabled", NULL }, { NULL, NULL }, }, -#ifdef LOW_END "disabled", -#else - "enabled", -#endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_IT, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_ID, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_IT, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_ID, NULL, "system", { @@ -40043,13 +44788,17 @@ struct retro_core_option_v2_definition option_defs_it[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_IT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_ID, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_IT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_ID, NULL, "system", { @@ -40061,9 +44810,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_IT, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_ID, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_IT, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_ID, NULL, "system", { @@ -40075,9 +44824,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_IT, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_ID, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_IT, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_ID, NULL, "system", { @@ -40089,9 +44838,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_IT, + CORE_OPTION_NAME_UPNP_LABEL_ID, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_IT, + CORE_OPTION_NAME_UPNP_INFO_0_ID, NULL, "system", { @@ -40104,105 +44853,105 @@ struct retro_core_option_v2_definition option_defs_it[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_IT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_ID, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_IT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_ID, NULL, "video", { - { "320x240", OPTION_VAL_320X240_IT }, - { "640x480", OPTION_VAL_640X480_IT }, - { "800x600", OPTION_VAL_800X600_IT }, - { "960x720", OPTION_VAL_960X720_IT }, - { "1024x768", OPTION_VAL_1024X768_IT }, - { "1280x960", OPTION_VAL_1280X960_IT }, - { "1440x1080", OPTION_VAL_1440X1080_IT }, - { "1600x1200", OPTION_VAL_1600X1200_IT }, - { "1920x1440", OPTION_VAL_1920X1440_IT }, - { "2560x1920", OPTION_VAL_2560X1920_IT }, - { "2880x2160", OPTION_VAL_2880X2160_IT }, - { "3200x2400", OPTION_VAL_3200X2400_IT }, - { "3840x2880", OPTION_VAL_3840X2880_IT }, - { "4480x3360", OPTION_VAL_4480X3360_IT }, - { "5120x3840", OPTION_VAL_5120X3840_IT }, - { "5760x4320", OPTION_VAL_5760X4320_IT }, - { "6400x4800", OPTION_VAL_6400X4800_IT }, - { "7040x5280", OPTION_VAL_7040X5280_IT }, - { "7680x5760", OPTION_VAL_7680X5760_IT }, - { "8320x6240", OPTION_VAL_8320X6240_IT }, - { "8960x6720", OPTION_VAL_8960X6720_IT }, - { "9600x7200", OPTION_VAL_9600X7200_IT }, - { "10240x7680", OPTION_VAL_10240X7680_IT }, - { "10880x8160", OPTION_VAL_10880X8160_IT }, - { "11520x8640", OPTION_VAL_11520X8640_IT }, - { "12160x9120", OPTION_VAL_12160X9120_IT }, - { "12800x9600", OPTION_VAL_12800X9600_IT }, - { NULL, NULL }, - }, -#ifdef LOW_RES - "320x240", -#else - "640x480", -#endif - }, - { - CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_IT, + { "320x240", OPTION_VAL_320X240_ID }, + { "640x480", OPTION_VAL_640X480_ID }, + { "800x600", OPTION_VAL_800X600_ID }, + { "960x720", OPTION_VAL_960X720_ID }, + { "1024x768", OPTION_VAL_1024X768_ID }, + { "1280x960", OPTION_VAL_1280X960_ID }, + { "1440x1080", OPTION_VAL_1440X1080_ID }, + { "1600x1200", OPTION_VAL_1600X1200_ID }, + { "1920x1440", OPTION_VAL_1920X1440_ID }, + { "2560x1920", OPTION_VAL_2560X1920_ID }, + { "2880x2160", OPTION_VAL_2880X2160_ID }, + { "3200x2400", OPTION_VAL_3200X2400_ID }, + { "3840x2880", OPTION_VAL_3840X2880_ID }, + { "4480x3360", OPTION_VAL_4480X3360_ID }, + { "5120x3840", OPTION_VAL_5120X3840_ID }, + { "5760x4320", OPTION_VAL_5760X4320_ID }, + { "6400x4800", OPTION_VAL_6400X4800_ID }, + { "7040x5280", OPTION_VAL_7040X5280_ID }, + { "7680x5760", OPTION_VAL_7680X5760_ID }, + { "8320x6240", OPTION_VAL_8320X6240_ID }, + { "8960x6720", OPTION_VAL_8960X6720_ID }, + { "9600x7200", OPTION_VAL_9600X7200_ID }, + { "10240x7680", OPTION_VAL_10240X7680_ID }, + { "10880x8160", OPTION_VAL_10880X8160_ID }, + { "11520x8640", OPTION_VAL_11520X8640_ID }, + { "12160x9120", OPTION_VAL_12160X9120_ID }, + { "12800x9600", OPTION_VAL_12800X9600_ID }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_ID, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_IT, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_ID, NULL, "video", { - { "VGA", OPTION_VAL_VGA_IT }, - { "TV (RGB)", OPTION_VAL_TV_RGB_IT }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_IT }, + { "VGA", OPTION_VAL_VGA_ID }, + { "TV (RGB)", OPTION_VAL_TV_RGB_ID }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_ID }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_IT, + CORE_OPTION_NAME_BROADCAST_LABEL_ID, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_IT }, - { "PAL", OPTION_VAL_PAL_IT }, - { "PAL_N", OPTION_VAL_PAL_N_IT }, - { "PAL_M", OPTION_VAL_PAL_M_IT }, - { "Default", OPTION_VAL_DEFAULT_IT }, + { "NTSC", OPTION_VAL_NTSC_ID }, + { "PAL", OPTION_VAL_PAL_ID }, + { "PAL_N", OPTION_VAL_PAL_N_ID }, + { "PAL_M", OPTION_VAL_PAL_M_ID }, + { "Default", OPTION_VAL_DEFAULT_ID }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_IT, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_ID, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_IT }, - { "vertical", OPTION_VAL_VERTICAL_IT }, + { "horizontal", OPTION_VAL_HORIZONTAL_ID }, + { "vertical", OPTION_VAL_VERTICAL_ID }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_IT, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_ID, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_IT }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_IT }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_ID }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_ID }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_IT }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_ID }, #endif { NULL, NULL }, }, @@ -40215,25 +44964,25 @@ struct retro_core_option_v2_definition option_defs_it[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_IT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_ID, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_IT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_ID, NULL, "video", { - { "512MB", OPTION_VAL_512MB_IT }, - { "1GB", OPTION_VAL_1GB_IT }, - { "2GB", OPTION_VAL_2GB_IT }, - { "4GB", OPTION_VAL_4GB_IT }, + { "512MB", OPTION_VAL_512MB_ID }, + { "1GB", OPTION_VAL_1GB_ID }, + { "2GB", OPTION_VAL_2GB_ID }, + { "4GB", OPTION_VAL_4GB_ID }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_IT, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_ID, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_IT, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_ID, NULL, "video", { @@ -40241,6 +44990,7 @@ struct retro_core_option_v2_definition option_defs_it[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -40249,9 +44999,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_IT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_ID, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_IT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_ID, NULL, "video", { @@ -40263,9 +45013,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_IT, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_ID, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_IT, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_ID, NULL, "video", { @@ -40275,11 +45025,11 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_IT, + CORE_OPTION_NAME_MIPMAPPING_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_ID, NULL, "video", { @@ -40291,7 +45041,7 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_IT, + CORE_OPTION_NAME_FOG_LABEL_ID, NULL, "", NULL, @@ -40305,9 +45055,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_IT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_ID, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_IT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_ID, NULL, "video", { @@ -40319,9 +45069,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_IT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_ID, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_IT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_ID, NULL, "video", { @@ -40336,24 +45086,24 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_IT, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_ID, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_IT, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_ID, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_IT }, - { "1", OPTION_VAL_1_IT }, - { "2", OPTION_VAL_2_IT }, + { "0", OPTION_VAL_DEFAULT_ID }, + { "1", OPTION_VAL_1_ID }, + { "2", OPTION_VAL_2_ID }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_IT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_ID, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_IT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_ID, NULL, "video", { @@ -40361,13 +45111,13 @@ struct retro_core_option_v2_definition option_defs_it[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_IT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_ID, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_IT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_ID, NULL, "video", { @@ -40379,9 +45129,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_IT, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_ID, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_IT, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_ID, NULL, "video", { @@ -40394,25 +45144,25 @@ struct retro_core_option_v2_definition option_defs_it[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_IT, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_ID, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_IT, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_ID, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_IT }, - { "4", OPTION_VAL_4_IT }, - { "6", OPTION_VAL_6_IT }, + { "2", OPTION_VAL_2_O26_ID }, + { "4", OPTION_VAL_4_ID }, + { "6", OPTION_VAL_6_ID }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_IT, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_ID, NULL, "video", { @@ -40426,9 +45176,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_IT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_ID, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_IT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_ID, NULL, "video", { @@ -40438,11 +45188,25 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_ID, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_ID, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_IT, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_ID, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_IT, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_ID, NULL, "performance", { @@ -40454,15 +45218,15 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_IT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_ID, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_IT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_ID, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_IT }, - { "more", OPTION_VAL_MORE_IT }, + { "some", OPTION_VAL_SOME_ID }, + { "more", OPTION_VAL_MORE_ID }, { NULL, NULL }, }, #ifdef LOW_END @@ -40473,9 +45237,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_IT, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_ID, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_IT, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_ID, NULL, "performance", { @@ -40492,9 +45256,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_IT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_ID, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_IT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_ID, NULL, "hacks", { @@ -40506,9 +45270,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_IT, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_ID, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_IT, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_ID, NULL, "hacks", { @@ -40520,9 +45284,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_IT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_ID, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_IT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_ID, NULL, "hacks", { @@ -40536,64 +45300,78 @@ struct retro_core_option_v2_definition option_defs_it[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_ID, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_ID, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_IT, + CORE_OPTION_NAME_SH4CLOCK_LABEL_ID, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_IT, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_ID, NULL, "hacks", { - { "100", OPTION_VAL_100_IT }, - { "110", OPTION_VAL_110_IT }, - { "120", OPTION_VAL_120_IT }, - { "130", OPTION_VAL_130_IT }, - { "140", OPTION_VAL_140_IT }, - { "150", OPTION_VAL_150_IT }, - { "160", OPTION_VAL_160_IT }, - { "170", OPTION_VAL_170_IT }, - { "180", OPTION_VAL_180_IT }, - { "190", OPTION_VAL_190_IT }, - { "200", OPTION_VAL_200_IT }, - { "210", OPTION_VAL_210_IT }, - { "220", OPTION_VAL_220_IT }, - { "230", OPTION_VAL_230_IT }, - { "240", OPTION_VAL_240_IT }, - { "250", OPTION_VAL_250_IT }, - { "260", OPTION_VAL_260_IT }, - { "270", OPTION_VAL_270_IT }, - { "280", OPTION_VAL_280_IT }, - { "290", OPTION_VAL_290_IT }, - { "300", OPTION_VAL_300_IT }, - { "310", OPTION_VAL_310_IT }, - { "320", OPTION_VAL_320_IT }, - { "330", OPTION_VAL_330_IT }, - { "340", OPTION_VAL_340_IT }, - { "350", OPTION_VAL_350_IT }, - { "360", OPTION_VAL_360_IT }, - { "370", OPTION_VAL_370_IT }, - { "380", OPTION_VAL_380_IT }, - { "390", OPTION_VAL_390_IT }, - { "400", OPTION_VAL_400_IT }, - { "410", OPTION_VAL_410_IT }, - { "420", OPTION_VAL_420_IT }, - { "430", OPTION_VAL_430_IT }, - { "440", OPTION_VAL_440_IT }, - { "450", OPTION_VAL_450_IT }, - { "460", OPTION_VAL_460_IT }, - { "470", OPTION_VAL_470_IT }, - { "480", OPTION_VAL_480_IT }, - { "490", OPTION_VAL_490_IT }, - { "500", OPTION_VAL_500_IT }, + { "100", OPTION_VAL_100_ID }, + { "110", OPTION_VAL_110_ID }, + { "120", OPTION_VAL_120_ID }, + { "130", OPTION_VAL_130_ID }, + { "140", OPTION_VAL_140_ID }, + { "150", OPTION_VAL_150_ID }, + { "160", OPTION_VAL_160_ID }, + { "170", OPTION_VAL_170_ID }, + { "180", OPTION_VAL_180_ID }, + { "190", OPTION_VAL_190_ID }, + { "200", OPTION_VAL_200_ID }, + { "210", OPTION_VAL_210_ID }, + { "220", OPTION_VAL_220_ID }, + { "230", OPTION_VAL_230_ID }, + { "240", OPTION_VAL_240_ID }, + { "250", OPTION_VAL_250_ID }, + { "260", OPTION_VAL_260_ID }, + { "270", OPTION_VAL_270_ID }, + { "280", OPTION_VAL_280_ID }, + { "290", OPTION_VAL_290_ID }, + { "300", OPTION_VAL_300_ID }, + { "310", OPTION_VAL_310_ID }, + { "320", OPTION_VAL_320_ID }, + { "330", OPTION_VAL_330_ID }, + { "340", OPTION_VAL_340_ID }, + { "350", OPTION_VAL_350_ID }, + { "360", OPTION_VAL_360_ID }, + { "370", OPTION_VAL_370_ID }, + { "380", OPTION_VAL_380_ID }, + { "390", OPTION_VAL_390_ID }, + { "400", OPTION_VAL_400_ID }, + { "410", OPTION_VAL_410_ID }, + { "420", OPTION_VAL_420_ID }, + { "430", OPTION_VAL_430_ID }, + { "440", OPTION_VAL_440_ID }, + { "450", OPTION_VAL_450_ID }, + { "460", OPTION_VAL_460_ID }, + { "470", OPTION_VAL_470_ID }, + { "480", OPTION_VAL_480_ID }, + { "490", OPTION_VAL_490_ID }, + { "500", OPTION_VAL_500_ID }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_IT, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_ID, NULL, "hacks", { @@ -40603,11 +45381,11 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_IT, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_ID, NULL, "hacks", { @@ -40619,47 +45397,47 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_IT, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_ID, NULL, "input", { - { "0%", OPTION_VAL_0_IT }, - { "5%", OPTION_VAL_5_IT }, - { "10%", OPTION_VAL_10_IT }, - { "15%", OPTION_VAL_15_IT }, - { "20%", OPTION_VAL_20_IT }, - { "25%", OPTION_VAL_25_IT }, - { "30%", OPTION_VAL_30_IT }, + { "0%", OPTION_VAL_0_ID }, + { "5%", OPTION_VAL_5_ID }, + { "10%", OPTION_VAL_10_ID }, + { "15%", OPTION_VAL_15_ID }, + { "20%", OPTION_VAL_20_ID }, + { "25%", OPTION_VAL_25_ID }, + { "30%", OPTION_VAL_30_ID }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_IT, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_ID, NULL, "input", { - { "0%", OPTION_VAL_0_IT }, - { "5%", OPTION_VAL_5_IT }, - { "10%", OPTION_VAL_10_IT }, - { "15%", OPTION_VAL_15_IT }, - { "20%", OPTION_VAL_20_IT }, - { "25%", OPTION_VAL_25_IT }, - { "30%", OPTION_VAL_30_IT }, + { "0%", OPTION_VAL_0_ID }, + { "5%", OPTION_VAL_5_ID }, + { "10%", OPTION_VAL_10_ID }, + { "15%", OPTION_VAL_15_ID }, + { "20%", OPTION_VAL_20_ID }, + { "25%", OPTION_VAL_25_ID }, + { "30%", OPTION_VAL_30_ID }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_IT, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_ID, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_ID, NULL, "input", { @@ -40670,10 +45448,10 @@ struct retro_core_option_v2_definition option_defs_it[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_IT, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_ID, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_IT, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_ID, NULL, "input", { @@ -40681,124 +45459,268 @@ struct retro_core_option_v2_definition option_defs_it[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_IT, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_ID, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_IT, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_ID, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_IT, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_ID, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_IT, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_ID }, + { "60%", OPTION_VAL_60_ID }, + { "70%", OPTION_VAL_70_ID }, + { "80%", OPTION_VAL_80_ID }, + { "90%", OPTION_VAL_90_ID }, + { "100%", OPTION_VAL_100_O45_ID }, + { "110%", OPTION_VAL_110_O45_ID }, + { "120%", OPTION_VAL_120_O45_ID }, + { "130%", OPTION_VAL_130_O45_ID }, + { "140%", OPTION_VAL_140_O45_ID }, + { "150%", OPTION_VAL_150_O45_ID }, + { "160%", OPTION_VAL_160_O45_ID }, + { "170%", OPTION_VAL_170_O45_ID }, + { "180%", OPTION_VAL_180_O45_ID }, + { "190%", OPTION_VAL_190_O45_ID }, + { "200%", OPTION_VAL_200_O45_ID }, + { "210%", OPTION_VAL_210_O45_ID }, + { "220%", OPTION_VAL_220_O45_ID }, + { "230%", OPTION_VAL_230_O45_ID }, + { "240%", OPTION_VAL_240_O45_ID }, + { "250%", OPTION_VAL_250_O45_ID }, + { "260%", OPTION_VAL_260_O45_ID }, + { "270%", OPTION_VAL_270_O45_ID }, + { "280%", OPTION_VAL_280_O45_ID }, + { "290%", OPTION_VAL_290_O45_ID }, + { "300%", OPTION_VAL_300_O45_ID }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_IT, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_ID, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_IT }, - { "Red", OPTION_VAL_RED_IT }, - { "Green", OPTION_VAL_GREEN_IT }, - { "Blue", OPTION_VAL_BLUE_IT }, + { "White", OPTION_VAL_WHITE_ID }, + { "Red", OPTION_VAL_RED_ID }, + { "Green", OPTION_VAL_GREEN_ID }, + { "Blue", OPTION_VAL_BLUE_ID }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_IT, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_ID, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_IT }, - { "Red", OPTION_VAL_RED_IT }, - { "Green", OPTION_VAL_GREEN_IT }, - { "Blue", OPTION_VAL_BLUE_IT }, + { "White", OPTION_VAL_WHITE_ID }, + { "Red", OPTION_VAL_RED_ID }, + { "Green", OPTION_VAL_GREEN_ID }, + { "Blue", OPTION_VAL_BLUE_ID }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_IT, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_ID, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_IT }, - { "Red", OPTION_VAL_RED_IT }, - { "Green", OPTION_VAL_GREEN_IT }, - { "Blue", OPTION_VAL_BLUE_IT }, + { "White", OPTION_VAL_WHITE_ID }, + { "Red", OPTION_VAL_RED_ID }, + { "Green", OPTION_VAL_GREEN_ID }, + { "Blue", OPTION_VAL_BLUE_ID }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_IT, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_ID, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_IT }, - { "Red", OPTION_VAL_RED_IT }, - { "Green", OPTION_VAL_GREEN_IT }, - { "Blue", OPTION_VAL_BLUE_IT }, + { "White", OPTION_VAL_WHITE_ID }, + { "Red", OPTION_VAL_RED_ID }, + { "Green", OPTION_VAL_GREEN_ID }, + { "Blue", OPTION_VAL_BLUE_ID }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_ID, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_ID, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_ID }, + { "Purupuru", OPTION_VAL_PURUPURU_ID }, + { "None", OPTION_VAL_NONE_ID }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_IT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_IT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_IT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_ID, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_ID, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_ID, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_IT }, - { "All VMUs", OPTION_VAL_ALL_VMUS_IT }, + { "VMU A1", OPTION_VAL_VMU_A1_ID }, + { "All VMUs", OPTION_VAL_ALL_VMUS_ID }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_IT, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_IT, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_IT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_ID, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_ID, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_ID, NULL, "vmu", { @@ -40809,9 +45731,9 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_IT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_IT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_IT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_ID, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_ID, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_ID, NULL, "vmu", { @@ -40823,7 +45745,7 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_IT, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_ID, NULL, "", NULL, @@ -40837,144 +45759,144 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_IT, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_ID, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_IT, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_ID, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_IT }, - { "2x", OPTION_VAL_2_O27_IT }, - { "3x", OPTION_VAL_3X_IT }, - { "4x", OPTION_VAL_4_IT }, - { "5x", OPTION_VAL_5X_IT }, + { "1x", OPTION_VAL_1X_ID }, + { "2x", OPTION_VAL_2_O26_ID }, + { "3x", OPTION_VAL_3X_ID }, + { "4x", OPTION_VAL_4_ID }, + { "5x", OPTION_VAL_5X_ID }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_IT, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_ID, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_IT }, - { "20%", OPTION_VAL_20_IT }, - { "30%", OPTION_VAL_30_IT }, - { "40%", OPTION_VAL_40_IT }, - { "50%", OPTION_VAL_50_IT }, - { "60%", OPTION_VAL_60_IT }, - { "70%", OPTION_VAL_70_IT }, - { "80%", OPTION_VAL_80_IT }, - { "90%", OPTION_VAL_90_IT }, - { "100%", OPTION_VAL_100_O57_IT }, + { "10%", OPTION_VAL_10_ID }, + { "20%", OPTION_VAL_20_ID }, + { "30%", OPTION_VAL_30_ID }, + { "40%", OPTION_VAL_40_ID }, + { "50%", OPTION_VAL_50_ID }, + { "60%", OPTION_VAL_60_ID }, + { "70%", OPTION_VAL_70_ID }, + { "80%", OPTION_VAL_80_ID }, + { "90%", OPTION_VAL_90_ID }, + { "100%", OPTION_VAL_100_O45_ID }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_IT, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_ID, NULL, "", NULL, @@ -40988,144 +45910,144 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_IT, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_ID, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_IT, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_ID, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_IT }, - { "2x", OPTION_VAL_2_O27_IT }, - { "3x", OPTION_VAL_3X_IT }, - { "4x", OPTION_VAL_4_IT }, - { "5x", OPTION_VAL_5X_IT }, + { "1x", OPTION_VAL_1X_ID }, + { "2x", OPTION_VAL_2_O26_ID }, + { "3x", OPTION_VAL_3X_ID }, + { "4x", OPTION_VAL_4_ID }, + { "5x", OPTION_VAL_5X_ID }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_IT, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_ID, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_IT }, - { "20%", OPTION_VAL_20_IT }, - { "30%", OPTION_VAL_30_IT }, - { "40%", OPTION_VAL_40_IT }, - { "50%", OPTION_VAL_50_IT }, - { "60%", OPTION_VAL_60_IT }, - { "70%", OPTION_VAL_70_IT }, - { "80%", OPTION_VAL_80_IT }, - { "90%", OPTION_VAL_90_IT }, - { "100%", OPTION_VAL_100_O57_IT }, + { "10%", OPTION_VAL_10_ID }, + { "20%", OPTION_VAL_20_ID }, + { "30%", OPTION_VAL_30_ID }, + { "40%", OPTION_VAL_40_ID }, + { "50%", OPTION_VAL_50_ID }, + { "60%", OPTION_VAL_60_ID }, + { "70%", OPTION_VAL_70_ID }, + { "80%", OPTION_VAL_80_ID }, + { "90%", OPTION_VAL_90_ID }, + { "100%", OPTION_VAL_100_O45_ID }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_IT, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_ID, NULL, "", NULL, @@ -41139,144 +46061,144 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_IT, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_ID, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_IT, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_ID, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_IT }, - { "2x", OPTION_VAL_2_O27_IT }, - { "3x", OPTION_VAL_3X_IT }, - { "4x", OPTION_VAL_4_IT }, - { "5x", OPTION_VAL_5X_IT }, + { "1x", OPTION_VAL_1X_ID }, + { "2x", OPTION_VAL_2_O26_ID }, + { "3x", OPTION_VAL_3X_ID }, + { "4x", OPTION_VAL_4_ID }, + { "5x", OPTION_VAL_5X_ID }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_IT, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_ID, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_IT }, - { "20%", OPTION_VAL_20_IT }, - { "30%", OPTION_VAL_30_IT }, - { "40%", OPTION_VAL_40_IT }, - { "50%", OPTION_VAL_50_IT }, - { "60%", OPTION_VAL_60_IT }, - { "70%", OPTION_VAL_70_IT }, - { "80%", OPTION_VAL_80_IT }, - { "90%", OPTION_VAL_90_IT }, - { "100%", OPTION_VAL_100_O57_IT }, + { "10%", OPTION_VAL_10_ID }, + { "20%", OPTION_VAL_20_ID }, + { "30%", OPTION_VAL_30_ID }, + { "40%", OPTION_VAL_40_ID }, + { "50%", OPTION_VAL_50_ID }, + { "60%", OPTION_VAL_60_ID }, + { "70%", OPTION_VAL_70_ID }, + { "80%", OPTION_VAL_80_ID }, + { "90%", OPTION_VAL_90_ID }, + { "100%", OPTION_VAL_100_O45_ID }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_IT, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_ID, NULL, "", NULL, @@ -41290,505 +46212,560 @@ struct retro_core_option_v2_definition option_defs_it[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_IT, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_ID, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_ID }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_ID }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_ID }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_ID }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_IT, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_ID, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_IT }, - { "2x", OPTION_VAL_2_O27_IT }, - { "3x", OPTION_VAL_3X_IT }, - { "4x", OPTION_VAL_4_IT }, - { "5x", OPTION_VAL_5X_IT }, + { "1x", OPTION_VAL_1X_ID }, + { "2x", OPTION_VAL_2_O26_ID }, + { "3x", OPTION_VAL_3X_ID }, + { "4x", OPTION_VAL_4_ID }, + { "5x", OPTION_VAL_5X_ID }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_IT, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_ID, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, - { "BLACK 02", OPTION_VAL_BLACK_02_IT }, - { "BLUE 03", OPTION_VAL_BLUE_IT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, - { "GREEN 05", OPTION_VAL_GREEN_IT }, - { "CYAN 06", OPTION_VAL_CYAN_06_IT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, - { "RED 11", OPTION_VAL_RED_IT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, - { "GRAY 15", OPTION_VAL_GRAY_15_IT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, - { "WHITE 28", OPTION_VAL_WHITE_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_ID }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_ID }, + { "BLACK 02", OPTION_VAL_BLACK_02_ID }, + { "BLUE 03", OPTION_VAL_BLUE_ID }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_ID }, + { "GREEN 05", OPTION_VAL_GREEN_ID }, + { "CYAN 06", OPTION_VAL_CYAN_06_ID }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_ID }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_ID }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_ID }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_ID }, + { "RED 11", OPTION_VAL_RED_ID }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_ID }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_ID }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_ID }, + { "GRAY 15", OPTION_VAL_GRAY_15_ID }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_ID }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_ID }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_ID }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_ID }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_ID }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_ID }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_ID }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_ID }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_ID }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_ID }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_ID }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_ID }, + { "WHITE 28", OPTION_VAL_WHITE_ID }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_IT, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_ID, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_IT }, - { "20%", OPTION_VAL_20_IT }, - { "30%", OPTION_VAL_30_IT }, - { "40%", OPTION_VAL_40_IT }, - { "50%", OPTION_VAL_50_IT }, - { "60%", OPTION_VAL_60_IT }, - { "70%", OPTION_VAL_70_IT }, - { "80%", OPTION_VAL_80_IT }, - { "90%", OPTION_VAL_90_IT }, - { "100%", OPTION_VAL_100_O57_IT }, + { "10%", OPTION_VAL_10_ID }, + { "20%", OPTION_VAL_20_ID }, + { "30%", OPTION_VAL_30_ID }, + { "40%", OPTION_VAL_40_ID }, + { "50%", OPTION_VAL_50_ID }, + { "60%", OPTION_VAL_60_ID }, + { "70%", OPTION_VAL_70_ID }, + { "80%", OPTION_VAL_80_ID }, + { "90%", OPTION_VAL_90_ID }, + { "100%", OPTION_VAL_100_O45_ID }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_it = { - option_cats_it, - option_defs_it +struct retro_core_options_v2 options_id = { + option_cats_id, + option_defs_id }; -/* RETRO_LANGUAGE_JA */ +/* RETRO_LANGUAGE_IT */ -#define CATEGORY_SYSTEM_LABEL_JA "システム" -#define CATEGORY_SYSTEM_INFO_0_JA NULL -#define CATEGORY_VIDEO_LABEL_JA "ビデオのドライバ" -#define CATEGORY_VIDEO_INFO_0_JA NULL -#define CATEGORY_PERFORMANCE_LABEL_JA "パフォーマンス" -#define CATEGORY_PERFORMANCE_INFO_0_JA NULL -#define CATEGORY_HACKS_LABEL_JA "エミュレーションハック" -#define CATEGORY_HACKS_INFO_0_JA NULL -#define CATEGORY_INPUT_LABEL_JA "入力" -#define CATEGORY_INPUT_INFO_0_JA NULL -#define CATEGORY_VMU_LABEL_JA NULL -#define CATEGORY_VMU_INFO_0_JA NULL -#define CORE_OPTION_NAME_REGION_LABEL_JA "地域" -#define OPTION_VAL_JAPAN_JA NULL -#define OPTION_VAL_USA_JA NULL -#define OPTION_VAL_EUROPE_JA NULL -#define OPTION_VAL_DEFAULT_JA "デフォルト" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_JA "言語" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_JA NULL -#define OPTION_VAL_JAPANESE_JA "Japanese - 日本語" -#define OPTION_VAL_ENGLISH_JA "英語" -#define OPTION_VAL_GERMAN_JA "German - ドイツ語" -#define OPTION_VAL_FRENCH_JA "French - フランス語" -#define OPTION_VAL_SPANISH_JA "Spanish - スペイン語" -#define OPTION_VAL_ITALIAN_JA "Italian - イタリア語" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_JA NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_JA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_JA NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_JA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_JA NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_JA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_JA NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_JA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_JA NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_JA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_JA NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_JA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_JA NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_JA NULL -#define CORE_OPTION_NAME_UPNP_LABEL_JA NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_JA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_JA NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_JA NULL -#define OPTION_VAL_320X240_JA NULL -#define OPTION_VAL_640X480_JA NULL -#define OPTION_VAL_800X600_JA NULL -#define OPTION_VAL_960X720_JA NULL -#define OPTION_VAL_1024X768_JA NULL -#define OPTION_VAL_1280X960_JA NULL -#define OPTION_VAL_1440X1080_JA NULL -#define OPTION_VAL_1600X1200_JA NULL -#define OPTION_VAL_1920X1440_JA NULL -#define OPTION_VAL_2560X1920_JA NULL -#define OPTION_VAL_2880X2160_JA NULL -#define OPTION_VAL_3200X2400_JA NULL -#define OPTION_VAL_3840X2880_JA NULL -#define OPTION_VAL_4480X3360_JA NULL -#define OPTION_VAL_5120X3840_JA NULL -#define OPTION_VAL_5760X4320_JA NULL -#define OPTION_VAL_6400X4800_JA NULL -#define OPTION_VAL_7040X5280_JA NULL -#define OPTION_VAL_7680X5760_JA NULL -#define OPTION_VAL_8320X6240_JA NULL -#define OPTION_VAL_8960X6720_JA NULL -#define OPTION_VAL_9600X7200_JA NULL -#define OPTION_VAL_10240X7680_JA NULL -#define OPTION_VAL_10880X8160_JA NULL -#define OPTION_VAL_11520X8640_JA NULL -#define OPTION_VAL_12160X9120_JA NULL -#define OPTION_VAL_12800X9600_JA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_JA NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_JA NULL -#define OPTION_VAL_VGA_JA NULL -#define OPTION_VAL_TV_RGB_JA NULL -#define OPTION_VAL_TV_COMPOSITE_JA NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_JA NULL -#define OPTION_VAL_NTSC_JA NULL -#define OPTION_VAL_PAL_JA NULL -#define OPTION_VAL_PAL_N_JA NULL -#define OPTION_VAL_PAL_M_JA NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_JA "スクリーンの回転" -#define OPTION_VAL_HORIZONTAL_JA NULL -#define OPTION_VAL_VERTICAL_JA NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_JA NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_JA NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_JA NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_JA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_JA NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_JA NULL -#define OPTION_VAL_512MB_JA NULL -#define OPTION_VAL_1GB_JA NULL -#define OPTION_VAL_2GB_JA NULL -#define OPTION_VAL_4GB_JA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_JA NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_JA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_JA NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_JA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_JA NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_JA NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_JA NULL -#define CORE_OPTION_NAME_FOG_LABEL_JA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_JA NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_JA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_JA NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_JA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_JA NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_JA NULL -#define OPTION_VAL_1_JA NULL -#define OPTION_VAL_2_JA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_JA NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_JA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_JA NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_JA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_JA NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_JA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_JA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_JA NULL -#define OPTION_VAL_2_O27_JA NULL -#define OPTION_VAL_4_JA NULL -#define OPTION_VAL_6_JA NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_JA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_JA NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_JA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_JA NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_JA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_JA NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_JA NULL -#define OPTION_VAL_SOME_JA "普通" -#define OPTION_VAL_MORE_JA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_JA NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_JA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_JA NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_JA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_JA NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_JA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_JA NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_JA NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_JA NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_JA NULL -#define OPTION_VAL_100_JA NULL -#define OPTION_VAL_110_JA NULL -#define OPTION_VAL_120_JA NULL -#define OPTION_VAL_130_JA NULL -#define OPTION_VAL_140_JA NULL -#define OPTION_VAL_150_JA NULL -#define OPTION_VAL_160_JA NULL -#define OPTION_VAL_170_JA NULL -#define OPTION_VAL_180_JA NULL -#define OPTION_VAL_190_JA NULL -#define OPTION_VAL_200_JA NULL -#define OPTION_VAL_210_JA NULL -#define OPTION_VAL_220_JA NULL -#define OPTION_VAL_230_JA NULL -#define OPTION_VAL_240_JA NULL -#define OPTION_VAL_250_JA NULL -#define OPTION_VAL_260_JA NULL -#define OPTION_VAL_270_JA NULL -#define OPTION_VAL_280_JA NULL -#define OPTION_VAL_290_JA NULL -#define OPTION_VAL_300_JA NULL -#define OPTION_VAL_310_JA NULL -#define OPTION_VAL_320_JA NULL -#define OPTION_VAL_330_JA NULL -#define OPTION_VAL_340_JA NULL -#define OPTION_VAL_350_JA NULL -#define OPTION_VAL_360_JA NULL -#define OPTION_VAL_370_JA NULL -#define OPTION_VAL_380_JA NULL -#define OPTION_VAL_390_JA NULL -#define OPTION_VAL_400_JA NULL -#define OPTION_VAL_410_JA NULL -#define OPTION_VAL_420_JA NULL -#define OPTION_VAL_430_JA NULL -#define OPTION_VAL_440_JA NULL -#define OPTION_VAL_450_JA NULL -#define OPTION_VAL_460_JA NULL -#define OPTION_VAL_470_JA NULL -#define OPTION_VAL_480_JA NULL -#define OPTION_VAL_490_JA NULL -#define OPTION_VAL_500_JA NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_JA NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_JA NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_JA NULL -#define OPTION_VAL_0_JA NULL -#define OPTION_VAL_5_JA NULL -#define OPTION_VAL_10_JA NULL -#define OPTION_VAL_15_JA NULL -#define OPTION_VAL_20_JA NULL -#define OPTION_VAL_25_JA NULL -#define OPTION_VAL_30_JA NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_JA NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_JA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_JA NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_JA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_JA NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_JA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_JA NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_JA NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_JA NULL -#define OPTION_VAL_WHITE_JA NULL -#define OPTION_VAL_RED_JA "レッド" -#define OPTION_VAL_GREEN_JA "グリーン" -#define OPTION_VAL_BLUE_JA "ブルー" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_JA NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_JA NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_JA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_JA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_JA NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_JA NULL -#define OPTION_VAL_VMU_A1_JA NULL -#define OPTION_VAL_ALL_VMUS_JA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_JA NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_JA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_JA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_JA NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_JA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_JA NULL -#define OPTION_VAL_UPPER_LEFT_JA NULL -#define OPTION_VAL_UPPER_RIGHT_JA NULL -#define OPTION_VAL_LOWER_LEFT_JA NULL -#define OPTION_VAL_LOWER_RIGHT_JA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_JA NULL -#define OPTION_VAL_1X_JA NULL -#define OPTION_VAL_3X_JA NULL -#define OPTION_VAL_5X_JA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_JA NULL -#define OPTION_VAL_DEFAULT_ON_00_JA NULL -#define OPTION_VAL_DEFAULT_OFF_01_JA NULL -#define OPTION_VAL_BLACK_02_JA NULL -#define OPTION_VAL_LIGHT_BLUE_04_JA NULL -#define OPTION_VAL_CYAN_06_JA NULL -#define OPTION_VAL_CYAN_BLUE_07_JA NULL -#define OPTION_VAL_LIGHT_GREEN_08_JA NULL -#define OPTION_VAL_CYAN_GREEN_09_JA NULL -#define OPTION_VAL_LIGHT_CYAN_10_JA NULL -#define OPTION_VAL_PURPLE_12_JA NULL -#define OPTION_VAL_LIGHT_PURPLE_13_JA NULL -#define OPTION_VAL_YELLOW_14_JA "イエロー" -#define OPTION_VAL_GRAY_15_JA NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_JA NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_JA NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_JA NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_JA NULL -#define OPTION_VAL_LIGHT_RED_2_20_JA NULL -#define OPTION_VAL_MAGENTA_21_JA NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_JA NULL -#define OPTION_VAL_LIGHT_ORANGE_23_JA NULL -#define OPTION_VAL_ORANGE_24_JA NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_JA NULL -#define OPTION_VAL_LIGHT_YELLOW_26_JA NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_JA NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_JA NULL -#define OPTION_VAL_40_JA NULL -#define OPTION_VAL_50_JA NULL -#define OPTION_VAL_60_JA NULL -#define OPTION_VAL_70_JA NULL -#define OPTION_VAL_80_JA NULL -#define OPTION_VAL_90_JA NULL -#define OPTION_VAL_100_O57_JA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_JA NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_JA NULL +#define CATEGORY_SYSTEM_LABEL_IT "Sistema" +#define CATEGORY_SYSTEM_INFO_0_IT "Configurare la regione, la lingua, il BIOS e le impostazioni hardware di base." +#define CATEGORY_VIDEO_LABEL_IT NULL +#define CATEGORY_VIDEO_INFO_0_IT "Configurare la risoluzione, la trasparenza indipendente dall'ordine e le impostazioni degli effetti visivi." +#define CATEGORY_PERFORMANCE_LABEL_IT "Prestazioni" +#define CATEGORY_PERFORMANCE_INFO_0_IT "Configurare il rendering filettato e le impostazioni del salto di fotogramma." +#define CATEGORY_HACKS_LABEL_IT "Hack di Emulazione" +#define CATEGORY_HACKS_INFO_0_IT "Configura override widescreen, velocità di caricamento GD-ROM e impostazioni di sostituzione texture." +#define CATEGORY_INPUT_LABEL_IT NULL +#define CATEGORY_INPUT_INFO_0_IT "Configura impostazioni gamepad e pistola ottica." +#define CATEGORY_EXPANSIONS_LABEL_IT "Slot Di Espansione Controller" +#define CATEGORY_EXPANSIONS_INFO_0_IT "Selezionare il dispositivo (VMU, dispositivo rumble) collegato in ogni slot di espansione del regolatore." +#define CATEGORY_VMU_LABEL_IT "Unità Memoria Visiva" +#define CATEGORY_VMU_INFO_0_IT "Configura i file VMU per gioco e le impostazioni di visibilità VMU sullo schermo." +#define CORE_OPTION_NAME_REGION_LABEL_IT "Regione" +#define OPTION_VAL_JAPAN_IT "Giappone" +#define OPTION_VAL_USA_IT NULL +#define OPTION_VAL_EUROPE_IT "Europa" +#define OPTION_VAL_DEFAULT_IT "Predefinito" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_IT "Lingua" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_IT "Cambia la lingua usata dal BIOS e da qualsiasi gioco che contenga più lingue." +#define OPTION_VAL_JAPANESE_IT "Giapponese" +#define OPTION_VAL_ENGLISH_IT "Inglese" +#define OPTION_VAL_GERMAN_IT "Tedesco" +#define OPTION_VAL_FRENCH_IT "Francese" +#define OPTION_VAL_SPANISH_IT "Spagnolo" +#define OPTION_VAL_ITALIAN_IT "Italiano" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_IT "HLE BIOS (Riavvio Richiesto)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_IT "Forza l'uso di BIOS di emulazione di alto livello." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_IT "Avvio in BIOS (Riavvio richiesto)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_IT "Avviare direttamente nel menu BIOS Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_IT "Abilita DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_IT "Abilita l'emulazione del DSP audio di Dreamcast (processore di segnale digitale). Migliora l'accuratezza del suono generato, ma aumenta i requisiti di prestazioni." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_IT "Consenti I Pulsanti del Servizio Arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_IT "Abilita il pulsante SERVICE per i giochi arcade, per inserire le impostazioni del cabinato." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_IT "Imposta giochi NAOMI a Free Play" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_IT "Modificare le impostazioni del gioco per free play." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_IT "Emulazione Adattatore A banda larga" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_IT "Emulare l'adattatore a banda larga ethernet invece del modem. (Riavvio richiesto)" +#define CORE_OPTION_NAME_UPNP_LABEL_IT "Abilita UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_IT "Usa UPnP per configurare automaticamente il router Internet per i giochi online." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_IT "Risoluzione Interna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_IT "Modificare la risoluzione di rendering." +#define OPTION_VAL_320X240_IT "320x240 (Metà)" +#define OPTION_VAL_640X480_IT "640x480 (Nativo)" +#define OPTION_VAL_800X600_IT NULL +#define OPTION_VAL_960X720_IT NULL +#define OPTION_VAL_1024X768_IT NULL +#define OPTION_VAL_1280X960_IT NULL +#define OPTION_VAL_1440X1080_IT "1440x1080 (x2,25)" +#define OPTION_VAL_1600X1200_IT "1600x1200 (x2,5)" +#define OPTION_VAL_1920X1440_IT NULL +#define OPTION_VAL_2560X1920_IT NULL +#define OPTION_VAL_2880X2160_IT "2880x2160 (x4,5)" +#define OPTION_VAL_3200X2400_IT NULL +#define OPTION_VAL_3840X2880_IT NULL +#define OPTION_VAL_4480X3360_IT NULL +#define OPTION_VAL_5120X3840_IT NULL +#define OPTION_VAL_5760X4320_IT NULL +#define OPTION_VAL_6400X4800_IT NULL +#define OPTION_VAL_7040X5280_IT NULL +#define OPTION_VAL_7680X5760_IT NULL +#define OPTION_VAL_8320X6240_IT NULL +#define OPTION_VAL_8960X6720_IT NULL +#define OPTION_VAL_9600X7200_IT NULL +#define OPTION_VAL_10240X7680_IT NULL +#define OPTION_VAL_10880X8160_IT NULL +#define OPTION_VAL_11520X8640_IT NULL +#define OPTION_VAL_12160X9120_IT NULL +#define OPTION_VAL_12800X9600_IT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_IT "Tipo Di Cavo" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_IT "Il tipo di segnale di uscita. 'TV (Composito)' è il più ampiamente supportato." +#define OPTION_VAL_VGA_IT NULL +#define OPTION_VAL_TV_RGB_IT NULL +#define OPTION_VAL_TV_COMPOSITE_IT "TV (Composto)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_IT "Standard di trasmissione" +#define OPTION_VAL_NTSC_IT NULL +#define OPTION_VAL_PAL_IT "PAL (Mondo)" +#define OPTION_VAL_PAL_N_IT NULL +#define OPTION_VAL_PAL_M_IT "PAL-M (Brasile)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_IT "Orientamento Schermo" +#define OPTION_VAL_HORIZONTAL_IT "Orizzontale" +#define OPTION_VAL_VERTICAL_IT "Verticale" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_IT "Ordinamento Alfa" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_IT "Seleziona come vengono ordinati i poligoni trasparenti." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_IT "Per-Strip (veloce, meno preciso)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_IT "Per-Triangolo (normale)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_IT "Per-Pixel (preciso, ma più lento)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_IT "Dimensione di accumulo del Buffer Pixel" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_IT "Potrebbero essere necessari valori più alti per ottenere risoluzioni più elevate in uscita correttamente." +#define OPTION_VAL_512MB_IT NULL +#define OPTION_VAL_1GB_IT NULL +#define OPTION_VAL_2GB_IT NULL +#define OPTION_VAL_4GB_IT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_IT "Strati trasparenti massimi" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_IT "Potrebbero essere necessari valori più elevati per scene complesse." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_IT "Emulazione framebuffer completa" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_IT "Abilita l'emulazione completa del framebuffer in VRAM. Ciò è utile per i giochi che leggono o scrivono direttamente il framebuffer in VRAM. Se abilitata, la risoluzione interna è costretta a 640x480 e le prestazioni possono essere gravemente colpite." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_IT "Abilita Buffer RTT (Render To Texture)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_IT "Copia le texture renderizzate dalla GPU a VRAM. Questa opzione è normalmente abilitata per i giochi che lo richiedono. Se abilitata, il rendering delle texture è disabilitato e le prestazioni potrebbero essere influenzate." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_IT NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_IT "Quando abilitato le texture useranno la versione più piccola di se stesse quando appaiono più lontane, può aumentare le prestazioni e ridurre lo shimmering." +#define CORE_OPTION_NAME_FOG_LABEL_IT "Effetti Nebbia" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_IT "Modificatore del Volume" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_IT "Una funzionalità della GPU Dreamcast che viene tipicamente utilizzata dai giochi per disegnare ombre degli oggetti. Questo dovrebbe normalmente essere abilitato - l'impatto delle prestazioni di solito è minimo o trascurabile." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_IT "Filtro Anisotropico" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_IT "Migliorare la qualità delle texture su superfici che sono ad angoli obliqui rispetto alla fotocamera. Valori più alti sono più impegnativi per la GPU. Le modifiche a questa impostazione si applicano solo dopo il riavvio." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_IT "Filtro Texture" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_IT "La modalità di filtraggio delle texture da usare. Questo può essere usato per forzare una certa modalità di filtraggio delle texture su tutte le texture per ottenere un aspetto più nitido (o più liscio) di quello predefinito. Valori diversi da quelli predefiniti possono causare vari problemi di rendering. Le modifiche a questa impostazione si applicano solo dopo il riavvio." +#define OPTION_VAL_1_IT "Forza il Vicino più Vicino" +#define OPTION_VAL_2_IT "Forza Lineare" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_IT "Ritardo Scambio fotogrammi" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_IT "Utile per evitare di lampeggiare schermi o video glitchati. Sconsigliato su piattaforme lente." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_IT "Rileva Modifiche Frame Rate" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_IT "Notificare il frontend quando il frame rate interno cambia (ad esempio da 60 fps a 30 fps). Migliora il ritmo dei fotogrammi nei giochi che girano a un bloccato 30 fps o 20 fps, ma dovrebbe essere disabilitato per i giochi con frame rate sbloccati (instabili) (e.. Ecco il delfino, torneo irreale). Nota: non disponibile quando 'Auto Salta Frame' è abilitato." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_IT "Filtro Di Post-Elaborazione PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_IT "Post-elaborare l'immagine renderizzata per simulare effetti specifici alla GPU PowerVR2 e segnali video analogici." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_IT "Miglioramento Della Texture (xbrz)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_IT "Migliora la grafica grafica grafica a pixel 2D disegnata a mano. Dovrebbe essere usata solo con giochi in pixel 2D." +#define OPTION_VAL_2_O26_IT NULL +#define OPTION_VAL_4_IT NULL +#define OPTION_VAL_6_IT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_IT "Miglioramento Texture Dimensione Massima Filtrata" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_IT "Seleziona un valore di dimensione massima per una texture da aggiornare, se la dimensione della texture è superiore al valore selezionato, allora non verrà modificata." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_IT "Interpolazione Di Profondità Nativa" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_IT "Aiuta con la corruzione della texture e problemi di profondità sulle GPU AMD. Può anche aiutare le GPU Intel in alcuni casi." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_IT "Correzione Upscale Bleeding Edge" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_IT "Aiuta con il caso di sanguinamento della texture durante l'upscaling. Disabilitarlo può aiutare se i pixel sono deformazioni durante l'upscaling in giochi 2D (MVC2, CVS, KOF, ecc.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_IT "Rendering Filettato" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_IT "Esegue la GPU e la CPU su diversi thread. Altamente raccomandato." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_IT "Auto Salto Fotogrammi" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_IT "Salta automaticamente i fotogrammi quando l'emulatore è lento. Nota: questa impostazione si applica solo quando il Rendering Threaded è abilitato." +#define OPTION_VAL_SOME_IT "Normale" +#define OPTION_VAL_MORE_IT "Massimo" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_IT "Salto fotogrammi" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_IT "Imposta il numero di fotogrammi da saltare tra ogni fotogramma visualizzato." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_IT "Trucchi Widescreen (Riavvio Richiesto)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_IT "Attiva i trucchi che permettono ad alcuni giochi di visualizzare in formato widescreen." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_IT "Hack Widescreen" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_IT "Disegnare la geometria al di fuori del normale rapporto di aspetto 4:3. Può produrre difetti grafici nelle aree rivelate." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_IT "Caricamento Veloce GD-ROM (inaccurato)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_IT "Accelera il caricamento di GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_IT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_IT "Abilita 32MB RAM Mod per Dreamcast. Può influire sulla compatibilità" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_IT "CPU SH4 sotto/overclock" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_IT "Cambia l'orologio principale della CPU SH4 da 200 MHz predefinito. Underclocking può aiutare le piattaforme lente. L'overclocking può aumentare il frame rate per alcuni giochi. Usare con cautela." +#define OPTION_VAL_100_IT NULL +#define OPTION_VAL_110_IT NULL +#define OPTION_VAL_120_IT NULL +#define OPTION_VAL_130_IT NULL +#define OPTION_VAL_140_IT NULL +#define OPTION_VAL_150_IT NULL +#define OPTION_VAL_160_IT NULL +#define OPTION_VAL_170_IT NULL +#define OPTION_VAL_180_IT NULL +#define OPTION_VAL_190_IT NULL +#define OPTION_VAL_200_IT NULL +#define OPTION_VAL_210_IT NULL +#define OPTION_VAL_220_IT NULL +#define OPTION_VAL_230_IT NULL +#define OPTION_VAL_240_IT NULL +#define OPTION_VAL_250_IT NULL +#define OPTION_VAL_260_IT NULL +#define OPTION_VAL_270_IT NULL +#define OPTION_VAL_280_IT NULL +#define OPTION_VAL_290_IT NULL +#define OPTION_VAL_300_IT NULL +#define OPTION_VAL_310_IT NULL +#define OPTION_VAL_320_IT NULL +#define OPTION_VAL_330_IT NULL +#define OPTION_VAL_340_IT NULL +#define OPTION_VAL_350_IT NULL +#define OPTION_VAL_360_IT NULL +#define OPTION_VAL_370_IT NULL +#define OPTION_VAL_380_IT NULL +#define OPTION_VAL_390_IT NULL +#define OPTION_VAL_400_IT NULL +#define OPTION_VAL_410_IT NULL +#define OPTION_VAL_420_IT NULL +#define OPTION_VAL_430_IT NULL +#define OPTION_VAL_440_IT NULL +#define OPTION_VAL_450_IT NULL +#define OPTION_VAL_460_IT NULL +#define OPTION_VAL_470_IT NULL +#define OPTION_VAL_480_IT NULL +#define OPTION_VAL_490_IT NULL +#define OPTION_VAL_500_IT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_IT "Carica Texture Personalizzate" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_IT "Carica texture personalizzate nella cartella 'system/dc/textures//'." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_IT "Scarica Texture" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_IT "Ogni volta che un nuovo texture viene utilizzato dal gioco, verrà salvato come file .png nella cartella 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_IT "Zona morta dello sticl analogico" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_IT "Seleziona fino a che punto devi spingere la levetta analogica prima che inizi ad essere elaborata." +#define OPTION_VAL_0_IT NULL +#define OPTION_VAL_5_IT NULL +#define OPTION_VAL_10_IT NULL +#define OPTION_VAL_15_IT NULL +#define OPTION_VAL_20_IT NULL +#define OPTION_VAL_25_IT NULL +#define OPTION_VAL_30_IT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_IT "Zona morta dei trigger" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_IT "Selezionare quanto è necessario premere il tasto prima di iniziare l'elaborazione." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_IT "Trigger Digitali" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_IT "Quando abilitato, i tasti agiranno come pulsanti regolari, il che significa che saranno elaborati come o completamente premuto o non premuto affatto, senza alcun in-tra." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_IT "Uscite di trasmissione digitale" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_IT "Trasmissione di uscite digitali e stato di forza-feedback sulla porta TCP 8000. Compatibile con l'opzione MAME \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_IT "Mostra Impostazioni Pistola Ottica" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_IT "Abilita la configurazione delle opzioni di visualizzazione di una pistola leggera. NOTA: potrebbe essere necessario attivare il menu rapido perché questa impostazione abbia effetto." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_IT "Scala Dimensione del Mirino della Lightgun" +#define OPTION_VAL_50_IT NULL +#define OPTION_VAL_60_IT NULL +#define OPTION_VAL_70_IT NULL +#define OPTION_VAL_80_IT NULL +#define OPTION_VAL_90_IT NULL +#define OPTION_VAL_100_O45_IT NULL +#define OPTION_VAL_110_O45_IT NULL +#define OPTION_VAL_120_O45_IT NULL +#define OPTION_VAL_130_O45_IT NULL +#define OPTION_VAL_140_O45_IT NULL +#define OPTION_VAL_150_O45_IT NULL +#define OPTION_VAL_160_O45_IT NULL +#define OPTION_VAL_170_O45_IT NULL +#define OPTION_VAL_180_O45_IT NULL +#define OPTION_VAL_190_O45_IT NULL +#define OPTION_VAL_200_O45_IT NULL +#define OPTION_VAL_210_O45_IT NULL +#define OPTION_VAL_220_O45_IT NULL +#define OPTION_VAL_230_O45_IT NULL +#define OPTION_VAL_240_O45_IT NULL +#define OPTION_VAL_250_O45_IT NULL +#define OPTION_VAL_260_O45_IT NULL +#define OPTION_VAL_270_O45_IT NULL +#define OPTION_VAL_280_O45_IT NULL +#define OPTION_VAL_290_O45_IT NULL +#define OPTION_VAL_300_O45_IT NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 1" +#define OPTION_VAL_WHITE_IT "Bianco" +#define OPTION_VAL_RED_IT "Rosso" +#define OPTION_VAL_GREEN_IT "Verde" +#define OPTION_VAL_BLUE_IT "Blu" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_IT "Mostra mirino della Pistola 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_IT "Dispositivo nello slot di espansione A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione A1 (porta A slot 1)." +#define OPTION_VAL_VMU_IT NULL +#define OPTION_VAL_PURUPURU_IT NULL +#define OPTION_VAL_NONE_IT "Nessuno" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_IT "Dispositivo nello slot di espansione A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione A2 (porta A slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_IT "Dispositivo nello slot di espansione B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione B1 (porta B slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_IT "Dispositivo nello slot di espansione B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione B2 (porta B slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_IT "Dispositivo nello slot di espansione C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione C1 (porta C slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_IT "Dispositivo nello slot di espansione C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione C2 (porta C slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_IT "Dispositivo nello slot di espansione D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione D1 (porta D slot 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_IT "Dispositivo nello slot di espansione D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_IT "Selezionare il dispositivo collegato allo slot di espansione D2 (porta D slot 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_IT "Visual Memory Units/Sistemi per Gioco (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_IT "VMU per gioco" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_IT "Se disabilitato, tutti i giochi condividono fino a 8 file VMU di salvataggio (A1/A2/B1/B2/C1/C2/D1/D2) situati nella cartella di sistema di RetroArch.\nL'impostazione 'VMU A1' crea un file VMU 'A1' unico nella cartella di salvataggio di RetroArch, per ogni gioco che viene lanciato.\nL'impostazione 'All VMUs' crea fino a 8 file VMU unici (A1/A2/B1/B2/C1/C2/D1/D2) per ogni gioco che viene lanciato." +#define OPTION_VAL_VMU_A1_IT NULL +#define OPTION_VAL_ALL_VMUS_IT "Tutte Le VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_IT "Suoni Delle Unità Di Memoria Visiva/Sistemi (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_IT "Suoni VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_IT "Se abilitato, vengono riprodotti i segnali acustici VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_IT "Mostra Le Impostazioni Di Visualizzazione della Visual Memory Unit/System (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_IT "Mostra Impostazioni Di Visualizzazione VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_IT "Abilita la configurazione dello schermo LCD VMU emulato, la dimensione, la posizione e il colore. NOTA: potrebbe essere necessario attivare il menu rapido affinché questa impostazione abbia effetto." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_IT "Posizione VMU Schermo 1" +#define OPTION_VAL_UPPER_LEFT_IT "In Alto a Sinistra" +#define OPTION_VAL_UPPER_RIGHT_IT "In Alto a Destra" +#define OPTION_VAL_LOWER_LEFT_IT "In Basso a Sinistra" +#define OPTION_VAL_LOWER_RIGHT_IT "In Basso a Destra" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_IT "Dimensione VMU Schermo 1" +#define OPTION_VAL_1X_IT NULL +#define OPTION_VAL_3X_IT NULL +#define OPTION_VAL_5X_IT NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_IT "Schermo VMU 1 Pixel Su Colore" +#define OPTION_VAL_DEFAULT_ON_00_IT "Predefinito ON" +#define OPTION_VAL_DEFAULT_OFF_01_IT "Predefinito OFF" +#define OPTION_VAL_BLACK_02_IT "Nero" +#define OPTION_VAL_LIGHT_BLUE_04_IT "Azzurro" +#define OPTION_VAL_CYAN_06_IT "Ciano" +#define OPTION_VAL_CYAN_BLUE_07_IT "Blu Ciano" +#define OPTION_VAL_LIGHT_GREEN_08_IT "Verde Chiaro" +#define OPTION_VAL_CYAN_GREEN_09_IT "Verde Ciano" +#define OPTION_VAL_LIGHT_CYAN_10_IT "Ciano Chiaro" +#define OPTION_VAL_PURPLE_12_IT "Viola" +#define OPTION_VAL_LIGHT_PURPLE_13_IT "Viola Chiaro" +#define OPTION_VAL_YELLOW_14_IT "Giallo" +#define OPTION_VAL_GRAY_15_IT "Grigio" +#define OPTION_VAL_LIGHT_PURPLE_2_16_IT "Viola Chiaro (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_IT "Verde Chiaro (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_IT "Verde Chiaro (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_IT "Ciano Chiaro (2)" +#define OPTION_VAL_LIGHT_RED_2_20_IT "Rosso Chiaro (2)" +#define OPTION_VAL_MAGENTA_21_IT NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_IT "Viola Chiaro (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_IT "Arancione Chiaro" +#define OPTION_VAL_ORANGE_24_IT "Arancione" +#define OPTION_VAL_LIGHT_PURPLE_4_25_IT "Viola Chiaro (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_IT "Giallo Chiaro" +#define OPTION_VAL_LIGHT_YELLOW_2_27_IT "Giallo Chiaro (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_IT "Colore Vmu Schermo 1 Pixel Off" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_IT "Opacità VMU Screen 1" +#define OPTION_VAL_40_IT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_IT "Posizione VMU Schermo 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_IT "Dimensione VMU Schermo 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_IT "Colore VMU Schermo 2 Pixel On" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_IT "Colore VMU Schermo 2 Pixel Off" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_IT "Opacità VMU Schermo 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo 3 VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_IT "Posizione Schermo 3 VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_IT "Dimensione Schermo 3 VMU" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_IT "Colore su Pixel Schermo VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_IT "Colore Pixel Off Schermo VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_IT "Opacità Schermo VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_IT "Visualizzazione Schermo VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_IT "Posizione Schermo VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_IT "Dimensione Schermo VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_IT "Colore Pixel On Schermo VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_IT "Colore Pixel Off Schermo VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_IT "Opacità Schermo VMU 4" -struct retro_core_option_v2_category option_cats_ja[] = { +struct retro_core_option_v2_category option_cats_it[] = { { "system", - CATEGORY_SYSTEM_LABEL_JA, - CATEGORY_SYSTEM_INFO_0_JA + CATEGORY_SYSTEM_LABEL_IT, + CATEGORY_SYSTEM_INFO_0_IT }, { "video", - CATEGORY_VIDEO_LABEL_JA, - CATEGORY_VIDEO_INFO_0_JA + CATEGORY_VIDEO_LABEL_IT, + CATEGORY_VIDEO_INFO_0_IT }, { "performance", - CATEGORY_PERFORMANCE_LABEL_JA, - CATEGORY_PERFORMANCE_INFO_0_JA + CATEGORY_PERFORMANCE_LABEL_IT, + CATEGORY_PERFORMANCE_INFO_0_IT }, { "hacks", - CATEGORY_HACKS_LABEL_JA, - CATEGORY_HACKS_INFO_0_JA + CATEGORY_HACKS_LABEL_IT, + CATEGORY_HACKS_INFO_0_IT }, { "input", - CATEGORY_INPUT_LABEL_JA, - CATEGORY_INPUT_INFO_0_JA + CATEGORY_INPUT_LABEL_IT, + CATEGORY_INPUT_INFO_0_IT }, { - "vmu", - CATEGORY_VMU_LABEL_JA, - CATEGORY_VMU_INFO_0_JA + "expansions", + CATEGORY_EXPANSIONS_LABEL_IT, + CATEGORY_EXPANSIONS_INFO_0_IT + }, + { + "vmu", + CATEGORY_VMU_LABEL_IT, + CATEGORY_VMU_INFO_0_IT }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_ja[] = { +struct retro_core_option_v2_definition option_defs_it[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_JA, + CORE_OPTION_NAME_REGION_LABEL_IT, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_JA }, - { "USA", OPTION_VAL_USA_JA }, - { "Europe", OPTION_VAL_EUROPE_JA }, - { "Default", OPTION_VAL_DEFAULT_JA }, + { "Japan", OPTION_VAL_JAPAN_IT }, + { "USA", OPTION_VAL_USA_IT }, + { "Europe", OPTION_VAL_EUROPE_IT }, + { "Default", OPTION_VAL_DEFAULT_IT }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_JA, + CORE_OPTION_NAME_LANGUAGE_LABEL_IT, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_JA, + CORE_OPTION_NAME_LANGUAGE_INFO_0_IT, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_JA }, - { "English", OPTION_VAL_ENGLISH_JA }, - { "German", OPTION_VAL_GERMAN_JA }, - { "French", OPTION_VAL_FRENCH_JA }, - { "Spanish", OPTION_VAL_SPANISH_JA }, - { "Italian", OPTION_VAL_ITALIAN_JA }, - { "Default", OPTION_VAL_DEFAULT_JA }, + { "Japanese", OPTION_VAL_JAPANESE_IT }, + { "English", OPTION_VAL_ENGLISH_IT }, + { "German", OPTION_VAL_GERMAN_IT }, + { "French", OPTION_VAL_FRENCH_IT }, + { "Spanish", OPTION_VAL_SPANISH_IT }, + { "Italian", OPTION_VAL_ITALIAN_IT }, + { "Default", OPTION_VAL_DEFAULT_IT }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_JA, + CORE_OPTION_NAME_HLE_BIOS_LABEL_IT, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_JA, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_IT, NULL, "system", { @@ -41800,9 +46777,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_JA, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_IT, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_JA, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_IT, NULL, "system", { @@ -41814,9 +46791,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_JA, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_IT, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_JA, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_IT, NULL, "system", { @@ -41830,25 +46807,11 @@ struct retro_core_option_v2_definition option_defs_ja[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_JA, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_JA, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_JA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_IT, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_JA, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_IT, NULL, "system", { @@ -41860,9 +46823,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_JA, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_IT, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_JA, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_IT, NULL, "system", { @@ -41874,9 +46837,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_JA, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_IT, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_JA, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_IT, NULL, "system", { @@ -41888,9 +46851,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_JA, + CORE_OPTION_NAME_UPNP_LABEL_IT, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_JA, + CORE_OPTION_NAME_UPNP_INFO_0_IT, NULL, "system", { @@ -41903,39 +46866,39 @@ struct retro_core_option_v2_definition option_defs_ja[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_JA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_IT, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_JA, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_IT, NULL, "video", { - { "320x240", OPTION_VAL_320X240_JA }, - { "640x480", OPTION_VAL_640X480_JA }, - { "800x600", OPTION_VAL_800X600_JA }, - { "960x720", OPTION_VAL_960X720_JA }, - { "1024x768", OPTION_VAL_1024X768_JA }, - { "1280x960", OPTION_VAL_1280X960_JA }, - { "1440x1080", OPTION_VAL_1440X1080_JA }, - { "1600x1200", OPTION_VAL_1600X1200_JA }, - { "1920x1440", OPTION_VAL_1920X1440_JA }, - { "2560x1920", OPTION_VAL_2560X1920_JA }, - { "2880x2160", OPTION_VAL_2880X2160_JA }, - { "3200x2400", OPTION_VAL_3200X2400_JA }, - { "3840x2880", OPTION_VAL_3840X2880_JA }, - { "4480x3360", OPTION_VAL_4480X3360_JA }, - { "5120x3840", OPTION_VAL_5120X3840_JA }, - { "5760x4320", OPTION_VAL_5760X4320_JA }, - { "6400x4800", OPTION_VAL_6400X4800_JA }, - { "7040x5280", OPTION_VAL_7040X5280_JA }, - { "7680x5760", OPTION_VAL_7680X5760_JA }, - { "8320x6240", OPTION_VAL_8320X6240_JA }, - { "8960x6720", OPTION_VAL_8960X6720_JA }, - { "9600x7200", OPTION_VAL_9600X7200_JA }, - { "10240x7680", OPTION_VAL_10240X7680_JA }, - { "10880x8160", OPTION_VAL_10880X8160_JA }, - { "11520x8640", OPTION_VAL_11520X8640_JA }, - { "12160x9120", OPTION_VAL_12160X9120_JA }, - { "12800x9600", OPTION_VAL_12800X9600_JA }, + { "320x240", OPTION_VAL_320X240_IT }, + { "640x480", OPTION_VAL_640X480_IT }, + { "800x600", OPTION_VAL_800X600_IT }, + { "960x720", OPTION_VAL_960X720_IT }, + { "1024x768", OPTION_VAL_1024X768_IT }, + { "1280x960", OPTION_VAL_1280X960_IT }, + { "1440x1080", OPTION_VAL_1440X1080_IT }, + { "1600x1200", OPTION_VAL_1600X1200_IT }, + { "1920x1440", OPTION_VAL_1920X1440_IT }, + { "2560x1920", OPTION_VAL_2560X1920_IT }, + { "2880x2160", OPTION_VAL_2880X2160_IT }, + { "3200x2400", OPTION_VAL_3200X2400_IT }, + { "3840x2880", OPTION_VAL_3840X2880_IT }, + { "4480x3360", OPTION_VAL_4480X3360_IT }, + { "5120x3840", OPTION_VAL_5120X3840_IT }, + { "5760x4320", OPTION_VAL_5760X4320_IT }, + { "6400x4800", OPTION_VAL_6400X4800_IT }, + { "7040x5280", OPTION_VAL_7040X5280_IT }, + { "7680x5760", OPTION_VAL_7680X5760_IT }, + { "8320x6240", OPTION_VAL_8320X6240_IT }, + { "8960x6720", OPTION_VAL_8960X6720_IT }, + { "9600x7200", OPTION_VAL_9600X7200_IT }, + { "10240x7680", OPTION_VAL_10240X7680_IT }, + { "10880x8160", OPTION_VAL_10880X8160_IT }, + { "11520x8640", OPTION_VAL_11520X8640_IT }, + { "12160x9120", OPTION_VAL_12160X9120_IT }, + { "12800x9600", OPTION_VAL_12800X9600_IT }, { NULL, NULL }, }, #ifdef LOW_RES @@ -41946,62 +46909,62 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_JA, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_IT, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_JA, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_IT, NULL, "video", { - { "VGA", OPTION_VAL_VGA_JA }, - { "TV (RGB)", OPTION_VAL_TV_RGB_JA }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_JA }, + { "VGA", OPTION_VAL_VGA_IT }, + { "TV (RGB)", OPTION_VAL_TV_RGB_IT }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_IT }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_JA, + CORE_OPTION_NAME_BROADCAST_LABEL_IT, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_JA }, - { "PAL", OPTION_VAL_PAL_JA }, - { "PAL_N", OPTION_VAL_PAL_N_JA }, - { "PAL_M", OPTION_VAL_PAL_M_JA }, - { "Default", OPTION_VAL_DEFAULT_JA }, + { "NTSC", OPTION_VAL_NTSC_IT }, + { "PAL", OPTION_VAL_PAL_IT }, + { "PAL_N", OPTION_VAL_PAL_N_IT }, + { "PAL_M", OPTION_VAL_PAL_M_IT }, + { "Default", OPTION_VAL_DEFAULT_IT }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_JA, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_IT, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_JA }, - { "vertical", OPTION_VAL_VERTICAL_JA }, + { "horizontal", OPTION_VAL_HORIZONTAL_IT }, + { "vertical", OPTION_VAL_VERTICAL_IT }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_JA, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_IT, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_JA }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_JA }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_IT }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_IT }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_JA }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_IT }, #endif { NULL, NULL }, }, @@ -42014,25 +46977,25 @@ struct retro_core_option_v2_definition option_defs_ja[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_JA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_IT, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_JA, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_IT, NULL, "video", { - { "512MB", OPTION_VAL_512MB_JA }, - { "1GB", OPTION_VAL_1GB_JA }, - { "2GB", OPTION_VAL_2GB_JA }, - { "4GB", OPTION_VAL_4GB_JA }, + { "512MB", OPTION_VAL_512MB_IT }, + { "1GB", OPTION_VAL_1GB_IT }, + { "2GB", OPTION_VAL_2GB_IT }, + { "4GB", OPTION_VAL_4GB_IT }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_JA, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_IT, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_JA, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_IT, NULL, "video", { @@ -42040,6 +47003,7 @@ struct retro_core_option_v2_definition option_defs_ja[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -42048,9 +47012,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_JA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_IT, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_JA, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_IT, NULL, "video", { @@ -42062,9 +47026,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_JA, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_IT, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_JA, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_IT, NULL, "video", { @@ -42074,11 +47038,11 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_JA, + CORE_OPTION_NAME_MIPMAPPING_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_IT, NULL, "video", { @@ -42090,7 +47054,7 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_JA, + CORE_OPTION_NAME_FOG_LABEL_IT, NULL, "", NULL, @@ -42104,9 +47068,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_JA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_IT, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_JA, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_IT, NULL, "video", { @@ -42118,9 +47082,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_JA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_IT, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_JA, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_IT, NULL, "video", { @@ -42135,24 +47099,24 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_JA, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_IT, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_JA, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_IT, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_JA }, - { "1", OPTION_VAL_1_JA }, - { "2", OPTION_VAL_2_JA }, + { "0", OPTION_VAL_DEFAULT_IT }, + { "1", OPTION_VAL_1_IT }, + { "2", OPTION_VAL_2_IT }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_JA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_IT, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_JA, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_IT, NULL, "video", { @@ -42160,13 +47124,13 @@ struct retro_core_option_v2_definition option_defs_ja[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_JA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_IT, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_JA, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_IT, NULL, "video", { @@ -42178,9 +47142,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_JA, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_IT, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_JA, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_IT, NULL, "video", { @@ -42193,25 +47157,25 @@ struct retro_core_option_v2_definition option_defs_ja[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_JA, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_IT, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_JA, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_IT, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_JA }, - { "4", OPTION_VAL_4_JA }, - { "6", OPTION_VAL_6_JA }, + { "2", OPTION_VAL_2_O26_IT }, + { "4", OPTION_VAL_4_IT }, + { "6", OPTION_VAL_6_IT }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_JA, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_IT, NULL, "video", { @@ -42225,9 +47189,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_JA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_IT, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_JA, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_IT, NULL, "video", { @@ -42237,11 +47201,25 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_IT, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_IT, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_JA, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_IT, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_JA, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_IT, NULL, "performance", { @@ -42253,15 +47231,15 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_JA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_IT, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_JA, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_IT, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_JA }, - { "more", OPTION_VAL_MORE_JA }, + { "some", OPTION_VAL_SOME_IT }, + { "more", OPTION_VAL_MORE_IT }, { NULL, NULL }, }, #ifdef LOW_END @@ -42272,9 +47250,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_JA, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_IT, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_JA, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_IT, NULL, "performance", { @@ -42291,9 +47269,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_JA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_IT, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_JA, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_IT, NULL, "hacks", { @@ -42305,9 +47283,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_JA, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_IT, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_JA, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_IT, NULL, "hacks", { @@ -42319,9 +47297,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_JA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_IT, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_JA, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_IT, NULL, "hacks", { @@ -42335,64 +47313,78 @@ struct retro_core_option_v2_definition option_defs_ja[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_IT, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_IT, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_JA, + CORE_OPTION_NAME_SH4CLOCK_LABEL_IT, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_JA, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_IT, NULL, "hacks", { - { "100", OPTION_VAL_100_JA }, - { "110", OPTION_VAL_110_JA }, - { "120", OPTION_VAL_120_JA }, - { "130", OPTION_VAL_130_JA }, - { "140", OPTION_VAL_140_JA }, - { "150", OPTION_VAL_150_JA }, - { "160", OPTION_VAL_160_JA }, - { "170", OPTION_VAL_170_JA }, - { "180", OPTION_VAL_180_JA }, - { "190", OPTION_VAL_190_JA }, - { "200", OPTION_VAL_200_JA }, - { "210", OPTION_VAL_210_JA }, - { "220", OPTION_VAL_220_JA }, - { "230", OPTION_VAL_230_JA }, - { "240", OPTION_VAL_240_JA }, - { "250", OPTION_VAL_250_JA }, - { "260", OPTION_VAL_260_JA }, - { "270", OPTION_VAL_270_JA }, - { "280", OPTION_VAL_280_JA }, - { "290", OPTION_VAL_290_JA }, - { "300", OPTION_VAL_300_JA }, - { "310", OPTION_VAL_310_JA }, - { "320", OPTION_VAL_320_JA }, - { "330", OPTION_VAL_330_JA }, - { "340", OPTION_VAL_340_JA }, - { "350", OPTION_VAL_350_JA }, - { "360", OPTION_VAL_360_JA }, - { "370", OPTION_VAL_370_JA }, - { "380", OPTION_VAL_380_JA }, - { "390", OPTION_VAL_390_JA }, - { "400", OPTION_VAL_400_JA }, - { "410", OPTION_VAL_410_JA }, - { "420", OPTION_VAL_420_JA }, - { "430", OPTION_VAL_430_JA }, - { "440", OPTION_VAL_440_JA }, - { "450", OPTION_VAL_450_JA }, - { "460", OPTION_VAL_460_JA }, - { "470", OPTION_VAL_470_JA }, - { "480", OPTION_VAL_480_JA }, - { "490", OPTION_VAL_490_JA }, - { "500", OPTION_VAL_500_JA }, + { "100", OPTION_VAL_100_IT }, + { "110", OPTION_VAL_110_IT }, + { "120", OPTION_VAL_120_IT }, + { "130", OPTION_VAL_130_IT }, + { "140", OPTION_VAL_140_IT }, + { "150", OPTION_VAL_150_IT }, + { "160", OPTION_VAL_160_IT }, + { "170", OPTION_VAL_170_IT }, + { "180", OPTION_VAL_180_IT }, + { "190", OPTION_VAL_190_IT }, + { "200", OPTION_VAL_200_IT }, + { "210", OPTION_VAL_210_IT }, + { "220", OPTION_VAL_220_IT }, + { "230", OPTION_VAL_230_IT }, + { "240", OPTION_VAL_240_IT }, + { "250", OPTION_VAL_250_IT }, + { "260", OPTION_VAL_260_IT }, + { "270", OPTION_VAL_270_IT }, + { "280", OPTION_VAL_280_IT }, + { "290", OPTION_VAL_290_IT }, + { "300", OPTION_VAL_300_IT }, + { "310", OPTION_VAL_310_IT }, + { "320", OPTION_VAL_320_IT }, + { "330", OPTION_VAL_330_IT }, + { "340", OPTION_VAL_340_IT }, + { "350", OPTION_VAL_350_IT }, + { "360", OPTION_VAL_360_IT }, + { "370", OPTION_VAL_370_IT }, + { "380", OPTION_VAL_380_IT }, + { "390", OPTION_VAL_390_IT }, + { "400", OPTION_VAL_400_IT }, + { "410", OPTION_VAL_410_IT }, + { "420", OPTION_VAL_420_IT }, + { "430", OPTION_VAL_430_IT }, + { "440", OPTION_VAL_440_IT }, + { "450", OPTION_VAL_450_IT }, + { "460", OPTION_VAL_460_IT }, + { "470", OPTION_VAL_470_IT }, + { "480", OPTION_VAL_480_IT }, + { "490", OPTION_VAL_490_IT }, + { "500", OPTION_VAL_500_IT }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_JA, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_IT, NULL, "hacks", { @@ -42402,11 +47394,11 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_JA, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_IT, NULL, "hacks", { @@ -42418,47 +47410,47 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_JA, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_IT, NULL, "input", { - { "0%", OPTION_VAL_0_JA }, - { "5%", OPTION_VAL_5_JA }, - { "10%", OPTION_VAL_10_JA }, - { "15%", OPTION_VAL_15_JA }, - { "20%", OPTION_VAL_20_JA }, - { "25%", OPTION_VAL_25_JA }, - { "30%", OPTION_VAL_30_JA }, + { "0%", OPTION_VAL_0_IT }, + { "5%", OPTION_VAL_5_IT }, + { "10%", OPTION_VAL_10_IT }, + { "15%", OPTION_VAL_15_IT }, + { "20%", OPTION_VAL_20_IT }, + { "25%", OPTION_VAL_25_IT }, + { "30%", OPTION_VAL_30_IT }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_JA, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_IT, NULL, "input", { - { "0%", OPTION_VAL_0_JA }, - { "5%", OPTION_VAL_5_JA }, - { "10%", OPTION_VAL_10_JA }, - { "15%", OPTION_VAL_15_JA }, - { "20%", OPTION_VAL_20_JA }, - { "25%", OPTION_VAL_25_JA }, - { "30%", OPTION_VAL_30_JA }, + { "0%", OPTION_VAL_0_IT }, + { "5%", OPTION_VAL_5_IT }, + { "10%", OPTION_VAL_10_IT }, + { "15%", OPTION_VAL_15_IT }, + { "20%", OPTION_VAL_20_IT }, + { "25%", OPTION_VAL_25_IT }, + { "30%", OPTION_VAL_30_IT }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_JA, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_IT, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_IT, NULL, "input", { @@ -42469,10 +47461,10 @@ struct retro_core_option_v2_definition option_defs_ja[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_JA, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_IT, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_JA, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_IT, NULL, "input", { @@ -42480,124 +47472,268 @@ struct retro_core_option_v2_definition option_defs_ja[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_JA, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_IT, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_JA, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_IT, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_JA, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_IT, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_JA, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_IT }, + { "60%", OPTION_VAL_60_IT }, + { "70%", OPTION_VAL_70_IT }, + { "80%", OPTION_VAL_80_IT }, + { "90%", OPTION_VAL_90_IT }, + { "100%", OPTION_VAL_100_O45_IT }, + { "110%", OPTION_VAL_110_O45_IT }, + { "120%", OPTION_VAL_120_O45_IT }, + { "130%", OPTION_VAL_130_O45_IT }, + { "140%", OPTION_VAL_140_O45_IT }, + { "150%", OPTION_VAL_150_O45_IT }, + { "160%", OPTION_VAL_160_O45_IT }, + { "170%", OPTION_VAL_170_O45_IT }, + { "180%", OPTION_VAL_180_O45_IT }, + { "190%", OPTION_VAL_190_O45_IT }, + { "200%", OPTION_VAL_200_O45_IT }, + { "210%", OPTION_VAL_210_O45_IT }, + { "220%", OPTION_VAL_220_O45_IT }, + { "230%", OPTION_VAL_230_O45_IT }, + { "240%", OPTION_VAL_240_O45_IT }, + { "250%", OPTION_VAL_250_O45_IT }, + { "260%", OPTION_VAL_260_O45_IT }, + { "270%", OPTION_VAL_270_O45_IT }, + { "280%", OPTION_VAL_280_O45_IT }, + { "290%", OPTION_VAL_290_O45_IT }, + { "300%", OPTION_VAL_300_O45_IT }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_JA, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_IT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_JA }, - { "Red", OPTION_VAL_RED_JA }, - { "Green", OPTION_VAL_GREEN_JA }, - { "Blue", OPTION_VAL_BLUE_JA }, + { "White", OPTION_VAL_WHITE_IT }, + { "Red", OPTION_VAL_RED_IT }, + { "Green", OPTION_VAL_GREEN_IT }, + { "Blue", OPTION_VAL_BLUE_IT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_JA, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_IT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_JA }, - { "Red", OPTION_VAL_RED_JA }, - { "Green", OPTION_VAL_GREEN_JA }, - { "Blue", OPTION_VAL_BLUE_JA }, + { "White", OPTION_VAL_WHITE_IT }, + { "Red", OPTION_VAL_RED_IT }, + { "Green", OPTION_VAL_GREEN_IT }, + { "Blue", OPTION_VAL_BLUE_IT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_JA, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_IT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_JA }, - { "Red", OPTION_VAL_RED_JA }, - { "Green", OPTION_VAL_GREEN_JA }, - { "Blue", OPTION_VAL_BLUE_JA }, + { "White", OPTION_VAL_WHITE_IT }, + { "Red", OPTION_VAL_RED_IT }, + { "Green", OPTION_VAL_GREEN_IT }, + { "Blue", OPTION_VAL_BLUE_IT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_JA, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_IT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_JA }, - { "Red", OPTION_VAL_RED_JA }, - { "Green", OPTION_VAL_GREEN_JA }, - { "Blue", OPTION_VAL_BLUE_JA }, + { "White", OPTION_VAL_WHITE_IT }, + { "Red", OPTION_VAL_RED_IT }, + { "Green", OPTION_VAL_GREEN_IT }, + { "Blue", OPTION_VAL_BLUE_IT }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_JA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_JA, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_JA, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_IT, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_IT, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_JA }, - { "All VMUs", OPTION_VAL_ALL_VMUS_JA }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_JA, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_JA, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_JA, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_IT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_IT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_IT }, + { "Purupuru", OPTION_VAL_PURUPURU_IT }, + { "None", OPTION_VAL_NONE_IT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_IT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_IT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_IT, + NULL, + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_IT }, + { "All VMUs", OPTION_VAL_ALL_VMUS_IT }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_IT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_IT, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_IT, NULL, "vmu", { @@ -42608,9 +47744,9 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_JA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_JA, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_JA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_IT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_IT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_IT, NULL, "vmu", { @@ -42622,7 +47758,7 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_JA, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_IT, NULL, "", NULL, @@ -42636,144 +47772,144 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_JA, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_IT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_JA, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_IT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_JA }, - { "2x", OPTION_VAL_2_O27_JA }, - { "3x", OPTION_VAL_3X_JA }, - { "4x", OPTION_VAL_4_JA }, - { "5x", OPTION_VAL_5X_JA }, + { "1x", OPTION_VAL_1X_IT }, + { "2x", OPTION_VAL_2_O26_IT }, + { "3x", OPTION_VAL_3X_IT }, + { "4x", OPTION_VAL_4_IT }, + { "5x", OPTION_VAL_5X_IT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_JA, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_IT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_JA }, - { "20%", OPTION_VAL_20_JA }, - { "30%", OPTION_VAL_30_JA }, - { "40%", OPTION_VAL_40_JA }, - { "50%", OPTION_VAL_50_JA }, - { "60%", OPTION_VAL_60_JA }, - { "70%", OPTION_VAL_70_JA }, - { "80%", OPTION_VAL_80_JA }, - { "90%", OPTION_VAL_90_JA }, - { "100%", OPTION_VAL_100_O57_JA }, + { "10%", OPTION_VAL_10_IT }, + { "20%", OPTION_VAL_20_IT }, + { "30%", OPTION_VAL_30_IT }, + { "40%", OPTION_VAL_40_IT }, + { "50%", OPTION_VAL_50_IT }, + { "60%", OPTION_VAL_60_IT }, + { "70%", OPTION_VAL_70_IT }, + { "80%", OPTION_VAL_80_IT }, + { "90%", OPTION_VAL_90_IT }, + { "100%", OPTION_VAL_100_O45_IT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_JA, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_IT, NULL, "", NULL, @@ -42787,144 +47923,144 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_JA, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_IT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_JA, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_IT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_JA }, - { "2x", OPTION_VAL_2_O27_JA }, - { "3x", OPTION_VAL_3X_JA }, - { "4x", OPTION_VAL_4_JA }, - { "5x", OPTION_VAL_5X_JA }, + { "1x", OPTION_VAL_1X_IT }, + { "2x", OPTION_VAL_2_O26_IT }, + { "3x", OPTION_VAL_3X_IT }, + { "4x", OPTION_VAL_4_IT }, + { "5x", OPTION_VAL_5X_IT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_JA, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_IT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_JA }, - { "20%", OPTION_VAL_20_JA }, - { "30%", OPTION_VAL_30_JA }, - { "40%", OPTION_VAL_40_JA }, - { "50%", OPTION_VAL_50_JA }, - { "60%", OPTION_VAL_60_JA }, - { "70%", OPTION_VAL_70_JA }, - { "80%", OPTION_VAL_80_JA }, - { "90%", OPTION_VAL_90_JA }, - { "100%", OPTION_VAL_100_O57_JA }, + { "10%", OPTION_VAL_10_IT }, + { "20%", OPTION_VAL_20_IT }, + { "30%", OPTION_VAL_30_IT }, + { "40%", OPTION_VAL_40_IT }, + { "50%", OPTION_VAL_50_IT }, + { "60%", OPTION_VAL_60_IT }, + { "70%", OPTION_VAL_70_IT }, + { "80%", OPTION_VAL_80_IT }, + { "90%", OPTION_VAL_90_IT }, + { "100%", OPTION_VAL_100_O45_IT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_JA, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_IT, NULL, "", NULL, @@ -42938,144 +48074,144 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_JA, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_IT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_JA, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_IT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_JA }, - { "2x", OPTION_VAL_2_O27_JA }, - { "3x", OPTION_VAL_3X_JA }, - { "4x", OPTION_VAL_4_JA }, - { "5x", OPTION_VAL_5X_JA }, + { "1x", OPTION_VAL_1X_IT }, + { "2x", OPTION_VAL_2_O26_IT }, + { "3x", OPTION_VAL_3X_IT }, + { "4x", OPTION_VAL_4_IT }, + { "5x", OPTION_VAL_5X_IT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_JA, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_IT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_JA }, - { "20%", OPTION_VAL_20_JA }, - { "30%", OPTION_VAL_30_JA }, - { "40%", OPTION_VAL_40_JA }, - { "50%", OPTION_VAL_50_JA }, - { "60%", OPTION_VAL_60_JA }, - { "70%", OPTION_VAL_70_JA }, - { "80%", OPTION_VAL_80_JA }, - { "90%", OPTION_VAL_90_JA }, - { "100%", OPTION_VAL_100_O57_JA }, + { "10%", OPTION_VAL_10_IT }, + { "20%", OPTION_VAL_20_IT }, + { "30%", OPTION_VAL_30_IT }, + { "40%", OPTION_VAL_40_IT }, + { "50%", OPTION_VAL_50_IT }, + { "60%", OPTION_VAL_60_IT }, + { "70%", OPTION_VAL_70_IT }, + { "80%", OPTION_VAL_80_IT }, + { "90%", OPTION_VAL_90_IT }, + { "100%", OPTION_VAL_100_O45_IT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_JA, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_IT, NULL, "", NULL, @@ -43089,505 +48225,560 @@ struct retro_core_option_v2_definition option_defs_ja[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_JA, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_IT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_IT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_IT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_IT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_IT }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_JA, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_IT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_JA }, - { "2x", OPTION_VAL_2_O27_JA }, - { "3x", OPTION_VAL_3X_JA }, - { "4x", OPTION_VAL_4_JA }, - { "5x", OPTION_VAL_5X_JA }, + { "1x", OPTION_VAL_1X_IT }, + { "2x", OPTION_VAL_2_O26_IT }, + { "3x", OPTION_VAL_3X_IT }, + { "4x", OPTION_VAL_4_IT }, + { "5x", OPTION_VAL_5X_IT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_JA, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_IT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, - { "BLACK 02", OPTION_VAL_BLACK_02_JA }, - { "BLUE 03", OPTION_VAL_BLUE_JA }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, - { "GREEN 05", OPTION_VAL_GREEN_JA }, - { "CYAN 06", OPTION_VAL_CYAN_06_JA }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, - { "RED 11", OPTION_VAL_RED_JA }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, - { "GRAY 15", OPTION_VAL_GRAY_15_JA }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, - { "WHITE 28", OPTION_VAL_WHITE_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_IT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_IT }, + { "BLACK 02", OPTION_VAL_BLACK_02_IT }, + { "BLUE 03", OPTION_VAL_BLUE_IT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_IT }, + { "GREEN 05", OPTION_VAL_GREEN_IT }, + { "CYAN 06", OPTION_VAL_CYAN_06_IT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_IT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_IT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_IT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_IT }, + { "RED 11", OPTION_VAL_RED_IT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_IT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_IT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_IT }, + { "GRAY 15", OPTION_VAL_GRAY_15_IT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_IT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_IT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_IT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_IT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_IT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_IT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_IT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_IT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_IT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_IT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_IT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_IT }, + { "WHITE 28", OPTION_VAL_WHITE_IT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_JA, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_IT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_JA }, - { "20%", OPTION_VAL_20_JA }, - { "30%", OPTION_VAL_30_JA }, - { "40%", OPTION_VAL_40_JA }, - { "50%", OPTION_VAL_50_JA }, - { "60%", OPTION_VAL_60_JA }, - { "70%", OPTION_VAL_70_JA }, - { "80%", OPTION_VAL_80_JA }, - { "90%", OPTION_VAL_90_JA }, - { "100%", OPTION_VAL_100_O57_JA }, + { "10%", OPTION_VAL_10_IT }, + { "20%", OPTION_VAL_20_IT }, + { "30%", OPTION_VAL_30_IT }, + { "40%", OPTION_VAL_40_IT }, + { "50%", OPTION_VAL_50_IT }, + { "60%", OPTION_VAL_60_IT }, + { "70%", OPTION_VAL_70_IT }, + { "80%", OPTION_VAL_80_IT }, + { "90%", OPTION_VAL_90_IT }, + { "100%", OPTION_VAL_100_O45_IT }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_ja = { - option_cats_ja, - option_defs_ja +struct retro_core_options_v2 options_it = { + option_cats_it, + option_defs_it }; -/* RETRO_LANGUAGE_KO */ - -#define CATEGORY_SYSTEM_LABEL_KO "시스템" -#define CATEGORY_SYSTEM_INFO_0_KO "지역, 언어, BIOS 및 하드웨어 설정을 구성합니다." -#define CATEGORY_VIDEO_LABEL_KO "비디오" -#define CATEGORY_VIDEO_INFO_0_KO "해상도, 투명도 및 화면 효과 설정을 구성합니다." -#define CATEGORY_PERFORMANCE_LABEL_KO "성능" -#define CATEGORY_PERFORMANCE_INFO_0_KO "스레드 렌더링 및 프레임 스킵 설정을 구성합니다." -#define CATEGORY_HACKS_LABEL_KO "에뮬레이션 핵" -#define CATEGORY_HACKS_INFO_0_KO "와이드스크린 핵, GD롬 로딩 속도 조절 및 텍스쳐 변경 설정등을 구성합니다." -#define CATEGORY_INPUT_LABEL_KO "입력" -#define CATEGORY_INPUT_INFO_0_KO "게임패드 및 라이트 건 설정을 구성합니다." -#define CATEGORY_VMU_LABEL_KO "비쥬얼 메모리 유닛" -#define CATEGORY_VMU_INFO_0_KO "게임 별 VMU 저장 파일 및 VMU OSD 설정을 구성합니다." -#define CORE_OPTION_NAME_REGION_LABEL_KO "지역" -#define OPTION_VAL_JAPAN_KO "일본" -#define OPTION_VAL_USA_KO "미국" -#define OPTION_VAL_EUROPE_KO "유럽" -#define OPTION_VAL_DEFAULT_KO "기본" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_KO "언어" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_KO "BIOS 및 다국어 게임에서 사용되는 언어 설정을 변경합니다" -#define OPTION_VAL_JAPANESE_KO "일본어" -#define OPTION_VAL_ENGLISH_KO "영어" -#define OPTION_VAL_GERMAN_KO "독일어" -#define OPTION_VAL_FRENCH_KO "프랑스어" -#define OPTION_VAL_SPANISH_KO "스페인어" -#define OPTION_VAL_ITALIAN_KO "이탈리아어" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_KO "HLE BIOS (재시작 필요)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_KO "HLE BIOS 사용을 강제합니다." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_KO "BIOS 로 부트 (재시작 필요)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_KO "드림캐스트 BIOS 메뉴로 부팅합니다." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_KO "HDR 활성화" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_KO "Dreamcast의 오디오 DSP(디지털 신호 프로세서)의 에뮬레이션을 활성화합니다. 사운드의 정확도는 향상되지만 성능 요구 사항이 증가합니다." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_KO "Windows CE 모드 강제 사용" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_KO "Windows CE 게임을 위한 전체 MMU(메모리 관리 유닛) 에뮬레이션 및 기타 설정을 활성화합니다." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_KO "NAOMI 서비스 버튼 허용" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_KO "캐비넷 설정에 들어가기위한 NAOMI 서비스 버튼을 활성화합니다." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_KO "NAOMI 게임을 무료 플레이로 설정" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_KO "무료 플레이를 위해 게임의 코인 설정을 수정합니다." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO "브로드밴드 어댑터 에뮬레이션" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO "모뎀 대신 이더넷 브로드밴드 어댑터를 에뮬레이트합니다. (재시작 필요)" -#define CORE_OPTION_NAME_UPNP_LABEL_KO "UPnP 활성화" -#define CORE_OPTION_NAME_UPNP_INFO_0_KO "온라인 게임에서 UPnP를 사용해 자동으로 인터넷 라우터를 설정합니다." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_KO "내부 해상도" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_KO "렌더링 해상도를 변경합니다." -#define OPTION_VAL_320X240_KO NULL -#define OPTION_VAL_640X480_KO NULL -#define OPTION_VAL_800X600_KO NULL -#define OPTION_VAL_960X720_KO NULL -#define OPTION_VAL_1024X768_KO NULL -#define OPTION_VAL_1280X960_KO NULL -#define OPTION_VAL_1440X1080_KO NULL -#define OPTION_VAL_1600X1200_KO NULL -#define OPTION_VAL_1920X1440_KO NULL -#define OPTION_VAL_2560X1920_KO NULL -#define OPTION_VAL_2880X2160_KO NULL -#define OPTION_VAL_3200X2400_KO NULL -#define OPTION_VAL_3840X2880_KO NULL -#define OPTION_VAL_4480X3360_KO NULL -#define OPTION_VAL_5120X3840_KO NULL -#define OPTION_VAL_5760X4320_KO NULL -#define OPTION_VAL_6400X4800_KO NULL -#define OPTION_VAL_7040X5280_KO NULL -#define OPTION_VAL_7680X5760_KO NULL -#define OPTION_VAL_8320X6240_KO NULL -#define OPTION_VAL_8960X6720_KO NULL -#define OPTION_VAL_9600X7200_KO NULL -#define OPTION_VAL_10240X7680_KO NULL -#define OPTION_VAL_10880X8160_KO NULL -#define OPTION_VAL_11520X8640_KO NULL -#define OPTION_VAL_12160X9120_KO NULL -#define OPTION_VAL_12800X9600_KO NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_KO "케이블 타입" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_KO "외부 출력 형식. 'TV (컴포지트)'가 가장 많이 지원됨." -#define OPTION_VAL_VGA_KO NULL -#define OPTION_VAL_TV_RGB_KO NULL -#define OPTION_VAL_TV_COMPOSITE_KO "TV (컴포지트)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_KO "방송 표준" -#define OPTION_VAL_NTSC_KO NULL -#define OPTION_VAL_PAL_KO "PAL (국제)" -#define OPTION_VAL_PAL_N_KO "PAL-N (아르헨티나, 파라과이, 우르과이)" -#define OPTION_VAL_PAL_M_KO "PAL-M (브라질)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_KO "화면 방향" -#define OPTION_VAL_HORIZONTAL_KO "가로" -#define OPTION_VAL_VERTICAL_KO "세로" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_KO "알파 정렬" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_KO "줄당 (빠름, 가장 부정확)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_KO "삼각형당 (중간)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_KO "픽셀당 (정확, 가장 느림)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_KO "누산 픽셀 버퍼 크기" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_KO "높은 해상도 출력을 올바르게 표시하려면 이 값을 높은 값으로 설정해야 할 수도 있습니다." -#define OPTION_VAL_512MB_KO NULL -#define OPTION_VAL_1GB_KO NULL -#define OPTION_VAL_2GB_KO NULL -#define OPTION_VAL_4GB_KO NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_KO "최대 투명 레이어" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_KO "복잡한 장면을 그릴 때 높은 값이 필요할 수 있습니다." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_KO "전체 프레임버퍼 에뮬레이션" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_KO "VRAM 상 전체 프레임버퍼 에뮬레이션을 활성화합니다. VRAM 상의 프레임버퍼에 직접 읽기 또는 쓰기를 수행하는 게임을 실행할 때 유용합니다. 활성화할 경우, 내부 해상도가 640x480으로 고정되며 성능에 큰 영향을 끼칠 수 있습니다." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_KO "RTT (Render To Texture) 버퍼 사용" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_KO "렌더된 텍스쳐를 GPU에서 VRAM으로 복사합니다. 이 옵션은 이 옵션을 필요로 하는 게임에서는 기본적으로 활성화됩니다. 활성화할 경우, 텍스쳐 업스케일링이 비활성화되며 성능에 큰 영향을 끼칠 수 있습니다." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_KO "밉맵" -#define CORE_OPTION_NAME_FOG_LABEL_KO "안개 효과" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_KO "볼륨 모디파이어" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_KO "드림캐스트 GPU의 기능으로 보통 개체의 그림자를 그리는 데 사용됩니다. 이 기능은 보통 활성화해두어야 하며 성능에 미치는 영향은 아주 적습니다." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_KO "비등방성 필터링" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_KO "카메라와 비스듬하게 배치된 표면의 텍스쳐 품질을 향상합니다. 높은 값으로 설정하면 GPU 부하가 높아집니다. 변경 사항은 코어를 다시 시작해야 적용됩니다." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_KO "텍스쳐 필터링" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_KO "사용할 텍스쳐 필터링 모드를 선택합니다. 모든 텍스쳐에 강제로 특정 필터링 모드를 적용하여 더 날카로운(또는 부드러운) 비주얼을 얻을 수 있습니다. 기본 외의 다른 값으로 설정 시 다양한 렌더링 문제가 발생할 수 있습니다. 변경 사항은 코어를 다시 시작해야 적용됩니다." -#define OPTION_VAL_1_KO "강제 최근접이웃" -#define OPTION_VAL_2_KO "강제 선형" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_KO "프레임 스왑 지연" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_KO "화면이 번쩍이거나 깨지는 것을 방지할 수 있습니다. 느린 플랫폼에서는 사용을 권장하지 않습니다." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_KO "프레임 레이트 변화 감지" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_KO "내부 프레임 레이트가 변경될 때(예: 60FPS에서 30FPS로) 프론트엔드에게 알림을 보냅니다. 30FPS 또는 20FPS 고정으로 실행되는 게임에서는 프레임 페이스를 개선하지만, 무제한(불안정) 프레임 레이트로 실행되는 게임(예: Ecco the Dolphin, Unreal Tournament)을 실행할 때는 비활성화되어야 합니다. 주의: '자동 프레임 건너뛰기'가 활성화되어있으면 작동하지 않습니다." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_KO "PowerVR2 포스트프로세싱 필터" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_KO "렌더된 이미지에 PowerVR2 GPU와 아날로그 비디오 신호에서 나타나는 효과를 후처리로 구현합니다." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_KO "텍스쳐 업스케일링 (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_KO "손으로 그려진 2D 픽셀아트 그래픽을 개선합니다. 2D 픽셀아트 게임에서만 사용되어야 합니다." -#define OPTION_VAL_2_O27_KO NULL -#define OPTION_VAL_4_KO NULL -#define OPTION_VAL_6_KO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_KO "텍스쳐 업스케일링 필터 최대 크기" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_KO "네이티브 깊이 보간" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_KO "AMD GPU에서 깊이 문제와 텍스쳐 망가짐 증상을 개선하는 데 도움이 됩니다. 일부 상황에서는 인텔 GPU에서도 도움이 될 수 있습니다." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_KO "스레드 렌더링" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_KO "GPU와 CPU를 별도의 스레드에서 실행합니다. 사용하는 것이 매우 권장됩니다." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_KO "자동 프레임 건너뛰기" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_KO "에뮬레이터 실행이 느려질 경우 자동으로 프레임을 건너뜁니다. 주의: 이 설정은 '스레드 렌더링'이 활성화되어 있어야 적용됩니다." -#define OPTION_VAL_SOME_KO "보통" -#define OPTION_VAL_MORE_KO "최대" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_KO "프레임 건너뛰기" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_KO "표시되는 각 프레임 사이에서 건너뛸 프레임 수를 설정합니다." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_KO "와이드스크린 핵 (재시작 필요)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_KO "일부 게임이 와이드스크린 형식으로 출력되게 하는 치트를 활성화합니다." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_KO "와이드스크린 핵" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_KO "일반적인 4:3 화면비 밖에도 개체를 그립니다. 드러난 부분에서 그래픽 오류가 발생할 수도 있습니다." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_KO "GD-ROM 빠른 로딩 (정확하지 않음)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_KO "GD-ROM 로딩 속도를 높입니다." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_KO "SH4 CPU 언더/오버클럭" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_KO "SH4 메인 CPU 클럭을 기본 200MHz에서 변경합니다. 언더클럭하면 플랫폼 속도가 느려질 수 있습니다. 오버클럭하면 일부 게임에서 프레임 속도가 증가할 수 있습니다. 주의해서 사용하세요." -#define OPTION_VAL_100_KO NULL -#define OPTION_VAL_110_KO NULL -#define OPTION_VAL_120_KO NULL -#define OPTION_VAL_130_KO NULL -#define OPTION_VAL_140_KO NULL -#define OPTION_VAL_150_KO NULL -#define OPTION_VAL_160_KO NULL -#define OPTION_VAL_170_KO NULL -#define OPTION_VAL_180_KO NULL -#define OPTION_VAL_190_KO NULL -#define OPTION_VAL_200_KO NULL -#define OPTION_VAL_210_KO NULL -#define OPTION_VAL_220_KO NULL -#define OPTION_VAL_230_KO NULL -#define OPTION_VAL_240_KO NULL -#define OPTION_VAL_250_KO NULL -#define OPTION_VAL_260_KO NULL -#define OPTION_VAL_270_KO NULL -#define OPTION_VAL_280_KO NULL -#define OPTION_VAL_290_KO NULL -#define OPTION_VAL_300_KO NULL -#define OPTION_VAL_310_KO NULL -#define OPTION_VAL_320_KO NULL -#define OPTION_VAL_330_KO NULL -#define OPTION_VAL_340_KO NULL -#define OPTION_VAL_350_KO NULL -#define OPTION_VAL_360_KO NULL -#define OPTION_VAL_370_KO NULL -#define OPTION_VAL_380_KO NULL -#define OPTION_VAL_390_KO NULL -#define OPTION_VAL_400_KO NULL -#define OPTION_VAL_410_KO NULL -#define OPTION_VAL_420_KO NULL -#define OPTION_VAL_430_KO NULL -#define OPTION_VAL_440_KO NULL -#define OPTION_VAL_450_KO NULL -#define OPTION_VAL_460_KO NULL -#define OPTION_VAL_470_KO NULL -#define OPTION_VAL_480_KO NULL -#define OPTION_VAL_490_KO NULL -#define OPTION_VAL_500_KO NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_KO "사용자 텍스처 불러오기" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_KO "텍스쳐 덤프하기" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_KO "아날로그 스틱 데드존" -#define OPTION_VAL_0_KO NULL -#define OPTION_VAL_5_KO NULL -#define OPTION_VAL_10_KO NULL -#define OPTION_VAL_15_KO NULL -#define OPTION_VAL_20_KO NULL -#define OPTION_VAL_25_KO NULL -#define OPTION_VAL_30_KO NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_KO "트리거 데드존" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_KO "디지털 트리거" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_KO "부루부루 팩/진동 팩" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_KO "컨트롤러 포스 피드백을 활성합니다." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_KO "디지털 출력 송출하기" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_KO "디지털 출력과 포스 피드백 상태를 TCP 포트 8000번으로 송출합니다. MAME의 \"-output network\" 옵션과 호환됩니다." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_KO "라이트 건 설정 표시" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_KO "라이트건 십자 조준선 옵션 구성을 활성화합니다. 참고: 이 설정을 적용하려면 빠른 메뉴를 다시 표시해야 할 수 있습니다." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_KO "라이트건 조준선 1 표시" -#define OPTION_VAL_WHITE_KO "흰색" -#define OPTION_VAL_RED_KO "빨강" -#define OPTION_VAL_GREEN_KO "초록" -#define OPTION_VAL_BLUE_KO "파랑" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_KO "라이트건 조준선 2 표시" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_KO "라이트건 조준선 3 표시" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_KO "라이트건 조준선 4 표시" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_KO "게임당 별도 Visual Memory Units/Systems(VMU) 사용" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_KO "게임당 별도 VMU 사용" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_KO "비활성화할 경우, 모든 게임이 RetroArch의 시스템 디렉토리에 저장된 4개의 VMU 저장 파일(A1, B1, C1, D1)을 공유합니다. 'VMU A1' 설정은 RetroArch의 세이브 디렉토리에 게임 하나 당 하나의 VMU 'A1' 파일을 생성합니다. '모든 VMU'는 게임 하나 당 4개의 VMU 파일(A1, B1, C1, D1)을 생성합니다." -#define OPTION_VAL_VMU_A1_KO NULL -#define OPTION_VAL_ALL_VMUS_KO "전체 VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_KO "비주얼 메모리 유닛/시스템 (VMU) 사운드" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_KO "VMU 사운드" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_KO "활성화하면 VMU 신호음이 재생됩니다." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_KO "Visual Memory Unit/System(VMU) 디스플레이 설정 표시" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_KO "VMU 디스플레이 설정 표시" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_KO "에뮬레이트되는 VMU LCD 화면의 표시 여부, 크기, 위치, 색상 설정을 표시합니다. 주의: 변경 사항이 적용되려면 빠른 메뉴를 껐다 켜야 할 수도 있습니다." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_KO "VMU 화면 1 표시" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_KO "VMU 화면 1 위치" -#define OPTION_VAL_UPPER_LEFT_KO "왼쪽 위" -#define OPTION_VAL_UPPER_RIGHT_KO "오른쪽 위" -#define OPTION_VAL_LOWER_LEFT_KO "왼쪽 아래" -#define OPTION_VAL_LOWER_RIGHT_KO "오른쪽 아래" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 1 크기" -#define OPTION_VAL_1X_KO NULL -#define OPTION_VAL_3X_KO NULL -#define OPTION_VAL_5X_KO NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 1 켜진 픽셀 색상" -#define OPTION_VAL_DEFAULT_ON_00_KO "기본설정 켜짐" -#define OPTION_VAL_DEFAULT_OFF_01_KO "기본설정 꺼짐" -#define OPTION_VAL_BLACK_02_KO "검정" -#define OPTION_VAL_LIGHT_BLUE_04_KO "밝은 파랑" -#define OPTION_VAL_CYAN_06_KO "청록" -#define OPTION_VAL_CYAN_BLUE_07_KO "청록 파랑" -#define OPTION_VAL_LIGHT_GREEN_08_KO "밝은 녹색" -#define OPTION_VAL_CYAN_GREEN_09_KO "청록 초록" -#define OPTION_VAL_LIGHT_CYAN_10_KO "밝은 청록" -#define OPTION_VAL_PURPLE_12_KO "보라" -#define OPTION_VAL_LIGHT_PURPLE_13_KO "밝은 보라" -#define OPTION_VAL_YELLOW_14_KO "노란색" -#define OPTION_VAL_GRAY_15_KO "회색" -#define OPTION_VAL_LIGHT_PURPLE_2_16_KO "연보라색 (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_KO "밝은 녹색 (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_KO "밝은 녹색 (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_KO "밝은 청록 (2)" -#define OPTION_VAL_LIGHT_RED_2_20_KO "밝은 빨강 (2)" -#define OPTION_VAL_MAGENTA_21_KO "자홍색" -#define OPTION_VAL_LIGHT_PURPLE_3_22_KO "연보라색 (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_KO "밝은 주황색" -#define OPTION_VAL_ORANGE_24_KO "오렌지" -#define OPTION_VAL_LIGHT_PURPLE_4_25_KO "연보라색 (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_KO "연한 노란색" -#define OPTION_VAL_LIGHT_YELLOW_2_27_KO "연한 노란색 (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 1 꺼진 픽셀 색상" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_KO "VMU 화면 1 투명도" -#define OPTION_VAL_40_KO NULL -#define OPTION_VAL_50_KO NULL -#define OPTION_VAL_60_KO NULL -#define OPTION_VAL_70_KO NULL -#define OPTION_VAL_80_KO NULL -#define OPTION_VAL_90_KO NULL -#define OPTION_VAL_100_O57_KO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_KO "VMU 화면 2 표시" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_KO "VMU 화면 2 위치" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 2 크기" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 2 켜진 픽셀 색상" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 2 꺼진 픽셀 색상" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_KO "VMU 화면 2 투명도" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_KO "VMU 화면 3 표시" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_KO "VMU 화면 3 위치" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 3 크기" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 3 켜진 픽셀 색상" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 3 꺼진 픽셀 색상" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_KO "VMU 화면 3 투명도" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_KO "VMU 화면 4 표시" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_KO "VMU 화면 4 위치" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 4 크기" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 4 켜진 픽셀 색상" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 4 꺼진 픽셀 색상" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_KO "VMU 화면 4 투명도" +/* RETRO_LANGUAGE_JA */ -struct retro_core_option_v2_category option_cats_ko[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_KO, - CATEGORY_SYSTEM_INFO_0_KO - }, - { - "video", - CATEGORY_VIDEO_LABEL_KO, - CATEGORY_VIDEO_INFO_0_KO - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_KO, - CATEGORY_PERFORMANCE_INFO_0_KO - }, - { - "hacks", - CATEGORY_HACKS_LABEL_KO, - CATEGORY_HACKS_INFO_0_KO +#define CATEGORY_SYSTEM_LABEL_JA "システム" +#define CATEGORY_SYSTEM_INFO_0_JA "地域、言語、BIOS および基本的なハードウェアの設定を変更します。" +#define CATEGORY_VIDEO_LABEL_JA "ビデオ" +#define CATEGORY_VIDEO_INFO_0_JA "解像度、描画順に依存しない透明度および視覚効果の設定を変更します。" +#define CATEGORY_PERFORMANCE_LABEL_JA "パフォーマンス" +#define CATEGORY_PERFORMANCE_INFO_0_JA "スレッド化したレンダリングとフレームスキップの設定を変更します。" +#define CATEGORY_HACKS_LABEL_JA "エミュレーションハック" +#define CATEGORY_HACKS_INFO_0_JA "ワイドスクリーンハック、GD-ROM 読み込み速度およびテクスチャの置換設定を変更します。" +#define CATEGORY_INPUT_LABEL_JA "入力" +#define CATEGORY_INPUT_INFO_0_JA "ゲームパッドとライトガンの設定を変更します。" +#define CATEGORY_EXPANSIONS_LABEL_JA "コントローラー拡張スロット" +#define CATEGORY_EXPANSIONS_INFO_0_JA "各コントローラー拡張スロットに接続されるデバイス (VMU、振動デバイス) を選択します。" +#define CATEGORY_VMU_LABEL_JA "ビジュアルメモリユニット" +#define CATEGORY_VMU_INFO_0_JA "ゲームごとの VMU セーブファイルと OSD VMU の表示設定を変更します。" +#define CORE_OPTION_NAME_REGION_LABEL_JA "地域" +#define OPTION_VAL_JAPAN_JA "日本" +#define OPTION_VAL_USA_JA "アメリカ合衆国" +#define OPTION_VAL_EUROPE_JA "ヨーロッパ" +#define OPTION_VAL_DEFAULT_JA "デフォルト" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_JA "言語" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_JA "BIOS や複数の言語を含むゲームで使用される言語を変更します。" +#define OPTION_VAL_JAPANESE_JA "日本語" +#define OPTION_VAL_ENGLISH_JA "英語" +#define OPTION_VAL_GERMAN_JA "ドイツ語" +#define OPTION_VAL_FRENCH_JA "フランス語" +#define OPTION_VAL_SPANISH_JA "スペイン語" +#define OPTION_VAL_ITALIAN_JA "イタリア語" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_JA "HLE BIOS (再起動が必要)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_JA "高レベルエミュレーション BIOS の使用を強制します。" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_JA "BIOS を起動する (再起動が必要)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_JA "ドリームキャストの BIOS メニューを起動します。" +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_JA "DSP を有効にする" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_JA "ドリームキャストのオーディオ DSP のエミュレーションを有効にします。生成されるサウンドの精度を向上させますが、パフォーマンス要件が増加します。" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_JA "アーケードサービスボタンを許可" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_JA "アーケードゲームでサービスボタンを有効にし、キャビネット設定を行います。" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_JA "NAOMI ゲームを無料プレイにする" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_JA "無料プレイを行うためにゲームのコイン設定を変更します。" +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_JA "ブロードバンドアダプタエミュレーション" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_JA "モデムの代わりにイーサネットブロードバンドアダプタをエミュレートします (再起動が必要)。" +#define CORE_OPTION_NAME_UPNP_LABEL_JA "UPnP を有効にする" +#define CORE_OPTION_NAME_UPNP_INFO_0_JA "オンラインゲーム用にルーターの UPnP を自動的に設定し使用します。" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_JA "内部解像度" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_JA "描画解像度を変更します。" +#define OPTION_VAL_320X240_JA "320x240 (半分)" +#define OPTION_VAL_640X480_JA "640x480 (ネイティブ)" +#define OPTION_VAL_800X600_JA NULL +#define OPTION_VAL_960X720_JA NULL +#define OPTION_VAL_1024X768_JA NULL +#define OPTION_VAL_1280X960_JA NULL +#define OPTION_VAL_1440X1080_JA NULL +#define OPTION_VAL_1600X1200_JA NULL +#define OPTION_VAL_1920X1440_JA NULL +#define OPTION_VAL_2560X1920_JA NULL +#define OPTION_VAL_2880X2160_JA NULL +#define OPTION_VAL_3200X2400_JA NULL +#define OPTION_VAL_3840X2880_JA NULL +#define OPTION_VAL_4480X3360_JA NULL +#define OPTION_VAL_5120X3840_JA NULL +#define OPTION_VAL_5760X4320_JA NULL +#define OPTION_VAL_6400X4800_JA NULL +#define OPTION_VAL_7040X5280_JA "7040x580 (x11)" +#define OPTION_VAL_7680X5760_JA NULL +#define OPTION_VAL_8320X6240_JA NULL +#define OPTION_VAL_8960X6720_JA NULL +#define OPTION_VAL_9600X7200_JA NULL +#define OPTION_VAL_10240X7680_JA NULL +#define OPTION_VAL_10880X8160_JA NULL +#define OPTION_VAL_11520X8640_JA NULL +#define OPTION_VAL_12160X9120_JA NULL +#define OPTION_VAL_12800X9600_JA NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_JA "ケーブルの種類" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_JA "出力信号の種類を選択します。[TV (コンポジット)] が最も広くサポートされています。" +#define OPTION_VAL_VGA_JA NULL +#define OPTION_VAL_TV_RGB_JA NULL +#define OPTION_VAL_TV_COMPOSITE_JA "TV (コンポジット)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_JA "放送方式" +#define OPTION_VAL_NTSC_JA NULL +#define OPTION_VAL_PAL_JA "PAL (世界)" +#define OPTION_VAL_PAL_N_JA "PAL-N (アルゼンチン, パラグアイ, ウルグアイ)" +#define OPTION_VAL_PAL_M_JA "PAL-M (ブラジル)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_JA "画面の向き" +#define OPTION_VAL_HORIZONTAL_JA "水平" +#define OPTION_VAL_VERTICAL_JA "垂直" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_JA "半透明ソート" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_JA "半透明ポリゴンがどのように並べ替えられるかを選択します。" +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_JA "ストリップ単位 (低精度, 高速)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_JA "トライアングル単位 (通常)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_JA "ピクセル単位 (高精度, 低速)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_JA "累積ピクセルバッファサイズ" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_JA "より高い解像度で正しく出力するには、より高い値が必要になる可能性があります。" +#define OPTION_VAL_512MB_JA NULL +#define OPTION_VAL_1GB_JA NULL +#define OPTION_VAL_2GB_JA NULL +#define OPTION_VAL_4GB_JA NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_JA "最大透明レイヤー数" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_JA "複雑なシーンでは、より高い値が必要になる可能性があります。" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_JA "完全なフレームバッファエミュレーション" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_JA "VRAM で完全なフレームバッファエミュレーションを有効にします。フレームバッファを VRAM で直接読み書きするゲームに便利です。有効にすると、内部解像度は 640x480 に固定され、実行速度に深刻な影響を与える可能性があります。" +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_JA "RTT (テクスチャへのレンダリング) バッファを有効にする" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_JA "レンダリングされたテクスチャを GPU から VRAM にコピーします。このオプションは通常、これを必要とするゲームで有効になります。有効にすると、テクスチャアップスケーリングが無効になり、実行速度に影響を与える可能性があります。" +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_JA "ミップマッピング" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_JA "有効にすると、テクスチャが遠くに表示される際に小さいバージョンが使用されます。パフォーマンスが向上し、チラつきが減少します。" +#define CORE_OPTION_NAME_FOG_LABEL_JA "フォグエフェクト" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_JA "ボリュームモディファイア" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_JA "オブジェクトの影を描画するためにゲームで一般的に使用されるドリームキャスト GPU の機能です。通常は有効にする必要があります。パフォーマンスへの影響は最小限か無視できる程度です。" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_JA "異方性フィルタリング" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_JA "カメラに対して斜めの視野角にあるテクスチャ表面の品質を向上させます。値を高くするほど GPU への負荷が大きくなります。この設定を反映するには再起動が必要です。" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_JA "テクスチャフィルタリング" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_JA "使用するテクスチャフィルタリングモードを選択します。すべてのテクスチャに特定のフィルタリングモードを強制することで、デフォルトよりも鮮明 (または滑らかな) 外観を得るために使用できます。デフォルト以外の値はレンダリングに問題が発生する可能性があります。この設定を反映するには再起動が必要です。" +#define OPTION_VAL_1_JA "強制ニアレストネイバー" +#define OPTION_VAL_2_JA "強制リニア" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_JA "フレーム入れ替え遅延" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_JA "画面の点滅やビデオの描画バグを回避するために便利です。遅いプラットフォームではお勧めしません。" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_JA "フレームレートの変更を検出" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_JA "内部フレームレートが変更された際にフロントエンドに通知します (例: 60fps から 30fps)。30fps または 20fps の固定フレームレートで実行されるゲームでフレームペーシングを改善します。ゲームが固定フレームレートでない場合は無効にする必要があります。注意: 自動フレームスキップが有効の場合は使用できません。" +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_JA "PowerVR2 ポストプロセスフィルター" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_JA "レンダリングされた画像にポストプロセスを適用し、PowerVR2 GPU およびアナログビデオ信号に特定の効果をシミュレートします。" +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_JA "テクスチャアップスケーリング (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_JA "手書きの 2D ピクセルアートグラフィックを強化します。2D ピクセルアートのゲームでのみ使用することをお勧めします。" +#define OPTION_VAL_2_O26_JA NULL +#define OPTION_VAL_4_JA NULL +#define OPTION_VAL_6_JA NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_JA "テクスチャアップスケーリング最大フィルターサイズ" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_JA "アップスケーリングされるテクスチャの最大サイズ値を選択します。テクスチャサイズが選択された値より大きい場合はアップスケーリングされなくなります。" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_JA "ネイティブ深度補完" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_JA "AMD GPU でテクスチャの破損や深度の問題を改善します。場合によっては インテル GPU でを改善することもできます。" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_JA "アップスケーリング滲み修正" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_JA "アップスケーリング時のテクスチャの滲みを改善します。2D ゲームのアップスケーリング時にピクセルが歪む場合、無効にすることで解決できます。" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_JA "スレッド化されたレンダリング" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_JA "GPU と CPU を別のスレッドで実行します。強く推奨されます。" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_JA "自動フレームスキップ" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_JA "エミュレータの動作が遅い場合、自動的にフレームをスキップします。注意: この設定は [レンダリングのスレッド化] が有効な場合にのみ適用されます。" +#define OPTION_VAL_SOME_JA "通常" +#define OPTION_VAL_MORE_JA "最大" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_JA "フレームスキップ" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_JA "表示される各フレーム間でスキップするフレーム数を設定します。" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_JA "ワイドスクリーンチート (再起動が必要)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_JA "特定のゲームをワイドスクリーン形式で表示できるようにするチートを有効にします。" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_JA "ワイドスクリーンハック" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_JA "通常の 4:3 アスペクト比の外側にジオメトリを描画します。新たに表示された領域でグラフィックに不具合が発生する可能性があります。" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_JA "GD-ROM 高速読み込み (不正確)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_JA "GD-ROM の読み込みを高速化します。" +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_JA "ドリームキャスト 32MB RAM MOD" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_JA "ドリームキャストの 32MB RAM MOD を有効にします。互換性に影響を与える可能性があります。" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_JA "SH4 CPU アンダー/オーバークロック" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_JA "SH4 メイン CPU クロックをデフォルトの 200 MHz から変更します。アンダークロックは遅いプラットフォームで動作を改善する可能性があります。オーバークロックは一部のゲームのフレームレートを上昇させる可能性があります。注意して使用してください。" +#define OPTION_VAL_100_JA NULL +#define OPTION_VAL_110_JA NULL +#define OPTION_VAL_120_JA NULL +#define OPTION_VAL_130_JA NULL +#define OPTION_VAL_140_JA NULL +#define OPTION_VAL_150_JA NULL +#define OPTION_VAL_160_JA NULL +#define OPTION_VAL_170_JA NULL +#define OPTION_VAL_180_JA NULL +#define OPTION_VAL_190_JA NULL +#define OPTION_VAL_200_JA NULL +#define OPTION_VAL_210_JA NULL +#define OPTION_VAL_220_JA NULL +#define OPTION_VAL_230_JA NULL +#define OPTION_VAL_240_JA NULL +#define OPTION_VAL_250_JA NULL +#define OPTION_VAL_260_JA NULL +#define OPTION_VAL_270_JA NULL +#define OPTION_VAL_280_JA NULL +#define OPTION_VAL_290_JA NULL +#define OPTION_VAL_300_JA NULL +#define OPTION_VAL_310_JA NULL +#define OPTION_VAL_320_JA NULL +#define OPTION_VAL_330_JA NULL +#define OPTION_VAL_340_JA NULL +#define OPTION_VAL_350_JA NULL +#define OPTION_VAL_360_JA NULL +#define OPTION_VAL_370_JA NULL +#define OPTION_VAL_380_JA NULL +#define OPTION_VAL_390_JA NULL +#define OPTION_VAL_400_JA NULL +#define OPTION_VAL_410_JA NULL +#define OPTION_VAL_420_JA NULL +#define OPTION_VAL_430_JA NULL +#define OPTION_VAL_440_JA NULL +#define OPTION_VAL_450_JA NULL +#define OPTION_VAL_460_JA NULL +#define OPTION_VAL_470_JA NULL +#define OPTION_VAL_480_JA NULL +#define OPTION_VAL_490_JA NULL +#define OPTION_VAL_500_JA NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_JA "カスタムテクスチャをロード" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_JA "[system/dc/textures//] フォルダに置かれたカスタムテクスチャを読み込みます。" +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_JA "テクスチャをダンプ" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_JA "ゲームで新しいテクスチャが使用されるたび、テクスチャを .png ファイルとして [system/dc/texdump/] フォルダに保存します。" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_JA "アナログスティックデッドゾーン" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_JA "アナログスティックが処理され始めるまでどれだけ傾ける必要があるかを選択します。" +#define OPTION_VAL_0_JA NULL +#define OPTION_VAL_5_JA NULL +#define OPTION_VAL_10_JA NULL +#define OPTION_VAL_15_JA NULL +#define OPTION_VAL_20_JA NULL +#define OPTION_VAL_25_JA NULL +#define OPTION_VAL_30_JA NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_JA "トリガーデッドゾーン" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_JA "トリガーが処理されるまでどれだけ押し込む必要があるかを選択します。" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_JA "デジタルトリガー" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_JA "有効にすると、トリガーは通常のボタンのように処理されます。つまり、押し込み量は考慮されず、完全に押されているか全く押されていないかのように処理されます。" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_JA "デジタル出力配信" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_JA "TCP ポート 8000 でデジタル出力とフォースフィードバックの状態を配信します。MAME の [-output network] オプションと互換性があります。" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_JA "ライトガン設定を表示" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_JA "ライトガンのクロスヘア表示に関する設定を有効にします。注意: この設定を反映するにはクイックメニューを開き直す必要があります。" +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_JA "ガンクロスヘアサイズ表示倍率" +#define OPTION_VAL_50_JA NULL +#define OPTION_VAL_60_JA NULL +#define OPTION_VAL_70_JA NULL +#define OPTION_VAL_80_JA NULL +#define OPTION_VAL_90_JA NULL +#define OPTION_VAL_100_O45_JA NULL +#define OPTION_VAL_110_O45_JA NULL +#define OPTION_VAL_120_O45_JA NULL +#define OPTION_VAL_130_O45_JA NULL +#define OPTION_VAL_140_O45_JA NULL +#define OPTION_VAL_150_O45_JA NULL +#define OPTION_VAL_160_O45_JA NULL +#define OPTION_VAL_170_O45_JA NULL +#define OPTION_VAL_180_O45_JA NULL +#define OPTION_VAL_190_O45_JA NULL +#define OPTION_VAL_200_O45_JA NULL +#define OPTION_VAL_210_O45_JA NULL +#define OPTION_VAL_220_O45_JA NULL +#define OPTION_VAL_230_O45_JA NULL +#define OPTION_VAL_240_O45_JA NULL +#define OPTION_VAL_250_O45_JA NULL +#define OPTION_VAL_260_O45_JA NULL +#define OPTION_VAL_270_O45_JA NULL +#define OPTION_VAL_280_O45_JA NULL +#define OPTION_VAL_290_O45_JA NULL +#define OPTION_VAL_300_O45_JA NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_JA "ガンクロスヘア 1 表示" +#define OPTION_VAL_WHITE_JA "白" +#define OPTION_VAL_RED_JA "レッド" +#define OPTION_VAL_GREEN_JA "グリーン" +#define OPTION_VAL_BLUE_JA "ブルー" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_JA "ガンクロスヘア 2 表示" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_JA "ガンクロスヘア 3 表示" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_JA "ガンクロスヘア 4 表示" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_JA "拡張スロット A1 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_JA "拡張スロット A1 (ポート A スロット 1) に接続するデバイスを選択します。" +#define OPTION_VAL_VMU_JA NULL +#define OPTION_VAL_PURUPURU_JA "ぷるぷるぱっく" +#define OPTION_VAL_NONE_JA "なし" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_JA "拡張スロット A2 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_JA "拡張スロット A2 (ポート A スロット 2) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_JA "拡張スロット B1 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_JA "拡張スロット B1 (ポート B スロット 1) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_JA "拡張スロット B2 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_JA "拡張スロット B2 (ポート B スロット 2) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_JA "拡張スロット C1 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_JA "拡張スロット C1 (ポート C スロット 1) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_JA "拡張スロット C2 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_JA "拡張スロット C2 (ポート C スロット 2) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_JA "拡張スロット D1 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_JA "拡張スロット D1 (ポート D スロット 1) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_JA "拡張スロット D2 デバイス" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_JA "拡張スロット D2 (ポート D スロット 2) に接続するデバイスを選択します。" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_JA "ゲームごとのビジュアルメモリユニット/システム (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_JA "ゲームごとの VMU" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_JA NULL +#define OPTION_VAL_VMU_A1_JA NULL +#define OPTION_VAL_ALL_VMUS_JA "すべての VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_JA "ビジュアルメモリユニット/システム (VMU) サウンド" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_JA "VMU サウンド" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_JA "有効にすると、VMU ビープ音が再生されます。" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_JA "ビジュアルメモリユニット/システム (VMU) 表示設定を表示" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_JA "VMU 表示設定を表示" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_JA "エミュレートされた VMU 液晶ディスプレイの表示/非表示、サイズ、位置および色の設定を有効にします。注意: この設定を反映するにはクイックメニューを開き直す必要があります。" +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_JA "VMU 画面 1 表示" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_JA "VMU 画面 1 位置" +#define OPTION_VAL_UPPER_LEFT_JA "左上" +#define OPTION_VAL_UPPER_RIGHT_JA "右上" +#define OPTION_VAL_LOWER_LEFT_JA "左下" +#define OPTION_VAL_LOWER_RIGHT_JA "右下" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_JA "VMU 画面 1 サイズ" +#define OPTION_VAL_1X_JA NULL +#define OPTION_VAL_3X_JA NULL +#define OPTION_VAL_5X_JA NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_JA "VMU 画面 1ピクセルオンカラー" +#define OPTION_VAL_DEFAULT_ON_00_JA "デフォルトでオン" +#define OPTION_VAL_DEFAULT_OFF_01_JA "デフォルトでオフ" +#define OPTION_VAL_BLACK_02_JA "黒" +#define OPTION_VAL_LIGHT_BLUE_04_JA "ライトブルー" +#define OPTION_VAL_CYAN_06_JA "シアン" +#define OPTION_VAL_CYAN_BLUE_07_JA "シアンブルー" +#define OPTION_VAL_LIGHT_GREEN_08_JA "ライトグリーン" +#define OPTION_VAL_CYAN_GREEN_09_JA "シアングリーン" +#define OPTION_VAL_LIGHT_CYAN_10_JA "ライトシアン" +#define OPTION_VAL_PURPLE_12_JA "紫" +#define OPTION_VAL_LIGHT_PURPLE_13_JA "ライトパープル" +#define OPTION_VAL_YELLOW_14_JA "イエロー" +#define OPTION_VAL_GRAY_15_JA "グレー" +#define OPTION_VAL_LIGHT_PURPLE_2_16_JA "ライトパープル (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_JA "ライトグリーン (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_JA "ライトグリーン (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_JA "ライトシアン (2)" +#define OPTION_VAL_LIGHT_RED_2_20_JA "ライトレッド (2)" +#define OPTION_VAL_MAGENTA_21_JA "マゼンタ" +#define OPTION_VAL_LIGHT_PURPLE_3_22_JA "ライトパープル (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_JA "ライトオレンジ" +#define OPTION_VAL_ORANGE_24_JA "オレンジ" +#define OPTION_VAL_LIGHT_PURPLE_4_25_JA "ライトパープル (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_JA "ライトイエロー" +#define OPTION_VAL_LIGHT_YELLOW_2_27_JA "ライトイエロー (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_JA "VMU 画面 1ピクセルオフカラー" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_JA "VMU 画面 1 不透明度" +#define OPTION_VAL_40_JA NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_JA "VMU 画面 2 表示" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_JA "VMU 画面 2 位置" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_JA "VMU 画面 2 サイズ" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_JA "VMU 画面 2 ピクセルオンカラー" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_JA "VMU 画面 2 ピクセルオフカラー" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_JA "VMU 画面 2 不透明度" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_JA "VMU 画面 3 表示" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_JA "VMU 画面 3 位置" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_JA "VMU 画面 3 サイズ" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_JA "VMU 画面 3 ピクセルオンカラー" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_JA "VMU 画面 3 ピクセルオフカラー" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_JA "VMU 画面 3 不透明度" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_JA "VMU 画面 4 表示" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_JA "VMU 画面 4 位置" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_JA "VMU 画面 4 サイズ" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_JA "VMU 画面 4 ピクセルオンカラー" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_JA "VMU 画面 4 ピクセルオフカラー" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_JA "VMU 画面 4 不透明度" + +struct retro_core_option_v2_category option_cats_ja[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_JA, + CATEGORY_SYSTEM_INFO_0_JA + }, + { + "video", + CATEGORY_VIDEO_LABEL_JA, + CATEGORY_VIDEO_INFO_0_JA + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_JA, + CATEGORY_PERFORMANCE_INFO_0_JA + }, + { + "hacks", + CATEGORY_HACKS_LABEL_JA, + CATEGORY_HACKS_INFO_0_JA }, { "input", - CATEGORY_INPUT_LABEL_KO, - CATEGORY_INPUT_INFO_0_KO + CATEGORY_INPUT_LABEL_JA, + CATEGORY_INPUT_INFO_0_JA + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_JA, + CATEGORY_EXPANSIONS_INFO_0_JA }, { "vmu", - CATEGORY_VMU_LABEL_KO, - CATEGORY_VMU_INFO_0_KO + CATEGORY_VMU_LABEL_JA, + CATEGORY_VMU_INFO_0_JA }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_ko[] = { +struct retro_core_option_v2_definition option_defs_ja[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_KO, + CORE_OPTION_NAME_REGION_LABEL_JA, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_KO }, - { "USA", OPTION_VAL_USA_KO }, - { "Europe", OPTION_VAL_EUROPE_KO }, - { "Default", OPTION_VAL_DEFAULT_KO }, + { "Japan", OPTION_VAL_JAPAN_JA }, + { "USA", OPTION_VAL_USA_JA }, + { "Europe", OPTION_VAL_EUROPE_JA }, + { "Default", OPTION_VAL_DEFAULT_JA }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_KO, + CORE_OPTION_NAME_LANGUAGE_LABEL_JA, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_KO, + CORE_OPTION_NAME_LANGUAGE_INFO_0_JA, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_KO }, - { "English", OPTION_VAL_ENGLISH_KO }, - { "German", OPTION_VAL_GERMAN_KO }, - { "French", OPTION_VAL_FRENCH_KO }, - { "Spanish", OPTION_VAL_SPANISH_KO }, - { "Italian", OPTION_VAL_ITALIAN_KO }, - { "Default", OPTION_VAL_DEFAULT_KO }, + { "Japanese", OPTION_VAL_JAPANESE_JA }, + { "English", OPTION_VAL_ENGLISH_JA }, + { "German", OPTION_VAL_GERMAN_JA }, + { "French", OPTION_VAL_FRENCH_JA }, + { "Spanish", OPTION_VAL_SPANISH_JA }, + { "Italian", OPTION_VAL_ITALIAN_JA }, + { "Default", OPTION_VAL_DEFAULT_JA }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_KO, + CORE_OPTION_NAME_HLE_BIOS_LABEL_JA, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_KO, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_JA, NULL, "system", { @@ -43599,9 +48790,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_KO, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_JA, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_KO, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_JA, NULL, "system", { @@ -43613,9 +48804,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_KO, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_JA, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_KO, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_JA, NULL, "system", { @@ -43629,25 +48820,11 @@ struct retro_core_option_v2_definition option_defs_ko[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_KO, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_KO, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_KO, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_JA, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_KO, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_JA, NULL, "system", { @@ -43659,9 +48836,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_KO, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_JA, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_KO, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_JA, NULL, "system", { @@ -43673,9 +48850,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_JA, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_JA, NULL, "system", { @@ -43687,9 +48864,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_KO, + CORE_OPTION_NAME_UPNP_LABEL_JA, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_KO, + CORE_OPTION_NAME_UPNP_INFO_0_JA, NULL, "system", { @@ -43702,39 +48879,39 @@ struct retro_core_option_v2_definition option_defs_ko[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_KO, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_JA, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_KO, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_JA, NULL, "video", { - { "320x240", OPTION_VAL_320X240_KO }, - { "640x480", OPTION_VAL_640X480_KO }, - { "800x600", OPTION_VAL_800X600_KO }, - { "960x720", OPTION_VAL_960X720_KO }, - { "1024x768", OPTION_VAL_1024X768_KO }, - { "1280x960", OPTION_VAL_1280X960_KO }, - { "1440x1080", OPTION_VAL_1440X1080_KO }, - { "1600x1200", OPTION_VAL_1600X1200_KO }, - { "1920x1440", OPTION_VAL_1920X1440_KO }, - { "2560x1920", OPTION_VAL_2560X1920_KO }, - { "2880x2160", OPTION_VAL_2880X2160_KO }, - { "3200x2400", OPTION_VAL_3200X2400_KO }, - { "3840x2880", OPTION_VAL_3840X2880_KO }, - { "4480x3360", OPTION_VAL_4480X3360_KO }, - { "5120x3840", OPTION_VAL_5120X3840_KO }, - { "5760x4320", OPTION_VAL_5760X4320_KO }, - { "6400x4800", OPTION_VAL_6400X4800_KO }, - { "7040x5280", OPTION_VAL_7040X5280_KO }, - { "7680x5760", OPTION_VAL_7680X5760_KO }, - { "8320x6240", OPTION_VAL_8320X6240_KO }, - { "8960x6720", OPTION_VAL_8960X6720_KO }, - { "9600x7200", OPTION_VAL_9600X7200_KO }, - { "10240x7680", OPTION_VAL_10240X7680_KO }, - { "10880x8160", OPTION_VAL_10880X8160_KO }, - { "11520x8640", OPTION_VAL_11520X8640_KO }, - { "12160x9120", OPTION_VAL_12160X9120_KO }, - { "12800x9600", OPTION_VAL_12800X9600_KO }, + { "320x240", OPTION_VAL_320X240_JA }, + { "640x480", OPTION_VAL_640X480_JA }, + { "800x600", OPTION_VAL_800X600_JA }, + { "960x720", OPTION_VAL_960X720_JA }, + { "1024x768", OPTION_VAL_1024X768_JA }, + { "1280x960", OPTION_VAL_1280X960_JA }, + { "1440x1080", OPTION_VAL_1440X1080_JA }, + { "1600x1200", OPTION_VAL_1600X1200_JA }, + { "1920x1440", OPTION_VAL_1920X1440_JA }, + { "2560x1920", OPTION_VAL_2560X1920_JA }, + { "2880x2160", OPTION_VAL_2880X2160_JA }, + { "3200x2400", OPTION_VAL_3200X2400_JA }, + { "3840x2880", OPTION_VAL_3840X2880_JA }, + { "4480x3360", OPTION_VAL_4480X3360_JA }, + { "5120x3840", OPTION_VAL_5120X3840_JA }, + { "5760x4320", OPTION_VAL_5760X4320_JA }, + { "6400x4800", OPTION_VAL_6400X4800_JA }, + { "7040x5280", OPTION_VAL_7040X5280_JA }, + { "7680x5760", OPTION_VAL_7680X5760_JA }, + { "8320x6240", OPTION_VAL_8320X6240_JA }, + { "8960x6720", OPTION_VAL_8960X6720_JA }, + { "9600x7200", OPTION_VAL_9600X7200_JA }, + { "10240x7680", OPTION_VAL_10240X7680_JA }, + { "10880x8160", OPTION_VAL_10880X8160_JA }, + { "11520x8640", OPTION_VAL_11520X8640_JA }, + { "12160x9120", OPTION_VAL_12160X9120_JA }, + { "12800x9600", OPTION_VAL_12800X9600_JA }, { NULL, NULL }, }, #ifdef LOW_RES @@ -43745,62 +48922,62 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_KO, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_JA, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_KO, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_JA, NULL, "video", { - { "VGA", OPTION_VAL_VGA_KO }, - { "TV (RGB)", OPTION_VAL_TV_RGB_KO }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_KO }, + { "VGA", OPTION_VAL_VGA_JA }, + { "TV (RGB)", OPTION_VAL_TV_RGB_JA }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_JA }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_KO, + CORE_OPTION_NAME_BROADCAST_LABEL_JA, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_KO }, - { "PAL", OPTION_VAL_PAL_KO }, - { "PAL_N", OPTION_VAL_PAL_N_KO }, - { "PAL_M", OPTION_VAL_PAL_M_KO }, - { "Default", OPTION_VAL_DEFAULT_KO }, + { "NTSC", OPTION_VAL_NTSC_JA }, + { "PAL", OPTION_VAL_PAL_JA }, + { "PAL_N", OPTION_VAL_PAL_N_JA }, + { "PAL_M", OPTION_VAL_PAL_M_JA }, + { "Default", OPTION_VAL_DEFAULT_JA }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_KO, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_JA, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_KO }, - { "vertical", OPTION_VAL_VERTICAL_KO }, + { "horizontal", OPTION_VAL_HORIZONTAL_JA }, + { "vertical", OPTION_VAL_VERTICAL_JA }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_KO, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_JA, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_KO }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_KO }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_JA }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_JA }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_KO }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_JA }, #endif { NULL, NULL }, }, @@ -43813,25 +48990,25 @@ struct retro_core_option_v2_definition option_defs_ko[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_KO, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_JA, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_KO, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_JA, NULL, "video", { - { "512MB", OPTION_VAL_512MB_KO }, - { "1GB", OPTION_VAL_1GB_KO }, - { "2GB", OPTION_VAL_2GB_KO }, - { "4GB", OPTION_VAL_4GB_KO }, + { "512MB", OPTION_VAL_512MB_JA }, + { "1GB", OPTION_VAL_1GB_JA }, + { "2GB", OPTION_VAL_2GB_JA }, + { "4GB", OPTION_VAL_4GB_JA }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_KO, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_JA, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_KO, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_JA, NULL, "video", { @@ -43839,6 +49016,7 @@ struct retro_core_option_v2_definition option_defs_ko[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -43847,9 +49025,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_KO, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_JA, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_KO, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_JA, NULL, "video", { @@ -43861,9 +49039,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_KO, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_JA, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_KO, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_JA, NULL, "video", { @@ -43873,11 +49051,11 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_KO, + CORE_OPTION_NAME_MIPMAPPING_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_JA, NULL, "video", { @@ -43889,7 +49067,7 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_KO, + CORE_OPTION_NAME_FOG_LABEL_JA, NULL, "", NULL, @@ -43903,9 +49081,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_KO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_JA, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_KO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_JA, NULL, "video", { @@ -43917,9 +49095,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_KO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_JA, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_KO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_JA, NULL, "video", { @@ -43934,24 +49112,24 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_KO, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_JA, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_KO, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_JA, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_KO }, - { "1", OPTION_VAL_1_KO }, - { "2", OPTION_VAL_2_KO }, + { "0", OPTION_VAL_DEFAULT_JA }, + { "1", OPTION_VAL_1_JA }, + { "2", OPTION_VAL_2_JA }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_KO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_JA, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_KO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_JA, NULL, "video", { @@ -43959,13 +49137,13 @@ struct retro_core_option_v2_definition option_defs_ko[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_KO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_JA, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_KO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_JA, NULL, "video", { @@ -43977,9 +49155,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_KO, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_JA, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_KO, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_JA, NULL, "video", { @@ -43992,25 +49170,25 @@ struct retro_core_option_v2_definition option_defs_ko[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_KO, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_JA, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_KO, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_JA, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_KO }, - { "4", OPTION_VAL_4_KO }, - { "6", OPTION_VAL_6_KO }, + { "2", OPTION_VAL_2_O26_JA }, + { "4", OPTION_VAL_4_JA }, + { "6", OPTION_VAL_6_JA }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_KO, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_JA, NULL, "video", { @@ -44024,9 +49202,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_KO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_JA, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_KO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_JA, NULL, "video", { @@ -44036,11 +49214,25 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_JA, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_JA, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_KO, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_JA, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_KO, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_JA, NULL, "performance", { @@ -44052,15 +49244,15 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_KO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_JA, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_KO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_JA, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_KO }, - { "more", OPTION_VAL_MORE_KO }, + { "some", OPTION_VAL_SOME_JA }, + { "more", OPTION_VAL_MORE_JA }, { NULL, NULL }, }, #ifdef LOW_END @@ -44071,9 +49263,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_KO, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_JA, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_KO, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_JA, NULL, "performance", { @@ -44090,9 +49282,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_KO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_JA, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_KO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_JA, NULL, "hacks", { @@ -44104,9 +49296,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_KO, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_JA, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_KO, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_JA, NULL, "hacks", { @@ -44118,9 +49310,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_KO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_JA, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_KO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_JA, NULL, "hacks", { @@ -44135,131 +49327,93 @@ struct retro_core_option_v2_definition option_defs_ko[] = { #endif }, { - CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_KO, - NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_KO, - NULL, - "hacks", - { - { "100", OPTION_VAL_100_KO }, - { "110", OPTION_VAL_110_KO }, - { "120", OPTION_VAL_120_KO }, - { "130", OPTION_VAL_130_KO }, - { "140", OPTION_VAL_140_KO }, - { "150", OPTION_VAL_150_KO }, - { "160", OPTION_VAL_160_KO }, - { "170", OPTION_VAL_170_KO }, - { "180", OPTION_VAL_180_KO }, - { "190", OPTION_VAL_190_KO }, - { "200", OPTION_VAL_200_KO }, - { "210", OPTION_VAL_210_KO }, - { "220", OPTION_VAL_220_KO }, - { "230", OPTION_VAL_230_KO }, - { "240", OPTION_VAL_240_KO }, - { "250", OPTION_VAL_250_KO }, - { "260", OPTION_VAL_260_KO }, - { "270", OPTION_VAL_270_KO }, - { "280", OPTION_VAL_280_KO }, - { "290", OPTION_VAL_290_KO }, - { "300", OPTION_VAL_300_KO }, - { "310", OPTION_VAL_310_KO }, - { "320", OPTION_VAL_320_KO }, - { "330", OPTION_VAL_330_KO }, - { "340", OPTION_VAL_340_KO }, - { "350", OPTION_VAL_350_KO }, - { "360", OPTION_VAL_360_KO }, - { "370", OPTION_VAL_370_KO }, - { "380", OPTION_VAL_380_KO }, - { "390", OPTION_VAL_390_KO }, - { "400", OPTION_VAL_400_KO }, - { "410", OPTION_VAL_410_KO }, - { "420", OPTION_VAL_420_KO }, - { "430", OPTION_VAL_430_KO }, - { "440", OPTION_VAL_440_KO }, - { "450", OPTION_VAL_450_KO }, - { "460", OPTION_VAL_460_KO }, - { "470", OPTION_VAL_470_KO }, - { "480", OPTION_VAL_480_KO }, - { "490", OPTION_VAL_490_KO }, - { "500", OPTION_VAL_500_KO }, - { NULL, NULL }, - }, - "200", - }, - { - CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_KO, - NULL, - "", - NULL, - "hacks", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, - {/* TODO: probably needs explanation */ - CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_KO, + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_JA, NULL, "hacks", { { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "enabled", NULL }, + { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_KO, + CORE_OPTION_NAME "_sh4clock", + CORE_OPTION_NAME_SH4CLOCK_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_SH4CLOCK_INFO_0_JA, NULL, - "input", + "hacks", { - { "0%", OPTION_VAL_0_KO }, - { "5%", OPTION_VAL_5_KO }, - { "10%", OPTION_VAL_10_KO }, - { "15%", OPTION_VAL_15_KO }, - { "20%", OPTION_VAL_20_KO }, - { "25%", OPTION_VAL_25_KO }, - { "30%", OPTION_VAL_30_KO }, - { NULL, NULL }, - }, - "15%", - }, - { - CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_KO, + { "100", OPTION_VAL_100_JA }, + { "110", OPTION_VAL_110_JA }, + { "120", OPTION_VAL_120_JA }, + { "130", OPTION_VAL_130_JA }, + { "140", OPTION_VAL_140_JA }, + { "150", OPTION_VAL_150_JA }, + { "160", OPTION_VAL_160_JA }, + { "170", OPTION_VAL_170_JA }, + { "180", OPTION_VAL_180_JA }, + { "190", OPTION_VAL_190_JA }, + { "200", OPTION_VAL_200_JA }, + { "210", OPTION_VAL_210_JA }, + { "220", OPTION_VAL_220_JA }, + { "230", OPTION_VAL_230_JA }, + { "240", OPTION_VAL_240_JA }, + { "250", OPTION_VAL_250_JA }, + { "260", OPTION_VAL_260_JA }, + { "270", OPTION_VAL_270_JA }, + { "280", OPTION_VAL_280_JA }, + { "290", OPTION_VAL_290_JA }, + { "300", OPTION_VAL_300_JA }, + { "310", OPTION_VAL_310_JA }, + { "320", OPTION_VAL_320_JA }, + { "330", OPTION_VAL_330_JA }, + { "340", OPTION_VAL_340_JA }, + { "350", OPTION_VAL_350_JA }, + { "360", OPTION_VAL_360_JA }, + { "370", OPTION_VAL_370_JA }, + { "380", OPTION_VAL_380_JA }, + { "390", OPTION_VAL_390_JA }, + { "400", OPTION_VAL_400_JA }, + { "410", OPTION_VAL_410_JA }, + { "420", OPTION_VAL_420_JA }, + { "430", OPTION_VAL_430_JA }, + { "440", OPTION_VAL_440_JA }, + { "450", OPTION_VAL_450_JA }, + { "460", OPTION_VAL_460_JA }, + { "470", OPTION_VAL_470_JA }, + { "480", OPTION_VAL_480_JA }, + { "490", OPTION_VAL_490_JA }, + { "500", OPTION_VAL_500_JA }, + { NULL, NULL }, + }, + "200", + }, + { + CORE_OPTION_NAME "_custom_textures", + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_JA, NULL, - "input", + "hacks", { - { "0%", OPTION_VAL_0_KO }, - { "5%", OPTION_VAL_5_KO }, - { "10%", OPTION_VAL_10_KO }, - { "15%", OPTION_VAL_15_KO }, - { "20%", OPTION_VAL_20_KO }, - { "25%", OPTION_VAL_25_KO }, - { "30%", OPTION_VAL_30_KO }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "0%", + "disabled", }, { - CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_KO, + CORE_OPTION_NAME "_dump_textures", + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_JA, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_JA, NULL, - "input", + "hacks", { { "disabled", NULL }, { "enabled", NULL }, @@ -44268,10 +49422,48 @@ struct retro_core_option_v2_definition option_defs_ko[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_KO, + CORE_OPTION_NAME "_analog_stick_deadzone", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_JA, + NULL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_JA, + NULL, + "input", + { + { "0%", OPTION_VAL_0_JA }, + { "5%", OPTION_VAL_5_JA }, + { "10%", OPTION_VAL_10_JA }, + { "15%", OPTION_VAL_15_JA }, + { "20%", OPTION_VAL_20_JA }, + { "25%", OPTION_VAL_25_JA }, + { "30%", OPTION_VAL_30_JA }, + { NULL, NULL }, + }, + "15%", + }, + { + CORE_OPTION_NAME "_trigger_deadzone", + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_JA, + NULL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_JA, + NULL, + "input", + { + { "0%", OPTION_VAL_0_JA }, + { "5%", OPTION_VAL_5_JA }, + { "10%", OPTION_VAL_10_JA }, + { "15%", OPTION_VAL_15_JA }, + { "20%", OPTION_VAL_20_JA }, + { "25%", OPTION_VAL_25_JA }, + { "30%", OPTION_VAL_30_JA }, + { NULL, NULL }, + }, + "0%", + }, + { + CORE_OPTION_NAME "_digital_triggers", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_JA, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_KO, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_JA, NULL, "input", { @@ -44279,13 +49471,13 @@ struct retro_core_option_v2_definition option_defs_ko[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_KO, + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_JA, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_KO, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_JA, NULL, "input", { @@ -44297,9 +49489,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_KO, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_JA, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_KO, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_JA, NULL, "input", { @@ -44309,94 +49501,252 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_JA, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_JA }, + { "60%", OPTION_VAL_60_JA }, + { "70%", OPTION_VAL_70_JA }, + { "80%", OPTION_VAL_80_JA }, + { "90%", OPTION_VAL_90_JA }, + { "100%", OPTION_VAL_100_O45_JA }, + { "110%", OPTION_VAL_110_O45_JA }, + { "120%", OPTION_VAL_120_O45_JA }, + { "130%", OPTION_VAL_130_O45_JA }, + { "140%", OPTION_VAL_140_O45_JA }, + { "150%", OPTION_VAL_150_O45_JA }, + { "160%", OPTION_VAL_160_O45_JA }, + { "170%", OPTION_VAL_170_O45_JA }, + { "180%", OPTION_VAL_180_O45_JA }, + { "190%", OPTION_VAL_190_O45_JA }, + { "200%", OPTION_VAL_200_O45_JA }, + { "210%", OPTION_VAL_210_O45_JA }, + { "220%", OPTION_VAL_220_O45_JA }, + { "230%", OPTION_VAL_230_O45_JA }, + { "240%", OPTION_VAL_240_O45_JA }, + { "250%", OPTION_VAL_250_O45_JA }, + { "260%", OPTION_VAL_260_O45_JA }, + { "270%", OPTION_VAL_270_O45_JA }, + { "280%", OPTION_VAL_280_O45_JA }, + { "290%", OPTION_VAL_290_O45_JA }, + { "300%", OPTION_VAL_300_O45_JA }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_KO, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_JA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_KO }, - { "Red", OPTION_VAL_RED_KO }, - { "Green", OPTION_VAL_GREEN_KO }, - { "Blue", OPTION_VAL_BLUE_KO }, + { "White", OPTION_VAL_WHITE_JA }, + { "Red", OPTION_VAL_RED_JA }, + { "Green", OPTION_VAL_GREEN_JA }, + { "Blue", OPTION_VAL_BLUE_JA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_KO, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_JA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_KO }, - { "Red", OPTION_VAL_RED_KO }, - { "Green", OPTION_VAL_GREEN_KO }, - { "Blue", OPTION_VAL_BLUE_KO }, + { "White", OPTION_VAL_WHITE_JA }, + { "Red", OPTION_VAL_RED_JA }, + { "Green", OPTION_VAL_GREEN_JA }, + { "Blue", OPTION_VAL_BLUE_JA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_KO, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_JA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_KO }, - { "Red", OPTION_VAL_RED_KO }, - { "Green", OPTION_VAL_GREEN_KO }, - { "Blue", OPTION_VAL_BLUE_KO }, + { "White", OPTION_VAL_WHITE_JA }, + { "Red", OPTION_VAL_RED_JA }, + { "Green", OPTION_VAL_GREEN_JA }, + { "Blue", OPTION_VAL_BLUE_JA }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_KO, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_JA, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_KO }, - { "Red", OPTION_VAL_RED_KO }, - { "Green", OPTION_VAL_GREEN_KO }, - { "Blue", OPTION_VAL_BLUE_KO }, + { "White", OPTION_VAL_WHITE_JA }, + { "Red", OPTION_VAL_RED_JA }, + { "Green", OPTION_VAL_GREEN_JA }, + { "Blue", OPTION_VAL_BLUE_JA }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_JA, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_JA, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_JA }, + { "Purupuru", OPTION_VAL_PURUPURU_JA }, + { "None", OPTION_VAL_NONE_JA }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_KO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_KO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_KO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_JA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_JA, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_JA, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_KO }, - { "All VMUs", OPTION_VAL_ALL_VMUS_KO }, + { "VMU A1", OPTION_VAL_VMU_A1_JA }, + { "All VMUs", OPTION_VAL_ALL_VMUS_JA }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_KO, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_KO, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_KO, + CORE_OPTION_NAME_VMU_SOUND_LABEL_JA, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_JA, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_JA, NULL, "vmu", { @@ -44407,9 +49757,9 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_KO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_KO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_KO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_JA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_JA, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_JA, NULL, "vmu", { @@ -44421,7 +49771,7 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_KO, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_JA, NULL, "", NULL, @@ -44435,144 +49785,144 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_KO, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_JA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_KO, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_JA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_KO }, - { "2x", OPTION_VAL_2_O27_KO }, - { "3x", OPTION_VAL_3X_KO }, - { "4x", OPTION_VAL_4_KO }, - { "5x", OPTION_VAL_5X_KO }, + { "1x", OPTION_VAL_1X_JA }, + { "2x", OPTION_VAL_2_O26_JA }, + { "3x", OPTION_VAL_3X_JA }, + { "4x", OPTION_VAL_4_JA }, + { "5x", OPTION_VAL_5X_JA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_KO, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_JA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_KO }, - { "20%", OPTION_VAL_20_KO }, - { "30%", OPTION_VAL_30_KO }, - { "40%", OPTION_VAL_40_KO }, - { "50%", OPTION_VAL_50_KO }, - { "60%", OPTION_VAL_60_KO }, - { "70%", OPTION_VAL_70_KO }, - { "80%", OPTION_VAL_80_KO }, - { "90%", OPTION_VAL_90_KO }, - { "100%", OPTION_VAL_100_O57_KO }, + { "10%", OPTION_VAL_10_JA }, + { "20%", OPTION_VAL_20_JA }, + { "30%", OPTION_VAL_30_JA }, + { "40%", OPTION_VAL_40_JA }, + { "50%", OPTION_VAL_50_JA }, + { "60%", OPTION_VAL_60_JA }, + { "70%", OPTION_VAL_70_JA }, + { "80%", OPTION_VAL_80_JA }, + { "90%", OPTION_VAL_90_JA }, + { "100%", OPTION_VAL_100_O45_JA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_KO, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_JA, NULL, "", NULL, @@ -44586,144 +49936,144 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_KO, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_JA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_KO, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_JA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_KO }, - { "2x", OPTION_VAL_2_O27_KO }, - { "3x", OPTION_VAL_3X_KO }, - { "4x", OPTION_VAL_4_KO }, - { "5x", OPTION_VAL_5X_KO }, + { "1x", OPTION_VAL_1X_JA }, + { "2x", OPTION_VAL_2_O26_JA }, + { "3x", OPTION_VAL_3X_JA }, + { "4x", OPTION_VAL_4_JA }, + { "5x", OPTION_VAL_5X_JA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_KO, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_JA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_KO }, - { "20%", OPTION_VAL_20_KO }, - { "30%", OPTION_VAL_30_KO }, - { "40%", OPTION_VAL_40_KO }, - { "50%", OPTION_VAL_50_KO }, - { "60%", OPTION_VAL_60_KO }, - { "70%", OPTION_VAL_70_KO }, - { "80%", OPTION_VAL_80_KO }, - { "90%", OPTION_VAL_90_KO }, - { "100%", OPTION_VAL_100_O57_KO }, + { "10%", OPTION_VAL_10_JA }, + { "20%", OPTION_VAL_20_JA }, + { "30%", OPTION_VAL_30_JA }, + { "40%", OPTION_VAL_40_JA }, + { "50%", OPTION_VAL_50_JA }, + { "60%", OPTION_VAL_60_JA }, + { "70%", OPTION_VAL_70_JA }, + { "80%", OPTION_VAL_80_JA }, + { "90%", OPTION_VAL_90_JA }, + { "100%", OPTION_VAL_100_O45_JA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_KO, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_JA, NULL, "", NULL, @@ -44737,144 +50087,144 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_KO, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_JA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_KO, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_JA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_KO }, - { "2x", OPTION_VAL_2_O27_KO }, - { "3x", OPTION_VAL_3X_KO }, - { "4x", OPTION_VAL_4_KO }, - { "5x", OPTION_VAL_5X_KO }, + { "1x", OPTION_VAL_1X_JA }, + { "2x", OPTION_VAL_2_O26_JA }, + { "3x", OPTION_VAL_3X_JA }, + { "4x", OPTION_VAL_4_JA }, + { "5x", OPTION_VAL_5X_JA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_KO, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_JA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_KO }, - { "20%", OPTION_VAL_20_KO }, - { "30%", OPTION_VAL_30_KO }, - { "40%", OPTION_VAL_40_KO }, - { "50%", OPTION_VAL_50_KO }, - { "60%", OPTION_VAL_60_KO }, - { "70%", OPTION_VAL_70_KO }, - { "80%", OPTION_VAL_80_KO }, - { "90%", OPTION_VAL_90_KO }, - { "100%", OPTION_VAL_100_O57_KO }, + { "10%", OPTION_VAL_10_JA }, + { "20%", OPTION_VAL_20_JA }, + { "30%", OPTION_VAL_30_JA }, + { "40%", OPTION_VAL_40_JA }, + { "50%", OPTION_VAL_50_JA }, + { "60%", OPTION_VAL_60_JA }, + { "70%", OPTION_VAL_70_JA }, + { "80%", OPTION_VAL_80_JA }, + { "90%", OPTION_VAL_90_JA }, + { "100%", OPTION_VAL_100_O45_JA }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_KO, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_JA, NULL, "", NULL, @@ -44888,505 +50238,560 @@ struct retro_core_option_v2_definition option_defs_ko[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_KO, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_JA, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_JA }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_JA }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_JA }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_JA }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_KO, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_JA, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_KO }, - { "2x", OPTION_VAL_2_O27_KO }, - { "3x", OPTION_VAL_3X_KO }, - { "4x", OPTION_VAL_4_KO }, - { "5x", OPTION_VAL_5X_KO }, + { "1x", OPTION_VAL_1X_JA }, + { "2x", OPTION_VAL_2_O26_JA }, + { "3x", OPTION_VAL_3X_JA }, + { "4x", OPTION_VAL_4_JA }, + { "5x", OPTION_VAL_5X_JA }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_KO, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_JA, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, - { "BLACK 02", OPTION_VAL_BLACK_02_KO }, - { "BLUE 03", OPTION_VAL_BLUE_KO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, - { "GREEN 05", OPTION_VAL_GREEN_KO }, - { "CYAN 06", OPTION_VAL_CYAN_06_KO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, - { "RED 11", OPTION_VAL_RED_KO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, - { "GRAY 15", OPTION_VAL_GRAY_15_KO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, - { "WHITE 28", OPTION_VAL_WHITE_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_JA }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_JA }, + { "BLACK 02", OPTION_VAL_BLACK_02_JA }, + { "BLUE 03", OPTION_VAL_BLUE_JA }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_JA }, + { "GREEN 05", OPTION_VAL_GREEN_JA }, + { "CYAN 06", OPTION_VAL_CYAN_06_JA }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_JA }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_JA }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_JA }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_JA }, + { "RED 11", OPTION_VAL_RED_JA }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_JA }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_JA }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_JA }, + { "GRAY 15", OPTION_VAL_GRAY_15_JA }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_JA }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_JA }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_JA }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_JA }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_JA }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_JA }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_JA }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_JA }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_JA }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_JA }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_JA }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_JA }, + { "WHITE 28", OPTION_VAL_WHITE_JA }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_KO, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_JA, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_KO }, - { "20%", OPTION_VAL_20_KO }, - { "30%", OPTION_VAL_30_KO }, - { "40%", OPTION_VAL_40_KO }, - { "50%", OPTION_VAL_50_KO }, - { "60%", OPTION_VAL_60_KO }, - { "70%", OPTION_VAL_70_KO }, - { "80%", OPTION_VAL_80_KO }, - { "90%", OPTION_VAL_90_KO }, - { "100%", OPTION_VAL_100_O57_KO }, + { "10%", OPTION_VAL_10_JA }, + { "20%", OPTION_VAL_20_JA }, + { "30%", OPTION_VAL_30_JA }, + { "40%", OPTION_VAL_40_JA }, + { "50%", OPTION_VAL_50_JA }, + { "60%", OPTION_VAL_60_JA }, + { "70%", OPTION_VAL_70_JA }, + { "80%", OPTION_VAL_80_JA }, + { "90%", OPTION_VAL_90_JA }, + { "100%", OPTION_VAL_100_O45_JA }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_ko = { - option_cats_ko, - option_defs_ko +struct retro_core_options_v2 options_ja = { + option_cats_ja, + option_defs_ja }; -/* RETRO_LANGUAGE_NL */ +/* RETRO_LANGUAGE_KO */ -#define CATEGORY_SYSTEM_LABEL_NL "Systeem" -#define CATEGORY_SYSTEM_INFO_0_NL NULL -#define CATEGORY_VIDEO_LABEL_NL NULL -#define CATEGORY_VIDEO_INFO_0_NL NULL -#define CATEGORY_PERFORMANCE_LABEL_NL NULL -#define CATEGORY_PERFORMANCE_INFO_0_NL NULL -#define CATEGORY_HACKS_LABEL_NL NULL -#define CATEGORY_HACKS_INFO_0_NL NULL -#define CATEGORY_INPUT_LABEL_NL "Invoer" -#define CATEGORY_INPUT_INFO_0_NL NULL -#define CATEGORY_VMU_LABEL_NL NULL -#define CATEGORY_VMU_INFO_0_NL NULL -#define CORE_OPTION_NAME_REGION_LABEL_NL "Regio" -#define OPTION_VAL_JAPAN_NL NULL -#define OPTION_VAL_USA_NL NULL -#define OPTION_VAL_EUROPE_NL NULL -#define OPTION_VAL_DEFAULT_NL NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_NL "Taal" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_NL NULL -#define OPTION_VAL_JAPANESE_NL "Japans" -#define OPTION_VAL_ENGLISH_NL "Engels" -#define OPTION_VAL_GERMAN_NL "Duits" -#define OPTION_VAL_FRENCH_NL "Frans" -#define OPTION_VAL_SPANISH_NL "Spaans" -#define OPTION_VAL_ITALIAN_NL "Italiaans" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_NL NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_NL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_NL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_NL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_NL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_NL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NL NULL -#define CORE_OPTION_NAME_UPNP_LABEL_NL NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_NL NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NL NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NL NULL -#define OPTION_VAL_320X240_NL NULL -#define OPTION_VAL_640X480_NL NULL -#define OPTION_VAL_800X600_NL NULL -#define OPTION_VAL_960X720_NL NULL -#define OPTION_VAL_1024X768_NL NULL -#define OPTION_VAL_1280X960_NL NULL -#define OPTION_VAL_1440X1080_NL NULL -#define OPTION_VAL_1600X1200_NL NULL -#define OPTION_VAL_1920X1440_NL NULL -#define OPTION_VAL_2560X1920_NL NULL -#define OPTION_VAL_2880X2160_NL NULL -#define OPTION_VAL_3200X2400_NL NULL -#define OPTION_VAL_3840X2880_NL NULL -#define OPTION_VAL_4480X3360_NL NULL -#define OPTION_VAL_5120X3840_NL NULL -#define OPTION_VAL_5760X4320_NL NULL -#define OPTION_VAL_6400X4800_NL NULL -#define OPTION_VAL_7040X5280_NL NULL -#define OPTION_VAL_7680X5760_NL NULL -#define OPTION_VAL_8320X6240_NL NULL -#define OPTION_VAL_8960X6720_NL NULL -#define OPTION_VAL_9600X7200_NL NULL -#define OPTION_VAL_10240X7680_NL NULL -#define OPTION_VAL_10880X8160_NL NULL -#define OPTION_VAL_11520X8640_NL NULL -#define OPTION_VAL_12160X9120_NL NULL -#define OPTION_VAL_12800X9600_NL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_NL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NL NULL -#define OPTION_VAL_VGA_NL NULL -#define OPTION_VAL_TV_RGB_NL NULL -#define OPTION_VAL_TV_COMPOSITE_NL NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_NL NULL -#define OPTION_VAL_NTSC_NL NULL -#define OPTION_VAL_PAL_NL NULL -#define OPTION_VAL_PAL_N_NL NULL -#define OPTION_VAL_PAL_M_NL NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NL "Schermoriëntatie" -#define OPTION_VAL_HORIZONTAL_NL NULL -#define OPTION_VAL_VERTICAL_NL NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NL NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NL NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_NL NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_NL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NL NULL -#define OPTION_VAL_512MB_NL NULL -#define OPTION_VAL_1GB_NL NULL -#define OPTION_VAL_2GB_NL NULL -#define OPTION_VAL_4GB_NL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_NL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NL NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_NL NULL -#define CORE_OPTION_NAME_FOG_LABEL_NL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NL NULL -#define OPTION_VAL_1_NL NULL -#define OPTION_VAL_2_NL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_NL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NL NULL -#define OPTION_VAL_2_O27_NL NULL -#define OPTION_VAL_4_NL NULL -#define OPTION_VAL_6_NL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NL "Gedraaide Rendering" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NL "Voert de GPU en CPU uit op verschillende threads. Zeer aanbevolen." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NL NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NL "Automatisch frames overslaan wanneer de emulator traag draait. Deze instelling is alleen van toepassing wanneer 'Gedraaide Rendering' is ingeschakeld." -#define OPTION_VAL_SOME_NL "Normaal" -#define OPTION_VAL_MORE_NL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NL NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_NL NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_NL NULL -#define OPTION_VAL_100_NL NULL -#define OPTION_VAL_110_NL NULL -#define OPTION_VAL_120_NL NULL -#define OPTION_VAL_130_NL NULL -#define OPTION_VAL_140_NL NULL -#define OPTION_VAL_150_NL NULL -#define OPTION_VAL_160_NL NULL -#define OPTION_VAL_170_NL NULL -#define OPTION_VAL_180_NL NULL -#define OPTION_VAL_190_NL NULL -#define OPTION_VAL_200_NL NULL -#define OPTION_VAL_210_NL NULL -#define OPTION_VAL_220_NL NULL -#define OPTION_VAL_230_NL NULL -#define OPTION_VAL_240_NL NULL -#define OPTION_VAL_250_NL NULL -#define OPTION_VAL_260_NL NULL -#define OPTION_VAL_270_NL NULL -#define OPTION_VAL_280_NL NULL -#define OPTION_VAL_290_NL NULL -#define OPTION_VAL_300_NL NULL -#define OPTION_VAL_310_NL NULL -#define OPTION_VAL_320_NL NULL -#define OPTION_VAL_330_NL NULL -#define OPTION_VAL_340_NL NULL -#define OPTION_VAL_350_NL NULL -#define OPTION_VAL_360_NL NULL -#define OPTION_VAL_370_NL NULL -#define OPTION_VAL_380_NL NULL -#define OPTION_VAL_390_NL NULL -#define OPTION_VAL_400_NL NULL -#define OPTION_VAL_410_NL NULL -#define OPTION_VAL_420_NL NULL -#define OPTION_VAL_430_NL NULL -#define OPTION_VAL_440_NL NULL -#define OPTION_VAL_450_NL NULL -#define OPTION_VAL_460_NL NULL -#define OPTION_VAL_470_NL NULL -#define OPTION_VAL_480_NL NULL -#define OPTION_VAL_490_NL NULL -#define OPTION_VAL_500_NL NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NL NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NL NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NL NULL -#define OPTION_VAL_0_NL NULL -#define OPTION_VAL_5_NL NULL -#define OPTION_VAL_10_NL NULL -#define OPTION_VAL_15_NL NULL -#define OPTION_VAL_20_NL NULL -#define OPTION_VAL_25_NL NULL -#define OPTION_VAL_30_NL NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NL NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_NL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_NL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NL NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NL NULL -#define OPTION_VAL_WHITE_NL NULL -#define OPTION_VAL_RED_NL "Rood" -#define OPTION_VAL_GREEN_NL "Groen" -#define OPTION_VAL_BLUE_NL "Blauw" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NL NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NL NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NL NULL -#define OPTION_VAL_VMU_A1_NL NULL -#define OPTION_VAL_ALL_VMUS_NL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NL NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_NL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NL NULL -#define OPTION_VAL_UPPER_LEFT_NL NULL -#define OPTION_VAL_UPPER_RIGHT_NL NULL -#define OPTION_VAL_LOWER_LEFT_NL NULL -#define OPTION_VAL_LOWER_RIGHT_NL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NL NULL -#define OPTION_VAL_1X_NL NULL -#define OPTION_VAL_3X_NL NULL -#define OPTION_VAL_5X_NL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NL NULL -#define OPTION_VAL_DEFAULT_ON_00_NL NULL -#define OPTION_VAL_DEFAULT_OFF_01_NL NULL -#define OPTION_VAL_BLACK_02_NL NULL -#define OPTION_VAL_LIGHT_BLUE_04_NL NULL -#define OPTION_VAL_CYAN_06_NL NULL -#define OPTION_VAL_CYAN_BLUE_07_NL NULL -#define OPTION_VAL_LIGHT_GREEN_08_NL NULL -#define OPTION_VAL_CYAN_GREEN_09_NL NULL -#define OPTION_VAL_LIGHT_CYAN_10_NL NULL -#define OPTION_VAL_PURPLE_12_NL NULL -#define OPTION_VAL_LIGHT_PURPLE_13_NL NULL -#define OPTION_VAL_YELLOW_14_NL "Geel" -#define OPTION_VAL_GRAY_15_NL NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_NL NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_NL NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_NL NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_NL NULL -#define OPTION_VAL_LIGHT_RED_2_20_NL NULL -#define OPTION_VAL_MAGENTA_21_NL NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_NL NULL -#define OPTION_VAL_LIGHT_ORANGE_23_NL NULL -#define OPTION_VAL_ORANGE_24_NL NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_NL NULL -#define OPTION_VAL_LIGHT_YELLOW_26_NL NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_NL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NL NULL -#define OPTION_VAL_40_NL NULL -#define OPTION_VAL_50_NL NULL -#define OPTION_VAL_60_NL NULL -#define OPTION_VAL_70_NL NULL -#define OPTION_VAL_80_NL NULL -#define OPTION_VAL_90_NL NULL -#define OPTION_VAL_100_O57_NL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NL NULL +#define CATEGORY_SYSTEM_LABEL_KO "시스템" +#define CATEGORY_SYSTEM_INFO_0_KO "지역, 언어, BIOS 및 하드웨어 설정을 구성합니다." +#define CATEGORY_VIDEO_LABEL_KO "비디오" +#define CATEGORY_VIDEO_INFO_0_KO "해상도, 투명도 및 화면 효과 설정을 구성합니다." +#define CATEGORY_PERFORMANCE_LABEL_KO "성능" +#define CATEGORY_PERFORMANCE_INFO_0_KO "스레드 렌더링 및 프레임 스킵 설정을 구성합니다." +#define CATEGORY_HACKS_LABEL_KO "에뮬레이션 핵" +#define CATEGORY_HACKS_INFO_0_KO "와이드스크린 핵, GD롬 로딩 속도 조절 및 텍스쳐 변경 설정등을 구성합니다." +#define CATEGORY_INPUT_LABEL_KO "입력" +#define CATEGORY_INPUT_INFO_0_KO "게임패드 및 라이트 건 설정을 구성합니다." +#define CATEGORY_EXPANSIONS_LABEL_KO "컨트롤러 확장 슬롯" +#define CATEGORY_EXPANSIONS_INFO_0_KO "컨트롤러의 각 확장 슬롯에 연결할 장치(VMU, 진동 장치)를 선택합니다." +#define CATEGORY_VMU_LABEL_KO "비쥬얼 메모리 유닛" +#define CATEGORY_VMU_INFO_0_KO "게임 별 VMU 저장 파일 및 VMU OSD 설정을 구성합니다." +#define CORE_OPTION_NAME_REGION_LABEL_KO "지역" +#define OPTION_VAL_JAPAN_KO "일본" +#define OPTION_VAL_USA_KO "미국" +#define OPTION_VAL_EUROPE_KO "유럽" +#define OPTION_VAL_DEFAULT_KO "기본" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_KO "언어" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_KO "BIOS 및 다국어 게임에서 사용되는 언어 설정을 변경합니다" +#define OPTION_VAL_JAPANESE_KO "일본어" +#define OPTION_VAL_ENGLISH_KO "영어" +#define OPTION_VAL_GERMAN_KO "독일어" +#define OPTION_VAL_FRENCH_KO "프랑스어" +#define OPTION_VAL_SPANISH_KO "스페인어" +#define OPTION_VAL_ITALIAN_KO "이탈리아어" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_KO "HLE BIOS (재시작 필요)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_KO "HLE BIOS 사용을 강제합니다." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_KO "BIOS 로 부트 (재시작 필요)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_KO "드림캐스트 BIOS 메뉴로 부팅합니다." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_KO "HDR 활성화" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_KO "Dreamcast의 오디오 DSP(디지털 신호 프로세서)의 에뮬레이션을 활성화합니다. 사운드의 정확도는 향상되지만 성능 요구 사항이 증가합니다." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_KO "아케이드 서비스 버튼 허용" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_KO "아케이드 게임에서 캐비넷 설정에 들어가기 위한 서비스 버튼을 활성화합니다." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_KO "NAOMI 게임을 무료 플레이로 설정" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_KO "무료 플레이를 위해 게임의 코인 설정을 수정합니다." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO "브로드밴드 어댑터 에뮬레이션" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO "모뎀 대신 이더넷 브로드밴드 어댑터를 에뮬레이트합니다. (재시작 필요)" +#define CORE_OPTION_NAME_UPNP_LABEL_KO "UPnP 활성화" +#define CORE_OPTION_NAME_UPNP_INFO_0_KO "온라인 게임에서 UPnP를 사용해 자동으로 인터넷 라우터를 설정합니다." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_KO "내부 해상도" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_KO "렌더링 해상도를 변경합니다." +#define OPTION_VAL_320X240_KO "320x240 (절반)" +#define OPTION_VAL_640X480_KO "640x480 (네이티브)" +#define OPTION_VAL_800X600_KO NULL +#define OPTION_VAL_960X720_KO NULL +#define OPTION_VAL_1024X768_KO NULL +#define OPTION_VAL_1280X960_KO NULL +#define OPTION_VAL_1440X1080_KO NULL +#define OPTION_VAL_1600X1200_KO NULL +#define OPTION_VAL_1920X1440_KO NULL +#define OPTION_VAL_2560X1920_KO NULL +#define OPTION_VAL_2880X2160_KO NULL +#define OPTION_VAL_3200X2400_KO NULL +#define OPTION_VAL_3840X2880_KO NULL +#define OPTION_VAL_4480X3360_KO NULL +#define OPTION_VAL_5120X3840_KO NULL +#define OPTION_VAL_5760X4320_KO NULL +#define OPTION_VAL_6400X4800_KO NULL +#define OPTION_VAL_7040X5280_KO NULL +#define OPTION_VAL_7680X5760_KO NULL +#define OPTION_VAL_8320X6240_KO NULL +#define OPTION_VAL_8960X6720_KO NULL +#define OPTION_VAL_9600X7200_KO NULL +#define OPTION_VAL_10240X7680_KO NULL +#define OPTION_VAL_10880X8160_KO NULL +#define OPTION_VAL_11520X8640_KO NULL +#define OPTION_VAL_12160X9120_KO NULL +#define OPTION_VAL_12800X9600_KO NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_KO "케이블 타입" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_KO "외부 출력 형식. 'TV (컴포지트)'가 가장 많이 지원됨." +#define OPTION_VAL_VGA_KO NULL +#define OPTION_VAL_TV_RGB_KO NULL +#define OPTION_VAL_TV_COMPOSITE_KO "TV (컴포지트)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_KO "방송 표준" +#define OPTION_VAL_NTSC_KO NULL +#define OPTION_VAL_PAL_KO "PAL (국제)" +#define OPTION_VAL_PAL_N_KO "PAL-N (아르헨티나, 파라과이, 우르과이)" +#define OPTION_VAL_PAL_M_KO "PAL-M (브라질)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_KO "화면 방향" +#define OPTION_VAL_HORIZONTAL_KO "가로" +#define OPTION_VAL_VERTICAL_KO "세로" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_KO "알파 정렬" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_KO "투명 폴리곤을 정렬할 방식을 선택합니다." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_KO "줄당 (빠름, 가장 부정확)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_KO "삼각형당 (중간)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_KO "픽셀당 (정확, 가장 느림)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_KO "누산 픽셀 버퍼 크기" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_KO "높은 해상도 출력을 올바르게 표시하려면 이 값을 높은 값으로 설정해야 할 수도 있습니다." +#define OPTION_VAL_512MB_KO NULL +#define OPTION_VAL_1GB_KO NULL +#define OPTION_VAL_2GB_KO NULL +#define OPTION_VAL_4GB_KO NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_KO "최대 투명 레이어" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_KO "복잡한 장면을 그릴 때 높은 값이 필요할 수 있습니다." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_KO "전체 프레임버퍼 에뮬레이션" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_KO "VRAM 상 전체 프레임버퍼 에뮬레이션을 활성화합니다. VRAM 상의 프레임버퍼에 직접 읽기 또는 쓰기를 수행하는 게임을 실행할 때 유용합니다. 활성화할 경우, 내부 해상도가 640x480으로 고정되며 성능에 큰 영향을 끼칠 수 있습니다." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_KO "RTT (Render To Texture) 버퍼 사용" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_KO "렌더된 텍스쳐를 GPU에서 VRAM으로 복사합니다. 이 옵션은 이 옵션을 필요로 하는 게임에서는 기본적으로 활성화됩니다. 활성화할 경우, 텍스쳐 업스케일링이 비활성화되며 성능에 큰 영향을 끼칠 수 있습니다." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_KO "밉맵" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_KO "활성화할 경우 멀리 떨어진 곳에 텍스처를 그릴 때 작은 버전의 텍스처를 사용하여 성능을 개선하고 번쩍이는 효과를 억제합니다." +#define CORE_OPTION_NAME_FOG_LABEL_KO "안개 효과" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_KO "볼륨 모디파이어" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_KO "드림캐스트 GPU의 기능으로 보통 개체의 그림자를 그리는 데 사용됩니다. 이 기능은 보통 활성화해두어야 하며 성능에 미치는 영향은 아주 적습니다." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_KO "비등방성 필터링" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_KO "카메라와 비스듬하게 배치된 표면의 텍스쳐 품질을 향상합니다. 높은 값으로 설정하면 GPU 부하가 높아집니다. 변경 사항은 코어를 다시 시작해야 적용됩니다." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_KO "텍스쳐 필터링" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_KO "사용할 텍스쳐 필터링 모드를 선택합니다. 모든 텍스쳐에 강제로 특정 필터링 모드를 적용하여 더 날카로운(또는 부드러운) 비주얼을 얻을 수 있습니다. 기본 외의 다른 값으로 설정 시 다양한 렌더링 문제가 발생할 수 있습니다. 변경 사항은 코어를 다시 시작해야 적용됩니다." +#define OPTION_VAL_1_KO "강제 최근접이웃" +#define OPTION_VAL_2_KO "강제 선형" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_KO "프레임 스왑 지연" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_KO "화면이 번쩍이거나 깨지는 것을 방지할 수 있습니다. 느린 플랫폼에서는 사용을 권장하지 않습니다." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_KO "프레임 레이트 변화 감지" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_KO "내부 프레임 레이트가 변경될 때(예: 60FPS에서 30FPS로) 프론트엔드에게 알림을 보냅니다. 30FPS 또는 20FPS 고정으로 실행되는 게임에서는 프레임 페이스를 개선하지만, 무제한(불안정) 프레임 레이트로 실행되는 게임(예: Ecco the Dolphin, Unreal Tournament)을 실행할 때는 비활성화되어야 합니다. 주의: '자동 프레임 건너뛰기'가 활성화되어있으면 작동하지 않습니다." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_KO "PowerVR2 포스트프로세싱 필터" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_KO "렌더된 이미지에 PowerVR2 GPU와 아날로그 비디오 신호에서 나타나는 효과를 후처리로 구현합니다." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_KO "텍스쳐 업스케일링 (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_KO "손으로 그려진 2D 픽셀아트 그래픽을 개선합니다. 2D 픽셀아트 게임에서만 사용되어야 합니다." +#define OPTION_VAL_2_O26_KO NULL +#define OPTION_VAL_4_KO NULL +#define OPTION_VAL_6_KO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_KO "텍스쳐 업스케일링 필터 최대 크기" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_KO "텍스처를 업스케일할 최대 크기를 선택합니다. 텍스처의 크기가 설정한 크기보다 클 경우에는 텍스처를 업스케일하지 않습니다." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_KO "네이티브 깊이 보간" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_KO "AMD GPU에서 깊이 문제와 텍스쳐 망가짐 증상을 개선하는 데 도움이 됩니다. 일부 상황에서는 인텔 GPU에서도 도움이 될 수 있습니다." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_KO "업스케일 시 테두리 블리딩 억제" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_KO "업스케일 시 텍스처 블리딩 문제를 완화합니다. 비활성화할 경우 일부 2D 게임(MVC2, CVS, KOF 등)에서 픽셀이 뒤틀리는 현상이 해결될 수 있습니다." +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_KO "스레드 렌더링" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_KO "GPU와 CPU를 별도의 스레드에서 실행합니다. 사용하는 것이 매우 권장됩니다." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_KO "자동 프레임 건너뛰기" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_KO "에뮬레이터 실행이 느려질 경우 자동으로 프레임을 건너뜁니다. 주의: 이 설정은 '스레드 렌더링'이 활성화되어 있어야 적용됩니다." +#define OPTION_VAL_SOME_KO "보통" +#define OPTION_VAL_MORE_KO "최대" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_KO "프레임 건너뛰기" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_KO "표시되는 각 프레임 사이에서 건너뛸 프레임 수를 설정합니다." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_KO "와이드스크린 핵 (재시작 필요)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_KO "일부 게임이 와이드스크린 형식으로 출력되게 하는 치트를 활성화합니다." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_KO "와이드스크린 핵" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_KO "일반적인 4:3 화면비 밖에도 개체를 그립니다. 드러난 부분에서 그래픽 오류가 발생할 수도 있습니다." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_KO "GD-ROM 빠른 로딩 (정확하지 않음)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_KO "GD-ROM 로딩 속도를 높입니다." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_KO "드림캐스트 32MB RAM 모드" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_KO "드림캐스트용 32MB RAM 모드를 활성화합니다. 호환성에 영향이 있을 수 있습니다" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_KO "SH4 CPU 언더/오버클럭" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_KO "SH4 메인 CPU 클럭을 기본 200MHz에서 변경합니다. 언더클럭하면 플랫폼 속도가 느려질 수 있습니다. 오버클럭하면 일부 게임에서 프레임 속도가 증가할 수 있습니다. 주의해서 사용하세요." +#define OPTION_VAL_100_KO NULL +#define OPTION_VAL_110_KO NULL +#define OPTION_VAL_120_KO NULL +#define OPTION_VAL_130_KO NULL +#define OPTION_VAL_140_KO NULL +#define OPTION_VAL_150_KO NULL +#define OPTION_VAL_160_KO NULL +#define OPTION_VAL_170_KO NULL +#define OPTION_VAL_180_KO NULL +#define OPTION_VAL_190_KO NULL +#define OPTION_VAL_200_KO NULL +#define OPTION_VAL_210_KO NULL +#define OPTION_VAL_220_KO NULL +#define OPTION_VAL_230_KO NULL +#define OPTION_VAL_240_KO NULL +#define OPTION_VAL_250_KO NULL +#define OPTION_VAL_260_KO NULL +#define OPTION_VAL_270_KO NULL +#define OPTION_VAL_280_KO NULL +#define OPTION_VAL_290_KO NULL +#define OPTION_VAL_300_KO NULL +#define OPTION_VAL_310_KO NULL +#define OPTION_VAL_320_KO NULL +#define OPTION_VAL_330_KO NULL +#define OPTION_VAL_340_KO NULL +#define OPTION_VAL_350_KO NULL +#define OPTION_VAL_360_KO NULL +#define OPTION_VAL_370_KO NULL +#define OPTION_VAL_380_KO NULL +#define OPTION_VAL_390_KO NULL +#define OPTION_VAL_400_KO NULL +#define OPTION_VAL_410_KO NULL +#define OPTION_VAL_420_KO NULL +#define OPTION_VAL_430_KO NULL +#define OPTION_VAL_440_KO NULL +#define OPTION_VAL_450_KO NULL +#define OPTION_VAL_460_KO NULL +#define OPTION_VAL_470_KO NULL +#define OPTION_VAL_480_KO NULL +#define OPTION_VAL_490_KO NULL +#define OPTION_VAL_500_KO NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_KO "사용자 텍스처 불러오기" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_KO "'system/dc/textures//' 폴더에서 커스텀 텍스처를 불러옵니다." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_KO "텍스쳐 덤프하기" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_KO "게임이 새로운 텍스처를 사용할 때마다, 'system/dc/texdump//' 폴더 안에 .png 파일로 저장되게 합니다." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_KO "아날로그 스틱 데드존" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_KO "아날로그 스틱을 얼마나 기울여야 입력으로 인식할지를 선택합니다." +#define OPTION_VAL_0_KO NULL +#define OPTION_VAL_5_KO NULL +#define OPTION_VAL_10_KO NULL +#define OPTION_VAL_15_KO NULL +#define OPTION_VAL_20_KO NULL +#define OPTION_VAL_25_KO NULL +#define OPTION_VAL_30_KO NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_KO "트리거 데드존" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_KO "트리거를 얼마나 눌러야 입력으로 인식할지를 선택합니다." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_KO "디지털 트리거" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_KO "활성화할 경우 트리거가 평범한 버튼으로 취급되며, 중간 상태 없이 완전히 눌리거나 눌리지 않은 상태로만 처리됩니다." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_KO "디지털 출력 송출하기" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_KO "디지털 출력과 포스 피드백 상태를 TCP 포트 8000번으로 송출합니다. MAME의 \"-output network\" 옵션과 호환됩니다." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_KO "라이트 건 설정 표시" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_KO "라이트건 십자 조준선 옵션 구성을 활성화합니다. 참고: 이 설정을 적용하려면 빠른 메뉴를 다시 표시해야 할 수 있습니다." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_KO "총 십자선 크기 조정" +#define OPTION_VAL_50_KO NULL +#define OPTION_VAL_60_KO NULL +#define OPTION_VAL_70_KO NULL +#define OPTION_VAL_80_KO NULL +#define OPTION_VAL_90_KO NULL +#define OPTION_VAL_100_O45_KO NULL +#define OPTION_VAL_110_O45_KO NULL +#define OPTION_VAL_120_O45_KO NULL +#define OPTION_VAL_130_O45_KO NULL +#define OPTION_VAL_140_O45_KO NULL +#define OPTION_VAL_150_O45_KO NULL +#define OPTION_VAL_160_O45_KO NULL +#define OPTION_VAL_170_O45_KO NULL +#define OPTION_VAL_180_O45_KO NULL +#define OPTION_VAL_190_O45_KO NULL +#define OPTION_VAL_200_O45_KO NULL +#define OPTION_VAL_210_O45_KO NULL +#define OPTION_VAL_220_O45_KO NULL +#define OPTION_VAL_230_O45_KO NULL +#define OPTION_VAL_240_O45_KO NULL +#define OPTION_VAL_250_O45_KO NULL +#define OPTION_VAL_260_O45_KO NULL +#define OPTION_VAL_270_O45_KO NULL +#define OPTION_VAL_280_O45_KO NULL +#define OPTION_VAL_290_O45_KO NULL +#define OPTION_VAL_300_O45_KO NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_KO "라이트건 조준선 1 표시" +#define OPTION_VAL_WHITE_KO "흰색" +#define OPTION_VAL_RED_KO "빨강" +#define OPTION_VAL_GREEN_KO "초록" +#define OPTION_VAL_BLUE_KO "파랑" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_KO "라이트건 조준선 2 표시" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_KO "라이트건 조준선 3 표시" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_KO "라이트건 조준선 4 표시" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_KO "확장 슬롯 A1의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_KO "확장 슬롯 A1(포트 A 슬롯 1)에 연결할 장치를 선택합니다." +#define OPTION_VAL_VMU_KO NULL +#define OPTION_VAL_PURUPURU_KO "진동 팩" +#define OPTION_VAL_NONE_KO "없음" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_KO "확장 슬롯 A2의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_KO "확장 슬롯 A2(포트 A 슬롯 2)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_KO "확장 슬롯 B1의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_KO "확장 슬롯 B1(포트 B 슬롯 1)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_KO "확장 슬롯 B2의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_KO "확장 슬롯 B2(포트 B 슬롯 2)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_KO "확장 슬롯 C1의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_KO "확장 슬롯 C1(포트 C 슬롯 1)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_KO "확장 슬롯 C2의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_KO "확장 슬롯 C2(포트 C 슬롯 2)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_KO "확장 슬롯 D1의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_KO "확장 슬롯 D1(포트 D 슬롯 1)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_KO "확장 슬롯 D2의 장치" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_KO "확장 슬롯 D2(포트 D 슬롯 2)에 연결할 장치를 선택합니다." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_KO "게임당 별도 Visual Memory Units/Systems(VMU) 사용" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_KO "게임당 별도 VMU 사용" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_KO "비활성화할 경우, 모든 게임이 RetroArch의 시스템 폴더에 저장된 최대 8개의 VMU 저장 파일(A1/A2/B1/B2/C1/C2/D1/D2)을 공유합니다.\n'VMU A1' 옵션은 RetroArch의 저장 폴더에 게임 하나 당 하나의 VMU 'A1' 파일을 생성합니다.\n'모든 VMU'는 게임 하나 당 최대 8개의 VMU 파일(A1/A2/B1/B2/C1/C2/D1/D2)을 생성합니다." +#define OPTION_VAL_VMU_A1_KO NULL +#define OPTION_VAL_ALL_VMUS_KO "전체 VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_KO "비주얼 메모리 유닛/시스템 (VMU) 사운드" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_KO "VMU 사운드" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_KO "활성화하면 VMU 신호음이 재생됩니다." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_KO "Visual Memory Unit/System(VMU) 디스플레이 설정 표시" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_KO "VMU 디스플레이 설정 표시" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_KO "에뮬레이트되는 VMU LCD 화면의 표시 여부, 크기, 위치, 색상 설정을 표시합니다. 주의: 변경 사항이 적용되려면 빠른 메뉴를 껐다 켜야 할 수도 있습니다." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_KO "VMU 화면 1 표시" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_KO "VMU 화면 1 위치" +#define OPTION_VAL_UPPER_LEFT_KO "왼쪽 위" +#define OPTION_VAL_UPPER_RIGHT_KO "오른쪽 위" +#define OPTION_VAL_LOWER_LEFT_KO "왼쪽 아래" +#define OPTION_VAL_LOWER_RIGHT_KO "오른쪽 아래" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 1 크기" +#define OPTION_VAL_1X_KO NULL +#define OPTION_VAL_3X_KO NULL +#define OPTION_VAL_5X_KO NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 1 켜진 픽셀 색상" +#define OPTION_VAL_DEFAULT_ON_00_KO "기본설정 켜짐" +#define OPTION_VAL_DEFAULT_OFF_01_KO "기본설정 꺼짐" +#define OPTION_VAL_BLACK_02_KO "검정" +#define OPTION_VAL_LIGHT_BLUE_04_KO "밝은 파랑" +#define OPTION_VAL_CYAN_06_KO "청록" +#define OPTION_VAL_CYAN_BLUE_07_KO "청록 파랑" +#define OPTION_VAL_LIGHT_GREEN_08_KO "밝은 녹색" +#define OPTION_VAL_CYAN_GREEN_09_KO "청록 초록" +#define OPTION_VAL_LIGHT_CYAN_10_KO "밝은 청록" +#define OPTION_VAL_PURPLE_12_KO "보라" +#define OPTION_VAL_LIGHT_PURPLE_13_KO "밝은 보라" +#define OPTION_VAL_YELLOW_14_KO "노란색" +#define OPTION_VAL_GRAY_15_KO "회색" +#define OPTION_VAL_LIGHT_PURPLE_2_16_KO "연보라색 (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_KO "밝은 녹색 (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_KO "밝은 녹색 (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_KO "밝은 청록 (2)" +#define OPTION_VAL_LIGHT_RED_2_20_KO "밝은 빨강 (2)" +#define OPTION_VAL_MAGENTA_21_KO "자홍색" +#define OPTION_VAL_LIGHT_PURPLE_3_22_KO "연보라색 (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_KO "밝은 주황색" +#define OPTION_VAL_ORANGE_24_KO "오렌지" +#define OPTION_VAL_LIGHT_PURPLE_4_25_KO "연보라색 (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_KO "연한 노란색" +#define OPTION_VAL_LIGHT_YELLOW_2_27_KO "연한 노란색 (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 1 꺼진 픽셀 색상" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_KO "VMU 화면 1 투명도" +#define OPTION_VAL_40_KO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_KO "VMU 화면 2 표시" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_KO "VMU 화면 2 위치" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 2 크기" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 2 켜진 픽셀 색상" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 2 꺼진 픽셀 색상" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_KO "VMU 화면 2 투명도" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_KO "VMU 화면 3 표시" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_KO "VMU 화면 3 위치" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 3 크기" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 3 켜진 픽셀 색상" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 3 꺼진 픽셀 색상" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_KO "VMU 화면 3 투명도" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_KO "VMU 화면 4 표시" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_KO "VMU 화면 4 위치" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_KO "VMU 화면 4 크기" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_KO "VMU 화면 4 켜진 픽셀 색상" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_KO "VMU 화면 4 꺼진 픽셀 색상" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_KO "VMU 화면 4 투명도" -struct retro_core_option_v2_category option_cats_nl[] = { +struct retro_core_option_v2_category option_cats_ko[] = { { "system", - CATEGORY_SYSTEM_LABEL_NL, - CATEGORY_SYSTEM_INFO_0_NL + CATEGORY_SYSTEM_LABEL_KO, + CATEGORY_SYSTEM_INFO_0_KO }, { "video", - CATEGORY_VIDEO_LABEL_NL, - CATEGORY_VIDEO_INFO_0_NL + CATEGORY_VIDEO_LABEL_KO, + CATEGORY_VIDEO_INFO_0_KO }, { "performance", - CATEGORY_PERFORMANCE_LABEL_NL, - CATEGORY_PERFORMANCE_INFO_0_NL + CATEGORY_PERFORMANCE_LABEL_KO, + CATEGORY_PERFORMANCE_INFO_0_KO }, { "hacks", - CATEGORY_HACKS_LABEL_NL, - CATEGORY_HACKS_INFO_0_NL + CATEGORY_HACKS_LABEL_KO, + CATEGORY_HACKS_INFO_0_KO }, { "input", - CATEGORY_INPUT_LABEL_NL, - CATEGORY_INPUT_INFO_0_NL + CATEGORY_INPUT_LABEL_KO, + CATEGORY_INPUT_INFO_0_KO + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_KO, + CATEGORY_EXPANSIONS_INFO_0_KO }, { "vmu", - CATEGORY_VMU_LABEL_NL, - CATEGORY_VMU_INFO_0_NL + CATEGORY_VMU_LABEL_KO, + CATEGORY_VMU_INFO_0_KO }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_nl[] = { +struct retro_core_option_v2_definition option_defs_ko[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_NL, + CORE_OPTION_NAME_REGION_LABEL_KO, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_NL }, - { "USA", OPTION_VAL_USA_NL }, - { "Europe", OPTION_VAL_EUROPE_NL }, - { "Default", OPTION_VAL_DEFAULT_NL }, + { "Japan", OPTION_VAL_JAPAN_KO }, + { "USA", OPTION_VAL_USA_KO }, + { "Europe", OPTION_VAL_EUROPE_KO }, + { "Default", OPTION_VAL_DEFAULT_KO }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_NL, + CORE_OPTION_NAME_LANGUAGE_LABEL_KO, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_NL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_KO, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_NL }, - { "English", OPTION_VAL_ENGLISH_NL }, - { "German", OPTION_VAL_GERMAN_NL }, - { "French", OPTION_VAL_FRENCH_NL }, - { "Spanish", OPTION_VAL_SPANISH_NL }, - { "Italian", OPTION_VAL_ITALIAN_NL }, - { "Default", OPTION_VAL_DEFAULT_NL }, + { "Japanese", OPTION_VAL_JAPANESE_KO }, + { "English", OPTION_VAL_ENGLISH_KO }, + { "German", OPTION_VAL_GERMAN_KO }, + { "French", OPTION_VAL_FRENCH_KO }, + { "Spanish", OPTION_VAL_SPANISH_KO }, + { "Italian", OPTION_VAL_ITALIAN_KO }, + { "Default", OPTION_VAL_DEFAULT_KO }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_NL, + CORE_OPTION_NAME_HLE_BIOS_LABEL_KO, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_NL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_KO, NULL, "system", { @@ -45398,9 +50803,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NL, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_KO, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_KO, NULL, "system", { @@ -45412,9 +50817,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_NL, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_KO, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_KO, NULL, "system", { @@ -45429,10 +50834,10 @@ struct retro_core_option_v2_definition option_defs_nl[] = { #endif }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_NL, + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_KO, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_NL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_KO, NULL, "system", { @@ -45443,10 +50848,10 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", }, { - CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NL, + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_KO, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_KO, NULL, "system", { @@ -45454,27 +50859,13 @@ struct retro_core_option_v2_definition option_defs_nl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", - }, - { - CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NL, - NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", + "enabled", }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_NL, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_KO, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_KO, NULL, "system", { @@ -45486,9 +50877,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_NL, + CORE_OPTION_NAME_UPNP_LABEL_KO, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_NL, + CORE_OPTION_NAME_UPNP_INFO_0_KO, NULL, "system", { @@ -45501,39 +50892,39 @@ struct retro_core_option_v2_definition option_defs_nl[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_KO, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_KO, NULL, "video", { - { "320x240", OPTION_VAL_320X240_NL }, - { "640x480", OPTION_VAL_640X480_NL }, - { "800x600", OPTION_VAL_800X600_NL }, - { "960x720", OPTION_VAL_960X720_NL }, - { "1024x768", OPTION_VAL_1024X768_NL }, - { "1280x960", OPTION_VAL_1280X960_NL }, - { "1440x1080", OPTION_VAL_1440X1080_NL }, - { "1600x1200", OPTION_VAL_1600X1200_NL }, - { "1920x1440", OPTION_VAL_1920X1440_NL }, - { "2560x1920", OPTION_VAL_2560X1920_NL }, - { "2880x2160", OPTION_VAL_2880X2160_NL }, - { "3200x2400", OPTION_VAL_3200X2400_NL }, - { "3840x2880", OPTION_VAL_3840X2880_NL }, - { "4480x3360", OPTION_VAL_4480X3360_NL }, - { "5120x3840", OPTION_VAL_5120X3840_NL }, - { "5760x4320", OPTION_VAL_5760X4320_NL }, - { "6400x4800", OPTION_VAL_6400X4800_NL }, - { "7040x5280", OPTION_VAL_7040X5280_NL }, - { "7680x5760", OPTION_VAL_7680X5760_NL }, - { "8320x6240", OPTION_VAL_8320X6240_NL }, - { "8960x6720", OPTION_VAL_8960X6720_NL }, - { "9600x7200", OPTION_VAL_9600X7200_NL }, - { "10240x7680", OPTION_VAL_10240X7680_NL }, - { "10880x8160", OPTION_VAL_10880X8160_NL }, - { "11520x8640", OPTION_VAL_11520X8640_NL }, - { "12160x9120", OPTION_VAL_12160X9120_NL }, - { "12800x9600", OPTION_VAL_12800X9600_NL }, + { "320x240", OPTION_VAL_320X240_KO }, + { "640x480", OPTION_VAL_640X480_KO }, + { "800x600", OPTION_VAL_800X600_KO }, + { "960x720", OPTION_VAL_960X720_KO }, + { "1024x768", OPTION_VAL_1024X768_KO }, + { "1280x960", OPTION_VAL_1280X960_KO }, + { "1440x1080", OPTION_VAL_1440X1080_KO }, + { "1600x1200", OPTION_VAL_1600X1200_KO }, + { "1920x1440", OPTION_VAL_1920X1440_KO }, + { "2560x1920", OPTION_VAL_2560X1920_KO }, + { "2880x2160", OPTION_VAL_2880X2160_KO }, + { "3200x2400", OPTION_VAL_3200X2400_KO }, + { "3840x2880", OPTION_VAL_3840X2880_KO }, + { "4480x3360", OPTION_VAL_4480X3360_KO }, + { "5120x3840", OPTION_VAL_5120X3840_KO }, + { "5760x4320", OPTION_VAL_5760X4320_KO }, + { "6400x4800", OPTION_VAL_6400X4800_KO }, + { "7040x5280", OPTION_VAL_7040X5280_KO }, + { "7680x5760", OPTION_VAL_7680X5760_KO }, + { "8320x6240", OPTION_VAL_8320X6240_KO }, + { "8960x6720", OPTION_VAL_8960X6720_KO }, + { "9600x7200", OPTION_VAL_9600X7200_KO }, + { "10240x7680", OPTION_VAL_10240X7680_KO }, + { "10880x8160", OPTION_VAL_10880X8160_KO }, + { "11520x8640", OPTION_VAL_11520X8640_KO }, + { "12160x9120", OPTION_VAL_12160X9120_KO }, + { "12800x9600", OPTION_VAL_12800X9600_KO }, { NULL, NULL }, }, #ifdef LOW_RES @@ -45544,62 +50935,62 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_NL, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_KO, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_KO, NULL, "video", { - { "VGA", OPTION_VAL_VGA_NL }, - { "TV (RGB)", OPTION_VAL_TV_RGB_NL }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_NL }, + { "VGA", OPTION_VAL_VGA_KO }, + { "TV (RGB)", OPTION_VAL_TV_RGB_KO }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_KO }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_NL, + CORE_OPTION_NAME_BROADCAST_LABEL_KO, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_NL }, - { "PAL", OPTION_VAL_PAL_NL }, - { "PAL_N", OPTION_VAL_PAL_N_NL }, - { "PAL_M", OPTION_VAL_PAL_M_NL }, - { "Default", OPTION_VAL_DEFAULT_NL }, + { "NTSC", OPTION_VAL_NTSC_KO }, + { "PAL", OPTION_VAL_PAL_KO }, + { "PAL_N", OPTION_VAL_PAL_N_KO }, + { "PAL_M", OPTION_VAL_PAL_M_KO }, + { "Default", OPTION_VAL_DEFAULT_KO }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NL, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_KO, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_NL }, - { "vertical", OPTION_VAL_VERTICAL_NL }, + { "horizontal", OPTION_VAL_HORIZONTAL_KO }, + { "vertical", OPTION_VAL_VERTICAL_KO }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NL, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_KO, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NL }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_NL }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_KO }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_KO }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_NL }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_KO }, #endif { NULL, NULL }, }, @@ -45612,25 +51003,25 @@ struct retro_core_option_v2_definition option_defs_nl[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_KO, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_KO, NULL, "video", { - { "512MB", OPTION_VAL_512MB_NL }, - { "1GB", OPTION_VAL_1GB_NL }, - { "2GB", OPTION_VAL_2GB_NL }, - { "4GB", OPTION_VAL_4GB_NL }, + { "512MB", OPTION_VAL_512MB_KO }, + { "1GB", OPTION_VAL_1GB_KO }, + { "2GB", OPTION_VAL_2GB_KO }, + { "4GB", OPTION_VAL_4GB_KO }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_NL, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_KO, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_KO, NULL, "video", { @@ -45638,6 +51029,7 @@ struct retro_core_option_v2_definition option_defs_nl[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -45646,9 +51038,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_KO, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_KO, NULL, "video", { @@ -45660,9 +51052,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NL, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_KO, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_KO, NULL, "video", { @@ -45672,11 +51064,11 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_NL, + CORE_OPTION_NAME_MIPMAPPING_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_KO, NULL, "video", { @@ -45688,7 +51080,7 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_NL, + CORE_OPTION_NAME_FOG_LABEL_KO, NULL, "", NULL, @@ -45702,9 +51094,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_KO, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_KO, NULL, "video", { @@ -45716,9 +51108,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_KO, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_KO, NULL, "video", { @@ -45733,24 +51125,24 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NL, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_KO, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_KO, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_NL }, - { "1", OPTION_VAL_1_NL }, - { "2", OPTION_VAL_2_NL }, + { "0", OPTION_VAL_DEFAULT_KO }, + { "1", OPTION_VAL_1_KO }, + { "2", OPTION_VAL_2_KO }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_KO, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_KO, NULL, "video", { @@ -45758,13 +51150,13 @@ struct retro_core_option_v2_definition option_defs_nl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_KO, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_KO, NULL, "video", { @@ -45776,9 +51168,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NL, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_KO, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_KO, NULL, "video", { @@ -45791,25 +51183,25 @@ struct retro_core_option_v2_definition option_defs_nl[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_NL, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_KO, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_KO, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_NL }, - { "4", OPTION_VAL_4_NL }, - { "6", OPTION_VAL_6_NL }, + { "2", OPTION_VAL_2_O26_KO }, + { "4", OPTION_VAL_4_KO }, + { "6", OPTION_VAL_6_KO }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_KO, NULL, "video", { @@ -45823,9 +51215,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_KO, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_KO, NULL, "video", { @@ -45835,11 +51227,25 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_KO, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_KO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NL, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_KO, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_KO, NULL, "performance", { @@ -45851,15 +51257,15 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_KO, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_KO, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_NL }, - { "more", OPTION_VAL_MORE_NL }, + { "some", OPTION_VAL_SOME_KO }, + { "more", OPTION_VAL_MORE_KO }, { NULL, NULL }, }, #ifdef LOW_END @@ -45870,9 +51276,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NL, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_KO, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_KO, NULL, "performance", { @@ -45889,9 +51295,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_KO, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_KO, NULL, "hacks", { @@ -45903,9 +51309,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NL, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_KO, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_KO, NULL, "hacks", { @@ -45917,9 +51323,9 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_KO, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_KO, NULL, "hacks", { @@ -45933,64 +51339,78 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_KO, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_KO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_NL, + CORE_OPTION_NAME_SH4CLOCK_LABEL_KO, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_NL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_KO, NULL, "hacks", { - { "100", OPTION_VAL_100_NL }, - { "110", OPTION_VAL_110_NL }, - { "120", OPTION_VAL_120_NL }, - { "130", OPTION_VAL_130_NL }, - { "140", OPTION_VAL_140_NL }, - { "150", OPTION_VAL_150_NL }, - { "160", OPTION_VAL_160_NL }, - { "170", OPTION_VAL_170_NL }, - { "180", OPTION_VAL_180_NL }, - { "190", OPTION_VAL_190_NL }, - { "200", OPTION_VAL_200_NL }, - { "210", OPTION_VAL_210_NL }, - { "220", OPTION_VAL_220_NL }, - { "230", OPTION_VAL_230_NL }, - { "240", OPTION_VAL_240_NL }, - { "250", OPTION_VAL_250_NL }, - { "260", OPTION_VAL_260_NL }, - { "270", OPTION_VAL_270_NL }, - { "280", OPTION_VAL_280_NL }, - { "290", OPTION_VAL_290_NL }, - { "300", OPTION_VAL_300_NL }, - { "310", OPTION_VAL_310_NL }, - { "320", OPTION_VAL_320_NL }, - { "330", OPTION_VAL_330_NL }, - { "340", OPTION_VAL_340_NL }, - { "350", OPTION_VAL_350_NL }, - { "360", OPTION_VAL_360_NL }, - { "370", OPTION_VAL_370_NL }, - { "380", OPTION_VAL_380_NL }, - { "390", OPTION_VAL_390_NL }, - { "400", OPTION_VAL_400_NL }, - { "410", OPTION_VAL_410_NL }, - { "420", OPTION_VAL_420_NL }, - { "430", OPTION_VAL_430_NL }, - { "440", OPTION_VAL_440_NL }, - { "450", OPTION_VAL_450_NL }, - { "460", OPTION_VAL_460_NL }, - { "470", OPTION_VAL_470_NL }, - { "480", OPTION_VAL_480_NL }, - { "490", OPTION_VAL_490_NL }, - { "500", OPTION_VAL_500_NL }, + { "100", OPTION_VAL_100_KO }, + { "110", OPTION_VAL_110_KO }, + { "120", OPTION_VAL_120_KO }, + { "130", OPTION_VAL_130_KO }, + { "140", OPTION_VAL_140_KO }, + { "150", OPTION_VAL_150_KO }, + { "160", OPTION_VAL_160_KO }, + { "170", OPTION_VAL_170_KO }, + { "180", OPTION_VAL_180_KO }, + { "190", OPTION_VAL_190_KO }, + { "200", OPTION_VAL_200_KO }, + { "210", OPTION_VAL_210_KO }, + { "220", OPTION_VAL_220_KO }, + { "230", OPTION_VAL_230_KO }, + { "240", OPTION_VAL_240_KO }, + { "250", OPTION_VAL_250_KO }, + { "260", OPTION_VAL_260_KO }, + { "270", OPTION_VAL_270_KO }, + { "280", OPTION_VAL_280_KO }, + { "290", OPTION_VAL_290_KO }, + { "300", OPTION_VAL_300_KO }, + { "310", OPTION_VAL_310_KO }, + { "320", OPTION_VAL_320_KO }, + { "330", OPTION_VAL_330_KO }, + { "340", OPTION_VAL_340_KO }, + { "350", OPTION_VAL_350_KO }, + { "360", OPTION_VAL_360_KO }, + { "370", OPTION_VAL_370_KO }, + { "380", OPTION_VAL_380_KO }, + { "390", OPTION_VAL_390_KO }, + { "400", OPTION_VAL_400_KO }, + { "410", OPTION_VAL_410_KO }, + { "420", OPTION_VAL_420_KO }, + { "430", OPTION_VAL_430_KO }, + { "440", OPTION_VAL_440_KO }, + { "450", OPTION_VAL_450_KO }, + { "460", OPTION_VAL_460_KO }, + { "470", OPTION_VAL_470_KO }, + { "480", OPTION_VAL_480_KO }, + { "490", OPTION_VAL_490_KO }, + { "500", OPTION_VAL_500_KO }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_KO, NULL, "hacks", { @@ -46000,11 +51420,11 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NL, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_KO, NULL, "hacks", { @@ -46016,47 +51436,47 @@ struct retro_core_option_v2_definition option_defs_nl[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_KO, NULL, "input", { - { "0%", OPTION_VAL_0_NL }, - { "5%", OPTION_VAL_5_NL }, - { "10%", OPTION_VAL_10_NL }, - { "15%", OPTION_VAL_15_NL }, - { "20%", OPTION_VAL_20_NL }, - { "25%", OPTION_VAL_25_NL }, - { "30%", OPTION_VAL_30_NL }, + { "0%", OPTION_VAL_0_KO }, + { "5%", OPTION_VAL_5_KO }, + { "10%", OPTION_VAL_10_KO }, + { "15%", OPTION_VAL_15_KO }, + { "20%", OPTION_VAL_20_KO }, + { "25%", OPTION_VAL_25_KO }, + { "30%", OPTION_VAL_30_KO }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_KO, NULL, "input", { - { "0%", OPTION_VAL_0_NL }, - { "5%", OPTION_VAL_5_NL }, - { "10%", OPTION_VAL_10_NL }, - { "15%", OPTION_VAL_15_NL }, - { "20%", OPTION_VAL_20_NL }, - { "25%", OPTION_VAL_25_NL }, - { "30%", OPTION_VAL_30_NL }, + { "0%", OPTION_VAL_0_KO }, + { "5%", OPTION_VAL_5_KO }, + { "10%", OPTION_VAL_10_KO }, + { "15%", OPTION_VAL_15_KO }, + { "20%", OPTION_VAL_20_KO }, + { "25%", OPTION_VAL_25_KO }, + { "30%", OPTION_VAL_30_KO }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_KO, NULL, "input", { @@ -46067,10 +51487,10 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_NL, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_KO, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_NL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_KO, NULL, "input", { @@ -46078,300 +51498,293 @@ struct retro_core_option_v2_definition option_defs_nl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NL, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_KO, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_KO, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NL, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_KO, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NL, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_KO }, + { "60%", OPTION_VAL_60_KO }, + { "70%", OPTION_VAL_70_KO }, + { "80%", OPTION_VAL_80_KO }, + { "90%", OPTION_VAL_90_KO }, + { "100%", OPTION_VAL_100_O45_KO }, + { "110%", OPTION_VAL_110_O45_KO }, + { "120%", OPTION_VAL_120_O45_KO }, + { "130%", OPTION_VAL_130_O45_KO }, + { "140%", OPTION_VAL_140_O45_KO }, + { "150%", OPTION_VAL_150_O45_KO }, + { "160%", OPTION_VAL_160_O45_KO }, + { "170%", OPTION_VAL_170_O45_KO }, + { "180%", OPTION_VAL_180_O45_KO }, + { "190%", OPTION_VAL_190_O45_KO }, + { "200%", OPTION_VAL_200_O45_KO }, + { "210%", OPTION_VAL_210_O45_KO }, + { "220%", OPTION_VAL_220_O45_KO }, + { "230%", OPTION_VAL_230_O45_KO }, + { "240%", OPTION_VAL_240_O45_KO }, + { "250%", OPTION_VAL_250_O45_KO }, + { "260%", OPTION_VAL_260_O45_KO }, + { "270%", OPTION_VAL_270_O45_KO }, + { "280%", OPTION_VAL_280_O45_KO }, + { "290%", OPTION_VAL_290_O45_KO }, + { "300%", OPTION_VAL_300_O45_KO }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NL, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_KO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NL }, - { "Red", OPTION_VAL_RED_NL }, - { "Green", OPTION_VAL_GREEN_NL }, - { "Blue", OPTION_VAL_BLUE_NL }, + { "White", OPTION_VAL_WHITE_KO }, + { "Red", OPTION_VAL_RED_KO }, + { "Green", OPTION_VAL_GREEN_KO }, + { "Blue", OPTION_VAL_BLUE_KO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NL, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_KO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NL }, - { "Red", OPTION_VAL_RED_NL }, - { "Green", OPTION_VAL_GREEN_NL }, - { "Blue", OPTION_VAL_BLUE_NL }, + { "White", OPTION_VAL_WHITE_KO }, + { "Red", OPTION_VAL_RED_KO }, + { "Green", OPTION_VAL_GREEN_KO }, + { "Blue", OPTION_VAL_BLUE_KO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NL, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_KO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NL }, - { "Red", OPTION_VAL_RED_NL }, - { "Green", OPTION_VAL_GREEN_NL }, - { "Blue", OPTION_VAL_BLUE_NL }, + { "White", OPTION_VAL_WHITE_KO }, + { "Red", OPTION_VAL_RED_KO }, + { "Green", OPTION_VAL_GREEN_KO }, + { "Blue", OPTION_VAL_BLUE_KO }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NL, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_KO, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NL }, - { "Red", OPTION_VAL_RED_NL }, - { "Green", OPTION_VAL_GREEN_NL }, - { "Blue", OPTION_VAL_BLUE_NL }, + { "White", OPTION_VAL_WHITE_KO }, + { "Red", OPTION_VAL_RED_KO }, + { "Green", OPTION_VAL_GREEN_KO }, + { "Blue", OPTION_VAL_BLUE_KO }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NL, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_KO, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_KO, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_NL }, - { "All VMUs", OPTION_VAL_ALL_VMUS_NL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_NL, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NL, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_NL, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_KO, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_KO, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NL, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_KO, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_KO, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NL, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_KO, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NL, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_KO, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NL, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_KO, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_NL }, - { "2x", OPTION_VAL_2_O27_NL }, - { "3x", OPTION_VAL_3X_NL }, - { "4x", OPTION_VAL_4_NL }, - { "5x", OPTION_VAL_5X_NL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NL, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_KO, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NL, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_KO, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_KO, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "VMU", OPTION_VAL_VMU_KO }, + { "Purupuru", OPTION_VAL_PURUPURU_KO }, + { "None", OPTION_VAL_NONE_KO }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NL, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_KO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_KO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_KO, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_KO }, + { "All VMUs", OPTION_VAL_ALL_VMUS_KO }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_KO, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_KO, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_KO, NULL, "vmu", { - { "10%", OPTION_VAL_10_NL }, - { "20%", OPTION_VAL_20_NL }, - { "30%", OPTION_VAL_30_NL }, - { "40%", OPTION_VAL_40_NL }, - { "50%", OPTION_VAL_50_NL }, - { "60%", OPTION_VAL_60_NL }, - { "70%", OPTION_VAL_70_NL }, - { "80%", OPTION_VAL_80_NL }, - { "90%", OPTION_VAL_90_NL }, - { "100%", OPTION_VAL_100_O57_NL }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NL, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_KO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_KO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_KO, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_KO, NULL, "", NULL, @@ -46384,145 +51797,145 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NL, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_KO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NL, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_KO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NL }, - { "2x", OPTION_VAL_2_O27_NL }, - { "3x", OPTION_VAL_3X_NL }, - { "4x", OPTION_VAL_4_NL }, - { "5x", OPTION_VAL_5X_NL }, + { "1x", OPTION_VAL_1X_KO }, + { "2x", OPTION_VAL_2_O26_KO }, + { "3x", OPTION_VAL_3X_KO }, + { "4x", OPTION_VAL_4_KO }, + { "5x", OPTION_VAL_5X_KO }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NL, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_KO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NL }, - { "20%", OPTION_VAL_20_NL }, - { "30%", OPTION_VAL_30_NL }, - { "40%", OPTION_VAL_40_NL }, - { "50%", OPTION_VAL_50_NL }, - { "60%", OPTION_VAL_60_NL }, - { "70%", OPTION_VAL_70_NL }, - { "80%", OPTION_VAL_80_NL }, - { "90%", OPTION_VAL_90_NL }, - { "100%", OPTION_VAL_100_O57_NL }, + { "10%", OPTION_VAL_10_KO }, + { "20%", OPTION_VAL_20_KO }, + { "30%", OPTION_VAL_30_KO }, + { "40%", OPTION_VAL_40_KO }, + { "50%", OPTION_VAL_50_KO }, + { "60%", OPTION_VAL_60_KO }, + { "70%", OPTION_VAL_70_KO }, + { "80%", OPTION_VAL_80_KO }, + { "90%", OPTION_VAL_90_KO }, + { "100%", OPTION_VAL_100_O45_KO }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NL, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_KO, NULL, "", NULL, @@ -46535,145 +51948,145 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NL, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_KO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NL, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_KO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NL }, - { "2x", OPTION_VAL_2_O27_NL }, - { "3x", OPTION_VAL_3X_NL }, - { "4x", OPTION_VAL_4_NL }, - { "5x", OPTION_VAL_5X_NL }, + { "1x", OPTION_VAL_1X_KO }, + { "2x", OPTION_VAL_2_O26_KO }, + { "3x", OPTION_VAL_3X_KO }, + { "4x", OPTION_VAL_4_KO }, + { "5x", OPTION_VAL_5X_KO }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NL, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_KO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NL }, - { "20%", OPTION_VAL_20_NL }, - { "30%", OPTION_VAL_30_NL }, - { "40%", OPTION_VAL_40_NL }, - { "50%", OPTION_VAL_50_NL }, - { "60%", OPTION_VAL_60_NL }, - { "70%", OPTION_VAL_70_NL }, - { "80%", OPTION_VAL_80_NL }, - { "90%", OPTION_VAL_90_NL }, - { "100%", OPTION_VAL_100_O57_NL }, + { "10%", OPTION_VAL_10_KO }, + { "20%", OPTION_VAL_20_KO }, + { "30%", OPTION_VAL_30_KO }, + { "40%", OPTION_VAL_40_KO }, + { "50%", OPTION_VAL_50_KO }, + { "60%", OPTION_VAL_60_KO }, + { "70%", OPTION_VAL_70_KO }, + { "80%", OPTION_VAL_80_KO }, + { "90%", OPTION_VAL_90_KO }, + { "100%", OPTION_VAL_100_O45_KO }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NL, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_KO, NULL, "", NULL, @@ -46686,552 +52099,740 @@ struct retro_core_option_v2_definition option_defs_nl[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NL, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_KO, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NL, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_KO, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NL }, - { "2x", OPTION_VAL_2_O27_NL }, - { "3x", OPTION_VAL_3X_NL }, - { "4x", OPTION_VAL_4_NL }, - { "5x", OPTION_VAL_5X_NL }, + { "1x", OPTION_VAL_1X_KO }, + { "2x", OPTION_VAL_2_O26_KO }, + { "3x", OPTION_VAL_3X_KO }, + { "4x", OPTION_VAL_4_KO }, + { "5x", OPTION_VAL_5X_KO }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NL, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_KO, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, - { "BLACK 02", OPTION_VAL_BLACK_02_NL }, - { "BLUE 03", OPTION_VAL_BLUE_NL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, - { "GREEN 05", OPTION_VAL_GREEN_NL }, - { "CYAN 06", OPTION_VAL_CYAN_06_NL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, - { "RED 11", OPTION_VAL_RED_NL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, - { "GRAY 15", OPTION_VAL_GRAY_15_NL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, - { "WHITE 28", OPTION_VAL_WHITE_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NL, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_KO, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NL }, - { "20%", OPTION_VAL_20_NL }, - { "30%", OPTION_VAL_30_NL }, - { "40%", OPTION_VAL_40_NL }, - { "50%", OPTION_VAL_50_NL }, - { "60%", OPTION_VAL_60_NL }, - { "70%", OPTION_VAL_70_NL }, - { "80%", OPTION_VAL_80_NL }, - { "90%", OPTION_VAL_90_NL }, - { "100%", OPTION_VAL_100_O57_NL }, + { "10%", OPTION_VAL_10_KO }, + { "20%", OPTION_VAL_20_KO }, + { "30%", OPTION_VAL_30_KO }, + { "40%", OPTION_VAL_40_KO }, + { "50%", OPTION_VAL_50_KO }, + { "60%", OPTION_VAL_60_KO }, + { "70%", OPTION_VAL_70_KO }, + { "80%", OPTION_VAL_80_KO }, + { "90%", OPTION_VAL_90_KO }, + { "100%", OPTION_VAL_100_O45_KO }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_nl = { - option_cats_nl, - option_defs_nl -}; - -/* RETRO_LANGUAGE_NO */ - -#define CATEGORY_SYSTEM_LABEL_NO NULL -#define CATEGORY_SYSTEM_INFO_0_NO NULL -#define CATEGORY_VIDEO_LABEL_NO NULL -#define CATEGORY_VIDEO_INFO_0_NO NULL -#define CATEGORY_PERFORMANCE_LABEL_NO NULL -#define CATEGORY_PERFORMANCE_INFO_0_NO NULL -#define CATEGORY_HACKS_LABEL_NO NULL -#define CATEGORY_HACKS_INFO_0_NO NULL -#define CATEGORY_INPUT_LABEL_NO "Inndata" -#define CATEGORY_INPUT_INFO_0_NO NULL -#define CATEGORY_VMU_LABEL_NO NULL -#define CATEGORY_VMU_INFO_0_NO NULL -#define CORE_OPTION_NAME_REGION_LABEL_NO NULL -#define OPTION_VAL_JAPAN_NO NULL -#define OPTION_VAL_USA_NO NULL -#define OPTION_VAL_EUROPE_NO NULL -#define OPTION_VAL_DEFAULT_NO NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_NO NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_NO NULL -#define OPTION_VAL_JAPANESE_NO NULL -#define OPTION_VAL_ENGLISH_NO NULL -#define OPTION_VAL_GERMAN_NO NULL -#define OPTION_VAL_FRENCH_NO NULL -#define OPTION_VAL_SPANISH_NO NULL -#define OPTION_VAL_ITALIAN_NO NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_NO NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_NO NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NO NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NO NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_NO NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NO NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_NO NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_NO NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NO NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NO NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NO NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NO NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_NO NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NO NULL -#define CORE_OPTION_NAME_UPNP_LABEL_NO NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_NO NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NO "Intern oppløsning" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NO NULL -#define OPTION_VAL_320X240_NO NULL -#define OPTION_VAL_640X480_NO NULL -#define OPTION_VAL_800X600_NO NULL -#define OPTION_VAL_960X720_NO NULL -#define OPTION_VAL_1024X768_NO NULL -#define OPTION_VAL_1280X960_NO NULL -#define OPTION_VAL_1440X1080_NO NULL -#define OPTION_VAL_1600X1200_NO NULL -#define OPTION_VAL_1920X1440_NO NULL -#define OPTION_VAL_2560X1920_NO NULL -#define OPTION_VAL_2880X2160_NO NULL -#define OPTION_VAL_3200X2400_NO NULL -#define OPTION_VAL_3840X2880_NO NULL -#define OPTION_VAL_4480X3360_NO NULL -#define OPTION_VAL_5120X3840_NO NULL -#define OPTION_VAL_5760X4320_NO NULL -#define OPTION_VAL_6400X4800_NO NULL -#define OPTION_VAL_7040X5280_NO NULL -#define OPTION_VAL_7680X5760_NO NULL -#define OPTION_VAL_8320X6240_NO NULL -#define OPTION_VAL_8960X6720_NO NULL -#define OPTION_VAL_9600X7200_NO NULL -#define OPTION_VAL_10240X7680_NO NULL -#define OPTION_VAL_10880X8160_NO NULL -#define OPTION_VAL_11520X8640_NO NULL -#define OPTION_VAL_12160X9120_NO NULL -#define OPTION_VAL_12800X9600_NO NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_NO NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NO NULL -#define OPTION_VAL_VGA_NO NULL -#define OPTION_VAL_TV_RGB_NO NULL -#define OPTION_VAL_TV_COMPOSITE_NO NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_NO NULL -#define OPTION_VAL_NTSC_NO NULL -#define OPTION_VAL_PAL_NO NULL -#define OPTION_VAL_PAL_N_NO NULL -#define OPTION_VAL_PAL_M_NO NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NO "Skjermorientering" -#define OPTION_VAL_HORIZONTAL_NO NULL -#define OPTION_VAL_VERTICAL_NO NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NO NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NO NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_NO NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_NO NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NO NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NO NULL -#define OPTION_VAL_512MB_NO NULL -#define OPTION_VAL_1GB_NO NULL -#define OPTION_VAL_2GB_NO NULL -#define OPTION_VAL_4GB_NO NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_NO NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NO NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NO NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NO NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NO NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NO NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_NO NULL -#define CORE_OPTION_NAME_FOG_LABEL_NO NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NO NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NO NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NO NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NO NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NO NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NO NULL -#define OPTION_VAL_1_NO NULL -#define OPTION_VAL_2_NO NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NO NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NO NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NO NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NO NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NO NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_NO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NO NULL -#define OPTION_VAL_2_O27_NO NULL -#define OPTION_VAL_4_NO NULL -#define OPTION_VAL_6_NO NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NO NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NO NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NO NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NO NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NO NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NO NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NO NULL -#define OPTION_VAL_SOME_NO NULL -#define OPTION_VAL_MORE_NO NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NO NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NO NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NO NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NO NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NO NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NO NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NO NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NO NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_NO NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_NO NULL -#define OPTION_VAL_100_NO NULL -#define OPTION_VAL_110_NO NULL -#define OPTION_VAL_120_NO NULL -#define OPTION_VAL_130_NO NULL -#define OPTION_VAL_140_NO NULL -#define OPTION_VAL_150_NO NULL -#define OPTION_VAL_160_NO NULL -#define OPTION_VAL_170_NO NULL -#define OPTION_VAL_180_NO NULL -#define OPTION_VAL_190_NO NULL -#define OPTION_VAL_200_NO NULL -#define OPTION_VAL_210_NO NULL -#define OPTION_VAL_220_NO NULL -#define OPTION_VAL_230_NO NULL -#define OPTION_VAL_240_NO NULL -#define OPTION_VAL_250_NO NULL -#define OPTION_VAL_260_NO NULL -#define OPTION_VAL_270_NO NULL -#define OPTION_VAL_280_NO NULL -#define OPTION_VAL_290_NO NULL -#define OPTION_VAL_300_NO NULL -#define OPTION_VAL_310_NO NULL -#define OPTION_VAL_320_NO NULL -#define OPTION_VAL_330_NO NULL -#define OPTION_VAL_340_NO NULL -#define OPTION_VAL_350_NO NULL -#define OPTION_VAL_360_NO NULL -#define OPTION_VAL_370_NO NULL -#define OPTION_VAL_380_NO NULL -#define OPTION_VAL_390_NO NULL -#define OPTION_VAL_400_NO NULL -#define OPTION_VAL_410_NO NULL -#define OPTION_VAL_420_NO NULL -#define OPTION_VAL_430_NO NULL -#define OPTION_VAL_440_NO NULL -#define OPTION_VAL_450_NO NULL -#define OPTION_VAL_460_NO NULL -#define OPTION_VAL_470_NO NULL -#define OPTION_VAL_480_NO NULL -#define OPTION_VAL_490_NO NULL -#define OPTION_VAL_500_NO NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NO NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NO NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NO NULL -#define OPTION_VAL_0_NO NULL -#define OPTION_VAL_5_NO NULL -#define OPTION_VAL_10_NO NULL -#define OPTION_VAL_15_NO NULL -#define OPTION_VAL_20_NO NULL -#define OPTION_VAL_25_NO NULL -#define OPTION_VAL_30_NO NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NO NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NO NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_NO NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_NO NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NO NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NO NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NO NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NO NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NO NULL -#define OPTION_VAL_WHITE_NO NULL -#define OPTION_VAL_RED_NO NULL -#define OPTION_VAL_GREEN_NO NULL -#define OPTION_VAL_BLUE_NO NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NO NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NO NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NO NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NO NULL -#define OPTION_VAL_VMU_A1_NO NULL -#define OPTION_VAL_ALL_VMUS_NO NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NO NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_NO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NO NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NO NULL -#define OPTION_VAL_UPPER_LEFT_NO NULL -#define OPTION_VAL_UPPER_RIGHT_NO NULL -#define OPTION_VAL_LOWER_LEFT_NO NULL -#define OPTION_VAL_LOWER_RIGHT_NO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NO NULL -#define OPTION_VAL_1X_NO NULL -#define OPTION_VAL_3X_NO NULL -#define OPTION_VAL_5X_NO NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NO NULL -#define OPTION_VAL_DEFAULT_ON_00_NO NULL -#define OPTION_VAL_DEFAULT_OFF_01_NO NULL -#define OPTION_VAL_BLACK_02_NO NULL -#define OPTION_VAL_LIGHT_BLUE_04_NO NULL -#define OPTION_VAL_CYAN_06_NO NULL -#define OPTION_VAL_CYAN_BLUE_07_NO NULL -#define OPTION_VAL_LIGHT_GREEN_08_NO NULL -#define OPTION_VAL_CYAN_GREEN_09_NO NULL -#define OPTION_VAL_LIGHT_CYAN_10_NO NULL -#define OPTION_VAL_PURPLE_12_NO NULL -#define OPTION_VAL_LIGHT_PURPLE_13_NO NULL -#define OPTION_VAL_YELLOW_14_NO NULL -#define OPTION_VAL_GRAY_15_NO NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_NO NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_NO NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_NO NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_NO NULL -#define OPTION_VAL_LIGHT_RED_2_20_NO NULL -#define OPTION_VAL_MAGENTA_21_NO NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_NO NULL -#define OPTION_VAL_LIGHT_ORANGE_23_NO NULL -#define OPTION_VAL_ORANGE_24_NO NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_NO NULL -#define OPTION_VAL_LIGHT_YELLOW_26_NO NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_NO NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NO NULL -#define OPTION_VAL_40_NO NULL -#define OPTION_VAL_50_NO NULL -#define OPTION_VAL_60_NO NULL -#define OPTION_VAL_70_NO NULL -#define OPTION_VAL_80_NO NULL -#define OPTION_VAL_90_NO NULL -#define OPTION_VAL_100_O57_NO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NO NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NO NULL - -struct retro_core_option_v2_category option_cats_no[] = { - { - "system", - CATEGORY_SYSTEM_LABEL_NO, - CATEGORY_SYSTEM_INFO_0_NO - }, - { - "video", - CATEGORY_VIDEO_LABEL_NO, - CATEGORY_VIDEO_INFO_0_NO - }, - { - "performance", - CATEGORY_PERFORMANCE_LABEL_NO, - CATEGORY_PERFORMANCE_INFO_0_NO - }, - { - "hacks", - CATEGORY_HACKS_LABEL_NO, - CATEGORY_HACKS_INFO_0_NO - }, - { - "input", - CATEGORY_INPUT_LABEL_NO, - CATEGORY_INPUT_INFO_0_NO - }, - { - "vmu", - CATEGORY_VMU_LABEL_NO, - CATEGORY_VMU_INFO_0_NO - }, - { NULL, NULL, NULL }, -}; -struct retro_core_option_v2_definition option_defs_no[] = { { - CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_NO, + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_KO, NULL, "", NULL, - "system", + "vmu", { - { "Japan", OPTION_VAL_JAPAN_NO }, - { "USA", OPTION_VAL_USA_NO }, - { "Europe", OPTION_VAL_EUROPE_NO }, - { "Default", OPTION_VAL_DEFAULT_NO }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "USA", + "disabled", }, { - CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_NO, + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_KO, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_NO, + "", NULL, - "system", + "vmu", { - { "Japanese", OPTION_VAL_JAPANESE_NO }, - { "English", OPTION_VAL_ENGLISH_NO }, - { "German", OPTION_VAL_GERMAN_NO }, - { "French", OPTION_VAL_FRENCH_NO }, - { "Spanish", OPTION_VAL_SPANISH_NO }, - { "Italian", OPTION_VAL_ITALIAN_NO }, - { "Default", OPTION_VAL_DEFAULT_NO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_KO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_KO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_KO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_KO }, { NULL, NULL }, }, - "English", - }, - { - CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_NO, - NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_NO, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL}, - }, - "disabled", + "Lower Right", }, { - CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NO, + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_KO, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "1x", OPTION_VAL_1X_KO }, + { "2x", OPTION_VAL_2_O26_KO }, + { "3x", OPTION_VAL_3X_KO }, + { "4x", OPTION_VAL_4_KO }, + { "5x", OPTION_VAL_5X_KO }, { NULL, NULL }, }, - "disabled", + "1x", }, { - CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_NO, + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_KO, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NO, + "", NULL, - "system", + "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, -#ifdef LOW_END - "disabled", -#else - "enabled", -#endif + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_KO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_KO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_KO }, + { "BLACK 02", OPTION_VAL_BLACK_02_KO }, + { "BLUE 03", OPTION_VAL_BLUE_KO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_KO }, + { "GREEN 05", OPTION_VAL_GREEN_KO }, + { "CYAN 06", OPTION_VAL_CYAN_06_KO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_KO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_KO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_KO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_KO }, + { "RED 11", OPTION_VAL_RED_KO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_KO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_KO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_KO }, + { "GRAY 15", OPTION_VAL_GRAY_15_KO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_KO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_KO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_KO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_KO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_KO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_KO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_KO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_KO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_KO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_KO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_KO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_KO }, + { "WHITE 28", OPTION_VAL_WHITE_KO }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_KO, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_KO }, + { "20%", OPTION_VAL_20_KO }, + { "30%", OPTION_VAL_30_KO }, + { "40%", OPTION_VAL_40_KO }, + { "50%", OPTION_VAL_50_KO }, + { "60%", OPTION_VAL_60_KO }, + { "70%", OPTION_VAL_70_KO }, + { "80%", OPTION_VAL_80_KO }, + { "90%", OPTION_VAL_90_KO }, + { "100%", OPTION_VAL_100_O45_KO }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_ko = { + option_cats_ko, + option_defs_ko +}; + +/* RETRO_LANGUAGE_NL */ + +#define CATEGORY_SYSTEM_LABEL_NL "Systeem" +#define CATEGORY_SYSTEM_INFO_0_NL NULL +#define CATEGORY_VIDEO_LABEL_NL NULL +#define CATEGORY_VIDEO_INFO_0_NL NULL +#define CATEGORY_PERFORMANCE_LABEL_NL NULL +#define CATEGORY_PERFORMANCE_INFO_0_NL NULL +#define CATEGORY_HACKS_LABEL_NL NULL +#define CATEGORY_HACKS_INFO_0_NL NULL +#define CATEGORY_INPUT_LABEL_NL "Invoer" +#define CATEGORY_INPUT_INFO_0_NL NULL +#define CATEGORY_EXPANSIONS_LABEL_NL NULL +#define CATEGORY_EXPANSIONS_INFO_0_NL NULL +#define CATEGORY_VMU_LABEL_NL NULL +#define CATEGORY_VMU_INFO_0_NL NULL +#define CORE_OPTION_NAME_REGION_LABEL_NL "Regio" +#define OPTION_VAL_JAPAN_NL NULL +#define OPTION_VAL_USA_NL NULL +#define OPTION_VAL_EUROPE_NL NULL +#define OPTION_VAL_DEFAULT_NL NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_NL "Taal" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_NL NULL +#define OPTION_VAL_JAPANESE_NL "Japans" +#define OPTION_VAL_ENGLISH_NL "Engels" +#define OPTION_VAL_GERMAN_NL "Duits" +#define OPTION_VAL_FRENCH_NL "Frans" +#define OPTION_VAL_SPANISH_NL "Spaans" +#define OPTION_VAL_ITALIAN_NL "Italiaans" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_NL NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_NL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_NL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NL NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NL NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NL NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NL NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NL NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_NL NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NL NULL +#define CORE_OPTION_NAME_UPNP_LABEL_NL NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_NL NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NL NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NL NULL +#define OPTION_VAL_320X240_NL NULL +#define OPTION_VAL_640X480_NL NULL +#define OPTION_VAL_800X600_NL NULL +#define OPTION_VAL_960X720_NL NULL +#define OPTION_VAL_1024X768_NL NULL +#define OPTION_VAL_1280X960_NL NULL +#define OPTION_VAL_1440X1080_NL NULL +#define OPTION_VAL_1600X1200_NL NULL +#define OPTION_VAL_1920X1440_NL NULL +#define OPTION_VAL_2560X1920_NL NULL +#define OPTION_VAL_2880X2160_NL NULL +#define OPTION_VAL_3200X2400_NL NULL +#define OPTION_VAL_3840X2880_NL NULL +#define OPTION_VAL_4480X3360_NL NULL +#define OPTION_VAL_5120X3840_NL NULL +#define OPTION_VAL_5760X4320_NL NULL +#define OPTION_VAL_6400X4800_NL NULL +#define OPTION_VAL_7040X5280_NL NULL +#define OPTION_VAL_7680X5760_NL NULL +#define OPTION_VAL_8320X6240_NL NULL +#define OPTION_VAL_8960X6720_NL NULL +#define OPTION_VAL_9600X7200_NL NULL +#define OPTION_VAL_10240X7680_NL NULL +#define OPTION_VAL_10880X8160_NL NULL +#define OPTION_VAL_11520X8640_NL NULL +#define OPTION_VAL_12160X9120_NL NULL +#define OPTION_VAL_12800X9600_NL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_NL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NL NULL +#define OPTION_VAL_VGA_NL NULL +#define OPTION_VAL_TV_RGB_NL NULL +#define OPTION_VAL_TV_COMPOSITE_NL NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_NL NULL +#define OPTION_VAL_NTSC_NL NULL +#define OPTION_VAL_PAL_NL NULL +#define OPTION_VAL_PAL_N_NL NULL +#define OPTION_VAL_PAL_M_NL NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NL "Schermoriëntatie" +#define OPTION_VAL_HORIZONTAL_NL NULL +#define OPTION_VAL_VERTICAL_NL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_NL NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NL NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_NL NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_NL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NL NULL +#define OPTION_VAL_512MB_NL NULL +#define OPTION_VAL_1GB_NL NULL +#define OPTION_VAL_2GB_NL NULL +#define OPTION_VAL_4GB_NL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_NL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NL NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NL NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NL NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_NL NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_NL NULL +#define CORE_OPTION_NAME_FOG_LABEL_NL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NL NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NL NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NL NULL +#define OPTION_VAL_1_NL NULL +#define OPTION_VAL_2_NL NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NL NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NL NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NL NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_NL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NL NULL +#define OPTION_VAL_2_O26_NL NULL +#define OPTION_VAL_4_NL NULL +#define OPTION_VAL_6_NL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_NL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_NL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_NL NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NL "Gedraaide Rendering" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NL "Voert de GPU en CPU uit op verschillende threads. Zeer aanbevolen." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NL NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NL "Automatisch frames overslaan wanneer de emulator traag draait. Deze instelling is alleen van toepassing wanneer 'Gedraaide Rendering' is ingeschakeld." +#define OPTION_VAL_SOME_NL "Normaal" +#define OPTION_VAL_MORE_NL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_NL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_NL NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_NL NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_NL NULL +#define OPTION_VAL_100_NL NULL +#define OPTION_VAL_110_NL NULL +#define OPTION_VAL_120_NL NULL +#define OPTION_VAL_130_NL NULL +#define OPTION_VAL_140_NL NULL +#define OPTION_VAL_150_NL NULL +#define OPTION_VAL_160_NL NULL +#define OPTION_VAL_170_NL NULL +#define OPTION_VAL_180_NL NULL +#define OPTION_VAL_190_NL NULL +#define OPTION_VAL_200_NL NULL +#define OPTION_VAL_210_NL NULL +#define OPTION_VAL_220_NL NULL +#define OPTION_VAL_230_NL NULL +#define OPTION_VAL_240_NL NULL +#define OPTION_VAL_250_NL NULL +#define OPTION_VAL_260_NL NULL +#define OPTION_VAL_270_NL NULL +#define OPTION_VAL_280_NL NULL +#define OPTION_VAL_290_NL NULL +#define OPTION_VAL_300_NL NULL +#define OPTION_VAL_310_NL NULL +#define OPTION_VAL_320_NL NULL +#define OPTION_VAL_330_NL NULL +#define OPTION_VAL_340_NL NULL +#define OPTION_VAL_350_NL NULL +#define OPTION_VAL_360_NL NULL +#define OPTION_VAL_370_NL NULL +#define OPTION_VAL_380_NL NULL +#define OPTION_VAL_390_NL NULL +#define OPTION_VAL_400_NL NULL +#define OPTION_VAL_410_NL NULL +#define OPTION_VAL_420_NL NULL +#define OPTION_VAL_430_NL NULL +#define OPTION_VAL_440_NL NULL +#define OPTION_VAL_450_NL NULL +#define OPTION_VAL_460_NL NULL +#define OPTION_VAL_470_NL NULL +#define OPTION_VAL_480_NL NULL +#define OPTION_VAL_490_NL NULL +#define OPTION_VAL_500_NL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_NL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_NL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_NL NULL +#define OPTION_VAL_0_NL NULL +#define OPTION_VAL_5_NL NULL +#define OPTION_VAL_10_NL NULL +#define OPTION_VAL_15_NL NULL +#define OPTION_VAL_20_NL NULL +#define OPTION_VAL_25_NL NULL +#define OPTION_VAL_30_NL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_NL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_NL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NL NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_NL NULL +#define OPTION_VAL_50_NL NULL +#define OPTION_VAL_60_NL NULL +#define OPTION_VAL_70_NL NULL +#define OPTION_VAL_80_NL NULL +#define OPTION_VAL_90_NL NULL +#define OPTION_VAL_100_O45_NL NULL +#define OPTION_VAL_110_O45_NL NULL +#define OPTION_VAL_120_O45_NL NULL +#define OPTION_VAL_130_O45_NL NULL +#define OPTION_VAL_140_O45_NL NULL +#define OPTION_VAL_150_O45_NL NULL +#define OPTION_VAL_160_O45_NL NULL +#define OPTION_VAL_170_O45_NL NULL +#define OPTION_VAL_180_O45_NL NULL +#define OPTION_VAL_190_O45_NL NULL +#define OPTION_VAL_200_O45_NL NULL +#define OPTION_VAL_210_O45_NL NULL +#define OPTION_VAL_220_O45_NL NULL +#define OPTION_VAL_230_O45_NL NULL +#define OPTION_VAL_240_O45_NL NULL +#define OPTION_VAL_250_O45_NL NULL +#define OPTION_VAL_260_O45_NL NULL +#define OPTION_VAL_270_O45_NL NULL +#define OPTION_VAL_280_O45_NL NULL +#define OPTION_VAL_290_O45_NL NULL +#define OPTION_VAL_300_O45_NL NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NL NULL +#define OPTION_VAL_WHITE_NL NULL +#define OPTION_VAL_RED_NL "Rood" +#define OPTION_VAL_GREEN_NL "Groen" +#define OPTION_VAL_BLUE_NL "Blauw" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NL NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NL NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_NL NULL +#define OPTION_VAL_VMU_NL NULL +#define OPTION_VAL_PURUPURU_NL NULL +#define OPTION_VAL_NONE_NL "Geen" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_NL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_NL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NL NULL +#define OPTION_VAL_VMU_A1_NL NULL +#define OPTION_VAL_ALL_VMUS_NL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NL NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_NL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NL NULL +#define OPTION_VAL_UPPER_LEFT_NL NULL +#define OPTION_VAL_UPPER_RIGHT_NL NULL +#define OPTION_VAL_LOWER_LEFT_NL NULL +#define OPTION_VAL_LOWER_RIGHT_NL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NL NULL +#define OPTION_VAL_1X_NL NULL +#define OPTION_VAL_3X_NL NULL +#define OPTION_VAL_5X_NL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NL NULL +#define OPTION_VAL_DEFAULT_ON_00_NL NULL +#define OPTION_VAL_DEFAULT_OFF_01_NL NULL +#define OPTION_VAL_BLACK_02_NL NULL +#define OPTION_VAL_LIGHT_BLUE_04_NL NULL +#define OPTION_VAL_CYAN_06_NL NULL +#define OPTION_VAL_CYAN_BLUE_07_NL NULL +#define OPTION_VAL_LIGHT_GREEN_08_NL NULL +#define OPTION_VAL_CYAN_GREEN_09_NL NULL +#define OPTION_VAL_LIGHT_CYAN_10_NL NULL +#define OPTION_VAL_PURPLE_12_NL NULL +#define OPTION_VAL_LIGHT_PURPLE_13_NL NULL +#define OPTION_VAL_YELLOW_14_NL "Geel" +#define OPTION_VAL_GRAY_15_NL NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_NL NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_NL NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_NL NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_NL NULL +#define OPTION_VAL_LIGHT_RED_2_20_NL NULL +#define OPTION_VAL_MAGENTA_21_NL NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_NL NULL +#define OPTION_VAL_LIGHT_ORANGE_23_NL NULL +#define OPTION_VAL_ORANGE_24_NL NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_NL NULL +#define OPTION_VAL_LIGHT_YELLOW_26_NL NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_NL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NL NULL +#define OPTION_VAL_40_NL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NL NULL + +struct retro_core_option_v2_category option_cats_nl[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_NL, + CATEGORY_SYSTEM_INFO_0_NL + }, + { + "video", + CATEGORY_VIDEO_LABEL_NL, + CATEGORY_VIDEO_INFO_0_NL + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_NL, + CATEGORY_PERFORMANCE_INFO_0_NL + }, + { + "hacks", + CATEGORY_HACKS_LABEL_NL, + CATEGORY_HACKS_INFO_0_NL + }, + { + "input", + CATEGORY_INPUT_LABEL_NL, + CATEGORY_INPUT_INFO_0_NL + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_NL, + CATEGORY_EXPANSIONS_INFO_0_NL + }, + { + "vmu", + CATEGORY_VMU_LABEL_NL, + CATEGORY_VMU_INFO_0_NL + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_nl[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_NL, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_NL }, + { "USA", OPTION_VAL_USA_NL }, + { "Europe", OPTION_VAL_EUROPE_NL }, + { "Default", OPTION_VAL_DEFAULT_NL }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_NL, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_NL, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_NL }, + { "English", OPTION_VAL_ENGLISH_NL }, + { "German", OPTION_VAL_GERMAN_NL }, + { "French", OPTION_VAL_FRENCH_NL }, + { "Spanish", OPTION_VAL_SPANISH_NL }, + { "Italian", OPTION_VAL_ITALIAN_NL }, + { "Default", OPTION_VAL_DEFAULT_NL }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_NL, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_NL, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NL, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NL, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", }, { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_NO, + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_NL, NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_NO, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NL, NULL, "system", { @@ -47239,13 +52840,17 @@ struct retro_core_option_v2_definition option_defs_no[] = { { "enabled", NULL }, { NULL, NULL }, }, +#ifdef LOW_END "disabled", +#else + "enabled", +#endif }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NO, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NL, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NO, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NL, NULL, "system", { @@ -47257,9 +52862,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NO, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NL, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NO, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NL, NULL, "system", { @@ -47271,9 +52876,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_NO, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_NL, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NO, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NL, NULL, "system", { @@ -47285,9 +52890,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_NO, + CORE_OPTION_NAME_UPNP_LABEL_NL, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_NO, + CORE_OPTION_NAME_UPNP_INFO_0_NL, NULL, "system", { @@ -47300,39 +52905,39 @@ struct retro_core_option_v2_definition option_defs_no[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NO, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NL, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NO, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NL, NULL, "video", { - { "320x240", OPTION_VAL_320X240_NO }, - { "640x480", OPTION_VAL_640X480_NO }, - { "800x600", OPTION_VAL_800X600_NO }, - { "960x720", OPTION_VAL_960X720_NO }, - { "1024x768", OPTION_VAL_1024X768_NO }, - { "1280x960", OPTION_VAL_1280X960_NO }, - { "1440x1080", OPTION_VAL_1440X1080_NO }, - { "1600x1200", OPTION_VAL_1600X1200_NO }, - { "1920x1440", OPTION_VAL_1920X1440_NO }, - { "2560x1920", OPTION_VAL_2560X1920_NO }, - { "2880x2160", OPTION_VAL_2880X2160_NO }, - { "3200x2400", OPTION_VAL_3200X2400_NO }, - { "3840x2880", OPTION_VAL_3840X2880_NO }, - { "4480x3360", OPTION_VAL_4480X3360_NO }, - { "5120x3840", OPTION_VAL_5120X3840_NO }, - { "5760x4320", OPTION_VAL_5760X4320_NO }, - { "6400x4800", OPTION_VAL_6400X4800_NO }, - { "7040x5280", OPTION_VAL_7040X5280_NO }, - { "7680x5760", OPTION_VAL_7680X5760_NO }, - { "8320x6240", OPTION_VAL_8320X6240_NO }, - { "8960x6720", OPTION_VAL_8960X6720_NO }, - { "9600x7200", OPTION_VAL_9600X7200_NO }, - { "10240x7680", OPTION_VAL_10240X7680_NO }, - { "10880x8160", OPTION_VAL_10880X8160_NO }, - { "11520x8640", OPTION_VAL_11520X8640_NO }, - { "12160x9120", OPTION_VAL_12160X9120_NO }, - { "12800x9600", OPTION_VAL_12800X9600_NO }, + { "320x240", OPTION_VAL_320X240_NL }, + { "640x480", OPTION_VAL_640X480_NL }, + { "800x600", OPTION_VAL_800X600_NL }, + { "960x720", OPTION_VAL_960X720_NL }, + { "1024x768", OPTION_VAL_1024X768_NL }, + { "1280x960", OPTION_VAL_1280X960_NL }, + { "1440x1080", OPTION_VAL_1440X1080_NL }, + { "1600x1200", OPTION_VAL_1600X1200_NL }, + { "1920x1440", OPTION_VAL_1920X1440_NL }, + { "2560x1920", OPTION_VAL_2560X1920_NL }, + { "2880x2160", OPTION_VAL_2880X2160_NL }, + { "3200x2400", OPTION_VAL_3200X2400_NL }, + { "3840x2880", OPTION_VAL_3840X2880_NL }, + { "4480x3360", OPTION_VAL_4480X3360_NL }, + { "5120x3840", OPTION_VAL_5120X3840_NL }, + { "5760x4320", OPTION_VAL_5760X4320_NL }, + { "6400x4800", OPTION_VAL_6400X4800_NL }, + { "7040x5280", OPTION_VAL_7040X5280_NL }, + { "7680x5760", OPTION_VAL_7680X5760_NL }, + { "8320x6240", OPTION_VAL_8320X6240_NL }, + { "8960x6720", OPTION_VAL_8960X6720_NL }, + { "9600x7200", OPTION_VAL_9600X7200_NL }, + { "10240x7680", OPTION_VAL_10240X7680_NL }, + { "10880x8160", OPTION_VAL_10880X8160_NL }, + { "11520x8640", OPTION_VAL_11520X8640_NL }, + { "12160x9120", OPTION_VAL_12160X9120_NL }, + { "12800x9600", OPTION_VAL_12800X9600_NL }, { NULL, NULL }, }, #ifdef LOW_RES @@ -47343,62 +52948,62 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_NO, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_NL, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NO, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NL, NULL, "video", { - { "VGA", OPTION_VAL_VGA_NO }, - { "TV (RGB)", OPTION_VAL_TV_RGB_NO }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_NO }, + { "VGA", OPTION_VAL_VGA_NL }, + { "TV (RGB)", OPTION_VAL_TV_RGB_NL }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_NL }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_NO, + CORE_OPTION_NAME_BROADCAST_LABEL_NL, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_NO }, - { "PAL", OPTION_VAL_PAL_NO }, - { "PAL_N", OPTION_VAL_PAL_N_NO }, - { "PAL_M", OPTION_VAL_PAL_M_NO }, - { "Default", OPTION_VAL_DEFAULT_NO }, + { "NTSC", OPTION_VAL_NTSC_NL }, + { "PAL", OPTION_VAL_PAL_NL }, + { "PAL_N", OPTION_VAL_PAL_N_NL }, + { "PAL_M", OPTION_VAL_PAL_M_NL }, + { "Default", OPTION_VAL_DEFAULT_NL }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NO, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NL, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_NO }, - { "vertical", OPTION_VAL_VERTICAL_NO }, + { "horizontal", OPTION_VAL_HORIZONTAL_NL }, + { "vertical", OPTION_VAL_VERTICAL_NL }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NO, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_NL, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NO }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_NO }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NL }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_NL }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_NO }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_NL }, #endif { NULL, NULL }, }, @@ -47411,25 +53016,25 @@ struct retro_core_option_v2_definition option_defs_no[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NO, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NL, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NO, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NL, NULL, "video", { - { "512MB", OPTION_VAL_512MB_NO }, - { "1GB", OPTION_VAL_1GB_NO }, - { "2GB", OPTION_VAL_2GB_NO }, - { "4GB", OPTION_VAL_4GB_NO }, + { "512MB", OPTION_VAL_512MB_NL }, + { "1GB", OPTION_VAL_1GB_NL }, + { "2GB", OPTION_VAL_2GB_NL }, + { "4GB", OPTION_VAL_4GB_NL }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_NO, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_NL, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NO, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NL, NULL, "video", { @@ -47437,6 +53042,7 @@ struct retro_core_option_v2_definition option_defs_no[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -47445,9 +53051,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NO, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NL, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NO, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NL, NULL, "video", { @@ -47459,9 +53065,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NO, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NL, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NO, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NL, NULL, "video", { @@ -47471,11 +53077,11 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_NO, + CORE_OPTION_NAME_MIPMAPPING_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_NL, NULL, "video", { @@ -47487,7 +53093,7 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_NO, + CORE_OPTION_NAME_FOG_LABEL_NL, NULL, "", NULL, @@ -47501,9 +53107,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NL, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NO, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NL, NULL, "video", { @@ -47515,9 +53121,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NL, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NO, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NL, NULL, "video", { @@ -47532,24 +53138,24 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NO, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NL, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NO, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NL, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_NO }, - { "1", OPTION_VAL_1_NO }, - { "2", OPTION_VAL_2_NO }, + { "0", OPTION_VAL_DEFAULT_NL }, + { "1", OPTION_VAL_1_NL }, + { "2", OPTION_VAL_2_NL }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NL, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NO, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NL, NULL, "video", { @@ -47557,13 +53163,13 @@ struct retro_core_option_v2_definition option_defs_no[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NL, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NO, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NL, NULL, "video", { @@ -47575,9 +53181,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NO, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NL, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NO, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NL, NULL, "video", { @@ -47590,25 +53196,25 @@ struct retro_core_option_v2_definition option_defs_no[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_NO, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_NL, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NO, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NL, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_NO }, - { "4", OPTION_VAL_4_NO }, - { "6", OPTION_VAL_6_NO }, + { "2", OPTION_VAL_2_O26_NL }, + { "4", OPTION_VAL_4_NL }, + { "6", OPTION_VAL_6_NL }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NO, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_NL, NULL, "video", { @@ -47622,9 +53228,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NL, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NO, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NL, NULL, "video", { @@ -47634,11 +53240,25 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_NL, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_NL, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NO, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NL, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NO, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NL, NULL, "performance", { @@ -47650,15 +53270,15 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NL, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NO, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NL, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_NO }, - { "more", OPTION_VAL_MORE_NO }, + { "some", OPTION_VAL_SOME_NL }, + { "more", OPTION_VAL_MORE_NL }, { NULL, NULL }, }, #ifdef LOW_END @@ -47669,9 +53289,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NO, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NL, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NO, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NL, NULL, "performance", { @@ -47688,9 +53308,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NL, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NO, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NL, NULL, "hacks", { @@ -47702,9 +53322,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NO, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NL, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NO, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NL, NULL, "hacks", { @@ -47716,9 +53336,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NL, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NO, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NL, NULL, "hacks", { @@ -47732,64 +53352,78 @@ struct retro_core_option_v2_definition option_defs_no[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_NL, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_NL, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_NO, + CORE_OPTION_NAME_SH4CLOCK_LABEL_NL, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_NO, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_NL, NULL, "hacks", { - { "100", OPTION_VAL_100_NO }, - { "110", OPTION_VAL_110_NO }, - { "120", OPTION_VAL_120_NO }, - { "130", OPTION_VAL_130_NO }, - { "140", OPTION_VAL_140_NO }, - { "150", OPTION_VAL_150_NO }, - { "160", OPTION_VAL_160_NO }, - { "170", OPTION_VAL_170_NO }, - { "180", OPTION_VAL_180_NO }, - { "190", OPTION_VAL_190_NO }, - { "200", OPTION_VAL_200_NO }, - { "210", OPTION_VAL_210_NO }, - { "220", OPTION_VAL_220_NO }, - { "230", OPTION_VAL_230_NO }, - { "240", OPTION_VAL_240_NO }, - { "250", OPTION_VAL_250_NO }, - { "260", OPTION_VAL_260_NO }, - { "270", OPTION_VAL_270_NO }, - { "280", OPTION_VAL_280_NO }, - { "290", OPTION_VAL_290_NO }, - { "300", OPTION_VAL_300_NO }, - { "310", OPTION_VAL_310_NO }, - { "320", OPTION_VAL_320_NO }, - { "330", OPTION_VAL_330_NO }, - { "340", OPTION_VAL_340_NO }, - { "350", OPTION_VAL_350_NO }, - { "360", OPTION_VAL_360_NO }, - { "370", OPTION_VAL_370_NO }, - { "380", OPTION_VAL_380_NO }, - { "390", OPTION_VAL_390_NO }, - { "400", OPTION_VAL_400_NO }, - { "410", OPTION_VAL_410_NO }, - { "420", OPTION_VAL_420_NO }, - { "430", OPTION_VAL_430_NO }, - { "440", OPTION_VAL_440_NO }, - { "450", OPTION_VAL_450_NO }, - { "460", OPTION_VAL_460_NO }, - { "470", OPTION_VAL_470_NO }, - { "480", OPTION_VAL_480_NO }, - { "490", OPTION_VAL_490_NO }, - { "500", OPTION_VAL_500_NO }, + { "100", OPTION_VAL_100_NL }, + { "110", OPTION_VAL_110_NL }, + { "120", OPTION_VAL_120_NL }, + { "130", OPTION_VAL_130_NL }, + { "140", OPTION_VAL_140_NL }, + { "150", OPTION_VAL_150_NL }, + { "160", OPTION_VAL_160_NL }, + { "170", OPTION_VAL_170_NL }, + { "180", OPTION_VAL_180_NL }, + { "190", OPTION_VAL_190_NL }, + { "200", OPTION_VAL_200_NL }, + { "210", OPTION_VAL_210_NL }, + { "220", OPTION_VAL_220_NL }, + { "230", OPTION_VAL_230_NL }, + { "240", OPTION_VAL_240_NL }, + { "250", OPTION_VAL_250_NL }, + { "260", OPTION_VAL_260_NL }, + { "270", OPTION_VAL_270_NL }, + { "280", OPTION_VAL_280_NL }, + { "290", OPTION_VAL_290_NL }, + { "300", OPTION_VAL_300_NL }, + { "310", OPTION_VAL_310_NL }, + { "320", OPTION_VAL_320_NL }, + { "330", OPTION_VAL_330_NL }, + { "340", OPTION_VAL_340_NL }, + { "350", OPTION_VAL_350_NL }, + { "360", OPTION_VAL_360_NL }, + { "370", OPTION_VAL_370_NL }, + { "380", OPTION_VAL_380_NL }, + { "390", OPTION_VAL_390_NL }, + { "400", OPTION_VAL_400_NL }, + { "410", OPTION_VAL_410_NL }, + { "420", OPTION_VAL_420_NL }, + { "430", OPTION_VAL_430_NL }, + { "440", OPTION_VAL_440_NL }, + { "450", OPTION_VAL_450_NL }, + { "460", OPTION_VAL_460_NL }, + { "470", OPTION_VAL_470_NL }, + { "480", OPTION_VAL_480_NL }, + { "490", OPTION_VAL_490_NL }, + { "500", OPTION_VAL_500_NL }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NO, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_NL, NULL, "hacks", { @@ -47799,11 +53433,11 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NO, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_NL, NULL, "hacks", { @@ -47815,47 +53449,47 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NO, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_NL, NULL, "input", { - { "0%", OPTION_VAL_0_NO }, - { "5%", OPTION_VAL_5_NO }, - { "10%", OPTION_VAL_10_NO }, - { "15%", OPTION_VAL_15_NO }, - { "20%", OPTION_VAL_20_NO }, - { "25%", OPTION_VAL_25_NO }, - { "30%", OPTION_VAL_30_NO }, + { "0%", OPTION_VAL_0_NL }, + { "5%", OPTION_VAL_5_NL }, + { "10%", OPTION_VAL_10_NL }, + { "15%", OPTION_VAL_15_NL }, + { "20%", OPTION_VAL_20_NL }, + { "25%", OPTION_VAL_25_NL }, + { "30%", OPTION_VAL_30_NL }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NO, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_NL, NULL, "input", { - { "0%", OPTION_VAL_0_NO }, - { "5%", OPTION_VAL_5_NO }, - { "10%", OPTION_VAL_10_NO }, - { "15%", OPTION_VAL_15_NO }, - { "20%", OPTION_VAL_20_NO }, - { "25%", OPTION_VAL_25_NO }, - { "30%", OPTION_VAL_30_NO }, + { "0%", OPTION_VAL_0_NL }, + { "5%", OPTION_VAL_5_NL }, + { "10%", OPTION_VAL_10_NL }, + { "15%", OPTION_VAL_15_NL }, + { "20%", OPTION_VAL_20_NL }, + { "25%", OPTION_VAL_25_NL }, + { "30%", OPTION_VAL_30_NL }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NO, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NL, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_NL, NULL, "input", { @@ -47866,10 +53500,10 @@ struct retro_core_option_v2_definition option_defs_no[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_NO, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NL, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_NO, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NL, NULL, "input", { @@ -47877,124 +53511,268 @@ struct retro_core_option_v2_definition option_defs_no[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NO, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NL, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NO, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NL, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NO, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_NL, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NO, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_NL }, + { "60%", OPTION_VAL_60_NL }, + { "70%", OPTION_VAL_70_NL }, + { "80%", OPTION_VAL_80_NL }, + { "90%", OPTION_VAL_90_NL }, + { "100%", OPTION_VAL_100_O45_NL }, + { "110%", OPTION_VAL_110_O45_NL }, + { "120%", OPTION_VAL_120_O45_NL }, + { "130%", OPTION_VAL_130_O45_NL }, + { "140%", OPTION_VAL_140_O45_NL }, + { "150%", OPTION_VAL_150_O45_NL }, + { "160%", OPTION_VAL_160_O45_NL }, + { "170%", OPTION_VAL_170_O45_NL }, + { "180%", OPTION_VAL_180_O45_NL }, + { "190%", OPTION_VAL_190_O45_NL }, + { "200%", OPTION_VAL_200_O45_NL }, + { "210%", OPTION_VAL_210_O45_NL }, + { "220%", OPTION_VAL_220_O45_NL }, + { "230%", OPTION_VAL_230_O45_NL }, + { "240%", OPTION_VAL_240_O45_NL }, + { "250%", OPTION_VAL_250_O45_NL }, + { "260%", OPTION_VAL_260_O45_NL }, + { "270%", OPTION_VAL_270_O45_NL }, + { "280%", OPTION_VAL_280_O45_NL }, + { "290%", OPTION_VAL_290_O45_NL }, + { "300%", OPTION_VAL_300_O45_NL }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NO, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NO }, - { "Red", OPTION_VAL_RED_NO }, - { "Green", OPTION_VAL_GREEN_NO }, - { "Blue", OPTION_VAL_BLUE_NO }, + { "White", OPTION_VAL_WHITE_NL }, + { "Red", OPTION_VAL_RED_NL }, + { "Green", OPTION_VAL_GREEN_NL }, + { "Blue", OPTION_VAL_BLUE_NL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NO, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NO }, - { "Red", OPTION_VAL_RED_NO }, - { "Green", OPTION_VAL_GREEN_NO }, - { "Blue", OPTION_VAL_BLUE_NO }, + { "White", OPTION_VAL_WHITE_NL }, + { "Red", OPTION_VAL_RED_NL }, + { "Green", OPTION_VAL_GREEN_NL }, + { "Blue", OPTION_VAL_BLUE_NL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NO, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NO }, - { "Red", OPTION_VAL_RED_NO }, - { "Green", OPTION_VAL_GREEN_NO }, - { "Blue", OPTION_VAL_BLUE_NO }, + { "White", OPTION_VAL_WHITE_NL }, + { "Red", OPTION_VAL_RED_NL }, + { "Green", OPTION_VAL_GREEN_NL }, + { "Blue", OPTION_VAL_BLUE_NL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NO, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_NO }, - { "Red", OPTION_VAL_RED_NO }, - { "Green", OPTION_VAL_GREEN_NO }, - { "Blue", OPTION_VAL_BLUE_NO }, + { "White", OPTION_VAL_WHITE_NL }, + { "Red", OPTION_VAL_RED_NL }, + { "Green", OPTION_VAL_GREEN_NL }, + { "Blue", OPTION_VAL_BLUE_NL }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_NL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_NL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NL }, + { "Purupuru", OPTION_VAL_PURUPURU_NL }, + { "None", OPTION_VAL_NONE_NL }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NO, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NL, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_NO }, - { "All VMUs", OPTION_VAL_ALL_VMUS_NO }, + { "VMU A1", OPTION_VAL_VMU_A1_NL }, + { "All VMUs", OPTION_VAL_ALL_VMUS_NL }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_NO, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NO, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_NO, + CORE_OPTION_NAME_VMU_SOUND_LABEL_NL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NL, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_NL, NULL, "vmu", { @@ -48005,9 +53783,9 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NO, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NL, NULL, "vmu", { @@ -48019,7 +53797,7 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NO, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NL, NULL, "", NULL, @@ -48033,144 +53811,144 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NO, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NO, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NO }, - { "2x", OPTION_VAL_2_O27_NO }, - { "3x", OPTION_VAL_3X_NO }, - { "4x", OPTION_VAL_4_NO }, - { "5x", OPTION_VAL_5X_NO }, - { NULL, NULL }, + { "1x", OPTION_VAL_1X_NL }, + { "2x", OPTION_VAL_2_O26_NL }, + { "3x", OPTION_VAL_3X_NL }, + { "4x", OPTION_VAL_4_NL }, + { "5x", OPTION_VAL_5X_NL }, + { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NO, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NO }, - { "20%", OPTION_VAL_20_NO }, - { "30%", OPTION_VAL_30_NO }, - { "40%", OPTION_VAL_40_NO }, - { "50%", OPTION_VAL_50_NO }, - { "60%", OPTION_VAL_60_NO }, - { "70%", OPTION_VAL_70_NO }, - { "80%", OPTION_VAL_80_NO }, - { "90%", OPTION_VAL_90_NO }, - { "100%", OPTION_VAL_100_O57_NO }, + { "10%", OPTION_VAL_10_NL }, + { "20%", OPTION_VAL_20_NL }, + { "30%", OPTION_VAL_30_NL }, + { "40%", OPTION_VAL_40_NL }, + { "50%", OPTION_VAL_50_NL }, + { "60%", OPTION_VAL_60_NL }, + { "70%", OPTION_VAL_70_NL }, + { "80%", OPTION_VAL_80_NL }, + { "90%", OPTION_VAL_90_NL }, + { "100%", OPTION_VAL_100_O45_NL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NO, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NL, NULL, "", NULL, @@ -48184,144 +53962,144 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NO, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NO, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NO }, - { "2x", OPTION_VAL_2_O27_NO }, - { "3x", OPTION_VAL_3X_NO }, - { "4x", OPTION_VAL_4_NO }, - { "5x", OPTION_VAL_5X_NO }, + { "1x", OPTION_VAL_1X_NL }, + { "2x", OPTION_VAL_2_O26_NL }, + { "3x", OPTION_VAL_3X_NL }, + { "4x", OPTION_VAL_4_NL }, + { "5x", OPTION_VAL_5X_NL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NO, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NO }, - { "20%", OPTION_VAL_20_NO }, - { "30%", OPTION_VAL_30_NO }, - { "40%", OPTION_VAL_40_NO }, - { "50%", OPTION_VAL_50_NO }, - { "60%", OPTION_VAL_60_NO }, - { "70%", OPTION_VAL_70_NO }, - { "80%", OPTION_VAL_80_NO }, - { "90%", OPTION_VAL_90_NO }, - { "100%", OPTION_VAL_100_O57_NO }, + { "10%", OPTION_VAL_10_NL }, + { "20%", OPTION_VAL_20_NL }, + { "30%", OPTION_VAL_30_NL }, + { "40%", OPTION_VAL_40_NL }, + { "50%", OPTION_VAL_50_NL }, + { "60%", OPTION_VAL_60_NL }, + { "70%", OPTION_VAL_70_NL }, + { "80%", OPTION_VAL_80_NL }, + { "90%", OPTION_VAL_90_NL }, + { "100%", OPTION_VAL_100_O45_NL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NO, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NL, NULL, "", NULL, @@ -48335,144 +54113,144 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NO, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NO, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NO }, - { "2x", OPTION_VAL_2_O27_NO }, - { "3x", OPTION_VAL_3X_NO }, - { "4x", OPTION_VAL_4_NO }, - { "5x", OPTION_VAL_5X_NO }, + { "1x", OPTION_VAL_1X_NL }, + { "2x", OPTION_VAL_2_O26_NL }, + { "3x", OPTION_VAL_3X_NL }, + { "4x", OPTION_VAL_4_NL }, + { "5x", OPTION_VAL_5X_NL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NO, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NO }, - { "20%", OPTION_VAL_20_NO }, - { "30%", OPTION_VAL_30_NO }, - { "40%", OPTION_VAL_40_NO }, - { "50%", OPTION_VAL_50_NO }, - { "60%", OPTION_VAL_60_NO }, - { "70%", OPTION_VAL_70_NO }, - { "80%", OPTION_VAL_80_NO }, - { "90%", OPTION_VAL_90_NO }, - { "100%", OPTION_VAL_100_O57_NO }, + { "10%", OPTION_VAL_10_NL }, + { "20%", OPTION_VAL_20_NL }, + { "30%", OPTION_VAL_30_NL }, + { "40%", OPTION_VAL_40_NL }, + { "50%", OPTION_VAL_50_NL }, + { "60%", OPTION_VAL_60_NL }, + { "70%", OPTION_VAL_70_NL }, + { "80%", OPTION_VAL_80_NL }, + { "90%", OPTION_VAL_90_NL }, + { "100%", OPTION_VAL_100_O45_NL }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NO, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NL, NULL, "", NULL, @@ -48486,505 +54264,4586 @@ struct retro_core_option_v2_definition option_defs_no[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NO, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_NL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NL }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NO, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_NO }, - { "2x", OPTION_VAL_2_O27_NO }, - { "3x", OPTION_VAL_3X_NO }, - { "4x", OPTION_VAL_4_NO }, - { "5x", OPTION_VAL_5X_NO }, + { "1x", OPTION_VAL_1X_NL }, + { "2x", OPTION_VAL_2_O26_NL }, + { "3x", OPTION_VAL_3X_NL }, + { "4x", OPTION_VAL_4_NL }, + { "5x", OPTION_VAL_5X_NL }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NO, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, - { "BLACK 02", OPTION_VAL_BLACK_02_NO }, - { "BLUE 03", OPTION_VAL_BLUE_NO }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, - { "GREEN 05", OPTION_VAL_GREEN_NO }, - { "CYAN 06", OPTION_VAL_CYAN_06_NO }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, - { "RED 11", OPTION_VAL_RED_NO }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, - { "GRAY 15", OPTION_VAL_GRAY_15_NO }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, - { "WHITE 28", OPTION_VAL_WHITE_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NL }, + { "BLACK 02", OPTION_VAL_BLACK_02_NL }, + { "BLUE 03", OPTION_VAL_BLUE_NL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NL }, + { "GREEN 05", OPTION_VAL_GREEN_NL }, + { "CYAN 06", OPTION_VAL_CYAN_06_NL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NL }, + { "RED 11", OPTION_VAL_RED_NL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NL }, + { "GRAY 15", OPTION_VAL_GRAY_15_NL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NL }, + { "WHITE 28", OPTION_VAL_WHITE_NL }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NO, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_NO }, - { "20%", OPTION_VAL_20_NO }, - { "30%", OPTION_VAL_30_NO }, - { "40%", OPTION_VAL_40_NO }, - { "50%", OPTION_VAL_50_NO }, - { "60%", OPTION_VAL_60_NO }, - { "70%", OPTION_VAL_70_NO }, - { "80%", OPTION_VAL_80_NO }, - { "90%", OPTION_VAL_90_NO }, - { "100%", OPTION_VAL_100_O57_NO }, + { "10%", OPTION_VAL_10_NL }, + { "20%", OPTION_VAL_20_NL }, + { "30%", OPTION_VAL_30_NL }, + { "40%", OPTION_VAL_40_NL }, + { "50%", OPTION_VAL_50_NL }, + { "60%", OPTION_VAL_60_NL }, + { "70%", OPTION_VAL_70_NL }, + { "80%", OPTION_VAL_80_NL }, + { "90%", OPTION_VAL_90_NL }, + { "100%", OPTION_VAL_100_O45_NL }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_no = { - option_cats_no, - option_defs_no +struct retro_core_options_v2 options_nl = { + option_cats_nl, + option_defs_nl }; -/* RETRO_LANGUAGE_OR */ +/* RETRO_LANGUAGE_NO */ -#define CATEGORY_SYSTEM_LABEL_OR NULL -#define CATEGORY_SYSTEM_INFO_0_OR NULL -#define CATEGORY_VIDEO_LABEL_OR "ଵିଡ଼ିଓ" -#define CATEGORY_VIDEO_INFO_0_OR NULL -#define CATEGORY_PERFORMANCE_LABEL_OR NULL -#define CATEGORY_PERFORMANCE_INFO_0_OR NULL -#define CATEGORY_HACKS_LABEL_OR NULL -#define CATEGORY_HACKS_INFO_0_OR NULL -#define CATEGORY_INPUT_LABEL_OR NULL -#define CATEGORY_INPUT_INFO_0_OR NULL -#define CATEGORY_VMU_LABEL_OR NULL -#define CATEGORY_VMU_INFO_0_OR NULL -#define CORE_OPTION_NAME_REGION_LABEL_OR "ଅଞ୍ଚଳ" -#define OPTION_VAL_JAPAN_OR NULL -#define OPTION_VAL_USA_OR NULL -#define OPTION_VAL_EUROPE_OR NULL -#define OPTION_VAL_DEFAULT_OR NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_OR "ଭାଷା" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_OR NULL -#define OPTION_VAL_JAPANESE_OR NULL -#define OPTION_VAL_ENGLISH_OR NULL -#define OPTION_VAL_GERMAN_OR NULL -#define OPTION_VAL_FRENCH_OR NULL -#define OPTION_VAL_SPANISH_OR NULL -#define OPTION_VAL_ITALIAN_OR NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_OR NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_OR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_OR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_OR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_OR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_OR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_OR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_OR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_OR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_OR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_OR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_OR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_OR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_OR NULL -#define CORE_OPTION_NAME_UPNP_LABEL_OR NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_OR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_OR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_OR NULL -#define OPTION_VAL_320X240_OR NULL -#define OPTION_VAL_640X480_OR NULL -#define OPTION_VAL_800X600_OR NULL -#define OPTION_VAL_960X720_OR NULL -#define OPTION_VAL_1024X768_OR NULL -#define OPTION_VAL_1280X960_OR NULL -#define OPTION_VAL_1440X1080_OR NULL -#define OPTION_VAL_1600X1200_OR NULL -#define OPTION_VAL_1920X1440_OR NULL -#define OPTION_VAL_2560X1920_OR NULL -#define OPTION_VAL_2880X2160_OR NULL -#define OPTION_VAL_3200X2400_OR NULL -#define OPTION_VAL_3840X2880_OR NULL -#define OPTION_VAL_4480X3360_OR NULL -#define OPTION_VAL_5120X3840_OR NULL -#define OPTION_VAL_5760X4320_OR NULL -#define OPTION_VAL_6400X4800_OR NULL -#define OPTION_VAL_7040X5280_OR NULL -#define OPTION_VAL_7680X5760_OR NULL -#define OPTION_VAL_8320X6240_OR NULL -#define OPTION_VAL_8960X6720_OR NULL -#define OPTION_VAL_9600X7200_OR NULL -#define OPTION_VAL_10240X7680_OR NULL -#define OPTION_VAL_10880X8160_OR NULL -#define OPTION_VAL_11520X8640_OR NULL -#define OPTION_VAL_12160X9120_OR NULL -#define OPTION_VAL_12800X9600_OR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_OR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_OR NULL -#define OPTION_VAL_VGA_OR NULL -#define OPTION_VAL_TV_RGB_OR NULL -#define OPTION_VAL_TV_COMPOSITE_OR NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_OR NULL -#define OPTION_VAL_NTSC_OR NULL -#define OPTION_VAL_PAL_OR NULL -#define OPTION_VAL_PAL_N_OR NULL -#define OPTION_VAL_PAL_M_OR NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_OR NULL -#define OPTION_VAL_HORIZONTAL_OR NULL -#define OPTION_VAL_VERTICAL_OR NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_OR NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_OR NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_OR NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_OR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_OR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_OR NULL -#define OPTION_VAL_512MB_OR NULL -#define OPTION_VAL_1GB_OR NULL -#define OPTION_VAL_2GB_OR NULL -#define OPTION_VAL_4GB_OR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_OR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_OR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_OR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_OR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_OR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_OR NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_OR NULL -#define CORE_OPTION_NAME_FOG_LABEL_OR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_OR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_OR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_OR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_OR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_OR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_OR NULL -#define OPTION_VAL_1_OR NULL -#define OPTION_VAL_2_OR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_OR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_OR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_OR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_OR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_OR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_OR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_OR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_OR NULL -#define OPTION_VAL_2_O27_OR NULL -#define OPTION_VAL_4_OR NULL -#define OPTION_VAL_6_OR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_OR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_OR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_OR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_OR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_OR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_OR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_OR NULL -#define OPTION_VAL_SOME_OR NULL -#define OPTION_VAL_MORE_OR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_OR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_OR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_OR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_OR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_OR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_OR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_OR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_OR NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_OR NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_OR NULL -#define OPTION_VAL_100_OR NULL -#define OPTION_VAL_110_OR NULL -#define OPTION_VAL_120_OR NULL -#define OPTION_VAL_130_OR NULL -#define OPTION_VAL_140_OR NULL -#define OPTION_VAL_150_OR NULL -#define OPTION_VAL_160_OR NULL -#define OPTION_VAL_170_OR NULL -#define OPTION_VAL_180_OR NULL -#define OPTION_VAL_190_OR NULL -#define OPTION_VAL_200_OR NULL -#define OPTION_VAL_210_OR NULL -#define OPTION_VAL_220_OR NULL -#define OPTION_VAL_230_OR NULL -#define OPTION_VAL_240_OR NULL -#define OPTION_VAL_250_OR NULL -#define OPTION_VAL_260_OR NULL -#define OPTION_VAL_270_OR NULL -#define OPTION_VAL_280_OR NULL -#define OPTION_VAL_290_OR NULL -#define OPTION_VAL_300_OR NULL -#define OPTION_VAL_310_OR NULL -#define OPTION_VAL_320_OR NULL -#define OPTION_VAL_330_OR NULL -#define OPTION_VAL_340_OR NULL -#define OPTION_VAL_350_OR NULL -#define OPTION_VAL_360_OR NULL -#define OPTION_VAL_370_OR NULL -#define OPTION_VAL_380_OR NULL -#define OPTION_VAL_390_OR NULL -#define OPTION_VAL_400_OR NULL -#define OPTION_VAL_410_OR NULL -#define OPTION_VAL_420_OR NULL -#define OPTION_VAL_430_OR NULL -#define OPTION_VAL_440_OR NULL -#define OPTION_VAL_450_OR NULL -#define OPTION_VAL_460_OR NULL -#define OPTION_VAL_470_OR NULL -#define OPTION_VAL_480_OR NULL -#define OPTION_VAL_490_OR NULL -#define OPTION_VAL_500_OR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_OR NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_OR NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_OR NULL -#define OPTION_VAL_0_OR NULL -#define OPTION_VAL_5_OR NULL -#define OPTION_VAL_10_OR NULL -#define OPTION_VAL_15_OR NULL -#define OPTION_VAL_20_OR NULL -#define OPTION_VAL_25_OR NULL -#define OPTION_VAL_30_OR NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_OR NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_OR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_OR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_OR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_OR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_OR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_OR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_OR NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_OR NULL -#define OPTION_VAL_WHITE_OR NULL -#define OPTION_VAL_RED_OR NULL -#define OPTION_VAL_GREEN_OR NULL -#define OPTION_VAL_BLUE_OR NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_OR NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_OR NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_OR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_OR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_OR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_OR NULL -#define OPTION_VAL_VMU_A1_OR NULL -#define OPTION_VAL_ALL_VMUS_OR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_OR NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_OR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_OR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_OR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_OR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_OR NULL -#define OPTION_VAL_UPPER_LEFT_OR NULL -#define OPTION_VAL_UPPER_RIGHT_OR NULL -#define OPTION_VAL_LOWER_LEFT_OR NULL -#define OPTION_VAL_LOWER_RIGHT_OR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_OR NULL -#define OPTION_VAL_1X_OR NULL -#define OPTION_VAL_3X_OR NULL -#define OPTION_VAL_5X_OR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_OR NULL -#define OPTION_VAL_DEFAULT_ON_00_OR NULL -#define OPTION_VAL_DEFAULT_OFF_01_OR NULL -#define OPTION_VAL_BLACK_02_OR NULL -#define OPTION_VAL_LIGHT_BLUE_04_OR NULL -#define OPTION_VAL_CYAN_06_OR NULL -#define OPTION_VAL_CYAN_BLUE_07_OR NULL -#define OPTION_VAL_LIGHT_GREEN_08_OR NULL -#define OPTION_VAL_CYAN_GREEN_09_OR NULL -#define OPTION_VAL_LIGHT_CYAN_10_OR NULL -#define OPTION_VAL_PURPLE_12_OR NULL -#define OPTION_VAL_LIGHT_PURPLE_13_OR NULL -#define OPTION_VAL_YELLOW_14_OR NULL -#define OPTION_VAL_GRAY_15_OR NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_OR NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_OR NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_OR NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_OR NULL -#define OPTION_VAL_LIGHT_RED_2_20_OR NULL -#define OPTION_VAL_MAGENTA_21_OR NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_OR NULL -#define OPTION_VAL_LIGHT_ORANGE_23_OR NULL -#define OPTION_VAL_ORANGE_24_OR NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_OR NULL -#define OPTION_VAL_LIGHT_YELLOW_26_OR NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_OR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_OR NULL -#define OPTION_VAL_40_OR NULL -#define OPTION_VAL_50_OR NULL -#define OPTION_VAL_60_OR NULL -#define OPTION_VAL_70_OR NULL -#define OPTION_VAL_80_OR NULL -#define OPTION_VAL_90_OR NULL -#define OPTION_VAL_100_O57_OR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_OR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_OR NULL +#define CATEGORY_SYSTEM_LABEL_NO NULL +#define CATEGORY_SYSTEM_INFO_0_NO NULL +#define CATEGORY_VIDEO_LABEL_NO NULL +#define CATEGORY_VIDEO_INFO_0_NO NULL +#define CATEGORY_PERFORMANCE_LABEL_NO NULL +#define CATEGORY_PERFORMANCE_INFO_0_NO NULL +#define CATEGORY_HACKS_LABEL_NO NULL +#define CATEGORY_HACKS_INFO_0_NO NULL +#define CATEGORY_INPUT_LABEL_NO "Inndata" +#define CATEGORY_INPUT_INFO_0_NO NULL +#define CATEGORY_EXPANSIONS_LABEL_NO NULL +#define CATEGORY_EXPANSIONS_INFO_0_NO NULL +#define CATEGORY_VMU_LABEL_NO NULL +#define CATEGORY_VMU_INFO_0_NO NULL +#define CORE_OPTION_NAME_REGION_LABEL_NO NULL +#define OPTION_VAL_JAPAN_NO NULL +#define OPTION_VAL_USA_NO NULL +#define OPTION_VAL_EUROPE_NO NULL +#define OPTION_VAL_DEFAULT_NO NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_NO "Språk" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_NO NULL +#define OPTION_VAL_JAPANESE_NO NULL +#define OPTION_VAL_ENGLISH_NO NULL +#define OPTION_VAL_GERMAN_NO NULL +#define OPTION_VAL_FRENCH_NO NULL +#define OPTION_VAL_SPANISH_NO NULL +#define OPTION_VAL_ITALIAN_NO NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_NO NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_NO NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NO NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NO NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_NO NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NO NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NO NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NO NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NO NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NO NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_NO NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NO NULL +#define CORE_OPTION_NAME_UPNP_LABEL_NO NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_NO NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NO "Intern oppløsning" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NO NULL +#define OPTION_VAL_320X240_NO NULL +#define OPTION_VAL_640X480_NO NULL +#define OPTION_VAL_800X600_NO NULL +#define OPTION_VAL_960X720_NO NULL +#define OPTION_VAL_1024X768_NO NULL +#define OPTION_VAL_1280X960_NO NULL +#define OPTION_VAL_1440X1080_NO NULL +#define OPTION_VAL_1600X1200_NO NULL +#define OPTION_VAL_1920X1440_NO NULL +#define OPTION_VAL_2560X1920_NO NULL +#define OPTION_VAL_2880X2160_NO NULL +#define OPTION_VAL_3200X2400_NO NULL +#define OPTION_VAL_3840X2880_NO NULL +#define OPTION_VAL_4480X3360_NO NULL +#define OPTION_VAL_5120X3840_NO NULL +#define OPTION_VAL_5760X4320_NO NULL +#define OPTION_VAL_6400X4800_NO NULL +#define OPTION_VAL_7040X5280_NO NULL +#define OPTION_VAL_7680X5760_NO NULL +#define OPTION_VAL_8320X6240_NO NULL +#define OPTION_VAL_8960X6720_NO NULL +#define OPTION_VAL_9600X7200_NO NULL +#define OPTION_VAL_10240X7680_NO NULL +#define OPTION_VAL_10880X8160_NO NULL +#define OPTION_VAL_11520X8640_NO NULL +#define OPTION_VAL_12160X9120_NO NULL +#define OPTION_VAL_12800X9600_NO NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_NO NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NO NULL +#define OPTION_VAL_VGA_NO NULL +#define OPTION_VAL_TV_RGB_NO NULL +#define OPTION_VAL_TV_COMPOSITE_NO NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_NO NULL +#define OPTION_VAL_NTSC_NO NULL +#define OPTION_VAL_PAL_NO NULL +#define OPTION_VAL_PAL_N_NO NULL +#define OPTION_VAL_PAL_M_NO NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NO "Skjermorientering" +#define OPTION_VAL_HORIZONTAL_NO NULL +#define OPTION_VAL_VERTICAL_NO NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NO NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_NO NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NO NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_NO NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_NO NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NO NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NO NULL +#define OPTION_VAL_512MB_NO NULL +#define OPTION_VAL_1GB_NO NULL +#define OPTION_VAL_2GB_NO NULL +#define OPTION_VAL_4GB_NO NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_NO NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NO NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NO NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NO NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NO NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NO NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_NO NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_NO NULL +#define CORE_OPTION_NAME_FOG_LABEL_NO NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NO NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NO NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NO NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NO NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NO NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NO NULL +#define OPTION_VAL_1_NO NULL +#define OPTION_VAL_2_NO NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NO NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NO NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NO NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NO NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NO NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_NO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NO NULL +#define OPTION_VAL_2_O26_NO NULL +#define OPTION_VAL_4_NO NULL +#define OPTION_VAL_6_NO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NO NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_NO NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NO NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NO NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_NO NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_NO NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NO NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NO NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NO NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NO NULL +#define OPTION_VAL_SOME_NO NULL +#define OPTION_VAL_MORE_NO NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NO NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NO NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NO NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NO NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NO NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NO NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NO NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NO NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_NO NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_NO NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_NO NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_NO NULL +#define OPTION_VAL_100_NO NULL +#define OPTION_VAL_110_NO NULL +#define OPTION_VAL_120_NO NULL +#define OPTION_VAL_130_NO NULL +#define OPTION_VAL_140_NO NULL +#define OPTION_VAL_150_NO NULL +#define OPTION_VAL_160_NO NULL +#define OPTION_VAL_170_NO NULL +#define OPTION_VAL_180_NO NULL +#define OPTION_VAL_190_NO NULL +#define OPTION_VAL_200_NO NULL +#define OPTION_VAL_210_NO NULL +#define OPTION_VAL_220_NO NULL +#define OPTION_VAL_230_NO NULL +#define OPTION_VAL_240_NO NULL +#define OPTION_VAL_250_NO NULL +#define OPTION_VAL_260_NO NULL +#define OPTION_VAL_270_NO NULL +#define OPTION_VAL_280_NO NULL +#define OPTION_VAL_290_NO NULL +#define OPTION_VAL_300_NO NULL +#define OPTION_VAL_310_NO NULL +#define OPTION_VAL_320_NO NULL +#define OPTION_VAL_330_NO NULL +#define OPTION_VAL_340_NO NULL +#define OPTION_VAL_350_NO NULL +#define OPTION_VAL_360_NO NULL +#define OPTION_VAL_370_NO NULL +#define OPTION_VAL_380_NO NULL +#define OPTION_VAL_390_NO NULL +#define OPTION_VAL_400_NO NULL +#define OPTION_VAL_410_NO NULL +#define OPTION_VAL_420_NO NULL +#define OPTION_VAL_430_NO NULL +#define OPTION_VAL_440_NO NULL +#define OPTION_VAL_450_NO NULL +#define OPTION_VAL_460_NO NULL +#define OPTION_VAL_470_NO NULL +#define OPTION_VAL_480_NO NULL +#define OPTION_VAL_490_NO NULL +#define OPTION_VAL_500_NO NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NO NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_NO NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NO NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_NO NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NO NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_NO NULL +#define OPTION_VAL_0_NO NULL +#define OPTION_VAL_5_NO NULL +#define OPTION_VAL_10_NO NULL +#define OPTION_VAL_15_NO NULL +#define OPTION_VAL_20_NO NULL +#define OPTION_VAL_25_NO NULL +#define OPTION_VAL_30_NO NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NO NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_NO NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NO NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_NO NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NO NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NO NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NO NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NO NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_NO NULL +#define OPTION_VAL_50_NO NULL +#define OPTION_VAL_60_NO NULL +#define OPTION_VAL_70_NO NULL +#define OPTION_VAL_80_NO NULL +#define OPTION_VAL_90_NO NULL +#define OPTION_VAL_100_O45_NO NULL +#define OPTION_VAL_110_O45_NO NULL +#define OPTION_VAL_120_O45_NO NULL +#define OPTION_VAL_130_O45_NO NULL +#define OPTION_VAL_140_O45_NO NULL +#define OPTION_VAL_150_O45_NO NULL +#define OPTION_VAL_160_O45_NO NULL +#define OPTION_VAL_170_O45_NO NULL +#define OPTION_VAL_180_O45_NO NULL +#define OPTION_VAL_190_O45_NO NULL +#define OPTION_VAL_200_O45_NO NULL +#define OPTION_VAL_210_O45_NO NULL +#define OPTION_VAL_220_O45_NO NULL +#define OPTION_VAL_230_O45_NO NULL +#define OPTION_VAL_240_O45_NO NULL +#define OPTION_VAL_250_O45_NO NULL +#define OPTION_VAL_260_O45_NO NULL +#define OPTION_VAL_270_O45_NO NULL +#define OPTION_VAL_280_O45_NO NULL +#define OPTION_VAL_290_O45_NO NULL +#define OPTION_VAL_300_O45_NO NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NO NULL +#define OPTION_VAL_WHITE_NO NULL +#define OPTION_VAL_RED_NO "Rød" +#define OPTION_VAL_GREEN_NO "Grønn" +#define OPTION_VAL_BLUE_NO "Blå" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NO NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NO NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_NO NULL +#define OPTION_VAL_VMU_NO NULL +#define OPTION_VAL_PURUPURU_NO NULL +#define OPTION_VAL_NONE_NO "Ingen" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_NO NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_NO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NO NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NO NULL +#define OPTION_VAL_VMU_A1_NO NULL +#define OPTION_VAL_ALL_VMUS_NO NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NO NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_NO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NO NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NO NULL +#define OPTION_VAL_UPPER_LEFT_NO NULL +#define OPTION_VAL_UPPER_RIGHT_NO NULL +#define OPTION_VAL_LOWER_LEFT_NO NULL +#define OPTION_VAL_LOWER_RIGHT_NO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NO NULL +#define OPTION_VAL_1X_NO NULL +#define OPTION_VAL_3X_NO NULL +#define OPTION_VAL_5X_NO NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NO NULL +#define OPTION_VAL_DEFAULT_ON_00_NO NULL +#define OPTION_VAL_DEFAULT_OFF_01_NO NULL +#define OPTION_VAL_BLACK_02_NO NULL +#define OPTION_VAL_LIGHT_BLUE_04_NO NULL +#define OPTION_VAL_CYAN_06_NO NULL +#define OPTION_VAL_CYAN_BLUE_07_NO NULL +#define OPTION_VAL_LIGHT_GREEN_08_NO NULL +#define OPTION_VAL_CYAN_GREEN_09_NO NULL +#define OPTION_VAL_LIGHT_CYAN_10_NO NULL +#define OPTION_VAL_PURPLE_12_NO NULL +#define OPTION_VAL_LIGHT_PURPLE_13_NO NULL +#define OPTION_VAL_YELLOW_14_NO "Gul" +#define OPTION_VAL_GRAY_15_NO NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_NO NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_NO NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_NO NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_NO NULL +#define OPTION_VAL_LIGHT_RED_2_20_NO NULL +#define OPTION_VAL_MAGENTA_21_NO NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_NO NULL +#define OPTION_VAL_LIGHT_ORANGE_23_NO NULL +#define OPTION_VAL_ORANGE_24_NO NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_NO NULL +#define OPTION_VAL_LIGHT_YELLOW_26_NO NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_NO NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NO NULL +#define OPTION_VAL_40_NO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NO NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NO NULL + +struct retro_core_option_v2_category option_cats_no[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_NO, + CATEGORY_SYSTEM_INFO_0_NO + }, + { + "video", + CATEGORY_VIDEO_LABEL_NO, + CATEGORY_VIDEO_INFO_0_NO + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_NO, + CATEGORY_PERFORMANCE_INFO_0_NO + }, + { + "hacks", + CATEGORY_HACKS_LABEL_NO, + CATEGORY_HACKS_INFO_0_NO + }, + { + "input", + CATEGORY_INPUT_LABEL_NO, + CATEGORY_INPUT_INFO_0_NO + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_NO, + CATEGORY_EXPANSIONS_INFO_0_NO + }, + { + "vmu", + CATEGORY_VMU_LABEL_NO, + CATEGORY_VMU_INFO_0_NO + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_no[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_NO, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_NO }, + { "USA", OPTION_VAL_USA_NO }, + { "Europe", OPTION_VAL_EUROPE_NO }, + { "Default", OPTION_VAL_DEFAULT_NO }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_NO, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_NO, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_NO }, + { "English", OPTION_VAL_ENGLISH_NO }, + { "German", OPTION_VAL_GERMAN_NO }, + { "French", OPTION_VAL_FRENCH_NO }, + { "Spanish", OPTION_VAL_SPANISH_NO }, + { "Italian", OPTION_VAL_ITALIAN_NO }, + { "Default", OPTION_VAL_DEFAULT_NO }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_NO, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_NO, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_NO, + NULL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, +#ifdef LOW_END + "disabled", +#else + "enabled", +#endif + }, + { + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_NO, + NULL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_NO, + NULL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_NO, + NULL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_NO, + NULL, + CORE_OPTION_NAME_UPNP_INFO_0_NO, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + + { + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_NO, + NULL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_NO, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_NO }, + { "640x480", OPTION_VAL_640X480_NO }, + { "800x600", OPTION_VAL_800X600_NO }, + { "960x720", OPTION_VAL_960X720_NO }, + { "1024x768", OPTION_VAL_1024X768_NO }, + { "1280x960", OPTION_VAL_1280X960_NO }, + { "1440x1080", OPTION_VAL_1440X1080_NO }, + { "1600x1200", OPTION_VAL_1600X1200_NO }, + { "1920x1440", OPTION_VAL_1920X1440_NO }, + { "2560x1920", OPTION_VAL_2560X1920_NO }, + { "2880x2160", OPTION_VAL_2880X2160_NO }, + { "3200x2400", OPTION_VAL_3200X2400_NO }, + { "3840x2880", OPTION_VAL_3840X2880_NO }, + { "4480x3360", OPTION_VAL_4480X3360_NO }, + { "5120x3840", OPTION_VAL_5120X3840_NO }, + { "5760x4320", OPTION_VAL_5760X4320_NO }, + { "6400x4800", OPTION_VAL_6400X4800_NO }, + { "7040x5280", OPTION_VAL_7040X5280_NO }, + { "7680x5760", OPTION_VAL_7680X5760_NO }, + { "8320x6240", OPTION_VAL_8320X6240_NO }, + { "8960x6720", OPTION_VAL_8960X6720_NO }, + { "9600x7200", OPTION_VAL_9600X7200_NO }, + { "10240x7680", OPTION_VAL_10240X7680_NO }, + { "10880x8160", OPTION_VAL_10880X8160_NO }, + { "11520x8640", OPTION_VAL_11520X8640_NO }, + { "12160x9120", OPTION_VAL_12160X9120_NO }, + { "12800x9600", OPTION_VAL_12800X9600_NO }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_NO, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_NO, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_NO }, + { "TV (RGB)", OPTION_VAL_TV_RGB_NO }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_NO }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_NO, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_NO }, + { "PAL", OPTION_VAL_PAL_NO }, + { "PAL_N", OPTION_VAL_PAL_N_NO }, + { "PAL_M", OPTION_VAL_PAL_M_NO }, + { "Default", OPTION_VAL_DEFAULT_NO }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_NO, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_NO }, + { "vertical", OPTION_VAL_VERTICAL_NO }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_NO, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_NO, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_NO }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_NO }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_NO }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_NO, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_NO, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_NO }, + { "1GB", OPTION_VAL_1GB_NO }, + { "2GB", OPTION_VAL_2GB_NO }, + { "4GB", OPTION_VAL_4GB_NO }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_NO, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_NO, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_NO, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_NO, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_NO, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_NO, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_NO, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_NO, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_NO, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_NO, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_NO, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_NO }, + { "1", OPTION_VAL_1_NO }, + { "2", OPTION_VAL_2_NO }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_NO, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_detect_vsync_swap_interval", + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_NO, + NULL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_pvr2_filtering", + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_NO, + NULL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, +#ifdef _OPENMP + { + CORE_OPTION_NAME "_texupscale", + CORE_OPTION_NAME_TEXUPSCALE_LABEL_NO, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_NO, + NULL, + "video", + { + { "1", "disabled" }, + { "2", OPTION_VAL_2_O26_NO }, + { "4", OPTION_VAL_4_NO }, + { "6", OPTION_VAL_6_NO }, + { NULL, NULL }, + }, + "1", + }, + { + CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_NO, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_NO, + NULL, + "video", + { + { "256", NULL }, + { "512", NULL }, + { "1024", NULL }, + { NULL, NULL }, + }, + "256", + }, +#endif + { + CORE_OPTION_NAME "_native_depth_interpolation", + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_NO, + NULL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_NO, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_NO, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_threaded_rendering", + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_NO, + NULL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_NO, + NULL, + "performance", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_auto_skip_frame", + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_NO, + NULL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_NO, + NULL, + "performance", + { + { "disabled", NULL }, + { "some", OPTION_VAL_SOME_NO }, + { "more", OPTION_VAL_MORE_NO }, + { NULL, NULL }, + }, +#ifdef LOW_END + "some", +#else + "disabled", +#endif + }, + { + CORE_OPTION_NAME "_frame_skipping", + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_NO, + NULL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_NO, + NULL, + "performance", + { + { "disabled", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_widescreen_cheats", + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_NO, + NULL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_widescreen_hack", + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_NO, + NULL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_gdrom_fast_loading", + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_NO, + NULL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, +#ifdef LOW_END + "enabled", +#else + "disabled", +#endif + }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_NO, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_sh4clock", + CORE_OPTION_NAME_SH4CLOCK_LABEL_NO, + NULL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_NO, + NULL, + "hacks", + { + { "100", OPTION_VAL_100_NO }, + { "110", OPTION_VAL_110_NO }, + { "120", OPTION_VAL_120_NO }, + { "130", OPTION_VAL_130_NO }, + { "140", OPTION_VAL_140_NO }, + { "150", OPTION_VAL_150_NO }, + { "160", OPTION_VAL_160_NO }, + { "170", OPTION_VAL_170_NO }, + { "180", OPTION_VAL_180_NO }, + { "190", OPTION_VAL_190_NO }, + { "200", OPTION_VAL_200_NO }, + { "210", OPTION_VAL_210_NO }, + { "220", OPTION_VAL_220_NO }, + { "230", OPTION_VAL_230_NO }, + { "240", OPTION_VAL_240_NO }, + { "250", OPTION_VAL_250_NO }, + { "260", OPTION_VAL_260_NO }, + { "270", OPTION_VAL_270_NO }, + { "280", OPTION_VAL_280_NO }, + { "290", OPTION_VAL_290_NO }, + { "300", OPTION_VAL_300_NO }, + { "310", OPTION_VAL_310_NO }, + { "320", OPTION_VAL_320_NO }, + { "330", OPTION_VAL_330_NO }, + { "340", OPTION_VAL_340_NO }, + { "350", OPTION_VAL_350_NO }, + { "360", OPTION_VAL_360_NO }, + { "370", OPTION_VAL_370_NO }, + { "380", OPTION_VAL_380_NO }, + { "390", OPTION_VAL_390_NO }, + { "400", OPTION_VAL_400_NO }, + { "410", OPTION_VAL_410_NO }, + { "420", OPTION_VAL_420_NO }, + { "430", OPTION_VAL_430_NO }, + { "440", OPTION_VAL_440_NO }, + { "450", OPTION_VAL_450_NO }, + { "460", OPTION_VAL_460_NO }, + { "470", OPTION_VAL_470_NO }, + { "480", OPTION_VAL_480_NO }, + { "490", OPTION_VAL_490_NO }, + { "500", OPTION_VAL_500_NO }, + { NULL, NULL }, + }, + "200", + }, + { + CORE_OPTION_NAME "_custom_textures", + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_NO, + NULL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_dump_textures", + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_NO, + NULL, + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_NO, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_analog_stick_deadzone", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_NO, + NULL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_NO, + NULL, + "input", + { + { "0%", OPTION_VAL_0_NO }, + { "5%", OPTION_VAL_5_NO }, + { "10%", OPTION_VAL_10_NO }, + { "15%", OPTION_VAL_15_NO }, + { "20%", OPTION_VAL_20_NO }, + { "25%", OPTION_VAL_25_NO }, + { "30%", OPTION_VAL_30_NO }, + { NULL, NULL }, + }, + "15%", + }, + { + CORE_OPTION_NAME "_trigger_deadzone", + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_NO, + NULL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_NO, + NULL, + "input", + { + { "0%", OPTION_VAL_0_NO }, + { "5%", OPTION_VAL_5_NO }, + { "10%", OPTION_VAL_10_NO }, + { "15%", OPTION_VAL_15_NO }, + { "20%", OPTION_VAL_20_NO }, + { "25%", OPTION_VAL_25_NO }, + { "30%", OPTION_VAL_30_NO }, + { NULL, NULL }, + }, + "0%", + }, + { + CORE_OPTION_NAME "_digital_triggers", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_NO, + NULL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_NO, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_NO, + NULL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_NO, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_NO, + NULL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_NO, + NULL, + "input", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_NO, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_NO }, + { "60%", OPTION_VAL_60_NO }, + { "70%", OPTION_VAL_70_NO }, + { "80%", OPTION_VAL_80_NO }, + { "90%", OPTION_VAL_90_NO }, + { "100%", OPTION_VAL_100_O45_NO }, + { "110%", OPTION_VAL_110_O45_NO }, + { "120%", OPTION_VAL_120_O45_NO }, + { "130%", OPTION_VAL_130_O45_NO }, + { "140%", OPTION_VAL_140_O45_NO }, + { "150%", OPTION_VAL_150_O45_NO }, + { "160%", OPTION_VAL_160_O45_NO }, + { "170%", OPTION_VAL_170_O45_NO }, + { "180%", OPTION_VAL_180_O45_NO }, + { "190%", OPTION_VAL_190_O45_NO }, + { "200%", OPTION_VAL_200_O45_NO }, + { "210%", OPTION_VAL_210_O45_NO }, + { "220%", OPTION_VAL_220_O45_NO }, + { "230%", OPTION_VAL_230_O45_NO }, + { "240%", OPTION_VAL_240_O45_NO }, + { "250%", OPTION_VAL_250_O45_NO }, + { "260%", OPTION_VAL_260_O45_NO }, + { "270%", OPTION_VAL_270_O45_NO }, + { "280%", OPTION_VAL_280_O45_NO }, + { "290%", OPTION_VAL_290_O45_NO }, + { "300%", OPTION_VAL_300_O45_NO }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_lightgun1_crosshair", + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_NO, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_NO }, + { "Red", OPTION_VAL_RED_NO }, + { "Green", OPTION_VAL_GREEN_NO }, + { "Blue", OPTION_VAL_BLUE_NO }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun2_crosshair", + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_NO, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_NO }, + { "Red", OPTION_VAL_RED_NO }, + { "Green", OPTION_VAL_GREEN_NO }, + { "Blue", OPTION_VAL_BLUE_NO }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun3_crosshair", + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_NO, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_NO }, + { "Red", OPTION_VAL_RED_NO }, + { "Green", OPTION_VAL_GREEN_NO }, + { "Blue", OPTION_VAL_BLUE_NO }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun4_crosshair", + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_NO, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_NO }, + { "Red", OPTION_VAL_RED_NO }, + { "Green", OPTION_VAL_GREEN_NO }, + { "Blue", OPTION_VAL_BLUE_NO }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_NO, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_NO, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_NO }, + { "Purupuru", OPTION_VAL_PURUPURU_NO }, + { "None", OPTION_VAL_NONE_NO }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_NO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_NO, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_NO, + NULL, + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_NO }, + { "All VMUs", OPTION_VAL_ALL_VMUS_NO }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_NO, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_NO, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_NO, + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_NO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_NO, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_NO, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { NULL, NULL }, + }, + "Upper Left", + }, + { + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_NO }, + { "2x", OPTION_VAL_2_O26_NO }, + { "3x", OPTION_VAL_3X_NO }, + { "4x", OPTION_VAL_4_NO }, + { "5x", OPTION_VAL_5X_NO }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_NO }, + { "20%", OPTION_VAL_20_NO }, + { "30%", OPTION_VAL_30_NO }, + { "40%", OPTION_VAL_40_NO }, + { "50%", OPTION_VAL_50_NO }, + { "60%", OPTION_VAL_60_NO }, + { "70%", OPTION_VAL_70_NO }, + { "80%", OPTION_VAL_80_NO }, + { "90%", OPTION_VAL_90_NO }, + { "100%", OPTION_VAL_100_O45_NO }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { NULL, NULL }, + }, + "Upper Right", + }, + { + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_NO }, + { "2x", OPTION_VAL_2_O26_NO }, + { "3x", OPTION_VAL_3X_NO }, + { "4x", OPTION_VAL_4_NO }, + { "5x", OPTION_VAL_5X_NO }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_NO }, + { "20%", OPTION_VAL_20_NO }, + { "30%", OPTION_VAL_30_NO }, + { "40%", OPTION_VAL_40_NO }, + { "50%", OPTION_VAL_50_NO }, + { "60%", OPTION_VAL_60_NO }, + { "70%", OPTION_VAL_70_NO }, + { "80%", OPTION_VAL_80_NO }, + { "90%", OPTION_VAL_90_NO }, + { "100%", OPTION_VAL_100_O45_NO }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { NULL, NULL }, + }, + "Lower Left", + }, + { + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_NO }, + { "2x", OPTION_VAL_2_O26_NO }, + { "3x", OPTION_VAL_3X_NO }, + { "4x", OPTION_VAL_4_NO }, + { "5x", OPTION_VAL_5X_NO }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_NO }, + { "20%", OPTION_VAL_20_NO }, + { "30%", OPTION_VAL_30_NO }, + { "40%", OPTION_VAL_40_NO }, + { "50%", OPTION_VAL_50_NO }, + { "60%", OPTION_VAL_60_NO }, + { "70%", OPTION_VAL_70_NO }, + { "80%", OPTION_VAL_80_NO }, + { "90%", OPTION_VAL_90_NO }, + { "100%", OPTION_VAL_100_O45_NO }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_NO }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_NO }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_NO }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_NO }, + { NULL, NULL }, + }, + "Lower Right", + }, + { + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_NO }, + { "2x", OPTION_VAL_2_O26_NO }, + { "3x", OPTION_VAL_3X_NO }, + { "4x", OPTION_VAL_4_NO }, + { "5x", OPTION_VAL_5X_NO }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_NO }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_NO }, + { "BLACK 02", OPTION_VAL_BLACK_02_NO }, + { "BLUE 03", OPTION_VAL_BLUE_NO }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_NO }, + { "GREEN 05", OPTION_VAL_GREEN_NO }, + { "CYAN 06", OPTION_VAL_CYAN_06_NO }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_NO }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_NO }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_NO }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_NO }, + { "RED 11", OPTION_VAL_RED_NO }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_NO }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_NO }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_NO }, + { "GRAY 15", OPTION_VAL_GRAY_15_NO }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_NO }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_NO }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_NO }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_NO }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_NO }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_NO }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_NO }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_NO }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_NO }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_NO }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_NO }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_NO }, + { "WHITE 28", OPTION_VAL_WHITE_NO }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_NO, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_NO }, + { "20%", OPTION_VAL_20_NO }, + { "30%", OPTION_VAL_30_NO }, + { "40%", OPTION_VAL_40_NO }, + { "50%", OPTION_VAL_50_NO }, + { "60%", OPTION_VAL_60_NO }, + { "70%", OPTION_VAL_70_NO }, + { "80%", OPTION_VAL_80_NO }, + { "90%", OPTION_VAL_90_NO }, + { "100%", OPTION_VAL_100_O45_NO }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_no = { + option_cats_no, + option_defs_no +}; + +/* RETRO_LANGUAGE_OR */ + +#define CATEGORY_SYSTEM_LABEL_OR NULL +#define CATEGORY_SYSTEM_INFO_0_OR NULL +#define CATEGORY_VIDEO_LABEL_OR "ଵିଡ଼ିଓ" +#define CATEGORY_VIDEO_INFO_0_OR NULL +#define CATEGORY_PERFORMANCE_LABEL_OR NULL +#define CATEGORY_PERFORMANCE_INFO_0_OR NULL +#define CATEGORY_HACKS_LABEL_OR NULL +#define CATEGORY_HACKS_INFO_0_OR NULL +#define CATEGORY_INPUT_LABEL_OR NULL +#define CATEGORY_INPUT_INFO_0_OR NULL +#define CATEGORY_EXPANSIONS_LABEL_OR NULL +#define CATEGORY_EXPANSIONS_INFO_0_OR NULL +#define CATEGORY_VMU_LABEL_OR NULL +#define CATEGORY_VMU_INFO_0_OR NULL +#define CORE_OPTION_NAME_REGION_LABEL_OR "ଅଞ୍ଚଳ" +#define OPTION_VAL_JAPAN_OR NULL +#define OPTION_VAL_USA_OR NULL +#define OPTION_VAL_EUROPE_OR NULL +#define OPTION_VAL_DEFAULT_OR NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_OR "ଭାଷା" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_OR NULL +#define OPTION_VAL_JAPANESE_OR NULL +#define OPTION_VAL_ENGLISH_OR NULL +#define OPTION_VAL_GERMAN_OR NULL +#define OPTION_VAL_FRENCH_OR NULL +#define OPTION_VAL_SPANISH_OR NULL +#define OPTION_VAL_ITALIAN_OR NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_OR NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_OR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_OR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_OR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_OR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_OR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_OR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_OR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_OR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_OR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_OR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_OR NULL +#define CORE_OPTION_NAME_UPNP_LABEL_OR NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_OR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_OR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_OR NULL +#define OPTION_VAL_320X240_OR NULL +#define OPTION_VAL_640X480_OR NULL +#define OPTION_VAL_800X600_OR NULL +#define OPTION_VAL_960X720_OR NULL +#define OPTION_VAL_1024X768_OR NULL +#define OPTION_VAL_1280X960_OR NULL +#define OPTION_VAL_1440X1080_OR NULL +#define OPTION_VAL_1600X1200_OR NULL +#define OPTION_VAL_1920X1440_OR NULL +#define OPTION_VAL_2560X1920_OR NULL +#define OPTION_VAL_2880X2160_OR NULL +#define OPTION_VAL_3200X2400_OR NULL +#define OPTION_VAL_3840X2880_OR NULL +#define OPTION_VAL_4480X3360_OR NULL +#define OPTION_VAL_5120X3840_OR NULL +#define OPTION_VAL_5760X4320_OR NULL +#define OPTION_VAL_6400X4800_OR NULL +#define OPTION_VAL_7040X5280_OR NULL +#define OPTION_VAL_7680X5760_OR NULL +#define OPTION_VAL_8320X6240_OR NULL +#define OPTION_VAL_8960X6720_OR NULL +#define OPTION_VAL_9600X7200_OR NULL +#define OPTION_VAL_10240X7680_OR NULL +#define OPTION_VAL_10880X8160_OR NULL +#define OPTION_VAL_11520X8640_OR NULL +#define OPTION_VAL_12160X9120_OR NULL +#define OPTION_VAL_12800X9600_OR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_OR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_OR NULL +#define OPTION_VAL_VGA_OR NULL +#define OPTION_VAL_TV_RGB_OR NULL +#define OPTION_VAL_TV_COMPOSITE_OR NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_OR NULL +#define OPTION_VAL_NTSC_OR NULL +#define OPTION_VAL_PAL_OR NULL +#define OPTION_VAL_PAL_N_OR NULL +#define OPTION_VAL_PAL_M_OR NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_OR NULL +#define OPTION_VAL_HORIZONTAL_OR NULL +#define OPTION_VAL_VERTICAL_OR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_OR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_OR NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_OR NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_OR NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_OR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_OR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_OR NULL +#define OPTION_VAL_512MB_OR NULL +#define OPTION_VAL_1GB_OR NULL +#define OPTION_VAL_2GB_OR NULL +#define OPTION_VAL_4GB_OR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_OR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_OR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_OR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_OR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_OR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_OR NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_OR NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_OR NULL +#define CORE_OPTION_NAME_FOG_LABEL_OR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_OR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_OR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_OR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_OR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_OR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_OR NULL +#define OPTION_VAL_1_OR NULL +#define OPTION_VAL_2_OR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_OR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_OR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_OR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_OR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_OR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_OR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_OR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_OR NULL +#define OPTION_VAL_2_O26_OR NULL +#define OPTION_VAL_4_OR NULL +#define OPTION_VAL_6_OR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_OR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_OR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_OR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_OR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_OR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_OR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_OR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_OR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_OR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_OR NULL +#define OPTION_VAL_SOME_OR NULL +#define OPTION_VAL_MORE_OR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_OR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_OR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_OR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_OR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_OR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_OR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_OR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_OR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_OR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_OR NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_OR NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_OR NULL +#define OPTION_VAL_100_OR NULL +#define OPTION_VAL_110_OR NULL +#define OPTION_VAL_120_OR NULL +#define OPTION_VAL_130_OR NULL +#define OPTION_VAL_140_OR NULL +#define OPTION_VAL_150_OR NULL +#define OPTION_VAL_160_OR NULL +#define OPTION_VAL_170_OR NULL +#define OPTION_VAL_180_OR NULL +#define OPTION_VAL_190_OR NULL +#define OPTION_VAL_200_OR NULL +#define OPTION_VAL_210_OR NULL +#define OPTION_VAL_220_OR NULL +#define OPTION_VAL_230_OR NULL +#define OPTION_VAL_240_OR NULL +#define OPTION_VAL_250_OR NULL +#define OPTION_VAL_260_OR NULL +#define OPTION_VAL_270_OR NULL +#define OPTION_VAL_280_OR NULL +#define OPTION_VAL_290_OR NULL +#define OPTION_VAL_300_OR NULL +#define OPTION_VAL_310_OR NULL +#define OPTION_VAL_320_OR NULL +#define OPTION_VAL_330_OR NULL +#define OPTION_VAL_340_OR NULL +#define OPTION_VAL_350_OR NULL +#define OPTION_VAL_360_OR NULL +#define OPTION_VAL_370_OR NULL +#define OPTION_VAL_380_OR NULL +#define OPTION_VAL_390_OR NULL +#define OPTION_VAL_400_OR NULL +#define OPTION_VAL_410_OR NULL +#define OPTION_VAL_420_OR NULL +#define OPTION_VAL_430_OR NULL +#define OPTION_VAL_440_OR NULL +#define OPTION_VAL_450_OR NULL +#define OPTION_VAL_460_OR NULL +#define OPTION_VAL_470_OR NULL +#define OPTION_VAL_480_OR NULL +#define OPTION_VAL_490_OR NULL +#define OPTION_VAL_500_OR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_OR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_OR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_OR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_OR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_OR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_OR NULL +#define OPTION_VAL_0_OR NULL +#define OPTION_VAL_5_OR NULL +#define OPTION_VAL_10_OR NULL +#define OPTION_VAL_15_OR NULL +#define OPTION_VAL_20_OR NULL +#define OPTION_VAL_25_OR NULL +#define OPTION_VAL_30_OR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_OR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_OR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_OR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_OR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_OR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_OR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_OR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_OR NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_OR NULL +#define OPTION_VAL_50_OR NULL +#define OPTION_VAL_60_OR NULL +#define OPTION_VAL_70_OR NULL +#define OPTION_VAL_80_OR NULL +#define OPTION_VAL_90_OR NULL +#define OPTION_VAL_100_O45_OR NULL +#define OPTION_VAL_110_O45_OR NULL +#define OPTION_VAL_120_O45_OR NULL +#define OPTION_VAL_130_O45_OR NULL +#define OPTION_VAL_140_O45_OR NULL +#define OPTION_VAL_150_O45_OR NULL +#define OPTION_VAL_160_O45_OR NULL +#define OPTION_VAL_170_O45_OR NULL +#define OPTION_VAL_180_O45_OR NULL +#define OPTION_VAL_190_O45_OR NULL +#define OPTION_VAL_200_O45_OR NULL +#define OPTION_VAL_210_O45_OR NULL +#define OPTION_VAL_220_O45_OR NULL +#define OPTION_VAL_230_O45_OR NULL +#define OPTION_VAL_240_O45_OR NULL +#define OPTION_VAL_250_O45_OR NULL +#define OPTION_VAL_260_O45_OR NULL +#define OPTION_VAL_270_O45_OR NULL +#define OPTION_VAL_280_O45_OR NULL +#define OPTION_VAL_290_O45_OR NULL +#define OPTION_VAL_300_O45_OR NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_OR NULL +#define OPTION_VAL_WHITE_OR NULL +#define OPTION_VAL_RED_OR NULL +#define OPTION_VAL_GREEN_OR NULL +#define OPTION_VAL_BLUE_OR NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_OR NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_OR NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_OR NULL +#define OPTION_VAL_VMU_OR NULL +#define OPTION_VAL_PURUPURU_OR NULL +#define OPTION_VAL_NONE_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_OR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_OR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_OR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_OR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_OR NULL +#define OPTION_VAL_VMU_A1_OR NULL +#define OPTION_VAL_ALL_VMUS_OR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_OR NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_OR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_OR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_OR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_OR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_OR NULL +#define OPTION_VAL_UPPER_LEFT_OR NULL +#define OPTION_VAL_UPPER_RIGHT_OR NULL +#define OPTION_VAL_LOWER_LEFT_OR NULL +#define OPTION_VAL_LOWER_RIGHT_OR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_OR NULL +#define OPTION_VAL_1X_OR NULL +#define OPTION_VAL_3X_OR NULL +#define OPTION_VAL_5X_OR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_OR NULL +#define OPTION_VAL_DEFAULT_ON_00_OR NULL +#define OPTION_VAL_DEFAULT_OFF_01_OR NULL +#define OPTION_VAL_BLACK_02_OR NULL +#define OPTION_VAL_LIGHT_BLUE_04_OR NULL +#define OPTION_VAL_CYAN_06_OR NULL +#define OPTION_VAL_CYAN_BLUE_07_OR NULL +#define OPTION_VAL_LIGHT_GREEN_08_OR NULL +#define OPTION_VAL_CYAN_GREEN_09_OR NULL +#define OPTION_VAL_LIGHT_CYAN_10_OR NULL +#define OPTION_VAL_PURPLE_12_OR NULL +#define OPTION_VAL_LIGHT_PURPLE_13_OR NULL +#define OPTION_VAL_YELLOW_14_OR NULL +#define OPTION_VAL_GRAY_15_OR NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_OR NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_OR NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_OR NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_OR NULL +#define OPTION_VAL_LIGHT_RED_2_20_OR NULL +#define OPTION_VAL_MAGENTA_21_OR NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_OR NULL +#define OPTION_VAL_LIGHT_ORANGE_23_OR NULL +#define OPTION_VAL_ORANGE_24_OR NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_OR NULL +#define OPTION_VAL_LIGHT_YELLOW_26_OR NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_OR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_OR NULL +#define OPTION_VAL_40_OR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_OR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_OR NULL + +struct retro_core_option_v2_category option_cats_or[] = { + { + "system", + CATEGORY_SYSTEM_LABEL_OR, + CATEGORY_SYSTEM_INFO_0_OR + }, + { + "video", + CATEGORY_VIDEO_LABEL_OR, + CATEGORY_VIDEO_INFO_0_OR + }, + { + "performance", + CATEGORY_PERFORMANCE_LABEL_OR, + CATEGORY_PERFORMANCE_INFO_0_OR + }, + { + "hacks", + CATEGORY_HACKS_LABEL_OR, + CATEGORY_HACKS_INFO_0_OR + }, + { + "input", + CATEGORY_INPUT_LABEL_OR, + CATEGORY_INPUT_INFO_0_OR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_OR, + CATEGORY_EXPANSIONS_INFO_0_OR + }, + { + "vmu", + CATEGORY_VMU_LABEL_OR, + CATEGORY_VMU_INFO_0_OR + }, + { NULL, NULL, NULL }, +}; +struct retro_core_option_v2_definition option_defs_or[] = { + { + CORE_OPTION_NAME "_region", + CORE_OPTION_NAME_REGION_LABEL_OR, + NULL, + "", + NULL, + "system", + { + { "Japan", OPTION_VAL_JAPAN_OR }, + { "USA", OPTION_VAL_USA_OR }, + { "Europe", OPTION_VAL_EUROPE_OR }, + { "Default", OPTION_VAL_DEFAULT_OR }, + { NULL, NULL }, + }, + "USA", + }, + { + CORE_OPTION_NAME "_language", + CORE_OPTION_NAME_LANGUAGE_LABEL_OR, + NULL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_OR, + NULL, + "system", + { + { "Japanese", OPTION_VAL_JAPANESE_OR }, + { "English", OPTION_VAL_ENGLISH_OR }, + { "German", OPTION_VAL_GERMAN_OR }, + { "French", OPTION_VAL_FRENCH_OR }, + { "Spanish", OPTION_VAL_SPANISH_OR }, + { "Italian", OPTION_VAL_ITALIAN_OR }, + { "Default", OPTION_VAL_DEFAULT_OR }, + { NULL, NULL }, + }, + "English", + }, + { + CORE_OPTION_NAME "_hle_bios", + CORE_OPTION_NAME_HLE_BIOS_LABEL_OR, + NULL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_boot_to_bios", + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_OR, + NULL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_enable_dsp", + CORE_OPTION_NAME_ENABLE_DSP_LABEL_OR, + NULL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, +#ifdef LOW_END + "disabled", +#else + "enabled", +#endif + }, + { + CORE_OPTION_NAME "_allow_service_buttons", + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_OR, + NULL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_force_freeplay", + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_OR, + NULL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_emulate_bba", + CORE_OPTION_NAME_EMULATE_BBA_LABEL_OR, + NULL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_upnp", + CORE_OPTION_NAME_UPNP_LABEL_OR, + NULL, + CORE_OPTION_NAME_UPNP_INFO_0_OR, + NULL, + "system", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + + { + CORE_OPTION_NAME "_internal_resolution", + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_OR, + NULL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_OR, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_OR }, + { "640x480", OPTION_VAL_640X480_OR }, + { "800x600", OPTION_VAL_800X600_OR }, + { "960x720", OPTION_VAL_960X720_OR }, + { "1024x768", OPTION_VAL_1024X768_OR }, + { "1280x960", OPTION_VAL_1280X960_OR }, + { "1440x1080", OPTION_VAL_1440X1080_OR }, + { "1600x1200", OPTION_VAL_1600X1200_OR }, + { "1920x1440", OPTION_VAL_1920X1440_OR }, + { "2560x1920", OPTION_VAL_2560X1920_OR }, + { "2880x2160", OPTION_VAL_2880X2160_OR }, + { "3200x2400", OPTION_VAL_3200X2400_OR }, + { "3840x2880", OPTION_VAL_3840X2880_OR }, + { "4480x3360", OPTION_VAL_4480X3360_OR }, + { "5120x3840", OPTION_VAL_5120X3840_OR }, + { "5760x4320", OPTION_VAL_5760X4320_OR }, + { "6400x4800", OPTION_VAL_6400X4800_OR }, + { "7040x5280", OPTION_VAL_7040X5280_OR }, + { "7680x5760", OPTION_VAL_7680X5760_OR }, + { "8320x6240", OPTION_VAL_8320X6240_OR }, + { "8960x6720", OPTION_VAL_8960X6720_OR }, + { "9600x7200", OPTION_VAL_9600X7200_OR }, + { "10240x7680", OPTION_VAL_10240X7680_OR }, + { "10880x8160", OPTION_VAL_10880X8160_OR }, + { "11520x8640", OPTION_VAL_11520X8640_OR }, + { "12160x9120", OPTION_VAL_12160X9120_OR }, + { "12800x9600", OPTION_VAL_12800X9600_OR }, + { NULL, NULL }, + }, +#ifdef LOW_RES + "320x240", +#else + "640x480", +#endif + }, + { + CORE_OPTION_NAME "_cable_type", + CORE_OPTION_NAME_CABLE_TYPE_LABEL_OR, + NULL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_OR, + NULL, + "video", + { + { "VGA", OPTION_VAL_VGA_OR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_OR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_OR }, + { NULL, NULL }, + }, + "TV (Composite)", + }, + { + CORE_OPTION_NAME "_broadcast", + CORE_OPTION_NAME_BROADCAST_LABEL_OR, + NULL, + "", + NULL, + "video", + { + { "NTSC", OPTION_VAL_NTSC_OR }, + { "PAL", OPTION_VAL_PAL_OR }, + { "PAL_N", OPTION_VAL_PAL_N_OR }, + { "PAL_M", OPTION_VAL_PAL_M_OR }, + { "Default", OPTION_VAL_DEFAULT_OR }, + { NULL, NULL }, + }, + "NTSC", + }, + { + CORE_OPTION_NAME "_screen_rotation", + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_OR, + NULL, + "", + NULL, + "video", + { + { "horizontal", OPTION_VAL_HORIZONTAL_OR }, + { "vertical", OPTION_VAL_VERTICAL_OR }, + { NULL, NULL }, + }, + "horizontal", + }, + {/* TODO: needs better explanation? */ + CORE_OPTION_NAME "_alpha_sorting", + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_OR, + NULL, + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_OR, + NULL, + "video", + { + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_OR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_OR }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_OR }, +#endif + { NULL, NULL }, + }, +#if defined(LOW_END) + "per-strip (fast, least accurate)", +#else + "per-triangle (normal)", +#endif + }, +#if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) + { + CORE_OPTION_NAME "_oit_abuffer_size", + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_OR, + NULL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_OR, + NULL, + "video", + { + { "512MB", OPTION_VAL_512MB_OR }, + { "1GB", OPTION_VAL_1GB_OR }, + { "2GB", OPTION_VAL_2GB_OR }, + { "4GB", OPTION_VAL_4GB_OR }, + { NULL, NULL }, + }, + "512MB", + }, + { + CORE_OPTION_NAME "_oit_layers", + CORE_OPTION_NAME_OIT_LAYERS_LABEL_OR, + NULL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_OR, + NULL, + "video", + { + { "8", NULL }, + { "16", NULL }, + { "32", NULL }, + { "64", NULL }, + { "96", NULL }, + { "128", NULL }, + { NULL, NULL }, + }, + "32", + }, +#endif + { + CORE_OPTION_NAME "_emulate_framebuffer", + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_OR, + NULL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + {/* TODO: needs explanation */ + CORE_OPTION_NAME "_enable_rttb", + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_OR, + NULL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_mipmapping", + CORE_OPTION_NAME_MIPMAPPING_LABEL_OR, + NULL, + CORE_OPTION_NAME_MIPMAPPING_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_fog", + CORE_OPTION_NAME_FOG_LABEL_OR, + NULL, + "", + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_volume_modifier_enable", + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_OR, + NULL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_anisotropic_filtering", + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_OR, + NULL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_OR, + NULL, + "video", + { + { "off", "disabled" }, + { "2", NULL }, + { "4", NULL }, + { "8", NULL }, + { "16", NULL }, + { NULL, NULL }, + }, + "4", + }, + { + CORE_OPTION_NAME "_texture_filtering", + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_OR, + NULL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_OR, + NULL, + "video", + { + { "0", OPTION_VAL_DEFAULT_OR }, + { "1", OPTION_VAL_1_OR }, + { "2", OPTION_VAL_2_OR }, + { NULL, NULL }, + }, + "0", + }, + { + CORE_OPTION_NAME "_delay_frame_swapping", + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_OR, + NULL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_detect_vsync_swap_interval", + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_OR, + NULL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_pvr2_filtering", + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_OR, + NULL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, +#ifdef _OPENMP + { + CORE_OPTION_NAME "_texupscale", + CORE_OPTION_NAME_TEXUPSCALE_LABEL_OR, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_OR, + NULL, + "video", + { + { "1", "disabled" }, + { "2", OPTION_VAL_2_O26_OR }, + { "4", OPTION_VAL_4_OR }, + { "6", OPTION_VAL_6_OR }, + { NULL, NULL }, + }, + "1", + }, + { + CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_OR, + NULL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_OR, + NULL, + "video", + { + { "256", NULL }, + { "512", NULL }, + { "1024", NULL }, + { NULL, NULL }, + }, + "256", + }, +#endif + { + CORE_OPTION_NAME "_native_depth_interpolation", + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_OR, + NULL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_OR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_OR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_threaded_rendering", + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_OR, + NULL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_OR, + NULL, + "performance", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, + { + CORE_OPTION_NAME "_auto_skip_frame", + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_OR, + NULL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_OR, + NULL, + "performance", + { + { "disabled", NULL }, + { "some", OPTION_VAL_SOME_OR }, + { "more", OPTION_VAL_MORE_OR }, + { NULL, NULL }, + }, +#ifdef LOW_END + "some", +#else + "disabled", +#endif + }, + { + CORE_OPTION_NAME "_frame_skipping", + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_OR, + NULL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_OR, + NULL, + "performance", + { + { "disabled", NULL }, + { "1", NULL }, + { "2", NULL }, + { "3", NULL }, + { "4", NULL }, + { "5", NULL }, + { "6", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_widescreen_cheats", + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_OR, + NULL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_widescreen_hack", + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_OR, + NULL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_gdrom_fast_loading", + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_OR, + NULL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, +#ifdef LOW_END + "enabled", +#else + "disabled", +#endif + }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_OR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_sh4clock", + CORE_OPTION_NAME_SH4CLOCK_LABEL_OR, + NULL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_OR, + NULL, + "hacks", + { + { "100", OPTION_VAL_100_OR }, + { "110", OPTION_VAL_110_OR }, + { "120", OPTION_VAL_120_OR }, + { "130", OPTION_VAL_130_OR }, + { "140", OPTION_VAL_140_OR }, + { "150", OPTION_VAL_150_OR }, + { "160", OPTION_VAL_160_OR }, + { "170", OPTION_VAL_170_OR }, + { "180", OPTION_VAL_180_OR }, + { "190", OPTION_VAL_190_OR }, + { "200", OPTION_VAL_200_OR }, + { "210", OPTION_VAL_210_OR }, + { "220", OPTION_VAL_220_OR }, + { "230", OPTION_VAL_230_OR }, + { "240", OPTION_VAL_240_OR }, + { "250", OPTION_VAL_250_OR }, + { "260", OPTION_VAL_260_OR }, + { "270", OPTION_VAL_270_OR }, + { "280", OPTION_VAL_280_OR }, + { "290", OPTION_VAL_290_OR }, + { "300", OPTION_VAL_300_OR }, + { "310", OPTION_VAL_310_OR }, + { "320", OPTION_VAL_320_OR }, + { "330", OPTION_VAL_330_OR }, + { "340", OPTION_VAL_340_OR }, + { "350", OPTION_VAL_350_OR }, + { "360", OPTION_VAL_360_OR }, + { "370", OPTION_VAL_370_OR }, + { "380", OPTION_VAL_380_OR }, + { "390", OPTION_VAL_390_OR }, + { "400", OPTION_VAL_400_OR }, + { "410", OPTION_VAL_410_OR }, + { "420", OPTION_VAL_420_OR }, + { "430", OPTION_VAL_430_OR }, + { "440", OPTION_VAL_440_OR }, + { "450", OPTION_VAL_450_OR }, + { "460", OPTION_VAL_460_OR }, + { "470", OPTION_VAL_470_OR }, + { "480", OPTION_VAL_480_OR }, + { "490", OPTION_VAL_490_OR }, + { "500", OPTION_VAL_500_OR }, + { NULL, NULL }, + }, + "200", + }, + { + CORE_OPTION_NAME "_custom_textures", + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_OR, + NULL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_dump_textures", + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_OR, + NULL, + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_OR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_analog_stick_deadzone", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_OR, + NULL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_OR, + NULL, + "input", + { + { "0%", OPTION_VAL_0_OR }, + { "5%", OPTION_VAL_5_OR }, + { "10%", OPTION_VAL_10_OR }, + { "15%", OPTION_VAL_15_OR }, + { "20%", OPTION_VAL_20_OR }, + { "25%", OPTION_VAL_25_OR }, + { "30%", OPTION_VAL_30_OR }, + { NULL, NULL }, + }, + "15%", + }, + { + CORE_OPTION_NAME "_trigger_deadzone", + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_OR, + NULL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_OR, + NULL, + "input", + { + { "0%", OPTION_VAL_0_OR }, + { "5%", OPTION_VAL_5_OR }, + { "10%", OPTION_VAL_10_OR }, + { "15%", OPTION_VAL_15_OR }, + { "20%", OPTION_VAL_20_OR }, + { "25%", OPTION_VAL_25_OR }, + { "30%", OPTION_VAL_30_OR }, + { NULL, NULL }, + }, + "0%", + }, + { + CORE_OPTION_NAME "_digital_triggers", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_OR, + NULL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_OR, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_OR, + NULL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_OR, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_OR, + NULL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_OR, + NULL, + "input", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_OR, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_OR }, + { "60%", OPTION_VAL_60_OR }, + { "70%", OPTION_VAL_70_OR }, + { "80%", OPTION_VAL_80_OR }, + { "90%", OPTION_VAL_90_OR }, + { "100%", OPTION_VAL_100_O45_OR }, + { "110%", OPTION_VAL_110_O45_OR }, + { "120%", OPTION_VAL_120_O45_OR }, + { "130%", OPTION_VAL_130_O45_OR }, + { "140%", OPTION_VAL_140_O45_OR }, + { "150%", OPTION_VAL_150_O45_OR }, + { "160%", OPTION_VAL_160_O45_OR }, + { "170%", OPTION_VAL_170_O45_OR }, + { "180%", OPTION_VAL_180_O45_OR }, + { "190%", OPTION_VAL_190_O45_OR }, + { "200%", OPTION_VAL_200_O45_OR }, + { "210%", OPTION_VAL_210_O45_OR }, + { "220%", OPTION_VAL_220_O45_OR }, + { "230%", OPTION_VAL_230_O45_OR }, + { "240%", OPTION_VAL_240_O45_OR }, + { "250%", OPTION_VAL_250_O45_OR }, + { "260%", OPTION_VAL_260_O45_OR }, + { "270%", OPTION_VAL_270_O45_OR }, + { "280%", OPTION_VAL_280_O45_OR }, + { "290%", OPTION_VAL_290_O45_OR }, + { "300%", OPTION_VAL_300_O45_OR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_lightgun1_crosshair", + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_OR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_OR }, + { "Red", OPTION_VAL_RED_OR }, + { "Green", OPTION_VAL_GREEN_OR }, + { "Blue", OPTION_VAL_BLUE_OR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun2_crosshair", + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_OR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_OR }, + { "Red", OPTION_VAL_RED_OR }, + { "Green", OPTION_VAL_GREEN_OR }, + { "Blue", OPTION_VAL_BLUE_OR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun3_crosshair", + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_OR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_OR }, + { "Red", OPTION_VAL_RED_OR }, + { "Green", OPTION_VAL_GREEN_OR }, + { "Blue", OPTION_VAL_BLUE_OR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun4_crosshair", + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_OR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_OR }, + { "Red", OPTION_VAL_RED_OR }, + { "Green", OPTION_VAL_GREEN_OR }, + { "Blue", OPTION_VAL_BLUE_OR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_OR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_OR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_OR }, + { "Purupuru", OPTION_VAL_PURUPURU_OR }, + { "None", OPTION_VAL_NONE_OR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_OR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_OR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_OR, + NULL, + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_OR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_OR }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_OR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_OR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_OR, + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_OR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_OR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_OR, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { NULL, NULL }, + }, + "Upper Left", + }, + { + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_OR }, + { "2x", OPTION_VAL_2_O26_OR }, + { "3x", OPTION_VAL_3X_OR }, + { "4x", OPTION_VAL_4_OR }, + { "5x", OPTION_VAL_5X_OR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_OR }, + { "20%", OPTION_VAL_20_OR }, + { "30%", OPTION_VAL_30_OR }, + { "40%", OPTION_VAL_40_OR }, + { "50%", OPTION_VAL_50_OR }, + { "60%", OPTION_VAL_60_OR }, + { "70%", OPTION_VAL_70_OR }, + { "80%", OPTION_VAL_80_OR }, + { "90%", OPTION_VAL_90_OR }, + { "100%", OPTION_VAL_100_O45_OR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { NULL, NULL }, + }, + "Upper Right", + }, + { + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_OR }, + { "2x", OPTION_VAL_2_O26_OR }, + { "3x", OPTION_VAL_3X_OR }, + { "4x", OPTION_VAL_4_OR }, + { "5x", OPTION_VAL_5X_OR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_OR }, + { "20%", OPTION_VAL_20_OR }, + { "30%", OPTION_VAL_30_OR }, + { "40%", OPTION_VAL_40_OR }, + { "50%", OPTION_VAL_50_OR }, + { "60%", OPTION_VAL_60_OR }, + { "70%", OPTION_VAL_70_OR }, + { "80%", OPTION_VAL_80_OR }, + { "90%", OPTION_VAL_90_OR }, + { "100%", OPTION_VAL_100_O45_OR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { NULL, NULL }, + }, + "Lower Left", + }, + { + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_OR }, + { "2x", OPTION_VAL_2_O26_OR }, + { "3x", OPTION_VAL_3X_OR }, + { "4x", OPTION_VAL_4_OR }, + { "5x", OPTION_VAL_5X_OR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_OR }, + { "20%", OPTION_VAL_20_OR }, + { "30%", OPTION_VAL_30_OR }, + { "40%", OPTION_VAL_40_OR }, + { "50%", OPTION_VAL_50_OR }, + { "60%", OPTION_VAL_60_OR }, + { "70%", OPTION_VAL_70_OR }, + { "80%", OPTION_VAL_80_OR }, + { "90%", OPTION_VAL_90_OR }, + { "100%", OPTION_VAL_100_O45_OR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { NULL, NULL }, + }, + "Lower Right", + }, + { + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_OR }, + { "2x", OPTION_VAL_2_O26_OR }, + { "3x", OPTION_VAL_3X_OR }, + { "4x", OPTION_VAL_4_OR }, + { "5x", OPTION_VAL_5X_OR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, + { "BLACK 02", OPTION_VAL_BLACK_02_OR }, + { "BLUE 03", OPTION_VAL_BLUE_OR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, + { "GREEN 05", OPTION_VAL_GREEN_OR }, + { "CYAN 06", OPTION_VAL_CYAN_06_OR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, + { "RED 11", OPTION_VAL_RED_OR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, + { "GRAY 15", OPTION_VAL_GRAY_15_OR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, + { "WHITE 28", OPTION_VAL_WHITE_OR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_OR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_OR }, + { "20%", OPTION_VAL_20_OR }, + { "30%", OPTION_VAL_30_OR }, + { "40%", OPTION_VAL_40_OR }, + { "50%", OPTION_VAL_50_OR }, + { "60%", OPTION_VAL_60_OR }, + { "70%", OPTION_VAL_70_OR }, + { "80%", OPTION_VAL_80_OR }, + { "90%", OPTION_VAL_90_OR }, + { "100%", OPTION_VAL_100_O45_OR }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_or = { + option_cats_or, + option_defs_or +}; + +/* RETRO_LANGUAGE_PL */ + +#define CATEGORY_SYSTEM_LABEL_PL NULL +#define CATEGORY_SYSTEM_INFO_0_PL "Skonfiguruj ustawienia regionu, języka, BIOS i podstawowego sprzętu." +#define CATEGORY_VIDEO_LABEL_PL "Wideo" +#define CATEGORY_VIDEO_INFO_0_PL NULL +#define CATEGORY_PERFORMANCE_LABEL_PL "Wydajność" +#define CATEGORY_PERFORMANCE_INFO_0_PL NULL +#define CATEGORY_HACKS_LABEL_PL "Hacki emulacyjne" +#define CATEGORY_HACKS_INFO_0_PL NULL +#define CATEGORY_INPUT_LABEL_PL "Wejście" +#define CATEGORY_INPUT_INFO_0_PL NULL +#define CATEGORY_EXPANSIONS_LABEL_PL "Sloty rozszerzenia kontrolera" +#define CATEGORY_EXPANSIONS_INFO_0_PL "Wybierz urządzenie (VMU, urządzenie z plotką) podłączone do każdego pola rozszerzenia sterownika." +#define CATEGORY_VMU_LABEL_PL "Jednostka pamięci wizualnej" +#define CATEGORY_VMU_INFO_0_PL NULL +#define CORE_OPTION_NAME_REGION_LABEL_PL NULL +#define OPTION_VAL_JAPAN_PL NULL +#define OPTION_VAL_USA_PL NULL +#define OPTION_VAL_EUROPE_PL NULL +#define OPTION_VAL_DEFAULT_PL "Domyślny" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_PL "Język" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PL "Zmienia język używany przez BIOS i przez gry zawierające wiele języków." +#define OPTION_VAL_JAPANESE_PL "japoński" +#define OPTION_VAL_ENGLISH_PL "angielski" +#define OPTION_VAL_GERMAN_PL "niemiecki" +#define OPTION_VAL_FRENCH_PL "francuski" +#define OPTION_VAL_SPANISH_PL "hiszpański" +#define OPTION_VAL_ITALIAN_PL "włoski" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PL "HLE BIOS (wymagany restart)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PL NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PL NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PL NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PL "Zezwalaj na przyciski serwisowe Arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PL "Włącza przycisk SERVICE dla gier arkadowych, aby wprowadzić ustawienia szafy." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PL "Ustaw gry NAOMI jako Free Play" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PL NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PL "Emulacja adaptera szerokopasmowego" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PL NULL +#define CORE_OPTION_NAME_UPNP_LABEL_PL "Włącz UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_PL "Użyj UPnP, aby automatycznie skonfigurować router internetowy dla gier online." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PL "Rozdzielczość wewnętrzna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PL NULL +#define OPTION_VAL_320X240_PL "320x240 (Połowa)" +#define OPTION_VAL_640X480_PL NULL +#define OPTION_VAL_800X600_PL NULL +#define OPTION_VAL_960X720_PL NULL +#define OPTION_VAL_1024X768_PL NULL +#define OPTION_VAL_1280X960_PL NULL +#define OPTION_VAL_1440X1080_PL NULL +#define OPTION_VAL_1600X1200_PL NULL +#define OPTION_VAL_1920X1440_PL NULL +#define OPTION_VAL_2560X1920_PL NULL +#define OPTION_VAL_2880X2160_PL NULL +#define OPTION_VAL_3200X2400_PL NULL +#define OPTION_VAL_3840X2880_PL NULL +#define OPTION_VAL_4480X3360_PL NULL +#define OPTION_VAL_5120X3840_PL NULL +#define OPTION_VAL_5760X4320_PL NULL +#define OPTION_VAL_6400X4800_PL NULL +#define OPTION_VAL_7040X5280_PL NULL +#define OPTION_VAL_7680X5760_PL NULL +#define OPTION_VAL_8320X6240_PL NULL +#define OPTION_VAL_8960X6720_PL NULL +#define OPTION_VAL_9600X7200_PL NULL +#define OPTION_VAL_10240X7680_PL NULL +#define OPTION_VAL_10880X8160_PL NULL +#define OPTION_VAL_11520X8640_PL NULL +#define OPTION_VAL_12160X9120_PL NULL +#define OPTION_VAL_12800X9600_PL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PL NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PL NULL +#define OPTION_VAL_VGA_PL NULL +#define OPTION_VAL_TV_RGB_PL NULL +#define OPTION_VAL_TV_COMPOSITE_PL NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_PL NULL +#define OPTION_VAL_NTSC_PL NULL +#define OPTION_VAL_PAL_PL NULL +#define OPTION_VAL_PAL_N_PL NULL +#define OPTION_VAL_PAL_M_PL NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PL "Orientacja ekranu" +#define OPTION_VAL_HORIZONTAL_PL NULL +#define OPTION_VAL_VERTICAL_PL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PL NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PL NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_PL NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_PL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PL NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PL NULL +#define OPTION_VAL_512MB_PL NULL +#define OPTION_VAL_1GB_PL NULL +#define OPTION_VAL_2GB_PL NULL +#define OPTION_VAL_4GB_PL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PL NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PL NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PL "Emulacja pełnego bufora ramki" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PL NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PL NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PL NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_PL NULL +#define CORE_OPTION_NAME_FOG_LABEL_PL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PL NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PL NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PL NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PL "Filtrowanie tekstur" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PL NULL +#define OPTION_VAL_1_PL NULL +#define OPTION_VAL_2_PL "Wymuś liniowy" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PL NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PL NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PL "Wykrywanie zmian częstotliwości klatek" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PL NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PL NULL +#define OPTION_VAL_2_O26_PL NULL +#define OPTION_VAL_4_PL NULL +#define OPTION_VAL_6_PL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PL NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PL NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PL NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PL NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PL NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PL NULL +#define OPTION_VAL_SOME_PL "Normalny" +#define OPTION_VAL_MORE_PL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PL NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PL NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PL NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PL NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PL "Włącza modyfikację pamięci RAM 32MB dla Dreamcast. Może wpływać na kompatybilność" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PL NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PL "Zmień główny zegar procesora SH4 z domyślnego 200 MHz. Odzwierciedlanie może pomóc spowolnić platformy. Przełączanie może zwiększyć szybkość klatek dla niektórych gier. Używaj ostrożnie." +#define OPTION_VAL_100_PL NULL +#define OPTION_VAL_110_PL NULL +#define OPTION_VAL_120_PL NULL +#define OPTION_VAL_130_PL NULL +#define OPTION_VAL_140_PL NULL +#define OPTION_VAL_150_PL NULL +#define OPTION_VAL_160_PL NULL +#define OPTION_VAL_170_PL NULL +#define OPTION_VAL_180_PL NULL +#define OPTION_VAL_190_PL NULL +#define OPTION_VAL_200_PL NULL +#define OPTION_VAL_210_PL NULL +#define OPTION_VAL_220_PL NULL +#define OPTION_VAL_230_PL NULL +#define OPTION_VAL_240_PL NULL +#define OPTION_VAL_250_PL NULL +#define OPTION_VAL_260_PL NULL +#define OPTION_VAL_270_PL NULL +#define OPTION_VAL_280_PL NULL +#define OPTION_VAL_290_PL NULL +#define OPTION_VAL_300_PL NULL +#define OPTION_VAL_310_PL NULL +#define OPTION_VAL_320_PL NULL +#define OPTION_VAL_330_PL NULL +#define OPTION_VAL_340_PL NULL +#define OPTION_VAL_350_PL NULL +#define OPTION_VAL_360_PL NULL +#define OPTION_VAL_370_PL NULL +#define OPTION_VAL_380_PL NULL +#define OPTION_VAL_390_PL NULL +#define OPTION_VAL_400_PL NULL +#define OPTION_VAL_410_PL NULL +#define OPTION_VAL_420_PL NULL +#define OPTION_VAL_430_PL NULL +#define OPTION_VAL_440_PL NULL +#define OPTION_VAL_450_PL NULL +#define OPTION_VAL_460_PL NULL +#define OPTION_VAL_470_PL NULL +#define OPTION_VAL_480_PL NULL +#define OPTION_VAL_490_PL NULL +#define OPTION_VAL_500_PL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PL NULL +#define OPTION_VAL_0_PL NULL +#define OPTION_VAL_5_PL NULL +#define OPTION_VAL_10_PL NULL +#define OPTION_VAL_15_PL NULL +#define OPTION_VAL_20_PL NULL +#define OPTION_VAL_25_PL NULL +#define OPTION_VAL_30_PL "30 %" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PL NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PL NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PL NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PL NULL +#define OPTION_VAL_50_PL "50 %" +#define OPTION_VAL_60_PL "60 %" +#define OPTION_VAL_70_PL NULL +#define OPTION_VAL_80_PL "80 %" +#define OPTION_VAL_90_PL NULL +#define OPTION_VAL_100_O45_PL NULL +#define OPTION_VAL_110_O45_PL NULL +#define OPTION_VAL_120_O45_PL NULL +#define OPTION_VAL_130_O45_PL NULL +#define OPTION_VAL_140_O45_PL NULL +#define OPTION_VAL_150_O45_PL NULL +#define OPTION_VAL_160_O45_PL NULL +#define OPTION_VAL_170_O45_PL NULL +#define OPTION_VAL_180_O45_PL NULL +#define OPTION_VAL_190_O45_PL NULL +#define OPTION_VAL_200_O45_PL NULL +#define OPTION_VAL_210_O45_PL NULL +#define OPTION_VAL_220_O45_PL NULL +#define OPTION_VAL_230_O45_PL NULL +#define OPTION_VAL_240_O45_PL NULL +#define OPTION_VAL_250_O45_PL NULL +#define OPTION_VAL_260_O45_PL NULL +#define OPTION_VAL_270_O45_PL NULL +#define OPTION_VAL_280_O45_PL NULL +#define OPTION_VAL_290_O45_PL NULL +#define OPTION_VAL_300_O45_PL NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PL NULL +#define OPTION_VAL_WHITE_PL NULL +#define OPTION_VAL_RED_PL "Czerwony" +#define OPTION_VAL_GREEN_PL "Zielony" +#define OPTION_VAL_BLUE_PL "Niebieski" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PL NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PL NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PL NULL +#define OPTION_VAL_VMU_PL NULL +#define OPTION_VAL_PURUPURU_PL NULL +#define OPTION_VAL_NONE_PL "Brak" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PL NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PL "Gdy wyłączone, wszystkie gry udostępniają do 8 plików zapisów VMU (A1/A2/B1/B2/C1/C2/D1/D2) znajdujących się w folderze systemowym RetroArch.\nUstawienie 'VMU A1' tworzy unikalny plik VMU 'A1' w folderze zapisów RetroArcha dla każdej uruchomionej gry.\nUstawienie 'Wszystkie VMU' tworzy do 8 unikalnych plików VMU (A1/A2/B1/B2/C1/C2/D1/D2/D2) dla każdej uruchomionej gry." +#define OPTION_VAL_VMU_A1_PL NULL +#define OPTION_VAL_ALL_VMUS_PL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PL "Dźwięki VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PL "Po włączeniu dźwięk VMU jest odtwarzany." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PL NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PL NULL +#define OPTION_VAL_UPPER_LEFT_PL NULL +#define OPTION_VAL_UPPER_RIGHT_PL NULL +#define OPTION_VAL_LOWER_LEFT_PL NULL +#define OPTION_VAL_LOWER_RIGHT_PL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PL NULL +#define OPTION_VAL_1X_PL NULL +#define OPTION_VAL_3X_PL NULL +#define OPTION_VAL_5X_PL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PL NULL +#define OPTION_VAL_DEFAULT_ON_00_PL NULL +#define OPTION_VAL_DEFAULT_OFF_01_PL NULL +#define OPTION_VAL_BLACK_02_PL NULL +#define OPTION_VAL_LIGHT_BLUE_04_PL NULL +#define OPTION_VAL_CYAN_06_PL NULL +#define OPTION_VAL_CYAN_BLUE_07_PL NULL +#define OPTION_VAL_LIGHT_GREEN_08_PL NULL +#define OPTION_VAL_CYAN_GREEN_09_PL NULL +#define OPTION_VAL_LIGHT_CYAN_10_PL NULL +#define OPTION_VAL_PURPLE_12_PL NULL +#define OPTION_VAL_LIGHT_PURPLE_13_PL NULL +#define OPTION_VAL_YELLOW_14_PL "Żółty" +#define OPTION_VAL_GRAY_15_PL NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_PL NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_PL NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_PL NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_PL NULL +#define OPTION_VAL_LIGHT_RED_2_20_PL NULL +#define OPTION_VAL_MAGENTA_21_PL NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_PL NULL +#define OPTION_VAL_LIGHT_ORANGE_23_PL NULL +#define OPTION_VAL_ORANGE_24_PL NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_PL NULL +#define OPTION_VAL_LIGHT_YELLOW_26_PL NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_PL NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PL NULL +#define OPTION_VAL_40_PL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PL NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PL NULL -struct retro_core_option_v2_category option_cats_or[] = { +struct retro_core_option_v2_category option_cats_pl[] = { { "system", - CATEGORY_SYSTEM_LABEL_OR, - CATEGORY_SYSTEM_INFO_0_OR + CATEGORY_SYSTEM_LABEL_PL, + CATEGORY_SYSTEM_INFO_0_PL }, { "video", - CATEGORY_VIDEO_LABEL_OR, - CATEGORY_VIDEO_INFO_0_OR + CATEGORY_VIDEO_LABEL_PL, + CATEGORY_VIDEO_INFO_0_PL }, { "performance", - CATEGORY_PERFORMANCE_LABEL_OR, - CATEGORY_PERFORMANCE_INFO_0_OR + CATEGORY_PERFORMANCE_LABEL_PL, + CATEGORY_PERFORMANCE_INFO_0_PL }, { "hacks", - CATEGORY_HACKS_LABEL_OR, - CATEGORY_HACKS_INFO_0_OR + CATEGORY_HACKS_LABEL_PL, + CATEGORY_HACKS_INFO_0_PL }, { "input", - CATEGORY_INPUT_LABEL_OR, - CATEGORY_INPUT_INFO_0_OR + CATEGORY_INPUT_LABEL_PL, + CATEGORY_INPUT_INFO_0_PL + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_PL, + CATEGORY_EXPANSIONS_INFO_0_PL }, { "vmu", - CATEGORY_VMU_LABEL_OR, - CATEGORY_VMU_INFO_0_OR + CATEGORY_VMU_LABEL_PL, + CATEGORY_VMU_INFO_0_PL }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_or[] = { +struct retro_core_option_v2_definition option_defs_pl[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_OR, + CORE_OPTION_NAME_REGION_LABEL_PL, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_OR }, - { "USA", OPTION_VAL_USA_OR }, - { "Europe", OPTION_VAL_EUROPE_OR }, - { "Default", OPTION_VAL_DEFAULT_OR }, + { "Japan", OPTION_VAL_JAPAN_PL }, + { "USA", OPTION_VAL_USA_PL }, + { "Europe", OPTION_VAL_EUROPE_PL }, + { "Default", OPTION_VAL_DEFAULT_PL }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_OR, + CORE_OPTION_NAME_LANGUAGE_LABEL_PL, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_OR, + CORE_OPTION_NAME_LANGUAGE_INFO_0_PL, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_OR }, - { "English", OPTION_VAL_ENGLISH_OR }, - { "German", OPTION_VAL_GERMAN_OR }, - { "French", OPTION_VAL_FRENCH_OR }, - { "Spanish", OPTION_VAL_SPANISH_OR }, - { "Italian", OPTION_VAL_ITALIAN_OR }, - { "Default", OPTION_VAL_DEFAULT_OR }, + { "Japanese", OPTION_VAL_JAPANESE_PL }, + { "English", OPTION_VAL_ENGLISH_PL }, + { "German", OPTION_VAL_GERMAN_PL }, + { "French", OPTION_VAL_FRENCH_PL }, + { "Spanish", OPTION_VAL_SPANISH_PL }, + { "Italian", OPTION_VAL_ITALIAN_PL }, + { "Default", OPTION_VAL_DEFAULT_PL }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_OR, + CORE_OPTION_NAME_HLE_BIOS_LABEL_PL, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_OR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_PL, NULL, "system", { @@ -48996,9 +58855,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_OR, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PL, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_OR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PL, NULL, "system", { @@ -49010,9 +58869,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_OR, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_PL, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_OR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PL, NULL, "system", { @@ -49026,25 +58885,11 @@ struct retro_core_option_v2_definition option_defs_or[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_OR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_OR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_OR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PL, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_OR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PL, NULL, "system", { @@ -49056,9 +58901,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_OR, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PL, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_OR, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PL, NULL, "system", { @@ -49070,9 +58915,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_OR, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_PL, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_OR, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PL, NULL, "system", { @@ -49084,9 +58929,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_OR, + CORE_OPTION_NAME_UPNP_LABEL_PL, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_OR, + CORE_OPTION_NAME_UPNP_INFO_0_PL, NULL, "system", { @@ -49099,39 +58944,39 @@ struct retro_core_option_v2_definition option_defs_or[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_OR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PL, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_OR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PL, NULL, "video", { - { "320x240", OPTION_VAL_320X240_OR }, - { "640x480", OPTION_VAL_640X480_OR }, - { "800x600", OPTION_VAL_800X600_OR }, - { "960x720", OPTION_VAL_960X720_OR }, - { "1024x768", OPTION_VAL_1024X768_OR }, - { "1280x960", OPTION_VAL_1280X960_OR }, - { "1440x1080", OPTION_VAL_1440X1080_OR }, - { "1600x1200", OPTION_VAL_1600X1200_OR }, - { "1920x1440", OPTION_VAL_1920X1440_OR }, - { "2560x1920", OPTION_VAL_2560X1920_OR }, - { "2880x2160", OPTION_VAL_2880X2160_OR }, - { "3200x2400", OPTION_VAL_3200X2400_OR }, - { "3840x2880", OPTION_VAL_3840X2880_OR }, - { "4480x3360", OPTION_VAL_4480X3360_OR }, - { "5120x3840", OPTION_VAL_5120X3840_OR }, - { "5760x4320", OPTION_VAL_5760X4320_OR }, - { "6400x4800", OPTION_VAL_6400X4800_OR }, - { "7040x5280", OPTION_VAL_7040X5280_OR }, - { "7680x5760", OPTION_VAL_7680X5760_OR }, - { "8320x6240", OPTION_VAL_8320X6240_OR }, - { "8960x6720", OPTION_VAL_8960X6720_OR }, - { "9600x7200", OPTION_VAL_9600X7200_OR }, - { "10240x7680", OPTION_VAL_10240X7680_OR }, - { "10880x8160", OPTION_VAL_10880X8160_OR }, - { "11520x8640", OPTION_VAL_11520X8640_OR }, - { "12160x9120", OPTION_VAL_12160X9120_OR }, - { "12800x9600", OPTION_VAL_12800X9600_OR }, + { "320x240", OPTION_VAL_320X240_PL }, + { "640x480", OPTION_VAL_640X480_PL }, + { "800x600", OPTION_VAL_800X600_PL }, + { "960x720", OPTION_VAL_960X720_PL }, + { "1024x768", OPTION_VAL_1024X768_PL }, + { "1280x960", OPTION_VAL_1280X960_PL }, + { "1440x1080", OPTION_VAL_1440X1080_PL }, + { "1600x1200", OPTION_VAL_1600X1200_PL }, + { "1920x1440", OPTION_VAL_1920X1440_PL }, + { "2560x1920", OPTION_VAL_2560X1920_PL }, + { "2880x2160", OPTION_VAL_2880X2160_PL }, + { "3200x2400", OPTION_VAL_3200X2400_PL }, + { "3840x2880", OPTION_VAL_3840X2880_PL }, + { "4480x3360", OPTION_VAL_4480X3360_PL }, + { "5120x3840", OPTION_VAL_5120X3840_PL }, + { "5760x4320", OPTION_VAL_5760X4320_PL }, + { "6400x4800", OPTION_VAL_6400X4800_PL }, + { "7040x5280", OPTION_VAL_7040X5280_PL }, + { "7680x5760", OPTION_VAL_7680X5760_PL }, + { "8320x6240", OPTION_VAL_8320X6240_PL }, + { "8960x6720", OPTION_VAL_8960X6720_PL }, + { "9600x7200", OPTION_VAL_9600X7200_PL }, + { "10240x7680", OPTION_VAL_10240X7680_PL }, + { "10880x8160", OPTION_VAL_10880X8160_PL }, + { "11520x8640", OPTION_VAL_11520X8640_PL }, + { "12160x9120", OPTION_VAL_12160X9120_PL }, + { "12800x9600", OPTION_VAL_12800X9600_PL }, { NULL, NULL }, }, #ifdef LOW_RES @@ -49142,62 +58987,62 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_OR, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_PL, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_OR, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PL, NULL, "video", { - { "VGA", OPTION_VAL_VGA_OR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_OR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_OR }, + { "VGA", OPTION_VAL_VGA_PL }, + { "TV (RGB)", OPTION_VAL_TV_RGB_PL }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PL }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_OR, + CORE_OPTION_NAME_BROADCAST_LABEL_PL, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_OR }, - { "PAL", OPTION_VAL_PAL_OR }, - { "PAL_N", OPTION_VAL_PAL_N_OR }, - { "PAL_M", OPTION_VAL_PAL_M_OR }, - { "Default", OPTION_VAL_DEFAULT_OR }, + { "NTSC", OPTION_VAL_NTSC_PL }, + { "PAL", OPTION_VAL_PAL_PL }, + { "PAL_N", OPTION_VAL_PAL_N_PL }, + { "PAL_M", OPTION_VAL_PAL_M_PL }, + { "Default", OPTION_VAL_DEFAULT_PL }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_OR, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PL, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_OR }, - { "vertical", OPTION_VAL_VERTICAL_OR }, + { "horizontal", OPTION_VAL_HORIZONTAL_PL }, + { "vertical", OPTION_VAL_VERTICAL_PL }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_OR, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PL, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_OR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_OR }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PL }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PL }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_OR }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PL }, #endif { NULL, NULL }, }, @@ -49210,25 +59055,25 @@ struct retro_core_option_v2_definition option_defs_or[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_OR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PL, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_OR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PL, NULL, "video", { - { "512MB", OPTION_VAL_512MB_OR }, - { "1GB", OPTION_VAL_1GB_OR }, - { "2GB", OPTION_VAL_2GB_OR }, - { "4GB", OPTION_VAL_4GB_OR }, + { "512MB", OPTION_VAL_512MB_PL }, + { "1GB", OPTION_VAL_1GB_PL }, + { "2GB", OPTION_VAL_2GB_PL }, + { "4GB", OPTION_VAL_4GB_PL }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_OR, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_PL, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_OR, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PL, NULL, "video", { @@ -49236,6 +59081,7 @@ struct retro_core_option_v2_definition option_defs_or[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -49244,9 +59090,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_OR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PL, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_OR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PL, NULL, "video", { @@ -49258,9 +59104,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_OR, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PL, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_OR, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PL, NULL, "video", { @@ -49270,11 +59116,11 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_OR, + CORE_OPTION_NAME_MIPMAPPING_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_PL, NULL, "video", { @@ -49286,7 +59132,7 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_OR, + CORE_OPTION_NAME_FOG_LABEL_PL, NULL, "", NULL, @@ -49300,9 +59146,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_OR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PL, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_OR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PL, NULL, "video", { @@ -49314,9 +59160,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_OR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PL, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_OR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PL, NULL, "video", { @@ -49331,24 +59177,24 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_OR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PL, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_OR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PL, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_OR }, - { "1", OPTION_VAL_1_OR }, - { "2", OPTION_VAL_2_OR }, + { "0", OPTION_VAL_DEFAULT_PL }, + { "1", OPTION_VAL_1_PL }, + { "2", OPTION_VAL_2_PL }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_OR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PL, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_OR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PL, NULL, "video", { @@ -49356,13 +59202,13 @@ struct retro_core_option_v2_definition option_defs_or[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_OR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PL, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_OR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PL, NULL, "video", { @@ -49374,9 +59220,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_OR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PL, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_OR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PL, NULL, "video", { @@ -49389,25 +59235,25 @@ struct retro_core_option_v2_definition option_defs_or[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_OR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_PL, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_OR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PL, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_OR }, - { "4", OPTION_VAL_4_OR }, - { "6", OPTION_VAL_6_OR }, + { "2", OPTION_VAL_2_O26_PL }, + { "4", OPTION_VAL_4_PL }, + { "6", OPTION_VAL_6_PL }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_OR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PL, NULL, "video", { @@ -49421,9 +59267,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_OR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PL, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_OR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PL, NULL, "video", { @@ -49433,11 +59279,25 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PL, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PL, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_OR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PL, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_OR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PL, NULL, "performance", { @@ -49449,15 +59309,15 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_OR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PL, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_OR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PL, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_OR }, - { "more", OPTION_VAL_MORE_OR }, + { "some", OPTION_VAL_SOME_PL }, + { "more", OPTION_VAL_MORE_PL }, { NULL, NULL }, }, #ifdef LOW_END @@ -49468,9 +59328,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_OR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PL, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_OR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PL, NULL, "performance", { @@ -49487,9 +59347,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_OR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PL, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_OR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PL, NULL, "hacks", { @@ -49501,9 +59361,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_OR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PL, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_OR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PL, NULL, "hacks", { @@ -49515,9 +59375,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_OR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PL, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_OR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PL, NULL, "hacks", { @@ -49531,64 +59391,78 @@ struct retro_core_option_v2_definition option_defs_or[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PL, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PL, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_OR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_PL, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_OR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_PL, NULL, "hacks", { - { "100", OPTION_VAL_100_OR }, - { "110", OPTION_VAL_110_OR }, - { "120", OPTION_VAL_120_OR }, - { "130", OPTION_VAL_130_OR }, - { "140", OPTION_VAL_140_OR }, - { "150", OPTION_VAL_150_OR }, - { "160", OPTION_VAL_160_OR }, - { "170", OPTION_VAL_170_OR }, - { "180", OPTION_VAL_180_OR }, - { "190", OPTION_VAL_190_OR }, - { "200", OPTION_VAL_200_OR }, - { "210", OPTION_VAL_210_OR }, - { "220", OPTION_VAL_220_OR }, - { "230", OPTION_VAL_230_OR }, - { "240", OPTION_VAL_240_OR }, - { "250", OPTION_VAL_250_OR }, - { "260", OPTION_VAL_260_OR }, - { "270", OPTION_VAL_270_OR }, - { "280", OPTION_VAL_280_OR }, - { "290", OPTION_VAL_290_OR }, - { "300", OPTION_VAL_300_OR }, - { "310", OPTION_VAL_310_OR }, - { "320", OPTION_VAL_320_OR }, - { "330", OPTION_VAL_330_OR }, - { "340", OPTION_VAL_340_OR }, - { "350", OPTION_VAL_350_OR }, - { "360", OPTION_VAL_360_OR }, - { "370", OPTION_VAL_370_OR }, - { "380", OPTION_VAL_380_OR }, - { "390", OPTION_VAL_390_OR }, - { "400", OPTION_VAL_400_OR }, - { "410", OPTION_VAL_410_OR }, - { "420", OPTION_VAL_420_OR }, - { "430", OPTION_VAL_430_OR }, - { "440", OPTION_VAL_440_OR }, - { "450", OPTION_VAL_450_OR }, - { "460", OPTION_VAL_460_OR }, - { "470", OPTION_VAL_470_OR }, - { "480", OPTION_VAL_480_OR }, - { "490", OPTION_VAL_490_OR }, - { "500", OPTION_VAL_500_OR }, + { "100", OPTION_VAL_100_PL }, + { "110", OPTION_VAL_110_PL }, + { "120", OPTION_VAL_120_PL }, + { "130", OPTION_VAL_130_PL }, + { "140", OPTION_VAL_140_PL }, + { "150", OPTION_VAL_150_PL }, + { "160", OPTION_VAL_160_PL }, + { "170", OPTION_VAL_170_PL }, + { "180", OPTION_VAL_180_PL }, + { "190", OPTION_VAL_190_PL }, + { "200", OPTION_VAL_200_PL }, + { "210", OPTION_VAL_210_PL }, + { "220", OPTION_VAL_220_PL }, + { "230", OPTION_VAL_230_PL }, + { "240", OPTION_VAL_240_PL }, + { "250", OPTION_VAL_250_PL }, + { "260", OPTION_VAL_260_PL }, + { "270", OPTION_VAL_270_PL }, + { "280", OPTION_VAL_280_PL }, + { "290", OPTION_VAL_290_PL }, + { "300", OPTION_VAL_300_PL }, + { "310", OPTION_VAL_310_PL }, + { "320", OPTION_VAL_320_PL }, + { "330", OPTION_VAL_330_PL }, + { "340", OPTION_VAL_340_PL }, + { "350", OPTION_VAL_350_PL }, + { "360", OPTION_VAL_360_PL }, + { "370", OPTION_VAL_370_PL }, + { "380", OPTION_VAL_380_PL }, + { "390", OPTION_VAL_390_PL }, + { "400", OPTION_VAL_400_PL }, + { "410", OPTION_VAL_410_PL }, + { "420", OPTION_VAL_420_PL }, + { "430", OPTION_VAL_430_PL }, + { "440", OPTION_VAL_440_PL }, + { "450", OPTION_VAL_450_PL }, + { "460", OPTION_VAL_460_PL }, + { "470", OPTION_VAL_470_PL }, + { "480", OPTION_VAL_480_PL }, + { "490", OPTION_VAL_490_PL }, + { "500", OPTION_VAL_500_PL }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_OR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PL, NULL, "hacks", { @@ -49598,11 +59472,11 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_OR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PL, NULL, "hacks", { @@ -49614,47 +59488,47 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_OR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PL, NULL, "input", { - { "0%", OPTION_VAL_0_OR }, - { "5%", OPTION_VAL_5_OR }, - { "10%", OPTION_VAL_10_OR }, - { "15%", OPTION_VAL_15_OR }, - { "20%", OPTION_VAL_20_OR }, - { "25%", OPTION_VAL_25_OR }, - { "30%", OPTION_VAL_30_OR }, + { "0%", OPTION_VAL_0_PL }, + { "5%", OPTION_VAL_5_PL }, + { "10%", OPTION_VAL_10_PL }, + { "15%", OPTION_VAL_15_PL }, + { "20%", OPTION_VAL_20_PL }, + { "25%", OPTION_VAL_25_PL }, + { "30%", OPTION_VAL_30_PL }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_OR, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PL, NULL, "input", { - { "0%", OPTION_VAL_0_OR }, - { "5%", OPTION_VAL_5_OR }, - { "10%", OPTION_VAL_10_OR }, - { "15%", OPTION_VAL_15_OR }, - { "20%", OPTION_VAL_20_OR }, - { "25%", OPTION_VAL_25_OR }, - { "30%", OPTION_VAL_30_OR }, + { "0%", OPTION_VAL_0_PL }, + { "5%", OPTION_VAL_5_PL }, + { "10%", OPTION_VAL_10_PL }, + { "15%", OPTION_VAL_15_PL }, + { "20%", OPTION_VAL_20_PL }, + { "25%", OPTION_VAL_25_PL }, + { "30%", OPTION_VAL_30_PL }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_OR, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PL, NULL, "input", { @@ -49664,25 +59538,11 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_OR, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_OR, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_OR, + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PL, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_OR, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PL, NULL, "input", { @@ -49694,9 +59554,9 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, { CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_OR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PL, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_OR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PL, NULL, "input", { @@ -49706,1084 +59566,1297 @@ struct retro_core_option_v2_definition option_defs_or[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PL, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_PL }, + { "60%", OPTION_VAL_60_PL }, + { "70%", OPTION_VAL_70_PL }, + { "80%", OPTION_VAL_80_PL }, + { "90%", OPTION_VAL_90_PL }, + { "100%", OPTION_VAL_100_O45_PL }, + { "110%", OPTION_VAL_110_O45_PL }, + { "120%", OPTION_VAL_120_O45_PL }, + { "130%", OPTION_VAL_130_O45_PL }, + { "140%", OPTION_VAL_140_O45_PL }, + { "150%", OPTION_VAL_150_O45_PL }, + { "160%", OPTION_VAL_160_O45_PL }, + { "170%", OPTION_VAL_170_O45_PL }, + { "180%", OPTION_VAL_180_O45_PL }, + { "190%", OPTION_VAL_190_O45_PL }, + { "200%", OPTION_VAL_200_O45_PL }, + { "210%", OPTION_VAL_210_O45_PL }, + { "220%", OPTION_VAL_220_O45_PL }, + { "230%", OPTION_VAL_230_O45_PL }, + { "240%", OPTION_VAL_240_O45_PL }, + { "250%", OPTION_VAL_250_O45_PL }, + { "260%", OPTION_VAL_260_O45_PL }, + { "270%", OPTION_VAL_270_O45_PL }, + { "280%", OPTION_VAL_280_O45_PL }, + { "290%", OPTION_VAL_290_O45_PL }, + { "300%", OPTION_VAL_300_O45_PL }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_OR, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_OR }, - { "Red", OPTION_VAL_RED_OR }, - { "Green", OPTION_VAL_GREEN_OR }, - { "Blue", OPTION_VAL_BLUE_OR }, + { "White", OPTION_VAL_WHITE_PL }, + { "Red", OPTION_VAL_RED_PL }, + { "Green", OPTION_VAL_GREEN_PL }, + { "Blue", OPTION_VAL_BLUE_PL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_OR, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_OR }, - { "Red", OPTION_VAL_RED_OR }, - { "Green", OPTION_VAL_GREEN_OR }, - { "Blue", OPTION_VAL_BLUE_OR }, + { "White", OPTION_VAL_WHITE_PL }, + { "Red", OPTION_VAL_RED_PL }, + { "Green", OPTION_VAL_GREEN_PL }, + { "Blue", OPTION_VAL_BLUE_PL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_OR, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_OR }, - { "Red", OPTION_VAL_RED_OR }, - { "Green", OPTION_VAL_GREEN_OR }, - { "Blue", OPTION_VAL_BLUE_OR }, + { "White", OPTION_VAL_WHITE_PL }, + { "Red", OPTION_VAL_RED_PL }, + { "Green", OPTION_VAL_GREEN_PL }, + { "Blue", OPTION_VAL_BLUE_PL }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_OR, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PL, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_OR }, - { "Red", OPTION_VAL_RED_OR }, - { "Green", OPTION_VAL_GREEN_OR }, - { "Blue", OPTION_VAL_BLUE_OR }, + { "White", OPTION_VAL_WHITE_PL }, + { "Red", OPTION_VAL_RED_PL }, + { "Green", OPTION_VAL_GREEN_PL }, + { "Blue", OPTION_VAL_BLUE_PL }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_OR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_OR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_OR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PL, NULL, - "vmu", - { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_OR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_OR }, - { NULL, NULL}, - }, - "disabled", - }, - { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_OR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_OR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_OR, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_OR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_OR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_OR, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PL, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PL, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, + { NULL, NULL }, }, - "disabled" + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_OR, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_OR, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, { NULL, NULL }, }, - "Upper Left", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_OR, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_OR }, - { "2x", OPTION_VAL_2_O27_OR }, - { "3x", OPTION_VAL_3X_OR }, - { "4x", OPTION_VAL_4_OR }, - { "5x", OPTION_VAL_5X_OR }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, { NULL, NULL }, }, - "1x", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_OR, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_OR, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_OR, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PL, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PL, NULL, - "vmu", + "expansions", { - { "10%", OPTION_VAL_10_OR }, - { "20%", OPTION_VAL_20_OR }, - { "30%", OPTION_VAL_30_OR }, - { "40%", OPTION_VAL_40_OR }, - { "50%", OPTION_VAL_50_OR }, - { "60%", OPTION_VAL_60_OR }, - { "70%", OPTION_VAL_70_OR }, - { "80%", OPTION_VAL_80_OR }, - { "90%", OPTION_VAL_90_OR }, - { "100%", OPTION_VAL_100_O57_OR }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_PL }, + { "Purupuru", OPTION_VAL_PURUPURU_PL }, + { "None", OPTION_VAL_NONE_PL }, + { NULL, NULL }, }, - "100%", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_OR, - NULL, - "", + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PL, NULL, "vmu", { { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_PL }, + { "All VMUs", OPTION_VAL_ALL_VMUS_PL }, + { NULL, NULL}, }, "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_OR, - NULL, - "", + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_PL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PL, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_PL, NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "Upper Left", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_OR, - NULL, - "", + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PL, NULL, "vmu", { - { "1x", OPTION_VAL_1X_OR }, - { "2x", OPTION_VAL_2_O27_OR }, - { "3x", OPTION_VAL_3X_OR }, - { "4x", OPTION_VAL_4_OR }, - { "5x", OPTION_VAL_5X_OR }, - { NULL, NULL }, + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "1x", + "disabled" }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_OR, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_OR }, - { "20%", OPTION_VAL_20_OR }, - { "30%", OPTION_VAL_30_OR }, - { "40%", OPTION_VAL_40_OR }, - { "50%", OPTION_VAL_50_OR }, - { "60%", OPTION_VAL_60_OR }, - { "70%", OPTION_VAL_70_OR }, - { "80%", OPTION_VAL_80_OR }, - { "90%", OPTION_VAL_90_OR }, - { "100%", OPTION_VAL_100_O57_OR }, - { NULL, NULL }, + { "1x", OPTION_VAL_1X_PL }, + { "2x", OPTION_VAL_2_O26_PL }, + { "3x", OPTION_VAL_3X_PL }, + { "4x", OPTION_VAL_4_PL }, + { "5x", OPTION_VAL_5X_PL }, + { NULL, NULL }, }, - "100%", + "1x", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_OR, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PL, NULL, "", NULL, "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, { NULL, NULL }, }, - "disabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_OR, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, { NULL, NULL }, }, - "Upper Left", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_OR, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_OR }, - { "2x", OPTION_VAL_2_O27_OR }, - { "3x", OPTION_VAL_3X_OR }, - { "4x", OPTION_VAL_4_OR }, - { "5x", OPTION_VAL_5X_OR }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_PL }, + { "20%", OPTION_VAL_20_PL }, + { "30%", OPTION_VAL_30_PL }, + { "40%", OPTION_VAL_40_PL }, + { "50%", OPTION_VAL_50_PL }, + { "60%", OPTION_VAL_60_PL }, + { "70%", OPTION_VAL_70_PL }, + { "80%", OPTION_VAL_80_PL }, + { "90%", OPTION_VAL_90_PL }, + { "100%", OPTION_VAL_100_O45_PL }, + { NULL, NULL }, }, - "1x", + "100%", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "disabled", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_OR, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_OR }, - { "20%", OPTION_VAL_20_OR }, - { "30%", OPTION_VAL_30_OR }, - { "40%", OPTION_VAL_40_OR }, - { "50%", OPTION_VAL_50_OR }, - { "60%", OPTION_VAL_60_OR }, - { "70%", OPTION_VAL_70_OR }, - { "80%", OPTION_VAL_80_OR }, - { "90%", OPTION_VAL_90_OR }, - { "100%", OPTION_VAL_100_O57_OR }, - { NULL, NULL }, + { "1x", OPTION_VAL_1X_PL }, + { "2x", OPTION_VAL_2_O26_PL }, + { "3x", OPTION_VAL_3X_PL }, + { "4x", OPTION_VAL_4_PL }, + { "5x", OPTION_VAL_5X_PL }, + { NULL, NULL }, }, - "100%", + "1x", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_OR, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PL, NULL, "", NULL, "vmu", { - { "disabled", NULL }, - { "enabled", NULL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, { NULL, NULL }, }, - "disabled", + "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_OR, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PL, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_OR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_OR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_OR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_OR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, { NULL, NULL }, }, - "Upper Left", + "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_OR, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PL, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_OR }, - { "2x", OPTION_VAL_2_O27_OR }, - { "3x", OPTION_VAL_3X_OR }, - { "4x", OPTION_VAL_4_OR }, - { "5x", OPTION_VAL_5X_OR }, - { NULL, NULL }, + { "10%", OPTION_VAL_10_PL }, + { "20%", OPTION_VAL_20_PL }, + { "30%", OPTION_VAL_30_PL }, + { "40%", OPTION_VAL_40_PL }, + { "50%", OPTION_VAL_50_PL }, + { "60%", OPTION_VAL_60_PL }, + { "70%", OPTION_VAL_70_PL }, + { "80%", OPTION_VAL_80_PL }, + { "90%", OPTION_VAL_90_PL }, + { "100%", OPTION_VAL_100_O45_PL }, + { NULL, NULL }, }, - "1x", + "100%", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "disabled", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_OR, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PL, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_OR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_OR }, - { "BLACK 02", OPTION_VAL_BLACK_02_OR }, - { "BLUE 03", OPTION_VAL_BLUE_OR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_OR }, - { "GREEN 05", OPTION_VAL_GREEN_OR }, - { "CYAN 06", OPTION_VAL_CYAN_06_OR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_OR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_OR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_OR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_OR }, - { "RED 11", OPTION_VAL_RED_OR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_OR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_OR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_OR }, - { "GRAY 15", OPTION_VAL_GRAY_15_OR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_OR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_OR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_OR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_OR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_OR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_OR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_OR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_OR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_OR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_OR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_OR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_OR }, - { "WHITE 28", OPTION_VAL_WHITE_OR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_OR, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PL, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_OR }, - { "20%", OPTION_VAL_20_OR }, - { "30%", OPTION_VAL_30_OR }, - { "40%", OPTION_VAL_40_OR }, - { "50%", OPTION_VAL_50_OR }, - { "60%", OPTION_VAL_60_OR }, - { "70%", OPTION_VAL_70_OR }, - { "80%", OPTION_VAL_80_OR }, - { "90%", OPTION_VAL_90_OR }, - { "100%", OPTION_VAL_100_O57_OR }, - { NULL, NULL }, + { "1x", OPTION_VAL_1X_PL }, + { "2x", OPTION_VAL_2_O26_PL }, + { "3x", OPTION_VAL_3X_PL }, + { "4x", OPTION_VAL_4_PL }, + { "5x", OPTION_VAL_5X_PL }, + { NULL, NULL }, }, - "100%", + "1x", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_or = { - option_cats_or, - option_defs_or -}; - -/* RETRO_LANGUAGE_PL */ - -#define CATEGORY_SYSTEM_LABEL_PL NULL -#define CATEGORY_SYSTEM_INFO_0_PL "Skonfiguruj ustawienia regionu, języka, BIOS i podstawowego sprzętu." -#define CATEGORY_VIDEO_LABEL_PL "Wideo" -#define CATEGORY_VIDEO_INFO_0_PL NULL -#define CATEGORY_PERFORMANCE_LABEL_PL "Wydajność" -#define CATEGORY_PERFORMANCE_INFO_0_PL NULL -#define CATEGORY_HACKS_LABEL_PL "Hacki emulacyjne" -#define CATEGORY_HACKS_INFO_0_PL NULL -#define CATEGORY_INPUT_LABEL_PL "Wejście" -#define CATEGORY_INPUT_INFO_0_PL NULL -#define CATEGORY_VMU_LABEL_PL "Jednostka pamięci wizualnej" -#define CATEGORY_VMU_INFO_0_PL NULL -#define CORE_OPTION_NAME_REGION_LABEL_PL NULL -#define OPTION_VAL_JAPAN_PL NULL -#define OPTION_VAL_USA_PL NULL -#define OPTION_VAL_EUROPE_PL NULL -#define OPTION_VAL_DEFAULT_PL "Domyślny" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_PL "Język" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PL "Zmienia język używany przez BIOS i przez gry zawierające wiele języków." -#define OPTION_VAL_JAPANESE_PL "japoński" -#define OPTION_VAL_ENGLISH_PL "angielski" -#define OPTION_VAL_GERMAN_PL "niemiecki" -#define OPTION_VAL_FRENCH_PL "francuski" -#define OPTION_VAL_SPANISH_PL "hiszpański" -#define OPTION_VAL_ITALIAN_PL "włoski" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PL "HLE BIOS (wymagany restart)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PL NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PL NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_PL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PL NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PL NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PL "Ustaw gry NAOMI jako Free Play" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PL NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PL "Emulacja adaptera szerokopasmowego" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PL NULL -#define CORE_OPTION_NAME_UPNP_LABEL_PL "Włącz UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_PL "Użyj UPnP, aby automatycznie skonfigurować router internetowy dla gier online." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PL "Rozdzielczość wewnętrzna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PL NULL -#define OPTION_VAL_320X240_PL NULL -#define OPTION_VAL_640X480_PL NULL -#define OPTION_VAL_800X600_PL NULL -#define OPTION_VAL_960X720_PL NULL -#define OPTION_VAL_1024X768_PL NULL -#define OPTION_VAL_1280X960_PL NULL -#define OPTION_VAL_1440X1080_PL NULL -#define OPTION_VAL_1600X1200_PL NULL -#define OPTION_VAL_1920X1440_PL NULL -#define OPTION_VAL_2560X1920_PL NULL -#define OPTION_VAL_2880X2160_PL NULL -#define OPTION_VAL_3200X2400_PL NULL -#define OPTION_VAL_3840X2880_PL NULL -#define OPTION_VAL_4480X3360_PL NULL -#define OPTION_VAL_5120X3840_PL NULL -#define OPTION_VAL_5760X4320_PL NULL -#define OPTION_VAL_6400X4800_PL NULL -#define OPTION_VAL_7040X5280_PL NULL -#define OPTION_VAL_7680X5760_PL NULL -#define OPTION_VAL_8320X6240_PL NULL -#define OPTION_VAL_8960X6720_PL NULL -#define OPTION_VAL_9600X7200_PL NULL -#define OPTION_VAL_10240X7680_PL NULL -#define OPTION_VAL_10880X8160_PL NULL -#define OPTION_VAL_11520X8640_PL NULL -#define OPTION_VAL_12160X9120_PL NULL -#define OPTION_VAL_12800X9600_PL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PL NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PL NULL -#define OPTION_VAL_VGA_PL NULL -#define OPTION_VAL_TV_RGB_PL NULL -#define OPTION_VAL_TV_COMPOSITE_PL NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_PL NULL -#define OPTION_VAL_NTSC_PL NULL -#define OPTION_VAL_PAL_PL NULL -#define OPTION_VAL_PAL_N_PL NULL -#define OPTION_VAL_PAL_M_PL NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PL "Orientacja ekranu" -#define OPTION_VAL_HORIZONTAL_PL NULL -#define OPTION_VAL_VERTICAL_PL NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PL NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PL NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_PL NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_PL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PL NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PL NULL -#define OPTION_VAL_512MB_PL NULL -#define OPTION_VAL_1GB_PL NULL -#define OPTION_VAL_2GB_PL NULL -#define OPTION_VAL_4GB_PL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PL NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PL NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PL "Emulacja pełnego bufora ramki" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PL NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PL NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PL NULL -#define CORE_OPTION_NAME_FOG_LABEL_PL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PL NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PL NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PL NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PL "Filtrowanie tekstur" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PL NULL -#define OPTION_VAL_1_PL NULL -#define OPTION_VAL_2_PL "Wymuś liniowy" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PL NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PL NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PL "Wykrywanie zmian częstotliwości klatek" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PL NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PL NULL -#define OPTION_VAL_2_O27_PL NULL -#define OPTION_VAL_4_PL NULL -#define OPTION_VAL_6_PL NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PL NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PL NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PL NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PL NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PL NULL -#define OPTION_VAL_SOME_PL "Normalny" -#define OPTION_VAL_MORE_PL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PL NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PL NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PL NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PL NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PL NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PL NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PL "Zmień główny zegar procesora SH4 z domyślnego 200 MHz. Odzwierciedlanie może pomóc spowolnić platformy. Przełączanie może zwiększyć szybkość klatek dla niektórych gier. Używaj ostrożnie." -#define OPTION_VAL_100_PL NULL -#define OPTION_VAL_110_PL NULL -#define OPTION_VAL_120_PL NULL -#define OPTION_VAL_130_PL NULL -#define OPTION_VAL_140_PL NULL -#define OPTION_VAL_150_PL NULL -#define OPTION_VAL_160_PL NULL -#define OPTION_VAL_170_PL NULL -#define OPTION_VAL_180_PL NULL -#define OPTION_VAL_190_PL NULL -#define OPTION_VAL_200_PL NULL -#define OPTION_VAL_210_PL NULL -#define OPTION_VAL_220_PL NULL -#define OPTION_VAL_230_PL NULL -#define OPTION_VAL_240_PL NULL -#define OPTION_VAL_250_PL NULL -#define OPTION_VAL_260_PL NULL -#define OPTION_VAL_270_PL NULL -#define OPTION_VAL_280_PL NULL -#define OPTION_VAL_290_PL NULL -#define OPTION_VAL_300_PL NULL -#define OPTION_VAL_310_PL NULL -#define OPTION_VAL_320_PL NULL -#define OPTION_VAL_330_PL NULL -#define OPTION_VAL_340_PL NULL -#define OPTION_VAL_350_PL NULL -#define OPTION_VAL_360_PL NULL -#define OPTION_VAL_370_PL NULL -#define OPTION_VAL_380_PL NULL -#define OPTION_VAL_390_PL NULL -#define OPTION_VAL_400_PL NULL -#define OPTION_VAL_410_PL NULL -#define OPTION_VAL_420_PL NULL -#define OPTION_VAL_430_PL NULL -#define OPTION_VAL_440_PL NULL -#define OPTION_VAL_450_PL NULL -#define OPTION_VAL_460_PL NULL -#define OPTION_VAL_470_PL NULL -#define OPTION_VAL_480_PL NULL -#define OPTION_VAL_490_PL NULL -#define OPTION_VAL_500_PL NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PL NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PL NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PL NULL -#define OPTION_VAL_0_PL NULL -#define OPTION_VAL_5_PL NULL -#define OPTION_VAL_10_PL NULL -#define OPTION_VAL_15_PL NULL -#define OPTION_VAL_20_PL NULL -#define OPTION_VAL_25_PL NULL -#define OPTION_VAL_30_PL "30 %" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PL NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PL NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PL NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PL NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PL NULL -#define OPTION_VAL_WHITE_PL NULL -#define OPTION_VAL_RED_PL "Czerwony" -#define OPTION_VAL_GREEN_PL "Zielony" -#define OPTION_VAL_BLUE_PL "Niebieski" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PL NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PL NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PL NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PL NULL -#define OPTION_VAL_VMU_A1_PL NULL -#define OPTION_VAL_ALL_VMUS_PL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PL "Dźwięki VMU" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PL "Po włączeniu dźwięk VMU jest odtwarzany." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PL NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PL NULL -#define OPTION_VAL_UPPER_LEFT_PL NULL -#define OPTION_VAL_UPPER_RIGHT_PL NULL -#define OPTION_VAL_LOWER_LEFT_PL NULL -#define OPTION_VAL_LOWER_RIGHT_PL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PL NULL -#define OPTION_VAL_1X_PL NULL -#define OPTION_VAL_3X_PL NULL -#define OPTION_VAL_5X_PL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PL NULL -#define OPTION_VAL_DEFAULT_ON_00_PL NULL -#define OPTION_VAL_DEFAULT_OFF_01_PL NULL -#define OPTION_VAL_BLACK_02_PL NULL -#define OPTION_VAL_LIGHT_BLUE_04_PL NULL -#define OPTION_VAL_CYAN_06_PL NULL -#define OPTION_VAL_CYAN_BLUE_07_PL NULL -#define OPTION_VAL_LIGHT_GREEN_08_PL NULL -#define OPTION_VAL_CYAN_GREEN_09_PL NULL -#define OPTION_VAL_LIGHT_CYAN_10_PL NULL -#define OPTION_VAL_PURPLE_12_PL NULL -#define OPTION_VAL_LIGHT_PURPLE_13_PL NULL -#define OPTION_VAL_YELLOW_14_PL "Żółty" -#define OPTION_VAL_GRAY_15_PL NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_PL NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_PL NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_PL NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_PL NULL -#define OPTION_VAL_LIGHT_RED_2_20_PL NULL -#define OPTION_VAL_MAGENTA_21_PL NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_PL NULL -#define OPTION_VAL_LIGHT_ORANGE_23_PL NULL -#define OPTION_VAL_ORANGE_24_PL NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_PL NULL -#define OPTION_VAL_LIGHT_YELLOW_26_PL NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_PL NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PL NULL -#define OPTION_VAL_40_PL NULL -#define OPTION_VAL_50_PL "50 %" -#define OPTION_VAL_60_PL "60 %" -#define OPTION_VAL_70_PL NULL -#define OPTION_VAL_80_PL "80 %" -#define OPTION_VAL_90_PL NULL -#define OPTION_VAL_100_O57_PL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PL NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PL NULL + { + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_PL }, + { "20%", OPTION_VAL_20_PL }, + { "30%", OPTION_VAL_30_PL }, + { "40%", OPTION_VAL_40_PL }, + { "50%", OPTION_VAL_50_PL }, + { "60%", OPTION_VAL_60_PL }, + { "70%", OPTION_VAL_70_PL }, + { "80%", OPTION_VAL_80_PL }, + { "90%", OPTION_VAL_90_PL }, + { "100%", OPTION_VAL_100_O45_PL }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, + { NULL, NULL }, + }, + "Lower Right", + }, + { + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_PL }, + { "2x", OPTION_VAL_2_O26_PL }, + { "3x", OPTION_VAL_3X_PL }, + { "4x", OPTION_VAL_4_PL }, + { "5x", OPTION_VAL_5X_PL }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, + { "BLACK 02", OPTION_VAL_BLACK_02_PL }, + { "BLUE 03", OPTION_VAL_BLUE_PL }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, + { "GREEN 05", OPTION_VAL_GREEN_PL }, + { "CYAN 06", OPTION_VAL_CYAN_06_PL }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, + { "RED 11", OPTION_VAL_RED_PL }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, + { "GRAY 15", OPTION_VAL_GRAY_15_PL }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, + { "WHITE 28", OPTION_VAL_WHITE_PL }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PL, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_PL }, + { "20%", OPTION_VAL_20_PL }, + { "30%", OPTION_VAL_30_PL }, + { "40%", OPTION_VAL_40_PL }, + { "50%", OPTION_VAL_50_PL }, + { "60%", OPTION_VAL_60_PL }, + { "70%", OPTION_VAL_70_PL }, + { "80%", OPTION_VAL_80_PL }, + { "90%", OPTION_VAL_90_PL }, + { "100%", OPTION_VAL_100_O45_PL }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_pl = { + option_cats_pl, + option_defs_pl +}; -struct retro_core_option_v2_category option_cats_pl[] = { +/* RETRO_LANGUAGE_PT_BR */ + +#define CATEGORY_SYSTEM_LABEL_PT_BR "Sistema" +#define CATEGORY_SYSTEM_INFO_0_PT_BR "Altera as configurações de hardware básicas, região, idioma e BIOS." +#define CATEGORY_VIDEO_LABEL_PT_BR "Vídeo" +#define CATEGORY_VIDEO_INFO_0_PT_BR "Altera as configurações de resolução, transparência e efeitos visuais." +#define CATEGORY_PERFORMANCE_LABEL_PT_BR "Desempenho" +#define CATEGORY_PERFORMANCE_INFO_0_PT_BR "Altera as configurações de renderização multithread e pulo de quadro." +#define CATEGORY_HACKS_LABEL_PT_BR "Hacks de emulação" +#define CATEGORY_HACKS_INFO_0_PT_BR "Altera as configurações de tela panorâmica, velocidade de carregamento do GD-ROM e substituição de textura." +#define CATEGORY_INPUT_LABEL_PT_BR "Entrada" +#define CATEGORY_INPUT_INFO_0_PT_BR "Altera as configurações de controle e pistola de luz." +#define CATEGORY_EXPANSIONS_LABEL_PT_BR "Encaixe de expansão dos controles" +#define CATEGORY_EXPANSIONS_INFO_0_PT_BR "Define o dispositivo (VMU ou Aparelho de Vibração) conectado em cada encaixe de expansão do controle." +#define CATEGORY_VMU_LABEL_PT_BR "Unidade de Memória Visual (VMU)" +#define CATEGORY_VMU_INFO_0_PT_BR "Altera as configurações de salvamento do VMU e aparência do VMU na tela." +#define CORE_OPTION_NAME_REGION_LABEL_PT_BR "Região" +#define OPTION_VAL_JAPAN_PT_BR "Japão" +#define OPTION_VAL_USA_PT_BR "EUA" +#define OPTION_VAL_EUROPE_PT_BR "Europa" +#define OPTION_VAL_DEFAULT_PT_BR "Padrão" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_PT_BR "Idioma" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_BR "Altera o idioma usado pelo BIOS e por quaisquer jogos com múltiplos idiomas." +#define OPTION_VAL_JAPANESE_PT_BR "Japonês" +#define OPTION_VAL_ENGLISH_PT_BR "Inglês" +#define OPTION_VAL_GERMAN_PT_BR "Alemão" +#define OPTION_VAL_FRENCH_PT_BR "Francês" +#define OPTION_VAL_SPANISH_PT_BR "Espanhol" +#define OPTION_VAL_ITALIAN_PT_BR "Italiano" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_BR "BIOS HLE (requer reinício)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_BR "Força o uso de um BIOS de emulação de alto nível (HLE)." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_BR "Acessar BIOS ao inicializar (requer reinício)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_BR "Inicializa diretamente no menu de BIOS do Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_BR "Ativar DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_BR "Ativa a emulação do DSP (processador de sinal digital) de áudio do Dreamcast. Otimizar a precisão do som gerado, mas aumenta os requisitos de desempenho." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_BR "Permitir botão Assistência do fliperama" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_BR "Habilita o botão ASSISTÊNCIA em jogos de fliperama, para entrar nas configurações." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_BR "Definir jogos NAOMI como gratuitos" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_BR "Define as configurações de moeda do jogo como gratuitas." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_BR "Emulação do Broadband Adapter" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_BR "Emula o Broadband Adapter por Ethernet, em vez do Modem.\nOBSERVAÇÃO: requer reinício." +#define CORE_OPTION_NAME_UPNP_LABEL_PT_BR "Ativar UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_PT_BR "Usa o UPnP para configurar automaticamente seu roteador de Internet para jogos on-line." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_BR "Resolução interna" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_BR "Define a resolução de renderização." +#define OPTION_VAL_320X240_PT_BR "320x240 (50%)" +#define OPTION_VAL_640X480_PT_BR "640x480 (nativa)" +#define OPTION_VAL_800X600_PT_BR "800x600 (125%)" +#define OPTION_VAL_960X720_PT_BR "960x720 (150%)" +#define OPTION_VAL_1024X768_PT_BR "1024x768 (160%)" +#define OPTION_VAL_1280X960_PT_BR "1280x960 (200%)" +#define OPTION_VAL_1440X1080_PT_BR "1440x1080 (225%)" +#define OPTION_VAL_1600X1200_PT_BR "1600x1200 (250%)" +#define OPTION_VAL_1920X1440_PT_BR "1920x1440 (300%)" +#define OPTION_VAL_2560X1920_PT_BR "2560x1920 (400%)" +#define OPTION_VAL_2880X2160_PT_BR "2880x2160 (450%)" +#define OPTION_VAL_3200X2400_PT_BR "3200x2400 (500%)" +#define OPTION_VAL_3840X2880_PT_BR "3840x2880 (600%)" +#define OPTION_VAL_4480X3360_PT_BR "4480x3360 (700%)" +#define OPTION_VAL_5120X3840_PT_BR "5120x3840 (800%)" +#define OPTION_VAL_5760X4320_PT_BR "5760x4320 (900%)" +#define OPTION_VAL_6400X4800_PT_BR "6400x4800 (1000%)" +#define OPTION_VAL_7040X5280_PT_BR "7040x5280 (1100%)" +#define OPTION_VAL_7680X5760_PT_BR "7680x5760 (1200%)" +#define OPTION_VAL_8320X6240_PT_BR "8320x6240 (1300%)" +#define OPTION_VAL_8960X6720_PT_BR "8960x6720 (1400%)" +#define OPTION_VAL_9600X7200_PT_BR "9600x7200 (1500%)" +#define OPTION_VAL_10240X7680_PT_BR "10240x7680 (1600%)" +#define OPTION_VAL_10880X8160_PT_BR "10880x8160 (1700%)" +#define OPTION_VAL_11520X8640_PT_BR "11520x8640 (1800%)" +#define OPTION_VAL_12160X9120_PT_BR "12160x9120 (1900%)" +#define OPTION_VAL_12800X9600_PT_BR "12800x9600 (2000%)" +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_BR "Cabo" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_BR "Define o sinal de saída.\n\"TV (composto)\": é o mais recomendando por ter mais suporte." +#define OPTION_VAL_VGA_PT_BR NULL +#define OPTION_VAL_TV_RGB_PT_BR NULL +#define OPTION_VAL_TV_COMPOSITE_PT_BR "TV (composto)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_PT_BR "Sistema de transmissão" +#define OPTION_VAL_NTSC_PT_BR NULL +#define OPTION_VAL_PAL_PT_BR "PAL" +#define OPTION_VAL_PAL_N_PT_BR "PAL-N (Argentina, Paraguai e Uruguai)" +#define OPTION_VAL_PAL_M_PT_BR "PAL-M (Brasil)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_BR "Orientação de tela" +#define OPTION_VAL_HORIZONTAL_PT_BR NULL +#define OPTION_VAL_VERTICAL_PT_BR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_BR "Separador de Alfa" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PT_BR "Define como os polígonos de transparência são separados." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_BR "Faixa (rapidez)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_PT_BR "Triângulo (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_PT_BR "Píxel (precisão)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_BR "Memória intermédia da acumulação de píxel" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_BR "Valores maiores podem ser necessários em resoluções maiores." +#define OPTION_VAL_512MB_PT_BR "512 MB" +#define OPTION_VAL_1GB_PT_BR "1 GB" +#define OPTION_VAL_2GB_PT_BR "2 GB" +#define OPTION_VAL_4GB_PT_BR "4 GB" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_BR "Máximo de camadas transparentes" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_BR "Valores maiores podem se necessários em cenários complexos." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_BR "Emulação completa de framebuffer" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_BR "Ativa a emulação completa de framebuffer na VRAM. É útil em jogos que leem ou gravam o framebuffer na VRAM.\nOBSERVAÇÃO: a resolução interna é forçada à 640x480 e o desempenho pode ser gravemente afetado." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_BR "Ativar memória intermédia RTT (renderização para texturas)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_BR "Copia as texturas renderizadas da GPU de volta para a VRAM. É normalmente ativada em jogos que necessitam dessa opção.\nOBSERVAÇÃO: a mudança de escala (upscaling) da renderização de textura é desativada e o desempenho pode ser afetado." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_BR "Piramidar (mipmapping)" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_PT_BR "As texturas usam uma versão menor delas mesmas, ao aparecer mais de longe, pode aumentar o desempenho e reduzir a tremeluzência." +#define CORE_OPTION_NAME_FOG_LABEL_PT_BR "Efeito de nevoeiro" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_BR "Modificador de volume" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_BR "Um recurso da GPU do Dreamcast que é normalmente usado para sombrar objetos e tem pouco efeito sobre o desempenho." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_BR "Filtro anisotrópico" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_BR "Otimiza a qualidade de texturas em superfícies, que estão em ângulos de visão oblíquos em relação à câmera. Valores maiores exigem mais da GPU.\nOBSERVAÇÃO: requer reinício." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_BR "Filtragem de textura" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_BR "Define a filtragem de textura. Pode ser usada para forçar uma filtragem de textura em todas as texturas, para obter uma aparência mais nítida.\nOBSERVAÇÃO: requer reinício e pode causar vários erros de renderização." +#define OPTION_VAL_1_PT_BR "Forçar adjacentes" +#define OPTION_VAL_2_PT_BR "Forçar linear" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_BR "Atrasar troca de quadro" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_BR "Útil para evitar telas intermitentes ou defeitos de vídeo.\nOBSERVAÇÃO: não é recomendado em plataformas lentas." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_BR "Detectar alterações da taxa de quadros" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_BR "Notifica quando a taxa de quadros interna é alterada (por ex.: de 60 qps para 30 qps). Otimiza a frequência de quadros em jogos travados a 30 qps ou 20 qps, mas não deve ser habilitado em jogos com taxa de quadros instável (por ex.: Ecco the Dolphin, Unreal Tournament etc.).\nOBSERVAÇÃO: requer \"Pulo de quadro automático\" desativado." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_BR "Filtro de pós-processamento (PowerVR2)" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_BR "Processa a imagem renderizada para simular efeitos específicos da GPU PowerVR2 e sinais de vídeo analógicos." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_BR "Mudar escala de textura (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_BR "Realça os gráficos 2D de arte píxel feitos à mão.\nOBSERVAÇÃO: usar apenas em jogos 2D pixelado." +#define OPTION_VAL_2_O26_PT_BR "200%" +#define OPTION_VAL_4_PT_BR "400%" +#define OPTION_VAL_6_PT_BR "600%" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_BR "Tamanho máximo das texturas" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PT_BR "Define o tamanho máximo que uma textura ser aumentada, se o tamanho da textura for maior que o valor definido, enquanto não será aumentada." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_BR "Interpolação nativa de profundidade" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_BR "Ajuda com corrupção de textura e problemas de profundidade em GPU da AMD. Pode ajudar em GPU da Intel em alguns casos." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PT_BR "Corrigir vazamento de arestas" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PT_BR "Ajuda com vazamento de textura ao mudar escala. Desativar pode ajudar se os píxeis são deformados pela mudança de escala em jogos 2D (MVC2, CVS, KOF etc.)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_BR "Renderização multithread" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_BR "Executa a GPU e a CPU em diferentes threads. Altamente recomendado." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_BR "Pulo de quadro automático" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_BR "Pula quadros automaticamente quando o emulador está lento.\nOBSERVAÇÃO: requer \"Renderização multithread\" ativada." +#define OPTION_VAL_SOME_PT_BR NULL +#define OPTION_VAL_MORE_PT_BR "Máximo" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_BR "Pulo de quadros" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_BR "Define o número de quadros a serem pulados entre cada quadro exibido." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_BR "Trapaça panorâmica (requer reinício)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_BR "Permite uma projeção panorâmica (widescreen) em alguns jogos." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_BR "Hack panorâmico" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_BR "Desenha a geometria além da proporção de tela normal de 4:3.\nOBSERVAÇÃO: pode causar falhas gráficas." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_BR "Carregamento rápido do GD-ROM (impreciso)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_BR "Acelera o carregamento do GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PT_BR "Modificação de 32 MB de RAM" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PT_BR "Ativa uma modificação de 32 MB de RAM para o Dreamcast.\nOBSERVAÇÃO: pode afetar compatibilidade." +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_BR "Velocidade da CPU SH-4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_BR "Altera a velocidade padrão (200 MHz) da CPU SH-4. Reduzir a velocidade pode ajudar em plataformas lentas. Aumentar a velocidade pode aumentar a taxa de quadros em alguns jogos.\nOBSERVAÇÃO: cuidado." +#define OPTION_VAL_100_PT_BR NULL +#define OPTION_VAL_110_PT_BR NULL +#define OPTION_VAL_120_PT_BR NULL +#define OPTION_VAL_130_PT_BR NULL +#define OPTION_VAL_140_PT_BR NULL +#define OPTION_VAL_150_PT_BR NULL +#define OPTION_VAL_160_PT_BR NULL +#define OPTION_VAL_170_PT_BR NULL +#define OPTION_VAL_180_PT_BR NULL +#define OPTION_VAL_190_PT_BR NULL +#define OPTION_VAL_200_PT_BR NULL +#define OPTION_VAL_210_PT_BR NULL +#define OPTION_VAL_220_PT_BR NULL +#define OPTION_VAL_230_PT_BR NULL +#define OPTION_VAL_240_PT_BR NULL +#define OPTION_VAL_250_PT_BR NULL +#define OPTION_VAL_260_PT_BR NULL +#define OPTION_VAL_270_PT_BR NULL +#define OPTION_VAL_280_PT_BR NULL +#define OPTION_VAL_290_PT_BR NULL +#define OPTION_VAL_300_PT_BR NULL +#define OPTION_VAL_310_PT_BR NULL +#define OPTION_VAL_320_PT_BR NULL +#define OPTION_VAL_330_PT_BR NULL +#define OPTION_VAL_340_PT_BR NULL +#define OPTION_VAL_350_PT_BR NULL +#define OPTION_VAL_360_PT_BR NULL +#define OPTION_VAL_370_PT_BR NULL +#define OPTION_VAL_380_PT_BR NULL +#define OPTION_VAL_390_PT_BR NULL +#define OPTION_VAL_400_PT_BR NULL +#define OPTION_VAL_410_PT_BR NULL +#define OPTION_VAL_420_PT_BR NULL +#define OPTION_VAL_430_PT_BR NULL +#define OPTION_VAL_440_PT_BR NULL +#define OPTION_VAL_450_PT_BR NULL +#define OPTION_VAL_460_PT_BR NULL +#define OPTION_VAL_470_PT_BR NULL +#define OPTION_VAL_480_PT_BR NULL +#define OPTION_VAL_490_PT_BR NULL +#define OPTION_VAL_500_PT_BR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_BR "Carregar texturas personalizadas" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PT_BR "Carrega as texturas personalizadas.\nEndereço da pasta: \"system/dc/textures//\"." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_BR "Descarregar texturas" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PT_BR "Toda vez que uma nova textura for usada pelo jogo, a textura será salva como um .PNG na pasta \"system/dc/texdump//\"." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_BR "Zona morta do direcional analógico" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PT_BR "Define a distância mínima do direcional analógico para ser ativado." +#define OPTION_VAL_0_PT_BR NULL +#define OPTION_VAL_5_PT_BR NULL +#define OPTION_VAL_10_PT_BR NULL +#define OPTION_VAL_15_PT_BR NULL +#define OPTION_VAL_20_PT_BR NULL +#define OPTION_VAL_25_PT_BR NULL +#define OPTION_VAL_30_PT_BR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_BR "Zona morta dos gatilhos" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PT_BR "Define a distância mínima do gatilho para ser ativado." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_BR "Gatilhos digitais" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PT_BR "Os gatilhos digitais agem igual os botões comuns, então serão processados como totalmente pressionados ou não pressionados, sem meio-termo." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_BR "Transmitir saídas digitais" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_BR "Transmite saídas digitais e estado da resposta de força (force-feedback) na porta TCP 8000. Compatível com a configuração MAME \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_BR "Mostrar configurações da pistola de luz" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_BR "Ativa as configurações de mira na tela.\nOBSERVAÇÃO: requer reinício do menu rápido." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PT_BR "Tamanho da mira" +#define OPTION_VAL_50_PT_BR NULL +#define OPTION_VAL_60_PT_BR NULL +#define OPTION_VAL_70_PT_BR NULL +#define OPTION_VAL_80_PT_BR NULL +#define OPTION_VAL_90_PT_BR NULL +#define OPTION_VAL_100_O45_PT_BR NULL +#define OPTION_VAL_110_O45_PT_BR NULL +#define OPTION_VAL_120_O45_PT_BR NULL +#define OPTION_VAL_130_O45_PT_BR NULL +#define OPTION_VAL_140_O45_PT_BR NULL +#define OPTION_VAL_150_O45_PT_BR NULL +#define OPTION_VAL_160_O45_PT_BR NULL +#define OPTION_VAL_170_O45_PT_BR NULL +#define OPTION_VAL_180_O45_PT_BR NULL +#define OPTION_VAL_190_O45_PT_BR NULL +#define OPTION_VAL_200_O45_PT_BR NULL +#define OPTION_VAL_210_O45_PT_BR NULL +#define OPTION_VAL_220_O45_PT_BR NULL +#define OPTION_VAL_230_O45_PT_BR NULL +#define OPTION_VAL_240_O45_PT_BR NULL +#define OPTION_VAL_250_O45_PT_BR NULL +#define OPTION_VAL_260_O45_PT_BR NULL +#define OPTION_VAL_270_O45_PT_BR NULL +#define OPTION_VAL_280_O45_PT_BR NULL +#define OPTION_VAL_290_O45_PT_BR NULL +#define OPTION_VAL_300_O45_PT_BR NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_BR "Mira da arma 1" +#define OPTION_VAL_WHITE_PT_BR "Branco" +#define OPTION_VAL_RED_PT_BR "Vermelho" +#define OPTION_VAL_GREEN_PT_BR "Verde" +#define OPTION_VAL_BLUE_PT_BR "Azul" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_BR "Mira da arma 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_BR "Mira da arma 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_BR "Mira da arma 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PT_BR "Encaixe A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão A1 (porta A, compartimento 1)." +#define OPTION_VAL_VMU_PT_BR NULL +#define OPTION_VAL_PURUPURU_PT_BR "Aparelho de Vibração" +#define OPTION_VAL_NONE_PT_BR "Nenhum" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PT_BR "Encaixe A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão A2 (porta A, compartimento 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PT_BR "Encaixe B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão B1 (porta B, compartimento 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PT_BR "Encaixe B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão B2 (porta B, compartimento 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PT_BR "Encaixe C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão C1 (porta C, compartimento 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PT_BR "Encaixe C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão C2 (porta C, compartimento 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PT_BR "Encaixe D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão D1 (porta D, compartimento 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PT_BR "Encaixe D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PT_BR "Define o dispositivo conectado no encaixe de expansão D2 (porta D, compartimento 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_BR "VMU por jogo" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_BR "VMU por jogo" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_BR "\"DESLIGADO\": todos os jogos compartilham até 8 arquivos de salvamento (A1/A2/B1/B2/C1/C2/D1/D2), localizados na pasta de sistema do RetroArch.\n\"VMU A1\": cria um único arquivo para todos os jogos.\n\"Todos os VMU\": cria até 8 arquivos (A1/A2/B1/B2/C1/C2/D1/D2) para cada jogo." +#define OPTION_VAL_VMU_A1_PT_BR NULL +#define OPTION_VAL_ALL_VMUS_PT_BR "Todos os VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_BR "Som do VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_BR "Som do VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_BR "Permite reproduzir os bipes do VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_BR "Mostrar configurações de tela do VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_BR "Mostrar configurações de tela do VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_BR "Permite a configuração de visibilidade, tamanho, posição e cor das telas LCD do VMU emulado.\nOBSERVAÇÃO: requer reinício do menu rápido." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_BR "VMU 1 — Tela" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_BR "VMU 1 — Posição da tela" +#define OPTION_VAL_UPPER_LEFT_PT_BR "Canto superior esquerdo" +#define OPTION_VAL_UPPER_RIGHT_PT_BR "Canto superior direito" +#define OPTION_VAL_LOWER_LEFT_PT_BR "Canto inferior esquerdo" +#define OPTION_VAL_LOWER_RIGHT_PT_BR "Canto inferior direito" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_BR "VMU 1 — Tamanho da tela" +#define OPTION_VAL_1X_PT_BR "Padrão (100%)" +#define OPTION_VAL_3X_PT_BR "300%" +#define OPTION_VAL_5X_PT_BR "500%" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_BR "VMU 1 — Cor dos píxeis acesos" +#define OPTION_VAL_DEFAULT_ON_00_PT_BR "Padrão (aceso)" +#define OPTION_VAL_DEFAULT_OFF_01_PT_BR "Padrão (apagado)" +#define OPTION_VAL_BLACK_02_PT_BR "Preto" +#define OPTION_VAL_LIGHT_BLUE_04_PT_BR "Azul claro" +#define OPTION_VAL_CYAN_06_PT_BR "Ciano" +#define OPTION_VAL_CYAN_BLUE_07_PT_BR "Azul ciano" +#define OPTION_VAL_LIGHT_GREEN_08_PT_BR "Verde claro" +#define OPTION_VAL_CYAN_GREEN_09_PT_BR "Verde ciano" +#define OPTION_VAL_LIGHT_CYAN_10_PT_BR "Ciano claro" +#define OPTION_VAL_PURPLE_12_PT_BR "Roxo" +#define OPTION_VAL_LIGHT_PURPLE_13_PT_BR "Roxo claro" +#define OPTION_VAL_YELLOW_14_PT_BR "Amarelo" +#define OPTION_VAL_GRAY_15_PT_BR "Cinza" +#define OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR "Roxo claro (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_PT_BR "Verde claro (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_PT_BR "Verde claro (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_PT_BR "Ciano claro (2)" +#define OPTION_VAL_LIGHT_RED_2_20_PT_BR "Vermelho claro (2)" +#define OPTION_VAL_MAGENTA_21_PT_BR NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR "Roxo claro (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_PT_BR "Laranja claro" +#define OPTION_VAL_ORANGE_24_PT_BR "Laranja" +#define OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR "Roxo claro (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_PT_BR "Amarelo claro" +#define OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR "Amarelo claro (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_BR "VMU 1 — Cor dos píxeis apagados" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_BR "VMU 1 — Opacidade da tela" +#define OPTION_VAL_40_PT_BR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_BR "VMU 2 — Tela" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_BR "VMU 2 — Posição da tela" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_BR "VMU 2 — Tamanho da tela" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_BR "VMU 2 — Cor dos píxeis acesos" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_BR "VMU 2 — Cor dos píxeis apagados" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_BR "VMU 2 — Opacidade da tela" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_BR "VMU 3 — Tela" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_BR "VMU 3 — Posição da tela" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_BR "VMU 3 — Tamanho da tela" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_BR "VMU 3 — Cor dos píxeis acesos" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_BR "VMU 3 — Cor dos píxeis apagados" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_BR "VMU 3 — Opacidade da tela" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_BR "VMU 4 — Tela" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_BR "VMU 4 — Posição da tela" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_BR "VMU 4 — Tamanho da tela" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_BR "VMU 4 — Cor dos píxeis acesos" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_BR "VMU 4 — Cor dos píxeis apagados" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_BR "VMU 4 — Opacidade da tela" + +struct retro_core_option_v2_category option_cats_pt_br[] = { { "system", - CATEGORY_SYSTEM_LABEL_PL, - CATEGORY_SYSTEM_INFO_0_PL + CATEGORY_SYSTEM_LABEL_PT_BR, + CATEGORY_SYSTEM_INFO_0_PT_BR }, { "video", - CATEGORY_VIDEO_LABEL_PL, - CATEGORY_VIDEO_INFO_0_PL + CATEGORY_VIDEO_LABEL_PT_BR, + CATEGORY_VIDEO_INFO_0_PT_BR }, { "performance", - CATEGORY_PERFORMANCE_LABEL_PL, - CATEGORY_PERFORMANCE_INFO_0_PL + CATEGORY_PERFORMANCE_LABEL_PT_BR, + CATEGORY_PERFORMANCE_INFO_0_PT_BR }, { "hacks", - CATEGORY_HACKS_LABEL_PL, - CATEGORY_HACKS_INFO_0_PL + CATEGORY_HACKS_LABEL_PT_BR, + CATEGORY_HACKS_INFO_0_PT_BR }, { "input", - CATEGORY_INPUT_LABEL_PL, - CATEGORY_INPUT_INFO_0_PL + CATEGORY_INPUT_LABEL_PT_BR, + CATEGORY_INPUT_INFO_0_PT_BR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_PT_BR, + CATEGORY_EXPANSIONS_INFO_0_PT_BR }, { "vmu", - CATEGORY_VMU_LABEL_PL, - CATEGORY_VMU_INFO_0_PL + CATEGORY_VMU_LABEL_PT_BR, + CATEGORY_VMU_INFO_0_PT_BR }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_pl[] = { +struct retro_core_option_v2_definition option_defs_pt_br[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_PL, + CORE_OPTION_NAME_REGION_LABEL_PT_BR, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_PL }, - { "USA", OPTION_VAL_USA_PL }, - { "Europe", OPTION_VAL_EUROPE_PL }, - { "Default", OPTION_VAL_DEFAULT_PL }, + { "Japan", OPTION_VAL_JAPAN_PT_BR }, + { "USA", OPTION_VAL_USA_PT_BR }, + { "Europe", OPTION_VAL_EUROPE_PT_BR }, + { "Default", OPTION_VAL_DEFAULT_PT_BR }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_PL, + CORE_OPTION_NAME_LANGUAGE_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_PL, + CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_BR, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_PL }, - { "English", OPTION_VAL_ENGLISH_PL }, - { "German", OPTION_VAL_GERMAN_PL }, - { "French", OPTION_VAL_FRENCH_PL }, - { "Spanish", OPTION_VAL_SPANISH_PL }, - { "Italian", OPTION_VAL_ITALIAN_PL }, - { "Default", OPTION_VAL_DEFAULT_PL }, + { "Japanese", OPTION_VAL_JAPANESE_PT_BR }, + { "English", OPTION_VAL_ENGLISH_PT_BR }, + { "German", OPTION_VAL_GERMAN_PT_BR }, + { "French", OPTION_VAL_FRENCH_PT_BR }, + { "Spanish", OPTION_VAL_SPANISH_PT_BR }, + { "Italian", OPTION_VAL_ITALIAN_PT_BR }, + { "Default", OPTION_VAL_DEFAULT_PT_BR }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_PL, + CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_PL, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_BR, NULL, "system", { @@ -50795,9 +60868,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PL, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PL, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_BR, NULL, "system", { @@ -50809,9 +60882,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_PL, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PL, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_BR, NULL, "system", { @@ -50825,25 +60898,11 @@ struct retro_core_option_v2_definition option_defs_pl[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_PL, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PL, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_BR, NULL, "system", { @@ -50855,9 +60914,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PL, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PL, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_BR, NULL, "system", { @@ -50869,9 +60928,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_PL, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PL, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_BR, NULL, "system", { @@ -50883,9 +60942,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_PL, + CORE_OPTION_NAME_UPNP_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_PL, + CORE_OPTION_NAME_UPNP_INFO_0_PT_BR, NULL, "system", { @@ -50898,39 +60957,39 @@ struct retro_core_option_v2_definition option_defs_pl[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_BR, NULL, "video", { - { "320x240", OPTION_VAL_320X240_PL }, - { "640x480", OPTION_VAL_640X480_PL }, - { "800x600", OPTION_VAL_800X600_PL }, - { "960x720", OPTION_VAL_960X720_PL }, - { "1024x768", OPTION_VAL_1024X768_PL }, - { "1280x960", OPTION_VAL_1280X960_PL }, - { "1440x1080", OPTION_VAL_1440X1080_PL }, - { "1600x1200", OPTION_VAL_1600X1200_PL }, - { "1920x1440", OPTION_VAL_1920X1440_PL }, - { "2560x1920", OPTION_VAL_2560X1920_PL }, - { "2880x2160", OPTION_VAL_2880X2160_PL }, - { "3200x2400", OPTION_VAL_3200X2400_PL }, - { "3840x2880", OPTION_VAL_3840X2880_PL }, - { "4480x3360", OPTION_VAL_4480X3360_PL }, - { "5120x3840", OPTION_VAL_5120X3840_PL }, - { "5760x4320", OPTION_VAL_5760X4320_PL }, - { "6400x4800", OPTION_VAL_6400X4800_PL }, - { "7040x5280", OPTION_VAL_7040X5280_PL }, - { "7680x5760", OPTION_VAL_7680X5760_PL }, - { "8320x6240", OPTION_VAL_8320X6240_PL }, - { "8960x6720", OPTION_VAL_8960X6720_PL }, - { "9600x7200", OPTION_VAL_9600X7200_PL }, - { "10240x7680", OPTION_VAL_10240X7680_PL }, - { "10880x8160", OPTION_VAL_10880X8160_PL }, - { "11520x8640", OPTION_VAL_11520X8640_PL }, - { "12160x9120", OPTION_VAL_12160X9120_PL }, - { "12800x9600", OPTION_VAL_12800X9600_PL }, + { "320x240", OPTION_VAL_320X240_PT_BR }, + { "640x480", OPTION_VAL_640X480_PT_BR }, + { "800x600", OPTION_VAL_800X600_PT_BR }, + { "960x720", OPTION_VAL_960X720_PT_BR }, + { "1024x768", OPTION_VAL_1024X768_PT_BR }, + { "1280x960", OPTION_VAL_1280X960_PT_BR }, + { "1440x1080", OPTION_VAL_1440X1080_PT_BR }, + { "1600x1200", OPTION_VAL_1600X1200_PT_BR }, + { "1920x1440", OPTION_VAL_1920X1440_PT_BR }, + { "2560x1920", OPTION_VAL_2560X1920_PT_BR }, + { "2880x2160", OPTION_VAL_2880X2160_PT_BR }, + { "3200x2400", OPTION_VAL_3200X2400_PT_BR }, + { "3840x2880", OPTION_VAL_3840X2880_PT_BR }, + { "4480x3360", OPTION_VAL_4480X3360_PT_BR }, + { "5120x3840", OPTION_VAL_5120X3840_PT_BR }, + { "5760x4320", OPTION_VAL_5760X4320_PT_BR }, + { "6400x4800", OPTION_VAL_6400X4800_PT_BR }, + { "7040x5280", OPTION_VAL_7040X5280_PT_BR }, + { "7680x5760", OPTION_VAL_7680X5760_PT_BR }, + { "8320x6240", OPTION_VAL_8320X6240_PT_BR }, + { "8960x6720", OPTION_VAL_8960X6720_PT_BR }, + { "9600x7200", OPTION_VAL_9600X7200_PT_BR }, + { "10240x7680", OPTION_VAL_10240X7680_PT_BR }, + { "10880x8160", OPTION_VAL_10880X8160_PT_BR }, + { "11520x8640", OPTION_VAL_11520X8640_PT_BR }, + { "12160x9120", OPTION_VAL_12160X9120_PT_BR }, + { "12800x9600", OPTION_VAL_12800X9600_PT_BR }, { NULL, NULL }, }, #ifdef LOW_RES @@ -50941,62 +61000,62 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_PL, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PL, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_BR, NULL, "video", { - { "VGA", OPTION_VAL_VGA_PL }, - { "TV (RGB)", OPTION_VAL_TV_RGB_PL }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PL }, + { "VGA", OPTION_VAL_VGA_PT_BR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_PT_BR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PT_BR }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_PL, + CORE_OPTION_NAME_BROADCAST_LABEL_PT_BR, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_PL }, - { "PAL", OPTION_VAL_PAL_PL }, - { "PAL_N", OPTION_VAL_PAL_N_PL }, - { "PAL_M", OPTION_VAL_PAL_M_PL }, - { "Default", OPTION_VAL_DEFAULT_PL }, + { "NTSC", OPTION_VAL_NTSC_PT_BR }, + { "PAL", OPTION_VAL_PAL_PT_BR }, + { "PAL_N", OPTION_VAL_PAL_N_PT_BR }, + { "PAL_M", OPTION_VAL_PAL_M_PT_BR }, + { "Default", OPTION_VAL_DEFAULT_PT_BR }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PL, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_BR, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_PL }, - { "vertical", OPTION_VAL_VERTICAL_PL }, + { "horizontal", OPTION_VAL_HORIZONTAL_PT_BR }, + { "vertical", OPTION_VAL_VERTICAL_PT_BR }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PL, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PT_BR, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PL }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PL }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_BR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PT_BR }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PL }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PT_BR }, #endif { NULL, NULL }, }, @@ -51009,25 +61068,25 @@ struct retro_core_option_v2_definition option_defs_pl[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PL, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_BR, NULL, "video", { - { "512MB", OPTION_VAL_512MB_PL }, - { "1GB", OPTION_VAL_1GB_PL }, - { "2GB", OPTION_VAL_2GB_PL }, - { "4GB", OPTION_VAL_4GB_PL }, + { "512MB", OPTION_VAL_512MB_PT_BR }, + { "1GB", OPTION_VAL_1GB_PT_BR }, + { "2GB", OPTION_VAL_2GB_PT_BR }, + { "4GB", OPTION_VAL_4GB_PT_BR }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_PL, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PL, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_BR, NULL, "video", { @@ -51035,6 +61094,7 @@ struct retro_core_option_v2_definition option_defs_pl[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -51043,9 +61103,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PL, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_BR, NULL, "video", { @@ -51057,9 +61117,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PL, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PL, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_BR, NULL, "video", { @@ -51069,11 +61129,11 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_PL, + CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_PT_BR, NULL, "video", { @@ -51085,7 +61145,7 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_PL, + CORE_OPTION_NAME_FOG_LABEL_PT_BR, NULL, "", NULL, @@ -51099,9 +61159,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PL, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_BR, NULL, "video", { @@ -51113,9 +61173,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PL, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_BR, NULL, "video", { @@ -51130,24 +61190,24 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PL, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PL, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_BR, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_PL }, - { "1", OPTION_VAL_1_PL }, - { "2", OPTION_VAL_2_PL }, + { "0", OPTION_VAL_DEFAULT_PT_BR }, + { "1", OPTION_VAL_1_PT_BR }, + { "2", OPTION_VAL_2_PT_BR }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PL, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_BR, NULL, "video", { @@ -51155,13 +61215,13 @@ struct retro_core_option_v2_definition option_defs_pl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PL, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_BR, NULL, "video", { @@ -51173,9 +61233,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PL, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PL, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_BR, NULL, "video", { @@ -51188,25 +61248,25 @@ struct retro_core_option_v2_definition option_defs_pl[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_PL, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PL, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_BR, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_PL }, - { "4", OPTION_VAL_4_PL }, - { "6", OPTION_VAL_6_PL }, + { "2", OPTION_VAL_2_O26_PT_BR }, + { "4", OPTION_VAL_4_PT_BR }, + { "6", OPTION_VAL_6_PT_BR }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PL, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PT_BR, NULL, "video", { @@ -51220,9 +61280,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PL, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_BR, NULL, "video", { @@ -51232,11 +61292,25 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PT_BR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PL, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PL, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_BR, NULL, "performance", { @@ -51248,15 +61322,15 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PL, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_BR, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_PL }, - { "more", OPTION_VAL_MORE_PL }, + { "some", OPTION_VAL_SOME_PT_BR }, + { "more", OPTION_VAL_MORE_PT_BR }, { NULL, NULL }, }, #ifdef LOW_END @@ -51267,9 +61341,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PL, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PL, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_BR, NULL, "performance", { @@ -51286,9 +61360,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PL, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_BR, NULL, "hacks", { @@ -51300,9 +61374,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PL, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PL, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_BR, NULL, "hacks", { @@ -51314,9 +61388,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PL, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_BR, NULL, "hacks", { @@ -51330,64 +61404,78 @@ struct retro_core_option_v2_definition option_defs_pl[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PT_BR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_PL, + CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_PL, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_BR, NULL, "hacks", { - { "100", OPTION_VAL_100_PL }, - { "110", OPTION_VAL_110_PL }, - { "120", OPTION_VAL_120_PL }, - { "130", OPTION_VAL_130_PL }, - { "140", OPTION_VAL_140_PL }, - { "150", OPTION_VAL_150_PL }, - { "160", OPTION_VAL_160_PL }, - { "170", OPTION_VAL_170_PL }, - { "180", OPTION_VAL_180_PL }, - { "190", OPTION_VAL_190_PL }, - { "200", OPTION_VAL_200_PL }, - { "210", OPTION_VAL_210_PL }, - { "220", OPTION_VAL_220_PL }, - { "230", OPTION_VAL_230_PL }, - { "240", OPTION_VAL_240_PL }, - { "250", OPTION_VAL_250_PL }, - { "260", OPTION_VAL_260_PL }, - { "270", OPTION_VAL_270_PL }, - { "280", OPTION_VAL_280_PL }, - { "290", OPTION_VAL_290_PL }, - { "300", OPTION_VAL_300_PL }, - { "310", OPTION_VAL_310_PL }, - { "320", OPTION_VAL_320_PL }, - { "330", OPTION_VAL_330_PL }, - { "340", OPTION_VAL_340_PL }, - { "350", OPTION_VAL_350_PL }, - { "360", OPTION_VAL_360_PL }, - { "370", OPTION_VAL_370_PL }, - { "380", OPTION_VAL_380_PL }, - { "390", OPTION_VAL_390_PL }, - { "400", OPTION_VAL_400_PL }, - { "410", OPTION_VAL_410_PL }, - { "420", OPTION_VAL_420_PL }, - { "430", OPTION_VAL_430_PL }, - { "440", OPTION_VAL_440_PL }, - { "450", OPTION_VAL_450_PL }, - { "460", OPTION_VAL_460_PL }, - { "470", OPTION_VAL_470_PL }, - { "480", OPTION_VAL_480_PL }, - { "490", OPTION_VAL_490_PL }, - { "500", OPTION_VAL_500_PL }, + { "100", OPTION_VAL_100_PT_BR }, + { "110", OPTION_VAL_110_PT_BR }, + { "120", OPTION_VAL_120_PT_BR }, + { "130", OPTION_VAL_130_PT_BR }, + { "140", OPTION_VAL_140_PT_BR }, + { "150", OPTION_VAL_150_PT_BR }, + { "160", OPTION_VAL_160_PT_BR }, + { "170", OPTION_VAL_170_PT_BR }, + { "180", OPTION_VAL_180_PT_BR }, + { "190", OPTION_VAL_190_PT_BR }, + { "200", OPTION_VAL_200_PT_BR }, + { "210", OPTION_VAL_210_PT_BR }, + { "220", OPTION_VAL_220_PT_BR }, + { "230", OPTION_VAL_230_PT_BR }, + { "240", OPTION_VAL_240_PT_BR }, + { "250", OPTION_VAL_250_PT_BR }, + { "260", OPTION_VAL_260_PT_BR }, + { "270", OPTION_VAL_270_PT_BR }, + { "280", OPTION_VAL_280_PT_BR }, + { "290", OPTION_VAL_290_PT_BR }, + { "300", OPTION_VAL_300_PT_BR }, + { "310", OPTION_VAL_310_PT_BR }, + { "320", OPTION_VAL_320_PT_BR }, + { "330", OPTION_VAL_330_PT_BR }, + { "340", OPTION_VAL_340_PT_BR }, + { "350", OPTION_VAL_350_PT_BR }, + { "360", OPTION_VAL_360_PT_BR }, + { "370", OPTION_VAL_370_PT_BR }, + { "380", OPTION_VAL_380_PT_BR }, + { "390", OPTION_VAL_390_PT_BR }, + { "400", OPTION_VAL_400_PT_BR }, + { "410", OPTION_VAL_410_PT_BR }, + { "420", OPTION_VAL_420_PT_BR }, + { "430", OPTION_VAL_430_PT_BR }, + { "440", OPTION_VAL_440_PT_BR }, + { "450", OPTION_VAL_450_PT_BR }, + { "460", OPTION_VAL_460_PT_BR }, + { "470", OPTION_VAL_470_PT_BR }, + { "480", OPTION_VAL_480_PT_BR }, + { "490", OPTION_VAL_490_PT_BR }, + { "500", OPTION_VAL_500_PT_BR }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PL, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PT_BR, NULL, "hacks", { @@ -51397,11 +61485,11 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PL, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PT_BR, NULL, "hacks", { @@ -51413,47 +61501,47 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PL, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PT_BR, NULL, "input", { - { "0%", OPTION_VAL_0_PL }, - { "5%", OPTION_VAL_5_PL }, - { "10%", OPTION_VAL_10_PL }, - { "15%", OPTION_VAL_15_PL }, - { "20%", OPTION_VAL_20_PL }, - { "25%", OPTION_VAL_25_PL }, - { "30%", OPTION_VAL_30_PL }, + { "0%", OPTION_VAL_0_PT_BR }, + { "5%", OPTION_VAL_5_PT_BR }, + { "10%", OPTION_VAL_10_PT_BR }, + { "15%", OPTION_VAL_15_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "25%", OPTION_VAL_25_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PT_BR, NULL, "input", { - { "0%", OPTION_VAL_0_PL }, - { "5%", OPTION_VAL_5_PL }, - { "10%", OPTION_VAL_10_PL }, - { "15%", OPTION_VAL_15_PL }, - { "20%", OPTION_VAL_20_PL }, - { "25%", OPTION_VAL_25_PL }, - { "30%", OPTION_VAL_30_PL }, + { "0%", OPTION_VAL_0_PT_BR }, + { "5%", OPTION_VAL_5_PT_BR }, + { "10%", OPTION_VAL_10_PT_BR }, + { "15%", OPTION_VAL_15_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "25%", OPTION_VAL_25_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_BR, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PT_BR, NULL, "input", { @@ -51464,10 +61552,10 @@ struct retro_core_option_v2_definition option_defs_pl[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PL, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_BR, NULL, "input", { @@ -51475,124 +61563,268 @@ struct retro_core_option_v2_definition option_defs_pl[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PL, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_BR, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PL, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PT_BR, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PL, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_PT_BR }, + { "60%", OPTION_VAL_60_PT_BR }, + { "70%", OPTION_VAL_70_PT_BR }, + { "80%", OPTION_VAL_80_PT_BR }, + { "90%", OPTION_VAL_90_PT_BR }, + { "100%", OPTION_VAL_100_O45_PT_BR }, + { "110%", OPTION_VAL_110_O45_PT_BR }, + { "120%", OPTION_VAL_120_O45_PT_BR }, + { "130%", OPTION_VAL_130_O45_PT_BR }, + { "140%", OPTION_VAL_140_O45_PT_BR }, + { "150%", OPTION_VAL_150_O45_PT_BR }, + { "160%", OPTION_VAL_160_O45_PT_BR }, + { "170%", OPTION_VAL_170_O45_PT_BR }, + { "180%", OPTION_VAL_180_O45_PT_BR }, + { "190%", OPTION_VAL_190_O45_PT_BR }, + { "200%", OPTION_VAL_200_O45_PT_BR }, + { "210%", OPTION_VAL_210_O45_PT_BR }, + { "220%", OPTION_VAL_220_O45_PT_BR }, + { "230%", OPTION_VAL_230_O45_PT_BR }, + { "240%", OPTION_VAL_240_O45_PT_BR }, + { "250%", OPTION_VAL_250_O45_PT_BR }, + { "260%", OPTION_VAL_260_O45_PT_BR }, + { "270%", OPTION_VAL_270_O45_PT_BR }, + { "280%", OPTION_VAL_280_O45_PT_BR }, + { "290%", OPTION_VAL_290_O45_PT_BR }, + { "300%", OPTION_VAL_300_O45_PT_BR }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PL, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_BR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PL }, - { "Red", OPTION_VAL_RED_PL }, - { "Green", OPTION_VAL_GREEN_PL }, - { "Blue", OPTION_VAL_BLUE_PL }, + { "White", OPTION_VAL_WHITE_PT_BR }, + { "Red", OPTION_VAL_RED_PT_BR }, + { "Green", OPTION_VAL_GREEN_PT_BR }, + { "Blue", OPTION_VAL_BLUE_PT_BR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PL, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_BR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PL }, - { "Red", OPTION_VAL_RED_PL }, - { "Green", OPTION_VAL_GREEN_PL }, - { "Blue", OPTION_VAL_BLUE_PL }, + { "White", OPTION_VAL_WHITE_PT_BR }, + { "Red", OPTION_VAL_RED_PT_BR }, + { "Green", OPTION_VAL_GREEN_PT_BR }, + { "Blue", OPTION_VAL_BLUE_PT_BR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PL, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_BR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PL }, - { "Red", OPTION_VAL_RED_PL }, - { "Green", OPTION_VAL_GREEN_PL }, - { "Blue", OPTION_VAL_BLUE_PL }, + { "White", OPTION_VAL_WHITE_PT_BR }, + { "Red", OPTION_VAL_RED_PT_BR }, + { "Green", OPTION_VAL_GREEN_PT_BR }, + { "Blue", OPTION_VAL_BLUE_PT_BR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PL, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_BR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PL }, - { "Red", OPTION_VAL_RED_PL }, - { "Green", OPTION_VAL_GREEN_PL }, - { "Blue", OPTION_VAL_BLUE_PL }, + { "White", OPTION_VAL_WHITE_PT_BR }, + { "Red", OPTION_VAL_RED_PT_BR }, + { "Green", OPTION_VAL_GREEN_PT_BR }, + { "Blue", OPTION_VAL_BLUE_PT_BR }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PT_BR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PT_BR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_BR }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_BR }, + { "None", OPTION_VAL_NONE_PT_BR }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PL, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PL, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_BR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_BR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_BR, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_PL }, - { "All VMUs", OPTION_VAL_ALL_VMUS_PL }, + { "VMU A1", OPTION_VAL_VMU_A1_PT_BR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_PT_BR }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_PL, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PL, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_PL, + CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_BR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_BR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_BR, NULL, "vmu", { @@ -51603,9 +61835,9 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PL, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PL, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_BR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_BR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_BR, NULL, "vmu", { @@ -51617,7 +61849,7 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PL, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_BR, NULL, "", NULL, @@ -51631,144 +61863,144 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PL, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PL, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PL }, - { "2x", OPTION_VAL_2_O27_PL }, - { "3x", OPTION_VAL_3X_PL }, - { "4x", OPTION_VAL_4_PL }, - { "5x", OPTION_VAL_5X_PL }, + { "1x", OPTION_VAL_1X_PT_BR }, + { "2x", OPTION_VAL_2_O26_PT_BR }, + { "3x", OPTION_VAL_3X_PT_BR }, + { "4x", OPTION_VAL_4_PT_BR }, + { "5x", OPTION_VAL_5X_PT_BR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PL, - NULL, - "", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_BR, NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PL, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PL }, - { "20%", OPTION_VAL_20_PL }, - { "30%", OPTION_VAL_30_PL }, - { "40%", OPTION_VAL_40_PL }, - { "50%", OPTION_VAL_50_PL }, - { "60%", OPTION_VAL_60_PL }, - { "70%", OPTION_VAL_70_PL }, - { "80%", OPTION_VAL_80_PL }, - { "90%", OPTION_VAL_90_PL }, - { "100%", OPTION_VAL_100_O57_PL }, + { "10%", OPTION_VAL_10_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, + { "40%", OPTION_VAL_40_PT_BR }, + { "50%", OPTION_VAL_50_PT_BR }, + { "60%", OPTION_VAL_60_PT_BR }, + { "70%", OPTION_VAL_70_PT_BR }, + { "80%", OPTION_VAL_80_PT_BR }, + { "90%", OPTION_VAL_90_PT_BR }, + { "100%", OPTION_VAL_100_O45_PT_BR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PL, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_BR, NULL, "", NULL, @@ -51782,144 +62014,144 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PL, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PL, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PL }, - { "2x", OPTION_VAL_2_O27_PL }, - { "3x", OPTION_VAL_3X_PL }, - { "4x", OPTION_VAL_4_PL }, - { "5x", OPTION_VAL_5X_PL }, + { "1x", OPTION_VAL_1X_PT_BR }, + { "2x", OPTION_VAL_2_O26_PT_BR }, + { "3x", OPTION_VAL_3X_PT_BR }, + { "4x", OPTION_VAL_4_PT_BR }, + { "5x", OPTION_VAL_5X_PT_BR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PL, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PL }, - { "20%", OPTION_VAL_20_PL }, - { "30%", OPTION_VAL_30_PL }, - { "40%", OPTION_VAL_40_PL }, - { "50%", OPTION_VAL_50_PL }, - { "60%", OPTION_VAL_60_PL }, - { "70%", OPTION_VAL_70_PL }, - { "80%", OPTION_VAL_80_PL }, - { "90%", OPTION_VAL_90_PL }, - { "100%", OPTION_VAL_100_O57_PL }, + { "10%", OPTION_VAL_10_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, + { "40%", OPTION_VAL_40_PT_BR }, + { "50%", OPTION_VAL_50_PT_BR }, + { "60%", OPTION_VAL_60_PT_BR }, + { "70%", OPTION_VAL_70_PT_BR }, + { "80%", OPTION_VAL_80_PT_BR }, + { "90%", OPTION_VAL_90_PT_BR }, + { "100%", OPTION_VAL_100_O45_PT_BR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PL, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_BR, NULL, "", NULL, @@ -51933,144 +62165,144 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PL, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PL, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PL }, - { "2x", OPTION_VAL_2_O27_PL }, - { "3x", OPTION_VAL_3X_PL }, - { "4x", OPTION_VAL_4_PL }, - { "5x", OPTION_VAL_5X_PL }, + { "1x", OPTION_VAL_1X_PT_BR }, + { "2x", OPTION_VAL_2_O26_PT_BR }, + { "3x", OPTION_VAL_3X_PT_BR }, + { "4x", OPTION_VAL_4_PT_BR }, + { "5x", OPTION_VAL_5X_PT_BR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PL, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PL }, - { "20%", OPTION_VAL_20_PL }, - { "30%", OPTION_VAL_30_PL }, - { "40%", OPTION_VAL_40_PL }, - { "50%", OPTION_VAL_50_PL }, - { "60%", OPTION_VAL_60_PL }, - { "70%", OPTION_VAL_70_PL }, - { "80%", OPTION_VAL_80_PL }, - { "90%", OPTION_VAL_90_PL }, - { "100%", OPTION_VAL_100_O57_PL }, + { "10%", OPTION_VAL_10_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, + { "40%", OPTION_VAL_40_PT_BR }, + { "50%", OPTION_VAL_50_PT_BR }, + { "60%", OPTION_VAL_60_PT_BR }, + { "70%", OPTION_VAL_70_PT_BR }, + { "80%", OPTION_VAL_80_PT_BR }, + { "90%", OPTION_VAL_90_PT_BR }, + { "100%", OPTION_VAL_100_O45_PT_BR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PL, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_BR, NULL, "", NULL, @@ -52084,505 +62316,560 @@ struct retro_core_option_v2_definition option_defs_pl[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PL, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PL }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PL }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PL }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PL }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PL, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PL }, - { "2x", OPTION_VAL_2_O27_PL }, - { "3x", OPTION_VAL_3X_PL }, - { "4x", OPTION_VAL_4_PL }, - { "5x", OPTION_VAL_5X_PL }, + { "1x", OPTION_VAL_1X_PT_BR }, + { "2x", OPTION_VAL_2_O26_PT_BR }, + { "3x", OPTION_VAL_3X_PT_BR }, + { "4x", OPTION_VAL_4_PT_BR }, + { "5x", OPTION_VAL_5X_PT_BR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PL, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PL }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PL }, - { "BLACK 02", OPTION_VAL_BLACK_02_PL }, - { "BLUE 03", OPTION_VAL_BLUE_PL }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PL }, - { "GREEN 05", OPTION_VAL_GREEN_PL }, - { "CYAN 06", OPTION_VAL_CYAN_06_PL }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PL }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PL }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PL }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PL }, - { "RED 11", OPTION_VAL_RED_PL }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PL }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PL }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PL }, - { "GRAY 15", OPTION_VAL_GRAY_15_PL }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PL }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PL }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PL }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PL }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PL }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PL }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PL }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PL }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PL }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PL }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PL }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PL }, - { "WHITE 28", OPTION_VAL_WHITE_PL }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, + { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, + { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, + { "RED 11", OPTION_VAL_RED_PT_BR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, + { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PL, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_BR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PL }, - { "20%", OPTION_VAL_20_PL }, - { "30%", OPTION_VAL_30_PL }, - { "40%", OPTION_VAL_40_PL }, - { "50%", OPTION_VAL_50_PL }, - { "60%", OPTION_VAL_60_PL }, - { "70%", OPTION_VAL_70_PL }, - { "80%", OPTION_VAL_80_PL }, - { "90%", OPTION_VAL_90_PL }, - { "100%", OPTION_VAL_100_O57_PL }, + { "10%", OPTION_VAL_10_PT_BR }, + { "20%", OPTION_VAL_20_PT_BR }, + { "30%", OPTION_VAL_30_PT_BR }, + { "40%", OPTION_VAL_40_PT_BR }, + { "50%", OPTION_VAL_50_PT_BR }, + { "60%", OPTION_VAL_60_PT_BR }, + { "70%", OPTION_VAL_70_PT_BR }, + { "80%", OPTION_VAL_80_PT_BR }, + { "90%", OPTION_VAL_90_PT_BR }, + { "100%", OPTION_VAL_100_O45_PT_BR }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_pl = { - option_cats_pl, - option_defs_pl +struct retro_core_options_v2 options_pt_br = { + option_cats_pt_br, + option_defs_pt_br }; -/* RETRO_LANGUAGE_PT_BR */ +/* RETRO_LANGUAGE_PT_PT */ -#define CATEGORY_SYSTEM_LABEL_PT_BR "Sistema" -#define CATEGORY_SYSTEM_INFO_0_PT_BR "Configure a região, o idioma, a BIOS e as configurações básicas do hardware." -#define CATEGORY_VIDEO_LABEL_PT_BR "Vídeo" -#define CATEGORY_VIDEO_INFO_0_PT_BR "Configure a resolução, a transparência independente da ordem e dos efeitos visuais." -#define CATEGORY_PERFORMANCE_LABEL_PT_BR "Desempenho" -#define CATEGORY_PERFORMANCE_INFO_0_PT_BR NULL -#define CATEGORY_HACKS_LABEL_PT_BR "Hacks de emulação" -#define CATEGORY_HACKS_INFO_0_PT_BR "Configura as configurações da substituição da tela widescreen, da velocidade do carregamento da GD-ROM e da textura." -#define CATEGORY_INPUT_LABEL_PT_BR "Entrada" -#define CATEGORY_INPUT_INFO_0_PT_BR "Configura os ajustes do controle e da pistola de luz." -#define CATEGORY_VMU_LABEL_PT_BR "Unidade de memória visual" -#define CATEGORY_VMU_INFO_0_PT_BR "Configura os arquivos de salvamento VMU por jogo e as configurações da visibilidade do VMU na tela." -#define CORE_OPTION_NAME_REGION_LABEL_PT_BR "Região" -#define OPTION_VAL_JAPAN_PT_BR "Japão" -#define OPTION_VAL_USA_PT_BR "EUA" -#define OPTION_VAL_EUROPE_PT_BR "Europa" -#define OPTION_VAL_DEFAULT_PT_BR "Padrão" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_PT_BR "Idioma" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_BR "Altera o idioma usado pela BIOS e por quaisquer jogos que contenham vários idiomas." -#define OPTION_VAL_JAPANESE_PT_BR "Japonês" -#define OPTION_VAL_ENGLISH_PT_BR "Inglês" -#define OPTION_VAL_GERMAN_PT_BR "Alemão" -#define OPTION_VAL_FRENCH_PT_BR "Francês" -#define OPTION_VAL_SPANISH_PT_BR "Espanhol" -#define OPTION_VAL_ITALIAN_PT_BR "Italiano" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_BR "Força o uso de uma BIOS criada com emulação de alto nível." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_BR "Inicialização a partir da BIOS (requer reinício)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_BR "Inicializa diretamente no menu da BIOS do Dreamcast." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_BR "Ativar DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_BR "Ativa a emulação Dreamcast do DSP (processador de sinal digital) de áudio. Melhora a precisão do som gerado ao custo de requisitos maiores." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_PT_BR "Forçar o modo Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PT_BR "Ativa a emulação completa da MMU (Unidade de Gerenciamento de Memória) e outras configurações para jogos compatíveis com o Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_BR "Ativar botões de serviço da NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_BR "Ativa o botão SERVICE da placa NAOMI para acessar a configuração do gabinete." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_UPNP_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_BR "Resolução interna" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_BR "Modificar resolução de renderização." -#define OPTION_VAL_320X240_PT_BR NULL -#define OPTION_VAL_640X480_PT_BR NULL -#define OPTION_VAL_800X600_PT_BR NULL -#define OPTION_VAL_960X720_PT_BR NULL -#define OPTION_VAL_1024X768_PT_BR NULL -#define OPTION_VAL_1280X960_PT_BR NULL -#define OPTION_VAL_1440X1080_PT_BR NULL -#define OPTION_VAL_1600X1200_PT_BR NULL -#define OPTION_VAL_1920X1440_PT_BR NULL -#define OPTION_VAL_2560X1920_PT_BR NULL -#define OPTION_VAL_2880X2160_PT_BR NULL -#define OPTION_VAL_3200X2400_PT_BR NULL -#define OPTION_VAL_3840X2880_PT_BR NULL -#define OPTION_VAL_4480X3360_PT_BR NULL -#define OPTION_VAL_5120X3840_PT_BR NULL -#define OPTION_VAL_5760X4320_PT_BR NULL -#define OPTION_VAL_6400X4800_PT_BR NULL -#define OPTION_VAL_7040X5280_PT_BR NULL -#define OPTION_VAL_7680X5760_PT_BR NULL -#define OPTION_VAL_8320X6240_PT_BR NULL -#define OPTION_VAL_8960X6720_PT_BR NULL -#define OPTION_VAL_9600X7200_PT_BR NULL -#define OPTION_VAL_10240X7680_PT_BR NULL -#define OPTION_VAL_10880X8160_PT_BR NULL -#define OPTION_VAL_11520X8640_PT_BR NULL -#define OPTION_VAL_12160X9120_PT_BR NULL -#define OPTION_VAL_12800X9600_PT_BR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_BR "Tipo de cabo" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_BR "O tipo de sinal de saída. 'TV (Composto)' é o mais amplamente suportado." -#define OPTION_VAL_VGA_PT_BR NULL -#define OPTION_VAL_TV_RGB_PT_BR NULL -#define OPTION_VAL_TV_COMPOSITE_PT_BR "TV (Composto)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_PT_BR "Padrão de transmissão" -#define OPTION_VAL_NTSC_PT_BR NULL -#define OPTION_VAL_PAL_PT_BR "PAL (Resto do mundo)" -#define OPTION_VAL_PAL_N_PT_BR "PAL-N (Argentina, Paraguai, Uruguai)" -#define OPTION_VAL_PAL_M_PT_BR "PAL-M (Brasil)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_BR "Orientação da tela" -#define OPTION_VAL_HORIZONTAL_PT_BR NULL -#define OPTION_VAL_VERTICAL_PT_BR NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_BR "Classificação de transparências" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_BR "Por faixa (rápido, menos preciso)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_PT_BR "Por triângulo (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_PT_BR "Por pixel (preciso, mas lento)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_BR "Um alto valor pode ser necessário para que a imagem seja bem exibida em resoluções superiores às nativas." -#define OPTION_VAL_512MB_PT_BR NULL -#define OPTION_VAL_1GB_PT_BR NULL -#define OPTION_VAL_2GB_PT_BR NULL -#define OPTION_VAL_4GB_PT_BR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_BR "Ativar o buffer RTT (renderização para texturas)" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_FOG_LABEL_PT_BR "Efeitos de nevoeiro" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_BR "Modificador de volume" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_BR "Uma característica da GPU do Dreamcast que é frequentemente usada por jogos para desenhar sombras em objetos. Esta opção deve geralmente ser ativada; tem pouco efeito sobre o desempenho." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_BR "Filtro anisotrópico" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_BR "Filtragem de textura" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_BR NULL -#define OPTION_VAL_1_PT_BR NULL -#define OPTION_VAL_2_PT_BR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_BR "Atrasar troca de quadro" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_BR "Útil para evitar tremulações da imagem ou defeitos de vídeo. Não recomendado para uso em plataformas lentas." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_BR "Filtro de pós-processamento do PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_BR "Pós-processa a imagem renderizada para simular efeitos específicos da GPU PowerVR2 e os sinais de vídeo analógicos." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_BR "Redimensionamento de textura (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_BR "Melhora os gráficos 2D de 'pixel arte' desenhados à mão. Usar somente com jogos em 2D pixelado." -#define OPTION_VAL_2_O27_PT_BR NULL -#define OPTION_VAL_4_PT_BR NULL -#define OPTION_VAL_6_PT_BR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_BR "Tamanho máximo do redimensionamento de texturas" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_BR "Renderização multi-thread" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_BR "Executa a GPU e a CPU em diferentes threads. Altamente recomendado." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_BR "Pulo de quadros automático" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_BR "Pula automaticamente quadros quando o emulador está lento. Nota: Esta configuração só será aplicada quando a 'Renderização multi-thread' estiver ativada." -#define OPTION_VAL_SOME_PT_BR NULL -#define OPTION_VAL_MORE_PT_BR "Máximo" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_BR "Pulando quadro" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_BR "Define o número de quadros a serem pulados após cada quadro ser exibido." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_BR "Hack de trapaças (requer reinício)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_BR "Ativa trapaças que permitem a exibição de certos jogos em formato widescreen." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_BR "Hack de widescreen" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_BR "Desenha a geometria além da proporção de tela normal de 4:3. Pode produzir falhas gráficas em áreas reveladas." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_BR "Carregamento rápido do GD-ROM (impreciso)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_BR "Acelera o carregamento do GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_BR NULL -#define OPTION_VAL_100_PT_BR NULL -#define OPTION_VAL_110_PT_BR NULL -#define OPTION_VAL_120_PT_BR NULL -#define OPTION_VAL_130_PT_BR NULL -#define OPTION_VAL_140_PT_BR NULL -#define OPTION_VAL_150_PT_BR NULL -#define OPTION_VAL_160_PT_BR NULL -#define OPTION_VAL_170_PT_BR NULL -#define OPTION_VAL_180_PT_BR NULL -#define OPTION_VAL_190_PT_BR NULL -#define OPTION_VAL_200_PT_BR NULL -#define OPTION_VAL_210_PT_BR NULL -#define OPTION_VAL_220_PT_BR NULL -#define OPTION_VAL_230_PT_BR NULL -#define OPTION_VAL_240_PT_BR NULL -#define OPTION_VAL_250_PT_BR NULL -#define OPTION_VAL_260_PT_BR NULL -#define OPTION_VAL_270_PT_BR NULL -#define OPTION_VAL_280_PT_BR NULL -#define OPTION_VAL_290_PT_BR NULL -#define OPTION_VAL_300_PT_BR NULL -#define OPTION_VAL_310_PT_BR NULL -#define OPTION_VAL_320_PT_BR NULL -#define OPTION_VAL_330_PT_BR NULL -#define OPTION_VAL_340_PT_BR NULL -#define OPTION_VAL_350_PT_BR NULL -#define OPTION_VAL_360_PT_BR NULL -#define OPTION_VAL_370_PT_BR NULL -#define OPTION_VAL_380_PT_BR NULL -#define OPTION_VAL_390_PT_BR NULL -#define OPTION_VAL_400_PT_BR NULL -#define OPTION_VAL_410_PT_BR NULL -#define OPTION_VAL_420_PT_BR NULL -#define OPTION_VAL_430_PT_BR NULL -#define OPTION_VAL_440_PT_BR NULL -#define OPTION_VAL_450_PT_BR NULL -#define OPTION_VAL_460_PT_BR NULL -#define OPTION_VAL_470_PT_BR NULL -#define OPTION_VAL_480_PT_BR NULL -#define OPTION_VAL_490_PT_BR NULL -#define OPTION_VAL_500_PT_BR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_BR "Carregar texturas personalizadas" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_BR "Despejo de texturas" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_BR "Zona morta do direcional analógico" -#define OPTION_VAL_0_PT_BR NULL -#define OPTION_VAL_5_PT_BR NULL -#define OPTION_VAL_10_PT_BR NULL -#define OPTION_VAL_15_PT_BR NULL -#define OPTION_VAL_20_PT_BR NULL -#define OPTION_VAL_25_PT_BR NULL -#define OPTION_VAL_30_PT_BR NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_BR "Zona morta dos gatilhos" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_BR "Gatilhos digitais" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PT_BR "Purupuru Pack (vibração)" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PT_BR "Habilita a vibração do controle." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_BR "Mostrar configurações das pistolas de luz" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_BR "Ativa a configuração do da mira da pistola de luz na tela. OBSERVAÇÃO: O menu rápido pode precisar ser alternado para que esta configuração surta efeito." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_BR "Mostrar ponto de mira da arma 1" -#define OPTION_VAL_WHITE_PT_BR "Branco" -#define OPTION_VAL_RED_PT_BR "Vermelho" -#define OPTION_VAL_GREEN_PT_BR "Verde" -#define OPTION_VAL_BLUE_PT_BR "Azul" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_BR "Mostrar ponto de mira da arma 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_BR "Mostrar ponto de mira da arma 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_BR "Mostrar ponto de mira da arma 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_BR "Separar Visual Memory (VMU) por jogo" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_BR "VMUs por jogo" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_BR "Ao desativar esta opção, todos os jogos compartilharão quatro arquivos de salvamento da VMU (A1, B1, C1, D1) que serão localizados no diretório de sistema do RetroArch. A configuração 'VMU A1' criará um arquivo único da VMU A1 no diretório de salvamento do RetroArch para cada jogo que for executado. A configuração 'Todas as VMUs' criará quatro arquivos únicos VMU (A1, B1, C1, D1) para cada jogo que for executado." -#define OPTION_VAL_VMU_A1_PT_BR NULL -#define OPTION_VAL_ALL_VMUS_PT_BR "Todas as VMUs" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_BR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_BR NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_BR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_BR "Mostrar configurações de visualização das Visual Memory (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_BR "Mostrar configurações da exibição da VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_BR "Ativa a configuração da visibilidade, do tamanho, da posição e da cor das telas de LCD emulados da VMU. OBSERVAÇÃO: O menu rápido pode precisar ser alternado para que esta configuração surta efeito." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_BR "Tela da VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_BR "Posição da tela da VMU 1" -#define OPTION_VAL_UPPER_LEFT_PT_BR "Canto superior esquerdo" -#define OPTION_VAL_UPPER_RIGHT_PT_BR "Canto superior direito" -#define OPTION_VAL_LOWER_LEFT_PT_BR "Canto inferior esquerdo" -#define OPTION_VAL_LOWER_RIGHT_PT_BR "Canto inferior direito" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_BR "Tamanho da tela da VMU 1" -#define OPTION_VAL_1X_PT_BR NULL -#define OPTION_VAL_3X_PT_BR NULL -#define OPTION_VAL_5X_PT_BR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_BR "Cor dos pixels acesos da VMU 1" -#define OPTION_VAL_DEFAULT_ON_00_PT_BR "Ligar por padrão" -#define OPTION_VAL_DEFAULT_OFF_01_PT_BR "Desligar por padrão" -#define OPTION_VAL_BLACK_02_PT_BR "Preta" -#define OPTION_VAL_LIGHT_BLUE_04_PT_BR "Azul claro" -#define OPTION_VAL_CYAN_06_PT_BR "Azul-marinho" -#define OPTION_VAL_CYAN_BLUE_07_PT_BR "Azul ciano" -#define OPTION_VAL_LIGHT_GREEN_08_PT_BR "Verde claro" -#define OPTION_VAL_CYAN_GREEN_09_PT_BR "Verde ciano" -#define OPTION_VAL_LIGHT_CYAN_10_PT_BR "Ciano claro" -#define OPTION_VAL_PURPLE_12_PT_BR "Violeta" -#define OPTION_VAL_LIGHT_PURPLE_13_PT_BR "Roxo claro" -#define OPTION_VAL_YELLOW_14_PT_BR "Amarelo" -#define OPTION_VAL_GRAY_15_PT_BR "Cinza" -#define OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR "Roxo claro (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_PT_BR "Verde claro (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_PT_BR "Verde claro (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_PT_BR "Ciano claro (2)" -#define OPTION_VAL_LIGHT_RED_2_20_PT_BR "Vermelho claro (2)" -#define OPTION_VAL_MAGENTA_21_PT_BR NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR "Roxo claro (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_PT_BR "Laranja claro" -#define OPTION_VAL_ORANGE_24_PT_BR "Laranja" -#define OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR "Roxo claro (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_PT_BR "Amarelo claro" -#define OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR "Amarelo claro (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_BR "Cor dos pixels apagados da VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_BR "Opacidade da tela da VMU 1" -#define OPTION_VAL_40_PT_BR NULL -#define OPTION_VAL_50_PT_BR NULL -#define OPTION_VAL_60_PT_BR NULL -#define OPTION_VAL_70_PT_BR NULL -#define OPTION_VAL_80_PT_BR NULL -#define OPTION_VAL_90_PT_BR NULL -#define OPTION_VAL_100_O57_PT_BR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_BR "Tela da VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_BR "Posição da tela da VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_BR "Tamanho da tela da VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_BR "Cor dos pixels acesos da VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_BR "Cor dos pixels apagados da VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_BR "Opacidade da tela da VMU 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_BR "Tela da VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_BR "Posição da tela da VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_BR "Tamanho da tela da VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_BR "Cor dos pixels acesos da VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_BR "Cor dos pixels apagados da VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_BR "Opacidade da tela da VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_BR "Tela da VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_BR "Posição da tela da VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_BR "Tamanho da tela da VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_BR "Cor dos pixels acesos da VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_BR "Cor dos pixels apagados da VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_BR "Opacidade da tela da VMU 4" +#define CATEGORY_SYSTEM_LABEL_PT_PT NULL +#define CATEGORY_SYSTEM_INFO_0_PT_PT NULL +#define CATEGORY_VIDEO_LABEL_PT_PT "Vídeo" +#define CATEGORY_VIDEO_INFO_0_PT_PT NULL +#define CATEGORY_PERFORMANCE_LABEL_PT_PT NULL +#define CATEGORY_PERFORMANCE_INFO_0_PT_PT "Configurar a renderização multithread e as definições de salto de fotogramas." +#define CATEGORY_HACKS_LABEL_PT_PT NULL +#define CATEGORY_HACKS_INFO_0_PT_PT NULL +#define CATEGORY_INPUT_LABEL_PT_PT "Entrada" +#define CATEGORY_INPUT_INFO_0_PT_PT NULL +#define CATEGORY_EXPANSIONS_LABEL_PT_PT NULL +#define CATEGORY_EXPANSIONS_INFO_0_PT_PT NULL +#define CATEGORY_VMU_LABEL_PT_PT NULL +#define CATEGORY_VMU_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_REGION_LABEL_PT_PT NULL +#define OPTION_VAL_JAPAN_PT_PT NULL +#define OPTION_VAL_USA_PT_PT NULL +#define OPTION_VAL_EUROPE_PT_PT NULL +#define OPTION_VAL_DEFAULT_PT_PT NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_PT_PT "Idioma" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_PT NULL +#define OPTION_VAL_JAPANESE_PT_PT "Japonês" +#define OPTION_VAL_ENGLISH_PT_PT "Inglês" +#define OPTION_VAL_GERMAN_PT_PT "Alemão" +#define OPTION_VAL_FRENCH_PT_PT "Francês" +#define OPTION_VAL_SPANISH_PT_PT "Espanhol" +#define OPTION_VAL_ITALIAN_PT_PT "Italiano" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_UPNP_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_PT NULL +#define OPTION_VAL_320X240_PT_PT NULL +#define OPTION_VAL_640X480_PT_PT NULL +#define OPTION_VAL_800X600_PT_PT NULL +#define OPTION_VAL_960X720_PT_PT NULL +#define OPTION_VAL_1024X768_PT_PT NULL +#define OPTION_VAL_1280X960_PT_PT NULL +#define OPTION_VAL_1440X1080_PT_PT NULL +#define OPTION_VAL_1600X1200_PT_PT NULL +#define OPTION_VAL_1920X1440_PT_PT NULL +#define OPTION_VAL_2560X1920_PT_PT NULL +#define OPTION_VAL_2880X2160_PT_PT NULL +#define OPTION_VAL_3200X2400_PT_PT NULL +#define OPTION_VAL_3840X2880_PT_PT NULL +#define OPTION_VAL_4480X3360_PT_PT NULL +#define OPTION_VAL_5120X3840_PT_PT NULL +#define OPTION_VAL_5760X4320_PT_PT NULL +#define OPTION_VAL_6400X4800_PT_PT NULL +#define OPTION_VAL_7040X5280_PT_PT NULL +#define OPTION_VAL_7680X5760_PT_PT NULL +#define OPTION_VAL_8320X6240_PT_PT NULL +#define OPTION_VAL_8960X6720_PT_PT NULL +#define OPTION_VAL_9600X7200_PT_PT NULL +#define OPTION_VAL_10240X7680_PT_PT NULL +#define OPTION_VAL_10880X8160_PT_PT NULL +#define OPTION_VAL_11520X8640_PT_PT NULL +#define OPTION_VAL_12160X9120_PT_PT NULL +#define OPTION_VAL_12800X9600_PT_PT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_PT NULL +#define OPTION_VAL_VGA_PT_PT NULL +#define OPTION_VAL_TV_RGB_PT_PT NULL +#define OPTION_VAL_TV_COMPOSITE_PT_PT NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_PT_PT NULL +#define OPTION_VAL_NTSC_PT_PT NULL +#define OPTION_VAL_PAL_PT_PT NULL +#define OPTION_VAL_PAL_N_PT_PT NULL +#define OPTION_VAL_PAL_M_PT_PT NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_PT "Orientação do ecrã" +#define OPTION_VAL_HORIZONTAL_PT_PT NULL +#define OPTION_VAL_VERTICAL_PT_PT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PT_PT NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_PT NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_PT_PT NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_PT_PT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_PT NULL +#define OPTION_VAL_512MB_PT_PT NULL +#define OPTION_VAL_1GB_PT_PT NULL +#define OPTION_VAL_2GB_PT_PT NULL +#define OPTION_VAL_4GB_PT_PT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_FOG_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_PT NULL +#define OPTION_VAL_1_PT_PT NULL +#define OPTION_VAL_2_PT_PT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_PT "Detetar alterações na taxa de fotogramas" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_PT "Notifica a interface quando a taxa de fotogramas interna muda (por exemplo, de 60 fps para 30 fps). Melhora o ritmo dos fotogramas em jogos que funcionam a 30 fps ou 20 fps bloqueados, mas deve ser desativado para jogos com taxas de fotogramas desbloqueadas (instáveis) (por exemplo, Ecco the Dolphin, Unreal Tournament). Nota: Não está disponível quando a opção \"Saltar fotogramas automaticamente\" está ativada." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_PT NULL +#define OPTION_VAL_2_O26_PT_PT NULL +#define OPTION_VAL_4_PT_PT NULL +#define OPTION_VAL_6_PT_PT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_PT "Renderização multithread" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_PT "Executa a GPU e a CPU em threads diferentes. Altamente recomendado." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_PT "Saltar fotogramas automaticamente" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_PT "Saltar automaticamente os fotogramas quando o emulador está a funcionar lentamente. Nota: Esta definição só se aplica quando a opção \"Renderização multithread\" está ativada." +#define OPTION_VAL_SOME_PT_PT NULL +#define OPTION_VAL_MORE_PT_PT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_PT NULL +#define OPTION_VAL_100_PT_PT NULL +#define OPTION_VAL_110_PT_PT NULL +#define OPTION_VAL_120_PT_PT NULL +#define OPTION_VAL_130_PT_PT NULL +#define OPTION_VAL_140_PT_PT NULL +#define OPTION_VAL_150_PT_PT NULL +#define OPTION_VAL_160_PT_PT NULL +#define OPTION_VAL_170_PT_PT NULL +#define OPTION_VAL_180_PT_PT NULL +#define OPTION_VAL_190_PT_PT NULL +#define OPTION_VAL_200_PT_PT NULL +#define OPTION_VAL_210_PT_PT NULL +#define OPTION_VAL_220_PT_PT NULL +#define OPTION_VAL_230_PT_PT NULL +#define OPTION_VAL_240_PT_PT NULL +#define OPTION_VAL_250_PT_PT NULL +#define OPTION_VAL_260_PT_PT NULL +#define OPTION_VAL_270_PT_PT NULL +#define OPTION_VAL_280_PT_PT NULL +#define OPTION_VAL_290_PT_PT NULL +#define OPTION_VAL_300_PT_PT NULL +#define OPTION_VAL_310_PT_PT NULL +#define OPTION_VAL_320_PT_PT NULL +#define OPTION_VAL_330_PT_PT NULL +#define OPTION_VAL_340_PT_PT NULL +#define OPTION_VAL_350_PT_PT NULL +#define OPTION_VAL_360_PT_PT NULL +#define OPTION_VAL_370_PT_PT NULL +#define OPTION_VAL_380_PT_PT NULL +#define OPTION_VAL_390_PT_PT NULL +#define OPTION_VAL_400_PT_PT NULL +#define OPTION_VAL_410_PT_PT NULL +#define OPTION_VAL_420_PT_PT NULL +#define OPTION_VAL_430_PT_PT NULL +#define OPTION_VAL_440_PT_PT NULL +#define OPTION_VAL_450_PT_PT NULL +#define OPTION_VAL_460_PT_PT NULL +#define OPTION_VAL_470_PT_PT NULL +#define OPTION_VAL_480_PT_PT NULL +#define OPTION_VAL_490_PT_PT NULL +#define OPTION_VAL_500_PT_PT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PT_PT NULL +#define OPTION_VAL_0_PT_PT NULL +#define OPTION_VAL_5_PT_PT NULL +#define OPTION_VAL_10_PT_PT NULL +#define OPTION_VAL_15_PT_PT NULL +#define OPTION_VAL_20_PT_PT NULL +#define OPTION_VAL_25_PT_PT NULL +#define OPTION_VAL_30_PT_PT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PT_PT NULL +#define OPTION_VAL_50_PT_PT NULL +#define OPTION_VAL_60_PT_PT NULL +#define OPTION_VAL_70_PT_PT NULL +#define OPTION_VAL_80_PT_PT NULL +#define OPTION_VAL_90_PT_PT NULL +#define OPTION_VAL_100_O45_PT_PT NULL +#define OPTION_VAL_110_O45_PT_PT NULL +#define OPTION_VAL_120_O45_PT_PT NULL +#define OPTION_VAL_130_O45_PT_PT NULL +#define OPTION_VAL_140_O45_PT_PT NULL +#define OPTION_VAL_150_O45_PT_PT NULL +#define OPTION_VAL_160_O45_PT_PT NULL +#define OPTION_VAL_170_O45_PT_PT NULL +#define OPTION_VAL_180_O45_PT_PT NULL +#define OPTION_VAL_190_O45_PT_PT NULL +#define OPTION_VAL_200_O45_PT_PT NULL +#define OPTION_VAL_210_O45_PT_PT NULL +#define OPTION_VAL_220_O45_PT_PT NULL +#define OPTION_VAL_230_O45_PT_PT NULL +#define OPTION_VAL_240_O45_PT_PT NULL +#define OPTION_VAL_250_O45_PT_PT NULL +#define OPTION_VAL_260_O45_PT_PT NULL +#define OPTION_VAL_270_O45_PT_PT NULL +#define OPTION_VAL_280_O45_PT_PT NULL +#define OPTION_VAL_290_O45_PT_PT NULL +#define OPTION_VAL_300_O45_PT_PT NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_PT NULL +#define OPTION_VAL_WHITE_PT_PT NULL +#define OPTION_VAL_RED_PT_PT "Vermelho" +#define OPTION_VAL_GREEN_PT_PT "Verde" +#define OPTION_VAL_BLUE_PT_PT "Azul" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PT_PT NULL +#define OPTION_VAL_VMU_PT_PT NULL +#define OPTION_VAL_PURUPURU_PT_PT NULL +#define OPTION_VAL_NONE_PT_PT "Não partilhar" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_PT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_PT NULL +#define OPTION_VAL_VMU_A1_PT_PT NULL +#define OPTION_VAL_ALL_VMUS_PT_PT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_PT NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_PT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_PT NULL +#define OPTION_VAL_UPPER_LEFT_PT_PT NULL +#define OPTION_VAL_UPPER_RIGHT_PT_PT NULL +#define OPTION_VAL_LOWER_LEFT_PT_PT NULL +#define OPTION_VAL_LOWER_RIGHT_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_PT NULL +#define OPTION_VAL_1X_PT_PT NULL +#define OPTION_VAL_3X_PT_PT NULL +#define OPTION_VAL_5X_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_PT NULL +#define OPTION_VAL_DEFAULT_ON_00_PT_PT NULL +#define OPTION_VAL_DEFAULT_OFF_01_PT_PT NULL +#define OPTION_VAL_BLACK_02_PT_PT NULL +#define OPTION_VAL_LIGHT_BLUE_04_PT_PT NULL +#define OPTION_VAL_CYAN_06_PT_PT NULL +#define OPTION_VAL_CYAN_BLUE_07_PT_PT NULL +#define OPTION_VAL_LIGHT_GREEN_08_PT_PT NULL +#define OPTION_VAL_CYAN_GREEN_09_PT_PT NULL +#define OPTION_VAL_LIGHT_CYAN_10_PT_PT NULL +#define OPTION_VAL_PURPLE_12_PT_PT NULL +#define OPTION_VAL_LIGHT_PURPLE_13_PT_PT NULL +#define OPTION_VAL_YELLOW_14_PT_PT "Amarelo" +#define OPTION_VAL_GRAY_15_PT_PT NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_PT_PT NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_PT_PT NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_PT_PT NULL +#define OPTION_VAL_LIGHT_RED_2_20_PT_PT NULL +#define OPTION_VAL_MAGENTA_21_PT_PT NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT NULL +#define OPTION_VAL_LIGHT_ORANGE_23_PT_PT NULL +#define OPTION_VAL_ORANGE_24_PT_PT NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT NULL +#define OPTION_VAL_LIGHT_YELLOW_26_PT_PT NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_PT NULL +#define OPTION_VAL_40_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_PT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_PT NULL -struct retro_core_option_v2_category option_cats_pt_br[] = { +struct retro_core_option_v2_category option_cats_pt_pt[] = { { "system", - CATEGORY_SYSTEM_LABEL_PT_BR, - CATEGORY_SYSTEM_INFO_0_PT_BR + CATEGORY_SYSTEM_LABEL_PT_PT, + CATEGORY_SYSTEM_INFO_0_PT_PT }, { "video", - CATEGORY_VIDEO_LABEL_PT_BR, - CATEGORY_VIDEO_INFO_0_PT_BR + CATEGORY_VIDEO_LABEL_PT_PT, + CATEGORY_VIDEO_INFO_0_PT_PT }, { "performance", - CATEGORY_PERFORMANCE_LABEL_PT_BR, - CATEGORY_PERFORMANCE_INFO_0_PT_BR + CATEGORY_PERFORMANCE_LABEL_PT_PT, + CATEGORY_PERFORMANCE_INFO_0_PT_PT }, { "hacks", - CATEGORY_HACKS_LABEL_PT_BR, - CATEGORY_HACKS_INFO_0_PT_BR + CATEGORY_HACKS_LABEL_PT_PT, + CATEGORY_HACKS_INFO_0_PT_PT }, { "input", - CATEGORY_INPUT_LABEL_PT_BR, - CATEGORY_INPUT_INFO_0_PT_BR + CATEGORY_INPUT_LABEL_PT_PT, + CATEGORY_INPUT_INFO_0_PT_PT + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_PT_PT, + CATEGORY_EXPANSIONS_INFO_0_PT_PT }, { "vmu", - CATEGORY_VMU_LABEL_PT_BR, - CATEGORY_VMU_INFO_0_PT_BR + CATEGORY_VMU_LABEL_PT_PT, + CATEGORY_VMU_INFO_0_PT_PT }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_pt_br[] = { +struct retro_core_option_v2_definition option_defs_pt_pt[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_PT_BR, + CORE_OPTION_NAME_REGION_LABEL_PT_PT, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_PT_BR }, - { "USA", OPTION_VAL_USA_PT_BR }, - { "Europe", OPTION_VAL_EUROPE_PT_BR }, - { "Default", OPTION_VAL_DEFAULT_PT_BR }, + { "Japan", OPTION_VAL_JAPAN_PT_PT }, + { "USA", OPTION_VAL_USA_PT_PT }, + { "Europe", OPTION_VAL_EUROPE_PT_PT }, + { "Default", OPTION_VAL_DEFAULT_PT_PT }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_PT_BR, + CORE_OPTION_NAME_LANGUAGE_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_BR, + CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_PT, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_PT_BR }, - { "English", OPTION_VAL_ENGLISH_PT_BR }, - { "German", OPTION_VAL_GERMAN_PT_BR }, - { "French", OPTION_VAL_FRENCH_PT_BR }, - { "Spanish", OPTION_VAL_SPANISH_PT_BR }, - { "Italian", OPTION_VAL_ITALIAN_PT_BR }, - { "Default", OPTION_VAL_DEFAULT_PT_BR }, + { "Japanese", OPTION_VAL_JAPANESE_PT_PT }, + { "English", OPTION_VAL_ENGLISH_PT_PT }, + { "German", OPTION_VAL_GERMAN_PT_PT }, + { "French", OPTION_VAL_FRENCH_PT_PT }, + { "Spanish", OPTION_VAL_SPANISH_PT_PT }, + { "Italian", OPTION_VAL_ITALIAN_PT_PT }, + { "Default", OPTION_VAL_DEFAULT_PT_PT }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_BR, + CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_BR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_PT, NULL, "system", { @@ -52594,9 +62881,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_BR, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_BR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_PT, NULL, "system", { @@ -52608,9 +62895,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_BR, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_BR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_PT, NULL, "system", { @@ -52624,25 +62911,11 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_PT_BR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PT_BR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_BR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_BR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_PT, NULL, "system", { @@ -52654,9 +62927,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_BR, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_BR, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_PT, NULL, "system", { @@ -52668,9 +62941,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_BR, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_BR, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_PT, NULL, "system", { @@ -52682,9 +62955,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_PT_BR, + CORE_OPTION_NAME_UPNP_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_PT_BR, + CORE_OPTION_NAME_UPNP_INFO_0_PT_PT, NULL, "system", { @@ -52697,39 +62970,39 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_BR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_BR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_PT, NULL, "video", { - { "320x240", OPTION_VAL_320X240_PT_BR }, - { "640x480", OPTION_VAL_640X480_PT_BR }, - { "800x600", OPTION_VAL_800X600_PT_BR }, - { "960x720", OPTION_VAL_960X720_PT_BR }, - { "1024x768", OPTION_VAL_1024X768_PT_BR }, - { "1280x960", OPTION_VAL_1280X960_PT_BR }, - { "1440x1080", OPTION_VAL_1440X1080_PT_BR }, - { "1600x1200", OPTION_VAL_1600X1200_PT_BR }, - { "1920x1440", OPTION_VAL_1920X1440_PT_BR }, - { "2560x1920", OPTION_VAL_2560X1920_PT_BR }, - { "2880x2160", OPTION_VAL_2880X2160_PT_BR }, - { "3200x2400", OPTION_VAL_3200X2400_PT_BR }, - { "3840x2880", OPTION_VAL_3840X2880_PT_BR }, - { "4480x3360", OPTION_VAL_4480X3360_PT_BR }, - { "5120x3840", OPTION_VAL_5120X3840_PT_BR }, - { "5760x4320", OPTION_VAL_5760X4320_PT_BR }, - { "6400x4800", OPTION_VAL_6400X4800_PT_BR }, - { "7040x5280", OPTION_VAL_7040X5280_PT_BR }, - { "7680x5760", OPTION_VAL_7680X5760_PT_BR }, - { "8320x6240", OPTION_VAL_8320X6240_PT_BR }, - { "8960x6720", OPTION_VAL_8960X6720_PT_BR }, - { "9600x7200", OPTION_VAL_9600X7200_PT_BR }, - { "10240x7680", OPTION_VAL_10240X7680_PT_BR }, - { "10880x8160", OPTION_VAL_10880X8160_PT_BR }, - { "11520x8640", OPTION_VAL_11520X8640_PT_BR }, - { "12160x9120", OPTION_VAL_12160X9120_PT_BR }, - { "12800x9600", OPTION_VAL_12800X9600_PT_BR }, + { "320x240", OPTION_VAL_320X240_PT_PT }, + { "640x480", OPTION_VAL_640X480_PT_PT }, + { "800x600", OPTION_VAL_800X600_PT_PT }, + { "960x720", OPTION_VAL_960X720_PT_PT }, + { "1024x768", OPTION_VAL_1024X768_PT_PT }, + { "1280x960", OPTION_VAL_1280X960_PT_PT }, + { "1440x1080", OPTION_VAL_1440X1080_PT_PT }, + { "1600x1200", OPTION_VAL_1600X1200_PT_PT }, + { "1920x1440", OPTION_VAL_1920X1440_PT_PT }, + { "2560x1920", OPTION_VAL_2560X1920_PT_PT }, + { "2880x2160", OPTION_VAL_2880X2160_PT_PT }, + { "3200x2400", OPTION_VAL_3200X2400_PT_PT }, + { "3840x2880", OPTION_VAL_3840X2880_PT_PT }, + { "4480x3360", OPTION_VAL_4480X3360_PT_PT }, + { "5120x3840", OPTION_VAL_5120X3840_PT_PT }, + { "5760x4320", OPTION_VAL_5760X4320_PT_PT }, + { "6400x4800", OPTION_VAL_6400X4800_PT_PT }, + { "7040x5280", OPTION_VAL_7040X5280_PT_PT }, + { "7680x5760", OPTION_VAL_7680X5760_PT_PT }, + { "8320x6240", OPTION_VAL_8320X6240_PT_PT }, + { "8960x6720", OPTION_VAL_8960X6720_PT_PT }, + { "9600x7200", OPTION_VAL_9600X7200_PT_PT }, + { "10240x7680", OPTION_VAL_10240X7680_PT_PT }, + { "10880x8160", OPTION_VAL_10880X8160_PT_PT }, + { "11520x8640", OPTION_VAL_11520X8640_PT_PT }, + { "12160x9120", OPTION_VAL_12160X9120_PT_PT }, + { "12800x9600", OPTION_VAL_12800X9600_PT_PT }, { NULL, NULL }, }, #ifdef LOW_RES @@ -52740,62 +63013,62 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_BR, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_BR, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_PT, NULL, "video", { - { "VGA", OPTION_VAL_VGA_PT_BR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_PT_BR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PT_BR }, + { "VGA", OPTION_VAL_VGA_PT_PT }, + { "TV (RGB)", OPTION_VAL_TV_RGB_PT_PT }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PT_PT }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_PT_BR, + CORE_OPTION_NAME_BROADCAST_LABEL_PT_PT, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_PT_BR }, - { "PAL", OPTION_VAL_PAL_PT_BR }, - { "PAL_N", OPTION_VAL_PAL_N_PT_BR }, - { "PAL_M", OPTION_VAL_PAL_M_PT_BR }, - { "Default", OPTION_VAL_DEFAULT_PT_BR }, + { "NTSC", OPTION_VAL_NTSC_PT_PT }, + { "PAL", OPTION_VAL_PAL_PT_PT }, + { "PAL_N", OPTION_VAL_PAL_N_PT_PT }, + { "PAL_M", OPTION_VAL_PAL_M_PT_PT }, + { "Default", OPTION_VAL_DEFAULT_PT_PT }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_BR, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_PT, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_PT_BR }, - { "vertical", OPTION_VAL_VERTICAL_PT_BR }, + { "horizontal", OPTION_VAL_HORIZONTAL_PT_PT }, + { "vertical", OPTION_VAL_VERTICAL_PT_PT }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_BR, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_PT_PT, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_BR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PT_BR }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_PT }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PT_PT }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PT_BR }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PT_PT }, #endif { NULL, NULL }, }, @@ -52808,25 +63081,25 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_BR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_BR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_PT, NULL, "video", { - { "512MB", OPTION_VAL_512MB_PT_BR }, - { "1GB", OPTION_VAL_1GB_PT_BR }, - { "2GB", OPTION_VAL_2GB_PT_BR }, - { "4GB", OPTION_VAL_4GB_PT_BR }, + { "512MB", OPTION_VAL_512MB_PT_PT }, + { "1GB", OPTION_VAL_1GB_PT_PT }, + { "2GB", OPTION_VAL_2GB_PT_PT }, + { "4GB", OPTION_VAL_4GB_PT_PT }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_BR, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_BR, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_PT, NULL, "video", { @@ -52834,6 +63107,7 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -52842,9 +63116,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_BR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_BR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_PT, NULL, "video", { @@ -52856,9 +63130,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_BR, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_BR, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_PT, NULL, "video", { @@ -52868,11 +63142,11 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_BR, + CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_PT_PT, NULL, "video", { @@ -52884,7 +63158,7 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_PT_BR, + CORE_OPTION_NAME_FOG_LABEL_PT_PT, NULL, "", NULL, @@ -52898,9 +63172,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_BR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_BR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_PT, NULL, "video", { @@ -52912,9 +63186,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_BR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_BR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_PT, NULL, "video", { @@ -52929,24 +63203,24 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_BR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_BR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_PT, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_PT_BR }, - { "1", OPTION_VAL_1_PT_BR }, - { "2", OPTION_VAL_2_PT_BR }, + { "0", OPTION_VAL_DEFAULT_PT_PT }, + { "1", OPTION_VAL_1_PT_PT }, + { "2", OPTION_VAL_2_PT_PT }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_BR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_BR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_PT, NULL, "video", { @@ -52954,13 +63228,13 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_BR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_BR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_PT, NULL, "video", { @@ -52972,9 +63246,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_BR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_BR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_PT, NULL, "video", { @@ -52987,25 +63261,25 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_BR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_BR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_PT, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_PT_BR }, - { "4", OPTION_VAL_4_PT_BR }, - { "6", OPTION_VAL_6_PT_BR }, + { "2", OPTION_VAL_2_O26_PT_PT }, + { "4", OPTION_VAL_4_PT_PT }, + { "6", OPTION_VAL_6_PT_PT }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_BR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_PT_PT, NULL, "video", { @@ -53019,9 +63293,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_BR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_BR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_PT, NULL, "video", { @@ -53031,11 +63305,25 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_PT_PT, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_BR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_BR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_PT, NULL, "performance", { @@ -53047,15 +63335,15 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_BR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_BR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_PT, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_PT_BR }, - { "more", OPTION_VAL_MORE_PT_BR }, + { "some", OPTION_VAL_SOME_PT_PT }, + { "more", OPTION_VAL_MORE_PT_PT }, { NULL, NULL }, }, #ifdef LOW_END @@ -53066,9 +63354,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_BR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_BR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_PT, NULL, "performance", { @@ -53085,9 +63373,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_BR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_BR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_PT, NULL, "hacks", { @@ -53099,9 +63387,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_BR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_BR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_PT, NULL, "hacks", { @@ -53113,9 +63401,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_BR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_BR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_PT, NULL, "hacks", { @@ -53129,64 +63417,78 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_PT_PT, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_BR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_BR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_PT, NULL, "hacks", { - { "100", OPTION_VAL_100_PT_BR }, - { "110", OPTION_VAL_110_PT_BR }, - { "120", OPTION_VAL_120_PT_BR }, - { "130", OPTION_VAL_130_PT_BR }, - { "140", OPTION_VAL_140_PT_BR }, - { "150", OPTION_VAL_150_PT_BR }, - { "160", OPTION_VAL_160_PT_BR }, - { "170", OPTION_VAL_170_PT_BR }, - { "180", OPTION_VAL_180_PT_BR }, - { "190", OPTION_VAL_190_PT_BR }, - { "200", OPTION_VAL_200_PT_BR }, - { "210", OPTION_VAL_210_PT_BR }, - { "220", OPTION_VAL_220_PT_BR }, - { "230", OPTION_VAL_230_PT_BR }, - { "240", OPTION_VAL_240_PT_BR }, - { "250", OPTION_VAL_250_PT_BR }, - { "260", OPTION_VAL_260_PT_BR }, - { "270", OPTION_VAL_270_PT_BR }, - { "280", OPTION_VAL_280_PT_BR }, - { "290", OPTION_VAL_290_PT_BR }, - { "300", OPTION_VAL_300_PT_BR }, - { "310", OPTION_VAL_310_PT_BR }, - { "320", OPTION_VAL_320_PT_BR }, - { "330", OPTION_VAL_330_PT_BR }, - { "340", OPTION_VAL_340_PT_BR }, - { "350", OPTION_VAL_350_PT_BR }, - { "360", OPTION_VAL_360_PT_BR }, - { "370", OPTION_VAL_370_PT_BR }, - { "380", OPTION_VAL_380_PT_BR }, - { "390", OPTION_VAL_390_PT_BR }, - { "400", OPTION_VAL_400_PT_BR }, - { "410", OPTION_VAL_410_PT_BR }, - { "420", OPTION_VAL_420_PT_BR }, - { "430", OPTION_VAL_430_PT_BR }, - { "440", OPTION_VAL_440_PT_BR }, - { "450", OPTION_VAL_450_PT_BR }, - { "460", OPTION_VAL_460_PT_BR }, - { "470", OPTION_VAL_470_PT_BR }, - { "480", OPTION_VAL_480_PT_BR }, - { "490", OPTION_VAL_490_PT_BR }, - { "500", OPTION_VAL_500_PT_BR }, + { "100", OPTION_VAL_100_PT_PT }, + { "110", OPTION_VAL_110_PT_PT }, + { "120", OPTION_VAL_120_PT_PT }, + { "130", OPTION_VAL_130_PT_PT }, + { "140", OPTION_VAL_140_PT_PT }, + { "150", OPTION_VAL_150_PT_PT }, + { "160", OPTION_VAL_160_PT_PT }, + { "170", OPTION_VAL_170_PT_PT }, + { "180", OPTION_VAL_180_PT_PT }, + { "190", OPTION_VAL_190_PT_PT }, + { "200", OPTION_VAL_200_PT_PT }, + { "210", OPTION_VAL_210_PT_PT }, + { "220", OPTION_VAL_220_PT_PT }, + { "230", OPTION_VAL_230_PT_PT }, + { "240", OPTION_VAL_240_PT_PT }, + { "250", OPTION_VAL_250_PT_PT }, + { "260", OPTION_VAL_260_PT_PT }, + { "270", OPTION_VAL_270_PT_PT }, + { "280", OPTION_VAL_280_PT_PT }, + { "290", OPTION_VAL_290_PT_PT }, + { "300", OPTION_VAL_300_PT_PT }, + { "310", OPTION_VAL_310_PT_PT }, + { "320", OPTION_VAL_320_PT_PT }, + { "330", OPTION_VAL_330_PT_PT }, + { "340", OPTION_VAL_340_PT_PT }, + { "350", OPTION_VAL_350_PT_PT }, + { "360", OPTION_VAL_360_PT_PT }, + { "370", OPTION_VAL_370_PT_PT }, + { "380", OPTION_VAL_380_PT_PT }, + { "390", OPTION_VAL_390_PT_PT }, + { "400", OPTION_VAL_400_PT_PT }, + { "410", OPTION_VAL_410_PT_PT }, + { "420", OPTION_VAL_420_PT_PT }, + { "430", OPTION_VAL_430_PT_PT }, + { "440", OPTION_VAL_440_PT_PT }, + { "450", OPTION_VAL_450_PT_PT }, + { "460", OPTION_VAL_460_PT_PT }, + { "470", OPTION_VAL_470_PT_PT }, + { "480", OPTION_VAL_480_PT_PT }, + { "490", OPTION_VAL_490_PT_PT }, + { "500", OPTION_VAL_500_PT_PT }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_BR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_PT_PT, NULL, "hacks", { @@ -53196,11 +63498,11 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_BR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_PT_PT, NULL, "hacks", { @@ -53212,186 +63514,330 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_BR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_PT_PT, NULL, "input", { - { "0%", OPTION_VAL_0_PT_BR }, - { "5%", OPTION_VAL_5_PT_BR }, - { "10%", OPTION_VAL_10_PT_BR }, - { "15%", OPTION_VAL_15_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "25%", OPTION_VAL_25_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, + { "0%", OPTION_VAL_0_PT_PT }, + { "5%", OPTION_VAL_5_PT_PT }, + { "10%", OPTION_VAL_10_PT_PT }, + { "15%", OPTION_VAL_15_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "25%", OPTION_VAL_25_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { NULL, NULL }, + }, + "15%", + }, + { + CORE_OPTION_NAME "_trigger_deadzone", + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_PT_PT, + NULL, + "input", + { + { "0%", OPTION_VAL_0_PT_PT }, + { "5%", OPTION_VAL_5_PT_PT }, + { "10%", OPTION_VAL_10_PT_PT }, + { "15%", OPTION_VAL_15_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "25%", OPTION_VAL_25_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { NULL, NULL }, + }, + "0%", + }, + { + CORE_OPTION_NAME "_digital_triggers", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_PT_PT, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_PT, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, { NULL, NULL }, }, - "15%", + "disabled", + }, + { + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_PT, + NULL, + "input", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_PT_PT, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_PT_PT }, + { "60%", OPTION_VAL_60_PT_PT }, + { "70%", OPTION_VAL_70_PT_PT }, + { "80%", OPTION_VAL_80_PT_PT }, + { "90%", OPTION_VAL_90_PT_PT }, + { "100%", OPTION_VAL_100_O45_PT_PT }, + { "110%", OPTION_VAL_110_O45_PT_PT }, + { "120%", OPTION_VAL_120_O45_PT_PT }, + { "130%", OPTION_VAL_130_O45_PT_PT }, + { "140%", OPTION_VAL_140_O45_PT_PT }, + { "150%", OPTION_VAL_150_O45_PT_PT }, + { "160%", OPTION_VAL_160_O45_PT_PT }, + { "170%", OPTION_VAL_170_O45_PT_PT }, + { "180%", OPTION_VAL_180_O45_PT_PT }, + { "190%", OPTION_VAL_190_O45_PT_PT }, + { "200%", OPTION_VAL_200_O45_PT_PT }, + { "210%", OPTION_VAL_210_O45_PT_PT }, + { "220%", OPTION_VAL_220_O45_PT_PT }, + { "230%", OPTION_VAL_230_O45_PT_PT }, + { "240%", OPTION_VAL_240_O45_PT_PT }, + { "250%", OPTION_VAL_250_O45_PT_PT }, + { "260%", OPTION_VAL_260_O45_PT_PT }, + { "270%", OPTION_VAL_270_O45_PT_PT }, + { "280%", OPTION_VAL_280_O45_PT_PT }, + { "290%", OPTION_VAL_290_O45_PT_PT }, + { "300%", OPTION_VAL_300_O45_PT_PT }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_lightgun1_crosshair", + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_PT, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_PT_PT }, + { "Red", OPTION_VAL_RED_PT_PT }, + { "Green", OPTION_VAL_GREEN_PT_PT }, + { "Blue", OPTION_VAL_BLUE_PT_PT }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun2_crosshair", + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_PT, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_PT_PT }, + { "Red", OPTION_VAL_RED_PT_PT }, + { "Green", OPTION_VAL_GREEN_PT_PT }, + { "Blue", OPTION_VAL_BLUE_PT_PT }, + { NULL, NULL }, + }, + "disabled", }, { - CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_BR, + CORE_OPTION_NAME "_lightgun3_crosshair", + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_PT, NULL, "", NULL, "input", { - { "0%", OPTION_VAL_0_PT_BR }, - { "5%", OPTION_VAL_5_PT_BR }, - { "10%", OPTION_VAL_10_PT_BR }, - { "15%", OPTION_VAL_15_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "25%", OPTION_VAL_25_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, - { NULL, NULL }, + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_PT_PT }, + { "Red", OPTION_VAL_RED_PT_PT }, + { "Green", OPTION_VAL_GREEN_PT_PT }, + { "Blue", OPTION_VAL_BLUE_PT_PT }, + { NULL, NULL }, }, - "0%", + "disabled", }, { - CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_BR, + CORE_OPTION_NAME "_lightgun4_crosshair", + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_PT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, + { "White", OPTION_VAL_WHITE_PT_PT }, + { "Red", OPTION_VAL_RED_PT_PT }, + { "Green", OPTION_VAL_GREEN_PT_PT }, + { "Blue", OPTION_VAL_BLUE_PT_PT }, + { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PT_BR, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, { NULL, NULL }, }, - "enabled", + "VMU", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_BR, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_PT_PT, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_BR, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_BR }, - { "Red", OPTION_VAL_RED_PT_BR }, - { "Green", OPTION_VAL_GREEN_PT_BR }, - { "Blue", OPTION_VAL_BLUE_PT_BR }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_BR }, - { "Red", OPTION_VAL_RED_PT_BR }, - { "Green", OPTION_VAL_GREEN_PT_BR }, - { "Blue", OPTION_VAL_BLUE_PT_BR }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_BR }, - { "Red", OPTION_VAL_RED_PT_BR }, - { "Green", OPTION_VAL_GREEN_PT_BR }, - { "Blue", OPTION_VAL_BLUE_PT_BR }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_BR, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_PT_PT, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_PT_PT, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_BR }, - { "Red", OPTION_VAL_RED_PT_BR }, - { "Green", OPTION_VAL_GREEN_PT_BR }, - { "Blue", OPTION_VAL_BLUE_PT_BR }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, }, - "disabled", + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_PT_PT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_PT_PT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_PT_PT }, + { "Purupuru", OPTION_VAL_PURUPURU_PT_PT }, + { "None", OPTION_VAL_NONE_PT_PT }, + { NULL, NULL }, + }, + "Purupuru", }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_BR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_BR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_BR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_PT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_PT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_PT, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_PT_BR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_PT_BR }, + { "VMU A1", OPTION_VAL_VMU_A1_PT_PT }, + { "All VMUs", OPTION_VAL_ALL_VMUS_PT_PT }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_BR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_BR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_BR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_PT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_PT, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_PT, NULL, "vmu", { @@ -53402,9 +63848,9 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_BR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_BR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_BR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_PT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_PT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_PT, NULL, "vmu", { @@ -53416,7 +63862,7 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_PT, NULL, "", NULL, @@ -53430,144 +63876,144 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_BR }, - { "2x", OPTION_VAL_2_O27_PT_BR }, - { "3x", OPTION_VAL_3X_PT_BR }, - { "4x", OPTION_VAL_4_PT_BR }, - { "5x", OPTION_VAL_5X_PT_BR }, + { "1x", OPTION_VAL_1X_PT_PT }, + { "2x", OPTION_VAL_2_O26_PT_PT }, + { "3x", OPTION_VAL_3X_PT_PT }, + { "4x", OPTION_VAL_4_PT_PT }, + { "5x", OPTION_VAL_5X_PT_PT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, - { "40%", OPTION_VAL_40_PT_BR }, - { "50%", OPTION_VAL_50_PT_BR }, - { "60%", OPTION_VAL_60_PT_BR }, - { "70%", OPTION_VAL_70_PT_BR }, - { "80%", OPTION_VAL_80_PT_BR }, - { "90%", OPTION_VAL_90_PT_BR }, - { "100%", OPTION_VAL_100_O57_PT_BR }, + { "10%", OPTION_VAL_10_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { "40%", OPTION_VAL_40_PT_PT }, + { "50%", OPTION_VAL_50_PT_PT }, + { "60%", OPTION_VAL_60_PT_PT }, + { "70%", OPTION_VAL_70_PT_PT }, + { "80%", OPTION_VAL_80_PT_PT }, + { "90%", OPTION_VAL_90_PT_PT }, + { "100%", OPTION_VAL_100_O45_PT_PT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_PT, NULL, "", NULL, @@ -53581,144 +64027,144 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_BR }, - { "2x", OPTION_VAL_2_O27_PT_BR }, - { "3x", OPTION_VAL_3X_PT_BR }, - { "4x", OPTION_VAL_4_PT_BR }, - { "5x", OPTION_VAL_5X_PT_BR }, + { "1x", OPTION_VAL_1X_PT_PT }, + { "2x", OPTION_VAL_2_O26_PT_PT }, + { "3x", OPTION_VAL_3X_PT_PT }, + { "4x", OPTION_VAL_4_PT_PT }, + { "5x", OPTION_VAL_5X_PT_PT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, - { "40%", OPTION_VAL_40_PT_BR }, - { "50%", OPTION_VAL_50_PT_BR }, - { "60%", OPTION_VAL_60_PT_BR }, - { "70%", OPTION_VAL_70_PT_BR }, - { "80%", OPTION_VAL_80_PT_BR }, - { "90%", OPTION_VAL_90_PT_BR }, - { "100%", OPTION_VAL_100_O57_PT_BR }, + { "10%", OPTION_VAL_10_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { "40%", OPTION_VAL_40_PT_PT }, + { "50%", OPTION_VAL_50_PT_PT }, + { "60%", OPTION_VAL_60_PT_PT }, + { "70%", OPTION_VAL_70_PT_PT }, + { "80%", OPTION_VAL_80_PT_PT }, + { "90%", OPTION_VAL_90_PT_PT }, + { "100%", OPTION_VAL_100_O45_PT_PT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_PT, NULL, "", NULL, @@ -53732,144 +64178,144 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_BR }, - { "2x", OPTION_VAL_2_O27_PT_BR }, - { "3x", OPTION_VAL_3X_PT_BR }, - { "4x", OPTION_VAL_4_PT_BR }, - { "5x", OPTION_VAL_5X_PT_BR }, + { "1x", OPTION_VAL_1X_PT_PT }, + { "2x", OPTION_VAL_2_O26_PT_PT }, + { "3x", OPTION_VAL_3X_PT_PT }, + { "4x", OPTION_VAL_4_PT_PT }, + { "5x", OPTION_VAL_5X_PT_PT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_PT, NULL, "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, - { "40%", OPTION_VAL_40_PT_BR }, - { "50%", OPTION_VAL_50_PT_BR }, - { "60%", OPTION_VAL_60_PT_BR }, - { "70%", OPTION_VAL_70_PT_BR }, - { "80%", OPTION_VAL_80_PT_BR }, - { "90%", OPTION_VAL_90_PT_BR }, - { "100%", OPTION_VAL_100_O57_PT_BR }, + { "10%", OPTION_VAL_10_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { "40%", OPTION_VAL_40_PT_PT }, + { "50%", OPTION_VAL_50_PT_PT }, + { "60%", OPTION_VAL_60_PT_PT }, + { "70%", OPTION_VAL_70_PT_PT }, + { "80%", OPTION_VAL_80_PT_PT }, + { "90%", OPTION_VAL_90_PT_PT }, + { "100%", OPTION_VAL_100_O45_PT_PT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_PT, NULL, "", NULL, @@ -53883,505 +64329,560 @@ struct retro_core_option_v2_definition option_defs_pt_br[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_BR, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_BR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_BR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_BR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_BR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_BR, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_BR }, - { "2x", OPTION_VAL_2_O27_PT_BR }, - { "3x", OPTION_VAL_3X_PT_BR }, - { "4x", OPTION_VAL_4_PT_BR }, - { "5x", OPTION_VAL_5X_PT_BR }, + { "1x", OPTION_VAL_1X_PT_PT }, + { "2x", OPTION_VAL_2_O26_PT_PT }, + { "3x", OPTION_VAL_3X_PT_PT }, + { "4x", OPTION_VAL_4_PT_PT }, + { "5x", OPTION_VAL_5X_PT_PT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_BR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, - { NULL, NULL }, - }, - "DEFAULT_ON 00", - }, - { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_BR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_BR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_BR }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_BR }, - { "BLUE 03", OPTION_VAL_BLUE_PT_BR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_BR }, - { "GREEN 05", OPTION_VAL_GREEN_PT_BR }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_BR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_BR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_BR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_BR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_BR }, - { "RED 11", OPTION_VAL_RED_PT_BR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_BR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_BR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_BR }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_BR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_BR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_BR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_BR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_BR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_BR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_BR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_BR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_BR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_BR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_BR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_BR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_BR }, - { "WHITE 28", OPTION_VAL_WHITE_PT_BR }, - { NULL, NULL }, - }, - "DEFAULT_OFF 01", - }, - { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_BR, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_PT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_BR }, - { "20%", OPTION_VAL_20_PT_BR }, - { "30%", OPTION_VAL_30_PT_BR }, - { "40%", OPTION_VAL_40_PT_BR }, - { "50%", OPTION_VAL_50_PT_BR }, - { "60%", OPTION_VAL_60_PT_BR }, - { "70%", OPTION_VAL_70_PT_BR }, - { "80%", OPTION_VAL_80_PT_BR }, - { "90%", OPTION_VAL_90_PT_BR }, - { "100%", OPTION_VAL_100_O57_PT_BR }, - { NULL, NULL }, - }, - "100%", - }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_pt_br = { - option_cats_pt_br, - option_defs_pt_br -}; - -/* RETRO_LANGUAGE_PT_PT */ - -#define CATEGORY_SYSTEM_LABEL_PT_PT NULL -#define CATEGORY_SYSTEM_INFO_0_PT_PT NULL -#define CATEGORY_VIDEO_LABEL_PT_PT "Vídeo" -#define CATEGORY_VIDEO_INFO_0_PT_PT NULL -#define CATEGORY_PERFORMANCE_LABEL_PT_PT NULL -#define CATEGORY_PERFORMANCE_INFO_0_PT_PT NULL -#define CATEGORY_HACKS_LABEL_PT_PT NULL -#define CATEGORY_HACKS_INFO_0_PT_PT NULL -#define CATEGORY_INPUT_LABEL_PT_PT "Entrada" -#define CATEGORY_INPUT_INFO_0_PT_PT NULL -#define CATEGORY_VMU_LABEL_PT_PT NULL -#define CATEGORY_VMU_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_REGION_LABEL_PT_PT NULL -#define OPTION_VAL_JAPAN_PT_PT NULL -#define OPTION_VAL_USA_PT_PT NULL -#define OPTION_VAL_EUROPE_PT_PT NULL -#define OPTION_VAL_DEFAULT_PT_PT NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_PT_PT "Idioma" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_PT NULL -#define OPTION_VAL_JAPANESE_PT_PT "Japonês" -#define OPTION_VAL_ENGLISH_PT_PT "Inglês" -#define OPTION_VAL_GERMAN_PT_PT "Alemão" -#define OPTION_VAL_FRENCH_PT_PT "Francês" -#define OPTION_VAL_SPANISH_PT_PT "Espanhol" -#define OPTION_VAL_ITALIAN_PT_PT "Italiano" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_UPNP_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_PT NULL -#define OPTION_VAL_320X240_PT_PT NULL -#define OPTION_VAL_640X480_PT_PT NULL -#define OPTION_VAL_800X600_PT_PT NULL -#define OPTION_VAL_960X720_PT_PT NULL -#define OPTION_VAL_1024X768_PT_PT NULL -#define OPTION_VAL_1280X960_PT_PT NULL -#define OPTION_VAL_1440X1080_PT_PT NULL -#define OPTION_VAL_1600X1200_PT_PT NULL -#define OPTION_VAL_1920X1440_PT_PT NULL -#define OPTION_VAL_2560X1920_PT_PT NULL -#define OPTION_VAL_2880X2160_PT_PT NULL -#define OPTION_VAL_3200X2400_PT_PT NULL -#define OPTION_VAL_3840X2880_PT_PT NULL -#define OPTION_VAL_4480X3360_PT_PT NULL -#define OPTION_VAL_5120X3840_PT_PT NULL -#define OPTION_VAL_5760X4320_PT_PT NULL -#define OPTION_VAL_6400X4800_PT_PT NULL -#define OPTION_VAL_7040X5280_PT_PT NULL -#define OPTION_VAL_7680X5760_PT_PT NULL -#define OPTION_VAL_8320X6240_PT_PT NULL -#define OPTION_VAL_8960X6720_PT_PT NULL -#define OPTION_VAL_9600X7200_PT_PT NULL -#define OPTION_VAL_10240X7680_PT_PT NULL -#define OPTION_VAL_10880X8160_PT_PT NULL -#define OPTION_VAL_11520X8640_PT_PT NULL -#define OPTION_VAL_12160X9120_PT_PT NULL -#define OPTION_VAL_12800X9600_PT_PT NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_PT NULL -#define OPTION_VAL_VGA_PT_PT NULL -#define OPTION_VAL_TV_RGB_PT_PT NULL -#define OPTION_VAL_TV_COMPOSITE_PT_PT NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_PT_PT NULL -#define OPTION_VAL_NTSC_PT_PT NULL -#define OPTION_VAL_PAL_PT_PT NULL -#define OPTION_VAL_PAL_N_PT_PT NULL -#define OPTION_VAL_PAL_M_PT_PT NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_PT "Orientação do ecrã" -#define OPTION_VAL_HORIZONTAL_PT_PT NULL -#define OPTION_VAL_VERTICAL_PT_PT NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_PT NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_PT NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_PT_PT NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_PT_PT NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_PT NULL -#define OPTION_VAL_512MB_PT_PT NULL -#define OPTION_VAL_1GB_PT_PT NULL -#define OPTION_VAL_2GB_PT_PT NULL -#define OPTION_VAL_4GB_PT_PT NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_FOG_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_PT NULL -#define OPTION_VAL_1_PT_PT NULL -#define OPTION_VAL_2_PT_PT NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_PT NULL -#define OPTION_VAL_2_O27_PT_PT NULL -#define OPTION_VAL_4_PT_PT NULL -#define OPTION_VAL_6_PT_PT NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_PT NULL -#define OPTION_VAL_SOME_PT_PT NULL -#define OPTION_VAL_MORE_PT_PT NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_PT NULL -#define OPTION_VAL_100_PT_PT NULL -#define OPTION_VAL_110_PT_PT NULL -#define OPTION_VAL_120_PT_PT NULL -#define OPTION_VAL_130_PT_PT NULL -#define OPTION_VAL_140_PT_PT NULL -#define OPTION_VAL_150_PT_PT NULL -#define OPTION_VAL_160_PT_PT NULL -#define OPTION_VAL_170_PT_PT NULL -#define OPTION_VAL_180_PT_PT NULL -#define OPTION_VAL_190_PT_PT NULL -#define OPTION_VAL_200_PT_PT NULL -#define OPTION_VAL_210_PT_PT NULL -#define OPTION_VAL_220_PT_PT NULL -#define OPTION_VAL_230_PT_PT NULL -#define OPTION_VAL_240_PT_PT NULL -#define OPTION_VAL_250_PT_PT NULL -#define OPTION_VAL_260_PT_PT NULL -#define OPTION_VAL_270_PT_PT NULL -#define OPTION_VAL_280_PT_PT NULL -#define OPTION_VAL_290_PT_PT NULL -#define OPTION_VAL_300_PT_PT NULL -#define OPTION_VAL_310_PT_PT NULL -#define OPTION_VAL_320_PT_PT NULL -#define OPTION_VAL_330_PT_PT NULL -#define OPTION_VAL_340_PT_PT NULL -#define OPTION_VAL_350_PT_PT NULL -#define OPTION_VAL_360_PT_PT NULL -#define OPTION_VAL_370_PT_PT NULL -#define OPTION_VAL_380_PT_PT NULL -#define OPTION_VAL_390_PT_PT NULL -#define OPTION_VAL_400_PT_PT NULL -#define OPTION_VAL_410_PT_PT NULL -#define OPTION_VAL_420_PT_PT NULL -#define OPTION_VAL_430_PT_PT NULL -#define OPTION_VAL_440_PT_PT NULL -#define OPTION_VAL_450_PT_PT NULL -#define OPTION_VAL_460_PT_PT NULL -#define OPTION_VAL_470_PT_PT NULL -#define OPTION_VAL_480_PT_PT NULL -#define OPTION_VAL_490_PT_PT NULL -#define OPTION_VAL_500_PT_PT NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_PT NULL -#define OPTION_VAL_0_PT_PT NULL -#define OPTION_VAL_5_PT_PT NULL -#define OPTION_VAL_10_PT_PT NULL -#define OPTION_VAL_15_PT_PT NULL -#define OPTION_VAL_20_PT_PT NULL -#define OPTION_VAL_25_PT_PT NULL -#define OPTION_VAL_30_PT_PT NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_PT NULL -#define OPTION_VAL_WHITE_PT_PT NULL -#define OPTION_VAL_RED_PT_PT "Vermelho" -#define OPTION_VAL_GREEN_PT_PT "Verde" -#define OPTION_VAL_BLUE_PT_PT "Azul" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_PT NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_PT NULL -#define OPTION_VAL_VMU_A1_PT_PT NULL -#define OPTION_VAL_ALL_VMUS_PT_PT NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_PT NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_PT NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_PT NULL -#define OPTION_VAL_UPPER_LEFT_PT_PT NULL -#define OPTION_VAL_UPPER_RIGHT_PT_PT NULL -#define OPTION_VAL_LOWER_LEFT_PT_PT NULL -#define OPTION_VAL_LOWER_RIGHT_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_PT NULL -#define OPTION_VAL_1X_PT_PT NULL -#define OPTION_VAL_3X_PT_PT NULL -#define OPTION_VAL_5X_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_PT NULL -#define OPTION_VAL_DEFAULT_ON_00_PT_PT NULL -#define OPTION_VAL_DEFAULT_OFF_01_PT_PT NULL -#define OPTION_VAL_BLACK_02_PT_PT NULL -#define OPTION_VAL_LIGHT_BLUE_04_PT_PT NULL -#define OPTION_VAL_CYAN_06_PT_PT NULL -#define OPTION_VAL_CYAN_BLUE_07_PT_PT NULL -#define OPTION_VAL_LIGHT_GREEN_08_PT_PT NULL -#define OPTION_VAL_CYAN_GREEN_09_PT_PT NULL -#define OPTION_VAL_LIGHT_CYAN_10_PT_PT NULL -#define OPTION_VAL_PURPLE_12_PT_PT NULL -#define OPTION_VAL_LIGHT_PURPLE_13_PT_PT NULL -#define OPTION_VAL_YELLOW_14_PT_PT "Amarelo" -#define OPTION_VAL_GRAY_15_PT_PT NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_PT_PT NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_PT_PT NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_PT_PT NULL -#define OPTION_VAL_LIGHT_RED_2_20_PT_PT NULL -#define OPTION_VAL_MAGENTA_21_PT_PT NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT NULL -#define OPTION_VAL_LIGHT_ORANGE_23_PT_PT NULL -#define OPTION_VAL_ORANGE_24_PT_PT NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT NULL -#define OPTION_VAL_LIGHT_YELLOW_26_PT_PT NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_PT NULL -#define OPTION_VAL_40_PT_PT NULL -#define OPTION_VAL_50_PT_PT NULL -#define OPTION_VAL_60_PT_PT NULL -#define OPTION_VAL_70_PT_PT NULL -#define OPTION_VAL_80_PT_PT NULL -#define OPTION_VAL_90_PT_PT NULL -#define OPTION_VAL_100_O57_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_PT NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_PT NULL + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_PT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, + { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, + { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, + { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, + { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, + { "RED 11", OPTION_VAL_RED_PT_PT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, + { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, + { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_PT, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_PT_PT }, + { "20%", OPTION_VAL_20_PT_PT }, + { "30%", OPTION_VAL_30_PT_PT }, + { "40%", OPTION_VAL_40_PT_PT }, + { "50%", OPTION_VAL_50_PT_PT }, + { "60%", OPTION_VAL_60_PT_PT }, + { "70%", OPTION_VAL_70_PT_PT }, + { "80%", OPTION_VAL_80_PT_PT }, + { "90%", OPTION_VAL_90_PT_PT }, + { "100%", OPTION_VAL_100_O45_PT_PT }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_pt_pt = { + option_cats_pt_pt, + option_defs_pt_pt +}; -struct retro_core_option_v2_category option_cats_pt_pt[] = { +/* RETRO_LANGUAGE_RU */ + +#define CATEGORY_SYSTEM_LABEL_RU "Системные" +#define CATEGORY_SYSTEM_INFO_0_RU "Настройка региона, языка, BIOS и основных параметров оборудования." +#define CATEGORY_VIDEO_LABEL_RU "Видео" +#define CATEGORY_VIDEO_INFO_0_RU "Настройки разрешения, порядко-независимой прозрачности и визуальных эффектов." +#define CATEGORY_PERFORMANCE_LABEL_RU "Производительность" +#define CATEGORY_PERFORMANCE_INFO_0_RU "Настройки многопоточного рендеринга и пропуска кадров." +#define CATEGORY_HACKS_LABEL_RU "Хаки эмуляции" +#define CATEGORY_HACKS_INFO_0_RU "Настройки широкоформатных чит-кодов, скорости загрузки GD-ROM и замены текстур." +#define CATEGORY_INPUT_LABEL_RU "Ввод" +#define CATEGORY_INPUT_INFO_0_RU "Настройки геймпада и светового пистолета." +#define CATEGORY_EXPANSIONS_LABEL_RU "Модули расширения контроллеров" +#define CATEGORY_EXPANSIONS_INFO_0_RU "Выбор устройства (VMU, вибропак), подключенного к слотам расширения контроллеров." +#define CATEGORY_VMU_LABEL_RU "Визуальные карты памяти" +#define CATEGORY_VMU_INFO_0_RU "Настройки файлов сохранений VMU для каждой игры и отображения VMU на экране." +#define CORE_OPTION_NAME_REGION_LABEL_RU "Регион" +#define OPTION_VAL_JAPAN_RU "Япония" +#define OPTION_VAL_USA_RU "США" +#define OPTION_VAL_EUROPE_RU "Европа" +#define OPTION_VAL_DEFAULT_RU "По умолчанию" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_RU "Язык" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_RU "Выбор языка, используемого в BIOS, а также в любых играх с поддержкой нескольких языков." +#define OPTION_VAL_JAPANESE_RU "Японский" +#define OPTION_VAL_ENGLISH_RU "Английский" +#define OPTION_VAL_GERMAN_RU "Немецкий" +#define OPTION_VAL_FRENCH_RU "Французский" +#define OPTION_VAL_SPANISH_RU "Испанский" +#define OPTION_VAL_ITALIAN_RU "Итальянский" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_RU "Эмуляция BIOS (требуется перезапуск)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_RU "Принудительно использовать высокоуровневую эмуляцию BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_RU "Загрузка в BIOS (требуется перезапуск)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_RU "Загружаться непосредственно в меню BIOS Dreamcast." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_RU "Включить DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_RU "Включить эмуляцию звукового DSP (цифрового сигнального процессора) Dreamcast. Улучшает точность генерируемого звука, но повышает системные требования." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_RU "Разрешать сервисные кнопки аркадных игр" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_RU "Включает кнопку SERVICE для входа в настройки автоматов аркадных игр." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_RU "Режим Free Play для игр NAOMI" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_RU "Изменять настройки монетизации для включения бесплатной игры." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_RU "Эмуляция Broadband Adapter" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_RU "Эмулировать вместо модема широкополосный Ethernet-адаптер (требуется перезапуск)." +#define CORE_OPTION_NAME_UPNP_LABEL_RU "Включить UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_RU "Использовать UPnP для автоматической настройки вашего Интернет-роутера для онлайн-игр." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_RU "Внутреннее разрешение" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_RU "Настройка разрешения рендеринга." +#define OPTION_VAL_320X240_RU "320x240 (половина)" +#define OPTION_VAL_640X480_RU "640x480 (исходное)" +#define OPTION_VAL_800X600_RU NULL +#define OPTION_VAL_960X720_RU NULL +#define OPTION_VAL_1024X768_RU NULL +#define OPTION_VAL_1280X960_RU NULL +#define OPTION_VAL_1440X1080_RU NULL +#define OPTION_VAL_1600X1200_RU NULL +#define OPTION_VAL_1920X1440_RU NULL +#define OPTION_VAL_2560X1920_RU NULL +#define OPTION_VAL_2880X2160_RU NULL +#define OPTION_VAL_3200X2400_RU NULL +#define OPTION_VAL_3840X2880_RU NULL +#define OPTION_VAL_4480X3360_RU NULL +#define OPTION_VAL_5120X3840_RU NULL +#define OPTION_VAL_5760X4320_RU NULL +#define OPTION_VAL_6400X4800_RU NULL +#define OPTION_VAL_7040X5280_RU NULL +#define OPTION_VAL_7680X5760_RU NULL +#define OPTION_VAL_8320X6240_RU NULL +#define OPTION_VAL_8960X6720_RU NULL +#define OPTION_VAL_9600X7200_RU NULL +#define OPTION_VAL_10240X7680_RU NULL +#define OPTION_VAL_10880X8160_RU NULL +#define OPTION_VAL_11520X8640_RU NULL +#define OPTION_VAL_12160X9120_RU NULL +#define OPTION_VAL_12800X9600_RU NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU "Тип кабеля" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выходного сигнала. 'ТВ (композит)' является наиболее совместимым." +#define OPTION_VAL_VGA_RU NULL +#define OPTION_VAL_TV_RGB_RU "ТВ (RGB)" +#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композит)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_RU "Стандарт вещания" +#define OPTION_VAL_NTSC_RU NULL +#define OPTION_VAL_PAL_RU "PAL (Мир)" +#define OPTION_VAL_PAL_N_RU "PAL-N (Аргентина, Парагвай, Уругвай)" +#define OPTION_VAL_PAL_M_RU "PAL-M (Бразилия)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_RU "Ориентация экрана" +#define OPTION_VAL_HORIZONTAL_RU "Горизонтальная" +#define OPTION_VAL_VERTICAL_RU "Вертикальная" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU "Альфа-сортировка" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_RU "Выбор способа сортировки прозрачных полигонов." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самая быстрая, наименее точная)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (стандартная)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (точная, самая медленная)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU "Размер накопительного буфера пикселей" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU "Большие значения могут требоваться для правильного отображения высоких разрешений." +#define OPTION_VAL_512MB_RU "512 МБ" +#define OPTION_VAL_1GB_RU "1 ГБ" +#define OPTION_VAL_2GB_RU "2 ГБ" +#define OPTION_VAL_4GB_RU "4 ГБ" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_RU "Максимум прозрачных слоёв" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_RU "Для сложных сцен могут потребоваться более высокие значения." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU "Полная эмуляция фреймбуфера" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU "Включает полную эмуляцию кадрового буфера в VRAM. Полезно для игр, которые напрямую производят чтение или запись фреймбуфера в VRAM. При включении внутреннее разрешение будет принудительно установлено в 640x480 и возможно сильное падение скорости." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU "Включить буфер рендера в текстуру" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU "Копирует отрисованные текстуры из GPU обратно в VRAM. Данная настройка обычно включена для игр, которые этого требуют. При включении не используется масштабирование рендеринга текстур и возможно падение производительности." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_RU "MIP-текстурирование" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_RU "Может повысить производительность и снизить мерцание при отображении на расстоянии уменьшенных копий текстур." +#define CORE_OPTION_NAME_FOG_LABEL_RU "Эффекты тумана" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU "Модификатор объема" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU "Функция графического процессора Dreamcast, используемая в играх для отрисовки теней объектов. По умолчанию должно быть включено - влияние на производительность обычно минимально или незначительно." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU "Анизотропная фильтрация" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU "Улучшает качество текстур на поверхностях под непрямыми углами обзора по отношению к камере. Более высокие значения повышают требования к GPU. Изменения настройки вступают в силу при перезапуске." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Сглаживание текстур" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU "Выбор метода сглаживания текстур. Используется для принудительной фильтрации всех текстур, чтобы получить более чёткое (или сглаженное) изображение. Любое значение, отличное от стандартного может приводить к ошибкам рендеринга. Для применения настройки требуется перезапуск." +#define OPTION_VAL_1_RU "Принудительно методом ближ. соседа" +#define OPTION_VAL_2_RU "Принудительно линейное" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU "Задержка замены кадров" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избежать мерцания экрана или искажения заставок. Не рекомендуется на медленных платформах." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU "Определять изменение частоты кадров" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU "Уведомлять фронтенд об изменениях внутренней частоты кадров (напр. с 60 до 30 к/с). Улучшает распределение кадров в играх с постоянной частотой в 30 или 20 к/с, но должно быть выключено для игр с плавающим значением частоты кадров (напр. Ecco the Dolphin, Unreal Tournament). Недоступно при вкл. опции 'Автопропуск кадров'." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU "Фильтр постобработки PowerVR2" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU "Включает постобработку изображения для имитации эффектов графического процессора PowerVR2 и аналоговых видеосигналов." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU "Апскейлинг текстур (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_RU "Улучшает 2D пиксель-арт с ручной отрисовкой. Рекомендуется только для 2D-игр с пиксельной графикой." +#define OPTION_VAL_2_O26_RU NULL +#define OPTION_VAL_4_RU NULL +#define OPTION_VAL_6_RU NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU "Макс. размер сглаженных текстур при апскейлинге" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_RU "Установка максимального размера текстур при масштабировании. Для текстур с размером больше заданного значения масштабирование не применяется." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU "Нативная глубина интерполяции" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU "Помогает при проблемах с глубиной и искажением текстур на видеокартах AMD. В ряде случаев также устраняет проблемы на видеокартах Intel." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_RU "Исправление просачивания при апскейлинге" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_RU "Помогает в случае просачивания текстур при масштабировании. Отключение помогает исправить искажения пикселей при апскейлинге 2D-игр (MVC2, CVS, KOF и др.)." +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU "Рендеринг в отдельном потоке" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU "Запускает графический и центральный процессоры в разных потоках. Настоятельно рекомендуется." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU "Автопропуск кадров" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU "Автоматически пропускать кадры при замедлении эмулятора. Применяется только с вкл. опцией 'Рендеринг в отдельном потоке'." +#define OPTION_VAL_SOME_RU "Нормально" +#define OPTION_VAL_MORE_RU "Максимум" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU "Пропуск кадров" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU "Устанавливает количество кадров пропуска между отображаемыми кадрами." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU "Широкоэкранные чит-коды (требуется перезапуск)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_RU "Включает чит-коды для отображения некоторых игр в широкоэкранном формате." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_RU "Широкоэкранный хак" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_RU "Отрисовывать геометрию за пределами стандартного соотношения 4:3. Может вызвать искажения графики в расширенной области." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_RU "Быстрая загрузка GD-ROM (неточно)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_RU "Ускоряет загрузку GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_RU "Мод Dreamcast на 32 Мбайт ОЗУ" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_RU "Вкл. мод для Dreamcast на 32 мегабайта ОЗУ. Может влиять на совместимость." +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_RU "Разгон/замедление SH4" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_RU "Изменение стандартной частоты процессора SH4 в 200 МГц. Снижение частоты помогает для слабых платформ. Разгон может повышать частоту кадров в некоторых играх. Используйте с осторожностью." +#define OPTION_VAL_100_RU "100 МГц" +#define OPTION_VAL_110_RU "110 МГц" +#define OPTION_VAL_120_RU "120 МГц" +#define OPTION_VAL_130_RU "130 МГц" +#define OPTION_VAL_140_RU "140 МГц" +#define OPTION_VAL_150_RU "150 МГц" +#define OPTION_VAL_160_RU "160 МГц" +#define OPTION_VAL_170_RU "170 МГц" +#define OPTION_VAL_180_RU "180 МГц" +#define OPTION_VAL_190_RU "190 МГц" +#define OPTION_VAL_200_RU "200 МГц" +#define OPTION_VAL_210_RU "210 МГц" +#define OPTION_VAL_220_RU "220 МГц" +#define OPTION_VAL_230_RU "230 МГц" +#define OPTION_VAL_240_RU "240 МГц" +#define OPTION_VAL_250_RU "250 МГц" +#define OPTION_VAL_260_RU "260 МГц" +#define OPTION_VAL_270_RU "270 МГц" +#define OPTION_VAL_280_RU "280 МГц" +#define OPTION_VAL_290_RU "290 МГц" +#define OPTION_VAL_300_RU "300 МГц" +#define OPTION_VAL_310_RU "310 МГц" +#define OPTION_VAL_320_RU "320 МГц" +#define OPTION_VAL_330_RU "330 МГц" +#define OPTION_VAL_340_RU "340 МГц" +#define OPTION_VAL_350_RU "350 МГц" +#define OPTION_VAL_360_RU "360 МГц" +#define OPTION_VAL_370_RU "370 МГц" +#define OPTION_VAL_380_RU "380 МГц" +#define OPTION_VAL_390_RU "390 МГц" +#define OPTION_VAL_400_RU "400 МГц" +#define OPTION_VAL_410_RU "410 МГц" +#define OPTION_VAL_420_RU "420 МГц" +#define OPTION_VAL_430_RU "430 МГц" +#define OPTION_VAL_440_RU "440 МГц" +#define OPTION_VAL_450_RU "450 МГц" +#define OPTION_VAL_460_RU "460 МГц" +#define OPTION_VAL_470_RU "470 МГц" +#define OPTION_VAL_480_RU "480 МГц" +#define OPTION_VAL_490_RU "490 МГц" +#define OPTION_VAL_500_RU "500 МГц" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_RU "Загружать внешние текстуры" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_RU "Загружать пользовательские текстуры из папки 'system/dc/textures//'." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_RU "Дамп текстур" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_RU "При каждом использовании игрой новой текстуры она будет сохраняться в файл .png в папке 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_RU "Мёртвая зона аналогового стика" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_RU "Настройка величины отклонения аналогового джойстика для срабатывания." +#define OPTION_VAL_0_RU NULL +#define OPTION_VAL_5_RU NULL +#define OPTION_VAL_10_RU NULL +#define OPTION_VAL_15_RU NULL +#define OPTION_VAL_20_RU NULL +#define OPTION_VAL_25_RU NULL +#define OPTION_VAL_30_RU NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU "Мёртвая зона триггеров" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_RU "Настройка степени нажатия триггеров для срабатывания." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU "Цифровые триггеры" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_RU "При включении триггеры будут обрабатываться как стандартные кнопки, полностью нажатые либо не нажатые, без промежуточных положений." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU "Транслировать цифровые сигналы" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU "Транслировать события цифрового ввода и состояние вибрации в TCP-порт 8000. Совместимо с параметром MAME \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU "Показывать настройки свет. пистолета" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU "Включает конфигурацию параметров прицела светового пистолета. Для применения настройки требуется переключить быстрое меню." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_RU "Масштабирование прицела" +#define OPTION_VAL_50_RU NULL +#define OPTION_VAL_60_RU NULL +#define OPTION_VAL_70_RU NULL +#define OPTION_VAL_80_RU NULL +#define OPTION_VAL_90_RU NULL +#define OPTION_VAL_100_O45_RU NULL +#define OPTION_VAL_110_O45_RU NULL +#define OPTION_VAL_120_O45_RU NULL +#define OPTION_VAL_130_O45_RU NULL +#define OPTION_VAL_140_O45_RU NULL +#define OPTION_VAL_150_O45_RU NULL +#define OPTION_VAL_160_O45_RU NULL +#define OPTION_VAL_170_O45_RU NULL +#define OPTION_VAL_180_O45_RU NULL +#define OPTION_VAL_190_O45_RU NULL +#define OPTION_VAL_200_O45_RU NULL +#define OPTION_VAL_210_O45_RU NULL +#define OPTION_VAL_220_O45_RU NULL +#define OPTION_VAL_230_O45_RU NULL +#define OPTION_VAL_240_O45_RU NULL +#define OPTION_VAL_250_O45_RU NULL +#define OPTION_VAL_260_O45_RU NULL +#define OPTION_VAL_270_O45_RU NULL +#define OPTION_VAL_280_O45_RU NULL +#define OPTION_VAL_290_O45_RU NULL +#define OPTION_VAL_300_O45_RU NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 1" +#define OPTION_VAL_WHITE_RU "Белый" +#define OPTION_VAL_RED_RU "Красный" +#define OPTION_VAL_GREEN_RU "Зелёный" +#define OPTION_VAL_BLUE_RU "Голубой" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_RU "Устройство в слоте расширения A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_RU "Выбор устройства, включенного в слот расширения A1 (порт А слот 1)." +#define OPTION_VAL_VMU_RU NULL +#define OPTION_VAL_PURUPURU_RU "Вибропак" +#define OPTION_VAL_NONE_RU "Нет" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_RU "Устройство в слоте расширения A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_RU "Выбор устройства, включенного в слот расширения A2 (порт А слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_RU "Устройство в слоте расширения B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_RU "Выбор устройства, включенного в слот расширения B1 (порт B слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_RU "Устройство в слоте расширения B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_RU "Выбор устройства, включенного в слот расширения B2 (порт B слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_RU "Устройство в слоте расширения C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_RU "Выбор устройства, включенного в слот расширения C1 (порт C слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_RU "Устройство в слоте расширения C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_RU "Выбор устройства, включенного в слот расширения C2 (порт C слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_RU "Устройство в слоте расширения D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_RU "Выбор устройства, включенного в слот расширения D1 (порт D слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_RU "Устройство в слоте расширения D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_RU "Выбор устройства, включенного в слот расширения D2 (порт D слот 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_RU "Отдельные визуальные карты памяти (VMU) для игр" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_RU "VMU для каждой игры" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_RU "Если выкл., все игры используют до 8 файлов сохранений VMU (A1/A2/B1/B2/C1/C2/D1/D2), расположенных в системном каталоге RetroArch.\nОпция 'VMU A1' создаёт в каталоге сохранений RetroArch уникальный файл VMU 'A1' для каждой запускаемой игры.\nОпция 'Все VMU' создаёт до 8 уникальных файлов VMU (A1/A2/B1/B2/C1/C2/D1/D2) для каждой запускаемой игры." +#define OPTION_VAL_VMU_A1_RU NULL +#define OPTION_VAL_ALL_VMUS_RU "Все VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_RU "Звуковые сигналы визуальных карт памяти (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_RU "Сигналы VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_RU "Включает воспроизведение сигналов VMU." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU "Показывать настройки отображения визуальных карт памяти (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU "Показывать настройки отображения VMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU "Включает конфигурацию размера, положения, цвета и видимости эмулируемого ЖК-экрана VMU. Для применения настройки требуется переключить быстрое меню." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 1" +#define OPTION_VAL_UPPER_LEFT_RU "Вверху слева" +#define OPTION_VAL_UPPER_RIGHT_RU "Вверху справа" +#define OPTION_VAL_LOWER_LEFT_RU "Внизу слева" +#define OPTION_VAL_LOWER_RIGHT_RU "Внизу справа" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 1" +#define OPTION_VAL_1X_RU NULL +#define OPTION_VAL_3X_RU NULL +#define OPTION_VAL_5X_RU NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 1" +#define OPTION_VAL_DEFAULT_ON_00_RU "По умолчанию ВКЛ" +#define OPTION_VAL_DEFAULT_OFF_01_RU "По умолчанию ВЫКЛ" +#define OPTION_VAL_BLACK_02_RU "Чёрный" +#define OPTION_VAL_LIGHT_BLUE_04_RU "Светло-синий" +#define OPTION_VAL_CYAN_06_RU "Сине-зелёный" +#define OPTION_VAL_CYAN_BLUE_07_RU "Голубовато-синий" +#define OPTION_VAL_LIGHT_GREEN_08_RU "Светло-зелёный" +#define OPTION_VAL_CYAN_GREEN_09_RU "Голубовато-зелёный" +#define OPTION_VAL_LIGHT_CYAN_10_RU "Светло-голубой" +#define OPTION_VAL_PURPLE_12_RU "Фиолетовый" +#define OPTION_VAL_LIGHT_PURPLE_13_RU "Светло-фиолетовый" +#define OPTION_VAL_YELLOW_14_RU "Жёлтая" +#define OPTION_VAL_GRAY_15_RU "Серый" +#define OPTION_VAL_LIGHT_PURPLE_2_16_RU "Светло-фиолетовый (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_RU "Светло-зелёный (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_RU "Светло-зелёный (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_RU "Светло-циановый (2)" +#define OPTION_VAL_LIGHT_RED_2_20_RU "Светло-красный (2)" +#define OPTION_VAL_MAGENTA_21_RU "Пурпурный" +#define OPTION_VAL_LIGHT_PURPLE_3_22_RU "Светло-фиолетовый (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_RU "Светло-оранжевый" +#define OPTION_VAL_ORANGE_24_RU "Оранжевый" +#define OPTION_VAL_LIGHT_PURPLE_4_25_RU "Светло-фиолетовый (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_RU "Светло-жёлтый" +#define OPTION_VAL_LIGHT_YELLOW_2_27_RU "Светло-жёлтый (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 1" +#define OPTION_VAL_40_RU NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 2" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 4" + +struct retro_core_option_v2_category option_cats_ru[] = { { "system", - CATEGORY_SYSTEM_LABEL_PT_PT, - CATEGORY_SYSTEM_INFO_0_PT_PT + CATEGORY_SYSTEM_LABEL_RU, + CATEGORY_SYSTEM_INFO_0_RU }, { "video", - CATEGORY_VIDEO_LABEL_PT_PT, - CATEGORY_VIDEO_INFO_0_PT_PT + CATEGORY_VIDEO_LABEL_RU, + CATEGORY_VIDEO_INFO_0_RU }, { "performance", - CATEGORY_PERFORMANCE_LABEL_PT_PT, - CATEGORY_PERFORMANCE_INFO_0_PT_PT + CATEGORY_PERFORMANCE_LABEL_RU, + CATEGORY_PERFORMANCE_INFO_0_RU }, { "hacks", - CATEGORY_HACKS_LABEL_PT_PT, - CATEGORY_HACKS_INFO_0_PT_PT + CATEGORY_HACKS_LABEL_RU, + CATEGORY_HACKS_INFO_0_RU }, { "input", - CATEGORY_INPUT_LABEL_PT_PT, - CATEGORY_INPUT_INFO_0_PT_PT + CATEGORY_INPUT_LABEL_RU, + CATEGORY_INPUT_INFO_0_RU + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_RU, + CATEGORY_EXPANSIONS_INFO_0_RU }, { "vmu", - CATEGORY_VMU_LABEL_PT_PT, - CATEGORY_VMU_INFO_0_PT_PT + CATEGORY_VMU_LABEL_RU, + CATEGORY_VMU_INFO_0_RU }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_pt_pt[] = { +struct retro_core_option_v2_definition option_defs_ru[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_PT_PT, + CORE_OPTION_NAME_REGION_LABEL_RU, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_PT_PT }, - { "USA", OPTION_VAL_USA_PT_PT }, - { "Europe", OPTION_VAL_EUROPE_PT_PT }, - { "Default", OPTION_VAL_DEFAULT_PT_PT }, + { "Japan", OPTION_VAL_JAPAN_RU }, + { "USA", OPTION_VAL_USA_RU }, + { "Europe", OPTION_VAL_EUROPE_RU }, + { "Default", OPTION_VAL_DEFAULT_RU }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_PT_PT, + CORE_OPTION_NAME_LANGUAGE_LABEL_RU, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_PT_PT, + CORE_OPTION_NAME_LANGUAGE_INFO_0_RU, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_PT_PT }, - { "English", OPTION_VAL_ENGLISH_PT_PT }, - { "German", OPTION_VAL_GERMAN_PT_PT }, - { "French", OPTION_VAL_FRENCH_PT_PT }, - { "Spanish", OPTION_VAL_SPANISH_PT_PT }, - { "Italian", OPTION_VAL_ITALIAN_PT_PT }, - { "Default", OPTION_VAL_DEFAULT_PT_PT }, + { "Japanese", OPTION_VAL_JAPANESE_RU }, + { "English", OPTION_VAL_ENGLISH_RU }, + { "German", OPTION_VAL_GERMAN_RU }, + { "French", OPTION_VAL_FRENCH_RU }, + { "Spanish", OPTION_VAL_SPANISH_RU }, + { "Italian", OPTION_VAL_ITALIAN_RU }, + { "Default", OPTION_VAL_DEFAULT_RU }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_PT_PT, + CORE_OPTION_NAME_HLE_BIOS_LABEL_RU, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_PT_PT, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_RU, NULL, "system", { @@ -54393,9 +64894,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_PT_PT, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_RU, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_PT_PT, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_RU, NULL, "system", { @@ -54407,9 +64908,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_PT_PT, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_RU, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_PT_PT, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_RU, NULL, "system", { @@ -54423,25 +64924,11 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_PT_PT, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_PT_PT, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_PT_PT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_RU, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_PT_PT, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_RU, NULL, "system", { @@ -54453,9 +64940,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_PT_PT, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_RU, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_PT_PT, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_RU, NULL, "system", { @@ -54467,9 +64954,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_PT_PT, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_RU, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_PT_PT, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_RU, NULL, "system", { @@ -54481,9 +64968,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_PT_PT, + CORE_OPTION_NAME_UPNP_LABEL_RU, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_PT_PT, + CORE_OPTION_NAME_UPNP_INFO_0_RU, NULL, "system", { @@ -54496,39 +64983,39 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_PT_PT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_RU, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_PT_PT, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_RU, NULL, "video", { - { "320x240", OPTION_VAL_320X240_PT_PT }, - { "640x480", OPTION_VAL_640X480_PT_PT }, - { "800x600", OPTION_VAL_800X600_PT_PT }, - { "960x720", OPTION_VAL_960X720_PT_PT }, - { "1024x768", OPTION_VAL_1024X768_PT_PT }, - { "1280x960", OPTION_VAL_1280X960_PT_PT }, - { "1440x1080", OPTION_VAL_1440X1080_PT_PT }, - { "1600x1200", OPTION_VAL_1600X1200_PT_PT }, - { "1920x1440", OPTION_VAL_1920X1440_PT_PT }, - { "2560x1920", OPTION_VAL_2560X1920_PT_PT }, - { "2880x2160", OPTION_VAL_2880X2160_PT_PT }, - { "3200x2400", OPTION_VAL_3200X2400_PT_PT }, - { "3840x2880", OPTION_VAL_3840X2880_PT_PT }, - { "4480x3360", OPTION_VAL_4480X3360_PT_PT }, - { "5120x3840", OPTION_VAL_5120X3840_PT_PT }, - { "5760x4320", OPTION_VAL_5760X4320_PT_PT }, - { "6400x4800", OPTION_VAL_6400X4800_PT_PT }, - { "7040x5280", OPTION_VAL_7040X5280_PT_PT }, - { "7680x5760", OPTION_VAL_7680X5760_PT_PT }, - { "8320x6240", OPTION_VAL_8320X6240_PT_PT }, - { "8960x6720", OPTION_VAL_8960X6720_PT_PT }, - { "9600x7200", OPTION_VAL_9600X7200_PT_PT }, - { "10240x7680", OPTION_VAL_10240X7680_PT_PT }, - { "10880x8160", OPTION_VAL_10880X8160_PT_PT }, - { "11520x8640", OPTION_VAL_11520X8640_PT_PT }, - { "12160x9120", OPTION_VAL_12160X9120_PT_PT }, - { "12800x9600", OPTION_VAL_12800X9600_PT_PT }, + { "320x240", OPTION_VAL_320X240_RU }, + { "640x480", OPTION_VAL_640X480_RU }, + { "800x600", OPTION_VAL_800X600_RU }, + { "960x720", OPTION_VAL_960X720_RU }, + { "1024x768", OPTION_VAL_1024X768_RU }, + { "1280x960", OPTION_VAL_1280X960_RU }, + { "1440x1080", OPTION_VAL_1440X1080_RU }, + { "1600x1200", OPTION_VAL_1600X1200_RU }, + { "1920x1440", OPTION_VAL_1920X1440_RU }, + { "2560x1920", OPTION_VAL_2560X1920_RU }, + { "2880x2160", OPTION_VAL_2880X2160_RU }, + { "3200x2400", OPTION_VAL_3200X2400_RU }, + { "3840x2880", OPTION_VAL_3840X2880_RU }, + { "4480x3360", OPTION_VAL_4480X3360_RU }, + { "5120x3840", OPTION_VAL_5120X3840_RU }, + { "5760x4320", OPTION_VAL_5760X4320_RU }, + { "6400x4800", OPTION_VAL_6400X4800_RU }, + { "7040x5280", OPTION_VAL_7040X5280_RU }, + { "7680x5760", OPTION_VAL_7680X5760_RU }, + { "8320x6240", OPTION_VAL_8320X6240_RU }, + { "8960x6720", OPTION_VAL_8960X6720_RU }, + { "9600x7200", OPTION_VAL_9600X7200_RU }, + { "10240x7680", OPTION_VAL_10240X7680_RU }, + { "10880x8160", OPTION_VAL_10880X8160_RU }, + { "11520x8640", OPTION_VAL_11520X8640_RU }, + { "12160x9120", OPTION_VAL_12160X9120_RU }, + { "12800x9600", OPTION_VAL_12800X9600_RU }, { NULL, NULL }, }, #ifdef LOW_RES @@ -54539,62 +65026,62 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_PT_PT, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_PT_PT, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU, NULL, "video", { - { "VGA", OPTION_VAL_VGA_PT_PT }, - { "TV (RGB)", OPTION_VAL_TV_RGB_PT_PT }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_PT_PT }, + { "VGA", OPTION_VAL_VGA_RU }, + { "TV (RGB)", OPTION_VAL_TV_RGB_RU }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_RU }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_PT_PT, + CORE_OPTION_NAME_BROADCAST_LABEL_RU, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_PT_PT }, - { "PAL", OPTION_VAL_PAL_PT_PT }, - { "PAL_N", OPTION_VAL_PAL_N_PT_PT }, - { "PAL_M", OPTION_VAL_PAL_M_PT_PT }, - { "Default", OPTION_VAL_DEFAULT_PT_PT }, + { "NTSC", OPTION_VAL_NTSC_RU }, + { "PAL", OPTION_VAL_PAL_RU }, + { "PAL_N", OPTION_VAL_PAL_N_RU }, + { "PAL_M", OPTION_VAL_PAL_M_RU }, + { "Default", OPTION_VAL_DEFAULT_RU }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_PT_PT, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_RU, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_PT_PT }, - { "vertical", OPTION_VAL_VERTICAL_PT_PT }, + { "horizontal", OPTION_VAL_HORIZONTAL_RU }, + { "vertical", OPTION_VAL_VERTICAL_RU }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_PT_PT, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_RU, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_PT_PT }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_PT_PT }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_RU }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_PT_PT }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_RU }, #endif { NULL, NULL }, }, @@ -54607,25 +65094,25 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_PT_PT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_PT_PT, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU, NULL, "video", { - { "512MB", OPTION_VAL_512MB_PT_PT }, - { "1GB", OPTION_VAL_1GB_PT_PT }, - { "2GB", OPTION_VAL_2GB_PT_PT }, - { "4GB", OPTION_VAL_4GB_PT_PT }, + { "512MB", OPTION_VAL_512MB_RU }, + { "1GB", OPTION_VAL_1GB_RU }, + { "2GB", OPTION_VAL_2GB_RU }, + { "4GB", OPTION_VAL_4GB_RU }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_PT_PT, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_RU, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_PT_PT, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_RU, NULL, "video", { @@ -54633,6 +65120,7 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -54641,9 +65129,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_PT_PT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_PT_PT, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU, NULL, "video", { @@ -54655,9 +65143,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_PT_PT, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_PT_PT, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU, NULL, "video", { @@ -54667,11 +65155,11 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_PT_PT, + CORE_OPTION_NAME_MIPMAPPING_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_RU, NULL, "video", { @@ -54683,7 +65171,7 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_PT_PT, + CORE_OPTION_NAME_FOG_LABEL_RU, NULL, "", NULL, @@ -54697,9 +65185,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_PT_PT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_PT_PT, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU, NULL, "video", { @@ -54711,9 +65199,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_PT_PT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_PT_PT, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU, NULL, "video", { @@ -54728,24 +65216,24 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_PT_PT, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_PT_PT, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_PT_PT }, - { "1", OPTION_VAL_1_PT_PT }, - { "2", OPTION_VAL_2_PT_PT }, + { "0", OPTION_VAL_DEFAULT_RU }, + { "1", OPTION_VAL_1_RU }, + { "2", OPTION_VAL_2_RU }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_PT_PT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_PT_PT, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU, NULL, "video", { @@ -54753,13 +65241,13 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_PT_PT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_PT_PT, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU, NULL, "video", { @@ -54771,9 +65259,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_PT_PT, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_PT_PT, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU, NULL, "video", { @@ -54786,25 +65274,25 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_PT_PT, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_PT_PT, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_RU, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_PT_PT }, - { "4", OPTION_VAL_4_PT_PT }, - { "6", OPTION_VAL_6_PT_PT }, + { "2", OPTION_VAL_2_O26_RU }, + { "4", OPTION_VAL_4_RU }, + { "6", OPTION_VAL_6_RU }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_PT_PT, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_RU, NULL, "video", { @@ -54818,9 +65306,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_PT_PT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_PT_PT, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU, NULL, "video", { @@ -54830,11 +65318,25 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_RU, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_RU, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_PT_PT, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_PT_PT, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU, NULL, "performance", { @@ -54846,15 +65348,15 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_PT_PT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_PT_PT, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_PT_PT }, - { "more", OPTION_VAL_MORE_PT_PT }, + { "some", OPTION_VAL_SOME_RU }, + { "more", OPTION_VAL_MORE_RU }, { NULL, NULL }, }, #ifdef LOW_END @@ -54865,9 +65367,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_PT_PT, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_PT_PT, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU, NULL, "performance", { @@ -54884,9 +65386,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_PT_PT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_PT_PT, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_RU, NULL, "hacks", { @@ -54898,9 +65400,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_PT_PT, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_RU, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_PT_PT, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_RU, NULL, "hacks", { @@ -54912,9 +65414,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_PT_PT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_RU, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_PT_PT, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_RU, NULL, "hacks", { @@ -54928,64 +65430,78 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_RU, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_RU, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_PT_PT, + CORE_OPTION_NAME_SH4CLOCK_LABEL_RU, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_PT_PT, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_RU, NULL, "hacks", { - { "100", OPTION_VAL_100_PT_PT }, - { "110", OPTION_VAL_110_PT_PT }, - { "120", OPTION_VAL_120_PT_PT }, - { "130", OPTION_VAL_130_PT_PT }, - { "140", OPTION_VAL_140_PT_PT }, - { "150", OPTION_VAL_150_PT_PT }, - { "160", OPTION_VAL_160_PT_PT }, - { "170", OPTION_VAL_170_PT_PT }, - { "180", OPTION_VAL_180_PT_PT }, - { "190", OPTION_VAL_190_PT_PT }, - { "200", OPTION_VAL_200_PT_PT }, - { "210", OPTION_VAL_210_PT_PT }, - { "220", OPTION_VAL_220_PT_PT }, - { "230", OPTION_VAL_230_PT_PT }, - { "240", OPTION_VAL_240_PT_PT }, - { "250", OPTION_VAL_250_PT_PT }, - { "260", OPTION_VAL_260_PT_PT }, - { "270", OPTION_VAL_270_PT_PT }, - { "280", OPTION_VAL_280_PT_PT }, - { "290", OPTION_VAL_290_PT_PT }, - { "300", OPTION_VAL_300_PT_PT }, - { "310", OPTION_VAL_310_PT_PT }, - { "320", OPTION_VAL_320_PT_PT }, - { "330", OPTION_VAL_330_PT_PT }, - { "340", OPTION_VAL_340_PT_PT }, - { "350", OPTION_VAL_350_PT_PT }, - { "360", OPTION_VAL_360_PT_PT }, - { "370", OPTION_VAL_370_PT_PT }, - { "380", OPTION_VAL_380_PT_PT }, - { "390", OPTION_VAL_390_PT_PT }, - { "400", OPTION_VAL_400_PT_PT }, - { "410", OPTION_VAL_410_PT_PT }, - { "420", OPTION_VAL_420_PT_PT }, - { "430", OPTION_VAL_430_PT_PT }, - { "440", OPTION_VAL_440_PT_PT }, - { "450", OPTION_VAL_450_PT_PT }, - { "460", OPTION_VAL_460_PT_PT }, - { "470", OPTION_VAL_470_PT_PT }, - { "480", OPTION_VAL_480_PT_PT }, - { "490", OPTION_VAL_490_PT_PT }, - { "500", OPTION_VAL_500_PT_PT }, + { "100", OPTION_VAL_100_RU }, + { "110", OPTION_VAL_110_RU }, + { "120", OPTION_VAL_120_RU }, + { "130", OPTION_VAL_130_RU }, + { "140", OPTION_VAL_140_RU }, + { "150", OPTION_VAL_150_RU }, + { "160", OPTION_VAL_160_RU }, + { "170", OPTION_VAL_170_RU }, + { "180", OPTION_VAL_180_RU }, + { "190", OPTION_VAL_190_RU }, + { "200", OPTION_VAL_200_RU }, + { "210", OPTION_VAL_210_RU }, + { "220", OPTION_VAL_220_RU }, + { "230", OPTION_VAL_230_RU }, + { "240", OPTION_VAL_240_RU }, + { "250", OPTION_VAL_250_RU }, + { "260", OPTION_VAL_260_RU }, + { "270", OPTION_VAL_270_RU }, + { "280", OPTION_VAL_280_RU }, + { "290", OPTION_VAL_290_RU }, + { "300", OPTION_VAL_300_RU }, + { "310", OPTION_VAL_310_RU }, + { "320", OPTION_VAL_320_RU }, + { "330", OPTION_VAL_330_RU }, + { "340", OPTION_VAL_340_RU }, + { "350", OPTION_VAL_350_RU }, + { "360", OPTION_VAL_360_RU }, + { "370", OPTION_VAL_370_RU }, + { "380", OPTION_VAL_380_RU }, + { "390", OPTION_VAL_390_RU }, + { "400", OPTION_VAL_400_RU }, + { "410", OPTION_VAL_410_RU }, + { "420", OPTION_VAL_420_RU }, + { "430", OPTION_VAL_430_RU }, + { "440", OPTION_VAL_440_RU }, + { "450", OPTION_VAL_450_RU }, + { "460", OPTION_VAL_460_RU }, + { "470", OPTION_VAL_470_RU }, + { "480", OPTION_VAL_480_RU }, + { "490", OPTION_VAL_490_RU }, + { "500", OPTION_VAL_500_RU }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_PT_PT, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_RU, NULL, "hacks", { @@ -54995,11 +65511,11 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_PT_PT, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_RU, NULL, "hacks", { @@ -55011,47 +65527,47 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_PT_PT, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_RU, NULL, "input", { - { "0%", OPTION_VAL_0_PT_PT }, - { "5%", OPTION_VAL_5_PT_PT }, - { "10%", OPTION_VAL_10_PT_PT }, - { "15%", OPTION_VAL_15_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "25%", OPTION_VAL_25_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, + { "0%", OPTION_VAL_0_RU }, + { "5%", OPTION_VAL_5_RU }, + { "10%", OPTION_VAL_10_RU }, + { "15%", OPTION_VAL_15_RU }, + { "20%", OPTION_VAL_20_RU }, + { "25%", OPTION_VAL_25_RU }, + { "30%", OPTION_VAL_30_RU }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_PT_PT, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_RU, NULL, "input", { - { "0%", OPTION_VAL_0_PT_PT }, - { "5%", OPTION_VAL_5_PT_PT }, - { "10%", OPTION_VAL_10_PT_PT }, - { "15%", OPTION_VAL_15_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "25%", OPTION_VAL_25_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, + { "0%", OPTION_VAL_0_RU }, + { "5%", OPTION_VAL_5_RU }, + { "10%", OPTION_VAL_10_RU }, + { "15%", OPTION_VAL_15_RU }, + { "20%", OPTION_VAL_20_RU }, + { "25%", OPTION_VAL_25_RU }, + { "30%", OPTION_VAL_30_RU }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_PT_PT, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_RU, NULL, "input", { @@ -55062,10 +65578,10 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_PT_PT, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_PT_PT, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU, NULL, "input", { @@ -55073,124 +65589,268 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_PT_PT, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_PT_PT, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_PT_PT, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_RU, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_PT_PT, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_RU }, + { "60%", OPTION_VAL_60_RU }, + { "70%", OPTION_VAL_70_RU }, + { "80%", OPTION_VAL_80_RU }, + { "90%", OPTION_VAL_90_RU }, + { "100%", OPTION_VAL_100_O45_RU }, + { "110%", OPTION_VAL_110_O45_RU }, + { "120%", OPTION_VAL_120_O45_RU }, + { "130%", OPTION_VAL_130_O45_RU }, + { "140%", OPTION_VAL_140_O45_RU }, + { "150%", OPTION_VAL_150_O45_RU }, + { "160%", OPTION_VAL_160_O45_RU }, + { "170%", OPTION_VAL_170_O45_RU }, + { "180%", OPTION_VAL_180_O45_RU }, + { "190%", OPTION_VAL_190_O45_RU }, + { "200%", OPTION_VAL_200_O45_RU }, + { "210%", OPTION_VAL_210_O45_RU }, + { "220%", OPTION_VAL_220_O45_RU }, + { "230%", OPTION_VAL_230_O45_RU }, + { "240%", OPTION_VAL_240_O45_RU }, + { "250%", OPTION_VAL_250_O45_RU }, + { "260%", OPTION_VAL_260_O45_RU }, + { "270%", OPTION_VAL_270_O45_RU }, + { "280%", OPTION_VAL_280_O45_RU }, + { "290%", OPTION_VAL_290_O45_RU }, + { "300%", OPTION_VAL_300_O45_RU }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_PT_PT, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_PT }, - { "Red", OPTION_VAL_RED_PT_PT }, - { "Green", OPTION_VAL_GREEN_PT_PT }, - { "Blue", OPTION_VAL_BLUE_PT_PT }, + { "White", OPTION_VAL_WHITE_RU }, + { "Red", OPTION_VAL_RED_RU }, + { "Green", OPTION_VAL_GREEN_RU }, + { "Blue", OPTION_VAL_BLUE_RU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_PT_PT, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_RU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_PT }, - { "Red", OPTION_VAL_RED_PT_PT }, - { "Green", OPTION_VAL_GREEN_PT_PT }, - { "Blue", OPTION_VAL_BLUE_PT_PT }, + { "White", OPTION_VAL_WHITE_RU }, + { "Red", OPTION_VAL_RED_RU }, + { "Green", OPTION_VAL_GREEN_RU }, + { "Blue", OPTION_VAL_BLUE_RU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_PT_PT, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_RU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_PT }, - { "Red", OPTION_VAL_RED_PT_PT }, - { "Green", OPTION_VAL_GREEN_PT_PT }, - { "Blue", OPTION_VAL_BLUE_PT_PT }, + { "White", OPTION_VAL_WHITE_RU }, + { "Red", OPTION_VAL_RED_RU }, + { "Green", OPTION_VAL_GREEN_RU }, + { "Blue", OPTION_VAL_BLUE_RU }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_PT_PT, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_RU, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_PT_PT }, - { "Red", OPTION_VAL_RED_PT_PT }, - { "Green", OPTION_VAL_GREEN_PT_PT }, - { "Blue", OPTION_VAL_BLUE_PT_PT }, + { "White", OPTION_VAL_WHITE_RU }, + { "Red", OPTION_VAL_RED_RU }, + { "Green", OPTION_VAL_GREEN_RU }, + { "Blue", OPTION_VAL_BLUE_RU }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_RU, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_RU, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_RU }, + { "Purupuru", OPTION_VAL_PURUPURU_RU }, + { "None", OPTION_VAL_NONE_RU }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_PT_PT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_PT_PT, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_PT_PT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_RU, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_RU, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_RU, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_PT_PT }, - { "All VMUs", OPTION_VAL_ALL_VMUS_PT_PT }, + { "VMU A1", OPTION_VAL_VMU_A1_RU }, + { "All VMUs", OPTION_VAL_ALL_VMUS_RU }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_PT_PT, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_PT_PT, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_PT_PT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_RU, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_RU, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_RU, NULL, "vmu", { @@ -55201,9 +65861,9 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_PT_PT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_PT_PT, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_PT_PT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU, NULL, "vmu", { @@ -55215,7 +65875,7 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU, NULL, "", NULL, @@ -55229,144 +65889,144 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_PT_PT, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_PT_PT, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_RU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_PT }, - { "2x", OPTION_VAL_2_O27_PT_PT }, - { "3x", OPTION_VAL_3X_PT_PT }, - { "4x", OPTION_VAL_4_PT_PT }, - { "5x", OPTION_VAL_5X_PT_PT }, + { "1x", OPTION_VAL_1X_RU }, + { "2x", OPTION_VAL_2_O26_RU }, + { "3x", OPTION_VAL_3X_RU }, + { "4x", OPTION_VAL_4_RU }, + { "5x", OPTION_VAL_5X_RU }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_PT_PT, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_RU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, - { "40%", OPTION_VAL_40_PT_PT }, - { "50%", OPTION_VAL_50_PT_PT }, - { "60%", OPTION_VAL_60_PT_PT }, - { "70%", OPTION_VAL_70_PT_PT }, - { "80%", OPTION_VAL_80_PT_PT }, - { "90%", OPTION_VAL_90_PT_PT }, - { "100%", OPTION_VAL_100_O57_PT_PT }, + { "10%", OPTION_VAL_10_RU }, + { "20%", OPTION_VAL_20_RU }, + { "30%", OPTION_VAL_30_RU }, + { "40%", OPTION_VAL_40_RU }, + { "50%", OPTION_VAL_50_RU }, + { "60%", OPTION_VAL_60_RU }, + { "70%", OPTION_VAL_70_RU }, + { "80%", OPTION_VAL_80_RU }, + { "90%", OPTION_VAL_90_RU }, + { "100%", OPTION_VAL_100_O45_RU }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_RU, NULL, "", NULL, @@ -55380,144 +66040,144 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_RU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_RU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_PT }, - { "2x", OPTION_VAL_2_O27_PT_PT }, - { "3x", OPTION_VAL_3X_PT_PT }, - { "4x", OPTION_VAL_4_PT_PT }, - { "5x", OPTION_VAL_5X_PT_PT }, + { "1x", OPTION_VAL_1X_RU }, + { "2x", OPTION_VAL_2_O26_RU }, + { "3x", OPTION_VAL_3X_RU }, + { "4x", OPTION_VAL_4_RU }, + { "5x", OPTION_VAL_5X_RU }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_RU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, - { "40%", OPTION_VAL_40_PT_PT }, - { "50%", OPTION_VAL_50_PT_PT }, - { "60%", OPTION_VAL_60_PT_PT }, - { "70%", OPTION_VAL_70_PT_PT }, - { "80%", OPTION_VAL_80_PT_PT }, - { "90%", OPTION_VAL_90_PT_PT }, - { "100%", OPTION_VAL_100_O57_PT_PT }, + { "10%", OPTION_VAL_10_RU }, + { "20%", OPTION_VAL_20_RU }, + { "30%", OPTION_VAL_30_RU }, + { "40%", OPTION_VAL_40_RU }, + { "50%", OPTION_VAL_50_RU }, + { "60%", OPTION_VAL_60_RU }, + { "70%", OPTION_VAL_70_RU }, + { "80%", OPTION_VAL_80_RU }, + { "90%", OPTION_VAL_90_RU }, + { "100%", OPTION_VAL_100_O45_RU }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_RU, NULL, "", NULL, @@ -55531,144 +66191,144 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_RU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_RU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_PT }, - { "2x", OPTION_VAL_2_O27_PT_PT }, - { "3x", OPTION_VAL_3X_PT_PT }, - { "4x", OPTION_VAL_4_PT_PT }, - { "5x", OPTION_VAL_5X_PT_PT }, + { "1x", OPTION_VAL_1X_RU }, + { "2x", OPTION_VAL_2_O26_RU }, + { "3x", OPTION_VAL_3X_RU }, + { "4x", OPTION_VAL_4_RU }, + { "5x", OPTION_VAL_5X_RU }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_RU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, - { "40%", OPTION_VAL_40_PT_PT }, - { "50%", OPTION_VAL_50_PT_PT }, - { "60%", OPTION_VAL_60_PT_PT }, - { "70%", OPTION_VAL_70_PT_PT }, - { "80%", OPTION_VAL_80_PT_PT }, - { "90%", OPTION_VAL_90_PT_PT }, - { "100%", OPTION_VAL_100_O57_PT_PT }, + { "10%", OPTION_VAL_10_RU }, + { "20%", OPTION_VAL_20_RU }, + { "30%", OPTION_VAL_30_RU }, + { "40%", OPTION_VAL_40_RU }, + { "50%", OPTION_VAL_50_RU }, + { "60%", OPTION_VAL_60_RU }, + { "70%", OPTION_VAL_70_RU }, + { "80%", OPTION_VAL_80_RU }, + { "90%", OPTION_VAL_90_RU }, + { "100%", OPTION_VAL_100_O45_RU }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_RU, NULL, "", NULL, @@ -55682,505 +66342,560 @@ struct retro_core_option_v2_definition option_defs_pt_pt[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_RU, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_PT_PT }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_PT_PT }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_PT_PT }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_PT_PT }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_RU, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_PT_PT }, - { "2x", OPTION_VAL_2_O27_PT_PT }, - { "3x", OPTION_VAL_3X_PT_PT }, - { "4x", OPTION_VAL_4_PT_PT }, - { "5x", OPTION_VAL_5X_PT_PT }, + { "1x", OPTION_VAL_1X_RU }, + { "2x", OPTION_VAL_2_O26_RU }, + { "3x", OPTION_VAL_3X_RU }, + { "4x", OPTION_VAL_4_RU }, + { "5x", OPTION_VAL_5X_RU }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_RU, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_PT_PT }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_PT_PT }, - { "BLACK 02", OPTION_VAL_BLACK_02_PT_PT }, - { "BLUE 03", OPTION_VAL_BLUE_PT_PT }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_PT_PT }, - { "GREEN 05", OPTION_VAL_GREEN_PT_PT }, - { "CYAN 06", OPTION_VAL_CYAN_06_PT_PT }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_PT_PT }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_PT_PT }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_PT_PT }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_PT_PT }, - { "RED 11", OPTION_VAL_RED_PT_PT }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_PT_PT }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_PT_PT }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_PT_PT }, - { "GRAY 15", OPTION_VAL_GRAY_15_PT_PT }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_PT_PT }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_PT_PT }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_PT_PT }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_PT_PT }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_PT_PT }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_PT_PT }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_PT_PT }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_PT_PT }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_PT_PT }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_PT_PT }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_PT_PT }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_PT_PT }, - { "WHITE 28", OPTION_VAL_WHITE_PT_PT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, + { "BLACK 02", OPTION_VAL_BLACK_02_RU }, + { "BLUE 03", OPTION_VAL_BLUE_RU }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, + { "GREEN 05", OPTION_VAL_GREEN_RU }, + { "CYAN 06", OPTION_VAL_CYAN_06_RU }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, + { "RED 11", OPTION_VAL_RED_RU }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, + { "GRAY 15", OPTION_VAL_GRAY_15_RU }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, + { "WHITE 28", OPTION_VAL_WHITE_RU }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_PT_PT, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_RU, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_PT_PT }, - { "20%", OPTION_VAL_20_PT_PT }, - { "30%", OPTION_VAL_30_PT_PT }, - { "40%", OPTION_VAL_40_PT_PT }, - { "50%", OPTION_VAL_50_PT_PT }, - { "60%", OPTION_VAL_60_PT_PT }, - { "70%", OPTION_VAL_70_PT_PT }, - { "80%", OPTION_VAL_80_PT_PT }, - { "90%", OPTION_VAL_90_PT_PT }, - { "100%", OPTION_VAL_100_O57_PT_PT }, + { "10%", OPTION_VAL_10_RU }, + { "20%", OPTION_VAL_20_RU }, + { "30%", OPTION_VAL_30_RU }, + { "40%", OPTION_VAL_40_RU }, + { "50%", OPTION_VAL_50_RU }, + { "60%", OPTION_VAL_60_RU }, + { "70%", OPTION_VAL_70_RU }, + { "80%", OPTION_VAL_80_RU }, + { "90%", OPTION_VAL_90_RU }, + { "100%", OPTION_VAL_100_O45_RU }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_pt_pt = { - option_cats_pt_pt, - option_defs_pt_pt +struct retro_core_options_v2 options_ru = { + option_cats_ru, + option_defs_ru }; -/* RETRO_LANGUAGE_RU */ +/* RETRO_LANGUAGE_SK */ -#define CATEGORY_SYSTEM_LABEL_RU "Системные" -#define CATEGORY_SYSTEM_INFO_0_RU "Настройка региона, языка, BIOS и основных параметров оборудования." -#define CATEGORY_VIDEO_LABEL_RU "Видео" -#define CATEGORY_VIDEO_INFO_0_RU "Настройки разрешения, порядко-независимой прозрачности и визуальных эффектов." -#define CATEGORY_PERFORMANCE_LABEL_RU "Производительность" -#define CATEGORY_PERFORMANCE_INFO_0_RU "Настройки многопоточного рендеринга и пропуска кадров." -#define CATEGORY_HACKS_LABEL_RU "Хаки эмуляции" -#define CATEGORY_HACKS_INFO_0_RU "Настройки широкоформатных чит-кодов, скорости загрузки GD-ROM и замены текстур." -#define CATEGORY_INPUT_LABEL_RU "Ввод" -#define CATEGORY_INPUT_INFO_0_RU "Настройки геймпада и светового пистолета." -#define CATEGORY_VMU_LABEL_RU NULL -#define CATEGORY_VMU_INFO_0_RU "Настройки файлов сохранений VMU для каждой игры и отображения VMU на экране." -#define CORE_OPTION_NAME_REGION_LABEL_RU "Регион" -#define OPTION_VAL_JAPAN_RU "Япония" -#define OPTION_VAL_USA_RU "США" -#define OPTION_VAL_EUROPE_RU "Европа" -#define OPTION_VAL_DEFAULT_RU "По умолчанию" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_RU "Язык" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_RU "Выбор языка, используемого в BIOS и любых играх, содержащих несколько языков." -#define OPTION_VAL_JAPANESE_RU "Японский" -#define OPTION_VAL_ENGLISH_RU "Английский" -#define OPTION_VAL_GERMAN_RU "Немецкий" -#define OPTION_VAL_FRENCH_RU "Французский" -#define OPTION_VAL_SPANISH_RU "Испанский" -#define OPTION_VAL_ITALIAN_RU "Итальянский" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_RU "Эмуляция BIOS (требуется перезапуск)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_RU "Принудительно использовать высокоуровневую эмуляцию BIOS." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_RU "Загрузка в BIOS (требуется перезапуск)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_RU "Загружаться непосредственно в меню Dreamcast BIOS." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_RU "Включить DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_RU "Включить эмуляцию звукового DSP (цифрового сигнального процессора) Dreamcast. Улучшает точность генерируемого звука, но повышает системные требования." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_RU "Принудительный режим Windows CE" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_RU "Включает полную эмуляцию MMU (блока управления памятью) и другие настройки для игр Windows CE." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_RU "Разрешить сервисные кнопки NAOMI" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_RU "Включает сервисную кнопку NAOMI для входа в настройки автомата." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_RU "Режим Free Play для игр NAOMI" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_RU "Изменять настройки монетизации для включения бесплатной игры." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_RU "Эмуляция Broadband Adapter" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_RU "Эмулировать вместо модема широкополосный Ethernet-адаптер (требуется перезапуск)." -#define CORE_OPTION_NAME_UPNP_LABEL_RU "Включить UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_RU "Использовать UPnP для автоматической настройки вашего Интернет-роутера для онлайн-игр." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_RU "Внутреннее разрешение" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_RU "Настройка разрешения рендеринга." -#define OPTION_VAL_320X240_RU NULL -#define OPTION_VAL_640X480_RU NULL -#define OPTION_VAL_800X600_RU NULL -#define OPTION_VAL_960X720_RU NULL -#define OPTION_VAL_1024X768_RU NULL -#define OPTION_VAL_1280X960_RU NULL -#define OPTION_VAL_1440X1080_RU NULL -#define OPTION_VAL_1600X1200_RU NULL -#define OPTION_VAL_1920X1440_RU NULL -#define OPTION_VAL_2560X1920_RU NULL -#define OPTION_VAL_2880X2160_RU NULL -#define OPTION_VAL_3200X2400_RU NULL -#define OPTION_VAL_3840X2880_RU NULL -#define OPTION_VAL_4480X3360_RU NULL -#define OPTION_VAL_5120X3840_RU NULL -#define OPTION_VAL_5760X4320_RU NULL -#define OPTION_VAL_6400X4800_RU NULL -#define OPTION_VAL_7040X5280_RU NULL -#define OPTION_VAL_7680X5760_RU NULL -#define OPTION_VAL_8320X6240_RU NULL -#define OPTION_VAL_8960X6720_RU NULL -#define OPTION_VAL_9600X7200_RU NULL -#define OPTION_VAL_10240X7680_RU NULL -#define OPTION_VAL_10880X8160_RU NULL -#define OPTION_VAL_11520X8640_RU NULL -#define OPTION_VAL_12160X9120_RU NULL -#define OPTION_VAL_12800X9600_RU NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU "Тип кабеля" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU "Тип выходного сигнала. Наиболее поддерживаемым является 'ТВ (композит)'." -#define OPTION_VAL_VGA_RU NULL -#define OPTION_VAL_TV_RGB_RU "ТВ (RGB)" -#define OPTION_VAL_TV_COMPOSITE_RU "ТВ (композит)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_RU "Стандарт вещания" -#define OPTION_VAL_NTSC_RU NULL -#define OPTION_VAL_PAL_RU "PAL (Мир)" -#define OPTION_VAL_PAL_N_RU "PAL-N (Аргентина, Парагвай, Уругвай)" -#define OPTION_VAL_PAL_M_RU "PAL-M (Бразилия)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_RU "Ориентация экрана" -#define OPTION_VAL_HORIZONTAL_RU "Горизонтальная" -#define OPTION_VAL_VERTICAL_RU "Вертикальная" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU "Альфа-сортировка" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU "По слоям (самая быстрая, наименее точная)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_RU "По треугольникам (стандартная)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_RU "По пикселям (точная, самая медленная)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU "Размер накопительного буфера пикселей" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU "Большие значения могут требоваться для правильного отображения высоких разрешений." -#define OPTION_VAL_512MB_RU "512 МБ" -#define OPTION_VAL_1GB_RU "1 ГБ" -#define OPTION_VAL_2GB_RU "2 ГБ" -#define OPTION_VAL_4GB_RU "4 ГБ" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_RU "Максимум прозрачных слоёв" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_RU "Сложные сцены могут потребовать более высоких значений." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU "Полная эмуляция фреймбуфера" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU "Включает полную эмуляцию кадрового буфера в VRAM. Полезно для игр, которые напрямую производят чтение или запись фреймбуфера в VRAM. При включении внутреннее разрешение будет принудительно установлено в 640x480 и возможно сильное падение скорости." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU "Включить буфер рендера в текстуру" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU "Копирует отрисованные текстуры из GPU обратно в VRAM. Данная настройка обычно включена для игр, которые этого требуют. При включении не используется масштабирование рендеринга текстур и возможно падение производительности." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_RU "MIP-текстурирование" -#define CORE_OPTION_NAME_FOG_LABEL_RU "Эффекты тумана" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU "Модификатор объема" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU "Функция графического процессора Dreamcast, которая обычно используется играми для отрисовки теней объектов. По умолчанию она должна быть включена - влияние на производительность обычно минимально или незначительно." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU "Анизотропная фильтрация" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU "Улучшает качество текстур на поверхностях под непрямыми углами обзора по отношению к камере. Более высокие значения повышают требования к GPU. Изменения настройки вступают в силу при перезапуске." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU "Сглаживание текстур" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU "Выбор метода сглаживания текстур. Используется для принудительной фильтрации всех текстур, чтобы получить более чёткое (или сглаженное) изображение. Любое значение, отличное от стандартного может приводить к ошибкам рендеринга. Для применения настройки требуется перезапуск." -#define OPTION_VAL_1_RU "Принудительно методом ближ. соседа" -#define OPTION_VAL_2_RU "Принудительно линейное" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU "Задержка замены кадров" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU "Помогает избежать мерцания экрана или искажения заставок. Не рекомендуется на медленных платформах." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU "Определять изменение частоты кадров" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU "Уведомлять фронтенд об изменениях внутренней частоты кадров (напр. с 60 до 30 к/с). Улучшает распределение кадров в играх с постоянной частотой в 30 или 20 к/с, но должно быть выключено для игр с плавающим значением частоты кадров (напр. Ecco the Dolphin, Unreal Tournament). Недоступно при вкл. опции 'Автопропуск кадров'." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU "Фильтр постобработки PowerVR2" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU "Делает постобработку отображаемого изображения для имитации эффектов, специфичных для графического процессора PowerVR2 и аналоговых видеосигналов." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU "Масштабирование текстур (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_RU "Улучшает 2D пиксель-арт с ручной отрисовкой. Рекомендуется применять только в 2D-играх с пиксельной графикой." -#define OPTION_VAL_2_O27_RU NULL -#define OPTION_VAL_4_RU NULL -#define OPTION_VAL_6_RU NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU "Нативная глубина интерполяции" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU "Помогает при проблемах с глубиной и искажением текстур на видеокартах AMD. В ряде случаев также устраняет проблемы на видеокартах Intel." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU "Рендеринг в отдельном потоке" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU "Запускает графический и центральный процессоры в разных потоках. Настоятельно рекомендуется." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU "Автоматический пропуск кадров" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU "Автоматически пропускать кадры при замедлении эмулятора. Применяется только с вкл. опцией 'Рендеринг в отдельном потоке'." -#define OPTION_VAL_SOME_RU "Нормально" -#define OPTION_VAL_MORE_RU "Максимум" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU "Пропуск кадров" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU "Устанавливает количество кадров пропуска между отображаемыми кадрами." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU "Широкоэкранные чит-коды (требуется перезапуск)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_RU "Активирует чит-коды, которые позволяют отображать некоторые игры в широкоэкранном формате." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_RU "Широкоэкранный хак" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_RU "Отрисовывать геометрию вне нормального соотношения 4:3. Может вызвать графические артефакты в показываемых областях." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_RU "Быстрая загрузка GD-ROM (неточно)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_RU "Ускоряет загрузку GD-ROM." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_RU NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_RU NULL -#define OPTION_VAL_100_RU NULL -#define OPTION_VAL_110_RU NULL -#define OPTION_VAL_120_RU NULL -#define OPTION_VAL_130_RU NULL -#define OPTION_VAL_140_RU NULL -#define OPTION_VAL_150_RU NULL -#define OPTION_VAL_160_RU NULL -#define OPTION_VAL_170_RU NULL -#define OPTION_VAL_180_RU NULL -#define OPTION_VAL_190_RU NULL -#define OPTION_VAL_200_RU NULL -#define OPTION_VAL_210_RU NULL -#define OPTION_VAL_220_RU NULL -#define OPTION_VAL_230_RU NULL -#define OPTION_VAL_240_RU NULL -#define OPTION_VAL_250_RU NULL -#define OPTION_VAL_260_RU NULL -#define OPTION_VAL_270_RU NULL -#define OPTION_VAL_280_RU NULL -#define OPTION_VAL_290_RU NULL -#define OPTION_VAL_300_RU NULL -#define OPTION_VAL_310_RU NULL -#define OPTION_VAL_320_RU NULL -#define OPTION_VAL_330_RU NULL -#define OPTION_VAL_340_RU NULL -#define OPTION_VAL_350_RU NULL -#define OPTION_VAL_360_RU NULL -#define OPTION_VAL_370_RU NULL -#define OPTION_VAL_380_RU NULL -#define OPTION_VAL_390_RU NULL -#define OPTION_VAL_400_RU NULL -#define OPTION_VAL_410_RU NULL -#define OPTION_VAL_420_RU NULL -#define OPTION_VAL_430_RU NULL -#define OPTION_VAL_440_RU NULL -#define OPTION_VAL_450_RU NULL -#define OPTION_VAL_460_RU NULL -#define OPTION_VAL_470_RU NULL -#define OPTION_VAL_480_RU NULL -#define OPTION_VAL_490_RU NULL -#define OPTION_VAL_500_RU NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_RU "Загружать пользовательские текстуры" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_RU "Дамп текстур" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_RU "Мёртвая зона аналогового стика" -#define OPTION_VAL_0_RU NULL -#define OPTION_VAL_5_RU NULL -#define OPTION_VAL_10_RU NULL -#define OPTION_VAL_15_RU NULL -#define OPTION_VAL_20_RU NULL -#define OPTION_VAL_25_RU NULL -#define OPTION_VAL_30_RU NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU "Мёртвая зона триггеров" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU "Цифровые триггеры" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_RU "Модуль вибрации/Puru Puru" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU "Включает отдачу контроллера." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU "Транслировать цифровые сигналы" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU "Транслировать события цифрового ввода и состояние вибрации в TCP-порт 8000. Совместимо с параметром MAME \"-output network\"." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU "Показать настройки светового пистолета" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU "Включает конфигурацию параметров прицела светового пистолета. Для применения настройки требуется переключить быстрое меню." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 1" -#define OPTION_VAL_WHITE_RU "Белый" -#define OPTION_VAL_RED_RU "Красный" -#define OPTION_VAL_GREEN_RU "Зелёный" -#define OPTION_VAL_BLUE_RU "Голубой" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_RU "Отображение прицела пистолета 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_RU "Отдельные блоки визуальной памяти (VMU) для игр" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_RU "VMU для каждой игры" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_RU "Если выключено, для всех игр используются 4 общие файла сохранений VMU (A1, B1, C1, D1), расположенные в системном каталоге RetroArch. В режиме 'VMU A1' для каждой загруженной игры в каталоге сохранений RetroArch создаётся уникальный файл VMU 'A1'. В режиме 'Все VMU' для каждой запускаемой игры создаётся по 4 уникальных файла VMU (A1, B1, C1, D1)." -#define OPTION_VAL_VMU_A1_RU NULL -#define OPTION_VAL_ALL_VMUS_RU "Все VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_RU NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_RU NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_RU NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU "Показывать настройки отображения блока визуальной памяти (VMU)" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU "Показывать настройки отображения VMU" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU "Включает конфигурацию размера, положения, цвета и видимости эмулируемого ЖК-экрана VMU. Для применения настройки требуется переключить быстрое меню." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 1" -#define OPTION_VAL_UPPER_LEFT_RU "Вверху слева" -#define OPTION_VAL_UPPER_RIGHT_RU "Вверху справа" -#define OPTION_VAL_LOWER_LEFT_RU "Внизу слева" -#define OPTION_VAL_LOWER_RIGHT_RU "Внизу справа" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 1" -#define OPTION_VAL_1X_RU NULL -#define OPTION_VAL_3X_RU NULL -#define OPTION_VAL_5X_RU NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 1" -#define OPTION_VAL_DEFAULT_ON_00_RU "По умолчанию ВКЛ" -#define OPTION_VAL_DEFAULT_OFF_01_RU "По умолчанию ВЫКЛ" -#define OPTION_VAL_BLACK_02_RU "Чёрный" -#define OPTION_VAL_LIGHT_BLUE_04_RU "Светло-синий" -#define OPTION_VAL_CYAN_06_RU "Сине-зелёный" -#define OPTION_VAL_CYAN_BLUE_07_RU "Голубовато-синий" -#define OPTION_VAL_LIGHT_GREEN_08_RU "Светло-зелёный" -#define OPTION_VAL_CYAN_GREEN_09_RU "Голубовато-зелёный" -#define OPTION_VAL_LIGHT_CYAN_10_RU "Светло-голубой" -#define OPTION_VAL_PURPLE_12_RU "Фиолетовый" -#define OPTION_VAL_LIGHT_PURPLE_13_RU "Светло-фиолетовый" -#define OPTION_VAL_YELLOW_14_RU "Жёлтая" -#define OPTION_VAL_GRAY_15_RU "Серый" -#define OPTION_VAL_LIGHT_PURPLE_2_16_RU "Светло-фиолетовый (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_RU "Светло-зелёный (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_RU "Светло-зелёный (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_RU "Светло-циановый (2)" -#define OPTION_VAL_LIGHT_RED_2_20_RU "Светло-красный (2)" -#define OPTION_VAL_MAGENTA_21_RU "Пурпурный" -#define OPTION_VAL_LIGHT_PURPLE_3_22_RU "Светло-фиолетовый (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_RU "Светло-оранжевый" -#define OPTION_VAL_ORANGE_24_RU "Оранжевый" -#define OPTION_VAL_LIGHT_PURPLE_4_25_RU "Светло-фиолетовый (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_RU "Светло-жёлтый" -#define OPTION_VAL_LIGHT_YELLOW_2_27_RU "Светло-жёлтый (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 1" -#define OPTION_VAL_40_RU NULL -#define OPTION_VAL_50_RU NULL -#define OPTION_VAL_60_RU NULL -#define OPTION_VAL_70_RU NULL -#define OPTION_VAL_80_RU NULL -#define OPTION_VAL_90_RU NULL -#define OPTION_VAL_100_O57_RU NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_RU "Показывать экран VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_RU "Положение экрана VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_RU "Размер экрана VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_RU "Цвет вкл. пикселей VMU 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_RU "Цвет выкл. пикселей VMU 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_RU "Видимость экрана VMU 4" +#define CATEGORY_SYSTEM_LABEL_SK "Systém" +#define CATEGORY_SYSTEM_INFO_0_SK NULL +#define CATEGORY_VIDEO_LABEL_SK NULL +#define CATEGORY_VIDEO_INFO_0_SK NULL +#define CATEGORY_PERFORMANCE_LABEL_SK "Výkon" +#define CATEGORY_PERFORMANCE_INFO_0_SK NULL +#define CATEGORY_HACKS_LABEL_SK "Emulačné hacky" +#define CATEGORY_HACKS_INFO_0_SK NULL +#define CATEGORY_INPUT_LABEL_SK "Vstup" +#define CATEGORY_INPUT_INFO_0_SK NULL +#define CATEGORY_EXPANSIONS_LABEL_SK NULL +#define CATEGORY_EXPANSIONS_INFO_0_SK NULL +#define CATEGORY_VMU_LABEL_SK NULL +#define CATEGORY_VMU_INFO_0_SK NULL +#define CORE_OPTION_NAME_REGION_LABEL_SK "Región" +#define OPTION_VAL_JAPAN_SK "Japonsko" +#define OPTION_VAL_USA_SK NULL +#define OPTION_VAL_EUROPE_SK "Európa" +#define OPTION_VAL_DEFAULT_SK "Predvolené" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_SK "Jazyk" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SK NULL +#define OPTION_VAL_JAPANESE_SK "Japončina" +#define OPTION_VAL_ENGLISH_SK "Angličtina" +#define OPTION_VAL_GERMAN_SK "Nemčina" +#define OPTION_VAL_FRENCH_SK "Francúzština" +#define OPTION_VAL_SPANISH_SK "Španielčina" +#define OPTION_VAL_ITALIAN_SK "Taliančina" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SK NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SK NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SK NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SK NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SK "Povoliť DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SK NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SK NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SK NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SK NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SK NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SK NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SK NULL +#define CORE_OPTION_NAME_UPNP_LABEL_SK NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_SK NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SK "Vnútorné rozlíšenie" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SK NULL +#define OPTION_VAL_320X240_SK NULL +#define OPTION_VAL_640X480_SK NULL +#define OPTION_VAL_800X600_SK NULL +#define OPTION_VAL_960X720_SK NULL +#define OPTION_VAL_1024X768_SK NULL +#define OPTION_VAL_1280X960_SK NULL +#define OPTION_VAL_1440X1080_SK NULL +#define OPTION_VAL_1600X1200_SK NULL +#define OPTION_VAL_1920X1440_SK NULL +#define OPTION_VAL_2560X1920_SK NULL +#define OPTION_VAL_2880X2160_SK NULL +#define OPTION_VAL_3200X2400_SK NULL +#define OPTION_VAL_3840X2880_SK NULL +#define OPTION_VAL_4480X3360_SK NULL +#define OPTION_VAL_5120X3840_SK NULL +#define OPTION_VAL_5760X4320_SK NULL +#define OPTION_VAL_6400X4800_SK NULL +#define OPTION_VAL_7040X5280_SK NULL +#define OPTION_VAL_7680X5760_SK NULL +#define OPTION_VAL_8320X6240_SK NULL +#define OPTION_VAL_8960X6720_SK NULL +#define OPTION_VAL_9600X7200_SK NULL +#define OPTION_VAL_10240X7680_SK NULL +#define OPTION_VAL_10880X8160_SK NULL +#define OPTION_VAL_11520X8640_SK NULL +#define OPTION_VAL_12160X9120_SK NULL +#define OPTION_VAL_12800X9600_SK NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SK "Typ kábla" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SK NULL +#define OPTION_VAL_VGA_SK NULL +#define OPTION_VAL_TV_RGB_SK NULL +#define OPTION_VAL_TV_COMPOSITE_SK "TV (composite)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_SK "Vysielací štandard" +#define OPTION_VAL_NTSC_SK NULL +#define OPTION_VAL_PAL_SK "PAL (svet)" +#define OPTION_VAL_PAL_N_SK "PAL-N (Argentína, Paraguaj, Uruguaj)" +#define OPTION_VAL_PAL_M_SK "PAL-M (Brazília)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SK "Orientácia Obrazovky" +#define OPTION_VAL_HORIZONTAL_SK "Vodorovne" +#define OPTION_VAL_VERTICAL_SK "Zvislo" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SK NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SK NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SK NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_SK NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_SK NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SK NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SK NULL +#define OPTION_VAL_512MB_SK "512 MB" +#define OPTION_VAL_1GB_SK NULL +#define OPTION_VAL_2GB_SK NULL +#define OPTION_VAL_4GB_SK NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SK NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SK NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SK NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SK NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SK NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SK NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SK NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_SK NULL +#define CORE_OPTION_NAME_FOG_LABEL_SK "Efekty hmly" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SK NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SK NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SK "Anizotropné filtrovanie" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SK NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SK "Filtrovanie textúr" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SK NULL +#define OPTION_VAL_1_SK NULL +#define OPTION_VAL_2_SK "Vynútiť lineárne" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SK NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SK NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SK NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SK NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SK NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SK NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SK NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SK NULL +#define OPTION_VAL_2_O26_SK NULL +#define OPTION_VAL_4_SK NULL +#define OPTION_VAL_6_SK NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SK NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SK NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SK NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SK NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SK NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SK NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SK NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SK NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SK NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SK NULL +#define OPTION_VAL_SOME_SK "Normálne" +#define OPTION_VAL_MORE_SK "Maximálne" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SK "Preskakovanie snímkov" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SK NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SK NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SK NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SK NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SK NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SK NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SK NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SK NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SK NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SK NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SK NULL +#define OPTION_VAL_100_SK NULL +#define OPTION_VAL_110_SK NULL +#define OPTION_VAL_120_SK NULL +#define OPTION_VAL_130_SK NULL +#define OPTION_VAL_140_SK NULL +#define OPTION_VAL_150_SK NULL +#define OPTION_VAL_160_SK NULL +#define OPTION_VAL_170_SK NULL +#define OPTION_VAL_180_SK NULL +#define OPTION_VAL_190_SK NULL +#define OPTION_VAL_200_SK "200 Hz" +#define OPTION_VAL_210_SK "210 Hz" +#define OPTION_VAL_220_SK "220 Hz" +#define OPTION_VAL_230_SK "230 Hz" +#define OPTION_VAL_240_SK "240 Hz" +#define OPTION_VAL_250_SK "250 Hz" +#define OPTION_VAL_260_SK "260 Hz" +#define OPTION_VAL_270_SK "270 Hz" +#define OPTION_VAL_280_SK "280 Hz" +#define OPTION_VAL_290_SK "290 Hz" +#define OPTION_VAL_300_SK "300 Hz" +#define OPTION_VAL_310_SK "310 Hz" +#define OPTION_VAL_320_SK "320 Hz" +#define OPTION_VAL_330_SK NULL +#define OPTION_VAL_340_SK "340 Hz" +#define OPTION_VAL_350_SK "350 Hz" +#define OPTION_VAL_360_SK "360 Hz" +#define OPTION_VAL_370_SK "370 Hz" +#define OPTION_VAL_380_SK "380 Hz" +#define OPTION_VAL_390_SK "390 Hz" +#define OPTION_VAL_400_SK "400 Hz" +#define OPTION_VAL_410_SK "410 Hz" +#define OPTION_VAL_420_SK "420 Hz" +#define OPTION_VAL_430_SK "430 Hz" +#define OPTION_VAL_440_SK "440 Hz" +#define OPTION_VAL_450_SK "450 Hz" +#define OPTION_VAL_460_SK "460 Hz" +#define OPTION_VAL_470_SK "470 Hz" +#define OPTION_VAL_480_SK "480 Hz" +#define OPTION_VAL_490_SK "490 Hz" +#define OPTION_VAL_500_SK NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SK NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SK NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SK NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SK NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SK NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SK NULL +#define OPTION_VAL_0_SK NULL +#define OPTION_VAL_5_SK NULL +#define OPTION_VAL_10_SK NULL +#define OPTION_VAL_15_SK NULL +#define OPTION_VAL_20_SK NULL +#define OPTION_VAL_25_SK NULL +#define OPTION_VAL_30_SK NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SK NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SK NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SK NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SK NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SK NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SK NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SK NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SK NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SK NULL +#define OPTION_VAL_50_SK NULL +#define OPTION_VAL_60_SK NULL +#define OPTION_VAL_70_SK NULL +#define OPTION_VAL_80_SK NULL +#define OPTION_VAL_90_SK NULL +#define OPTION_VAL_100_O45_SK NULL +#define OPTION_VAL_110_O45_SK NULL +#define OPTION_VAL_120_O45_SK NULL +#define OPTION_VAL_130_O45_SK NULL +#define OPTION_VAL_140_O45_SK NULL +#define OPTION_VAL_150_O45_SK NULL +#define OPTION_VAL_160_O45_SK NULL +#define OPTION_VAL_170_O45_SK NULL +#define OPTION_VAL_180_O45_SK NULL +#define OPTION_VAL_190_O45_SK NULL +#define OPTION_VAL_200_O45_SK NULL +#define OPTION_VAL_210_O45_SK NULL +#define OPTION_VAL_220_O45_SK NULL +#define OPTION_VAL_230_O45_SK NULL +#define OPTION_VAL_240_O45_SK NULL +#define OPTION_VAL_250_O45_SK NULL +#define OPTION_VAL_260_O45_SK NULL +#define OPTION_VAL_270_O45_SK NULL +#define OPTION_VAL_280_O45_SK NULL +#define OPTION_VAL_290_O45_SK NULL +#define OPTION_VAL_300_O45_SK NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SK NULL +#define OPTION_VAL_WHITE_SK "Biela" +#define OPTION_VAL_RED_SK "Červená" +#define OPTION_VAL_GREEN_SK "Zelená" +#define OPTION_VAL_BLUE_SK "Modrá" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SK NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SK NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SK NULL +#define OPTION_VAL_VMU_SK NULL +#define OPTION_VAL_PURUPURU_SK NULL +#define OPTION_VAL_NONE_SK "Žiadne" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SK NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SK NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SK NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SK NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SK NULL +#define OPTION_VAL_VMU_A1_SK NULL +#define OPTION_VAL_ALL_VMUS_SK "Všetky VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SK NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SK NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SK NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SK NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SK NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SK NULL +#define OPTION_VAL_UPPER_LEFT_SK "Hore vľavo" +#define OPTION_VAL_UPPER_RIGHT_SK "Hore vpravo" +#define OPTION_VAL_LOWER_LEFT_SK "Vľavo dolu" +#define OPTION_VAL_LOWER_RIGHT_SK "Vpravo dolu" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SK NULL +#define OPTION_VAL_1X_SK NULL +#define OPTION_VAL_3X_SK NULL +#define OPTION_VAL_5X_SK NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SK NULL +#define OPTION_VAL_DEFAULT_ON_00_SK "Predvolene zapnuté" +#define OPTION_VAL_DEFAULT_OFF_01_SK "Predvolene vypnuté" +#define OPTION_VAL_BLACK_02_SK "Čierna" +#define OPTION_VAL_LIGHT_BLUE_04_SK "Svetlomodrá" +#define OPTION_VAL_CYAN_06_SK "Azúrová" +#define OPTION_VAL_CYAN_BLUE_07_SK "Tyrkysová modrá" +#define OPTION_VAL_LIGHT_GREEN_08_SK "Svetlozelená" +#define OPTION_VAL_CYAN_GREEN_09_SK "Tyrkysová zelená" +#define OPTION_VAL_LIGHT_CYAN_10_SK "Svetloazúrová" +#define OPTION_VAL_PURPLE_12_SK "Fialová" +#define OPTION_VAL_LIGHT_PURPLE_13_SK "Svetlofialová" +#define OPTION_VAL_YELLOW_14_SK "Žltá" +#define OPTION_VAL_GRAY_15_SK "Šedá" +#define OPTION_VAL_LIGHT_PURPLE_2_16_SK "Svetlofialová (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_SK "Svetlozelená (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_SK "Svetlozelená (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_SK "Svetloazúrová (2)" +#define OPTION_VAL_LIGHT_RED_2_20_SK "Svetločervená (2)" +#define OPTION_VAL_MAGENTA_21_SK "Purpurová" +#define OPTION_VAL_LIGHT_PURPLE_3_22_SK "Svetlofialová (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_SK "Svetlooranžová" +#define OPTION_VAL_ORANGE_24_SK "Oranžová" +#define OPTION_VAL_LIGHT_PURPLE_4_25_SK "Svetlofialová (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_SK "Svetložltá" +#define OPTION_VAL_LIGHT_YELLOW_2_27_SK "Svetložltá (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SK NULL +#define OPTION_VAL_40_SK NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SK NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SK NULL -struct retro_core_option_v2_category option_cats_ru[] = { +struct retro_core_option_v2_category option_cats_sk[] = { { "system", - CATEGORY_SYSTEM_LABEL_RU, - CATEGORY_SYSTEM_INFO_0_RU + CATEGORY_SYSTEM_LABEL_SK, + CATEGORY_SYSTEM_INFO_0_SK }, { "video", - CATEGORY_VIDEO_LABEL_RU, - CATEGORY_VIDEO_INFO_0_RU + CATEGORY_VIDEO_LABEL_SK, + CATEGORY_VIDEO_INFO_0_SK }, { "performance", - CATEGORY_PERFORMANCE_LABEL_RU, - CATEGORY_PERFORMANCE_INFO_0_RU + CATEGORY_PERFORMANCE_LABEL_SK, + CATEGORY_PERFORMANCE_INFO_0_SK }, { "hacks", - CATEGORY_HACKS_LABEL_RU, - CATEGORY_HACKS_INFO_0_RU + CATEGORY_HACKS_LABEL_SK, + CATEGORY_HACKS_INFO_0_SK }, { "input", - CATEGORY_INPUT_LABEL_RU, - CATEGORY_INPUT_INFO_0_RU + CATEGORY_INPUT_LABEL_SK, + CATEGORY_INPUT_INFO_0_SK + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_SK, + CATEGORY_EXPANSIONS_INFO_0_SK }, { "vmu", - CATEGORY_VMU_LABEL_RU, - CATEGORY_VMU_INFO_0_RU + CATEGORY_VMU_LABEL_SK, + CATEGORY_VMU_INFO_0_SK }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_ru[] = { +struct retro_core_option_v2_definition option_defs_sk[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_RU, + CORE_OPTION_NAME_REGION_LABEL_SK, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_RU }, - { "USA", OPTION_VAL_USA_RU }, - { "Europe", OPTION_VAL_EUROPE_RU }, - { "Default", OPTION_VAL_DEFAULT_RU }, + { "Japan", OPTION_VAL_JAPAN_SK }, + { "USA", OPTION_VAL_USA_SK }, + { "Europe", OPTION_VAL_EUROPE_SK }, + { "Default", OPTION_VAL_DEFAULT_SK }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_RU, + CORE_OPTION_NAME_LANGUAGE_LABEL_SK, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_RU, + CORE_OPTION_NAME_LANGUAGE_INFO_0_SK, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_RU }, - { "English", OPTION_VAL_ENGLISH_RU }, - { "German", OPTION_VAL_GERMAN_RU }, - { "French", OPTION_VAL_FRENCH_RU }, - { "Spanish", OPTION_VAL_SPANISH_RU }, - { "Italian", OPTION_VAL_ITALIAN_RU }, - { "Default", OPTION_VAL_DEFAULT_RU }, + { "Japanese", OPTION_VAL_JAPANESE_SK }, + { "English", OPTION_VAL_ENGLISH_SK }, + { "German", OPTION_VAL_GERMAN_SK }, + { "French", OPTION_VAL_FRENCH_SK }, + { "Spanish", OPTION_VAL_SPANISH_SK }, + { "Italian", OPTION_VAL_ITALIAN_SK }, + { "Default", OPTION_VAL_DEFAULT_SK }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_RU, + CORE_OPTION_NAME_HLE_BIOS_LABEL_SK, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_RU, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_SK, NULL, "system", { @@ -56192,9 +66907,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_RU, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SK, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_RU, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SK, NULL, "system", { @@ -56206,9 +66921,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_RU, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_SK, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_RU, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SK, NULL, "system", { @@ -56222,25 +66937,11 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_RU, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_RU, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_RU, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SK, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_RU, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SK, NULL, "system", { @@ -56252,9 +66953,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_RU, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SK, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_RU, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SK, NULL, "system", { @@ -56266,9 +66967,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_RU, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_SK, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_RU, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SK, NULL, "system", { @@ -56280,9 +66981,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_RU, + CORE_OPTION_NAME_UPNP_LABEL_SK, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_RU, + CORE_OPTION_NAME_UPNP_INFO_0_SK, NULL, "system", { @@ -56295,39 +66996,39 @@ struct retro_core_option_v2_definition option_defs_ru[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_RU, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SK, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_RU, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SK, NULL, "video", { - { "320x240", OPTION_VAL_320X240_RU }, - { "640x480", OPTION_VAL_640X480_RU }, - { "800x600", OPTION_VAL_800X600_RU }, - { "960x720", OPTION_VAL_960X720_RU }, - { "1024x768", OPTION_VAL_1024X768_RU }, - { "1280x960", OPTION_VAL_1280X960_RU }, - { "1440x1080", OPTION_VAL_1440X1080_RU }, - { "1600x1200", OPTION_VAL_1600X1200_RU }, - { "1920x1440", OPTION_VAL_1920X1440_RU }, - { "2560x1920", OPTION_VAL_2560X1920_RU }, - { "2880x2160", OPTION_VAL_2880X2160_RU }, - { "3200x2400", OPTION_VAL_3200X2400_RU }, - { "3840x2880", OPTION_VAL_3840X2880_RU }, - { "4480x3360", OPTION_VAL_4480X3360_RU }, - { "5120x3840", OPTION_VAL_5120X3840_RU }, - { "5760x4320", OPTION_VAL_5760X4320_RU }, - { "6400x4800", OPTION_VAL_6400X4800_RU }, - { "7040x5280", OPTION_VAL_7040X5280_RU }, - { "7680x5760", OPTION_VAL_7680X5760_RU }, - { "8320x6240", OPTION_VAL_8320X6240_RU }, - { "8960x6720", OPTION_VAL_8960X6720_RU }, - { "9600x7200", OPTION_VAL_9600X7200_RU }, - { "10240x7680", OPTION_VAL_10240X7680_RU }, - { "10880x8160", OPTION_VAL_10880X8160_RU }, - { "11520x8640", OPTION_VAL_11520X8640_RU }, - { "12160x9120", OPTION_VAL_12160X9120_RU }, - { "12800x9600", OPTION_VAL_12800X9600_RU }, + { "320x240", OPTION_VAL_320X240_SK }, + { "640x480", OPTION_VAL_640X480_SK }, + { "800x600", OPTION_VAL_800X600_SK }, + { "960x720", OPTION_VAL_960X720_SK }, + { "1024x768", OPTION_VAL_1024X768_SK }, + { "1280x960", OPTION_VAL_1280X960_SK }, + { "1440x1080", OPTION_VAL_1440X1080_SK }, + { "1600x1200", OPTION_VAL_1600X1200_SK }, + { "1920x1440", OPTION_VAL_1920X1440_SK }, + { "2560x1920", OPTION_VAL_2560X1920_SK }, + { "2880x2160", OPTION_VAL_2880X2160_SK }, + { "3200x2400", OPTION_VAL_3200X2400_SK }, + { "3840x2880", OPTION_VAL_3840X2880_SK }, + { "4480x3360", OPTION_VAL_4480X3360_SK }, + { "5120x3840", OPTION_VAL_5120X3840_SK }, + { "5760x4320", OPTION_VAL_5760X4320_SK }, + { "6400x4800", OPTION_VAL_6400X4800_SK }, + { "7040x5280", OPTION_VAL_7040X5280_SK }, + { "7680x5760", OPTION_VAL_7680X5760_SK }, + { "8320x6240", OPTION_VAL_8320X6240_SK }, + { "8960x6720", OPTION_VAL_8960X6720_SK }, + { "9600x7200", OPTION_VAL_9600X7200_SK }, + { "10240x7680", OPTION_VAL_10240X7680_SK }, + { "10880x8160", OPTION_VAL_10880X8160_SK }, + { "11520x8640", OPTION_VAL_11520X8640_SK }, + { "12160x9120", OPTION_VAL_12160X9120_SK }, + { "12800x9600", OPTION_VAL_12800X9600_SK }, { NULL, NULL }, }, #ifdef LOW_RES @@ -56338,62 +67039,62 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_RU, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_SK, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_RU, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SK, NULL, "video", { - { "VGA", OPTION_VAL_VGA_RU }, - { "TV (RGB)", OPTION_VAL_TV_RGB_RU }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_RU }, + { "VGA", OPTION_VAL_VGA_SK }, + { "TV (RGB)", OPTION_VAL_TV_RGB_SK }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SK }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_RU, + CORE_OPTION_NAME_BROADCAST_LABEL_SK, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_RU }, - { "PAL", OPTION_VAL_PAL_RU }, - { "PAL_N", OPTION_VAL_PAL_N_RU }, - { "PAL_M", OPTION_VAL_PAL_M_RU }, - { "Default", OPTION_VAL_DEFAULT_RU }, + { "NTSC", OPTION_VAL_NTSC_SK }, + { "PAL", OPTION_VAL_PAL_SK }, + { "PAL_N", OPTION_VAL_PAL_N_SK }, + { "PAL_M", OPTION_VAL_PAL_M_SK }, + { "Default", OPTION_VAL_DEFAULT_SK }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_RU, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SK, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_RU }, - { "vertical", OPTION_VAL_VERTICAL_RU }, + { "horizontal", OPTION_VAL_HORIZONTAL_SK }, + { "vertical", OPTION_VAL_VERTICAL_SK }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_RU, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SK, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_RU }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_RU }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SK }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SK }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_RU }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SK }, #endif { NULL, NULL }, }, @@ -56406,25 +67107,25 @@ struct retro_core_option_v2_definition option_defs_ru[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_RU, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SK, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_RU, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SK, NULL, "video", { - { "512MB", OPTION_VAL_512MB_RU }, - { "1GB", OPTION_VAL_1GB_RU }, - { "2GB", OPTION_VAL_2GB_RU }, - { "4GB", OPTION_VAL_4GB_RU }, + { "512MB", OPTION_VAL_512MB_SK }, + { "1GB", OPTION_VAL_1GB_SK }, + { "2GB", OPTION_VAL_2GB_SK }, + { "4GB", OPTION_VAL_4GB_SK }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_RU, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_SK, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_RU, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SK, NULL, "video", { @@ -56432,6 +67133,7 @@ struct retro_core_option_v2_definition option_defs_ru[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -56440,9 +67142,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_RU, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SK, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_RU, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SK, NULL, "video", { @@ -56454,9 +67156,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_RU, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SK, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_RU, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SK, NULL, "video", { @@ -56466,11 +67168,11 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_RU, + CORE_OPTION_NAME_MIPMAPPING_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_SK, NULL, "video", { @@ -56482,7 +67184,7 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_RU, + CORE_OPTION_NAME_FOG_LABEL_SK, NULL, "", NULL, @@ -56496,9 +67198,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_RU, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SK, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_RU, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SK, NULL, "video", { @@ -56510,9 +67212,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_RU, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SK, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_RU, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SK, NULL, "video", { @@ -56527,24 +67229,24 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_RU, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SK, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_RU, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SK, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_RU }, - { "1", OPTION_VAL_1_RU }, - { "2", OPTION_VAL_2_RU }, + { "0", OPTION_VAL_DEFAULT_SK }, + { "1", OPTION_VAL_1_SK }, + { "2", OPTION_VAL_2_SK }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_RU, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SK, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_RU, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SK, NULL, "video", { @@ -56552,13 +67254,13 @@ struct retro_core_option_v2_definition option_defs_ru[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_RU, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SK, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_RU, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SK, NULL, "video", { @@ -56570,9 +67272,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_RU, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SK, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_RU, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SK, NULL, "video", { @@ -56585,25 +67287,25 @@ struct retro_core_option_v2_definition option_defs_ru[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_RU, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_SK, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_RU, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SK, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_RU }, - { "4", OPTION_VAL_4_RU }, - { "6", OPTION_VAL_6_RU }, + { "2", OPTION_VAL_2_O26_SK }, + { "4", OPTION_VAL_4_SK }, + { "6", OPTION_VAL_6_SK }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_RU, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SK, NULL, "video", { @@ -56617,9 +67319,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_RU, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SK, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_RU, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SK, NULL, "video", { @@ -56629,11 +67331,25 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SK, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SK, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_RU, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SK, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_RU, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SK, NULL, "performance", { @@ -56645,15 +67361,15 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_RU, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SK, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_RU, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SK, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_RU }, - { "more", OPTION_VAL_MORE_RU }, + { "some", OPTION_VAL_SOME_SK }, + { "more", OPTION_VAL_MORE_SK }, { NULL, NULL }, }, #ifdef LOW_END @@ -56664,9 +67380,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_RU, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SK, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_RU, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SK, NULL, "performance", { @@ -56683,9 +67399,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_RU, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SK, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_RU, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SK, NULL, "hacks", { @@ -56697,9 +67413,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_RU, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SK, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_RU, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SK, NULL, "hacks", { @@ -56711,9 +67427,9 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_RU, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SK, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_RU, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SK, NULL, "hacks", { @@ -56727,64 +67443,78 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SK, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SK, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_RU, + CORE_OPTION_NAME_SH4CLOCK_LABEL_SK, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_RU, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_SK, NULL, "hacks", { - { "100", OPTION_VAL_100_RU }, - { "110", OPTION_VAL_110_RU }, - { "120", OPTION_VAL_120_RU }, - { "130", OPTION_VAL_130_RU }, - { "140", OPTION_VAL_140_RU }, - { "150", OPTION_VAL_150_RU }, - { "160", OPTION_VAL_160_RU }, - { "170", OPTION_VAL_170_RU }, - { "180", OPTION_VAL_180_RU }, - { "190", OPTION_VAL_190_RU }, - { "200", OPTION_VAL_200_RU }, - { "210", OPTION_VAL_210_RU }, - { "220", OPTION_VAL_220_RU }, - { "230", OPTION_VAL_230_RU }, - { "240", OPTION_VAL_240_RU }, - { "250", OPTION_VAL_250_RU }, - { "260", OPTION_VAL_260_RU }, - { "270", OPTION_VAL_270_RU }, - { "280", OPTION_VAL_280_RU }, - { "290", OPTION_VAL_290_RU }, - { "300", OPTION_VAL_300_RU }, - { "310", OPTION_VAL_310_RU }, - { "320", OPTION_VAL_320_RU }, - { "330", OPTION_VAL_330_RU }, - { "340", OPTION_VAL_340_RU }, - { "350", OPTION_VAL_350_RU }, - { "360", OPTION_VAL_360_RU }, - { "370", OPTION_VAL_370_RU }, - { "380", OPTION_VAL_380_RU }, - { "390", OPTION_VAL_390_RU }, - { "400", OPTION_VAL_400_RU }, - { "410", OPTION_VAL_410_RU }, - { "420", OPTION_VAL_420_RU }, - { "430", OPTION_VAL_430_RU }, - { "440", OPTION_VAL_440_RU }, - { "450", OPTION_VAL_450_RU }, - { "460", OPTION_VAL_460_RU }, - { "470", OPTION_VAL_470_RU }, - { "480", OPTION_VAL_480_RU }, - { "490", OPTION_VAL_490_RU }, - { "500", OPTION_VAL_500_RU }, + { "100", OPTION_VAL_100_SK }, + { "110", OPTION_VAL_110_SK }, + { "120", OPTION_VAL_120_SK }, + { "130", OPTION_VAL_130_SK }, + { "140", OPTION_VAL_140_SK }, + { "150", OPTION_VAL_150_SK }, + { "160", OPTION_VAL_160_SK }, + { "170", OPTION_VAL_170_SK }, + { "180", OPTION_VAL_180_SK }, + { "190", OPTION_VAL_190_SK }, + { "200", OPTION_VAL_200_SK }, + { "210", OPTION_VAL_210_SK }, + { "220", OPTION_VAL_220_SK }, + { "230", OPTION_VAL_230_SK }, + { "240", OPTION_VAL_240_SK }, + { "250", OPTION_VAL_250_SK }, + { "260", OPTION_VAL_260_SK }, + { "270", OPTION_VAL_270_SK }, + { "280", OPTION_VAL_280_SK }, + { "290", OPTION_VAL_290_SK }, + { "300", OPTION_VAL_300_SK }, + { "310", OPTION_VAL_310_SK }, + { "320", OPTION_VAL_320_SK }, + { "330", OPTION_VAL_330_SK }, + { "340", OPTION_VAL_340_SK }, + { "350", OPTION_VAL_350_SK }, + { "360", OPTION_VAL_360_SK }, + { "370", OPTION_VAL_370_SK }, + { "380", OPTION_VAL_380_SK }, + { "390", OPTION_VAL_390_SK }, + { "400", OPTION_VAL_400_SK }, + { "410", OPTION_VAL_410_SK }, + { "420", OPTION_VAL_420_SK }, + { "430", OPTION_VAL_430_SK }, + { "440", OPTION_VAL_440_SK }, + { "450", OPTION_VAL_450_SK }, + { "460", OPTION_VAL_460_SK }, + { "470", OPTION_VAL_470_SK }, + { "480", OPTION_VAL_480_SK }, + { "490", OPTION_VAL_490_SK }, + { "500", OPTION_VAL_500_SK }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_RU, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SK, NULL, "hacks", { @@ -56794,11 +67524,11 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_RU, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SK, NULL, "hacks", { @@ -56810,47 +67540,47 @@ struct retro_core_option_v2_definition option_defs_ru[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_RU, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SK, NULL, "input", { - { "0%", OPTION_VAL_0_RU }, - { "5%", OPTION_VAL_5_RU }, - { "10%", OPTION_VAL_10_RU }, - { "15%", OPTION_VAL_15_RU }, - { "20%", OPTION_VAL_20_RU }, - { "25%", OPTION_VAL_25_RU }, - { "30%", OPTION_VAL_30_RU }, + { "0%", OPTION_VAL_0_SK }, + { "5%", OPTION_VAL_5_SK }, + { "10%", OPTION_VAL_10_SK }, + { "15%", OPTION_VAL_15_SK }, + { "20%", OPTION_VAL_20_SK }, + { "25%", OPTION_VAL_25_SK }, + { "30%", OPTION_VAL_30_SK }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_RU, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SK, NULL, "input", { - { "0%", OPTION_VAL_0_RU }, - { "5%", OPTION_VAL_5_RU }, - { "10%", OPTION_VAL_10_RU }, - { "15%", OPTION_VAL_15_RU }, - { "20%", OPTION_VAL_20_RU }, - { "25%", OPTION_VAL_25_RU }, - { "30%", OPTION_VAL_30_RU }, + { "0%", OPTION_VAL_0_SK }, + { "5%", OPTION_VAL_5_SK }, + { "10%", OPTION_VAL_10_SK }, + { "15%", OPTION_VAL_15_SK }, + { "20%", OPTION_VAL_20_SK }, + { "25%", OPTION_VAL_25_SK }, + { "30%", OPTION_VAL_30_SK }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_RU, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SK, NULL, "input", { @@ -56861,10 +67591,10 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_RU, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SK, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_RU, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SK, NULL, "input", { @@ -56872,300 +67602,293 @@ struct retro_core_option_v2_definition option_defs_ru[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_RU, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SK, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_RU, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SK, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_RU, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SK, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_RU, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_SK }, + { "60%", OPTION_VAL_60_SK }, + { "70%", OPTION_VAL_70_SK }, + { "80%", OPTION_VAL_80_SK }, + { "90%", OPTION_VAL_90_SK }, + { "100%", OPTION_VAL_100_O45_SK }, + { "110%", OPTION_VAL_110_O45_SK }, + { "120%", OPTION_VAL_120_O45_SK }, + { "130%", OPTION_VAL_130_O45_SK }, + { "140%", OPTION_VAL_140_O45_SK }, + { "150%", OPTION_VAL_150_O45_SK }, + { "160%", OPTION_VAL_160_O45_SK }, + { "170%", OPTION_VAL_170_O45_SK }, + { "180%", OPTION_VAL_180_O45_SK }, + { "190%", OPTION_VAL_190_O45_SK }, + { "200%", OPTION_VAL_200_O45_SK }, + { "210%", OPTION_VAL_210_O45_SK }, + { "220%", OPTION_VAL_220_O45_SK }, + { "230%", OPTION_VAL_230_O45_SK }, + { "240%", OPTION_VAL_240_O45_SK }, + { "250%", OPTION_VAL_250_O45_SK }, + { "260%", OPTION_VAL_260_O45_SK }, + { "270%", OPTION_VAL_270_O45_SK }, + { "280%", OPTION_VAL_280_O45_SK }, + { "290%", OPTION_VAL_290_O45_SK }, + { "300%", OPTION_VAL_300_O45_SK }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_RU, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SK, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_RU }, - { "Red", OPTION_VAL_RED_RU }, - { "Green", OPTION_VAL_GREEN_RU }, - { "Blue", OPTION_VAL_BLUE_RU }, + { "White", OPTION_VAL_WHITE_SK }, + { "Red", OPTION_VAL_RED_SK }, + { "Green", OPTION_VAL_GREEN_SK }, + { "Blue", OPTION_VAL_BLUE_SK }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_RU, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SK, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_RU }, - { "Red", OPTION_VAL_RED_RU }, - { "Green", OPTION_VAL_GREEN_RU }, - { "Blue", OPTION_VAL_BLUE_RU }, + { "White", OPTION_VAL_WHITE_SK }, + { "Red", OPTION_VAL_RED_SK }, + { "Green", OPTION_VAL_GREEN_SK }, + { "Blue", OPTION_VAL_BLUE_SK }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_RU, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SK, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_RU }, - { "Red", OPTION_VAL_RED_RU }, - { "Green", OPTION_VAL_GREEN_RU }, - { "Blue", OPTION_VAL_BLUE_RU }, + { "White", OPTION_VAL_WHITE_SK }, + { "Red", OPTION_VAL_RED_SK }, + { "Green", OPTION_VAL_GREEN_SK }, + { "Blue", OPTION_VAL_BLUE_SK }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun4_crosshair", + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SK, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_SK }, + { "Red", OPTION_VAL_RED_SK }, + { "Green", OPTION_VAL_GREEN_SK }, + { "Blue", OPTION_VAL_BLUE_SK }, { NULL, NULL }, }, - "disabled", + "disabled", + }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, + { NULL, NULL }, + }, + "VMU", }, { - CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_RU, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SK, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_RU }, - { "Red", OPTION_VAL_RED_RU }, - { "Green", OPTION_VAL_GREEN_RU }, - { "Blue", OPTION_VAL_BLUE_RU }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_RU, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_RU, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_RU, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SK, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SK, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_RU }, - { "All VMUs", OPTION_VAL_ALL_VMUS_RU }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_RU, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_RU, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_RU, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SK, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SK, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_RU, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_RU, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_RU, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SK, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SK, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_RU, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SK, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_RU, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SK, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_RU, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SK, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SK, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_RU }, - { "2x", OPTION_VAL_2_O27_RU }, - { "3x", OPTION_VAL_3X_RU }, - { "4x", OPTION_VAL_4_RU }, - { "5x", OPTION_VAL_5X_RU }, + { "VMU", OPTION_VAL_VMU_SK }, + { "Purupuru", OPTION_VAL_PURUPURU_SK }, + { "None", OPTION_VAL_NONE_SK }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_RU, - NULL, - "", + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SK, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SK, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SK, NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, - { NULL, NULL }, + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_SK }, + { "All VMUs", OPTION_VAL_ALL_VMUS_SK }, + { NULL, NULL}, }, - "DEFAULT_ON 00", + "disabled", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_RU, - NULL, - "", + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_SK, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SK, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_SK, NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "DEFAULT_OFF 01", + "disabled", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_RU, - NULL, - "", + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SK, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SK, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SK, NULL, "vmu", { - { "10%", OPTION_VAL_10_RU }, - { "20%", OPTION_VAL_20_RU }, - { "30%", OPTION_VAL_30_RU }, - { "40%", OPTION_VAL_40_RU }, - { "50%", OPTION_VAL_50_RU }, - { "60%", OPTION_VAL_60_RU }, - { "70%", OPTION_VAL_70_RU }, - { "80%", OPTION_VAL_80_RU }, - { "90%", OPTION_VAL_90_RU }, - { "100%", OPTION_VAL_100_O57_RU }, - { NULL, NULL }, + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "100%", + "disabled" }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_RU, + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SK, NULL, "", NULL, @@ -57178,145 +67901,145 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_RU, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SK, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_RU, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SK, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_RU }, - { "2x", OPTION_VAL_2_O27_RU }, - { "3x", OPTION_VAL_3X_RU }, - { "4x", OPTION_VAL_4_RU }, - { "5x", OPTION_VAL_5X_RU }, + { "1x", OPTION_VAL_1X_SK }, + { "2x", OPTION_VAL_2_O26_SK }, + { "3x", OPTION_VAL_3X_SK }, + { "4x", OPTION_VAL_4_SK }, + { "5x", OPTION_VAL_5X_SK }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_RU, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SK, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_RU }, - { "20%", OPTION_VAL_20_RU }, - { "30%", OPTION_VAL_30_RU }, - { "40%", OPTION_VAL_40_RU }, - { "50%", OPTION_VAL_50_RU }, - { "60%", OPTION_VAL_60_RU }, - { "70%", OPTION_VAL_70_RU }, - { "80%", OPTION_VAL_80_RU }, - { "90%", OPTION_VAL_90_RU }, - { "100%", OPTION_VAL_100_O57_RU }, + { "10%", OPTION_VAL_10_SK }, + { "20%", OPTION_VAL_20_SK }, + { "30%", OPTION_VAL_30_SK }, + { "40%", OPTION_VAL_40_SK }, + { "50%", OPTION_VAL_50_SK }, + { "60%", OPTION_VAL_60_SK }, + { "70%", OPTION_VAL_70_SK }, + { "80%", OPTION_VAL_80_SK }, + { "90%", OPTION_VAL_90_SK }, + { "100%", OPTION_VAL_100_O45_SK }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_RU, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SK, NULL, "", NULL, @@ -57329,145 +68052,145 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_RU, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SK, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_RU, + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SK, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_RU }, - { "2x", OPTION_VAL_2_O27_RU }, - { "3x", OPTION_VAL_3X_RU }, - { "4x", OPTION_VAL_4_RU }, - { "5x", OPTION_VAL_5X_RU }, + { "1x", OPTION_VAL_1X_SK }, + { "2x", OPTION_VAL_2_O26_SK }, + { "3x", OPTION_VAL_3X_SK }, + { "4x", OPTION_VAL_4_SK }, + { "5x", OPTION_VAL_5X_SK }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_RU, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SK, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_RU }, - { "20%", OPTION_VAL_20_RU }, - { "30%", OPTION_VAL_30_RU }, - { "40%", OPTION_VAL_40_RU }, - { "50%", OPTION_VAL_50_RU }, - { "60%", OPTION_VAL_60_RU }, - { "70%", OPTION_VAL_70_RU }, - { "80%", OPTION_VAL_80_RU }, - { "90%", OPTION_VAL_90_RU }, - { "100%", OPTION_VAL_100_O57_RU }, + { "10%", OPTION_VAL_10_SK }, + { "20%", OPTION_VAL_20_SK }, + { "30%", OPTION_VAL_30_SK }, + { "40%", OPTION_VAL_40_SK }, + { "50%", OPTION_VAL_50_SK }, + { "60%", OPTION_VAL_60_SK }, + { "70%", OPTION_VAL_70_SK }, + { "80%", OPTION_VAL_80_SK }, + { "90%", OPTION_VAL_90_SK }, + { "100%", OPTION_VAL_100_O45_SK }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_RU, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SK, NULL, "", NULL, @@ -57480,506 +68203,712 @@ struct retro_core_option_v2_definition option_defs_ru[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_RU, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SK, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_RU }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_RU }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_RU }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_RU }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_RU, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SK, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_RU }, - { "2x", OPTION_VAL_2_O27_RU }, - { "3x", OPTION_VAL_3X_RU }, - { "4x", OPTION_VAL_4_RU }, - { "5x", OPTION_VAL_5X_RU }, + { "1x", OPTION_VAL_1X_SK }, + { "2x", OPTION_VAL_2_O26_SK }, + { "3x", OPTION_VAL_3X_SK }, + { "4x", OPTION_VAL_4_SK }, + { "5x", OPTION_VAL_5X_SK }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_RU, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SK, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_RU }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_RU }, - { "BLACK 02", OPTION_VAL_BLACK_02_RU }, - { "BLUE 03", OPTION_VAL_BLUE_RU }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_RU }, - { "GREEN 05", OPTION_VAL_GREEN_RU }, - { "CYAN 06", OPTION_VAL_CYAN_06_RU }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_RU }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_RU }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_RU }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_RU }, - { "RED 11", OPTION_VAL_RED_RU }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_RU }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_RU }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_RU }, - { "GRAY 15", OPTION_VAL_GRAY_15_RU }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_RU }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_RU }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_RU }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_RU }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_RU }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_RU }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_RU }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_RU }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_RU }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_RU }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_RU }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_RU }, - { "WHITE 28", OPTION_VAL_WHITE_RU }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_RU, + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SK, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_RU }, - { "20%", OPTION_VAL_20_RU }, - { "30%", OPTION_VAL_30_RU }, - { "40%", OPTION_VAL_40_RU }, - { "50%", OPTION_VAL_50_RU }, - { "60%", OPTION_VAL_60_RU }, - { "70%", OPTION_VAL_70_RU }, - { "80%", OPTION_VAL_80_RU }, - { "90%", OPTION_VAL_90_RU }, - { "100%", OPTION_VAL_100_O57_RU }, + { "10%", OPTION_VAL_10_SK }, + { "20%", OPTION_VAL_20_SK }, + { "30%", OPTION_VAL_30_SK }, + { "40%", OPTION_VAL_40_SK }, + { "50%", OPTION_VAL_50_SK }, + { "60%", OPTION_VAL_60_SK }, + { "70%", OPTION_VAL_70_SK }, + { "80%", OPTION_VAL_80_SK }, + { "90%", OPTION_VAL_90_SK }, + { "100%", OPTION_VAL_100_O45_SK }, { NULL, NULL }, }, "100%", }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_ru = { - option_cats_ru, - option_defs_ru -}; - -/* RETRO_LANGUAGE_SK */ - -#define CATEGORY_SYSTEM_LABEL_SK "Systém" -#define CATEGORY_SYSTEM_INFO_0_SK NULL -#define CATEGORY_VIDEO_LABEL_SK NULL -#define CATEGORY_VIDEO_INFO_0_SK NULL -#define CATEGORY_PERFORMANCE_LABEL_SK "Výkon" -#define CATEGORY_PERFORMANCE_INFO_0_SK NULL -#define CATEGORY_HACKS_LABEL_SK "Emulačné hacky" -#define CATEGORY_HACKS_INFO_0_SK NULL -#define CATEGORY_INPUT_LABEL_SK "Vstup" -#define CATEGORY_INPUT_INFO_0_SK NULL -#define CATEGORY_VMU_LABEL_SK NULL -#define CATEGORY_VMU_INFO_0_SK NULL -#define CORE_OPTION_NAME_REGION_LABEL_SK "Región" -#define OPTION_VAL_JAPAN_SK "Japonsko" -#define OPTION_VAL_USA_SK NULL -#define OPTION_VAL_EUROPE_SK "Európa" -#define OPTION_VAL_DEFAULT_SK "Predvolené" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_SK "Jazyk" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SK NULL -#define OPTION_VAL_JAPANESE_SK "Japončina" -#define OPTION_VAL_ENGLISH_SK "Angličtina" -#define OPTION_VAL_GERMAN_SK "Nemčina" -#define OPTION_VAL_FRENCH_SK "Francúzština" -#define OPTION_VAL_SPANISH_SK "Španielčina" -#define OPTION_VAL_ITALIAN_SK "Taliančina" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SK NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SK NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SK NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SK NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SK "Povoliť DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SK NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_SK NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SK NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SK NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SK NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SK NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SK NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SK NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SK NULL -#define CORE_OPTION_NAME_UPNP_LABEL_SK NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_SK NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SK "Vnútorné rozlíšenie" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SK NULL -#define OPTION_VAL_320X240_SK NULL -#define OPTION_VAL_640X480_SK NULL -#define OPTION_VAL_800X600_SK NULL -#define OPTION_VAL_960X720_SK NULL -#define OPTION_VAL_1024X768_SK NULL -#define OPTION_VAL_1280X960_SK NULL -#define OPTION_VAL_1440X1080_SK NULL -#define OPTION_VAL_1600X1200_SK NULL -#define OPTION_VAL_1920X1440_SK NULL -#define OPTION_VAL_2560X1920_SK NULL -#define OPTION_VAL_2880X2160_SK NULL -#define OPTION_VAL_3200X2400_SK NULL -#define OPTION_VAL_3840X2880_SK NULL -#define OPTION_VAL_4480X3360_SK NULL -#define OPTION_VAL_5120X3840_SK NULL -#define OPTION_VAL_5760X4320_SK NULL -#define OPTION_VAL_6400X4800_SK NULL -#define OPTION_VAL_7040X5280_SK NULL -#define OPTION_VAL_7680X5760_SK NULL -#define OPTION_VAL_8320X6240_SK NULL -#define OPTION_VAL_8960X6720_SK NULL -#define OPTION_VAL_9600X7200_SK NULL -#define OPTION_VAL_10240X7680_SK NULL -#define OPTION_VAL_10880X8160_SK NULL -#define OPTION_VAL_11520X8640_SK NULL -#define OPTION_VAL_12160X9120_SK NULL -#define OPTION_VAL_12800X9600_SK NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SK "Typ kábla" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SK NULL -#define OPTION_VAL_VGA_SK NULL -#define OPTION_VAL_TV_RGB_SK NULL -#define OPTION_VAL_TV_COMPOSITE_SK "TV (composite)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_SK "Vysielací štandard" -#define OPTION_VAL_NTSC_SK NULL -#define OPTION_VAL_PAL_SK "PAL (svet)" -#define OPTION_VAL_PAL_N_SK "PAL-N (Argentína, Paraguaj, Uruguaj)" -#define OPTION_VAL_PAL_M_SK "PAL-M (Brazília)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SK "Orientácia Obrazovky" -#define OPTION_VAL_HORIZONTAL_SK "Vodorovne" -#define OPTION_VAL_VERTICAL_SK "Zvislo" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SK NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SK NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_SK NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_SK NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SK NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SK NULL -#define OPTION_VAL_512MB_SK "512 MB" -#define OPTION_VAL_1GB_SK NULL -#define OPTION_VAL_2GB_SK NULL -#define OPTION_VAL_4GB_SK NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SK NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SK NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SK NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SK NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SK NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SK NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SK NULL -#define CORE_OPTION_NAME_FOG_LABEL_SK NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SK NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SK NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SK "Anizotropné filtrovanie" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SK NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SK "Filtrovanie textúr" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SK NULL -#define OPTION_VAL_1_SK NULL -#define OPTION_VAL_2_SK NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SK NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SK NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SK NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SK NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SK NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SK NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SK NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SK NULL -#define OPTION_VAL_2_O27_SK NULL -#define OPTION_VAL_4_SK NULL -#define OPTION_VAL_6_SK NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SK NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SK NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SK NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SK NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SK NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SK NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SK NULL -#define OPTION_VAL_SOME_SK "Normálne" -#define OPTION_VAL_MORE_SK "Maximálne" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SK "Preskakovanie snímkov" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SK NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SK NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SK NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SK NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SK NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SK NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SK NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SK NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SK NULL -#define OPTION_VAL_100_SK NULL -#define OPTION_VAL_110_SK NULL -#define OPTION_VAL_120_SK NULL -#define OPTION_VAL_130_SK NULL -#define OPTION_VAL_140_SK NULL -#define OPTION_VAL_150_SK NULL -#define OPTION_VAL_160_SK NULL -#define OPTION_VAL_170_SK NULL -#define OPTION_VAL_180_SK NULL -#define OPTION_VAL_190_SK NULL -#define OPTION_VAL_200_SK NULL -#define OPTION_VAL_210_SK NULL -#define OPTION_VAL_220_SK NULL -#define OPTION_VAL_230_SK NULL -#define OPTION_VAL_240_SK NULL -#define OPTION_VAL_250_SK NULL -#define OPTION_VAL_260_SK NULL -#define OPTION_VAL_270_SK NULL -#define OPTION_VAL_280_SK NULL -#define OPTION_VAL_290_SK NULL -#define OPTION_VAL_300_SK NULL -#define OPTION_VAL_310_SK NULL -#define OPTION_VAL_320_SK NULL -#define OPTION_VAL_330_SK NULL -#define OPTION_VAL_340_SK NULL -#define OPTION_VAL_350_SK NULL -#define OPTION_VAL_360_SK NULL -#define OPTION_VAL_370_SK NULL -#define OPTION_VAL_380_SK NULL -#define OPTION_VAL_390_SK NULL -#define OPTION_VAL_400_SK NULL -#define OPTION_VAL_410_SK NULL -#define OPTION_VAL_420_SK NULL -#define OPTION_VAL_430_SK NULL -#define OPTION_VAL_440_SK NULL -#define OPTION_VAL_450_SK NULL -#define OPTION_VAL_460_SK NULL -#define OPTION_VAL_470_SK NULL -#define OPTION_VAL_480_SK NULL -#define OPTION_VAL_490_SK NULL -#define OPTION_VAL_500_SK NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SK NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SK NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SK NULL -#define OPTION_VAL_0_SK NULL -#define OPTION_VAL_5_SK NULL -#define OPTION_VAL_10_SK NULL -#define OPTION_VAL_15_SK NULL -#define OPTION_VAL_20_SK NULL -#define OPTION_VAL_25_SK NULL -#define OPTION_VAL_30_SK NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SK NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SK NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SK NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SK NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SK NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SK NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SK NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SK NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SK NULL -#define OPTION_VAL_WHITE_SK "Biela" -#define OPTION_VAL_RED_SK "Červená" -#define OPTION_VAL_GREEN_SK "Zelená" -#define OPTION_VAL_BLUE_SK "Modrá" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SK NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SK NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SK NULL -#define OPTION_VAL_VMU_A1_SK NULL -#define OPTION_VAL_ALL_VMUS_SK "Všetky VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SK NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SK NULL -#define OPTION_VAL_UPPER_LEFT_SK "Hore vľavo" -#define OPTION_VAL_UPPER_RIGHT_SK "Hore vpravo" -#define OPTION_VAL_LOWER_LEFT_SK "Vľavo dolu" -#define OPTION_VAL_LOWER_RIGHT_SK "Vpravo dolu" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SK NULL -#define OPTION_VAL_1X_SK NULL -#define OPTION_VAL_3X_SK NULL -#define OPTION_VAL_5X_SK NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SK NULL -#define OPTION_VAL_DEFAULT_ON_00_SK "Predvolene zapnuté" -#define OPTION_VAL_DEFAULT_OFF_01_SK "Predvolene vypnuté" -#define OPTION_VAL_BLACK_02_SK "Čierna" -#define OPTION_VAL_LIGHT_BLUE_04_SK "Svetlomodrá" -#define OPTION_VAL_CYAN_06_SK "Azúrová" -#define OPTION_VAL_CYAN_BLUE_07_SK "Tyrkysová modrá" -#define OPTION_VAL_LIGHT_GREEN_08_SK "Svetlozelená" -#define OPTION_VAL_CYAN_GREEN_09_SK "Tyrkysová zelená" -#define OPTION_VAL_LIGHT_CYAN_10_SK "Svetloazúrová" -#define OPTION_VAL_PURPLE_12_SK "Fialová" -#define OPTION_VAL_LIGHT_PURPLE_13_SK "Svetlofialová" -#define OPTION_VAL_YELLOW_14_SK "Žltá" -#define OPTION_VAL_GRAY_15_SK "Šedá" -#define OPTION_VAL_LIGHT_PURPLE_2_16_SK "Svetlofialová (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_SK "Svetlozelená (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_SK "Svetlozelená (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_SK "Svetloazúrová (2)" -#define OPTION_VAL_LIGHT_RED_2_20_SK "Svetločervená (2)" -#define OPTION_VAL_MAGENTA_21_SK "Purpurová" -#define OPTION_VAL_LIGHT_PURPLE_3_22_SK "Svetlofialová (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_SK "Svetlooranžová" -#define OPTION_VAL_ORANGE_24_SK "Oranžová" -#define OPTION_VAL_LIGHT_PURPLE_4_25_SK "Svetlofialová (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_SK "Svetložltá" -#define OPTION_VAL_LIGHT_YELLOW_2_27_SK "Svetložltá (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SK NULL -#define OPTION_VAL_40_SK NULL -#define OPTION_VAL_50_SK NULL -#define OPTION_VAL_60_SK NULL -#define OPTION_VAL_70_SK NULL -#define OPTION_VAL_80_SK NULL -#define OPTION_VAL_90_SK NULL -#define OPTION_VAL_100_O57_SK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SK NULL + { + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, + { NULL, NULL }, + }, + "Lower Right", + }, + { + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_SK }, + { "2x", OPTION_VAL_2_O26_SK }, + { "3x", OPTION_VAL_3X_SK }, + { "4x", OPTION_VAL_4_SK }, + { "5x", OPTION_VAL_5X_SK }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, + { "BLACK 02", OPTION_VAL_BLACK_02_SK }, + { "BLUE 03", OPTION_VAL_BLUE_SK }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, + { "GREEN 05", OPTION_VAL_GREEN_SK }, + { "CYAN 06", OPTION_VAL_CYAN_06_SK }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, + { "RED 11", OPTION_VAL_RED_SK }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, + { "GRAY 15", OPTION_VAL_GRAY_15_SK }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, + { "WHITE 28", OPTION_VAL_WHITE_SK }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SK, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_SK }, + { "20%", OPTION_VAL_20_SK }, + { "30%", OPTION_VAL_30_SK }, + { "40%", OPTION_VAL_40_SK }, + { "50%", OPTION_VAL_50_SK }, + { "60%", OPTION_VAL_60_SK }, + { "70%", OPTION_VAL_70_SK }, + { "80%", OPTION_VAL_80_SK }, + { "90%", OPTION_VAL_90_SK }, + { "100%", OPTION_VAL_100_O45_SK }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_sk = { + option_cats_sk, + option_defs_sk +}; -struct retro_core_option_v2_category option_cats_sk[] = { +/* RETRO_LANGUAGE_SR */ + +#define CATEGORY_SYSTEM_LABEL_SR NULL +#define CATEGORY_SYSTEM_INFO_0_SR NULL +#define CATEGORY_VIDEO_LABEL_SR NULL +#define CATEGORY_VIDEO_INFO_0_SR NULL +#define CATEGORY_PERFORMANCE_LABEL_SR NULL +#define CATEGORY_PERFORMANCE_INFO_0_SR NULL +#define CATEGORY_HACKS_LABEL_SR NULL +#define CATEGORY_HACKS_INFO_0_SR NULL +#define CATEGORY_INPUT_LABEL_SR "Ulaz" +#define CATEGORY_INPUT_INFO_0_SR NULL +#define CATEGORY_EXPANSIONS_LABEL_SR NULL +#define CATEGORY_EXPANSIONS_INFO_0_SR NULL +#define CATEGORY_VMU_LABEL_SR NULL +#define CATEGORY_VMU_INFO_0_SR NULL +#define CORE_OPTION_NAME_REGION_LABEL_SR NULL +#define OPTION_VAL_JAPAN_SR NULL +#define OPTION_VAL_USA_SR NULL +#define OPTION_VAL_EUROPE_SR NULL +#define OPTION_VAL_DEFAULT_SR NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_SR NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SR NULL +#define OPTION_VAL_JAPANESE_SR NULL +#define OPTION_VAL_ENGLISH_SR NULL +#define OPTION_VAL_GERMAN_SR NULL +#define OPTION_VAL_FRENCH_SR NULL +#define OPTION_VAL_SPANISH_SR NULL +#define OPTION_VAL_ITALIAN_SR NULL +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SR NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SR NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SR NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SR NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SR NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SR NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SR NULL +#define CORE_OPTION_NAME_UPNP_LABEL_SR NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_SR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SR NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SR NULL +#define OPTION_VAL_320X240_SR NULL +#define OPTION_VAL_640X480_SR NULL +#define OPTION_VAL_800X600_SR NULL +#define OPTION_VAL_960X720_SR NULL +#define OPTION_VAL_1024X768_SR NULL +#define OPTION_VAL_1280X960_SR NULL +#define OPTION_VAL_1440X1080_SR NULL +#define OPTION_VAL_1600X1200_SR NULL +#define OPTION_VAL_1920X1440_SR NULL +#define OPTION_VAL_2560X1920_SR NULL +#define OPTION_VAL_2880X2160_SR NULL +#define OPTION_VAL_3200X2400_SR NULL +#define OPTION_VAL_3840X2880_SR NULL +#define OPTION_VAL_4480X3360_SR NULL +#define OPTION_VAL_5120X3840_SR NULL +#define OPTION_VAL_5760X4320_SR NULL +#define OPTION_VAL_6400X4800_SR NULL +#define OPTION_VAL_7040X5280_SR NULL +#define OPTION_VAL_7680X5760_SR NULL +#define OPTION_VAL_8320X6240_SR NULL +#define OPTION_VAL_8960X6720_SR NULL +#define OPTION_VAL_9600X7200_SR NULL +#define OPTION_VAL_10240X7680_SR NULL +#define OPTION_VAL_10880X8160_SR NULL +#define OPTION_VAL_11520X8640_SR NULL +#define OPTION_VAL_12160X9120_SR NULL +#define OPTION_VAL_12800X9600_SR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SR NULL +#define OPTION_VAL_VGA_SR NULL +#define OPTION_VAL_TV_RGB_SR NULL +#define OPTION_VAL_TV_COMPOSITE_SR NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_SR NULL +#define OPTION_VAL_NTSC_SR NULL +#define OPTION_VAL_PAL_SR NULL +#define OPTION_VAL_PAL_N_SR NULL +#define OPTION_VAL_PAL_M_SR NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SR "Orijentacija ekrana" +#define OPTION_VAL_HORIZONTAL_SR NULL +#define OPTION_VAL_VERTICAL_SR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SR NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SR NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SR NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_SR NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_SR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SR NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SR NULL +#define OPTION_VAL_512MB_SR NULL +#define OPTION_VAL_1GB_SR NULL +#define OPTION_VAL_2GB_SR NULL +#define OPTION_VAL_4GB_SR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SR NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SR NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SR NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SR NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_SR NULL +#define CORE_OPTION_NAME_FOG_LABEL_SR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SR NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SR NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SR NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SR NULL +#define OPTION_VAL_1_SR NULL +#define OPTION_VAL_2_SR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SR NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SR NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SR NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SR NULL +#define OPTION_VAL_2_O26_SR NULL +#define OPTION_VAL_4_SR NULL +#define OPTION_VAL_6_SR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SR NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SR NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SR NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SR NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SR NULL +#define OPTION_VAL_SOME_SR NULL +#define OPTION_VAL_MORE_SR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SR NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SR NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SR NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SR NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SR NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SR NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SR NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SR NULL +#define OPTION_VAL_100_SR NULL +#define OPTION_VAL_110_SR NULL +#define OPTION_VAL_120_SR NULL +#define OPTION_VAL_130_SR NULL +#define OPTION_VAL_140_SR NULL +#define OPTION_VAL_150_SR NULL +#define OPTION_VAL_160_SR NULL +#define OPTION_VAL_170_SR NULL +#define OPTION_VAL_180_SR NULL +#define OPTION_VAL_190_SR NULL +#define OPTION_VAL_200_SR NULL +#define OPTION_VAL_210_SR NULL +#define OPTION_VAL_220_SR NULL +#define OPTION_VAL_230_SR NULL +#define OPTION_VAL_240_SR NULL +#define OPTION_VAL_250_SR NULL +#define OPTION_VAL_260_SR NULL +#define OPTION_VAL_270_SR NULL +#define OPTION_VAL_280_SR NULL +#define OPTION_VAL_290_SR NULL +#define OPTION_VAL_300_SR NULL +#define OPTION_VAL_310_SR NULL +#define OPTION_VAL_320_SR NULL +#define OPTION_VAL_330_SR NULL +#define OPTION_VAL_340_SR NULL +#define OPTION_VAL_350_SR NULL +#define OPTION_VAL_360_SR NULL +#define OPTION_VAL_370_SR NULL +#define OPTION_VAL_380_SR NULL +#define OPTION_VAL_390_SR NULL +#define OPTION_VAL_400_SR NULL +#define OPTION_VAL_410_SR NULL +#define OPTION_VAL_420_SR NULL +#define OPTION_VAL_430_SR NULL +#define OPTION_VAL_440_SR NULL +#define OPTION_VAL_450_SR NULL +#define OPTION_VAL_460_SR NULL +#define OPTION_VAL_470_SR NULL +#define OPTION_VAL_480_SR NULL +#define OPTION_VAL_490_SR NULL +#define OPTION_VAL_500_SR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SR NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SR NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SR NULL +#define OPTION_VAL_0_SR NULL +#define OPTION_VAL_5_SR NULL +#define OPTION_VAL_10_SR NULL +#define OPTION_VAL_15_SR NULL +#define OPTION_VAL_20_SR NULL +#define OPTION_VAL_25_SR NULL +#define OPTION_VAL_30_SR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SR NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SR NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SR NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SR NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SR NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SR NULL +#define OPTION_VAL_50_SR NULL +#define OPTION_VAL_60_SR NULL +#define OPTION_VAL_70_SR NULL +#define OPTION_VAL_80_SR NULL +#define OPTION_VAL_90_SR NULL +#define OPTION_VAL_100_O45_SR NULL +#define OPTION_VAL_110_O45_SR NULL +#define OPTION_VAL_120_O45_SR NULL +#define OPTION_VAL_130_O45_SR NULL +#define OPTION_VAL_140_O45_SR NULL +#define OPTION_VAL_150_O45_SR NULL +#define OPTION_VAL_160_O45_SR NULL +#define OPTION_VAL_170_O45_SR NULL +#define OPTION_VAL_180_O45_SR NULL +#define OPTION_VAL_190_O45_SR NULL +#define OPTION_VAL_200_O45_SR NULL +#define OPTION_VAL_210_O45_SR NULL +#define OPTION_VAL_220_O45_SR NULL +#define OPTION_VAL_230_O45_SR NULL +#define OPTION_VAL_240_O45_SR NULL +#define OPTION_VAL_250_O45_SR NULL +#define OPTION_VAL_260_O45_SR NULL +#define OPTION_VAL_270_O45_SR NULL +#define OPTION_VAL_280_O45_SR NULL +#define OPTION_VAL_290_O45_SR NULL +#define OPTION_VAL_300_O45_SR NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SR NULL +#define OPTION_VAL_WHITE_SR NULL +#define OPTION_VAL_RED_SR NULL +#define OPTION_VAL_GREEN_SR NULL +#define OPTION_VAL_BLUE_SR NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SR NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SR NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SR NULL +#define OPTION_VAL_VMU_SR NULL +#define OPTION_VAL_PURUPURU_SR NULL +#define OPTION_VAL_NONE_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SR NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SR NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SR NULL +#define OPTION_VAL_VMU_A1_SR NULL +#define OPTION_VAL_ALL_VMUS_SR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SR NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SR NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SR NULL +#define OPTION_VAL_UPPER_LEFT_SR NULL +#define OPTION_VAL_UPPER_RIGHT_SR NULL +#define OPTION_VAL_LOWER_LEFT_SR NULL +#define OPTION_VAL_LOWER_RIGHT_SR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SR NULL +#define OPTION_VAL_1X_SR NULL +#define OPTION_VAL_3X_SR NULL +#define OPTION_VAL_5X_SR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SR NULL +#define OPTION_VAL_DEFAULT_ON_00_SR NULL +#define OPTION_VAL_DEFAULT_OFF_01_SR NULL +#define OPTION_VAL_BLACK_02_SR NULL +#define OPTION_VAL_LIGHT_BLUE_04_SR NULL +#define OPTION_VAL_CYAN_06_SR NULL +#define OPTION_VAL_CYAN_BLUE_07_SR NULL +#define OPTION_VAL_LIGHT_GREEN_08_SR NULL +#define OPTION_VAL_CYAN_GREEN_09_SR NULL +#define OPTION_VAL_LIGHT_CYAN_10_SR NULL +#define OPTION_VAL_PURPLE_12_SR NULL +#define OPTION_VAL_LIGHT_PURPLE_13_SR NULL +#define OPTION_VAL_YELLOW_14_SR NULL +#define OPTION_VAL_GRAY_15_SR NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_SR NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_SR NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_SR NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_SR NULL +#define OPTION_VAL_LIGHT_RED_2_20_SR NULL +#define OPTION_VAL_MAGENTA_21_SR NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_SR NULL +#define OPTION_VAL_LIGHT_ORANGE_23_SR NULL +#define OPTION_VAL_ORANGE_24_SR NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_SR NULL +#define OPTION_VAL_LIGHT_YELLOW_26_SR NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_SR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SR NULL +#define OPTION_VAL_40_SR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SR NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SR NULL + +struct retro_core_option_v2_category option_cats_sr[] = { { "system", - CATEGORY_SYSTEM_LABEL_SK, - CATEGORY_SYSTEM_INFO_0_SK + CATEGORY_SYSTEM_LABEL_SR, + CATEGORY_SYSTEM_INFO_0_SR }, { "video", - CATEGORY_VIDEO_LABEL_SK, - CATEGORY_VIDEO_INFO_0_SK + CATEGORY_VIDEO_LABEL_SR, + CATEGORY_VIDEO_INFO_0_SR }, { "performance", - CATEGORY_PERFORMANCE_LABEL_SK, - CATEGORY_PERFORMANCE_INFO_0_SK + CATEGORY_PERFORMANCE_LABEL_SR, + CATEGORY_PERFORMANCE_INFO_0_SR }, { "hacks", - CATEGORY_HACKS_LABEL_SK, - CATEGORY_HACKS_INFO_0_SK + CATEGORY_HACKS_LABEL_SR, + CATEGORY_HACKS_INFO_0_SR }, { "input", - CATEGORY_INPUT_LABEL_SK, - CATEGORY_INPUT_INFO_0_SK + CATEGORY_INPUT_LABEL_SR, + CATEGORY_INPUT_INFO_0_SR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_SR, + CATEGORY_EXPANSIONS_INFO_0_SR }, { "vmu", - CATEGORY_VMU_LABEL_SK, - CATEGORY_VMU_INFO_0_SK + CATEGORY_VMU_LABEL_SR, + CATEGORY_VMU_INFO_0_SR }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_sk[] = { +struct retro_core_option_v2_definition option_defs_sr[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_SK, + CORE_OPTION_NAME_REGION_LABEL_SR, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_SK }, - { "USA", OPTION_VAL_USA_SK }, - { "Europe", OPTION_VAL_EUROPE_SK }, - { "Default", OPTION_VAL_DEFAULT_SK }, + { "Japan", OPTION_VAL_JAPAN_SR }, + { "USA", OPTION_VAL_USA_SR }, + { "Europe", OPTION_VAL_EUROPE_SR }, + { "Default", OPTION_VAL_DEFAULT_SR }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_SK, + CORE_OPTION_NAME_LANGUAGE_LABEL_SR, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_SK, + CORE_OPTION_NAME_LANGUAGE_INFO_0_SR, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_SK }, - { "English", OPTION_VAL_ENGLISH_SK }, - { "German", OPTION_VAL_GERMAN_SK }, - { "French", OPTION_VAL_FRENCH_SK }, - { "Spanish", OPTION_VAL_SPANISH_SK }, - { "Italian", OPTION_VAL_ITALIAN_SK }, - { "Default", OPTION_VAL_DEFAULT_SK }, + { "Japanese", OPTION_VAL_JAPANESE_SR }, + { "English", OPTION_VAL_ENGLISH_SR }, + { "German", OPTION_VAL_GERMAN_SR }, + { "French", OPTION_VAL_FRENCH_SR }, + { "Spanish", OPTION_VAL_SPANISH_SR }, + { "Italian", OPTION_VAL_ITALIAN_SR }, + { "Default", OPTION_VAL_DEFAULT_SR }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_SK, + CORE_OPTION_NAME_HLE_BIOS_LABEL_SR, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_SK, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_SR, NULL, "system", { @@ -57991,9 +68920,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SK, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SR, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SK, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SR, NULL, "system", { @@ -58005,9 +68934,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_SK, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_SR, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SK, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SR, NULL, "system", { @@ -58021,25 +68950,11 @@ struct retro_core_option_v2_definition option_defs_sk[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_SK, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SK, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SK, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SR, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SK, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SR, NULL, "system", { @@ -58051,9 +68966,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SK, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SR, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SK, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SR, NULL, "system", { @@ -58065,9 +68980,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_SK, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_SR, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SK, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SR, NULL, "system", { @@ -58079,9 +68994,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_SK, + CORE_OPTION_NAME_UPNP_LABEL_SR, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_SK, + CORE_OPTION_NAME_UPNP_INFO_0_SR, NULL, "system", { @@ -58094,39 +69009,39 @@ struct retro_core_option_v2_definition option_defs_sk[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SK, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SR, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SK, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SR, NULL, "video", { - { "320x240", OPTION_VAL_320X240_SK }, - { "640x480", OPTION_VAL_640X480_SK }, - { "800x600", OPTION_VAL_800X600_SK }, - { "960x720", OPTION_VAL_960X720_SK }, - { "1024x768", OPTION_VAL_1024X768_SK }, - { "1280x960", OPTION_VAL_1280X960_SK }, - { "1440x1080", OPTION_VAL_1440X1080_SK }, - { "1600x1200", OPTION_VAL_1600X1200_SK }, - { "1920x1440", OPTION_VAL_1920X1440_SK }, - { "2560x1920", OPTION_VAL_2560X1920_SK }, - { "2880x2160", OPTION_VAL_2880X2160_SK }, - { "3200x2400", OPTION_VAL_3200X2400_SK }, - { "3840x2880", OPTION_VAL_3840X2880_SK }, - { "4480x3360", OPTION_VAL_4480X3360_SK }, - { "5120x3840", OPTION_VAL_5120X3840_SK }, - { "5760x4320", OPTION_VAL_5760X4320_SK }, - { "6400x4800", OPTION_VAL_6400X4800_SK }, - { "7040x5280", OPTION_VAL_7040X5280_SK }, - { "7680x5760", OPTION_VAL_7680X5760_SK }, - { "8320x6240", OPTION_VAL_8320X6240_SK }, - { "8960x6720", OPTION_VAL_8960X6720_SK }, - { "9600x7200", OPTION_VAL_9600X7200_SK }, - { "10240x7680", OPTION_VAL_10240X7680_SK }, - { "10880x8160", OPTION_VAL_10880X8160_SK }, - { "11520x8640", OPTION_VAL_11520X8640_SK }, - { "12160x9120", OPTION_VAL_12160X9120_SK }, - { "12800x9600", OPTION_VAL_12800X9600_SK }, + { "320x240", OPTION_VAL_320X240_SR }, + { "640x480", OPTION_VAL_640X480_SR }, + { "800x600", OPTION_VAL_800X600_SR }, + { "960x720", OPTION_VAL_960X720_SR }, + { "1024x768", OPTION_VAL_1024X768_SR }, + { "1280x960", OPTION_VAL_1280X960_SR }, + { "1440x1080", OPTION_VAL_1440X1080_SR }, + { "1600x1200", OPTION_VAL_1600X1200_SR }, + { "1920x1440", OPTION_VAL_1920X1440_SR }, + { "2560x1920", OPTION_VAL_2560X1920_SR }, + { "2880x2160", OPTION_VAL_2880X2160_SR }, + { "3200x2400", OPTION_VAL_3200X2400_SR }, + { "3840x2880", OPTION_VAL_3840X2880_SR }, + { "4480x3360", OPTION_VAL_4480X3360_SR }, + { "5120x3840", OPTION_VAL_5120X3840_SR }, + { "5760x4320", OPTION_VAL_5760X4320_SR }, + { "6400x4800", OPTION_VAL_6400X4800_SR }, + { "7040x5280", OPTION_VAL_7040X5280_SR }, + { "7680x5760", OPTION_VAL_7680X5760_SR }, + { "8320x6240", OPTION_VAL_8320X6240_SR }, + { "8960x6720", OPTION_VAL_8960X6720_SR }, + { "9600x7200", OPTION_VAL_9600X7200_SR }, + { "10240x7680", OPTION_VAL_10240X7680_SR }, + { "10880x8160", OPTION_VAL_10880X8160_SR }, + { "11520x8640", OPTION_VAL_11520X8640_SR }, + { "12160x9120", OPTION_VAL_12160X9120_SR }, + { "12800x9600", OPTION_VAL_12800X9600_SR }, { NULL, NULL }, }, #ifdef LOW_RES @@ -58137,62 +69052,62 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_SK, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_SR, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SK, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SR, NULL, "video", { - { "VGA", OPTION_VAL_VGA_SK }, - { "TV (RGB)", OPTION_VAL_TV_RGB_SK }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SK }, + { "VGA", OPTION_VAL_VGA_SR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_SR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SR }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_SK, + CORE_OPTION_NAME_BROADCAST_LABEL_SR, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_SK }, - { "PAL", OPTION_VAL_PAL_SK }, - { "PAL_N", OPTION_VAL_PAL_N_SK }, - { "PAL_M", OPTION_VAL_PAL_M_SK }, - { "Default", OPTION_VAL_DEFAULT_SK }, + { "NTSC", OPTION_VAL_NTSC_SR }, + { "PAL", OPTION_VAL_PAL_SR }, + { "PAL_N", OPTION_VAL_PAL_N_SR }, + { "PAL_M", OPTION_VAL_PAL_M_SR }, + { "Default", OPTION_VAL_DEFAULT_SR }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SK, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SR, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_SK }, - { "vertical", OPTION_VAL_VERTICAL_SK }, + { "horizontal", OPTION_VAL_HORIZONTAL_SR }, + { "vertical", OPTION_VAL_VERTICAL_SR }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SK, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SR, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SK }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SK }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SR }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SK }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SR }, #endif { NULL, NULL }, }, @@ -58205,25 +69120,25 @@ struct retro_core_option_v2_definition option_defs_sk[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SK, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SR, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SK, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SR, NULL, "video", { - { "512MB", OPTION_VAL_512MB_SK }, - { "1GB", OPTION_VAL_1GB_SK }, - { "2GB", OPTION_VAL_2GB_SK }, - { "4GB", OPTION_VAL_4GB_SK }, + { "512MB", OPTION_VAL_512MB_SR }, + { "1GB", OPTION_VAL_1GB_SR }, + { "2GB", OPTION_VAL_2GB_SR }, + { "4GB", OPTION_VAL_4GB_SR }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_SK, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_SR, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SK, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SR, NULL, "video", { @@ -58231,6 +69146,7 @@ struct retro_core_option_v2_definition option_defs_sk[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -58239,9 +69155,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SK, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SR, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SK, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SR, NULL, "video", { @@ -58253,9 +69169,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SK, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SR, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SK, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SR, NULL, "video", { @@ -58265,11 +69181,11 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_SK, + CORE_OPTION_NAME_MIPMAPPING_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_SR, NULL, "video", { @@ -58281,7 +69197,7 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_SK, + CORE_OPTION_NAME_FOG_LABEL_SR, NULL, "", NULL, @@ -58295,9 +69211,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SK, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SR, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SK, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SR, NULL, "video", { @@ -58309,9 +69225,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SK, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SR, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SK, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SR, NULL, "video", { @@ -58326,24 +69242,24 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SK, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SR, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SK, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SR, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_SK }, - { "1", OPTION_VAL_1_SK }, - { "2", OPTION_VAL_2_SK }, + { "0", OPTION_VAL_DEFAULT_SR }, + { "1", OPTION_VAL_1_SR }, + { "2", OPTION_VAL_2_SR }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SK, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SR, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SK, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SR, NULL, "video", { @@ -58351,13 +69267,13 @@ struct retro_core_option_v2_definition option_defs_sk[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SK, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SR, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SK, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SR, NULL, "video", { @@ -58369,9 +69285,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SK, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SR, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SK, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SR, NULL, "video", { @@ -58384,25 +69300,25 @@ struct retro_core_option_v2_definition option_defs_sk[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_SK, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_SR, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SK, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SR, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_SK }, - { "4", OPTION_VAL_4_SK }, - { "6", OPTION_VAL_6_SK }, + { "2", OPTION_VAL_2_O26_SR }, + { "4", OPTION_VAL_4_SR }, + { "6", OPTION_VAL_6_SR }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SK, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SR, NULL, "video", { @@ -58416,9 +69332,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SK, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SR, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SK, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SR, NULL, "video", { @@ -58428,11 +69344,25 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SK, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SR, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SK, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SR, NULL, "performance", { @@ -58444,15 +69374,15 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SK, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SR, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SK, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SR, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_SK }, - { "more", OPTION_VAL_MORE_SK }, + { "some", OPTION_VAL_SOME_SR }, + { "more", OPTION_VAL_MORE_SR }, { NULL, NULL }, }, #ifdef LOW_END @@ -58463,9 +69393,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SK, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SR, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SK, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SR, NULL, "performance", { @@ -58482,9 +69412,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SK, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SR, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SK, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SR, NULL, "hacks", { @@ -58496,9 +69426,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SK, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SR, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SK, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SR, NULL, "hacks", { @@ -58510,9 +69440,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SK, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SR, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SK, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SR, NULL, "hacks", { @@ -58526,64 +69456,78 @@ struct retro_core_option_v2_definition option_defs_sk[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_SK, + CORE_OPTION_NAME_SH4CLOCK_LABEL_SR, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_SK, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_SR, NULL, "hacks", { - { "100", OPTION_VAL_100_SK }, - { "110", OPTION_VAL_110_SK }, - { "120", OPTION_VAL_120_SK }, - { "130", OPTION_VAL_130_SK }, - { "140", OPTION_VAL_140_SK }, - { "150", OPTION_VAL_150_SK }, - { "160", OPTION_VAL_160_SK }, - { "170", OPTION_VAL_170_SK }, - { "180", OPTION_VAL_180_SK }, - { "190", OPTION_VAL_190_SK }, - { "200", OPTION_VAL_200_SK }, - { "210", OPTION_VAL_210_SK }, - { "220", OPTION_VAL_220_SK }, - { "230", OPTION_VAL_230_SK }, - { "240", OPTION_VAL_240_SK }, - { "250", OPTION_VAL_250_SK }, - { "260", OPTION_VAL_260_SK }, - { "270", OPTION_VAL_270_SK }, - { "280", OPTION_VAL_280_SK }, - { "290", OPTION_VAL_290_SK }, - { "300", OPTION_VAL_300_SK }, - { "310", OPTION_VAL_310_SK }, - { "320", OPTION_VAL_320_SK }, - { "330", OPTION_VAL_330_SK }, - { "340", OPTION_VAL_340_SK }, - { "350", OPTION_VAL_350_SK }, - { "360", OPTION_VAL_360_SK }, - { "370", OPTION_VAL_370_SK }, - { "380", OPTION_VAL_380_SK }, - { "390", OPTION_VAL_390_SK }, - { "400", OPTION_VAL_400_SK }, - { "410", OPTION_VAL_410_SK }, - { "420", OPTION_VAL_420_SK }, - { "430", OPTION_VAL_430_SK }, - { "440", OPTION_VAL_440_SK }, - { "450", OPTION_VAL_450_SK }, - { "460", OPTION_VAL_460_SK }, - { "470", OPTION_VAL_470_SK }, - { "480", OPTION_VAL_480_SK }, - { "490", OPTION_VAL_490_SK }, - { "500", OPTION_VAL_500_SK }, + { "100", OPTION_VAL_100_SR }, + { "110", OPTION_VAL_110_SR }, + { "120", OPTION_VAL_120_SR }, + { "130", OPTION_VAL_130_SR }, + { "140", OPTION_VAL_140_SR }, + { "150", OPTION_VAL_150_SR }, + { "160", OPTION_VAL_160_SR }, + { "170", OPTION_VAL_170_SR }, + { "180", OPTION_VAL_180_SR }, + { "190", OPTION_VAL_190_SR }, + { "200", OPTION_VAL_200_SR }, + { "210", OPTION_VAL_210_SR }, + { "220", OPTION_VAL_220_SR }, + { "230", OPTION_VAL_230_SR }, + { "240", OPTION_VAL_240_SR }, + { "250", OPTION_VAL_250_SR }, + { "260", OPTION_VAL_260_SR }, + { "270", OPTION_VAL_270_SR }, + { "280", OPTION_VAL_280_SR }, + { "290", OPTION_VAL_290_SR }, + { "300", OPTION_VAL_300_SR }, + { "310", OPTION_VAL_310_SR }, + { "320", OPTION_VAL_320_SR }, + { "330", OPTION_VAL_330_SR }, + { "340", OPTION_VAL_340_SR }, + { "350", OPTION_VAL_350_SR }, + { "360", OPTION_VAL_360_SR }, + { "370", OPTION_VAL_370_SR }, + { "380", OPTION_VAL_380_SR }, + { "390", OPTION_VAL_390_SR }, + { "400", OPTION_VAL_400_SR }, + { "410", OPTION_VAL_410_SR }, + { "420", OPTION_VAL_420_SR }, + { "430", OPTION_VAL_430_SR }, + { "440", OPTION_VAL_440_SR }, + { "450", OPTION_VAL_450_SR }, + { "460", OPTION_VAL_460_SR }, + { "470", OPTION_VAL_470_SR }, + { "480", OPTION_VAL_480_SR }, + { "490", OPTION_VAL_490_SR }, + { "500", OPTION_VAL_500_SR }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SK, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SR, NULL, "hacks", { @@ -58593,11 +69537,11 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SK, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SR, NULL, "hacks", { @@ -58609,47 +69553,47 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SK, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SR, NULL, "input", { - { "0%", OPTION_VAL_0_SK }, - { "5%", OPTION_VAL_5_SK }, - { "10%", OPTION_VAL_10_SK }, - { "15%", OPTION_VAL_15_SK }, - { "20%", OPTION_VAL_20_SK }, - { "25%", OPTION_VAL_25_SK }, - { "30%", OPTION_VAL_30_SK }, + { "0%", OPTION_VAL_0_SR }, + { "5%", OPTION_VAL_5_SR }, + { "10%", OPTION_VAL_10_SR }, + { "15%", OPTION_VAL_15_SR }, + { "20%", OPTION_VAL_20_SR }, + { "25%", OPTION_VAL_25_SR }, + { "30%", OPTION_VAL_30_SR }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SK, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SR, NULL, "input", { - { "0%", OPTION_VAL_0_SK }, - { "5%", OPTION_VAL_5_SK }, - { "10%", OPTION_VAL_10_SK }, - { "15%", OPTION_VAL_15_SK }, - { "20%", OPTION_VAL_20_SK }, - { "25%", OPTION_VAL_25_SK }, - { "30%", OPTION_VAL_30_SK }, + { "0%", OPTION_VAL_0_SR }, + { "5%", OPTION_VAL_5_SR }, + { "10%", OPTION_VAL_10_SR }, + { "15%", OPTION_VAL_15_SR }, + { "20%", OPTION_VAL_20_SR }, + { "25%", OPTION_VAL_25_SR }, + { "30%", OPTION_VAL_30_SR }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SK, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SR, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SR, NULL, "input", { @@ -58660,10 +69604,10 @@ struct retro_core_option_v2_definition option_defs_sk[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SK, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SR, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SK, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SR, NULL, "input", { @@ -58671,124 +69615,268 @@ struct retro_core_option_v2_definition option_defs_sk[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SK, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SR, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SK, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SR, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SK, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SR, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SK, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_SR }, + { "60%", OPTION_VAL_60_SR }, + { "70%", OPTION_VAL_70_SR }, + { "80%", OPTION_VAL_80_SR }, + { "90%", OPTION_VAL_90_SR }, + { "100%", OPTION_VAL_100_O45_SR }, + { "110%", OPTION_VAL_110_O45_SR }, + { "120%", OPTION_VAL_120_O45_SR }, + { "130%", OPTION_VAL_130_O45_SR }, + { "140%", OPTION_VAL_140_O45_SR }, + { "150%", OPTION_VAL_150_O45_SR }, + { "160%", OPTION_VAL_160_O45_SR }, + { "170%", OPTION_VAL_170_O45_SR }, + { "180%", OPTION_VAL_180_O45_SR }, + { "190%", OPTION_VAL_190_O45_SR }, + { "200%", OPTION_VAL_200_O45_SR }, + { "210%", OPTION_VAL_210_O45_SR }, + { "220%", OPTION_VAL_220_O45_SR }, + { "230%", OPTION_VAL_230_O45_SR }, + { "240%", OPTION_VAL_240_O45_SR }, + { "250%", OPTION_VAL_250_O45_SR }, + { "260%", OPTION_VAL_260_O45_SR }, + { "270%", OPTION_VAL_270_O45_SR }, + { "280%", OPTION_VAL_280_O45_SR }, + { "290%", OPTION_VAL_290_O45_SR }, + { "300%", OPTION_VAL_300_O45_SR }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SK, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SK }, - { "Red", OPTION_VAL_RED_SK }, - { "Green", OPTION_VAL_GREEN_SK }, - { "Blue", OPTION_VAL_BLUE_SK }, + { "White", OPTION_VAL_WHITE_SR }, + { "Red", OPTION_VAL_RED_SR }, + { "Green", OPTION_VAL_GREEN_SR }, + { "Blue", OPTION_VAL_BLUE_SR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SK, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SK }, - { "Red", OPTION_VAL_RED_SK }, - { "Green", OPTION_VAL_GREEN_SK }, - { "Blue", OPTION_VAL_BLUE_SK }, + { "White", OPTION_VAL_WHITE_SR }, + { "Red", OPTION_VAL_RED_SR }, + { "Green", OPTION_VAL_GREEN_SR }, + { "Blue", OPTION_VAL_BLUE_SR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SK, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SK }, - { "Red", OPTION_VAL_RED_SK }, - { "Green", OPTION_VAL_GREEN_SK }, - { "Blue", OPTION_VAL_BLUE_SK }, + { "White", OPTION_VAL_WHITE_SR }, + { "Red", OPTION_VAL_RED_SR }, + { "Green", OPTION_VAL_GREEN_SR }, + { "Blue", OPTION_VAL_BLUE_SR }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SK, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SR, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SK }, - { "Red", OPTION_VAL_RED_SK }, - { "Green", OPTION_VAL_GREEN_SK }, - { "Blue", OPTION_VAL_BLUE_SK }, + { "White", OPTION_VAL_WHITE_SR }, + { "Red", OPTION_VAL_RED_SR }, + { "Green", OPTION_VAL_GREEN_SR }, + { "Blue", OPTION_VAL_BLUE_SR }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SR, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SR, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_SR }, + { "Purupuru", OPTION_VAL_PURUPURU_SR }, + { "None", OPTION_VAL_NONE_SR }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SK, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SK, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SK, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SR, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_SK }, - { "All VMUs", OPTION_VAL_ALL_VMUS_SK }, + { "VMU A1", OPTION_VAL_VMU_A1_SR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_SR }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_SK, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SK, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_SK, + CORE_OPTION_NAME_VMU_SOUND_LABEL_SR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_SR, NULL, "vmu", { @@ -58799,9 +69887,9 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SK, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SK, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SK, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SR, NULL, "vmu", { @@ -58813,7 +69901,7 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SK, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SR, NULL, "", NULL, @@ -58827,144 +69915,144 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SK, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SK, - NULL, - "", - NULL, - "vmu", - { - { "1x", OPTION_VAL_1X_SK }, - { "2x", OPTION_VAL_2_O27_SK }, - { "3x", OPTION_VAL_3X_SK }, - { "4x", OPTION_VAL_4_SK }, - { "5x", OPTION_VAL_5X_SK }, - { NULL, NULL }, - }, - "1x", - }, - { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SR, NULL, "", NULL, "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { + { "1x", OPTION_VAL_1X_SR }, + { "2x", OPTION_VAL_2_O26_SR }, + { "3x", OPTION_VAL_3X_SR }, + { "4x", OPTION_VAL_4_SR }, + { "5x", OPTION_VAL_5X_SR }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SK, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SK }, - { "20%", OPTION_VAL_20_SK }, - { "30%", OPTION_VAL_30_SK }, - { "40%", OPTION_VAL_40_SK }, - { "50%", OPTION_VAL_50_SK }, - { "60%", OPTION_VAL_60_SK }, - { "70%", OPTION_VAL_70_SK }, - { "80%", OPTION_VAL_80_SK }, - { "90%", OPTION_VAL_90_SK }, - { "100%", OPTION_VAL_100_O57_SK }, + { "10%", OPTION_VAL_10_SR }, + { "20%", OPTION_VAL_20_SR }, + { "30%", OPTION_VAL_30_SR }, + { "40%", OPTION_VAL_40_SR }, + { "50%", OPTION_VAL_50_SR }, + { "60%", OPTION_VAL_60_SR }, + { "70%", OPTION_VAL_70_SR }, + { "80%", OPTION_VAL_80_SR }, + { "90%", OPTION_VAL_90_SR }, + { "100%", OPTION_VAL_100_O45_SR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SK, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SR, NULL, "", NULL, @@ -58978,144 +70066,144 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SK, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SK, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SK }, - { "2x", OPTION_VAL_2_O27_SK }, - { "3x", OPTION_VAL_3X_SK }, - { "4x", OPTION_VAL_4_SK }, - { "5x", OPTION_VAL_5X_SK }, + { "1x", OPTION_VAL_1X_SR }, + { "2x", OPTION_VAL_2_O26_SR }, + { "3x", OPTION_VAL_3X_SR }, + { "4x", OPTION_VAL_4_SR }, + { "5x", OPTION_VAL_5X_SR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SK, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SK }, - { "20%", OPTION_VAL_20_SK }, - { "30%", OPTION_VAL_30_SK }, - { "40%", OPTION_VAL_40_SK }, - { "50%", OPTION_VAL_50_SK }, - { "60%", OPTION_VAL_60_SK }, - { "70%", OPTION_VAL_70_SK }, - { "80%", OPTION_VAL_80_SK }, - { "90%", OPTION_VAL_90_SK }, - { "100%", OPTION_VAL_100_O57_SK }, + { "10%", OPTION_VAL_10_SR }, + { "20%", OPTION_VAL_20_SR }, + { "30%", OPTION_VAL_30_SR }, + { "40%", OPTION_VAL_40_SR }, + { "50%", OPTION_VAL_50_SR }, + { "60%", OPTION_VAL_60_SR }, + { "70%", OPTION_VAL_70_SR }, + { "80%", OPTION_VAL_80_SR }, + { "90%", OPTION_VAL_90_SR }, + { "100%", OPTION_VAL_100_O45_SR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SK, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SR, NULL, "", NULL, @@ -59129,144 +70217,144 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SK, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SK, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SK }, - { "2x", OPTION_VAL_2_O27_SK }, - { "3x", OPTION_VAL_3X_SK }, - { "4x", OPTION_VAL_4_SK }, - { "5x", OPTION_VAL_5X_SK }, + { "1x", OPTION_VAL_1X_SR }, + { "2x", OPTION_VAL_2_O26_SR }, + { "3x", OPTION_VAL_3X_SR }, + { "4x", OPTION_VAL_4_SR }, + { "5x", OPTION_VAL_5X_SR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SK, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SK }, - { "20%", OPTION_VAL_20_SK }, - { "30%", OPTION_VAL_30_SK }, - { "40%", OPTION_VAL_40_SK }, - { "50%", OPTION_VAL_50_SK }, - { "60%", OPTION_VAL_60_SK }, - { "70%", OPTION_VAL_70_SK }, - { "80%", OPTION_VAL_80_SK }, - { "90%", OPTION_VAL_90_SK }, - { "100%", OPTION_VAL_100_O57_SK }, + { "10%", OPTION_VAL_10_SR }, + { "20%", OPTION_VAL_20_SR }, + { "30%", OPTION_VAL_30_SR }, + { "40%", OPTION_VAL_40_SR }, + { "50%", OPTION_VAL_50_SR }, + { "60%", OPTION_VAL_60_SR }, + { "70%", OPTION_VAL_70_SR }, + { "80%", OPTION_VAL_80_SR }, + { "90%", OPTION_VAL_90_SR }, + { "100%", OPTION_VAL_100_O45_SR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SK, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SR, NULL, "", NULL, @@ -59280,505 +70368,560 @@ struct retro_core_option_v2_definition option_defs_sk[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SK, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SK }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SK }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SK }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SK }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SK, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SK }, - { "2x", OPTION_VAL_2_O27_SK }, - { "3x", OPTION_VAL_3X_SK }, - { "4x", OPTION_VAL_4_SK }, - { "5x", OPTION_VAL_5X_SK }, + { "1x", OPTION_VAL_1X_SR }, + { "2x", OPTION_VAL_2_O26_SR }, + { "3x", OPTION_VAL_3X_SR }, + { "4x", OPTION_VAL_4_SR }, + { "5x", OPTION_VAL_5X_SR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SK, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SK }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SK }, - { "BLACK 02", OPTION_VAL_BLACK_02_SK }, - { "BLUE 03", OPTION_VAL_BLUE_SK }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SK }, - { "GREEN 05", OPTION_VAL_GREEN_SK }, - { "CYAN 06", OPTION_VAL_CYAN_06_SK }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SK }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SK }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SK }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SK }, - { "RED 11", OPTION_VAL_RED_SK }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SK }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SK }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SK }, - { "GRAY 15", OPTION_VAL_GRAY_15_SK }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SK }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SK }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SK }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SK }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SK }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SK }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SK }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SK }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SK }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SK }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SK }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SK }, - { "WHITE 28", OPTION_VAL_WHITE_SK }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, + { "BLACK 02", OPTION_VAL_BLACK_02_SR }, + { "BLUE 03", OPTION_VAL_BLUE_SR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, + { "GREEN 05", OPTION_VAL_GREEN_SR }, + { "CYAN 06", OPTION_VAL_CYAN_06_SR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, + { "RED 11", OPTION_VAL_RED_SR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, + { "GRAY 15", OPTION_VAL_GRAY_15_SR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, + { "WHITE 28", OPTION_VAL_WHITE_SR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SK, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SK }, - { "20%", OPTION_VAL_20_SK }, - { "30%", OPTION_VAL_30_SK }, - { "40%", OPTION_VAL_40_SK }, - { "50%", OPTION_VAL_50_SK }, - { "60%", OPTION_VAL_60_SK }, - { "70%", OPTION_VAL_70_SK }, - { "80%", OPTION_VAL_80_SK }, - { "90%", OPTION_VAL_90_SK }, - { "100%", OPTION_VAL_100_O57_SK }, + { "10%", OPTION_VAL_10_SR }, + { "20%", OPTION_VAL_20_SR }, + { "30%", OPTION_VAL_30_SR }, + { "40%", OPTION_VAL_40_SR }, + { "50%", OPTION_VAL_50_SR }, + { "60%", OPTION_VAL_60_SR }, + { "70%", OPTION_VAL_70_SR }, + { "80%", OPTION_VAL_80_SR }, + { "90%", OPTION_VAL_90_SR }, + { "100%", OPTION_VAL_100_O45_SR }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_sk = { - option_cats_sk, - option_defs_sk +struct retro_core_options_v2 options_sr = { + option_cats_sr, + option_defs_sr }; -/* RETRO_LANGUAGE_SR */ +/* RETRO_LANGUAGE_SV */ -#define CATEGORY_SYSTEM_LABEL_SR NULL -#define CATEGORY_SYSTEM_INFO_0_SR NULL -#define CATEGORY_VIDEO_LABEL_SR NULL -#define CATEGORY_VIDEO_INFO_0_SR NULL -#define CATEGORY_PERFORMANCE_LABEL_SR NULL -#define CATEGORY_PERFORMANCE_INFO_0_SR NULL -#define CATEGORY_HACKS_LABEL_SR NULL -#define CATEGORY_HACKS_INFO_0_SR NULL -#define CATEGORY_INPUT_LABEL_SR "Ulaz" -#define CATEGORY_INPUT_INFO_0_SR NULL -#define CATEGORY_VMU_LABEL_SR NULL -#define CATEGORY_VMU_INFO_0_SR NULL -#define CORE_OPTION_NAME_REGION_LABEL_SR NULL -#define OPTION_VAL_JAPAN_SR NULL -#define OPTION_VAL_USA_SR NULL -#define OPTION_VAL_EUROPE_SR NULL -#define OPTION_VAL_DEFAULT_SR NULL -#define CORE_OPTION_NAME_LANGUAGE_LABEL_SR NULL -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SR NULL -#define OPTION_VAL_JAPANESE_SR NULL -#define OPTION_VAL_ENGLISH_SR NULL -#define OPTION_VAL_GERMAN_SR NULL -#define OPTION_VAL_FRENCH_SR NULL -#define OPTION_VAL_SPANISH_SR NULL -#define OPTION_VAL_ITALIAN_SR NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SR NULL -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SR NULL -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SR NULL -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_SR NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SR NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SR NULL -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SR NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SR NULL -#define CORE_OPTION_NAME_UPNP_LABEL_SR NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_SR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SR NULL -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SR NULL -#define OPTION_VAL_320X240_SR NULL -#define OPTION_VAL_640X480_SR NULL -#define OPTION_VAL_800X600_SR NULL -#define OPTION_VAL_960X720_SR NULL -#define OPTION_VAL_1024X768_SR NULL -#define OPTION_VAL_1280X960_SR NULL -#define OPTION_VAL_1440X1080_SR NULL -#define OPTION_VAL_1600X1200_SR NULL -#define OPTION_VAL_1920X1440_SR NULL -#define OPTION_VAL_2560X1920_SR NULL -#define OPTION_VAL_2880X2160_SR NULL -#define OPTION_VAL_3200X2400_SR NULL -#define OPTION_VAL_3840X2880_SR NULL -#define OPTION_VAL_4480X3360_SR NULL -#define OPTION_VAL_5120X3840_SR NULL -#define OPTION_VAL_5760X4320_SR NULL -#define OPTION_VAL_6400X4800_SR NULL -#define OPTION_VAL_7040X5280_SR NULL -#define OPTION_VAL_7680X5760_SR NULL -#define OPTION_VAL_8320X6240_SR NULL -#define OPTION_VAL_8960X6720_SR NULL -#define OPTION_VAL_9600X7200_SR NULL -#define OPTION_VAL_10240X7680_SR NULL -#define OPTION_VAL_10880X8160_SR NULL -#define OPTION_VAL_11520X8640_SR NULL -#define OPTION_VAL_12160X9120_SR NULL -#define OPTION_VAL_12800X9600_SR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SR NULL -#define OPTION_VAL_VGA_SR NULL -#define OPTION_VAL_TV_RGB_SR NULL -#define OPTION_VAL_TV_COMPOSITE_SR NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_SR NULL -#define OPTION_VAL_NTSC_SR NULL -#define OPTION_VAL_PAL_SR NULL -#define OPTION_VAL_PAL_N_SR NULL -#define OPTION_VAL_PAL_M_SR NULL -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SR "Orijentacija ekrana" -#define OPTION_VAL_HORIZONTAL_SR NULL -#define OPTION_VAL_VERTICAL_SR NULL -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SR NULL -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SR NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_SR NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_SR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SR NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SR NULL -#define OPTION_VAL_512MB_SR NULL -#define OPTION_VAL_1GB_SR NULL -#define OPTION_VAL_2GB_SR NULL -#define OPTION_VAL_4GB_SR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SR NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SR NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SR NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SR NULL -#define CORE_OPTION_NAME_FOG_LABEL_SR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SR NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SR NULL -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SR NULL -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SR NULL -#define OPTION_VAL_1_SR NULL -#define OPTION_VAL_2_SR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SR NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SR NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SR NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SR NULL -#define OPTION_VAL_2_O27_SR NULL -#define OPTION_VAL_4_SR NULL -#define OPTION_VAL_6_SR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SR NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SR NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SR NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SR NULL -#define OPTION_VAL_SOME_SR NULL -#define OPTION_VAL_MORE_SR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SR NULL -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SR NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SR NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SR NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SR NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SR NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SR NULL -#define OPTION_VAL_100_SR NULL -#define OPTION_VAL_110_SR NULL -#define OPTION_VAL_120_SR NULL -#define OPTION_VAL_130_SR NULL -#define OPTION_VAL_140_SR NULL -#define OPTION_VAL_150_SR NULL -#define OPTION_VAL_160_SR NULL -#define OPTION_VAL_170_SR NULL -#define OPTION_VAL_180_SR NULL -#define OPTION_VAL_190_SR NULL -#define OPTION_VAL_200_SR NULL -#define OPTION_VAL_210_SR NULL -#define OPTION_VAL_220_SR NULL -#define OPTION_VAL_230_SR NULL -#define OPTION_VAL_240_SR NULL -#define OPTION_VAL_250_SR NULL -#define OPTION_VAL_260_SR NULL -#define OPTION_VAL_270_SR NULL -#define OPTION_VAL_280_SR NULL -#define OPTION_VAL_290_SR NULL -#define OPTION_VAL_300_SR NULL -#define OPTION_VAL_310_SR NULL -#define OPTION_VAL_320_SR NULL -#define OPTION_VAL_330_SR NULL -#define OPTION_VAL_340_SR NULL -#define OPTION_VAL_350_SR NULL -#define OPTION_VAL_360_SR NULL -#define OPTION_VAL_370_SR NULL -#define OPTION_VAL_380_SR NULL -#define OPTION_VAL_390_SR NULL -#define OPTION_VAL_400_SR NULL -#define OPTION_VAL_410_SR NULL -#define OPTION_VAL_420_SR NULL -#define OPTION_VAL_430_SR NULL -#define OPTION_VAL_440_SR NULL -#define OPTION_VAL_450_SR NULL -#define OPTION_VAL_460_SR NULL -#define OPTION_VAL_470_SR NULL -#define OPTION_VAL_480_SR NULL -#define OPTION_VAL_490_SR NULL -#define OPTION_VAL_500_SR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SR NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SR NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SR NULL -#define OPTION_VAL_0_SR NULL -#define OPTION_VAL_5_SR NULL -#define OPTION_VAL_10_SR NULL -#define OPTION_VAL_15_SR NULL -#define OPTION_VAL_20_SR NULL -#define OPTION_VAL_25_SR NULL -#define OPTION_VAL_30_SR NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SR NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SR NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SR NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SR NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SR NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SR NULL -#define OPTION_VAL_WHITE_SR NULL -#define OPTION_VAL_RED_SR NULL -#define OPTION_VAL_GREEN_SR NULL -#define OPTION_VAL_BLUE_SR NULL -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SR NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SR NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SR NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SR NULL -#define OPTION_VAL_VMU_A1_SR NULL -#define OPTION_VAL_ALL_VMUS_SR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SR NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SR NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SR NULL -#define OPTION_VAL_UPPER_LEFT_SR NULL -#define OPTION_VAL_UPPER_RIGHT_SR NULL -#define OPTION_VAL_LOWER_LEFT_SR NULL -#define OPTION_VAL_LOWER_RIGHT_SR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SR NULL -#define OPTION_VAL_1X_SR NULL -#define OPTION_VAL_3X_SR NULL -#define OPTION_VAL_5X_SR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SR NULL -#define OPTION_VAL_DEFAULT_ON_00_SR NULL -#define OPTION_VAL_DEFAULT_OFF_01_SR NULL -#define OPTION_VAL_BLACK_02_SR NULL -#define OPTION_VAL_LIGHT_BLUE_04_SR NULL -#define OPTION_VAL_CYAN_06_SR NULL -#define OPTION_VAL_CYAN_BLUE_07_SR NULL -#define OPTION_VAL_LIGHT_GREEN_08_SR NULL -#define OPTION_VAL_CYAN_GREEN_09_SR NULL -#define OPTION_VAL_LIGHT_CYAN_10_SR NULL -#define OPTION_VAL_PURPLE_12_SR NULL -#define OPTION_VAL_LIGHT_PURPLE_13_SR NULL -#define OPTION_VAL_YELLOW_14_SR NULL -#define OPTION_VAL_GRAY_15_SR NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_SR NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_SR NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_SR NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_SR NULL -#define OPTION_VAL_LIGHT_RED_2_20_SR NULL -#define OPTION_VAL_MAGENTA_21_SR NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_SR NULL -#define OPTION_VAL_LIGHT_ORANGE_23_SR NULL -#define OPTION_VAL_ORANGE_24_SR NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_SR NULL -#define OPTION_VAL_LIGHT_YELLOW_26_SR NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_SR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SR NULL -#define OPTION_VAL_40_SR NULL -#define OPTION_VAL_50_SR NULL -#define OPTION_VAL_60_SR NULL -#define OPTION_VAL_70_SR NULL -#define OPTION_VAL_80_SR NULL -#define OPTION_VAL_90_SR NULL -#define OPTION_VAL_100_O57_SR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SR NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SR NULL +#define CATEGORY_SYSTEM_LABEL_SV NULL +#define CATEGORY_SYSTEM_INFO_0_SV "Konfigurera region, språk, BIOS och grundläggande hårdvaruinställningar." +#define CATEGORY_VIDEO_LABEL_SV NULL +#define CATEGORY_VIDEO_INFO_0_SV "Konfigurera upplösning, oberoende transparens i ordning och visuella effektinställningar." +#define CATEGORY_PERFORMANCE_LABEL_SV "Prestanda" +#define CATEGORY_PERFORMANCE_INFO_0_SV "Konfigurera inställningar för trådad rendering och bildruteskippning." +#define CATEGORY_HACKS_LABEL_SV "Emulator Hacks" +#define CATEGORY_HACKS_INFO_0_SV "Konfigurera inställningar för widescreen-överskridanden, GD-ROM-laddningshastighet och texturrelaterade inställningar." +#define CATEGORY_INPUT_LABEL_SV "Inmatning" +#define CATEGORY_INPUT_INFO_0_SV "Konfigurera inställningar för spelkontrollern och ljuspistolen." +#define CATEGORY_EXPANSIONS_LABEL_SV NULL +#define CATEGORY_EXPANSIONS_INFO_0_SV NULL +#define CATEGORY_VMU_LABEL_SV "Visuell minnesenhet" +#define CATEGORY_VMU_INFO_0_SV "Konfigurera per-spel VMU-sparfiler och inställningar för synlighet av VMU på skärmen." +#define CORE_OPTION_NAME_REGION_LABEL_SV NULL +#define OPTION_VAL_JAPAN_SV NULL +#define OPTION_VAL_USA_SV NULL +#define OPTION_VAL_EUROPE_SV "Europa" +#define OPTION_VAL_DEFAULT_SV "Standard" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_SV "Språk" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SV "Ändrar språket som används av BIOS och av eventuella spel som innehåller flera språk." +#define OPTION_VAL_JAPANESE_SV "Japanska" +#define OPTION_VAL_ENGLISH_SV "Engelska" +#define OPTION_VAL_GERMAN_SV "Tyska" +#define OPTION_VAL_FRENCH_SV "Franska" +#define OPTION_VAL_SPANISH_SV "Spanska" +#define OPTION_VAL_ITALIAN_SV "Italienska" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SV "HLE BIOS (omstart krävs)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SV "Tvinga användning av högnivåemulering av BIOS." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SV "Boota till BIOS (omstart krävs)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SV "Starta direkt i Dreamcast BIOS-menyn." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SV "Aktivera DSP" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SV "Aktivera emulering av Dreamcasts ljud-DSP (digital signal processor). Förbättrar noggrannheten i genererat ljud, men ökar prestandakraven." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SV "Tillåt knappar för arkadservice" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SV "Aktiverar SERVICE-knapp för arkadspel för att ange kabinettinställningar." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SV "Ställ in NAOMI-spel till Free Play" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SV "Ändra spelets myntinställningar till free play." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SV "Emulering av bredbandsadapter" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SV "Emulera bredbandsadaptern istället för modemet. (omstart krävs)" +#define CORE_OPTION_NAME_UPNP_LABEL_SV "Aktivera UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_SV "Använd UPnP för att automatiskt konfigurera din internetrouter för onlinespel." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SV "Intern upplösning" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SV "Ändra renderingsupplösning." +#define OPTION_VAL_320X240_SV NULL +#define OPTION_VAL_640X480_SV NULL +#define OPTION_VAL_800X600_SV NULL +#define OPTION_VAL_960X720_SV NULL +#define OPTION_VAL_1024X768_SV NULL +#define OPTION_VAL_1280X960_SV NULL +#define OPTION_VAL_1440X1080_SV NULL +#define OPTION_VAL_1600X1200_SV NULL +#define OPTION_VAL_1920X1440_SV NULL +#define OPTION_VAL_2560X1920_SV NULL +#define OPTION_VAL_2880X2160_SV NULL +#define OPTION_VAL_3200X2400_SV NULL +#define OPTION_VAL_3840X2880_SV NULL +#define OPTION_VAL_4480X3360_SV NULL +#define OPTION_VAL_5120X3840_SV NULL +#define OPTION_VAL_5760X4320_SV NULL +#define OPTION_VAL_6400X4800_SV NULL +#define OPTION_VAL_7040X5280_SV NULL +#define OPTION_VAL_7680X5760_SV NULL +#define OPTION_VAL_8320X6240_SV NULL +#define OPTION_VAL_8960X6720_SV NULL +#define OPTION_VAL_9600X7200_SV NULL +#define OPTION_VAL_10240X7680_SV NULL +#define OPTION_VAL_10880X8160_SV NULL +#define OPTION_VAL_11520X8640_SV NULL +#define OPTION_VAL_12160X9120_SV NULL +#define OPTION_VAL_12800X9600_SV NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SV "Kabeltyp" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SV "Utgångssignalstyp. \"TV (Komposit)\" är den mest välkomna." +#define OPTION_VAL_VGA_SV NULL +#define OPTION_VAL_TV_RGB_SV NULL +#define OPTION_VAL_TV_COMPOSITE_SV "TV (Komposit)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_SV "Sändningsstandard" +#define OPTION_VAL_NTSC_SV NULL +#define OPTION_VAL_PAL_SV "PAL (Världen)" +#define OPTION_VAL_PAL_N_SV NULL +#define OPTION_VAL_PAL_M_SV "PAL-M (Brasilien)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SV "Skärmorientering" +#define OPTION_VAL_HORIZONTAL_SV "Horisontell" +#define OPTION_VAL_VERTICAL_SV "Vertikal" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SV "Alfasortering" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SV "Välj hur transparenta polygoner sorteras." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SV "Per-Strip (snabbast, minst noggrann)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_SV "Per-Triangel (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_SV "Per-Pixel (noggrann, men långsammast)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SV "Storlek på ackumulerande pixelbuffert" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SV "Högre värden kan vara nödvändiga för att korrekt visa utdata i högre upplösningar." +#define OPTION_VAL_512MB_SV NULL +#define OPTION_VAL_1GB_SV NULL +#define OPTION_VAL_2GB_SV NULL +#define OPTION_VAL_4GB_SV NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SV "Maximalt antal transparenta lager" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SV "Högre värden kan krävas för komplexa scener." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SV "Fullständig framebuffer-emulering" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SV "Aktivera fullständig framebuffer-emulering i VRAM. Detta är användbart för spel som läser eller skriver direkt till framebuffer i VRAM. När det är aktiverat tvingas intern upplösning till 640x480 och prestanda kan påverkas allvarligt." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SV "Aktivera RTT (Render To Texture) buffert" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SV "Kopiera renderade texturer tillbaka från GPU till VRAM. Denna inställning är normalt aktiverad för spel som kräver det. När den är aktiverad avaktiveras uppskalning av texturrendering och prestandan kan påverkas." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SV "Mipmappning" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_SV NULL +#define CORE_OPTION_NAME_FOG_LABEL_SV "Dimeffekter" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SV "Volymjusterare" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SV "En Dreamcast GPU-funktion som vanligtvis används av spel för att rita objektsskuggor. Detta bör normalt vara aktiverat - prestandapåverkan är vanligtvis minimal till försumbar." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SV "Anisotropisk Filtering" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SV "Förbättrar kvaliteten på texturer på ytor som är i sneda betraktningsvinklar i förhållande till kameran. Högre värden kräver mer av GPU:n. Ändringar av denna inställning gäller endast efter omstart." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SV "Texturfiltrering" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SV "Texturfiltreringsläget som ska användas. Detta kan användas för att tvinga ett visst texturfiltreringsläge på alla texturer för att få en skarpare (eller slätare) utseende än standard. Värden som skiljer sig från standard kan orsaka olika renderingsproblem. Ändringar av denna inställning gäller endast efter omstart." +#define OPTION_VAL_1_SV "Tvinga Närmsta granne" +#define OPTION_VAL_2_SV "Tvinga Linjär" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SV "Fördröj bildrutebyte" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SV "Användbart för att undvika blinkande skärmar eller glitchiga videor. Rekommenderas inte på långsamma plattformar." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SV "Upptäck ändringar i bildhastighet" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SV "Meddela gränssnittet när den interna bildrutefrekvensen ändras (till exempel från 60 fps till 30 fps). Förbättrar taktningen av bildfrekvensen i spel som körs med en låst hastighet på 30 fps eller 20 fps, men bör vara inaktiverad för spel med upplåsta (ostadiga) bildrutefrekvenser (till exempel Ecco the Dolphin, Unreal Tournament). Observera!: Ej tillgänglig när \"Auto Skip Frame\" är aktiverad." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SV "PowerVR2 Efterbehandlingsfilter" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SV "Efterbehandla den renderade bilden för att simulera effekter som är specifika för PowerVR2 GPU:n och analoga videosignaler." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SV "Texturuppskalning (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SV "Förbättrar handritade 2D-pixelgrafik. Ska endast användas med 2D-pixeliserade spel." +#define OPTION_VAL_2_O26_SV NULL +#define OPTION_VAL_4_SV NULL +#define OPTION_VAL_6_SV NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SV "Maximalt filtrerad storlek för texturuppskalning" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SV NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SV "Ursprunglig djupinterpolation" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SV "Hjälper till med texturkorruption och djupproblem på AMD-GPU:n. Kan även hjälpa Intel-GPU:n i vissa fall." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SV NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SV NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SV "Trådad rendering" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SV "Kör GPU och CPU på olika trådar. Starkt rekommenderat." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SV "Hoppa över bildrutor automatiskt" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SV "Hoppa automatiskt över bildrutor när emuleringen går långsamt. Observera!: Denna inställning gäller endast när \"Trådad Rendering\" är aktiverad." +#define OPTION_VAL_SOME_SV NULL +#define OPTION_VAL_MORE_SV "Maximalt" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SV "Bildruteskippning" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SV "Sätter antalet bildrutor att hoppa över mellan varje visad bildruta." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SV "Bredbildsfusk (omstart krävs)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SV "Aktiverar fusk som gör det möjligt för vissa spel att visas i bredbildsformat." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SV "Bredbildshackning" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SV "Ritar geometrin utanför den normala 4:3 bildformatet. Kan leda till grafiska fel i de avslöjade områdena." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SV "GD-ROM Snabbladdning (felaktig)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SV "Ökar hastigheten på GD-ROM laddningen." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SV "\"Dreamcast 32MB RAM-modifikation\"" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SV "Aktiverar 32MB RAM-modifikation för Dreamcast. Kan påverka kompatibiliteten." +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SV "SH4 CPU under/överklockning" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SV "Ändra SH4 huvud-CPU-klockan från standarden 200 MHz. Att sänka klockfrekvensen kan hjälpa på långsamma plattformar. Att öka klockfrekvensen kan öka bildhastigheten i vissa spel. Använd på egen risk." +#define OPTION_VAL_100_SV NULL +#define OPTION_VAL_110_SV NULL +#define OPTION_VAL_120_SV NULL +#define OPTION_VAL_130_SV NULL +#define OPTION_VAL_140_SV NULL +#define OPTION_VAL_150_SV NULL +#define OPTION_VAL_160_SV NULL +#define OPTION_VAL_170_SV NULL +#define OPTION_VAL_180_SV NULL +#define OPTION_VAL_190_SV NULL +#define OPTION_VAL_200_SV NULL +#define OPTION_VAL_210_SV NULL +#define OPTION_VAL_220_SV NULL +#define OPTION_VAL_230_SV NULL +#define OPTION_VAL_240_SV NULL +#define OPTION_VAL_250_SV NULL +#define OPTION_VAL_260_SV NULL +#define OPTION_VAL_270_SV NULL +#define OPTION_VAL_280_SV NULL +#define OPTION_VAL_290_SV NULL +#define OPTION_VAL_300_SV NULL +#define OPTION_VAL_310_SV NULL +#define OPTION_VAL_320_SV NULL +#define OPTION_VAL_330_SV NULL +#define OPTION_VAL_340_SV NULL +#define OPTION_VAL_350_SV NULL +#define OPTION_VAL_360_SV NULL +#define OPTION_VAL_370_SV NULL +#define OPTION_VAL_380_SV NULL +#define OPTION_VAL_390_SV NULL +#define OPTION_VAL_400_SV NULL +#define OPTION_VAL_410_SV NULL +#define OPTION_VAL_420_SV NULL +#define OPTION_VAL_430_SV NULL +#define OPTION_VAL_440_SV NULL +#define OPTION_VAL_450_SV NULL +#define OPTION_VAL_460_SV NULL +#define OPTION_VAL_470_SV NULL +#define OPTION_VAL_480_SV NULL +#define OPTION_VAL_490_SV NULL +#define OPTION_VAL_500_SV NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SV "Ladda in anpassade texturer" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SV NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SV "Dumpa texturer" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SV NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SV "Analoga spakens dödzon" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SV NULL +#define OPTION_VAL_0_SV NULL +#define OPTION_VAL_5_SV NULL +#define OPTION_VAL_10_SV NULL +#define OPTION_VAL_15_SV NULL +#define OPTION_VAL_20_SV NULL +#define OPTION_VAL_25_SV NULL +#define OPTION_VAL_30_SV NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SV "Dödläge för avtryckare" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SV NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SV "Digitala avtryckare" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SV NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SV "Sänd ut digitala utgångar" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SV "Sänd digitala utgångar och force-feedbackstatus på TCP-port 8000. Kompatibelt med MAME-alternativet \"-output network\"." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SV "Visa ljuspistolinställningar" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SV "Aktivera konfiguration av alternativ för ljuspistolens hårkors. OBS!: Snabbmenyn kan behöva aktiveras och avaktiveras för att denna inställning ska träda i kraft." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SV "Storleksskalning för pistolhårkors" +#define OPTION_VAL_50_SV NULL +#define OPTION_VAL_60_SV NULL +#define OPTION_VAL_70_SV NULL +#define OPTION_VAL_80_SV NULL +#define OPTION_VAL_90_SV NULL +#define OPTION_VAL_100_O45_SV NULL +#define OPTION_VAL_110_O45_SV NULL +#define OPTION_VAL_120_O45_SV NULL +#define OPTION_VAL_130_O45_SV NULL +#define OPTION_VAL_140_O45_SV NULL +#define OPTION_VAL_150_O45_SV NULL +#define OPTION_VAL_160_O45_SV NULL +#define OPTION_VAL_170_O45_SV NULL +#define OPTION_VAL_180_O45_SV NULL +#define OPTION_VAL_190_O45_SV NULL +#define OPTION_VAL_200_O45_SV NULL +#define OPTION_VAL_210_O45_SV NULL +#define OPTION_VAL_220_O45_SV NULL +#define OPTION_VAL_230_O45_SV NULL +#define OPTION_VAL_240_O45_SV NULL +#define OPTION_VAL_250_O45_SV NULL +#define OPTION_VAL_260_O45_SV NULL +#define OPTION_VAL_270_O45_SV NULL +#define OPTION_VAL_280_O45_SV NULL +#define OPTION_VAL_290_O45_SV NULL +#define OPTION_VAL_300_O45_SV NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 1" +#define OPTION_VAL_WHITE_SV "Vit" +#define OPTION_VAL_RED_SV "Röd" +#define OPTION_VAL_GREEN_SV "Grön" +#define OPTION_VAL_BLUE_SV "Blå" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 2" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 3" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 4" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SV NULL +#define OPTION_VAL_VMU_SV NULL +#define OPTION_VAL_PURUPURU_SV NULL +#define OPTION_VAL_NONE_SV "Ingen" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SV NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SV NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SV "Per-spel visningsminnesenheter/systemer (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SV "Per-spel VMU:er" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SV NULL +#define OPTION_VAL_VMU_A1_SV NULL +#define OPTION_VAL_ALL_VMUS_SV "Alla VMU:er" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SV "Ljud för visuella minnesenheter/System (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SV "VMU-ljud" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SV "När detta är aktiverad, spelas VMU-pipen." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SV "Visa inställningar för Visual Memory Unit/System (VMU)-skärmen" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SV "Visa VMU-skärminställningar" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SV "Möjliggör konfiguration av emulerad VMU LCD-skärmens synlighet, storlek, position och färg. OBS!: Snabbmenyn kan behöva aktiveras/dras fram för att den här inställningen ska träda i kraft." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SV "Position för VMU-skärm 1" +#define OPTION_VAL_UPPER_LEFT_SV "Övre vänstra" +#define OPTION_VAL_UPPER_RIGHT_SV "Övre högra" +#define OPTION_VAL_LOWER_LEFT_SV "Nedre vänstra" +#define OPTION_VAL_LOWER_RIGHT_SV "Nedre högra" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SV "VMU skärm 1 Storlek" +#define OPTION_VAL_1X_SV NULL +#define OPTION_VAL_3X_SV NULL +#define OPTION_VAL_5X_SV NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SV "VMU Skärm 1 Pixel PÅ Färg" +#define OPTION_VAL_DEFAULT_ON_00_SV "Standard PÅ" +#define OPTION_VAL_DEFAULT_OFF_01_SV "Standard AV" +#define OPTION_VAL_BLACK_02_SV "Svart" +#define OPTION_VAL_LIGHT_BLUE_04_SV "Ljusblå" +#define OPTION_VAL_CYAN_06_SV NULL +#define OPTION_VAL_CYAN_BLUE_07_SV "Turkosblå" +#define OPTION_VAL_LIGHT_GREEN_08_SV "Ljusgrön" +#define OPTION_VAL_CYAN_GREEN_09_SV "Turkosgrön" +#define OPTION_VAL_LIGHT_CYAN_10_SV "Ljusturkos" +#define OPTION_VAL_PURPLE_12_SV "Lila" +#define OPTION_VAL_LIGHT_PURPLE_13_SV "Ljuslila" +#define OPTION_VAL_YELLOW_14_SV "Gul" +#define OPTION_VAL_GRAY_15_SV "Grå" +#define OPTION_VAL_LIGHT_PURPLE_2_16_SV "Ljuslila (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_SV "Ljusgrön (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_SV "Ljusgrön (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_SV "Ljusturkos (2)" +#define OPTION_VAL_LIGHT_RED_2_20_SV "Ljusröd (2)" +#define OPTION_VAL_MAGENTA_21_SV NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_SV "Ljuslila (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_SV "Ljusorange" +#define OPTION_VAL_ORANGE_24_SV NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_SV "Ljuslila (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_SV "Ljusgul" +#define OPTION_VAL_LIGHT_YELLOW_2_27_SV "Ljusgul (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SV "VMU Skärm 1 Pixel AV Färg" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SV "VMU Skärm 1 Opacitet" +#define OPTION_VAL_40_SV NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SV "VMU Skärm 2 Visa" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SV "VMU Skärm 2 Position" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SV "VMU Skärm 2 Storlek" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SV "VMU Skärm 2 Pixel PÅ Färg" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SV "VMU Skärm 2 Pixel AV Färg" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SV "VMU Skärm 2 Opacitet" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SV "VMU skärm 3 Storlek" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SV "Aktivera pixelfärg på VMU skärm 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SV "Avaktivera pixelfärg på VMU skärm 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SV "Opaciteten för VMU Skärm 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SV "VMU skärm 4 Storlek" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SV "VMU Skärm 4 Pixel PÅ Färg" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SV "VMU Skärm 4 Pixel AV Färg" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SV "VMU Skärm 4 Opacitet" -struct retro_core_option_v2_category option_cats_sr[] = { +struct retro_core_option_v2_category option_cats_sv[] = { { "system", - CATEGORY_SYSTEM_LABEL_SR, - CATEGORY_SYSTEM_INFO_0_SR + CATEGORY_SYSTEM_LABEL_SV, + CATEGORY_SYSTEM_INFO_0_SV }, { "video", - CATEGORY_VIDEO_LABEL_SR, - CATEGORY_VIDEO_INFO_0_SR + CATEGORY_VIDEO_LABEL_SV, + CATEGORY_VIDEO_INFO_0_SV }, { "performance", - CATEGORY_PERFORMANCE_LABEL_SR, - CATEGORY_PERFORMANCE_INFO_0_SR + CATEGORY_PERFORMANCE_LABEL_SV, + CATEGORY_PERFORMANCE_INFO_0_SV }, { "hacks", - CATEGORY_HACKS_LABEL_SR, - CATEGORY_HACKS_INFO_0_SR + CATEGORY_HACKS_LABEL_SV, + CATEGORY_HACKS_INFO_0_SV }, { "input", - CATEGORY_INPUT_LABEL_SR, - CATEGORY_INPUT_INFO_0_SR + CATEGORY_INPUT_LABEL_SV, + CATEGORY_INPUT_INFO_0_SV + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_SV, + CATEGORY_EXPANSIONS_INFO_0_SV }, { "vmu", - CATEGORY_VMU_LABEL_SR, - CATEGORY_VMU_INFO_0_SR + CATEGORY_VMU_LABEL_SV, + CATEGORY_VMU_INFO_0_SV }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_sr[] = { +struct retro_core_option_v2_definition option_defs_sv[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_SR, + CORE_OPTION_NAME_REGION_LABEL_SV, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_SR }, - { "USA", OPTION_VAL_USA_SR }, - { "Europe", OPTION_VAL_EUROPE_SR }, - { "Default", OPTION_VAL_DEFAULT_SR }, + { "Japan", OPTION_VAL_JAPAN_SV }, + { "USA", OPTION_VAL_USA_SV }, + { "Europe", OPTION_VAL_EUROPE_SV }, + { "Default", OPTION_VAL_DEFAULT_SV }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_SR, + CORE_OPTION_NAME_LANGUAGE_LABEL_SV, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_SR, + CORE_OPTION_NAME_LANGUAGE_INFO_0_SV, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_SR }, - { "English", OPTION_VAL_ENGLISH_SR }, - { "German", OPTION_VAL_GERMAN_SR }, - { "French", OPTION_VAL_FRENCH_SR }, - { "Spanish", OPTION_VAL_SPANISH_SR }, - { "Italian", OPTION_VAL_ITALIAN_SR }, - { "Default", OPTION_VAL_DEFAULT_SR }, + { "Japanese", OPTION_VAL_JAPANESE_SV }, + { "English", OPTION_VAL_ENGLISH_SV }, + { "German", OPTION_VAL_GERMAN_SV }, + { "French", OPTION_VAL_FRENCH_SV }, + { "Spanish", OPTION_VAL_SPANISH_SV }, + { "Italian", OPTION_VAL_ITALIAN_SV }, + { "Default", OPTION_VAL_DEFAULT_SV }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_SR, + CORE_OPTION_NAME_HLE_BIOS_LABEL_SV, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_SR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_SV, NULL, "system", { @@ -59790,9 +70933,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SR, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SV, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SV, NULL, "system", { @@ -59804,9 +70947,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_SR, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_SV, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SV, NULL, "system", { @@ -59820,25 +70963,11 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_SR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SV, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SV, NULL, "system", { @@ -59850,9 +70979,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SR, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SV, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SR, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SV, NULL, "system", { @@ -59864,9 +70993,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_SR, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_SV, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SR, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SV, NULL, "system", { @@ -59878,9 +71007,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_SR, + CORE_OPTION_NAME_UPNP_LABEL_SV, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_SR, + CORE_OPTION_NAME_UPNP_INFO_0_SV, NULL, "system", { @@ -59893,39 +71022,39 @@ struct retro_core_option_v2_definition option_defs_sr[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SV, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SR, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SV, NULL, "video", { - { "320x240", OPTION_VAL_320X240_SR }, - { "640x480", OPTION_VAL_640X480_SR }, - { "800x600", OPTION_VAL_800X600_SR }, - { "960x720", OPTION_VAL_960X720_SR }, - { "1024x768", OPTION_VAL_1024X768_SR }, - { "1280x960", OPTION_VAL_1280X960_SR }, - { "1440x1080", OPTION_VAL_1440X1080_SR }, - { "1600x1200", OPTION_VAL_1600X1200_SR }, - { "1920x1440", OPTION_VAL_1920X1440_SR }, - { "2560x1920", OPTION_VAL_2560X1920_SR }, - { "2880x2160", OPTION_VAL_2880X2160_SR }, - { "3200x2400", OPTION_VAL_3200X2400_SR }, - { "3840x2880", OPTION_VAL_3840X2880_SR }, - { "4480x3360", OPTION_VAL_4480X3360_SR }, - { "5120x3840", OPTION_VAL_5120X3840_SR }, - { "5760x4320", OPTION_VAL_5760X4320_SR }, - { "6400x4800", OPTION_VAL_6400X4800_SR }, - { "7040x5280", OPTION_VAL_7040X5280_SR }, - { "7680x5760", OPTION_VAL_7680X5760_SR }, - { "8320x6240", OPTION_VAL_8320X6240_SR }, - { "8960x6720", OPTION_VAL_8960X6720_SR }, - { "9600x7200", OPTION_VAL_9600X7200_SR }, - { "10240x7680", OPTION_VAL_10240X7680_SR }, - { "10880x8160", OPTION_VAL_10880X8160_SR }, - { "11520x8640", OPTION_VAL_11520X8640_SR }, - { "12160x9120", OPTION_VAL_12160X9120_SR }, - { "12800x9600", OPTION_VAL_12800X9600_SR }, + { "320x240", OPTION_VAL_320X240_SV }, + { "640x480", OPTION_VAL_640X480_SV }, + { "800x600", OPTION_VAL_800X600_SV }, + { "960x720", OPTION_VAL_960X720_SV }, + { "1024x768", OPTION_VAL_1024X768_SV }, + { "1280x960", OPTION_VAL_1280X960_SV }, + { "1440x1080", OPTION_VAL_1440X1080_SV }, + { "1600x1200", OPTION_VAL_1600X1200_SV }, + { "1920x1440", OPTION_VAL_1920X1440_SV }, + { "2560x1920", OPTION_VAL_2560X1920_SV }, + { "2880x2160", OPTION_VAL_2880X2160_SV }, + { "3200x2400", OPTION_VAL_3200X2400_SV }, + { "3840x2880", OPTION_VAL_3840X2880_SV }, + { "4480x3360", OPTION_VAL_4480X3360_SV }, + { "5120x3840", OPTION_VAL_5120X3840_SV }, + { "5760x4320", OPTION_VAL_5760X4320_SV }, + { "6400x4800", OPTION_VAL_6400X4800_SV }, + { "7040x5280", OPTION_VAL_7040X5280_SV }, + { "7680x5760", OPTION_VAL_7680X5760_SV }, + { "8320x6240", OPTION_VAL_8320X6240_SV }, + { "8960x6720", OPTION_VAL_8960X6720_SV }, + { "9600x7200", OPTION_VAL_9600X7200_SV }, + { "10240x7680", OPTION_VAL_10240X7680_SV }, + { "10880x8160", OPTION_VAL_10880X8160_SV }, + { "11520x8640", OPTION_VAL_11520X8640_SV }, + { "12160x9120", OPTION_VAL_12160X9120_SV }, + { "12800x9600", OPTION_VAL_12800X9600_SV }, { NULL, NULL }, }, #ifdef LOW_RES @@ -59936,62 +71065,62 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_SR, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_SV, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SR, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SV, NULL, "video", { - { "VGA", OPTION_VAL_VGA_SR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_SR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SR }, + { "VGA", OPTION_VAL_VGA_SV }, + { "TV (RGB)", OPTION_VAL_TV_RGB_SV }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SV }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_SR, + CORE_OPTION_NAME_BROADCAST_LABEL_SV, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_SR }, - { "PAL", OPTION_VAL_PAL_SR }, - { "PAL_N", OPTION_VAL_PAL_N_SR }, - { "PAL_M", OPTION_VAL_PAL_M_SR }, - { "Default", OPTION_VAL_DEFAULT_SR }, + { "NTSC", OPTION_VAL_NTSC_SV }, + { "PAL", OPTION_VAL_PAL_SV }, + { "PAL_N", OPTION_VAL_PAL_N_SV }, + { "PAL_M", OPTION_VAL_PAL_M_SV }, + { "Default", OPTION_VAL_DEFAULT_SV }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SR, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SV, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_SR }, - { "vertical", OPTION_VAL_VERTICAL_SR }, + { "horizontal", OPTION_VAL_HORIZONTAL_SV }, + { "vertical", OPTION_VAL_VERTICAL_SV }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SR, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_SV, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SR }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SV }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SV }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SR }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SV }, #endif { NULL, NULL }, }, @@ -60004,25 +71133,25 @@ struct retro_core_option_v2_definition option_defs_sr[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SV, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SV, NULL, "video", { - { "512MB", OPTION_VAL_512MB_SR }, - { "1GB", OPTION_VAL_1GB_SR }, - { "2GB", OPTION_VAL_2GB_SR }, - { "4GB", OPTION_VAL_4GB_SR }, + { "512MB", OPTION_VAL_512MB_SV }, + { "1GB", OPTION_VAL_1GB_SV }, + { "2GB", OPTION_VAL_2GB_SV }, + { "4GB", OPTION_VAL_4GB_SV }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_SR, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_SV, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SR, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SV, NULL, "video", { @@ -60030,6 +71159,7 @@ struct retro_core_option_v2_definition option_defs_sr[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -60038,9 +71168,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SV, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SV, NULL, "video", { @@ -60052,9 +71182,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SR, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SV, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SR, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SV, NULL, "video", { @@ -60064,11 +71194,11 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_SR, + CORE_OPTION_NAME_MIPMAPPING_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_SV, NULL, "video", { @@ -60080,7 +71210,7 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_SR, + CORE_OPTION_NAME_FOG_LABEL_SV, NULL, "", NULL, @@ -60094,9 +71224,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SV, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SV, NULL, "video", { @@ -60108,9 +71238,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SV, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SV, NULL, "video", { @@ -60125,24 +71255,24 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SV, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SV, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_SR }, - { "1", OPTION_VAL_1_SR }, - { "2", OPTION_VAL_2_SR }, + { "0", OPTION_VAL_DEFAULT_SV }, + { "1", OPTION_VAL_1_SV }, + { "2", OPTION_VAL_2_SV }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SV, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SV, NULL, "video", { @@ -60150,13 +71280,13 @@ struct retro_core_option_v2_definition option_defs_sr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SV, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SV, NULL, "video", { @@ -60168,9 +71298,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SV, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SV, NULL, "video", { @@ -60183,25 +71313,25 @@ struct retro_core_option_v2_definition option_defs_sr[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_SR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_SV, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SV, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_SR }, - { "4", OPTION_VAL_4_SR }, - { "6", OPTION_VAL_6_SR }, + { "2", OPTION_VAL_2_O26_SV }, + { "4", OPTION_VAL_4_SV }, + { "6", OPTION_VAL_6_SV }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_SV, NULL, "video", { @@ -60215,9 +71345,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SV, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SV, NULL, "video", { @@ -60227,11 +71357,25 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_SV, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_SV, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SV, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SV, NULL, "performance", { @@ -60243,15 +71387,15 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SV, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SV, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_SR }, - { "more", OPTION_VAL_MORE_SR }, + { "some", OPTION_VAL_SOME_SV }, + { "more", OPTION_VAL_MORE_SV }, { NULL, NULL }, }, #ifdef LOW_END @@ -60262,9 +71406,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SV, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SV, NULL, "performance", { @@ -60281,9 +71425,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SV, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SV, NULL, "hacks", { @@ -60295,9 +71439,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SV, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SV, NULL, "hacks", { @@ -60309,9 +71453,9 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SV, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SV, NULL, "hacks", { @@ -60325,64 +71469,78 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_SV, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_SV, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_SR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_SV, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_SR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_SV, NULL, "hacks", { - { "100", OPTION_VAL_100_SR }, - { "110", OPTION_VAL_110_SR }, - { "120", OPTION_VAL_120_SR }, - { "130", OPTION_VAL_130_SR }, - { "140", OPTION_VAL_140_SR }, - { "150", OPTION_VAL_150_SR }, - { "160", OPTION_VAL_160_SR }, - { "170", OPTION_VAL_170_SR }, - { "180", OPTION_VAL_180_SR }, - { "190", OPTION_VAL_190_SR }, - { "200", OPTION_VAL_200_SR }, - { "210", OPTION_VAL_210_SR }, - { "220", OPTION_VAL_220_SR }, - { "230", OPTION_VAL_230_SR }, - { "240", OPTION_VAL_240_SR }, - { "250", OPTION_VAL_250_SR }, - { "260", OPTION_VAL_260_SR }, - { "270", OPTION_VAL_270_SR }, - { "280", OPTION_VAL_280_SR }, - { "290", OPTION_VAL_290_SR }, - { "300", OPTION_VAL_300_SR }, - { "310", OPTION_VAL_310_SR }, - { "320", OPTION_VAL_320_SR }, - { "330", OPTION_VAL_330_SR }, - { "340", OPTION_VAL_340_SR }, - { "350", OPTION_VAL_350_SR }, - { "360", OPTION_VAL_360_SR }, - { "370", OPTION_VAL_370_SR }, - { "380", OPTION_VAL_380_SR }, - { "390", OPTION_VAL_390_SR }, - { "400", OPTION_VAL_400_SR }, - { "410", OPTION_VAL_410_SR }, - { "420", OPTION_VAL_420_SR }, - { "430", OPTION_VAL_430_SR }, - { "440", OPTION_VAL_440_SR }, - { "450", OPTION_VAL_450_SR }, - { "460", OPTION_VAL_460_SR }, - { "470", OPTION_VAL_470_SR }, - { "480", OPTION_VAL_480_SR }, - { "490", OPTION_VAL_490_SR }, - { "500", OPTION_VAL_500_SR }, + { "100", OPTION_VAL_100_SV }, + { "110", OPTION_VAL_110_SV }, + { "120", OPTION_VAL_120_SV }, + { "130", OPTION_VAL_130_SV }, + { "140", OPTION_VAL_140_SV }, + { "150", OPTION_VAL_150_SV }, + { "160", OPTION_VAL_160_SV }, + { "170", OPTION_VAL_170_SV }, + { "180", OPTION_VAL_180_SV }, + { "190", OPTION_VAL_190_SV }, + { "200", OPTION_VAL_200_SV }, + { "210", OPTION_VAL_210_SV }, + { "220", OPTION_VAL_220_SV }, + { "230", OPTION_VAL_230_SV }, + { "240", OPTION_VAL_240_SV }, + { "250", OPTION_VAL_250_SV }, + { "260", OPTION_VAL_260_SV }, + { "270", OPTION_VAL_270_SV }, + { "280", OPTION_VAL_280_SV }, + { "290", OPTION_VAL_290_SV }, + { "300", OPTION_VAL_300_SV }, + { "310", OPTION_VAL_310_SV }, + { "320", OPTION_VAL_320_SV }, + { "330", OPTION_VAL_330_SV }, + { "340", OPTION_VAL_340_SV }, + { "350", OPTION_VAL_350_SV }, + { "360", OPTION_VAL_360_SV }, + { "370", OPTION_VAL_370_SV }, + { "380", OPTION_VAL_380_SV }, + { "390", OPTION_VAL_390_SV }, + { "400", OPTION_VAL_400_SV }, + { "410", OPTION_VAL_410_SV }, + { "420", OPTION_VAL_420_SV }, + { "430", OPTION_VAL_430_SV }, + { "440", OPTION_VAL_440_SV }, + { "450", OPTION_VAL_450_SV }, + { "460", OPTION_VAL_460_SV }, + { "470", OPTION_VAL_470_SV }, + { "480", OPTION_VAL_480_SV }, + { "490", OPTION_VAL_490_SV }, + { "500", OPTION_VAL_500_SV }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_SV, NULL, "hacks", { @@ -60392,11 +71550,11 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_SV, NULL, "hacks", { @@ -60408,47 +71566,47 @@ struct retro_core_option_v2_definition option_defs_sr[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_SV, NULL, "input", { - { "0%", OPTION_VAL_0_SR }, - { "5%", OPTION_VAL_5_SR }, - { "10%", OPTION_VAL_10_SR }, - { "15%", OPTION_VAL_15_SR }, - { "20%", OPTION_VAL_20_SR }, - { "25%", OPTION_VAL_25_SR }, - { "30%", OPTION_VAL_30_SR }, + { "0%", OPTION_VAL_0_SV }, + { "5%", OPTION_VAL_5_SV }, + { "10%", OPTION_VAL_10_SV }, + { "15%", OPTION_VAL_15_SV }, + { "20%", OPTION_VAL_20_SV }, + { "25%", OPTION_VAL_25_SV }, + { "30%", OPTION_VAL_30_SV }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SR, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_SV, NULL, "input", { - { "0%", OPTION_VAL_0_SR }, - { "5%", OPTION_VAL_5_SR }, - { "10%", OPTION_VAL_10_SR }, - { "15%", OPTION_VAL_15_SR }, - { "20%", OPTION_VAL_20_SR }, - { "25%", OPTION_VAL_25_SR }, - { "30%", OPTION_VAL_30_SR }, + { "0%", OPTION_VAL_0_SV }, + { "5%", OPTION_VAL_5_SV }, + { "10%", OPTION_VAL_10_SV }, + { "15%", OPTION_VAL_15_SV }, + { "20%", OPTION_VAL_20_SV }, + { "25%", OPTION_VAL_25_SV }, + { "30%", OPTION_VAL_30_SV }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SR, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_SV, NULL, "input", { @@ -60459,10 +71617,10 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SR, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SV, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SR, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SV, NULL, "input", { @@ -60470,300 +71628,293 @@ struct retro_core_option_v2_definition option_defs_sr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SR, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SV, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SV, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SR, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_SV, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SR, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_SV }, + { "60%", OPTION_VAL_60_SV }, + { "70%", OPTION_VAL_70_SV }, + { "80%", OPTION_VAL_80_SV }, + { "90%", OPTION_VAL_90_SV }, + { "100%", OPTION_VAL_100_O45_SV }, + { "110%", OPTION_VAL_110_O45_SV }, + { "120%", OPTION_VAL_120_O45_SV }, + { "130%", OPTION_VAL_130_O45_SV }, + { "140%", OPTION_VAL_140_O45_SV }, + { "150%", OPTION_VAL_150_O45_SV }, + { "160%", OPTION_VAL_160_O45_SV }, + { "170%", OPTION_VAL_170_O45_SV }, + { "180%", OPTION_VAL_180_O45_SV }, + { "190%", OPTION_VAL_190_O45_SV }, + { "200%", OPTION_VAL_200_O45_SV }, + { "210%", OPTION_VAL_210_O45_SV }, + { "220%", OPTION_VAL_220_O45_SV }, + { "230%", OPTION_VAL_230_O45_SV }, + { "240%", OPTION_VAL_240_O45_SV }, + { "250%", OPTION_VAL_250_O45_SV }, + { "260%", OPTION_VAL_260_O45_SV }, + { "270%", OPTION_VAL_270_O45_SV }, + { "280%", OPTION_VAL_280_O45_SV }, + { "290%", OPTION_VAL_290_O45_SV }, + { "300%", OPTION_VAL_300_O45_SV }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SR, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SV, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SR }, - { "Red", OPTION_VAL_RED_SR }, - { "Green", OPTION_VAL_GREEN_SR }, - { "Blue", OPTION_VAL_BLUE_SR }, + { "White", OPTION_VAL_WHITE_SV }, + { "Red", OPTION_VAL_RED_SV }, + { "Green", OPTION_VAL_GREEN_SV }, + { "Blue", OPTION_VAL_BLUE_SV }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SR, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SV, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SR }, - { "Red", OPTION_VAL_RED_SR }, - { "Green", OPTION_VAL_GREEN_SR }, - { "Blue", OPTION_VAL_BLUE_SR }, + { "White", OPTION_VAL_WHITE_SV }, + { "Red", OPTION_VAL_RED_SV }, + { "Green", OPTION_VAL_GREEN_SV }, + { "Blue", OPTION_VAL_BLUE_SV }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SR, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SV, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SR }, - { "Red", OPTION_VAL_RED_SR }, - { "Green", OPTION_VAL_GREEN_SR }, - { "Blue", OPTION_VAL_BLUE_SR }, + { "White", OPTION_VAL_WHITE_SV }, + { "Red", OPTION_VAL_RED_SV }, + { "Green", OPTION_VAL_GREEN_SV }, + { "Blue", OPTION_VAL_BLUE_SV }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SR, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SV, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SR }, - { "Red", OPTION_VAL_RED_SR }, - { "Green", OPTION_VAL_GREEN_SR }, - { "Blue", OPTION_VAL_BLUE_SR }, + { "White", OPTION_VAL_WHITE_SV }, + { "Red", OPTION_VAL_RED_SV }, + { "Green", OPTION_VAL_GREEN_SV }, + { "Blue", OPTION_VAL_BLUE_SV }, { NULL, NULL }, }, "disabled", }, { - CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SR, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_SV, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_SV, + NULL, + "expansions", { - { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_SR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_SR }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_SR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_SR, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_SV, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_SV, + NULL, + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SR, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_SV, NULL, - "vmu", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_SV, + NULL, + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, + { NULL, NULL }, }, - "disabled" + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SR, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_SV, NULL, - "vmu", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SR, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_SV, NULL, - "vmu", + "expansions", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, { NULL, NULL }, }, - "Upper Left", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SR, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_SV, NULL, - "vmu", + "expansions", { - { "1x", OPTION_VAL_1X_SR }, - { "2x", OPTION_VAL_2_O27_SR }, - { "3x", OPTION_VAL_3X_SR }, - { "4x", OPTION_VAL_4_SR }, - { "5x", OPTION_VAL_5X_SR }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, { NULL, NULL }, }, - "1x", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SR, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_SV, NULL, - "vmu", + "expansions", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "VMU", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SR, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_SV, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_SV, NULL, - "vmu", + "expansions", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "VMU", OPTION_VAL_VMU_SV }, + { "Purupuru", OPTION_VAL_PURUPURU_SV }, + { "None", OPTION_VAL_NONE_SV }, { NULL, NULL }, }, - "DEFAULT_OFF 01", + "Purupuru", }, { - CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SR, + CORE_OPTION_NAME "_per_content_vmus", + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SV, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SV, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SV, NULL, - "", + "vmu", + { + { "disabled", NULL }, + { "VMU A1", OPTION_VAL_VMU_A1_SV }, + { "All VMUs", OPTION_VAL_ALL_VMUS_SV }, + { NULL, NULL}, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu_sound", + CORE_OPTION_NAME_VMU_SOUND_LABEL_SV, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SV, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_SV, NULL, "vmu", { - { "10%", OPTION_VAL_10_SR }, - { "20%", OPTION_VAL_20_SR }, - { "30%", OPTION_VAL_30_SR }, - { "40%", OPTION_VAL_40_SR }, - { "50%", OPTION_VAL_50_SR }, - { "60%", OPTION_VAL_60_SR }, - { "70%", OPTION_VAL_70_SR }, - { "80%", OPTION_VAL_80_SR }, - { "90%", OPTION_VAL_90_SR }, - { "100%", OPTION_VAL_100_O57_SR }, - { NULL, NULL }, + { "disabled", NULL }, + { "enabled", NULL }, }, - "100%", + "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SR, + CORE_OPTION_NAME "_show_vmu_screen_settings", + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SV, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SV, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SV, + NULL, + "vmu", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_vmu1_screen_display", + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SV, NULL, "", NULL, @@ -60776,145 +71927,145 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SR, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SV, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, { NULL, NULL }, }, "Upper Left", }, { - CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SR, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SV, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SR }, - { "2x", OPTION_VAL_2_O27_SR }, - { "3x", OPTION_VAL_3X_SR }, - { "4x", OPTION_VAL_4_SR }, - { "5x", OPTION_VAL_5X_SR }, + { "1x", OPTION_VAL_1X_SV }, + { "2x", OPTION_VAL_2_O26_SV }, + { "3x", OPTION_VAL_3X_SV }, + { "4x", OPTION_VAL_4_SV }, + { "5x", OPTION_VAL_5X_SV }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SR, + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SV, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SR, + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SV, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SR, + CORE_OPTION_NAME "_vmu1_screen_opacity", + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SV, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SR }, - { "20%", OPTION_VAL_20_SR }, - { "30%", OPTION_VAL_30_SR }, - { "40%", OPTION_VAL_40_SR }, - { "50%", OPTION_VAL_50_SR }, - { "60%", OPTION_VAL_60_SR }, - { "70%", OPTION_VAL_70_SR }, - { "80%", OPTION_VAL_80_SR }, - { "90%", OPTION_VAL_90_SR }, - { "100%", OPTION_VAL_100_O57_SR }, + { "10%", OPTION_VAL_10_SV }, + { "20%", OPTION_VAL_20_SV }, + { "30%", OPTION_VAL_30_SV }, + { "40%", OPTION_VAL_40_SV }, + { "50%", OPTION_VAL_50_SV }, + { "60%", OPTION_VAL_60_SV }, + { "70%", OPTION_VAL_70_SV }, + { "80%", OPTION_VAL_80_SV }, + { "90%", OPTION_VAL_90_SV }, + { "100%", OPTION_VAL_100_O45_SV }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SR, + CORE_OPTION_NAME "_vmu2_screen_display", + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SV, NULL, "", NULL, @@ -60927,145 +72078,145 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SR, - NULL, - "", - NULL, - "vmu", - { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, - { NULL, NULL }, - }, - "Upper Left", - }, - { - CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SR, + CORE_OPTION_NAME "_vmu2_screen_position", + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SV, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SR }, - { "2x", OPTION_VAL_2_O27_SR }, - { "3x", OPTION_VAL_3X_SR }, - { "4x", OPTION_VAL_4_SR }, - { "5x", OPTION_VAL_5X_SR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, { NULL, NULL }, }, - "1x", + "Upper Right", }, { - CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SR, - NULL, - "", + CORE_OPTION_NAME "_vmu2_screen_size_mult", + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SV, NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_SV }, + { "2x", OPTION_VAL_2_O26_SV }, + { "3x", OPTION_VAL_3X_SV }, + { "4x", OPTION_VAL_4_SV }, + { "5x", OPTION_VAL_5X_SV }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu2_pixel_on_color", + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SR, + CORE_OPTION_NAME "_vmu2_pixel_off_color", + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SV, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { - CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SR, + CORE_OPTION_NAME "_vmu2_screen_opacity", + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SV, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SR }, - { "20%", OPTION_VAL_20_SR }, - { "30%", OPTION_VAL_30_SR }, - { "40%", OPTION_VAL_40_SR }, - { "50%", OPTION_VAL_50_SR }, - { "60%", OPTION_VAL_60_SR }, - { "70%", OPTION_VAL_70_SR }, - { "80%", OPTION_VAL_80_SR }, - { "90%", OPTION_VAL_90_SR }, - { "100%", OPTION_VAL_100_O57_SR }, + { "10%", OPTION_VAL_10_SV }, + { "20%", OPTION_VAL_20_SV }, + { "30%", OPTION_VAL_30_SV }, + { "40%", OPTION_VAL_40_SV }, + { "50%", OPTION_VAL_50_SV }, + { "60%", OPTION_VAL_60_SV }, + { "70%", OPTION_VAL_70_SV }, + { "80%", OPTION_VAL_80_SV }, + { "90%", OPTION_VAL_90_SV }, + { "100%", OPTION_VAL_100_O45_SV }, { NULL, NULL }, }, "100%", }, { - CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SR, + CORE_OPTION_NAME "_vmu3_screen_display", + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SV, NULL, "", NULL, @@ -61078,506 +72229,712 @@ struct retro_core_option_v2_definition option_defs_sr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SR, + CORE_OPTION_NAME "_vmu3_screen_position", + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SV, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { - CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SR, + CORE_OPTION_NAME "_vmu3_screen_size_mult", + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SV, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SR }, - { "2x", OPTION_VAL_2_O27_SR }, - { "3x", OPTION_VAL_3X_SR }, - { "4x", OPTION_VAL_4_SR }, - { "5x", OPTION_VAL_5X_SR }, + { "1x", OPTION_VAL_1X_SV }, + { "2x", OPTION_VAL_2_O26_SV }, + { "3x", OPTION_VAL_3X_SV }, + { "4x", OPTION_VAL_4_SV }, + { "5x", OPTION_VAL_5X_SV }, { NULL, NULL }, }, "1x", }, { - CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SR, + CORE_OPTION_NAME "_vmu3_pixel_on_color", + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SV, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SR }, - { "BLACK 02", OPTION_VAL_BLACK_02_SR }, - { "BLUE 03", OPTION_VAL_BLUE_SR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SR }, - { "GREEN 05", OPTION_VAL_GREEN_SR }, - { "CYAN 06", OPTION_VAL_CYAN_06_SR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SR }, - { "RED 11", OPTION_VAL_RED_SR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SR }, - { "GRAY 15", OPTION_VAL_GRAY_15_SR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SR }, - { "WHITE 28", OPTION_VAL_WHITE_SR }, - { NULL, NULL }, - }, - "DEFAULT_OFF 01", - }, - { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SR, + CORE_OPTION_NAME "_vmu3_pixel_off_color", + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SV, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SR }, - { "20%", OPTION_VAL_20_SR }, - { "30%", OPTION_VAL_30_SR }, - { "40%", OPTION_VAL_40_SR }, - { "50%", OPTION_VAL_50_SR }, - { "60%", OPTION_VAL_60_SR }, - { "70%", OPTION_VAL_70_SR }, - { "80%", OPTION_VAL_80_SR }, - { "90%", OPTION_VAL_90_SR }, - { "100%", OPTION_VAL_100_O57_SR }, - { NULL, NULL }, - }, - "100%", - }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_sr = { - option_cats_sr, - option_defs_sr -}; - -/* RETRO_LANGUAGE_SV */ - -#define CATEGORY_SYSTEM_LABEL_SV NULL -#define CATEGORY_SYSTEM_INFO_0_SV "Konfigurera region, språk, BIOS och grundläggande hårdvaruinställningar." -#define CATEGORY_VIDEO_LABEL_SV "Bild" -#define CATEGORY_VIDEO_INFO_0_SV "Konfigurera upplösning, oberoende transparens i ordning och visuella effektinställningar." -#define CATEGORY_PERFORMANCE_LABEL_SV "Prestanda" -#define CATEGORY_PERFORMANCE_INFO_0_SV "Konfigurera inställningar för trådad rendering och bildruteskippning." -#define CATEGORY_HACKS_LABEL_SV "Emuleringshackning" -#define CATEGORY_HACKS_INFO_0_SV "Konfigurera inställningar för widescreen-överskridanden, GD-ROM-laddningshastighet och texturrelaterade inställningar." -#define CATEGORY_INPUT_LABEL_SV "Inmatning" -#define CATEGORY_INPUT_INFO_0_SV "Konfigurera inställningar för spelkontrollern och ljuspistolen." -#define CATEGORY_VMU_LABEL_SV "Visuell minnesenhet" -#define CATEGORY_VMU_INFO_0_SV "Konfigurera per-spel VMU-sparfiler och inställningar för synlighet av VMU på skärmen." -#define CORE_OPTION_NAME_REGION_LABEL_SV NULL -#define OPTION_VAL_JAPAN_SV NULL -#define OPTION_VAL_USA_SV NULL -#define OPTION_VAL_EUROPE_SV "Europa" -#define OPTION_VAL_DEFAULT_SV "Standard" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_SV "Språk" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_SV "Ändrar språket som används av BIOS och av eventuella spel som innehåller flera språk." -#define OPTION_VAL_JAPANESE_SV "Japanska" -#define OPTION_VAL_ENGLISH_SV "Engelska" -#define OPTION_VAL_GERMAN_SV "Tyska" -#define OPTION_VAL_FRENCH_SV "Franska" -#define OPTION_VAL_SPANISH_SV "Spanska" -#define OPTION_VAL_ITALIAN_SV "Italienska" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_SV "HLE BIOS (Omstart krävs)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_SV "Tvingar användningen av BIOS för emulering på hög nivå." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SV "Starta i BIOS (Omstart krävs)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SV "Starta direkt i Dreamcast BIOS-menyn." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_SV "Aktivera DSP" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SV "Aktivera emulering av Dreamcasts ljud-DSP (digital signal processor). Förbättrar noggrannheten i genererat ljud, men ökar prestandakraven." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_SV "Tvinga Windows CE-läge" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SV "Aktivera fullständig emulering av MMU (Memory Management Unit) och andra inställningar för Windows CE-spel." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SV "Tillåt NAOMI tjänsteknappar" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SV "Aktiverar TJÄNST-knappen för NAOMI, för att komma åt kabinett inställningar." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SV "Ställ in NAOMI-spel till Free Play" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SV "Ändra spelets myntinställningar till free play." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_SV "Emulering av bredbandsadapter" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SV "Emulera bredbandsadaptern istället för modemet. (Omstart krävs)" -#define CORE_OPTION_NAME_UPNP_LABEL_SV "Aktivera UPnP" -#define CORE_OPTION_NAME_UPNP_INFO_0_SV "Använd UPnP för att automatiskt konfigurera din internetrouter för onlinespel." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SV "Intern upplösning" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SV "Ändra renderingsupplösning." -#define OPTION_VAL_320X240_SV NULL -#define OPTION_VAL_640X480_SV NULL -#define OPTION_VAL_800X600_SV NULL -#define OPTION_VAL_960X720_SV NULL -#define OPTION_VAL_1024X768_SV NULL -#define OPTION_VAL_1280X960_SV NULL -#define OPTION_VAL_1440X1080_SV NULL -#define OPTION_VAL_1600X1200_SV NULL -#define OPTION_VAL_1920X1440_SV NULL -#define OPTION_VAL_2560X1920_SV NULL -#define OPTION_VAL_2880X2160_SV NULL -#define OPTION_VAL_3200X2400_SV NULL -#define OPTION_VAL_3840X2880_SV NULL -#define OPTION_VAL_4480X3360_SV NULL -#define OPTION_VAL_5120X3840_SV NULL -#define OPTION_VAL_5760X4320_SV NULL -#define OPTION_VAL_6400X4800_SV NULL -#define OPTION_VAL_7040X5280_SV NULL -#define OPTION_VAL_7680X5760_SV NULL -#define OPTION_VAL_8320X6240_SV NULL -#define OPTION_VAL_8960X6720_SV NULL -#define OPTION_VAL_9600X7200_SV NULL -#define OPTION_VAL_10240X7680_SV NULL -#define OPTION_VAL_10880X8160_SV NULL -#define OPTION_VAL_11520X8640_SV NULL -#define OPTION_VAL_12160X9120_SV NULL -#define OPTION_VAL_12800X9600_SV NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_SV "Kabeltyp" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SV "Utgångssignalstyp. \"TV (Komposit)\" är den mest välkomna." -#define OPTION_VAL_VGA_SV NULL -#define OPTION_VAL_TV_RGB_SV NULL -#define OPTION_VAL_TV_COMPOSITE_SV "TV (Komposit)" -#define CORE_OPTION_NAME_BROADCAST_LABEL_SV "Sändningsstandard" -#define OPTION_VAL_NTSC_SV NULL -#define OPTION_VAL_PAL_SV "PAL (Världen)" -#define OPTION_VAL_PAL_N_SV NULL -#define OPTION_VAL_PAL_M_SV "PAL-M (Brasilien)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SV "Skärmorientering" -#define OPTION_VAL_HORIZONTAL_SV "Horisontell" -#define OPTION_VAL_VERTICAL_SV "Vertikal" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SV "Alfa sortering" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SV "Per Strip (snabbt, minst noggrant)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_SV "Per Triangel (Normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_SV "Per Pixel (noggrant, men långsammast)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SV "Storlek på ackumulerande pixelbuffert" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SV "Högre värden kan vara nödvändiga för att korrekt visa utdata i högre upplösningar." -#define OPTION_VAL_512MB_SV NULL -#define OPTION_VAL_1GB_SV NULL -#define OPTION_VAL_2GB_SV NULL -#define OPTION_VAL_4GB_SV NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_SV "Maximalt antal transparenta lager" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SV "Högre värden kan krävas för komplexa scener." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SV "Fullständig framebuffer-emulering" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SV "Aktivera fullständig framebuffer-emulering i VRAM. Detta är användbart för spel som läser eller skriver direkt till framebuffer i VRAM. När det är aktiverat tvingas intern upplösning till 640x480 och prestanda kan påverkas allvarligt." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SV "Aktivera RTT (Render To Texture) buffert" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SV "Kopiera renderade texturer tillbaka från GPU till VRAM. Denna inställning är normalt aktiverad för spel som kräver det. När den är aktiverad avaktiveras uppskalning av texturrendering och prestandan kan påverkas." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_SV NULL -#define CORE_OPTION_NAME_FOG_LABEL_SV "Dimeffekter" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SV "Volymjusterare" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SV "En Dreamcast GPU-funktion som vanligtvis används av spel för att rita objektsskuggor. Detta bör normalt vara aktiverat - prestandapåverkan är vanligtvis minimal till försumbar." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SV "Anisotropisk Filtering" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SV "Förbättrar kvaliteten på texturer på ytor som är i sneda betraktningsvinklar i förhållande till kameran. Högre värden kräver mer av GPU:n. Ändringar av denna inställning gäller endast efter omstart." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SV "Texturfiltrering" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SV "Texturfiltreringsläget som ska användas. Detta kan användas för att tvinga ett visst texturfiltreringsläge på alla texturer för att få en skarpare (eller slätare) utseende än standard. Värden som skiljer sig från standard kan orsaka olika renderingsproblem. Ändringar av denna inställning gäller endast efter omstart." -#define OPTION_VAL_1_SV "Tvinga Närmsta granne" -#define OPTION_VAL_2_SV "Tvinga Linjär" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SV "Fördröj bildrutebyte" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SV "Användbart för att undvika blinkande skärmar eller glitchiga videor. Rekommenderas inte på långsamma plattformar." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SV "Upptäck förändringar i bildfrekvensen" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SV "Meddela gränssnittet när den interna bildrutefrekvensen ändras (till exempel från 60 fps till 30 fps). Förbättrar taktningen av bildfrekvensen i spel som körs med en låst hastighet på 30 fps eller 20 fps, men bör vara inaktiverad för spel med upplåsta (ostadiga) bildrutefrekvenser (till exempel Ecco the Dolphin, Unreal Tournament). Observera!: Ej tillgänglig när \"Auto Skip Frame\" är aktiverad." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SV "PowerVR2 Efterbehandlingsfilter" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SV "Efterbehandla den renderade bilden för att simulera effekter som är specifika för PowerVR2 GPU:n och analoga videosignaler." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_SV "Texturuppskalning (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SV "Förbättrar handritade 2D-pixelgrafik. Ska endast användas med 2D-pixeliserade spel." -#define OPTION_VAL_2_O27_SV NULL -#define OPTION_VAL_4_SV NULL -#define OPTION_VAL_6_SV NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SV "Maximalt filtrerad storlek för texturuppskalning" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SV "Ursprunglig djupinterpolation" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SV "Hjälper till med texturkorruption och djupproblem på AMD-GPU:n. Kan även hjälpa Intel-GPU:n i vissa fall." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SV "Trådad rendering" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SV "Kör GPU och CPU på olika trådar. Starkt rekommenderat." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SV "Skippa bildrutor automatiskt" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SV "Hoppa automatiskt över bildrutor när emuleringen går långsamt. Observera!: Denna inställning gäller endast när \"Trådad Rendering\" är aktiverad." -#define OPTION_VAL_SOME_SV NULL -#define OPTION_VAL_MORE_SV "Maximalt" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SV "Bildruteskippning" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SV "Sätter antalet bildrutor att hoppa över mellan varje visad bildruta." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SV "Bredbildsfusk (Omstart krävs)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SV "Aktiverar fusk som gör det möjligt för vissa spel att visas i bredbildsformat." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SV "Bredbildshackning" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SV "Ritar geometrin utanför den normala 4:3 bildförhållandet. Kan leda till grafiska fel i de avslöjade områdena." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SV "GD-ROM Snabbladdning (felaktig)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SV "Ökar hastigheten på GD-ROM laddningen." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_SV NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_SV NULL -#define OPTION_VAL_100_SV NULL -#define OPTION_VAL_110_SV NULL -#define OPTION_VAL_120_SV NULL -#define OPTION_VAL_130_SV NULL -#define OPTION_VAL_140_SV NULL -#define OPTION_VAL_150_SV NULL -#define OPTION_VAL_160_SV NULL -#define OPTION_VAL_170_SV NULL -#define OPTION_VAL_180_SV NULL -#define OPTION_VAL_190_SV NULL -#define OPTION_VAL_200_SV NULL -#define OPTION_VAL_210_SV NULL -#define OPTION_VAL_220_SV NULL -#define OPTION_VAL_230_SV NULL -#define OPTION_VAL_240_SV NULL -#define OPTION_VAL_250_SV NULL -#define OPTION_VAL_260_SV NULL -#define OPTION_VAL_270_SV NULL -#define OPTION_VAL_280_SV NULL -#define OPTION_VAL_290_SV NULL -#define OPTION_VAL_300_SV NULL -#define OPTION_VAL_310_SV NULL -#define OPTION_VAL_320_SV NULL -#define OPTION_VAL_330_SV NULL -#define OPTION_VAL_340_SV NULL -#define OPTION_VAL_350_SV NULL -#define OPTION_VAL_360_SV NULL -#define OPTION_VAL_370_SV NULL -#define OPTION_VAL_380_SV NULL -#define OPTION_VAL_390_SV NULL -#define OPTION_VAL_400_SV NULL -#define OPTION_VAL_410_SV NULL -#define OPTION_VAL_420_SV NULL -#define OPTION_VAL_430_SV NULL -#define OPTION_VAL_440_SV NULL -#define OPTION_VAL_450_SV NULL -#define OPTION_VAL_460_SV NULL -#define OPTION_VAL_470_SV NULL -#define OPTION_VAL_480_SV NULL -#define OPTION_VAL_490_SV NULL -#define OPTION_VAL_500_SV NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SV "Ladda in anpassade texturer" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SV "Dumpa texturer" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SV "Analoga spakens dödzon" -#define OPTION_VAL_0_SV "0 %" -#define OPTION_VAL_5_SV "5 %" -#define OPTION_VAL_10_SV "10 %" -#define OPTION_VAL_15_SV "15 %" -#define OPTION_VAL_20_SV "20 %" -#define OPTION_VAL_25_SV "25 %" -#define OPTION_VAL_30_SV "30 %" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SV "Utlös dödzonen" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SV "Digitala utlösare" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SV "Purupuru Paketet/Vibrations Paketet" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SV "Gör det möjligt för kontrollern att vibrera med force feedback." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SV "Digitala utgångar för sändning" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SV "Sänd digitala utgångar och force-feedbackstatus på TCP-port 8000. Kompatibelt med MAME-alternativet \"-output network\"." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SV "Visa ljuspistolinställningar" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SV "Aktivera konfiguration av alternativ för ljuspistolens hårkors. OBS!: Snabbmenyn kan behöva aktiveras och avaktiveras för att denna inställning ska träda i kraft." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 1" -#define OPTION_VAL_WHITE_SV "Vit" -#define OPTION_VAL_RED_SV "Röd" -#define OPTION_VAL_GREEN_SV "Grön" -#define OPTION_VAL_BLUE_SV "Blå" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 2" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 3" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SV "Visa pistol hårkorset 4" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SV "Per-spel visningsminnesenheter/systemer (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SV "Per-spel VMU:er" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SV "Alla spel delar 4 sparade VMU-filer (A1, B1, C1, D1) som finns i RetroArchs systemkatalog när detta alternativ är inaktiverad. Inställningen 'VMU A1' skapar en unik VMU-fil 'A1' i RetroArchs sparakatalog för varje spel som startas. Inställningen \"Alla VMU-enheter\" skapar 4 unika VMU-filer (A1, B1, C1, D1) för varje spel som startas." -#define OPTION_VAL_VMU_A1_SV NULL -#define OPTION_VAL_ALL_VMUS_SV "Alla VMU:er" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_SV NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SV NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_SV NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SV "Visa inställningar för visuell minnesenhet/system (VMU) skärm" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SV "Visa VMU-skärminställningar" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SV "Möjliggör konfiguration av emulerad VMU LCD-skärmens synlighet, storlek, position och färg. OBS!: Snabbmenyn kan behöva aktiveras/dras fram för att den här inställningen ska träda i kraft." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 1" -#define OPTION_VAL_UPPER_LEFT_SV "Uppe till vänster" -#define OPTION_VAL_UPPER_RIGHT_SV "Uppe till höger" -#define OPTION_VAL_LOWER_LEFT_SV "Nere till vänster" -#define OPTION_VAL_LOWER_RIGHT_SV "Nere till höger" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SV "Storleken för VMU skärm 1" -#define OPTION_VAL_1X_SV NULL -#define OPTION_VAL_3X_SV NULL -#define OPTION_VAL_5X_SV NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SV "Aktivera pixelfärg på VMU skärm 1" -#define OPTION_VAL_DEFAULT_ON_00_SV "Standard PÅ" -#define OPTION_VAL_DEFAULT_OFF_01_SV "Standard AV" -#define OPTION_VAL_BLACK_02_SV "Svart" -#define OPTION_VAL_LIGHT_BLUE_04_SV "Ljusblå" -#define OPTION_VAL_CYAN_06_SV NULL -#define OPTION_VAL_CYAN_BLUE_07_SV "Cyanblå" -#define OPTION_VAL_LIGHT_GREEN_08_SV "Ljusgrön" -#define OPTION_VAL_CYAN_GREEN_09_SV "Cyangrön" -#define OPTION_VAL_LIGHT_CYAN_10_SV "Ljuscyan" -#define OPTION_VAL_PURPLE_12_SV "Lila" -#define OPTION_VAL_LIGHT_PURPLE_13_SV "Ljuslila" -#define OPTION_VAL_YELLOW_14_SV "Gul" -#define OPTION_VAL_GRAY_15_SV "Grå" -#define OPTION_VAL_LIGHT_PURPLE_2_16_SV "Ljuslila (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_SV "Ljusgrön (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_SV "Ljusgrön (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_SV "Ljuscyan (2)" -#define OPTION_VAL_LIGHT_RED_2_20_SV "Ljusröd (2)" -#define OPTION_VAL_MAGENTA_21_SV NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_SV "Ljuslila (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_SV "Ljusorange" -#define OPTION_VAL_ORANGE_24_SV NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_SV "Ljuslila (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_SV "Ljusgul" -#define OPTION_VAL_LIGHT_YELLOW_2_27_SV "Ljusgul (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SV "Avaktivera pixelfärg på VMU skärm 1" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SV "Opaciteten för VMU Skärm 1" -#define OPTION_VAL_40_SV "40 %" -#define OPTION_VAL_50_SV "50 %" -#define OPTION_VAL_60_SV "60 %" -#define OPTION_VAL_70_SV "70 %" -#define OPTION_VAL_80_SV "80 %" -#define OPTION_VAL_90_SV "90 %" -#define OPTION_VAL_100_O57_SV "100 %" -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SV "Visa VMU Skärm 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 1" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SV "Storleken för VMU skärm 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SV "Aktivera pixelfärg på VMU skärm 2" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SV "Avaktivera pixelfärg på VMU skärm 2" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SV "Opaciteten för VMU Skärm 2" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SV "Storleken för VMU skärm 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SV "Aktivera pixelfärg på VMU skärm 3" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SV "Avaktivera pixelfärg på VMU skärm 3" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SV "Opaciteten för VMU Skärm 3" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SV "Visa VMU skärm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SV "Positionen för VMU skärm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SV "Storleken för VMU skärm 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SV "Aktivera pixelfärg på VMU skärm 4" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SV "Avaktivera pixelfärg på VMU skärm 4" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SV "Opaciteten för VMU Skärm 4" + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu3_screen_opacity", + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_SV }, + { "20%", OPTION_VAL_20_SV }, + { "30%", OPTION_VAL_30_SV }, + { "40%", OPTION_VAL_40_SV }, + { "50%", OPTION_VAL_50_SV }, + { "60%", OPTION_VAL_60_SV }, + { "70%", OPTION_VAL_70_SV }, + { "80%", OPTION_VAL_80_SV }, + { "90%", OPTION_VAL_90_SV }, + { "100%", OPTION_VAL_100_O45_SV }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_vmu4_screen_display", + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_vmu4_screen_position", + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, + { NULL, NULL }, + }, + "Lower Right", + }, + { + CORE_OPTION_NAME "_vmu4_screen_size_mult", + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "1x", OPTION_VAL_1X_SV }, + { "2x", OPTION_VAL_2_O26_SV }, + { "3x", OPTION_VAL_3X_SV }, + { "4x", OPTION_VAL_4_SV }, + { "5x", OPTION_VAL_5X_SV }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_on_color", + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, + { "BLACK 02", OPTION_VAL_BLACK_02_SV }, + { "BLUE 03", OPTION_VAL_BLUE_SV }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, + { "GREEN 05", OPTION_VAL_GREEN_SV }, + { "CYAN 06", OPTION_VAL_CYAN_06_SV }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, + { "RED 11", OPTION_VAL_RED_SV }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, + { "GRAY 15", OPTION_VAL_GRAY_15_SV }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, + { "WHITE 28", OPTION_VAL_WHITE_SV }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SV, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_SV }, + { "20%", OPTION_VAL_20_SV }, + { "30%", OPTION_VAL_30_SV }, + { "40%", OPTION_VAL_40_SV }, + { "50%", OPTION_VAL_50_SV }, + { "60%", OPTION_VAL_60_SV }, + { "70%", OPTION_VAL_70_SV }, + { "80%", OPTION_VAL_80_SV }, + { "90%", OPTION_VAL_90_SV }, + { "100%", OPTION_VAL_100_O45_SV }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_sv = { + option_cats_sv, + option_defs_sv +}; -struct retro_core_option_v2_category option_cats_sv[] = { +/* RETRO_LANGUAGE_TR */ + +#define CATEGORY_SYSTEM_LABEL_TR "Sistem" +#define CATEGORY_SYSTEM_INFO_0_TR "Bölge, dil, BIOS ve temel donanım ayarlarını yapılandırın." +#define CATEGORY_VIDEO_LABEL_TR NULL +#define CATEGORY_VIDEO_INFO_0_TR "Çözünürlüğü, istenenden bağımsız şeffaflığı ve görsel efekt ayarlarını yapılandırın." +#define CATEGORY_PERFORMANCE_LABEL_TR "Performans" +#define CATEGORY_PERFORMANCE_INFO_0_TR "Zorlu işleme ve kare atlama ayarlarını yapılandırın." +#define CATEGORY_HACKS_LABEL_TR "Emülatör Geliştirmeleri" +#define CATEGORY_HACKS_INFO_0_TR "Geniş ekran geçersiz kılmaları, GD-ROM yükleme hızı ve doku değiştirme ayarlarını yapılandırın." +#define CATEGORY_INPUT_LABEL_TR "Girdi" +#define CATEGORY_INPUT_INFO_0_TR "Oyun kolu ve light gun ayarlarını yapılandırın." +#define CATEGORY_EXPANSIONS_LABEL_TR "Kontrolcü Genişletme Yuvaları" +#define CATEGORY_EXPANSIONS_INFO_0_TR "Her denetleyici genişletme yuvasına takılı cihazı (VMU, titreşim cihazı) seçin." +#define CATEGORY_VMU_LABEL_TR "Görsel Bellek Birimi" +#define CATEGORY_VMU_INFO_0_TR "Oyun başına VMU kayıt dosyaları ve ekrandaki VMU görünürlük ayarlarını yapılandırın." +#define CORE_OPTION_NAME_REGION_LABEL_TR "Bölge" +#define OPTION_VAL_JAPAN_TR "Japonya" +#define OPTION_VAL_USA_TR "ABD" +#define OPTION_VAL_EUROPE_TR "Avrupa" +#define OPTION_VAL_DEFAULT_TR "Varsayılan" +#define CORE_OPTION_NAME_LANGUAGE_LABEL_TR "Dil" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_TR "BIOS ve birden çok dil içeren oyunlar tarafından kullanılan dili değiştirir." +#define OPTION_VAL_JAPANESE_TR "Japonca" +#define OPTION_VAL_ENGLISH_TR "İngilizce" +#define OPTION_VAL_GERMAN_TR "Almanca" +#define OPTION_VAL_FRENCH_TR "Fransızca" +#define OPTION_VAL_SPANISH_TR "İspanyolca" +#define OPTION_VAL_ITALIAN_TR "İtalyanca" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_TR "HLE BIOS (Yeniden Başlatılmalı)" +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_TR "Yüksek seviyeli taklit BIOS kullanımını zorunlu kılın." +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TR "BIOS Önyükleme (Yeniden Başlatılmalı)" +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TR "Doğrudan Dreamcast BIOS menüsüne önyükleme yapın." +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_TR "DSP'yi Etkinleştir" +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TR "Dreamcast ses DSP (dijital sinyal işlemcisi) taklidini etkinleştirin. Üretilen sesin doğruluğunu artırır, ancak performans gereksinimlerini artırır." +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TR "Kabin Hizmet Düğmelerine İzin Ver" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TR "Atari salonu oyunlarının kabin ayarlarına girmek üzere SERVİS düğmesini etkinleştirir." +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TR "NAOMI Oyunlarını Serbest Oynamaya Ayarlayın" +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TR "Serbest oynamak için oyunun jeton ayarlarını değiştirin." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_TR "Geniş Bant Adaptör Taklidi" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TR "Modem yerine ethernet geniş bant adaptörünü taklit edin. (Yeniden Başlatılmalı)" +#define CORE_OPTION_NAME_UPNP_LABEL_TR "UPnP Etkinleştir" +#define CORE_OPTION_NAME_UPNP_INFO_0_TR "İnternet yönlendiricinizi çevrimiçi oyunlar için otomatik olarak yapılandırmak üzere UPnP kullanın." +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TR "Dahili Çözünürlük" +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TR "İşleme çözünürlüğünü değiştirin." +#define OPTION_VAL_320X240_TR "320x240 (Yarım)" +#define OPTION_VAL_640X480_TR "640x480 (Doğal)" +#define OPTION_VAL_800X600_TR NULL +#define OPTION_VAL_960X720_TR NULL +#define OPTION_VAL_1024X768_TR NULL +#define OPTION_VAL_1280X960_TR NULL +#define OPTION_VAL_1440X1080_TR NULL +#define OPTION_VAL_1600X1200_TR NULL +#define OPTION_VAL_1920X1440_TR NULL +#define OPTION_VAL_2560X1920_TR NULL +#define OPTION_VAL_2880X2160_TR NULL +#define OPTION_VAL_3200X2400_TR NULL +#define OPTION_VAL_3840X2880_TR NULL +#define OPTION_VAL_4480X3360_TR NULL +#define OPTION_VAL_5120X3840_TR NULL +#define OPTION_VAL_5760X4320_TR NULL +#define OPTION_VAL_6400X4800_TR NULL +#define OPTION_VAL_7040X5280_TR NULL +#define OPTION_VAL_7680X5760_TR NULL +#define OPTION_VAL_8320X6240_TR NULL +#define OPTION_VAL_8960X6720_TR NULL +#define OPTION_VAL_9600X7200_TR NULL +#define OPTION_VAL_10240X7680_TR NULL +#define OPTION_VAL_10880X8160_TR NULL +#define OPTION_VAL_11520X8640_TR NULL +#define OPTION_VAL_12160X9120_TR NULL +#define OPTION_VAL_12800X9600_TR NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_TR "Kablo Tipi" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TR "Çıkış sinyali türü. 'TV (Kompozit)' en yaygın olarak desteklenendir." +#define OPTION_VAL_VGA_TR NULL +#define OPTION_VAL_TV_RGB_TR NULL +#define OPTION_VAL_TV_COMPOSITE_TR NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_TR "Standart Yayın" +#define OPTION_VAL_NTSC_TR NULL +#define OPTION_VAL_PAL_TR "PAL (Dünya)" +#define OPTION_VAL_PAL_N_TR "PAL-N (Arjantin, Paraguay, Uruguay)" +#define OPTION_VAL_PAL_M_TR "PAL-M (Brezilya)" +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TR "Ekran Yönü" +#define OPTION_VAL_HORIZONTAL_TR "Yatay" +#define OPTION_VAL_VERTICAL_TR "Dikey" +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TR "Alfabetik Sıralama" +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_TR "Saydam çokgenlerin nasıl sıralanacağını seçin." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TR "Şerit Başına (hızlı, en az doğru)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_TR "Üçgen Başına (normal)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_TR "Piksel Başına (doğru, ancak en yavaş)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TR "Toplama Piksel Tampon Boyutu" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TR "Daha yüksek çözünürlüklerin doğru çıktı alması için daha yüksek değerler gerekebilir." +#define OPTION_VAL_512MB_TR NULL +#define OPTION_VAL_1GB_TR NULL +#define OPTION_VAL_2GB_TR NULL +#define OPTION_VAL_4GB_TR NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_TR "En Fazla Şeffaf Katman" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TR "Karmaşık sahneler için daha yüksek değerler gerekebilir." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TR "Tam kare önbellek taklidi" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TR "VRAM üstünde tam kare önbellek taklidini etkinleştirin. Kare önbelleğini doğrudan VRAM üstünden okuyan veya yazan oyunlar için kullanışlıdır. Etkinleştirildiğinde, Dahili Çözünürlük 640x480 olarak zorlanır ve performans ciddi şekilde etkilenebilir." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TR "RTT (Dokuya Dönüştür) Önbelleğini Etkinleştir" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TR "İşlenen dokuları GPU'dan VRAM'e geri kopyalayın. Bu seçenek normalde bunu gerektiren oyunlar için etkinleştirilir. Etkinleştirildiğinde, doku işleme yükseltme devre dışı bırakılır ve performans etkilenebilir." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_TR "Görüş Açısı" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_TR "Etkinleştirilen dokular daha uzakta göründüklerinde kendilerinin daha küçük benzerlerini kullanacakları zaman performansları artırabilir ve parıltıyı azaltabilirler." +#define CORE_OPTION_NAME_FOG_LABEL_TR "Sis Efektleri" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TR "Hacim Değiştirici" +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TR "Genellikle oyunlar tarafından nesne gölgeleri çizmek için kullanılan bir Dreamcast GPU özelliği. Bu normalde etkinleştirilmelidir - performansa olumsuz etkisi yok denilebilecek düzeydedir." +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TR "Eşyönsüz Filtreleme" +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TR "Kameraya göre eğik görüş açılarında olan yüzeylerdeki dokuların kalitesini iyileştirin. Daha yüksek değerler GPU'da daha fazla talepkardır. Bu ayarda yapılan değişiklikler yalnızca yeniden başlatmanın ardından geçerlidir." +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TR "Doku Filtreleme" +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TR "Kullanılacak doku filtreleme kipi. Bu, Varsayılan'dan daha net (veya pürüzsüz) bir görünüm elde etmek için tüm dokularda belirli bir doku filtreleme kipini zorlamak için kullanılabilir. Varsayılan dışındaki değerler, çeşitli işleme sorunlarına neden olabilir. Bu ayarda yapılan değişiklikler yalnızca yeniden başlatmanın ardından geçerlidir." +#define OPTION_VAL_1_TR "En Yakına Zorla" +#define OPTION_VAL_2_TR "Doğrusala Zorla" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TR "Gecikmeli Kare Değişimi" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TR "Yanıp sönen ekranlardan veya sorunlu videolardan kaçınmak için kullanışlıdır. Yavaş platformlarda önerilmez." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TR "Kare Hızı Değişikliklerini Algıla" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TR "Dahili kare hızı değiştiğinde (örneğin, 60 fps'den 30 fps'ye) ön ucu bilgilendirin. Kilitli 30 fps veya 20 fps'de çalışan oyunlarda kare hızını iyileştirir, ancak kilitlenmemiş (dengesiz) kare hızlarına sahip oyunlar için devre dışı bırakılması gerekir (örn. Ecco the Dolphin, Unreal Tournament). Not: 'Otomatik Kare Atla' etkinleştirildiğinde kullanılamaz." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TR "PowerVR2 Rötuş Filtresi" +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TR "PowerVR2 GPU'ya ve analog video sinyallerine özgü efektleri simüle etmek için işlenen görüntüyü son işlemden geçirin." +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_TR "Doku Yükseltme (xBRZ)" +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TR "Elle çizilmiş 2B piksel sanatsal grafiklerini geliştirin. Yalnızca 2D piksel oyunlarla kullanılmalıdır." +#define OPTION_VAL_2_O26_TR NULL +#define OPTION_VAL_4_TR NULL +#define OPTION_VAL_6_TR NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TR "Doku Yükseltme Azami Filtre Boyutu" +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_TR "Yükseltilecek doku için azami boyut değerini seçin; eğer doku boyutu seçilen değerden yüksekse büyütülmeyecektir." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TR "Yerel Derinlik Enterpolasyonu" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TR "AMD GPU'larda doku bozulması ve derinlik sorunlarına yardımcı olur. Bazı durumlarda Intel GPU'lara da yardımcı olabilir." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_TR "Yükseltirken Doku Kenarlarını Düzelt" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_TR "Yükseltme işleminde doku bozulması durumunda yardımcı olur. Bunu devre dışı bırakmak, 2D oyunlarda (MVC2, CVS, KOF, vb.) yükseltme sırasında piksellerin çarpık olması durumunda yardımcı olabilir" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TR "Zorlu İşleme" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TR "GPU ve CPU'yu farklı iş parçacıklarında çalıştırır. Şiddetle tavsiye edilir." +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TR "Kareyi Otomatik Atla" +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TR "Emulatör yavaş çalışırken kareleri otomatik olarak atlayın. Not: Bu ayar yalnızca 'Zorlu İşleme' etkinleştirildiğinde geçerlidir." +#define OPTION_VAL_SOME_TR NULL +#define OPTION_VAL_MORE_TR "Azami" +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TR "Kare Atlama" +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TR "Görüntülenen her kare arasında atlanacak kare sayısını ayarlar." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TR "Geniş Ekran Hileleri (Yeniden Başlatılmalı)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TR "Belirli oyunların geniş ekran biçiminde görüntülenmesine izin veren hileleri etkinleştirir." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TR "Geniş Ekran Geliştirmesi" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TR "Normal 4:3 en boy oranının dışına geometri çizin. Ortaya çıkan alanlarda grafiksel hatalara neden olabilir." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TR "GDROM Hızlı Yükleme (kusurlu)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TR "GD-ROM yüklemesini hızlandırır." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_TR "Dreamcast 32MB RAM Modu" +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_TR "Dreamcast için 32 MB RAM Modunu etkinleştirir. Uyumluluğu etkileyebilir" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_TR "SH4 CPU düşük/hız aşırtması" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_TR "SH4 ana CPU saatini varsayılan 200 MHz değerinden değiştirin. Hız aşırtması platformların yavaşlamasına yardımcı olabilir. Hız aşırtma bazı oyunlarda kare hızını artırabilir. Dikkatle kullanın." +#define OPTION_VAL_100_TR NULL +#define OPTION_VAL_110_TR NULL +#define OPTION_VAL_120_TR NULL +#define OPTION_VAL_130_TR NULL +#define OPTION_VAL_140_TR NULL +#define OPTION_VAL_150_TR NULL +#define OPTION_VAL_160_TR NULL +#define OPTION_VAL_170_TR NULL +#define OPTION_VAL_180_TR NULL +#define OPTION_VAL_190_TR NULL +#define OPTION_VAL_200_TR NULL +#define OPTION_VAL_210_TR NULL +#define OPTION_VAL_220_TR NULL +#define OPTION_VAL_230_TR NULL +#define OPTION_VAL_240_TR NULL +#define OPTION_VAL_250_TR NULL +#define OPTION_VAL_260_TR NULL +#define OPTION_VAL_270_TR NULL +#define OPTION_VAL_280_TR NULL +#define OPTION_VAL_290_TR NULL +#define OPTION_VAL_300_TR NULL +#define OPTION_VAL_310_TR NULL +#define OPTION_VAL_320_TR NULL +#define OPTION_VAL_330_TR NULL +#define OPTION_VAL_340_TR NULL +#define OPTION_VAL_350_TR NULL +#define OPTION_VAL_360_TR NULL +#define OPTION_VAL_370_TR NULL +#define OPTION_VAL_380_TR NULL +#define OPTION_VAL_390_TR NULL +#define OPTION_VAL_400_TR NULL +#define OPTION_VAL_410_TR NULL +#define OPTION_VAL_420_TR NULL +#define OPTION_VAL_430_TR NULL +#define OPTION_VAL_440_TR NULL +#define OPTION_VAL_450_TR NULL +#define OPTION_VAL_460_TR NULL +#define OPTION_VAL_470_TR NULL +#define OPTION_VAL_480_TR NULL +#define OPTION_VAL_490_TR NULL +#define OPTION_VAL_500_TR NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TR "Özel Dokular Yükle" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_TR "'system/dc/textures//' klasöründe bulunan özel dokuları yükleyin." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TR "Dokuları Sakla" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_TR "Oyun tarafından her yeni doku kullanıldığında, 'system/dc/texdump//' klasörüne .png dosyası olarak kaydedilecektir." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TR "Analog Çubuğu Ölü Bölge" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_TR "İşlenmeye başlamadan önce analog çubuğu ne kadar itmeniz gerektiğini seçin." +#define OPTION_VAL_0_TR "%0" +#define OPTION_VAL_5_TR "%5" +#define OPTION_VAL_10_TR "%10" +#define OPTION_VAL_15_TR "%15" +#define OPTION_VAL_20_TR "%20" +#define OPTION_VAL_25_TR "%25" +#define OPTION_VAL_30_TR "%30" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TR "Tetik Ölü Bölge" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_TR "İşlenmeye başlamadan önce tetiğe ne kadar basmanız gerektiğini seçin." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TR "Dijital Tetikleyiciler" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_TR "Etkinleştirildiğinde, tetikleyiciler normal düğmeler gibi davranacak, yani tamamen basılmış veya hiç basılmamış olarak, arada bir şey olmadan işlenecekler." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TR "Yayın Dijital Çıkışları" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TR "TCP port 8000'de dijital çıkışları ve zorla geri bildirim durumunu yayınlayın. \"-output network\" MAME seçeneğiyle uyumludur." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TR "Light Gun Ayarlarını Göster" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TR "Light gun artı gösterge seçeneklerinin yapılandırılmasını etkinleştirin. NOT: Bu ayarın etkili olması için Hızlı Menü'nün değiştirilmesi gerekebilir." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_TR "Silah Nişangah Boyut Ölçeği" +#define OPTION_VAL_50_TR "%50" +#define OPTION_VAL_60_TR "%60" +#define OPTION_VAL_70_TR "%70" +#define OPTION_VAL_80_TR "%80" +#define OPTION_VAL_90_TR "%90" +#define OPTION_VAL_100_O45_TR "%100" +#define OPTION_VAL_110_O45_TR "%110" +#define OPTION_VAL_120_O45_TR "%120" +#define OPTION_VAL_130_O45_TR "%130" +#define OPTION_VAL_140_O45_TR "%140" +#define OPTION_VAL_150_O45_TR "%150" +#define OPTION_VAL_160_O45_TR "%160" +#define OPTION_VAL_170_O45_TR "%170" +#define OPTION_VAL_180_O45_TR "%180" +#define OPTION_VAL_190_O45_TR "%190" +#define OPTION_VAL_200_O45_TR "%200" +#define OPTION_VAL_210_O45_TR "%210" +#define OPTION_VAL_220_O45_TR "%220" +#define OPTION_VAL_230_O45_TR "%230" +#define OPTION_VAL_240_O45_TR "%240" +#define OPTION_VAL_250_O45_TR "%250" +#define OPTION_VAL_260_O45_TR "%260" +#define OPTION_VAL_270_O45_TR "%270" +#define OPTION_VAL_280_O45_TR "%280" +#define OPTION_VAL_290_O45_TR "%290" +#define OPTION_VAL_300_O45_TR "%300" +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 1 Görüntüle" +#define OPTION_VAL_WHITE_TR "Beyaz" +#define OPTION_VAL_RED_TR "Kırmızı" +#define OPTION_VAL_GREEN_TR "Yeşil" +#define OPTION_VAL_BLUE_TR "Mavi" +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 2 Görüntüle" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 3 Görüntüle" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 4 Görüntüle" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_TR "Genişletme Yuvası Cihaz A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_TR "Genişletme yuvası A1 için takılı cihazı seçin (port A yuva 1)." +#define OPTION_VAL_VMU_TR NULL +#define OPTION_VAL_PURUPURU_TR "Titreşim Paketi" +#define OPTION_VAL_NONE_TR "Yok" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_TR "Genişletme Yuvası Cihaz A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_TR "Genişletme yuvası A2 için takılı cihazı seçin (port A yuva 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_TR "Genişletme Yuvası Cihaz B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_TR "Genişletme yuvası B1 için takılı cihazı seçin (port B yuva 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_TR "Genişletme Yuvası Cihaz B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_TR "Genişletme yuvası B2 için takılı cihazı seçin (port B yuva 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_TR "Genişletme Yuvası Cihaz C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_TR "Genişletme yuvası C1 için takılı cihazı seçin (port C yuva 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_TR "Genişletme Yuvası Cihaz C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_TR "Genişletme yuvası C2 için takılı cihazı seçin (port C yuva 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_TR "Genişletme Yuvası Cihaz D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_TR "Genişletme yuvası D1 için takılı cihazı seçin (port D yuva 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_TR "Genişletme Yuvası Cihaz D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_TR "Genişletme yuvası D2 için takılı cihazı seçin (port D yuva 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TR "Oyun Başına Görsel Bellek Birimleri/Sistemleri (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TR "Oyun Başına VMU" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TR "Devre dışı bırakıldığında, tüm oyunlar RetroArch sistem klasöründe bulunan en fazla 8 VMU kayıt dosyasını (A1/A2/B1/B2/C1/C2/D1/D2) paylaşır.\n'VMU A1' ayarı, başlatılan her oyun için RetroArch kayıt klasörüne benzersiz bir VMU 'A1' dosyası oluşturur.\n'Tüm VMU'' ayarları, başlatılan her oyun için en fazla 8 benzersiz VMU dosyası (A1/A2/B1/B2/C1/C2/D1/D2) oluşturur." +#define OPTION_VAL_VMU_A1_TR NULL +#define OPTION_VAL_ALL_VMUS_TR "Tüm VMU" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_TR "Görsel Bellek Birimleri/Sistemleri (VMU) Sesleri" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TR "VMU Sesleri" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_TR "Etkinleştirildiğinde VMU bip sesleri oynatılır." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TR "Görsel Bellek Birimi/Sistem (VMU) Görüntü Ayarlarını Göster" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TR "VMU Görüntü Ayarlarını Göster" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TR "Taklit edilmiş VMU LCD ekran görünürlüğünün, boyutunun, konumunun ve renginin yapılandırılmasını etkinleştirin. NOT: Bu ayarın etkili olması için Hızlı Menü'nün değiştirilmesi gerekebilir." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 1 Görüntüle" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TR "VMU Ekranı 1 Pozisyon" +#define OPTION_VAL_UPPER_LEFT_TR "Sol Üst" +#define OPTION_VAL_UPPER_RIGHT_TR "Sağ Üst" +#define OPTION_VAL_LOWER_LEFT_TR "Sol Alt" +#define OPTION_VAL_LOWER_RIGHT_TR "Sağ Alt" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 1 Boyutu" +#define OPTION_VAL_1X_TR NULL +#define OPTION_VAL_3X_TR NULL +#define OPTION_VAL_5X_TR NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 1 Piksel Açık Renkli" +#define OPTION_VAL_DEFAULT_ON_00_TR "Varsayılan AÇIK" +#define OPTION_VAL_DEFAULT_OFF_01_TR "Varsayılan KAPALI" +#define OPTION_VAL_BLACK_02_TR "Siyah" +#define OPTION_VAL_LIGHT_BLUE_04_TR "Açık Mavi" +#define OPTION_VAL_CYAN_06_TR "Camgöbeği" +#define OPTION_VAL_CYAN_BLUE_07_TR "Camgöbeği Mavi" +#define OPTION_VAL_LIGHT_GREEN_08_TR "Açık Yeşil" +#define OPTION_VAL_CYAN_GREEN_09_TR "Camgöbeği Yeşil" +#define OPTION_VAL_LIGHT_CYAN_10_TR "Açık Camgöbeği" +#define OPTION_VAL_PURPLE_12_TR "Mor" +#define OPTION_VAL_LIGHT_PURPLE_13_TR "Açık Mor" +#define OPTION_VAL_YELLOW_14_TR "Sarı" +#define OPTION_VAL_GRAY_15_TR "Gri" +#define OPTION_VAL_LIGHT_PURPLE_2_16_TR "Açık Mor (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_TR "Açık Yeşil (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_TR "Açık Yeşil (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_TR "Açık Camgöbeği (2)" +#define OPTION_VAL_LIGHT_RED_2_20_TR "Açık Kırmızı (2)" +#define OPTION_VAL_MAGENTA_21_TR "Eflatun" +#define OPTION_VAL_LIGHT_PURPLE_3_22_TR "Açık Mor (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_TR "Açık Turuncu" +#define OPTION_VAL_ORANGE_24_TR "Turuncu" +#define OPTION_VAL_LIGHT_PURPLE_4_25_TR "Açık Mor (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_TR "Açık Sarı" +#define OPTION_VAL_LIGHT_YELLOW_2_27_TR "Açık Sarı (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 1 Piksel Kapalı Renk" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 1 Şeffaflığı" +#define OPTION_VAL_40_TR "%40" +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 2 Görüntüle" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TR "VMU Ekranı 2 Pozisyon" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 2 Boyut" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 2 Piksel Açık Renkli" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 2 Piksel Kapalı Renk" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 2 Şeffaflığı" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 3 Görüntüle" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TR "VMU Ekranı 3 Pozisyon" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 3 Boyut" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 3 Piksel Açık Renkli" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 3 Piksel Kapalı Renk" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 3 Şeffaflığı" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 4 Görüntüle" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TR "VMU Ekranı 4 Pozisyon" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 4 Boyut" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 4 Piksel Açık Renkli" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 4 Piksel Kapalı Renk" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 4 Şeffaflığı" + +struct retro_core_option_v2_category option_cats_tr[] = { { "system", - CATEGORY_SYSTEM_LABEL_SV, - CATEGORY_SYSTEM_INFO_0_SV + CATEGORY_SYSTEM_LABEL_TR, + CATEGORY_SYSTEM_INFO_0_TR }, { "video", - CATEGORY_VIDEO_LABEL_SV, - CATEGORY_VIDEO_INFO_0_SV + CATEGORY_VIDEO_LABEL_TR, + CATEGORY_VIDEO_INFO_0_TR }, { "performance", - CATEGORY_PERFORMANCE_LABEL_SV, - CATEGORY_PERFORMANCE_INFO_0_SV + CATEGORY_PERFORMANCE_LABEL_TR, + CATEGORY_PERFORMANCE_INFO_0_TR }, { "hacks", - CATEGORY_HACKS_LABEL_SV, - CATEGORY_HACKS_INFO_0_SV + CATEGORY_HACKS_LABEL_TR, + CATEGORY_HACKS_INFO_0_TR }, { "input", - CATEGORY_INPUT_LABEL_SV, - CATEGORY_INPUT_INFO_0_SV + CATEGORY_INPUT_LABEL_TR, + CATEGORY_INPUT_INFO_0_TR + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_TR, + CATEGORY_EXPANSIONS_INFO_0_TR }, { "vmu", - CATEGORY_VMU_LABEL_SV, - CATEGORY_VMU_INFO_0_SV + CATEGORY_VMU_LABEL_TR, + CATEGORY_VMU_INFO_0_TR }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_sv[] = { +struct retro_core_option_v2_definition option_defs_tr[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_SV, + CORE_OPTION_NAME_REGION_LABEL_TR, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_SV }, - { "USA", OPTION_VAL_USA_SV }, - { "Europe", OPTION_VAL_EUROPE_SV }, - { "Default", OPTION_VAL_DEFAULT_SV }, + { "Japan", OPTION_VAL_JAPAN_TR }, + { "USA", OPTION_VAL_USA_TR }, + { "Europe", OPTION_VAL_EUROPE_TR }, + { "Default", OPTION_VAL_DEFAULT_TR }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_SV, + CORE_OPTION_NAME_LANGUAGE_LABEL_TR, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_SV, + CORE_OPTION_NAME_LANGUAGE_INFO_0_TR, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_SV }, - { "English", OPTION_VAL_ENGLISH_SV }, - { "German", OPTION_VAL_GERMAN_SV }, - { "French", OPTION_VAL_FRENCH_SV }, - { "Spanish", OPTION_VAL_SPANISH_SV }, - { "Italian", OPTION_VAL_ITALIAN_SV }, - { "Default", OPTION_VAL_DEFAULT_SV }, + { "Japanese", OPTION_VAL_JAPANESE_TR }, + { "English", OPTION_VAL_ENGLISH_TR }, + { "German", OPTION_VAL_GERMAN_TR }, + { "French", OPTION_VAL_FRENCH_TR }, + { "Spanish", OPTION_VAL_SPANISH_TR }, + { "Italian", OPTION_VAL_ITALIAN_TR }, + { "Default", OPTION_VAL_DEFAULT_TR }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_SV, + CORE_OPTION_NAME_HLE_BIOS_LABEL_TR, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_SV, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_TR, NULL, "system", { @@ -61589,9 +72946,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_SV, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TR, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_SV, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TR, NULL, "system", { @@ -61603,9 +72960,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_SV, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_TR, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_SV, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TR, NULL, "system", { @@ -61619,25 +72976,11 @@ struct retro_core_option_v2_definition option_defs_sv[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_SV, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_SV, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_SV, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TR, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_SV, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TR, NULL, "system", { @@ -61649,9 +72992,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_SV, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TR, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_SV, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TR, NULL, "system", { @@ -61663,9 +73006,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_SV, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_TR, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_SV, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TR, NULL, "system", { @@ -61677,9 +73020,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_SV, + CORE_OPTION_NAME_UPNP_LABEL_TR, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_SV, + CORE_OPTION_NAME_UPNP_INFO_0_TR, NULL, "system", { @@ -61692,39 +73035,39 @@ struct retro_core_option_v2_definition option_defs_sv[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_SV, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TR, NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_SV, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TR, NULL, "video", { - { "320x240", OPTION_VAL_320X240_SV }, - { "640x480", OPTION_VAL_640X480_SV }, - { "800x600", OPTION_VAL_800X600_SV }, - { "960x720", OPTION_VAL_960X720_SV }, - { "1024x768", OPTION_VAL_1024X768_SV }, - { "1280x960", OPTION_VAL_1280X960_SV }, - { "1440x1080", OPTION_VAL_1440X1080_SV }, - { "1600x1200", OPTION_VAL_1600X1200_SV }, - { "1920x1440", OPTION_VAL_1920X1440_SV }, - { "2560x1920", OPTION_VAL_2560X1920_SV }, - { "2880x2160", OPTION_VAL_2880X2160_SV }, - { "3200x2400", OPTION_VAL_3200X2400_SV }, - { "3840x2880", OPTION_VAL_3840X2880_SV }, - { "4480x3360", OPTION_VAL_4480X3360_SV }, - { "5120x3840", OPTION_VAL_5120X3840_SV }, - { "5760x4320", OPTION_VAL_5760X4320_SV }, - { "6400x4800", OPTION_VAL_6400X4800_SV }, - { "7040x5280", OPTION_VAL_7040X5280_SV }, - { "7680x5760", OPTION_VAL_7680X5760_SV }, - { "8320x6240", OPTION_VAL_8320X6240_SV }, - { "8960x6720", OPTION_VAL_8960X6720_SV }, - { "9600x7200", OPTION_VAL_9600X7200_SV }, - { "10240x7680", OPTION_VAL_10240X7680_SV }, - { "10880x8160", OPTION_VAL_10880X8160_SV }, - { "11520x8640", OPTION_VAL_11520X8640_SV }, - { "12160x9120", OPTION_VAL_12160X9120_SV }, - { "12800x9600", OPTION_VAL_12800X9600_SV }, + { "320x240", OPTION_VAL_320X240_TR }, + { "640x480", OPTION_VAL_640X480_TR }, + { "800x600", OPTION_VAL_800X600_TR }, + { "960x720", OPTION_VAL_960X720_TR }, + { "1024x768", OPTION_VAL_1024X768_TR }, + { "1280x960", OPTION_VAL_1280X960_TR }, + { "1440x1080", OPTION_VAL_1440X1080_TR }, + { "1600x1200", OPTION_VAL_1600X1200_TR }, + { "1920x1440", OPTION_VAL_1920X1440_TR }, + { "2560x1920", OPTION_VAL_2560X1920_TR }, + { "2880x2160", OPTION_VAL_2880X2160_TR }, + { "3200x2400", OPTION_VAL_3200X2400_TR }, + { "3840x2880", OPTION_VAL_3840X2880_TR }, + { "4480x3360", OPTION_VAL_4480X3360_TR }, + { "5120x3840", OPTION_VAL_5120X3840_TR }, + { "5760x4320", OPTION_VAL_5760X4320_TR }, + { "6400x4800", OPTION_VAL_6400X4800_TR }, + { "7040x5280", OPTION_VAL_7040X5280_TR }, + { "7680x5760", OPTION_VAL_7680X5760_TR }, + { "8320x6240", OPTION_VAL_8320X6240_TR }, + { "8960x6720", OPTION_VAL_8960X6720_TR }, + { "9600x7200", OPTION_VAL_9600X7200_TR }, + { "10240x7680", OPTION_VAL_10240X7680_TR }, + { "10880x8160", OPTION_VAL_10880X8160_TR }, + { "11520x8640", OPTION_VAL_11520X8640_TR }, + { "12160x9120", OPTION_VAL_12160X9120_TR }, + { "12800x9600", OPTION_VAL_12800X9600_TR }, { NULL, NULL }, }, #ifdef LOW_RES @@ -61735,62 +73078,62 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_SV, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_TR, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_SV, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TR, NULL, "video", { - { "VGA", OPTION_VAL_VGA_SV }, - { "TV (RGB)", OPTION_VAL_TV_RGB_SV }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_SV }, + { "VGA", OPTION_VAL_VGA_TR }, + { "TV (RGB)", OPTION_VAL_TV_RGB_TR }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_TR }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_SV, + CORE_OPTION_NAME_BROADCAST_LABEL_TR, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_SV }, - { "PAL", OPTION_VAL_PAL_SV }, - { "PAL_N", OPTION_VAL_PAL_N_SV }, - { "PAL_M", OPTION_VAL_PAL_M_SV }, - { "Default", OPTION_VAL_DEFAULT_SV }, + { "NTSC", OPTION_VAL_NTSC_TR }, + { "PAL", OPTION_VAL_PAL_TR }, + { "PAL_N", OPTION_VAL_PAL_N_TR }, + { "PAL_M", OPTION_VAL_PAL_M_TR }, + { "Default", OPTION_VAL_DEFAULT_TR }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_SV, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TR, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_SV }, - { "vertical", OPTION_VAL_VERTICAL_SV }, + { "horizontal", OPTION_VAL_HORIZONTAL_TR }, + { "vertical", OPTION_VAL_VERTICAL_TR }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_SV, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_TR, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_SV }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_SV }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TR }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_TR }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_SV }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_TR }, #endif { NULL, NULL }, }, @@ -61803,25 +73146,25 @@ struct retro_core_option_v2_definition option_defs_sv[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_SV, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TR, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_SV, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TR, NULL, "video", { - { "512MB", OPTION_VAL_512MB_SV }, - { "1GB", OPTION_VAL_1GB_SV }, - { "2GB", OPTION_VAL_2GB_SV }, - { "4GB", OPTION_VAL_4GB_SV }, + { "512MB", OPTION_VAL_512MB_TR }, + { "1GB", OPTION_VAL_1GB_TR }, + { "2GB", OPTION_VAL_2GB_TR }, + { "4GB", OPTION_VAL_4GB_TR }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_SV, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_TR, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_SV, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TR, NULL, "video", { @@ -61829,6 +73172,7 @@ struct retro_core_option_v2_definition option_defs_sv[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -61837,9 +73181,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_SV, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TR, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_SV, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TR, NULL, "video", { @@ -61851,9 +73195,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_SV, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TR, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_SV, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TR, NULL, "video", { @@ -61863,11 +73207,11 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_SV, + CORE_OPTION_NAME_MIPMAPPING_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_TR, NULL, "video", { @@ -61879,7 +73223,7 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_SV, + CORE_OPTION_NAME_FOG_LABEL_TR, NULL, "", NULL, @@ -61893,9 +73237,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_SV, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TR, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_SV, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TR, NULL, "video", { @@ -61907,9 +73251,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_SV, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TR, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_SV, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TR, NULL, "video", { @@ -61924,24 +73268,24 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_SV, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TR, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_SV, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TR, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_SV }, - { "1", OPTION_VAL_1_SV }, - { "2", OPTION_VAL_2_SV }, + { "0", OPTION_VAL_DEFAULT_TR }, + { "1", OPTION_VAL_1_TR }, + { "2", OPTION_VAL_2_TR }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_SV, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TR, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_SV, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TR, NULL, "video", { @@ -61949,13 +73293,13 @@ struct retro_core_option_v2_definition option_defs_sv[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_SV, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TR, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_SV, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TR, NULL, "video", { @@ -61967,9 +73311,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_SV, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TR, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_SV, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TR, NULL, "video", { @@ -61982,25 +73326,25 @@ struct retro_core_option_v2_definition option_defs_sv[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_SV, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_TR, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_SV, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TR, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_SV }, - { "4", OPTION_VAL_4_SV }, - { "6", OPTION_VAL_6_SV }, + { "2", OPTION_VAL_2_O26_TR }, + { "4", OPTION_VAL_4_TR }, + { "6", OPTION_VAL_6_TR }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_SV, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_TR, NULL, "video", { @@ -62014,9 +73358,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_SV, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TR, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_SV, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TR, NULL, "video", { @@ -62026,11 +73370,25 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_TR, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_TR, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_SV, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TR, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_SV, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TR, NULL, "performance", { @@ -62042,15 +73400,15 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_SV, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TR, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_SV, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TR, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_SV }, - { "more", OPTION_VAL_MORE_SV }, + { "some", OPTION_VAL_SOME_TR }, + { "more", OPTION_VAL_MORE_TR }, { NULL, NULL }, }, #ifdef LOW_END @@ -62061,9 +73419,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_SV, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TR, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_SV, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TR, NULL, "performance", { @@ -62080,9 +73438,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_SV, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TR, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_SV, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TR, NULL, "hacks", { @@ -62094,9 +73452,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_SV, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TR, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_SV, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TR, NULL, "hacks", { @@ -62108,9 +73466,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_SV, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TR, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_SV, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TR, NULL, "hacks", { @@ -62124,64 +73482,78 @@ struct retro_core_option_v2_definition option_defs_sv[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_TR, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_TR, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_SV, + CORE_OPTION_NAME_SH4CLOCK_LABEL_TR, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_SV, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_TR, NULL, "hacks", { - { "100", OPTION_VAL_100_SV }, - { "110", OPTION_VAL_110_SV }, - { "120", OPTION_VAL_120_SV }, - { "130", OPTION_VAL_130_SV }, - { "140", OPTION_VAL_140_SV }, - { "150", OPTION_VAL_150_SV }, - { "160", OPTION_VAL_160_SV }, - { "170", OPTION_VAL_170_SV }, - { "180", OPTION_VAL_180_SV }, - { "190", OPTION_VAL_190_SV }, - { "200", OPTION_VAL_200_SV }, - { "210", OPTION_VAL_210_SV }, - { "220", OPTION_VAL_220_SV }, - { "230", OPTION_VAL_230_SV }, - { "240", OPTION_VAL_240_SV }, - { "250", OPTION_VAL_250_SV }, - { "260", OPTION_VAL_260_SV }, - { "270", OPTION_VAL_270_SV }, - { "280", OPTION_VAL_280_SV }, - { "290", OPTION_VAL_290_SV }, - { "300", OPTION_VAL_300_SV }, - { "310", OPTION_VAL_310_SV }, - { "320", OPTION_VAL_320_SV }, - { "330", OPTION_VAL_330_SV }, - { "340", OPTION_VAL_340_SV }, - { "350", OPTION_VAL_350_SV }, - { "360", OPTION_VAL_360_SV }, - { "370", OPTION_VAL_370_SV }, - { "380", OPTION_VAL_380_SV }, - { "390", OPTION_VAL_390_SV }, - { "400", OPTION_VAL_400_SV }, - { "410", OPTION_VAL_410_SV }, - { "420", OPTION_VAL_420_SV }, - { "430", OPTION_VAL_430_SV }, - { "440", OPTION_VAL_440_SV }, - { "450", OPTION_VAL_450_SV }, - { "460", OPTION_VAL_460_SV }, - { "470", OPTION_VAL_470_SV }, - { "480", OPTION_VAL_480_SV }, - { "490", OPTION_VAL_490_SV }, - { "500", OPTION_VAL_500_SV }, + { "100", OPTION_VAL_100_TR }, + { "110", OPTION_VAL_110_TR }, + { "120", OPTION_VAL_120_TR }, + { "130", OPTION_VAL_130_TR }, + { "140", OPTION_VAL_140_TR }, + { "150", OPTION_VAL_150_TR }, + { "160", OPTION_VAL_160_TR }, + { "170", OPTION_VAL_170_TR }, + { "180", OPTION_VAL_180_TR }, + { "190", OPTION_VAL_190_TR }, + { "200", OPTION_VAL_200_TR }, + { "210", OPTION_VAL_210_TR }, + { "220", OPTION_VAL_220_TR }, + { "230", OPTION_VAL_230_TR }, + { "240", OPTION_VAL_240_TR }, + { "250", OPTION_VAL_250_TR }, + { "260", OPTION_VAL_260_TR }, + { "270", OPTION_VAL_270_TR }, + { "280", OPTION_VAL_280_TR }, + { "290", OPTION_VAL_290_TR }, + { "300", OPTION_VAL_300_TR }, + { "310", OPTION_VAL_310_TR }, + { "320", OPTION_VAL_320_TR }, + { "330", OPTION_VAL_330_TR }, + { "340", OPTION_VAL_340_TR }, + { "350", OPTION_VAL_350_TR }, + { "360", OPTION_VAL_360_TR }, + { "370", OPTION_VAL_370_TR }, + { "380", OPTION_VAL_380_TR }, + { "390", OPTION_VAL_390_TR }, + { "400", OPTION_VAL_400_TR }, + { "410", OPTION_VAL_410_TR }, + { "420", OPTION_VAL_420_TR }, + { "430", OPTION_VAL_430_TR }, + { "440", OPTION_VAL_440_TR }, + { "450", OPTION_VAL_450_TR }, + { "460", OPTION_VAL_460_TR }, + { "470", OPTION_VAL_470_TR }, + { "480", OPTION_VAL_480_TR }, + { "490", OPTION_VAL_490_TR }, + { "500", OPTION_VAL_500_TR }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_SV, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_TR, NULL, "hacks", { @@ -62191,11 +73563,11 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_SV, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_TR, NULL, "hacks", { @@ -62207,186 +73579,330 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_SV, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_TR, NULL, "input", { - { "0%", OPTION_VAL_0_SV }, - { "5%", OPTION_VAL_5_SV }, - { "10%", OPTION_VAL_10_SV }, - { "15%", OPTION_VAL_15_SV }, - { "20%", OPTION_VAL_20_SV }, - { "25%", OPTION_VAL_25_SV }, - { "30%", OPTION_VAL_30_SV }, + { "0%", OPTION_VAL_0_TR }, + { "5%", OPTION_VAL_5_TR }, + { "10%", OPTION_VAL_10_TR }, + { "15%", OPTION_VAL_15_TR }, + { "20%", OPTION_VAL_20_TR }, + { "25%", OPTION_VAL_25_TR }, + { "30%", OPTION_VAL_30_TR }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_SV, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TR, + NULL, + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_TR, + NULL, + "input", + { + { "0%", OPTION_VAL_0_TR }, + { "5%", OPTION_VAL_5_TR }, + { "10%", OPTION_VAL_10_TR }, + { "15%", OPTION_VAL_15_TR }, + { "20%", OPTION_VAL_20_TR }, + { "25%", OPTION_VAL_25_TR }, + { "30%", OPTION_VAL_30_TR }, + { NULL, NULL }, + }, + "0%", + }, + { + CORE_OPTION_NAME "_digital_triggers", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TR, + NULL, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_TR, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TR, + NULL, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TR, + NULL, + "input", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TR, + NULL, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TR, + NULL, + "input", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_TR, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_TR }, + { "60%", OPTION_VAL_60_TR }, + { "70%", OPTION_VAL_70_TR }, + { "80%", OPTION_VAL_80_TR }, + { "90%", OPTION_VAL_90_TR }, + { "100%", OPTION_VAL_100_O45_TR }, + { "110%", OPTION_VAL_110_O45_TR }, + { "120%", OPTION_VAL_120_O45_TR }, + { "130%", OPTION_VAL_130_O45_TR }, + { "140%", OPTION_VAL_140_O45_TR }, + { "150%", OPTION_VAL_150_O45_TR }, + { "160%", OPTION_VAL_160_O45_TR }, + { "170%", OPTION_VAL_170_O45_TR }, + { "180%", OPTION_VAL_180_O45_TR }, + { "190%", OPTION_VAL_190_O45_TR }, + { "200%", OPTION_VAL_200_O45_TR }, + { "210%", OPTION_VAL_210_O45_TR }, + { "220%", OPTION_VAL_220_O45_TR }, + { "230%", OPTION_VAL_230_O45_TR }, + { "240%", OPTION_VAL_240_O45_TR }, + { "250%", OPTION_VAL_250_O45_TR }, + { "260%", OPTION_VAL_260_O45_TR }, + { "270%", OPTION_VAL_270_O45_TR }, + { "280%", OPTION_VAL_280_O45_TR }, + { "290%", OPTION_VAL_290_O45_TR }, + { "300%", OPTION_VAL_300_O45_TR }, + { NULL, NULL }, + }, + "100%", + }, + { + CORE_OPTION_NAME "_lightgun1_crosshair", + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_TR }, + { "Red", OPTION_VAL_RED_TR }, + { "Green", OPTION_VAL_GREEN_TR }, + { "Blue", OPTION_VAL_BLUE_TR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun2_crosshair", + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_TR }, + { "Red", OPTION_VAL_RED_TR }, + { "Green", OPTION_VAL_GREEN_TR }, + { "Blue", OPTION_VAL_BLUE_TR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun3_crosshair", + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TR, + NULL, + "", + NULL, + "input", + { + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_TR }, + { "Red", OPTION_VAL_RED_TR }, + { "Green", OPTION_VAL_GREEN_TR }, + { "Blue", OPTION_VAL_BLUE_TR }, + { NULL, NULL }, + }, + "disabled", + }, + { + CORE_OPTION_NAME "_lightgun4_crosshair", + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TR, NULL, "", NULL, "input", { - { "0%", OPTION_VAL_0_SV }, - { "5%", OPTION_VAL_5_SV }, - { "10%", OPTION_VAL_10_SV }, - { "15%", OPTION_VAL_15_SV }, - { "20%", OPTION_VAL_20_SV }, - { "25%", OPTION_VAL_25_SV }, - { "30%", OPTION_VAL_30_SV }, - { NULL, NULL }, + { "disabled", NULL }, + { "White", OPTION_VAL_WHITE_TR }, + { "Red", OPTION_VAL_RED_TR }, + { "Green", OPTION_VAL_GREEN_TR }, + { "Blue", OPTION_VAL_BLUE_TR }, + { NULL, NULL }, }, - "0%", + "disabled", }, { - CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_SV, + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_SV, + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_TR, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_SV, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, { NULL, NULL }, }, - "enabled", + "Purupuru", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_SV, + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_TR, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_SV, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "enabled", NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_SV, + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_TR, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_SV, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_TR, NULL, - "input", + "expansions", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, + { NULL, NULL }, }, - "disabled" + "Purupuru", }, { - CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_SV, + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SV }, - { "Red", OPTION_VAL_RED_SV }, - { "Green", OPTION_VAL_GREEN_SV }, - { "Blue", OPTION_VAL_BLUE_SV }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_SV, + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SV }, - { "Red", OPTION_VAL_RED_SV }, - { "Green", OPTION_VAL_GREEN_SV }, - { "Blue", OPTION_VAL_BLUE_SV }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { - CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_SV, + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SV }, - { "Red", OPTION_VAL_RED_SV }, - { "Green", OPTION_VAL_GREEN_SV }, - { "Blue", OPTION_VAL_BLUE_SV }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, + { NULL, NULL }, }, - "disabled", + "VMU", }, { - CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_SV, + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_TR, NULL, - "", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_TR, NULL, - "input", + "expansions", { - { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_SV }, - { "Red", OPTION_VAL_RED_SV }, - { "Green", OPTION_VAL_GREEN_SV }, - { "Blue", OPTION_VAL_BLUE_SV }, - { NULL, NULL }, + { "VMU", OPTION_VAL_VMU_TR }, + { "Purupuru", OPTION_VAL_PURUPURU_TR }, + { "None", OPTION_VAL_NONE_TR }, + { NULL, NULL }, }, - "disabled", + "Purupuru", }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_SV, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_SV, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_SV, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TR, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_SV }, - { "All VMUs", OPTION_VAL_ALL_VMUS_SV }, + { "VMU A1", OPTION_VAL_VMU_A1_TR }, + { "All VMUs", OPTION_VAL_ALL_VMUS_TR }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_SV, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_SV, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_SV, + CORE_OPTION_NAME_VMU_SOUND_LABEL_TR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TR, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_TR, NULL, "vmu", { @@ -62397,9 +73913,9 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_SV, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_SV, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_SV, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TR, NULL, "vmu", { @@ -62411,7 +73927,7 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_SV, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TR, NULL, "", NULL, @@ -62425,144 +73941,144 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_SV, + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, { NULL, NULL }, }, "Upper Left", }, { CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_SV, + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SV }, - { "2x", OPTION_VAL_2_O27_SV }, - { "3x", OPTION_VAL_3X_SV }, - { "4x", OPTION_VAL_4_SV }, - { "5x", OPTION_VAL_5X_SV }, + { "1x", OPTION_VAL_1X_TR }, + { "2x", OPTION_VAL_2_O26_TR }, + { "3x", OPTION_VAL_3X_TR }, + { "4x", OPTION_VAL_4_TR }, + { "5x", OPTION_VAL_5X_TR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_SV, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SV }, - { "20%", OPTION_VAL_20_SV }, - { "30%", OPTION_VAL_30_SV }, - { "40%", OPTION_VAL_40_SV }, - { "50%", OPTION_VAL_50_SV }, - { "60%", OPTION_VAL_60_SV }, - { "70%", OPTION_VAL_70_SV }, - { "80%", OPTION_VAL_80_SV }, - { "90%", OPTION_VAL_90_SV }, - { "100%", OPTION_VAL_100_O57_SV }, + { "10%", OPTION_VAL_10_TR }, + { "20%", OPTION_VAL_20_TR }, + { "30%", OPTION_VAL_30_TR }, + { "40%", OPTION_VAL_40_TR }, + { "50%", OPTION_VAL_50_TR }, + { "60%", OPTION_VAL_60_TR }, + { "70%", OPTION_VAL_70_TR }, + { "80%", OPTION_VAL_80_TR }, + { "90%", OPTION_VAL_90_TR }, + { "100%", OPTION_VAL_100_O45_TR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_SV, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TR, NULL, "", NULL, @@ -62576,144 +74092,144 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_SV, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_SV, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SV }, - { "2x", OPTION_VAL_2_O27_SV }, - { "3x", OPTION_VAL_3X_SV }, - { "4x", OPTION_VAL_4_SV }, - { "5x", OPTION_VAL_5X_SV }, + { "1x", OPTION_VAL_1X_TR }, + { "2x", OPTION_VAL_2_O26_TR }, + { "3x", OPTION_VAL_3X_TR }, + { "4x", OPTION_VAL_4_TR }, + { "5x", OPTION_VAL_5X_TR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_SV, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SV }, - { "20%", OPTION_VAL_20_SV }, - { "30%", OPTION_VAL_30_SV }, - { "40%", OPTION_VAL_40_SV }, - { "50%", OPTION_VAL_50_SV }, - { "60%", OPTION_VAL_60_SV }, - { "70%", OPTION_VAL_70_SV }, - { "80%", OPTION_VAL_80_SV }, - { "90%", OPTION_VAL_90_SV }, - { "100%", OPTION_VAL_100_O57_SV }, + { "10%", OPTION_VAL_10_TR }, + { "20%", OPTION_VAL_20_TR }, + { "30%", OPTION_VAL_30_TR }, + { "40%", OPTION_VAL_40_TR }, + { "50%", OPTION_VAL_50_TR }, + { "60%", OPTION_VAL_60_TR }, + { "70%", OPTION_VAL_70_TR }, + { "80%", OPTION_VAL_80_TR }, + { "90%", OPTION_VAL_90_TR }, + { "100%", OPTION_VAL_100_O45_TR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_SV, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TR, NULL, "", NULL, @@ -62727,144 +74243,144 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_SV, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_SV, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SV }, - { "2x", OPTION_VAL_2_O27_SV }, - { "3x", OPTION_VAL_3X_SV }, - { "4x", OPTION_VAL_4_SV }, - { "5x", OPTION_VAL_5X_SV }, + { "1x", OPTION_VAL_1X_TR }, + { "2x", OPTION_VAL_2_O26_TR }, + { "3x", OPTION_VAL_3X_TR }, + { "4x", OPTION_VAL_4_TR }, + { "5x", OPTION_VAL_5X_TR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_SV, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_SV, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SV }, - { "20%", OPTION_VAL_20_SV }, - { "30%", OPTION_VAL_30_SV }, - { "40%", OPTION_VAL_40_SV }, - { "50%", OPTION_VAL_50_SV }, - { "60%", OPTION_VAL_60_SV }, - { "70%", OPTION_VAL_70_SV }, - { "80%", OPTION_VAL_80_SV }, - { "90%", OPTION_VAL_90_SV }, - { "100%", OPTION_VAL_100_O57_SV }, + { "10%", OPTION_VAL_10_TR }, + { "20%", OPTION_VAL_20_TR }, + { "30%", OPTION_VAL_30_TR }, + { "40%", OPTION_VAL_40_TR }, + { "50%", OPTION_VAL_50_TR }, + { "60%", OPTION_VAL_60_TR }, + { "70%", OPTION_VAL_70_TR }, + { "80%", OPTION_VAL_80_TR }, + { "90%", OPTION_VAL_90_TR }, + { "100%", OPTION_VAL_100_O45_TR }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_SV, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TR, NULL, "", NULL, @@ -62878,505 +74394,560 @@ struct retro_core_option_v2_definition option_defs_sv[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_SV, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TR, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_SV }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_SV }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_SV }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_SV }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_SV, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TR, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_SV }, - { "2x", OPTION_VAL_2_O27_SV }, - { "3x", OPTION_VAL_3X_SV }, - { "4x", OPTION_VAL_4_SV }, - { "5x", OPTION_VAL_5X_SV }, + { "1x", OPTION_VAL_1X_TR }, + { "2x", OPTION_VAL_2_O26_TR }, + { "3x", OPTION_VAL_3X_TR }, + { "4x", OPTION_VAL_4_TR }, + { "5x", OPTION_VAL_5X_TR }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_SV, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, - { NULL, NULL }, - }, - "DEFAULT_ON 00", - }, - { - CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_SV, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_SV }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_SV }, - { "BLACK 02", OPTION_VAL_BLACK_02_SV }, - { "BLUE 03", OPTION_VAL_BLUE_SV }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_SV }, - { "GREEN 05", OPTION_VAL_GREEN_SV }, - { "CYAN 06", OPTION_VAL_CYAN_06_SV }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_SV }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_SV }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_SV }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_SV }, - { "RED 11", OPTION_VAL_RED_SV }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_SV }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_SV }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_SV }, - { "GRAY 15", OPTION_VAL_GRAY_15_SV }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_SV }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_SV }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_SV }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_SV }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_SV }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_SV }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_SV }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_SV }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_SV }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_SV }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_SV }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_SV }, - { "WHITE 28", OPTION_VAL_WHITE_SV }, - { NULL, NULL }, - }, - "DEFAULT_OFF 01", - }, - { - CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_SV, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TR, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_SV }, - { "20%", OPTION_VAL_20_SV }, - { "30%", OPTION_VAL_30_SV }, - { "40%", OPTION_VAL_40_SV }, - { "50%", OPTION_VAL_50_SV }, - { "60%", OPTION_VAL_60_SV }, - { "70%", OPTION_VAL_70_SV }, - { "80%", OPTION_VAL_80_SV }, - { "90%", OPTION_VAL_90_SV }, - { "100%", OPTION_VAL_100_O57_SV }, - { NULL, NULL }, - }, - "100%", - }, - { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, -}; -struct retro_core_options_v2 options_sv = { - option_cats_sv, - option_defs_sv -}; - -/* RETRO_LANGUAGE_TR */ - -#define CATEGORY_SYSTEM_LABEL_TR "Sistem" -#define CATEGORY_SYSTEM_INFO_0_TR "Bölge, dil, BIOS ve temel donanım ayarlarını yapılandırın." -#define CATEGORY_VIDEO_LABEL_TR NULL -#define CATEGORY_VIDEO_INFO_0_TR "Çözünürlüğü, istenenden bağımsız şeffaflığı ve görsel efekt ayarlarını yapılandırın." -#define CATEGORY_PERFORMANCE_LABEL_TR "Performans" -#define CATEGORY_PERFORMANCE_INFO_0_TR "Zorlu işleme ve kare atlama ayarlarını yapılandırın." -#define CATEGORY_HACKS_LABEL_TR "Emülatör Geliştirmeleri" -#define CATEGORY_HACKS_INFO_0_TR "Geniş ekran geçersiz kılmaları, GD-ROM yükleme hızı ve doku değiştirme ayarlarını yapılandırın." -#define CATEGORY_INPUT_LABEL_TR "Girdi" -#define CATEGORY_INPUT_INFO_0_TR "Oyun kolu ve light gun ayarlarını yapılandırın." -#define CATEGORY_VMU_LABEL_TR "Görsel Bellek Birimi" -#define CATEGORY_VMU_INFO_0_TR "Oyun başına VMU kayıt dosyaları ve ekrandaki VMU görünürlük ayarlarını yapılandırın." -#define CORE_OPTION_NAME_REGION_LABEL_TR "Bölge" -#define OPTION_VAL_JAPAN_TR "Japonya" -#define OPTION_VAL_USA_TR "ABD" -#define OPTION_VAL_EUROPE_TR "Avrupa" -#define OPTION_VAL_DEFAULT_TR "Varsayılan" -#define CORE_OPTION_NAME_LANGUAGE_LABEL_TR "Dil" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_TR "BIOS ve birden çok dil içeren oyunlar tarafından kullanılan dili değiştirir." -#define OPTION_VAL_JAPANESE_TR "Japonca" -#define OPTION_VAL_ENGLISH_TR "İngilizce" -#define OPTION_VAL_GERMAN_TR "Almanca" -#define OPTION_VAL_FRENCH_TR "Fransızca" -#define OPTION_VAL_SPANISH_TR "İspanyolca" -#define OPTION_VAL_ITALIAN_TR "İtalyanca" -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_TR "HLE BIOS (Yeniden Başlatılmalı)" -#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_TR "Yüksek seviyeli taklit BIOS kullanımını zorunlu kılın." -#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TR "BIOS Önyükleme (Yeniden Başlatılmalı)" -#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TR "Doğrudan Dreamcast BIOS menüsüne önyükleme yapın." -#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_TR "DSP'yi Etkinleştir" -#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TR "Dreamcast ses DSP (dijital sinyal işlemcisi) taklidini etkinleştirin. Üretilen sesin doğruluğunu artırır, ancak performans gereksinimlerini artırır." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_TR "Windows CE Kipini Zorla" -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_TR "Windows CE oyunları için tam MMU (Bellek Yönetim Birimi) öykünmesini ve diğer ayarları etkinleştirin." -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TR "NAOMI Hizmet Düğmelerine İzin Ver" -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TR "Kabin ayarlarına girmek için NAOMI için SERVICE düğmesini etkinleştirir." -#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TR "NAOMI Oyunlarını Serbest Oynamaya Ayarlayın" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TR "Serbest oynamak için oyunun jeton ayarlarını değiştirin." -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_TR "Geniş Bant Adaptör Taklidi" -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TR "Modem yerine ethernet geniş bant adaptörünü taklit edin. (Yeniden Başlatılmalı)" -#define CORE_OPTION_NAME_UPNP_LABEL_TR "UPnP Etkinleştir" -#define CORE_OPTION_NAME_UPNP_INFO_0_TR "İnternet yönlendiricinizi çevrimiçi oyunlar için otomatik olarak yapılandırmak üzere UPnP kullanın." -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TR "Dahili Çözünürlük" -#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TR "İşleme çözünürlüğünü değiştirin." -#define OPTION_VAL_320X240_TR NULL -#define OPTION_VAL_640X480_TR NULL -#define OPTION_VAL_800X600_TR NULL -#define OPTION_VAL_960X720_TR NULL -#define OPTION_VAL_1024X768_TR NULL -#define OPTION_VAL_1280X960_TR NULL -#define OPTION_VAL_1440X1080_TR NULL -#define OPTION_VAL_1600X1200_TR NULL -#define OPTION_VAL_1920X1440_TR NULL -#define OPTION_VAL_2560X1920_TR NULL -#define OPTION_VAL_2880X2160_TR NULL -#define OPTION_VAL_3200X2400_TR NULL -#define OPTION_VAL_3840X2880_TR NULL -#define OPTION_VAL_4480X3360_TR NULL -#define OPTION_VAL_5120X3840_TR NULL -#define OPTION_VAL_5760X4320_TR NULL -#define OPTION_VAL_6400X4800_TR NULL -#define OPTION_VAL_7040X5280_TR NULL -#define OPTION_VAL_7680X5760_TR NULL -#define OPTION_VAL_8320X6240_TR NULL -#define OPTION_VAL_8960X6720_TR NULL -#define OPTION_VAL_9600X7200_TR NULL -#define OPTION_VAL_10240X7680_TR NULL -#define OPTION_VAL_10880X8160_TR NULL -#define OPTION_VAL_11520X8640_TR NULL -#define OPTION_VAL_12160X9120_TR NULL -#define OPTION_VAL_12800X9600_TR NULL -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_TR "Kablo Tipi" -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TR "Çıkış sinyali türü. 'TV (Kompozit)' en yaygın olarak desteklenendir." -#define OPTION_VAL_VGA_TR NULL -#define OPTION_VAL_TV_RGB_TR NULL -#define OPTION_VAL_TV_COMPOSITE_TR NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_TR "Standart Yayın" -#define OPTION_VAL_NTSC_TR NULL -#define OPTION_VAL_PAL_TR "PAL (Dünya)" -#define OPTION_VAL_PAL_N_TR "PAL-N (Arjantin, Paraguay, Uruguay)" -#define OPTION_VAL_PAL_M_TR "PAL-M (Brezilya)" -#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TR "Ekran Yönü" -#define OPTION_VAL_HORIZONTAL_TR "Yatay" -#define OPTION_VAL_VERTICAL_TR "Dikey" -#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TR "Alfabetik Sıralama" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TR "Şerit Başına (hızlı, en az doğru)" -#define OPTION_VAL_PER_TRIANGLE_NORMAL_TR "Üçgen Başına (normal)" -#define OPTION_VAL_PER_PIXEL_ACCURATE_TR "Piksel Başına (doğru, ancak en yavaş)" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TR "Toplama Piksel Tampon Boyutu" -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TR "Daha yüksek çözünürlüklerin doğru çıktı alması için daha yüksek değerler gerekebilir." -#define OPTION_VAL_512MB_TR NULL -#define OPTION_VAL_1GB_TR NULL -#define OPTION_VAL_2GB_TR NULL -#define OPTION_VAL_4GB_TR NULL -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_TR "En Fazla Şeffaf Katman" -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TR "Karmaşık sahneler için daha yüksek değerler gerekebilir." -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TR "Tam kare önbellek taklidi" -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TR "VRAM üstünde tam kare önbellek taklidini etkinleştirin. Kare önbelleğini doğrudan VRAM üstünden okuyan veya yazan oyunlar için kullanışlıdır. Etkinleştirildiğinde, Dahili Çözünürlük 640x480 olarak zorlanır ve performans ciddi şekilde etkilenebilir." -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TR "RTT (Dokuya Dönüştür) Önbelleğini Etkinleştir" -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TR "İşlenen dokuları GPU'dan VRAM'e geri kopyalayın. Bu seçenek normalde bunu gerektiren oyunlar için etkinleştirilir. Etkinleştirildiğinde, doku işleme yükseltme devre dışı bırakılır ve performans etkilenebilir." -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_TR "Görüş Açısı" -#define CORE_OPTION_NAME_FOG_LABEL_TR "Sis Efektleri" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TR "Hacim Değiştirici" -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TR "Genellikle oyunlar tarafından nesne gölgeleri çizmek için kullanılan bir Dreamcast GPU özelliği. Bu normalde etkinleştirilmelidir - performansa olumsuz etkisi yok denilebilecek düzeydedir." -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TR "Eşyönsüz Filtreleme" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TR "Kameraya göre eğik görüş açılarında olan yüzeylerdeki dokuların kalitesini iyileştirin. Daha yüksek değerler GPU'da daha fazla talepkardır. Bu ayarda yapılan değişiklikler yalnızca yeniden başlatmanın ardından geçerlidir." -#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TR "Doku Filtreleme" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TR "Kullanılacak doku filtreleme kipi. Bu, Varsayılan'dan daha net (veya pürüzsüz) bir görünüm elde etmek için tüm dokularda belirli bir doku filtreleme kipini zorlamak için kullanılabilir. Varsayılan dışındaki değerler, çeşitli işleme sorunlarına neden olabilir. Bu ayarda yapılan değişiklikler yalnızca yeniden başlatmanın ardından geçerlidir." -#define OPTION_VAL_1_TR "En Yakına Zorla" -#define OPTION_VAL_2_TR "Doğrusala Zorla" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TR "Gecikmeli Kare Değişimi" -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TR "Yanıp sönen ekranlardan veya sorunlu videolardan kaçınmak için kullanışlıdır. Yavaş platformlarda önerilmez." -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TR "Kare Hızı Değişikliklerini Algıla" -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TR "Dahili kare hızı değiştiğinde (örneğin, 60 fps'den 30 fps'ye) ön ucu bilgilendirin. Kilitli 30 fps veya 20 fps'de çalışan oyunlarda kare hızını iyileştirir, ancak kilitlenmemiş (dengesiz) kare hızlarına sahip oyunlar için devre dışı bırakılması gerekir (örn. Ecco the Dolphin, Unreal Tournament). Not: 'Otomatik Kare Atla' etkinleştirildiğinde kullanılamaz." -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TR "PowerVR2 Rötuş Filtresi" -#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TR "PowerVR2 GPU'ya ve analog video sinyallerine özgü efektleri simüle etmek için işlenen görüntüyü son işlemden geçirin." -#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_TR "Doku Yükseltme (xBRZ)" -#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TR "Elle çizilmiş 2B piksel sanatsal grafiklerini geliştirin. Yalnızca 2D piksel oyunlarla kullanılmalıdır." -#define OPTION_VAL_2_O27_TR NULL -#define OPTION_VAL_4_TR NULL -#define OPTION_VAL_6_TR NULL -#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TR "Doku Yükseltme Azami Filtre Boyutu" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TR "Yerel Derinlik Enterpolasyonu" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TR "AMD GPU'larda doku bozulması ve derinlik sorunlarına yardımcı olur. Bazı durumlarda Intel GPU'lara da yardımcı olabilir." -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TR "Zorlu İşleme" -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TR "GPU ve CPU'yu farklı iş parçacıklarında çalıştırır. Şiddetle tavsiye edilir." -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TR "Kareyi Otomatik Atla" -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TR "Emulatör yavaş çalışırken kareleri otomatik olarak atlayın. Not: Bu ayar yalnızca 'Zorlu İşleme' etkinleştirildiğinde geçerlidir." -#define OPTION_VAL_SOME_TR NULL -#define OPTION_VAL_MORE_TR "Azami" -#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TR "Kare Atlama" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TR "Görüntülenen her kare arasında atlanacak kare sayısını ayarlar." -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TR "Geniş Ekran Hileleri (Yeniden Başlatılmalı)" -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TR "Belirli oyunların geniş ekran biçiminde görüntülenmesine izin veren hileleri etkinleştirir." -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TR "Geniş Ekran Geliştirmesi" -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TR "Normal 4:3 en boy oranının dışına geometri çizin. Ortaya çıkan alanlarda grafiksel hatalara neden olabilir." -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TR "GDROM Hızlı Yükleme (kusurlu)" -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TR "GD-ROM yüklemesini hızlandırır." -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_TR "SH4 CPU düşük/hız aşırtması" -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_TR "SH4 ana CPU saatini varsayılan 200 MHz değerinden değiştirin. Hız aşırtması platformların yavaşlamasına yardımcı olabilir. Hız aşırtma bazı oyunlarda kare hızını artırabilir. Dikkatle kullanın." -#define OPTION_VAL_100_TR NULL -#define OPTION_VAL_110_TR NULL -#define OPTION_VAL_120_TR NULL -#define OPTION_VAL_130_TR NULL -#define OPTION_VAL_140_TR NULL -#define OPTION_VAL_150_TR NULL -#define OPTION_VAL_160_TR NULL -#define OPTION_VAL_170_TR NULL -#define OPTION_VAL_180_TR NULL -#define OPTION_VAL_190_TR NULL -#define OPTION_VAL_200_TR NULL -#define OPTION_VAL_210_TR NULL -#define OPTION_VAL_220_TR NULL -#define OPTION_VAL_230_TR NULL -#define OPTION_VAL_240_TR NULL -#define OPTION_VAL_250_TR NULL -#define OPTION_VAL_260_TR NULL -#define OPTION_VAL_270_TR NULL -#define OPTION_VAL_280_TR NULL -#define OPTION_VAL_290_TR NULL -#define OPTION_VAL_300_TR NULL -#define OPTION_VAL_310_TR NULL -#define OPTION_VAL_320_TR NULL -#define OPTION_VAL_330_TR NULL -#define OPTION_VAL_340_TR NULL -#define OPTION_VAL_350_TR NULL -#define OPTION_VAL_360_TR NULL -#define OPTION_VAL_370_TR NULL -#define OPTION_VAL_380_TR NULL -#define OPTION_VAL_390_TR NULL -#define OPTION_VAL_400_TR NULL -#define OPTION_VAL_410_TR NULL -#define OPTION_VAL_420_TR NULL -#define OPTION_VAL_430_TR NULL -#define OPTION_VAL_440_TR NULL -#define OPTION_VAL_450_TR NULL -#define OPTION_VAL_460_TR NULL -#define OPTION_VAL_470_TR NULL -#define OPTION_VAL_480_TR NULL -#define OPTION_VAL_490_TR NULL -#define OPTION_VAL_500_TR NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TR "Özel Dokular Yükle" -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TR "Dokuları Sakla" -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TR "Analog Çubuğu Ölü Bölge" -#define OPTION_VAL_0_TR "%0" -#define OPTION_VAL_5_TR "%5" -#define OPTION_VAL_10_TR "%10" -#define OPTION_VAL_15_TR "%15" -#define OPTION_VAL_20_TR "%20" -#define OPTION_VAL_25_TR "%25" -#define OPTION_VAL_30_TR "%30" -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TR "Tetik Ölü Bölge" -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TR "Dijital Tetikleyiciler" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_TR "Purupuru Paketi/Titreşim Paketi" -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_TR "Kontrolcü için zorla titreşimi etkinleştirir." -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TR "Yayın Dijital Çıkışları" -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TR "TCP port 8000'de dijital çıkışları ve zorla geri bildirim durumunu yayınlayın. \"-output network\" MAME seçeneğiyle uyumludur." -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TR "Light Gun Ayarlarını Göster" -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TR "Light gun artı gösterge seçeneklerinin yapılandırılmasını etkinleştirin. NOT: Bu ayarın etkili olması için Hızlı Menü'nün değiştirilmesi gerekebilir." -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 1 Görüntüle" -#define OPTION_VAL_WHITE_TR "Beyaz" -#define OPTION_VAL_RED_TR "Kırmızı" -#define OPTION_VAL_GREEN_TR "Yeşil" -#define OPTION_VAL_BLUE_TR "Mavi" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 2 Görüntüle" -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 3 Görüntüle" -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TR "Silah Artı Göstergesi 4 Görüntüle" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TR "Oyun Başına Görsel Bellek Birimleri/Sistemleri (VMU)" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TR "Oyun Başına VMU" -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TR "Devre dışı bırakıldığında, tüm oyunlar RetroArch sistem dizininde bulunan 4 VMU kayıt dosyasını (A1, B1, C1, D1) paylaşır. 'VMU A1' ayarı, başlatılan her oyun için RetroArch kayıt dizininde benzersiz bir VMU 'A1' dosyası oluşturur. 'Tüm VMU'' ayarı, başlatılan her oyun için 4 benzersiz VMU dosyası (A1, B1, C1, D1) oluşturur." -#define OPTION_VAL_VMU_A1_TR NULL -#define OPTION_VAL_ALL_VMUS_TR "Tüm VMU" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_TR "Görsel Bellek Birimleri/Sistemleri (VMU) Sesleri" -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TR "VMU Sesleri" -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_TR "Etkinleştirildiğinde VMU bip sesleri oynatılır." -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TR "Görsel Bellek Birimi/Sistem (VMU) Görüntü Ayarlarını Göster" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TR "VMU Görüntü Ayarlarını Göster" -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TR "Taklit edilmiş VMU LCD ekran görünürlüğünün, boyutunun, konumunun ve renginin yapılandırılmasını etkinleştirin. NOT: Bu ayarın etkili olması için Hızlı Menü'nün değiştirilmesi gerekebilir." -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 1 Görüntüle" -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TR "VMU Ekranı 1 Pozisyon" -#define OPTION_VAL_UPPER_LEFT_TR "Sol Üst" -#define OPTION_VAL_UPPER_RIGHT_TR "Sağ Üst" -#define OPTION_VAL_LOWER_LEFT_TR "Sol Alt" -#define OPTION_VAL_LOWER_RIGHT_TR "Sağ Alt" -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 1 Boyutu" -#define OPTION_VAL_1X_TR NULL -#define OPTION_VAL_3X_TR NULL -#define OPTION_VAL_5X_TR NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 1 Piksel Açık Renkli" -#define OPTION_VAL_DEFAULT_ON_00_TR "Varsayılan AÇIK" -#define OPTION_VAL_DEFAULT_OFF_01_TR "Varsayılan KAPALI" -#define OPTION_VAL_BLACK_02_TR "Siyah" -#define OPTION_VAL_LIGHT_BLUE_04_TR "Açık Mavi" -#define OPTION_VAL_CYAN_06_TR "Camgöbeği" -#define OPTION_VAL_CYAN_BLUE_07_TR "Camgöbeği Mavi" -#define OPTION_VAL_LIGHT_GREEN_08_TR "Açık Yeşil" -#define OPTION_VAL_CYAN_GREEN_09_TR "Camgöbeği Yeşil" -#define OPTION_VAL_LIGHT_CYAN_10_TR "Açık Camgöbeği" -#define OPTION_VAL_PURPLE_12_TR "Mor" -#define OPTION_VAL_LIGHT_PURPLE_13_TR "Açık Mor" -#define OPTION_VAL_YELLOW_14_TR "Sarı" -#define OPTION_VAL_GRAY_15_TR "Gri" -#define OPTION_VAL_LIGHT_PURPLE_2_16_TR "Açık Mor (2)" -#define OPTION_VAL_LIGHT_GREEN_2_17_TR "Açık Yeşil (2)" -#define OPTION_VAL_LIGHT_GREEN_3_18_TR "Açık Yeşil (3)" -#define OPTION_VAL_LIGHT_CYAN_2_19_TR "Açık Camgöbeği (2)" -#define OPTION_VAL_LIGHT_RED_2_20_TR "Açık Kırmızı (2)" -#define OPTION_VAL_MAGENTA_21_TR "Eflatun" -#define OPTION_VAL_LIGHT_PURPLE_3_22_TR "Açık Mor (3)" -#define OPTION_VAL_LIGHT_ORANGE_23_TR "Açık Turuncu" -#define OPTION_VAL_ORANGE_24_TR "Turuncu" -#define OPTION_VAL_LIGHT_PURPLE_4_25_TR "Açık Mor (4)" -#define OPTION_VAL_LIGHT_YELLOW_26_TR "Açık Sarı" -#define OPTION_VAL_LIGHT_YELLOW_2_27_TR "Açık Sarı (2)" -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 1 Piksel Kapalı Renk" -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 1 Şeffaflığı" -#define OPTION_VAL_40_TR "%40" -#define OPTION_VAL_50_TR "%50" -#define OPTION_VAL_60_TR "%60" -#define OPTION_VAL_70_TR "%70" -#define OPTION_VAL_80_TR "%80" -#define OPTION_VAL_90_TR "%90" -#define OPTION_VAL_100_O57_TR "%100" -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 2 Görüntüle" -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TR "VMU Ekranı 2 Pozisyon" -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 2 Boyut" -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 2 Piksel Açık Renkli" -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 2 Piksel Kapalı Renk" -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 2 Şeffaflığı" -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 3 Görüntüle" -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TR "VMU Ekranı 3 Pozisyon" -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 3 Boyut" -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 3 Piksel Açık Renkli" -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 3 Piksel Kapalı Renk" -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 3 Şeffaflığı" -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TR "VMU Ekranı 4 Görüntüle" -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TR "VMU Ekranı 4 Pozisyon" -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TR "VMU Ekranı 4 Boyut" -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TR "VMU Ekranı 4 Piksel Açık Renkli" -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TR "VMU Ekranı 4 Piksel Kapalı Renk" -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TR "VMU Ekranı 4 Şeffaflığı" + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu4_pixel_off_color", + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TR, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, + { "BLACK 02", OPTION_VAL_BLACK_02_TR }, + { "BLUE 03", OPTION_VAL_BLUE_TR }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, + { "GREEN 05", OPTION_VAL_GREEN_TR }, + { "CYAN 06", OPTION_VAL_CYAN_06_TR }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, + { "RED 11", OPTION_VAL_RED_TR }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, + { "GRAY 15", OPTION_VAL_GRAY_15_TR }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, + { "WHITE 28", OPTION_VAL_WHITE_TR }, + { NULL, NULL }, + }, + "DEFAULT_OFF 01", + }, + { + CORE_OPTION_NAME "_vmu4_screen_opacity", + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TR, + NULL, + "", + NULL, + "vmu", + { + { "10%", OPTION_VAL_10_TR }, + { "20%", OPTION_VAL_20_TR }, + { "30%", OPTION_VAL_30_TR }, + { "40%", OPTION_VAL_40_TR }, + { "50%", OPTION_VAL_50_TR }, + { "60%", OPTION_VAL_60_TR }, + { "70%", OPTION_VAL_70_TR }, + { "80%", OPTION_VAL_80_TR }, + { "90%", OPTION_VAL_90_TR }, + { "100%", OPTION_VAL_100_O45_TR }, + { NULL, NULL }, + }, + "100%", + }, + { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, +}; +struct retro_core_options_v2 options_tr = { + option_cats_tr, + option_defs_tr +}; -struct retro_core_option_v2_category option_cats_tr[] = { +/* RETRO_LANGUAGE_TT */ + +#define CATEGORY_SYSTEM_LABEL_TT NULL +#define CATEGORY_SYSTEM_INFO_0_TT NULL +#define CATEGORY_VIDEO_LABEL_TT "Видео" +#define CATEGORY_VIDEO_INFO_0_TT NULL +#define CATEGORY_PERFORMANCE_LABEL_TT NULL +#define CATEGORY_PERFORMANCE_INFO_0_TT NULL +#define CATEGORY_HACKS_LABEL_TT NULL +#define CATEGORY_HACKS_INFO_0_TT NULL +#define CATEGORY_INPUT_LABEL_TT NULL +#define CATEGORY_INPUT_INFO_0_TT NULL +#define CATEGORY_EXPANSIONS_LABEL_TT NULL +#define CATEGORY_EXPANSIONS_INFO_0_TT NULL +#define CATEGORY_VMU_LABEL_TT NULL +#define CATEGORY_VMU_INFO_0_TT NULL +#define CORE_OPTION_NAME_REGION_LABEL_TT NULL +#define OPTION_VAL_JAPAN_TT NULL +#define OPTION_VAL_USA_TT NULL +#define OPTION_VAL_EUROPE_TT "Аурупа" +#define OPTION_VAL_DEFAULT_TT NULL +#define CORE_OPTION_NAME_LANGUAGE_LABEL_TT "Тел" +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_TT NULL +#define OPTION_VAL_JAPANESE_TT "Япоча" +#define OPTION_VAL_ENGLISH_TT "Инглизчә" +#define OPTION_VAL_GERMAN_TT "Алманча" +#define OPTION_VAL_FRENCH_TT "Французча" +#define OPTION_VAL_SPANISH_TT "Испанча" +#define OPTION_VAL_ITALIAN_TT "Итальянча" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_TT NULL +#define CORE_OPTION_NAME_HLE_BIOS_INFO_0_TT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TT NULL +#define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_LABEL_TT NULL +#define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TT NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TT NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_TT NULL +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TT NULL +#define CORE_OPTION_NAME_UPNP_LABEL_TT NULL +#define CORE_OPTION_NAME_UPNP_INFO_0_TT NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TT NULL +#define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TT NULL +#define OPTION_VAL_320X240_TT NULL +#define OPTION_VAL_640X480_TT NULL +#define OPTION_VAL_800X600_TT NULL +#define OPTION_VAL_960X720_TT NULL +#define OPTION_VAL_1024X768_TT NULL +#define OPTION_VAL_1280X960_TT NULL +#define OPTION_VAL_1440X1080_TT NULL +#define OPTION_VAL_1600X1200_TT NULL +#define OPTION_VAL_1920X1440_TT NULL +#define OPTION_VAL_2560X1920_TT NULL +#define OPTION_VAL_2880X2160_TT NULL +#define OPTION_VAL_3200X2400_TT NULL +#define OPTION_VAL_3840X2880_TT NULL +#define OPTION_VAL_4480X3360_TT NULL +#define OPTION_VAL_5120X3840_TT NULL +#define OPTION_VAL_5760X4320_TT NULL +#define OPTION_VAL_6400X4800_TT NULL +#define OPTION_VAL_7040X5280_TT NULL +#define OPTION_VAL_7680X5760_TT NULL +#define OPTION_VAL_8320X6240_TT NULL +#define OPTION_VAL_8960X6720_TT NULL +#define OPTION_VAL_9600X7200_TT NULL +#define OPTION_VAL_10240X7680_TT NULL +#define OPTION_VAL_10880X8160_TT NULL +#define OPTION_VAL_11520X8640_TT NULL +#define OPTION_VAL_12160X9120_TT NULL +#define OPTION_VAL_12800X9600_TT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_TT NULL +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TT NULL +#define OPTION_VAL_VGA_TT NULL +#define OPTION_VAL_TV_RGB_TT "ТВ (RGB)" +#define OPTION_VAL_TV_COMPOSITE_TT NULL +#define CORE_OPTION_NAME_BROADCAST_LABEL_TT NULL +#define OPTION_VAL_NTSC_TT NULL +#define OPTION_VAL_PAL_TT NULL +#define OPTION_VAL_PAL_N_TT NULL +#define OPTION_VAL_PAL_M_TT NULL +#define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TT NULL +#define OPTION_VAL_HORIZONTAL_TT NULL +#define OPTION_VAL_VERTICAL_TT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TT NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_TT NULL +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TT NULL +#define OPTION_VAL_PER_TRIANGLE_NORMAL_TT NULL +#define OPTION_VAL_PER_PIXEL_ACCURATE_TT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TT NULL +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TT NULL +#define OPTION_VAL_512MB_TT NULL +#define OPTION_VAL_1GB_TT "1 Гб" +#define OPTION_VAL_2GB_TT "2 Гб" +#define OPTION_VAL_4GB_TT "4 Гб" +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_TT NULL +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TT NULL +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TT NULL +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TT NULL +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_TT NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_TT NULL +#define CORE_OPTION_NAME_FOG_LABEL_TT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TT NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TT NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TT NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TT NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TT NULL +#define OPTION_VAL_1_TT NULL +#define OPTION_VAL_2_TT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TT NULL +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TT NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TT NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TT NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TT NULL +#define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_LABEL_TT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TT NULL +#define OPTION_VAL_2_O26_TT NULL +#define OPTION_VAL_4_TT NULL +#define OPTION_VAL_6_TT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TT NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_TT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TT NULL +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_TT NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_TT NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TT NULL +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TT NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TT NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TT NULL +#define OPTION_VAL_SOME_TT "Нормаль" +#define OPTION_VAL_MORE_TT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TT NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TT NULL +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TT NULL +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TT NULL +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_TT NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_TT NULL +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_TT NULL +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_TT NULL +#define OPTION_VAL_100_TT "100 МГц" +#define OPTION_VAL_110_TT "110 МГц" +#define OPTION_VAL_120_TT "120 МГц" +#define OPTION_VAL_130_TT "130 МГц" +#define OPTION_VAL_140_TT "140 МГц" +#define OPTION_VAL_150_TT "150 МГц" +#define OPTION_VAL_160_TT "160 МГц" +#define OPTION_VAL_170_TT "170 МГц" +#define OPTION_VAL_180_TT "180 МГц" +#define OPTION_VAL_190_TT "190 МГц" +#define OPTION_VAL_200_TT "200 МГц" +#define OPTION_VAL_210_TT "210 МГц" +#define OPTION_VAL_220_TT "220 МГц" +#define OPTION_VAL_230_TT "230 МГц" +#define OPTION_VAL_240_TT "240 МГц" +#define OPTION_VAL_250_TT "250 МГц" +#define OPTION_VAL_260_TT "260 МГц" +#define OPTION_VAL_270_TT "270 МГц" +#define OPTION_VAL_280_TT "280 МГц" +#define OPTION_VAL_290_TT "290 МГц" +#define OPTION_VAL_300_TT "300 МГц" +#define OPTION_VAL_310_TT "310 МГц" +#define OPTION_VAL_320_TT "320 МГц" +#define OPTION_VAL_330_TT "330 МГц" +#define OPTION_VAL_340_TT "340 МГц" +#define OPTION_VAL_350_TT "350 МГц" +#define OPTION_VAL_360_TT "360 МГц" +#define OPTION_VAL_370_TT "370 МГц" +#define OPTION_VAL_380_TT "380 МГц" +#define OPTION_VAL_390_TT "390 МГц" +#define OPTION_VAL_400_TT "400 МГц" +#define OPTION_VAL_410_TT "410 МГц" +#define OPTION_VAL_420_TT "420 МГц" +#define OPTION_VAL_430_TT "430 МГц" +#define OPTION_VAL_440_TT "440 МГц" +#define OPTION_VAL_450_TT "450 МГц" +#define OPTION_VAL_460_TT "460 МГц" +#define OPTION_VAL_470_TT "470 МГц" +#define OPTION_VAL_480_TT "480 МГц" +#define OPTION_VAL_490_TT "490 МГц" +#define OPTION_VAL_500_TT "500 МГц" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TT NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_TT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TT NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_TT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TT NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_TT NULL +#define OPTION_VAL_0_TT NULL +#define OPTION_VAL_5_TT NULL +#define OPTION_VAL_10_TT NULL +#define OPTION_VAL_15_TT NULL +#define OPTION_VAL_20_TT NULL +#define OPTION_VAL_25_TT NULL +#define OPTION_VAL_30_TT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TT NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_TT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TT NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_TT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TT NULL +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TT NULL +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TT NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_TT NULL +#define OPTION_VAL_50_TT NULL +#define OPTION_VAL_60_TT NULL +#define OPTION_VAL_70_TT NULL +#define OPTION_VAL_80_TT NULL +#define OPTION_VAL_90_TT NULL +#define OPTION_VAL_100_O45_TT NULL +#define OPTION_VAL_110_O45_TT NULL +#define OPTION_VAL_120_O45_TT NULL +#define OPTION_VAL_130_O45_TT NULL +#define OPTION_VAL_140_O45_TT NULL +#define OPTION_VAL_150_O45_TT NULL +#define OPTION_VAL_160_O45_TT NULL +#define OPTION_VAL_170_O45_TT NULL +#define OPTION_VAL_180_O45_TT NULL +#define OPTION_VAL_190_O45_TT NULL +#define OPTION_VAL_200_O45_TT NULL +#define OPTION_VAL_210_O45_TT NULL +#define OPTION_VAL_220_O45_TT NULL +#define OPTION_VAL_230_O45_TT NULL +#define OPTION_VAL_240_O45_TT NULL +#define OPTION_VAL_250_O45_TT NULL +#define OPTION_VAL_260_O45_TT NULL +#define OPTION_VAL_270_O45_TT NULL +#define OPTION_VAL_280_O45_TT NULL +#define OPTION_VAL_290_O45_TT NULL +#define OPTION_VAL_300_O45_TT NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TT NULL +#define OPTION_VAL_WHITE_TT "Ак" +#define OPTION_VAL_RED_TT "Кызыл" +#define OPTION_VAL_GREEN_TT NULL +#define OPTION_VAL_BLUE_TT NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TT NULL +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TT NULL +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_TT NULL +#define OPTION_VAL_VMU_TT NULL +#define OPTION_VAL_PURUPURU_TT NULL +#define OPTION_VAL_NONE_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_TT NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_TT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TT NULL +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TT NULL +#define OPTION_VAL_VMU_A1_TT NULL +#define OPTION_VAL_ALL_VMUS_TT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TT NULL +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_TT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TT NULL +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TT NULL +#define OPTION_VAL_UPPER_LEFT_TT NULL +#define OPTION_VAL_UPPER_RIGHT_TT NULL +#define OPTION_VAL_LOWER_LEFT_TT NULL +#define OPTION_VAL_LOWER_RIGHT_TT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TT NULL +#define OPTION_VAL_1X_TT NULL +#define OPTION_VAL_3X_TT NULL +#define OPTION_VAL_5X_TT NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TT NULL +#define OPTION_VAL_DEFAULT_ON_00_TT NULL +#define OPTION_VAL_DEFAULT_OFF_01_TT NULL +#define OPTION_VAL_BLACK_02_TT "Кара" +#define OPTION_VAL_LIGHT_BLUE_04_TT NULL +#define OPTION_VAL_CYAN_06_TT NULL +#define OPTION_VAL_CYAN_BLUE_07_TT NULL +#define OPTION_VAL_LIGHT_GREEN_08_TT NULL +#define OPTION_VAL_CYAN_GREEN_09_TT NULL +#define OPTION_VAL_LIGHT_CYAN_10_TT NULL +#define OPTION_VAL_PURPLE_12_TT NULL +#define OPTION_VAL_LIGHT_PURPLE_13_TT NULL +#define OPTION_VAL_YELLOW_14_TT NULL +#define OPTION_VAL_GRAY_15_TT NULL +#define OPTION_VAL_LIGHT_PURPLE_2_16_TT NULL +#define OPTION_VAL_LIGHT_GREEN_2_17_TT NULL +#define OPTION_VAL_LIGHT_GREEN_3_18_TT NULL +#define OPTION_VAL_LIGHT_CYAN_2_19_TT NULL +#define OPTION_VAL_LIGHT_RED_2_20_TT NULL +#define OPTION_VAL_MAGENTA_21_TT NULL +#define OPTION_VAL_LIGHT_PURPLE_3_22_TT NULL +#define OPTION_VAL_LIGHT_ORANGE_23_TT NULL +#define OPTION_VAL_ORANGE_24_TT NULL +#define OPTION_VAL_LIGHT_PURPLE_4_25_TT NULL +#define OPTION_VAL_LIGHT_YELLOW_26_TT NULL +#define OPTION_VAL_LIGHT_YELLOW_2_27_TT NULL +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TT NULL +#define OPTION_VAL_40_TT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TT NULL +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TT NULL + +struct retro_core_option_v2_category option_cats_tt[] = { { "system", - CATEGORY_SYSTEM_LABEL_TR, - CATEGORY_SYSTEM_INFO_0_TR + CATEGORY_SYSTEM_LABEL_TT, + CATEGORY_SYSTEM_INFO_0_TT }, { "video", - CATEGORY_VIDEO_LABEL_TR, - CATEGORY_VIDEO_INFO_0_TR + CATEGORY_VIDEO_LABEL_TT, + CATEGORY_VIDEO_INFO_0_TT }, { "performance", - CATEGORY_PERFORMANCE_LABEL_TR, - CATEGORY_PERFORMANCE_INFO_0_TR + CATEGORY_PERFORMANCE_LABEL_TT, + CATEGORY_PERFORMANCE_INFO_0_TT }, { "hacks", - CATEGORY_HACKS_LABEL_TR, - CATEGORY_HACKS_INFO_0_TR + CATEGORY_HACKS_LABEL_TT, + CATEGORY_HACKS_INFO_0_TT }, { "input", - CATEGORY_INPUT_LABEL_TR, - CATEGORY_INPUT_INFO_0_TR + CATEGORY_INPUT_LABEL_TT, + CATEGORY_INPUT_INFO_0_TT + }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_TT, + CATEGORY_EXPANSIONS_INFO_0_TT }, { "vmu", - CATEGORY_VMU_LABEL_TR, - CATEGORY_VMU_INFO_0_TR + CATEGORY_VMU_LABEL_TT, + CATEGORY_VMU_INFO_0_TT }, { NULL, NULL, NULL }, }; -struct retro_core_option_v2_definition option_defs_tr[] = { +struct retro_core_option_v2_definition option_defs_tt[] = { { CORE_OPTION_NAME "_region", - CORE_OPTION_NAME_REGION_LABEL_TR, + CORE_OPTION_NAME_REGION_LABEL_TT, NULL, "", NULL, "system", { - { "Japan", OPTION_VAL_JAPAN_TR }, - { "USA", OPTION_VAL_USA_TR }, - { "Europe", OPTION_VAL_EUROPE_TR }, - { "Default", OPTION_VAL_DEFAULT_TR }, + { "Japan", OPTION_VAL_JAPAN_TT }, + { "USA", OPTION_VAL_USA_TT }, + { "Europe", OPTION_VAL_EUROPE_TT }, + { "Default", OPTION_VAL_DEFAULT_TT }, { NULL, NULL }, }, "USA", }, { CORE_OPTION_NAME "_language", - CORE_OPTION_NAME_LANGUAGE_LABEL_TR, + CORE_OPTION_NAME_LANGUAGE_LABEL_TT, NULL, - CORE_OPTION_NAME_LANGUAGE_INFO_0_TR, + CORE_OPTION_NAME_LANGUAGE_INFO_0_TT, NULL, "system", { - { "Japanese", OPTION_VAL_JAPANESE_TR }, - { "English", OPTION_VAL_ENGLISH_TR }, - { "German", OPTION_VAL_GERMAN_TR }, - { "French", OPTION_VAL_FRENCH_TR }, - { "Spanish", OPTION_VAL_SPANISH_TR }, - { "Italian", OPTION_VAL_ITALIAN_TR }, - { "Default", OPTION_VAL_DEFAULT_TR }, + { "Japanese", OPTION_VAL_JAPANESE_TT }, + { "English", OPTION_VAL_ENGLISH_TT }, + { "German", OPTION_VAL_GERMAN_TT }, + { "French", OPTION_VAL_FRENCH_TT }, + { "Spanish", OPTION_VAL_SPANISH_TT }, + { "Italian", OPTION_VAL_ITALIAN_TT }, + { "Default", OPTION_VAL_DEFAULT_TT }, { NULL, NULL }, }, "English", }, { CORE_OPTION_NAME "_hle_bios", - CORE_OPTION_NAME_HLE_BIOS_LABEL_TR, + CORE_OPTION_NAME_HLE_BIOS_LABEL_TT, NULL, - CORE_OPTION_NAME_HLE_BIOS_INFO_0_TR, + CORE_OPTION_NAME_HLE_BIOS_INFO_0_TT, NULL, "system", { @@ -63388,9 +74959,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_boot_to_bios", - CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TR, + CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_TT, NULL, - CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TR, + CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_TT, NULL, "system", { @@ -63402,9 +74973,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_enable_dsp", - CORE_OPTION_NAME_ENABLE_DSP_LABEL_TR, + CORE_OPTION_NAME_ENABLE_DSP_LABEL_TT, NULL, - CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TR, + CORE_OPTION_NAME_ENABLE_DSP_INFO_0_TT, NULL, "system", { @@ -63418,25 +74989,11 @@ struct retro_core_option_v2_definition option_defs_tr[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_TR, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_TR, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_TT, NULL, - CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TR, + CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_TT, NULL, "system", { @@ -63448,9 +75005,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_force_freeplay", - CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TR, + CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_TT, NULL, - CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TR, + CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_TT, NULL, "system", { @@ -63462,9 +75019,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_emulate_bba", - CORE_OPTION_NAME_EMULATE_BBA_LABEL_TR, + CORE_OPTION_NAME_EMULATE_BBA_LABEL_TT, NULL, - CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TR, + CORE_OPTION_NAME_EMULATE_BBA_INFO_0_TT, NULL, "system", { @@ -63476,9 +75033,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_upnp", - CORE_OPTION_NAME_UPNP_LABEL_TR, + CORE_OPTION_NAME_UPNP_LABEL_TT, NULL, - CORE_OPTION_NAME_UPNP_INFO_0_TR, + CORE_OPTION_NAME_UPNP_INFO_0_TT, NULL, "system", { @@ -63491,39 +75048,39 @@ struct retro_core_option_v2_definition option_defs_tr[] = { { CORE_OPTION_NAME "_internal_resolution", - CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TR, - NULL, - CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TR, - NULL, - "video", - { - { "320x240", OPTION_VAL_320X240_TR }, - { "640x480", OPTION_VAL_640X480_TR }, - { "800x600", OPTION_VAL_800X600_TR }, - { "960x720", OPTION_VAL_960X720_TR }, - { "1024x768", OPTION_VAL_1024X768_TR }, - { "1280x960", OPTION_VAL_1280X960_TR }, - { "1440x1080", OPTION_VAL_1440X1080_TR }, - { "1600x1200", OPTION_VAL_1600X1200_TR }, - { "1920x1440", OPTION_VAL_1920X1440_TR }, - { "2560x1920", OPTION_VAL_2560X1920_TR }, - { "2880x2160", OPTION_VAL_2880X2160_TR }, - { "3200x2400", OPTION_VAL_3200X2400_TR }, - { "3840x2880", OPTION_VAL_3840X2880_TR }, - { "4480x3360", OPTION_VAL_4480X3360_TR }, - { "5120x3840", OPTION_VAL_5120X3840_TR }, - { "5760x4320", OPTION_VAL_5760X4320_TR }, - { "6400x4800", OPTION_VAL_6400X4800_TR }, - { "7040x5280", OPTION_VAL_7040X5280_TR }, - { "7680x5760", OPTION_VAL_7680X5760_TR }, - { "8320x6240", OPTION_VAL_8320X6240_TR }, - { "8960x6720", OPTION_VAL_8960X6720_TR }, - { "9600x7200", OPTION_VAL_9600X7200_TR }, - { "10240x7680", OPTION_VAL_10240X7680_TR }, - { "10880x8160", OPTION_VAL_10880X8160_TR }, - { "11520x8640", OPTION_VAL_11520X8640_TR }, - { "12160x9120", OPTION_VAL_12160X9120_TR }, - { "12800x9600", OPTION_VAL_12800X9600_TR }, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_TT, + NULL, + CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_TT, + NULL, + "video", + { + { "320x240", OPTION_VAL_320X240_TT }, + { "640x480", OPTION_VAL_640X480_TT }, + { "800x600", OPTION_VAL_800X600_TT }, + { "960x720", OPTION_VAL_960X720_TT }, + { "1024x768", OPTION_VAL_1024X768_TT }, + { "1280x960", OPTION_VAL_1280X960_TT }, + { "1440x1080", OPTION_VAL_1440X1080_TT }, + { "1600x1200", OPTION_VAL_1600X1200_TT }, + { "1920x1440", OPTION_VAL_1920X1440_TT }, + { "2560x1920", OPTION_VAL_2560X1920_TT }, + { "2880x2160", OPTION_VAL_2880X2160_TT }, + { "3200x2400", OPTION_VAL_3200X2400_TT }, + { "3840x2880", OPTION_VAL_3840X2880_TT }, + { "4480x3360", OPTION_VAL_4480X3360_TT }, + { "5120x3840", OPTION_VAL_5120X3840_TT }, + { "5760x4320", OPTION_VAL_5760X4320_TT }, + { "6400x4800", OPTION_VAL_6400X4800_TT }, + { "7040x5280", OPTION_VAL_7040X5280_TT }, + { "7680x5760", OPTION_VAL_7680X5760_TT }, + { "8320x6240", OPTION_VAL_8320X6240_TT }, + { "8960x6720", OPTION_VAL_8960X6720_TT }, + { "9600x7200", OPTION_VAL_9600X7200_TT }, + { "10240x7680", OPTION_VAL_10240X7680_TT }, + { "10880x8160", OPTION_VAL_10880X8160_TT }, + { "11520x8640", OPTION_VAL_11520X8640_TT }, + { "12160x9120", OPTION_VAL_12160X9120_TT }, + { "12800x9600", OPTION_VAL_12800X9600_TT }, { NULL, NULL }, }, #ifdef LOW_RES @@ -63534,62 +75091,62 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_cable_type", - CORE_OPTION_NAME_CABLE_TYPE_LABEL_TR, + CORE_OPTION_NAME_CABLE_TYPE_LABEL_TT, NULL, - CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TR, + CORE_OPTION_NAME_CABLE_TYPE_INFO_0_TT, NULL, "video", { - { "VGA", OPTION_VAL_VGA_TR }, - { "TV (RGB)", OPTION_VAL_TV_RGB_TR }, - { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_TR }, + { "VGA", OPTION_VAL_VGA_TT }, + { "TV (RGB)", OPTION_VAL_TV_RGB_TT }, + { "TV (Composite)", OPTION_VAL_TV_COMPOSITE_TT }, { NULL, NULL }, }, "TV (Composite)", }, { CORE_OPTION_NAME "_broadcast", - CORE_OPTION_NAME_BROADCAST_LABEL_TR, + CORE_OPTION_NAME_BROADCAST_LABEL_TT, NULL, "", NULL, "video", { - { "NTSC", OPTION_VAL_NTSC_TR }, - { "PAL", OPTION_VAL_PAL_TR }, - { "PAL_N", OPTION_VAL_PAL_N_TR }, - { "PAL_M", OPTION_VAL_PAL_M_TR }, - { "Default", OPTION_VAL_DEFAULT_TR }, + { "NTSC", OPTION_VAL_NTSC_TT }, + { "PAL", OPTION_VAL_PAL_TT }, + { "PAL_N", OPTION_VAL_PAL_N_TT }, + { "PAL_M", OPTION_VAL_PAL_M_TT }, + { "Default", OPTION_VAL_DEFAULT_TT }, { NULL, NULL }, }, "NTSC", }, { CORE_OPTION_NAME "_screen_rotation", - CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TR, + CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_TT, NULL, "", NULL, "video", { - { "horizontal", OPTION_VAL_HORIZONTAL_TR }, - { "vertical", OPTION_VAL_VERTICAL_TR }, + { "horizontal", OPTION_VAL_HORIZONTAL_TT }, + { "vertical", OPTION_VAL_VERTICAL_TT }, { NULL, NULL }, }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", - CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TR, + CORE_OPTION_NAME_ALPHA_SORTING_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_TT, NULL, "video", { - { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TR }, - { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_TR }, + { "per-strip (fast, least accurate)", OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_TT }, + { "per-triangle (normal)", OPTION_VAL_PER_TRIANGLE_NORMAL_TT }, #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) - { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_TR }, + { "per-pixel (accurate)", OPTION_VAL_PER_PIXEL_ACCURATE_TT }, #endif { NULL, NULL }, }, @@ -63602,25 +75159,25 @@ struct retro_core_option_v2_definition option_defs_tr[] = { #if defined(HAVE_OIT) || defined(HAVE_VULKAN) || defined(HAVE_D3D11) { CORE_OPTION_NAME "_oit_abuffer_size", - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_TT, NULL, - CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TR, + CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_TT, NULL, "video", { - { "512MB", OPTION_VAL_512MB_TR }, - { "1GB", OPTION_VAL_1GB_TR }, - { "2GB", OPTION_VAL_2GB_TR }, - { "4GB", OPTION_VAL_4GB_TR }, + { "512MB", OPTION_VAL_512MB_TT }, + { "1GB", OPTION_VAL_1GB_TT }, + { "2GB", OPTION_VAL_2GB_TT }, + { "4GB", OPTION_VAL_4GB_TT }, { NULL, NULL }, }, "512MB", }, { CORE_OPTION_NAME "_oit_layers", - CORE_OPTION_NAME_OIT_LAYERS_LABEL_TR, + CORE_OPTION_NAME_OIT_LAYERS_LABEL_TT, NULL, - CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TR, + CORE_OPTION_NAME_OIT_LAYERS_INFO_0_TT, NULL, "video", { @@ -63628,6 +75185,7 @@ struct retro_core_option_v2_definition option_defs_tr[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -63636,9 +75194,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { #endif { CORE_OPTION_NAME "_emulate_framebuffer", - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_TT, NULL, - CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TR, + CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_TT, NULL, "video", { @@ -63650,9 +75208,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, {/* TODO: needs explanation */ CORE_OPTION_NAME "_enable_rttb", - CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TR, + CORE_OPTION_NAME_ENABLE_RTTB_LABEL_TT, NULL, - CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TR, + CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_TT, NULL, "video", { @@ -63662,11 +75220,11 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", - CORE_OPTION_NAME_MIPMAPPING_LABEL_TR, + CORE_OPTION_NAME_MIPMAPPING_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_TT, NULL, "video", { @@ -63678,7 +75236,7 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_fog", - CORE_OPTION_NAME_FOG_LABEL_TR, + CORE_OPTION_NAME_FOG_LABEL_TT, NULL, "", NULL, @@ -63692,9 +75250,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_volume_modifier_enable", - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_TT, NULL, - CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TR, + CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_TT, NULL, "video", { @@ -63706,9 +75264,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_anisotropic_filtering", - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_TT, NULL, - CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TR, + CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_TT, NULL, "video", { @@ -63723,24 +75281,24 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_texture_filtering", - CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TR, + CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_TT, NULL, - CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TR, + CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_TT, NULL, "video", { - { "0", OPTION_VAL_DEFAULT_TR }, - { "1", OPTION_VAL_1_TR }, - { "2", OPTION_VAL_2_TR }, + { "0", OPTION_VAL_DEFAULT_TT }, + { "1", OPTION_VAL_1_TT }, + { "2", OPTION_VAL_2_TT }, { NULL, NULL }, }, "0", }, { CORE_OPTION_NAME "_delay_frame_swapping", - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_TT, NULL, - CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TR, + CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_TT, NULL, "video", { @@ -63748,13 +75306,13 @@ struct retro_core_option_v2_definition option_defs_tr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_TT, NULL, - CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TR, + CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_TT, NULL, "video", { @@ -63766,9 +75324,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_pvr2_filtering", - CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TR, + CORE_OPTION_NAME_PVR2_FILTERING_LABEL_TT, NULL, - CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TR, + CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_TT, NULL, "video", { @@ -63781,25 +75339,25 @@ struct retro_core_option_v2_definition option_defs_tr[] = { #ifdef _OPENMP { CORE_OPTION_NAME "_texupscale", - CORE_OPTION_NAME_TEXUPSCALE_LABEL_TR, + CORE_OPTION_NAME_TEXUPSCALE_LABEL_TT, NULL, - CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TR, + CORE_OPTION_NAME_TEXUPSCALE_INFO_0_TT, NULL, "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_TR }, - { "4", OPTION_VAL_4_TR }, - { "6", OPTION_VAL_6_TR }, + { "2", OPTION_VAL_2_O26_TT }, + { "4", OPTION_VAL_4_TT }, + { "6", OPTION_VAL_6_TT }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", - CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TR, + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_TT, NULL, "video", { @@ -63813,9 +75371,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { #endif { CORE_OPTION_NAME "_native_depth_interpolation", - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_TT, NULL, - CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TR, + CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_TT, NULL, "video", { @@ -63825,11 +75383,25 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_TT, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_TT, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", - CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TR, + CORE_OPTION_NAME_THREADED_RENDERING_LABEL_TT, NULL, - CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TR, + CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_TT, NULL, "performance", { @@ -63841,15 +75413,15 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_auto_skip_frame", - CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_TT, NULL, - CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TR, + CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_TT, NULL, "performance", { { "disabled", NULL }, - { "some", OPTION_VAL_SOME_TR }, - { "more", OPTION_VAL_MORE_TR }, + { "some", OPTION_VAL_SOME_TT }, + { "more", OPTION_VAL_MORE_TT }, { NULL, NULL }, }, #ifdef LOW_END @@ -63860,9 +75432,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_frame_skipping", - CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TR, + CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_TT, NULL, - CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TR, + CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_TT, NULL, "performance", { @@ -63879,9 +75451,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_widescreen_cheats", - CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_TT, NULL, - CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TR, + CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_TT, NULL, "hacks", { @@ -63893,9 +75465,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_widescreen_hack", - CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TR, + CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_TT, NULL, - CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TR, + CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_TT, NULL, "hacks", { @@ -63907,9 +75479,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_gdrom_fast_loading", - CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_TT, NULL, - CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TR, + CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_TT, NULL, "hacks", { @@ -63923,64 +75495,78 @@ struct retro_core_option_v2_definition option_defs_tr[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_TT, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_TT, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", - CORE_OPTION_NAME_SH4CLOCK_LABEL_TR, + CORE_OPTION_NAME_SH4CLOCK_LABEL_TT, NULL, - CORE_OPTION_NAME_SH4CLOCK_INFO_0_TR, + CORE_OPTION_NAME_SH4CLOCK_INFO_0_TT, NULL, "hacks", { - { "100", OPTION_VAL_100_TR }, - { "110", OPTION_VAL_110_TR }, - { "120", OPTION_VAL_120_TR }, - { "130", OPTION_VAL_130_TR }, - { "140", OPTION_VAL_140_TR }, - { "150", OPTION_VAL_150_TR }, - { "160", OPTION_VAL_160_TR }, - { "170", OPTION_VAL_170_TR }, - { "180", OPTION_VAL_180_TR }, - { "190", OPTION_VAL_190_TR }, - { "200", OPTION_VAL_200_TR }, - { "210", OPTION_VAL_210_TR }, - { "220", OPTION_VAL_220_TR }, - { "230", OPTION_VAL_230_TR }, - { "240", OPTION_VAL_240_TR }, - { "250", OPTION_VAL_250_TR }, - { "260", OPTION_VAL_260_TR }, - { "270", OPTION_VAL_270_TR }, - { "280", OPTION_VAL_280_TR }, - { "290", OPTION_VAL_290_TR }, - { "300", OPTION_VAL_300_TR }, - { "310", OPTION_VAL_310_TR }, - { "320", OPTION_VAL_320_TR }, - { "330", OPTION_VAL_330_TR }, - { "340", OPTION_VAL_340_TR }, - { "350", OPTION_VAL_350_TR }, - { "360", OPTION_VAL_360_TR }, - { "370", OPTION_VAL_370_TR }, - { "380", OPTION_VAL_380_TR }, - { "390", OPTION_VAL_390_TR }, - { "400", OPTION_VAL_400_TR }, - { "410", OPTION_VAL_410_TR }, - { "420", OPTION_VAL_420_TR }, - { "430", OPTION_VAL_430_TR }, - { "440", OPTION_VAL_440_TR }, - { "450", OPTION_VAL_450_TR }, - { "460", OPTION_VAL_460_TR }, - { "470", OPTION_VAL_470_TR }, - { "480", OPTION_VAL_480_TR }, - { "490", OPTION_VAL_490_TR }, - { "500", OPTION_VAL_500_TR }, + { "100", OPTION_VAL_100_TT }, + { "110", OPTION_VAL_110_TT }, + { "120", OPTION_VAL_120_TT }, + { "130", OPTION_VAL_130_TT }, + { "140", OPTION_VAL_140_TT }, + { "150", OPTION_VAL_150_TT }, + { "160", OPTION_VAL_160_TT }, + { "170", OPTION_VAL_170_TT }, + { "180", OPTION_VAL_180_TT }, + { "190", OPTION_VAL_190_TT }, + { "200", OPTION_VAL_200_TT }, + { "210", OPTION_VAL_210_TT }, + { "220", OPTION_VAL_220_TT }, + { "230", OPTION_VAL_230_TT }, + { "240", OPTION_VAL_240_TT }, + { "250", OPTION_VAL_250_TT }, + { "260", OPTION_VAL_260_TT }, + { "270", OPTION_VAL_270_TT }, + { "280", OPTION_VAL_280_TT }, + { "290", OPTION_VAL_290_TT }, + { "300", OPTION_VAL_300_TT }, + { "310", OPTION_VAL_310_TT }, + { "320", OPTION_VAL_320_TT }, + { "330", OPTION_VAL_330_TT }, + { "340", OPTION_VAL_340_TT }, + { "350", OPTION_VAL_350_TT }, + { "360", OPTION_VAL_360_TT }, + { "370", OPTION_VAL_370_TT }, + { "380", OPTION_VAL_380_TT }, + { "390", OPTION_VAL_390_TT }, + { "400", OPTION_VAL_400_TT }, + { "410", OPTION_VAL_410_TT }, + { "420", OPTION_VAL_420_TT }, + { "430", OPTION_VAL_430_TT }, + { "440", OPTION_VAL_440_TT }, + { "450", OPTION_VAL_450_TT }, + { "460", OPTION_VAL_460_TT }, + { "470", OPTION_VAL_470_TT }, + { "480", OPTION_VAL_480_TT }, + { "490", OPTION_VAL_490_TT }, + { "500", OPTION_VAL_500_TT }, { NULL, NULL }, }, "200", }, { CORE_OPTION_NAME "_custom_textures", - CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TR, + CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_TT, NULL, "hacks", { @@ -63990,11 +75576,11 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", - CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TR, + CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_TT, NULL, "hacks", { @@ -64006,47 +75592,47 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_analog_stick_deadzone", - CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TR, + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_TT, NULL, "input", { - { "0%", OPTION_VAL_0_TR }, - { "5%", OPTION_VAL_5_TR }, - { "10%", OPTION_VAL_10_TR }, - { "15%", OPTION_VAL_15_TR }, - { "20%", OPTION_VAL_20_TR }, - { "25%", OPTION_VAL_25_TR }, - { "30%", OPTION_VAL_30_TR }, + { "0%", OPTION_VAL_0_TT }, + { "5%", OPTION_VAL_5_TT }, + { "10%", OPTION_VAL_10_TT }, + { "15%", OPTION_VAL_15_TT }, + { "20%", OPTION_VAL_20_TT }, + { "25%", OPTION_VAL_25_TT }, + { "30%", OPTION_VAL_30_TT }, { NULL, NULL }, }, "15%", }, { CORE_OPTION_NAME "_trigger_deadzone", - CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TR, + CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_TT, NULL, "input", { - { "0%", OPTION_VAL_0_TR }, - { "5%", OPTION_VAL_5_TR }, - { "10%", OPTION_VAL_10_TR }, - { "15%", OPTION_VAL_15_TR }, - { "20%", OPTION_VAL_20_TR }, - { "25%", OPTION_VAL_25_TR }, - { "30%", OPTION_VAL_30_TR }, + { "0%", OPTION_VAL_0_TT }, + { "5%", OPTION_VAL_5_TT }, + { "10%", OPTION_VAL_10_TT }, + { "15%", OPTION_VAL_15_TT }, + { "20%", OPTION_VAL_20_TT }, + { "25%", OPTION_VAL_25_TT }, + { "30%", OPTION_VAL_30_TT }, { NULL, NULL }, }, "0%", }, { CORE_OPTION_NAME "_digital_triggers", - CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TR, + CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_TT, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_TT, NULL, "input", { @@ -64057,10 +75643,10 @@ struct retro_core_option_v2_definition option_defs_tr[] = { "disabled", }, { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_TR, + CORE_OPTION_NAME "_network_output", + CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TT, NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_TR, + CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TT, NULL, "input", { @@ -64068,124 +75654,268 @@ struct retro_core_option_v2_definition option_defs_tr[] = { { "enabled", NULL }, { NULL, NULL }, }, - "enabled", + "disabled", }, { - CORE_OPTION_NAME "_network_output", - CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_TR, + CORE_OPTION_NAME "_show_lightgun_settings", + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TT, NULL, - CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_TR, + CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TT, NULL, "input", { - { "disabled", NULL }, { "enabled", NULL }, - { NULL, NULL }, + { "disabled", NULL }, + { NULL, NULL}, }, - "disabled", + "disabled" }, { - CORE_OPTION_NAME "_show_lightgun_settings", - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_TR, + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_TT, NULL, - CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_TR, + "", NULL, "input", { - { "enabled", NULL }, - { "disabled", NULL }, - { NULL, NULL}, + { "50%", OPTION_VAL_50_TT }, + { "60%", OPTION_VAL_60_TT }, + { "70%", OPTION_VAL_70_TT }, + { "80%", OPTION_VAL_80_TT }, + { "90%", OPTION_VAL_90_TT }, + { "100%", OPTION_VAL_100_O45_TT }, + { "110%", OPTION_VAL_110_O45_TT }, + { "120%", OPTION_VAL_120_O45_TT }, + { "130%", OPTION_VAL_130_O45_TT }, + { "140%", OPTION_VAL_140_O45_TT }, + { "150%", OPTION_VAL_150_O45_TT }, + { "160%", OPTION_VAL_160_O45_TT }, + { "170%", OPTION_VAL_170_O45_TT }, + { "180%", OPTION_VAL_180_O45_TT }, + { "190%", OPTION_VAL_190_O45_TT }, + { "200%", OPTION_VAL_200_O45_TT }, + { "210%", OPTION_VAL_210_O45_TT }, + { "220%", OPTION_VAL_220_O45_TT }, + { "230%", OPTION_VAL_230_O45_TT }, + { "240%", OPTION_VAL_240_O45_TT }, + { "250%", OPTION_VAL_250_O45_TT }, + { "260%", OPTION_VAL_260_O45_TT }, + { "270%", OPTION_VAL_270_O45_TT }, + { "280%", OPTION_VAL_280_O45_TT }, + { "290%", OPTION_VAL_290_O45_TT }, + { "300%", OPTION_VAL_300_O45_TT }, + { NULL, NULL }, }, - "disabled" + "100%", }, { CORE_OPTION_NAME "_lightgun1_crosshair", - CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TR, + CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_TT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_TR }, - { "Red", OPTION_VAL_RED_TR }, - { "Green", OPTION_VAL_GREEN_TR }, - { "Blue", OPTION_VAL_BLUE_TR }, + { "White", OPTION_VAL_WHITE_TT }, + { "Red", OPTION_VAL_RED_TT }, + { "Green", OPTION_VAL_GREEN_TT }, + { "Blue", OPTION_VAL_BLUE_TT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun2_crosshair", - CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TR, + CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_TT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_TR }, - { "Red", OPTION_VAL_RED_TR }, - { "Green", OPTION_VAL_GREEN_TR }, - { "Blue", OPTION_VAL_BLUE_TR }, + { "White", OPTION_VAL_WHITE_TT }, + { "Red", OPTION_VAL_RED_TT }, + { "Green", OPTION_VAL_GREEN_TT }, + { "Blue", OPTION_VAL_BLUE_TT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun3_crosshair", - CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TR, + CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_TT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_TR }, - { "Red", OPTION_VAL_RED_TR }, - { "Green", OPTION_VAL_GREEN_TR }, - { "Blue", OPTION_VAL_BLUE_TR }, + { "White", OPTION_VAL_WHITE_TT }, + { "Red", OPTION_VAL_RED_TT }, + { "Green", OPTION_VAL_GREEN_TT }, + { "Blue", OPTION_VAL_BLUE_TT }, { NULL, NULL }, }, "disabled", }, { CORE_OPTION_NAME "_lightgun4_crosshair", - CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TR, + CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_TT, NULL, "", NULL, "input", { { "disabled", NULL }, - { "White", OPTION_VAL_WHITE_TR }, - { "Red", OPTION_VAL_RED_TR }, - { "Green", OPTION_VAL_GREEN_TR }, - { "Blue", OPTION_VAL_BLUE_TR }, + { "White", OPTION_VAL_WHITE_TT }, + { "Red", OPTION_VAL_RED_TT }, + { "Green", OPTION_VAL_GREEN_TT }, + { "Blue", OPTION_VAL_BLUE_TT }, { NULL, NULL }, }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_TT, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_TT, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_TT }, + { "Purupuru", OPTION_VAL_PURUPURU_TT }, + { "None", OPTION_VAL_NONE_TT }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TR, - CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TR, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_TT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_TT, + CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_TT, NULL, "vmu", { { "disabled", NULL }, - { "VMU A1", OPTION_VAL_VMU_A1_TR }, - { "All VMUs", OPTION_VAL_ALL_VMUS_TR }, + { "VMU A1", OPTION_VAL_VMU_A1_TT }, + { "All VMUs", OPTION_VAL_ALL_VMUS_TT }, { NULL, NULL}, }, "disabled", }, { CORE_OPTION_NAME "_vmu_sound", - CORE_OPTION_NAME_VMU_SOUND_LABEL_TR, - CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TR, - CORE_OPTION_NAME_VMU_SOUND_INFO_0_TR, + CORE_OPTION_NAME_VMU_SOUND_LABEL_TT, + CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_TT, + CORE_OPTION_NAME_VMU_SOUND_INFO_0_TT, NULL, "vmu", { @@ -64196,9 +75926,9 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_show_vmu_screen_settings", - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TR, - CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TR, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_TT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_TT, + CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_TT, NULL, "vmu", { @@ -64210,7 +75940,7 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_vmu1_screen_display", - CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TR, + CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_TT, NULL, "", NULL, @@ -64223,145 +75953,145 @@ struct retro_core_option_v2_definition option_defs_tr[] = { "disabled", }, { - CORE_OPTION_NAME "_vmu1_screen_position", - CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, - { NULL, NULL }, - }, - "Upper Left", - }, - { - CORE_OPTION_NAME "_vmu1_screen_size_mult", - CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "1x", OPTION_VAL_1X_TR }, - { "2x", OPTION_VAL_2_O27_TR }, - { "3x", OPTION_VAL_3X_TR }, - { "4x", OPTION_VAL_4_TR }, - { "5x", OPTION_VAL_5X_TR }, - { NULL, NULL }, - }, - "1x", - }, - { - CORE_OPTION_NAME "_vmu1_pixel_on_color", - CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME "_vmu1_screen_position", + CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "Upper Left", OPTION_VAL_UPPER_LEFT_TT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TT }, { NULL, NULL }, }, - "DEFAULT_ON 00", + "Upper Left", }, { - CORE_OPTION_NAME "_vmu1_pixel_off_color", - CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TR, + CORE_OPTION_NAME "_vmu1_screen_size_mult", + CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_TT, NULL, "", NULL, "vmu", { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + { "1x", OPTION_VAL_1X_TT }, + { "2x", OPTION_VAL_2_O26_TT }, + { "3x", OPTION_VAL_3X_TT }, + { "4x", OPTION_VAL_4_TT }, + { "5x", OPTION_VAL_5X_TT }, + { NULL, NULL }, + }, + "1x", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_on_color", + CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, + { NULL, NULL }, + }, + "DEFAULT_ON 00", + }, + { + CORE_OPTION_NAME "_vmu1_pixel_off_color", + CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu1_screen_opacity", - CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TR, + CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_TT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_TR }, - { "20%", OPTION_VAL_20_TR }, - { "30%", OPTION_VAL_30_TR }, - { "40%", OPTION_VAL_40_TR }, - { "50%", OPTION_VAL_50_TR }, - { "60%", OPTION_VAL_60_TR }, - { "70%", OPTION_VAL_70_TR }, - { "80%", OPTION_VAL_80_TR }, - { "90%", OPTION_VAL_90_TR }, - { "100%", OPTION_VAL_100_O57_TR }, + { "10%", OPTION_VAL_10_TT }, + { "20%", OPTION_VAL_20_TT }, + { "30%", OPTION_VAL_30_TT }, + { "40%", OPTION_VAL_40_TT }, + { "50%", OPTION_VAL_50_TT }, + { "60%", OPTION_VAL_60_TT }, + { "70%", OPTION_VAL_70_TT }, + { "80%", OPTION_VAL_80_TT }, + { "90%", OPTION_VAL_90_TT }, + { "100%", OPTION_VAL_100_O45_TT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu2_screen_display", - CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TR, + CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_TT, NULL, "", NULL, @@ -64375,144 +76105,144 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_vmu2_screen_position", - CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TR, + CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_TT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TT }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", - CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TR, + CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_TT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_TR }, - { "2x", OPTION_VAL_2_O27_TR }, - { "3x", OPTION_VAL_3X_TR }, - { "4x", OPTION_VAL_4_TR }, - { "5x", OPTION_VAL_5X_TR }, + { "1x", OPTION_VAL_1X_TT }, + { "2x", OPTION_VAL_2_O26_TT }, + { "3x", OPTION_VAL_3X_TT }, + { "4x", OPTION_VAL_4_TT }, + { "5x", OPTION_VAL_5X_TT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu2_pixel_on_color", - CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu2_pixel_off_color", - CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu2_screen_opacity", - CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TR, + CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_TT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_TR }, - { "20%", OPTION_VAL_20_TR }, - { "30%", OPTION_VAL_30_TR }, - { "40%", OPTION_VAL_40_TR }, - { "50%", OPTION_VAL_50_TR }, - { "60%", OPTION_VAL_60_TR }, - { "70%", OPTION_VAL_70_TR }, - { "80%", OPTION_VAL_80_TR }, - { "90%", OPTION_VAL_90_TR }, - { "100%", OPTION_VAL_100_O57_TR }, + { "10%", OPTION_VAL_10_TT }, + { "20%", OPTION_VAL_20_TT }, + { "30%", OPTION_VAL_30_TT }, + { "40%", OPTION_VAL_40_TT }, + { "50%", OPTION_VAL_50_TT }, + { "60%", OPTION_VAL_60_TT }, + { "70%", OPTION_VAL_70_TT }, + { "80%", OPTION_VAL_80_TT }, + { "90%", OPTION_VAL_90_TT }, + { "100%", OPTION_VAL_100_O45_TT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu3_screen_display", - CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TR, + CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_TT, NULL, "", NULL, @@ -64526,144 +76256,144 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_vmu3_screen_position", - CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TR, + CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_TT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TT }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", - CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TR, + CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_TT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_TR }, - { "2x", OPTION_VAL_2_O27_TR }, - { "3x", OPTION_VAL_3X_TR }, - { "4x", OPTION_VAL_4_TR }, - { "5x", OPTION_VAL_5X_TR }, + { "1x", OPTION_VAL_1X_TT }, + { "2x", OPTION_VAL_2_O26_TT }, + { "3x", OPTION_VAL_3X_TT }, + { "4x", OPTION_VAL_4_TT }, + { "5x", OPTION_VAL_5X_TT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu3_pixel_on_color", - CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu3_pixel_off_color", - CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu3_screen_opacity", - CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TR, + CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_TT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_TR }, - { "20%", OPTION_VAL_20_TR }, - { "30%", OPTION_VAL_30_TR }, - { "40%", OPTION_VAL_40_TR }, - { "50%", OPTION_VAL_50_TR }, - { "60%", OPTION_VAL_60_TR }, - { "70%", OPTION_VAL_70_TR }, - { "80%", OPTION_VAL_80_TR }, - { "90%", OPTION_VAL_90_TR }, - { "100%", OPTION_VAL_100_O57_TR }, + { "10%", OPTION_VAL_10_TT }, + { "20%", OPTION_VAL_20_TT }, + { "30%", OPTION_VAL_30_TT }, + { "40%", OPTION_VAL_40_TT }, + { "50%", OPTION_VAL_50_TT }, + { "60%", OPTION_VAL_60_TT }, + { "70%", OPTION_VAL_70_TT }, + { "80%", OPTION_VAL_80_TT }, + { "90%", OPTION_VAL_90_TT }, + { "100%", OPTION_VAL_100_O45_TT }, { NULL, NULL }, }, "100%", }, { CORE_OPTION_NAME "_vmu4_screen_display", - CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TR, + CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_TT, NULL, "", NULL, @@ -64677,333 +76407,343 @@ struct retro_core_option_v2_definition option_defs_tr[] = { }, { CORE_OPTION_NAME "_vmu4_screen_position", - CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TR, + CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_TT, NULL, "", NULL, "vmu", { - { "Upper Left", OPTION_VAL_UPPER_LEFT_TR }, - { "Upper Right", OPTION_VAL_UPPER_RIGHT_TR }, - { "Lower Left", OPTION_VAL_LOWER_LEFT_TR }, - { "Lower Right", OPTION_VAL_LOWER_RIGHT_TR }, + { "Upper Left", OPTION_VAL_UPPER_LEFT_TT }, + { "Upper Right", OPTION_VAL_UPPER_RIGHT_TT }, + { "Lower Left", OPTION_VAL_LOWER_LEFT_TT }, + { "Lower Right", OPTION_VAL_LOWER_RIGHT_TT }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", - CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TR, + CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_TT, NULL, "", NULL, "vmu", { - { "1x", OPTION_VAL_1X_TR }, - { "2x", OPTION_VAL_2_O27_TR }, - { "3x", OPTION_VAL_3X_TR }, - { "4x", OPTION_VAL_4_TR }, - { "5x", OPTION_VAL_5X_TR }, + { "1x", OPTION_VAL_1X_TT }, + { "2x", OPTION_VAL_2_O26_TT }, + { "3x", OPTION_VAL_3X_TT }, + { "4x", OPTION_VAL_4_TT }, + { "5x", OPTION_VAL_5X_TT }, { NULL, NULL }, }, "1x", }, { CORE_OPTION_NAME "_vmu4_pixel_on_color", - CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_ON 00", }, { CORE_OPTION_NAME "_vmu4_pixel_off_color", - CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TR, - NULL, - "", - NULL, - "vmu", - { - { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TR }, - { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TR }, - { "BLACK 02", OPTION_VAL_BLACK_02_TR }, - { "BLUE 03", OPTION_VAL_BLUE_TR }, - { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TR }, - { "GREEN 05", OPTION_VAL_GREEN_TR }, - { "CYAN 06", OPTION_VAL_CYAN_06_TR }, - { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TR }, - { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TR }, - { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TR }, - { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TR }, - { "RED 11", OPTION_VAL_RED_TR }, - { "PURPLE 12", OPTION_VAL_PURPLE_12_TR }, - { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TR }, - { "YELLOW 14", OPTION_VAL_YELLOW_14_TR }, - { "GRAY 15", OPTION_VAL_GRAY_15_TR }, - { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TR }, - { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TR }, - { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TR }, - { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TR }, - { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TR }, - { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TR }, - { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TR }, - { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TR }, - { "ORANGE 24", OPTION_VAL_ORANGE_24_TR }, - { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TR }, - { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TR }, - { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TR }, - { "WHITE 28", OPTION_VAL_WHITE_TR }, + CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_TT, + NULL, + "", + NULL, + "vmu", + { + { "DEFAULT_OFF 01", OPTION_VAL_DEFAULT_OFF_01_TT }, + { "DEFAULT_ON 00", OPTION_VAL_DEFAULT_ON_00_TT }, + { "BLACK 02", OPTION_VAL_BLACK_02_TT }, + { "BLUE 03", OPTION_VAL_BLUE_TT }, + { "LIGHT_BLUE 04", OPTION_VAL_LIGHT_BLUE_04_TT }, + { "GREEN 05", OPTION_VAL_GREEN_TT }, + { "CYAN 06", OPTION_VAL_CYAN_06_TT }, + { "CYAN_BLUE 07", OPTION_VAL_CYAN_BLUE_07_TT }, + { "LIGHT_GREEN 08", OPTION_VAL_LIGHT_GREEN_08_TT }, + { "CYAN_GREEN 09", OPTION_VAL_CYAN_GREEN_09_TT }, + { "LIGHT_CYAN 10", OPTION_VAL_LIGHT_CYAN_10_TT }, + { "RED 11", OPTION_VAL_RED_TT }, + { "PURPLE 12", OPTION_VAL_PURPLE_12_TT }, + { "LIGHT_PURPLE 13", OPTION_VAL_LIGHT_PURPLE_13_TT }, + { "YELLOW 14", OPTION_VAL_YELLOW_14_TT }, + { "GRAY 15", OPTION_VAL_GRAY_15_TT }, + { "LIGHT_PURPLE_2 16", OPTION_VAL_LIGHT_PURPLE_2_16_TT }, + { "LIGHT_GREEN_2 17", OPTION_VAL_LIGHT_GREEN_2_17_TT }, + { "LIGHT_GREEN_3 18", OPTION_VAL_LIGHT_GREEN_3_18_TT }, + { "LIGHT_CYAN_2 19", OPTION_VAL_LIGHT_CYAN_2_19_TT }, + { "LIGHT_RED_2 20", OPTION_VAL_LIGHT_RED_2_20_TT }, + { "MAGENTA 21", OPTION_VAL_MAGENTA_21_TT }, + { "LIGHT_PURPLE_3 22", OPTION_VAL_LIGHT_PURPLE_3_22_TT }, + { "LIGHT_ORANGE 23", OPTION_VAL_LIGHT_ORANGE_23_TT }, + { "ORANGE 24", OPTION_VAL_ORANGE_24_TT }, + { "LIGHT_PURPLE_4 25", OPTION_VAL_LIGHT_PURPLE_4_25_TT }, + { "LIGHT_YELLOW 26", OPTION_VAL_LIGHT_YELLOW_26_TT }, + { "LIGHT_YELLOW_2 27", OPTION_VAL_LIGHT_YELLOW_2_27_TT }, + { "WHITE 28", OPTION_VAL_WHITE_TT }, { NULL, NULL }, }, "DEFAULT_OFF 01", }, { CORE_OPTION_NAME "_vmu4_screen_opacity", - CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TR, + CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_TT, NULL, "", NULL, "vmu", { - { "10%", OPTION_VAL_10_TR }, - { "20%", OPTION_VAL_20_TR }, - { "30%", OPTION_VAL_30_TR }, - { "40%", OPTION_VAL_40_TR }, - { "50%", OPTION_VAL_50_TR }, - { "60%", OPTION_VAL_60_TR }, - { "70%", OPTION_VAL_70_TR }, - { "80%", OPTION_VAL_80_TR }, - { "90%", OPTION_VAL_90_TR }, - { "100%", OPTION_VAL_100_O57_TR }, + { "10%", OPTION_VAL_10_TT }, + { "20%", OPTION_VAL_20_TT }, + { "30%", OPTION_VAL_30_TT }, + { "40%", OPTION_VAL_40_TT }, + { "50%", OPTION_VAL_50_TT }, + { "60%", OPTION_VAL_60_TT }, + { "70%", OPTION_VAL_70_TT }, + { "80%", OPTION_VAL_80_TT }, + { "90%", OPTION_VAL_90_TT }, + { "100%", OPTION_VAL_100_O45_TT }, { NULL, NULL }, }, "100%", }, { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }, }; -struct retro_core_options_v2 options_tr = { - option_cats_tr, - option_defs_tr +struct retro_core_options_v2 options_tt = { + option_cats_tt, + option_defs_tt }; /* RETRO_LANGUAGE_UK */ #define CATEGORY_SYSTEM_LABEL_UK "Система" -#define CATEGORY_SYSTEM_INFO_0_UK NULL +#define CATEGORY_SYSTEM_INFO_0_UK "Налаштування регіону, мова, BIOS і базові параметри обладнання." #define CATEGORY_VIDEO_LABEL_UK "Відео" -#define CATEGORY_VIDEO_INFO_0_UK NULL +#define CATEGORY_VIDEO_INFO_0_UK "Налаштувати роздільну здатність, прозорість і візуальні налаштування ефектів." #define CATEGORY_PERFORMANCE_LABEL_UK "Продуктивність" #define CATEGORY_PERFORMANCE_INFO_0_UK "Налаштування потокового рендерингу та пропуску кадрів." #define CATEGORY_HACKS_LABEL_UK "Гаки емуляції" -#define CATEGORY_HACKS_INFO_0_UK NULL +#define CATEGORY_HACKS_INFO_0_UK "Налаштування поширених змінень, швидкість завантаження GD-ROM та налаштування заміни текстур." #define CATEGORY_INPUT_LABEL_UK "Ввід" -#define CATEGORY_INPUT_INFO_0_UK NULL -#define CATEGORY_VMU_LABEL_UK NULL -#define CATEGORY_VMU_INFO_0_UK NULL +#define CATEGORY_INPUT_INFO_0_UK "Налаштуйте налаштування геймпада та Підсвітки пістолетів." +#define CATEGORY_EXPANSIONS_LABEL_UK "Збільшення слотів контролера" +#define CATEGORY_EXPANSIONS_INFO_0_UK "Виберіть пристрій (VMU, чудово підключений до кожного слоту розширення контролерів." +#define CATEGORY_VMU_LABEL_UK "Одиниця візуальної пам'яті" +#define CATEGORY_VMU_INFO_0_UK "Налаштування видимості окремої VMU окремо для кожного робочого столу." #define CORE_OPTION_NAME_REGION_LABEL_UK "Регіон" -#define OPTION_VAL_JAPAN_UK NULL -#define OPTION_VAL_USA_UK NULL -#define OPTION_VAL_EUROPE_UK NULL +#define OPTION_VAL_JAPAN_UK "Японія" +#define OPTION_VAL_USA_UK "США" +#define OPTION_VAL_EUROPE_UK "Європа" #define OPTION_VAL_DEFAULT_UK "За замовчуванням" #define CORE_OPTION_NAME_LANGUAGE_LABEL_UK "Мова" -#define CORE_OPTION_NAME_LANGUAGE_INFO_0_UK NULL -#define OPTION_VAL_JAPANESE_UK NULL -#define OPTION_VAL_ENGLISH_UK NULL -#define OPTION_VAL_GERMAN_UK NULL -#define OPTION_VAL_FRENCH_UK NULL -#define OPTION_VAL_SPANISH_UK NULL -#define OPTION_VAL_ITALIAN_UK NULL -#define CORE_OPTION_NAME_HLE_BIOS_LABEL_UK NULL +#define CORE_OPTION_NAME_LANGUAGE_INFO_0_UK "Змінює мову для BIOS та будь-які ігри, які містять різноманітні мови." +#define OPTION_VAL_JAPANESE_UK "Японська" +#define OPTION_VAL_ENGLISH_UK "Англійська" +#define OPTION_VAL_GERMAN_UK "Німецька" +#define OPTION_VAL_FRENCH_UK "Французька" +#define OPTION_VAL_SPANISH_UK "Іспанська" +#define OPTION_VAL_ITALIAN_UK "Італійська" +#define CORE_OPTION_NAME_HLE_BIOS_LABEL_UK "HLE BIOS (потрібен перезапуск)" #define CORE_OPTION_NAME_HLE_BIOS_INFO_0_UK "Примусово використовувати BIOS високого рівня." #define CORE_OPTION_NAME_BOOT_TO_BIOS_LABEL_UK "Завантаження в BIOS (потрібний перезапуск)" #define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_UK "Завантаження безпосередньо в меню Dreamcast BIOS." #define CORE_OPTION_NAME_ENABLE_DSP_LABEL_UK "Увімкнути DSP" #define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_UK "Увімкнути емуляцію аудіо DSP(цифровий процесор сигналів). Покращує точність згенерованого звуку, але збільшує вимоги до продуктивності." -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_UK NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_UK NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_UK NULL -#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_UK NULL +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_UK "Дозволити кнопки служіння Arcade" +#define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_UK "Активує кнопку SERVICE для аркадних ігор, щоб увійти в налаштування кабінету." #define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_UK "Встановити NAOMI ігри для безкоштовної гри" -#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_UK NULL -#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_UK NULL -#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_UK NULL -#define CORE_OPTION_NAME_UPNP_LABEL_UK NULL -#define CORE_OPTION_NAME_UPNP_INFO_0_UK NULL +#define CORE_OPTION_NAME_FORCE_FREEPLAY_INFO_0_UK "Змінювати параметри гри за допомогою монет \"Вільна гра\"." +#define CORE_OPTION_NAME_EMULATE_BBA_LABEL_UK "Широкосмугова емуляція адаптера" +#define CORE_OPTION_NAME_EMULATE_BBA_INFO_0_UK "Емуляція ethernet широкосмугового адаптера замість модема. (Перезавантажити необхідно)" +#define CORE_OPTION_NAME_UPNP_LABEL_UK "Активувати UPnP" +#define CORE_OPTION_NAME_UPNP_INFO_0_UK "Використовуйте UPnP для автоматичного налаштування інтернет-маршрутизатора для онлайн-ігор." #define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_UK "Роздільна здатність" #define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_UK "Змінити роздільну здатність візуалізації." -#define OPTION_VAL_320X240_UK NULL -#define OPTION_VAL_640X480_UK "640х480" +#define OPTION_VAL_320X240_UK "320х240 (Half)" +#define OPTION_VAL_640X480_UK NULL #define OPTION_VAL_800X600_UK NULL -#define OPTION_VAL_960X720_UK "960х720" -#define OPTION_VAL_1024X768_UK NULL -#define OPTION_VAL_1280X960_UK NULL -#define OPTION_VAL_1440X1080_UK "1440х1080" -#define OPTION_VAL_1600X1200_UK NULL -#define OPTION_VAL_1920X1440_UK "1920х1440" -#define OPTION_VAL_2560X1920_UK "2560х1920" -#define OPTION_VAL_2880X2160_UK "2880х2160" -#define OPTION_VAL_3200X2400_UK "3200х2400" -#define OPTION_VAL_3840X2880_UK "3840х2880" -#define OPTION_VAL_4480X3360_UK "4480х3360" -#define OPTION_VAL_5120X3840_UK "5120х3840" -#define OPTION_VAL_5760X4320_UK "5760х4320" -#define OPTION_VAL_6400X4800_UK "6400х4800" -#define OPTION_VAL_7040X5280_UK "7040х5280" -#define OPTION_VAL_7680X5760_UK "7680х5760" -#define OPTION_VAL_8320X6240_UK "8320х6240" -#define OPTION_VAL_8960X6720_UK "8960х6720" -#define OPTION_VAL_9600X7200_UK "9600х7200" -#define OPTION_VAL_10240X7680_UK "10240х7680" -#define OPTION_VAL_10880X8160_UK "10880х8160" -#define OPTION_VAL_11520X8640_UK "11520х8640" -#define OPTION_VAL_12160X9120_UK "12160х9120" -#define OPTION_VAL_12800X9600_UK "12800х9600" -#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_UK NULL -#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_UK NULL +#define OPTION_VAL_960X720_UK "960х720 (x1.5)" +#define OPTION_VAL_1024X768_UK "1024х768 (x1.6)" +#define OPTION_VAL_1280X960_UK "1280х960 (x2)" +#define OPTION_VAL_1440X1080_UK NULL +#define OPTION_VAL_1600X1200_UK "1600х1200 (x2.5)" +#define OPTION_VAL_1920X1440_UK "1920х1440 (x3)" +#define OPTION_VAL_2560X1920_UK "2560х1920 (x4)" +#define OPTION_VAL_2880X2160_UK NULL +#define OPTION_VAL_3200X2400_UK "3200х2400 (x5)" +#define OPTION_VAL_3840X2880_UK NULL +#define OPTION_VAL_4480X3360_UK "4480х3360 (x7)" +#define OPTION_VAL_5120X3840_UK NULL +#define OPTION_VAL_5760X4320_UK "5760х4320 (x9)" +#define OPTION_VAL_6400X4800_UK NULL +#define OPTION_VAL_7040X5280_UK "7040х5280 (x11)" +#define OPTION_VAL_7680X5760_UK NULL +#define OPTION_VAL_8320X6240_UK NULL +#define OPTION_VAL_8960X6720_UK NULL +#define OPTION_VAL_9600X7200_UK NULL +#define OPTION_VAL_10240X7680_UK "10240х7680 (x16)" +#define OPTION_VAL_10880X8160_UK "10880х8160 (x17)" +#define OPTION_VAL_11520X8640_UK NULL +#define OPTION_VAL_12160X9120_UK NULL +#define OPTION_VAL_12800X9600_UK NULL +#define CORE_OPTION_NAME_CABLE_TYPE_LABEL_UK "Тип кабель" +#define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_UK "Тип вихідного сигналу. 'TV (Composite)' є найбільш поширеним." #define OPTION_VAL_VGA_UK NULL #define OPTION_VAL_TV_RGB_UK NULL -#define OPTION_VAL_TV_COMPOSITE_UK NULL -#define CORE_OPTION_NAME_BROADCAST_LABEL_UK NULL +#define OPTION_VAL_TV_COMPOSITE_UK "Телевізор (Composite)" +#define CORE_OPTION_NAME_BROADCAST_LABEL_UK "Транслювати стандарт" #define OPTION_VAL_NTSC_UK NULL -#define OPTION_VAL_PAL_UK NULL +#define OPTION_VAL_PAL_UK "Пал (Світ)" #define OPTION_VAL_PAL_N_UK NULL -#define OPTION_VAL_PAL_M_UK NULL +#define OPTION_VAL_PAL_M_UK "PAL-M (Бразилія)" #define CORE_OPTION_NAME_SCREEN_ROTATION_LABEL_UK "Орієнтація екрану" #define OPTION_VAL_HORIZONTAL_UK "Горизонтально" #define OPTION_VAL_VERTICAL_UK "Вертикально" #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_UK "Альфа-Сортування" -#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_UK NULL -#define OPTION_VAL_PER_TRIANGLE_NORMAL_UK NULL -#define OPTION_VAL_PER_PIXEL_ACCURATE_UK NULL -#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_UK NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_UK "Виберіть, як сортуються прозорі багатокутники." +#define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_UK "Per-Strip (швидкий, найточніший)" +#define OPTION_VAL_PER_TRIANGLE_NORMAL_UK "Відсоток трикутник (звичайний)" +#define OPTION_VAL_PER_PIXEL_ACCURATE_UK "Per-Pixel (точний, але повільний)" +#define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_LABEL_UK "Розмір буфера Pixel" #define CORE_OPTION_NAME_OIT_ABUFFER_SIZE_INFO_0_UK "Для коректного виводу можуть бути потрібні більші значення." #define OPTION_VAL_512MB_UK "512 МБ" #define OPTION_VAL_1GB_UK "1 ГБ" #define OPTION_VAL_2GB_UK "2 ГБ" #define OPTION_VAL_4GB_UK "4 ГБ" -#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_UK NULL -#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_UK NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_UK NULL -#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_UK NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_UK NULL -#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_UK NULL -#define CORE_OPTION_NAME_MIPMAPPING_LABEL_UK NULL -#define CORE_OPTION_NAME_FOG_LABEL_UK NULL +#define CORE_OPTION_NAME_OIT_LAYERS_LABEL_UK "Максимальний прозорий шар" +#define CORE_OPTION_NAME_OIT_LAYERS_INFO_0_UK "Вищі значення можуть бути необхідними для складних сцен." +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_LABEL_UK "Повноцінне графічний інтерфейс емуляції" +#define CORE_OPTION_NAME_EMULATE_FRAMEBUFFER_INFO_0_UK "Увімкнути повну фреймбуфер в VRAM. Це корисно для ігор, які безпосередньо читають або записують фреймбуфер у VRAM. Коли ввімкнено, Внутрішня роздільність змушена до 640х480, а продуктивність може сильно вплинути." +#define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_UK "Увімкнути Буфер RTT (Render в Texture)" +#define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_UK "Копіювання текстур відтворюється з GPU до відеопам'яті. Цей параметр зазвичай увімкнено для ігор, які потребують ігор. Якщо увімкнено, то масштабування текстур вимкнене та може вплинути на продуктивність." +#define CORE_OPTION_NAME_MIPMAPPING_LABEL_UK "Зіставлення" +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_UK "Якщо ввімкнені текстури будуть використовувати меншу версію, коли вони з'являються далі, це може збільшити продуктивність і зменшити мереживання." +#define CORE_OPTION_NAME_FOG_LABEL_UK "Туманні ефекти" #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_UK NULL -#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_UK NULL +#define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_UK "Функція Dreamcast GPU для малювання тіней об'єктів. Зазвичай це слід увімкнути - вплив продуктивності зазвичай є мінімальним до незначним." #define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_LABEL_UK "Анізотропна фільтрація" -#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_UK NULL +#define CORE_OPTION_NAME_ANISOTROPIC_FILTERING_INFO_0_UK "Підвищення якості текстур на поверхні, які є на забутті кутів візуального перегляду відповідно до камери. Чим вищі значення, тим більше вимагають зміни GPU. Зміни застосовані лише після перезапуску." #define CORE_OPTION_NAME_TEXTURE_FILTERING_LABEL_UK "Фільтрація текстур" -#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_UK NULL -#define OPTION_VAL_1_UK NULL -#define OPTION_VAL_2_UK NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_UK NULL -#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_UK NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_UK NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_UK NULL -#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_UK NULL +#define CORE_OPTION_NAME_TEXTURE_FILTERING_INFO_0_UK "Режим фільтрації текстур для використання. Це можна використати для примусового режиму фільтрації текстур на всіх текстурах для отримання кризисного (або плавного) зовнішнього вигляду, ніж стандартний режим. Значення за замовчуванням можуть спричинити різні проблеми візуалізації. Зміни застосовані лише після перезапуску." +#define OPTION_VAL_1_UK "Форс-Неарест-Нейбор" +#define OPTION_VAL_2_UK "Примусова лінія" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_UK "Затримка заміни кадрів" +#define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_UK "Корисно, щоб уникнути блимання екрану або відео з відблиманням. Не рекомендовано на повільних платформах." +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_UK "Визначити зміни частоти кадрів" +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_UK "Повідомляти фронт, коли внутрішня частота кадрів (напр. від 60 до 30 fp). Поліпшує отвір у ігри, що запускається за 30 кадрів в секунду або 20 футів, але слід вимкнути для ігор з розблокованими (нестабільними) темпами (наприклад. Ecco, Dolphin, Unreal Tournament). Примітка: Недоступно при увімкненому «Авто-пропуск кадрів»." +#define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_UK "Фільтр постобробки PowerVR2" #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_UK "Постобробка зображення для імітації ефектів відеоданих на PowerVR2 та аналогових відео сигналів." #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_UK "Вдосконалення текстур (xBRZ)" #define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_UK "Покращення графіки 2D пікселів. Має використовуватися лише з 2D піксельними іграми." -#define OPTION_VAL_2_O27_UK NULL +#define OPTION_VAL_2_O26_UK NULL #define OPTION_VAL_4_UK NULL #define OPTION_VAL_6_UK NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_UK "Збільшення масштабу текстур. Відфільтрований розмір" -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_UK NULL -#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_UK NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_UK NULL -#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_UK NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_UK "Виберіть максимальний розмір для масштабування текстури, якщо розмір текстури більший за вибране значення, тоді значення не буде збільшуватися." +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_UK "Інтерполяція Рідної глибини" +#define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_UK "Допомагає в корупції текстур та глибинних питаннях AMD GPU. Може також допомогти Intel GPU в деяких випадках." +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_UK "Закруглити відстань по краї" +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_UK "Підтримує випадок кровотечі текстур під час масштабування. Відключення може допомогти, якщо пікселі попереджають при збільшенні масштабу в 2D іграх (MVC2, CVS, KOF тощо)" +#define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_UK "Візуалізація за потоком" +#define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_UK "Запускає відеопроцесор та процесор на різних потоках. Настійно рекомендується." #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_UK NULL -#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_UK NULL +#define CORE_OPTION_NAME_AUTO_SKIP_FRAME_INFO_0_UK "Автоматично пропускати кадри, коли емулятор працює повільно. Примітка: Цей параметр застосовується лише тоді, коли увімкнуто 'Threaded Rendering'." #define OPTION_VAL_SOME_UK "Нормально" -#define OPTION_VAL_MORE_UK NULL +#define OPTION_VAL_MORE_UK "Максимум" #define CORE_OPTION_NAME_FRAME_SKIPPING_LABEL_UK "Пропуск кадрів" -#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_UK NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_UK NULL -#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_UK NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_UK NULL -#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_UK NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_UK NULL -#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_UK NULL -#define CORE_OPTION_NAME_SH4CLOCK_LABEL_UK NULL -#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_UK NULL -#define OPTION_VAL_100_UK NULL +#define CORE_OPTION_NAME_FRAME_SKIPPING_INFO_0_UK "Встановлює кількість кадрів для переходу між кожними відображеними кадрами." +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_LABEL_UK "Широкі коди (потрібен перезапуск)" +#define CORE_OPTION_NAME_WIDESCREEN_CHEATS_INFO_0_UK "Активує чіти, які дозволяють певним іграм відображати у форматі поширеного режиму." +#define CORE_OPTION_NAME_WIDESCREEN_HACK_LABEL_UK "Широкоекранний Hack" +#define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_UK "Намалювати геометрію поза нормальним співвідношенням сторін 4:3. Може видавати графічні залози в розкритих районах." +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_UK "Швидке завантаження GD-ROM (неточне)" +#define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_UK "Прискорює завантаження GD-ROM." +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_UK NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_UK "Увімкнути 32МБ Мод ОЗУ для Dreamcast. Може вплинути на сумісність" +#define CORE_OPTION_NAME_SH4CLOCK_LABEL_UK "SH4 under/overclock процесора" +#define CORE_OPTION_NAME_SH4CLOCK_INFO_0_UK "Змініть SH4 головний годинник ЦП за замовчуванням 200 МГц. Разом може допомогти уповільнити платформи. Покриття може збільшити частоту кадрів для деяких ігор. Використовуйте з обережністю." +#define OPTION_VAL_100_UK "100 МГц" #define OPTION_VAL_110_UK NULL -#define OPTION_VAL_120_UK NULL -#define OPTION_VAL_130_UK NULL -#define OPTION_VAL_140_UK NULL -#define OPTION_VAL_150_UK NULL -#define OPTION_VAL_160_UK NULL -#define OPTION_VAL_170_UK NULL -#define OPTION_VAL_180_UK NULL -#define OPTION_VAL_190_UK NULL -#define OPTION_VAL_200_UK NULL -#define OPTION_VAL_210_UK NULL -#define OPTION_VAL_220_UK NULL -#define OPTION_VAL_230_UK NULL -#define OPTION_VAL_240_UK NULL -#define OPTION_VAL_250_UK NULL -#define OPTION_VAL_260_UK NULL -#define OPTION_VAL_270_UK NULL -#define OPTION_VAL_280_UK NULL -#define OPTION_VAL_290_UK NULL -#define OPTION_VAL_300_UK NULL -#define OPTION_VAL_310_UK NULL -#define OPTION_VAL_320_UK NULL -#define OPTION_VAL_330_UK NULL -#define OPTION_VAL_340_UK NULL -#define OPTION_VAL_350_UK NULL -#define OPTION_VAL_360_UK NULL -#define OPTION_VAL_370_UK NULL -#define OPTION_VAL_380_UK NULL -#define OPTION_VAL_390_UK NULL -#define OPTION_VAL_400_UK NULL -#define OPTION_VAL_410_UK NULL -#define OPTION_VAL_420_UK NULL -#define OPTION_VAL_430_UK NULL -#define OPTION_VAL_440_UK NULL -#define OPTION_VAL_450_UK NULL -#define OPTION_VAL_460_UK NULL -#define OPTION_VAL_470_UK NULL -#define OPTION_VAL_480_UK NULL -#define OPTION_VAL_490_UK NULL -#define OPTION_VAL_500_UK NULL -#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_UK NULL -#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_UK NULL -#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_UK NULL +#define OPTION_VAL_120_UK "120 МГц" +#define OPTION_VAL_130_UK "130 МГц" +#define OPTION_VAL_140_UK "140 МГц" +#define OPTION_VAL_150_UK "150 МГц" +#define OPTION_VAL_160_UK "160 МГц" +#define OPTION_VAL_170_UK "170 МГц" +#define OPTION_VAL_180_UK "180 МГц" +#define OPTION_VAL_190_UK "190 МГц" +#define OPTION_VAL_200_UK "200 МГц" +#define OPTION_VAL_210_UK "210 МГц" +#define OPTION_VAL_220_UK "220 МГц" +#define OPTION_VAL_230_UK "230 МГц" +#define OPTION_VAL_240_UK "240 МГц" +#define OPTION_VAL_250_UK "250 МГц" +#define OPTION_VAL_260_UK "260 МГц" +#define OPTION_VAL_270_UK "270 МГц" +#define OPTION_VAL_280_UK "280 МГц" +#define OPTION_VAL_290_UK "290 МГц" +#define OPTION_VAL_300_UK "300 МГц" +#define OPTION_VAL_310_UK "310 МГц" +#define OPTION_VAL_320_UK "320 МГц" +#define OPTION_VAL_330_UK "330 МГц" +#define OPTION_VAL_340_UK "340 МГц" +#define OPTION_VAL_350_UK "350 МГц" +#define OPTION_VAL_360_UK "360 МГц" +#define OPTION_VAL_370_UK "370 МГц" +#define OPTION_VAL_380_UK "380 МГц" +#define OPTION_VAL_390_UK "390 МГц" +#define OPTION_VAL_400_UK "400 МГц" +#define OPTION_VAL_410_UK "410 МГц" +#define OPTION_VAL_420_UK "420 МГц" +#define OPTION_VAL_430_UK "430 МГц" +#define OPTION_VAL_440_UK "440 МГц" +#define OPTION_VAL_450_UK "450 МГц" +#define OPTION_VAL_460_UK "460 МГц" +#define OPTION_VAL_470_UK "470 МГц" +#define OPTION_VAL_480_UK "480 МГц" +#define OPTION_VAL_490_UK "490 МГц" +#define OPTION_VAL_500_UK "500 МГц" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_UK "Завантажити користувацькі текстури" +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_UK "Завантажити спеціальні текстури, які можна знайти в теці 'system/dc/textures//'." +#define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_UK "Дамп текстур" +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_UK "Кожного разу, коли гра використовує нову текстуру, вона буде збережена як файл .png у теці 'system/dc/texdump//'." +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_UK "Аналоговий стік Deadzone" +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_UK "Вкажіть, як далеко потрібно перемістити аналоговий стік перед тим, як він почав оброблятися." #define OPTION_VAL_0_UK NULL #define OPTION_VAL_5_UK NULL #define OPTION_VAL_10_UK NULL @@ -65011,96 +76751,136 @@ struct retro_core_options_v2 options_tr = { #define OPTION_VAL_20_UK NULL #define OPTION_VAL_25_UK NULL #define OPTION_VAL_30_UK NULL -#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_UK NULL -#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_UK NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_UK NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_UK NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_UK NULL -#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_UK NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_UK NULL -#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_UK NULL -#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_UK NULL -#define OPTION_VAL_WHITE_UK NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_UK "Запустити Deadzone" +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_UK "Виберіть скільки доведеться натиснути на пристрій перед тим, як почати обробку." +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_UK "Цифрові тригери" +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_UK "Якщо увімкнено, тригери будуть діяти як звичайні кнопки, означає, що вони будуть оброблені як повністю або повністю натиснуті або взагалі не натиснуті, без проміжків." +#define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_UK "Транслювати цифрові виходи" +#define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_UK "Транслювати цифрові вихідні дані і стан подачі при TCP порту 8000. Сумісно з параметром \"-вихідний мережу\" MAME." +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_UK "Показати параметри освітлення" +#define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_UK "Увімкнути налаштування кросшейдерів дисплея. Примітка: швидке меню може бути перезапущено, щоб цей параметр набув чинності." +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_UK "Прицільне масштабування для зброї" +#define OPTION_VAL_50_UK NULL +#define OPTION_VAL_60_UK NULL +#define OPTION_VAL_70_UK NULL +#define OPTION_VAL_80_UK NULL +#define OPTION_VAL_90_UK NULL +#define OPTION_VAL_100_O45_UK NULL +#define OPTION_VAL_110_O45_UK NULL +#define OPTION_VAL_120_O45_UK NULL +#define OPTION_VAL_130_O45_UK NULL +#define OPTION_VAL_140_O45_UK NULL +#define OPTION_VAL_150_O45_UK NULL +#define OPTION_VAL_160_O45_UK NULL +#define OPTION_VAL_170_O45_UK NULL +#define OPTION_VAL_180_O45_UK NULL +#define OPTION_VAL_190_O45_UK NULL +#define OPTION_VAL_200_O45_UK NULL +#define OPTION_VAL_210_O45_UK NULL +#define OPTION_VAL_220_O45_UK NULL +#define OPTION_VAL_230_O45_UK NULL +#define OPTION_VAL_240_O45_UK NULL +#define OPTION_VAL_250_O45_UK NULL +#define OPTION_VAL_260_O45_UK NULL +#define OPTION_VAL_270_O45_UK NULL +#define OPTION_VAL_280_O45_UK NULL +#define OPTION_VAL_290_O45_UK NULL +#define OPTION_VAL_300_O45_UK NULL +#define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_UK "Збройний приціл 1 дисплей" +#define OPTION_VAL_WHITE_UK "Білі" #define OPTION_VAL_RED_UK "Червоний" #define OPTION_VAL_GREEN_UK "Зелений" #define OPTION_VAL_BLUE_UK "Синій" -#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_UK NULL -#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_UK NULL -#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_UK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_UK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_UK NULL -#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_UK NULL -#define OPTION_VAL_VMU_A1_UK NULL -#define OPTION_VAL_ALL_VMUS_UK NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_UK NULL -#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_UK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_UK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_UK NULL -#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_UK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_UK NULL -#define OPTION_VAL_UPPER_LEFT_UK NULL -#define OPTION_VAL_UPPER_RIGHT_UK NULL -#define OPTION_VAL_LOWER_LEFT_UK NULL -#define OPTION_VAL_LOWER_RIGHT_UK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_UK NULL +#define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_UK "Приціл 2 зброю" +#define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_UK "Приціл 3 Зброї" +#define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_UK "Приціл 4 Зброї" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_UK "Пристрій у слоті розширення A1" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_UK "Виберіть пристрій підключений до слоту розширення A1 (порт A слот 1)." +#define OPTION_VAL_VMU_UK "ВМУ" +#define OPTION_VAL_PURUPURU_UK "Пакунок Вібрації" +#define OPTION_VAL_NONE_UK "Немає" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_UK "Пристрій у слоті розширення A2" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_UK "Виберіть пристрій підключений до слоту розширення A2 (порт A slot 2)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_UK "Пристрій у полі розширення B1" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_UK "Виберіть пристрій підключений до слоту розширення B1 (порт B слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_UK "Пристрій у слоті розширення B2" +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_UK "Виберіть пристрій підключений до слоту розширення B2 (порт B слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_UK "Пристрій в розширенні слоту C1" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_UK "Виберіть пристрій підключений до слоту розширення C1 (порт C слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_UK "Пристрій у слоті розширення C2" +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_UK "Виберіть пристрій підключений до слоту розширення C2 (порт C слот 2)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_UK "Пристрій у полі розширення D1" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_UK "Виберіть пристрій підключений до слоту розширення D1 (порт D слот 1)." +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_UK "Пристрій у слоті розширення D2" +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_UK "Виберіть пристрій підключений до слоту розширення D2 (порт D слот 2)." +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_UK "Per-Game Visual Memory Units/Системи (VMU)" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_UK "Виступи для гри" +#define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_UK "Якщо вимкнено, усі ігри спільно використовують до 8 файлів збереження VMU (A1/A2/B1/B2/C1/C2/D1/D2), розташованих у системній папці RetroArch.\nНалаштування «VMU A1» створює унікальний файл VMU «A1». у папці збереження RetroArch для кожної запущеної гри.\nНалаштування «Усі VMU» створює до 8 унікальних файлів VMU (A1/A2/B1/B2/C1/C2/D1/D2) для кожної запущеної гри." +#define OPTION_VAL_VMU_A1_UK "ВМУ А1" +#define OPTION_VAL_ALL_VMUS_UK "Всі VMUs" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_UK "Звуки візуальної пам'яті/системи (VMU)" +#define CORE_OPTION_NAME_VMU_SOUND_LABEL_CAT_UK "Звук VMU" +#define CORE_OPTION_NAME_VMU_SOUND_INFO_0_UK "Коли увімкнено, відео відтворюються VMU біки." +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_UK "Показати параметри показу юніту/системи (VMU)" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_LABEL_CAT_UK "Показати параметри показу vMU" +#define CORE_OPTION_NAME_SHOW_VMU_SCREEN_SETTINGS_INFO_0_UK "Увімкніть конфігурацію емуляції видимості екрана VMU LCD, розміру, позиції та кольору. Примітка: Швидке Меню потрібно перемкнути для застосування цього параметру." +#define CORE_OPTION_NAME_VMU1_SCREEN_DISPLAY_LABEL_UK "Екран VMU 1" +#define CORE_OPTION_NAME_VMU1_SCREEN_POSITION_LABEL_UK "Позиція екрану VMU 1" +#define OPTION_VAL_UPPER_LEFT_UK "Верхній лівий" +#define OPTION_VAL_UPPER_RIGHT_UK "Верхній правий" +#define OPTION_VAL_LOWER_LEFT_UK "Менше ліворуч" +#define OPTION_VAL_LOWER_RIGHT_UK "Нижній правий" +#define CORE_OPTION_NAME_VMU1_SCREEN_SIZE_MULT_LABEL_UK "Розмір екрану VMU 1" #define OPTION_VAL_1X_UK NULL #define OPTION_VAL_3X_UK NULL -#define OPTION_VAL_5X_UK NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_UK NULL -#define OPTION_VAL_DEFAULT_ON_00_UK NULL -#define OPTION_VAL_DEFAULT_OFF_01_UK NULL -#define OPTION_VAL_BLACK_02_UK NULL -#define OPTION_VAL_LIGHT_BLUE_04_UK NULL -#define OPTION_VAL_CYAN_06_UK NULL -#define OPTION_VAL_CYAN_BLUE_07_UK NULL -#define OPTION_VAL_LIGHT_GREEN_08_UK NULL -#define OPTION_VAL_CYAN_GREEN_09_UK NULL -#define OPTION_VAL_LIGHT_CYAN_10_UK NULL -#define OPTION_VAL_PURPLE_12_UK NULL -#define OPTION_VAL_LIGHT_PURPLE_13_UK NULL +#define OPTION_VAL_5X_UK "5х" +#define CORE_OPTION_NAME_VMU1_PIXEL_ON_COLOR_LABEL_UK "ВМУ 1 піксель за кольором" +#define OPTION_VAL_DEFAULT_ON_00_UK "УВІМК" +#define OPTION_VAL_DEFAULT_OFF_01_UK "Вимкнено за промовчанням" +#define OPTION_VAL_BLACK_02_UK "Чорний колір" +#define OPTION_VAL_LIGHT_BLUE_04_UK "Світло-синій" +#define OPTION_VAL_CYAN_06_UK "Бірюзовий" +#define OPTION_VAL_CYAN_BLUE_07_UK "Блакитно-синій" +#define OPTION_VAL_LIGHT_GREEN_08_UK "Світло-зелений" +#define OPTION_VAL_CYAN_GREEN_09_UK "Бірюзово-зелений" +#define OPTION_VAL_LIGHT_CYAN_10_UK "Світлий блакитний" +#define OPTION_VAL_PURPLE_12_UK "Пурпурний" +#define OPTION_VAL_LIGHT_PURPLE_13_UK "Світло-фіолетовий" #define OPTION_VAL_YELLOW_14_UK "Жовтий" -#define OPTION_VAL_GRAY_15_UK NULL -#define OPTION_VAL_LIGHT_PURPLE_2_16_UK NULL -#define OPTION_VAL_LIGHT_GREEN_2_17_UK NULL -#define OPTION_VAL_LIGHT_GREEN_3_18_UK NULL -#define OPTION_VAL_LIGHT_CYAN_2_19_UK NULL -#define OPTION_VAL_LIGHT_RED_2_20_UK NULL -#define OPTION_VAL_MAGENTA_21_UK NULL -#define OPTION_VAL_LIGHT_PURPLE_3_22_UK NULL -#define OPTION_VAL_LIGHT_ORANGE_23_UK NULL -#define OPTION_VAL_ORANGE_24_UK NULL -#define OPTION_VAL_LIGHT_PURPLE_4_25_UK NULL -#define OPTION_VAL_LIGHT_YELLOW_26_UK NULL -#define OPTION_VAL_LIGHT_YELLOW_2_27_UK NULL -#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_UK NULL +#define OPTION_VAL_GRAY_15_UK "Сірий" +#define OPTION_VAL_LIGHT_PURPLE_2_16_UK "Світло-фіолетовий (2)" +#define OPTION_VAL_LIGHT_GREEN_2_17_UK "Світло-зелений (2)" +#define OPTION_VAL_LIGHT_GREEN_3_18_UK "Світло-зелений (3)" +#define OPTION_VAL_LIGHT_CYAN_2_19_UK "Бірюзовий кут (2)" +#define OPTION_VAL_LIGHT_RED_2_20_UK "Світло-червоний (2)" +#define OPTION_VAL_MAGENTA_21_UK "Малиновий" +#define OPTION_VAL_LIGHT_PURPLE_3_22_UK "Світло-бузковий (3)" +#define OPTION_VAL_LIGHT_ORANGE_23_UK "Світло-оранжевий" +#define OPTION_VAL_ORANGE_24_UK "Помаранчевий" +#define OPTION_VAL_LIGHT_PURPLE_4_25_UK "Світло-бузковий (4)" +#define OPTION_VAL_LIGHT_YELLOW_26_UK "Світлий жовтий" +#define OPTION_VAL_LIGHT_YELLOW_2_27_UK "Світлий жовтий (2)" +#define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_UK "Колір дисплея VMU екрану 1 за замовчуванням" +#define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_UK "Прозорість екрану VMU 1" #define OPTION_VAL_40_UK NULL -#define OPTION_VAL_50_UK NULL -#define OPTION_VAL_60_UK NULL -#define OPTION_VAL_70_UK NULL -#define OPTION_VAL_80_UK NULL -#define OPTION_VAL_90_UK NULL -#define OPTION_VAL_100_O57_UK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_UK NULL -#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_UK NULL +#define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_UK "Екран VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_UK "Позиція екрану VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_UK "Розмір екрану VMU 2" +#define CORE_OPTION_NAME_VMU2_PIXEL_ON_COLOR_LABEL_UK "VMU екран 2 пікселя за кольором" +#define CORE_OPTION_NAME_VMU2_PIXEL_OFF_COLOR_LABEL_UK "Колір екрану VMU 2" +#define CORE_OPTION_NAME_VMU2_SCREEN_OPACITY_LABEL_UK "Прозорість екрану VMU" +#define CORE_OPTION_NAME_VMU3_SCREEN_DISPLAY_LABEL_UK "Екран VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_POSITION_LABEL_UK "Позиція екрану VMU 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_SIZE_MULT_LABEL_UK "Розмір екрану VMU 3" +#define CORE_OPTION_NAME_VMU3_PIXEL_ON_COLOR_LABEL_UK "Екран 3 пікселя VMU за кольором" +#define CORE_OPTION_NAME_VMU3_PIXEL_OFF_COLOR_LABEL_UK "Колір при вимкненому екрані 3" +#define CORE_OPTION_NAME_VMU3_SCREEN_OPACITY_LABEL_UK "Прозорість екрану VMU 3" +#define CORE_OPTION_NAME_VMU4_SCREEN_DISPLAY_LABEL_UK "Екран VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_POSITION_LABEL_UK "Позиція екрану VMU 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_SIZE_MULT_LABEL_UK "Розмір екрану VMU 4" +#define CORE_OPTION_NAME_VMU4_PIXEL_ON_COLOR_LABEL_UK "VMU екран 4 пікселя за кольором" +#define CORE_OPTION_NAME_VMU4_PIXEL_OFF_COLOR_LABEL_UK "Колір при вимкненому екрані 4" +#define CORE_OPTION_NAME_VMU4_SCREEN_OPACITY_LABEL_UK "Прозорість екрану VMU 4" struct retro_core_option_v2_category option_cats_uk[] = { { @@ -65128,6 +76908,11 @@ struct retro_core_option_v2_category option_cats_uk[] = { CATEGORY_INPUT_LABEL_UK, CATEGORY_INPUT_INFO_0_UK }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_UK, + CATEGORY_EXPANSIONS_INFO_0_UK + }, { "vmu", CATEGORY_VMU_LABEL_UK, @@ -65217,20 +77002,6 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_UK, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_UK, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_UK, @@ -65377,11 +77148,11 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_UK, NULL, "video", { @@ -65427,6 +77198,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -65461,11 +77233,11 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_UK, NULL, "video", { @@ -65547,7 +77319,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -65587,18 +77359,18 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_UK }, + { "2", OPTION_VAL_2_O26_UK }, { "4", OPTION_VAL_4_UK }, { "6", OPTION_VAL_6_UK }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_UK, NULL, "video", { @@ -65624,6 +77396,20 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_UK, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_UK, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_UK, @@ -65722,6 +77508,20 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_UK, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_UK, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_UK, @@ -65779,7 +77579,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_UK, NULL, "hacks", { @@ -65789,11 +77589,11 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_UK, NULL, "hacks", { @@ -65807,7 +77607,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_UK, NULL, "input", { @@ -65826,7 +77626,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_UK, NULL, "input", { @@ -65845,7 +77645,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_UK, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_UK, NULL, "input", { @@ -65855,20 +77655,6 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_UK, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_UK, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_UK, @@ -65897,6 +77683,44 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_UK, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_UK }, + { "60%", OPTION_VAL_60_UK }, + { "70%", OPTION_VAL_70_UK }, + { "80%", OPTION_VAL_80_UK }, + { "90%", OPTION_VAL_90_UK }, + { "100%", OPTION_VAL_100_O45_UK }, + { "110%", OPTION_VAL_110_O45_UK }, + { "120%", OPTION_VAL_120_O45_UK }, + { "130%", OPTION_VAL_130_O45_UK }, + { "140%", OPTION_VAL_140_O45_UK }, + { "150%", OPTION_VAL_150_O45_UK }, + { "160%", OPTION_VAL_160_O45_UK }, + { "170%", OPTION_VAL_170_O45_UK }, + { "180%", OPTION_VAL_180_O45_UK }, + { "190%", OPTION_VAL_190_O45_UK }, + { "200%", OPTION_VAL_200_O45_UK }, + { "210%", OPTION_VAL_210_O45_UK }, + { "220%", OPTION_VAL_220_O45_UK }, + { "230%", OPTION_VAL_230_O45_UK }, + { "240%", OPTION_VAL_240_O45_UK }, + { "250%", OPTION_VAL_250_O45_UK }, + { "260%", OPTION_VAL_260_O45_UK }, + { "270%", OPTION_VAL_270_O45_UK }, + { "280%", OPTION_VAL_280_O45_UK }, + { "290%", OPTION_VAL_290_O45_UK }, + { "300%", OPTION_VAL_300_O45_UK }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_UK, @@ -65965,6 +77789,126 @@ struct retro_core_option_v2_definition option_defs_uk[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_UK, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_UK, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_UK }, + { "Purupuru", OPTION_VAL_PURUPURU_UK }, + { "None", OPTION_VAL_NONE_UK }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_UK, @@ -66046,7 +77990,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "vmu", { { "1x", OPTION_VAL_1X_UK }, - { "2x", OPTION_VAL_2_O27_UK }, + { "2x", OPTION_VAL_2_O26_UK }, { "3x", OPTION_VAL_3X_UK }, { "4x", OPTION_VAL_4_UK }, { "5x", OPTION_VAL_5X_UK }, @@ -66153,7 +78097,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "70%", OPTION_VAL_70_UK }, { "80%", OPTION_VAL_80_UK }, { "90%", OPTION_VAL_90_UK }, - { "100%", OPTION_VAL_100_O57_UK }, + { "100%", OPTION_VAL_100_O45_UK }, { NULL, NULL }, }, "100%", @@ -66186,7 +78130,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_UK }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", @@ -66197,7 +78141,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "vmu", { { "1x", OPTION_VAL_1X_UK }, - { "2x", OPTION_VAL_2_O27_UK }, + { "2x", OPTION_VAL_2_O26_UK }, { "3x", OPTION_VAL_3X_UK }, { "4x", OPTION_VAL_4_UK }, { "5x", OPTION_VAL_5X_UK }, @@ -66304,7 +78248,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "70%", OPTION_VAL_70_UK }, { "80%", OPTION_VAL_80_UK }, { "90%", OPTION_VAL_90_UK }, - { "100%", OPTION_VAL_100_O57_UK }, + { "100%", OPTION_VAL_100_O45_UK }, { NULL, NULL }, }, "100%", @@ -66337,7 +78281,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_UK }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -66348,7 +78292,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "vmu", { { "1x", OPTION_VAL_1X_UK }, - { "2x", OPTION_VAL_2_O27_UK }, + { "2x", OPTION_VAL_2_O26_UK }, { "3x", OPTION_VAL_3X_UK }, { "4x", OPTION_VAL_4_UK }, { "5x", OPTION_VAL_5X_UK }, @@ -66455,7 +78399,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "70%", OPTION_VAL_70_UK }, { "80%", OPTION_VAL_80_UK }, { "90%", OPTION_VAL_90_UK }, - { "100%", OPTION_VAL_100_O57_UK }, + { "100%", OPTION_VAL_100_O45_UK }, { NULL, NULL }, }, "100%", @@ -66488,7 +78432,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_UK }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -66499,7 +78443,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { "vmu", { { "1x", OPTION_VAL_1X_UK }, - { "2x", OPTION_VAL_2_O27_UK }, + { "2x", OPTION_VAL_2_O26_UK }, { "3x", OPTION_VAL_3X_UK }, { "4x", OPTION_VAL_4_UK }, { "5x", OPTION_VAL_5X_UK }, @@ -66606,7 +78550,7 @@ struct retro_core_option_v2_definition option_defs_uk[] = { { "70%", OPTION_VAL_70_UK }, { "80%", OPTION_VAL_80_UK }, { "90%", OPTION_VAL_90_UK }, - { "100%", OPTION_VAL_100_O57_UK }, + { "100%", OPTION_VAL_100_O45_UK }, { NULL, NULL }, }, "100%", @@ -66630,6 +78574,8 @@ struct retro_core_options_v2 options_uk = { #define CATEGORY_HACKS_INFO_0_VAL NULL #define CATEGORY_INPUT_LABEL_VAL "Entrada" #define CATEGORY_INPUT_INFO_0_VAL NULL +#define CATEGORY_EXPANSIONS_LABEL_VAL NULL +#define CATEGORY_EXPANSIONS_INFO_0_VAL NULL #define CATEGORY_VMU_LABEL_VAL NULL #define CATEGORY_VMU_INFO_0_VAL NULL #define CORE_OPTION_NAME_REGION_LABEL_VAL "Regió" @@ -66651,8 +78597,6 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_VAL NULL #define CORE_OPTION_NAME_ENABLE_DSP_LABEL_VAL NULL #define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_VAL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_VAL NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_VAL NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_VAL NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_VAL NULL #define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_VAL NULL @@ -66663,33 +78607,33 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_UPNP_INFO_0_VAL NULL #define CORE_OPTION_NAME_INTERNAL_RESOLUTION_LABEL_VAL NULL #define CORE_OPTION_NAME_INTERNAL_RESOLUTION_INFO_0_VAL NULL -#define OPTION_VAL_320X240_VAL "320×240" -#define OPTION_VAL_640X480_VAL "640×480" -#define OPTION_VAL_800X600_VAL "800×600" -#define OPTION_VAL_960X720_VAL "960×720" -#define OPTION_VAL_1024X768_VAL "1024×768" -#define OPTION_VAL_1280X960_VAL "1280×960" -#define OPTION_VAL_1440X1080_VAL "1440×1080" -#define OPTION_VAL_1600X1200_VAL "1600×1200" -#define OPTION_VAL_1920X1440_VAL "1920×1440" -#define OPTION_VAL_2560X1920_VAL "2560×1920" -#define OPTION_VAL_2880X2160_VAL "2880×2160" -#define OPTION_VAL_3200X2400_VAL "3200×2400" -#define OPTION_VAL_3840X2880_VAL "3840×2880" -#define OPTION_VAL_4480X3360_VAL "4480×3360" -#define OPTION_VAL_5120X3840_VAL "5120×3840" -#define OPTION_VAL_5760X4320_VAL "5760×4320" -#define OPTION_VAL_6400X4800_VAL "6400×4800" -#define OPTION_VAL_7040X5280_VAL "7040×5280" -#define OPTION_VAL_7680X5760_VAL "7680×5760" -#define OPTION_VAL_8320X6240_VAL "8320×6240" -#define OPTION_VAL_8960X6720_VAL "8960×6720" -#define OPTION_VAL_9600X7200_VAL "9600×7200" -#define OPTION_VAL_10240X7680_VAL "10240×7680" -#define OPTION_VAL_10880X8160_VAL "10880×8160" -#define OPTION_VAL_11520X8640_VAL "11520×8640" -#define OPTION_VAL_12160X9120_VAL "12160×9120" -#define OPTION_VAL_12800X9600_VAL "12800×9600" +#define OPTION_VAL_320X240_VAL NULL +#define OPTION_VAL_640X480_VAL NULL +#define OPTION_VAL_800X600_VAL NULL +#define OPTION_VAL_960X720_VAL NULL +#define OPTION_VAL_1024X768_VAL NULL +#define OPTION_VAL_1280X960_VAL NULL +#define OPTION_VAL_1440X1080_VAL NULL +#define OPTION_VAL_1600X1200_VAL NULL +#define OPTION_VAL_1920X1440_VAL NULL +#define OPTION_VAL_2560X1920_VAL NULL +#define OPTION_VAL_2880X2160_VAL NULL +#define OPTION_VAL_3200X2400_VAL NULL +#define OPTION_VAL_3840X2880_VAL NULL +#define OPTION_VAL_4480X3360_VAL NULL +#define OPTION_VAL_5120X3840_VAL NULL +#define OPTION_VAL_5760X4320_VAL NULL +#define OPTION_VAL_6400X4800_VAL NULL +#define OPTION_VAL_7040X5280_VAL NULL +#define OPTION_VAL_7680X5760_VAL NULL +#define OPTION_VAL_8320X6240_VAL NULL +#define OPTION_VAL_8960X6720_VAL NULL +#define OPTION_VAL_9600X7200_VAL NULL +#define OPTION_VAL_10240X7680_VAL NULL +#define OPTION_VAL_10880X8160_VAL NULL +#define OPTION_VAL_11520X8640_VAL NULL +#define OPTION_VAL_12160X9120_VAL NULL +#define OPTION_VAL_12800X9600_VAL NULL #define CORE_OPTION_NAME_CABLE_TYPE_LABEL_VAL NULL #define CORE_OPTION_NAME_CABLE_TYPE_INFO_0_VAL NULL #define OPTION_VAL_VGA_VAL NULL @@ -66704,6 +78648,7 @@ struct retro_core_options_v2 options_uk = { #define OPTION_VAL_HORIZONTAL_VAL NULL #define OPTION_VAL_VERTICAL_VAL NULL #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_VAL NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_VAL NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_VAL NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_VAL NULL #define OPTION_VAL_PER_PIXEL_ACCURATE_VAL NULL @@ -66720,6 +78665,7 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_VAL NULL #define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_VAL NULL #define CORE_OPTION_NAME_MIPMAPPING_LABEL_VAL NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_VAL NULL #define CORE_OPTION_NAME_FOG_LABEL_VAL NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_VAL NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_VAL NULL @@ -66737,12 +78683,15 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_VAL NULL #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_VAL NULL #define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_VAL NULL -#define OPTION_VAL_2_O27_VAL NULL +#define OPTION_VAL_2_O26_VAL NULL #define OPTION_VAL_4_VAL NULL #define OPTION_VAL_6_VAL NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_VAL NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_VAL NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_VAL NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_VAL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_VAL NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_VAL NULL #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_VAL NULL #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_VAL NULL #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_VAL NULL @@ -66757,6 +78706,8 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_VAL NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_VAL NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_VAL NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_VAL NULL #define CORE_OPTION_NAME_SH4CLOCK_LABEL_VAL NULL #define CORE_OPTION_NAME_SH4CLOCK_INFO_0_VAL NULL #define OPTION_VAL_100_VAL NULL @@ -66801,8 +78752,11 @@ struct retro_core_options_v2 options_uk = { #define OPTION_VAL_490_VAL NULL #define OPTION_VAL_500_VAL NULL #define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_VAL NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_VAL NULL #define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_VAL NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_VAL NULL #define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_VAL NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_VAL NULL #define OPTION_VAL_0_VAL NULL #define OPTION_VAL_5_VAL NULL #define OPTION_VAL_10_VAL NULL @@ -66811,13 +78765,40 @@ struct retro_core_options_v2 options_uk = { #define OPTION_VAL_25_VAL NULL #define OPTION_VAL_30_VAL NULL #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_VAL NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_VAL NULL #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_VAL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_VAL NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_VAL NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_VAL NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_VAL NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_VAL NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_VAL NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_VAL NULL +#define OPTION_VAL_50_VAL NULL +#define OPTION_VAL_60_VAL NULL +#define OPTION_VAL_70_VAL NULL +#define OPTION_VAL_80_VAL NULL +#define OPTION_VAL_90_VAL NULL +#define OPTION_VAL_100_O45_VAL NULL +#define OPTION_VAL_110_O45_VAL NULL +#define OPTION_VAL_120_O45_VAL NULL +#define OPTION_VAL_130_O45_VAL NULL +#define OPTION_VAL_140_O45_VAL NULL +#define OPTION_VAL_150_O45_VAL NULL +#define OPTION_VAL_160_O45_VAL NULL +#define OPTION_VAL_170_O45_VAL NULL +#define OPTION_VAL_180_O45_VAL NULL +#define OPTION_VAL_190_O45_VAL NULL +#define OPTION_VAL_200_O45_VAL NULL +#define OPTION_VAL_210_O45_VAL NULL +#define OPTION_VAL_220_O45_VAL NULL +#define OPTION_VAL_230_O45_VAL NULL +#define OPTION_VAL_240_O45_VAL NULL +#define OPTION_VAL_250_O45_VAL NULL +#define OPTION_VAL_260_O45_VAL NULL +#define OPTION_VAL_270_O45_VAL NULL +#define OPTION_VAL_280_O45_VAL NULL +#define OPTION_VAL_290_O45_VAL NULL +#define OPTION_VAL_300_O45_VAL NULL #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_VAL NULL #define OPTION_VAL_WHITE_VAL NULL #define OPTION_VAL_RED_VAL NULL @@ -66826,6 +78807,25 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_VAL NULL #define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_VAL NULL #define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_VAL NULL +#define OPTION_VAL_VMU_VAL NULL +#define OPTION_VAL_PURUPURU_VAL NULL +#define OPTION_VAL_NONE_VAL "Cap" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_VAL NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_VAL NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_VAL NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_VAL NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_VAL NULL @@ -66876,12 +78876,6 @@ struct retro_core_options_v2 options_uk = { #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_VAL NULL #define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_VAL NULL #define OPTION_VAL_40_VAL NULL -#define OPTION_VAL_50_VAL NULL -#define OPTION_VAL_60_VAL NULL -#define OPTION_VAL_70_VAL NULL -#define OPTION_VAL_80_VAL NULL -#define OPTION_VAL_90_VAL NULL -#define OPTION_VAL_100_O57_VAL NULL #define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_VAL NULL #define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_VAL NULL #define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_VAL NULL @@ -66927,6 +78921,11 @@ struct retro_core_option_v2_category option_cats_val[] = { CATEGORY_INPUT_LABEL_VAL, CATEGORY_INPUT_INFO_0_VAL }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_VAL, + CATEGORY_EXPANSIONS_INFO_0_VAL + }, { "vmu", CATEGORY_VMU_LABEL_VAL, @@ -67016,20 +79015,6 @@ struct retro_core_option_v2_definition option_defs_val[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_VAL, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_VAL, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_VAL, @@ -67176,11 +79161,11 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_VAL, NULL, "video", { @@ -67226,6 +79211,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -67260,11 +79246,11 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_VAL, NULL, "video", { @@ -67346,7 +79332,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -67386,18 +79372,18 @@ struct retro_core_option_v2_definition option_defs_val[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_VAL }, + { "2", OPTION_VAL_2_O26_VAL }, { "4", OPTION_VAL_4_VAL }, { "6", OPTION_VAL_6_VAL }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_VAL, NULL, "video", { @@ -67423,6 +79409,20 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_VAL, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_VAL, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_VAL, @@ -67521,6 +79521,20 @@ struct retro_core_option_v2_definition option_defs_val[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_VAL, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_VAL, @@ -67578,7 +79592,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_VAL, NULL, "hacks", { @@ -67588,11 +79602,11 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_VAL, NULL, "hacks", { @@ -67606,7 +79620,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_VAL, NULL, "input", { @@ -67625,7 +79639,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_VAL, NULL, "input", { @@ -67644,7 +79658,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_VAL, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_VAL, NULL, "input", { @@ -67654,20 +79668,6 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_VAL, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_VAL, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_VAL, @@ -67696,6 +79696,44 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_VAL, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_VAL }, + { "60%", OPTION_VAL_60_VAL }, + { "70%", OPTION_VAL_70_VAL }, + { "80%", OPTION_VAL_80_VAL }, + { "90%", OPTION_VAL_90_VAL }, + { "100%", OPTION_VAL_100_O45_VAL }, + { "110%", OPTION_VAL_110_O45_VAL }, + { "120%", OPTION_VAL_120_O45_VAL }, + { "130%", OPTION_VAL_130_O45_VAL }, + { "140%", OPTION_VAL_140_O45_VAL }, + { "150%", OPTION_VAL_150_O45_VAL }, + { "160%", OPTION_VAL_160_O45_VAL }, + { "170%", OPTION_VAL_170_O45_VAL }, + { "180%", OPTION_VAL_180_O45_VAL }, + { "190%", OPTION_VAL_190_O45_VAL }, + { "200%", OPTION_VAL_200_O45_VAL }, + { "210%", OPTION_VAL_210_O45_VAL }, + { "220%", OPTION_VAL_220_O45_VAL }, + { "230%", OPTION_VAL_230_O45_VAL }, + { "240%", OPTION_VAL_240_O45_VAL }, + { "250%", OPTION_VAL_250_O45_VAL }, + { "260%", OPTION_VAL_260_O45_VAL }, + { "270%", OPTION_VAL_270_O45_VAL }, + { "280%", OPTION_VAL_280_O45_VAL }, + { "290%", OPTION_VAL_290_O45_VAL }, + { "300%", OPTION_VAL_300_O45_VAL }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_VAL, @@ -67764,6 +79802,126 @@ struct retro_core_option_v2_definition option_defs_val[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_VAL, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_VAL, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VAL }, + { "Purupuru", OPTION_VAL_PURUPURU_VAL }, + { "None", OPTION_VAL_NONE_VAL }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_VAL, @@ -67845,7 +80003,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { "vmu", { { "1x", OPTION_VAL_1X_VAL }, - { "2x", OPTION_VAL_2_O27_VAL }, + { "2x", OPTION_VAL_2_O26_VAL }, { "3x", OPTION_VAL_3X_VAL }, { "4x", OPTION_VAL_4_VAL }, { "5x", OPTION_VAL_5X_VAL }, @@ -67952,7 +80110,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "70%", OPTION_VAL_70_VAL }, { "80%", OPTION_VAL_80_VAL }, { "90%", OPTION_VAL_90_VAL }, - { "100%", OPTION_VAL_100_O57_VAL }, + { "100%", OPTION_VAL_100_O45_VAL }, { NULL, NULL }, }, "100%", @@ -67985,7 +80143,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VAL }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", @@ -67996,7 +80154,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { "vmu", { { "1x", OPTION_VAL_1X_VAL }, - { "2x", OPTION_VAL_2_O27_VAL }, + { "2x", OPTION_VAL_2_O26_VAL }, { "3x", OPTION_VAL_3X_VAL }, { "4x", OPTION_VAL_4_VAL }, { "5x", OPTION_VAL_5X_VAL }, @@ -68103,7 +80261,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "70%", OPTION_VAL_70_VAL }, { "80%", OPTION_VAL_80_VAL }, { "90%", OPTION_VAL_90_VAL }, - { "100%", OPTION_VAL_100_O57_VAL }, + { "100%", OPTION_VAL_100_O45_VAL }, { NULL, NULL }, }, "100%", @@ -68136,7 +80294,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VAL }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -68147,7 +80305,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { "vmu", { { "1x", OPTION_VAL_1X_VAL }, - { "2x", OPTION_VAL_2_O27_VAL }, + { "2x", OPTION_VAL_2_O26_VAL }, { "3x", OPTION_VAL_3X_VAL }, { "4x", OPTION_VAL_4_VAL }, { "5x", OPTION_VAL_5X_VAL }, @@ -68254,7 +80412,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "70%", OPTION_VAL_70_VAL }, { "80%", OPTION_VAL_80_VAL }, { "90%", OPTION_VAL_90_VAL }, - { "100%", OPTION_VAL_100_O57_VAL }, + { "100%", OPTION_VAL_100_O45_VAL }, { NULL, NULL }, }, "100%", @@ -68287,7 +80445,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VAL }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -68298,7 +80456,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { "vmu", { { "1x", OPTION_VAL_1X_VAL }, - { "2x", OPTION_VAL_2_O27_VAL }, + { "2x", OPTION_VAL_2_O26_VAL }, { "3x", OPTION_VAL_3X_VAL }, { "4x", OPTION_VAL_4_VAL }, { "5x", OPTION_VAL_5X_VAL }, @@ -68405,7 +80563,7 @@ struct retro_core_option_v2_definition option_defs_val[] = { { "70%", OPTION_VAL_70_VAL }, { "80%", OPTION_VAL_80_VAL }, { "90%", OPTION_VAL_90_VAL }, - { "100%", OPTION_VAL_100_O57_VAL }, + { "100%", OPTION_VAL_100_O45_VAL }, { NULL, NULL }, }, "100%", @@ -68423,12 +80581,14 @@ struct retro_core_options_v2 options_val = { #define CATEGORY_SYSTEM_INFO_0_VN NULL #define CATEGORY_VIDEO_LABEL_VN "Hình ảnh" #define CATEGORY_VIDEO_INFO_0_VN NULL -#define CATEGORY_PERFORMANCE_LABEL_VN NULL +#define CATEGORY_PERFORMANCE_LABEL_VN "Hiệu năng" #define CATEGORY_PERFORMANCE_INFO_0_VN NULL #define CATEGORY_HACKS_LABEL_VN "Hacks giả lập" #define CATEGORY_HACKS_INFO_0_VN NULL #define CATEGORY_INPUT_LABEL_VN "Input Driver" #define CATEGORY_INPUT_INFO_0_VN NULL +#define CATEGORY_EXPANSIONS_LABEL_VN NULL +#define CATEGORY_EXPANSIONS_INFO_0_VN NULL #define CATEGORY_VMU_LABEL_VN NULL #define CATEGORY_VMU_INFO_0_VN NULL #define CORE_OPTION_NAME_REGION_LABEL_VN "Khu vực" @@ -68450,8 +80610,6 @@ struct retro_core_options_v2 options_val = { #define CORE_OPTION_NAME_BOOT_TO_BIOS_INFO_0_VN NULL #define CORE_OPTION_NAME_ENABLE_DSP_LABEL_VN NULL #define CORE_OPTION_NAME_ENABLE_DSP_INFO_0_VN NULL -#define CORE_OPTION_NAME_FORCE_WINCE_LABEL_VN NULL -#define CORE_OPTION_NAME_FORCE_WINCE_INFO_0_VN NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_VN NULL #define CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_INFO_0_VN NULL #define CORE_OPTION_NAME_FORCE_FREEPLAY_LABEL_VN NULL @@ -68503,6 +80661,7 @@ struct retro_core_options_v2 options_val = { #define OPTION_VAL_HORIZONTAL_VN NULL #define OPTION_VAL_VERTICAL_VN NULL #define CORE_OPTION_NAME_ALPHA_SORTING_LABEL_VN NULL +#define CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_VN NULL #define OPTION_VAL_PER_STRIP_FAST_LEAST_ACCURATE_VN NULL #define OPTION_VAL_PER_TRIANGLE_NORMAL_VN NULL #define OPTION_VAL_PER_PIXEL_ACCURATE_VN NULL @@ -68519,6 +80678,7 @@ struct retro_core_options_v2 options_val = { #define CORE_OPTION_NAME_ENABLE_RTTB_LABEL_VN NULL #define CORE_OPTION_NAME_ENABLE_RTTB_INFO_0_VN NULL #define CORE_OPTION_NAME_MIPMAPPING_LABEL_VN NULL +#define CORE_OPTION_NAME_MIPMAPPING_INFO_0_VN NULL #define CORE_OPTION_NAME_FOG_LABEL_VN NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_LABEL_VN NULL #define CORE_OPTION_NAME_VOLUME_MODIFIER_ENABLE_INFO_0_VN NULL @@ -68530,18 +80690,21 @@ struct retro_core_options_v2 options_val = { #define OPTION_VAL_2_VN NULL #define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_LABEL_VN NULL #define CORE_OPTION_NAME_DELAY_FRAME_SWAPPING_INFO_0_VN NULL -#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_VN NULL +#define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_LABEL_VN "Phát hiện sự thay đổi tốc độ khung hình" #define CORE_OPTION_NAME_DETECT_VSYNC_SWAP_INTERVAL_INFO_0_VN NULL #define CORE_OPTION_NAME_PVR2_FILTERING_LABEL_VN NULL #define CORE_OPTION_NAME_PVR2_FILTERING_INFO_0_VN NULL #define CORE_OPTION_NAME_TEXUPSCALE_LABEL_VN NULL #define CORE_OPTION_NAME_TEXUPSCALE_INFO_0_VN NULL -#define OPTION_VAL_2_O27_VN NULL +#define OPTION_VAL_2_O26_VN NULL #define OPTION_VAL_4_VN NULL #define OPTION_VAL_6_VN NULL #define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_VN NULL +#define CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_VN NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_LABEL_VN NULL #define CORE_OPTION_NAME_NATIVE_DEPTH_INTERPOLATION_INFO_0_VN NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_VN NULL +#define CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_VN NULL #define CORE_OPTION_NAME_THREADED_RENDERING_LABEL_VN NULL #define CORE_OPTION_NAME_THREADED_RENDERING_INFO_0_VN NULL #define CORE_OPTION_NAME_AUTO_SKIP_FRAME_LABEL_VN NULL @@ -68556,6 +80719,8 @@ struct retro_core_options_v2 options_val = { #define CORE_OPTION_NAME_WIDESCREEN_HACK_INFO_0_VN NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_LABEL_VN NULL #define CORE_OPTION_NAME_GDROM_FAST_LOADING_INFO_0_VN NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_LABEL_VN NULL +#define CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_VN NULL #define CORE_OPTION_NAME_SH4CLOCK_LABEL_VN NULL #define CORE_OPTION_NAME_SH4CLOCK_INFO_0_VN NULL #define OPTION_VAL_100_VN NULL @@ -68600,8 +80765,11 @@ struct retro_core_options_v2 options_val = { #define OPTION_VAL_490_VN NULL #define OPTION_VAL_500_VN NULL #define CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_VN NULL +#define CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_VN NULL #define CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_VN NULL +#define CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_VN NULL #define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_VN NULL +#define CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_VN NULL #define OPTION_VAL_0_VN NULL #define OPTION_VAL_5_VN NULL #define OPTION_VAL_10_VN NULL @@ -68610,13 +80778,40 @@ struct retro_core_options_v2 options_val = { #define OPTION_VAL_25_VN NULL #define OPTION_VAL_30_VN NULL #define CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_VN NULL +#define CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_VN NULL #define CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_VN NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_VN NULL -#define CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_VN NULL +#define CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_VN NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_VN NULL #define CORE_OPTION_NAME_NETWORK_OUTPUT_INFO_0_VN NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_LABEL_VN NULL #define CORE_OPTION_NAME_SHOW_LIGHTGUN_SETTINGS_INFO_0_VN NULL +#define CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_VN NULL +#define OPTION_VAL_50_VN NULL +#define OPTION_VAL_60_VN NULL +#define OPTION_VAL_70_VN NULL +#define OPTION_VAL_80_VN NULL +#define OPTION_VAL_90_VN NULL +#define OPTION_VAL_100_O45_VN NULL +#define OPTION_VAL_110_O45_VN NULL +#define OPTION_VAL_120_O45_VN NULL +#define OPTION_VAL_130_O45_VN NULL +#define OPTION_VAL_140_O45_VN NULL +#define OPTION_VAL_150_O45_VN NULL +#define OPTION_VAL_160_O45_VN NULL +#define OPTION_VAL_170_O45_VN NULL +#define OPTION_VAL_180_O45_VN NULL +#define OPTION_VAL_190_O45_VN NULL +#define OPTION_VAL_200_O45_VN NULL +#define OPTION_VAL_210_O45_VN NULL +#define OPTION_VAL_220_O45_VN NULL +#define OPTION_VAL_230_O45_VN NULL +#define OPTION_VAL_240_O45_VN NULL +#define OPTION_VAL_250_O45_VN NULL +#define OPTION_VAL_260_O45_VN NULL +#define OPTION_VAL_270_O45_VN NULL +#define OPTION_VAL_280_O45_VN NULL +#define OPTION_VAL_290_O45_VN NULL +#define OPTION_VAL_300_O45_VN NULL #define CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_VN NULL #define OPTION_VAL_WHITE_VN NULL #define OPTION_VAL_RED_VN NULL @@ -68625,6 +80820,25 @@ struct retro_core_options_v2 options_val = { #define CORE_OPTION_NAME_LIGHTGUN2_CROSSHAIR_LABEL_VN NULL #define CORE_OPTION_NAME_LIGHTGUN3_CROSSHAIR_LABEL_VN NULL #define CORE_OPTION_NAME_LIGHTGUN4_CROSSHAIR_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_VN NULL +#define OPTION_VAL_VMU_VN NULL +#define OPTION_VAL_PURUPURU_VN NULL +#define OPTION_VAL_NONE_VN "Không" +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_VN NULL +#define CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_VN NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_VN NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_CAT_VN NULL #define CORE_OPTION_NAME_PER_CONTENT_VMUS_INFO_0_VN NULL @@ -68675,12 +80889,6 @@ struct retro_core_options_v2 options_val = { #define CORE_OPTION_NAME_VMU1_PIXEL_OFF_COLOR_LABEL_VN NULL #define CORE_OPTION_NAME_VMU1_SCREEN_OPACITY_LABEL_VN NULL #define OPTION_VAL_40_VN NULL -#define OPTION_VAL_50_VN NULL -#define OPTION_VAL_60_VN NULL -#define OPTION_VAL_70_VN NULL -#define OPTION_VAL_80_VN NULL -#define OPTION_VAL_90_VN NULL -#define OPTION_VAL_100_O57_VN NULL #define CORE_OPTION_NAME_VMU2_SCREEN_DISPLAY_LABEL_VN NULL #define CORE_OPTION_NAME_VMU2_SCREEN_POSITION_LABEL_VN NULL #define CORE_OPTION_NAME_VMU2_SCREEN_SIZE_MULT_LABEL_VN NULL @@ -68726,6 +80934,11 @@ struct retro_core_option_v2_category option_cats_vn[] = { CATEGORY_INPUT_LABEL_VN, CATEGORY_INPUT_INFO_0_VN }, + { + "expansions", + CATEGORY_EXPANSIONS_LABEL_VN, + CATEGORY_EXPANSIONS_INFO_0_VN + }, { "vmu", CATEGORY_VMU_LABEL_VN, @@ -68815,20 +81028,6 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "enabled", #endif }, - { - CORE_OPTION_NAME "_force_wince", - CORE_OPTION_NAME_FORCE_WINCE_LABEL_VN, - NULL, - CORE_OPTION_NAME_FORCE_WINCE_INFO_0_VN, - NULL, - "system", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "disabled", - }, { CORE_OPTION_NAME "_allow_service_buttons", CORE_OPTION_NAME_ALLOW_SERVICE_BUTTONS_LABEL_VN, @@ -68975,11 +81174,11 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "horizontal", }, - {/* TODO: needs explanation */ + {/* TODO: needs better explanation? */ CORE_OPTION_NAME "_alpha_sorting", CORE_OPTION_NAME_ALPHA_SORTING_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_ALPHA_SORTING_INFO_0_VN, NULL, "video", { @@ -69025,6 +81224,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "16", NULL }, { "32", NULL }, { "64", NULL }, + { "96", NULL }, { "128", NULL }, { NULL, NULL }, }, @@ -69059,11 +81259,11 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled", }, - {/* TODO: needs explanation */ + { CORE_OPTION_NAME "_mipmapping", CORE_OPTION_NAME_MIPMAPPING_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_MIPMAPPING_INFO_0_VN, NULL, "video", { @@ -69145,7 +81345,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "enabled", NULL }, { NULL, NULL }, }, - "disabled", + "enabled", }, { CORE_OPTION_NAME "_detect_vsync_swap_interval", @@ -69185,18 +81385,18 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "video", { { "1", "disabled" }, - { "2", OPTION_VAL_2_O27_VN }, + { "2", OPTION_VAL_2_O26_VN }, { "4", OPTION_VAL_4_VN }, { "6", OPTION_VAL_6_VN }, { NULL, NULL }, }, "1", }, - {/* TODO: needs clarification */ + { CORE_OPTION_NAME "_texupscale_max_filtered_texture_size", CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_TEXUPSCALE_MAX_FILTERED_TEXTURE_SIZE_INFO_0_VN, NULL, "video", { @@ -69222,6 +81422,20 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_fix_upscale_bleeding_edge", + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_LABEL_VN, + NULL, + CORE_OPTION_NAME_FIX_UPSCALE_BLEEDING_EDGE_INFO_0_VN, + NULL, + "video", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "enabled", + }, { CORE_OPTION_NAME "_threaded_rendering", CORE_OPTION_NAME_THREADED_RENDERING_LABEL_VN, @@ -69320,6 +81534,20 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "disabled", #endif }, + { + CORE_OPTION_NAME "_dc_32mb_mod", + CORE_OPTION_NAME_DC_32MB_MOD_LABEL_VN, + NULL, + CORE_OPTION_NAME_DC_32MB_MOD_INFO_0_VN, + NULL, + "hacks", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled", + }, { CORE_OPTION_NAME "_sh4clock", CORE_OPTION_NAME_SH4CLOCK_LABEL_VN, @@ -69377,7 +81605,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { CORE_OPTION_NAME "_custom_textures", CORE_OPTION_NAME_CUSTOM_TEXTURES_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_CUSTOM_TEXTURES_INFO_0_VN, NULL, "hacks", { @@ -69387,11 +81615,11 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled", }, - {/* TODO: probably needs explanation */ + { CORE_OPTION_NAME "_dump_textures", CORE_OPTION_NAME_DUMP_TEXTURES_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_DUMP_TEXTURES_INFO_0_VN, NULL, "hacks", { @@ -69405,7 +81633,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { CORE_OPTION_NAME "_analog_stick_deadzone", CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_ANALOG_STICK_DEADZONE_INFO_0_VN, NULL, "input", { @@ -69424,7 +81652,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { CORE_OPTION_NAME "_trigger_deadzone", CORE_OPTION_NAME_TRIGGER_DEADZONE_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_TRIGGER_DEADZONE_INFO_0_VN, NULL, "input", { @@ -69443,7 +81671,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { CORE_OPTION_NAME "_digital_triggers", CORE_OPTION_NAME_DIGITAL_TRIGGERS_LABEL_VN, NULL, - "", + CORE_OPTION_NAME_DIGITAL_TRIGGERS_INFO_0_VN, NULL, "input", { @@ -69453,20 +81681,6 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled", }, - { - CORE_OPTION_NAME "_enable_purupuru", - CORE_OPTION_NAME_ENABLE_PURUPURU_LABEL_VN, - NULL, - CORE_OPTION_NAME_ENABLE_PURUPURU_INFO_0_VN, - NULL, - "input", - { - { "disabled", NULL }, - { "enabled", NULL }, - { NULL, NULL }, - }, - "enabled", - }, { CORE_OPTION_NAME "_network_output", CORE_OPTION_NAME_NETWORK_OUTPUT_LABEL_VN, @@ -69495,6 +81709,44 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled" }, + { + CORE_OPTION_NAME "_lightgun_crosshair_size_scaling", + CORE_OPTION_NAME_LIGHTGUN_CROSSHAIR_SIZE_SCALING_LABEL_VN, + NULL, + "", + NULL, + "input", + { + { "50%", OPTION_VAL_50_VN }, + { "60%", OPTION_VAL_60_VN }, + { "70%", OPTION_VAL_70_VN }, + { "80%", OPTION_VAL_80_VN }, + { "90%", OPTION_VAL_90_VN }, + { "100%", OPTION_VAL_100_O45_VN }, + { "110%", OPTION_VAL_110_O45_VN }, + { "120%", OPTION_VAL_120_O45_VN }, + { "130%", OPTION_VAL_130_O45_VN }, + { "140%", OPTION_VAL_140_O45_VN }, + { "150%", OPTION_VAL_150_O45_VN }, + { "160%", OPTION_VAL_160_O45_VN }, + { "170%", OPTION_VAL_170_O45_VN }, + { "180%", OPTION_VAL_180_O45_VN }, + { "190%", OPTION_VAL_190_O45_VN }, + { "200%", OPTION_VAL_200_O45_VN }, + { "210%", OPTION_VAL_210_O45_VN }, + { "220%", OPTION_VAL_220_O45_VN }, + { "230%", OPTION_VAL_230_O45_VN }, + { "240%", OPTION_VAL_240_O45_VN }, + { "250%", OPTION_VAL_250_O45_VN }, + { "260%", OPTION_VAL_260_O45_VN }, + { "270%", OPTION_VAL_270_O45_VN }, + { "280%", OPTION_VAL_280_O45_VN }, + { "290%", OPTION_VAL_290_O45_VN }, + { "300%", OPTION_VAL_300_O45_VN }, + { NULL, NULL }, + }, + "100%", + }, { CORE_OPTION_NAME "_lightgun1_crosshair", CORE_OPTION_NAME_LIGHTGUN1_CROSSHAIR_LABEL_VN, @@ -69563,6 +81815,126 @@ struct retro_core_option_v2_definition option_defs_vn[] = { }, "disabled", }, + { + CORE_OPTION_NAME "_device_port1_slot1", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT1_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port1_slot2", + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT1_SLOT2_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port2_slot1", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT1_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port2_slot2", + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT2_SLOT2_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port3_slot1", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT1_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port3_slot2", + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT3_SLOT2_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "Purupuru", + }, + { + CORE_OPTION_NAME "_device_port4_slot1", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT1_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "VMU", + }, + { + CORE_OPTION_NAME "_device_port4_slot2", + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_LABEL_VN, + NULL, + CORE_OPTION_NAME_DEVICE_PORT4_SLOT2_INFO_0_VN, + NULL, + "expansions", + { + { "VMU", OPTION_VAL_VMU_VN }, + { "Purupuru", OPTION_VAL_PURUPURU_VN }, + { "None", OPTION_VAL_NONE_VN }, + { NULL, NULL }, + }, + "Purupuru", + }, { CORE_OPTION_NAME "_per_content_vmus", CORE_OPTION_NAME_PER_CONTENT_VMUS_LABEL_VN, @@ -69644,7 +82016,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "vmu", { { "1x", OPTION_VAL_1X_VN }, - { "2x", OPTION_VAL_2_O27_VN }, + { "2x", OPTION_VAL_2_O26_VN }, { "3x", OPTION_VAL_3X_VN }, { "4x", OPTION_VAL_4_VN }, { "5x", OPTION_VAL_5X_VN }, @@ -69751,7 +82123,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "70%", OPTION_VAL_70_VN }, { "80%", OPTION_VAL_80_VN }, { "90%", OPTION_VAL_90_VN }, - { "100%", OPTION_VAL_100_O57_VN }, + { "100%", OPTION_VAL_100_O45_VN }, { NULL, NULL }, }, "100%", @@ -69784,7 +82156,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VN }, { NULL, NULL }, }, - "Upper Left", + "Upper Right", }, { CORE_OPTION_NAME "_vmu2_screen_size_mult", @@ -69795,7 +82167,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "vmu", { { "1x", OPTION_VAL_1X_VN }, - { "2x", OPTION_VAL_2_O27_VN }, + { "2x", OPTION_VAL_2_O26_VN }, { "3x", OPTION_VAL_3X_VN }, { "4x", OPTION_VAL_4_VN }, { "5x", OPTION_VAL_5X_VN }, @@ -69902,7 +82274,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "70%", OPTION_VAL_70_VN }, { "80%", OPTION_VAL_80_VN }, { "90%", OPTION_VAL_90_VN }, - { "100%", OPTION_VAL_100_O57_VN }, + { "100%", OPTION_VAL_100_O45_VN }, { NULL, NULL }, }, "100%", @@ -69935,7 +82307,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VN }, { NULL, NULL }, }, - "Upper Left", + "Lower Left", }, { CORE_OPTION_NAME "_vmu3_screen_size_mult", @@ -69946,7 +82318,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "vmu", { { "1x", OPTION_VAL_1X_VN }, - { "2x", OPTION_VAL_2_O27_VN }, + { "2x", OPTION_VAL_2_O26_VN }, { "3x", OPTION_VAL_3X_VN }, { "4x", OPTION_VAL_4_VN }, { "5x", OPTION_VAL_5X_VN }, @@ -70053,7 +82425,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "70%", OPTION_VAL_70_VN }, { "80%", OPTION_VAL_80_VN }, { "90%", OPTION_VAL_90_VN }, - { "100%", OPTION_VAL_100_O57_VN }, + { "100%", OPTION_VAL_100_O45_VN }, { NULL, NULL }, }, "100%", @@ -70086,7 +82458,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "Lower Right", OPTION_VAL_LOWER_RIGHT_VN }, { NULL, NULL }, }, - "Upper Left", + "Lower Right", }, { CORE_OPTION_NAME "_vmu4_screen_size_mult", @@ -70097,7 +82469,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { "vmu", { { "1x", OPTION_VAL_1X_VN }, - { "2x", OPTION_VAL_2_O27_VN }, + { "2x", OPTION_VAL_2_O26_VN }, { "3x", OPTION_VAL_3X_VN }, { "4x", OPTION_VAL_4_VN }, { "5x", OPTION_VAL_5X_VN }, @@ -70204,7 +82576,7 @@ struct retro_core_option_v2_definition option_defs_vn[] = { { "70%", OPTION_VAL_70_VN }, { "80%", OPTION_VAL_80_VN }, { "90%", OPTION_VAL_90_VN }, - { "100%", OPTION_VAL_100_O57_VN }, + { "100%", OPTION_VAL_100_O45_VN }, { NULL, NULL }, }, "100%", diff --git a/shell/libretro/option.cpp b/shell/libretro/option.cpp index cd5f9498d..0e2569abd 100644 --- a/shell/libretro/option.cpp +++ b/shell/libretro/option.cpp @@ -32,7 +32,6 @@ Option Cable("", 3); // TV Composite Option Region(CORE_OPTION_NAME "_region", 1); // USA Option Broadcast(CORE_OPTION_NAME "_broadcast", 0); // NTSC Option Language(CORE_OPTION_NAME "_language", 1); // English -Option ForceWindowsCE(CORE_OPTION_NAME "_force_wince"); Option AutoLoadState(""); Option AutoSaveState(""); Option SavestateSlot(""); @@ -70,7 +69,7 @@ Option ScreenStretching("", 100); Option Fog(CORE_OPTION_NAME "_fog", true); Option FloatVMUs(""); Option Rotate90(""); -Option PerStripSorting("rend.PerStripSorting"); +Option PerStripSorting(""); Option DelayFrameSwapping(CORE_OPTION_NAME "_delay_frame_swapping"); Option WidescreenGameHacks(CORE_OPTION_NAME "_widescreen_cheats"); std::array, 4> CrosshairColor { @@ -88,10 +87,11 @@ Option ThreadedRendering(CORE_OPTION_NAME "_threaded_rendering", true); Option AnisotropicFiltering(CORE_OPTION_NAME "_anisotropic_filtering"); Option TextureFiltering(CORE_OPTION_NAME "_texture_filtering"); Option PowerVR2Filter(CORE_OPTION_NAME "_pvr2_filtering"); -Option PixelBufferSize("", 512 * 1024 * 1024); +Option PixelBufferSize("", 512_MB); IntOption PerPixelLayers(CORE_OPTION_NAME "_oit_layers"); Option NativeDepthInterpolation(CORE_OPTION_NAME "_native_depth_interpolation"); Option EmulateFramebuffer(CORE_OPTION_NAME "_emulate_framebuffer", false); +Option FixUpscaleBleedingEdge(CORE_OPTION_NAME "_fix_upscale_bleeding_edge", true); // Misc @@ -101,6 +101,7 @@ Option UseReios(CORE_OPTION_NAME "_hle_bios"); Option OpenGlChecks("", false); Option FastGDRomLoad(CORE_OPTION_NAME "_gdrom_fast_loading", false); +Option RamMod32MB(CORE_OPTION_NAME "_dc_32mb_mod", false); //Option, false> ContentPath(""); //Option HideLegacyNaomiRoms("", true); @@ -109,7 +110,7 @@ Option FastGDRomLoad(CORE_OPTION_NAME "_gdrom_fast_loading", false); Option NetworkEnable("", false); Option ActAsServer("", false); -OptionString DNS("", "46.101.91.123"); +OptionString DNS("", "dns.flyca.st"); OptionString NetworkServer("", ""); Option LocalPort("", 0); Option EmulateBBA(CORE_OPTION_NAME "_emulate_bba", false); @@ -120,6 +121,7 @@ Option NetworkStats("", false); Option GGPOAnalogAxes("", 0); Option NetworkOutput(CORE_OPTION_NAME "_network_output", false); Option MultiboardSlaves("", 0); +Option BattleCableEnable("", false); // Maple diff --git a/shell/libretro/option_lr.h b/shell/libretro/option_lr.h index 0817cd830..ef8aadb48 100644 --- a/shell/libretro/option_lr.h +++ b/shell/libretro/option_lr.h @@ -86,7 +86,7 @@ class Option : public BaseOption { } void load() override { - if (!name.empty()) + if (!name.empty() && !overridden) set(doLoad(name)); } @@ -193,10 +193,14 @@ class IntOption : public Option { { } - void load() override { - retro_variable var { name.c_str() }; - if (settings.retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value != nullptr) - set(atoi(var.value)); + void load() override + { + if (!name.empty() && !overridden) + { + retro_variable var { name.c_str() }; + if (settings.retroEnv(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value != nullptr) + set(atoi(var.value)); + } } }; diff --git a/shell/libretro/oslib.cpp b/shell/libretro/oslib.cpp index 4f7bfa872..2845b46fd 100644 --- a/shell/libretro/oslib.cpp +++ b/shell/libretro/oslib.cpp @@ -19,33 +19,51 @@ #include "oslib/oslib.h" #include "stdclass.h" #include "file/file_path.h" +#ifndef _WIN32 +#include +#endif const char *retro_get_system_directory(); extern char game_dir_no_slash[1024]; extern char vmu_dir_no_slash[PATH_MAX]; extern char content_name[PATH_MAX]; +extern char g_roms_dir[PATH_MAX]; extern unsigned per_content_vmus; extern std::string arcadeFlashPath; namespace hostfs { -std::string getVmuPath(const std::string& port) +std::string getVmuPath(const std::string& port, bool save) { - char filename[PATH_MAX + 8]; - - if ((per_content_vmus == 1 && port == "A1") - || per_content_vmus == 2) - { - sprintf(filename, "%s.%s.bin", content_name, port.c_str()); - return std::string(vmu_dir_no_slash) + std::string(path_default_slash()) + filename; - } - else - { - sprintf(filename, "vmu_save_%s.bin", port.c_str()); - return std::string(game_dir_no_slash) + std::string(path_default_slash()) + filename; - } + if ((per_content_vmus == 1 && port == "A1") + || per_content_vmus == 2) + { + std::string vmuDir = vmu_dir_no_slash + std::string(path_default_slash()); + if (settings.platform.isConsole() && !settings.content.gameId.empty()) + { + constexpr std::string_view INVALID_CHARS { " /\\:*?|<>" }; + std::string vmuName = settings.content.gameId; + for (char &c: vmuName) + if (INVALID_CHARS.find(c) != INVALID_CHARS.npos) + c = '_'; + vmuName += "." + port + ".bin"; + std::string wpath = vmuDir + vmuName; + if (save || file_exists(wpath.c_str())) + return wpath; + // Legacy path with rom name + std::string rpath = vmuDir + std::string(content_name) + "." + port + ".bin"; + if (file_exists(rpath.c_str())) + return rpath; + else + return wpath; + } + return vmuDir + std::string(content_name) + "." + port + ".bin"; + } + else { + return std::string(game_dir_no_slash) + std::string(path_default_slash()) + "vmu_save_" + port + ".bin"; + } } std::string getArcadeFlashPath() @@ -99,10 +117,14 @@ std::string findNaomiBios(const std::string& name) { std::string basepath(game_dir_no_slash); basepath += path_default_slash() + name; - if (file_exists(basepath)) - return basepath; - else - return ""; + if (!file_exists(basepath)) + { + // File not found in system dir, try game dir instead + basepath = g_roms_dir + name; + if (!file_exists(basepath)) + return ""; + } + return basepath; } std::string getSavestatePath(int index, bool writable) @@ -128,14 +150,30 @@ std::string getTextureDumpPath() + "texdump" + std::string(path_default_slash()); } +std::string getScreenshotsPath() +{ + // Unfortunately retroarch doesn't expose its "screenshots" path + return std::string(retro_get_system_directory()) + "/dc"; } -void dc_savestate(int index = 0) +void saveScreenshot(const std::string& name, const std::vector& data) { - die("unsupported"); + std::string path = getScreenshotsPath(); + path += "/" + name; + FILE *f = nowide::fopen(path.c_str(), "wb"); + if (f == nullptr) + throw FlycastException(path); + if (std::fwrite(&data[0], data.size(), 1, f) != 1) { + std::fclose(f); + unlink(path.c_str()); + throw FlycastException(path); + } + std::fclose(f); } -void dc_loadstate(int index = 0) -{ - die("unsupported"); } + +#if defined(_WIN32) || defined(__APPLE__) +void os_SetThreadName(const char *name) { +} +#endif diff --git a/shell/libretro/vmu_xhair.cpp b/shell/libretro/vmu_xhair.cpp index 5a1cf7030..d90729f28 100644 --- a/shell/libretro/vmu_xhair.cpp +++ b/shell/libretro/vmu_xhair.cpp @@ -112,6 +112,7 @@ u8 lightgun_palette[LIGHTGUN_COLORS_COUNT*3] = }; lightgun_params_t lightgun_params[4]; +float lightgun_crosshair_size = (float)LIGHTGUN_CROSSHAIR_SIZE; std::pair getCrosshairPosition(int playerNum) { diff --git a/shell/libretro/vmu_xhair.h b/shell/libretro/vmu_xhair.h index 208eed9f9..4bf13709f 100644 --- a/shell/libretro/vmu_xhair.h +++ b/shell/libretro/vmu_xhair.h @@ -111,3 +111,4 @@ struct lightgun_params_t { extern u8 lightgun_palette[LIGHTGUN_COLORS_COUNT*3]; extern u8 lightgun_img_crosshair[LIGHTGUN_CROSSHAIR_SIZE*LIGHTGUN_CROSSHAIR_SIZE]; extern lightgun_params_t lightgun_params[4] ; +extern float lightgun_crosshair_size; diff --git a/shell/linux/make-appimage.sh b/shell/linux/make-appimage.sh index 67f594dc8..e8dddbfdd 100755 --- a/shell/linux/make-appimage.sh +++ b/shell/linux/make-appimage.sh @@ -72,6 +72,7 @@ SHLIBS=( libsqlite3.so.0 libcrypt.so.1 libbsd.so.0 + libcdio.so.18 ) if [ ! -f appimagetool-x86_64.AppImage ]; then diff --git a/shell/linux/make-appimage_32-bit.sh b/shell/linux/make-appimage_32-bit.sh new file mode 100644 index 000000000..d9f10365e --- /dev/null +++ b/shell/linux/make-appimage_32-bit.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +if [ "$#" -ne 3 ]; then + echo "Syntax: $0 " + exit 1 +fi + +SHLIBS=( + libcurl.so.4 + libz.so.1 + liblua5.3.so.0 + libminiupnpc.so.17 + libgomp.so.1 + libao.so.4 + libpulse.so.0 +# libzip.so.5 + libnghttp2.so.14 + libidn2.so.0 + librtmp.so.1 +# libssh.so.4 + libpsl.so.5 +# libssl.so.1.1 +# libcrypto.so.1.1 + libgssapi_krb5.so.2 +# libldap_r-2.4.so.2 +# liblber-2.4.so.2 + libbrotlidec.so.1 +# pulseaudio/libpulsecommon-13.99.so + libdbus-1.so.3 + libbz2.so.1.0 + libunistring.so.2 + libgnutls.so.30 +# libhogweed.so.5 +# libnettle.so.7 + libgmp.so.10 + libkrb5.so.3 + libk5crypto.so.3 + libcom_err.so.2 + libkrb5support.so.0 + libresolv.so.2 + libsasl2.so.2 +# libgssapi.so.3 + libbrotlicommon.so.1 + libxcb.so.1 + libsystemd.so.0 + libwrap.so.0 + libsndfile.so.1 + libasyncns.so.0 + libapparmor.so.1 + libp11-kit.so.0 + libtasn1.so.6 + libkeyutils.so.1 +# libheimntlm.so.0 +# libkrb5.so.26 +# libasn1.so.8 +# libhcrypto.so.4 +# libroken.so.18 + libXau.so.6 + libXdmcp.so.6 + liblzma.so.5 + liblz4.so.1 + libgcrypt.so.20 + libnsl.so.1 +# libFLAC.so.8 + libogg.so.0 + libvorbis.so.0 + libvorbisenc.so.2 +# libffi.so.7 +# libwind.so.0 +# libheimbase.so.1 +# libhx509.so.5 + libsqlite3.so.0 + libcrypt.so.1 + libbsd.so.0 +) + +if [ ! -f appimagetool-i686.AppImage ]; then + wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage + chmod +x appimagetool-i686.AppImage +fi + +SRCDIR=$1 +ARTDIR=$2 +OUTDIR=$3 + +rm -rf "$OUTDIR" +mkdir -p "$OUTDIR/usr/bin" "$OUTDIR/usr/lib" "$OUTDIR/usr/lib/pulseaudio" "$OUTDIR/usr/optional" + +# echo "Building checkrt" +# mkdir -p "$OUTDIR/tmp" +# pushd "$OUTDIR/tmp" +# git clone https://github.com/darealshinji/linuxdeploy-plugin-checkrt +# cd linuxdeploy-plugin-checkrt +# git checkout ec6237791c5aeb4cbc1fa00a092d1f7befa58988 +# cd src +# make +# cp -a checkrt ../../../usr/optional +# cd ../../.. +# rm -rf tmp +# popd +# if [ ! -f "$OUTDIR/usr/optional/checkrt" ]; then +# echo "checkrt build failed" +# exit 1 +# fi +# "$OUTDIR/usr/optional/checkrt" --copy-libraries + +cp -a "$ARTDIR/flycast" "$OUTDIR/usr/bin" +patchelf --set-rpath '$ORIGIN/../lib' "$OUTDIR/usr/bin/flycast" + +echo "Copying system shared libraries" +for lib in "${SHLIBS[@]}"; do + blib=$(basename "$lib") + if [ -f "/lib/i386-linux-gnu/$lib" ]; then + cp "/lib/i386-linux-gnu/$lib" "$OUTDIR/usr/lib/$blib" + elif [ -f "$CHROOT/usr/lib/i386-linux-gnu/$lib" ]; then + cp "$CHROOT/usr/lib/i386-linux-gnu/$lib" "$OUTDIR/usr/lib/$blib" + elif [ -f "$CHROOT/lib/$lib" ]; then + cp "$CHROOT/lib/$lib" "$OUTDIR/usr/lib/$blib" + elif [ -f "$CHROOT/usr/lib/$lib" ]; then + cp "$CHROOT/usr/lib/$lib" "$OUTDIR/usr/lib/$blib" + else + echo "*** Failed to find '$blib'" + exit 1 + fi + + strip "$OUTDIR/usr/lib/$blib" +done + +for so in $(find "$OUTDIR/usr/lib" -maxdepth 1); do + if [ -f "$so" ]; then + echo "Patching RPATH in ${so}" + patchelf --set-rpath '$ORIGIN' "$so" + fi +done + +cp -a "$SRCDIR/shell/linux/flycast.desktop" "$SRCDIR/shell/linux/flycast.png" "$OUTDIR" + +echo "Creating AppRun..." +cat > "$OUTDIR/AppRun" << EOF +#!/bin/sh +APPDIR=\$(dirname "\$0") +grep -qs SteamOS /etc/os-release || \ + if [ -x "\$APPDIR/usr/optional/checkrt" ]; then + extra_libs="\$(\$APPDIR/usr/optional/checkrt)" + fi +if [ -n "\$extra_libs" ]; then + export LD_LIBRARY_PATH="\${extra_libs}\${LD_LIBRARY_PATH}" + if [ -e "\$APPDIR/usr/optional/exec.so" ]; then + export LD_PRELOAD="\$APPDIR/usr/optional/exec.so:\${LD_PRELOAD}" + fi +fi +exec "\$APPDIR/usr/bin/flycast" "\$@" +EOF +chmod +x "$OUTDIR/AppRun" + +echo "Generate AppImage" +ARCH=i386 ./appimagetool-i686.AppImage -v "$OUTDIR" "flycast-i386.AppImage" diff --git a/shell/switch/context_switch.S b/shell/switch/context_switch.S index 1e1c72d6b..77878bcbf 100644 --- a/shell/switch/context_switch.S +++ b/shell/switch/context_switch.S @@ -1,47 +1,46 @@ .hidden context_switch_aarch64 .globl context_switch_aarch64 context_switch_aarch64: - // Setup SP on the Buffer - MOV SP, X0 + // Restore FPU regs + ldp d0, d1, [x0, #0x00] + ldp d2, d3, [x0, #0x10] + ldp d4, d5, [x0, #0x20] + ldp d6, d7, [x0, #0x30] + ldp d8, d9, [x0, #0x40] + ldp d10, d11, [x0, #0x50] + ldp d12, d13, [x0, #0x60] + ldp d14, d15, [x0, #0x70] + ldp d16, d17, [x0, #0x80] + ldp d18, d19, [x0, #0x90] + ldp d20, d21, [x0, #0xa0] + ldp d22, d23, [x0, #0xb0] + ldp d24, d25, [x0, #0xc0] + ldp d26, d27, [x0, #0xd0] + ldp d28, d29, [x0, #0xe0] + ldp d30, d31, [x0, #0xf0] - // Restore Regs - LDR X0, [SP, #0] - LDR X1, [SP, #8] - LDR X2, [SP, #16] - LDR X3, [SP, #24] - LDR X4, [SP, #32] - LDR X5, [SP, #40] - LDR X6, [SP, #48] - LDR X7, [SP, #56] - LDR X8, [SP, #64] - LDR X9, [SP, #72] - LDR X10, [SP, #80] - LDR X11, [SP, #88] - LDR X12, [SP, #96] - LDR X13, [SP, #104] - LDR X14, [SP, #112] - LDR X15, [SP, #120] - LDR X16, [SP, #128] - LDR X17, [SP, #136] - LDR X18, [SP, #144] - LDR X19, [SP, #152] - LDR X20, [SP, #160] - LDR X21, [SP, #168] - LDR X22, [SP, #176] - LDR X23, [SP, #184] - LDR X24, [SP, #192] - LDR X25, [SP, #200] - LDR X26, [SP, #208] - LDR X27, [SP, #216] - LDR X28, [SP, #224] - - // Restore FP, LR, SP - LDR FP, [SP, #232] - LDR LR, [SP, #240] - MOV X15, SP - LDR X17, [X15, #248] - MOV SP, X17 - - // Branch to PC - LDR X17, [X15, #256] - BR X17 + // Restore GPRS regs + ldr x1, [x0, #0x108] + ldp x2, x3, [x0, #0x110] + ldp x4, x5, [x0, #0x120] + ldp x6, x7, [x0, #0x130] + ldp x8, x9, [x0, #0x140] + ldp x10, x11, [x0, #0x150] + ldp x12, x13, [x0, #0x160] + ldp x14, x15, [x0, #0x170] + ldp x16, x17, [x0, #0x180] + ldp x18, x19, [x0, #0x190] + ldp x20, x21, [x0, #0x1a0] + ldp x22, x23, [x0, #0x1b0] + ldp x24, x25, [x0, #0x1c0] + ldp x26, x27, [x0, #0x1d0] + ldp x28, x29, [x0, #0x1e0] // x29 is FP + // Restore special regs and jump + // x16 and x17 are safe to use? + ldp x30, x17, [x0, #0x1f0] // LR, pstate + msr nzcv, x17 + ldr x17, [x0, #0x200] // SP + mov sp, x17 + ldr x17, [x0, #0x208] // PC + ldr x0, [x0, #0x100] + br x17 diff --git a/shell/switch/libnx_vmem.cpp b/shell/switch/libnx_vmem.cpp new file mode 100644 index 000000000..3c5320429 --- /dev/null +++ b/shell/switch/libnx_vmem.cpp @@ -0,0 +1,333 @@ +#if defined(__SWITCH__) +#include "hw/sh4/sh4_if.h" +#include "hw/mem/addrspace.h" +#include "oslib/virtmem.h" + +#include +#include +#include + +namespace virtmem +{ + +#define siginfo_t switch_siginfo_t + +// Allocated RAM +static void *ramBase; +static size_t ramSize; + +// Reserved memory space +static void *reserved_base; +static size_t reserved_size; +static VirtmemReservation *virtmemReservation; + +// Mapped regions +static Mapping *memMappings; +static u32 memMappingCount; + +static void deleteMappings(); + +bool region_lock(void *start, size_t len) +{ + const size_t inpage = (uintptr_t)start & PAGE_MASK; + len = (len + inpage + PAGE_SIZE - 1) & ~PAGE_MASK; + + Result rc; + uintptr_t start_addr = (uintptr_t)start - inpage; + for (uintptr_t addr = start_addr; addr < (start_addr + len); addr += PAGE_SIZE) + { + rc = svcSetMemoryPermission((void *)addr, PAGE_SIZE, Perm_R); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "Failed to SetPerm Perm_R on %p len 0x%x rc 0x%x", (void*)addr, PAGE_SIZE, rc); + } + + return true; +} + +bool region_unlock(void *start, size_t len) +{ + const size_t inpage = (uintptr_t)start & PAGE_MASK; + len = (len + inpage + PAGE_SIZE - 1) & ~PAGE_MASK; + + Result rc; + uintptr_t start_addr = (uintptr_t)start - inpage; + for (uintptr_t addr = start_addr; addr < (start_addr + len); addr += PAGE_SIZE) + { + rc = svcSetMemoryPermission((void *)addr, PAGE_SIZE, Perm_Rw); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "Failed to SetPerm Perm_Rw on %p len 0x%x rc 0x%x", (void*)addr, PAGE_SIZE, rc); + } + + return true; +} + +// Implement vmem initialization for RAM, ARAM, VRAM and SH4 context, fpcb etc. + +// vmem_base_addr points to an address space of 512MB that can be used for fast memory ops. +// In negative offsets of the pointer (up to FPCB size, usually 65/129MB) the context and jump table +// can be found. If the platform init returns error, the user is responsible for initializing the +// memory using a fallback (that is, regular mallocs and falling back to slow memory JIT). +bool init(void **vmem_base_addr, void **sh4rcb_addr, size_t ramSize) +{ + // Allocate RAM + ramSize += sizeof(Sh4RCB); + virtmem::ramSize = ramSize; + ramBase = memalign(PAGE_SIZE, ramSize); + if (ramBase == nullptr) { + ERROR_LOG(VMEM, "memalign(%zx) failed", ramSize); + return false; + } + + // Reserve address space + reserved_size = 512_MB + sizeof(Sh4RCB) + ARAM_SIZE_MAX; + virtmemLock(); + // virtual mem + reserved_base = virtmemFindCodeMemory(reserved_size, PAGE_SIZE); + if (reserved_base != nullptr) + virtmemReservation = virtmemAddReservation(reserved_base, reserved_size); + virtmemUnlock(); + if (reserved_base == nullptr || virtmemReservation == nullptr) + { + ERROR_LOG(VMEM, "virtmemReserve(%zx) failed: base %p res %p", reserved_size, reserved_base, virtmemReservation); + free(ramBase); + return false; + } + + constexpr size_t fpcb_size = sizeof(Sh4RCB::fpcb); + void *sh4rcb_base_ptr = (u8 *)reserved_base + fpcb_size; + Handle process = envGetOwnProcessHandle(); + + // Now map the memory for the SH4 context, do not include FPCB on purpose (paged on demand). + size_t sz = sizeof(Sh4RCB) - fpcb_size; + DEBUG_LOG(VMEM, "mapping %lx to %p size %zx", (u64)ramBase + fpcb_size, sh4rcb_base_ptr, sz); + Result rc = svcMapProcessCodeMemory(process, (u64)sh4rcb_base_ptr, (u64)ramBase + fpcb_size, sz); + if (R_FAILED(rc)) + { + ERROR_LOG(VMEM, "Failed to Map Sh4RCB (%p, %p, %zx) -> %x", sh4rcb_base_ptr, (u8 *)ramBase + fpcb_size, sz, rc); + destroy(); + return false; + } + rc = svcSetProcessMemoryPermission(process, (u64)sh4rcb_base_ptr, sz, Perm_Rw); + if (R_FAILED(rc)) + { + ERROR_LOG(VMEM, "Failed to set Sh4RCB perms (%p, %zx) -> %x", sh4rcb_base_ptr, sz, rc); + destroy(); + return false; + } + *sh4rcb_addr = reserved_base; + *vmem_base_addr = (u8 *)reserved_base + sizeof(Sh4RCB); + NOTICE_LOG(VMEM, "virtmem::init successful"); + + return true; +} + +void destroy() +{ + deleteMappings(); + constexpr size_t fpcb_size = sizeof(Sh4RCB::fpcb); + Result rc = svcUnmapProcessCodeMemory(envGetOwnProcessHandle(), (u64)reserved_base + fpcb_size, + (u64)ramBase + fpcb_size, sizeof(Sh4RCB) - fpcb_size); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "Failed to Unmap Sh4RCB -> %x", rc); + if (virtmemReservation != nullptr) + { + virtmemLock(); + virtmemRemoveReservation(virtmemReservation); + virtmemUnlock(); + virtmemReservation = nullptr; + } + free(ramBase); + ramBase = nullptr; + NOTICE_LOG(VMEM, "virtmem::destroy done"); +} + +// Flush (unmap) the FPCB array +void reset_mem(void *ptr, unsigned size) +{ + u64 offset = (u8 *)ptr - (u8 *)reserved_base; + DEBUG_LOG(VMEM, "Unmapping %lx from %p size %x", (u64)ramBase + offset, ptr, size); + Handle process = envGetOwnProcessHandle(); + for (; offset < size; offset += PAGE_SIZE) + { + svcUnmapProcessCodeMemory(process, (u64)ptr + offset, (u64)ramBase + offset, PAGE_SIZE); + // fails if page is unmapped, which isn't an error + } +} + +// Allocates a memory page for the FPCB array +void ondemand_page(void *address, unsigned size) +{ + u64 offset = (u8 *)address - (u8 *)reserved_base; + //DEBUG_LOG(VMEM, "Mapping %lx to %p size %x", (u64)ramBase + offset, address, size); + Result rc = svcMapProcessCodeMemory(envGetOwnProcessHandle(), (u64)address, (u64)ramBase + offset, size); + if (R_FAILED(rc)) { + ERROR_LOG(VMEM, "svcMapProcessCodeMemory(%p, %lx, %x) failed: %x", address, (u64)ramBase + offset, size, rc); + return; + } + rc = svcSetProcessMemoryPermission(envGetOwnProcessHandle(), (u64)address, size, Perm_Rw); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "svcSetProcessMemoryPermission(%p, %x) failed: %x", address, size, rc); +} + +static void deleteMappings() +{ + if (memMappings == nullptr) + return; + std::unordered_set backingAddrs; + Handle process = envGetOwnProcessHandle(); + for (u32 i = 0; i < memMappingCount; i++) + { + // Ignore unmapped stuff + if (memMappings[i].memsize == 0) + continue; + if (!memMappings[i].allow_writes) // don't (un)map ARAM read-only + continue; + + u64 ramOffset = (u64)ramBase + sizeof(Sh4RCB) + memMappings[i].memoffset; + if (backingAddrs.count(ramOffset) != 0) + continue; + backingAddrs.insert(ramOffset); + u64 offset = memMappings[i].start_address + sizeof(Sh4RCB); + Result rc = svcUnmapProcessCodeMemory(process, (u64)reserved_base + offset, + ramOffset, memMappings[i].memsize); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "deleteMappings: error unmapping offset %lx from %lx", memMappings[i].memoffset, offset); + } + delete [] memMappings; + memMappings = nullptr; + memMappingCount = 0; +} + +// Creates mappings to the underlying ram (not including mirroring sections) +void create_mappings(const Mapping *vmem_maps, unsigned nummaps) +{ + deleteMappings(); + memMappingCount = nummaps; + memMappings = new Mapping[nummaps]; + memcpy(memMappings, vmem_maps, nummaps * sizeof(Mapping)); + + std::unordered_set backingAddrs; + Handle process = envGetOwnProcessHandle(); + for (u32 i = 0; i < nummaps; i++) + { + // Ignore unmapped stuff, it is already reserved as PROT_NONE + if (vmem_maps[i].memsize == 0) + continue; + if (!vmem_maps[i].allow_writes) // don't map ARAM read-only + continue; + + u64 ramOffset = (u64)ramBase + sizeof(Sh4RCB) + vmem_maps[i].memoffset; + if (backingAddrs.count(ramOffset) != 0) + // already mapped once so ignore other mirrors + continue; + backingAddrs.insert(ramOffset); + u64 offset = vmem_maps[i].start_address + sizeof(Sh4RCB); + Result rc = svcMapProcessCodeMemory(process, (u64)reserved_base + offset, ramOffset, vmem_maps[i].memsize); + if (R_FAILED(rc)) { + ERROR_LOG(VMEM, "create_mappings: error mapping offset %lx to %lx", vmem_maps[i].memoffset, offset); + } + else + { + rc = svcSetProcessMemoryPermission(process, (u64)reserved_base + offset, vmem_maps[i].memsize, Perm_Rw); + if (R_FAILED(rc)) + ERROR_LOG(VMEM, "svcSetProcessMemoryPermission() failed: %x", rc); + else + DEBUG_LOG(VMEM, "create_mappings: mapped offset %lx to %lx size %lx", vmem_maps[i].memoffset, offset, vmem_maps[i].memsize); + } + } +} + +// Prepares the code region for JIT operations, thus marking it as RWX +bool prepare_jit_block(void *code_area, size_t size, void **code_area_rwx) +{ + die("Not supported in libnx"); + + return false; +} + +void release_jit_block(void *code_area, size_t size) +{ + die("Not supported in libnx"); +} + +// Use two addr spaces: need to remap something twice, therefore use allocate_shared_filemem() +bool prepare_jit_block(void *code_area, size_t size, void **code_area_rw, ptrdiff_t *rx_offset) +{ + const size_t size_aligned = ((size + PAGE_SIZE) & (~(PAGE_SIZE-1))); + + virtmemLock(); + void* ptr_rw = virtmemFindAslr(size_aligned, 0); + bool failure = ptr_rw == nullptr + || R_FAILED(svcMapProcessMemory(ptr_rw, envGetOwnProcessHandle(), (u64)code_area, size_aligned)); + virtmemUnlock(); + if (failure) + { + ERROR_LOG(DYNAREC, "Failed to map jit rw block..."); + return false; + } + + *code_area_rw = ptr_rw; + *rx_offset = (char*)code_area - (char*)ptr_rw; + INFO_LOG(DYNAREC, "Info: Using NO_RWX mode, rx ptr: %p, rw ptr: %p, offset: %ld\n", code_area, ptr_rw, (long)*rx_offset); + + return true; +} + +void release_jit_block(void *code_area1, void *code_area2, size_t size) +{ + const size_t size_aligned = ((size + PAGE_SIZE) & (~(PAGE_SIZE-1))); + virtmemLock(); + svcUnmapProcessMemory(code_area2, envGetOwnProcessHandle(), (u64)code_area1, size_aligned); + virtmemUnlock(); +} + +} // namespace virtmem + +#include +void fault_handler(int sn, siginfo_t * si, void *segfault_ctx); + +extern "C" +{ +alignas(16) u8 __nx_exception_stack[0x1000]; +u64 __nx_exception_stack_size = sizeof(__nx_exception_stack); + +void context_switch_aarch64(void* context); + +void __libnx_exception_handler(ThreadExceptionDump *ctx) +{ + alignas(16) static ucontext_t u_ctx; + u_ctx.uc_mcontext.pc = ctx->pc.x; + for (int i = 0; i < 29; i++) + u_ctx.uc_mcontext.regs[i] = ctx->cpu_gprs[i].x; + + siginfo_t sig_info; + sig_info.si_addr = (void*)ctx->far.x; + + fault_handler(0, &sig_info, (void *)&u_ctx); + + alignas(16) static uint64_t savedRegisters[66]; + uint64_t *ptr = savedRegisters; + // fpu registers (64 bits) + for (int i = 0; i < 32; i++) + ptr[i] = *(u64 *)&ctx->fpu_gprs[i].d; + // cpu gp registers + for (int i = 0; i < 29; i++) + ptr[i + 32] = u_ctx.uc_mcontext.regs[i]; + // Special regs + ptr[29 + 32] = ctx->fp.x; // frame pointer + ptr[30 + 32] = ctx->lr.x; // link register + ptr[31 + 32] = ctx->pstate; // sprs + ptr[32 + 32] = ctx->sp.x; // stack pointer + ptr[33 + 32] = u_ctx.uc_mcontext.pc; // PC + + context_switch_aarch64(ptr); +} +} + +#ifndef LIBRETRO +[[noreturn]] void os_DebugBreak() +{ + diagAbortWithResult(MAKERESULT(350, 1)); +} +#endif +#endif // __SWITCH__ diff --git a/shell/switch/switch_gamepad.h b/shell/switch/switch_gamepad.h new file mode 100644 index 000000000..e6956eff1 --- /dev/null +++ b/shell/switch/switch_gamepad.h @@ -0,0 +1,94 @@ +/* + Copyright 2024 flyinghead + + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . +*/ +#include "sdl/sdl_gamepad.h" +#include "nswitch.h" + +// +// SDL 2.0.14-4 rumble doesn't seem to work +// so this class implements rumble using the native API. +// +class SwitchGamepad : public SDLGamepad +{ +public: + SwitchGamepad(int maple_port, int joystick_idx, SDL_Joystick* sdl_joystick) + : SDLGamepad(maple_port, joystick_idx, sdl_joystick) + { + // A dual joycon controller has 2 vibration devices (left and right joycons) + // Joystick 0 is either HidNpadIdType_Handheld or HidNpadIdType_No1 depending on the joycon configuration + Result rc = hidInitializeVibrationDevices(vibDeviceHandlesNoN, 2, (HidNpadIdType)(HidNpadIdType_No1 + joystick_idx), + HidNpadStyleTag_NpadJoyDual); + if (R_FAILED(rc)) + WARN_LOG(INPUT, "hidInitializeVibrationDevices(No%d) failed %x", joystick_idx + 1, rc); + if (joystick_idx == 0) + { + padInitializeDefault(&pad); + rc = hidInitializeVibrationDevices(vibDeviceHandlesHandHeld, 2, HidNpadIdType_Handheld, HidNpadStyleTag_NpadHandheld); + if (R_FAILED(rc)) + WARN_LOG(INPUT, "hidInitializeVibrationDevices(handHeld) failed %x", rc); + } + } + + void rumble(float power, float inclination, u32 duration_ms) override + { + if (!rumbleEnabled) + return; + + power = std::min(power / std::pow(1.06f, 100.f - rumblePower), 1.f); + float freq = 160.f + inclination * 100.f; + HidVibrationValue vibValues[2]{}; + vibValues[0].amp_low = power; + vibValues[0].freq_low = freq; + vibValues[0].amp_high = power; + vibValues[0].freq_high = freq; + memcpy(&vibValues[1], &vibValues[0], sizeof(HidVibrationValue)); + hidSendVibrationValues(getDeviceHandle(), vibValues, 2); + if (power != 0.f) + vib_stop_time = getTimeMs() + duration_ms; + else + vib_stop_time = 0; + } + + void update_rumble() override + { + if (!rumbleEnabled || vib_stop_time == 0.0) + return; + int rem_time = vib_stop_time - getTimeMs(); + if (rem_time <= 0) + { + HidVibrationValue vibValues[2]{}; + vibValues[0].freq_low = vibValues[1].freq_low = 160.f; + vibValues[0].freq_high = vibValues[1].freq_high = 320.f; + hidSendVibrationValues(getDeviceHandle(), vibValues, 2); + vib_stop_time = 0; + } + } + +private: + HidVibrationDeviceHandle *getDeviceHandle() + { + if (sdl_joystick_instance != 0) + return vibDeviceHandlesNoN; + padUpdate(&pad); + return padIsHandheld(&pad) ? vibDeviceHandlesHandHeld : vibDeviceHandlesNoN; + } + + PadState pad; + HidVibrationDeviceHandle vibDeviceHandlesHandHeld[2]; + HidVibrationDeviceHandle vibDeviceHandlesNoN[2]; +}; diff --git a/shell/switch/switch_main.cpp b/shell/switch/switch_main.cpp new file mode 100644 index 000000000..2d710796a --- /dev/null +++ b/shell/switch/switch_main.cpp @@ -0,0 +1,72 @@ +/* + This file is part of Flycast. + + Flycast 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 Foundation, either version 2 of the License, or + (at your option) any later version. + + Flycast 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 Flycast. If not, see . + */ +#ifndef LIBRETRO +#include "nswitch.h" +#include "stdclass.h" +#include "log/LogManager.h" +#include "emulator.h" +#include "ui/mainui.h" +#include "oslib/directory.h" +#include +#include + +int main(int argc, char *argv[]) +{ + socketInitializeDefault(); + nxlinkStdio(); + //appletSetFocusHandlingMode(AppletFocusHandlingMode_NoSuspend); + + LogManager::Init(); + + // Set directories + flycast::mkdir("/flycast", 0755); + flycast::mkdir("/flycast/data", 0755); + set_user_config_dir("/flycast/"); + set_user_data_dir("/flycast/data/"); + + add_system_config_dir("/flycast"); + add_system_config_dir("./"); + add_system_data_dir("/flycast/data/"); + add_system_data_dir("./"); + add_system_data_dir("data/"); + + if (flycast_init(argc, argv)) + die("Flycast initialization failed"); + + mainui_loop(); + + flycast_term(); + + socketExit(); + + return 0; +} + +void os_DoEvents() +{ +} + +namespace hostfs +{ + +void saveScreenshot(const std::string& name, const std::vector& data) +{ + throw FlycastException("Not supported on Switch"); +} + +} +#endif //!LIBRETRO diff --git a/shell/switch/ucontext.h b/shell/switch/ucontext.h index c2b2312c0..c14f1ae09 100644 --- a/shell/switch/ucontext.h +++ b/shell/switch/ucontext.h @@ -1,5 +1,5 @@ #pragma once -#include +#include "nswitch.h" typedef struct { diff --git a/shell/uwp/http_client.cpp b/shell/uwp/http_client.cpp index af787c925..83d218760 100644 --- a/shell/uwp/http_client.cpp +++ b/shell/uwp/http_client.cpp @@ -16,8 +16,9 @@ You should have received a copy of the GNU General Public License along with Flycast. If not, see . */ -#include "rend/boxart/http_client.h" +#include "oslib/http_client.h" #include "stdclass.h" +#include namespace http { @@ -89,7 +90,60 @@ int get(const std::string& url, std::vector& content, std::string& contentTy } } -int post(const std::string& url, const std::vector& fields) { +int post(const std::string& url, const char *payload, const char *contentType, std::vector& reply) +{ + nowide::wstackstring wurl; + if (!wurl.convert(url.c_str())) + return 500; + nowide::wstackstring wpayload; + if (!wpayload.convert(payload)) + return 500; + nowide::wstackstring wcontentType; + if (contentType != nullptr && !wcontentType.convert(contentType)) + return 500; + try + { + Uri^ uri = ref new Uri(ref new String(wurl.get())); + HttpStringContent^ content = ref new HttpStringContent(ref new String(wpayload.get())); + content->Headers->ContentLength = ref new Box(strlen(payload)); + if (contentType != nullptr) + content->Headers->ContentType = ref new HttpMediaTypeHeaderValue(ref new String(wcontentType.get())); + + IAsyncOperationWithProgress^ op = httpClient->PostAsync(uri, content); + cResetEvent asyncEvent; + op->Completed = ref new AsyncOperationWithProgressCompletedHandler( + [&asyncEvent](IAsyncOperationWithProgress^, AsyncStatus) { + asyncEvent.Set(); + }); + asyncEvent.Wait(); + HttpResponseMessage^ resp = op->GetResults(); + + if (resp->IsSuccessStatusCode) + { + IHttpContent^ httpContent = resp->Content; + IAsyncOperationWithProgress^ readOp = httpContent->ReadAsBufferAsync(); + asyncEvent.Reset(); + readOp->Completed = ref new AsyncOperationWithProgressCompletedHandler( + [&asyncEvent](IAsyncOperationWithProgress^, AsyncStatus) { + asyncEvent.Set(); + }); + asyncEvent.Wait(); + IBuffer^ buffer = readOp->GetResults(); + + Array^ array = ref new Array(buffer->Length); + DataReader::FromBuffer(buffer)->ReadBytes(array); + reply = std::vector(array->begin(), array->end()); + } + return (int)resp->StatusCode; + } + catch (Exception^ e) + { + WARN_LOG(COMMON, "http::post error %.*S", e->Message->Length(), e->Message->Data()); + return 500; + } +} + +int post(const std::string & url, const std::vector&fields) { // not implemented return 500; } diff --git a/shell/windows/generate_vs_project.bat b/shell/windows/generate_vs_project.bat new file mode 100644 index 000000000..49dbcbfc0 --- /dev/null +++ b/shell/windows/generate_vs_project.bat @@ -0,0 +1,28 @@ +@echo off +setlocal EnableDelayedExpansion +cmake --version >nul 2>&1 && ( + set cmake=1 +) || ( + echo please install cmake first +) + +if !cmake! equ 1 ( + cd /d "%~dp0..\.." + echo 1: Visual Studio 2022 + echo 2: Visual Studio 2019 + echo 3: Visual Studio 2017 + set "num=1" + set /p num="Enter your preference [1]: " + if !num! equ 2 ( + set "generator=Visual Studio 16 2019" + )else if !num! equ 3 ( + set "generator=Visual Studio 15 2017" + ) else ( + set "generator=Visual Studio 17 2022" + ) + echo Generating !generator! ... + cmake -B build -G "!generator!" -A x64 + start build\flycast.vcxproj +) + +pause \ No newline at end of file diff --git a/tests/src/AicaArmTest.cpp b/tests/src/AicaArmTest.cpp index ea6ec9050..994d03b6f 100644 --- a/tests/src/AicaArmTest.cpp +++ b/tests/src/AicaArmTest.cpp @@ -1,11 +1,14 @@ -#include "gtest/gtest.h" #include "types.h" + +#if FEAT_AREC != DYNAREC_NONE #include "hw/mem/addrspace.h" #include "hw/arm7/arm7.h" #include "hw/aica/aica_if.h" #include "hw/arm7/arm7_rec.h" #include "emulator.h" +#include "gtest/gtest.h" + static const u32 N_FLAG = 1 << 31; static const u32 Z_FLAG = 1 << 30; static const u32 C_FLAG = 1 << 29; @@ -24,7 +27,7 @@ class AicaArmTest : public ::testing::Test { if (!addrspace::reserve()) die("addrspace::reserve failed"); emu.init(); - dc_reset(true); + emu.dc_reset(true); Arm7Enabled = true; } @@ -1083,3 +1086,4 @@ TEST_F(AicaArmTest, ConditionRegAllocTest) ASSERT_EQ(arm_Reg[2].I, 22); } } +#endif diff --git a/tests/src/CheatManagerTest.cpp b/tests/src/CheatManagerTest.cpp index 7300c57d6..813b63213 100644 --- a/tests/src/CheatManagerTest.cpp +++ b/tests/src/CheatManagerTest.cpp @@ -287,7 +287,7 @@ cheats = "2" mgr.reset("TESTSUB8"); mgr.loadCheatFile("test.cht"); mem_map_default(); - dc_reset(true); + emu.dc_reset(true); mgr.enableCheat(0, true); WriteMem8_nommu(0x8c010000, 0xFA); diff --git a/tests/src/MmuTest.cpp b/tests/src/MmuTest.cpp index 899c01267..3956fd4b0 100644 --- a/tests/src/MmuTest.cpp +++ b/tests/src/MmuTest.cpp @@ -30,8 +30,7 @@ class MmuTest : public ::testing::Test { if (!addrspace::reserve()) die("addrspace::reserve failed"); emu.init(); - dc_reset(true); - config::ForceWindowsCE = true; + emu.dc_reset(true); CCN_MMUCR.AT = 1; MMU_reset(); } diff --git a/tests/src/Sh4InterpreterTest.cpp b/tests/src/Sh4InterpreterTest.cpp index adb573dcd..0cb4dc296 100644 --- a/tests/src/Sh4InterpreterTest.cpp +++ b/tests/src/Sh4InterpreterTest.cpp @@ -28,9 +28,10 @@ class Sh4InterpreterTest : public Sh4OpTest { die("addrspace::reserve failed"); emu.init(); mem_map_default(); - dc_reset(true); + emu.dc_reset(true); ctx = &p_sh4rcb->cntx; - Get_Sh4Interpreter(&sh4); + sh4 = Get_Sh4Interpreter(); + sh4->Init(); } void PrepareOp(u16 op, u16 op2 = 0, u16 op3 = 0) override { @@ -45,7 +46,7 @@ class Sh4InterpreterTest : public Sh4OpTest { { ctx->pc = START_PC; for (int i = 0; i < numOp; i++) - sh4.Step(); + sh4->Step(); } }; diff --git a/tests/src/div32_test.cpp b/tests/src/div32_test.cpp index 3805abec2..c6c68eebc 100644 --- a/tests/src/div32_test.cpp +++ b/tests/src/div32_test.cpp @@ -10,6 +10,7 @@ static void div1(u32& r1, u32 r2) { + sr_t& sr = Sh4cntx.sr; const u8 old_q = sr.Q; sr.Q = (u8)((0x80000000 & r1) != 0); @@ -53,6 +54,7 @@ static void div1(u32& r1, u32 r2) static void div32s_slow(u32& r1, u32 r2, u32& r3) { + sr_t& sr = Sh4cntx.sr; sr.Q = r3 >> 31; sr.M = r2 >> 31; sr.T = sr.Q ^ sr.M; @@ -68,6 +70,7 @@ static void div32s_slow(u32& r1, u32 r2, u32& r3) static void div32s_fast(u32& r1, u32 r2, u32& r3) { + sr_t& sr = Sh4cntx.sr; sr.T = (r3 ^ r2) & 0x80000000; u64 rv = shil_opcl_div32s::f1::impl(r1, r2, r3); r1 = (u32)rv; @@ -80,6 +83,7 @@ static void div32s_fast(u32& r1, u32 r2, u32& r3) static void div32u_fast(u32& r1, u32 r2, u32& r3) { + sr_t& sr = Sh4cntx.sr; u64 rv = shil_opcl_div32u::f1::impl(r1, r2, r3); r1 = (u32)rv; r3 = rv >> 32; @@ -90,6 +94,7 @@ static void div32u_fast(u32& r1, u32 r2, u32& r3) static void div32u_slow(u32& r1, u32 r2, u32& r3) { + sr_t& sr = Sh4cntx.sr; sr.Q = 0; sr.M = 0; sr.T = 0; @@ -111,7 +116,7 @@ class Div32Test : public ::testing::Test { if (!addrspace::reserve()) die("addrspace::reserve failed"); emu.init(); - dc_reset(true); + emu.dc_reset(true); } void div32s(u32 n1, u32 n2, u32 n3) diff --git a/tests/src/serialize_test.cpp b/tests/src/serialize_test.cpp index 132d1826c..24f168fc2 100644 --- a/tests/src/serialize_test.cpp +++ b/tests/src/serialize_test.cpp @@ -13,7 +13,7 @@ class SerializeTest : public ::testing::Test { if (!addrspace::reserve()) die("addrspace::reserve failed"); emu.init(); - dc_reset(true); + emu.dc_reset(true); } }; @@ -32,8 +32,5 @@ TEST_F(SerializeTest, SizeTest) std::vector data(30000000); Serializer ser(data.data(), data.size()); dc_serialize(ser); - ASSERT_EQ(28191536u, ser.size()); + ASSERT_EQ(28050642u, ser.size()); } - - - diff --git a/tests/src/sh4_ops.h b/tests/src/sh4_ops.h index 975893d8f..b9d7b2084 100644 --- a/tests/src/sh4_ops.h +++ b/tests/src/sh4_ops.h @@ -23,14 +23,6 @@ #include "types.h" #include "hw/sh4/sh4_if.h" #include "hw/mem/addrspace.h" -#include "hw/sh4/sh4_core.h" -#undef r -#undef fr -#undef sr -#undef mac -#undef gbr -#undef fpscr -#undef fpul constexpr u32 REG_MAGIC = 0xbaadf00d; @@ -43,17 +35,18 @@ class Sh4OpTest : public ::testing::Test { virtual void PrepareOp(u16 op, u16 op2 = 0, u16 op3 = 0) = 0; virtual void RunOp(int numOp = 1) = 0; - void ClearRegs() { - for (int i = 0; i < 16; i++) - r(i) = REG_MAGIC; - for (int i = 0; i < 32; i++) - *(u32 *)&ctx->xffr[i] = REG_MAGIC; - sh4_sr_SetFull(0x700000F0); + void ClearRegs() + { + std::fill(std::begin(ctx->r), std::end(ctx->r), REG_MAGIC); + std::fill(std::begin(reinterpret_cast(ctx->xf)), std::end(reinterpret_cast(ctx->xf)), REG_MAGIC); + std::fill(std::begin(reinterpret_cast(ctx->fr)), std::end(reinterpret_cast(ctx->fr)), REG_MAGIC); + sr().setFull(0x700000F0); mac() = 0; gbr() = REG_MAGIC; checkedRegs.clear(); } - void AssertState() { + void AssertState() + { for (int i = 0; i < 16; i++) if (checkedRegs.count(&ctx->r[i]) == 0) ASSERT_CLEAN_REG(i); @@ -61,10 +54,15 @@ class Sh4OpTest : public ::testing::Test { { ASSERT_EQ(ctx->gbr, REG_MAGIC); } - for (int i = 0; i < 32; i++) - if (checkedRegs.count((u32 *)&ctx->xffr[i]) == 0) + for (int i = 0; i < 16; i++) + if (checkedRegs.count((u32 *)&ctx->xf[i]) == 0) + { + ASSERT_EQ(*(u32 *)&ctx->xf[i], REG_MAGIC); + } + for (int i = 0; i < 16; i++) + if (checkedRegs.count((u32 *)&ctx->fr[i]) == 0) { - ASSERT_EQ(*(u32 *)&ctx->xffr[i], REG_MAGIC); + ASSERT_EQ(*(u32 *)&ctx->fr[i], REG_MAGIC); } } static u16 Rm(int r) { return r << 4; } @@ -78,20 +76,20 @@ class Sh4OpTest : public ::testing::Test { u32& mach() { return ctx->mac.l; } u32& macl() { return ctx->mac.h; } sr_t& sr() { return ctx->sr; } - f32& fr(int regNum) { checkedRegs.insert((u32 *)&ctx->xffr[regNum + 16]); return ctx->xffr[regNum + 16]; } + f32& fr(int regNum) { checkedRegs.insert((u32 *)&ctx->fr[regNum]); return ctx->fr[regNum]; } double getDr(int regNum) { - checkedRegs.insert((u32 *)&ctx->xffr[regNum * 2 + 16]); - checkedRegs.insert((u32 *)&ctx->xffr[regNum * 2 + 1 + 16]); - return GetDR(regNum); + checkedRegs.insert((u32 *)&ctx->fr[regNum * 2]); + checkedRegs.insert((u32 *)&ctx->fr[regNum * 2 + 1]); + return ctx->getDR(regNum); } void setDr(int regNum, double d) { - checkedRegs.insert((u32 *)&ctx->xffr[regNum * 2 + 16]); - checkedRegs.insert((u32 *)&ctx->xffr[regNum * 2 + 1 + 16]); - SetDR(regNum, d); + checkedRegs.insert((u32 *)&ctx->fr[regNum * 2]); + checkedRegs.insert((u32 *)&ctx->fr[regNum * 2 + 1]); + ctx->setDR(regNum, d); } Sh4Context *ctx; - sh4_if sh4; + Sh4Executor *sh4; std::set checkedRegs; static constexpr u32 START_PC = 0xAC000000; @@ -847,7 +845,14 @@ class Sh4OpTest : public ::testing::Test { ASSERT_EQ(sr().T, 0u); AssertState(); - // TODO div1 :P + // div1 with Rn == Rm + ClearRegs(); + sr().T = sr().M = 1; + r(7) = 0xb1e12951; + PrepareOp(0x3774); // div1 r7, r7 + RunOp(); + ASSERT_EQ(r(7), 0x15a37bf4); + AssertState(); ClearRegs(); r(7) = 1000000000; diff --git a/tests/src/test_stubs.cpp b/tests/src/test_stubs.cpp index 0b6b16001..2997938ba 100644 --- a/tests/src/test_stubs.cpp +++ b/tests/src/test_stubs.cpp @@ -1,57 +1,22 @@ -#include -#include -#include "types.h" +#if !defined(__ANDROID__) && !defined(__APPLE__) +#include -#ifndef __ANDROID__ [[noreturn]] void os_DebugBreak() { std::abort(); } -#ifdef _WIN32 -HWND getNativeHwnd() -{ - return (HWND)NULL; -} -#endif - -void os_SetupInput() -{ -} -void os_TermInput() -{ -} - -void UpdateInputState() -{ -} - void os_DoEvents() { } -void os_CreateWindow() -{ -} - void os_RunInstance(int argc, const char *argv[]) { } -#endif #ifdef _WIN32 -#include - -static LARGE_INTEGER qpf; -static double qpfd; -//Helper functions -double os_GetSeconds() +void os_SetThreadName(const char *name) { - static bool initme = (QueryPerformanceFrequency(&qpf), qpfd=1/(double)qpf.QuadPart); - LARGE_INTEGER time_now; - - QueryPerformanceCounter(&time_now); - static LARGE_INTEGER time_now_base = time_now; - return (time_now.QuadPart - time_now_base.QuadPart)*qpfd; } #endif +#endif diff --git a/vcpkg.json b/vcpkg.json deleted file mode 100644 index ae2f9c4c2..000000000 --- a/vcpkg.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "flycast", - "version-string": "1.2.0-dev", - "dependencies": [ - "sdl2", - "zlib" - ] -} \ No newline at end of file